be2net: fix to set proper flow control on resume
authorAjit Khaparde <ajitk@serverengines.com>
Fri, 6 Nov 2009 02:06:59 +0000 (02:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 7 Nov 2009 04:26:03 +0000 (20:26 -0800)
If be2 goes into suspend after a user changes the flow control settings,
we are not programming them back after resume. This patch takes care of it.
We now get the flow control settings before going to suspend mode and
then apply them during resume.

Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/benet/be.h
drivers/net/benet/be_ethtool.c
drivers/net/benet/be_main.c

index a80da0e14a52b31c22706e641290ef2da1b7c455..3b79a225628aedea1bd7d3683bc7948f5db2264a 100644 (file)
@@ -259,6 +259,8 @@ struct be_adapter {
        u32 port_num;
        bool promiscuous;
        u32 cap;
+       u32 rx_fc;              /* Rx flow control */
+       u32 tx_fc;              /* Tx flow control */
 };
 
 extern const struct ethtool_ops be_ethtool_ops;
index cda5bf2fc50acf5b07406eff6ff488c532f67dbf..f0fd95b43c071e9ec34c10156d4ec6bdb7cd0128 100644 (file)
@@ -323,10 +323,12 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
 
        if (ecmd->autoneg != 0)
                return -EINVAL;
+       adapter->tx_fc = ecmd->tx_pause;
+       adapter->rx_fc = ecmd->rx_pause;
 
-       status = be_cmd_set_flow_control(adapter, ecmd->tx_pause,
-                       ecmd->rx_pause);
-       if (!status)
+       status = be_cmd_set_flow_control(adapter,
+                                       adapter->tx_fc, adapter->rx_fc);
+       if (status)
                dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
 
        return status;
index 1f941f027718afd95dde07c70f26db49ab55ccde..4a7a4527182dcfd9e7b859cb691d8af86c308dcd 100644 (file)
@@ -1652,7 +1652,8 @@ static int be_setup(struct be_adapter *adapter)
        if (status != 0)
                goto mccqs_destroy;
 
-       status = be_cmd_set_flow_control(adapter, true, true);
+       status = be_cmd_set_flow_control(adapter,
+                                       adapter->tx_fc, adapter->rx_fc);
        if (status != 0)
                goto mccqs_destroy;
        return 0;
@@ -1909,6 +1910,10 @@ static void be_netdev_init(struct net_device *netdev)
 
        adapter->rx_csum = true;
 
+       /* Default settings for Rx and Tx flow control */
+       adapter->rx_fc = true;
+       adapter->tx_fc = true;
+
        netif_set_gso_max_size(netdev, 65535);
 
        BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
@@ -2171,6 +2176,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
                be_close(netdev);
                rtnl_unlock();
        }
+       be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc);
        be_clear(adapter);
 
        pci_save_state(pdev);