New upstream version 18.11.1
[deb_dpdk.git] / drivers / net / i40e / i40e_ethdev_vf.c
index 001c301..100e71c 100644 (file)
@@ -1080,9 +1080,11 @@ i40evf_enable_irq0(struct i40e_hw *hw)
 }
 
 static int
-i40evf_check_vf_reset_done(struct i40e_hw *hw)
+i40evf_check_vf_reset_done(struct rte_eth_dev *dev)
 {
        int i, reset;
+       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 
        for (i = 0; i < MAX_RESET_WAIT_CNT; i++) {
                reset = I40E_READ_REG(hw, I40E_VFGEN_RSTAT) &
@@ -1097,12 +1099,16 @@ i40evf_check_vf_reset_done(struct i40e_hw *hw)
        if (i >= MAX_RESET_WAIT_CNT)
                return -1;
 
+       vf->vf_reset = false;
+       vf->pend_msg &= ~PFMSG_RESET_IMPENDING;
+
        return 0;
 }
 static int
-i40evf_reset_vf(struct i40e_hw *hw)
+i40evf_reset_vf(struct rte_eth_dev *dev)
 {
        int ret;
+       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        if (i40e_vf_reset(hw) != I40E_SUCCESS) {
                PMD_INIT_LOG(ERR, "Reset VF NIC failed");
@@ -1119,7 +1125,7 @@ i40evf_reset_vf(struct i40e_hw *hw)
          */
        rte_delay_ms(200);
 
-       ret = i40evf_check_vf_reset_done(hw);
+       ret = i40evf_check_vf_reset_done(dev);
        if (ret) {
                PMD_INIT_LOG(ERR, "VF is still resetting");
                return ret;
@@ -1145,7 +1151,7 @@ i40evf_init_vf(struct rte_eth_dev *dev)
                goto err;
        }
 
-       err = i40evf_check_vf_reset_done(hw);
+       err = i40evf_check_vf_reset_done(dev);
        if (err)
                goto err;
 
@@ -1157,7 +1163,7 @@ i40evf_init_vf(struct rte_eth_dev *dev)
        }
 
        /* Reset VF and wait until it's complete */
-       if (i40evf_reset_vf(hw)) {
+       if (i40evf_reset_vf(dev)) {
                PMD_INIT_LOG(ERR, "reset NIC failed");
                goto err_aq;
        }
@@ -1256,7 +1262,7 @@ i40evf_uninit_vf(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
 
-       if (hw->adapter_stopped == 0)
+       if (hw->adapter_closed == 0)
                i40evf_dev_close(dev);
        rte_free(vf->vf_res);
        vf->vf_res = NULL;
@@ -1384,10 +1390,8 @@ i40evf_dev_alarm_handler(void *param)
        icr0 = I40E_READ_REG(hw, I40E_VFINT_ICR01);
 
        /* No interrupt event indicated */
-       if (!(icr0 & I40E_VFINT_ICR01_INTEVENT_MASK)) {
-               PMD_DRV_LOG(DEBUG, "No interrupt event, nothing to do");
+       if (!(icr0 & I40E_VFINT_ICR01_INTEVENT_MASK))
                goto done;
-       }
 
        if (icr0 & I40E_VFINT_ICR01_ADMINQ_MASK) {
                PMD_DRV_LOG(DEBUG, "ICR01_ADMINQ is reported");
@@ -1440,6 +1444,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
        hw->bus.func = pci_dev->addr.function;
        hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
        hw->adapter_stopped = 0;
+       hw->adapter_closed = 0;
 
        if(i40evf_init_vf(eth_dev) != 0) {
                PMD_INIT_LOG(ERR, "Init vf failed");
@@ -1485,9 +1490,6 @@ i40evf_dev_uninit(struct rte_eth_dev *eth_dev)
                return -1;
        }
 
-       rte_free(eth_dev->data->mac_addrs);
-       eth_dev->data->mac_addrs = NULL;
-
        return 0;
 }
 
@@ -1522,8 +1524,6 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
 {
        struct i40e_adapter *ad =
                I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
-       struct rte_eth_conf *conf = &dev->data->dev_conf;
-       struct i40e_vf *vf;
 
        /* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
         * allocation or vector Rx preconditions we will reset it.
@@ -1533,19 +1533,6 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
        ad->tx_simple_allowed = true;
        ad->tx_vec_allowed = true;
 
-       /* For non-DPDK PF drivers, VF has no ability to disable HW
-        * CRC strip, and is implicitly enabled by the PF.
-        */
-       if (rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
-               vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
-               if ((vf->version_major == VIRTCHNL_VERSION_MAJOR) &&
-                   (vf->version_minor <= VIRTCHNL_VERSION_MINOR)) {
-                       /* Peer is running non-DPDK PF driver. */
-                       PMD_INIT_LOG(ERR, "VF can't disable HW CRC Strip");
-                       return -EINVAL;
-               }
-       }
-
        return i40evf_init_vlan(dev);
 }
 
@@ -2180,8 +2167,6 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                DEV_RX_OFFLOAD_UDP_CKSUM |
                DEV_RX_OFFLOAD_TCP_CKSUM |
                DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-               DEV_RX_OFFLOAD_CRC_STRIP |
-               DEV_RX_OFFLOAD_KEEP_CRC |
                DEV_RX_OFFLOAD_SCATTER |
                DEV_RX_OFFLOAD_JUMBO_FRAME |
                DEV_RX_OFFLOAD_VLAN_FILTER;
@@ -2268,7 +2253,6 @@ i40evf_dev_close(struct rte_eth_dev *dev)
 {
        struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-       rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
        i40evf_dev_stop(dev);
        i40e_dev_free_queues(dev);
        /*
@@ -2279,9 +2263,11 @@ i40evf_dev_close(struct rte_eth_dev *dev)
        i40evf_dev_promiscuous_disable(dev);
        i40evf_dev_allmulticast_disable(dev);
 
-       i40evf_reset_vf(hw);
+       i40evf_reset_vf(dev);
        i40e_shutdown_adminq(hw);
        i40evf_disable_irq0(hw);
+       rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
+       hw->adapter_closed = 1;
 }
 
 /*