/* typhoon.h:    chip info for the 3Com 3CR990 family of controllers */ 
 | 
/* 
 | 
    Written 2002-2003 by David Dillow <dave@thedillows.org> 
 | 
  
 | 
    This software may be used and distributed according to the terms of 
 | 
    the GNU General Public License (GPL), incorporated herein by reference. 
 | 
    Drivers based on or derived from this code fall under the GPL and must 
 | 
    retain the authorship, copyright and license notice.  This file is not 
 | 
    a complete program and may only be used when the entire operating 
 | 
    system is licensed under the GPL. 
 | 
  
 | 
    This software is available on a public web site. It may enable 
 | 
    cryptographic capabilities of the 3Com hardware, and may be 
 | 
    exported from the United States under License Exception "TSU" 
 | 
    pursuant to 15 C.F.R. Section 740.13(e). 
 | 
  
 | 
    This work was funded by the National Library of Medicine under 
 | 
    the Department of Energy project number 0274DD06D1 and NLM project 
 | 
    number Y1-LM-2015-01. 
 | 
*/ 
 | 
  
 | 
/* All Typhoon ring positions are specificed in bytes, and point to the 
 | 
 * first "clean" entry in the ring -- ie the next entry we use for whatever 
 | 
 * purpose. 
 | 
 */ 
 | 
  
 | 
/* The Typhoon basic ring 
 | 
 * ringBase:  where this ring lives (our virtual address) 
 | 
 * lastWrite: the next entry we'll use 
 | 
 */ 
 | 
struct basic_ring { 
 | 
    u8 *ringBase; 
 | 
    u32 lastWrite; 
 | 
}; 
 | 
  
 | 
/* The Typhoon transmit ring -- same as a basic ring, plus: 
 | 
 * lastRead:      where we're at in regard to cleaning up the ring 
 | 
 * writeRegister: register to use for writing (different for Hi & Lo rings) 
 | 
 */ 
 | 
struct transmit_ring { 
 | 
    u8 *ringBase; 
 | 
    u32 lastWrite; 
 | 
    u32 lastRead; 
 | 
    int writeRegister; 
 | 
}; 
 | 
  
 | 
/* The host<->Typhoon ring index structure 
 | 
 * This indicates the current positions in the rings 
 | 
 * 
 | 
 * All values must be in little endian format for the 3XP 
 | 
 * 
 | 
 * rxHiCleared:   entry we've cleared to in the Hi receive ring 
 | 
 * rxLoCleared:   entry we've cleared to in the Lo receive ring 
 | 
 * rxBuffReady:   next entry we'll put a free buffer in 
 | 
 * respCleared:   entry we've cleared to in the response ring 
 | 
 * 
 | 
 * txLoCleared:   entry the NIC has cleared to in the Lo transmit ring 
 | 
 * txHiCleared:   entry the NIC has cleared to in the Hi transmit ring 
 | 
 * rxLoReady:     entry the NIC has filled to in the Lo receive ring 
 | 
 * rxBuffCleared: entry the NIC has cleared in the free buffer ring 
 | 
 * cmdCleared:    entry the NIC has cleared in the command ring 
 | 
 * respReady:     entry the NIC has filled to in the response ring 
 | 
 * rxHiReady:     entry the NIC has filled to in the Hi receive ring 
 | 
 */ 
 | 
struct typhoon_indexes { 
 | 
    /* The first four are written by the host, and read by the NIC */ 
 | 
    volatile __le32 rxHiCleared; 
 | 
    volatile __le32 rxLoCleared; 
 | 
    volatile __le32 rxBuffReady; 
 | 
    volatile __le32 respCleared; 
 | 
  
 | 
    /* The remaining are written by the NIC, and read by the host */ 
 | 
    volatile __le32 txLoCleared; 
 | 
    volatile __le32 txHiCleared; 
 | 
    volatile __le32 rxLoReady; 
 | 
    volatile __le32 rxBuffCleared; 
 | 
    volatile __le32 cmdCleared; 
 | 
    volatile __le32 respReady; 
 | 
    volatile __le32 rxHiReady; 
 | 
} __packed; 
 | 
  
 | 
/* The host<->Typhoon interface 
 | 
 * Our means of communicating where things are 
 | 
 * 
 | 
 * All values must be in little endian format for the 3XP 
 | 
 * 
 | 
 * ringIndex:   64 bit bus address of the index structure 
 | 
 * txLoAddr:    64 bit bus address of the Lo transmit ring 
 | 
 * txLoSize:    size (in bytes) of the Lo transmit ring 
 | 
 * txHi*:       as above for the Hi priority transmit ring 
 | 
 * rxLo*:       as above for the Lo priority receive ring 
 | 
 * rxBuff*:     as above for the free buffer ring 
 | 
 * cmd*:        as above for the command ring 
 | 
 * resp*:       as above for the response ring 
 | 
 * zeroAddr:    64 bit bus address of a zero word (for DMA) 
 | 
 * rxHi*:       as above for the Hi Priority receive ring 
 | 
 * 
 | 
 * While there is room for 64 bit addresses, current versions of the 3XP 
 | 
 * only do 32 bit addresses, so the *Hi for each of the above will always 
 | 
 * be zero. 
 | 
 */ 
 | 
