ethdev: change device info get callback to return int
[dpdk.git] / drivers / net / mlx5 / mlx5_ethdev.c
index cf50e6e..ad53721 100644 (file)
@@ -542,7 +542,7 @@ mlx5_set_txlimit_params(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
  * @param[out] info
  *   Info structure output buffer.
  */
-void
+int
 mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
@@ -565,7 +565,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
        info->max_tx_queues = max;
        info->max_mac_addrs = MLX5_MAX_UC_MAC_ADDRESSES;
        info->rx_queue_offload_capa = mlx5_get_rx_queue_offloads(dev);
-       info->rx_offload_capa = (mlx5_get_rx_port_offloads(dev) |
+       info->rx_offload_capa = (mlx5_get_rx_port_offloads() |
                                 info->rx_queue_offload_capa);
        info->tx_offload_capa = mlx5_get_tx_port_offloads(dev);
        info->if_index = mlx5_ifindex(dev);
@@ -600,6 +600,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
                        break;
                }
        }
+
+       return 0;
 }
 
 /**
@@ -908,7 +910,8 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev,
                        dev->data->port_id, strerror(rte_errno));
                return ret;
        }
-       dev_link.link_speed = ecmd->speed;
+       dev_link.link_speed = (ecmd->speed == UINT32_MAX) ? ETH_SPEED_NUM_NONE :
+                                                           ecmd->speed;
        sc = ecmd->link_mode_masks[0] |
                ((uint64_t)ecmd->link_mode_masks[1] << 32);
        priv->link_speed_capa = 0;
@@ -1927,3 +1930,89 @@ mlx5_translate_port_name(const char *port_name_in,
        port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_UNKNOWN;
        return;
 }
+
+/**
+ * DPDK callback to retrieve plug-in module EEPROM information (type and size).
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ * @param[out] modinfo
+ *   Storage for plug-in module EEPROM information.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_get_module_info(struct rte_eth_dev *dev,
+                    struct rte_eth_dev_module_info *modinfo)
+{
+       struct ethtool_modinfo info = {
+               .cmd = ETHTOOL_GMODULEINFO,
+       };
+       struct ifreq ifr = (struct ifreq) {
+               .ifr_data = (void *)&info,
+       };
+       int ret = 0;
+
+       if (!dev || !modinfo) {
+               DRV_LOG(WARNING, "missing argument, cannot get module info");
+               rte_errno = EINVAL;
+               return -rte_errno;
+       }
+       ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+       if (ret) {
+               DRV_LOG(WARNING, "port %u ioctl(SIOCETHTOOL) failed: %s",
+                       dev->data->port_id, strerror(rte_errno));
+               return ret;
+       }
+       modinfo->type = info.type;
+       modinfo->eeprom_len = info.eeprom_len;
+       return ret;
+}
+
+/**
+ * DPDK callback to retrieve plug-in module EEPROM data.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ * @param[out] info
+ *   Storage for plug-in module EEPROM data.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int mlx5_get_module_eeprom(struct rte_eth_dev *dev,
+                          struct rte_dev_eeprom_info *info)
+{
+       struct ethtool_eeprom *eeprom;
+       struct ifreq ifr;
+       int ret = 0;
+
+       if (!dev || !info) {
+               DRV_LOG(WARNING, "missing argument, cannot get module eeprom");
+               rte_errno = EINVAL;
+               return -rte_errno;
+       }
+       eeprom = rte_calloc(__func__, 1,
+                           (sizeof(struct ethtool_eeprom) + info->length), 0);
+       if (!eeprom) {
+               DRV_LOG(WARNING, "port %u cannot allocate memory for "
+                       "eeprom data", dev->data->port_id);
+               rte_errno = ENOMEM;
+               return -rte_errno;
+       }
+       eeprom->cmd = ETHTOOL_GMODULEEEPROM;
+       eeprom->offset = info->offset;
+       eeprom->len = info->length;
+       ifr = (struct ifreq) {
+               .ifr_data = (void *)eeprom,
+       };
+       ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+       if (ret)
+               DRV_LOG(WARNING, "port %u ioctl(SIOCETHTOOL) failed: %s",
+                       dev->data->port_id, strerror(rte_errno));
+       else
+               rte_memcpy(info->data, eeprom->data, info->length);
+       rte_free(eeprom);
+       return ret;
+}