diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2010-12-07 01:55:33 +0300 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2010-12-07 01:55:33 +0300 |
commit | 1a29cc40115c011895143c5f8278dee49423d5df (patch) | |
tree | 8084812cb134b878a1227eaa9fd71b9c7a9712cc | |
parent | 494bdf1b0fd58688d055f1b66c34b0844dcfc1fa (diff) | |
download | linux-1a29cc40115c011895143c5f8278dee49423d5df.tar.xz |
sfc: Add compile-time checks for correctness of paged register writes
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
-rw-r--r-- | drivers/net/sfc/io.h | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/net/sfc/io.h b/drivers/net/sfc/io.h index 896b31e8606d..7f3adf29d6f6 100644 --- a/drivers/net/sfc/io.h +++ b/drivers/net/sfc/io.h @@ -226,29 +226,40 @@ static inline void efx_readd_table(struct efx_nic *efx, efx_dword_t *value, ((page) * EFX_PAGE_BLOCK_SIZE + (reg)) /* Write the whole of RX_DESC_UPD or TX_DESC_UPD */ -static inline void efx_writeo_page(struct efx_nic *efx, efx_oword_t *value, - unsigned int reg, unsigned int page) +static inline void _efx_writeo_page(struct efx_nic *efx, efx_oword_t *value, + unsigned int reg, unsigned int page) { efx_writeo(efx, value, EFX_PAGED_REG(page, reg)); } +#define efx_writeo_page(efx, value, reg, page) \ + _efx_writeo_page(efx, value, \ + reg + \ + BUILD_BUG_ON_ZERO((reg) != 0x830 && (reg) != 0xa10), \ + page) /* Write a page-mapped 32-bit CSR (EVQ_RPTR or the high bits of * RX_DESC_UPD or TX_DESC_UPD) */ -static inline void efx_writed_page(struct efx_nic *efx, efx_dword_t *value, - unsigned int reg, unsigned int page) +static inline void _efx_writed_page(struct efx_nic *efx, efx_dword_t *value, + unsigned int reg, unsigned int page) { efx_writed(efx, value, EFX_PAGED_REG(page, reg)); } +#define efx_writed_page(efx, value, reg, page) \ + _efx_writed_page(efx, value, \ + reg + \ + BUILD_BUG_ON_ZERO((reg) != 0x400 && (reg) != 0x83c \ + && (reg) != 0xa1c), \ + page) /* Write TIMER_COMMAND. This is a page-mapped 32-bit CSR, but a bug * in the BIU means that writes to TIMER_COMMAND[0] invalidate the * collector register. */ -static inline void efx_writed_page_locked(struct efx_nic *efx, - efx_dword_t *value, - unsigned int reg, - unsigned int page) +static inline void _efx_writed_page_locked(struct efx_nic *efx, + efx_dword_t *value, + unsigned int reg, + unsigned int page) { unsigned long flags __attribute__ ((unused)); @@ -260,5 +271,9 @@ static inline void efx_writed_page_locked(struct efx_nic *efx, efx_writed(efx, value, EFX_PAGED_REG(page, reg)); } } +#define efx_writed_page_locked(efx, value, reg, page) \ + _efx_writed_page_locked(efx, value, \ + reg + BUILD_BUG_ON_ZERO((reg) != 0x420), \ + page) #endif /* EFX_IO_H */ |