lkml.org 
[lkml]   [2015]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 101/165] qlge: Fix qlge_update_hw_vlan_features to handle if interface is down
    Date
    3.16.7-ckt9 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Marcelo Leitner <mleitner@redhat.com>

    commit 61132bf7fbe3a802df1f68ad08e8ca10d6b30ddc upstream.

    Currently qlge_update_hw_vlan_features() will always first put the
    interface down, then update features and then bring it up again. But it
    is possible to hit this code while the adapter is down and this causes a
    non-paired call to napi_disable(), which will get stuck.

    This patch fixes it by skipping these down/up actions if the interface
    is already down.

    Fixes: a45adbe8d352 ("qlge: Enhance nested VLAN (Q-in-Q) handling.")
    Cc: Harish Patil <harish.patil@qlogic.com>
    Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    drivers/net/ethernet/qlogic/qlge/qlge_main.c | 26 ++++++++++++++++----------
    1 file changed, 16 insertions(+), 10 deletions(-)

    diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c
    index b40050e03a56..078da66132d5 100644
    --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c
    +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c
    @@ -2351,23 +2351,29 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev,
    {
    struct ql_adapter *qdev = netdev_priv(ndev);
    int status = 0;
    + bool need_restart = netif_running(ndev);

    - status = ql_adapter_down(qdev);
    - if (status) {
    - netif_err(qdev, link, qdev->ndev,
    - "Failed to bring down the adapter\n");
    - return status;
    + if (need_restart) {
    + status = ql_adapter_down(qdev);
    + if (status) {
    + netif_err(qdev, link, qdev->ndev,
    + "Failed to bring down the adapter\n");
    + return status;
    + }
    }

    /* update the features with resent change */
    ndev->features = features;

    - status = ql_adapter_up(qdev);
    - if (status) {
    - netif_err(qdev, link, qdev->ndev,
    - "Failed to bring up the adapter\n");
    - return status;
    + if (need_restart) {
    + status = ql_adapter_up(qdev);
    + if (status) {
    + netif_err(qdev, link, qdev->ndev,
    + "Failed to bring up the adapter\n");
    + return status;
    + }
    }
    +
    return status;
    }


    \
     
     \ /
      Last update: 2015-03-25 15:41    [W:4.182 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site