net/enic: enable link check interrupt

Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
This commit is contained in:
Nelson Escobar 2016-09-19 11:50:11 -07:00 committed by Bruce Richardson
parent cf8d9826b7
commit 53fa8cc0d5
4 changed files with 22 additions and 3 deletions

View 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
-----------

View File

@ -5,6 +5,7 @@
;
[Features]
Link status = Y
Link status event = Y
Queue start/stop = Y
MTU update = P
Jumbo frame = Y

View 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,
},

View 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++)