net/sfc: add MCDI callback to poll management event queue
authorAndrew Rybchenko <arybchenko@solarflare.com>
Thu, 17 Sep 2020 06:34:41 +0000 (07:34 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 30 Sep 2020 17:19:08 +0000 (19:19 +0200)
Management event queue polling is required in the case of
MCDI proxy authentication (client driver code).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/net/sfc/sfc_mcdi.c
drivers/net/sfc/sfc_mcdi.h

index 73dbd81..fa9160f 100644 (file)
@@ -70,7 +70,7 @@ sfc_efx_mcdi_proxy_event_available(struct sfc_adapter *sa)
 
        mcdi->proxy_handle = 0;
        mcdi->proxy_result = ETIMEDOUT;
-       sfc_ev_mgmt_qpoll(sa);
+       mcdi->ops->mgmt_evq_poll(mcdi->ops_cookie);
        if (mcdi->proxy_result != ETIMEDOUT)
                return B_TRUE;
 
@@ -286,7 +286,7 @@ sfc_efx_mcdi_init(struct sfc_adapter *sa, struct sfc_efx_mcdi *mcdi,
        int rc;
 
        if (ops->dma_alloc == NULL || ops->dma_free == NULL ||
-           ops->sched_restart == NULL)
+           ops->sched_restart == NULL || ops->mgmt_evq_poll == NULL)
                return EINVAL;
 
        SFC_ASSERT(mcdi->state == SFC_EFX_MCDI_UNINITIALIZED);
@@ -382,10 +382,20 @@ sfc_mcdi_sched_restart(void *cookie)
        sfc_schedule_restart(sa);
 }
 
+static sfc_efx_mcdi_mgmt_evq_poll_cb sfc_mcdi_mgmt_evq_poll;
+static void
+sfc_mcdi_mgmt_evq_poll(void *cookie)
+{
+       struct sfc_adapter *sa = cookie;
+
+       sfc_ev_mgmt_qpoll(sa);
+}
+
 static const struct sfc_efx_mcdi_ops sfc_mcdi_ops = {
        .dma_alloc      = sfc_mcdi_dma_alloc,
        .dma_free       = sfc_mcdi_dma_free,
        .sched_restart  = sfc_mcdi_sched_restart,
+       .mgmt_evq_poll  = sfc_mcdi_mgmt_evq_poll,
 };
 
 int
index 8f9b199..e3a637a 100644 (file)
@@ -39,10 +39,13 @@ typedef void (sfc_efx_mcdi_dma_free_cb)(void *cookie, efsys_mem_t *esmp);
 
 typedef void (sfc_efx_mcdi_sched_restart_cb)(void *cookie);
 
+typedef void (sfc_efx_mcdi_mgmt_evq_poll_cb)(void *cookie);
+
 struct sfc_efx_mcdi_ops {
        sfc_efx_mcdi_dma_alloc_cb       *dma_alloc;
        sfc_efx_mcdi_dma_free_cb        *dma_free;
        sfc_efx_mcdi_sched_restart_cb   *sched_restart;
+       sfc_efx_mcdi_mgmt_evq_poll_cb   *mgmt_evq_poll;
 };
 
 struct sfc_efx_mcdi {