blob: 91cd2f52e628a7ccac1cdefb5de90c3eca884938 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* sundance.c: A Linux device driver for the Sundance ST201 "Alta". */
2/*
3 Written 1999-2000 by Donald Becker.
4
5 This software may be used and distributed according to the terms of
6 the GNU General Public License (GPL), incorporated herein by reference.
7 Drivers based on or derived from this code fall under the GPL and must
8 retain the authorship, copyright and license notice. This file is not
9 a complete program and may only be used when the entire operating
10 system is licensed under the GPL.
11
12 The author may be reached as becker@scyld.com, or C/O
13 Scyld Computing Corporation
14 410 Severn Ave., Suite 210
15 Annapolis MD 21403
16
17 Support and updates available at
18 http://www.scyld.com/network/sundance.html
Jeff Garzik03a8c662006-06-27 07:57:22 -040019 [link no longer provides useful info -jgarzik]
Philippe De Muytere714d992006-08-03 18:42:15 +020020 Archives of the mailing list are still available at
21 http://www.beowulf.org/pipermail/netdrivers/
Linus Torvalds1da177e2005-04-16 15:20:36 -070022
Linus Torvalds1da177e2005-04-16 15:20:36 -070023*/
24
25#define DRV_NAME "sundance"
Andy Gospodarekd5b20692006-09-11 17:39:18 -040026#define DRV_VERSION "1.2"
27#define DRV_RELDATE "11-Sep-2006"
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
29
30/* The user-configurable values.
31 These may be modified when a driver module is loaded.*/
32static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */
33/* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
34 Typical is a 64 element hash table based on the Ethernet CRC. */
Arjan van de Venf71e1302006-03-03 21:33:57 -050035static const int multicast_filter_limit = 32;
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
37/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
38 Setting to > 1518 effectively disables this feature.
39 This chip can receive into offset buffers, so the Alpha does not
40 need a copy-align. */
41static int rx_copybreak;
42static int flowctrl=1;
43
44/* media[] specifies the media type the NIC operates at.
45 autosense Autosensing active media.
46 10mbps_hd 10Mbps half duplex.
47 10mbps_fd 10Mbps full duplex.
48 100mbps_hd 100Mbps half duplex.
49 100mbps_fd 100Mbps full duplex.
50 0 Autosensing active media.
51 1 10Mbps half duplex.
52 2 10Mbps full duplex.
53 3 100Mbps half duplex.
54 4 100Mbps full duplex.
55*/
56#define MAX_UNITS 8
57static char *media[MAX_UNITS];
58
59
60/* Operational parameters that are set at compile time. */
61
62/* Keep the ring sizes a power of two for compile efficiency.
63 The compiler will convert <unsigned>'%'<2^N> into a bit mask.
64 Making the Tx ring too large decreases the effectiveness of channel
65 bonding and packet priority, and more than 128 requires modifying the
66 Tx error recovery.
67 Large receive rings merely waste memory. */
68#define TX_RING_SIZE 32
69#define TX_QUEUE_LEN (TX_RING_SIZE - 1) /* Limit ring entries actually used. */
70#define RX_RING_SIZE 64
71#define RX_BUDGET 32
72#define TX_TOTAL_SIZE TX_RING_SIZE*sizeof(struct netdev_desc)
73#define RX_TOTAL_SIZE RX_RING_SIZE*sizeof(struct netdev_desc)
74
75/* Operational parameters that usually are not changed. */
76/* Time in jiffies before concluding the transmitter is hung. */
77#define TX_TIMEOUT (4*HZ)
78#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
79
80/* Include files, designed to support most kernel versions 2.0.0 and later. */
81#include <linux/module.h>
82#include <linux/kernel.h>
83#include <linux/string.h>
84#include <linux/timer.h>
85#include <linux/errno.h>
86#include <linux/ioport.h>
87#include <linux/slab.h>
88#include <linux/interrupt.h>
89#include <linux/pci.h>
90#include <linux/netdevice.h>
91#include <linux/etherdevice.h>
92#include <linux/skbuff.h>
93#include <linux/init.h>
94#include <linux/bitops.h>
95#include <asm/uaccess.h>
96#include <asm/processor.h> /* Processor type for cache alignment. */
97#include <asm/io.h>
98#include <linux/delay.h>
99#include <linux/spinlock.h>
100#ifndef _COMPAT_WITH_OLD_KERNEL
101#include <linux/crc32.h>
102#include <linux/ethtool.h>
103#include <linux/mii.h>
104#else
105#include "crc32.h"
106#include "ethtool.h"
107#include "mii.h"
108#include "compat.h"
109#endif
110
111/* These identify the driver base version and may not be removed. */
Andrew Morton3418e462006-08-14 23:00:10 -0700112static char version[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker\n"
114KERN_INFO " http://www.scyld.com/network/sundance.html\n";
115
116MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
117MODULE_DESCRIPTION("Sundance Alta Ethernet driver");
118MODULE_LICENSE("GPL");
119
120module_param(debug, int, 0);
121module_param(rx_copybreak, int, 0);
122module_param_array(media, charp, NULL, 0);
123module_param(flowctrl, int, 0);
124MODULE_PARM_DESC(debug, "Sundance Alta debug level (0-5)");
125MODULE_PARM_DESC(rx_copybreak, "Sundance Alta copy breakpoint for copy-only-tiny-frames");
126MODULE_PARM_DESC(flowctrl, "Sundance Alta flow control [0|1]");
127
128/*
129 Theory of Operation
130
131I. Board Compatibility
132
133This driver is designed for the Sundance Technologies "Alta" ST201 chip.
134
135II. Board-specific settings
136
137III. Driver operation
138
139IIIa. Ring buffers
140
141This driver uses two statically allocated fixed-size descriptor lists
142formed into rings by a branch from the final descriptor to the beginning of
143the list. The ring sizes are set at compile time by RX/TX_RING_SIZE.
144Some chips explicitly use only 2^N sized rings, while others use a
145'next descriptor' pointer that the driver forms into rings.
146
147IIIb/c. Transmit/Receive Structure
148
149This driver uses a zero-copy receive and transmit scheme.
150The driver allocates full frame size skbuffs for the Rx ring buffers at
151open() time and passes the skb->data field to the chip as receive data
152buffers. When an incoming frame is less than RX_COPYBREAK bytes long,
153a fresh skbuff is allocated and the frame is copied to the new skbuff.
154When the incoming frame is larger, the skbuff is passed directly up the
155protocol stack. Buffers consumed this way are replaced by newly allocated
156skbuffs in a later phase of receives.
157
158The RX_COPYBREAK value is chosen to trade-off the memory wasted by
159using a full-sized skbuff for small frames vs. the copying costs of larger
160frames. New boards are typically used in generously configured machines
161and the underfilled buffers have negligible impact compared to the benefit of
162a single allocation size, so the default value of zero results in never
163copying packets. When copying is done, the cost is usually mitigated by using
164a combined copy/checksum routine. Copying also preloads the cache, which is
165most useful with small frames.
166
167A subtle aspect of the operation is that the IP header at offset 14 in an
168ethernet frame isn't longword aligned for further processing.
169Unaligned buffers are permitted by the Sundance hardware, so
170frames are received into the skbuff at an offset of "+2", 16-byte aligning
171the IP header.
172
173IIId. Synchronization
174
175The driver runs as two independent, single-threaded flows of control. One
176is the send-packet routine, which enforces single-threaded use by the
177dev->tbusy flag. The other thread is the interrupt handler, which is single
178threaded by the hardware and interrupt handling software.
179
180The send packet thread has partial control over the Tx ring and 'dev->tbusy'
181flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
182queue slot is empty, it clears the tbusy flag when finished otherwise it sets
183the 'lp->tx_full' flag.
184
185The interrupt handler has exclusive control over the Rx ring and records stats
186from the Tx ring. After reaping the stats, it marks the Tx queue entry as
187empty by incrementing the dirty_tx mark. Iff the 'lp->tx_full' flag is set, it
188clears both the tx_full and tbusy flags.
189
190IV. Notes
191
192IVb. References
193
194The Sundance ST201 datasheet, preliminary version.
Philippe De Muyterb71b95e2005-10-28 12:23:47 +0200195The Kendin KS8723 datasheet, preliminary version.
196The ICplus IP100 datasheet, preliminary version.
197http://www.scyld.com/expert/100mbps.html
198http://www.scyld.com/expert/NWay.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199
200IVc. Errata
201
202*/
203
204/* Work-around for Kendin chip bugs. */
205#ifndef CONFIG_SUNDANCE_MMIO
206#define USE_IO_OPS 1
207#endif
208
Jeff Garzik46009c82006-06-27 09:12:38 -0400209static const struct pci_device_id sundance_pci_tbl[] = {
210 { 0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0 },
211 { 0x1186, 0x1002, 0x1186, 0x1003, 0, 0, 1 },
212 { 0x1186, 0x1002, 0x1186, 0x1012, 0, 0, 2 },
213 { 0x1186, 0x1002, 0x1186, 0x1040, 0, 0, 3 },
214 { 0x1186, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
215 { 0x13F0, 0x0201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 },
216 { 0x13F0, 0x0200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 },
217 { }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218};
219MODULE_DEVICE_TABLE(pci, sundance_pci_tbl);
220
221enum {
222 netdev_io_size = 128
223};
224
225struct pci_id_info {
226 const char *name;
227};
Jeff Garzik46009c82006-06-27 09:12:38 -0400228static const struct pci_id_info pci_id_tbl[] __devinitdata = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 {"D-Link DFE-550TX FAST Ethernet Adapter"},
230 {"D-Link DFE-550FX 100Mbps Fiber-optics Adapter"},
231 {"D-Link DFE-580TX 4 port Server Adapter"},
232 {"D-Link DFE-530TXS FAST Ethernet Adapter"},
233 {"D-Link DL10050-based FAST Ethernet Adapter"},
234 {"Sundance Technology Alta"},
Pedro Alejandro López-Valencia1668b192006-06-15 22:46:44 +0200235 {"IC Plus Corporation IP100A FAST Ethernet Adapter"},
Jeff Garzik46009c82006-06-27 09:12:38 -0400236 { } /* terminate list. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237};
238
239/* This driver was written to use PCI memory space, however x86-oriented
240 hardware often uses I/O space accesses. */
241
242/* Offsets to the device registers.
243 Unlike software-only systems, device drivers interact with complex hardware.
244 It's not useful to define symbolic names for every register bit in the
245 device. The name can only partially document the semantics and make
246 the driver longer and more difficult to read.
247 In general, only the important configuration values or bits changed
248 multiple times should be defined symbolically.
249*/
250enum alta_offsets {
251 DMACtrl = 0x00,
252 TxListPtr = 0x04,
253 TxDMABurstThresh = 0x08,
254 TxDMAUrgentThresh = 0x09,
255 TxDMAPollPeriod = 0x0a,
256 RxDMAStatus = 0x0c,
257 RxListPtr = 0x10,
258 DebugCtrl0 = 0x1a,
259 DebugCtrl1 = 0x1c,
260 RxDMABurstThresh = 0x14,
261 RxDMAUrgentThresh = 0x15,
262 RxDMAPollPeriod = 0x16,
263 LEDCtrl = 0x1a,
264 ASICCtrl = 0x30,
265 EEData = 0x34,
266 EECtrl = 0x36,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 FlashAddr = 0x40,
268 FlashData = 0x44,
269 TxStatus = 0x46,
270 TxFrameId = 0x47,
271 DownCounter = 0x18,
272 IntrClear = 0x4a,
273 IntrEnable = 0x4c,
274 IntrStatus = 0x4e,
275 MACCtrl0 = 0x50,
276 MACCtrl1 = 0x52,
277 StationAddr = 0x54,
278 MaxFrameSize = 0x5A,
279 RxMode = 0x5c,
280 MIICtrl = 0x5e,
281 MulticastFilter0 = 0x60,
282 MulticastFilter1 = 0x64,
283 RxOctetsLow = 0x68,
284 RxOctetsHigh = 0x6a,
285 TxOctetsLow = 0x6c,
286 TxOctetsHigh = 0x6e,
287 TxFramesOK = 0x70,
288 RxFramesOK = 0x72,
289 StatsCarrierError = 0x74,
290 StatsLateColl = 0x75,
291 StatsMultiColl = 0x76,
292 StatsOneColl = 0x77,
293 StatsTxDefer = 0x78,
294 RxMissed = 0x79,
295 StatsTxXSDefer = 0x7a,
296 StatsTxAbort = 0x7b,
297 StatsBcastTx = 0x7c,
298 StatsBcastRx = 0x7d,
299 StatsMcastTx = 0x7e,
300 StatsMcastRx = 0x7f,
301 /* Aliased and bogus values! */
302 RxStatus = 0x0c,
303};
304enum ASICCtrl_HiWord_bit {
305 GlobalReset = 0x0001,
306 RxReset = 0x0002,
307 TxReset = 0x0004,
308 DMAReset = 0x0008,
309 FIFOReset = 0x0010,
310 NetworkReset = 0x0020,
311 HostReset = 0x0040,
312 ResetBusy = 0x0400,
313};
314
315/* Bits in the interrupt status/mask registers. */
316enum intr_status_bits {
317 IntrSummary=0x0001, IntrPCIErr=0x0002, IntrMACCtrl=0x0008,
318 IntrTxDone=0x0004, IntrRxDone=0x0010, IntrRxStart=0x0020,
319 IntrDrvRqst=0x0040,
320 StatsMax=0x0080, LinkChange=0x0100,
321 IntrTxDMADone=0x0200, IntrRxDMADone=0x0400,
322};
323
324/* Bits in the RxMode register. */
325enum rx_mode_bits {
326 AcceptAllIPMulti=0x20, AcceptMultiHash=0x10, AcceptAll=0x08,
327 AcceptBroadcast=0x04, AcceptMulticast=0x02, AcceptMyPhys=0x01,
328};
329/* Bits in MACCtrl. */
330enum mac_ctrl0_bits {
331 EnbFullDuplex=0x20, EnbRcvLargeFrame=0x40,
332 EnbFlowCtrl=0x100, EnbPassRxCRC=0x200,
333};
334enum mac_ctrl1_bits {
335 StatsEnable=0x0020, StatsDisable=0x0040, StatsEnabled=0x0080,
336 TxEnable=0x0100, TxDisable=0x0200, TxEnabled=0x0400,
337 RxEnable=0x0800, RxDisable=0x1000, RxEnabled=0x2000,
338};
339
340/* The Rx and Tx buffer descriptors. */
341/* Note that using only 32 bit fields simplifies conversion to big-endian
342 architectures. */
343struct netdev_desc {
344 u32 next_desc;
345 u32 status;
346 struct desc_frag { u32 addr, length; } frag[1];
347};
348
349/* Bits in netdev_desc.status */
350enum desc_status_bits {
351 DescOwn=0x8000,
352 DescEndPacket=0x4000,
353 DescEndRing=0x2000,
354 LastFrag=0x80000000,
355 DescIntrOnTx=0x8000,
356 DescIntrOnDMADone=0x80000000,
357 DisableAlign = 0x00000001,
358};
359
360#define PRIV_ALIGN 15 /* Required alignment mask */
361/* Use __attribute__((aligned (L1_CACHE_BYTES))) to maintain alignment
362 within the structure. */
363#define MII_CNT 4
364struct netdev_private {
365 /* Descriptor rings first for alignment. */
366 struct netdev_desc *rx_ring;
367 struct netdev_desc *tx_ring;
368 struct sk_buff* rx_skbuff[RX_RING_SIZE];
369 struct sk_buff* tx_skbuff[TX_RING_SIZE];
370 dma_addr_t tx_ring_dma;
371 dma_addr_t rx_ring_dma;
372 struct net_device_stats stats;
373 struct timer_list timer; /* Media monitoring timer. */
374 /* Frequently used values: keep some adjacent for cache effect. */
375 spinlock_t lock;
376 spinlock_t rx_lock; /* Group with Tx control cache line. */
377 int msg_enable;
378 int chip_id;
379 unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */
380 unsigned int rx_buf_sz; /* Based on MTU+slack. */
381 struct netdev_desc *last_tx; /* Last Tx descriptor used. */
382 unsigned int cur_tx, dirty_tx;
383 /* These values are keep track of the transceiver/media in use. */
384 unsigned int flowctrl:1;
385 unsigned int default_port:4; /* Last dev->if_port value. */
386 unsigned int an_enable:1;
387 unsigned int speed;
388 struct tasklet_struct rx_tasklet;
389 struct tasklet_struct tx_tasklet;
390 int budget;
391 int cur_task;
392 /* Multicast and receive mode. */
393 spinlock_t mcastlock; /* SMP lock multicast updates. */
394 u16 mcast_filter[4];
395 /* MII transceiver section. */
396 struct mii_if_info mii_if;
397 int mii_preamble_required;
398 unsigned char phys[MII_CNT]; /* MII device addresses, only first one used. */
399 struct pci_dev *pci_dev;
400 void __iomem *base;
401 unsigned char pci_rev_id;
402};
403
404/* The station address location in the EEPROM. */
405#define EEPROM_SA_OFFSET 0x10
406#define DEFAULT_INTR (IntrRxDMADone | IntrPCIErr | \
407 IntrDrvRqst | IntrTxDone | StatsMax | \
408 LinkChange)
409
410static int change_mtu(struct net_device *dev, int new_mtu);
411static int eeprom_read(void __iomem *ioaddr, int location);
412static int mdio_read(struct net_device *dev, int phy_id, int location);
413static void mdio_write(struct net_device *dev, int phy_id, int location, int value);
414static int netdev_open(struct net_device *dev);
415static void check_duplex(struct net_device *dev);
416static void netdev_timer(unsigned long data);
417static void tx_timeout(struct net_device *dev);
418static void init_ring(struct net_device *dev);
419static int start_tx(struct sk_buff *skb, struct net_device *dev);
420static int reset_tx (struct net_device *dev);
David Howells7d12e782006-10-05 14:55:46 +0100421static irqreturn_t intr_handler(int irq, void *dev_instance);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422static void rx_poll(unsigned long data);
423static void tx_poll(unsigned long data);
424static void refill_rx (struct net_device *dev);
425static void netdev_error(struct net_device *dev, int intr_status);
426static void netdev_error(struct net_device *dev, int intr_status);
427static void set_rx_mode(struct net_device *dev);
428static int __set_mac_addr(struct net_device *dev);
429static struct net_device_stats *get_stats(struct net_device *dev);
430static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
431static int netdev_close(struct net_device *dev);
Jeff Garzik7282d492006-09-13 14:30:00 -0400432static const struct ethtool_ops ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433
Philippe De Muyterb71b95e2005-10-28 12:23:47 +0200434static void sundance_reset(struct net_device *dev, unsigned long reset_cmd)
435{
436 struct netdev_private *np = netdev_priv(dev);
437 void __iomem *ioaddr = np->base + ASICCtrl;
438 int countdown;
439
440 /* ST201 documentation states ASICCtrl is a 32bit register */
441 iowrite32 (reset_cmd | ioread32 (ioaddr), ioaddr);
442 /* ST201 documentation states reset can take up to 1 ms */
443 countdown = 10 + 1;
444 while (ioread32 (ioaddr) & (ResetBusy << 16)) {
445 if (--countdown == 0) {
446 printk(KERN_WARNING "%s : reset not completed !!\n", dev->name);
447 break;
448 }
449 udelay(100);
450 }
451}
452
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453static int __devinit sundance_probe1 (struct pci_dev *pdev,
454 const struct pci_device_id *ent)
455{
456 struct net_device *dev;
457 struct netdev_private *np;
458 static int card_idx;
459 int chip_idx = ent->driver_data;
460 int irq;
461 int i;
462 void __iomem *ioaddr;
463 u16 mii_ctl;
464 void *ring_space;
465 dma_addr_t ring_dma;
466#ifdef USE_IO_OPS
467 int bar = 0;
468#else
469 int bar = 1;
470#endif
John W. Linville67ec2f82005-10-18 21:31:01 -0400471 int phy, phy_idx = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472
473
474/* when built into the kernel, we only print version if device is found */
475#ifndef MODULE
476 static int printed_version;
477 if (!printed_version++)
478 printk(version);
479#endif
480
481 if (pci_enable_device(pdev))
482 return -EIO;
483 pci_set_master(pdev);
484
485 irq = pdev->irq;
486
487 dev = alloc_etherdev(sizeof(*np));
488 if (!dev)
489 return -ENOMEM;
490 SET_MODULE_OWNER(dev);
491 SET_NETDEV_DEV(dev, &pdev->dev);
492
493 if (pci_request_regions(pdev, DRV_NAME))
494 goto err_out_netdev;
495
496 ioaddr = pci_iomap(pdev, bar, netdev_io_size);
497 if (!ioaddr)
498 goto err_out_res;
499
500 for (i = 0; i < 3; i++)
501 ((u16 *)dev->dev_addr)[i] =
502 le16_to_cpu(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET));
John W. Linville30d60a82005-09-12 10:48:58 -0400503 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504
505 dev->base_addr = (unsigned long)ioaddr;
506 dev->irq = irq;
507
508 np = netdev_priv(dev);
509 np->base = ioaddr;
510 np->pci_dev = pdev;
511 np->chip_id = chip_idx;
512 np->msg_enable = (1 << debug) - 1;
513 spin_lock_init(&np->lock);
514 tasklet_init(&np->rx_tasklet, rx_poll, (unsigned long)dev);
515 tasklet_init(&np->tx_tasklet, tx_poll, (unsigned long)dev);
516
517 ring_space = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma);
518 if (!ring_space)
519 goto err_out_cleardev;
520 np->tx_ring = (struct netdev_desc *)ring_space;
521 np->tx_ring_dma = ring_dma;
522
523 ring_space = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma);
524 if (!ring_space)
525 goto err_out_unmap_tx;
526 np->rx_ring = (struct netdev_desc *)ring_space;
527 np->rx_ring_dma = ring_dma;
528
529 np->mii_if.dev = dev;
530 np->mii_if.mdio_read = mdio_read;
531 np->mii_if.mdio_write = mdio_write;
532 np->mii_if.phy_id_mask = 0x1f;
533 np->mii_if.reg_num_mask = 0x1f;
534
535 /* The chip-specific entries in the device structure. */
536 dev->open = &netdev_open;
537 dev->hard_start_xmit = &start_tx;
538 dev->stop = &netdev_close;
539 dev->get_stats = &get_stats;
540 dev->set_multicast_list = &set_rx_mode;
541 dev->do_ioctl = &netdev_ioctl;
542 SET_ETHTOOL_OPS(dev, &ethtool_ops);
543 dev->tx_timeout = &tx_timeout;
544 dev->watchdog_timeo = TX_TIMEOUT;
545 dev->change_mtu = &change_mtu;
546 pci_set_drvdata(pdev, dev);
547
548 pci_read_config_byte(pdev, PCI_REVISION_ID, &np->pci_rev_id);
549
550 i = register_netdev(dev);
551 if (i)
552 goto err_out_unmap_rx;
553
554 printk(KERN_INFO "%s: %s at %p, ",
555 dev->name, pci_id_tbl[chip_idx].name, ioaddr);
556 for (i = 0; i < 5; i++)
557 printk("%2.2x:", dev->dev_addr[i]);
558 printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq);
559
John W. Linville67ec2f82005-10-18 21:31:01 -0400560 np->phys[0] = 1; /* Default setting */
561 np->mii_preamble_required++;
Arnaldo Carvalho de Melo0d615ec2006-01-26 22:01:38 -0500562 /*
563 * It seems some phys doesn't deal well with address 0 being accessed
564 * first, so leave address zero to the end of the loop (32 & 31).
565 */
John W. Linvilleb06c0932005-10-19 08:07:34 -0400566 for (phy = 1; phy <= 32 && phy_idx < MII_CNT; phy++) {
John W. Linvilleb06c0932005-10-19 08:07:34 -0400567 int phyx = phy & 0x1f;
Arnaldo Carvalho de Melo0d615ec2006-01-26 22:01:38 -0500568 int mii_status = mdio_read(dev, phyx, MII_BMSR);
John W. Linville67ec2f82005-10-18 21:31:01 -0400569 if (mii_status != 0xffff && mii_status != 0x0000) {
John W. Linvilleb06c0932005-10-19 08:07:34 -0400570 np->phys[phy_idx++] = phyx;
571 np->mii_if.advertising = mdio_read(dev, phyx, MII_ADVERTISE);
John W. Linville67ec2f82005-10-18 21:31:01 -0400572 if ((mii_status & 0x0040) == 0)
573 np->mii_preamble_required++;
574 printk(KERN_INFO "%s: MII PHY found at address %d, status "
575 "0x%4.4x advertising %4.4x.\n",
John W. Linvilleb06c0932005-10-19 08:07:34 -0400576 dev->name, phyx, mii_status, np->mii_if.advertising);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 }
John W. Linville67ec2f82005-10-18 21:31:01 -0400579 np->mii_preamble_required--;
580
581 if (phy_idx == 0) {
582 printk(KERN_INFO "%s: No MII transceiver found, aborting. ASIC status %x\n",
583 dev->name, ioread32(ioaddr + ASICCtrl));
584 goto err_out_unregister;
585 }
586
587 np->mii_if.phy_id = np->phys[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588
589 /* Parse override configuration */
590 np->an_enable = 1;
591 if (card_idx < MAX_UNITS) {
592 if (media[card_idx] != NULL) {
593 np->an_enable = 0;
594 if (strcmp (media[card_idx], "100mbps_fd") == 0 ||
595 strcmp (media[card_idx], "4") == 0) {
596 np->speed = 100;
597 np->mii_if.full_duplex = 1;
598 } else if (strcmp (media[card_idx], "100mbps_hd") == 0
599 || strcmp (media[card_idx], "3") == 0) {
600 np->speed = 100;
601 np->mii_if.full_duplex = 0;
602 } else if (strcmp (media[card_idx], "10mbps_fd") == 0 ||
603 strcmp (media[card_idx], "2") == 0) {
604 np->speed = 10;
605 np->mii_if.full_duplex = 1;
606 } else if (strcmp (media[card_idx], "10mbps_hd") == 0 ||
607 strcmp (media[card_idx], "1") == 0) {
608 np->speed = 10;
609 np->mii_if.full_duplex = 0;
610 } else {
611 np->an_enable = 1;
612 }
613 }
614 if (flowctrl == 1)
615 np->flowctrl = 1;
616 }
617
618 /* Fibre PHY? */
619 if (ioread32 (ioaddr + ASICCtrl) & 0x80) {
620 /* Default 100Mbps Full */
621 if (np->an_enable) {
622 np->speed = 100;
623 np->mii_if.full_duplex = 1;
624 np->an_enable = 0;
625 }
626 }
627 /* Reset PHY */
628 mdio_write (dev, np->phys[0], MII_BMCR, BMCR_RESET);
629 mdelay (300);
630 /* If flow control enabled, we need to advertise it.*/
631 if (np->flowctrl)
632 mdio_write (dev, np->phys[0], MII_ADVERTISE, np->mii_if.advertising | 0x0400);
633 mdio_write (dev, np->phys[0], MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART);
634 /* Force media type */
635 if (!np->an_enable) {
636 mii_ctl = 0;
637 mii_ctl |= (np->speed == 100) ? BMCR_SPEED100 : 0;
638 mii_ctl |= (np->mii_if.full_duplex) ? BMCR_FULLDPLX : 0;
639 mdio_write (dev, np->phys[0], MII_BMCR, mii_ctl);
640 printk (KERN_INFO "Override speed=%d, %s duplex\n",
641 np->speed, np->mii_if.full_duplex ? "Full" : "Half");
642
643 }
644
645 /* Perhaps move the reset here? */
646 /* Reset the chip to erase previous misconfiguration. */
647 if (netif_msg_hw(np))
648 printk("ASIC Control is %x.\n", ioread32(ioaddr + ASICCtrl));
Philippe De Muytere714d992006-08-03 18:42:15 +0200649 sundance_reset(dev, 0x00ff << 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 if (netif_msg_hw(np))
651 printk("ASIC Control is now %x.\n", ioread32(ioaddr + ASICCtrl));
652
653 card_idx++;
654 return 0;
655
656err_out_unregister:
657 unregister_netdev(dev);
658err_out_unmap_rx:
659 pci_free_consistent(pdev, RX_TOTAL_SIZE, np->rx_ring, np->rx_ring_dma);
660err_out_unmap_tx:
661 pci_free_consistent(pdev, TX_TOTAL_SIZE, np->tx_ring, np->tx_ring_dma);
662err_out_cleardev:
663 pci_set_drvdata(pdev, NULL);
664 pci_iounmap(pdev, ioaddr);
665err_out_res:
666 pci_release_regions(pdev);
667err_out_netdev:
668 free_netdev (dev);
669 return -ENODEV;
670}
671
672static int change_mtu(struct net_device *dev, int new_mtu)
673{
674 if ((new_mtu < 68) || (new_mtu > 8191)) /* Set by RxDMAFrameLen */
675 return -EINVAL;
676 if (netif_running(dev))
677 return -EBUSY;
678 dev->mtu = new_mtu;
679 return 0;
680}
681
682#define eeprom_delay(ee_addr) ioread32(ee_addr)
683/* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. */
684static int __devinit eeprom_read(void __iomem *ioaddr, int location)
685{
686 int boguscnt = 10000; /* Typical 1900 ticks. */
687 iowrite16(0x0200 | (location & 0xff), ioaddr + EECtrl);
688 do {
689 eeprom_delay(ioaddr + EECtrl);
690 if (! (ioread16(ioaddr + EECtrl) & 0x8000)) {
691 return ioread16(ioaddr + EEData);
692 }
693 } while (--boguscnt > 0);
694 return 0;
695}
696
697/* MII transceiver control section.
698 Read and write the MII registers using software-generated serial
699 MDIO protocol. See the MII specifications or DP83840A data sheet
700 for details.
701
702 The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
703 met by back-to-back 33Mhz PCI cycles. */
704#define mdio_delay() ioread8(mdio_addr)
705
706enum mii_reg_bits {
707 MDIO_ShiftClk=0x0001, MDIO_Data=0x0002, MDIO_EnbOutput=0x0004,
708};
709#define MDIO_EnbIn (0)
710#define MDIO_WRITE0 (MDIO_EnbOutput)
711#define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput)
712
713/* Generate the preamble required for initial synchronization and
714 a few older transceivers. */
715static void mdio_sync(void __iomem *mdio_addr)
716{
717 int bits = 32;
718
719 /* Establish sync by sending at least 32 logic ones. */
720 while (--bits >= 0) {
721 iowrite8(MDIO_WRITE1, mdio_addr);
722 mdio_delay();
723 iowrite8(MDIO_WRITE1 | MDIO_ShiftClk, mdio_addr);
724 mdio_delay();
725 }
726}
727
728static int mdio_read(struct net_device *dev, int phy_id, int location)
729{
730 struct netdev_private *np = netdev_priv(dev);
731 void __iomem *mdio_addr = np->base + MIICtrl;
732 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
733 int i, retval = 0;
734
735 if (np->mii_preamble_required)
736 mdio_sync(mdio_addr);
737
738 /* Shift the read command bits out. */
739 for (i = 15; i >= 0; i--) {
740 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
741
742 iowrite8(dataval, mdio_addr);
743 mdio_delay();
744 iowrite8(dataval | MDIO_ShiftClk, mdio_addr);
745 mdio_delay();
746 }
747 /* Read the two transition, 16 data, and wire-idle bits. */
748 for (i = 19; i > 0; i--) {
749 iowrite8(MDIO_EnbIn, mdio_addr);
750 mdio_delay();
751 retval = (retval << 1) | ((ioread8(mdio_addr) & MDIO_Data) ? 1 : 0);
752 iowrite8(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr);
753 mdio_delay();
754 }
755 return (retval>>1) & 0xffff;
756}
757
758static void mdio_write(struct net_device *dev, int phy_id, int location, int value)
759{
760 struct netdev_private *np = netdev_priv(dev);
761 void __iomem *mdio_addr = np->base + MIICtrl;
762 int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
763 int i;
764
765 if (np->mii_preamble_required)
766 mdio_sync(mdio_addr);
767
768 /* Shift the command bits out. */
769 for (i = 31; i >= 0; i--) {
770 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
771
772 iowrite8(dataval, mdio_addr);
773 mdio_delay();
774 iowrite8(dataval | MDIO_ShiftClk, mdio_addr);
775 mdio_delay();
776 }
777 /* Clear out extra bits. */
778 for (i = 2; i > 0; i--) {
779 iowrite8(MDIO_EnbIn, mdio_addr);
780 mdio_delay();
781 iowrite8(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr);
782 mdio_delay();
783 }
784 return;
785}
786
787static int netdev_open(struct net_device *dev)
788{
789 struct netdev_private *np = netdev_priv(dev);
790 void __iomem *ioaddr = np->base;
791 int i;
792
793 /* Do we need to reset the chip??? */
794
Thomas Gleixner1fb9df52006-07-01 19:29:39 -0700795 i = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 if (i)
797 return i;
798
799 if (netif_msg_ifup(np))
800 printk(KERN_DEBUG "%s: netdev_open() irq %d.\n",
801 dev->name, dev->irq);
802 init_ring(dev);
803
804 iowrite32(np->rx_ring_dma, ioaddr + RxListPtr);
805 /* The Tx list pointer is written as packets are queued. */
806
807 /* Initialize other registers. */
808 __set_mac_addr(dev);
809#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
810 iowrite16(dev->mtu + 18, ioaddr + MaxFrameSize);
811#else
812 iowrite16(dev->mtu + 14, ioaddr + MaxFrameSize);
813#endif
814 if (dev->mtu > 2047)
815 iowrite32(ioread32(ioaddr + ASICCtrl) | 0x0C, ioaddr + ASICCtrl);
816
817 /* Configure the PCI bus bursts and FIFO thresholds. */
818
819 if (dev->if_port == 0)
820 dev->if_port = np->default_port;
821
822 spin_lock_init(&np->mcastlock);
823
824 set_rx_mode(dev);
825 iowrite16(0, ioaddr + IntrEnable);
826 iowrite16(0, ioaddr + DownCounter);
827 /* Set the chip to poll every N*320nsec. */
828 iowrite8(100, ioaddr + RxDMAPollPeriod);
829 iowrite8(127, ioaddr + TxDMAPollPeriod);
830 /* Fix DFE-580TX packet drop issue */
831 if (np->pci_rev_id >= 0x14)
832 iowrite8(0x01, ioaddr + DebugCtrl1);
833 netif_start_queue(dev);
834
835 iowrite16 (StatsEnable | RxEnable | TxEnable, ioaddr + MACCtrl1);
836
837 if (netif_msg_ifup(np))
838 printk(KERN_DEBUG "%s: Done netdev_open(), status: Rx %x Tx %x "
839 "MAC Control %x, %4.4x %4.4x.\n",
840 dev->name, ioread32(ioaddr + RxStatus), ioread8(ioaddr + TxStatus),
841 ioread32(ioaddr + MACCtrl0),
842 ioread16(ioaddr + MACCtrl1), ioread16(ioaddr + MACCtrl0));
843
844 /* Set the timer to check for link beat. */
845 init_timer(&np->timer);
846 np->timer.expires = jiffies + 3*HZ;
847 np->timer.data = (unsigned long)dev;
848 np->timer.function = &netdev_timer; /* timer handler */
849 add_timer(&np->timer);
850
851 /* Enable interrupts by setting the interrupt mask. */
852 iowrite16(DEFAULT_INTR, ioaddr + IntrEnable);
853
854 return 0;
855}
856
857static void check_duplex(struct net_device *dev)
858{
859 struct netdev_private *np = netdev_priv(dev);
860 void __iomem *ioaddr = np->base;
861 int mii_lpa = mdio_read(dev, np->phys[0], MII_LPA);
862 int negotiated = mii_lpa & np->mii_if.advertising;
863 int duplex;
864
865 /* Force media */
866 if (!np->an_enable || mii_lpa == 0xffff) {
867 if (np->mii_if.full_duplex)
868 iowrite16 (ioread16 (ioaddr + MACCtrl0) | EnbFullDuplex,
869 ioaddr + MACCtrl0);
870 return;
871 }
872
873 /* Autonegotiation */
874 duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040;
875 if (np->mii_if.full_duplex != duplex) {
876 np->mii_if.full_duplex = duplex;
877 if (netif_msg_link(np))
878 printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d "
879 "negotiated capability %4.4x.\n", dev->name,
880 duplex ? "full" : "half", np->phys[0], negotiated);
881 iowrite16(ioread16(ioaddr + MACCtrl0) | duplex ? 0x20 : 0, ioaddr + MACCtrl0);
882 }
883}
884
885static void netdev_timer(unsigned long data)
886{
887 struct net_device *dev = (struct net_device *)data;
888 struct netdev_private *np = netdev_priv(dev);
889 void __iomem *ioaddr = np->base;
890 int next_tick = 10*HZ;
891
892 if (netif_msg_timer(np)) {
893 printk(KERN_DEBUG "%s: Media selection timer tick, intr status %4.4x, "
894 "Tx %x Rx %x.\n",
895 dev->name, ioread16(ioaddr + IntrEnable),
896 ioread8(ioaddr + TxStatus), ioread32(ioaddr + RxStatus));
897 }
898 check_duplex(dev);
899 np->timer.expires = jiffies + next_tick;
900 add_timer(&np->timer);
901}
902
903static void tx_timeout(struct net_device *dev)
904{
905 struct netdev_private *np = netdev_priv(dev);
906 void __iomem *ioaddr = np->base;
907 unsigned long flag;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400908
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 netif_stop_queue(dev);
910 tasklet_disable(&np->tx_tasklet);
911 iowrite16(0, ioaddr + IntrEnable);
912 printk(KERN_WARNING "%s: Transmit timed out, TxStatus %2.2x "
913 "TxFrameId %2.2x,"
914 " resetting...\n", dev->name, ioread8(ioaddr + TxStatus),
915 ioread8(ioaddr + TxFrameId));
916
917 {
918 int i;
919 for (i=0; i<TX_RING_SIZE; i++) {
920 printk(KERN_DEBUG "%02x %08llx %08x %08x(%02x) %08x %08x\n", i,
921 (unsigned long long)(np->tx_ring_dma + i*sizeof(*np->tx_ring)),
922 le32_to_cpu(np->tx_ring[i].next_desc),
923 le32_to_cpu(np->tx_ring[i].status),
924 (le32_to_cpu(np->tx_ring[i].status) >> 2) & 0xff,
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400925 le32_to_cpu(np->tx_ring[i].frag[0].addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 le32_to_cpu(np->tx_ring[i].frag[0].length));
927 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400928 printk(KERN_DEBUG "TxListPtr=%08x netif_queue_stopped=%d\n",
929 ioread32(np->base + TxListPtr),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930 netif_queue_stopped(dev));
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400931 printk(KERN_DEBUG "cur_tx=%d(%02x) dirty_tx=%d(%02x)\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 np->cur_tx, np->cur_tx % TX_RING_SIZE,
933 np->dirty_tx, np->dirty_tx % TX_RING_SIZE);
934 printk(KERN_DEBUG "cur_rx=%d dirty_rx=%d\n", np->cur_rx, np->dirty_rx);
935 printk(KERN_DEBUG "cur_task=%d\n", np->cur_task);
936 }
937 spin_lock_irqsave(&np->lock, flag);
938
939 /* Stop and restart the chip's Tx processes . */
940 reset_tx(dev);
941 spin_unlock_irqrestore(&np->lock, flag);
942
943 dev->if_port = 0;
944
945 dev->trans_start = jiffies;
946 np->stats.tx_errors++;
947 if (np->cur_tx - np->dirty_tx < TX_QUEUE_LEN - 4) {
948 netif_wake_queue(dev);
949 }
950 iowrite16(DEFAULT_INTR, ioaddr + IntrEnable);
951 tasklet_enable(&np->tx_tasklet);
952}
953
954
955/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
956static void init_ring(struct net_device *dev)
957{
958 struct netdev_private *np = netdev_priv(dev);
959 int i;
960
961 np->cur_rx = np->cur_tx = 0;
962 np->dirty_rx = np->dirty_tx = 0;
963 np->cur_task = 0;
964
965 np->rx_buf_sz = (dev->mtu <= 1520 ? PKT_BUF_SZ : dev->mtu + 16);
966
967 /* Initialize all Rx descriptors. */
968 for (i = 0; i < RX_RING_SIZE; i++) {
969 np->rx_ring[i].next_desc = cpu_to_le32(np->rx_ring_dma +
970 ((i+1)%RX_RING_SIZE)*sizeof(*np->rx_ring));
971 np->rx_ring[i].status = 0;
972 np->rx_ring[i].frag[0].length = 0;
973 np->rx_skbuff[i] = NULL;
974 }
975
976 /* Fill in the Rx buffers. Handle allocation failure gracefully. */
977 for (i = 0; i < RX_RING_SIZE; i++) {
978 struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
979 np->rx_skbuff[i] = skb;
980 if (skb == NULL)
981 break;
982 skb->dev = dev; /* Mark as being used by this device. */
983 skb_reserve(skb, 2); /* 16 byte align the IP header. */
984 np->rx_ring[i].frag[0].addr = cpu_to_le32(
David S. Miller689be432005-06-28 15:25:31 -0700985 pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 PCI_DMA_FROMDEVICE));
987 np->rx_ring[i].frag[0].length = cpu_to_le32(np->rx_buf_sz | LastFrag);
988 }
989 np->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
990
991 for (i = 0; i < TX_RING_SIZE; i++) {
992 np->tx_skbuff[i] = NULL;
993 np->tx_ring[i].status = 0;
994 }
995 return;
996}
997
998static void tx_poll (unsigned long data)
999{
1000 struct net_device *dev = (struct net_device *)data;
1001 struct netdev_private *np = netdev_priv(dev);
1002 unsigned head = np->cur_task % TX_RING_SIZE;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001003 struct netdev_desc *txdesc =
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 &np->tx_ring[(np->cur_tx - 1) % TX_RING_SIZE];
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001005
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006 /* Chain the next pointer */
1007 for (; np->cur_tx - np->cur_task > 0; np->cur_task++) {
1008 int entry = np->cur_task % TX_RING_SIZE;
1009 txdesc = &np->tx_ring[entry];
1010 if (np->last_tx) {
1011 np->last_tx->next_desc = cpu_to_le32(np->tx_ring_dma +
1012 entry*sizeof(struct netdev_desc));
1013 }
1014 np->last_tx = txdesc;
1015 }
1016 /* Indicate the latest descriptor of tx ring */
1017 txdesc->status |= cpu_to_le32(DescIntrOnTx);
1018
1019 if (ioread32 (np->base + TxListPtr) == 0)
1020 iowrite32 (np->tx_ring_dma + head * sizeof(struct netdev_desc),
1021 np->base + TxListPtr);
1022 return;
1023}
1024
1025static int
1026start_tx (struct sk_buff *skb, struct net_device *dev)
1027{
1028 struct netdev_private *np = netdev_priv(dev);
1029 struct netdev_desc *txdesc;
1030 unsigned entry;
1031
1032 /* Calculate the next Tx descriptor entry. */
1033 entry = np->cur_tx % TX_RING_SIZE;
1034 np->tx_skbuff[entry] = skb;
1035 txdesc = &np->tx_ring[entry];
1036
1037 txdesc->next_desc = 0;
1038 txdesc->status = cpu_to_le32 ((entry << 2) | DisableAlign);
1039 txdesc->frag[0].addr = cpu_to_le32 (pci_map_single (np->pci_dev, skb->data,
1040 skb->len,
1041 PCI_DMA_TODEVICE));
1042 txdesc->frag[0].length = cpu_to_le32 (skb->len | LastFrag);
1043
1044 /* Increment cur_tx before tasklet_schedule() */
1045 np->cur_tx++;
1046 mb();
1047 /* Schedule a tx_poll() task */
1048 tasklet_schedule(&np->tx_tasklet);
1049
1050 /* On some architectures: explicitly flush cache lines here. */
1051 if (np->cur_tx - np->dirty_tx < TX_QUEUE_LEN - 1
1052 && !netif_queue_stopped(dev)) {
1053 /* do nothing */
1054 } else {
1055 netif_stop_queue (dev);
1056 }
1057 dev->trans_start = jiffies;
1058 if (netif_msg_tx_queued(np)) {
1059 printk (KERN_DEBUG
1060 "%s: Transmit frame #%d queued in slot %d.\n",
1061 dev->name, np->cur_tx, entry);
1062 }
1063 return 0;
1064}
1065
1066/* Reset hardware tx and free all of tx buffers */
1067static int
1068reset_tx (struct net_device *dev)
1069{
1070 struct netdev_private *np = netdev_priv(dev);
1071 void __iomem *ioaddr = np->base;
1072 struct sk_buff *skb;
1073 int i;
1074 int irq = in_interrupt();
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001075
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 /* Reset tx logic, TxListPtr will be cleaned */
1077 iowrite16 (TxDisable, ioaddr + MACCtrl1);
Philippe De Muytere714d992006-08-03 18:42:15 +02001078 sundance_reset(dev, (NetworkReset|FIFOReset|DMAReset|TxReset) << 16);
1079
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 /* free all tx skbuff */
1081 for (i = 0; i < TX_RING_SIZE; i++) {
Jesse Huang2109f892006-10-20 14:42:11 -07001082 np->tx_ring[i].next_desc = 0;
1083
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 skb = np->tx_skbuff[i];
1085 if (skb) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001086 pci_unmap_single(np->pci_dev,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 np->tx_ring[i].frag[0].addr, skb->len,
1088 PCI_DMA_TODEVICE);
1089 if (irq)
1090 dev_kfree_skb_irq (skb);
1091 else
1092 dev_kfree_skb (skb);
1093 np->tx_skbuff[i] = NULL;
1094 np->stats.tx_dropped++;
1095 }
1096 }
1097 np->cur_tx = np->dirty_tx = 0;
1098 np->cur_task = 0;
Jesse Huang2109f892006-10-20 14:42:11 -07001099
1100 np->last_tx = 0;
1101 iowrite8(127, ioaddr + TxDMAPollPeriod);
1102
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103 iowrite16 (StatsEnable | RxEnable | TxEnable, ioaddr + MACCtrl1);
1104 return 0;
1105}
1106
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001107/* The interrupt handler cleans up after the Tx thread,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 and schedule a Rx thread work */
David Howells7d12e782006-10-05 14:55:46 +01001109static irqreturn_t intr_handler(int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110{
1111 struct net_device *dev = (struct net_device *)dev_instance;
1112 struct netdev_private *np = netdev_priv(dev);
1113 void __iomem *ioaddr = np->base;
1114 int hw_frame_id;
1115 int tx_cnt;
1116 int tx_status;
1117 int handled = 0;
Jesse Huange2420402006-10-20 14:42:05 -07001118 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119
1120
1121 do {
1122 int intr_status = ioread16(ioaddr + IntrStatus);
1123 iowrite16(intr_status, ioaddr + IntrStatus);
1124
1125 if (netif_msg_intr(np))
1126 printk(KERN_DEBUG "%s: Interrupt, status %4.4x.\n",
1127 dev->name, intr_status);
1128
1129 if (!(intr_status & DEFAULT_INTR))
1130 break;
1131
1132 handled = 1;
1133
1134 if (intr_status & (IntrRxDMADone)) {
1135 iowrite16(DEFAULT_INTR & ~(IntrRxDone|IntrRxDMADone),
1136 ioaddr + IntrEnable);
1137 if (np->budget < 0)
1138 np->budget = RX_BUDGET;
1139 tasklet_schedule(&np->rx_tasklet);
1140 }
1141 if (intr_status & (IntrTxDone | IntrDrvRqst)) {
1142 tx_status = ioread16 (ioaddr + TxStatus);
1143 for (tx_cnt=32; tx_status & 0x80; --tx_cnt) {
1144 if (netif_msg_tx_done(np))
1145 printk
1146 ("%s: Transmit status is %2.2x.\n",
1147 dev->name, tx_status);
1148 if (tx_status & 0x1e) {
Philippe De Muyterb71b95e2005-10-28 12:23:47 +02001149 if (netif_msg_tx_err(np))
1150 printk("%s: Transmit error status %4.4x.\n",
1151 dev->name, tx_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 np->stats.tx_errors++;
1153 if (tx_status & 0x10)
1154 np->stats.tx_fifo_errors++;
1155 if (tx_status & 0x08)
1156 np->stats.collisions++;
Philippe De Muyterb71b95e2005-10-28 12:23:47 +02001157 if (tx_status & 0x04)
1158 np->stats.tx_fifo_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 if (tx_status & 0x02)
1160 np->stats.tx_window_errors++;
Jesse Huange2420402006-10-20 14:42:05 -07001161
Philippe De Muyterb71b95e2005-10-28 12:23:47 +02001162 /*
1163 ** This reset has been verified on
1164 ** DFE-580TX boards ! phdm@macqel.be.
1165 */
1166 if (tx_status & 0x10) { /* TxUnderrun */
Philippe De Muyterb71b95e2005-10-28 12:23:47 +02001167 /* Restart Tx FIFO and transmitter */
1168 sundance_reset(dev, (NetworkReset|FIFOReset|TxReset) << 16);
Philippe De Muyterb71b95e2005-10-28 12:23:47 +02001169 /* No need to reset the Tx pointer here */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 }
Jesse Huang2109f892006-10-20 14:42:11 -07001171 /* Restart the Tx. Need to make sure tx enabled */
1172 i = 10;
1173 do {
1174 iowrite16(ioread16(ioaddr + MACCtrl1) | TxEnable, ioaddr + MACCtrl1);
1175 if (ioread16(ioaddr + MACCtrl1) & TxEnabled)
1176 break;
1177 mdelay(1);
1178 } while (--i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 }
1180 /* Yup, this is a documentation bug. It cost me *hours*. */
1181 iowrite16 (0, ioaddr + TxStatus);
1182 if (tx_cnt < 0) {
1183 iowrite32(5000, ioaddr + DownCounter);
1184 break;
1185 }
1186 tx_status = ioread16 (ioaddr + TxStatus);
1187 }
1188 hw_frame_id = (tx_status >> 8) & 0xff;
1189 } else {
1190 hw_frame_id = ioread8(ioaddr + TxFrameId);
1191 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001192
1193 if (np->pci_rev_id >= 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 spin_lock(&np->lock);
1195 for (; np->cur_tx - np->dirty_tx > 0; np->dirty_tx++) {
1196 int entry = np->dirty_tx % TX_RING_SIZE;
1197 struct sk_buff *skb;
1198 int sw_frame_id;
1199 sw_frame_id = (le32_to_cpu(
1200 np->tx_ring[entry].status) >> 2) & 0xff;
1201 if (sw_frame_id == hw_frame_id &&
1202 !(le32_to_cpu(np->tx_ring[entry].status)
1203 & 0x00010000))
1204 break;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001205 if (sw_frame_id == (hw_frame_id + 1) %
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 TX_RING_SIZE)
1207 break;
1208 skb = np->tx_skbuff[entry];
1209 /* Free the original skb. */
1210 pci_unmap_single(np->pci_dev,
1211 np->tx_ring[entry].frag[0].addr,
1212 skb->len, PCI_DMA_TODEVICE);
1213 dev_kfree_skb_irq (np->tx_skbuff[entry]);
1214 np->tx_skbuff[entry] = NULL;
1215 np->tx_ring[entry].frag[0].addr = 0;
1216 np->tx_ring[entry].frag[0].length = 0;
1217 }
1218 spin_unlock(&np->lock);
1219 } else {
1220 spin_lock(&np->lock);
1221 for (; np->cur_tx - np->dirty_tx > 0; np->dirty_tx++) {
1222 int entry = np->dirty_tx % TX_RING_SIZE;
1223 struct sk_buff *skb;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001224 if (!(le32_to_cpu(np->tx_ring[entry].status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 & 0x00010000))
1226 break;
1227 skb = np->tx_skbuff[entry];
1228 /* Free the original skb. */
1229 pci_unmap_single(np->pci_dev,
1230 np->tx_ring[entry].frag[0].addr,
1231 skb->len, PCI_DMA_TODEVICE);
1232 dev_kfree_skb_irq (np->tx_skbuff[entry]);
1233 np->tx_skbuff[entry] = NULL;
1234 np->tx_ring[entry].frag[0].addr = 0;
1235 np->tx_ring[entry].frag[0].length = 0;
1236 }
1237 spin_unlock(&np->lock);
1238 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001239
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 if (netif_queue_stopped(dev) &&
1241 np->cur_tx - np->dirty_tx < TX_QUEUE_LEN - 4) {
1242 /* The ring is no longer full, clear busy flag. */
1243 netif_wake_queue (dev);
1244 }
1245 /* Abnormal error summary/uncommon events handlers. */
1246 if (intr_status & (IntrPCIErr | LinkChange | StatsMax))
1247 netdev_error(dev, intr_status);
1248 } while (0);
1249 if (netif_msg_intr(np))
1250 printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n",
1251 dev->name, ioread16(ioaddr + IntrStatus));
1252 return IRQ_RETVAL(handled);
1253}
1254
1255static void rx_poll(unsigned long data)
1256{
1257 struct net_device *dev = (struct net_device *)data;
1258 struct netdev_private *np = netdev_priv(dev);
1259 int entry = np->cur_rx % RX_RING_SIZE;
1260 int boguscnt = np->budget;
1261 void __iomem *ioaddr = np->base;
1262 int received = 0;
1263
1264 /* If EOP is set on the next entry, it's a new packet. Send it up. */
1265 while (1) {
1266 struct netdev_desc *desc = &(np->rx_ring[entry]);
1267 u32 frame_status = le32_to_cpu(desc->status);
1268 int pkt_len;
1269
1270 if (--boguscnt < 0) {
1271 goto not_done;
1272 }
1273 if (!(frame_status & DescOwn))
1274 break;
1275 pkt_len = frame_status & 0x1fff; /* Chip omits the CRC. */
1276 if (netif_msg_rx_status(np))
1277 printk(KERN_DEBUG " netdev_rx() status was %8.8x.\n",
1278 frame_status);
1279 if (frame_status & 0x001f4000) {
1280 /* There was a error. */
1281 if (netif_msg_rx_err(np))
1282 printk(KERN_DEBUG " netdev_rx() Rx error was %8.8x.\n",
1283 frame_status);
1284 np->stats.rx_errors++;
1285 if (frame_status & 0x00100000) np->stats.rx_length_errors++;
1286 if (frame_status & 0x00010000) np->stats.rx_fifo_errors++;
1287 if (frame_status & 0x00060000) np->stats.rx_frame_errors++;
1288 if (frame_status & 0x00080000) np->stats.rx_crc_errors++;
1289 if (frame_status & 0x00100000) {
1290 printk(KERN_WARNING "%s: Oversized Ethernet frame,"
1291 " status %8.8x.\n",
1292 dev->name, frame_status);
1293 }
1294 } else {
1295 struct sk_buff *skb;
1296#ifndef final_version
1297 if (netif_msg_rx_status(np))
1298 printk(KERN_DEBUG " netdev_rx() normal Rx pkt length %d"
1299 ", bogus_cnt %d.\n",
1300 pkt_len, boguscnt);
1301#endif
1302 /* Check if the packet is long enough to accept without copying
1303 to a minimally-sized skbuff. */
1304 if (pkt_len < rx_copybreak
1305 && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
1306 skb->dev = dev;
1307 skb_reserve(skb, 2); /* 16 byte align the IP header */
1308 pci_dma_sync_single_for_cpu(np->pci_dev,
1309 desc->frag[0].addr,
1310 np->rx_buf_sz,
1311 PCI_DMA_FROMDEVICE);
1312
David S. Miller689be432005-06-28 15:25:31 -07001313 eth_copy_and_sum(skb, np->rx_skbuff[entry]->data, pkt_len, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314 pci_dma_sync_single_for_device(np->pci_dev,
1315 desc->frag[0].addr,
1316 np->rx_buf_sz,
1317 PCI_DMA_FROMDEVICE);
1318 skb_put(skb, pkt_len);
1319 } else {
1320 pci_unmap_single(np->pci_dev,
1321 desc->frag[0].addr,
1322 np->rx_buf_sz,
1323 PCI_DMA_FROMDEVICE);
1324 skb_put(skb = np->rx_skbuff[entry], pkt_len);
1325 np->rx_skbuff[entry] = NULL;
1326 }
1327 skb->protocol = eth_type_trans(skb, dev);
1328 /* Note: checksum -> skb->ip_summed = CHECKSUM_UNNECESSARY; */
1329 netif_rx(skb);
1330 dev->last_rx = jiffies;
1331 }
1332 entry = (entry + 1) % RX_RING_SIZE;
1333 received++;
1334 }
1335 np->cur_rx = entry;
1336 refill_rx (dev);
1337 np->budget -= received;
1338 iowrite16(DEFAULT_INTR, ioaddr + IntrEnable);
1339 return;
1340
1341not_done:
1342 np->cur_rx = entry;
1343 refill_rx (dev);
1344 if (!received)
1345 received = 1;
1346 np->budget -= received;
1347 if (np->budget <= 0)
1348 np->budget = RX_BUDGET;
1349 tasklet_schedule(&np->rx_tasklet);
1350 return;
1351}
1352
1353static void refill_rx (struct net_device *dev)
1354{
1355 struct netdev_private *np = netdev_priv(dev);
1356 int entry;
1357 int cnt = 0;
1358
1359 /* Refill the Rx ring buffers. */
1360 for (;(np->cur_rx - np->dirty_rx + RX_RING_SIZE) % RX_RING_SIZE > 0;
1361 np->dirty_rx = (np->dirty_rx + 1) % RX_RING_SIZE) {
1362 struct sk_buff *skb;
1363 entry = np->dirty_rx % RX_RING_SIZE;
1364 if (np->rx_skbuff[entry] == NULL) {
1365 skb = dev_alloc_skb(np->rx_buf_sz);
1366 np->rx_skbuff[entry] = skb;
1367 if (skb == NULL)
1368 break; /* Better luck next round. */
1369 skb->dev = dev; /* Mark as being used by this device. */
1370 skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
1371 np->rx_ring[entry].frag[0].addr = cpu_to_le32(
David S. Miller689be432005-06-28 15:25:31 -07001372 pci_map_single(np->pci_dev, skb->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 np->rx_buf_sz, PCI_DMA_FROMDEVICE));
1374 }
1375 /* Perhaps we need not reset this field. */
1376 np->rx_ring[entry].frag[0].length =
1377 cpu_to_le32(np->rx_buf_sz | LastFrag);
1378 np->rx_ring[entry].status = 0;
1379 cnt++;
1380 }
1381 return;
1382}
1383static void netdev_error(struct net_device *dev, int intr_status)
1384{
1385 struct netdev_private *np = netdev_priv(dev);
1386 void __iomem *ioaddr = np->base;
1387 u16 mii_ctl, mii_advertise, mii_lpa;
1388 int speed;
1389
1390 if (intr_status & LinkChange) {
1391 if (np->an_enable) {
1392 mii_advertise = mdio_read (dev, np->phys[0], MII_ADVERTISE);
1393 mii_lpa= mdio_read (dev, np->phys[0], MII_LPA);
1394 mii_advertise &= mii_lpa;
1395 printk (KERN_INFO "%s: Link changed: ", dev->name);
1396 if (mii_advertise & ADVERTISE_100FULL) {
1397 np->speed = 100;
1398 printk ("100Mbps, full duplex\n");
1399 } else if (mii_advertise & ADVERTISE_100HALF) {
1400 np->speed = 100;
1401 printk ("100Mbps, half duplex\n");
1402 } else if (mii_advertise & ADVERTISE_10FULL) {
1403 np->speed = 10;
1404 printk ("10Mbps, full duplex\n");
1405 } else if (mii_advertise & ADVERTISE_10HALF) {
1406 np->speed = 10;
1407 printk ("10Mbps, half duplex\n");
1408 } else
1409 printk ("\n");
1410
1411 } else {
1412 mii_ctl = mdio_read (dev, np->phys[0], MII_BMCR);
1413 speed = (mii_ctl & BMCR_SPEED100) ? 100 : 10;
1414 np->speed = speed;
1415 printk (KERN_INFO "%s: Link changed: %dMbps ,",
1416 dev->name, speed);
1417 printk ("%s duplex.\n", (mii_ctl & BMCR_FULLDPLX) ?
1418 "full" : "half");
1419 }
1420 check_duplex (dev);
1421 if (np->flowctrl && np->mii_if.full_duplex) {
1422 iowrite16(ioread16(ioaddr + MulticastFilter1+2) | 0x0200,
1423 ioaddr + MulticastFilter1+2);
1424 iowrite16(ioread16(ioaddr + MACCtrl0) | EnbFlowCtrl,
1425 ioaddr + MACCtrl0);
1426 }
1427 }
1428 if (intr_status & StatsMax) {
1429 get_stats(dev);
1430 }
1431 if (intr_status & IntrPCIErr) {
1432 printk(KERN_ERR "%s: Something Wicked happened! %4.4x.\n",
1433 dev->name, intr_status);
1434 /* We must do a global reset of DMA to continue. */
1435 }
1436}
1437
1438static struct net_device_stats *get_stats(struct net_device *dev)
1439{
1440 struct netdev_private *np = netdev_priv(dev);
1441 void __iomem *ioaddr = np->base;
1442 int i;
1443
1444 /* We should lock this segment of code for SMP eventually, although
1445 the vulnerability window is very small and statistics are
1446 non-critical. */
1447 /* The chip only need report frame silently dropped. */
1448 np->stats.rx_missed_errors += ioread8(ioaddr + RxMissed);
1449 np->stats.tx_packets += ioread16(ioaddr + TxFramesOK);
1450 np->stats.rx_packets += ioread16(ioaddr + RxFramesOK);
1451 np->stats.collisions += ioread8(ioaddr + StatsLateColl);
1452 np->stats.collisions += ioread8(ioaddr + StatsMultiColl);
1453 np->stats.collisions += ioread8(ioaddr + StatsOneColl);
1454 np->stats.tx_carrier_errors += ioread8(ioaddr + StatsCarrierError);
1455 ioread8(ioaddr + StatsTxDefer);
1456 for (i = StatsTxDefer; i <= StatsMcastRx; i++)
1457 ioread8(ioaddr + i);
1458 np->stats.tx_bytes += ioread16(ioaddr + TxOctetsLow);
1459 np->stats.tx_bytes += ioread16(ioaddr + TxOctetsHigh) << 16;
1460 np->stats.rx_bytes += ioread16(ioaddr + RxOctetsLow);
1461 np->stats.rx_bytes += ioread16(ioaddr + RxOctetsHigh) << 16;
1462
1463 return &np->stats;
1464}
1465
1466static void set_rx_mode(struct net_device *dev)
1467{
1468 struct netdev_private *np = netdev_priv(dev);
1469 void __iomem *ioaddr = np->base;
1470 u16 mc_filter[4]; /* Multicast hash filter */
1471 u32 rx_mode;
1472 int i;
1473
1474 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 memset(mc_filter, 0xff, sizeof(mc_filter));
1476 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptAll | AcceptMyPhys;
1477 } else if ((dev->mc_count > multicast_filter_limit)
1478 || (dev->flags & IFF_ALLMULTI)) {
1479 /* Too many to match, or accept all multicasts. */
1480 memset(mc_filter, 0xff, sizeof(mc_filter));
1481 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
1482 } else if (dev->mc_count) {
1483 struct dev_mc_list *mclist;
1484 int bit;
1485 int index;
1486 int crc;
1487 memset (mc_filter, 0, sizeof (mc_filter));
1488 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1489 i++, mclist = mclist->next) {
1490 crc = ether_crc_le (ETH_ALEN, mclist->dmi_addr);
1491 for (index=0, bit=0; bit < 6; bit++, crc <<= 1)
1492 if (crc & 0x80000000) index |= 1 << bit;
1493 mc_filter[index/16] |= (1 << (index % 16));
1494 }
1495 rx_mode = AcceptBroadcast | AcceptMultiHash | AcceptMyPhys;
1496 } else {
1497 iowrite8(AcceptBroadcast | AcceptMyPhys, ioaddr + RxMode);
1498 return;
1499 }
1500 if (np->mii_if.full_duplex && np->flowctrl)
1501 mc_filter[3] |= 0x0200;
1502
1503 for (i = 0; i < 4; i++)
1504 iowrite16(mc_filter[i], ioaddr + MulticastFilter0 + i*2);
1505 iowrite8(rx_mode, ioaddr + RxMode);
1506}
1507
1508static int __set_mac_addr(struct net_device *dev)
1509{
1510 struct netdev_private *np = netdev_priv(dev);
1511 u16 addr16;
1512
1513 addr16 = (dev->dev_addr[0] | (dev->dev_addr[1] << 8));
1514 iowrite16(addr16, np->base + StationAddr);
1515 addr16 = (dev->dev_addr[2] | (dev->dev_addr[3] << 8));
1516 iowrite16(addr16, np->base + StationAddr+2);
1517 addr16 = (dev->dev_addr[4] | (dev->dev_addr[5] << 8));
1518 iowrite16(addr16, np->base + StationAddr+4);
1519 return 0;
1520}
1521
1522static int check_if_running(struct net_device *dev)
1523{
1524 if (!netif_running(dev))
1525 return -EINVAL;
1526 return 0;
1527}
1528
1529static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1530{
1531 struct netdev_private *np = netdev_priv(dev);
1532 strcpy(info->driver, DRV_NAME);
1533 strcpy(info->version, DRV_VERSION);
1534 strcpy(info->bus_info, pci_name(np->pci_dev));
1535}
1536
1537static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1538{
1539 struct netdev_private *np = netdev_priv(dev);
1540 spin_lock_irq(&np->lock);
1541 mii_ethtool_gset(&np->mii_if, ecmd);
1542 spin_unlock_irq(&np->lock);
1543 return 0;
1544}
1545
1546static int set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1547{
1548 struct netdev_private *np = netdev_priv(dev);
1549 int res;
1550 spin_lock_irq(&np->lock);
1551 res = mii_ethtool_sset(&np->mii_if, ecmd);
1552 spin_unlock_irq(&np->lock);
1553 return res;
1554}
1555
1556static int nway_reset(struct net_device *dev)
1557{
1558 struct netdev_private *np = netdev_priv(dev);
1559 return mii_nway_restart(&np->mii_if);
1560}
1561
1562static u32 get_link(struct net_device *dev)
1563{
1564 struct netdev_private *np = netdev_priv(dev);
1565 return mii_link_ok(&np->mii_if);
1566}
1567
1568static u32 get_msglevel(struct net_device *dev)
1569{
1570 struct netdev_private *np = netdev_priv(dev);
1571 return np->msg_enable;
1572}
1573
1574static void set_msglevel(struct net_device *dev, u32 val)
1575{
1576 struct netdev_private *np = netdev_priv(dev);
1577 np->msg_enable = val;
1578}
1579
Jeff Garzik7282d492006-09-13 14:30:00 -04001580static const struct ethtool_ops ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581 .begin = check_if_running,
1582 .get_drvinfo = get_drvinfo,
1583 .get_settings = get_settings,
1584 .set_settings = set_settings,
1585 .nway_reset = nway_reset,
1586 .get_link = get_link,
1587 .get_msglevel = get_msglevel,
1588 .set_msglevel = set_msglevel,
John W. Linville30d60a82005-09-12 10:48:58 -04001589 .get_perm_addr = ethtool_op_get_perm_addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590};
1591
1592static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1593{
1594 struct netdev_private *np = netdev_priv(dev);
1595 void __iomem *ioaddr = np->base;
1596 int rc;
1597 int i;
1598
1599 if (!netif_running(dev))
1600 return -EINVAL;
1601
1602 spin_lock_irq(&np->lock);
1603 rc = generic_mii_ioctl(&np->mii_if, if_mii(rq), cmd, NULL);
1604 spin_unlock_irq(&np->lock);
1605 switch (cmd) {
1606 case SIOCDEVPRIVATE:
1607 for (i=0; i<TX_RING_SIZE; i++) {
1608 printk(KERN_DEBUG "%02x %08llx %08x %08x(%02x) %08x %08x\n", i,
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001609 (unsigned long long)(np->tx_ring_dma + i*sizeof(*np->tx_ring)),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001610 le32_to_cpu(np->tx_ring[i].next_desc),
1611 le32_to_cpu(np->tx_ring[i].status),
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001612 (le32_to_cpu(np->tx_ring[i].status) >> 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613 & 0xff,
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001614 le32_to_cpu(np->tx_ring[i].frag[0].addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615 le32_to_cpu(np->tx_ring[i].frag[0].length));
1616 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001617 printk(KERN_DEBUG "TxListPtr=%08x netif_queue_stopped=%d\n",
1618 ioread32(np->base + TxListPtr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001619 netif_queue_stopped(dev));
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001620 printk(KERN_DEBUG "cur_tx=%d(%02x) dirty_tx=%d(%02x)\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 np->cur_tx, np->cur_tx % TX_RING_SIZE,
1622 np->dirty_tx, np->dirty_tx % TX_RING_SIZE);
1623 printk(KERN_DEBUG "cur_rx=%d dirty_rx=%d\n", np->cur_rx, np->dirty_rx);
1624 printk(KERN_DEBUG "cur_task=%d\n", np->cur_task);
1625 printk(KERN_DEBUG "TxStatus=%04x\n", ioread16(ioaddr + TxStatus));
1626 return 0;
1627 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001628
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629
1630 return rc;
1631}
1632
1633static int netdev_close(struct net_device *dev)
1634{
1635 struct netdev_private *np = netdev_priv(dev);
1636 void __iomem *ioaddr = np->base;
1637 struct sk_buff *skb;
1638 int i;
1639
1640 netif_stop_queue(dev);
1641
1642 if (netif_msg_ifdown(np)) {
1643 printk(KERN_DEBUG "%s: Shutting down ethercard, status was Tx %2.2x "
1644 "Rx %4.4x Int %2.2x.\n",
1645 dev->name, ioread8(ioaddr + TxStatus),
1646 ioread32(ioaddr + RxStatus), ioread16(ioaddr + IntrStatus));
1647 printk(KERN_DEBUG "%s: Queue pointers were Tx %d / %d, Rx %d / %d.\n",
1648 dev->name, np->cur_tx, np->dirty_tx, np->cur_rx, np->dirty_rx);
1649 }
1650
1651 /* Disable interrupts by clearing the interrupt mask. */
1652 iowrite16(0x0000, ioaddr + IntrEnable);
1653
1654 /* Stop the chip's Tx and Rx processes. */
1655 iowrite16(TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl1);
1656
1657 /* Wait and kill tasklet */
1658 tasklet_kill(&np->rx_tasklet);
1659 tasklet_kill(&np->tx_tasklet);
1660
1661#ifdef __i386__
1662 if (netif_msg_hw(np)) {
1663 printk("\n"KERN_DEBUG" Tx ring at %8.8x:\n",
1664 (int)(np->tx_ring_dma));
1665 for (i = 0; i < TX_RING_SIZE; i++)
1666 printk(" #%d desc. %4.4x %8.8x %8.8x.\n",
1667 i, np->tx_ring[i].status, np->tx_ring[i].frag[0].addr,
1668 np->tx_ring[i].frag[0].length);
1669 printk("\n"KERN_DEBUG " Rx ring %8.8x:\n",
1670 (int)(np->rx_ring_dma));
1671 for (i = 0; i < /*RX_RING_SIZE*/4 ; i++) {
1672 printk(KERN_DEBUG " #%d desc. %4.4x %4.4x %8.8x\n",
1673 i, np->rx_ring[i].status, np->rx_ring[i].frag[0].addr,
1674 np->rx_ring[i].frag[0].length);
1675 }
1676 }
1677#endif /* __i386__ debugging only */
1678
1679 free_irq(dev->irq, dev);
1680
1681 del_timer_sync(&np->timer);
1682
1683 /* Free all the skbuffs in the Rx queue. */
1684 for (i = 0; i < RX_RING_SIZE; i++) {
1685 np->rx_ring[i].status = 0;
1686 np->rx_ring[i].frag[0].addr = 0xBADF00D0; /* An invalid address. */
1687 skb = np->rx_skbuff[i];
1688 if (skb) {
1689 pci_unmap_single(np->pci_dev,
1690 np->rx_ring[i].frag[0].addr, np->rx_buf_sz,
1691 PCI_DMA_FROMDEVICE);
1692 dev_kfree_skb(skb);
1693 np->rx_skbuff[i] = NULL;
1694 }
1695 }
1696 for (i = 0; i < TX_RING_SIZE; i++) {
1697 skb = np->tx_skbuff[i];
1698 if (skb) {
1699 pci_unmap_single(np->pci_dev,
1700 np->tx_ring[i].frag[0].addr, skb->len,
1701 PCI_DMA_TODEVICE);
1702 dev_kfree_skb(skb);
1703 np->tx_skbuff[i] = NULL;
1704 }
1705 }
1706
1707 return 0;
1708}
1709
1710static void __devexit sundance_remove1 (struct pci_dev *pdev)
1711{
1712 struct net_device *dev = pci_get_drvdata(pdev);
1713
1714 if (dev) {
1715 struct netdev_private *np = netdev_priv(dev);
1716
1717 unregister_netdev(dev);
1718 pci_free_consistent(pdev, RX_TOTAL_SIZE, np->rx_ring,
1719 np->rx_ring_dma);
1720 pci_free_consistent(pdev, TX_TOTAL_SIZE, np->tx_ring,
1721 np->tx_ring_dma);
1722 pci_iounmap(pdev, np->base);
1723 pci_release_regions(pdev);
1724 free_netdev(dev);
1725 pci_set_drvdata(pdev, NULL);
1726 }
1727}
1728
1729static struct pci_driver sundance_driver = {
1730 .name = DRV_NAME,
1731 .id_table = sundance_pci_tbl,
1732 .probe = sundance_probe1,
1733 .remove = __devexit_p(sundance_remove1),
1734};
1735
1736static int __init sundance_init(void)
1737{
1738/* when a module, this is printed whether or not devices are found in probe */
1739#ifdef MODULE
1740 printk(version);
1741#endif
Jeff Garzik29917622006-08-19 17:48:59 -04001742 return pci_register_driver(&sundance_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743}
1744
1745static void __exit sundance_exit(void)
1746{
1747 pci_unregister_driver(&sundance_driver);
1748}
1749
1750module_init(sundance_init);
1751module_exit(sundance_exit);
1752
1753