Merge branch 'pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux
[pandora-kernel.git] / drivers / net / ethernet / qlogic / qlcnic / qlcnic_ethtool.c
index b127f80..8aa1c6e 100644 (file)
@@ -418,9 +418,6 @@ qlcnic_get_ringparam(struct net_device *dev,
        ring->rx_max_pending = adapter->max_rxd;
        ring->rx_jumbo_max_pending = adapter->max_jumbo_rxd;
        ring->tx_max_pending = MAX_CMD_DESCRIPTORS;
-
-       ring->rx_mini_max_pending = 0;
-       ring->rx_mini_pending = 0;
 }
 
 static u32
@@ -659,7 +656,7 @@ static int qlcnic_irq_test(struct net_device *netdev)
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
        int max_sds_rings = adapter->max_sds_rings;
        int ret;
-       u32 *rd_args[3];
+       struct qlcnic_cmd_args cmd;
 
        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
                return -EIO;
@@ -669,10 +666,12 @@ static int qlcnic_irq_test(struct net_device *netdev)
                goto clear_it;
 
        adapter->diag_cnt = 0;
-       memset(rd_args, 0, sizeof(rd_args));
-       ret = qlcnic_issue_cmd(adapter, adapter->ahw->pci_func,
-                       adapter->fw_hal_version, adapter->ahw->pci_func,
-                       0, 0, 0x00000011, rd_args);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.cmd = QLCNIC_CDRP_CMD_INTRPT_TEST;
+       cmd.req.arg1 = adapter->ahw->pci_func;
+       qlcnic_issue_cmd(adapter, &cmd);
+       ret = cmd.rsp.cmd;
+
        if (ret)
                goto done;
 
@@ -936,31 +935,49 @@ static int qlcnic_set_led(struct net_device *dev,
 {
        struct qlcnic_adapter *adapter = netdev_priv(dev);
        int max_sds_rings = adapter->max_sds_rings;
+       int err = -EIO, active = 1;
+
+       if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
+               netdev_warn(dev, "LED test not supported for non "
+                               "privilege function\n");
+               return -EOPNOTSUPP;
+       }
 
        switch (state) {
        case ETHTOOL_ID_ACTIVE:
                if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state))
                        return -EBUSY;
 
-               if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
-                       if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
-                               return -EIO;
+               if (test_bit(__QLCNIC_RESETTING, &adapter->state))
+                       break;
 
-                       if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST)) {
-                               clear_bit(__QLCNIC_RESETTING, &adapter->state);
-                               return -EIO;
-                       }
+               if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
+                       if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
+                               break;
                        set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
                }
 
-               if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0)
-                       return 0;
+               if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) {
+                       err = 0;
+                       break;
+               }
 
                dev_err(&adapter->pdev->dev,
                        "Failed to set LED blink state.\n");
                break;
 
        case ETHTOOL_ID_INACTIVE:
+               active = 0;
+
+               if (test_bit(__QLCNIC_RESETTING, &adapter->state))
+                       break;
+
+               if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
+                       if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
+                               break;
+                       set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
+               }
+
                if (adapter->nic_ops->config_led(adapter, 0, 0xf))
                        dev_err(&adapter->pdev->dev,
                                "Failed to reset LED blink state.\n");
@@ -971,14 +988,13 @@ static int qlcnic_set_led(struct net_device *dev,
                return -EINVAL;
        }
 
-       if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) {
+       if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
                qlcnic_diag_free_res(dev, max_sds_rings);
-               clear_bit(__QLCNIC_RESETTING, &adapter->state);
-       }
 
-       clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
+       if (!active || err)
+               clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
 
-       return -EIO;
+       return err;
 }
 
 static void