imagebuilder: x86 fails to build inside the imagebuilder
[openwrt.git] / target / linux / generic / patches-3.12 / 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 @@ -149,6 +162,8 @@ static netdev_tx_t bgmac_dma_tx_add(stru
34         dma_desc->ctl0 = cpu_to_le32(ctl0);
35         dma_desc->ctl1 = cpu_to_le32(ctl1);
36  
37 +       netdev_sent_queue(net_dev, skb->len);
38 +
39         wmb();
40  
41         /* Increase ring->end to point empty slot. We tell hardware the first
42 @@ -178,6 +193,7 @@ static void bgmac_dma_tx_free(struct bgm
43         struct device *dma_dev = bgmac->core->dma_dev;
44         int empty_slot;
45         bool freed = false;
46 +       unsigned bytes_compl = 0, pkts_compl = 0;
47  
48         /* The last slot that hardware didn't consume yet */
49         empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
50 @@ -195,6 +211,9 @@ static void bgmac_dma_tx_free(struct bgm
51                                          slot->skb->len, DMA_TO_DEVICE);
52                         slot->dma_addr = 0;
53  
54 +                       bytes_compl += slot->skb->len;
55 +                       pkts_compl++;
56 +
57                         /* Free memory! :) */
58                         dev_kfree_skb(slot->skb);
59                         slot->skb = NULL;
60 @@ -208,6 +227,8 @@ static void bgmac_dma_tx_free(struct bgm
61                 freed = true;
62         }
63  
64 +       netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
65 +
66         if (freed && netif_queue_stopped(bgmac->net_dev))
67                 netif_wake_queue(bgmac->net_dev);
68  }
69 @@ -232,6 +253,16 @@ static void bgmac_dma_rx_enable(struct b
70         u32 ctl;
71  
72         ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
73 +       if (bgmac->core->id.rev >= 4) {
74 +               ctl &= ~BGMAC_DMA_RX_BL_MASK;
75 +               ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
76 +
77 +               ctl &= ~BGMAC_DMA_RX_PC_MASK;
78 +               ctl |= BGMAC_DMA_RX_PC_8 << BGMAC_DMA_RX_PC_SHIFT;
79 +
80 +               ctl &= ~BGMAC_DMA_RX_PT_MASK;
81 +               ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT;
82 +       }
83         ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
84         ctl |= BGMAC_DMA_RX_ENABLE;
85         ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
86 @@ -244,31 +275,59 @@ static int bgmac_dma_rx_skb_for_slot(str
87                                      struct bgmac_slot_info *slot)
88  {
89         struct device *dma_dev = bgmac->core->dma_dev;
90 +       struct sk_buff *skb;
91 +       dma_addr_t dma_addr;
92         struct bgmac_rx_header *rx;
93  
94         /* Alloc skb */
95 -       slot->skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
96 -       if (!slot->skb)
97 +       skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
98 +       if (!skb)
99                 return -ENOMEM;
100  
101         /* Poison - if everything goes fine, hardware will overwrite it */
102 -       rx = (struct bgmac_rx_header *)slot->skb->data;
103 +       rx = (struct bgmac_rx_header *)skb->data;
104         rx->len = cpu_to_le16(0xdead);
105         rx->flags = cpu_to_le16(0xbeef);
106  
107         /* Map skb for the DMA */
108 -       slot->dma_addr = dma_map_single(dma_dev, slot->skb->data,
109 -                                       BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
110 -       if (dma_mapping_error(dma_dev, slot->dma_addr)) {
111 +       dma_addr = dma_map_single(dma_dev, skb->data,
112 +                                 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
113 +       if (dma_mapping_error(dma_dev, dma_addr)) {
114                 bgmac_err(bgmac, "DMA mapping error\n");
115 +               dev_kfree_skb(skb);
116                 return -ENOMEM;
117         }
118 +
119 +       /* Update the slot */
120 +       slot->skb = skb;
121 +       slot->dma_addr = dma_addr;
122 +
123         if (slot->dma_addr & 0xC0000000)
124                 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
125  
126         return 0;
127  }
128  
129 +static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
130 +                                   struct bgmac_dma_ring *ring, int desc_idx)
131 +{
132 +       struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
133 +       u32 ctl0 = 0, ctl1 = 0;
134 +
135 +       if (desc_idx == ring->num_slots - 1)
136 +               ctl0 |= BGMAC_DESC_CTL0_EOT;
137 +       ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
138 +       /* Is there any BGMAC device that requires extension? */
139 +       /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
140 +        * B43_DMA64_DCTL1_ADDREXT_MASK;
141 +        */
142 +
143 +       dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[desc_idx].dma_addr));
144 +       dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[desc_idx].dma_addr));
145 +       dma_desc->ctl0 = cpu_to_le32(ctl0);
146 +       dma_desc->ctl1 = cpu_to_le32(ctl1);
147 +}
148 +
149  static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
150                              int weight)
151  {
152 @@ -287,7 +346,6 @@ static int bgmac_dma_rx_read(struct bgma
153                 struct device *dma_dev = bgmac->core->dma_dev;
154                 struct bgmac_slot_info *slot = &ring->slots[ring->start];
155                 struct sk_buff *skb = slot->skb;
156 -               struct sk_buff *new_skb;
157                 struct bgmac_rx_header *rx;
158                 u16 len, flags;
159  
160 @@ -300,38 +358,51 @@ static int bgmac_dma_rx_read(struct bgma
161                 len = le16_to_cpu(rx->len);
162                 flags = le16_to_cpu(rx->flags);
163  
164 -               /* Check for poison and drop or pass the packet */
165 -               if (len == 0xdead && flags == 0xbeef) {
166 -                       bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
167 -                                 ring->start);
168 -               } else {
169 +               do {
170 +                       dma_addr_t old_dma_addr = slot->dma_addr;
171 +                       int err;
172 +
173 +                       /* Check for poison and drop or pass the packet */
174 +                       if (len == 0xdead && flags == 0xbeef) {
175 +                               bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
176 +                                         ring->start);
177 +                               dma_sync_single_for_device(dma_dev,
178 +                                                          slot->dma_addr,
179 +                                                          BGMAC_RX_BUF_SIZE,
180 +                                                          DMA_FROM_DEVICE);
181 +                               break;
182 +                       }
183 +
184                         /* Omit CRC. */
185                         len -= ETH_FCS_LEN;
186  
187 -                       new_skb = netdev_alloc_skb_ip_align(bgmac->net_dev, len);
188 -                       if (new_skb) {
189 -                               skb_put(new_skb, len);
190 -                               skb_copy_from_linear_data_offset(skb, BGMAC_RX_FRAME_OFFSET,
191 -                                                                new_skb->data,
192 -                                                                len);
193 -                               skb_checksum_none_assert(skb);
194 -                               new_skb->protocol =
195 -                                       eth_type_trans(new_skb, bgmac->net_dev);
196 -                               netif_receive_skb(new_skb);
197 -                               handled++;
198 -                       } else {
199 -                               bgmac->net_dev->stats.rx_dropped++;
200 -                               bgmac_err(bgmac, "Allocation of skb for copying packet failed!\n");
201 +                       /* Prepare new skb as replacement */
202 +                       err = bgmac_dma_rx_skb_for_slot(bgmac, slot);
203 +                       if (err) {
204 +                               /* Poison the old skb */
205 +                               rx->len = cpu_to_le16(0xdead);
206 +                               rx->flags = cpu_to_le16(0xbeef);
207 +
208 +                               dma_sync_single_for_device(dma_dev,
209 +                                                          slot->dma_addr,
210 +                                                          BGMAC_RX_BUF_SIZE,
211 +                                                          DMA_FROM_DEVICE);
212 +                               break;
213                         }
214 +                       bgmac_dma_rx_setup_desc(bgmac, ring, ring->start);
215  
216 -                       /* Poison the old skb */
217 -                       rx->len = cpu_to_le16(0xdead);
218 -                       rx->flags = cpu_to_le16(0xbeef);
219 -               }
220 -
221 -               /* Make it back accessible to the hardware */
222 -               dma_sync_single_for_device(dma_dev, slot->dma_addr,
223 -                                          BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
224 +                       /* Unmap old skb, we'll pass it to the netfif */
225 +                       dma_unmap_single(dma_dev, old_dma_addr,
226 +                                        BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
227 +
228 +                       skb_put(skb, BGMAC_RX_FRAME_OFFSET + len);
229 +                       skb_pull(skb, BGMAC_RX_FRAME_OFFSET);
230 +
231 +                       skb_checksum_none_assert(skb);
232 +                       skb->protocol = eth_type_trans(skb, bgmac->net_dev);
233 +                       netif_receive_skb(skb);
234 +                       handled++;
235 +               } while (0);
236  
237                 if (++ring->start >= BGMAC_RX_RING_SLOTS)
238                         ring->start = 0;
239 @@ -495,8 +566,6 @@ err_dma_free:
240  static void bgmac_dma_init(struct bgmac *bgmac)
241  {
242         struct bgmac_dma_ring *ring;
243 -       struct bgmac_dma_desc *dma_desc;
244 -       u32 ctl0, ctl1;
245         int i;
246  
247         for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
248 @@ -529,23 +598,8 @@ static void bgmac_dma_init(struct bgmac
249                 if (ring->unaligned)
250                         bgmac_dma_rx_enable(bgmac, ring);
251  
252 -               for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots;
253 -                    j++, dma_desc++) {
254 -                       ctl0 = ctl1 = 0;
255 -
256 -                       if (j == ring->num_slots - 1)
257 -                               ctl0 |= BGMAC_DESC_CTL0_EOT;
258 -                       ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
259 -                       /* Is there any BGMAC device that requires extension? */
260 -                       /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
261 -                        * B43_DMA64_DCTL1_ADDREXT_MASK;
262 -                        */
263 -
264 -                       dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[j].dma_addr));
265 -                       dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[j].dma_addr));
266 -                       dma_desc->ctl0 = cpu_to_le32(ctl0);
267 -                       dma_desc->ctl1 = cpu_to_le32(ctl1);
268 -               }
269 +               for (j = 0; j < ring->num_slots; j++)
270 +                       bgmac_dma_rx_setup_desc(bgmac, ring, j);
271  
272                 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
273                             ring->index_base +
274 @@ -651,70 +705,6 @@ static int bgmac_phy_write(struct bgmac
275         return 0;
276  }
277  
278 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyforce */
279 -static void bgmac_phy_force(struct bgmac *bgmac)
280 -{
281 -       u16 ctl;
282 -       u16 mask = ~(BGMAC_PHY_CTL_SPEED | BGMAC_PHY_CTL_SPEED_MSB |
283 -                    BGMAC_PHY_CTL_ANENAB | BGMAC_PHY_CTL_DUPLEX);
284 -
285 -       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
286 -               return;
287 -
288 -       if (bgmac->autoneg)
289 -               return;
290 -
291 -       ctl = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL);
292 -       ctl &= mask;
293 -       if (bgmac->full_duplex)
294 -               ctl |= BGMAC_PHY_CTL_DUPLEX;
295 -       if (bgmac->speed == BGMAC_SPEED_100)
296 -               ctl |= BGMAC_PHY_CTL_SPEED_100;
297 -       else if (bgmac->speed == BGMAC_SPEED_1000)
298 -               ctl |= BGMAC_PHY_CTL_SPEED_1000;
299 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL, ctl);
300 -}
301 -
302 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyadvertise */
303 -static void bgmac_phy_advertise(struct bgmac *bgmac)
304 -{
305 -       u16 adv;
306 -
307 -       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
308 -               return;
309 -
310 -       if (!bgmac->autoneg)
311 -               return;
312 -
313 -       /* Adv selected 10/100 speeds */
314 -       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV);
315 -       adv &= ~(BGMAC_PHY_ADV_10HALF | BGMAC_PHY_ADV_10FULL |
316 -                BGMAC_PHY_ADV_100HALF | BGMAC_PHY_ADV_100FULL);
317 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
318 -               adv |= BGMAC_PHY_ADV_10HALF;
319 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
320 -               adv |= BGMAC_PHY_ADV_100HALF;
321 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
322 -               adv |= BGMAC_PHY_ADV_10FULL;
323 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
324 -               adv |= BGMAC_PHY_ADV_100FULL;
325 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV, adv);
326 -
327 -       /* Adv selected 1000 speeds */
328 -       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2);
329 -       adv &= ~(BGMAC_PHY_ADV2_1000HALF | BGMAC_PHY_ADV2_1000FULL);
330 -       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
331 -               adv |= BGMAC_PHY_ADV2_1000HALF;
332 -       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
333 -               adv |= BGMAC_PHY_ADV2_1000FULL;
334 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2, adv);
335 -
336 -       /* Restart */
337 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
338 -                       bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) |
339 -                       BGMAC_PHY_CTL_RESTART);
340 -}
341 -
342  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
343  static void bgmac_phy_init(struct bgmac *bgmac)
344  {
345 @@ -758,11 +748,9 @@ static void bgmac_phy_reset(struct bgmac
346         if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
347                 return;
348  
349 -       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
350 -                       BGMAC_PHY_CTL_RESET);
351 +       bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
352         udelay(100);
353 -       if (bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) &
354 -           BGMAC_PHY_CTL_RESET)
355 +       if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
356                 bgmac_err(bgmac, "PHY reset failed\n");
357         bgmac_phy_init(bgmac);
358  }
359 @@ -780,13 +768,13 @@ static void bgmac_cmdcfg_maskset(struct
360         u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
361         u32 new_val = (cmdcfg & mask) | set;
362  
363 -       bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR);
364 +       bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
365         udelay(2);
366  
367         if (new_val != cmdcfg || force)
368                 bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
369  
370 -       bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR);
371 +       bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
372         udelay(2);
373  }
374  
375 @@ -845,31 +833,56 @@ static void bgmac_clear_mib(struct bgmac
376  }
377  
378  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_speed */
379 -static void bgmac_speed(struct bgmac *bgmac, int speed)
380 +static void bgmac_mac_speed(struct bgmac *bgmac)
381  {
382         u32 mask = ~(BGMAC_CMDCFG_ES_MASK | BGMAC_CMDCFG_HD);
383         u32 set = 0;
384  
385 -       if (speed & BGMAC_SPEED_10)
386 +       switch (bgmac->mac_speed) {
387 +       case SPEED_10:
388                 set |= BGMAC_CMDCFG_ES_10;
389 -       if (speed & BGMAC_SPEED_100)
390 +               break;
391 +       case SPEED_100:
392                 set |= BGMAC_CMDCFG_ES_100;
393 -       if (speed & BGMAC_SPEED_1000)
394 +               break;
395 +       case SPEED_1000:
396                 set |= BGMAC_CMDCFG_ES_1000;
397 -       if (!bgmac->full_duplex)
398 +               break;
399 +       case SPEED_2500:
400 +               set |= BGMAC_CMDCFG_ES_2500;
401 +               break;
402 +       default:
403 +               bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
404 +       }
405 +
406 +       if (bgmac->mac_duplex == DUPLEX_HALF)
407                 set |= BGMAC_CMDCFG_HD;
408 +
409         bgmac_cmdcfg_maskset(bgmac, mask, set, true);
410  }
411  
412  static void bgmac_miiconfig(struct bgmac *bgmac)
413  {
414 -       u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
415 -                       BGMAC_DS_MM_SHIFT;
416 -       if (imode == 0 || imode == 1) {
417 -               if (bgmac->autoneg)
418 -                       bgmac_speed(bgmac, BGMAC_SPEED_100);
419 -               else
420 -                       bgmac_speed(bgmac, bgmac->speed);
421 +       struct bcma_device *core = bgmac->core;
422 +       struct bcma_chipinfo *ci = &core->bus->chipinfo;
423 +       u8 imode;
424 +
425 +       if (ci->id == BCMA_CHIP_ID_BCM4707 ||
426 +           ci->id == BCMA_CHIP_ID_BCM53018) {
427 +               bcma_awrite32(core, BCMA_IOCTL,
428 +                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
429 +                             BGMAC_BCMA_IOCTL_SW_CLKEN);
430 +               bgmac->mac_speed = SPEED_2500;
431 +               bgmac->mac_duplex = DUPLEX_FULL;
432 +               bgmac_mac_speed(bgmac);
433 +       } else {
434 +               imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
435 +                       BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
436 +               if (imode == 0 || imode == 1) {
437 +                       bgmac->mac_speed = SPEED_100;
438 +                       bgmac->mac_duplex = DUPLEX_FULL;
439 +                       bgmac_mac_speed(bgmac);
440 +               }
441         }
442  }
443  
444 @@ -879,7 +892,7 @@ static void bgmac_chip_reset(struct bgma
445         struct bcma_device *core = bgmac->core;
446         struct bcma_bus *bus = core->bus;
447         struct bcma_chipinfo *ci = &bus->chipinfo;
448 -       u32 flags = 0;
449 +       u32 flags;
450         u32 iost;
451         int i;
452  
453 @@ -902,26 +915,36 @@ static void bgmac_chip_reset(struct bgma
454         }
455  
456         iost = bcma_aread32(core, BCMA_IOST);
457 -       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 10) ||
458 +       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
459             (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
460 -           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9))
461 +           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
462                 iost &= ~BGMAC_BCMA_IOST_ATTACHED;
463  
464 -       if (iost & BGMAC_BCMA_IOST_ATTACHED) {
465 -               flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
466 -               if (!bgmac->has_robosw)
467 -                       flags |= BGMAC_BCMA_IOCTL_SW_RESET;
468 +       /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
469 +       if (ci->id != BCMA_CHIP_ID_BCM4707) {
470 +               flags = 0;
471 +               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
472 +                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
473 +                       if (!bgmac->has_robosw)
474 +                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
475 +               }
476 +               bcma_core_enable(core, flags);
477         }
478  
479 -       bcma_core_enable(core, flags);
480 -
481 -       if (core->id.rev > 2) {
482 -               bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
483 -               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
484 +       /* Request Misc PLL for corerev > 2 */
485 +       if (core->id.rev > 2 &&
486 +           ci->id != BCMA_CHIP_ID_BCM4707 &&
487 +           ci->id != BCMA_CHIP_ID_BCM53018) {
488 +               bgmac_set(bgmac, BCMA_CLKCTLST,
489 +                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
490 +               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
491 +                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
492 +                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
493                                  1000);
494         }
495  
496 -       if (ci->id == BCMA_CHIP_ID_BCM5357 || ci->id == BCMA_CHIP_ID_BCM4749 ||
497 +       if (ci->id == BCMA_CHIP_ID_BCM5357 ||
498 +           ci->id == BCMA_CHIP_ID_BCM4749 ||
499             ci->id == BCMA_CHIP_ID_BCM53572) {
500                 struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
501                 u8 et_swtype = 0;
502 @@ -936,10 +959,11 @@ static void bgmac_chip_reset(struct bgma
503                         et_swtype &= 0x0f;
504                         et_swtype <<= 4;
505                         sw_type = et_swtype;
506 -               } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
507 +               } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
508                         sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
509 -               } else if ((ci->id != BCMA_CHIP_ID_BCM53572 && ci->pkg == 10) ||
510 -                          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9)) {
511 +               } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
512 +                          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
513 +                          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
514                         sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
515                                   BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
516                 }
517 @@ -976,8 +1000,10 @@ static void bgmac_chip_reset(struct bgma
518                              BGMAC_CMDCFG_PROM |
519                              BGMAC_CMDCFG_NLC |
520                              BGMAC_CMDCFG_CFE |
521 -                            BGMAC_CMDCFG_SR,
522 +                            BGMAC_CMDCFG_SR(core->id.rev),
523                              false);
524 +       bgmac->mac_speed = SPEED_UNKNOWN;
525 +       bgmac->mac_duplex = DUPLEX_UNKNOWN;
526  
527         bgmac_clear_mib(bgmac);
528         if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
529 @@ -988,6 +1014,8 @@ static void bgmac_chip_reset(struct bgma
530         bgmac_miiconfig(bgmac);
531         bgmac_phy_init(bgmac);
532  
533 +       netdev_reset_queue(bgmac->net_dev);
534 +
535         bgmac->int_status = 0;
536  }
537  
538 @@ -1015,7 +1043,7 @@ static void bgmac_enable(struct bgmac *b
539  
540         cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
541         bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
542 -                            BGMAC_CMDCFG_SR, true);
543 +                            BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
544         udelay(2);
545         cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
546         bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
547 @@ -1044,12 +1072,16 @@ static void bgmac_enable(struct bgmac *b
548                 break;
549         }
550  
551 -       rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
552 -       rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
553 -       bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
554 -       mdp = (bp_clk * 128 / 1000) - 3;
555 -       rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
556 -       bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
557 +       if (ci->id != BCMA_CHIP_ID_BCM4707 &&
558 +           ci->id != BCMA_CHIP_ID_BCM53018) {
559 +               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
560 +               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
561 +               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
562 +                               1000000;
563 +               mdp = (bp_clk * 128 / 1000) - 3;
564 +               rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
565 +               bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
566 +       }
567  }
568  
569  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
570 @@ -1075,13 +1107,6 @@ static void bgmac_chip_init(struct bgmac
571  
572         bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN);
573  
574 -       if (!bgmac->autoneg) {
575 -               bgmac_speed(bgmac, bgmac->speed);
576 -               bgmac_phy_force(bgmac);
577 -       } else if (bgmac->speed) { /* if there is anything to adv */
578 -               bgmac_phy_advertise(bgmac);
579 -       }
580 -
581         if (full_init) {
582                 bgmac_dma_init(bgmac);
583                 if (1) /* FIXME: is there any case we don't want IRQs? */
584 @@ -1171,6 +1196,8 @@ static int bgmac_open(struct net_device
585         }
586         napi_enable(&bgmac->napi);
587  
588 +       phy_start(bgmac->phy_dev);
589 +
590         netif_carrier_on(net_dev);
591  
592  err_out:
593 @@ -1183,6 +1210,8 @@ static int bgmac_stop(struct net_device
594  
595         netif_carrier_off(net_dev);
596  
597 +       phy_stop(bgmac->phy_dev);
598 +
599         napi_disable(&bgmac->napi);
600         bgmac_chip_intrs_off(bgmac);
601         free_irq(bgmac->core->irq, net_dev);
602 @@ -1219,27 +1248,11 @@ static int bgmac_set_mac_address(struct
603  static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
604  {
605         struct bgmac *bgmac = netdev_priv(net_dev);
606 -       struct mii_ioctl_data *data = if_mii(ifr);
607  
608 -       switch (cmd) {
609 -       case SIOCGMIIPHY:
610 -               data->phy_id = bgmac->phyaddr;
611 -               /* fallthru */
612 -       case SIOCGMIIREG:
613 -               if (!netif_running(net_dev))
614 -                       return -EAGAIN;
615 -               data->val_out = bgmac_phy_read(bgmac, data->phy_id,
616 -                                              data->reg_num & 0x1f);
617 -               return 0;
618 -       case SIOCSMIIREG:
619 -               if (!netif_running(net_dev))
620 -                       return -EAGAIN;
621 -               bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
622 -                               data->val_in);
623 -               return 0;
624 -       default:
625 -               return -EOPNOTSUPP;
626 -       }
627 +       if (!netif_running(net_dev))
628 +               return -EINVAL;
629 +
630 +       return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
631  }
632  
633  static const struct net_device_ops bgmac_netdev_ops = {
634 @@ -1261,61 +1274,16 @@ static int bgmac_get_settings(struct net
635  {
636         struct bgmac *bgmac = netdev_priv(net_dev);
637  
638 -       cmd->supported = SUPPORTED_10baseT_Half |
639 -                        SUPPORTED_10baseT_Full |
640 -                        SUPPORTED_100baseT_Half |
641 -                        SUPPORTED_100baseT_Full |
642 -                        SUPPORTED_1000baseT_Half |
643 -                        SUPPORTED_1000baseT_Full |
644 -                        SUPPORTED_Autoneg;
645 -
646 -       if (bgmac->autoneg) {
647 -               WARN_ON(cmd->advertising);
648 -               if (bgmac->full_duplex) {
649 -                       if (bgmac->speed & BGMAC_SPEED_10)
650 -                               cmd->advertising |= ADVERTISED_10baseT_Full;
651 -                       if (bgmac->speed & BGMAC_SPEED_100)
652 -                               cmd->advertising |= ADVERTISED_100baseT_Full;
653 -                       if (bgmac->speed & BGMAC_SPEED_1000)
654 -                               cmd->advertising |= ADVERTISED_1000baseT_Full;
655 -               } else {
656 -                       if (bgmac->speed & BGMAC_SPEED_10)
657 -                               cmd->advertising |= ADVERTISED_10baseT_Half;
658 -                       if (bgmac->speed & BGMAC_SPEED_100)
659 -                               cmd->advertising |= ADVERTISED_100baseT_Half;
660 -                       if (bgmac->speed & BGMAC_SPEED_1000)
661 -                               cmd->advertising |= ADVERTISED_1000baseT_Half;
662 -               }
663 -       } else {
664 -               switch (bgmac->speed) {
665 -               case BGMAC_SPEED_10:
666 -                       ethtool_cmd_speed_set(cmd, SPEED_10);
667 -                       break;
668 -               case BGMAC_SPEED_100:
669 -                       ethtool_cmd_speed_set(cmd, SPEED_100);
670 -                       break;
671 -               case BGMAC_SPEED_1000:
672 -                       ethtool_cmd_speed_set(cmd, SPEED_1000);
673 -                       break;
674 -               }
675 -       }
676 -
677 -       cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
678 -
679 -       cmd->autoneg = bgmac->autoneg;
680 -
681 -       return 0;
682 +       return phy_ethtool_gset(bgmac->phy_dev, cmd);
683  }
684  
685 -#if 0
686  static int bgmac_set_settings(struct net_device *net_dev,
687                               struct ethtool_cmd *cmd)
688  {
689         struct bgmac *bgmac = netdev_priv(net_dev);
690  
691 -       return -1;
692 +       return phy_ethtool_sset(bgmac->phy_dev, cmd);
693  }
694 -#endif
695  
696  static void bgmac_get_drvinfo(struct net_device *net_dev,
697                               struct ethtool_drvinfo *info)
698 @@ -1326,6 +1294,7 @@ static void bgmac_get_drvinfo(struct net
699  
700  static const struct ethtool_ops bgmac_ethtool_ops = {
701         .get_settings           = bgmac_get_settings,
702 +       .set_settings           = bgmac_set_settings,
703         .get_drvinfo            = bgmac_get_drvinfo,
704  };
705  
706 @@ -1344,9 +1313,35 @@ static int bgmac_mii_write(struct mii_bu
707         return bgmac_phy_write(bus->priv, mii_id, regnum, value);
708  }
709  
710 +static void bgmac_adjust_link(struct net_device *net_dev)
711 +{
712 +       struct bgmac *bgmac = netdev_priv(net_dev);
713 +       struct phy_device *phy_dev = bgmac->phy_dev;
714 +       bool update = false;
715 +
716 +       if (phy_dev->link) {
717 +               if (phy_dev->speed != bgmac->mac_speed) {
718 +                       bgmac->mac_speed = phy_dev->speed;
719 +                       update = true;
720 +               }
721 +
722 +               if (phy_dev->duplex != bgmac->mac_duplex) {
723 +                       bgmac->mac_duplex = phy_dev->duplex;
724 +                       update = true;
725 +               }
726 +       }
727 +
728 +       if (update) {
729 +               bgmac_mac_speed(bgmac);
730 +               phy_print_status(phy_dev);
731 +       }
732 +}
733 +
734  static int bgmac_mii_register(struct bgmac *bgmac)
735  {
736         struct mii_bus *mii_bus;
737 +       struct phy_device *phy_dev;
738 +       char bus_id[MII_BUS_ID_SIZE + 3];
739         int i, err = 0;
740  
741         mii_bus = mdiobus_alloc();
742 @@ -1378,8 +1373,22 @@ static int bgmac_mii_register(struct bgm
743  
744         bgmac->mii_bus = mii_bus;
745  
746 +       /* Connect to the PHY */
747 +       snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
748 +                bgmac->phyaddr);
749 +       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
750 +                             PHY_INTERFACE_MODE_MII);
751 +       if (IS_ERR(phy_dev)) {
752 +               bgmac_err(bgmac, "PHY connecton failed\n");
753 +               err = PTR_ERR(phy_dev);
754 +               goto err_unregister_bus;
755 +       }
756 +       bgmac->phy_dev = phy_dev;
757 +
758         return err;
759  
760 +err_unregister_bus:
761 +       mdiobus_unregister(mii_bus);
762  err_free_irq:
763         kfree(mii_bus->irq);
764  err_free_bus:
765 @@ -1434,9 +1443,6 @@ static int bgmac_probe(struct bcma_devic
766         bcma_set_drvdata(core, bgmac);
767  
768         /* Defaults */
769 -       bgmac->autoneg = true;
770 -       bgmac->full_duplex = true;
771 -       bgmac->speed = BGMAC_SPEED_10 | BGMAC_SPEED_100 | BGMAC_SPEED_1000;
772         memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
773  
774         /* On BCM4706 we need common core to access PHY */
775 @@ -1467,6 +1473,27 @@ static int bgmac_probe(struct bcma_devic
776  
777         bgmac_chip_reset(bgmac);
778  
779 +       /* For Northstar, we have to take all GMAC core out of reset */
780 +       if (core->id.id == BCMA_CHIP_ID_BCM4707 ||
781 +           core->id.id == BCMA_CHIP_ID_BCM53018) {
782 +               struct bcma_device *ns_core;
783 +               int ns_gmac;
784 +
785 +               /* Northstar has 4 GMAC cores */
786 +               for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
787 +                       /* As Northstar requirement, we have to reset all GMACs
788 +                        * before accessing one. bgmac_chip_reset() call
789 +                        * bcma_core_enable() for this core. Then the other
790 +                        * three GMACs didn't reset.  We do it here.
791 +                        */
792 +                       ns_core = bcma_find_core_unit(core->bus,
793 +                                                     BCMA_CORE_MAC_GBIT,
794 +                                                     ns_gmac);
795 +                       if (ns_core && !bcma_core_is_enabled(ns_core))
796 +                               bcma_core_enable(ns_core, 0);
797 +               }
798 +       }
799 +
800         err = bgmac_dma_alloc(bgmac);
801         if (err) {
802                 bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
803 @@ -1491,14 +1518,12 @@ static int bgmac_probe(struct bcma_devic
804         err = bgmac_mii_register(bgmac);
805         if (err) {
806                 bgmac_err(bgmac, "Cannot register MDIO\n");
807 -               err = -ENOTSUPP;
808                 goto err_dma_free;
809         }
810  
811         err = register_netdev(bgmac->net_dev);
812         if (err) {
813                 bgmac_err(bgmac, "Cannot register net device\n");
814 -               err = -ENOTSUPP;
815                 goto err_mii_unregister;
816         }
817  
818 --- a/drivers/net/ethernet/broadcom/bgmac.h
819 +++ b/drivers/net/ethernet/broadcom/bgmac.h
820 @@ -95,7 +95,11 @@
821  #define  BGMAC_RXQ_CTL_MDP_SHIFT               24
822  #define BGMAC_GPIO_SELECT                      0x194
823  #define BGMAC_GPIO_OUTPUT_EN                   0x198
824 -/* For 0x1e0 see BCMA_CLKCTLST */
825 +
826 +/* For 0x1e0 see BCMA_CLKCTLST. Below are BGMAC specific bits */
827 +#define  BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ      0x00000100
828 +#define  BGMAC_BCMA_CLKCTLST_MISC_PLL_ST       0x01000000
829 +
830  #define BGMAC_HW_WAR                           0x1e4
831  #define BGMAC_PWR_CTL                          0x1e8
832  #define BGMAC_DMA_BASE0                                0x200           /* Tx and Rx controller */
833 @@ -185,6 +189,7 @@
834  #define   BGMAC_CMDCFG_ES_10                   0x00000000
835  #define   BGMAC_CMDCFG_ES_100                  0x00000004
836  #define   BGMAC_CMDCFG_ES_1000                 0x00000008
837 +#define   BGMAC_CMDCFG_ES_2500                 0x0000000C
838  #define  BGMAC_CMDCFG_PROM                     0x00000010      /* Set to activate promiscuous mode */
839  #define  BGMAC_CMDCFG_PAD_EN                   0x00000020
840  #define  BGMAC_CMDCFG_CF                       0x00000040
841 @@ -193,7 +198,9 @@
842  #define  BGMAC_CMDCFG_TAI                      0x00000200
843  #define  BGMAC_CMDCFG_HD                       0x00000400      /* Set if in half duplex mode */
844  #define  BGMAC_CMDCFG_HD_SHIFT                 10
845 -#define  BGMAC_CMDCFG_SR                       0x00000800      /* Set to reset mode */
846 +#define  BGMAC_CMDCFG_SR_REV0                  0x00000800      /* Set to reset mode, for other revs */
847 +#define  BGMAC_CMDCFG_SR_REV4                  0x00002000      /* Set to reset mode, only for core rev 4 */
848 +#define  BGMAC_CMDCFG_SR(rev)  ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
849  #define  BGMAC_CMDCFG_ML                       0x00008000      /* Set to activate mac loopback mode */
850  #define  BGMAC_CMDCFG_AE                       0x00400000
851  #define  BGMAC_CMDCFG_CFE                      0x00800000
852 @@ -216,27 +223,6 @@
853  #define BGMAC_RX_STATUS                                0xb38
854  #define BGMAC_TX_STATUS                                0xb3c
855  
856 -#define BGMAC_PHY_CTL                          0x00
857 -#define  BGMAC_PHY_CTL_SPEED_MSB               0x0040
858 -#define  BGMAC_PHY_CTL_DUPLEX                  0x0100          /* duplex mode */
859 -#define  BGMAC_PHY_CTL_RESTART                 0x0200          /* restart autonegotiation */
860 -#define  BGMAC_PHY_CTL_ANENAB                  0x1000          /* enable autonegotiation */
861 -#define  BGMAC_PHY_CTL_SPEED                   0x2000
862 -#define  BGMAC_PHY_CTL_LOOP                    0x4000          /* loopback */
863 -#define  BGMAC_PHY_CTL_RESET                   0x8000          /* reset */
864 -/* Helpers */
865 -#define  BGMAC_PHY_CTL_SPEED_10                        0
866 -#define  BGMAC_PHY_CTL_SPEED_100               BGMAC_PHY_CTL_SPEED
867 -#define  BGMAC_PHY_CTL_SPEED_1000              BGMAC_PHY_CTL_SPEED_MSB
868 -#define BGMAC_PHY_ADV                          0x04
869 -#define  BGMAC_PHY_ADV_10HALF                  0x0020          /* advertise 10MBits/s half duplex */
870 -#define  BGMAC_PHY_ADV_10FULL                  0x0040          /* advertise 10MBits/s full duplex */
871 -#define  BGMAC_PHY_ADV_100HALF                 0x0080          /* advertise 100MBits/s half duplex */
872 -#define  BGMAC_PHY_ADV_100FULL                 0x0100          /* advertise 100MBits/s full duplex */
873 -#define BGMAC_PHY_ADV2                         0x09
874 -#define  BGMAC_PHY_ADV2_1000HALF               0x0100          /* advertise 1000MBits/s half duplex */
875 -#define  BGMAC_PHY_ADV2_1000FULL               0x0200          /* advertise 1000MBits/s full duplex */
876 -
877  /* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
878  #define BGMAC_BCMA_IOCTL_SW_CLKEN              0x00000004      /* PHY Clock Enable */
879  #define BGMAC_BCMA_IOCTL_SW_RESET              0x00000008      /* PHY Reset */
880 @@ -254,9 +240,34 @@
881  #define  BGMAC_DMA_TX_SUSPEND                  0x00000002
882  #define  BGMAC_DMA_TX_LOOPBACK                 0x00000004
883  #define  BGMAC_DMA_TX_FLUSH                    0x00000010
884 +#define  BGMAC_DMA_TX_MR_MASK                  0x000000C0      /* Multiple outstanding reads */
885 +#define  BGMAC_DMA_TX_MR_SHIFT                 6
886 +#define   BGMAC_DMA_TX_MR_1                    0
887 +#define   BGMAC_DMA_TX_MR_2                    1
888  #define  BGMAC_DMA_TX_PARITY_DISABLE           0x00000800
889  #define  BGMAC_DMA_TX_ADDREXT_MASK             0x00030000
890  #define  BGMAC_DMA_TX_ADDREXT_SHIFT            16
891 +#define  BGMAC_DMA_TX_BL_MASK                  0x001C0000      /* BurstLen bits */
892 +#define  BGMAC_DMA_TX_BL_SHIFT                 18
893 +#define   BGMAC_DMA_TX_BL_16                   0
894 +#define   BGMAC_DMA_TX_BL_32                   1
895 +#define   BGMAC_DMA_TX_BL_64                   2
896 +#define   BGMAC_DMA_TX_BL_128                  3
897 +#define   BGMAC_DMA_TX_BL_256                  4
898 +#define   BGMAC_DMA_TX_BL_512                  5
899 +#define   BGMAC_DMA_TX_BL_1024                 6
900 +#define  BGMAC_DMA_TX_PC_MASK                  0x00E00000      /* Prefetch control */
901 +#define  BGMAC_DMA_TX_PC_SHIFT                 21
902 +#define   BGMAC_DMA_TX_PC_0                    0
903 +#define   BGMAC_DMA_TX_PC_4                    1
904 +#define   BGMAC_DMA_TX_PC_8                    2
905 +#define   BGMAC_DMA_TX_PC_16                   3
906 +#define  BGMAC_DMA_TX_PT_MASK                  0x03000000      /* Prefetch threshold */
907 +#define  BGMAC_DMA_TX_PT_SHIFT                 24
908 +#define   BGMAC_DMA_TX_PT_1                    0
909 +#define   BGMAC_DMA_TX_PT_2                    1
910 +#define   BGMAC_DMA_TX_PT_4                    2
911 +#define   BGMAC_DMA_TX_PT_8                    3
912  #define BGMAC_DMA_TX_INDEX                     0x04
913  #define BGMAC_DMA_TX_RINGLO                    0x08
914  #define BGMAC_DMA_TX_RINGHI                    0x0C
915 @@ -284,8 +295,33 @@
916  #define  BGMAC_DMA_RX_DIRECT_FIFO              0x00000100
917  #define  BGMAC_DMA_RX_OVERFLOW_CONT            0x00000400
918  #define  BGMAC_DMA_RX_PARITY_DISABLE           0x00000800
919 +#define  BGMAC_DMA_RX_MR_MASK                  0x000000C0      /* Multiple outstanding reads */
920 +#define  BGMAC_DMA_RX_MR_SHIFT                 6
921 +#define   BGMAC_DMA_TX_MR_1                    0
922 +#define   BGMAC_DMA_TX_MR_2                    1
923  #define  BGMAC_DMA_RX_ADDREXT_MASK             0x00030000
924  #define  BGMAC_DMA_RX_ADDREXT_SHIFT            16
925 +#define  BGMAC_DMA_RX_BL_MASK                  0x001C0000      /* BurstLen bits */
926 +#define  BGMAC_DMA_RX_BL_SHIFT                 18
927 +#define   BGMAC_DMA_RX_BL_16                   0
928 +#define   BGMAC_DMA_RX_BL_32                   1
929 +#define   BGMAC_DMA_RX_BL_64                   2
930 +#define   BGMAC_DMA_RX_BL_128                  3
931 +#define   BGMAC_DMA_RX_BL_256                  4
932 +#define   BGMAC_DMA_RX_BL_512                  5
933 +#define   BGMAC_DMA_RX_BL_1024                 6
934 +#define  BGMAC_DMA_RX_PC_MASK                  0x00E00000      /* Prefetch control */
935 +#define  BGMAC_DMA_RX_PC_SHIFT                 21
936 +#define   BGMAC_DMA_RX_PC_0                    0
937 +#define   BGMAC_DMA_RX_PC_4                    1
938 +#define   BGMAC_DMA_RX_PC_8                    2
939 +#define   BGMAC_DMA_RX_PC_16                   3
940 +#define  BGMAC_DMA_RX_PT_MASK                  0x03000000      /* Prefetch threshold */
941 +#define  BGMAC_DMA_RX_PT_SHIFT                 24
942 +#define   BGMAC_DMA_RX_PT_1                    0
943 +#define   BGMAC_DMA_RX_PT_2                    1
944 +#define   BGMAC_DMA_RX_PT_4                    2
945 +#define   BGMAC_DMA_RX_PT_8                    3
946  #define BGMAC_DMA_RX_INDEX                     0x24
947  #define BGMAC_DMA_RX_RINGLO                    0x28
948  #define BGMAC_DMA_RX_RINGHI                    0x2C
949 @@ -342,10 +378,6 @@
950  #define BGMAC_CHIPCTL_1_SW_TYPE_RGMII          0x000000C0
951  #define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS         0x00010000
952  
953 -#define BGMAC_SPEED_10                         0x0001
954 -#define BGMAC_SPEED_100                                0x0002
955 -#define BGMAC_SPEED_1000                       0x0004
956 -
957  #define BGMAC_WEIGHT   64
958  
959  #define ETHER_MAX_LEN   1518
960 @@ -402,6 +434,7 @@ struct bgmac {
961         struct net_device *net_dev;
962         struct napi_struct napi;
963         struct mii_bus *mii_bus;
964 +       struct phy_device *phy_dev;
965  
966         /* DMA */
967         struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
968 @@ -416,10 +449,9 @@ struct bgmac {
969         u32 int_mask;
970         u32 int_status;
971  
972 -       /* Speed-related */
973 -       int speed;
974 -       bool autoneg;
975 -       bool full_duplex;
976 +       /* Current MAC state */
977 +       int mac_speed;
978 +       int mac_duplex;
979  
980         u8 phyaddr;
981         bool has_robosw;