X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fiavf%2Fiavf_ethdev.c;h=8e1d8a8d3e92c7f3330204af7648ff4e54dc7473;hb=675911d0330b0802e845657c3f4edc5886cf8685;hp=ae1ed5874787c33bf49bf178243d2fe2d246a22d;hpb=05e4c3aff35f41d527acfab86df55477fd8dcff2;p=dpdk.git diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index ae1ed58747..8e1d8a8d3e 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -286,7 +286,7 @@ iavf_init_rxq(struct rte_eth_dev *dev, struct iavf_rx_queue *rxq) rxq->max_pkt_len = max_pkt_len; if ((dev_data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_SCATTER) || - (rxq->max_pkt_len + 2 * IAVF_VLAN_TAG_SIZE) > buf_size) { + rxq->max_pkt_len > buf_size) { dev_data->scattered_rx = 1; } IAVF_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1); @@ -690,6 +690,8 @@ iavf_dev_promiscuous_enable(struct rte_eth_dev *dev) ret = iavf_config_promisc(adapter, true, vf->promisc_multicast_enabled); if (!ret) vf->promisc_unicast_enabled = true; + else if (ret == IAVF_NOT_SUPPORTED) + ret = -ENOTSUP; else ret = -EAGAIN; @@ -711,6 +713,8 @@ iavf_dev_promiscuous_disable(struct rte_eth_dev *dev) vf->promisc_multicast_enabled); if (!ret) vf->promisc_unicast_enabled = false; + else if (ret == IAVF_NOT_SUPPORTED) + ret = -ENOTSUP; else ret = -EAGAIN; @@ -731,6 +735,8 @@ iavf_dev_allmulticast_enable(struct rte_eth_dev *dev) ret = iavf_config_promisc(adapter, vf->promisc_unicast_enabled, true); if (!ret) vf->promisc_multicast_enabled = true; + else if (ret == IAVF_NOT_SUPPORTED) + ret = -ENOTSUP; else ret = -EAGAIN; @@ -751,6 +757,8 @@ iavf_dev_allmulticast_disable(struct rte_eth_dev *dev) ret = iavf_config_promisc(adapter, vf->promisc_unicast_enabled, false); if (!ret) vf->promisc_multicast_enabled = false; + else if (ret == IAVF_NOT_SUPPORTED) + ret = -ENOTSUP; else ret = -EAGAIN; @@ -1012,9 +1020,6 @@ iavf_dev_set_default_mac_addr(struct rte_eth_dev *dev, old_addr = (struct rte_ether_addr *)hw->mac.addr; perm_addr = (struct rte_ether_addr *)hw->mac.perm_addr; - if (rte_is_same_ether_addr(mac_addr, old_addr)) - return 0; - /* If the MAC address is configured by host, skip the setting */ if (rte_is_valid_assigned_ether_addr(perm_addr)) return -EPERM; @@ -1405,6 +1410,11 @@ iavf_dev_init(struct rte_eth_dev *eth_dev) adapter->eth_dev = eth_dev; adapter->stopped = 1; + /* Pass the information to the rte_eth_dev_close() that it should also + * release the private port resources. + */ + eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE; + if (iavf_init_vf(eth_dev) != 0) { PMD_INIT_LOG(ERR, "Init vf failed"); return -1; @@ -1459,6 +1469,7 @@ iavf_dev_close(struct rte_eth_dev *dev) struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; struct iavf_adapter *adapter = IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); iavf_dev_stop(dev); iavf_flow_flush(dev, NULL); @@ -1471,20 +1482,21 @@ iavf_dev_close(struct rte_eth_dev *dev) rte_intr_callback_unregister(intr_handle, iavf_dev_interrupt_handler, dev); iavf_disable_irq0(hw); -} - -static int -iavf_dev_uninit(struct rte_eth_dev *dev) -{ - struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return -EPERM; dev->dev_ops = NULL; dev->rx_pkt_burst = NULL; dev->tx_pkt_burst = NULL; - iavf_dev_close(dev); + + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) { + if (vf->rss_lut) { + rte_free(vf->rss_lut); + vf->rss_lut = NULL; + } + if (vf->rss_key) { + rte_free(vf->rss_key); + vf->rss_key = NULL; + } + } rte_free(vf->vf_res); vf->vsi_res = NULL; @@ -1492,15 +1504,15 @@ iavf_dev_uninit(struct rte_eth_dev *dev) rte_free(vf->aq_resp); vf->aq_resp = NULL; +} - if (vf->rss_lut) { - rte_free(vf->rss_lut); - vf->rss_lut = NULL; - } - if (vf->rss_key) { - rte_free(vf->rss_key); - vf->rss_key = NULL; - } +static int +iavf_dev_uninit(struct rte_eth_dev *dev) +{ + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -EPERM; + + iavf_dev_close(dev); return 0; }