aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2009-03-20 09:27:13 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-21 22:06:56 -0400
commit85451a951b9511605475fadcc0a8d3aeccefded8 (patch)
tree29ab9fbe40a96582c36b5f629b88f3bceae74545
parent28c4605826ab24d04102231fc1f3e8577bec376d (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>
-rw-r--r--drivers/net/sfc/falcon_io.h13
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 */
243static inline void falcon_writel_page_locked(struct efx_nic *efx, 244static 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 */