+static int mv88e6xxx_wait_switch_ready(struct mv88e6xxx_chip *chip)
+{
+ const unsigned long timeout = jiffies + 1 * HZ;
+ bool ready;
+ int err;
+
+ /* Wait up to 1 second for switch to be ready.
+ * The switch is ready when all units inside the device (ATU, VTU, etc.)
+ * have finished their initialization and are ready to accept frames.
+ */
+ while (time_before(jiffies, timeout)) {
+ err = mv88e6xxx_g1_init_ready(chip, &ready);
+ if (err)
+ return err;
+
+ if (ready)
+ break;
+
+ usleep_range(1000, 2000);
+ }
+
+ if (time_after(jiffies, timeout))
+ return -ETIMEDOUT;
As we have seen in the past, this sort of loop is broken if we end up
sleeping for a long time. Please take the opportunity to replace it
with one of our _wait() helpers, e.g. mv88e6xxx_g1_wait()
+int mv88e6xxx_g1_init_ready(struct mv88e6xxx_chip *chip, bool *ready)
+{
+ u16 val;
+ int err;
+
+ /* Check the value of the InitReady bit 11 */
+ err = mv88e6xxx_g1_read(chip, GLOBAL_STATUS, &val);
+ if (err)
+ return err;
+
+ *ready = !!(val & GLOBAL_STATUS_INIT_READY);
I would actually do the wait here.
+
+ return 0;
+}
+
Thanks
Andrew