examples: check status of getting ethdev info
[dpdk.git] / examples / ethtool / lib / rte_ethtool.c
index 90dfbb7..43cacc0 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
+#include <rte_string_fns.h>
 #include <rte_version.h>
 #include <rte_ethdev.h>
 #include <rte_ether.h>
@@ -22,6 +23,8 @@ rte_ethtool_get_drvinfo(uint16_t port_id, struct ethtool_drvinfo *drvinfo)
 {
        struct rte_eth_dev_info dev_info;
        struct rte_dev_reg_info reg_info;
+       const struct rte_pci_device *pci_dev;
+       const struct rte_bus *bus = NULL;
        int n;
        int ret;
 
@@ -38,23 +41,29 @@ rte_ethtool_get_drvinfo(uint16_t port_id, struct ethtool_drvinfo *drvinfo)
                printf("Insufficient fw version buffer size, "
                       "the minimum size should be %d\n", ret);
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = rte_eth_dev_info_get(port_id, &dev_info);
+       if (ret != 0) {
+               printf("Error during getting device (port %u) info: %s\n",
+                      port_id, strerror(-ret));
 
-       snprintf(drvinfo->driver, sizeof(drvinfo->driver), "%s",
-               dev_info.driver_name);
-       snprintf(drvinfo->version, sizeof(drvinfo->version), "%s",
-               rte_version());
+               return ret;
+       }
+
+       strlcpy(drvinfo->driver, dev_info.driver_name,
+               sizeof(drvinfo->driver));
+       strlcpy(drvinfo->version, rte_version(), sizeof(drvinfo->version));
        /* TODO: replace bus_info by rte_devargs.name */
-       if (dev_info.pci_dev)
+       if (dev_info.device)
+               bus = rte_bus_find_by_device(dev_info.device);
+       if (bus && !strcmp(bus->name, "pci")) {
+               pci_dev = RTE_DEV_TO_PCI(dev_info.device);
                snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info),
                        "%04x:%02x:%02x.%x",
-                       dev_info.pci_dev->addr.domain,
-                       dev_info.pci_dev->addr.bus,
-                       dev_info.pci_dev->addr.devid,
-                       dev_info.pci_dev->addr.function);
-       else
+                       pci_dev->addr.domain, pci_dev->addr.bus,
+                       pci_dev->addr.devid, pci_dev->addr.function);
+       } else {
                snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info), "N/A");
+       }
 
        memset(&reg_info, 0, sizeof(reg_info));
        rte_eth_dev_get_reg_info(port_id, &reg_info);
@@ -173,6 +182,36 @@ rte_ethtool_set_eeprom(uint16_t port_id, struct ethtool_eeprom *eeprom,
        return 0;
 }
 
+int
+rte_ethtool_get_module_info(uint16_t port_id, uint32_t *modinfo)
+{
+       struct rte_eth_dev_module_info *info;
+
+       info = (struct rte_eth_dev_module_info *)modinfo;
+       return rte_eth_dev_get_module_info(port_id, info);
+}
+
+int
+rte_ethtool_get_module_eeprom(uint16_t port_id, struct ethtool_eeprom *eeprom,
+       void *words)
+{
+       struct rte_dev_eeprom_info eeprom_info;
+       int status;
+
+       if (eeprom == NULL || words == NULL)
+               return -EINVAL;
+
+       eeprom_info.offset = eeprom->offset;
+       eeprom_info.length = eeprom->len;
+       eeprom_info.data = words;
+
+       status = rte_eth_dev_get_module_eeprom(port_id, &eeprom_info);
+       if (status)
+               return status;
+
+       return 0;
+}
+
 int
 rte_ethtool_get_pauseparam(uint16_t port_id,
        struct ethtool_pauseparam *pause_param)
@@ -269,7 +308,7 @@ rte_ethtool_net_stop(uint16_t port_id)
 }
 
 int
-rte_ethtool_net_get_mac_addr(uint16_t port_id, struct ether_addr *addr)
+rte_ethtool_net_get_mac_addr(uint16_t port_id, struct rte_ether_addr *addr)
 {
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        if (addr == NULL)
@@ -280,7 +319,7 @@ rte_ethtool_net_get_mac_addr(uint16_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_ethtool_net_set_mac_addr(uint16_t port_id, struct ether_addr *addr)
+rte_ethtool_net_set_mac_addr(uint16_t port_id, struct rte_ether_addr *addr)
 {
        if (addr == NULL)
                return -EINVAL;
@@ -289,11 +328,11 @@ rte_ethtool_net_set_mac_addr(uint16_t port_id, struct ether_addr *addr)
 
 int
 rte_ethtool_net_validate_addr(uint16_t port_id __rte_unused,
-       struct ether_addr *addr)
+       struct rte_ether_addr *addr)
 {
        if (addr == NULL)
                return -EINVAL;
-       return is_valid_assigned_ether_addr(addr);
+       return rte_is_valid_assigned_ether_addr(addr);
 }
 
 int
@@ -337,9 +376,12 @@ rte_ethtool_net_set_rx_mode(uint16_t port_id)
        uint16_t num_vfs;
        struct rte_eth_dev_info dev_info;
        uint16_t vf;
+       int ret;
+
+       ret = rte_eth_dev_info_get(port_id, &dev_info);
+       if (ret != 0)
+               return ret;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(port_id, &dev_info);
        num_vfs = dev_info.max_vfs;
 
        /* Set VF vf_rx_mode, VF unsupport status is discard */
@@ -365,11 +407,14 @@ rte_ethtool_get_ringparam(uint16_t port_id,
        struct rte_eth_rxq_info rx_qinfo;
        struct rte_eth_txq_info tx_qinfo;
        int stat;
+       int ret;
 
        if (ring_param == NULL)
                return -EINVAL;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = rte_eth_dev_info_get(port_id, &dev_info);
+       if (ret != 0)
+               return ret;
 
        stat = rte_eth_rx_queue_info_get(port_id, 0, &rx_qinfo);
        if (stat != 0)