int parport_wait_peripheral(struct parport *port, unsigned char mask, unsigned char result) { int ret; int usec; unsigned long deadline; unsigned char status; usec = port->physport->spintime; /* usecs of fast polling */ if (!port->physport->cad->timeout) /* A zero timeout is "special": busy wait for the entire 35ms. */ usec = 35000; /* Fast polling. * * This should be adjustable. * How about making a note (in the device structure) of how long * it takes, so we know for next time? */ ret = parport_poll_peripheral (port, mask, result, usec); if (ret != 1) return ret; if (!port->physport->cad->timeout) /* We may be in an interrupt handler, so we can't poll * slowly anyway. */ return 1; /* 40ms of slow polling. */ deadline = jiffies + msecs_to_jiffies(40); while (time_before (jiffies, deadline)) { if (signal_pending (current)) return -EINTR; /* Wait for 10ms (or until an interrupt occurs if * the handler is set) */ if ((ret = parport_wait_event (port, msecs_to_jiffies(10))) < 0) return ret; status = parport_read_status (port); if ((status & mask) == result) return 0; if (!ret) { /* parport_wait_event didn't time out, but the * peripheral wasn't actually ready either. * Wait for another 10ms. */ schedule_timeout_interruptible(msecs_to_jiffies(10)); } } return 1; }
int parport_wait_peripheral(struct parport *port, unsigned char mask, unsigned char result) { int ret; int usec; unsigned long deadline; unsigned char status; usec = port->physport->spintime; if (!port->physport->cad->timeout) usec = 35000; ret = parport_poll_peripheral (port, mask, result, usec); if (ret != 1) return ret; if (!port->physport->cad->timeout) return 1; deadline = jiffies + msecs_to_jiffies(40); while (time_before (jiffies, deadline)) { if (signal_pending (current)) return -EINTR; if ((ret = parport_wait_event (port, msecs_to_jiffies(10))) < 0) return ret; status = parport_read_status (port); if ((status & mask) == result) return 0; if (!ret) { schedule_timeout_interruptible(msecs_to_jiffies(10)); } } return 1; }