1*4882a593Smuzhiyun /* typhoon.h: chip info for the 3Com 3CR990 family of controllers */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun Written 2002-2003 by David Dillow <dave@thedillows.org> 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun This software may be used and distributed according to the terms of 6*4882a593Smuzhiyun the GNU General Public License (GPL), incorporated herein by reference. 7*4882a593Smuzhiyun Drivers based on or derived from this code fall under the GPL and must 8*4882a593Smuzhiyun retain the authorship, copyright and license notice. This file is not 9*4882a593Smuzhiyun a complete program and may only be used when the entire operating 10*4882a593Smuzhiyun system is licensed under the GPL. 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun This software is available on a public web site. It may enable 13*4882a593Smuzhiyun cryptographic capabilities of the 3Com hardware, and may be 14*4882a593Smuzhiyun exported from the United States under License Exception "TSU" 15*4882a593Smuzhiyun pursuant to 15 C.F.R. Section 740.13(e). 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun This work was funded by the National Library of Medicine under 18*4882a593Smuzhiyun the Department of Energy project number 0274DD06D1 and NLM project 19*4882a593Smuzhiyun number Y1-LM-2015-01. 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* All Typhoon ring positions are specificed in bytes, and point to the 23*4882a593Smuzhiyun * first "clean" entry in the ring -- ie the next entry we use for whatever 24*4882a593Smuzhiyun * purpose. 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* The Typhoon basic ring 28*4882a593Smuzhiyun * ringBase: where this ring lives (our virtual address) 29*4882a593Smuzhiyun * lastWrite: the next entry we'll use 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun struct basic_ring { 32*4882a593Smuzhiyun u8 *ringBase; 33*4882a593Smuzhiyun u32 lastWrite; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* The Typhoon transmit ring -- same as a basic ring, plus: 37*4882a593Smuzhiyun * lastRead: where we're at in regard to cleaning up the ring 38*4882a593Smuzhiyun * writeRegister: register to use for writing (different for Hi & Lo rings) 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun struct transmit_ring { 41*4882a593Smuzhiyun u8 *ringBase; 42*4882a593Smuzhiyun u32 lastWrite; 43*4882a593Smuzhiyun u32 lastRead; 44*4882a593Smuzhiyun int writeRegister; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* The host<->Typhoon ring index structure 48*4882a593Smuzhiyun * This indicates the current positions in the rings 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * All values must be in little endian format for the 3XP 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun * rxHiCleared: entry we've cleared to in the Hi receive ring 53*4882a593Smuzhiyun * rxLoCleared: entry we've cleared to in the Lo receive ring 54*4882a593Smuzhiyun * rxBuffReady: next entry we'll put a free buffer in 55*4882a593Smuzhiyun * respCleared: entry we've cleared to in the response ring 56*4882a593Smuzhiyun * 57*4882a593Smuzhiyun * txLoCleared: entry the NIC has cleared to in the Lo transmit ring 58*4882a593Smuzhiyun * txHiCleared: entry the NIC has cleared to in the Hi transmit ring 59*4882a593Smuzhiyun * rxLoReady: entry the NIC has filled to in the Lo receive ring 60*4882a593Smuzhiyun * rxBuffCleared: entry the NIC has cleared in the free buffer ring 61*4882a593Smuzhiyun * cmdCleared: entry the NIC has cleared in the command ring 62*4882a593Smuzhiyun * respReady: entry the NIC has filled to in the response ring 63*4882a593Smuzhiyun * rxHiReady: entry the NIC has filled to in the Hi receive ring 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun struct typhoon_indexes { 66*4882a593Smuzhiyun /* The first four are written by the host, and read by the NIC */ 67*4882a593Smuzhiyun volatile __le32 rxHiCleared; 68*4882a593Smuzhiyun volatile __le32 rxLoCleared; 69*4882a593Smuzhiyun volatile __le32 rxBuffReady; 70*4882a593Smuzhiyun volatile __le32 respCleared; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* The remaining are written by the NIC, and read by the host */ 73*4882a593Smuzhiyun volatile __le32 txLoCleared; 74*4882a593Smuzhiyun volatile __le32 txHiCleared; 75*4882a593Smuzhiyun volatile __le32 rxLoReady; 76*4882a593Smuzhiyun volatile __le32 rxBuffCleared; 77*4882a593Smuzhiyun volatile __le32 cmdCleared; 78*4882a593Smuzhiyun volatile __le32 respReady; 79*4882a593Smuzhiyun volatile __le32 rxHiReady; 80*4882a593Smuzhiyun } __packed; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* The host<->Typhoon interface 83*4882a593Smuzhiyun * Our means of communicating where things are 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * All values must be in little endian format for the 3XP 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * ringIndex: 64 bit bus address of the index structure 88*4882a593Smuzhiyun * txLoAddr: 64 bit bus address of the Lo transmit ring 89*4882a593Smuzhiyun * txLoSize: size (in bytes) of the Lo transmit ring 90*4882a593Smuzhiyun * txHi*: as above for the Hi priority transmit ring 91*4882a593Smuzhiyun * rxLo*: as above for the Lo priority receive ring 92*4882a593Smuzhiyun * rxBuff*: as above for the free buffer ring 93*4882a593Smuzhiyun * cmd*: as above for the command ring 94*4882a593Smuzhiyun * resp*: as above for the response ring 95*4882a593Smuzhiyun * zeroAddr: 64 bit bus address of a zero word (for DMA) 96*4882a593Smuzhiyun * rxHi*: as above for the Hi Priority receive ring 97*4882a593Smuzhiyun * 98*4882a593Smuzhiyun * While there is room for 64 bit addresses, current versions of the 3XP 99*4882a593Smuzhiyun * only do 32 bit addresses, so the *Hi for each of the above will always 100*4882a593Smuzhiyun * be zero. 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun struct typhoon_interface { 103*4882a593Smuzhiyun __le32 ringIndex; 104*4882a593Smuzhiyun __le32 ringIndexHi; 105*4882a593Smuzhiyun __le32 txLoAddr; 106*4882a593Smuzhiyun __le32 txLoAddrHi; 107*4882a593Smuzhiyun __le32 txLoSize; 108*4882a593Smuzhiyun __le32 txHiAddr; 109*4882a593Smuzhiyun __le32 txHiAddrHi; 110*4882a593Smuzhiyun __le32 txHiSize; 111*4882a593Smuzhiyun __le32 rxLoAddr; 112*4882a593Smuzhiyun __le32 rxLoAddrHi; 113*4882a593Smuzhiyun __le32 rxLoSize; 114*4882a593Smuzhiyun __le32 rxBuffAddr; 115*4882a593Smuzhiyun __le32 rxBuffAddrHi; 116*4882a593Smuzhiyun __le32 rxBuffSize; 117*4882a593Smuzhiyun __le32 cmdAddr; 118*4882a593Smuzhiyun __le32 cmdAddrHi; 119*4882a593Smuzhiyun __le32 cmdSize; 120*4882a593Smuzhiyun __le32 respAddr; 121*4882a593Smuzhiyun __le32 respAddrHi; 122*4882a593Smuzhiyun __le32 respSize; 123*4882a593Smuzhiyun __le32 zeroAddr; 124*4882a593Smuzhiyun __le32 zeroAddrHi; 125*4882a593Smuzhiyun __le32 rxHiAddr; 126*4882a593Smuzhiyun __le32 rxHiAddrHi; 127*4882a593Smuzhiyun __le32 rxHiSize; 128*4882a593Smuzhiyun } __packed; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* The Typhoon transmit/fragment descriptor 131*4882a593Smuzhiyun * 132*4882a593Smuzhiyun * A packet is described by a packet descriptor, followed by option descriptors, 133*4882a593Smuzhiyun * if any, then one or more fragment descriptors. 134*4882a593Smuzhiyun * 135*4882a593Smuzhiyun * Packet descriptor: 136*4882a593Smuzhiyun * flags: Descriptor type 137*4882a593Smuzhiyun * len:i zero, or length of this packet 138*4882a593Smuzhiyun * addr*: 8 bytes of opaque data to the firmware -- for skb pointer 139*4882a593Smuzhiyun * processFlags: Determine offload tasks to perform on this packet. 140*4882a593Smuzhiyun * 141*4882a593Smuzhiyun * Fragment descriptor: 142*4882a593Smuzhiyun * flags: Descriptor type 143*4882a593Smuzhiyun * len:i length of this fragment 144*4882a593Smuzhiyun * addr: low bytes of DMA address for this part of the packet 145*4882a593Smuzhiyun * addrHi: hi bytes of DMA address for this part of the packet 146*4882a593Smuzhiyun * processFlags: must be zero 147*4882a593Smuzhiyun * 148*4882a593Smuzhiyun * TYPHOON_DESC_VALID is not mentioned in their docs, but their Linux 149*4882a593Smuzhiyun * driver uses it. 150*4882a593Smuzhiyun */ 151*4882a593Smuzhiyun struct tx_desc { 152*4882a593Smuzhiyun u8 flags; 153*4882a593Smuzhiyun #define TYPHOON_TYPE_MASK 0x07 154*4882a593Smuzhiyun #define TYPHOON_FRAG_DESC 0x00 155*4882a593Smuzhiyun #define TYPHOON_TX_DESC 0x01 156*4882a593Smuzhiyun #define TYPHOON_CMD_DESC 0x02 157*4882a593Smuzhiyun #define TYPHOON_OPT_DESC 0x03 158*4882a593Smuzhiyun #define TYPHOON_RX_DESC 0x04 159*4882a593Smuzhiyun #define TYPHOON_RESP_DESC 0x05 160*4882a593Smuzhiyun #define TYPHOON_OPT_TYPE_MASK 0xf0 161*4882a593Smuzhiyun #define TYPHOON_OPT_IPSEC 0x00 162*4882a593Smuzhiyun #define TYPHOON_OPT_TCP_SEG 0x10 163*4882a593Smuzhiyun #define TYPHOON_CMD_RESPOND 0x40 164*4882a593Smuzhiyun #define TYPHOON_RESP_ERROR 0x40 165*4882a593Smuzhiyun #define TYPHOON_RX_ERROR 0x40 166*4882a593Smuzhiyun #define TYPHOON_DESC_VALID 0x80 167*4882a593Smuzhiyun u8 numDesc; 168*4882a593Smuzhiyun __le16 len; 169*4882a593Smuzhiyun union { 170*4882a593Smuzhiyun struct { 171*4882a593Smuzhiyun __le32 addr; 172*4882a593Smuzhiyun __le32 addrHi; 173*4882a593Smuzhiyun } frag; 174*4882a593Smuzhiyun u64 tx_addr; /* opaque for hardware, for TX_DESC */ 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun __le32 processFlags; 177*4882a593Smuzhiyun #define TYPHOON_TX_PF_NO_CRC cpu_to_le32(0x00000001) 178*4882a593Smuzhiyun #define TYPHOON_TX_PF_IP_CHKSUM cpu_to_le32(0x00000002) 179*4882a593Smuzhiyun #define TYPHOON_TX_PF_TCP_CHKSUM cpu_to_le32(0x00000004) 180*4882a593Smuzhiyun #define TYPHOON_TX_PF_TCP_SEGMENT cpu_to_le32(0x00000008) 181*4882a593Smuzhiyun #define TYPHOON_TX_PF_INSERT_VLAN cpu_to_le32(0x00000010) 182*4882a593Smuzhiyun #define TYPHOON_TX_PF_IPSEC cpu_to_le32(0x00000020) 183*4882a593Smuzhiyun #define TYPHOON_TX_PF_VLAN_PRIORITY cpu_to_le32(0x00000040) 184*4882a593Smuzhiyun #define TYPHOON_TX_PF_UDP_CHKSUM cpu_to_le32(0x00000080) 185*4882a593Smuzhiyun #define TYPHOON_TX_PF_PAD_FRAME cpu_to_le32(0x00000100) 186*4882a593Smuzhiyun #define TYPHOON_TX_PF_RESERVED cpu_to_le32(0x00000e00) 187*4882a593Smuzhiyun #define TYPHOON_TX_PF_VLAN_MASK cpu_to_le32(0x0ffff000) 188*4882a593Smuzhiyun #define TYPHOON_TX_PF_INTERNAL cpu_to_le32(0xf0000000) 189*4882a593Smuzhiyun #define TYPHOON_TX_PF_VLAN_TAG_SHIFT 12 190*4882a593Smuzhiyun } __packed; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* The TCP Segmentation offload option descriptor 193*4882a593Smuzhiyun * 194*4882a593Smuzhiyun * flags: descriptor type 195*4882a593Smuzhiyun * numDesc: must be 1 196*4882a593Smuzhiyun * mss_flags: bits 0-11 (little endian) are MSS, 12 is first TSO descriptor 197*4882a593Smuzhiyun * 13 is list TSO descriptor, set both if only one TSO 198*4882a593Smuzhiyun * respAddrLo: low bytes of address of the bytesTx field of this descriptor 199*4882a593Smuzhiyun * bytesTx: total number of bytes in this TSO request 200*4882a593Smuzhiyun * status: 0 on completion 201*4882a593Smuzhiyun */ 202*4882a593Smuzhiyun struct tcpopt_desc { 203*4882a593Smuzhiyun u8 flags; 204*4882a593Smuzhiyun u8 numDesc; 205*4882a593Smuzhiyun __le16 mss_flags; 206*4882a593Smuzhiyun #define TYPHOON_TSO_FIRST cpu_to_le16(0x1000) 207*4882a593Smuzhiyun #define TYPHOON_TSO_LAST cpu_to_le16(0x2000) 208*4882a593Smuzhiyun __le32 respAddrLo; 209*4882a593Smuzhiyun __le32 bytesTx; 210*4882a593Smuzhiyun __le32 status; 211*4882a593Smuzhiyun } __packed; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* The IPSEC Offload descriptor 214*4882a593Smuzhiyun * 215*4882a593Smuzhiyun * flags: descriptor type 216*4882a593Smuzhiyun * numDesc: must be 1 217*4882a593Smuzhiyun * ipsecFlags: bit 0: 0 -- generate IV, 1 -- use supplied IV 218*4882a593Smuzhiyun * sa1, sa2: Security Association IDs for this packet 219*4882a593Smuzhiyun * reserved: set to 0 220*4882a593Smuzhiyun */ 221*4882a593Smuzhiyun struct ipsec_desc { 222*4882a593Smuzhiyun u8 flags; 223*4882a593Smuzhiyun u8 numDesc; 224*4882a593Smuzhiyun __le16 ipsecFlags; 225*4882a593Smuzhiyun #define TYPHOON_IPSEC_GEN_IV cpu_to_le16(0x0000) 226*4882a593Smuzhiyun #define TYPHOON_IPSEC_USE_IV cpu_to_le16(0x0001) 227*4882a593Smuzhiyun __le32 sa1; 228*4882a593Smuzhiyun __le32 sa2; 229*4882a593Smuzhiyun __le32 reserved; 230*4882a593Smuzhiyun } __packed; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* The Typhoon receive descriptor (Updated by NIC) 233*4882a593Smuzhiyun * 234*4882a593Smuzhiyun * flags: Descriptor type, error indication 235*4882a593Smuzhiyun * numDesc: Always zero 236*4882a593Smuzhiyun * frameLen: the size of the packet received 237*4882a593Smuzhiyun * addr: low 32 bytes of the virtual addr passed in for this buffer 238*4882a593Smuzhiyun * addrHi: high 32 bytes of the virtual addr passed in for this buffer 239*4882a593Smuzhiyun * rxStatus: Error if set in flags, otherwise result of offload processing 240*4882a593Smuzhiyun * filterResults: results of filtering on packet, not used 241*4882a593Smuzhiyun * ipsecResults: Results of IPSEC processing 242*4882a593Smuzhiyun * vlanTag: the 801.2q TCI from the packet 243*4882a593Smuzhiyun */ 244*4882a593Smuzhiyun struct rx_desc { 245*4882a593Smuzhiyun u8 flags; 246*4882a593Smuzhiyun u8 numDesc; 247*4882a593Smuzhiyun __le16 frameLen; 248*4882a593Smuzhiyun u32 addr; /* opaque, comes from virtAddr */ 249*4882a593Smuzhiyun u32 addrHi; /* opaque, comes from virtAddrHi */ 250*4882a593Smuzhiyun __le32 rxStatus; 251*4882a593Smuzhiyun #define TYPHOON_RX_ERR_INTERNAL cpu_to_le32(0x00000000) 252*4882a593Smuzhiyun #define TYPHOON_RX_ERR_FIFO_UNDERRUN cpu_to_le32(0x00000001) 253*4882a593Smuzhiyun #define TYPHOON_RX_ERR_BAD_SSD cpu_to_le32(0x00000002) 254*4882a593Smuzhiyun #define TYPHOON_RX_ERR_RUNT cpu_to_le32(0x00000003) 255*4882a593Smuzhiyun #define TYPHOON_RX_ERR_CRC cpu_to_le32(0x00000004) 256*4882a593Smuzhiyun #define TYPHOON_RX_ERR_OVERSIZE cpu_to_le32(0x00000005) 257*4882a593Smuzhiyun #define TYPHOON_RX_ERR_ALIGN cpu_to_le32(0x00000006) 258*4882a593Smuzhiyun #define TYPHOON_RX_ERR_DRIBBLE cpu_to_le32(0x00000007) 259*4882a593Smuzhiyun #define TYPHOON_RX_PROTO_MASK cpu_to_le32(0x00000003) 260*4882a593Smuzhiyun #define TYPHOON_RX_PROTO_UNKNOWN cpu_to_le32(0x00000000) 261*4882a593Smuzhiyun #define TYPHOON_RX_PROTO_IP cpu_to_le32(0x00000001) 262*4882a593Smuzhiyun #define TYPHOON_RX_PROTO_IPX cpu_to_le32(0x00000002) 263*4882a593Smuzhiyun #define TYPHOON_RX_VLAN cpu_to_le32(0x00000004) 264*4882a593Smuzhiyun #define TYPHOON_RX_IP_FRAG cpu_to_le32(0x00000008) 265*4882a593Smuzhiyun #define TYPHOON_RX_IPSEC cpu_to_le32(0x00000010) 266*4882a593Smuzhiyun #define TYPHOON_RX_IP_CHK_FAIL cpu_to_le32(0x00000020) 267*4882a593Smuzhiyun #define TYPHOON_RX_TCP_CHK_FAIL cpu_to_le32(0x00000040) 268*4882a593Smuzhiyun #define TYPHOON_RX_UDP_CHK_FAIL cpu_to_le32(0x00000080) 269*4882a593Smuzhiyun #define TYPHOON_RX_IP_CHK_GOOD cpu_to_le32(0x00000100) 270*4882a593Smuzhiyun #define TYPHOON_RX_TCP_CHK_GOOD cpu_to_le32(0x00000200) 271*4882a593Smuzhiyun #define TYPHOON_RX_UDP_CHK_GOOD cpu_to_le32(0x00000400) 272*4882a593Smuzhiyun __le16 filterResults; 273*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_MASK cpu_to_le16(0x7fff) 274*4882a593Smuzhiyun #define TYPHOON_RX_FILTERED cpu_to_le16(0x8000) 275*4882a593Smuzhiyun __le16 ipsecResults; 276*4882a593Smuzhiyun #define TYPHOON_RX_OUTER_AH_GOOD cpu_to_le16(0x0001) 277*4882a593Smuzhiyun #define TYPHOON_RX_OUTER_ESP_GOOD cpu_to_le16(0x0002) 278*4882a593Smuzhiyun #define TYPHOON_RX_INNER_AH_GOOD cpu_to_le16(0x0004) 279*4882a593Smuzhiyun #define TYPHOON_RX_INNER_ESP_GOOD cpu_to_le16(0x0008) 280*4882a593Smuzhiyun #define TYPHOON_RX_OUTER_AH_FAIL cpu_to_le16(0x0010) 281*4882a593Smuzhiyun #define TYPHOON_RX_OUTER_ESP_FAIL cpu_to_le16(0x0020) 282*4882a593Smuzhiyun #define TYPHOON_RX_INNER_AH_FAIL cpu_to_le16(0x0040) 283*4882a593Smuzhiyun #define TYPHOON_RX_INNER_ESP_FAIL cpu_to_le16(0x0080) 284*4882a593Smuzhiyun #define TYPHOON_RX_UNKNOWN_SA cpu_to_le16(0x0100) 285*4882a593Smuzhiyun #define TYPHOON_RX_ESP_FORMAT_ERR cpu_to_le16(0x0200) 286*4882a593Smuzhiyun __be32 vlanTag; 287*4882a593Smuzhiyun } __packed; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* The Typhoon free buffer descriptor, used to give a buffer to the NIC 290*4882a593Smuzhiyun * 291*4882a593Smuzhiyun * physAddr: low 32 bits of the bus address of the buffer 292*4882a593Smuzhiyun * physAddrHi: high 32 bits of the bus address of the buffer, always zero 293*4882a593Smuzhiyun * virtAddr: low 32 bits of the skb address 294*4882a593Smuzhiyun * virtAddrHi: high 32 bits of the skb address, always zero 295*4882a593Smuzhiyun * 296*4882a593Smuzhiyun * the virt* address is basically two 32 bit cookies, just passed back 297*4882a593Smuzhiyun * from the NIC 298*4882a593Smuzhiyun */ 299*4882a593Smuzhiyun struct rx_free { 300*4882a593Smuzhiyun __le32 physAddr; 301*4882a593Smuzhiyun __le32 physAddrHi; 302*4882a593Smuzhiyun u32 virtAddr; 303*4882a593Smuzhiyun u32 virtAddrHi; 304*4882a593Smuzhiyun } __packed; 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun /* The Typhoon command descriptor, used for commands and responses 307*4882a593Smuzhiyun * 308*4882a593Smuzhiyun * flags: descriptor type 309*4882a593Smuzhiyun * numDesc: number of descriptors following in this command/response, 310*4882a593Smuzhiyun * ie, zero for a one descriptor command 311*4882a593Smuzhiyun * cmd: the command 312*4882a593Smuzhiyun * seqNo: sequence number (unused) 313*4882a593Smuzhiyun * parm1: use varies by command 314*4882a593Smuzhiyun * parm2: use varies by command 315*4882a593Smuzhiyun * parm3: use varies by command 316*4882a593Smuzhiyun */ 317*4882a593Smuzhiyun struct cmd_desc { 318*4882a593Smuzhiyun u8 flags; 319*4882a593Smuzhiyun u8 numDesc; 320*4882a593Smuzhiyun __le16 cmd; 321*4882a593Smuzhiyun #define TYPHOON_CMD_TX_ENABLE cpu_to_le16(0x0001) 322*4882a593Smuzhiyun #define TYPHOON_CMD_TX_DISABLE cpu_to_le16(0x0002) 323*4882a593Smuzhiyun #define TYPHOON_CMD_RX_ENABLE cpu_to_le16(0x0003) 324*4882a593Smuzhiyun #define TYPHOON_CMD_RX_DISABLE cpu_to_le16(0x0004) 325*4882a593Smuzhiyun #define TYPHOON_CMD_SET_RX_FILTER cpu_to_le16(0x0005) 326*4882a593Smuzhiyun #define TYPHOON_CMD_READ_STATS cpu_to_le16(0x0007) 327*4882a593Smuzhiyun #define TYPHOON_CMD_XCVR_SELECT cpu_to_le16(0x0013) 328*4882a593Smuzhiyun #define TYPHOON_CMD_SET_MAX_PKT_SIZE cpu_to_le16(0x001a) 329*4882a593Smuzhiyun #define TYPHOON_CMD_READ_MEDIA_STATUS cpu_to_le16(0x001b) 330*4882a593Smuzhiyun #define TYPHOON_CMD_GOTO_SLEEP cpu_to_le16(0x0023) 331*4882a593Smuzhiyun #define TYPHOON_CMD_SET_MULTICAST_HASH cpu_to_le16(0x0025) 332*4882a593Smuzhiyun #define TYPHOON_CMD_SET_MAC_ADDRESS cpu_to_le16(0x0026) 333*4882a593Smuzhiyun #define TYPHOON_CMD_READ_MAC_ADDRESS cpu_to_le16(0x0027) 334*4882a593Smuzhiyun #define TYPHOON_CMD_VLAN_TYPE_WRITE cpu_to_le16(0x002b) 335*4882a593Smuzhiyun #define TYPHOON_CMD_CREATE_SA cpu_to_le16(0x0034) 336*4882a593Smuzhiyun #define TYPHOON_CMD_DELETE_SA cpu_to_le16(0x0035) 337*4882a593Smuzhiyun #define TYPHOON_CMD_READ_VERSIONS cpu_to_le16(0x0043) 338*4882a593Smuzhiyun #define TYPHOON_CMD_IRQ_COALESCE_CTRL cpu_to_le16(0x0045) 339*4882a593Smuzhiyun #define TYPHOON_CMD_ENABLE_WAKE_EVENTS cpu_to_le16(0x0049) 340*4882a593Smuzhiyun #define TYPHOON_CMD_SET_OFFLOAD_TASKS cpu_to_le16(0x004f) 341*4882a593Smuzhiyun #define TYPHOON_CMD_HELLO_RESP cpu_to_le16(0x0057) 342*4882a593Smuzhiyun #define TYPHOON_CMD_HALT cpu_to_le16(0x005d) 343*4882a593Smuzhiyun #define TYPHOON_CMD_READ_IPSEC_INFO cpu_to_le16(0x005e) 344*4882a593Smuzhiyun #define TYPHOON_CMD_GET_IPSEC_ENABLE cpu_to_le16(0x0067) 345*4882a593Smuzhiyun #define TYPHOON_CMD_GET_CMD_LVL cpu_to_le16(0x0069) 346*4882a593Smuzhiyun u16 seqNo; 347*4882a593Smuzhiyun __le16 parm1; 348*4882a593Smuzhiyun __le32 parm2; 349*4882a593Smuzhiyun __le32 parm3; 350*4882a593Smuzhiyun } __packed; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* The Typhoon response descriptor, see command descriptor for details 353*4882a593Smuzhiyun */ 354*4882a593Smuzhiyun struct resp_desc { 355*4882a593Smuzhiyun u8 flags; 356*4882a593Smuzhiyun u8 numDesc; 357*4882a593Smuzhiyun __le16 cmd; 358*4882a593Smuzhiyun __le16 seqNo; 359*4882a593Smuzhiyun __le16 parm1; 360*4882a593Smuzhiyun __le32 parm2; 361*4882a593Smuzhiyun __le32 parm3; 362*4882a593Smuzhiyun } __packed; 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun #define INIT_COMMAND_NO_RESPONSE(x, command) \ 365*4882a593Smuzhiyun do { struct cmd_desc *_ptr = (x); \ 366*4882a593Smuzhiyun memset(_ptr, 0, sizeof(struct cmd_desc)); \ 367*4882a593Smuzhiyun _ptr->flags = TYPHOON_CMD_DESC | TYPHOON_DESC_VALID; \ 368*4882a593Smuzhiyun _ptr->cmd = command; \ 369*4882a593Smuzhiyun } while (0) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun /* We set seqNo to 1 if we're expecting a response from this command */ 372*4882a593Smuzhiyun #define INIT_COMMAND_WITH_RESPONSE(x, command) \ 373*4882a593Smuzhiyun do { struct cmd_desc *_ptr = (x); \ 374*4882a593Smuzhiyun memset(_ptr, 0, sizeof(struct cmd_desc)); \ 375*4882a593Smuzhiyun _ptr->flags = TYPHOON_CMD_RESPOND | TYPHOON_CMD_DESC; \ 376*4882a593Smuzhiyun _ptr->flags |= TYPHOON_DESC_VALID; \ 377*4882a593Smuzhiyun _ptr->cmd = command; \ 378*4882a593Smuzhiyun _ptr->seqNo = 1; \ 379*4882a593Smuzhiyun } while (0) 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* TYPHOON_CMD_SET_RX_FILTER filter bits (cmd.parm1) 382*4882a593Smuzhiyun */ 383*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_DIRECTED cpu_to_le16(0x0001) 384*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_ALL_MCAST cpu_to_le16(0x0002) 385*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_BROADCAST cpu_to_le16(0x0004) 386*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_PROMISCOUS cpu_to_le16(0x0008) 387*4882a593Smuzhiyun #define TYPHOON_RX_FILTER_MCAST_HASH cpu_to_le16(0x0010) 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* TYPHOON_CMD_READ_STATS response format 390*4882a593Smuzhiyun */ 391*4882a593Smuzhiyun struct stats_resp { 392*4882a593Smuzhiyun u8 flags; 393*4882a593Smuzhiyun u8 numDesc; 394*4882a593Smuzhiyun __le16 cmd; 395*4882a593Smuzhiyun __le16 seqNo; 396*4882a593Smuzhiyun __le16 unused; 397*4882a593Smuzhiyun __le32 txPackets; 398*4882a593Smuzhiyun __le64 txBytes; 399*4882a593Smuzhiyun __le32 txDeferred; 400*4882a593Smuzhiyun __le32 txLateCollisions; 401*4882a593Smuzhiyun __le32 txCollisions; 402*4882a593Smuzhiyun __le32 txCarrierLost; 403*4882a593Smuzhiyun __le32 txMultipleCollisions; 404*4882a593Smuzhiyun __le32 txExcessiveCollisions; 405*4882a593Smuzhiyun __le32 txFifoUnderruns; 406*4882a593Smuzhiyun __le32 txMulticastTxOverflows; 407*4882a593Smuzhiyun __le32 txFiltered; 408*4882a593Smuzhiyun __le32 rxPacketsGood; 409*4882a593Smuzhiyun __le64 rxBytesGood; 410*4882a593Smuzhiyun __le32 rxFifoOverruns; 411*4882a593Smuzhiyun __le32 BadSSD; 412*4882a593Smuzhiyun __le32 rxCrcErrors; 413*4882a593Smuzhiyun __le32 rxOversized; 414*4882a593Smuzhiyun __le32 rxBroadcast; 415*4882a593Smuzhiyun __le32 rxMulticast; 416*4882a593Smuzhiyun __le32 rxOverflow; 417*4882a593Smuzhiyun __le32 rxFiltered; 418*4882a593Smuzhiyun __le32 linkStatus; 419*4882a593Smuzhiyun #define TYPHOON_LINK_STAT_MASK cpu_to_le32(0x00000001) 420*4882a593Smuzhiyun #define TYPHOON_LINK_GOOD cpu_to_le32(0x00000001) 421*4882a593Smuzhiyun #define TYPHOON_LINK_BAD cpu_to_le32(0x00000000) 422*4882a593Smuzhiyun #define TYPHOON_LINK_SPEED_MASK cpu_to_le32(0x00000002) 423*4882a593Smuzhiyun #define TYPHOON_LINK_100MBPS cpu_to_le32(0x00000002) 424*4882a593Smuzhiyun #define TYPHOON_LINK_10MBPS cpu_to_le32(0x00000000) 425*4882a593Smuzhiyun #define TYPHOON_LINK_DUPLEX_MASK cpu_to_le32(0x00000004) 426*4882a593Smuzhiyun #define TYPHOON_LINK_FULL_DUPLEX cpu_to_le32(0x00000004) 427*4882a593Smuzhiyun #define TYPHOON_LINK_HALF_DUPLEX cpu_to_le32(0x00000000) 428*4882a593Smuzhiyun __le32 unused2; 429*4882a593Smuzhiyun __le32 unused3; 430*4882a593Smuzhiyun } __packed; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* TYPHOON_CMD_XCVR_SELECT xcvr values (resp.parm1) 433*4882a593Smuzhiyun */ 434*4882a593Smuzhiyun #define TYPHOON_XCVR_10HALF cpu_to_le16(0x0000) 435*4882a593Smuzhiyun #define TYPHOON_XCVR_10FULL cpu_to_le16(0x0001) 436*4882a593Smuzhiyun #define TYPHOON_XCVR_100HALF cpu_to_le16(0x0002) 437*4882a593Smuzhiyun #define TYPHOON_XCVR_100FULL cpu_to_le16(0x0003) 438*4882a593Smuzhiyun #define TYPHOON_XCVR_AUTONEG cpu_to_le16(0x0004) 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun /* TYPHOON_CMD_READ_MEDIA_STATUS (resp.parm1) 441*4882a593Smuzhiyun */ 442*4882a593Smuzhiyun #define TYPHOON_MEDIA_STAT_CRC_STRIP_DISABLE cpu_to_le16(0x0004) 443*4882a593Smuzhiyun #define TYPHOON_MEDIA_STAT_COLLISION_DETECT cpu_to_le16(0x0010) 444*4882a593Smuzhiyun #define TYPHOON_MEDIA_STAT_CARRIER_SENSE cpu_to_le16(0x0020) 445*4882a593Smuzhiyun #define TYPHOON_MEDIA_STAT_POLARITY_REV cpu_to_le16(0x0400) 446*4882a593Smuzhiyun #define TYPHOON_MEDIA_STAT_NO_LINK cpu_to_le16(0x0800) 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun /* TYPHOON_CMD_SET_MULTICAST_HASH enable values (cmd.parm1) 449*4882a593Smuzhiyun */ 450*4882a593Smuzhiyun #define TYPHOON_MCAST_HASH_DISABLE cpu_to_le16(0x0000) 451*4882a593Smuzhiyun #define TYPHOON_MCAST_HASH_ENABLE cpu_to_le16(0x0001) 452*4882a593Smuzhiyun #define TYPHOON_MCAST_HASH_SET cpu_to_le16(0x0002) 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* TYPHOON_CMD_CREATE_SA descriptor and settings 455*4882a593Smuzhiyun */ 456*4882a593Smuzhiyun struct sa_descriptor { 457*4882a593Smuzhiyun u8 flags; 458*4882a593Smuzhiyun u8 numDesc; 459*4882a593Smuzhiyun u16 cmd; 460*4882a593Smuzhiyun u16 seqNo; 461*4882a593Smuzhiyun u16 mode; 462*4882a593Smuzhiyun #define TYPHOON_SA_MODE_NULL cpu_to_le16(0x0000) 463*4882a593Smuzhiyun #define TYPHOON_SA_MODE_AH cpu_to_le16(0x0001) 464*4882a593Smuzhiyun #define TYPHOON_SA_MODE_ESP cpu_to_le16(0x0002) 465*4882a593Smuzhiyun u8 hashFlags; 466*4882a593Smuzhiyun #define TYPHOON_SA_HASH_ENABLE 0x01 467*4882a593Smuzhiyun #define TYPHOON_SA_HASH_SHA1 0x02 468*4882a593Smuzhiyun #define TYPHOON_SA_HASH_MD5 0x04 469*4882a593Smuzhiyun u8 direction; 470*4882a593Smuzhiyun #define TYPHOON_SA_DIR_RX 0x00 471*4882a593Smuzhiyun #define TYPHOON_SA_DIR_TX 0x01 472*4882a593Smuzhiyun u8 encryptionFlags; 473*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_ENABLE 0x01 474*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_DES 0x02 475*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_3DES 0x00 476*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_3DES_2KEY 0x00 477*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_3DES_3KEY 0x04 478*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_CBC 0x08 479*4882a593Smuzhiyun #define TYPHOON_SA_ENCRYPT_ECB 0x00 480*4882a593Smuzhiyun u8 specifyIndex; 481*4882a593Smuzhiyun #define TYPHOON_SA_SPECIFY_INDEX 0x01 482*4882a593Smuzhiyun #define TYPHOON_SA_GENERATE_INDEX 0x00 483*4882a593Smuzhiyun u32 SPI; 484*4882a593Smuzhiyun u32 destAddr; 485*4882a593Smuzhiyun u32 destMask; 486*4882a593Smuzhiyun u8 integKey[20]; 487*4882a593Smuzhiyun u8 confKey[24]; 488*4882a593Smuzhiyun u32 index; 489*4882a593Smuzhiyun u32 unused; 490*4882a593Smuzhiyun u32 unused2; 491*4882a593Smuzhiyun } __packed; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* TYPHOON_CMD_SET_OFFLOAD_TASKS bits (cmd.parm2 (Tx) & cmd.parm3 (Rx)) 494*4882a593Smuzhiyun * This is all for IPv4. 495*4882a593Smuzhiyun */ 496*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_TCP_CHKSUM cpu_to_le32(0x00000002) 497*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_UDP_CHKSUM cpu_to_le32(0x00000004) 498*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_IP_CHKSUM cpu_to_le32(0x00000008) 499*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_IPSEC cpu_to_le32(0x00000010) 500*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_BCAST_THROTTLE cpu_to_le32(0x00000020) 501*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_DHCP_PREVENT cpu_to_le32(0x00000040) 502*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_VLAN cpu_to_le32(0x00000080) 503*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_FILTERING cpu_to_le32(0x00000100) 504*4882a593Smuzhiyun #define TYPHOON_OFFLOAD_TCP_SEGMENT cpu_to_le32(0x00000200) 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun /* TYPHOON_CMD_ENABLE_WAKE_EVENTS bits (cmd.parm1) 507*4882a593Smuzhiyun */ 508*4882a593Smuzhiyun #define TYPHOON_WAKE_MAGIC_PKT cpu_to_le16(0x01) 509*4882a593Smuzhiyun #define TYPHOON_WAKE_LINK_EVENT cpu_to_le16(0x02) 510*4882a593Smuzhiyun #define TYPHOON_WAKE_ICMP_ECHO cpu_to_le16(0x04) 511*4882a593Smuzhiyun #define TYPHOON_WAKE_ARP cpu_to_le16(0x08) 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun /* These are used to load the firmware image on the NIC 514*4882a593Smuzhiyun */ 515*4882a593Smuzhiyun struct typhoon_file_header { 516*4882a593Smuzhiyun u8 tag[8]; 517*4882a593Smuzhiyun __le32 version; 518*4882a593Smuzhiyun __le32 numSections; 519*4882a593Smuzhiyun __le32 startAddr; 520*4882a593Smuzhiyun __le32 hmacDigest[5]; 521*4882a593Smuzhiyun } __packed; 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun struct typhoon_section_header { 524*4882a593Smuzhiyun __le32 len; 525*4882a593Smuzhiyun u16 checksum; 526*4882a593Smuzhiyun u16 reserved; 527*4882a593Smuzhiyun __le32 startAddr; 528*4882a593Smuzhiyun } __packed; 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun /* The Typhoon Register offsets 531*4882a593Smuzhiyun */ 532*4882a593Smuzhiyun #define TYPHOON_REG_SOFT_RESET 0x00 533*4882a593Smuzhiyun #define TYPHOON_REG_INTR_STATUS 0x04 534*4882a593Smuzhiyun #define TYPHOON_REG_INTR_ENABLE 0x08 535*4882a593Smuzhiyun #define TYPHOON_REG_INTR_MASK 0x0c 536*4882a593Smuzhiyun #define TYPHOON_REG_SELF_INTERRUPT 0x10 537*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM7 0x14 538*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM6 0x18 539*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM5 0x1c 540*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM4 0x20 541*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM3 0x24 542*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM2 0x28 543*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM1 0x2c 544*4882a593Smuzhiyun #define TYPHOON_REG_HOST2ARM0 0x30 545*4882a593Smuzhiyun #define TYPHOON_REG_ARM2HOST3 0x34 546*4882a593Smuzhiyun #define TYPHOON_REG_ARM2HOST2 0x38 547*4882a593Smuzhiyun #define TYPHOON_REG_ARM2HOST1 0x3c 548*4882a593Smuzhiyun #define TYPHOON_REG_ARM2HOST0 0x40 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_DATA_LO TYPHOON_REG_HOST2ARM5 551*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_DATA_HI TYPHOON_REG_HOST2ARM4 552*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_DEST_ADDR TYPHOON_REG_HOST2ARM3 553*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_CHECKSUM TYPHOON_REG_HOST2ARM2 554*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_LENGTH TYPHOON_REG_HOST2ARM1 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_BOOT_ADDR TYPHOON_REG_HOST2ARM1 557*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_HMAC_0 TYPHOON_REG_HOST2ARM2 558*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_HMAC_1 TYPHOON_REG_HOST2ARM3 559*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_HMAC_2 TYPHOON_REG_HOST2ARM4 560*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_HMAC_3 TYPHOON_REG_HOST2ARM5 561*4882a593Smuzhiyun #define TYPHOON_REG_DOWNLOAD_HMAC_4 TYPHOON_REG_HOST2ARM6 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_RECORD_ADDR_HI TYPHOON_REG_HOST2ARM2 564*4882a593Smuzhiyun #define TYPHOON_REG_BOOT_RECORD_ADDR_LO TYPHOON_REG_HOST2ARM1 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun #define TYPHOON_REG_TX_LO_READY TYPHOON_REG_HOST2ARM3 567*4882a593Smuzhiyun #define TYPHOON_REG_CMD_READY TYPHOON_REG_HOST2ARM2 568*4882a593Smuzhiyun #define TYPHOON_REG_TX_HI_READY TYPHOON_REG_HOST2ARM1 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun #define TYPHOON_REG_COMMAND TYPHOON_REG_HOST2ARM0 571*4882a593Smuzhiyun #define TYPHOON_REG_HEARTBEAT TYPHOON_REG_ARM2HOST3 572*4882a593Smuzhiyun #define TYPHOON_REG_STATUS TYPHOON_REG_ARM2HOST0 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun /* 3XP Reset values (TYPHOON_REG_SOFT_RESET) 575*4882a593Smuzhiyun */ 576*4882a593Smuzhiyun #define TYPHOON_RESET_ALL 0x7f 577*4882a593Smuzhiyun #define TYPHOON_RESET_NONE 0x00 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun /* 3XP irq bits (TYPHOON_REG_INTR{STATUS,ENABLE,MASK}) 580*4882a593Smuzhiyun * 581*4882a593Smuzhiyun * Some of these came from OpenBSD, as the 3Com docs have it wrong 582*4882a593Smuzhiyun * (INTR_SELF) or don't list it at all (INTR_*_ABORT) 583*4882a593Smuzhiyun * 584*4882a593Smuzhiyun * Enabling irqs on the Heartbeat reg (ArmToHost3) gets you an irq 585*4882a593Smuzhiyun * about every 8ms, so don't do it. 586*4882a593Smuzhiyun */ 587*4882a593Smuzhiyun #define TYPHOON_INTR_HOST_INT 0x00000001 588*4882a593Smuzhiyun #define TYPHOON_INTR_ARM2HOST0 0x00000002 589*4882a593Smuzhiyun #define TYPHOON_INTR_ARM2HOST1 0x00000004 590*4882a593Smuzhiyun #define TYPHOON_INTR_ARM2HOST2 0x00000008 591*4882a593Smuzhiyun #define TYPHOON_INTR_ARM2HOST3 0x00000010 592*4882a593Smuzhiyun #define TYPHOON_INTR_DMA0 0x00000020 593*4882a593Smuzhiyun #define TYPHOON_INTR_DMA1 0x00000040 594*4882a593Smuzhiyun #define TYPHOON_INTR_DMA2 0x00000080 595*4882a593Smuzhiyun #define TYPHOON_INTR_DMA3 0x00000100 596*4882a593Smuzhiyun #define TYPHOON_INTR_MASTER_ABORT 0x00000200 597*4882a593Smuzhiyun #define TYPHOON_INTR_TARGET_ABORT 0x00000400 598*4882a593Smuzhiyun #define TYPHOON_INTR_SELF 0x00000800 599*4882a593Smuzhiyun #define TYPHOON_INTR_RESERVED 0xfffff000 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun #define TYPHOON_INTR_BOOTCMD TYPHOON_INTR_ARM2HOST0 602*4882a593Smuzhiyun 603*4882a593Smuzhiyun #define TYPHOON_INTR_ENABLE_ALL 0xffffffef 604*4882a593Smuzhiyun #define TYPHOON_INTR_ALL 0xffffffff 605*4882a593Smuzhiyun #define TYPHOON_INTR_NONE 0x00000000 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun /* The commands for the 3XP chip (TYPHOON_REG_COMMAND) 608*4882a593Smuzhiyun */ 609*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_BOOT 0x00 610*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_WAKEUP 0xfa 611*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_DNLD_COMPLETE 0xfb 612*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_SEG_AVAILABLE 0xfc 613*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_RUNTIME_IMAGE 0xfd 614*4882a593Smuzhiyun #define TYPHOON_BOOTCMD_REG_BOOT_RECORD 0xff 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun /* 3XP Status values (TYPHOON_REG_STATUS) 617*4882a593Smuzhiyun */ 618*4882a593Smuzhiyun #define TYPHOON_STATUS_WAITING_FOR_BOOT 0x07 619*4882a593Smuzhiyun #define TYPHOON_STATUS_SECOND_INIT 0x08 620*4882a593Smuzhiyun #define TYPHOON_STATUS_RUNNING 0x09 621*4882a593Smuzhiyun #define TYPHOON_STATUS_WAITING_FOR_HOST 0x0d 622*4882a593Smuzhiyun #define TYPHOON_STATUS_WAITING_FOR_SEGMENT 0x10 623*4882a593Smuzhiyun #define TYPHOON_STATUS_SLEEPING 0x11 624*4882a593Smuzhiyun #define TYPHOON_STATUS_HALTED 0x14 625