struct typhoon_interface { 
 | 
    __le32 ringIndex; 
 | 
    __le32 ringIndexHi; 
 | 
    __le32 txLoAddr; 
 | 
    __le32 txLoAddrHi; 
 | 
    __le32 txLoSize; 
 | 
    __le32 txHiAddr; 
 | 
    __le32 txHiAddrHi; 
 | 
    __le32 txHiSize; 
 | 
    __le32 rxLoAddr; 
 | 
    __le32 rxLoAddrHi; 
 | 
    __le32 rxLoSize; 
 | 
    __le32 rxBuffAddr; 
 | 
    __le32 rxBuffAddrHi; 
 | 
    __le32 rxBuffSize; 
 | 
    __le32 cmdAddr; 
 | 
    __le32 cmdAddrHi; 
 | 
    __le32 cmdSize; 
 | 
    __le32 respAddr; 
 | 
    __le32 respAddrHi; 
 | 
    __le32 respSize; 
 | 
    __le32 zeroAddr; 
 | 
    __le32 zeroAddrHi; 
 | 
    __le32 rxHiAddr; 
 | 
    __le32 rxHiAddrHi; 
 | 
    __le32 rxHiSize; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon transmit/fragment descriptor 
 | 
 * 
 | 
 * A packet is described by a packet descriptor, followed by option descriptors, 
 | 
 * if any, then one or more fragment descriptors. 
 | 
 * 
 | 
 * Packet descriptor: 
 | 
 * flags:    Descriptor type 
 | 
 * len:i    zero, or length of this packet 
 | 
 * addr*:    8 bytes of opaque data to the firmware -- for skb pointer 
 | 
 * processFlags: Determine offload tasks to perform on this packet. 
 | 
 * 
 | 
 * Fragment descriptor: 
 | 
 * flags:    Descriptor type 
 | 
 * len:i    length of this fragment 
 | 
 * addr:    low bytes of DMA address for this part of the packet 
 | 
 * addrHi:    hi bytes of DMA address for this part of the packet 
 | 
 * processFlags: must be zero 
 | 
 * 
 | 
 * TYPHOON_DESC_VALID is not mentioned in their docs, but their Linux 
 | 
 * driver uses it. 
 | 
 */ 
 | 
struct tx_desc { 
 | 
    u8  flags; 
 | 
#define TYPHOON_TYPE_MASK    0x07 
 | 
#define     TYPHOON_FRAG_DESC    0x00 
 | 
#define     TYPHOON_TX_DESC        0x01 
 | 
#define     TYPHOON_CMD_DESC    0x02 
 | 
#define     TYPHOON_OPT_DESC    0x03 
 | 
#define     TYPHOON_RX_DESC        0x04 
 | 
#define     TYPHOON_RESP_DESC    0x05 
 | 
#define TYPHOON_OPT_TYPE_MASK    0xf0 
 | 
#define     TYPHOON_OPT_IPSEC    0x00 
 | 
#define     TYPHOON_OPT_TCP_SEG    0x10 
 | 
#define TYPHOON_CMD_RESPOND    0x40 
 | 
#define TYPHOON_RESP_ERROR    0x40 
 | 
#define TYPHOON_RX_ERROR    0x40 
 | 
#define TYPHOON_DESC_VALID    0x80 
 | 
    u8  numDesc; 
 | 
    __le16 len; 
 | 
    union { 
 | 
        struct { 
 | 
            __le32 addr; 
 | 
            __le32 addrHi; 
 | 
        } frag; 
 | 
        u64 tx_addr;    /* opaque for hardware, for TX_DESC */ 
 | 
    }; 
 | 
    __le32 processFlags; 
 | 
#define TYPHOON_TX_PF_NO_CRC        cpu_to_le32(0x00000001) 
 | 
#define TYPHOON_TX_PF_IP_CHKSUM        cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_TX_PF_TCP_CHKSUM    cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_TX_PF_TCP_SEGMENT    cpu_to_le32(0x00000008) 
 | 
#define TYPHOON_TX_PF_INSERT_VLAN    cpu_to_le32(0x00000010) 
 | 
#define TYPHOON_TX_PF_IPSEC        cpu_to_le32(0x00000020) 
 | 
#define TYPHOON_TX_PF_VLAN_PRIORITY    cpu_to_le32(0x00000040) 
 | 
#define TYPHOON_TX_PF_UDP_CHKSUM    cpu_to_le32(0x00000080) 
 | 
#define TYPHOON_TX_PF_PAD_FRAME        cpu_to_le32(0x00000100) 
 | 
#define TYPHOON_TX_PF_RESERVED        cpu_to_le32(0x00000e00) 
 | 
#define TYPHOON_TX_PF_VLAN_MASK        cpu_to_le32(0x0ffff000) 
 | 
#define TYPHOON_TX_PF_INTERNAL        cpu_to_le32(0xf0000000) 
 | 
#define TYPHOON_TX_PF_VLAN_TAG_SHIFT    12 
 | 
} __packed; 
 | 
  
