blob: 347cccbeb53c52372c712733e26fc2faef524b96 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070076#include <linux/interrupt.h>
77#include <linux/pci.h>
78#include <linux/delay.h>
79#include <linux/netdevice.h>
80#include <linux/etherdevice.h>
81#include <linux/skbuff.h>
82#include <linux/init.h>
83#include <linux/spinlock.h>
84#include <linux/ethtool.h>
85#include <linux/mii.h>
86#include <linux/crc32.h>
87#include <linux/bitops.h>
88#include <asm/io.h>
89#include <asm/uaccess.h>
Roland Dreier9e2d11b2010-06-02 10:36:53 +000090#include <asm/byteorder.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070091
92/* These identify the driver base version and may not be removed. */
Bill Pembertonb0171cd2012-12-03 09:23:42 -050093static char version[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -070094DRV_NAME ".c:v1.11 1/7/2001 Written by Donald Becker <becker@scyld.com>\n";
Bill Pembertonb0171cd2012-12-03 09:23:42 -050095static char version2[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -070096" (unofficial 2.4.x kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n";
97
98MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
99MODULE_DESCRIPTION("SMC 83c170 EPIC series Ethernet driver");
100MODULE_LICENSE("GPL");
101
102module_param(debug, int, 0);
103module_param(rx_copybreak, int, 0);
104module_param_array(options, int, NULL, 0);
105module_param_array(full_duplex, int, NULL, 0);
106MODULE_PARM_DESC(debug, "EPIC/100 debug level (0-5)");
107MODULE_PARM_DESC(options, "EPIC/100: Bits 0-3: media type, bit 4: full duplex");
108MODULE_PARM_DESC(rx_copybreak, "EPIC/100 copy breakpoint for copy-only-tiny-frames");
109MODULE_PARM_DESC(full_duplex, "EPIC/100 full duplex setting(s) (1)");
110
111/*
112 Theory of Operation
113
114I. Board Compatibility
115
116This device driver is designed for the SMC "EPIC/100", the SMC
117single-chip Ethernet controllers for PCI. This chip is used on
118the SMC EtherPower II boards.
119
120II. Board-specific settings
121
122PCI bus devices are configured by the system at boot time, so no jumpers
123need to be set on the board. The system BIOS will assign the
124PCI INTA signal to a (preferably otherwise unused) system IRQ line.
125Note: Kernel versions earlier than 1.3.73 do not support shared PCI
126interrupt lines.
127
128III. Driver operation
129
130IIIa. Ring buffers
131
132IVb. References
133
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200134http://www.smsc.com/media/Downloads_Public/discontinued/83c171.pdf
135http://www.smsc.com/media/Downloads_Public/discontinued/83c175.pdf
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136http://scyld.com/expert/NWay.html
137http://www.national.com/pf/DP/DP83840A.html
138
139IVc. Errata
140
141*/
142
143
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144enum chip_capability_flags { MII_PWRDWN=1, TYPE2_INTR=2, NO_MII=4 };
145
146#define EPIC_TOTAL_SIZE 0x100
147#define USE_IO_OPS 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148
Francois Romieuaae9bc32012-03-13 12:04:26 +0100149#ifdef USE_IO_OPS
150#define EPIC_BAR 0
151#else
152#define EPIC_BAR 1
153#endif
154
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155typedef enum {
156 SMSC_83C170_0,
157 SMSC_83C170,
158 SMSC_83C175,
159} chip_t;
160
161
162struct epic_chip_info {
163 const char *name;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164 int drv_flags; /* Driver use, intended as capability flags. */
165};
166
167
168/* indexed by chip_t */
Arjan van de Venf71e1302006-03-03 21:33:57 -0500169static const struct epic_chip_info pci_id_tbl[] = {
Jeff Garzik36e1e842006-06-27 07:38:33 -0400170 { "SMSC EPIC/100 83c170", TYPE2_INTR | NO_MII | MII_PWRDWN },
171 { "SMSC EPIC/100 83c170", TYPE2_INTR },
172 { "SMSC EPIC/C 83c175", TYPE2_INTR | MII_PWRDWN },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173};
174
175
Alexey Dobriyana3aa1882010-01-07 11:58:11 +0000176static DEFINE_PCI_DEVICE_TABLE(epic_pci_tbl) = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 { 0x10B8, 0x0005, 0x1092, 0x0AB4, 0, 0, SMSC_83C170_0 },
178 { 0x10B8, 0x0005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMSC_83C170 },
179 { 0x10B8, 0x0006, PCI_ANY_ID, PCI_ANY_ID,
180 PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, SMSC_83C175 },
181 { 0,}
182};
183MODULE_DEVICE_TABLE (pci, epic_pci_tbl);
184
Francois Romieuaae9bc32012-03-13 12:04:26 +0100185#define ew16(reg, val) iowrite16(val, ioaddr + (reg))
186#define ew32(reg, val) iowrite32(val, ioaddr + (reg))
187#define er8(reg) ioread8(ioaddr + (reg))
188#define er16(reg) ioread16(ioaddr + (reg))
189#define er32(reg) ioread32(ioaddr + (reg))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190
191/* Offsets to registers, using the (ugh) SMC names. */
192enum epic_registers {
193 COMMAND=0, INTSTAT=4, INTMASK=8, GENCTL=0x0C, NVCTL=0x10, EECTL=0x14,
194 PCIBurstCnt=0x18,
195 TEST1=0x1C, CRCCNT=0x20, ALICNT=0x24, MPCNT=0x28, /* Rx error counters. */
196 MIICtrl=0x30, MIIData=0x34, MIICfg=0x38,
197 LAN0=64, /* MAC address. */
198 MC0=80, /* Multicast filter table. */
199 RxCtrl=96, TxCtrl=112, TxSTAT=0x74,
200 PRxCDAR=0x84, RxSTAT=0xA4, EarlyRx=0xB0, PTxCDAR=0xC4, TxThresh=0xDC,
201};
202
203/* Interrupt register bits, using my own meaningful names. */
204enum IntrStatus {
205 TxIdle=0x40000, RxIdle=0x20000, IntrSummary=0x010000,
206 PCIBusErr170=0x7000, PCIBusErr175=0x1000, PhyEvent175=0x8000,
207 RxStarted=0x0800, RxEarlyWarn=0x0400, CntFull=0x0200, TxUnderrun=0x0100,
208 TxEmpty=0x0080, TxDone=0x0020, RxError=0x0010,
209 RxOverflow=0x0008, RxFull=0x0004, RxHeader=0x0002, RxDone=0x0001,
210};
211enum CommandBits {
212 StopRx=1, StartRx=2, TxQueued=4, RxQueued=8,
213 StopTxDMA=0x20, StopRxDMA=0x40, RestartTx=0x80,
214};
215
216#define EpicRemoved 0xffffffff /* Chip failed or removed (CardBus) */
217
218#define EpicNapiEvent (TxEmpty | TxDone | \
219 RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull)
220#define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent)
221
Arjan van de Venf71e1302006-03-03 21:33:57 -0500222static const u16 media2miictl[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0,
224 0, 0, 0, 0, 0, 0, 0, 0 };
225
Al Viro9ebfd492008-03-16 22:22:04 +0000226/*
227 * The EPIC100 Rx and Tx buffer descriptors. Note that these
228 * really ARE host-endian; it's not a misannotation. We tell
229 * the card to byteswap them internally on big-endian hosts -
Roland Dreier9e2d11b2010-06-02 10:36:53 +0000230 * look for #ifdef __BIG_ENDIAN in epic_open().
Al Viro9ebfd492008-03-16 22:22:04 +0000231 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232
233struct epic_tx_desc {
234 u32 txstatus;
235 u32 bufaddr;
236 u32 buflength;
237 u32 next;
238};
239
240struct epic_rx_desc {
241 u32 rxstatus;
242 u32 bufaddr;
243 u32 buflength;
244 u32 next;
245};
246
247enum desc_status_bits {
248 DescOwn=0x8000,
249};
250
251#define PRIV_ALIGN 15 /* Required alignment mask */
252struct epic_private {
253 struct epic_rx_desc *rx_ring;
254 struct epic_tx_desc *tx_ring;
255 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
256 struct sk_buff* tx_skbuff[TX_RING_SIZE];
257 /* The addresses of receive-in-place skbuffs. */
258 struct sk_buff* rx_skbuff[RX_RING_SIZE];
259
260 dma_addr_t tx_ring_dma;
261 dma_addr_t rx_ring_dma;
262
263 /* Ring pointers. */
264 spinlock_t lock; /* Group with Tx control cache line. */
265 spinlock_t napi_lock;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700266 struct napi_struct napi;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 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
Francois Romieuaae9bc32012-03-13 12:04:26 +0100274 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 struct pci_dev *pci_dev; /* PCI bus location. */
276 int chip_id, chip_flags;
277
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 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);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100290static int read_eeprom(struct epic_private *, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291static 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);
Stephen Hemminger613573252009-08-31 19:50:58 +0000297static netdev_tx_t epic_start_xmit(struct sk_buff *skb,
298 struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299static int epic_rx(struct net_device *dev, int budget);
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700300static int epic_poll(struct napi_struct *napi, int budget);
David Howells7d12e782006-10-05 14:55:46 +0100301static irqreturn_t epic_interrupt(int irq, void *dev_instance);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
Jeff Garzik7282d492006-09-13 14:30:00 -0400303static const struct ethtool_ops netdev_ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304static int epic_close(struct net_device *dev);
305static struct net_device_stats *epic_get_stats(struct net_device *dev);
306static void set_rx_mode(struct net_device *dev);
307
Stephen Hemminger805524c2009-01-07 17:27:39 -0800308static const struct net_device_ops epic_netdev_ops = {
309 .ndo_open = epic_open,
310 .ndo_stop = epic_close,
311 .ndo_start_xmit = epic_start_xmit,
312 .ndo_tx_timeout = epic_tx_timeout,
313 .ndo_get_stats = epic_get_stats,
Jiri Pirkoafc4b132011-08-16 06:29:01 +0000314 .ndo_set_rx_mode = set_rx_mode,
Stephen Hemminger805524c2009-01-07 17:27:39 -0800315 .ndo_do_ioctl = netdev_ioctl,
316 .ndo_change_mtu = eth_change_mtu,
317 .ndo_set_mac_address = eth_mac_addr,
318 .ndo_validate_addr = eth_validate_addr,
319};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320
Bill Pembertonb0171cd2012-12-03 09:23:42 -0500321static int epic_init_one(struct pci_dev *pdev,
Francois Romieuaae9bc32012-03-13 12:04:26 +0100322 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323{
324 static int card_idx = -1;
Francois Romieuaae9bc32012-03-13 12:04:26 +0100325 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 int chip_idx = (int) ent->driver_data;
327 int irq;
328 struct net_device *dev;
329 struct epic_private *ep;
330 int i, ret, option = 0, duplex = 0;
331 void *ring_space;
332 dma_addr_t ring_dma;
333
334/* when built into the kernel, we only print version if device is found */
335#ifndef MODULE
336 static int printed_version;
337 if (!printed_version++)
Joe Perchesad361c92009-07-06 13:05:40 -0700338 printk(KERN_INFO "%s%s", version, version2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339#endif
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400340
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341 card_idx++;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400342
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 ret = pci_enable_device(pdev);
344 if (ret)
345 goto out;
346 irq = pdev->irq;
347
Jeff Garzik36e1e842006-06-27 07:38:33 -0400348 if (pci_resource_len(pdev, 0) < EPIC_TOTAL_SIZE) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400349 dev_err(&pdev->dev, "no PCI region space\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350 ret = -ENODEV;
351 goto err_out_disable;
352 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400353
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 pci_set_master(pdev);
355
356 ret = pci_request_regions(pdev, DRV_NAME);
357 if (ret < 0)
358 goto err_out_disable;
359
360 ret = -ENOMEM;
361
362 dev = alloc_etherdev(sizeof (*ep));
Joe Perches41de8d42012-01-29 13:47:52 +0000363 if (!dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 goto err_out_free_res;
Joe Perches41de8d42012-01-29 13:47:52 +0000365
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 SET_NETDEV_DEV(dev, &pdev->dev);
367
Francois Romieuaae9bc32012-03-13 12:04:26 +0100368 ioaddr = pci_iomap(pdev, EPIC_BAR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 if (!ioaddr) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400370 dev_err(&pdev->dev, "ioremap failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 goto err_out_free_netdev;
372 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373
374 pci_set_drvdata(pdev, dev);
Wang Chen4cf16532008-11-12 23:38:14 -0800375 ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100376 ep->ioaddr = ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377 ep->mii.dev = dev;
378 ep->mii.mdio_read = mdio_read;
379 ep->mii.mdio_write = mdio_write;
380 ep->mii.phy_id_mask = 0x1f;
381 ep->mii.reg_num_mask = 0x1f;
382
383 ring_space = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma);
384 if (!ring_space)
385 goto err_out_iounmap;
Joe Perches43d620c2011-06-16 19:08:06 +0000386 ep->tx_ring = ring_space;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 ep->tx_ring_dma = ring_dma;
388
389 ring_space = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma);
390 if (!ring_space)
391 goto err_out_unmap_tx;
Joe Perches43d620c2011-06-16 19:08:06 +0000392 ep->rx_ring = ring_space;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 ep->rx_ring_dma = ring_dma;
394
395 if (dev->mem_start) {
396 option = dev->mem_start;
397 duplex = (dev->mem_start & 16) ? 1 : 0;
398 } else if (card_idx >= 0 && card_idx < MAX_UNITS) {
399 if (options[card_idx] >= 0)
400 option = options[card_idx];
401 if (full_duplex[card_idx] >= 0)
402 duplex = full_duplex[card_idx];
403 }
404
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405 spin_lock_init(&ep->lock);
406 spin_lock_init(&ep->napi_lock);
407 ep->reschedule_in_poll = 0;
408
409 /* Bring the chip out of low-power mode. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100410 ew32(GENCTL, 0x4200);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411 /* Magic?! If we don't set this bit the MII interface won't work. */
412 /* This magic is documented in SMSC app note 7.15 */
413 for (i = 16; i > 0; i--)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100414 ew32(TEST1, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415
416 /* Turn on the MII transceiver. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100417 ew32(MIICfg, 0x12);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 if (chip_idx == 1)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100419 ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800);
420 ew32(GENCTL, 0x0200);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
422 /* Note: the '175 does not have a serial EEPROM. */
423 for (i = 0; i < 3; i++)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100424 ((__le16 *)dev->dev_addr)[i] = cpu_to_le16(er16(LAN0 + i*4));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425
426 if (debug > 2) {
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400427 dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 for (i = 0; i < 64; i++)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100429 printk(" %4.4x%s", read_eeprom(ep, i),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430 i % 16 == 15 ? "\n" : "");
431 }
432
433 ep->pci_dev = pdev;
434 ep->chip_id = chip_idx;
435 ep->chip_flags = pci_id_tbl[chip_idx].drv_flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400436 ep->irq_mask =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 (ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
438 | CntFull | TxUnderrun | EpicNapiEvent;
439
440 /* Find the connected MII xcvrs.
441 Doing this in open() would allow detecting external xcvrs later, but
442 takes much time and no cards have external MII. */
443 {
444 int phy, phy_idx = 0;
445 for (phy = 1; phy < 32 && phy_idx < sizeof(ep->phys); phy++) {
446 int mii_status = mdio_read(dev, phy, MII_BMSR);
447 if (mii_status != 0xffff && mii_status != 0x0000) {
448 ep->phys[phy_idx++] = phy;
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400449 dev_info(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400450 "MII transceiver #%d control "
451 "%4.4x status %4.4x.\n",
452 phy, mdio_read(dev, phy, 0), mii_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 }
454 }
455 ep->mii_phy_cnt = phy_idx;
456 if (phy_idx != 0) {
457 phy = ep->phys[0];
458 ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE);
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400459 dev_info(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400460 "Autonegotiation advertising %4.4x link "
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 "partner %4.4x.\n",
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400462 ep->mii.advertising, mdio_read(dev, phy, 5));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 } else if ( ! (ep->chip_flags & NO_MII)) {
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400464 dev_warn(&pdev->dev,
Jeff Garzik2e8a5382006-06-27 10:47:51 -0400465 "***WARNING***: No MII transceiver found!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466 /* Use the known PHY address of the EPII. */
467 ep->phys[0] = 3;
468 }
469 ep->mii.phy_id = ep->phys[0];
470 }
471
472 /* Turn off the MII xcvr (175 only!), leave the chip in low-power mode. */
473 if (ep->chip_flags & MII_PWRDWN)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100474 ew32(NVCTL, er32(NVCTL) & ~0x483c);
475 ew32(GENCTL, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476
477 /* The lower four bits are the media type. */
478 if (duplex) {
479 ep->mii.force_media = ep->mii.full_duplex = 1;
Jeff Garzik9b91cf92006-06-27 11:39:50 -0400480 dev_info(&pdev->dev, "Forced full duplex requested.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 }
482 dev->if_port = ep->default_port = option;
483
484 /* The Epic-specific entries in the device structure. */
Stephen Hemminger805524c2009-01-07 17:27:39 -0800485 dev->netdev_ops = &epic_netdev_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 dev->ethtool_ops = &netdev_ethtool_ops;
487 dev->watchdog_timeo = TX_TIMEOUT;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700488 netif_napi_add(dev, &ep->napi, epic_poll, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489
490 ret = register_netdev(dev);
491 if (ret < 0)
492 goto err_out_unmap_rx;
493
Francois Romieuaae9bc32012-03-13 12:04:26 +0100494 printk(KERN_INFO "%s: %s at %lx, IRQ %d, %pM\n",
495 dev->name, pci_id_tbl[chip_idx].name,
496 (long)pci_resource_start(pdev, EPIC_BAR), pdev->irq,
Johannes Berge1749612008-10-27 15:59:26 -0700497 dev->dev_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498
499out:
500 return ret;
501
502err_out_unmap_rx:
503 pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma);
504err_out_unmap_tx:
505 pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma);
506err_out_iounmap:
Francois Romieuaae9bc32012-03-13 12:04:26 +0100507 pci_iounmap(pdev, ioaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508err_out_free_netdev:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 free_netdev(dev);
510err_out_free_res:
511 pci_release_regions(pdev);
512err_out_disable:
513 pci_disable_device(pdev);
514 goto out;
515}
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400516
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517/* Serial EEPROM section. */
518
519/* EEPROM_Ctrl bits. */
520#define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */
521#define EE_CS 0x02 /* EEPROM chip select. */
522#define EE_DATA_WRITE 0x08 /* EEPROM chip data in. */
523#define EE_WRITE_0 0x01
524#define EE_WRITE_1 0x09
525#define EE_DATA_READ 0x10 /* EEPROM chip data out. */
526#define EE_ENB (0x0001 | EE_CS)
527
528/* Delay between EEPROM clock transitions.
529 This serves to flush the operation to the PCI bus.
530 */
531
Francois Romieuaae9bc32012-03-13 12:04:26 +0100532#define eeprom_delay() er32(EECTL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533
534/* The EEPROM commands include the alway-set leading bit. */
535#define EE_WRITE_CMD (5 << 6)
536#define EE_READ64_CMD (6 << 6)
537#define EE_READ256_CMD (6 << 8)
538#define EE_ERASE_CMD (7 << 6)
539
540static void epic_disable_int(struct net_device *dev, struct epic_private *ep)
541{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100542 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543
Francois Romieuaae9bc32012-03-13 12:04:26 +0100544 ew32(INTMASK, 0x00000000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545}
546
Francois Romieuaae9bc32012-03-13 12:04:26 +0100547static inline void __epic_pci_commit(void __iomem *ioaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548{
549#ifndef USE_IO_OPS
Francois Romieuaae9bc32012-03-13 12:04:26 +0100550 er32(INTMASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551#endif
552}
553
554static inline void epic_napi_irq_off(struct net_device *dev,
555 struct epic_private *ep)
556{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100557 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
Francois Romieuaae9bc32012-03-13 12:04:26 +0100559 ew32(INTMASK, ep->irq_mask & ~EpicNapiEvent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560 __epic_pci_commit(ioaddr);
561}
562
563static inline void epic_napi_irq_on(struct net_device *dev,
564 struct epic_private *ep)
565{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100566 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567
568 /* No need to commit possible posted write */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100569 ew32(INTMASK, ep->irq_mask | EpicNapiEvent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570}
571
Bill Pembertonb0171cd2012-12-03 09:23:42 -0500572static int read_eeprom(struct epic_private *ep, int location)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100574 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 int i;
576 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 int read_cmd = location |
Francois Romieuaae9bc32012-03-13 12:04:26 +0100578 (er32(EECTL) & 0x40 ? EE_READ64_CMD : EE_READ256_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579
Francois Romieuaae9bc32012-03-13 12:04:26 +0100580 ew32(EECTL, EE_ENB & ~EE_CS);
581 ew32(EECTL, EE_ENB);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
583 /* Shift the read command bits out. */
584 for (i = 12; i >= 0; i--) {
585 short dataval = (read_cmd & (1 << i)) ? EE_WRITE_1 : EE_WRITE_0;
Francois Romieuaae9bc32012-03-13 12:04:26 +0100586 ew32(EECTL, EE_ENB | dataval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587 eeprom_delay();
Francois Romieuaae9bc32012-03-13 12:04:26 +0100588 ew32(EECTL, EE_ENB | dataval | EE_SHIFT_CLK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 eeprom_delay();
590 }
Francois Romieuaae9bc32012-03-13 12:04:26 +0100591 ew32(EECTL, EE_ENB);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592
593 for (i = 16; i > 0; i--) {
Francois Romieuaae9bc32012-03-13 12:04:26 +0100594 ew32(EECTL, EE_ENB | EE_SHIFT_CLK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 eeprom_delay();
Francois Romieuaae9bc32012-03-13 12:04:26 +0100596 retval = (retval << 1) | ((er32(EECTL) & EE_DATA_READ) ? 1 : 0);
597 ew32(EECTL, EE_ENB);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 eeprom_delay();
599 }
600
601 /* Terminate the EEPROM access. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100602 ew32(EECTL, EE_ENB & ~EE_CS);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 return retval;
604}
605
606#define MII_READOP 1
607#define MII_WRITEOP 2
608static int mdio_read(struct net_device *dev, int phy_id, int location)
609{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100610 struct epic_private *ep = netdev_priv(dev);
611 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 int read_cmd = (phy_id << 9) | (location << 4) | MII_READOP;
613 int i;
614
Francois Romieuaae9bc32012-03-13 12:04:26 +0100615 ew32(MIICtrl, read_cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 /* Typical operation takes 25 loops. */
617 for (i = 400; i > 0; i--) {
618 barrier();
Francois Romieuaae9bc32012-03-13 12:04:26 +0100619 if ((er32(MIICtrl) & MII_READOP) == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 /* Work around read failure bug. */
Joe Perches8e95a202009-12-03 07:58:21 +0000621 if (phy_id == 1 && location < 6 &&
Francois Romieuaae9bc32012-03-13 12:04:26 +0100622 er16(MIIData) == 0xffff) {
623 ew32(MIICtrl, read_cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 continue;
625 }
Francois Romieuaae9bc32012-03-13 12:04:26 +0100626 return er16(MIIData);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 }
628 }
629 return 0xffff;
630}
631
632static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
633{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100634 struct epic_private *ep = netdev_priv(dev);
635 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 int i;
637
Francois Romieuaae9bc32012-03-13 12:04:26 +0100638 ew16(MIIData, value);
639 ew32(MIICtrl, (phy_id << 9) | (loc << 4) | MII_WRITEOP);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400640 for (i = 10000; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641 barrier();
Francois Romieuaae9bc32012-03-13 12:04:26 +0100642 if ((er32(MIICtrl) & MII_WRITEOP) == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 break;
644 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645}
646
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400647
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648static int epic_open(struct net_device *dev)
649{
Wang Chen4cf16532008-11-12 23:38:14 -0800650 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100651 void __iomem *ioaddr = ep->ioaddr;
652 const int irq = ep->pci_dev->irq;
653 int rc, i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654
655 /* Soft reset the chip. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100656 ew32(GENCTL, 0x4001);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700658 napi_enable(&ep->napi);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100659 rc = request_irq(irq, epic_interrupt, IRQF_SHARED, dev->name, dev);
660 if (rc) {
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700661 napi_disable(&ep->napi);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100662 return rc;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700663 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664
665 epic_init_ring(dev);
666
Francois Romieuaae9bc32012-03-13 12:04:26 +0100667 ew32(GENCTL, 0x4000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668 /* This magic is documented in SMSC app note 7.15 */
669 for (i = 16; i > 0; i--)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100670 ew32(TEST1, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671
672 /* Pull the chip out of low-power mode, enable interrupts, and set for
673 PCI read multiple. The MIIcfg setting and strange write order are
674 required by the details of which bits are reset and the transceiver
675 wiring on the Ositech CardBus card.
676 */
677#if 0
Francois Romieuaae9bc32012-03-13 12:04:26 +0100678 ew32(MIICfg, dev->if_port == 1 ? 0x13 : 0x12);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679#endif
680 if (ep->chip_flags & MII_PWRDWN)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100681 ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682
Al Viro9ebfd492008-03-16 22:22:04 +0000683 /* Tell the chip to byteswap descriptors on big-endian hosts */
Roland Dreier9e2d11b2010-06-02 10:36:53 +0000684#ifdef __BIG_ENDIAN
Francois Romieuaae9bc32012-03-13 12:04:26 +0100685 ew32(GENCTL, 0x4432 | (RX_FIFO_THRESH << 8));
686 er32(GENCTL);
687 ew32(GENCTL, 0x0432 | (RX_FIFO_THRESH << 8));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688#else
Francois Romieuaae9bc32012-03-13 12:04:26 +0100689 ew32(GENCTL, 0x4412 | (RX_FIFO_THRESH << 8));
690 er32(GENCTL);
691 ew32(GENCTL, 0x0412 | (RX_FIFO_THRESH << 8));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692#endif
693
694 udelay(20); /* Looks like EPII needs that if you want reliable RX init. FIXME: pci posting bug? */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400695
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 for (i = 0; i < 3; i++)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100697 ew32(LAN0 + i*4, le16_to_cpu(((__le16*)dev->dev_addr)[i]));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
699 ep->tx_threshold = TX_FIFO_THRESH;
Francois Romieuaae9bc32012-03-13 12:04:26 +0100700 ew32(TxThresh, ep->tx_threshold);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
702 if (media2miictl[dev->if_port & 15]) {
703 if (ep->mii_phy_cnt)
704 mdio_write(dev, ep->phys[0], MII_BMCR, media2miictl[dev->if_port&15]);
705 if (dev->if_port == 1) {
706 if (debug > 1)
707 printk(KERN_INFO "%s: Using the 10base2 transceiver, MII "
708 "status %4.4x.\n",
709 dev->name, mdio_read(dev, ep->phys[0], MII_BMSR));
710 }
711 } else {
712 int mii_lpa = mdio_read(dev, ep->phys[0], MII_LPA);
713 if (mii_lpa != 0xffff) {
714 if ((mii_lpa & LPA_100FULL) || (mii_lpa & 0x01C0) == LPA_10FULL)
715 ep->mii.full_duplex = 1;
716 else if (! (mii_lpa & LPA_LPACK))
717 mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART);
718 if (debug > 1)
719 printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d"
720 " register read of %4.4x.\n", dev->name,
721 ep->mii.full_duplex ? "full" : "half",
722 ep->phys[0], mii_lpa);
723 }
724 }
725
Francois Romieuaae9bc32012-03-13 12:04:26 +0100726 ew32(TxCtrl, ep->mii.full_duplex ? 0x7f : 0x79);
727 ew32(PRxCDAR, ep->rx_ring_dma);
728 ew32(PTxCDAR, ep->tx_ring_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729
730 /* Start the chip's Rx process. */
731 set_rx_mode(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100732 ew32(COMMAND, StartRx | RxQueued);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733
734 netif_start_queue(dev);
735
736 /* Enable interrupts by setting the interrupt mask. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100737 ew32(INTMASK, RxError | RxHeader | EpicNapiEvent | CntFull |
738 ((ep->chip_flags & TYPE2_INTR) ? PCIBusErr175 : PCIBusErr170) |
739 TxUnderrun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740
Francois Romieuaae9bc32012-03-13 12:04:26 +0100741 if (debug > 1) {
742 printk(KERN_DEBUG "%s: epic_open() ioaddr %p IRQ %d "
743 "status %4.4x %s-duplex.\n",
744 dev->name, ioaddr, irq, er32(GENCTL),
745 ep->mii.full_duplex ? "full" : "half");
746 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747
748 /* Set the timer to switch to check for link beat and perhaps switch
749 to an alternate media type. */
750 init_timer(&ep->timer);
751 ep->timer.expires = jiffies + 3*HZ;
752 ep->timer.data = (unsigned long)dev;
Joe Perchesc061b182010-08-23 18:20:03 +0000753 ep->timer.function = epic_timer; /* timer handler */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 add_timer(&ep->timer);
755
Francois Romieuaae9bc32012-03-13 12:04:26 +0100756 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757}
758
759/* Reset the chip to recover from a PCI transaction error.
760 This may occur at interrupt time. */
761static void epic_pause(struct net_device *dev)
762{
Francois Romieuaae9bc32012-03-13 12:04:26 +0100763 struct net_device_stats *stats = &dev->stats;
764 struct epic_private *ep = netdev_priv(dev);
765 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766
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. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100770 ew32(INTMASK, 0x00000000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 /* Stop the chip's Tx and Rx DMA processes. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100772 ew16(COMMAND, StopRx | StopTxDMA | StopRxDMA);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773
774 /* Update the error counts. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100775 if (er16(COMMAND) != 0xffff) {
776 stats->rx_missed_errors += er8(MPCNT);
777 stats->rx_frame_errors += er8(ALICNT);
778 stats->rx_crc_errors += er8(CRCCNT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779 }
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{
Wang Chen4cf16532008-11-12 23:38:14 -0800787 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100788 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 int i;
790
791 /* Soft reset the chip. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100792 ew32(GENCTL, 0x4001);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793
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--)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100800 ew32(TEST1, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801
Roland Dreier9e2d11b2010-06-02 10:36:53 +0000802#ifdef __BIG_ENDIAN
Francois Romieuaae9bc32012-03-13 12:04:26 +0100803 ew32(GENCTL, 0x0432 | (RX_FIFO_THRESH << 8));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804#else
Francois Romieuaae9bc32012-03-13 12:04:26 +0100805 ew32(GENCTL, 0x0412 | (RX_FIFO_THRESH << 8));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806#endif
Francois Romieuaae9bc32012-03-13 12:04:26 +0100807 ew32(MIICfg, dev->if_port == 1 ? 0x13 : 0x12);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 if (ep->chip_flags & MII_PWRDWN)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100809 ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810
811 for (i = 0; i < 3; i++)
Francois Romieuaae9bc32012-03-13 12:04:26 +0100812 ew32(LAN0 + i*4, le16_to_cpu(((__le16*)dev->dev_addr)[i]));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813
814 ep->tx_threshold = TX_FIFO_THRESH;
Francois Romieuaae9bc32012-03-13 12:04:26 +0100815 ew32(TxThresh, ep->tx_threshold);
816 ew32(TxCtrl, ep->mii.full_duplex ? 0x7f : 0x79);
817 ew32(PRxCDAR, ep->rx_ring_dma +
818 (ep->cur_rx % RX_RING_SIZE) * sizeof(struct epic_rx_desc));
819 ew32(PTxCDAR, ep->tx_ring_dma +
820 (ep->dirty_tx % TX_RING_SIZE) * sizeof(struct epic_tx_desc));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821
822 /* Start the chip's Rx process. */
823 set_rx_mode(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100824 ew32(COMMAND, StartRx | RxQueued);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825
826 /* Enable interrupts by setting the interrupt mask. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100827 ew32(INTMASK, RxError | RxHeader | EpicNapiEvent | CntFull |
828 ((ep->chip_flags & TYPE2_INTR) ? PCIBusErr175 : PCIBusErr170) |
829 TxUnderrun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830
831 printk(KERN_DEBUG "%s: epic_restart() done, cmd status %4.4x, ctl %4.4x"
832 " interrupt %4.4x.\n",
Francois Romieuaae9bc32012-03-13 12:04:26 +0100833 dev->name, er32(COMMAND), er32(GENCTL), er32(INTSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834}
835
836static void check_media(struct net_device *dev)
837{
Wang Chen4cf16532008-11-12 23:38:14 -0800838 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100839 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840 int mii_lpa = ep->mii_phy_cnt ? mdio_read(dev, ep->phys[0], MII_LPA) : 0;
841 int negotiated = mii_lpa & ep->mii.advertising;
842 int duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040;
843
844 if (ep->mii.force_media)
845 return;
846 if (mii_lpa == 0xffff) /* Bogus read */
847 return;
848 if (ep->mii.full_duplex != duplex) {
849 ep->mii.full_duplex = duplex;
850 printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link"
851 " partner capability of %4.4x.\n", dev->name,
852 ep->mii.full_duplex ? "full" : "half", ep->phys[0], mii_lpa);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100853 ew32(TxCtrl, ep->mii.full_duplex ? 0x7F : 0x79);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 }
855}
856
857static void epic_timer(unsigned long data)
858{
859 struct net_device *dev = (struct net_device *)data;
Wang Chen4cf16532008-11-12 23:38:14 -0800860 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100861 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 int next_tick = 5*HZ;
863
864 if (debug > 3) {
865 printk(KERN_DEBUG "%s: Media monitor tick, Tx status %8.8x.\n",
Francois Romieuaae9bc32012-03-13 12:04:26 +0100866 dev->name, er32(TxSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 printk(KERN_DEBUG "%s: Other registers are IntMask %4.4x "
Francois Romieuaae9bc32012-03-13 12:04:26 +0100868 "IntStatus %4.4x RxStatus %4.4x.\n", dev->name,
869 er32(INTMASK), er32(INTSTAT), er32(RxSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 }
871
872 check_media(dev);
873
874 ep->timer.expires = jiffies + next_tick;
875 add_timer(&ep->timer);
876}
877
878static void epic_tx_timeout(struct net_device *dev)
879{
Wang Chen4cf16532008-11-12 23:38:14 -0800880 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100881 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882
883 if (debug > 0) {
884 printk(KERN_WARNING "%s: Transmit timeout using MII device, "
Francois Romieuaae9bc32012-03-13 12:04:26 +0100885 "Tx status %4.4x.\n", dev->name, er16(TxSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 if (debug > 1) {
887 printk(KERN_DEBUG "%s: Tx indices: dirty_tx %d, cur_tx %d.\n",
888 dev->name, ep->dirty_tx, ep->cur_tx);
889 }
890 }
Francois Romieuaae9bc32012-03-13 12:04:26 +0100891 if (er16(TxSTAT) & 0x10) { /* Tx FIFO underflow. */
Kulikov Vasiliy275defc2010-07-05 02:13:20 +0000892 dev->stats.tx_fifo_errors++;
Francois Romieuaae9bc32012-03-13 12:04:26 +0100893 ew32(COMMAND, RestartTx);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 } else {
895 epic_restart(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100896 ew32(COMMAND, TxQueued);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 }
898
Eric Dumazet1ae5dc32010-05-10 05:01:31 -0700899 dev->trans_start = jiffies; /* prevent tx timeout */
Kulikov Vasiliy275defc2010-07-05 02:13:20 +0000900 dev->stats.tx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 if (!ep->tx_full)
902 netif_wake_queue(dev);
903}
904
905/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
906static void epic_init_ring(struct net_device *dev)
907{
Wang Chen4cf16532008-11-12 23:38:14 -0800908 struct epic_private *ep = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 int i;
910
911 ep->tx_full = 0;
912 ep->dirty_tx = ep->cur_tx = 0;
913 ep->cur_rx = ep->dirty_rx = 0;
914 ep->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
915
916 /* Initialize all Rx descriptors. */
917 for (i = 0; i < RX_RING_SIZE; i++) {
918 ep->rx_ring[i].rxstatus = 0;
Al Viro9ebfd492008-03-16 22:22:04 +0000919 ep->rx_ring[i].buflength = ep->rx_buf_sz;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400920 ep->rx_ring[i].next = ep->rx_ring_dma +
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 (i+1)*sizeof(struct epic_rx_desc);
922 ep->rx_skbuff[i] = NULL;
923 }
924 /* Mark the last entry as wrapping the ring. */
925 ep->rx_ring[i-1].next = ep->rx_ring_dma;
926
927 /* Fill in the Rx buffers. Handle allocation failure gracefully. */
928 for (i = 0; i < RX_RING_SIZE; i++) {
Pradeep A. Dalvidae2e9f2012-02-06 11:16:13 +0000929 struct sk_buff *skb = netdev_alloc_skb(dev, ep->rx_buf_sz + 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930 ep->rx_skbuff[i] = skb;
931 if (skb == NULL)
932 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 skb_reserve(skb, 2); /* 16 byte align the IP header. */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400934 ep->rx_ring[i].bufaddr = pci_map_single(ep->pci_dev,
David S. Miller689be432005-06-28 15:25:31 -0700935 skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
Al Viro9ebfd492008-03-16 22:22:04 +0000936 ep->rx_ring[i].rxstatus = DescOwn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937 }
938 ep->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
939
940 /* The Tx buffer descriptor is filled in as needed, but we
941 do need to clear the ownership bit. */
942 for (i = 0; i < TX_RING_SIZE; i++) {
943 ep->tx_skbuff[i] = NULL;
944 ep->tx_ring[i].txstatus = 0x0000;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400945 ep->tx_ring[i].next = ep->tx_ring_dma +
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 (i+1)*sizeof(struct epic_tx_desc);
947 }
948 ep->tx_ring[i-1].next = ep->tx_ring_dma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949}
950
Stephen Hemminger613573252009-08-31 19:50:58 +0000951static netdev_tx_t epic_start_xmit(struct sk_buff *skb, struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952{
Wang Chen4cf16532008-11-12 23:38:14 -0800953 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +0100954 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955 int entry, free_count;
956 u32 ctrl_word;
957 unsigned long flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400958
Herbert Xu5b057c62006-06-23 02:06:41 -0700959 if (skb_padto(skb, ETH_ZLEN))
Patrick McHardy6ed10652009-06-23 06:03:08 +0000960 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961
962 /* Caution: the write order is important here, set the field with the
963 "ownership" bit last. */
964
965 /* Calculate the next Tx descriptor entry. */
966 spin_lock_irqsave(&ep->lock, flags);
967 free_count = ep->cur_tx - ep->dirty_tx;
968 entry = ep->cur_tx % TX_RING_SIZE;
969
970 ep->tx_skbuff[entry] = skb;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400971 ep->tx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 skb->len, PCI_DMA_TODEVICE);
973 if (free_count < TX_QUEUE_LEN/2) {/* Typical path */
Al Viro9ebfd492008-03-16 22:22:04 +0000974 ctrl_word = 0x100000; /* No interrupt */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 } else if (free_count == TX_QUEUE_LEN/2) {
Al Viro9ebfd492008-03-16 22:22:04 +0000976 ctrl_word = 0x140000; /* Tx-done intr. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 } else if (free_count < TX_QUEUE_LEN - 1) {
Al Viro9ebfd492008-03-16 22:22:04 +0000978 ctrl_word = 0x100000; /* No Tx-done intr. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 } else {
980 /* Leave room for an additional entry. */
Al Viro9ebfd492008-03-16 22:22:04 +0000981 ctrl_word = 0x140000; /* Tx-done intr. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 ep->tx_full = 1;
983 }
Al Viro9ebfd492008-03-16 22:22:04 +0000984 ep->tx_ring[entry].buflength = ctrl_word | skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 ep->tx_ring[entry].txstatus =
986 ((skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN) << 16)
Al Viro9ebfd492008-03-16 22:22:04 +0000987 | DescOwn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988
989 ep->cur_tx++;
990 if (ep->tx_full)
991 netif_stop_queue(dev);
992
993 spin_unlock_irqrestore(&ep->lock, flags);
994 /* Trigger an immediate transmit demand. */
Francois Romieuaae9bc32012-03-13 12:04:26 +0100995 ew32(COMMAND, TxQueued);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 if (debug > 4)
998 printk(KERN_DEBUG "%s: Queued Tx packet size %d to slot %d, "
Francois Romieuaae9bc32012-03-13 12:04:26 +0100999 "flag %2.2x Tx status %8.8x.\n", dev->name, skb->len,
1000 entry, ctrl_word, er32(TxSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001
Patrick McHardy6ed10652009-06-23 06:03:08 +00001002 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003}
1004
1005static void epic_tx_error(struct net_device *dev, struct epic_private *ep,
1006 int status)
1007{
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001008 struct net_device_stats *stats = &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009
1010#ifndef final_version
1011 /* There was an major error, log it. */
1012 if (debug > 1)
1013 printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
1014 dev->name, status);
1015#endif
1016 stats->tx_errors++;
1017 if (status & 0x1050)
1018 stats->tx_aborted_errors++;
1019 if (status & 0x0008)
1020 stats->tx_carrier_errors++;
1021 if (status & 0x0040)
1022 stats->tx_window_errors++;
1023 if (status & 0x0010)
1024 stats->tx_fifo_errors++;
1025}
1026
1027static void epic_tx(struct net_device *dev, struct epic_private *ep)
1028{
1029 unsigned int dirty_tx, cur_tx;
1030
1031 /*
1032 * Note: if this lock becomes a problem we can narrow the locked
1033 * region at the cost of occasionally grabbing the lock more times.
1034 */
1035 cur_tx = ep->cur_tx;
1036 for (dirty_tx = ep->dirty_tx; cur_tx - dirty_tx > 0; dirty_tx++) {
1037 struct sk_buff *skb;
1038 int entry = dirty_tx % TX_RING_SIZE;
Al Viro9ebfd492008-03-16 22:22:04 +00001039 int txstatus = ep->tx_ring[entry].txstatus;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
1041 if (txstatus & DescOwn)
1042 break; /* It still hasn't been Txed */
1043
1044 if (likely(txstatus & 0x0001)) {
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001045 dev->stats.collisions += (txstatus >> 8) & 15;
1046 dev->stats.tx_packets++;
1047 dev->stats.tx_bytes += ep->tx_skbuff[entry]->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 } else
1049 epic_tx_error(dev, ep, txstatus);
1050
1051 /* Free the original skb. */
1052 skb = ep->tx_skbuff[entry];
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001053 pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 skb->len, PCI_DMA_TODEVICE);
1055 dev_kfree_skb_irq(skb);
1056 ep->tx_skbuff[entry] = NULL;
1057 }
1058
1059#ifndef final_version
1060 if (cur_tx - dirty_tx > TX_RING_SIZE) {
1061 printk(KERN_WARNING
1062 "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
1063 dev->name, dirty_tx, cur_tx, ep->tx_full);
1064 dirty_tx += TX_RING_SIZE;
1065 }
1066#endif
1067 ep->dirty_tx = dirty_tx;
1068 if (ep->tx_full && cur_tx - dirty_tx < TX_QUEUE_LEN - 4) {
1069 /* The ring is no longer full, allow new TX entries. */
1070 ep->tx_full = 0;
1071 netif_wake_queue(dev);
1072 }
1073}
1074
1075/* The interrupt handler does all of the Rx thread work and cleans up
1076 after the Tx thread. */
David Howells7d12e782006-10-05 14:55:46 +01001077static irqreturn_t epic_interrupt(int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078{
1079 struct net_device *dev = dev_instance;
Wang Chen4cf16532008-11-12 23:38:14 -08001080 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001081 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 unsigned int handled = 0;
1083 int status;
1084
Francois Romieuaae9bc32012-03-13 12:04:26 +01001085 status = er32(INTSTAT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 /* Acknowledge all of the current interrupt sources ASAP. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001087 ew32(INTSTAT, status & EpicNormalEvent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088
1089 if (debug > 4) {
1090 printk(KERN_DEBUG "%s: Interrupt, status=%#8.8x new "
Francois Romieuaae9bc32012-03-13 12:04:26 +01001091 "intstat=%#8.8x.\n", dev->name, status, er32(INTSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 }
1093
1094 if ((status & IntrSummary) == 0)
1095 goto out;
1096
1097 handled = 1;
1098
1099 if ((status & EpicNapiEvent) && !ep->reschedule_in_poll) {
1100 spin_lock(&ep->napi_lock);
Ben Hutchings288379f2009-01-19 16:43:59 -08001101 if (napi_schedule_prep(&ep->napi)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 epic_napi_irq_off(dev, ep);
Ben Hutchings288379f2009-01-19 16:43:59 -08001103 __napi_schedule(&ep->napi);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 } else
1105 ep->reschedule_in_poll++;
1106 spin_unlock(&ep->napi_lock);
1107 }
1108 status &= ~EpicNapiEvent;
1109
1110 /* Check uncommon events all at once. */
1111 if (status & (CntFull | TxUnderrun | PCIBusErr170 | PCIBusErr175)) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001112 struct net_device_stats *stats = &dev->stats;
1113
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114 if (status == EpicRemoved)
1115 goto out;
1116
1117 /* Always update the error counts to avoid overhead later. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001118 stats->rx_missed_errors += er8(MPCNT);
1119 stats->rx_frame_errors += er8(ALICNT);
1120 stats->rx_crc_errors += er8(CRCCNT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121
1122 if (status & TxUnderrun) { /* Tx FIFO underflow. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001123 stats->tx_fifo_errors++;
1124 ew32(TxThresh, ep->tx_threshold += 128);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 /* Restart the transmit process. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001126 ew32(COMMAND, RestartTx);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 }
1128 if (status & PCIBusErr170) {
1129 printk(KERN_ERR "%s: PCI Bus Error! status %4.4x.\n",
1130 dev->name, status);
1131 epic_pause(dev);
1132 epic_restart(dev);
1133 }
1134 /* Clear all error sources. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001135 ew32(INTSTAT, status & 0x7f18);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 }
1137
1138out:
1139 if (debug > 3) {
1140 printk(KERN_DEBUG "%s: exit interrupt, intr_status=%#4.4x.\n",
1141 dev->name, status);
1142 }
1143
1144 return IRQ_RETVAL(handled);
1145}
1146
1147static int epic_rx(struct net_device *dev, int budget)
1148{
Wang Chen4cf16532008-11-12 23:38:14 -08001149 struct epic_private *ep = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 int entry = ep->cur_rx % RX_RING_SIZE;
1151 int rx_work_limit = ep->dirty_rx + RX_RING_SIZE - ep->cur_rx;
1152 int work_done = 0;
1153
1154 if (debug > 4)
1155 printk(KERN_DEBUG " In epic_rx(), entry %d %8.8x.\n", entry,
1156 ep->rx_ring[entry].rxstatus);
1157
1158 if (rx_work_limit > budget)
1159 rx_work_limit = budget;
1160
1161 /* If we own the next entry, it's a new packet. Send it up. */
Al Viro9ebfd492008-03-16 22:22:04 +00001162 while ((ep->rx_ring[entry].rxstatus & DescOwn) == 0) {
1163 int status = ep->rx_ring[entry].rxstatus;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164
1165 if (debug > 4)
1166 printk(KERN_DEBUG " epic_rx() status was %8.8x.\n", status);
1167 if (--rx_work_limit < 0)
1168 break;
1169 if (status & 0x2006) {
1170 if (debug > 2)
1171 printk(KERN_DEBUG "%s: epic_rx() error status was %8.8x.\n",
1172 dev->name, status);
1173 if (status & 0x2000) {
1174 printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
1175 "multiple buffers, status %4.4x!\n", dev->name, status);
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001176 dev->stats.rx_length_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177 } else if (status & 0x0006)
1178 /* Rx Frame errors are counted in hardware. */
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001179 dev->stats.rx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 } else {
1181 /* Malloc up new buffer, compatible with net-2e. */
1182 /* Omit the four octet CRC from the length. */
1183 short pkt_len = (status >> 16) - 4;
1184 struct sk_buff *skb;
1185
1186 if (pkt_len > PKT_BUF_SZ - 4) {
1187 printk(KERN_ERR "%s: Oversized Ethernet frame, status %x "
1188 "%d bytes.\n",
1189 dev->name, status, pkt_len);
1190 pkt_len = 1514;
1191 }
1192 /* Check if the packet is long enough to accept without copying
1193 to a minimally-sized skbuff. */
Joe Perches8e95a202009-12-03 07:58:21 +00001194 if (pkt_len < rx_copybreak &&
Pradeep A. Dalvidae2e9f2012-02-06 11:16:13 +00001195 (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 skb_reserve(skb, 2); /* 16 byte align the IP header */
1197 pci_dma_sync_single_for_cpu(ep->pci_dev,
1198 ep->rx_ring[entry].bufaddr,
1199 ep->rx_buf_sz,
1200 PCI_DMA_FROMDEVICE);
David S. Miller8c7b7fa2007-07-10 22:08:12 -07001201 skb_copy_to_linear_data(skb, ep->rx_skbuff[entry]->data, pkt_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 skb_put(skb, pkt_len);
1203 pci_dma_sync_single_for_device(ep->pci_dev,
1204 ep->rx_ring[entry].bufaddr,
1205 ep->rx_buf_sz,
1206 PCI_DMA_FROMDEVICE);
1207 } else {
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001208 pci_unmap_single(ep->pci_dev,
1209 ep->rx_ring[entry].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
1211 skb_put(skb = ep->rx_skbuff[entry], pkt_len);
1212 ep->rx_skbuff[entry] = NULL;
1213 }
1214 skb->protocol = eth_type_trans(skb, dev);
1215 netif_receive_skb(skb);
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001216 dev->stats.rx_packets++;
1217 dev->stats.rx_bytes += pkt_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 }
1219 work_done++;
1220 entry = (++ep->cur_rx) % RX_RING_SIZE;
1221 }
1222
1223 /* Refill the Rx ring buffers. */
1224 for (; ep->cur_rx - ep->dirty_rx > 0; ep->dirty_rx++) {
1225 entry = ep->dirty_rx % RX_RING_SIZE;
1226 if (ep->rx_skbuff[entry] == NULL) {
1227 struct sk_buff *skb;
Pradeep A. Dalvidae2e9f2012-02-06 11:16:13 +00001228 skb = ep->rx_skbuff[entry] = netdev_alloc_skb(dev, ep->rx_buf_sz + 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 if (skb == NULL)
1230 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231 skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001232 ep->rx_ring[entry].bufaddr = pci_map_single(ep->pci_dev,
David S. Miller689be432005-06-28 15:25:31 -07001233 skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 work_done++;
1235 }
Al Viro9ebfd492008-03-16 22:22:04 +00001236 /* AV: shouldn't we add a barrier here? */
1237 ep->rx_ring[entry].rxstatus = DescOwn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 }
1239 return work_done;
1240}
1241
1242static void epic_rx_err(struct net_device *dev, struct epic_private *ep)
1243{
Francois Romieuaae9bc32012-03-13 12:04:26 +01001244 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245 int status;
1246
Francois Romieuaae9bc32012-03-13 12:04:26 +01001247 status = er32(INTSTAT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248
1249 if (status == EpicRemoved)
1250 return;
1251 if (status & RxOverflow) /* Missed a Rx frame. */
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001252 dev->stats.rx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 if (status & (RxOverflow | RxFull))
Francois Romieuaae9bc32012-03-13 12:04:26 +01001254 ew16(COMMAND, RxQueued);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255}
1256
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001257static int epic_poll(struct napi_struct *napi, int budget)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258{
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001259 struct epic_private *ep = container_of(napi, struct epic_private, napi);
1260 struct net_device *dev = ep->mii.dev;
1261 int work_done = 0;
Francois Romieuaae9bc32012-03-13 12:04:26 +01001262 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264rx_action:
1265
1266 epic_tx(dev, ep);
1267
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001268 work_done += epic_rx(dev, budget);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269
1270 epic_rx_err(dev, ep);
1271
David S. Miller4ec24112008-01-07 20:48:21 -08001272 if (work_done < budget) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 unsigned long flags;
1274 int more;
1275
1276 /* A bit baroque but it avoids a (space hungry) spin_unlock */
1277
1278 spin_lock_irqsave(&ep->napi_lock, flags);
1279
1280 more = ep->reschedule_in_poll;
1281 if (!more) {
Ben Hutchings288379f2009-01-19 16:43:59 -08001282 __napi_complete(napi);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001283 ew32(INTSTAT, EpicNapiEvent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 epic_napi_irq_on(dev, ep);
1285 } else
1286 ep->reschedule_in_poll--;
1287
1288 spin_unlock_irqrestore(&ep->napi_lock, flags);
1289
1290 if (more)
1291 goto rx_action;
1292 }
1293
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001294 return work_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295}
1296
1297static int epic_close(struct net_device *dev)
1298{
Wang Chen4cf16532008-11-12 23:38:14 -08001299 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001300 struct pci_dev *pdev = ep->pci_dev;
1301 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302 struct sk_buff *skb;
1303 int i;
1304
1305 netif_stop_queue(dev);
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001306 napi_disable(&ep->napi);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307
1308 if (debug > 1)
1309 printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
Francois Romieuaae9bc32012-03-13 12:04:26 +01001310 dev->name, er32(INTSTAT));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311
1312 del_timer_sync(&ep->timer);
1313
1314 epic_disable_int(dev, ep);
1315
Francois Romieuaae9bc32012-03-13 12:04:26 +01001316 free_irq(pdev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317
1318 epic_pause(dev);
1319
1320 /* Free all the skbuffs in the Rx queue. */
1321 for (i = 0; i < RX_RING_SIZE; i++) {
1322 skb = ep->rx_skbuff[i];
1323 ep->rx_skbuff[i] = NULL;
1324 ep->rx_ring[i].rxstatus = 0; /* Not owned by Epic chip. */
1325 ep->rx_ring[i].buflength = 0;
1326 if (skb) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001327 pci_unmap_single(pdev, ep->rx_ring[i].bufaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 ep->rx_buf_sz, PCI_DMA_FROMDEVICE);
1329 dev_kfree_skb(skb);
1330 }
1331 ep->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */
1332 }
1333 for (i = 0; i < TX_RING_SIZE; i++) {
1334 skb = ep->tx_skbuff[i];
1335 ep->tx_skbuff[i] = NULL;
1336 if (!skb)
1337 continue;
Francois Romieuaae9bc32012-03-13 12:04:26 +01001338 pci_unmap_single(pdev, ep->tx_ring[i].bufaddr, skb->len,
1339 PCI_DMA_TODEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 dev_kfree_skb(skb);
1341 }
1342
1343 /* Green! Leave the chip in low-power mode. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001344 ew32(GENCTL, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345
1346 return 0;
1347}
1348
1349static struct net_device_stats *epic_get_stats(struct net_device *dev)
1350{
Francois Romieuaae9bc32012-03-13 12:04:26 +01001351 struct epic_private *ep = netdev_priv(dev);
1352 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353
1354 if (netif_running(dev)) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001355 struct net_device_stats *stats = &dev->stats;
1356
1357 stats->rx_missed_errors += er8(MPCNT);
1358 stats->rx_frame_errors += er8(ALICNT);
1359 stats->rx_crc_errors += er8(CRCCNT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 }
1361
Kulikov Vasiliy275defc2010-07-05 02:13:20 +00001362 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363}
1364
1365/* Set or clear the multicast filter for this adaptor.
1366 Note that we only use exclusion around actually queueing the
1367 new frame, not around filling ep->setup_frame. This is non-deterministic
1368 when re-entered but still correct. */
1369
1370static void set_rx_mode(struct net_device *dev)
1371{
Wang Chen4cf16532008-11-12 23:38:14 -08001372 struct epic_private *ep = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001373 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374 unsigned char mc_filter[8]; /* Multicast hash filter */
1375 int i;
1376
1377 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001378 ew32(RxCtrl, 0x002c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379 /* Unconditionally log net taps. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 memset(mc_filter, 0xff, sizeof(mc_filter));
Jiri Pirko4cd24ea2010-02-08 04:30:35 +00001381 } else if ((!netdev_mc_empty(dev)) || (dev->flags & IFF_ALLMULTI)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 /* There is apparently a chip bug, so the multicast filter
1383 is never enabled. */
1384 /* Too many to filter perfectly -- accept all multicasts. */
1385 memset(mc_filter, 0xff, sizeof(mc_filter));
Francois Romieuaae9bc32012-03-13 12:04:26 +01001386 ew32(RxCtrl, 0x000c);
Jiri Pirko4cd24ea2010-02-08 04:30:35 +00001387 } else if (netdev_mc_empty(dev)) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001388 ew32(RxCtrl, 0x0004);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 return;
1390 } else { /* Never executed, for now. */
Jiri Pirko22bedad32010-04-01 21:22:57 +00001391 struct netdev_hw_addr *ha;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
1393 memset(mc_filter, 0, sizeof(mc_filter));
Jiri Pirko22bedad32010-04-01 21:22:57 +00001394 netdev_for_each_mc_addr(ha, dev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395 unsigned int bit_nr =
Jiri Pirko22bedad32010-04-01 21:22:57 +00001396 ether_crc_le(ETH_ALEN, ha->addr) & 0x3f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 mc_filter[bit_nr >> 3] |= (1 << bit_nr);
1398 }
1399 }
1400 /* ToDo: perhaps we need to stop the Tx and Rx process here? */
1401 if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) {
1402 for (i = 0; i < 4; i++)
Francois Romieuaae9bc32012-03-13 12:04:26 +01001403 ew16(MC0 + i*4, ((u16 *)mc_filter)[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 memcpy(ep->mc_filter, mc_filter, sizeof(mc_filter));
1405 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406}
1407
1408static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
1409{
Wang Chen4cf16532008-11-12 23:38:14 -08001410 struct epic_private *np = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411
Rick Jones68aad782011-11-07 13:29:27 +00001412 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
1413 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
1414 strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415}
1416
1417static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1418{
Wang Chen4cf16532008-11-12 23:38:14 -08001419 struct epic_private *np = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 int rc;
1421
1422 spin_lock_irq(&np->lock);
1423 rc = mii_ethtool_gset(&np->mii, cmd);
1424 spin_unlock_irq(&np->lock);
1425
1426 return rc;
1427}
1428
1429static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1430{
Wang Chen4cf16532008-11-12 23:38:14 -08001431 struct epic_private *np = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 int rc;
1433
1434 spin_lock_irq(&np->lock);
1435 rc = mii_ethtool_sset(&np->mii, cmd);
1436 spin_unlock_irq(&np->lock);
1437
1438 return rc;
1439}
1440
1441static int netdev_nway_reset(struct net_device *dev)
1442{
Wang Chen4cf16532008-11-12 23:38:14 -08001443 struct epic_private *np = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 return mii_nway_restart(&np->mii);
1445}
1446
1447static u32 netdev_get_link(struct net_device *dev)
1448{
Wang Chen4cf16532008-11-12 23:38:14 -08001449 struct epic_private *np = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 return mii_link_ok(&np->mii);
1451}
1452
1453static u32 netdev_get_msglevel(struct net_device *dev)
1454{
1455 return debug;
1456}
1457
1458static void netdev_set_msglevel(struct net_device *dev, u32 value)
1459{
1460 debug = value;
1461}
1462
1463static int ethtool_begin(struct net_device *dev)
1464{
Francois Romieuaae9bc32012-03-13 12:04:26 +01001465 struct epic_private *ep = netdev_priv(dev);
1466 void __iomem *ioaddr = ep->ioaddr;
1467
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 /* power-up, if interface is down */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001469 if (!netif_running(dev)) {
1470 ew32(GENCTL, 0x0200);
1471 ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472 }
1473 return 0;
1474}
1475
1476static void ethtool_complete(struct net_device *dev)
1477{
Francois Romieuaae9bc32012-03-13 12:04:26 +01001478 struct epic_private *ep = netdev_priv(dev);
1479 void __iomem *ioaddr = ep->ioaddr;
1480
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 /* power-down, if interface is down */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001482 if (!netif_running(dev)) {
1483 ew32(GENCTL, 0x0008);
1484 ew32(NVCTL, (er32(NVCTL) & ~0x483c) | 0x0000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 }
1486}
1487
Jeff Garzik7282d492006-09-13 14:30:00 -04001488static const struct ethtool_ops netdev_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 .get_drvinfo = netdev_get_drvinfo,
1490 .get_settings = netdev_get_settings,
1491 .set_settings = netdev_set_settings,
1492 .nway_reset = netdev_nway_reset,
1493 .get_link = netdev_get_link,
1494 .get_msglevel = netdev_get_msglevel,
1495 .set_msglevel = netdev_set_msglevel,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 .begin = ethtool_begin,
1497 .complete = ethtool_complete
1498};
1499
1500static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1501{
Wang Chen4cf16532008-11-12 23:38:14 -08001502 struct epic_private *np = netdev_priv(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001503 void __iomem *ioaddr = np->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 struct mii_ioctl_data *data = if_mii(rq);
1505 int rc;
1506
1507 /* power-up, if interface is down */
1508 if (! netif_running(dev)) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001509 ew32(GENCTL, 0x0200);
1510 ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 }
1512
1513 /* all non-ethtool ioctls (the SIOC[GS]MIIxxx ioctls) */
1514 spin_lock_irq(&np->lock);
1515 rc = generic_mii_ioctl(&np->mii, data, cmd, NULL);
1516 spin_unlock_irq(&np->lock);
1517
1518 /* power-down, if interface is down */
1519 if (! netif_running(dev)) {
Francois Romieuaae9bc32012-03-13 12:04:26 +01001520 ew32(GENCTL, 0x0008);
1521 ew32(NVCTL, (er32(NVCTL) & ~0x483c) | 0x0000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 }
1523 return rc;
1524}
1525
1526
Bill Pembertonb0171cd2012-12-03 09:23:42 -05001527static void epic_remove_one(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528{
1529 struct net_device *dev = pci_get_drvdata(pdev);
Wang Chen4cf16532008-11-12 23:38:14 -08001530 struct epic_private *ep = netdev_priv(dev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001531
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532 pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma);
1533 pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma);
1534 unregister_netdev(dev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001535 pci_iounmap(pdev, ep->ioaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 pci_release_regions(pdev);
1537 free_netdev(dev);
1538 pci_disable_device(pdev);
1539 pci_set_drvdata(pdev, NULL);
1540 /* pci_power_off(pdev, -1); */
1541}
1542
1543
1544#ifdef CONFIG_PM
1545
1546static int epic_suspend (struct pci_dev *pdev, pm_message_t state)
1547{
1548 struct net_device *dev = pci_get_drvdata(pdev);
Francois Romieuaae9bc32012-03-13 12:04:26 +01001549 struct epic_private *ep = netdev_priv(dev);
1550 void __iomem *ioaddr = ep->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551
1552 if (!netif_running(dev))
1553 return 0;
1554 epic_pause(dev);
1555 /* Put the chip into low-power mode. */
Francois Romieuaae9bc32012-03-13 12:04:26 +01001556 ew32(GENCTL, 0x0008);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557 /* pci_power_off(pdev, -1); */
1558 return 0;
1559}
1560
1561
1562static int epic_resume (struct pci_dev *pdev)
1563{
1564 struct net_device *dev = pci_get_drvdata(pdev);
1565
1566 if (!netif_running(dev))
1567 return 0;
1568 epic_restart(dev);
1569 /* pci_power_on(pdev); */
1570 return 0;
1571}
1572
1573#endif /* CONFIG_PM */
1574
1575
1576static struct pci_driver epic_driver = {
1577 .name = DRV_NAME,
1578 .id_table = epic_pci_tbl,
1579 .probe = epic_init_one,
Bill Pembertonb0171cd2012-12-03 09:23:42 -05001580 .remove = epic_remove_one,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581#ifdef CONFIG_PM
1582 .suspend = epic_suspend,
1583 .resume = epic_resume,
1584#endif /* CONFIG_PM */
1585};
1586
1587
1588static int __init epic_init (void)
1589{
1590/* when a module, this is printed whether or not devices are found in probe */
1591#ifdef MODULE
Joe Perchesad361c92009-07-06 13:05:40 -07001592 printk (KERN_INFO "%s%s",
Markus Dahms2c2a8c52007-05-09 07:58:10 +02001593 version, version2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594#endif
1595
Jeff Garzik29917622006-08-19 17:48:59 -04001596 return pci_register_driver(&epic_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597}
1598
1599
1600static void __exit epic_cleanup (void)
1601{
1602 pci_unregister_driver (&epic_driver);
1603}
1604
1605
1606module_init(epic_init);
1607module_exit(epic_cleanup);