net: add rte prefix to ether structures
[dpdk.git] / drivers / net / i40e / i40e_ethdev_vf.c
index ae55b9b..0b05ddb 100644 (file)
@@ -106,7 +106,7 @@ static int i40evf_dev_tx_queue_start(struct rte_eth_dev *dev,
 static int i40evf_dev_tx_queue_stop(struct rte_eth_dev *dev,
                                    uint16_t tx_queue_id);
 static int i40evf_add_mac_addr(struct rte_eth_dev *dev,
-                              struct ether_addr *addr,
+                              struct rte_ether_addr *addr,
                               uint32_t index,
                               uint32_t pool);
 static void i40evf_del_mac_addr(struct rte_eth_dev *dev, uint32_t index);
@@ -123,7 +123,7 @@ static int i40evf_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
                                        struct rte_eth_rss_conf *rss_conf);
 static int i40evf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 static int i40evf_set_default_mac_addr(struct rte_eth_dev *dev,
-                                       struct ether_addr *mac_addr);
+                                       struct rte_ether_addr *mac_addr);
 static int
 i40evf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id);
 static int
@@ -134,10 +134,11 @@ static void i40evf_handle_pf_event(struct rte_eth_dev *dev,
 
 static int
 i40evf_add_del_mc_addr_list(struct rte_eth_dev *dev,
-                       struct ether_addr *mc_addr_set,
+                       struct rte_ether_addr *mc_addr_set,
                        uint32_t nb_mc_addr, bool add);
 static int
-i40evf_set_mc_addr_list(struct rte_eth_dev *dev, struct ether_addr *mc_addr_set,
+i40evf_set_mc_addr_list(struct rte_eth_dev *dev,
+                       struct rte_ether_addr *mc_addr_set,
                        uint32_t nb_mc_addr);
 
 /* Default hash key buffer for RSS */
@@ -359,6 +360,28 @@ i40evf_execute_vf_cmd(struct rte_eth_dev *dev, struct vf_cmd_info *args)
                } while (i++ < MAX_TRY_TIMES);
                _clear_cmd(vf);
                break;
+       case VIRTCHNL_OP_REQUEST_QUEUES:
+               /**
+                * ignore async reply, only wait for system message,
+                * vf_reset = true if get VIRTCHNL_EVENT_RESET_IMPENDING,
+                * if not, means request queues failed.
+                */
+               err = -1;
+               do {
+                       ret = i40evf_read_pfmsg(dev, &info);
+                       vf->cmd_retval = info.result;
+                       if (ret == I40EVF_MSG_SYS && vf->vf_reset) {
+                               err = 0;
+                               break;
+                       } else if (ret == I40EVF_MSG_ERR ||
+                                          ret == I40EVF_MSG_CMD) {
+                               break;
+                       }
+                       rte_delay_ms(ASQ_DELAY_MS);
+                       /* If don't read msg or read sys event, continue */
+               } while (i++ < MAX_TRY_TIMES);
+               _clear_cmd(vf);
+               break;
 
        default:
                /* for other adminq in running time, waiting the cmd done flag */
@@ -754,7 +777,7 @@ i40evf_stop_queues(struct rte_eth_dev *dev)
 
 static int
 i40evf_add_mac_addr(struct rte_eth_dev *dev,
-                   struct ether_addr *addr,
+                   struct rte_ether_addr *addr,
                    __rte_unused uint32_t index,
                    __rte_unused uint32_t pool)
 {
@@ -796,7 +819,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,
 
 static void
 i40evf_del_mac_addr_by_addr(struct rte_eth_dev *dev,
-                           struct ether_addr *addr)
+                           struct rte_ether_addr *addr)
 {
        struct virtchnl_ether_addr_list *list;
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
@@ -837,7 +860,7 @@ static void
 i40evf_del_mac_addr(struct rte_eth_dev *dev, uint32_t index)
 {
        struct rte_eth_dev_data *data = dev->data;
-       struct ether_addr *addr;
+       struct rte_ether_addr *addr;
 
        addr = &data->mac_addrs[index];
 
@@ -1012,6 +1035,28 @@ i40evf_add_vlan(struct rte_eth_dev *dev, uint16_t vlanid)
        return err;
 }
 
+static int
+i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
+{
+       struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+       struct virtchnl_vf_res_request vfres;
+       struct vf_cmd_info args;
+       int err;
+
+       vfres.num_queue_pairs = num;
+
+       args.ops = VIRTCHNL_OP_REQUEST_QUEUES;
+       args.in_args = (u8 *)&vfres;
+       args.in_args_size = sizeof(vfres);
+       args.out_buffer = vf->aq_resp;
+       args.out_size = I40E_AQ_BUF_SZ;
+       err = i40evf_execute_vf_cmd(dev, &args);
+       if (err)
+               PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES");
+
+       return err;
+}
+
 static int
 i40evf_del_vlan(struct rte_eth_dev *dev, uint16_t vlanid)
 {
@@ -1080,9 +1125,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 +1144,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 +1170,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 +1196,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 +1208,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;
        }
@@ -1223,7 +1274,7 @@ i40evf_init_vf(struct rte_eth_dev *dev)
        vf->vsi.adapter = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
 
        /* Store the MAC address configured by host, or generate random one */
-       if (is_valid_assigned_ether_addr((struct ether_addr *)hw->mac.addr))
+       if (is_valid_assigned_ether_addr((struct rte_ether_addr *)hw->mac.addr))
                vf->flags |= I40E_FLAG_VF_MAC_BY_PF;
        else
                eth_random_addr(hw->mac.addr); /* Generate a random one */
@@ -1256,7 +1307,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;
@@ -1438,6 +1489,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");
@@ -1460,7 +1512,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
                                ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX);
                return -ENOMEM;
        }
