Commit Graph

144 Commits

Author SHA1 Message Date
iedowse
3e514b9f37 Attempt to fix a number of race conditions in the handling of
transfer timeouts that typically cause a transfer to be completed
twice, resulting in panics and page faults:

 o A transfer completion interrupt could arrive while an abort_task
   event was set up, so the transfer would be aborted after it had
   completed. This is very easy to reproduce. Fix this by setting
   the transfer status to USBD_TIMEOUT before scheduling the
   abort_task so that the transfer completion code will ignore it.

 o The transfer completion code could execute concurrently with the
   timeout callout, leaving the callout blocked (e.g. waiting for
   Giant) while the transfer completion code runs. In this case,
   callout_stop() does not prevent the callout from running, so
   again the timeout code would run after the transfer was complete.
   Handle this case by checking the return value from callout_stop(),
   and ignoring the transfer if the callout could not be removed.

 o Finally, protect against a timeout callout occurring while a
   transfer is being aborted by another process. Here we arrange
   for the timeout processing to ignore the transfer, and use
   callout_drain() to ensure that the callout has really gone before
   completing the transfer.

This was tested by repeatedly performing USB transfers with a timeout
set to approximately the same as the normal transfer completion
time. In the PR below, apparently this occurred by accident with a
particular printer and the default timeout.

PR:		kern/71491
2004-11-09 20:51:32 +00:00
iedowse
4d8c7e2781 Make the USB subsystem unloadable and detachable, though currently
a significant amount of memory may be leaked each time a host
controller is detached.
2004-08-02 15:37:35 +00:00
le
21a36330b4 MFNetBSD.
ohci.c (1.147), author: mycroft
   Failure to properly mask off UE_DIR_IN from the endpoint address
   was causing OHCI_ED_FORMAT_ISO and EHCI_QH_HRECL to get set
   spuriously, causing rather interesting lossage.

   Suddenly I get MUCH better performance with ehci...

ohci.c (1.148), author: mycroft
   Adjust a couple of comments to make it clear WTF is going on.

Obtained from:   NetBSD
2004-06-26 09:19:31 +00:00
julian
714a4cc72b MFNetBSD Version 1.146
various probing and attaching tweeks.

Submitted by:	Rudolf Cejka <cejkar@fit.vutbr.cz>

Obtained from:	NetBSD
MFC after: 3 days
2004-03-26 18:56:58 +00:00
shiba
11d4c5569b Fixed incomplete initialization in some ohci controllers with
broken BIOS. Separate ohci_controller_init() from ohci_init(),
and call ohci_controller_init() at resume process once more.

Discussed on [bsd-nomads:16737] - [bsd-nomads:16746].

Submitted by Hiroyuki Aizu <eyes@navi.org> [bsd-nomads:16741]
2003-12-22 15:40:10 +00:00
shiba
8eac066005 Enable support for DEVICE_SUSPEND, DEVICE_RESUME and DEVICE_SHUTDOWN
methods for USB devices in the same way of uhci driver. But this change
is not complete because some ohci controlers are not initialized completely.
So "kernel: usb0: 1 scheduling overruns" interrupt will generate many times.

This change will be same one in PR kern/60099.

Discussed on [bsd-nomads:16737] - [bsd-nomads:16746].
2003-12-22 15:18:46 +00:00
iedowse
36326ca6de Write the correct value to `td_be' for the second and further
transfer descriptors when a large request needs to be split into
more than one 8k chunk. The bug was that the calculation did not
take into account the offset of the chunk within the overall request.
This is reported to fix crashes and data corruption on ohci
controllers.

Submitted by:	green
Approved by:	re
2003-11-25 02:23:29 +00:00
joe
f7ba36e992 Remove a gremlin so that this code compiles under -stable without
a "syntax error before `struct'" error.
2003-11-12 01:40:11 +00:00
joe
f6f94ac7fc MFNetBSD:
date: 2003/10/18 04:50:35;  author: simonb
    Remove assigned-to but otherwise unused variables.
    Remove unreachable break after return statements.
