/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
#ifndef _ACENIC_H_ 
 | 
#define _ACENIC_H_ 
 | 
#include <linux/interrupt.h> 
 | 
  
 | 
  
 | 
/* 
 | 
 * Generate TX index update each time, when TX ring is closed. 
 | 
 * Normally, this is not useful, because results in more dma (and irqs 
 | 
 * without TX_COAL_INTS_ONLY). 
 | 
 */ 
 | 
#define USE_TX_COAL_NOW     0 
 | 
  
 | 
/* 
 | 
 * Addressing: 
 | 
 * 
 | 
 * The Tigon uses 64-bit host addresses, regardless of their actual 
 | 
 * length, and it expects a big-endian format. For 32 bit systems the 
 | 
 * upper 32 bits of the address are simply ignored (zero), however for 
 | 
 * little endian 64 bit systems (Alpha) this looks strange with the 
 | 
 * two parts of the address word being swapped. 
 | 
 * 
 | 
 * The addresses are split in two 32 bit words for all architectures 
 | 
 * as some of them are in PCI shared memory and it is necessary to use 
 | 
 * readl/writel to access them. 
 | 
 * 
 | 
 * The addressing code is derived from Pete Wyckoff's work, but 
 | 
 * modified to deal properly with readl/writel usage. 
 | 
 */ 
 | 
  
 | 
struct ace_regs { 
 | 
    u32    pad0[16];    /* PCI control registers */ 
 | 
  
 | 
    u32    HostCtrl;    /* 0x40 */ 
 | 
    u32    LocalCtrl; 
 | 
  
 | 
    u32    pad1[2]; 
 | 
  
 | 
    u32    MiscCfg;    /* 0x50 */ 
 | 
  
 | 
    u32    pad2[2]; 
 | 
  
 | 
    u32    PciState; 
 | 
  
 | 
    u32    pad3[2];    /* 0x60 */ 
 | 
  
 | 
    u32    WinBase; 
 | 
    u32    WinData; 
 | 
  
 | 
    u32    pad4[12];    /* 0x70 */ 
 | 
  
 | 
    u32    DmaWriteState;    /* 0xa0 */ 
 | 
    u32    pad5[3]; 
 | 
    u32    DmaReadState;    /* 0xb0 */ 
 | 
  
 | 
    u32    pad6[26]; 
 | 
  
 | 
    u32    AssistState; 
 | 
  
 | 
    u32    pad7[8];    /* 0x120 */ 
 | 
  
 | 
    u32    CpuCtrl;    /* 0x140 */ 
 | 
    u32    Pc; 
 | 
  
 | 
    u32    pad8[3]; 
 | 
  
 | 
    u32    SramAddr;    /* 0x154 */ 
 | 
    u32    SramData; 
 | 
  
 | 
    u32    pad9[49]; 
 | 
  
 | 
    u32    MacRxState;    /* 0x220 */ 
 | 
  
 | 
    u32    pad10[7]; 
 | 
  
 | 
    u32    CpuBCtrl;    /* 0x240 */ 
 | 
    u32    PcB; 
 | 
  
 | 
    u32    pad11[3]; 
 | 
  
 | 
    u32    SramBAddr;    /* 0x254 */ 
 | 
    u32    SramBData; 
 | 
  
 | 
    u32    pad12[105]; 
 | 
  
 | 
    u32    pad13[32];    /* 0x400 */ 
 | 
    u32    Stats[32]; 
 | 
  
 | 
    u32    Mb0Hi;        /* 0x500 */ 
 | 
    u32    Mb0Lo; 
 | 
    u32    Mb1Hi; 
 | 
    u32    CmdPrd; 
 | 
    u32    Mb2Hi; 
 | 
    u32    TxPrd; 
 | 
    u32    Mb3Hi; 
 | 
    u32    RxStdPrd; 
 | 
    u32    Mb4Hi; 
 | 
    u32    RxJumboPrd; 
 | 
    u32    Mb5Hi; 
 | 
    u32    RxMiniPrd; 
 | 
    u32    Mb6Hi; 
 | 
    u32    Mb6Lo; 
 | 
    u32    Mb7Hi; 
 | 
    u32    Mb7Lo; 
 | 
    u32    Mb8Hi; 
 | 
    u32    Mb8Lo; 
 | 
    u32    Mb9Hi; 
 | 
    u32    Mb9Lo; 
 | 
    u32    MbAHi; 
 | 
    u32    MbALo; 
 | 
    u32    MbBHi; 
 | 
    u32    MbBLo; 
 | 
    u32    MbCHi; 
 | 
    u32    MbCLo; 
 | 
    u32    MbDHi; 
 | 
    u32    MbDLo; 
 | 
    u32    MbEHi; 
 | 
    u32    MbELo; 
 | 
    u32    MbFHi; 
 | 
    u32    MbFLo; 
 | 
  
