diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2009-03-20 09:27:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-21 22:06:56 -0400 |
commit | 85451a951b9511605475fadcc0a8d3aeccefded8 (patch) | |
tree | 29ab9fbe40a96582c36b5f629b88f3bceae74545 /drivers/net/sfc/falcon_io.h | |
parent | 28c4605826ab24d04102231fc1f3e8577bec376d (diff) |
sfc: Optimise falcon_writel_page_locked() for page > 0
The bug this function works around only applies to the first set of
page-mapped registers; other pages can be written without locking.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc/falcon_io.h')
-rw-r--r-- | drivers/net/sfc/falcon_io.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/sfc/falcon_io.h b/drivers/net/sfc/falcon_io.h index c16da3149fa9..8883092dae97 100644 --- a/drivers/net/sfc/falcon_io.h +++ b/drivers/net/sfc/falcon_io.h | |||
@@ -238,18 +238,21 @@ static inline void falcon_writel_page(struct efx_nic *efx, efx_dword_t *value, | |||
238 | /* Write dword to Falcon page-mapped register with an extra lock. | 238 | /* Write dword to Falcon page-mapped register with an extra lock. |
239 | * | 239 | * |
240 | * As for falcon_writel_page(), but for a register that suffers from | 240 | * As for falcon_writel_page(), but for a register that suffers from |
241 | * SFC bug 3181. Take out a lock so the BIU collector cannot be | 241 | * SFC bug 3181. If writing to page 0, take out a lock so the BIU |
242 | * confused. */ | 242 | * collector cannot be confused. |
243 | */ | ||
243 | static inline void falcon_writel_page_locked(struct efx_nic *efx, | 244 | static inline void falcon_writel_page_locked(struct efx_nic *efx, |
244 | efx_dword_t *value, | 245 | efx_dword_t *value, |
245 | unsigned int reg, | 246 | unsigned int reg, |
246 | unsigned int page) | 247 | unsigned int page) |
247 | { | 248 | { |
248 | unsigned long flags; | 249 | unsigned long flags = 0; |
249 | 250 | ||
250 | spin_lock_irqsave(&efx->biu_lock, flags); | 251 | if (page == 0) |
252 | spin_lock_irqsave(&efx->biu_lock, flags); | ||
251 | falcon_writel(efx, value, FALCON_PAGED_REG(page, reg)); | 253 | falcon_writel(efx, value, FALCON_PAGED_REG(page, reg)); |
252 | spin_unlock_irqrestore(&efx->biu_lock, flags); | 254 | if (page == 0) |
255 | spin_unlock_irqrestore(&efx->biu_lock, flags); | ||
253 | } | 256 | } |
254 | 257 | ||
255 | #endif /* EFX_FALCON_IO_H */ | 258 | #endif /* EFX_FALCON_IO_H */ |