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