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>
This commit is contained in:
parent
28c4605826
commit
85451a951b
1 changed files with 8 additions and 5 deletions
|
@ -238,17 +238,20 @@ 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;
|
||||
|
||||
if (page == 0)
|
||||
spin_lock_irqsave(&efx->biu_lock, flags);
|
||||
falcon_writel(efx, value, FALCON_PAGED_REG(page, reg));
|
||||
if (page == 0)
|
||||
spin_unlock_irqrestore(&efx->biu_lock, flags);
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue