net/i40e: fix request queue in VF
[dpdk.git] / drivers / net / i40e / i40e_ethdev_vf.c
index 0b05ddb..5fd34f8 100644 (file)
@@ -140,6 +140,8 @@ static int
 i40evf_set_mc_addr_list(struct rte_eth_dev *dev,
                        struct rte_ether_addr *mc_addr_set,
                        uint32_t nb_mc_addr);
+static void
+i40evf_dev_alarm_handler(void *param);
 
 /* Default hash key buffer for RSS */
 static uint32_t rss_key_default[I40E_VFQF_HKEY_MAX_INDEX + 1];
@@ -573,7 +575,7 @@ i40evf_fill_virtchnl_vsi_txq_info(struct virtchnl_txq_info *txq_info,
 {
        txq_info->vsi_id = vsi_id;
        txq_info->queue_id = queue_id;
-       if (queue_id < nb_txq) {
+       if (queue_id < nb_txq && txq) {
                txq_info->ring_len = txq->nb_tx_desc;
                txq_info->dma_ring_addr = txq->tx_ring_phys_addr;
        }
@@ -590,7 +592,7 @@ i40evf_fill_virtchnl_vsi_rxq_info(struct virtchnl_rxq_info *rxq_info,
        rxq_info->vsi_id = vsi_id;
        rxq_info->queue_id = queue_id;
        rxq_info->max_pkt_size = max_pkt_size;
-       if (queue_id < nb_rxq) {
+       if (queue_id < nb_rxq && rxq) {
                rxq_info->ring_len = rxq->nb_rx_desc;
                rxq_info->dma_ring_addr = rxq->rx_ring_phys_addr;
                rxq_info->databuffer_size =
@@ -623,10 +625,11 @@ i40evf_configure_vsi_queues(struct rte_eth_dev *dev)
 
        for (i = 0, vc_qpi = vc_vqci->qpair; i < nb_qp; i++, vc_qpi++) {
                i40evf_fill_virtchnl_vsi_txq_info(&vc_qpi->txq,
-                       vc_vqci->vsi_id, i, dev->data->nb_tx_queues, txq[i]);
+                       vc_vqci->vsi_id, i, dev->data->nb_tx_queues,
+                       txq ? txq[i] : NULL);
                i40evf_fill_virtchnl_vsi_rxq_info(&vc_qpi->rxq,
                        vc_vqci->vsi_id, i, dev->data->nb_rx_queues,
-                                       vf->max_pkt_len, rxq[i]);
+                       vf->max_pkt_len, rxq ? rxq[i] : NULL);
        }
        memset(&args, 0, sizeof(args));
        args.ops = VIRTCHNL_OP_CONFIG_VSI_QUEUES;
@@ -788,7 +791,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,
        int err;
        struct vf_cmd_info args;
 
-       if (is_zero_ether_addr(addr)) {
+       if (rte_is_zero_ether_addr(addr)) {
                PMD_DRV_LOG(ERR, "Invalid mac:%x:%x:%x:%x:%x:%x",
                            addr->addr_bytes[0], addr->addr_bytes[1],
                            addr->addr_bytes[2], addr->addr_bytes[3],
@@ -1050,10 +1053,14 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num)
        args.in_args_size = sizeof(vfres);
        args.out_buffer = vf->aq_resp;
        args.out_size = I40E_AQ_BUF_SZ;
+
+       rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);
        err = i40evf_execute_vf_cmd(dev, &args);
        if (err)
                PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES");
 
+       rte_eal_alarm_set(I40EVF_ALARM_INTERVAL,
+                         i40evf_dev_alarm_handler, dev);
        return err;
 }
 
@@ -1274,10 +1281,11 @@ 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 rte_ether_addr *)hw->mac.addr))
+       if (rte_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 */
+               rte_eth_random_addr(hw->mac.addr); /* Generate a random one */
 
        I40E_WRITE_REG(hw, I40E_VFINT_DYN_CTL01,
                       (I40E_ITR_INDEX_DEFAULT <<
@@ -1504,15 +1512,15 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 
        /* copy mac addr */
        eth_dev->data->mac_addrs = rte_zmalloc("i40evf_mac",
-                                       ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX,
-                                       0);
+                               RTE_ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX,
+                               0);
        if (eth_dev->data->mac_addrs == NULL) {
                PMD_INIT_LOG(ERR, "Failed to allocate %d bytes needed to"
                                " store MAC addresses",
-                               ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX);
+                               RTE_ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX);
                return -ENOMEM;
        }
-       ether_addr_copy((struct rte_ether_addr *)hw->mac.addr,
+       rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.addr,
                        &eth_dev->data->mac_addrs[0]);
 
        return 0;
@@ -1555,7 +1563,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)
  */
 static struct rte_pci_driver rte_i40evf_pmd = {
        .id_table = pci_id_i40evf_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
        .probe = eth_i40evf_pci_probe,
        .remove = eth_i40evf_pci_remove,
 };
@@ -1766,21 +1774,22 @@ i40evf_rxq_init(struct rte_eth_dev *dev, struct i40e_rx_queue *rxq)
         * Check if the jumbo frame and maximum packet length are set correctly
         */
        if (dev_data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
-               if (rxq->max_pkt_len <= ETHER_MAX_LEN ||
+               if (rxq->max_pkt_len <= RTE_ETHER_MAX_LEN ||
                    rxq->max_pkt_len > I40E_FRAME_SIZE_MAX) {
                        PMD_DRV_LOG(ERR, "maximum packet length must be "
                                "larger than %u and smaller than %u, as jumbo "
-                               "frame is enabled", (uint32_t)ETHER_MAX_LEN,
+                               "frame is enabled", (uint32_t)RTE_ETHER_MAX_LEN,
                                        (uint32_t)I40E_FRAME_SIZE_MAX);
                        return I40E_ERR_CONFIG;
                }
        } else {
-               if (rxq->max_pkt_len < ETHER_MIN_LEN ||
-                   rxq->max_pkt_len > ETHER_MAX_LEN) {
+               if (rxq->max_pkt_len < RTE_ETHER_MIN_LEN ||
+                   rxq->max_pkt_len > RTE_ETHER_MAX_LEN) {
                        PMD_DRV_LOG(ERR, "maximum packet length must be "
                                "larger than %u and smaller than %u, as jumbo "
-                               "frame is disabled", (uint32_t)ETHER_MIN_LEN,
-                                               (uint32_t)ETHER_MAX_LEN);
+                               "frame is disabled",
+                               (uint32_t)RTE_ETHER_MIN_LEN,
+                               (uint32_t)RTE_ETHER_MAX_LEN);
                        return I40E_ERR_CONFIG;
                }
        }
@@ -1937,7 +1946,7 @@ i40evf_add_del_all_mac_addr(struct rte_eth_dev *dev, bool add)
                j = 0;
                len = sizeof(struct virtchnl_ether_addr_list);
                for (i = begin; i < I40E_NUM_MACADDR_MAX; i++, next_begin++) {
-                       if (is_zero_ether_addr(&dev->data->mac_addrs[i]))
+                       if (rte_is_zero_ether_addr(&dev->data->mac_addrs[i]))
                                continue;
                        len += sizeof(struct virtchnl_ether_addr);
                        if (len >= I40E_AQ_BUF_SZ) {
@@ -1954,7 +1963,7 @@ i40evf_add_del_all_mac_addr(struct rte_eth_dev *dev, bool add)
 
                for (i = begin; i < next_begin; i++) {
                        addr = &dev->data->mac_addrs[i];
-                       if (is_zero_ether_addr(addr))
+                       if (rte_is_zero_ether_addr(addr))
                                continue;
                        rte_memcpy(list->list[j].addr, addr->addr_bytes,
                                         sizeof(addr->addr_bytes));
@@ -2217,7 +2226,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        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->min_mtu = RTE_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;
@@ -2679,7 +2688,7 @@ i40evf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        int ret = 0;
 
        /* check if mtu is within the allowed range */
-       if ((mtu < ETHER_MIN_MTU) || (frame_size > I40E_FRAME_SIZE_MAX))
+       if (mtu < RTE_ETHER_MIN_MTU || frame_size > I40E_FRAME_SIZE_MAX)
                return -EINVAL;
 
        /* mtu setting is forbidden if port is start */
@@ -2689,7 +2698,7 @@ i40evf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
                return -EBUSY;
        }
 
-       if (frame_size > ETHER_MAX_LEN)
+       if (frame_size > RTE_ETHER_MAX_LEN)
                dev_data->dev_conf.rxmode.offloads |=
                        DEV_RX_OFFLOAD_JUMBO_FRAME;
        else
@@ -2707,7 +2716,7 @@ i40evf_set_default_mac_addr(struct rte_eth_dev *dev,
        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);
 
-       if (!is_valid_assigned_ether_addr(mac_addr)) {
+       if (!rte_is_valid_assigned_ether_addr(mac_addr)) {
                PMD_DRV_LOG(ERR, "Tried to set invalid MAC address.");
                return -EINVAL;
        }
@@ -2720,7 +2729,7 @@ i40evf_set_default_mac_addr(struct rte_eth_dev *dev,
        if (i40evf_add_mac_addr(dev, mac_addr, 0, 0) != 0)
                return -EIO;
 
-       ether_addr_copy(mac_addr, (struct rte_ether_addr *)hw->mac.addr);
+       rte_ether_addr_copy(mac_addr, (struct rte_ether_addr *)hw->mac.addr);
        return 0;
 }
 
@@ -2806,3 +2815,9 @@ i40evf_set_mc_addr_list(struct rte_eth_dev *dev,
 
        return 0;
 }
+
+bool
+is_i40evf_supported(struct rte_eth_dev *dev)
+{
+       return is_device_supported(dev, &rte_i40evf_pmd);
+}