]> git.karo-electronics.de Git - linux-beck.git/commitdiff
qed: Prevent MF link notifications
authorSudarsana Reddy Kalluru <sudarsana.kalluru@qlogic.com>
Wed, 9 Mar 2016 07:16:23 +0000 (09:16 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 11 Mar 2016 20:20:19 +0000 (15:20 -0500)
When device is configured for Multi-function mode, some older management
firmware might incorrectly notify interfaces of link changes while they
haven't requested the physical link configuration to be set.
This can create bizzare race conditions where unloading interfaces are
getting notified that the link is up.

Let the driver compensate - store the logical requested state of the link
and don't propagate notifications after protocol driver explicitly
requires the link to be unset.

Signed-off-by: Sudarsana Reddy Kalluru <sudarsana.kalluru@qlogic.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed.h
drivers/net/ethernet/qlogic/qed/qed_mcp.c

index e5604eec81bf22789fb6abe838fcbbb88f6db161..fcb8e9ba51d9b6ad85ecf6bd2361e71896c6b592 100644 (file)
@@ -303,6 +303,9 @@ struct qed_hwfn {
        bool                            b_int_enabled;
        bool                            b_int_requested;
 
+       /* True if the driver requests for the link */
+       bool                            b_drv_link_init;
+
        struct qed_mcp_info             *mcp_info;
 
        struct qed_hw_cid_data          *p_tx_cids;
index f23ce734ab637f06fe2ad5ecb56608eda7f02851..2bf98248c29e0256e0f6b4ba72646117b7d73dad 100644 (file)
@@ -390,7 +390,10 @@ static void qed_mcp_handle_link_change(struct qed_hwfn *p_hwfn,
                return;
        }
 
-       p_link->link_up = !!(status & LINK_STATUS_LINK_UP);
+       if (p_hwfn->b_drv_link_init)
+               p_link->link_up = !!(status & LINK_STATUS_LINK_UP);
+       else
+               p_link->link_up = false;
 
        p_link->full_duplex = true;
        switch ((status & LINK_STATUS_SPEED_AND_DUPLEX_MASK)) {
@@ -520,6 +523,8 @@ int qed_mcp_set_link(struct qed_hwfn *p_hwfn,
                       offsetof(struct public_drv_mb, union_data) + i,
                       ((u32 *)&phy_cfg)[i >> 2]);
 
+       p_hwfn->b_drv_link_init = b_up;
+
        if (b_up) {
                DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
                           "Configuring Link: Speed 0x%08x, Pause 0x%08x, adv_speed 0x%08x, loopback 0x%08x, features 0x%08x\n",