 | 
    u32    pad14[32]; 
 | 
  
 | 
    u32    MacAddrHi;    /* 0x600 */ 
 | 
    u32    MacAddrLo; 
 | 
    u32    InfoPtrHi; 
 | 
    u32    InfoPtrLo; 
 | 
    u32    MultiCastHi;    /* 0x610 */ 
 | 
    u32    MultiCastLo; 
 | 
    u32    ModeStat; 
 | 
    u32    DmaReadCfg; 
 | 
    u32    DmaWriteCfg;    /* 0x620 */ 
 | 
    u32    TxBufRat; 
 | 
    u32    EvtCsm; 
 | 
    u32    CmdCsm; 
 | 
    u32    TuneRxCoalTicks;/* 0x630 */ 
 | 
    u32    TuneTxCoalTicks; 
 | 
    u32    TuneStatTicks; 
 | 
    u32    TuneMaxTxDesc; 
 | 
    u32    TuneMaxRxDesc;    /* 0x640 */ 
 | 
    u32    TuneTrace; 
 | 
    u32    TuneLink; 
 | 
    u32    TuneFastLink; 
 | 
    u32    TracePtr;    /* 0x650 */ 
 | 
    u32    TraceStrt; 
 | 
    u32    TraceLen; 
 | 
    u32    IfIdx; 
 | 
    u32    IfMtu;        /* 0x660 */ 
 | 
    u32    MaskInt; 
 | 
    u32    GigLnkState; 
 | 
    u32    FastLnkState; 
 | 
    u32    pad16[4];    /* 0x670 */ 
 | 
    u32    RxRetCsm;    /* 0x680 */ 
 | 
  
 | 
    u32    pad17[31]; 
 | 
  
 | 
    u32    CmdRng[64];    /* 0x700 */ 
 | 
    u32    Window[0x200]; 
 | 
}; 
 | 
  
 | 
  
 | 
typedef struct { 
 | 
    u32 addrhi; 
 | 
    u32 addrlo; 
 | 
} aceaddr; 
 | 
  
 | 
  
 | 
#define ACE_WINDOW_SIZE    0x800 
 | 
  
 | 
#define ACE_JUMBO_MTU 9000 
 | 
#define ACE_STD_MTU 1500 
 | 
  
 | 
#define ACE_TRACE_SIZE 0x8000 
 | 
  
 | 
/* 
 | 
 * Host control register bits. 
 | 
 */ 
 | 
  
 | 
#define IN_INT        0x01 
 | 
#define CLR_INT        0x02 
 | 
#define HW_RESET    0x08 
 | 
#define BYTE_SWAP    0x10 
 | 
#define WORD_SWAP    0x20 
 | 
#define MASK_INTS    0x40 
 | 
  
 | 
/* 
 | 
 * Local control register bits. 
 | 
 */ 
 | 
  
 | 
#define EEPROM_DATA_IN        0x800000 
 | 
#define EEPROM_DATA_OUT        0x400000 
 | 
#define EEPROM_WRITE_ENABLE    0x200000 
 | 
#define EEPROM_CLK_OUT        0x100000 
 | 
  
 | 
#define EEPROM_BASE        0xa0000000 
 | 
  
 | 
#define EEPROM_WRITE_SELECT    0xa0 
 | 
#define EEPROM_READ_SELECT    0xa1 
 | 
  
 | 
#define SRAM_BANK_512K        0x200 
 | 
  
 | 
  
 | 
/* 
 | 
 * udelay() values for when clocking the eeprom 
 | 
 */ 
 | 
#define ACE_SHORT_DELAY        2 
 | 
#define ACE_LONG_DELAY        4 
 | 
  
 | 
  
 | 
/* 
 | 
 * Misc Config bits 
 | 
 */ 
 | 
  
 | 
#define SYNC_SRAM_TIMING    0x100000 
 | 
  
 | 
  
 | 
