/*
 * Copyright 2008-2014
 * erik quanstrom
 *
 * This software is provided `as-is,' without any express or implied
 * warranty.  In no event will the author be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1.  The origin of this software must not be misrepresented; you must
 * not claim that you wrote the original software.  If you use this
 * software in a product, an acknowledgment in the product documentation
 * would be appreciated but is not required.
 *
 * 2.  Altered source versions must be plainly marked as such, and must
 * not be misrepresented as being the original software.
 *
 * 3.  This notice may not be removed or altered from any source
 * distribution.
 */
/* This code has been modified by UC Berkeley and Google to work in Akaros. */
/*
 * Intel Gigabit Ethernet PCI-Express Controllers.
 *	8256[367], 8257[1-79], 21[078]
 * Pretty basic, does not use many of the chip smarts.
 * The interrupt mitigation tuning for each chip variant
 * is probably different. The reset/initialisation
 * sequence needs straightened out. Doubt the PHY code
 * for the 82575eb is right.
 *
 * on the assumption that allowing jumbo packets makes the controller
 * much slower (as is true of the 82579), never allow jumbos.
 */
#include <assert.h>
#include <cpio.h>
#include <error.h>
#include <kmalloc.h>
#include <kref.h>
#include <net/ip.h>
#include <pmap.h>
#include <slab.h>
#include <smp.h>
#include <stdio.h>
#include <string.h>

#define now() TK2MS(MACHP(0)->ticks)

/*
 * these are in the order they appear in the manual, not numeric order.
 * It was too hard to find them in the book. Ref 21489, rev 2.6
 */

enum {
	/* General */
	Ctrl = 0x0000,       /* Device Control */
	Status = 0x0008,     /* Device Status */
	Eec = 0x0010,        /* EEPROM/Flash Control/Data */
	Fextnvm6 = 0x0010,   /* Future Extended NVM 6 */
	Eerd = 0x0014,       /* EEPROM Read */
	Ctrlext = 0x0018,    /* Extended Device Control */
	Fla = 0x001c,        /* Flash Access */
	Mdic = 0x0020,       /* MDI Control */
	Seresctl = 0x0024,   /* Serdes ana */
	Fcal = 0x0028,       /* Flow Control Address Low */
	Fcah = 0x002C,       /* Flow Control Address High */
	Fct = 0x0030,        /* Flow Control Type */
	Kumctrlsta = 0x0034, /* MAC-PHY Interface */
	Vet = 0x0038,        /* VLAN EtherType */
	Fcttv = 0x0170,      /* Flow Control Transmit Timer Value */
	Txcw = 0x0178,       /* Transmit Configuration Word */
	Rxcw = 0x0180,       /* Receive Configuration Word */
	Ledctl = 0x0E00,     /* LED control */
	Pba = 0x1000,        /* Packet Buffer Allocation */
	Pbs = 0x1008,        /* Packet Buffer Size */

	/* Interrupt */
	Icr = 0x00C0, /* Interrupt Cause Read */
	Itr = 0x00c4, /* Interrupt Throttling Rate */
	Ics = 0x00C8, /* Interrupt Cause Set */
	Ims = 0x00D0, /* Interrupt Mask Set/Read */
	Imc = 0x00D8, /* Interrupt mask Clear */
	Iam = 0x00E0, /* Interrupt acknowledge Auto Mask */

	/* Receive */
	Rctl = 0x0100,    /* Control */
	Ert = 0x2008,     /* Early Receive Threshold (573[EVL], 579 only) */
	Fcrtl = 0x2160,   /* Flow Control RX Threshold Low */
	Fcrth = 0x2168,   /* Flow Control Rx Threshold High */
	Psrctl = 0x2170,  /* Packet Split Receive Control */
	Rdbal = 0x2800,   /* Rdesc Base Address Low Queue 0 */
	Rdbah = 0x2804,   /* Rdesc Base Address High Queue 0 */
	Rdlen = 0x2808,   /* Descriptor Length Queue 0 */
	Srrctl = 0x280c,  /* split and replication rx control (82575) */
	Rdh = 0x2810,     /* Descriptor Head Queue 0 */
	Rdt = 0x2818,     /* Descriptor Tail Queue 0 */
	Rdtr = 0x2820,    /* Descriptor Timer Ring */
	Rxdctl = 0x2828,  /* Descriptor Control */
	Radv = 0x282C,    /* Interrupt Absolute Delay Timer */
	Rdbal1 = 0x2900,  /* Rdesc Base Address Low Queue 1 */
	Rdbah1 = 0x2804,  /* Rdesc Base Address High Queue 1 */
	Rdlen1 = 0x2908,  /* Descriptor Length Queue 1 */
	Rdh1 = 0x2910,    /* Descriptor Head Queue 1 */
	Rdt1 = 0x2918,    /* Descriptor Tail Queue 1 */
	Rxdctl1 = 0x2928, /* Descriptor Control Queue 1 */
	Rsrpd = 0x2c00,   /* Small Packet Detect */
	Raid = 0x2c08,    /* ACK interrupt delay */
	Cpuvec = 0x2c10,  /* CPU Vector */
	Rxcsum = 0x5000,  /* Checksum Control */
	Rmpl = 0x5004,    /* rx maximum packet length (82575) */
	Rfctl = 0x5008,   /* Filter Control */
	Mta = 0x5200,     /* Multicast Table Array */
	Ral = 0x5400,     /* Receive Address Low */
	Rah = 0x5404,     /* Receive Address High */
	Vfta = 0x5600,    /* VLAN Filter Table Array */
	Mrqc = 0x5818,    /* Multiple Receive Queues Command */
	Rssim = 0x5864,   /* RSS Interrupt Mask */
	Rssir = 0x5868,   /* RSS Interrupt Request */
	Reta = 0x5c00,    /* Redirection Table */
	Rssrk = 0x5c80,   /* RSS Random Key */

	/* Transmit */
	Tctl = 0x0400, /* Transmit Control */
	Tipg = 0x0410, /* Transmit IPG */
	Tkabgtxd =
	    0x3004,      /* glci afe band gap transmit ref data, or something */
	Tdbal = 0x3800,  /* Tdesc Base Address Low */
	Tdbah = 0x3804,  /* Tdesc Base Address High */
	Tdlen = 0x3808,  /* Descriptor Length */
	Tdh = 0x3810,    /* Descriptor Head */
	Tdt = 0x3818,    /* Descriptor Tail */
	Tidv = 0x3820,   /* Interrupt Delay Value */
	Txdctl = 0x3828, /* Descriptor Control */
	Tadv = 0x382C,   /* Interrupt Absolute Delay Timer */
	Tarc0 = 0x3840,  /* Arbitration Counter Queue 0 */
	Tdbal1 = 0x3900, /* Descriptor Base Low Queue 1 */
	Tdbah1 = 0x3904, /* Descriptor Base High Queue 1 */
	Tdlen1 = 0x3908, /* Descriptor Length Queue 1 */
	Tdh1 = 0x3910,   /* Descriptor Head Queue 1 */
	Tdt1 = 0x3918,   /* Descriptor Tail Queue 1 */
	Txdctl1 = 0x3928, /* Descriptor Control 1 */
	Tarc1 = 0x3940,   /* Arbitration Counter Queue 1 */

	/* Statistics */
	Statistics = 0x4000, /* Start of Statistics Area */
	Gorcl = 0x88 / 4,    /* Good Octets Received Count */
	Gotcl = 0x90 / 4,    /* Good Octets Transmitted Count */
	Torl = 0xC0 / 4,     /* Total Octets Received */
	Totl = 0xC8 / 4,     /* Total Octets Transmitted */
	Nstatistics = 0x124 / 4,
};

enum {                      /* Ctrl */
       GIOmd = 1 << 2,      /* BIO master disable */
       Lrst = 1 << 3,       /* link reset */
       Slu = 1 << 6,        /* Set Link Up */
       SspeedMASK = 3 << 8, /* Speed Selection */
       SspeedSHIFT = 8,
       Sspeed10 = 0x00000000,      /* 10Mb/s */
       Sspeed100 = 0x00000100,     /* 100Mb/s */
       Sspeed1000 = 0x00000200,    /* 1000Mb/s */
       Frcspd = 1 << 11,           /* Force Speed */
       Frcdplx = 1 << 12,          /* Force Duplex */
       SwdpinsloMASK = 0x003C0000, /* Software Defined Pins - lo nibble */
       SwdpinsloSHIFT = 18,
       SwdpioloMASK = 0x03C00000, /* Software Defined Pins - I or O */
       SwdpioloSHIFT = 22,
       Devrst = 1 << 26, /* Device Reset */
       Rfce = 1 << 27,   /* Receive Flow Control Enable */
       Tfce = 1 << 28,   /* Transmit Flow Control Enable */
       Vme = 1 << 30,    /* VLAN Mode Enable */
       Phyrst = 1 << 31, /* Phy Reset */
};

enum {                   /* Status */
       Lu = 1 << 1,      /* Link Up */
       Lanid = 3 << 2,   /* mask for Lan ID. */
       Txoff = 1 << 4,   /* Transmission Paused */
       Tbimode = 1 << 5, /* TBI Mode Indication */
       Phyra = 1 << 10,  /* PHY Reset Asserted */
       GIOme = 1 << 19,  /* GIO Master Enable Status */
};

enum {
	/* Eec */
	Nvpres = 1 << 8,   /* nvram present */
	Autord = 1 << 9,   /* autoread complete */
	Sec1val = 1 << 22, /* sector 1 valid (!sec0) */
};

enum {                   /* Eerd */
       EEstart = 1 << 0, /* Start Read */
       EEdone = 1 << 1,  /* Read done */
};

enum {                    /* Ctrlext */
       Asdchk = 1 << 12,  /* ASD Check */
       Eerst = 1 << 13,   /* EEPROM Reset */
       Spdbyps = 1 << 15, /* Speed Select Bypass */
};

/*
 * TODO(dcross): 'Ea' is 0 elsewhere. Investigate and possibly correct.
 */
enum {               /* EEPROM content offsets */
       OldEa = 0x00, /* Old Ethernet address */
       Ea = 0x01,    /* Ethernet Address */
       Cf = 0x03,    /* Compatibility Field */
       Icw1 = 0x0A,  /* Initialization Control Word 1 */
       Sid = 0x0B,   /* Subsystem ID */
       Svid = 0x0C,  /* Subsystem Vendor ID */
       Did = 0x0D,   /* Device ID */
       Vid = 0x0E,   /* Vendor ID */
       Icw2 = 0x0F,  /* Initialization Control Word 2 */
};

