[BACK]Return to if_txpreg.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_txpreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_txpreg.h,v 1.37 2004/11/16 23:39:56 jason Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 2001 Aaron Campbell <aaron@monkey.org>.
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     19:  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
                     20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     22:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     25:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     26:  * THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28:
                     29: #define        TXP_PCI_LOMEM                   0x14    /* pci conf, memory map BAR */
                     30: #define        TXP_PCI_LOIO                    0x10    /* pci conf, IO map BAR */
                     31:
                     32: /*
                     33:  * Typhoon registers.
                     34:  */
                     35: #define        TXP_SRR                         0x00    /* soft reset register */
                     36: #define        TXP_ISR                         0x04    /* interrupt status register */
                     37: #define        TXP_IER                         0x08    /* interrupt enable register */
                     38: #define        TXP_IMR                         0x0c    /* interrupt mask register */
                     39: #define        TXP_SIR                         0x10    /* self interrupt register */
                     40: #define        TXP_H2A_7                       0x14    /* host->arm comm 7 */
                     41: #define        TXP_H2A_6                       0x18    /* host->arm comm 6 */
                     42: #define        TXP_H2A_5                       0x1c    /* host->arm comm 5 */
                     43: #define        TXP_H2A_4                       0x20    /* host->arm comm 4 */
                     44: #define        TXP_H2A_3                       0x24    /* host->arm comm 3 */
                     45: #define        TXP_H2A_2                       0x28    /* host->arm comm 2 */
                     46: #define        TXP_H2A_1                       0x2c    /* host->arm comm 1 */
                     47: #define        TXP_H2A_0                       0x30    /* host->arm comm 0 */
                     48: #define        TXP_A2H_3                       0x34    /* arm->host comm 3 */
                     49: #define        TXP_A2H_2                       0x38    /* arm->host comm 2 */
                     50: #define        TXP_A2H_1                       0x3c    /* arm->host comm 1 */
                     51: #define        TXP_A2H_0                       0x40    /* arm->host comm 0 */
                     52:
                     53: /*
                     54:  * interrupt bits (IMR, ISR, IER)
                     55:  */
                     56: #define        TXP_INT_RESERVED        0xffff0000
                     57: #define        TXP_INT_A2H_7           0x00008000      /* arm->host comm 7 */
                     58: #define        TXP_INT_A2H_6           0x00004000      /* arm->host comm 6 */
                     59: #define        TXP_INT_A2H_5           0x00002000      /* arm->host comm 5 */
                     60: #define        TXP_INT_A2H_4           0x00001000      /* arm->host comm 4 */
                     61: #define        TXP_INT_SELF            0x00000800      /* self interrupt */
                     62: #define        TXP_INT_PCI_TABORT      0x00000400      /* pci target abort */
                     63: #define        TXP_INT_PCI_MABORT      0x00000200      /* pci master abort */
                     64: #define        TXP_INT_DMA3            0x00000100      /* dma3 done */
                     65: #define        TXP_INT_DMA2            0x00000080      /* dma2 done */
                     66: #define        TXP_INT_DMA1            0x00000040      /* dma1 done */
                     67: #define        TXP_INT_DMA0            0x00000020      /* dma0 done */
                     68: #define        TXP_INT_A2H_3           0x00000010      /* arm->host comm 3 */
                     69: #define        TXP_INT_A2H_2           0x00000008      /* arm->host comm 2 */
                     70: #define        TXP_INT_A2H_1           0x00000004      /* arm->host comm 1 */
                     71: #define        TXP_INT_A2H_0           0x00000002      /* arm->host comm 0 */
                     72: #define        TXP_INT_LATCH           0x00000001      /* interrupt latch */
                     73:
                     74: /*
                     75:  * soft reset register (SRR)
                     76:  */
                     77: #define        TXP_SRR_ALL             0x0000007f      /* full reset */
                     78:
                     79: /*
                     80:  * Typhoon boot commands.
                     81:  */
                     82: #define        TXP_BOOTCMD_NULL                        0x00
                     83: #define        TXP_BOOTCMD_DOWNLOAD_COMPLETE           0xfb
                     84: #define        TXP_BOOTCMD_SEGMENT_AVAILABLE           0xfc
                     85: #define        TXP_BOOTCMD_RUNTIME_IMAGE               0xfd
                     86: #define        TXP_BOOTCMD_REGISTER_BOOT_RECORD        0xff
                     87:
                     88: /*
                     89:  * Typhoon runtime commands.
                     90:  */
                     91: #define        TXP_CMD_GLOBAL_RESET                    0x00
                     92: #define        TXP_CMD_TX_ENABLE                       0x01
                     93: #define        TXP_CMD_TX_DISABLE                      0x02
                     94: #define        TXP_CMD_RX_ENABLE                       0x03
                     95: #define        TXP_CMD_RX_DISABLE                      0x04
                     96: #define        TXP_CMD_RX_FILTER_WRITE                 0x05
                     97: #define        TXP_CMD_RX_FILTER_READ                  0x06
                     98: #define        TXP_CMD_READ_STATISTICS                 0x07
                     99: #define        TXP_CMD_CYCLE_STATISTICS                0x08
                    100: #define        TXP_CMD_CLEAR_STATISTICS                0x09
                    101: #define        TXP_CMD_MEMORY_READ                     0x0a
                    102: #define        TXP_CMD_MEMORY_WRITE_SINGLE             0x0b
                    103: #define        TXP_CMD_VARIABLE_SECTION_READ           0x0c
                    104: #define        TXP_CMD_VARIABLE_SECTION_WRITE          0x0d
                    105: #define        TXP_CMD_STATIC_SECTION_READ             0x0e
                    106: #define        TXP_CMD_STATIC_SECTION_WRITE            0x0f
                    107: #define        TXP_CMD_IMAGE_SECTION_PROGRAM           0x10
                    108: #define        TXP_CMD_NVRAM_PAGE_READ                 0x11
                    109: #define        TXP_CMD_NVRAM_PAGE_WRITE                0x12
                    110: #define        TXP_CMD_XCVR_SELECT                     0x13
                    111: #define        TXP_CMD_TEST_MUX                        0x14
                    112: #define        TXP_CMD_PHYLOOPBACK_ENABLE              0x15
                    113: #define        TXP_CMD_PHYLOOPBACK_DISABLE             0x16
                    114: #define        TXP_CMD_MAC_CONTROL_READ                0x17
                    115: #define        TXP_CMD_MAC_CONTROL_WRITE               0x18
                    116: #define        TXP_CMD_MAX_PKT_SIZE_READ               0x19
                    117: #define        TXP_CMD_MAX_PKT_SIZE_WRITE              0x1a
                    118: #define        TXP_CMD_MEDIA_STATUS_READ               0x1b
                    119: #define        TXP_CMD_MEDIA_STATUS_WRITE              0x1c
                    120: #define        TXP_CMD_NETWORK_DIAGS_READ              0x1d
                    121: #define        TXP_CMD_NETWORK_DIAGS_WRITE             0x1e
                    122: #define        TXP_CMD_PHY_MGMT_READ                   0x1f
                    123: #define        TXP_CMD_PHY_MGMT_WRITE                  0x20
                    124: #define        TXP_CMD_VARIABLE_PARAMETER_READ         0x21
                    125: #define        TXP_CMD_VARIABLE_PARAMETER_WRITE        0x22
                    126: #define        TXP_CMD_GOTO_SLEEP                      0x23
                    127: #define        TXP_CMD_FIREWALL_CONTROL                0x24
                    128: #define        TXP_CMD_MCAST_HASH_MASK_WRITE           0x25
                    129: #define        TXP_CMD_STATION_ADDRESS_WRITE           0x26
                    130: #define        TXP_CMD_STATION_ADDRESS_READ            0x27
                    131: #define        TXP_CMD_STATION_MASK_WRITE              0x28
                    132: #define        TXP_CMD_STATION_MASK_READ               0x29
                    133: #define        TXP_CMD_VLAN_ETHER_TYPE_READ            0x2a
                    134: #define        TXP_CMD_VLAN_ETHER_TYPE_WRITE           0x2b
                    135: #define        TXP_CMD_VLAN_MASK_READ                  0x2c
                    136: #define        TXP_CMD_VLAN_MASK_WRITE                 0x2d
                    137: #define        TXP_CMD_BCAST_THROTTLE_WRITE            0x2e
                    138: #define        TXP_CMD_BCAST_THROTTLE_READ             0x2f
                    139: #define        TXP_CMD_DHCP_PREVENT_WRITE              0x30
                    140: #define        TXP_CMD_DHCP_PREVENT_READ               0x31
                    141: #define        TXP_CMD_RECV_BUFFER_CONTROL             0x32
                    142: #define        TXP_CMD_SOFTWARE_RESET                  0x33
                    143: #define        TXP_CMD_CREATE_SA                       0x34
                    144: #define        TXP_CMD_DELETE_SA                       0x35
                    145: #define        TXP_CMD_ENABLE_RX_IP_OPTION             0x36
                    146: #define        TXP_CMD_RANDOM_NUMBER_CONTROL           0x37
                    147: #define        TXP_CMD_RANDOM_NUMBER_READ              0x38
                    148: #define        TXP_CMD_MATRIX_TABLE_MODE_WRITE         0x39
                    149: #define        TXP_CMD_MATRIX_DETAIL_READ              0x3a
                    150: #define        TXP_CMD_FILTER_ARRAY_READ               0x3b
                    151: #define        TXP_CMD_FILTER_DETAIL_READ              0x3c
                    152: #define        TXP_CMD_FILTER_TABLE_MODE_WRITE         0x3d
                    153: #define        TXP_CMD_FILTER_TCL_WRITE                0x3e
                    154: #define        TXP_CMD_FILTER_TBL_READ                 0x3f
                    155: #define        TXP_CMD_VERSIONS_READ                   0x43
                    156: #define        TXP_CMD_FILTER_DEFINE                   0x45
                    157: #define        TXP_CMD_ADD_WAKEUP_PKT                  0x46
                    158: #define        TXP_CMD_ADD_SLEEP_PKT                   0x47
                    159: #define        TXP_CMD_ENABLE_SLEEP_EVENTS             0x48
                    160: #define        TXP_CMD_ENABLE_WAKEUP_EVENTS            0x49
                    161: #define        TXP_CMD_GET_IP_ADDRESS                  0x4a
                    162: #define        TXP_CMD_READ_PCI_REG                    0x4c
                    163: #define        TXP_CMD_WRITE_PCI_REG                   0x4d
                    164: #define        TXP_CMD_OFFLOAD_READ                    0x4e
                    165: #define        TXP_CMD_OFFLOAD_WRITE                   0x4f
                    166: #define        TXP_CMD_HELLO_RESPONSE                  0x57
                    167: #define        TXP_CMD_ENABLE_RX_FILTER                0x58
                    168: #define        TXP_CMD_RX_FILTER_CAPABILITY            0x59
                    169: #define        TXP_CMD_HALT                            0x5d
                    170: #define        TXP_CMD_READ_IPSEC_INFO                 0x54
                    171: #define        TXP_CMD_GET_IPSEC_ENABLE                0x67
                    172: #define        TXP_CMD_INVALID                         0xffff
                    173:
                    174: #define        TXP_FRAGMENT            0x0000
                    175: #define        TXP_TXFRAME             0x0001
                    176: #define        TXP_COMMAND             0x0002
                    177: #define        TXP_OPTION              0x0003
                    178: #define        TXP_RECEIVE             0x0004
                    179: #define        TXP_RESPONSE            0x0005
                    180:
                    181: #define        TXP_TYPE_IPSEC          0x0000
                    182: #define        TXP_TYPE_TCPSEGMENT     0x0001
                    183:
                    184: #define        TXP_PFLAG_NOCRC         0x0001
                    185: #define        TXP_PFLAG_IPCKSUM       0x0002
                    186: #define        TXP_PFLAG_TCPCKSUM      0x0004
                    187: #define        TXP_PFLAG_TCPSEGMENT    0x0008
                    188: #define        TXP_PFLAG_INSERTVLAN    0x0010
                    189: #define        TXP_PFLAG_IPSEC         0x0020
                    190: #define        TXP_PFLAG_PRIORITY      0x0040
                    191: #define        TXP_PFLAG_UDPCKSUM      0x0080
                    192: #define        TXP_PFLAG_PADFRAME      0x0100
                    193:
                    194: #define        TXP_MISC_FIRSTDESC      0x0000
                    195: #define        TXP_MISC_LASTDESC       0x0001
                    196:
                    197: #define        TXP_ERR_INTERNAL        0x0000
                    198: #define        TXP_ERR_FIFOUNDERRUN    0x0001
                    199: #define        TXP_ERR_BADSSD          0x0002
                    200: #define        TXP_ERR_RUNT            0x0003
                    201: #define        TXP_ERR_CRC             0x0004
                    202: #define        TXP_ERR_OVERSIZE        0x0005
                    203: #define        TXP_ERR_ALIGNMENT       0x0006
                    204: #define        TXP_ERR_DRIBBLEBIT      0x0007
                    205:
                    206: #define        TXP_PROTO_UNKNOWN       0x0000
                    207: #define        TXP_PROTO_IP            0x0001
                    208: #define        TXP_PROTO_IPX           0x0002
                    209: #define        TXP_PROTO_RESERVED      0x0003
                    210:
                    211: #define        TXP_STAT_PROTO          0x0001
                    212: #define        TXP_STAT_VLAN           0x0002
                    213: #define        TXP_STAT_IPFRAGMENT     0x0004
                    214: #define        TXP_STAT_IPSEC          0x0008
                    215: #define        TXP_STAT_IPCKSUMBAD     0x0010
                    216: #define        TXP_STAT_TCPCKSUMBAD    0x0020
                    217: #define        TXP_STAT_UDPCKSUMBAD    0x0040
                    218: #define        TXP_STAT_IPCKSUMGOOD    0x0080
                    219: #define        TXP_STAT_TCPCKSUMGOOD   0x0100
                    220: #define        TXP_STAT_UDPCKSUMGOOD   0x0200
                    221:
                    222: struct txp_tx_desc {
                    223:        volatile u_int8_t       tx_flags;       /* type/descriptor flags */
                    224:        volatile u_int8_t       tx_numdesc;     /* number of descriptors */
                    225:        volatile u_int16_t      tx_totlen;      /* total packet length */
                    226:        volatile u_int32_t      tx_addrlo;      /* virt addr low word */
                    227:        volatile u_int32_t      tx_addrhi;      /* virt addr high word */
                    228:        volatile u_int32_t      tx_pflags;      /* processing flags */
                    229: };
                    230: #define        TX_FLAGS_TYPE_M         0x07            /* type mask */
                    231: #define        TX_FLAGS_TYPE_FRAG      0x00            /* type: fragment */
                    232: #define        TX_FLAGS_TYPE_DATA      0x01            /* type: data frame */
                    233: #define        TX_FLAGS_TYPE_CMD       0x02            /* type: command frame */
                    234: #define        TX_FLAGS_TYPE_OPT       0x03            /* type: options */
                    235: #define        TX_FLAGS_TYPE_RX        0x04            /* type: command */
                    236: #define        TX_FLAGS_TYPE_RESP      0x05            /* type: response */
                    237: #define        TX_FLAGS_RESP           0x40            /* response requested */
                    238: #define        TX_FLAGS_VALID          0x80            /* valid descriptor */
                    239:
                    240: #define        TX_PFLAGS_DNAC          0x00000001      /* do not add crc */
                    241: #define        TX_PFLAGS_IPCKSUM       0x00000002      /* ip checksum */
                    242: #define        TX_PFLAGS_TCPCKSUM      0x00000004      /* tcp checksum */
                    243: #define        TX_PFLAGS_TCPSEG        0x00000008      /* tcp segmentation */
                    244: #define        TX_PFLAGS_VLAN          0x00000010      /* insert vlan */
                    245: #define        TX_PFLAGS_IPSEC         0x00000020      /* perform ipsec */
                    246: #define        TX_PFLAGS_PRIO          0x00000040      /* priority field valid */
                    247: #define        TX_PFLAGS_UDPCKSUM      0x00000080      /* udp checksum */
                    248: #define        TX_PFLAGS_PADFRAME      0x00000100      /* pad frame */
                    249: #define        TX_PFLAGS_VLANTAG_M     0x0ffff000      /* vlan tag mask */
                    250: #define        TX_PFLAGS_VLANPRI_M     0x00700000      /* vlan priority mask */
                    251: #define        TX_PFLAGS_VLANTAG_S     12              /* amount to shift tag */
                    252:
                    253: struct txp_rx_desc {
                    254:        volatile u_int8_t       rx_flags;       /* type/descriptor flags */
                    255:        volatile u_int8_t       rx_numdesc;     /* number of descriptors */
                    256:        volatile u_int16_t      rx_len;         /* frame length */
                    257:        volatile u_int32_t      rx_vaddrlo;     /* virtual address, lo word */
                    258:        volatile u_int32_t      rx_vaddrhi;     /* virtual address, hi word */
                    259:        volatile u_int32_t      rx_stat;        /* status */
                    260:        volatile u_int16_t      rx_filter;      /* filter status */
                    261:        volatile u_int16_t      rx_hash;        /* hash status */
                    262:        volatile u_int32_t      rx_vlan;        /* vlan tag/priority */
                    263: };
                    264:
                    265: /* txp_rx_desc.rx_flags */
                    266: #define        RX_FLAGS_TYPE_M         0x07            /* type mask */
                    267: #define        RX_FLAGS_TYPE_FRAG      0x00            /* type: fragment */
                    268: #define        RX_FLAGS_TYPE_DATA      0x01            /* type: data frame */
                    269: #define        RX_FLAGS_TYPE_CMD       0x02            /* type: command frame */
                    270: #define        RX_FLAGS_TYPE_OPT       0x03            /* type: options */
                    271: #define        RX_FLAGS_TYPE_RX        0x04            /* type: command */
                    272: #define        RX_FLAGS_TYPE_RESP      0x05            /* type: response */
                    273: #define        RX_FLAGS_RCV_TYPE_M     0x18            /* rcvtype mask */
                    274: #define        RX_FLAGS_RCV_TYPE_RX    0x00            /* rcvtype: receive */
                    275: #define        RX_FLAGS_RCV_TYPE_RSP   0x08            /* rcvtype: response */
                    276: #define        RX_FLAGS_ERROR          0x40            /* error in packet */
                    277:
                    278: /* txp_rx_desc.rx_stat (if rx_flags & RX_FLAGS_ERROR bit set) */
                    279: #define        RX_ERROR_ADAPTER        0x00000000      /* adapter internal error */
                    280: #define        RX_ERROR_FIFO           0x00000001      /* fifo underrun */
                    281: #define        RX_ERROR_BADSSD         0x00000002      /* bad ssd */
                    282: #define        RX_ERROR_RUNT           0x00000003      /* runt packet */
                    283: #define        RX_ERROR_CRC            0x00000004      /* bad crc */
                    284: #define        RX_ERROR_OVERSIZE       0x00000005      /* oversized packet */
                    285: #define        RX_ERROR_ALIGN          0x00000006      /* alignment error */
                    286: #define        RX_ERROR_DRIBBLE        0x00000007      /* dribble bit */
                    287:
                    288: /* txp_rx_desc.rx_stat (if rx_flags & RX_FLAGS_ERROR not bit set) */
                    289: #define        RX_STAT_PROTO_M         0x00000003      /* protocol mask */
                    290: #define        RX_STAT_PROTO_UK        0x00000000      /* unknown protocol */
                    291: #define        RX_STAT_PROTO_IPX       0x00000001      /* IPX */
                    292: #define        RX_STAT_PROTO_IP        0x00000002      /* IP */
                    293: #define        RX_STAT_PROTO_RSV       0x00000003      /* reserved */
                    294: #define        RX_STAT_VLAN            0x00000004      /* vlan tag (in rxd) */
                    295: #define        RX_STAT_IPFRAG          0x00000008      /* fragment, ipsec not done */
                    296: #define        RX_STAT_IPSEC           0x00000010      /* ipsec decoded packet */
                    297: #define        RX_STAT_IPCKSUMBAD      0x00000020      /* ip checksum failed */
                    298: #define        RX_STAT_UDPCKSUMBAD     0x00000040      /* udp checksum failed */
                    299: #define        RX_STAT_TCPCKSUMBAD     0x00000080      /* tcp checksum failed */
                    300: #define        RX_STAT_IPCKSUMGOOD     0x00000100      /* ip checksum succeeded */
                    301: #define        RX_STAT_UDPCKSUMGOOD    0x00000200      /* udp checksum succeeded */
                    302: #define        RX_STAT_TCPCKSUMGOOD    0x00000400      /* tcp checksum succeeded */
                    303:
                    304:
                    305: struct txp_rxbuf_desc {
                    306:        volatile u_int32_t      rb_paddrlo;
                    307:        volatile u_int32_t      rb_paddrhi;
                    308:        volatile u_int32_t      rb_vaddrlo;
                    309:        volatile u_int32_t      rb_vaddrhi;
                    310: };
                    311:
                    312: /* Extension descriptor */
                    313: struct txp_ext_desc {
                    314:        volatile u_int32_t      ext_1;
                    315:        volatile u_int32_t      ext_2;
                    316:        volatile u_int32_t      ext_3;
                    317:        volatile u_int32_t      ext_4;
                    318: };
                    319:
                    320: struct txp_cmd_desc {
                    321:        volatile u_int8_t       cmd_flags;
                    322:        volatile u_int8_t       cmd_numdesc;
                    323:        volatile u_int16_t      cmd_id;
                    324:        volatile u_int16_t      cmd_seq;
                    325:        volatile u_int16_t      cmd_par1;
                    326:        volatile u_int32_t      cmd_par2;
                    327:        volatile u_int32_t      cmd_par3;
                    328: };
                    329: #define        CMD_FLAGS_TYPE_M        0x07            /* type mask */
                    330: #define        CMD_FLAGS_TYPE_FRAG     0x00            /* type: fragment */
                    331: #define        CMD_FLAGS_TYPE_DATA     0x01            /* type: data frame */
                    332: #define        CMD_FLAGS_TYPE_CMD      0x02            /* type: command frame */
                    333: #define        CMD_FLAGS_TYPE_OPT      0x03            /* type: options */
                    334: #define        CMD_FLAGS_TYPE_RX       0x04            /* type: command */
                    335: #define        CMD_FLAGS_TYPE_RESP     0x05            /* type: response */
                    336: #define        CMD_FLAGS_RESP          0x40            /* response requested */
                    337: #define        CMD_FLAGS_VALID         0x80            /* valid descriptor */
                    338:
                    339: struct txp_rsp_desc {
                    340:        volatile u_int8_t       rsp_flags;
                    341:        volatile u_int8_t       rsp_numdesc;
                    342:        volatile u_int16_t      rsp_id;
                    343:        volatile u_int16_t      rsp_seq;
                    344:        volatile u_int16_t      rsp_par1;
                    345:        volatile u_int32_t      rsp_par2;
                    346:        volatile u_int32_t      rsp_par3;
                    347: };
                    348: #define        RSP_FLAGS_TYPE_M        0x07            /* type mask */
                    349: #define        RSP_FLAGS_TYPE_FRAG     0x00            /* type: fragment */
                    350: #define        RSP_FLAGS_TYPE_DATA     0x01            /* type: data frame */
                    351: #define        RSP_FLAGS_TYPE_CMD      0x02            /* type: command frame */
                    352: #define        RSP_FLAGS_TYPE_OPT      0x03            /* type: options */
                    353: #define        RSP_FLAGS_TYPE_RX       0x04            /* type: command */
                    354: #define        RSP_FLAGS_TYPE_RESP     0x05            /* type: response */
                    355: #define        RSP_FLAGS_ERROR         0x40            /* response error */
                    356:
                    357: struct txp_frag_desc {
                    358:        volatile u_int8_t       frag_flags;     /* type/descriptor flags */
                    359:        volatile u_int8_t       frag_rsvd1;
                    360:        volatile u_int16_t      frag_len;       /* bytes in this fragment */
                    361:        volatile u_int32_t      frag_addrlo;    /* phys addr low word */
                    362:        volatile u_int32_t      frag_addrhi;    /* phys addr high word */
                    363:        volatile u_int32_t      frag_rsvd2;
                    364: };
                    365: #define        FRAG_FLAGS_TYPE_M       0x07            /* type mask */
                    366: #define        FRAG_FLAGS_TYPE_FRAG    0x00            /* type: fragment */
                    367: #define        FRAG_FLAGS_TYPE_DATA    0x01            /* type: data frame */
                    368: #define        FRAG_FLAGS_TYPE_CMD     0x02            /* type: command frame */
                    369: #define        FRAG_FLAGS_TYPE_OPT     0x03            /* type: options */
                    370: #define        FRAG_FLAGS_TYPE_RX      0x04            /* type: command */
                    371: #define        FRAG_FLAGS_TYPE_RESP    0x05            /* type: response */
                    372: #define        FRAG_FLAGS_VALID        0x80            /* valid descriptor */
                    373:
                    374: struct txp_opt_desc {
                    375:        u_int8_t                opt_desctype:3,
                    376:                                opt_rsvd:1,
                    377:                                opt_type:4;
                    378:
                    379:        u_int8_t                opt_num;
                    380:        u_int16_t               opt_dep1;
                    381:        u_int32_t               opt_dep2;
                    382:        u_int32_t               opt_dep3;
                    383:        u_int32_t               opt_dep4;
                    384: };
                    385:
                    386: struct txp_ipsec_desc {
                    387:        u_int8_t                ipsec_desctpe:3,
                    388:                                ipsec_rsvd:1,
                    389:                                ipsec_type:4;
                    390:
                    391:        u_int8_t                ipsec_num;
                    392:        u_int16_t               ipsec_flags;
                    393:        u_int16_t               ipsec_ah1;
                    394:        u_int16_t               ipsec_esp1;
                    395:        u_int16_t               ipsec_ah2;
                    396:        u_int16_t               ipsec_esp2;
                    397:        u_int32_t               ipsec_rsvd1;
                    398: };
                    399:
                    400: struct txp_tcpseg_desc {
                    401:        u_int8_t                tcpseg_desctype:3,
                    402:                                tcpseg_rsvd:1,
                    403:                                tcpseg_type:4;
                    404:
                    405:        u_int8_t                tcpseg_num;
                    406:
                    407:        u_int16_t               tcpseg_mss:12,
                    408:                                tcpseg_misc:4;
                    409:
                    410:        u_int32_t               tcpseg_respaddr;
                    411:        u_int32_t               tcpseg_txbytes;
                    412:        u_int32_t               tcpseg_lss;
                    413: };
                    414:
                    415: /*
                    416:  * Transceiver types
                    417:  */
                    418: #define        TXP_XCVR_10_HDX         0
                    419: #define        TXP_XCVR_10_FDX         1
                    420: #define        TXP_XCVR_100_HDX        2
                    421: #define        TXP_XCVR_100_FDX        3
                    422: #define        TXP_XCVR_AUTO           4
                    423:
                    424: #define TXP_MEDIA_CRC          0x0004  /* crc strip disable */
                    425: #define        TXP_MEDIA_CD            0x0010  /* collision detection */
                    426: #define        TXP_MEDIA_CS            0x0020  /* carrier sense */
                    427: #define        TXP_MEDIA_POL           0x0400  /* polarity reversed */
                    428: #define        TXP_MEDIA_NOLINK        0x0800  /* 0 = link, 1 = no link */
                    429:
                    430: /*
                    431:  * receive filter bits (par1 to TXP_CMD_RX_FILTER_{READ|WRITE}
                    432:  */
                    433: #define        TXP_RXFILT_DIRECT       0x0001  /* directed packets */
                    434: #define        TXP_RXFILT_ALLMULTI     0x0002  /* all multicast packets */
                    435: #define        TXP_RXFILT_BROADCAST    0x0004  /* broadcast packets */
                    436: #define        TXP_RXFILT_PROMISC      0x0008  /* promiscuous mode */
                    437: #define        TXP_RXFILT_HASHMULTI    0x0010  /* use multicast filter */
                    438:
                    439: /*
                    440:  * boot record (pointers to rings)
                    441:  */
                    442: struct txp_boot_record {
                    443:        volatile u_int32_t      br_hostvar_lo;          /* host ring pointer */
                    444:        volatile u_int32_t      br_hostvar_hi;
                    445:        volatile u_int32_t      br_txlopri_lo;          /* tx low pri ring */
                    446:        volatile u_int32_t      br_txlopri_hi;
                    447:        volatile u_int32_t      br_txlopri_siz;
                    448:        volatile u_int32_t      br_txhipri_lo;          /* tx high pri ring */
                    449:        volatile u_int32_t      br_txhipri_hi;
                    450:        volatile u_int32_t      br_txhipri_siz;
                    451:        volatile u_int32_t      br_rxlopri_lo;          /* rx low pri ring */
                    452:        volatile u_int32_t      br_rxlopri_hi;
                    453:        volatile u_int32_t      br_rxlopri_siz;
                    454:        volatile u_int32_t      br_rxbuf_lo;            /* rx buffer ring */
                    455:        volatile u_int32_t      br_rxbuf_hi;
                    456:        volatile u_int32_t      br_rxbuf_siz;
                    457:        volatile u_int32_t      br_cmd_lo;              /* command ring */
                    458:        volatile u_int32_t      br_cmd_hi;
                    459:        volatile u_int32_t      br_cmd_siz;
                    460:        volatile u_int32_t      br_resp_lo;             /* response ring */
                    461:        volatile u_int32_t      br_resp_hi;
                    462:        volatile u_int32_t      br_resp_siz;
                    463:        volatile u_int32_t      br_zero_lo;             /* zero word */
                    464:        volatile u_int32_t      br_zero_hi;
                    465:        volatile u_int32_t      br_rxhipri_lo;          /* rx high pri ring */
                    466:        volatile u_int32_t      br_rxhipri_hi;
                    467:        volatile u_int32_t      br_rxhipri_siz;
                    468: };
                    469:
                    470: /*
                    471:  * hostvar structure (shared with typhoon)
                    472:  */
                    473: struct txp_hostvar {
                    474:        volatile u_int32_t      hv_rx_hi_read_idx;      /* host->arm */
                    475:        volatile u_int32_t      hv_rx_lo_read_idx;      /* host->arm */
                    476:        volatile u_int32_t      hv_rx_buf_write_idx;    /* host->arm */
                    477:        volatile u_int32_t      hv_resp_read_idx;       /* host->arm */
                    478:        volatile u_int32_t      hv_tx_lo_desc_read_idx; /* arm->host */
                    479:        volatile u_int32_t      hv_tx_hi_desc_read_idx; /* arm->host */
                    480:        volatile u_int32_t      hv_rx_lo_write_idx;     /* arm->host */
                    481:        volatile u_int32_t      hv_rx_buf_read_idx;     /* arm->host */
                    482:        volatile u_int32_t      hv_cmd_read_idx;        /* arm->host */
                    483:        volatile u_int32_t      hv_resp_write_idx;      /* arm->host */
                    484:        volatile u_int32_t      hv_rx_hi_write_idx;     /* arm->host */
                    485: };
                    486:
                    487: /*
                    488:  * TYPHOON status register state (in TXP_A2H_0)
                    489:  */
                    490: #define        STAT_ROM_CODE                   0x00000001
                    491: #define        STAT_ROM_EEPROM_LOAD            0x00000002
                    492: #define        STAT_WAITING_FOR_BOOT           0x00000007
                    493: #define        STAT_RUNNING                    0x00000009
                    494: #define        STAT_WAITING_FOR_HOST_REQUEST   0x0000000d
                    495: #define        STAT_WAITING_FOR_SEGMENT        0x00000010
                    496: #define        STAT_SLEEPING                   0x00000011
                    497: #define        STAT_HALTED                     0x00000014
                    498:
                    499: #define        TX_ENTRIES                      256
                    500: #define        RX_ENTRIES                      128
                    501: #define        RXBUF_ENTRIES                   256
                    502: #define        CMD_ENTRIES                     32
                    503: #define        RSP_ENTRIES                     32
                    504:
                    505: #define        OFFLOAD_TCPCKSUM                0x00000002      /* tcp checksum */
                    506: #define        OFFLOAD_UDPCKSUM                0x00000004      /* udp checksum */
                    507: #define        OFFLOAD_IPCKSUM                 0x00000008      /* ip checksum */
                    508: #define        OFFLOAD_IPSEC                   0x00000010      /* ipsec enable */
                    509: #define        OFFLOAD_BCAST                   0x00000020      /* broadcast throttle */
                    510: #define        OFFLOAD_DHCP                    0x00000040      /* dhcp prevention */
                    511: #define        OFFLOAD_VLAN                    0x00000080      /* vlan enable */
                    512: #define        OFFLOAD_FILTER                  0x00000100      /* filter enable */
                    513: #define        OFFLOAD_TCPSEG                  0x00000200      /* tcp segmentation */
                    514: #define        OFFLOAD_MASK                    0xfffffffe      /* mask off low bit */
                    515:
                    516: /*
                    517:  * Macros for converting array indices to offsets within the descriptor
                    518:  * arrays.  The chip operates on offsets, but it's much easier for us
                    519:  * to operate on indices.  Assumes descriptor entries are 16 bytes.
                    520:  */
                    521: #define        TXP_IDX2OFFSET(idx)     ((idx) << 4)
                    522: #define        TXP_OFFSET2IDX(off)     ((off) >> 4)
                    523:
                    524: struct txp_dma_alloc {
                    525:        u_int64_t               dma_paddr;
                    526:        caddr_t                 dma_vaddr;
                    527:        bus_dmamap_t            dma_map;
                    528:        bus_dma_segment_t       dma_seg;
                    529:        int                     dma_nseg;
                    530: };
                    531:
                    532: struct txp_cmd_ring {
                    533:        struct txp_cmd_desc     *base;
                    534:        u_int32_t               lastwrite;
                    535:        u_int32_t               size;
                    536: };
                    537:
                    538: struct txp_rsp_ring {
                    539:        struct txp_rsp_desc     *base;
                    540:        u_int32_t               lastwrite;
                    541:        u_int32_t               size;
                    542: };
                    543:
                    544: struct txp_tx_ring {
                    545:        struct txp_tx_desc      *r_desc;        /* base address of descs */
                    546:        u_int32_t               r_reg;          /* register to activate */
                    547:        u_int32_t               r_prod;         /* producer */
                    548:        u_int32_t               r_cons;         /* consumer */
                    549:        u_int32_t               r_cnt;          /* # descs in use */
                    550:        volatile u_int32_t      *r_off;         /* hostvar index pointer */
                    551: };
                    552:
                    553: struct txp_swdesc {
                    554:        struct mbuf *           sd_mbuf;
                    555:        bus_dmamap_t            sd_map;
                    556: };
                    557:
                    558: struct txp_rx_ring {
                    559:        struct txp_rx_desc      *r_desc;        /* base address of descs */
                    560:        volatile u_int32_t      *r_roff;        /* hv read offset ptr */
                    561:        volatile u_int32_t      *r_woff;        /* hv write offset ptr */
                    562: };
                    563:
                    564: struct txp_softc {
                    565:        struct device           sc_dev;         /* base device */
                    566:        struct arpcom           sc_arpcom;      /* ethernet common */
                    567:        struct txp_hostvar      *sc_hostvar;
                    568:        struct txp_boot_record  *sc_boot;
                    569:        bus_space_handle_t      sc_bh;          /* bus handle (regs) */
                    570:        bus_space_tag_t         sc_bt;          /* bus tag (regs) */
                    571:        bus_dma_tag_t           sc_dmat;        /* dma tag */
                    572:        struct txp_cmd_ring     sc_cmdring;
                    573:        struct txp_rsp_ring     sc_rspring;
                    574:        struct txp_swdesc       sc_txd[TX_ENTRIES];
                    575:        void *                  sc_ih;
                    576:        struct timeout          sc_tick;
                    577:        struct ifmedia          sc_ifmedia;
                    578:        struct txp_tx_ring      sc_txhir, sc_txlor;
                    579:        struct txp_rxbuf_desc   *sc_rxbufs;
                    580:        struct txp_rx_ring      sc_rxhir, sc_rxlor;
                    581:        u_int16_t               sc_xcvr;
                    582:        u_int16_t               sc_seq;
                    583:        struct txp_dma_alloc    sc_boot_dma, sc_host_dma, sc_zero_dma;
                    584:        struct txp_dma_alloc    sc_rxhiring_dma, sc_rxloring_dma;
                    585:        struct txp_dma_alloc    sc_txhiring_dma, sc_txloring_dma;
                    586:        struct txp_dma_alloc    sc_cmdring_dma, sc_rspring_dma;
                    587:        struct txp_dma_alloc    sc_rxbufring_dma;
                    588:        int                     sc_cold;
                    589:        u_int32_t               sc_rx_capability, sc_tx_capability;
                    590: };
                    591:
                    592: #define        TXP_DEVNAME(sc)         ((sc)->sc_cold ? "" : (sc)->sc_dev.dv_xname)
                    593:
                    594: struct txp_fw_file_header {
                    595:        u_int8_t        magicid[8];     /* TYPHOON\0 */
                    596:        u_int32_t       version;
                    597:        u_int32_t       nsections;
                    598:        u_int32_t       addr;
                    599: };
                    600:
                    601: struct txp_fw_section_header {
                    602:        u_int32_t       nbytes;
                    603:        u_int16_t       cksum;
                    604:        u_int16_t       reserved;
                    605:        u_int32_t       addr;
                    606: };
                    607:
                    608: #define        TXP_MAX_SEGLEN  0xffff
                    609: #define        TXP_MAX_PKTLEN  0x0800
                    610:
                    611: #define        WRITE_REG(sc,reg,val) \
                    612:     bus_space_write_4((sc)->sc_bt, (sc)->sc_bh, reg, val)
                    613: #define        READ_REG(sc,reg) \
                    614:     bus_space_read_4((sc)->sc_bt, (sc)->sc_bh, reg)
                    615:

CVSweb