 | 
/* The TCP Segmentation offload option descriptor 
 | 
 * 
 | 
 * flags:    descriptor type 
 | 
 * numDesc:    must be 1 
 | 
 * mss_flags:    bits 0-11 (little endian) are MSS, 12 is first TSO descriptor 
 | 
 *            13 is list TSO descriptor, set both if only one TSO 
 | 
 * respAddrLo:    low bytes of address of the bytesTx field of this descriptor 
 | 
 * bytesTx:    total number of bytes in this TSO request 
 | 
 * status:    0 on completion 
 | 
 */ 
 | 
struct tcpopt_desc { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 mss_flags; 
 | 
#define TYPHOON_TSO_FIRST        cpu_to_le16(0x1000) 
 | 
#define TYPHOON_TSO_LAST        cpu_to_le16(0x2000) 
 | 
    __le32 respAddrLo; 
 | 
    __le32 bytesTx; 
 | 
    __le32 status; 
 | 
} __packed; 
 | 
  
 | 
/* The IPSEC Offload descriptor 
 | 
 * 
 | 
 * flags:    descriptor type 
 | 
 * numDesc:    must be 1 
 | 
 * ipsecFlags:    bit 0: 0 -- generate IV, 1 -- use supplied IV 
 | 
 * sa1, sa2:    Security Association IDs for this packet 
 | 
 * reserved:    set to 0 
 | 
 */ 
 | 
struct ipsec_desc { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 ipsecFlags; 
 | 
#define TYPHOON_IPSEC_GEN_IV    cpu_to_le16(0x0000) 
 | 
#define TYPHOON_IPSEC_USE_IV    cpu_to_le16(0x0001) 
 | 
    __le32 sa1; 
 | 
    __le32 sa2; 
 | 
    __le32 reserved; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon receive descriptor (Updated by NIC) 
 | 
 * 
 | 
 * flags:         Descriptor type, error indication 
 | 
 * numDesc:       Always zero 
 | 
 * frameLen:      the size of the packet received 
 | 
 * addr:          low 32 bytes of the virtual addr passed in for this buffer 
 | 
 * addrHi:        high 32 bytes of the virtual addr passed in for this buffer 
 | 
 * rxStatus:      Error if set in flags, otherwise result of offload processing 
 | 
 * filterResults: results of filtering on packet, not used 
 | 
 * ipsecResults:  Results of IPSEC processing 
 | 
 * vlanTag:       the 801.2q TCI from the packet 
 | 
 */ 
 | 
struct rx_desc { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 frameLen; 
 | 
    u32 addr;    /* opaque, comes from virtAddr */ 
 | 
    u32 addrHi;    /* opaque, comes from virtAddrHi */ 
 | 
    __le32 rxStatus; 
 | 
#define TYPHOON_RX_ERR_INTERNAL        cpu_to_le32(0x00000000) 
 | 
#define TYPHOON_RX_ERR_FIFO_UNDERRUN    cpu_to_le32(0x00000001) 
 | 
#define TYPHOON_RX_ERR_BAD_SSD        cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_RX_ERR_RUNT        cpu_to_le32(0x00000003) 
 | 
#define TYPHOON_RX_ERR_CRC        cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_RX_ERR_OVERSIZE        cpu_to_le32(0x00000005) 
 | 
#define TYPHOON_RX_ERR_ALIGN        cpu_to_le32(0x00000006) 
 | 
#define TYPHOON_RX_ERR_DRIBBLE        cpu_to_le32(0x00000007) 
 | 
#define TYPHOON_RX_PROTO_MASK        cpu_to_le32(0x00000003) 
 | 
#define TYPHOON_RX_PROTO_UNKNOWN    cpu_to_le32(0x00000000) 
 | 
#define TYPHOON_RX_PROTO_IP        cpu_to_le32(0x00000001) 
 | 
#define TYPHOON_RX_PROTO_IPX        cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_RX_VLAN            cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_RX_IP_FRAG        cpu_to_le32(0x00000008) 
 | 
#define TYPHOON_RX_IPSEC        cpu_to_le32(0x00000010) 
 | 
#define TYPHOON_RX_IP_CHK_FAIL        cpu_to_le32(0x00000020) 
 | 
#define TYPHOON_RX_TCP_CHK_FAIL        cpu_to_le32(0x00000040) 
 | 
#define TYPHOON_RX_UDP_CHK_FAIL        cpu_to_le32(0x00000080) 
 | 
#define TYPHOON_RX_IP_CHK_GOOD        cpu_to_le32(0x00000100) 
 | 
#define TYPHOON_RX_TCP_CHK_GOOD        cpu_to_le32(0x00000200) 
 | 
#define TYPHOON_RX_UDP_CHK_GOOD        cpu_to_le32(0x00000400) 
 | 
    __le16 filterResults; 
 | 
#define TYPHOON_RX_FILTER_MASK        cpu_to_le16(0x7fff) 
 | 
#define TYPHOON_RX_FILTERED        cpu_to_le16(0x8000) 
 | 
    __le16 ipsecResults; 
 | 
#define TYPHOON_RX_OUTER_AH_GOOD    cpu_to_le16(0x0001) 
 | 
#define TYPHOON_RX_OUTER_ESP_GOOD    cpu_to_le16(0x0002) 
 | 
#define TYPHOON_RX_INNER_AH_GOOD    cpu_to_le16(0x0004) 
 | 
#define TYPHOON_RX_INNER_ESP_GOOD    cpu_to_le16(0x0008) 
 | 
#define TYPHOON_RX_OUTER_AH_FAIL    cpu_to_le16(0x0010) 
 | 
#define TYPHOON_RX_OUTER_ESP_FAIL    cpu_to_le16(0x0020) 
 | 
#define TYPHOON_RX_INNER_AH_FAIL    cpu_to_le16(0x0040) 
 | 
#define TYPHOON_RX_INNER_ESP_FAIL    cpu_to_le16(0x0080) 
 | 
#define TYPHOON_RX_UNKNOWN_SA        cpu_to_le16(0x0100) 
 | 
#define TYPHOON_RX_ESP_FORMAT_ERR    cpu_to_le16(0x0200) 
 | 
    __be32 vlanTag; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon free buffer descriptor, used to give a buffer to the NIC 
 | 
 * 
 | 
 * physAddr:    low 32 bits of the bus address of the buffer 
 | 
 * physAddrHi:  high 32 bits of the bus address of the buffer, always zero 
 | 
 * virtAddr:    low 32 bits of the skb address 
 | 
 * virtAddrHi:  high 32 bits of the skb address, always zero 
 | 
 * 
 | 
 * the virt* address is basically two 32 bit cookies, just passed back 
 | 
 * from the NIC 
 | 
 */ 
 | 
struct rx_free { 
 | 
    __le32 physAddr; 
 | 
    __le32 physAddrHi; 
 | 
    u32 virtAddr; 
 | 
    u32 virtAddrHi; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon command descriptor, used for commands and responses 
 | 
 * 
 | 
 * flags:   descriptor type 
 | 
 * numDesc: number of descriptors following in this command/response, 
 | 
 *                ie, zero for a one descriptor command 
 | 
 * cmd:     the command 
 | 
 * seqNo:   sequence number (unused) 
 | 
 * parm1:   use varies by command 
 | 
 * parm2:   use varies by command 
 | 
 * parm3:   use varies by command 
 | 
 */ 
 | 
struct cmd_desc { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 cmd; 
 | 
#define TYPHOON_CMD_TX_ENABLE        cpu_to_le16(0x0001) 
 | 
#define TYPHOON_CMD_TX_DISABLE        cpu_to_le16(0x0002) 
 | 
#define TYPHOON_CMD_RX_ENABLE        cpu_to_le16(0x0003) 
 | 
#define TYPHOON_CMD_RX_DISABLE        cpu_to_le16(0x0004) 
 | 
#define TYPHOON_CMD_SET_RX_FILTER    cpu_to_le16(0x0005) 
 | 
#define TYPHOON_CMD_READ_STATS        cpu_to_le16(0x0007) 
 | 
#define TYPHOON_CMD_XCVR_SELECT        cpu_to_le16(0x0013) 
 | 
#define TYPHOON_CMD_SET_MAX_PKT_SIZE    cpu_to_le16(0x001a) 
 | 
#define TYPHOON_CMD_READ_MEDIA_STATUS    cpu_to_le16(0x001b) 
 | 
#define TYPHOON_CMD_GOTO_SLEEP        cpu_to_le16(0x0023) 
 | 
#define TYPHOON_CMD_SET_MULTICAST_HASH    cpu_to_le16(0x0025) 
 | 
#define TYPHOON_CMD_SET_MAC_ADDRESS    cpu_to_le16(0x0026) 
 | 
#define TYPHOON_CMD_READ_MAC_ADDRESS    cpu_to_le16(0x0027) 
 | 
#define TYPHOON_CMD_VLAN_TYPE_WRITE    cpu_to_le16(0x002b) 
 | 
#define TYPHOON_CMD_CREATE_SA        cpu_to_le16(0x0034) 
 | 
#define TYPHOON_CMD_DELETE_SA        cpu_to_le16(0x0035) 
 | 
#define TYPHOON_CMD_READ_VERSIONS    cpu_to_le16(0x0043) 
 | 
#define TYPHOON_CMD_IRQ_COALESCE_CTRL    cpu_to_le16(0x0045) 
 | 
#define TYPHOON_CMD_ENABLE_WAKE_EVENTS    cpu_to_le16(0x0049) 
 | 
#define TYPHOON_CMD_SET_OFFLOAD_TASKS    cpu_to_le16(0x004f) 
 | 
#define TYPHOON_CMD_HELLO_RESP        cpu_to_le16(0x0057) 
 | 
#define TYPHOON_CMD_HALT        cpu_to_le16(0x005d) 
 | 
#define TYPHOON_CMD_READ_IPSEC_INFO    cpu_to_le16(0x005e) 
 | 
#define TYPHOON_CMD_GET_IPSEC_ENABLE    cpu_to_le16(0x0067) 
 | 
#define TYPHOON_CMD_GET_CMD_LVL        cpu_to_le16(0x0069) 
 | 
    u16 seqNo; 
 | 
    __le16 parm1; 
 | 
    __le32 parm2; 
 | 
    __le32 parm3; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon response descriptor, see command descriptor for details 
 | 
 */ 
 | 
struct resp_desc { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 cmd; 
 | 
    __le16 seqNo; 
 | 
    __le16 parm1; 
 | 
    __le32 parm2; 
 | 
    __le32 parm3; 
 | 
} __packed; 
 | 
  
