net/virtio-user: fix feature negotiation
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index 0762111..fbad2a6 100644 (file)
@@ -279,14 +279,14 @@ static void qede_interrupt_action(struct ecore_hwfn *p_hwfn)
 }
 
 static void
-qede_interrupt_handler(struct rte_intr_handle *handle, void *param)
+qede_interrupt_handler(void *param)
 {
        struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param;
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        qede_interrupt_action(ECORE_LEADING_HWFN(edev));
-       if (rte_intr_enable(handle))
+       if (rte_intr_enable(eth_dev->intr_handle))
                DP_ERR(edev, "rte_intr_enable failed\n");
 }
 
@@ -798,7 +798,7 @@ static void qede_prandom_bytes(uint32_t *buff)
                buff[i] = rand();
 }
 
-static int qede_config_rss(struct rte_eth_dev *eth_dev)
+int qede_config_rss(struct rte_eth_dev *eth_dev)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -906,20 +906,8 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
        if (rc != 0)
                return rc;
 
-       /* Do RSS configuration after vport-start */
-       switch (rxmode->mq_mode) {
-       case ETH_MQ_RX_RSS:
-               rc = qede_config_rss(eth_dev);
-               if (rc != 0) {
-                       qdev->ops->vport_stop(edev, 0);
-                       qede_dealloc_fp_resc(eth_dev);
-                       return -EINVAL;
-               }
-       break;
-       case ETH_MQ_RX_NONE:
-               DP_INFO(edev, "RSS is disabled\n");
-       break;
-       default:
+       if (!(rxmode->mq_mode == ETH_MQ_RX_RSS ||
+           rxmode->mq_mode == ETH_MQ_RX_NONE)) {
                DP_ERR(edev, "Unsupported RSS mode\n");
                qdev->ops->vport_stop(edev, 0);
                qede_dealloc_fp_resc(eth_dev);
@@ -1497,6 +1485,8 @@ static void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf)
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_TCP)  ? ECORE_RSS_IPV4_TCP : 0;
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_TCP)  ? ECORE_RSS_IPV6_TCP : 0;
        *rss_caps |= (hf & ETH_RSS_IPV6_TCP_EX)       ? ECORE_RSS_IPV6_TCP : 0;
+       *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_UDP)  ? ECORE_RSS_IPV4_UDP : 0;
+       *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? ECORE_RSS_IPV6_UDP : 0;
 }
 
 static int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
@@ -1694,32 +1684,61 @@ static int qede_rss_reta_query(struct rte_eth_dev *eth_dev,
 
 int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
-       uint32_t frame_size;
-       struct qede_dev *qdev = dev->data->dev_private;
+       struct qede_dev *qdev = QEDE_INIT_QDEV(dev);
+       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        struct rte_eth_dev_info dev_info = {0};
+       struct qede_fastpath *fp;
+       uint32_t frame_size;
+       uint16_t rx_buf_size;
+       uint16_t bufsz;
+       int i;
 
+       PMD_INIT_FUNC_TRACE(edev);
        qede_dev_info_get(dev, &dev_info);
-
-       /* VLAN_TAG = 4 */
-       frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + 4;
-
-       if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen))
+       frame_size = mtu + QEDE_ETH_OVERHEAD;
+       if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) {
+               DP_ERR(edev, "MTU %u out of range\n", mtu);
                return -EINVAL;
-
+       }
        if (!dev->data->scattered_rx &&
-           frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM)
+           frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+               DP_INFO(edev, "MTU greater than minimum RX buffer size of %u\n",
+                       dev->data->min_rx_buf_size);
                return -EINVAL;
-
+       }
+       /* Temporarily replace I/O functions with dummy ones. It cannot
+        * be set to NULL because rte_eth_rx_burst() doesn't check for NULL.
+        */
+       dev->rx_pkt_burst = qede_rxtx_pkts_dummy;
+       dev->tx_pkt_burst = qede_rxtx_pkts_dummy;
+       qede_dev_stop(dev);
+       rte_delay_ms(1000);
+       qdev->mtu = mtu;
+       /* Fix up RX buf size for all queues of the port */
+       for_each_queue(i) {
+               fp = &qdev->fp_array[i];
+               if (fp->type & QEDE_FASTPATH_RX) {
+                       bufsz = (uint16_t)rte_pktmbuf_data_room_size(
+                               fp->rxq->mb_pool) - RTE_PKTMBUF_HEADROOM;
+                       if (dev->data->scattered_rx)
+                               rx_buf_size = bufsz + QEDE_ETH_OVERHEAD;
+                       else
+                               rx_buf_size = mtu + QEDE_ETH_OVERHEAD;
+                       rx_buf_size = QEDE_CEIL_TO_CACHE_LINE_SIZE(rx_buf_size);
+                       fp->rxq->rx_buf_size = rx_buf_size;
+                       DP_INFO(edev, "buf_size adjusted to %u\n", rx_buf_size);
+               }
+       }
+       qede_dev_start(dev);
        if (frame_size > ETHER_MAX_LEN)
                dev->data->dev_conf.rxmode.jumbo_frame = 1;
        else
                dev->data->dev_conf.rxmode.jumbo_frame = 0;
-
        /* update max frame size */
        dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
-       qdev->mtu = mtu;
-       qede_dev_stop(dev);
-       qede_dev_start(dev);
+       /* Reassign back */
+       dev->rx_pkt_burst = qede_recv_pkts;
+       dev->tx_pkt_burst = qede_xmit_pkts;
 
        return 0;
 }
@@ -2363,35 +2382,47 @@ static const struct rte_pci_id pci_id_qede_map[] = {
        {.vendor_id = 0,}
 };
 
-static struct eth_driver rte_qedevf_pmd = {
-       .pci_drv = {
-                   .id_table = pci_id_qedevf_map,
-                   .drv_flags =
-                   RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
-                   .probe = rte_eth_dev_pci_probe,
-                   .remove = rte_eth_dev_pci_remove,
-                  },
-       .eth_dev_init = qedevf_eth_dev_init,
-       .eth_dev_uninit = qedevf_eth_dev_uninit,
-       .dev_private_size = sizeof(struct qede_dev),
+static int qedevf_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+       struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_probe(pci_dev,
+               sizeof(struct qede_dev), qedevf_eth_dev_init);
+}
+
+static int qedevf_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, qedevf_eth_dev_uninit);
+}
+
+static struct rte_pci_driver rte_qedevf_pmd = {
+       .id_table = pci_id_qedevf_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .probe = qedevf_eth_dev_pci_probe,
+       .remove = qedevf_eth_dev_pci_remove,
 };
 
-static struct eth_driver rte_qede_pmd = {
-       .pci_drv = {
-                   .id_table = pci_id_qede_map,
-                   .drv_flags =
-                   RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
-                   .probe = rte_eth_dev_pci_probe,
-                   .remove = rte_eth_dev_pci_remove,
-                  },
-       .eth_dev_init = qede_eth_dev_init,
-       .eth_dev_uninit = qede_eth_dev_uninit,
-       .dev_private_size = sizeof(struct qede_dev),
+static int qede_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+       struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_probe(pci_dev,
+               sizeof(struct qede_dev), qede_eth_dev_init);
+}
+
+static int qede_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, qede_eth_dev_uninit);
+}
+
+static struct rte_pci_driver rte_qede_pmd = {
+       .id_table = pci_id_qede_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .probe = qede_eth_dev_pci_probe,
+       .remove = qede_eth_dev_pci_remove,
 };
 
-RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd.pci_drv);
+RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio");
-RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd.pci_drv);
+RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio");