xref: /openbmc/linux/drivers/net/ethernet/via/via-rhine.c (revision 2d283862dc62daead9db0dc89cd0d0351e91f765)
1f2148a47SJeff Kirsher /* via-rhine.c: A Linux Ethernet device driver for VIA Rhine family chips. */
2f2148a47SJeff Kirsher /*
3f2148a47SJeff Kirsher 	Written 1998-2001 by Donald Becker.
4f2148a47SJeff Kirsher 
5f2148a47SJeff Kirsher 	Current Maintainer: Roger Luethi <rl@hellgate.ch>
6f2148a47SJeff Kirsher 
7f2148a47SJeff Kirsher 	This software may be used and distributed according to the terms of
8f2148a47SJeff Kirsher 	the GNU General Public License (GPL), incorporated herein by reference.
9f2148a47SJeff Kirsher 	Drivers based on or derived from this code fall under the GPL and must
10f2148a47SJeff Kirsher 	retain the authorship, copyright and license notice.  This file is not
11f2148a47SJeff Kirsher 	a complete program and may only be used when the entire operating
12f2148a47SJeff Kirsher 	system is licensed under the GPL.
13f2148a47SJeff Kirsher 
14f2148a47SJeff Kirsher 	This driver is designed for the VIA VT86C100A Rhine-I.
15f2148a47SJeff Kirsher 	It also works with the Rhine-II (6102) and Rhine-III (6105/6105L/6105LOM
16f2148a47SJeff Kirsher 	and management NIC 6105M).
17f2148a47SJeff Kirsher 
18f2148a47SJeff Kirsher 	The author may be reached as becker@scyld.com, or C/O
19f2148a47SJeff Kirsher 	Scyld Computing Corporation
20f2148a47SJeff Kirsher 	410 Severn Ave., Suite 210
21f2148a47SJeff Kirsher 	Annapolis MD 21403
22f2148a47SJeff Kirsher 
23f2148a47SJeff Kirsher 
24f2148a47SJeff Kirsher 	This driver contains some changes from the original Donald Becker
25f2148a47SJeff Kirsher 	version. He may or may not be interested in bug reports on this
26f2148a47SJeff Kirsher 	code. You can find his versions at:
27f2148a47SJeff Kirsher 	http://www.scyld.com/network/via-rhine.html
28f2148a47SJeff Kirsher 	[link no longer provides useful info -jgarzik]
29f2148a47SJeff Kirsher 
30f2148a47SJeff Kirsher */
31f2148a47SJeff Kirsher 
32f2148a47SJeff Kirsher #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
33f2148a47SJeff Kirsher 
34f2148a47SJeff Kirsher #define DRV_NAME	"via-rhine"
35207070f5SRoger Luethi #define DRV_VERSION	"1.5.1"
36f2148a47SJeff Kirsher #define DRV_RELDATE	"2010-10-09"
37f2148a47SJeff Kirsher 
38eb939922SRusty Russell #include <linux/types.h>
39f2148a47SJeff Kirsher 
40f2148a47SJeff Kirsher /* A few user-configurable values.
41f2148a47SJeff Kirsher    These may be modified when a driver module is loaded. */
42fc3e0f8aSFrancois Romieu static int debug = 0;
43fc3e0f8aSFrancois Romieu #define RHINE_MSG_DEFAULT \
44fc3e0f8aSFrancois Romieu         (0x0000)
45f2148a47SJeff Kirsher 
46f2148a47SJeff Kirsher /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
47f2148a47SJeff Kirsher    Setting to > 1518 effectively disables this feature. */
48f2148a47SJeff Kirsher #if defined(__alpha__) || defined(__arm__) || defined(__hppa__) || \
49f2148a47SJeff Kirsher 	defined(CONFIG_SPARC) || defined(__ia64__) ||		   \
50f2148a47SJeff Kirsher 	defined(__sh__) || defined(__mips__)
51f2148a47SJeff Kirsher static int rx_copybreak = 1518;
52f2148a47SJeff Kirsher #else
53f2148a47SJeff Kirsher static int rx_copybreak;
54f2148a47SJeff Kirsher #endif
55f2148a47SJeff Kirsher 
56f2148a47SJeff Kirsher /* Work-around for broken BIOSes: they are unable to get the chip back out of
57f2148a47SJeff Kirsher    power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */
58eb939922SRusty Russell static bool avoid_D3;
59f2148a47SJeff Kirsher 
60f2148a47SJeff Kirsher /*
61f2148a47SJeff Kirsher  * In case you are looking for 'options[]' or 'full_duplex[]', they
62f2148a47SJeff Kirsher  * are gone. Use ethtool(8) instead.
63f2148a47SJeff Kirsher  */
64f2148a47SJeff Kirsher 
65f2148a47SJeff Kirsher /* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
66f2148a47SJeff Kirsher    The Rhine has a 64 element 8390-like hash table. */
67f2148a47SJeff Kirsher static const int multicast_filter_limit = 32;
68f2148a47SJeff Kirsher 
69f2148a47SJeff Kirsher 
70f2148a47SJeff Kirsher /* Operational parameters that are set at compile time. */
71f2148a47SJeff Kirsher 
72f2148a47SJeff Kirsher /* Keep the ring sizes a power of two for compile efficiency.
73f2148a47SJeff Kirsher    The compiler will convert <unsigned>'%'<2^N> into a bit mask.
74f2148a47SJeff Kirsher    Making the Tx ring too large decreases the effectiveness of channel
75f2148a47SJeff Kirsher    bonding and packet priority.
76f2148a47SJeff Kirsher    There are no ill effects from too-large receive rings. */
77f2148a47SJeff Kirsher #define TX_RING_SIZE	16
78f2148a47SJeff Kirsher #define TX_QUEUE_LEN	10	/* Limit ring entries actually used. */
79f2148a47SJeff Kirsher #define RX_RING_SIZE	64
80f2148a47SJeff Kirsher 
81f2148a47SJeff Kirsher /* Operational parameters that usually are not changed. */
82f2148a47SJeff Kirsher 
83f2148a47SJeff Kirsher /* Time in jiffies before concluding the transmitter is hung. */
84f2148a47SJeff Kirsher #define TX_TIMEOUT	(2*HZ)
85f2148a47SJeff Kirsher 
86f2148a47SJeff Kirsher #define PKT_BUF_SZ	1536	/* Size of each temporary Rx buffer.*/
87f2148a47SJeff Kirsher 
88f2148a47SJeff Kirsher #include <linux/module.h>
89f2148a47SJeff Kirsher #include <linux/moduleparam.h>
90f2148a47SJeff Kirsher #include <linux/kernel.h>
91f2148a47SJeff Kirsher #include <linux/string.h>
92f2148a47SJeff Kirsher #include <linux/timer.h>
93f2148a47SJeff Kirsher #include <linux/errno.h>
94f2148a47SJeff Kirsher #include <linux/ioport.h>
95f2148a47SJeff Kirsher #include <linux/interrupt.h>
96f2148a47SJeff Kirsher #include <linux/pci.h>
97*2d283862SAlexey Charkov #include <linux/of_address.h>
98*2d283862SAlexey Charkov #include <linux/of_device.h>
99*2d283862SAlexey Charkov #include <linux/of_irq.h>
100*2d283862SAlexey Charkov #include <linux/platform_device.h>
101f2148a47SJeff Kirsher #include <linux/dma-mapping.h>
102f2148a47SJeff Kirsher #include <linux/netdevice.h>
103f2148a47SJeff Kirsher #include <linux/etherdevice.h>
104f2148a47SJeff Kirsher #include <linux/skbuff.h>
105f2148a47SJeff Kirsher #include <linux/init.h>
106f2148a47SJeff Kirsher #include <linux/delay.h>
107f2148a47SJeff Kirsher #include <linux/mii.h>
108f2148a47SJeff Kirsher #include <linux/ethtool.h>
109f2148a47SJeff Kirsher #include <linux/crc32.h>
110f2148a47SJeff Kirsher #include <linux/if_vlan.h>
111f2148a47SJeff Kirsher #include <linux/bitops.h>
112f2148a47SJeff Kirsher #include <linux/workqueue.h>
113f2148a47SJeff Kirsher #include <asm/processor.h>	/* Processor type for cache alignment. */
114f2148a47SJeff Kirsher #include <asm/io.h>
115f2148a47SJeff Kirsher #include <asm/irq.h>
116f2148a47SJeff Kirsher #include <asm/uaccess.h>
117f2148a47SJeff Kirsher #include <linux/dmi.h>
118f2148a47SJeff Kirsher 
119f2148a47SJeff Kirsher /* These identify the driver base version and may not be removed. */
12076e239e1SBill Pemberton static const char version[] =
121f2148a47SJeff Kirsher 	"v1.10-LK" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker";
122f2148a47SJeff Kirsher 
123f2148a47SJeff Kirsher /* This driver was written to use PCI memory space. Some early versions
124f2148a47SJeff Kirsher    of the Rhine may only work correctly with I/O space accesses. */
125f2148a47SJeff Kirsher #ifdef CONFIG_VIA_RHINE_MMIO
126f2148a47SJeff Kirsher #define USE_MMIO
127f2148a47SJeff Kirsher #else
128f2148a47SJeff Kirsher #endif
129f2148a47SJeff Kirsher 
130f2148a47SJeff Kirsher MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
131f2148a47SJeff Kirsher MODULE_DESCRIPTION("VIA Rhine PCI Fast Ethernet driver");
132f2148a47SJeff Kirsher MODULE_LICENSE("GPL");
133f2148a47SJeff Kirsher 
134f2148a47SJeff Kirsher module_param(debug, int, 0);
135f2148a47SJeff Kirsher module_param(rx_copybreak, int, 0);
136f2148a47SJeff Kirsher module_param(avoid_D3, bool, 0);
137fc3e0f8aSFrancois Romieu MODULE_PARM_DESC(debug, "VIA Rhine debug message flags");
138f2148a47SJeff Kirsher MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames");
139f2148a47SJeff Kirsher MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)");
140f2148a47SJeff Kirsher 
141f2148a47SJeff Kirsher #define MCAM_SIZE	32
142f2148a47SJeff Kirsher #define VCAM_SIZE	32
143f2148a47SJeff Kirsher 
144f2148a47SJeff Kirsher /*
145f2148a47SJeff Kirsher 		Theory of Operation
146f2148a47SJeff Kirsher 
147f2148a47SJeff Kirsher I. Board Compatibility
148f2148a47SJeff Kirsher 
149f2148a47SJeff Kirsher This driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet
150f2148a47SJeff Kirsher controller.
151f2148a47SJeff Kirsher 
152f2148a47SJeff Kirsher II. Board-specific settings
153f2148a47SJeff Kirsher 
154f2148a47SJeff Kirsher Boards with this chip are functional only in a bus-master PCI slot.
155f2148a47SJeff Kirsher 
156f2148a47SJeff Kirsher Many operational settings are loaded from the EEPROM to the Config word at
157f2148a47SJeff Kirsher offset 0x78. For most of these settings, this driver assumes that they are
158f2148a47SJeff Kirsher correct.
159f2148a47SJeff Kirsher If this driver is compiled to use PCI memory space operations the EEPROM
160f2148a47SJeff Kirsher must be configured to enable memory ops.
161f2148a47SJeff Kirsher 
162f2148a47SJeff Kirsher III. Driver operation
163f2148a47SJeff Kirsher 
164f2148a47SJeff Kirsher IIIa. Ring buffers
165f2148a47SJeff Kirsher 
166f2148a47SJeff Kirsher This driver uses two statically allocated fixed-size descriptor lists
167f2148a47SJeff Kirsher formed into rings by a branch from the final descriptor to the beginning of
168f2148a47SJeff Kirsher the list. The ring sizes are set at compile time by RX/TX_RING_SIZE.
169f2148a47SJeff Kirsher 
170f2148a47SJeff Kirsher IIIb/c. Transmit/Receive Structure
171f2148a47SJeff Kirsher 
172f2148a47SJeff Kirsher This driver attempts to use a zero-copy receive and transmit scheme.
173f2148a47SJeff Kirsher 
174f2148a47SJeff Kirsher Alas, all data buffers are required to start on a 32 bit boundary, so
175f2148a47SJeff Kirsher the driver must often copy transmit packets into bounce buffers.
176f2148a47SJeff Kirsher 
177f2148a47SJeff Kirsher The driver allocates full frame size skbuffs for the Rx ring buffers at
178f2148a47SJeff Kirsher open() time and passes the skb->data field to the chip as receive data
179f2148a47SJeff Kirsher buffers. When an incoming frame is less than RX_COPYBREAK bytes long,
180f2148a47SJeff Kirsher a fresh skbuff is allocated and the frame is copied to the new skbuff.
181f2148a47SJeff Kirsher When the incoming frame is larger, the skbuff is passed directly up the
182f2148a47SJeff Kirsher protocol stack. Buffers consumed this way are replaced by newly allocated
183f2148a47SJeff Kirsher skbuffs in the last phase of rhine_rx().
184f2148a47SJeff Kirsher 
185f2148a47SJeff Kirsher The RX_COPYBREAK value is chosen to trade-off the memory wasted by
186f2148a47SJeff Kirsher using a full-sized skbuff for small frames vs. the copying costs of larger
187f2148a47SJeff Kirsher frames. New boards are typically used in generously configured machines
188f2148a47SJeff Kirsher and the underfilled buffers have negligible impact compared to the benefit of
189f2148a47SJeff Kirsher a single allocation size, so the default value of zero results in never
190f2148a47SJeff Kirsher copying packets. When copying is done, the cost is usually mitigated by using
191f2148a47SJeff Kirsher a combined copy/checksum routine. Copying also preloads the cache, which is
192f2148a47SJeff Kirsher most useful with small frames.
193f2148a47SJeff Kirsher 
194f2148a47SJeff Kirsher Since the VIA chips are only able to transfer data to buffers on 32 bit
195f2148a47SJeff Kirsher boundaries, the IP header at offset 14 in an ethernet frame isn't
196f2148a47SJeff Kirsher longword aligned for further processing. Copying these unaligned buffers
197f2148a47SJeff Kirsher has the beneficial effect of 16-byte aligning the IP header.
198f2148a47SJeff Kirsher 
199f2148a47SJeff Kirsher IIId. Synchronization
200f2148a47SJeff Kirsher 
201f2148a47SJeff Kirsher The driver runs as two independent, single-threaded flows of control. One
202f2148a47SJeff Kirsher is the send-packet routine, which enforces single-threaded use by the
203f2148a47SJeff Kirsher netdev_priv(dev)->lock spinlock. The other thread is the interrupt handler,
204f2148a47SJeff Kirsher which is single threaded by the hardware and interrupt handling software.
205f2148a47SJeff Kirsher 
206f2148a47SJeff Kirsher The send packet thread has partial control over the Tx ring. It locks the
207f2148a47SJeff Kirsher netdev_priv(dev)->lock whenever it's queuing a Tx packet. If the next slot in
208f2148a47SJeff Kirsher the ring is not available it stops the transmit queue by
209f2148a47SJeff Kirsher calling netif_stop_queue.
210f2148a47SJeff Kirsher 
211f2148a47SJeff Kirsher The interrupt handler has exclusive control over the Rx ring and records stats
212f2148a47SJeff Kirsher from the Tx ring. After reaping the stats, it marks the Tx queue entry as
213f2148a47SJeff Kirsher empty by incrementing the dirty_tx mark. If at least half of the entries in
214f2148a47SJeff Kirsher the Rx ring are available the transmit queue is woken up if it was stopped.
215f2148a47SJeff Kirsher 
216f2148a47SJeff Kirsher IV. Notes
217f2148a47SJeff Kirsher 
218f2148a47SJeff Kirsher IVb. References
219f2148a47SJeff Kirsher 
220f2148a47SJeff Kirsher Preliminary VT86C100A manual from http://www.via.com.tw/
221f2148a47SJeff Kirsher http://www.scyld.com/expert/100mbps.html
222f2148a47SJeff Kirsher http://www.scyld.com/expert/NWay.html
223f2148a47SJeff Kirsher ftp://ftp.via.com.tw/public/lan/Products/NIC/VT86C100A/Datasheet/VT86C100A03.pdf
224f2148a47SJeff Kirsher ftp://ftp.via.com.tw/public/lan/Products/NIC/VT6102/Datasheet/VT6102_021.PDF
225f2148a47SJeff Kirsher 
226f2148a47SJeff Kirsher 
227f2148a47SJeff Kirsher IVc. Errata
228f2148a47SJeff Kirsher 
229f2148a47SJeff Kirsher The VT86C100A manual is not reliable information.
230f2148a47SJeff Kirsher The 3043 chip does not handle unaligned transmit or receive buffers, resulting
231f2148a47SJeff Kirsher in significant performance degradation for bounce buffer copies on transmit
232f2148a47SJeff Kirsher and unaligned IP headers on receive.
233f2148a47SJeff Kirsher The chip does not pad to minimum transmit length.
234f2148a47SJeff Kirsher 
235f2148a47SJeff Kirsher */
236f2148a47SJeff Kirsher 
237f2148a47SJeff Kirsher 
238f2148a47SJeff Kirsher /* This table drives the PCI probe routines. It's mostly boilerplate in all
239f2148a47SJeff Kirsher    of the drivers, and will likely be provided by some future kernel.
240f2148a47SJeff Kirsher    Note the matching code -- the first table entry matchs all 56** cards but
241f2148a47SJeff Kirsher    second only the 1234 card.
242f2148a47SJeff Kirsher */
243f2148a47SJeff Kirsher 
244f2148a47SJeff Kirsher enum rhine_revs {
245f2148a47SJeff Kirsher 	VT86C100A	= 0x00,
246f2148a47SJeff Kirsher 	VTunknown0	= 0x20,
247f2148a47SJeff Kirsher 	VT6102		= 0x40,
248f2148a47SJeff Kirsher 	VT8231		= 0x50,	/* Integrated MAC */
249f2148a47SJeff Kirsher 	VT8233		= 0x60,	/* Integrated MAC */
250f2148a47SJeff Kirsher 	VT8235		= 0x74,	/* Integrated MAC */
251f2148a47SJeff Kirsher 	VT8237		= 0x78,	/* Integrated MAC */
252f2148a47SJeff Kirsher 	VTunknown1	= 0x7C,
253f2148a47SJeff Kirsher 	VT6105		= 0x80,
254f2148a47SJeff Kirsher 	VT6105_B0	= 0x83,
255f2148a47SJeff Kirsher 	VT6105L		= 0x8A,
256f2148a47SJeff Kirsher 	VT6107		= 0x8C,
257f2148a47SJeff Kirsher 	VTunknown2	= 0x8E,
258f2148a47SJeff Kirsher 	VT6105M		= 0x90,	/* Management adapter */
259f2148a47SJeff Kirsher };
260f2148a47SJeff Kirsher 
261f2148a47SJeff Kirsher enum rhine_quirks {
262f2148a47SJeff Kirsher 	rqWOL		= 0x0001,	/* Wake-On-LAN support */
263f2148a47SJeff Kirsher 	rqForceReset	= 0x0002,
264f2148a47SJeff Kirsher 	rq6patterns	= 0x0040,	/* 6 instead of 4 patterns for WOL */
265f2148a47SJeff Kirsher 	rqStatusWBRace	= 0x0080,	/* Tx Status Writeback Error possible */
266f2148a47SJeff Kirsher 	rqRhineI	= 0x0100,	/* See comment below */
267f2148a47SJeff Kirsher };
268f2148a47SJeff Kirsher /*
269f2148a47SJeff Kirsher  * rqRhineI: VT86C100A (aka Rhine-I) uses different bits to enable
270f2148a47SJeff Kirsher  * MMIO as well as for the collision counter and the Tx FIFO underflow
271f2148a47SJeff Kirsher  * indicator. In addition, Tx and Rx buffers need to 4 byte aligned.
272f2148a47SJeff Kirsher  */
273f2148a47SJeff Kirsher 
274f2148a47SJeff Kirsher /* Beware of PCI posted writes */
275f2148a47SJeff Kirsher #define IOSYNC	do { ioread8(ioaddr + StationAddr); } while (0)
276f2148a47SJeff Kirsher 
277f2148a47SJeff Kirsher static DEFINE_PCI_DEVICE_TABLE(rhine_pci_tbl) = {
278f2148a47SJeff Kirsher 	{ 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, },	/* VT86C100A */
279f2148a47SJeff Kirsher 	{ 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, },	/* VT6102 */
280f2148a47SJeff Kirsher 	{ 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, },	/* 6105{,L,LOM} */
281f2148a47SJeff Kirsher 	{ 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, },	/* VT6105M */
282f2148a47SJeff Kirsher 	{ }	/* terminate list */
283f2148a47SJeff Kirsher };
284f2148a47SJeff Kirsher MODULE_DEVICE_TABLE(pci, rhine_pci_tbl);
285f2148a47SJeff Kirsher 
286*2d283862SAlexey Charkov /* OpenFirmware identifiers for platform-bus devices
287*2d283862SAlexey Charkov  * The .data field is currently only used to store chip revision
288*2d283862SAlexey Charkov  * (for quirks etc.)
289*2d283862SAlexey Charkov  */
290*2d283862SAlexey Charkov static struct of_device_id rhine_of_tbl[] = {
291*2d283862SAlexey Charkov 	{ .compatible = "via,vt8500-rhine", .data = (void *)0x84 },
292*2d283862SAlexey Charkov 	{ }	/* terminate list */
293*2d283862SAlexey Charkov };
294*2d283862SAlexey Charkov MODULE_DEVICE_TABLE(of, rhine_of_tbl);
295f2148a47SJeff Kirsher 
296f2148a47SJeff Kirsher /* Offsets to the device registers. */
297f2148a47SJeff Kirsher enum register_offsets {
298f2148a47SJeff Kirsher 	StationAddr=0x00, RxConfig=0x06, TxConfig=0x07, ChipCmd=0x08,
299f2148a47SJeff Kirsher 	ChipCmd1=0x09, TQWake=0x0A,
300f2148a47SJeff Kirsher 	IntrStatus=0x0C, IntrEnable=0x0E,
301f2148a47SJeff Kirsher 	MulticastFilter0=0x10, MulticastFilter1=0x14,
302f2148a47SJeff Kirsher 	RxRingPtr=0x18, TxRingPtr=0x1C, GFIFOTest=0x54,
303f2148a47SJeff Kirsher 	MIIPhyAddr=0x6C, MIIStatus=0x6D, PCIBusConfig=0x6E, PCIBusConfig1=0x6F,
304f2148a47SJeff Kirsher 	MIICmd=0x70, MIIRegAddr=0x71, MIIData=0x72, MACRegEEcsr=0x74,
305f2148a47SJeff Kirsher 	ConfigA=0x78, ConfigB=0x79, ConfigC=0x7A, ConfigD=0x7B,
306f2148a47SJeff Kirsher 	RxMissed=0x7C, RxCRCErrs=0x7E, MiscCmd=0x81,
307f2148a47SJeff Kirsher 	StickyHW=0x83, IntrStatus2=0x84,
308f2148a47SJeff Kirsher 	CamMask=0x88, CamCon=0x92, CamAddr=0x93,
309f2148a47SJeff Kirsher 	WOLcrSet=0xA0, PwcfgSet=0xA1, WOLcgSet=0xA3, WOLcrClr=0xA4,
310f2148a47SJeff Kirsher 	WOLcrClr1=0xA6, WOLcgClr=0xA7,
311f2148a47SJeff Kirsher 	PwrcsrSet=0xA8, PwrcsrSet1=0xA9, PwrcsrClr=0xAC, PwrcsrClr1=0xAD,
312f2148a47SJeff Kirsher };
313f2148a47SJeff Kirsher 
314f2148a47SJeff Kirsher /* Bits in ConfigD */
315f2148a47SJeff Kirsher enum backoff_bits {
316f2148a47SJeff Kirsher 	BackOptional=0x01, BackModify=0x02,
317f2148a47SJeff Kirsher 	BackCaptureEffect=0x04, BackRandom=0x08
318f2148a47SJeff Kirsher };
319f2148a47SJeff Kirsher 
320f2148a47SJeff Kirsher /* Bits in the TxConfig (TCR) register */
321f2148a47SJeff Kirsher enum tcr_bits {
322f2148a47SJeff Kirsher 	TCR_PQEN=0x01,
323f2148a47SJeff Kirsher 	TCR_LB0=0x02,		/* loopback[0] */
324f2148a47SJeff Kirsher 	TCR_LB1=0x04,		/* loopback[1] */
325f2148a47SJeff Kirsher 	TCR_OFSET=0x08,
326f2148a47SJeff Kirsher 	TCR_RTGOPT=0x10,
327f2148a47SJeff Kirsher 	TCR_RTFT0=0x20,
328f2148a47SJeff Kirsher 	TCR_RTFT1=0x40,
329f2148a47SJeff Kirsher 	TCR_RTSF=0x80,
330f2148a47SJeff Kirsher };
331f2148a47SJeff Kirsher 
332f2148a47SJeff Kirsher /* Bits in the CamCon (CAMC) register */
333f2148a47SJeff Kirsher enum camcon_bits {
334f2148a47SJeff Kirsher 	CAMC_CAMEN=0x01,
335f2148a47SJeff Kirsher 	CAMC_VCAMSL=0x02,
336f2148a47SJeff Kirsher 	CAMC_CAMWR=0x04,
337f2148a47SJeff Kirsher 	CAMC_CAMRD=0x08,
338f2148a47SJeff Kirsher };
339f2148a47SJeff Kirsher 
340f2148a47SJeff Kirsher /* Bits in the PCIBusConfig1 (BCR1) register */
341f2148a47SJeff Kirsher enum bcr1_bits {
342f2148a47SJeff Kirsher 	BCR1_POT0=0x01,
343f2148a47SJeff Kirsher 	BCR1_POT1=0x02,
344f2148a47SJeff Kirsher 	BCR1_POT2=0x04,
345f2148a47SJeff Kirsher 	BCR1_CTFT0=0x08,
346f2148a47SJeff Kirsher 	BCR1_CTFT1=0x10,
347f2148a47SJeff Kirsher 	BCR1_CTSF=0x20,
348f2148a47SJeff Kirsher 	BCR1_TXQNOBK=0x40,	/* for VT6105 */
349f2148a47SJeff Kirsher 	BCR1_VIDFR=0x80,	/* for VT6105 */
350f2148a47SJeff Kirsher 	BCR1_MED0=0x40,		/* for VT6102 */
351f2148a47SJeff Kirsher 	BCR1_MED1=0x80,		/* for VT6102 */
352f2148a47SJeff Kirsher };
353f2148a47SJeff Kirsher 
354f2148a47SJeff Kirsher #ifdef USE_MMIO
355f2148a47SJeff Kirsher /* Registers we check that mmio and reg are the same. */
356f2148a47SJeff Kirsher static const int mmio_verify_registers[] = {
357f2148a47SJeff Kirsher 	RxConfig, TxConfig, IntrEnable, ConfigA, ConfigB, ConfigC, ConfigD,
358f2148a47SJeff Kirsher 	0
359f2148a47SJeff Kirsher };
360f2148a47SJeff Kirsher #endif
361f2148a47SJeff Kirsher 
362f2148a47SJeff Kirsher /* Bits in the interrupt status/mask registers. */
363f2148a47SJeff Kirsher enum intr_status_bits {
3647ab87ff4SFrancois Romieu 	IntrRxDone	= 0x0001,
3657ab87ff4SFrancois Romieu 	IntrTxDone	= 0x0002,
3667ab87ff4SFrancois Romieu 	IntrRxErr	= 0x0004,
3677ab87ff4SFrancois Romieu 	IntrTxError	= 0x0008,
3687ab87ff4SFrancois Romieu 	IntrRxEmpty	= 0x0020,
369f2148a47SJeff Kirsher 	IntrPCIErr	= 0x0040,
3707ab87ff4SFrancois Romieu 	IntrStatsMax	= 0x0080,
3717ab87ff4SFrancois Romieu 	IntrRxEarly	= 0x0100,
3727ab87ff4SFrancois Romieu 	IntrTxUnderrun	= 0x0210,
3737ab87ff4SFrancois Romieu 	IntrRxOverflow	= 0x0400,
3747ab87ff4SFrancois Romieu 	IntrRxDropped	= 0x0800,
3757ab87ff4SFrancois Romieu 	IntrRxNoBuf	= 0x1000,
3767ab87ff4SFrancois Romieu 	IntrTxAborted	= 0x2000,
3777ab87ff4SFrancois Romieu 	IntrLinkChange	= 0x4000,
378f2148a47SJeff Kirsher 	IntrRxWakeUp	= 0x8000,
379f2148a47SJeff Kirsher 	IntrTxDescRace		= 0x080000,	/* mapped from IntrStatus2 */
3807ab87ff4SFrancois Romieu 	IntrNormalSummary	= IntrRxDone | IntrTxDone,
3817ab87ff4SFrancois Romieu 	IntrTxErrSummary	= IntrTxDescRace | IntrTxAborted | IntrTxError |
3827ab87ff4SFrancois Romieu 				  IntrTxUnderrun,
383f2148a47SJeff Kirsher };
384f2148a47SJeff Kirsher 
385f2148a47SJeff Kirsher /* Bits in WOLcrSet/WOLcrClr and PwrcsrSet/PwrcsrClr */
386f2148a47SJeff Kirsher enum wol_bits {
387f2148a47SJeff Kirsher 	WOLucast	= 0x10,
388f2148a47SJeff Kirsher 	WOLmagic	= 0x20,
389f2148a47SJeff Kirsher 	WOLbmcast	= 0x30,
390f2148a47SJeff Kirsher 	WOLlnkon	= 0x40,
391f2148a47SJeff Kirsher 	WOLlnkoff	= 0x80,
392f2148a47SJeff Kirsher };
393f2148a47SJeff Kirsher 
394f2148a47SJeff Kirsher /* The Rx and Tx buffer descriptors. */
395f2148a47SJeff Kirsher struct rx_desc {
396f2148a47SJeff Kirsher 	__le32 rx_status;
397f2148a47SJeff Kirsher 	__le32 desc_length; /* Chain flag, Buffer/frame length */
398f2148a47SJeff Kirsher 	__le32 addr;
399f2148a47SJeff Kirsher 	__le32 next_desc;
400f2148a47SJeff Kirsher };
401f2148a47SJeff Kirsher struct tx_desc {
402f2148a47SJeff Kirsher 	__le32 tx_status;
403f2148a47SJeff Kirsher 	__le32 desc_length; /* Chain flag, Tx Config, Frame length */
404f2148a47SJeff Kirsher 	__le32 addr;
405f2148a47SJeff Kirsher 	__le32 next_desc;
406f2148a47SJeff Kirsher };
407f2148a47SJeff Kirsher 
408f2148a47SJeff Kirsher /* Initial value for tx_desc.desc_length, Buffer size goes to bits 0-10 */
409f2148a47SJeff Kirsher #define TXDESC		0x00e08000
410f2148a47SJeff Kirsher 
411f2148a47SJeff Kirsher enum rx_status_bits {
412f2148a47SJeff Kirsher 	RxOK=0x8000, RxWholePkt=0x0300, RxErr=0x008F
413f2148a47SJeff Kirsher };
414f2148a47SJeff Kirsher 
415f2148a47SJeff Kirsher /* Bits in *_desc.*_status */
416f2148a47SJeff Kirsher enum desc_status_bits {
417f2148a47SJeff Kirsher 	DescOwn=0x80000000
418f2148a47SJeff Kirsher };
419f2148a47SJeff Kirsher 
420f2148a47SJeff Kirsher /* Bits in *_desc.*_length */
421f2148a47SJeff Kirsher enum desc_length_bits {
422f2148a47SJeff Kirsher 	DescTag=0x00010000
423f2148a47SJeff Kirsher };
424f2148a47SJeff Kirsher 
425f2148a47SJeff Kirsher /* Bits in ChipCmd. */
426f2148a47SJeff Kirsher enum chip_cmd_bits {
427f2148a47SJeff Kirsher 	CmdInit=0x01, CmdStart=0x02, CmdStop=0x04, CmdRxOn=0x08,
428f2148a47SJeff Kirsher 	CmdTxOn=0x10, Cmd1TxDemand=0x20, CmdRxDemand=0x40,
429f2148a47SJeff Kirsher 	Cmd1EarlyRx=0x01, Cmd1EarlyTx=0x02, Cmd1FDuplex=0x04,
430f2148a47SJeff Kirsher 	Cmd1NoTxPoll=0x08, Cmd1Reset=0x80,
431f2148a47SJeff Kirsher };
432f2148a47SJeff Kirsher 
433f7b5d1b9SJamie Gloudon struct rhine_stats {
434f7b5d1b9SJamie Gloudon 	u64		packets;
435f7b5d1b9SJamie Gloudon 	u64		bytes;
436f7b5d1b9SJamie Gloudon 	struct u64_stats_sync syncp;
437f7b5d1b9SJamie Gloudon };
438f7b5d1b9SJamie Gloudon 
439f2148a47SJeff Kirsher struct rhine_private {
440f2148a47SJeff Kirsher 	/* Bit mask for configured VLAN ids */
441f2148a47SJeff Kirsher 	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
442f2148a47SJeff Kirsher 
443f2148a47SJeff Kirsher 	/* Descriptor rings */
444f2148a47SJeff Kirsher 	struct rx_desc *rx_ring;
445f2148a47SJeff Kirsher 	struct tx_desc *tx_ring;
446f2148a47SJeff Kirsher 	dma_addr_t rx_ring_dma;
447f2148a47SJeff Kirsher 	dma_addr_t tx_ring_dma;
448f2148a47SJeff Kirsher 
449f2148a47SJeff Kirsher 	/* The addresses of receive-in-place skbuffs. */
450f2148a47SJeff Kirsher 	struct sk_buff *rx_skbuff[RX_RING_SIZE];
451f2148a47SJeff Kirsher 	dma_addr_t rx_skbuff_dma[RX_RING_SIZE];
452f2148a47SJeff Kirsher 
453f2148a47SJeff Kirsher 	/* The saved address of a sent-in-place packet/buffer, for later free(). */
454f2148a47SJeff Kirsher 	struct sk_buff *tx_skbuff[TX_RING_SIZE];
455f2148a47SJeff Kirsher 	dma_addr_t tx_skbuff_dma[TX_RING_SIZE];
456f2148a47SJeff Kirsher 
457f2148a47SJeff Kirsher 	/* Tx bounce buffers (Rhine-I only) */
458f2148a47SJeff Kirsher 	unsigned char *tx_buf[TX_RING_SIZE];
459f2148a47SJeff Kirsher 	unsigned char *tx_bufs;
460f2148a47SJeff Kirsher 	dma_addr_t tx_bufs_dma;
461f2148a47SJeff Kirsher 
462f7630d18SAlexey Charkov 	int revision;
463f7630d18SAlexey Charkov 	int irq;
464f2148a47SJeff Kirsher 	long pioaddr;
465f2148a47SJeff Kirsher 	struct net_device *dev;
466f2148a47SJeff Kirsher 	struct napi_struct napi;
467f2148a47SJeff Kirsher 	spinlock_t lock;
4687ab87ff4SFrancois Romieu 	struct mutex task_lock;
4697ab87ff4SFrancois Romieu 	bool task_enable;
4707ab87ff4SFrancois Romieu 	struct work_struct slow_event_task;
471f2148a47SJeff Kirsher 	struct work_struct reset_task;
472f2148a47SJeff Kirsher 
473fc3e0f8aSFrancois Romieu 	u32 msg_enable;
474fc3e0f8aSFrancois Romieu 
475f2148a47SJeff Kirsher 	/* Frequently used values: keep some adjacent for cache effect. */
476f2148a47SJeff Kirsher 	u32 quirks;
477f2148a47SJeff Kirsher 	struct rx_desc *rx_head_desc;
478f2148a47SJeff Kirsher 	unsigned int cur_rx, dirty_rx;	/* Producer/consumer ring indices */
479f2148a47SJeff Kirsher 	unsigned int cur_tx, dirty_tx;
480f2148a47SJeff Kirsher 	unsigned int rx_buf_sz;		/* Based on MTU+slack. */
481f7b5d1b9SJamie Gloudon 	struct rhine_stats rx_stats;
482f7b5d1b9SJamie Gloudon 	struct rhine_stats tx_stats;
483f2148a47SJeff Kirsher 	u8 wolopts;
484f2148a47SJeff Kirsher 
485f2148a47SJeff Kirsher 	u8 tx_thresh, rx_thresh;
486f2148a47SJeff Kirsher 
487f2148a47SJeff Kirsher 	struct mii_if_info mii_if;
488f2148a47SJeff Kirsher 	void __iomem *base;
489f2148a47SJeff Kirsher };
490f2148a47SJeff Kirsher 
491f2148a47SJeff Kirsher #define BYTE_REG_BITS_ON(x, p)      do { iowrite8((ioread8((p))|(x)), (p)); } while (0)
492f2148a47SJeff Kirsher #define WORD_REG_BITS_ON(x, p)      do { iowrite16((ioread16((p))|(x)), (p)); } while (0)
493f2148a47SJeff Kirsher #define DWORD_REG_BITS_ON(x, p)     do { iowrite32((ioread32((p))|(x)), (p)); } while (0)
494f2148a47SJeff Kirsher 
495f2148a47SJeff Kirsher #define BYTE_REG_BITS_IS_ON(x, p)   (ioread8((p)) & (x))
496f2148a47SJeff Kirsher #define WORD_REG_BITS_IS_ON(x, p)   (ioread16((p)) & (x))
497f2148a47SJeff Kirsher #define DWORD_REG_BITS_IS_ON(x, p)  (ioread32((p)) & (x))
498f2148a47SJeff Kirsher 
499f2148a47SJeff Kirsher #define BYTE_REG_BITS_OFF(x, p)     do { iowrite8(ioread8((p)) & (~(x)), (p)); } while (0)
500f2148a47SJeff Kirsher #define WORD_REG_BITS_OFF(x, p)     do { iowrite16(ioread16((p)) & (~(x)), (p)); } while (0)
501f2148a47SJeff Kirsher #define DWORD_REG_BITS_OFF(x, p)    do { iowrite32(ioread32((p)) & (~(x)), (p)); } while (0)
502f2148a47SJeff Kirsher 
503f2148a47SJeff Kirsher #define BYTE_REG_BITS_SET(x, m, p)   do { iowrite8((ioread8((p)) & (~(m)))|(x), (p)); } while (0)
504f2148a47SJeff Kirsher #define WORD_REG_BITS_SET(x, m, p)   do { iowrite16((ioread16((p)) & (~(m)))|(x), (p)); } while (0)
505f2148a47SJeff Kirsher #define DWORD_REG_BITS_SET(x, m, p)  do { iowrite32((ioread32((p)) & (~(m)))|(x), (p)); } while (0)
506f2148a47SJeff Kirsher 
507f2148a47SJeff Kirsher 
508f2148a47SJeff Kirsher static int  mdio_read(struct net_device *dev, int phy_id, int location);
509f2148a47SJeff Kirsher static void mdio_write(struct net_device *dev, int phy_id, int location, int value);
510f2148a47SJeff Kirsher static int  rhine_open(struct net_device *dev);
511f2148a47SJeff Kirsher static void rhine_reset_task(struct work_struct *work);
5127ab87ff4SFrancois Romieu static void rhine_slow_event_task(struct work_struct *work);
513f2148a47SJeff Kirsher static void rhine_tx_timeout(struct net_device *dev);
514f2148a47SJeff Kirsher static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
515f2148a47SJeff Kirsher 				  struct net_device *dev);
516f2148a47SJeff Kirsher static irqreturn_t rhine_interrupt(int irq, void *dev_instance);
517f2148a47SJeff Kirsher static void rhine_tx(struct net_device *dev);
518f2148a47SJeff Kirsher static int rhine_rx(struct net_device *dev, int limit);
519f2148a47SJeff Kirsher static void rhine_set_rx_mode(struct net_device *dev);
520f7b5d1b9SJamie Gloudon static struct rtnl_link_stats64 *rhine_get_stats64(struct net_device *dev,
521f7b5d1b9SJamie Gloudon 	       struct rtnl_link_stats64 *stats);
522f2148a47SJeff Kirsher static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
523f2148a47SJeff Kirsher static const struct ethtool_ops netdev_ethtool_ops;
524f2148a47SJeff Kirsher static int  rhine_close(struct net_device *dev);
52580d5c368SPatrick McHardy static int rhine_vlan_rx_add_vid(struct net_device *dev,
52680d5c368SPatrick McHardy 				 __be16 proto, u16 vid);
52780d5c368SPatrick McHardy static int rhine_vlan_rx_kill_vid(struct net_device *dev,
52880d5c368SPatrick McHardy 				  __be16 proto, u16 vid);
5297ab87ff4SFrancois Romieu static void rhine_restart_tx(struct net_device *dev);
530f2148a47SJeff Kirsher 
5313f8c91a7SAndreas Mohr static void rhine_wait_bit(struct rhine_private *rp, u8 reg, u8 mask, bool low)
532a384a33bSFrancois Romieu {
533a384a33bSFrancois Romieu 	void __iomem *ioaddr = rp->base;
534a384a33bSFrancois Romieu 	int i;
535a384a33bSFrancois Romieu 
536a384a33bSFrancois Romieu 	for (i = 0; i < 1024; i++) {
5373f8c91a7SAndreas Mohr 		bool has_mask_bits = !!(ioread8(ioaddr + reg) & mask);
5383f8c91a7SAndreas Mohr 
5393f8c91a7SAndreas Mohr 		if (low ^ has_mask_bits)
540a384a33bSFrancois Romieu 			break;
541a384a33bSFrancois Romieu 		udelay(10);
542a384a33bSFrancois Romieu 	}
543a384a33bSFrancois Romieu 	if (i > 64) {
544fc3e0f8aSFrancois Romieu 		netif_dbg(rp, hw, rp->dev, "%s bit wait (%02x/%02x) cycle "
5453f8c91a7SAndreas Mohr 			  "count: %04d\n", low ? "low" : "high", reg, mask, i);
546a384a33bSFrancois Romieu 	}
547a384a33bSFrancois Romieu }
548a384a33bSFrancois Romieu 
549a384a33bSFrancois Romieu static void rhine_wait_bit_high(struct rhine_private *rp, u8 reg, u8 mask)
550a384a33bSFrancois Romieu {
5513f8c91a7SAndreas Mohr 	rhine_wait_bit(rp, reg, mask, false);
552a384a33bSFrancois Romieu }
553a384a33bSFrancois Romieu 
554a384a33bSFrancois Romieu static void rhine_wait_bit_low(struct rhine_private *rp, u8 reg, u8 mask)
555a384a33bSFrancois Romieu {
5563f8c91a7SAndreas Mohr 	rhine_wait_bit(rp, reg, mask, true);
557a384a33bSFrancois Romieu }
558f2148a47SJeff Kirsher 
559a20a28bcSFrancois Romieu static u32 rhine_get_events(struct rhine_private *rp)
560f2148a47SJeff Kirsher {
561f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
562f2148a47SJeff Kirsher 	u32 intr_status;
563f2148a47SJeff Kirsher 
564f2148a47SJeff Kirsher 	intr_status = ioread16(ioaddr + IntrStatus);
565f2148a47SJeff Kirsher 	/* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */
566f2148a47SJeff Kirsher 	if (rp->quirks & rqStatusWBRace)
567f2148a47SJeff Kirsher 		intr_status |= ioread8(ioaddr + IntrStatus2) << 16;
568f2148a47SJeff Kirsher 	return intr_status;
569f2148a47SJeff Kirsher }
570f2148a47SJeff Kirsher 
571a20a28bcSFrancois Romieu static void rhine_ack_events(struct rhine_private *rp, u32 mask)
572a20a28bcSFrancois Romieu {
573a20a28bcSFrancois Romieu 	void __iomem *ioaddr = rp->base;
574a20a28bcSFrancois Romieu 
575a20a28bcSFrancois Romieu 	if (rp->quirks & rqStatusWBRace)
576a20a28bcSFrancois Romieu 		iowrite8(mask >> 16, ioaddr + IntrStatus2);
577a20a28bcSFrancois Romieu 	iowrite16(mask, ioaddr + IntrStatus);
5787ab87ff4SFrancois Romieu 	mmiowb();
579a20a28bcSFrancois Romieu }
580a20a28bcSFrancois Romieu 
581f2148a47SJeff Kirsher /*
582f2148a47SJeff Kirsher  * Get power related registers into sane state.
583f2148a47SJeff Kirsher  * Notify user about past WOL event.
584f2148a47SJeff Kirsher  */
585f2148a47SJeff Kirsher static void rhine_power_init(struct net_device *dev)
586f2148a47SJeff Kirsher {
587f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
588f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
589f2148a47SJeff Kirsher 	u16 wolstat;
590f2148a47SJeff Kirsher 
591f2148a47SJeff Kirsher 	if (rp->quirks & rqWOL) {
592f2148a47SJeff Kirsher 		/* Make sure chip is in power state D0 */
593f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + StickyHW) & 0xFC, ioaddr + StickyHW);
594f2148a47SJeff Kirsher 
595f2148a47SJeff Kirsher 		/* Disable "force PME-enable" */
596f2148a47SJeff Kirsher 		iowrite8(0x80, ioaddr + WOLcgClr);
597f2148a47SJeff Kirsher 
598f2148a47SJeff Kirsher 		/* Clear power-event config bits (WOL) */
599f2148a47SJeff Kirsher 		iowrite8(0xFF, ioaddr + WOLcrClr);
600f2148a47SJeff Kirsher 		/* More recent cards can manage two additional patterns */
601f2148a47SJeff Kirsher 		if (rp->quirks & rq6patterns)
602f2148a47SJeff Kirsher 			iowrite8(0x03, ioaddr + WOLcrClr1);
603f2148a47SJeff Kirsher 
604f2148a47SJeff Kirsher 		/* Save power-event status bits */
605f2148a47SJeff Kirsher 		wolstat = ioread8(ioaddr + PwrcsrSet);
606f2148a47SJeff Kirsher 		if (rp->quirks & rq6patterns)
607f2148a47SJeff Kirsher 			wolstat |= (ioread8(ioaddr + PwrcsrSet1) & 0x03) << 8;
608f2148a47SJeff Kirsher 
609f2148a47SJeff Kirsher 		/* Clear power-event status bits */
610f2148a47SJeff Kirsher 		iowrite8(0xFF, ioaddr + PwrcsrClr);
611f2148a47SJeff Kirsher 		if (rp->quirks & rq6patterns)
612f2148a47SJeff Kirsher 			iowrite8(0x03, ioaddr + PwrcsrClr1);
613f2148a47SJeff Kirsher 
614f2148a47SJeff Kirsher 		if (wolstat) {
615f2148a47SJeff Kirsher 			char *reason;
616f2148a47SJeff Kirsher 			switch (wolstat) {
617f2148a47SJeff Kirsher 			case WOLmagic:
618f2148a47SJeff Kirsher 				reason = "Magic packet";
619f2148a47SJeff Kirsher 				break;
620f2148a47SJeff Kirsher 			case WOLlnkon:
621f2148a47SJeff Kirsher 				reason = "Link went up";
622f2148a47SJeff Kirsher 				break;
623f2148a47SJeff Kirsher 			case WOLlnkoff:
624f2148a47SJeff Kirsher 				reason = "Link went down";
625f2148a47SJeff Kirsher 				break;
626f2148a47SJeff Kirsher 			case WOLucast:
627f2148a47SJeff Kirsher 				reason = "Unicast packet";
628f2148a47SJeff Kirsher 				break;
629f2148a47SJeff Kirsher 			case WOLbmcast:
630f2148a47SJeff Kirsher 				reason = "Multicast/broadcast packet";
631f2148a47SJeff Kirsher 				break;
632f2148a47SJeff Kirsher 			default:
633f2148a47SJeff Kirsher 				reason = "Unknown";
634f2148a47SJeff Kirsher 			}
635f2148a47SJeff Kirsher 			netdev_info(dev, "Woke system up. Reason: %s\n",
636f2148a47SJeff Kirsher 				    reason);
637f2148a47SJeff Kirsher 		}
638f2148a47SJeff Kirsher 	}
639f2148a47SJeff Kirsher }
640f2148a47SJeff Kirsher 
641f2148a47SJeff Kirsher static void rhine_chip_reset(struct net_device *dev)
642f2148a47SJeff Kirsher {
643f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
644f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
645fc3e0f8aSFrancois Romieu 	u8 cmd1;
646f2148a47SJeff Kirsher 
647f2148a47SJeff Kirsher 	iowrite8(Cmd1Reset, ioaddr + ChipCmd1);
648f2148a47SJeff Kirsher 	IOSYNC;
649f2148a47SJeff Kirsher 
650f2148a47SJeff Kirsher 	if (ioread8(ioaddr + ChipCmd1) & Cmd1Reset) {
651f2148a47SJeff Kirsher 		netdev_info(dev, "Reset not complete yet. Trying harder.\n");
652f2148a47SJeff Kirsher 
653f2148a47SJeff Kirsher 		/* Force reset */
654f2148a47SJeff Kirsher 		if (rp->quirks & rqForceReset)
655f2148a47SJeff Kirsher 			iowrite8(0x40, ioaddr + MiscCmd);
656f2148a47SJeff Kirsher 
657f2148a47SJeff Kirsher 		/* Reset can take somewhat longer (rare) */
658a384a33bSFrancois Romieu 		rhine_wait_bit_low(rp, ChipCmd1, Cmd1Reset);
659f2148a47SJeff Kirsher 	}
660f2148a47SJeff Kirsher 
661fc3e0f8aSFrancois Romieu 	cmd1 = ioread8(ioaddr + ChipCmd1);
662fc3e0f8aSFrancois Romieu 	netif_info(rp, hw, dev, "Reset %s\n", (cmd1 & Cmd1Reset) ?
663f2148a47SJeff Kirsher 		   "failed" : "succeeded");
664f2148a47SJeff Kirsher }
665f2148a47SJeff Kirsher 
666f2148a47SJeff Kirsher #ifdef USE_MMIO
667f2148a47SJeff Kirsher static void enable_mmio(long pioaddr, u32 quirks)
668f2148a47SJeff Kirsher {
669f2148a47SJeff Kirsher 	int n;
670f2148a47SJeff Kirsher 	if (quirks & rqRhineI) {
671f2148a47SJeff Kirsher 		/* More recent docs say that this bit is reserved ... */
672f2148a47SJeff Kirsher 		n = inb(pioaddr + ConfigA) | 0x20;
673f2148a47SJeff Kirsher 		outb(n, pioaddr + ConfigA);
674f2148a47SJeff Kirsher 	} else {
675f2148a47SJeff Kirsher 		n = inb(pioaddr + ConfigD) | 0x80;
676f2148a47SJeff Kirsher 		outb(n, pioaddr + ConfigD);
677f2148a47SJeff Kirsher 	}
678f2148a47SJeff Kirsher }
679f2148a47SJeff Kirsher #endif
680f2148a47SJeff Kirsher 
681f2148a47SJeff Kirsher /*
682f2148a47SJeff Kirsher  * Loads bytes 0x00-0x05, 0x6E-0x6F, 0x78-0x7B from EEPROM
683f2148a47SJeff Kirsher  * (plus 0x6C for Rhine-I/II)
684f2148a47SJeff Kirsher  */
68576e239e1SBill Pemberton static void rhine_reload_eeprom(long pioaddr, struct net_device *dev)
686f2148a47SJeff Kirsher {
687f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
688f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
689a384a33bSFrancois Romieu 	int i;
690f2148a47SJeff Kirsher 
691f2148a47SJeff Kirsher 	outb(0x20, pioaddr + MACRegEEcsr);
692a384a33bSFrancois Romieu 	for (i = 0; i < 1024; i++) {
693a384a33bSFrancois Romieu 		if (!(inb(pioaddr + MACRegEEcsr) & 0x20))
694a384a33bSFrancois Romieu 			break;
695a384a33bSFrancois Romieu 	}
696a384a33bSFrancois Romieu 	if (i > 512)
697a384a33bSFrancois Romieu 		pr_info("%4d cycles used @ %s:%d\n", i, __func__, __LINE__);
698f2148a47SJeff Kirsher 
699f2148a47SJeff Kirsher #ifdef USE_MMIO
700f2148a47SJeff Kirsher 	/*
701f2148a47SJeff Kirsher 	 * Reloading from EEPROM overwrites ConfigA-D, so we must re-enable
702f2148a47SJeff Kirsher 	 * MMIO. If reloading EEPROM was done first this could be avoided, but
703f2148a47SJeff Kirsher 	 * it is not known if that still works with the "win98-reboot" problem.
704f2148a47SJeff Kirsher 	 */
705f2148a47SJeff Kirsher 	enable_mmio(pioaddr, rp->quirks);
706f2148a47SJeff Kirsher #endif
707f2148a47SJeff Kirsher 
708f2148a47SJeff Kirsher 	/* Turn off EEPROM-controlled wake-up (magic packet) */
709f2148a47SJeff Kirsher 	if (rp->quirks & rqWOL)
710f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + ConfigA) & 0xFC, ioaddr + ConfigA);
711f2148a47SJeff Kirsher 
712f2148a47SJeff Kirsher }
713f2148a47SJeff Kirsher 
714f2148a47SJeff Kirsher #ifdef CONFIG_NET_POLL_CONTROLLER
715f2148a47SJeff Kirsher static void rhine_poll(struct net_device *dev)
716f2148a47SJeff Kirsher {
71705d334ecSFrancois Romieu 	struct rhine_private *rp = netdev_priv(dev);
718f7630d18SAlexey Charkov 	const int irq = rp->irq;
71905d334ecSFrancois Romieu 
72005d334ecSFrancois Romieu 	disable_irq(irq);
72105d334ecSFrancois Romieu 	rhine_interrupt(irq, dev);
72205d334ecSFrancois Romieu 	enable_irq(irq);
723f2148a47SJeff Kirsher }
724f2148a47SJeff Kirsher #endif
725f2148a47SJeff Kirsher 
726269f3114SFrancois Romieu static void rhine_kick_tx_threshold(struct rhine_private *rp)
727269f3114SFrancois Romieu {
728269f3114SFrancois Romieu 	if (rp->tx_thresh < 0xe0) {
729269f3114SFrancois Romieu 		void __iomem *ioaddr = rp->base;
730269f3114SFrancois Romieu 
731269f3114SFrancois Romieu 		rp->tx_thresh += 0x20;
732269f3114SFrancois Romieu 		BYTE_REG_BITS_SET(rp->tx_thresh, 0x80, ioaddr + TxConfig);
733269f3114SFrancois Romieu 	}
734269f3114SFrancois Romieu }
735269f3114SFrancois Romieu 
7367ab87ff4SFrancois Romieu static void rhine_tx_err(struct rhine_private *rp, u32 status)
7377ab87ff4SFrancois Romieu {
7387ab87ff4SFrancois Romieu 	struct net_device *dev = rp->dev;
7397ab87ff4SFrancois Romieu 
7407ab87ff4SFrancois Romieu 	if (status & IntrTxAborted) {
741fc3e0f8aSFrancois Romieu 		netif_info(rp, tx_err, dev,
742fc3e0f8aSFrancois Romieu 			   "Abort %08x, frame dropped\n", status);
7437ab87ff4SFrancois Romieu 	}
7447ab87ff4SFrancois Romieu 
7457ab87ff4SFrancois Romieu 	if (status & IntrTxUnderrun) {
7467ab87ff4SFrancois Romieu 		rhine_kick_tx_threshold(rp);
747fc3e0f8aSFrancois Romieu 		netif_info(rp, tx_err ,dev, "Transmitter underrun, "
748fc3e0f8aSFrancois Romieu 			   "Tx threshold now %02x\n", rp->tx_thresh);
7497ab87ff4SFrancois Romieu 	}
7507ab87ff4SFrancois Romieu 
751fc3e0f8aSFrancois Romieu 	if (status & IntrTxDescRace)
752fc3e0f8aSFrancois Romieu 		netif_info(rp, tx_err, dev, "Tx descriptor write-back race\n");
7537ab87ff4SFrancois Romieu 
7547ab87ff4SFrancois Romieu 	if ((status & IntrTxError) &&
7557ab87ff4SFrancois Romieu 	    (status & (IntrTxAborted | IntrTxUnderrun | IntrTxDescRace)) == 0) {
7567ab87ff4SFrancois Romieu 		rhine_kick_tx_threshold(rp);
757fc3e0f8aSFrancois Romieu 		netif_info(rp, tx_err, dev, "Unspecified error. "
758fc3e0f8aSFrancois Romieu 			   "Tx threshold now %02x\n", rp->tx_thresh);
7597ab87ff4SFrancois Romieu 	}
7607ab87ff4SFrancois Romieu 
7617ab87ff4SFrancois Romieu 	rhine_restart_tx(dev);
7627ab87ff4SFrancois Romieu }
7637ab87ff4SFrancois Romieu 
7647ab87ff4SFrancois Romieu static void rhine_update_rx_crc_and_missed_errord(struct rhine_private *rp)
7657ab87ff4SFrancois Romieu {
7667ab87ff4SFrancois Romieu 	void __iomem *ioaddr = rp->base;
7677ab87ff4SFrancois Romieu 	struct net_device_stats *stats = &rp->dev->stats;
7687ab87ff4SFrancois Romieu 
7697ab87ff4SFrancois Romieu 	stats->rx_crc_errors    += ioread16(ioaddr + RxCRCErrs);
7707ab87ff4SFrancois Romieu 	stats->rx_missed_errors += ioread16(ioaddr + RxMissed);
7717ab87ff4SFrancois Romieu 
7727ab87ff4SFrancois Romieu 	/*
7737ab87ff4SFrancois Romieu 	 * Clears the "tally counters" for CRC errors and missed frames(?).
7747ab87ff4SFrancois Romieu 	 * It has been reported that some chips need a write of 0 to clear
7757ab87ff4SFrancois Romieu 	 * these, for others the counters are set to 1 when written to and
7767ab87ff4SFrancois Romieu 	 * instead cleared when read. So we clear them both ways ...
7777ab87ff4SFrancois Romieu 	 */
7787ab87ff4SFrancois Romieu 	iowrite32(0, ioaddr + RxMissed);
7797ab87ff4SFrancois Romieu 	ioread16(ioaddr + RxCRCErrs);
7807ab87ff4SFrancois Romieu 	ioread16(ioaddr + RxMissed);
7817ab87ff4SFrancois Romieu }
7827ab87ff4SFrancois Romieu 
7837ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_RX	(IntrRxDone | \
7847ab87ff4SFrancois Romieu 				 IntrRxErr | \
7857ab87ff4SFrancois Romieu 				 IntrRxEmpty | \
7867ab87ff4SFrancois Romieu 				 IntrRxOverflow	| \
7877ab87ff4SFrancois Romieu 				 IntrRxDropped | \
7887ab87ff4SFrancois Romieu 				 IntrRxNoBuf | \
7897ab87ff4SFrancois Romieu 				 IntrRxWakeUp)
7907ab87ff4SFrancois Romieu 
7917ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_TX_ERR	(IntrTxError | \
7927ab87ff4SFrancois Romieu 				 IntrTxAborted | \
7937ab87ff4SFrancois Romieu 				 IntrTxUnderrun | \
7947ab87ff4SFrancois Romieu 				 IntrTxDescRace)
7957ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_TX	(IntrTxDone | RHINE_EVENT_NAPI_TX_ERR)
7967ab87ff4SFrancois Romieu 
7977ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI	(RHINE_EVENT_NAPI_RX | \
7987ab87ff4SFrancois Romieu 				 RHINE_EVENT_NAPI_TX | \
7997ab87ff4SFrancois Romieu 				 IntrStatsMax)
8007ab87ff4SFrancois Romieu #define RHINE_EVENT_SLOW	(IntrPCIErr | IntrLinkChange)
8017ab87ff4SFrancois Romieu #define RHINE_EVENT		(RHINE_EVENT_NAPI | RHINE_EVENT_SLOW)
8027ab87ff4SFrancois Romieu 
803f2148a47SJeff Kirsher static int rhine_napipoll(struct napi_struct *napi, int budget)
804f2148a47SJeff Kirsher {
805f2148a47SJeff Kirsher 	struct rhine_private *rp = container_of(napi, struct rhine_private, napi);
806f2148a47SJeff Kirsher 	struct net_device *dev = rp->dev;
807f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
8087ab87ff4SFrancois Romieu 	u16 enable_mask = RHINE_EVENT & 0xffff;
8097ab87ff4SFrancois Romieu 	int work_done = 0;
8107ab87ff4SFrancois Romieu 	u32 status;
811f2148a47SJeff Kirsher 
8127ab87ff4SFrancois Romieu 	status = rhine_get_events(rp);
8137ab87ff4SFrancois Romieu 	rhine_ack_events(rp, status & ~RHINE_EVENT_SLOW);
8147ab87ff4SFrancois Romieu 
8157ab87ff4SFrancois Romieu 	if (status & RHINE_EVENT_NAPI_RX)
8167ab87ff4SFrancois Romieu 		work_done += rhine_rx(dev, budget);
8177ab87ff4SFrancois Romieu 
8187ab87ff4SFrancois Romieu 	if (status & RHINE_EVENT_NAPI_TX) {
8197ab87ff4SFrancois Romieu 		if (status & RHINE_EVENT_NAPI_TX_ERR) {
8207ab87ff4SFrancois Romieu 			/* Avoid scavenging before Tx engine turned off */
821a384a33bSFrancois Romieu 			rhine_wait_bit_low(rp, ChipCmd, CmdTxOn);
822fc3e0f8aSFrancois Romieu 			if (ioread8(ioaddr + ChipCmd) & CmdTxOn)
823fc3e0f8aSFrancois Romieu 				netif_warn(rp, tx_err, dev, "Tx still on\n");
8247ab87ff4SFrancois Romieu 		}
825fc3e0f8aSFrancois Romieu 
8267ab87ff4SFrancois Romieu 		rhine_tx(dev);
8277ab87ff4SFrancois Romieu 
8287ab87ff4SFrancois Romieu 		if (status & RHINE_EVENT_NAPI_TX_ERR)
8297ab87ff4SFrancois Romieu 			rhine_tx_err(rp, status);
8307ab87ff4SFrancois Romieu 	}
8317ab87ff4SFrancois Romieu 
8327ab87ff4SFrancois Romieu 	if (status & IntrStatsMax) {
8337ab87ff4SFrancois Romieu 		spin_lock(&rp->lock);
8347ab87ff4SFrancois Romieu 		rhine_update_rx_crc_and_missed_errord(rp);
8357ab87ff4SFrancois Romieu 		spin_unlock(&rp->lock);
8367ab87ff4SFrancois Romieu 	}
8377ab87ff4SFrancois Romieu 
8387ab87ff4SFrancois Romieu 	if (status & RHINE_EVENT_SLOW) {
8397ab87ff4SFrancois Romieu 		enable_mask &= ~RHINE_EVENT_SLOW;
8407ab87ff4SFrancois Romieu 		schedule_work(&rp->slow_event_task);
8417ab87ff4SFrancois Romieu 	}
842f2148a47SJeff Kirsher 
843f2148a47SJeff Kirsher 	if (work_done < budget) {
844f2148a47SJeff Kirsher 		napi_complete(napi);
8457ab87ff4SFrancois Romieu 		iowrite16(enable_mask, ioaddr + IntrEnable);
8467ab87ff4SFrancois Romieu 		mmiowb();
847f2148a47SJeff Kirsher 	}
848f2148a47SJeff Kirsher 	return work_done;
849f2148a47SJeff Kirsher }
850f2148a47SJeff Kirsher 
85176e239e1SBill Pemberton static void rhine_hw_init(struct net_device *dev, long pioaddr)
852f2148a47SJeff Kirsher {
853f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
854f2148a47SJeff Kirsher 
855f2148a47SJeff Kirsher 	/* Reset the chip to erase previous misconfiguration. */
856f2148a47SJeff Kirsher 	rhine_chip_reset(dev);
857f2148a47SJeff Kirsher 
858f2148a47SJeff Kirsher 	/* Rhine-I needs extra time to recuperate before EEPROM reload */
859f2148a47SJeff Kirsher 	if (rp->quirks & rqRhineI)
860f2148a47SJeff Kirsher 		msleep(5);
861f2148a47SJeff Kirsher 
862f2148a47SJeff Kirsher 	/* Reload EEPROM controlled bytes cleared by soft reset */
863*2d283862SAlexey Charkov 	if (dev_is_pci(dev->dev.parent))
864f2148a47SJeff Kirsher 		rhine_reload_eeprom(pioaddr, dev);
865f2148a47SJeff Kirsher }
866f2148a47SJeff Kirsher 
867f2148a47SJeff Kirsher static const struct net_device_ops rhine_netdev_ops = {
868f2148a47SJeff Kirsher 	.ndo_open		 = rhine_open,
869f2148a47SJeff Kirsher 	.ndo_stop		 = rhine_close,
870f2148a47SJeff Kirsher 	.ndo_start_xmit		 = rhine_start_tx,
871f7b5d1b9SJamie Gloudon 	.ndo_get_stats64	 = rhine_get_stats64,
872afc4b13dSJiri Pirko 	.ndo_set_rx_mode	 = rhine_set_rx_mode,
873f2148a47SJeff Kirsher 	.ndo_change_mtu		 = eth_change_mtu,
874f2148a47SJeff Kirsher 	.ndo_validate_addr	 = eth_validate_addr,
875f2148a47SJeff Kirsher 	.ndo_set_mac_address 	 = eth_mac_addr,
876f2148a47SJeff Kirsher 	.ndo_do_ioctl		 = netdev_ioctl,
877f2148a47SJeff Kirsher 	.ndo_tx_timeout 	 = rhine_tx_timeout,
878f2148a47SJeff Kirsher 	.ndo_vlan_rx_add_vid	 = rhine_vlan_rx_add_vid,
879f2148a47SJeff Kirsher 	.ndo_vlan_rx_kill_vid	 = rhine_vlan_rx_kill_vid,
880f2148a47SJeff Kirsher #ifdef CONFIG_NET_POLL_CONTROLLER
881f2148a47SJeff Kirsher 	.ndo_poll_controller	 = rhine_poll,
882f2148a47SJeff Kirsher #endif
883f2148a47SJeff Kirsher };
884f2148a47SJeff Kirsher 
885*2d283862SAlexey Charkov static int rhine_init_one_common(struct device *hwdev, int revision,
886*2d283862SAlexey Charkov 				 long pioaddr, void __iomem *ioaddr, int irq)
887f2148a47SJeff Kirsher {
888f2148a47SJeff Kirsher 	struct net_device *dev;
889f2148a47SJeff Kirsher 	struct rhine_private *rp;
890*2d283862SAlexey Charkov 	int i, rc, phy_id;
891f2148a47SJeff Kirsher 	const char *name;
892f2148a47SJeff Kirsher 
893f2148a47SJeff Kirsher 	/* this should always be supported */
894f7630d18SAlexey Charkov 	rc = dma_set_mask(hwdev, DMA_BIT_MASK(32));
895f2148a47SJeff Kirsher 	if (rc) {
896f7630d18SAlexey Charkov 		dev_err(hwdev, "32-bit DMA addresses not supported by the card!?\n");
897*2d283862SAlexey Charkov 		goto err_out;
898f2148a47SJeff Kirsher 	}
899f2148a47SJeff Kirsher 
900f2148a47SJeff Kirsher 	dev = alloc_etherdev(sizeof(struct rhine_private));
901f2148a47SJeff Kirsher 	if (!dev) {
902f2148a47SJeff Kirsher 		rc = -ENOMEM;
903*2d283862SAlexey Charkov 		goto err_out;
904f2148a47SJeff Kirsher 	}
905f7630d18SAlexey Charkov 	SET_NETDEV_DEV(dev, hwdev);
906f2148a47SJeff Kirsher 
907f2148a47SJeff Kirsher 	rp = netdev_priv(dev);
908f2148a47SJeff Kirsher 	rp->dev = dev;
909f7630d18SAlexey Charkov 	rp->revision = revision;
910f2148a47SJeff Kirsher 	rp->pioaddr = pioaddr;
911*2d283862SAlexey Charkov 	rp->base = ioaddr;
912*2d283862SAlexey Charkov 	rp->irq = irq;
913fc3e0f8aSFrancois Romieu 	rp->msg_enable = netif_msg_init(debug, RHINE_MSG_DEFAULT);
914f2148a47SJeff Kirsher 
915*2d283862SAlexey Charkov 	phy_id = 0;
916*2d283862SAlexey Charkov 	name = "Rhine";
917*2d283862SAlexey Charkov 	if (revision < VTunknown0) {
918*2d283862SAlexey Charkov 		rp->quirks = rqRhineI;
919*2d283862SAlexey Charkov 	} else if (revision >= VT6102) {
920*2d283862SAlexey Charkov 		rp->quirks = rqWOL | rqForceReset;
921*2d283862SAlexey Charkov 		if (revision < VT6105) {
922*2d283862SAlexey Charkov 			name = "Rhine II";
923*2d283862SAlexey Charkov 			rp->quirks |= rqStatusWBRace;	/* Rhine-II exclusive */
924*2d283862SAlexey Charkov 		} else {
925*2d283862SAlexey Charkov 			phy_id = 1;	/* Integrated PHY, phy_id fixed to 1 */
926*2d283862SAlexey Charkov 			if (revision >= VT6105_B0)
927*2d283862SAlexey Charkov 				rp->quirks |= rq6patterns;
928*2d283862SAlexey Charkov 			if (revision < VT6105M)
929*2d283862SAlexey Charkov 				name = "Rhine III";
930*2d283862SAlexey Charkov 			else
931*2d283862SAlexey Charkov 				name = "Rhine III (Management Adapter)";
932f2148a47SJeff Kirsher 		}
933f2148a47SJeff Kirsher 	}
934f2148a47SJeff Kirsher 
935827da44cSJohn Stultz 	u64_stats_init(&rp->tx_stats.syncp);
936827da44cSJohn Stultz 	u64_stats_init(&rp->rx_stats.syncp);
937827da44cSJohn Stultz 
938f2148a47SJeff Kirsher 	/* Get chip registers into a sane state */
939f2148a47SJeff Kirsher 	rhine_power_init(dev);
940f2148a47SJeff Kirsher 	rhine_hw_init(dev, pioaddr);
941f2148a47SJeff Kirsher 
942f2148a47SJeff Kirsher 	for (i = 0; i < 6; i++)
943f2148a47SJeff Kirsher 		dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i);
944f2148a47SJeff Kirsher 
945f2148a47SJeff Kirsher 	if (!is_valid_ether_addr(dev->dev_addr)) {
946f2148a47SJeff Kirsher 		/* Report it and use a random ethernet address instead */
947f2148a47SJeff Kirsher 		netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr);
948f2cedb63SDanny Kukawka 		eth_hw_addr_random(dev);
949f2148a47SJeff Kirsher 		netdev_info(dev, "Using random MAC address: %pM\n",
950f2148a47SJeff Kirsher 			    dev->dev_addr);
951f2148a47SJeff Kirsher 	}
952f2148a47SJeff Kirsher 
953f2148a47SJeff Kirsher 	/* For Rhine-I/II, phy_id is loaded from EEPROM */
954f2148a47SJeff Kirsher 	if (!phy_id)
955f2148a47SJeff Kirsher 		phy_id = ioread8(ioaddr + 0x6C);
956f2148a47SJeff Kirsher 
957f2148a47SJeff Kirsher 	spin_lock_init(&rp->lock);
9587ab87ff4SFrancois Romieu 	mutex_init(&rp->task_lock);
959f2148a47SJeff Kirsher 	INIT_WORK(&rp->reset_task, rhine_reset_task);
9607ab87ff4SFrancois Romieu 	INIT_WORK(&rp->slow_event_task, rhine_slow_event_task);
961f2148a47SJeff Kirsher 
962f2148a47SJeff Kirsher 	rp->mii_if.dev = dev;
963f2148a47SJeff Kirsher 	rp->mii_if.mdio_read = mdio_read;
964f2148a47SJeff Kirsher 	rp->mii_if.mdio_write = mdio_write;
965f2148a47SJeff Kirsher 	rp->mii_if.phy_id_mask = 0x1f;
966f2148a47SJeff Kirsher 	rp->mii_if.reg_num_mask = 0x1f;
967f2148a47SJeff Kirsher 
968f2148a47SJeff Kirsher 	/* The chip-specific entries in the device structure. */
969f2148a47SJeff Kirsher 	dev->netdev_ops = &rhine_netdev_ops;
970e76070f2Swangweidong 	dev->ethtool_ops = &netdev_ethtool_ops;
971f2148a47SJeff Kirsher 	dev->watchdog_timeo = TX_TIMEOUT;
972f2148a47SJeff Kirsher 
973f2148a47SJeff Kirsher 	netif_napi_add(dev, &rp->napi, rhine_napipoll, 64);
974f2148a47SJeff Kirsher 
975f2148a47SJeff Kirsher 	if (rp->quirks & rqRhineI)
976f2148a47SJeff Kirsher 		dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
977f2148a47SJeff Kirsher 
978f7630d18SAlexey Charkov 	if (rp->revision >= VT6105M)
979f646968fSPatrick McHardy 		dev->features |= NETIF_F_HW_VLAN_CTAG_TX |
980f646968fSPatrick McHardy 				 NETIF_F_HW_VLAN_CTAG_RX |
981f646968fSPatrick McHardy 				 NETIF_F_HW_VLAN_CTAG_FILTER;
982f2148a47SJeff Kirsher 
983f2148a47SJeff Kirsher 	/* dev->name not defined before register_netdev()! */
984f2148a47SJeff Kirsher 	rc = register_netdev(dev);
985f2148a47SJeff Kirsher 	if (rc)
986*2d283862SAlexey Charkov 		goto err_out_free_netdev;
987f2148a47SJeff Kirsher 
988f2148a47SJeff Kirsher 	netdev_info(dev, "VIA %s at 0x%lx, %pM, IRQ %d\n",
989*2d283862SAlexey Charkov 		    name, (long)ioaddr, dev->dev_addr, rp->irq);
990f2148a47SJeff Kirsher 
991f7630d18SAlexey Charkov 	dev_set_drvdata(hwdev, dev);
992f2148a47SJeff Kirsher 
993f2148a47SJeff Kirsher 	{
994f2148a47SJeff Kirsher 		u16 mii_cmd;
995f2148a47SJeff Kirsher 		int mii_status = mdio_read(dev, phy_id, 1);
996f2148a47SJeff Kirsher 		mii_cmd = mdio_read(dev, phy_id, MII_BMCR) & ~BMCR_ISOLATE;
997f2148a47SJeff Kirsher 		mdio_write(dev, phy_id, MII_BMCR, mii_cmd);
998f2148a47SJeff Kirsher 		if (mii_status != 0xffff && mii_status != 0x0000) {
999f2148a47SJeff Kirsher 			rp->mii_if.advertising = mdio_read(dev, phy_id, 4);
1000f2148a47SJeff Kirsher 			netdev_info(dev,
1001f2148a47SJeff Kirsher 				    "MII PHY found at address %d, status 0x%04x advertising %04x Link %04x\n",
1002f2148a47SJeff Kirsher 				    phy_id,
1003f2148a47SJeff Kirsher 				    mii_status, rp->mii_if.advertising,
1004f2148a47SJeff Kirsher 				    mdio_read(dev, phy_id, 5));
1005f2148a47SJeff Kirsher 
1006f2148a47SJeff Kirsher 			/* set IFF_RUNNING */
1007f2148a47SJeff Kirsher 			if (mii_status & BMSR_LSTATUS)
1008f2148a47SJeff Kirsher 				netif_carrier_on(dev);
1009f2148a47SJeff Kirsher 			else
1010f2148a47SJeff Kirsher 				netif_carrier_off(dev);
1011f2148a47SJeff Kirsher 
1012f2148a47SJeff Kirsher 		}
1013f2148a47SJeff Kirsher 	}
1014f2148a47SJeff Kirsher 	rp->mii_if.phy_id = phy_id;
1015fc3e0f8aSFrancois Romieu 	if (avoid_D3)
1016fc3e0f8aSFrancois Romieu 		netif_info(rp, probe, dev, "No D3 power state at shutdown\n");
1017f2148a47SJeff Kirsher 
1018f2148a47SJeff Kirsher 	return 0;
1019f2148a47SJeff Kirsher 
1020*2d283862SAlexey Charkov err_out_free_netdev:
1021*2d283862SAlexey Charkov 	free_netdev(dev);
1022*2d283862SAlexey Charkov err_out:
1023*2d283862SAlexey Charkov 	return rc;
1024*2d283862SAlexey Charkov }
1025*2d283862SAlexey Charkov 
1026*2d283862SAlexey Charkov static int rhine_init_one_pci(struct pci_dev *pdev,
1027*2d283862SAlexey Charkov 			      const struct pci_device_id *ent)
1028*2d283862SAlexey Charkov {
1029*2d283862SAlexey Charkov 	struct device *hwdev = &pdev->dev;
1030*2d283862SAlexey Charkov 	int i, rc;
1031*2d283862SAlexey Charkov 	long pioaddr, memaddr;
1032*2d283862SAlexey Charkov 	void __iomem *ioaddr;
1033*2d283862SAlexey Charkov 	int io_size = pdev->revision < VTunknown0 ? 128 : 256;
1034*2d283862SAlexey Charkov 	u32 quirks = pdev->revision < VTunknown0 ? rqRhineI : 0;
1035*2d283862SAlexey Charkov #ifdef USE_MMIO
1036*2d283862SAlexey Charkov 	int bar = 1;
1037*2d283862SAlexey Charkov #else
1038*2d283862SAlexey Charkov 	int bar = 0;
1039*2d283862SAlexey Charkov #endif
1040*2d283862SAlexey Charkov 
1041*2d283862SAlexey Charkov /* when built into the kernel, we only print version if device is found */
1042*2d283862SAlexey Charkov #ifndef MODULE
1043*2d283862SAlexey Charkov 	pr_info_once("%s\n", version);
1044*2d283862SAlexey Charkov #endif
1045*2d283862SAlexey Charkov 
1046*2d283862SAlexey Charkov 	rc = pci_enable_device(pdev);
1047*2d283862SAlexey Charkov 	if (rc)
1048*2d283862SAlexey Charkov 		goto err_out;
1049*2d283862SAlexey Charkov 
1050*2d283862SAlexey Charkov 	/* sanity check */
1051*2d283862SAlexey Charkov 	if ((pci_resource_len(pdev, 0) < io_size) ||
1052*2d283862SAlexey Charkov 	    (pci_resource_len(pdev, 1) < io_size)) {
1053*2d283862SAlexey Charkov 		rc = -EIO;
1054*2d283862SAlexey Charkov 		dev_err(hwdev, "Insufficient PCI resources, aborting\n");
1055*2d283862SAlexey Charkov 		goto err_out_pci_disable;
1056*2d283862SAlexey Charkov 	}
1057*2d283862SAlexey Charkov 
1058*2d283862SAlexey Charkov 	pioaddr = pci_resource_start(pdev, 0);
1059*2d283862SAlexey Charkov 	memaddr = pci_resource_start(pdev, 1);
1060*2d283862SAlexey Charkov 
1061*2d283862SAlexey Charkov 	pci_set_master(pdev);
1062*2d283862SAlexey Charkov 
1063*2d283862SAlexey Charkov 	rc = pci_request_regions(pdev, DRV_NAME);
1064*2d283862SAlexey Charkov 	if (rc)
1065*2d283862SAlexey Charkov 		goto err_out_pci_disable;
1066*2d283862SAlexey Charkov 
1067*2d283862SAlexey Charkov 	ioaddr = pci_iomap(pdev, bar, io_size);
1068*2d283862SAlexey Charkov 	if (!ioaddr) {
1069*2d283862SAlexey Charkov 		rc = -EIO;
1070*2d283862SAlexey Charkov 		dev_err(hwdev,
1071*2d283862SAlexey Charkov 			"ioremap failed for device %s, region 0x%X @ 0x%lX\n",
1072*2d283862SAlexey Charkov 			dev_name(hwdev), io_size, memaddr);
1073*2d283862SAlexey Charkov 		goto err_out_free_res;
1074*2d283862SAlexey Charkov 	}
1075*2d283862SAlexey Charkov 
1076*2d283862SAlexey Charkov #ifdef USE_MMIO
1077*2d283862SAlexey Charkov 	enable_mmio(pioaddr, quirks);
1078*2d283862SAlexey Charkov 
1079*2d283862SAlexey Charkov 	/* Check that selected MMIO registers match the PIO ones */
1080*2d283862SAlexey Charkov 	i = 0;
1081*2d283862SAlexey Charkov 	while (mmio_verify_registers[i]) {
1082*2d283862SAlexey Charkov 		int reg = mmio_verify_registers[i++];
1083*2d283862SAlexey Charkov 		unsigned char a = inb(pioaddr+reg);
1084*2d283862SAlexey Charkov 		unsigned char b = readb(ioaddr+reg);
1085*2d283862SAlexey Charkov 
1086*2d283862SAlexey Charkov 		if (a != b) {
1087*2d283862SAlexey Charkov 			rc = -EIO;
1088*2d283862SAlexey Charkov 			dev_err(hwdev,
1089*2d283862SAlexey Charkov 				"MMIO do not match PIO [%02x] (%02x != %02x)\n",
1090*2d283862SAlexey Charkov 				reg, a, b);
1091*2d283862SAlexey Charkov 			goto err_out_unmap;
1092*2d283862SAlexey Charkov 		}
1093*2d283862SAlexey Charkov 	}
1094*2d283862SAlexey Charkov #endif /* USE_MMIO */
1095*2d283862SAlexey Charkov 
1096*2d283862SAlexey Charkov 	rc = rhine_init_one_common(&pdev->dev, pdev->revision,
1097*2d283862SAlexey Charkov 				   pioaddr, ioaddr, pdev->irq);
1098*2d283862SAlexey Charkov 	if (!rc)
1099*2d283862SAlexey Charkov 		return 0;
1100*2d283862SAlexey Charkov 
1101f2148a47SJeff Kirsher err_out_unmap:
1102f2148a47SJeff Kirsher 	pci_iounmap(pdev, ioaddr);
1103f2148a47SJeff Kirsher err_out_free_res:
1104f2148a47SJeff Kirsher 	pci_release_regions(pdev);
1105ae996154SRoger Luethi err_out_pci_disable:
1106ae996154SRoger Luethi 	pci_disable_device(pdev);
1107f2148a47SJeff Kirsher err_out:
1108f2148a47SJeff Kirsher 	return rc;
1109f2148a47SJeff Kirsher }
1110f2148a47SJeff Kirsher 
1111*2d283862SAlexey Charkov static int rhine_init_one_platform(struct platform_device *pdev)
1112*2d283862SAlexey Charkov {
1113*2d283862SAlexey Charkov 	const struct of_device_id *match;
1114*2d283862SAlexey Charkov 	u32 revision;
1115*2d283862SAlexey Charkov 	int irq;
1116*2d283862SAlexey Charkov 	struct resource *res;
1117*2d283862SAlexey Charkov 	void __iomem *ioaddr;
1118*2d283862SAlexey Charkov 
1119*2d283862SAlexey Charkov 	match = of_match_device(rhine_of_tbl, &pdev->dev);
1120*2d283862SAlexey Charkov 	if (!match)
1121*2d283862SAlexey Charkov 		return -EINVAL;
1122*2d283862SAlexey Charkov 
1123*2d283862SAlexey Charkov 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1124*2d283862SAlexey Charkov 	ioaddr = devm_ioremap_resource(&pdev->dev, res);
1125*2d283862SAlexey Charkov 	if (IS_ERR(ioaddr))
1126*2d283862SAlexey Charkov 		return PTR_ERR(ioaddr);
1127*2d283862SAlexey Charkov 
1128*2d283862SAlexey Charkov 	irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
1129*2d283862SAlexey Charkov 	if (!irq)
1130*2d283862SAlexey Charkov 		return -EINVAL;
1131*2d283862SAlexey Charkov 
1132*2d283862SAlexey Charkov 	revision = (u32)match->data;
1133*2d283862SAlexey Charkov 	if (!revision)
1134*2d283862SAlexey Charkov 		return -EINVAL;
1135*2d283862SAlexey Charkov 
1136*2d283862SAlexey Charkov 	return rhine_init_one_common(&pdev->dev, revision,
1137*2d283862SAlexey Charkov 				     (long)ioaddr, ioaddr, irq);
1138*2d283862SAlexey Charkov }
1139*2d283862SAlexey Charkov 
1140f2148a47SJeff Kirsher static int alloc_ring(struct net_device* dev)
1141f2148a47SJeff Kirsher {
1142f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1143f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1144f2148a47SJeff Kirsher 	void *ring;
1145f2148a47SJeff Kirsher 	dma_addr_t ring_dma;
1146f2148a47SJeff Kirsher 
1147f7630d18SAlexey Charkov 	ring = dma_alloc_coherent(hwdev,
1148f2148a47SJeff Kirsher 				  RX_RING_SIZE * sizeof(struct rx_desc) +
1149f2148a47SJeff Kirsher 				  TX_RING_SIZE * sizeof(struct tx_desc),
11504087c4dcSAlexey Charkov 				  &ring_dma,
11514087c4dcSAlexey Charkov 				  GFP_ATOMIC);
1152f2148a47SJeff Kirsher 	if (!ring) {
1153f2148a47SJeff Kirsher 		netdev_err(dev, "Could not allocate DMA memory\n");
1154f2148a47SJeff Kirsher 		return -ENOMEM;
1155f2148a47SJeff Kirsher 	}
1156f2148a47SJeff Kirsher 	if (rp->quirks & rqRhineI) {
1157f7630d18SAlexey Charkov 		rp->tx_bufs = dma_alloc_coherent(hwdev,
1158f2148a47SJeff Kirsher 						 PKT_BUF_SZ * TX_RING_SIZE,
11594087c4dcSAlexey Charkov 						 &rp->tx_bufs_dma,
11604087c4dcSAlexey Charkov 						 GFP_ATOMIC);
1161f2148a47SJeff Kirsher 		if (rp->tx_bufs == NULL) {
1162f7630d18SAlexey Charkov 			dma_free_coherent(hwdev,
1163f2148a47SJeff Kirsher 					  RX_RING_SIZE * sizeof(struct rx_desc) +
1164f2148a47SJeff Kirsher 					  TX_RING_SIZE * sizeof(struct tx_desc),
1165f2148a47SJeff Kirsher 					  ring, ring_dma);
1166f2148a47SJeff Kirsher 			return -ENOMEM;
1167f2148a47SJeff Kirsher 		}
1168f2148a47SJeff Kirsher 	}
1169f2148a47SJeff Kirsher 
1170f2148a47SJeff Kirsher 	rp->rx_ring = ring;
1171f2148a47SJeff Kirsher 	rp->tx_ring = ring + RX_RING_SIZE * sizeof(struct rx_desc);
1172f2148a47SJeff Kirsher 	rp->rx_ring_dma = ring_dma;
1173f2148a47SJeff Kirsher 	rp->tx_ring_dma = ring_dma + RX_RING_SIZE * sizeof(struct rx_desc);
1174f2148a47SJeff Kirsher 
1175f2148a47SJeff Kirsher 	return 0;
1176f2148a47SJeff Kirsher }
1177f2148a47SJeff Kirsher 
1178f2148a47SJeff Kirsher static void free_ring(struct net_device* dev)
1179f2148a47SJeff Kirsher {
1180f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1181f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1182f2148a47SJeff Kirsher 
1183f7630d18SAlexey Charkov 	dma_free_coherent(hwdev,
1184f2148a47SJeff Kirsher 			  RX_RING_SIZE * sizeof(struct rx_desc) +
1185f2148a47SJeff Kirsher 			  TX_RING_SIZE * sizeof(struct tx_desc),
1186f2148a47SJeff Kirsher 			  rp->rx_ring, rp->rx_ring_dma);
1187f2148a47SJeff Kirsher 	rp->tx_ring = NULL;
1188f2148a47SJeff Kirsher 
1189f2148a47SJeff Kirsher 	if (rp->tx_bufs)
1190f7630d18SAlexey Charkov 		dma_free_coherent(hwdev, PKT_BUF_SZ * TX_RING_SIZE,
1191f2148a47SJeff Kirsher 				  rp->tx_bufs, rp->tx_bufs_dma);
1192f2148a47SJeff Kirsher 
1193f2148a47SJeff Kirsher 	rp->tx_bufs = NULL;
1194f2148a47SJeff Kirsher 
1195f2148a47SJeff Kirsher }
1196f2148a47SJeff Kirsher 
1197f2148a47SJeff Kirsher static void alloc_rbufs(struct net_device *dev)
1198f2148a47SJeff Kirsher {
1199f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1200f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1201f2148a47SJeff Kirsher 	dma_addr_t next;
1202f2148a47SJeff Kirsher 	int i;
1203f2148a47SJeff Kirsher 
1204f2148a47SJeff Kirsher 	rp->dirty_rx = rp->cur_rx = 0;
1205f2148a47SJeff Kirsher 
1206f2148a47SJeff Kirsher 	rp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
1207f2148a47SJeff Kirsher 	rp->rx_head_desc = &rp->rx_ring[0];
1208f2148a47SJeff Kirsher 	next = rp->rx_ring_dma;
1209f2148a47SJeff Kirsher 
1210f2148a47SJeff Kirsher 	/* Init the ring entries */
1211f2148a47SJeff Kirsher 	for (i = 0; i < RX_RING_SIZE; i++) {
1212f2148a47SJeff Kirsher 		rp->rx_ring[i].rx_status = 0;
1213f2148a47SJeff Kirsher 		rp->rx_ring[i].desc_length = cpu_to_le32(rp->rx_buf_sz);
1214f2148a47SJeff Kirsher 		next += sizeof(struct rx_desc);
1215f2148a47SJeff Kirsher 		rp->rx_ring[i].next_desc = cpu_to_le32(next);
1216f2148a47SJeff Kirsher 		rp->rx_skbuff[i] = NULL;
1217f2148a47SJeff Kirsher 	}
1218f2148a47SJeff Kirsher 	/* Mark the last entry as wrapping the ring. */
1219f2148a47SJeff Kirsher 	rp->rx_ring[i-1].next_desc = cpu_to_le32(rp->rx_ring_dma);
1220f2148a47SJeff Kirsher 
1221f2148a47SJeff Kirsher 	/* Fill in the Rx buffers.  Handle allocation failure gracefully. */
1222f2148a47SJeff Kirsher 	for (i = 0; i < RX_RING_SIZE; i++) {
1223f2148a47SJeff Kirsher 		struct sk_buff *skb = netdev_alloc_skb(dev, rp->rx_buf_sz);
1224f2148a47SJeff Kirsher 		rp->rx_skbuff[i] = skb;
1225f2148a47SJeff Kirsher 		if (skb == NULL)
1226f2148a47SJeff Kirsher 			break;
1227f2148a47SJeff Kirsher 
1228f2148a47SJeff Kirsher 		rp->rx_skbuff_dma[i] =
1229f7630d18SAlexey Charkov 			dma_map_single(hwdev, skb->data, rp->rx_buf_sz,
12304087c4dcSAlexey Charkov 				       DMA_FROM_DEVICE);
1231f7630d18SAlexey Charkov 		if (dma_mapping_error(hwdev, rp->rx_skbuff_dma[i])) {
12329b4fe5fbSNeil Horman 			rp->rx_skbuff_dma[i] = 0;
12339b4fe5fbSNeil Horman 			dev_kfree_skb(skb);
12349b4fe5fbSNeil Horman 			break;
12359b4fe5fbSNeil Horman 		}
1236f2148a47SJeff Kirsher 		rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]);
1237f2148a47SJeff Kirsher 		rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn);
1238f2148a47SJeff Kirsher 	}
1239f2148a47SJeff Kirsher 	rp->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
1240f2148a47SJeff Kirsher }
1241f2148a47SJeff Kirsher 
1242f2148a47SJeff Kirsher static void free_rbufs(struct net_device* dev)
1243f2148a47SJeff Kirsher {
1244f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1245f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1246f2148a47SJeff Kirsher 	int i;
1247f2148a47SJeff Kirsher 
1248f2148a47SJeff Kirsher 	/* Free all the skbuffs in the Rx queue. */
1249f2148a47SJeff Kirsher 	for (i = 0; i < RX_RING_SIZE; i++) {
1250f2148a47SJeff Kirsher 		rp->rx_ring[i].rx_status = 0;
1251f2148a47SJeff Kirsher 		rp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */
1252f2148a47SJeff Kirsher 		if (rp->rx_skbuff[i]) {
1253f7630d18SAlexey Charkov 			dma_unmap_single(hwdev,
1254f2148a47SJeff Kirsher 					 rp->rx_skbuff_dma[i],
12554087c4dcSAlexey Charkov 					 rp->rx_buf_sz, DMA_FROM_DEVICE);
1256f2148a47SJeff Kirsher 			dev_kfree_skb(rp->rx_skbuff[i]);
1257f2148a47SJeff Kirsher 		}
1258f2148a47SJeff Kirsher 		rp->rx_skbuff[i] = NULL;
1259f2148a47SJeff Kirsher 	}
1260f2148a47SJeff Kirsher }
1261f2148a47SJeff Kirsher 
1262f2148a47SJeff Kirsher static void alloc_tbufs(struct net_device* dev)
1263f2148a47SJeff Kirsher {
1264f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1265f2148a47SJeff Kirsher 	dma_addr_t next;
1266f2148a47SJeff Kirsher 	int i;
1267f2148a47SJeff Kirsher 
1268f2148a47SJeff Kirsher 	rp->dirty_tx = rp->cur_tx = 0;
1269f2148a47SJeff Kirsher 	next = rp->tx_ring_dma;
1270f2148a47SJeff Kirsher 	for (i = 0; i < TX_RING_SIZE; i++) {
1271f2148a47SJeff Kirsher 		rp->tx_skbuff[i] = NULL;
1272f2148a47SJeff Kirsher 		rp->tx_ring[i].tx_status = 0;
1273f2148a47SJeff Kirsher 		rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC);
1274f2148a47SJeff Kirsher 		next += sizeof(struct tx_desc);
1275f2148a47SJeff Kirsher 		rp->tx_ring[i].next_desc = cpu_to_le32(next);
1276f2148a47SJeff Kirsher 		if (rp->quirks & rqRhineI)
1277f2148a47SJeff Kirsher 			rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ];
1278f2148a47SJeff Kirsher 	}
1279f2148a47SJeff Kirsher 	rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma);
1280f2148a47SJeff Kirsher 
1281f2148a47SJeff Kirsher }
1282f2148a47SJeff Kirsher 
1283f2148a47SJeff Kirsher static void free_tbufs(struct net_device* dev)
1284f2148a47SJeff Kirsher {
1285f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1286f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1287f2148a47SJeff Kirsher 	int i;
1288f2148a47SJeff Kirsher 
1289f2148a47SJeff Kirsher 	for (i = 0; i < TX_RING_SIZE; i++) {
1290f2148a47SJeff Kirsher 		rp->tx_ring[i].tx_status = 0;
1291f2148a47SJeff Kirsher 		rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC);
1292f2148a47SJeff Kirsher 		rp->tx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */
1293f2148a47SJeff Kirsher 		if (rp->tx_skbuff[i]) {
1294f2148a47SJeff Kirsher 			if (rp->tx_skbuff_dma[i]) {
1295f7630d18SAlexey Charkov 				dma_unmap_single(hwdev,
1296f2148a47SJeff Kirsher 						 rp->tx_skbuff_dma[i],
1297f2148a47SJeff Kirsher 						 rp->tx_skbuff[i]->len,
12984087c4dcSAlexey Charkov 						 DMA_TO_DEVICE);
1299f2148a47SJeff Kirsher 			}
1300f2148a47SJeff Kirsher 			dev_kfree_skb(rp->tx_skbuff[i]);
1301f2148a47SJeff Kirsher 		}
1302f2148a47SJeff Kirsher 		rp->tx_skbuff[i] = NULL;
1303f2148a47SJeff Kirsher 		rp->tx_buf[i] = NULL;
1304f2148a47SJeff Kirsher 	}
1305f2148a47SJeff Kirsher }
1306f2148a47SJeff Kirsher 
1307f2148a47SJeff Kirsher static void rhine_check_media(struct net_device *dev, unsigned int init_media)
1308f2148a47SJeff Kirsher {
1309f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1310f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1311f2148a47SJeff Kirsher 
1312fc3e0f8aSFrancois Romieu 	mii_check_media(&rp->mii_if, netif_msg_link(rp), init_media);
1313f2148a47SJeff Kirsher 
1314f2148a47SJeff Kirsher 	if (rp->mii_if.full_duplex)
1315f2148a47SJeff Kirsher 	    iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1FDuplex,
1316f2148a47SJeff Kirsher 		   ioaddr + ChipCmd1);
1317f2148a47SJeff Kirsher 	else
1318f2148a47SJeff Kirsher 	    iowrite8(ioread8(ioaddr + ChipCmd1) & ~Cmd1FDuplex,
1319f2148a47SJeff Kirsher 		   ioaddr + ChipCmd1);
1320fc3e0f8aSFrancois Romieu 
1321fc3e0f8aSFrancois Romieu 	netif_info(rp, link, dev, "force_media %d, carrier %d\n",
1322f2148a47SJeff Kirsher 		   rp->mii_if.force_media, netif_carrier_ok(dev));
1323f2148a47SJeff Kirsher }
1324f2148a47SJeff Kirsher 
1325f2148a47SJeff Kirsher /* Called after status of force_media possibly changed */
1326f2148a47SJeff Kirsher static void rhine_set_carrier(struct mii_if_info *mii)
1327f2148a47SJeff Kirsher {
1328fc3e0f8aSFrancois Romieu 	struct net_device *dev = mii->dev;
1329fc3e0f8aSFrancois Romieu 	struct rhine_private *rp = netdev_priv(dev);
1330fc3e0f8aSFrancois Romieu 
1331f2148a47SJeff Kirsher 	if (mii->force_media) {
1332f2148a47SJeff Kirsher 		/* autoneg is off: Link is always assumed to be up */
1333fc3e0f8aSFrancois Romieu 		if (!netif_carrier_ok(dev))
1334fc3e0f8aSFrancois Romieu 			netif_carrier_on(dev);
1335fc3e0f8aSFrancois Romieu 	} else	/* Let MMI library update carrier status */
1336fc3e0f8aSFrancois Romieu 		rhine_check_media(dev, 0);
1337fc3e0f8aSFrancois Romieu 
1338fc3e0f8aSFrancois Romieu 	netif_info(rp, link, dev, "force_media %d, carrier %d\n",
1339fc3e0f8aSFrancois Romieu 		   mii->force_media, netif_carrier_ok(dev));
1340f2148a47SJeff Kirsher }
1341f2148a47SJeff Kirsher 
1342f2148a47SJeff Kirsher /**
1343f2148a47SJeff Kirsher  * rhine_set_cam - set CAM multicast filters
1344f2148a47SJeff Kirsher  * @ioaddr: register block of this Rhine
1345f2148a47SJeff Kirsher  * @idx: multicast CAM index [0..MCAM_SIZE-1]
1346f2148a47SJeff Kirsher  * @addr: multicast address (6 bytes)
1347f2148a47SJeff Kirsher  *
1348f2148a47SJeff Kirsher  * Load addresses into multicast filters.
1349f2148a47SJeff Kirsher  */
1350f2148a47SJeff Kirsher static void rhine_set_cam(void __iomem *ioaddr, int idx, u8 *addr)
1351f2148a47SJeff Kirsher {
1352f2148a47SJeff Kirsher 	int i;
1353f2148a47SJeff Kirsher 
1354f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMEN, ioaddr + CamCon);
1355f2148a47SJeff Kirsher 	wmb();
1356f2148a47SJeff Kirsher 
1357f2148a47SJeff Kirsher 	/* Paranoid -- idx out of range should never happen */
1358f2148a47SJeff Kirsher 	idx &= (MCAM_SIZE - 1);
1359f2148a47SJeff Kirsher 
1360f2148a47SJeff Kirsher 	iowrite8((u8) idx, ioaddr + CamAddr);
1361f2148a47SJeff Kirsher 
1362f2148a47SJeff Kirsher 	for (i = 0; i < 6; i++, addr++)
1363f2148a47SJeff Kirsher 		iowrite8(*addr, ioaddr + MulticastFilter0 + i);
1364f2148a47SJeff Kirsher 	udelay(10);
1365f2148a47SJeff Kirsher 	wmb();
1366f2148a47SJeff Kirsher 
1367f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMWR | CAMC_CAMEN, ioaddr + CamCon);
1368f2148a47SJeff Kirsher 	udelay(10);
1369f2148a47SJeff Kirsher 
1370f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + CamCon);
1371f2148a47SJeff Kirsher }
1372f2148a47SJeff Kirsher 
1373f2148a47SJeff Kirsher /**
1374f2148a47SJeff Kirsher  * rhine_set_vlan_cam - set CAM VLAN filters
1375f2148a47SJeff Kirsher  * @ioaddr: register block of this Rhine
1376f2148a47SJeff Kirsher  * @idx: VLAN CAM index [0..VCAM_SIZE-1]
1377f2148a47SJeff Kirsher  * @addr: VLAN ID (2 bytes)
1378f2148a47SJeff Kirsher  *
1379f2148a47SJeff Kirsher  * Load addresses into VLAN filters.
1380f2148a47SJeff Kirsher  */
1381f2148a47SJeff Kirsher static void rhine_set_vlan_cam(void __iomem *ioaddr, int idx, u8 *addr)
1382f2148a47SJeff Kirsher {
1383f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMEN | CAMC_VCAMSL, ioaddr + CamCon);
1384f2148a47SJeff Kirsher 	wmb();
1385f2148a47SJeff Kirsher 
1386f2148a47SJeff Kirsher 	/* Paranoid -- idx out of range should never happen */
1387f2148a47SJeff Kirsher 	idx &= (VCAM_SIZE - 1);
1388f2148a47SJeff Kirsher 
1389f2148a47SJeff Kirsher 	iowrite8((u8) idx, ioaddr + CamAddr);
1390f2148a47SJeff Kirsher 
1391f2148a47SJeff Kirsher 	iowrite16(*((u16 *) addr), ioaddr + MulticastFilter0 + 6);
1392f2148a47SJeff Kirsher 	udelay(10);
1393f2148a47SJeff Kirsher 	wmb();
1394f2148a47SJeff Kirsher 
1395f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMWR | CAMC_CAMEN, ioaddr + CamCon);
1396f2148a47SJeff Kirsher 	udelay(10);
1397f2148a47SJeff Kirsher 
1398f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + CamCon);
1399f2148a47SJeff Kirsher }
1400f2148a47SJeff Kirsher 
1401f2148a47SJeff Kirsher /**
1402f2148a47SJeff Kirsher  * rhine_set_cam_mask - set multicast CAM mask
1403f2148a47SJeff Kirsher  * @ioaddr: register block of this Rhine
1404f2148a47SJeff Kirsher  * @mask: multicast CAM mask
1405f2148a47SJeff Kirsher  *
1406f2148a47SJeff Kirsher  * Mask sets multicast filters active/inactive.
1407f2148a47SJeff Kirsher  */
1408f2148a47SJeff Kirsher static void rhine_set_cam_mask(void __iomem *ioaddr, u32 mask)
1409f2148a47SJeff Kirsher {
1410f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMEN, ioaddr + CamCon);
1411f2148a47SJeff Kirsher 	wmb();
1412f2148a47SJeff Kirsher 
1413f2148a47SJeff Kirsher 	/* write mask */
1414f2148a47SJeff Kirsher 	iowrite32(mask, ioaddr + CamMask);
1415f2148a47SJeff Kirsher 
1416f2148a47SJeff Kirsher 	/* disable CAMEN */
1417f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + CamCon);
1418f2148a47SJeff Kirsher }
1419f2148a47SJeff Kirsher 
1420f2148a47SJeff Kirsher /**
1421f2148a47SJeff Kirsher  * rhine_set_vlan_cam_mask - set VLAN CAM mask
1422f2148a47SJeff Kirsher  * @ioaddr: register block of this Rhine
1423f2148a47SJeff Kirsher  * @mask: VLAN CAM mask
1424f2148a47SJeff Kirsher  *
1425f2148a47SJeff Kirsher  * Mask sets VLAN filters active/inactive.
1426f2148a47SJeff Kirsher  */
1427f2148a47SJeff Kirsher static void rhine_set_vlan_cam_mask(void __iomem *ioaddr, u32 mask)
1428f2148a47SJeff Kirsher {
1429f2148a47SJeff Kirsher 	iowrite8(CAMC_CAMEN | CAMC_VCAMSL, ioaddr + CamCon);
1430f2148a47SJeff Kirsher 	wmb();
1431f2148a47SJeff Kirsher 
1432f2148a47SJeff Kirsher 	/* write mask */
1433f2148a47SJeff Kirsher 	iowrite32(mask, ioaddr + CamMask);
1434f2148a47SJeff Kirsher 
1435f2148a47SJeff Kirsher 	/* disable CAMEN */
1436f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + CamCon);
1437f2148a47SJeff Kirsher }
1438f2148a47SJeff Kirsher 
1439f2148a47SJeff Kirsher /**
1440f2148a47SJeff Kirsher  * rhine_init_cam_filter - initialize CAM filters
1441f2148a47SJeff Kirsher  * @dev: network device
1442f2148a47SJeff Kirsher  *
1443f2148a47SJeff Kirsher  * Initialize (disable) hardware VLAN and multicast support on this
1444f2148a47SJeff Kirsher  * Rhine.
1445f2148a47SJeff Kirsher  */
1446f2148a47SJeff Kirsher static void rhine_init_cam_filter(struct net_device *dev)
1447f2148a47SJeff Kirsher {
1448f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1449f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1450f2148a47SJeff Kirsher 
1451f2148a47SJeff Kirsher 	/* Disable all CAMs */
1452f2148a47SJeff Kirsher 	rhine_set_vlan_cam_mask(ioaddr, 0);
1453f2148a47SJeff Kirsher 	rhine_set_cam_mask(ioaddr, 0);
1454f2148a47SJeff Kirsher 
1455f2148a47SJeff Kirsher 	/* disable hardware VLAN support */
1456f2148a47SJeff Kirsher 	BYTE_REG_BITS_ON(TCR_PQEN, ioaddr + TxConfig);
1457f2148a47SJeff Kirsher 	BYTE_REG_BITS_OFF(BCR1_VIDFR, ioaddr + PCIBusConfig1);
1458f2148a47SJeff Kirsher }
1459f2148a47SJeff Kirsher 
1460f2148a47SJeff Kirsher /**
1461f2148a47SJeff Kirsher  * rhine_update_vcam - update VLAN CAM filters
1462f2148a47SJeff Kirsher  * @rp: rhine_private data of this Rhine
1463f2148a47SJeff Kirsher  *
1464f2148a47SJeff Kirsher  * Update VLAN CAM filters to match configuration change.
1465f2148a47SJeff Kirsher  */
1466f2148a47SJeff Kirsher static void rhine_update_vcam(struct net_device *dev)
1467f2148a47SJeff Kirsher {
1468f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1469f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1470f2148a47SJeff Kirsher 	u16 vid;
1471f2148a47SJeff Kirsher 	u32 vCAMmask = 0;	/* 32 vCAMs (6105M and better) */
1472f2148a47SJeff Kirsher 	unsigned int i = 0;
1473f2148a47SJeff Kirsher 
1474f2148a47SJeff Kirsher 	for_each_set_bit(vid, rp->active_vlans, VLAN_N_VID) {
1475f2148a47SJeff Kirsher 		rhine_set_vlan_cam(ioaddr, i, (u8 *)&vid);
1476f2148a47SJeff Kirsher 		vCAMmask |= 1 << i;
1477f2148a47SJeff Kirsher 		if (++i >= VCAM_SIZE)
1478f2148a47SJeff Kirsher 			break;
1479f2148a47SJeff Kirsher 	}
1480f2148a47SJeff Kirsher 	rhine_set_vlan_cam_mask(ioaddr, vCAMmask);
1481f2148a47SJeff Kirsher }
1482f2148a47SJeff Kirsher 
148380d5c368SPatrick McHardy static int rhine_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
1484f2148a47SJeff Kirsher {
1485f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1486f2148a47SJeff Kirsher 
14877ab87ff4SFrancois Romieu 	spin_lock_bh(&rp->lock);
1488f2148a47SJeff Kirsher 	set_bit(vid, rp->active_vlans);
1489f2148a47SJeff Kirsher 	rhine_update_vcam(dev);
14907ab87ff4SFrancois Romieu 	spin_unlock_bh(&rp->lock);
14918e586137SJiri Pirko 	return 0;
1492f2148a47SJeff Kirsher }
1493f2148a47SJeff Kirsher 
149480d5c368SPatrick McHardy static int rhine_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
1495f2148a47SJeff Kirsher {
1496f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1497f2148a47SJeff Kirsher 
14987ab87ff4SFrancois Romieu 	spin_lock_bh(&rp->lock);
1499f2148a47SJeff Kirsher 	clear_bit(vid, rp->active_vlans);
1500f2148a47SJeff Kirsher 	rhine_update_vcam(dev);
15017ab87ff4SFrancois Romieu 	spin_unlock_bh(&rp->lock);
15028e586137SJiri Pirko 	return 0;
1503f2148a47SJeff Kirsher }
1504f2148a47SJeff Kirsher 
1505f2148a47SJeff Kirsher static void init_registers(struct net_device *dev)
1506f2148a47SJeff Kirsher {
1507f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1508f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1509f2148a47SJeff Kirsher 	int i;
1510f2148a47SJeff Kirsher 
1511f2148a47SJeff Kirsher 	for (i = 0; i < 6; i++)
1512f2148a47SJeff Kirsher 		iowrite8(dev->dev_addr[i], ioaddr + StationAddr + i);
1513f2148a47SJeff Kirsher 
1514f2148a47SJeff Kirsher 	/* Initialize other registers. */
1515f2148a47SJeff Kirsher 	iowrite16(0x0006, ioaddr + PCIBusConfig);	/* Tune configuration??? */
1516f2148a47SJeff Kirsher 	/* Configure initial FIFO thresholds. */
1517f2148a47SJeff Kirsher 	iowrite8(0x20, ioaddr + TxConfig);
1518f2148a47SJeff Kirsher 	rp->tx_thresh = 0x20;
1519f2148a47SJeff Kirsher 	rp->rx_thresh = 0x60;		/* Written in rhine_set_rx_mode(). */
1520f2148a47SJeff Kirsher 
1521f2148a47SJeff Kirsher 	iowrite32(rp->rx_ring_dma, ioaddr + RxRingPtr);
1522f2148a47SJeff Kirsher 	iowrite32(rp->tx_ring_dma, ioaddr + TxRingPtr);
1523f2148a47SJeff Kirsher 
1524f2148a47SJeff Kirsher 	rhine_set_rx_mode(dev);
1525f2148a47SJeff Kirsher 
1526f7630d18SAlexey Charkov 	if (rp->revision >= VT6105M)
1527f2148a47SJeff Kirsher 		rhine_init_cam_filter(dev);
1528f2148a47SJeff Kirsher 
1529f2148a47SJeff Kirsher 	napi_enable(&rp->napi);
1530f2148a47SJeff Kirsher 
15317ab87ff4SFrancois Romieu 	iowrite16(RHINE_EVENT & 0xffff, ioaddr + IntrEnable);
1532f2148a47SJeff Kirsher 
1533f2148a47SJeff Kirsher 	iowrite16(CmdStart | CmdTxOn | CmdRxOn | (Cmd1NoTxPoll << 8),
1534f2148a47SJeff Kirsher 	       ioaddr + ChipCmd);
1535f2148a47SJeff Kirsher 	rhine_check_media(dev, 1);
1536f2148a47SJeff Kirsher }
1537f2148a47SJeff Kirsher 
1538f2148a47SJeff Kirsher /* Enable MII link status auto-polling (required for IntrLinkChange) */
1539a384a33bSFrancois Romieu static void rhine_enable_linkmon(struct rhine_private *rp)
1540f2148a47SJeff Kirsher {
1541a384a33bSFrancois Romieu 	void __iomem *ioaddr = rp->base;
1542a384a33bSFrancois Romieu 
1543f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + MIICmd);
1544f2148a47SJeff Kirsher 	iowrite8(MII_BMSR, ioaddr + MIIRegAddr);
1545f2148a47SJeff Kirsher 	iowrite8(0x80, ioaddr + MIICmd);
1546f2148a47SJeff Kirsher 
1547a384a33bSFrancois Romieu 	rhine_wait_bit_high(rp, MIIRegAddr, 0x20);
1548f2148a47SJeff Kirsher 
1549f2148a47SJeff Kirsher 	iowrite8(MII_BMSR | 0x40, ioaddr + MIIRegAddr);
1550f2148a47SJeff Kirsher }
1551f2148a47SJeff Kirsher 
1552f2148a47SJeff Kirsher /* Disable MII link status auto-polling (required for MDIO access) */
1553a384a33bSFrancois Romieu static void rhine_disable_linkmon(struct rhine_private *rp)
1554f2148a47SJeff Kirsher {
1555a384a33bSFrancois Romieu 	void __iomem *ioaddr = rp->base;
1556a384a33bSFrancois Romieu 
1557f2148a47SJeff Kirsher 	iowrite8(0, ioaddr + MIICmd);
1558f2148a47SJeff Kirsher 
1559a384a33bSFrancois Romieu 	if (rp->quirks & rqRhineI) {
1560f2148a47SJeff Kirsher 		iowrite8(0x01, ioaddr + MIIRegAddr);	// MII_BMSR
1561f2148a47SJeff Kirsher 
1562f2148a47SJeff Kirsher 		/* Can be called from ISR. Evil. */
1563f2148a47SJeff Kirsher 		mdelay(1);
1564f2148a47SJeff Kirsher 
1565f2148a47SJeff Kirsher 		/* 0x80 must be set immediately before turning it off */
1566f2148a47SJeff Kirsher 		iowrite8(0x80, ioaddr + MIICmd);
1567f2148a47SJeff Kirsher 
1568a384a33bSFrancois Romieu 		rhine_wait_bit_high(rp, MIIRegAddr, 0x20);
1569f2148a47SJeff Kirsher 
1570f2148a47SJeff Kirsher 		/* Heh. Now clear 0x80 again. */
1571f2148a47SJeff Kirsher 		iowrite8(0, ioaddr + MIICmd);
1572f2148a47SJeff Kirsher 	}
1573f2148a47SJeff Kirsher 	else
1574a384a33bSFrancois Romieu 		rhine_wait_bit_high(rp, MIIRegAddr, 0x80);
1575f2148a47SJeff Kirsher }
1576f2148a47SJeff Kirsher 
1577f2148a47SJeff Kirsher /* Read and write over the MII Management Data I/O (MDIO) interface. */
1578f2148a47SJeff Kirsher 
1579f2148a47SJeff Kirsher static int mdio_read(struct net_device *dev, int phy_id, int regnum)
1580f2148a47SJeff Kirsher {
1581f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1582f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1583f2148a47SJeff Kirsher 	int result;
1584f2148a47SJeff Kirsher 
1585a384a33bSFrancois Romieu 	rhine_disable_linkmon(rp);
1586f2148a47SJeff Kirsher 
1587f2148a47SJeff Kirsher 	/* rhine_disable_linkmon already cleared MIICmd */
1588f2148a47SJeff Kirsher 	iowrite8(phy_id, ioaddr + MIIPhyAddr);
1589f2148a47SJeff Kirsher 	iowrite8(regnum, ioaddr + MIIRegAddr);
1590f2148a47SJeff Kirsher 	iowrite8(0x40, ioaddr + MIICmd);		/* Trigger read */
1591a384a33bSFrancois Romieu 	rhine_wait_bit_low(rp, MIICmd, 0x40);
1592f2148a47SJeff Kirsher 	result = ioread16(ioaddr + MIIData);
1593f2148a47SJeff Kirsher 
1594a384a33bSFrancois Romieu 	rhine_enable_linkmon(rp);
1595f2148a47SJeff Kirsher 	return result;
1596f2148a47SJeff Kirsher }
1597f2148a47SJeff Kirsher 
1598f2148a47SJeff Kirsher static void mdio_write(struct net_device *dev, int phy_id, int regnum, int value)
1599f2148a47SJeff Kirsher {
1600f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1601f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1602f2148a47SJeff Kirsher 
1603a384a33bSFrancois Romieu 	rhine_disable_linkmon(rp);
1604f2148a47SJeff Kirsher 
1605f2148a47SJeff Kirsher 	/* rhine_disable_linkmon already cleared MIICmd */
1606f2148a47SJeff Kirsher 	iowrite8(phy_id, ioaddr + MIIPhyAddr);
1607f2148a47SJeff Kirsher 	iowrite8(regnum, ioaddr + MIIRegAddr);
1608f2148a47SJeff Kirsher 	iowrite16(value, ioaddr + MIIData);
1609f2148a47SJeff Kirsher 	iowrite8(0x20, ioaddr + MIICmd);		/* Trigger write */
1610a384a33bSFrancois Romieu 	rhine_wait_bit_low(rp, MIICmd, 0x20);
1611f2148a47SJeff Kirsher 
1612a384a33bSFrancois Romieu 	rhine_enable_linkmon(rp);
1613f2148a47SJeff Kirsher }
1614f2148a47SJeff Kirsher 
16157ab87ff4SFrancois Romieu static void rhine_task_disable(struct rhine_private *rp)
16167ab87ff4SFrancois Romieu {
16177ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
16187ab87ff4SFrancois Romieu 	rp->task_enable = false;
16197ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
16207ab87ff4SFrancois Romieu 
16217ab87ff4SFrancois Romieu 	cancel_work_sync(&rp->slow_event_task);
16227ab87ff4SFrancois Romieu 	cancel_work_sync(&rp->reset_task);
16237ab87ff4SFrancois Romieu }
16247ab87ff4SFrancois Romieu 
16257ab87ff4SFrancois Romieu static void rhine_task_enable(struct rhine_private *rp)
16267ab87ff4SFrancois Romieu {
16277ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
16287ab87ff4SFrancois Romieu 	rp->task_enable = true;
16297ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
16307ab87ff4SFrancois Romieu }
16317ab87ff4SFrancois Romieu 
1632f2148a47SJeff Kirsher static int rhine_open(struct net_device *dev)
1633f2148a47SJeff Kirsher {
1634f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1635f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1636f2148a47SJeff Kirsher 	int rc;
1637f2148a47SJeff Kirsher 
1638f7630d18SAlexey Charkov 	rc = request_irq(rp->irq, rhine_interrupt, IRQF_SHARED, dev->name, dev);
1639f2148a47SJeff Kirsher 	if (rc)
1640f2148a47SJeff Kirsher 		return rc;
1641f2148a47SJeff Kirsher 
1642f7630d18SAlexey Charkov 	netif_dbg(rp, ifup, dev, "%s() irq %d\n", __func__, rp->irq);
1643f2148a47SJeff Kirsher 
1644f2148a47SJeff Kirsher 	rc = alloc_ring(dev);
1645f2148a47SJeff Kirsher 	if (rc) {
1646f7630d18SAlexey Charkov 		free_irq(rp->irq, dev);
1647f2148a47SJeff Kirsher 		return rc;
1648f2148a47SJeff Kirsher 	}
1649f2148a47SJeff Kirsher 	alloc_rbufs(dev);
1650f2148a47SJeff Kirsher 	alloc_tbufs(dev);
1651f2148a47SJeff Kirsher 	rhine_chip_reset(dev);
16527ab87ff4SFrancois Romieu 	rhine_task_enable(rp);
1653f2148a47SJeff Kirsher 	init_registers(dev);
1654fc3e0f8aSFrancois Romieu 
1655fc3e0f8aSFrancois Romieu 	netif_dbg(rp, ifup, dev, "%s() Done - status %04x MII status: %04x\n",
1656f2148a47SJeff Kirsher 		  __func__, ioread16(ioaddr + ChipCmd),
1657f2148a47SJeff Kirsher 		  mdio_read(dev, rp->mii_if.phy_id, MII_BMSR));
1658f2148a47SJeff Kirsher 
1659f2148a47SJeff Kirsher 	netif_start_queue(dev);
1660f2148a47SJeff Kirsher 
1661f2148a47SJeff Kirsher 	return 0;
1662f2148a47SJeff Kirsher }
1663f2148a47SJeff Kirsher 
1664f2148a47SJeff Kirsher static void rhine_reset_task(struct work_struct *work)
1665f2148a47SJeff Kirsher {
1666f2148a47SJeff Kirsher 	struct rhine_private *rp = container_of(work, struct rhine_private,
1667f2148a47SJeff Kirsher 						reset_task);
1668f2148a47SJeff Kirsher 	struct net_device *dev = rp->dev;
1669f2148a47SJeff Kirsher 
16707ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
16717ab87ff4SFrancois Romieu 
16727ab87ff4SFrancois Romieu 	if (!rp->task_enable)
16737ab87ff4SFrancois Romieu 		goto out_unlock;
1674f2148a47SJeff Kirsher 
1675f2148a47SJeff Kirsher 	napi_disable(&rp->napi);
1676a926592fSRichard Weinberger 	netif_tx_disable(dev);
1677f2148a47SJeff Kirsher 	spin_lock_bh(&rp->lock);
1678f2148a47SJeff Kirsher 
1679f2148a47SJeff Kirsher 	/* clear all descriptors */
1680f2148a47SJeff Kirsher 	free_tbufs(dev);
1681f2148a47SJeff Kirsher 	free_rbufs(dev);
1682f2148a47SJeff Kirsher 	alloc_tbufs(dev);
1683f2148a47SJeff Kirsher 	alloc_rbufs(dev);
1684f2148a47SJeff Kirsher 
1685f2148a47SJeff Kirsher 	/* Reinitialize the hardware. */
1686f2148a47SJeff Kirsher 	rhine_chip_reset(dev);
1687f2148a47SJeff Kirsher 	init_registers(dev);
1688f2148a47SJeff Kirsher 
1689f2148a47SJeff Kirsher 	spin_unlock_bh(&rp->lock);
1690f2148a47SJeff Kirsher 
1691f2148a47SJeff Kirsher 	dev->trans_start = jiffies; /* prevent tx timeout */
1692f2148a47SJeff Kirsher 	dev->stats.tx_errors++;
1693f2148a47SJeff Kirsher 	netif_wake_queue(dev);
16947ab87ff4SFrancois Romieu 
16957ab87ff4SFrancois Romieu out_unlock:
16967ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
1697f2148a47SJeff Kirsher }
1698f2148a47SJeff Kirsher 
1699f2148a47SJeff Kirsher static void rhine_tx_timeout(struct net_device *dev)
1700f2148a47SJeff Kirsher {
1701f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1702f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1703f2148a47SJeff Kirsher 
1704f2148a47SJeff Kirsher 	netdev_warn(dev, "Transmit timed out, status %04x, PHY status %04x, resetting...\n",
1705f2148a47SJeff Kirsher 		    ioread16(ioaddr + IntrStatus),
1706f2148a47SJeff Kirsher 		    mdio_read(dev, rp->mii_if.phy_id, MII_BMSR));
1707f2148a47SJeff Kirsher 
1708f2148a47SJeff Kirsher 	schedule_work(&rp->reset_task);
1709f2148a47SJeff Kirsher }
1710f2148a47SJeff Kirsher 
1711f2148a47SJeff Kirsher static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
1712f2148a47SJeff Kirsher 				  struct net_device *dev)
1713f2148a47SJeff Kirsher {
1714f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1715f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1716f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
1717f2148a47SJeff Kirsher 	unsigned entry;
1718f2148a47SJeff Kirsher 
1719f2148a47SJeff Kirsher 	/* Caution: the write order is important here, set the field
1720f2148a47SJeff Kirsher 	   with the "ownership" bits last. */
1721f2148a47SJeff Kirsher 
1722f2148a47SJeff Kirsher 	/* Calculate the next Tx descriptor entry. */
1723f2148a47SJeff Kirsher 	entry = rp->cur_tx % TX_RING_SIZE;
1724f2148a47SJeff Kirsher 
1725f2148a47SJeff Kirsher 	if (skb_padto(skb, ETH_ZLEN))
1726f2148a47SJeff Kirsher 		return NETDEV_TX_OK;
1727f2148a47SJeff Kirsher 
1728f2148a47SJeff Kirsher 	rp->tx_skbuff[entry] = skb;
1729f2148a47SJeff Kirsher 
1730f2148a47SJeff Kirsher 	if ((rp->quirks & rqRhineI) &&
1731f2148a47SJeff Kirsher 	    (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_PARTIAL)) {
1732f2148a47SJeff Kirsher 		/* Must use alignment buffer. */
1733f2148a47SJeff Kirsher 		if (skb->len > PKT_BUF_SZ) {
1734f2148a47SJeff Kirsher 			/* packet too long, drop it */
17354b3afc6eSEric W. Biederman 			dev_kfree_skb_any(skb);
1736f2148a47SJeff Kirsher 			rp->tx_skbuff[entry] = NULL;
1737f2148a47SJeff Kirsher 			dev->stats.tx_dropped++;
1738f2148a47SJeff Kirsher 			return NETDEV_TX_OK;
1739f2148a47SJeff Kirsher 		}
1740f2148a47SJeff Kirsher 
1741f2148a47SJeff Kirsher 		/* Padding is not copied and so must be redone. */
1742f2148a47SJeff Kirsher 		skb_copy_and_csum_dev(skb, rp->tx_buf[entry]);
1743f2148a47SJeff Kirsher 		if (skb->len < ETH_ZLEN)
1744f2148a47SJeff Kirsher 			memset(rp->tx_buf[entry] + skb->len, 0,
1745f2148a47SJeff Kirsher 			       ETH_ZLEN - skb->len);
1746f2148a47SJeff Kirsher 		rp->tx_skbuff_dma[entry] = 0;
1747f2148a47SJeff Kirsher 		rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma +
1748f2148a47SJeff Kirsher 						      (rp->tx_buf[entry] -
1749f2148a47SJeff Kirsher 						       rp->tx_bufs));
1750f2148a47SJeff Kirsher 	} else {
1751f2148a47SJeff Kirsher 		rp->tx_skbuff_dma[entry] =
1752f7630d18SAlexey Charkov 			dma_map_single(hwdev, skb->data, skb->len,
17534087c4dcSAlexey Charkov 				       DMA_TO_DEVICE);
1754f7630d18SAlexey Charkov 		if (dma_mapping_error(hwdev, rp->tx_skbuff_dma[entry])) {
17554b3afc6eSEric W. Biederman 			dev_kfree_skb_any(skb);
17569b4fe5fbSNeil Horman 			rp->tx_skbuff_dma[entry] = 0;
17579b4fe5fbSNeil Horman 			dev->stats.tx_dropped++;
17589b4fe5fbSNeil Horman 			return NETDEV_TX_OK;
17599b4fe5fbSNeil Horman 		}
1760f2148a47SJeff Kirsher 		rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]);
1761f2148a47SJeff Kirsher 	}
1762f2148a47SJeff Kirsher 
1763f2148a47SJeff Kirsher 	rp->tx_ring[entry].desc_length =
1764f2148a47SJeff Kirsher 		cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
1765f2148a47SJeff Kirsher 
1766f2148a47SJeff Kirsher 	if (unlikely(vlan_tx_tag_present(skb))) {
1767207070f5SRoger Luethi 		u16 vid_pcp = vlan_tx_tag_get(skb);
1768207070f5SRoger Luethi 
1769207070f5SRoger Luethi 		/* drop CFI/DEI bit, register needs VID and PCP */
1770207070f5SRoger Luethi 		vid_pcp = (vid_pcp & VLAN_VID_MASK) |
1771207070f5SRoger Luethi 			  ((vid_pcp & VLAN_PRIO_MASK) >> 1);
1772207070f5SRoger Luethi 		rp->tx_ring[entry].tx_status = cpu_to_le32((vid_pcp) << 16);
1773f2148a47SJeff Kirsher 		/* request tagging */
1774f2148a47SJeff Kirsher 		rp->tx_ring[entry].desc_length |= cpu_to_le32(0x020000);
1775f2148a47SJeff Kirsher 	}
1776f2148a47SJeff Kirsher 	else
1777f2148a47SJeff Kirsher 		rp->tx_ring[entry].tx_status = 0;
1778f2148a47SJeff Kirsher 
1779f2148a47SJeff Kirsher 	/* lock eth irq */
1780f2148a47SJeff Kirsher 	wmb();
1781f2148a47SJeff Kirsher 	rp->tx_ring[entry].tx_status |= cpu_to_le32(DescOwn);
1782f2148a47SJeff Kirsher 	wmb();
1783f2148a47SJeff Kirsher 
1784f2148a47SJeff Kirsher 	rp->cur_tx++;
1785f2148a47SJeff Kirsher 
1786f2148a47SJeff Kirsher 	/* Non-x86 Todo: explicitly flush cache lines here. */
1787f2148a47SJeff Kirsher 
1788f2148a47SJeff Kirsher 	if (vlan_tx_tag_present(skb))
1789f2148a47SJeff Kirsher 		/* Tx queues are bits 7-0 (first Tx queue: bit 7) */
1790f2148a47SJeff Kirsher 		BYTE_REG_BITS_ON(1 << 7, ioaddr + TQWake);
1791f2148a47SJeff Kirsher 
1792f2148a47SJeff Kirsher 	/* Wake the potentially-idle transmit channel */
1793f2148a47SJeff Kirsher 	iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand,
1794f2148a47SJeff Kirsher 	       ioaddr + ChipCmd1);
1795f2148a47SJeff Kirsher 	IOSYNC;
1796f2148a47SJeff Kirsher 
1797f2148a47SJeff Kirsher 	if (rp->cur_tx == rp->dirty_tx + TX_QUEUE_LEN)
1798f2148a47SJeff Kirsher 		netif_stop_queue(dev);
1799f2148a47SJeff Kirsher 
1800fc3e0f8aSFrancois Romieu 	netif_dbg(rp, tx_queued, dev, "Transmit frame #%d queued in slot %d\n",
1801f2148a47SJeff Kirsher 		  rp->cur_tx - 1, entry);
1802fc3e0f8aSFrancois Romieu 
1803f2148a47SJeff Kirsher 	return NETDEV_TX_OK;
1804f2148a47SJeff Kirsher }
1805f2148a47SJeff Kirsher 
18067ab87ff4SFrancois Romieu static void rhine_irq_disable(struct rhine_private *rp)
18077ab87ff4SFrancois Romieu {
18087ab87ff4SFrancois Romieu 	iowrite16(0x0000, rp->base + IntrEnable);
18097ab87ff4SFrancois Romieu 	mmiowb();
18107ab87ff4SFrancois Romieu }
18117ab87ff4SFrancois Romieu 
1812f2148a47SJeff Kirsher /* The interrupt handler does all of the Rx thread work and cleans up
1813f2148a47SJeff Kirsher    after the Tx thread. */
1814f2148a47SJeff Kirsher static irqreturn_t rhine_interrupt(int irq, void *dev_instance)
1815f2148a47SJeff Kirsher {
1816f2148a47SJeff Kirsher 	struct net_device *dev = dev_instance;
1817f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
18187ab87ff4SFrancois Romieu 	u32 status;
1819f2148a47SJeff Kirsher 	int handled = 0;
1820f2148a47SJeff Kirsher 
18217ab87ff4SFrancois Romieu 	status = rhine_get_events(rp);
1822f2148a47SJeff Kirsher 
1823fc3e0f8aSFrancois Romieu 	netif_dbg(rp, intr, dev, "Interrupt, status %08x\n", status);
1824f2148a47SJeff Kirsher 
18257ab87ff4SFrancois Romieu 	if (status & RHINE_EVENT) {
18267ab87ff4SFrancois Romieu 		handled = 1;
1827f2148a47SJeff Kirsher 
18287ab87ff4SFrancois Romieu 		rhine_irq_disable(rp);
1829f2148a47SJeff Kirsher 		napi_schedule(&rp->napi);
1830f2148a47SJeff Kirsher 	}
1831f2148a47SJeff Kirsher 
18327ab87ff4SFrancois Romieu 	if (status & ~(IntrLinkChange | IntrStatsMax | RHINE_EVENT_NAPI)) {
1833fc3e0f8aSFrancois Romieu 		netif_err(rp, intr, dev, "Something Wicked happened! %08x\n",
18347ab87ff4SFrancois Romieu 			  status);
1835f2148a47SJeff Kirsher 	}
1836f2148a47SJeff Kirsher 
1837f2148a47SJeff Kirsher 	return IRQ_RETVAL(handled);
1838f2148a47SJeff Kirsher }
1839f2148a47SJeff Kirsher 
1840f2148a47SJeff Kirsher /* This routine is logically part of the interrupt handler, but isolated
1841f2148a47SJeff Kirsher    for clarity. */
1842f2148a47SJeff Kirsher static void rhine_tx(struct net_device *dev)
1843f2148a47SJeff Kirsher {
1844f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1845f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1846f2148a47SJeff Kirsher 	int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE;
1847f2148a47SJeff Kirsher 
1848f2148a47SJeff Kirsher 	/* find and cleanup dirty tx descriptors */
1849f2148a47SJeff Kirsher 	while (rp->dirty_tx != rp->cur_tx) {
1850f2148a47SJeff Kirsher 		txstatus = le32_to_cpu(rp->tx_ring[entry].tx_status);
1851fc3e0f8aSFrancois Romieu 		netif_dbg(rp, tx_done, dev, "Tx scavenge %d status %08x\n",
1852f2148a47SJeff Kirsher 			  entry, txstatus);
1853f2148a47SJeff Kirsher 		if (txstatus & DescOwn)
1854f2148a47SJeff Kirsher 			break;
1855f2148a47SJeff Kirsher 		if (txstatus & 0x8000) {
1856fc3e0f8aSFrancois Romieu 			netif_dbg(rp, tx_done, dev,
1857fc3e0f8aSFrancois Romieu 				  "Transmit error, Tx status %08x\n", txstatus);
1858f2148a47SJeff Kirsher 			dev->stats.tx_errors++;
1859f2148a47SJeff Kirsher 			if (txstatus & 0x0400)
1860f2148a47SJeff Kirsher 				dev->stats.tx_carrier_errors++;
1861f2148a47SJeff Kirsher 			if (txstatus & 0x0200)
1862f2148a47SJeff Kirsher 				dev->stats.tx_window_errors++;
1863f2148a47SJeff Kirsher 			if (txstatus & 0x0100)
1864f2148a47SJeff Kirsher 				dev->stats.tx_aborted_errors++;
1865f2148a47SJeff Kirsher 			if (txstatus & 0x0080)
1866f2148a47SJeff Kirsher 				dev->stats.tx_heartbeat_errors++;
1867f2148a47SJeff Kirsher 			if (((rp->quirks & rqRhineI) && txstatus & 0x0002) ||
1868f2148a47SJeff Kirsher 			    (txstatus & 0x0800) || (txstatus & 0x1000)) {
1869f2148a47SJeff Kirsher 				dev->stats.tx_fifo_errors++;
1870f2148a47SJeff Kirsher 				rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
1871f2148a47SJeff Kirsher 				break; /* Keep the skb - we try again */
1872f2148a47SJeff Kirsher 			}
1873f2148a47SJeff Kirsher 			/* Transmitter restarted in 'abnormal' handler. */
1874f2148a47SJeff Kirsher 		} else {
1875f2148a47SJeff Kirsher 			if (rp->quirks & rqRhineI)
1876f2148a47SJeff Kirsher 				dev->stats.collisions += (txstatus >> 3) & 0x0F;
1877f2148a47SJeff Kirsher 			else
1878f2148a47SJeff Kirsher 				dev->stats.collisions += txstatus & 0x0F;
1879fc3e0f8aSFrancois Romieu 			netif_dbg(rp, tx_done, dev, "collisions: %1.1x:%1.1x\n",
1880fc3e0f8aSFrancois Romieu 				  (txstatus >> 3) & 0xF, txstatus & 0xF);
1881f7b5d1b9SJamie Gloudon 
1882f7b5d1b9SJamie Gloudon 			u64_stats_update_begin(&rp->tx_stats.syncp);
1883f7b5d1b9SJamie Gloudon 			rp->tx_stats.bytes += rp->tx_skbuff[entry]->len;
1884f7b5d1b9SJamie Gloudon 			rp->tx_stats.packets++;
1885f7b5d1b9SJamie Gloudon 			u64_stats_update_end(&rp->tx_stats.syncp);
1886f2148a47SJeff Kirsher 		}
1887f2148a47SJeff Kirsher 		/* Free the original skb. */
1888f2148a47SJeff Kirsher 		if (rp->tx_skbuff_dma[entry]) {
1889f7630d18SAlexey Charkov 			dma_unmap_single(hwdev,
1890f2148a47SJeff Kirsher 					 rp->tx_skbuff_dma[entry],
1891f2148a47SJeff Kirsher 					 rp->tx_skbuff[entry]->len,
18924087c4dcSAlexey Charkov 					 DMA_TO_DEVICE);
1893f2148a47SJeff Kirsher 		}
18944b3afc6eSEric W. Biederman 		dev_consume_skb_any(rp->tx_skbuff[entry]);
1895f2148a47SJeff Kirsher 		rp->tx_skbuff[entry] = NULL;
1896f2148a47SJeff Kirsher 		entry = (++rp->dirty_tx) % TX_RING_SIZE;
1897f2148a47SJeff Kirsher 	}
1898f2148a47SJeff Kirsher 	if ((rp->cur_tx - rp->dirty_tx) < TX_QUEUE_LEN - 4)
1899f2148a47SJeff Kirsher 		netif_wake_queue(dev);
1900f2148a47SJeff Kirsher }
1901f2148a47SJeff Kirsher 
1902f2148a47SJeff Kirsher /**
1903f2148a47SJeff Kirsher  * rhine_get_vlan_tci - extract TCI from Rx data buffer
1904f2148a47SJeff Kirsher  * @skb: pointer to sk_buff
1905f2148a47SJeff Kirsher  * @data_size: used data area of the buffer including CRC
1906f2148a47SJeff Kirsher  *
1907f2148a47SJeff Kirsher  * If hardware VLAN tag extraction is enabled and the chip indicates a 802.1Q
1908f2148a47SJeff Kirsher  * packet, the extracted 802.1Q header (2 bytes TPID + 2 bytes TCI) is 4-byte
1909f2148a47SJeff Kirsher  * aligned following the CRC.
1910f2148a47SJeff Kirsher  */
1911f2148a47SJeff Kirsher static inline u16 rhine_get_vlan_tci(struct sk_buff *skb, int data_size)
1912f2148a47SJeff Kirsher {
1913f2148a47SJeff Kirsher 	u8 *trailer = (u8 *)skb->data + ((data_size + 3) & ~3) + 2;
1914f2148a47SJeff Kirsher 	return be16_to_cpup((__be16 *)trailer);
1915f2148a47SJeff Kirsher }
1916f2148a47SJeff Kirsher 
1917f2148a47SJeff Kirsher /* Process up to limit frames from receive ring */
1918f2148a47SJeff Kirsher static int rhine_rx(struct net_device *dev, int limit)
1919f2148a47SJeff Kirsher {
1920f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
1921f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
1922f2148a47SJeff Kirsher 	int count;
1923f2148a47SJeff Kirsher 	int entry = rp->cur_rx % RX_RING_SIZE;
1924f2148a47SJeff Kirsher 
1925fc3e0f8aSFrancois Romieu 	netif_dbg(rp, rx_status, dev, "%s(), entry %d status %08x\n", __func__,
1926fc3e0f8aSFrancois Romieu 		  entry, le32_to_cpu(rp->rx_head_desc->rx_status));
1927f2148a47SJeff Kirsher 
1928f2148a47SJeff Kirsher 	/* If EOP is set on the next entry, it's a new packet. Send it up. */
1929f2148a47SJeff Kirsher 	for (count = 0; count < limit; ++count) {
1930f2148a47SJeff Kirsher 		struct rx_desc *desc = rp->rx_head_desc;
1931f2148a47SJeff Kirsher 		u32 desc_status = le32_to_cpu(desc->rx_status);
1932f2148a47SJeff Kirsher 		u32 desc_length = le32_to_cpu(desc->desc_length);
1933f2148a47SJeff Kirsher 		int data_size = desc_status >> 16;
1934f2148a47SJeff Kirsher 
1935f2148a47SJeff Kirsher 		if (desc_status & DescOwn)
1936f2148a47SJeff Kirsher 			break;
1937f2148a47SJeff Kirsher 
1938fc3e0f8aSFrancois Romieu 		netif_dbg(rp, rx_status, dev, "%s() status %08x\n", __func__,
1939fc3e0f8aSFrancois Romieu 			  desc_status);
1940f2148a47SJeff Kirsher 
1941f2148a47SJeff Kirsher 		if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) {
1942f2148a47SJeff Kirsher 			if ((desc_status & RxWholePkt) != RxWholePkt) {
1943f2148a47SJeff Kirsher 				netdev_warn(dev,
1944f2148a47SJeff Kirsher 	"Oversized Ethernet frame spanned multiple buffers, "
1945f2148a47SJeff Kirsher 	"entry %#x length %d status %08x!\n",
1946f2148a47SJeff Kirsher 					    entry, data_size,
1947f2148a47SJeff Kirsher 					    desc_status);
1948f2148a47SJeff Kirsher 				netdev_warn(dev,
1949f2148a47SJeff Kirsher 					    "Oversized Ethernet frame %p vs %p\n",
1950f2148a47SJeff Kirsher 					    rp->rx_head_desc,
1951f2148a47SJeff Kirsher 					    &rp->rx_ring[entry]);
1952f2148a47SJeff Kirsher 				dev->stats.rx_length_errors++;
1953f2148a47SJeff Kirsher 			} else if (desc_status & RxErr) {
1954f2148a47SJeff Kirsher 				/* There was a error. */
1955fc3e0f8aSFrancois Romieu 				netif_dbg(rp, rx_err, dev,
1956fc3e0f8aSFrancois Romieu 					  "%s() Rx error %08x\n", __func__,
1957fc3e0f8aSFrancois Romieu 					  desc_status);
1958f2148a47SJeff Kirsher 				dev->stats.rx_errors++;
1959f2148a47SJeff Kirsher 				if (desc_status & 0x0030)
1960f2148a47SJeff Kirsher 					dev->stats.rx_length_errors++;
1961f2148a47SJeff Kirsher 				if (desc_status & 0x0048)
1962f2148a47SJeff Kirsher 					dev->stats.rx_fifo_errors++;
1963f2148a47SJeff Kirsher 				if (desc_status & 0x0004)
1964f2148a47SJeff Kirsher 					dev->stats.rx_frame_errors++;
1965f2148a47SJeff Kirsher 				if (desc_status & 0x0002) {
1966f2148a47SJeff Kirsher 					/* this can also be updated outside the interrupt handler */
1967f2148a47SJeff Kirsher 					spin_lock(&rp->lock);
1968f2148a47SJeff Kirsher 					dev->stats.rx_crc_errors++;
1969f2148a47SJeff Kirsher 					spin_unlock(&rp->lock);
1970f2148a47SJeff Kirsher 				}
1971f2148a47SJeff Kirsher 			}
1972f2148a47SJeff Kirsher 		} else {
1973f2148a47SJeff Kirsher 			struct sk_buff *skb = NULL;
1974f2148a47SJeff Kirsher 			/* Length should omit the CRC */
1975f2148a47SJeff Kirsher 			int pkt_len = data_size - 4;
1976f2148a47SJeff Kirsher 			u16 vlan_tci = 0;
1977f2148a47SJeff Kirsher 
1978f2148a47SJeff Kirsher 			/* Check if the packet is long enough to accept without
1979f2148a47SJeff Kirsher 			   copying to a minimally-sized skbuff. */
1980f2148a47SJeff Kirsher 			if (pkt_len < rx_copybreak)
1981f2148a47SJeff Kirsher 				skb = netdev_alloc_skb_ip_align(dev, pkt_len);
1982f2148a47SJeff Kirsher 			if (skb) {
1983f7630d18SAlexey Charkov 				dma_sync_single_for_cpu(hwdev,
1984f2148a47SJeff Kirsher 							rp->rx_skbuff_dma[entry],
1985f2148a47SJeff Kirsher 							rp->rx_buf_sz,
19864087c4dcSAlexey Charkov 							DMA_FROM_DEVICE);
1987f2148a47SJeff Kirsher 
1988f2148a47SJeff Kirsher 				skb_copy_to_linear_data(skb,
1989f2148a47SJeff Kirsher 						 rp->rx_skbuff[entry]->data,
1990f2148a47SJeff Kirsher 						 pkt_len);
1991f2148a47SJeff Kirsher 				skb_put(skb, pkt_len);
1992f7630d18SAlexey Charkov 				dma_sync_single_for_device(hwdev,
1993f2148a47SJeff Kirsher 							   rp->rx_skbuff_dma[entry],
1994f2148a47SJeff Kirsher 							   rp->rx_buf_sz,
19954087c4dcSAlexey Charkov 							   DMA_FROM_DEVICE);
1996f2148a47SJeff Kirsher 			} else {
1997f2148a47SJeff Kirsher 				skb = rp->rx_skbuff[entry];
1998f2148a47SJeff Kirsher 				if (skb == NULL) {
1999f2148a47SJeff Kirsher 					netdev_err(dev, "Inconsistent Rx descriptor chain\n");
2000f2148a47SJeff Kirsher 					break;
2001f2148a47SJeff Kirsher 				}
2002f2148a47SJeff Kirsher 				rp->rx_skbuff[entry] = NULL;
2003f2148a47SJeff Kirsher 				skb_put(skb, pkt_len);
2004f7630d18SAlexey Charkov 				dma_unmap_single(hwdev,
2005f2148a47SJeff Kirsher 						 rp->rx_skbuff_dma[entry],
2006f2148a47SJeff Kirsher 						 rp->rx_buf_sz,
20074087c4dcSAlexey Charkov 						 DMA_FROM_DEVICE);
2008f2148a47SJeff Kirsher 			}
2009f2148a47SJeff Kirsher 
2010f2148a47SJeff Kirsher 			if (unlikely(desc_length & DescTag))
2011f2148a47SJeff Kirsher 				vlan_tci = rhine_get_vlan_tci(skb, data_size);
2012f2148a47SJeff Kirsher 
2013f2148a47SJeff Kirsher 			skb->protocol = eth_type_trans(skb, dev);
2014f2148a47SJeff Kirsher 
2015f2148a47SJeff Kirsher 			if (unlikely(desc_length & DescTag))
201686a9bad3SPatrick McHardy 				__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci);
2017f2148a47SJeff Kirsher 			netif_receive_skb(skb);
2018f7b5d1b9SJamie Gloudon 
2019f7b5d1b9SJamie Gloudon 			u64_stats_update_begin(&rp->rx_stats.syncp);
2020f7b5d1b9SJamie Gloudon 			rp->rx_stats.bytes += pkt_len;
2021f7b5d1b9SJamie Gloudon 			rp->rx_stats.packets++;
2022f7b5d1b9SJamie Gloudon 			u64_stats_update_end(&rp->rx_stats.syncp);
2023f2148a47SJeff Kirsher 		}
2024f2148a47SJeff Kirsher 		entry = (++rp->cur_rx) % RX_RING_SIZE;
2025f2148a47SJeff Kirsher 		rp->rx_head_desc = &rp->rx_ring[entry];
2026f2148a47SJeff Kirsher 	}
2027f2148a47SJeff Kirsher 
2028f2148a47SJeff Kirsher 	/* Refill the Rx ring buffers. */
2029f2148a47SJeff Kirsher 	for (; rp->cur_rx - rp->dirty_rx > 0; rp->dirty_rx++) {
2030f2148a47SJeff Kirsher 		struct sk_buff *skb;
2031f2148a47SJeff Kirsher 		entry = rp->dirty_rx % RX_RING_SIZE;
2032f2148a47SJeff Kirsher 		if (rp->rx_skbuff[entry] == NULL) {
2033f2148a47SJeff Kirsher 			skb = netdev_alloc_skb(dev, rp->rx_buf_sz);
2034f2148a47SJeff Kirsher 			rp->rx_skbuff[entry] = skb;
2035f2148a47SJeff Kirsher 			if (skb == NULL)
2036f2148a47SJeff Kirsher 				break;	/* Better luck next round. */
2037f2148a47SJeff Kirsher 			rp->rx_skbuff_dma[entry] =
2038f7630d18SAlexey Charkov 				dma_map_single(hwdev, skb->data,
2039f2148a47SJeff Kirsher 					       rp->rx_buf_sz,
20404087c4dcSAlexey Charkov 					       DMA_FROM_DEVICE);
2041f7630d18SAlexey Charkov 			if (dma_mapping_error(hwdev,
2042f7630d18SAlexey Charkov 					      rp->rx_skbuff_dma[entry])) {
20439b4fe5fbSNeil Horman 				dev_kfree_skb(skb);
20449b4fe5fbSNeil Horman 				rp->rx_skbuff_dma[entry] = 0;
20459b4fe5fbSNeil Horman 				break;
20469b4fe5fbSNeil Horman 			}
2047f2148a47SJeff Kirsher 			rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]);
2048f2148a47SJeff Kirsher 		}
2049f2148a47SJeff Kirsher 		rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn);
2050f2148a47SJeff Kirsher 	}
2051f2148a47SJeff Kirsher 
2052f2148a47SJeff Kirsher 	return count;
2053f2148a47SJeff Kirsher }
2054f2148a47SJeff Kirsher 
2055f2148a47SJeff Kirsher static void rhine_restart_tx(struct net_device *dev) {
2056f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2057f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
2058f2148a47SJeff Kirsher 	int entry = rp->dirty_tx % TX_RING_SIZE;
2059f2148a47SJeff Kirsher 	u32 intr_status;
2060f2148a47SJeff Kirsher 
2061f2148a47SJeff Kirsher 	/*
2062f2148a47SJeff Kirsher 	 * If new errors occurred, we need to sort them out before doing Tx.
2063f2148a47SJeff Kirsher 	 * In that case the ISR will be back here RSN anyway.
2064f2148a47SJeff Kirsher 	 */
2065a20a28bcSFrancois Romieu 	intr_status = rhine_get_events(rp);
2066f2148a47SJeff Kirsher 
2067f2148a47SJeff Kirsher 	if ((intr_status & IntrTxErrSummary) == 0) {
2068f2148a47SJeff Kirsher 
2069f2148a47SJeff Kirsher 		/* We know better than the chip where it should continue. */
2070f2148a47SJeff Kirsher 		iowrite32(rp->tx_ring_dma + entry * sizeof(struct tx_desc),
2071f2148a47SJeff Kirsher 		       ioaddr + TxRingPtr);
2072f2148a47SJeff Kirsher 
2073f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + ChipCmd) | CmdTxOn,
2074f2148a47SJeff Kirsher 		       ioaddr + ChipCmd);
2075f2148a47SJeff Kirsher 
2076f2148a47SJeff Kirsher 		if (rp->tx_ring[entry].desc_length & cpu_to_le32(0x020000))
2077f2148a47SJeff Kirsher 			/* Tx queues are bits 7-0 (first Tx queue: bit 7) */
2078f2148a47SJeff Kirsher 			BYTE_REG_BITS_ON(1 << 7, ioaddr + TQWake);
2079f2148a47SJeff Kirsher 
2080f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand,
2081f2148a47SJeff Kirsher 		       ioaddr + ChipCmd1);
2082f2148a47SJeff Kirsher 		IOSYNC;
2083f2148a47SJeff Kirsher 	}
2084f2148a47SJeff Kirsher 	else {
2085f2148a47SJeff Kirsher 		/* This should never happen */
2086fc3e0f8aSFrancois Romieu 		netif_warn(rp, tx_err, dev, "another error occurred %08x\n",
2087fc3e0f8aSFrancois Romieu 			   intr_status);
2088f2148a47SJeff Kirsher 	}
2089f2148a47SJeff Kirsher 
2090f2148a47SJeff Kirsher }
2091f2148a47SJeff Kirsher 
20927ab87ff4SFrancois Romieu static void rhine_slow_event_task(struct work_struct *work)
2093f2148a47SJeff Kirsher {
20947ab87ff4SFrancois Romieu 	struct rhine_private *rp =
20957ab87ff4SFrancois Romieu 		container_of(work, struct rhine_private, slow_event_task);
20967ab87ff4SFrancois Romieu 	struct net_device *dev = rp->dev;
20977ab87ff4SFrancois Romieu 	u32 intr_status;
2098f2148a47SJeff Kirsher 
20997ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
21007ab87ff4SFrancois Romieu 
21017ab87ff4SFrancois Romieu 	if (!rp->task_enable)
21027ab87ff4SFrancois Romieu 		goto out_unlock;
21037ab87ff4SFrancois Romieu 
21047ab87ff4SFrancois Romieu 	intr_status = rhine_get_events(rp);
21057ab87ff4SFrancois Romieu 	rhine_ack_events(rp, intr_status & RHINE_EVENT_SLOW);
2106f2148a47SJeff Kirsher 
2107f2148a47SJeff Kirsher 	if (intr_status & IntrLinkChange)
2108f2148a47SJeff Kirsher 		rhine_check_media(dev, 0);
2109f2148a47SJeff Kirsher 
2110fc3e0f8aSFrancois Romieu 	if (intr_status & IntrPCIErr)
2111fc3e0f8aSFrancois Romieu 		netif_warn(rp, hw, dev, "PCI error\n");
2112fc3e0f8aSFrancois Romieu 
2113559bcac3SDavid S. Miller 	iowrite16(RHINE_EVENT & 0xffff, rp->base + IntrEnable);
2114f2148a47SJeff Kirsher 
21157ab87ff4SFrancois Romieu out_unlock:
21167ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
2117f2148a47SJeff Kirsher }
2118f2148a47SJeff Kirsher 
2119f7b5d1b9SJamie Gloudon static struct rtnl_link_stats64 *
2120f7b5d1b9SJamie Gloudon rhine_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
2121f2148a47SJeff Kirsher {
2122f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2123f7b5d1b9SJamie Gloudon 	unsigned int start;
2124f2148a47SJeff Kirsher 
21257ab87ff4SFrancois Romieu 	spin_lock_bh(&rp->lock);
21267ab87ff4SFrancois Romieu 	rhine_update_rx_crc_and_missed_errord(rp);
21277ab87ff4SFrancois Romieu 	spin_unlock_bh(&rp->lock);
2128f2148a47SJeff Kirsher 
2129f7b5d1b9SJamie Gloudon 	netdev_stats_to_stats64(stats, &dev->stats);
2130f7b5d1b9SJamie Gloudon 
2131f7b5d1b9SJamie Gloudon 	do {
213257a7744eSEric W. Biederman 		start = u64_stats_fetch_begin_irq(&rp->rx_stats.syncp);
2133f7b5d1b9SJamie Gloudon 		stats->rx_packets = rp->rx_stats.packets;
2134f7b5d1b9SJamie Gloudon 		stats->rx_bytes = rp->rx_stats.bytes;
213557a7744eSEric W. Biederman 	} while (u64_stats_fetch_retry_irq(&rp->rx_stats.syncp, start));
2136f7b5d1b9SJamie Gloudon 
2137f7b5d1b9SJamie Gloudon 	do {
213857a7744eSEric W. Biederman 		start = u64_stats_fetch_begin_irq(&rp->tx_stats.syncp);
2139f7b5d1b9SJamie Gloudon 		stats->tx_packets = rp->tx_stats.packets;
2140f7b5d1b9SJamie Gloudon 		stats->tx_bytes = rp->tx_stats.bytes;
214157a7744eSEric W. Biederman 	} while (u64_stats_fetch_retry_irq(&rp->tx_stats.syncp, start));
2142f7b5d1b9SJamie Gloudon 
2143f7b5d1b9SJamie Gloudon 	return stats;
2144f2148a47SJeff Kirsher }
2145f2148a47SJeff Kirsher 
2146f2148a47SJeff Kirsher static void rhine_set_rx_mode(struct net_device *dev)
2147f2148a47SJeff Kirsher {
2148f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2149f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
2150f2148a47SJeff Kirsher 	u32 mc_filter[2];	/* Multicast hash filter */
2151f2148a47SJeff Kirsher 	u8 rx_mode = 0x0C;	/* Note: 0x02=accept runt, 0x01=accept errs */
2152f2148a47SJeff Kirsher 	struct netdev_hw_addr *ha;
2153f2148a47SJeff Kirsher 
2154f2148a47SJeff Kirsher 	if (dev->flags & IFF_PROMISC) {		/* Set promiscuous. */
2155f2148a47SJeff Kirsher 		rx_mode = 0x1C;
2156f2148a47SJeff Kirsher 		iowrite32(0xffffffff, ioaddr + MulticastFilter0);
2157f2148a47SJeff Kirsher 		iowrite32(0xffffffff, ioaddr + MulticastFilter1);
2158f2148a47SJeff Kirsher 	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
2159f2148a47SJeff Kirsher 		   (dev->flags & IFF_ALLMULTI)) {
2160f2148a47SJeff Kirsher 		/* Too many to match, or accept all multicasts. */
2161f2148a47SJeff Kirsher 		iowrite32(0xffffffff, ioaddr + MulticastFilter0);
2162f2148a47SJeff Kirsher 		iowrite32(0xffffffff, ioaddr + MulticastFilter1);
2163f7630d18SAlexey Charkov 	} else if (rp->revision >= VT6105M) {
2164f2148a47SJeff Kirsher 		int i = 0;
2165f2148a47SJeff Kirsher 		u32 mCAMmask = 0;	/* 32 mCAMs (6105M and better) */
2166f2148a47SJeff Kirsher 		netdev_for_each_mc_addr(ha, dev) {
2167f2148a47SJeff Kirsher 			if (i == MCAM_SIZE)
2168f2148a47SJeff Kirsher 				break;
2169f2148a47SJeff Kirsher 			rhine_set_cam(ioaddr, i, ha->addr);
2170f2148a47SJeff Kirsher 			mCAMmask |= 1 << i;
2171f2148a47SJeff Kirsher 			i++;
2172f2148a47SJeff Kirsher 		}
2173f2148a47SJeff Kirsher 		rhine_set_cam_mask(ioaddr, mCAMmask);
2174f2148a47SJeff Kirsher 	} else {
2175f2148a47SJeff Kirsher 		memset(mc_filter, 0, sizeof(mc_filter));
2176f2148a47SJeff Kirsher 		netdev_for_each_mc_addr(ha, dev) {
2177f2148a47SJeff Kirsher 			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
2178f2148a47SJeff Kirsher 
2179f2148a47SJeff Kirsher 			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
2180f2148a47SJeff Kirsher 		}
2181f2148a47SJeff Kirsher 		iowrite32(mc_filter[0], ioaddr + MulticastFilter0);
2182f2148a47SJeff Kirsher 		iowrite32(mc_filter[1], ioaddr + MulticastFilter1);
2183f2148a47SJeff Kirsher 	}
2184f2148a47SJeff Kirsher 	/* enable/disable VLAN receive filtering */
2185f7630d18SAlexey Charkov 	if (rp->revision >= VT6105M) {
2186f2148a47SJeff Kirsher 		if (dev->flags & IFF_PROMISC)
2187f2148a47SJeff Kirsher 			BYTE_REG_BITS_OFF(BCR1_VIDFR, ioaddr + PCIBusConfig1);
2188f2148a47SJeff Kirsher 		else
2189f2148a47SJeff Kirsher 			BYTE_REG_BITS_ON(BCR1_VIDFR, ioaddr + PCIBusConfig1);
2190f2148a47SJeff Kirsher 	}
2191f2148a47SJeff Kirsher 	BYTE_REG_BITS_ON(rx_mode, ioaddr + RxConfig);
2192f2148a47SJeff Kirsher }
2193f2148a47SJeff Kirsher 
2194f2148a47SJeff Kirsher static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
2195f2148a47SJeff Kirsher {
2196f7630d18SAlexey Charkov 	struct device *hwdev = dev->dev.parent;
2197f2148a47SJeff Kirsher 
219823020ab3SRick Jones 	strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
219923020ab3SRick Jones 	strlcpy(info->version, DRV_VERSION, sizeof(info->version));
2200f7630d18SAlexey Charkov 	strlcpy(info->bus_info, dev_name(hwdev), sizeof(info->bus_info));
2201f2148a47SJeff Kirsher }
2202f2148a47SJeff Kirsher 
2203f2148a47SJeff Kirsher static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
2204f2148a47SJeff Kirsher {
2205f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2206f2148a47SJeff Kirsher 	int rc;
2207f2148a47SJeff Kirsher 
22087ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
2209f2148a47SJeff Kirsher 	rc = mii_ethtool_gset(&rp->mii_if, cmd);
22107ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
2211f2148a47SJeff Kirsher 
2212f2148a47SJeff Kirsher 	return rc;
2213f2148a47SJeff Kirsher }
2214f2148a47SJeff Kirsher 
2215f2148a47SJeff Kirsher static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
2216f2148a47SJeff Kirsher {
2217f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2218f2148a47SJeff Kirsher 	int rc;
2219f2148a47SJeff Kirsher 
22207ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
2221f2148a47SJeff Kirsher 	rc = mii_ethtool_sset(&rp->mii_if, cmd);
2222f2148a47SJeff Kirsher 	rhine_set_carrier(&rp->mii_if);
22237ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
2224f2148a47SJeff Kirsher 
2225f2148a47SJeff Kirsher 	return rc;
2226f2148a47SJeff Kirsher }
2227f2148a47SJeff Kirsher 
2228f2148a47SJeff Kirsher static int netdev_nway_reset(struct net_device *dev)
2229f2148a47SJeff Kirsher {
2230f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2231f2148a47SJeff Kirsher 
2232f2148a47SJeff Kirsher 	return mii_nway_restart(&rp->mii_if);
2233f2148a47SJeff Kirsher }
2234f2148a47SJeff Kirsher 
2235f2148a47SJeff Kirsher static u32 netdev_get_link(struct net_device *dev)
2236f2148a47SJeff Kirsher {
2237f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2238f2148a47SJeff Kirsher 
2239f2148a47SJeff Kirsher 	return mii_link_ok(&rp->mii_if);
2240f2148a47SJeff Kirsher }
2241f2148a47SJeff Kirsher 
2242f2148a47SJeff Kirsher static u32 netdev_get_msglevel(struct net_device *dev)
2243f2148a47SJeff Kirsher {
2244fc3e0f8aSFrancois Romieu 	struct rhine_private *rp = netdev_priv(dev);
2245fc3e0f8aSFrancois Romieu 
2246fc3e0f8aSFrancois Romieu 	return rp->msg_enable;
2247f2148a47SJeff Kirsher }
2248f2148a47SJeff Kirsher 
2249f2148a47SJeff Kirsher static void netdev_set_msglevel(struct net_device *dev, u32 value)
2250f2148a47SJeff Kirsher {
2251fc3e0f8aSFrancois Romieu 	struct rhine_private *rp = netdev_priv(dev);
2252fc3e0f8aSFrancois Romieu 
2253fc3e0f8aSFrancois Romieu 	rp->msg_enable = value;
2254f2148a47SJeff Kirsher }
2255f2148a47SJeff Kirsher 
2256f2148a47SJeff Kirsher static void rhine_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2257f2148a47SJeff Kirsher {
2258f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2259f2148a47SJeff Kirsher 
2260f2148a47SJeff Kirsher 	if (!(rp->quirks & rqWOL))
2261f2148a47SJeff Kirsher 		return;
2262f2148a47SJeff Kirsher 
2263f2148a47SJeff Kirsher 	spin_lock_irq(&rp->lock);
2264f2148a47SJeff Kirsher 	wol->supported = WAKE_PHY | WAKE_MAGIC |
2265f2148a47SJeff Kirsher 			 WAKE_UCAST | WAKE_MCAST | WAKE_BCAST;	/* Untested */
2266f2148a47SJeff Kirsher 	wol->wolopts = rp->wolopts;
2267f2148a47SJeff Kirsher 	spin_unlock_irq(&rp->lock);
2268f2148a47SJeff Kirsher }
2269f2148a47SJeff Kirsher 
2270f2148a47SJeff Kirsher static int rhine_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2271f2148a47SJeff Kirsher {
2272f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2273f2148a47SJeff Kirsher 	u32 support = WAKE_PHY | WAKE_MAGIC |
2274f2148a47SJeff Kirsher 		      WAKE_UCAST | WAKE_MCAST | WAKE_BCAST;	/* Untested */
2275f2148a47SJeff Kirsher 
2276f2148a47SJeff Kirsher 	if (!(rp->quirks & rqWOL))
2277f2148a47SJeff Kirsher 		return -EINVAL;
2278f2148a47SJeff Kirsher 
2279f2148a47SJeff Kirsher 	if (wol->wolopts & ~support)
2280f2148a47SJeff Kirsher 		return -EINVAL;
2281f2148a47SJeff Kirsher 
2282f2148a47SJeff Kirsher 	spin_lock_irq(&rp->lock);
2283f2148a47SJeff Kirsher 	rp->wolopts = wol->wolopts;
2284f2148a47SJeff Kirsher 	spin_unlock_irq(&rp->lock);
2285f2148a47SJeff Kirsher 
2286f2148a47SJeff Kirsher 	return 0;
2287f2148a47SJeff Kirsher }
2288f2148a47SJeff Kirsher 
2289f2148a47SJeff Kirsher static const struct ethtool_ops netdev_ethtool_ops = {
2290f2148a47SJeff Kirsher 	.get_drvinfo		= netdev_get_drvinfo,
2291f2148a47SJeff Kirsher 	.get_settings		= netdev_get_settings,
2292f2148a47SJeff Kirsher 	.set_settings		= netdev_set_settings,
2293f2148a47SJeff Kirsher 	.nway_reset		= netdev_nway_reset,
2294f2148a47SJeff Kirsher 	.get_link		= netdev_get_link,
2295f2148a47SJeff Kirsher 	.get_msglevel		= netdev_get_msglevel,
2296f2148a47SJeff Kirsher 	.set_msglevel		= netdev_set_msglevel,
2297f2148a47SJeff Kirsher 	.get_wol		= rhine_get_wol,
2298f2148a47SJeff Kirsher 	.set_wol		= rhine_set_wol,
2299f2148a47SJeff Kirsher };
2300f2148a47SJeff Kirsher 
2301f2148a47SJeff Kirsher static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2302f2148a47SJeff Kirsher {
2303f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2304f2148a47SJeff Kirsher 	int rc;
2305f2148a47SJeff Kirsher 
2306f2148a47SJeff Kirsher 	if (!netif_running(dev))
2307f2148a47SJeff Kirsher 		return -EINVAL;
2308f2148a47SJeff Kirsher 
23097ab87ff4SFrancois Romieu 	mutex_lock(&rp->task_lock);
2310f2148a47SJeff Kirsher 	rc = generic_mii_ioctl(&rp->mii_if, if_mii(rq), cmd, NULL);
2311f2148a47SJeff Kirsher 	rhine_set_carrier(&rp->mii_if);
23127ab87ff4SFrancois Romieu 	mutex_unlock(&rp->task_lock);
2313f2148a47SJeff Kirsher 
2314f2148a47SJeff Kirsher 	return rc;
2315f2148a47SJeff Kirsher }
2316f2148a47SJeff Kirsher 
2317f2148a47SJeff Kirsher static int rhine_close(struct net_device *dev)
2318f2148a47SJeff Kirsher {
2319f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2320f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
2321f2148a47SJeff Kirsher 
23227ab87ff4SFrancois Romieu 	rhine_task_disable(rp);
2323f2148a47SJeff Kirsher 	napi_disable(&rp->napi);
2324f2148a47SJeff Kirsher 	netif_stop_queue(dev);
2325f2148a47SJeff Kirsher 
2326fc3e0f8aSFrancois Romieu 	netif_dbg(rp, ifdown, dev, "Shutting down ethercard, status was %04x\n",
2327f2148a47SJeff Kirsher 		  ioread16(ioaddr + ChipCmd));
2328f2148a47SJeff Kirsher 
2329f2148a47SJeff Kirsher 	/* Switch to loopback mode to avoid hardware races. */
2330f2148a47SJeff Kirsher 	iowrite8(rp->tx_thresh | 0x02, ioaddr + TxConfig);
2331f2148a47SJeff Kirsher 
23327ab87ff4SFrancois Romieu 	rhine_irq_disable(rp);
2333f2148a47SJeff Kirsher 
2334f2148a47SJeff Kirsher 	/* Stop the chip's Tx and Rx processes. */
2335f2148a47SJeff Kirsher 	iowrite16(CmdStop, ioaddr + ChipCmd);
2336f2148a47SJeff Kirsher 
2337f7630d18SAlexey Charkov 	free_irq(rp->irq, dev);
2338f2148a47SJeff Kirsher 	free_rbufs(dev);
2339f2148a47SJeff Kirsher 	free_tbufs(dev);
2340f2148a47SJeff Kirsher 	free_ring(dev);
2341f2148a47SJeff Kirsher 
2342f2148a47SJeff Kirsher 	return 0;
2343f2148a47SJeff Kirsher }
2344f2148a47SJeff Kirsher 
2345f2148a47SJeff Kirsher 
2346*2d283862SAlexey Charkov static void rhine_remove_one_pci(struct pci_dev *pdev)
2347f2148a47SJeff Kirsher {
2348f2148a47SJeff Kirsher 	struct net_device *dev = pci_get_drvdata(pdev);
2349f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2350f2148a47SJeff Kirsher 
2351f2148a47SJeff Kirsher 	unregister_netdev(dev);
2352f2148a47SJeff Kirsher 
2353f2148a47SJeff Kirsher 	pci_iounmap(pdev, rp->base);
2354f2148a47SJeff Kirsher 	pci_release_regions(pdev);
2355f2148a47SJeff Kirsher 
2356f2148a47SJeff Kirsher 	free_netdev(dev);
2357f2148a47SJeff Kirsher 	pci_disable_device(pdev);
2358f2148a47SJeff Kirsher }
2359f2148a47SJeff Kirsher 
2360*2d283862SAlexey Charkov static int rhine_remove_one_platform(struct platform_device *pdev)
2361*2d283862SAlexey Charkov {
2362*2d283862SAlexey Charkov 	struct net_device *dev = platform_get_drvdata(pdev);
2363*2d283862SAlexey Charkov 	struct rhine_private *rp = netdev_priv(dev);
2364*2d283862SAlexey Charkov 
2365*2d283862SAlexey Charkov 	unregister_netdev(dev);
2366*2d283862SAlexey Charkov 
2367*2d283862SAlexey Charkov 	iounmap(rp->base);
2368*2d283862SAlexey Charkov 
2369*2d283862SAlexey Charkov 	free_netdev(dev);
2370*2d283862SAlexey Charkov 
2371*2d283862SAlexey Charkov 	return 0;
2372*2d283862SAlexey Charkov }
2373*2d283862SAlexey Charkov 
2374*2d283862SAlexey Charkov static void rhine_shutdown_pci(struct pci_dev *pdev)
2375f2148a47SJeff Kirsher {
2376f2148a47SJeff Kirsher 	struct net_device *dev = pci_get_drvdata(pdev);
2377f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2378f2148a47SJeff Kirsher 	void __iomem *ioaddr = rp->base;
2379f2148a47SJeff Kirsher 
2380f2148a47SJeff Kirsher 	if (!(rp->quirks & rqWOL))
2381f2148a47SJeff Kirsher 		return; /* Nothing to do for non-WOL adapters */
2382f2148a47SJeff Kirsher 
2383f2148a47SJeff Kirsher 	rhine_power_init(dev);
2384f2148a47SJeff Kirsher 
2385f2148a47SJeff Kirsher 	/* Make sure we use pattern 0, 1 and not 4, 5 */
2386f2148a47SJeff Kirsher 	if (rp->quirks & rq6patterns)
2387f2148a47SJeff Kirsher 		iowrite8(0x04, ioaddr + WOLcgClr);
2388f2148a47SJeff Kirsher 
23897ab87ff4SFrancois Romieu 	spin_lock(&rp->lock);
23907ab87ff4SFrancois Romieu 
2391f2148a47SJeff Kirsher 	if (rp->wolopts & WAKE_MAGIC) {
2392f2148a47SJeff Kirsher 		iowrite8(WOLmagic, ioaddr + WOLcrSet);
2393f2148a47SJeff Kirsher 		/*
2394f2148a47SJeff Kirsher 		 * Turn EEPROM-controlled wake-up back on -- some hardware may
2395f2148a47SJeff Kirsher 		 * not cooperate otherwise.
2396f2148a47SJeff Kirsher 		 */
2397f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + ConfigA) | 0x03, ioaddr + ConfigA);
2398f2148a47SJeff Kirsher 	}
2399f2148a47SJeff Kirsher 
2400f2148a47SJeff Kirsher 	if (rp->wolopts & (WAKE_BCAST|WAKE_MCAST))
2401f2148a47SJeff Kirsher 		iowrite8(WOLbmcast, ioaddr + WOLcgSet);
2402f2148a47SJeff Kirsher 
2403f2148a47SJeff Kirsher 	if (rp->wolopts & WAKE_PHY)
2404f2148a47SJeff Kirsher 		iowrite8(WOLlnkon | WOLlnkoff, ioaddr + WOLcrSet);
2405f2148a47SJeff Kirsher 
2406f2148a47SJeff Kirsher 	if (rp->wolopts & WAKE_UCAST)
2407f2148a47SJeff Kirsher 		iowrite8(WOLucast, ioaddr + WOLcrSet);
2408f2148a47SJeff Kirsher 
2409f2148a47SJeff Kirsher 	if (rp->wolopts) {
2410f2148a47SJeff Kirsher 		/* Enable legacy WOL (for old motherboards) */
2411f2148a47SJeff Kirsher 		iowrite8(0x01, ioaddr + PwcfgSet);
2412f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + StickyHW) | 0x04, ioaddr + StickyHW);
2413f2148a47SJeff Kirsher 	}
2414f2148a47SJeff Kirsher 
24157ab87ff4SFrancois Romieu 	spin_unlock(&rp->lock);
24167ab87ff4SFrancois Romieu 
2417e92b9b3bSFrancois Romieu 	if (system_state == SYSTEM_POWER_OFF && !avoid_D3) {
2418f2148a47SJeff Kirsher 		iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW);
2419f2148a47SJeff Kirsher 
2420e92b9b3bSFrancois Romieu 		pci_wake_from_d3(pdev, true);
2421e92b9b3bSFrancois Romieu 		pci_set_power_state(pdev, PCI_D3hot);
2422e92b9b3bSFrancois Romieu 	}
2423f2148a47SJeff Kirsher }
2424f2148a47SJeff Kirsher 
2425e92b9b3bSFrancois Romieu #ifdef CONFIG_PM_SLEEP
2426e92b9b3bSFrancois Romieu static int rhine_suspend(struct device *device)
2427f2148a47SJeff Kirsher {
2428f7630d18SAlexey Charkov 	struct net_device *dev = dev_get_drvdata(device);
2429f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2430f2148a47SJeff Kirsher 
2431f2148a47SJeff Kirsher 	if (!netif_running(dev))
2432f2148a47SJeff Kirsher 		return 0;
2433f2148a47SJeff Kirsher 
24347ab87ff4SFrancois Romieu 	rhine_task_disable(rp);
24357ab87ff4SFrancois Romieu 	rhine_irq_disable(rp);
2436f2148a47SJeff Kirsher 	napi_disable(&rp->napi);
2437f2148a47SJeff Kirsher 
2438f2148a47SJeff Kirsher 	netif_device_detach(dev);
2439f2148a47SJeff Kirsher 
2440f7630d18SAlexey Charkov 	if (dev_is_pci(device))
2441*2d283862SAlexey Charkov 		rhine_shutdown_pci(to_pci_dev(device));
2442f2148a47SJeff Kirsher 
2443f2148a47SJeff Kirsher 	return 0;
2444f2148a47SJeff Kirsher }
2445f2148a47SJeff Kirsher 
2446e92b9b3bSFrancois Romieu static int rhine_resume(struct device *device)
2447f2148a47SJeff Kirsher {
2448f7630d18SAlexey Charkov 	struct net_device *dev = dev_get_drvdata(device);
2449f2148a47SJeff Kirsher 	struct rhine_private *rp = netdev_priv(dev);
2450f2148a47SJeff Kirsher 
2451f2148a47SJeff Kirsher 	if (!netif_running(dev))
2452f2148a47SJeff Kirsher 		return 0;
2453f2148a47SJeff Kirsher 
2454f2148a47SJeff Kirsher #ifdef USE_MMIO
2455f2148a47SJeff Kirsher 	enable_mmio(rp->pioaddr, rp->quirks);
2456f2148a47SJeff Kirsher #endif
2457f2148a47SJeff Kirsher 	rhine_power_init(dev);
2458f2148a47SJeff Kirsher 	free_tbufs(dev);
2459f2148a47SJeff Kirsher 	free_rbufs(dev);
2460f2148a47SJeff Kirsher 	alloc_tbufs(dev);
2461f2148a47SJeff Kirsher 	alloc_rbufs(dev);
24627ab87ff4SFrancois Romieu 	rhine_task_enable(rp);
24637ab87ff4SFrancois Romieu 	spin_lock_bh(&rp->lock);
2464f2148a47SJeff Kirsher 	init_registers(dev);
24657ab87ff4SFrancois Romieu 	spin_unlock_bh(&rp->lock);
2466f2148a47SJeff Kirsher 
2467f2148a47SJeff Kirsher 	netif_device_attach(dev);
2468f2148a47SJeff Kirsher 
2469f2148a47SJeff Kirsher 	return 0;
2470f2148a47SJeff Kirsher }
2471e92b9b3bSFrancois Romieu 
2472e92b9b3bSFrancois Romieu static SIMPLE_DEV_PM_OPS(rhine_pm_ops, rhine_suspend, rhine_resume);
2473e92b9b3bSFrancois Romieu #define RHINE_PM_OPS	(&rhine_pm_ops)
2474e92b9b3bSFrancois Romieu 
2475e92b9b3bSFrancois Romieu #else
2476e92b9b3bSFrancois Romieu 
2477e92b9b3bSFrancois Romieu #define RHINE_PM_OPS	NULL
2478e92b9b3bSFrancois Romieu 
2479e92b9b3bSFrancois Romieu #endif /* !CONFIG_PM_SLEEP */
2480f2148a47SJeff Kirsher 
2481*2d283862SAlexey Charkov static struct pci_driver rhine_driver_pci = {
2482f2148a47SJeff Kirsher 	.name		= DRV_NAME,
2483f2148a47SJeff Kirsher 	.id_table	= rhine_pci_tbl,
2484*2d283862SAlexey Charkov 	.probe		= rhine_init_one_pci,
2485*2d283862SAlexey Charkov 	.remove		= rhine_remove_one_pci,
2486*2d283862SAlexey Charkov 	.shutdown	= rhine_shutdown_pci,
2487e92b9b3bSFrancois Romieu 	.driver.pm	= RHINE_PM_OPS,
2488f2148a47SJeff Kirsher };
2489f2148a47SJeff Kirsher 
2490*2d283862SAlexey Charkov static struct platform_driver rhine_driver_platform = {
2491*2d283862SAlexey Charkov 	.probe		= rhine_init_one_platform,
2492*2d283862SAlexey Charkov 	.remove		= rhine_remove_one_platform,
2493*2d283862SAlexey Charkov 	.driver = {
2494*2d283862SAlexey Charkov 		.name	= DRV_NAME,
2495*2d283862SAlexey Charkov 		.owner	= THIS_MODULE,
2496*2d283862SAlexey Charkov 		.of_match_table	= rhine_of_tbl,
2497*2d283862SAlexey Charkov 		.pm		= RHINE_PM_OPS,
2498*2d283862SAlexey Charkov 	}
2499*2d283862SAlexey Charkov };
2500*2d283862SAlexey Charkov 
250177273eaaSSachin Kamat static struct dmi_system_id rhine_dmi_table[] __initdata = {
2502f2148a47SJeff Kirsher 	{
2503f2148a47SJeff Kirsher 		.ident = "EPIA-M",
2504f2148a47SJeff Kirsher 		.matches = {
2505f2148a47SJeff Kirsher 			DMI_MATCH(DMI_BIOS_VENDOR, "Award Software International, Inc."),
2506f2148a47SJeff Kirsher 			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
2507f2148a47SJeff Kirsher 		},
2508f2148a47SJeff Kirsher 	},
2509f2148a47SJeff Kirsher 	{
2510f2148a47SJeff Kirsher 		.ident = "KV7",
2511f2148a47SJeff Kirsher 		.matches = {
2512f2148a47SJeff Kirsher 			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
2513f2148a47SJeff Kirsher 			DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
2514f2148a47SJeff Kirsher 		},
2515f2148a47SJeff Kirsher 	},
2516f2148a47SJeff Kirsher 	{ NULL }
2517f2148a47SJeff Kirsher };
2518f2148a47SJeff Kirsher 
2519f2148a47SJeff Kirsher static int __init rhine_init(void)
2520f2148a47SJeff Kirsher {
2521*2d283862SAlexey Charkov 	int ret_pci, ret_platform;
2522*2d283862SAlexey Charkov 
2523f2148a47SJeff Kirsher /* when a module, this is printed whether or not devices are found in probe */
2524f2148a47SJeff Kirsher #ifdef MODULE
2525f2148a47SJeff Kirsher 	pr_info("%s\n", version);
2526f2148a47SJeff Kirsher #endif
2527f2148a47SJeff Kirsher 	if (dmi_check_system(rhine_dmi_table)) {
2528f2148a47SJeff Kirsher 		/* these BIOSes fail at PXE boot if chip is in D3 */
2529eb939922SRusty Russell 		avoid_D3 = true;
2530f2148a47SJeff Kirsher 		pr_warn("Broken BIOS detected, avoid_D3 enabled\n");
2531f2148a47SJeff Kirsher 	}
2532f2148a47SJeff Kirsher 	else if (avoid_D3)
2533f2148a47SJeff Kirsher 		pr_info("avoid_D3 set\n");
2534f2148a47SJeff Kirsher 
2535*2d283862SAlexey Charkov 	ret_pci = pci_register_driver(&rhine_driver_pci);
2536*2d283862SAlexey Charkov 	ret_platform = platform_driver_register(&rhine_driver_platform);
2537*2d283862SAlexey Charkov 	if ((ret_pci < 0) && (ret_platform < 0))
2538*2d283862SAlexey Charkov 		return ret_pci;
2539*2d283862SAlexey Charkov 
2540*2d283862SAlexey Charkov 	return 0;
2541f2148a47SJeff Kirsher }
2542f2148a47SJeff Kirsher 
2543f2148a47SJeff Kirsher 
2544f2148a47SJeff Kirsher static void __exit rhine_cleanup(void)
2545f2148a47SJeff Kirsher {
2546*2d283862SAlexey Charkov 	platform_driver_unregister(&rhine_driver_platform);
2547*2d283862SAlexey Charkov 	pci_unregister_driver(&rhine_driver_pci);
2548f2148a47SJeff Kirsher }
2549f2148a47SJeff Kirsher 
2550f2148a47SJeff Kirsher 
2551f2148a47SJeff Kirsher module_init(rhine_init);
2552f2148a47SJeff Kirsher module_exit(rhine_cleanup);
2553