 | 
#define INIT_COMMAND_NO_RESPONSE(x, command)                \ 
 | 
    do { struct cmd_desc *_ptr = (x);                \ 
 | 
        memset(_ptr, 0, sizeof(struct cmd_desc));        \ 
 | 
        _ptr->flags = TYPHOON_CMD_DESC | TYPHOON_DESC_VALID;    \ 
 | 
        _ptr->cmd = command;                    \ 
 | 
    } while (0) 
 | 
  
 | 
/* We set seqNo to 1 if we're expecting a response from this command */ 
 | 
#define INIT_COMMAND_WITH_RESPONSE(x, command)                \ 
 | 
    do { struct cmd_desc *_ptr = (x);                \ 
 | 
        memset(_ptr, 0, sizeof(struct cmd_desc));        \ 
 | 
        _ptr->flags = TYPHOON_CMD_RESPOND | TYPHOON_CMD_DESC;    \ 
 | 
        _ptr->flags |= TYPHOON_DESC_VALID;             \ 
 | 
        _ptr->cmd = command;                    \ 
 | 
        _ptr->seqNo = 1;                    \ 
 | 
    } while (0) 
 | 
  
 | 
/* TYPHOON_CMD_SET_RX_FILTER filter bits (cmd.parm1) 
 | 
 */ 
 | 
#define TYPHOON_RX_FILTER_DIRECTED    cpu_to_le16(0x0001) 
 | 
#define TYPHOON_RX_FILTER_ALL_MCAST    cpu_to_le16(0x0002) 
 | 
#define TYPHOON_RX_FILTER_BROADCAST    cpu_to_le16(0x0004) 
 | 
#define TYPHOON_RX_FILTER_PROMISCOUS    cpu_to_le16(0x0008) 
 | 
#define TYPHOON_RX_FILTER_MCAST_HASH    cpu_to_le16(0x0010) 
 | 
  