/* 
 | 
 * CPU state bits. 
 | 
 */ 
 | 
  
 | 
#define CPU_RESET        0x01 
 | 
#define CPU_TRACE        0x02 
 | 
#define CPU_PROM_FAILED        0x10 
 | 
#define CPU_HALT        0x00010000 
 | 
#define CPU_HALTED        0xffff0000 
 | 
  
 | 
  
 | 
/* 
 | 
 * PCI State bits. 
 | 
 */ 
 | 
  
 | 
#define DMA_READ_MAX_4        0x04 
 | 
#define DMA_READ_MAX_16        0x08 
 | 
#define DMA_READ_MAX_32        0x0c 
 | 
#define DMA_READ_MAX_64        0x10 
 | 
#define DMA_READ_MAX_128    0x14 
 | 
#define DMA_READ_MAX_256    0x18 
 | 
#define DMA_READ_MAX_1K        0x1c 
 | 
#define DMA_WRITE_MAX_4        0x20 
 | 
#define DMA_WRITE_MAX_16    0x40 
 | 
#define DMA_WRITE_MAX_32    0x60 
 | 
#define DMA_WRITE_MAX_64    0x80 
 | 
#define DMA_WRITE_MAX_128    0xa0 
 | 
#define DMA_WRITE_MAX_256    0xc0 
 | 
#define DMA_WRITE_MAX_1K    0xe0 
 | 
#define DMA_READ_WRITE_MASK    0xfc 
 | 
#define MEM_READ_MULTIPLE    0x00020000 
 | 
#define PCI_66MHZ        0x00080000 
 | 
#define PCI_32BIT        0x00100000 
 | 
#define DMA_WRITE_ALL_ALIGN    0x00800000 
 | 
#define READ_CMD_MEM        0x06000000 
 | 
#define WRITE_CMD_MEM        0x70000000 
 | 
  
 | 
  
 | 
/* 
 | 
 * Mode status 
 | 
 */ 
 | 
  
 | 
#define ACE_BYTE_SWAP_BD    0x02 
 | 
#define ACE_WORD_SWAP_BD    0x04        /* not actually used */ 
 | 
#define ACE_WARN        0x08 
 | 
#define ACE_BYTE_SWAP_DMA    0x10 
 | 
#define ACE_NO_JUMBO_FRAG    0x200 
 | 
#define ACE_FATAL        0x40000000 
 | 
  
 | 
  
 | 
/* 
 | 
 * DMA config 
 | 
 */ 
 | 
  
 | 
#define DMA_THRESH_1W        0x10 
 | 
#define DMA_THRESH_2W        0x20 
 | 
#define DMA_THRESH_4W        0x40 
 | 
#define DMA_THRESH_8W        0x80 
 | 
#define DMA_THRESH_16W        0x100 
 | 
#define DMA_THRESH_32W        0x0    /* not described in doc, but exists. */ 
 | 
  
 | 
  
 | 
/* 
 | 
 * Tuning parameters 
 | 
 */ 
 | 
  
 | 
#define TICKS_PER_SEC        1000000 
 | 
  
 | 
  
 | 
/* 
 | 
 * Link bits 
 | 
 */ 
 | 
  
 | 
#define LNK_PREF        0x00008000 
 | 
#define LNK_10MB        0x00010000 
 | 
#define LNK_100MB        0x00020000 
 | 
#define LNK_1000MB        0x00040000 
 | 
#define LNK_FULL_DUPLEX        0x00080000 
 | 
#define LNK_HALF_DUPLEX        0x00100000 
 | 
#define LNK_TX_FLOW_CTL_Y    0x00200000 
 | 
#define LNK_NEG_ADVANCED    0x00400000 
 | 
#define LNK_RX_FLOW_CTL_Y    0x00800000 
 | 
#define LNK_NIC            0x01000000 
 | 
#define LNK_JAM            0x02000000 
 | 
#define LNK_JUMBO        0x04000000 
 | 
#define LNK_ALTEON        0x08000000 
 | 
#define LNK_NEG_FCTL        0x10000000 
 | 
#define LNK_NEGOTIATE        0x20000000 
 | 
#define LNK_ENABLE        0x40000000 
 | 
#define LNK_UP            0x80000000 
 | 
  
 | 
  
 | 
/* 
 | 
 * Event definitions 
 | 
 */ 
 | 
  
 | 
#define EVT_RING_ENTRIES    256 
 | 
