Thu Mar 24 15:30:17 2016 UTC ()
Wait for hardware before removing the TDs from the hash lists.

This is all a bit racey and should be revisited.


(skrll)
diff -r1.254.2.59 -r1.254.2.60 src/sys/dev/usb/ohci.c

cvs diff -r1.254.2.59 -r1.254.2.60 src/sys/dev/usb/ohci.c (expand / switch to unified diff)

--- src/sys/dev/usb/ohci.c 2016/03/17 09:04:53 1.254.2.59
+++ src/sys/dev/usb/ohci.c 2016/03/24 15:30:17 1.254.2.60
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: ohci.c,v 1.254.2.59 2016/03/17 09:04:53 skrll Exp $ */ 1/* $NetBSD: ohci.c,v 1.254.2.60 2016/03/24 15:30:17 skrll Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1998, 2004, 2005, 2012 The NetBSD Foundation, Inc. 4 * Copyright (c) 1998, 2004, 2005, 2012 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Lennart Augustsson (lennart@augustsson.net) at 8 * by Lennart Augustsson (lennart@augustsson.net) at
9 * Carlstedt Research & Technology, Jared D. McNeill (jmcneill@invisible.ca) 9 * Carlstedt Research & Technology, Jared D. McNeill (jmcneill@invisible.ca)
10 * and Matthew R. Green (mrg@eterna.com.au). 10 * and Matthew R. Green (mrg@eterna.com.au).
11 * This code is derived from software contributed to The NetBSD Foundation 11 * This code is derived from software contributed to The NetBSD Foundation
12 * by Charles M. Hannum. 12 * by Charles M. Hannum.
13 * 13 *
14 * Redistribution and use in source and binary forms, with or without 14 * Redistribution and use in source and binary forms, with or without
@@ -31,27 +31,27 @@ @@ -31,27 +31,27 @@
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE. 33 * POSSIBILITY OF SUCH DAMAGE.
34 */ 34 */
35 35
36/* 36/*
37 * USB Open Host Controller driver. 37 * USB Open Host Controller driver.
38 * 38 *
39 * OHCI spec: http://www.compaq.com/productinfo/development/openhci.html 39 * OHCI spec: http://www.compaq.com/productinfo/development/openhci.html
40 * USB spec: http://www.usb.org/developers/docs/ 40 * USB spec: http://www.usb.org/developers/docs/
41 */ 41 */
42 42
43#include <sys/cdefs.h> 43#include <sys/cdefs.h>
44__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.254.2.59 2016/03/17 09:04:53 skrll Exp $"); 44__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.254.2.60 2016/03/24 15:30:17 skrll Exp $");
45 45
46#include "opt_usb.h" 46#include "opt_usb.h"
47 47
48#include <sys/param.h> 48#include <sys/param.h>
49 49
50#include <sys/cpu.h> 50#include <sys/cpu.h>
51#include <sys/device.h> 51#include <sys/device.h>
52#include <sys/kernel.h> 52#include <sys/kernel.h>
53#include <sys/kmem.h> 53#include <sys/kmem.h>
54#include <sys/proc.h> 54#include <sys/proc.h>
55#include <sys/queue.h> 55#include <sys/queue.h>
56#include <sys/select.h> 56#include <sys/select.h>
57#include <sys/sysctl.h> 57#include <sys/sysctl.h>
@@ -3718,36 +3718,36 @@ ohci_device_isoc_abort(struct usbd_xfer  @@ -3718,36 +3718,36 @@ ohci_device_isoc_abort(struct usbd_xfer
3718 xfer->ux_status = USBD_CANCELLED; 3718 xfer->ux_status = USBD_CANCELLED;
3719 3719
3720 sed = opipe->sed; 3720 sed = opipe->sed;
3721 usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed), 3721 usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed),
3722 BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); 3722 BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
3723 sed->ed.ed_flags |= HTOO32(OHCI_ED_SKIP); /* force hardware skip */ 3723 sed->ed.ed_flags |= HTOO32(OHCI_ED_SKIP); /* force hardware skip */
3724 usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_flags), 3724 usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_flags),
3725 sizeof(sed->ed.ed_flags), 3725 sizeof(sed->ed.ed_flags),
3726 BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 3726 BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
3727 3727
3728 sitd = xfer->ux_hcpriv; 3728 sitd = xfer->ux_hcpriv;
3729 KASSERT(sitd); 3729 KASSERT(sitd);
3730 3730
 3731 usb_delay_ms_locked(&sc->sc_bus, OHCI_ITD_NOFFSET, &sc->sc_lock);
 3732
3731 for (; sitd->xfer == xfer; sitd = sitd->nextitd) { 3733 for (; sitd->xfer == xfer; sitd = sitd->nextitd) {
3732 ohci_hash_rem_itd(sc, sitd); 3734 ohci_hash_rem_itd(sc, sitd);
3733#ifdef DIAGNOSTIC 3735#ifdef DIAGNOSTIC
3734 DPRINTFN(1, "abort sets done sitd=%p", sitd, 0, 0, 0); 3736 DPRINTFN(1, "abort sets done sitd=%p", sitd, 0, 0, 0);
3735 sitd->isdone = true; 3737 sitd->isdone = true;
3736#endif 3738#endif
3737 } 3739 }
3738 3740
3739 usb_delay_ms_locked(&sc->sc_bus, OHCI_ITD_NOFFSET, &sc->sc_lock); 
3740 
3741 /* Run callback. */ 3741 /* Run callback. */
3742 usb_transfer_complete(xfer); 3742 usb_transfer_complete(xfer);
3743 3743
3744 sed->ed.ed_headp = HTOO32(sitd->physaddr); /* unlink TDs */ 3744 sed->ed.ed_headp = HTOO32(sitd->physaddr); /* unlink TDs */
3745 sed->ed.ed_flags &= HTOO32(~OHCI_ED_SKIP); /* remove hardware skip */ 3745 sed->ed.ed_flags &= HTOO32(~OHCI_ED_SKIP); /* remove hardware skip */
3746 usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed), 3746 usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed),
3747 BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); 3747 BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
3748 3748
3749 done: 3749 done:
3750 KASSERT(mutex_owned(&sc->sc_lock)); 3750 KASSERT(mutex_owned(&sc->sc_lock));
3751} 3751}
3752 3752
3753void 3753void