-       ether_addr_copy((struct ether_addr *)hw->mac.addr,
+       ether_addr_copy((struct rte_ether_addr *)hw->mac.addr,
                        &eth_dev->data->mac_addrs[0]);
 
        return 0;
@@ -1515,8 +1567,11 @@ RTE_PMD_REGISTER_KMOD_DEP(net_i40e_vf, "* igb_uio | vfio-pci");
 static int
 i40evf_dev_configure(struct rte_eth_dev *dev)
 {
+       struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
        struct i40e_adapter *ad =
                I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+       uint16_t num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues,
+                               dev->data->nb_tx_queues);
 
        /* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
         * allocation or vector Rx preconditions we will reset it.
@@ -1526,6 +1581,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
        ad->tx_simple_allowed = true;
        ad->tx_vec_allowed = true;
 
+       if (num_queue_pairs > vf->vsi_res->num_queue_pairs) {
+               int ret = 0;
+
+               PMD_DRV_LOG(INFO, "change queue pairs from %u to %u",
+                           vf->vsi_res->num_queue_pairs, num_queue_pairs);
+               ret = i40evf_request_queues(dev, num_queue_pairs);
+               if (ret != 0)
+                       return ret;
+
+               ret = i40evf_dev_reset(dev);
+               if (ret != 0)
+                       return ret;
+       }
+
        return i40evf_init_vlan(dev);
 }
 
@@ -1717,9 +1786,8 @@ i40evf_rxq_init(struct rte_eth_dev *dev, struct i40e_rx_queue *rxq)
        }
 
        if ((dev_data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_SCATTER) ||
-           (rxq->max_pkt_len + 2 * I40E_VLAN_TAG_SIZE) > buf_size) {
+           rxq->max_pkt_len > buf_size)
                dev_data->scattered_rx = 1;
-       }
 
        return 0;
 }
@@ -1862,7 +1930,7 @@ i40evf_add_del_all_mac_addr(struct rte_eth_dev *dev, bool add)
        int next_begin = 0;
        int begin = 0;
        uint32_t len;
-       struct ether_addr *addr;
+       struct rte_ether_addr *addr;
        struct vf_cmd_info args;
 
        do {
@@ -2144,10 +2212,12 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 
-       dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
-       dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
+       dev_info->max_rx_queues = I40E_MAX_QP_NUM_PER_VF;
+       dev_info->max_tx_queues = I40E_MAX_QP_NUM_PER_VF;
        dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
        dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
+       dev_info->max_mtu = dev_info->max_rx_pktlen - I40E_ETH_OVERHEAD;
+       dev_info->min_mtu = ETHER_MIN_MTU;
        dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t);
        dev_info->reta_size = ETH_RSS_RETA_SIZE_64;
        dev_info->flow_type_rss_offloads = vf->adapter->flow_types_mask;
@@ -2255,11 +2325,12 @@ i40evf_dev_close(struct rte_eth_dev *dev)
         */
        i40evf_dev_promiscuous_disable(dev);
        i40evf_dev_allmulticast_disable(dev);
+       rte_eal_alarm_cancel(i40evf_dev_alarm_handler, 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;
 }
 
 /*
@@ -2631,7 +2702,7 @@ i40evf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 
 static int
 i40evf_set_default_mac_addr(struct rte_eth_dev *dev,
-                           struct ether_addr *mac_addr)
+                           struct rte_ether_addr *mac_addr)
 {
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
        struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -2644,18 +2715,18 @@ i40evf_set_default_mac_addr(struct rte_eth_dev *dev,
        if (vf->flags & I40E_FLAG_VF_MAC_BY_PF)
                return -EPERM;
 
-       i40evf_del_mac_addr_by_addr(dev, (struct ether_addr *)hw->mac.addr);
+       i40evf_del_mac_addr_by_addr(dev, (struct rte_ether_addr *)hw->mac.addr);
 
        if (i40evf_add_mac_addr(dev, mac_addr, 0, 0) != 0)
                return -EIO;
 
-       ether_addr_copy(mac_addr, (struct ether_addr *)hw->mac.addr);
+       ether_addr_copy(mac_addr, (struct rte_ether_addr *)hw->mac.addr);
        return 0;
 }
 
 static int
 i40evf_add_del_mc_addr_list(struct rte_eth_dev *dev,
-                       struct ether_addr *mc_addrs,
+                       struct rte_ether_addr *mc_addrs,
                        uint32_t mc_addrs_num, bool add)
 {
        struct virtchnl_ether_addr_list *list;
@@ -2709,7 +2780,8 @@ i40evf_add_del_mc_addr_list(struct rte_eth_dev *dev,
 }
 
 static int
-i40evf_set_mc_addr_list(struct rte_eth_dev *dev, struct ether_addr *mc_addrs,
+i40evf_set_mc_addr_list(struct rte_eth_dev *dev,
+                       struct rte_ether_addr *mc_addrs,
                        uint32_t mc_addrs_num)
 {
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);