enum {                        /* Mdic */
       MDIdMASK = 0x0000FFFF, /* Data */
       MDIdSHIFT = 0,
       MDIrMASK = 0x001F0000, /* PHY Register Address */
       MDIrSHIFT = 16,
       MDIpMASK = 0x03E00000, /* PHY Address */
       MDIpSHIFT = 21,
       MDIwop = 0x04000000,   /* Write Operation */
       MDIrop = 0x08000000,   /* Read Operation */
       MDIready = 0x10000000, /* End of Transaction */
       MDIie = 0x20000000,    /* Interrupt Enable */
       MDIe = 0x40000000,     /* Error */
};

enum {                 /* phy interface registers */
       Phyctl = 0,     /* phy ctl */
       Physsr = 17,    /* phy secondary status */
       Phyier = 18,    /* 82573 phy interrupt enable */
       Phyisr = 19,    /* 82563 phy interrupt status */
       Phylhr = 19,    /* 8257[12] link health */
       Phyier218 = 24, /* 218 (phy79?) phy interrupt enable */
       Phyisr218 = 25, /* 218 (phy79?) phy interrupt status */
       Phystat = 26,   /* 82580 (phy79?) phy status */
       Phypage = 31,   /* page number */

       Rtlink = 1 << 10, /* realtime link status */
       Phyan = 1 << 11,  /* phy has auto-negotiated */

       /* Phyctl bits */
       Ran = 1 << 9,  /* restart auto-negotiation */
       Ean = 1 << 12, /* enable auto-negotiation */

       /* 82573 Phyier interrupt enable bits */
       Lscie = 1 << 10, /* link status changed */
       Ancie = 1 << 11, /* auto-negotiation complete */
       Spdie = 1 << 14, /* speed changed */
       Panie = 1 << 15, /* phy auto-negotiation error */

       /* Phylhr/Phyisr bits */
       Anf = 1 << 6,  /* lhr: auto-negotiation fault */
       Ane = 1 << 15, /* isr: auto-negotiation error */

       /* 82580 Phystat bits */
       Ans = 3 << 14, /* 82580 autoneg. status */
       Link = 1 << 6, /* 82580 link */

       /* 218 Phystat bits */
       Anfs = 3 << 13,   /* fault status */
       Ans218 = 1 << 12, /* autoneg complete */

       /* 218 Phyier218 interrupt enable bits */
       Spdie218 = 1 << 1, /* speed changed */
       Lscie218 = 1 << 2, /* link status changed */
       Ancie218 = 1 << 8, /* auto-negotiation changed */
};

enum {                      /* Icr, Ics, Ims, Imc */
       Txdw = 0x00000001,   /* Transmit Descriptor Written Back */
       Txqe = 0x00000002,   /* Transmit Queue Empty */
       Lsc = 0x00000004,    /* Link Status Change */
       Rxseq = 0x00000008,  /* Receive Sequence Error */
       Rxdmt0 = 0x00000010, /* Rdesc Minimum Threshold Reached */
       Rxo = 0x00000040,    /* Receiver Overrun */
       Rxt0 = 0x00000080,   /* Receiver Timer Interrupt */
       Mdac = 0x00000200,   /* MDIO Access Completed */
       Rxcfg = 0x00000400,  /* Receiving /C/ ordered sets */
       Gpi0 = 0x00000800,   /* General Purpose Interrupts */
       Gpi1 = 0x00001000,
       Gpi2 = 0x00002000,
       Gpi3 = 0x00004000,
       Ack = 0x00020000, /* Receive ACK frame */
};

enum {                             /* Txcw */
       TxcwFd = 0x00000020,        /* Full Duplex */
       TxcwHd = 0x00000040,        /* Half Duplex */
       TxcwPauseMASK = 0x00000180, /* Pause */
       TxcwPauseSHIFT = 7,
       TxcwPs = 1 << TxcwPauseSHIFT, /* Pause Supported */
       TxcwAs = 2 << TxcwPauseSHIFT, /* Asymmetric FC desired */
       TxcwRfiMASK = 0x00003000,     /* Remote Fault Indication */
       TxcwRfiSHIFT = 12,
       TxcwNpr = 0x00008000,    /* Next Page Request */
       TxcwConfig = 0x40000000, /* Transmit Config Control */
       TxcwAne = 0x80000000,    /* Auto-Negotiation Enable */
};

enum {                            /* Rctl */
       Rrst = 0x00000001,         /* Receiver Software Reset */
       Ren = 0x00000002,          /* Receiver Enable */
       Sbp = 0x00000004,          /* Store Bad Packets */
       Upe = 0x00000008,          /* Unicast Promiscuous Enable */
       Mpe = 0x00000010,          /* Multicast Promiscuous Enable */
       Lpe = 0x00000020,          /* Long Packet Reception Enable */
       LbmMASK = 0x000000C0,      /* Loopback Mode */
       LbmOFF = 0x00000000,       /* No Loopback */
       LbmTBI = 0x00000040,       /* TBI Loopback */
       LbmMII = 0x00000080,       /* GMII/MII Loopback */
       LbmXCVR = 0x000000C0,      /* Transceiver Loopback */
       RdtmsMASK = 0x00000300,    /* Rdesc Minimum Threshold Size */
       RdtmsHALF = 0x00000000,    /* Threshold is 1/2 Rdlen */
       RdtmsQUARTER = 0x00000100, /* Threshold is 1/4 Rdlen */
       RdtmsEIGHTH = 0x00000200,  /* Threshold is 1/8 Rdlen */
       MoMASK = 0x00003000,       /* Multicast Offset */
       Bam = 0x00008000,          /* Broadcast Accept Mode */
       BsizeMASK = 0x00030000,    /* Receive Buffer Size */
       Bsize16384 = 0x00010000,   /* Bsex = 1 */
       Bsize8192 = 0x00020000,    /* Bsex = 1 */
       Bsize2048 = 0x00000000,
       Bsize1024 = 0x00010000,
       Bsize512 = 0x00020000,
       Bsize256 = 0x00030000,
       BsizeFlex = 0x08000000, /* Flexible Bsize in 1KB increments */
       Vfe = 0x00040000,       /* VLAN Filter Enable */
       Cfien = 0x00080000,     /* Canonical Form Indicator Enable */
       Cfi = 0x00100000,       /* Canonical Form Indicator value */
       Dpf = 0x00400000,       /* Discard Pause Frames */
       Pmcf = 0x00800000,      /* Pass MAC Control Frames */
       Bsex = 0x02000000,      /* Buffer Size Extension */
       Secrc = 0x04000000,     /* Strip CRC from incoming packet */
};

enum { /* Srrctl */
       Dropen = 1 << 31,
};

enum {                      /* Tctl */
       Trst = 0x00000001,   /* Transmitter Software Reset */
       Ten = 0x00000002,    /* Transmit Enable */
       Psp = 0x00000008,    /* Pad Short Packets */
       Mulr = 0x10000000,   /* Allow multiple concurrent requests */
       Ctmask = 0x00000FF0, /* Collision Threshold */
       Ctshift = 4,
       ColdMASK = 0x003FF000, /* Collision Distance */
       ColdSHIFT = 12,
       Swxoff = 0x00400000, /* Sofware XOFF Transmission */
       Pbe = 0x00800000,    /* Packet Burst Enable */
       Rtlc = 0x01000000,   /* Re-transmit on Late Collision */
       Nrtu = 0x02000000,   /* No Re-transmit on Underrrun */
};

enum {                           /* [RT]xdctl */
       PthreshMASK = 0x0000003F, /* Prefetch Threshold */
       PthreshSHIFT = 0,
       HthreshMASK = 0x00003F00, /* Host Threshold */
       HthreshSHIFT = 8,
       WthreshMASK = 0x003F0000, /* Writeback Threshold */
       WthreshSHIFT = 16,
       Gran = 0x01000000,    /* Granularity (descriptors, not cls) */
       Qenable = 0x02000000, /* Queue Enable (82575) */
};

enum {                    /* Rxcsum */
       PcssMASK = 0x00FF, /* Packet Checksum Start */
       PcssSHIFT = 0,
       Ipofl = 0x0100, /* IP Checksum Off-load Enable */
       Tuofl = 0x0200, /* TCP/UDP Checksum Off-load Enable */
};

enum {                     /* Receive Delay Timer Ring */
       DelayMASK = 0xFFFF, /* delay timer in 1.024nS increments */
       DelaySHIFT = 0,
       Fpd = 0x80000000, /* Flush partial Descriptor Block */
};

struct rd { /* Receive Descriptor */
	uint32_t addr[2];
	uint16_t length;
	uint16_t checksum;
	uint8_t status;
	uint8_t errors;
	uint16_t special;
};

enum {               /* Rd status */
       Rdd = 0x01,   /* Descriptor Done */
       Reop = 0x02,  /* End of Packet */
       Ixsm = 0x04,  /* Ignore Checksum Indication */
       Vp = 0x08,    /* Packet is 802.1Q (matched VET) */
       Tcpcs = 0x20, /* TCP Checksum Calculated on Packet */
       Ipcs = 0x40,  /* IP Checksum Calculated on Packet */
       Pif = 0x80,   /* Passed in-exact filter */
};

enum {              /* Rd errors */
       Ce = 0x01,   /* CRC Error or Alignment Error */
       Se = 0x02,   /* Symbol Error */
       Seq = 0x04,  /* Sequence Error */
       Cxe = 0x10,  /* Carrier Extension Error */
       Tcpe = 0x20, /* TCP/UDP Checksum Error */
       Ipe = 0x40,  /* IP Checksum Error */
       Rxe = 0x80,  /* RX Data Error */
};

struct td {               /* Transmit Descriptor */
	uint32_t addr[2]; /* Data */
	uint32_t control;
	uint32_t status;
};

enum {                       /* Tdesc control */
       LenMASK = 0x000FFFFF, /* Data/Packet Length Field */
       LenSHIFT = 0,
       DtypeCD = 0x00000000,  /* Data Type 'Context Descriptor' */
       DtypeDD = 0x00100000,  /* Data Type 'Data Descriptor' */
       PtypeTCP = 0x01000000, /* TCP/UDP Packet Type (CD) */
       Teop = 0x01000000,     /* End of Packet (DD) */
       PtypeIP = 0x02000000,  /* IP Packet Type (CD) */
       Ifcs = 0x02000000,     /* Insert FCS (DD) */
       Tse = 0x04000000,      /* TCP Segmentation Enable */
       Rs = 0x08000000,       /* Report Status */
       Rps = 0x10000000,      /* Report Status Sent */
       Dext = 0x20000000,     /* Descriptor Extension */
       Vle = 0x40000000,      /* VLAN Packet Enable */
       Ide = 0x80000000,      /* Interrupt Delay Enable */
};

