sfc: suppress ENOENT error messages from MC_CMD_MAC_STATS
authorDaniel Pieczko <dpieczko@solarflare.com>
Tue, 2 Jun 2015 10:39:49 +0000 (11:39 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Jun 2015 19:57:29 +0000 (12:57 -0700)
MC_CMD_MAC_STATS can be called on a function before a
vadaptor has been created, as the kernel can call into this
through ndo_get_stats/ndo_get_stats64.

If MC_CMD_MAC_STATS is called before the DMA queues have been
setup, so that a vadaptor has not been created yet, firmware
will return ENOENT. This is expected, so suppress the MCDI
error message in this case.

Signed-off-by: Shradha Shah <sshah@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/ef10.c
drivers/net/ethernet/sfc/mcdi_port.c

index b880d98..a79a24f 100644 (file)
@@ -1316,11 +1316,16 @@ static int efx_ef10_try_update_nic_stats_vf(struct efx_nic *efx)
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_PORT_ID, EVB_PORT_ID_ASSIGNED);
 
        spin_unlock_bh(&efx->stats_lock);
-       rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf), NULL,
-                         0, NULL);
+       rc = efx_mcdi_rpc_quiet(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),
+                               NULL, 0, NULL);
        spin_lock_bh(&efx->stats_lock);
-       if (rc)
+       if (rc) {
+               /* Expect ENOENT if DMA queues have not been set up */
+               if (rc != -ENOENT || atomic_read(&efx->active_queues))
+                       efx_mcdi_display_error(efx, MC_CMD_MAC_STATS,
+                                              sizeof(inbuf), NULL, 0, rc);
                goto out;
+       }
 
        generation_end = dma_stats[MC_CMD_MAC_GENERATION_END];
        if (generation_end == EFX_MC_STATS_GENERATION_INVALID) {
index fffc348..7f295c4 100644 (file)
@@ -948,8 +948,12 @@ static int efx_mcdi_mac_stats(struct efx_nic *efx,
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len);
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_PORT_ID, nic_data->vport_id);
 
-       rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),
-                         NULL, 0, NULL);
+       rc = efx_mcdi_rpc_quiet(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),
+                               NULL, 0, NULL);
+       /* Expect ENOENT if DMA queues have not been set up */
+       if (rc && (rc != -ENOENT || atomic_read(&efx->active_queues)))
+               efx_mcdi_display_error(efx, MC_CMD_MAC_STATS, sizeof(inbuf),
+                                      NULL, 0, rc);
        return rc;
 }