#define EVT_RING_SIZE    (EVT_RING_ENTRIES * sizeof(struct event)) 
 | 
  
 | 
struct event { 
 | 
#ifdef __LITTLE_ENDIAN_BITFIELD 
 | 
    u32    idx:12; 
 | 
    u32    code:12; 
 | 
    u32    evt:8; 
 | 
#else 
 | 
    u32    evt:8; 
 | 
    u32    code:12; 
 | 
    u32    idx:12; 
 | 
#endif 
 | 
    u32     pad; 
 | 
}; 
 | 
  
 | 
  
 | 
/* 
 | 
 * Events 
 | 
 */ 
 | 
  
 | 
#define E_FW_RUNNING        0x01 
 | 
#define E_STATS_UPDATED        0x04 
 | 
  
 | 
#define E_STATS_UPDATE        0x04 
 | 
  
 | 
#define E_LNK_STATE        0x06 
 | 
#define E_C_LINK_UP        0x01 
 | 
#define E_C_LINK_DOWN        0x02 
 | 
#define E_C_LINK_10_100        0x03 
 | 
  
 | 
#define E_ERROR            0x07 
 | 
#define E_C_ERR_INVAL_CMD    0x01 
 | 
#define E_C_ERR_UNIMP_CMD    0x02 
 | 
#define E_C_ERR_BAD_CFG        0x03 
 | 
  
 | 
#define E_MCAST_LIST        0x08 
 | 
#define E_C_MCAST_ADDR_ADD    0x01 
 | 
#define E_C_MCAST_ADDR_DEL    0x02 
 | 
  
 | 
#define E_RESET_JUMBO_RNG    0x09 
 | 
  
 | 
  
 | 
/* 
 | 
 * Commands 
 | 
 */ 
 | 
  
 | 
#define CMD_RING_ENTRIES    64 
 | 
  
 | 
struct cmd { 
 | 
#ifdef __LITTLE_ENDIAN_BITFIELD 
 | 
    u32    idx:12; 
 | 
    u32    code:12; 
 | 
    u32    evt:8; 
 | 
#else 
 | 
    u32    evt:8; 
 | 
    u32    code:12; 
 | 
    u32    idx:12; 
 | 
#endif 
 | 
}; 
 | 
  
 | 
  
 | 
#define C_HOST_STATE        0x01 
 | 
#define C_C_STACK_UP        0x01 
 | 
#define C_C_STACK_DOWN        0x02 
 | 
  
 | 
#define C_FDR_FILTERING        0x02 
 | 
#define C_C_FDR_FILT_ENABLE    0x01 
 | 
#define C_C_FDR_FILT_DISABLE    0x02 
 | 
  
 | 
#define C_SET_RX_PRD_IDX    0x03 
 | 
#define C_UPDATE_STATS        0x04 
 | 
#define C_RESET_JUMBO_RNG    0x05 
 | 
#define C_ADD_MULTICAST_ADDR    0x08 
 | 
#define C_DEL_MULTICAST_ADDR    0x09 
 | 
  
 | 
#define C_SET_PROMISC_MODE    0x0a 
 | 
#define C_C_PROMISC_ENABLE    0x01 
 | 
#define C_C_PROMISC_DISABLE    0x02 
 | 
  
 | 
#define C_LNK_NEGOTIATION    0x0b 
 | 
#define C_C_NEGOTIATE_BOTH    0x00 
 | 
#define C_C_NEGOTIATE_GIG    0x01 
 | 
#define C_C_NEGOTIATE_10_100    0x02 
 | 
  
 | 
#define C_SET_MAC_ADDR        0x0c 
 | 
#define C_CLEAR_PROFILE        0x0d 
 | 
  
 | 
#define C_SET_MULTICAST_MODE    0x0e 
 | 
#define C_C_MCAST_ENABLE    0x01 
 | 
#define C_C_MCAST_DISABLE    0x02 
 | 
  
 | 
#define C_CLEAR_STATS        0x0f 
 | 
#define C_SET_RX_JUMBO_PRD_IDX    0x10 
 | 
#define C_REFRESH_STATS        0x11 
 | 
  
 | 
  
 | 
/* 
 | 
 * Descriptor flags 
 | 
 */ 
 | 
#define BD_FLG_TCP_UDP_SUM    0x01 
 | 
#define BD_FLG_IP_SUM        0x02 
 | 
#define BD_FLG_END        0x04 
 | 
