qlge: Add ethtool get/set pause parameter.
authorRon Mercer <ron.mercer@qlogic.com>
Wed, 21 Oct 2009 11:07:38 +0000 (11:07 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Oct 2009 04:45:39 +0000 (21:45 -0700)
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_ethtool.c
drivers/net/qlge/qlge_mpi.c

index bc7a2e4..6118f50 100644 (file)
@@ -1645,6 +1645,8 @@ int ql_mb_about_fw(struct ql_adapter *qdev);
 void ql_link_on(struct ql_adapter *qdev);
 void ql_link_off(struct ql_adapter *qdev);
 int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control);
+int ql_mb_get_port_cfg(struct ql_adapter *qdev);
+int ql_mb_set_port_cfg(struct ql_adapter *qdev);
 int ql_wait_fifo_empty(struct ql_adapter *qdev);
 
 #if 1
index aac6c6f..dfb5c80 100644 (file)
@@ -424,6 +424,37 @@ static int ql_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *c)
        return ql_update_ring_coalescing(qdev);
 }
 
+static void ql_get_pauseparam(struct net_device *netdev,
+                       struct ethtool_pauseparam *pause)
+{
+       struct ql_adapter *qdev = netdev_priv(netdev);
+
+       ql_mb_get_port_cfg(qdev);
+       if (qdev->link_config & CFG_PAUSE_STD) {
+               pause->rx_pause = 1;
+               pause->tx_pause = 1;
+       }
+}
+
+static int ql_set_pauseparam(struct net_device *netdev,
+                       struct ethtool_pauseparam *pause)
+{
+       struct ql_adapter *qdev = netdev_priv(netdev);
+       int status = 0;
+
+       if ((pause->rx_pause) && (pause->tx_pause))
+               qdev->link_config |= CFG_PAUSE_STD;
+       else if (!pause->rx_pause && !pause->tx_pause)
+               qdev->link_config &= ~CFG_PAUSE_STD;
+       else
+               return -EINVAL;
+
+       status = ql_mb_set_port_cfg(qdev);
+       if (status)
+               return status;
+       return status;
+}
+
 static u32 ql_get_rx_csum(struct net_device *netdev)
 {
        struct ql_adapter *qdev = netdev_priv(netdev);
@@ -468,6 +499,8 @@ const struct ethtool_ops qlge_ethtool_ops = {
        .get_msglevel = ql_get_msglevel,
        .set_msglevel = ql_set_msglevel,
        .get_link = ethtool_op_get_link,
+       .get_pauseparam          = ql_get_pauseparam,
+       .set_pauseparam          = ql_set_pauseparam,
        .get_rx_csum = ql_get_rx_csum,
        .set_rx_csum = ql_set_rx_csum,
        .get_tx_csum = ethtool_op_get_tx_csum,
index e497eac..81a8489 100644 (file)
@@ -637,7 +637,7 @@ int ql_mb_idc_ack(struct ql_adapter *qdev)
  * for the current port.
  * Most likely will block.
  */
-static int ql_mb_set_port_cfg(struct ql_adapter *qdev)
+int ql_mb_set_port_cfg(struct ql_adapter *qdev)
 {
        struct mbox_params mbc;
        struct mbox_params *mbcp = &mbc;
@@ -672,7 +672,7 @@ static int ql_mb_set_port_cfg(struct ql_adapter *qdev)
  * for the current port.
  * Most likely will block.
  */
-static int ql_mb_get_port_cfg(struct ql_adapter *qdev)
+int ql_mb_get_port_cfg(struct ql_adapter *qdev)
 {
        struct mbox_params mbc;
        struct mbox_params *mbcp = &mbc;