> @@ -83,12 +84,49 @@ static int > idpf_dev_link_update(struct rte_eth_dev *dev, > __rte_unused int wait_to_complete) > { > + struct idpf_vport *vport = dev->data->dev_private; > struct rte_eth_link new_link; > > memset(&new_link, 0, sizeof(new_link)); > > - new_link.link_speed = RTE_ETH_SPEED_NUM_NONE; > + switch (vport->link_speed) { > + case 10: > + new_link.link_speed = RTE_ETH_SPEED_NUM_10M; > + break; > + case 100: > + new_link.link_speed = RTE_ETH_SPEED_NUM_100M; > + break; > + case 1000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_1G; > + break; > + case 10000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_10G; > + break; > + case 20000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_20G; > + break; > + case 25000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_25G; > + break; > + case 40000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_40G; > + break; > + case 50000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_50G; > + break; > + case 100000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_100G; > + break; > + case 200000: > + new_link.link_speed = RTE_ETH_SPEED_NUM_200G; > + break; > + default: > + new_link.link_speed = RTE_ETH_SPEED_NUM_NONE; > + } > + > new_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; > + new_link.link_status = vport->link_up ? RTE_ETH_LINK_UP : > + RTE_ETH_LINK_DOWN; > new_link.link_autoneg = !(dev->data->dev_conf.link_speeds & > RTE_ETH_LINK_SPEED_FIXED); Better to use RTE_ETH_LINK_[AUTONEG/FIXED] instead.
> > @@ -927,6 +965,127 @@ idpf_parse_devargs(struct rte_pci_device *pci_dev, > struct > idpf_adapter_ext *adap > return ret; > } > > +static struct idpf_vport * > +idpf_find_vport(struct idpf_adapter_ext *adapter, uint32_t vport_id) > +{ > + struct idpf_vport *vport = NULL; > + int i; > + > + for (i = 0; i < adapter->cur_vport_nb; i++) { > + vport = adapter->vports[i]; > + if (vport->vport_id != vport_id) > + continue; > + else > + return vport; > + } > + > + return vport; > +} > + > +static void > +idpf_handle_event_msg(struct idpf_vport *vport, uint8_t *msg, uint16_t > msglen) > +{ > + struct virtchnl2_event *vc_event = (struct virtchnl2_event *)msg; > + struct rte_eth_dev *dev = (struct rte_eth_dev *)vport->dev; > + > + if (msglen < sizeof(struct virtchnl2_event)) { > + PMD_DRV_LOG(ERR, "Error event"); > + return; > + } > + > + switch (vc_event->event) { > + case VIRTCHNL2_EVENT_LINK_CHANGE: > + PMD_DRV_LOG(DEBUG, "VIRTCHNL2_EVENT_LINK_CHANGE"); > + vport->link_up = vc_event->link_status; Any conversion between bool and uint8?