diff options
author | Steve Hodgson <shodgson@solarflare.com> | 2010-04-28 05:29:32 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-28 15:44:38 -0400 |
commit | 3a595102d4298a357d70aaf1d47ae86d92708ea9 (patch) | |
tree | 8feb409e2707f54a94b569c83f3cbf2558ef4c23 /drivers/net/sfc/mcdi_mac.c | |
parent | fbcfe8e1525e6f2f633329147cdbb9ab7029f58a (diff) |
sfc: Set PERIODIC_NOEVENT flag for MC_CMD_MAC_STATS
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>
Diffstat (limited to 'drivers/net/sfc/mcdi_mac.c')
-rw-r--r-- | drivers/net/sfc/mcdi_mac.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/drivers/net/sfc/mcdi_mac.c b/drivers/net/sfc/mcdi_mac.c index 06d24a1e412a..39182631ac92 100644 --- a/drivers/net/sfc/mcdi_mac.c +++ b/drivers/net/sfc/mcdi_mac.c | |||
@@ -80,7 +80,7 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr, | |||
80 | u8 inbuf[MC_CMD_MAC_STATS_IN_LEN]; | 80 | u8 inbuf[MC_CMD_MAC_STATS_IN_LEN]; |
81 | int rc; | 81 | int rc; |
82 | efx_dword_t *cmd_ptr; | 82 | efx_dword_t *cmd_ptr; |
83 | int period = 1000; | 83 | int period = enable ? 1000 : 0; |
84 | u32 addr_hi; | 84 | u32 addr_hi; |
85 | u32 addr_lo; | 85 | u32 addr_lo; |
86 | 86 | ||
@@ -92,21 +92,14 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr, | |||
92 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_LO, addr_lo); | 92 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_LO, addr_lo); |
93 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_HI, addr_hi); | 93 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_HI, addr_hi); |
94 | cmd_ptr = (efx_dword_t *)MCDI_PTR(inbuf, MAC_STATS_IN_CMD); | 94 | cmd_ptr = (efx_dword_t *)MCDI_PTR(inbuf, MAC_STATS_IN_CMD); |
95 | if (enable) | 95 | EFX_POPULATE_DWORD_7(*cmd_ptr, |
96 | EFX_POPULATE_DWORD_6(*cmd_ptr, | 96 | MC_CMD_MAC_STATS_CMD_DMA, !!enable, |
97 | MC_CMD_MAC_STATS_CMD_DMA, 1, | 97 | MC_CMD_MAC_STATS_CMD_CLEAR, clear, |
98 | MC_CMD_MAC_STATS_CMD_CLEAR, clear, | 98 | MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1, |
99 | MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1, | 99 | MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, !!enable, |
100 | MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, 1, | 100 | MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0, |
101 | MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0, | 101 | MC_CMD_MAC_STATS_CMD_PERIODIC_NOEVENT, 1, |
102 | MC_CMD_MAC_STATS_CMD_PERIOD_MS, period); | 102 | MC_CMD_MAC_STATS_CMD_PERIOD_MS, period); |
103 | else | ||
104 | EFX_POPULATE_DWORD_5(*cmd_ptr, | ||
105 | MC_CMD_MAC_STATS_CMD_DMA, 0, | ||
106 | MC_CMD_MAC_STATS_CMD_CLEAR, clear, | ||
107 | MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1, | ||
108 | MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, 0, | ||
109 | MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0); | ||
110 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len); | 103 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len); |
111 | 104 | ||
112 | rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf), | 105 | rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf), |