1 /*- 2 * Broadcom NetXtreme-C/E network driver. 3 * 4 * Copyright (c) 2016 Broadcom, All Rights Reserved. 5 * The term Broadcom refers to Broadcom Limited and/or its subsidiaries 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS' 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 #ifndef _BNXT_H 31 #define _BNXT_H 32 33 #include <sys/param.h> 34 #include <sys/socket.h> 35 #include <sys/sysctl.h> 36 #include <sys/taskqueue.h> 37 #include <sys/bitstring.h> 38 39 #include <machine/bus.h> 40 41 #include <net/ethernet.h> 42 #include <net/if.h> 43 #include <net/if_var.h> 44 #include <net/iflib.h> 45 46 #include "hsi_struct_def.h" 47 48 /* PCI IDs */ 49 #define BROADCOM_VENDOR_ID 0x14E4 50 51 #define BCM57301 0x16c8 52 #define BCM57302 0x16c9 53 #define BCM57304 0x16ca 54 #define BCM57311 0x16ce 55 #define BCM57312 0x16cf 56 #define BCM57314 0x16df 57 #define BCM57402 0x16d0 58 #define BCM57402_NPAR 0x16d4 59 #define BCM57404 0x16d1 60 #define BCM57404_NPAR 0x16e7 61 #define BCM57406 0x16d2 62 #define BCM57406_NPAR 0x16e8 63 #define BCM57407 0x16d5 64 #define BCM57407_NPAR 0x16ea 65 #define BCM57407_SFP 0x16e9 66 #define BCM57412 0x16d6 67 #define BCM57412_NPAR1 0x16de 68 #define BCM57412_NPAR2 0x16eb 69 #define BCM57414 0x16d7 70 #define BCM57414_NPAR1 0x16ec 71 #define BCM57414_NPAR2 0x16ed 72 #define BCM57416 0x16d8 73 #define BCM57416_NPAR1 0x16ee 74 #define BCM57416_NPAR2 0x16ef 75 #define BCM57416_SFP 0x16e3 76 #define BCM57417 0x16d9 77 #define BCM57417_NPAR1 0x16c0 78 #define BCM57417_NPAR2 0x16cc 79 #define BCM57417_SFP 0x16e2 80 #define BCM57454 0x1614 81 #define BCM58700 0x16cd 82 #define BCM57508 0x1750 83 #define BCM57504 0x1751 84 #define BCM57502 0x1752 85 #define NETXTREME_C_VF1 0x16cb 86 #define NETXTREME_C_VF2 0x16e1 87 #define NETXTREME_C_VF3 0x16e5 88 #define NETXTREME_E_VF1 0x16c1 89 #define NETXTREME_E_VF2 0x16d3 90 #define NETXTREME_E_VF3 0x16dc 91 92 /* Maximum numbers of RX and TX descriptors. iflib requires this to be a power 93 * of two. The hardware has no particular limitation. */ 94 #define BNXT_MAX_RXD ((INT32_MAX >> 1) + 1) 95 #define BNXT_MAX_TXD ((INT32_MAX >> 1) + 1) 96 97 #define CSUM_OFFLOAD (CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \ 98 CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \ 99 CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP) 100 101 #define BNXT_MAX_MTU 9600 102 103 #define BNXT_RSS_HASH_TYPE_TCPV4 0 104 #define BNXT_RSS_HASH_TYPE_UDPV4 1 105 #define BNXT_RSS_HASH_TYPE_IPV4 2 106 #define BNXT_RSS_HASH_TYPE_TCPV6 3 107 #define BNXT_RSS_HASH_TYPE_UDPV6 4 108 #define BNXT_RSS_HASH_TYPE_IPV6 5 109 #define BNXT_GET_RSS_PROFILE_ID(rss_hash_type) ((rss_hash_type >> 1) & 0x1F) 110 111 #define BNXT_NO_MORE_WOL_FILTERS 0xFFFF 112 #define bnxt_wol_supported(softc) (!((softc)->flags & BNXT_FLAG_VF) && \ 113 ((softc)->flags & BNXT_FLAG_WOL_CAP )) 114 115 /* 64-bit doorbell */ 116 #define DBR_INDEX_MASK 0x0000000000ffffffULL 117 #define DBR_PI_LO_MASK 0xff000000UL 118 #define DBR_PI_LO_SFT 24 119 #define DBR_XID_MASK 0x000fffff00000000ULL 120 #define DBR_XID_SFT 32 121 #define DBR_PI_HI_MASK 0xf0000000000000ULL 122 #define DBR_PI_HI_SFT 52 123 #define DBR_PATH_L2 (0x1ULL << 56) 124 #define DBR_VALID (0x1ULL << 58) 125 #define DBR_TYPE_SQ (0x0ULL << 60) 126 #define DBR_TYPE_RQ (0x1ULL << 60) 127 #define DBR_TYPE_SRQ (0x2ULL << 60) 128 #define DBR_TYPE_SRQ_ARM (0x3ULL << 60) 129 #define DBR_TYPE_CQ (0x4ULL << 60) 130 #define DBR_TYPE_CQ_ARMSE (0x5ULL << 60) 131 #define DBR_TYPE_CQ_ARMALL (0x6ULL << 60) 132 #define DBR_TYPE_CQ_ARMENA (0x7ULL << 60) 133 #define DBR_TYPE_SRQ_ARMENA (0x8ULL << 60) 134 #define DBR_TYPE_CQ_CUTOFF_ACK (0x9ULL << 60) 135 #define DBR_TYPE_NQ (0xaULL << 60) 136 #define DBR_TYPE_NQ_ARM (0xbULL << 60) 137 #define DBR_TYPE_PUSH_START (0xcULL << 60) 138 #define DBR_TYPE_PUSH_END (0xdULL << 60) 139 #define DBR_TYPE_NULL (0xfULL << 60) 140 141 #define BNXT_MAX_NUM_QUEUES 32 142 143 /* Completion related defines */ 144 #define CMP_VALID(cmp, v_bit) \ 145 ((!!(((struct cmpl_base *)(cmp))->info3_v & htole32(CMPL_BASE_V))) == !!(v_bit) ) 146 147 /* Chip class phase 5 */ 148 #define BNXT_CHIP_P5(sc) ((softc->flags & BNXT_FLAG_CHIP_P5)) 149 150 #define DB_PF_OFFSET_P5 0x10000 151 #define NQ_VALID(cmp, v_bit) \ 152 ((!!(((nq_cn_t *)(cmp))->v & htole32(NQ_CN_V))) == !!(v_bit) ) 153 154 #ifndef DIV_ROUND_UP 155 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 156 #endif 157 #ifndef roundup 158 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) 159 #endif 160 161 #define NEXT_CP_CONS_V(ring, cons, v_bit) do { \ 162 if (__predict_false(++(cons) == (ring)->ring_size)) \ 163 ((cons) = 0, (v_bit) = !v_bit); \ 164 } while (0) 165 166 #define RING_NEXT(ring, idx) (__predict_false(idx + 1 == (ring)->ring_size) ? \ 167 0 : idx + 1) 168 169 #define CMPL_PREFETCH_NEXT(cpr, idx) \ 170 __builtin_prefetch(&((struct cmpl_base *)(cpr)->ring.vaddr)[((idx) +\ 171 (CACHE_LINE_SIZE / sizeof(struct cmpl_base))) & \ 172 ((cpr)->ring.ring_size - 1)]) 173 174 /* Lock macros */ 175 #define BNXT_HWRM_LOCK_INIT(_softc, _name) \ 176 mtx_init(&(_softc)->hwrm_lock, _name, "BNXT HWRM Lock", MTX_DEF) 177 #define BNXT_HWRM_LOCK(_softc) mtx_lock(&(_softc)->hwrm_lock) 178 #define BNXT_HWRM_UNLOCK(_softc) mtx_unlock(&(_softc)->hwrm_lock) 179 #define BNXT_HWRM_LOCK_DESTROY(_softc) mtx_destroy(&(_softc)->hwrm_lock) 180 #define BNXT_HWRM_LOCK_ASSERT(_softc) mtx_assert(&(_softc)->hwrm_lock, \ 181 MA_OWNED) 182 #define BNXT_IS_FLOW_CTRL_CHANGED(link_info) \ 183 ((link_info->last_flow_ctrl.tx != link_info->flow_ctrl.tx) || \ 184 (link_info->last_flow_ctrl.rx != link_info->flow_ctrl.rx) || \ 185 (link_info->last_flow_ctrl.autoneg != link_info->flow_ctrl.autoneg)) 186 187 /* Chip info */ 188 #define BNXT_TSO_SIZE UINT16_MAX 189 190 #define min_t(type, x, y) ({ \ 191 type __min1 = (x); \ 192 type __min2 = (y); \ 193 __min1 < __min2 ? __min1 : __min2; }) 194 195 #define max_t(type, x, y) ({ \ 196 type __max1 = (x); \ 197 type __max2 = (y); \ 198 __max1 > __max2 ? __max1 : __max2; }) 199 200 #define clamp_t(type, _x, min, max) min_t(type, max_t(type, _x, min), max) 201 202 #define BNXT_IFMEDIA_ADD(supported, fw_speed, ifm_speed) do { \ 203 if ((supported) & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_ ## fw_speed) \ 204 ifmedia_add(softc->media, IFM_ETHER | (ifm_speed), 0, NULL); \ 205 } while(0) 206 207 #define BNXT_MIN_FRAME_SIZE 52 /* Frames must be padded to this size for some A0 chips */ 208 209 extern const char bnxt_driver_version[]; 210 typedef void (*bnxt_doorbell_tx)(void *, uint16_t idx); 211 typedef void (*bnxt_doorbell_rx)(void *, uint16_t idx); 212 typedef void (*bnxt_doorbell_rx_cq)(void *, bool); 213 typedef void (*bnxt_doorbell_tx_cq)(void *, bool); 214 typedef void (*bnxt_doorbell_nq)(void *, bool); 215 216 typedef struct bnxt_doorbell_ops { 217 bnxt_doorbell_tx bnxt_db_tx; 218 bnxt_doorbell_rx bnxt_db_rx; 219 bnxt_doorbell_rx_cq bnxt_db_rx_cq; 220 bnxt_doorbell_tx_cq bnxt_db_tx_cq; 221 bnxt_doorbell_nq bnxt_db_nq; 222 } bnxt_dooorbell_ops_t; 223 /* NVRAM access */ 224 enum bnxt_nvm_directory_type { 225 BNX_DIR_TYPE_UNUSED = 0, 226 BNX_DIR_TYPE_PKG_LOG = 1, 227 BNX_DIR_TYPE_UPDATE = 2, 228 BNX_DIR_TYPE_CHIMP_PATCH = 3, 229 BNX_DIR_TYPE_BOOTCODE = 4, 230 BNX_DIR_TYPE_VPD = 5, 231 BNX_DIR_TYPE_EXP_ROM_MBA = 6, 232 BNX_DIR_TYPE_AVS = 7, 233 BNX_DIR_TYPE_PCIE = 8, 234 BNX_DIR_TYPE_PORT_MACRO = 9, 235 BNX_DIR_TYPE_APE_FW = 10, 236 BNX_DIR_TYPE_APE_PATCH = 11, 237 BNX_DIR_TYPE_KONG_FW = 12, 238 BNX_DIR_TYPE_KONG_PATCH = 13, 239 BNX_DIR_TYPE_BONO_FW = 14, 240 BNX_DIR_TYPE_BONO_PATCH = 15, 241 BNX_DIR_TYPE_TANG_FW = 16, 242 BNX_DIR_TYPE_TANG_PATCH = 17, 243 BNX_DIR_TYPE_BOOTCODE_2 = 18, 244 BNX_DIR_TYPE_CCM = 19, 245 BNX_DIR_TYPE_PCI_CFG = 20, 246 BNX_DIR_TYPE_TSCF_UCODE = 21, 247 BNX_DIR_TYPE_ISCSI_BOOT = 22, 248 BNX_DIR_TYPE_ISCSI_BOOT_IPV6 = 24, 249 BNX_DIR_TYPE_ISCSI_BOOT_IPV4N6 = 25, 250 BNX_DIR_TYPE_ISCSI_BOOT_CFG6 = 26, 251 BNX_DIR_TYPE_EXT_PHY = 27, 252 BNX_DIR_TYPE_SHARED_CFG = 40, 253 BNX_DIR_TYPE_PORT_CFG = 41, 254 BNX_DIR_TYPE_FUNC_CFG = 42, 255 BNX_DIR_TYPE_MGMT_CFG = 48, 256 BNX_DIR_TYPE_MGMT_DATA = 49, 257 BNX_DIR_TYPE_MGMT_WEB_DATA = 50, 258 BNX_DIR_TYPE_MGMT_WEB_META = 51, 259 BNX_DIR_TYPE_MGMT_EVENT_LOG = 52, 260 BNX_DIR_TYPE_MGMT_AUDIT_LOG = 53 261 }; 262 263 enum bnxnvm_pkglog_field_index { 264 BNX_PKG_LOG_FIELD_IDX_INSTALLED_TIMESTAMP = 0, 265 BNX_PKG_LOG_FIELD_IDX_PKG_DESCRIPTION = 1, 266 BNX_PKG_LOG_FIELD_IDX_PKG_VERSION = 2, 267 BNX_PKG_LOG_FIELD_IDX_PKG_TIMESTAMP = 3, 268 BNX_PKG_LOG_FIELD_IDX_PKG_CHECKSUM = 4, 269 BNX_PKG_LOG_FIELD_IDX_INSTALLED_ITEMS = 5, 270 BNX_PKG_LOG_FIELD_IDX_INSTALLED_MASK = 6 271 }; 272 273 #define BNX_DIR_ORDINAL_FIRST 0 274 #define BNX_DIR_EXT_NONE 0 275 276 struct bnxt_bar_info { 277 struct resource *res; 278 bus_space_tag_t tag; 279 bus_space_handle_t handle; 280 bus_size_t size; 281 int rid; 282 }; 283 284 struct bnxt_flow_ctrl { 285 bool rx; 286 bool tx; 287 bool autoneg; 288 }; 289 290 struct bnxt_link_info { 291 uint8_t media_type; 292 uint8_t transceiver; 293 uint8_t phy_addr; 294 uint8_t phy_link_status; 295 uint8_t wire_speed; 296 uint8_t loop_back; 297 uint8_t link_up; 298 uint8_t last_link_up; 299 uint8_t duplex; 300 uint8_t last_duplex; 301 uint8_t last_phy_type; 302 struct bnxt_flow_ctrl flow_ctrl; 303 struct bnxt_flow_ctrl last_flow_ctrl; 304 uint8_t duplex_setting; 305 uint8_t auto_mode; 306 #define PHY_VER_LEN 3 307 uint8_t phy_ver[PHY_VER_LEN]; 308 uint8_t phy_type; 309 #define BNXT_PHY_STATE_ENABLED 0 310 #define BNXT_PHY_STATE_DISABLED 1 311 uint8_t phy_state; 312 313 uint16_t link_speed; 314 uint16_t support_speeds; 315 uint16_t support_pam4_speeds; 316 uint16_t auto_link_speeds; 317 uint16_t auto_pam4_link_speeds; 318 uint16_t force_link_speed; 319 uint16_t force_pam4_link_speed; 320 bool force_pam4_speed_set_by_user; 321 322 uint16_t advertising; 323 uint16_t advertising_pam4; 324 325 uint32_t preemphasis; 326 uint16_t support_auto_speeds; 327 uint16_t support_force_speeds; 328 uint16_t support_pam4_auto_speeds; 329 uint16_t support_pam4_force_speeds; 330 #define BNXT_SIG_MODE_NRZ HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ 331 #define BNXT_SIG_MODE_PAM4 HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4 332 uint8_t req_signal_mode; 333 334 uint8_t active_fec_sig_mode; 335 uint8_t sig_mode; 336 337 /* copy of requested setting */ 338 uint8_t autoneg; 339 #define BNXT_AUTONEG_SPEED 1 340 #define BNXT_AUTONEG_FLOW_CTRL 2 341 uint8_t req_duplex; 342 uint16_t req_link_speed; 343 uint8_t module_status; 344 struct hwrm_port_phy_qcfg_output phy_qcfg_resp; 345 }; 346 347 enum bnxt_phy_type { 348 BNXT_MEDIA_CR = 0, 349 BNXT_MEDIA_LR, 350 BNXT_MEDIA_SR, 351 BNXT_MEDIA_KR, 352 BNXT_MEDIA_END 353 }; 354 355 enum bnxt_cp_type { 356 BNXT_DEFAULT, 357 BNXT_TX, 358 BNXT_RX, 359 BNXT_SHARED 360 }; 361 362 struct bnxt_cos_queue { 363 uint8_t id; 364 uint8_t profile; 365 }; 366 367 struct bnxt_func_info { 368 uint32_t fw_fid; 369 uint8_t mac_addr[ETHER_ADDR_LEN]; 370 uint16_t max_rsscos_ctxs; 371 uint16_t max_cp_rings; 372 uint16_t max_tx_rings; 373 uint16_t max_rx_rings; 374 uint16_t max_hw_ring_grps; 375 uint16_t max_irqs; 376 uint16_t max_l2_ctxs; 377 uint16_t max_vnics; 378 uint16_t max_stat_ctxs; 379 }; 380 381 struct bnxt_pf_info { 382 #define BNXT_FIRST_PF_FID 1 383 #define BNXT_FIRST_VF_FID 128 384 uint8_t port_id; 385 uint32_t first_vf_id; 386 uint16_t active_vfs; 387 uint16_t max_vfs; 388 uint32_t max_encap_records; 389 uint32_t max_decap_records; 390 uint32_t max_tx_em_flows; 391 uint32_t max_tx_wm_flows; 392 uint32_t max_rx_em_flows; 393 uint32_t max_rx_wm_flows; 394 unsigned long *vf_event_bmap; 395 uint16_t hwrm_cmd_req_pages; 396 void *hwrm_cmd_req_addr[4]; 397 bus_addr_t hwrm_cmd_req_dma_addr[4]; 398 }; 399 400 struct bnxt_vf_info { 401 uint16_t fw_fid; 402 uint8_t mac_addr[ETHER_ADDR_LEN]; 403 uint16_t max_rsscos_ctxs; 404 uint16_t max_cp_rings; 405 uint16_t max_tx_rings; 406 uint16_t max_rx_rings; 407 uint16_t max_hw_ring_grps; 408 uint16_t max_l2_ctxs; 409 uint16_t max_irqs; 410 uint16_t max_vnics; 411 uint16_t max_stat_ctxs; 412 uint32_t vlan; 413 #define BNXT_VF_QOS 0x1 414 #define BNXT_VF_SPOOFCHK 0x2 415 #define BNXT_VF_LINK_FORCED 0x4 416 #define BNXT_VF_LINK_UP 0x8 417 uint32_t flags; 418 uint32_t func_flags; /* func cfg flags */ 419 uint32_t min_tx_rate; 420 uint32_t max_tx_rate; 421 void *hwrm_cmd_req_addr; 422 bus_addr_t hwrm_cmd_req_dma_addr; 423 }; 424 425 #define BNXT_PF(softc) (!((softc)->flags & BNXT_FLAG_VF)) 426 #define BNXT_VF(softc) ((softc)->flags & BNXT_FLAG_VF) 427 428 struct bnxt_vlan_tag { 429 SLIST_ENTRY(bnxt_vlan_tag) next; 430 uint64_t filter_id; 431 uint16_t tag; 432 }; 433 434 struct bnxt_vnic_info { 435 uint16_t id; 436 uint16_t def_ring_grp; 437 uint16_t cos_rule; 438 uint16_t lb_rule; 439 uint16_t mru; 440 441 uint32_t rx_mask; 442 struct iflib_dma_info mc_list; 443 int mc_list_count; 444 #define BNXT_MAX_MC_ADDRS 16 445 446 uint32_t flags; 447 #define BNXT_VNIC_FLAG_DEFAULT 0x01 448 #define BNXT_VNIC_FLAG_BD_STALL 0x02 449 #define BNXT_VNIC_FLAG_VLAN_STRIP 0x04 450 451 uint64_t filter_id; 452 453 uint16_t rss_id; 454 uint32_t rss_hash_type; 455 uint8_t rss_hash_key[HW_HASH_KEY_SIZE]; 456 struct iflib_dma_info rss_hash_key_tbl; 457 struct iflib_dma_info rss_grp_tbl; 458 SLIST_HEAD(vlan_head, bnxt_vlan_tag) vlan_tags; 459 struct iflib_dma_info vlan_tag_list; 460 }; 461 462 struct bnxt_grp_info { 463 uint16_t stats_ctx; 464 uint16_t grp_id; 465 uint16_t rx_ring_id; 466 uint16_t cp_ring_id; 467 uint16_t ag_ring_id; 468 }; 469 470 struct bnxt_ring { 471 uint64_t paddr; 472 vm_offset_t doorbell; 473 caddr_t vaddr; 474 struct bnxt_softc *softc; 475 uint32_t ring_size; /* Must be a power of two */ 476 uint16_t id; /* Logical ID */ 477 uint16_t phys_id; 478 uint16_t idx; 479 struct bnxt_full_tpa_start *tpa_start; 480 }; 481 482 struct bnxt_cp_ring { 483 struct bnxt_ring ring; 484 struct if_irq irq; 485 uint32_t cons; 486 bool v_bit; /* Value of valid bit */ 487 struct ctx_hw_stats *stats; 488 uint32_t stats_ctx_id; 489 uint32_t last_idx; /* Used by RX rings only 490 * set to the last read pidx 491 */ 492 uint64_t int_count; 493 }; 494 495 struct bnxt_full_tpa_start { 496 struct rx_tpa_start_cmpl low; 497 struct rx_tpa_start_cmpl_hi high; 498 }; 499 500 /* All the version information for the part */ 501 #define BNXT_VERSTR_SIZE (3*3+2+1) /* ie: "255.255.255\0" */ 502 #define BNXT_NAME_SIZE 17 503 #define FW_VER_STR_LEN 32 504 #define BC_HWRM_STR_LEN 21 505 struct bnxt_ver_info { 506 uint8_t hwrm_if_major; 507 uint8_t hwrm_if_minor; 508 uint8_t hwrm_if_update; 509 char hwrm_if_ver[BNXT_VERSTR_SIZE]; 510 char driver_hwrm_if_ver[BNXT_VERSTR_SIZE]; 511 char hwrm_fw_ver[BNXT_VERSTR_SIZE]; 512 char mgmt_fw_ver[BNXT_VERSTR_SIZE]; 513 char netctrl_fw_ver[BNXT_VERSTR_SIZE]; 514 char roce_fw_ver[BNXT_VERSTR_SIZE]; 515 char fw_ver_str[FW_VER_STR_LEN]; 516 char phy_ver[BNXT_VERSTR_SIZE]; 517 char pkg_ver[64]; 518 519 char hwrm_fw_name[BNXT_NAME_SIZE]; 520 char mgmt_fw_name[BNXT_NAME_SIZE]; 521 char netctrl_fw_name[BNXT_NAME_SIZE]; 522 char roce_fw_name[BNXT_NAME_SIZE]; 523 char phy_vendor[BNXT_NAME_SIZE]; 524 char phy_partnumber[BNXT_NAME_SIZE]; 525 526 uint16_t chip_num; 527 uint8_t chip_rev; 528 uint8_t chip_metal; 529 uint8_t chip_bond_id; 530 uint8_t chip_type; 531 532 uint8_t hwrm_min_major; 533 uint8_t hwrm_min_minor; 534 uint8_t hwrm_min_update; 535 536 struct sysctl_ctx_list ver_ctx; 537 struct sysctl_oid *ver_oid; 538 }; 539 540 struct bnxt_nvram_info { 541 uint16_t mfg_id; 542 uint16_t device_id; 543 uint32_t sector_size; 544 uint32_t size; 545 uint32_t reserved_size; 546 uint32_t available_size; 547 548 struct sysctl_ctx_list nvm_ctx; 549 struct sysctl_oid *nvm_oid; 550 }; 551 552 struct bnxt_func_qcfg { 553 uint16_t alloc_completion_rings; 554 uint16_t alloc_tx_rings; 555 uint16_t alloc_rx_rings; 556 uint16_t alloc_vnics; 557 }; 558 559 struct bnxt_hw_lro { 560 uint16_t enable; 561 uint16_t is_mode_gro; 562 uint16_t max_agg_segs; 563 uint16_t max_aggs; 564 uint32_t min_agg_len; 565 }; 566 567 /* The hardware supports certain page sizes. Use the supported page sizes 568 * to allocate the rings. 569 */ 570 #if (PAGE_SHIFT < 12) 571 #define BNXT_PAGE_SHIFT 12 572 #elif (PAGE_SHIFT <= 13) 573 #define BNXT_PAGE_SHIFT PAGE_SHIFT 574 #elif (PAGE_SHIFT < 16) 575 #define BNXT_PAGE_SHIFT 13 576 #else 577 #define BNXT_PAGE_SHIFT 16 578 #endif 579 580 #define BNXT_PAGE_SIZE (1 << BNXT_PAGE_SHIFT) 581 582 #define MAX_CTX_PAGES (BNXT_PAGE_SIZE / 8) 583 #define MAX_CTX_TOTAL_PAGES (MAX_CTX_PAGES * MAX_CTX_PAGES) 584 struct bnxt_ring_mem_info { 585 int nr_pages; 586 int page_size; 587 uint16_t flags; 588 #define BNXT_RMEM_VALID_PTE_FLAG 1 589 #define BNXT_RMEM_RING_PTE_FLAG 2 590 #define BNXT_RMEM_USE_FULL_PAGE_FLAG 4 591 uint16_t depth; 592 uint8_t init_val; 593 struct iflib_dma_info *pg_arr; 594 struct iflib_dma_info pg_tbl; 595 int vmem_size; 596 void **vmem; 597 }; 598 599 struct bnxt_ctx_pg_info { 600 uint32_t entries; 601 uint32_t nr_pages; 602 struct iflib_dma_info ctx_arr[MAX_CTX_PAGES]; 603 struct bnxt_ring_mem_info ring_mem; 604 struct bnxt_ctx_pg_info **ctx_pg_tbl; 605 }; 606 607 struct bnxt_ctx_mem_info { 608 uint32_t qp_max_entries; 609 uint16_t qp_min_qp1_entries; 610 uint16_t qp_max_l2_entries; 611 uint16_t qp_entry_size; 612 uint16_t srq_max_l2_entries; 613 uint32_t srq_max_entries; 614 uint16_t srq_entry_size; 615 uint16_t cq_max_l2_entries; 616 uint32_t cq_max_entries; 617 uint16_t cq_entry_size; 618 uint16_t vnic_max_vnic_entries; 619 uint16_t vnic_max_ring_table_entries; 620 uint16_t vnic_entry_size; 621 uint32_t stat_max_entries; 622 uint16_t stat_entry_size; 623 uint16_t tqm_entry_size; 624 uint32_t tqm_min_entries_per_ring; 625 uint32_t tqm_max_entries_per_ring; 626 uint32_t mrav_max_entries; 627 uint16_t mrav_entry_size; 628 uint16_t tim_entry_size; 629 uint32_t tim_max_entries; 630 uint8_t tqm_entries_multiple; 631 uint8_t ctx_kind_initializer; 632 633 uint32_t flags; 634 #define BNXT_CTX_FLAG_INITED 0x01 635 636 struct bnxt_ctx_pg_info qp_mem; 637 struct bnxt_ctx_pg_info srq_mem; 638 struct bnxt_ctx_pg_info cq_mem; 639 struct bnxt_ctx_pg_info vnic_mem; 640 struct bnxt_ctx_pg_info stat_mem; 641 struct bnxt_ctx_pg_info mrav_mem; 642 struct bnxt_ctx_pg_info tim_mem; 643 struct bnxt_ctx_pg_info *tqm_mem[9]; 644 }; 645 646 struct bnxt_hw_resc { 647 uint16_t min_rsscos_ctxs; 648 uint16_t max_rsscos_ctxs; 649 uint16_t min_cp_rings; 650 uint16_t max_cp_rings; 651 uint16_t resv_cp_rings; 652 uint16_t min_tx_rings; 653 uint16_t max_tx_rings; 654 uint16_t resv_tx_rings; 655 uint16_t max_tx_sch_inputs; 656 uint16_t min_rx_rings; 657 uint16_t max_rx_rings; 658 uint16_t resv_rx_rings; 659 uint16_t min_hw_ring_grps; 660 uint16_t max_hw_ring_grps; 661 uint16_t resv_hw_ring_grps; 662 uint16_t min_l2_ctxs; 663 uint16_t max_l2_ctxs; 664 uint16_t min_vnics; 665 uint16_t max_vnics; 666 uint16_t resv_vnics; 667 uint16_t min_stat_ctxs; 668 uint16_t max_stat_ctxs; 669 uint16_t resv_stat_ctxs; 670 uint16_t max_nqs; 671 uint16_t max_irqs; 672 uint16_t resv_irqs; 673 }; 674 675 #define BNXT_LLQ(q_profile) \ 676 ((q_profile) == HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSLESS_ROCE) 677 #define BNXT_CNPQ(q_profile) \ 678 ((q_profile) == HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSY_ROCE_CNP) 679 680 #define BNXT_HWRM_MAX_REQ_LEN (softc->hwrm_max_req_len) 681 682 struct bnxt_softc_list { 683 SLIST_ENTRY(bnxt_softc_list) next; 684 struct bnxt_softc *softc; 685 }; 686 687 struct bnxt_softc { 688 device_t dev; 689 if_ctx_t ctx; 690 if_softc_ctx_t scctx; 691 if_shared_ctx_t sctx; 692 uint32_t domain; 693 uint32_t bus; 694 uint32_t slot; 695 uint32_t function; 696 uint32_t dev_fn; 697 struct ifmedia *media; 698 struct bnxt_ctx_mem_info *ctx_mem; 699 struct bnxt_hw_resc hw_resc; 700 struct bnxt_softc_list list; 701 702 struct bnxt_bar_info hwrm_bar; 703 struct bnxt_bar_info doorbell_bar; 704 struct bnxt_link_info link_info; 705 #define BNXT_FLAG_VF 0x0001 706 #define BNXT_FLAG_NPAR 0x0002 707 #define BNXT_FLAG_WOL_CAP 0x0004 708 #define BNXT_FLAG_SHORT_CMD 0x0008 709 #define BNXT_FLAG_FW_CAP_NEW_RM 0x0010 710 #define BNXT_FLAG_CHIP_P5 0x0020 711 #define BNXT_FLAG_TPA 0x0040 712 #define BNXT_FLAG_FW_CAP_EXT_STATS 0x0080 713 uint32_t flags; 714 #define BNXT_STATE_LINK_CHANGE (0) 715 #define BNXT_STATE_MAX (BNXT_STATE_LINK_CHANGE + 1) 716 bitstr_t *state_bv; 717 uint32_t total_msix; 718 719 struct bnxt_func_info func; 720 struct bnxt_func_qcfg fn_qcfg; 721 struct bnxt_pf_info pf; 722 struct bnxt_vf_info vf; 723 724 uint16_t hwrm_cmd_seq; 725 uint32_t hwrm_cmd_timeo; /* milliseconds */ 726 struct iflib_dma_info hwrm_cmd_resp; 727 struct iflib_dma_info hwrm_short_cmd_req_addr; 728 /* Interrupt info for HWRM */ 729 struct if_irq irq; 730 struct mtx hwrm_lock; 731 uint16_t hwrm_max_req_len; 732 uint16_t hwrm_max_ext_req_len; 733 uint32_t hwrm_spec_code; 734 735 #define BNXT_MAX_COS_QUEUE 8 736 uint8_t max_tc; 737 uint8_t max_lltc; /* lossless TCs */ 738 struct bnxt_cos_queue q_info[BNXT_MAX_COS_QUEUE]; 739 uint8_t tc_to_qidx[BNXT_MAX_COS_QUEUE]; 740 uint8_t q_ids[BNXT_MAX_COS_QUEUE]; 741 uint8_t max_q; 742 743 uint64_t admin_ticks; 744 struct iflib_dma_info hw_rx_port_stats; 745 struct iflib_dma_info hw_tx_port_stats; 746 struct rx_port_stats *rx_port_stats; 747 struct tx_port_stats *tx_port_stats; 748 749 struct iflib_dma_info hw_tx_port_stats_ext; 750 struct iflib_dma_info hw_rx_port_stats_ext; 751 struct tx_port_stats_ext *tx_port_stats_ext; 752 struct rx_port_stats_ext *rx_port_stats_ext; 753 754 int num_cp_rings; 755 756 struct bnxt_cp_ring *nq_rings; 757 758 struct bnxt_ring *tx_rings; 759 struct bnxt_cp_ring *tx_cp_rings; 760 struct iflib_dma_info tx_stats[BNXT_MAX_NUM_QUEUES]; 761 int ntxqsets; 762 763 struct bnxt_vnic_info vnic_info; 764 struct bnxt_ring *ag_rings; 765 struct bnxt_ring *rx_rings; 766 struct bnxt_cp_ring *rx_cp_rings; 767 struct bnxt_grp_info *grp_info; 768 struct iflib_dma_info rx_stats[BNXT_MAX_NUM_QUEUES]; 769 int nrxqsets; 770 uint16_t rx_buf_size; 771 772 struct bnxt_cp_ring def_cp_ring; 773 struct bnxt_cp_ring def_nq_ring; 774 struct iflib_dma_info def_cp_ring_mem; 775 struct iflib_dma_info def_nq_ring_mem; 776 struct grouptask def_cp_task; 777 struct bnxt_doorbell_ops db_ops; 778 779 struct sysctl_ctx_list hw_stats; 780 struct sysctl_oid *hw_stats_oid; 781 struct sysctl_ctx_list hw_lro_ctx; 782 struct sysctl_oid *hw_lro_oid; 783 struct sysctl_ctx_list flow_ctrl_ctx; 784 struct sysctl_oid *flow_ctrl_oid; 785 786 struct bnxt_ver_info *ver_info; 787 struct bnxt_nvram_info *nvm_info; 788 bool wol; 789 bool is_dev_init; 790 struct bnxt_hw_lro hw_lro; 791 uint8_t wol_filter_id; 792 uint16_t rx_coal_usecs; 793 uint16_t rx_coal_usecs_irq; 794 uint16_t rx_coal_frames; 795 uint16_t rx_coal_frames_irq; 796 uint16_t tx_coal_usecs; 797 uint16_t tx_coal_usecs_irq; 798 uint16_t tx_coal_frames; 799 uint16_t tx_coal_frames_irq; 800 801 #define BNXT_USEC_TO_COAL_TIMER(x) ((x) * 25 / 2) 802 #define BNXT_DEF_STATS_COAL_TICKS 1000000 803 #define BNXT_MIN_STATS_COAL_TICKS 250000 804 #define BNXT_MAX_STATS_COAL_TICKS 1000000 805 806 }; 807 808 struct bnxt_filter_info { 809 STAILQ_ENTRY(bnxt_filter_info) next; 810 uint64_t fw_l2_filter_id; 811 #define INVALID_MAC_INDEX ((uint16_t)-1) 812 uint16_t mac_index; 813 814 /* Filter Characteristics */ 815 uint32_t flags; 816 uint32_t enables; 817 uint8_t l2_addr[ETHER_ADDR_LEN]; 818 uint8_t l2_addr_mask[ETHER_ADDR_LEN]; 819 uint16_t l2_ovlan; 820 uint16_t l2_ovlan_mask; 821 uint16_t l2_ivlan; 822 uint16_t l2_ivlan_mask; 823 uint8_t t_l2_addr[ETHER_ADDR_LEN]; 824 uint8_t t_l2_addr_mask[ETHER_ADDR_LEN]; 825 uint16_t t_l2_ovlan; 826 uint16_t t_l2_ovlan_mask; 827 uint16_t t_l2_ivlan; 828 uint16_t t_l2_ivlan_mask; 829 uint8_t tunnel_type; 830 uint16_t mirror_vnic_id; 831 uint32_t vni; 832 uint8_t pri_hint; 833 uint64_t l2_filter_id_hint; 834 }; 835 836 #define I2C_DEV_ADDR_A0 0xa0 837 #define BNXT_MAX_PHY_I2C_RESP_SIZE 64 838 839 /* Function declarations */ 840 void bnxt_report_link(struct bnxt_softc *softc); 841 bool bnxt_check_hwrm_version(struct bnxt_softc *softc); 842 struct bnxt_softc *bnxt_find_dev(uint32_t domain, uint32_t bus, uint32_t dev_fn, char *name); 843 int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *bp, uint16_t i2c_addr, 844 uint16_t page_number, uint8_t bank, bool bank_sel_en, uint16_t start_addr, 845 uint16_t data_length, uint8_t *buf); 846 uint8_t get_phy_type(struct bnxt_softc *softc); 847 848 #endif /* _BNXT_H */ 849