be2net: Implement initiate FW dump feature for Lancer
[deliverable/linux.git] / drivers / net / ethernet / emulex / benet / be_ethtool.c
index 3d4461adb3b4194eef3fe2dca339650665dac97b..4f8c941217cc017495736129373fe5d2ba40db60 100644 (file)
@@ -177,19 +177,15 @@ static void be_get_drvinfo(struct net_device *netdev,
                                struct ethtool_drvinfo *drvinfo)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       char fw_on_flash[FW_VER_LEN];
-
-       memset(fw_on_flash, 0 , sizeof(fw_on_flash));
-       be_cmd_get_fw_ver(adapter, adapter->fw_ver, fw_on_flash);
 
        strlcpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
        strlcpy(drvinfo->version, DRV_VER, sizeof(drvinfo->version));
-       if (!memcmp(adapter->fw_ver, fw_on_flash, FW_VER_LEN))
+       if (!memcmp(adapter->fw_ver, adapter->fw_on_flash, FW_VER_LEN))
                strlcpy(drvinfo->fw_version, adapter->fw_ver,
                        sizeof(drvinfo->fw_version));
        else
                snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
-                        "%s [%s]", adapter->fw_ver, fw_on_flash);
+                        "%s [%s]", adapter->fw_ver, adapter->fw_on_flash);
 
        strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
                sizeof(drvinfo->bus_info));
@@ -673,6 +669,34 @@ be_set_phys_id(struct net_device *netdev,
        return 0;
 }
 
+static int be_set_dump(struct net_device *netdev, struct ethtool_dump *dump)
+{
+       struct be_adapter *adapter = netdev_priv(netdev);
+       struct device *dev = &adapter->pdev->dev;
+       int status;
+
+       if (!lancer_chip(adapter)) {
+               dev_err(dev, "FW dump not supported\n");
+               return -EOPNOTSUPP;
+       }
+
+       if (dump_present(adapter)) {
+               dev_err(dev, "Previous dump not cleared, not forcing dump\n");
+               return 0;
+       }
+
+       switch (dump->flag) {
+       case LANCER_INITIATE_FW_DUMP:
+               status = lancer_initiate_dump(adapter);
+               if (!status)
+                       dev_info(dev, "F/w dump initiated successfully\n");
+               break;
+       default:
+               dev_err(dev, "Invalid dump level: 0x%x\n", dump->flag);
+               return -EINVAL;
+       }
+       return status;
+}
 
 static void
 be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
@@ -1110,6 +1134,7 @@ const struct ethtool_ops be_ethtool_ops = {
        .set_pauseparam = be_set_pauseparam,
        .get_strings = be_get_stat_strings,
        .set_phys_id = be_set_phys_id,
+       .set_dump = be_set_dump,
        .get_msglevel = be_get_msg_level,
        .set_msglevel = be_set_msg_level,
        .get_sset_count = be_get_sset_count,
This page took 0.027439 seconds and 5 git commands to generate.