bnx2x: Send update-svid ramrod with retry/poll flags enabled
authorSudarsana Reddy Kalluru <sudarsana.kalluru@cavium.com>
Wed, 12 Dec 2018 16:57:03 +0000 (08:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Dec 2018 00:25:14 +0000 (16:25 -0800)
Driver sends update-SVID ramrod in the MFW notification path.
If there is a pending ramrod, driver doesn't retry the command
and storm firmware will never be updated with the SVID value.
The patch adds changes to send update-svid ramrod in process context with
retry/poll flags set.

Signed-off-by: Sudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: Ariel Elior <ariel.elior@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index 7ea9066ce126692f5b24f4f4f4b53bfa46c938e7..5cd3135dfe302331b30e6bb1105add2a95189c6c 100644 (file)
@@ -1282,6 +1282,7 @@ enum sp_rtnl_flag {
        BNX2X_SP_RTNL_TX_STOP,
        BNX2X_SP_RTNL_GET_DRV_VERSION,
        BNX2X_SP_RTNL_CHANGE_UDP_PORT,
+       BNX2X_SP_RTNL_UPDATE_SVID,
 };
 
 enum bnx2x_iov_flag {
index 6b54eb1ad8ba3b0b0817394b1a3e637be9d3666b..b164f705709d083576e92fb4e2fd007cd3dbe9bb 100644 (file)
@@ -2925,6 +2925,10 @@ static void bnx2x_handle_update_svid_cmd(struct bnx2x *bp)
        func_params.f_obj = &bp->func_obj;
        func_params.cmd = BNX2X_F_CMD_SWITCH_UPDATE;
 
+       /* Prepare parameters for function state transitions */
+       __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
+       __set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
+
        if (IS_MF_UFP(bp) || IS_MF_BD(bp)) {
                int func = BP_ABS_FUNC(bp);
                u32 val;
@@ -4311,7 +4315,8 @@ static void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn)
                                bnx2x_handle_eee_event(bp);
 
                        if (val & DRV_STATUS_OEM_UPDATE_SVID)
-                               bnx2x_handle_update_svid_cmd(bp);
+                               bnx2x_schedule_sp_rtnl(bp,
+                                       BNX2X_SP_RTNL_UPDATE_SVID, 0);
 
                        if (bp->link_vars.periodic_flags &
                            PERIODIC_FLAGS_LINK_EVENT) {
@@ -10394,6 +10399,9 @@ sp_rtnl_not_reset:
                               &bp->sp_rtnl_state))
                bnx2x_update_mng_version(bp);
 
+       if (test_and_clear_bit(BNX2X_SP_RTNL_UPDATE_SVID, &bp->sp_rtnl_state))
+               bnx2x_handle_update_svid_cmd(bp);
+
        if (test_and_clear_bit(BNX2X_SP_RTNL_CHANGE_UDP_PORT,
                               &bp->sp_rtnl_state)) {
                if (bnx2x_udp_port_update(bp)) {