#define BD_FLG_MORE        0x08 
 | 
#define BD_FLG_JUMBO        0x10 
 | 
#define BD_FLG_UCAST        0x20 
 | 
#define BD_FLG_MCAST        0x40 
 | 
#define BD_FLG_BCAST        0x60 
 | 
#define BD_FLG_TYP_MASK        0x60 
 | 
#define BD_FLG_IP_FRAG        0x80 
 | 
#define BD_FLG_IP_FRAG_END    0x100 
 | 
#define BD_FLG_VLAN_TAG        0x200 
 | 
#define BD_FLG_FRAME_ERROR    0x400 
 | 
#define BD_FLG_COAL_NOW        0x800 
 | 
#define BD_FLG_MINI        0x1000 
 | 
  
 | 
  
 | 
/* 
 | 
 * Ring Control block flags 
 | 
 */ 
 | 
#define RCB_FLG_TCP_UDP_SUM    0x01 
 | 
#define RCB_FLG_IP_SUM        0x02 
 | 
#define RCB_FLG_NO_PSEUDO_HDR    0x08 
 | 
#define RCB_FLG_VLAN_ASSIST    0x10 
 | 
#define RCB_FLG_COAL_INT_ONLY    0x20 
 | 
#define RCB_FLG_TX_HOST_RING    0x40 
 | 
#define RCB_FLG_IEEE_SNAP_SUM    0x80 
 | 
#define RCB_FLG_EXT_RX_BD    0x100 
 | 
#define RCB_FLG_RNG_DISABLE    0x200 
 | 
  
 | 
  
 | 
/* 
 | 
 * TX ring - maximum TX ring entries for Tigon I's is 128 
 | 
 */ 
 | 
#define MAX_TX_RING_ENTRIES    256 
 | 
#define TIGON_I_TX_RING_ENTRIES    128 
 | 
#define TX_RING_SIZE        (MAX_TX_RING_ENTRIES * sizeof(struct tx_desc)) 
 | 
#define TX_RING_BASE        0x3800 
 | 
  
 | 
struct tx_desc{ 
 | 
        aceaddr    addr; 
 | 
    u32    flagsize; 
 | 
#if 0 
 | 
/* 
 | 
 * This is in PCI shared mem and must be accessed with readl/writel 
 | 
 * real layout is: 
 | 
 */ 
 | 
#if __LITTLE_ENDIAN 
 | 
    u16    flags; 
 | 
    u16    size; 
 | 
    u16    vlan; 
 | 
    u16    reserved; 
 | 
#else 
 | 
    u16    size; 
 | 
    u16    flags; 
 | 
    u16    reserved; 
 | 
    u16    vlan; 
 | 
#endif 
 | 
#endif 
 | 
    u32    vlanres; 
 | 
}; 
 | 
  
 | 
  
 | 
#define RX_STD_RING_ENTRIES    512 
 | 
#define RX_STD_RING_SIZE    (RX_STD_RING_ENTRIES * sizeof(struct rx_desc)) 
 | 
  
 | 
#define RX_JUMBO_RING_ENTRIES    256 
 | 
#define RX_JUMBO_RING_SIZE    (RX_JUMBO_RING_ENTRIES *sizeof(struct rx_desc)) 
 | 
  
 | 
#define RX_MINI_RING_ENTRIES    1024 
 | 
#define RX_MINI_RING_SIZE    (RX_MINI_RING_ENTRIES *sizeof(struct rx_desc)) 
 | 
  
 | 
#define RX_RETURN_RING_ENTRIES    2048 
 | 
#define RX_RETURN_RING_SIZE    (RX_MAX_RETURN_RING_ENTRIES * \ 
 | 
                 sizeof(struct rx_desc)) 
 | 
  
 | 
struct rx_desc{ 
 | 
    aceaddr    addr; 
 | 
#ifdef __LITTLE_ENDIAN 
 | 
    u16    size; 
 | 
    u16    idx; 
 | 
#else 
 | 
    u16    idx; 
 | 
    u16    size; 
 | 
#endif 
 | 
#ifdef __LITTLE_ENDIAN 
 | 
    u16    flags; 
 | 
    u16    type; 
 | 
#else 
 | 
    u16    type; 
 | 
    u16    flags; 
 | 
#endif 
 | 
#ifdef __LITTLE_ENDIAN 
 | 
    u16    tcp_udp_csum; 
 | 
    u16    ip_csum; 
 | 
#else 
 | 
    u16    ip_csum; 
 | 
    u16    tcp_udp_csum; 
 | 
#endif 
 | 
#ifdef __LITTLE_ENDIAN 
 | 
    u16    vlan; 
 | 
    u16    err_flags; 
 | 
#else 
 | 
    u16    err_flags; 
 | 
    u16    vlan; 
 | 
#endif 
 | 
    u32    reserved; 
 | 
    u32    opague; 
 | 
}; 
 | 
  
 | 
  
 | 
