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

1.1       root        1: /*
                      2:  * Copyright (c) 2008 Marty Connor <[email protected]>
                      3:  * Copyright (c) 2008 Entity Cyber, Inc.
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or
                      6:  * modify it under the terms of the GNU General Public License as
                      7:  * published by the Free Software Foundation; either version 2 of the
                      8:  * License, or any later version.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     12:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     13:  * General Public License for more details.
                     14:  *
                     15:  * You should have received a copy of the GNU General Public License
                     16:  * along with this program; if not, write to the Free Software
                     17:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     18:  *
                     19:  * This driver is based on rtl8169 data sheets and work by:
                     20:  *
                     21:  * Copyright (c) 2002 ShuChen <[email protected]>
                     22:  * Copyright (c) 2003 - 2007 Francois Romieu <[email protected]>
                     23:  * Copyright (c) a lot of people too. Please respect their work.
                     24:  *
                     25:  */
                     26: 
                     27: FILE_LICENCE ( GPL2_OR_LATER );
                     28: 
                     29: #ifndef _R8169_H_
                     30: #define _R8169_H_
                     31: 
                     32: #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
                     33: 
                     34: /** FIXME: include/linux/pci_regs.h has these PCI regs, maybe
                     35:           we need such a file in iPXE?
                     36: **/
                     37: #define  PCI_EXP_DEVCTL                8       /* Device Control */
                     38: #define  PCI_EXP_DEVCTL_READRQ 0x7000  /* Max_Read_Request_Size */
                     39: #define  PCI_EXP_LNKCTL                16      /* Link Control */
                     40: #define  PCI_EXP_LNKCTL_CLKREQ_EN 0x100        /* Enable clkreq */
                     41: #define  PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800  /* Enable No Snoop */
                     42: 
                     43: /** FIXME: update mii.h in src/include/mii.h from Linux sources
                     44:           so we don't have to include these definitiions.
                     45: **/
                     46: /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */
                     47: #define SPEED_10               10
                     48: #define SPEED_100              100
                     49: #define SPEED_1000             1000
                     50: #define SPEED_2500             2500
                     51: #define SPEED_10000            10000
                     52: 
                     53: /* Duplex, half or full. */
                     54: #define DUPLEX_HALF            0x00
                     55: #define DUPLEX_FULL            0x01
                     56: 
                     57: #define AUTONEG_DISABLE                0x00
                     58: #define AUTONEG_ENABLE         0x01
                     59: 
                     60: /* MAC address length */
                     61: #define MAC_ADDR_LEN   6
                     62: 
                     63: #define MAX_READ_REQUEST_SHIFT 12
                     64: #define RX_FIFO_THRESH 7       /* 7 means NO threshold, Rx buffer level before first PCI xfer. */
                     65: #define RX_DMA_BURST   6       /* Maximum PCI burst, '6' is 1024 */
                     66: #define TX_DMA_BURST   6       /* Maximum PCI burst, '6' is 1024 */
                     67: #define EarlyTxThld    0x3F    /* 0x3F means NO early transmit */
                     68: #define RxPacketMaxSize        0x3FE8  /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
                     69: #define SafeMtu                0x1c20  /* ... actually life sucks beyond ~7k */
                     70: #define InterFrameGap  0x03    /* 3 means InterFrameGap = the shortest one */
                     71: 
                     72: #define R8169_REGS_SIZE                256
                     73: #define R8169_NAPI_WEIGHT      64
                     74: #define NUM_TX_DESC    8       /* Number of Tx descriptor registers */
                     75: #define NUM_RX_DESC    8       /* Number of Rx descriptor registers */
                     76: #define RX_BUF_SIZE    1536    /* Rx Buffer size */
                     77: #define R8169_TX_RING_BYTES    (NUM_TX_DESC * sizeof(struct TxDesc))
                     78: #define R8169_RX_RING_BYTES    (NUM_RX_DESC * sizeof(struct RxDesc))
                     79: 
                     80: #define TX_RING_ALIGN          256
                     81: #define RX_RING_ALIGN          256
                     82: 
                     83: #define RTL8169_TX_TIMEOUT     (6*HZ)
                     84: #define RTL8169_PHY_TIMEOUT    (10*HZ)
                     85: 
                     86: #define RTL_EEPROM_SIG         cpu_to_le32(0x8129)
                     87: #define RTL_EEPROM_SIG_MASK    cpu_to_le32(0xffff)
                     88: #define RTL_EEPROM_SIG_ADDR    0x0000
                     89: 
                     90: /* write/read MMIO register */
                     91: #define RTL_W8(reg, val8)      writeb ((val8), ioaddr + (reg))
                     92: #define RTL_W16(reg, val16)    writew ((val16), ioaddr + (reg))
                     93: #define RTL_W32(reg, val32)    writel ((val32), ioaddr + (reg))
                     94: #define RTL_R8(reg)            readb (ioaddr + (reg))
                     95: #define RTL_R16(reg)           readw (ioaddr + (reg))
                     96: #define RTL_R32(reg)           ((unsigned long) readl (ioaddr + (reg)))
                     97: 
                     98: enum mac_version {
                     99:        RTL_GIGA_MAC_VER_01 = 0x01, // 8169
                    100:        RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
                    101:        RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
                    102:        RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
                    103:        RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
                    104:        RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
                    105:        RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
                    106:        RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
                    107:        RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
                    108:        RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
                    109:        RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
                    110:        RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
                    111:        RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
                    112:        RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
                    113:        RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
                    114:        RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
                    115:        RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
                    116:        RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
                    117:        RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
                    118:        RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
                    119:        RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
                    120:        RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
                    121:        RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
                    122:        RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
                    123:        RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
                    124: };
                    125: 
                    126: #define _R(NAME,MAC,MASK) \
                    127:        { .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
                    128: 
                    129: static const struct {
                    130:        const char *name;
                    131:        u8 mac_version;
                    132:        u32 RxConfigMask;       /* Clears the bits supported by this chip */
                    133: } rtl_chip_info[] = {
                    134:        _R("RTL8169",           RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
                    135:        _R("RTL8169s",          RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
                    136:        _R("RTL8110s",          RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
                    137:        _R("RTL8169sb/8110sb",  RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
                    138:        _R("RTL8169sc/8110sc",  RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
                    139:        _R("RTL8169sc/8110sc",  RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
                    140:        _R("RTL8102e",          RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
                    141:        _R("RTL8102e",          RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
                    142:        _R("RTL8102e",          RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
                    143:        _R("RTL8101e",          RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
                    144:        _R("RTL8168b/8111b",    RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
                    145:        _R("RTL8168b/8111b",    RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
                    146:        _R("RTL8101e",          RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
                    147:        _R("RTL8100e",          RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
                    148:        _R("RTL8100e",          RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
                    149:        _R("RTL8168b/8111b",    RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
                    150:        _R("RTL8101e",          RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
                    151:        _R("RTL8168cp/8111cp",  RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
                    152:        _R("RTL8168c/8111c",    RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
                    153:        _R("RTL8168c/8111c",    RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
                    154:        _R("RTL8168c/8111c",    RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
                    155:        _R("RTL8168c/8111c",    RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
                    156:        _R("RTL8168cp/8111cp",  RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
                    157:        _R("RTL8168cp/8111cp",  RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
                    158:        _R("RTL8168d/8111d",    RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
                    159: };
                    160: #undef _R
                    161: 
                    162: enum cfg_version {
                    163:        RTL_CFG_0 = 0x00,
                    164:        RTL_CFG_1,
                    165:        RTL_CFG_2
                    166: };
                    167: 
                    168: #if 0
                    169: /** Device Table from Linux Driver **/
                    170: static struct pci_device_id rtl8169_pci_tbl[] = {
                    171:        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8129), 0, 0, RTL_CFG_0 },
                    172:        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8136), 0, 0, RTL_CFG_2 },
                    173:        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8167), 0, 0, RTL_CFG_0 },
                    174:        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8168), 0, 0, RTL_CFG_1 },
                    175:        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     0x8169), 0, 0, RTL_CFG_0 },
                    176:        { PCI_DEVICE(PCI_VENDOR_ID_DLINK,       0x4300), 0, 0, RTL_CFG_0 },
                    177:        { PCI_DEVICE(PCI_VENDOR_ID_AT,          0xc107), 0, 0, RTL_CFG_0 },
                    178:        { PCI_DEVICE(0x16ec,                    0x0116), 0, 0, RTL_CFG_0 },
                    179:        { PCI_VENDOR_ID_LINKSYS,                0x1032,
                    180:                PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
                    181:        { 0x0001,                               0x8168,
                    182:                PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
                    183:        {0,},
                    184: };
                    185: #endif
                    186: 
                    187: enum rtl_registers {
                    188:        MAC0            = 0,    /* Ethernet hardware address. */
                    189:        MAC4            = 4,
                    190:        MAR0            = 8,    /* Multicast filter. */
                    191:        CounterAddrLow          = 0x10,
                    192:        CounterAddrHigh         = 0x14,
                    193:        TxDescStartAddrLow      = 0x20,
                    194:        TxDescStartAddrHigh     = 0x24,
                    195:        TxHDescStartAddrLow     = 0x28,
                    196:        TxHDescStartAddrHigh    = 0x2c,
                    197:        FLASH           = 0x30,
                    198:        ERSR            = 0x36,
                    199:        ChipCmd         = 0x37,
                    200:        TxPoll          = 0x38,
                    201:        IntrMask        = 0x3c,
                    202:        IntrStatus      = 0x3e,
                    203:        TxConfig        = 0x40,
                    204:        RxConfig        = 0x44,
                    205:        RxMissed        = 0x4c,
                    206:        Cfg9346         = 0x50,
                    207:        Config0         = 0x51,
                    208:        Config1         = 0x52,
                    209:        Config2         = 0x53,
                    210:        Config3         = 0x54,
                    211:        Config4         = 0x55,
                    212:        Config5         = 0x56,
                    213:        MultiIntr       = 0x5c,
                    214:        PHYAR           = 0x60,
                    215:        PHYstatus       = 0x6c,
                    216:        RxMaxSize       = 0xda,
                    217:        CPlusCmd        = 0xe0,
                    218:        IntrMitigate    = 0xe2,
                    219:        RxDescAddrLow   = 0xe4,
                    220:        RxDescAddrHigh  = 0xe8,
                    221:        EarlyTxThres    = 0xec,
                    222:        FuncEvent       = 0xf0,
                    223:        FuncEventMask   = 0xf4,
                    224:        FuncPresetState = 0xf8,
                    225:        FuncForceEvent  = 0xfc,
                    226: };
                    227: 
                    228: enum rtl8110_registers {
                    229:        TBICSR                  = 0x64,
                    230:        TBI_ANAR                = 0x68,
                    231:        TBI_LPAR                = 0x6a,
                    232: };
                    233: 
                    234: enum rtl8168_8101_registers {
                    235:        CSIDR                   = 0x64,
                    236:        CSIAR                   = 0x68,
                    237: #define        CSIAR_FLAG                      0x80000000
                    238: #define        CSIAR_WRITE_CMD                 0x80000000
                    239: #define        CSIAR_BYTE_ENABLE               0x0f
                    240: #define        CSIAR_BYTE_ENABLE_SHIFT         12
                    241: #define        CSIAR_ADDR_MASK                 0x0fff
                    242: 
                    243:        EPHYAR                  = 0x80,
                    244: #define        EPHYAR_FLAG                     0x80000000
                    245: #define        EPHYAR_WRITE_CMD                0x80000000
                    246: #define        EPHYAR_REG_MASK                 0x1f
                    247: #define        EPHYAR_REG_SHIFT                16
                    248: #define        EPHYAR_DATA_MASK                0xffff
                    249:        DBG_REG                 = 0xd1,
                    250: #define        FIX_NAK_1                       (1 << 4)
                    251: #define        FIX_NAK_2                       (1 << 3)
                    252: };
                    253: 
                    254: enum rtl_register_content {
                    255:        /* InterruptStatusBits */
                    256:        SYSErr          = 0x8000,
                    257:        PCSTimeout      = 0x4000,
                    258:        SWInt           = 0x0100,
                    259:        TxDescUnavail   = 0x0080,
                    260:        RxFIFOOver      = 0x0040,
                    261:        LinkChg         = 0x0020,
                    262:        RxOverflow      = 0x0010,
                    263:        TxErr           = 0x0008,
                    264:        TxOK            = 0x0004,
                    265:        RxErr           = 0x0002,
                    266:        RxOK            = 0x0001,
                    267: 
                    268:        /* RxStatusDesc */
                    269:        RxFOVF  = (1 << 23),
                    270:        RxRWT   = (1 << 22),
                    271:        RxRES   = (1 << 21),
                    272:        RxRUNT  = (1 << 20),
                    273:        RxCRC   = (1 << 19),
                    274: 
                    275:        /* ChipCmdBits */
                    276:        CmdReset        = 0x10,
                    277:        CmdRxEnb        = 0x08,
                    278:        CmdTxEnb        = 0x04,
                    279:        RxBufEmpty      = 0x01,
                    280: 
                    281:        /* TXPoll register p.5 */
                    282:        HPQ             = 0x80,         /* Poll cmd on the high prio queue */
                    283:        NPQ             = 0x40,         /* Poll cmd on the low prio queue */
                    284:        FSWInt          = 0x01,         /* Forced software interrupt */
                    285: 
                    286:        /* Cfg9346Bits */
                    287:        Cfg9346_Lock    = 0x00,
                    288:        Cfg9346_Unlock  = 0xc0,
                    289: 
                    290:        /* rx_mode_bits */
                    291:        AcceptErr       = 0x20,
                    292:        AcceptRunt      = 0x10,
                    293:        AcceptBroadcast = 0x08,
                    294:        AcceptMulticast = 0x04,
                    295:        AcceptMyPhys    = 0x02,
                    296:        AcceptAllPhys   = 0x01,
                    297: 
                    298:        /* RxConfigBits */
                    299:        RxCfgFIFOShift  = 13,
                    300:        RxCfgDMAShift   =  8,
                    301: 
                    302:        /* TxConfigBits */
                    303:        TxInterFrameGapShift = 24,
                    304:        TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
                    305: 
                    306:        /* Config1 register p.24 */
                    307:        LEDS1           = (1 << 7),
                    308:        LEDS0           = (1 << 6),
                    309:        MSIEnable       = (1 << 5),     /* Enable Message Signaled Interrupt */
                    310:        Speed_down      = (1 << 4),
                    311:        MEMMAP          = (1 << 3),
                    312:        IOMAP           = (1 << 2),
                    313:        VPD             = (1 << 1),
                    314:        PMEnable        = (1 << 0),     /* Power Management Enable */
                    315: 
                    316:        /* Config2 register p. 25 */
                    317:        PCI_Clock_66MHz = 0x01,
                    318:        PCI_Clock_33MHz = 0x00,
                    319: 
                    320:        /* Config3 register p.25 */
                    321:        MagicPacket     = (1 << 5),     /* Wake up when receives a Magic Packet */
                    322:        LinkUp          = (1 << 4),     /* Wake up when the cable connection is re-established */
                    323:        Beacon_en       = (1 << 0),     /* 8168 only. Reserved in the 8168b */
                    324: 
                    325:        /* Config5 register p.27 */
                    326:        BWF             = (1 << 6),     /* Accept Broadcast wakeup frame */
                    327:        MWF             = (1 << 5),     /* Accept Multicast wakeup frame */
                    328:        UWF             = (1 << 4),     /* Accept Unicast wakeup frame */
                    329:        LanWake         = (1 << 1),     /* LanWake enable/disable */
                    330:        PMEStatus       = (1 << 0),     /* PME status can be reset by PCI RST# */
                    331: 
                    332:        /* TBICSR p.28 */
                    333:        TBIReset        = 0x80000000,
                    334:        TBILoopback     = 0x40000000,
                    335:        TBINwEnable     = 0x20000000,
                    336:        TBINwRestart    = 0x10000000,
                    337:        TBILinkOk       = 0x02000000,
                    338:        TBINwComplete   = 0x01000000,
                    339: 
                    340:        /* CPlusCmd p.31 */
                    341:        EnableBist      = (1 << 15),    // 8168 8101
                    342:        Mac_dbgo_oe     = (1 << 14),    // 8168 8101
                    343:        Normal_mode     = (1 << 13),    // unused
                    344:        Force_half_dup  = (1 << 12),    // 8168 8101
                    345:        Force_rxflow_en = (1 << 11),    // 8168 8101
                    346:        Force_txflow_en = (1 << 10),    // 8168 8101
                    347:        Cxpl_dbg_sel    = (1 << 9),     // 8168 8101
                    348:        ASF             = (1 << 8),     // 8168 8101
                    349:        PktCntrDisable  = (1 << 7),     // 8168 8101
                    350:        Mac_dbgo_sel    = 0x001c,       // 8168
                    351:        RxVlan          = (1 << 6),
                    352:        RxChkSum        = (1 << 5),
                    353:        PCIDAC          = (1 << 4),
                    354:        PCIMulRW        = (1 << 3),
                    355:        INTT_0          = 0x0000,       // 8168
                    356:        INTT_1          = 0x0001,       // 8168
                    357:        INTT_2          = 0x0002,       // 8168
                    358:        INTT_3          = 0x0003,       // 8168
                    359: 
                    360:        /* rtl8169_PHYstatus */
                    361:        TBI_Enable      = 0x80,
                    362:        TxFlowCtrl      = 0x40,
                    363:        RxFlowCtrl      = 0x20,
                    364:        _1000bpsF       = 0x10,
                    365:        _100bps         = 0x08,
                    366:        _10bps          = 0x04,
                    367:        LinkStatus      = 0x02,
                    368:        FullDup         = 0x01,
                    369: 
                    370:        /* _TBICSRBit */
                    371:        TBILinkOK       = 0x02000000,
                    372: 
                    373:        /* DumpCounterCommand */
                    374:        CounterDump     = 0x8,
                    375: };
                    376: 
                    377: enum desc_status_bit {
                    378:        DescOwn         = (1 << 31), /* Descriptor is owned by NIC */
                    379:        RingEnd         = (1 << 30), /* End of descriptor ring */
                    380:        FirstFrag       = (1 << 29), /* First segment of a packet */
                    381:        LastFrag        = (1 << 28), /* Final segment of a packet */
                    382: 
                    383:        /* Tx private */
                    384:        LargeSend       = (1 << 27), /* TCP Large Send Offload (TSO) */
                    385:        MSSShift        = 16,        /* MSS value position */
                    386:        MSSMask         = 0xfff,     /* MSS value + LargeSend bit: 12 bits */
                    387:        IPCS            = (1 << 18), /* Calculate IP checksum */
                    388:        UDPCS           = (1 << 17), /* Calculate UDP/IP checksum */
                    389:        TCPCS           = (1 << 16), /* Calculate TCP/IP checksum */
                    390:        TxVlanTag       = (1 << 17), /* Add VLAN tag */
                    391: 
                    392:        /* Rx private */
                    393:        PID1            = (1 << 18), /* Protocol ID bit 1/2 */
                    394:        PID0            = (1 << 17), /* Protocol ID bit 2/2 */
                    395: 
                    396: #define RxProtoUDP     (PID1)
                    397: #define RxProtoTCP     (PID0)
                    398: #define RxProtoIP      (PID1 | PID0)
                    399: #define RxProtoMask    RxProtoIP
                    400: 
                    401:        IPFail          = (1 << 16), /* IP checksum failed */
                    402:        UDPFail         = (1 << 15), /* UDP/IP checksum failed */
                    403:        TCPFail         = (1 << 14), /* TCP/IP checksum failed */
                    404:        RxVlanTag       = (1 << 16), /* VLAN tag available */
                    405: };
                    406: 
                    407: #define RsvdMask       0x3fffc000
                    408: 
                    409: struct TxDesc {
                    410:        volatile uint32_t opts1;
                    411:        volatile uint32_t opts2;
                    412:        volatile uint32_t addr_lo;
                    413:        volatile uint32_t addr_hi;
                    414: };
                    415: 
                    416: struct RxDesc {
                    417:        volatile uint32_t opts1;
                    418:        volatile uint32_t opts2;
                    419:        volatile uint32_t addr_lo;
                    420:        volatile uint32_t addr_hi;
                    421: };
                    422: 
                    423: enum features {
                    424:        RTL_FEATURE_WOL         = (1 << 0),
                    425:        RTL_FEATURE_MSI         = (1 << 1),
                    426:        RTL_FEATURE_GMII        = (1 << 2),
                    427: };
                    428: 
                    429: static void rtl_hw_start_8169(struct net_device *);
                    430: static void rtl_hw_start_8168(struct net_device *);
                    431: static void rtl_hw_start_8101(struct net_device *);
                    432: 
                    433: struct rtl8169_private {
                    434: 
                    435:        struct pci_device *pci_dev;
                    436:        struct net_device *netdev;
                    437:        uint8_t *hw_addr;
                    438:        void *mmio_addr;
                    439:        uint32_t irqno;
                    440: 
                    441:        int chipset;
                    442:        int mac_version;
                    443:        u16 intr_event;
                    444: 
                    445:        struct io_buffer *tx_iobuf[NUM_TX_DESC];
                    446:        struct io_buffer *rx_iobuf[NUM_RX_DESC];
                    447: 
                    448:        struct TxDesc *tx_base;
                    449:        struct RxDesc *rx_base;
                    450: 
                    451:        uint32_t tx_curr;
                    452:        uint32_t rx_curr;
                    453: 
                    454:        uint32_t tx_tail;
                    455: 
                    456:        uint32_t tx_fill_ctr;
                    457: 
                    458:        u16 cp_cmd;
                    459: 
                    460:        int phy_auto_nego_reg;
                    461:        int phy_1000_ctrl_reg;
                    462: 
                    463:        int ( *set_speed ) (struct net_device *, u8 autoneg, u16 speed, u8 duplex );
                    464:        void ( *phy_reset_enable ) ( void *ioaddr );
                    465:        void ( *hw_start ) ( struct net_device * );
                    466:        unsigned int ( *phy_reset_pending ) ( void *ioaddr );
                    467:        unsigned int ( *link_ok ) ( void *ioaddr );
                    468: 
                    469:        int pcie_cap;
                    470: 
                    471:        unsigned features;
                    472: 
                    473: };
                    474: 
                    475: static const unsigned int rtl8169_rx_config =
                    476:        (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
                    477: 
                    478: #endif /* _R8169_H_ */
                    479: 
                    480: /*
                    481:  * Local variables:
                    482:  *  c-basic-offset: 8
                    483:  *  c-indent-level: 8
                    484:  *  tab-width: 8
                    485:  * End:
                    486:  */

unix.superglobalmegacorp.com

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