kernel: add md5sum for 3.9 final
[openwrt.git] / target / linux / brcm63xx / patches-3.7 / 447-bcm63xx_enet_add_b53_support.patch
1 From 3867c2586c0be529d3cb851b34f58d7d97be7c00 Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jogo@openwrt.org>
3 Date: Tue, 29 Jan 2013 11:03:29 +0100
4 Subject: [PATCH 078/118] bcm63xx_enet: add b53 support
5
6 ---
7  drivers/net/ethernet/broadcom/bcm63xx_enet.c |  106 ++++++++++++++++++++------
8  drivers/net/ethernet/broadcom/bcm63xx_enet.h |    3 +
9  2 files changed, 85 insertions(+), 24 deletions(-)
10
11 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
12 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
13 @@ -30,6 +30,7 @@
14  #include <linux/dma-mapping.h>
15  #include <linux/platform_device.h>
16  #include <linux/if_vlan.h>
17 +#include <linux/platform_data/b53.h>
18  
19  #include <bcm63xx_dev_enet.h>
20  #include "bcm63xx_enet.h"
21 @@ -2013,7 +2014,8 @@ static int __devexit bcm_enet_remove(str
22         return 0;
23  }
24  
25 -struct platform_driver bcm63xx_enet_driver = {
26 +
27 +static struct platform_driver bcm63xx_enet_driver = {
28         .probe  = bcm_enet_probe,
29         .remove = __devexit_p(bcm_enet_remove),
30         .driver = {
31 @@ -2022,6 +2024,42 @@ struct platform_driver bcm63xx_enet_driv
32         },
33  };
34  
35 +struct b53_platform_data bcm63xx_b53_pdata = {
36 +       .chip_id = 0x6300,
37 +       .big_endian = 1,
38 +};
39 +
40 +struct platform_device bcm63xx_b53_dev = {
41 +       .name           = "b53-switch",
42 +       .id             = -1,
43 +       .dev            = {
44 +               .platform_data = &bcm63xx_b53_pdata,
45 +       },
46 +};
47 +
48 +static int bcmenet_switch_register(struct bcm_enet_priv *priv, u16 port_mask)
49 +{
50 +       int ret;
51 +
52 +       bcm63xx_b53_pdata.regs = priv->base;
53 +       bcm63xx_b53_pdata.enabled_ports = port_mask;
54 +       bcm63xx_b53_pdata.alias = priv->net_dev->name;
55 +
56 +       ret = platform_device_register(&bcm63xx_b53_dev);
57 +       if (!ret)
58 +               priv->b53_device = &bcm63xx_b53_dev;
59 +
60 +       return ret;
61 +}
62 +
63 +static void bcmenet_switch_unregister(struct bcm_enet_priv *priv)
64 +{
65 +       if (priv->b53_device)
66 +               platform_device_unregister(&bcm63xx_b53_dev);
67 +
68 +       priv->b53_device = NULL;
69 +}
70 +
71  /*
72   * switch mii access callbacks
73   */
74 @@ -2270,29 +2308,6 @@ static int bcm_enetsw_open(struct net_de
75                 enetsw_writeb(priv, rgmii_ctrl, ENETSW_RGMII_CTRL_REG(i));
76         }
77  
78 -       /* reset mib */
79 -       val = enetsw_readb(priv, ENETSW_GMCR_REG);
80 -       val |= ENETSW_GMCR_RST_MIB_MASK;
81 -       enetsw_writeb(priv, val, ENETSW_GMCR_REG);
82 -       mdelay(1);
83 -       val &= ~ENETSW_GMCR_RST_MIB_MASK;
84 -       enetsw_writeb(priv, val, ENETSW_GMCR_REG);
85 -       mdelay(1);
86 -
87 -       /* force CPU port state */
88 -       val = enetsw_readb(priv, ENETSW_IMPOV_REG);
89 -       val |= ENETSW_IMPOV_FORCE_MASK | ENETSW_IMPOV_LINKUP_MASK;
90 -       enetsw_writeb(priv, val, ENETSW_IMPOV_REG);
91 -
92 -       /* enable switch forward engine */
93 -       val = enetsw_readb(priv, ENETSW_SWMODE_REG);
94 -       val |= ENETSW_SWMODE_FWD_EN_MASK;
95 -       enetsw_writeb(priv, val, ENETSW_SWMODE_REG);
96 -
97 -       /* enable jumbo on all ports */
98 -       enetsw_writel(priv, 0x1ff, ENETSW_JMBCTL_PORT_REG);
99 -       enetsw_writew(priv, 9728, ENETSW_JMBCTL_MAXSIZE_REG);
100 -
101         /* initialize flow control buffer allocation */
102         enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0,
103                         ENETDMA_BUFALLOC_REG(priv->rx_chan));
104 @@ -2760,6 +2775,9 @@ static int __devinit bcm_enetsw_probe(st
105         struct bcm63xx_enetsw_platform_data *pd;
106         struct resource *res_mem;
107         int ret, irq_rx, irq_tx;
108 +       unsigned i, num_ports = 0;
109 +       u16 port_mask = BIT(8);
110 +       u8 val;
111  
112         /* stop if shared driver failed, assume driver->probe will be
113          * called in the same order we register devices (correct ?) */
114 @@ -2847,6 +2865,43 @@ static int __devinit bcm_enetsw_probe(st
115         priv->pdev = pdev;
116         priv->net_dev = dev;
117  
118 +       /* reset mib */
119 +       val = enetsw_readb(priv, ENETSW_GMCR_REG);
120 +       val |= ENETSW_GMCR_RST_MIB_MASK;
121 +       enetsw_writeb(priv, val, ENETSW_GMCR_REG);
122 +       mdelay(1);
123 +       val &= ~ENETSW_GMCR_RST_MIB_MASK;
124 +       enetsw_writeb(priv, val, ENETSW_GMCR_REG);
125 +       mdelay(1);
126 +
127 +       /* force CPU port state */
128 +       val = enetsw_readb(priv, ENETSW_IMPOV_REG);
129 +       val |= ENETSW_IMPOV_FORCE_MASK | ENETSW_IMPOV_LINKUP_MASK;
130 +       enetsw_writeb(priv, val, ENETSW_IMPOV_REG);
131 +
132 +       /* enable switch forward engine */
133 +       val = enetsw_readb(priv, ENETSW_SWMODE_REG);
134 +       val |= ENETSW_SWMODE_FWD_EN_MASK;
135 +       enetsw_writeb(priv, val, ENETSW_SWMODE_REG);
136 +
137 +       /* enable jumbo on all ports */
138 +       enetsw_writel(priv, 0x1ff, ENETSW_JMBCTL_PORT_REG);
139 +       enetsw_writew(priv, 9728, ENETSW_JMBCTL_MAXSIZE_REG);
140 +
141 +       for (i = 0; i < priv->num_ports; i++) {
142 +               struct bcm63xx_enetsw_port *port = &priv->used_ports[i];
143 +
144 +               if (!port->used)
145 +                       continue;
146 +
147 +               num_ports++;
148 +               port_mask |= BIT(i);
149 +       }
150 +
151 +       /* only register if there is more than one external port */
152 +       if (num_ports > 1)
153 +               bcmenet_switch_register(priv, port_mask);
154 +
155         return 0;
156  
157  out_put_clk:
158 @@ -2877,6 +2932,9 @@ static int __devexit bcm_enetsw_remove(s
159         priv = netdev_priv(dev);
160         unregister_netdev(dev);
161  
162 +       /* remove switch */
163 +       bcmenet_switch_unregister(priv);
164 +
165         /* release device resources */
166         iounmap(priv->base);
167         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
168 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.h
169 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.h
170 @@ -336,6 +336,9 @@ struct bcm_enet_priv {
171         struct bcm63xx_enetsw_port used_ports[ENETSW_MAX_PORT];
172         int sw_port_link[ENETSW_MAX_PORT];
173  
174 +       /* platform device for associated switch */
175 +       struct platform_device *b53_device;
176 +
177         /* used to poll switch port state */
178         struct timer_list swphy_poll;
179         spinlock_t enetsw_mdio_lock;