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:
parent
112ef72539
commit
88d3cb3c03
@ -5,6 +5,7 @@
|
||||
;
|
||||
[Features]
|
||||
Speed capabilities = Y
|
||||
Link status = Y
|
||||
MTU update = Y
|
||||
Jumbo frame = Y
|
||||
CRC offload = Y
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user