qlge: Fix ethtool WOL calls to operate only on devices that support WOL.
authorJitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Tue, 10 Jul 2012 14:57:33 +0000 (14:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Jul 2012 06:28:33 +0000 (23:28 -0700)
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qlge/qlge.h
drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c

index 6e7050c7127d05f1f8a861545688d900f03497db..02fd96bb7db68c2b0b37c13c392ae9543b686f8f 100644 (file)
@@ -25,6 +25,8 @@
 #define QLGE_VENDOR_ID    0x1077
 #define QLGE_DEVICE_ID_8012    0x8012
 #define QLGE_DEVICE_ID_8000    0x8000
+#define QLGE_MEZZ_SSYS_ID_068  0x0068
+#define QLGE_MEZZ_SSYS_ID_180  0x0180
 #define MAX_CPUS 8
 #define MAX_TX_RINGS MAX_CPUS
 #define MAX_RX_RINGS ((MAX_CPUS * 2) + 1)
index 8e2c2a74f3a5bbf05a892e30d33b2bf79fd07e5d..c2adfa26906d6ed6480ec9710774d4e57b5bd02b 100644 (file)
@@ -388,17 +388,29 @@ static void ql_get_drvinfo(struct net_device *ndev,
 static void ql_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
-       /* What we support. */
-       wol->supported = WAKE_MAGIC;
-       /* What we've currently got set. */
-       wol->wolopts = qdev->wol;
+       unsigned short ssys_dev = qdev->pdev->subsystem_device;
+
+       /* WOL is only supported for mezz card. */
+       if (ssys_dev == QLGE_MEZZ_SSYS_ID_068 ||
+                       ssys_dev == QLGE_MEZZ_SSYS_ID_180) {
+               wol->supported = WAKE_MAGIC;
+               wol->wolopts = qdev->wol;
+       }
 }
 
 static int ql_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
        int status;
+       unsigned short ssys_dev = qdev->pdev->subsystem_device;
 
+       /* WOL is only supported for mezz card. */
+       if (ssys_dev != QLGE_MEZZ_SSYS_ID_068 ||
+                       ssys_dev != QLGE_MEZZ_SSYS_ID_180) {
+               netif_info(qdev, drv, qdev->ndev,
+                               "WOL is only supported for mezz card\n");
+               return -EOPNOTSUPP;
+       }
        if (wol->wolopts & ~WAKE_MAGIC)
                return -EINVAL;
        qdev->wol = wol->wolopts;