/* 
 | 
 * This struct is shared with the NIC firmware. 
 | 
 */ 
 | 
struct ring_ctrl { 
 | 
    aceaddr    rngptr; 
 | 
#ifdef __LITTLE_ENDIAN 
 | 
    u16    flags; 
 | 
    u16    max_len; 
 | 
#else 
 | 
    u16    max_len; 
 | 
    u16    flags; 
 | 
#endif 
 | 
    u32    pad; 
 | 
}; 
 | 
  
 | 
  
 | 
struct ace_mac_stats { 
 | 
    u32 excess_colls; 
 | 
    u32 coll_1; 
 | 
    u32 coll_2; 
 | 
    u32 coll_3; 
 | 
    u32 coll_4; 
 | 
    u32 coll_5; 
 | 
    u32 coll_6; 
 | 
    u32 coll_7; 
 | 
    u32 coll_8; 
 | 
    u32 coll_9; 
 | 
    u32 coll_10; 
 | 
    u32 coll_11; 
 | 
    u32 coll_12; 
 | 
    u32 coll_13; 
 | 
    u32 coll_14; 
 | 
    u32 coll_15; 
 | 
    u32 late_coll; 
 | 
    u32 defers; 
 | 
    u32 crc_err; 
 | 
    u32 underrun; 
 | 
    u32 crs_err; 
 | 
    u32 pad[3]; 
 | 
    u32 drop_ula; 
 | 
    u32 drop_mc; 
 | 
    u32 drop_fc; 
 | 
    u32 drop_space; 
 | 
    u32 coll; 
 | 
    u32 kept_bc; 
 | 
    u32 kept_mc; 
 | 
    u32 kept_uc; 
 | 
}; 
 | 
  
 | 
  
 | 
struct ace_info { 
 | 
    union { 
 | 
        u32 stats[256]; 
 | 
    } s; 
 | 
    struct ring_ctrl    evt_ctrl; 
 | 
    struct ring_ctrl    cmd_ctrl; 
 | 
    struct ring_ctrl    tx_ctrl; 
 | 
    struct ring_ctrl    rx_std_ctrl; 
 | 
    struct ring_ctrl    rx_jumbo_ctrl; 
 | 
    struct ring_ctrl    rx_mini_ctrl; 
 | 
    struct ring_ctrl    rx_return_ctrl; 
 | 
    aceaddr    evt_prd_ptr; 
 | 
    aceaddr    rx_ret_prd_ptr; 
 | 
    aceaddr    tx_csm_ptr; 
 | 
    aceaddr    stats2_ptr; 
 | 
}; 
 | 
  
 | 
  
 | 
struct ring_info { 
 | 
    struct sk_buff        *skb; 
 | 
    DEFINE_DMA_UNMAP_ADDR(mapping); 
 | 
}; 
 | 
  
 | 
  
 | 
/* 
 | 
 * Funny... As soon as we add maplen on alpha, it starts to work 
 | 
 * much slower. Hmm... is it because struct does not fit to one cacheline? 
 | 
 * So, split tx_ring_info. 
 | 
 */ 
 | 
struct tx_ring_info { 
 | 
    struct sk_buff        *skb; 
 | 
    DEFINE_DMA_UNMAP_ADDR(mapping); 
 | 
    DEFINE_DMA_UNMAP_LEN(maplen); 
 | 
}; 
 | 
  
 | 
  
 | 
/* 
 | 
 * struct ace_skb holding the rings of skb's. This is an awful lot of 
 | 
 * pointers, but I don't see any other smart mode to do this in an 
 | 
 * efficient manner ;-( 
 | 
 */ 
 | 
