2005-04-17 02:20:36 +04:00
/* 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 3 Com 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 0274 DD06D1 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 Typoon 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
2006-09-13 21:24:59 +04:00
*
2005-04-17 02:20:36 +04:00
* All values must be in little endian format for the 3 XP
*
* 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 */
2007-08-23 08:44:39 +04:00
volatile __le32 rxHiCleared ;
volatile __le32 rxLoCleared ;
volatile __le32 rxBuffReady ;
volatile __le32 respCleared ;
2005-04-17 02:20:36 +04:00
/* The remaining are written by the NIC, and read by the host */
2007-08-23 08:44:39 +04:00
volatile __le32 txLoCleared ;
volatile __le32 txHiCleared ;
volatile __le32 rxLoReady ;
2007-12-21 09:20:53 +03:00
volatile __le32 rxBuffCleared ;
2007-08-23 08:44:39 +04:00
volatile __le32 cmdCleared ;
volatile __le32 respReady ;
volatile __le32 rxHiReady ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* The host<->Typhoon interface
* Our means of communicating where things are
*
* All values must be in little endian format for the 3 XP
*
* 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 3 XP
* only do 32 bit addresses , so the * Hi for each of the above will always
* be zero .
*/
struct typhoon_interface {
2007-08-23 08:44:39 +04:00
__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 ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 .
2006-09-13 21:24:59 +04:00
*
2005-04-17 02:20:36 +04:00
* 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 ;
2007-08-23 08:44:39 +04:00
__le16 len ;
2007-12-21 09:21:14 +03:00
union {
struct {
__le32 addr ;
__le32 addrHi ;
} frag ;
u64 tx_addr ; /* opaque for hardware, for TX_DESC */
} ;
2007-08-23 08:44:39 +04:00
__le32 processFlags ;
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
# define TYPHOON_TX_PF_VLAN_TAG_SHIFT 12
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 ;
2007-08-23 08:44:39 +04:00
__le16 mss_flags ;
2009-01-19 09:03:01 +03:00
# define TYPHOON_TSO_FIRST cpu_to_le16(0x1000)
# define TYPHOON_TSO_LAST cpu_to_le16(0x2000)
2007-08-23 08:44:39 +04:00
__le32 respAddrLo ;
__le32 bytesTx ;
__le32 status ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 ;
2007-08-23 08:44:39 +04:00
__le16 ipsecFlags ;
2009-01-19 09:03:01 +03:00
# define TYPHOON_IPSEC_GEN_IV cpu_to_le16(0x0000)
# define TYPHOON_IPSEC_USE_IV cpu_to_le16(0x0001)
2007-08-23 08:44:39 +04:00
__le32 sa1 ;
__le32 sa2 ;
__le32 reserved ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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.2 q TCI from the packet
*/
struct rx_desc {
u8 flags ;
u8 numDesc ;
2007-08-23 08:44:39 +04:00
__le16 frameLen ;
2007-12-21 09:21:14 +03:00
u32 addr ; /* opaque, comes from virtAddr */
u32 addrHi ; /* opaque, comes from virtAddrHi */
2007-08-23 08:44:39 +04:00
__le32 rxStatus ;
2009-01-19 09:03:01 +03:00
# 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)
2007-08-23 08:44:39 +04:00
__le16 filterResults ;
2009-01-19 09:03:01 +03:00
# define TYPHOON_RX_FILTER_MASK cpu_to_le16(0x7fff)
# define TYPHOON_RX_FILTERED cpu_to_le16(0x8000)
2007-08-23 08:44:39 +04:00
__le16 ipsecResults ;
2009-01-19 09:03:01 +03:00
# 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)
2007-08-23 08:44:39 +04:00
__be32 vlanTag ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 {
2007-08-23 08:44:39 +04:00
__le32 physAddr ;
__le32 physAddrHi ;
2005-04-17 02:20:36 +04:00
u32 virtAddr ;
u32 virtAddrHi ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 ;
2007-08-23 08:44:39 +04:00
__le16 cmd ;
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
u16 seqNo ;
2007-08-23 08:44:39 +04:00
__le16 parm1 ;
__le32 parm2 ;
__le32 parm3 ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* The Typhoon response descriptor, see command descriptor for details
*/
struct resp_desc {
u8 flags ;
u8 numDesc ;
2007-08-23 08:44:39 +04:00
__le16 cmd ;
__le16 seqNo ;
__le16 parm1 ;
__le32 parm2 ;
__le32 parm3 ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
# 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)
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_READ_STATS response format
*/
struct stats_resp {
u8 flags ;
u8 numDesc ;
2007-08-23 08:44:39 +04:00
__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 ;
2009-01-19 09:03:01 +03:00
# 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)
2007-08-23 08:44:39 +04:00
__le32 unused2 ;
__le32 unused3 ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_XCVR_SELECT xcvr values (resp.parm1)
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_READ_MEDIA_STATUS (resp.parm1)
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_SET_MULTICAST_HASH enable values (cmd.parm1)
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_CREATE_SA descriptor and settings
*/
struct sa_descriptor {
u8 flags ;
u8 numDesc ;
u16 cmd ;
u16 seqNo ;
u16 mode ;
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
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 ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_SET_OFFLOAD_TASKS bits (cmd.parm2 (Tx) & cmd.parm3 (Rx))
* This is all for IPv4 .
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* TYPHOON_CMD_ENABLE_WAKE_EVENTS bits (cmd.parm1)
*/
2009-01-19 09:03:01 +03:00
# 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)
2005-04-17 02:20:36 +04:00
/* These are used to load the firmware image on the NIC
*/
struct typhoon_file_header {
u8 tag [ 8 ] ;
2007-08-23 08:44:39 +04:00
__le32 version ;
__le32 numSections ;
__le32 startAddr ;
__le32 hmacDigest [ 5 ] ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
struct typhoon_section_header {
2007-08-23 08:44:39 +04:00
__le32 len ;
2005-04-17 02:20:36 +04:00
u16 checksum ;
u16 reserved ;
2007-08-23 08:44:39 +04:00
__le32 startAddr ;
2010-06-02 22:10:09 +04:00
} __packed ;
2005-04-17 02:20:36 +04:00
/* 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 3 Com 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 8 ms , 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