1 /* b44.c: Broadcom 44xx/47xx Fast Ethernet device driver.
7 * Copyright (C) 2006 Broadcom Corporation.
11 * Distribute under GPL.
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/types.h>
20 #include <linux/netdevice.h>
21 #include <linux/ethtool.h>
22 #include <linux/mii.h>
23 #include <linux/if_ether.h>
24 #include <linux/if_vlan.h>
25 #include <linux/etherdevice.h>
26 #include <linux/pci.h>
27 #include <linux/delay.h>
28 #include <linux/init.h>
29 #include <linux/interrupt.h>
30 #include <linux/dma-mapping.h>
31 #include <linux/ssb/ssb.h>
32 #include <linux/slab.h>
33 #include <linux/phy.h>
35 #include <linux/uaccess.h>
42 #define DRV_MODULE_NAME "b44"
43 #define DRV_DESCRIPTION "Broadcom 44xx/47xx 10/100 PCI ethernet driver"
45 #define B44_DEF_MSG_ENABLE \
55 /* length of time before we decide the hardware is borked,
56 * and dev->tx_timeout() should be called to fix the problem
58 #define B44_TX_TIMEOUT (5 * HZ)
60 /* hardware minimum and maximum for a single frame's data payload */
61 #define B44_MIN_MTU ETH_ZLEN
62 #define B44_MAX_MTU ETH_DATA_LEN
64 #define B44_RX_RING_SIZE 512
65 #define B44_DEF_RX_RING_PENDING 200
66 #define B44_RX_RING_BYTES (sizeof(struct dma_desc) * \
68 #define B44_TX_RING_SIZE 512
69 #define B44_DEF_TX_RING_PENDING (B44_TX_RING_SIZE - 1)
70 #define B44_TX_RING_BYTES (sizeof(struct dma_desc) * \
73 #define TX_RING_GAP(BP) \
74 (B44_TX_RING_SIZE - (BP)->tx_pending)
75 #define TX_BUFFS_AVAIL(BP) \
76 (((BP)->tx_cons <= (BP)->tx_prod) ? \
77 (BP)->tx_cons + (BP)->tx_pending - (BP)->tx_prod : \
78 (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP))
79 #define NEXT_TX(N) (((N) + 1) & (B44_TX_RING_SIZE - 1))
81 #define RX_PKT_OFFSET (RX_HEADER_LEN + 2)
82 #define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET)
84 /* minimum number of free TX descriptors required to wake up TX process */
85 #define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4)
87 /* b44 internal pattern match filter info */
88 #define B44_PATTERN_BASE 0x400
89 #define B44_PATTERN_SIZE 0x80
90 #define B44_PMASK_BASE 0x600
91 #define B44_PMASK_SIZE 0x10
92 #define B44_MAX_PATTERNS 16
93 #define B44_ETHIPV6UDP_HLEN 62
94 #define B44_ETHIPV4UDP_HLEN 42
96 MODULE_AUTHOR("Felix Fietkau, Florian Schirmer, Pekka Pietikainen, David S. Miller");
97 MODULE_DESCRIPTION(DRV_DESCRIPTION);
98 MODULE_LICENSE("GPL");
100 static int b44_debug = -1; /* -1 == use B44_DEF_MSG_ENABLE as value */
101 module_param(b44_debug, int, 0);
102 MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value");
105 #ifdef CONFIG_B44_PCI
106 static const struct pci_device_id b44_pci_tbl[] = {
107 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401) },
108 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B0) },
109 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1) },
110 { 0 } /* terminate list with empty entry */
112 MODULE_DEVICE_TABLE(pci, b44_pci_tbl);
114 static struct pci_driver b44_pci_driver = {
115 .name = DRV_MODULE_NAME,
116 .id_table = b44_pci_tbl,
118 #endif /* CONFIG_B44_PCI */
120 static const struct ssb_device_id b44_ssb_tbl[] = {
121 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_ETHERNET, SSB_ANY_REV),
124 MODULE_DEVICE_TABLE(ssb, b44_ssb_tbl);
126 static void b44_halt(struct b44 *);
127 static void b44_init_rings(struct b44 *);
129 #define B44_FULL_RESET 1
130 #define B44_FULL_RESET_SKIP_PHY 2
131 #define B44_PARTIAL_RESET 3
132 #define B44_CHIP_RESET_FULL 4
133 #define B44_CHIP_RESET_PARTIAL 5
135 static void b44_init_hw(struct b44 *, int);
137 static int dma_desc_sync_size;
140 static const char b44_gstrings[][ETH_GSTRING_LEN] = {
141 #define _B44(x...) # x,
146 static inline void b44_sync_dma_desc_for_device(struct ssb_device *sdev,
148 unsigned long offset,
149 enum dma_data_direction dir)
151 dma_sync_single_for_device(sdev->dma_dev, dma_base + offset,
152 dma_desc_sync_size, dir);
155 static inline void b44_sync_dma_desc_for_cpu(struct ssb_device *sdev,
157 unsigned long offset,
158 enum dma_data_direction dir)
160 dma_sync_single_for_cpu(sdev->dma_dev, dma_base + offset,
161 dma_desc_sync_size, dir);
164 static inline unsigned long br32(const struct b44 *bp, unsigned long reg)
166 return ssb_read32(bp->sdev, reg);
169 static inline void bw32(const struct b44 *bp,
170 unsigned long reg, unsigned long val)
172 ssb_write32(bp->sdev, reg, val);
175 static int b44_wait_bit(struct b44 *bp, unsigned long reg,
176 u32 bit, unsigned long timeout, const int clear)
180 for (i = 0; i < timeout; i++) {
181 u32 val = br32(bp, reg);
183 if (clear && !(val & bit))
185 if (!clear && (val & bit))
191 netdev_err(bp->dev, "BUG! Timeout waiting for bit %08x of register %lx to %s\n",
192 bit, reg, clear ? "clear" : "set");
199 static inline void __b44_cam_write(struct b44 *bp,
200 const unsigned char *data, int index)
204 val = ((u32) data[2]) << 24;
205 val |= ((u32) data[3]) << 16;
206 val |= ((u32) data[4]) << 8;
207 val |= ((u32) data[5]) << 0;
208 bw32(bp, B44_CAM_DATA_LO, val);
209 val = (CAM_DATA_HI_VALID |
210 (((u32) data[0]) << 8) |
211 (((u32) data[1]) << 0));
212 bw32(bp, B44_CAM_DATA_HI, val);
213 bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE |
214 (index << CAM_CTRL_INDEX_SHIFT)));
215 b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1);
218 static inline void __b44_disable_ints(struct b44 *bp)
220 bw32(bp, B44_IMASK, 0);
223 static void b44_disable_ints(struct b44 *bp)
225 __b44_disable_ints(bp);
227 /* Flush posted writes. */
231 static void b44_enable_ints(struct b44 *bp)
233 bw32(bp, B44_IMASK, bp->imask);
236 static int __b44_readphy(struct b44 *bp, int phy_addr, int reg, u32 *val)
240 bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
241 bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
242 (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
243 (phy_addr << MDIO_DATA_PMD_SHIFT) |
244 (reg << MDIO_DATA_RA_SHIFT) |
245 (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
246 err = b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
247 *val = br32(bp, B44_MDIO_DATA) & MDIO_DATA_DATA;
252 static int __b44_writephy(struct b44 *bp, int phy_addr, int reg, u32 val)
254 bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
255 bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
256 (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
257 (phy_addr << MDIO_DATA_PMD_SHIFT) |
258 (reg << MDIO_DATA_RA_SHIFT) |
259 (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT) |
260 (val & MDIO_DATA_DATA)));
261 return b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
264 static inline int b44_readphy(struct b44 *bp, int reg, u32 *val)
266 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
269 return __b44_readphy(bp, bp->phy_addr, reg, val);
272 static inline int b44_writephy(struct b44 *bp, int reg, u32 val)
274 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
277 return __b44_writephy(bp, bp->phy_addr, reg, val);
280 /* miilib interface */
281 static int b44_mdio_read_mii(struct net_device *dev, int phy_id, int location)
284 struct b44 *bp = netdev_priv(dev);
285 int rc = __b44_readphy(bp, phy_id, location, &val);
291 static void b44_mdio_write_mii(struct net_device *dev, int phy_id, int location,
294 struct b44 *bp = netdev_priv(dev);
295 __b44_writephy(bp, phy_id, location, val);
298 static int b44_mdio_read_phylib(struct mii_bus *bus, int phy_id, int location)
301 struct b44 *bp = bus->priv;
302 int rc = __b44_readphy(bp, phy_id, location, &val);
308 static int b44_mdio_write_phylib(struct mii_bus *bus, int phy_id, int location,
311 struct b44 *bp = bus->priv;
312 return __b44_writephy(bp, phy_id, location, val);
315 static int b44_phy_reset(struct b44 *bp)
320 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
322 err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
326 err = b44_readphy(bp, MII_BMCR, &val);
328 if (val & BMCR_RESET) {
329 netdev_err(bp->dev, "PHY Reset would not complete\n");
337 static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags)
341 bp->flags &= ~(B44_FLAG_TX_PAUSE | B44_FLAG_RX_PAUSE);
342 bp->flags |= pause_flags;
344 val = br32(bp, B44_RXCONFIG);
345 if (pause_flags & B44_FLAG_RX_PAUSE)
346 val |= RXCONFIG_FLOW;
348 val &= ~RXCONFIG_FLOW;
349 bw32(bp, B44_RXCONFIG, val);
351 val = br32(bp, B44_MAC_FLOW);
352 if (pause_flags & B44_FLAG_TX_PAUSE)
353 val |= (MAC_FLOW_PAUSE_ENAB |
354 (0xc0 & MAC_FLOW_RX_HI_WATER));
356 val &= ~MAC_FLOW_PAUSE_ENAB;
357 bw32(bp, B44_MAC_FLOW, val);
360 static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
364 /* The driver supports only rx pause by default because
365 the b44 mac tx pause mechanism generates excessive
367 Use ethtool to turn on b44 tx pause if necessary.
369 if ((local & ADVERTISE_PAUSE_CAP) &&
370 (local & ADVERTISE_PAUSE_ASYM)){
371 if ((remote & LPA_PAUSE_ASYM) &&
372 !(remote & LPA_PAUSE_CAP))
373 pause_enab |= B44_FLAG_RX_PAUSE;
376 __b44_set_flow_ctrl(bp, pause_enab);
379 #ifdef CONFIG_BCM47XX
380 #include <linux/bcm47xx_nvram.h>
381 static void b44_wap54g10_workaround(struct b44 *bp)
388 * workaround for bad hardware design in Linksys WAP54G v1.0
389 * see https://dev.openwrt.org/ticket/146
390 * check and reset bit "isolate"
392 if (bcm47xx_nvram_getenv("boardnum", buf, sizeof(buf)) < 0)
394 if (simple_strtoul(buf, NULL, 0) == 2) {
395 err = __b44_readphy(bp, 0, MII_BMCR, &val);
398 if (!(val & BMCR_ISOLATE))
400 val &= ~BMCR_ISOLATE;
401 err = __b44_writephy(bp, 0, MII_BMCR, val);
407 pr_warn("PHY: cannot reset MII transceiver isolate bit\n");
410 static inline void b44_wap54g10_workaround(struct b44 *bp)
415 static int b44_setup_phy(struct b44 *bp)
420 b44_wap54g10_workaround(bp);
422 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
424 if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0)
426 if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
427 val & MII_ALEDCTRL_ALLMSK)) != 0)
429 if ((err = b44_readphy(bp, B44_MII_TLEDCTRL, &val)) != 0)
431 if ((err = b44_writephy(bp, B44_MII_TLEDCTRL,
432 val | MII_TLEDCTRL_ENABLE)) != 0)
435 if (!(bp->flags & B44_FLAG_FORCE_LINK)) {
436 u32 adv = ADVERTISE_CSMA;
438 if (bp->flags & B44_FLAG_ADV_10HALF)
439 adv |= ADVERTISE_10HALF;
440 if (bp->flags & B44_FLAG_ADV_10FULL)
441 adv |= ADVERTISE_10FULL;
442 if (bp->flags & B44_FLAG_ADV_100HALF)
443 adv |= ADVERTISE_100HALF;
444 if (bp->flags & B44_FLAG_ADV_100FULL)
445 adv |= ADVERTISE_100FULL;
447 if (bp->flags & B44_FLAG_PAUSE_AUTO)
448 adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
450 if ((err = b44_writephy(bp, MII_ADVERTISE, adv)) != 0)
452 if ((err = b44_writephy(bp, MII_BMCR, (BMCR_ANENABLE |
453 BMCR_ANRESTART))) != 0)
458 if ((err = b44_readphy(bp, MII_BMCR, &bmcr)) != 0)
460 bmcr &= ~(BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_SPEED100);
461 if (bp->flags & B44_FLAG_100_BASE_T)
462 bmcr |= BMCR_SPEED100;
463 if (bp->flags & B44_FLAG_FULL_DUPLEX)
464 bmcr |= BMCR_FULLDPLX;
465 if ((err = b44_writephy(bp, MII_BMCR, bmcr)) != 0)
468 /* Since we will not be negotiating there is no safe way
469 * to determine if the link partner supports flow control
470 * or not. So just disable it completely in this case.
472 b44_set_flow_ctrl(bp, 0, 0);
479 static void b44_stats_update(struct b44 *bp)
484 val = &bp->hw_stats.tx_good_octets;
485 u64_stats_update_begin(&bp->hw_stats.syncp);
487 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) {
488 *val++ += br32(bp, reg);
491 for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) {
492 *val++ += br32(bp, reg);
495 u64_stats_update_end(&bp->hw_stats.syncp);
498 static void b44_link_report(struct b44 *bp)
500 if (!netif_carrier_ok(bp->dev)) {
501 netdev_info(bp->dev, "Link is down\n");
503 netdev_info(bp->dev, "Link is up at %d Mbps, %s duplex\n",
504 (bp->flags & B44_FLAG_100_BASE_T) ? 100 : 10,
505 (bp->flags & B44_FLAG_FULL_DUPLEX) ? "full" : "half");
507 netdev_info(bp->dev, "Flow control is %s for TX and %s for RX\n",
508 (bp->flags & B44_FLAG_TX_PAUSE) ? "on" : "off",
509 (bp->flags & B44_FLAG_RX_PAUSE) ? "on" : "off");
513 static void b44_check_phy(struct b44 *bp)
517 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
518 bp->flags |= B44_FLAG_100_BASE_T;
519 if (!netif_carrier_ok(bp->dev)) {
520 u32 val = br32(bp, B44_TX_CTRL);
521 if (bp->flags & B44_FLAG_FULL_DUPLEX)
522 val |= TX_CTRL_DUPLEX;
524 val &= ~TX_CTRL_DUPLEX;
525 bw32(bp, B44_TX_CTRL, val);
526 netif_carrier_on(bp->dev);
532 if (!b44_readphy(bp, MII_BMSR, &bmsr) &&
533 !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
535 if (aux & MII_AUXCTRL_SPEED)
536 bp->flags |= B44_FLAG_100_BASE_T;
538 bp->flags &= ~B44_FLAG_100_BASE_T;
539 if (aux & MII_AUXCTRL_DUPLEX)
540 bp->flags |= B44_FLAG_FULL_DUPLEX;
542 bp->flags &= ~B44_FLAG_FULL_DUPLEX;
544 if (!netif_carrier_ok(bp->dev) &&
545 (bmsr & BMSR_LSTATUS)) {
546 u32 val = br32(bp, B44_TX_CTRL);
547 u32 local_adv, remote_adv;
549 if (bp->flags & B44_FLAG_FULL_DUPLEX)
550 val |= TX_CTRL_DUPLEX;
552 val &= ~TX_CTRL_DUPLEX;
553 bw32(bp, B44_TX_CTRL, val);
555 if (!(bp->flags & B44_FLAG_FORCE_LINK) &&
556 !b44_readphy(bp, MII_ADVERTISE, &local_adv) &&
557 !b44_readphy(bp, MII_LPA, &remote_adv))
558 b44_set_flow_ctrl(bp, local_adv, remote_adv);
561 netif_carrier_on(bp->dev);
563 } else if (netif_carrier_ok(bp->dev) && !(bmsr & BMSR_LSTATUS)) {
565 netif_carrier_off(bp->dev);
569 if (bmsr & BMSR_RFAULT)
570 netdev_warn(bp->dev, "Remote fault detected in PHY\n");
572 netdev_warn(bp->dev, "Jabber detected in PHY\n");
576 static void b44_timer(struct timer_list *t)
578 struct b44 *bp = from_timer(bp, t, timer);
580 spin_lock_irq(&bp->lock);
584 b44_stats_update(bp);
586 spin_unlock_irq(&bp->lock);
588 mod_timer(&bp->timer, round_jiffies(jiffies + HZ));
591 static void b44_tx(struct b44 *bp)
594 unsigned bytes_compl = 0, pkts_compl = 0;
596 cur = br32(bp, B44_DMATX_STAT) & DMATX_STAT_CDMASK;
597 cur /= sizeof(struct dma_desc);
599 /* XXX needs updating when NETIF_F_SG is supported */
600 for (cons = bp->tx_cons; cons != cur; cons = NEXT_TX(cons)) {
601 struct ring_info *rp = &bp->tx_buffers[cons];
602 struct sk_buff *skb = rp->skb;
606 dma_unmap_single(bp->sdev->dma_dev,
612 bytes_compl += skb->len;
615 dev_consume_skb_irq(skb);
618 netdev_completed_queue(bp->dev, pkts_compl, bytes_compl);
620 if (netif_queue_stopped(bp->dev) &&
621 TX_BUFFS_AVAIL(bp) > B44_TX_WAKEUP_THRESH)
622 netif_wake_queue(bp->dev);
624 bw32(bp, B44_GPTIMER, 0);
627 /* Works like this. This chip writes a 'struct rx_header" 30 bytes
628 * before the DMA address you give it. So we allocate 30 more bytes
629 * for the RX buffer, DMA map all of it, skb_reserve the 30 bytes, then
630 * point the chip at 30 bytes past where the rx_header will go.
632 static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
635 struct ring_info *src_map, *map;
636 struct rx_header *rh;
644 src_map = &bp->rx_buffers[src_idx];
645 dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1);
646 map = &bp->rx_buffers[dest_idx];
647 skb = netdev_alloc_skb(bp->dev, RX_PKT_BUF_SZ);
651 mapping = dma_map_single(bp->sdev->dma_dev, skb->data,
655 /* Hardware bug work-around, the chip is unable to do PCI DMA
656 to/from anything above 1GB :-( */
657 if (dma_mapping_error(bp->sdev->dma_dev, mapping) ||
658 mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
660 if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
661 dma_unmap_single(bp->sdev->dma_dev, mapping,
662 RX_PKT_BUF_SZ, DMA_FROM_DEVICE);
663 dev_kfree_skb_any(skb);
664 skb = alloc_skb(RX_PKT_BUF_SZ, GFP_ATOMIC | GFP_DMA);
667 mapping = dma_map_single(bp->sdev->dma_dev, skb->data,
670 if (dma_mapping_error(bp->sdev->dma_dev, mapping) ||
671 mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
672 if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
673 dma_unmap_single(bp->sdev->dma_dev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE);
674 dev_kfree_skb_any(skb);
677 bp->force_copybreak = 1;
680 rh = (struct rx_header *) skb->data;
686 map->mapping = mapping;
691 ctrl = (DESC_CTRL_LEN & RX_PKT_BUF_SZ);
692 if (dest_idx == (B44_RX_RING_SIZE - 1))
693 ctrl |= DESC_CTRL_EOT;
695 dp = &bp->rx_ring[dest_idx];
696 dp->ctrl = cpu_to_le32(ctrl);
697 dp->addr = cpu_to_le32((u32) mapping + bp->dma_offset);
699 if (bp->flags & B44_FLAG_RX_RING_HACK)
700 b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
701 dest_idx * sizeof(*dp),
704 return RX_PKT_BUF_SZ;
707 static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
709 struct dma_desc *src_desc, *dest_desc;
710 struct ring_info *src_map, *dest_map;
711 struct rx_header *rh;
715 dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1);
716 dest_desc = &bp->rx_ring[dest_idx];
717 dest_map = &bp->rx_buffers[dest_idx];
718 src_desc = &bp->rx_ring[src_idx];
719 src_map = &bp->rx_buffers[src_idx];
721 dest_map->skb = src_map->skb;
722 rh = (struct rx_header *) src_map->skb->data;
725 dest_map->mapping = src_map->mapping;
727 if (bp->flags & B44_FLAG_RX_RING_HACK)
728 b44_sync_dma_desc_for_cpu(bp->sdev, bp->rx_ring_dma,
729 src_idx * sizeof(*src_desc),
732 ctrl = src_desc->ctrl;
733 if (dest_idx == (B44_RX_RING_SIZE - 1))
734 ctrl |= cpu_to_le32(DESC_CTRL_EOT);
736 ctrl &= cpu_to_le32(~DESC_CTRL_EOT);
738 dest_desc->ctrl = ctrl;
739 dest_desc->addr = src_desc->addr;
743 if (bp->flags & B44_FLAG_RX_RING_HACK)
744 b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
745 dest_idx * sizeof(*dest_desc),
748 dma_sync_single_for_device(bp->sdev->dma_dev, dest_map->mapping,
753 static int b44_rx(struct b44 *bp, int budget)
759 prod = br32(bp, B44_DMARX_STAT) & DMARX_STAT_CDMASK;
760 prod /= sizeof(struct dma_desc);
763 while (cons != prod && budget > 0) {
764 struct ring_info *rp = &bp->rx_buffers[cons];
765 struct sk_buff *skb = rp->skb;
766 dma_addr_t map = rp->mapping;
767 struct rx_header *rh;
770 dma_sync_single_for_cpu(bp->sdev->dma_dev, map,
773 rh = (struct rx_header *) skb->data;
774 len = le16_to_cpu(rh->len);
775 if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ||
776 (rh->flags & cpu_to_le16(RX_FLAG_ERRORS))) {
778 b44_recycle_rx(bp, cons, bp->rx_prod);
780 bp->dev->stats.rx_dropped++;
790 len = le16_to_cpu(rh->len);
791 } while (len == 0 && i++ < 5);
799 if (!bp->force_copybreak && len > RX_COPY_THRESHOLD) {
801 skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod);
804 dma_unmap_single(bp->sdev->dma_dev, map,
805 skb_size, DMA_FROM_DEVICE);
806 /* Leave out rx_header */
807 skb_put(skb, len + RX_PKT_OFFSET);
808 skb_pull(skb, RX_PKT_OFFSET);
810 struct sk_buff *copy_skb;
812 b44_recycle_rx(bp, cons, bp->rx_prod);
813 copy_skb = napi_alloc_skb(&bp->napi, len);
814 if (copy_skb == NULL)
815 goto drop_it_no_recycle;
817 skb_put(copy_skb, len);
818 /* DMA sync done above, copy just the actual packet */
819 skb_copy_from_linear_data_offset(skb, RX_PKT_OFFSET,
820 copy_skb->data, len);
823 skb_checksum_none_assert(skb);
824 skb->protocol = eth_type_trans(skb, bp->dev);
825 netif_receive_skb(skb);
829 bp->rx_prod = (bp->rx_prod + 1) &
830 (B44_RX_RING_SIZE - 1);
831 cons = (cons + 1) & (B44_RX_RING_SIZE - 1);
835 bw32(bp, B44_DMARX_PTR, cons * sizeof(struct dma_desc));
840 static int b44_poll(struct napi_struct *napi, int budget)
842 struct b44 *bp = container_of(napi, struct b44, napi);
846 spin_lock_irqsave(&bp->lock, flags);
848 if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
849 /* spin_lock(&bp->tx_lock); */
851 /* spin_unlock(&bp->tx_lock); */
853 if (bp->istat & ISTAT_RFO) { /* fast recovery, in ~20msec */
854 bp->istat &= ~ISTAT_RFO;
855 b44_disable_ints(bp);
856 ssb_device_enable(bp->sdev, 0); /* resets ISTAT_RFO */
858 b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
859 netif_wake_queue(bp->dev);
862 spin_unlock_irqrestore(&bp->lock, flags);
865 if (bp->istat & ISTAT_RX)
866 work_done += b44_rx(bp, budget);
868 if (bp->istat & ISTAT_ERRORS) {
869 spin_lock_irqsave(&bp->lock, flags);
872 b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
873 netif_wake_queue(bp->dev);
874 spin_unlock_irqrestore(&bp->lock, flags);
878 if (work_done < budget) {
879 napi_complete_done(napi, work_done);
886 static irqreturn_t b44_interrupt(int irq, void *dev_id)
888 struct net_device *dev = dev_id;
889 struct b44 *bp = netdev_priv(dev);
893 spin_lock(&bp->lock);
895 istat = br32(bp, B44_ISTAT);
896 imask = br32(bp, B44_IMASK);
898 /* The interrupt mask register controls which interrupt bits
899 * will actually raise an interrupt to the CPU when set by hw/firmware,
900 * but doesn't mask off the bits.
906 if (unlikely(!netif_running(dev))) {
907 netdev_info(dev, "late interrupt\n");
911 if (napi_schedule_prep(&bp->napi)) {
912 /* NOTE: These writes are posted by the readback of
913 * the ISTAT register below.
916 __b44_disable_ints(bp);
917 __napi_schedule(&bp->napi);
921 bw32(bp, B44_ISTAT, istat);
924 spin_unlock(&bp->lock);
925 return IRQ_RETVAL(handled);
928 static void b44_tx_timeout(struct net_device *dev, unsigned int txqueue)
930 struct b44 *bp = netdev_priv(dev);
932 netdev_err(dev, "transmit timed out, resetting\n");
934 spin_lock_irq(&bp->lock);
938 b44_init_hw(bp, B44_FULL_RESET);
940 spin_unlock_irq(&bp->lock);
944 netif_wake_queue(dev);
947 static netdev_tx_t b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
949 struct b44 *bp = netdev_priv(dev);
950 int rc = NETDEV_TX_OK;
952 u32 len, entry, ctrl;
956 spin_lock_irqsave(&bp->lock, flags);
958 /* This is a hard error, log it. */
959 if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) {
960 netif_stop_queue(dev);
961 netdev_err(dev, "BUG! Tx Ring full when queue awake!\n");
965 mapping = dma_map_single(bp->sdev->dma_dev, skb->data, len, DMA_TO_DEVICE);
966 if (dma_mapping_error(bp->sdev->dma_dev, mapping) || mapping + len > DMA_BIT_MASK(30)) {
967 struct sk_buff *bounce_skb;
969 /* Chip can't handle DMA to/from >1GB, use bounce buffer */
970 if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
971 dma_unmap_single(bp->sdev->dma_dev, mapping, len,
974 bounce_skb = alloc_skb(len, GFP_ATOMIC | GFP_DMA);
978 mapping = dma_map_single(bp->sdev->dma_dev, bounce_skb->data,
980 if (dma_mapping_error(bp->sdev->dma_dev, mapping) || mapping + len > DMA_BIT_MASK(30)) {
981 if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
982 dma_unmap_single(bp->sdev->dma_dev, mapping,
984 dev_kfree_skb_any(bounce_skb);
988 skb_copy_from_linear_data(skb, skb_put(bounce_skb, len), len);
989 dev_consume_skb_any(skb);
994 bp->tx_buffers[entry].skb = skb;
995 bp->tx_buffers[entry].mapping = mapping;
997 ctrl = (len & DESC_CTRL_LEN);
998 ctrl |= DESC_CTRL_IOC | DESC_CTRL_SOF | DESC_CTRL_EOF;
999 if (entry == (B44_TX_RING_SIZE - 1))
1000 ctrl |= DESC_CTRL_EOT;
1002 bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl);
1003 bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset);
1005 if (bp->flags & B44_FLAG_TX_RING_HACK)
1006 b44_sync_dma_desc_for_device(bp->sdev, bp->tx_ring_dma,
1007 entry * sizeof(bp->tx_ring[0]),
1010 entry = NEXT_TX(entry);
1012 bp->tx_prod = entry;
1016 bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
1017 if (bp->flags & B44_FLAG_BUGGY_TXPTR)
1018 bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
1019 if (bp->flags & B44_FLAG_REORDER_BUG)
1020 br32(bp, B44_DMATX_PTR);
1022 netdev_sent_queue(dev, skb->len);
1024 if (TX_BUFFS_AVAIL(bp) < 1)
1025 netif_stop_queue(dev);
1028 spin_unlock_irqrestore(&bp->lock, flags);
1033 rc = NETDEV_TX_BUSY;
1037 static int b44_change_mtu(struct net_device *dev, int new_mtu)
1039 struct b44 *bp = netdev_priv(dev);
1041 if (!netif_running(dev)) {
1042 /* We'll just catch it later when the
1045 WRITE_ONCE(dev->mtu, new_mtu);
1049 spin_lock_irq(&bp->lock);
1051 WRITE_ONCE(dev->mtu, new_mtu);
1053 b44_init_hw(bp, B44_FULL_RESET);
1054 spin_unlock_irq(&bp->lock);
1056 b44_enable_ints(bp);
1061 /* Free up pending packets in all rx/tx rings.
1063 * The chip has been shut down and the driver detached from
1064 * the networking, so no interrupts or new tx packets will
1065 * end up in the driver. bp->lock is not held and we are not
1066 * in an interrupt context and thus may sleep.
1068 static void b44_free_rings(struct b44 *bp)
1070 struct ring_info *rp;
1073 for (i = 0; i < B44_RX_RING_SIZE; i++) {
1074 rp = &bp->rx_buffers[i];
1076 if (rp->skb == NULL)
1078 dma_unmap_single(bp->sdev->dma_dev, rp->mapping, RX_PKT_BUF_SZ,
1080 dev_kfree_skb_any(rp->skb);
1084 /* XXX needs changes once NETIF_F_SG is set... */
1085 for (i = 0; i < B44_TX_RING_SIZE; i++) {
1086 rp = &bp->tx_buffers[i];
1088 if (rp->skb == NULL)
1090 dma_unmap_single(bp->sdev->dma_dev, rp->mapping, rp->skb->len,
1092 dev_kfree_skb_any(rp->skb);
1097 /* Initialize tx/rx rings for packet processing.
1099 * The chip has been shut down and the driver detached from
1100 * the networking, so no interrupts or new tx packets will
1101 * end up in the driver.
1103 static void b44_init_rings(struct b44 *bp)
1109 memset(bp->rx_ring, 0, B44_RX_RING_BYTES);
1110 memset(bp->tx_ring, 0, B44_TX_RING_BYTES);
1112 if (bp->flags & B44_FLAG_RX_RING_HACK)
1113 dma_sync_single_for_device(bp->sdev->dma_dev, bp->rx_ring_dma,
1114 DMA_TABLE_BYTES, DMA_BIDIRECTIONAL);
1116 if (bp->flags & B44_FLAG_TX_RING_HACK)
1117 dma_sync_single_for_device(bp->sdev->dma_dev, bp->tx_ring_dma,
1118 DMA_TABLE_BYTES, DMA_TO_DEVICE);
1120 for (i = 0; i < bp->rx_pending; i++) {
1121 if (b44_alloc_rx_skb(bp, -1, i) < 0)
1127 * Must not be invoked with interrupt sources disabled and
1128 * the hardware shutdown down.
1130 static void b44_free_consistent(struct b44 *bp)
1132 kfree(bp->rx_buffers);
1133 bp->rx_buffers = NULL;
1134 kfree(bp->tx_buffers);
1135 bp->tx_buffers = NULL;
1137 if (bp->flags & B44_FLAG_RX_RING_HACK) {
1138 dma_unmap_single(bp->sdev->dma_dev, bp->rx_ring_dma,
1139 DMA_TABLE_BYTES, DMA_BIDIRECTIONAL);
1142 dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES,
1143 bp->rx_ring, bp->rx_ring_dma);
1145 bp->flags &= ~B44_FLAG_RX_RING_HACK;
1148 if (bp->flags & B44_FLAG_TX_RING_HACK) {
1149 dma_unmap_single(bp->sdev->dma_dev, bp->tx_ring_dma,
1150 DMA_TABLE_BYTES, DMA_TO_DEVICE);
1153 dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES,
1154 bp->tx_ring, bp->tx_ring_dma);
1156 bp->flags &= ~B44_FLAG_TX_RING_HACK;
1161 * Must not be invoked with interrupt sources disabled and
1162 * the hardware shutdown down. Can sleep.
1164 static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
1168 size = B44_RX_RING_SIZE * sizeof(struct ring_info);
1169 bp->rx_buffers = kzalloc(size, gfp);
1170 if (!bp->rx_buffers)
1173 size = B44_TX_RING_SIZE * sizeof(struct ring_info);
1174 bp->tx_buffers = kzalloc(size, gfp);
1175 if (!bp->tx_buffers)
1178 size = DMA_TABLE_BYTES;
1179 bp->rx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size,
1180 &bp->rx_ring_dma, gfp);
1182 /* Allocation may have failed due to dma_alloc_coherent
1183 insisting on use of GFP_DMA, which is more restrictive
1184 than necessary... */
1185 struct dma_desc *rx_ring;
1186 dma_addr_t rx_ring_dma;
1188 rx_ring = kzalloc(size, gfp);
1192 rx_ring_dma = dma_map_single(bp->sdev->dma_dev, rx_ring,
1196 if (dma_mapping_error(bp->sdev->dma_dev, rx_ring_dma) ||
1197 rx_ring_dma + size > DMA_BIT_MASK(30)) {
1202 bp->rx_ring = rx_ring;
1203 bp->rx_ring_dma = rx_ring_dma;
1204 bp->flags |= B44_FLAG_RX_RING_HACK;
1207 bp->tx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size,
1208 &bp->tx_ring_dma, gfp);
1210 /* Allocation may have failed due to ssb_dma_alloc_consistent
1211 insisting on use of GFP_DMA, which is more restrictive
1212 than necessary... */
1213 struct dma_desc *tx_ring;
1214 dma_addr_t tx_ring_dma;
1216 tx_ring = kzalloc(size, gfp);
1220 tx_ring_dma = dma_map_single(bp->sdev->dma_dev, tx_ring,
1224 if (dma_mapping_error(bp->sdev->dma_dev, tx_ring_dma) ||
1225 tx_ring_dma + size > DMA_BIT_MASK(30)) {
1230 bp->tx_ring = tx_ring;
1231 bp->tx_ring_dma = tx_ring_dma;
1232 bp->flags |= B44_FLAG_TX_RING_HACK;
1238 b44_free_consistent(bp);
1242 /* bp->lock is held. */
1243 static void b44_clear_stats(struct b44 *bp)
1247 bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
1248 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL)
1250 for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL)
1254 /* bp->lock is held. */
1255 static void b44_chip_reset(struct b44 *bp, int reset_kind)
1257 struct ssb_device *sdev = bp->sdev;
1260 was_enabled = ssb_device_is_enabled(bp->sdev);
1262 ssb_device_enable(bp->sdev, 0);
1263 ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
1266 bw32(bp, B44_RCV_LAZY, 0);
1267 bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
1268 b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
1269 bw32(bp, B44_DMATX_CTRL, 0);
1270 bp->tx_prod = bp->tx_cons = 0;
1271 if (br32(bp, B44_DMARX_STAT) & DMARX_STAT_EMASK) {
1272 b44_wait_bit(bp, B44_DMARX_STAT, DMARX_STAT_SIDLE,
1275 bw32(bp, B44_DMARX_CTRL, 0);
1276 bp->rx_prod = bp->rx_cons = 0;
1279 b44_clear_stats(bp);
1282 * Don't enable PHY if we are doing a partial reset
1283 * we are probably going to power down
1285 if (reset_kind == B44_CHIP_RESET_PARTIAL)
1288 switch (sdev->bus->bustype) {
1289 case SSB_BUSTYPE_SSB:
1290 bw32(bp, B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
1291 (DIV_ROUND_CLOSEST(ssb_clockspeed(sdev->bus),
1293 & MDIO_CTRL_MAXF_MASK)));
1295 case SSB_BUSTYPE_PCI:
1296 bw32(bp, B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
1297 (0x0d & MDIO_CTRL_MAXF_MASK)));
1299 case SSB_BUSTYPE_PCMCIA:
1300 case SSB_BUSTYPE_SDIO:
1301 WARN_ON(1); /* A device with this bus does not exist. */
1305 br32(bp, B44_MDIO_CTRL);
1307 if (!(br32(bp, B44_DEVCTRL) & DEVCTRL_IPP)) {
1308 bw32(bp, B44_ENET_CTRL, ENET_CTRL_EPSEL);
1309 br32(bp, B44_ENET_CTRL);
1310 bp->flags |= B44_FLAG_EXTERNAL_PHY;
1312 u32 val = br32(bp, B44_DEVCTRL);
1314 if (val & DEVCTRL_EPR) {
1315 bw32(bp, B44_DEVCTRL, (val & ~DEVCTRL_EPR));
1316 br32(bp, B44_DEVCTRL);
1319 bp->flags &= ~B44_FLAG_EXTERNAL_PHY;
1323 /* bp->lock is held. */
1324 static void b44_halt(struct b44 *bp)
1326 b44_disable_ints(bp);
1329 /* power down PHY */
1330 netdev_info(bp->dev, "powering down PHY\n");
1331 bw32(bp, B44_MAC_CTRL, MAC_CTRL_PHY_PDOWN);
1332 /* now reset the chip, but without enabling the MAC&PHY
1333 * part of it. This has to be done _after_ we shut down the PHY */
1334 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
1335 b44_chip_reset(bp, B44_CHIP_RESET_FULL);
1337 b44_chip_reset(bp, B44_CHIP_RESET_PARTIAL);
1340 /* bp->lock is held. */
1341 static void __b44_set_mac_addr(struct b44 *bp)
1343 bw32(bp, B44_CAM_CTRL, 0);
1344 if (!(bp->dev->flags & IFF_PROMISC)) {
1347 __b44_cam_write(bp, bp->dev->dev_addr, 0);
1348 val = br32(bp, B44_CAM_CTRL);
1349 bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
1353 static int b44_set_mac_addr(struct net_device *dev, void *p)
1355 struct b44 *bp = netdev_priv(dev);
1356 struct sockaddr *addr = p;
1359 if (netif_running(dev))
1362 if (!is_valid_ether_addr(addr->sa_data))
1365 eth_hw_addr_set(dev, addr->sa_data);
1367 spin_lock_irq(&bp->lock);
1369 val = br32(bp, B44_RXCONFIG);
1370 if (!(val & RXCONFIG_CAM_ABSENT))
1371 __b44_set_mac_addr(bp);
1373 spin_unlock_irq(&bp->lock);
1378 /* Called at device open time to get the chip ready for
1379 * packet processing. Invoked with bp->lock held.
1381 static void __b44_set_rx_mode(struct net_device *);
1382 static void b44_init_hw(struct b44 *bp, int reset_kind)
1386 b44_chip_reset(bp, B44_CHIP_RESET_FULL);
1387 if (reset_kind == B44_FULL_RESET) {
1392 /* Enable CRC32, set proper LED modes and power on PHY */
1393 bw32(bp, B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL);
1394 bw32(bp, B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT));
1396 /* This sets the MAC address too. */
1397 __b44_set_rx_mode(bp->dev);
1399 /* MTU + eth header + possible VLAN tag + struct rx_header */
1400 bw32(bp, B44_RXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
1401 bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
1403 bw32(bp, B44_TX_WMARK, 56); /* XXX magic */
1404 if (reset_kind == B44_PARTIAL_RESET) {
1405 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1406 (RX_PKT_OFFSET << DMARX_CTRL_ROSHIFT)));
1408 bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
1409 bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
1410 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1411 (RX_PKT_OFFSET << DMARX_CTRL_ROSHIFT)));
1412 bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);
1414 bw32(bp, B44_DMARX_PTR, bp->rx_pending);
1415 bp->rx_prod = bp->rx_pending;
1417 bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
1420 val = br32(bp, B44_ENET_CTRL);
1421 bw32(bp, B44_ENET_CTRL, (val | ENET_CTRL_ENABLE));
1423 netdev_reset_queue(bp->dev);
1426 static int b44_open(struct net_device *dev)
1428 struct b44 *bp = netdev_priv(dev);
1431 err = b44_alloc_consistent(bp, GFP_KERNEL);
1435 napi_enable(&bp->napi);
1438 b44_init_hw(bp, B44_FULL_RESET);
1442 err = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
1443 if (unlikely(err < 0)) {
1444 napi_disable(&bp->napi);
1445 b44_chip_reset(bp, B44_CHIP_RESET_PARTIAL);
1447 b44_free_consistent(bp);
1451 timer_setup(&bp->timer, b44_timer, 0);
1452 bp->timer.expires = jiffies + HZ;
1453 add_timer(&bp->timer);
1455 b44_enable_ints(bp);
1457 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
1458 phy_start(dev->phydev);
1460 netif_start_queue(dev);
1465 #ifdef CONFIG_NET_POLL_CONTROLLER
1467 * Polling receive - used by netconsole and other diagnostic tools
1468 * to allow network i/o with interrupts disabled.
1470 static void b44_poll_controller(struct net_device *dev)
1472 disable_irq(dev->irq);
1473 b44_interrupt(dev->irq, dev);
1474 enable_irq(dev->irq);
1478 static void bwfilter_table(struct b44 *bp, u8 *pp, u32 bytes, u32 table_offset)
1481 u32 *pattern = (u32 *) pp;
1483 for (i = 0; i < bytes; i += sizeof(u32)) {
1484 bw32(bp, B44_FILT_ADDR, table_offset + i);
1485 bw32(bp, B44_FILT_DATA, pattern[i / sizeof(u32)]);
1489 static int b44_magic_pattern(const u8 *macaddr, u8 *ppattern, u8 *pmask,
1493 int k, j, len = offset;
1494 int ethaddr_bytes = ETH_ALEN;
1496 memset(ppattern + offset, 0xff, magicsync);
1497 for (j = 0; j < magicsync; j++) {
1498 pmask[len >> 3] |= BIT(len & 7);
1502 for (j = 0; j < B44_MAX_PATTERNS; j++) {
1503 if ((B44_PATTERN_SIZE - len) >= ETH_ALEN)
1504 ethaddr_bytes = ETH_ALEN;
1506 ethaddr_bytes = B44_PATTERN_SIZE - len;
1507 if (ethaddr_bytes <=0)
1509 for (k = 0; k< ethaddr_bytes; k++) {
1510 ppattern[offset + magicsync +
1511 (j * ETH_ALEN) + k] = macaddr[k];
1512 pmask[len >> 3] |= BIT(len & 7);
1519 /* Setup magic packet patterns in the b44 WOL
1520 * pattern matching filter.
1522 static void b44_setup_pseudo_magicp(struct b44 *bp)
1526 int plen0, plen1, plen2;
1528 u8 pwol_mask[B44_PMASK_SIZE];
1530 pwol_pattern = kzalloc(B44_PATTERN_SIZE, GFP_KERNEL);
1534 /* Ipv4 magic packet pattern - pattern 0.*/
1535 memset(pwol_mask, 0, B44_PMASK_SIZE);
1536 plen0 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1537 B44_ETHIPV4UDP_HLEN);
1539 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, B44_PATTERN_BASE);
1540 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE, B44_PMASK_BASE);
1542 /* Raw ethernet II magic packet pattern - pattern 1 */
1543 memset(pwol_pattern, 0, B44_PATTERN_SIZE);
1544 memset(pwol_mask, 0, B44_PMASK_SIZE);
1545 plen1 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1548 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE,
1549 B44_PATTERN_BASE + B44_PATTERN_SIZE);
1550 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE,
1551 B44_PMASK_BASE + B44_PMASK_SIZE);
1553 /* Ipv6 magic packet pattern - pattern 2 */
1554 memset(pwol_pattern, 0, B44_PATTERN_SIZE);
1555 memset(pwol_mask, 0, B44_PMASK_SIZE);
1556 plen2 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1557 B44_ETHIPV6UDP_HLEN);
1559 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE,
1560 B44_PATTERN_BASE + B44_PATTERN_SIZE + B44_PATTERN_SIZE);
1561 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE,
1562 B44_PMASK_BASE + B44_PMASK_SIZE + B44_PMASK_SIZE);
1564 kfree(pwol_pattern);
1566 /* set these pattern's lengths: one less than each real length */
1567 val = plen0 | (plen1 << 8) | (plen2 << 16) | WKUP_LEN_ENABLE_THREE;
1568 bw32(bp, B44_WKUP_LEN, val);
1570 /* enable wakeup pattern matching */
1571 val = br32(bp, B44_DEVCTRL);
1572 bw32(bp, B44_DEVCTRL, val | DEVCTRL_PFE);
1576 #ifdef CONFIG_B44_PCI
1577 static void b44_setup_wol_pci(struct b44 *bp)
1581 if (bp->sdev->bus->bustype != SSB_BUSTYPE_SSB) {
1582 bw32(bp, SSB_TMSLOW, br32(bp, SSB_TMSLOW) | SSB_TMSLOW_PE);
1583 pci_read_config_word(bp->sdev->bus->host_pci, SSB_PMCSR, &val);
1584 pci_write_config_word(bp->sdev->bus->host_pci, SSB_PMCSR, val | SSB_PE);
1588 static inline void b44_setup_wol_pci(struct b44 *bp) { }
1589 #endif /* CONFIG_B44_PCI */
1591 static void b44_setup_wol(struct b44 *bp)
1595 bw32(bp, B44_RXCONFIG, RXCONFIG_ALLMULTI);
1597 if (bp->flags & B44_FLAG_B0_ANDLATER) {
1599 bw32(bp, B44_WKUP_LEN, WKUP_LEN_DISABLE);
1601 val = bp->dev->dev_addr[2] << 24 |
1602 bp->dev->dev_addr[3] << 16 |
1603 bp->dev->dev_addr[4] << 8 |
1604 bp->dev->dev_addr[5];
1605 bw32(bp, B44_ADDR_LO, val);
1607 val = bp->dev->dev_addr[0] << 8 |
1608 bp->dev->dev_addr[1];
1609 bw32(bp, B44_ADDR_HI, val);
1611 val = br32(bp, B44_DEVCTRL);
1612 bw32(bp, B44_DEVCTRL, val | DEVCTRL_MPM | DEVCTRL_PFE);
1615 b44_setup_pseudo_magicp(bp);
1617 b44_setup_wol_pci(bp);
1620 static int b44_close(struct net_device *dev)
1622 struct b44 *bp = netdev_priv(dev);
1624 netif_stop_queue(dev);
1626 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
1627 phy_stop(dev->phydev);
1629 napi_disable(&bp->napi);
1631 del_timer_sync(&bp->timer);
1633 spin_lock_irq(&bp->lock);
1637 netif_carrier_off(dev);
1639 spin_unlock_irq(&bp->lock);
1641 free_irq(dev->irq, dev);
1643 if (bp->flags & B44_FLAG_WOL_ENABLE) {
1644 b44_init_hw(bp, B44_PARTIAL_RESET);
1648 b44_free_consistent(bp);
1653 static void b44_get_stats64(struct net_device *dev,
1654 struct rtnl_link_stats64 *nstat)
1656 struct b44 *bp = netdev_priv(dev);
1657 struct b44_hw_stats *hwstat = &bp->hw_stats;
1661 start = u64_stats_fetch_begin(&hwstat->syncp);
1663 /* Convert HW stats into rtnl_link_stats64 stats. */
1664 nstat->rx_packets = hwstat->rx_pkts;
1665 nstat->tx_packets = hwstat->tx_pkts;
1666 nstat->rx_bytes = hwstat->rx_octets;
1667 nstat->tx_bytes = hwstat->tx_octets;
1668 nstat->tx_errors = (hwstat->tx_jabber_pkts +
1669 hwstat->tx_oversize_pkts +
1670 hwstat->tx_underruns +
1671 hwstat->tx_excessive_cols +
1672 hwstat->tx_late_cols);
1673 nstat->multicast = hwstat->rx_multicast_pkts;
1674 nstat->collisions = hwstat->tx_total_cols;
1676 nstat->rx_length_errors = (hwstat->rx_oversize_pkts +
1677 hwstat->rx_undersize);
1678 nstat->rx_over_errors = hwstat->rx_missed_pkts;
1679 nstat->rx_frame_errors = hwstat->rx_align_errs;
1680 nstat->rx_crc_errors = hwstat->rx_crc_errs;
1681 nstat->rx_errors = (hwstat->rx_jabber_pkts +
1682 hwstat->rx_oversize_pkts +
1683 hwstat->rx_missed_pkts +
1684 hwstat->rx_crc_align_errs +
1685 hwstat->rx_undersize +
1686 hwstat->rx_crc_errs +
1687 hwstat->rx_align_errs +
1688 hwstat->rx_symbol_errs);
1690 nstat->tx_aborted_errors = hwstat->tx_underruns;
1692 /* Carrier lost counter seems to be broken for some devices */
1693 nstat->tx_carrier_errors = hwstat->tx_carrier_lost;
1695 } while (u64_stats_fetch_retry(&hwstat->syncp, start));
1699 static int __b44_load_mcast(struct b44 *bp, struct net_device *dev)
1701 struct netdev_hw_addr *ha;
1704 num_ents = min_t(int, netdev_mc_count(dev), B44_MCAST_TABLE_SIZE);
1706 netdev_for_each_mc_addr(ha, dev) {
1709 __b44_cam_write(bp, ha->addr, i++ + 1);
1714 static void __b44_set_rx_mode(struct net_device *dev)
1716 struct b44 *bp = netdev_priv(dev);
1719 val = br32(bp, B44_RXCONFIG);
1720 val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI);
1721 if ((dev->flags & IFF_PROMISC) || (val & RXCONFIG_CAM_ABSENT)) {
1722 val |= RXCONFIG_PROMISC;
1723 bw32(bp, B44_RXCONFIG, val);
1725 unsigned char zero[6] = {0, 0, 0, 0, 0, 0};
1728 __b44_set_mac_addr(bp);
1730 if ((dev->flags & IFF_ALLMULTI) ||
1731 (netdev_mc_count(dev) > B44_MCAST_TABLE_SIZE))
1732 val |= RXCONFIG_ALLMULTI;
1734 i = __b44_load_mcast(bp, dev);
1737 __b44_cam_write(bp, zero, i);
1739 bw32(bp, B44_RXCONFIG, val);
1740 val = br32(bp, B44_CAM_CTRL);
1741 bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
1745 static void b44_set_rx_mode(struct net_device *dev)
1747 struct b44 *bp = netdev_priv(dev);
1749 spin_lock_irq(&bp->lock);
1750 __b44_set_rx_mode(dev);
1751 spin_unlock_irq(&bp->lock);
1754 static u32 b44_get_msglevel(struct net_device *dev)
1756 struct b44 *bp = netdev_priv(dev);
1757 return bp->msg_enable;
1760 static void b44_set_msglevel(struct net_device *dev, u32 value)
1762 struct b44 *bp = netdev_priv(dev);
1763 bp->msg_enable = value;
1766 static void b44_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
1768 struct b44 *bp = netdev_priv(dev);
1769 struct ssb_bus *bus = bp->sdev->bus;
1771 strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
1772 switch (bus->bustype) {
1773 case SSB_BUSTYPE_PCI:
1774 strscpy(info->bus_info, pci_name(bus->host_pci), sizeof(info->bus_info));
1776 case SSB_BUSTYPE_SSB:
1777 strscpy(info->bus_info, "SSB", sizeof(info->bus_info));
1779 case SSB_BUSTYPE_PCMCIA:
1780 case SSB_BUSTYPE_SDIO:
1781 WARN_ON(1); /* A device with this bus does not exist. */
1786 static int b44_nway_reset(struct net_device *dev)
1788 struct b44 *bp = netdev_priv(dev);
1792 spin_lock_irq(&bp->lock);
1793 b44_readphy(bp, MII_BMCR, &bmcr);
1794 b44_readphy(bp, MII_BMCR, &bmcr);
1796 if (bmcr & BMCR_ANENABLE)
1797 r = b44_writephy(bp, MII_BMCR,
1798 bmcr | BMCR_ANRESTART);
1799 spin_unlock_irq(&bp->lock);
1804 static int b44_get_link_ksettings(struct net_device *dev,
1805 struct ethtool_link_ksettings *cmd)
1807 struct b44 *bp = netdev_priv(dev);
1808 u32 supported, advertising;
1810 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
1811 BUG_ON(!dev->phydev);
1812 phy_ethtool_ksettings_get(dev->phydev, cmd);
1817 supported = (SUPPORTED_Autoneg);
1818 supported |= (SUPPORTED_100baseT_Half |
1819 SUPPORTED_100baseT_Full |
1820 SUPPORTED_10baseT_Half |
1821 SUPPORTED_10baseT_Full |
1825 if (bp->flags & B44_FLAG_ADV_10HALF)
1826 advertising |= ADVERTISED_10baseT_Half;
1827 if (bp->flags & B44_FLAG_ADV_10FULL)
1828 advertising |= ADVERTISED_10baseT_Full;
1829 if (bp->flags & B44_FLAG_ADV_100HALF)
1830 advertising |= ADVERTISED_100baseT_Half;
1831 if (bp->flags & B44_FLAG_ADV_100FULL)
1832 advertising |= ADVERTISED_100baseT_Full;
1833 advertising |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
1834 cmd->base.speed = (bp->flags & B44_FLAG_100_BASE_T) ?
1835 SPEED_100 : SPEED_10;
1836 cmd->base.duplex = (bp->flags & B44_FLAG_FULL_DUPLEX) ?
1837 DUPLEX_FULL : DUPLEX_HALF;
1839 cmd->base.phy_address = bp->phy_addr;
1840 cmd->base.autoneg = (bp->flags & B44_FLAG_FORCE_LINK) ?
1841 AUTONEG_DISABLE : AUTONEG_ENABLE;
1842 if (cmd->base.autoneg == AUTONEG_ENABLE)
1843 advertising |= ADVERTISED_Autoneg;
1845 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
1847 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
1850 if (!netif_running(dev)){
1851 cmd->base.speed = 0;
1852 cmd->base.duplex = 0xff;
1858 static int b44_set_link_ksettings(struct net_device *dev,
1859 const struct ethtool_link_ksettings *cmd)
1861 struct b44 *bp = netdev_priv(dev);
1866 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
1867 BUG_ON(!dev->phydev);
1868 spin_lock_irq(&bp->lock);
1869 if (netif_running(dev))
1872 ret = phy_ethtool_ksettings_set(dev->phydev, cmd);
1874 spin_unlock_irq(&bp->lock);
1879 speed = cmd->base.speed;
1881 ethtool_convert_link_mode_to_legacy_u32(&advertising,
1882 cmd->link_modes.advertising);
1884 /* We do not support gigabit. */
1885 if (cmd->base.autoneg == AUTONEG_ENABLE) {
1887 (ADVERTISED_1000baseT_Half |
1888 ADVERTISED_1000baseT_Full))
1890 } else if ((speed != SPEED_100 &&
1891 speed != SPEED_10) ||
1892 (cmd->base.duplex != DUPLEX_HALF &&
1893 cmd->base.duplex != DUPLEX_FULL)) {
1897 spin_lock_irq(&bp->lock);
1899 if (cmd->base.autoneg == AUTONEG_ENABLE) {
1900 bp->flags &= ~(B44_FLAG_FORCE_LINK |
1901 B44_FLAG_100_BASE_T |
1902 B44_FLAG_FULL_DUPLEX |
1903 B44_FLAG_ADV_10HALF |
1904 B44_FLAG_ADV_10FULL |
1905 B44_FLAG_ADV_100HALF |
1906 B44_FLAG_ADV_100FULL);
1907 if (advertising == 0) {
1908 bp->flags |= (B44_FLAG_ADV_10HALF |
1909 B44_FLAG_ADV_10FULL |
1910 B44_FLAG_ADV_100HALF |
1911 B44_FLAG_ADV_100FULL);
1913 if (advertising & ADVERTISED_10baseT_Half)
1914 bp->flags |= B44_FLAG_ADV_10HALF;
1915 if (advertising & ADVERTISED_10baseT_Full)
1916 bp->flags |= B44_FLAG_ADV_10FULL;
1917 if (advertising & ADVERTISED_100baseT_Half)
1918 bp->flags |= B44_FLAG_ADV_100HALF;
1919 if (advertising & ADVERTISED_100baseT_Full)
1920 bp->flags |= B44_FLAG_ADV_100FULL;
1923 bp->flags |= B44_FLAG_FORCE_LINK;
1924 bp->flags &= ~(B44_FLAG_100_BASE_T | B44_FLAG_FULL_DUPLEX);
1925 if (speed == SPEED_100)
1926 bp->flags |= B44_FLAG_100_BASE_T;
1927 if (cmd->base.duplex == DUPLEX_FULL)
1928 bp->flags |= B44_FLAG_FULL_DUPLEX;
1931 if (netif_running(dev))
1934 spin_unlock_irq(&bp->lock);
1939 static void b44_get_ringparam(struct net_device *dev,
1940 struct ethtool_ringparam *ering,
1941 struct kernel_ethtool_ringparam *kernel_ering,
1942 struct netlink_ext_ack *extack)
1944 struct b44 *bp = netdev_priv(dev);
1946 ering->rx_max_pending = B44_RX_RING_SIZE - 1;
1947 ering->rx_pending = bp->rx_pending;
1949 /* XXX ethtool lacks a tx_max_pending, oops... */
1952 static int b44_set_ringparam(struct net_device *dev,
1953 struct ethtool_ringparam *ering,
1954 struct kernel_ethtool_ringparam *kernel_ering,
1955 struct netlink_ext_ack *extack)
1957 struct b44 *bp = netdev_priv(dev);
1959 if ((ering->rx_pending > B44_RX_RING_SIZE - 1) ||
1960 (ering->rx_mini_pending != 0) ||
1961 (ering->rx_jumbo_pending != 0) ||
1962 (ering->tx_pending > B44_TX_RING_SIZE - 1))
1965 spin_lock_irq(&bp->lock);
1967 bp->rx_pending = ering->rx_pending;
1968 bp->tx_pending = ering->tx_pending;
1972 b44_init_hw(bp, B44_FULL_RESET);
1973 netif_wake_queue(bp->dev);
1974 spin_unlock_irq(&bp->lock);
1976 b44_enable_ints(bp);
1981 static void b44_get_pauseparam(struct net_device *dev,
1982 struct ethtool_pauseparam *epause)
1984 struct b44 *bp = netdev_priv(dev);
1987 (bp->flags & B44_FLAG_PAUSE_AUTO) != 0;
1989 (bp->flags & B44_FLAG_RX_PAUSE) != 0;
1991 (bp->flags & B44_FLAG_TX_PAUSE) != 0;
1994 static int b44_set_pauseparam(struct net_device *dev,
1995 struct ethtool_pauseparam *epause)
1997 struct b44 *bp = netdev_priv(dev);
1999 spin_lock_irq(&bp->lock);
2000 if (epause->autoneg)
2001 bp->flags |= B44_FLAG_PAUSE_AUTO;
2003 bp->flags &= ~B44_FLAG_PAUSE_AUTO;
2004 if (epause->rx_pause)
2005 bp->flags |= B44_FLAG_RX_PAUSE;
2007 bp->flags &= ~B44_FLAG_RX_PAUSE;
2008 if (epause->tx_pause)
2009 bp->flags |= B44_FLAG_TX_PAUSE;
2011 bp->flags &= ~B44_FLAG_TX_PAUSE;
2012 if (netif_running(dev)) {
2013 if (bp->flags & B44_FLAG_PAUSE_AUTO) {
2016 b44_init_hw(bp, B44_FULL_RESET);
2018 __b44_set_flow_ctrl(bp, bp->flags);
2021 spin_unlock_irq(&bp->lock);
2023 b44_enable_ints(bp);
2028 static void b44_get_strings(struct net_device *dev, u32 stringset, u8 *data)
2032 memcpy(data, *b44_gstrings, sizeof(b44_gstrings));
2037 static int b44_get_sset_count(struct net_device *dev, int sset)
2041 return ARRAY_SIZE(b44_gstrings);
2047 static void b44_get_ethtool_stats(struct net_device *dev,
2048 struct ethtool_stats *stats, u64 *data)
2050 struct b44 *bp = netdev_priv(dev);
2051 struct b44_hw_stats *hwstat = &bp->hw_stats;
2052 u64 *data_src, *data_dst;
2056 spin_lock_irq(&bp->lock);
2057 b44_stats_update(bp);
2058 spin_unlock_irq(&bp->lock);
2061 data_src = &hwstat->tx_good_octets;
2063 start = u64_stats_fetch_begin(&hwstat->syncp);
2065 for (i = 0; i < ARRAY_SIZE(b44_gstrings); i++)
2066 *data_dst++ = *data_src++;
2068 } while (u64_stats_fetch_retry(&hwstat->syncp, start));
2071 static void b44_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2073 struct b44 *bp = netdev_priv(dev);
2075 wol->supported = WAKE_MAGIC;
2076 if (bp->flags & B44_FLAG_WOL_ENABLE)
2077 wol->wolopts = WAKE_MAGIC;
2080 memset(&wol->sopass, 0, sizeof(wol->sopass));
2083 static int b44_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2085 struct b44 *bp = netdev_priv(dev);
2087 spin_lock_irq(&bp->lock);
2088 if (wol->wolopts & WAKE_MAGIC)
2089 bp->flags |= B44_FLAG_WOL_ENABLE;
2091 bp->flags &= ~B44_FLAG_WOL_ENABLE;
2092 spin_unlock_irq(&bp->lock);
2094 device_set_wakeup_enable(bp->sdev->dev, wol->wolopts & WAKE_MAGIC);
2098 static const struct ethtool_ops b44_ethtool_ops = {
2099 .get_drvinfo = b44_get_drvinfo,
2100 .nway_reset = b44_nway_reset,
2101 .get_link = ethtool_op_get_link,
2102 .get_wol = b44_get_wol,
2103 .set_wol = b44_set_wol,
2104 .get_ringparam = b44_get_ringparam,
2105 .set_ringparam = b44_set_ringparam,
2106 .get_pauseparam = b44_get_pauseparam,
2107 .set_pauseparam = b44_set_pauseparam,
2108 .get_msglevel = b44_get_msglevel,
2109 .set_msglevel = b44_set_msglevel,
2110 .get_strings = b44_get_strings,
2111 .get_sset_count = b44_get_sset_count,
2112 .get_ethtool_stats = b44_get_ethtool_stats,
2113 .get_link_ksettings = b44_get_link_ksettings,
2114 .set_link_ksettings = b44_set_link_ksettings,
2117 static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2119 struct b44 *bp = netdev_priv(dev);
2122 if (!netif_running(dev))
2125 spin_lock_irq(&bp->lock);
2126 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
2127 BUG_ON(!dev->phydev);
2128 err = phy_mii_ioctl(dev->phydev, ifr, cmd);
2130 err = generic_mii_ioctl(&bp->mii_if, if_mii(ifr), cmd, NULL);
2132 spin_unlock_irq(&bp->lock);
2137 static int b44_get_invariants(struct b44 *bp)
2139 struct ssb_device *sdev = bp->sdev;
2143 bp->dma_offset = ssb_dma_translation(sdev);
2145 if (sdev->bus->bustype == SSB_BUSTYPE_SSB &&
2147 addr = sdev->bus->sprom.et1mac;
2148 bp->phy_addr = sdev->bus->sprom.et1phyaddr;
2150 addr = sdev->bus->sprom.et0mac;
2151 bp->phy_addr = sdev->bus->sprom.et0phyaddr;
2153 /* Some ROMs have buggy PHY addresses with the high
2154 * bits set (sign extension?). Truncate them to a
2155 * valid PHY address. */
2156 bp->phy_addr &= 0x1F;
2158 eth_hw_addr_set(bp->dev, addr);
2160 if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){
2161 pr_err("Invalid MAC address found in EEPROM\n");
2165 bp->imask = IMASK_DEF;
2167 /* XXX - really required?
2168 bp->flags |= B44_FLAG_BUGGY_TXPTR;
2171 if (bp->sdev->id.revision >= 7)
2172 bp->flags |= B44_FLAG_B0_ANDLATER;
2177 static const struct net_device_ops b44_netdev_ops = {
2178 .ndo_open = b44_open,
2179 .ndo_stop = b44_close,
2180 .ndo_start_xmit = b44_start_xmit,
2181 .ndo_get_stats64 = b44_get_stats64,
2182 .ndo_set_rx_mode = b44_set_rx_mode,
2183 .ndo_set_mac_address = b44_set_mac_addr,
2184 .ndo_validate_addr = eth_validate_addr,
2185 .ndo_eth_ioctl = b44_ioctl,
2186 .ndo_tx_timeout = b44_tx_timeout,
2187 .ndo_change_mtu = b44_change_mtu,
2188 #ifdef CONFIG_NET_POLL_CONTROLLER
2189 .ndo_poll_controller = b44_poll_controller,
2193 static void b44_adjust_link(struct net_device *dev)
2195 struct b44 *bp = netdev_priv(dev);
2196 struct phy_device *phydev = dev->phydev;
2197 bool status_changed = false;
2201 if (bp->old_link != phydev->link) {
2202 status_changed = true;
2203 bp->old_link = phydev->link;
2206 /* reflect duplex change */
2208 if ((phydev->duplex == DUPLEX_HALF) &&
2209 (bp->flags & B44_FLAG_FULL_DUPLEX)) {
2210 status_changed = true;
2211 bp->flags &= ~B44_FLAG_FULL_DUPLEX;
2212 } else if ((phydev->duplex == DUPLEX_FULL) &&
2213 !(bp->flags & B44_FLAG_FULL_DUPLEX)) {
2214 status_changed = true;
2215 bp->flags |= B44_FLAG_FULL_DUPLEX;
2219 if (status_changed) {
2220 u32 val = br32(bp, B44_TX_CTRL);
2221 if (bp->flags & B44_FLAG_FULL_DUPLEX)
2222 val |= TX_CTRL_DUPLEX;
2224 val &= ~TX_CTRL_DUPLEX;
2225 bw32(bp, B44_TX_CTRL, val);
2226 phy_print_status(phydev);
2230 static int b44_register_phy_one(struct b44 *bp)
2232 __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
2233 struct mii_bus *mii_bus;
2234 struct ssb_device *sdev = bp->sdev;
2235 struct phy_device *phydev;
2236 char bus_id[MII_BUS_ID_SIZE + 3];
2237 struct ssb_sprom *sprom = &sdev->bus->sprom;
2240 mii_bus = mdiobus_alloc();
2242 dev_err(sdev->dev, "mdiobus_alloc() failed\n");
2248 mii_bus->read = b44_mdio_read_phylib;
2249 mii_bus->write = b44_mdio_write_phylib;
2250 mii_bus->name = "b44_eth_mii";
2251 mii_bus->parent = sdev->dev;
2252 mii_bus->phy_mask = ~(1 << bp->phy_addr);
2253 snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%x", instance);
2255 bp->mii_bus = mii_bus;
2257 err = mdiobus_register(mii_bus);
2259 dev_err(sdev->dev, "failed to register MII bus\n");
2260 goto err_out_mdiobus;
2263 if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr) &&
2264 (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
2267 "could not find PHY at %i, use fixed one\n",
2271 snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, "fixed-0",
2274 snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
2278 phydev = phy_connect(bp->dev, bus_id, &b44_adjust_link,
2279 PHY_INTERFACE_MODE_MII);
2280 if (IS_ERR(phydev)) {
2281 dev_err(sdev->dev, "could not attach PHY at %i\n",
2283 err = PTR_ERR(phydev);
2284 goto err_out_mdiobus_unregister;
2287 /* mask with MAC supported features */
2288 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask);
2289 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask);
2290 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask);
2291 linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask);
2292 linkmode_and(phydev->supported, phydev->supported, mask);
2293 linkmode_copy(phydev->advertising, phydev->supported);
2296 bp->phy_addr = phydev->mdio.addr;
2298 phy_attached_info(phydev);
2302 err_out_mdiobus_unregister:
2303 mdiobus_unregister(mii_bus);
2306 mdiobus_free(mii_bus);
2312 static void b44_unregister_phy_one(struct b44 *bp)
2314 struct net_device *dev = bp->dev;
2315 struct mii_bus *mii_bus = bp->mii_bus;
2317 phy_disconnect(dev->phydev);
2318 mdiobus_unregister(mii_bus);
2319 mdiobus_free(mii_bus);
2322 static int b44_init_one(struct ssb_device *sdev,
2323 const struct ssb_device_id *ent)
2325 struct net_device *dev;
2331 dev = alloc_etherdev(sizeof(*bp));
2337 SET_NETDEV_DEV(dev, sdev->dev);
2339 /* No interesting netdevice features in this card... */
2342 bp = netdev_priv(dev);
2345 bp->force_copybreak = 0;
2347 bp->msg_enable = netif_msg_init(b44_debug, B44_DEF_MSG_ENABLE);
2349 spin_lock_init(&bp->lock);
2350 u64_stats_init(&bp->hw_stats.syncp);
2352 bp->rx_pending = B44_DEF_RX_RING_PENDING;
2353 bp->tx_pending = B44_DEF_TX_RING_PENDING;
2355 dev->netdev_ops = &b44_netdev_ops;
2356 netif_napi_add(dev, &bp->napi, b44_poll);
2357 dev->watchdog_timeo = B44_TX_TIMEOUT;
2358 dev->min_mtu = B44_MIN_MTU;
2359 dev->max_mtu = B44_MAX_MTU;
2360 dev->irq = sdev->irq;
2361 dev->ethtool_ops = &b44_ethtool_ops;
2363 err = ssb_bus_powerup(sdev->bus, 0);
2366 "Failed to powerup the bus\n");
2367 goto err_out_free_dev;
2370 err = dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30));
2373 "Required 30BIT DMA mask unsupported by the system\n");
2374 goto err_out_powerdown;
2377 err = b44_get_invariants(bp);
2380 "Problem fetching invariants of chip, aborting\n");
2381 goto err_out_powerdown;
2384 if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) {
2385 dev_err(sdev->dev, "No PHY present on this MAC, aborting\n");
2387 goto err_out_powerdown;
2390 bp->mii_if.dev = dev;
2391 bp->mii_if.mdio_read = b44_mdio_read_mii;
2392 bp->mii_if.mdio_write = b44_mdio_write_mii;
2393 bp->mii_if.phy_id = bp->phy_addr;
2394 bp->mii_if.phy_id_mask = 0x1f;
2395 bp->mii_if.reg_num_mask = 0x1f;
2397 /* By default, advertise all speed/duplex settings. */
2398 bp->flags |= (B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL |
2399 B44_FLAG_ADV_100HALF | B44_FLAG_ADV_100FULL);
2401 /* By default, auto-negotiate PAUSE. */
2402 bp->flags |= B44_FLAG_PAUSE_AUTO;
2404 err = register_netdev(dev);
2406 dev_err(sdev->dev, "Cannot register net device, aborting\n");
2407 goto err_out_powerdown;
2410 netif_carrier_off(dev);
2412 ssb_set_drvdata(sdev, dev);
2414 /* Chip reset provides power to the b44 MAC & PCI cores, which
2415 * is necessary for MAC register access.
2417 b44_chip_reset(bp, B44_CHIP_RESET_FULL);
2419 /* do a phy reset to test if there is an active phy */
2420 err = b44_phy_reset(bp);
2422 dev_err(sdev->dev, "phy reset failed\n");
2423 goto err_out_unregister_netdev;
2426 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
2427 err = b44_register_phy_one(bp);
2429 dev_err(sdev->dev, "Cannot register PHY, aborting\n");
2430 goto err_out_unregister_netdev;
2434 device_set_wakeup_capable(sdev->dev, true);
2435 netdev_info(dev, "%s %pM\n", DRV_DESCRIPTION, dev->dev_addr);
2439 err_out_unregister_netdev:
2440 unregister_netdev(dev);
2442 ssb_bus_may_powerdown(sdev->bus);
2445 netif_napi_del(&bp->napi);
2452 static void b44_remove_one(struct ssb_device *sdev)
2454 struct net_device *dev = ssb_get_drvdata(sdev);
2455 struct b44 *bp = netdev_priv(dev);
2457 unregister_netdev(dev);
2458 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
2459 b44_unregister_phy_one(bp);
2460 ssb_device_disable(sdev, 0);
2461 ssb_bus_may_powerdown(sdev->bus);
2462 netif_napi_del(&bp->napi);
2464 ssb_pcihost_set_power_state(sdev, PCI_D3hot);
2465 ssb_set_drvdata(sdev, NULL);
2468 static int b44_suspend(struct ssb_device *sdev, pm_message_t state)
2470 struct net_device *dev = ssb_get_drvdata(sdev);
2471 struct b44 *bp = netdev_priv(dev);
2473 if (!netif_running(dev))
2476 del_timer_sync(&bp->timer);
2478 spin_lock_irq(&bp->lock);
2481 netif_carrier_off(bp->dev);
2482 netif_device_detach(bp->dev);
2485 spin_unlock_irq(&bp->lock);
2487 free_irq(dev->irq, dev);
2488 if (bp->flags & B44_FLAG_WOL_ENABLE) {
2489 b44_init_hw(bp, B44_PARTIAL_RESET);
2493 ssb_pcihost_set_power_state(sdev, PCI_D3hot);
2497 static int b44_resume(struct ssb_device *sdev)
2499 struct net_device *dev = ssb_get_drvdata(sdev);
2500 struct b44 *bp = netdev_priv(dev);
2503 rc = ssb_bus_powerup(sdev->bus, 0);
2506 "Failed to powerup the bus\n");
2510 if (!netif_running(dev))
2513 spin_lock_irq(&bp->lock);
2515 b44_init_hw(bp, B44_FULL_RESET);
2516 spin_unlock_irq(&bp->lock);
2519 * As a shared interrupt, the handler can be called immediately. To be
2520 * able to check the interrupt status the hardware must already be
2521 * powered back on (b44_init_hw).
2523 rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
2525 netdev_err(dev, "request_irq failed\n");
2526 spin_lock_irq(&bp->lock);
2529 spin_unlock_irq(&bp->lock);
2533 netif_device_attach(bp->dev);
2535 b44_enable_ints(bp);
2536 netif_wake_queue(dev);
2538 mod_timer(&bp->timer, jiffies + 1);
2543 static struct ssb_driver b44_ssb_driver = {
2544 .name = DRV_MODULE_NAME,
2545 .id_table = b44_ssb_tbl,
2546 .probe = b44_init_one,
2547 .remove = b44_remove_one,
2548 .suspend = b44_suspend,
2549 .resume = b44_resume,
2552 static inline int __init b44_pci_init(void)
2555 #ifdef CONFIG_B44_PCI
2556 err = ssb_pcihost_register(&b44_pci_driver);
2561 static inline void b44_pci_exit(void)
2563 #ifdef CONFIG_B44_PCI
2564 ssb_pcihost_unregister(&b44_pci_driver);
2568 static int __init b44_init(void)
2570 unsigned int dma_desc_align_size = dma_get_cache_alignment();
2573 /* Setup paramaters for syncing RX/TX DMA descriptors */
2574 dma_desc_sync_size = max_t(unsigned int, dma_desc_align_size, sizeof(struct dma_desc));
2576 err = b44_pci_init();
2579 err = ssb_driver_register(&b44_ssb_driver);
2585 static void __exit b44_cleanup(void)
2587 ssb_driver_unregister(&b44_ssb_driver);
2591 module_init(b44_init);
2592 module_exit(b44_cleanup);