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> 97f2148a47SJeff Kirsher #include <linux/dma-mapping.h> 98f2148a47SJeff Kirsher #include <linux/netdevice.h> 99f2148a47SJeff Kirsher #include <linux/etherdevice.h> 100f2148a47SJeff Kirsher #include <linux/skbuff.h> 101f2148a47SJeff Kirsher #include <linux/init.h> 102f2148a47SJeff Kirsher #include <linux/delay.h> 103f2148a47SJeff Kirsher #include <linux/mii.h> 104f2148a47SJeff Kirsher #include <linux/ethtool.h> 105f2148a47SJeff Kirsher #include <linux/crc32.h> 106f2148a47SJeff Kirsher #include <linux/if_vlan.h> 107f2148a47SJeff Kirsher #include <linux/bitops.h> 108f2148a47SJeff Kirsher #include <linux/workqueue.h> 109f2148a47SJeff Kirsher #include <asm/processor.h> /* Processor type for cache alignment. */ 110f2148a47SJeff Kirsher #include <asm/io.h> 111f2148a47SJeff Kirsher #include <asm/irq.h> 112f2148a47SJeff Kirsher #include <asm/uaccess.h> 113f2148a47SJeff Kirsher #include <linux/dmi.h> 114f2148a47SJeff Kirsher 115f2148a47SJeff Kirsher /* These identify the driver base version and may not be removed. */ 11676e239e1SBill Pemberton static const char version[] = 117f2148a47SJeff Kirsher "v1.10-LK" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker"; 118f2148a47SJeff Kirsher 119f2148a47SJeff Kirsher /* This driver was written to use PCI memory space. Some early versions 120f2148a47SJeff Kirsher of the Rhine may only work correctly with I/O space accesses. */ 121f2148a47SJeff Kirsher #ifdef CONFIG_VIA_RHINE_MMIO 122f2148a47SJeff Kirsher #define USE_MMIO 123f2148a47SJeff Kirsher #else 124f2148a47SJeff Kirsher #endif 125f2148a47SJeff Kirsher 126f2148a47SJeff Kirsher MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); 127f2148a47SJeff Kirsher MODULE_DESCRIPTION("VIA Rhine PCI Fast Ethernet driver"); 128f2148a47SJeff Kirsher MODULE_LICENSE("GPL"); 129f2148a47SJeff Kirsher 130f2148a47SJeff Kirsher module_param(debug, int, 0); 131f2148a47SJeff Kirsher module_param(rx_copybreak, int, 0); 132f2148a47SJeff Kirsher module_param(avoid_D3, bool, 0); 133fc3e0f8aSFrancois Romieu MODULE_PARM_DESC(debug, "VIA Rhine debug message flags"); 134f2148a47SJeff Kirsher MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); 135f2148a47SJeff Kirsher MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)"); 136f2148a47SJeff Kirsher 137f2148a47SJeff Kirsher #define MCAM_SIZE 32 138f2148a47SJeff Kirsher #define VCAM_SIZE 32 139f2148a47SJeff Kirsher 140f2148a47SJeff Kirsher /* 141f2148a47SJeff Kirsher Theory of Operation 142f2148a47SJeff Kirsher 143f2148a47SJeff Kirsher I. Board Compatibility 144f2148a47SJeff Kirsher 145f2148a47SJeff Kirsher This driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet 146f2148a47SJeff Kirsher controller. 147f2148a47SJeff Kirsher 148f2148a47SJeff Kirsher II. Board-specific settings 149f2148a47SJeff Kirsher 150f2148a47SJeff Kirsher Boards with this chip are functional only in a bus-master PCI slot. 151f2148a47SJeff Kirsher 152f2148a47SJeff Kirsher Many operational settings are loaded from the EEPROM to the Config word at 153f2148a47SJeff Kirsher offset 0x78. For most of these settings, this driver assumes that they are 154f2148a47SJeff Kirsher correct. 155f2148a47SJeff Kirsher If this driver is compiled to use PCI memory space operations the EEPROM 156f2148a47SJeff Kirsher must be configured to enable memory ops. 157f2148a47SJeff Kirsher 158f2148a47SJeff Kirsher III. Driver operation 159f2148a47SJeff Kirsher 160f2148a47SJeff Kirsher IIIa. Ring buffers 161f2148a47SJeff Kirsher 162f2148a47SJeff Kirsher This driver uses two statically allocated fixed-size descriptor lists 163f2148a47SJeff Kirsher formed into rings by a branch from the final descriptor to the beginning of 164f2148a47SJeff Kirsher the list. The ring sizes are set at compile time by RX/TX_RING_SIZE. 165f2148a47SJeff Kirsher 166f2148a47SJeff Kirsher IIIb/c. Transmit/Receive Structure 167f2148a47SJeff Kirsher 168f2148a47SJeff Kirsher This driver attempts to use a zero-copy receive and transmit scheme. 169f2148a47SJeff Kirsher 170f2148a47SJeff Kirsher Alas, all data buffers are required to start on a 32 bit boundary, so 171f2148a47SJeff Kirsher the driver must often copy transmit packets into bounce buffers. 172f2148a47SJeff Kirsher 173f2148a47SJeff Kirsher The driver allocates full frame size skbuffs for the Rx ring buffers at 174f2148a47SJeff Kirsher open() time and passes the skb->data field to the chip as receive data 175f2148a47SJeff Kirsher buffers. When an incoming frame is less than RX_COPYBREAK bytes long, 176f2148a47SJeff Kirsher a fresh skbuff is allocated and the frame is copied to the new skbuff. 177f2148a47SJeff Kirsher When the incoming frame is larger, the skbuff is passed directly up the 178f2148a47SJeff Kirsher protocol stack. Buffers consumed this way are replaced by newly allocated 179f2148a47SJeff Kirsher skbuffs in the last phase of rhine_rx(). 180f2148a47SJeff Kirsher 181f2148a47SJeff Kirsher The RX_COPYBREAK value is chosen to trade-off the memory wasted by 182f2148a47SJeff Kirsher using a full-sized skbuff for small frames vs. the copying costs of larger 183f2148a47SJeff Kirsher frames. New boards are typically used in generously configured machines 184f2148a47SJeff Kirsher and the underfilled buffers have negligible impact compared to the benefit of 185f2148a47SJeff Kirsher a single allocation size, so the default value of zero results in never 186f2148a47SJeff Kirsher copying packets. When copying is done, the cost is usually mitigated by using 187f2148a47SJeff Kirsher a combined copy/checksum routine. Copying also preloads the cache, which is 188f2148a47SJeff Kirsher most useful with small frames. 189f2148a47SJeff Kirsher 190f2148a47SJeff Kirsher Since the VIA chips are only able to transfer data to buffers on 32 bit 191f2148a47SJeff Kirsher boundaries, the IP header at offset 14 in an ethernet frame isn't 192f2148a47SJeff Kirsher longword aligned for further processing. Copying these unaligned buffers 193f2148a47SJeff Kirsher has the beneficial effect of 16-byte aligning the IP header. 194f2148a47SJeff Kirsher 195f2148a47SJeff Kirsher IIId. Synchronization 196f2148a47SJeff Kirsher 197f2148a47SJeff Kirsher The driver runs as two independent, single-threaded flows of control. One 198f2148a47SJeff Kirsher is the send-packet routine, which enforces single-threaded use by the 199f2148a47SJeff Kirsher netdev_priv(dev)->lock spinlock. The other thread is the interrupt handler, 200f2148a47SJeff Kirsher which is single threaded by the hardware and interrupt handling software. 201f2148a47SJeff Kirsher 202f2148a47SJeff Kirsher The send packet thread has partial control over the Tx ring. It locks the 203f2148a47SJeff Kirsher netdev_priv(dev)->lock whenever it's queuing a Tx packet. If the next slot in 204f2148a47SJeff Kirsher the ring is not available it stops the transmit queue by 205f2148a47SJeff Kirsher calling netif_stop_queue. 206f2148a47SJeff Kirsher 207f2148a47SJeff Kirsher The interrupt handler has exclusive control over the Rx ring and records stats 208f2148a47SJeff Kirsher from the Tx ring. After reaping the stats, it marks the Tx queue entry as 209f2148a47SJeff Kirsher empty by incrementing the dirty_tx mark. If at least half of the entries in 210f2148a47SJeff Kirsher the Rx ring are available the transmit queue is woken up if it was stopped. 211f2148a47SJeff Kirsher 212f2148a47SJeff Kirsher IV. Notes 213f2148a47SJeff Kirsher 214f2148a47SJeff Kirsher IVb. References 215f2148a47SJeff Kirsher 216f2148a47SJeff Kirsher Preliminary VT86C100A manual from http://www.via.com.tw/ 217f2148a47SJeff Kirsher http://www.scyld.com/expert/100mbps.html 218f2148a47SJeff Kirsher http://www.scyld.com/expert/NWay.html 219f2148a47SJeff Kirsher ftp://ftp.via.com.tw/public/lan/Products/NIC/VT86C100A/Datasheet/VT86C100A03.pdf 220f2148a47SJeff Kirsher ftp://ftp.via.com.tw/public/lan/Products/NIC/VT6102/Datasheet/VT6102_021.PDF 221f2148a47SJeff Kirsher 222f2148a47SJeff Kirsher 223f2148a47SJeff Kirsher IVc. Errata 224f2148a47SJeff Kirsher 225f2148a47SJeff Kirsher The VT86C100A manual is not reliable information. 226f2148a47SJeff Kirsher The 3043 chip does not handle unaligned transmit or receive buffers, resulting 227f2148a47SJeff Kirsher in significant performance degradation for bounce buffer copies on transmit 228f2148a47SJeff Kirsher and unaligned IP headers on receive. 229f2148a47SJeff Kirsher The chip does not pad to minimum transmit length. 230f2148a47SJeff Kirsher 231f2148a47SJeff Kirsher */ 232f2148a47SJeff Kirsher 233f2148a47SJeff Kirsher 234f2148a47SJeff Kirsher /* This table drives the PCI probe routines. It's mostly boilerplate in all 235f2148a47SJeff Kirsher of the drivers, and will likely be provided by some future kernel. 236f2148a47SJeff Kirsher Note the matching code -- the first table entry matchs all 56** cards but 237f2148a47SJeff Kirsher second only the 1234 card. 238f2148a47SJeff Kirsher */ 239f2148a47SJeff Kirsher 240f2148a47SJeff Kirsher enum rhine_revs { 241f2148a47SJeff Kirsher VT86C100A = 0x00, 242f2148a47SJeff Kirsher VTunknown0 = 0x20, 243f2148a47SJeff Kirsher VT6102 = 0x40, 244f2148a47SJeff Kirsher VT8231 = 0x50, /* Integrated MAC */ 245f2148a47SJeff Kirsher VT8233 = 0x60, /* Integrated MAC */ 246f2148a47SJeff Kirsher VT8235 = 0x74, /* Integrated MAC */ 247f2148a47SJeff Kirsher VT8237 = 0x78, /* Integrated MAC */ 248f2148a47SJeff Kirsher VTunknown1 = 0x7C, 249f2148a47SJeff Kirsher VT6105 = 0x80, 250f2148a47SJeff Kirsher VT6105_B0 = 0x83, 251f2148a47SJeff Kirsher VT6105L = 0x8A, 252f2148a47SJeff Kirsher VT6107 = 0x8C, 253f2148a47SJeff Kirsher VTunknown2 = 0x8E, 254f2148a47SJeff Kirsher VT6105M = 0x90, /* Management adapter */ 255f2148a47SJeff Kirsher }; 256f2148a47SJeff Kirsher 257f2148a47SJeff Kirsher enum rhine_quirks { 258f2148a47SJeff Kirsher rqWOL = 0x0001, /* Wake-On-LAN support */ 259f2148a47SJeff Kirsher rqForceReset = 0x0002, 260f2148a47SJeff Kirsher rq6patterns = 0x0040, /* 6 instead of 4 patterns for WOL */ 261f2148a47SJeff Kirsher rqStatusWBRace = 0x0080, /* Tx Status Writeback Error possible */ 262f2148a47SJeff Kirsher rqRhineI = 0x0100, /* See comment below */ 263f2148a47SJeff Kirsher }; 264f2148a47SJeff Kirsher /* 265f2148a47SJeff Kirsher * rqRhineI: VT86C100A (aka Rhine-I) uses different bits to enable 266f2148a47SJeff Kirsher * MMIO as well as for the collision counter and the Tx FIFO underflow 267f2148a47SJeff Kirsher * indicator. In addition, Tx and Rx buffers need to 4 byte aligned. 268f2148a47SJeff Kirsher */ 269f2148a47SJeff Kirsher 270f2148a47SJeff Kirsher /* Beware of PCI posted writes */ 271f2148a47SJeff Kirsher #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) 272f2148a47SJeff Kirsher 273f2148a47SJeff Kirsher static DEFINE_PCI_DEVICE_TABLE(rhine_pci_tbl) = { 274f2148a47SJeff Kirsher { 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, }, /* VT86C100A */ 275f2148a47SJeff Kirsher { 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6102 */ 276f2148a47SJeff Kirsher { 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, }, /* 6105{,L,LOM} */ 277f2148a47SJeff Kirsher { 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6105M */ 278f2148a47SJeff Kirsher { } /* terminate list */ 279f2148a47SJeff Kirsher }; 280f2148a47SJeff Kirsher MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); 281f2148a47SJeff Kirsher 282f2148a47SJeff Kirsher 283f2148a47SJeff Kirsher /* Offsets to the device registers. */ 284f2148a47SJeff Kirsher enum register_offsets { 285f2148a47SJeff Kirsher StationAddr=0x00, RxConfig=0x06, TxConfig=0x07, ChipCmd=0x08, 286f2148a47SJeff Kirsher ChipCmd1=0x09, TQWake=0x0A, 287f2148a47SJeff Kirsher IntrStatus=0x0C, IntrEnable=0x0E, 288f2148a47SJeff Kirsher MulticastFilter0=0x10, MulticastFilter1=0x14, 289f2148a47SJeff Kirsher RxRingPtr=0x18, TxRingPtr=0x1C, GFIFOTest=0x54, 290f2148a47SJeff Kirsher MIIPhyAddr=0x6C, MIIStatus=0x6D, PCIBusConfig=0x6E, PCIBusConfig1=0x6F, 291f2148a47SJeff Kirsher MIICmd=0x70, MIIRegAddr=0x71, MIIData=0x72, MACRegEEcsr=0x74, 292f2148a47SJeff Kirsher ConfigA=0x78, ConfigB=0x79, ConfigC=0x7A, ConfigD=0x7B, 293f2148a47SJeff Kirsher RxMissed=0x7C, RxCRCErrs=0x7E, MiscCmd=0x81, 294f2148a47SJeff Kirsher StickyHW=0x83, IntrStatus2=0x84, 295f2148a47SJeff Kirsher CamMask=0x88, CamCon=0x92, CamAddr=0x93, 296f2148a47SJeff Kirsher WOLcrSet=0xA0, PwcfgSet=0xA1, WOLcgSet=0xA3, WOLcrClr=0xA4, 297f2148a47SJeff Kirsher WOLcrClr1=0xA6, WOLcgClr=0xA7, 298f2148a47SJeff Kirsher PwrcsrSet=0xA8, PwrcsrSet1=0xA9, PwrcsrClr=0xAC, PwrcsrClr1=0xAD, 299f2148a47SJeff Kirsher }; 300f2148a47SJeff Kirsher 301f2148a47SJeff Kirsher /* Bits in ConfigD */ 302f2148a47SJeff Kirsher enum backoff_bits { 303f2148a47SJeff Kirsher BackOptional=0x01, BackModify=0x02, 304f2148a47SJeff Kirsher BackCaptureEffect=0x04, BackRandom=0x08 305f2148a47SJeff Kirsher }; 306f2148a47SJeff Kirsher 307f2148a47SJeff Kirsher /* Bits in the TxConfig (TCR) register */ 308f2148a47SJeff Kirsher enum tcr_bits { 309f2148a47SJeff Kirsher TCR_PQEN=0x01, 310f2148a47SJeff Kirsher TCR_LB0=0x02, /* loopback[0] */ 311f2148a47SJeff Kirsher TCR_LB1=0x04, /* loopback[1] */ 312f2148a47SJeff Kirsher TCR_OFSET=0x08, 313f2148a47SJeff Kirsher TCR_RTGOPT=0x10, 314f2148a47SJeff Kirsher TCR_RTFT0=0x20, 315f2148a47SJeff Kirsher TCR_RTFT1=0x40, 316f2148a47SJeff Kirsher TCR_RTSF=0x80, 317f2148a47SJeff Kirsher }; 318f2148a47SJeff Kirsher 319f2148a47SJeff Kirsher /* Bits in the CamCon (CAMC) register */ 320f2148a47SJeff Kirsher enum camcon_bits { 321f2148a47SJeff Kirsher CAMC_CAMEN=0x01, 322f2148a47SJeff Kirsher CAMC_VCAMSL=0x02, 323f2148a47SJeff Kirsher CAMC_CAMWR=0x04, 324f2148a47SJeff Kirsher CAMC_CAMRD=0x08, 325f2148a47SJeff Kirsher }; 326f2148a47SJeff Kirsher 327f2148a47SJeff Kirsher /* Bits in the PCIBusConfig1 (BCR1) register */ 328f2148a47SJeff Kirsher enum bcr1_bits { 329f2148a47SJeff Kirsher BCR1_POT0=0x01, 330f2148a47SJeff Kirsher BCR1_POT1=0x02, 331f2148a47SJeff Kirsher BCR1_POT2=0x04, 332f2148a47SJeff Kirsher BCR1_CTFT0=0x08, 333f2148a47SJeff Kirsher BCR1_CTFT1=0x10, 334f2148a47SJeff Kirsher BCR1_CTSF=0x20, 335f2148a47SJeff Kirsher BCR1_TXQNOBK=0x40, /* for VT6105 */ 336f2148a47SJeff Kirsher BCR1_VIDFR=0x80, /* for VT6105 */ 337f2148a47SJeff Kirsher BCR1_MED0=0x40, /* for VT6102 */ 338f2148a47SJeff Kirsher BCR1_MED1=0x80, /* for VT6102 */ 339f2148a47SJeff Kirsher }; 340f2148a47SJeff Kirsher 341f2148a47SJeff Kirsher #ifdef USE_MMIO 342f2148a47SJeff Kirsher /* Registers we check that mmio and reg are the same. */ 343f2148a47SJeff Kirsher static const int mmio_verify_registers[] = { 344f2148a47SJeff Kirsher RxConfig, TxConfig, IntrEnable, ConfigA, ConfigB, ConfigC, ConfigD, 345f2148a47SJeff Kirsher 0 346f2148a47SJeff Kirsher }; 347f2148a47SJeff Kirsher #endif 348f2148a47SJeff Kirsher 349f2148a47SJeff Kirsher /* Bits in the interrupt status/mask registers. */ 350f2148a47SJeff Kirsher enum intr_status_bits { 3517ab87ff4SFrancois Romieu IntrRxDone = 0x0001, 3527ab87ff4SFrancois Romieu IntrTxDone = 0x0002, 3537ab87ff4SFrancois Romieu IntrRxErr = 0x0004, 3547ab87ff4SFrancois Romieu IntrTxError = 0x0008, 3557ab87ff4SFrancois Romieu IntrRxEmpty = 0x0020, 356f2148a47SJeff Kirsher IntrPCIErr = 0x0040, 3577ab87ff4SFrancois Romieu IntrStatsMax = 0x0080, 3587ab87ff4SFrancois Romieu IntrRxEarly = 0x0100, 3597ab87ff4SFrancois Romieu IntrTxUnderrun = 0x0210, 3607ab87ff4SFrancois Romieu IntrRxOverflow = 0x0400, 3617ab87ff4SFrancois Romieu IntrRxDropped = 0x0800, 3627ab87ff4SFrancois Romieu IntrRxNoBuf = 0x1000, 3637ab87ff4SFrancois Romieu IntrTxAborted = 0x2000, 3647ab87ff4SFrancois Romieu IntrLinkChange = 0x4000, 365f2148a47SJeff Kirsher IntrRxWakeUp = 0x8000, 366f2148a47SJeff Kirsher IntrTxDescRace = 0x080000, /* mapped from IntrStatus2 */ 3677ab87ff4SFrancois Romieu IntrNormalSummary = IntrRxDone | IntrTxDone, 3687ab87ff4SFrancois Romieu IntrTxErrSummary = IntrTxDescRace | IntrTxAborted | IntrTxError | 3697ab87ff4SFrancois Romieu IntrTxUnderrun, 370f2148a47SJeff Kirsher }; 371f2148a47SJeff Kirsher 372f2148a47SJeff Kirsher /* Bits in WOLcrSet/WOLcrClr and PwrcsrSet/PwrcsrClr */ 373f2148a47SJeff Kirsher enum wol_bits { 374f2148a47SJeff Kirsher WOLucast = 0x10, 375f2148a47SJeff Kirsher WOLmagic = 0x20, 376f2148a47SJeff Kirsher WOLbmcast = 0x30, 377f2148a47SJeff Kirsher WOLlnkon = 0x40, 378f2148a47SJeff Kirsher WOLlnkoff = 0x80, 379f2148a47SJeff Kirsher }; 380f2148a47SJeff Kirsher 381f2148a47SJeff Kirsher /* The Rx and Tx buffer descriptors. */ 382f2148a47SJeff Kirsher struct rx_desc { 383f2148a47SJeff Kirsher __le32 rx_status; 384f2148a47SJeff Kirsher __le32 desc_length; /* Chain flag, Buffer/frame length */ 385f2148a47SJeff Kirsher __le32 addr; 386f2148a47SJeff Kirsher __le32 next_desc; 387f2148a47SJeff Kirsher }; 388f2148a47SJeff Kirsher struct tx_desc { 389f2148a47SJeff Kirsher __le32 tx_status; 390f2148a47SJeff Kirsher __le32 desc_length; /* Chain flag, Tx Config, Frame length */ 391f2148a47SJeff Kirsher __le32 addr; 392f2148a47SJeff Kirsher __le32 next_desc; 393f2148a47SJeff Kirsher }; 394f2148a47SJeff Kirsher 395f2148a47SJeff Kirsher /* Initial value for tx_desc.desc_length, Buffer size goes to bits 0-10 */ 396f2148a47SJeff Kirsher #define TXDESC 0x00e08000 397f2148a47SJeff Kirsher 398f2148a47SJeff Kirsher enum rx_status_bits { 399f2148a47SJeff Kirsher RxOK=0x8000, RxWholePkt=0x0300, RxErr=0x008F 400f2148a47SJeff Kirsher }; 401f2148a47SJeff Kirsher 402f2148a47SJeff Kirsher /* Bits in *_desc.*_status */ 403f2148a47SJeff Kirsher enum desc_status_bits { 404f2148a47SJeff Kirsher DescOwn=0x80000000 405f2148a47SJeff Kirsher }; 406f2148a47SJeff Kirsher 407f2148a47SJeff Kirsher /* Bits in *_desc.*_length */ 408f2148a47SJeff Kirsher enum desc_length_bits { 409f2148a47SJeff Kirsher DescTag=0x00010000 410f2148a47SJeff Kirsher }; 411f2148a47SJeff Kirsher 412f2148a47SJeff Kirsher /* Bits in ChipCmd. */ 413f2148a47SJeff Kirsher enum chip_cmd_bits { 414f2148a47SJeff Kirsher CmdInit=0x01, CmdStart=0x02, CmdStop=0x04, CmdRxOn=0x08, 415f2148a47SJeff Kirsher CmdTxOn=0x10, Cmd1TxDemand=0x20, CmdRxDemand=0x40, 416f2148a47SJeff Kirsher Cmd1EarlyRx=0x01, Cmd1EarlyTx=0x02, Cmd1FDuplex=0x04, 417f2148a47SJeff Kirsher Cmd1NoTxPoll=0x08, Cmd1Reset=0x80, 418f2148a47SJeff Kirsher }; 419f2148a47SJeff Kirsher 420f7b5d1b9SJamie Gloudon struct rhine_stats { 421f7b5d1b9SJamie Gloudon u64 packets; 422f7b5d1b9SJamie Gloudon u64 bytes; 423f7b5d1b9SJamie Gloudon struct u64_stats_sync syncp; 424f7b5d1b9SJamie Gloudon }; 425f7b5d1b9SJamie Gloudon 426f2148a47SJeff Kirsher struct rhine_private { 427f2148a47SJeff Kirsher /* Bit mask for configured VLAN ids */ 428f2148a47SJeff Kirsher unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 429f2148a47SJeff Kirsher 430f2148a47SJeff Kirsher /* Descriptor rings */ 431f2148a47SJeff Kirsher struct rx_desc *rx_ring; 432f2148a47SJeff Kirsher struct tx_desc *tx_ring; 433f2148a47SJeff Kirsher dma_addr_t rx_ring_dma; 434f2148a47SJeff Kirsher dma_addr_t tx_ring_dma; 435f2148a47SJeff Kirsher 436f2148a47SJeff Kirsher /* The addresses of receive-in-place skbuffs. */ 437f2148a47SJeff Kirsher struct sk_buff *rx_skbuff[RX_RING_SIZE]; 438f2148a47SJeff Kirsher dma_addr_t rx_skbuff_dma[RX_RING_SIZE]; 439f2148a47SJeff Kirsher 440f2148a47SJeff Kirsher /* The saved address of a sent-in-place packet/buffer, for later free(). */ 441f2148a47SJeff Kirsher struct sk_buff *tx_skbuff[TX_RING_SIZE]; 442f2148a47SJeff Kirsher dma_addr_t tx_skbuff_dma[TX_RING_SIZE]; 443f2148a47SJeff Kirsher 444f2148a47SJeff Kirsher /* Tx bounce buffers (Rhine-I only) */ 445f2148a47SJeff Kirsher unsigned char *tx_buf[TX_RING_SIZE]; 446f2148a47SJeff Kirsher unsigned char *tx_bufs; 447f2148a47SJeff Kirsher dma_addr_t tx_bufs_dma; 448f2148a47SJeff Kirsher 449f2148a47SJeff Kirsher struct pci_dev *pdev; 450f2148a47SJeff Kirsher long pioaddr; 451f2148a47SJeff Kirsher struct net_device *dev; 452f2148a47SJeff Kirsher struct napi_struct napi; 453f2148a47SJeff Kirsher spinlock_t lock; 4547ab87ff4SFrancois Romieu struct mutex task_lock; 4557ab87ff4SFrancois Romieu bool task_enable; 4567ab87ff4SFrancois Romieu struct work_struct slow_event_task; 457f2148a47SJeff Kirsher struct work_struct reset_task; 458f2148a47SJeff Kirsher 459fc3e0f8aSFrancois Romieu u32 msg_enable; 460fc3e0f8aSFrancois Romieu 461f2148a47SJeff Kirsher /* Frequently used values: keep some adjacent for cache effect. */ 462f2148a47SJeff Kirsher u32 quirks; 463f2148a47SJeff Kirsher struct rx_desc *rx_head_desc; 464f2148a47SJeff Kirsher unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ 465f2148a47SJeff Kirsher unsigned int cur_tx, dirty_tx; 466f2148a47SJeff Kirsher unsigned int rx_buf_sz; /* Based on MTU+slack. */ 467f7b5d1b9SJamie Gloudon struct rhine_stats rx_stats; 468f7b5d1b9SJamie Gloudon struct rhine_stats tx_stats; 469f2148a47SJeff Kirsher u8 wolopts; 470f2148a47SJeff Kirsher 471f2148a47SJeff Kirsher u8 tx_thresh, rx_thresh; 472f2148a47SJeff Kirsher 473f2148a47SJeff Kirsher struct mii_if_info mii_if; 474f2148a47SJeff Kirsher void __iomem *base; 475f2148a47SJeff Kirsher }; 476f2148a47SJeff Kirsher 477f2148a47SJeff Kirsher #define BYTE_REG_BITS_ON(x, p) do { iowrite8((ioread8((p))|(x)), (p)); } while (0) 478f2148a47SJeff Kirsher #define WORD_REG_BITS_ON(x, p) do { iowrite16((ioread16((p))|(x)), (p)); } while (0) 479f2148a47SJeff Kirsher #define DWORD_REG_BITS_ON(x, p) do { iowrite32((ioread32((p))|(x)), (p)); } while (0) 480f2148a47SJeff Kirsher 481f2148a47SJeff Kirsher #define BYTE_REG_BITS_IS_ON(x, p) (ioread8((p)) & (x)) 482f2148a47SJeff Kirsher #define WORD_REG_BITS_IS_ON(x, p) (ioread16((p)) & (x)) 483f2148a47SJeff Kirsher #define DWORD_REG_BITS_IS_ON(x, p) (ioread32((p)) & (x)) 484f2148a47SJeff Kirsher 485f2148a47SJeff Kirsher #define BYTE_REG_BITS_OFF(x, p) do { iowrite8(ioread8((p)) & (~(x)), (p)); } while (0) 486f2148a47SJeff Kirsher #define WORD_REG_BITS_OFF(x, p) do { iowrite16(ioread16((p)) & (~(x)), (p)); } while (0) 487f2148a47SJeff Kirsher #define DWORD_REG_BITS_OFF(x, p) do { iowrite32(ioread32((p)) & (~(x)), (p)); } while (0) 488f2148a47SJeff Kirsher 489f2148a47SJeff Kirsher #define BYTE_REG_BITS_SET(x, m, p) do { iowrite8((ioread8((p)) & (~(m)))|(x), (p)); } while (0) 490f2148a47SJeff Kirsher #define WORD_REG_BITS_SET(x, m, p) do { iowrite16((ioread16((p)) & (~(m)))|(x), (p)); } while (0) 491f2148a47SJeff Kirsher #define DWORD_REG_BITS_SET(x, m, p) do { iowrite32((ioread32((p)) & (~(m)))|(x), (p)); } while (0) 492f2148a47SJeff Kirsher 493f2148a47SJeff Kirsher 494f2148a47SJeff Kirsher static int mdio_read(struct net_device *dev, int phy_id, int location); 495f2148a47SJeff Kirsher static void mdio_write(struct net_device *dev, int phy_id, int location, int value); 496f2148a47SJeff Kirsher static int rhine_open(struct net_device *dev); 497f2148a47SJeff Kirsher static void rhine_reset_task(struct work_struct *work); 4987ab87ff4SFrancois Romieu static void rhine_slow_event_task(struct work_struct *work); 499f2148a47SJeff Kirsher static void rhine_tx_timeout(struct net_device *dev); 500f2148a47SJeff Kirsher static netdev_tx_t rhine_start_tx(struct sk_buff *skb, 501f2148a47SJeff Kirsher struct net_device *dev); 502f2148a47SJeff Kirsher static irqreturn_t rhine_interrupt(int irq, void *dev_instance); 503f2148a47SJeff Kirsher static void rhine_tx(struct net_device *dev); 504f2148a47SJeff Kirsher static int rhine_rx(struct net_device *dev, int limit); 505f2148a47SJeff Kirsher static void rhine_set_rx_mode(struct net_device *dev); 506f7b5d1b9SJamie Gloudon static struct rtnl_link_stats64 *rhine_get_stats64(struct net_device *dev, 507f7b5d1b9SJamie Gloudon struct rtnl_link_stats64 *stats); 508f2148a47SJeff Kirsher static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); 509f2148a47SJeff Kirsher static const struct ethtool_ops netdev_ethtool_ops; 510f2148a47SJeff Kirsher static int rhine_close(struct net_device *dev); 51180d5c368SPatrick McHardy static int rhine_vlan_rx_add_vid(struct net_device *dev, 51280d5c368SPatrick McHardy __be16 proto, u16 vid); 51380d5c368SPatrick McHardy static int rhine_vlan_rx_kill_vid(struct net_device *dev, 51480d5c368SPatrick McHardy __be16 proto, u16 vid); 5157ab87ff4SFrancois Romieu static void rhine_restart_tx(struct net_device *dev); 516f2148a47SJeff Kirsher 5173f8c91a7SAndreas Mohr static void rhine_wait_bit(struct rhine_private *rp, u8 reg, u8 mask, bool low) 518a384a33bSFrancois Romieu { 519a384a33bSFrancois Romieu void __iomem *ioaddr = rp->base; 520a384a33bSFrancois Romieu int i; 521a384a33bSFrancois Romieu 522a384a33bSFrancois Romieu for (i = 0; i < 1024; i++) { 5233f8c91a7SAndreas Mohr bool has_mask_bits = !!(ioread8(ioaddr + reg) & mask); 5243f8c91a7SAndreas Mohr 5253f8c91a7SAndreas Mohr if (low ^ has_mask_bits) 526a384a33bSFrancois Romieu break; 527a384a33bSFrancois Romieu udelay(10); 528a384a33bSFrancois Romieu } 529a384a33bSFrancois Romieu if (i > 64) { 530fc3e0f8aSFrancois Romieu netif_dbg(rp, hw, rp->dev, "%s bit wait (%02x/%02x) cycle " 5313f8c91a7SAndreas Mohr "count: %04d\n", low ? "low" : "high", reg, mask, i); 532a384a33bSFrancois Romieu } 533a384a33bSFrancois Romieu } 534a384a33bSFrancois Romieu 535a384a33bSFrancois Romieu static void rhine_wait_bit_high(struct rhine_private *rp, u8 reg, u8 mask) 536a384a33bSFrancois Romieu { 5373f8c91a7SAndreas Mohr rhine_wait_bit(rp, reg, mask, false); 538a384a33bSFrancois Romieu } 539a384a33bSFrancois Romieu 540a384a33bSFrancois Romieu static void rhine_wait_bit_low(struct rhine_private *rp, u8 reg, u8 mask) 541a384a33bSFrancois Romieu { 5423f8c91a7SAndreas Mohr rhine_wait_bit(rp, reg, mask, true); 543a384a33bSFrancois Romieu } 544f2148a47SJeff Kirsher 545a20a28bcSFrancois Romieu static u32 rhine_get_events(struct rhine_private *rp) 546f2148a47SJeff Kirsher { 547f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 548f2148a47SJeff Kirsher u32 intr_status; 549f2148a47SJeff Kirsher 550f2148a47SJeff Kirsher intr_status = ioread16(ioaddr + IntrStatus); 551f2148a47SJeff Kirsher /* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */ 552f2148a47SJeff Kirsher if (rp->quirks & rqStatusWBRace) 553f2148a47SJeff Kirsher intr_status |= ioread8(ioaddr + IntrStatus2) << 16; 554f2148a47SJeff Kirsher return intr_status; 555f2148a47SJeff Kirsher } 556f2148a47SJeff Kirsher 557a20a28bcSFrancois Romieu static void rhine_ack_events(struct rhine_private *rp, u32 mask) 558a20a28bcSFrancois Romieu { 559a20a28bcSFrancois Romieu void __iomem *ioaddr = rp->base; 560a20a28bcSFrancois Romieu 561a20a28bcSFrancois Romieu if (rp->quirks & rqStatusWBRace) 562a20a28bcSFrancois Romieu iowrite8(mask >> 16, ioaddr + IntrStatus2); 563a20a28bcSFrancois Romieu iowrite16(mask, ioaddr + IntrStatus); 5647ab87ff4SFrancois Romieu mmiowb(); 565a20a28bcSFrancois Romieu } 566a20a28bcSFrancois Romieu 567f2148a47SJeff Kirsher /* 568f2148a47SJeff Kirsher * Get power related registers into sane state. 569f2148a47SJeff Kirsher * Notify user about past WOL event. 570f2148a47SJeff Kirsher */ 571f2148a47SJeff Kirsher static void rhine_power_init(struct net_device *dev) 572f2148a47SJeff Kirsher { 573f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 574f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 575f2148a47SJeff Kirsher u16 wolstat; 576f2148a47SJeff Kirsher 577f2148a47SJeff Kirsher if (rp->quirks & rqWOL) { 578f2148a47SJeff Kirsher /* Make sure chip is in power state D0 */ 579f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + StickyHW) & 0xFC, ioaddr + StickyHW); 580f2148a47SJeff Kirsher 581f2148a47SJeff Kirsher /* Disable "force PME-enable" */ 582f2148a47SJeff Kirsher iowrite8(0x80, ioaddr + WOLcgClr); 583f2148a47SJeff Kirsher 584f2148a47SJeff Kirsher /* Clear power-event config bits (WOL) */ 585f2148a47SJeff Kirsher iowrite8(0xFF, ioaddr + WOLcrClr); 586f2148a47SJeff Kirsher /* More recent cards can manage two additional patterns */ 587f2148a47SJeff Kirsher if (rp->quirks & rq6patterns) 588f2148a47SJeff Kirsher iowrite8(0x03, ioaddr + WOLcrClr1); 589f2148a47SJeff Kirsher 590f2148a47SJeff Kirsher /* Save power-event status bits */ 591f2148a47SJeff Kirsher wolstat = ioread8(ioaddr + PwrcsrSet); 592f2148a47SJeff Kirsher if (rp->quirks & rq6patterns) 593f2148a47SJeff Kirsher wolstat |= (ioread8(ioaddr + PwrcsrSet1) & 0x03) << 8; 594f2148a47SJeff Kirsher 595f2148a47SJeff Kirsher /* Clear power-event status bits */ 596f2148a47SJeff Kirsher iowrite8(0xFF, ioaddr + PwrcsrClr); 597f2148a47SJeff Kirsher if (rp->quirks & rq6patterns) 598f2148a47SJeff Kirsher iowrite8(0x03, ioaddr + PwrcsrClr1); 599f2148a47SJeff Kirsher 600f2148a47SJeff Kirsher if (wolstat) { 601f2148a47SJeff Kirsher char *reason; 602f2148a47SJeff Kirsher switch (wolstat) { 603f2148a47SJeff Kirsher case WOLmagic: 604f2148a47SJeff Kirsher reason = "Magic packet"; 605f2148a47SJeff Kirsher break; 606f2148a47SJeff Kirsher case WOLlnkon: 607f2148a47SJeff Kirsher reason = "Link went up"; 608f2148a47SJeff Kirsher break; 609f2148a47SJeff Kirsher case WOLlnkoff: 610f2148a47SJeff Kirsher reason = "Link went down"; 611f2148a47SJeff Kirsher break; 612f2148a47SJeff Kirsher case WOLucast: 613f2148a47SJeff Kirsher reason = "Unicast packet"; 614f2148a47SJeff Kirsher break; 615f2148a47SJeff Kirsher case WOLbmcast: 616f2148a47SJeff Kirsher reason = "Multicast/broadcast packet"; 617f2148a47SJeff Kirsher break; 618f2148a47SJeff Kirsher default: 619f2148a47SJeff Kirsher reason = "Unknown"; 620f2148a47SJeff Kirsher } 621f2148a47SJeff Kirsher netdev_info(dev, "Woke system up. Reason: %s\n", 622f2148a47SJeff Kirsher reason); 623f2148a47SJeff Kirsher } 624f2148a47SJeff Kirsher } 625f2148a47SJeff Kirsher } 626f2148a47SJeff Kirsher 627f2148a47SJeff Kirsher static void rhine_chip_reset(struct net_device *dev) 628f2148a47SJeff Kirsher { 629f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 630f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 631fc3e0f8aSFrancois Romieu u8 cmd1; 632f2148a47SJeff Kirsher 633f2148a47SJeff Kirsher iowrite8(Cmd1Reset, ioaddr + ChipCmd1); 634f2148a47SJeff Kirsher IOSYNC; 635f2148a47SJeff Kirsher 636f2148a47SJeff Kirsher if (ioread8(ioaddr + ChipCmd1) & Cmd1Reset) { 637f2148a47SJeff Kirsher netdev_info(dev, "Reset not complete yet. Trying harder.\n"); 638f2148a47SJeff Kirsher 639f2148a47SJeff Kirsher /* Force reset */ 640f2148a47SJeff Kirsher if (rp->quirks & rqForceReset) 641f2148a47SJeff Kirsher iowrite8(0x40, ioaddr + MiscCmd); 642f2148a47SJeff Kirsher 643f2148a47SJeff Kirsher /* Reset can take somewhat longer (rare) */ 644a384a33bSFrancois Romieu rhine_wait_bit_low(rp, ChipCmd1, Cmd1Reset); 645f2148a47SJeff Kirsher } 646f2148a47SJeff Kirsher 647fc3e0f8aSFrancois Romieu cmd1 = ioread8(ioaddr + ChipCmd1); 648fc3e0f8aSFrancois Romieu netif_info(rp, hw, dev, "Reset %s\n", (cmd1 & Cmd1Reset) ? 649f2148a47SJeff Kirsher "failed" : "succeeded"); 650f2148a47SJeff Kirsher } 651f2148a47SJeff Kirsher 652f2148a47SJeff Kirsher #ifdef USE_MMIO 653f2148a47SJeff Kirsher static void enable_mmio(long pioaddr, u32 quirks) 654f2148a47SJeff Kirsher { 655f2148a47SJeff Kirsher int n; 656f2148a47SJeff Kirsher if (quirks & rqRhineI) { 657f2148a47SJeff Kirsher /* More recent docs say that this bit is reserved ... */ 658f2148a47SJeff Kirsher n = inb(pioaddr + ConfigA) | 0x20; 659f2148a47SJeff Kirsher outb(n, pioaddr + ConfigA); 660f2148a47SJeff Kirsher } else { 661f2148a47SJeff Kirsher n = inb(pioaddr + ConfigD) | 0x80; 662f2148a47SJeff Kirsher outb(n, pioaddr + ConfigD); 663f2148a47SJeff Kirsher } 664f2148a47SJeff Kirsher } 665f2148a47SJeff Kirsher #endif 666f2148a47SJeff Kirsher 667f2148a47SJeff Kirsher /* 668f2148a47SJeff Kirsher * Loads bytes 0x00-0x05, 0x6E-0x6F, 0x78-0x7B from EEPROM 669f2148a47SJeff Kirsher * (plus 0x6C for Rhine-I/II) 670f2148a47SJeff Kirsher */ 67176e239e1SBill Pemberton static void rhine_reload_eeprom(long pioaddr, struct net_device *dev) 672f2148a47SJeff Kirsher { 673f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 674f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 675a384a33bSFrancois Romieu int i; 676f2148a47SJeff Kirsher 677f2148a47SJeff Kirsher outb(0x20, pioaddr + MACRegEEcsr); 678a384a33bSFrancois Romieu for (i = 0; i < 1024; i++) { 679a384a33bSFrancois Romieu if (!(inb(pioaddr + MACRegEEcsr) & 0x20)) 680a384a33bSFrancois Romieu break; 681a384a33bSFrancois Romieu } 682a384a33bSFrancois Romieu if (i > 512) 683a384a33bSFrancois Romieu pr_info("%4d cycles used @ %s:%d\n", i, __func__, __LINE__); 684f2148a47SJeff Kirsher 685f2148a47SJeff Kirsher #ifdef USE_MMIO 686f2148a47SJeff Kirsher /* 687f2148a47SJeff Kirsher * Reloading from EEPROM overwrites ConfigA-D, so we must re-enable 688f2148a47SJeff Kirsher * MMIO. If reloading EEPROM was done first this could be avoided, but 689f2148a47SJeff Kirsher * it is not known if that still works with the "win98-reboot" problem. 690f2148a47SJeff Kirsher */ 691f2148a47SJeff Kirsher enable_mmio(pioaddr, rp->quirks); 692f2148a47SJeff Kirsher #endif 693f2148a47SJeff Kirsher 694f2148a47SJeff Kirsher /* Turn off EEPROM-controlled wake-up (magic packet) */ 695f2148a47SJeff Kirsher if (rp->quirks & rqWOL) 696f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ConfigA) & 0xFC, ioaddr + ConfigA); 697f2148a47SJeff Kirsher 698f2148a47SJeff Kirsher } 699f2148a47SJeff Kirsher 700f2148a47SJeff Kirsher #ifdef CONFIG_NET_POLL_CONTROLLER 701f2148a47SJeff Kirsher static void rhine_poll(struct net_device *dev) 702f2148a47SJeff Kirsher { 70305d334ecSFrancois Romieu struct rhine_private *rp = netdev_priv(dev); 70405d334ecSFrancois Romieu const int irq = rp->pdev->irq; 70505d334ecSFrancois Romieu 70605d334ecSFrancois Romieu disable_irq(irq); 70705d334ecSFrancois Romieu rhine_interrupt(irq, dev); 70805d334ecSFrancois Romieu enable_irq(irq); 709f2148a47SJeff Kirsher } 710f2148a47SJeff Kirsher #endif 711f2148a47SJeff Kirsher 712269f3114SFrancois Romieu static void rhine_kick_tx_threshold(struct rhine_private *rp) 713269f3114SFrancois Romieu { 714269f3114SFrancois Romieu if (rp->tx_thresh < 0xe0) { 715269f3114SFrancois Romieu void __iomem *ioaddr = rp->base; 716269f3114SFrancois Romieu 717269f3114SFrancois Romieu rp->tx_thresh += 0x20; 718269f3114SFrancois Romieu BYTE_REG_BITS_SET(rp->tx_thresh, 0x80, ioaddr + TxConfig); 719269f3114SFrancois Romieu } 720269f3114SFrancois Romieu } 721269f3114SFrancois Romieu 7227ab87ff4SFrancois Romieu static void rhine_tx_err(struct rhine_private *rp, u32 status) 7237ab87ff4SFrancois Romieu { 7247ab87ff4SFrancois Romieu struct net_device *dev = rp->dev; 7257ab87ff4SFrancois Romieu 7267ab87ff4SFrancois Romieu if (status & IntrTxAborted) { 727fc3e0f8aSFrancois Romieu netif_info(rp, tx_err, dev, 728fc3e0f8aSFrancois Romieu "Abort %08x, frame dropped\n", status); 7297ab87ff4SFrancois Romieu } 7307ab87ff4SFrancois Romieu 7317ab87ff4SFrancois Romieu if (status & IntrTxUnderrun) { 7327ab87ff4SFrancois Romieu rhine_kick_tx_threshold(rp); 733fc3e0f8aSFrancois Romieu netif_info(rp, tx_err ,dev, "Transmitter underrun, " 734fc3e0f8aSFrancois Romieu "Tx threshold now %02x\n", rp->tx_thresh); 7357ab87ff4SFrancois Romieu } 7367ab87ff4SFrancois Romieu 737fc3e0f8aSFrancois Romieu if (status & IntrTxDescRace) 738fc3e0f8aSFrancois Romieu netif_info(rp, tx_err, dev, "Tx descriptor write-back race\n"); 7397ab87ff4SFrancois Romieu 7407ab87ff4SFrancois Romieu if ((status & IntrTxError) && 7417ab87ff4SFrancois Romieu (status & (IntrTxAborted | IntrTxUnderrun | IntrTxDescRace)) == 0) { 7427ab87ff4SFrancois Romieu rhine_kick_tx_threshold(rp); 743fc3e0f8aSFrancois Romieu netif_info(rp, tx_err, dev, "Unspecified error. " 744fc3e0f8aSFrancois Romieu "Tx threshold now %02x\n", rp->tx_thresh); 7457ab87ff4SFrancois Romieu } 7467ab87ff4SFrancois Romieu 7477ab87ff4SFrancois Romieu rhine_restart_tx(dev); 7487ab87ff4SFrancois Romieu } 7497ab87ff4SFrancois Romieu 7507ab87ff4SFrancois Romieu static void rhine_update_rx_crc_and_missed_errord(struct rhine_private *rp) 7517ab87ff4SFrancois Romieu { 7527ab87ff4SFrancois Romieu void __iomem *ioaddr = rp->base; 7537ab87ff4SFrancois Romieu struct net_device_stats *stats = &rp->dev->stats; 7547ab87ff4SFrancois Romieu 7557ab87ff4SFrancois Romieu stats->rx_crc_errors += ioread16(ioaddr + RxCRCErrs); 7567ab87ff4SFrancois Romieu stats->rx_missed_errors += ioread16(ioaddr + RxMissed); 7577ab87ff4SFrancois Romieu 7587ab87ff4SFrancois Romieu /* 7597ab87ff4SFrancois Romieu * Clears the "tally counters" for CRC errors and missed frames(?). 7607ab87ff4SFrancois Romieu * It has been reported that some chips need a write of 0 to clear 7617ab87ff4SFrancois Romieu * these, for others the counters are set to 1 when written to and 7627ab87ff4SFrancois Romieu * instead cleared when read. So we clear them both ways ... 7637ab87ff4SFrancois Romieu */ 7647ab87ff4SFrancois Romieu iowrite32(0, ioaddr + RxMissed); 7657ab87ff4SFrancois Romieu ioread16(ioaddr + RxCRCErrs); 7667ab87ff4SFrancois Romieu ioread16(ioaddr + RxMissed); 7677ab87ff4SFrancois Romieu } 7687ab87ff4SFrancois Romieu 7697ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_RX (IntrRxDone | \ 7707ab87ff4SFrancois Romieu IntrRxErr | \ 7717ab87ff4SFrancois Romieu IntrRxEmpty | \ 7727ab87ff4SFrancois Romieu IntrRxOverflow | \ 7737ab87ff4SFrancois Romieu IntrRxDropped | \ 7747ab87ff4SFrancois Romieu IntrRxNoBuf | \ 7757ab87ff4SFrancois Romieu IntrRxWakeUp) 7767ab87ff4SFrancois Romieu 7777ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_TX_ERR (IntrTxError | \ 7787ab87ff4SFrancois Romieu IntrTxAborted | \ 7797ab87ff4SFrancois Romieu IntrTxUnderrun | \ 7807ab87ff4SFrancois Romieu IntrTxDescRace) 7817ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI_TX (IntrTxDone | RHINE_EVENT_NAPI_TX_ERR) 7827ab87ff4SFrancois Romieu 7837ab87ff4SFrancois Romieu #define RHINE_EVENT_NAPI (RHINE_EVENT_NAPI_RX | \ 7847ab87ff4SFrancois Romieu RHINE_EVENT_NAPI_TX | \ 7857ab87ff4SFrancois Romieu IntrStatsMax) 7867ab87ff4SFrancois Romieu #define RHINE_EVENT_SLOW (IntrPCIErr | IntrLinkChange) 7877ab87ff4SFrancois Romieu #define RHINE_EVENT (RHINE_EVENT_NAPI | RHINE_EVENT_SLOW) 7887ab87ff4SFrancois Romieu 789f2148a47SJeff Kirsher static int rhine_napipoll(struct napi_struct *napi, int budget) 790f2148a47SJeff Kirsher { 791f2148a47SJeff Kirsher struct rhine_private *rp = container_of(napi, struct rhine_private, napi); 792f2148a47SJeff Kirsher struct net_device *dev = rp->dev; 793f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 7947ab87ff4SFrancois Romieu u16 enable_mask = RHINE_EVENT & 0xffff; 7957ab87ff4SFrancois Romieu int work_done = 0; 7967ab87ff4SFrancois Romieu u32 status; 797f2148a47SJeff Kirsher 7987ab87ff4SFrancois Romieu status = rhine_get_events(rp); 7997ab87ff4SFrancois Romieu rhine_ack_events(rp, status & ~RHINE_EVENT_SLOW); 8007ab87ff4SFrancois Romieu 8017ab87ff4SFrancois Romieu if (status & RHINE_EVENT_NAPI_RX) 8027ab87ff4SFrancois Romieu work_done += rhine_rx(dev, budget); 8037ab87ff4SFrancois Romieu 8047ab87ff4SFrancois Romieu if (status & RHINE_EVENT_NAPI_TX) { 8057ab87ff4SFrancois Romieu if (status & RHINE_EVENT_NAPI_TX_ERR) { 8067ab87ff4SFrancois Romieu /* Avoid scavenging before Tx engine turned off */ 807a384a33bSFrancois Romieu rhine_wait_bit_low(rp, ChipCmd, CmdTxOn); 808fc3e0f8aSFrancois Romieu if (ioread8(ioaddr + ChipCmd) & CmdTxOn) 809fc3e0f8aSFrancois Romieu netif_warn(rp, tx_err, dev, "Tx still on\n"); 8107ab87ff4SFrancois Romieu } 811fc3e0f8aSFrancois Romieu 8127ab87ff4SFrancois Romieu rhine_tx(dev); 8137ab87ff4SFrancois Romieu 8147ab87ff4SFrancois Romieu if (status & RHINE_EVENT_NAPI_TX_ERR) 8157ab87ff4SFrancois Romieu rhine_tx_err(rp, status); 8167ab87ff4SFrancois Romieu } 8177ab87ff4SFrancois Romieu 8187ab87ff4SFrancois Romieu if (status & IntrStatsMax) { 8197ab87ff4SFrancois Romieu spin_lock(&rp->lock); 8207ab87ff4SFrancois Romieu rhine_update_rx_crc_and_missed_errord(rp); 8217ab87ff4SFrancois Romieu spin_unlock(&rp->lock); 8227ab87ff4SFrancois Romieu } 8237ab87ff4SFrancois Romieu 8247ab87ff4SFrancois Romieu if (status & RHINE_EVENT_SLOW) { 8257ab87ff4SFrancois Romieu enable_mask &= ~RHINE_EVENT_SLOW; 8267ab87ff4SFrancois Romieu schedule_work(&rp->slow_event_task); 8277ab87ff4SFrancois Romieu } 828f2148a47SJeff Kirsher 829f2148a47SJeff Kirsher if (work_done < budget) { 830f2148a47SJeff Kirsher napi_complete(napi); 8317ab87ff4SFrancois Romieu iowrite16(enable_mask, ioaddr + IntrEnable); 8327ab87ff4SFrancois Romieu mmiowb(); 833f2148a47SJeff Kirsher } 834f2148a47SJeff Kirsher return work_done; 835f2148a47SJeff Kirsher } 836f2148a47SJeff Kirsher 83776e239e1SBill Pemberton static void rhine_hw_init(struct net_device *dev, long pioaddr) 838f2148a47SJeff Kirsher { 839f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 840f2148a47SJeff Kirsher 841f2148a47SJeff Kirsher /* Reset the chip to erase previous misconfiguration. */ 842f2148a47SJeff Kirsher rhine_chip_reset(dev); 843f2148a47SJeff Kirsher 844f2148a47SJeff Kirsher /* Rhine-I needs extra time to recuperate before EEPROM reload */ 845f2148a47SJeff Kirsher if (rp->quirks & rqRhineI) 846f2148a47SJeff Kirsher msleep(5); 847f2148a47SJeff Kirsher 848f2148a47SJeff Kirsher /* Reload EEPROM controlled bytes cleared by soft reset */ 849f2148a47SJeff Kirsher rhine_reload_eeprom(pioaddr, dev); 850f2148a47SJeff Kirsher } 851f2148a47SJeff Kirsher 852f2148a47SJeff Kirsher static const struct net_device_ops rhine_netdev_ops = { 853f2148a47SJeff Kirsher .ndo_open = rhine_open, 854f2148a47SJeff Kirsher .ndo_stop = rhine_close, 855f2148a47SJeff Kirsher .ndo_start_xmit = rhine_start_tx, 856f7b5d1b9SJamie Gloudon .ndo_get_stats64 = rhine_get_stats64, 857afc4b13dSJiri Pirko .ndo_set_rx_mode = rhine_set_rx_mode, 858f2148a47SJeff Kirsher .ndo_change_mtu = eth_change_mtu, 859f2148a47SJeff Kirsher .ndo_validate_addr = eth_validate_addr, 860f2148a47SJeff Kirsher .ndo_set_mac_address = eth_mac_addr, 861f2148a47SJeff Kirsher .ndo_do_ioctl = netdev_ioctl, 862f2148a47SJeff Kirsher .ndo_tx_timeout = rhine_tx_timeout, 863f2148a47SJeff Kirsher .ndo_vlan_rx_add_vid = rhine_vlan_rx_add_vid, 864f2148a47SJeff Kirsher .ndo_vlan_rx_kill_vid = rhine_vlan_rx_kill_vid, 865f2148a47SJeff Kirsher #ifdef CONFIG_NET_POLL_CONTROLLER 866f2148a47SJeff Kirsher .ndo_poll_controller = rhine_poll, 867f2148a47SJeff Kirsher #endif 868f2148a47SJeff Kirsher }; 869f2148a47SJeff Kirsher 8701dd06ae8SGreg Kroah-Hartman static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 871f2148a47SJeff Kirsher { 872f2148a47SJeff Kirsher struct net_device *dev; 873f2148a47SJeff Kirsher struct rhine_private *rp; 874f2148a47SJeff Kirsher int i, rc; 875f2148a47SJeff Kirsher u32 quirks; 876f2148a47SJeff Kirsher long pioaddr; 877f2148a47SJeff Kirsher long memaddr; 878f2148a47SJeff Kirsher void __iomem *ioaddr; 879f2148a47SJeff Kirsher int io_size, phy_id; 880f2148a47SJeff Kirsher const char *name; 881f2148a47SJeff Kirsher #ifdef USE_MMIO 882f2148a47SJeff Kirsher int bar = 1; 883f2148a47SJeff Kirsher #else 884f2148a47SJeff Kirsher int bar = 0; 885f2148a47SJeff Kirsher #endif 886f2148a47SJeff Kirsher 887f2148a47SJeff Kirsher /* when built into the kernel, we only print version if device is found */ 888f2148a47SJeff Kirsher #ifndef MODULE 889f2148a47SJeff Kirsher pr_info_once("%s\n", version); 890f2148a47SJeff Kirsher #endif 891f2148a47SJeff Kirsher 892f2148a47SJeff Kirsher io_size = 256; 893f2148a47SJeff Kirsher phy_id = 0; 894f2148a47SJeff Kirsher quirks = 0; 895f2148a47SJeff Kirsher name = "Rhine"; 896f2148a47SJeff Kirsher if (pdev->revision < VTunknown0) { 897f2148a47SJeff Kirsher quirks = rqRhineI; 898f2148a47SJeff Kirsher io_size = 128; 899f2148a47SJeff Kirsher } 900f2148a47SJeff Kirsher else if (pdev->revision >= VT6102) { 901f2148a47SJeff Kirsher quirks = rqWOL | rqForceReset; 902f2148a47SJeff Kirsher if (pdev->revision < VT6105) { 903f2148a47SJeff Kirsher name = "Rhine II"; 904f2148a47SJeff Kirsher quirks |= rqStatusWBRace; /* Rhine-II exclusive */ 905f2148a47SJeff Kirsher } 906f2148a47SJeff Kirsher else { 907f2148a47SJeff Kirsher phy_id = 1; /* Integrated PHY, phy_id fixed to 1 */ 908f2148a47SJeff Kirsher if (pdev->revision >= VT6105_B0) 909f2148a47SJeff Kirsher quirks |= rq6patterns; 910f2148a47SJeff Kirsher if (pdev->revision < VT6105M) 911f2148a47SJeff Kirsher name = "Rhine III"; 912f2148a47SJeff Kirsher else 913f2148a47SJeff Kirsher name = "Rhine III (Management Adapter)"; 914f2148a47SJeff Kirsher } 915f2148a47SJeff Kirsher } 916f2148a47SJeff Kirsher 917f2148a47SJeff Kirsher rc = pci_enable_device(pdev); 918f2148a47SJeff Kirsher if (rc) 919f2148a47SJeff Kirsher goto err_out; 920f2148a47SJeff Kirsher 921f2148a47SJeff Kirsher /* this should always be supported */ 922f2148a47SJeff Kirsher rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 923f2148a47SJeff Kirsher if (rc) { 924f2148a47SJeff Kirsher dev_err(&pdev->dev, 925f2148a47SJeff Kirsher "32-bit PCI DMA addresses not supported by the card!?\n"); 926*ae996154SRoger Luethi goto err_out_pci_disable; 927f2148a47SJeff Kirsher } 928f2148a47SJeff Kirsher 929f2148a47SJeff Kirsher /* sanity check */ 930f2148a47SJeff Kirsher if ((pci_resource_len(pdev, 0) < io_size) || 931f2148a47SJeff Kirsher (pci_resource_len(pdev, 1) < io_size)) { 932f2148a47SJeff Kirsher rc = -EIO; 933f2148a47SJeff Kirsher dev_err(&pdev->dev, "Insufficient PCI resources, aborting\n"); 934*ae996154SRoger Luethi goto err_out_pci_disable; 935f2148a47SJeff Kirsher } 936f2148a47SJeff Kirsher 937f2148a47SJeff Kirsher pioaddr = pci_resource_start(pdev, 0); 938f2148a47SJeff Kirsher memaddr = pci_resource_start(pdev, 1); 939f2148a47SJeff Kirsher 940f2148a47SJeff Kirsher pci_set_master(pdev); 941f2148a47SJeff Kirsher 942f2148a47SJeff Kirsher dev = alloc_etherdev(sizeof(struct rhine_private)); 943f2148a47SJeff Kirsher if (!dev) { 944f2148a47SJeff Kirsher rc = -ENOMEM; 945*ae996154SRoger Luethi goto err_out_pci_disable; 946f2148a47SJeff Kirsher } 947f2148a47SJeff Kirsher SET_NETDEV_DEV(dev, &pdev->dev); 948f2148a47SJeff Kirsher 949f2148a47SJeff Kirsher rp = netdev_priv(dev); 950f2148a47SJeff Kirsher rp->dev = dev; 951f2148a47SJeff Kirsher rp->quirks = quirks; 952f2148a47SJeff Kirsher rp->pioaddr = pioaddr; 953f2148a47SJeff Kirsher rp->pdev = pdev; 954fc3e0f8aSFrancois Romieu rp->msg_enable = netif_msg_init(debug, RHINE_MSG_DEFAULT); 955f2148a47SJeff Kirsher 956f2148a47SJeff Kirsher rc = pci_request_regions(pdev, DRV_NAME); 957f2148a47SJeff Kirsher if (rc) 958f2148a47SJeff Kirsher goto err_out_free_netdev; 959f2148a47SJeff Kirsher 960f2148a47SJeff Kirsher ioaddr = pci_iomap(pdev, bar, io_size); 961f2148a47SJeff Kirsher if (!ioaddr) { 962f2148a47SJeff Kirsher rc = -EIO; 963f2148a47SJeff Kirsher dev_err(&pdev->dev, 964f2148a47SJeff Kirsher "ioremap failed for device %s, region 0x%X @ 0x%lX\n", 965f2148a47SJeff Kirsher pci_name(pdev), io_size, memaddr); 966f2148a47SJeff Kirsher goto err_out_free_res; 967f2148a47SJeff Kirsher } 968f2148a47SJeff Kirsher 969f2148a47SJeff Kirsher #ifdef USE_MMIO 970f2148a47SJeff Kirsher enable_mmio(pioaddr, quirks); 971f2148a47SJeff Kirsher 972f2148a47SJeff Kirsher /* Check that selected MMIO registers match the PIO ones */ 973f2148a47SJeff Kirsher i = 0; 974f2148a47SJeff Kirsher while (mmio_verify_registers[i]) { 975f2148a47SJeff Kirsher int reg = mmio_verify_registers[i++]; 976f2148a47SJeff Kirsher unsigned char a = inb(pioaddr+reg); 977f2148a47SJeff Kirsher unsigned char b = readb(ioaddr+reg); 978f2148a47SJeff Kirsher if (a != b) { 979f2148a47SJeff Kirsher rc = -EIO; 980f2148a47SJeff Kirsher dev_err(&pdev->dev, 981f2148a47SJeff Kirsher "MMIO do not match PIO [%02x] (%02x != %02x)\n", 982f2148a47SJeff Kirsher reg, a, b); 983f2148a47SJeff Kirsher goto err_out_unmap; 984f2148a47SJeff Kirsher } 985f2148a47SJeff Kirsher } 986f2148a47SJeff Kirsher #endif /* USE_MMIO */ 987f2148a47SJeff Kirsher 988f2148a47SJeff Kirsher rp->base = ioaddr; 989f2148a47SJeff Kirsher 990827da44cSJohn Stultz u64_stats_init(&rp->tx_stats.syncp); 991827da44cSJohn Stultz u64_stats_init(&rp->rx_stats.syncp); 992827da44cSJohn Stultz 993f2148a47SJeff Kirsher /* Get chip registers into a sane state */ 994f2148a47SJeff Kirsher rhine_power_init(dev); 995f2148a47SJeff Kirsher rhine_hw_init(dev, pioaddr); 996f2148a47SJeff Kirsher 997f2148a47SJeff Kirsher for (i = 0; i < 6; i++) 998f2148a47SJeff Kirsher dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i); 999f2148a47SJeff Kirsher 1000f2148a47SJeff Kirsher if (!is_valid_ether_addr(dev->dev_addr)) { 1001f2148a47SJeff Kirsher /* Report it and use a random ethernet address instead */ 1002f2148a47SJeff Kirsher netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr); 1003f2cedb63SDanny Kukawka eth_hw_addr_random(dev); 1004f2148a47SJeff Kirsher netdev_info(dev, "Using random MAC address: %pM\n", 1005f2148a47SJeff Kirsher dev->dev_addr); 1006f2148a47SJeff Kirsher } 1007f2148a47SJeff Kirsher 1008f2148a47SJeff Kirsher /* For Rhine-I/II, phy_id is loaded from EEPROM */ 1009f2148a47SJeff Kirsher if (!phy_id) 1010f2148a47SJeff Kirsher phy_id = ioread8(ioaddr + 0x6C); 1011f2148a47SJeff Kirsher 1012f2148a47SJeff Kirsher spin_lock_init(&rp->lock); 10137ab87ff4SFrancois Romieu mutex_init(&rp->task_lock); 1014f2148a47SJeff Kirsher INIT_WORK(&rp->reset_task, rhine_reset_task); 10157ab87ff4SFrancois Romieu INIT_WORK(&rp->slow_event_task, rhine_slow_event_task); 1016f2148a47SJeff Kirsher 1017f2148a47SJeff Kirsher rp->mii_if.dev = dev; 1018f2148a47SJeff Kirsher rp->mii_if.mdio_read = mdio_read; 1019f2148a47SJeff Kirsher rp->mii_if.mdio_write = mdio_write; 1020f2148a47SJeff Kirsher rp->mii_if.phy_id_mask = 0x1f; 1021f2148a47SJeff Kirsher rp->mii_if.reg_num_mask = 0x1f; 1022f2148a47SJeff Kirsher 1023f2148a47SJeff Kirsher /* The chip-specific entries in the device structure. */ 1024f2148a47SJeff Kirsher dev->netdev_ops = &rhine_netdev_ops; 1025f2148a47SJeff Kirsher dev->ethtool_ops = &netdev_ethtool_ops, 1026f2148a47SJeff Kirsher dev->watchdog_timeo = TX_TIMEOUT; 1027f2148a47SJeff Kirsher 1028f2148a47SJeff Kirsher netif_napi_add(dev, &rp->napi, rhine_napipoll, 64); 1029f2148a47SJeff Kirsher 1030f2148a47SJeff Kirsher if (rp->quirks & rqRhineI) 1031f2148a47SJeff Kirsher dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; 1032f2148a47SJeff Kirsher 1033f2148a47SJeff Kirsher if (pdev->revision >= VT6105M) 1034f646968fSPatrick McHardy dev->features |= NETIF_F_HW_VLAN_CTAG_TX | 1035f646968fSPatrick McHardy NETIF_F_HW_VLAN_CTAG_RX | 1036f646968fSPatrick McHardy NETIF_F_HW_VLAN_CTAG_FILTER; 1037f2148a47SJeff Kirsher 1038f2148a47SJeff Kirsher /* dev->name not defined before register_netdev()! */ 1039f2148a47SJeff Kirsher rc = register_netdev(dev); 1040f2148a47SJeff Kirsher if (rc) 1041f2148a47SJeff Kirsher goto err_out_unmap; 1042f2148a47SJeff Kirsher 1043f2148a47SJeff Kirsher netdev_info(dev, "VIA %s at 0x%lx, %pM, IRQ %d\n", 1044f2148a47SJeff Kirsher name, 1045f2148a47SJeff Kirsher #ifdef USE_MMIO 1046f2148a47SJeff Kirsher memaddr, 1047f2148a47SJeff Kirsher #else 1048f2148a47SJeff Kirsher (long)ioaddr, 1049f2148a47SJeff Kirsher #endif 1050f2148a47SJeff Kirsher dev->dev_addr, pdev->irq); 1051f2148a47SJeff Kirsher 1052f2148a47SJeff Kirsher pci_set_drvdata(pdev, dev); 1053f2148a47SJeff Kirsher 1054f2148a47SJeff Kirsher { 1055f2148a47SJeff Kirsher u16 mii_cmd; 1056f2148a47SJeff Kirsher int mii_status = mdio_read(dev, phy_id, 1); 1057f2148a47SJeff Kirsher mii_cmd = mdio_read(dev, phy_id, MII_BMCR) & ~BMCR_ISOLATE; 1058f2148a47SJeff Kirsher mdio_write(dev, phy_id, MII_BMCR, mii_cmd); 1059f2148a47SJeff Kirsher if (mii_status != 0xffff && mii_status != 0x0000) { 1060f2148a47SJeff Kirsher rp->mii_if.advertising = mdio_read(dev, phy_id, 4); 1061f2148a47SJeff Kirsher netdev_info(dev, 1062f2148a47SJeff Kirsher "MII PHY found at address %d, status 0x%04x advertising %04x Link %04x\n", 1063f2148a47SJeff Kirsher phy_id, 1064f2148a47SJeff Kirsher mii_status, rp->mii_if.advertising, 1065f2148a47SJeff Kirsher mdio_read(dev, phy_id, 5)); 1066f2148a47SJeff Kirsher 1067f2148a47SJeff Kirsher /* set IFF_RUNNING */ 1068f2148a47SJeff Kirsher if (mii_status & BMSR_LSTATUS) 1069f2148a47SJeff Kirsher netif_carrier_on(dev); 1070f2148a47SJeff Kirsher else 1071f2148a47SJeff Kirsher netif_carrier_off(dev); 1072f2148a47SJeff Kirsher 1073f2148a47SJeff Kirsher } 1074f2148a47SJeff Kirsher } 1075f2148a47SJeff Kirsher rp->mii_if.phy_id = phy_id; 1076fc3e0f8aSFrancois Romieu if (avoid_D3) 1077fc3e0f8aSFrancois Romieu netif_info(rp, probe, dev, "No D3 power state at shutdown\n"); 1078f2148a47SJeff Kirsher 1079f2148a47SJeff Kirsher return 0; 1080f2148a47SJeff Kirsher 1081f2148a47SJeff Kirsher err_out_unmap: 1082f2148a47SJeff Kirsher pci_iounmap(pdev, ioaddr); 1083f2148a47SJeff Kirsher err_out_free_res: 1084f2148a47SJeff Kirsher pci_release_regions(pdev); 1085f2148a47SJeff Kirsher err_out_free_netdev: 1086f2148a47SJeff Kirsher free_netdev(dev); 1087*ae996154SRoger Luethi err_out_pci_disable: 1088*ae996154SRoger Luethi pci_disable_device(pdev); 1089f2148a47SJeff Kirsher err_out: 1090f2148a47SJeff Kirsher return rc; 1091f2148a47SJeff Kirsher } 1092f2148a47SJeff Kirsher 1093f2148a47SJeff Kirsher static int alloc_ring(struct net_device* dev) 1094f2148a47SJeff Kirsher { 1095f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1096f2148a47SJeff Kirsher void *ring; 1097f2148a47SJeff Kirsher dma_addr_t ring_dma; 1098f2148a47SJeff Kirsher 1099f2148a47SJeff Kirsher ring = pci_alloc_consistent(rp->pdev, 1100f2148a47SJeff Kirsher RX_RING_SIZE * sizeof(struct rx_desc) + 1101f2148a47SJeff Kirsher TX_RING_SIZE * sizeof(struct tx_desc), 1102f2148a47SJeff Kirsher &ring_dma); 1103f2148a47SJeff Kirsher if (!ring) { 1104f2148a47SJeff Kirsher netdev_err(dev, "Could not allocate DMA memory\n"); 1105f2148a47SJeff Kirsher return -ENOMEM; 1106f2148a47SJeff Kirsher } 1107f2148a47SJeff Kirsher if (rp->quirks & rqRhineI) { 1108f2148a47SJeff Kirsher rp->tx_bufs = pci_alloc_consistent(rp->pdev, 1109f2148a47SJeff Kirsher PKT_BUF_SZ * TX_RING_SIZE, 1110f2148a47SJeff Kirsher &rp->tx_bufs_dma); 1111f2148a47SJeff Kirsher if (rp->tx_bufs == NULL) { 1112f2148a47SJeff Kirsher pci_free_consistent(rp->pdev, 1113f2148a47SJeff Kirsher RX_RING_SIZE * sizeof(struct rx_desc) + 1114f2148a47SJeff Kirsher TX_RING_SIZE * sizeof(struct tx_desc), 1115f2148a47SJeff Kirsher ring, ring_dma); 1116f2148a47SJeff Kirsher return -ENOMEM; 1117f2148a47SJeff Kirsher } 1118f2148a47SJeff Kirsher } 1119f2148a47SJeff Kirsher 1120f2148a47SJeff Kirsher rp->rx_ring = ring; 1121f2148a47SJeff Kirsher rp->tx_ring = ring + RX_RING_SIZE * sizeof(struct rx_desc); 1122f2148a47SJeff Kirsher rp->rx_ring_dma = ring_dma; 1123f2148a47SJeff Kirsher rp->tx_ring_dma = ring_dma + RX_RING_SIZE * sizeof(struct rx_desc); 1124f2148a47SJeff Kirsher 1125f2148a47SJeff Kirsher return 0; 1126f2148a47SJeff Kirsher } 1127f2148a47SJeff Kirsher 1128f2148a47SJeff Kirsher static void free_ring(struct net_device* dev) 1129f2148a47SJeff Kirsher { 1130f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1131f2148a47SJeff Kirsher 1132f2148a47SJeff Kirsher pci_free_consistent(rp->pdev, 1133f2148a47SJeff Kirsher RX_RING_SIZE * sizeof(struct rx_desc) + 1134f2148a47SJeff Kirsher TX_RING_SIZE * sizeof(struct tx_desc), 1135f2148a47SJeff Kirsher rp->rx_ring, rp->rx_ring_dma); 1136f2148a47SJeff Kirsher rp->tx_ring = NULL; 1137f2148a47SJeff Kirsher 1138f2148a47SJeff Kirsher if (rp->tx_bufs) 1139f2148a47SJeff Kirsher pci_free_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE, 1140f2148a47SJeff Kirsher rp->tx_bufs, rp->tx_bufs_dma); 1141f2148a47SJeff Kirsher 1142f2148a47SJeff Kirsher rp->tx_bufs = NULL; 1143f2148a47SJeff Kirsher 1144f2148a47SJeff Kirsher } 1145f2148a47SJeff Kirsher 1146f2148a47SJeff Kirsher static void alloc_rbufs(struct net_device *dev) 1147f2148a47SJeff Kirsher { 1148f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1149f2148a47SJeff Kirsher dma_addr_t next; 1150f2148a47SJeff Kirsher int i; 1151f2148a47SJeff Kirsher 1152f2148a47SJeff Kirsher rp->dirty_rx = rp->cur_rx = 0; 1153f2148a47SJeff Kirsher 1154f2148a47SJeff Kirsher rp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); 1155f2148a47SJeff Kirsher rp->rx_head_desc = &rp->rx_ring[0]; 1156f2148a47SJeff Kirsher next = rp->rx_ring_dma; 1157f2148a47SJeff Kirsher 1158f2148a47SJeff Kirsher /* Init the ring entries */ 1159f2148a47SJeff Kirsher for (i = 0; i < RX_RING_SIZE; i++) { 1160f2148a47SJeff Kirsher rp->rx_ring[i].rx_status = 0; 1161f2148a47SJeff Kirsher rp->rx_ring[i].desc_length = cpu_to_le32(rp->rx_buf_sz); 1162f2148a47SJeff Kirsher next += sizeof(struct rx_desc); 1163f2148a47SJeff Kirsher rp->rx_ring[i].next_desc = cpu_to_le32(next); 1164f2148a47SJeff Kirsher rp->rx_skbuff[i] = NULL; 1165f2148a47SJeff Kirsher } 1166f2148a47SJeff Kirsher /* Mark the last entry as wrapping the ring. */ 1167f2148a47SJeff Kirsher rp->rx_ring[i-1].next_desc = cpu_to_le32(rp->rx_ring_dma); 1168f2148a47SJeff Kirsher 1169f2148a47SJeff Kirsher /* Fill in the Rx buffers. Handle allocation failure gracefully. */ 1170f2148a47SJeff Kirsher for (i = 0; i < RX_RING_SIZE; i++) { 1171f2148a47SJeff Kirsher struct sk_buff *skb = netdev_alloc_skb(dev, rp->rx_buf_sz); 1172f2148a47SJeff Kirsher rp->rx_skbuff[i] = skb; 1173f2148a47SJeff Kirsher if (skb == NULL) 1174f2148a47SJeff Kirsher break; 1175f2148a47SJeff Kirsher 1176f2148a47SJeff Kirsher rp->rx_skbuff_dma[i] = 1177f2148a47SJeff Kirsher pci_map_single(rp->pdev, skb->data, rp->rx_buf_sz, 1178f2148a47SJeff Kirsher PCI_DMA_FROMDEVICE); 11799b4fe5fbSNeil Horman if (dma_mapping_error(&rp->pdev->dev, rp->rx_skbuff_dma[i])) { 11809b4fe5fbSNeil Horman rp->rx_skbuff_dma[i] = 0; 11819b4fe5fbSNeil Horman dev_kfree_skb(skb); 11829b4fe5fbSNeil Horman break; 11839b4fe5fbSNeil Horman } 1184f2148a47SJeff Kirsher rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]); 1185f2148a47SJeff Kirsher rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn); 1186f2148a47SJeff Kirsher } 1187f2148a47SJeff Kirsher rp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); 1188f2148a47SJeff Kirsher } 1189f2148a47SJeff Kirsher 1190f2148a47SJeff Kirsher static void free_rbufs(struct net_device* dev) 1191f2148a47SJeff Kirsher { 1192f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1193f2148a47SJeff Kirsher int i; 1194f2148a47SJeff Kirsher 1195f2148a47SJeff Kirsher /* Free all the skbuffs in the Rx queue. */ 1196f2148a47SJeff Kirsher for (i = 0; i < RX_RING_SIZE; i++) { 1197f2148a47SJeff Kirsher rp->rx_ring[i].rx_status = 0; 1198f2148a47SJeff Kirsher rp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ 1199f2148a47SJeff Kirsher if (rp->rx_skbuff[i]) { 1200f2148a47SJeff Kirsher pci_unmap_single(rp->pdev, 1201f2148a47SJeff Kirsher rp->rx_skbuff_dma[i], 1202f2148a47SJeff Kirsher rp->rx_buf_sz, PCI_DMA_FROMDEVICE); 1203f2148a47SJeff Kirsher dev_kfree_skb(rp->rx_skbuff[i]); 1204f2148a47SJeff Kirsher } 1205f2148a47SJeff Kirsher rp->rx_skbuff[i] = NULL; 1206f2148a47SJeff Kirsher } 1207f2148a47SJeff Kirsher } 1208f2148a47SJeff Kirsher 1209f2148a47SJeff Kirsher static void alloc_tbufs(struct net_device* dev) 1210f2148a47SJeff Kirsher { 1211f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1212f2148a47SJeff Kirsher dma_addr_t next; 1213f2148a47SJeff Kirsher int i; 1214f2148a47SJeff Kirsher 1215f2148a47SJeff Kirsher rp->dirty_tx = rp->cur_tx = 0; 1216f2148a47SJeff Kirsher next = rp->tx_ring_dma; 1217f2148a47SJeff Kirsher for (i = 0; i < TX_RING_SIZE; i++) { 1218f2148a47SJeff Kirsher rp->tx_skbuff[i] = NULL; 1219f2148a47SJeff Kirsher rp->tx_ring[i].tx_status = 0; 1220f2148a47SJeff Kirsher rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); 1221f2148a47SJeff Kirsher next += sizeof(struct tx_desc); 1222f2148a47SJeff Kirsher rp->tx_ring[i].next_desc = cpu_to_le32(next); 1223f2148a47SJeff Kirsher if (rp->quirks & rqRhineI) 1224f2148a47SJeff Kirsher rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; 1225f2148a47SJeff Kirsher } 1226f2148a47SJeff Kirsher rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma); 1227f2148a47SJeff Kirsher 1228f2148a47SJeff Kirsher } 1229f2148a47SJeff Kirsher 1230f2148a47SJeff Kirsher static void free_tbufs(struct net_device* dev) 1231f2148a47SJeff Kirsher { 1232f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1233f2148a47SJeff Kirsher int i; 1234f2148a47SJeff Kirsher 1235f2148a47SJeff Kirsher for (i = 0; i < TX_RING_SIZE; i++) { 1236f2148a47SJeff Kirsher rp->tx_ring[i].tx_status = 0; 1237f2148a47SJeff Kirsher rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); 1238f2148a47SJeff Kirsher rp->tx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ 1239f2148a47SJeff Kirsher if (rp->tx_skbuff[i]) { 1240f2148a47SJeff Kirsher if (rp->tx_skbuff_dma[i]) { 1241f2148a47SJeff Kirsher pci_unmap_single(rp->pdev, 1242f2148a47SJeff Kirsher rp->tx_skbuff_dma[i], 1243f2148a47SJeff Kirsher rp->tx_skbuff[i]->len, 1244f2148a47SJeff Kirsher PCI_DMA_TODEVICE); 1245f2148a47SJeff Kirsher } 1246f2148a47SJeff Kirsher dev_kfree_skb(rp->tx_skbuff[i]); 1247f2148a47SJeff Kirsher } 1248f2148a47SJeff Kirsher rp->tx_skbuff[i] = NULL; 1249f2148a47SJeff Kirsher rp->tx_buf[i] = NULL; 1250f2148a47SJeff Kirsher } 1251f2148a47SJeff Kirsher } 1252f2148a47SJeff Kirsher 1253f2148a47SJeff Kirsher static void rhine_check_media(struct net_device *dev, unsigned int init_media) 1254f2148a47SJeff Kirsher { 1255f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1256f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1257f2148a47SJeff Kirsher 1258fc3e0f8aSFrancois Romieu mii_check_media(&rp->mii_if, netif_msg_link(rp), init_media); 1259f2148a47SJeff Kirsher 1260f2148a47SJeff Kirsher if (rp->mii_if.full_duplex) 1261f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1FDuplex, 1262f2148a47SJeff Kirsher ioaddr + ChipCmd1); 1263f2148a47SJeff Kirsher else 1264f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ChipCmd1) & ~Cmd1FDuplex, 1265f2148a47SJeff Kirsher ioaddr + ChipCmd1); 1266fc3e0f8aSFrancois Romieu 1267fc3e0f8aSFrancois Romieu netif_info(rp, link, dev, "force_media %d, carrier %d\n", 1268f2148a47SJeff Kirsher rp->mii_if.force_media, netif_carrier_ok(dev)); 1269f2148a47SJeff Kirsher } 1270f2148a47SJeff Kirsher 1271f2148a47SJeff Kirsher /* Called after status of force_media possibly changed */ 1272f2148a47SJeff Kirsher static void rhine_set_carrier(struct mii_if_info *mii) 1273f2148a47SJeff Kirsher { 1274fc3e0f8aSFrancois Romieu struct net_device *dev = mii->dev; 1275fc3e0f8aSFrancois Romieu struct rhine_private *rp = netdev_priv(dev); 1276fc3e0f8aSFrancois Romieu 1277f2148a47SJeff Kirsher if (mii->force_media) { 1278f2148a47SJeff Kirsher /* autoneg is off: Link is always assumed to be up */ 1279fc3e0f8aSFrancois Romieu if (!netif_carrier_ok(dev)) 1280fc3e0f8aSFrancois Romieu netif_carrier_on(dev); 1281fc3e0f8aSFrancois Romieu } else /* Let MMI library update carrier status */ 1282fc3e0f8aSFrancois Romieu rhine_check_media(dev, 0); 1283fc3e0f8aSFrancois Romieu 1284fc3e0f8aSFrancois Romieu netif_info(rp, link, dev, "force_media %d, carrier %d\n", 1285fc3e0f8aSFrancois Romieu mii->force_media, netif_carrier_ok(dev)); 1286f2148a47SJeff Kirsher } 1287f2148a47SJeff Kirsher 1288f2148a47SJeff Kirsher /** 1289f2148a47SJeff Kirsher * rhine_set_cam - set CAM multicast filters 1290f2148a47SJeff Kirsher * @ioaddr: register block of this Rhine 1291f2148a47SJeff Kirsher * @idx: multicast CAM index [0..MCAM_SIZE-1] 1292f2148a47SJeff Kirsher * @addr: multicast address (6 bytes) 1293f2148a47SJeff Kirsher * 1294f2148a47SJeff Kirsher * Load addresses into multicast filters. 1295f2148a47SJeff Kirsher */ 1296f2148a47SJeff Kirsher static void rhine_set_cam(void __iomem *ioaddr, int idx, u8 *addr) 1297f2148a47SJeff Kirsher { 1298f2148a47SJeff Kirsher int i; 1299f2148a47SJeff Kirsher 1300f2148a47SJeff Kirsher iowrite8(CAMC_CAMEN, ioaddr + CamCon); 1301f2148a47SJeff Kirsher wmb(); 1302f2148a47SJeff Kirsher 1303f2148a47SJeff Kirsher /* Paranoid -- idx out of range should never happen */ 1304f2148a47SJeff Kirsher idx &= (MCAM_SIZE - 1); 1305f2148a47SJeff Kirsher 1306f2148a47SJeff Kirsher iowrite8((u8) idx, ioaddr + CamAddr); 1307f2148a47SJeff Kirsher 1308f2148a47SJeff Kirsher for (i = 0; i < 6; i++, addr++) 1309f2148a47SJeff Kirsher iowrite8(*addr, ioaddr + MulticastFilter0 + i); 1310f2148a47SJeff Kirsher udelay(10); 1311f2148a47SJeff Kirsher wmb(); 1312f2148a47SJeff Kirsher 1313f2148a47SJeff Kirsher iowrite8(CAMC_CAMWR | CAMC_CAMEN, ioaddr + CamCon); 1314f2148a47SJeff Kirsher udelay(10); 1315f2148a47SJeff Kirsher 1316f2148a47SJeff Kirsher iowrite8(0, ioaddr + CamCon); 1317f2148a47SJeff Kirsher } 1318f2148a47SJeff Kirsher 1319f2148a47SJeff Kirsher /** 1320f2148a47SJeff Kirsher * rhine_set_vlan_cam - set CAM VLAN filters 1321f2148a47SJeff Kirsher * @ioaddr: register block of this Rhine 1322f2148a47SJeff Kirsher * @idx: VLAN CAM index [0..VCAM_SIZE-1] 1323f2148a47SJeff Kirsher * @addr: VLAN ID (2 bytes) 1324f2148a47SJeff Kirsher * 1325f2148a47SJeff Kirsher * Load addresses into VLAN filters. 1326f2148a47SJeff Kirsher */ 1327f2148a47SJeff Kirsher static void rhine_set_vlan_cam(void __iomem *ioaddr, int idx, u8 *addr) 1328f2148a47SJeff Kirsher { 1329f2148a47SJeff Kirsher iowrite8(CAMC_CAMEN | CAMC_VCAMSL, ioaddr + CamCon); 1330f2148a47SJeff Kirsher wmb(); 1331f2148a47SJeff Kirsher 1332f2148a47SJeff Kirsher /* Paranoid -- idx out of range should never happen */ 1333f2148a47SJeff Kirsher idx &= (VCAM_SIZE - 1); 1334f2148a47SJeff Kirsher 1335f2148a47SJeff Kirsher iowrite8((u8) idx, ioaddr + CamAddr); 1336f2148a47SJeff Kirsher 1337f2148a47SJeff Kirsher iowrite16(*((u16 *) addr), ioaddr + MulticastFilter0 + 6); 1338f2148a47SJeff Kirsher udelay(10); 1339f2148a47SJeff Kirsher wmb(); 1340f2148a47SJeff Kirsher 1341f2148a47SJeff Kirsher iowrite8(CAMC_CAMWR | CAMC_CAMEN, ioaddr + CamCon); 1342f2148a47SJeff Kirsher udelay(10); 1343f2148a47SJeff Kirsher 1344f2148a47SJeff Kirsher iowrite8(0, ioaddr + CamCon); 1345f2148a47SJeff Kirsher } 1346f2148a47SJeff Kirsher 1347f2148a47SJeff Kirsher /** 1348f2148a47SJeff Kirsher * rhine_set_cam_mask - set multicast CAM mask 1349f2148a47SJeff Kirsher * @ioaddr: register block of this Rhine 1350f2148a47SJeff Kirsher * @mask: multicast CAM mask 1351f2148a47SJeff Kirsher * 1352f2148a47SJeff Kirsher * Mask sets multicast filters active/inactive. 1353f2148a47SJeff Kirsher */ 1354f2148a47SJeff Kirsher static void rhine_set_cam_mask(void __iomem *ioaddr, u32 mask) 1355f2148a47SJeff Kirsher { 1356f2148a47SJeff Kirsher iowrite8(CAMC_CAMEN, ioaddr + CamCon); 1357f2148a47SJeff Kirsher wmb(); 1358f2148a47SJeff Kirsher 1359f2148a47SJeff Kirsher /* write mask */ 1360f2148a47SJeff Kirsher iowrite32(mask, ioaddr + CamMask); 1361f2148a47SJeff Kirsher 1362f2148a47SJeff Kirsher /* disable CAMEN */ 1363f2148a47SJeff Kirsher iowrite8(0, ioaddr + CamCon); 1364f2148a47SJeff Kirsher } 1365f2148a47SJeff Kirsher 1366f2148a47SJeff Kirsher /** 1367f2148a47SJeff Kirsher * rhine_set_vlan_cam_mask - set VLAN CAM mask 1368f2148a47SJeff Kirsher * @ioaddr: register block of this Rhine 1369f2148a47SJeff Kirsher * @mask: VLAN CAM mask 1370f2148a47SJeff Kirsher * 1371f2148a47SJeff Kirsher * Mask sets VLAN filters active/inactive. 1372f2148a47SJeff Kirsher */ 1373f2148a47SJeff Kirsher static void rhine_set_vlan_cam_mask(void __iomem *ioaddr, u32 mask) 1374f2148a47SJeff Kirsher { 1375f2148a47SJeff Kirsher iowrite8(CAMC_CAMEN | CAMC_VCAMSL, ioaddr + CamCon); 1376f2148a47SJeff Kirsher wmb(); 1377f2148a47SJeff Kirsher 1378f2148a47SJeff Kirsher /* write mask */ 1379f2148a47SJeff Kirsher iowrite32(mask, ioaddr + CamMask); 1380f2148a47SJeff Kirsher 1381f2148a47SJeff Kirsher /* disable CAMEN */ 1382f2148a47SJeff Kirsher iowrite8(0, ioaddr + CamCon); 1383f2148a47SJeff Kirsher } 1384f2148a47SJeff Kirsher 1385f2148a47SJeff Kirsher /** 1386f2148a47SJeff Kirsher * rhine_init_cam_filter - initialize CAM filters 1387f2148a47SJeff Kirsher * @dev: network device 1388f2148a47SJeff Kirsher * 1389f2148a47SJeff Kirsher * Initialize (disable) hardware VLAN and multicast support on this 1390f2148a47SJeff Kirsher * Rhine. 1391f2148a47SJeff Kirsher */ 1392f2148a47SJeff Kirsher static void rhine_init_cam_filter(struct net_device *dev) 1393f2148a47SJeff Kirsher { 1394f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1395f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1396f2148a47SJeff Kirsher 1397f2148a47SJeff Kirsher /* Disable all CAMs */ 1398f2148a47SJeff Kirsher rhine_set_vlan_cam_mask(ioaddr, 0); 1399f2148a47SJeff Kirsher rhine_set_cam_mask(ioaddr, 0); 1400f2148a47SJeff Kirsher 1401f2148a47SJeff Kirsher /* disable hardware VLAN support */ 1402f2148a47SJeff Kirsher BYTE_REG_BITS_ON(TCR_PQEN, ioaddr + TxConfig); 1403f2148a47SJeff Kirsher BYTE_REG_BITS_OFF(BCR1_VIDFR, ioaddr + PCIBusConfig1); 1404f2148a47SJeff Kirsher } 1405f2148a47SJeff Kirsher 1406f2148a47SJeff Kirsher /** 1407f2148a47SJeff Kirsher * rhine_update_vcam - update VLAN CAM filters 1408f2148a47SJeff Kirsher * @rp: rhine_private data of this Rhine 1409f2148a47SJeff Kirsher * 1410f2148a47SJeff Kirsher * Update VLAN CAM filters to match configuration change. 1411f2148a47SJeff Kirsher */ 1412f2148a47SJeff Kirsher static void rhine_update_vcam(struct net_device *dev) 1413f2148a47SJeff Kirsher { 1414f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1415f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1416f2148a47SJeff Kirsher u16 vid; 1417f2148a47SJeff Kirsher u32 vCAMmask = 0; /* 32 vCAMs (6105M and better) */ 1418f2148a47SJeff Kirsher unsigned int i = 0; 1419f2148a47SJeff Kirsher 1420f2148a47SJeff Kirsher for_each_set_bit(vid, rp->active_vlans, VLAN_N_VID) { 1421f2148a47SJeff Kirsher rhine_set_vlan_cam(ioaddr, i, (u8 *)&vid); 1422f2148a47SJeff Kirsher vCAMmask |= 1 << i; 1423f2148a47SJeff Kirsher if (++i >= VCAM_SIZE) 1424f2148a47SJeff Kirsher break; 1425f2148a47SJeff Kirsher } 1426f2148a47SJeff Kirsher rhine_set_vlan_cam_mask(ioaddr, vCAMmask); 1427f2148a47SJeff Kirsher } 1428f2148a47SJeff Kirsher 142980d5c368SPatrick McHardy static int rhine_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid) 1430f2148a47SJeff Kirsher { 1431f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1432f2148a47SJeff Kirsher 14337ab87ff4SFrancois Romieu spin_lock_bh(&rp->lock); 1434f2148a47SJeff Kirsher set_bit(vid, rp->active_vlans); 1435f2148a47SJeff Kirsher rhine_update_vcam(dev); 14367ab87ff4SFrancois Romieu spin_unlock_bh(&rp->lock); 14378e586137SJiri Pirko return 0; 1438f2148a47SJeff Kirsher } 1439f2148a47SJeff Kirsher 144080d5c368SPatrick McHardy static int rhine_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid) 1441f2148a47SJeff Kirsher { 1442f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1443f2148a47SJeff Kirsher 14447ab87ff4SFrancois Romieu spin_lock_bh(&rp->lock); 1445f2148a47SJeff Kirsher clear_bit(vid, rp->active_vlans); 1446f2148a47SJeff Kirsher rhine_update_vcam(dev); 14477ab87ff4SFrancois Romieu spin_unlock_bh(&rp->lock); 14488e586137SJiri Pirko return 0; 1449f2148a47SJeff Kirsher } 1450f2148a47SJeff Kirsher 1451f2148a47SJeff Kirsher static void init_registers(struct net_device *dev) 1452f2148a47SJeff Kirsher { 1453f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1454f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1455f2148a47SJeff Kirsher int i; 1456f2148a47SJeff Kirsher 1457f2148a47SJeff Kirsher for (i = 0; i < 6; i++) 1458f2148a47SJeff Kirsher iowrite8(dev->dev_addr[i], ioaddr + StationAddr + i); 1459f2148a47SJeff Kirsher 1460f2148a47SJeff Kirsher /* Initialize other registers. */ 1461f2148a47SJeff Kirsher iowrite16(0x0006, ioaddr + PCIBusConfig); /* Tune configuration??? */ 1462f2148a47SJeff Kirsher /* Configure initial FIFO thresholds. */ 1463f2148a47SJeff Kirsher iowrite8(0x20, ioaddr + TxConfig); 1464f2148a47SJeff Kirsher rp->tx_thresh = 0x20; 1465f2148a47SJeff Kirsher rp->rx_thresh = 0x60; /* Written in rhine_set_rx_mode(). */ 1466f2148a47SJeff Kirsher 1467f2148a47SJeff Kirsher iowrite32(rp->rx_ring_dma, ioaddr + RxRingPtr); 1468f2148a47SJeff Kirsher iowrite32(rp->tx_ring_dma, ioaddr + TxRingPtr); 1469f2148a47SJeff Kirsher 1470f2148a47SJeff Kirsher rhine_set_rx_mode(dev); 1471f2148a47SJeff Kirsher 1472f2148a47SJeff Kirsher if (rp->pdev->revision >= VT6105M) 1473f2148a47SJeff Kirsher rhine_init_cam_filter(dev); 1474f2148a47SJeff Kirsher 1475f2148a47SJeff Kirsher napi_enable(&rp->napi); 1476f2148a47SJeff Kirsher 14777ab87ff4SFrancois Romieu iowrite16(RHINE_EVENT & 0xffff, ioaddr + IntrEnable); 1478f2148a47SJeff Kirsher 1479f2148a47SJeff Kirsher iowrite16(CmdStart | CmdTxOn | CmdRxOn | (Cmd1NoTxPoll << 8), 1480f2148a47SJeff Kirsher ioaddr + ChipCmd); 1481f2148a47SJeff Kirsher rhine_check_media(dev, 1); 1482f2148a47SJeff Kirsher } 1483f2148a47SJeff Kirsher 1484f2148a47SJeff Kirsher /* Enable MII link status auto-polling (required for IntrLinkChange) */ 1485a384a33bSFrancois Romieu static void rhine_enable_linkmon(struct rhine_private *rp) 1486f2148a47SJeff Kirsher { 1487a384a33bSFrancois Romieu void __iomem *ioaddr = rp->base; 1488a384a33bSFrancois Romieu 1489f2148a47SJeff Kirsher iowrite8(0, ioaddr + MIICmd); 1490f2148a47SJeff Kirsher iowrite8(MII_BMSR, ioaddr + MIIRegAddr); 1491f2148a47SJeff Kirsher iowrite8(0x80, ioaddr + MIICmd); 1492f2148a47SJeff Kirsher 1493a384a33bSFrancois Romieu rhine_wait_bit_high(rp, MIIRegAddr, 0x20); 1494f2148a47SJeff Kirsher 1495f2148a47SJeff Kirsher iowrite8(MII_BMSR | 0x40, ioaddr + MIIRegAddr); 1496f2148a47SJeff Kirsher } 1497f2148a47SJeff Kirsher 1498f2148a47SJeff Kirsher /* Disable MII link status auto-polling (required for MDIO access) */ 1499a384a33bSFrancois Romieu static void rhine_disable_linkmon(struct rhine_private *rp) 1500f2148a47SJeff Kirsher { 1501a384a33bSFrancois Romieu void __iomem *ioaddr = rp->base; 1502a384a33bSFrancois Romieu 1503f2148a47SJeff Kirsher iowrite8(0, ioaddr + MIICmd); 1504f2148a47SJeff Kirsher 1505a384a33bSFrancois Romieu if (rp->quirks & rqRhineI) { 1506f2148a47SJeff Kirsher iowrite8(0x01, ioaddr + MIIRegAddr); // MII_BMSR 1507f2148a47SJeff Kirsher 1508f2148a47SJeff Kirsher /* Can be called from ISR. Evil. */ 1509f2148a47SJeff Kirsher mdelay(1); 1510f2148a47SJeff Kirsher 1511f2148a47SJeff Kirsher /* 0x80 must be set immediately before turning it off */ 1512f2148a47SJeff Kirsher iowrite8(0x80, ioaddr + MIICmd); 1513f2148a47SJeff Kirsher 1514a384a33bSFrancois Romieu rhine_wait_bit_high(rp, MIIRegAddr, 0x20); 1515f2148a47SJeff Kirsher 1516f2148a47SJeff Kirsher /* Heh. Now clear 0x80 again. */ 1517f2148a47SJeff Kirsher iowrite8(0, ioaddr + MIICmd); 1518f2148a47SJeff Kirsher } 1519f2148a47SJeff Kirsher else 1520a384a33bSFrancois Romieu rhine_wait_bit_high(rp, MIIRegAddr, 0x80); 1521f2148a47SJeff Kirsher } 1522f2148a47SJeff Kirsher 1523f2148a47SJeff Kirsher /* Read and write over the MII Management Data I/O (MDIO) interface. */ 1524f2148a47SJeff Kirsher 1525f2148a47SJeff Kirsher static int mdio_read(struct net_device *dev, int phy_id, int regnum) 1526f2148a47SJeff Kirsher { 1527f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1528f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1529f2148a47SJeff Kirsher int result; 1530f2148a47SJeff Kirsher 1531a384a33bSFrancois Romieu rhine_disable_linkmon(rp); 1532f2148a47SJeff Kirsher 1533f2148a47SJeff Kirsher /* rhine_disable_linkmon already cleared MIICmd */ 1534f2148a47SJeff Kirsher iowrite8(phy_id, ioaddr + MIIPhyAddr); 1535f2148a47SJeff Kirsher iowrite8(regnum, ioaddr + MIIRegAddr); 1536f2148a47SJeff Kirsher iowrite8(0x40, ioaddr + MIICmd); /* Trigger read */ 1537a384a33bSFrancois Romieu rhine_wait_bit_low(rp, MIICmd, 0x40); 1538f2148a47SJeff Kirsher result = ioread16(ioaddr + MIIData); 1539f2148a47SJeff Kirsher 1540a384a33bSFrancois Romieu rhine_enable_linkmon(rp); 1541f2148a47SJeff Kirsher return result; 1542f2148a47SJeff Kirsher } 1543f2148a47SJeff Kirsher 1544f2148a47SJeff Kirsher static void mdio_write(struct net_device *dev, int phy_id, int regnum, int value) 1545f2148a47SJeff Kirsher { 1546f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1547f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1548f2148a47SJeff Kirsher 1549a384a33bSFrancois Romieu rhine_disable_linkmon(rp); 1550f2148a47SJeff Kirsher 1551f2148a47SJeff Kirsher /* rhine_disable_linkmon already cleared MIICmd */ 1552f2148a47SJeff Kirsher iowrite8(phy_id, ioaddr + MIIPhyAddr); 1553f2148a47SJeff Kirsher iowrite8(regnum, ioaddr + MIIRegAddr); 1554f2148a47SJeff Kirsher iowrite16(value, ioaddr + MIIData); 1555f2148a47SJeff Kirsher iowrite8(0x20, ioaddr + MIICmd); /* Trigger write */ 1556a384a33bSFrancois Romieu rhine_wait_bit_low(rp, MIICmd, 0x20); 1557f2148a47SJeff Kirsher 1558a384a33bSFrancois Romieu rhine_enable_linkmon(rp); 1559f2148a47SJeff Kirsher } 1560f2148a47SJeff Kirsher 15617ab87ff4SFrancois Romieu static void rhine_task_disable(struct rhine_private *rp) 15627ab87ff4SFrancois Romieu { 15637ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 15647ab87ff4SFrancois Romieu rp->task_enable = false; 15657ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 15667ab87ff4SFrancois Romieu 15677ab87ff4SFrancois Romieu cancel_work_sync(&rp->slow_event_task); 15687ab87ff4SFrancois Romieu cancel_work_sync(&rp->reset_task); 15697ab87ff4SFrancois Romieu } 15707ab87ff4SFrancois Romieu 15717ab87ff4SFrancois Romieu static void rhine_task_enable(struct rhine_private *rp) 15727ab87ff4SFrancois Romieu { 15737ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 15747ab87ff4SFrancois Romieu rp->task_enable = true; 15757ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 15767ab87ff4SFrancois Romieu } 15777ab87ff4SFrancois Romieu 1578f2148a47SJeff Kirsher static int rhine_open(struct net_device *dev) 1579f2148a47SJeff Kirsher { 1580f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1581f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1582f2148a47SJeff Kirsher int rc; 1583f2148a47SJeff Kirsher 1584f2148a47SJeff Kirsher rc = request_irq(rp->pdev->irq, rhine_interrupt, IRQF_SHARED, dev->name, 1585f2148a47SJeff Kirsher dev); 1586f2148a47SJeff Kirsher if (rc) 1587f2148a47SJeff Kirsher return rc; 1588f2148a47SJeff Kirsher 1589fc3e0f8aSFrancois Romieu netif_dbg(rp, ifup, dev, "%s() irq %d\n", __func__, rp->pdev->irq); 1590f2148a47SJeff Kirsher 1591f2148a47SJeff Kirsher rc = alloc_ring(dev); 1592f2148a47SJeff Kirsher if (rc) { 1593f2148a47SJeff Kirsher free_irq(rp->pdev->irq, dev); 1594f2148a47SJeff Kirsher return rc; 1595f2148a47SJeff Kirsher } 1596f2148a47SJeff Kirsher alloc_rbufs(dev); 1597f2148a47SJeff Kirsher alloc_tbufs(dev); 1598f2148a47SJeff Kirsher rhine_chip_reset(dev); 15997ab87ff4SFrancois Romieu rhine_task_enable(rp); 1600f2148a47SJeff Kirsher init_registers(dev); 1601fc3e0f8aSFrancois Romieu 1602fc3e0f8aSFrancois Romieu netif_dbg(rp, ifup, dev, "%s() Done - status %04x MII status: %04x\n", 1603f2148a47SJeff Kirsher __func__, ioread16(ioaddr + ChipCmd), 1604f2148a47SJeff Kirsher mdio_read(dev, rp->mii_if.phy_id, MII_BMSR)); 1605f2148a47SJeff Kirsher 1606f2148a47SJeff Kirsher netif_start_queue(dev); 1607f2148a47SJeff Kirsher 1608f2148a47SJeff Kirsher return 0; 1609f2148a47SJeff Kirsher } 1610f2148a47SJeff Kirsher 1611f2148a47SJeff Kirsher static void rhine_reset_task(struct work_struct *work) 1612f2148a47SJeff Kirsher { 1613f2148a47SJeff Kirsher struct rhine_private *rp = container_of(work, struct rhine_private, 1614f2148a47SJeff Kirsher reset_task); 1615f2148a47SJeff Kirsher struct net_device *dev = rp->dev; 1616f2148a47SJeff Kirsher 16177ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 16187ab87ff4SFrancois Romieu 16197ab87ff4SFrancois Romieu if (!rp->task_enable) 16207ab87ff4SFrancois Romieu goto out_unlock; 1621f2148a47SJeff Kirsher 1622f2148a47SJeff Kirsher napi_disable(&rp->napi); 1623a926592fSRichard Weinberger netif_tx_disable(dev); 1624f2148a47SJeff Kirsher spin_lock_bh(&rp->lock); 1625f2148a47SJeff Kirsher 1626f2148a47SJeff Kirsher /* clear all descriptors */ 1627f2148a47SJeff Kirsher free_tbufs(dev); 1628f2148a47SJeff Kirsher free_rbufs(dev); 1629f2148a47SJeff Kirsher alloc_tbufs(dev); 1630f2148a47SJeff Kirsher alloc_rbufs(dev); 1631f2148a47SJeff Kirsher 1632f2148a47SJeff Kirsher /* Reinitialize the hardware. */ 1633f2148a47SJeff Kirsher rhine_chip_reset(dev); 1634f2148a47SJeff Kirsher init_registers(dev); 1635f2148a47SJeff Kirsher 1636f2148a47SJeff Kirsher spin_unlock_bh(&rp->lock); 1637f2148a47SJeff Kirsher 1638f2148a47SJeff Kirsher dev->trans_start = jiffies; /* prevent tx timeout */ 1639f2148a47SJeff Kirsher dev->stats.tx_errors++; 1640f2148a47SJeff Kirsher netif_wake_queue(dev); 16417ab87ff4SFrancois Romieu 16427ab87ff4SFrancois Romieu out_unlock: 16437ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 1644f2148a47SJeff Kirsher } 1645f2148a47SJeff Kirsher 1646f2148a47SJeff Kirsher static void rhine_tx_timeout(struct net_device *dev) 1647f2148a47SJeff Kirsher { 1648f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1649f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1650f2148a47SJeff Kirsher 1651f2148a47SJeff Kirsher netdev_warn(dev, "Transmit timed out, status %04x, PHY status %04x, resetting...\n", 1652f2148a47SJeff Kirsher ioread16(ioaddr + IntrStatus), 1653f2148a47SJeff Kirsher mdio_read(dev, rp->mii_if.phy_id, MII_BMSR)); 1654f2148a47SJeff Kirsher 1655f2148a47SJeff Kirsher schedule_work(&rp->reset_task); 1656f2148a47SJeff Kirsher } 1657f2148a47SJeff Kirsher 1658f2148a47SJeff Kirsher static netdev_tx_t rhine_start_tx(struct sk_buff *skb, 1659f2148a47SJeff Kirsher struct net_device *dev) 1660f2148a47SJeff Kirsher { 1661f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1662f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 1663f2148a47SJeff Kirsher unsigned entry; 1664f2148a47SJeff Kirsher 1665f2148a47SJeff Kirsher /* Caution: the write order is important here, set the field 1666f2148a47SJeff Kirsher with the "ownership" bits last. */ 1667f2148a47SJeff Kirsher 1668f2148a47SJeff Kirsher /* Calculate the next Tx descriptor entry. */ 1669f2148a47SJeff Kirsher entry = rp->cur_tx % TX_RING_SIZE; 1670f2148a47SJeff Kirsher 1671f2148a47SJeff Kirsher if (skb_padto(skb, ETH_ZLEN)) 1672f2148a47SJeff Kirsher return NETDEV_TX_OK; 1673f2148a47SJeff Kirsher 1674f2148a47SJeff Kirsher rp->tx_skbuff[entry] = skb; 1675f2148a47SJeff Kirsher 1676f2148a47SJeff Kirsher if ((rp->quirks & rqRhineI) && 1677f2148a47SJeff Kirsher (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_PARTIAL)) { 1678f2148a47SJeff Kirsher /* Must use alignment buffer. */ 1679f2148a47SJeff Kirsher if (skb->len > PKT_BUF_SZ) { 1680f2148a47SJeff Kirsher /* packet too long, drop it */ 1681f2148a47SJeff Kirsher dev_kfree_skb(skb); 1682f2148a47SJeff Kirsher rp->tx_skbuff[entry] = NULL; 1683f2148a47SJeff Kirsher dev->stats.tx_dropped++; 1684f2148a47SJeff Kirsher return NETDEV_TX_OK; 1685f2148a47SJeff Kirsher } 1686f2148a47SJeff Kirsher 1687f2148a47SJeff Kirsher /* Padding is not copied and so must be redone. */ 1688f2148a47SJeff Kirsher skb_copy_and_csum_dev(skb, rp->tx_buf[entry]); 1689f2148a47SJeff Kirsher if (skb->len < ETH_ZLEN) 1690f2148a47SJeff Kirsher memset(rp->tx_buf[entry] + skb->len, 0, 1691f2148a47SJeff Kirsher ETH_ZLEN - skb->len); 1692f2148a47SJeff Kirsher rp->tx_skbuff_dma[entry] = 0; 1693f2148a47SJeff Kirsher rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma + 1694f2148a47SJeff Kirsher (rp->tx_buf[entry] - 1695f2148a47SJeff Kirsher rp->tx_bufs)); 1696f2148a47SJeff Kirsher } else { 1697f2148a47SJeff Kirsher rp->tx_skbuff_dma[entry] = 1698f2148a47SJeff Kirsher pci_map_single(rp->pdev, skb->data, skb->len, 1699f2148a47SJeff Kirsher PCI_DMA_TODEVICE); 17009b4fe5fbSNeil Horman if (dma_mapping_error(&rp->pdev->dev, rp->tx_skbuff_dma[entry])) { 17019b4fe5fbSNeil Horman dev_kfree_skb(skb); 17029b4fe5fbSNeil Horman rp->tx_skbuff_dma[entry] = 0; 17039b4fe5fbSNeil Horman dev->stats.tx_dropped++; 17049b4fe5fbSNeil Horman return NETDEV_TX_OK; 17059b4fe5fbSNeil Horman } 1706f2148a47SJeff Kirsher rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]); 1707f2148a47SJeff Kirsher } 1708f2148a47SJeff Kirsher 1709f2148a47SJeff Kirsher rp->tx_ring[entry].desc_length = 1710f2148a47SJeff Kirsher cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); 1711f2148a47SJeff Kirsher 1712f2148a47SJeff Kirsher if (unlikely(vlan_tx_tag_present(skb))) { 1713207070f5SRoger Luethi u16 vid_pcp = vlan_tx_tag_get(skb); 1714207070f5SRoger Luethi 1715207070f5SRoger Luethi /* drop CFI/DEI bit, register needs VID and PCP */ 1716207070f5SRoger Luethi vid_pcp = (vid_pcp & VLAN_VID_MASK) | 1717207070f5SRoger Luethi ((vid_pcp & VLAN_PRIO_MASK) >> 1); 1718207070f5SRoger Luethi rp->tx_ring[entry].tx_status = cpu_to_le32((vid_pcp) << 16); 1719f2148a47SJeff Kirsher /* request tagging */ 1720f2148a47SJeff Kirsher rp->tx_ring[entry].desc_length |= cpu_to_le32(0x020000); 1721f2148a47SJeff Kirsher } 1722f2148a47SJeff Kirsher else 1723f2148a47SJeff Kirsher rp->tx_ring[entry].tx_status = 0; 1724f2148a47SJeff Kirsher 1725f2148a47SJeff Kirsher /* lock eth irq */ 1726f2148a47SJeff Kirsher wmb(); 1727f2148a47SJeff Kirsher rp->tx_ring[entry].tx_status |= cpu_to_le32(DescOwn); 1728f2148a47SJeff Kirsher wmb(); 1729f2148a47SJeff Kirsher 1730f2148a47SJeff Kirsher rp->cur_tx++; 1731f2148a47SJeff Kirsher 1732f2148a47SJeff Kirsher /* Non-x86 Todo: explicitly flush cache lines here. */ 1733f2148a47SJeff Kirsher 1734f2148a47SJeff Kirsher if (vlan_tx_tag_present(skb)) 1735f2148a47SJeff Kirsher /* Tx queues are bits 7-0 (first Tx queue: bit 7) */ 1736f2148a47SJeff Kirsher BYTE_REG_BITS_ON(1 << 7, ioaddr + TQWake); 1737f2148a47SJeff Kirsher 1738f2148a47SJeff Kirsher /* Wake the potentially-idle transmit channel */ 1739f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand, 1740f2148a47SJeff Kirsher ioaddr + ChipCmd1); 1741f2148a47SJeff Kirsher IOSYNC; 1742f2148a47SJeff Kirsher 1743f2148a47SJeff Kirsher if (rp->cur_tx == rp->dirty_tx + TX_QUEUE_LEN) 1744f2148a47SJeff Kirsher netif_stop_queue(dev); 1745f2148a47SJeff Kirsher 1746fc3e0f8aSFrancois Romieu netif_dbg(rp, tx_queued, dev, "Transmit frame #%d queued in slot %d\n", 1747f2148a47SJeff Kirsher rp->cur_tx - 1, entry); 1748fc3e0f8aSFrancois Romieu 1749f2148a47SJeff Kirsher return NETDEV_TX_OK; 1750f2148a47SJeff Kirsher } 1751f2148a47SJeff Kirsher 17527ab87ff4SFrancois Romieu static void rhine_irq_disable(struct rhine_private *rp) 17537ab87ff4SFrancois Romieu { 17547ab87ff4SFrancois Romieu iowrite16(0x0000, rp->base + IntrEnable); 17557ab87ff4SFrancois Romieu mmiowb(); 17567ab87ff4SFrancois Romieu } 17577ab87ff4SFrancois Romieu 1758f2148a47SJeff Kirsher /* The interrupt handler does all of the Rx thread work and cleans up 1759f2148a47SJeff Kirsher after the Tx thread. */ 1760f2148a47SJeff Kirsher static irqreturn_t rhine_interrupt(int irq, void *dev_instance) 1761f2148a47SJeff Kirsher { 1762f2148a47SJeff Kirsher struct net_device *dev = dev_instance; 1763f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 17647ab87ff4SFrancois Romieu u32 status; 1765f2148a47SJeff Kirsher int handled = 0; 1766f2148a47SJeff Kirsher 17677ab87ff4SFrancois Romieu status = rhine_get_events(rp); 1768f2148a47SJeff Kirsher 1769fc3e0f8aSFrancois Romieu netif_dbg(rp, intr, dev, "Interrupt, status %08x\n", status); 1770f2148a47SJeff Kirsher 17717ab87ff4SFrancois Romieu if (status & RHINE_EVENT) { 17727ab87ff4SFrancois Romieu handled = 1; 1773f2148a47SJeff Kirsher 17747ab87ff4SFrancois Romieu rhine_irq_disable(rp); 1775f2148a47SJeff Kirsher napi_schedule(&rp->napi); 1776f2148a47SJeff Kirsher } 1777f2148a47SJeff Kirsher 17787ab87ff4SFrancois Romieu if (status & ~(IntrLinkChange | IntrStatsMax | RHINE_EVENT_NAPI)) { 1779fc3e0f8aSFrancois Romieu netif_err(rp, intr, dev, "Something Wicked happened! %08x\n", 17807ab87ff4SFrancois Romieu status); 1781f2148a47SJeff Kirsher } 1782f2148a47SJeff Kirsher 1783f2148a47SJeff Kirsher return IRQ_RETVAL(handled); 1784f2148a47SJeff Kirsher } 1785f2148a47SJeff Kirsher 1786f2148a47SJeff Kirsher /* This routine is logically part of the interrupt handler, but isolated 1787f2148a47SJeff Kirsher for clarity. */ 1788f2148a47SJeff Kirsher static void rhine_tx(struct net_device *dev) 1789f2148a47SJeff Kirsher { 1790f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1791f2148a47SJeff Kirsher int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE; 1792f2148a47SJeff Kirsher 1793f2148a47SJeff Kirsher /* find and cleanup dirty tx descriptors */ 1794f2148a47SJeff Kirsher while (rp->dirty_tx != rp->cur_tx) { 1795f2148a47SJeff Kirsher txstatus = le32_to_cpu(rp->tx_ring[entry].tx_status); 1796fc3e0f8aSFrancois Romieu netif_dbg(rp, tx_done, dev, "Tx scavenge %d status %08x\n", 1797f2148a47SJeff Kirsher entry, txstatus); 1798f2148a47SJeff Kirsher if (txstatus & DescOwn) 1799f2148a47SJeff Kirsher break; 1800f2148a47SJeff Kirsher if (txstatus & 0x8000) { 1801fc3e0f8aSFrancois Romieu netif_dbg(rp, tx_done, dev, 1802fc3e0f8aSFrancois Romieu "Transmit error, Tx status %08x\n", txstatus); 1803f2148a47SJeff Kirsher dev->stats.tx_errors++; 1804f2148a47SJeff Kirsher if (txstatus & 0x0400) 1805f2148a47SJeff Kirsher dev->stats.tx_carrier_errors++; 1806f2148a47SJeff Kirsher if (txstatus & 0x0200) 1807f2148a47SJeff Kirsher dev->stats.tx_window_errors++; 1808f2148a47SJeff Kirsher if (txstatus & 0x0100) 1809f2148a47SJeff Kirsher dev->stats.tx_aborted_errors++; 1810f2148a47SJeff Kirsher if (txstatus & 0x0080) 1811f2148a47SJeff Kirsher dev->stats.tx_heartbeat_errors++; 1812f2148a47SJeff Kirsher if (((rp->quirks & rqRhineI) && txstatus & 0x0002) || 1813f2148a47SJeff Kirsher (txstatus & 0x0800) || (txstatus & 0x1000)) { 1814f2148a47SJeff Kirsher dev->stats.tx_fifo_errors++; 1815f2148a47SJeff Kirsher rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); 1816f2148a47SJeff Kirsher break; /* Keep the skb - we try again */ 1817f2148a47SJeff Kirsher } 1818f2148a47SJeff Kirsher /* Transmitter restarted in 'abnormal' handler. */ 1819f2148a47SJeff Kirsher } else { 1820f2148a47SJeff Kirsher if (rp->quirks & rqRhineI) 1821f2148a47SJeff Kirsher dev->stats.collisions += (txstatus >> 3) & 0x0F; 1822f2148a47SJeff Kirsher else 1823f2148a47SJeff Kirsher dev->stats.collisions += txstatus & 0x0F; 1824fc3e0f8aSFrancois Romieu netif_dbg(rp, tx_done, dev, "collisions: %1.1x:%1.1x\n", 1825fc3e0f8aSFrancois Romieu (txstatus >> 3) & 0xF, txstatus & 0xF); 1826f7b5d1b9SJamie Gloudon 1827f7b5d1b9SJamie Gloudon u64_stats_update_begin(&rp->tx_stats.syncp); 1828f7b5d1b9SJamie Gloudon rp->tx_stats.bytes += rp->tx_skbuff[entry]->len; 1829f7b5d1b9SJamie Gloudon rp->tx_stats.packets++; 1830f7b5d1b9SJamie Gloudon u64_stats_update_end(&rp->tx_stats.syncp); 1831f2148a47SJeff Kirsher } 1832f2148a47SJeff Kirsher /* Free the original skb. */ 1833f2148a47SJeff Kirsher if (rp->tx_skbuff_dma[entry]) { 1834f2148a47SJeff Kirsher pci_unmap_single(rp->pdev, 1835f2148a47SJeff Kirsher rp->tx_skbuff_dma[entry], 1836f2148a47SJeff Kirsher rp->tx_skbuff[entry]->len, 1837f2148a47SJeff Kirsher PCI_DMA_TODEVICE); 1838f2148a47SJeff Kirsher } 1839559bcac3SDavid S. Miller dev_kfree_skb(rp->tx_skbuff[entry]); 1840f2148a47SJeff Kirsher rp->tx_skbuff[entry] = NULL; 1841f2148a47SJeff Kirsher entry = (++rp->dirty_tx) % TX_RING_SIZE; 1842f2148a47SJeff Kirsher } 1843f2148a47SJeff Kirsher if ((rp->cur_tx - rp->dirty_tx) < TX_QUEUE_LEN - 4) 1844f2148a47SJeff Kirsher netif_wake_queue(dev); 1845f2148a47SJeff Kirsher } 1846f2148a47SJeff Kirsher 1847f2148a47SJeff Kirsher /** 1848f2148a47SJeff Kirsher * rhine_get_vlan_tci - extract TCI from Rx data buffer 1849f2148a47SJeff Kirsher * @skb: pointer to sk_buff 1850f2148a47SJeff Kirsher * @data_size: used data area of the buffer including CRC 1851f2148a47SJeff Kirsher * 1852f2148a47SJeff Kirsher * If hardware VLAN tag extraction is enabled and the chip indicates a 802.1Q 1853f2148a47SJeff Kirsher * packet, the extracted 802.1Q header (2 bytes TPID + 2 bytes TCI) is 4-byte 1854f2148a47SJeff Kirsher * aligned following the CRC. 1855f2148a47SJeff Kirsher */ 1856f2148a47SJeff Kirsher static inline u16 rhine_get_vlan_tci(struct sk_buff *skb, int data_size) 1857f2148a47SJeff Kirsher { 1858f2148a47SJeff Kirsher u8 *trailer = (u8 *)skb->data + ((data_size + 3) & ~3) + 2; 1859f2148a47SJeff Kirsher return be16_to_cpup((__be16 *)trailer); 1860f2148a47SJeff Kirsher } 1861f2148a47SJeff Kirsher 1862f2148a47SJeff Kirsher /* Process up to limit frames from receive ring */ 1863f2148a47SJeff Kirsher static int rhine_rx(struct net_device *dev, int limit) 1864f2148a47SJeff Kirsher { 1865f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 1866f2148a47SJeff Kirsher int count; 1867f2148a47SJeff Kirsher int entry = rp->cur_rx % RX_RING_SIZE; 1868f2148a47SJeff Kirsher 1869fc3e0f8aSFrancois Romieu netif_dbg(rp, rx_status, dev, "%s(), entry %d status %08x\n", __func__, 1870fc3e0f8aSFrancois Romieu entry, le32_to_cpu(rp->rx_head_desc->rx_status)); 1871f2148a47SJeff Kirsher 1872f2148a47SJeff Kirsher /* If EOP is set on the next entry, it's a new packet. Send it up. */ 1873f2148a47SJeff Kirsher for (count = 0; count < limit; ++count) { 1874f2148a47SJeff Kirsher struct rx_desc *desc = rp->rx_head_desc; 1875f2148a47SJeff Kirsher u32 desc_status = le32_to_cpu(desc->rx_status); 1876f2148a47SJeff Kirsher u32 desc_length = le32_to_cpu(desc->desc_length); 1877f2148a47SJeff Kirsher int data_size = desc_status >> 16; 1878f2148a47SJeff Kirsher 1879f2148a47SJeff Kirsher if (desc_status & DescOwn) 1880f2148a47SJeff Kirsher break; 1881f2148a47SJeff Kirsher 1882fc3e0f8aSFrancois Romieu netif_dbg(rp, rx_status, dev, "%s() status %08x\n", __func__, 1883fc3e0f8aSFrancois Romieu desc_status); 1884f2148a47SJeff Kirsher 1885f2148a47SJeff Kirsher if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { 1886f2148a47SJeff Kirsher if ((desc_status & RxWholePkt) != RxWholePkt) { 1887f2148a47SJeff Kirsher netdev_warn(dev, 1888f2148a47SJeff Kirsher "Oversized Ethernet frame spanned multiple buffers, " 1889f2148a47SJeff Kirsher "entry %#x length %d status %08x!\n", 1890f2148a47SJeff Kirsher entry, data_size, 1891f2148a47SJeff Kirsher desc_status); 1892f2148a47SJeff Kirsher netdev_warn(dev, 1893f2148a47SJeff Kirsher "Oversized Ethernet frame %p vs %p\n", 1894f2148a47SJeff Kirsher rp->rx_head_desc, 1895f2148a47SJeff Kirsher &rp->rx_ring[entry]); 1896f2148a47SJeff Kirsher dev->stats.rx_length_errors++; 1897f2148a47SJeff Kirsher } else if (desc_status & RxErr) { 1898f2148a47SJeff Kirsher /* There was a error. */ 1899fc3e0f8aSFrancois Romieu netif_dbg(rp, rx_err, dev, 1900fc3e0f8aSFrancois Romieu "%s() Rx error %08x\n", __func__, 1901fc3e0f8aSFrancois Romieu desc_status); 1902f2148a47SJeff Kirsher dev->stats.rx_errors++; 1903f2148a47SJeff Kirsher if (desc_status & 0x0030) 1904f2148a47SJeff Kirsher dev->stats.rx_length_errors++; 1905f2148a47SJeff Kirsher if (desc_status & 0x0048) 1906f2148a47SJeff Kirsher dev->stats.rx_fifo_errors++; 1907f2148a47SJeff Kirsher if (desc_status & 0x0004) 1908f2148a47SJeff Kirsher dev->stats.rx_frame_errors++; 1909f2148a47SJeff Kirsher if (desc_status & 0x0002) { 1910f2148a47SJeff Kirsher /* this can also be updated outside the interrupt handler */ 1911f2148a47SJeff Kirsher spin_lock(&rp->lock); 1912f2148a47SJeff Kirsher dev->stats.rx_crc_errors++; 1913f2148a47SJeff Kirsher spin_unlock(&rp->lock); 1914f2148a47SJeff Kirsher } 1915f2148a47SJeff Kirsher } 1916f2148a47SJeff Kirsher } else { 1917f2148a47SJeff Kirsher struct sk_buff *skb = NULL; 1918f2148a47SJeff Kirsher /* Length should omit the CRC */ 1919f2148a47SJeff Kirsher int pkt_len = data_size - 4; 1920f2148a47SJeff Kirsher u16 vlan_tci = 0; 1921f2148a47SJeff Kirsher 1922f2148a47SJeff Kirsher /* Check if the packet is long enough to accept without 1923f2148a47SJeff Kirsher copying to a minimally-sized skbuff. */ 1924f2148a47SJeff Kirsher if (pkt_len < rx_copybreak) 1925f2148a47SJeff Kirsher skb = netdev_alloc_skb_ip_align(dev, pkt_len); 1926f2148a47SJeff Kirsher if (skb) { 1927f2148a47SJeff Kirsher pci_dma_sync_single_for_cpu(rp->pdev, 1928f2148a47SJeff Kirsher rp->rx_skbuff_dma[entry], 1929f2148a47SJeff Kirsher rp->rx_buf_sz, 1930f2148a47SJeff Kirsher PCI_DMA_FROMDEVICE); 1931f2148a47SJeff Kirsher 1932f2148a47SJeff Kirsher skb_copy_to_linear_data(skb, 1933f2148a47SJeff Kirsher rp->rx_skbuff[entry]->data, 1934f2148a47SJeff Kirsher pkt_len); 1935f2148a47SJeff Kirsher skb_put(skb, pkt_len); 1936f2148a47SJeff Kirsher pci_dma_sync_single_for_device(rp->pdev, 1937f2148a47SJeff Kirsher rp->rx_skbuff_dma[entry], 1938f2148a47SJeff Kirsher rp->rx_buf_sz, 1939f2148a47SJeff Kirsher PCI_DMA_FROMDEVICE); 1940f2148a47SJeff Kirsher } else { 1941f2148a47SJeff Kirsher skb = rp->rx_skbuff[entry]; 1942f2148a47SJeff Kirsher if (skb == NULL) { 1943f2148a47SJeff Kirsher netdev_err(dev, "Inconsistent Rx descriptor chain\n"); 1944f2148a47SJeff Kirsher break; 1945f2148a47SJeff Kirsher } 1946f2148a47SJeff Kirsher rp->rx_skbuff[entry] = NULL; 1947f2148a47SJeff Kirsher skb_put(skb, pkt_len); 1948f2148a47SJeff Kirsher pci_unmap_single(rp->pdev, 1949f2148a47SJeff Kirsher rp->rx_skbuff_dma[entry], 1950f2148a47SJeff Kirsher rp->rx_buf_sz, 1951f2148a47SJeff Kirsher PCI_DMA_FROMDEVICE); 1952f2148a47SJeff Kirsher } 1953f2148a47SJeff Kirsher 1954f2148a47SJeff Kirsher if (unlikely(desc_length & DescTag)) 1955f2148a47SJeff Kirsher vlan_tci = rhine_get_vlan_tci(skb, data_size); 1956f2148a47SJeff Kirsher 1957f2148a47SJeff Kirsher skb->protocol = eth_type_trans(skb, dev); 1958f2148a47SJeff Kirsher 1959f2148a47SJeff Kirsher if (unlikely(desc_length & DescTag)) 196086a9bad3SPatrick McHardy __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci); 1961f2148a47SJeff Kirsher netif_receive_skb(skb); 1962f7b5d1b9SJamie Gloudon 1963f7b5d1b9SJamie Gloudon u64_stats_update_begin(&rp->rx_stats.syncp); 1964f7b5d1b9SJamie Gloudon rp->rx_stats.bytes += pkt_len; 1965f7b5d1b9SJamie Gloudon rp->rx_stats.packets++; 1966f7b5d1b9SJamie Gloudon u64_stats_update_end(&rp->rx_stats.syncp); 1967f2148a47SJeff Kirsher } 1968f2148a47SJeff Kirsher entry = (++rp->cur_rx) % RX_RING_SIZE; 1969f2148a47SJeff Kirsher rp->rx_head_desc = &rp->rx_ring[entry]; 1970f2148a47SJeff Kirsher } 1971f2148a47SJeff Kirsher 1972f2148a47SJeff Kirsher /* Refill the Rx ring buffers. */ 1973f2148a47SJeff Kirsher for (; rp->cur_rx - rp->dirty_rx > 0; rp->dirty_rx++) { 1974f2148a47SJeff Kirsher struct sk_buff *skb; 1975f2148a47SJeff Kirsher entry = rp->dirty_rx % RX_RING_SIZE; 1976f2148a47SJeff Kirsher if (rp->rx_skbuff[entry] == NULL) { 1977f2148a47SJeff Kirsher skb = netdev_alloc_skb(dev, rp->rx_buf_sz); 1978f2148a47SJeff Kirsher rp->rx_skbuff[entry] = skb; 1979f2148a47SJeff Kirsher if (skb == NULL) 1980f2148a47SJeff Kirsher break; /* Better luck next round. */ 1981f2148a47SJeff Kirsher rp->rx_skbuff_dma[entry] = 1982f2148a47SJeff Kirsher pci_map_single(rp->pdev, skb->data, 1983f2148a47SJeff Kirsher rp->rx_buf_sz, 1984f2148a47SJeff Kirsher PCI_DMA_FROMDEVICE); 19859b4fe5fbSNeil Horman if (dma_mapping_error(&rp->pdev->dev, rp->rx_skbuff_dma[entry])) { 19869b4fe5fbSNeil Horman dev_kfree_skb(skb); 19879b4fe5fbSNeil Horman rp->rx_skbuff_dma[entry] = 0; 19889b4fe5fbSNeil Horman break; 19899b4fe5fbSNeil Horman } 1990f2148a47SJeff Kirsher rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]); 1991f2148a47SJeff Kirsher } 1992f2148a47SJeff Kirsher rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); 1993f2148a47SJeff Kirsher } 1994f2148a47SJeff Kirsher 1995f2148a47SJeff Kirsher return count; 1996f2148a47SJeff Kirsher } 1997f2148a47SJeff Kirsher 1998f2148a47SJeff Kirsher static void rhine_restart_tx(struct net_device *dev) { 1999f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2000f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 2001f2148a47SJeff Kirsher int entry = rp->dirty_tx % TX_RING_SIZE; 2002f2148a47SJeff Kirsher u32 intr_status; 2003f2148a47SJeff Kirsher 2004f2148a47SJeff Kirsher /* 2005f2148a47SJeff Kirsher * If new errors occurred, we need to sort them out before doing Tx. 2006f2148a47SJeff Kirsher * In that case the ISR will be back here RSN anyway. 2007f2148a47SJeff Kirsher */ 2008a20a28bcSFrancois Romieu intr_status = rhine_get_events(rp); 2009f2148a47SJeff Kirsher 2010f2148a47SJeff Kirsher if ((intr_status & IntrTxErrSummary) == 0) { 2011f2148a47SJeff Kirsher 2012f2148a47SJeff Kirsher /* We know better than the chip where it should continue. */ 2013f2148a47SJeff Kirsher iowrite32(rp->tx_ring_dma + entry * sizeof(struct tx_desc), 2014f2148a47SJeff Kirsher ioaddr + TxRingPtr); 2015f2148a47SJeff Kirsher 2016f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ChipCmd) | CmdTxOn, 2017f2148a47SJeff Kirsher ioaddr + ChipCmd); 2018f2148a47SJeff Kirsher 2019f2148a47SJeff Kirsher if (rp->tx_ring[entry].desc_length & cpu_to_le32(0x020000)) 2020f2148a47SJeff Kirsher /* Tx queues are bits 7-0 (first Tx queue: bit 7) */ 2021f2148a47SJeff Kirsher BYTE_REG_BITS_ON(1 << 7, ioaddr + TQWake); 2022f2148a47SJeff Kirsher 2023f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand, 2024f2148a47SJeff Kirsher ioaddr + ChipCmd1); 2025f2148a47SJeff Kirsher IOSYNC; 2026f2148a47SJeff Kirsher } 2027f2148a47SJeff Kirsher else { 2028f2148a47SJeff Kirsher /* This should never happen */ 2029fc3e0f8aSFrancois Romieu netif_warn(rp, tx_err, dev, "another error occurred %08x\n", 2030fc3e0f8aSFrancois Romieu intr_status); 2031f2148a47SJeff Kirsher } 2032f2148a47SJeff Kirsher 2033f2148a47SJeff Kirsher } 2034f2148a47SJeff Kirsher 20357ab87ff4SFrancois Romieu static void rhine_slow_event_task(struct work_struct *work) 2036f2148a47SJeff Kirsher { 20377ab87ff4SFrancois Romieu struct rhine_private *rp = 20387ab87ff4SFrancois Romieu container_of(work, struct rhine_private, slow_event_task); 20397ab87ff4SFrancois Romieu struct net_device *dev = rp->dev; 20407ab87ff4SFrancois Romieu u32 intr_status; 2041f2148a47SJeff Kirsher 20427ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 20437ab87ff4SFrancois Romieu 20447ab87ff4SFrancois Romieu if (!rp->task_enable) 20457ab87ff4SFrancois Romieu goto out_unlock; 20467ab87ff4SFrancois Romieu 20477ab87ff4SFrancois Romieu intr_status = rhine_get_events(rp); 20487ab87ff4SFrancois Romieu rhine_ack_events(rp, intr_status & RHINE_EVENT_SLOW); 2049f2148a47SJeff Kirsher 2050f2148a47SJeff Kirsher if (intr_status & IntrLinkChange) 2051f2148a47SJeff Kirsher rhine_check_media(dev, 0); 2052f2148a47SJeff Kirsher 2053fc3e0f8aSFrancois Romieu if (intr_status & IntrPCIErr) 2054fc3e0f8aSFrancois Romieu netif_warn(rp, hw, dev, "PCI error\n"); 2055fc3e0f8aSFrancois Romieu 2056559bcac3SDavid S. Miller iowrite16(RHINE_EVENT & 0xffff, rp->base + IntrEnable); 2057f2148a47SJeff Kirsher 20587ab87ff4SFrancois Romieu out_unlock: 20597ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 2060f2148a47SJeff Kirsher } 2061f2148a47SJeff Kirsher 2062f7b5d1b9SJamie Gloudon static struct rtnl_link_stats64 * 2063f7b5d1b9SJamie Gloudon rhine_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) 2064f2148a47SJeff Kirsher { 2065f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2066f7b5d1b9SJamie Gloudon unsigned int start; 2067f2148a47SJeff Kirsher 20687ab87ff4SFrancois Romieu spin_lock_bh(&rp->lock); 20697ab87ff4SFrancois Romieu rhine_update_rx_crc_and_missed_errord(rp); 20707ab87ff4SFrancois Romieu spin_unlock_bh(&rp->lock); 2071f2148a47SJeff Kirsher 2072f7b5d1b9SJamie Gloudon netdev_stats_to_stats64(stats, &dev->stats); 2073f7b5d1b9SJamie Gloudon 2074f7b5d1b9SJamie Gloudon do { 2075f7b5d1b9SJamie Gloudon start = u64_stats_fetch_begin_bh(&rp->rx_stats.syncp); 2076f7b5d1b9SJamie Gloudon stats->rx_packets = rp->rx_stats.packets; 2077f7b5d1b9SJamie Gloudon stats->rx_bytes = rp->rx_stats.bytes; 2078f7b5d1b9SJamie Gloudon } while (u64_stats_fetch_retry_bh(&rp->rx_stats.syncp, start)); 2079f7b5d1b9SJamie Gloudon 2080f7b5d1b9SJamie Gloudon do { 2081f7b5d1b9SJamie Gloudon start = u64_stats_fetch_begin_bh(&rp->tx_stats.syncp); 2082f7b5d1b9SJamie Gloudon stats->tx_packets = rp->tx_stats.packets; 2083f7b5d1b9SJamie Gloudon stats->tx_bytes = rp->tx_stats.bytes; 2084f7b5d1b9SJamie Gloudon } while (u64_stats_fetch_retry_bh(&rp->tx_stats.syncp, start)); 2085f7b5d1b9SJamie Gloudon 2086f7b5d1b9SJamie Gloudon return stats; 2087f2148a47SJeff Kirsher } 2088f2148a47SJeff Kirsher 2089f2148a47SJeff Kirsher static void rhine_set_rx_mode(struct net_device *dev) 2090f2148a47SJeff Kirsher { 2091f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2092f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 2093f2148a47SJeff Kirsher u32 mc_filter[2]; /* Multicast hash filter */ 2094f2148a47SJeff Kirsher u8 rx_mode = 0x0C; /* Note: 0x02=accept runt, 0x01=accept errs */ 2095f2148a47SJeff Kirsher struct netdev_hw_addr *ha; 2096f2148a47SJeff Kirsher 2097f2148a47SJeff Kirsher if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ 2098f2148a47SJeff Kirsher rx_mode = 0x1C; 2099f2148a47SJeff Kirsher iowrite32(0xffffffff, ioaddr + MulticastFilter0); 2100f2148a47SJeff Kirsher iowrite32(0xffffffff, ioaddr + MulticastFilter1); 2101f2148a47SJeff Kirsher } else if ((netdev_mc_count(dev) > multicast_filter_limit) || 2102f2148a47SJeff Kirsher (dev->flags & IFF_ALLMULTI)) { 2103f2148a47SJeff Kirsher /* Too many to match, or accept all multicasts. */ 2104f2148a47SJeff Kirsher iowrite32(0xffffffff, ioaddr + MulticastFilter0); 2105f2148a47SJeff Kirsher iowrite32(0xffffffff, ioaddr + MulticastFilter1); 2106f2148a47SJeff Kirsher } else if (rp->pdev->revision >= VT6105M) { 2107f2148a47SJeff Kirsher int i = 0; 2108f2148a47SJeff Kirsher u32 mCAMmask = 0; /* 32 mCAMs (6105M and better) */ 2109f2148a47SJeff Kirsher netdev_for_each_mc_addr(ha, dev) { 2110f2148a47SJeff Kirsher if (i == MCAM_SIZE) 2111f2148a47SJeff Kirsher break; 2112f2148a47SJeff Kirsher rhine_set_cam(ioaddr, i, ha->addr); 2113f2148a47SJeff Kirsher mCAMmask |= 1 << i; 2114f2148a47SJeff Kirsher i++; 2115f2148a47SJeff Kirsher } 2116f2148a47SJeff Kirsher rhine_set_cam_mask(ioaddr, mCAMmask); 2117f2148a47SJeff Kirsher } else { 2118f2148a47SJeff Kirsher memset(mc_filter, 0, sizeof(mc_filter)); 2119f2148a47SJeff Kirsher netdev_for_each_mc_addr(ha, dev) { 2120f2148a47SJeff Kirsher int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; 2121f2148a47SJeff Kirsher 2122f2148a47SJeff Kirsher mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); 2123f2148a47SJeff Kirsher } 2124f2148a47SJeff Kirsher iowrite32(mc_filter[0], ioaddr + MulticastFilter0); 2125f2148a47SJeff Kirsher iowrite32(mc_filter[1], ioaddr + MulticastFilter1); 2126f2148a47SJeff Kirsher } 2127f2148a47SJeff Kirsher /* enable/disable VLAN receive filtering */ 2128f2148a47SJeff Kirsher if (rp->pdev->revision >= VT6105M) { 2129f2148a47SJeff Kirsher if (dev->flags & IFF_PROMISC) 2130f2148a47SJeff Kirsher BYTE_REG_BITS_OFF(BCR1_VIDFR, ioaddr + PCIBusConfig1); 2131f2148a47SJeff Kirsher else 2132f2148a47SJeff Kirsher BYTE_REG_BITS_ON(BCR1_VIDFR, ioaddr + PCIBusConfig1); 2133f2148a47SJeff Kirsher } 2134f2148a47SJeff Kirsher BYTE_REG_BITS_ON(rx_mode, ioaddr + RxConfig); 2135f2148a47SJeff Kirsher } 2136f2148a47SJeff Kirsher 2137f2148a47SJeff Kirsher static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 2138f2148a47SJeff Kirsher { 2139f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2140f2148a47SJeff Kirsher 214123020ab3SRick Jones strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); 214223020ab3SRick Jones strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 214323020ab3SRick Jones strlcpy(info->bus_info, pci_name(rp->pdev), sizeof(info->bus_info)); 2144f2148a47SJeff Kirsher } 2145f2148a47SJeff Kirsher 2146f2148a47SJeff Kirsher static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2147f2148a47SJeff Kirsher { 2148f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2149f2148a47SJeff Kirsher int rc; 2150f2148a47SJeff Kirsher 21517ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 2152f2148a47SJeff Kirsher rc = mii_ethtool_gset(&rp->mii_if, cmd); 21537ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 2154f2148a47SJeff Kirsher 2155f2148a47SJeff Kirsher return rc; 2156f2148a47SJeff Kirsher } 2157f2148a47SJeff Kirsher 2158f2148a47SJeff Kirsher static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2159f2148a47SJeff Kirsher { 2160f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2161f2148a47SJeff Kirsher int rc; 2162f2148a47SJeff Kirsher 21637ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 2164f2148a47SJeff Kirsher rc = mii_ethtool_sset(&rp->mii_if, cmd); 2165f2148a47SJeff Kirsher rhine_set_carrier(&rp->mii_if); 21667ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 2167f2148a47SJeff Kirsher 2168f2148a47SJeff Kirsher return rc; 2169f2148a47SJeff Kirsher } 2170f2148a47SJeff Kirsher 2171f2148a47SJeff Kirsher static int netdev_nway_reset(struct net_device *dev) 2172f2148a47SJeff Kirsher { 2173f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2174f2148a47SJeff Kirsher 2175f2148a47SJeff Kirsher return mii_nway_restart(&rp->mii_if); 2176f2148a47SJeff Kirsher } 2177f2148a47SJeff Kirsher 2178f2148a47SJeff Kirsher static u32 netdev_get_link(struct net_device *dev) 2179f2148a47SJeff Kirsher { 2180f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2181f2148a47SJeff Kirsher 2182f2148a47SJeff Kirsher return mii_link_ok(&rp->mii_if); 2183f2148a47SJeff Kirsher } 2184f2148a47SJeff Kirsher 2185f2148a47SJeff Kirsher static u32 netdev_get_msglevel(struct net_device *dev) 2186f2148a47SJeff Kirsher { 2187fc3e0f8aSFrancois Romieu struct rhine_private *rp = netdev_priv(dev); 2188fc3e0f8aSFrancois Romieu 2189fc3e0f8aSFrancois Romieu return rp->msg_enable; 2190f2148a47SJeff Kirsher } 2191f2148a47SJeff Kirsher 2192f2148a47SJeff Kirsher static void netdev_set_msglevel(struct net_device *dev, u32 value) 2193f2148a47SJeff Kirsher { 2194fc3e0f8aSFrancois Romieu struct rhine_private *rp = netdev_priv(dev); 2195fc3e0f8aSFrancois Romieu 2196fc3e0f8aSFrancois Romieu rp->msg_enable = value; 2197f2148a47SJeff Kirsher } 2198f2148a47SJeff Kirsher 2199f2148a47SJeff Kirsher static void rhine_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2200f2148a47SJeff Kirsher { 2201f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2202f2148a47SJeff Kirsher 2203f2148a47SJeff Kirsher if (!(rp->quirks & rqWOL)) 2204f2148a47SJeff Kirsher return; 2205f2148a47SJeff Kirsher 2206f2148a47SJeff Kirsher spin_lock_irq(&rp->lock); 2207f2148a47SJeff Kirsher wol->supported = WAKE_PHY | WAKE_MAGIC | 2208f2148a47SJeff Kirsher WAKE_UCAST | WAKE_MCAST | WAKE_BCAST; /* Untested */ 2209f2148a47SJeff Kirsher wol->wolopts = rp->wolopts; 2210f2148a47SJeff Kirsher spin_unlock_irq(&rp->lock); 2211f2148a47SJeff Kirsher } 2212f2148a47SJeff Kirsher 2213f2148a47SJeff Kirsher static int rhine_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2214f2148a47SJeff Kirsher { 2215f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2216f2148a47SJeff Kirsher u32 support = WAKE_PHY | WAKE_MAGIC | 2217f2148a47SJeff Kirsher WAKE_UCAST | WAKE_MCAST | WAKE_BCAST; /* Untested */ 2218f2148a47SJeff Kirsher 2219f2148a47SJeff Kirsher if (!(rp->quirks & rqWOL)) 2220f2148a47SJeff Kirsher return -EINVAL; 2221f2148a47SJeff Kirsher 2222f2148a47SJeff Kirsher if (wol->wolopts & ~support) 2223f2148a47SJeff Kirsher return -EINVAL; 2224f2148a47SJeff Kirsher 2225f2148a47SJeff Kirsher spin_lock_irq(&rp->lock); 2226f2148a47SJeff Kirsher rp->wolopts = wol->wolopts; 2227f2148a47SJeff Kirsher spin_unlock_irq(&rp->lock); 2228f2148a47SJeff Kirsher 2229f2148a47SJeff Kirsher return 0; 2230f2148a47SJeff Kirsher } 2231f2148a47SJeff Kirsher 2232f2148a47SJeff Kirsher static const struct ethtool_ops netdev_ethtool_ops = { 2233f2148a47SJeff Kirsher .get_drvinfo = netdev_get_drvinfo, 2234f2148a47SJeff Kirsher .get_settings = netdev_get_settings, 2235f2148a47SJeff Kirsher .set_settings = netdev_set_settings, 2236f2148a47SJeff Kirsher .nway_reset = netdev_nway_reset, 2237f2148a47SJeff Kirsher .get_link = netdev_get_link, 2238f2148a47SJeff Kirsher .get_msglevel = netdev_get_msglevel, 2239f2148a47SJeff Kirsher .set_msglevel = netdev_set_msglevel, 2240f2148a47SJeff Kirsher .get_wol = rhine_get_wol, 2241f2148a47SJeff Kirsher .set_wol = rhine_set_wol, 2242f2148a47SJeff Kirsher }; 2243f2148a47SJeff Kirsher 2244f2148a47SJeff Kirsher static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 2245f2148a47SJeff Kirsher { 2246f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2247f2148a47SJeff Kirsher int rc; 2248f2148a47SJeff Kirsher 2249f2148a47SJeff Kirsher if (!netif_running(dev)) 2250f2148a47SJeff Kirsher return -EINVAL; 2251f2148a47SJeff Kirsher 22527ab87ff4SFrancois Romieu mutex_lock(&rp->task_lock); 2253f2148a47SJeff Kirsher rc = generic_mii_ioctl(&rp->mii_if, if_mii(rq), cmd, NULL); 2254f2148a47SJeff Kirsher rhine_set_carrier(&rp->mii_if); 22557ab87ff4SFrancois Romieu mutex_unlock(&rp->task_lock); 2256f2148a47SJeff Kirsher 2257f2148a47SJeff Kirsher return rc; 2258f2148a47SJeff Kirsher } 2259f2148a47SJeff Kirsher 2260f2148a47SJeff Kirsher static int rhine_close(struct net_device *dev) 2261f2148a47SJeff Kirsher { 2262f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2263f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 2264f2148a47SJeff Kirsher 22657ab87ff4SFrancois Romieu rhine_task_disable(rp); 2266f2148a47SJeff Kirsher napi_disable(&rp->napi); 2267f2148a47SJeff Kirsher netif_stop_queue(dev); 2268f2148a47SJeff Kirsher 2269fc3e0f8aSFrancois Romieu netif_dbg(rp, ifdown, dev, "Shutting down ethercard, status was %04x\n", 2270f2148a47SJeff Kirsher ioread16(ioaddr + ChipCmd)); 2271f2148a47SJeff Kirsher 2272f2148a47SJeff Kirsher /* Switch to loopback mode to avoid hardware races. */ 2273f2148a47SJeff Kirsher iowrite8(rp->tx_thresh | 0x02, ioaddr + TxConfig); 2274f2148a47SJeff Kirsher 22757ab87ff4SFrancois Romieu rhine_irq_disable(rp); 2276f2148a47SJeff Kirsher 2277f2148a47SJeff Kirsher /* Stop the chip's Tx and Rx processes. */ 2278f2148a47SJeff Kirsher iowrite16(CmdStop, ioaddr + ChipCmd); 2279f2148a47SJeff Kirsher 2280f2148a47SJeff Kirsher free_irq(rp->pdev->irq, dev); 2281f2148a47SJeff Kirsher free_rbufs(dev); 2282f2148a47SJeff Kirsher free_tbufs(dev); 2283f2148a47SJeff Kirsher free_ring(dev); 2284f2148a47SJeff Kirsher 2285f2148a47SJeff Kirsher return 0; 2286f2148a47SJeff Kirsher } 2287f2148a47SJeff Kirsher 2288f2148a47SJeff Kirsher 228976e239e1SBill Pemberton static void rhine_remove_one(struct pci_dev *pdev) 2290f2148a47SJeff Kirsher { 2291f2148a47SJeff Kirsher struct net_device *dev = pci_get_drvdata(pdev); 2292f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2293f2148a47SJeff Kirsher 2294f2148a47SJeff Kirsher unregister_netdev(dev); 2295f2148a47SJeff Kirsher 2296f2148a47SJeff Kirsher pci_iounmap(pdev, rp->base); 2297f2148a47SJeff Kirsher pci_release_regions(pdev); 2298f2148a47SJeff Kirsher 2299f2148a47SJeff Kirsher free_netdev(dev); 2300f2148a47SJeff Kirsher pci_disable_device(pdev); 2301f2148a47SJeff Kirsher } 2302f2148a47SJeff Kirsher 2303f2148a47SJeff Kirsher static void rhine_shutdown (struct pci_dev *pdev) 2304f2148a47SJeff Kirsher { 2305f2148a47SJeff Kirsher struct net_device *dev = pci_get_drvdata(pdev); 2306f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2307f2148a47SJeff Kirsher void __iomem *ioaddr = rp->base; 2308f2148a47SJeff Kirsher 2309f2148a47SJeff Kirsher if (!(rp->quirks & rqWOL)) 2310f2148a47SJeff Kirsher return; /* Nothing to do for non-WOL adapters */ 2311f2148a47SJeff Kirsher 2312f2148a47SJeff Kirsher rhine_power_init(dev); 2313f2148a47SJeff Kirsher 2314f2148a47SJeff Kirsher /* Make sure we use pattern 0, 1 and not 4, 5 */ 2315f2148a47SJeff Kirsher if (rp->quirks & rq6patterns) 2316f2148a47SJeff Kirsher iowrite8(0x04, ioaddr + WOLcgClr); 2317f2148a47SJeff Kirsher 23187ab87ff4SFrancois Romieu spin_lock(&rp->lock); 23197ab87ff4SFrancois Romieu 2320f2148a47SJeff Kirsher if (rp->wolopts & WAKE_MAGIC) { 2321f2148a47SJeff Kirsher iowrite8(WOLmagic, ioaddr + WOLcrSet); 2322f2148a47SJeff Kirsher /* 2323f2148a47SJeff Kirsher * Turn EEPROM-controlled wake-up back on -- some hardware may 2324f2148a47SJeff Kirsher * not cooperate otherwise. 2325f2148a47SJeff Kirsher */ 2326f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + ConfigA) | 0x03, ioaddr + ConfigA); 2327f2148a47SJeff Kirsher } 2328f2148a47SJeff Kirsher 2329f2148a47SJeff Kirsher if (rp->wolopts & (WAKE_BCAST|WAKE_MCAST)) 2330f2148a47SJeff Kirsher iowrite8(WOLbmcast, ioaddr + WOLcgSet); 2331f2148a47SJeff Kirsher 2332f2148a47SJeff Kirsher if (rp->wolopts & WAKE_PHY) 2333f2148a47SJeff Kirsher iowrite8(WOLlnkon | WOLlnkoff, ioaddr + WOLcrSet); 2334f2148a47SJeff Kirsher 2335f2148a47SJeff Kirsher if (rp->wolopts & WAKE_UCAST) 2336f2148a47SJeff Kirsher iowrite8(WOLucast, ioaddr + WOLcrSet); 2337f2148a47SJeff Kirsher 2338f2148a47SJeff Kirsher if (rp->wolopts) { 2339f2148a47SJeff Kirsher /* Enable legacy WOL (for old motherboards) */ 2340f2148a47SJeff Kirsher iowrite8(0x01, ioaddr + PwcfgSet); 2341f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + StickyHW) | 0x04, ioaddr + StickyHW); 2342f2148a47SJeff Kirsher } 2343f2148a47SJeff Kirsher 23447ab87ff4SFrancois Romieu spin_unlock(&rp->lock); 23457ab87ff4SFrancois Romieu 2346e92b9b3bSFrancois Romieu if (system_state == SYSTEM_POWER_OFF && !avoid_D3) { 2347f2148a47SJeff Kirsher iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); 2348f2148a47SJeff Kirsher 2349e92b9b3bSFrancois Romieu pci_wake_from_d3(pdev, true); 2350e92b9b3bSFrancois Romieu pci_set_power_state(pdev, PCI_D3hot); 2351e92b9b3bSFrancois Romieu } 2352f2148a47SJeff Kirsher } 2353f2148a47SJeff Kirsher 2354e92b9b3bSFrancois Romieu #ifdef CONFIG_PM_SLEEP 2355e92b9b3bSFrancois Romieu static int rhine_suspend(struct device *device) 2356f2148a47SJeff Kirsher { 2357e92b9b3bSFrancois Romieu struct pci_dev *pdev = to_pci_dev(device); 2358f2148a47SJeff Kirsher struct net_device *dev = pci_get_drvdata(pdev); 2359f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2360f2148a47SJeff Kirsher 2361f2148a47SJeff Kirsher if (!netif_running(dev)) 2362f2148a47SJeff Kirsher return 0; 2363f2148a47SJeff Kirsher 23647ab87ff4SFrancois Romieu rhine_task_disable(rp); 23657ab87ff4SFrancois Romieu rhine_irq_disable(rp); 2366f2148a47SJeff Kirsher napi_disable(&rp->napi); 2367f2148a47SJeff Kirsher 2368f2148a47SJeff Kirsher netif_device_detach(dev); 2369f2148a47SJeff Kirsher 2370f2148a47SJeff Kirsher rhine_shutdown(pdev); 2371f2148a47SJeff Kirsher 2372f2148a47SJeff Kirsher return 0; 2373f2148a47SJeff Kirsher } 2374f2148a47SJeff Kirsher 2375e92b9b3bSFrancois Romieu static int rhine_resume(struct device *device) 2376f2148a47SJeff Kirsher { 2377e92b9b3bSFrancois Romieu struct pci_dev *pdev = to_pci_dev(device); 2378f2148a47SJeff Kirsher struct net_device *dev = pci_get_drvdata(pdev); 2379f2148a47SJeff Kirsher struct rhine_private *rp = netdev_priv(dev); 2380f2148a47SJeff Kirsher 2381f2148a47SJeff Kirsher if (!netif_running(dev)) 2382f2148a47SJeff Kirsher return 0; 2383f2148a47SJeff Kirsher 2384f2148a47SJeff Kirsher #ifdef USE_MMIO 2385f2148a47SJeff Kirsher enable_mmio(rp->pioaddr, rp->quirks); 2386f2148a47SJeff Kirsher #endif 2387f2148a47SJeff Kirsher rhine_power_init(dev); 2388f2148a47SJeff Kirsher free_tbufs(dev); 2389f2148a47SJeff Kirsher free_rbufs(dev); 2390f2148a47SJeff Kirsher alloc_tbufs(dev); 2391f2148a47SJeff Kirsher alloc_rbufs(dev); 23927ab87ff4SFrancois Romieu rhine_task_enable(rp); 23937ab87ff4SFrancois Romieu spin_lock_bh(&rp->lock); 2394f2148a47SJeff Kirsher init_registers(dev); 23957ab87ff4SFrancois Romieu spin_unlock_bh(&rp->lock); 2396f2148a47SJeff Kirsher 2397f2148a47SJeff Kirsher netif_device_attach(dev); 2398f2148a47SJeff Kirsher 2399f2148a47SJeff Kirsher return 0; 2400f2148a47SJeff Kirsher } 2401e92b9b3bSFrancois Romieu 2402e92b9b3bSFrancois Romieu static SIMPLE_DEV_PM_OPS(rhine_pm_ops, rhine_suspend, rhine_resume); 2403e92b9b3bSFrancois Romieu #define RHINE_PM_OPS (&rhine_pm_ops) 2404e92b9b3bSFrancois Romieu 2405e92b9b3bSFrancois Romieu #else 2406e92b9b3bSFrancois Romieu 2407e92b9b3bSFrancois Romieu #define RHINE_PM_OPS NULL 2408e92b9b3bSFrancois Romieu 2409e92b9b3bSFrancois Romieu #endif /* !CONFIG_PM_SLEEP */ 2410f2148a47SJeff Kirsher 2411f2148a47SJeff Kirsher static struct pci_driver rhine_driver = { 2412f2148a47SJeff Kirsher .name = DRV_NAME, 2413f2148a47SJeff Kirsher .id_table = rhine_pci_tbl, 2414f2148a47SJeff Kirsher .probe = rhine_init_one, 241576e239e1SBill Pemberton .remove = rhine_remove_one, 2416f2148a47SJeff Kirsher .shutdown = rhine_shutdown, 2417e92b9b3bSFrancois Romieu .driver.pm = RHINE_PM_OPS, 2418f2148a47SJeff Kirsher }; 2419f2148a47SJeff Kirsher 242077273eaaSSachin Kamat static struct dmi_system_id rhine_dmi_table[] __initdata = { 2421f2148a47SJeff Kirsher { 2422f2148a47SJeff Kirsher .ident = "EPIA-M", 2423f2148a47SJeff Kirsher .matches = { 2424f2148a47SJeff Kirsher DMI_MATCH(DMI_BIOS_VENDOR, "Award Software International, Inc."), 2425f2148a47SJeff Kirsher DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), 2426f2148a47SJeff Kirsher }, 2427f2148a47SJeff Kirsher }, 2428f2148a47SJeff Kirsher { 2429f2148a47SJeff Kirsher .ident = "KV7", 2430f2148a47SJeff Kirsher .matches = { 2431f2148a47SJeff Kirsher DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), 2432f2148a47SJeff Kirsher DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), 2433f2148a47SJeff Kirsher }, 2434f2148a47SJeff Kirsher }, 2435f2148a47SJeff Kirsher { NULL } 2436f2148a47SJeff Kirsher }; 2437f2148a47SJeff Kirsher 2438f2148a47SJeff Kirsher static int __init rhine_init(void) 2439f2148a47SJeff Kirsher { 2440f2148a47SJeff Kirsher /* when a module, this is printed whether or not devices are found in probe */ 2441f2148a47SJeff Kirsher #ifdef MODULE 2442f2148a47SJeff Kirsher pr_info("%s\n", version); 2443f2148a47SJeff Kirsher #endif 2444f2148a47SJeff Kirsher if (dmi_check_system(rhine_dmi_table)) { 2445f2148a47SJeff Kirsher /* these BIOSes fail at PXE boot if chip is in D3 */ 2446eb939922SRusty Russell avoid_D3 = true; 2447f2148a47SJeff Kirsher pr_warn("Broken BIOS detected, avoid_D3 enabled\n"); 2448f2148a47SJeff Kirsher } 2449f2148a47SJeff Kirsher else if (avoid_D3) 2450f2148a47SJeff Kirsher pr_info("avoid_D3 set\n"); 2451f2148a47SJeff Kirsher 2452f2148a47SJeff Kirsher return pci_register_driver(&rhine_driver); 2453f2148a47SJeff Kirsher } 2454f2148a47SJeff Kirsher 2455f2148a47SJeff Kirsher 2456f2148a47SJeff Kirsher static void __exit rhine_cleanup(void) 2457f2148a47SJeff Kirsher { 2458f2148a47SJeff Kirsher pci_unregister_driver(&rhine_driver); 2459f2148a47SJeff Kirsher } 2460f2148a47SJeff Kirsher 2461f2148a47SJeff Kirsher 2462f2148a47SJeff Kirsher module_init(rhine_init); 2463f2148a47SJeff Kirsher module_exit(rhine_cleanup); 2464