dpdk: only look at PCI information on PCI devices
[vpp.git] / src / plugins / dpdk / device / format.c
index 1b0fbb9..28e8f0a 100644 (file)
@@ -22,6 +22,7 @@
 #include <dlfcn.h>
 
 #include <vnet/ethernet/ethernet.h>
+#include <vnet/ethernet/sfp.h>
 #include <dpdk/device/dpdk.h>
 
 #include <dpdk/device/dpdk_priv.h>
   _ (INNER_L3, IPV6_EXT_UNKNOWN, "Inner IPv6 packet with or without extension headers") \
   _ (INNER_L4, TCP, "Inner TCP packet")                                 \
   _ (INNER_L4, UDP, "Inner UDP packet")                                 \
-  _ (INNER_L4, FRAG, "Inner fagmented IP packet")                       \
+  _ (INNER_L4, FRAG, "Inner fragmented IP packet")                       \
   _ (INNER_L4, SCTP, "Inner SCTP (Stream Control Transmission Protocol) packet") \
   _ (INNER_L4, ICMP, "Inner ICMP packet")                               \
   _ (INNER_L4, NONFRAG, "Inner non-fragmented IP packet")
@@ -272,9 +273,9 @@ format_dpdk_device_name (u8 * s, va_list * args)
     }
 
   rte_eth_dev_info_get (i, &dev_info);
-  pci_dev = RTE_DEV_TO_PCI (dev_info.device);
+  pci_dev = dpdk_get_pci_device (&dev_info);
 
-  if (pci_dev && dm->devices[i].port_type != VNET_DPDK_PORT_TYPE_FAILSAFE)
+  if (pci_dev)
     ret = format (s, devname_format, device_name, pci_dev->addr.bus,
                  pci_dev->addr.devid, pci_dev->addr.function);
   else
@@ -496,6 +497,31 @@ format_dpdk_device_errors (u8 * s, va_list * args)
   return s;
 }
 
+static u8 *
+format_dpdk_device_module_info (u8 * s, va_list * args)
+{
+  dpdk_device_t *xd = va_arg (*args, dpdk_device_t *);
+  struct rte_eth_dev_module_info mi = { 0 };
+  struct rte_dev_eeprom_info ei = { 0 };
+
+  if (rte_eth_dev_get_module_info (xd->port_id, &mi) != 0)
+    return format (s, "unknown");
+
+  ei.length = mi.eeprom_len;
+  ei.data = clib_mem_alloc (mi.eeprom_len);
+
+  if (rte_eth_dev_get_module_eeprom (xd->port_id, &ei) == 0)
+    {
+      s = format (s, "%U", format_sfp_eeprom, ei.data +
+                 (mi.type == RTE_ETH_MODULE_SFF_8436 ? 0x80 : 0));
+    }
+  else
+    s = format (s, "eeprom read error");
+
+  clib_mem_free (ei.data);
+  return s;
+}
+
 static const char *
 ptr2sname (void *p)
 {
@@ -549,7 +575,8 @@ format_dpdk_device (u8 * s, va_list * args)
       retval = rte_eth_dev_rss_hash_conf_get (xd->port_id, &rss_conf);
       if (retval < 0)
        clib_warning ("rte_eth_dev_rss_hash_conf_get returned %d", retval);
-      pci = RTE_DEV_TO_PCI (di.device);
+
+      pci = dpdk_get_pci_device (&di);
 
       if (pci)
        {
@@ -567,6 +594,9 @@ format_dpdk_device (u8 * s, va_list * args)
          vec_free (s2);
        }
 
+      s = format (s, "%Umodule: %U\n", format_white_space, indent + 2,
+                 format_dpdk_device_module_info, xd);
+
       s = format (s, "%Umax rx packet len: %d\n", format_white_space,
                  indent + 2, di.max_rx_pktlen);
       s = format (s, "%Upromiscuous: unicast %s all-multicast %s\n",