struct ace_skb 
 | 
{ 
 | 
    struct tx_ring_info    tx_skbuff[MAX_TX_RING_ENTRIES]; 
 | 
    struct ring_info    rx_std_skbuff[RX_STD_RING_ENTRIES]; 
 | 
    struct ring_info    rx_mini_skbuff[RX_MINI_RING_ENTRIES]; 
 | 
    struct ring_info    rx_jumbo_skbuff[RX_JUMBO_RING_ENTRIES]; 
 | 
}; 
 | 
  
 | 
  
 | 
/* 
 | 
 * Struct private for the AceNIC. 
 | 
 * 
 | 
 * Elements are grouped so variables used by the tx handling goes 
 | 
 * together, and will go into the same cache lines etc. in order to 
 | 
 * avoid cache line contention between the rx and tx handling on SMP. 
 | 
 * 
 | 
 * Frequently accessed variables are put at the beginning of the 
 | 
 * struct to help the compiler generate better/shorter code. 
 | 
 */ 
 | 
struct ace_private 
 | 
{ 
 | 
    struct net_device    *ndev;        /* backpointer */ 
 | 
    struct ace_info        *info; 
 | 
    struct ace_regs    __iomem    *regs;        /* register base */ 
 | 
    struct ace_skb        *skb; 
 | 
    dma_addr_t        info_dma;    /* 32/64 bit */ 
 | 
  
 | 
    int            version, link; 
 | 
    int            promisc, mcast_all; 
 | 
  
 | 
    /* 
 | 
     * TX elements 
 | 
     */ 
 | 
    struct tx_desc        *tx_ring; 
 | 
    u32            tx_prd; 
 | 
    volatile u32        tx_ret_csm; 
 | 
    int            tx_ring_entries; 
 | 
  
 | 
    /* 
 | 
     * RX elements 
 | 
     */ 
 | 
    unsigned long        std_refill_busy 
 | 
                __attribute__ ((aligned (SMP_CACHE_BYTES))); 
 | 
    unsigned long        mini_refill_busy, jumbo_refill_busy; 
 | 
    atomic_t        cur_rx_bufs; 
 | 
    atomic_t        cur_mini_bufs; 
 | 
    atomic_t        cur_jumbo_bufs; 
 | 
    u32            rx_std_skbprd, rx_mini_skbprd, rx_jumbo_skbprd; 
 | 
    u32            cur_rx; 
 | 
  
 | 
    struct rx_desc        *rx_std_ring; 
 | 
    struct rx_desc        *rx_jumbo_ring; 
 | 
    struct rx_desc        *rx_mini_ring; 
 | 
    struct rx_desc        *rx_return_ring; 
 | 
  
 | 
    int            tasklet_pending, jumbo; 
 | 
    struct tasklet_struct    ace_tasklet; 
 | 
  
 | 
    struct event        *evt_ring; 
 | 
  
 | 
    volatile u32        *evt_prd, *rx_ret_prd, *tx_csm; 
 | 
  
 | 
    dma_addr_t        tx_ring_dma;    /* 32/64 bit */ 
 | 
    dma_addr_t        rx_ring_base_dma; 
 | 
    dma_addr_t        evt_ring_dma; 
 | 
    dma_addr_t        evt_prd_dma, rx_ret_prd_dma, tx_csm_dma; 
 | 
  
 | 
    unsigned char        *trace_buf; 
 | 
    struct pci_dev        *pdev; 
 | 
    struct net_device    *next; 
 | 
    volatile int        fw_running; 
 | 
    int            board_idx; 
 | 
    u16            pci_command; 
 | 
    u8            pci_latency; 
 | 
    const char        *name; 
 | 
#ifdef INDEX_DEBUG 
 | 
    spinlock_t        debug_lock 
 | 
                __attribute__ ((aligned (SMP_CACHE_BYTES))); 
 | 
    u32            last_tx, last_std_rx, last_mini_rx; 
 | 
#endif 
 | 
    int            pci_using_dac; 
 | 
    u8            firmware_major; 
 | 
    u8            firmware_minor; 
 | 
    u8            firmware_fix; 
 | 
    u32            firmware_start; 
 | 
}; 
 | 
  
 | 
  
 | 
#define TX_RESERVED    MAX_SKB_FRAGS 
 | 
  
 | 
static inline int tx_space (struct ace_private *ap, u32 csm, u32 prd) 
 | 
{ 
 | 
    return (csm - prd - 1) & (ACE_TX_RING_ENTRIES(ap) - 1); 
 | 
} 
 | 
  
 | 
