Simplify the usb_pause_mtx() function by factoring out the generic parts
to the kernel's pause() function. The pause() function can now be used when cold != 0. Also assert that the timeout in system ticks must be positive. Suggested by: Bruce Evans MFC after: 1 week
This commit is contained in:
parent
11bcf702f4
commit
3ddd1777d5
@ -115,33 +115,21 @@ device_set_usb_desc(device_t dev)
|
||||
*
|
||||
* This function will delay the code by the passed number of system
|
||||
* ticks. The passed mutex "mtx" will be dropped while waiting, if
|
||||
* "mtx" is not NULL.
|
||||
* "mtx" is different from NULL.
|
||||
*------------------------------------------------------------------------*/
|
||||
void
|
||||
usb_pause_mtx(struct mtx *mtx, int _ticks)
|
||||
usb_pause_mtx(struct mtx *mtx, int timo)
|
||||
{
|
||||
if (mtx != NULL)
|
||||
mtx_unlock(mtx);
|
||||
|
||||
if (cold) {
|
||||
/* convert to milliseconds */
|
||||
_ticks = (_ticks * 1000) / hz;
|
||||
/* convert to microseconds, rounded up */
|
||||
_ticks = (_ticks + 1) * 1000;
|
||||
DELAY(_ticks);
|
||||
/*
|
||||
* Add one tick to the timeout so that we don't return too
|
||||
* early! Note that pause() will assert that the passed
|
||||
* timeout is positive and non-zero!
|
||||
*/
|
||||
pause("USBWAIT", timo + 1);
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
* Add one to the number of ticks so that we don't return
|
||||
* too early!
|
||||
*/
|
||||
_ticks++;
|
||||
|
||||
if (pause("USBWAIT", _ticks)) {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
if (mtx != NULL)
|
||||
mtx_lock(mtx);
|
||||
}
|
||||
|
@ -325,16 +325,34 @@ msleep_spin(void *ident, struct mtx *mtx, const char *wmesg, int timo)
|
||||
}
|
||||
|
||||
/*
|
||||
* pause() is like tsleep() except that the intention is to not be
|
||||
* explicitly woken up by another thread. Instead, the current thread
|
||||
* simply wishes to sleep until the timeout expires. It is
|
||||
* implemented using a dummy wait channel.
|
||||
* pause() is almost like tsleep() except that the intention is to not
|
||||
* be explicitly woken up by another thread. Instead, the current
|
||||
* thread simply wishes to sleep until the timeout expires. It is
|
||||
* implemented using a dummy wait channel. During cold bootup pause()
|
||||
* will use the DELAY() function instead of tsleep() to wait the given
|
||||
* number of system ticks. The passed "timo" argument must not be
|
||||
* negative and also greater than zero.
|
||||
*/
|
||||
int
|
||||
pause(const char *wmesg, int timo)
|
||||
{
|
||||
|
||||
KASSERT(timo != 0, ("pause: timeout required"));
|
||||
KASSERT(timo > 0, ("pause: a positive and non-zero "
|
||||
"timeout is required"));
|
||||
|
||||
if (cold) {
|
||||
/*
|
||||
* We delay one HZ at a time to avoid overflowing the
|
||||
* DELAY() argument:
|
||||
*/
|
||||
while (timo >= hz) {
|
||||
DELAY(1000000);
|
||||
timo -= hz;
|
||||
}
|
||||
if (timo > 0)
|
||||
DELAY(timo * tick);
|
||||
return (0);
|
||||
}
|
||||
return (tsleep(&pause_wchan, 0, wmesg, timo));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user