int temac_indirect_busywait(struct temac_local *lp) { unsigned long end = jiffies + 2; while (!(temac_ior(lp, XTE_RDY0_OFFSET) & XTE_RDY0_HARD_ACS_RDY_MASK)) { if (time_before_eq(end, jiffies)) { WARN_ON(1); return -ETIMEDOUT; } msleep(1); } return 0; }
/** * 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; }
int temac_indirect_busywait(struct temac_local *lp) { long end = jiffies + 2; while (!(temac_ior(lp, XTE_RDY0_OFFSET) & XTE_RDY0_HARD_ACS_RDY_MASK)) { if (end - jiffies <= 0) { WARN_ON(1); return -ETIMEDOUT; } msleep(1); } return 0; }
/** * 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); }
static bool hard_acs_rdy(struct temac_local *lp) { return temac_ior(lp, XTE_RDY0_OFFSET) & XTE_RDY0_HARD_ACS_RDY_MASK; }