cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

yellowfin.c (45845B)


      1/* yellowfin.c: A Packet Engines G-NIC ethernet driver for linux. */
      2/*
      3	Written 1997-2001 by Donald Becker.
      4
      5	This software may be used and distributed according to the terms of
      6	the GNU General Public License (GPL), incorporated herein by reference.
      7	Drivers based on or derived from this code fall under the GPL and must
      8	retain the authorship, copyright and license notice.  This file is not
      9	a complete program and may only be used when the entire operating
     10	system is licensed under the GPL.
     11
     12	This driver is for the Packet Engines G-NIC PCI Gigabit Ethernet adapter.
     13	It also supports the Symbios Logic version of the same chip core.
     14
     15	The author may be reached as becker@scyld.com, or C/O
     16	Scyld Computing Corporation
     17	410 Severn Ave., Suite 210
     18	Annapolis MD 21403
     19
     20	Support and updates available at
     21	http://www.scyld.com/network/yellowfin.html
     22	[link no longer provides useful info -jgarzik]
     23
     24*/
     25
     26#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     27
     28#define DRV_NAME	"yellowfin"
     29#define DRV_VERSION	"2.1"
     30#define DRV_RELDATE	"Sep 11, 2006"
     31
     32/* The user-configurable values.
     33   These may be modified when a driver module is loaded.*/
     34
     35static int debug = 1;			/* 1 normal messages, 0 quiet .. 7 verbose. */
     36/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
     37static int max_interrupt_work = 20;
     38static int mtu;
     39#ifdef YF_PROTOTYPE			/* Support for prototype hardware errata. */
     40/* System-wide count of bogus-rx frames. */
     41static int bogus_rx;
     42static int dma_ctrl = 0x004A0263; 			/* Constrained by errata */
     43static int fifo_cfg = 0x0020;				/* Bypass external Tx FIFO. */
     44#elif defined(YF_NEW)					/* A future perfect board :->.  */
     45static int dma_ctrl = 0x00CAC277;			/* Override when loading module! */
     46static int fifo_cfg = 0x0028;
     47#else
     48static const int dma_ctrl = 0x004A0263; 			/* Constrained by errata */
     49static const int fifo_cfg = 0x0020;				/* Bypass external Tx FIFO. */
     50#endif
     51
     52/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
     53   Setting to > 1514 effectively disables this feature. */
     54static int rx_copybreak;
     55
     56/* Used to pass the media type, etc.
     57   No media types are currently defined.  These exist for driver
     58   interoperability.
     59*/
     60#define MAX_UNITS 8				/* More are supported, limit only on options */
     61static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
     62static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
     63
     64/* Do ugly workaround for GX server chipset errata. */
     65static int gx_fix;
     66
     67/* Operational parameters that are set at compile time. */
     68
     69/* Keep the ring sizes a power of two for efficiency.
     70   Making the Tx ring too long decreases the effectiveness of channel
     71   bonding and packet priority.
     72   There are no ill effects from too-large receive rings. */
     73#define TX_RING_SIZE	16
     74#define TX_QUEUE_SIZE	12		/* Must be > 4 && <= TX_RING_SIZE */
     75#define RX_RING_SIZE	64
     76#define STATUS_TOTAL_SIZE	TX_RING_SIZE*sizeof(struct tx_status_words)
     77#define TX_TOTAL_SIZE		2*TX_RING_SIZE*sizeof(struct yellowfin_desc)
     78#define RX_TOTAL_SIZE		RX_RING_SIZE*sizeof(struct yellowfin_desc)
     79
     80/* Operational parameters that usually are not changed. */
     81/* Time in jiffies before concluding the transmitter is hung. */
     82#define TX_TIMEOUT  (2*HZ)
     83#define PKT_BUF_SZ		1536			/* Size of each temporary Rx buffer.*/
     84
     85#define yellowfin_debug debug
     86
     87#include <linux/module.h>
     88#include <linux/kernel.h>
     89#include <linux/string.h>
     90#include <linux/timer.h>
     91#include <linux/errno.h>
     92#include <linux/ioport.h>
     93#include <linux/interrupt.h>
     94#include <linux/pci.h>
     95#include <linux/init.h>
     96#include <linux/mii.h>
     97#include <linux/netdevice.h>
     98#include <linux/etherdevice.h>
     99#include <linux/skbuff.h>
    100#include <linux/ethtool.h>
    101#include <linux/crc32.h>
    102#include <linux/bitops.h>
    103#include <linux/uaccess.h>
    104#include <asm/processor.h>		/* Processor type for cache alignment. */
    105#include <asm/unaligned.h>
    106#include <asm/io.h>
    107
    108/* These identify the driver base version and may not be removed. */
    109static const char version[] =
    110  KERN_INFO DRV_NAME ".c:v1.05  1/09/2001  Written by Donald Becker <becker@scyld.com>\n"
    111  "  (unofficial 2.4.x port, " DRV_VERSION ", " DRV_RELDATE ")\n";
    112
    113MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
    114MODULE_DESCRIPTION("Packet Engines Yellowfin G-NIC Gigabit Ethernet driver");
    115MODULE_LICENSE("GPL");
    116
    117module_param(max_interrupt_work, int, 0);
    118module_param(mtu, int, 0);
    119module_param(debug, int, 0);
    120module_param(rx_copybreak, int, 0);
    121module_param_array(options, int, NULL, 0);
    122module_param_array(full_duplex, int, NULL, 0);
    123module_param(gx_fix, int, 0);
    124MODULE_PARM_DESC(max_interrupt_work, "G-NIC maximum events handled per interrupt");
    125MODULE_PARM_DESC(mtu, "G-NIC MTU (all boards)");
    126MODULE_PARM_DESC(debug, "G-NIC debug level (0-7)");
    127MODULE_PARM_DESC(rx_copybreak, "G-NIC copy breakpoint for copy-only-tiny-frames");
    128MODULE_PARM_DESC(options, "G-NIC: Bits 0-3: media type, bit 17: full duplex");
    129MODULE_PARM_DESC(full_duplex, "G-NIC full duplex setting(s) (1)");
    130MODULE_PARM_DESC(gx_fix, "G-NIC: enable GX server chipset bug workaround (0-1)");
    131
    132/*
    133				Theory of Operation
    134
    135I. Board Compatibility
    136
    137This device driver is designed for the Packet Engines "Yellowfin" Gigabit
    138Ethernet adapter.  The G-NIC 64-bit PCI card is supported, as well as the
    139Symbios 53C885E dual function chip.
    140
    141II. Board-specific settings
    142
    143PCI bus devices are configured by the system at boot time, so no jumpers
    144need to be set on the board.  The system BIOS preferably should assign the
    145PCI INTA signal to an otherwise unused system IRQ line.
    146Note: Kernel versions earlier than 1.3.73 do not support shared PCI
    147interrupt lines.
    148
    149III. Driver operation
    150
    151IIIa. Ring buffers
    152
    153The Yellowfin uses the Descriptor Based DMA Architecture specified by Apple.
    154This is a descriptor list scheme similar to that used by the EEPro100 and
    155Tulip.  This driver uses two statically allocated fixed-size descriptor lists
    156formed into rings by a branch from the final descriptor to the beginning of
    157the list.  The ring sizes are set at compile time by RX/TX_RING_SIZE.
    158
    159The driver allocates full frame size skbuffs for the Rx ring buffers at
    160open() time and passes the skb->data field to the Yellowfin as receive data
    161buffers.  When an incoming frame is less than RX_COPYBREAK bytes long,
    162a fresh skbuff is allocated and the frame is copied to the new skbuff.
    163When the incoming frame is larger, the skbuff is passed directly up the
    164protocol stack and replaced by a newly allocated skbuff.
    165
    166The RX_COPYBREAK value is chosen to trade-off the memory wasted by
    167using a full-sized skbuff for small frames vs. the copying costs of larger
    168frames.  For small frames the copying cost is negligible (esp. considering
    169that we are pre-loading the cache with immediately useful header
    170information).  For large frames the copying cost is non-trivial, and the
    171larger copy might flush the cache of useful data.
    172
    173IIIC. Synchronization
    174
    175The driver runs as two independent, single-threaded flows of control.  One
    176is the send-packet routine, which enforces single-threaded use by the
    177dev->tbusy flag.  The other thread is the interrupt handler, which is single
    178threaded by the hardware and other software.
    179
    180The send packet thread has partial control over the Tx ring and 'dev->tbusy'
    181flag.  It sets the tbusy flag whenever it's queuing a Tx packet. If the next
    182queue slot is empty, it clears the tbusy flag when finished otherwise it sets
    183the 'yp->tx_full' flag.
    184
    185The interrupt handler has exclusive control over the Rx ring and records stats
    186from the Tx ring.  After reaping the stats, it marks the Tx queue entry as
    187empty by incrementing the dirty_tx mark. Iff the 'yp->tx_full' flag is set, it
    188clears both the tx_full and tbusy flags.
    189
    190IV. Notes
    191
    192Thanks to Kim Stearns of Packet Engines for providing a pair of G-NIC boards.
    193Thanks to Bruce Faust of Digitalscape for providing both their SYM53C885 board
    194and an AlphaStation to verify the Alpha port!
    195
    196IVb. References
    197
    198Yellowfin Engineering Design Specification, 4/23/97 Preliminary/Confidential
    199Symbios SYM53C885 PCI-SCSI/Fast Ethernet Multifunction Controller Preliminary
    200   Data Manual v3.0
    201http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
    202http://cesdis.gsfc.nasa.gov/linux/misc/100mbps.html
    203
    204IVc. Errata
    205
    206See Packet Engines confidential appendix (prototype chips only).
    207*/
    208
    209
    210
    211enum capability_flags {
    212	HasMII=1, FullTxStatus=2, IsGigabit=4, HasMulticastBug=8, FullRxStatus=16,
    213	HasMACAddrBug=32, /* Only on early revs.  */
    214	DontUseEeprom=64, /* Don't read the MAC from the EEPROm. */
    215};
    216
    217/* The PCI I/O space extent. */
    218enum {
    219	YELLOWFIN_SIZE	= 0x100,
    220};
    221
    222struct pci_id_info {
    223        const char *name;
    224        struct match_info {
    225                int     pci, pci_mask, subsystem, subsystem_mask;
    226                int revision, revision_mask;                            /* Only 8 bits. */
    227        } id;
    228        int drv_flags;                          /* Driver use, intended as capability flags. */
    229};
    230
    231static const struct pci_id_info pci_id_tbl[] = {
    232	{"Yellowfin G-NIC Gigabit Ethernet", { 0x07021000, 0xffffffff},
    233	 FullTxStatus | IsGigabit | HasMulticastBug | HasMACAddrBug | DontUseEeprom},
    234	{"Symbios SYM83C885", { 0x07011000, 0xffffffff},
    235	  HasMII | DontUseEeprom },
    236	{ }
    237};
    238
    239static const struct pci_device_id yellowfin_pci_tbl[] = {
    240	{ 0x1000, 0x0702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
    241	{ 0x1000, 0x0701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
    242	{ }
    243};
    244MODULE_DEVICE_TABLE (pci, yellowfin_pci_tbl);
    245
    246
    247/* Offsets to the Yellowfin registers.  Various sizes and alignments. */
    248enum yellowfin_offsets {
    249	TxCtrl=0x00, TxStatus=0x04, TxPtr=0x0C,
    250	TxIntrSel=0x10, TxBranchSel=0x14, TxWaitSel=0x18,
    251	RxCtrl=0x40, RxStatus=0x44, RxPtr=0x4C,
    252	RxIntrSel=0x50, RxBranchSel=0x54, RxWaitSel=0x58,
    253	EventStatus=0x80, IntrEnb=0x82, IntrClear=0x84, IntrStatus=0x86,
    254	ChipRev=0x8C, DMACtrl=0x90, TxThreshold=0x94,
    255	Cnfg=0xA0, FrameGap0=0xA2, FrameGap1=0xA4,
    256	MII_Cmd=0xA6, MII_Addr=0xA8, MII_Wr_Data=0xAA, MII_Rd_Data=0xAC,
    257	MII_Status=0xAE,
    258	RxDepth=0xB8, FlowCtrl=0xBC,
    259	AddrMode=0xD0, StnAddr=0xD2, HashTbl=0xD8, FIFOcfg=0xF8,
    260	EEStatus=0xF0, EECtrl=0xF1, EEAddr=0xF2, EERead=0xF3, EEWrite=0xF4,
    261	EEFeature=0xF5,
    262};
    263
    264/* The Yellowfin Rx and Tx buffer descriptors.
    265   Elements are written as 32 bit for endian portability. */
    266struct yellowfin_desc {
    267	__le32 dbdma_cmd;
    268	__le32 addr;
    269	__le32 branch_addr;
    270	__le32 result_status;
    271};
    272
    273struct tx_status_words {
    274#ifdef __BIG_ENDIAN
    275	u16 tx_errs;
    276	u16 tx_cnt;
    277	u16 paused;
    278	u16 total_tx_cnt;
    279#else  /* Little endian chips. */
    280	u16 tx_cnt;
    281	u16 tx_errs;
    282	u16 total_tx_cnt;
    283	u16 paused;
    284#endif /* __BIG_ENDIAN */
    285};
    286
    287/* Bits in yellowfin_desc.cmd */
    288enum desc_cmd_bits {
    289	CMD_TX_PKT=0x10000000, CMD_RX_BUF=0x20000000, CMD_TXSTATUS=0x30000000,
    290	CMD_NOP=0x60000000, CMD_STOP=0x70000000,
    291	BRANCH_ALWAYS=0x0C0000, INTR_ALWAYS=0x300000, WAIT_ALWAYS=0x030000,
    292	BRANCH_IFTRUE=0x040000,
    293};
    294
    295/* Bits in yellowfin_desc.status */
    296enum desc_status_bits { RX_EOP=0x0040, };
    297
    298/* Bits in the interrupt status/mask registers. */
    299enum intr_status_bits {
    300	IntrRxDone=0x01, IntrRxInvalid=0x02, IntrRxPCIFault=0x04,IntrRxPCIErr=0x08,
    301	IntrTxDone=0x10, IntrTxInvalid=0x20, IntrTxPCIFault=0x40,IntrTxPCIErr=0x80,
    302	IntrEarlyRx=0x100, IntrWakeup=0x200, };
    303
    304#define PRIV_ALIGN	31 	/* Required alignment mask */
    305#define MII_CNT		4
    306struct yellowfin_private {
    307	/* Descriptor rings first for alignment.
    308	   Tx requires a second descriptor for status. */
    309	struct yellowfin_desc *rx_ring;
    310	struct yellowfin_desc *tx_ring;
    311	struct sk_buff* rx_skbuff[RX_RING_SIZE];
    312	struct sk_buff* tx_skbuff[TX_RING_SIZE];
    313	dma_addr_t rx_ring_dma;
    314	dma_addr_t tx_ring_dma;
    315
    316	struct tx_status_words *tx_status;
    317	dma_addr_t tx_status_dma;
    318
    319	struct timer_list timer;	/* Media selection timer. */
    320	/* Frequently used and paired value: keep adjacent for cache effect. */
    321	int chip_id, drv_flags;
    322	struct pci_dev *pci_dev;
    323	unsigned int cur_rx, dirty_rx;		/* Producer/consumer ring indices */
    324	unsigned int rx_buf_sz;				/* Based on MTU+slack. */
    325	struct tx_status_words *tx_tail_desc;
    326	unsigned int cur_tx, dirty_tx;
    327	int tx_threshold;
    328	unsigned int tx_full:1;				/* The Tx queue is full. */
    329	unsigned int full_duplex:1;			/* Full-duplex operation requested. */
    330	unsigned int duplex_lock:1;
    331	unsigned int medialock:1;			/* Do not sense media. */
    332	unsigned int default_port:4;		/* Last dev->if_port value. */
    333	/* MII transceiver section. */
    334	int mii_cnt;						/* MII device addresses. */
    335	u16 advertising;					/* NWay media advertisement */
    336	unsigned char phys[MII_CNT];		/* MII device addresses, only first one used */
    337	spinlock_t lock;
    338	void __iomem *base;
    339};
    340
    341static int read_eeprom(void __iomem *ioaddr, int location);
    342static int mdio_read(void __iomem *ioaddr, int phy_id, int location);
    343static void mdio_write(void __iomem *ioaddr, int phy_id, int location, int value);
    344static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
    345static int yellowfin_open(struct net_device *dev);
    346static void yellowfin_timer(struct timer_list *t);
    347static void yellowfin_tx_timeout(struct net_device *dev, unsigned int txqueue);
    348static int yellowfin_init_ring(struct net_device *dev);
    349static netdev_tx_t yellowfin_start_xmit(struct sk_buff *skb,
    350					struct net_device *dev);
    351static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance);
    352static int yellowfin_rx(struct net_device *dev);
    353static void yellowfin_error(struct net_device *dev, int intr_status);
    354static int yellowfin_close(struct net_device *dev);
    355static void set_rx_mode(struct net_device *dev);
    356static const struct ethtool_ops ethtool_ops;
    357
    358static const struct net_device_ops netdev_ops = {
    359	.ndo_open 		= yellowfin_open,
    360	.ndo_stop 		= yellowfin_close,
    361	.ndo_start_xmit 	= yellowfin_start_xmit,
    362	.ndo_set_rx_mode	= set_rx_mode,
    363	.ndo_validate_addr	= eth_validate_addr,
    364	.ndo_set_mac_address 	= eth_mac_addr,
    365	.ndo_eth_ioctl		= netdev_ioctl,
    366	.ndo_tx_timeout 	= yellowfin_tx_timeout,
    367};
    368
    369static int yellowfin_init_one(struct pci_dev *pdev,
    370			      const struct pci_device_id *ent)
    371{
    372	struct net_device *dev;
    373	struct yellowfin_private *np;
    374	int irq;
    375	int chip_idx = ent->driver_data;
    376	static int find_cnt;
    377	void __iomem *ioaddr;
    378	int i, option = find_cnt < MAX_UNITS ? options[find_cnt] : 0;
    379	int drv_flags = pci_id_tbl[chip_idx].drv_flags;
    380        void *ring_space;
    381        dma_addr_t ring_dma;
    382#ifdef USE_IO_OPS
    383	int bar = 0;
    384#else
    385	int bar = 1;
    386#endif
    387	u8 addr[ETH_ALEN];
    388
    389/* when built into the kernel, we only print version if device is found */
    390#ifndef MODULE
    391	static int printed_version;
    392	if (!printed_version++)
    393		printk(version);
    394#endif
    395
    396	i = pci_enable_device(pdev);
    397	if (i) return i;
    398
    399	dev = alloc_etherdev(sizeof(*np));
    400	if (!dev)
    401		return -ENOMEM;
    402
    403	SET_NETDEV_DEV(dev, &pdev->dev);
    404
    405	np = netdev_priv(dev);
    406
    407	if (pci_request_regions(pdev, DRV_NAME))
    408		goto err_out_free_netdev;
    409
    410	pci_set_master (pdev);
    411
    412	ioaddr = pci_iomap(pdev, bar, YELLOWFIN_SIZE);
    413	if (!ioaddr)
    414		goto err_out_free_res;
    415
    416	irq = pdev->irq;
    417
    418	if (drv_flags & DontUseEeprom)
    419		for (i = 0; i < 6; i++)
    420			addr[i] = ioread8(ioaddr + StnAddr + i);
    421	else {
    422		int ee_offset = (read_eeprom(ioaddr, 6) == 0xff ? 0x100 : 0);
    423		for (i = 0; i < 6; i++)
    424			addr[i] = read_eeprom(ioaddr, ee_offset + i);
    425	}
    426	eth_hw_addr_set(dev, addr);
    427
    428	/* Reset the chip. */
    429	iowrite32(0x80000000, ioaddr + DMACtrl);
    430
    431	pci_set_drvdata(pdev, dev);
    432	spin_lock_init(&np->lock);
    433
    434	np->pci_dev = pdev;
    435	np->chip_id = chip_idx;
    436	np->drv_flags = drv_flags;
    437	np->base = ioaddr;
    438
    439	ring_space = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, &ring_dma,
    440					GFP_KERNEL);
    441	if (!ring_space)
    442		goto err_out_cleardev;
    443	np->tx_ring = ring_space;
    444	np->tx_ring_dma = ring_dma;
    445
    446	ring_space = dma_alloc_coherent(&pdev->dev, RX_TOTAL_SIZE, &ring_dma,
    447					GFP_KERNEL);
    448	if (!ring_space)
    449		goto err_out_unmap_tx;
    450	np->rx_ring = ring_space;
    451	np->rx_ring_dma = ring_dma;
    452
    453	ring_space = dma_alloc_coherent(&pdev->dev, STATUS_TOTAL_SIZE,
    454					&ring_dma, GFP_KERNEL);
    455	if (!ring_space)
    456		goto err_out_unmap_rx;
    457	np->tx_status = ring_space;
    458	np->tx_status_dma = ring_dma;
    459
    460	if (dev->mem_start)
    461		option = dev->mem_start;
    462
    463	/* The lower four bits are the media type. */
    464	if (option > 0) {
    465		if (option & 0x200)
    466			np->full_duplex = 1;
    467		np->default_port = option & 15;
    468		if (np->default_port)
    469			np->medialock = 1;
    470	}
    471	if (find_cnt < MAX_UNITS  &&  full_duplex[find_cnt] > 0)
    472		np->full_duplex = 1;
    473
    474	if (np->full_duplex)
    475		np->duplex_lock = 1;
    476
    477	/* The Yellowfin-specific entries in the device structure. */
    478	dev->netdev_ops = &netdev_ops;
    479	dev->ethtool_ops = &ethtool_ops;
    480	dev->watchdog_timeo = TX_TIMEOUT;
    481
    482	if (mtu)
    483		dev->mtu = mtu;
    484
    485	i = register_netdev(dev);
    486	if (i)
    487		goto err_out_unmap_status;
    488
    489	netdev_info(dev, "%s type %8x at %p, %pM, IRQ %d\n",
    490		    pci_id_tbl[chip_idx].name,
    491		    ioread32(ioaddr + ChipRev), ioaddr,
    492		    dev->dev_addr, irq);
    493
    494	if (np->drv_flags & HasMII) {
    495		int phy, phy_idx = 0;
    496		for (phy = 0; phy < 32 && phy_idx < MII_CNT; phy++) {
    497			int mii_status = mdio_read(ioaddr, phy, 1);
    498			if (mii_status != 0xffff  &&  mii_status != 0x0000) {
    499				np->phys[phy_idx++] = phy;
    500				np->advertising = mdio_read(ioaddr, phy, 4);
    501				netdev_info(dev, "MII PHY found at address %d, status 0x%04x advertising %04x\n",
    502					    phy, mii_status, np->advertising);
    503			}
    504		}
    505		np->mii_cnt = phy_idx;
    506	}
    507
    508	find_cnt++;
    509
    510	return 0;
    511
    512err_out_unmap_status:
    513	dma_free_coherent(&pdev->dev, STATUS_TOTAL_SIZE, np->tx_status,
    514			  np->tx_status_dma);
    515err_out_unmap_rx:
    516	dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, np->rx_ring,
    517			  np->rx_ring_dma);
    518err_out_unmap_tx:
    519	dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, np->tx_ring,
    520			  np->tx_ring_dma);
    521err_out_cleardev:
    522	pci_iounmap(pdev, ioaddr);
    523err_out_free_res:
    524	pci_release_regions(pdev);
    525err_out_free_netdev:
    526	free_netdev (dev);
    527	return -ENODEV;
    528}
    529
    530static int read_eeprom(void __iomem *ioaddr, int location)
    531{
    532	int bogus_cnt = 10000;		/* Typical 33Mhz: 1050 ticks */
    533
    534	iowrite8(location, ioaddr + EEAddr);
    535	iowrite8(0x30 | ((location >> 8) & 7), ioaddr + EECtrl);
    536	while ((ioread8(ioaddr + EEStatus) & 0x80)  &&  --bogus_cnt > 0)
    537		;
    538	return ioread8(ioaddr + EERead);
    539}
    540
    541/* MII Managemen Data I/O accesses.
    542   These routines assume the MDIO controller is idle, and do not exit until
    543   the command is finished. */
    544
    545static int mdio_read(void __iomem *ioaddr, int phy_id, int location)
    546{
    547	int i;
    548
    549	iowrite16((phy_id<<8) + location, ioaddr + MII_Addr);
    550	iowrite16(1, ioaddr + MII_Cmd);
    551	for (i = 10000; i >= 0; i--)
    552		if ((ioread16(ioaddr + MII_Status) & 1) == 0)
    553			break;
    554	return ioread16(ioaddr + MII_Rd_Data);
    555}
    556
    557static void mdio_write(void __iomem *ioaddr, int phy_id, int location, int value)
    558{
    559	int i;
    560
    561	iowrite16((phy_id<<8) + location, ioaddr + MII_Addr);
    562	iowrite16(value, ioaddr + MII_Wr_Data);
    563
    564	/* Wait for the command to finish. */
    565	for (i = 10000; i >= 0; i--)
    566		if ((ioread16(ioaddr + MII_Status) & 1) == 0)
    567			break;
    568}
    569
    570
    571static int yellowfin_open(struct net_device *dev)
    572{
    573	struct yellowfin_private *yp = netdev_priv(dev);
    574	const int irq = yp->pci_dev->irq;
    575	void __iomem *ioaddr = yp->base;
    576	int i, rc;
    577
    578	/* Reset the chip. */
    579	iowrite32(0x80000000, ioaddr + DMACtrl);
    580
    581	rc = request_irq(irq, yellowfin_interrupt, IRQF_SHARED, dev->name, dev);
    582	if (rc)
    583		return rc;
    584
    585	rc = yellowfin_init_ring(dev);
    586	if (rc < 0)
    587		goto err_free_irq;
    588
    589	iowrite32(yp->rx_ring_dma, ioaddr + RxPtr);
    590	iowrite32(yp->tx_ring_dma, ioaddr + TxPtr);
    591
    592	for (i = 0; i < 6; i++)
    593		iowrite8(dev->dev_addr[i], ioaddr + StnAddr + i);
    594
    595	/* Set up various condition 'select' registers.
    596	   There are no options here. */
    597	iowrite32(0x00800080, ioaddr + TxIntrSel); 	/* Interrupt on Tx abort */
    598	iowrite32(0x00800080, ioaddr + TxBranchSel);	/* Branch on Tx abort */
    599	iowrite32(0x00400040, ioaddr + TxWaitSel); 	/* Wait on Tx status */
    600	iowrite32(0x00400040, ioaddr + RxIntrSel);	/* Interrupt on Rx done */
    601	iowrite32(0x00400040, ioaddr + RxBranchSel);	/* Branch on Rx error */
    602	iowrite32(0x00400040, ioaddr + RxWaitSel);	/* Wait on Rx done */
    603
    604	/* Initialize other registers: with so many this eventually this will
    605	   converted to an offset/value list. */
    606	iowrite32(dma_ctrl, ioaddr + DMACtrl);
    607	iowrite16(fifo_cfg, ioaddr + FIFOcfg);
    608	/* Enable automatic generation of flow control frames, period 0xffff. */
    609	iowrite32(0x0030FFFF, ioaddr + FlowCtrl);
    610
    611	yp->tx_threshold = 32;
    612	iowrite32(yp->tx_threshold, ioaddr + TxThreshold);
    613
    614	if (dev->if_port == 0)
    615		dev->if_port = yp->default_port;
    616
    617	netif_start_queue(dev);
    618
    619	/* Setting the Rx mode will start the Rx process. */
    620	if (yp->drv_flags & IsGigabit) {
    621		/* We are always in full-duplex mode with gigabit! */
    622		yp->full_duplex = 1;
    623		iowrite16(0x01CF, ioaddr + Cnfg);
    624	} else {
    625		iowrite16(0x0018, ioaddr + FrameGap0); /* 0060/4060 for non-MII 10baseT */
    626		iowrite16(0x1018, ioaddr + FrameGap1);
    627		iowrite16(0x101C | (yp->full_duplex ? 2 : 0), ioaddr + Cnfg);
    628	}
    629	set_rx_mode(dev);
    630
    631	/* Enable interrupts by setting the interrupt mask. */
    632	iowrite16(0x81ff, ioaddr + IntrEnb);			/* See enum intr_status_bits */
    633	iowrite16(0x0000, ioaddr + EventStatus);		/* Clear non-interrupting events */
    634	iowrite32(0x80008000, ioaddr + RxCtrl);		/* Start Rx and Tx channels. */
    635	iowrite32(0x80008000, ioaddr + TxCtrl);
    636
    637	if (yellowfin_debug > 2) {
    638		netdev_printk(KERN_DEBUG, dev, "Done %s()\n", __func__);
    639	}
    640
    641	/* Set the timer to check for link beat. */
    642	timer_setup(&yp->timer, yellowfin_timer, 0);
    643	yp->timer.expires = jiffies + 3*HZ;
    644	add_timer(&yp->timer);
    645out:
    646	return rc;
    647
    648err_free_irq:
    649	free_irq(irq, dev);
    650	goto out;
    651}
    652
    653static void yellowfin_timer(struct timer_list *t)
    654{
    655	struct yellowfin_private *yp = from_timer(yp, t, timer);
    656	struct net_device *dev = pci_get_drvdata(yp->pci_dev);
    657	void __iomem *ioaddr = yp->base;
    658	int next_tick = 60*HZ;
    659
    660	if (yellowfin_debug > 3) {
    661		netdev_printk(KERN_DEBUG, dev, "Yellowfin timer tick, status %08x\n",
    662			      ioread16(ioaddr + IntrStatus));
    663	}
    664
    665	if (yp->mii_cnt) {
    666		int bmsr = mdio_read(ioaddr, yp->phys[0], MII_BMSR);
    667		int lpa = mdio_read(ioaddr, yp->phys[0], MII_LPA);
    668		int negotiated = lpa & yp->advertising;
    669		if (yellowfin_debug > 1)
    670			netdev_printk(KERN_DEBUG, dev, "MII #%d status register is %04x, link partner capability %04x\n",
    671				      yp->phys[0], bmsr, lpa);
    672
    673		yp->full_duplex = mii_duplex(yp->duplex_lock, negotiated);
    674
    675		iowrite16(0x101C | (yp->full_duplex ? 2 : 0), ioaddr + Cnfg);
    676
    677		if (bmsr & BMSR_LSTATUS)
    678			next_tick = 60*HZ;
    679		else
    680			next_tick = 3*HZ;
    681	}
    682
    683	yp->timer.expires = jiffies + next_tick;
    684	add_timer(&yp->timer);
    685}
    686
    687static void yellowfin_tx_timeout(struct net_device *dev, unsigned int txqueue)
    688{
    689	struct yellowfin_private *yp = netdev_priv(dev);
    690	void __iomem *ioaddr = yp->base;
    691
    692	netdev_warn(dev, "Yellowfin transmit timed out at %d/%d Tx status %04x, Rx status %04x, resetting...\n",
    693		    yp->cur_tx, yp->dirty_tx,
    694		    ioread32(ioaddr + TxStatus),
    695		    ioread32(ioaddr + RxStatus));
    696
    697	/* Note: these should be KERN_DEBUG. */
    698	if (yellowfin_debug) {
    699		int i;
    700		pr_warn("  Rx ring %p: ", yp->rx_ring);
    701		for (i = 0; i < RX_RING_SIZE; i++)
    702			pr_cont(" %08x", yp->rx_ring[i].result_status);
    703		pr_cont("\n");
    704		pr_warn("  Tx ring %p: ", yp->tx_ring);
    705		for (i = 0; i < TX_RING_SIZE; i++)
    706			pr_cont(" %04x /%08x",
    707			       yp->tx_status[i].tx_errs,
    708			       yp->tx_ring[i].result_status);
    709		pr_cont("\n");
    710	}
    711
    712	/* If the hardware is found to hang regularly, we will update the code
    713	   to reinitialize the chip here. */
    714	dev->if_port = 0;
    715
    716	/* Wake the potentially-idle transmit channel. */
    717	iowrite32(0x10001000, yp->base + TxCtrl);
    718	if (yp->cur_tx - yp->dirty_tx < TX_QUEUE_SIZE)
    719		netif_wake_queue (dev);		/* Typical path */
    720
    721	netif_trans_update(dev); /* prevent tx timeout */
    722	dev->stats.tx_errors++;
    723}
    724
    725/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
    726static int yellowfin_init_ring(struct net_device *dev)
    727{
    728	struct yellowfin_private *yp = netdev_priv(dev);
    729	int i, j;
    730
    731	yp->tx_full = 0;
    732	yp->cur_rx = yp->cur_tx = 0;
    733	yp->dirty_tx = 0;
    734
    735	yp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
    736
    737	for (i = 0; i < RX_RING_SIZE; i++) {
    738		yp->rx_ring[i].dbdma_cmd =
    739			cpu_to_le32(CMD_RX_BUF | INTR_ALWAYS | yp->rx_buf_sz);
    740		yp->rx_ring[i].branch_addr = cpu_to_le32(yp->rx_ring_dma +
    741			((i+1)%RX_RING_SIZE)*sizeof(struct yellowfin_desc));
    742	}
    743
    744	for (i = 0; i < RX_RING_SIZE; i++) {
    745		struct sk_buff *skb = netdev_alloc_skb(dev, yp->rx_buf_sz + 2);
    746		yp->rx_skbuff[i] = skb;
    747		if (skb == NULL)
    748			break;
    749		skb_reserve(skb, 2);	/* 16 byte align the IP header. */
    750		yp->rx_ring[i].addr = cpu_to_le32(dma_map_single(&yp->pci_dev->dev,
    751								 skb->data,
    752								 yp->rx_buf_sz,
    753								 DMA_FROM_DEVICE));
    754	}
    755	if (i != RX_RING_SIZE) {
    756		for (j = 0; j < i; j++)
    757			dev_kfree_skb(yp->rx_skbuff[j]);
    758		return -ENOMEM;
    759	}
    760	yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP);
    761	yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
    762
    763#define NO_TXSTATS
    764#ifdef NO_TXSTATS
    765	/* In this mode the Tx ring needs only a single descriptor. */
    766	for (i = 0; i < TX_RING_SIZE; i++) {
    767		yp->tx_skbuff[i] = NULL;
    768		yp->tx_ring[i].dbdma_cmd = cpu_to_le32(CMD_STOP);
    769		yp->tx_ring[i].branch_addr = cpu_to_le32(yp->tx_ring_dma +
    770			((i+1)%TX_RING_SIZE)*sizeof(struct yellowfin_desc));
    771	}
    772	/* Wrap ring */
    773	yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS);
    774#else
    775{
    776	/* Tx ring needs a pair of descriptors, the second for the status. */
    777	for (i = 0; i < TX_RING_SIZE; i++) {
    778		j = 2*i;
    779		yp->tx_skbuff[i] = 0;
    780		/* Branch on Tx error. */
    781		yp->tx_ring[j].dbdma_cmd = cpu_to_le32(CMD_STOP);
    782		yp->tx_ring[j].branch_addr = cpu_to_le32(yp->tx_ring_dma +
    783			(j+1)*sizeof(struct yellowfin_desc));
    784		j++;
    785		if (yp->flags & FullTxStatus) {
    786			yp->tx_ring[j].dbdma_cmd =
    787				cpu_to_le32(CMD_TXSTATUS | sizeof(*yp->tx_status));
    788			yp->tx_ring[j].request_cnt = sizeof(*yp->tx_status);
    789			yp->tx_ring[j].addr = cpu_to_le32(yp->tx_status_dma +
    790				i*sizeof(struct tx_status_words));
    791		} else {
    792			/* Symbios chips write only tx_errs word. */
    793			yp->tx_ring[j].dbdma_cmd =
    794				cpu_to_le32(CMD_TXSTATUS | INTR_ALWAYS | 2);
    795			yp->tx_ring[j].request_cnt = 2;
    796			/* Om pade ummmmm... */
    797			yp->tx_ring[j].addr = cpu_to_le32(yp->tx_status_dma +
    798				i*sizeof(struct tx_status_words) +
    799				&(yp->tx_status[0].tx_errs) -
    800				&(yp->tx_status[0]));
    801		}
    802		yp->tx_ring[j].branch_addr = cpu_to_le32(yp->tx_ring_dma +
    803			((j+1)%(2*TX_RING_SIZE))*sizeof(struct yellowfin_desc));
    804	}
    805	/* Wrap ring */
    806	yp->tx_ring[++j].dbdma_cmd |= cpu_to_le32(BRANCH_ALWAYS | INTR_ALWAYS);
    807}
    808#endif
    809	yp->tx_tail_desc = &yp->tx_status[0];
    810	return 0;
    811}
    812
    813static netdev_tx_t yellowfin_start_xmit(struct sk_buff *skb,
    814					struct net_device *dev)
    815{
    816	struct yellowfin_private *yp = netdev_priv(dev);
    817	unsigned entry;
    818	int len = skb->len;
    819
    820	netif_stop_queue (dev);
    821
    822	/* Note: Ordering is important here, set the field with the
    823	   "ownership" bit last, and only then increment cur_tx. */
    824
    825	/* Calculate the next Tx descriptor entry. */
    826	entry = yp->cur_tx % TX_RING_SIZE;
    827
    828	if (gx_fix) {	/* Note: only works for paddable protocols e.g.  IP. */
    829		int cacheline_end = ((unsigned long)skb->data + skb->len) % 32;
    830		/* Fix GX chipset errata. */
    831		if (cacheline_end > 24  || cacheline_end == 0) {
    832			len = skb->len + 32 - cacheline_end + 1;
    833			if (skb_padto(skb, len)) {
    834				yp->tx_skbuff[entry] = NULL;
    835				netif_wake_queue(dev);
    836				return NETDEV_TX_OK;
    837			}
    838		}
    839	}
    840	yp->tx_skbuff[entry] = skb;
    841
    842#ifdef NO_TXSTATS
    843	yp->tx_ring[entry].addr = cpu_to_le32(dma_map_single(&yp->pci_dev->dev,
    844							     skb->data,
    845							     len, DMA_TO_DEVICE));
    846	yp->tx_ring[entry].result_status = 0;
    847	if (entry >= TX_RING_SIZE-1) {
    848		/* New stop command. */
    849		yp->tx_ring[0].dbdma_cmd = cpu_to_le32(CMD_STOP);
    850		yp->tx_ring[TX_RING_SIZE-1].dbdma_cmd =
    851			cpu_to_le32(CMD_TX_PKT|BRANCH_ALWAYS | len);
    852	} else {
    853		yp->tx_ring[entry+1].dbdma_cmd = cpu_to_le32(CMD_STOP);
    854		yp->tx_ring[entry].dbdma_cmd =
    855			cpu_to_le32(CMD_TX_PKT | BRANCH_IFTRUE | len);
    856	}
    857	yp->cur_tx++;
    858#else
    859	yp->tx_ring[entry<<1].request_cnt = len;
    860	yp->tx_ring[entry<<1].addr = cpu_to_le32(dma_map_single(&yp->pci_dev->dev,
    861								skb->data,
    862								len, DMA_TO_DEVICE));
    863	/* The input_last (status-write) command is constant, but we must
    864	   rewrite the subsequent 'stop' command. */
    865
    866	yp->cur_tx++;
    867	{
    868		unsigned next_entry = yp->cur_tx % TX_RING_SIZE;
    869		yp->tx_ring[next_entry<<1].dbdma_cmd = cpu_to_le32(CMD_STOP);
    870	}
    871	/* Final step -- overwrite the old 'stop' command. */
    872
    873	yp->tx_ring[entry<<1].dbdma_cmd =
    874		cpu_to_le32( ((entry % 6) == 0 ? CMD_TX_PKT|INTR_ALWAYS|BRANCH_IFTRUE :
    875					  CMD_TX_PKT | BRANCH_IFTRUE) | len);
    876#endif
    877
    878	/* Non-x86 Todo: explicitly flush cache lines here. */
    879
    880	/* Wake the potentially-idle transmit channel. */
    881	iowrite32(0x10001000, yp->base + TxCtrl);
    882
    883	if (yp->cur_tx - yp->dirty_tx < TX_QUEUE_SIZE)
    884		netif_start_queue (dev);		/* Typical path */
    885	else
    886		yp->tx_full = 1;
    887
    888	if (yellowfin_debug > 4) {
    889		netdev_printk(KERN_DEBUG, dev, "Yellowfin transmit frame #%d queued in slot %d\n",
    890			      yp->cur_tx, entry);
    891	}
    892	return NETDEV_TX_OK;
    893}
    894
    895/* The interrupt handler does all of the Rx thread work and cleans up
    896   after the Tx thread. */
    897static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance)
    898{
    899	struct net_device *dev = dev_instance;
    900	struct yellowfin_private *yp;
    901	void __iomem *ioaddr;
    902	int boguscnt = max_interrupt_work;
    903	unsigned int handled = 0;
    904
    905	yp = netdev_priv(dev);
    906	ioaddr = yp->base;
    907
    908	spin_lock (&yp->lock);
    909
    910	do {
    911		u16 intr_status = ioread16(ioaddr + IntrClear);
    912
    913		if (yellowfin_debug > 4)
    914			netdev_printk(KERN_DEBUG, dev, "Yellowfin interrupt, status %04x\n",
    915				      intr_status);
    916
    917		if (intr_status == 0)
    918			break;
    919		handled = 1;
    920
    921		if (intr_status & (IntrRxDone | IntrEarlyRx)) {
    922			yellowfin_rx(dev);
    923			iowrite32(0x10001000, ioaddr + RxCtrl);		/* Wake Rx engine. */
    924		}
    925
    926#ifdef NO_TXSTATS
    927		for (; yp->cur_tx - yp->dirty_tx > 0; yp->dirty_tx++) {
    928			int entry = yp->dirty_tx % TX_RING_SIZE;
    929			struct sk_buff *skb;
    930
    931			if (yp->tx_ring[entry].result_status == 0)
    932				break;
    933			skb = yp->tx_skbuff[entry];
    934			dev->stats.tx_packets++;
    935			dev->stats.tx_bytes += skb->len;
    936			/* Free the original skb. */
    937			dma_unmap_single(&yp->pci_dev->dev,
    938					 le32_to_cpu(yp->tx_ring[entry].addr),
    939					 skb->len, DMA_TO_DEVICE);
    940			dev_consume_skb_irq(skb);
    941			yp->tx_skbuff[entry] = NULL;
    942		}
    943		if (yp->tx_full &&
    944		    yp->cur_tx - yp->dirty_tx < TX_QUEUE_SIZE - 4) {
    945			/* The ring is no longer full, clear tbusy. */
    946			yp->tx_full = 0;
    947			netif_wake_queue(dev);
    948		}
    949#else
    950		if ((intr_status & IntrTxDone) || (yp->tx_tail_desc->tx_errs)) {
    951			unsigned dirty_tx = yp->dirty_tx;
    952
    953			for (dirty_tx = yp->dirty_tx; yp->cur_tx - dirty_tx > 0;
    954				 dirty_tx++) {
    955				/* Todo: optimize this. */
    956				int entry = dirty_tx % TX_RING_SIZE;
    957				u16 tx_errs = yp->tx_status[entry].tx_errs;
    958				struct sk_buff *skb;
    959
    960#ifndef final_version
    961				if (yellowfin_debug > 5)
    962					netdev_printk(KERN_DEBUG, dev, "Tx queue %d check, Tx status %04x %04x %04x %04x\n",
    963						      entry,
    964						      yp->tx_status[entry].tx_cnt,
    965						      yp->tx_status[entry].tx_errs,
    966						      yp->tx_status[entry].total_tx_cnt,
    967						      yp->tx_status[entry].paused);
    968#endif
    969				if (tx_errs == 0)
    970					break;	/* It still hasn't been Txed */
    971				skb = yp->tx_skbuff[entry];
    972				if (tx_errs & 0xF810) {
    973					/* There was an major error, log it. */
    974#ifndef final_version
    975					if (yellowfin_debug > 1)
    976						netdev_printk(KERN_DEBUG, dev, "Transmit error, Tx status %04x\n",
    977							      tx_errs);
    978#endif
    979					dev->stats.tx_errors++;
    980					if (tx_errs & 0xF800) dev->stats.tx_aborted_errors++;
    981					if (tx_errs & 0x0800) dev->stats.tx_carrier_errors++;
    982					if (tx_errs & 0x2000) dev->stats.tx_window_errors++;
    983					if (tx_errs & 0x8000) dev->stats.tx_fifo_errors++;
    984				} else {
    985#ifndef final_version
    986					if (yellowfin_debug > 4)
    987						netdev_printk(KERN_DEBUG, dev, "Normal transmit, Tx status %04x\n",
    988							      tx_errs);
    989#endif
    990					dev->stats.tx_bytes += skb->len;
    991					dev->stats.collisions += tx_errs & 15;
    992					dev->stats.tx_packets++;
    993				}
    994				/* Free the original skb. */
    995				dma_unmap_single(&yp->pci_dev->dev,
    996						 yp->tx_ring[entry << 1].addr,
    997						 skb->len, DMA_TO_DEVICE);
    998				dev_consume_skb_irq(skb);
    999				yp->tx_skbuff[entry] = 0;
   1000				/* Mark status as empty. */
   1001				yp->tx_status[entry].tx_errs = 0;
   1002			}
   1003
   1004#ifndef final_version
   1005			if (yp->cur_tx - dirty_tx > TX_RING_SIZE) {
   1006				netdev_err(dev, "Out-of-sync dirty pointer, %d vs. %d, full=%d\n",
   1007					   dirty_tx, yp->cur_tx, yp->tx_full);
   1008				dirty_tx += TX_RING_SIZE;
   1009			}
   1010#endif
   1011
   1012			if (yp->tx_full &&
   1013			    yp->cur_tx - dirty_tx < TX_QUEUE_SIZE - 2) {
   1014				/* The ring is no longer full, clear tbusy. */
   1015				yp->tx_full = 0;
   1016				netif_wake_queue(dev);
   1017			}
   1018
   1019			yp->dirty_tx = dirty_tx;
   1020			yp->tx_tail_desc = &yp->tx_status[dirty_tx % TX_RING_SIZE];
   1021		}
   1022#endif
   1023
   1024		/* Log errors and other uncommon events. */
   1025		if (intr_status & 0x2ee)	/* Abnormal error summary. */
   1026			yellowfin_error(dev, intr_status);
   1027
   1028		if (--boguscnt < 0) {
   1029			netdev_warn(dev, "Too much work at interrupt, status=%#04x\n",
   1030				    intr_status);
   1031			break;
   1032		}
   1033	} while (1);
   1034
   1035	if (yellowfin_debug > 3)
   1036		netdev_printk(KERN_DEBUG, dev, "exiting interrupt, status=%#04x\n",
   1037			      ioread16(ioaddr + IntrStatus));
   1038
   1039	spin_unlock (&yp->lock);
   1040	return IRQ_RETVAL(handled);
   1041}
   1042
   1043/* This routine is logically part of the interrupt handler, but separated
   1044   for clarity and better register allocation. */
   1045static int yellowfin_rx(struct net_device *dev)
   1046{
   1047	struct yellowfin_private *yp = netdev_priv(dev);
   1048	int entry = yp->cur_rx % RX_RING_SIZE;
   1049	int boguscnt = yp->dirty_rx + RX_RING_SIZE - yp->cur_rx;
   1050
   1051	if (yellowfin_debug > 4) {
   1052		printk(KERN_DEBUG " In yellowfin_rx(), entry %d status %08x\n",
   1053			   entry, yp->rx_ring[entry].result_status);
   1054		printk(KERN_DEBUG "   #%d desc. %08x %08x %08x\n",
   1055			   entry, yp->rx_ring[entry].dbdma_cmd, yp->rx_ring[entry].addr,
   1056			   yp->rx_ring[entry].result_status);
   1057	}
   1058
   1059	/* If EOP is set on the next entry, it's a new packet. Send it up. */
   1060	while (1) {
   1061		struct yellowfin_desc *desc = &yp->rx_ring[entry];
   1062		struct sk_buff *rx_skb = yp->rx_skbuff[entry];
   1063		s16 frame_status;
   1064		u16 desc_status;
   1065		int data_size, __maybe_unused yf_size;
   1066		u8 *buf_addr;
   1067
   1068		if(!desc->result_status)
   1069			break;
   1070		dma_sync_single_for_cpu(&yp->pci_dev->dev,
   1071					le32_to_cpu(desc->addr),
   1072					yp->rx_buf_sz, DMA_FROM_DEVICE);
   1073		desc_status = le32_to_cpu(desc->result_status) >> 16;
   1074		buf_addr = rx_skb->data;
   1075		data_size = (le32_to_cpu(desc->dbdma_cmd) -
   1076			le32_to_cpu(desc->result_status)) & 0xffff;
   1077		frame_status = get_unaligned_le16(&(buf_addr[data_size - 2]));
   1078		if (yellowfin_debug > 4)
   1079			printk(KERN_DEBUG "  %s() status was %04x\n",
   1080			       __func__, frame_status);
   1081		if (--boguscnt < 0)
   1082			break;
   1083
   1084		yf_size = sizeof(struct yellowfin_desc);
   1085
   1086		if ( ! (desc_status & RX_EOP)) {
   1087			if (data_size != 0)
   1088				netdev_warn(dev, "Oversized Ethernet frame spanned multiple buffers, status %04x, data_size %d!\n",
   1089					    desc_status, data_size);
   1090			dev->stats.rx_length_errors++;
   1091		} else if ((yp->drv_flags & IsGigabit)  &&  (frame_status & 0x0038)) {
   1092			/* There was a error. */
   1093			if (yellowfin_debug > 3)
   1094				printk(KERN_DEBUG "  %s() Rx error was %04x\n",
   1095				       __func__, frame_status);
   1096			dev->stats.rx_errors++;
   1097			if (frame_status & 0x0060) dev->stats.rx_length_errors++;
   1098			if (frame_status & 0x0008) dev->stats.rx_frame_errors++;
   1099			if (frame_status & 0x0010) dev->stats.rx_crc_errors++;
   1100			if (frame_status < 0) dev->stats.rx_dropped++;
   1101		} else if ( !(yp->drv_flags & IsGigabit)  &&
   1102				   ((buf_addr[data_size-1] & 0x85) || buf_addr[data_size-2] & 0xC0)) {
   1103			u8 status1 = buf_addr[data_size-2];
   1104			u8 status2 = buf_addr[data_size-1];
   1105			dev->stats.rx_errors++;
   1106			if (status1 & 0xC0) dev->stats.rx_length_errors++;
   1107			if (status2 & 0x03) dev->stats.rx_frame_errors++;
   1108			if (status2 & 0x04) dev->stats.rx_crc_errors++;
   1109			if (status2 & 0x80) dev->stats.rx_dropped++;
   1110#ifdef YF_PROTOTYPE		/* Support for prototype hardware errata. */
   1111		} else if ((yp->flags & HasMACAddrBug)  &&
   1112			!ether_addr_equal(le32_to_cpu(yp->rx_ring_dma +
   1113						      entry * yf_size),
   1114					  dev->dev_addr) &&
   1115			!ether_addr_equal(le32_to_cpu(yp->rx_ring_dma +
   1116						      entry * yf_size),
   1117					  "\377\377\377\377\377\377")) {
   1118			if (bogus_rx++ == 0)
   1119				netdev_warn(dev, "Bad frame to %pM\n",
   1120					    buf_addr);
   1121#endif
   1122		} else {
   1123			struct sk_buff *skb;
   1124			int pkt_len = data_size -
   1125				(yp->chip_id ? 7 : 8 + buf_addr[data_size - 8]);
   1126			/* To verify: Yellowfin Length should omit the CRC! */
   1127
   1128#ifndef final_version
   1129			if (yellowfin_debug > 4)
   1130				printk(KERN_DEBUG "  %s() normal Rx pkt length %d of %d, bogus_cnt %d\n",
   1131				       __func__, pkt_len, data_size, boguscnt);
   1132#endif
   1133			/* Check if the packet is long enough to just pass up the skbuff
   1134			   without copying to a properly sized skbuff. */
   1135			if (pkt_len > rx_copybreak) {
   1136				skb_put(skb = rx_skb, pkt_len);
   1137				dma_unmap_single(&yp->pci_dev->dev,
   1138						 le32_to_cpu(yp->rx_ring[entry].addr),
   1139						 yp->rx_buf_sz,
   1140						 DMA_FROM_DEVICE);
   1141				yp->rx_skbuff[entry] = NULL;
   1142			} else {
   1143				skb = netdev_alloc_skb(dev, pkt_len + 2);
   1144				if (skb == NULL)
   1145					break;
   1146				skb_reserve(skb, 2);	/* 16 byte align the IP header */
   1147				skb_copy_to_linear_data(skb, rx_skb->data, pkt_len);
   1148				skb_put(skb, pkt_len);
   1149				dma_sync_single_for_device(&yp->pci_dev->dev,
   1150							   le32_to_cpu(desc->addr),
   1151							   yp->rx_buf_sz,
   1152							   DMA_FROM_DEVICE);
   1153			}
   1154			skb->protocol = eth_type_trans(skb, dev);
   1155			netif_rx(skb);
   1156			dev->stats.rx_packets++;
   1157			dev->stats.rx_bytes += pkt_len;
   1158		}
   1159		entry = (++yp->cur_rx) % RX_RING_SIZE;
   1160	}
   1161
   1162	/* Refill the Rx ring buffers. */
   1163	for (; yp->cur_rx - yp->dirty_rx > 0; yp->dirty_rx++) {
   1164		entry = yp->dirty_rx % RX_RING_SIZE;
   1165		if (yp->rx_skbuff[entry] == NULL) {
   1166			struct sk_buff *skb = netdev_alloc_skb(dev, yp->rx_buf_sz + 2);
   1167			if (skb == NULL)
   1168				break;				/* Better luck next round. */
   1169			yp->rx_skbuff[entry] = skb;
   1170			skb_reserve(skb, 2);	/* Align IP on 16 byte boundaries */
   1171			yp->rx_ring[entry].addr = cpu_to_le32(dma_map_single(&yp->pci_dev->dev,
   1172									     skb->data,
   1173									     yp->rx_buf_sz,
   1174									     DMA_FROM_DEVICE));
   1175		}
   1176		yp->rx_ring[entry].dbdma_cmd = cpu_to_le32(CMD_STOP);
   1177		yp->rx_ring[entry].result_status = 0;	/* Clear complete bit. */
   1178		if (entry != 0)
   1179			yp->rx_ring[entry - 1].dbdma_cmd =
   1180				cpu_to_le32(CMD_RX_BUF | INTR_ALWAYS | yp->rx_buf_sz);
   1181		else
   1182			yp->rx_ring[RX_RING_SIZE - 1].dbdma_cmd =
   1183				cpu_to_le32(CMD_RX_BUF | INTR_ALWAYS | BRANCH_ALWAYS
   1184							| yp->rx_buf_sz);
   1185	}
   1186
   1187	return 0;
   1188}
   1189
   1190static void yellowfin_error(struct net_device *dev, int intr_status)
   1191{
   1192	netdev_err(dev, "Something Wicked happened! %04x\n", intr_status);
   1193	/* Hmmmmm, it's not clear what to do here. */
   1194	if (intr_status & (IntrTxPCIErr | IntrTxPCIFault))
   1195		dev->stats.tx_errors++;
   1196	if (intr_status & (IntrRxPCIErr | IntrRxPCIFault))
   1197		dev->stats.rx_errors++;
   1198}
   1199
   1200static int yellowfin_close(struct net_device *dev)
   1201{
   1202	struct yellowfin_private *yp = netdev_priv(dev);
   1203	void __iomem *ioaddr = yp->base;
   1204	int i;
   1205
   1206	netif_stop_queue (dev);
   1207
   1208	if (yellowfin_debug > 1) {
   1209		netdev_printk(KERN_DEBUG, dev, "Shutting down ethercard, status was Tx %04x Rx %04x Int %02x\n",
   1210			      ioread16(ioaddr + TxStatus),
   1211			      ioread16(ioaddr + RxStatus),
   1212			      ioread16(ioaddr + IntrStatus));
   1213		netdev_printk(KERN_DEBUG, dev, "Queue pointers were Tx %d / %d,  Rx %d / %d\n",
   1214			      yp->cur_tx, yp->dirty_tx,
   1215			      yp->cur_rx, yp->dirty_rx);
   1216	}
   1217
   1218	/* Disable interrupts by clearing the interrupt mask. */
   1219	iowrite16(0x0000, ioaddr + IntrEnb);
   1220
   1221	/* Stop the chip's Tx and Rx processes. */
   1222	iowrite32(0x80000000, ioaddr + RxCtrl);
   1223	iowrite32(0x80000000, ioaddr + TxCtrl);
   1224
   1225	del_timer(&yp->timer);
   1226
   1227#if defined(__i386__)
   1228	if (yellowfin_debug > 2) {
   1229		printk(KERN_DEBUG "  Tx ring at %08llx:\n",
   1230				(unsigned long long)yp->tx_ring_dma);
   1231		for (i = 0; i < TX_RING_SIZE*2; i++)
   1232			printk(KERN_DEBUG " %c #%d desc. %08x %08x %08x %08x\n",
   1233				   ioread32(ioaddr + TxPtr) == (long)&yp->tx_ring[i] ? '>' : ' ',
   1234				   i, yp->tx_ring[i].dbdma_cmd, yp->tx_ring[i].addr,
   1235				   yp->tx_ring[i].branch_addr, yp->tx_ring[i].result_status);
   1236		printk(KERN_DEBUG "  Tx status %p:\n", yp->tx_status);
   1237		for (i = 0; i < TX_RING_SIZE; i++)
   1238			printk(KERN_DEBUG "   #%d status %04x %04x %04x %04x\n",
   1239				   i, yp->tx_status[i].tx_cnt, yp->tx_status[i].tx_errs,
   1240				   yp->tx_status[i].total_tx_cnt, yp->tx_status[i].paused);
   1241
   1242		printk(KERN_DEBUG "  Rx ring %08llx:\n",
   1243				(unsigned long long)yp->rx_ring_dma);
   1244		for (i = 0; i < RX_RING_SIZE; i++) {
   1245			printk(KERN_DEBUG " %c #%d desc. %08x %08x %08x\n",
   1246				   ioread32(ioaddr + RxPtr) == (long)&yp->rx_ring[i] ? '>' : ' ',
   1247				   i, yp->rx_ring[i].dbdma_cmd, yp->rx_ring[i].addr,
   1248				   yp->rx_ring[i].result_status);
   1249			if (yellowfin_debug > 6) {
   1250				if (get_unaligned((u8*)yp->rx_ring[i].addr) != 0x69) {
   1251					int j;
   1252
   1253					printk(KERN_DEBUG);
   1254					for (j = 0; j < 0x50; j++)
   1255						pr_cont(" %04x",
   1256							get_unaligned(((u16*)yp->rx_ring[i].addr) + j));
   1257					pr_cont("\n");
   1258				}
   1259			}
   1260		}
   1261	}
   1262#endif /* __i386__ debugging only */
   1263
   1264	free_irq(yp->pci_dev->irq, dev);
   1265
   1266	/* Free all the skbuffs in the Rx queue. */
   1267	for (i = 0; i < RX_RING_SIZE; i++) {
   1268		yp->rx_ring[i].dbdma_cmd = cpu_to_le32(CMD_STOP);
   1269		yp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */
   1270		if (yp->rx_skbuff[i]) {
   1271			dev_kfree_skb(yp->rx_skbuff[i]);
   1272		}
   1273		yp->rx_skbuff[i] = NULL;
   1274	}
   1275	for (i = 0; i < TX_RING_SIZE; i++) {
   1276		dev_kfree_skb(yp->tx_skbuff[i]);
   1277		yp->tx_skbuff[i] = NULL;
   1278	}
   1279
   1280#ifdef YF_PROTOTYPE			/* Support for prototype hardware errata. */
   1281	if (yellowfin_debug > 0) {
   1282		netdev_printk(KERN_DEBUG, dev, "Received %d frames that we should not have\n",
   1283			      bogus_rx);
   1284	}
   1285#endif
   1286
   1287	return 0;
   1288}
   1289
   1290/* Set or clear the multicast filter for this adaptor. */
   1291
   1292static void set_rx_mode(struct net_device *dev)
   1293{
   1294	struct yellowfin_private *yp = netdev_priv(dev);
   1295	void __iomem *ioaddr = yp->base;
   1296	u16 cfg_value = ioread16(ioaddr + Cnfg);
   1297
   1298	/* Stop the Rx process to change any value. */
   1299	iowrite16(cfg_value & ~0x1000, ioaddr + Cnfg);
   1300	if (dev->flags & IFF_PROMISC) {			/* Set promiscuous. */
   1301		iowrite16(0x000F, ioaddr + AddrMode);
   1302	} else if ((netdev_mc_count(dev) > 64) ||
   1303		   (dev->flags & IFF_ALLMULTI)) {
   1304		/* Too many to filter well, or accept all multicasts. */
   1305		iowrite16(0x000B, ioaddr + AddrMode);
   1306	} else if (!netdev_mc_empty(dev)) { /* Must use the multicast hash table. */
   1307		struct netdev_hw_addr *ha;
   1308		u16 hash_table[4];
   1309		int i;
   1310
   1311		memset(hash_table, 0, sizeof(hash_table));
   1312		netdev_for_each_mc_addr(ha, dev) {
   1313			unsigned int bit;
   1314
   1315			/* Due to a bug in the early chip versions, multiple filter
   1316			   slots must be set for each address. */
   1317			if (yp->drv_flags & HasMulticastBug) {
   1318				bit = (ether_crc_le(3, ha->addr) >> 3) & 0x3f;
   1319				hash_table[bit >> 4] |= (1 << bit);
   1320				bit = (ether_crc_le(4, ha->addr) >> 3) & 0x3f;
   1321				hash_table[bit >> 4] |= (1 << bit);
   1322				bit = (ether_crc_le(5, ha->addr) >> 3) & 0x3f;
   1323				hash_table[bit >> 4] |= (1 << bit);
   1324			}
   1325			bit = (ether_crc_le(6, ha->addr) >> 3) & 0x3f;
   1326			hash_table[bit >> 4] |= (1 << bit);
   1327		}
   1328		/* Copy the hash table to the chip. */
   1329		for (i = 0; i < 4; i++)
   1330			iowrite16(hash_table[i], ioaddr + HashTbl + i*2);
   1331		iowrite16(0x0003, ioaddr + AddrMode);
   1332	} else {					/* Normal, unicast/broadcast-only mode. */
   1333		iowrite16(0x0001, ioaddr + AddrMode);
   1334	}
   1335	/* Restart the Rx process. */
   1336	iowrite16(cfg_value | 0x1000, ioaddr + Cnfg);
   1337}
   1338
   1339static void yellowfin_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
   1340{
   1341	struct yellowfin_private *np = netdev_priv(dev);
   1342
   1343	strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
   1344	strlcpy(info->version, DRV_VERSION, sizeof(info->version));
   1345	strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info));
   1346}
   1347
   1348static const struct ethtool_ops ethtool_ops = {
   1349	.get_drvinfo = yellowfin_get_drvinfo
   1350};
   1351
   1352static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
   1353{
   1354	struct yellowfin_private *np = netdev_priv(dev);
   1355	void __iomem *ioaddr = np->base;
   1356	struct mii_ioctl_data *data = if_mii(rq);
   1357
   1358	switch(cmd) {
   1359	case SIOCGMIIPHY:		/* Get address of MII PHY in use. */
   1360		data->phy_id = np->phys[0] & 0x1f;
   1361		fallthrough;
   1362
   1363	case SIOCGMIIREG:		/* Read MII PHY register. */
   1364		data->val_out = mdio_read(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f);
   1365		return 0;
   1366
   1367	case SIOCSMIIREG:		/* Write MII PHY register. */
   1368		if (data->phy_id == np->phys[0]) {
   1369			u16 value = data->val_in;
   1370			switch (data->reg_num) {
   1371			case 0:
   1372				/* Check for autonegotiation on or reset. */
   1373				np->medialock = (value & 0x9000) ? 0 : 1;
   1374				if (np->medialock)
   1375					np->full_duplex = (value & 0x0100) ? 1 : 0;
   1376				break;
   1377			case 4: np->advertising = value; break;
   1378			}
   1379			/* Perhaps check_duplex(dev), depending on chip semantics. */
   1380		}
   1381		mdio_write(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
   1382		return 0;
   1383	default:
   1384		return -EOPNOTSUPP;
   1385	}
   1386}
   1387
   1388
   1389static void yellowfin_remove_one(struct pci_dev *pdev)
   1390{
   1391	struct net_device *dev = pci_get_drvdata(pdev);
   1392	struct yellowfin_private *np;
   1393
   1394	BUG_ON(!dev);
   1395	np = netdev_priv(dev);
   1396
   1397	dma_free_coherent(&pdev->dev, STATUS_TOTAL_SIZE, np->tx_status,
   1398			  np->tx_status_dma);
   1399	dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, np->rx_ring,
   1400			  np->rx_ring_dma);
   1401	dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, np->tx_ring,
   1402			  np->tx_ring_dma);
   1403	unregister_netdev (dev);
   1404
   1405	pci_iounmap(pdev, np->base);
   1406
   1407	pci_release_regions (pdev);
   1408
   1409	free_netdev (dev);
   1410}
   1411
   1412
   1413static struct pci_driver yellowfin_driver = {
   1414	.name		= DRV_NAME,
   1415	.id_table	= yellowfin_pci_tbl,
   1416	.probe		= yellowfin_init_one,
   1417	.remove		= yellowfin_remove_one,
   1418};
   1419
   1420
   1421static int __init yellowfin_init (void)
   1422{
   1423/* when a module, this is printed whether or not devices are found in probe */
   1424#ifdef MODULE
   1425	printk(version);
   1426#endif
   1427	return pci_register_driver(&yellowfin_driver);
   1428}
   1429
   1430
   1431static void __exit yellowfin_cleanup (void)
   1432{
   1433	pci_unregister_driver (&yellowfin_driver);
   1434}
   1435
   1436
   1437module_init(yellowfin_init);
   1438module_exit(yellowfin_cleanup);