net/enic: enable link check interrupt
authorNelson Escobar <neescoba@cisco.com>
Mon, 19 Sep 2016 18:50:11 +0000 (11:50 -0700)
committerBruce Richardson <bruce.richardson@intel.com>
Fri, 30 Sep 2016 10:27:18 +0000 (12:27 +0200)
Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
doc/guides/nics/enic.rst
doc/guides/nics/features/enic.ini
drivers/net/enic/enic_ethdev.c
drivers/net/enic/enic_main.c

index 42e781e..8170286 100644 (file)
@@ -76,7 +76,8 @@ Configuration information
 
     Only one interrupt per vNIC interface should be configured in the UCS
     manager regardless of the number receive/transmit queues. The ENIC PMD
-    uses this interrupt to   get information about errors in the fast path.
+    uses this interrupt to get information about link status and errors
+    in the fast path.
 
 Limitations
 -----------
index 7e0241f..7d3f801 100644 (file)
@@ -5,6 +5,7 @@
 ;
 [Features]
 Link status          = Y
+Link status event    = Y
 Queue start/stop     = Y
 MTU update           = P
 Jumbo frame          = Y
index da2abd9..82dc265 100644 (file)
@@ -635,7 +635,7 @@ static int eth_enicpmd_dev_init(struct rte_eth_dev *eth_dev)
 static struct eth_driver rte_enic_pmd = {
        .pci_drv = {
                .id_table = pci_id_enic_map,
-               .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+               .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
                .probe = rte_eth_dev_pci_probe,
                .remove = rte_eth_dev_pci_remove,
        },
index a0283ca..5d9bf4c 100644 (file)
@@ -430,10 +430,13 @@ static void
 enic_intr_handler(__rte_unused struct rte_intr_handle *handle,
        void *arg)
 {
-       struct enic *enic = pmd_priv((struct rte_eth_dev *)arg);
+       struct rte_eth_dev *dev = (struct rte_eth_dev *)arg;
+       struct enic *enic = pmd_priv(dev);
 
        vnic_intr_return_all_credits(&enic->intr);
 
+       enic_link_update(enic);
+       _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC);
        enic_log_q_error(enic);
 }
 
@@ -446,6 +449,13 @@ int enic_enable(struct enic *enic)
        eth_dev->data->dev_link.link_speed = vnic_dev_port_speed(enic->vdev);
        eth_dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
 
+       /* vnic notification of link status has already been turned on in
+        * enic_dev_init() which is called during probe time.  Here we are
+        * just turning on interrupt vector 0 if needed.
+        */
+       if (eth_dev->data->dev_conf.intr_conf.lsc)
+               vnic_dev_notify_set(enic->vdev, 0);
+
        if (enic_clsf_init(enic))
                dev_warning(enic, "Init of hash table for clsf failed."\
                        "Flow director feature will not work\n");
@@ -837,6 +847,13 @@ int enic_disable(struct enic *enic)
                }
        }
 
+       /* If we were using interrupts, set the interrupt vector to -1
+        * to disable interrupts.  We are not disabling link notifcations,
+        * though, as we want the polling of link status to continue working.
+        */
+       if (enic->rte_dev->data->dev_conf.intr_conf.lsc)
+               vnic_dev_notify_set(enic->vdev, -1);
+
        vnic_dev_set_reset_flag(enic->vdev, 1);
 
        for (i = 0; i < enic->wq_count; i++)