diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index e3da2bddf143..f1d62d5dbaff 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -3705,16 +3705,14 @@ out: | |||
3705 | 3705 | ||
3706 | void bnx2x_update_mfw_dump(struct bnx2x *bp) | 3706 | void bnx2x_update_mfw_dump(struct bnx2x *bp) |
3707 | { | 3707 | { |
3708 | struct timeval epoc; | ||
3709 | u32 drv_ver; | 3708 | u32 drv_ver; |
3710 | u32 valid_dump; | 3709 | u32 valid_dump; |
3711 | 3710 | ||
3712 | if (!SHMEM2_HAS(bp, drv_info)) | 3711 | if (!SHMEM2_HAS(bp, drv_info)) |
3713 | return; | 3712 | return; |
3714 | 3713 | ||
3715 | /* Update Driver load time */ | 3714 | /* Update Driver load time, possibly broken in y2038 */ |
3716 | do_gettimeofday(&epoc); | 3715 | SHMEM2_WR(bp, drv_info.epoc, (u32)ktime_get_real_seconds()); |
3717 | SHMEM2_WR(bp, drv_info.epoc, epoc.tv_sec); | ||
3718 | 3716 | ||
3719 | drv_ver = bnx2x_update_mng_version_utility(DRV_MODULE_VERSION, true); | 3717 | drv_ver = bnx2x_update_mng_version_utility(DRV_MODULE_VERSION, true); |
3720 | SHMEM2_WR(bp, drv_info.drv_ver, drv_ver); | 3718 | SHMEM2_WR(bp, drv_info.drv_ver, drv_ver); |
@@ -10110,12 +10108,18 @@ static void __bnx2x_add_vxlan_port(struct bnx2x *bp, u16 port) | |||
10110 | if (!netif_running(bp->dev)) | 10108 | if (!netif_running(bp->dev)) |
10111 | return; | 10109 | return; |
10112 | 10110 | ||
10113 | if (bp->vxlan_dst_port || !IS_PF(bp)) { | 10111 | if (bp->vxlan_dst_port_count && bp->vxlan_dst_port == port) { |
10112 | bp->vxlan_dst_port_count++; | ||
10113 | return; | ||
10114 | } | ||
10115 | |||
10116 | if (bp->vxlan_dst_port_count || !IS_PF(bp)) { | ||
10114 | DP(BNX2X_MSG_SP, "Vxlan destination port limit reached\n"); | 10117 | DP(BNX2X_MSG_SP, "Vxlan destination port limit reached\n"); |
10115 | return; | 10118 | return; |
10116 | } | 10119 | } |
10117 | 10120 | ||
10118 | bp->vxlan_dst_port = port; | 10121 | bp->vxlan_dst_port = port; |
10122 | bp->vxlan_dst_port_count = 1; | ||
10119 | bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_ADD_VXLAN_PORT, 0); | 10123 | bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_ADD_VXLAN_PORT, 0); |
10120 | } | 10124 | } |
10121 | 10125 | ||
@@ -10130,10 +10134,14 @@ static void bnx2x_add_vxlan_port(struct net_device *netdev, | |||
10130 | 10134 | ||
10131 | static void __bnx2x_del_vxlan_port(struct bnx2x *bp, u16 port) | 10135 | static void __bnx2x_del_vxlan_port(struct bnx2x *bp, u16 port) |
10132 | { | 10136 | { |
10133 | if (!bp->vxlan_dst_port || bp->vxlan_dst_port != port || !IS_PF(bp)) { | 10137 | if (!bp->vxlan_dst_port_count || bp->vxlan_dst_port != port || |
10138 | !IS_PF(bp)) { | ||
10134 | DP(BNX2X_MSG_SP, "Invalid vxlan port\n"); | 10139 | DP(BNX2X_MSG_SP, "Invalid vxlan port\n"); |
10135 | return; | 10140 | return; |
10136 | } | 10141 | } |
10142 | bp->vxlan_dst_port--; | ||
10143 | if (bp->vxlan_dst_port) | ||
10144 | return; | ||
10137 | 10145 | ||
10138 | if (netif_running(bp->dev)) { | 10146 | if (netif_running(bp->dev)) { |
10139 | bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_DEL_VXLAN_PORT, 0); | 10147 | bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_DEL_VXLAN_PORT, 0); |