enum {                   /* Tdesc status */
       Tdd = 0x0001,     /* Descriptor Done */
       Ec = 0x0002,      /* Excess Collisions */
       Lc = 0x0004,      /* Late Collision */
       Tu = 0x0008,      /* Transmit Underrun */
       CssMASK = 0xFF00, /* Checksum Start Field */
       CssSHIFT = 8,
};

struct flash {
	uint16_t *reg;
	uint32_t *reg32;
	uint16_t base;
	uint16_t lim;
};

enum {
	/* 16 and 32-bit flash registers for ich flash parts */
	Bfpr = 0x00 / 4,  /* flash base 0:12; lim 16:28 */
	Fsts = 0x04 / 2,  /* flash status;  Hsfsts */
	Fctl = 0x06 / 2,  /* flash control; Hsfctl */
	Faddr = 0x08 / 4, /* flash address to r/w */
	Fdata = 0x10 / 4, /* data @ address */

	/* status register */
	Fdone = 1 << 0,   /* flash cycle done */
	Fcerr = 1 << 1,   /* cycle error; write 1 to clear */
	Ael = 1 << 2,     /* direct access error log; 1 to clear */
	Scip = 1 << 5,    /* spi cycle in progress */
	Fvalid = 1 << 14, /* flash descriptor valid */

	/* control register */
	Fgo = 1 << 0,     /* start cycle */
	Flcycle = 1 << 1, /* two bits: r=0; w=2 */
	Fdbc = 1 << 8,    /* bytes to read; 5 bits */
};

/*
 * the kumeran interface is mac-to-phy for external gigabit ethernet on
 * intel's esb2 ich8 (io controller hub), it carries mii bits.  can be used
 * to reset the phy.  intel proprietary, see "kumeran specification".
 */
enum { I217inbandctlpage = 770, /* phy page */
       I217inbandctlreg = 18,   /* phy register */
       I217inbandctllnkststxtmoutmask = 0x3F00,
       I217inbandctllnkststxtmoutshift = 8,

       Fextnvm6reqpllclk = 0x100,
       Fextnvm6enak1entrycond = 0x200, /* extend K1 entry latency */

       Nvmk1cfg = 0x1B,   /* NVM K1 Config Word */
       Nvmk1enable = 0x1, /* NVM Enable K1 bit */

       Kumctrlstaoff = 0x1F0000,
       Kumctrlstaoffshift = 16,
       Kumctrlstaren = 0x200000,
       Kumctrlstak1cfg = 0x7,
       Kumctrlstak1enable = 0x2,
};

enum {
	/*
	 * these were 512, 1024 & 64, but 52, 253 & 9 are usually ample;
	 * however cpu servers and terminals can need more receive buffers
	 * due to bursts of traffic.
	 *
	 * Tdlen and Rdlen have to be multiples of 128.  Rd and Td are both
	 * 16 bytes long, so Nrd and Ntd must be multiples of 8.
	 */
	Ntd = 32,  /* power of two >= 8 */
	Nrd = 128, /* power of two >= 8 */
	Rbalign = 16,
	Slop = 32, /* for vlan headers, crcs, etc. */
};

enum { Iany = -1,
       i82563,
       i82566,
       i82567,
       i82567m,
       i82571,
       i82572,
       i82573,
       i82574,
       i82575,
       i82576,
       i82577,
       i82577m,
       i82578,
       i82578m,
       i82579,
       i82580,
       i82583,
       i210,
       i217,
       i218,
       i350,
       Nctlrtype,
};

enum { Fload = 1 << 0,
       Fert = 1 << 1,
       F75 = 1 << 2,
       Fpba = 1 << 3,
       Fflashea = 1 << 4,
       F79phy = 1 << 5,
       Fnofct = 1 << 6,
};

struct ctlrtype {
	int type;
	int mtu;
	int phyno;
	char *name;
	int flag;
};

static struct ctlrtype ctlrtab[Nctlrtype] = {
    {i82563, 9014, 1, "i82563", Fpba},
    {i82566, 1514, 1, "i82566", Fload},
    {i82567, 9234, 1, "i82567", Fload},
    {i82567m, 1514, 1, "i82567m", 0},
    {i82571, 9234, 1, "i82571", Fpba},
    {i82572, 9234, 1, "i82572", Fpba},
    {i82573, 8192, 1, "i82573", Fert}, /* terrible perf above 8k */
    {i82574, 9018, 1, "i82574", 0},
    {i82575, 9728, 1, "i82575", F75 | Fflashea},
    {i82576, 9728, 1, "i82576", F75},
    {i82577, 4096, 2, "i82577", Fload | Fert},
    {i82577m, 1514, 2, "i82577", Fload | Fert},
    {i82578, 4096, 2, "i82578", Fload | Fert},
    {i82578m, 1514, 2, "i82578", Fload | Fert},
    {i82579, 9018, 2, "i82579", Fload | Fert | F79phy | Fnofct},
    {i82580, 9728, 1, "i82580", F75 | F79phy},
    {i82583, 1514, 1, "i82583", 0},
    {i210, 9728, 1, "i210", F75 | Fnofct | Fert},
    {i217, 9728, 1, "i217", F79phy | Fnofct | Fload | Fert},
    {i350, 9728, 1, "i350", F75 | F79phy | Fnofct},
};

struct ctlr {
	uintptr_t mmio_paddr;
	struct pci_device *pcidev;
	struct ctlr *next;
	struct ether *edev;
	int active;
	int type;
	uint16_t eeprom[0x40];

	qlock_t alock; /* attach */
	void *alloc;
	unsigned int rbsz;
	int attached;

	int *nic;
	spinlock_t imlock;
	int im; /* interrupt mask */

	struct rendez lrendez;
	int lim;
	int phynum;
	int didk1fix;

	qlock_t slock;
	unsigned int statistics[Nstatistics];
	unsigned int lsleep;
	unsigned int lintr;
	unsigned int rsleep;
	unsigned int rintr;
	unsigned int txdw;
	unsigned int tintr;
	unsigned int ixsm;
	unsigned int ipcs;
	unsigned int tcpcs;
	unsigned int speeds[4];

	uint8_t ra[Eaddrlen]; /* receive address */
	uint32_t mta[128];    /* multicast table array */

	struct rendez rrendez;
	int rim;
	int rdfree;        /* rx descriptors awaiting packets */
	struct rd *rdba;   /* receive descriptor base address */
	struct block **rb; /* receive buffers */
	unsigned int rdh;  /* receive descriptor head */
	unsigned int rdt;  /* receive descriptor tail */
	int rdtr;          /* receive delay timer ring value */
	int radv;          /* receive interrupt absolute delay timer */

	struct rendez trendez;
	qlock_t tlock;
	struct td *tdba;   /* transmit descriptor base address */
	struct block **tb; /* transmit buffers */
	int tdh;           /* transmit descriptor head */
	int tdt;           /* transmit descriptor tail */

	int fcrtl;
	int fcrth;

	unsigned int pbs; /* packet buffer size */
	unsigned int pba; /* packet buffer allocation */
};

static inline uint32_t csr32r(struct ctlr *c, uintptr_t reg)
{
	return read_mmreg32((uintptr_t)(c->nic + (reg / 4)));
}

static inline void csr32w(struct ctlr *c, uintptr_t reg, uint32_t val)
{
	write_mmreg32((uintptr_t)(c->nic + (reg / 4)), val);
}

static struct ctlr *i82563ctlrhead;
static struct ctlr *i82563ctlrtail;

static int speedtab[] = {10, 100, 1000, 0};

static char *statistics[] = {
    "CRC Error",
    "Alignment Error",
    "Symbol Error",
    "RX Error",
    "Missed Packets",
    "Single Collision",
    "Excessive Collisions",
    "Multiple Collision",
    "Late Collisions",
    NULL,
    "Collision",
    "Transmit Underrun",
    "Defer",
    "Transmit - No CRS",
    "Sequence Error",
    "Carrier Extension Error",
    "Receive Error Length",
    NULL,
    "XON Received",
    "XON Transmitted",
    "XOFF Received",
    "XOFF Transmitted",
    "FC Received Unsupported",
    "Packets Received (64 Bytes)",
    "Packets Received (65-127 Bytes)",
    "Packets Received (128-255 Bytes)",
    "Packets Received (256-511 Bytes)",
    "Packets Received (512-1023 Bytes)",
    "Packets Received (1024-mtu Bytes)",
    "Good Packets Received",
    "Broadcast Packets Received",
    "Multicast Packets Received",
    "Good Packets Transmitted",
    NULL,
    "Good Octets Received",
    NULL,
    "Good Octets Transmitted",
    NULL,
    NULL,
    NULL,
    "Receive No Buffers",
    "Receive Undersize",
    "Receive Fragment",
    "Receive Oversize",
    "Receive Jabber",
    "Management Packets Rx",
    "Management Packets Drop",
    "Management Packets Tx",
    "Total Octets Received",
    NULL,
    "Total Octets Transmitted",
    NULL,
    "Total Packets Received",
    "Total Packets Transmitted",
    "Packets Transmitted (64 Bytes)",
    "Packets Transmitted (65-127 Bytes)",
    "Packets Transmitted (128-255 Bytes)",
    "Packets Transmitted (256-511 Bytes)",
    "Packets Transmitted (512-1023 Bytes)",
    "Packets Transmitted (1024-mtu Bytes)",
    "Multicast Packets Transmitted",
    "Broadcast Packets Transmitted",
    "TCP Segmentation Context Transmitted",
    "TCP Segmentation Context Fail",
    "Interrupt Assertion",
    "Interrupt Rx Pkt Timer",
    "Interrupt Rx Abs Timer",
    "Interrupt Tx Pkt Timer",
    "Interrupt Tx Abs Timer",
    "Interrupt Tx Queue Empty",
    "Interrupt Tx Desc Low",
    "Interrupt Rx Min",
    "Interrupt Rx Overrun",
};

static char *cname(struct ctlr *c)
{
	return ctlrtab[c->type].name;
}

static int i82563reset(struct ctlr *);