 | 
/* TYPHOON_CMD_READ_STATS response format 
 | 
 */ 
 | 
struct stats_resp { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    __le16 cmd; 
 | 
    __le16 seqNo; 
 | 
    __le16 unused; 
 | 
    __le32 txPackets; 
 | 
    __le64 txBytes; 
 | 
    __le32 txDeferred; 
 | 
    __le32 txLateCollisions; 
 | 
    __le32 txCollisions; 
 | 
    __le32 txCarrierLost; 
 | 
    __le32 txMultipleCollisions; 
 | 
    __le32 txExcessiveCollisions; 
 | 
    __le32 txFifoUnderruns; 
 | 
    __le32 txMulticastTxOverflows; 
 | 
    __le32 txFiltered; 
 | 
    __le32 rxPacketsGood; 
 | 
    __le64 rxBytesGood; 
 | 
    __le32 rxFifoOverruns; 
 | 
    __le32 BadSSD; 
 | 
    __le32 rxCrcErrors; 
 | 
    __le32 rxOversized; 
 | 
    __le32 rxBroadcast; 
 | 
    __le32 rxMulticast; 
 | 
    __le32 rxOverflow; 
 | 
    __le32 rxFiltered; 
 | 
    __le32 linkStatus; 
 | 
#define TYPHOON_LINK_STAT_MASK        cpu_to_le32(0x00000001) 
 | 
#define TYPHOON_LINK_GOOD        cpu_to_le32(0x00000001) 
 | 
#define TYPHOON_LINK_BAD        cpu_to_le32(0x00000000) 
 | 
#define TYPHOON_LINK_SPEED_MASK        cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_LINK_100MBPS        cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_LINK_10MBPS        cpu_to_le32(0x00000000) 
 | 
#define TYPHOON_LINK_DUPLEX_MASK    cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_LINK_FULL_DUPLEX    cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_LINK_HALF_DUPLEX    cpu_to_le32(0x00000000) 
 | 
    __le32 unused2; 
 | 
    __le32 unused3; 
 | 
} __packed; 
 | 
  
