msleep(20);
        return rc;
 }
+
+static void bnx2x_chng_link_count(struct link_params *params, bool clear)
+{
+       struct bnx2x *bp = params->bp;
+       u32 addr, val;
+
+       /* Verify the link_change_count is supported by the MFW */
+       if (!(SHMEM2_HAS(bp, link_change_count)))
+               return;
+
+       addr = params->shmem2_base +
+               offsetof(struct shmem2_region, link_change_count[params->port]);
+       if (clear)
+               val = 0;
+       else
+               val = REG_RD(bp, addr) + 1;
+       REG_WR(bp, addr, val);
+}
+
 /* The bnx2x_link_update function should be called upon link
  * interrupt.
  * Link is considered up as follows:
        struct link_vars phy_vars[MAX_PHYS];
        u8 port = params->port;
        u8 link_10g_plus, phy_index;
+       u32 prev_link_status = vars->link_status;
        u8 ext_phy_link_up = 0, cur_link_up;
        int rc = 0;
        u8 is_mi_int = 0;
        else
                rc = bnx2x_update_link_down(params, vars);
 
+       if ((prev_link_status ^ vars->link_status) & LINK_STATUS_LINK_UP)
+               bnx2x_chng_link_count(params, false);
+
        /* Update MCP link status was changed */
        if (params->feature_config_flags & FEATURE_CONFIG_BC_SUPPORTS_AFEX)
                bnx2x_fw_command(bp, DRV_MSG_CODE_LINK_STATUS_CHANGED, 0);
        params->link_flags = PHY_INITIALIZED;
        /* Driver opens NIG-BRB filters */
        bnx2x_set_rx_filter(params, 1);
+       bnx2x_chng_link_count(params, true);
        /* Check if link flap can be avoided */
        lfa_status = bnx2x_check_lfa(params);
 
        DP(NETIF_MSG_LINK, "Resetting the link of port %d\n", port);
        /* Disable attentions */
        vars->link_status = 0;
+       bnx2x_chng_link_count(params, true);
        bnx2x_update_mng(params, vars->link_status);
        vars->eee_status &= ~(SHMEM_EEE_LP_ADV_STATUS_MASK |
                              SHMEM_EEE_ACTIVE_BIT);