static long i82563ifstat(struct ether *edev, void *a, long n, uint32_t offset)
{
	struct ctlr *ctlr;
	char *s, *p, *e, *stat;
	int i, r;
	uint64_t tuvl, ruvl;

	ctlr = edev->ctlr;
	qlock(&ctlr->slock);
	p = s = kzmalloc(READSTR, 0);
	if (p == NULL) {
		qunlock(&ctlr->slock);
		error(ENOMEM, "kzmalloc did not panic");
	}
	e = p + READSTR;

	for (i = 0; i < Nstatistics; i++) {
		r = csr32r(ctlr, Statistics + i * 4);
		stat = statistics[i];
		if (stat == NULL)
			continue;
		switch (i) {
		case Gorcl:
		case Gotcl:
		case Torl:
		case Totl:
			ruvl = r;
			ruvl += (uint64_t)csr32r(ctlr, Statistics + (i + 1) * 4)
			        << 32;
			tuvl = ruvl;
			tuvl += ctlr->statistics[i];
			tuvl += (uint64_t)ctlr->statistics[i + 1] << 32;
			if (tuvl == 0)
				continue;
			ctlr->statistics[i] = tuvl;
			ctlr->statistics[i + 1] = tuvl >> 32;
			p = seprintf(p, e, "%s: %llud %llud\n", stat, tuvl,
			             ruvl);
			i++;
			break;

		default:
			ctlr->statistics[i] += r;
			if (ctlr->statistics[i] == 0)
				continue;
			p = seprintf(p, e, "%s: %ud %ud\n", stat,
			             ctlr->statistics[i], r);
			break;
		}
	}

	p = seprintf(p, e, "lintr: %ud %ud\n", ctlr->lintr, ctlr->lsleep);
	p = seprintf(p, e, "rintr: %ud %ud\n", ctlr->rintr, ctlr->rsleep);
	p = seprintf(p, e, "tintr: %ud %ud\n", ctlr->tintr, ctlr->txdw);
	p = seprintf(p, e, "ixcs: %ud %ud %ud\n", ctlr->ixsm, ctlr->ipcs,
	             ctlr->tcpcs);
	p = seprintf(p, e, "ctrl: %.8ux\n", csr32r(ctlr, Ctrl));
	p = seprintf(p, e, "ctrlext: %.8ux\n", csr32r(ctlr, Ctrlext));
	p = seprintf(p, e, "status: %.8ux\n", csr32r(ctlr, Status));
	p = seprintf(p, e, "txcw: %.8ux\n", csr32r(ctlr, Txcw));
	p = seprintf(p, e, "txdctl: %.8ux\n", csr32r(ctlr, Txdctl));
	p = seprintf(p, e, "pbs: %dKB\n", ctlr->pbs);
	p = seprintf(p, e, "pba: %#.8ux\n", ctlr->pba);

	p = seprintf(p, e, "speeds: 10:%ud 100:%ud 1000:%ud ?:%ud\n",
	             ctlr->speeds[0], ctlr->speeds[1], ctlr->speeds[2],
	             ctlr->speeds[3]);
	p = seprintf(p, e, "type: %s\n", cname(ctlr));

	//  p = seprintf(p, e, "eeprom:");
	//  for(i = 0; i < 0x40; i++){
	//      if(i && ((i & 7) == 0))
	//          p = seprintf(p, e, "\n       ");
	//      p = seprintf(p, e, " %4.4ux", ctlr->eeprom[i]);
	//  }
	//  p = seprintf(p, e, "\n");

	n = readstr(offset, a, n, s);
	kfree(s);
	qunlock(&ctlr->slock);

	return n;
}

enum { CMrdtr,
       CMradv,
       CMpause,
       CMan,
};

static struct cmdtab i82563ctlmsg[] = {
    {CMrdtr, "rdtr", 2},
    {CMradv, "radv", 2},
    {CMpause, "pause", 1},
    {CMan, "an", 1},
};

static long i82563ctl(struct ether *edev, void *buf, size_t n)
{
	ERRSTACK(1);
	char *p;
	uint32_t v;
	struct ctlr *ctlr;
	struct cmdbuf *cb;
	struct cmdtab *ct;

	ctlr = edev->ctlr;
	if (ctlr == NULL)
		error(ENODEV, "i82563ctl: NULL controller");

	cb = parsecmd(buf, n);
	if (waserror()) {
		kfree(cb);
		nexterror();
	}

	ct = lookupcmd(cb, i82563ctlmsg, ARRAY_SIZE(i82563ctlmsg));
	switch (ct->index) {
	case CMrdtr:
		v = strtoul(cb->f[1], &p, 0);
		if (*p || v > 0xffff)
			error(EINVAL, ERROR_FIXME);
		ctlr->rdtr = v;
		csr32w(ctlr, Rdtr, v);
		break;
	case CMradv:
		v = strtoul(cb->f[1], &p, 0);
		if (*p || v > 0xffff)
			error(EINVAL, ERROR_FIXME);
		ctlr->radv = v;
		csr32w(ctlr, Radv, v);
		break;
	case CMpause:
		csr32w(ctlr, Ctrl, csr32r(ctlr, Ctrl) ^ (Rfce | Tfce));
		break;
	case CMan:
		csr32w(ctlr, Ctrl, csr32r(ctlr, Ctrl) | Lrst | Phyrst);
		break;
	}
	kfree(cb);
	poperror();

	return n;
}

static void i82563promiscuous(void *arg, int on)
{
	int rctl;
	struct ctlr *ctlr;
	struct ether *edev;

	edev = arg;
	ctlr = edev->ctlr;

	rctl = csr32r(ctlr, Rctl) & ~MoMASK;
	if (on)
		rctl |= Upe | Mpe;
	else
		rctl &= ~(Upe | Mpe);
	csr32w(ctlr, Rctl, rctl);
}

/*
 * Returns the number of bits of mac address used in multicast hash,
 * thus the number of longs of ctlr->mta (2^(bits-5)).
 * This must be right for multicast (thus ipv6) to work reliably.
 *
 * The default multicast hash for mta is based on 12 bits of MAC address;
 * the rightmost bit is a function of Rctl's Multicast Offset: 0=>36,
 * 1=>35, 2=>34, 3=>32.  Exceptions include the 578, 579, 217, 218, 219;
 * they use only 10 bits, ignoring the rightmost 2 of the 12.
 */
static int mcastbits(struct ctlr *ctlr)
{
	switch (ctlr->type) {
	/*
	 * openbsd says all `ich8' versions (ich8, ich9, ich10, pch,
	 * pch2 and pch_lpt) have 32 longs (use 10 bits of mac address
	 * for hash).
	 */
	case i82566:
	case i82567:
		//	case i82578:
	case i82579:
	case i217:
	case i218:
		//	case i219:
		return 10; /* 32 longs */
	case i82563:
	case i82571:
	case i82572:
	case i82573:
	case i82574:
		//	case i82575:
		//	case i82583:
	case i210:         /* includes i211 */
		return 12; /* 128 longs */
	default:
		printk("82563: unsure of multicast bits in mac addresses; "
		       "enabling promiscuous multicast reception\n");
		csr32w(ctlr, Rctl, csr32r(ctlr, Rctl) | Mpe);
		return 10; /* be conservative (for mta size) */
	}
}

static int mcbitstolongs(int nmcbits)
{
	return 1 << (nmcbits - 5); /* 2^5 = 32 */
}

static void i82563multicast(void *arg, uint8_t *addr, int on)
{
	uint32_t nbits, tblsz, hash, word, bit;
	struct ctlr *ctlr;
	struct ether *edev;

	edev = arg;
	ctlr = edev->ctlr;

	nbits = mcastbits(ctlr);
	tblsz = mcbitstolongs(nbits);
	/* assume multicast offset in Rctl is 0 (we clear it above) */
	hash = addr[5] << 4 | addr[4] >> 4; /* bits 47:36 of mac */
	if (nbits == 10)
		hash >>= 2; /* discard 37:36 of mac */
	word = (hash / 32) & (tblsz - 1);
	bit = 1UL << (hash % 32);
	/*
	 * multiple ether addresses can hash to the same filter bit,
	 * so it's never safe to clear a filter bit.
	 * if we want to clear filter bits, we need to keep track of
	 * all the multicast addresses in use, clear all the filter bits,
	 * then set the ones corresponding to in-use addresses.
	 */
	if (on)
		ctlr->mta[word] |= bit;
	//	else
	//		ctlr->mta[word] &= ~bit;
	csr32w(ctlr, Mta + word * 4, ctlr->mta[word]);
}

static void i82563im(struct ctlr *ctlr, int im)
{
	spin_lock_irqsave(&ctlr->imlock);
	ctlr->im |= im;
	csr32w(ctlr, Ims, ctlr->im);
	spin_unlock_irqsave(&ctlr->imlock);
}

static void i82563txinit(struct ctlr *ctlr)
{
	int i, r, tctl;
	struct block *bp;

	/*
	 * TODO(dcross): Figure out how to integrate this table driven
	 * code into the stanza below.
	 */
	tctl = 0x0F << Ctshift | Psp;
	if (0) {
		if ((ctlrtab[ctlr->type].flag & F75) == 0)
			tctl |= (66 << ColdSHIFT | Mulr);
	}
	switch (ctlr->type) {
	case i210:
		break;
	default:
		tctl |= Mulr;
		/* fall through */
	case i217:
	case i218:
		tctl |= 66 << ColdSHIFT;
		break;
	}
	csr32w(ctlr, Tctl, tctl);
	csr32w(ctlr, Tipg, 6 << 20 | 8 << 10 | 8); /* yb sez: 0x702008 */
	for (i = 0; i < Ntd; i++) {
		bp = ctlr->tb[i];
		if (bp != NULL) {
			ctlr->tb[i] = NULL;
			freeb(bp);
		}
	}
	memset(ctlr->tdba, 0, Ntd * sizeof(struct td));
	csr32w(ctlr, Tdbal, paddr_low32(ctlr->tdba));
	csr32w(ctlr, Tdbah, paddr_high32(ctlr->tdba));
	csr32w(ctlr, Tdlen, Ntd * sizeof(struct td));
	ctlr->tdh = PREV_RING(0, Ntd);
	csr32w(ctlr, Tdh, 0);
	ctlr->tdt = 0;
	csr32w(ctlr, Tdt, 0);
	csr32w(ctlr, Tidv, 0); /* don't coalesce interrupts */
	csr32w(ctlr, Tadv, 0);
	r = csr32r(ctlr, Txdctl) & ~(WthreshMASK | PthreshMASK);
	r |= 4 << WthreshSHIFT | 4 << PthreshSHIFT;
	if (ctlrtab[ctlr->type].flag & F75)
		r |= Qenable;
	csr32w(ctlr, Txdctl, r);
	csr32w(ctlr, Tctl, csr32r(ctlr, Tctl) | Ten);
}