2003-11-10 00:20:52 +00:00
joe
28ba6b05d3 MFNetBSD:
revision 1.142
    date: 2003/10/11 03:04:26;  author: toshii
    Fix a done list handling bug which exhibits under high shared
    interrupt rate and bus traffic.  As the interrupt register is
    read after checking hcca_done_head, there was a small chance
    of dropping a done list.  Ignore OHCI_WDH interrupt bit if
    hcca_done_head is zero so that OHCI_WDH is processed later.
2003-11-10 00:16:36 +00:00
joe
9313579fa7 MFNetBSD:
revision 1.141
    date: 2003/09/10 20:08:29;  author: mycroft;
    Update actlen even in the case where a TD returns an error --
    this is critical for the umass bulk-only STALL case.
2003-11-10 00:12:39 +00:00
joe
d29dc15237 Revise the NetBSD revision control strings. 2003-11-09 23:56:19 +00:00
joe
59ab76006a MFNetBSD:
- remove the unnecessary elm arg from SIMPLEQ_REMOVE_HEAD().
  this mirrors the functionality of SLIST_REMOVE_HEAD() (the other
  singly-linked list type) and FreeBSD's STAILQ_REMOVE_HEAD()
2003-11-09 23:54:21 +00:00
obrien
c63dab466c Use __FBSDID().
Also some minor style cleanups.
2003-08-24 17:55:58 +00:00
jmg
32a9aeec73 fix support for umass and related devices on ohci. This is a partial
sync of the NetBSD code.

fix isochornous support for ohci.  This gets webcams like my OV511
working on sparc64.

PR:		kern/52589
Submitted by:	Bruce R. Montague (isochonous support)
Reviewed by:	joe among others
2003-07-15 23:12:54 +00:00
jmg
233167166c make usb bus_dma aware.
Reviewed by:	joe among others
2003-07-15 22:42:37 +00:00
jmg
0853c5dd33 minor white space fix up
initalize itds
remove extra htole32.  Things don't work to well when you do
htole32(htole32(var))
2003-07-15 22:14:22 +00:00
joe
be9308fc79 Backout the last commit!
MFNetBSD: revision 1.137
    date: 2003/01/20 07:12:13;  author: simonb;
    Grrr.  So much for my ability to use grep(1) effectively.  Pointed out
    by Stephen Degler in private mail.
2003-07-14 19:56:32 +00:00
joe
9a4aac25da MFNetBSD: revision 1.136
date: 2003/01/20 05:30:09;  author: simonb;
    The Double-Semi-Colon Police.
2003-07-14 19:54:21 +00:00
joe
172b66d2d6 MFNetBSD: revision 1.135
date: 2002/12/10 14:07:37;  author: toshii;  state: Exp;  lines: +6 -6
    Add a couple of le32toh which were missing in the previous.
    Pointed out by SOMEYA Yoshihiko.
2003-07-14 19:51:53 +00:00
joe
0d823209d1 MFNetBSD: revision 1.134
date: 2002/12/07 07:33:20;  author: toshii;  state: Exp;  lines: +50 -29
    Update xfer->frlengths for input isoc transfer.  Based on patches from
    SOMEYA Yoshihiko.
    Also fix error handling for isoc transfer somewhat; usb_transfer_complete
    shouldn't be called for more than once.
2003-07-14 19:50:06 +00:00
joe
51cf62b692 MFNetBSD: revision 1.133
date: 2002/12/07 07:14:28;  author: toshii;
    Fix several nits.  Mostly from SOMEYA Yoshihiko.
    - Call usbd_transfer_complete at splusb.
    - Fix a botched for loop in ohci_rem_ed.
    - In ohci_close_pipe, wait 1ms after removing an ED to avoid possible race
     condition.

The splusb change is non-functional on FreeBSD.
The botched loop and race condition changes came from us.

This patch is non-functional.
2003-07-14 19:47:59 +00:00
joe
61d22fe684 MFNetBSD: revision 1.132
date: 2002/12/07 06:52:11;  author: toshii;
    Remove junk at the end of a DPRINTF.  From SOMEYA Yoshihiko.
