Annotation of qemu/roms/ipxe/src/drivers/net/sis190.h, revision 1.1.1.1

1.1       root        1: #ifndef __SIS190_H__
                      2: #define __SIS190_H__
                      3: 
                      4: FILE_LICENCE ( GPL_ANY );
                      5: 
                      6: #include <stdint.h>
                      7: #include <stdio.h>
                      8: #include <stdlib.h>
                      9: #include <stddef.h>
                     10: #include <string.h>
                     11: #include <unistd.h>
                     12: #include <assert.h>
                     13: #include <byteswap.h>
                     14: #include <errno.h>
                     15: #include <mii.h>
                     16: #include <ipxe/ethernet.h>
                     17: #include <ipxe/if_ether.h>
                     18: #include <ipxe/io.h>
                     19: #include <ipxe/iobuf.h>
                     20: #include <ipxe/malloc.h>
                     21: #include <ipxe/netdevice.h>
                     22: #include <ipxe/pci.h>
                     23: #include <ipxe/timer.h>
                     24: 
                     25: #define PCI_VENDOR_ID_SI       0x1039
                     26: 
                     27: #define PHY_MAX_ADDR           32
                     28: #define PHY_ID_ANY             0x1f
                     29: #define MII_REG_ANY            0x1f
                     30: 
                     31: #define DRV_VERSION            "1.3"
                     32: #define DRV_NAME               "sis190"
                     33: #define SIS190_DRIVER_NAME     DRV_NAME " Gigabit Ethernet driver " DRV_VERSION
                     34: #define PFX DRV_NAME ": "
                     35: 
                     36: #define sis190_rx_quota(count, quota)  count
                     37: 
                     38: #define NUM_TX_DESC            8       /* [8..1024] */
                     39: #define NUM_RX_DESC            8       /* [8..8192] */
                     40: #define TX_RING_BYTES          (NUM_TX_DESC * sizeof(struct TxDesc))
                     41: #define RX_RING_BYTES          (NUM_RX_DESC * sizeof(struct RxDesc))
                     42: #define RX_BUF_SIZE            1536
                     43: #define RX_BUF_MASK            0xfff8
                     44: 
                     45: #define RING_ALIGNMENT         256
                     46: 
                     47: #define SIS190_REGS_SIZE       0x80
                     48: 
                     49: /* Enhanced PHY access register bit definitions */
                     50: #define EhnMIIread             0x0000
                     51: #define EhnMIIwrite            0x0020
                     52: #define EhnMIIdataShift                16
                     53: #define EhnMIIpmdShift         6       /* 7016 only */
                     54: #define EhnMIIregShift         11
                     55: #define EhnMIIreq              0x0010
                     56: #define EhnMIInotDone          0x0010
                     57: 
                     58: /* Write/read MMIO register */
                     59: #define SIS_W8(reg, val)       writeb ((val), ioaddr + (reg))
                     60: #define SIS_W16(reg, val)      writew ((val), ioaddr + (reg))
                     61: #define SIS_W32(reg, val)      writel ((val), ioaddr + (reg))
                     62: #define SIS_R8(reg)            readb (ioaddr + (reg))
                     63: #define SIS_R16(reg)           readw (ioaddr + (reg))
                     64: #define SIS_R32(reg)           readl (ioaddr + (reg))
                     65: 
                     66: #define SIS_PCI_COMMIT()       SIS_R32(IntrControl)
                     67: 
                     68: enum sis190_registers {
                     69:        TxControl               = 0x00,
                     70:        TxDescStartAddr         = 0x04,
                     71:        rsv0                    = 0x08, // reserved
                     72:        TxSts                   = 0x0c, // unused (Control/Status)
                     73:        RxControl               = 0x10,
                     74:        RxDescStartAddr         = 0x14,
                     75:        rsv1                    = 0x18, // reserved
                     76:        RxSts                   = 0x1c, // unused
                     77:        IntrStatus              = 0x20,
                     78:        IntrMask                = 0x24,
                     79:        IntrControl             = 0x28,
                     80:        IntrTimer               = 0x2c, // unused (Interupt Timer)
                     81:        PMControl               = 0x30, // unused (Power Mgmt Control/Status)
                     82:        rsv2                    = 0x34, // reserved
                     83:        ROMControl              = 0x38,
                     84:        ROMInterface            = 0x3c,
                     85:        StationControl          = 0x40,
                     86:        GMIIControl             = 0x44,
                     87:        GIoCR                   = 0x48, // unused (GMAC IO Compensation)
                     88:        GIoCtrl                 = 0x4c, // unused (GMAC IO Control)
                     89:        TxMacControl            = 0x50,
                     90:        TxLimit                 = 0x54, // unused (Tx MAC Timer/TryLimit)
                     91:        RGDelay                 = 0x58, // unused (RGMII Tx Internal Delay)
                     92:        rsv3                    = 0x5c, // reserved
                     93:        RxMacControl            = 0x60,
                     94:        RxMacAddr               = 0x62,
                     95:        RxHashTable             = 0x68,
                     96:        // Undocumented         = 0x6c,
                     97:        RxWolCtrl               = 0x70,
                     98:        RxWolData               = 0x74, // unused (Rx WOL Data Access)
                     99:        RxMPSControl            = 0x78, // unused (Rx MPS Control)
                    100:        rsv4                    = 0x7c, // reserved
                    101: };
                    102: 
                    103: enum sis190_register_content {
                    104:        /* IntrStatus */
                    105:        SoftInt                 = 0x40000000,   // unused
                    106:        Timeup                  = 0x20000000,   // unused
                    107:        PauseFrame              = 0x00080000,   // unused
                    108:        MagicPacket             = 0x00040000,   // unused
                    109:        WakeupFrame             = 0x00020000,   // unused
                    110:        LinkChange              = 0x00010000,
                    111:        RxQEmpty                = 0x00000080,
                    112:        RxQInt                  = 0x00000040,
                    113:        TxQ1Empty               = 0x00000020,   // unused
                    114:        TxQ1Int                 = 0x00000010,
                    115:        TxQ0Empty               = 0x00000008,   // unused
                    116:        TxQ0Int                 = 0x00000004,
                    117:        RxHalt                  = 0x00000002,
                    118:        TxHalt                  = 0x00000001,
                    119: 
                    120:        /* {Rx/Tx}CmdBits */
                    121:        CmdReset                = 0x10,
                    122:        CmdRxEnb                = 0x08,         // unused
                    123:        CmdTxEnb                = 0x01,
                    124:        RxBufEmpty              = 0x01,         // unused
                    125: 
                    126:        /* Cfg9346Bits */
                    127:        Cfg9346_Lock            = 0x00,         // unused
                    128:        Cfg9346_Unlock          = 0xc0,         // unused
                    129: 
                    130:        /* RxMacControl */
                    131:        AcceptErr               = 0x20,         // unused
                    132:        AcceptRunt              = 0x10,         // unused
                    133:        AcceptBroadcast         = 0x0800,
                    134:        AcceptMulticast         = 0x0400,
                    135:        AcceptMyPhys            = 0x0200,
                    136:        AcceptAllPhys           = 0x0100,
                    137: 
                    138:        /* RxConfigBits */
                    139:        RxCfgFIFOShift          = 13,
                    140:        RxCfgDMAShift           = 8,            // 0x1a in RxControl ?
                    141: 
                    142:        /* TxConfigBits */
                    143:        TxInterFrameGapShift    = 24,
                    144:        TxDMAShift              = 8, /* DMA burst value (0-7) is shift this many bits */
                    145: 
                    146:        LinkStatus              = 0x02,         // unused
                    147:        FullDup                 = 0x01,         // unused
                    148: 
                    149:        /* TBICSRBit */
                    150:        TBILinkOK               = 0x02000000,   // unused
                    151: };
                    152: 
                    153: struct TxDesc {
                    154:        volatile u32 PSize;
                    155:        volatile u32 status;
                    156:        volatile u32 addr;
                    157:        volatile u32 size;
                    158: };
                    159: 
                    160: struct RxDesc {
                    161:        volatile u32 PSize;
                    162:        volatile u32 status;
                    163:        volatile u32 addr;
                    164:        volatile u32 size;
                    165: };
                    166: 
                    167: enum _DescStatusBit {
                    168:        /* _Desc.status */
                    169:        OWNbit          = 0x80000000, // RXOWN/TXOWN
                    170:        INTbit          = 0x40000000, // RXINT/TXINT
                    171:        CRCbit          = 0x00020000, // CRCOFF/CRCEN
                    172:        PADbit          = 0x00010000, // PREADD/PADEN
                    173:        /* _Desc.size */
                    174:        RingEnd         = 0x80000000,
                    175:        /* TxDesc.status */
                    176:        LSEN            = 0x08000000, // TSO ? -- FR
                    177:        IPCS            = 0x04000000,
                    178:        TCPCS           = 0x02000000,
                    179:        UDPCS           = 0x01000000,
                    180:        BSTEN           = 0x00800000,
                    181:        EXTEN           = 0x00400000,
                    182:        DEFEN           = 0x00200000,
                    183:        BKFEN           = 0x00100000,
                    184:        CRSEN           = 0x00080000,
                    185:        COLEN           = 0x00040000,
                    186:        THOL3           = 0x30000000,
                    187:        THOL2           = 0x20000000,
                    188:        THOL1           = 0x10000000,
                    189:        THOL0           = 0x00000000,
                    190: 
                    191:        WND             = 0x00080000,
                    192:        TABRT           = 0x00040000,
                    193:        FIFO            = 0x00020000,
                    194:        LINK            = 0x00010000,
                    195:        ColCountMask    = 0x0000ffff,
                    196:        /* RxDesc.status */
                    197:        IPON            = 0x20000000,
                    198:        TCPON           = 0x10000000,
                    199:        UDPON           = 0x08000000,
                    200:        Wakup           = 0x00400000,
                    201:        Magic           = 0x00200000,
                    202:        Pause           = 0x00100000,
                    203:        DEFbit          = 0x00200000,
                    204:        BCAST           = 0x000c0000,
                    205:        MCAST           = 0x00080000,
                    206:        UCAST           = 0x00040000,
                    207:        /* RxDesc.PSize */
                    208:        TAGON           = 0x80000000,
                    209:        RxDescCountMask = 0x7f000000, // multi-desc pkt when > 1 ? -- FR
                    210:        ABORT           = 0x00800000,
                    211:        SHORT           = 0x00400000,
                    212:        LIMIT           = 0x00200000,
                    213:        MIIER           = 0x00100000,
                    214:        OVRUN           = 0x00080000,
                    215:        NIBON           = 0x00040000,
                    216:        COLON           = 0x00020000,
                    217:        CRCOK           = 0x00010000,
                    218:        RxSizeMask      = 0x0000ffff
                    219:        /*
                    220:        * The asic could apparently do vlan, TSO, jumbo (sis191 only) and
                    221:        * provide two (unused with Linux) Tx queues. No publically
                    222:        * available documentation alas.
                    223:        */
                    224: };
                    225: 
                    226: enum sis190_eeprom_access_register_bits {
                    227:        EECS    = 0x00000001,   // unused
                    228:        EECLK   = 0x00000002,   // unused
                    229:        EEDO    = 0x00000008,   // unused
                    230:        EEDI    = 0x00000004,   // unused
                    231:        EEREQ   = 0x00000080,
                    232:        EEROP   = 0x00000200,
                    233:        EEWOP   = 0x00000100    // unused
                    234: };
                    235: 
                    236: /* EEPROM Addresses */
                    237: enum sis190_eeprom_address {
                    238:        EEPROMSignature = 0x00,
                    239:        EEPROMCLK       = 0x01, // unused
                    240:        EEPROMInfo      = 0x02,
                    241:        EEPROMMACAddr   = 0x03
                    242: };
                    243: 
                    244: enum sis190_feature {
                    245:        F_HAS_RGMII     = 1,
                    246:        F_PHY_88E1111   = 2,
                    247:        F_PHY_BCM5461   = 4
                    248: };
                    249: 
                    250: struct sis190_private {
                    251:        void *mmio_addr;
                    252:        struct pci_device *pci_device;
                    253:        struct net_device *dev;
                    254:        u32 cur_rx;
                    255:        u32 cur_tx;
                    256:        u32 dirty_rx;
                    257:        u32 dirty_tx;
                    258:        u32 rx_dma;
                    259:        u32 tx_dma;
                    260:        struct RxDesc *RxDescRing;
                    261:        struct TxDesc *TxDescRing;
                    262:        struct io_buffer *Rx_iobuf[NUM_RX_DESC];
                    263:        struct io_buffer *Tx_iobuf[NUM_TX_DESC];
                    264:        struct mii_if_info mii_if;
                    265:        struct list_head first_phy;
                    266:        u32 features;
                    267: };
                    268: 
                    269: struct sis190_phy {
                    270:        struct list_head list;
                    271:        int phy_id;
                    272:        u16 id[2];
                    273:        u16 status;
                    274:        u8  type;
                    275: };
                    276: 
                    277: enum sis190_phy_type {
                    278:        UNKNOWN = 0x00,
                    279:        HOME    = 0x01,
                    280:        LAN     = 0x02,
                    281:        MIX     = 0x03
                    282: };
                    283: 
                    284: static struct mii_chip_info {
                    285:        const char *name;
                    286:        u16 id[2];
                    287:        unsigned int type;
                    288:        u32 feature;
                    289: } mii_chip_table[] = {
                    290:        { "Atheros PHY",          { 0x004d, 0xd010 }, LAN, 0 },
                    291:        { "Atheros PHY AR8012",   { 0x004d, 0xd020 }, LAN, 0 },
                    292:        { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 },
                    293:        { "Broadcom PHY AC131",   { 0x0143, 0xbc70 }, LAN, 0 },
                    294:        { "Agere PHY ET1101B",    { 0x0282, 0xf010 }, LAN, 0 },
                    295:        { "Marvell PHY 88E1111",  { 0x0141, 0x0cc0 }, LAN, F_PHY_88E1111 },
                    296:        { "Realtek PHY RTL8201",  { 0x0000, 0x8200 }, LAN, 0 },
                    297:        { NULL, { 0x00, 0x00 }, 0, 0 }
                    298: };
                    299: 
                    300: static const struct {
                    301:        const char *name;
                    302: } sis_chip_info[] = {
                    303:        { "SiS 190 PCI Fast Ethernet adapter" },
                    304:        { "SiS 191 PCI Gigabit Ethernet adapter" },
                    305: };
                    306: 
                    307: static void sis190_phy_task(struct sis190_private *tp);
                    308: static void sis190_free(struct net_device *dev);
                    309: static inline void sis190_init_rxfilter(struct net_device *dev);
                    310: 
                    311: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.