blob: beddef98ad9249144426f99bdf04b97c15e8935f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* EtherLinkXL.c: A 3Com EtherLink PCI III/XL ethernet driver for linux. */
2/*
3 Written 1996-1999 by Donald Becker.
4
5 This software may be used and distributed according to the terms
6 of the GNU General Public License, incorporated herein by reference.
7
8 This driver is for the 3Com "Vortex" and "Boomerang" series ethercards.
9 Members of the series include Fast EtherLink 3c590/3c592/3c595/3c597
10 and the EtherLink XL 3c900 and 3c905 cards.
11
12 Problem reports and questions should be directed to
13 vortex@scyld.com
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
Linus Torvalds1da177e2005-04-16 15:20:36 -070020*/
21
22/*
23 * FIXME: This driver _could_ support MTU changing, but doesn't. See Don's hamachi.c implementation
24 * as well as other drivers
25 *
26 * NOTE: If you make 'vortex_debug' a constant (#define vortex_debug 0) the driver shrinks by 2k
27 * due to dead code elimination. There will be some performance benefits from this due to
28 * elimination of all the tests and reduced cache footprint.
29 */
30
31
32#define DRV_NAME "3c59x"
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
34
35
36/* A few values that may be tweaked. */
37/* Keep the ring sizes a power of two for efficiency. */
38#define TX_RING_SIZE 16
39#define RX_RING_SIZE 32
40#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
41
42/* "Knobs" that adjust features and parameters. */
43/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
44 Setting to > 1512 effectively disables this feature. */
45#ifndef __arm__
46static int rx_copybreak = 200;
47#else
48/* ARM systems perform better by disregarding the bus-master
49 transfer capability of these cards. -- rmk */
50static int rx_copybreak = 1513;
51#endif
52/* Allow setting MTU to a larger size, bypassing the normal ethernet setup. */
53static const int mtu = 1500;
54/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
55static int max_interrupt_work = 32;
56/* Tx timeout interval (millisecs) */
57static int watchdog = 5000;
58
59/* Allow aggregation of Tx interrupts. Saves CPU load at the cost
60 * of possible Tx stalls if the system is blocking interrupts
61 * somewhere else. Undefine this to disable.
62 */
63#define tx_interrupt_mitigation 1
64
65/* Put out somewhat more debugging messages. (0: no msg, 1 minimal .. 6). */
66#define vortex_debug debug
67#ifdef VORTEX_DEBUG
68static int vortex_debug = VORTEX_DEBUG;
69#else
70static int vortex_debug = 1;
71#endif
72
Linus Torvalds1da177e2005-04-16 15:20:36 -070073#include <linux/module.h>
74#include <linux/kernel.h>
75#include <linux/string.h>
76#include <linux/timer.h>
77#include <linux/errno.h>
78#include <linux/in.h>
79#include <linux/ioport.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#include <linux/interrupt.h>
81#include <linux/pci.h>
82#include <linux/mii.h>
83#include <linux/init.h>
84#include <linux/netdevice.h>
85#include <linux/etherdevice.h>
86#include <linux/skbuff.h>
87#include <linux/ethtool.h>
88#include <linux/highmem.h>
89#include <linux/eisa.h>
90#include <linux/bitops.h>
Marcelo Feitoza Parisiff5688a2006-01-09 18:37:15 -080091#include <linux/jiffies.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090092#include <linux/gfp.h>
Yinghai Lu60e4ad72008-08-19 20:49:50 -070093#include <asm/irq.h> /* For nr_irqs only. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070094#include <asm/io.h>
95#include <asm/uaccess.h>
96
97/* Kernel compatibility defines, some common to David Hinds' PCMCIA package.
98 This is only in the support-all-kernels source code. */
99
100#define RUN_AT(x) (jiffies + (x))
101
102#include <linux/delay.h>
103
104
Stephen Hemminger86de79b2009-02-26 10:19:24 +0000105static const char version[] __devinitconst =
106 DRV_NAME ": Donald Becker and others.\n";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
108MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
Steffen Klassert61238602006-03-26 01:37:42 -0800109MODULE_DESCRIPTION("3Com 3c59x/3c9xx ethernet driver ");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110MODULE_LICENSE("GPL");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111
112
113/* Operational parameter that usually are not changed. */
114
115/* The Vortex size is twice that of the original EtherLinkIII series: the
116 runtime register window, window 1, is now always mapped in.
117 The Boomerang size is twice as large as the Vortex -- it has additional
118 bus master control registers. */
119#define VORTEX_TOTAL_SIZE 0x20
120#define BOOMERANG_TOTAL_SIZE 0x40
121
122/* Set iff a MII transceiver on any interface requires mdio preamble.
123 This only set with the original DP83840 on older 3c905 boards, so the extra
124 code size of a per-interface flag is not worthwhile. */
125static char mii_preamble_required;
126
127#define PFX DRV_NAME ": "
128
129
130
131/*
132 Theory of Operation
133
134I. Board Compatibility
135
136This device driver is designed for the 3Com FastEtherLink and FastEtherLink
137XL, 3Com's PCI to 10/100baseT adapters. It also works with the 10Mbs
138versions of the FastEtherLink cards. The supported product IDs are
139 3c590, 3c592, 3c595, 3c597, 3c900, 3c905
140
141The related ISA 3c515 is supported with a separate driver, 3c515.c, included
142with the kernel source or available from
143 cesdis.gsfc.nasa.gov:/pub/linux/drivers/3c515.html
144
145II. Board-specific settings
146
147PCI bus devices are configured by the system at boot time, so no jumpers
148need to be set on the board. The system BIOS should be set to assign the
149PCI INTA signal to an otherwise unused system IRQ line.
150
151The EEPROM settings for media type and forced-full-duplex are observed.
152The EEPROM media type should be left at the default "autoselect" unless using
15310base2 or AUI connections which cannot be reliably detected.
154
155III. Driver operation
156
157The 3c59x series use an interface that's very similar to the previous 3c5x9
158series. The primary interface is two programmed-I/O FIFOs, with an
159alternate single-contiguous-region bus-master transfer (see next).
160
161The 3c900 "Boomerang" series uses a full-bus-master interface with separate
162lists of transmit and receive descriptors, similar to the AMD LANCE/PCnet,
163DEC Tulip and Intel Speedo3. The first chip version retains a compatible
164programmed-I/O interface that has been removed in 'B' and subsequent board
165revisions.
166
167One extension that is advertised in a very large font is that the adapters
168are capable of being bus masters. On the Vortex chip this capability was
169only for a single contiguous region making it far less useful than the full
170bus master capability. There is a significant performance impact of taking
171an extra interrupt or polling for the completion of each transfer, as well
172as difficulty sharing the single transfer engine between the transmit and
173receive threads. Using DMA transfers is a win only with large blocks or
174with the flawed versions of the Intel Orion motherboard PCI controller.
175
176The Boomerang chip's full-bus-master interface is useful, and has the
177currently-unused advantages over other similar chips that queued transmit
178packets may be reordered and receive buffer groups are associated with a
179single frame.
180
181With full-bus-master support, this driver uses a "RX_COPYBREAK" scheme.
182Rather than a fixed intermediate receive buffer, this scheme allocates
183full-sized skbuffs as receive buffers. The value RX_COPYBREAK is used as
184the copying breakpoint: it is chosen to trade-off the memory wasted by
185passing the full-sized skbuff to the queue layer for all frames vs. the
186copying cost of copying a frame to a correctly-sized skbuff.
187
188IIIC. Synchronization
189The driver runs as two independent, single-threaded flows of control. One
190is the send-packet routine, which enforces single-threaded use by the
191dev->tbusy flag. The other thread is the interrupt handler, which is single
192threaded by the hardware and other software.
193
194IV. Notes
195
196Thanks to Cameron Spitzer and Terry Murphy of 3Com for providing development
1973c590, 3c595, and 3c900 boards.
198The name "Vortex" is the internal 3Com project name for the PCI ASIC, and
199the EISA version is called "Demon". According to Terry these names come
200from rides at the local amusement park.
201
202The new chips support both ethernet (1.5K) and FDDI (4.5K) packet sizes!
203This driver only supports ethernet packets because of the skbuff allocation
204limit of 4K.
205*/
206
207/* This table drives the PCI probe routines. It's mostly boilerplate in all
208 of the drivers, and will likely be provided by some future kernel.
209*/
210enum pci_flags_bit {
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400211 PCI_USES_MASTER=4,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212};
213
214enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4, IS_TORNADO=8,
215 EEPROM_8BIT=0x10, /* AKPM: Uses 0x230 as the base bitmaps for EEPROM reads */
216 HAS_PWR_CTRL=0x20, HAS_MII=0x40, HAS_NWAY=0x80, HAS_CB_FNS=0x100,
217 INVERT_MII_PWR=0x200, INVERT_LED_PWR=0x400, MAX_COLLISION_RESET=0x800,
218 EEPROM_OFFSET=0x1000, HAS_HWCKSM=0x2000, WNO_XCVR_PWR=0x4000,
219 EXTRA_PREAMBLE=0x8000, EEPROM_RESET=0x10000, };
220
221enum vortex_chips {
222 CH_3C590 = 0,
223 CH_3C592,
224 CH_3C597,
225 CH_3C595_1,
226 CH_3C595_2,
227
228 CH_3C595_3,
229 CH_3C900_1,
230 CH_3C900_2,
231 CH_3C900_3,
232 CH_3C900_4,
233
234 CH_3C900_5,
235 CH_3C900B_FL,
236 CH_3C905_1,
237 CH_3C905_2,
Pascal Terjanb4adbb42009-08-05 04:11:39 +0000238 CH_3C905B_TX,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 CH_3C905B_1,
240
241 CH_3C905B_2,
242 CH_3C905B_FX,
243 CH_3C905C,
244 CH_3C9202,
245 CH_3C980,
246 CH_3C9805,
247
248 CH_3CSOHO100_TX,
249 CH_3C555,
250 CH_3C556,
251 CH_3C556B,
252 CH_3C575,
253
254 CH_3C575_1,
255 CH_3CCFE575,
256 CH_3CCFE575CT,
257 CH_3CCFE656,
258 CH_3CCFEM656,
259
260 CH_3CCFEM656_1,
261 CH_3C450,
262 CH_3C920,
263 CH_3C982A,
264 CH_3C982B,
265
266 CH_905BT4,
267 CH_920B_EMB_WNM,
268};
269
270
271/* note: this array directly indexed by above enums, and MUST
272 * be kept in sync with both the enums above, and the PCI device
273 * table below
274 */
275static struct vortex_chip_info {
276 const char *name;
277 int flags;
278 int drv_flags;
279 int io_size;
280} vortex_info_tbl[] __devinitdata = {
281 {"3c590 Vortex 10Mbps",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400282 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 {"3c592 EISA 10Mbps Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400284 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 {"3c597 EISA Fast Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400286 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 {"3c595 Vortex 100baseTx",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400288 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 {"3c595 Vortex 100baseT4",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400290 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
292 {"3c595 Vortex 100base-MII",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400293 PCI_USES_MASTER, IS_VORTEX, 32, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 {"3c900 Boomerang 10baseT",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400295 PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 {"3c900 Boomerang 10Mbps Combo",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400297 PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 {"3c900 Cyclone 10Mbps TPO", /* AKPM: from Don's 0.99M */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400299 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300 {"3c900 Cyclone 10Mbps Combo",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400301 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302
303 {"3c900 Cyclone 10Mbps TPC", /* AKPM: from Don's 0.99M */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400304 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305 {"3c900B-FL Cyclone 10base-FL",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400306 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 {"3c905 Boomerang 100baseTx",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400308 PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309 {"3c905 Boomerang 100baseT4",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400310 PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, },
Pascal Terjanb4adbb42009-08-05 04:11:39 +0000311 {"3C905B-TX Fast Etherlink XL PCI",
312 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313 {"3c905B Cyclone 100baseTx",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400314 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315
316 {"3c905B Cyclone 10/100/BNC",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400317 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318 {"3c905B-FX Cyclone 100baseFx",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400319 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320 {"3c905C Tornado",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400321 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 {"3c920B-EMB-WNM (ATI Radeon 9100 IGP)",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400323 PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324 {"3c980 Cyclone",
Gunnar Larischaa807f72008-05-05 14:01:28 +0200325 PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326
327 {"3c980C Python-T",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400328 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 {"3cSOHO100-TX Hurricane",
Steffen Klassertb8a1fce2007-07-09 11:50:23 -0700330 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 {"3c555 Laptop Hurricane",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400332 PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333 {"3c556 Laptop Tornado",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400334 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 HAS_HWCKSM, 128, },
336 {"3c556B Laptop Hurricane",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400337 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 WNO_XCVR_PWR|HAS_HWCKSM, 128, },
339
340 {"3c575 [Megahertz] 10/100 LAN CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400341 PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 {"3c575 Boomerang CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400343 PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344 {"3CCFE575BT Cyclone CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400345 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346 INVERT_LED_PWR|HAS_HWCKSM, 128, },
347 {"3CCFE575CT Tornado CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400348 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 MAX_COLLISION_RESET|HAS_HWCKSM, 128, },
350 {"3CCFE656 Cyclone CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400351 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 INVERT_LED_PWR|HAS_HWCKSM, 128, },
353
354 {"3CCFEM656B Cyclone+Winmodem CardBus",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400355 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356 INVERT_LED_PWR|HAS_HWCKSM, 128, },
357 {"3CXFEM656C Tornado+Winmodem CardBus", /* From pcmcia-cs-3.1.5 */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400358 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 MAX_COLLISION_RESET|HAS_HWCKSM, 128, },
360 {"3c450 HomePNA Tornado", /* AKPM: from Don's 0.99Q */
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400361 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 {"3c920 Tornado",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400363 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 {"3c982 Hydra Dual Port A",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400365 PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366
367 {"3c982 Hydra Dual Port B",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400368 PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 {"3c905B-T4",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400370 PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 {"3c920B-EMB-WNM Tornado",
Jeff Garzik1f1bd5f2006-06-26 23:47:50 -0400372 PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373
374 {NULL,}, /* NULL terminated list. */
375};
376
377
Alexey Dobriyana3aa1882010-01-07 11:58:11 +0000378static DEFINE_PCI_DEVICE_TABLE(vortex_pci_tbl) = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 { 0x10B7, 0x5900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C590 },
380 { 0x10B7, 0x5920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C592 },
381 { 0x10B7, 0x5970, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C597 },
382 { 0x10B7, 0x5950, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_1 },
383 { 0x10B7, 0x5951, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_2 },
384
385 { 0x10B7, 0x5952, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_3 },
386 { 0x10B7, 0x9000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_1 },
387 { 0x10B7, 0x9001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_2 },
388 { 0x10B7, 0x9004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_3 },
389 { 0x10B7, 0x9005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_4 },
390
391 { 0x10B7, 0x9006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_5 },
392 { 0x10B7, 0x900A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900B_FL },
393 { 0x10B7, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_1 },
394 { 0x10B7, 0x9051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_2 },
Pascal Terjanb4adbb42009-08-05 04:11:39 +0000395 { 0x10B7, 0x9054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_TX },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 { 0x10B7, 0x9055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_1 },
397
398 { 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 },
399 { 0x10B7, 0x905A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_FX },
400 { 0x10B7, 0x9200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905C },
401 { 0x10B7, 0x9202, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C9202 },
402 { 0x10B7, 0x9800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C980 },
403 { 0x10B7, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C9805 },
404
405 { 0x10B7, 0x7646, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CSOHO100_TX },
406 { 0x10B7, 0x5055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C555 },
407 { 0x10B7, 0x6055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C556 },
408 { 0x10B7, 0x6056, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C556B },
409 { 0x10B7, 0x5b57, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C575 },
410
411 { 0x10B7, 0x5057, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C575_1 },
412 { 0x10B7, 0x5157, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE575 },
413 { 0x10B7, 0x5257, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE575CT },
414 { 0x10B7, 0x6560, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE656 },
415 { 0x10B7, 0x6562, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFEM656 },
416
417 { 0x10B7, 0x6564, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFEM656_1 },
418 { 0x10B7, 0x4500, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C450 },
419 { 0x10B7, 0x9201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C920 },
420 { 0x10B7, 0x1201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C982A },
421 { 0x10B7, 0x1202, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C982B },
422
423 { 0x10B7, 0x9056, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_905BT4 },
424 { 0x10B7, 0x9210, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_920B_EMB_WNM },
425
426 {0,} /* 0 terminated list. */
427};
428MODULE_DEVICE_TABLE(pci, vortex_pci_tbl);
429
430
431/* Operational definitions.
432 These are not used by other compilation units and thus are not
433 exported in a ".h" file.
434
435 First the windows. There are eight register windows, with the command
436 and status registers available in each.
437 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438#define EL3_CMD 0x0e
439#define EL3_STATUS 0x0e
440
441/* The top five bits written to EL3_CMD are a command, the lower
442 11 bits are the parameter, if applicable.
443 Note that 11 parameters bits was fine for ethernet, but the new chip
444 can handle FDDI length frames (~4500 octets) and now parameters count
445 32-bit 'Dwords' rather than octets. */
446
447enum vortex_cmd {
448 TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
449 RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11,
450 UpStall = 6<<11, UpUnstall = (6<<11)+1,
451 DownStall = (6<<11)+2, DownUnstall = (6<<11)+3,
452 RxDiscard = 8<<11, TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
453 FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
454 SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
455 SetTxThreshold = 18<<11, SetTxStart = 19<<11,
456 StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11,
457 StatsDisable = 22<<11, StopCoax = 23<<11, SetFilterBit = 25<<11,};
458
459/* The SetRxFilter command accepts the following classes: */
460enum RxFilter {
461 RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
462
463/* Bits in the general status register. */
464enum vortex_status {
465 IntLatch = 0x0001, HostError = 0x0002, TxComplete = 0x0004,
466 TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
467 IntReq = 0x0040, StatsFull = 0x0080,
468 DMADone = 1<<8, DownComplete = 1<<9, UpComplete = 1<<10,
469 DMAInProgress = 1<<11, /* DMA controller is still busy.*/
470 CmdInProgress = 1<<12, /* EL3_CMD is still busy.*/
471};
472
473/* Register window 1 offsets, the window used in normal operation.
474 On the Vortex this window is always mapped at offsets 0x10-0x1f. */
475enum Window1 {
476 TX_FIFO = 0x10, RX_FIFO = 0x10, RxErrors = 0x14,
477 RxStatus = 0x18, Timer=0x1A, TxStatus = 0x1B,
478 TxFree = 0x1C, /* Remaining free bytes in Tx buffer. */
479};
480enum Window0 {
481 Wn0EepromCmd = 10, /* Window 0: EEPROM command register. */
482 Wn0EepromData = 12, /* Window 0: EEPROM results register. */
483 IntrStatus=0x0E, /* Valid in all windows. */
484};
485enum Win0_EEPROM_bits {
486 EEPROM_Read = 0x80, EEPROM_WRITE = 0x40, EEPROM_ERASE = 0xC0,
487 EEPROM_EWENB = 0x30, /* Enable erasing/writing for 10 msec. */
488 EEPROM_EWDIS = 0x00, /* Disable EWENB before 10 msec timeout. */
489};
490/* EEPROM locations. */
491enum eeprom_offset {
492 PhysAddr01=0, PhysAddr23=1, PhysAddr45=2, ModelID=3,
493 EtherLink3ID=7, IFXcvrIO=8, IRQLine=9,
494 NodeAddr01=10, NodeAddr23=11, NodeAddr45=12,
495 DriverTune=13, Checksum=15};
496
497enum Window2 { /* Window 2. */
498 Wn2_ResetOptions=12,
499};
500enum Window3 { /* Window 3: MAC/config bits. */
501 Wn3_Config=0, Wn3_MaxPktSize=4, Wn3_MAC_Ctrl=6, Wn3_Options=8,
502};
503
504#define BFEXT(value, offset, bitcount) \
505 ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1))
506
507#define BFINS(lhs, rhs, offset, bitcount) \
508 (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \
509 (((rhs) & ((1 << (bitcount)) - 1)) << (offset)))
510
511#define RAM_SIZE(v) BFEXT(v, 0, 3)
512#define RAM_WIDTH(v) BFEXT(v, 3, 1)
513#define RAM_SPEED(v) BFEXT(v, 4, 2)
514#define ROM_SIZE(v) BFEXT(v, 6, 2)
515#define RAM_SPLIT(v) BFEXT(v, 16, 2)
516#define XCVR(v) BFEXT(v, 20, 4)
517#define AUTOSELECT(v) BFEXT(v, 24, 1)
518
519enum Window4 { /* Window 4: Xcvr/media bits. */
520 Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
521};
522enum Win4_Media_bits {
523 Media_SQE = 0x0008, /* Enable SQE error counting for AUI. */
524 Media_10TP = 0x00C0, /* Enable link beat and jabber for 10baseT. */
525 Media_Lnk = 0x0080, /* Enable just link beat for 100TX/100FX. */
526 Media_LnkBeat = 0x0800,
527};
528enum Window7 { /* Window 7: Bus Master control. */
529 Wn7_MasterAddr = 0, Wn7_VlanEtherType=4, Wn7_MasterLen = 6,
530 Wn7_MasterStatus = 12,
531};
532/* Boomerang bus master control registers. */
533enum MasterCtrl {
534 PktStatus = 0x20, DownListPtr = 0x24, FragAddr = 0x28, FragLen = 0x2c,
535 TxFreeThreshold = 0x2f, UpPktStatus = 0x30, UpListPtr = 0x38,
536};
537
538/* The Rx and Tx descriptor lists.
539 Caution Alpha hackers: these types are 32 bits! Note also the 8 byte
540 alignment contraint on tx_ring[] and rx_ring[]. */
541#define LAST_FRAG 0x80000000 /* Last Addr/Len pair in descriptor. */
542#define DN_COMPLETE 0x00010000 /* This packet has been downloaded */
543struct boom_rx_desc {
Al Virocc2d6592007-08-22 21:34:46 -0400544 __le32 next; /* Last entry points to 0. */
545 __le32 status;
546 __le32 addr; /* Up to 63 addr/len pairs possible. */
547 __le32 length; /* Set LAST_FRAG to indicate last pair. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548};
549/* Values for the Rx status entry. */
550enum rx_desc_status {
551 RxDComplete=0x00008000, RxDError=0x4000,
552 /* See boomerang_rx() for actual error bits */
553 IPChksumErr=1<<25, TCPChksumErr=1<<26, UDPChksumErr=1<<27,
554 IPChksumValid=1<<29, TCPChksumValid=1<<30, UDPChksumValid=1<<31,
555};
556
557#ifdef MAX_SKB_FRAGS
558#define DO_ZEROCOPY 1
559#else
560#define DO_ZEROCOPY 0
561#endif
562
563struct boom_tx_desc {
Al Virocc2d6592007-08-22 21:34:46 -0400564 __le32 next; /* Last entry points to 0. */
565 __le32 status; /* bits 0:12 length, others see below. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566#if DO_ZEROCOPY
567 struct {
Al Virocc2d6592007-08-22 21:34:46 -0400568 __le32 addr;
569 __le32 length;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 } frag[1+MAX_SKB_FRAGS];
571#else
Al Virocc2d6592007-08-22 21:34:46 -0400572 __le32 addr;
573 __le32 length;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574#endif
575};
576
577/* Values for the Tx status entry. */
578enum tx_desc_status {
579 CRCDisable=0x2000, TxDComplete=0x8000,
580 AddIPChksum=0x02000000, AddTCPChksum=0x04000000, AddUDPChksum=0x08000000,
581 TxIntrUploaded=0x80000000, /* IRQ when in FIFO, but maybe not sent. */
582};
583
584/* Chip features we care about in vp->capabilities, read from the EEPROM. */
585enum ChipCaps { CapBusMaster=0x20, CapPwrMgmt=0x2000 };
586
587struct vortex_extra_stats {
Steffen Klassert8d1d0342006-02-03 03:03:57 -0800588 unsigned long tx_deferred;
589 unsigned long tx_max_collisions;
590 unsigned long tx_multiple_collisions;
591 unsigned long tx_single_collisions;
592 unsigned long rx_bad_ssd;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593};
594
595struct vortex_private {
596 /* The Rx and Tx rings should be quad-word-aligned. */
597 struct boom_rx_desc* rx_ring;
598 struct boom_tx_desc* tx_ring;
599 dma_addr_t rx_ring_dma;
600 dma_addr_t tx_ring_dma;
601 /* The addresses of transmit- and receive-in-place skbuffs. */
602 struct sk_buff* rx_skbuff[RX_RING_SIZE];
603 struct sk_buff* tx_skbuff[TX_RING_SIZE];
604 unsigned int cur_rx, cur_tx; /* The next free ring entry */
605 unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606 struct vortex_extra_stats xstats; /* NIC-specific extra stats */
607 struct sk_buff *tx_skb; /* Packet being eaten by bus master ctrl. */
608 dma_addr_t tx_skb_dma; /* Allocated DMA address for bus master ctrl DMA. */
609
610 /* PCI configuration space information. */
611 struct device *gendev;
John W. Linville62afe592005-11-07 00:58:02 -0800612 void __iomem *ioaddr; /* IO address space */
613 void __iomem *cb_fn_base; /* CardBus function status addr space. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614
615 /* Some values here only for performance evaluation and path-coverage */
616 int rx_nocopy, rx_copy, queued_packet, rx_csumhits;
617 int card_idx;
618
619 /* The remainder are related to chip state, mostly media selection. */
620 struct timer_list timer; /* Media selection timer. */
621 struct timer_list rx_oom_timer; /* Rx skb allocation retry timer */
622 int options; /* User-settable misc. driver options. */
623 unsigned int media_override:4, /* Passed-in media type. */
624 default_media:4, /* Read from the EEPROM/Wn3_Config. */
Steffen Klassert09ce35122006-03-31 02:30:48 -0800625 full_duplex:1, autoselect:1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626 bus_master:1, /* Vortex can only do a fragment bus-m. */
627 full_bus_master_tx:1, full_bus_master_rx:2, /* Boomerang */
628 flow_ctrl:1, /* Use 802.3x flow control (PAUSE only) */
629 partner_flow_ctrl:1, /* Partner supports flow control */
630 has_nway:1,
631 enable_wol:1, /* Wake-on-LAN is enabled */
632 pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */
633 open:1,
634 medialock:1,
635 must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */
636 large_frames:1; /* accept large frames */
637 int drv_flags;
638 u16 status_enable;
639 u16 intr_enable;
640 u16 available_media; /* From Wn3_Options. */
641 u16 capabilities, info1, info2; /* Various, from EEPROM. */
642 u16 advertising; /* NWay media advertisement */
643 unsigned char phys[2]; /* MII device addresses. */
644 u16 deferred; /* Resend these interrupts when we
645 * bale from the ISR */
646 u16 io_size; /* Size of PCI region (for release_region) */
647 spinlock_t lock; /* Serialise access to device & its vortex_private */
648 struct mii_if_info mii; /* MII lib hooks/info */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +0000649 int window; /* Register window */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650};
651
Ben Hutchingsa095cfc2010-06-23 13:54:31 +0000652static void window_set(struct vortex_private *vp, int window)
653{
654 if (window != vp->window) {
655 iowrite16(SelectWindow + window, vp->ioaddr + EL3_CMD);
656 vp->window = window;
657 }
658}
659
660#define DEFINE_WINDOW_IO(size) \
661static u ## size \
662window_read ## size(struct vortex_private *vp, int window, int addr) \
663{ \
664 window_set(vp, window); \
665 return ioread ## size(vp->ioaddr + addr); \
666} \
667static void \
668window_write ## size(struct vortex_private *vp, u ## size value, \
669 int window, int addr) \
670{ \
671 window_set(vp, window); \
672 iowrite ## size(value, vp->ioaddr + addr); \
673}
674DEFINE_WINDOW_IO(8)
675DEFINE_WINDOW_IO(16)
676DEFINE_WINDOW_IO(32)
677
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678#ifdef CONFIG_PCI
679#define DEVICE_PCI(dev) (((dev)->bus == &pci_bus_type) ? to_pci_dev((dev)) : NULL)
680#else
681#define DEVICE_PCI(dev) NULL
682#endif
683
684#define VORTEX_PCI(vp) (((vp)->gendev) ? DEVICE_PCI((vp)->gendev) : NULL)
685
686#ifdef CONFIG_EISA
687#define DEVICE_EISA(dev) (((dev)->bus == &eisa_bus_type) ? to_eisa_device((dev)) : NULL)
688#else
689#define DEVICE_EISA(dev) NULL
690#endif
691
692#define VORTEX_EISA(vp) (((vp)->gendev) ? DEVICE_EISA((vp)->gendev) : NULL)
693
694/* The action to take with a media selection timer tick.
695 Note that we deviate from the 3Com order by checking 10base2 before AUI.
696 */
697enum xcvr_types {
698 XCVR_10baseT=0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx,
699 XCVR_100baseFx, XCVR_MII=6, XCVR_NWAY=8, XCVR_ExtMII=9, XCVR_Default=10,
700};
701
Arjan van de Venf71e1302006-03-03 21:33:57 -0500702static const struct media_table {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 char *name;
704 unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */
705 mask:8, /* The transceiver-present bit in Wn3_Config.*/
706 next:8; /* The media type to try next. */
707 int wait; /* Time before we check media status. */
708} media_tbl[] = {
709 { "10baseT", Media_10TP,0x08, XCVR_10base2, (14*HZ)/10},
710 { "10Mbs AUI", Media_SQE, 0x20, XCVR_Default, (1*HZ)/10},
711 { "undefined", 0, 0x80, XCVR_10baseT, 10000},
712 { "10base2", 0, 0x10, XCVR_AUI, (1*HZ)/10},
713 { "100baseTX", Media_Lnk, 0x02, XCVR_100baseFx, (14*HZ)/10},
714 { "100baseFX", Media_Lnk, 0x04, XCVR_MII, (14*HZ)/10},
715 { "MII", 0, 0x41, XCVR_10baseT, 3*HZ },
716 { "undefined", 0, 0x01, XCVR_10baseT, 10000},
717 { "Autonegotiate", 0, 0x41, XCVR_10baseT, 3*HZ},
718 { "MII-External", 0, 0x41, XCVR_10baseT, 3*HZ },
719 { "Default", 0, 0xFF, XCVR_10baseT, 10000},
720};
721
722static struct {
723 const char str[ETH_GSTRING_LEN];
724} ethtool_stats_keys[] = {
725 { "tx_deferred" },
Steffen Klassert8d1d0342006-02-03 03:03:57 -0800726 { "tx_max_collisions" },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 { "tx_multiple_collisions" },
Steffen Klassert8d1d0342006-02-03 03:03:57 -0800728 { "tx_single_collisions" },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 { "rx_bad_ssd" },
730};
731
732/* number of ETHTOOL_GSTATS u64's */
Steffen Klassert8d1d0342006-02-03 03:03:57 -0800733#define VORTEX_NUM_STATS 5
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734
John W. Linville62afe592005-11-07 00:58:02 -0800735static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 int chip_idx, int card_idx);
Mark Hindleyc8303d12007-08-16 11:28:40 +0100737static int vortex_up(struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738static void vortex_down(struct net_device *dev, int final);
739static int vortex_open(struct net_device *dev);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +0000740static void mdio_sync(struct vortex_private *vp, int bits);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741static int mdio_read(struct net_device *dev, int phy_id, int location);
742static void mdio_write(struct net_device *vp, int phy_id, int location, int value);
743static void vortex_timer(unsigned long arg);
744static void rx_oom_timer(unsigned long arg);
Stephen Hemminger27a1de92009-08-31 19:50:54 +0000745static netdev_tx_t vortex_start_xmit(struct sk_buff *skb,
746 struct net_device *dev);
747static netdev_tx_t boomerang_start_xmit(struct sk_buff *skb,
748 struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749static int vortex_rx(struct net_device *dev);
750static int boomerang_rx(struct net_device *dev);
David Howells7d12e782006-10-05 14:55:46 +0100751static irqreturn_t vortex_interrupt(int irq, void *dev_id);
752static irqreturn_t boomerang_interrupt(int irq, void *dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753static int vortex_close(struct net_device *dev);
754static void dump_tx_ring(struct net_device *dev);
John W. Linville62afe592005-11-07 00:58:02 -0800755static void update_stats(void __iomem *ioaddr, struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756static struct net_device_stats *vortex_get_stats(struct net_device *dev);
757static void set_rx_mode(struct net_device *dev);
758#ifdef CONFIG_PCI
759static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
760#endif
761static void vortex_tx_timeout(struct net_device *dev);
762static void acpi_set_WOL(struct net_device *dev);
Jeff Garzik7282d492006-09-13 14:30:00 -0400763static const struct ethtool_ops vortex_ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764static void set_8021q_mode(struct net_device *dev, int enable);
765
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766/* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
767/* Option count limit only -- unlimited interfaces are supported. */
768#define MAX_UNITS 8
John W. Linville9954ab72005-11-07 00:58:06 -0800769static int options[MAX_UNITS] = { [0 ... MAX_UNITS-1] = -1 };
770static int full_duplex[MAX_UNITS] = {[0 ... MAX_UNITS-1] = -1 };
771static int hw_checksums[MAX_UNITS] = {[0 ... MAX_UNITS-1] = -1 };
772static int flow_ctrl[MAX_UNITS] = {[0 ... MAX_UNITS-1] = -1 };
773static int enable_wol[MAX_UNITS] = {[0 ... MAX_UNITS-1] = -1 };
John W. Linville900fd172005-11-07 00:58:08 -0800774static int use_mmio[MAX_UNITS] = {[0 ... MAX_UNITS-1] = -1 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775static int global_options = -1;
776static int global_full_duplex = -1;
777static int global_enable_wol = -1;
John W. Linville900fd172005-11-07 00:58:08 -0800778static int global_use_mmio = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780/* Variables to work-around the Compaq PCI BIOS32 problem. */
781static int compaq_ioaddr, compaq_irq, compaq_device_id = 0x5900;
782static struct net_device *compaq_net_device;
783
784static int vortex_cards_found;
785
786module_param(debug, int, 0);
787module_param(global_options, int, 0);
788module_param_array(options, int, NULL, 0);
789module_param(global_full_duplex, int, 0);
790module_param_array(full_duplex, int, NULL, 0);
791module_param_array(hw_checksums, int, NULL, 0);
792module_param_array(flow_ctrl, int, NULL, 0);
793module_param(global_enable_wol, int, 0);
794module_param_array(enable_wol, int, NULL, 0);
795module_param(rx_copybreak, int, 0);
796module_param(max_interrupt_work, int, 0);
797module_param(compaq_ioaddr, int, 0);
798module_param(compaq_irq, int, 0);
799module_param(compaq_device_id, int, 0);
800module_param(watchdog, int, 0);
John W. Linville900fd172005-11-07 00:58:08 -0800801module_param(global_use_mmio, int, 0);
802module_param_array(use_mmio, int, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803MODULE_PARM_DESC(debug, "3c59x debug level (0-6)");
804MODULE_PARM_DESC(options, "3c59x: Bits 0-3: media type, bit 4: bus mastering, bit 9: full duplex");
805MODULE_PARM_DESC(global_options, "3c59x: same as options, but applies to all NICs if options is unset");
806MODULE_PARM_DESC(full_duplex, "3c59x full duplex setting(s) (1)");
John W. Linville46e5e4a2005-11-07 00:58:06 -0800807MODULE_PARM_DESC(global_full_duplex, "3c59x: same as full_duplex, but applies to all NICs if full_duplex is unset");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808MODULE_PARM_DESC(hw_checksums, "3c59x Hardware checksum checking by adapter(s) (0-1)");
809MODULE_PARM_DESC(flow_ctrl, "3c59x 802.3x flow control usage (PAUSE only) (0-1)");
810MODULE_PARM_DESC(enable_wol, "3c59x: Turn on Wake-on-LAN for adapter(s) (0-1)");
John W. Linville46e5e4a2005-11-07 00:58:06 -0800811MODULE_PARM_DESC(global_enable_wol, "3c59x: same as enable_wol, but applies to all NICs if enable_wol is unset");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812MODULE_PARM_DESC(rx_copybreak, "3c59x copy breakpoint for copy-only-tiny-frames");
813MODULE_PARM_DESC(max_interrupt_work, "3c59x maximum events handled per interrupt");
814MODULE_PARM_DESC(compaq_ioaddr, "3c59x PCI I/O base address (Compaq BIOS problem workaround)");
815MODULE_PARM_DESC(compaq_irq, "3c59x PCI IRQ number (Compaq BIOS problem workaround)");
816MODULE_PARM_DESC(compaq_device_id, "3c59x PCI device ID (Compaq BIOS problem workaround)");
817MODULE_PARM_DESC(watchdog, "3c59x transmit timeout in milliseconds");
John W. Linville900fd172005-11-07 00:58:08 -0800818MODULE_PARM_DESC(global_use_mmio, "3c59x: same as use_mmio, but applies to all NICs if options is unset");
819MODULE_PARM_DESC(use_mmio, "3c59x: use memory-mapped PCI I/O resource (0-1)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820
821#ifdef CONFIG_NET_POLL_CONTROLLER
822static void poll_vortex(struct net_device *dev)
823{
824 struct vortex_private *vp = netdev_priv(dev);
825 unsigned long flags;
Jiri Kosina0d38ff12007-02-05 16:29:48 -0800826 local_irq_save(flags);
David Howells7d12e782006-10-05 14:55:46 +0100827 (vp->full_bus_master_rx ? boomerang_interrupt:vortex_interrupt)(dev->irq,dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828 local_irq_restore(flags);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400829}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830#endif
831
832#ifdef CONFIG_PM
833
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700834static int vortex_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835{
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700836 struct pci_dev *pdev = to_pci_dev(dev);
837 struct net_device *ndev = pci_get_drvdata(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700839 if (!ndev || !netif_running(ndev))
840 return 0;
841
842 netif_device_detach(ndev);
843 vortex_down(ndev, 1);
844
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 return 0;
846}
847
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700848static int vortex_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849{
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700850 struct pci_dev *pdev = to_pci_dev(dev);
851 struct net_device *ndev = pci_get_drvdata(pdev);
Dmitriy Monakhove1265152007-03-06 02:41:59 -0800852 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700854 if (!ndev || !netif_running(ndev))
855 return 0;
856
857 err = vortex_up(ndev);
858 if (err)
859 return err;
860
861 netif_device_attach(ndev);
862
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 return 0;
864}
865
Alexey Dobriyan47145212009-12-14 18:00:08 -0800866static const struct dev_pm_ops vortex_pm_ops = {
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -0700867 .suspend = vortex_suspend,
868 .resume = vortex_resume,
869 .freeze = vortex_suspend,
870 .thaw = vortex_resume,
871 .poweroff = vortex_suspend,
872 .restore = vortex_resume,
873};
874
875#define VORTEX_PM_OPS (&vortex_pm_ops)
876
877#else /* !CONFIG_PM */
878
879#define VORTEX_PM_OPS NULL
880
881#endif /* !CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882
883#ifdef CONFIG_EISA
884static struct eisa_device_id vortex_eisa_ids[] = {
885 { "TCM5920", CH_3C592 },
886 { "TCM5970", CH_3C597 },
887 { "" }
888};
Michael Tokarev07563c72006-09-27 01:50:56 -0700889MODULE_DEVICE_TABLE(eisa, vortex_eisa_ids);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890
Ralf Baechle95c408a2007-03-08 15:33:16 +0000891static int __init vortex_eisa_probe(struct device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892{
John W. Linville62afe592005-11-07 00:58:02 -0800893 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 struct eisa_device *edev;
895
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800896 edev = to_eisa_device(device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897
John W. Linville62afe592005-11-07 00:58:02 -0800898 if (!request_region(edev->base_addr, VORTEX_TOTAL_SIZE, DRV_NAME))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 return -EBUSY;
900
John W. Linville62afe592005-11-07 00:58:02 -0800901 ioaddr = ioport_map(edev->base_addr, VORTEX_TOTAL_SIZE);
902
903 if (vortex_probe1(device, ioaddr, ioread16(ioaddr + 0xC88) >> 12,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904 edev->id.driver_data, vortex_cards_found)) {
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800905 release_region(edev->base_addr, VORTEX_TOTAL_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 return -ENODEV;
907 }
908
909 vortex_cards_found++;
910
911 return 0;
912}
913
Ralf Baechle95c408a2007-03-08 15:33:16 +0000914static int __devexit vortex_eisa_remove(struct device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915{
916 struct eisa_device *edev;
917 struct net_device *dev;
918 struct vortex_private *vp;
John W. Linville62afe592005-11-07 00:58:02 -0800919 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800921 edev = to_eisa_device(device);
922 dev = eisa_get_drvdata(edev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923
924 if (!dev) {
Alexander Beregalov39738e12009-05-26 12:35:26 +0000925 pr_err("vortex_eisa_remove called for Compaq device!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 BUG();
927 }
928
929 vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -0800930 ioaddr = vp->ioaddr;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400931
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800932 unregister_netdev(dev);
933 iowrite16(TotalReset|0x14, ioaddr + EL3_CMD);
934 release_region(dev->base_addr, VORTEX_TOTAL_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800936 free_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937 return 0;
938}
Ralf Baechle95c408a2007-03-08 15:33:16 +0000939
940static struct eisa_driver vortex_eisa_driver = {
941 .id_table = vortex_eisa_ids,
942 .driver = {
943 .name = "3c59x",
944 .probe = vortex_eisa_probe,
945 .remove = __devexit_p(vortex_eisa_remove)
946 }
947};
948
949#endif /* CONFIG_EISA */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950
951/* returns count found (>= 0), or negative on error */
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800952static int __init vortex_eisa_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953{
954 int eisa_found = 0;
955 int orig_cards_found = vortex_cards_found;
956
957#ifdef CONFIG_EISA
Bjorn Helgaasc2f6fab2006-03-25 03:07:19 -0800958 int err;
959
960 err = eisa_driver_register (&vortex_eisa_driver);
961 if (!err) {
962 /*
963 * Because of the way EISA bus is probed, we cannot assume
964 * any device have been found when we exit from
965 * eisa_driver_register (the bus root driver may not be
966 * initialized yet). So we blindly assume something was
967 * found, and let the sysfs magic happend...
968 */
969 eisa_found = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 }
971#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400972
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 /* Special code to work-around the Compaq PCI BIOS32 problem. */
974 if (compaq_ioaddr) {
John W. Linville62afe592005-11-07 00:58:02 -0800975 vortex_probe1(NULL, ioport_map(compaq_ioaddr, VORTEX_TOTAL_SIZE),
976 compaq_irq, compaq_device_id, vortex_cards_found++);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 }
978
979 return vortex_cards_found - orig_cards_found + eisa_found;
980}
981
982/* returns count (>= 0), or negative on error */
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800983static int __devinit vortex_init_one(struct pci_dev *pdev,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 const struct pci_device_id *ent)
985{
John W. Linville900fd172005-11-07 00:58:08 -0800986 int rc, unit, pci_bar;
987 struct vortex_chip_info *vci;
988 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400990 /* wake up and enable device */
Steffen Klasserta880c4c2006-03-26 01:37:43 -0800991 rc = pci_enable_device(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 if (rc < 0)
993 goto out;
994
John W. Linville900fd172005-11-07 00:58:08 -0800995 unit = vortex_cards_found;
996
997 if (global_use_mmio < 0 && (unit >= MAX_UNITS || use_mmio[unit] < 0)) {
998 /* Determine the default if the user didn't override us */
999 vci = &vortex_info_tbl[ent->driver_data];
1000 pci_bar = vci->drv_flags & (IS_CYCLONE | IS_TORNADO) ? 1 : 0;
1001 } else if (unit < MAX_UNITS && use_mmio[unit] >= 0)
1002 pci_bar = use_mmio[unit] ? 1 : 0;
1003 else
1004 pci_bar = global_use_mmio ? 1 : 0;
1005
1006 ioaddr = pci_iomap(pdev, pci_bar, 0);
1007 if (!ioaddr) /* If mapping fails, fall-back to BAR 0... */
1008 ioaddr = pci_iomap(pdev, 0, 0);
1009
1010 rc = vortex_probe1(&pdev->dev, ioaddr, pdev->irq,
1011 ent->driver_data, unit);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 if (rc < 0) {
Steffen Klasserta880c4c2006-03-26 01:37:43 -08001013 pci_disable_device(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 goto out;
1015 }
1016
1017 vortex_cards_found++;
1018
1019out:
1020 return rc;
1021}
1022
Stephen Hemminger48b47a52009-01-09 13:01:18 +00001023static const struct net_device_ops boomrang_netdev_ops = {
1024 .ndo_open = vortex_open,
1025 .ndo_stop = vortex_close,
1026 .ndo_start_xmit = boomerang_start_xmit,
1027 .ndo_tx_timeout = vortex_tx_timeout,
1028 .ndo_get_stats = vortex_get_stats,
1029#ifdef CONFIG_PCI
1030 .ndo_do_ioctl = vortex_ioctl,
1031#endif
1032 .ndo_set_multicast_list = set_rx_mode,
1033 .ndo_change_mtu = eth_change_mtu,
1034 .ndo_set_mac_address = eth_mac_addr,
1035 .ndo_validate_addr = eth_validate_addr,
1036#ifdef CONFIG_NET_POLL_CONTROLLER
1037 .ndo_poll_controller = poll_vortex,
1038#endif
1039};
1040
1041static const struct net_device_ops vortex_netdev_ops = {
1042 .ndo_open = vortex_open,
1043 .ndo_stop = vortex_close,
1044 .ndo_start_xmit = vortex_start_xmit,
1045 .ndo_tx_timeout = vortex_tx_timeout,
1046 .ndo_get_stats = vortex_get_stats,
1047#ifdef CONFIG_PCI
1048 .ndo_do_ioctl = vortex_ioctl,
1049#endif
1050 .ndo_set_multicast_list = set_rx_mode,
1051 .ndo_change_mtu = eth_change_mtu,
1052 .ndo_set_mac_address = eth_mac_addr,
1053 .ndo_validate_addr = eth_validate_addr,
1054#ifdef CONFIG_NET_POLL_CONTROLLER
1055 .ndo_poll_controller = poll_vortex,
1056#endif
1057};
1058
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059/*
1060 * Start up the PCI/EISA device which is described by *gendev.
1061 * Return 0 on success.
1062 *
1063 * NOTE: pdev can be NULL, for the case of a Compaq device
1064 */
1065static int __devinit vortex_probe1(struct device *gendev,
John W. Linville62afe592005-11-07 00:58:02 -08001066 void __iomem *ioaddr, int irq,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 int chip_idx, int card_idx)
1068{
1069 struct vortex_private *vp;
1070 int option;
1071 unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
1072 int i, step;
1073 struct net_device *dev;
1074 static int printed_version;
1075 int retval, print_info;
1076 struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx];
Greg Kroah-Hartman361d5ee2008-07-02 12:46:22 -07001077 const char *print_name = "3c59x";
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 struct pci_dev *pdev = NULL;
1079 struct eisa_device *edev = NULL;
1080
1081 if (!printed_version) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001082 pr_info("%s", version);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 printed_version = 1;
1084 }
1085
1086 if (gendev) {
1087 if ((pdev = DEVICE_PCI(gendev))) {
1088 print_name = pci_name(pdev);
1089 }
1090
1091 if ((edev = DEVICE_EISA(gendev))) {
Kay Sieversfb28ad32008-11-10 13:55:14 -08001092 print_name = dev_name(&edev->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 }
1094 }
1095
1096 dev = alloc_etherdev(sizeof(*vp));
1097 retval = -ENOMEM;
1098 if (!dev) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001099 pr_err(PFX "unable to allocate etherdev, aborting\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 goto out;
1101 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 SET_NETDEV_DEV(dev, gendev);
1103 vp = netdev_priv(dev);
1104
1105 option = global_options;
1106
1107 /* The lower four bits are the media type. */
1108 if (dev->mem_start) {
1109 /*
1110 * The 'options' param is passed in as the third arg to the
1111 * LILO 'ether=' argument for non-modular use
1112 */
1113 option = dev->mem_start;
1114 }
1115 else if (card_idx < MAX_UNITS) {
1116 if (options[card_idx] >= 0)
1117 option = options[card_idx];
1118 }
1119
1120 if (option > 0) {
1121 if (option & 0x8000)
1122 vortex_debug = 7;
1123 if (option & 0x4000)
1124 vortex_debug = 2;
1125 if (option & 0x0400)
1126 vp->enable_wol = 1;
1127 }
1128
1129 print_info = (vortex_debug > 1);
1130 if (print_info)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001131 pr_info("See Documentation/networking/vortex.txt\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132
Alexander Beregalov39738e12009-05-26 12:35:26 +00001133 pr_info("%s: 3Com %s %s at %p.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 print_name,
1135 pdev ? "PCI" : "EISA",
1136 vci->name,
1137 ioaddr);
1138
John W. Linville62afe592005-11-07 00:58:02 -08001139 dev->base_addr = (unsigned long)ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 dev->irq = irq;
1141 dev->mtu = mtu;
John W. Linville62afe592005-11-07 00:58:02 -08001142 vp->ioaddr = ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143 vp->large_frames = mtu > 1500;
1144 vp->drv_flags = vci->drv_flags;
1145 vp->has_nway = (vci->drv_flags & HAS_NWAY) ? 1 : 0;
1146 vp->io_size = vci->io_size;
1147 vp->card_idx = card_idx;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001148 vp->window = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149
1150 /* module list only for Compaq device */
1151 if (gendev == NULL) {
1152 compaq_net_device = dev;
1153 }
1154
1155 /* PCI-only startup logic */
1156 if (pdev) {
1157 /* EISA resources already marked, so only PCI needs to do this here */
1158 /* Ignore return value, because Cardbus drivers already allocate for us */
John W. Linville62afe592005-11-07 00:58:02 -08001159 if (request_region(dev->base_addr, vci->io_size, print_name) != NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 vp->must_free_region = 1;
1161
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001162 /* enable bus-mastering if necessary */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 if (vci->flags & PCI_USES_MASTER)
Steffen Klasserta880c4c2006-03-26 01:37:43 -08001164 pci_set_master(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165
1166 if (vci->drv_flags & IS_VORTEX) {
1167 u8 pci_latency;
1168 u8 new_latency = 248;
1169
1170 /* Check the PCI latency value. On the 3c590 series the latency timer
1171 must be set to the maximum value to avoid data corruption that occurs
1172 when the timer expires during a transfer. This bug exists the Vortex
1173 chip only. */
1174 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &pci_latency);
1175 if (pci_latency < new_latency) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001176 pr_info("%s: Overriding PCI latency timer (CFLT) setting of %d, new value is %d.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177 print_name, pci_latency, new_latency);
Alexander Beregalov39738e12009-05-26 12:35:26 +00001178 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, new_latency);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 }
1180 }
1181 }
1182
1183 spin_lock_init(&vp->lock);
1184 vp->gendev = gendev;
1185 vp->mii.dev = dev;
1186 vp->mii.mdio_read = mdio_read;
1187 vp->mii.mdio_write = mdio_write;
1188 vp->mii.phy_id_mask = 0x1f;
1189 vp->mii.reg_num_mask = 0x1f;
1190
1191 /* Makes sure rings are at least 16 byte aligned. */
1192 vp->rx_ring = pci_alloc_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE
1193 + sizeof(struct boom_tx_desc) * TX_RING_SIZE,
1194 &vp->rx_ring_dma);
1195 retval = -ENOMEM;
Al Virocc2d6592007-08-22 21:34:46 -04001196 if (!vp->rx_ring)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 goto free_region;
1198
1199 vp->tx_ring = (struct boom_tx_desc *)(vp->rx_ring + RX_RING_SIZE);
1200 vp->tx_ring_dma = vp->rx_ring_dma + sizeof(struct boom_rx_desc) * RX_RING_SIZE;
1201
1202 /* if we are a PCI driver, we store info in pdev->driver_data
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001203 * instead of a module list */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204 if (pdev)
1205 pci_set_drvdata(pdev, dev);
1206 if (edev)
Steffen Klasserta880c4c2006-03-26 01:37:43 -08001207 eisa_set_drvdata(edev, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208
1209 vp->media_override = 7;
1210 if (option >= 0) {
1211 vp->media_override = ((option & 7) == 2) ? 0 : option & 15;
1212 if (vp->media_override != 7)
1213 vp->medialock = 1;
1214 vp->full_duplex = (option & 0x200) ? 1 : 0;
1215 vp->bus_master = (option & 16) ? 1 : 0;
1216 }
1217
1218 if (global_full_duplex > 0)
1219 vp->full_duplex = 1;
1220 if (global_enable_wol > 0)
1221 vp->enable_wol = 1;
1222
1223 if (card_idx < MAX_UNITS) {
1224 if (full_duplex[card_idx] > 0)
1225 vp->full_duplex = 1;
1226 if (flow_ctrl[card_idx] > 0)
1227 vp->flow_ctrl = 1;
1228 if (enable_wol[card_idx] > 0)
1229 vp->enable_wol = 1;
1230 }
1231
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001232 vp->mii.force_media = vp->full_duplex;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 vp->options = option;
1234 /* Read the station address from the EEPROM. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 {
1236 int base;
1237
1238 if (vci->drv_flags & EEPROM_8BIT)
1239 base = 0x230;
1240 else if (vci->drv_flags & EEPROM_OFFSET)
1241 base = EEPROM_Read + 0x30;
1242 else
1243 base = EEPROM_Read;
1244
1245 for (i = 0; i < 0x40; i++) {
1246 int timer;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001247 window_write16(vp, base + i, 0, Wn0EepromCmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 /* Pause for at least 162 us. for the read to take place. */
1249 for (timer = 10; timer >= 0; timer--) {
1250 udelay(162);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001251 if ((window_read16(vp, 0, Wn0EepromCmd) &
1252 0x8000) == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 break;
1254 }
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001255 eeprom[i] = window_read16(vp, 0, Wn0EepromData);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 }
1257 }
1258 for (i = 0; i < 0x18; i++)
1259 checksum ^= eeprom[i];
1260 checksum = (checksum ^ (checksum >> 8)) & 0xff;
1261 if (checksum != 0x00) { /* Grrr, needless incompatible change 3Com. */
1262 while (i < 0x21)
1263 checksum ^= eeprom[i++];
1264 checksum = (checksum ^ (checksum >> 8)) & 0xff;
1265 }
1266 if ((checksum != 0x00) && !(vci->drv_flags & IS_TORNADO))
Alexander Beregalov39738e12009-05-26 12:35:26 +00001267 pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 for (i = 0; i < 3; i++)
Al Virocc2d6592007-08-22 21:34:46 -04001269 ((__be16 *)dev->dev_addr)[i] = htons(eeprom[i + 10]);
John W. Linvillebb531fc2005-11-07 00:58:07 -08001270 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
Joe Perches0795af52007-10-03 17:59:30 -07001271 if (print_info)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001272 pr_cont(" %pM", dev->dev_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 /* Unfortunately an all zero eeprom passes the checksum and this
1274 gets found in the wild in failure cases. Crypto is hard 8) */
1275 if (!is_valid_ether_addr(dev->dev_addr)) {
1276 retval = -EINVAL;
Alexander Beregalov39738e12009-05-26 12:35:26 +00001277 pr_err("*** EEPROM MAC address is invalid.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001278 goto free_ring; /* With every pack */
1279 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280 for (i = 0; i < 6; i++)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001281 window_write8(vp, dev->dev_addr[i], 2, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 if (print_info)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001284 pr_cont(", IRQ %d\n", dev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285 /* Tell them about an invalid IRQ. */
Yinghai Lu60e4ad72008-08-19 20:49:50 -07001286 if (dev->irq <= 0 || dev->irq >= nr_irqs)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001287 pr_warning(" *** Warning: IRQ %d is unlikely to work! ***\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 dev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001290 step = (window_read8(vp, 4, Wn4_NetDiag) & 0x1e) >> 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001292 pr_info(" product code %02x%02x rev %02x.%d date %02d-%02d-%02d\n",
1293 eeprom[6]&0xff, eeprom[6]>>8, eeprom[0x14],
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 step, (eeprom[4]>>5) & 15, eeprom[4] & 31, eeprom[4]>>9);
1295 }
1296
1297
1298 if (pdev && vci->drv_flags & HAS_CB_FNS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299 unsigned short n;
1300
John W. Linville62afe592005-11-07 00:58:02 -08001301 vp->cb_fn_base = pci_iomap(pdev, 2, 0);
1302 if (!vp->cb_fn_base) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303 retval = -ENOMEM;
John W. Linville62afe592005-11-07 00:58:02 -08001304 goto free_ring;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 }
John W. Linville62afe592005-11-07 00:58:02 -08001306
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001308 pr_info("%s: CardBus functions mapped %16.16llx->%p\n",
Greg Kroah-Hartman7c7459d2006-06-12 15:13:08 -07001309 print_name,
1310 (unsigned long long)pci_resource_start(pdev, 2),
John W. Linville62afe592005-11-07 00:58:02 -08001311 vp->cb_fn_base);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001314 n = window_read16(vp, 2, Wn2_ResetOptions) & ~0x4010;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315 if (vp->drv_flags & INVERT_LED_PWR)
1316 n |= 0x10;
1317 if (vp->drv_flags & INVERT_MII_PWR)
1318 n |= 0x4000;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001319 window_write16(vp, n, 2, Wn2_ResetOptions);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 if (vp->drv_flags & WNO_XCVR_PWR) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001321 window_write16(vp, 0x0800, 0, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 }
1323 }
1324
1325 /* Extract our information from the EEPROM data. */
1326 vp->info1 = eeprom[13];
1327 vp->info2 = eeprom[15];
1328 vp->capabilities = eeprom[16];
1329
1330 if (vp->info1 & 0x8000) {
1331 vp->full_duplex = 1;
1332 if (print_info)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001333 pr_info("Full duplex capable\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 }
1335
1336 {
Arjan van de Venf71e1302006-03-03 21:33:57 -05001337 static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 unsigned int config;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001339 vp->available_media = window_read16(vp, 3, Wn3_Options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 if ((vp->available_media & 0xff) == 0) /* Broken 3c916 */
1341 vp->available_media = 0x40;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001342 config = window_read32(vp, 3, Wn3_Config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001344 pr_debug(" Internal config register is %4.4x, transceivers %#x.\n",
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001345 config, window_read16(vp, 3, Wn3_Options));
Alexander Beregalov39738e12009-05-26 12:35:26 +00001346 pr_info(" %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 8 << RAM_SIZE(config),
1348 RAM_WIDTH(config) ? "word" : "byte",
1349 ram_split[RAM_SPLIT(config)],
1350 AUTOSELECT(config) ? "autoselect/" : "",
1351 XCVR(config) > XCVR_ExtMII ? "<invalid transceiver>" :
1352 media_tbl[XCVR(config)].name);
1353 }
1354 vp->default_media = XCVR(config);
1355 if (vp->default_media == XCVR_NWAY)
1356 vp->has_nway = 1;
1357 vp->autoselect = AUTOSELECT(config);
1358 }
1359
1360 if (vp->media_override != 7) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001361 pr_info("%s: Media override to transceiver type %d (%s).\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 print_name, vp->media_override,
1363 media_tbl[vp->media_override].name);
1364 dev->if_port = vp->media_override;
1365 } else
1366 dev->if_port = vp->default_media;
1367
1368 if ((vp->available_media & 0x40) || (vci->drv_flags & HAS_NWAY) ||
1369 dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
1370 int phy, phy_idx = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 mii_preamble_required++;
1372 if (vp->drv_flags & EXTRA_PREAMBLE)
1373 mii_preamble_required++;
1374 mdio_sync(ioaddr, 32);
Neil Horman106427e2005-11-07 00:58:03 -08001375 mdio_read(dev, 24, MII_BMSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 for (phy = 0; phy < 32 && phy_idx < 1; phy++) {
1377 int mii_status, phyx;
1378
1379 /*
1380 * For the 3c905CX we look at index 24 first, because it bogusly
1381 * reports an external PHY at all indices
1382 */
1383 if (phy == 0)
1384 phyx = 24;
1385 else if (phy <= 24)
1386 phyx = phy - 1;
1387 else
1388 phyx = phy;
Neil Horman106427e2005-11-07 00:58:03 -08001389 mii_status = mdio_read(dev, phyx, MII_BMSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390 if (mii_status && mii_status != 0xffff) {
1391 vp->phys[phy_idx++] = phyx;
1392 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001393 pr_info(" MII transceiver found at address %d, status %4x.\n",
1394 phyx, mii_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395 }
1396 if ((mii_status & 0x0040) == 0)
1397 mii_preamble_required++;
1398 }
1399 }
1400 mii_preamble_required--;
1401 if (phy_idx == 0) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001402 pr_warning(" ***WARNING*** No MII transceivers found!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403 vp->phys[0] = 24;
1404 } else {
Neil Horman106427e2005-11-07 00:58:03 -08001405 vp->advertising = mdio_read(dev, vp->phys[0], MII_ADVERTISE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406 if (vp->full_duplex) {
1407 /* Only advertise the FD media types. */
1408 vp->advertising &= ~0x02A0;
1409 mdio_write(dev, vp->phys[0], 4, vp->advertising);
1410 }
1411 }
1412 vp->mii.phy_id = vp->phys[0];
1413 }
1414
1415 if (vp->capabilities & CapBusMaster) {
1416 vp->full_bus_master_tx = 1;
1417 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001418 pr_info(" Enabling bus-master transmits and %s receives.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 (vp->info2 & 1) ? "early" : "whole-frame" );
1420 }
1421 vp->full_bus_master_rx = (vp->info2 & 1) ? 1 : 2;
1422 vp->bus_master = 0; /* AKPM: vortex only */
1423 }
1424
1425 /* The 3c59x-specific entries in the device structure. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 if (vp->full_bus_master_tx) {
Stephen Hemminger48b47a52009-01-09 13:01:18 +00001427 dev->netdev_ops = &boomrang_netdev_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 /* Actually, it still should work with iommu. */
John W. Linville32fb5f02005-11-07 00:58:05 -08001429 if (card_idx < MAX_UNITS &&
1430 ((hw_checksums[card_idx] == -1 && (vp->drv_flags & HAS_HWCKSM)) ||
1431 hw_checksums[card_idx] == 1)) {
Stephen Hemmingerd311b0d2005-11-07 00:58:09 -08001432 dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 }
Stephen Hemminger48b47a52009-01-09 13:01:18 +00001434 } else
1435 dev->netdev_ops = &vortex_netdev_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436
1437 if (print_info) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001438 pr_info("%s: scatter/gather %sabled. h/w checksums %sabled\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 print_name,
1440 (dev->features & NETIF_F_SG) ? "en":"dis",
1441 (dev->features & NETIF_F_IP_CSUM) ? "en":"dis");
1442 }
1443
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 dev->ethtool_ops = &vortex_ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 dev->watchdog_timeo = (watchdog * HZ) / 1000;
Stephen Hemminger48b47a52009-01-09 13:01:18 +00001446
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 if (pdev) {
1448 vp->pm_state_valid = 1;
1449 pci_save_state(VORTEX_PCI(vp));
1450 acpi_set_WOL(dev);
1451 }
1452 retval = register_netdev(dev);
1453 if (retval == 0)
1454 return 0;
1455
1456free_ring:
1457 pci_free_consistent(pdev,
1458 sizeof(struct boom_rx_desc) * RX_RING_SIZE
1459 + sizeof(struct boom_tx_desc) * TX_RING_SIZE,
1460 vp->rx_ring,
1461 vp->rx_ring_dma);
1462free_region:
1463 if (vp->must_free_region)
John W. Linville62afe592005-11-07 00:58:02 -08001464 release_region(dev->base_addr, vci->io_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 free_netdev(dev);
Alexander Beregalov39738e12009-05-26 12:35:26 +00001466 pr_err(PFX "vortex_probe1 fails. Returns %d\n", retval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467out:
1468 return retval;
1469}
1470
1471static void
1472issue_and_wait(struct net_device *dev, int cmd)
1473{
John W. Linville62afe592005-11-07 00:58:02 -08001474 struct vortex_private *vp = netdev_priv(dev);
1475 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001476 int i;
1477
John W. Linville62afe592005-11-07 00:58:02 -08001478 iowrite16(cmd, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 for (i = 0; i < 2000; i++) {
John W. Linville62afe592005-11-07 00:58:02 -08001480 if (!(ioread16(ioaddr + EL3_STATUS) & CmdInProgress))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 return;
1482 }
1483
1484 /* OK, that didn't work. Do it the slow way. One second */
1485 for (i = 0; i < 100000; i++) {
John W. Linville62afe592005-11-07 00:58:02 -08001486 if (!(ioread16(ioaddr + EL3_STATUS) & CmdInProgress)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001488 pr_info("%s: command 0x%04x took %d usecs\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 dev->name, cmd, i * 10);
1490 return;
1491 }
1492 udelay(10);
1493 }
Alexander Beregalov39738e12009-05-26 12:35:26 +00001494 pr_err("%s: command 0x%04x did not complete! Status=0x%x\n",
John W. Linville62afe592005-11-07 00:58:02 -08001495 dev->name, cmd, ioread16(ioaddr + EL3_STATUS));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496}
1497
1498static void
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001499vortex_set_duplex(struct net_device *dev)
1500{
1501 struct vortex_private *vp = netdev_priv(dev);
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001502
Alexander Beregalov39738e12009-05-26 12:35:26 +00001503 pr_info("%s: setting %s-duplex.\n",
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001504 dev->name, (vp->full_duplex) ? "full" : "half");
1505
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001506 /* Set the full-duplex bit. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001507 window_write16(vp,
1508 ((vp->info1 & 0x8000) || vp->full_duplex ? 0x20 : 0) |
1509 (vp->large_frames ? 0x40 : 0) |
1510 ((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ?
1511 0x100 : 0),
1512 3, Wn3_MAC_Ctrl);
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001513}
1514
1515static void vortex_check_media(struct net_device *dev, unsigned int init)
1516{
1517 struct vortex_private *vp = netdev_priv(dev);
1518 unsigned int ok_to_print = 0;
1519
1520 if (vortex_debug > 3)
1521 ok_to_print = 1;
1522
1523 if (mii_check_media(&vp->mii, ok_to_print, init)) {
1524 vp->full_duplex = vp->mii.full_duplex;
1525 vortex_set_duplex(dev);
1526 } else if (init) {
1527 vortex_set_duplex(dev);
1528 }
1529}
1530
Mark Hindleyc8303d12007-08-16 11:28:40 +01001531static int
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532vortex_up(struct net_device *dev)
1533{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08001535 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 unsigned int config;
Badari Pulavarty0280f9f2007-10-17 16:15:56 -07001537 int i, mii_reg1, mii_reg5, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538
1539 if (VORTEX_PCI(vp)) {
1540 pci_set_power_state(VORTEX_PCI(vp), PCI_D0); /* Go active */
Daniel Ritz3c8fad12005-05-05 16:15:44 -07001541 if (vp->pm_state_valid)
1542 pci_restore_state(VORTEX_PCI(vp));
Mark Hindleyc8303d12007-08-16 11:28:40 +01001543 err = pci_enable_device(VORTEX_PCI(vp));
1544 if (err) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001545 pr_warning("%s: Could not enable device\n",
Mark Hindleyc8303d12007-08-16 11:28:40 +01001546 dev->name);
1547 goto err_out;
1548 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549 }
1550
1551 /* Before initializing select the active media port. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001552 config = window_read32(vp, 3, Wn3_Config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553
1554 if (vp->media_override != 7) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001555 pr_info("%s: Media override to transceiver %d (%s).\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556 dev->name, vp->media_override,
1557 media_tbl[vp->media_override].name);
1558 dev->if_port = vp->media_override;
1559 } else if (vp->autoselect) {
1560 if (vp->has_nway) {
1561 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001562 pr_info("%s: using NWAY device table, not %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563 dev->name, dev->if_port);
1564 dev->if_port = XCVR_NWAY;
1565 } else {
1566 /* Find first available media type, starting with 100baseTx. */
1567 dev->if_port = XCVR_100baseTx;
1568 while (! (vp->available_media & media_tbl[dev->if_port].mask))
1569 dev->if_port = media_tbl[dev->if_port].next;
1570 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001571 pr_info("%s: first available media type: %s\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572 dev->name, media_tbl[dev->if_port].name);
1573 }
1574 } else {
1575 dev->if_port = vp->default_media;
1576 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001577 pr_info("%s: using default media %s\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 dev->name, media_tbl[dev->if_port].name);
1579 }
1580
1581 init_timer(&vp->timer);
1582 vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
1583 vp->timer.data = (unsigned long)dev;
1584 vp->timer.function = vortex_timer; /* timer handler */
1585 add_timer(&vp->timer);
1586
1587 init_timer(&vp->rx_oom_timer);
1588 vp->rx_oom_timer.data = (unsigned long)dev;
1589 vp->rx_oom_timer.function = rx_oom_timer;
1590
1591 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001592 pr_debug("%s: Initial media type %s.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 dev->name, media_tbl[dev->if_port].name);
1594
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001595 vp->full_duplex = vp->mii.force_media;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596 config = BFINS(config, dev->if_port, 20, 4);
1597 if (vortex_debug > 6)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001598 pr_debug("vortex_up(): writing 0x%x to InternalConfig\n", config);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001599 window_write32(vp, config, 3, Wn3_Config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600
1601 if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
Steffen Klassert09ce35122006-03-31 02:30:48 -08001602 mii_reg1 = mdio_read(dev, vp->phys[0], MII_BMSR);
1603 mii_reg5 = mdio_read(dev, vp->phys[0], MII_LPA);
1604 vp->partner_flow_ctrl = ((mii_reg5 & 0x0400) != 0);
Steffen Klassert373492d2007-08-10 14:05:26 -07001605 vp->mii.full_duplex = vp->full_duplex;
Steffen Klassert09ce35122006-03-31 02:30:48 -08001606
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001607 vortex_check_media(dev, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 }
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001609 else
1610 vortex_set_duplex(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611
Steffen Klassert09ce35122006-03-31 02:30:48 -08001612 issue_and_wait(dev, TxReset);
1613 /*
1614 * Don't reset the PHY - that upsets autonegotiation during DHCP operations.
1615 */
1616 issue_and_wait(dev, RxReset|0x04);
1617
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618
John W. Linville62afe592005-11-07 00:58:02 -08001619 iowrite16(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620
1621 if (vortex_debug > 1) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001622 pr_debug("%s: vortex_up() irq %d media status %4.4x.\n",
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001623 dev->name, dev->irq, window_read16(vp, 4, Wn4_Media));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 }
1625
1626 /* Set the station address and mask in window 2 each time opened. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627 for (i = 0; i < 6; i++)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001628 window_write8(vp, dev->dev_addr[i], 2, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629 for (; i < 12; i+=2)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001630 window_write16(vp, 0, 2, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631
1632 if (vp->cb_fn_base) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001633 unsigned short n = window_read16(vp, 2, Wn2_ResetOptions) & ~0x4010;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 if (vp->drv_flags & INVERT_LED_PWR)
1635 n |= 0x10;
1636 if (vp->drv_flags & INVERT_MII_PWR)
1637 n |= 0x4000;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001638 window_write16(vp, n, 2, Wn2_ResetOptions);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001639 }
1640
1641 if (dev->if_port == XCVR_10base2)
1642 /* Start the thinnet transceiver. We should really wait 50ms...*/
John W. Linville62afe592005-11-07 00:58:02 -08001643 iowrite16(StartCoax, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001644 if (dev->if_port != XCVR_NWAY) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001645 window_write16(vp,
1646 (window_read16(vp, 4, Wn4_Media) &
1647 ~(Media_10TP|Media_SQE)) |
1648 media_tbl[dev->if_port].media_bits,
1649 4, Wn4_Media);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001650 }
1651
1652 /* Switch to the stats window, and clear all stats by reading. */
John W. Linville62afe592005-11-07 00:58:02 -08001653 iowrite16(StatsDisable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654 for (i = 0; i < 10; i++)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001655 window_read8(vp, 6, i);
1656 window_read16(vp, 6, 10);
1657 window_read16(vp, 6, 12);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001658 /* New: On the Vortex we must also clear the BadSSD counter. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001659 window_read8(vp, 4, 12);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660 /* ..and on the Boomerang we enable the extra statistics bits. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001661 window_write16(vp, 0x0040, 4, Wn4_NetDiag);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662
1663 if (vp->full_bus_master_rx) { /* Boomerang bus master. */
1664 vp->cur_rx = vp->dirty_rx = 0;
1665 /* Initialize the RxEarly register as recommended. */
John W. Linville62afe592005-11-07 00:58:02 -08001666 iowrite16(SetRxThreshold + (1536>>2), ioaddr + EL3_CMD);
1667 iowrite32(0x0020, ioaddr + PktStatus);
1668 iowrite32(vp->rx_ring_dma, ioaddr + UpListPtr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 }
1670 if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */
1671 vp->cur_tx = vp->dirty_tx = 0;
1672 if (vp->drv_flags & IS_BOOMERANG)
John W. Linville62afe592005-11-07 00:58:02 -08001673 iowrite8(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); /* Room for a packet. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674 /* Clear the Rx, Tx rings. */
1675 for (i = 0; i < RX_RING_SIZE; i++) /* AKPM: this is done in vortex_open, too */
1676 vp->rx_ring[i].status = 0;
1677 for (i = 0; i < TX_RING_SIZE; i++)
1678 vp->tx_skbuff[i] = NULL;
John W. Linville62afe592005-11-07 00:58:02 -08001679 iowrite32(0, ioaddr + DownListPtr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 }
1681 /* Set receiver mode: presumably accept b-case and phys addr only. */
1682 set_rx_mode(dev);
1683 /* enable 802.1q tagged frames */
1684 set_8021q_mode(dev, 1);
John W. Linville62afe592005-11-07 00:58:02 -08001685 iowrite16(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686
John W. Linville62afe592005-11-07 00:58:02 -08001687 iowrite16(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
1688 iowrite16(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001689 /* Allow status bits to be seen. */
1690 vp->status_enable = SetStatusEnb | HostError|IntReq|StatsFull|TxComplete|
1691 (vp->full_bus_master_tx ? DownComplete : TxAvailable) |
1692 (vp->full_bus_master_rx ? UpComplete : RxComplete) |
1693 (vp->bus_master ? DMADone : 0);
1694 vp->intr_enable = SetIntrEnb | IntLatch | TxAvailable |
1695 (vp->full_bus_master_rx ? 0 : RxComplete) |
1696 StatsFull | HostError | TxComplete | IntReq
1697 | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete;
John W. Linville62afe592005-11-07 00:58:02 -08001698 iowrite16(vp->status_enable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 /* Ack all pending events, and set active indicator mask. */
John W. Linville62afe592005-11-07 00:58:02 -08001700 iowrite16(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 ioaddr + EL3_CMD);
John W. Linville62afe592005-11-07 00:58:02 -08001702 iowrite16(vp->intr_enable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703 if (vp->cb_fn_base) /* The PCMCIA people are idiots. */
John W. Linville62afe592005-11-07 00:58:02 -08001704 iowrite32(0x8000, vp->cb_fn_base + 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 netif_start_queue (dev);
Mark Hindleyc8303d12007-08-16 11:28:40 +01001706err_out:
1707 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708}
1709
1710static int
1711vortex_open(struct net_device *dev)
1712{
1713 struct vortex_private *vp = netdev_priv(dev);
1714 int i;
1715 int retval;
1716
1717 /* Use the now-standard shared IRQ implementation. */
1718 if ((retval = request_irq(dev->irq, vp->full_bus_master_rx ?
Thomas Gleixner1fb9df52006-07-01 19:29:39 -07001719 &boomerang_interrupt : &vortex_interrupt, IRQF_SHARED, dev->name, dev))) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001720 pr_err("%s: Could not reserve IRQ %d\n", dev->name, dev->irq);
Mark Hindleyc8303d12007-08-16 11:28:40 +01001721 goto err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001722 }
1723
1724 if (vp->full_bus_master_rx) { /* Boomerang bus master. */
1725 if (vortex_debug > 2)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001726 pr_debug("%s: Filling in the Rx ring.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 for (i = 0; i < RX_RING_SIZE; i++) {
1728 struct sk_buff *skb;
1729 vp->rx_ring[i].next = cpu_to_le32(vp->rx_ring_dma + sizeof(struct boom_rx_desc) * (i+1));
1730 vp->rx_ring[i].status = 0; /* Clear complete bit. */
1731 vp->rx_ring[i].length = cpu_to_le32(PKT_BUF_SZ | LAST_FRAG);
Stephen Hemminger9a5d34142008-07-25 12:07:22 -07001732
1733 skb = __netdev_alloc_skb(dev, PKT_BUF_SZ + NET_IP_ALIGN,
1734 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735 vp->rx_skbuff[i] = skb;
1736 if (skb == NULL)
1737 break; /* Bad news! */
Stephen Hemminger9a5d34142008-07-25 12:07:22 -07001738
1739 skb_reserve(skb, NET_IP_ALIGN); /* Align IP on 16 byte boundaries */
David S. Miller689be432005-06-28 15:25:31 -07001740 vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741 }
1742 if (i != RX_RING_SIZE) {
1743 int j;
Alexander Beregalov39738e12009-05-26 12:35:26 +00001744 pr_emerg("%s: no memory for rx ring\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 for (j = 0; j < i; j++) {
1746 if (vp->rx_skbuff[j]) {
1747 dev_kfree_skb(vp->rx_skbuff[j]);
1748 vp->rx_skbuff[j] = NULL;
1749 }
1750 }
1751 retval = -ENOMEM;
Mark Hindleyc8303d12007-08-16 11:28:40 +01001752 goto err_free_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753 }
1754 /* Wrap the ring. */
1755 vp->rx_ring[i-1].next = cpu_to_le32(vp->rx_ring_dma);
1756 }
1757
Mark Hindleyc8303d12007-08-16 11:28:40 +01001758 retval = vortex_up(dev);
1759 if (!retval)
1760 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761
Mark Hindleyc8303d12007-08-16 11:28:40 +01001762err_free_irq:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 free_irq(dev->irq, dev);
Mark Hindleyc8303d12007-08-16 11:28:40 +01001764err:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001766 pr_err("%s: vortex_open() fails: returning %d\n", dev->name, retval);
Mark Hindleyc8303d12007-08-16 11:28:40 +01001767out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 return retval;
1769}
1770
1771static void
1772vortex_timer(unsigned long data)
1773{
1774 struct net_device *dev = (struct net_device *)data;
1775 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08001776 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 int next_tick = 60*HZ;
1778 int ok = 0;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001779 int media_status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780
1781 if (vortex_debug > 2) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001782 pr_debug("%s: Media selection timer tick happened, %s.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 dev->name, media_tbl[dev->if_port].name);
Alexander Beregalov39738e12009-05-26 12:35:26 +00001784 pr_debug("dev->watchdog_timeo=%d\n", dev->watchdog_timeo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 }
1786
Ingo Molnar0a9da4b2006-07-03 00:25:24 -07001787 disable_irq_lockdep(dev->irq);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001788 media_status = window_read16(vp, 4, Wn4_Media);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789 switch (dev->if_port) {
1790 case XCVR_10baseT: case XCVR_100baseTx: case XCVR_100baseFx:
1791 if (media_status & Media_LnkBeat) {
1792 netif_carrier_on(dev);
1793 ok = 1;
1794 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001795 pr_debug("%s: Media %s has link beat, %x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001796 dev->name, media_tbl[dev->if_port].name, media_status);
1797 } else {
1798 netif_carrier_off(dev);
1799 if (vortex_debug > 1) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001800 pr_debug("%s: Media %s has no link beat, %x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801 dev->name, media_tbl[dev->if_port].name, media_status);
1802 }
1803 }
1804 break;
1805 case XCVR_MII: case XCVR_NWAY:
1806 {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 ok = 1;
Ingo Molnarc5643ca2008-06-23 10:41:23 +02001808 /* Interrupts are already disabled */
1809 spin_lock(&vp->lock);
Steffen Klassert125d5ce2006-03-26 01:37:39 -08001810 vortex_check_media(dev, 0);
Ingo Molnarc5643ca2008-06-23 10:41:23 +02001811 spin_unlock(&vp->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 }
1813 break;
1814 default: /* Other media types handled by Tx timeouts. */
1815 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001816 pr_debug("%s: Media %s has no indication, %x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 dev->name, media_tbl[dev->if_port].name, media_status);
1818 ok = 1;
1819 }
Steffen Klassertb4ff6452006-03-26 01:37:40 -08001820
1821 if (!netif_carrier_ok(dev))
1822 next_tick = 5*HZ;
1823
Steffen Klasserte94d10e2006-03-26 01:37:41 -08001824 if (vp->medialock)
1825 goto leave_media_alone;
1826
Steffen Klasserta880c4c2006-03-26 01:37:43 -08001827 if (!ok) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 unsigned int config;
1829
1830 do {
1831 dev->if_port = media_tbl[dev->if_port].next;
1832 } while ( ! (vp->available_media & media_tbl[dev->if_port].mask));
1833 if (dev->if_port == XCVR_Default) { /* Go back to default. */
1834 dev->if_port = vp->default_media;
1835 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001836 pr_debug("%s: Media selection failing, using default %s port.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837 dev->name, media_tbl[dev->if_port].name);
1838 } else {
1839 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001840 pr_debug("%s: Media selection failed, now trying %s port.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001841 dev->name, media_tbl[dev->if_port].name);
1842 next_tick = media_tbl[dev->if_port].wait;
1843 }
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001844 window_write16(vp,
1845 (media_status & ~(Media_10TP|Media_SQE)) |
1846 media_tbl[dev->if_port].media_bits,
1847 4, Wn4_Media);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001848
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001849 config = window_read32(vp, 3, Wn3_Config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 config = BFINS(config, dev->if_port, 20, 4);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001851 window_write32(vp, config, 3, Wn3_Config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852
John W. Linville62afe592005-11-07 00:58:02 -08001853 iowrite16(dev->if_port == XCVR_10base2 ? StartCoax : StopCoax,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 ioaddr + EL3_CMD);
1855 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001856 pr_debug("wrote 0x%08x to Wn3_Config\n", config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857 /* AKPM: FIXME: Should reset Rx & Tx here. P60 of 3c90xc.pdf */
1858 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001859
1860leave_media_alone:
1861 if (vortex_debug > 2)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001862 pr_debug("%s: Media selection timer finished, %s.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 dev->name, media_tbl[dev->if_port].name);
1864
Ingo Molnar0a9da4b2006-07-03 00:25:24 -07001865 enable_irq_lockdep(dev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 mod_timer(&vp->timer, RUN_AT(next_tick));
1867 if (vp->deferred)
John W. Linville62afe592005-11-07 00:58:02 -08001868 iowrite16(FakeIntr, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869}
1870
1871static void vortex_tx_timeout(struct net_device *dev)
1872{
1873 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08001874 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875
Alexander Beregalov39738e12009-05-26 12:35:26 +00001876 pr_err("%s: transmit timed out, tx_status %2.2x status %4.4x.\n",
John W. Linville62afe592005-11-07 00:58:02 -08001877 dev->name, ioread8(ioaddr + TxStatus),
1878 ioread16(ioaddr + EL3_STATUS));
Alexander Beregalov39738e12009-05-26 12:35:26 +00001879 pr_err(" diagnostics: net %04x media %04x dma %08x fifo %04x\n",
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001880 window_read16(vp, 4, Wn4_NetDiag),
1881 window_read16(vp, 4, Wn4_Media),
John W. Linville62afe592005-11-07 00:58:02 -08001882 ioread32(ioaddr + PktStatus),
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001883 window_read16(vp, 4, Wn4_FIFODiag));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 /* Slight code bloat to be user friendly. */
John W. Linville62afe592005-11-07 00:58:02 -08001885 if ((ioread8(ioaddr + TxStatus) & 0x88) == 0x88)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001886 pr_err("%s: Transmitter encountered 16 collisions --"
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887 " network cable problem?\n", dev->name);
John W. Linville62afe592005-11-07 00:58:02 -08001888 if (ioread16(ioaddr + EL3_STATUS) & IntLatch) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001889 pr_err("%s: Interrupt posted but not delivered --"
Linus Torvalds1da177e2005-04-16 15:20:36 -07001890 " IRQ blocked by another device?\n", dev->name);
1891 /* Bad idea here.. but we might as well handle a few events. */
1892 {
1893 /*
1894 * Block interrupts because vortex_interrupt does a bare spin_lock()
1895 */
1896 unsigned long flags;
1897 local_irq_save(flags);
1898 if (vp->full_bus_master_tx)
David Howells7d12e782006-10-05 14:55:46 +01001899 boomerang_interrupt(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001900 else
David Howells7d12e782006-10-05 14:55:46 +01001901 vortex_interrupt(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 local_irq_restore(flags);
1903 }
1904 }
1905
1906 if (vortex_debug > 0)
1907 dump_tx_ring(dev);
1908
1909 issue_and_wait(dev, TxReset);
1910
Paulius Zaleckas1daad052008-05-05 14:01:29 +02001911 dev->stats.tx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001912 if (vp->full_bus_master_tx) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001913 pr_debug("%s: Resetting the Tx ring pointer.\n", dev->name);
John W. Linville62afe592005-11-07 00:58:02 -08001914 if (vp->cur_tx - vp->dirty_tx > 0 && ioread32(ioaddr + DownListPtr) == 0)
1915 iowrite32(vp->tx_ring_dma + (vp->dirty_tx % TX_RING_SIZE) * sizeof(struct boom_tx_desc),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001916 ioaddr + DownListPtr);
1917 if (vp->cur_tx - vp->dirty_tx < TX_RING_SIZE)
1918 netif_wake_queue (dev);
1919 if (vp->drv_flags & IS_BOOMERANG)
John W. Linville62afe592005-11-07 00:58:02 -08001920 iowrite8(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold);
1921 iowrite16(DownUnstall, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001922 } else {
Paulius Zaleckas1daad052008-05-05 14:01:29 +02001923 dev->stats.tx_dropped++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 netif_wake_queue(dev);
1925 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001926
Linus Torvalds1da177e2005-04-16 15:20:36 -07001927 /* Issue Tx Enable */
John W. Linville62afe592005-11-07 00:58:02 -08001928 iowrite16(TxEnable, ioaddr + EL3_CMD);
Eric Dumazet1ae5dc32010-05-10 05:01:31 -07001929 dev->trans_start = jiffies; /* prevent tx timeout */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930}
1931
1932/*
1933 * Handle uncommon interrupt sources. This is a separate routine to minimize
1934 * the cache impact.
1935 */
1936static void
1937vortex_error(struct net_device *dev, int status)
1938{
1939 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08001940 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941 int do_tx_reset = 0, reset_mask = 0;
1942 unsigned char tx_status = 0;
1943
1944 if (vortex_debug > 2) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001945 pr_err("%s: vortex_error(), status=0x%x\n", dev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946 }
1947
1948 if (status & TxComplete) { /* Really "TxError" for us. */
John W. Linville62afe592005-11-07 00:58:02 -08001949 tx_status = ioread8(ioaddr + TxStatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001950 /* Presumably a tx-timeout. We must merely re-enable. */
Joe Perches8e95a202009-12-03 07:58:21 +00001951 if (vortex_debug > 2 ||
1952 (tx_status != 0x88 && vortex_debug > 0)) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001953 pr_err("%s: Transmit error, Tx status register %2.2x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954 dev->name, tx_status);
1955 if (tx_status == 0x82) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001956 pr_err("Probably a duplex mismatch. See "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 "Documentation/networking/vortex.txt\n");
1958 }
1959 dump_tx_ring(dev);
1960 }
Paulius Zaleckas1daad052008-05-05 14:01:29 +02001961 if (tx_status & 0x14) dev->stats.tx_fifo_errors++;
1962 if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
Andrew Morton00007542006-03-31 02:30:47 -08001963 if (tx_status & 0x08) vp->xstats.tx_max_collisions++;
John W. Linville62afe592005-11-07 00:58:02 -08001964 iowrite8(0, ioaddr + TxStatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 if (tx_status & 0x30) { /* txJabber or txUnderrun */
1966 do_tx_reset = 1;
Andrew Morton00007542006-03-31 02:30:47 -08001967 } else if ((tx_status & 0x08) && (vp->drv_flags & MAX_COLLISION_RESET)) { /* maxCollisions */
1968 do_tx_reset = 1;
1969 reset_mask = 0x0108; /* Reset interface logic, but not download logic */
1970 } else { /* Merely re-enable the transmitter. */
John W. Linville62afe592005-11-07 00:58:02 -08001971 iowrite16(TxEnable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972 }
1973 }
1974
1975 if (status & RxEarly) { /* Rx early is unused. */
1976 vortex_rx(dev);
John W. Linville62afe592005-11-07 00:58:02 -08001977 iowrite16(AckIntr | RxEarly, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001978 }
1979 if (status & StatsFull) { /* Empty statistics. */
1980 static int DoneDidThat;
1981 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00001982 pr_debug("%s: Updating stats.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 update_stats(ioaddr, dev);
1984 /* HACK: Disable statistics as an interrupt source. */
1985 /* This occurs when we have the wrong media type! */
1986 if (DoneDidThat == 0 &&
John W. Linville62afe592005-11-07 00:58:02 -08001987 ioread16(ioaddr + EL3_STATUS) & StatsFull) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00001988 pr_warning("%s: Updating statistics failed, disabling "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 "stats as an interrupt source.\n", dev->name);
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00001990 iowrite16(SetIntrEnb |
1991 (window_read16(vp, 5, 10) & ~StatsFull),
1992 ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993 vp->intr_enable &= ~StatsFull;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 DoneDidThat++;
1995 }
1996 }
1997 if (status & IntReq) { /* Restore all interrupt sources. */
John W. Linville62afe592005-11-07 00:58:02 -08001998 iowrite16(vp->status_enable, ioaddr + EL3_CMD);
1999 iowrite16(vp->intr_enable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000 }
2001 if (status & HostError) {
2002 u16 fifo_diag;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002003 fifo_diag = window_read16(vp, 4, Wn4_FIFODiag);
Alexander Beregalov39738e12009-05-26 12:35:26 +00002004 pr_err("%s: Host error, FIFO diagnostic register %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002005 dev->name, fifo_diag);
2006 /* Adapter failure requires Tx/Rx reset and reinit. */
2007 if (vp->full_bus_master_tx) {
John W. Linville62afe592005-11-07 00:58:02 -08002008 int bus_status = ioread32(ioaddr + PktStatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 /* 0x80000000 PCI master abort. */
2010 /* 0x40000000 PCI target abort. */
2011 if (vortex_debug)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002012 pr_err("%s: PCI bus error, bus status %8.8x\n", dev->name, bus_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013
2014 /* In this case, blow the card away */
2015 /* Must not enter D3 or we can't legally issue the reset! */
2016 vortex_down(dev, 0);
2017 issue_and_wait(dev, TotalReset | 0xff);
2018 vortex_up(dev); /* AKPM: bug. vortex_up() assumes that the rx ring is full. It may not be. */
2019 } else if (fifo_diag & 0x0400)
2020 do_tx_reset = 1;
2021 if (fifo_diag & 0x3000) {
2022 /* Reset Rx fifo and upload logic */
2023 issue_and_wait(dev, RxReset|0x07);
2024 /* Set the Rx filter to the current state. */
2025 set_rx_mode(dev);
2026 /* enable 802.1q VLAN tagged frames */
2027 set_8021q_mode(dev, 1);
John W. Linville62afe592005-11-07 00:58:02 -08002028 iowrite16(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
2029 iowrite16(AckIntr | HostError, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030 }
2031 }
2032
2033 if (do_tx_reset) {
2034 issue_and_wait(dev, TxReset|reset_mask);
John W. Linville62afe592005-11-07 00:58:02 -08002035 iowrite16(TxEnable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 if (!vp->full_bus_master_tx)
2037 netif_wake_queue(dev);
2038 }
2039}
2040
Stephen Hemminger27a1de92009-08-31 19:50:54 +00002041static netdev_tx_t
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042vortex_start_xmit(struct sk_buff *skb, struct net_device *dev)
2043{
2044 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002045 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046
2047 /* Put out the doubleword header... */
John W. Linville62afe592005-11-07 00:58:02 -08002048 iowrite32(skb->len, ioaddr + TX_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 if (vp->bus_master) {
2050 /* Set the bus-master controller to transfer the packet. */
2051 int len = (skb->len + 3) & ~3;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002052 vp->tx_skb_dma = pci_map_single(VORTEX_PCI(vp), skb->data, len,
2053 PCI_DMA_TODEVICE);
2054 window_set(vp, 7);
2055 iowrite32(vp->tx_skb_dma, ioaddr + Wn7_MasterAddr);
John W. Linville62afe592005-11-07 00:58:02 -08002056 iowrite16(len, ioaddr + Wn7_MasterLen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002057 vp->tx_skb = skb;
John W. Linville62afe592005-11-07 00:58:02 -08002058 iowrite16(StartDMADown, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002059 /* netif_wake_queue() will be called at the DMADone interrupt. */
2060 } else {
2061 /* ... and the packet rounded to a doubleword. */
John W. Linville62afe592005-11-07 00:58:02 -08002062 iowrite32_rep(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063 dev_kfree_skb (skb);
John W. Linville62afe592005-11-07 00:58:02 -08002064 if (ioread16(ioaddr + TxFree) > 1536) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 netif_start_queue (dev); /* AKPM: redundant? */
2066 } else {
2067 /* Interrupt us when the FIFO has room for max-sized packet. */
2068 netif_stop_queue(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002069 iowrite16(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070 }
2071 }
2072
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073
2074 /* Clear the Tx status stack. */
2075 {
2076 int tx_status;
2077 int i = 32;
2078
John W. Linville62afe592005-11-07 00:58:02 -08002079 while (--i > 0 && (tx_status = ioread8(ioaddr + TxStatus)) > 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080 if (tx_status & 0x3C) { /* A Tx-disabling error occurred. */
2081 if (vortex_debug > 2)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002082 pr_debug("%s: Tx error, status %2.2x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083 dev->name, tx_status);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002084 if (tx_status & 0x04) dev->stats.tx_fifo_errors++;
2085 if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 if (tx_status & 0x30) {
2087 issue_and_wait(dev, TxReset);
2088 }
John W. Linville62afe592005-11-07 00:58:02 -08002089 iowrite16(TxEnable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090 }
John W. Linville62afe592005-11-07 00:58:02 -08002091 iowrite8(0x00, ioaddr + TxStatus); /* Pop the status stack. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002092 }
2093 }
Patrick McHardy6ed10652009-06-23 06:03:08 +00002094 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095}
2096
Stephen Hemminger27a1de92009-08-31 19:50:54 +00002097static netdev_tx_t
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
2099{
2100 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002101 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 /* Calculate the next Tx descriptor entry. */
2103 int entry = vp->cur_tx % TX_RING_SIZE;
2104 struct boom_tx_desc *prev_entry = &vp->tx_ring[(vp->cur_tx-1) % TX_RING_SIZE];
2105 unsigned long flags;
2106
2107 if (vortex_debug > 6) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002108 pr_debug("boomerang_start_xmit()\n");
2109 pr_debug("%s: Trying to send a packet, Tx index %d.\n",
John W. Linville0f667ff2005-06-21 17:15:14 -07002110 dev->name, vp->cur_tx);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111 }
2112
2113 if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) {
2114 if (vortex_debug > 0)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002115 pr_warning("%s: BUG! Tx Ring full, refusing to send buffer.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 dev->name);
2117 netif_stop_queue(dev);
Patrick McHardy5b548142009-06-12 06:22:29 +00002118 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119 }
2120
2121 vp->tx_skbuff[entry] = skb;
2122
2123 vp->tx_ring[entry].next = 0;
2124#if DO_ZEROCOPY
Patrick McHardy84fa7932006-08-29 16:44:56 -07002125 if (skb->ip_summed != CHECKSUM_PARTIAL)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126 vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded);
2127 else
2128 vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum);
2129
2130 if (!skb_shinfo(skb)->nr_frags) {
2131 vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data,
2132 skb->len, PCI_DMA_TODEVICE));
2133 vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len | LAST_FRAG);
2134 } else {
2135 int i;
2136
2137 vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data,
Eric Dumazete743d312010-04-14 15:59:40 -07002138 skb_headlen(skb), PCI_DMA_TODEVICE));
2139 vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb_headlen(skb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140
2141 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2142 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
2143
2144 vp->tx_ring[entry].frag[i+1].addr =
2145 cpu_to_le32(pci_map_single(VORTEX_PCI(vp),
2146 (void*)page_address(frag->page) + frag->page_offset,
2147 frag->size, PCI_DMA_TODEVICE));
2148
2149 if (i == skb_shinfo(skb)->nr_frags-1)
2150 vp->tx_ring[entry].frag[i+1].length = cpu_to_le32(frag->size|LAST_FRAG);
2151 else
2152 vp->tx_ring[entry].frag[i+1].length = cpu_to_le32(frag->size);
2153 }
2154 }
2155#else
2156 vp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE));
2157 vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG);
2158 vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded);
2159#endif
2160
2161 spin_lock_irqsave(&vp->lock, flags);
2162 /* Wait for the stall to complete. */
2163 issue_and_wait(dev, DownStall);
2164 prev_entry->next = cpu_to_le32(vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc));
John W. Linville62afe592005-11-07 00:58:02 -08002165 if (ioread32(ioaddr + DownListPtr) == 0) {
2166 iowrite32(vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc), ioaddr + DownListPtr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 vp->queued_packet++;
2168 }
2169
2170 vp->cur_tx++;
2171 if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1) {
2172 netif_stop_queue (dev);
2173 } else { /* Clear previous interrupt enable. */
2174#if defined(tx_interrupt_mitigation)
2175 /* Dubious. If in boomeang_interrupt "faster" cyclone ifdef
2176 * were selected, this would corrupt DN_COMPLETE. No?
2177 */
2178 prev_entry->status &= cpu_to_le32(~TxIntrUploaded);
2179#endif
2180 }
John W. Linville62afe592005-11-07 00:58:02 -08002181 iowrite16(DownUnstall, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 spin_unlock_irqrestore(&vp->lock, flags);
Patrick McHardy6ed10652009-06-23 06:03:08 +00002183 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184}
2185
2186/* The interrupt handler does all of the Rx thread work and cleans up
2187 after the Tx thread. */
2188
2189/*
2190 * This is the ISR for the vortex series chips.
2191 * full_bus_master_tx == 0 && full_bus_master_rx == 0
2192 */
2193
2194static irqreturn_t
David Howells7d12e782006-10-05 14:55:46 +01002195vortex_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196{
2197 struct net_device *dev = dev_id;
2198 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002199 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002200 int status;
2201 int work_done = max_interrupt_work;
2202 int handled = 0;
2203
John W. Linville62afe592005-11-07 00:58:02 -08002204 ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002205 spin_lock(&vp->lock);
2206
John W. Linville62afe592005-11-07 00:58:02 -08002207 status = ioread16(ioaddr + EL3_STATUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208
2209 if (vortex_debug > 6)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002210 pr_debug("vortex_interrupt(). status=0x%4x\n", status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211
2212 if ((status & IntLatch) == 0)
2213 goto handler_exit; /* No interrupt: shared IRQs cause this */
2214 handled = 1;
2215
2216 if (status & IntReq) {
2217 status |= vp->deferred;
2218 vp->deferred = 0;
2219 }
2220
2221 if (status == 0xffff) /* h/w no longer present (hotplug)? */
2222 goto handler_exit;
2223
2224 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002225 pr_debug("%s: interrupt, status %4.4x, latency %d ticks.\n",
John W. Linville62afe592005-11-07 00:58:02 -08002226 dev->name, status, ioread8(ioaddr + Timer));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002228 window_set(vp, 7);
2229
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230 do {
2231 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002232 pr_debug("%s: In interrupt loop, status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 dev->name, status);
2234 if (status & RxComplete)
2235 vortex_rx(dev);
2236
2237 if (status & TxAvailable) {
2238 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002239 pr_debug(" TX room bit was handled.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240 /* There's room in the FIFO for a full-sized packet. */
John W. Linville62afe592005-11-07 00:58:02 -08002241 iowrite16(AckIntr | TxAvailable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 netif_wake_queue (dev);
2243 }
2244
2245 if (status & DMADone) {
John W. Linville62afe592005-11-07 00:58:02 -08002246 if (ioread16(ioaddr + Wn7_MasterStatus) & 0x1000) {
2247 iowrite16(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 pci_unmap_single(VORTEX_PCI(vp), vp->tx_skb_dma, (vp->tx_skb->len + 3) & ~3, PCI_DMA_TODEVICE);
2249 dev_kfree_skb_irq(vp->tx_skb); /* Release the transferred buffer */
John W. Linville62afe592005-11-07 00:58:02 -08002250 if (ioread16(ioaddr + TxFree) > 1536) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251 /*
2252 * AKPM: FIXME: I don't think we need this. If the queue was stopped due to
2253 * insufficient FIFO room, the TxAvailable test will succeed and call
2254 * netif_wake_queue()
2255 */
2256 netif_wake_queue(dev);
2257 } else { /* Interrupt when FIFO has room for max-sized packet. */
John W. Linville62afe592005-11-07 00:58:02 -08002258 iowrite16(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 netif_stop_queue(dev);
2260 }
2261 }
2262 }
2263 /* Check for all uncommon interrupts at once. */
2264 if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) {
2265 if (status == 0xffff)
2266 break;
2267 vortex_error(dev, status);
2268 }
2269
2270 if (--work_done < 0) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002271 pr_warning("%s: Too much work in interrupt, status %4.4x.\n",
2272 dev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 /* Disable all pending interrupts. */
2274 do {
2275 vp->deferred |= status;
John W. Linville62afe592005-11-07 00:58:02 -08002276 iowrite16(SetStatusEnb | (~vp->deferred & vp->status_enable),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002277 ioaddr + EL3_CMD);
John W. Linville62afe592005-11-07 00:58:02 -08002278 iowrite16(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);
2279 } while ((status = ioread16(ioaddr + EL3_CMD)) & IntLatch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280 /* The timer will reenable interrupts. */
2281 mod_timer(&vp->timer, jiffies + 1*HZ);
2282 break;
2283 }
2284 /* Acknowledge the IRQ. */
John W. Linville62afe592005-11-07 00:58:02 -08002285 iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
2286 } while ((status = ioread16(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287
2288 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002289 pr_debug("%s: exiting interrupt, status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 dev->name, status);
2291handler_exit:
2292 spin_unlock(&vp->lock);
2293 return IRQ_RETVAL(handled);
2294}
2295
2296/*
2297 * This is the ISR for the boomerang series chips.
2298 * full_bus_master_tx == 1 && full_bus_master_rx == 1
2299 */
2300
2301static irqreturn_t
David Howells7d12e782006-10-05 14:55:46 +01002302boomerang_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303{
2304 struct net_device *dev = dev_id;
2305 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002306 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 int status;
2308 int work_done = max_interrupt_work;
2309
John W. Linville62afe592005-11-07 00:58:02 -08002310 ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002311
2312 /*
2313 * It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout
2314 * and boomerang_start_xmit
2315 */
2316 spin_lock(&vp->lock);
2317
John W. Linville62afe592005-11-07 00:58:02 -08002318 status = ioread16(ioaddr + EL3_STATUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319
2320 if (vortex_debug > 6)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002321 pr_debug("boomerang_interrupt. status=0x%4x\n", status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002322
2323 if ((status & IntLatch) == 0)
2324 goto handler_exit; /* No interrupt: shared IRQs can cause this */
2325
2326 if (status == 0xffff) { /* h/w no longer present (hotplug)? */
2327 if (vortex_debug > 1)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002328 pr_debug("boomerang_interrupt(1): status = 0xffff\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329 goto handler_exit;
2330 }
2331
2332 if (status & IntReq) {
2333 status |= vp->deferred;
2334 vp->deferred = 0;
2335 }
2336
2337 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002338 pr_debug("%s: interrupt, status %4.4x, latency %d ticks.\n",
John W. Linville62afe592005-11-07 00:58:02 -08002339 dev->name, status, ioread8(ioaddr + Timer));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 do {
2341 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002342 pr_debug("%s: In interrupt loop, status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343 dev->name, status);
2344 if (status & UpComplete) {
John W. Linville62afe592005-11-07 00:58:02 -08002345 iowrite16(AckIntr | UpComplete, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002347 pr_debug("boomerang_interrupt->boomerang_rx\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 boomerang_rx(dev);
2349 }
2350
2351 if (status & DownComplete) {
2352 unsigned int dirty_tx = vp->dirty_tx;
2353
John W. Linville62afe592005-11-07 00:58:02 -08002354 iowrite16(AckIntr | DownComplete, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355 while (vp->cur_tx - dirty_tx > 0) {
2356 int entry = dirty_tx % TX_RING_SIZE;
2357#if 1 /* AKPM: the latter is faster, but cyclone-only */
John W. Linville62afe592005-11-07 00:58:02 -08002358 if (ioread32(ioaddr + DownListPtr) ==
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359 vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc))
2360 break; /* It still hasn't been processed. */
2361#else
2362 if ((vp->tx_ring[entry].status & DN_COMPLETE) == 0)
2363 break; /* It still hasn't been processed. */
2364#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002365
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 if (vp->tx_skbuff[entry]) {
2367 struct sk_buff *skb = vp->tx_skbuff[entry];
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002368#if DO_ZEROCOPY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369 int i;
2370 for (i=0; i<=skb_shinfo(skb)->nr_frags; i++)
2371 pci_unmap_single(VORTEX_PCI(vp),
2372 le32_to_cpu(vp->tx_ring[entry].frag[i].addr),
2373 le32_to_cpu(vp->tx_ring[entry].frag[i].length)&0xFFF,
2374 PCI_DMA_TODEVICE);
2375#else
2376 pci_unmap_single(VORTEX_PCI(vp),
2377 le32_to_cpu(vp->tx_ring[entry].addr), skb->len, PCI_DMA_TODEVICE);
2378#endif
2379 dev_kfree_skb_irq(skb);
2380 vp->tx_skbuff[entry] = NULL;
2381 } else {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002382 pr_debug("boomerang_interrupt: no skb!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383 }
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002384 /* dev->stats.tx_packets++; Counted below. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385 dirty_tx++;
2386 }
2387 vp->dirty_tx = dirty_tx;
2388 if (vp->cur_tx - dirty_tx <= TX_RING_SIZE - 1) {
2389 if (vortex_debug > 6)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002390 pr_debug("boomerang_interrupt: wake queue\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002391 netif_wake_queue (dev);
2392 }
2393 }
2394
2395 /* Check for all uncommon interrupts at once. */
2396 if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq))
2397 vortex_error(dev, status);
2398
2399 if (--work_done < 0) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002400 pr_warning("%s: Too much work in interrupt, status %4.4x.\n",
2401 dev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002402 /* Disable all pending interrupts. */
2403 do {
2404 vp->deferred |= status;
John W. Linville62afe592005-11-07 00:58:02 -08002405 iowrite16(SetStatusEnb | (~vp->deferred & vp->status_enable),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406 ioaddr + EL3_CMD);
John W. Linville62afe592005-11-07 00:58:02 -08002407 iowrite16(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);
2408 } while ((status = ioread16(ioaddr + EL3_CMD)) & IntLatch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002409 /* The timer will reenable interrupts. */
2410 mod_timer(&vp->timer, jiffies + 1*HZ);
2411 break;
2412 }
2413 /* Acknowledge the IRQ. */
John W. Linville62afe592005-11-07 00:58:02 -08002414 iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415 if (vp->cb_fn_base) /* The PCMCIA people are idiots. */
John W. Linville62afe592005-11-07 00:58:02 -08002416 iowrite32(0x8000, vp->cb_fn_base + 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417
John W. Linville62afe592005-11-07 00:58:02 -08002418 } while ((status = ioread16(ioaddr + EL3_STATUS)) & IntLatch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002419
2420 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002421 pr_debug("%s: exiting interrupt, status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422 dev->name, status);
2423handler_exit:
2424 spin_unlock(&vp->lock);
2425 return IRQ_HANDLED;
2426}
2427
2428static int vortex_rx(struct net_device *dev)
2429{
2430 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002431 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002432 int i;
2433 short rx_status;
2434
2435 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002436 pr_debug("vortex_rx(): status %4.4x, rx_status %4.4x.\n",
John W. Linville62afe592005-11-07 00:58:02 -08002437 ioread16(ioaddr+EL3_STATUS), ioread16(ioaddr+RxStatus));
2438 while ((rx_status = ioread16(ioaddr + RxStatus)) > 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439 if (rx_status & 0x4000) { /* Error, update stats. */
John W. Linville62afe592005-11-07 00:58:02 -08002440 unsigned char rx_error = ioread8(ioaddr + RxErrors);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 if (vortex_debug > 2)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002442 pr_debug(" Rx error: status %2.2x.\n", rx_error);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002443 dev->stats.rx_errors++;
2444 if (rx_error & 0x01) dev->stats.rx_over_errors++;
2445 if (rx_error & 0x02) dev->stats.rx_length_errors++;
2446 if (rx_error & 0x04) dev->stats.rx_frame_errors++;
2447 if (rx_error & 0x08) dev->stats.rx_crc_errors++;
2448 if (rx_error & 0x10) dev->stats.rx_length_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002449 } else {
2450 /* The packet length: up to 4.5K!. */
2451 int pkt_len = rx_status & 0x1fff;
2452 struct sk_buff *skb;
2453
2454 skb = dev_alloc_skb(pkt_len + 5);
2455 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002456 pr_debug("Receiving packet size %d status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002457 pkt_len, rx_status);
2458 if (skb != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459 skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
2460 /* 'skb_put()' points to the start of sk_buff data area. */
2461 if (vp->bus_master &&
John W. Linville62afe592005-11-07 00:58:02 -08002462 ! (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463 dma_addr_t dma = pci_map_single(VORTEX_PCI(vp), skb_put(skb, pkt_len),
2464 pkt_len, PCI_DMA_FROMDEVICE);
John W. Linville62afe592005-11-07 00:58:02 -08002465 iowrite32(dma, ioaddr + Wn7_MasterAddr);
2466 iowrite16((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
2467 iowrite16(StartDMAUp, ioaddr + EL3_CMD);
2468 while (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469 ;
2470 pci_unmap_single(VORTEX_PCI(vp), dma, pkt_len, PCI_DMA_FROMDEVICE);
2471 } else {
John W. Linville62afe592005-11-07 00:58:02 -08002472 ioread32_rep(ioaddr + RX_FIFO,
2473 skb_put(skb, pkt_len),
2474 (pkt_len + 3) >> 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475 }
John W. Linville62afe592005-11-07 00:58:02 -08002476 iowrite16(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002477 skb->protocol = eth_type_trans(skb, dev);
2478 netif_rx(skb);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002479 dev->stats.rx_packets++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002480 /* Wait a limited time to go to next packet. */
2481 for (i = 200; i >= 0; i--)
John W. Linville62afe592005-11-07 00:58:02 -08002482 if ( ! (ioread16(ioaddr + EL3_STATUS) & CmdInProgress))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002483 break;
2484 continue;
2485 } else if (vortex_debug > 0)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002486 pr_notice("%s: No memory to allocate a sk_buff of size %d.\n",
2487 dev->name, pkt_len);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002488 dev->stats.rx_dropped++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002490 issue_and_wait(dev, RxDiscard);
2491 }
2492
2493 return 0;
2494}
2495
2496static int
2497boomerang_rx(struct net_device *dev)
2498{
2499 struct vortex_private *vp = netdev_priv(dev);
2500 int entry = vp->cur_rx % RX_RING_SIZE;
John W. Linville62afe592005-11-07 00:58:02 -08002501 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502 int rx_status;
2503 int rx_work_limit = vp->dirty_rx + RX_RING_SIZE - vp->cur_rx;
2504
2505 if (vortex_debug > 5)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002506 pr_debug("boomerang_rx(): status %4.4x\n", ioread16(ioaddr+EL3_STATUS));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507
2508 while ((rx_status = le32_to_cpu(vp->rx_ring[entry].status)) & RxDComplete){
2509 if (--rx_work_limit < 0)
2510 break;
2511 if (rx_status & RxDError) { /* Error, update stats. */
2512 unsigned char rx_error = rx_status >> 16;
2513 if (vortex_debug > 2)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002514 pr_debug(" Rx error: status %2.2x.\n", rx_error);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002515 dev->stats.rx_errors++;
2516 if (rx_error & 0x01) dev->stats.rx_over_errors++;
2517 if (rx_error & 0x02) dev->stats.rx_length_errors++;
2518 if (rx_error & 0x04) dev->stats.rx_frame_errors++;
2519 if (rx_error & 0x08) dev->stats.rx_crc_errors++;
2520 if (rx_error & 0x10) dev->stats.rx_length_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002521 } else {
2522 /* The packet length: up to 4.5K!. */
2523 int pkt_len = rx_status & 0x1fff;
2524 struct sk_buff *skb;
2525 dma_addr_t dma = le32_to_cpu(vp->rx_ring[entry].addr);
2526
2527 if (vortex_debug > 4)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002528 pr_debug("Receiving packet size %d status %4.4x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002529 pkt_len, rx_status);
2530
2531 /* Check if the packet is long enough to just accept without
2532 copying to a properly sized skbuff. */
Al Virocc2d6592007-08-22 21:34:46 -04002533 if (pkt_len < rx_copybreak && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534 skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
2535 pci_dma_sync_single_for_cpu(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
2536 /* 'skb_put()' points to the start of sk_buff data area. */
2537 memcpy(skb_put(skb, pkt_len),
David S. Miller689be432005-06-28 15:25:31 -07002538 vp->rx_skbuff[entry]->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002539 pkt_len);
2540 pci_dma_sync_single_for_device(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
2541 vp->rx_copy++;
2542 } else {
2543 /* Pass up the skbuff already on the Rx ring. */
2544 skb = vp->rx_skbuff[entry];
2545 vp->rx_skbuff[entry] = NULL;
2546 skb_put(skb, pkt_len);
2547 pci_unmap_single(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
2548 vp->rx_nocopy++;
2549 }
2550 skb->protocol = eth_type_trans(skb, dev);
2551 { /* Use hardware checksum info. */
2552 int csum_bits = rx_status & 0xee000000;
2553 if (csum_bits &&
2554 (csum_bits == (IPChksumValid | TCPChksumValid) ||
2555 csum_bits == (IPChksumValid | UDPChksumValid))) {
2556 skb->ip_summed = CHECKSUM_UNNECESSARY;
2557 vp->rx_csumhits++;
2558 }
2559 }
2560 netif_rx(skb);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002561 dev->stats.rx_packets++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 }
2563 entry = (++vp->cur_rx) % RX_RING_SIZE;
2564 }
2565 /* Refill the Rx ring buffers. */
2566 for (; vp->cur_rx - vp->dirty_rx > 0; vp->dirty_rx++) {
2567 struct sk_buff *skb;
2568 entry = vp->dirty_rx % RX_RING_SIZE;
2569 if (vp->rx_skbuff[entry] == NULL) {
Eric Dumazet89d71a62009-10-13 05:34:20 +00002570 skb = netdev_alloc_skb_ip_align(dev, PKT_BUF_SZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002571 if (skb == NULL) {
2572 static unsigned long last_jif;
Marcelo Feitoza Parisiff5688a2006-01-09 18:37:15 -08002573 if (time_after(jiffies, last_jif + 10 * HZ)) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002574 pr_warning("%s: memory shortage\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002575 last_jif = jiffies;
2576 }
2577 if ((vp->cur_rx - vp->dirty_rx) == RX_RING_SIZE)
2578 mod_timer(&vp->rx_oom_timer, RUN_AT(HZ * 1));
2579 break; /* Bad news! */
2580 }
Stephen Hemminger9a5d34142008-07-25 12:07:22 -07002581
David S. Miller689be432005-06-28 15:25:31 -07002582 vp->rx_ring[entry].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583 vp->rx_skbuff[entry] = skb;
2584 }
2585 vp->rx_ring[entry].status = 0; /* Clear complete bit. */
John W. Linville62afe592005-11-07 00:58:02 -08002586 iowrite16(UpUnstall, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587 }
2588 return 0;
2589}
2590
2591/*
2592 * If we've hit a total OOM refilling the Rx ring we poll once a second
2593 * for some memory. Otherwise there is no way to restart the rx process.
2594 */
2595static void
2596rx_oom_timer(unsigned long arg)
2597{
2598 struct net_device *dev = (struct net_device *)arg;
2599 struct vortex_private *vp = netdev_priv(dev);
2600
2601 spin_lock_irq(&vp->lock);
2602 if ((vp->cur_rx - vp->dirty_rx) == RX_RING_SIZE) /* This test is redundant, but makes me feel good */
2603 boomerang_rx(dev);
2604 if (vortex_debug > 1) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002605 pr_debug("%s: rx_oom_timer %s\n", dev->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002606 ((vp->cur_rx - vp->dirty_rx) != RX_RING_SIZE) ? "succeeded" : "retrying");
2607 }
2608 spin_unlock_irq(&vp->lock);
2609}
2610
2611static void
2612vortex_down(struct net_device *dev, int final_down)
2613{
2614 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002615 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002616
2617 netif_stop_queue (dev);
2618
2619 del_timer_sync(&vp->rx_oom_timer);
2620 del_timer_sync(&vp->timer);
2621
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002622 /* Turn off statistics ASAP. We update dev->stats below. */
John W. Linville62afe592005-11-07 00:58:02 -08002623 iowrite16(StatsDisable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624
2625 /* Disable the receiver and transmitter. */
John W. Linville62afe592005-11-07 00:58:02 -08002626 iowrite16(RxDisable, ioaddr + EL3_CMD);
2627 iowrite16(TxDisable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628
2629 /* Disable receiving 802.1q tagged frames */
2630 set_8021q_mode(dev, 0);
2631
2632 if (dev->if_port == XCVR_10base2)
2633 /* Turn off thinnet power. Green! */
John W. Linville62afe592005-11-07 00:58:02 -08002634 iowrite16(StopCoax, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002635
John W. Linville62afe592005-11-07 00:58:02 -08002636 iowrite16(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002637
2638 update_stats(ioaddr, dev);
2639 if (vp->full_bus_master_rx)
John W. Linville62afe592005-11-07 00:58:02 -08002640 iowrite32(0, ioaddr + UpListPtr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002641 if (vp->full_bus_master_tx)
John W. Linville62afe592005-11-07 00:58:02 -08002642 iowrite32(0, ioaddr + DownListPtr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002643
2644 if (final_down && VORTEX_PCI(vp)) {
Daniel Ritz3c8fad12005-05-05 16:15:44 -07002645 vp->pm_state_valid = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 pci_save_state(VORTEX_PCI(vp));
2647 acpi_set_WOL(dev);
2648 }
2649}
2650
2651static int
2652vortex_close(struct net_device *dev)
2653{
2654 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002655 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656 int i;
2657
2658 if (netif_device_present(dev))
2659 vortex_down(dev, 1);
2660
2661 if (vortex_debug > 1) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002662 pr_debug("%s: vortex_close() status %4.4x, Tx status %2.2x.\n",
John W. Linville62afe592005-11-07 00:58:02 -08002663 dev->name, ioread16(ioaddr + EL3_STATUS), ioread8(ioaddr + TxStatus));
Alexander Beregalov39738e12009-05-26 12:35:26 +00002664 pr_debug("%s: vortex close stats: rx_nocopy %d rx_copy %d"
Linus Torvalds1da177e2005-04-16 15:20:36 -07002665 " tx_queued %d Rx pre-checksummed %d.\n",
2666 dev->name, vp->rx_nocopy, vp->rx_copy, vp->queued_packet, vp->rx_csumhits);
2667 }
2668
2669#if DO_ZEROCOPY
John W. Linville32fb5f02005-11-07 00:58:05 -08002670 if (vp->rx_csumhits &&
2671 (vp->drv_flags & HAS_HWCKSM) == 0 &&
2672 (vp->card_idx >= MAX_UNITS || hw_checksums[vp->card_idx] == -1)) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00002673 pr_warning("%s supports hardware checksums, and we're not using them!\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 }
2675#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002676
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677 free_irq(dev->irq, dev);
2678
2679 if (vp->full_bus_master_rx) { /* Free Boomerang bus master Rx buffers. */
2680 for (i = 0; i < RX_RING_SIZE; i++)
2681 if (vp->rx_skbuff[i]) {
2682 pci_unmap_single( VORTEX_PCI(vp), le32_to_cpu(vp->rx_ring[i].addr),
2683 PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
2684 dev_kfree_skb(vp->rx_skbuff[i]);
2685 vp->rx_skbuff[i] = NULL;
2686 }
2687 }
2688 if (vp->full_bus_master_tx) { /* Free Boomerang bus master Tx buffers. */
2689 for (i = 0; i < TX_RING_SIZE; i++) {
2690 if (vp->tx_skbuff[i]) {
2691 struct sk_buff *skb = vp->tx_skbuff[i];
2692#if DO_ZEROCOPY
2693 int k;
2694
2695 for (k=0; k<=skb_shinfo(skb)->nr_frags; k++)
2696 pci_unmap_single(VORTEX_PCI(vp),
2697 le32_to_cpu(vp->tx_ring[i].frag[k].addr),
2698 le32_to_cpu(vp->tx_ring[i].frag[k].length)&0xFFF,
2699 PCI_DMA_TODEVICE);
2700#else
2701 pci_unmap_single(VORTEX_PCI(vp), le32_to_cpu(vp->tx_ring[i].addr), skb->len, PCI_DMA_TODEVICE);
2702#endif
2703 dev_kfree_skb(skb);
2704 vp->tx_skbuff[i] = NULL;
2705 }
2706 }
2707 }
2708
2709 return 0;
2710}
2711
2712static void
2713dump_tx_ring(struct net_device *dev)
2714{
2715 if (vortex_debug > 0) {
2716 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002717 void __iomem *ioaddr = vp->ioaddr;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002718
Linus Torvalds1da177e2005-04-16 15:20:36 -07002719 if (vp->full_bus_master_tx) {
2720 int i;
John W. Linville62afe592005-11-07 00:58:02 -08002721 int stalled = ioread32(ioaddr + PktStatus) & 0x04; /* Possible racy. But it's only debug stuff */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002722
Alexander Beregalov39738e12009-05-26 12:35:26 +00002723 pr_err(" Flags; bus-master %d, dirty %d(%d) current %d(%d)\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724 vp->full_bus_master_tx,
2725 vp->dirty_tx, vp->dirty_tx % TX_RING_SIZE,
2726 vp->cur_tx, vp->cur_tx % TX_RING_SIZE);
Alexander Beregalov39738e12009-05-26 12:35:26 +00002727 pr_err(" Transmit list %8.8x vs. %p.\n",
John W. Linville62afe592005-11-07 00:58:02 -08002728 ioread32(ioaddr + DownListPtr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002729 &vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]);
2730 issue_and_wait(dev, DownStall);
2731 for (i = 0; i < TX_RING_SIZE; i++) {
Jean Delvare0cb13532009-08-03 21:10:01 -07002732 unsigned int length;
2733
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734#if DO_ZEROCOPY
Jean Delvare0cb13532009-08-03 21:10:01 -07002735 length = le32_to_cpu(vp->tx_ring[i].frag[0].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736#else
Jean Delvare0cb13532009-08-03 21:10:01 -07002737 length = le32_to_cpu(vp->tx_ring[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738#endif
Jean Delvare0cb13532009-08-03 21:10:01 -07002739 pr_err(" %d: @%p length %8.8x status %8.8x\n",
2740 i, &vp->tx_ring[i], length,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741 le32_to_cpu(vp->tx_ring[i].status));
2742 }
2743 if (!stalled)
John W. Linville62afe592005-11-07 00:58:02 -08002744 iowrite16(DownUnstall, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002745 }
2746 }
2747}
2748
2749static struct net_device_stats *vortex_get_stats(struct net_device *dev)
2750{
2751 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002752 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753 unsigned long flags;
2754
2755 if (netif_device_present(dev)) { /* AKPM: Used to be netif_running */
2756 spin_lock_irqsave (&vp->lock, flags);
John W. Linville62afe592005-11-07 00:58:02 -08002757 update_stats(ioaddr, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002758 spin_unlock_irqrestore (&vp->lock, flags);
2759 }
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002760 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002761}
2762
2763/* Update statistics.
2764 Unlike with the EL3 we need not worry about interrupts changing
2765 the window setting from underneath us, but we must still guard
2766 against a race condition with a StatsUpdate interrupt updating the
2767 table. This is done by checking that the ASM (!) code generated uses
2768 atomic updates with '+='.
2769 */
John W. Linville62afe592005-11-07 00:58:02 -08002770static void update_stats(void __iomem *ioaddr, struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771{
2772 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773
Linus Torvalds1da177e2005-04-16 15:20:36 -07002774 /* Unlike the 3c5x9 we need not turn off stats updates while reading. */
2775 /* Switch to the stats window, and read everything. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002776 dev->stats.tx_carrier_errors += window_read8(vp, 6, 0);
2777 dev->stats.tx_heartbeat_errors += window_read8(vp, 6, 1);
2778 dev->stats.tx_window_errors += window_read8(vp, 6, 4);
2779 dev->stats.rx_fifo_errors += window_read8(vp, 6, 5);
2780 dev->stats.tx_packets += window_read8(vp, 6, 6);
2781 dev->stats.tx_packets += (window_read8(vp, 6, 9) &
2782 0x30) << 4;
2783 /* Rx packets */ window_read8(vp, 6, 7); /* Must read to clear */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002784 /* Don't bother with register 9, an extension of registers 6&7.
2785 If we do use the 6&7 values the atomic update assumption above
2786 is invalid. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002787 dev->stats.rx_bytes += window_read16(vp, 6, 10);
2788 dev->stats.tx_bytes += window_read16(vp, 6, 12);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789 /* Extra stats for get_ethtool_stats() */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002790 vp->xstats.tx_multiple_collisions += window_read8(vp, 6, 2);
2791 vp->xstats.tx_single_collisions += window_read8(vp, 6, 3);
2792 vp->xstats.tx_deferred += window_read8(vp, 6, 8);
2793 vp->xstats.rx_bad_ssd += window_read8(vp, 4, 12);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002794
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002795 dev->stats.collisions = vp->xstats.tx_multiple_collisions
Steffen Klassert8d1d0342006-02-03 03:03:57 -08002796 + vp->xstats.tx_single_collisions
2797 + vp->xstats.tx_max_collisions;
2798
Linus Torvalds1da177e2005-04-16 15:20:36 -07002799 {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002800 u8 up = window_read8(vp, 4, 13);
Paulius Zaleckas1daad052008-05-05 14:01:29 +02002801 dev->stats.rx_bytes += (up & 0x0f) << 16;
2802 dev->stats.tx_bytes += (up & 0xf0) << 12;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002804}
2805
2806static int vortex_nway_reset(struct net_device *dev)
2807{
2808 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002809 unsigned long flags;
2810 int rc;
2811
2812 spin_lock_irqsave(&vp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813 rc = mii_nway_restart(&vp->mii);
2814 spin_unlock_irqrestore(&vp->lock, flags);
2815 return rc;
2816}
2817
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818static int vortex_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
2819{
2820 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821 unsigned long flags;
2822 int rc;
2823
2824 spin_lock_irqsave(&vp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002825 rc = mii_ethtool_gset(&vp->mii, cmd);
2826 spin_unlock_irqrestore(&vp->lock, flags);
2827 return rc;
2828}
2829
2830static int vortex_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
2831{
2832 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833 unsigned long flags;
2834 int rc;
2835
2836 spin_lock_irqsave(&vp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837 rc = mii_ethtool_sset(&vp->mii, cmd);
2838 spin_unlock_irqrestore(&vp->lock, flags);
2839 return rc;
2840}
2841
2842static u32 vortex_get_msglevel(struct net_device *dev)
2843{
2844 return vortex_debug;
2845}
2846
2847static void vortex_set_msglevel(struct net_device *dev, u32 dbg)
2848{
2849 vortex_debug = dbg;
2850}
2851
Jeff Garzikb9f2c042007-10-03 18:07:32 -07002852static int vortex_get_sset_count(struct net_device *dev, int sset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853{
Jeff Garzikb9f2c042007-10-03 18:07:32 -07002854 switch (sset) {
2855 case ETH_SS_STATS:
2856 return VORTEX_NUM_STATS;
2857 default:
2858 return -EOPNOTSUPP;
2859 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860}
2861
2862static void vortex_get_ethtool_stats(struct net_device *dev,
2863 struct ethtool_stats *stats, u64 *data)
2864{
2865 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08002866 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867 unsigned long flags;
2868
2869 spin_lock_irqsave(&vp->lock, flags);
John W. Linville62afe592005-11-07 00:58:02 -08002870 update_stats(ioaddr, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 spin_unlock_irqrestore(&vp->lock, flags);
2872
2873 data[0] = vp->xstats.tx_deferred;
Steffen Klassert8d1d0342006-02-03 03:03:57 -08002874 data[1] = vp->xstats.tx_max_collisions;
2875 data[2] = vp->xstats.tx_multiple_collisions;
2876 data[3] = vp->xstats.tx_single_collisions;
2877 data[4] = vp->xstats.rx_bad_ssd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878}
2879
2880
2881static void vortex_get_strings(struct net_device *dev, u32 stringset, u8 *data)
2882{
2883 switch (stringset) {
2884 case ETH_SS_STATS:
2885 memcpy(data, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
2886 break;
2887 default:
2888 WARN_ON(1);
2889 break;
2890 }
2891}
2892
2893static void vortex_get_drvinfo(struct net_device *dev,
2894 struct ethtool_drvinfo *info)
2895{
2896 struct vortex_private *vp = netdev_priv(dev);
2897
2898 strcpy(info->driver, DRV_NAME);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 if (VORTEX_PCI(vp)) {
2900 strcpy(info->bus_info, pci_name(VORTEX_PCI(vp)));
2901 } else {
2902 if (VORTEX_EISA(vp))
Stephen Hemminger86de79b2009-02-26 10:19:24 +00002903 strcpy(info->bus_info, dev_name(vp->gendev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002904 else
2905 sprintf(info->bus_info, "EISA 0x%lx %d",
2906 dev->base_addr, dev->irq);
2907 }
2908}
2909
Jeff Garzik7282d492006-09-13 14:30:00 -04002910static const struct ethtool_ops vortex_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911 .get_drvinfo = vortex_get_drvinfo,
2912 .get_strings = vortex_get_strings,
2913 .get_msglevel = vortex_get_msglevel,
2914 .set_msglevel = vortex_set_msglevel,
2915 .get_ethtool_stats = vortex_get_ethtool_stats,
Jeff Garzikb9f2c042007-10-03 18:07:32 -07002916 .get_sset_count = vortex_get_sset_count,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917 .get_settings = vortex_get_settings,
2918 .set_settings = vortex_set_settings,
Steffen Klassert373a6882006-03-26 01:37:41 -08002919 .get_link = ethtool_op_get_link,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920 .nway_reset = vortex_nway_reset,
2921};
2922
2923#ifdef CONFIG_PCI
2924/*
2925 * Must power the device up to do MDIO operations
2926 */
2927static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2928{
2929 int err;
2930 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 unsigned long flags;
Al Virocc2d6592007-08-22 21:34:46 -04002932 pci_power_t state = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002933
2934 if(VORTEX_PCI(vp))
2935 state = VORTEX_PCI(vp)->current_state;
2936
2937 /* The kernel core really should have pci_get_power_state() */
2938
2939 if(state != 0)
2940 pci_set_power_state(VORTEX_PCI(vp), PCI_D0);
2941 spin_lock_irqsave(&vp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 err = generic_mii_ioctl(&vp->mii, if_mii(rq), cmd, NULL);
2943 spin_unlock_irqrestore(&vp->lock, flags);
2944 if(state != 0)
2945 pci_set_power_state(VORTEX_PCI(vp), state);
2946
2947 return err;
2948}
2949#endif
2950
2951
2952/* Pre-Cyclone chips have no documented multicast filter, so the only
2953 multicast setting is to receive all multicast frames. At least
2954 the chip has a very clean way to set the mode, unlike many others. */
2955static void set_rx_mode(struct net_device *dev)
2956{
John W. Linville62afe592005-11-07 00:58:02 -08002957 struct vortex_private *vp = netdev_priv(dev);
2958 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959 int new_mode;
2960
2961 if (dev->flags & IFF_PROMISC) {
Andy Gospodarekd5b20692006-09-11 17:39:18 -04002962 if (vortex_debug > 3)
Alexander Beregalov39738e12009-05-26 12:35:26 +00002963 pr_notice("%s: Setting promiscuous mode.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964 new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast|RxProm;
Jiri Pirko59ce25d2010-02-17 23:12:15 +00002965 } else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002966 new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast;
2967 } else
2968 new_mode = SetRxFilter | RxStation | RxBroadcast;
2969
John W. Linville62afe592005-11-07 00:58:02 -08002970 iowrite16(new_mode, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971}
2972
2973#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
2974/* Setup the card so that it can receive frames with an 802.1q VLAN tag.
2975 Note that this must be done after each RxReset due to some backwards
2976 compatibility logic in the Cyclone and Tornado ASICs */
2977
2978/* The Ethernet Type used for 802.1q tagged frames */
2979#define VLAN_ETHER_TYPE 0x8100
2980
2981static void set_8021q_mode(struct net_device *dev, int enable)
2982{
2983 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002984 int mac_ctrl;
2985
2986 if ((vp->drv_flags&IS_CYCLONE) || (vp->drv_flags&IS_TORNADO)) {
2987 /* cyclone and tornado chipsets can recognize 802.1q
2988 * tagged frames and treat them correctly */
2989
2990 int max_pkt_size = dev->mtu+14; /* MTU+Ethernet header */
2991 if (enable)
2992 max_pkt_size += 4; /* 802.1Q VLAN tag */
2993
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002994 window_write16(vp, max_pkt_size, 3, Wn3_MaxPktSize);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995
2996 /* set VlanEtherType to let the hardware checksumming
2997 treat tagged frames correctly */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00002998 window_write16(vp, VLAN_ETHER_TYPE, 7, Wn7_VlanEtherType);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002999 } else {
3000 /* on older cards we have to enable large frames */
3001
3002 vp->large_frames = dev->mtu > 1500 || enable;
3003
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003004 mac_ctrl = window_read16(vp, 3, Wn3_MAC_Ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003005 if (vp->large_frames)
3006 mac_ctrl |= 0x40;
3007 else
3008 mac_ctrl &= ~0x40;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003009 window_write16(vp, mac_ctrl, 3, Wn3_MAC_Ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003011}
3012#else
3013
3014static void set_8021q_mode(struct net_device *dev, int enable)
3015{
3016}
3017
3018
3019#endif
3020
3021/* MII transceiver control section.
3022 Read and write the MII registers using software-generated serial
3023 MDIO protocol. See the MII specifications or DP83840A data sheet
3024 for details. */
3025
3026/* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
3027 met by back-to-back PCI I/O cycles, but we insert a delay to avoid
3028 "overclocking" issues. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003029static void mdio_delay(struct vortex_private *vp)
3030{
3031 window_read32(vp, 4, Wn4_PhysicalMgmt);
3032}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003033
3034#define MDIO_SHIFT_CLK 0x01
3035#define MDIO_DIR_WRITE 0x04
3036#define MDIO_DATA_WRITE0 (0x00 | MDIO_DIR_WRITE)
3037#define MDIO_DATA_WRITE1 (0x02 | MDIO_DIR_WRITE)
3038#define MDIO_DATA_READ 0x02
3039#define MDIO_ENB_IN 0x00
3040
3041/* Generate the preamble required for initial synchronization and
3042 a few older transceivers. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003043static void mdio_sync(struct vortex_private *vp, int bits)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003044{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003045 /* Establish sync by sending at least 32 logic ones. */
3046 while (-- bits >= 0) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003047 window_write16(vp, MDIO_DATA_WRITE1, 4, Wn4_PhysicalMgmt);
3048 mdio_delay(vp);
3049 window_write16(vp, MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK,
3050 4, Wn4_PhysicalMgmt);
3051 mdio_delay(vp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003052 }
3053}
3054
3055static int mdio_read(struct net_device *dev, int phy_id, int location)
3056{
3057 int i;
John W. Linville62afe592005-11-07 00:58:02 -08003058 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003059 int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
3060 unsigned int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003061
3062 if (mii_preamble_required)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003063 mdio_sync(vp, 32);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003064
3065 /* Shift the read command bits out. */
3066 for (i = 14; i >= 0; i--) {
3067 int dataval = (read_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003068 window_write16(vp, dataval, 4, Wn4_PhysicalMgmt);
3069 mdio_delay(vp);
3070 window_write16(vp, dataval | MDIO_SHIFT_CLK,
3071 4, Wn4_PhysicalMgmt);
3072 mdio_delay(vp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003073 }
3074 /* Read the two transition, 16 data, and wire-idle bits. */
3075 for (i = 19; i > 0; i--) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003076 window_write16(vp, MDIO_ENB_IN, 4, Wn4_PhysicalMgmt);
3077 mdio_delay(vp);
3078 retval = (retval << 1) |
3079 ((window_read16(vp, 4, Wn4_PhysicalMgmt) &
3080 MDIO_DATA_READ) ? 1 : 0);
3081 window_write16(vp, MDIO_ENB_IN | MDIO_SHIFT_CLK,
3082 4, Wn4_PhysicalMgmt);
3083 mdio_delay(vp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003084 }
3085 return retval & 0x20000 ? 0xffff : retval>>1 & 0xffff;
3086}
3087
3088static void mdio_write(struct net_device *dev, int phy_id, int location, int value)
3089{
John W. Linville62afe592005-11-07 00:58:02 -08003090 struct vortex_private *vp = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003091 int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003092 int i;
3093
3094 if (mii_preamble_required)
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003095 mdio_sync(vp, 32);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003096
3097 /* Shift the command bits out. */
3098 for (i = 31; i >= 0; i--) {
3099 int dataval = (write_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003100 window_write16(vp, dataval, 4, Wn4_PhysicalMgmt);
3101 mdio_delay(vp);
3102 window_write16(vp, dataval | MDIO_SHIFT_CLK,
3103 4, Wn4_PhysicalMgmt);
3104 mdio_delay(vp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003105 }
3106 /* Leave the interface idle. */
3107 for (i = 1; i >= 0; i--) {
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003108 window_write16(vp, MDIO_ENB_IN, 4, Wn4_PhysicalMgmt);
3109 mdio_delay(vp);
3110 window_write16(vp, MDIO_ENB_IN | MDIO_SHIFT_CLK,
3111 4, Wn4_PhysicalMgmt);
3112 mdio_delay(vp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003113 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003114}
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003115
Linus Torvalds1da177e2005-04-16 15:20:36 -07003116/* ACPI: Advanced Configuration and Power Interface. */
3117/* Set Wake-On-LAN mode and put the board into D3 (power-down) state. */
3118static void acpi_set_WOL(struct net_device *dev)
3119{
3120 struct vortex_private *vp = netdev_priv(dev);
John W. Linville62afe592005-11-07 00:58:02 -08003121 void __iomem *ioaddr = vp->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122
Steffen Klassertc17931c2009-01-09 03:53:17 +00003123 device_set_wakeup_enable(vp->gendev, vp->enable_wol);
3124
Linus Torvalds1da177e2005-04-16 15:20:36 -07003125 if (vp->enable_wol) {
3126 /* Power up on: 1==Downloaded Filter, 2==Magic Packets, 4==Link Status. */
Ben Hutchingsa095cfc2010-06-23 13:54:31 +00003127 window_write16(vp, 2, 7, 0x0c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003128 /* The RxFilter must accept the WOL frames. */
John W. Linville62afe592005-11-07 00:58:02 -08003129 iowrite16(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
3130 iowrite16(RxEnable, ioaddr + EL3_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003131
Steffen Klassert1a1769f2007-10-16 14:24:09 -07003132 if (pci_enable_wake(VORTEX_PCI(vp), PCI_D3hot, 1)) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00003133 pr_info("%s: WOL not supported.\n", pci_name(VORTEX_PCI(vp)));
Steffen Klassert1a1769f2007-10-16 14:24:09 -07003134
3135 vp->enable_wol = 0;
3136 return;
3137 }
Daniel Ritz3c8fad12005-05-05 16:15:44 -07003138
3139 /* Change the power state to D3; RxEnable doesn't take effect. */
3140 pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142}
3143
3144
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003145static void __devexit vortex_remove_one(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003146{
3147 struct net_device *dev = pci_get_drvdata(pdev);
3148 struct vortex_private *vp;
3149
3150 if (!dev) {
Alexander Beregalov39738e12009-05-26 12:35:26 +00003151 pr_err("vortex_remove_one called for Compaq device!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152 BUG();
3153 }
3154
3155 vp = netdev_priv(dev);
3156
John W. Linville62afe592005-11-07 00:58:02 -08003157 if (vp->cb_fn_base)
3158 pci_iounmap(VORTEX_PCI(vp), vp->cb_fn_base);
3159
Linus Torvalds1da177e2005-04-16 15:20:36 -07003160 unregister_netdev(dev);
3161
3162 if (VORTEX_PCI(vp)) {
3163 pci_set_power_state(VORTEX_PCI(vp), PCI_D0); /* Go active */
3164 if (vp->pm_state_valid)
3165 pci_restore_state(VORTEX_PCI(vp));
3166 pci_disable_device(VORTEX_PCI(vp));
3167 }
3168 /* Should really use issue_and_wait() here */
John W. Linville62afe592005-11-07 00:58:02 -08003169 iowrite16(TotalReset | ((vp->drv_flags & EEPROM_RESET) ? 0x04 : 0x14),
3170 vp->ioaddr + EL3_CMD);
3171
3172 pci_iounmap(VORTEX_PCI(vp), vp->ioaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003173
3174 pci_free_consistent(pdev,
3175 sizeof(struct boom_rx_desc) * RX_RING_SIZE
3176 + sizeof(struct boom_tx_desc) * TX_RING_SIZE,
3177 vp->rx_ring,
3178 vp->rx_ring_dma);
3179 if (vp->must_free_region)
3180 release_region(dev->base_addr, vp->io_size);
3181 free_netdev(dev);
3182}
3183
3184
3185static struct pci_driver vortex_driver = {
3186 .name = "3c59x",
3187 .probe = vortex_init_one,
3188 .remove = __devexit_p(vortex_remove_one),
3189 .id_table = vortex_pci_tbl,
Anton Vorontsov7bfc4ab2009-09-30 20:11:11 -07003190 .driver.pm = VORTEX_PM_OPS,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003191};
3192
3193
3194static int vortex_have_pci;
3195static int vortex_have_eisa;
3196
3197
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003198static int __init vortex_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003199{
3200 int pci_rc, eisa_rc;
3201
Jeff Garzik29917622006-08-19 17:48:59 -04003202 pci_rc = pci_register_driver(&vortex_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203 eisa_rc = vortex_eisa_init();
3204
3205 if (pci_rc == 0)
3206 vortex_have_pci = 1;
3207 if (eisa_rc > 0)
3208 vortex_have_eisa = 1;
3209
3210 return (vortex_have_pci + vortex_have_eisa) ? 0 : -ENODEV;
3211}
3212
3213
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003214static void __exit vortex_eisa_cleanup(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215{
3216 struct vortex_private *vp;
John W. Linville62afe592005-11-07 00:58:02 -08003217 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218
3219#ifdef CONFIG_EISA
3220 /* Take care of the EISA devices */
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003221 eisa_driver_unregister(&vortex_eisa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003222#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003223
Linus Torvalds1da177e2005-04-16 15:20:36 -07003224 if (compaq_net_device) {
Wang Chen454d7c92008-11-12 23:37:49 -08003225 vp = netdev_priv(compaq_net_device);
John W. Linville62afe592005-11-07 00:58:02 -08003226 ioaddr = ioport_map(compaq_net_device->base_addr,
3227 VORTEX_TOTAL_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003228
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003229 unregister_netdev(compaq_net_device);
3230 iowrite16(TotalReset, ioaddr + EL3_CMD);
John W. Linville62afe592005-11-07 00:58:02 -08003231 release_region(compaq_net_device->base_addr,
3232 VORTEX_TOTAL_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003233
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003234 free_netdev(compaq_net_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003235 }
3236}
3237
3238
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003239static void __exit vortex_cleanup(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003240{
3241 if (vortex_have_pci)
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003242 pci_unregister_driver(&vortex_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243 if (vortex_have_eisa)
Steffen Klasserta880c4c2006-03-26 01:37:43 -08003244 vortex_eisa_cleanup();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003245}
3246
3247
3248module_init(vortex_init);
3249module_exit(vortex_cleanup);