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#define DRV_NAME "winbond-840"
48#define DRV_VERSION "1.01-d"
49#define DRV_RELDATE "Nov-17-2001"
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67static int debug = 1;
68static int max_interrupt_work = 20;
69
70
71static int multicast_filter_limit = 32;
72
73
74
75static int rx_copybreak;
76
77
78
79
80
81
82#define MAX_UNITS 8
83static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
84static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
85
86
87
88
89
90
91
92
93#define TX_RING_SIZE 16
94#define TX_QUEUE_LEN 10
95#define TX_QUEUE_LEN_RESTART 5
96#define RX_RING_SIZE 32
97
98#define TX_BUFLIMIT (1024-128)
99
100
101
102
103
104#define TX_FIFO_SIZE (2048)
105#define TX_BUG_FIFO_LIMIT (TX_FIFO_SIZE-1514-16)
106
107
108
109
110#define TX_TIMEOUT (2*HZ)
111
112#define PKT_BUF_SZ 1536
113
114#ifndef __KERNEL__
115#define __KERNEL__
116#endif
117#if !defined(__OPTIMIZE__)
118#warning You must compile this file with the correct options!
119#warning See the last lines of the source file.
120#error You must compile this driver with "-O".
121#endif
122
123
124#include <linux/module.h>
125#include <linux/kernel.h>
126#include <linux/string.h>
127#include <linux/timer.h>
128#include <linux/errno.h>
129#include <linux/ioport.h>
130#include <linux/slab.h>
131#include <linux/interrupt.h>
132#include <linux/pci.h>
133#include <linux/netdevice.h>
134#include <linux/etherdevice.h>
135#include <linux/skbuff.h>
136#include <linux/init.h>
137#include <linux/delay.h>
138#include <linux/ethtool.h>
139#include <linux/mii.h>
140#include <linux/rtnetlink.h>
141#include <linux/crc32.h>
142#include <asm/uaccess.h>
143#include <asm/processor.h>
144#include <asm/bitops.h>
145#include <asm/io.h>
146#include <asm/irq.h>
147
148
149static char version[] __devinitdata =
150KERN_INFO DRV_NAME ".c:v" DRV_VERSION " (2.4 port) " DRV_RELDATE " Donald Becker <becker@scyld.com>\n"
151KERN_INFO " http://www.scyld.com/network/drivers.html\n";
152
153MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
154MODULE_DESCRIPTION("Winbond W89c840 Ethernet driver");
155MODULE_LICENSE("GPL");
156
157MODULE_PARM(max_interrupt_work, "i");
158MODULE_PARM(debug, "i");
159MODULE_PARM(rx_copybreak, "i");
160MODULE_PARM(multicast_filter_limit, "i");
161MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
162MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
163MODULE_PARM_DESC(max_interrupt_work, "winbond-840 maximum events handled per interrupt");
164MODULE_PARM_DESC(debug, "winbond-840 debug level (0-6)");
165MODULE_PARM_DESC(rx_copybreak, "winbond-840 copy breakpoint for copy-only-tiny-frames");
166MODULE_PARM_DESC(multicast_filter_limit, "winbond-840 maximum number of filtered multicast addresses");
167MODULE_PARM_DESC(options, "winbond-840: Bits 0-3: media type, bit 17: full duplex");
168MODULE_PARM_DESC(full_duplex, "winbond-840 full duplex setting(s) (1)");
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222enum pci_id_flags_bits {
223
224 PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
225
226 PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4,
227 PCI_ADDR_64BITS=0x100, PCI_NO_ACPI_WAKE=0x200, PCI_NO_MIN_LATENCY=0x400,
228};
229enum chip_capability_flags {
230 CanHaveMII=1, HasBrokenTx=2, AlwaysFDX=4, FDXOnNoMII=8,};
231#ifdef USE_IO_OPS
232#define W840_FLAGS (PCI_USES_IO | PCI_ADDR0 | PCI_USES_MASTER)
233#else
234#define W840_FLAGS (PCI_USES_MEM | PCI_ADDR1 | PCI_USES_MASTER)
235#endif
236
237static struct pci_device_id w840_pci_tbl[] = {
238 { 0x1050, 0x0840, PCI_ANY_ID, 0x8153, 0, 0, 0 },
239 { 0x1050, 0x0840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
240 { 0x11f6, 0x2011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
241 { 0, }
242};
243MODULE_DEVICE_TABLE(pci, w840_pci_tbl);
244
245struct pci_id_info {
246 const char *name;
247 struct match_info {
248 int pci, pci_mask, subsystem, subsystem_mask;
249 int revision, revision_mask;
250 } id;
251 enum pci_id_flags_bits pci_flags;
252 int io_size;
253 int drv_flags;
254};
255static struct pci_id_info pci_id_tbl[] = {
256 {"Winbond W89c840",
257 { 0x08401050, 0xffffffff, 0x81530000, 0xffff0000 },
258 W840_FLAGS, 128, CanHaveMII | HasBrokenTx | FDXOnNoMII},
259 {"Winbond W89c840", { 0x08401050, 0xffffffff, },
260 W840_FLAGS, 128, CanHaveMII | HasBrokenTx},
261 {"Compex RL100-ATX", { 0x201111F6, 0xffffffff,},
262 W840_FLAGS, 128, CanHaveMII | HasBrokenTx},
263 {0,},
264};
265
266
267
268
269
270#ifdef USE_IO_OPS
271#undef readb
272#undef readw
273#undef readl
274#undef writeb
275#undef writew
276#undef writel
277#define readb inb
278#define readw inw
279#define readl inl
280#define writeb outb
281#define writew outw
282#define writel outl
283#endif
284
285
286
287
288
289
290
291enum w840_offsets {
292 PCIBusCfg=0x00, TxStartDemand=0x04, RxStartDemand=0x08,
293 RxRingPtr=0x0C, TxRingPtr=0x10,
294 IntrStatus=0x14, NetworkConfig=0x18, IntrEnable=0x1C,
295 RxMissed=0x20, EECtrl=0x24, MIICtrl=0x24, BootRom=0x28, GPTimer=0x2C,
296 CurRxDescAddr=0x30, CurRxBufAddr=0x34,
297 MulticastFilter0=0x38, MulticastFilter1=0x3C, StationAddr=0x40,
298 CurTxDescAddr=0x4C, CurTxBufAddr=0x50,
299};
300
301
302
303enum intr_status_bits {
304 NormalIntr=0x10000, AbnormalIntr=0x8000,
305 IntrPCIErr=0x2000, TimerInt=0x800,
306 IntrRxDied=0x100, RxNoBuf=0x80, IntrRxDone=0x40,
307 TxFIFOUnderflow=0x20, RxErrIntr=0x10,
308 TxIdle=0x04, IntrTxStopped=0x02, IntrTxDone=0x01,
309};
310
311
312enum rx_mode_bits {
313 AcceptErr=0x80, AcceptRunt=0x40,
314 AcceptBroadcast=0x20, AcceptMulticast=0x10,
315 AcceptAllPhys=0x08, AcceptMyPhys=0x02,
316};
317
318enum mii_reg_bits {
319 MDIO_ShiftClk=0x10000, MDIO_DataIn=0x80000, MDIO_DataOut=0x20000,
320 MDIO_EnbOutput=0x40000, MDIO_EnbIn = 0x00000,
321};
322
323
324struct w840_rx_desc {
325 s32 status;
326 s32 length;
327 u32 buffer1;
328 u32 buffer2;
329};
330
331struct w840_tx_desc {
332 s32 status;
333 s32 length;
334 u32 buffer1, buffer2;
335};
336
337
338enum desc_status_bits {
339 DescOwn=0x80000000, DescEndRing=0x02000000, DescUseLink=0x01000000,
340 DescWholePkt=0x60000000, DescStartPkt=0x20000000, DescEndPkt=0x40000000,
341 DescIntr=0x80000000,
342};
343
344#define MII_CNT 1
345struct netdev_private {
346 struct w840_rx_desc *rx_ring;
347 dma_addr_t rx_addr[RX_RING_SIZE];
348 struct w840_tx_desc *tx_ring;
349 dma_addr_t tx_addr[TX_RING_SIZE];
350 dma_addr_t ring_dma_addr;
351
352 struct sk_buff* rx_skbuff[RX_RING_SIZE];
353
354 struct sk_buff* tx_skbuff[TX_RING_SIZE];
355 struct net_device_stats stats;
356 struct timer_list timer;
357
358 spinlock_t lock;
359 int chip_id, drv_flags;
360 struct pci_dev *pci_dev;
361 int csr6;
362 struct w840_rx_desc *rx_head_desc;
363 unsigned int cur_rx, dirty_rx;
364 unsigned int rx_buf_sz;
365 unsigned int cur_tx, dirty_tx;
366 unsigned int tx_q_bytes;
367 unsigned int tx_full;
368
369 int mii_cnt;
370 unsigned char phys[MII_CNT];
371 u32 mii;
372 struct mii_if_info mii_if;
373};
374
375static int eeprom_read(long ioaddr, int location);
376static int mdio_read(struct net_device *dev, int phy_id, int location);
377static void mdio_write(struct net_device *dev, int phy_id, int location, int value);
378static int netdev_open(struct net_device *dev);
379static int update_link(struct net_device *dev);
380static void netdev_timer(unsigned long data);
381static void init_rxtx_rings(struct net_device *dev);
382static void free_rxtx_rings(struct netdev_private *np);
383static void init_registers(struct net_device *dev);
384static void tx_timeout(struct net_device *dev);
385static int alloc_ringdesc(struct net_device *dev);
386static void free_ringdesc(struct netdev_private *np);
387static int start_tx(struct sk_buff *skb, struct net_device *dev);
388static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs);
389static void netdev_error(struct net_device *dev, int intr_status);
390static int netdev_rx(struct net_device *dev);
391static u32 __set_rx_mode(struct net_device *dev);
392static void set_rx_mode(struct net_device *dev);
393static struct net_device_stats *get_stats(struct net_device *dev);
394static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
395static struct ethtool_ops netdev_ethtool_ops;
396static int netdev_close(struct net_device *dev);
397
398
399
400static int __devinit w840_probe1 (struct pci_dev *pdev,
401 const struct pci_device_id *ent)
402{
403 struct net_device *dev;
404 struct netdev_private *np;
405 static int find_cnt;
406 int chip_idx = ent->driver_data;
407 int irq;
408 int i, option = find_cnt < MAX_UNITS ? options[find_cnt] : 0;
409 long ioaddr;
410
411 i = pci_enable_device(pdev);
412 if (i) return i;
413
414 pci_set_master(pdev);
415
416 irq = pdev->irq;
417
418 if (pci_set_dma_mask(pdev,0xFFFFffff)) {
419 printk(KERN_WARNING "Winbond-840: Device %s disabled due to DMA limitations.\n",
420 pci_name(pdev));
421 return -EIO;
422 }
423 dev = alloc_etherdev(sizeof(*np));
424 if (!dev)
425 return -ENOMEM;
426 SET_MODULE_OWNER(dev);
427 SET_NETDEV_DEV(dev, &pdev->dev);
428
429 if (pci_request_regions(pdev, DRV_NAME))
430 goto err_out_netdev;
431
432#ifdef USE_IO_OPS
433 ioaddr = pci_resource_start(pdev, 0);
434#else
435 ioaddr = pci_resource_start(pdev, 1);
436 ioaddr = (long) ioremap (ioaddr, pci_id_tbl[chip_idx].io_size);
437 if (!ioaddr)
438 goto err_out_free_res;
439#endif
440
441 for (i = 0; i < 3; i++)
442 ((u16 *)dev->dev_addr)[i] = le16_to_cpu(eeprom_read(ioaddr, i));
443
444
445
446 writel(0x00000001, ioaddr + PCIBusCfg);
447
448 dev->base_addr = ioaddr;
449 dev->irq = irq;
450
451 np = dev->priv;
452 np->pci_dev = pdev;
453 np->chip_id = chip_idx;
454 np->drv_flags = pci_id_tbl[chip_idx].drv_flags;
455 spin_lock_init(&np->lock);
456 np->mii_if.dev = dev;
457 np->mii_if.mdio_read = mdio_read;
458 np->mii_if.mdio_write = mdio_write;
459
460 pci_set_drvdata(pdev, dev);
461
462 if (dev->mem_start)
463 option = dev->mem_start;
464
465
466 if (option > 0) {
467 if (option & 0x200)
468 np->mii_if.full_duplex = 1;
469 if (option & 15)
470 printk(KERN_INFO "%s: ignoring user supplied media type %d",
471 dev->name, option & 15);
472 }
473 if (find_cnt < MAX_UNITS && full_duplex[find_cnt] > 0)
474 np->mii_if.full_duplex = 1;
475
476 if (np->mii_if.full_duplex)
477 np->mii_if.force_media = 1;
478
479
480 dev->open = &netdev_open;
481 dev->hard_start_xmit = &start_tx;
482 dev->stop = &netdev_close;
483 dev->get_stats = &get_stats;
484 dev->set_multicast_list = &set_rx_mode;
485 dev->do_ioctl = &netdev_ioctl;
486 dev->ethtool_ops = &netdev_ethtool_ops;
487 dev->tx_timeout = &tx_timeout;
488 dev->watchdog_timeo = TX_TIMEOUT;
489
490 i = register_netdev(dev);
491 if (i)
492 goto err_out_cleardev;
493
494 printk(KERN_INFO "%s: %s at 0x%lx, ",
495 dev->name, pci_id_tbl[chip_idx].name, ioaddr);
496 for (i = 0; i < 5; i++)
497 printk("%2.2x:", dev->dev_addr[i]);
498 printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq);
499
500 if (np->drv_flags & CanHaveMII) {
501 int phy, phy_idx = 0;
502 for (phy = 1; phy < 32 && phy_idx < MII_CNT; phy++) {
503 int mii_status = mdio_read(dev, phy, MII_BMSR);
504 if (mii_status != 0xffff && mii_status != 0x0000) {
505 np->phys[phy_idx++] = phy;
506 np->mii_if.advertising = mdio_read(dev, phy, MII_ADVERTISE);
507 np->mii = (mdio_read(dev, phy, MII_PHYSID1) << 16)+
508 mdio_read(dev, phy, MII_PHYSID2);
509 printk(KERN_INFO "%s: MII PHY %8.8xh found at address %d, status "
510 "0x%4.4x advertising %4.4x.\n",
511 dev->name, np->mii, phy, mii_status, np->mii_if.advertising);
512 }
513 }
514 np->mii_cnt = phy_idx;
515 np->mii_if.phy_id = np->phys[0];
516 if (phy_idx == 0) {
517 printk(KERN_WARNING "%s: MII PHY not found -- this device may "
518 "not operate correctly.\n", dev->name);
519 }
520 }
521
522 find_cnt++;
523 return 0;
524
525err_out_cleardev:
526 pci_set_drvdata(pdev, NULL);
527#ifndef USE_IO_OPS
528 iounmap((void *)ioaddr);
529err_out_free_res:
530#endif
531 pci_release_regions(pdev);
532err_out_netdev:
533 kfree (dev);
534 return -ENODEV;
535}
536
537
538
539
540
541
542
543
544
545
546
547
548
549#define eeprom_delay(ee_addr) readl(ee_addr)
550
551enum EEPROM_Ctrl_Bits {
552 EE_ShiftClk=0x02, EE_Write0=0x801, EE_Write1=0x805,
553 EE_ChipSelect=0x801, EE_DataIn=0x08,
554};
555
556
557enum EEPROM_Cmds {
558 EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6),
559};
560
561static int eeprom_read(long addr, int location)
562{
563 int i;
564 int retval = 0;
565 long ee_addr = addr + EECtrl;
566 int read_cmd = location | EE_ReadCmd;
567 writel(EE_ChipSelect, ee_addr);
568
569
570 for (i = 10; i >= 0; i--) {
571 short dataval = (read_cmd & (1 << i)) ? EE_Write1 : EE_Write0;
572 writel(dataval, ee_addr);
573 eeprom_delay(ee_addr);
574 writel(dataval | EE_ShiftClk, ee_addr);
575 eeprom_delay(ee_addr);
576 }
577 writel(EE_ChipSelect, ee_addr);
578 eeprom_delay(ee_addr);
579
580 for (i = 16; i > 0; i--) {
581 writel(EE_ChipSelect | EE_ShiftClk, ee_addr);
582 eeprom_delay(ee_addr);
583 retval = (retval << 1) | ((readl(ee_addr) & EE_DataIn) ? 1 : 0);
584 writel(EE_ChipSelect, ee_addr);
585 eeprom_delay(ee_addr);
586 }
587
588
589 writel(0, ee_addr);
590 return retval;
591}
592
593
594
595
596
597
598
599
600#define mdio_delay(mdio_addr) readl(mdio_addr)
601
602
603
604
605static char mii_preamble_required = 1;
606
607#define MDIO_WRITE0 (MDIO_EnbOutput)
608#define MDIO_WRITE1 (MDIO_DataOut | MDIO_EnbOutput)
609
610
611
612static void mdio_sync(long mdio_addr)
613{
614 int bits = 32;
615
616
617 while (--bits >= 0) {
618 writel(MDIO_WRITE1, mdio_addr);
619 mdio_delay(mdio_addr);
620 writel(MDIO_WRITE1 | MDIO_ShiftClk, mdio_addr);
621 mdio_delay(mdio_addr);
622 }
623}
624
625static int mdio_read(struct net_device *dev, int phy_id, int location)
626{
627 long mdio_addr = dev->base_addr + MIICtrl;
628 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
629 int i, retval = 0;
630
631 if (mii_preamble_required)
632 mdio_sync(mdio_addr);
633
634
635 for (i = 15; i >= 0; i--) {
636 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
637
638 writel(dataval, mdio_addr);
639 mdio_delay(mdio_addr);
640 writel(dataval | MDIO_ShiftClk, mdio_addr);
641 mdio_delay(mdio_addr);
642 }
643
644 for (i = 20; i > 0; i--) {
645 writel(MDIO_EnbIn, mdio_addr);
646 mdio_delay(mdio_addr);
647 retval = (retval << 1) | ((readl(mdio_addr) & MDIO_DataIn) ? 1 : 0);
648 writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr);
649 mdio_delay(mdio_addr);
650 }
651 return (retval>>1) & 0xffff;
652}
653
654static void mdio_write(struct net_device *dev, int phy_id, int location, int value)
655{
656 struct netdev_private *np = dev->priv;
657 long mdio_addr = dev->base_addr + MIICtrl;
658 int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
659 int i;
660
661 if (location == 4 && phy_id == np->phys[0])
662 np->mii_if.advertising = value;
663
664 if (mii_preamble_required)
665 mdio_sync(mdio_addr);
666
667
668 for (i = 31; i >= 0; i--) {
669 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
670
671 writel(dataval, mdio_addr);
672 mdio_delay(mdio_addr);
673 writel(dataval | MDIO_ShiftClk, mdio_addr);
674 mdio_delay(mdio_addr);
675 }
676
677 for (i = 2; i > 0; i--) {
678 writel(MDIO_EnbIn, mdio_addr);
679 mdio_delay(mdio_addr);
680 writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr);
681 mdio_delay(mdio_addr);
682 }
683 return;
684}
685
686
687static int netdev_open(struct net_device *dev)
688{
689 struct netdev_private *np = dev->priv;
690 long ioaddr = dev->base_addr;
691 int i;
692
693 writel(0x00000001, ioaddr + PCIBusCfg);
694
695 netif_device_detach(dev);
696 i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev);
697 if (i)
698 goto out_err;
699
700 if (debug > 1)
701 printk(KERN_DEBUG "%s: w89c840_open() irq %d.\n",
702 dev->name, dev->irq);
703
704 if((i=alloc_ringdesc(dev)))
705 goto out_err;
706
707 spin_lock_irq(&np->lock);
708 netif_device_attach(dev);
709 init_registers(dev);
710 spin_unlock_irq(&np->lock);
711
712 netif_start_queue(dev);
713 if (debug > 2)
714 printk(KERN_DEBUG "%s: Done netdev_open().\n", dev->name);
715
716
717 init_timer(&np->timer);
718 np->timer.expires = jiffies + 1*HZ;
719 np->timer.data = (unsigned long)dev;
720 np->timer.function = &netdev_timer;
721 add_timer(&np->timer);
722 return 0;
723out_err:
724 netif_device_attach(dev);
725 return i;
726}
727
728#define MII_DAVICOM_DM9101 0x0181b800
729
730static int update_link(struct net_device *dev)
731{
732 struct netdev_private *np = dev->priv;
733 int duplex, fasteth, result, mii_reg;
734
735
736 mii_reg = mdio_read(dev, np->phys[0], MII_BMSR);
737
738 if (mii_reg == 0xffff)
739 return np->csr6;
740
741 mii_reg = mdio_read(dev, np->phys[0], MII_BMSR);
742 if (!(mii_reg & 0x4)) {
743 if (netif_carrier_ok(dev)) {
744 if (debug)
745 printk(KERN_INFO "%s: MII #%d reports no link. Disabling watchdog.\n",
746 dev->name, np->phys[0]);
747 netif_carrier_off(dev);
748 }
749 return np->csr6;
750 }
751 if (!netif_carrier_ok(dev)) {
752 if (debug)
753 printk(KERN_INFO "%s: MII #%d link is back. Enabling watchdog.\n",
754 dev->name, np->phys[0]);
755 netif_carrier_on(dev);
756 }
757
758 if ((np->mii & ~0xf) == MII_DAVICOM_DM9101) {
759
760
761
762
763
764
765
766
767 mii_reg = mdio_read(dev, np->phys[0], MII_BMCR);
768 duplex = mii_reg & BMCR_FULLDPLX;
769 fasteth = mii_reg & BMCR_SPEED100;
770 } else {
771 int negotiated;
772 mii_reg = mdio_read(dev, np->phys[0], MII_LPA);
773 negotiated = mii_reg & np->mii_if.advertising;
774
775 duplex = (negotiated & LPA_100FULL) || ((negotiated & 0x02C0) == LPA_10FULL);
776 fasteth = negotiated & 0x380;
777 }
778 duplex |= np->mii_if.force_media;
779
780 result = np->csr6 & ~0x20000200;
781 if (duplex)
782 result |= 0x200;
783 if (fasteth)
784 result |= 0x20000000;
785 if (result != np->csr6 && debug)
786 printk(KERN_INFO "%s: Setting %dMBit-%s-duplex based on MII#%d\n",
787 dev->name, fasteth ? 100 : 10,
788 duplex ? "full" : "half", np->phys[0]);
789 return result;
790}
791
792#define RXTX_TIMEOUT 2000
793static inline void update_csr6(struct net_device *dev, int new)
794{
795 struct netdev_private *np = dev->priv;
796 long ioaddr = dev->base_addr;
797 int limit = RXTX_TIMEOUT;
798
799 if (!netif_device_present(dev))
800 new = 0;
801 if (new==np->csr6)
802 return;
803
804 writel(np->csr6 & ~0x2002, ioaddr + NetworkConfig);
805
806 for (;;) {
807 int csr5 = readl(ioaddr + IntrStatus);
808 int t;
809
810 t = (csr5 >> 17) & 0x07;
811 if (t==0||t==1) {
812
813 t = (csr5 >> 20) & 0x07;
814 if (t==0||t==1)
815 break;
816 }
817
818 limit--;
819 if(!limit) {
820 printk(KERN_INFO "%s: couldn't stop rxtx, IntrStatus %xh.\n",
821 dev->name, csr5);
822 break;
823 }
824 udelay(1);
825 }
826 np->csr6 = new;
827
828 writel(np->csr6, ioaddr + NetworkConfig);
829 if (new & 0x200)
830 np->mii_if.full_duplex = 1;
831}
832
833static void netdev_timer(unsigned long data)
834{
835 struct net_device *dev = (struct net_device *)data;
836 struct netdev_private *np = dev->priv;
837 long ioaddr = dev->base_addr;
838
839 if (debug > 2)
840 printk(KERN_DEBUG "%s: Media selection timer tick, status %8.8x "
841 "config %8.8x.\n",
842 dev->name, (int)readl(ioaddr + IntrStatus),
843 (int)readl(ioaddr + NetworkConfig));
844 spin_lock_irq(&np->lock);
845 update_csr6(dev, update_link(dev));
846 spin_unlock_irq(&np->lock);
847 np->timer.expires = jiffies + 10*HZ;
848 add_timer(&np->timer);
849}
850
851static void init_rxtx_rings(struct net_device *dev)
852{
853 struct netdev_private *np = dev->priv;
854 int i;
855
856 np->rx_head_desc = &np->rx_ring[0];
857 np->tx_ring = (struct w840_tx_desc*)&np->rx_ring[RX_RING_SIZE];
858
859
860 for (i = 0; i < RX_RING_SIZE; i++) {
861 np->rx_ring[i].length = np->rx_buf_sz;
862 np->rx_ring[i].status = 0;
863 np->rx_skbuff[i] = 0;
864 }
865
866 np->rx_ring[i-1].length |= DescEndRing;
867
868
869 for (i = 0; i < RX_RING_SIZE; i++) {
870 struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
871 np->rx_skbuff[i] = skb;
872 if (skb == NULL)
873 break;
874 skb->dev = dev;
875 np->rx_addr[i] = pci_map_single(np->pci_dev,skb->tail,
876 skb->len,PCI_DMA_FROMDEVICE);
877
878 np->rx_ring[i].buffer1 = np->rx_addr[i];
879 np->rx_ring[i].status = DescOwn;
880 }
881
882 np->cur_rx = 0;
883 np->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
884
885
886 for (i = 0; i < TX_RING_SIZE; i++) {
887 np->tx_skbuff[i] = 0;
888 np->tx_ring[i].status = 0;
889 }
890 np->tx_full = 0;
891 np->tx_q_bytes = np->dirty_tx = np->cur_tx = 0;
892
893 writel(np->ring_dma_addr, dev->base_addr + RxRingPtr);
894 writel(np->ring_dma_addr+sizeof(struct w840_rx_desc)*RX_RING_SIZE,
895 dev->base_addr + TxRingPtr);
896
897}
898
899static void free_rxtx_rings(struct netdev_private* np)
900{
901 int i;
902
903 for (i = 0; i < RX_RING_SIZE; i++) {
904 np->rx_ring[i].status = 0;
905 if (np->rx_skbuff[i]) {
906 pci_unmap_single(np->pci_dev,
907 np->rx_addr[i],
908 np->rx_skbuff[i]->len,
909 PCI_DMA_FROMDEVICE);
910 dev_kfree_skb(np->rx_skbuff[i]);
911 }
912 np->rx_skbuff[i] = 0;
913 }
914 for (i = 0; i < TX_RING_SIZE; i++) {
915 if (np->tx_skbuff[i]) {
916 pci_unmap_single(np->pci_dev,
917 np->tx_addr[i],
918 np->tx_skbuff[i]->len,
919 PCI_DMA_TODEVICE);
920 dev_kfree_skb(np->tx_skbuff[i]);
921 }
922 np->tx_skbuff[i] = 0;
923 }
924}
925
926static void init_registers(struct net_device *dev)
927{
928 struct netdev_private *np = dev->priv;
929 long ioaddr = dev->base_addr;
930 int i;
931
932 for (i = 0; i < 6; i++)
933 writeb(dev->dev_addr[i], ioaddr + StationAddr + i);
934
935
936#ifdef __BIG_ENDIAN
937 i = (1<<20);
938#else
939 i = 0;
940#endif
941 i |= (0x04<<2);
942 i |= 0x02;
943
944
945
946
947
948
949
950
951
952
953#if defined (__i386__) && !defined(MODULE)
954
955 if (boot_cpu_data.x86 <= 4) {
956 i |= 0x4800;
957 printk(KERN_INFO "%s: This is a 386/486 PCI system, setting cache "
958 "alignment to 8 longwords.\n", dev->name);
959 } else {
960 i |= 0xE000;
961 }
962#elif defined(__powerpc__) || defined(__i386__) || defined(__alpha__) || defined(__ia64__) || defined(__x86_64__)
963 i |= 0xE000;
964#elif defined(__sparc__)
965 i |= 0x4800;
966#else
967#warning Processor architecture undefined
968 i |= 0x4800;
969#endif
970 writel(i, ioaddr + PCIBusCfg);
971
972 np->csr6 = 0;
973
974
975 update_csr6(dev, 0x00022002 | update_link(dev) | __set_rx_mode(dev));
976
977
978 writel(0x1A0F5, ioaddr + IntrStatus);
979 writel(0x1A0F5, ioaddr + IntrEnable);
980
981 writel(0, ioaddr + RxStartDemand);
982}
983
984static void tx_timeout(struct net_device *dev)
985{
986 struct netdev_private *np = dev->priv;
987 long ioaddr = dev->base_addr;
988
989 printk(KERN_WARNING "%s: Transmit timed out, status %8.8x,"
990 " resetting...\n", dev->name, (int)readl(ioaddr + IntrStatus));
991
992 {
993 int i;
994 printk(KERN_DEBUG " Rx ring %p: ", np->rx_ring);
995 for (i = 0; i < RX_RING_SIZE; i++)
996 printk(" %8.8x", (unsigned int)np->rx_ring[i].status);
997 printk("\n"KERN_DEBUG" Tx ring %p: ", np->tx_ring);
998 for (i = 0; i < TX_RING_SIZE; i++)
999 printk(" %8.8x", np->tx_ring[i].status);
1000 printk("\n");
1001 }
1002 printk(KERN_DEBUG "Tx cur %d Tx dirty %d Tx Full %d, q bytes %d.\n",
1003 np->cur_tx, np->dirty_tx, np->tx_full, np->tx_q_bytes);
1004 printk(KERN_DEBUG "Tx Descriptor addr %xh.\n",readl(ioaddr+0x4C));
1005
1006 disable_irq(dev->irq);
1007 spin_lock_irq(&np->lock);
1008
1009
1010
1011
1012
1013
1014 writel(1, dev->base_addr+PCIBusCfg);
1015 udelay(1);
1016
1017 free_rxtx_rings(np);
1018 init_rxtx_rings(dev);
1019 init_registers(dev);
1020 spin_unlock_irq(&np->lock);
1021 enable_irq(dev->irq);
1022
1023 netif_wake_queue(dev);
1024 dev->trans_start = jiffies;
1025 np->stats.tx_errors++;
1026 return;
1027}
1028
1029
1030static int alloc_ringdesc(struct net_device *dev)
1031{
1032 struct netdev_private *np = dev->priv;
1033
1034 np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
1035
1036 np->rx_ring = pci_alloc_consistent(np->pci_dev,
1037 sizeof(struct w840_rx_desc)*RX_RING_SIZE +
1038 sizeof(struct w840_tx_desc)*TX_RING_SIZE,
1039 &np->ring_dma_addr);
1040 if(!np->rx_ring)
1041 return -ENOMEM;
1042 init_rxtx_rings(dev);
1043 return 0;
1044}
1045
1046static void free_ringdesc(struct netdev_private *np)
1047{
1048 pci_free_consistent(np->pci_dev,
1049 sizeof(struct w840_rx_desc)*RX_RING_SIZE +
1050 sizeof(struct w840_tx_desc)*TX_RING_SIZE,
1051 np->rx_ring, np->ring_dma_addr);
1052
1053}
1054
1055static int start_tx(struct sk_buff *skb, struct net_device *dev)
1056{
1057 struct netdev_private *np = dev->priv;
1058 unsigned entry;
1059
1060
1061
1062
1063
1064 entry = np->cur_tx % TX_RING_SIZE;
1065
1066 np->tx_addr[entry] = pci_map_single(np->pci_dev,
1067 skb->data,skb->len, PCI_DMA_TODEVICE);
1068 np->tx_skbuff[entry] = skb;
1069
1070 np->tx_ring[entry].buffer1 = np->tx_addr[entry];
1071 if (skb->len < TX_BUFLIMIT) {
1072 np->tx_ring[entry].length = DescWholePkt | skb->len;
1073 } else {
1074 int len = skb->len - TX_BUFLIMIT;
1075
1076 np->tx_ring[entry].buffer2 = np->tx_addr[entry]+TX_BUFLIMIT;
1077 np->tx_ring[entry].length = DescWholePkt | (len << 11) | TX_BUFLIMIT;
1078 }
1079 if(entry == TX_RING_SIZE-1)
1080 np->tx_ring[entry].length |= DescEndRing;
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092 spin_lock_irq(&np->lock);
1093 np->cur_tx++;
1094
1095 wmb();
1096 np->tx_ring[entry].status = DescOwn;
1097 wmb();
1098 writel(0, dev->base_addr + TxStartDemand);
1099 np->tx_q_bytes += skb->len;
1100
1101
1102 if (np->cur_tx - np->dirty_tx > TX_QUEUE_LEN ||
1103 ((np->drv_flags & HasBrokenTx) && np->tx_q_bytes > TX_BUG_FIFO_LIMIT)) {
1104 netif_stop_queue(dev);
1105 wmb();
1106 np->tx_full = 1;
1107 }
1108 spin_unlock_irq(&np->lock);
1109
1110 dev->trans_start = jiffies;
1111
1112 if (debug > 4) {
1113 printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n",
1114 dev->name, np->cur_tx, entry);
1115 }
1116 return 0;
1117}
1118
1119static void netdev_tx_done(struct net_device *dev)
1120{
1121 struct netdev_private *np = dev->priv;
1122 for (; np->cur_tx - np->dirty_tx > 0; np->dirty_tx++) {
1123 int entry = np->dirty_tx % TX_RING_SIZE;
1124 int tx_status = np->tx_ring[entry].status;
1125
1126 if (tx_status < 0)
1127 break;
1128 if (tx_status & 0x8000) {
1129#ifndef final_version
1130 if (debug > 1)
1131 printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
1132 dev->name, tx_status);
1133#endif
1134 np->stats.tx_errors++;
1135 if (tx_status & 0x0104) np->stats.tx_aborted_errors++;
1136 if (tx_status & 0x0C80) np->stats.tx_carrier_errors++;
1137 if (tx_status & 0x0200) np->stats.tx_window_errors++;
1138 if (tx_status & 0x0002) np->stats.tx_fifo_errors++;
1139 if ((tx_status & 0x0080) && np->mii_if.full_duplex == 0)
1140 np->stats.tx_heartbeat_errors++;
1141 } else {
1142#ifndef final_version
1143 if (debug > 3)
1144 printk(KERN_DEBUG "%s: Transmit slot %d ok, Tx status %8.8x.\n",
1145 dev->name, entry, tx_status);
1146#endif
1147 np->stats.tx_bytes += np->tx_skbuff[entry]->len;
1148 np->stats.collisions += (tx_status >> 3) & 15;
1149 np->stats.tx_packets++;
1150 }
1151
1152 pci_unmap_single(np->pci_dev,np->tx_addr[entry],
1153 np->tx_skbuff[entry]->len,
1154 PCI_DMA_TODEVICE);
1155 np->tx_q_bytes -= np->tx_skbuff[entry]->len;
1156 dev_kfree_skb_irq(np->tx_skbuff[entry]);
1157 np->tx_skbuff[entry] = 0;
1158 }
1159 if (np->tx_full &&
1160 np->cur_tx - np->dirty_tx < TX_QUEUE_LEN_RESTART &&
1161 np->tx_q_bytes < TX_BUG_FIFO_LIMIT) {
1162
1163 np->tx_full = 0;
1164 wmb();
1165 netif_wake_queue(dev);
1166 }
1167}
1168
1169
1170
1171static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
1172{
1173 struct net_device *dev = (struct net_device *)dev_instance;
1174 struct netdev_private *np = dev->priv;
1175 long ioaddr = dev->base_addr;
1176 int work_limit = max_interrupt_work;
1177 int handled = 0;
1178
1179 if (!netif_device_present(dev))
1180 return IRQ_NONE;
1181 do {
1182 u32 intr_status = readl(ioaddr + IntrStatus);
1183
1184
1185 writel(intr_status & 0x001ffff, ioaddr + IntrStatus);
1186
1187 if (debug > 4)
1188 printk(KERN_DEBUG "%s: Interrupt, status %4.4x.\n",
1189 dev->name, intr_status);
1190
1191 if ((intr_status & (NormalIntr|AbnormalIntr)) == 0)
1192 break;
1193
1194 handled = 1;
1195
1196 if (intr_status & (IntrRxDone | RxNoBuf))
1197 netdev_rx(dev);
1198 if (intr_status & RxNoBuf)
1199 writel(0, ioaddr + RxStartDemand);
1200
1201 if (intr_status & (TxIdle | IntrTxDone) &&
1202 np->cur_tx != np->dirty_tx) {
1203 spin_lock(&np->lock);
1204 netdev_tx_done(dev);
1205 spin_unlock(&np->lock);
1206 }
1207
1208
1209 if (intr_status & (AbnormalIntr | TxFIFOUnderflow | IntrPCIErr |
1210 TimerInt | IntrTxStopped))
1211 netdev_error(dev, intr_status);
1212
1213 if (--work_limit < 0) {
1214 printk(KERN_WARNING "%s: Too much work at interrupt, "
1215 "status=0x%4.4x.\n", dev->name, intr_status);
1216
1217
1218 spin_lock(&np->lock);
1219 if (netif_device_present(dev)) {
1220 writel(AbnormalIntr | TimerInt, ioaddr + IntrEnable);
1221 writel(10, ioaddr + GPTimer);
1222 }
1223 spin_unlock(&np->lock);
1224 break;
1225 }
1226 } while (1);
1227
1228 if (debug > 3)
1229 printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n",
1230 dev->name, (int)readl(ioaddr + IntrStatus));
1231 return IRQ_RETVAL(handled);
1232}
1233
1234
1235
1236static int netdev_rx(struct net_device *dev)
1237{
1238 struct netdev_private *np = dev->priv;
1239 int entry = np->cur_rx % RX_RING_SIZE;
1240 int work_limit = np->dirty_rx + RX_RING_SIZE - np->cur_rx;
1241
1242 if (debug > 4) {
1243 printk(KERN_DEBUG " In netdev_rx(), entry %d status %4.4x.\n",
1244 entry, np->rx_ring[entry].status);
1245 }
1246
1247
1248 while (--work_limit >= 0) {
1249 struct w840_rx_desc *desc = np->rx_head_desc;
1250 s32 status = desc->status;
1251
1252 if (debug > 4)
1253 printk(KERN_DEBUG " netdev_rx() status was %8.8x.\n",
1254 status);
1255 if (status < 0)
1256 break;
1257 if ((status & 0x38008300) != 0x0300) {
1258 if ((status & 0x38000300) != 0x0300) {
1259
1260 if ((status & 0xffff) != 0x7fff) {
1261 printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
1262 "multiple buffers, entry %#x status %4.4x!\n",
1263 dev->name, np->cur_rx, status);
1264 np->stats.rx_length_errors++;
1265 }
1266 } else if (status & 0x8000) {
1267
1268 if (debug > 2)
1269 printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
1270 dev->name, status);
1271 np->stats.rx_errors++;
1272 if (status & 0x0890) np->stats.rx_length_errors++;
1273 if (status & 0x004C) np->stats.rx_frame_errors++;
1274 if (status & 0x0002) np->stats.rx_crc_errors++;
1275 }
1276 } else {
1277 struct sk_buff *skb;
1278
1279 int pkt_len = ((status >> 16) & 0x7ff) - 4;
1280
1281#ifndef final_version
1282 if (debug > 4)
1283 printk(KERN_DEBUG " netdev_rx() normal Rx pkt length %d"
1284 " status %x.\n", pkt_len, status);
1285#endif
1286
1287
1288 if (pkt_len < rx_copybreak
1289 && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
1290 skb->dev = dev;
1291 skb_reserve(skb, 2);
1292 pci_dma_sync_single(np->pci_dev,np->rx_addr[entry],
1293 np->rx_skbuff[entry]->len,
1294 PCI_DMA_FROMDEVICE);
1295
1296#if HAS_IP_COPYSUM
1297 eth_copy_and_sum(skb, np->rx_skbuff[entry]->tail, pkt_len, 0);
1298 skb_put(skb, pkt_len);
1299#else
1300 memcpy(skb_put(skb, pkt_len), np->rx_skbuff[entry]->tail,
1301 pkt_len);
1302#endif
1303 } else {
1304 pci_unmap_single(np->pci_dev,np->rx_addr[entry],
1305 np->rx_skbuff[entry]->len,
1306 PCI_DMA_FROMDEVICE);
1307 skb_put(skb = np->rx_skbuff[entry], pkt_len);
1308 np->rx_skbuff[entry] = NULL;
1309 }
1310#ifndef final_version
1311
1312 if (debug > 5)
1313 printk(KERN_DEBUG " Rx data %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:"
1314 "%2.2x %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x %2.2x%2.2x "
1315 "%d.%d.%d.%d.\n",
1316 skb->data[0], skb->data[1], skb->data[2], skb->data[3],
1317 skb->data[4], skb->data[5], skb->data[6], skb->data[7],
1318 skb->data[8], skb->data[9], skb->data[10],
1319 skb->data[11], skb->data[12], skb->data[13],
1320 skb->data[14], skb->data[15], skb->data[16],
1321 skb->data[17]);
1322#endif
1323 skb->protocol = eth_type_trans(skb, dev);
1324 netif_rx(skb);
1325 dev->last_rx = jiffies;
1326 np->stats.rx_packets++;
1327 np->stats.rx_bytes += pkt_len;
1328 }
1329 entry = (++np->cur_rx) % RX_RING_SIZE;
1330 np->rx_head_desc = &np->rx_ring[entry];
1331 }
1332
1333
1334 for (; np->cur_rx - np->dirty_rx > 0; np->dirty_rx++) {
1335 struct sk_buff *skb;
1336 entry = np->dirty_rx % RX_RING_SIZE;
1337 if (np->rx_skbuff[entry] == NULL) {
1338 skb = dev_alloc_skb(np->rx_buf_sz);
1339 np->rx_skbuff[entry] = skb;
1340 if (skb == NULL)
1341 break;
1342 skb->dev = dev;
1343 np->rx_addr[entry] = pci_map_single(np->pci_dev,
1344 skb->tail,
1345 skb->len, PCI_DMA_FROMDEVICE);
1346 np->rx_ring[entry].buffer1 = np->rx_addr[entry];
1347 }
1348 wmb();
1349 np->rx_ring[entry].status = DescOwn;
1350 }
1351
1352 return 0;
1353}
1354
1355static void netdev_error(struct net_device *dev, int intr_status)
1356{
1357 long ioaddr = dev->base_addr;
1358 struct netdev_private *np = dev->priv;
1359
1360 if (debug > 2)
1361 printk(KERN_DEBUG "%s: Abnormal event, %8.8x.\n",
1362 dev->name, intr_status);
1363 if (intr_status == 0xffffffff)
1364 return;
1365 spin_lock(&np->lock);
1366 if (intr_status & TxFIFOUnderflow) {
1367 int new;
1368
1369#if 0
1370
1371
1372
1373 new = np->csr6 + 0x4000;
1374#else
1375 new = (np->csr6 >> 14)&0x7f;
1376 if (new < 64)
1377 new *= 2;
1378 else
1379 new = 127;
1380 new = (np->csr6 & ~(0x7F << 14)) | (new<<14);
1381#endif
1382 printk(KERN_DEBUG "%s: Tx underflow, new csr6 %8.8x.\n",
1383 dev->name, new);
1384 update_csr6(dev, new);
1385 }
1386 if (intr_status & IntrRxDied) {
1387 np->stats.rx_errors++;
1388 }
1389 if (intr_status & TimerInt) {
1390
1391 if (netif_device_present(dev))
1392 writel(0x1A0F5, ioaddr + IntrEnable);
1393 }
1394 np->stats.rx_missed_errors += readl(ioaddr + RxMissed) & 0xffff;
1395 writel(0, ioaddr + RxStartDemand);
1396 spin_unlock(&np->lock);
1397}
1398
1399static struct net_device_stats *get_stats(struct net_device *dev)
1400{
1401 long ioaddr = dev->base_addr;
1402 struct netdev_private *np = dev->priv;
1403
1404
1405 spin_lock_irq(&np->lock);
1406 if (netif_running(dev) && netif_device_present(dev))
1407 np->stats.rx_missed_errors += readl(ioaddr + RxMissed) & 0xffff;
1408 spin_unlock_irq(&np->lock);
1409
1410 return &np->stats;
1411}
1412
1413
1414static u32 __set_rx_mode(struct net_device *dev)
1415{
1416 long ioaddr = dev->base_addr;
1417 u32 mc_filter[2];
1418 u32 rx_mode;
1419
1420 if (dev->flags & IFF_PROMISC) {
1421
1422 printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1423 memset(mc_filter, 0xff, sizeof(mc_filter));
1424 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptAllPhys
1425 | AcceptMyPhys;
1426 } else if ((dev->mc_count > multicast_filter_limit)
1427 || (dev->flags & IFF_ALLMULTI)) {
1428
1429 memset(mc_filter, 0xff, sizeof(mc_filter));
1430 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
1431 } else {
1432 struct dev_mc_list *mclist;
1433 int i;
1434 memset(mc_filter, 0, sizeof(mc_filter));
1435 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1436 i++, mclist = mclist->next) {
1437 int filterbit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F;
1438 filterbit &= 0x3f;
1439 mc_filter[filterbit >> 5] |= cpu_to_le32(1 << (filterbit & 31));
1440 }
1441 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
1442 }
1443 writel(mc_filter[0], ioaddr + MulticastFilter0);
1444 writel(mc_filter[1], ioaddr + MulticastFilter1);
1445 return rx_mode;
1446}
1447
1448static void set_rx_mode(struct net_device *dev)
1449{
1450 struct netdev_private *np = dev->priv;
1451 u32 rx_mode = __set_rx_mode(dev);
1452 spin_lock_irq(&np->lock);
1453 update_csr6(dev, (np->csr6 & ~0x00F8) | rx_mode);
1454 spin_unlock_irq(&np->lock);
1455}
1456
1457static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
1458{
1459 struct netdev_private *np = dev->priv;
1460
1461 strcpy (info->driver, DRV_NAME);
1462 strcpy (info->version, DRV_VERSION);
1463 strcpy (info->bus_info, pci_name(np->pci_dev));
1464}
1465
1466static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1467{
1468 struct netdev_private *np = dev->priv;
1469 int rc;
1470
1471 spin_lock_irq(&np->lock);
1472 rc = mii_ethtool_gset(&np->mii_if, cmd);
1473 spin_unlock_irq(&np->lock);
1474
1475 return rc;
1476}
1477
1478static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1479{
1480 struct netdev_private *np = dev->priv;
1481 int rc;
1482
1483 spin_lock_irq(&np->lock);
1484 rc = mii_ethtool_sset(&np->mii_if, cmd);
1485 spin_unlock_irq(&np->lock);
1486
1487 return rc;
1488}
1489
1490static int netdev_nway_reset(struct net_device *dev)
1491{
1492 struct netdev_private *np = dev->priv;
1493 return mii_nway_restart(&np->mii_if);
1494}
1495
1496static u32 netdev_get_link(struct net_device *dev)
1497{
1498 struct netdev_private *np = dev->priv;
1499 return mii_link_ok(&np->mii_if);
1500}
1501
1502static u32 netdev_get_msglevel(struct net_device *dev)
1503{
1504 return debug;
1505}
1506
1507static void netdev_set_msglevel(struct net_device *dev, u32 value)
1508{
1509 debug = value;
1510}
1511
1512static struct ethtool_ops netdev_ethtool_ops = {
1513 .get_drvinfo = netdev_get_drvinfo,
1514 .get_settings = netdev_get_settings,
1515 .set_settings = netdev_set_settings,
1516 .nway_reset = netdev_nway_reset,
1517 .get_link = netdev_get_link,
1518 .get_msglevel = netdev_get_msglevel,
1519 .set_msglevel = netdev_set_msglevel,
1520 .get_sg = ethtool_op_get_sg,
1521 .get_tx_csum = ethtool_op_get_tx_csum,
1522};
1523
1524static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1525{
1526 struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data;
1527 struct netdev_private *np = dev->priv;
1528
1529 switch(cmd) {
1530 case SIOCGMIIPHY:
1531 data->phy_id = ((struct netdev_private *)dev->priv)->phys[0] & 0x1f;
1532
1533
1534 case SIOCGMIIREG:
1535 spin_lock_irq(&np->lock);
1536 data->val_out = mdio_read(dev, data->phy_id & 0x1f, data->reg_num & 0x1f);
1537 spin_unlock_irq(&np->lock);
1538 return 0;
1539
1540 case SIOCSMIIREG:
1541 if (!capable(CAP_NET_ADMIN))
1542 return -EPERM;
1543 spin_lock_irq(&np->lock);
1544 mdio_write(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
1545 spin_unlock_irq(&np->lock);
1546 return 0;
1547 default:
1548 return -EOPNOTSUPP;
1549 }
1550}
1551
1552static int netdev_close(struct net_device *dev)
1553{
1554 long ioaddr = dev->base_addr;
1555 struct netdev_private *np = dev->priv;
1556
1557 netif_stop_queue(dev);
1558
1559 if (debug > 1) {
1560 printk(KERN_DEBUG "%s: Shutting down ethercard, status was %8.8x "
1561 "Config %8.8x.\n", dev->name, (int)readl(ioaddr + IntrStatus),
1562 (int)readl(ioaddr + NetworkConfig));
1563 printk(KERN_DEBUG "%s: Queue pointers were Tx %d / %d, Rx %d / %d.\n",
1564 dev->name, np->cur_tx, np->dirty_tx, np->cur_rx, np->dirty_rx);
1565 }
1566
1567
1568 spin_lock_irq(&np->lock);
1569 netif_device_detach(dev);
1570 update_csr6(dev, 0);
1571 writel(0x0000, ioaddr + IntrEnable);
1572 spin_unlock_irq(&np->lock);
1573
1574 free_irq(dev->irq, dev);
1575 wmb();
1576 netif_device_attach(dev);
1577
1578 if (readl(ioaddr + NetworkConfig) != 0xffffffff)
1579 np->stats.rx_missed_errors += readl(ioaddr + RxMissed) & 0xffff;
1580
1581#ifdef __i386__
1582 if (debug > 2) {
1583 int i;
1584
1585 printk(KERN_DEBUG" Tx ring at %8.8x:\n",
1586 (int)np->tx_ring);
1587 for (i = 0; i < TX_RING_SIZE; i++)
1588 printk(KERN_DEBUG " #%d desc. %4.4x %4.4x %8.8x.\n",
1589 i, np->tx_ring[i].length,
1590 np->tx_ring[i].status, np->tx_ring[i].buffer1);
1591 printk("\n"KERN_DEBUG " Rx ring %8.8x:\n",
1592 (int)np->rx_ring);
1593 for (i = 0; i < RX_RING_SIZE; i++) {
1594 printk(KERN_DEBUG " #%d desc. %4.4x %4.4x %8.8x\n",
1595 i, np->rx_ring[i].length,
1596 np->rx_ring[i].status, np->rx_ring[i].buffer1);
1597 }
1598 }
1599#endif
1600
1601 del_timer_sync(&np->timer);
1602
1603 free_rxtx_rings(np);
1604 free_ringdesc(np);
1605
1606 return 0;
1607}
1608
1609static void __devexit w840_remove1 (struct pci_dev *pdev)
1610{
1611 struct net_device *dev = pci_get_drvdata(pdev);
1612
1613 if (dev) {
1614 unregister_netdev(dev);
1615 pci_release_regions(pdev);
1616#ifndef USE_IO_OPS
1617 iounmap((char *)(dev->base_addr));
1618#endif
1619 free_netdev(dev);
1620 }
1621
1622 pci_set_drvdata(pdev, NULL);
1623}
1624
1625#ifdef CONFIG_PM
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650static int w840_suspend (struct pci_dev *pdev, u32 state)
1651{
1652 struct net_device *dev = pci_get_drvdata (pdev);
1653 struct netdev_private *np = dev->priv;
1654 long ioaddr = dev->base_addr;
1655
1656 rtnl_lock();
1657 if (netif_running (dev)) {
1658 del_timer_sync(&np->timer);
1659
1660 spin_lock_irq(&np->lock);
1661 netif_device_detach(dev);
1662 update_csr6(dev, 0);
1663 writel(0, ioaddr + IntrEnable);
1664 netif_stop_queue(dev);
1665 spin_unlock_irq(&np->lock);
1666
1667 spin_unlock_wait(&dev->xmit_lock);
1668 synchronize_irq(dev->irq);
1669
1670 np->stats.rx_missed_errors += readl(ioaddr + RxMissed) & 0xffff;
1671
1672
1673
1674 if (np->csr6) BUG();
1675 if (readl(ioaddr + IntrEnable)) BUG();
1676
1677
1678
1679 free_rxtx_rings(np);
1680 } else {
1681 netif_device_detach(dev);
1682 }
1683 rtnl_unlock();
1684 return 0;
1685}
1686
1687static int w840_resume (struct pci_dev *pdev)
1688{
1689 struct net_device *dev = pci_get_drvdata (pdev);
1690 struct netdev_private *np = dev->priv;
1691
1692 rtnl_lock();
1693 if (netif_device_present(dev))
1694 goto out;
1695 if (netif_running(dev)) {
1696 pci_enable_device(pdev);
1697
1698
1699 spin_lock_irq(&np->lock);
1700 writel(1, dev->base_addr+PCIBusCfg);
1701 readl(dev->base_addr+PCIBusCfg);
1702 udelay(1);
1703 netif_device_attach(dev);
1704 init_rxtx_rings(dev);
1705 init_registers(dev);
1706 spin_unlock_irq(&np->lock);
1707
1708 netif_wake_queue(dev);
1709
1710 mod_timer(&np->timer, jiffies + 1*HZ);
1711 } else {
1712 netif_device_attach(dev);
1713 }
1714out:
1715 rtnl_unlock();
1716 return 0;
1717}
1718#endif
1719
1720static struct pci_driver w840_driver = {
1721 .name = DRV_NAME,
1722 .id_table = w840_pci_tbl,
1723 .probe = w840_probe1,
1724 .remove = __devexit_p(w840_remove1),
1725#ifdef CONFIG_PM
1726 .suspend = w840_suspend,
1727 .resume = w840_resume,
1728#endif
1729};
1730
1731static int __init w840_init(void)
1732{
1733
1734#ifdef MODULE
1735 printk(version);
1736#endif
1737 return pci_module_init(&w840_driver);
1738}
1739
1740static void __exit w840_exit(void)
1741{
1742 pci_unregister_driver(&w840_driver);
1743}
1744
1745module_init(w840_init);
1746module_exit(w840_exit);
1747