 | 
/* TYPHOON_CMD_XCVR_SELECT xcvr values (resp.parm1) 
 | 
 */ 
 | 
#define TYPHOON_XCVR_10HALF    cpu_to_le16(0x0000) 
 | 
#define TYPHOON_XCVR_10FULL    cpu_to_le16(0x0001) 
 | 
#define TYPHOON_XCVR_100HALF    cpu_to_le16(0x0002) 
 | 
#define TYPHOON_XCVR_100FULL    cpu_to_le16(0x0003) 
 | 
#define TYPHOON_XCVR_AUTONEG    cpu_to_le16(0x0004) 
 | 
  
 | 
/* TYPHOON_CMD_READ_MEDIA_STATUS (resp.parm1) 
 | 
 */ 
 | 
#define TYPHOON_MEDIA_STAT_CRC_STRIP_DISABLE    cpu_to_le16(0x0004) 
 | 
#define TYPHOON_MEDIA_STAT_COLLISION_DETECT    cpu_to_le16(0x0010) 
 | 
#define TYPHOON_MEDIA_STAT_CARRIER_SENSE    cpu_to_le16(0x0020) 
 | 
#define TYPHOON_MEDIA_STAT_POLARITY_REV        cpu_to_le16(0x0400) 
 | 
#define TYPHOON_MEDIA_STAT_NO_LINK        cpu_to_le16(0x0800) 
 | 
  
 | 
/* TYPHOON_CMD_SET_MULTICAST_HASH enable values (cmd.parm1) 
 | 
 */ 
 | 
#define TYPHOON_MCAST_HASH_DISABLE    cpu_to_le16(0x0000) 
 | 
#define TYPHOON_MCAST_HASH_ENABLE    cpu_to_le16(0x0001) 
 | 
#define TYPHOON_MCAST_HASH_SET        cpu_to_le16(0x0002) 
 | 
  
 | 
/* TYPHOON_CMD_CREATE_SA descriptor and settings 
 | 
 */ 
 | 
struct sa_descriptor { 
 | 
    u8  flags; 
 | 
    u8  numDesc; 
 | 
    u16 cmd; 
 | 
    u16 seqNo; 
 | 
    u16 mode; 
 | 
#define TYPHOON_SA_MODE_NULL        cpu_to_le16(0x0000) 
 | 
#define TYPHOON_SA_MODE_AH        cpu_to_le16(0x0001) 
 | 
#define TYPHOON_SA_MODE_ESP        cpu_to_le16(0x0002) 
 | 
    u8  hashFlags; 
 | 
#define TYPHOON_SA_HASH_ENABLE        0x01 
 | 
#define TYPHOON_SA_HASH_SHA1        0x02 
 | 
#define TYPHOON_SA_HASH_MD5        0x04 
 | 
    u8  direction; 
 | 
#define TYPHOON_SA_DIR_RX        0x00 
 | 
#define TYPHOON_SA_DIR_TX        0x01 
 | 
    u8  encryptionFlags; 
 | 
#define TYPHOON_SA_ENCRYPT_ENABLE    0x01 
 | 
#define TYPHOON_SA_ENCRYPT_DES        0x02 
 | 
#define TYPHOON_SA_ENCRYPT_3DES        0x00 
 | 
#define TYPHOON_SA_ENCRYPT_3DES_2KEY    0x00 
 | 
#define TYPHOON_SA_ENCRYPT_3DES_3KEY    0x04 
 | 
#define TYPHOON_SA_ENCRYPT_CBC        0x08 
 | 
#define TYPHOON_SA_ENCRYPT_ECB        0x00 
 | 
    u8  specifyIndex; 
 | 
#define TYPHOON_SA_SPECIFY_INDEX    0x01 
 | 
#define TYPHOON_SA_GENERATE_INDEX    0x00 
 | 
    u32 SPI; 
 | 
    u32 destAddr; 
 | 
    u32 destMask; 
 | 
    u8  integKey[20]; 
 | 
    u8  confKey[24]; 
 | 
    u32 index; 
 | 
    u32 unused; 
 | 
    u32 unused2; 
 | 
} __packed; 
 | 
  
