/** * temac_indirect_out32 * * lp->indirect_mutex must be held when calling this function */ void temac_indirect_out32(struct temac_local *lp, int reg, u32 value) { if (temac_indirect_busywait(lp)) return; temac_iow(lp, XTE_LSW0_OFFSET, value); temac_iow(lp, XTE_CTL0_OFFSET, CNTLREG_WRITE_ENABLE_MASK | reg); temac_indirect_busywait(lp); }
/** * temac_indirect_in32 * * lp->indirect_mutex must be held when calling this function */ u32 temac_indirect_in32(struct temac_local *lp, int reg) { u32 val; if (temac_indirect_busywait(lp)) return -ETIMEDOUT; temac_iow(lp, XTE_CTL0_OFFSET, reg); if (temac_indirect_busywait(lp)) return -ETIMEDOUT; val = temac_ior(lp, XTE_LSW0_OFFSET); return val; }
/** * temac_indirect_out32_locked - Indirect register write access. This * function must be called with lp->indirect_lock being held. Use * this together with spin_lock_irqsave/spin_lock_irqrestore to avoid * repeated lock/unlock and to ensure uninterrupted access to indirect * registers. */ void temac_indirect_out32_locked(struct temac_local *lp, int reg, u32 value) { /* As in temac_indirect_in32_locked(), we should normally not * spin here. And if it happens, we actually end up silently * ignoring the write request. Ouch. */ if (WARN_ON(temac_indirect_busywait(lp))) return; /* Initiate write to indirect register */ temac_iow(lp, XTE_LSW0_OFFSET, value); temac_iow(lp, XTE_CTL0_OFFSET, CNTLREG_WRITE_ENABLE_MASK | reg); /* As in temac_indirect_in32_locked(), we should not see timeouts * here. And if it happens, we continue before the write has * completed. Not good. */ WARN_ON(temac_indirect_busywait(lp)); }
/** * temac_indirect_in32_locked - Indirect register read access. This * function must be called with lp->indirect_lock being held. Use * this together with spin_lock_irqsave/spin_lock_irqrestore to avoid * repeated lock/unlock and to ensure uninterrupted access to indirect * registers. */ u32 temac_indirect_in32_locked(struct temac_local *lp, int reg) { /* This initial wait should normally not spin, as we always * try to wait for indirect access to complete before * releasing the indirect_lock. */ if (WARN_ON(temac_indirect_busywait(lp))) return -ETIMEDOUT; /* Initiate read from indirect register */ temac_iow(lp, XTE_CTL0_OFFSET, reg); /* Wait for indirect register access to complete. We really * should not see timeouts, and could even end up causing * problem for following indirect access, so let's make a bit * of WARN noise. */ if (WARN_ON(temac_indirect_busywait(lp))) return -ETIMEDOUT; /* Value is ready now */ return temac_ior(lp, XTE_LSW0_OFFSET); }