static int i82563cleanup(struct ctlr *ctlr)
{
	struct block *bp;
	int tdh, n;

	tdh = ctlr->tdh;
	while (ctlr->tdba[n = NEXT_RING(tdh, Ntd)].status & Tdd) {
		tdh = n;
		bp = ctlr->tb[tdh];
		if (bp != NULL) {
			ctlr->tb[tdh] = NULL;
			freeb(bp);
		} else
			iprint("82563 tx underrun!\n");
		ctlr->tdba[tdh].status = 0;
	}
	return ctlr->tdh = tdh;
}

static void i82563transmit(struct ether *edev)
{
	struct td *td;
	struct block *bp;
	struct ctlr *ctlr;
	int tdh, tdt;

	ctlr = edev->ctlr;
	qlock(&ctlr->tlock);

	/*
	 * Free any completed packets
	 */
	tdh = i82563cleanup(ctlr);

	/* if link down on 218, don't try since we need k1fix to run first */
	if (!edev->link && ctlr->type == i218 && !ctlr->didk1fix) {
		qunlock(&ctlr->tlock);
		return;
	}

	/*
	 * Try to fill the ring back up.
	 */
	tdt = ctlr->tdt;
	for (;;) {
		if (NEXT_RING(tdt, Ntd) == tdh) { /* ring full? */
			ctlr->txdw++;
			i82563im(ctlr, Txdw);
			break;
		}
		bp = qget(edev->oq);
		if (bp == NULL)
			break;
		td = &ctlr->tdba[tdt];
		td->addr[0] = paddr_low32(bp->rp);
		td->addr[1] = paddr_high32(bp->rp);
		td->control = Ide | Rs | Ifcs | Teop | BLEN(bp);
		ctlr->tb[tdt] = bp;
		tdt = NEXT_RING(tdt, Ntd);
	}
	if (ctlr->tdt != tdt) {
		ctlr->tdt = tdt;
		wmb_f();
		csr32w(ctlr, Tdt, tdt);
	}
	/* else may not be any new ones, but could be some still in flight */
	qunlock(&ctlr->tlock);
}

static void i82563replenish(struct ctlr *ctlr)
{
	struct rd *rd;
	int rdt;
	struct block *bp;

	rdt = ctlr->rdt;
	while (NEXT_RING(rdt, Nrd) != ctlr->rdh) {
		rd = &ctlr->rdba[rdt];
		if (ctlr->rb[rdt] != NULL) {
			printd("#l%d: 82563: rx overrun\n", ctlr->edev->ctlrno);
			break;
		}
		bp = block_alloc(ctlr->rbsz + Slop + Rbalign, MEM_ATOMIC);
		if (bp == NULL) {
			warn_once("OOM, trying to survive");
			break;
		}
		ctlr->rb[rdt] = bp;
		rd->addr[0] = paddr_low32(bp->rp);
		rd->addr[1] = paddr_high32(bp->rp);
		rd->status = 0;
		ctlr->rdfree++;
		rdt = NEXT_RING(rdt, Nrd);
	}
	if (ctlr->rdt != rdt) {
		ctlr->rdt = rdt;
		wmb_f();
		csr32w(ctlr, Rdt, rdt);
	}
}

static void i82563rxinit(struct ctlr *ctlr)
{
	struct block *bp;
	int i, r, rctl, type;

	type = ctlr->type;

	if (ctlr->rbsz <= 2048)
		csr32w(ctlr, Rctl, Dpf | Bsize2048 | Bam | RdtmsHALF);
	else {
		i = ctlr->rbsz / 1024;
		if (ctlr->rbsz % 1024)
			i++;
		if (ctlrtab[ctlr->type].flag & F75) {
			csr32w(ctlr, Rctl,
			       Lpe | Dpf | Bsize2048 | Bam | RdtmsHALF | Secrc);
			if (ctlr->type != i82575)
				i |= (Nrd / 2 >> 4) << 20; /* RdmsHalf */
			csr32w(ctlr, Srrctl, i | Dropen);
			csr32w(ctlr, Rmpl, ctlr->rbsz);
			// csr32w(ctlr, Drxmxod, 0x7ff);
		} else
			csr32w(ctlr, Rctl,
			       Lpe | Dpf | BsizeFlex * i | Bam | RdtmsHALF |
			           Secrc);
	}

	/*
	 * TODO(dcross): Reconcile this with latest above code block.
	 */
	if (0) {
		rctl = Dpf | Bsize2048 | Bam | RdtmsHALF;
		if (type == i82575 || type == i82576 || type == i210) {
			/*
			 * Setting Qenable in Rxdctl does not
			 * appear to stick unless Ren is on.
			 */
			csr32w(ctlr, Rctl, Ren | rctl);
			csr32w(ctlr, Rxdctl, csr32r(ctlr, Rxdctl) | Qenable);
		}
		csr32w(ctlr, Rctl, rctl);
	}

	if (ctlrtab[ctlr->type].flag & Fert)
		csr32w(ctlr, Ert, 1024 / 8); /* early rx threshold */

	csr32w(ctlr, Rdbal, paddr_low32(ctlr->rdba));
	csr32w(ctlr, Rdbah, paddr_high32(ctlr->rdba));
	csr32w(ctlr, Rdlen, Nrd * sizeof(struct rd));
	ctlr->rdh = ctlr->rdt = 0;
	csr32w(ctlr, Rdh, 0);
	csr32w(ctlr, Rdt, 0);

	/* to hell with interrupt moderation, we want low latency */
	csr32w(ctlr, Rdtr, 0);
	csr32w(ctlr, Radv, 0);

	for (i = 0; i < Nrd; i++) {
		bp = ctlr->rb[i];
		if (bp != NULL) {
			ctlr->rb[i] = NULL;
			freeb(bp);
		}
	}
	i82563replenish(ctlr);

	if (type == i82575 || type == i82576 || type == i210) {
		/*
		 * See comment above for Qenable.
		 * Could shuffle the code?
		 */
		r = csr32r(ctlr, Rxdctl) & ~(WthreshMASK | PthreshMASK);
		csr32w(ctlr, Rxdctl, r | 2 << WthreshSHIFT | 2 << PthreshSHIFT);
	}

	/*
	 * Don't enable checksum offload.  In practice, it interferes with
	 * tftp booting on at least the 82575.
	 */
	csr32w(ctlr, Rxcsum, 0);
}

static int i82563rim(void *ctlr)
{
	return ((struct ctlr *)ctlr)->rim != 0;
}

/*
 * With no errors and the Ixsm bit set,
 * the descriptor status Tpcs and Ipcs bits give
 * an indication of whether the checksums were
 * calculated and valid.
 *
 * Must be called with rd->errors == 0.
 */
static void ckcksums(struct ctlr *ctlr, struct rd *rd, struct block *bp)
{
	if (0) {
		if (rd->status & Ixsm)
			return;
		ctlr->ixsm++;
		if (rd->status & Ipcs) {
			/*
			 * IP checksum calculated (and valid as errors == 0).
			 */
			ctlr->ipcs++;
			bp->flag |= Bipck;
		}
		if (rd->status & Tcpcs) {
			/*
			 * TCP/UDP checksum calculated (and valid as errors ==
			 * 0).
			 */
			ctlr->tcpcs++;
			bp->flag |= Btcpck | Budpck;
		}
		bp->flag |= Bpktck;
	}
}

static void i82563rproc(void *arg)
{
	struct rd *rd;
	struct block *bp;
	struct ctlr *ctlr;
	int rdh, rim, passed;
	struct ether *edev;

	edev = arg;
	ctlr = edev->ctlr;
	i82563rxinit(ctlr);
	csr32w(ctlr, Rctl, csr32r(ctlr, Rctl) | Ren);

	/*
	 * TODO(dcross): Work references to ctlrtab into this code.
	 */
	if (ctlr->type == i210)
		csr32w(ctlr, Rxdctl, csr32r(ctlr, Rxdctl) | Qenable);

	for (;;) {
		i82563replenish(ctlr);
		i82563im(ctlr, Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack);
		ctlr->rsleep++;
		rendez_sleep(&ctlr->rrendez, i82563rim, ctlr);

		rdh = ctlr->rdh;
		passed = 0;
		for (;;) {
			rim = ctlr->rim;
			ctlr->rim = 0;
			rd = &ctlr->rdba[rdh];
			if (!(rd->status & Rdd))
				break;

			/*
			 * Accept eop packets with no errors.
			 */
			bp = ctlr->rb[rdh];
			if ((rd->status & Reop) && rd->errors == 0) {
				bp->wp += rd->length;
				bp->lim = bp->wp; /* lie like a dog. */
				if (0)
					ckcksums(ctlr, rd, bp);
				etheriq(edev, bp, 1); /* pass pkt upstream */
				passed++;
			} else {
				if (rd->status & Reop && rd->errors)
					printd("%s: input packet error %#ux\n",
					       tname[ctlr->type], rd->errors);
				freeb(bp);
			}
			ctlr->rb[rdh] = NULL;

			/* rd needs to be replenished to accept another pkt */
			rd->status = 0;
			ctlr->rdfree--;
			ctlr->rdh = rdh = NEXT_RING(rdh, Nrd);
			/*
			 * if number of rds ready for packets is too low,
			 * set up the unready ones.
			 */
			if (ctlr->rdfree <= Nrd - 32 || (rim & Rxdmt0))
				i82563replenish(ctlr);
		}
	}
}

static int i82563lim(void *ctlr)
{
	return ((struct ctlr *)ctlr)->lim != 0;
}

static int phynum(struct ctlr *ctlr)
{
	if (ctlr->phynum < 0)
		switch (ctlr->type) {
		case i82577:
			//      case i82578:            /* not yet implemented
			//      */
		case i82579:
		case i217:
		case i218:
			ctlr->phynum = 2; /* pcie phy */
			break;
		default:
			ctlr->phynum = 1; /* gbe phy */
			break;
		}
	return ctlr->phynum;
}

static unsigned int phyread(struct ctlr *ctlr, int reg)
{
	unsigned int phy, i;

	if (reg >= 32)
		iprint("phyread: reg %d >= 32\n", reg);
	csr32w(ctlr, Mdic,
	       MDIrop | phynum(ctlr) << MDIpSHIFT | reg << MDIrSHIFT);
	phy = 0;
	for (i = 0; i < 64; i++) {
		phy = csr32r(ctlr, Mdic);
		if (phy & (MDIe | MDIready))
			break;
		udelay(1);
	}
	if ((phy & (MDIe | MDIready)) != MDIready)
		return ~0;
	return phy & 0xffff;
}

