| 258 | } |
| 259 | |
| 260 | int |
| 261 | ionic_dev_link_update(struct rte_eth_dev *eth_dev, |
| 262 | int wait_to_complete __rte_unused) |
| 263 | { |
| 264 | struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); |
| 265 | struct ionic_adapter *adapter = lif->adapter; |
| 266 | struct rte_eth_link link; |
| 267 | |
| 268 | IONIC_PRINT_CALL(); |
| 269 | |
| 270 | /* Initialize */ |
| 271 | memset(&link, 0, sizeof(link)); |
| 272 | |
| 273 | if (adapter->idev.port_info->config.an_enable) { |
| 274 | link.link_autoneg = RTE_ETH_LINK_AUTONEG; |
| 275 | } |
| 276 | |
| 277 | if (!adapter->link_up || |
| 278 | !(lif->state & IONIC_LIF_F_UP)) { |
| 279 | /* Interface is down */ |
| 280 | link.link_status = RTE_ETH_LINK_DOWN; |
| 281 | link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; |
| 282 | link.link_speed = RTE_ETH_SPEED_NUM_NONE; |
| 283 | } else { |
| 284 | /* Interface is up */ |
| 285 | link.link_status = RTE_ETH_LINK_UP; |
| 286 | link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; |
| 287 | switch (adapter->link_speed) { |
| 288 | case 10000: |
| 289 | link.link_speed = RTE_ETH_SPEED_NUM_10G; |
| 290 | break; |
| 291 | case 25000: |
| 292 | link.link_speed = RTE_ETH_SPEED_NUM_25G; |
| 293 | break; |
| 294 | case 40000: |
| 295 | link.link_speed = RTE_ETH_SPEED_NUM_40G; |
| 296 | break; |
| 297 | case 50000: |
| 298 | link.link_speed = RTE_ETH_SPEED_NUM_50G; |
| 299 | break; |
| 300 | case 100000: |
| 301 | link.link_speed = RTE_ETH_SPEED_NUM_100G; |
| 302 | break; |
| 303 | default: |
| 304 | link.link_speed = RTE_ETH_SPEED_NUM_NONE; |
| 305 | break; |
| 306 | } |
| 307 | } |
| 308 | |
| 309 | return rte_eth_linkstatus_set(eth_dev, &link); |
| 310 | } |
| 311 | |
| 312 | /** |
| 313 | * Interrupt handler triggered by NIC for handling |
no test coverage detected