Commit 4440c6f7 authored by David S. Miller's avatar David S. Miller

Merge branch 'bnx2x'

Yuval Mintz says:

====================
bnx2x: Bug fixes patch series

This patch series contains fixes for various flows - several SR-IOV issues
are fixed, ethtool callbacks (coalescing and register dump) are corrected,
null pointer dereference on error flows is prevented, etc.

Changes from V1
---------------
 - Patch 2  "bnx2x: Prevent an illegal pointer dereference during panic"
   is revised, with improved handling of edge cases.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 49595b7b edd31476
...@@ -1197,8 +1197,9 @@ union cdu_context { ...@@ -1197,8 +1197,9 @@ union cdu_context {
/* TM (timers) host DB constants */ /* TM (timers) host DB constants */
#define TM_ILT_PAGE_SZ_HW 0 #define TM_ILT_PAGE_SZ_HW 0
#define TM_ILT_PAGE_SZ (4096 << TM_ILT_PAGE_SZ_HW) /* 4K */ #define TM_ILT_PAGE_SZ (4096 << TM_ILT_PAGE_SZ_HW) /* 4K */
/* #define TM_CONN_NUM (CNIC_STARTING_CID+CNIC_ISCSI_CXT_MAX) */ #define TM_CONN_NUM (BNX2X_FIRST_VF_CID + \
#define TM_CONN_NUM 1024 BNX2X_VF_CIDS + \
CNIC_ISCSI_CID_MAX)
#define TM_ILT_SZ (8 * TM_CONN_NUM) #define TM_ILT_SZ (8 * TM_CONN_NUM)
#define TM_ILT_LINES DIV_ROUND_UP(TM_ILT_SZ, TM_ILT_PAGE_SZ) #define TM_ILT_LINES DIV_ROUND_UP(TM_ILT_SZ, TM_ILT_PAGE_SZ)
...@@ -1527,7 +1528,6 @@ struct bnx2x { ...@@ -1527,7 +1528,6 @@ struct bnx2x {
#define PCI_32BIT_FLAG (1 << 1) #define PCI_32BIT_FLAG (1 << 1)
#define ONE_PORT_FLAG (1 << 2) #define ONE_PORT_FLAG (1 << 2)
#define NO_WOL_FLAG (1 << 3) #define NO_WOL_FLAG (1 << 3)
#define USING_DAC_FLAG (1 << 4)
#define USING_MSIX_FLAG (1 << 5) #define USING_MSIX_FLAG (1 << 5)
#define USING_MSI_FLAG (1 << 6) #define USING_MSI_FLAG (1 << 6)
#define DISABLE_MSI_FLAG (1 << 7) #define DISABLE_MSI_FLAG (1 << 7)
...@@ -1621,7 +1621,7 @@ struct bnx2x { ...@@ -1621,7 +1621,7 @@ struct bnx2x {
u16 rx_ticks_int; u16 rx_ticks_int;
u16 rx_ticks; u16 rx_ticks;
/* Maximal coalescing timeout in us */ /* Maximal coalescing timeout in us */
#define BNX2X_MAX_COALESCE_TOUT (0xf0*12) #define BNX2X_MAX_COALESCE_TOUT (0xff*BNX2X_BTR)
u32 lin_cnt; u32 lin_cnt;
...@@ -2072,7 +2072,8 @@ u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type, ...@@ -2072,7 +2072,8 @@ u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type,
void bnx2x_prep_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae, void bnx2x_prep_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
u8 src_type, u8 dst_type); u8 src_type, u8 dst_type);
int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae); int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
u32 *comp);
/* FLR related routines */ /* FLR related routines */
u32 bnx2x_flr_clnup_poll_count(struct bnx2x *bp); u32 bnx2x_flr_clnup_poll_count(struct bnx2x *bp);
...@@ -2498,4 +2499,8 @@ enum bnx2x_pci_bus_speed { ...@@ -2498,4 +2499,8 @@ enum bnx2x_pci_bus_speed {
}; };
void bnx2x_set_local_cmng(struct bnx2x *bp); void bnx2x_set_local_cmng(struct bnx2x *bp);
#define MCPR_SCRATCH_BASE(bp) \
(CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH)
#endif /* bnx2x.h */ #endif /* bnx2x.h */
...@@ -891,17 +891,8 @@ static void bnx2x_get_regs(struct net_device *dev, ...@@ -891,17 +891,8 @@ static void bnx2x_get_regs(struct net_device *dev,
* will re-enable parity attentions right after the dump. * will re-enable parity attentions right after the dump.
*/ */
/* Disable parity on path 0 */
bnx2x_pretend_func(bp, 0);
bnx2x_disable_blocks_parity(bp); bnx2x_disable_blocks_parity(bp);
/* Disable parity on path 1 */
bnx2x_pretend_func(bp, 1);
bnx2x_disable_blocks_parity(bp);
/* Return to current function */
bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1; dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1;
dump_hdr.preset = DUMP_ALL_PRESETS; dump_hdr.preset = DUMP_ALL_PRESETS;
dump_hdr.version = BNX2X_DUMP_VERSION; dump_hdr.version = BNX2X_DUMP_VERSION;
...@@ -928,18 +919,9 @@ static void bnx2x_get_regs(struct net_device *dev, ...@@ -928,18 +919,9 @@ static void bnx2x_get_regs(struct net_device *dev,
/* Actually read the registers */ /* Actually read the registers */
__bnx2x_get_regs(bp, p); __bnx2x_get_regs(bp, p);
/* Re-enable parity attentions on path 0 */ /* Re-enable parity attentions */
bnx2x_pretend_func(bp, 0);
bnx2x_clear_blocks_parity(bp); bnx2x_clear_blocks_parity(bp);
bnx2x_enable_blocks_parity(bp); bnx2x_enable_blocks_parity(bp);
/* Re-enable parity attentions on path 1 */
bnx2x_pretend_func(bp, 1);
bnx2x_clear_blocks_parity(bp);
bnx2x_enable_blocks_parity(bp);
/* Return to current function */
bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
} }
static int bnx2x_get_preset_regs_len(struct net_device *dev, u32 preset) static int bnx2x_get_preset_regs_len(struct net_device *dev, u32 preset)
...@@ -993,17 +975,8 @@ static int bnx2x_get_dump_data(struct net_device *dev, ...@@ -993,17 +975,8 @@ static int bnx2x_get_dump_data(struct net_device *dev,
* will re-enable parity attentions right after the dump. * will re-enable parity attentions right after the dump.
*/ */
/* Disable parity on path 0 */
bnx2x_pretend_func(bp, 0);
bnx2x_disable_blocks_parity(bp); bnx2x_disable_blocks_parity(bp);
/* Disable parity on path 1 */
bnx2x_pretend_func(bp, 1);
bnx2x_disable_blocks_parity(bp);
/* Return to current function */
bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1; dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1;
dump_hdr.preset = bp->dump_preset_idx; dump_hdr.preset = bp->dump_preset_idx;
dump_hdr.version = BNX2X_DUMP_VERSION; dump_hdr.version = BNX2X_DUMP_VERSION;
...@@ -1032,19 +1005,10 @@ static int bnx2x_get_dump_data(struct net_device *dev, ...@@ -1032,19 +1005,10 @@ static int bnx2x_get_dump_data(struct net_device *dev,
/* Actually read the registers */ /* Actually read the registers */
__bnx2x_get_preset_regs(bp, p, dump_hdr.preset); __bnx2x_get_preset_regs(bp, p, dump_hdr.preset);
/* Re-enable parity attentions on path 0 */ /* Re-enable parity attentions */
bnx2x_pretend_func(bp, 0);
bnx2x_clear_blocks_parity(bp); bnx2x_clear_blocks_parity(bp);
bnx2x_enable_blocks_parity(bp); bnx2x_enable_blocks_parity(bp);
/* Re-enable parity attentions on path 1 */
bnx2x_pretend_func(bp, 1);
bnx2x_clear_blocks_parity(bp);
bnx2x_enable_blocks_parity(bp);
/* Return to current function */
bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
return 0; return 0;
} }
......
...@@ -640,23 +640,35 @@ static const struct { ...@@ -640,23 +640,35 @@ static const struct {
* [30] MCP Latched ump_tx_parity * [30] MCP Latched ump_tx_parity
* [31] MCP Latched scpad_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_ROM_PARITY | \
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_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) AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
/* Below registers control the MCP parity attention output. When /* Below registers control the MCP parity attention output. When
* MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are * MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are
* enabled, when cleared - disabled. * enabled, when cleared - disabled.
*/ */
static const u32 mcp_attn_ctl_regs[] = { static const struct {
MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, u32 addr;
MISC_REG_AEU_ENABLE4_NIG_0, u32 bits;
MISC_REG_AEU_ENABLE4_PXP_0, } mcp_attn_ctl_regs[] = {
MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, { MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0,
MISC_REG_AEU_ENABLE4_NIG_1, MISC_AEU_ENABLE_MCP_PRTY_BITS },
MISC_REG_AEU_ENABLE4_PXP_1 { 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 bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable) static inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable)
...@@ -665,14 +677,14 @@ static inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable) ...@@ -665,14 +677,14 @@ static inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable)
u32 reg_val; u32 reg_val;
for (i = 0; i < ARRAY_SIZE(mcp_attn_ctl_regs); i++) { for (i = 0; i < ARRAY_SIZE(mcp_attn_ctl_regs); i++) {
reg_val = REG_RD(bp, mcp_attn_ctl_regs[i]); reg_val = REG_RD(bp, mcp_attn_ctl_regs[i].addr);
if (enable) if (enable)
reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS; reg_val |= mcp_attn_ctl_regs[i].bits;
else else
reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS; reg_val &= ~mcp_attn_ctl_regs[i].bits;
REG_WR(bp, mcp_attn_ctl_regs[i], reg_val); REG_WR(bp, mcp_attn_ctl_regs[i].addr, reg_val);
} }
} }
......
...@@ -470,10 +470,10 @@ static int bnx2x_vfop_qdtor_cmd(struct bnx2x *bp, ...@@ -470,10 +470,10 @@ static int bnx2x_vfop_qdtor_cmd(struct bnx2x *bp,
bnx2x_vfop_qdtor, cmd->done); bnx2x_vfop_qdtor, cmd->done);
return bnx2x_vfop_transition(bp, vf, bnx2x_vfop_qdtor, return bnx2x_vfop_transition(bp, vf, bnx2x_vfop_qdtor,
cmd->block); cmd->block);
} else {
BNX2X_ERR("VF[%d] failed to add a vfop\n", vf->abs_vfid);
return -ENOMEM;
} }
DP(BNX2X_MSG_IOV, "VF[%d] failed to add a vfop. rc %d\n",
vf->abs_vfid, vfop->rc);
return -ENOMEM;
} }
static void static void
...@@ -3390,14 +3390,16 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac) ...@@ -3390,14 +3390,16 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac)
rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_ETH_MAC, true); rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_ETH_MAC, true);
if (rc) { if (rc) {
BNX2X_ERR("failed to delete eth macs\n"); BNX2X_ERR("failed to delete eth macs\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
/* remove existing uc list macs */ /* remove existing uc list macs */
rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_UC_LIST_MAC, true); rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_UC_LIST_MAC, true);
if (rc) { if (rc) {
BNX2X_ERR("failed to delete uc_list macs\n"); BNX2X_ERR("failed to delete uc_list macs\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
/* configure the new mac to device */ /* configure the new mac to device */
...@@ -3405,6 +3407,7 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac) ...@@ -3405,6 +3407,7 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac)
bnx2x_set_mac_one(bp, (u8 *)&bulletin->mac, mac_obj, true, bnx2x_set_mac_one(bp, (u8 *)&bulletin->mac, mac_obj, true,
BNX2X_ETH_MAC, &ramrod_flags); BNX2X_ETH_MAC, &ramrod_flags);
out:
bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC); bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC);
} }
...@@ -3467,7 +3470,8 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) ...@@ -3467,7 +3470,8 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
&ramrod_flags); &ramrod_flags);
if (rc) { if (rc) {
BNX2X_ERR("failed to delete vlans\n"); BNX2X_ERR("failed to delete vlans\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
/* send queue update ramrod to configure default vlan and silent /* send queue update ramrod to configure default vlan and silent
...@@ -3501,7 +3505,8 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) ...@@ -3501,7 +3505,8 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
rc = bnx2x_config_vlan_mac(bp, &ramrod_param); rc = bnx2x_config_vlan_mac(bp, &ramrod_param);
if (rc) { if (rc) {
BNX2X_ERR("failed to configure vlan\n"); BNX2X_ERR("failed to configure vlan\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
/* configure default vlan to vf queue and set silent /* configure default vlan to vf queue and set silent
...@@ -3519,18 +3524,18 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) ...@@ -3519,18 +3524,18 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
rc = bnx2x_queue_state_change(bp, &q_params); rc = bnx2x_queue_state_change(bp, &q_params);
if (rc) { if (rc) {
BNX2X_ERR("Failed to configure default VLAN\n"); BNX2X_ERR("Failed to configure default VLAN\n");
return rc; goto out;
} }
/* clear the flag indicating that this VF needs its vlan /* clear the flag indicating that this VF needs its vlan
* (will only be set if the HV configured th Vlan before vf was * (will only be set if the HV configured the Vlan before vf was
* and we were called because the VF came up later * up and we were called because the VF came up later
*/ */
out:
vf->cfg_flags &= ~VF_CFG_VLAN; vf->cfg_flags &= ~VF_CFG_VLAN;
bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN);
} }
return 0; return rc;
} }
/* crc is the first field in the bulletin board. Compute the crc over the /* crc is the first field in the bulletin board. Compute the crc over the
......
...@@ -196,7 +196,7 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp) ...@@ -196,7 +196,7 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp)
} else if (bp->func_stx) { } else if (bp->func_stx) {
*stats_comp = 0; *stats_comp = 0;
bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp)); bnx2x_issue_dmae_with_comp(bp, dmae, stats_comp);
} }
} }
......
...@@ -980,7 +980,7 @@ static int bnx2x_copy32_vf_dmae(struct bnx2x *bp, u8 from_vf, ...@@ -980,7 +980,7 @@ static int bnx2x_copy32_vf_dmae(struct bnx2x *bp, u8 from_vf,
dmae.len = len32; dmae.len = len32;
/* issue the command and wait for completion */ /* issue the command and wait for completion */
return bnx2x_issue_dmae_with_comp(bp, &dmae); return bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
} }
static void bnx2x_vf_mbx_resp(struct bnx2x *bp, struct bnx2x_virtf *vf) static void bnx2x_vf_mbx_resp(struct bnx2x *bp, struct bnx2x_virtf *vf)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment