sfc: Set PERIODIC_NOEVENT flag for MC_CMD_MAC_STATS
authorSteve Hodgson <shodgson@solarflare.com>
Wed, 28 Apr 2010 09:29:32 +0000 (09:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Apr 2010 19:44:38 +0000 (12:44 -0700)
When set, an event is not sent whenever periodic MAC statistics are
raised.  This avoids unnecessary wake-ups.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/mcdi_mac.c

index 06d24a1e412aa74dffde75421687b45bd57cb494..39182631ac924a3938e3cbb39e1d28073c5cca55 100644 (file)
@@ -80,7 +80,7 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
        u8 inbuf[MC_CMD_MAC_STATS_IN_LEN];
        int rc;
        efx_dword_t *cmd_ptr;
-       int period = 1000;
+       int period = enable ? 1000 : 0;
        u32 addr_hi;
        u32 addr_lo;
 
@@ -92,21 +92,14 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_LO, addr_lo);
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_HI, addr_hi);
        cmd_ptr = (efx_dword_t *)MCDI_PTR(inbuf, MAC_STATS_IN_CMD);
-       if (enable)
-               EFX_POPULATE_DWORD_6(*cmd_ptr,
-                                    MC_CMD_MAC_STATS_CMD_DMA, 1,
-                                    MC_CMD_MAC_STATS_CMD_CLEAR, clear,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, 1,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0,
-                                    MC_CMD_MAC_STATS_CMD_PERIOD_MS, period);
-       else
-               EFX_POPULATE_DWORD_5(*cmd_ptr,
-                                    MC_CMD_MAC_STATS_CMD_DMA, 0,
-                                    MC_CMD_MAC_STATS_CMD_CLEAR, clear,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, 0,
-                                    MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0);
+       EFX_POPULATE_DWORD_7(*cmd_ptr,
+                            MC_CMD_MAC_STATS_CMD_DMA, !!enable,
+                            MC_CMD_MAC_STATS_CMD_CLEAR, clear,
+                            MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1,
+                            MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, !!enable,
+                            MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0,
+                            MC_CMD_MAC_STATS_CMD_PERIODIC_NOEVENT, 1,
+                            MC_CMD_MAC_STATS_CMD_PERIOD_MS, period);
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len);
 
        rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),