kernel: bgmac: update bgmac to a version from kernel 3.14-rc1
[openwrt.git] / target / linux / generic / patches-3.13 / 770-bgmac-backport.patch
1 --- a/drivers/net/ethernet/broadcom/Kconfig
2 +++ b/drivers/net/ethernet/broadcom/Kconfig
3 @@ -23,6 +23,7 @@ config B44
4         depends on SSB_POSSIBLE && HAS_DMA
5         select SSB
6         select MII
7 +       select PHYLIB
8         ---help---
9           If you have a network (Ethernet) controller of this type, say Y
10           or M and read the Ethernet-HOWTO, available from
11 --- a/drivers/net/ethernet/broadcom/bgmac.c
12 +++ b/drivers/net/ethernet/broadcom/bgmac.c
13 @@ -96,6 +96,19 @@ static void bgmac_dma_tx_enable(struct b
14         u32 ctl;
15  
16         ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
17 +       if (bgmac->core->id.rev >= 4) {
18 +               ctl &= ~BGMAC_DMA_TX_BL_MASK;
19 +               ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
20 +
21 +               ctl &= ~BGMAC_DMA_TX_MR_MASK;
22 +               ctl |= BGMAC_DMA_TX_MR_2 << BGMAC_DMA_TX_MR_SHIFT;
23 +
24 +               ctl &= ~BGMAC_DMA_TX_PC_MASK;
25 +               ctl |= BGMAC_DMA_TX_PC_16 << BGMAC_DMA_TX_PC_SHIFT;
26 +
27 +               ctl &= ~BGMAC_DMA_TX_PT_MASK;
28 +               ctl |= BGMAC_DMA_TX_PT_8 << BGMAC_DMA_TX_PT_SHIFT;
29 +       }
30         ctl |= BGMAC_DMA_TX_ENABLE;
31         ctl |= BGMAC_DMA_TX_PARITY_DISABLE;
32         bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl);
33 @@ -240,6 +253,16 @@ static void bgmac_dma_rx_enable(struct b
34         u32 ctl;
35  
36         ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
37 +       if (bgmac->core->id.rev >= 4) {
38 +               ctl &= ~BGMAC_DMA_RX_BL_MASK;
39 +               ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
40 +
41 +               ctl &= ~BGMAC_DMA_RX_PC_MASK;
42 +               ctl |= BGMAC_DMA_RX_PC_8 << BGMAC_DMA_RX_PC_SHIFT;
43 +
44 +               ctl &= ~BGMAC_DMA_RX_PT_MASK;
45 +               ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT;
46 +       }
47         ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
48         ctl |= BGMAC_DMA_RX_ENABLE;
49         ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
50 @@ -682,70 +705,6 @@ static int bgmac_phy_write(struct bgmac
51         return 0;
52  }
53  
54 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyforce */
55 -static void bgmac_phy_force(struct bgmac *bgmac)
56 -{
57 -       u16 ctl;
58 -       u16 mask = ~(BGMAC_PHY_CTL_SPEED | BGMAC_PHY_CTL_SPEED_MSB |
59 -                    BGMAC_PHY_CTL_ANENAB | BGMAC_PHY_CTL_DUPLEX);
60 -
61 -       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
62 -               return;
63 -
64 -       if (bgmac->autoneg)
65 -               return;
66 -
67 -       ctl = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL);
68 -       ctl &= mask;
69 -       if (bgmac->full_duplex)
70 -               ctl |= BGMAC_PHY_CTL_DUPLEX;
71 -       if (bgmac->speed == BGMAC_SPEED_100)
72 -               ctl |= BGMAC_PHY_CTL_SPEED_100;
73 -       else if (bgmac->speed == BGMAC_SPEED_1000)
74 -               ctl |= BGMAC_PHY_CTL_SPEED_1000;
75 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL, ctl);
76 -}
77 -
78 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyadvertise */
79 -static void bgmac_phy_advertise(struct bgmac *bgmac)
80 -{
81 -       u16 adv;
82 -
83 -       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
84 -               return;
85 -
86 -       if (!bgmac->autoneg)
87 -               return;
88 -
89 -       /* Adv selected 10/100 speeds */
90 -       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV);
91 -       adv &= ~(BGMAC_PHY_ADV_10HALF | BGMAC_PHY_ADV_10FULL |
92 -                BGMAC_PHY_ADV_100HALF | BGMAC_PHY_ADV_100FULL);
93 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
94 -               adv |= BGMAC_PHY_ADV_10HALF;
95 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
96 -               adv |= BGMAC_PHY_ADV_100HALF;
97 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
98 -               adv |= BGMAC_PHY_ADV_10FULL;
99 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
100 -               adv |= BGMAC_PHY_ADV_100FULL;
101 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV, adv);
102 -
103 -       /* Adv selected 1000 speeds */
104 -       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2);
105 -       adv &= ~(BGMAC_PHY_ADV2_1000HALF | BGMAC_PHY_ADV2_1000FULL);
106 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
107 -               adv |= BGMAC_PHY_ADV2_1000HALF;
108 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
109 -               adv |= BGMAC_PHY_ADV2_1000FULL;
110 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2, adv);
111 -
112 -       /* Restart */
113 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
114 -                       bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) |
115 -                       BGMAC_PHY_CTL_RESTART);
116 -}
117 -
118  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
119  static void bgmac_phy_init(struct bgmac *bgmac)
120  {
121 @@ -789,11 +748,9 @@ static void bgmac_phy_reset(struct bgmac
122         if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
123                 return;
124  
125 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
126 -                       BGMAC_PHY_CTL_RESET);
127 +       bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
128         udelay(100);
129 -       if (bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) &
130 -           BGMAC_PHY_CTL_RESET)
131 +       if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
132                 bgmac_err(bgmac, "PHY reset failed\n");
133         bgmac_phy_init(bgmac);
134  }
135 @@ -811,13 +768,13 @@ static void bgmac_cmdcfg_maskset(struct
136         u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
137         u32 new_val = (cmdcfg & mask) | set;
138  
139 -       bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR);
140 +       bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
141         udelay(2);
142  
143         if (new_val != cmdcfg || force)
144                 bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
145  
146 -       bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR);
147 +       bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
148         udelay(2);
149  }
150  
151 @@ -876,31 +833,56 @@ static void bgmac_clear_mib(struct bgmac
152  }
153  
154  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_speed */
155 -static void bgmac_speed(struct bgmac *bgmac, int speed)
156 +static void bgmac_mac_speed(struct bgmac *bgmac)
157  {
158         u32 mask = ~(BGMAC_CMDCFG_ES_MASK | BGMAC_CMDCFG_HD);
159         u32 set = 0;
160  
161 -       if (speed & BGMAC_SPEED_10)
162 +       switch (bgmac->mac_speed) {
163 +       case SPEED_10:
164                 set |= BGMAC_CMDCFG_ES_10;
165 -       if (speed & BGMAC_SPEED_100)
166 +               break;
167 +       case SPEED_100:
168                 set |= BGMAC_CMDCFG_ES_100;
169 -       if (speed & BGMAC_SPEED_1000)
170 +               break;
171 +       case SPEED_1000:
172                 set |= BGMAC_CMDCFG_ES_1000;
173 -       if (!bgmac->full_duplex)
174 +               break;
175 +       case SPEED_2500:
176 +               set |= BGMAC_CMDCFG_ES_2500;
177 +               break;
178 +       default:
179 +               bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
180 +       }
181 +
182 +       if (bgmac->mac_duplex == DUPLEX_HALF)
183                 set |= BGMAC_CMDCFG_HD;
184 +
185         bgmac_cmdcfg_maskset(bgmac, mask, set, true);
186  }
187  
188  static void bgmac_miiconfig(struct bgmac *bgmac)
189  {
190 -       u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
191 -                       BGMAC_DS_MM_SHIFT;
192 -       if (imode == 0 || imode == 1) {
193 -               if (bgmac->autoneg)
194 -                       bgmac_speed(bgmac, BGMAC_SPEED_100);
195 -               else
196 -                       bgmac_speed(bgmac, bgmac->speed);
197 +       struct bcma_device *core = bgmac->core;
198 +       struct bcma_chipinfo *ci = &core->bus->chipinfo;
199 +       u8 imode;
200 +
201 +       if (ci->id == BCMA_CHIP_ID_BCM4707 ||
202 +           ci->id == BCMA_CHIP_ID_BCM53018) {
203 +               bcma_awrite32(core, BCMA_IOCTL,
204 +                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
205 +                             BGMAC_BCMA_IOCTL_SW_CLKEN);
206 +               bgmac->mac_speed = SPEED_2500;
207 +               bgmac->mac_duplex = DUPLEX_FULL;
208 +               bgmac_mac_speed(bgmac);
209 +       } else {
210 +               imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
211 +                       BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
212 +               if (imode == 0 || imode == 1) {
213 +                       bgmac->mac_speed = SPEED_100;
214 +                       bgmac->mac_duplex = DUPLEX_FULL;
215 +                       bgmac_mac_speed(bgmac);
216 +               }
217         }
218  }
219  
220 @@ -910,7 +892,7 @@ static void bgmac_chip_reset(struct bgma
221         struct bcma_device *core = bgmac->core;
222         struct bcma_bus *bus = core->bus;
223         struct bcma_chipinfo *ci = &bus->chipinfo;
224 -       u32 flags = 0;
225 +       u32 flags;
226         u32 iost;
227         int i;
228  
229 @@ -933,26 +915,36 @@ static void bgmac_chip_reset(struct bgma
230         }
231  
232         iost = bcma_aread32(core, BCMA_IOST);
233 -       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 10) ||
234 +       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
235             (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
236 -           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9))
237 +           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
238                 iost &= ~BGMAC_BCMA_IOST_ATTACHED;
239  
240 -       if (iost & BGMAC_BCMA_IOST_ATTACHED) {
241 -               flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
242 -               if (!bgmac->has_robosw)
243 -                       flags |= BGMAC_BCMA_IOCTL_SW_RESET;
244 +       /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
245 +       if (ci->id != BCMA_CHIP_ID_BCM4707) {
246 +               flags = 0;
247 +               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
248 +                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
249 +                       if (!bgmac->has_robosw)
250 +                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
251 +               }
252 +               bcma_core_enable(core, flags);
253         }
254  
255 -       bcma_core_enable(core, flags);
256 -
257 -       if (core->id.rev > 2) {
258 -               bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
259 -               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
260 +       /* Request Misc PLL for corerev > 2 */
261 +       if (core->id.rev > 2 &&
262 +           ci->id != BCMA_CHIP_ID_BCM4707 &&
263 +           ci->id != BCMA_CHIP_ID_BCM53018) {
264 +               bgmac_set(bgmac, BCMA_CLKCTLST,
265 +                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
266 +               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
267 +                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
268 +                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
269                                  1000);
270         }
271  
272 -       if (ci->id == BCMA_CHIP_ID_BCM5357 || ci->id == BCMA_CHIP_ID_BCM4749 ||
273 +       if (ci->id == BCMA_CHIP_ID_BCM5357 ||
274 +           ci->id == BCMA_CHIP_ID_BCM4749 ||
275             ci->id == BCMA_CHIP_ID_BCM53572) {
276                 struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
277                 u8 et_swtype = 0;
278 @@ -967,10 +959,11 @@ static void bgmac_chip_reset(struct bgma
279                         et_swtype &= 0x0f;
280                         et_swtype <<= 4;
281                         sw_type = et_swtype;
282 -               } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
283 +               } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
284                         sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
285 -               } else if ((ci->id != BCMA_CHIP_ID_BCM53572 && ci->pkg == 10) ||
286 -                          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9)) {
287 +               } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
288 +                          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
289 +                          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
290                         sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
291                                   BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
292                 }
293 @@ -1007,8 +1000,10 @@ static void bgmac_chip_reset(struct bgma
294                              BGMAC_CMDCFG_PROM |
295                              BGMAC_CMDCFG_NLC |
296                              BGMAC_CMDCFG_CFE |
297 -                            BGMAC_CMDCFG_SR,
298 +                            BGMAC_CMDCFG_SR(core->id.rev),
299                              false);
300 +       bgmac->mac_speed = SPEED_UNKNOWN;
301 +       bgmac->mac_duplex = DUPLEX_UNKNOWN;
302  
303         bgmac_clear_mib(bgmac);
304         if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
305 @@ -1048,7 +1043,7 @@ static void bgmac_enable(struct bgmac *b
306  
307         cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
308         bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
309 -                            BGMAC_CMDCFG_SR, true);
310 +                            BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
311         udelay(2);
312         cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
313         bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
314 @@ -1077,12 +1072,16 @@ static void bgmac_enable(struct bgmac *b
315                 break;
316         }
317  
318 -       rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
319 -       rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
320 -       bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
321 -       mdp = (bp_clk * 128 / 1000) - 3;
322 -       rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
323 -       bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
324 +       if (ci->id != BCMA_CHIP_ID_BCM4707 &&
325 +           ci->id != BCMA_CHIP_ID_BCM53018) {
326 +               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
327 +               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
328 +               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
329 +                               1000000;
330 +               mdp = (bp_clk * 128 / 1000) - 3;
331 +               rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
332 +               bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
333 +       }
334  }
335  
336  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
337 @@ -1108,13 +1107,6 @@ static void bgmac_chip_init(struct bgmac
338  
339         bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN);
340  
341 -       if (!bgmac->autoneg) {
342 -               bgmac_speed(bgmac, bgmac->speed);
343 -               bgmac_phy_force(bgmac);
344 -       } else if (bgmac->speed) { /* if there is anything to adv */
345 -               bgmac_phy_advertise(bgmac);
346 -       }
347 -
348         if (full_init) {
349                 bgmac_dma_init(bgmac);
350                 if (1) /* FIXME: is there any case we don't want IRQs? */
351 @@ -1204,6 +1196,8 @@ static int bgmac_open(struct net_device
352         }
353         napi_enable(&bgmac->napi);
354  
355 +       phy_start(bgmac->phy_dev);
356 +
357         netif_carrier_on(net_dev);
358  
359  err_out:
360 @@ -1216,6 +1210,8 @@ static int bgmac_stop(struct net_device
361  
362         netif_carrier_off(net_dev);
363  
364 +       phy_stop(bgmac->phy_dev);
365 +
366         napi_disable(&bgmac->napi);
367         bgmac_chip_intrs_off(bgmac);
368         free_irq(bgmac->core->irq, net_dev);
369 @@ -1252,27 +1248,11 @@ static int bgmac_set_mac_address(struct
370  static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
371  {
372         struct bgmac *bgmac = netdev_priv(net_dev);
373 -       struct mii_ioctl_data *data = if_mii(ifr);
374  
375 -       switch (cmd) {
376 -       case SIOCGMIIPHY:
377 -               data->phy_id = bgmac->phyaddr;
378 -               /* fallthru */
379 -       case SIOCGMIIREG:
380 -               if (!netif_running(net_dev))
381 -                       return -EAGAIN;
382 -               data->val_out = bgmac_phy_read(bgmac, data->phy_id,
383 -                                              data->reg_num & 0x1f);
384 -               return 0;
385 -       case SIOCSMIIREG:
386 -               if (!netif_running(net_dev))
387 -                       return -EAGAIN;
388 -               bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
389 -                               data->val_in);
390 -               return 0;
391 -       default:
392 -               return -EOPNOTSUPP;
393 -       }
394 +       if (!netif_running(net_dev))
395 +               return -EINVAL;
396 +
397 +       return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
398  }
399  
400  static const struct net_device_ops bgmac_netdev_ops = {
401 @@ -1294,61 +1274,16 @@ static int bgmac_get_settings(struct net
402  {
403         struct bgmac *bgmac = netdev_priv(net_dev);
404  
405 -       cmd->supported = SUPPORTED_10baseT_Half |
406 -                        SUPPORTED_10baseT_Full |
407 -                        SUPPORTED_100baseT_Half |
408 -                        SUPPORTED_100baseT_Full |
409 -                        SUPPORTED_1000baseT_Half |
410 -                        SUPPORTED_1000baseT_Full |
411 -                        SUPPORTED_Autoneg;
412 -
413 -       if (bgmac->autoneg) {
414 -               WARN_ON(cmd->advertising);
415 -               if (bgmac->full_duplex) {
416 -                       if (bgmac->speed & BGMAC_SPEED_10)
417 -                               cmd->advertising |= ADVERTISED_10baseT_Full;
418 -                       if (bgmac->speed & BGMAC_SPEED_100)
419 -                               cmd->advertising |= ADVERTISED_100baseT_Full;
420 -                       if (bgmac->speed & BGMAC_SPEED_1000)
421 -                               cmd->advertising |= ADVERTISED_1000baseT_Full;
422 -               } else {
423 -                       if (bgmac->speed & BGMAC_SPEED_10)
424 -                               cmd->advertising |= ADVERTISED_10baseT_Half;
425 -                       if (bgmac->speed & BGMAC_SPEED_100)
426 -                               cmd->advertising |= ADVERTISED_100baseT_Half;
427 -                       if (bgmac->speed & BGMAC_SPEED_1000)
428 -                               cmd->advertising |= ADVERTISED_1000baseT_Half;
429 -               }
430 -       } else {
431 -               switch (bgmac->speed) {
432 -               case BGMAC_SPEED_10:
433 -                       ethtool_cmd_speed_set(cmd, SPEED_10);
434 -                       break;
435 -               case BGMAC_SPEED_100:
436 -                       ethtool_cmd_speed_set(cmd, SPEED_100);
437 -                       break;
438 -               case BGMAC_SPEED_1000:
439 -                       ethtool_cmd_speed_set(cmd, SPEED_1000);
440 -                       break;
441 -               }
442 -       }
443 -
444 -       cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
445 -
446 -       cmd->autoneg = bgmac->autoneg;
447 -
448 -       return 0;
449 +       return phy_ethtool_gset(bgmac->phy_dev, cmd);
450  }
451  
452 -#if 0
453  static int bgmac_set_settings(struct net_device *net_dev,
454                               struct ethtool_cmd *cmd)
455  {
456         struct bgmac *bgmac = netdev_priv(net_dev);
457  
458 -       return -1;
459 +       return phy_ethtool_sset(bgmac->phy_dev, cmd);
460  }
461 -#endif
462  
463  static void bgmac_get_drvinfo(struct net_device *net_dev,
464                               struct ethtool_drvinfo *info)
465 @@ -1359,6 +1294,7 @@ static void bgmac_get_drvinfo(struct net
466  
467  static const struct ethtool_ops bgmac_ethtool_ops = {
468         .get_settings           = bgmac_get_settings,
469 +       .set_settings           = bgmac_set_settings,
470         .get_drvinfo            = bgmac_get_drvinfo,
471  };
472  
473 @@ -1377,9 +1313,35 @@ static int bgmac_mii_write(struct mii_bu
474         return bgmac_phy_write(bus->priv, mii_id, regnum, value);
475  }
476  
477 +static void bgmac_adjust_link(struct net_device *net_dev)
478 +{
479 +       struct bgmac *bgmac = netdev_priv(net_dev);
480 +       struct phy_device *phy_dev = bgmac->phy_dev;
481 +       bool update = false;
482 +
483 +       if (phy_dev->link) {
484 +               if (phy_dev->speed != bgmac->mac_speed) {
485 +                       bgmac->mac_speed = phy_dev->speed;
486 +                       update = true;
487 +               }
488 +
489 +               if (phy_dev->duplex != bgmac->mac_duplex) {
490 +                       bgmac->mac_duplex = phy_dev->duplex;
491 +                       update = true;
492 +               }
493 +       }
494 +
495 +       if (update) {
496 +               bgmac_mac_speed(bgmac);
497 +               phy_print_status(phy_dev);
498 +       }
499 +}
500 +
501  static int bgmac_mii_register(struct bgmac *bgmac)
502  {
503         struct mii_bus *mii_bus;
504 +       struct phy_device *phy_dev;
505 +       char bus_id[MII_BUS_ID_SIZE + 3];
506         int i, err = 0;
507  
508         mii_bus = mdiobus_alloc();
509 @@ -1411,8 +1373,22 @@ static int bgmac_mii_register(struct bgm
510  
511         bgmac->mii_bus = mii_bus;
512  
513 +       /* Connect to the PHY */
514 +       snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
515 +                bgmac->phyaddr);
516 +       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
517 +                             PHY_INTERFACE_MODE_MII);
518 +       if (IS_ERR(phy_dev)) {
519 +               bgmac_err(bgmac, "PHY connecton failed\n");
520 +               err = PTR_ERR(phy_dev);
521 +               goto err_unregister_bus;
522 +       }
523 +       bgmac->phy_dev = phy_dev;
524 +
525         return err;
526  
527 +err_unregister_bus:
528 +       mdiobus_unregister(mii_bus);
529  err_free_irq:
530         kfree(mii_bus->irq);
531  err_free_bus:
532 @@ -1467,9 +1443,6 @@ static int bgmac_probe(struct bcma_devic
533         bcma_set_drvdata(core, bgmac);
534  
535         /* Defaults */
536 -       bgmac->autoneg = true;
537 -       bgmac->full_duplex = true;
538 -       bgmac->speed = BGMAC_SPEED_10 | BGMAC_SPEED_100 | BGMAC_SPEED_1000;
539         memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
540  
541         /* On BCM4706 we need common core to access PHY */
542 @@ -1500,6 +1473,27 @@ static int bgmac_probe(struct bcma_devic
543  
544         bgmac_chip_reset(bgmac);
545  
546 +       /* For Northstar, we have to take all GMAC core out of reset */
547 +       if (core->id.id == BCMA_CHIP_ID_BCM4707 ||
548 +           core->id.id == BCMA_CHIP_ID_BCM53018) {
549 +               struct bcma_device *ns_core;
550 +               int ns_gmac;
551 +
552 +               /* Northstar has 4 GMAC cores */
553 +               for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
554 +                       /* As Northstar requirement, we have to reset all GMACs
555 +                        * before accessing one. bgmac_chip_reset() call
556 +                        * bcma_core_enable() for this core. Then the other
557 +                        * three GMACs didn't reset.  We do it here.
558 +                        */
559 +                       ns_core = bcma_find_core_unit(core->bus,
560 +                                                     BCMA_CORE_MAC_GBIT,
561 +                                                     ns_gmac);
562 +                       if (ns_core && !bcma_core_is_enabled(ns_core))
563 +                               bcma_core_enable(ns_core, 0);
564 +               }
565 +       }
566 +
567         err = bgmac_dma_alloc(bgmac);
568         if (err) {
569                 bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
570 @@ -1524,14 +1518,12 @@ static int bgmac_probe(struct bcma_devic
571         err = bgmac_mii_register(bgmac);
572         if (err) {
573                 bgmac_err(bgmac, "Cannot register MDIO\n");
574 -               err = -ENOTSUPP;
575                 goto err_dma_free;
576         }
577  
578         err = register_netdev(bgmac->net_dev);
579         if (err) {
580                 bgmac_err(bgmac, "Cannot register net device\n");
581 -               err = -ENOTSUPP;
582                 goto err_mii_unregister;
583         }
584  
585 --- a/drivers/net/ethernet/broadcom/bgmac.h
586 +++ b/drivers/net/ethernet/broadcom/bgmac.h
587 @@ -95,7 +95,11 @@
588  #define  BGMAC_RXQ_CTL_MDP_SHIFT               24
589  #define BGMAC_GPIO_SELECT                      0x194
590  #define BGMAC_GPIO_OUTPUT_EN                   0x198
591 -/* For 0x1e0 see BCMA_CLKCTLST */
592 +
593 +/* For 0x1e0 see BCMA_CLKCTLST. Below are BGMAC specific bits */
594 +#define  BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ      0x00000100
595 +#define  BGMAC_BCMA_CLKCTLST_MISC_PLL_ST       0x01000000
596 +
597  #define BGMAC_HW_WAR                           0x1e4
598  #define BGMAC_PWR_CTL                          0x1e8
599  #define BGMAC_DMA_BASE0                                0x200           /* Tx and Rx controller */
600 @@ -185,6 +189,7 @@
601  #define   BGMAC_CMDCFG_ES_10                   0x00000000
602  #define   BGMAC_CMDCFG_ES_100                  0x00000004
603  #define   BGMAC_CMDCFG_ES_1000                 0x00000008
604 +#define   BGMAC_CMDCFG_ES_2500                 0x0000000C
605  #define  BGMAC_CMDCFG_PROM                     0x00000010      /* Set to activate promiscuous mode */
606  #define  BGMAC_CMDCFG_PAD_EN                   0x00000020
607  #define  BGMAC_CMDCFG_CF                       0x00000040
608 @@ -193,7 +198,9 @@
609  #define  BGMAC_CMDCFG_TAI                      0x00000200
610  #define  BGMAC_CMDCFG_HD                       0x00000400      /* Set if in half duplex mode */
611  #define  BGMAC_CMDCFG_HD_SHIFT                 10
612 -#define  BGMAC_CMDCFG_SR                       0x00000800      /* Set to reset mode */
613 +#define  BGMAC_CMDCFG_SR_REV0                  0x00000800      /* Set to reset mode, for other revs */
614 +#define  BGMAC_CMDCFG_SR_REV4                  0x00002000      /* Set to reset mode, only for core rev 4 */
615 +#define  BGMAC_CMDCFG_SR(rev)  ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
616  #define  BGMAC_CMDCFG_ML                       0x00008000      /* Set to activate mac loopback mode */
617  #define  BGMAC_CMDCFG_AE                       0x00400000
618  #define  BGMAC_CMDCFG_CFE                      0x00800000
619 @@ -216,27 +223,6 @@
620  #define BGMAC_RX_STATUS                                0xb38
621  #define BGMAC_TX_STATUS                                0xb3c
622  
623 -#define BGMAC_PHY_CTL                          0x00
624 -#define  BGMAC_PHY_CTL_SPEED_MSB               0x0040
625 -#define  BGMAC_PHY_CTL_DUPLEX                  0x0100          /* duplex mode */
626 -#define  BGMAC_PHY_CTL_RESTART                 0x0200          /* restart autonegotiation */
627 -#define  BGMAC_PHY_CTL_ANENAB                  0x1000          /* enable autonegotiation */
628 -#define  BGMAC_PHY_CTL_SPEED                   0x2000
629 -#define  BGMAC_PHY_CTL_LOOP                    0x4000          /* loopback */
630 -#define  BGMAC_PHY_CTL_RESET                   0x8000          /* reset */
631 -/* Helpers */
632 -#define  BGMAC_PHY_CTL_SPEED_10                        0
633 -#define  BGMAC_PHY_CTL_SPEED_100               BGMAC_PHY_CTL_SPEED
634 -#define  BGMAC_PHY_CTL_SPEED_1000              BGMAC_PHY_CTL_SPEED_MSB
635 -#define BGMAC_PHY_ADV                          0x04
636 -#define  BGMAC_PHY_ADV_10HALF                  0x0020          /* advertise 10MBits/s half duplex */
637 -#define  BGMAC_PHY_ADV_10FULL                  0x0040          /* advertise 10MBits/s full duplex */
638 -#define  BGMAC_PHY_ADV_100HALF                 0x0080          /* advertise 100MBits/s half duplex */
639 -#define  BGMAC_PHY_ADV_100FULL                 0x0100          /* advertise 100MBits/s full duplex */
640 -#define BGMAC_PHY_ADV2                         0x09
641 -#define  BGMAC_PHY_ADV2_1000HALF               0x0100          /* advertise 1000MBits/s half duplex */
642 -#define  BGMAC_PHY_ADV2_1000FULL               0x0200          /* advertise 1000MBits/s full duplex */
643 -
644  /* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
645  #define BGMAC_BCMA_IOCTL_SW_CLKEN              0x00000004      /* PHY Clock Enable */
646  #define BGMAC_BCMA_IOCTL_SW_RESET              0x00000008      /* PHY Reset */
647 @@ -254,9 +240,34 @@
648  #define  BGMAC_DMA_TX_SUSPEND                  0x00000002
649  #define  BGMAC_DMA_TX_LOOPBACK                 0x00000004
650  #define  BGMAC_DMA_TX_FLUSH                    0x00000010
651 +#define  BGMAC_DMA_TX_MR_MASK                  0x000000C0      /* Multiple outstanding reads */
652 +#define  BGMAC_DMA_TX_MR_SHIFT                 6
653 +#define   BGMAC_DMA_TX_MR_1                    0
654 +#define   BGMAC_DMA_TX_MR_2                    1
655  #define  BGMAC_DMA_TX_PARITY_DISABLE           0x00000800
656  #define  BGMAC_DMA_TX_ADDREXT_MASK             0x00030000
657  #define  BGMAC_DMA_TX_ADDREXT_SHIFT            16
658 +#define  BGMAC_DMA_TX_BL_MASK                  0x001C0000      /* BurstLen bits */
659 +#define  BGMAC_DMA_TX_BL_SHIFT                 18
660 +#define   BGMAC_DMA_TX_BL_16                   0
661 +#define   BGMAC_DMA_TX_BL_32                   1
662 +#define   BGMAC_DMA_TX_BL_64                   2
663 +#define   BGMAC_DMA_TX_BL_128                  3
664 +#define   BGMAC_DMA_TX_BL_256                  4
665 +#define   BGMAC_DMA_TX_BL_512                  5
666 +#define   BGMAC_DMA_TX_BL_1024                 6
667 +#define  BGMAC_DMA_TX_PC_MASK                  0x00E00000      /* Prefetch control */
668 +#define  BGMAC_DMA_TX_PC_SHIFT                 21
669 +#define   BGMAC_DMA_TX_PC_0                    0
670 +#define   BGMAC_DMA_TX_PC_4                    1
671 +#define   BGMAC_DMA_TX_PC_8                    2
672 +#define   BGMAC_DMA_TX_PC_16                   3
673 +#define  BGMAC_DMA_TX_PT_MASK                  0x03000000      /* Prefetch threshold */
674 +#define  BGMAC_DMA_TX_PT_SHIFT                 24
675 +#define   BGMAC_DMA_TX_PT_1                    0
676 +#define   BGMAC_DMA_TX_PT_2                    1
677 +#define   BGMAC_DMA_TX_PT_4                    2
678 +#define   BGMAC_DMA_TX_PT_8                    3
679  #define BGMAC_DMA_TX_INDEX                     0x04
680  #define BGMAC_DMA_TX_RINGLO                    0x08
681  #define BGMAC_DMA_TX_RINGHI                    0x0C
682 @@ -284,8 +295,33 @@
683  #define  BGMAC_DMA_RX_DIRECT_FIFO              0x00000100
684  #define  BGMAC_DMA_RX_OVERFLOW_CONT            0x00000400
685  #define  BGMAC_DMA_RX_PARITY_DISABLE           0x00000800
686 +#define  BGMAC_DMA_RX_MR_MASK                  0x000000C0      /* Multiple outstanding reads */
687 +#define  BGMAC_DMA_RX_MR_SHIFT                 6
688 +#define   BGMAC_DMA_TX_MR_1                    0
689 +#define   BGMAC_DMA_TX_MR_2                    1
690  #define  BGMAC_DMA_RX_ADDREXT_MASK             0x00030000
691  #define  BGMAC_DMA_RX_ADDREXT_SHIFT            16
692 +#define  BGMAC_DMA_RX_BL_MASK                  0x001C0000      /* BurstLen bits */
693 +#define  BGMAC_DMA_RX_BL_SHIFT                 18
694 +#define   BGMAC_DMA_RX_BL_16                   0
695 +#define   BGMAC_DMA_RX_BL_32                   1
696 +#define   BGMAC_DMA_RX_BL_64                   2
697 +#define   BGMAC_DMA_RX_BL_128                  3
698 +#define   BGMAC_DMA_RX_BL_256                  4
699 +#define   BGMAC_DMA_RX_BL_512                  5
700 +#define   BGMAC_DMA_RX_BL_1024                 6
701 +#define  BGMAC_DMA_RX_PC_MASK                  0x00E00000      /* Prefetch control */
702 +#define  BGMAC_DMA_RX_PC_SHIFT                 21
703 +#define   BGMAC_DMA_RX_PC_0                    0
704 +#define   BGMAC_DMA_RX_PC_4                    1
705 +#define   BGMAC_DMA_RX_PC_8                    2
706 +#define   BGMAC_DMA_RX_PC_16                   3
707 +#define  BGMAC_DMA_RX_PT_MASK                  0x03000000      /* Prefetch threshold */
708 +#define  BGMAC_DMA_RX_PT_SHIFT                 24
709 +#define   BGMAC_DMA_RX_PT_1                    0
710 +#define   BGMAC_DMA_RX_PT_2                    1
711 +#define   BGMAC_DMA_RX_PT_4                    2
712 +#define   BGMAC_DMA_RX_PT_8                    3
713  #define BGMAC_DMA_RX_INDEX                     0x24
714  #define BGMAC_DMA_RX_RINGLO                    0x28
715  #define BGMAC_DMA_RX_RINGHI                    0x2C
716 @@ -342,10 +378,6 @@
717  #define BGMAC_CHIPCTL_1_SW_TYPE_RGMII          0x000000C0
718  #define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS         0x00010000
719  
720 -#define BGMAC_SPEED_10                         0x0001
721 -#define BGMAC_SPEED_100                                0x0002
722 -#define BGMAC_SPEED_1000                       0x0004
723 -
724  #define BGMAC_WEIGHT   64
725  
726  #define ETHER_MAX_LEN   1518
727 @@ -402,6 +434,7 @@ struct bgmac {
728         struct net_device *net_dev;
729         struct napi_struct napi;
730         struct mii_bus *mii_bus;
731 +       struct phy_device *phy_dev;
732  
733         /* DMA */
734         struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
735 @@ -416,10 +449,9 @@ struct bgmac {
736         u32 int_mask;
737         u32 int_status;
738  
739 -       /* Speed-related */
740 -       int speed;
741 -       bool autoneg;
742 -       bool full_duplex;
743 +       /* Current MAC state */
744 +       int mac_speed;
745 +       int mac_duplex;
746  
747         u8 phyaddr;
748         bool has_robosw;