]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/benet/be_ethtool.c
net/various: remove trailing space in messages
[net-next-2.6.git] / drivers / net / benet / be_ethtool.c
index 5d001c4deac1d3b8684c91261cb0c15769c96cfa..d7390da470cdf7a276a523b5f624abedd23e625b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 - 2009 ServerEngines
+ * Copyright (C) 2005 - 2010 ServerEngines
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -112,6 +112,7 @@ static const char et_self_tests[][ETH_GSTRING_LEN] = {
        "PHY Loopback test",
        "External Loopback test",
        "DDR DMA test"
+       "Link test"
 };
 
 #define ETHTOOL_TESTS_NUM ARRAY_SIZE(et_self_tests)
@@ -495,7 +496,7 @@ be_test_ddr_dma(struct be_adapter *adapter)
        ddrdma_cmd.va = pci_alloc_consistent(adapter->pdev, ddrdma_cmd.size,
                                        &ddrdma_cmd.dma);
        if (!ddrdma_cmd.va) {
-               dev_err(&adapter->pdev->dev, "Memory allocation failure \n");
+               dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
                return -ENOMEM;
        }
 
@@ -529,6 +530,9 @@ static void
 be_self_test(struct net_device *netdev, struct ethtool_test *test, u64 *data)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
+       bool link_up;
+       u8 mac_speed = 0;
+       u16 qos_link_speed = 0;
 
        memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM);
 
@@ -545,12 +549,20 @@ be_self_test(struct net_device *netdev, struct ethtool_test *test, u64 *data)
                                                &data[2]) != 0) {
                        test->flags |= ETH_TEST_FL_FAILED;
                }
+       }
 
-               data[3] = be_test_ddr_dma(adapter);
-               if (data[3] != 0)
-                       test->flags |= ETH_TEST_FL_FAILED;
+       if (be_test_ddr_dma(adapter) != 0) {
+               data[3] = 1;
+               test->flags |= ETH_TEST_FL_FAILED;
        }
 
+       if (be_cmd_link_status_query(adapter, &link_up, &mac_speed,
+                               &qos_link_speed) != 0) {
+               test->flags |= ETH_TEST_FL_FAILED;
+               data[4] = -1;
+       } else if (mac_speed) {
+               data[4] = 1;
+       }
 }
 
 static int
@@ -567,12 +579,57 @@ be_do_flash(struct net_device *netdev, struct ethtool_flash *efl)
        return be_load_fw(adapter, file_name);
 }
 
+static int
+be_get_eeprom_len(struct net_device *netdev)
+{
+       return BE_READ_SEEPROM_LEN;
+}
+
+static int
+be_read_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
+                       uint8_t *data)
+{
+       struct be_adapter *adapter = netdev_priv(netdev);
+       struct be_dma_mem eeprom_cmd;
+       struct be_cmd_resp_seeprom_read *resp;
+       int status;
+
+       if (!eeprom->len)
+               return -EINVAL;
+
+       eeprom->magic = BE_VENDOR_ID | (adapter->pdev->device<<16);
+
+       memset(&eeprom_cmd, 0, sizeof(struct be_dma_mem));
+       eeprom_cmd.size = sizeof(struct be_cmd_req_seeprom_read);
+       eeprom_cmd.va = pci_alloc_consistent(adapter->pdev, eeprom_cmd.size,
+                               &eeprom_cmd.dma);
+
+       if (!eeprom_cmd.va) {
+               dev_err(&adapter->pdev->dev,
+                       "Memory allocation failure. Could not read eeprom\n");
+               return -ENOMEM;
+       }
+
+       status = be_cmd_get_seeprom_data(adapter, &eeprom_cmd);
+
+       if (!status) {
+               resp = (struct be_cmd_resp_seeprom_read *) eeprom_cmd.va;
+               memcpy(data, resp->seeprom_data + eeprom->offset, eeprom->len);
+       }
+       pci_free_consistent(adapter->pdev, eeprom_cmd.size, eeprom_cmd.va,
+                       eeprom_cmd.dma);
+
+       return status;
+}
+
 const struct ethtool_ops be_ethtool_ops = {
        .get_settings = be_get_settings,
        .get_drvinfo = be_get_drvinfo,
        .get_wol = be_get_wol,
        .set_wol = be_set_wol,
        .get_link = ethtool_op_get_link,
+       .get_eeprom_len = be_get_eeprom_len,
+       .get_eeprom = be_read_eeprom,
        .get_coalesce = be_get_coalesce,
        .set_coalesce = be_set_coalesce,
        .get_ringparam = be_get_ringparam,