* [dpdk-dev] [PATCH 2/3] net/enic: move code checking link status
2016-09-19 18:50 [dpdk-dev] [PATCH 1/3] net/enic: cleanup interrupt setup when stopping port Nelson Escobar
@ 2016-09-19 18:50 ` Nelson Escobar
2016-09-19 18:50 ` [dpdk-dev] [PATCH 3/3] net/enic: enable link check interrupts Nelson Escobar
2016-09-27 14:24 ` [dpdk-dev] [PATCH 1/3] net/enic: cleanup interrupt setup when stopping port Bruce Richardson
2 siblings, 0 replies; 5+ messages in thread
From: Nelson Escobar @ 2016-09-19 18:50 UTC (permalink / raw)
To: dev; +Cc: bruce.richardson, Nelson Escobar
Move link check code so that it can be used by interrupt handler.
Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
---
drivers/net/enic/enic.h | 1 +
drivers/net/enic/enic_ethdev.c | 10 +---------
drivers/net/enic/enic_main.c | 15 +++++++++++++++
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index 4c16ef1..5c9345f 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -273,4 +273,5 @@ uint16_t enic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
uint16_t nb_pkts);
int enic_set_mtu(struct enic *enic, uint16_t new_mtu);
+int enic_link_update(struct enic *enic);
#endif /* _ENIC_H_ */
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 6cbecb1..e10c824 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -403,17 +403,9 @@ static int enicpmd_dev_link_update(struct rte_eth_dev *eth_dev,
__rte_unused int wait_to_complete)
{
struct enic *enic = pmd_priv(eth_dev);
- int ret;
- int link_status = 0;
ENICPMD_FUNC_TRACE();
- link_status = enic_get_link_status(enic);
- ret = (link_status == enic->link_status);
- enic->link_status = link_status;
- eth_dev->data->dev_link.link_status = link_status;
- eth_dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
- eth_dev->data->dev_link.link_speed = vnic_dev_port_speed(enic->vdev);
- return ret;
+ return enic_link_update(enic);
}
static void enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev,
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index aec24d2..aaf47e6 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -411,6 +411,21 @@ enic_free_consistent(void *priv,
rte_free(mze);
}
+int enic_link_update(struct enic *enic)
+{
+ struct rte_eth_dev *eth_dev = enic->rte_dev;
+ int ret;
+ int link_status = 0;
+
+ link_status = enic_get_link_status(enic);
+ ret = (link_status == enic->link_status);
+ enic->link_status = link_status;
+ eth_dev->data->dev_link.link_status = link_status;
+ eth_dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
+ eth_dev->data->dev_link.link_speed = vnic_dev_port_speed(enic->vdev);
+ return ret;
+}
+
static void
enic_intr_handler(__rte_unused struct rte_intr_handle *handle,
void *arg)
--
2.7.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH 3/3] net/enic: enable link check interrupts
2016-09-19 18:50 [dpdk-dev] [PATCH 1/3] net/enic: cleanup interrupt setup when stopping port Nelson Escobar
2016-09-19 18:50 ` [dpdk-dev] [PATCH 2/3] net/enic: move code checking link status Nelson Escobar
@ 2016-09-19 18:50 ` Nelson Escobar
2016-09-27 14:23 ` Bruce Richardson
2016-09-27 14:24 ` [dpdk-dev] [PATCH 1/3] net/enic: cleanup interrupt setup when stopping port Bruce Richardson
2 siblings, 1 reply; 5+ messages in thread
From: Nelson Escobar @ 2016-09-19 18:50 UTC (permalink / raw)
To: dev; +Cc: bruce.richardson, Nelson Escobar
Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
---
doc/guides/nics/enic.rst | 3 ++-
drivers/net/enic/enic_ethdev.c | 2 +-
drivers/net/enic/enic_main.c | 19 ++++++++++++++++++-
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/doc/guides/nics/enic.rst b/doc/guides/nics/enic.rst
index 42e781e..8170286 100644
--- a/doc/guides/nics/enic.rst
+++ b/doc/guides/nics/enic.rst
@@ -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
-----------
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index e10c824..44105d6 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -607,7 +607,7 @@ static struct eth_driver rte_enic_pmd = {
.pci_drv = {
.name = "rte_enic_pmd",
.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,
},
.eth_dev_init = eth_enicpmd_dev_init,
.dev_private_size = sizeof(struct enic),
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index aaf47e6..55c7217 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -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);
}
@@ -447,6 +450,13 @@ int enic_enable(struct enic *enic)
eth_dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
vnic_dev_notify_set(enic->vdev, -1); /* No Intr for notify */
+ /* 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");
@@ -838,6 +848,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);
vnic_dev_notify_unset(enic->vdev);
--
2.7.0
^ permalink raw reply [flat|nested] 5+ messages in thread