Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Laptop cannot detect usb devices until they are unplugged and plugged in again. Fix suggested.
On 9/8/08, David Young <dyoung%pobox.com@localhost> wrote:
> On Mon, Sep 08, 2008 at 08:11:19PM -0400, luasi dubay wrote:
>> Hi,
>>
>> My laptop cannot detect my usb mouse (hub/usb serial adapter) when I
>> power it up. Rebooting does not fix the problem. I have to unplug the
>> device and plug it in again to get it recognized. I have included the
>> hack that fixed the problem on my machine. No time to write a real
>> fix. OpenBSD has gone about it the right way (I think) but I had
>> already solved the problem when I looked at their sources.
>
> Just curious, how has OpenBSD solved the problem?
>
>
Same thing I did - delaying usb1 until usb2 is ready - but cleaner
implementation. There might be a better way of solving the problem.
I'll just paste the relevant code here... the parts with the tsleep
and wakeup. The fix looked reasonable to me and when I installed
OpenBSD and tested it the usb mouse worked as expected.
-luasi
--------------------------------------------------------------------------------------------------
void
usb_event_thread(void *arg)
{
struct usb_softc *sc = arg;
int pwrdly;
DPRINTF(("usb_event_thread: start\n"));
/* Wait for power to come good. */
pwrdly = sc->sc_bus->root_hub->hub->hubdesc.bPwrOn2PwrGood *
UHD_PWRON_FACTOR + USB_EXTRA_POWER_UP_TIME;
usb_delay_ms(sc->sc_bus, pwrdly);
/* USB1 threads wait for USB2 threads to finish their first probe. */
while (sc->sc_bus->usbrev != USBREV_2_0 && threads_pending)
(void)tsleep((void *)&threads_pending, PWAIT, "config", 0);
/* Make sure first discover does something. */
sc->sc_bus->needs_explore = 1;
usb_discover(sc);
config_pending_decr();
/* Wake up any companions waiting for handover before their probes. */
if (sc->sc_bus->usbrev == USBREV_2_0) {
threads_pending--;
wakeup((void *)&threads_pending);
}
.................
Home |
Main Index |
Thread Index |
Old Index