 | 
/* TYPHOON_CMD_SET_OFFLOAD_TASKS bits (cmd.parm2 (Tx) & cmd.parm3 (Rx)) 
 | 
 * This is all for IPv4. 
 | 
 */ 
 | 
#define TYPHOON_OFFLOAD_TCP_CHKSUM    cpu_to_le32(0x00000002) 
 | 
#define TYPHOON_OFFLOAD_UDP_CHKSUM    cpu_to_le32(0x00000004) 
 | 
#define TYPHOON_OFFLOAD_IP_CHKSUM    cpu_to_le32(0x00000008) 
 | 
#define TYPHOON_OFFLOAD_IPSEC        cpu_to_le32(0x00000010) 
 | 
#define TYPHOON_OFFLOAD_BCAST_THROTTLE    cpu_to_le32(0x00000020) 
 | 
#define TYPHOON_OFFLOAD_DHCP_PREVENT    cpu_to_le32(0x00000040) 
 | 
#define TYPHOON_OFFLOAD_VLAN        cpu_to_le32(0x00000080) 
 | 
#define TYPHOON_OFFLOAD_FILTERING    cpu_to_le32(0x00000100) 
 | 
#define TYPHOON_OFFLOAD_TCP_SEGMENT    cpu_to_le32(0x00000200) 
 | 
  
 | 
/* TYPHOON_CMD_ENABLE_WAKE_EVENTS bits (cmd.parm1) 
 | 
 */ 
 | 
#define TYPHOON_WAKE_MAGIC_PKT        cpu_to_le16(0x01) 
 | 
#define TYPHOON_WAKE_LINK_EVENT        cpu_to_le16(0x02) 
 | 
#define TYPHOON_WAKE_ICMP_ECHO        cpu_to_le16(0x04) 
 | 
#define TYPHOON_WAKE_ARP        cpu_to_le16(0x08) 
 | 
  
 | 
/* These are used to load the firmware image on the NIC 
 | 
 */ 
 | 
struct typhoon_file_header { 
 | 
    u8  tag[8]; 
 | 
    __le32 version; 
 | 
    __le32 numSections; 
 | 
    __le32 startAddr; 
 | 
    __le32 hmacDigest[5]; 
 | 
} __packed; 
 | 
  
 | 
struct typhoon_section_header { 
 | 
    __le32 len; 
 | 
    u16 checksum; 
 | 
    u16 reserved; 
 | 
    __le32 startAddr; 
 | 
} __packed; 
 | 
  
 | 
/* The Typhoon Register offsets 
 | 
 */ 
 | 
#define TYPHOON_REG_SOFT_RESET            0x00 
 | 
#define TYPHOON_REG_INTR_STATUS            0x04 
 | 
#define TYPHOON_REG_INTR_ENABLE            0x08 
 | 
#define TYPHOON_REG_INTR_MASK            0x0c 
 | 
#define TYPHOON_REG_SELF_INTERRUPT        0x10 
 | 
#define TYPHOON_REG_HOST2ARM7            0x14 
 | 
#define TYPHOON_REG_HOST2ARM6            0x18 
 | 
#define TYPHOON_REG_HOST2ARM5            0x1c 
 | 
#define TYPHOON_REG_HOST2ARM4            0x20 
 | 
#define TYPHOON_REG_HOST2ARM3            0x24 
 | 
#define TYPHOON_REG_HOST2ARM2            0x28 
 | 
#define TYPHOON_REG_HOST2ARM1            0x2c 
 | 
#define TYPHOON_REG_HOST2ARM0            0x30 
 | 
#define TYPHOON_REG_ARM2HOST3            0x34 
 | 
#define TYPHOON_REG_ARM2HOST2            0x38 
 | 
#define TYPHOON_REG_ARM2HOST1            0x3c 
 | 
#define TYPHOON_REG_ARM2HOST0            0x40 
 | 
  
 | 
#define TYPHOON_REG_BOOT_DATA_LO        TYPHOON_REG_HOST2ARM5 
 | 
#define TYPHOON_REG_BOOT_DATA_HI        TYPHOON_REG_HOST2ARM4 
 | 
#define TYPHOON_REG_BOOT_DEST_ADDR        TYPHOON_REG_HOST2ARM3 
 | 
#define TYPHOON_REG_BOOT_CHECKSUM        TYPHOON_REG_HOST2ARM2 
 | 
#define TYPHOON_REG_BOOT_LENGTH            TYPHOON_REG_HOST2ARM1 
 | 
  
 | 
#define TYPHOON_REG_DOWNLOAD_BOOT_ADDR        TYPHOON_REG_HOST2ARM1 
 | 
#define TYPHOON_REG_DOWNLOAD_HMAC_0        TYPHOON_REG_HOST2ARM2 
 | 
#define TYPHOON_REG_DOWNLOAD_HMAC_1        TYPHOON_REG_HOST2ARM3 
 | 
#define TYPHOON_REG_DOWNLOAD_HMAC_2        TYPHOON_REG_HOST2ARM4 
 | 
#define TYPHOON_REG_DOWNLOAD_HMAC_3        TYPHOON_REG_HOST2ARM5 
 | 
#define TYPHOON_REG_DOWNLOAD_HMAC_4        TYPHOON_REG_HOST2ARM6 
 | 
  
