From: Gautam Dawar Date: Mon, 10 Jun 2019 07:38:38 +0000 (+0100) Subject: net/sfc/base: support data path with EVB module X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=05fa170a2b0760295cb0af687cb1c56c1e6d06ea;p=dpdk.git net/sfc/base: support data path with EVB module ef10_nic_init() allocates a vAdaptor for the physical port in current flow. In case of SR-IOV, this vAdaptor must be created for the PF as the vSwitch is allocated on the physical port. So, the call to efx_mcdi_vadaptor_alloc() should be avoided in ef10_nic_init() in SR-IOV flow. To achieve this, for SR-IOV use case, the vSwitch is created before NIC initialization and its handle is used to prevent vAdaptor allocation in ef10_nic_init(). This approach has been taken to minimize the changes in NIC initialization flow. This is also the case with Linux driver where vSwitch creation happens before NIC initialization. Also, when DMA queues need to be allocated for Tx/Rx functionality (MC_CMD_INIT_RXQ / MC_CMD_INIT_TXQ), the correct vPort is selected based on efx_vswitch_t property of efx_nic_t structure - vport corresponding to PF in case of SR-IOV use case and EVB_PORT_ID_ASSIGNED for physical port. Signed-off-by: Gautam Dawar Signed-off-by: Andrew Rybchenko --- diff --git a/drivers/net/sfc/base/ef10_filter.c b/drivers/net/sfc/base/ef10_filter.c index 9c09a0de2f..e4f8de51c0 100644 --- a/drivers/net/sfc/base/ef10_filter.c +++ b/drivers/net/sfc/base/ef10_filter.c @@ -202,8 +202,7 @@ efx_mcdi_filter_op_add( goto fail1; } - MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_PORT_ID, - EVB_PORT_ID_ASSIGNED); + MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_PORT_ID, enp->en_vport_id); MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_MATCH_FIELDS, match_flags); if (spec->efs_dmaq_id == EFX_FILTER_SPEC_RX_DMAQ_ID_DROP) { diff --git a/drivers/net/sfc/base/ef10_nic.c b/drivers/net/sfc/base/ef10_nic.c index 0cf9ddde74..a647daa242 100644 --- a/drivers/net/sfc/base/ef10_nic.c +++ b/drivers/net/sfc/base/ef10_nic.c @@ -233,8 +233,6 @@ efx_mcdi_vadaptor_alloc( MC_CMD_VADAPTOR_ALLOC_OUT_LEN); efx_rc_t rc; - EFSYS_ASSERT3U(enp->en_vport_id, ==, EVB_PORT_ID_NULL); - req.emr_cmd = MC_CMD_VADAPTOR_ALLOC; req.emr_in_buf = payload; req.emr_in_length = MC_CMD_VADAPTOR_ALLOC_IN_LEN; @@ -2517,9 +2515,21 @@ ef10_nic_fini( { uint32_t i; efx_rc_t rc; + boolean_t do_vadaptor_free = B_TRUE; - (void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id); - enp->en_vport_id = 0; +#if EFSYS_OPT_EVB + if (enp->en_vswitchp != NULL) { + /* + * For SR-IOV the vAdaptor is freed with the vswitch, + * so do not free it here. + */ + do_vadaptor_free = B_FALSE; + } +#endif + if (do_vadaptor_free != B_FALSE) { + (void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id); + enp->en_vport_id = EVB_PORT_ID_NULL; + } /* Unlink piobufs from extra VIs in WC mapping */ if (enp->en_arch.ef10.ena_piobuf_count > 0) { diff --git a/drivers/net/sfc/base/ef10_rx.c b/drivers/net/sfc/base/ef10_rx.c index 27514c1cbf..10eace46ca 100644 --- a/drivers/net/sfc/base/ef10_rx.c +++ b/drivers/net/sfc/base/ef10_rx.c @@ -106,7 +106,7 @@ efx_mcdi_init_rxq( INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes, INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev); MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0); - MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, EVB_PORT_ID_ASSIGNED); + MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id); if (es_bufs_per_desc > 0) { MCDI_IN_SET_DWORD(req, @@ -233,7 +233,7 @@ efx_mcdi_rss_context_alloc( req.emr_out_length = MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN; MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_UPSTREAM_PORT_ID, - EVB_PORT_ID_ASSIGNED); + enp->en_vport_id); MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_TYPE, context_type); /* diff --git a/drivers/net/sfc/base/ef10_tx.c b/drivers/net/sfc/base/ef10_tx.c index 6a908167bd..90f4803aef 100644 --- a/drivers/net/sfc/base/ef10_tx.c +++ b/drivers/net/sfc/base/ef10_tx.c @@ -82,7 +82,7 @@ efx_mcdi_init_txq( INIT_TXQ_IN_FLAG_TIMESTAMP, 0); MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0); - MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, EVB_PORT_ID_ASSIGNED); + MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id); dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR); addr = EFSYS_MEM_ADDR(esmp);