static unsigned int phywrite(struct ctlr *ctlr, int reg, uint16_t val)
{
	unsigned int phy, i;

	if (reg >= 32)
		iprint("phyread: reg %d >= 32\n", reg);
	csr32w(ctlr, Mdic,
	       MDIwop | phynum(ctlr) << MDIpSHIFT | reg << MDIrSHIFT | val);
	phy = 0;
	for (i = 0; i < 64; i++) {
		phy = csr32r(ctlr, Mdic);
		if (phy & (MDIe | MDIready))
			break;
		udelay(1);
	}
	if ((phy & (MDIe | MDIready)) != MDIready)
		return ~0;
	return 0;
}

static uint32_t kmrnread(struct ctlr *ctlr, uint32_t reg_addr)
{
	/* write register address */
	csr32w(ctlr, Kumctrlsta,
	       ((reg_addr << Kumctrlstaoffshift) & Kumctrlstaoff) |
	           Kumctrlstaren);
	udelay(2);
	/* read data */
	return csr32r(ctlr, Kumctrlsta);
}

static void kmrnwrite(struct ctlr *ctlr, uint32_t reg_addr, uint16_t data)
{
	csr32w(ctlr, Kumctrlsta,
	       ((reg_addr << Kumctrlstaoffshift) & Kumctrlstaoff) | data);
	udelay(2);
}

/*
 * this is essentially black magic.  we blindly follow the incantations
 * prescribed by the god Intel:
 *
 * On ESB2, the MAC-to-PHY (Kumeran) interface must be configured after
 * link is up before any traffic is sent.
 *
 * workaround DMA unit hang on I218
 *
 * At 1Gbps link speed, one of the MAC's internal clocks can be stopped
 * for up to 4us when entering K1 (a power mode of the MAC-PHY
 * interconnect).  If the MAC is waiting for completion indications for 2
 * DMA write requests into Host memory (e.g.  descriptor writeback or Rx
 * packet writing) and the indications occur while the clock is stopped,
 * both indications will be missed by the MAC, causing the MAC to wait
 * for the completion indications and be unable to generate further DMA
 * write requests.  This results in an apparent hardware hang.
 *
 * Work-around the bug by disabling the de-assertion of the clock request
 * when 1Gbps link is acquired (K1 must be disabled while doing this).
 * Also, set appropriate Tx re-transmission timeouts for 10 and 100-half
 * link speeds to avoid Tx hangs.
 */
static void k1fix(struct ctlr *ctlr)
{
	int txtmout; /* units of 10µs */
	uint32_t fextnvm6, status;
	uint16_t reg;
	struct ether *edev;

	edev = ctlr->edev;
	fextnvm6 = csr32r(ctlr, Fextnvm6);
	status = csr32r(ctlr, Status);
	/* status speed bits are different on 217/8 than earlier ctlrs */
	if (edev->link && status & (Sspeed1000 >> 2)) {
		reg = kmrnread(ctlr, Kumctrlstak1cfg);
		kmrnwrite(ctlr, Kumctrlstak1cfg, reg & ~Kumctrlstak1enable);
		udelay(10);
		csr32w(ctlr, Fextnvm6, fextnvm6 | Fextnvm6reqpllclk);
		kmrnwrite(ctlr, Kumctrlstak1cfg, reg);
		ctlr->didk1fix = 1;
		return;
	}
	/* else uncommon cases */

	fextnvm6 &= ~Fextnvm6reqpllclk;
	/*
	 * 217 manual claims not to have Frcdplx bit in status;
	 * 218 manual just omits the non-phy registers.
	 */
	if (!edev->link || (status & (Sspeed100 >> 2 | Frcdplx)) ==
	                       (Sspeed100 >> 2 | Frcdplx)) {
		csr32w(ctlr, Fextnvm6, fextnvm6);
		ctlr->didk1fix = 1;
		return;
	}

	/* access other page via phy addr 1 reg 31, then access reg 16-30 */
	phywrite(ctlr, Phypage, I217inbandctlpage << 5);
	reg = phyread(ctlr, I217inbandctlreg) & ~I217inbandctllnkststxtmoutmask;
	if (status & (Sspeed100 >> 2)) { /* 100Mb/s half-duplex? */
		txtmout = 5;
		fextnvm6 &= ~Fextnvm6enak1entrycond;
	} else { /* 10Mb/s */
		txtmout = 50;
		fextnvm6 |= Fextnvm6enak1entrycond;
	}
	phywrite(ctlr, I217inbandctlreg,
	         reg | txtmout << I217inbandctllnkststxtmoutshift);
	csr32w(ctlr, Fextnvm6, fextnvm6);
	phywrite(ctlr, Phypage, 0 << 5); /* reset page to usual 0 */
	ctlr->didk1fix = 1;
}

/*
 * watch for changes of link state
 */
static void i82563lproc(void *v)
{
	unsigned int phy, sp, a, phy79, prevlink;
	struct ctlr *ctlr;
	struct ether *edev;

	edev = v;
	ctlr = edev->ctlr;
	phy79 = 0;
	switch (ctlr->type) {
	case i82579:
	case i82580:
	case i217:
	case i218:
	case i350:
		phy79 = 1;
		break;
	}
	/*
	 * TODO(dcross): Extract PHY number from ctlrtab.
	 */
	if (ctlr->type == i82573 && phyread(ctlr, Phyier) != ~0) {
		phy = phyread(ctlr, Phyier);
		phywrite(ctlr, Phyier, phy | Lscie | Ancie | Spdie | Panie);
	} else if (phy79 && phyread(ctlr, Phyier218) != ~0) {
		phy = phyread(ctlr, Phyier218);
		phywrite(ctlr, Phyier218, phy | Lscie218 | Ancie218 | Spdie218);
	}
	prevlink = 0;
	for (;;) {
		a = 0;
		phy = phyread(ctlr, phy79 ? Phystat : Physsr);
		if (phy == ~0)
			goto next;
		if (phy79) {
			sp = (phy >> 8) & 3;
			// a = phy & (ctlr->type == i218? Anfs: Ans);
			a = phy & Anfs;
		} else {
			sp = (phy >> 14) & 3;
			switch (ctlr->type) {
			case i82563:
			case i210:
				a = phyread(ctlr, Phyisr) & Ane; /* a-n error */
				break;
			case i82571:
			case i82572:
			case i82575:
			case i82576:
				a = phyread(ctlr, Phylhr) & Anf; /* a-n fault */
				sp = (sp - 1) & 3;
				break;
			}
		}
		if (a) /* enable & restart autoneg */ /* enable & restart
		                                         autoneg */
			phywrite(ctlr, Phyctl,
			         phyread(ctlr, Phyctl) | Ran | Ean);
		edev->link = (phy & (phy79 ? Link : Rtlink)) != 0;
		if (edev->link) {
			ctlr->speeds[sp]++;
			if (speedtab[sp])
				edev->mbps = speedtab[sp];
			if (prevlink == 0 && ctlr->type == i218)
				k1fix(ctlr); /* link newly up: kludge away */
			netif_carrier_on(edev);
		} else
			ctlr->didk1fix = 0; /* force fix at next link up */
		prevlink = edev->link;
	next:
		ctlr->lim = 0;
		i82563im(ctlr, Lsc);
		ctlr->lsleep++;
		rendez_sleep(&ctlr->lrendez, i82563lim, ctlr);
	}
}

static int return0(void *unused_void_p)
{
	return 0;
}

static void i82563tproc(void *v)
{
	struct ether *edev;
	struct ctlr *ctlr;

	edev = v;
	ctlr = edev->ctlr;
	for (;;) {
		rendez_sleep(&ctlr->trendez, return0, 0);
		i82563transmit(edev);
	}
}

/*
 * controller is buggered; shock it back to life.
 */
static void restart(struct ctlr *ctlr)
{
	if (0) {
		static spinlock_t rstlock;

		qlock(&ctlr->tlock);
		spin_lock_irqsave(&rstlock);
		iprint("#l%d: resetting...", ctlr->edev->ctlrno);
		i82563reset(ctlr);
		/* [rt]xinit reset the ring indices */
		i82563txinit(ctlr);
		i82563rxinit(ctlr);
		csr32w(ctlr, Rctl, csr32r(ctlr, Rctl) | Ren);
		spin_unlock_irqsave(&rstlock);
		qunlock(&ctlr->tlock);
		iprint("reset\n");
	}
}

static void freemem(struct ctlr *ctlr)
{
	kfree(ctlr->tb);
	ctlr->tb = NULL;
	kfree(ctlr->rb);
	ctlr->rb = NULL;
	kfree(ctlr->tdba);
	ctlr->tdba = NULL;
	kfree(ctlr->rdba);
	ctlr->rdba = NULL;
}

static void i82563attach(struct ether *edev)
{
	ERRSTACK(2);
	int i;
	struct block *bp;
	struct ctlr *ctlr;
	char *lname, *rname, *tname;

	ctlr = edev->ctlr;
	qlock(&ctlr->alock);

	if (ctlr->attached) {
		qunlock(&ctlr->alock);
		return;
	}

	if (waserror()) {
		freemem(ctlr);
		qunlock(&ctlr->alock);
		nexterror();
	}

	ctlr->alloc = kzmalloc(
	    Nrd * sizeof(struct rd) + Ntd * sizeof(struct td) + 255, MEM_WAIT);
	if (ctlr->alloc == NULL) {
		qunlock(&ctlr->alock);
		error(ENOMEM, "i82563attach: error allocating rx/tx rings");
	}
	ctlr->rdba = (struct rd *)ROUNDUP((uintptr_t)ctlr->alloc, 256);
	ctlr->tdba = (struct td *)(ctlr->rdba + Nrd);
	ctlr->rb = kzmalloc(Nrd * sizeof(struct block *), 0);
	ctlr->tb = kzmalloc(Ntd * sizeof(struct block *), 0);
	if (ctlr->rb == NULL || ctlr->tb == NULL) {
		qunlock(&ctlr->alock);
		error(ENOMEM, "i82563attach: error allocating rx/tx buffers");
	}

	ctlr->edev = edev; /* point back to Ether* */
	ctlr->attached = 1;

	lname = kzmalloc(KNAMELEN, MEM_WAIT);
	snprintf(lname, KNAMELEN, "#l%dl", edev->ctlrno);
	ktask(lname, i82563lproc, edev);

	rname = kzmalloc(KNAMELEN, MEM_WAIT);
	snprintf(rname, KNAMELEN, "#l%dr", edev->ctlrno);
	ktask(rname, i82563rproc, edev);

	tname = kzmalloc(KNAMELEN, MEM_WAIT);
	snprintf(tname, KNAMELEN, "#l%dt", edev->ctlrno);
	ktask(tname, i82563tproc, edev);

	i82563txinit(ctlr);

	qunlock(&ctlr->alock);
	poperror();
}

