| 2548 | } |
| 2549 | |
| 2550 | static int |
| 2551 | virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete) |
| 2552 | { |
| 2553 | struct rte_eth_link link; |
| 2554 | uint16_t status; |
| 2555 | struct virtio_hw *hw = dev->data->dev_private; |
| 2556 | |
| 2557 | memset(&link, 0, sizeof(link)); |
| 2558 | link.link_duplex = hw->duplex; |
| 2559 | link.link_speed = hw->speed; |
| 2560 | link.link_autoneg = RTE_ETH_LINK_AUTONEG; |
| 2561 | |
| 2562 | if (!hw->started) { |
| 2563 | link.link_status = RTE_ETH_LINK_DOWN; |
| 2564 | link.link_speed = RTE_ETH_SPEED_NUM_NONE; |
| 2565 | } else if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { |
| 2566 | PMD_INIT_LOG(DEBUG, "Get link status from hw"); |
| 2567 | virtio_read_dev_config(hw, |
| 2568 | offsetof(struct virtio_net_config, status), |
| 2569 | &status, sizeof(status)); |
| 2570 | if ((status & VIRTIO_NET_S_LINK_UP) == 0) { |
| 2571 | link.link_status = RTE_ETH_LINK_DOWN; |
| 2572 | link.link_speed = RTE_ETH_SPEED_NUM_NONE; |
| 2573 | PMD_INIT_LOG(DEBUG, "Port %d is down", |
| 2574 | dev->data->port_id); |
| 2575 | } else { |
| 2576 | link.link_status = RTE_ETH_LINK_UP; |
| 2577 | if (hw->get_speed_via_feat) |
| 2578 | virtio_get_speed_duplex(dev, &link); |
| 2579 | PMD_INIT_LOG(DEBUG, "Port %d is up", |
| 2580 | dev->data->port_id); |
| 2581 | } |
| 2582 | } else { |
| 2583 | link.link_status = RTE_ETH_LINK_UP; |
| 2584 | if (hw->get_speed_via_feat) |
| 2585 | virtio_get_speed_duplex(dev, &link); |
| 2586 | } |
| 2587 | |
| 2588 | return rte_eth_linkstatus_set(dev, &link); |
| 2589 | } |
| 2590 | |
| 2591 | static int |
| 2592 | virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) |
no test coverage detected