vxge_config.h

Go to the documentation of this file.
00001 /*
00002  * vxge-config.h: gPXE driver for Neterion Inc's X3100 Series 10GbE
00003  *              PCIe I/O Virtualized Server Adapter.
00004  *
00005  * Copyright(c) 2002-2010 Neterion Inc.
00006  *
00007  * This software may be used and distributed according to the terms of
00008  * the GNU General Public License (GPL), incorporated herein by
00009  * reference.  Drivers based on or derived from this code fall under
00010  * the GPL and must retain the authorship, copyright and license
00011  * notice.
00012  *
00013  */
00014 
00015 FILE_LICENCE(GPL2_ONLY);
00016 
00017 #ifndef VXGE_CONFIG_H
00018 #define VXGE_CONFIG_H
00019 
00020 #include <stdint.h>
00021 #include <gpxe/list.h>
00022 #include <gpxe/pci.h>
00023 
00024 #ifndef VXGE_CACHE_LINE_SIZE
00025 #define VXGE_CACHE_LINE_SIZE 4096
00026 #endif
00027 
00028 #define WAIT_FACTOR          1
00029 
00030 #ifndef ARRAY_SIZE
00031 #define ARRAY_SIZE(a)  (sizeof(a) / sizeof((a)[0]))
00032 #endif
00033 
00034 #define VXGE_HW_MAC_MAX_WIRE_PORTS      2
00035 #define VXGE_HW_MAC_MAX_AGGR_PORTS      2
00036 #define VXGE_HW_MAC_MAX_PORTS           3
00037 
00038 #define VXGE_HW_MIN_MTU                         68
00039 #define VXGE_HW_MAX_MTU                         9600
00040 #define VXGE_HW_DEFAULT_MTU                     1500
00041 
00042 #ifndef __iomem
00043 #define __iomem
00044 #endif
00045 
00046 #ifndef ____cacheline_aligned
00047 #define ____cacheline_aligned
00048 #endif
00049 
00050 /**
00051  * debug filtering masks
00052  */
00053 #define VXGE_NONE       0x00
00054 #define VXGE_INFO       0x01
00055 #define VXGE_INTR       0x02
00056 #define VXGE_XMIT       0x04
00057 #define VXGE_POLL       0x08
00058 #define VXGE_ERR        0x10
00059 #define VXGE_TRACE      0x20
00060 #define VXGE_ALL        (VXGE_INFO|VXGE_INTR|VXGE_XMIT\
00061                         |VXGE_POLL|VXGE_ERR|VXGE_TRACE)
00062 
00063 #define NULL_VPID                                       0xFFFFFFFF
00064 
00065 #define VXGE_HW_EVENT_BASE                      0
00066 #define VXGE_LL_EVENT_BASE                      100
00067 
00068 #define VXGE_HW_BASE_INF        100
00069 #define VXGE_HW_BASE_ERR        200
00070 #define VXGE_HW_BASE_BADCFG     300
00071 #define VXGE_HW_DEF_DEVICE_POLL_MILLIS            1000
00072 #define VXGE_HW_MAX_PAYLOAD_SIZE_512            2
00073 
00074 enum vxge_hw_status {
00075         VXGE_HW_OK                                = 0,
00076         VXGE_HW_FAIL                              = 1,
00077         VXGE_HW_PENDING                           = 2,
00078         VXGE_HW_COMPLETIONS_REMAIN                = 3,
00079 
00080         VXGE_HW_INF_NO_MORE_COMPLETED_DESCRIPTORS = VXGE_HW_BASE_INF + 1,
00081         VXGE_HW_INF_OUT_OF_DESCRIPTORS            = VXGE_HW_BASE_INF + 2,
00082         VXGE_HW_INF_SW_LRO_BEGIN                  = VXGE_HW_BASE_INF + 3,
00083         VXGE_HW_INF_SW_LRO_CONT                   = VXGE_HW_BASE_INF + 4,
00084         VXGE_HW_INF_SW_LRO_UNCAPABLE              = VXGE_HW_BASE_INF + 5,
00085         VXGE_HW_INF_SW_LRO_FLUSH_SESSION          = VXGE_HW_BASE_INF + 6,
00086         VXGE_HW_INF_SW_LRO_FLUSH_BOTH             = VXGE_HW_BASE_INF + 7,
00087 
00088         VXGE_HW_ERR_INVALID_HANDLE                = VXGE_HW_BASE_ERR + 1,
00089         VXGE_HW_ERR_OUT_OF_MEMORY                 = VXGE_HW_BASE_ERR + 2,
00090         VXGE_HW_ERR_VPATH_NOT_AVAILABLE           = VXGE_HW_BASE_ERR + 3,
00091         VXGE_HW_ERR_VPATH_NOT_OPEN                = VXGE_HW_BASE_ERR + 4,
00092         VXGE_HW_ERR_WRONG_IRQ                     = VXGE_HW_BASE_ERR + 5,
00093         VXGE_HW_ERR_SWAPPER_CTRL                  = VXGE_HW_BASE_ERR + 6,
00094         VXGE_HW_ERR_INVALID_MTU_SIZE              = VXGE_HW_BASE_ERR + 7,
00095         VXGE_HW_ERR_INVALID_INDEX                 = VXGE_HW_BASE_ERR + 8,
00096         VXGE_HW_ERR_INVALID_TYPE                  = VXGE_HW_BASE_ERR + 9,
00097         VXGE_HW_ERR_INVALID_OFFSET                = VXGE_HW_BASE_ERR + 10,
00098         VXGE_HW_ERR_INVALID_DEVICE                = VXGE_HW_BASE_ERR + 11,
00099         VXGE_HW_ERR_VERSION_CONFLICT              = VXGE_HW_BASE_ERR + 12,
00100         VXGE_HW_ERR_INVALID_PCI_INFO              = VXGE_HW_BASE_ERR + 13,
00101         VXGE_HW_ERR_INVALID_TCODE                 = VXGE_HW_BASE_ERR + 14,
00102         VXGE_HW_ERR_INVALID_BLOCK_SIZE            = VXGE_HW_BASE_ERR + 15,
00103         VXGE_HW_ERR_INVALID_STATE                 = VXGE_HW_BASE_ERR + 16,
00104         VXGE_HW_ERR_PRIVILAGED_OPEARATION         = VXGE_HW_BASE_ERR + 17,
00105         VXGE_HW_ERR_INVALID_PORT                  = VXGE_HW_BASE_ERR + 18,
00106         VXGE_HW_ERR_FIFO                          = VXGE_HW_BASE_ERR + 19,
00107         VXGE_HW_ERR_VPATH                         = VXGE_HW_BASE_ERR + 20,
00108         VXGE_HW_ERR_CRITICAL                      = VXGE_HW_BASE_ERR + 21,
00109         VXGE_HW_ERR_SLOT_FREEZE                   = VXGE_HW_BASE_ERR + 22,
00110         VXGE_HW_ERR_INVALID_MIN_BANDWIDTH         = VXGE_HW_BASE_ERR + 25,
00111         VXGE_HW_ERR_INVALID_MAX_BANDWIDTH         = VXGE_HW_BASE_ERR + 26,
00112         VXGE_HW_ERR_INVALID_TOTAL_BANDWIDTH       = VXGE_HW_BASE_ERR + 27,
00113         VXGE_HW_ERR_INVALID_BANDWIDTH_LIMIT       = VXGE_HW_BASE_ERR + 28,
00114         VXGE_HW_ERR_RESET_IN_PROGRESS             = VXGE_HW_BASE_ERR + 29,
00115         VXGE_HW_ERR_OUT_OF_SPACE                  = VXGE_HW_BASE_ERR + 30,
00116         VXGE_HW_ERR_INVALID_FUNC_MODE             = VXGE_HW_BASE_ERR + 31,
00117         VXGE_HW_ERR_INVALID_DP_MODE               = VXGE_HW_BASE_ERR + 32,
00118         VXGE_HW_ERR_INVALID_FAILURE_BEHAVIOUR     = VXGE_HW_BASE_ERR + 33,
00119         VXGE_HW_ERR_INVALID_L2_SWITCH_STATE       = VXGE_HW_BASE_ERR + 34,
00120         VXGE_HW_ERR_INVALID_CATCH_BASIN_MODE      = VXGE_HW_BASE_ERR + 35,
00121 
00122         VXGE_HW_BADCFG_RING_INDICATE_MAX_PKTS     = VXGE_HW_BASE_BADCFG + 1,
00123         VXGE_HW_BADCFG_FIFO_BLOCKS                = VXGE_HW_BASE_BADCFG + 2,
00124         VXGE_HW_BADCFG_VPATH_MTU                  = VXGE_HW_BASE_BADCFG + 3,
00125         VXGE_HW_BADCFG_VPATH_RPA_STRIP_VLAN_TAG   = VXGE_HW_BASE_BADCFG + 4,
00126         VXGE_HW_BADCFG_VPATH_MIN_BANDWIDTH        = VXGE_HW_BASE_BADCFG + 5,
00127         VXGE_HW_BADCFG_VPATH_BANDWIDTH_LIMIT      = VXGE_HW_BASE_BADCFG + 6,
00128         VXGE_HW_BADCFG_INTR_MODE                  = VXGE_HW_BASE_BADCFG + 7,
00129         VXGE_HW_BADCFG_RTS_MAC_EN                 = VXGE_HW_BASE_BADCFG + 8,
00130         VXGE_HW_BADCFG_VPATH_AGGR_ACK             = VXGE_HW_BASE_BADCFG + 9,
00131         VXGE_HW_BADCFG_VPATH_PRIORITY             = VXGE_HW_BASE_BADCFG + 10,
00132 
00133         VXGE_HW_EOF_TRACE_BUF                     = -1
00134 };
00135 
00136 /**
00137  * enum enum vxge_hw_device_link_state - Link state enumeration.
00138  * @VXGE_HW_LINK_NONE: Invalid link state.
00139  * @VXGE_HW_LINK_DOWN: Link is down.
00140  * @VXGE_HW_LINK_UP: Link is up.
00141  *
00142  */
00143 enum vxge_hw_device_link_state {
00144         VXGE_HW_LINK_NONE,
00145         VXGE_HW_LINK_DOWN,
00146         VXGE_HW_LINK_UP
00147 };
00148 
00149 /*forward declaration*/
00150 struct vxge_vpath;
00151 struct __vxge_hw_virtualpath;
00152 
00153 /**
00154  * struct vxge_hw_ring_rxd_1 - One buffer mode RxD for ring
00155  *
00156  * One buffer mode RxD for ring structure
00157  */
00158 struct vxge_hw_ring_rxd_1 {
00159         u64 host_control;
00160         u64 control_0;
00161 #define VXGE_HW_RING_RXD_RTH_BUCKET_GET(ctrl0)          vxge_bVALn(ctrl0, 0, 7)
00162 
00163 #define VXGE_HW_RING_RXD_LIST_OWN_ADAPTER               vxge_mBIT(7)
00164 
00165 #define VXGE_HW_RING_RXD_FAST_PATH_ELIGIBLE_GET(ctrl0)  vxge_bVALn(ctrl0, 8, 1)
00166 
00167 #define VXGE_HW_RING_RXD_L3_CKSUM_CORRECT_GET(ctrl0)    vxge_bVALn(ctrl0, 9, 1)
00168 
00169 #define VXGE_HW_RING_RXD_L4_CKSUM_CORRECT_GET(ctrl0)    vxge_bVALn(ctrl0, 10, 1)
00170 
00171 #define VXGE_HW_RING_RXD_T_CODE_GET(ctrl0)              vxge_bVALn(ctrl0, 12, 4)
00172 #define VXGE_HW_RING_RXD_T_CODE(val)                    vxge_vBIT(val, 12, 4)
00173 
00174 #define VXGE_HW_RING_RXD_T_CODE_UNUSED          VXGE_HW_RING_T_CODE_UNUSED
00175 
00176 #define VXGE_HW_RING_RXD_SYN_GET(ctrl0)         vxge_bVALn(ctrl0, 16, 1)
00177 
00178 #define VXGE_HW_RING_RXD_IS_ICMP_GET(ctrl0)             vxge_bVALn(ctrl0, 17, 1)
00179 
00180 #define VXGE_HW_RING_RXD_RTH_SPDM_HIT_GET(ctrl0)        vxge_bVALn(ctrl0, 18, 1)
00181 
00182 #define VXGE_HW_RING_RXD_RTH_IT_HIT_GET(ctrl0)          vxge_bVALn(ctrl0, 19, 1)
00183 
00184 #define VXGE_HW_RING_RXD_RTH_HASH_TYPE_GET(ctrl0)       vxge_bVALn(ctrl0, 20, 4)
00185 
00186 #define VXGE_HW_RING_RXD_IS_VLAN_GET(ctrl0)             vxge_bVALn(ctrl0, 24, 1)
00187 
00188 #define VXGE_HW_RING_RXD_ETHER_ENCAP_GET(ctrl0)         vxge_bVALn(ctrl0, 25, 2)
00189 
00190 #define VXGE_HW_RING_RXD_FRAME_PROTO_GET(ctrl0)         vxge_bVALn(ctrl0, 27, 5)
00191 
00192 #define VXGE_HW_RING_RXD_L3_CKSUM_GET(ctrl0)    vxge_bVALn(ctrl0, 32, 16)
00193 
00194 #define VXGE_HW_RING_RXD_L4_CKSUM_GET(ctrl0)    vxge_bVALn(ctrl0, 48, 16)
00195 
00196         u64 control_1;
00197 
00198 #define VXGE_HW_RING_RXD_1_BUFFER0_SIZE_GET(ctrl1)      vxge_bVALn(ctrl1, 2, 14)
00199 #define VXGE_HW_RING_RXD_1_BUFFER0_SIZE(val) vxge_vBIT(val, 2, 14)
00200 #define VXGE_HW_RING_RXD_1_BUFFER0_SIZE_MASK            vxge_vBIT(0x3FFF, 2, 14)
00201 
00202 #define VXGE_HW_RING_RXD_1_RTH_HASH_VAL_GET(ctrl1)    vxge_bVALn(ctrl1, 16, 32)
00203 
00204 #define VXGE_HW_RING_RXD_VLAN_TAG_GET(ctrl1)    vxge_bVALn(ctrl1, 48, 16)
00205 
00206         u64 buffer0_ptr;
00207 };
00208 
00209 /**
00210  * struct vxge_hw_fifo_txd - Transmit Descriptor
00211  *
00212  * Transmit descriptor (TxD).Fifo descriptor contains configured number
00213  * (list) of TxDs. * For more details please refer to Titan User Guide,
00214  * Section 5.4.2 "Transmit Descriptor (TxD) Format".
00215  */
00216 struct vxge_hw_fifo_txd {
00217         u64 control_0;
00218 #define VXGE_HW_FIFO_TXD_LIST_OWN_ADAPTER               vxge_mBIT(7)
00219 
00220 #define VXGE_HW_FIFO_TXD_T_CODE_GET(ctrl0)              vxge_bVALn(ctrl0, 12, 4)
00221 #define VXGE_HW_FIFO_TXD_T_CODE(val)                    vxge_vBIT(val, 12, 4)
00222 #define VXGE_HW_FIFO_TXD_T_CODE_UNUSED          VXGE_HW_FIFO_T_CODE_UNUSED
00223 
00224 #define VXGE_HW_FIFO_TXD_GATHER_CODE(val)               vxge_vBIT(val, 22, 2)
00225 #define VXGE_HW_FIFO_TXD_GATHER_CODE_FIRST      VXGE_HW_FIFO_GATHER_CODE_FIRST
00226 #define VXGE_HW_FIFO_TXD_GATHER_CODE_LAST       VXGE_HW_FIFO_GATHER_CODE_LAST
00227 
00228 #define VXGE_HW_FIFO_TXD_LSO_EN                         vxge_mBIT(30)
00229 #define VXGE_HW_FIFO_TXD_LSO_MSS(val)                   vxge_vBIT(val, 34, 14)
00230 #define VXGE_HW_FIFO_TXD_BUFFER_SIZE(val)               vxge_vBIT(val, 48, 16)
00231 
00232         u64 control_1;
00233 #define VXGE_HW_FIFO_TXD_TX_CKO_IPV4_EN                 vxge_mBIT(5)
00234 #define VXGE_HW_FIFO_TXD_TX_CKO_TCP_EN                  vxge_mBIT(6)
00235 #define VXGE_HW_FIFO_TXD_TX_CKO_UDP_EN                  vxge_mBIT(7)
00236 #define VXGE_HW_FIFO_TXD_VLAN_ENABLE                    vxge_mBIT(15)
00237 
00238 #define VXGE_HW_FIFO_TXD_VLAN_TAG(val)                  vxge_vBIT(val, 16, 16)
00239 #define VXGE_HW_FIFO_TXD_NO_BW_LIMIT                    vxge_mBIT(43)
00240 
00241 #define VXGE_HW_FIFO_TXD_INT_NUMBER(val)                vxge_vBIT(val, 34, 6)
00242 
00243 #define VXGE_HW_FIFO_TXD_INT_TYPE_PER_LIST              vxge_mBIT(46)
00244 #define VXGE_HW_FIFO_TXD_INT_TYPE_UTILZ                 vxge_mBIT(47)
00245 
00246         u64 buffer_pointer;
00247 
00248         u64 host_control;
00249 };
00250 
00251 /**
00252  * struct vxge_hw_device_date - Date Format
00253  * @day: Day
00254  * @month: Month
00255  * @year: Year
00256  * @date: Date in string format
00257  *
00258  * Structure for returning date
00259  */
00260 
00261 #define VXGE_HW_FW_STRLEN       32
00262 struct vxge_hw_device_date {
00263         u32     day;
00264         u32     month;
00265         u32     year;
00266         char    date[VXGE_HW_FW_STRLEN];
00267 };
00268 
00269 struct vxge_hw_device_version {
00270         u32     major;
00271         u32     minor;
00272         u32     build;
00273         char    version[VXGE_HW_FW_STRLEN];
00274 };
00275 
00276 u64 __vxge_hw_vpath_pci_func_mode_get(
00277         u32 vp_id,
00278         struct vxge_hw_vpath_reg __iomem *vpath_reg);
00279 
00280 /*
00281  * struct __vxge_hw_non_offload_db_wrapper - Non-offload Doorbell Wrapper
00282  * @control_0: Bits 0 to 7 - Doorbell type.
00283  *             Bits 8 to 31 - Reserved.
00284  *             Bits 32 to 39 - The highest TxD in this TxDL.
00285  *             Bits 40 to 47 - Reserved.
00286  *             Bits 48 to 55 - Reserved.
00287  *             Bits 56 to 63 - No snoop flags.
00288  * @txdl_ptr:  The starting location of the TxDL in host memory.
00289  *
00290  * Created by the host and written to the adapter via PIO to a Kernel Doorbell
00291  * FIFO. All non-offload doorbell wrapper fields must be written by the host as
00292  * part of a doorbell write. Consumed by the adapter but is not written by the
00293  * adapter.
00294  */
00295 struct __vxge_hw_non_offload_db_wrapper {
00296         u64             control_0;
00297 #define VXGE_HW_NODBW_GET_TYPE(ctrl0)                   vxge_bVALn(ctrl0, 0, 8)
00298 #define VXGE_HW_NODBW_TYPE(val) vxge_vBIT(val, 0, 8)
00299 #define VXGE_HW_NODBW_TYPE_NODBW                                0
00300 
00301 #define VXGE_HW_NODBW_GET_LAST_TXD_NUMBER(ctrl0)        vxge_bVALn(ctrl0, 32, 8)
00302 #define VXGE_HW_NODBW_LAST_TXD_NUMBER(val) vxge_vBIT(val, 32, 8)
00303 
00304 #define VXGE_HW_NODBW_GET_NO_SNOOP(ctrl0)               vxge_bVALn(ctrl0, 56, 8)
00305 #define VXGE_HW_NODBW_LIST_NO_SNOOP(val) vxge_vBIT(val, 56, 8)
00306 #define VXGE_HW_NODBW_LIST_NO_SNOOP_TXD_READ_TXD0_WRITE         0x2
00307 #define VXGE_HW_NODBW_LIST_NO_SNOOP_TX_FRAME_DATA_READ          0x1
00308 
00309         u64             txdl_ptr;
00310 };
00311 
00312 /*
00313  * struct __vxge_hw_fifo - Fifo.
00314  * @vp_id: Virtual path id
00315  * @tx_intr_num: Interrupt Number associated with the TX
00316  * @txdl: Start pointer of the txdl list of this fifo.
00317  *        gPxe does not support tx fragmentation, so we need
00318  *        only one txd in a list
00319  * @depth: total number of lists in this fifo
00320  * @hw_offset: txd index from where adapter owns the txd list
00321  * @sw_offset: txd index from where driver owns the txd list
00322  *
00323  * @stats: Statistics of this fifo
00324  *
00325  */
00326 struct __vxge_hw_fifo {
00327         struct vxge_hw_vpath_reg                *vp_reg;
00328         struct __vxge_hw_non_offload_db_wrapper *nofl_db;
00329         u32                                     vp_id;
00330         u32                                     tx_intr_num;
00331 
00332         struct vxge_hw_fifo_txd         *txdl;
00333 #define VXGE_HW_FIFO_TXD_DEPTH 128
00334         u16                             depth;
00335         u16                             hw_offset;
00336         u16                             sw_offset;
00337 
00338         struct __vxge_hw_virtualpath    *vpathh;
00339 };
00340 
00341 /* Structure that represents the Rx descriptor block which contains
00342  * 128 Rx descriptors.
00343  */
00344 struct __vxge_hw_ring_block {
00345 #define VXGE_HW_MAX_RXDS_PER_BLOCK_1            127
00346         struct vxge_hw_ring_rxd_1 rxd[VXGE_HW_MAX_RXDS_PER_BLOCK_1];
00347 
00348         u64 reserved_0;
00349 #define END_OF_BLOCK    0xFEFFFFFFFFFFFFFFULL
00350         /* 0xFEFFFFFFFFFFFFFF to mark last Rxd in this blk */
00351         u64 reserved_1;
00352         /* Logical ptr to next */
00353         u64 reserved_2_pNext_RxD_block;
00354         /* Buff0_ptr.In a 32 bit arch the upper 32 bits should be 0 */
00355         u64 pNext_RxD_Blk_physical;
00356 };
00357 
00358 /*
00359  * struct __vxge_hw_ring - Ring channel.
00360  *
00361  * Note: The structure is cache line aligned to better utilize
00362  *       CPU cache performance.
00363  */
00364 struct __vxge_hw_ring {
00365         struct vxge_hw_vpath_reg                *vp_reg;
00366         struct vxge_hw_common_reg               *common_reg;
00367         u32                                     vp_id;
00368 #define VXGE_HW_RING_RXD_QWORDS_MODE_1  4
00369         u32                                     doorbell_cnt;
00370         u32                                     total_db_cnt;
00371 #define VXGE_HW_RING_RXD_QWORD_LIMIT    16
00372         u64                                     rxd_qword_limit;
00373 
00374         struct __vxge_hw_ring_block             *rxdl;
00375 #define VXGE_HW_RING_BUF_PER_BLOCK      9
00376         u16                                     buf_per_block;
00377         u16                                     rxd_offset;
00378 
00379 #define VXGE_HW_RING_RX_POLL_WEIGHT     8
00380         u16                                     rx_poll_weight;
00381 
00382         struct io_buffer *iobuf[VXGE_HW_RING_BUF_PER_BLOCK + 1];
00383         struct __vxge_hw_virtualpath *vpathh;
00384 };
00385 
00386 /*
00387  * struct __vxge_hw_virtualpath - Virtual Path
00388  *
00389  * Virtual path structure to encapsulate the data related to a virtual path.
00390  * Virtual paths are allocated by the HW upon getting configuration from the
00391  * driver and inserted into the list of virtual paths.
00392  */
00393 struct __vxge_hw_virtualpath {
00394         u32                             vp_id;
00395 
00396         u32                             vp_open;
00397 #define VXGE_HW_VP_NOT_OPEN     0
00398 #define VXGE_HW_VP_OPEN         1
00399 
00400         struct __vxge_hw_device         *hldev;
00401         struct vxge_hw_vpath_reg        *vp_reg;
00402         struct vxge_hw_vpmgmt_reg       *vpmgmt_reg;
00403         struct __vxge_hw_non_offload_db_wrapper *nofl_db;
00404 
00405         u32                             max_mtu;
00406         u32                             vsport_number;
00407         u32                             max_kdfc_db;
00408         u32                             max_nofl_db;
00409 
00410         struct __vxge_hw_ring ringh;
00411         struct __vxge_hw_fifo fifoh;
00412 };
00413 #define VXGE_HW_INFO_LEN        64
00414 #define VXGE_HW_PMD_INFO_LEN    16
00415 #define VXGE_MAX_PRINT_BUF_SIZE 128
00416 /**
00417  * struct vxge_hw_device_hw_info - Device information
00418  * @host_type: Host Type
00419  * @func_id: Function Id
00420  * @vpath_mask: vpath bit mask
00421  * @fw_version: Firmware version
00422  * @fw_date: Firmware Date
00423  * @flash_version: Firmware version
00424  * @flash_date: Firmware Date
00425  * @mac_addrs: Mac addresses for each vpath
00426  * @mac_addr_masks: Mac address masks for each vpath
00427  *
00428  * Returns the vpath mask that has the bits set for each vpath allocated
00429  * for the driver and the first mac address for each vpath
00430  */
00431 struct vxge_hw_device_hw_info {
00432         u32             host_type;
00433 #define VXGE_HW_NO_MR_NO_SR_NORMAL_FUNCTION                     0
00434 #define VXGE_HW_MR_NO_SR_VH0_BASE_FUNCTION                      1
00435 #define VXGE_HW_NO_MR_SR_VH0_FUNCTION0                          2
00436 #define VXGE_HW_NO_MR_SR_VH0_VIRTUAL_FUNCTION                   3
00437 #define VXGE_HW_MR_SR_VH0_INVALID_CONFIG                        4
00438 #define VXGE_HW_SR_VH_FUNCTION0                                 5
00439 #define VXGE_HW_SR_VH_VIRTUAL_FUNCTION                          6
00440 #define VXGE_HW_VH_NORMAL_FUNCTION                              7
00441         u64             function_mode;
00442 #define VXGE_HW_FUNCTION_MODE_MIN                               0
00443 #define VXGE_HW_FUNCTION_MODE_MAX                               10
00444 
00445 #define VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION                   0
00446 #define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION                    1
00447 #define VXGE_HW_FUNCTION_MODE_SRIOV                             2
00448 #define VXGE_HW_FUNCTION_MODE_MRIOV                             3
00449 #define VXGE_HW_FUNCTION_MODE_MRIOV_8                           4
00450 #define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_17                 5
00451 #define VXGE_HW_FUNCTION_MODE_SRIOV_8                           6
00452 #define VXGE_HW_FUNCTION_MODE_SRIOV_4                           7
00453 #define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_2                  8
00454 #define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_4                  9
00455 #define VXGE_HW_FUNCTION_MODE_MRIOV_4                           10
00456 
00457         u32             func_id;
00458         u64             vpath_mask;
00459         struct vxge_hw_device_version fw_version;
00460         struct vxge_hw_device_date    fw_date;
00461         struct vxge_hw_device_version flash_version;
00462         struct vxge_hw_device_date    flash_date;
00463         u8              serial_number[VXGE_HW_INFO_LEN];
00464         u8              part_number[VXGE_HW_INFO_LEN];
00465         u8              product_desc[VXGE_HW_INFO_LEN];
00466         u8 (mac_addrs)[VXGE_HW_MAX_VIRTUAL_PATHS][ETH_ALEN];
00467         u8 (mac_addr_masks)[VXGE_HW_MAX_VIRTUAL_PATHS][ETH_ALEN];
00468 };
00469 
00470 /**
00471  * struct __vxge_hw_device  - Hal device object
00472  * @magic: Magic Number
00473  * @bar0: BAR0 virtual address.
00474  * @pdev: Physical device handle
00475  * @config: Confguration passed by the LL driver at initialization
00476  * @link_state: Link state
00477  *
00478  * HW device object. Represents Titan adapter
00479  */
00480 struct __vxge_hw_device {
00481         u32                             magic;
00482 #define VXGE_HW_DEVICE_MAGIC            0x12345678
00483 #define VXGE_HW_DEVICE_DEAD             0xDEADDEAD
00484         void __iomem                    *bar0;
00485         struct pci_device               *pdev;
00486         struct net_device               *ndev;
00487         struct vxgedev                  *vdev;
00488 
00489         enum vxge_hw_device_link_state  link_state;
00490 
00491         u32                             host_type;
00492         u32                             func_id;
00493         u8                              titan1;
00494         u32                             access_rights;
00495 #define VXGE_HW_DEVICE_ACCESS_RIGHT_VPATH      0x1
00496 #define VXGE_HW_DEVICE_ACCESS_RIGHT_SRPCIM     0x2
00497 #define VXGE_HW_DEVICE_ACCESS_RIGHT_MRPCIM     0x4
00498         struct vxge_hw_legacy_reg       *legacy_reg;
00499         struct vxge_hw_toc_reg          *toc_reg;
00500         struct vxge_hw_common_reg       *common_reg;
00501         struct vxge_hw_mrpcim_reg       *mrpcim_reg;
00502         struct vxge_hw_srpcim_reg       *srpcim_reg \
00503                                         [VXGE_HW_TITAN_SRPCIM_REG_SPACES];
00504         struct vxge_hw_vpmgmt_reg       *vpmgmt_reg \
00505                                         [VXGE_HW_TITAN_VPMGMT_REG_SPACES];
00506         struct vxge_hw_vpath_reg        *vpath_reg \
00507                                         [VXGE_HW_TITAN_VPATH_REG_SPACES];
00508         u8                              *kdfc;
00509         u8                              *usdc;
00510         struct __vxge_hw_virtualpath    virtual_path;
00511         u64                             vpath_assignments;
00512         u64                             vpaths_deployed;
00513         u32                             first_vp_id;
00514         u64                             tim_int_mask0[4];
00515         u32                             tim_int_mask1[4];
00516 
00517         struct vxge_hw_device_hw_info   hw_info;
00518 };
00519 
00520 #define VXGE_HW_DEVICE_LINK_STATE_SET(hldev, ls) (hldev->link_state = ls)
00521 
00522 #define VXGE_HW_DEVICE_TIM_INT_MASK_SET(m0, m1, i) {    \
00523         if (i < 16) {                                   \
00524                 m0[0] |= vxge_vBIT(0x8, (i*4), 4);      \
00525                 m0[1] |= vxge_vBIT(0x4, (i*4), 4);      \
00526         }                                       \
00527         else {                                  \
00528                 m1[0] = 0x80000000;             \
00529                 m1[1] = 0x40000000;             \
00530         }                                       \
00531 }
00532 
00533 #define VXGE_HW_DEVICE_TIM_INT_MASK_RESET(m0, m1, i) {  \
00534         if (i < 16) {                                   \
00535                 m0[0] &= ~vxge_vBIT(0x8, (i*4), 4);     \
00536                 m0[1] &= ~vxge_vBIT(0x4, (i*4), 4);     \
00537         }                                               \
00538         else {                                          \
00539                 m1[0] = 0;                              \
00540                 m1[1] = 0;                              \
00541         }                                               \
00542 }
00543 
00544 /**
00545  * enum enum vxge_hw_txdl_state - Descriptor (TXDL) state.
00546  * @VXGE_HW_TXDL_STATE_NONE: Invalid state.
00547  * @VXGE_HW_TXDL_STATE_AVAIL: Descriptor is available for reservation.
00548  * @VXGE_HW_TXDL_STATE_POSTED: Descriptor is posted for processing by the
00549  * device.
00550  * @VXGE_HW_TXDL_STATE_FREED: Descriptor is free and can be reused for
00551  * filling-in and posting later.
00552  *
00553  * Titan/HW descriptor states.
00554  *
00555  */
00556 enum vxge_hw_txdl_state {
00557         VXGE_HW_TXDL_STATE_NONE = 0,
00558         VXGE_HW_TXDL_STATE_AVAIL        = 1,
00559         VXGE_HW_TXDL_STATE_POSTED       = 2,
00560         VXGE_HW_TXDL_STATE_FREED        = 3
00561 };
00562 
00563 
00564 /* fifo and ring circular buffer offset tracking apis */
00565 static inline void __vxge_hw_desc_offset_up(u16 upper_limit,
00566                         u16 *offset)
00567 {
00568         if (++(*offset) >= upper_limit)
00569                 *offset = 0;
00570 }
00571 
00572 /* rxd offset handling apis */
00573 static inline void vxge_hw_ring_rxd_offset_up(u16 *offset)
00574 {
00575         __vxge_hw_desc_offset_up(VXGE_HW_MAX_RXDS_PER_BLOCK_1,
00576                         offset);
00577 }
00578 /* txd offset handling apis */
00579 static inline void vxge_hw_fifo_txd_offset_up(u16 *offset)
00580 {
00581         __vxge_hw_desc_offset_up(VXGE_HW_FIFO_TXD_DEPTH, offset);
00582 }
00583 
00584 /**
00585  * vxge_hw_ring_rxd_1b_set - Prepare 1-buffer-mode descriptor.
00586  * @rxdh: Descriptor handle.
00587  * @dma_pointer: DMA address of a single receive buffer this descriptor
00588  * should carry. Note that by the time vxge_hw_ring_rxd_1b_set is called,
00589  * the receive buffer should be already mapped to the device
00590  * @size: Size of the receive @dma_pointer buffer.
00591  *
00592  * Prepare 1-buffer-mode Rx     descriptor for posting
00593  * (via vxge_hw_ring_rxd_post()).
00594  *
00595  * This inline helper-function does not return any parameters and always
00596  * succeeds.
00597  *
00598  */
00599 static inline
00600 void vxge_hw_ring_rxd_1b_set(struct vxge_hw_ring_rxd_1 *rxdp,
00601         struct io_buffer *iob, u32 size)
00602 {
00603         rxdp->host_control = (intptr_t)(iob);
00604         rxdp->buffer0_ptr = virt_to_bus(iob->data);
00605         rxdp->control_1 &= ~VXGE_HW_RING_RXD_1_BUFFER0_SIZE_MASK;
00606         rxdp->control_1 |= VXGE_HW_RING_RXD_1_BUFFER0_SIZE(size);
00607 }
00608 
00609 enum vxge_hw_status vxge_hw_device_hw_info_get(
00610         void __iomem *bar0,
00611         struct vxge_hw_device_hw_info *hw_info);
00612 
00613 enum vxge_hw_status
00614 __vxge_hw_vpath_fw_ver_get(
00615         struct vxge_hw_vpath_reg __iomem *vpath_reg,
00616         struct vxge_hw_device_hw_info *hw_info);
00617 
00618 enum vxge_hw_status
00619 __vxge_hw_vpath_card_info_get(
00620         struct vxge_hw_vpath_reg __iomem *vpath_reg,
00621         struct vxge_hw_device_hw_info *hw_info);
00622 
00623 /**
00624  * vxge_hw_device_link_state_get - Get link state.
00625  * @devh: HW device handle.
00626  *
00627  * Get link state.
00628  * Returns: link state.
00629  */
00630 static inline
00631 enum vxge_hw_device_link_state vxge_hw_device_link_state_get(
00632         struct __vxge_hw_device *devh)
00633 {
00634         return devh->link_state;
00635 }
00636 
00637 void vxge_hw_device_terminate(struct __vxge_hw_device *devh);
00638 
00639 enum vxge_hw_status vxge_hw_device_initialize(
00640         struct __vxge_hw_device **devh,
00641         void *bar0,
00642         struct pci_device *pdev,
00643         u8 titan1);
00644 
00645 enum vxge_hw_status
00646 vxge_hw_vpath_open(struct __vxge_hw_device *hldev, struct vxge_vpath *vpath);
00647 
00648 enum vxge_hw_status
00649 __vxge_hw_device_vpath_reset_in_prog_check(u64 __iomem *vpath_rst_in_prog);
00650 
00651 enum vxge_hw_status vxge_hw_vpath_close(struct __vxge_hw_virtualpath *vpath);
00652 
00653 enum vxge_hw_status vxge_hw_vpath_reset(struct __vxge_hw_virtualpath *vpath);
00654 
00655 enum vxge_hw_status
00656 vxge_hw_vpath_recover_from_reset(struct __vxge_hw_virtualpath *vpath);
00657 
00658 void
00659 vxge_hw_vpath_enable(struct __vxge_hw_virtualpath *vpath);
00660 
00661 enum vxge_hw_status
00662 vxge_hw_vpath_mtu_set(struct __vxge_hw_virtualpath *vpath, u32 new_mtu);
00663 
00664 void
00665 vxge_hw_vpath_rx_doorbell_init(struct __vxge_hw_virtualpath *vpath);
00666 
00667 void
00668 __vxge_hw_device_pci_e_init(struct __vxge_hw_device *hldev);
00669 
00670 enum vxge_hw_status
00671 __vxge_hw_legacy_swapper_set(struct vxge_hw_legacy_reg __iomem *legacy_reg);
00672 
00673 enum vxge_hw_status
00674 __vxge_hw_vpath_swapper_set(struct vxge_hw_vpath_reg __iomem *vpath_reg);
00675 
00676 enum vxge_hw_status
00677 __vxge_hw_kdfc_swapper_set(struct vxge_hw_legacy_reg __iomem *legacy_reg,
00678         struct vxge_hw_vpath_reg __iomem *vpath_reg);
00679 
00680 enum vxge_hw_status
00681 __vxge_hw_device_register_poll(
00682         void __iomem    *reg,
00683         u64 mask, u32 max_millis);
00684 
00685 #ifndef readq
00686 static inline u64 readq(void __iomem *addr)
00687 {
00688         u64 ret = 0;
00689         ret = readl(addr + 4);
00690         ret <<= 32;
00691         ret |= readl(addr);
00692 
00693         return ret;
00694 }
00695 #endif
00696 
00697 #ifndef writeq
00698 static inline void writeq(u64 val, void __iomem *addr)
00699 {
00700         writel((u32) (val), addr);
00701         writel((u32) (val >> 32), (addr + 4));
00702 }
00703 #endif
00704 
00705 static inline void __vxge_hw_pio_mem_write32_upper(u32 val, void __iomem *addr)
00706 {
00707         writel(val, addr + 4);
00708 }
00709 
00710 static inline void __vxge_hw_pio_mem_write32_lower(u32 val, void __iomem *addr)
00711 {
00712         writel(val, addr);
00713 }
00714 
00715 static inline enum vxge_hw_status
00716 __vxge_hw_pio_mem_write64(u64 val64, void __iomem *addr,
00717                           u64 mask, u32 max_millis)
00718 {
00719         enum vxge_hw_status status = VXGE_HW_OK;
00720 
00721         __vxge_hw_pio_mem_write32_lower((u32)vxge_bVALn(val64, 32, 32), addr);
00722         wmb();
00723         __vxge_hw_pio_mem_write32_upper((u32)vxge_bVALn(val64, 0, 32), addr);
00724         wmb();
00725 
00726         status = __vxge_hw_device_register_poll(addr, mask, max_millis);
00727         return status;
00728 }
00729 
00730 struct vxge_hw_toc_reg __iomem *
00731 __vxge_hw_device_toc_get(void __iomem *bar0);
00732 
00733 enum vxge_hw_status
00734 __vxge_hw_device_reg_addr_get(struct __vxge_hw_device *hldev);
00735 
00736 void
00737 __vxge_hw_device_host_info_get(struct __vxge_hw_device *hldev);
00738 
00739 enum vxge_hw_status
00740 __vxge_hw_device_initialize(struct __vxge_hw_device *hldev);
00741 
00742 enum vxge_hw_status
00743 __vxge_hw_vpath_pci_read(
00744         struct __vxge_hw_virtualpath    *vpath,
00745         u32                     phy_func_0,
00746         u32                     offset,
00747         u32                     *val);
00748 
00749 enum vxge_hw_status
00750 __vxge_hw_vpath_addr_get(
00751         struct vxge_hw_vpath_reg __iomem *vpath_reg,
00752         u8 (macaddr)[ETH_ALEN],
00753         u8 (macaddr_mask)[ETH_ALEN]);
00754 
00755 u32
00756 __vxge_hw_vpath_func_id_get(struct vxge_hw_vpmgmt_reg __iomem *vpmgmt_reg);
00757 
00758 enum vxge_hw_status
00759 __vxge_hw_vpath_reset_check(struct __vxge_hw_virtualpath *vpath);
00760 
00761 enum vxge_hw_status
00762 vxge_hw_vpath_strip_fcs_check(struct __vxge_hw_device *hldev, u64 vpath_mask);
00763 
00764 /**
00765  * vxge_debug
00766  * @mask: mask for the debug
00767  * @fmt: printf like format string
00768  */
00769 static const u16 debug_filter = VXGE_ERR;
00770 #define vxge_debug(mask, fmt...)        do {    \
00771                 if (debug_filter & mask)        \
00772                         DBG(fmt);               \
00773         } while (0);
00774 
00775 #define vxge_trace()    vxge_debug(VXGE_TRACE, "%s:%d\n", __func__, __LINE__);
00776 
00777 enum vxge_hw_status
00778 vxge_hw_get_func_mode(struct __vxge_hw_device *hldev, u32 *func_mode);
00779 
00780 enum vxge_hw_status
00781 vxge_hw_set_fw_api(struct __vxge_hw_device *hldev,
00782                 u64 vp_id, u32 action,
00783                 u32 offset, u64 data0, u64 data1);
00784 void
00785 vxge_hw_vpath_set_zero_rx_frm_len(struct __vxge_hw_device *hldev);
00786 
00787 #endif

Generated on Tue Apr 6 20:01:05 2010 for gPXE by  doxygen 1.5.7.1