2003-07-14 19:42:05 +00:00
joe
2cbef9b72c MFNetBSD: revision 1.129
date: 2002/09/29 20:58:25;  author: augustss;
    Add some spl calls to protect critical regions. From kern/18440,
    Takeshi Nakayama.

(No functional change on FreeBSD).
2003-07-14 19:39:16 +00:00
joe
eea8fa2022 MFNetBSD:
date: 2003/05/13 04:41:59;  author: gson;
    Function names printed in debug messages did not always match the
    actual name of the function.
2003-07-14 18:56:33 +00:00
joe
a1b0f530f5 MFNetBSD:
date: 2003/02/08 03:32:51;  author: ichiro;
    change URL pointers of USB[1,2] specification
2003-07-14 18:14:15 +00:00
jmg
f8681630d9 remove \n at end of panic strings. They are added by the call to panic.
This brings us more in line with Net/OpenBSD

Obtained from:	Net/OpenBSD
2003-07-04 23:11:13 +00:00
shiba
6b05eb1b3f Fixed an issue which transfer no packets in combination with aue driver.
Submitted by Hiroyuki Aizu <eyes@navi.org>
                (refer to [FreeBSD-users-jp 65061])
Tested by    Hiroharu Tamaru <tamaru@myn.rcast.u-tokyo.ac.jp>
                (refer to [bsd-usb:689])
2003-03-05 13:17:15 +00:00
dillon
5102bb345b Fix two bugs in the DMA chaining code for OHCI. The first bug is that
the dataphysend calculation could only possibly work if the virtual buffer
is also physically contiguous.  Calculate dataphysend by calculating the
ending virtual address first, then converting to a physical address.