static void i82563interrupt(struct hw_trapframe *unused_hw_trapframe, void *arg)
{
	struct ctlr *ctlr;
	struct ether *edev;
	int icr, im, i, loops;

	edev = arg;
	ctlr = edev->ctlr;
	spin_lock_irqsave(&ctlr->imlock);
	csr32w(ctlr, Imc, ~0);
	im = ctlr->im;
	loops = 0;
	i = Nrd; /* don't livelock */
	for (icr = csr32r(ctlr, Icr); icr & ctlr->im && i-- > 0;
	     icr = csr32r(ctlr, Icr)) {
		loops++;
		if (icr & Lsc) {
			im &= ~Lsc;
			ctlr->lim = icr & Lsc;
			rendez_wakeup(&ctlr->lrendez);
			ctlr->lintr++;
		}
		if (icr & (Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack)) {
			ctlr->rim = icr & (Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack);
			im &= ~(Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack);
			rendez_wakeup(&ctlr->rrendez);
			ctlr->rintr++;
		}
		if (icr & Txdw) {
			im &= ~Txdw;
			ctlr->tintr++;
			rendez_wakeup(&ctlr->trendez);
		}
	}
	ctlr->im = im;
	csr32w(ctlr, Ims, im);
	spin_unlock_irqsave(&ctlr->imlock);
}

/* assume misrouted interrupts and check all controllers */
static void i82575interrupt(struct hw_trapframe *unused_hw_trapframe,
                            void *unused_arg)
{
	struct ctlr *ctlr;

	for (ctlr = i82563ctlrhead; ctlr != NULL && ctlr->edev != NULL;
	     ctlr = ctlr->next)
		i82563interrupt(NULL, ctlr->edev);
}

static int i82563detach0(struct ctlr *ctlr)
{
	int r, timeo;

	/*
	 * Perform a device reset to get the chip back to the
	 * power-on state, followed by an EEPROM reset to read
	 * the defaults for some internal registers.
	 */
	csr32w(ctlr, Imc, ~0);
	csr32w(ctlr, Rctl, 0);
	csr32w(ctlr, Tctl, 0);

	udelay(1000 * 1000);

	/*
	 * Balance Rx/Tx packet buffer.
	 * No need to set PBA register unless using jumbo, defaults to 32KB
	 * for receive. If it is changed, then have to do a MAC reset,
	 * and need to do that at the the right time as it will wipe stuff.
	 *
	 * TODO(dcross): reconcile the following code with the above commentary.
	 */
	if (0) {
		if (ctlr->rbsz > 8192 && ctlrtab[ctlr->type].flag & Fpba) {
			ctlr->pba = csr32r(ctlr, Pba);
			r = ctlr->pba >> 16;
			r += ctlr->pba & 0xffff;
			r >>= 1;
			csr32w(ctlr, Pba, r);
		} else if (ctlr->type == i82573 && ctlr->rbsz > 1514)
			csr32w(ctlr, Pba, 14);
	}
	ctlr->pba = csr32r(ctlr, Pba);

	/* set packet buffer size if present.  no effect until soft reset. */
	switch (ctlr->type) {
	case i82566:
	case i82567:
	case i217:
		ctlr->pbs = 16; /* in KB */
		csr32w(ctlr, Pbs, ctlr->pbs);
		break;
	case i218:
		// after pxe or 9fat boot, pba is always 0xe0012 on i218 => 32K
		ctlr->pbs = (ctlr->pba >> 16) + (uint16_t)ctlr->pba;
		csr32w(ctlr, Pbs, ctlr->pbs);
		break;
	}

	r = csr32r(ctlr, Ctrl);
	if (ctlr->type == i82566 || ctlr->type == i82567 ||
	    ctlr->type == i82579)
		r |= Phyrst;
	csr32w(ctlr, Ctrl, Devrst | r);
	udelay(1000);
	for (timeo = 0; timeo < 1000; timeo++) {
		if (!(csr32r(ctlr, Ctrl) & Devrst))
			break;
		udelay(1000);
	}
	if (csr32r(ctlr, Ctrl) & Devrst)
		return -1;

	r = csr32r(ctlr, Ctrlext);
	csr32w(ctlr, Ctrlext, r | Eerst);
	udelay(1000);
	for (timeo = 0; timeo < 1000; timeo++) {
		if (!(csr32r(ctlr, Ctrlext) & Eerst))
			break;
		udelay(1000);
	}
	if (csr32r(ctlr, Ctrlext) & Eerst)
		return -1;

	csr32w(ctlr, Imc, ~0);
	udelay(1000);
	for (timeo = 0; timeo < 1000; timeo++) {
		if (!csr32r(ctlr, Icr))
			break;
		udelay(1000);
	}
	if (csr32r(ctlr, Icr))
		return -1;

	csr32w(ctlr, Ctrl, Slu | csr32r(ctlr, Ctrl));
	return 0;
}

static int i82563detach(struct ctlr *ctlr)
{
	int r;
	static spinlock_t detlck;

	spin_lock_irqsave(&detlck);
	r = i82563detach0(ctlr);
	spin_unlock_irqsave(&detlck);
	return r;
}

static void i82563shutdown(struct ether *ether)
{
	i82563detach(ether->ctlr);
}

static uint16_t eeread(struct ctlr *ctlr, int adr)
{
	uint32_t n;

	csr32w(ctlr, Eerd, EEstart | adr << 2);
	n = 1000000;
	while (n > 0 && (csr32r(ctlr, Eerd) & EEdone) == 0)
		n--;
	if (n == 0)
		panic("i82563: eeread stuck");
	return csr32r(ctlr, Eerd) >> 16;
}

/* load eeprom into ctlr */
static int eeload(struct ctlr *ctlr)
{
	uint16_t sum;
	int data, adr;

	sum = 0;
	for (adr = 0; adr < 0x40; adr++) {
		data = eeread(ctlr, adr);
		ctlr->eeprom[adr] = data;
		sum += data;
	}
	return sum;
}

static int fcycle(struct ctlr *unused_ctlr_p, struct flash *f)
{
	uint16_t s, i;

	s = f->reg[Fsts];
	if ((s & Fvalid) == 0)
		return -1;
	f->reg[Fsts] |= Fcerr | Ael;
	for (i = 0; i < 10; i++) {
		if ((s & Scip) == 0) /* spi cycle done? */
			return 0;
		udelay(1000);
		s = f->reg[Fsts];
	}
	return -1;
}

static int fread(struct ctlr *ctlr, struct flash *f, int ladr)
{
	uint16_t s;
	uint32_t n;

	udelay(1000);
	if (fcycle(ctlr, f) == -1)
		return -1;
	f->reg[Fsts] |= Fdone;
	f->reg32[Faddr] = ladr;

	/* setup flash control register */
	s = f->reg[Fctl] & ~(0x1f << 8);
	s |= (2 - 1) << 8;   /* 2 bytes */
	s &= ~(2 * Flcycle); /* read */
	f->reg[Fctl] = s | Fgo;

	n = 1000000;
	while (n > 0 && (f->reg[Fsts] & Fdone) == 0)
		n--;
	if (n == 0)
		panic("i82563: fread stuck");
	if (f->reg[Fsts] & (Fcerr | Ael))
		return -1;
	return f->reg32[Fdata] & 0xffff;
}

/* load flash into ctlr */
static int fload(struct ctlr *ctlr)
{
	uint32_t data, r, adr;
	uint16_t sum;
	uintptr_t mmio_paddr;
	struct pci_device *pcidev = ctlr->pcidev;
	struct flash f;

	mmio_paddr = pcidev->bar[1].mmio_base32 ? pcidev->bar[1].mmio_base32
	                                        : pcidev->bar[1].mmio_base64;
	f.reg = (void *)vmap_pmem(mmio_paddr, pcidev->bar[1].mmio_sz);
	if (f.reg == NULL)
		return -1;
	f.reg32 = (void *)f.reg;
	f.base = f.reg32[Bfpr] & 0x1fff;
	f.lim = (f.reg32[Bfpr] >> 16) & 0x1fff;
	if (csr32r(ctlr, Eec) & Sec1val)
		f.base += (f.lim + 1 - f.base) >> 1;
	r = f.base << 12;

	sum = 0;
	for (adr = 0; adr < 0x40; adr++) {
		data = fread(ctlr, &f, r + adr * 2);
		if (data == -1)
			break;
		ctlr->eeprom[adr] = data;
		sum += data;
	}
	vunmap_vmem((uintptr_t)f.reg, pcidev->bar[1].mmio_sz);
	return sum;
}

