00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 FILE_LICENCE ( GPL2_ONLY );
00035
00036 #ifndef H_MTNIC_IF_DEFS_H
00037 #define H_MTNIC_IF_DEFS_H
00038
00039
00040
00041
00042
00043
00044 #define MTNIC_MAX_PORTS 2
00045 #define MTNIC_PORT1 0
00046 #define MTNIC_PORT2 1
00047 #define NUM_TX_RINGS 1
00048 #define NUM_RX_RINGS 1
00049 #define NUM_CQS (NUM_RX_RINGS + NUM_TX_RINGS)
00050 #define GO_BIT_TIMEOUT 6000
00051 #define TBIT_RETRIES 100
00052 #define UNITS_BUFFER_SIZE 8
00053 #define MAX_GAP_PROD_CONS ( UNITS_BUFFER_SIZE / 4 )
00054 #define ETH_DEF_LEN 1540
00055 #define ETH_FCS_LEN 14
00056 #define DEF_MTU ETH_DEF_LEN + ETH_FCS_LEN
00057 #define DEF_IOBUF_SIZE ETH_DEF_LEN
00058
00059 #define MAC_ADDRESS_SIZE 6
00060 #define NUM_EQES 16
00061 #define ROUND_TO_CHECK 0x400
00062
00063 #define DELAY_LINK_CHECK 300
00064 #define CHECK_LINK_TIMES 7
00065
00066
00067 #define XNOR(x,y) (!(x) == !(y))
00068 #define dma_addr_t unsigned long
00069 #define PAGE_SIZE 4096
00070 #define PAGE_MASK (PAGE_SIZE - 1)
00071 #define MTNIC_MAILBOX_SIZE PAGE_SIZE
00072
00073
00074
00075
00076
00077 #define MTNIC_BC_OFF(bc) ((bc) >> 8)
00078 #define MTNIC_BC_SZ(bc) ((bc) & 0xff)
00079 #define MTNIC_BC_ONES(size) (~((int)0x80000000 >> (31 - size)))
00080 #define MTNIC_BC_MASK(bc) \
00081 (MTNIC_BC_ONES(MTNIC_BC_SZ(bc)) << MTNIC_BC_OFF(bc))
00082 #define MTNIC_BC_VAL(val, bc) \
00083 (((val) & MTNIC_BC_ONES(MTNIC_BC_SZ(bc))) << MTNIC_BC_OFF(bc))
00084
00085
00086
00087
00088
00089 #define MTNIC_BC(off, size) ((off << 8) | (size & 0xff))
00090
00091
00092 #define MTNIC_BC_GET(x, bc) \
00093 (((x) >> MTNIC_BC_OFF(bc)) & MTNIC_BC_ONES(MTNIC_BC_SZ(bc)))
00094
00095
00096 #define MTNIC_BC_SET(x, val, bc) \
00097 ((x) = ((x) & ~MTNIC_BC_MASK(bc)) | MTNIC_BC_VAL(val, bc))
00098
00099
00100 #define MTNIC_BC_PUT(x, val, bc) ((x) |= MTNIC_BC_VAL(val, bc))
00101
00102
00103
00104
00105
00106
00107 typedef enum mtnic_if_cmd {
00108
00109 MTNIC_IF_CMD_QUERY_FW = 0x004,
00110 MTNIC_IF_CMD_MAP_FW = 0xfff,
00111 MTNIC_IF_CMD_RUN_FW = 0xff6,
00112 MTNIC_IF_CMD_QUERY_CAP = 0x001,
00113 MTNIC_IF_CMD_MAP_PAGES = 0x002,
00114 MTNIC_IF_CMD_OPEN_NIC = 0x003,
00115 MTNIC_IF_CMD_CONFIG_RX = 0x005,
00116 MTNIC_IF_CMD_CONFIG_TX = 0x006,
00117 MTNIC_IF_CMD_CONFIG_INT_FREQ = 0x007,
00118 MTNIC_IF_CMD_HEART_BEAT = 0x008,
00119 MTNIC_IF_CMD_CLOSE_NIC = 0x009,
00120
00121
00122 MTNIC_IF_CMD_CONFIG_PORT_RSS_STEER = 0x10,
00123 MTNIC_IF_CMD_SET_PORT_RSS_INDIRECTION = 0x11,
00124 MTNIC_IF_CMD_CONFIG_PORT_PRIO_STEERING = 0x12,
00125 MTNIC_IF_CMD_CONFIG_PORT_ADDR_STEER = 0x13,
00126 MTNIC_IF_CMD_CONFIG_PORT_VLAN_FILTER = 0x14,
00127 MTNIC_IF_CMD_CONFIG_PORT_MCAST_FILTER = 0x15,
00128 MTNIC_IF_CMD_ENABLE_PORT_MCAST_FILTER = 0x16,
00129 MTNIC_IF_CMD_SET_PORT_MTU = 0x17,
00130 MTNIC_IF_CMD_SET_PORT_PROMISCUOUS_MODE = 0x18,
00131 MTNIC_IF_CMD_SET_PORT_DEFAULT_RING = 0x19,
00132 MTNIC_IF_CMD_SET_PORT_STATE = 0x1a,
00133 MTNIC_IF_CMD_DUMP_STAT = 0x1b,
00134 MTNIC_IF_CMD_ARM_PORT_STATE_EVENT = 0x1c,
00135
00136
00137 MTNIC_IF_CMD_CONFIG_CQ = 0x20,
00138 MTNIC_IF_CMD_CONFIG_RX_RING = 0x21,
00139 MTNIC_IF_CMD_SET_RX_RING_ADDR = 0x22,
00140 MTNIC_IF_CMD_SET_RX_RING_MCAST = 0x23,
00141 MTNIC_IF_CMD_ARM_RX_RING_WM = 0x24,
00142 MTNIC_IF_CMD_CONFIG_TX_RING = 0x25,
00143 MTNIC_IF_CMD_ENFORCE_TX_RING_ADDR = 0x26,
00144 MTNIC_IF_CMD_CONFIG_EQ = 0x27,
00145 MTNIC_IF_CMD_RELEASE_RESOURCE = 0x28,
00146 }
00147 mtnic_if_cmd_t;
00148
00149
00150
00151 typedef enum mtnic_if_caps {
00152 MTNIC_IF_CAP_MAX_TX_RING_PER_PORT = 0x0,
00153 MTNIC_IF_CAP_MAX_RX_RING_PER_PORT = 0x1,
00154 MTNIC_IF_CAP_MAX_CQ_PER_PORT = 0x2,
00155 MTNIC_IF_CAP_NUM_PORTS = 0x3,
00156 MTNIC_IF_CAP_MAX_TX_DESC = 0x4,
00157 MTNIC_IF_CAP_MAX_RX_DESC = 0x5,
00158 MTNIC_IF_CAP_MAX_CQES = 0x6,
00159 MTNIC_IF_CAP_MAX_TX_SG_ENTRIES = 0x7,
00160 MTNIC_IF_CAP_MAX_RX_SG_ENTRIES = 0x8,
00161 MTNIC_IF_CAP_MEM_KEY = 0x9,
00162 MTNIC_IF_CAP_RSS_HASH_TYPE = 0xa,
00163 MTNIC_IF_CAP_MAX_PORT_UCAST_ADDR = 0xc,
00164 MTNIC_IF_CAP_MAX_RING_UCAST_ADDR = 0xd,
00165 MTNIC_IF_CAP_MAX_PORT_MCAST_ADDR = 0xe,
00166 MTNIC_IF_CAP_MAX_RING_MCAST_ADDR = 0xf,
00167 MTNIC_IF_CAP_INTA = 0x10,
00168 MTNIC_IF_CAP_BOARD_ID_LOW = 0x11,
00169 MTNIC_IF_CAP_BOARD_ID_HIGH = 0x12,
00170 MTNIC_IF_CAP_TX_CQ_DB_OFFSET = 0x13,
00171 MTNIC_IF_CAP_EQ_DB_OFFSET = 0x14,
00172
00173
00174 MTNIC_IF_CAP_SPEED = 0x20,
00175 MTNIC_IF_CAP_DEFAULT_MAC = 0x21,
00176 MTNIC_IF_CAP_EQ_OFFSET = 0x22,
00177 MTNIC_IF_CAP_CQ_OFFSET = 0x23,
00178 MTNIC_IF_CAP_TX_OFFSET = 0x24,
00179 MTNIC_IF_CAP_RX_OFFSET = 0x25,
00180
00181 } mtnic_if_caps_t;
00182
00183 typedef enum mtnic_if_steer_types {
00184 MTNIC_IF_STEER_NONE = 0,
00185 MTNIC_IF_STEER_PRIORITY = 1,
00186 MTNIC_IF_STEER_RSS = 2,
00187 MTNIC_IF_STEER_ADDRESS = 3,
00188 } mtnic_if_steer_types_t;
00189
00190
00191 typedef enum mtnic_if_memory_types {
00192 MTNIC_IF_MEM_TYPE_SNOOP = 1,
00193 MTNIC_IF_MEM_TYPE_NO_SNOOP = 2
00194 } mtnic_if_memory_types_t;
00195
00196
00197 enum {
00198 MTNIC_HCR_BASE = 0x1f000,
00199 MTNIC_HCR_SIZE = 0x0001c,
00200 MTNIC_CLR_INT_SIZE = 0x00008,
00201 };
00202
00203 #define MTNIC_RESET_OFFSET 0xF0010
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 struct mtnic_ctrl_seg {
00219 u32 op_own;
00220 #define MTNIC_BIT_DESC_OWN 0x80000000
00221 #define MTNIC_OPCODE_SEND 0xa
00222 u32 size_vlan;
00223 u32 flags;
00224 #define MTNIC_BIT_NO_ICRC 0x2
00225 #define MTNIC_BIT_TX_COMP 0xc
00226 u32 reserved;
00227 };
00228
00229 struct mtnic_data_seg {
00230 u32 count;
00231 #define MTNIC_INLINE 0x80000000
00232 u32 mem_type;
00233 #define MTNIC_MEMTYPE_PAD 0x100
00234 u32 addr_h;
00235 u32 addr_l;
00236 };
00237
00238 struct mtnic_tx_desc {
00239 struct mtnic_ctrl_seg ctrl;
00240 struct mtnic_data_seg data;
00241 };
00242
00243 struct mtnic_rx_desc {
00244 u16 reserved1;
00245 u16 next;
00246 u32 reserved2[3];
00247 struct mtnic_data_seg data;
00248
00249 };
00250
00251
00252
00253
00254 struct mtnic_rx_db_record {
00255 u32 count;
00256 };
00257
00258 struct mtnic_ring {
00259 u32 size;
00260 u32 size_mask;
00261 u16 stride;
00262 u16 cq;
00263 u32 prod;
00264 u32 cons;
00265
00266
00267 u32 buf_size;
00268 dma_addr_t dma;
00269 void *buf;
00270 struct io_buffer *iobuf[UNITS_BUFFER_SIZE];
00271
00272
00273 struct mtnic_txcq_db *txcq_db;
00274 u32 db_offset;
00275
00276
00277 dma_addr_t iobuf_dma;
00278 struct mtnic_rx_db_record *db;
00279 dma_addr_t db_dma;
00280 };
00281
00282
00283
00284
00285
00286 struct mtnic_cqe {
00287 u8 vp;
00288 u8 reserved1[3];
00289 u32 rss_hash;
00290 u32 reserved2;
00291 u16 vlan_prio;
00292 u16 reserved3;
00293 u8 flags_h;
00294 u8 flags_l_rht;
00295 u8 ipv6_mask;
00296 u8 enc_bf;
00297 #define MTNIC_BIT_BAD_FCS 0x10
00298 #define MTNIC_OPCODE_ERROR 0x1e
00299 u32 byte_cnt;
00300 u16 index;
00301 u16 chksum;
00302 u8 reserved4[3];
00303 u8 op_tr_own;
00304 #define MTNIC_BIT_CQ_OWN 0x80
00305 };
00306
00307
00308 struct mtnic_cq_db_record {
00309 u32 update_ci;
00310 u32 cmd_ci;
00311 };
00312
00313 struct mtnic_cq {
00314 int num;
00315 u32 size;
00316 u32 last;
00317 struct mtnic_cq_db_record *db;
00318 struct net_device *dev;
00319
00320 dma_addr_t db_dma;
00321 u8 is_rx;
00322 u16 ring;
00323 u32 offset_ind;
00324
00325
00326 u32 buf_size;
00327 struct mtnic_cqe *buf;
00328 dma_addr_t dma;
00329 };
00330
00331
00332
00333
00334
00335 struct mtnic_eqe {
00336 u8 reserved1;
00337 u8 type;
00338 u8 reserved2;
00339 u8 subtype;
00340 u8 reserved3[3];
00341 u8 ring_cq;
00342 u32 reserved4;
00343 u8 port;
00344 #define MTNIC_MASK_EQE_PORT MTNIC_BC(4,2)
00345 u8 reserved5[2];
00346 u8 syndrome;
00347 u8 reserved6[15];
00348 u8 own;
00349 #define MTNIC_BIT_EQE_OWN 0x80
00350 };
00351
00352 struct mtnic_eq {
00353 u32 size;
00354 u32 buf_size;
00355 void *buf;
00356 dma_addr_t dma;
00357 };
00358
00359 enum mtnic_state {
00360 CARD_DOWN,
00361 CARD_INITIALIZED,
00362 CARD_UP,
00363 CARD_LINK_DOWN,
00364 };
00365
00366
00367 struct mtnic_pages {
00368 u32 num;
00369 u32 *buf;
00370 };
00371 struct mtnic_err_buf {
00372 u64 offset;
00373 u32 size;
00374 };
00375
00376
00377
00378 struct mtnic_cmd {
00379 void *buf;
00380 unsigned long mapping;
00381 u32 tbit;
00382 };
00383
00384
00385 struct mtnic_txcq_db {
00386 u32 reserved1[5];
00387 u32 send_db;
00388 u32 reserved2[2];
00389 u32 cq_arm;
00390 u32 cq_ci;
00391 };
00392
00393
00394
00395
00396
00397
00398
00399 struct mtnic {
00400 struct net_device *netdev[MTNIC_MAX_PORTS];
00401 struct mtnic_if_cmd_reg *hcr;
00402 struct mtnic_cmd cmd;
00403 struct pci_device *pdev;
00404
00405 struct mtnic_eq eq;
00406 u32 *eq_db;
00407
00408
00409 u64 fw_ver;
00410 struct {
00411 struct mtnic_pages fw_pages;
00412 struct mtnic_pages extra_pages;
00413 struct mtnic_err_buf err_buf;
00414 u16 ifc_rev;
00415 u8 num_ports;
00416 u64 mac[MTNIC_MAX_PORTS];
00417 u16 cq_offset;
00418 u16 tx_offset[MTNIC_MAX_PORTS];
00419 u16 rx_offset[MTNIC_MAX_PORTS];
00420 u32 mem_type_snoop_be;
00421 u32 txcq_db_offset;
00422 u32 eq_db_offset;
00423 } fw;
00424 };
00425
00426
00427
00428
00429
00430 struct mtnic_port {
00431
00432 struct mtnic *mtnic;
00433 u8 port;
00434
00435 enum mtnic_state state;
00436
00437
00438 struct mtnic_ring tx_ring;
00439 struct mtnic_ring rx_ring;
00440 struct mtnic_cq cq[NUM_CQS];
00441 u32 poll_counter;
00442 struct net_device *netdev;
00443
00444
00445 };
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 struct mtnic_if_cmd_reg {
00472 unsigned long in_param_h;
00473 u32 in_param_l;
00474 u32 input_modifier;
00475 u32 out_param_h;
00476 u32 out_param_l;
00477 u32 token;
00478 #define MTNIC_MASK_CMD_REG_TOKEN MTNIC_BC(16,32)
00479 u32 status_go_opcode;
00480 #define MTNIC_MASK_CMD_REG_OPCODE MTNIC_BC(0,16)
00481 #define MTNIC_MASK_CMD_REG_T_BIT MTNIC_BC(21,1)
00482 #define MTNIC_MASK_CMD_REG_GO_BIT MTNIC_BC(23,1)
00483 #define MTNIC_MASK_CMD_REG_STATUS MTNIC_BC(24,8)
00484 };
00485
00486
00487
00488
00489 struct mtnic_if_query_fw_out_mbox {
00490 u16 fw_pages;
00491 u16 rev_maj;
00492 u16 rev_smin;
00493 u16 rev_min;
00494 u16 reserved1;
00495 u16 ifc_rev;
00496 u8 ft;
00497 u8 reserved2[3];
00498 u32 reserved3[4];
00499 u64 clr_int_base;
00500 u32 reserved4[2];
00501 u64 err_buf_start;
00502 u32 err_buf_size;
00503 };
00504
00505
00506 struct mtnic_if_query_cap_in_imm {
00507 u16 reserved1;
00508 u8 cap_modifier;
00509 u8 cap_index;
00510 u32 reserved2;
00511 };
00512
00513
00514 struct mtnic_if_open_nic_in_mbox {
00515 u16 reserved1;
00516 u16 mkey;
00517 u32 mkey_entry;
00518 u8 log_rx_p1;
00519 u8 log_cq_p1;
00520 u8 log_tx_p1;
00521 u8 steer_p1;
00522 u16 reserved2;
00523 u8 log_vlan_p1;
00524 u8 log_mac_p1;
00525
00526 u8 log_rx_p2;
00527 u8 log_cq_p2;
00528 u8 log_tx_p2;
00529 u8 steer_p2;
00530 u16 reserved3;
00531 u8 log_vlan_p2;
00532 u8 log_mac_p2;
00533 };
00534
00535
00536
00537 struct mtnic_if_config_rx_in_imm {
00538 u16 spkt_size;
00539 u16 resp_rcv_pause_frm_mcast_vlan_comp;
00540
00541
00542 };
00543
00544
00545 struct mtnic_if_config_send_in_imm {
00546 u32 enph_gpf;
00547 u32 reserved;
00548 };
00549
00550
00551 struct mtnic_if_heart_beat_out_imm {
00552 u32 flags;
00553 #define MTNIC_MASK_HEAR_BEAT_INT_ERROR MTNIC_BC(31,1)
00554 u32 reserved;
00555 };
00556
00557
00558
00559
00560
00561
00562
00563 struct mtnic_if_config_port_vlan_filter_in_mbox {
00564 u64 filter[64];
00565 };
00566
00567
00568
00569 struct mtnic_if_set_port_mtu_in_imm {
00570 u16 reserved1;
00571 u16 mtu;
00572 u32 reserved2;
00573 };
00574
00575
00576 struct mtnic_if_set_port_default_ring_in_imm {
00577 u8 reserved1[3];
00578 u8 ring;
00579 u32 reserved2;
00580 };
00581
00582
00583 struct mtnic_if_set_port_state_in_imm {
00584 u32 state;
00585 #define MTNIC_MASK_CONFIG_PORT_STATE MTNIC_BC(0,1)
00586 u32 reserved;
00587 };
00588
00589
00590 struct mtnic_if_config_cq_in_mbox {
00591 u8 reserved1;
00592 u8 cq;
00593 u8 size;
00594 u8 offset;
00595 u16 tlast;
00596 u8 flags;
00597 u8 int_vector;
00598 u16 reserved2;
00599 u16 max_cnt;
00600 u8 page_size;
00601 u8 reserved4[3];
00602 u32 db_record_addr_h;
00603 u32 db_record_addr_l;
00604 u32 page_address[0];
00605 };
00606
00607
00608 struct mtnic_if_config_rx_ring_in_mbox {
00609 u8 reserved1;
00610 u8 ring;
00611 u8 stride_size;
00612
00613 #define MTNIC_MASK_CONFIG_RX_RING_STRIDE MTNIC_BC(4,3)
00614
00615 #define MTNIC_MASK_CONFIG_RX_RING_SIZE MTNIC_BC(0,4)
00616 u8 flags;
00617 u8 page_size;
00618 u8 reserved2[2];
00619 u8 cq;
00620 u32 db_record_addr_h;
00621 u32 db_record_addr_l;
00622 u32 page_address[0];
00623
00624 };
00625
00626
00627 struct mtnic_if_set_rx_ring_modifier {
00628 u8 reserved;
00629 u8 port_num;
00630 u8 index;
00631 u8 ring;
00632 };
00633
00634
00635 struct mtnic_if_set_rx_ring_addr_in_imm {
00636 u16 mac_47_32;
00637 u16 flags_vlan_id;
00638 #define MTNIC_MASK_SET_RX_RING_ADDR_VLAN_ID MTNIC_BC(0,12)
00639 #define MTNIC_MASK_SET_RX_RING_ADDR_BY_MAC MTNIC_BC(12,1)
00640 #define MTNIC_MASK_SET_RX_RING_ADDR_BY_VLAN MTNIC_BC(13,1)
00641 u32 mac_31_0;
00642 };
00643
00644
00645 struct mtnic_if_config_send_ring_in_mbox {
00646 u16 ring;
00647 #define MTNIC_MASK_CONFIG_TX_RING_INDEX MTNIC_BC(0,8)
00648 u8 size;
00649 #define MTNIC_MASK_CONFIG_TX_RING_SIZE MTNIC_BC(0,4)
00650 u8 reserved;
00651 u8 page_size;
00652 u8 qos_class;
00653 u16 cq;
00654 #define MTNIC_MASK_CONFIG_TX_CQ_INDEX MTNIC_BC(0,8)
00655 u32 page_address[0];
00656
00657 };
00658
00659
00660 struct mtnic_if_config_eq_in_mbox {
00661 u8 reserved1;
00662 u8 int_vector;
00663 #define MTNIC_MASK_CONFIG_EQ_INT_VEC MTNIC_BC(0,6)
00664 u8 size;
00665 #define MTNIC_MASK_CONFIG_EQ_SIZE MTNIC_BC(0,5)
00666 u8 offset;
00667 #define MTNIC_MASK_CONFIG_EQ_OFFSET MTNIC_BC(0,6)
00668 u8 page_size;
00669 u8 reserved[3];
00670 u32 page_address[0];
00671 };
00672
00673
00674 enum mtnic_if_resource_types {
00675 MTNIC_IF_RESOURCE_TYPE_CQ = 0,
00676 MTNIC_IF_RESOURCE_TYPE_RX_RING,
00677 MTNIC_IF_RESOURCE_TYPE_TX_RING,
00678 MTNIC_IF_RESOURCE_TYPE_EQ
00679 };
00680
00681 struct mtnic_if_release_resource_in_imm {
00682 u8 reserved1;
00683 u8 index;
00684 u8 reserved2;
00685 u8 type;
00686 u32 reserved3;
00687 };
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703 struct pcidev {
00704 unsigned long bar[6];
00705 u32 dev_config_space[64];
00706 struct pci_device *dev;
00707 u8 bus;
00708 u8 devfn;
00709 };
00710
00711 struct dev_pci_struct {
00712 struct pcidev dev;
00713 struct pcidev br;
00714 };
00715
00716
00717 struct dev_pci_struct mtnic_pci_dev;
00718
00719
00720
00721 #endif
00722