The second bug applies only to NetBSD and OpenBSD and involves the curlen
calculation in the two-contiguous-physical-pages case (which we don't support).

Also cleanup the use of the OHIC_PAGE() macro on dataphysend and add a panic
if len goes negative (meaning we lost the physical page translation
representing the end of the buffer).

IMHO the dataphysend is still bokered since it might be misrepresented
by shared userland page mappings.  The whole section needs to be rewritten
to use the virtual address range.

MFC after:	3 days
2002-12-20 18:47:39 +00:00
joe
4e69cf34a4 MFNetBSD: (partial 1.133)
- In ohci_close_pipe, wait 1ms after removing an ED to avoid possible race
  condition.

Approved by:	re (rwatson)
2002-12-09 01:41:24 +00:00
joe
0732397245 MFNetBSD:
date: 2002/09/29 20:59:30;  author: augustss;  state: Exp;  lines: +2 -7
    Remove extra call to ohci_rem_ed().  From kern/18448, Takeshi Nakayama.

Approved by:	re (rwatson)
2002-12-09 01:39:32 +00:00
joe
be86fd2558 Don't corrupt the ED list whilst removing an entry.
Submitted by:	Bernd Walter <ticso@cicely8.cicely.de>
Approved by:	re (rwatson)
2002-12-09 00:55:50 +00:00
joe
9b80ac7383 In rev 1.51 of usb_port.h I switched over to using the USB_USE_SOFTINTR
code path to fix a bug in the non USB_USE_SOFTINTR path that caused
the usb bus to hang and generally misbehave when devices were unplugged.
In the process though it also reduced the throughput of usb devices because
of a less than optimal implementation under FreeBSD.

This commit fixes the non USB_USE_SOFTINTR code in uhci and ohci
so that it works again, and switches back to using this code path.

The uhci code has been tested, but the ohci code hasn't.  It's
essentially the same anyway and so I don't envisage any difficulties.

Code for uhci submitted by:	Maksim Yevmenkin <myevmenk@exodus.net>
2002-09-30 17:50:18 +00:00
joe
e8b4bb966f MFNetBSD:
revision 1.127
	date: 2002/08/07 20:03:19;  author: augustss;  lines: +4 -8
	Fix some braindead calls to free memory (only encountered
	under low memory conditions).  From OpenBSD.
2002-08-16 09:10:43 +00:00
joe
2925e337b8 Use the hw.usb sysctl tree instead of debug.usb.
Requested by:	imp
2002-08-08 12:05:51 +00:00
joe
9f844c45b8 Replace the FOO_DEBUG definitions with USB_DEBUG, and switch the
debugging levels to off by default.  Now that debug levels can be
tweaked by sysctl we don't need to go through hoops to get the
different usb parts to produce debug data.
2002-07-31 14:34:36 +00:00
joe
03e965b480 Get bored with hard coded debug level variables and introduce a debug.usb
sysctl tree for tweaking them real-time.

Reviewed by:	iedowse
2002-07-31 13:33:55 +00:00
joe
b02de3a56c NetBSD have adopted our usage of the DMAADDR macro:
date: 2002/05/28 12:42:39;  author: augustss;
    Change DMAADDR macro slightly.

Update the $NetBSD$ tags to reflect this and make slight changes to
usb_mem.h so that we're in sync with each other.
2002-05-28 20:51:43 +00:00
joe
334090e937 Correct the usage of DMAADDR in a piece of '#if 0'd code. (The compiler
didn't pick it up.)
2002-05-26 22:13:09 +00:00
joe
514cd97aa3 MFNetBSD:
revision 1.124
    date: 2002/05/26 03:10:02;  author: minoura;  state: Exp;  lines: +3 -3
    Clear done_head in the HCCA *before* acknoledging the interrupt.
    Driver lost some completed transfers under heavy loads.
2002-05-26 22:11:34 +00:00
joe
7a6410c018 MFNetBSD: ohci.c (1.124), uhci.c (1.159), usbdi.c (1.100)
date: 2002/05/19 06:24:31;  author: augustss;  state: Exp;
    Update dma memory access API a little.

NetBSD have adopted our way of using the KERNADDR macro.  Update
the revision tags to show that we're in sync, and remove the casts
that they did in their adaptation.
2002-05-26 22:00:06 +00:00
joe
adc3315c17 Some non-functional changes to make the differences between NetBSD's
and our version clear to see.
2002-04-29 16:23:14 +00:00
mike
99e543a853 Move the new byte order function prototypes from <sys/param.h> to
<sys/endian.h>.  This puts us in line with NetBSD and OpenBSD.
2002-04-26 22:48:23 +00:00
joe
f7712cdcf5 Remove the overt differences between ours and NetBSD's version of this file. 2002-04-07 16:36:30 +00:00
joe
607521b72e Re-add the definitions of htole32(x) and le32toh(x) for OpenBSD. 2002-04-07 15:41:45 +00:00
joe
848ccc6bb4 MFNetBSD:
revision 1.121
    date: 2002/03/16 16:11:18;  author: tsutsui;  state: Exp;  lines: +4 -4
    Fix a couple of typo:
    - s/ehci/ohci/ (in unused arg of macro)
    - s/uhci/ohci/ (in debug message)
2002-04-07 15:18:00 +00:00
joe
942f573c8c MFNetBSD: ohci.c (1.119), ohcivar.h (1.30)
date: 2001/12/31 12:20:35;  author: augustss;
    Change xfer abort to wait for the softintr to run.
2002-04-07 15:16:31 +00:00
joe
4e8d2719f4 MFNetBSD:
revision 1.118
    date: 2001/12/27 18:48:28;  author: augustss;  state: Exp;  lines: +24 -5
    Add some DIAGNOSTIC stuf that I forgot.  From Nate Williams.
2002-04-07 15:12:07 +00:00
joe
8e37b24dea MFNetBSD:
revision 1.117
    date: 2001/12/27 11:27:11;  author: augustss;  state: Exp;  lines: +5 -3
    Update a comment.
2002-04-07 15:08:39 +00:00
joe
f8500fe758 MFNetBSD:
revision 1.116
    date: 2001/11/21 08:18:40;  author: augustss;  state: Exp;  lines: +30 -3
    Pay more attention to if the HC is being unplugged.
2002-04-07 15:07:23 +00:00