diff options
-rw-r--r-- | sys/dev/bxe/bxe.c | 108 | ||||
-rw-r--r-- | sys/dev/bxe/bxe.h | 7 | ||||
-rw-r--r-- | sys/dev/bxe/bxe_elink.c | 47 | ||||
-rw-r--r-- | sys/dev/bxe/ecore_hsi.h | 10 | ||||
-rw-r--r-- | sys/dev/bxe/ecore_init.h | 38 | ||||
-rw-r--r-- | sys/dev/bxe/ecore_reg.h | 1 | ||||
-rw-r--r-- | sys/dev/bxe/ecore_sp.c | 84 | ||||
-rw-r--r-- | sys/dev/bxe/ecore_sp.h | 6 |
8 files changed, 186 insertions, 115 deletions
diff --git a/sys/dev/bxe/bxe.c b/sys/dev/bxe/bxe.c index f8b808e..5ec4a52 100644 --- a/sys/dev/bxe/bxe.c +++ b/sys/dev/bxe/bxe.c @@ -34,7 +34,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#define BXE_DRIVER_VERSION "1.78.18" +#define BXE_DRIVER_VERSION "1.78.75" #include "bxe.h" #include "ecore_sp.h" @@ -303,70 +303,70 @@ static int load_count[2][3] = { {0} }; /* per-path: 0-common, 1-port0, 2-port1 * SYSCTL_NODE(_hw, OID_AUTO, bxe, CTLFLAG_RD, 0, "bxe driver parameters"); /* Debug */ -uint32_t bxe_debug = 0; -TUNABLE_INT("hw.bxe.debug", &bxe_debug); -SYSCTL_UINT(_hw_bxe, OID_AUTO, debug, (CTLFLAG_RDTUN), - &bxe_debug, 0, "Debug logging mode"); +unsigned long bxe_debug = 0; +TUNABLE_ULONG("hw.bxe.debug", &bxe_debug); +SYSCTL_ULONG(_hw_bxe, OID_AUTO, debug, (CTLFLAG_RDTUN), + &bxe_debug, 0, "Debug logging mode"); /* Interrupt Mode: 0 (IRQ), 1 (MSI/IRQ), and 2 (MSI-X/MSI/IRQ) */ static int bxe_interrupt_mode = INTR_MODE_MSIX; TUNABLE_INT("hw.bxe.interrupt_mode", &bxe_interrupt_mode); -SYSCTL_UINT(_hw_bxe, OID_AUTO, interrupt_mode, CTLFLAG_RDTUN, - &bxe_interrupt_mode, 0, "Interrupt (MSI-X/MSI/INTx) mode"); +SYSCTL_INT(_hw_bxe, OID_AUTO, interrupt_mode, CTLFLAG_RDTUN, + &bxe_interrupt_mode, 0, "Interrupt (MSI-X/MSI/INTx) mode"); /* Number of Queues: 0 (Auto) or 1 to 16 (fixed queue number) */ static int bxe_queue_count = 4; TUNABLE_INT("hw.bxe.queue_count", &bxe_queue_count); -SYSCTL_UINT(_hw_bxe, OID_AUTO, queue_count, CTLFLAG_RDTUN, - &bxe_queue_count, 0, "Multi-Queue queue count"); +SYSCTL_INT(_hw_bxe, OID_AUTO, queue_count, CTLFLAG_RDTUN, + &bxe_queue_count, 0, "Multi-Queue queue count"); /* max number of buffers per queue (default RX_BD_USABLE) */ -static uint32_t bxe_max_rx_bufs = 0; +static int bxe_max_rx_bufs = 0; TUNABLE_INT("hw.bxe.max_rx_bufs", &bxe_max_rx_bufs); -SYSCTL_UINT(_hw_bxe, OID_AUTO, max_rx_bufs, CTLFLAG_RDTUN, - &bxe_max_rx_bufs, 0, "Maximum Number of Rx Buffers Per Queue"); +SYSCTL_INT(_hw_bxe, OID_AUTO, max_rx_bufs, CTLFLAG_RDTUN, + &bxe_max_rx_bufs, 0, "Maximum Number of Rx Buffers Per Queue"); /* Host interrupt coalescing RX tick timer (usecs) */ -static uint32_t bxe_hc_rx_ticks = 25; +static int bxe_hc_rx_ticks = 25; TUNABLE_INT("hw.bxe.hc_rx_ticks", &bxe_hc_rx_ticks); -SYSCTL_UINT(_hw_bxe, OID_AUTO, hc_rx_ticks, CTLFLAG_RDTUN, - &bxe_hc_rx_ticks, 0, "Host Coalescing Rx ticks"); +SYSCTL_INT(_hw_bxe, OID_AUTO, hc_rx_ticks, CTLFLAG_RDTUN, + &bxe_hc_rx_ticks, 0, "Host Coalescing Rx ticks"); /* Host interrupt coalescing TX tick timer (usecs) */ -static uint32_t bxe_hc_tx_ticks = 50; +static int bxe_hc_tx_ticks = 50; TUNABLE_INT("hw.bxe.hc_tx_ticks", &bxe_hc_tx_ticks); -SYSCTL_UINT(_hw_bxe, OID_AUTO, hc_tx_ticks, CTLFLAG_RDTUN, - &bxe_hc_tx_ticks, 0, "Host Coalescing Tx ticks"); +SYSCTL_INT(_hw_bxe, OID_AUTO, hc_tx_ticks, CTLFLAG_RDTUN, + &bxe_hc_tx_ticks, 0, "Host Coalescing Tx ticks"); /* Maximum number of Rx packets to process at a time */ -static uint32_t bxe_rx_budget = 0xffffffff; +static int bxe_rx_budget = 0xffffffff; TUNABLE_INT("hw.bxe.rx_budget", &bxe_rx_budget); -SYSCTL_UINT(_hw_bxe, OID_AUTO, rx_budget, CTLFLAG_TUN, - &bxe_rx_budget, 0, "Rx processing budget"); +SYSCTL_INT(_hw_bxe, OID_AUTO, rx_budget, CTLFLAG_TUN, + &bxe_rx_budget, 0, "Rx processing budget"); /* Maximum LRO aggregation size */ -static uint32_t bxe_max_aggregation_size = 0; +static int bxe_max_aggregation_size = 0; TUNABLE_INT("hw.bxe.max_aggregation_size", &bxe_max_aggregation_size); -SYSCTL_UINT(_hw_bxe, OID_AUTO, max_aggregation_size, CTLFLAG_TUN, - &bxe_max_aggregation_size, 0, "max aggregation size"); +SYSCTL_INT(_hw_bxe, OID_AUTO, max_aggregation_size, CTLFLAG_TUN, + &bxe_max_aggregation_size, 0, "max aggregation size"); /* PCI MRRS: -1 (Auto), 0 (128B), 1 (256B), 2 (512B), 3 (1KB) */ static int bxe_mrrs = -1; TUNABLE_INT("hw.bxe.mrrs", &bxe_mrrs); -SYSCTL_UINT(_hw_bxe, OID_AUTO, mrrs, CTLFLAG_RDTUN, - &bxe_mrrs, 0, "PCIe maximum read request size"); +SYSCTL_INT(_hw_bxe, OID_AUTO, mrrs, CTLFLAG_RDTUN, + &bxe_mrrs, 0, "PCIe maximum read request size"); /* AutoGrEEEn: 0 (hardware default), 1 (force on), 2 (force off) */ static int bxe_autogreeen = 0; TUNABLE_INT("hw.bxe.autogreeen", &bxe_autogreeen); -SYSCTL_UINT(_hw_bxe, OID_AUTO, autogreeen, CTLFLAG_RDTUN, - &bxe_autogreeen, 0, "AutoGrEEEn support"); +SYSCTL_INT(_hw_bxe, OID_AUTO, autogreeen, CTLFLAG_RDTUN, + &bxe_autogreeen, 0, "AutoGrEEEn support"); /* 4-tuple RSS support for UDP: 0 (disabled), 1 (enabled) */ static int bxe_udp_rss = 0; TUNABLE_INT("hw.bxe.udp_rss", &bxe_udp_rss); -SYSCTL_UINT(_hw_bxe, OID_AUTO, udp_rss, CTLFLAG_RDTUN, - &bxe_udp_rss, 0, "UDP RSS support"); +SYSCTL_INT(_hw_bxe, OID_AUTO, udp_rss, CTLFLAG_RDTUN, + &bxe_udp_rss, 0, "UDP RSS support"); #define STAT_NAME_LEN 32 /* no stat names below can be longer than this */ @@ -3604,10 +3604,10 @@ bxe_watchdog(struct bxe_softc *sc, return (0); } - BXE_FP_TX_UNLOCK(fp); - BLOGE(sc, "TX watchdog timeout on fp[%02d], resetting!\n", fp->index); + BXE_FP_TX_UNLOCK(fp); + atomic_store_rel_long(&sc->chip_tq_flags, CHIP_TQ_REINIT); taskqueue_enqueue(sc->chip_tq, &sc->chip_tq_task); @@ -3652,21 +3652,21 @@ bxe_txeof(struct bxe_softc *sc, tx_bd_avail = bxe_tx_avail(sc, fp); - /* reset the watchdog timer if there are pending transmits */ - if (tx_bd_avail >= BXE_TX_CLEANUP_THRESHOLD) { + if (tx_bd_avail < BXE_TX_CLEANUP_THRESHOLD) { + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + } else { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + } - if (tx_bd_avail >= (TX_BD_USABLE - 1)) { - /* clear watchdog if the tx chain is empty */ - fp->watchdog_timer = 0; - return (FALSE); - } - - /* reset watchdog if there are pending transmits */ + if (fp->tx_pkt_prod != fp->tx_pkt_cons) { + /* reset the watchdog timer if there are pending transmits */ fp->watchdog_timer = BXE_TX_TIMEOUT; + return (TRUE); + } else { + /* clear watchdog when there are no pending transmits */ + fp->watchdog_timer = 0; + return (FALSE); } - - return (TRUE); } static void @@ -5879,13 +5879,11 @@ bxe_tx_start_locked(struct bxe_softc *sc, /* handle any completions if we're running low */ if (tx_bd_avail < BXE_TX_CLEANUP_THRESHOLD) { + /* bxe_txeof will set IFF_DRV_OACTIVE appropriately */ bxe_txeof(sc, fp); - } - - /* close TX if we're still running low */ - if (tx_bd_avail < BXE_TX_CLEANUP_THRESHOLD) { - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - break; + if (ifp->if_drv_flags & IFF_DRV_OACTIVE) { + break; + } } } @@ -6008,13 +6006,11 @@ bxe_tx_mq_start_locked(struct bxe_softc *sc, /* handle any completions if we're running low */ if (tx_bd_avail < BXE_TX_CLEANUP_THRESHOLD) { + /* bxe_txeof will set IFF_DRV_OACTIVE appropriately */ bxe_txeof(sc, fp); - } - - /* close TX if we're still running low */ - if (tx_bd_avail < BXE_TX_CLEANUP_THRESHOLD) { - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - break; + if (ifp->if_drv_flags & IFF_DRV_OACTIVE) { + break; + } } next = drbr_dequeue(ifp, tx_br); @@ -14173,7 +14169,7 @@ bxe_get_tunable_params(struct bxe_softc *sc) BLOGD(sc, DBG_LOAD, "User Config: " - "debug=0x%x " + "debug=0x%lx " "interrupt_mode=%d " "queue_count=%d " "hc_rx_ticks=%d " diff --git a/sys/dev/bxe/bxe.h b/sys/dev/bxe/bxe.h index 34d4c85..47a0b79 100644 --- a/sys/dev/bxe/bxe.h +++ b/sys/dev/bxe/bxe.h @@ -748,6 +748,9 @@ struct bxe_fastpath { #define BXE_VF_ID_INVALID 0xFF #define IS_SRIOV(sc) 0 +#define GET_NUM_VFS_PER_PATH(sc) 0 +#define GET_NUM_VFS_PER_PF(sc) 0 + /* maximum number of fast-path interrupt contexts */ #define FP_SB_MAX_E1x 16 #define FP_SB_MAX_E2 HC_SB_MAX_SB_E2 @@ -1405,7 +1408,7 @@ struct bxe_softc { #define BXE_MF_FUNC_DIS 0x00000800 #define BXE_TX_SWITCHING 0x00001000 - uint32_t debug; /* per-instance debug logging config */ + unsigned long debug; /* per-instance debug logging config */ #define MAX_BARS 5 struct bxe_bar bar[MAX_BARS]; /* map BARs 0, 2, 4 */ @@ -1603,7 +1606,7 @@ struct bxe_softc { int max_rx_bufs; int hc_rx_ticks; int hc_tx_ticks; - uint32_t rx_budget; + int rx_budget; int max_aggregation_size; int mrrs; int autogreeen; diff --git a/sys/dev/bxe/bxe_elink.c b/sys/dev/bxe/bxe_elink.c index 5ac0ec5..f4e2801 100644 --- a/sys/dev/bxe/bxe_elink.c +++ b/sys/dev/bxe/bxe_elink.c @@ -607,6 +607,7 @@ Theotherbitsarereservedandshouldbezero*/ #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea +#define MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI 0x80fa #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 #define MDIO_WC_REG_XGXS_STATUS3 0x8129 #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 @@ -4632,6 +4633,19 @@ static void elink_warpcore_enable_AN_KR(struct elink_phy *phy, elink_warpcore_enable_AN_KR2(phy, params, vars); } else { + /* Enable Auto-Detect to support 1G over CL37 as well */ + elink_cl45_write(sc, phy, MDIO_WC_DEVAD, + MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, 0x10); + + /* Force cl48 sync_status LOW to avoid getting stuck in CL73 + * parallel-detect loop when CL73 and CL37 are enabled. + */ + CL22_WR_OVER_CL45(sc, phy, MDIO_REG_BANK_AER_BLOCK, + MDIO_AER_BLOCK_AER_REG, 0); + elink_cl45_write(sc, phy, MDIO_WC_DEVAD, + MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI, 0x0800); + elink_set_aer_mmd(params, phy); + elink_disable_kr2(params, vars, phy); } @@ -7317,10 +7331,8 @@ static elink_status_t elink_link_initialize(struct elink_params *params, (CHIP_IS_E1x(sc) || CHIP_IS_E2(sc))) elink_set_parallel_detection(phy, params); - if (params->phy[ELINK_INT_PHY].config_init) - params->phy[ELINK_INT_PHY].config_init(phy, - params, - vars); + if (params->phy[ELINK_INT_PHY].config_init) + params->phy[ELINK_INT_PHY].config_init(phy, params, vars); } /* Re-read this value in case it was changed inside config_init due to @@ -8904,17 +8916,20 @@ static elink_status_t elink_get_edc_mode(struct elink_phy *phy, *edc_mode = ELINK_EDC_MODE_ACTIVE_DAC; else check_limiting_mode = 1; - } else if (copper_module_type & - ELINK_SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { - ELINK_DEBUG_P0(sc, - "Passive Copper cable detected\n"); - *edc_mode = - ELINK_EDC_MODE_PASSIVE_DAC; } else { - ELINK_DEBUG_P1(sc, - "Unknown copper-cable-type 0x%x !!!\n", - copper_module_type); - return ELINK_STATUS_ERROR; + *edc_mode = ELINK_EDC_MODE_PASSIVE_DAC; + /* Even in case PASSIVE_DAC indication is not set, + * treat it as a passive DAC cable, since some cables + * don't have this indication. + */ + if (copper_module_type & + ELINK_SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { + ELINK_DEBUG_P0(sc, + "Passive Copper cable detected\n"); + } else { + ELINK_DEBUG_P0(sc, + "Unknown copper-cable-type\n"); + } } break; } @@ -14360,6 +14375,10 @@ static uint8_t elink_analyze_link_error(struct elink_params *params, ELINK_DEBUG_P3(sc, "Link changed:[%x %x]->%x\n", vars->link_up, old_status, status); + /* Do not touch the link in case physical link down */ + if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0) + return 1; + /* a. Update shmem->link_status accordingly * b. Update elink_vars->link_up */ diff --git a/sys/dev/bxe/ecore_hsi.h b/sys/dev/bxe/ecore_hsi.h index b06ace1..1da8e38 100644 --- a/sys/dev/bxe/ecore_hsi.h +++ b/sys/dev/bxe/ecore_hsi.h @@ -1057,6 +1057,9 @@ struct port_feat_cfg { /* port 0: 0x454 port 1: 0x4c8 */ #define PORT_FEATURE_MBA_VLAN_TAG_MASK 0x0000FFFF #define PORT_FEATURE_MBA_VLAN_TAG_SHIFT 0 #define PORT_FEATURE_MBA_VLAN_EN 0x00010000 + #define PORT_FEATUTE_BOFM_CFGD_EN 0x00020000 + #define PORT_FEATURE_BOFM_CFGD_FTGT 0x00040000 + #define PORT_FEATURE_BOFM_CFGD_VEN 0x00080000 uint32_t Reserved1; uint32_t smbus_config; @@ -1099,8 +1102,8 @@ struct port_feat_cfg { /* port 0: 0x454 port 1: 0x4c8 */ #define PORT_FEATURE_LINK_SPEED_MASK 0x000F0000 #define PORT_FEATURE_LINK_SPEED_SHIFT 16 #define PORT_FEATURE_LINK_SPEED_AUTO 0x00000000 - #define PORT_FEATURE_LINK_SPEED_10M_FULL 0x00010000 - #define PORT_FEATURE_LINK_SPEED_10M_HALF 0x00020000 + #define PORT_FEATURE_LINK_SPEED_10M_HALF 0x00010000 + #define PORT_FEATURE_LINK_SPEED_10M_FULL 0x00020000 #define PORT_FEATURE_LINK_SPEED_100M_HALF 0x00030000 #define PORT_FEATURE_LINK_SPEED_100M_FULL 0x00040000 #define PORT_FEATURE_LINK_SPEED_1G 0x00050000 @@ -1654,6 +1657,7 @@ struct drv_func_mb { #define DRV_MSG_CODE_LOAD_REQ_FORCE_LFA 0x00002000 #define DRV_MSG_CODE_USR_BLK_IMAGE_REQ 0x00000001 + #define DRV_MSG_CODE_ISCSI_PERS_IMAGE_REQ 0x00000002 uint32_t fw_mb_header; #define FW_MSG_CODE_MASK 0xffff0000 @@ -2558,6 +2562,8 @@ struct shmem2_region { uint32_t drv_func_info_size; /* Offset 0x150 */ uint32_t link_attr_sync[PORT_MAX]; /* Offset 0x154 */ #define LINK_ATTR_SYNC_KR2_ENABLE (1<<0) + + uint32_t ibft_host_addr_hi; /* Initialize by uEFI ROM */ }; diff --git a/sys/dev/bxe/ecore_init.h b/sys/dev/bxe/ecore_init.h index 4e61cab..21242ac 100644 --- a/sys/dev/bxe/ecore_init.h +++ b/sys/dev/bxe/ecore_init.h @@ -717,23 +717,35 @@ static const struct { * [30] MCP Latched ump_tx_parity * [31] MCP Latched scpad_parity */ -#define MISC_AEU_ENABLE_MCP_PRTY_BITS \ +#define MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS \ (AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \ AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \ - AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \ + AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY) + +#define MISC_AEU_ENABLE_MCP_PRTY_BITS \ + (MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS | \ AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY) /* Below registers control the MCP parity attention output. When * MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are * enabled, when cleared - disabled. */ -static const uint32_t mcp_attn_ctl_regs[] = { - MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, - MISC_REG_AEU_ENABLE4_NIG_0, - MISC_REG_AEU_ENABLE4_PXP_0, - MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, - MISC_REG_AEU_ENABLE4_NIG_1, - MISC_REG_AEU_ENABLE4_PXP_1 +static const struct { + uint32_t addr; + uint32_t bits; +} mcp_attn_ctl_regs[] = { + { MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, + MISC_AEU_ENABLE_MCP_PRTY_BITS }, + { MISC_REG_AEU_ENABLE4_NIG_0, + MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS }, + { MISC_REG_AEU_ENABLE4_PXP_0, + MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS }, + { MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, + MISC_AEU_ENABLE_MCP_PRTY_BITS }, + { MISC_REG_AEU_ENABLE4_NIG_1, + MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS }, + { MISC_REG_AEU_ENABLE4_PXP_1, + MISC_AEU_ENABLE_MCP_PRTY_SUB_BITS } }; static inline void ecore_set_mcp_parity(struct bxe_softc *sc, uint8_t enable) @@ -742,14 +754,14 @@ static inline void ecore_set_mcp_parity(struct bxe_softc *sc, uint8_t enable) uint32_t reg_val; for (i = 0; i < ARRSIZE(mcp_attn_ctl_regs); i++) { - reg_val = REG_RD(sc, mcp_attn_ctl_regs[i]); + reg_val = REG_RD(sc, mcp_attn_ctl_regs[i].addr); if (enable) - reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS; + reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS; /* Linux is using mcp_attn_ctl_regs[i].bits */ else - reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS; + reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS; /* Linux is using mcp_attn_ctl_regs[i].bits */ - REG_WR(sc, mcp_attn_ctl_regs[i], reg_val); + REG_WR(sc, mcp_attn_ctl_regs[i].addr, reg_val); } } diff --git a/sys/dev/bxe/ecore_reg.h b/sys/dev/bxe/ecore_reg.h index cf42766..3c8de57 100644 --- a/sys/dev/bxe/ecore_reg.h +++ b/sys/dev/bxe/ecore_reg.h @@ -3384,6 +3384,7 @@ Theotherbitsarereservedandshouldbezero*/ #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea +#define MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI 0x80fa #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 #define MDIO_WC_REG_XGXS_STATUS3 0x8129 #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 diff --git a/sys/dev/bxe/ecore_sp.c b/sys/dev/bxe/ecore_sp.c index c7a3b3f..d3a5ad8 100644 --- a/sys/dev/bxe/ecore_sp.c +++ b/sys/dev/bxe/ecore_sp.c @@ -168,16 +168,6 @@ static inline void __ecore_exe_queue_reset_pending( } } -static inline void ecore_exe_queue_reset_pending(struct bxe_softc *sc, - struct ecore_exe_queue_obj *o) -{ - ECORE_SPIN_LOCK_BH(&o->lock); - - __ecore_exe_queue_reset_pending(sc, o); - - ECORE_SPIN_UNLOCK_BH(&o->lock); -} - /** * ecore_exe_queue_step - execute one execution chunk atomically * @@ -188,7 +178,6 @@ static inline void ecore_exe_queue_reset_pending(struct bxe_softc *sc, * (Should be called while holding the exe_queue->lock). */ static inline int ecore_exe_queue_step(struct bxe_softc *sc, - struct ecore_vlan_mac_obj *vobj, struct ecore_exe_queue_obj *o, unsigned long *ramrod_flags) { @@ -491,7 +480,7 @@ static void __ecore_vlan_mac_h_exec_pending(struct bxe_softc *sc, ramrod_flags); o->head_exe_request = FALSE; o->saved_ramrod_flags = 0; - rc = ecore_exe_queue_step(sc, o, &o->exe_queue, &ramrod_flags); + rc = ecore_exe_queue_step(sc, &o->exe_queue, &ramrod_flags); if (rc != ECORE_SUCCESS) { ECORE_ERR("execution of pending commands failed with rc %d\n", rc); @@ -667,7 +656,8 @@ static int ecore_get_n_elements(struct bxe_softc *sc, struct ecore_vlan_mac_obj { struct ecore_vlan_mac_registry_elem *pos; uint8_t *next = base; - int counter = 0, read_lock; + int counter = 0; + int read_lock; ECORE_MSG(sc, "get_n_elements - taking vlan_mac_lock (reader)\n"); read_lock = ecore_vlan_mac_h_read_lock(sc, o); @@ -680,7 +670,7 @@ static int ecore_get_n_elements(struct bxe_softc *sc, struct ecore_vlan_mac_obj if (counter < n) { ECORE_MEMCPY(next, &pos->u, size); counter++; - ECORE_MSG(sc, "copied element number %d to address %p element was:", + ECORE_MSG(sc, "copied element number %d to address %p element was:\n", counter, next); next += stride + size; } @@ -1669,7 +1659,7 @@ static int __ecore_vlan_mac_execute_step(struct bxe_softc *sc, */ rc = ECORE_PENDING; } else { - rc = ecore_exe_queue_step(sc, o, &o->exe_queue, ramrod_flags); + rc = ecore_exe_queue_step(sc, &o->exe_queue, ramrod_flags); } ECORE_SPIN_UNLOCK_BH(&o->exe_queue.lock); @@ -1693,12 +1683,19 @@ static int ecore_complete_vlan_mac(struct bxe_softc *sc, struct ecore_raw_obj *r = &o->raw; int rc; + /* Clearing the pending list & raw state should be made + * atomically (as execution flow assumes they represent the same) + */ + ECORE_SPIN_LOCK_BH(&o->exe_queue.lock); + /* Reset pending list */ - ecore_exe_queue_reset_pending(sc, &o->exe_queue); + __ecore_exe_queue_reset_pending(sc, &o->exe_queue); /* Clear pending */ r->clear_pending(r); + ECORE_SPIN_UNLOCK_BH(&o->exe_queue.lock); + /* If ramrod failed this is most likely a SW bug */ if (cqe->message.error) return ECORE_INVAL; @@ -1857,6 +1854,7 @@ static int ecore_execute_vlan_mac(struct bxe_softc *sc, * and exit. Otherwise send a ramrod to FW. */ if (!drv_only) { + ECORE_DBG_BREAK_IF(r->check_pending(r)); /* Set pending */ r->set_pending(r); @@ -2090,10 +2088,11 @@ static int ecore_vlan_mac_del_all(struct bxe_softc *sc, unsigned long *ramrod_flags) { struct ecore_vlan_mac_registry_elem *pos = NULL; - int rc = 0, read_lock; struct ecore_vlan_mac_ramrod_params p; struct ecore_exe_queue_obj *exeq = &o->exe_queue; struct ecore_exeq_elem *exeq_pos, *exeq_pos_n; + int read_lock; + int rc = 0; /* Clear pending commands first */ @@ -2529,7 +2528,8 @@ static int ecore_set_rx_mode_e2(struct bxe_softc *sc, ETH_FILTER_RULES_CMD_TX_CMD; ecore_rx_mode_set_cmd_state_e2(sc, &p->tx_accept_flags, - &(data->rules[rule_idx++]), FALSE); + &(data->rules[rule_idx++]), + FALSE); } /* Rx */ @@ -2541,7 +2541,8 @@ static int ecore_set_rx_mode_e2(struct bxe_softc *sc, ETH_FILTER_RULES_CMD_RX_CMD; ecore_rx_mode_set_cmd_state_e2(sc, &p->rx_accept_flags, - &(data->rules[rule_idx++]), FALSE); + &(data->rules[rule_idx++]), + FALSE); } /* If FCoE Queue configuration has been requested configure the Rx and @@ -2559,10 +2560,10 @@ static int ecore_set_rx_mode_e2(struct bxe_softc *sc, data->rules[rule_idx].cmd_general_data = ETH_FILTER_RULES_CMD_TX_CMD; - ecore_rx_mode_set_cmd_state_e2(sc, - &p->tx_accept_flags, - &(data->rules[rule_idx++]), + ecore_rx_mode_set_cmd_state_e2(sc, &p->tx_accept_flags, + &(data->rules[rule_idx]), TRUE); + rule_idx++; } /* Rx */ @@ -2573,10 +2574,10 @@ static int ecore_set_rx_mode_e2(struct bxe_softc *sc, data->rules[rule_idx].cmd_general_data = ETH_FILTER_RULES_CMD_RX_CMD; - ecore_rx_mode_set_cmd_state_e2(sc, - &p->rx_accept_flags, - &(data->rules[rule_idx++]), + ecore_rx_mode_set_cmd_state_e2(sc, &p->rx_accept_flags, + &(data->rules[rule_idx]), TRUE); + rule_idx++; } } @@ -2718,7 +2719,7 @@ static int ecore_mcast_enqueue_cmd(struct bxe_softc *sc, if (!new_cmd) return ECORE_NOMEM; - ECORE_MSG(sc, "About to enqueue a new %d command. macs_list_len=%d\n", \ + ECORE_MSG(sc, "About to enqueue a new %d command. macs_list_len=%d\n", cmd, macs_list_len); ECORE_LIST_INIT(&new_cmd->data.macs_head); @@ -4259,9 +4260,22 @@ void ecore_init_mac_credit_pool(struct bxe_softc *sc, * CAM credit is equaly divided between all active functions * on the PATH. */ - if ((func_num > 0)) { + if ((func_num > 1)) { if (!CHIP_REV_IS_SLOW(sc)) - cam_sz = (MAX_MAC_CREDIT_E2 / func_num); + cam_sz = (MAX_MAC_CREDIT_E2 + - GET_NUM_VFS_PER_PATH(sc)) + / func_num + + GET_NUM_VFS_PER_PF(sc); + else + cam_sz = ECORE_CAM_SIZE_EMUL; + + /* No need for CAM entries handling for 57712 and + * newer. + */ + ecore_init_credit_pool(p, -1, cam_sz); + } else if (func_num == 1) { + if (!CHIP_REV_IS_SLOW(sc)) + cam_sz = MAX_MAC_CREDIT_E2; else cam_sz = ECORE_CAM_SIZE_EMUL; @@ -4332,6 +4346,10 @@ static int ecore_setup_rss(struct bxe_softc *sc, rss_mode = ETH_RSS_MODE_DISABLED; else if (ECORE_TEST_BIT(ECORE_RSS_MODE_REGULAR, &p->rss_flags)) rss_mode = ETH_RSS_MODE_REGULAR; +#if defined(__VMKLNX__) && (VMWARE_ESX_DDK_VERSION < 55000) /* ! BNX2X_UPSTREAM */ + else if (ECORE_TEST_BIT(ECORE_RSS_MODE_ESX51, &p->rss_flags)) + rss_mode = ETH_RSS_MODE_ESX51; +#endif data->rss_mode = rss_mode; @@ -4456,6 +4474,16 @@ void ecore_init_rss_config_obj(struct bxe_softc *sc, rss_obj->config_rss = ecore_setup_rss; } +int validate_vlan_mac(struct bxe_softc *sc, + struct ecore_vlan_mac_obj *vlan_mac) +{ + if (!vlan_mac->get_n_elements) { + ECORE_ERR("vlan mac object was not intialized\n"); + return ECORE_INVAL; + } + return 0; +} + /********************** Queue state object ***********************************/ /** diff --git a/sys/dev/bxe/ecore_sp.h b/sys/dev/bxe/ecore_sp.h index ae7ddee..ccb83eb 100644 --- a/sys/dev/bxe/ecore_sp.h +++ b/sys/dev/bxe/ecore_sp.h @@ -1148,6 +1148,9 @@ enum { ECORE_RSS_IPV6_UDP, ECORE_RSS_TUNNELING, +#if defined(__VMKLNX__) && (VMWARE_ESX_DDK_VERSION < 55000) /* ! BNX2X_UPSTREAM */ + ECORE_RSS_MODE_ESX51, +#endif }; struct ecore_config_rss_params { @@ -1857,6 +1860,9 @@ int ecore_config_rss(struct bxe_softc *sc, void ecore_get_rss_ind_table(struct ecore_rss_config_obj *rss_obj, uint8_t *ind_table); +/* set as inline so printout will show the offending function */ +int validate_vlan_mac(struct bxe_softc *sc, + struct ecore_vlan_mac_obj *vlan_mac); #endif /* ECORE_SP_H */ |