1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88#include <linux/module.h>
89#include <linux/kernel.h>
90#include <linux/pci.h>
91#include <linux/init.h>
92#include <linux/ioport.h>
93#include <linux/netdevice.h>
94#include <linux/etherdevice.h>
95#include <linux/delay.h>
96#include <linux/ethtool.h>
97#include <linux/mii.h>
98#include <linux/crc32.h>
99#include <asm/io.h>
100
101#define NETDRV_VERSION "1.0.1"
102#define MODNAME "netdrv"
103#define NETDRV_DRIVER_LOAD_MSG "MyVendor Fast Ethernet driver " NETDRV_VERSION " loaded"
104#define PFX MODNAME ": "
105
106static char version[] __devinitdata =
107KERN_INFO NETDRV_DRIVER_LOAD_MSG "\n"
108KERN_INFO " Support available from http://foo.com/bar/baz.html\n";
109
110
111#undef USE_IO_OPS
112
113
114#undef NETDRV_DEBUG
115
116
117#undef NETDRV_NDEBUG
118
119
120#ifdef NETDRV_DEBUG
121
122# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
123#else
124# define DPRINTK(fmt, args...)
125#endif
126
127#ifdef NETDRV_NDEBUG
128# define assert(expr) do {} while (0)
129#else
130# define assert(expr) \
131 if(!(expr)) { \
132 printk( "Assertion failed! %s,%s,%s,line=%d\n", \
133 #expr,__FILE__,__func__,__LINE__); \
134 }
135#endif
136
137
138
139
140static int media[] = {-1, -1, -1, -1, -1, -1, -1, -1};
141
142
143static int max_interrupt_work = 20;
144
145
146
147static int multicast_filter_limit = 32;
148
149
150#define RX_BUF_LEN_IDX 2
151#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
152#define RX_BUF_PAD 16
153#define RX_BUF_WRAP_PAD 2048
154#define RX_BUF_TOT_LEN (RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD)
155
156
157#define NUM_TX_DESC 4
158
159
160#define MAX_ETH_FRAME_SIZE 1536
161
162
163#define TX_BUF_SIZE MAX_ETH_FRAME_SIZE
164#define TX_BUF_TOT_LEN (TX_BUF_SIZE * NUM_TX_DESC)
165
166
167
168#define TX_FIFO_THRESH 256
169
170
171#define RX_FIFO_THRESH 6
172#define RX_DMA_BURST 6
173#define TX_DMA_BURST 6
174
175
176
177
178#define TX_TIMEOUT (6*HZ)
179
180
181enum {
182 HAS_CHIP_XCVR = 0x020000,
183 HAS_LNK_CHNG = 0x040000,
184};
185
186#define NETDRV_MIN_IO_SIZE 0x80
187#define RTL8139B_IO_SIZE 256
188
189#define NETDRV_CAPS HAS_CHIP_XCVR|HAS_LNK_CHNG
190
191typedef enum {
192 RTL8139 = 0,
193 NETDRV_CB,
194 SMC1211TX,
195
196 DELTA8139,
197 ADDTRON8139,
198} board_t;
199
200
201
202static struct {
203 const char *name;
204} board_info[] __devinitdata = {
205 { "RealTek RTL8139 Fast Ethernet" },
206 { "RealTek RTL8139B PCI/CardBus" },
207 { "SMC1211TX EZCard 10/100 (RealTek RTL8139)" },
208
209 { "Delta Electronics 8139 10/100BaseTX" },
210 { "Addtron Technolgy 8139 10/100BaseTX" },
211};
212
213
214static struct pci_device_id netdrv_pci_tbl[] = {
215 {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
216 {0x10ec, 0x8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NETDRV_CB },
217 {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMC1211TX },
218
219 {0x1500, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DELTA8139 },
220 {0x4033, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ADDTRON8139 },
221 {0,}
222};
223MODULE_DEVICE_TABLE (pci, netdrv_pci_tbl);
224
225
226
227
228
229enum NETDRV_registers {
230 MAC0 = 0,
231 MAR0 = 8,
232 TxStatus0 = 0x10,
233 TxAddr0 = 0x20,
234 RxBuf = 0x30,
235 RxEarlyCnt = 0x34,
236 RxEarlyStatus = 0x36,
237 ChipCmd = 0x37,
238 RxBufPtr = 0x38,
239 RxBufAddr = 0x3A,
240 IntrMask = 0x3C,
241 IntrStatus = 0x3E,
242 TxConfig = 0x40,
243 ChipVersion = 0x43,
244 RxConfig = 0x44,
245 Timer = 0x48,
246 RxMissed = 0x4C,
247 Cfg9346 = 0x50,
248 Config0 = 0x51,
249 Config1 = 0x52,
250 FlashReg = 0x54,
251 MediaStatus = 0x58,
252 Config3 = 0x59,
253 Config4 = 0x5A,
254 HltClk = 0x5B,
255 MultiIntr = 0x5C,
256 TxSummary = 0x60,
257 BasicModeCtrl = 0x62,
258 BasicModeStatus = 0x64,
259 NWayAdvert = 0x66,
260 NWayLPAR = 0x68,
261 NWayExpansion = 0x6A,
262
263 FIFOTMS = 0x70,
264 CSCR = 0x74,
265 PARA78 = 0x78,
266 PARA7c = 0x7c,
267 Config5 = 0xD8,
268};
269
270enum ClearBitMasks {
271 MultiIntrClear = 0xF000,
272 ChipCmdClear = 0xE2,
273 Config1Clear = (1<<7)|(1<<6)|(1<<3)|(1<<2)|(1<<1),
274};
275
276enum ChipCmdBits {
277 CmdReset = 0x10,
278 CmdRxEnb = 0x08,
279 CmdTxEnb = 0x04,
280 RxBufEmpty = 0x01,
281};
282
283
284enum IntrStatusBits {
285 PCIErr = 0x8000,
286 PCSTimeout = 0x4000,
287 RxFIFOOver = 0x40,
288 RxUnderrun = 0x20,
289 RxOverflow = 0x10,
290 TxErr = 0x08,
291 TxOK = 0x04,
292 RxErr = 0x02,
293 RxOK = 0x01,
294};
295enum TxStatusBits {
296 TxHostOwns = 0x2000,
297 TxUnderrun = 0x4000,
298 TxStatOK = 0x8000,
299 TxOutOfWindow = 0x20000000,
300 TxAborted = 0x40000000,
301 TxCarrierLost = 0x80000000,
302};
303enum RxStatusBits {
304 RxMulticast = 0x8000,
305 RxPhysical = 0x4000,
306 RxBroadcast = 0x2000,
307 RxBadSymbol = 0x0020,
308 RxRunt = 0x0010,
309 RxTooLong = 0x0008,
310 RxCRCErr = 0x0004,
311 RxBadAlign = 0x0002,
312 RxStatusOK = 0x0001,
313};
314
315
316enum rx_mode_bits {
317 AcceptErr = 0x20,
318 AcceptRunt = 0x10,
319 AcceptBroadcast = 0x08,
320 AcceptMulticast = 0x04,
321 AcceptMyPhys = 0x02,
322 AcceptAllPhys = 0x01,
323};
324
325
326enum tx_config_bits {
327 TxIFG1 = (1 << 25),
328 TxIFG0 = (1 << 24),
329 TxLoopBack = (1 << 18) | (1 << 17),
330 TxCRC = (1 << 16),
331 TxClearAbt = (1 << 0),
332 TxDMAShift = 8,
333
334 TxVersionMask = 0x7C800000,
335};
336
337
338enum Config1Bits {
339 Cfg1_PM_Enable = 0x01,
340 Cfg1_VPD_Enable = 0x02,
341 Cfg1_PIO = 0x04,
342 Cfg1_MMIO = 0x08,
343 Cfg1_LWAKE = 0x10,
344 Cfg1_Driver_Load = 0x20,
345 Cfg1_LED0 = 0x40,
346 Cfg1_LED1 = 0x80,
347};
348
349enum RxConfigBits {
350
351 RxCfgEarlyRxNone = 0,
352 RxCfgEarlyRxShift = 24,
353
354
355 RxCfgFIFOShift = 13,
356 RxCfgFIFONone = (7 << RxCfgFIFOShift),
357
358
359 RxCfgDMAShift = 8,
360 RxCfgDMAUnlimited = (7 << RxCfgDMAShift),
361
362
363 RxCfgRcv8K = 0,
364 RxCfgRcv16K = (1 << 11),
365 RxCfgRcv32K = (1 << 12),
366 RxCfgRcv64K = (1 << 11) | (1 << 12),
367
368
369 RxNoWrap = (1 << 7),
370};
371
372
373
374
375enum CSCRBits {
376 CSCR_LinkOKBit = 0x0400,
377 CSCR_LinkChangeBit = 0x0800,
378 CSCR_LinkStatusBits = 0x0f000,
379 CSCR_LinkDownOffCmd = 0x003c0,
380 CSCR_LinkDownCmd = 0x0f3c0,
381};
382
383
384enum Cfg9346Bits {
385 Cfg9346_Lock = 0x00,
386 Cfg9346_Unlock = 0xC0,
387};
388
389
390#define PARA78_default 0x78fa8388
391#define PARA7c_default 0xcb38de43
392#define PARA7c_xxx 0xcb38de43
393static const unsigned long param[4][4] = {
394 {0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43},
395 {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
396 {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
397 {0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83}
398};
399
400struct ring_info {
401 struct sk_buff *skb;
402 dma_addr_t mapping;
403};
404
405
406typedef enum {
407 CH_8139 = 0,
408 CH_8139_K,
409 CH_8139A,
410 CH_8139B,
411 CH_8130,
412 CH_8139C,
413} chip_t;
414
415
416
417static const struct {
418 const char *name;
419 u8 version;
420 u32 RxConfigMask;
421} rtl_chip_info[] = {
422 { "RTL-8139",
423 0x40,
424 0xf0fe0040,
425 },
426
427 { "RTL-8139 rev K",
428 0x60,
429 0xf0fe0040,
430 },
431
432 { "RTL-8139A",
433 0x70,
434 0xf0fe0040,
435 },
436
437 { "RTL-8139B",
438 0x78,
439 0xf0fc0040
440 },
441
442 { "RTL-8130",
443 0x7C,
444 0xf0fe0040,
445 },
446
447 { "RTL-8139C",
448 0x74,
449 0xf0fc0040,
450 },
451
452};
453
454
455struct netdrv_private {
456 board_t board;
457 void *mmio_addr;
458 int drv_flags;
459 struct pci_dev *pci_dev;
460 struct timer_list timer;
461 unsigned char *rx_ring;
462 unsigned int cur_rx;
463 unsigned int tx_flag;
464 atomic_t cur_tx;
465 atomic_t dirty_tx;
466
467 struct ring_info tx_info[NUM_TX_DESC];
468 unsigned char *tx_buf[NUM_TX_DESC];
469 unsigned char *tx_bufs;
470 dma_addr_t rx_ring_dma;
471 dma_addr_t tx_bufs_dma;
472 char phys[4];
473 char twistie, twist_row, twist_col;
474 unsigned int full_duplex:1;
475 unsigned int duplex_lock:1;
476 unsigned int default_port:4;
477 unsigned int media2:4;
478 unsigned int medialock:1;
479 unsigned int mediasense:1;
480 spinlock_t lock;
481 chip_t chipset;
482};
483
484MODULE_AUTHOR ("Jeff Garzik <jgarzik@pobox.com>");
485MODULE_DESCRIPTION ("Skeleton for a PCI Fast Ethernet driver");
486MODULE_LICENSE("GPL");
487module_param(multicast_filter_limit, int, 0);
488module_param(max_interrupt_work, int, 0);
489module_param_array(media, int, NULL, 0);
490MODULE_PARM_DESC (multicast_filter_limit, "pci-skeleton maximum number of filtered multicast addresses");
491MODULE_PARM_DESC (max_interrupt_work, "pci-skeleton maximum events handled per interrupt");
492MODULE_PARM_DESC (media, "pci-skeleton: Bits 0-3: media type, bit 17: full duplex");
493
494static int read_eeprom (void *ioaddr, int location, int addr_len);
495static int netdrv_open (struct net_device *dev);
496static int mdio_read (struct net_device *dev, int phy_id, int location);
497static void mdio_write (struct net_device *dev, int phy_id, int location,
498 int val);
499static void netdrv_timer (unsigned long data);
500static void netdrv_tx_timeout (struct net_device *dev);
501static void netdrv_init_ring (struct net_device *dev);
502static int netdrv_start_xmit (struct sk_buff *skb,
503 struct net_device *dev);
504static irqreturn_t netdrv_interrupt (int irq, void *dev_instance);
505static int netdrv_close (struct net_device *dev);
506static int netdrv_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);
507static void netdrv_set_rx_mode (struct net_device *dev);
508static void netdrv_hw_start (struct net_device *dev);
509
510
511#ifdef USE_IO_OPS
512
513#define NETDRV_R8(reg) inb (((unsigned long)ioaddr) + (reg))
514#define NETDRV_R16(reg) inw (((unsigned long)ioaddr) + (reg))
515#define NETDRV_R32(reg) ((unsigned long) inl (((unsigned long)ioaddr) + (reg)))
516#define NETDRV_W8(reg, val8) outb ((val8), ((unsigned long)ioaddr) + (reg))
517#define NETDRV_W16(reg, val16) outw ((val16), ((unsigned long)ioaddr) + (reg))
518#define NETDRV_W32(reg, val32) outl ((val32), ((unsigned long)ioaddr) + (reg))
519#define NETDRV_W8_F NETDRV_W8
520#define NETDRV_W16_F NETDRV_W16
521#define NETDRV_W32_F NETDRV_W32
522#undef readb
523#undef readw
524#undef readl
525#undef writeb
526#undef writew
527#undef writel
528#define readb(addr) inb((unsigned long)(addr))
529#define readw(addr) inw((unsigned long)(addr))
530#define readl(addr) inl((unsigned long)(addr))
531#define writeb(val,addr) outb((val),(unsigned long)(addr))
532#define writew(val,addr) outw((val),(unsigned long)(addr))
533#define writel(val,addr) outl((val),(unsigned long)(addr))
534
535#else
536
537
538
539#define NETDRV_W8_F(reg, val8) do { writeb ((val8), ioaddr + (reg)); readb (ioaddr + (reg)); } while (0)
540#define NETDRV_W16_F(reg, val16) do { writew ((val16), ioaddr + (reg)); readw (ioaddr + (reg)); } while (0)
541#define NETDRV_W32_F(reg, val32) do { writel ((val32), ioaddr + (reg)); readl (ioaddr + (reg)); } while (0)
542
543
544#ifdef MMIO_FLUSH_AUDIT_COMPLETE
545
546
547#define NETDRV_W8(reg, val8) writeb ((val8), ioaddr + (reg))
548#define NETDRV_W16(reg, val16) writew ((val16), ioaddr + (reg))
549#define NETDRV_W32(reg, val32) writel ((val32), ioaddr + (reg))
550
551#else
552
553
554#define NETDRV_W8 NETDRV_W8_F
555#define NETDRV_W16 NETDRV_W16_F
556#define NETDRV_W32 NETDRV_W32_F
557
558#endif
559
560
561#define NETDRV_R8(reg) readb (ioaddr + (reg))
562#define NETDRV_R16(reg) readw (ioaddr + (reg))
563#define NETDRV_R32(reg) ((unsigned long) readl (ioaddr + (reg)))
564
565#endif
566
567
568static const u16 netdrv_intr_mask =
569 PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver |
570 TxErr | TxOK | RxErr | RxOK;
571
572static const unsigned int netdrv_rx_config =
573 RxCfgEarlyRxNone | RxCfgRcv32K | RxNoWrap |
574 (RX_FIFO_THRESH << RxCfgFIFOShift) |
575 (RX_DMA_BURST << RxCfgDMAShift);
576
577
578static int __devinit netdrv_init_board (struct pci_dev *pdev,
579 struct net_device **dev_out,
580 void **ioaddr_out)
581{
582 void *ioaddr = NULL;
583 struct net_device *dev;
584 struct netdrv_private *tp;
585 int rc, i;
586 u32 pio_start, pio_end, pio_flags, pio_len;
587 unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
588 u32 tmp;
589
590 DPRINTK ("ENTER\n");
591
592 assert (pdev != NULL);
593 assert (ioaddr_out != NULL);
594
595 *ioaddr_out = NULL;
596 *dev_out = NULL;
597
598
599 dev = alloc_etherdev (sizeof (*tp));
600 if (dev == NULL) {
601 dev_err(&pdev->dev, "unable to alloc new ethernet\n");
602 DPRINTK ("EXIT, returning -ENOMEM\n");
603 return -ENOMEM;
604 }
605 SET_NETDEV_DEV(dev, &pdev->dev);
606 tp = netdev_priv(dev);
607
608
609 rc = pci_enable_device (pdev);
610 if (rc)
611 goto err_out;
612
613 pio_start = pci_resource_start (pdev, 0);
614 pio_end = pci_resource_end (pdev, 0);
615 pio_flags = pci_resource_flags (pdev, 0);
616 pio_len = pci_resource_len (pdev, 0);
617
618 mmio_start = pci_resource_start (pdev, 1);
619 mmio_end = pci_resource_end (pdev, 1);
620 mmio_flags = pci_resource_flags (pdev, 1);
621 mmio_len = pci_resource_len (pdev, 1);
622
623
624
625 DPRINTK("PIO region size == 0x%02X\n", pio_len);
626 DPRINTK("MMIO region size == 0x%02lX\n", mmio_len);
627
628
629 if (!(pio_flags & IORESOURCE_IO)) {
630 dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n");
631 rc = -ENODEV;
632 goto err_out;
633 }
634
635
636 if (!(mmio_flags & IORESOURCE_MEM)) {
637 dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n");
638 rc = -ENODEV;
639 goto err_out;
640 }
641
642
643 if ((pio_len < NETDRV_MIN_IO_SIZE) ||
644 (mmio_len < NETDRV_MIN_IO_SIZE)) {
645 dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n");
646 rc = -ENODEV;
647 goto err_out;
648 }
649
650 rc = pci_request_regions (pdev, MODNAME);
651 if (rc)
652 goto err_out;
653
654 pci_set_master (pdev);
655
656#ifdef USE_IO_OPS
657 ioaddr = (void *) pio_start;
658#else
659
660 ioaddr = ioremap (mmio_start, mmio_len);
661 if (ioaddr == NULL) {
662 dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
663 rc = -EIO;
664 goto err_out_free_res;
665 }
666#endif
667
668
669 NETDRV_W8 (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear) | CmdReset);
670
671
672 for (i = 1000; i > 0; i--)
673 if ((NETDRV_R8 (ChipCmd) & CmdReset) == 0)
674 break;
675 else
676 udelay (10);
677
678
679
680
681#ifndef USE_IO_OPS
682
683 assert (inb (pio_start+Config0) == readb (ioaddr+Config0));
684 assert (inb (pio_start+Config1) == readb (ioaddr+Config1));
685 assert (inb (pio_start+TxConfig) == readb (ioaddr+TxConfig));
686 assert (inb (pio_start+RxConfig) == readb (ioaddr+RxConfig));
687#endif
688
689
690 tmp = NETDRV_R8 (ChipVersion);
691 for (i = ARRAY_SIZE (rtl_chip_info) - 1; i >= 0; i--)
692 if (tmp == rtl_chip_info[i].version) {
693 tp->chipset = i;
694 goto match;
695 }
696
697
698 dev_printk (KERN_DEBUG, &pdev->dev,
699 "unknown chip version, assuming RTL-8139\n");
700 dev_printk (KERN_DEBUG, &pdev->dev, "TxConfig = 0x%lx\n",
701 NETDRV_R32 (TxConfig));
702 tp->chipset = 0;
703
704match:
705 DPRINTK ("chipset id (%d) == index %d, '%s'\n",
706 tmp,
707 tp->chipset,
708 rtl_chip_info[tp->chipset].name);
709
710 rc = register_netdev (dev);
711 if (rc)
712 goto err_out_unmap;
713
714 DPRINTK ("EXIT, returning 0\n");
715 *ioaddr_out = ioaddr;
716 *dev_out = dev;
717 return 0;
718
719err_out_unmap:
720#ifndef USE_IO_OPS
721 iounmap(ioaddr);
722err_out_free_res:
723#endif
724 pci_release_regions (pdev);
725err_out:
726 free_netdev (dev);
727 DPRINTK ("EXIT, returning %d\n", rc);
728 return rc;
729}
730
731
732static int __devinit netdrv_init_one (struct pci_dev *pdev,
733 const struct pci_device_id *ent)
734{
735 struct net_device *dev = NULL;
736 struct netdrv_private *tp;
737 int i, addr_len, option;
738 void *ioaddr = NULL;
739 static int board_idx = -1;
740
741
742#ifndef MODULE
743 static int printed_version;
744 if (!printed_version++)
745 printk(version);
746#endif
747
748 DPRINTK ("ENTER\n");
749
750 assert (pdev != NULL);
751 assert (ent != NULL);
752
753 board_idx++;
754
755 i = netdrv_init_board (pdev, &dev, &ioaddr);
756 if (i < 0) {
757 DPRINTK ("EXIT, returning %d\n", i);
758 return i;
759 }
760
761 tp = netdev_priv(dev);
762
763 assert (ioaddr != NULL);
764 assert (dev != NULL);
765 assert (tp != NULL);
766
767 addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6;
768 for (i = 0; i < 3; i++)
769 ((u16 *) (dev->dev_addr))[i] =
770 le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len));
771
772
773 dev->open = netdrv_open;
774 dev->hard_start_xmit = netdrv_start_xmit;
775 dev->stop = netdrv_close;
776 dev->set_multicast_list = netdrv_set_rx_mode;
777 dev->do_ioctl = netdrv_ioctl;
778 dev->tx_timeout = netdrv_tx_timeout;
779 dev->watchdog_timeo = TX_TIMEOUT;
780
781 dev->irq = pdev->irq;
782 dev->base_addr = (unsigned long) ioaddr;
783
784
785 tp = netdev_priv(dev);
786
787
788 tp->drv_flags = PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
789 PCI_COMMAND_MASTER | NETDRV_CAPS;
790 tp->pci_dev = pdev;
791 tp->board = ent->driver_data;
792 tp->mmio_addr = ioaddr;
793 spin_lock_init(&tp->lock);
794
795 pci_set_drvdata(pdev, dev);
796
797 tp->phys[0] = 32;
798
799 printk (KERN_INFO "%s: %s at 0x%lx, %pM IRQ %d\n",
800 dev->name,
801 board_info[ent->driver_data].name,
802 dev->base_addr,
803 dev->dev_addr,
804 dev->irq);
805
806 printk (KERN_DEBUG "%s: Identified 8139 chip type '%s'\n",
807 dev->name, rtl_chip_info[tp->chipset].name);
808
809
810 NETDRV_W8_F (Cfg9346, Cfg9346_Unlock);
811
812
813 option = (board_idx > 7) ? 0 : media[board_idx];
814 if (option > 0) {
815 tp->full_duplex = (option & 0x200) ? 1 : 0;
816 tp->default_port = option & 15;
817 if (tp->default_port)
818 tp->medialock = 1;
819 }
820
821 if (tp->full_duplex) {
822 printk (KERN_INFO
823 "%s: Media type forced to Full Duplex.\n",
824 dev->name);
825 mdio_write (dev, tp->phys[0], MII_ADVERTISE, ADVERTISE_FULL);
826 tp->duplex_lock = 1;
827 }
828
829 DPRINTK ("EXIT - returning 0\n");
830 return 0;
831}
832
833
834static void __devexit netdrv_remove_one (struct pci_dev *pdev)
835{
836 struct net_device *dev = pci_get_drvdata (pdev);
837 struct netdrv_private *np;
838
839 DPRINTK ("ENTER\n");
840
841 assert (dev != NULL);
842
843 np = netdev_priv(dev);
844 assert (np != NULL);
845
846 unregister_netdev (dev);
847
848#ifndef USE_IO_OPS
849 iounmap (np->mmio_addr);
850#endif
851
852 pci_release_regions (pdev);
853
854 free_netdev (dev);
855
856 pci_set_drvdata (pdev, NULL);
857
858 pci_disable_device (pdev);
859
860 DPRINTK ("EXIT\n");
861}
862
863
864
865
866
867#define EE_SHIFT_CLK 0x04
868#define EE_CS 0x08
869#define EE_DATA_WRITE 0x02
870#define EE_WRITE_0 0x00
871#define EE_WRITE_1 0x02
872#define EE_DATA_READ 0x01
873#define EE_ENB (0x80 | EE_CS)
874
875
876
877
878
879#define eeprom_delay() readl(ee_addr)
880
881
882#define EE_WRITE_CMD (5)
883#define EE_READ_CMD (6)
884#define EE_ERASE_CMD (7)
885
886static int __devinit read_eeprom (void *ioaddr, int location, int addr_len)
887{
888 int i;
889 unsigned retval = 0;
890 void *ee_addr = ioaddr + Cfg9346;
891 int read_cmd = location | (EE_READ_CMD << addr_len);
892
893 DPRINTK ("ENTER\n");
894
895 writeb (EE_ENB & ~EE_CS, ee_addr);
896 writeb (EE_ENB, ee_addr);
897 eeprom_delay ();
898
899
900 for (i = 4 + addr_len; i >= 0; i--) {
901 int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
902 writeb (EE_ENB | dataval, ee_addr);
903 eeprom_delay ();
904 writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
905 eeprom_delay ();
906 }
907 writeb (EE_ENB, ee_addr);
908 eeprom_delay ();
909
910 for (i = 16; i > 0; i--) {
911 writeb (EE_ENB | EE_SHIFT_CLK, ee_addr);
912 eeprom_delay ();
913 retval =
914 (retval << 1) | ((readb (ee_addr) & EE_DATA_READ) ? 1 :
915 0);
916 writeb (EE_ENB, ee_addr);
917 eeprom_delay ();
918 }
919
920
921 writeb (~EE_CS, ee_addr);
922 eeprom_delay ();
923
924 DPRINTK ("EXIT - returning %d\n", retval);
925 return retval;
926}
927
928
929
930
931
932
933
934#define MDIO_DIR 0x80
935#define MDIO_DATA_OUT 0x04
936#define MDIO_DATA_IN 0x02
937#define MDIO_CLK 0x01
938#define MDIO_WRITE0 (MDIO_DIR)
939#define MDIO_WRITE1 (MDIO_DIR | MDIO_DATA_OUT)
940
941#define mdio_delay() readb(mdio_addr)
942
943
944static char mii_2_8139_map[8] = {
945 BasicModeCtrl,
946 BasicModeStatus,
947 0,
948 0,
949 NWayAdvert,
950 NWayLPAR,
951 NWayExpansion,
952 0
953};
954
955
956
957static void mdio_sync (void *mdio_addr)
958{
959 int i;
960
961 DPRINTK ("ENTER\n");
962
963 for (i = 32; i >= 0; i--) {
964 writeb (MDIO_WRITE1, mdio_addr);
965 mdio_delay ();
966 writeb (MDIO_WRITE1 | MDIO_CLK, mdio_addr);
967 mdio_delay ();
968 }
969
970 DPRINTK ("EXIT\n");
971}
972
973
974static int mdio_read (struct net_device *dev, int phy_id, int location)
975{
976 struct netdrv_private *tp = netdev_priv(dev);
977 void *mdio_addr = tp->mmio_addr + Config4;
978 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
979 int retval = 0;
980 int i;
981
982 DPRINTK ("ENTER\n");
983
984 if (phy_id > 31) {
985 DPRINTK ("EXIT after directly using 8139 internal regs\n");
986 return location < 8 && mii_2_8139_map[location] ?
987 readw (tp->mmio_addr + mii_2_8139_map[location]) : 0;
988 }
989 mdio_sync (mdio_addr);
990
991 for (i = 15; i >= 0; i--) {
992 int dataval = (mii_cmd & (1 << i)) ? MDIO_DATA_OUT : 0;
993
994 writeb (MDIO_DIR | dataval, mdio_addr);
995 mdio_delay ();
996 writeb (MDIO_DIR | dataval | MDIO_CLK, mdio_addr);
997 mdio_delay ();
998 }
999
1000
1001 for (i = 19; i > 0; i--) {
1002 writeb (0, mdio_addr);
1003 mdio_delay ();
1004 retval =
1005 (retval << 1) | ((readb (mdio_addr) & MDIO_DATA_IN) ? 1
1006 : 0);
1007 writeb (MDIO_CLK, mdio_addr);
1008 mdio_delay ();
1009 }
1010
1011 DPRINTK ("EXIT, returning %d\n", (retval >> 1) & 0xffff);
1012 return (retval >> 1) & 0xffff;
1013}
1014
1015
1016static void mdio_write (struct net_device *dev, int phy_id, int location,
1017 int value)
1018{
1019 struct netdrv_private *tp = netdev_priv(dev);
1020 void *mdio_addr = tp->mmio_addr + Config4;
1021 int mii_cmd =
1022 (0x5002 << 16) | (phy_id << 23) | (location << 18) | value;
1023 int i;
1024
1025 DPRINTK ("ENTER\n");
1026
1027 if (phy_id > 31) {
1028 if (location < 8 && mii_2_8139_map[location]) {
1029 writew (value,
1030 tp->mmio_addr + mii_2_8139_map[location]);
1031 readw (tp->mmio_addr + mii_2_8139_map[location]);
1032 }
1033 DPRINTK ("EXIT after directly using 8139 internal regs\n");
1034 return;
1035 }
1036 mdio_sync (mdio_addr);
1037
1038
1039 for (i = 31; i >= 0; i--) {
1040 int dataval =
1041 (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
1042 writeb (dataval, mdio_addr);
1043 mdio_delay ();
1044 writeb (dataval | MDIO_CLK, mdio_addr);
1045 mdio_delay ();
1046 }
1047
1048
1049 for (i = 2; i > 0; i--) {
1050 writeb (0, mdio_addr);
1051 mdio_delay ();
1052 writeb (MDIO_CLK, mdio_addr);
1053 mdio_delay ();
1054 }
1055
1056 DPRINTK ("EXIT\n");
1057}
1058
1059
1060static int netdrv_open (struct net_device *dev)
1061{
1062 struct netdrv_private *tp = netdev_priv(dev);
1063 int retval;
1064#ifdef NETDRV_DEBUG
1065 void *ioaddr = tp->mmio_addr;
1066#endif
1067
1068 DPRINTK ("ENTER\n");
1069
1070 retval = request_irq (dev->irq, netdrv_interrupt, IRQF_SHARED, dev->name, dev);
1071 if (retval) {
1072 DPRINTK ("EXIT, returning %d\n", retval);
1073 return retval;
1074 }
1075
1076 tp->tx_bufs = pci_alloc_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
1077 &tp->tx_bufs_dma);
1078 tp->rx_ring = pci_alloc_consistent(tp->pci_dev, RX_BUF_TOT_LEN,
1079 &tp->rx_ring_dma);
1080 if (tp->tx_bufs == NULL || tp->rx_ring == NULL) {
1081 free_irq(dev->irq, dev);
1082
1083 if (tp->tx_bufs)
1084 pci_free_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
1085 tp->tx_bufs, tp->tx_bufs_dma);
1086 if (tp->rx_ring)
1087 pci_free_consistent(tp->pci_dev, RX_BUF_TOT_LEN,
1088 tp->rx_ring, tp->rx_ring_dma);
1089
1090 DPRINTK ("EXIT, returning -ENOMEM\n");
1091 return -ENOMEM;
1092
1093 }
1094
1095 tp->full_duplex = tp->duplex_lock;
1096 tp->tx_flag = (TX_FIFO_THRESH << 11) & 0x003f0000;
1097
1098 netdrv_init_ring (dev);
1099 netdrv_hw_start (dev);
1100
1101 DPRINTK ("%s: netdrv_open() ioaddr %#lx IRQ %d"
1102 " GP Pins %2.2x %s-duplex.\n",
1103 dev->name, pci_resource_start (tp->pci_dev, 1),
1104 dev->irq, NETDRV_R8 (MediaStatus),
1105 tp->full_duplex ? "full" : "half");
1106
1107
1108
1109 init_timer (&tp->timer);
1110 tp->timer.expires = jiffies + 3 * HZ;
1111 tp->timer.data = (unsigned long) dev;
1112 tp->timer.function = &netdrv_timer;
1113 add_timer (&tp->timer);
1114
1115 DPRINTK ("EXIT, returning 0\n");
1116 return 0;
1117}
1118
1119
1120
1121static void netdrv_hw_start (struct net_device *dev)
1122{
1123 struct netdrv_private *tp = netdev_priv(dev);
1124 void *ioaddr = tp->mmio_addr;
1125 u32 i;
1126
1127 DPRINTK ("ENTER\n");
1128
1129
1130 NETDRV_W8 (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear) | CmdReset);
1131 udelay (100);
1132
1133
1134 for (i = 1000; i > 0; i--)
1135 if ((NETDRV_R8 (ChipCmd) & CmdReset) == 0)
1136 break;
1137
1138
1139 NETDRV_W32_F (MAC0 + 0, cpu_to_le32 (*(u32 *) (dev->dev_addr + 0)));
1140 NETDRV_W32_F (MAC0 + 4, cpu_to_le32 (*(u32 *) (dev->dev_addr + 4)));
1141
1142
1143 NETDRV_W8_F (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear) |
1144 CmdRxEnb | CmdTxEnb);
1145
1146 i = netdrv_rx_config |
1147 (NETDRV_R32 (RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
1148 NETDRV_W32_F (RxConfig, i);
1149
1150
1151 NETDRV_W32 (TxConfig, (TX_DMA_BURST << TxDMAShift));
1152
1153
1154 NETDRV_W8_F (Cfg9346, Cfg9346_Unlock);
1155 udelay (10);
1156
1157 tp->cur_rx = 0;
1158
1159
1160 NETDRV_W8_F (Cfg9346, Cfg9346_Lock);
1161 udelay (10);
1162
1163
1164 NETDRV_W32_F (RxBuf, tp->rx_ring_dma);
1165
1166
1167 for (i = 0; i < NUM_TX_DESC; i++)
1168 NETDRV_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs));
1169
1170 NETDRV_W32_F (RxMissed, 0);
1171
1172 netdrv_set_rx_mode (dev);
1173
1174
1175 NETDRV_W16 (MultiIntr, NETDRV_R16 (MultiIntr) & MultiIntrClear);
1176
1177
1178 NETDRV_W8_F (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear) |
1179 CmdRxEnb | CmdTxEnb);
1180
1181
1182 NETDRV_W16_F (IntrMask, netdrv_intr_mask);
1183
1184 netif_start_queue (dev);
1185
1186 DPRINTK ("EXIT\n");
1187}
1188
1189
1190
1191static void netdrv_init_ring (struct net_device *dev)
1192{
1193 struct netdrv_private *tp = netdev_priv(dev);
1194 int i;
1195
1196 DPRINTK ("ENTER\n");
1197
1198 tp->cur_rx = 0;
1199 atomic_set (&tp->cur_tx, 0);
1200 atomic_set (&tp->dirty_tx, 0);
1201
1202 for (i = 0; i < NUM_TX_DESC; i++) {
1203 tp->tx_info[i].skb = NULL;
1204 tp->tx_info[i].mapping = 0;
1205 tp->tx_buf[i] = &tp->tx_bufs[i * TX_BUF_SIZE];
1206 }
1207
1208 DPRINTK ("EXIT\n");
1209}
1210
1211
1212static void netdrv_timer (unsigned long data)
1213{
1214 struct net_device *dev = (struct net_device *) data;
1215 struct netdrv_private *tp = netdev_priv(dev);
1216 void *ioaddr = tp->mmio_addr;
1217 int next_tick = 60 * HZ;
1218 int mii_lpa;
1219
1220 mii_lpa = mdio_read (dev, tp->phys[0], MII_LPA);
1221
1222 if (!tp->duplex_lock && mii_lpa != 0xffff) {
1223 int duplex = (mii_lpa & LPA_100FULL)
1224 || (mii_lpa & 0x01C0) == 0x0040;
1225 if (tp->full_duplex != duplex) {
1226 tp->full_duplex = duplex;
1227 printk (KERN_INFO
1228 "%s: Setting %s-duplex based on MII #%d link"
1229 " partner ability of %4.4x.\n", dev->name,
1230 tp->full_duplex ? "full" : "half",
1231 tp->phys[0], mii_lpa);
1232 NETDRV_W8 (Cfg9346, Cfg9346_Unlock);
1233 NETDRV_W8 (Config1, tp->full_duplex ? 0x60 : 0x20);
1234 NETDRV_W8 (Cfg9346, Cfg9346_Lock);
1235 }
1236 }
1237
1238 DPRINTK ("%s: Media selection tick, Link partner %4.4x.\n",
1239 dev->name, NETDRV_R16 (NWayLPAR));
1240 DPRINTK ("%s: Other registers are IntMask %4.4x IntStatus %4.4x"
1241 " RxStatus %4.4x.\n", dev->name,
1242 NETDRV_R16 (IntrMask),
1243 NETDRV_R16 (IntrStatus),
1244 NETDRV_R32 (RxEarlyStatus));
1245 DPRINTK ("%s: Chip config %2.2x %2.2x.\n",
1246 dev->name, NETDRV_R8 (Config0),
1247 NETDRV_R8 (Config1));
1248
1249 tp->timer.expires = jiffies + next_tick;
1250 add_timer (&tp->timer);
1251}
1252
1253
1254static void netdrv_tx_clear (struct net_device *dev)
1255{
1256 int i;
1257 struct netdrv_private *tp = netdev_priv(dev);
1258
1259 atomic_set (&tp->cur_tx, 0);
1260 atomic_set (&tp->dirty_tx, 0);
1261
1262
1263 for (i = 0; i < NUM_TX_DESC; i++) {
1264 struct ring_info *rp = &tp->tx_info[i];
1265 if (rp->mapping != 0) {
1266 pci_unmap_single (tp->pci_dev, rp->mapping,
1267 rp->skb->len, PCI_DMA_TODEVICE);
1268 rp->mapping = 0;
1269 }
1270 if (rp->skb) {
1271 dev_kfree_skb (rp->skb);
1272 rp->skb = NULL;
1273 dev->stats.tx_dropped++;
1274 }
1275 }
1276}
1277
1278
1279static void netdrv_tx_timeout (struct net_device *dev)
1280{
1281 struct netdrv_private *tp = netdev_priv(dev);
1282 void *ioaddr = tp->mmio_addr;
1283 int i;
1284 u8 tmp8;
1285 unsigned long flags;
1286
1287 DPRINTK ("%s: Transmit timeout, status %2.2x %4.4x "
1288 "media %2.2x.\n", dev->name,
1289 NETDRV_R8 (ChipCmd),
1290 NETDRV_R16 (IntrStatus),
1291 NETDRV_R8 (MediaStatus));
1292
1293
1294 tmp8 = NETDRV_R8 (ChipCmd);
1295 if (tmp8 & CmdTxEnb)
1296 NETDRV_W8 (ChipCmd, tmp8 & ~CmdTxEnb);
1297
1298
1299 NETDRV_W16 (IntrMask, 0x0000);
1300
1301
1302 printk (KERN_DEBUG "%s: Tx queue start entry %d dirty entry %d.\n",
1303 dev->name, atomic_read (&tp->cur_tx),
1304 atomic_read (&tp->dirty_tx));
1305 for (i = 0; i < NUM_TX_DESC; i++)
1306 printk (KERN_DEBUG "%s: Tx descriptor %d is %8.8lx.%s\n",
1307 dev->name, i, NETDRV_R32 (TxStatus0 + (i * 4)),
1308 i == atomic_read (&tp->dirty_tx) % NUM_TX_DESC ?
1309 " (queue head)" : "");
1310
1311
1312 spin_lock_irqsave (&tp->lock, flags);
1313
1314 netdrv_tx_clear (dev);
1315
1316 spin_unlock_irqrestore (&tp->lock, flags);
1317
1318
1319 netdrv_hw_start (dev);
1320
1321 netif_wake_queue (dev);
1322}
1323
1324
1325
1326static int netdrv_start_xmit (struct sk_buff *skb, struct net_device *dev)
1327{
1328 struct netdrv_private *tp = netdev_priv(dev);
1329 void *ioaddr = tp->mmio_addr;
1330 int entry;
1331
1332
1333 entry = atomic_read (&tp->cur_tx) % NUM_TX_DESC;
1334
1335 assert (tp->tx_info[entry].skb == NULL);
1336 assert (tp->tx_info[entry].mapping == 0);
1337
1338 tp->tx_info[entry].skb = skb;
1339
1340 skb_copy_from_linear_data(skb, tp->tx_buf[entry], skb->len);
1341
1342
1343 NETDRV_W32 (TxStatus0 + (entry * sizeof(u32)),
1344 tp->tx_flag | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
1345
1346 dev->trans_start = jiffies;
1347 atomic_inc (&tp->cur_tx);
1348 if ((atomic_read (&tp->cur_tx) - atomic_read (&tp->dirty_tx)) >= NUM_TX_DESC)
1349 netif_stop_queue (dev);
1350
1351 DPRINTK ("%s: Queued Tx packet at %p size %u to slot %d.\n",
1352 dev->name, skb->data, skb->len, entry);
1353
1354 return 0;
1355}
1356
1357
1358static void netdrv_tx_interrupt (struct net_device *dev,
1359 struct netdrv_private *tp,
1360 void *ioaddr)
1361{
1362 int cur_tx, dirty_tx, tx_left;
1363
1364 assert (dev != NULL);
1365 assert (tp != NULL);
1366 assert (ioaddr != NULL);
1367
1368 dirty_tx = atomic_read (&tp->dirty_tx);
1369
1370 cur_tx = atomic_read (&tp->cur_tx);
1371 tx_left = cur_tx - dirty_tx;
1372 while (tx_left > 0) {
1373 int entry = dirty_tx % NUM_TX_DESC;
1374 int txstatus;
1375
1376 txstatus = NETDRV_R32 (TxStatus0 + (entry * sizeof (u32)));
1377
1378 if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted)))
1379 break;
1380
1381
1382 if (txstatus & (TxOutOfWindow | TxAborted)) {
1383
1384 DPRINTK ("%s: Transmit error, Tx status %8.8x.\n",
1385 dev->name, txstatus);
1386 dev->stats.tx_errors++;
1387 if (txstatus & TxAborted) {
1388 dev->stats.tx_aborted_errors++;
1389 NETDRV_W32 (TxConfig, TxClearAbt | (TX_DMA_BURST << TxDMAShift));
1390 }
1391 if (txstatus & TxCarrierLost)
1392 dev->stats.tx_carrier_errors++;
1393 if (txstatus & TxOutOfWindow)
1394 dev->stats.tx_window_errors++;
1395 } else {
1396 if (txstatus & TxUnderrun) {
1397
1398 if (tp->tx_flag < 0x00300000)
1399 tp->tx_flag += 0x00020000;
1400 dev->stats.tx_fifo_errors++;
1401 }
1402 dev->stats.collisions += (txstatus >> 24) & 15;
1403 dev->stats.tx_bytes += txstatus & 0x7ff;
1404 dev->stats.tx_packets++;
1405 }
1406
1407
1408 if (tp->tx_info[entry].mapping != 0) {
1409 pci_unmap_single(tp->pci_dev,
1410 tp->tx_info[entry].mapping,
1411 tp->tx_info[entry].skb->len,
1412 PCI_DMA_TODEVICE);
1413 tp->tx_info[entry].mapping = 0;
1414 }
1415 dev_kfree_skb_irq (tp->tx_info[entry].skb);
1416 tp->tx_info[entry].skb = NULL;
1417 dirty_tx++;
1418 if (dirty_tx < 0) {
1419 atomic_sub (cur_tx, &tp->cur_tx);
1420 dirty_tx = cur_tx - tx_left + 1;
1421 }
1422 if (netif_queue_stopped (dev))
1423 netif_wake_queue (dev);
1424
1425 cur_tx = atomic_read (&tp->cur_tx);
1426 tx_left = cur_tx - dirty_tx;
1427
1428 }
1429
1430#ifndef NETDRV_NDEBUG
1431 if (atomic_read (&tp->cur_tx) - dirty_tx > NUM_TX_DESC) {
1432 printk (KERN_ERR
1433 "%s: Out-of-sync dirty pointer, %d vs. %d.\n",
1434 dev->name, dirty_tx, atomic_read (&tp->cur_tx));
1435 dirty_tx += NUM_TX_DESC;
1436 }
1437#endif
1438
1439 atomic_set (&tp->dirty_tx, dirty_tx);
1440}
1441
1442
1443
1444static void netdrv_rx_err (u32 rx_status, struct net_device *dev,
1445 struct netdrv_private *tp, void *ioaddr)
1446{
1447 u8 tmp8;
1448 int tmp_work = 1000;
1449
1450 DPRINTK ("%s: Ethernet frame had errors, status %8.8x.\n",
1451 dev->name, rx_status);
1452 if (rx_status & RxTooLong) {
1453 DPRINTK ("%s: Oversized Ethernet frame, status %4.4x!\n",
1454 dev->name, rx_status);
1455
1456 }
1457 dev->stats.rx_errors++;
1458 if (rx_status & (RxBadSymbol | RxBadAlign))
1459 dev->stats.rx_frame_errors++;
1460 if (rx_status & (RxRunt | RxTooLong))
1461 dev->stats.rx_length_errors++;
1462 if (rx_status & RxCRCErr)
1463 dev->stats.rx_crc_errors++;
1464
1465 tp->cur_rx = 0;
1466
1467
1468 tmp8 = NETDRV_R8 (ChipCmd) & ChipCmdClear;
1469 NETDRV_W8_F (ChipCmd, tmp8 | CmdTxEnb);
1470
1471
1472 netdrv_set_rx_mode (dev);
1473
1474
1475
1476 while (--tmp_work > 0) {
1477 tmp8 = NETDRV_R8 (ChipCmd);
1478 if ((tmp8 & CmdRxEnb) && (tmp8 & CmdTxEnb))
1479 break;
1480 NETDRV_W8_F (ChipCmd,
1481 (tmp8 & ChipCmdClear) | CmdRxEnb | CmdTxEnb);
1482 }
1483
1484
1485
1486 netdrv_set_rx_mode (dev);
1487
1488 if (tmp_work <= 0)
1489 printk (KERN_WARNING PFX "tx/rx enable wait too long\n");
1490}
1491
1492
1493
1494
1495static void netdrv_rx_interrupt (struct net_device *dev,
1496 struct netdrv_private *tp, void *ioaddr)
1497{
1498 unsigned char *rx_ring;
1499 u16 cur_rx;
1500
1501 assert (dev != NULL);
1502 assert (tp != NULL);
1503 assert (ioaddr != NULL);
1504
1505 rx_ring = tp->rx_ring;
1506 cur_rx = tp->cur_rx;
1507
1508 DPRINTK ("%s: In netdrv_rx(), current %4.4x BufAddr %4.4x,"
1509 " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx,
1510 NETDRV_R16 (RxBufAddr),
1511 NETDRV_R16 (RxBufPtr), NETDRV_R8 (ChipCmd));
1512
1513 while ((NETDRV_R8 (ChipCmd) & RxBufEmpty) == 0) {
1514 int ring_offset = cur_rx % RX_BUF_LEN;
1515 u32 rx_status;
1516 unsigned int rx_size;
1517 unsigned int pkt_size;
1518 struct sk_buff *skb;
1519
1520
1521 rx_status = le32_to_cpu (*(u32 *) (rx_ring + ring_offset));
1522 rx_size = rx_status >> 16;
1523 pkt_size = rx_size - 4;
1524
1525 DPRINTK ("%s: netdrv_rx() status %4.4x, size %4.4x,"
1526 " cur %4.4x.\n", dev->name, rx_status,
1527 rx_size, cur_rx);
1528#if defined(NETDRV_DEBUG) && (NETDRV_DEBUG > 2)
1529 {
1530 int i;
1531 DPRINTK ("%s: Frame contents ", dev->name);
1532 for (i = 0; i < 70; i++)
1533 printk (" %2.2x",
1534 rx_ring[ring_offset + i]);
1535 printk (".\n");
1536 }
1537#endif
1538
1539
1540
1541
1542
1543
1544 if ((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
1545 (!(rx_status & RxStatusOK))) {
1546 netdrv_rx_err (rx_status, dev, tp, ioaddr);
1547 return;
1548 }
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559 skb = dev_alloc_skb (pkt_size + 2);
1560 if (skb) {
1561 skb_reserve (skb, 2);
1562
1563 skb_copy_to_linear_data (skb, &rx_ring[ring_offset + 4], pkt_size);
1564 skb_put (skb, pkt_size);
1565
1566 skb->protocol = eth_type_trans (skb, dev);
1567 netif_rx (skb);
1568 dev->stats.rx_bytes += pkt_size;
1569 dev->stats.rx_packets++;
1570 } else {
1571 printk (KERN_WARNING
1572 "%s: Memory squeeze, dropping packet.\n",
1573 dev->name);
1574 dev->stats.rx_dropped++;
1575 }
1576
1577 cur_rx = (cur_rx + rx_size + 4 + 3) & ~3;
1578 NETDRV_W16_F (RxBufPtr, cur_rx - 16);
1579 }
1580
1581 DPRINTK ("%s: Done netdrv_rx(), current %4.4x BufAddr %4.4x,"
1582 " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx,
1583 NETDRV_R16 (RxBufAddr),
1584 NETDRV_R16 (RxBufPtr), NETDRV_R8 (ChipCmd));
1585
1586 tp->cur_rx = cur_rx;
1587}
1588
1589
1590static void netdrv_weird_interrupt (struct net_device *dev,
1591 struct netdrv_private *tp,
1592 void *ioaddr,
1593 int status, int link_changed)
1594{
1595 printk (KERN_DEBUG "%s: Abnormal interrupt, status %8.8x.\n",
1596 dev->name, status);
1597
1598 assert (dev != NULL);
1599 assert (tp != NULL);
1600 assert (ioaddr != NULL);
1601
1602
1603 dev->stats.rx_missed_errors += NETDRV_R32 (RxMissed);
1604 NETDRV_W32 (RxMissed, 0);
1605
1606 if ((status & RxUnderrun) && link_changed &&
1607 (tp->drv_flags & HAS_LNK_CHNG)) {
1608
1609 int lpar = NETDRV_R16 (NWayLPAR);
1610 int duplex = (lpar & 0x0100) || (lpar & 0x01C0) == 0x0040
1611 || tp->duplex_lock;
1612 if (tp->full_duplex != duplex) {
1613 tp->full_duplex = duplex;
1614 NETDRV_W8 (Cfg9346, Cfg9346_Unlock);
1615 NETDRV_W8 (Config1, tp->full_duplex ? 0x60 : 0x20);
1616 NETDRV_W8 (Cfg9346, Cfg9346_Lock);
1617 }
1618 status &= ~RxUnderrun;
1619 }
1620
1621
1622 if (status &
1623 (RxUnderrun | RxOverflow | RxErr | RxFIFOOver))
1624 dev->stats.rx_errors++;
1625
1626 if (status & (PCSTimeout))
1627 dev->stats.rx_length_errors++;
1628 if (status & (RxUnderrun | RxFIFOOver))
1629 dev->stats.rx_fifo_errors++;
1630 if (status & RxOverflow) {
1631 dev->stats.rx_over_errors++;
1632 tp->cur_rx = NETDRV_R16 (RxBufAddr) % RX_BUF_LEN;
1633 NETDRV_W16_F (RxBufPtr, tp->cur_rx - 16);
1634 }
1635 if (status & PCIErr) {
1636 u16 pci_cmd_status;
1637 pci_read_config_word (tp->pci_dev, PCI_STATUS, &pci_cmd_status);
1638
1639 printk (KERN_ERR "%s: PCI Bus error %4.4x.\n",
1640 dev->name, pci_cmd_status);
1641 }
1642}
1643
1644
1645
1646
1647static irqreturn_t netdrv_interrupt (int irq, void *dev_instance)
1648{
1649 struct net_device *dev = (struct net_device *) dev_instance;
1650 struct netdrv_private *tp = netdev_priv(dev);
1651 int boguscnt = max_interrupt_work;
1652 void *ioaddr = tp->mmio_addr;
1653 int status = 0, link_changed = 0;
1654 int handled = 0;
1655
1656 spin_lock (&tp->lock);
1657
1658 do {
1659 status = NETDRV_R16 (IntrStatus);
1660
1661
1662 if (status == 0xFFFF)
1663 break;
1664
1665 handled = 1;
1666
1667 NETDRV_W16_F (IntrStatus, status);
1668
1669 DPRINTK ("%s: interrupt status=%#4.4x new intstat=%#4.4x.\n",
1670 dev->name, status,
1671 NETDRV_R16 (IntrStatus));
1672
1673 if ((status &
1674 (PCIErr | PCSTimeout | RxUnderrun | RxOverflow |
1675 RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0)
1676 break;
1677
1678
1679 if (status & (PCIErr | PCSTimeout | RxUnderrun | RxOverflow |
1680 RxFIFOOver | TxErr | RxErr))
1681 netdrv_weird_interrupt (dev, tp, ioaddr,
1682 status, link_changed);
1683
1684 if (status & (RxOK | RxUnderrun | RxOverflow | RxFIFOOver))
1685 netdrv_rx_interrupt (dev, tp, ioaddr);
1686
1687 if (status & (TxOK | TxErr))
1688 netdrv_tx_interrupt (dev, tp, ioaddr);
1689
1690 boguscnt--;
1691 } while (boguscnt > 0);
1692
1693 if (boguscnt <= 0) {
1694 printk (KERN_WARNING
1695 "%s: Too much work at interrupt, "
1696 "IntrStatus=0x%4.4x.\n", dev->name,
1697 status);
1698
1699
1700 NETDRV_W16 (IntrStatus, 0xffff);
1701 }
1702
1703 spin_unlock (&tp->lock);
1704
1705 DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n",
1706 dev->name, NETDRV_R16 (IntrStatus));
1707 return IRQ_RETVAL(handled);
1708}
1709
1710
1711static int netdrv_close (struct net_device *dev)
1712{
1713 struct netdrv_private *tp = netdev_priv(dev);
1714 void *ioaddr = tp->mmio_addr;
1715 unsigned long flags;
1716
1717 DPRINTK ("ENTER\n");
1718
1719 netif_stop_queue (dev);
1720
1721 DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n",
1722 dev->name, NETDRV_R16 (IntrStatus));
1723
1724 del_timer_sync (&tp->timer);
1725
1726 spin_lock_irqsave (&tp->lock, flags);
1727
1728
1729 NETDRV_W8 (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear));
1730
1731
1732 NETDRV_W16 (IntrMask, 0x0000);
1733
1734
1735 dev->stats.rx_missed_errors += NETDRV_R32 (RxMissed);
1736 NETDRV_W32 (RxMissed, 0);
1737
1738 spin_unlock_irqrestore (&tp->lock, flags);
1739
1740 free_irq (dev->irq, dev);
1741
1742 netdrv_tx_clear (dev);
1743
1744 pci_free_consistent(tp->pci_dev, RX_BUF_TOT_LEN,
1745 tp->rx_ring, tp->rx_ring_dma);
1746 pci_free_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
1747 tp->tx_bufs, tp->tx_bufs_dma);
1748 tp->rx_ring = NULL;
1749 tp->tx_bufs = NULL;
1750
1751
1752 NETDRV_W8 (Cfg9346, Cfg9346_Unlock);
1753 NETDRV_W8 (Config1, 0x03);
1754 NETDRV_W8 (Cfg9346, Cfg9346_Lock);
1755
1756 DPRINTK ("EXIT\n");
1757 return 0;
1758}
1759
1760
1761static int netdrv_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
1762{
1763 struct netdrv_private *tp = netdev_priv(dev);
1764 struct mii_ioctl_data *data = if_mii(rq);
1765 unsigned long flags;
1766 int rc = 0;
1767
1768 DPRINTK ("ENTER\n");
1769
1770 switch (cmd) {
1771 case SIOCGMIIPHY:
1772 data->phy_id = tp->phys[0] & 0x3f;
1773
1774
1775 case SIOCGMIIREG:
1776 spin_lock_irqsave (&tp->lock, flags);
1777 data->val_out = mdio_read (dev, data->phy_id & 0x1f, data->reg_num & 0x1f);
1778 spin_unlock_irqrestore (&tp->lock, flags);
1779 break;
1780
1781 case SIOCSMIIREG:
1782 if (!capable (CAP_NET_ADMIN)) {
1783 rc = -EPERM;
1784 break;
1785 }
1786
1787 spin_lock_irqsave (&tp->lock, flags);
1788 mdio_write (dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
1789 spin_unlock_irqrestore (&tp->lock, flags);
1790 break;
1791
1792 default:
1793 rc = -EOPNOTSUPP;
1794 break;
1795 }
1796
1797 DPRINTK ("EXIT, returning %d\n", rc);
1798 return rc;
1799}
1800
1801
1802
1803
1804static void netdrv_set_rx_mode (struct net_device *dev)
1805{
1806 struct netdrv_private *tp = netdev_priv(dev);
1807 void *ioaddr = tp->mmio_addr;
1808 u32 mc_filter[2];
1809 int i, rx_mode;
1810 u32 tmp;
1811
1812 DPRINTK ("ENTER\n");
1813
1814 DPRINTK ("%s: netdrv_set_rx_mode(%4.4x) done -- Rx config %8.8x.\n",
1815 dev->name, dev->flags, NETDRV_R32 (RxConfig));
1816
1817
1818 if (dev->flags & IFF_PROMISC) {
1819 rx_mode =
1820 AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
1821 AcceptAllPhys;
1822 mc_filter[1] = mc_filter[0] = 0xffffffff;
1823 } else if ((dev->mc_count > multicast_filter_limit)
1824 || (dev->flags & IFF_ALLMULTI)) {
1825
1826 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
1827 mc_filter[1] = mc_filter[0] = 0xffffffff;
1828 } else {
1829 struct dev_mc_list *mclist;
1830 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
1831 mc_filter[1] = mc_filter[0] = 0;
1832 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1833 i++, mclist = mclist->next) {
1834 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1835
1836 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
1837 }
1838 }
1839
1840
1841 if (!in_irq ())
1842 spin_lock_irq (&tp->lock);
1843
1844
1845 tmp = netdrv_rx_config | rx_mode |
1846 (NETDRV_R32 (RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
1847 NETDRV_W32_F (RxConfig, tmp);
1848 NETDRV_W32_F (MAR0 + 0, mc_filter[0]);
1849 NETDRV_W32_F (MAR0 + 4, mc_filter[1]);
1850
1851 if (!in_irq ())
1852 spin_unlock_irq (&tp->lock);
1853
1854 DPRINTK ("EXIT\n");
1855}
1856
1857
1858#ifdef CONFIG_PM
1859
1860static int netdrv_suspend (struct pci_dev *pdev, pm_message_t state)
1861{
1862 struct net_device *dev = pci_get_drvdata (pdev);
1863 struct netdrv_private *tp = netdev_priv(dev);
1864 void *ioaddr = tp->mmio_addr;
1865 unsigned long flags;
1866
1867 if (!netif_running(dev))
1868 return 0;
1869 netif_device_detach (dev);
1870
1871 spin_lock_irqsave (&tp->lock, flags);
1872
1873
1874 NETDRV_W16 (IntrMask, 0x0000);
1875 NETDRV_W8 (ChipCmd, (NETDRV_R8 (ChipCmd) & ChipCmdClear));
1876
1877
1878 dev->stats.rx_missed_errors += NETDRV_R32 (RxMissed);
1879 NETDRV_W32 (RxMissed, 0);
1880
1881 spin_unlock_irqrestore (&tp->lock, flags);
1882
1883 pci_save_state (pdev);
1884 pci_set_power_state (pdev, PCI_D3hot);
1885
1886 return 0;
1887}
1888
1889
1890static int netdrv_resume (struct pci_dev *pdev)
1891{
1892 struct net_device *dev = pci_get_drvdata (pdev);
1893
1894
1895 if (!netif_running(dev))
1896 return 0;
1897 pci_set_power_state (pdev, PCI_D0);
1898 pci_restore_state (pdev);
1899 netif_device_attach (dev);
1900 netdrv_hw_start (dev);
1901
1902 return 0;
1903}
1904
1905#endif
1906
1907
1908static struct pci_driver netdrv_pci_driver = {
1909 .name = MODNAME,
1910 .id_table = netdrv_pci_tbl,
1911 .probe = netdrv_init_one,
1912 .remove = __devexit_p(netdrv_remove_one),
1913#ifdef CONFIG_PM
1914 .suspend = netdrv_suspend,
1915 .resume = netdrv_resume,
1916#endif
1917};
1918
1919
1920static int __init netdrv_init_module (void)
1921{
1922
1923#ifdef MODULE
1924 printk(version);
1925#endif
1926 return pci_register_driver(&netdrv_pci_driver);
1927}
1928
1929
1930static void __exit netdrv_cleanup_module (void)
1931{
1932 pci_unregister_driver (&netdrv_pci_driver);
1933}
1934
1935
1936module_init(netdrv_init_module);
1937module_exit(netdrv_cleanup_module);
1938