static int i82563reset(struct ctlr *ctlr)
{
	int i, r, type;

	/*
	 * TODO(dcross): Integrate ctlrtab references into this code.
	 */
	if (i82563detach(ctlr)) {
		iprint("82563 reset: detach failed\n");
		return -1;
	}
	type = ctlr->type;
	if (ctlr->ra[Eaddrlen - 1] != 0)
		goto macset;
	switch (type) {
	case i82566:
	case i82567:
	case i82577:
		//  case i82578:            /* not yet implemented */
	case i82579:
	case i217:
	case i218:
		r = fload(ctlr);
		break;
	default:
		r = eeload(ctlr);
		break;
	}
	if (r != 0 && r != 0xBABA) {
		printd("%s: bad EEPROM checksum - %#.4ux\n", tname[type], r);
		// return -1;
	}

	/* set mac addr */
	for (i = 0; i < Eaddrlen / 2; i++) {
		ctlr->ra[2 * i] = ctlr->eeprom[Ea + i];
		ctlr->ra[2 * i + 1] = ctlr->eeprom[Ea + i] >> 8;
	}
	/* ea ctlr[1] = ea ctlr[0]+1 */
	ctlr->ra[5] += (csr32r(ctlr, Status) & Lanid) >> 2;
	/*
	 * zero other mac addresses.`
	 * AV bits should be zeroed by master reset & there may only be 11
	 * other registers on e.g., the i217.
	 */
	for (i = 1; i < 12; i++) { /* `12' used to be `16' here */
		csr32w(ctlr, Ral + i * 8, 0);
		csr32w(ctlr, Rah + i * 8, 0);
	}
	memset(ctlr->mta, 0, sizeof(ctlr->mta));
macset:
	/* low mac addr */
	csr32w(ctlr, Ral,
	       ctlr->ra[3] << 24 | ctlr->ra[2] << 16 | ctlr->ra[1] << 8 |
	           ctlr->ra[0]);
	/* address valid | high mac addr */
	csr32w(ctlr, Rah, 0x80000000 | ctlr->ra[5] << 8 | ctlr->ra[4]);

	/* populate multicast table */
	for (i = 0; i < mcbitstolongs(mcastbits(ctlr)); i++)
		csr32w(ctlr, Mta + i * 4, ctlr->mta[i]);

	/*
	 * Does autonegotiation affect this manual setting?
	 * The correct values here should depend on the PBA value
	 * and maximum frame length, no?
	 */
	/* fixed flow control ethernet address 0x0180c2000001 */
	csr32w(ctlr, Fcal, 0x00C28001);
	csr32w(ctlr, Fcah, 0x0100);
	if (type != i82579 && type != i210 && type != i217 && type != i218)
		/* flow control type, dictated by Intel */
		csr32w(ctlr, Fct, 0x8808);
	csr32w(ctlr, Fcttv, 0x0100); /* for XOFF frame */
	// ctlr->fcrtl = 0x00002000;        /* rcv low water mark: 8KB */
	/* rcv high water mark: 16KB, < rcv buffer in PBA & RXA */
	// ctlr->fcrth = 0x00004000;
	ctlr->fcrtl = ctlr->fcrth = 0;
	csr32w(ctlr, Fcrtl, ctlr->fcrtl);
	csr32w(ctlr, Fcrth, ctlr->fcrth);
	return 0;
}

static void i82563pci(void)
{
	int type;
	uintptr_t io;
	void *mem;
	struct pci_device *p;
	struct ctlr *ctlr;

	p = NULL;
	STAILQ_FOREACH (p, &pci_devices, all_dev) {
		if (p->ven_id != 0x8086)
			continue;
		switch (p->dev_id) {
		default:
			continue;
		case 0x1096:
		case 0x10ba:
		case 0x1098: /* serdes; not seen */
		case 0x10bb: /* serdes */
			type = i82563;
			break;
		case 0x1049: /* mm */
		case 0x104a: /* dm */
		case 0x104b: /* dc */
		case 0x104d: /* mc */
		case 0x10bd: /* dm */
		case 0x294c: /* dc-2 */
			type = i82566;
			break;
		case 0x10de: /* lm-3 */
		case 0x10df: /* lf ich10 */
		case 0x10e5: /* lm ich9 */
		case 0x10f5: /* lm-2 */
			type = i82567;
			break;
		case 0x10bf: /* lf ich9m */
		case 0x10cb: /* v ich9m */
		case 0x10cd: /* lf ich10 */
		case 0x10ce: /* v ich10 */
		case 0x10cc: /* lm ich10 */
			type = i82567m;
			break;
		case 0x105e: /* eb */
		case 0x105f: /* eb */
		case 0x1060: /* eb */
		case 0x10a4: /* eb */
		case 0x10a5: /* eb  fiber */
		case 0x10bc: /* eb */
		case 0x10d9: /* eb serdes */
		case 0x10da: /* eb serdes “ophir” */
			type = i82571;
			break;
		case 0x107d: /* eb copper */
		case 0x107e: /* ei fiber */
		case 0x107f: /* ei */
		case 0x10b9: /* sic, 82572gi */
			type = i82572;
			break;
		case 0x108b: /*  v */
		case 0x108c: /*  e (iamt) */
		case 0x109a: /*  l */
			type = i82573;
			break;
		case 0x10d3: /* l */
			type = i82574;
			break;
		case 0x10a7: /* 82575eb: one of a pair of controllers */
		case 0x10a9: /* fiber/serdes */
			type = i82575;
			break;
		case 0x10c9: /* 82576 copper */
		case 0x10e6: /* 82576 fiber */
		case 0x10e7: /* 82576 serdes */
		case 0x150d: /* backplane */
			type = i82576;
			break;
		case 0x10ea: /* 82577lm */
			type = i82577;
			break;
		case 0x10eb: /* lm “calpella” */
			type = i82577m;
			break;
		case 0x1502: /* 82579lm */
		case 0x1503: /* 82579v */
			type = i82579;
			break;
		case 0x10f0: /* dm “king's creek” */
			type = i82578m;
			break;
		case 0x150e: /* “barton hills” */
		case 0x150f: /* fiber */
		case 0x1510: /* backplane */
		case 0x1511: /* sfp */
		case 0x1516:
			type = i82580;
			break;
		case 0x1506: /* v */
			type = i82583;
			break;
		case 0x1533: /* i210-t1 */
		case 0x1534: /* i210 */
		case 0x1536: /* i210-fiber */
		case 0x1537: /* i210-backplane */
		case 0x1538:
		case 0x1539: /* i211 */
		case 0x157b: /* i210 */
		case 0x157c: /* i210 */
			type = i210;
			break;
		case 0x153a: /* i217-lm */
		case 0x153b: /* i217-v */
			type = i217;
			break;
		case 0x15a0: /* i218-lm */
		case 0x15a1: /* i218-v */
		case 0x15a2: /* i218-lm */
		case 0x15a3: /* i218-v */
			type = i218;
			break;
		case 0x151f: /* “powerville” eeprom-less */
		case 0x1521: /* copper */
		case 0x1522: /* fiber */
		case 0x1523: /* serdes */
		case 0x1524: /* sgmii */
			type = i350;
			break;
		}

		io = p->bar[0].mmio_base32 ? p->bar[0].mmio_base32
		                           : p->bar[0].mmio_base64;
		mem = (void *)vmap_pmem(io, p->bar[0].mmio_sz);
		if (mem == NULL) {
			printd("%s: can't map %.8lux\n", tname[type], io);
			continue;
		}
		ctlr = kzmalloc(sizeof(struct ctlr), 0);
		if (ctlr == NULL) {
			vunmap_vmem((uintptr_t)mem, p->bar[0].mmio_sz);
			error(ENOMEM, "i82563pci: alloc for ctlr failed");
		}
		ctlr->mmio_paddr = io;
		ctlr->rbsz = ctlrtab[type].mtu;
		ctlr->pcidev = p;
		ctlr->type = type;
		ctlr->nic = mem;
		ctlr->phynum = -1; /* not yet known */

		qlock_init(&ctlr->alock);
		spinlock_init_irqsave(&ctlr->imlock);
		rendez_init(&ctlr->lrendez);
		qlock_init(&ctlr->slock);
		rendez_init(&ctlr->rrendez);
		rendez_init(&ctlr->trendez);
		qlock_init(&ctlr->tlock);

		pci_set_bus_master(p);
		if (i82563reset(ctlr)) {
			vunmap_vmem((uintptr_t)mem, p->bar[0].mmio_sz);
			kfree(ctlr);
			continue;
		}

		if (i82563ctlrhead != NULL)
			i82563ctlrtail->next = ctlr;
		else
			i82563ctlrhead = ctlr;
		i82563ctlrtail = ctlr;
	}
}

static int pnp(struct ether *edev, int type)
{
	struct ctlr *ctlr;
	static int done;

	if (!done) {
		i82563pci();
		done = 1;
	}

	/*
	 * Any adapter matches if no edev->port is supplied,
	 * otherwise the ports must match.
	 */
	for (ctlr = i82563ctlrhead; ctlr != NULL; ctlr = ctlr->next) {
		if (ctlr->active)
			continue;
		if (type != Iany && ctlr->type != type)
			continue;
		if (edev->port == 0 || edev->port == ctlr->mmio_paddr) {
			ctlr->active = 1;
			break;
		}
	}
	if (ctlr == NULL)
		return -1;

	edev->ctlr = ctlr;
	strlcpy(edev->drv_name, "i82563", KNAMELEN);
	ctlr->edev = edev; /* point back to Ether* */
	edev->port = ctlr->mmio_paddr;
	edev->irq = ctlr->pcidev->irqline;
	edev->tbdf = pci_to_tbdf(ctlr->pcidev);
	edev->mbps = 1000;
	edev->max_mtu = ctlr->rbsz - ETHERHDRSIZE;
	edev->mtu = edev->mtu;
	memmove(edev->ea, ctlr->ra, Eaddrlen);
	/* Jim or whoever have this turned on already.  We might be capable of
	 * other features. */
	edev->feat = NETF_RXCSUM;

	/*
	 * Linkage to the generic ethernet driver.
	 */
	edev->attach = i82563attach;
	edev->transmit = i82563transmit;
	edev->ifstat = i82563ifstat;
	edev->ctl = i82563ctl;

	edev->arg = edev;
	edev->promiscuous = i82563promiscuous;
	edev->shutdown = i82563shutdown;
	edev->multicast = i82563multicast;

	register_irq(edev->irq,
	             ctlr->type == i82575 ? i82575interrupt : i82563interrupt,
	             edev, edev->tbdf);
	return 0;
}

static int anypnp(struct ether *e)
{
	return pnp(e, Iany);
}

static int i82563pnp(struct ether *e)
{
	return pnp(e, i82563);
}

static int i82566pnp(struct ether *e)
{
	return pnp(e, i82566);
}

static int i82571pnp(struct ether *e)
{
	return pnp(e, i82571);
}

static int i82572pnp(struct ether *e)
{
	return pnp(e, i82572);
}

static int i82573pnp(struct ether *e)
{
	return pnp(e, i82573);
}

static int i82575pnp(struct ether *e)
{
	return pnp(e, i82575);
}

static int i82579pnp(struct ether *e)
{
	return pnp(e, i82579);
}

static int i210pnp(struct ether *e)
{
	return pnp(e, i210);
}

static int i217pnp(struct ether *e)
{
	return pnp(e, i217);
}

static int i218pnp(struct ether *e)
{
	return pnp(e, i218);
}

static void __init ether82563link(void)
{
	/* recognise lots of model numbers for debugging assistance */
	addethercard("i82563", i82563pnp);
	addethercard("i82566", i82566pnp);
	addethercard("i82571", i82571pnp);
	addethercard("i82572", i82572pnp);
	addethercard("i82573", i82573pnp);
	addethercard("i82575", i82575pnp);
	addethercard("i82579", i82579pnp);
	addethercard("i210", i210pnp);
	addethercard("i217", i217pnp);
	addethercard("i218", i218pnp);
	addethercard("igbepcie", anypnp);
}
init_func_3(ether82563link);
