1 --- a/drivers/net/ethernet/broadcom/Kconfig
2 +++ b/drivers/net/ethernet/broadcom/Kconfig
3 @@ -132,7 +132,8 @@ config BNX2X_SRIOV
6 tristate "BCMA bus GBit core support"
7 - depends on BCMA_HOST_SOC && HAS_DMA
8 + depends on BCMA_HOST_SOC && HAS_DMA && BCM47XX
11 This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
12 They can be found on BCM47xx SoCs and provide gigabit ethernet.
13 --- a/drivers/net/ethernet/broadcom/bgmac.c
14 +++ b/drivers/net/ethernet/broadcom/bgmac.c
15 @@ -96,6 +96,19 @@ static void bgmac_dma_tx_enable(struct b
18 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
19 + if (bgmac->core->id.rev >= 4) {
20 + ctl &= ~BGMAC_DMA_TX_BL_MASK;
21 + ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
23 + ctl &= ~BGMAC_DMA_TX_MR_MASK;
24 + ctl |= BGMAC_DMA_TX_MR_2 << BGMAC_DMA_TX_MR_SHIFT;
26 + ctl &= ~BGMAC_DMA_TX_PC_MASK;
27 + ctl |= BGMAC_DMA_TX_PC_16 << BGMAC_DMA_TX_PC_SHIFT;
29 + ctl &= ~BGMAC_DMA_TX_PT_MASK;
30 + ctl |= BGMAC_DMA_TX_PT_8 << BGMAC_DMA_TX_PT_SHIFT;
32 ctl |= BGMAC_DMA_TX_ENABLE;
33 ctl |= BGMAC_DMA_TX_PARITY_DISABLE;
34 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl);
35 @@ -149,6 +162,8 @@ static netdev_tx_t bgmac_dma_tx_add(stru
36 dma_desc->ctl0 = cpu_to_le32(ctl0);
37 dma_desc->ctl1 = cpu_to_le32(ctl1);
39 + netdev_sent_queue(net_dev, skb->len);
43 /* Increase ring->end to point empty slot. We tell hardware the first
44 @@ -157,6 +172,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
45 if (++ring->end >= BGMAC_TX_RING_SLOTS)
47 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
49 ring->end * sizeof(struct bgmac_dma_desc));
51 /* Always keep one slot free to allow detecting bugged calls. */
52 @@ -177,10 +193,13 @@ static void bgmac_dma_tx_free(struct bgm
53 struct device *dma_dev = bgmac->core->dma_dev;
56 + unsigned bytes_compl = 0, pkts_compl = 0;
58 /* The last slot that hardware didn't consume yet */
59 empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
60 empty_slot &= BGMAC_DMA_TX_STATDPTR;
61 + empty_slot -= ring->index_base;
62 + empty_slot &= BGMAC_DMA_TX_STATDPTR;
63 empty_slot /= sizeof(struct bgmac_dma_desc);
65 while (ring->start != empty_slot) {
66 @@ -192,6 +211,9 @@ static void bgmac_dma_tx_free(struct bgm
67 slot->skb->len, DMA_TO_DEVICE);
70 + bytes_compl += slot->skb->len;
74 dev_kfree_skb(slot->skb);
76 @@ -205,6 +227,8 @@ static void bgmac_dma_tx_free(struct bgm
80 + netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
82 if (freed && netif_queue_stopped(bgmac->net_dev))
83 netif_wake_queue(bgmac->net_dev);
85 @@ -229,6 +253,16 @@ static void bgmac_dma_rx_enable(struct b
88 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
89 + if (bgmac->core->id.rev >= 4) {
90 + ctl &= ~BGMAC_DMA_RX_BL_MASK;
91 + ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
93 + ctl &= ~BGMAC_DMA_RX_PC_MASK;
94 + ctl |= BGMAC_DMA_RX_PC_8 << BGMAC_DMA_RX_PC_SHIFT;
96 + ctl &= ~BGMAC_DMA_RX_PT_MASK;
97 + ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT;
99 ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
100 ctl |= BGMAC_DMA_RX_ENABLE;
101 ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
102 @@ -241,31 +275,59 @@ static int bgmac_dma_rx_skb_for_slot(str
103 struct bgmac_slot_info *slot)
105 struct device *dma_dev = bgmac->core->dma_dev;
106 + struct sk_buff *skb;
107 + dma_addr_t dma_addr;
108 struct bgmac_rx_header *rx;
111 - slot->skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
113 + skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
117 /* Poison - if everything goes fine, hardware will overwrite it */
118 - rx = (struct bgmac_rx_header *)slot->skb->data;
119 + rx = (struct bgmac_rx_header *)skb->data;
120 rx->len = cpu_to_le16(0xdead);
121 rx->flags = cpu_to_le16(0xbeef);
123 /* Map skb for the DMA */
124 - slot->dma_addr = dma_map_single(dma_dev, slot->skb->data,
125 - BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
126 - if (dma_mapping_error(dma_dev, slot->dma_addr)) {
127 + dma_addr = dma_map_single(dma_dev, skb->data,
128 + BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
129 + if (dma_mapping_error(dma_dev, dma_addr)) {
130 bgmac_err(bgmac, "DMA mapping error\n");
131 + dev_kfree_skb(skb);
135 + /* Update the slot */
137 + slot->dma_addr = dma_addr;
139 if (slot->dma_addr & 0xC0000000)
140 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
145 +static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
146 + struct bgmac_dma_ring *ring, int desc_idx)
148 + struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
149 + u32 ctl0 = 0, ctl1 = 0;
151 + if (desc_idx == ring->num_slots - 1)
152 + ctl0 |= BGMAC_DESC_CTL0_EOT;
153 + ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
154 + /* Is there any BGMAC device that requires extension? */
155 + /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
156 + * B43_DMA64_DCTL1_ADDREXT_MASK;
159 + dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[desc_idx].dma_addr));
160 + dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[desc_idx].dma_addr));
161 + dma_desc->ctl0 = cpu_to_le32(ctl0);
162 + dma_desc->ctl1 = cpu_to_le32(ctl1);
165 static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
168 @@ -274,6 +336,8 @@ static int bgmac_dma_rx_read(struct bgma
170 end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS);
171 end_slot &= BGMAC_DMA_RX_STATDPTR;
172 + end_slot -= ring->index_base;
173 + end_slot &= BGMAC_DMA_RX_STATDPTR;
174 end_slot /= sizeof(struct bgmac_dma_desc);
176 ring->end = end_slot;
177 @@ -282,7 +346,6 @@ static int bgmac_dma_rx_read(struct bgma
178 struct device *dma_dev = bgmac->core->dma_dev;
179 struct bgmac_slot_info *slot = &ring->slots[ring->start];
180 struct sk_buff *skb = slot->skb;
181 - struct sk_buff *new_skb;
182 struct bgmac_rx_header *rx;
185 @@ -295,38 +358,51 @@ static int bgmac_dma_rx_read(struct bgma
186 len = le16_to_cpu(rx->len);
187 flags = le16_to_cpu(rx->flags);
189 - /* Check for poison and drop or pass the packet */
190 - if (len == 0xdead && flags == 0xbeef) {
191 - bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
195 + dma_addr_t old_dma_addr = slot->dma_addr;
198 + /* Check for poison and drop or pass the packet */
199 + if (len == 0xdead && flags == 0xbeef) {
200 + bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
202 + dma_sync_single_for_device(dma_dev,
212 - new_skb = netdev_alloc_skb_ip_align(bgmac->net_dev, len);
214 - skb_put(new_skb, len);
215 - skb_copy_from_linear_data_offset(skb, BGMAC_RX_FRAME_OFFSET,
218 - skb_checksum_none_assert(skb);
219 - new_skb->protocol =
220 - eth_type_trans(new_skb, bgmac->net_dev);
221 - netif_receive_skb(new_skb);
224 - bgmac->net_dev->stats.rx_dropped++;
225 - bgmac_err(bgmac, "Allocation of skb for copying packet failed!\n");
226 + /* Prepare new skb as replacement */
227 + err = bgmac_dma_rx_skb_for_slot(bgmac, slot);
229 + /* Poison the old skb */
230 + rx->len = cpu_to_le16(0xdead);
231 + rx->flags = cpu_to_le16(0xbeef);
233 + dma_sync_single_for_device(dma_dev,
239 + bgmac_dma_rx_setup_desc(bgmac, ring, ring->start);
241 - /* Poison the old skb */
242 - rx->len = cpu_to_le16(0xdead);
243 - rx->flags = cpu_to_le16(0xbeef);
246 - /* Make it back accessible to the hardware */
247 - dma_sync_single_for_device(dma_dev, slot->dma_addr,
248 - BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
249 + /* Unmap old skb, we'll pass it to the netfif */
250 + dma_unmap_single(dma_dev, old_dma_addr,
251 + BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
253 + skb_put(skb, BGMAC_RX_FRAME_OFFSET + len);
254 + skb_pull(skb, BGMAC_RX_FRAME_OFFSET);
256 + skb_checksum_none_assert(skb);
257 + skb->protocol = eth_type_trans(skb, bgmac->net_dev);
258 + netif_receive_skb(skb);
262 if (++ring->start >= BGMAC_RX_RING_SLOTS)
264 @@ -418,9 +494,6 @@ static int bgmac_dma_alloc(struct bgmac
265 ring = &bgmac->tx_ring[i];
266 ring->num_slots = BGMAC_TX_RING_SLOTS;
267 ring->mmio_base = ring_base[i];
268 - if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX))
269 - bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
272 /* Alloc ring of descriptors */
273 size = ring->num_slots * sizeof(struct bgmac_dma_desc);
274 @@ -435,6 +508,13 @@ static int bgmac_dma_alloc(struct bgmac
275 if (ring->dma_base & 0xC0000000)
276 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
278 + ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
279 + BGMAC_DMA_RING_TX);
280 + if (ring->unaligned)
281 + ring->index_base = lower_32_bits(ring->dma_base);
283 + ring->index_base = 0;
285 /* No need to alloc TX slots yet */
288 @@ -444,9 +524,6 @@ static int bgmac_dma_alloc(struct bgmac
289 ring = &bgmac->rx_ring[i];
290 ring->num_slots = BGMAC_RX_RING_SLOTS;
291 ring->mmio_base = ring_base[i];
292 - if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX))
293 - bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
296 /* Alloc ring of descriptors */
297 size = ring->num_slots * sizeof(struct bgmac_dma_desc);
298 @@ -462,6 +539,13 @@ static int bgmac_dma_alloc(struct bgmac
299 if (ring->dma_base & 0xC0000000)
300 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
302 + ring->unaligned = bgmac_dma_unaligned(bgmac, ring,
303 + BGMAC_DMA_RING_RX);
304 + if (ring->unaligned)
305 + ring->index_base = lower_32_bits(ring->dma_base);
307 + ring->index_base = 0;
310 for (j = 0; j < ring->num_slots; j++) {
311 err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
312 @@ -482,19 +566,19 @@ err_dma_free:
313 static void bgmac_dma_init(struct bgmac *bgmac)
315 struct bgmac_dma_ring *ring;
316 - struct bgmac_dma_desc *dma_desc;
320 for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
321 ring = &bgmac->tx_ring[i];
323 - /* We don't implement unaligned addressing, so enable first */
324 - bgmac_dma_tx_enable(bgmac, ring);
325 + if (!ring->unaligned)
326 + bgmac_dma_tx_enable(bgmac, ring);
327 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
328 lower_32_bits(ring->dma_base));
329 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI,
330 upper_32_bits(ring->dma_base));
331 + if (ring->unaligned)
332 + bgmac_dma_tx_enable(bgmac, ring);
335 ring->end = 0; /* Points the slot that should *not* be read */
336 @@ -505,32 +589,20 @@ static void bgmac_dma_init(struct bgmac
338 ring = &bgmac->rx_ring[i];
340 - /* We don't implement unaligned addressing, so enable first */
341 - bgmac_dma_rx_enable(bgmac, ring);
342 + if (!ring->unaligned)
343 + bgmac_dma_rx_enable(bgmac, ring);
344 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
345 lower_32_bits(ring->dma_base));
346 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
347 upper_32_bits(ring->dma_base));
348 + if (ring->unaligned)
349 + bgmac_dma_rx_enable(bgmac, ring);
351 - for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots;
355 - if (j == ring->num_slots - 1)
356 - ctl0 |= BGMAC_DESC_CTL0_EOT;
357 - ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
358 - /* Is there any BGMAC device that requires extension? */
359 - /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
360 - * B43_DMA64_DCTL1_ADDREXT_MASK;
363 - dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[j].dma_addr));
364 - dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[j].dma_addr));
365 - dma_desc->ctl0 = cpu_to_le32(ctl0);
366 - dma_desc->ctl1 = cpu_to_le32(ctl1);
368 + for (j = 0; j < ring->num_slots; j++)
369 + bgmac_dma_rx_setup_desc(bgmac, ring, j);
371 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
373 ring->num_slots * sizeof(struct bgmac_dma_desc));
376 @@ -633,70 +705,6 @@ static int bgmac_phy_write(struct bgmac
380 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyforce */
381 -static void bgmac_phy_force(struct bgmac *bgmac)
384 - u16 mask = ~(BGMAC_PHY_CTL_SPEED | BGMAC_PHY_CTL_SPEED_MSB |
385 - BGMAC_PHY_CTL_ANENAB | BGMAC_PHY_CTL_DUPLEX);
387 - if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
390 - if (bgmac->autoneg)
393 - ctl = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL);
395 - if (bgmac->full_duplex)
396 - ctl |= BGMAC_PHY_CTL_DUPLEX;
397 - if (bgmac->speed == BGMAC_SPEED_100)
398 - ctl |= BGMAC_PHY_CTL_SPEED_100;
399 - else if (bgmac->speed == BGMAC_SPEED_1000)
400 - ctl |= BGMAC_PHY_CTL_SPEED_1000;
401 - bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL, ctl);
404 -/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyadvertise */
405 -static void bgmac_phy_advertise(struct bgmac *bgmac)
409 - if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
412 - if (!bgmac->autoneg)
415 - /* Adv selected 10/100 speeds */
416 - adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV);
417 - adv &= ~(BGMAC_PHY_ADV_10HALF | BGMAC_PHY_ADV_10FULL |
418 - BGMAC_PHY_ADV_100HALF | BGMAC_PHY_ADV_100FULL);
419 - if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
420 - adv |= BGMAC_PHY_ADV_10HALF;
421 - if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
422 - adv |= BGMAC_PHY_ADV_100HALF;
423 - if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
424 - adv |= BGMAC_PHY_ADV_10FULL;
425 - if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
426 - adv |= BGMAC_PHY_ADV_100FULL;
427 - bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV, adv);
429 - /* Adv selected 1000 speeds */
430 - adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2);
431 - adv &= ~(BGMAC_PHY_ADV2_1000HALF | BGMAC_PHY_ADV2_1000FULL);
432 - if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
433 - adv |= BGMAC_PHY_ADV2_1000HALF;
434 - if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
435 - adv |= BGMAC_PHY_ADV2_1000FULL;
436 - bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2, adv);
439 - bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
440 - bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) |
441 - BGMAC_PHY_CTL_RESTART);
444 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
445 static void bgmac_phy_init(struct bgmac *bgmac)
447 @@ -740,11 +748,9 @@ static void bgmac_phy_reset(struct bgmac
448 if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
451 - bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
452 - BGMAC_PHY_CTL_RESET);
453 + bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
455 - if (bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) &
456 - BGMAC_PHY_CTL_RESET)
457 + if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
458 bgmac_err(bgmac, "PHY reset failed\n");
459 bgmac_phy_init(bgmac);
461 @@ -762,13 +768,13 @@ static void bgmac_cmdcfg_maskset(struct
462 u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
463 u32 new_val = (cmdcfg & mask) | set;
465 - bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR);
466 + bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
469 if (new_val != cmdcfg || force)
470 bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
472 - bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR);
473 + bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
477 @@ -827,31 +833,56 @@ static void bgmac_clear_mib(struct bgmac
480 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_speed */
481 -static void bgmac_speed(struct bgmac *bgmac, int speed)
482 +static void bgmac_mac_speed(struct bgmac *bgmac)
484 u32 mask = ~(BGMAC_CMDCFG_ES_MASK | BGMAC_CMDCFG_HD);
487 - if (speed & BGMAC_SPEED_10)
488 + switch (bgmac->mac_speed) {
490 set |= BGMAC_CMDCFG_ES_10;
491 - if (speed & BGMAC_SPEED_100)
494 set |= BGMAC_CMDCFG_ES_100;
495 - if (speed & BGMAC_SPEED_1000)
498 set |= BGMAC_CMDCFG_ES_1000;
499 - if (!bgmac->full_duplex)
502 + set |= BGMAC_CMDCFG_ES_2500;
505 + bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
508 + if (bgmac->mac_duplex == DUPLEX_HALF)
509 set |= BGMAC_CMDCFG_HD;
511 bgmac_cmdcfg_maskset(bgmac, mask, set, true);
514 static void bgmac_miiconfig(struct bgmac *bgmac)
516 - u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
518 - if (imode == 0 || imode == 1) {
519 - if (bgmac->autoneg)
520 - bgmac_speed(bgmac, BGMAC_SPEED_100);
522 - bgmac_speed(bgmac, bgmac->speed);
523 + struct bcma_device *core = bgmac->core;
524 + struct bcma_chipinfo *ci = &core->bus->chipinfo;
527 + if (ci->id == BCMA_CHIP_ID_BCM4707 ||
528 + ci->id == BCMA_CHIP_ID_BCM53018) {
529 + bcma_awrite32(core, BCMA_IOCTL,
530 + bcma_aread32(core, BCMA_IOCTL) | 0x40 |
531 + BGMAC_BCMA_IOCTL_SW_CLKEN);
532 + bgmac->mac_speed = SPEED_2500;
533 + bgmac->mac_duplex = DUPLEX_FULL;
534 + bgmac_mac_speed(bgmac);
536 + imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
537 + BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
538 + if (imode == 0 || imode == 1) {
539 + bgmac->mac_speed = SPEED_100;
540 + bgmac->mac_duplex = DUPLEX_FULL;
541 + bgmac_mac_speed(bgmac);
546 @@ -861,7 +892,7 @@ static void bgmac_chip_reset(struct bgma
547 struct bcma_device *core = bgmac->core;
548 struct bcma_bus *bus = core->bus;
549 struct bcma_chipinfo *ci = &bus->chipinfo;
555 @@ -884,44 +915,55 @@ static void bgmac_chip_reset(struct bgma
558 iost = bcma_aread32(core, BCMA_IOST);
559 - if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 10) ||
560 + if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
561 (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
562 - (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9))
563 + (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
564 iost &= ~BGMAC_BCMA_IOST_ATTACHED;
566 - if (iost & BGMAC_BCMA_IOST_ATTACHED) {
567 - flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
568 - if (!bgmac->has_robosw)
569 - flags |= BGMAC_BCMA_IOCTL_SW_RESET;
570 + /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
571 + if (ci->id != BCMA_CHIP_ID_BCM4707) {
573 + if (iost & BGMAC_BCMA_IOST_ATTACHED) {
574 + flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
575 + if (!bgmac->has_robosw)
576 + flags |= BGMAC_BCMA_IOCTL_SW_RESET;
578 + bcma_core_enable(core, flags);
581 - bcma_core_enable(core, flags);
583 - if (core->id.rev > 2) {
584 - bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
585 - bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
586 + /* Request Misc PLL for corerev > 2 */
587 + if (core->id.rev > 2 &&
588 + ci->id != BCMA_CHIP_ID_BCM4707 &&
589 + ci->id != BCMA_CHIP_ID_BCM53018) {
590 + bgmac_set(bgmac, BCMA_CLKCTLST,
591 + BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
592 + bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
593 + BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
594 + BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
598 - if (ci->id == BCMA_CHIP_ID_BCM5357 || ci->id == BCMA_CHIP_ID_BCM4749 ||
599 + if (ci->id == BCMA_CHIP_ID_BCM5357 ||
600 + ci->id == BCMA_CHIP_ID_BCM4749 ||
601 ci->id == BCMA_CHIP_ID_BCM53572) {
602 struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
604 u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
605 BGMAC_CHIPCTL_1_IF_TYPE_MII;
609 - if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) {
610 + if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
611 if (kstrtou8(buf, 0, &et_swtype))
612 bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
617 - } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
618 + } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
619 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
620 - } else if ((ci->id != BCMA_CHIP_ID_BCM53572 && ci->pkg == 10) ||
621 - (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9)) {
622 + } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
623 + (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
624 + (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
625 sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
626 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
628 @@ -958,8 +1000,10 @@ static void bgmac_chip_reset(struct bgma
633 + BGMAC_CMDCFG_SR(core->id.rev),
635 + bgmac->mac_speed = SPEED_UNKNOWN;
636 + bgmac->mac_duplex = DUPLEX_UNKNOWN;
638 bgmac_clear_mib(bgmac);
639 if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
640 @@ -970,6 +1014,8 @@ static void bgmac_chip_reset(struct bgma
641 bgmac_miiconfig(bgmac);
642 bgmac_phy_init(bgmac);
644 + netdev_reset_queue(bgmac->net_dev);
646 bgmac->int_status = 0;
649 @@ -997,7 +1043,7 @@ static void bgmac_enable(struct bgmac *b
651 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
652 bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
653 - BGMAC_CMDCFG_SR, true);
654 + BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
656 cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
657 bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
658 @@ -1026,12 +1072,16 @@ static void bgmac_enable(struct bgmac *b
662 - rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
663 - rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
664 - bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
665 - mdp = (bp_clk * 128 / 1000) - 3;
666 - rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
667 - bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
668 + if (ci->id != BCMA_CHIP_ID_BCM4707 &&
669 + ci->id != BCMA_CHIP_ID_BCM53018) {
670 + rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
671 + rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
672 + bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
674 + mdp = (bp_clk * 128 / 1000) - 3;
675 + rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
676 + bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
680 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
681 @@ -1057,13 +1107,6 @@ static void bgmac_chip_init(struct bgmac
683 bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN);
685 - if (!bgmac->autoneg) {
686 - bgmac_speed(bgmac, bgmac->speed);
687 - bgmac_phy_force(bgmac);
688 - } else if (bgmac->speed) { /* if there is anything to adv */
689 - bgmac_phy_advertise(bgmac);
693 bgmac_dma_init(bgmac);
694 if (1) /* FIXME: is there any case we don't want IRQs? */
695 @@ -1153,6 +1196,8 @@ static int bgmac_open(struct net_device
697 napi_enable(&bgmac->napi);
699 + phy_start(bgmac->phy_dev);
701 netif_carrier_on(net_dev);
704 @@ -1165,6 +1210,8 @@ static int bgmac_stop(struct net_device
706 netif_carrier_off(net_dev);
708 + phy_stop(bgmac->phy_dev);
710 napi_disable(&bgmac->napi);
711 bgmac_chip_intrs_off(bgmac);
712 free_irq(bgmac->core->irq, net_dev);
713 @@ -1201,27 +1248,11 @@ static int bgmac_set_mac_address(struct
714 static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
716 struct bgmac *bgmac = netdev_priv(net_dev);
717 - struct mii_ioctl_data *data = if_mii(ifr);
721 - data->phy_id = bgmac->phyaddr;
724 - if (!netif_running(net_dev))
726 - data->val_out = bgmac_phy_read(bgmac, data->phy_id,
727 - data->reg_num & 0x1f);
730 - if (!netif_running(net_dev))
732 - bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
736 - return -EOPNOTSUPP;
738 + if (!netif_running(net_dev))
741 + return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
744 static const struct net_device_ops bgmac_netdev_ops = {
745 @@ -1243,61 +1274,16 @@ static int bgmac_get_settings(struct net
747 struct bgmac *bgmac = netdev_priv(net_dev);
749 - cmd->supported = SUPPORTED_10baseT_Half |
750 - SUPPORTED_10baseT_Full |
751 - SUPPORTED_100baseT_Half |
752 - SUPPORTED_100baseT_Full |
753 - SUPPORTED_1000baseT_Half |
754 - SUPPORTED_1000baseT_Full |
757 - if (bgmac->autoneg) {
758 - WARN_ON(cmd->advertising);
759 - if (bgmac->full_duplex) {
760 - if (bgmac->speed & BGMAC_SPEED_10)
761 - cmd->advertising |= ADVERTISED_10baseT_Full;
762 - if (bgmac->speed & BGMAC_SPEED_100)
763 - cmd->advertising |= ADVERTISED_100baseT_Full;
764 - if (bgmac->speed & BGMAC_SPEED_1000)
765 - cmd->advertising |= ADVERTISED_1000baseT_Full;
767 - if (bgmac->speed & BGMAC_SPEED_10)
768 - cmd->advertising |= ADVERTISED_10baseT_Half;
769 - if (bgmac->speed & BGMAC_SPEED_100)
770 - cmd->advertising |= ADVERTISED_100baseT_Half;
771 - if (bgmac->speed & BGMAC_SPEED_1000)
772 - cmd->advertising |= ADVERTISED_1000baseT_Half;
775 - switch (bgmac->speed) {
776 - case BGMAC_SPEED_10:
777 - ethtool_cmd_speed_set(cmd, SPEED_10);
779 - case BGMAC_SPEED_100:
780 - ethtool_cmd_speed_set(cmd, SPEED_100);
782 - case BGMAC_SPEED_1000:
783 - ethtool_cmd_speed_set(cmd, SPEED_1000);
788 - cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
790 - cmd->autoneg = bgmac->autoneg;
793 + return phy_ethtool_gset(bgmac->phy_dev, cmd);
797 static int bgmac_set_settings(struct net_device *net_dev,
798 struct ethtool_cmd *cmd)
800 struct bgmac *bgmac = netdev_priv(net_dev);
803 + return phy_ethtool_sset(bgmac->phy_dev, cmd);
807 static void bgmac_get_drvinfo(struct net_device *net_dev,
808 struct ethtool_drvinfo *info)
809 @@ -1308,6 +1294,7 @@ static void bgmac_get_drvinfo(struct net
811 static const struct ethtool_ops bgmac_ethtool_ops = {
812 .get_settings = bgmac_get_settings,
813 + .set_settings = bgmac_set_settings,
814 .get_drvinfo = bgmac_get_drvinfo,
817 @@ -1326,9 +1313,35 @@ static int bgmac_mii_write(struct mii_bu
818 return bgmac_phy_write(bus->priv, mii_id, regnum, value);
821 +static void bgmac_adjust_link(struct net_device *net_dev)
823 + struct bgmac *bgmac = netdev_priv(net_dev);
824 + struct phy_device *phy_dev = bgmac->phy_dev;
825 + bool update = false;
827 + if (phy_dev->link) {
828 + if (phy_dev->speed != bgmac->mac_speed) {
829 + bgmac->mac_speed = phy_dev->speed;
833 + if (phy_dev->duplex != bgmac->mac_duplex) {
834 + bgmac->mac_duplex = phy_dev->duplex;
840 + bgmac_mac_speed(bgmac);
841 + phy_print_status(phy_dev);
845 static int bgmac_mii_register(struct bgmac *bgmac)
847 struct mii_bus *mii_bus;
848 + struct phy_device *phy_dev;
849 + char bus_id[MII_BUS_ID_SIZE + 3];
852 mii_bus = mdiobus_alloc();
853 @@ -1360,8 +1373,22 @@ static int bgmac_mii_register(struct bgm
855 bgmac->mii_bus = mii_bus;
857 + /* Connect to the PHY */
858 + snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
860 + phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
861 + PHY_INTERFACE_MODE_MII);
862 + if (IS_ERR(phy_dev)) {
863 + bgmac_err(bgmac, "PHY connecton failed\n");
864 + err = PTR_ERR(phy_dev);
865 + goto err_unregister_bus;
867 + bgmac->phy_dev = phy_dev;
872 + mdiobus_unregister(mii_bus);
876 @@ -1416,9 +1443,6 @@ static int bgmac_probe(struct bcma_devic
877 bcma_set_drvdata(core, bgmac);
880 - bgmac->autoneg = true;
881 - bgmac->full_duplex = true;
882 - bgmac->speed = BGMAC_SPEED_10 | BGMAC_SPEED_100 | BGMAC_SPEED_1000;
883 memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
885 /* On BCM4706 we need common core to access PHY */
886 @@ -1449,6 +1473,27 @@ static int bgmac_probe(struct bcma_devic
888 bgmac_chip_reset(bgmac);
890 + /* For Northstar, we have to take all GMAC core out of reset */
891 + if (core->id.id == BCMA_CHIP_ID_BCM4707 ||
892 + core->id.id == BCMA_CHIP_ID_BCM53018) {
893 + struct bcma_device *ns_core;
896 + /* Northstar has 4 GMAC cores */
897 + for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
898 + /* As Northstar requirement, we have to reset all GMACs
899 + * before accessing one. bgmac_chip_reset() call
900 + * bcma_core_enable() for this core. Then the other
901 + * three GMACs didn't reset. We do it here.
903 + ns_core = bcma_find_core_unit(core->bus,
904 + BCMA_CORE_MAC_GBIT,
906 + if (ns_core && !bcma_core_is_enabled(ns_core))
907 + bcma_core_enable(ns_core, 0);
911 err = bgmac_dma_alloc(bgmac);
913 bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
914 @@ -1473,14 +1518,12 @@ static int bgmac_probe(struct bcma_devic
915 err = bgmac_mii_register(bgmac);
917 bgmac_err(bgmac, "Cannot register MDIO\n");
922 err = register_netdev(bgmac->net_dev);
924 bgmac_err(bgmac, "Cannot register net device\n");
926 goto err_mii_unregister;
929 --- a/drivers/net/ethernet/broadcom/bgmac.h
930 +++ b/drivers/net/ethernet/broadcom/bgmac.h
932 #define BGMAC_RXQ_CTL_MDP_SHIFT 24
933 #define BGMAC_GPIO_SELECT 0x194
934 #define BGMAC_GPIO_OUTPUT_EN 0x198
935 -/* For 0x1e0 see BCMA_CLKCTLST */
937 +/* For 0x1e0 see BCMA_CLKCTLST. Below are BGMAC specific bits */
938 +#define BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ 0x00000100
939 +#define BGMAC_BCMA_CLKCTLST_MISC_PLL_ST 0x01000000
941 #define BGMAC_HW_WAR 0x1e4
942 #define BGMAC_PWR_CTL 0x1e8
943 #define BGMAC_DMA_BASE0 0x200 /* Tx and Rx controller */
945 #define BGMAC_CMDCFG_ES_10 0x00000000
946 #define BGMAC_CMDCFG_ES_100 0x00000004
947 #define BGMAC_CMDCFG_ES_1000 0x00000008
948 +#define BGMAC_CMDCFG_ES_2500 0x0000000C
949 #define BGMAC_CMDCFG_PROM 0x00000010 /* Set to activate promiscuous mode */
950 #define BGMAC_CMDCFG_PAD_EN 0x00000020
951 #define BGMAC_CMDCFG_CF 0x00000040
953 #define BGMAC_CMDCFG_TAI 0x00000200
954 #define BGMAC_CMDCFG_HD 0x00000400 /* Set if in half duplex mode */
955 #define BGMAC_CMDCFG_HD_SHIFT 10
956 -#define BGMAC_CMDCFG_SR 0x00000800 /* Set to reset mode */
957 +#define BGMAC_CMDCFG_SR_REV0 0x00000800 /* Set to reset mode, for other revs */
958 +#define BGMAC_CMDCFG_SR_REV4 0x00002000 /* Set to reset mode, only for core rev 4 */
959 +#define BGMAC_CMDCFG_SR(rev) ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
960 #define BGMAC_CMDCFG_ML 0x00008000 /* Set to activate mac loopback mode */
961 #define BGMAC_CMDCFG_AE 0x00400000
962 #define BGMAC_CMDCFG_CFE 0x00800000
964 #define BGMAC_RX_STATUS 0xb38
965 #define BGMAC_TX_STATUS 0xb3c
967 -#define BGMAC_PHY_CTL 0x00
968 -#define BGMAC_PHY_CTL_SPEED_MSB 0x0040
969 -#define BGMAC_PHY_CTL_DUPLEX 0x0100 /* duplex mode */
970 -#define BGMAC_PHY_CTL_RESTART 0x0200 /* restart autonegotiation */
971 -#define BGMAC_PHY_CTL_ANENAB 0x1000 /* enable autonegotiation */
972 -#define BGMAC_PHY_CTL_SPEED 0x2000
973 -#define BGMAC_PHY_CTL_LOOP 0x4000 /* loopback */
974 -#define BGMAC_PHY_CTL_RESET 0x8000 /* reset */
976 -#define BGMAC_PHY_CTL_SPEED_10 0
977 -#define BGMAC_PHY_CTL_SPEED_100 BGMAC_PHY_CTL_SPEED
978 -#define BGMAC_PHY_CTL_SPEED_1000 BGMAC_PHY_CTL_SPEED_MSB
979 -#define BGMAC_PHY_ADV 0x04
980 -#define BGMAC_PHY_ADV_10HALF 0x0020 /* advertise 10MBits/s half duplex */
981 -#define BGMAC_PHY_ADV_10FULL 0x0040 /* advertise 10MBits/s full duplex */
982 -#define BGMAC_PHY_ADV_100HALF 0x0080 /* advertise 100MBits/s half duplex */
983 -#define BGMAC_PHY_ADV_100FULL 0x0100 /* advertise 100MBits/s full duplex */
984 -#define BGMAC_PHY_ADV2 0x09
985 -#define BGMAC_PHY_ADV2_1000HALF 0x0100 /* advertise 1000MBits/s half duplex */
986 -#define BGMAC_PHY_ADV2_1000FULL 0x0200 /* advertise 1000MBits/s full duplex */
988 /* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
989 #define BGMAC_BCMA_IOCTL_SW_CLKEN 0x00000004 /* PHY Clock Enable */
990 #define BGMAC_BCMA_IOCTL_SW_RESET 0x00000008 /* PHY Reset */
992 #define BGMAC_DMA_TX_SUSPEND 0x00000002
993 #define BGMAC_DMA_TX_LOOPBACK 0x00000004
994 #define BGMAC_DMA_TX_FLUSH 0x00000010
995 +#define BGMAC_DMA_TX_MR_MASK 0x000000C0 /* Multiple outstanding reads */
996 +#define BGMAC_DMA_TX_MR_SHIFT 6
997 +#define BGMAC_DMA_TX_MR_1 0
998 +#define BGMAC_DMA_TX_MR_2 1
999 #define BGMAC_DMA_TX_PARITY_DISABLE 0x00000800
1000 #define BGMAC_DMA_TX_ADDREXT_MASK 0x00030000
1001 #define BGMAC_DMA_TX_ADDREXT_SHIFT 16
1002 +#define BGMAC_DMA_TX_BL_MASK 0x001C0000 /* BurstLen bits */
1003 +#define BGMAC_DMA_TX_BL_SHIFT 18
1004 +#define BGMAC_DMA_TX_BL_16 0
1005 +#define BGMAC_DMA_TX_BL_32 1
1006 +#define BGMAC_DMA_TX_BL_64 2
1007 +#define BGMAC_DMA_TX_BL_128 3
1008 +#define BGMAC_DMA_TX_BL_256 4
1009 +#define BGMAC_DMA_TX_BL_512 5
1010 +#define BGMAC_DMA_TX_BL_1024 6
1011 +#define BGMAC_DMA_TX_PC_MASK 0x00E00000 /* Prefetch control */
1012 +#define BGMAC_DMA_TX_PC_SHIFT 21
1013 +#define BGMAC_DMA_TX_PC_0 0
1014 +#define BGMAC_DMA_TX_PC_4 1
1015 +#define BGMAC_DMA_TX_PC_8 2
1016 +#define BGMAC_DMA_TX_PC_16 3
1017 +#define BGMAC_DMA_TX_PT_MASK 0x03000000 /* Prefetch threshold */
1018 +#define BGMAC_DMA_TX_PT_SHIFT 24
1019 +#define BGMAC_DMA_TX_PT_1 0
1020 +#define BGMAC_DMA_TX_PT_2 1
1021 +#define BGMAC_DMA_TX_PT_4 2
1022 +#define BGMAC_DMA_TX_PT_8 3
1023 #define BGMAC_DMA_TX_INDEX 0x04
1024 #define BGMAC_DMA_TX_RINGLO 0x08
1025 #define BGMAC_DMA_TX_RINGHI 0x0C
1026 @@ -284,8 +295,33 @@
1027 #define BGMAC_DMA_RX_DIRECT_FIFO 0x00000100
1028 #define BGMAC_DMA_RX_OVERFLOW_CONT 0x00000400
1029 #define BGMAC_DMA_RX_PARITY_DISABLE 0x00000800
1030 +#define BGMAC_DMA_RX_MR_MASK 0x000000C0 /* Multiple outstanding reads */
1031 +#define BGMAC_DMA_RX_MR_SHIFT 6
1032 +#define BGMAC_DMA_TX_MR_1 0
1033 +#define BGMAC_DMA_TX_MR_2 1
1034 #define BGMAC_DMA_RX_ADDREXT_MASK 0x00030000
1035 #define BGMAC_DMA_RX_ADDREXT_SHIFT 16
1036 +#define BGMAC_DMA_RX_BL_MASK 0x001C0000 /* BurstLen bits */
1037 +#define BGMAC_DMA_RX_BL_SHIFT 18
1038 +#define BGMAC_DMA_RX_BL_16 0
1039 +#define BGMAC_DMA_RX_BL_32 1
1040 +#define BGMAC_DMA_RX_BL_64 2
1041 +#define BGMAC_DMA_RX_BL_128 3
1042 +#define BGMAC_DMA_RX_BL_256 4
1043 +#define BGMAC_DMA_RX_BL_512 5
1044 +#define BGMAC_DMA_RX_BL_1024 6
1045 +#define BGMAC_DMA_RX_PC_MASK 0x00E00000 /* Prefetch control */
1046 +#define BGMAC_DMA_RX_PC_SHIFT 21
1047 +#define BGMAC_DMA_RX_PC_0 0
1048 +#define BGMAC_DMA_RX_PC_4 1
1049 +#define BGMAC_DMA_RX_PC_8 2
1050 +#define BGMAC_DMA_RX_PC_16 3
1051 +#define BGMAC_DMA_RX_PT_MASK 0x03000000 /* Prefetch threshold */
1052 +#define BGMAC_DMA_RX_PT_SHIFT 24
1053 +#define BGMAC_DMA_RX_PT_1 0
1054 +#define BGMAC_DMA_RX_PT_2 1
1055 +#define BGMAC_DMA_RX_PT_4 2
1056 +#define BGMAC_DMA_RX_PT_8 3
1057 #define BGMAC_DMA_RX_INDEX 0x24
1058 #define BGMAC_DMA_RX_RINGLO 0x28
1059 #define BGMAC_DMA_RX_RINGHI 0x2C
1060 @@ -342,10 +378,6 @@
1061 #define BGMAC_CHIPCTL_1_SW_TYPE_RGMII 0x000000C0
1062 #define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS 0x00010000
1064 -#define BGMAC_SPEED_10 0x0001
1065 -#define BGMAC_SPEED_100 0x0002
1066 -#define BGMAC_SPEED_1000 0x0004
1068 #define BGMAC_WEIGHT 64
1070 #define ETHER_MAX_LEN 1518
1071 @@ -384,6 +416,8 @@ struct bgmac_dma_ring {
1073 struct bgmac_dma_desc *cpu_base;
1074 dma_addr_t dma_base;
1075 + u32 index_base; /* Used for unaligned rings only, otherwise 0 */
1078 struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
1080 @@ -400,6 +434,7 @@ struct bgmac {
1081 struct net_device *net_dev;
1082 struct napi_struct napi;
1083 struct mii_bus *mii_bus;
1084 + struct phy_device *phy_dev;
1087 struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
1088 @@ -414,10 +449,9 @@ struct bgmac {
1092 - /* Speed-related */
1096 + /* Current MAC state */