#define tx_free(ap)         tx_space((ap)->tx_ret_csm, (ap)->tx_prd, ap) 
 | 
#define tx_ring_full(ap, csm, prd)    (tx_space(ap, csm, prd) <= TX_RESERVED) 
 | 
  
 | 
static inline void set_aceaddr(aceaddr *aa, dma_addr_t addr) 
 | 
{ 
 | 
    u64 baddr = (u64) addr; 
 | 
    aa->addrlo = baddr & 0xffffffff; 
 | 
    aa->addrhi = baddr >> 32; 
 | 
    wmb(); 
 | 
} 
 | 
  
 | 
  
 | 
static inline void ace_set_txprd(struct ace_regs __iomem *regs, 
 | 
                 struct ace_private *ap, u32 value) 
 | 
{ 
 | 
#ifdef INDEX_DEBUG 
 | 
    unsigned long flags; 
 | 
    spin_lock_irqsave(&ap->debug_lock, flags); 
 | 
    writel(value, ®s->TxPrd); 
 | 
    if (value == ap->last_tx) 
 | 
        printk(KERN_ERR "AceNIC RACE ALERT! writing identical value " 
 | 
               "to tx producer (%i)\n", value); 
 | 
    ap->last_tx = value; 
 | 
    spin_unlock_irqrestore(&ap->debug_lock, flags); 
 | 
#else 
 | 
    writel(value, ®s->TxPrd); 
 | 
#endif 
 | 
    wmb(); 
 | 
} 
 | 
  
 | 
  
 | 
static inline void ace_mask_irq(struct net_device *dev) 
 | 
{ 
 | 
    struct ace_private *ap = netdev_priv(dev); 
 | 
    struct ace_regs __iomem *regs = ap->regs; 
 | 
  
 | 
    if (ACE_IS_TIGON_I(ap)) 
 | 
        writel(1, ®s->MaskInt); 
 | 
    else 
 | 
        writel(readl(®s->HostCtrl) | MASK_INTS, ®s->HostCtrl); 
 | 
  
 | 
    ace_sync_irq(dev->irq); 
 | 
} 
 | 
  
 | 
  
 | 
static inline void ace_unmask_irq(struct net_device *dev) 
 | 
{ 
 | 
    struct ace_private *ap = netdev_priv(dev); 
 | 
    struct ace_regs __iomem *regs = ap->regs; 
 | 
  
 | 
    if (ACE_IS_TIGON_I(ap)) 
 | 
        writel(0, ®s->MaskInt); 
 | 
    else 
 | 
        writel(readl(®s->HostCtrl) & ~MASK_INTS, ®s->HostCtrl); 
 | 
} 
 | 
  
 | 
  
 | 
/* 
 | 
 * Prototypes 
 | 
 */ 
 | 
static int ace_init(struct net_device *dev); 
 | 
static void ace_load_std_rx_ring(struct net_device *dev, int nr_bufs); 
 | 
static void ace_load_mini_rx_ring(struct net_device *dev, int nr_bufs); 
 | 
static void ace_load_jumbo_rx_ring(struct net_device *dev, int nr_bufs); 
 | 
static irqreturn_t ace_interrupt(int irq, void *dev_id); 
 | 
static int ace_load_firmware(struct net_device *dev); 
 | 
static int ace_open(struct net_device *dev); 
 | 
static netdev_tx_t ace_start_xmit(struct sk_buff *skb, 
 | 
                  struct net_device *dev); 
 | 
static int ace_close(struct net_device *dev); 
 | 
static void ace_tasklet(struct tasklet_struct *t); 
 | 
static void ace_dump_trace(struct ace_private *ap); 
 | 
static void ace_set_multicast_list(struct net_device *dev); 
 | 
static int ace_change_mtu(struct net_device *dev, int new_mtu); 
 | 
static int ace_set_mac_addr(struct net_device *dev, void *p); 
 | 
static void ace_set_rxtx_parms(struct net_device *dev, int jumbo); 
 | 
static int ace_allocate_descriptors(struct net_device *dev); 
 | 
static void ace_free_descriptors(struct net_device *dev); 
 | 
static void ace_init_cleanup(struct net_device *dev); 
 | 
static struct net_device_stats *ace_get_stats(struct net_device *dev); 
 | 
static int read_eeprom_byte(struct net_device *dev, unsigned long offset); 
 | 
  
 | 
#endif /* _ACENIC_H_ */ 
 |