blob: 3a6a83d3ee1cea872823419e8642d78c49e3e622 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* epic100.c: A SMC 83c170 EPIC/100 Fast Ethernet driver for Linux. */
2/*
3 Written/copyright 1997-2001 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 This driver is for the SMC83c170/175 "EPIC" series, as used on the
13 SMC EtherPower II 9432 PCI adapter, and several CardBus cards.
14
15 The author may be reached as becker@scyld.com, or C/O
16 Scyld Computing Corporation
17 410 Severn Ave., Suite 210
18 Annapolis MD 21403
19
20 Information and updates available at
21 http://www.scyld.com/network/epic100.html
Jeff Garzik36e1e842006-06-27 07:38:33 -040022 [this link no longer provides anything useful -jgarzik]
Linus Torvalds1da177e2005-04-16 15:20:36 -070023
24 ---------------------------------------------------------------------
Jeff Garzikf3b197a2006-05-26 21:39:03 -040025
Linus Torvalds1da177e2005-04-16 15:20:36 -070026*/
27
28#define DRV_NAME "epic100"
Andy Gospodarekd5b20692006-09-11 17:39:18 -040029#define DRV_VERSION "2.1"
30#define DRV_RELDATE "Sept 11, 2006"
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
32/* The user-configurable values.
33 These may be modified when a driver module is loaded.*/
34
35static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */
36
37/* Used to pass the full-duplex flag, etc. */
38#define MAX_UNITS 8 /* More are supported, limit only on options */
39static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
40static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
41
42/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
43 Setting to > 1518 effectively disables this feature. */
44static int rx_copybreak;
45
46/* Operational parameters that are set at compile time. */
47
48/* Keep the ring sizes a power of two for operational efficiency.
49 The compiler will convert <unsigned>'%'<2^N> into a bit mask.
50 Making the Tx ring too large decreases the effectiveness of channel
51 bonding and packet priority.
52 There are no ill effects from too-large receive rings. */
53#define TX_RING_SIZE 256
54#define TX_QUEUE_LEN 240 /* Limit ring entries actually used. */
55#define RX_RING_SIZE 256
56#define TX_TOTAL_SIZE TX_RING_SIZE*sizeof(struct epic_tx_desc)
57#define RX_TOTAL_SIZE RX_RING_SIZE*sizeof(struct epic_rx_desc)
58
59/* Operational parameters that usually are not changed. */
60/* Time in jiffies before concluding the transmitter is hung. */
61#define TX_TIMEOUT (2*HZ)
62
63#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
64
65/* Bytes transferred to chip before transmission starts. */
66/* Initial threshold, increased on underflow, rounded down to 4 byte units. */
67#define TX_FIFO_THRESH 256
68#define RX_FIFO_THRESH 1 /* 0-3, 0==32, 64,96, or 3==128 bytes */
69
Linus Torvalds1da177e2005-04-16 15:20:36 -070070#include <linux/module.h>
71#include <linux/kernel.h>
72#include <linux/string.h>
73#include <linux/timer.h>
74#include <linux/errno.h>
75#include <linux/ioport.h>
76#include <linux/slab.h>
77#include <linux/interrupt.h>
78#include <linux/pci.h>
79#include <linux/delay.h>
80#include <linux/netdevice.h>
81#include <linux/etherdevice.h>
82#include <linux/skbuff.h>
83#include <linux/init.h>
84#include <linux/spinlock.h>
85#include <linux/ethtool.h>
86#include <linux/mii.h>
87#include <linux/crc32.h>
88#include <linux/bitops.h>
89#include <asm/io.h>
90#include <asm/uaccess.h>
91
92/* These identify the driver base version and may not be removed. */
93static char version[] __devinitdata =
94DRV_NAME ".c:v1.11 1/7/2001 Written by Donald Becker <becker@scyld.com>\n";
95static char version2[] __devinitdata =
96" http://www.scyld.com/network/epic100.html\n";
97static char version3[] __devinitdata =
98" (unofficial 2.4.x kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n";
99
100MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
101MODULE_DESCRIPTION("SMC 83c170 EPIC series Ethernet driver");
102MODULE_LICENSE("GPL");
103
104module_param(debug, int, 0);
105module_param(rx_copybreak, int, 0);
106module_param_array(options, int, NULL, 0);
107module_param_array(full_duplex, int, NULL, 0);
108MODULE_PARM_DESC(debug, "EPIC/100 debug level (0-5)");
109MODULE_PARM_DESC(options, "EPIC/100: Bits 0-3: media type, bit 4: full duplex");
110MODULE_PARM_DESC(rx_copybreak, "EPIC/100 copy breakpoint for copy-only-tiny-frames");
111MODULE_PARM_DESC(full_duplex, "EPIC/100 full duplex setting(s) (1)");
112
113/*
114 Theory of Operation
115
116I. Board Compatibility
117
118This device driver is designed for the SMC "EPIC/100", the SMC
119single-chip Ethernet controllers for PCI. This chip is used on
120the SMC EtherPower II boards.
121
122II. Board-specific settings
123
124PCI bus devices are configured by the system at boot time, so no jumpers
125need to be set on the board. The system BIOS will assign the
126PCI INTA signal to a (preferably otherwise unused) system IRQ line.
127Note: Kernel versions earlier than 1.3.73 do not support shared PCI
128interrupt lines.
129
130III. Driver operation
131
132IIIa. Ring buffers
133
134IVb. References
135
136http://www.smsc.com/main/datasheets/83c171.pdf
137http://www.smsc.com/main/datasheets/83c175.pdf
138http://scyld.com/expert/NWay.html
139http://www.national.com/pf/DP/DP83840A.html
140
141IVc. Errata
142
143*/
144
145
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146enum chip_capability_flags { MII_PWRDWN=1, TYPE2_INTR=2, NO_MII=4 };
147
148#define EPIC_TOTAL_SIZE 0x100
149#define USE_IO_OPS 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150
151typedef enum {
152 SMSC_83C170_0,
153 SMSC_83C170,
154 SMSC_83C175,
155} chip_t;
156
157
158struct epic_chip_info {
159 const char *name;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 int drv_flags; /* Driver use, intended as capability flags. */
161};
162
163
164/* indexed by chip_t */
Arjan van de Venf71e1302006-03-03 21:33:57 -0500165static const struct epic_chip_info pci_id_tbl[] = {
Jeff Garzik36e1e842006-06-27 07:38:33 -0400166 { "SMSC EPIC/100 83c170", TYPE2_INTR | NO_MII | MII_PWRDWN },
167 { "SMSC EPIC/100 83c170", TYPE2_INTR },
168 { "SMSC EPIC/C 83c175", TYPE2_INTR | MII_PWRDWN },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169};
170
171
172static struct pci_device_id epic_pci_tbl[] = {
173 { 0x10B8, 0x0005, 0x1092, 0x0AB4, 0, 0, SMSC_83C170_0 },
174 { 0x10B8, 0x0005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMSC_83C170 },
175 { 0x10B8, 0x0006, PCI_ANY_ID, PCI_ANY_ID,
176 PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, SMSC_83C175 },
177 { 0,}
178};
179MODULE_DEVICE_TABLE (pci, epic_pci_tbl);
180
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400181
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182#ifndef USE_IO_OPS
183#undef inb
184#undef inw
185#undef inl
186#undef outb
187#undef outw
188#undef outl
189#define inb readb
190#define inw readw
191#define inl readl
192#define outb writeb
193#define outw writew
194#define outl writel
195#endif
196
197/* Offsets to registers, using the (ugh) SMC names. */
198enum epic_registers {
199 COMMAND=0, INTSTAT=4, INTMASK=8, GENCTL=0x0C, NVCTL=0x10, EECTL=0x14,
200 PCIBurstCnt=0x18,
201 TEST1=0x1C, CRCCNT=0x20, ALICNT=0x24, MPCNT=0x28, /* Rx error counters. */
202 MIICtrl=0x30, MIIData=0x34, MIICfg=0x38,
203 LAN0=64, /* MAC address. */
204 MC0=80, /* Multicast filter table. */
205 RxCtrl=96, TxCtrl=112, TxSTAT=0x74,
206 PRxCDAR=0x84, RxSTAT=0xA4, EarlyRx=0xB0, PTxCDAR=0xC4, TxThresh=0xDC,
207};
208
209/* Interrupt register bits, using my own meaningful names. */
210enum IntrStatus {
211 TxIdle=0x40000, RxIdle=0x20000, IntrSummary=0x010000,
212 PCIBusErr170=0x7000, PCIBusErr175=0x1000, PhyEvent175=0x8000,
213 RxStarted=0x0800, RxEarlyWarn=0x0400, CntFull=0x0200, TxUnderrun=0x0100,
214 TxEmpty=0x0080, TxDone=0x0020, RxError=0x0010,
215 RxOverflow=0x0008, RxFull=0x0004, RxHeader=0x0002, RxDone=0x0001,
216};
217enum CommandBits {
218 StopRx=1, StartRx=2, TxQueued=4, RxQueued=8,
219 StopTxDMA=0x20, StopRxDMA=0x40, RestartTx=0x80,
220};
221
222#define EpicRemoved 0xffffffff /* Chip failed or removed (CardBus) */
223
224#define EpicNapiEvent (TxEmpty | TxDone | \
225 RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull)
226#define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent)
227
Arjan van de Venf71e1302006-03-03 21:33:57 -0500228static const u16 media2miictl[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0 };
231
232/* The EPIC100 Rx and Tx buffer descriptors. */
233
234struct epic_tx_desc {
235 u32 txstatus;
236 u32 bufaddr;
237 u32 buflength;
238 u32 next;
239};
240
241struct epic_rx_desc {
242 u32 rxstatus;
243 u32 bufaddr;
244 u32 buflength;
245 u32 next;
246};
247
248enum desc_status_bits {
249 DescOwn=0x8000,
250};
251
252#define PRIV_ALIGN 15 /* Required alignment mask */
253struct epic_private {
254 struct epic_rx_desc *rx_ring;
255 struct epic_tx_desc *tx_ring;
256 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
257 struct sk_buff* tx_skbuff[TX_RING_SIZE];
258 /* The addresses of receive-in-place skbuffs. */
259 struct sk_buff* rx_skbuff[RX_RING_SIZE];
260
261 dma_addr_t tx_ring_dma;
262 dma_addr_t rx_ring_dma;
263
264 /* Ring pointers. */
265 spinlock_t lock; /* Group with Tx control cache line. */
266 spinlock_t napi_lock;
267 unsigned int reschedule_in_poll;
268 unsigned int cur_tx, dirty_tx;
269
270 unsigned int cur_rx, dirty_rx;
271 u32 irq_mask;
272 unsigned int rx_buf_sz; /* Based on MTU+slack. */
273
274 struct pci_dev *pci_dev; /* PCI bus location. */
275 int chip_id, chip_flags;
276
277 struct net_device_stats stats;
278 struct timer_list timer; /* Media selection timer. */
279 int tx_threshold;
280 unsigned char mc_filter[8];
281 signed char phys[4]; /* MII device addresses. */
282 u16 advertising; /* NWay media advertisement */
283 int mii_phy_cnt;
284 struct mii_if_info mii;
285 unsigned int tx_full:1; /* The Tx queue is full. */
286 unsigned int default_port:4; /* Last dev->if_port value. */
287};
288
289static int epic_open(struct net_device *dev);
290static int read_eeprom(long ioaddr, int location);
291static int mdio_read(struct net_device *dev, int phy_id, int location);
292static void mdio_write(struct net_device *dev, int phy_id, int loc, int val);
293static void epic_restart(struct net_device *dev);
294static void epic_timer(unsigned long data);
295static void epic_tx_timeout(struct net_device *dev);
296static void epic_init_ring(struct net_device *dev);
297static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev);
298static int epic_rx(struct net_device *dev, int budget);
299static int epic_poll(struct net_device *dev, int *budget);
David Howells7d12e782006-10-05 14:55:46 +0100300static irqreturn_t epic_interrupt(int irq, void *dev_instance);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
Jeff Garzik7282d492006-09-13 14:30:00 -0400302static const struct ethtool_ops netdev_ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303static int epic_close(struct net_device *dev);
304static struct net_device_stats *epic_get_stats(struct net_device *dev);
305static void set_rx_mode(struct net_device *dev);
306
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400307
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309static int __devinit epic_init_one (struct pci_dev *pdev,
310 const struct pci_device_id *ent)
311{
312 static int card_idx = -1;
313 long ioaddr;
314 int chip_idx = (int) ent->driver_data;
315 int irq;
316 struct net_device *dev;
317 struct epic_private *ep;
318 int i, ret, option = 0, duplex = 0;
319 void *ring_space;
320 dma_addr_t ring_dma;
321
322/* when built into the kernel, we only print version if device is found */
323#ifndef MODULE
324 static int printed_version;
325 if (!printed_version++)
326 printk (KERN_INFO "%s" KERN_INFO "%s" KERN_INFO "%s",
327 version, version2, version3);
328#endif
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400329
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 card_idx++;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400331
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332 ret = pci_enable_device(pdev);
333 if (ret)
334 goto out;
335 irq = pdev->irq;
336
Jeff Garzik36e1e842006-06-27 07:38:33 -0400337 if (pci_resource_len(pdev, 0) < EPIC_TOTAL_SIZE) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400338 dev_err(&pdev->dev, "no PCI region space\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 ret = -ENODEV;
340 goto err_out_disable;
341 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400342
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 pci_set_master(pdev);
344
345 ret = pci_request_regions(pdev, DRV_NAME);
346 if (ret < 0)
347 goto err_out_disable;
348
349 ret = -ENOMEM;
350
351 dev = alloc_etherdev(sizeof (*ep));
352 if (!dev) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400353 dev_err(&pdev->dev, "no memory for eth device\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 goto err_out_free_res;
355 }
356 SET_MODULE_OWNER(dev);
357 SET_NETDEV_DEV(dev, &pdev->dev);
358
359#ifdef USE_IO_OPS
360 ioaddr = pci_resource_start (pdev, 0);
361#else
362 ioaddr = pci_resource_start (pdev, 1);
363 ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1));
364 if (!ioaddr) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400365 dev_err(&pdev->dev, "ioremap failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 goto err_out_free_netdev;
367 }
368#endif
369
370 pci_set_drvdata(pdev, dev);
371 ep = dev->priv;
372 ep->mii.dev = dev;
373 ep->mii.mdio_read = mdio_read;
374 ep->mii.mdio_write = mdio_write;
375 ep->mii.phy_id_mask = 0x1f;
376 ep->mii.reg_num_mask = 0x1f;
377
378 ring_space = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma);
379 if (!ring_space)
380 goto err_out_iounmap;
381 ep->tx_ring = (struct epic_tx_desc *)ring_space;
382 ep->tx_ring_dma = ring_dma;
383
384 ring_space = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma);
385 if (!ring_space)
386 goto err_out_unmap_tx;
387 ep->rx_ring = (struct epic_rx_desc *)ring_space;
388 ep->rx_ring_dma = ring_dma;
389
390 if (dev->mem_start) {
391 option = dev->mem_start;
392 duplex = (dev->mem_start & 16) ? 1 : 0;
393 } else if (card_idx >= 0 && card_idx < MAX_UNITS) {
394 if (options[card_idx] >= 0)
395 option = options[card_idx];
396 if (full_duplex[card_idx] >= 0)
397 duplex = full_duplex[card_idx];
398 }
399
400 dev->base_addr = ioaddr;
401 dev->irq = irq;
402
403 spin_lock_init(&ep->lock);
404 spin_lock_init(&ep->napi_lock);
405 ep->reschedule_in_poll = 0;
406
407 /* Bring the chip out of low-power mode. */
408 outl(0x4200, ioaddr + GENCTL);
409 /* Magic?! If we don't set this bit the MII interface won't work. */
410 /* This magic is documented in SMSC app note 7.15 */
411 for (i = 16; i > 0; i--)
412 outl(0x0008, ioaddr + TEST1);
413
414 /* Turn on the MII transceiver. */
415 outl(0x12, ioaddr + MIICfg);
416 if (chip_idx == 1)
417 outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
418 outl(0x0200, ioaddr + GENCTL);
419
420 /* Note: the '175 does not have a serial EEPROM. */
421 for (i = 0; i < 3; i++)
422 ((u16 *)dev->dev_addr)[i] = le16_to_cpu(inw(ioaddr + LAN0 + i*4));
423
424 if (debug > 2) {
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400425 dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 for (i = 0; i < 64; i++)
427 printk(" %4.4x%s", read_eeprom(ioaddr, i),
428 i % 16 == 15 ? "\n" : "");
429 }
430
431 ep->pci_dev = pdev;
432 ep->chip_id = chip_idx;
433 ep->chip_flags = pci_id_tbl[chip_idx].drv_flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400434 ep->irq_mask =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 (ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
436 | CntFull | TxUnderrun | EpicNapiEvent;
437
438 /* Find the connected MII xcvrs.
439 Doing this in open() would allow detecting external xcvrs later, but
440 takes much time and no cards have external MII. */
441 {
442 int phy, phy_idx = 0;
443 for (phy = 1; phy < 32 && phy_idx < sizeof(ep->phys); phy++) {
444 int mii_status = mdio_read(dev, phy, MII_BMSR);
445 if (mii_status != 0xffff && mii_status != 0x0000) {
446 ep->phys[phy_idx++] = phy;
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400447 dev_info(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400448 "MII transceiver #%d control "
449 "%4.4x status %4.4x.\n",
450 phy, mdio_read(dev, phy, 0), mii_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 }
452 }
453 ep->mii_phy_cnt = phy_idx;
454 if (phy_idx != 0) {
455 phy = ep->phys[0];
456 ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE);
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400457 dev_info(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400458 "Autonegotiation advertising %4.4x link "
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 "partner %4.4x.\n",
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400460 ep->mii.advertising, mdio_read(dev, phy, 5));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 } else if ( ! (ep->chip_flags & NO_MII)) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400462 dev_warn(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400463 "***WARNING***: No MII transceiver found!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 /* Use the known PHY address of the EPII. */
465 ep->phys[0] = 3;
466 }
467 ep->mii.phy_id = ep->phys[0];
468 }
469
470 /* Turn off the MII xcvr (175 only!), leave the chip in low-power mode. */
471 if (ep->chip_flags & MII_PWRDWN)
472 outl(inl(ioaddr + NVCTL) & ~0x483C, ioaddr + NVCTL);
473 outl(0x0008, ioaddr + GENCTL);
474
475 /* The lower four bits are the media type. */
476 if (duplex) {
477 ep->mii.force_media = ep->mii.full_duplex = 1;
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400478 dev_info(&pdev->dev, "Forced full duplex requested.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 }
480 dev->if_port = ep->default_port = option;
481
482 /* The Epic-specific entries in the device structure. */
483 dev->open = &epic_open;
484 dev->hard_start_xmit = &epic_start_xmit;
485 dev->stop = &epic_close;
486 dev->get_stats = &epic_get_stats;
487 dev->set_multicast_list = &set_rx_mode;
488 dev->do_ioctl = &netdev_ioctl;
489 dev->ethtool_ops = &netdev_ethtool_ops;
490 dev->watchdog_timeo = TX_TIMEOUT;
491 dev->tx_timeout = &epic_tx_timeout;
492 dev->poll = epic_poll;
493 dev->weight = 64;
494
495 ret = register_netdev(dev);
496 if (ret < 0)
497 goto err_out_unmap_rx;
498
499 printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ",
500 dev->name, pci_id_tbl[chip_idx].name, ioaddr, dev->irq);
501 for (i = 0; i < 5; i++)
502 printk("%2.2x:", dev->dev_addr[i]);
503 printk("%2.2x.\n", dev->dev_addr[i]);
504
505out:
506 return ret;
507
508err_out_unmap_rx:
509 pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma);
510err_out_unmap_tx:
511 pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma);
512err_out_iounmap:
513#ifndef USE_IO_OPS
514 iounmap(ioaddr);
515err_out_free_netdev:
516#endif
517 free_netdev(dev);
518err_out_free_res:
519 pci_release_regions(pdev);
520err_out_disable:
521 pci_disable_device(pdev);
522 goto out;
523}
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400524
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525/* Serial EEPROM section. */
526
527/* EEPROM_Ctrl bits. */
528#define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */
529#define EE_CS 0x02 /* EEPROM chip select. */
530#define EE_DATA_WRITE 0x08 /* EEPROM chip data in. */
531#define EE_WRITE_0 0x01
532#define EE_WRITE_1 0x09
533#define EE_DATA_READ 0x10 /* EEPROM chip data out. */
534#define EE_ENB (0x0001 | EE_CS)
535
536/* Delay between EEPROM clock transitions.
537 This serves to flush the operation to the PCI bus.
538 */
539
540#define eeprom_delay() inl(ee_addr)
541
542/* The EEPROM commands include the alway-set leading bit. */
543#define EE_WRITE_CMD (5 << 6)
544#define EE_READ64_CMD (6 << 6)
545#define EE_READ256_CMD (6 << 8)
546#define EE_ERASE_CMD (7 << 6)
547
548static void epic_disable_int(struct net_device *dev, struct epic_private *ep)
549{
550 long ioaddr = dev->base_addr;
551
552 outl(0x00000000, ioaddr + INTMASK);
553}
554
555static inline void __epic_pci_commit(long ioaddr)
556{
557#ifndef USE_IO_OPS
558 inl(ioaddr + INTMASK);
559#endif
560}
561
562static inline void epic_napi_irq_off(struct net_device *dev,
563 struct epic_private *ep)
564{
565 long ioaddr = dev->base_addr;
566
567 outl(ep->irq_mask & ~EpicNapiEvent, ioaddr + INTMASK);
568 __epic_pci_commit(ioaddr);
569}
570
571static inline void epic_napi_irq_on(struct net_device *dev,
572 struct epic_private *ep)
573{
574 long ioaddr = dev->base_addr;
575
576 /* No need to commit possible posted write */
577 outl(ep->irq_mask | EpicNapiEvent, ioaddr + INTMASK);
578}
579
580static int __devinit read_eeprom(long ioaddr, int location)
581{
582 int i;
583 int retval = 0;
584 long ee_addr = ioaddr + EECTL;
585 int read_cmd = location |
586 (inl(ee_addr) & 0x40 ? EE_READ64_CMD : EE_READ256_CMD);
587
588 outl(EE_ENB & ~EE_CS, ee_addr);
589 outl(EE_ENB, ee_addr);
590
591 /* Shift the read command bits out. */
592 for (i = 12; i >= 0; i--) {
593 short dataval = (read_cmd & (1 << i)) ? EE_WRITE_1 : EE_WRITE_0;
594 outl(EE_ENB | dataval, ee_addr);
595 eeprom_delay();
596 outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
597 eeprom_delay();
598 }
599 outl(EE_ENB, ee_addr);
600
601 for (i = 16; i > 0; i--) {
602 outl(EE_ENB | EE_SHIFT_CLK, ee_addr);
603 eeprom_delay();
604 retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);
605 outl(EE_ENB, ee_addr);
606 eeprom_delay();
607 }
608
609 /* Terminate the EEPROM access. */
610 outl(EE_ENB & ~EE_CS, ee_addr);
611 return retval;
612}
613
614#define MII_READOP 1
615#define MII_WRITEOP 2
616static int mdio_read(struct net_device *dev, int phy_id, int location)
617{
618 long ioaddr = dev->base_addr;
619 int read_cmd = (phy_id << 9) | (location << 4) | MII_READOP;
620 int i;
621
622 outl(read_cmd, ioaddr + MIICtrl);
623 /* Typical operation takes 25 loops. */
624 for (i = 400; i > 0; i--) {
625 barrier();
626 if ((inl(ioaddr + MIICtrl) & MII_READOP) == 0) {
627 /* Work around read failure bug. */
628 if (phy_id == 1 && location < 6
629 && inw(ioaddr + MIIData) == 0xffff) {
630 outl(read_cmd, ioaddr + MIICtrl);
631 continue;
632 }
633 return inw(ioaddr + MIIData);
634 }
635 }
636 return 0xffff;
637}
638
639static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
640{
641 long ioaddr = dev->base_addr;
642 int i;
643
644 outw(value, ioaddr + MIIData);
645 outl((phy_id << 9) | (loc << 4) | MII_WRITEOP, ioaddr + MIICtrl);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400646 for (i = 10000; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647 barrier();
648 if ((inl(ioaddr + MIICtrl) & MII_WRITEOP) == 0)
649 break;
650 }
651 return;
652}
653
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400654
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655static int epic_open(struct net_device *dev)
656{
657 struct epic_private *ep = dev->priv;
658 long ioaddr = dev->base_addr;
659 int i;
660 int retval;
661
662 /* Soft reset the chip. */
663 outl(0x4001, ioaddr + GENCTL);
664
Thomas Gleixner1fb9df52006-07-01 19:29:39 -0700665 if ((retval = request_irq(dev->irq, &epic_interrupt, IRQF_SHARED, dev->name, dev)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 return retval;
667
668 epic_init_ring(dev);
669
670 outl(0x4000, ioaddr + GENCTL);
671 /* This magic is documented in SMSC app note 7.15 */
672 for (i = 16; i > 0; i--)
673 outl(0x0008, ioaddr + TEST1);
674
675 /* Pull the chip out of low-power mode, enable interrupts, and set for
676 PCI read multiple. The MIIcfg setting and strange write order are
677 required by the details of which bits are reset and the transceiver
678 wiring on the Ositech CardBus card.
679 */
680#if 0
681 outl(dev->if_port == 1 ? 0x13 : 0x12, ioaddr + MIICfg);
682#endif
683 if (ep->chip_flags & MII_PWRDWN)
684 outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
685
686#if defined(__powerpc__) || defined(__sparc__) /* Big endian */
687 outl(0x4432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
688 inl(ioaddr + GENCTL);
689 outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
690#else
691 outl(0x4412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
692 inl(ioaddr + GENCTL);
693 outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
694#endif
695
696 udelay(20); /* Looks like EPII needs that if you want reliable RX init. FIXME: pci posting bug? */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400697
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 for (i = 0; i < 3; i++)
699 outl(cpu_to_le16(((u16*)dev->dev_addr)[i]), ioaddr + LAN0 + i*4);
700
701 ep->tx_threshold = TX_FIFO_THRESH;
702 outl(ep->tx_threshold, ioaddr + TxThresh);
703
704 if (media2miictl[dev->if_port & 15]) {
705 if (ep->mii_phy_cnt)
706 mdio_write(dev, ep->phys[0], MII_BMCR, media2miictl[dev->if_port&15]);
707 if (dev->if_port == 1) {
708 if (debug > 1)
709 printk(KERN_INFO "%s: Using the 10base2 transceiver, MII "
710 "status %4.4x.\n",
711 dev->name, mdio_read(dev, ep->phys[0], MII_BMSR));
712 }
713 } else {
714 int mii_lpa = mdio_read(dev, ep->phys[0], MII_LPA);
715 if (mii_lpa != 0xffff) {
716 if ((mii_lpa & LPA_100FULL) || (mii_lpa & 0x01C0) == LPA_10FULL)
717 ep->mii.full_duplex = 1;
718 else if (! (mii_lpa & LPA_LPACK))
719 mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART);
720 if (debug > 1)
721 printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d"
722 " register read of %4.4x.\n", dev->name,
723 ep->mii.full_duplex ? "full" : "half",
724 ep->phys[0], mii_lpa);
725 }
726 }
727
728 outl(ep->mii.full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
729 outl(ep->rx_ring_dma, ioaddr + PRxCDAR);
730 outl(ep->tx_ring_dma, ioaddr + PTxCDAR);
731
732 /* Start the chip's Rx process. */
733 set_rx_mode(dev);
734 outl(StartRx | RxQueued, ioaddr + COMMAND);
735
736 netif_start_queue(dev);
737
738 /* Enable interrupts by setting the interrupt mask. */
739 outl((ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400740 | CntFull | TxUnderrun
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 | RxError | RxHeader | EpicNapiEvent, ioaddr + INTMASK);
742
743 if (debug > 1)
744 printk(KERN_DEBUG "%s: epic_open() ioaddr %lx IRQ %d status %4.4x "
745 "%s-duplex.\n",
746 dev->name, ioaddr, dev->irq, (int)inl(ioaddr + GENCTL),
747 ep->mii.full_duplex ? "full" : "half");
748
749 /* Set the timer to switch to check for link beat and perhaps switch
750 to an alternate media type. */
751 init_timer(&ep->timer);
752 ep->timer.expires = jiffies + 3*HZ;
753 ep->timer.data = (unsigned long)dev;
754 ep->timer.function = &epic_timer; /* timer handler */
755 add_timer(&ep->timer);
756
757 return 0;
758}
759
760/* Reset the chip to recover from a PCI transaction error.
761 This may occur at interrupt time. */
762static void epic_pause(struct net_device *dev)
763{
764 long ioaddr = dev->base_addr;
765 struct epic_private *ep = dev->priv;
766
767 netif_stop_queue (dev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400768
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 /* Disable interrupts by clearing the interrupt mask. */
770 outl(0x00000000, ioaddr + INTMASK);
771 /* Stop the chip's Tx and Rx DMA processes. */
772 outw(StopRx | StopTxDMA | StopRxDMA, ioaddr + COMMAND);
773
774 /* Update the error counts. */
775 if (inw(ioaddr + COMMAND) != 0xffff) {
776 ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
777 ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
778 ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
779 }
780
781 /* Remove the packets on the Rx queue. */
782 epic_rx(dev, RX_RING_SIZE);
783}
784
785static void epic_restart(struct net_device *dev)
786{
787 long ioaddr = dev->base_addr;
788 struct epic_private *ep = dev->priv;
789 int i;
790
791 /* Soft reset the chip. */
792 outl(0x4001, ioaddr + GENCTL);
793
794 printk(KERN_DEBUG "%s: Restarting the EPIC chip, Rx %d/%d Tx %d/%d.\n",
795 dev->name, ep->cur_rx, ep->dirty_rx, ep->dirty_tx, ep->cur_tx);
796 udelay(1);
797
798 /* This magic is documented in SMSC app note 7.15 */
799 for (i = 16; i > 0; i--)
800 outl(0x0008, ioaddr + TEST1);
801
802#if defined(__powerpc__) || defined(__sparc__) /* Big endian */
803 outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
804#else
805 outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
806#endif
807 outl(dev->if_port == 1 ? 0x13 : 0x12, ioaddr + MIICfg);
808 if (ep->chip_flags & MII_PWRDWN)
809 outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
810
811 for (i = 0; i < 3; i++)
812 outl(cpu_to_le16(((u16*)dev->dev_addr)[i]), ioaddr + LAN0 + i*4);
813
814 ep->tx_threshold = TX_FIFO_THRESH;
815 outl(ep->tx_threshold, ioaddr + TxThresh);
816 outl(ep->mii.full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
817 outl(ep->rx_ring_dma + (ep->cur_rx%RX_RING_SIZE)*
818 sizeof(struct epic_rx_desc), ioaddr + PRxCDAR);
819 outl(ep->tx_ring_dma + (ep->dirty_tx%TX_RING_SIZE)*
820 sizeof(struct epic_tx_desc), ioaddr + PTxCDAR);
821
822 /* Start the chip's Rx process. */
823 set_rx_mode(dev);
824 outl(StartRx | RxQueued, ioaddr + COMMAND);
825
826 /* Enable interrupts by setting the interrupt mask. */
827 outl((ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
828 | CntFull | TxUnderrun
829 | RxError | RxHeader | EpicNapiEvent, ioaddr + INTMASK);
830
831 printk(KERN_DEBUG "%s: epic_restart() done, cmd status %4.4x, ctl %4.4x"
832 " interrupt %4.4x.\n",
833 dev->name, (int)inl(ioaddr + COMMAND), (int)inl(ioaddr + GENCTL),
834 (int)inl(ioaddr + INTSTAT));
835 return;
836}
837
838static void check_media(struct net_device *dev)
839{
840 struct epic_private *ep = dev->priv;
841 long ioaddr = dev->base_addr;
842 int mii_lpa = ep->mii_phy_cnt ? mdio_read(dev, ep->phys[0], MII_LPA) : 0;
843 int negotiated = mii_lpa & ep->mii.advertising;
844 int duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040;
845
846 if (ep->mii.force_media)
847 return;
848 if (mii_lpa == 0xffff) /* Bogus read */
849 return;
850 if (ep->mii.full_duplex != duplex) {
851 ep->mii.full_duplex = duplex;
852 printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link"
853 " partner capability of %4.4x.\n", dev->name,
854 ep->mii.full_duplex ? "full" : "half", ep->phys[0], mii_lpa);
855 outl(ep->mii.full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
856 }
857}
858
859static void epic_timer(unsigned long data)
860{
861 struct net_device *dev = (struct net_device *)data;
862 struct epic_private *ep = dev->priv;
863 long ioaddr = dev->base_addr;
864 int next_tick = 5*HZ;
865
866 if (debug > 3) {
867 printk(KERN_DEBUG "%s: Media monitor tick, Tx status %8.8x.\n",
868 dev->name, (int)inl(ioaddr + TxSTAT));
869 printk(KERN_DEBUG "%s: Other registers are IntMask %4.4x "
870 "IntStatus %4.4x RxStatus %4.4x.\n",
871 dev->name, (int)inl(ioaddr + INTMASK),
872 (int)inl(ioaddr + INTSTAT), (int)inl(ioaddr + RxSTAT));
873 }
874
875 check_media(dev);
876
877 ep->timer.expires = jiffies + next_tick;
878 add_timer(&ep->timer);
879}
880
881static void epic_tx_timeout(struct net_device *dev)
882{
883 struct epic_private *ep = dev->priv;
884 long ioaddr = dev->base_addr;
885
886 if (debug > 0) {
887 printk(KERN_WARNING "%s: Transmit timeout using MII device, "
888 "Tx status %4.4x.\n",
889 dev->name, (int)inw(ioaddr + TxSTAT));
890 if (debug > 1) {
891 printk(KERN_DEBUG "%s: Tx indices: dirty_tx %d, cur_tx %d.\n",
892 dev->name, ep->dirty_tx, ep->cur_tx);
893 }
894 }
895 if (inw(ioaddr + TxSTAT) & 0x10) { /* Tx FIFO underflow. */
896 ep->stats.tx_fifo_errors++;
897 outl(RestartTx, ioaddr + COMMAND);
898 } else {
899 epic_restart(dev);
900 outl(TxQueued, dev->base_addr + COMMAND);
901 }
902
903 dev->trans_start = jiffies;
904 ep->stats.tx_errors++;
905 if (!ep->tx_full)
906 netif_wake_queue(dev);
907}
908
909/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
910static void epic_init_ring(struct net_device *dev)
911{
912 struct epic_private *ep = dev->priv;
913 int i;
914
915 ep->tx_full = 0;
916 ep->dirty_tx = ep->cur_tx = 0;
917 ep->cur_rx = ep->dirty_rx = 0;
918 ep->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
919
920 /* Initialize all Rx descriptors. */
921 for (i = 0; i < RX_RING_SIZE; i++) {
922 ep->rx_ring[i].rxstatus = 0;
923 ep->rx_ring[i].buflength = cpu_to_le32(ep->rx_buf_sz);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400924 ep->rx_ring[i].next = ep->rx_ring_dma +
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 (i+1)*sizeof(struct epic_rx_desc);
926 ep->rx_skbuff[i] = NULL;
927 }
928 /* Mark the last entry as wrapping the ring. */
929 ep->rx_ring[i-1].next = ep->rx_ring_dma;
930
931 /* Fill in the Rx buffers. Handle allocation failure gracefully. */
932 for (i = 0; i < RX_RING_SIZE; i++) {
933 struct sk_buff *skb = dev_alloc_skb(ep->rx_buf_sz);
934 ep->rx_skbuff[i] = skb;
935 if (skb == NULL)
936 break;
937 skb->dev = dev; /* Mark as being used by this device. */
938 skb_reserve(skb, 2); /* 16 byte align the IP header. */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400939 ep->rx_ring[i].bufaddr = pci_map_single(ep->pci_dev,
David S. Miller689be432005-06-28 15:25:31 -0700940 skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 ep->rx_ring[i].rxstatus = cpu_to_le32(DescOwn);
942 }
943 ep->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
944
945 /* The Tx buffer descriptor is filled in as needed, but we
946 do need to clear the ownership bit. */
947 for (i = 0; i < TX_RING_SIZE; i++) {
948 ep->tx_skbuff[i] = NULL;
949 ep->tx_ring[i].txstatus = 0x0000;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400950 ep->tx_ring[i].next = ep->tx_ring_dma +
Linus Torvalds1da177e2005-04-16 15:20:36 -0700951 (i+1)*sizeof(struct epic_tx_desc);
952 }
953 ep->tx_ring[i-1].next = ep->tx_ring_dma;
954 return;
955}
956
957static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev)
958{
959 struct epic_private *ep = dev->priv;
960 int entry, free_count;
961 u32 ctrl_word;
962 unsigned long flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400963
Herbert Xu5b057c62006-06-23 02:06:41 -0700964 if (skb_padto(skb, ETH_ZLEN))
965 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966
967 /* Caution: the write order is important here, set the field with the
968 "ownership" bit last. */
969
970 /* Calculate the next Tx descriptor entry. */
971 spin_lock_irqsave(&ep->lock, flags);
972 free_count = ep->cur_tx - ep->dirty_tx;
973 entry = ep->cur_tx % TX_RING_SIZE;
974
975 ep->tx_skbuff[entry] = skb;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400976 ep->tx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 skb->len, PCI_DMA_TODEVICE);
978 if (free_count < TX_QUEUE_LEN/2) {/* Typical path */
979 ctrl_word = cpu_to_le32(0x100000); /* No interrupt */
980 } else if (free_count == TX_QUEUE_LEN/2) {
981 ctrl_word = cpu_to_le32(0x140000); /* Tx-done intr. */
982 } else if (free_count < TX_QUEUE_LEN - 1) {
983 ctrl_word = cpu_to_le32(0x100000); /* No Tx-done intr. */
984 } else {
985 /* Leave room for an additional entry. */
986 ctrl_word = cpu_to_le32(0x140000); /* Tx-done intr. */
987 ep->tx_full = 1;
988 }
989 ep->tx_ring[entry].buflength = ctrl_word | cpu_to_le32(skb->len);
990 ep->tx_ring[entry].txstatus =
991 ((skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN) << 16)
992 | cpu_to_le32(DescOwn);
993
994 ep->cur_tx++;
995 if (ep->tx_full)
996 netif_stop_queue(dev);
997
998 spin_unlock_irqrestore(&ep->lock, flags);
999 /* Trigger an immediate transmit demand. */
1000 outl(TxQueued, dev->base_addr + COMMAND);
1001
1002 dev->trans_start = jiffies;
1003 if (debug > 4)
1004 printk(KERN_DEBUG "%s: Queued Tx packet size %d to slot %d, "
1005 "flag %2.2x Tx status %8.8x.\n",
1006 dev->name, (int)skb->len, entry, ctrl_word,
1007 (int)inl(dev->base_addr + TxSTAT));
1008
1009 return 0;
1010}
1011
1012static void epic_tx_error(struct net_device *dev, struct epic_private *ep,
1013 int status)
1014{
1015 struct net_device_stats *stats = &ep->stats;
1016
1017#ifndef final_version
1018 /* There was an major error, log it. */
1019 if (debug > 1)
1020 printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
1021 dev->name, status);
1022#endif
1023 stats->tx_errors++;
1024 if (status & 0x1050)
1025 stats->tx_aborted_errors++;
1026 if (status & 0x0008)
1027 stats->tx_carrier_errors++;
1028 if (status & 0x0040)
1029 stats->tx_window_errors++;
1030 if (status & 0x0010)
1031 stats->tx_fifo_errors++;
1032}
1033
1034static void epic_tx(struct net_device *dev, struct epic_private *ep)
1035{
1036 unsigned int dirty_tx, cur_tx;
1037
1038 /*
1039 * Note: if this lock becomes a problem we can narrow the locked
1040 * region at the cost of occasionally grabbing the lock more times.
1041 */
1042 cur_tx = ep->cur_tx;
1043 for (dirty_tx = ep->dirty_tx; cur_tx - dirty_tx > 0; dirty_tx++) {
1044 struct sk_buff *skb;
1045 int entry = dirty_tx % TX_RING_SIZE;
1046 int txstatus = le32_to_cpu(ep->tx_ring[entry].txstatus);
1047
1048 if (txstatus & DescOwn)
1049 break; /* It still hasn't been Txed */
1050
1051 if (likely(txstatus & 0x0001)) {
1052 ep->stats.collisions += (txstatus >> 8) & 15;
1053 ep->stats.tx_packets++;
1054 ep->stats.tx_bytes += ep->tx_skbuff[entry]->len;
1055 } else
1056 epic_tx_error(dev, ep, txstatus);
1057
1058 /* Free the original skb. */
1059 skb = ep->tx_skbuff[entry];
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001060 pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 skb->len, PCI_DMA_TODEVICE);
1062 dev_kfree_skb_irq(skb);
1063 ep->tx_skbuff[entry] = NULL;
1064 }
1065
1066#ifndef final_version
1067 if (cur_tx - dirty_tx > TX_RING_SIZE) {
1068 printk(KERN_WARNING
1069 "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
1070 dev->name, dirty_tx, cur_tx, ep->tx_full);
1071 dirty_tx += TX_RING_SIZE;
1072 }
1073#endif
1074 ep->dirty_tx = dirty_tx;
1075 if (ep->tx_full && cur_tx - dirty_tx < TX_QUEUE_LEN - 4) {
1076 /* The ring is no longer full, allow new TX entries. */
1077 ep->tx_full = 0;
1078 netif_wake_queue(dev);
1079 }
1080}
1081
1082/* The interrupt handler does all of the Rx thread work and cleans up
1083 after the Tx thread. */
David Howells7d12e782006-10-05 14:55:46 +01001084static irqreturn_t epic_interrupt(int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085{
1086 struct net_device *dev = dev_instance;
1087 struct epic_private *ep = dev->priv;
1088 long ioaddr = dev->base_addr;
1089 unsigned int handled = 0;
1090 int status;
1091
1092 status = inl(ioaddr + INTSTAT);
1093 /* Acknowledge all of the current interrupt sources ASAP. */
1094 outl(status & EpicNormalEvent, ioaddr + INTSTAT);
1095
1096 if (debug > 4) {
1097 printk(KERN_DEBUG "%s: Interrupt, status=%#8.8x new "
1098 "intstat=%#8.8x.\n", dev->name, status,
1099 (int)inl(ioaddr + INTSTAT));
1100 }
1101
1102 if ((status & IntrSummary) == 0)
1103 goto out;
1104
1105 handled = 1;
1106
1107 if ((status & EpicNapiEvent) && !ep->reschedule_in_poll) {
1108 spin_lock(&ep->napi_lock);
1109 if (netif_rx_schedule_prep(dev)) {
1110 epic_napi_irq_off(dev, ep);
1111 __netif_rx_schedule(dev);
1112 } else
1113 ep->reschedule_in_poll++;
1114 spin_unlock(&ep->napi_lock);
1115 }
1116 status &= ~EpicNapiEvent;
1117
1118 /* Check uncommon events all at once. */
1119 if (status & (CntFull | TxUnderrun | PCIBusErr170 | PCIBusErr175)) {
1120 if (status == EpicRemoved)
1121 goto out;
1122
1123 /* Always update the error counts to avoid overhead later. */
1124 ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
1125 ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
1126 ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
1127
1128 if (status & TxUnderrun) { /* Tx FIFO underflow. */
1129 ep->stats.tx_fifo_errors++;
1130 outl(ep->tx_threshold += 128, ioaddr + TxThresh);
1131 /* Restart the transmit process. */
1132 outl(RestartTx, ioaddr + COMMAND);
1133 }
1134 if (status & PCIBusErr170) {
1135 printk(KERN_ERR "%s: PCI Bus Error! status %4.4x.\n",
1136 dev->name, status);
1137 epic_pause(dev);
1138 epic_restart(dev);
1139 }
1140 /* Clear all error sources. */
1141 outl(status & 0x7f18, ioaddr + INTSTAT);
1142 }
1143
1144out:
1145 if (debug > 3) {
1146 printk(KERN_DEBUG "%s: exit interrupt, intr_status=%#4.4x.\n",
1147 dev->name, status);
1148 }
1149
1150 return IRQ_RETVAL(handled);
1151}
1152
1153static int epic_rx(struct net_device *dev, int budget)
1154{
1155 struct epic_private *ep = dev->priv;
1156 int entry = ep->cur_rx % RX_RING_SIZE;
1157 int rx_work_limit = ep->dirty_rx + RX_RING_SIZE - ep->cur_rx;
1158 int work_done = 0;
1159
1160 if (debug > 4)
1161 printk(KERN_DEBUG " In epic_rx(), entry %d %8.8x.\n", entry,
1162 ep->rx_ring[entry].rxstatus);
1163
1164 if (rx_work_limit > budget)
1165 rx_work_limit = budget;
1166
1167 /* If we own the next entry, it's a new packet. Send it up. */
1168 while ((ep->rx_ring[entry].rxstatus & cpu_to_le32(DescOwn)) == 0) {
1169 int status = le32_to_cpu(ep->rx_ring[entry].rxstatus);
1170
1171 if (debug > 4)
1172 printk(KERN_DEBUG " epic_rx() status was %8.8x.\n", status);
1173 if (--rx_work_limit < 0)
1174 break;
1175 if (status & 0x2006) {
1176 if (debug > 2)
1177 printk(KERN_DEBUG "%s: epic_rx() error status was %8.8x.\n",
1178 dev->name, status);
1179 if (status & 0x2000) {
1180 printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
1181 "multiple buffers, status %4.4x!\n", dev->name, status);
1182 ep->stats.rx_length_errors++;
1183 } else if (status & 0x0006)
1184 /* Rx Frame errors are counted in hardware. */
1185 ep->stats.rx_errors++;
1186 } else {
1187 /* Malloc up new buffer, compatible with net-2e. */
1188 /* Omit the four octet CRC from the length. */
1189 short pkt_len = (status >> 16) - 4;
1190 struct sk_buff *skb;
1191
1192 if (pkt_len > PKT_BUF_SZ - 4) {
1193 printk(KERN_ERR "%s: Oversized Ethernet frame, status %x "
1194 "%d bytes.\n",
1195 dev->name, status, pkt_len);
1196 pkt_len = 1514;
1197 }
1198 /* Check if the packet is long enough to accept without copying
1199 to a minimally-sized skbuff. */
1200 if (pkt_len < rx_copybreak
1201 && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
1202 skb->dev = dev;
1203 skb_reserve(skb, 2); /* 16 byte align the IP header */
1204 pci_dma_sync_single_for_cpu(ep->pci_dev,
1205 ep->rx_ring[entry].bufaddr,
1206 ep->rx_buf_sz,
1207 PCI_DMA_FROMDEVICE);
David S. Miller689be432005-06-28 15:25:31 -07001208 eth_copy_and_sum(skb, ep->rx_skbuff[entry]->data, pkt_len, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 skb_put(skb, pkt_len);
1210 pci_dma_sync_single_for_device(ep->pci_dev,
1211 ep->rx_ring[entry].bufaddr,
1212 ep->rx_buf_sz,
1213 PCI_DMA_FROMDEVICE);
1214 } else {
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001215 pci_unmap_single(ep->pci_dev,
1216 ep->rx_ring[entry].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
1218 skb_put(skb = ep->rx_skbuff[entry], pkt_len);
1219 ep->rx_skbuff[entry] = NULL;
1220 }
1221 skb->protocol = eth_type_trans(skb, dev);
1222 netif_receive_skb(skb);
1223 dev->last_rx = jiffies;
1224 ep->stats.rx_packets++;
1225 ep->stats.rx_bytes += pkt_len;
1226 }
1227 work_done++;
1228 entry = (++ep->cur_rx) % RX_RING_SIZE;
1229 }
1230
1231 /* Refill the Rx ring buffers. */
1232 for (; ep->cur_rx - ep->dirty_rx > 0; ep->dirty_rx++) {
1233 entry = ep->dirty_rx % RX_RING_SIZE;
1234 if (ep->rx_skbuff[entry] == NULL) {
1235 struct sk_buff *skb;
1236 skb = ep->rx_skbuff[entry] = dev_alloc_skb(ep->rx_buf_sz);
1237 if (skb == NULL)
1238 break;
1239 skb->dev = dev; /* Mark as being used by this device. */
1240 skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001241 ep->rx_ring[entry].bufaddr = pci_map_single(ep->pci_dev,
David S. Miller689be432005-06-28 15:25:31 -07001242 skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 work_done++;
1244 }
1245 ep->rx_ring[entry].rxstatus = cpu_to_le32(DescOwn);
1246 }
1247 return work_done;
1248}
1249
1250static void epic_rx_err(struct net_device *dev, struct epic_private *ep)
1251{
1252 long ioaddr = dev->base_addr;
1253 int status;
1254
1255 status = inl(ioaddr + INTSTAT);
1256
1257 if (status == EpicRemoved)
1258 return;
1259 if (status & RxOverflow) /* Missed a Rx frame. */
1260 ep->stats.rx_errors++;
1261 if (status & (RxOverflow | RxFull))
1262 outw(RxQueued, ioaddr + COMMAND);
1263}
1264
1265static int epic_poll(struct net_device *dev, int *budget)
1266{
1267 struct epic_private *ep = dev->priv;
John W. Linvilleb7b1d202005-10-18 21:31:01 -04001268 int work_done = 0, orig_budget;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269 long ioaddr = dev->base_addr;
1270
1271 orig_budget = (*budget > dev->quota) ? dev->quota : *budget;
1272
1273rx_action:
1274
1275 epic_tx(dev, ep);
1276
John W. Linvilleb7b1d202005-10-18 21:31:01 -04001277 work_done += epic_rx(dev, *budget);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001278
1279 epic_rx_err(dev, ep);
1280
1281 *budget -= work_done;
1282 dev->quota -= work_done;
1283
1284 if (netif_running(dev) && (work_done < orig_budget)) {
1285 unsigned long flags;
1286 int more;
1287
1288 /* A bit baroque but it avoids a (space hungry) spin_unlock */
1289
1290 spin_lock_irqsave(&ep->napi_lock, flags);
1291
1292 more = ep->reschedule_in_poll;
1293 if (!more) {
1294 __netif_rx_complete(dev);
1295 outl(EpicNapiEvent, ioaddr + INTSTAT);
1296 epic_napi_irq_on(dev, ep);
1297 } else
1298 ep->reschedule_in_poll--;
1299
1300 spin_unlock_irqrestore(&ep->napi_lock, flags);
1301
1302 if (more)
1303 goto rx_action;
1304 }
1305
1306 return (work_done >= orig_budget);
1307}
1308
1309static int epic_close(struct net_device *dev)
1310{
1311 long ioaddr = dev->base_addr;
1312 struct epic_private *ep = dev->priv;
1313 struct sk_buff *skb;
1314 int i;
1315
1316 netif_stop_queue(dev);
1317
1318 if (debug > 1)
1319 printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
1320 dev->name, (int)inl(ioaddr + INTSTAT));
1321
1322 del_timer_sync(&ep->timer);
1323
1324 epic_disable_int(dev, ep);
1325
1326 free_irq(dev->irq, dev);
1327
1328 epic_pause(dev);
1329
1330 /* Free all the skbuffs in the Rx queue. */
1331 for (i = 0; i < RX_RING_SIZE; i++) {
1332 skb = ep->rx_skbuff[i];
1333 ep->rx_skbuff[i] = NULL;
1334 ep->rx_ring[i].rxstatus = 0; /* Not owned by Epic chip. */
1335 ep->rx_ring[i].buflength = 0;
1336 if (skb) {
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001337 pci_unmap_single(ep->pci_dev, ep->rx_ring[i].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
1339 dev_kfree_skb(skb);
1340 }
1341 ep->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */
1342 }
1343 for (i = 0; i < TX_RING_SIZE; i++) {
1344 skb = ep->tx_skbuff[i];
1345 ep->tx_skbuff[i] = NULL;
1346 if (!skb)
1347 continue;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001348 pci_unmap_single(ep->pci_dev, ep->tx_ring[i].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 skb->len, PCI_DMA_TODEVICE);
1350 dev_kfree_skb(skb);
1351 }
1352
1353 /* Green! Leave the chip in low-power mode. */
1354 outl(0x0008, ioaddr + GENCTL);
1355
1356 return 0;
1357}
1358
1359static struct net_device_stats *epic_get_stats(struct net_device *dev)
1360{
1361 struct epic_private *ep = dev->priv;
1362 long ioaddr = dev->base_addr;
1363
1364 if (netif_running(dev)) {
1365 /* Update the error counts. */
1366 ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
1367 ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
1368 ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
1369 }
1370
1371 return &ep->stats;
1372}
1373
1374/* Set or clear the multicast filter for this adaptor.
1375 Note that we only use exclusion around actually queueing the
1376 new frame, not around filling ep->setup_frame. This is non-deterministic
1377 when re-entered but still correct. */
1378
1379static void set_rx_mode(struct net_device *dev)
1380{
1381 long ioaddr = dev->base_addr;
1382 struct epic_private *ep = dev->priv;
1383 unsigned char mc_filter[8]; /* Multicast hash filter */
1384 int i;
1385
1386 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
1387 outl(0x002C, ioaddr + RxCtrl);
1388 /* Unconditionally log net taps. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 memset(mc_filter, 0xff, sizeof(mc_filter));
1390 } else if ((dev->mc_count > 0) || (dev->flags & IFF_ALLMULTI)) {
1391 /* There is apparently a chip bug, so the multicast filter
1392 is never enabled. */
1393 /* Too many to filter perfectly -- accept all multicasts. */
1394 memset(mc_filter, 0xff, sizeof(mc_filter));
1395 outl(0x000C, ioaddr + RxCtrl);
1396 } else if (dev->mc_count == 0) {
1397 outl(0x0004, ioaddr + RxCtrl);
1398 return;
1399 } else { /* Never executed, for now. */
1400 struct dev_mc_list *mclist;
1401
1402 memset(mc_filter, 0, sizeof(mc_filter));
1403 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1404 i++, mclist = mclist->next) {
1405 unsigned int bit_nr =
1406 ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f;
1407 mc_filter[bit_nr >> 3] |= (1 << bit_nr);
1408 }
1409 }
1410 /* ToDo: perhaps we need to stop the Tx and Rx process here? */
1411 if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) {
1412 for (i = 0; i < 4; i++)
1413 outw(((u16 *)mc_filter)[i], ioaddr + MC0 + i*4);
1414 memcpy(ep->mc_filter, mc_filter, sizeof(mc_filter));
1415 }
1416 return;
1417}
1418
1419static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
1420{
1421 struct epic_private *np = dev->priv;
1422
1423 strcpy (info->driver, DRV_NAME);
1424 strcpy (info->version, DRV_VERSION);
1425 strcpy (info->bus_info, pci_name(np->pci_dev));
1426}
1427
1428static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1429{
1430 struct epic_private *np = dev->priv;
1431 int rc;
1432
1433 spin_lock_irq(&np->lock);
1434 rc = mii_ethtool_gset(&np->mii, cmd);
1435 spin_unlock_irq(&np->lock);
1436
1437 return rc;
1438}
1439
1440static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1441{
1442 struct epic_private *np = dev->priv;
1443 int rc;
1444
1445 spin_lock_irq(&np->lock);
1446 rc = mii_ethtool_sset(&np->mii, cmd);
1447 spin_unlock_irq(&np->lock);
1448
1449 return rc;
1450}
1451
1452static int netdev_nway_reset(struct net_device *dev)
1453{
1454 struct epic_private *np = dev->priv;
1455 return mii_nway_restart(&np->mii);
1456}
1457
1458static u32 netdev_get_link(struct net_device *dev)
1459{
1460 struct epic_private *np = dev->priv;
1461 return mii_link_ok(&np->mii);
1462}
1463
1464static u32 netdev_get_msglevel(struct net_device *dev)
1465{
1466 return debug;
1467}
1468
1469static void netdev_set_msglevel(struct net_device *dev, u32 value)
1470{
1471 debug = value;
1472}
1473
1474static int ethtool_begin(struct net_device *dev)
1475{
1476 unsigned long ioaddr = dev->base_addr;
1477 /* power-up, if interface is down */
1478 if (! netif_running(dev)) {
1479 outl(0x0200, ioaddr + GENCTL);
1480 outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
1481 }
1482 return 0;
1483}
1484
1485static void ethtool_complete(struct net_device *dev)
1486{
1487 unsigned long ioaddr = dev->base_addr;
1488 /* power-down, if interface is down */
1489 if (! netif_running(dev)) {
1490 outl(0x0008, ioaddr + GENCTL);
1491 outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL);
1492 }
1493}
1494
Jeff Garzik7282d492006-09-13 14:30:00 -04001495static const struct ethtool_ops netdev_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 .get_drvinfo = netdev_get_drvinfo,
1497 .get_settings = netdev_get_settings,
1498 .set_settings = netdev_set_settings,
1499 .nway_reset = netdev_nway_reset,
1500 .get_link = netdev_get_link,
1501 .get_msglevel = netdev_get_msglevel,
1502 .set_msglevel = netdev_set_msglevel,
1503 .get_sg = ethtool_op_get_sg,
1504 .get_tx_csum = ethtool_op_get_tx_csum,
1505 .begin = ethtool_begin,
1506 .complete = ethtool_complete
1507};
1508
1509static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1510{
1511 struct epic_private *np = dev->priv;
1512 long ioaddr = dev->base_addr;
1513 struct mii_ioctl_data *data = if_mii(rq);
1514 int rc;
1515
1516 /* power-up, if interface is down */
1517 if (! netif_running(dev)) {
1518 outl(0x0200, ioaddr + GENCTL);
1519 outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
1520 }
1521
1522 /* all non-ethtool ioctls (the SIOC[GS]MIIxxx ioctls) */
1523 spin_lock_irq(&np->lock);
1524 rc = generic_mii_ioctl(&np->mii, data, cmd, NULL);
1525 spin_unlock_irq(&np->lock);
1526
1527 /* power-down, if interface is down */
1528 if (! netif_running(dev)) {
1529 outl(0x0008, ioaddr + GENCTL);
1530 outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL);
1531 }
1532 return rc;
1533}
1534
1535
1536static void __devexit epic_remove_one (struct pci_dev *pdev)
1537{
1538 struct net_device *dev = pci_get_drvdata(pdev);
1539 struct epic_private *ep = dev->priv;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001540
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541 pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma);
1542 pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma);
1543 unregister_netdev(dev);
1544#ifndef USE_IO_OPS
1545 iounmap((void*) dev->base_addr);
1546#endif
1547 pci_release_regions(pdev);
1548 free_netdev(dev);
1549 pci_disable_device(pdev);
1550 pci_set_drvdata(pdev, NULL);
1551 /* pci_power_off(pdev, -1); */
1552}
1553
1554
1555#ifdef CONFIG_PM
1556
1557static int epic_suspend (struct pci_dev *pdev, pm_message_t state)
1558{
1559 struct net_device *dev = pci_get_drvdata(pdev);
1560 long ioaddr = dev->base_addr;
1561
1562 if (!netif_running(dev))
1563 return 0;
1564 epic_pause(dev);
1565 /* Put the chip into low-power mode. */
1566 outl(0x0008, ioaddr + GENCTL);
1567 /* pci_power_off(pdev, -1); */
1568 return 0;
1569}
1570
1571
1572static int epic_resume (struct pci_dev *pdev)
1573{
1574 struct net_device *dev = pci_get_drvdata(pdev);
1575
1576 if (!netif_running(dev))
1577 return 0;
1578 epic_restart(dev);
1579 /* pci_power_on(pdev); */
1580 return 0;
1581}
1582
1583#endif /* CONFIG_PM */
1584
1585
1586static struct pci_driver epic_driver = {
1587 .name = DRV_NAME,
1588 .id_table = epic_pci_tbl,
1589 .probe = epic_init_one,
1590 .remove = __devexit_p(epic_remove_one),
1591#ifdef CONFIG_PM
1592 .suspend = epic_suspend,
1593 .resume = epic_resume,
1594#endif /* CONFIG_PM */
1595};
1596
1597
1598static int __init epic_init (void)
1599{
1600/* when a module, this is printed whether or not devices are found in probe */
1601#ifdef MODULE
1602 printk (KERN_INFO "%s" KERN_INFO "%s" KERN_INFO "%s",
1603 version, version2, version3);
1604#endif
1605
Jeff Garzik29917622006-08-19 17:48:59 -04001606 return pci_register_driver(&epic_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607}
1608
1609
1610static void __exit epic_cleanup (void)
1611{
1612 pci_unregister_driver (&epic_driver);
1613}
1614
1615
1616module_init(epic_init);
1617module_exit(epic_cleanup);