 | 
#define TYPHOON_REG_BOOT_RECORD_ADDR_HI        TYPHOON_REG_HOST2ARM2 
 | 
#define TYPHOON_REG_BOOT_RECORD_ADDR_LO        TYPHOON_REG_HOST2ARM1 
 | 
  
 | 
#define TYPHOON_REG_TX_LO_READY            TYPHOON_REG_HOST2ARM3 
 | 
#define TYPHOON_REG_CMD_READY            TYPHOON_REG_HOST2ARM2 
 | 
#define TYPHOON_REG_TX_HI_READY            TYPHOON_REG_HOST2ARM1 
 | 
  
 | 
#define TYPHOON_REG_COMMAND            TYPHOON_REG_HOST2ARM0 
 | 
#define TYPHOON_REG_HEARTBEAT            TYPHOON_REG_ARM2HOST3 
 | 
#define TYPHOON_REG_STATUS            TYPHOON_REG_ARM2HOST0 
 | 
  
 | 
/* 3XP Reset values (TYPHOON_REG_SOFT_RESET) 
 | 
 */ 
 | 
#define TYPHOON_RESET_ALL    0x7f 
 | 
#define TYPHOON_RESET_NONE    0x00 
 | 
  
 | 
/* 3XP irq bits (TYPHOON_REG_INTR{STATUS,ENABLE,MASK}) 
 | 
 * 
 | 
 * Some of these came from OpenBSD, as the 3Com docs have it wrong 
 | 
 * (INTR_SELF) or don't list it at all (INTR_*_ABORT) 
 | 
 * 
 | 
 * Enabling irqs on the Heartbeat reg (ArmToHost3) gets you an irq 
 | 
 * about every 8ms, so don't do it. 
 | 
 */ 
 | 
#define TYPHOON_INTR_HOST_INT        0x00000001 
 | 
#define TYPHOON_INTR_ARM2HOST0        0x00000002 
 | 
#define TYPHOON_INTR_ARM2HOST1        0x00000004 
 | 
#define TYPHOON_INTR_ARM2HOST2        0x00000008 
 | 
#define TYPHOON_INTR_ARM2HOST3        0x00000010 
 | 
#define TYPHOON_INTR_DMA0        0x00000020 
 | 
#define TYPHOON_INTR_DMA1        0x00000040 
 | 
#define TYPHOON_INTR_DMA2        0x00000080 
 | 
#define TYPHOON_INTR_DMA3        0x00000100 
 | 
#define TYPHOON_INTR_MASTER_ABORT    0x00000200 
 | 
#define TYPHOON_INTR_TARGET_ABORT    0x00000400 
 | 
#define TYPHOON_INTR_SELF        0x00000800 
 | 
#define TYPHOON_INTR_RESERVED        0xfffff000 
 | 
  
 | 
#define TYPHOON_INTR_BOOTCMD        TYPHOON_INTR_ARM2HOST0 
 | 
  
 | 
#define TYPHOON_INTR_ENABLE_ALL        0xffffffef 
 | 
#define TYPHOON_INTR_ALL        0xffffffff 
 | 
#define TYPHOON_INTR_NONE        0x00000000 
 | 
  
 | 
/* The commands for the 3XP chip (TYPHOON_REG_COMMAND) 
 | 
 */ 
 | 
#define TYPHOON_BOOTCMD_BOOT            0x00 
 | 
#define TYPHOON_BOOTCMD_WAKEUP            0xfa 
 | 
#define TYPHOON_BOOTCMD_DNLD_COMPLETE        0xfb 
 | 
#define TYPHOON_BOOTCMD_SEG_AVAILABLE        0xfc 
 | 
#define TYPHOON_BOOTCMD_RUNTIME_IMAGE        0xfd 
 | 
#define TYPHOON_BOOTCMD_REG_BOOT_RECORD        0xff 
 | 
  
 | 
/* 3XP Status values (TYPHOON_REG_STATUS) 
 | 
 */ 
 | 
#define TYPHOON_STATUS_WAITING_FOR_BOOT        0x07 
 | 
#define TYPHOON_STATUS_SECOND_INIT        0x08 
 | 
#define TYPHOON_STATUS_RUNNING            0x09 
 | 
#define TYPHOON_STATUS_WAITING_FOR_HOST        0x0d 
 | 
#define TYPHOON_STATUS_WAITING_FOR_SEGMENT    0x10 
 | 
#define TYPHOON_STATUS_SLEEPING            0x11 
 | 
#define TYPHOON_STATUS_HALTED            0x14 
 |