NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/48237: NetBSD 6.1 failed to detect USB 1.x full-speed device (umodem)
The following reply was made to PR kern/48237; it has been noted by GNATS.
From: Wolfgang Stukenbrock <wolfgang.stukenbrock%nagler-company.com@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: kern-bug-people%NetBSD.org@localhost, gnats-admin%NetBSD.org@localhost,
netbsd-bugs%NetBSD.org@localhost
Subject: Re: kern/48237: NetBSD 6.1 failed to detect USB 1.x full-speed device
(umodem)
Date: Wed, 25 Sep 2013 11:01:19 +0200
This is a multi-part message in MIME format.
--------------010806070309050602060802
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Hi,
I've added the mentioned changes.
This means the usb_memsync call changes (and some other minor things like
USB_USE_SOFTINTR elimination etc.)
My base version is the 1.212 for uhci.c from the release tree.
So I've not added the switch to use the mutex-stuff and/or the
MP-related changes.
(remark: the system I'm trying to get it up again is a i386 Celeron
system. But the problem is also present on amd64 architecture.)
Accedently patching ehci.c and uhci.c with the addresses changes does
not change a lot.
For better explanation some debug-output I've added to the code.
(The "--- status" line is in uhci_idone() for each status extracted in
the "non-ISO"-loop.)
With 64-Byte initial transfer and first setting Address (2) to the device:
ehci0: handing over full speed device on port 4 to uhci1
usbd_new_device bus=0xc168e00c port=2 depth=1 speed=2
usbd_new_device: myhsport = NULL
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x38000007
uhci_idone: actlen=8, status=0x0
usbd_new_device: addr=2, getting first desc done
usbd_new_device: adding unit addr=2, rev=100, class=2, subclass=0,
protocol=0, maxpacket=8, len=18, speed=2
usbd_new_device: setting device address=2
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x190007ff
uhci_idone: actlen=0, status=0x0
usbd_get_device_desc:
usbd_get_desc: type=1, index=0, len=18
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x450007
uhci_idone: actlen=0, status=0x400000
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x450007
uhci_idone: actlen=0, status=0x400000
usbd_new_device: addr=2, getting full desc failed
usbd_remove_device: 0xc1fc6b8c
uhub1: device problem, disabling port 2
The initial retrieval of the description (8 Bytes) seems to work.
Setting Address = 2 seems to work too.
But trying to get the description (18 Bytes again) funs immediately int
STALLED (0x500000 in the status)
Trying "the same with address setting and descrition retrival in the
order as done in 5.1.2 (still with 64-Bytes initial request:)
ehci0: handing over full speed device on port 4 to uhci1
usbd_new_device bus=0xc168e00c port=2 depth=1 speed=2
usbd_new_device: myhsport = NULL
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x38000007
uhci_idone: actlen=8, status=0x0
ini-desc 0 actlen 8
usbd_new_device: addr=2, getting first desc done
usbd_new_device: adding unit addr=2, rev=100, class=2, subclass=0,
protocol=0, maxpacket=8, len=18, speed=2
usbd_get_device_desc:
usbd_get_desc: type=1, index=0, len=18
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x18000007
---- status 0x18000007
---- status 0x18500001
uhci_idone: actlen=18, status=0x500000
usbd_new_device: addr=2, getting full desc failed
usbd_remove_device: 0xc1fbeb8c
uhub1: device problem, disabling port 2
It looks like the 18 Bytes are transfered, but then it still gets
STALLED ?!?!?!?!? Why? Are more bytes expected?
And now with 8 Bytes initial request:
ehci0: handing over full speed device on port 4 to uhci1
usbd_new_device bus=0xc168e00c port=2 depth=1 speed=2
usbd_new_device: myhsport = NULL
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x38000007
---- status 0x38000007
---- status 0x38000001
uhci_idone: actlen=18, status=0x0
usbd_new_device: addr=2, getting first desc done
usbd_new_device: adding unit addr=2, rev=100, class=2, subclass=0,
protocol=0, maxpacket=8, len=18, speed=2
usbd_get_device_desc:
usbd_get_desc: type=1, index=0, len=18
uhci_idone: ii=0xc1753e98
uhci_idone: ii=0xc1753e98, xfer=0xc1753e1c, pipe=0xc17254ec ready
---- status 0x18000007
---- status 0x180007ff
---- status 0x18000007
---- status 0x18500001
uhci_idone: actlen=10, status=0x500000
usbd_new_device: addr=2, getting full desc failed
usbd_remove_device: 0xc1fd858c
uhub1: device problem, disabling port 2
Here we already got 18 bytes the first time and then only 10 bytes -
does the initial transfer size affect this transfer ??? Why do we get
more data???
The sequence - with slitly different printf's in the code on a 5.1.2
system (amd64 this time - no additional i386 system for testing
currently available.) Here we get the communication up and running with
the same HW-device ...
usbd_get_desc: type=1, index=0, len=8
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff80000907b900 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x190007ff
uhci_idone: actlen=8, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=8
usbd_get_device_desc:
usbd_get_desc: type=1, index=0, len=18
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff80000907b900 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000001
--- status 0x190007ff
uhci_idone: actlen=18, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=18
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff80000907b900 ready
--- status 0x18000007
--- status 0x190007ff
uhci_idone: actlen=0, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=0
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=2, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=2
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000005
--- status 0x190007ff
uhci_idone: actlen=6, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=6
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=2, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=2
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000003
--- status 0x190007ff
uhci_idone: actlen=52, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=52
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=2, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=2
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=34, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=34
usbd_get_config_desc: confidx=0
usbd_get_desc: type=2, index=0, len=9
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000000
--- status 0x190007ff
uhci_idone: actlen=9, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=9
usbd_get_desc: type=2, index=0, len=41
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000000
--- status 0x190007ff
uhci_idone: actlen=41, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=41
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x190007ff
uhci_idone: actlen=0, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=0
usbd_get_config_desc: confidx=1
usbd_get_desc: type=2, index=1, len=9
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000000
--- status 0x190007ff
uhci_idone: actlen=9, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=9
usbd_get_desc: type=2, index=1, len=62
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000005
--- status 0x190007ff
uhci_idone: actlen=62, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=62
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x190007ff
uhci_idone: actlen=0, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=0
usbd_get_config_desc: confidx=0
usbd_get_desc: type=2, index=0, len=9
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000000
--- status 0x190007ff
uhci_idone: actlen=9, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=9
usbd_get_desc: type=2, index=0, len=41
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000007
--- status 0x18000000
--- status 0x190007ff
uhci_idone: actlen=41, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=41
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x190007ff
uhci_idone: actlen=0, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=0
ugen0 at uhub4 port 1ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=2, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=2
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000003
--- status 0x190007ff
uhci_idone: actlen=52, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=52
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=2, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=2
ctrltrans - 0xffff800007f9ba00
--- start timeout 5000
uhci_idone: ii=0xffff800007f9bae0
uhci_idone: ii=0xffff800007f9bae0, xfer=0xffff800007f9ba00,
pipe=0xffff800008448e00 ready
--- status 0x18000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000007
--- status 0x38000001
--- status 0x190007ff
uhci_idone: actlen=34, status=0x0
ctrl-done 0xffff800007f9ba00
uhci_device_ctrl_done: length=34
ugen0: Lucent Technologies, Inc. ELSA Modem Board, rev 1.00/1.00, addr 2
remark: on this system umodem is not configured, so the device dropped
into ugen, but the problem happnes during the first transfers while
getting the device description.
Help !!!
Any additional idea what may be wrong?
I add the applied diffs as attachments, but they look good for me.
Nick Hudson wrote:
> The following reply was made to PR kern/48237; it has been noted by GNATS.
>
> From: Nick Hudson <skrll%netbsd.org@localhost>
> To: gnats-bugs%NetBSD.org@localhost
> Cc: Wolfgang.Stukenbrock%nagler-company.com@localhost,
> kern-bug-people%netbsd.org@localhost,
> gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
> Subject: Re: kern/48237: NetBSD 6.1 failed to detect USB 1.x full-speed
> device
> (umodem)
> Date: Tue, 24 Sep 2013 16:32:12 +0100
>
> On 09/24/13 11:35, Wolfgang.Stukenbrock%nagler-company.com@localhost wrote:
> >> Number: 48237
> >> Category: kern
> >> Synopsis: NetBSD 6.1 failed to detect USB 1.x full-speed device
> (umodem)
> >>
>
> Try applying the changes in
>
> http://releng.netbsd.org/cgi-bin/req-6.cgi?show=950
>
> to your netbsd-6 tree.
>
> Nick
>
--------------010806070309050602060802
Content-Type: text/plain;
name="ehci.c-diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="ehci.c-diff"
--- ehci.c 2013/09/25 07:04:36 1.1
+++ ehci.c 2013/09/25 08:05:41
@@ -709,12 +709,10 @@
callout_reset(&(sc->sc_tmo_intrlist),
(hz), (ehci_intrlist_timeout), (sc));
-#ifdef USB_USE_SOFTINTR
if (sc->sc_softwake) {
sc->sc_softwake = 0;
wakeup(&sc->sc_softwake);
}
-#endif /* USB_USE_SOFTINTR */
sc->sc_bus.intr_context--;
}
@@ -763,7 +761,11 @@
lsqtd->offs + offsetof(ehci_qtd_t, qtd_status),
sizeof(lsqtd->qtd.qtd_status),
BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
- if (le32toh(lsqtd->qtd.qtd_status) & EHCI_QTD_ACTIVE) {
+ status = le32toh(lsqtd->qtd.qtd_status);
+ usb_syncmem(&lsqtd->dma,
+ lsqtd->offs + offsetof(ehci_qtd_t, qtd_status),
+ sizeof(lsqtd->qtd.qtd_status), BUS_DMASYNC_PREREAD);
+ if (status & EHCI_QTD_ACTIVE) {
DPRINTFN(12, ("ehci_check_intr: active ex=%p\n", ex));
for (sqtd = ex->sqtdstart; sqtd != lsqtd; sqtd=sqtd->nextqtd) {
usb_syncmem(&sqtd->dma,
@@ -786,9 +788,6 @@
}
DPRINTFN(12, ("ehci_check_intr: ex=%p std=%p still active\n",
ex, ex->sqtdstart));
- usb_syncmem(&lsqtd->dma,
- lsqtd->offs + offsetof(ehci_qtd_t, qtd_status),
- sizeof(lsqtd->qtd.qtd_status), BUS_DMASYNC_PREREAD);
return;
}
done:
@@ -1730,8 +1729,6 @@
Static void
ehci_add_qh(ehci_soft_qh_t *sqh, ehci_soft_qh_t *head)
{
- SPLUSBCHECK;
-
usb_syncmem(&head->dma, head->offs + offsetof(ehci_qh_t, qh_link),
sizeof(head->qh.qh_link), BUS_DMASYNC_POSTWRITE);
sqh->next = head->next;
@@ -1759,7 +1756,6 @@
{
ehci_soft_qh_t *p;
- SPLUSBCHECK;
/* XXX */
for (p = head; p != NULL && p->next != sqh; p = p->next)
;
@@ -2723,14 +2719,14 @@
ehci_physaddr_t a = dataphys + i * EHCI_PAGE_SIZE;
if (i != 0) /* use offset only in first buffer */
a = EHCI_PAGE(a);
- cur->qtd.qtd_buffer[i] = htole32(a);
- cur->qtd.qtd_buffer_hi[i] = 0;
-#ifdef DIAGNOSTIC
if (i >= EHCI_QTD_NBUFFERS) {
+#ifdef DIAGNOSTIC
printf("ehci_alloc_sqtd_chain: i=%d\n", i);
+#endif
goto nomem;
}
-#endif
+ cur->qtd.qtd_buffer[i] = htole32(a);
+ cur->qtd.qtd_buffer_hi[i] = 0;
}
cur->nextqtd = next;
cur->qtd.qtd_next = cur->qtd.qtd_altnext = nextphys;
@@ -2982,13 +2978,9 @@
*/
ehci_sync_hc(sc);
s = splusb();
-#ifdef USB_USE_SOFTINTR
sc->sc_softwake = 1;
-#endif /* USB_USE_SOFTINTR */
usb_schedsoftintr(&sc->sc_bus);
-#ifdef USB_USE_SOFTINTR
tsleep(&sc->sc_softwake, PZERO, "ehciab", 0);
-#endif /* USB_USE_SOFTINTR */
splx(s);
/*
@@ -3111,13 +3103,9 @@
splx(s);
s = splusb();
-#ifdef USB_USE_SOFTINTR
sc->sc_softwake = 1;
-#endif /* USB_USE_SOFTINTR */
usb_schedsoftintr(&sc->sc_bus);
-#ifdef USB_USE_SOFTINTR
tsleep(&sc->sc_softwake, PZERO, "ehciab", 0);
-#endif /* USB_USE_SOFTINTR */
splx(s);
#ifdef DIAGNOSTIC
--------------010806070309050602060802
Content-Type: text/plain;
name="uhci.c-diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="uhci.c-diff"
--- uhci.c 2013/09/25 07:38:39 1.1
+++ uhci.c 2013/09/25 08:07:25
@@ -1076,8 +1076,6 @@
{
uhci_soft_qh_t *eqh;
- SPLUSBCHECK;
-
DPRINTFN(10, ("uhci_add_ctrl: sqh=%p\n", sqh));
eqh = sc->sc_hctl_end;
usb_syncmem(&eqh->dma, eqh->offs + offsetof(uhci_qh_t, qh_hlink),
@@ -1103,8 +1101,6 @@
{
uhci_soft_qh_t *pqh;
- SPLUSBCHECK;
-
DPRINTFN(10, ("uhci_remove_hs_ctrl: sqh=%p\n", sqh));
#ifdef UHCI_CTL_LOOP
uhci_rem_loop(sc);
@@ -1153,8 +1149,6 @@
{
uhci_soft_qh_t *eqh;
- SPLUSBCHECK;
-
DPRINTFN(10, ("uhci_add_ls_ctrl: sqh=%p\n", sqh));
eqh = sc->sc_lctl_end;
usb_syncmem(&eqh->dma, eqh->offs + offsetof(uhci_qh_t, qh_hlink),
@@ -1175,15 +1169,17 @@
uhci_remove_ls_ctrl(uhci_softc_t *sc, uhci_soft_qh_t *sqh)
{
uhci_soft_qh_t *pqh;
-
- SPLUSBCHECK;
+ uint32_t elink;
DPRINTFN(10, ("uhci_remove_ls_ctrl: sqh=%p\n", sqh));
/* See comment in uhci_remove_hs_ctrl() */
usb_syncmem(&sqh->dma, sqh->offs + offsetof(uhci_qh_t, qh_elink),
sizeof(sqh->qh.qh_elink),
BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
- if (!(sqh->qh.qh_elink & htole32(UHCI_PTR_T))) {
+ elink = le32toh(sqh->qh.qh_elink);
+ usb_syncmem(&sqh->dma, sqh->offs + offsetof(uhci_qh_t, qh_elink),
+ sizeof(sqh->qh.qh_elink), BUS_DMASYNC_PREREAD);
+ if (!(elink & UHCI_PTR_T)) {
sqh->qh.qh_elink = htole32(UHCI_PTR_T);
usb_syncmem(&sqh->dma,
sqh->offs + offsetof(uhci_qh_t, qh_elink),
@@ -1210,8 +1206,6 @@
{
uhci_soft_qh_t *eqh;
- SPLUSBCHECK;
-
DPRINTFN(10, ("uhci_add_bulk: sqh=%p\n", sqh));
eqh = sc->sc_bulk_end;
usb_syncmem(&eqh->dma, eqh->offs + offsetof(uhci_qh_t, qh_hlink),
@@ -1234,8 +1228,6 @@
{
uhci_soft_qh_t *pqh;
- SPLUSBCHECK;
-
DPRINTFN(10, ("uhci_remove_bulk: sqh=%p\n", sqh));
uhci_rem_loop(sc);
/* See comment in uhci_remove_hs_ctrl() */
@@ -1382,12 +1374,10 @@
uhci_check_intr(sc, ii);
}
-#ifdef USB_USE_SOFTINTR
if (sc->sc_softwake) {
sc->sc_softwake = 0;
wakeup(&sc->sc_softwake);
}
-#endif /* USB_USE_SOFTINTR */
sc->sc_bus.intr_context--;
}
@@ -1430,7 +1420,12 @@
lstd->offs + offsetof(uhci_td_t, td_status),
sizeof(lstd->td.td_status),
BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
- if (le32toh(lstd->td.td_status) & UHCI_TD_ACTIVE) {
+ status = le32toh(lstd->td.td_status);
+ usb_syncmem(&lstd->dma,
+ lstd->offs + offsetof(uhci_td_t, td_status),
+ sizeof(lstd->td.td_status),
+ BUS_DMASYNC_PREREAD);
+ if (status & UHCI_TD_ACTIVE) {
DPRINTFN(12, ("uhci_check_intr: active ii=%p\n", ii));
for (std = ii->stdstart; std != lstd; std = std->link.std) {
usb_syncmem(&std->dma,
@@ -1459,10 +1454,6 @@
}
DPRINTFN(12, ("uhci_check_intr: ii=%p std=%p still active\n",
ii, ii->stdstart));
- usb_syncmem(&lstd->dma,
- lstd->offs + offsetof(uhci_td_t, td_status),
- sizeof(lstd->td.td_status),
- BUS_DMASYNC_PREREAD);
return;
}
done:
@@ -1830,6 +1821,7 @@
uhci_soft_td_t *stdend)
{
uhci_soft_td_t *p;
+ uint32_t td_link;
/*
* to avoid race condition with the controller which may be looking
@@ -1841,8 +1833,13 @@
p->offs + offsetof(uhci_td_t, td_link),
sizeof(p->td.td_link),
BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
- if ((p->td.td_link & UHCI_PTR_T) == 0) {
- p->td.td_link = UHCI_PTR_T;
+ td_link = le32toh(p->td.td_link);
+ usb_syncmem(&p->dma,
+ p->offs + offsetof(uhci_td_t, td_link),
+ sizeof(p->td.td_link),
+ BUS_DMASYNC_PREREAD);
+ if ((td_link & UHCI_PTR_T) == 0) {
+ p->td.td_link = htole32(UHCI_PTR_T);
usb_syncmem(&p->dma,
p->offs + offsetof(uhci_td_t, td_link),
sizeof(p->td.td_link),
@@ -2142,14 +2139,10 @@
*/
usb_delay_ms(upipe->pipe.device->bus, 2); /* Hardware finishes in 1ms */
s = splusb();
-#ifdef USB_USE_SOFTINTR
sc->sc_softwake = 1;
-#endif /* USB_USE_SOFTINTR */
usb_schedsoftintr(&sc->sc_bus);
-#ifdef USB_USE_SOFTINTR
DPRINTFN(1,("uhci_abort_xfer: tsleep\n"));
tsleep(&sc->sc_softwake, PZERO, "uhciab", 0);
-#endif /* USB_USE_SOFTINTR */
splx(s);
/*
--------------010806070309050602060802--
Home |
Main Index |
Thread Index |
Old Index