Hi Dave,
This patch series contains several small changes to the bnx2x driver,
including dcb changes, graceful error handling and benign error masking,
and setting the driver's configuration according to management/nvram
held values.
Please consider applying these patches to 'net-next'.
Thanks,
Yuval Mintz
@@ -2032,40 +2032,39 @@ int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port)return0;}-staticintbnx2x_set_spio(structbnx2x*bp,intspio_num,u32mode)+staticintbnx2x_set_spio(structbnx2x*bp,intspio,u32mode){-u32spio_mask=(1<<spio_num);u32spio_reg;-if((spio_num<MISC_REGISTERS_SPIO_4)||-(spio_num>MISC_REGISTERS_SPIO_7)){-BNX2X_ERR("Invalid SPIO %d\n",spio_num);+/* Only 2 SPIOs are configurable */+if((spio!=MISC_SPIO_SPIO4)&&(spio!=MISC_SPIO_SPIO5)){+BNX2X_ERR("Invalid SPIO 0x%x\n",spio);return-EINVAL;}bnx2x_acquire_hw_lock(bp,HW_LOCK_RESOURCE_SPIO);/* read SPIO and mask except the float bits */-spio_reg=(REG_RD(bp,MISC_REG_SPIO)&MISC_REGISTERS_SPIO_FLOAT);+spio_reg=(REG_RD(bp,MISC_REG_SPIO)&MISC_SPIO_FLOAT);switch(mode){-caseMISC_REGISTERS_SPIO_OUTPUT_LOW:-DP(NETIF_MSG_HW,"Set SPIO %d -> output low\n",spio_num);+caseMISC_SPIO_OUTPUT_LOW:+DP(NETIF_MSG_HW,"Set SPIO 0x%x -> output low\n",spio);/* clear FLOAT and set CLR */-spio_reg&=~(spio_mask<<MISC_REGISTERS_SPIO_FLOAT_POS);-spio_reg|=(spio_mask<<MISC_REGISTERS_SPIO_CLR_POS);+spio_reg&=~(spio<<MISC_SPIO_FLOAT_POS);+spio_reg|=(spio<<MISC_SPIO_CLR_POS);break;-caseMISC_REGISTERS_SPIO_OUTPUT_HIGH:-DP(NETIF_MSG_HW,"Set SPIO %d -> output high\n",spio_num);+caseMISC_SPIO_OUTPUT_HIGH:+DP(NETIF_MSG_HW,"Set SPIO 0x%x -> output high\n",spio);/* clear FLOAT and set SET */-spio_reg&=~(spio_mask<<MISC_REGISTERS_SPIO_FLOAT_POS);-spio_reg|=(spio_mask<<MISC_REGISTERS_SPIO_SET_POS);+spio_reg&=~(spio<<MISC_SPIO_FLOAT_POS);+spio_reg|=(spio<<MISC_SPIO_SET_POS);break;-caseMISC_REGISTERS_SPIO_INPUT_HI_Z:-DP(NETIF_MSG_HW,"Set SPIO %d -> input\n",spio_num);+caseMISC_SPIO_INPUT_HI_Z:+DP(NETIF_MSG_HW,"Set SPIO 0x%x -> input\n",spio);/* set FLOAT */-spio_reg|=(spio_mask<<MISC_REGISTERS_SPIO_FLOAT_POS);+spio_reg|=(spio<<MISC_SPIO_FLOAT_POS);break;default:
@@ -6196,18 +6195,16 @@ static void bnx2x_setup_fan_failure_detection(struct bnx2x *bp)return;/* Fan failure is indicated by SPIO 5 */-bnx2x_set_spio(bp,MISC_REGISTERS_SPIO_5,-MISC_REGISTERS_SPIO_INPUT_HI_Z);+bnx2x_set_spio(bp,MISC_SPIO_SPIO5,MISC_SPIO_INPUT_HI_Z);/* set to active low mode */val=REG_RD(bp,MISC_REG_SPIO_INT);-val|=((1<<MISC_REGISTERS_SPIO_5)<<-MISC_REGISTERS_SPIO_INT_OLD_SET_POS);+val|=(MISC_SPIO_SPIO5<<MISC_SPIO_INT_OLD_SET_POS);REG_WR(bp,MISC_REG_SPIO_INT,val);/* enable interrupt to signal the IGU */val=REG_RD(bp,MISC_REG_SPIO_EVENT_EN);-val|=(1<<MISC_REGISTERS_SPIO_5);+val|=MISC_SPIO_SPIO5;REG_WR(bp,MISC_REG_SPIO_EVENT_EN,val);}
@@ -6969,7 +6966,7 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)/* If SPIO5 is set to generate interrupts, enable it for this port */val=REG_RD(bp,MISC_REG_SPIO_EVENT_EN);-if(val&(1<<MISC_REGISTERS_SPIO_5)){+if(val&MISC_SPIO_SPIO5){u32reg_addr=(port?MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0:MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);val=REG_RD(bp,reg_addr);
@@ -2426,7 +2426,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)}if(bp->port.pmf)-bnx2x_update_drv_flags(bp,1<<DRV_FLAGS_DCB_CONFIGURED,0);+bnx2x_update_drv_flags(bp,1<<DRV_FLAGS_PORT_MASK,0);elsebnx2x__link_status_update(bp);
@@ -1802,11 +1808,14 @@ static void bnx2x_dcbx_fw_struct(struct bnx2x *bp,u8cos=0,pri=0;structpriority_cos*tt2cos;u32*ttp=bp->dcbx_port_params.app.traffic_type_priority;+intmfw_configured=SHMEM2_HAS(bp,drv_flags)&&+GET_FLAGS(SHMEM2_RD(bp,drv_flags),+1<<DRV_FLAGS_DCB_MFW_CONFIGURED);memset(pfc_fw_cfg,0,sizeof(*pfc_fw_cfg));/* to disable DCB - the structure must be zeroed */-if(bp->dcbx_error&DCBX_REMOTE_MIB_ERROR)+if((bp->dcbx_error&DCBX_REMOTE_MIB_ERROR)&&!mfw_configured)return;/*shortcut*/
@@ -9000,9 +9010,6 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)/* TBD: Add resetting the NO_MCP mode DB here */-/* PXP */-bnx2x_pxp_prep(bp);-/* Open the gates #2, #3 and #4 */bnx2x_set_234_gates(bp,false);
If link is down due to management (and not due to actual phy link being lost),
driver should still behave as if the link is down; Querying via ethtool about
speed/duplex state should result in 'UNKNOWN' (same behaviour as when link is
actually down).
Signed-off-by: Yuval Mintz <redacted>
Signed-off-by: Eilon Greenstein <redacted>
---
.../net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 12 ++++--------
1 files changed, 4 insertions(+), 8 deletions(-)
From: Dmitry Kravkov <redacted>
Whenever bnx2x fails to transmit a packet due to a full Tx ring, if the
ring size is zero (indicating an FCoE ring) driver filters the packet out
and gracefully continues.
Driver also gathers statistics on such filtered packets.
Signed-off-by: Dmitry Kravkov <redacted>
Signed-off-by: Yuval Mintz <redacted>
Signed-off-by: Eilon Greenstein <redacted>
---
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 11 ++++++++---
.../net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 6 +++++-
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | 1 +
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h | 3 +++
4 files changed, 17 insertions(+), 4 deletions(-)
@@ -3127,11 +3127,16 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)BDS_PER_TX_PKT+NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))){/* Handle special storage cases separately */-if(txdata->tx_ring_size!=0){-BNX2X_ERR("BUG! Tx ring full when queue awake!\n");+if(txdata->tx_ring_size==0){+structbnx2x_eth_q_stats*q_stats=+bnx2x_fp_qstats(bp,txdata->parent_fp);+q_stats->driver_filtered_tx_pkt++;+dev_kfree_skb(skb);+returnNETDEV_TX_OK;+}bnx2x_fp_qstats(bp,txdata->parent_fp)->driver_xoff++;netif_tx_stop_queue(txq);-}+BNX2X_ERR("BUG! Tx ring full when queue awake!\n");returnNETDEV_TX_BUSY;}
@@ -1518,12 +1526,13 @@ enum mf_cfg_afex_vlan_mode {/* This structure is not applicable and should not be accessed on 57711 */structfunc_ext_cfg{u32func_cfg;-#define MACP_FUNC_CFG_FLAGS_MASK 0x000000FF+#define MACP_FUNC_CFG_FLAGS_MASK 0x0000007F#define MACP_FUNC_CFG_FLAGS_SHIFT 0#define MACP_FUNC_CFG_FLAGS_ENABLED 0x00000001#define MACP_FUNC_CFG_FLAGS_ETHERNET 0x00000002#define MACP_FUNC_CFG_FLAGS_ISCSI_OFFLOAD 0x00000004#define MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD 0x00000008+#define MACP_FUNC_CFG_PAUSE_ON_HOST_RING 0x00000080u32iscsi_mac_addr_upper;u32iscsi_mac_addr_lower;
@@ -10641,8 +10641,26 @@ static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)"bad Ethernet MAC address configuration: %pM\n""change it manually before bringing up the appropriate network interface\n",bp->dev->dev_addr);+}+staticbool__devinitbnx2x_get_dropless_info(structbnx2x*bp)+{+inttmp;+u32cfg;+if(IS_MF(bp)&&!CHIP_IS_E1x(bp)){+/* Take function: tmp = func */+tmp=BP_ABS_FUNC(bp);+cfg=MF_CFG_RD(bp,func_ext_config[tmp].func_cfg);+cfg=!!(cfg&MACP_FUNC_CFG_PAUSE_ON_HOST_RING);+}else{+/* Take port: tmp = port */+tmp=BP_PORT(bp);+cfg=SHMEM_RD(bp,+dev_info.port_hw_config[tmp].generic_features);+cfg=!!(cfg&PORT_HW_CFG_PAUSE_ON_HOST_RING_ENABLED);+}+returncfg;}staticint__devinitbnx2x_get_hwinfo(structbnx2x*bp)
@@ -11063,7 +11081,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)if(CHIP_IS_E1(bp))bp->dropless_fc=0;else-bp->dropless_fc=dropless_fc;+bp->dropless_fc=dropless_fc|bnx2x_get_dropless_info(bp);bp->mrrs=mrrs;
From: Yaniv Rosner <redacted>
A rare case of no link due to a missed interrupt may occur due to a
race condition between acknowledging the IGU via the BAR and restoring the NIG
interrupt mask via the GRC.
To solve it, we wait for the IGU ack command to finish prior to restoring the
NIG interrupt mask.
Signed-off-by: Yaniv Rosner <redacted>
Signed-off-by: Yuval Mintz <redacted>
Signed-off-by: Eilon Greenstein <redacted>
---
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 1 +
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 15 +++++++++++++++
2 files changed, 16 insertions(+), 0 deletions(-)
@@ -915,6 +915,7 @@ struct bnx2x_common {#define BNX2X_IGU_STAS_MSG_VF_CNT 64#define BNX2X_IGU_STAS_MSG_PF_CNT 4+#define MAX_IGU_ATTN_ACK_TO 100/* end of common *//* port */
@@ -3588,6 +3588,21 @@ static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted)/* now set back the mask */if(asserted&ATTN_NIG_FOR_FUNC){+/* Verify that IGU ack through BAR was written before restoring+*NIGmask.Thisloopshouldexitafter2-3iterationsmax.+*/+if(bp->common.int_block!=INT_BLOCK_HC){+u32cnt=0,igu_acked;+do{+igu_acked=REG_RD(bp,+IGU_REG_ATTENTION_ACK_BITS);+}while(((igu_acked&ATTN_NIG_FOR_FUNC)==0)&&+(++cnt<MAX_IGU_ATTN_ACK_TO));+if(!igu_acked)+DP(NETIF_MSG_HW,+"Failed to verify IGU ack on time\n");+barrier();+}REG_WR(bp,nig_int_mask_addr,nig_mask);bnx2x_release_phy_lock(bp);}
@@ -1904,6 +1904,11 @@ static u8 bnx2x_dcbnl_set_state(struct net_device *netdev, u8 state)structbnx2x*bp=netdev_priv(netdev);DP(BNX2X_MSG_DCB,"state = %s\n",state?"on":"off");+if(state&&((bp->dcbx_enabled==BNX2X_DCBX_ENABLED_OFF)||+(bp->dcbx_enabled==BNX2X_DCBX_ENABLED_INVALID))){+DP(BNX2X_MSG_DCB,"Can not set dcbx to enabled while it is disabled in nvm\n");+return1;+}bnx2x_dcbx_set_state(bp,(state?true:false),bp->dcbx_enabled);return0;}
When configuring pauses using 'ethtool -A', the requested values have
effect when used together with autoneg (up to this point, when configured
for autoneg, driver ignored requested pause configuration)
Signed-off-by: Yuval Mintz <redacted>
Signed-off-by: Eilon Greenstein <redacted>
---
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | 2 +-
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 49 ++++++++++++----------
2 files changed, 28 insertions(+), 23 deletions(-)
Hi Dave,
This patch series contains several small changes to the bnx2x driver,
including dcb changes, graceful error handling and benign error masking,
and setting the driver's configuration according to management/nvram
held values.
Please consider applying these patches to 'net-next'.