Skip to content

Commit

Permalink
sfc: Optimise falcon_writel_page_locked() for page > 0
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Mar 22, 2009
1 parent 28c4605 commit 85451a9
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions drivers/net/sfc/falcon_io.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,18 +238,21 @@ static inline void falcon_writel_page(struct efx_nic *efx, efx_dword_t *value,
/* Write dword to Falcon page-mapped register with an extra lock.
*
* As for falcon_writel_page(), but for a register that suffers from
* SFC bug 3181. Take out a lock so the BIU collector cannot be
* confused. */
* SFC bug 3181. If writing to page 0, take out a lock so the BIU
* collector cannot be confused.
*/
static inline void falcon_writel_page_locked(struct efx_nic *efx,
efx_dword_t *value,
unsigned int reg,
unsigned int page)
{
unsigned long flags;
unsigned long flags = 0;

spin_lock_irqsave(&efx->biu_lock, flags);
if (page == 0)
spin_lock_irqsave(&efx->biu_lock, flags);
falcon_writel(efx, value, FALCON_PAGED_REG(page, reg));
spin_unlock_irqrestore(&efx->biu_lock, flags);
if (page == 0)
spin_unlock_irqrestore(&efx->biu_lock, flags);
}

#endif /* EFX_FALCON_IO_H */

0 comments on commit 85451a9

Please sign in to comment.