Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[deliverable/linux.git] / drivers / net / b44.c
1 /* b44.c: Broadcom 4400 device driver.
2 *
3 * Copyright (C) 2002 David S. Miller (davem@redhat.com)
4 * Fixed by Pekka Pietikainen (pp@ee.oulu.fi)
5 * Copyright (C) 2006 Broadcom Corporation.
6 *
7 * Distribute under GPL.
8 */
9
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/moduleparam.h>
13 #include <linux/types.h>
14 #include <linux/netdevice.h>
15 #include <linux/ethtool.h>
16 #include <linux/mii.h>
17 #include <linux/if_ether.h>
18 #include <linux/etherdevice.h>
19 #include <linux/pci.h>
20 #include <linux/delay.h>
21 #include <linux/init.h>
22 #include <linux/dma-mapping.h>
23
24 #include <asm/uaccess.h>
25 #include <asm/io.h>
26 #include <asm/irq.h>
27
28 #include "b44.h"
29
30 #define DRV_MODULE_NAME "b44"
31 #define PFX DRV_MODULE_NAME ": "
32 #define DRV_MODULE_VERSION "1.01"
33 #define DRV_MODULE_RELDATE "Jun 16, 2006"
34
35 #define B44_DEF_MSG_ENABLE \
36 (NETIF_MSG_DRV | \
37 NETIF_MSG_PROBE | \
38 NETIF_MSG_LINK | \
39 NETIF_MSG_TIMER | \
40 NETIF_MSG_IFDOWN | \
41 NETIF_MSG_IFUP | \
42 NETIF_MSG_RX_ERR | \
43 NETIF_MSG_TX_ERR)
44
45 /* length of time before we decide the hardware is borked,
46 * and dev->tx_timeout() should be called to fix the problem
47 */
48 #define B44_TX_TIMEOUT (5 * HZ)
49
50 /* hardware minimum and maximum for a single frame's data payload */
51 #define B44_MIN_MTU 60
52 #define B44_MAX_MTU 1500
53
54 #define B44_RX_RING_SIZE 512
55 #define B44_DEF_RX_RING_PENDING 200
56 #define B44_RX_RING_BYTES (sizeof(struct dma_desc) * \
57 B44_RX_RING_SIZE)
58 #define B44_TX_RING_SIZE 512
59 #define B44_DEF_TX_RING_PENDING (B44_TX_RING_SIZE - 1)
60 #define B44_TX_RING_BYTES (sizeof(struct dma_desc) * \
61 B44_TX_RING_SIZE)
62 #define B44_DMA_MASK 0x3fffffff
63
64 #define TX_RING_GAP(BP) \
65 (B44_TX_RING_SIZE - (BP)->tx_pending)
66 #define TX_BUFFS_AVAIL(BP) \
67 (((BP)->tx_cons <= (BP)->tx_prod) ? \
68 (BP)->tx_cons + (BP)->tx_pending - (BP)->tx_prod : \
69 (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP))
70 #define NEXT_TX(N) (((N) + 1) & (B44_TX_RING_SIZE - 1))
71
72 #define RX_PKT_BUF_SZ (1536 + bp->rx_offset + 64)
73 #define TX_PKT_BUF_SZ (B44_MAX_MTU + ETH_HLEN + 8)
74
75 /* minimum number of free TX descriptors required to wake up TX process */
76 #define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4)
77
78 /* b44 internal pattern match filter info */
79 #define B44_PATTERN_BASE 0x400
80 #define B44_PATTERN_SIZE 0x80
81 #define B44_PMASK_BASE 0x600
82 #define B44_PMASK_SIZE 0x10
83 #define B44_MAX_PATTERNS 16
84 #define B44_ETHIPV6UDP_HLEN 62
85 #define B44_ETHIPV4UDP_HLEN 42
86
87 static char version[] __devinitdata =
88 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
89
90 MODULE_AUTHOR("Florian Schirmer, Pekka Pietikainen, David S. Miller");
91 MODULE_DESCRIPTION("Broadcom 4400 10/100 PCI ethernet driver");
92 MODULE_LICENSE("GPL");
93 MODULE_VERSION(DRV_MODULE_VERSION);
94
95 static int b44_debug = -1; /* -1 == use B44_DEF_MSG_ENABLE as value */
96 module_param(b44_debug, int, 0);
97 MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value");
98
99 static struct pci_device_id b44_pci_tbl[] = {
100 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401,
101 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
102 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B0,
103 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
104 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1,
105 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
106 { } /* terminate list with empty entry */
107 };
108
109 MODULE_DEVICE_TABLE(pci, b44_pci_tbl);
110
111 static void b44_halt(struct b44 *);
112 static void b44_init_rings(struct b44 *);
113
114 #define B44_FULL_RESET 1
115 #define B44_FULL_RESET_SKIP_PHY 2
116 #define B44_PARTIAL_RESET 3
117
118 static void b44_init_hw(struct b44 *, int);
119
120 static int dma_desc_align_mask;
121 static int dma_desc_sync_size;
122
123 static const char b44_gstrings[][ETH_GSTRING_LEN] = {
124 #define _B44(x...) # x,
125 B44_STAT_REG_DECLARE
126 #undef _B44
127 };
128
129 static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev,
130 dma_addr_t dma_base,
131 unsigned long offset,
132 enum dma_data_direction dir)
133 {
134 dma_sync_single_range_for_device(&pdev->dev, dma_base,
135 offset & dma_desc_align_mask,
136 dma_desc_sync_size, dir);
137 }
138
139 static inline void b44_sync_dma_desc_for_cpu(struct pci_dev *pdev,
140 dma_addr_t dma_base,
141 unsigned long offset,
142 enum dma_data_direction dir)
143 {
144 dma_sync_single_range_for_cpu(&pdev->dev, dma_base,
145 offset & dma_desc_align_mask,
146 dma_desc_sync_size, dir);
147 }
148
149 static inline unsigned long br32(const struct b44 *bp, unsigned long reg)
150 {
151 return readl(bp->regs + reg);
152 }
153
154 static inline void bw32(const struct b44 *bp,
155 unsigned long reg, unsigned long val)
156 {
157 writel(val, bp->regs + reg);
158 }
159
160 static int b44_wait_bit(struct b44 *bp, unsigned long reg,
161 u32 bit, unsigned long timeout, const int clear)
162 {
163 unsigned long i;
164
165 for (i = 0; i < timeout; i++) {
166 u32 val = br32(bp, reg);
167
168 if (clear && !(val & bit))
169 break;
170 if (!clear && (val & bit))
171 break;
172 udelay(10);
173 }
174 if (i == timeout) {
175 printk(KERN_ERR PFX "%s: BUG! Timeout waiting for bit %08x of register "
176 "%lx to %s.\n",
177 bp->dev->name,
178 bit, reg,
179 (clear ? "clear" : "set"));
180 return -ENODEV;
181 }
182 return 0;
183 }
184
185 /* Sonics SiliconBackplane support routines. ROFL, you should see all the
186 * buzz words used on this company's website :-)
187 *
188 * All of these routines must be invoked with bp->lock held and
189 * interrupts disabled.
190 */
191
192 #define SB_PCI_DMA 0x40000000 /* Client Mode PCI memory access space (1 GB) */
193 #define BCM4400_PCI_CORE_ADDR 0x18002000 /* Address of PCI core on BCM4400 cards */
194
195 static u32 ssb_get_core_rev(struct b44 *bp)
196 {
197 return (br32(bp, B44_SBIDHIGH) & SBIDHIGH_RC_MASK);
198 }
199
200 static u32 ssb_pci_setup(struct b44 *bp, u32 cores)
201 {
202 u32 bar_orig, pci_rev, val;
203
204 pci_read_config_dword(bp->pdev, SSB_BAR0_WIN, &bar_orig);
205 pci_write_config_dword(bp->pdev, SSB_BAR0_WIN, BCM4400_PCI_CORE_ADDR);
206 pci_rev = ssb_get_core_rev(bp);
207
208 val = br32(bp, B44_SBINTVEC);
209 val |= cores;
210 bw32(bp, B44_SBINTVEC, val);
211
212 val = br32(bp, SSB_PCI_TRANS_2);
213 val |= SSB_PCI_PREF | SSB_PCI_BURST;
214 bw32(bp, SSB_PCI_TRANS_2, val);
215
216 pci_write_config_dword(bp->pdev, SSB_BAR0_WIN, bar_orig);
217
218 return pci_rev;
219 }
220
221 static void ssb_core_disable(struct b44 *bp)
222 {
223 if (br32(bp, B44_SBTMSLOW) & SBTMSLOW_RESET)
224 return;
225
226 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_CLOCK));
227 b44_wait_bit(bp, B44_SBTMSLOW, SBTMSLOW_REJECT, 100000, 0);
228 b44_wait_bit(bp, B44_SBTMSHIGH, SBTMSHIGH_BUSY, 100000, 1);
229 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_FGC | SBTMSLOW_CLOCK |
230 SBTMSLOW_REJECT | SBTMSLOW_RESET));
231 br32(bp, B44_SBTMSLOW);
232 udelay(1);
233 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_RESET));
234 br32(bp, B44_SBTMSLOW);
235 udelay(1);
236 }
237
238 static void ssb_core_reset(struct b44 *bp)
239 {
240 u32 val;
241
242 ssb_core_disable(bp);
243 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_RESET | SBTMSLOW_CLOCK | SBTMSLOW_FGC));
244 br32(bp, B44_SBTMSLOW);
245 udelay(1);
246
247 /* Clear SERR if set, this is a hw bug workaround. */
248 if (br32(bp, B44_SBTMSHIGH) & SBTMSHIGH_SERR)
249 bw32(bp, B44_SBTMSHIGH, 0);
250
251 val = br32(bp, B44_SBIMSTATE);
252 if (val & (SBIMSTATE_IBE | SBIMSTATE_TO))
253 bw32(bp, B44_SBIMSTATE, val & ~(SBIMSTATE_IBE | SBIMSTATE_TO));
254
255 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_CLOCK | SBTMSLOW_FGC));
256 br32(bp, B44_SBTMSLOW);
257 udelay(1);
258
259 bw32(bp, B44_SBTMSLOW, (SBTMSLOW_CLOCK));
260 br32(bp, B44_SBTMSLOW);
261 udelay(1);
262 }
263
264 static int ssb_core_unit(struct b44 *bp)
265 {
266 #if 0
267 u32 val = br32(bp, B44_SBADMATCH0);
268 u32 base;
269
270 type = val & SBADMATCH0_TYPE_MASK;
271 switch (type) {
272 case 0:
273 base = val & SBADMATCH0_BS0_MASK;
274 break;
275
276 case 1:
277 base = val & SBADMATCH0_BS1_MASK;
278 break;
279
280 case 2:
281 default:
282 base = val & SBADMATCH0_BS2_MASK;
283 break;
284 };
285 #endif
286 return 0;
287 }
288
289 static int ssb_is_core_up(struct b44 *bp)
290 {
291 return ((br32(bp, B44_SBTMSLOW) & (SBTMSLOW_RESET | SBTMSLOW_REJECT | SBTMSLOW_CLOCK))
292 == SBTMSLOW_CLOCK);
293 }
294
295 static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index)
296 {
297 u32 val;
298
299 val = ((u32) data[2]) << 24;
300 val |= ((u32) data[3]) << 16;
301 val |= ((u32) data[4]) << 8;
302 val |= ((u32) data[5]) << 0;
303 bw32(bp, B44_CAM_DATA_LO, val);
304 val = (CAM_DATA_HI_VALID |
305 (((u32) data[0]) << 8) |
306 (((u32) data[1]) << 0));
307 bw32(bp, B44_CAM_DATA_HI, val);
308 bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE |
309 (index << CAM_CTRL_INDEX_SHIFT)));
310 b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1);
311 }
312
313 static inline void __b44_disable_ints(struct b44 *bp)
314 {
315 bw32(bp, B44_IMASK, 0);
316 }
317
318 static void b44_disable_ints(struct b44 *bp)
319 {
320 __b44_disable_ints(bp);
321
322 /* Flush posted writes. */
323 br32(bp, B44_IMASK);
324 }
325
326 static void b44_enable_ints(struct b44 *bp)
327 {
328 bw32(bp, B44_IMASK, bp->imask);
329 }
330
331 static int b44_readphy(struct b44 *bp, int reg, u32 *val)
332 {
333 int err;
334
335 bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
336 bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
337 (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
338 (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
339 (reg << MDIO_DATA_RA_SHIFT) |
340 (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
341 err = b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
342 *val = br32(bp, B44_MDIO_DATA) & MDIO_DATA_DATA;
343
344 return err;
345 }
346
347 static int b44_writephy(struct b44 *bp, int reg, u32 val)
348 {
349 bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
350 bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
351 (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
352 (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
353 (reg << MDIO_DATA_RA_SHIFT) |
354 (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT) |
355 (val & MDIO_DATA_DATA)));
356 return b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
357 }
358
359 /* miilib interface */
360 /* FIXME FIXME: phy_id is ignored, bp->phy_addr use is unconditional
361 * due to code existing before miilib use was added to this driver.
362 * Someone should remove this artificial driver limitation in
363 * b44_{read,write}phy. bp->phy_addr itself is fine (and needed).
364 */
365 static int b44_mii_read(struct net_device *dev, int phy_id, int location)
366 {
367 u32 val;
368 struct b44 *bp = netdev_priv(dev);
369 int rc = b44_readphy(bp, location, &val);
370 if (rc)
371 return 0xffffffff;
372 return val;
373 }
374
375 static void b44_mii_write(struct net_device *dev, int phy_id, int location,
376 int val)
377 {
378 struct b44 *bp = netdev_priv(dev);
379 b44_writephy(bp, location, val);
380 }
381
382 static int b44_phy_reset(struct b44 *bp)
383 {
384 u32 val;
385 int err;
386
387 err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
388 if (err)
389 return err;
390 udelay(100);
391 err = b44_readphy(bp, MII_BMCR, &val);
392 if (!err) {
393 if (val & BMCR_RESET) {
394 printk(KERN_ERR PFX "%s: PHY Reset would not complete.\n",
395 bp->dev->name);
396 err = -ENODEV;
397 }
398 }
399
400 return 0;
401 }
402
403 static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags)
404 {
405 u32 val;
406
407 bp->flags &= ~(B44_FLAG_TX_PAUSE | B44_FLAG_RX_PAUSE);
408 bp->flags |= pause_flags;
409
410 val = br32(bp, B44_RXCONFIG);
411 if (pause_flags & B44_FLAG_RX_PAUSE)
412 val |= RXCONFIG_FLOW;
413 else
414 val &= ~RXCONFIG_FLOW;
415 bw32(bp, B44_RXCONFIG, val);
416
417 val = br32(bp, B44_MAC_FLOW);
418 if (pause_flags & B44_FLAG_TX_PAUSE)
419 val |= (MAC_FLOW_PAUSE_ENAB |
420 (0xc0 & MAC_FLOW_RX_HI_WATER));
421 else
422 val &= ~MAC_FLOW_PAUSE_ENAB;
423 bw32(bp, B44_MAC_FLOW, val);
424 }
425
426 static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
427 {
428 u32 pause_enab = 0;
429
430 /* The driver supports only rx pause by default because
431 the b44 mac tx pause mechanism generates excessive
432 pause frames.
433 Use ethtool to turn on b44 tx pause if necessary.
434 */
435 if ((local & ADVERTISE_PAUSE_CAP) &&
436 (local & ADVERTISE_PAUSE_ASYM)){
437 if ((remote & LPA_PAUSE_ASYM) &&
438 !(remote & LPA_PAUSE_CAP))
439 pause_enab |= B44_FLAG_RX_PAUSE;
440 }
441
442 __b44_set_flow_ctrl(bp, pause_enab);
443 }
444
445 static int b44_setup_phy(struct b44 *bp)
446 {
447 u32 val;
448 int err;
449
450 if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0)
451 goto out;
452 if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
453 val & MII_ALEDCTRL_ALLMSK)) != 0)
454 goto out;
455 if ((err = b44_readphy(bp, B44_MII_TLEDCTRL, &val)) != 0)
456 goto out;
457 if ((err = b44_writephy(bp, B44_MII_TLEDCTRL,
458 val | MII_TLEDCTRL_ENABLE)) != 0)
459 goto out;
460
461 if (!(bp->flags & B44_FLAG_FORCE_LINK)) {
462 u32 adv = ADVERTISE_CSMA;
463
464 if (bp->flags & B44_FLAG_ADV_10HALF)
465 adv |= ADVERTISE_10HALF;
466 if (bp->flags & B44_FLAG_ADV_10FULL)
467 adv |= ADVERTISE_10FULL;
468 if (bp->flags & B44_FLAG_ADV_100HALF)
469 adv |= ADVERTISE_100HALF;
470 if (bp->flags & B44_FLAG_ADV_100FULL)
471 adv |= ADVERTISE_100FULL;
472
473 if (bp->flags & B44_FLAG_PAUSE_AUTO)
474 adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
475
476 if ((err = b44_writephy(bp, MII_ADVERTISE, adv)) != 0)
477 goto out;
478 if ((err = b44_writephy(bp, MII_BMCR, (BMCR_ANENABLE |
479 BMCR_ANRESTART))) != 0)
480 goto out;
481 } else {
482 u32 bmcr;
483
484 if ((err = b44_readphy(bp, MII_BMCR, &bmcr)) != 0)
485 goto out;
486 bmcr &= ~(BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_SPEED100);
487 if (bp->flags & B44_FLAG_100_BASE_T)
488 bmcr |= BMCR_SPEED100;
489 if (bp->flags & B44_FLAG_FULL_DUPLEX)
490 bmcr |= BMCR_FULLDPLX;
491 if ((err = b44_writephy(bp, MII_BMCR, bmcr)) != 0)
492 goto out;
493
494 /* Since we will not be negotiating there is no safe way
495 * to determine if the link partner supports flow control
496 * or not. So just disable it completely in this case.
497 */
498 b44_set_flow_ctrl(bp, 0, 0);
499 }
500
501 out:
502 return err;
503 }
504
505 static void b44_stats_update(struct b44 *bp)
506 {
507 unsigned long reg;
508 u32 *val;
509
510 val = &bp->hw_stats.tx_good_octets;
511 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) {
512 *val++ += br32(bp, reg);
513 }
514
515 /* Pad */
516 reg += 8*4UL;
517
518 for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) {
519 *val++ += br32(bp, reg);
520 }
521 }
522
523 static void b44_link_report(struct b44 *bp)
524 {
525 if (!netif_carrier_ok(bp->dev)) {
526 printk(KERN_INFO PFX "%s: Link is down.\n", bp->dev->name);
527 } else {
528 printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n",
529 bp->dev->name,
530 (bp->flags & B44_FLAG_100_BASE_T) ? 100 : 10,
531 (bp->flags & B44_FLAG_FULL_DUPLEX) ? "full" : "half");
532
533 printk(KERN_INFO PFX "%s: Flow control is %s for TX and "
534 "%s for RX.\n",
535 bp->dev->name,
536 (bp->flags & B44_FLAG_TX_PAUSE) ? "on" : "off",
537 (bp->flags & B44_FLAG_RX_PAUSE) ? "on" : "off");
538 }
539 }
540
541 static void b44_check_phy(struct b44 *bp)
542 {
543 u32 bmsr, aux;
544
545 if (!b44_readphy(bp, MII_BMSR, &bmsr) &&
546 !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
547 (bmsr != 0xffff)) {
548 if (aux & MII_AUXCTRL_SPEED)
549 bp->flags |= B44_FLAG_100_BASE_T;
550 else
551 bp->flags &= ~B44_FLAG_100_BASE_T;
552 if (aux & MII_AUXCTRL_DUPLEX)
553 bp->flags |= B44_FLAG_FULL_DUPLEX;
554 else
555 bp->flags &= ~B44_FLAG_FULL_DUPLEX;
556
557 if (!netif_carrier_ok(bp->dev) &&
558 (bmsr & BMSR_LSTATUS)) {
559 u32 val = br32(bp, B44_TX_CTRL);
560 u32 local_adv, remote_adv;
561
562 if (bp->flags & B44_FLAG_FULL_DUPLEX)
563 val |= TX_CTRL_DUPLEX;
564 else
565 val &= ~TX_CTRL_DUPLEX;
566 bw32(bp, B44_TX_CTRL, val);
567
568 if (!(bp->flags & B44_FLAG_FORCE_LINK) &&
569 !b44_readphy(bp, MII_ADVERTISE, &local_adv) &&
570 !b44_readphy(bp, MII_LPA, &remote_adv))
571 b44_set_flow_ctrl(bp, local_adv, remote_adv);
572
573 /* Link now up */
574 netif_carrier_on(bp->dev);
575 b44_link_report(bp);
576 } else if (netif_carrier_ok(bp->dev) && !(bmsr & BMSR_LSTATUS)) {
577 /* Link now down */
578 netif_carrier_off(bp->dev);
579 b44_link_report(bp);
580 }
581
582 if (bmsr & BMSR_RFAULT)
583 printk(KERN_WARNING PFX "%s: Remote fault detected in PHY\n",
584 bp->dev->name);
585 if (bmsr & BMSR_JCD)
586 printk(KERN_WARNING PFX "%s: Jabber detected in PHY\n",
587 bp->dev->name);
588 }
589 }
590
591 static void b44_timer(unsigned long __opaque)
592 {
593 struct b44 *bp = (struct b44 *) __opaque;
594
595 spin_lock_irq(&bp->lock);
596
597 b44_check_phy(bp);
598
599 b44_stats_update(bp);
600
601 spin_unlock_irq(&bp->lock);
602
603 bp->timer.expires = jiffies + HZ;
604 add_timer(&bp->timer);
605 }
606
607 static void b44_tx(struct b44 *bp)
608 {
609 u32 cur, cons;
610
611 cur = br32(bp, B44_DMATX_STAT) & DMATX_STAT_CDMASK;
612 cur /= sizeof(struct dma_desc);
613
614 /* XXX needs updating when NETIF_F_SG is supported */
615 for (cons = bp->tx_cons; cons != cur; cons = NEXT_TX(cons)) {
616 struct ring_info *rp = &bp->tx_buffers[cons];
617 struct sk_buff *skb = rp->skb;
618
619 BUG_ON(skb == NULL);
620
621 pci_unmap_single(bp->pdev,
622 pci_unmap_addr(rp, mapping),
623 skb->len,
624 PCI_DMA_TODEVICE);
625 rp->skb = NULL;
626 dev_kfree_skb_irq(skb);
627 }
628
629 bp->tx_cons = cons;
630 if (netif_queue_stopped(bp->dev) &&
631 TX_BUFFS_AVAIL(bp) > B44_TX_WAKEUP_THRESH)
632 netif_wake_queue(bp->dev);
633
634 bw32(bp, B44_GPTIMER, 0);
635 }
636
637 /* Works like this. This chip writes a 'struct rx_header" 30 bytes
638 * before the DMA address you give it. So we allocate 30 more bytes
639 * for the RX buffer, DMA map all of it, skb_reserve the 30 bytes, then
640 * point the chip at 30 bytes past where the rx_header will go.
641 */
642 static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
643 {
644 struct dma_desc *dp;
645 struct ring_info *src_map, *map;
646 struct rx_header *rh;
647 struct sk_buff *skb;
648 dma_addr_t mapping;
649 int dest_idx;
650 u32 ctrl;
651
652 src_map = NULL;
653 if (src_idx >= 0)
654 src_map = &bp->rx_buffers[src_idx];
655 dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1);
656 map = &bp->rx_buffers[dest_idx];
657 skb = dev_alloc_skb(RX_PKT_BUF_SZ);
658 if (skb == NULL)
659 return -ENOMEM;
660
661 mapping = pci_map_single(bp->pdev, skb->data,
662 RX_PKT_BUF_SZ,
663 PCI_DMA_FROMDEVICE);
664
665 /* Hardware bug work-around, the chip is unable to do PCI DMA
666 to/from anything above 1GB :-( */
667 if (dma_mapping_error(mapping) ||
668 mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) {
669 /* Sigh... */
670 if (!dma_mapping_error(mapping))
671 pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
672 dev_kfree_skb_any(skb);
673 skb = __dev_alloc_skb(RX_PKT_BUF_SZ,GFP_DMA);
674 if (skb == NULL)
675 return -ENOMEM;
676 mapping = pci_map_single(bp->pdev, skb->data,
677 RX_PKT_BUF_SZ,
678 PCI_DMA_FROMDEVICE);
679 if (dma_mapping_error(mapping) ||
680 mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) {
681 if (!dma_mapping_error(mapping))
682 pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
683 dev_kfree_skb_any(skb);
684 return -ENOMEM;
685 }
686 }
687
688 skb->dev = bp->dev;
689 skb_reserve(skb, bp->rx_offset);
690
691 rh = (struct rx_header *)
692 (skb->data - bp->rx_offset);
693 rh->len = 0;
694 rh->flags = 0;
695
696 map->skb = skb;
697 pci_unmap_addr_set(map, mapping, mapping);
698
699 if (src_map != NULL)
700 src_map->skb = NULL;
701
702 ctrl = (DESC_CTRL_LEN & (RX_PKT_BUF_SZ - bp->rx_offset));
703 if (dest_idx == (B44_RX_RING_SIZE - 1))
704 ctrl |= DESC_CTRL_EOT;
705
706 dp = &bp->rx_ring[dest_idx];
707 dp->ctrl = cpu_to_le32(ctrl);
708 dp->addr = cpu_to_le32((u32) mapping + bp->rx_offset + bp->dma_offset);
709
710 if (bp->flags & B44_FLAG_RX_RING_HACK)
711 b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
712 dest_idx * sizeof(dp),
713 DMA_BIDIRECTIONAL);
714
715 return RX_PKT_BUF_SZ;
716 }
717
718 static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
719 {
720 struct dma_desc *src_desc, *dest_desc;
721 struct ring_info *src_map, *dest_map;
722 struct rx_header *rh;
723 int dest_idx;
724 u32 ctrl;
725
726 dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1);
727 dest_desc = &bp->rx_ring[dest_idx];
728 dest_map = &bp->rx_buffers[dest_idx];
729 src_desc = &bp->rx_ring[src_idx];
730 src_map = &bp->rx_buffers[src_idx];
731
732 dest_map->skb = src_map->skb;
733 rh = (struct rx_header *) src_map->skb->data;
734 rh->len = 0;
735 rh->flags = 0;
736 pci_unmap_addr_set(dest_map, mapping,
737 pci_unmap_addr(src_map, mapping));
738
739 if (bp->flags & B44_FLAG_RX_RING_HACK)
740 b44_sync_dma_desc_for_cpu(bp->pdev, bp->rx_ring_dma,
741 src_idx * sizeof(src_desc),
742 DMA_BIDIRECTIONAL);
743
744 ctrl = src_desc->ctrl;
745 if (dest_idx == (B44_RX_RING_SIZE - 1))
746 ctrl |= cpu_to_le32(DESC_CTRL_EOT);
747 else
748 ctrl &= cpu_to_le32(~DESC_CTRL_EOT);
749
750 dest_desc->ctrl = ctrl;
751 dest_desc->addr = src_desc->addr;
752
753 src_map->skb = NULL;
754
755 if (bp->flags & B44_FLAG_RX_RING_HACK)
756 b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
757 dest_idx * sizeof(dest_desc),
758 DMA_BIDIRECTIONAL);
759
760 pci_dma_sync_single_for_device(bp->pdev, le32_to_cpu(src_desc->addr),
761 RX_PKT_BUF_SZ,
762 PCI_DMA_FROMDEVICE);
763 }
764
765 static int b44_rx(struct b44 *bp, int budget)
766 {
767 int received;
768 u32 cons, prod;
769
770 received = 0;
771 prod = br32(bp, B44_DMARX_STAT) & DMARX_STAT_CDMASK;
772 prod /= sizeof(struct dma_desc);
773 cons = bp->rx_cons;
774
775 while (cons != prod && budget > 0) {
776 struct ring_info *rp = &bp->rx_buffers[cons];
777 struct sk_buff *skb = rp->skb;
778 dma_addr_t map = pci_unmap_addr(rp, mapping);
779 struct rx_header *rh;
780 u16 len;
781
782 pci_dma_sync_single_for_cpu(bp->pdev, map,
783 RX_PKT_BUF_SZ,
784 PCI_DMA_FROMDEVICE);
785 rh = (struct rx_header *) skb->data;
786 len = cpu_to_le16(rh->len);
787 if ((len > (RX_PKT_BUF_SZ - bp->rx_offset)) ||
788 (rh->flags & cpu_to_le16(RX_FLAG_ERRORS))) {
789 drop_it:
790 b44_recycle_rx(bp, cons, bp->rx_prod);
791 drop_it_no_recycle:
792 bp->stats.rx_dropped++;
793 goto next_pkt;
794 }
795
796 if (len == 0) {
797 int i = 0;
798
799 do {
800 udelay(2);
801 barrier();
802 len = cpu_to_le16(rh->len);
803 } while (len == 0 && i++ < 5);
804 if (len == 0)
805 goto drop_it;
806 }
807
808 /* Omit CRC. */
809 len -= 4;
810
811 if (len > RX_COPY_THRESHOLD) {
812 int skb_size;
813 skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod);
814 if (skb_size < 0)
815 goto drop_it;
816 pci_unmap_single(bp->pdev, map,
817 skb_size, PCI_DMA_FROMDEVICE);
818 /* Leave out rx_header */
819 skb_put(skb, len+bp->rx_offset);
820 skb_pull(skb,bp->rx_offset);
821 } else {
822 struct sk_buff *copy_skb;
823
824 b44_recycle_rx(bp, cons, bp->rx_prod);
825 copy_skb = dev_alloc_skb(len + 2);
826 if (copy_skb == NULL)
827 goto drop_it_no_recycle;
828
829 copy_skb->dev = bp->dev;
830 skb_reserve(copy_skb, 2);
831 skb_put(copy_skb, len);
832 /* DMA sync done above, copy just the actual packet */
833 memcpy(copy_skb->data, skb->data+bp->rx_offset, len);
834
835 skb = copy_skb;
836 }
837 skb->ip_summed = CHECKSUM_NONE;
838 skb->protocol = eth_type_trans(skb, bp->dev);
839 netif_receive_skb(skb);
840 bp->dev->last_rx = jiffies;
841 received++;
842 budget--;
843 next_pkt:
844 bp->rx_prod = (bp->rx_prod + 1) &
845 (B44_RX_RING_SIZE - 1);
846 cons = (cons + 1) & (B44_RX_RING_SIZE - 1);
847 }
848
849 bp->rx_cons = cons;
850 bw32(bp, B44_DMARX_PTR, cons * sizeof(struct dma_desc));
851
852 return received;
853 }
854
855 static int b44_poll(struct net_device *netdev, int *budget)
856 {
857 struct b44 *bp = netdev_priv(netdev);
858 int done;
859
860 spin_lock_irq(&bp->lock);
861
862 if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
863 /* spin_lock(&bp->tx_lock); */
864 b44_tx(bp);
865 /* spin_unlock(&bp->tx_lock); */
866 }
867 spin_unlock_irq(&bp->lock);
868
869 done = 1;
870 if (bp->istat & ISTAT_RX) {
871 int orig_budget = *budget;
872 int work_done;
873
874 if (orig_budget > netdev->quota)
875 orig_budget = netdev->quota;
876
877 work_done = b44_rx(bp, orig_budget);
878
879 *budget -= work_done;
880 netdev->quota -= work_done;
881
882 if (work_done >= orig_budget)
883 done = 0;
884 }
885
886 if (bp->istat & ISTAT_ERRORS) {
887 unsigned long flags;
888
889 spin_lock_irqsave(&bp->lock, flags);
890 b44_halt(bp);
891 b44_init_rings(bp);
892 b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
893 netif_wake_queue(bp->dev);
894 spin_unlock_irqrestore(&bp->lock, flags);
895 done = 1;
896 }
897
898 if (done) {
899 netif_rx_complete(netdev);
900 b44_enable_ints(bp);
901 }
902
903 return (done ? 0 : 1);
904 }
905
906 static irqreturn_t b44_interrupt(int irq, void *dev_id)
907 {
908 struct net_device *dev = dev_id;
909 struct b44 *bp = netdev_priv(dev);
910 u32 istat, imask;
911 int handled = 0;
912
913 spin_lock(&bp->lock);
914
915 istat = br32(bp, B44_ISTAT);
916 imask = br32(bp, B44_IMASK);
917
918 /* The interrupt mask register controls which interrupt bits
919 * will actually raise an interrupt to the CPU when set by hw/firmware,
920 * but doesn't mask off the bits.
921 */
922 istat &= imask;
923 if (istat) {
924 handled = 1;
925
926 if (unlikely(!netif_running(dev))) {
927 printk(KERN_INFO "%s: late interrupt.\n", dev->name);
928 goto irq_ack;
929 }
930
931 if (netif_rx_schedule_prep(dev)) {
932 /* NOTE: These writes are posted by the readback of
933 * the ISTAT register below.
934 */
935 bp->istat = istat;
936 __b44_disable_ints(bp);
937 __netif_rx_schedule(dev);
938 } else {
939 printk(KERN_ERR PFX "%s: Error, poll already scheduled\n",
940 dev->name);
941 }
942
943 irq_ack:
944 bw32(bp, B44_ISTAT, istat);
945 br32(bp, B44_ISTAT);
946 }
947 spin_unlock(&bp->lock);
948 return IRQ_RETVAL(handled);
949 }
950
951 static void b44_tx_timeout(struct net_device *dev)
952 {
953 struct b44 *bp = netdev_priv(dev);
954
955 printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
956 dev->name);
957
958 spin_lock_irq(&bp->lock);
959
960 b44_halt(bp);
961 b44_init_rings(bp);
962 b44_init_hw(bp, B44_FULL_RESET);
963
964 spin_unlock_irq(&bp->lock);
965
966 b44_enable_ints(bp);
967
968 netif_wake_queue(dev);
969 }
970
971 static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
972 {
973 struct b44 *bp = netdev_priv(dev);
974 struct sk_buff *bounce_skb;
975 int rc = NETDEV_TX_OK;
976 dma_addr_t mapping;
977 u32 len, entry, ctrl;
978
979 len = skb->len;
980 spin_lock_irq(&bp->lock);
981
982 /* This is a hard error, log it. */
983 if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) {
984 netif_stop_queue(dev);
985 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
986 dev->name);
987 goto err_out;
988 }
989
990 mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
991 if (dma_mapping_error(mapping) || mapping + len > B44_DMA_MASK) {
992 /* Chip can't handle DMA to/from >1GB, use bounce buffer */
993 if (!dma_mapping_error(mapping))
994 pci_unmap_single(bp->pdev, mapping, len, PCI_DMA_TODEVICE);
995
996 bounce_skb = __dev_alloc_skb(TX_PKT_BUF_SZ,
997 GFP_ATOMIC|GFP_DMA);
998 if (!bounce_skb)
999 goto err_out;
1000
1001 mapping = pci_map_single(bp->pdev, bounce_skb->data,
1002 len, PCI_DMA_TODEVICE);
1003 if (dma_mapping_error(mapping) || mapping + len > B44_DMA_MASK) {
1004 if (!dma_mapping_error(mapping))
1005 pci_unmap_single(bp->pdev, mapping,
1006 len, PCI_DMA_TODEVICE);
1007 dev_kfree_skb_any(bounce_skb);
1008 goto err_out;
1009 }
1010
1011 memcpy(skb_put(bounce_skb, len), skb->data, skb->len);
1012 dev_kfree_skb_any(skb);
1013 skb = bounce_skb;
1014 }
1015
1016 entry = bp->tx_prod;
1017 bp->tx_buffers[entry].skb = skb;
1018 pci_unmap_addr_set(&bp->tx_buffers[entry], mapping, mapping);
1019
1020 ctrl = (len & DESC_CTRL_LEN);
1021 ctrl |= DESC_CTRL_IOC | DESC_CTRL_SOF | DESC_CTRL_EOF;
1022 if (entry == (B44_TX_RING_SIZE - 1))
1023 ctrl |= DESC_CTRL_EOT;
1024
1025 bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl);
1026 bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset);
1027
1028 if (bp->flags & B44_FLAG_TX_RING_HACK)
1029 b44_sync_dma_desc_for_device(bp->pdev, bp->tx_ring_dma,
1030 entry * sizeof(bp->tx_ring[0]),
1031 DMA_TO_DEVICE);
1032
1033 entry = NEXT_TX(entry);
1034
1035 bp->tx_prod = entry;
1036
1037 wmb();
1038
1039 bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
1040 if (bp->flags & B44_FLAG_BUGGY_TXPTR)
1041 bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
1042 if (bp->flags & B44_FLAG_REORDER_BUG)
1043 br32(bp, B44_DMATX_PTR);
1044
1045 if (TX_BUFFS_AVAIL(bp) < 1)
1046 netif_stop_queue(dev);
1047
1048 dev->trans_start = jiffies;
1049
1050 out_unlock:
1051 spin_unlock_irq(&bp->lock);
1052
1053 return rc;
1054
1055 err_out:
1056 rc = NETDEV_TX_BUSY;
1057 goto out_unlock;
1058 }
1059
1060 static int b44_change_mtu(struct net_device *dev, int new_mtu)
1061 {
1062 struct b44 *bp = netdev_priv(dev);
1063
1064 if (new_mtu < B44_MIN_MTU || new_mtu > B44_MAX_MTU)
1065 return -EINVAL;
1066
1067 if (!netif_running(dev)) {
1068 /* We'll just catch it later when the
1069 * device is up'd.
1070 */
1071 dev->mtu = new_mtu;
1072 return 0;
1073 }
1074
1075 spin_lock_irq(&bp->lock);
1076 b44_halt(bp);
1077 dev->mtu = new_mtu;
1078 b44_init_rings(bp);
1079 b44_init_hw(bp, B44_FULL_RESET);
1080 spin_unlock_irq(&bp->lock);
1081
1082 b44_enable_ints(bp);
1083
1084 return 0;
1085 }
1086
1087 /* Free up pending packets in all rx/tx rings.
1088 *
1089 * The chip has been shut down and the driver detached from
1090 * the networking, so no interrupts or new tx packets will
1091 * end up in the driver. bp->lock is not held and we are not
1092 * in an interrupt context and thus may sleep.
1093 */
1094 static void b44_free_rings(struct b44 *bp)
1095 {
1096 struct ring_info *rp;
1097 int i;
1098
1099 for (i = 0; i < B44_RX_RING_SIZE; i++) {
1100 rp = &bp->rx_buffers[i];
1101
1102 if (rp->skb == NULL)
1103 continue;
1104 pci_unmap_single(bp->pdev,
1105 pci_unmap_addr(rp, mapping),
1106 RX_PKT_BUF_SZ,
1107 PCI_DMA_FROMDEVICE);
1108 dev_kfree_skb_any(rp->skb);
1109 rp->skb = NULL;
1110 }
1111
1112 /* XXX needs changes once NETIF_F_SG is set... */
1113 for (i = 0; i < B44_TX_RING_SIZE; i++) {
1114 rp = &bp->tx_buffers[i];
1115
1116 if (rp->skb == NULL)
1117 continue;
1118 pci_unmap_single(bp->pdev,
1119 pci_unmap_addr(rp, mapping),
1120 rp->skb->len,
1121 PCI_DMA_TODEVICE);
1122 dev_kfree_skb_any(rp->skb);
1123 rp->skb = NULL;
1124 }
1125 }
1126
1127 /* Initialize tx/rx rings for packet processing.
1128 *
1129 * The chip has been shut down and the driver detached from
1130 * the networking, so no interrupts or new tx packets will
1131 * end up in the driver.
1132 */
1133 static void b44_init_rings(struct b44 *bp)
1134 {
1135 int i;
1136
1137 b44_free_rings(bp);
1138
1139 memset(bp->rx_ring, 0, B44_RX_RING_BYTES);
1140 memset(bp->tx_ring, 0, B44_TX_RING_BYTES);
1141
1142 if (bp->flags & B44_FLAG_RX_RING_HACK)
1143 dma_sync_single_for_device(&bp->pdev->dev, bp->rx_ring_dma,
1144 DMA_TABLE_BYTES,
1145 PCI_DMA_BIDIRECTIONAL);
1146
1147 if (bp->flags & B44_FLAG_TX_RING_HACK)
1148 dma_sync_single_for_device(&bp->pdev->dev, bp->tx_ring_dma,
1149 DMA_TABLE_BYTES,
1150 PCI_DMA_TODEVICE);
1151
1152 for (i = 0; i < bp->rx_pending; i++) {
1153 if (b44_alloc_rx_skb(bp, -1, i) < 0)
1154 break;
1155 }
1156 }
1157
1158 /*
1159 * Must not be invoked with interrupt sources disabled and
1160 * the hardware shutdown down.
1161 */
1162 static void b44_free_consistent(struct b44 *bp)
1163 {
1164 kfree(bp->rx_buffers);
1165 bp->rx_buffers = NULL;
1166 kfree(bp->tx_buffers);
1167 bp->tx_buffers = NULL;
1168 if (bp->rx_ring) {
1169 if (bp->flags & B44_FLAG_RX_RING_HACK) {
1170 dma_unmap_single(&bp->pdev->dev, bp->rx_ring_dma,
1171 DMA_TABLE_BYTES,
1172 DMA_BIDIRECTIONAL);
1173 kfree(bp->rx_ring);
1174 } else
1175 pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
1176 bp->rx_ring, bp->rx_ring_dma);
1177 bp->rx_ring = NULL;
1178 bp->flags &= ~B44_FLAG_RX_RING_HACK;
1179 }
1180 if (bp->tx_ring) {
1181 if (bp->flags & B44_FLAG_TX_RING_HACK) {
1182 dma_unmap_single(&bp->pdev->dev, bp->tx_ring_dma,
1183 DMA_TABLE_BYTES,
1184 DMA_TO_DEVICE);
1185 kfree(bp->tx_ring);
1186 } else
1187 pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
1188 bp->tx_ring, bp->tx_ring_dma);
1189 bp->tx_ring = NULL;
1190 bp->flags &= ~B44_FLAG_TX_RING_HACK;
1191 }
1192 }
1193
1194 /*
1195 * Must not be invoked with interrupt sources disabled and
1196 * the hardware shutdown down. Can sleep.
1197 */
1198 static int b44_alloc_consistent(struct b44 *bp)
1199 {
1200 int size;
1201
1202 size = B44_RX_RING_SIZE * sizeof(struct ring_info);
1203 bp->rx_buffers = kzalloc(size, GFP_KERNEL);
1204 if (!bp->rx_buffers)
1205 goto out_err;
1206
1207 size = B44_TX_RING_SIZE * sizeof(struct ring_info);
1208 bp->tx_buffers = kzalloc(size, GFP_KERNEL);
1209 if (!bp->tx_buffers)
1210 goto out_err;
1211
1212 size = DMA_TABLE_BYTES;
1213 bp->rx_ring = pci_alloc_consistent(bp->pdev, size, &bp->rx_ring_dma);
1214 if (!bp->rx_ring) {
1215 /* Allocation may have failed due to pci_alloc_consistent
1216 insisting on use of GFP_DMA, which is more restrictive
1217 than necessary... */
1218 struct dma_desc *rx_ring;
1219 dma_addr_t rx_ring_dma;
1220
1221 rx_ring = kzalloc(size, GFP_KERNEL);
1222 if (!rx_ring)
1223 goto out_err;
1224
1225 rx_ring_dma = dma_map_single(&bp->pdev->dev, rx_ring,
1226 DMA_TABLE_BYTES,
1227 DMA_BIDIRECTIONAL);
1228
1229 if (dma_mapping_error(rx_ring_dma) ||
1230 rx_ring_dma + size > B44_DMA_MASK) {
1231 kfree(rx_ring);
1232 goto out_err;
1233 }
1234
1235 bp->rx_ring = rx_ring;
1236 bp->rx_ring_dma = rx_ring_dma;
1237 bp->flags |= B44_FLAG_RX_RING_HACK;
1238 }
1239
1240 bp->tx_ring = pci_alloc_consistent(bp->pdev, size, &bp->tx_ring_dma);
1241 if (!bp->tx_ring) {
1242 /* Allocation may have failed due to pci_alloc_consistent
1243 insisting on use of GFP_DMA, which is more restrictive
1244 than necessary... */
1245 struct dma_desc *tx_ring;
1246 dma_addr_t tx_ring_dma;
1247
1248 tx_ring = kzalloc(size, GFP_KERNEL);
1249 if (!tx_ring)
1250 goto out_err;
1251
1252 tx_ring_dma = dma_map_single(&bp->pdev->dev, tx_ring,
1253 DMA_TABLE_BYTES,
1254 DMA_TO_DEVICE);
1255
1256 if (dma_mapping_error(tx_ring_dma) ||
1257 tx_ring_dma + size > B44_DMA_MASK) {
1258 kfree(tx_ring);
1259 goto out_err;
1260 }
1261
1262 bp->tx_ring = tx_ring;
1263 bp->tx_ring_dma = tx_ring_dma;
1264 bp->flags |= B44_FLAG_TX_RING_HACK;
1265 }
1266
1267 return 0;
1268
1269 out_err:
1270 b44_free_consistent(bp);
1271 return -ENOMEM;
1272 }
1273
1274 /* bp->lock is held. */
1275 static void b44_clear_stats(struct b44 *bp)
1276 {
1277 unsigned long reg;
1278
1279 bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
1280 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL)
1281 br32(bp, reg);
1282 for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL)
1283 br32(bp, reg);
1284 }
1285
1286 /* bp->lock is held. */
1287 static void b44_chip_reset(struct b44 *bp)
1288 {
1289 if (ssb_is_core_up(bp)) {
1290 bw32(bp, B44_RCV_LAZY, 0);
1291 bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
1292 b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 100, 1);
1293 bw32(bp, B44_DMATX_CTRL, 0);
1294 bp->tx_prod = bp->tx_cons = 0;
1295 if (br32(bp, B44_DMARX_STAT) & DMARX_STAT_EMASK) {
1296 b44_wait_bit(bp, B44_DMARX_STAT, DMARX_STAT_SIDLE,
1297 100, 0);
1298 }
1299 bw32(bp, B44_DMARX_CTRL, 0);
1300 bp->rx_prod = bp->rx_cons = 0;
1301 } else {
1302 ssb_pci_setup(bp, (bp->core_unit == 0 ?
1303 SBINTVEC_ENET0 :
1304 SBINTVEC_ENET1));
1305 }
1306
1307 ssb_core_reset(bp);
1308
1309 b44_clear_stats(bp);
1310
1311 /* Make PHY accessible. */
1312 bw32(bp, B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
1313 (0x0d & MDIO_CTRL_MAXF_MASK)));
1314 br32(bp, B44_MDIO_CTRL);
1315
1316 if (!(br32(bp, B44_DEVCTRL) & DEVCTRL_IPP)) {
1317 bw32(bp, B44_ENET_CTRL, ENET_CTRL_EPSEL);
1318 br32(bp, B44_ENET_CTRL);
1319 bp->flags &= ~B44_FLAG_INTERNAL_PHY;
1320 } else {
1321 u32 val = br32(bp, B44_DEVCTRL);
1322
1323 if (val & DEVCTRL_EPR) {
1324 bw32(bp, B44_DEVCTRL, (val & ~DEVCTRL_EPR));
1325 br32(bp, B44_DEVCTRL);
1326 udelay(100);
1327 }
1328 bp->flags |= B44_FLAG_INTERNAL_PHY;
1329 }
1330 }
1331
1332 /* bp->lock is held. */
1333 static void b44_halt(struct b44 *bp)
1334 {
1335 b44_disable_ints(bp);
1336 b44_chip_reset(bp);
1337 }
1338
1339 /* bp->lock is held. */
1340 static void __b44_set_mac_addr(struct b44 *bp)
1341 {
1342 bw32(bp, B44_CAM_CTRL, 0);
1343 if (!(bp->dev->flags & IFF_PROMISC)) {
1344 u32 val;
1345
1346 __b44_cam_write(bp, bp->dev->dev_addr, 0);
1347 val = br32(bp, B44_CAM_CTRL);
1348 bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
1349 }
1350 }
1351
1352 static int b44_set_mac_addr(struct net_device *dev, void *p)
1353 {
1354 struct b44 *bp = netdev_priv(dev);
1355 struct sockaddr *addr = p;
1356
1357 if (netif_running(dev))
1358 return -EBUSY;
1359
1360 if (!is_valid_ether_addr(addr->sa_data))
1361 return -EINVAL;
1362
1363 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1364
1365 spin_lock_irq(&bp->lock);
1366 __b44_set_mac_addr(bp);
1367 spin_unlock_irq(&bp->lock);
1368
1369 return 0;
1370 }
1371
1372 /* Called at device open time to get the chip ready for
1373 * packet processing. Invoked with bp->lock held.
1374 */
1375 static void __b44_set_rx_mode(struct net_device *);
1376 static void b44_init_hw(struct b44 *bp, int reset_kind)
1377 {
1378 u32 val;
1379
1380 b44_chip_reset(bp);
1381 if (reset_kind == B44_FULL_RESET) {
1382 b44_phy_reset(bp);
1383 b44_setup_phy(bp);
1384 }
1385
1386 /* Enable CRC32, set proper LED modes and power on PHY */
1387 bw32(bp, B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL);
1388 bw32(bp, B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT));
1389
1390 /* This sets the MAC address too. */
1391 __b44_set_rx_mode(bp->dev);
1392
1393 /* MTU + eth header + possible VLAN tag + struct rx_header */
1394 bw32(bp, B44_RXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
1395 bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
1396
1397 bw32(bp, B44_TX_WMARK, 56); /* XXX magic */
1398 if (reset_kind == B44_PARTIAL_RESET) {
1399 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1400 (bp->rx_offset << DMARX_CTRL_ROSHIFT)));
1401 } else {
1402 bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
1403 bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
1404 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1405 (bp->rx_offset << DMARX_CTRL_ROSHIFT)));
1406 bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);
1407
1408 bw32(bp, B44_DMARX_PTR, bp->rx_pending);
1409 bp->rx_prod = bp->rx_pending;
1410
1411 bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
1412 }
1413
1414 val = br32(bp, B44_ENET_CTRL);
1415 bw32(bp, B44_ENET_CTRL, (val | ENET_CTRL_ENABLE));
1416 }
1417
1418 static int b44_open(struct net_device *dev)
1419 {
1420 struct b44 *bp = netdev_priv(dev);
1421 int err;
1422
1423 err = b44_alloc_consistent(bp);
1424 if (err)
1425 goto out;
1426
1427 b44_init_rings(bp);
1428 b44_init_hw(bp, B44_FULL_RESET);
1429
1430 b44_check_phy(bp);
1431
1432 err = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
1433 if (unlikely(err < 0)) {
1434 b44_chip_reset(bp);
1435 b44_free_rings(bp);
1436 b44_free_consistent(bp);
1437 goto out;
1438 }
1439
1440 init_timer(&bp->timer);
1441 bp->timer.expires = jiffies + HZ;
1442 bp->timer.data = (unsigned long) bp;
1443 bp->timer.function = b44_timer;
1444 add_timer(&bp->timer);
1445
1446 b44_enable_ints(bp);
1447 netif_start_queue(dev);
1448 out:
1449 return err;
1450 }
1451
1452 #if 0
1453 /*static*/ void b44_dump_state(struct b44 *bp)
1454 {
1455 u32 val32, val32_2, val32_3, val32_4, val32_5;
1456 u16 val16;
1457
1458 pci_read_config_word(bp->pdev, PCI_STATUS, &val16);
1459 printk("DEBUG: PCI status [%04x] \n", val16);
1460
1461 }
1462 #endif
1463
1464 #ifdef CONFIG_NET_POLL_CONTROLLER
1465 /*
1466 * Polling receive - used by netconsole and other diagnostic tools
1467 * to allow network i/o with interrupts disabled.
1468 */
1469 static void b44_poll_controller(struct net_device *dev)
1470 {
1471 disable_irq(dev->irq);
1472 b44_interrupt(dev->irq, dev);
1473 enable_irq(dev->irq);
1474 }
1475 #endif
1476
1477 static void bwfilter_table(struct b44 *bp, u8 *pp, u32 bytes, u32 table_offset)
1478 {
1479 u32 i;
1480 u32 *pattern = (u32 *) pp;
1481
1482 for (i = 0; i < bytes; i += sizeof(u32)) {
1483 bw32(bp, B44_FILT_ADDR, table_offset + i);
1484 bw32(bp, B44_FILT_DATA, pattern[i / sizeof(u32)]);
1485 }
1486 }
1487
1488 static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)
1489 {
1490 int magicsync = 6;
1491 int k, j, len = offset;
1492 int ethaddr_bytes = ETH_ALEN;
1493
1494 memset(ppattern + offset, 0xff, magicsync);
1495 for (j = 0; j < magicsync; j++)
1496 set_bit(len++, (unsigned long *) pmask);
1497
1498 for (j = 0; j < B44_MAX_PATTERNS; j++) {
1499 if ((B44_PATTERN_SIZE - len) >= ETH_ALEN)
1500 ethaddr_bytes = ETH_ALEN;
1501 else
1502 ethaddr_bytes = B44_PATTERN_SIZE - len;
1503 if (ethaddr_bytes <=0)
1504 break;
1505 for (k = 0; k< ethaddr_bytes; k++) {
1506 ppattern[offset + magicsync +
1507 (j * ETH_ALEN) + k] = macaddr[k];
1508 len++;
1509 set_bit(len, (unsigned long *) pmask);
1510 }
1511 }
1512 return len - 1;
1513 }
1514
1515 /* Setup magic packet patterns in the b44 WOL
1516 * pattern matching filter.
1517 */
1518 static void b44_setup_pseudo_magicp(struct b44 *bp)
1519 {
1520
1521 u32 val;
1522 int plen0, plen1, plen2;
1523 u8 *pwol_pattern;
1524 u8 pwol_mask[B44_PMASK_SIZE];
1525
1526 pwol_pattern = kmalloc(B44_PATTERN_SIZE, GFP_KERNEL);
1527 if (!pwol_pattern) {
1528 printk(KERN_ERR PFX "Memory not available for WOL\n");
1529 return;
1530 }
1531
1532 /* Ipv4 magic packet pattern - pattern 0.*/
1533 memset(pwol_pattern, 0, B44_PATTERN_SIZE);
1534 memset(pwol_mask, 0, B44_PMASK_SIZE);
1535 plen0 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1536 B44_ETHIPV4UDP_HLEN);
1537
1538 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, B44_PATTERN_BASE);
1539 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE, B44_PMASK_BASE);
1540
1541 /* Raw ethernet II magic packet pattern - pattern 1 */
1542 memset(pwol_pattern, 0, B44_PATTERN_SIZE);
1543 memset(pwol_mask, 0, B44_PMASK_SIZE);
1544 plen1 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1545 ETH_HLEN);
1546
1547 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE,
1548 B44_PATTERN_BASE + B44_PATTERN_SIZE);
1549 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE,
1550 B44_PMASK_BASE + B44_PMASK_SIZE);
1551
1552 /* Ipv6 magic packet pattern - pattern 2 */
1553 memset(pwol_pattern, 0, B44_PATTERN_SIZE);
1554 memset(pwol_mask, 0, B44_PMASK_SIZE);
1555 plen2 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
1556 B44_ETHIPV6UDP_HLEN);
1557
1558 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE,
1559 B44_PATTERN_BASE + B44_PATTERN_SIZE + B44_PATTERN_SIZE);
1560 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE,
1561 B44_PMASK_BASE + B44_PMASK_SIZE + B44_PMASK_SIZE);
1562
1563 kfree(pwol_pattern);
1564
1565 /* set these pattern's lengths: one less than each real length */
1566 val = plen0 | (plen1 << 8) | (plen2 << 16) | WKUP_LEN_ENABLE_THREE;
1567 bw32(bp, B44_WKUP_LEN, val);
1568
1569 /* enable wakeup pattern matching */
1570 val = br32(bp, B44_DEVCTRL);
1571 bw32(bp, B44_DEVCTRL, val | DEVCTRL_PFE);
1572
1573 }
1574
1575 static void b44_setup_wol(struct b44 *bp)
1576 {
1577 u32 val;
1578 u16 pmval;
1579
1580 bw32(bp, B44_RXCONFIG, RXCONFIG_ALLMULTI);
1581
1582 if (bp->flags & B44_FLAG_B0_ANDLATER) {
1583
1584 bw32(bp, B44_WKUP_LEN, WKUP_LEN_DISABLE);
1585
1586 val = bp->dev->dev_addr[2] << 24 |
1587 bp->dev->dev_addr[3] << 16 |
1588 bp->dev->dev_addr[4] << 8 |
1589 bp->dev->dev_addr[5];
1590 bw32(bp, B44_ADDR_LO, val);
1591
1592 val = bp->dev->dev_addr[0] << 8 |
1593 bp->dev->dev_addr[1];
1594 bw32(bp, B44_ADDR_HI, val);
1595
1596 val = br32(bp, B44_DEVCTRL);
1597 bw32(bp, B44_DEVCTRL, val | DEVCTRL_MPM | DEVCTRL_PFE);
1598
1599 } else {
1600 b44_setup_pseudo_magicp(bp);
1601 }
1602
1603 val = br32(bp, B44_SBTMSLOW);
1604 bw32(bp, B44_SBTMSLOW, val | SBTMSLOW_PE);
1605
1606 pci_read_config_word(bp->pdev, SSB_PMCSR, &pmval);
1607 pci_write_config_word(bp->pdev, SSB_PMCSR, pmval | SSB_PE);
1608
1609 }
1610
1611 static int b44_close(struct net_device *dev)
1612 {
1613 struct b44 *bp = netdev_priv(dev);
1614
1615 netif_stop_queue(dev);
1616
1617 netif_poll_disable(dev);
1618
1619 del_timer_sync(&bp->timer);
1620
1621 spin_lock_irq(&bp->lock);
1622
1623 #if 0
1624 b44_dump_state(bp);
1625 #endif
1626 b44_halt(bp);
1627 b44_free_rings(bp);
1628 netif_carrier_off(dev);
1629
1630 spin_unlock_irq(&bp->lock);
1631
1632 free_irq(dev->irq, dev);
1633
1634 netif_poll_enable(dev);
1635
1636 if (bp->flags & B44_FLAG_WOL_ENABLE) {
1637 b44_init_hw(bp, B44_PARTIAL_RESET);
1638 b44_setup_wol(bp);
1639 }
1640
1641 b44_free_consistent(bp);
1642
1643 return 0;
1644 }
1645
1646 static struct net_device_stats *b44_get_stats(struct net_device *dev)
1647 {
1648 struct b44 *bp = netdev_priv(dev);
1649 struct net_device_stats *nstat = &bp->stats;
1650 struct b44_hw_stats *hwstat = &bp->hw_stats;
1651
1652 /* Convert HW stats into netdevice stats. */
1653 nstat->rx_packets = hwstat->rx_pkts;
1654 nstat->tx_packets = hwstat->tx_pkts;
1655 nstat->rx_bytes = hwstat->rx_octets;
1656 nstat->tx_bytes = hwstat->tx_octets;
1657 nstat->tx_errors = (hwstat->tx_jabber_pkts +
1658 hwstat->tx_oversize_pkts +
1659 hwstat->tx_underruns +
1660 hwstat->tx_excessive_cols +
1661 hwstat->tx_late_cols);
1662 nstat->multicast = hwstat->tx_multicast_pkts;
1663 nstat->collisions = hwstat->tx_total_cols;
1664
1665 nstat->rx_length_errors = (hwstat->rx_oversize_pkts +
1666 hwstat->rx_undersize);
1667 nstat->rx_over_errors = hwstat->rx_missed_pkts;
1668 nstat->rx_frame_errors = hwstat->rx_align_errs;
1669 nstat->rx_crc_errors = hwstat->rx_crc_errs;
1670 nstat->rx_errors = (hwstat->rx_jabber_pkts +
1671 hwstat->rx_oversize_pkts +
1672 hwstat->rx_missed_pkts +
1673 hwstat->rx_crc_align_errs +
1674 hwstat->rx_undersize +
1675 hwstat->rx_crc_errs +
1676 hwstat->rx_align_errs +
1677 hwstat->rx_symbol_errs);
1678
1679 nstat->tx_aborted_errors = hwstat->tx_underruns;
1680 #if 0
1681 /* Carrier lost counter seems to be broken for some devices */
1682 nstat->tx_carrier_errors = hwstat->tx_carrier_lost;
1683 #endif
1684
1685 return nstat;
1686 }
1687
1688 static int __b44_load_mcast(struct b44 *bp, struct net_device *dev)
1689 {
1690 struct dev_mc_list *mclist;
1691 int i, num_ents;
1692
1693 num_ents = min_t(int, dev->mc_count, B44_MCAST_TABLE_SIZE);
1694 mclist = dev->mc_list;
1695 for (i = 0; mclist && i < num_ents; i++, mclist = mclist->next) {
1696 __b44_cam_write(bp, mclist->dmi_addr, i + 1);
1697 }
1698 return i+1;
1699 }
1700
1701 static void __b44_set_rx_mode(struct net_device *dev)
1702 {
1703 struct b44 *bp = netdev_priv(dev);
1704 u32 val;
1705
1706 val = br32(bp, B44_RXCONFIG);
1707 val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI);
1708 if (dev->flags & IFF_PROMISC) {
1709 val |= RXCONFIG_PROMISC;
1710 bw32(bp, B44_RXCONFIG, val);
1711 } else {
1712 unsigned char zero[6] = {0, 0, 0, 0, 0, 0};
1713 int i = 0;
1714
1715 __b44_set_mac_addr(bp);
1716
1717 if ((dev->flags & IFF_ALLMULTI) ||
1718 (dev->mc_count > B44_MCAST_TABLE_SIZE))
1719 val |= RXCONFIG_ALLMULTI;
1720 else
1721 i = __b44_load_mcast(bp, dev);
1722
1723 for (; i < 64; i++)
1724 __b44_cam_write(bp, zero, i);
1725
1726 bw32(bp, B44_RXCONFIG, val);
1727 val = br32(bp, B44_CAM_CTRL);
1728 bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
1729 }
1730 }
1731
1732 static void b44_set_rx_mode(struct net_device *dev)
1733 {
1734 struct b44 *bp = netdev_priv(dev);
1735
1736 spin_lock_irq(&bp->lock);
1737 __b44_set_rx_mode(dev);
1738 spin_unlock_irq(&bp->lock);
1739 }
1740
1741 static u32 b44_get_msglevel(struct net_device *dev)
1742 {
1743 struct b44 *bp = netdev_priv(dev);
1744 return bp->msg_enable;
1745 }
1746
1747 static void b44_set_msglevel(struct net_device *dev, u32 value)
1748 {
1749 struct b44 *bp = netdev_priv(dev);
1750 bp->msg_enable = value;
1751 }
1752
1753 static void b44_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
1754 {
1755 struct b44 *bp = netdev_priv(dev);
1756 struct pci_dev *pci_dev = bp->pdev;
1757
1758 strcpy (info->driver, DRV_MODULE_NAME);
1759 strcpy (info->version, DRV_MODULE_VERSION);
1760 strcpy (info->bus_info, pci_name(pci_dev));
1761 }
1762
1763 static int b44_nway_reset(struct net_device *dev)
1764 {
1765 struct b44 *bp = netdev_priv(dev);
1766 u32 bmcr;
1767 int r;
1768
1769 spin_lock_irq(&bp->lock);
1770 b44_readphy(bp, MII_BMCR, &bmcr);
1771 b44_readphy(bp, MII_BMCR, &bmcr);
1772 r = -EINVAL;
1773 if (bmcr & BMCR_ANENABLE) {
1774 b44_writephy(bp, MII_BMCR,
1775 bmcr | BMCR_ANRESTART);
1776 r = 0;
1777 }
1778 spin_unlock_irq(&bp->lock);
1779
1780 return r;
1781 }
1782
1783 static int b44_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1784 {
1785 struct b44 *bp = netdev_priv(dev);
1786
1787 cmd->supported = (SUPPORTED_Autoneg);
1788 cmd->supported |= (SUPPORTED_100baseT_Half |
1789 SUPPORTED_100baseT_Full |
1790 SUPPORTED_10baseT_Half |
1791 SUPPORTED_10baseT_Full |
1792 SUPPORTED_MII);
1793
1794 cmd->advertising = 0;
1795 if (bp->flags & B44_FLAG_ADV_10HALF)
1796 cmd->advertising |= ADVERTISED_10baseT_Half;
1797 if (bp->flags & B44_FLAG_ADV_10FULL)
1798 cmd->advertising |= ADVERTISED_10baseT_Full;
1799 if (bp->flags & B44_FLAG_ADV_100HALF)
1800 cmd->advertising |= ADVERTISED_100baseT_Half;
1801 if (bp->flags & B44_FLAG_ADV_100FULL)
1802 cmd->advertising |= ADVERTISED_100baseT_Full;
1803 cmd->advertising |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
1804 cmd->speed = (bp->flags & B44_FLAG_100_BASE_T) ?
1805 SPEED_100 : SPEED_10;
1806 cmd->duplex = (bp->flags & B44_FLAG_FULL_DUPLEX) ?
1807 DUPLEX_FULL : DUPLEX_HALF;
1808 cmd->port = 0;
1809 cmd->phy_address = bp->phy_addr;
1810 cmd->transceiver = (bp->flags & B44_FLAG_INTERNAL_PHY) ?
1811 XCVR_INTERNAL : XCVR_EXTERNAL;
1812 cmd->autoneg = (bp->flags & B44_FLAG_FORCE_LINK) ?
1813 AUTONEG_DISABLE : AUTONEG_ENABLE;
1814 if (cmd->autoneg == AUTONEG_ENABLE)
1815 cmd->advertising |= ADVERTISED_Autoneg;
1816 if (!netif_running(dev)){
1817 cmd->speed = 0;
1818 cmd->duplex = 0xff;
1819 }
1820 cmd->maxtxpkt = 0;
1821 cmd->maxrxpkt = 0;
1822 return 0;
1823 }
1824
1825 static int b44_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1826 {
1827 struct b44 *bp = netdev_priv(dev);
1828
1829 /* We do not support gigabit. */
1830 if (cmd->autoneg == AUTONEG_ENABLE) {
1831 if (cmd->advertising &
1832 (ADVERTISED_1000baseT_Half |
1833 ADVERTISED_1000baseT_Full))
1834 return -EINVAL;
1835 } else if ((cmd->speed != SPEED_100 &&
1836 cmd->speed != SPEED_10) ||
1837 (cmd->duplex != DUPLEX_HALF &&
1838 cmd->duplex != DUPLEX_FULL)) {
1839 return -EINVAL;
1840 }
1841
1842 spin_lock_irq(&bp->lock);
1843
1844 if (cmd->autoneg == AUTONEG_ENABLE) {
1845 bp->flags &= ~(B44_FLAG_FORCE_LINK |
1846 B44_FLAG_100_BASE_T |
1847 B44_FLAG_FULL_DUPLEX |
1848 B44_FLAG_ADV_10HALF |
1849 B44_FLAG_ADV_10FULL |
1850 B44_FLAG_ADV_100HALF |
1851 B44_FLAG_ADV_100FULL);
1852 if (cmd->advertising == 0) {
1853 bp->flags |= (B44_FLAG_ADV_10HALF |
1854 B44_FLAG_ADV_10FULL |
1855 B44_FLAG_ADV_100HALF |
1856 B44_FLAG_ADV_100FULL);
1857 } else {
1858 if (cmd->advertising & ADVERTISED_10baseT_Half)
1859 bp->flags |= B44_FLAG_ADV_10HALF;
1860 if (cmd->advertising & ADVERTISED_10baseT_Full)
1861 bp->flags |= B44_FLAG_ADV_10FULL;
1862 if (cmd->advertising & ADVERTISED_100baseT_Half)
1863 bp->flags |= B44_FLAG_ADV_100HALF;
1864 if (cmd->advertising & ADVERTISED_100baseT_Full)
1865 bp->flags |= B44_FLAG_ADV_100FULL;
1866 }
1867 } else {
1868 bp->flags |= B44_FLAG_FORCE_LINK;
1869 bp->flags &= ~(B44_FLAG_100_BASE_T | B44_FLAG_FULL_DUPLEX);
1870 if (cmd->speed == SPEED_100)
1871 bp->flags |= B44_FLAG_100_BASE_T;
1872 if (cmd->duplex == DUPLEX_FULL)
1873 bp->flags |= B44_FLAG_FULL_DUPLEX;
1874 }
1875
1876 if (netif_running(dev))
1877 b44_setup_phy(bp);
1878
1879 spin_unlock_irq(&bp->lock);
1880
1881 return 0;
1882 }
1883
1884 static void b44_get_ringparam(struct net_device *dev,
1885 struct ethtool_ringparam *ering)
1886 {
1887 struct b44 *bp = netdev_priv(dev);
1888
1889 ering->rx_max_pending = B44_RX_RING_SIZE - 1;
1890 ering->rx_pending = bp->rx_pending;
1891
1892 /* XXX ethtool lacks a tx_max_pending, oops... */
1893 }
1894
1895 static int b44_set_ringparam(struct net_device *dev,
1896 struct ethtool_ringparam *ering)
1897 {
1898 struct b44 *bp = netdev_priv(dev);
1899
1900 if ((ering->rx_pending > B44_RX_RING_SIZE - 1) ||
1901 (ering->rx_mini_pending != 0) ||
1902 (ering->rx_jumbo_pending != 0) ||
1903 (ering->tx_pending > B44_TX_RING_SIZE - 1))
1904 return -EINVAL;
1905
1906 spin_lock_irq(&bp->lock);
1907
1908 bp->rx_pending = ering->rx_pending;
1909 bp->tx_pending = ering->tx_pending;
1910
1911 b44_halt(bp);
1912 b44_init_rings(bp);
1913 b44_init_hw(bp, B44_FULL_RESET);
1914 netif_wake_queue(bp->dev);
1915 spin_unlock_irq(&bp->lock);
1916
1917 b44_enable_ints(bp);
1918
1919 return 0;
1920 }
1921
1922 static void b44_get_pauseparam(struct net_device *dev,
1923 struct ethtool_pauseparam *epause)
1924 {
1925 struct b44 *bp = netdev_priv(dev);
1926
1927 epause->autoneg =
1928 (bp->flags & B44_FLAG_PAUSE_AUTO) != 0;
1929 epause->rx_pause =
1930 (bp->flags & B44_FLAG_RX_PAUSE) != 0;
1931 epause->tx_pause =
1932 (bp->flags & B44_FLAG_TX_PAUSE) != 0;
1933 }
1934
1935 static int b44_set_pauseparam(struct net_device *dev,
1936 struct ethtool_pauseparam *epause)
1937 {
1938 struct b44 *bp = netdev_priv(dev);
1939
1940 spin_lock_irq(&bp->lock);
1941 if (epause->autoneg)
1942 bp->flags |= B44_FLAG_PAUSE_AUTO;
1943 else
1944 bp->flags &= ~B44_FLAG_PAUSE_AUTO;
1945 if (epause->rx_pause)
1946 bp->flags |= B44_FLAG_RX_PAUSE;
1947 else
1948 bp->flags &= ~B44_FLAG_RX_PAUSE;
1949 if (epause->tx_pause)
1950 bp->flags |= B44_FLAG_TX_PAUSE;
1951 else
1952 bp->flags &= ~B44_FLAG_TX_PAUSE;
1953 if (bp->flags & B44_FLAG_PAUSE_AUTO) {
1954 b44_halt(bp);
1955 b44_init_rings(bp);
1956 b44_init_hw(bp, B44_FULL_RESET);
1957 } else {
1958 __b44_set_flow_ctrl(bp, bp->flags);
1959 }
1960 spin_unlock_irq(&bp->lock);
1961
1962 b44_enable_ints(bp);
1963
1964 return 0;
1965 }
1966
1967 static void b44_get_strings(struct net_device *dev, u32 stringset, u8 *data)
1968 {
1969 switch(stringset) {
1970 case ETH_SS_STATS:
1971 memcpy(data, *b44_gstrings, sizeof(b44_gstrings));
1972 break;
1973 }
1974 }
1975
1976 static int b44_get_stats_count(struct net_device *dev)
1977 {
1978 return ARRAY_SIZE(b44_gstrings);
1979 }
1980
1981 static void b44_get_ethtool_stats(struct net_device *dev,
1982 struct ethtool_stats *stats, u64 *data)
1983 {
1984 struct b44 *bp = netdev_priv(dev);
1985 u32 *val = &bp->hw_stats.tx_good_octets;
1986 u32 i;
1987
1988 spin_lock_irq(&bp->lock);
1989
1990 b44_stats_update(bp);
1991
1992 for (i = 0; i < ARRAY_SIZE(b44_gstrings); i++)
1993 *data++ = *val++;
1994
1995 spin_unlock_irq(&bp->lock);
1996 }
1997
1998 static void b44_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1999 {
2000 struct b44 *bp = netdev_priv(dev);
2001
2002 wol->supported = WAKE_MAGIC;
2003 if (bp->flags & B44_FLAG_WOL_ENABLE)
2004 wol->wolopts = WAKE_MAGIC;
2005 else
2006 wol->wolopts = 0;
2007 memset(&wol->sopass, 0, sizeof(wol->sopass));
2008 }
2009
2010 static int b44_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2011 {
2012 struct b44 *bp = netdev_priv(dev);
2013
2014 spin_lock_irq(&bp->lock);
2015 if (wol->wolopts & WAKE_MAGIC)
2016 bp->flags |= B44_FLAG_WOL_ENABLE;
2017 else
2018 bp->flags &= ~B44_FLAG_WOL_ENABLE;
2019 spin_unlock_irq(&bp->lock);
2020
2021 return 0;
2022 }
2023
2024 static const struct ethtool_ops b44_ethtool_ops = {
2025 .get_drvinfo = b44_get_drvinfo,
2026 .get_settings = b44_get_settings,
2027 .set_settings = b44_set_settings,
2028 .nway_reset = b44_nway_reset,
2029 .get_link = ethtool_op_get_link,
2030 .get_wol = b44_get_wol,
2031 .set_wol = b44_set_wol,
2032 .get_ringparam = b44_get_ringparam,
2033 .set_ringparam = b44_set_ringparam,
2034 .get_pauseparam = b44_get_pauseparam,
2035 .set_pauseparam = b44_set_pauseparam,
2036 .get_msglevel = b44_get_msglevel,
2037 .set_msglevel = b44_set_msglevel,
2038 .get_strings = b44_get_strings,
2039 .get_stats_count = b44_get_stats_count,
2040 .get_ethtool_stats = b44_get_ethtool_stats,
2041 .get_perm_addr = ethtool_op_get_perm_addr,
2042 };
2043
2044 static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2045 {
2046 struct mii_ioctl_data *data = if_mii(ifr);
2047 struct b44 *bp = netdev_priv(dev);
2048 int err = -EINVAL;
2049
2050 if (!netif_running(dev))
2051 goto out;
2052
2053 spin_lock_irq(&bp->lock);
2054 err = generic_mii_ioctl(&bp->mii_if, data, cmd, NULL);
2055 spin_unlock_irq(&bp->lock);
2056 out:
2057 return err;
2058 }
2059
2060 /* Read 128-bytes of EEPROM. */
2061 static int b44_read_eeprom(struct b44 *bp, u8 *data)
2062 {
2063 long i;
2064 u16 *ptr = (u16 *) data;
2065
2066 for (i = 0; i < 128; i += 2)
2067 ptr[i / 2] = cpu_to_le16(readw(bp->regs + 4096 + i));
2068
2069 return 0;
2070 }
2071
2072 static int __devinit b44_get_invariants(struct b44 *bp)
2073 {
2074 u8 eeprom[128];
2075 int err;
2076
2077 err = b44_read_eeprom(bp, &eeprom[0]);
2078 if (err)
2079 goto out;
2080
2081 bp->dev->dev_addr[0] = eeprom[79];
2082 bp->dev->dev_addr[1] = eeprom[78];
2083 bp->dev->dev_addr[2] = eeprom[81];
2084 bp->dev->dev_addr[3] = eeprom[80];
2085 bp->dev->dev_addr[4] = eeprom[83];
2086 bp->dev->dev_addr[5] = eeprom[82];
2087
2088 if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){
2089 printk(KERN_ERR PFX "Invalid MAC address found in EEPROM\n");
2090 return -EINVAL;
2091 }
2092
2093 memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len);
2094
2095 bp->phy_addr = eeprom[90] & 0x1f;
2096
2097 /* With this, plus the rx_header prepended to the data by the
2098 * hardware, we'll land the ethernet header on a 2-byte boundary.
2099 */
2100 bp->rx_offset = 30;
2101
2102 bp->imask = IMASK_DEF;
2103
2104 bp->core_unit = ssb_core_unit(bp);
2105 bp->dma_offset = SB_PCI_DMA;
2106
2107 /* XXX - really required?
2108 bp->flags |= B44_FLAG_BUGGY_TXPTR;
2109 */
2110
2111 if (ssb_get_core_rev(bp) >= 7)
2112 bp->flags |= B44_FLAG_B0_ANDLATER;
2113
2114 out:
2115 return err;
2116 }
2117
2118 static int __devinit b44_init_one(struct pci_dev *pdev,
2119 const struct pci_device_id *ent)
2120 {
2121 static int b44_version_printed = 0;
2122 unsigned long b44reg_base, b44reg_len;
2123 struct net_device *dev;
2124 struct b44 *bp;
2125 int err, i;
2126
2127 if (b44_version_printed++ == 0)
2128 printk(KERN_INFO "%s", version);
2129
2130 err = pci_enable_device(pdev);
2131 if (err) {
2132 dev_err(&pdev->dev, "Cannot enable PCI device, "
2133 "aborting.\n");
2134 return err;
2135 }
2136
2137 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
2138 dev_err(&pdev->dev,
2139 "Cannot find proper PCI device "
2140 "base address, aborting.\n");
2141 err = -ENODEV;
2142 goto err_out_disable_pdev;
2143 }
2144
2145 err = pci_request_regions(pdev, DRV_MODULE_NAME);
2146 if (err) {
2147 dev_err(&pdev->dev,
2148 "Cannot obtain PCI resources, aborting.\n");
2149 goto err_out_disable_pdev;
2150 }
2151
2152 pci_set_master(pdev);
2153
2154 err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK);
2155 if (err) {
2156 dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n");
2157 goto err_out_free_res;
2158 }
2159
2160 err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK);
2161 if (err) {
2162 dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n");
2163 goto err_out_free_res;
2164 }
2165
2166 b44reg_base = pci_resource_start(pdev, 0);
2167 b44reg_len = pci_resource_len(pdev, 0);
2168
2169 dev = alloc_etherdev(sizeof(*bp));
2170 if (!dev) {
2171 dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n");
2172 err = -ENOMEM;
2173 goto err_out_free_res;
2174 }
2175
2176 SET_MODULE_OWNER(dev);
2177 SET_NETDEV_DEV(dev,&pdev->dev);
2178
2179 /* No interesting netdevice features in this card... */
2180 dev->features |= 0;
2181
2182 bp = netdev_priv(dev);
2183 bp->pdev = pdev;
2184 bp->dev = dev;
2185
2186 bp->msg_enable = netif_msg_init(b44_debug, B44_DEF_MSG_ENABLE);
2187
2188 spin_lock_init(&bp->lock);
2189
2190 bp->regs = ioremap(b44reg_base, b44reg_len);
2191 if (bp->regs == 0UL) {
2192 dev_err(&pdev->dev, "Cannot map device registers, aborting.\n");
2193 err = -ENOMEM;
2194 goto err_out_free_dev;
2195 }
2196
2197 bp->rx_pending = B44_DEF_RX_RING_PENDING;
2198 bp->tx_pending = B44_DEF_TX_RING_PENDING;
2199
2200 dev->open = b44_open;
2201 dev->stop = b44_close;
2202 dev->hard_start_xmit = b44_start_xmit;
2203 dev->get_stats = b44_get_stats;
2204 dev->set_multicast_list = b44_set_rx_mode;
2205 dev->set_mac_address = b44_set_mac_addr;
2206 dev->do_ioctl = b44_ioctl;
2207 dev->tx_timeout = b44_tx_timeout;
2208 dev->poll = b44_poll;
2209 dev->weight = 64;
2210 dev->watchdog_timeo = B44_TX_TIMEOUT;
2211 #ifdef CONFIG_NET_POLL_CONTROLLER
2212 dev->poll_controller = b44_poll_controller;
2213 #endif
2214 dev->change_mtu = b44_change_mtu;
2215 dev->irq = pdev->irq;
2216 SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);
2217
2218 netif_carrier_off(dev);
2219
2220 err = b44_get_invariants(bp);
2221 if (err) {
2222 dev_err(&pdev->dev,
2223 "Problem fetching invariants of chip, aborting.\n");
2224 goto err_out_iounmap;
2225 }
2226
2227 bp->mii_if.dev = dev;
2228 bp->mii_if.mdio_read = b44_mii_read;
2229 bp->mii_if.mdio_write = b44_mii_write;
2230 bp->mii_if.phy_id = bp->phy_addr;
2231 bp->mii_if.phy_id_mask = 0x1f;
2232 bp->mii_if.reg_num_mask = 0x1f;
2233
2234 /* By default, advertise all speed/duplex settings. */
2235 bp->flags |= (B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL |
2236 B44_FLAG_ADV_100HALF | B44_FLAG_ADV_100FULL);
2237
2238 /* By default, auto-negotiate PAUSE. */
2239 bp->flags |= B44_FLAG_PAUSE_AUTO;
2240
2241 err = register_netdev(dev);
2242 if (err) {
2243 dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
2244 goto err_out_iounmap;
2245 }
2246
2247 pci_set_drvdata(pdev, dev);
2248
2249 pci_save_state(bp->pdev);
2250
2251 /* Chip reset provides power to the b44 MAC & PCI cores, which
2252 * is necessary for MAC register access.
2253 */
2254 b44_chip_reset(bp);
2255
2256 printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name);
2257 for (i = 0; i < 6; i++)
2258 printk("%2.2x%c", dev->dev_addr[i],
2259 i == 5 ? '\n' : ':');
2260
2261 return 0;
2262
2263 err_out_iounmap:
2264 iounmap(bp->regs);
2265
2266 err_out_free_dev:
2267 free_netdev(dev);
2268
2269 err_out_free_res:
2270 pci_release_regions(pdev);
2271
2272 err_out_disable_pdev:
2273 pci_disable_device(pdev);
2274 pci_set_drvdata(pdev, NULL);
2275 return err;
2276 }
2277
2278 static void __devexit b44_remove_one(struct pci_dev *pdev)
2279 {
2280 struct net_device *dev = pci_get_drvdata(pdev);
2281 struct b44 *bp = netdev_priv(dev);
2282
2283 unregister_netdev(dev);
2284 iounmap(bp->regs);
2285 free_netdev(dev);
2286 pci_release_regions(pdev);
2287 pci_disable_device(pdev);
2288 pci_set_drvdata(pdev, NULL);
2289 }
2290
2291 static int b44_suspend(struct pci_dev *pdev, pm_message_t state)
2292 {
2293 struct net_device *dev = pci_get_drvdata(pdev);
2294 struct b44 *bp = netdev_priv(dev);
2295
2296 if (!netif_running(dev))
2297 return 0;
2298
2299 del_timer_sync(&bp->timer);
2300
2301 spin_lock_irq(&bp->lock);
2302
2303 b44_halt(bp);
2304 netif_carrier_off(bp->dev);
2305 netif_device_detach(bp->dev);
2306 b44_free_rings(bp);
2307
2308 spin_unlock_irq(&bp->lock);
2309
2310 free_irq(dev->irq, dev);
2311 if (bp->flags & B44_FLAG_WOL_ENABLE) {
2312 b44_init_hw(bp, B44_PARTIAL_RESET);
2313 b44_setup_wol(bp);
2314 }
2315 pci_disable_device(pdev);
2316 return 0;
2317 }
2318
2319 static int b44_resume(struct pci_dev *pdev)
2320 {
2321 struct net_device *dev = pci_get_drvdata(pdev);
2322 struct b44 *bp = netdev_priv(dev);
2323 int rc = 0;
2324
2325 pci_restore_state(pdev);
2326 rc = pci_enable_device(pdev);
2327 if (rc) {
2328 printk(KERN_ERR PFX "%s: pci_enable_device failed\n",
2329 dev->name);
2330 return rc;
2331 }
2332
2333 pci_set_master(pdev);
2334
2335 if (!netif_running(dev))
2336 return 0;
2337
2338 rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
2339 if (rc) {
2340 printk(KERN_ERR PFX "%s: request_irq failed\n", dev->name);
2341 pci_disable_device(pdev);
2342 return rc;
2343 }
2344
2345 spin_lock_irq(&bp->lock);
2346
2347 b44_init_rings(bp);
2348 b44_init_hw(bp, B44_FULL_RESET);
2349 netif_device_attach(bp->dev);
2350 spin_unlock_irq(&bp->lock);
2351
2352 bp->timer.expires = jiffies + HZ;
2353 add_timer(&bp->timer);
2354
2355 b44_enable_ints(bp);
2356 netif_wake_queue(dev);
2357 return 0;
2358 }
2359
2360 static struct pci_driver b44_driver = {
2361 .name = DRV_MODULE_NAME,
2362 .id_table = b44_pci_tbl,
2363 .probe = b44_init_one,
2364 .remove = __devexit_p(b44_remove_one),
2365 .suspend = b44_suspend,
2366 .resume = b44_resume,
2367 };
2368
2369 static int __init b44_init(void)
2370 {
2371 unsigned int dma_desc_align_size = dma_get_cache_alignment();
2372
2373 /* Setup paramaters for syncing RX/TX DMA descriptors */
2374 dma_desc_align_mask = ~(dma_desc_align_size - 1);
2375 dma_desc_sync_size = max_t(unsigned int, dma_desc_align_size, sizeof(struct dma_desc));
2376
2377 return pci_register_driver(&b44_driver);
2378 }
2379
2380 static void __exit b44_cleanup(void)
2381 {
2382 pci_unregister_driver(&b44_driver);
2383 }
2384
2385 module_init(b44_init);
2386 module_exit(b44_cleanup);
2387
This page took 0.085845 seconds and 6 git commands to generate.