net/mvneta: add link update

Add callback for updating information about link status/info.

Signed-off-by: Natalie Samsonov <nsamsono@marvell.com>
Signed-off-by: Zyta Szpak <zr@semihalf.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Zyta Szpak 2018-10-03 09:22:12 +02:00 committed by Ferruh Yigit
parent 112ef72539
commit 88d3cb3c03
3 changed files with 73 additions and 0 deletions

View File

@ -5,6 +5,7 @@
;
[Features]
Speed capabilities = Y
Link status = Y
MTU update = Y
Jumbo frame = Y
CRC offload = Y

View File

@ -31,6 +31,7 @@ Features of the MVNETA PMD are:
- Speed capabilities
- Jumbo frame
- MTU update
- Link status
- CRC offload
- L3 checksum offload
- L4 checksum offload

View File

@ -451,6 +451,76 @@ mvneta_dev_close(struct rte_eth_dev *dev)
}
}
/**
* DPDK callback to retrieve physical link information.
*
* @param dev
* Pointer to Ethernet device structure.
* @param wait_to_complete
* Wait for request completion (ignored).
*
* @return
* 0 on success, negative error value otherwise.
*/
static int
mvneta_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
{
/*
* TODO
* once MUSDK provides necessary API use it here
*/
struct mvneta_priv *priv = dev->data->dev_private;
struct ethtool_cmd edata;
struct ifreq req;
int ret, fd, link_up;
if (!priv->ppio)
return -EPERM;
edata.cmd = ETHTOOL_GSET;
strcpy(req.ifr_name, dev->data->name);
req.ifr_data = (void *)&edata;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1)
return -EFAULT;
ret = ioctl(fd, SIOCETHTOOL, &req);
if (ret == -1) {
close(fd);
return -EFAULT;
}
close(fd);
switch (ethtool_cmd_speed(&edata)) {
case SPEED_10:
dev->data->dev_link.link_speed = ETH_SPEED_NUM_10M;
break;
case SPEED_100:
dev->data->dev_link.link_speed = ETH_SPEED_NUM_100M;
break;
case SPEED_1000:
dev->data->dev_link.link_speed = ETH_SPEED_NUM_1G;
break;
case SPEED_2500:
dev->data->dev_link.link_speed = ETH_SPEED_NUM_2_5G;
break;
default:
dev->data->dev_link.link_speed = ETH_SPEED_NUM_NONE;
}
dev->data->dev_link.link_duplex = edata.duplex ? ETH_LINK_FULL_DUPLEX :
ETH_LINK_HALF_DUPLEX;
dev->data->dev_link.link_autoneg = edata.autoneg ? ETH_LINK_AUTONEG :
ETH_LINK_FIXED;
neta_ppio_get_link_state(priv->ppio, &link_up);
dev->data->dev_link.link_status = link_up ? ETH_LINK_UP : ETH_LINK_DOWN;
return 0;
}
/**
* DPDK callback to set the primary MAC address.
*
@ -484,6 +554,7 @@ static const struct eth_dev_ops mvneta_ops = {
.dev_set_link_up = mvneta_dev_set_link_up,
.dev_set_link_down = mvneta_dev_set_link_down,
.dev_close = mvneta_dev_close,
.link_update = mvneta_link_update,
.mac_addr_set = mvneta_mac_addr_set,
.mtu_set = mvneta_mtu_set,
.dev_infos_get = mvneta_dev_infos_get,