Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
8cacbeb0
Commit
8cacbeb0
authored
Aug 20, 2002
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Plain Diff
Merge kroah.com:/home/greg/linux/BK/bleeding_edge-2.5
into kroah.com:/home/greg/linux/BK/gregkh-2.5
parents
d17e9bb6
407ebedd
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
311 additions
and
248 deletions
+311
-248
drivers/usb/class/Makefile
drivers/usb/class/Makefile
+1
-1
drivers/usb/class/usblp.c
drivers/usb/class/usblp.c
+1
-1
drivers/usb/core/hcd.c
drivers/usb/core/hcd.c
+5
-7
drivers/usb/core/hcd.h
drivers/usb/core/hcd.h
+63
-2
drivers/usb/core/hub.c
drivers/usb/core/hub.c
+12
-13
drivers/usb/core/urb.c
drivers/usb/core/urb.c
+24
-23
drivers/usb/core/usb.c
drivers/usb/core/usb.c
+1
-55
drivers/usb/host/hc_sl811_rh.c
drivers/usb/host/hc_sl811_rh.c
+49
-1
drivers/usb/host/uhci-hcd.h
drivers/usb/host/uhci-hcd.h
+3
-0
drivers/usb/media/konicawc.c
drivers/usb/media/konicawc.c
+32
-3
drivers/usb/media/usbvideo.c
drivers/usb/media/usbvideo.c
+55
-27
drivers/usb/media/usbvideo.h
drivers/usb/media/usbvideo.h
+15
-3
drivers/usb/serial/ipaq.h
drivers/usb/serial/ipaq.h
+1
-1
drivers/usb/storage/isd200.c
drivers/usb/storage/isd200.c
+17
-11
drivers/usb/storage/raw_bulk.c
drivers/usb/storage/raw_bulk.c
+12
-11
include/linux/usb.h
include/linux/usb.h
+20
-89
No files found.
drivers/usb/class/Makefile
View file @
8cacbeb0
...
...
@@ -7,7 +7,7 @@ obj-$(CONFIG_USB_ACM) += cdc-acm.o
obj-$(CONFIG_USB_AUDIO)
+=
audio.o
obj-$(CONFIG_USB_BLUETOOTH_TTY)
+=
bluetty.o
obj-$(CONFIG_USB_MIDI)
+=
usb-midi.o
obj-$(CONFIG_USB_PRINTER)
+=
printer
.o
obj-$(CONFIG_USB_PRINTER)
+=
usblp
.o
include
$(TOPDIR)/Rules.make
drivers/usb/class/
printer
.c
→
drivers/usb/class/
usblp
.c
View file @
8cacbeb0
/*
*
printer
.c Version 0.12
*
usblp
.c Version 0.12
*
* Copyright (c) 1999 Michael Gee <michael@linuxspecific.com>
* Copyright (c) 1999 Pavel Machek <pavel@suse.cz>
...
...
drivers/usb/core/hcd.c
View file @
8cacbeb0
...
...
@@ -289,7 +289,7 @@ static int rh_string (
// language ids
if
(
id
==
0
)
{
*
data
++
=
4
;
*
data
++
=
3
;
/* 4 bytes string data */
*
data
++
=
0
;
*
data
++
=
0
;
/* some language id
*/
*
data
++
=
0
x09
;
*
data
++
=
0x04
;
/* MSFT-speak for "en-us"
*/
return
4
;
// serial number
...
...
@@ -585,9 +585,7 @@ void usb_bus_init (struct usb_bus *bus)
{
memset
(
&
bus
->
devmap
,
0
,
sizeof
(
struct
usb_devmap
));
#ifdef DEVNUM_ROUND_ROBIN
bus
->
devnum_next
=
1
;
#endif
/* DEVNUM_ROUND_ROBIN */
bus
->
root_hub
=
NULL
;
bus
->
hcpriv
=
NULL
;
...
...
@@ -738,10 +736,10 @@ EXPORT_SYMBOL (usb_register_root_hub);
/*-------------------------------------------------------------------------*/
/**
* usb_calc_bus_time
:
approximate periodic transaction time in nanoseconds
* usb_calc_bus_time
-
approximate periodic transaction time in nanoseconds
* @speed: from dev->speed; USB_SPEED_{LOW,FULL,HIGH}
* @is_input: true iff the transaction sends data to the host
* @is
_is
oc: true for isochronous transactions, false for interrupt ones
* @isoc: true for isochronous transactions, false for interrupt ones
* @bytecount: how many bytes in the transaction.
*
* Returns approximate bus time in nanoseconds for a periodic transaction.
...
...
@@ -1286,8 +1284,8 @@ EXPORT_SYMBOL (usb_hcd_operations);
* This hands the URB from HCD to its USB device driver, using its
* completion function. The HCD has freed all per-urb resources
* (and is done using urb->hcpriv). It also released all HCD locks;
* the device driver won't cause
deadlocks if it resubmits this URB
,
*
and won't confuse things by modifying and resubmitting this one
.
* the device driver won't cause
problems if it frees, modifies
,
*
or resubmits this URB
.
* Bandwidth and other resources will be deallocated.
*
* HCDs must not use this for periodic URBs that are still scheduled
...
...
drivers/usb/core/hcd.h
View file @
8cacbeb0
...
...
@@ -19,6 +19,31 @@
#ifdef __KERNEL__
/* This file contains declarations of usbcore internals that are mostly
* used or exposed by Host Controller Drivers.
*/
/*
* USB Packet IDs (PIDs)
*/
#define USB_PID_UNDEF_0 0xf0
#define USB_PID_OUT 0xe1
#define USB_PID_ACK 0xd2
#define USB_PID_DATA0 0xc3
#define USB_PID_PING 0xb4
/* USB 2.0 */
#define USB_PID_SOF 0xa5
#define USB_PID_NYET 0x96
/* USB 2.0 */
#define USB_PID_DATA2 0x87
/* USB 2.0 */
#define USB_PID_SPLIT 0x78
/* USB 2.0 */
#define USB_PID_IN 0x69
#define USB_PID_NAK 0x5a
#define USB_PID_DATA1 0x4b
#define USB_PID_PREAMBLE 0x3c
/* Token mode */
#define USB_PID_ERR 0x3c
/* USB 2.0: handshake mode */
#define USB_PID_SETUP 0x2d
#define USB_PID_STALL 0x1e
#define USB_PID_MDATA 0x0f
/* USB 2.0 */
/*-------------------------------------------------------------------------*/
/*
...
...
@@ -234,13 +259,11 @@ extern int usb_new_device(struct usb_device *dev);
extern
void
usb_connect
(
struct
usb_device
*
dev
);
extern
void
usb_disconnect
(
struct
usb_device
**
);
#ifndef _LINUX_HUB_H
/* exported to hub driver ONLY to support usb_reset_device () */
extern
int
usb_get_configuration
(
struct
usb_device
*
dev
);
extern
void
usb_set_maxpacket
(
struct
usb_device
*
dev
);
extern
void
usb_destroy_configuration
(
struct
usb_device
*
dev
);
extern
int
usb_set_address
(
struct
usb_device
*
dev
);
#endif
/* _LINUX_HUB_H */
/*-------------------------------------------------------------------------*/
...
...
@@ -354,10 +377,48 @@ extern struct usb_interface *usb_ifnum_to_if (struct usb_device *dev,
extern
int
usb_find_interface_driver
(
struct
usb_device
*
dev
,
struct
usb_interface
*
interface
);
#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
#define usb_endpoint_out(ep_dir) (!((ep_dir) & USB_DIR_IN))
/* for probe/disconnect with correct module usage counting */
void
*
usb_bind_driver
(
struct
usb_driver
*
driver
,
struct
usb_interface
*
intf
);
void
usb_unbind_driver
(
struct
usb_device
*
device
,
struct
usb_interface
*
intf
);
extern
struct
list_head
usb_driver_list
;
/*
* USB device fs stuff
*/
#ifdef CONFIG_USB_DEVICEFS
/*
* these are expected to be called from the USB core/hub thread
* with the kernel lock held
*/
extern
void
usbfs_add_bus
(
struct
usb_bus
*
bus
);
extern
void
usbfs_remove_bus
(
struct
usb_bus
*
bus
);
extern
void
usbfs_add_device
(
struct
usb_device
*
dev
);
extern
void
usbfs_remove_device
(
struct
usb_device
*
dev
);
extern
void
usbfs_update_special
(
void
);
extern
int
usbfs_init
(
void
);
extern
void
usbfs_cleanup
(
void
);
#else
/* CONFIG_USB_DEVICEFS */
static
inline
void
usbfs_add_bus
(
struct
usb_bus
*
bus
)
{}
static
inline
void
usbfs_remove_bus
(
struct
usb_bus
*
bus
)
{}
static
inline
void
usbfs_add_device
(
struct
usb_device
*
dev
)
{}
static
inline
void
usbfs_remove_device
(
struct
usb_device
*
dev
)
{}
static
inline
void
usbfs_update_special
(
void
)
{}
static
inline
int
usbfs_init
(
void
)
{
return
0
;
}
static
inline
void
usbfs_cleanup
(
void
)
{
}
#endif
/* CONFIG_USB_DEVICEFS */
/*-------------------------------------------------------------------------*/
/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */
...
...
drivers/usb/core/hub.c
View file @
8cacbeb0
...
...
@@ -261,9 +261,8 @@ static int usb_hub_configure(struct usb_hub *hub,
{
struct
usb_device
*
dev
=
hub
->
dev
;
struct
usb_hub_status
hubstatus
;
char
portstr
[
USB_MAXCHILDREN
+
1
];
unsigned
int
pipe
;
int
i
,
maxp
,
ret
;
int
maxp
,
ret
;
hub
->
descriptor
=
kmalloc
(
sizeof
(
*
hub
->
descriptor
),
GFP_KERNEL
);
if
(
!
hub
->
descriptor
)
{
...
...
@@ -294,9 +293,17 @@ static int usb_hub_configure(struct usb_hub *hub,
le16_to_cpus
(
&
hub
->
descriptor
->
wHubCharacteristics
);
if
(
hub
->
descriptor
->
wHubCharacteristics
&
HUB_CHAR_COMPOUND
)
dbg
(
"part of a compound device"
);
else
if
(
hub
->
descriptor
->
wHubCharacteristics
&
HUB_CHAR_COMPOUND
)
{
int
i
;
char
portstr
[
USB_MAXCHILDREN
+
1
];
for
(
i
=
0
;
i
<
dev
->
maxchild
;
i
++
)
portstr
[
i
]
=
hub
->
descriptor
->
DeviceRemovable
[((
i
+
1
)
/
8
)]
&
(
1
<<
((
i
+
1
)
%
8
))
?
'F'
:
'R'
;
portstr
[
dev
->
maxchild
]
=
0
;
dbg
(
"compound device; port removable status: %s"
,
portstr
);
}
else
dbg
(
"standalone hub"
);
switch
(
hub
->
descriptor
->
wHubCharacteristics
&
HUB_CHAR_LPSM
)
{
...
...
@@ -371,14 +378,6 @@ static int usb_hub_configure(struct usb_hub *hub,
dbg
(
"hub controller current requirement: %dmA"
,
hub
->
descriptor
->
bHubContrCurrent
);
for
(
i
=
0
;
i
<
dev
->
maxchild
;
i
++
)
portstr
[
i
]
=
hub
->
descriptor
->
DeviceRemovable
[((
i
+
1
)
/
8
)]
&
(
1
<<
((
i
+
1
)
%
8
))
?
'F'
:
'R'
;
portstr
[
dev
->
maxchild
]
=
0
;
dbg
(
"port removable status: %s"
,
portstr
);
ret
=
usb_get_hub_status
(
dev
,
&
hubstatus
);
if
(
ret
<
0
)
{
err
(
"Unable to get hub status (err = %d)"
,
ret
);
...
...
drivers/usb/core/urb.c
View file @
8cacbeb0
...
...
@@ -88,15 +88,17 @@ struct urb * usb_get_urb(struct urb *urb)
/*-------------------------------------------------------------------*/
/**
* usb_submit_urb -
asynchronously issue a
transfer request for an endpoint
* usb_submit_urb -
issue an asynchronous
transfer request for an endpoint
* @urb: pointer to the urb describing the request
* @mem_flags: the type of memory to allocate, see kmalloc() for a list
* of valid options for this.
*
* This submits a transfer request, and transfers control of the URB
* describing that request to the USB subsystem. Request completion will
* indicated later, asynchronously, by calling the completion handler.
* This call may be issued in interrupt context.
* be indicated later, asynchronously, by calling the completion handler.
* The three types of completion are success, error, and unlink
* (also called "request cancellation").
* URBs may be submitted in interrupt context.
*
* The caller must have correctly initialized the URB before submitting
* it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are
...
...
@@ -148,20 +150,19 @@ struct urb * usb_get_urb(struct urb *urb)
*
* Memory Flags:
*
* General rules for how to decide which mem_flags to use:
*
* Basically the rules are the same as for kmalloc. There are four
* The general rules for how to decide which mem_flags to use
* are the same as for kmalloc. There are four
* different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and
* GFP_ATOMIC.
*
* GFP_NOFS is not ever used, as it has not been implemented yet.
*
*
There are three situations you must use GFP_ATOMIC.
*
a) you are inside a completion handler, an interrupt, bottom half,
* tasklet or timer
.
*
b) you are holding a spinlock or rwlock (does not apply to
* semaphores)
*
c) current->state != TASK_RUNNING, this is the case only after
*
GFP_ATOMIC is used when
*
(
a) you are inside a completion handler, an interrupt, bottom half,
* tasklet or timer
, or
*
(
b) you are holding a spinlock or rwlock (does not apply to
* semaphores)
, or
*
(
c) current->state != TASK_RUNNING, this is the case only after
* you've changed it.
*
* GFP_NOIO is used in the block io path and error handling of storage
...
...
@@ -169,17 +170,17 @@ struct urb * usb_get_urb(struct urb *urb)
*
* All other situations use GFP_KERNEL.
*
* S
pecfic rules for how to decide which mem_flags to use:
*
*
- start_xmit, timeout, and receive methods of network drivers must
*
use GFP_ATOMIC (spinlock)
*
- queuecommand methods of scsi drivers must use GFP_ATOMIC (spinlock)
*
-
If you use a kernel thread with a network driver you must use
* GFP_NOIO, unless
b) or c) apply
*
- After you have done a down() you use GFP_KERNEL, unless b) or
c)
* apply or your are in a storage driver's block io path
*
- probe and disconnect use GFP_KERNEL unless b) or c) apply
*
- C
hanging firmware on a running storage or net device uses
* S
ome more specific rules for mem_flags can be inferred, such as
*
(1) start_xmit, timeout, and receive methods of network drivers must
*
use GFP_ATOMIC (they are called with a spinlock held);
*
(2) queuecommand methods of scsi drivers must use GFP_ATOMIC (also
*
called with a spinlock held);
*
(3)
If you use a kernel thread with a network driver you must use
* GFP_NOIO, unless
(b) or (c) apply;
*
(4) after you have done a down() you can use GFP_KERNEL, unless (b) or (
c)
* apply or your are in a storage driver's block io path
;
*
(5) USB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and
*
(6) c
hanging firmware on a running storage or net device uses
* GFP_NOIO, unless b) or c) apply
*
*/
...
...
drivers/usb/core/usb.c
View file @
8cacbeb0
...
...
@@ -1057,56 +1057,6 @@ int usb_get_current_frame_number(struct usb_device *dev)
}
/*-------------------------------------------------------------------*/
/* for returning string descriptors in UTF-16LE */
static
int
ascii2utf
(
char
*
ascii
,
__u8
*
utf
,
int
utfmax
)
{
int
retval
;
for
(
retval
=
0
;
*
ascii
&&
utfmax
>
1
;
utfmax
-=
2
,
retval
+=
2
)
{
*
utf
++
=
*
ascii
++
&
0x7f
;
*
utf
++
=
0
;
}
return
retval
;
}
/*
* root_hub_string is used by each host controller's root hub code,
* so that they're identified consistently throughout the system.
*/
int
usb_root_hub_string
(
int
id
,
int
serial
,
char
*
type
,
__u8
*
data
,
int
len
)
{
char
buf
[
30
];
// assert (len > (2 * (sizeof (buf) + 1)));
// assert (strlen (type) <= 8);
// language ids
if
(
id
==
0
)
{
*
data
++
=
4
;
*
data
++
=
3
;
/* 4 bytes data */
*
data
++
=
0
;
*
data
++
=
0
;
/* some language id */
return
4
;
// serial number
}
else
if
(
id
==
1
)
{
sprintf
(
buf
,
"%x"
,
serial
);
// product description
}
else
if
(
id
==
2
)
{
sprintf
(
buf
,
"USB %s Root Hub"
,
type
);
// id 3 == vendor description
// unsupported IDs --> "stall"
}
else
return
0
;
data
[
0
]
=
2
+
ascii2utf
(
buf
,
data
+
2
,
len
-
2
);
data
[
1
]
=
3
;
return
data
[
0
];
}
/*
* __usb_get_extra_descriptor() finds a descriptor of specific type in the
* extra field of the interface and endpoint descriptor structs.
...
...
@@ -1221,16 +1171,13 @@ void usb_connect(struct usb_device *dev)
* won't have seen this, but not so for reinit ...
*/
dev
->
descriptor
.
bMaxPacketSize0
=
8
;
/* Start off at 8 bytes */
#ifndef DEVNUM_ROUND_ROBIN
devnum
=
find_next_zero_bit
(
dev
->
bus
->
devmap
.
devicemap
,
128
,
1
);
#else
/* round_robin alloc of devnums */
/* Try to allocate the next devnum beginning at bus->devnum_next. */
devnum
=
find_next_zero_bit
(
dev
->
bus
->
devmap
.
devicemap
,
128
,
dev
->
bus
->
devnum_next
);
if
(
devnum
>=
128
)
devnum
=
find_next_zero_bit
(
dev
->
bus
->
devmap
.
devicemap
,
128
,
1
);
dev
->
bus
->
devnum_next
=
(
devnum
>=
127
?
1
:
devnum
+
1
);
#endif
/* round_robin alloc of devnums */
if
(
devnum
<
128
)
{
set_bit
(
devnum
,
dev
->
bus
->
devmap
.
devicemap
);
...
...
@@ -1649,7 +1596,6 @@ EXPORT_SYMBOL(usb_interface_claimed);
EXPORT_SYMBOL
(
usb_driver_release_interface
);
EXPORT_SYMBOL
(
usb_match_id
);
EXPORT_SYMBOL
(
usb_root_hub_string
);
EXPORT_SYMBOL
(
usb_new_device
);
EXPORT_SYMBOL
(
usb_reset_device
);
EXPORT_SYMBOL
(
usb_connect
);
...
...
drivers/usb/host/hc_sl811_rh.c
View file @
8cacbeb0
...
...
@@ -21,6 +21,8 @@
*
*-------------------------------------------------------------------------*/
/* FIXME: reuse the root hub framework in usbcore, shrinking this code. */
#ifdef DEBUG
#undef DEBUG
#endif
...
...
@@ -229,6 +231,52 @@ static int rh_init_int_timer (struct urb * urb)
/*-------------------------------------------------------------------------*/
/* for returning string descriptors in UTF-16LE */
static
int
ascii2utf
(
char
*
ascii
,
__u8
*
utf
,
int
utfmax
)
{
int
retval
;
for
(
retval
=
0
;
*
ascii
&&
utfmax
>
1
;
utfmax
-=
2
,
retval
+=
2
)
{
*
utf
++
=
*
ascii
++
&
0x7f
;
*
utf
++
=
0
;
}
return
retval
;
}
static
int
root_hub_string
(
int
id
,
int
serial
,
char
*
type
,
__u8
*
data
,
int
len
)
{
char
buf
[
30
];
// assert (len > (2 * (sizeof (buf) + 1)));
// assert (strlen (type) <= 8);
// language ids
if
(
id
==
0
)
{
*
data
++
=
4
;
*
data
++
=
3
;
/* 4 bytes data */
*
data
++
=
0
;
*
data
++
=
0
;
/* some language id */
return
4
;
// serial number
}
else
if
(
id
==
1
)
{
sprintf
(
buf
,
"%x"
,
serial
);
// product description
}
else
if
(
id
==
2
)
{
sprintf
(
buf
,
"USB %s Root Hub"
,
type
);
// id 3 == vendor description
// unsupported IDs --> "stall"
}
else
return
0
;
data
[
0
]
=
2
+
ascii2utf
(
buf
,
data
+
2
,
len
-
2
);
data
[
1
]
=
3
;
return
data
[
0
];
}
/*-------------------------------------------------------------------------*/
/* helper macro */
#define OK(x) len = (x); break
...
...
@@ -409,7 +457,7 @@ static int rh_submit_urb (struct urb * urb)
OK
(
len
);
case
(
0x03
):
/* string descriptors */
len
=
usb_
root_hub_string
(
wValue
&
0xff
,
(
int
)
(
long
)
0
,
len
=
root_hub_string
(
wValue
&
0xff
,
(
int
)
(
long
)
0
,
"SL811HS"
,
data
,
wLength
);
if
(
len
>
0
)
{
data_buf
=
data
;
...
...
drivers/usb/host/uhci-hcd.h
View file @
8cacbeb0
...
...
@@ -4,6 +4,9 @@
#include <linux/list.h>
#include <linux/usb.h>
#define usb_packetid(pipe) (usb_pipein(pipe) ? USB_PID_IN : USB_PID_OUT)
#define PIPE_DEVEP_MASK 0x0007ff00
/*
* Universal Host Controller Interface data structures and defines
*/
...
...
drivers/usb/media/konicawc.c
View file @
8cacbeb0
...
...
@@ -15,7 +15,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/input.h>
#include "usbvideo.h"
...
...
@@ -117,6 +117,10 @@ struct konicawc {
int
maxline
;
/* number of lines per frame */
int
yplanesz
;
/* Number of bytes in the Y plane */
unsigned
int
buttonsts
:
1
;
#ifdef CONFIG_INPUT
struct
input_dev
input
;
char
input_physname
[
64
];
#endif
};
...
...
@@ -258,7 +262,7 @@ static int konicawc_compress_iso(uvd_t *uvd, struct urb *dataurb, struct urb *st
*/
if
(
sts
<
0x80
)
{
button
=
sts
&
0x40
;
button
=
!!
(
sts
&
0x40
)
;
sts
&=
~
0x40
;
}
...
...
@@ -268,6 +272,10 @@ static int konicawc_compress_iso(uvd_t *uvd, struct urb *dataurb, struct urb *st
if
(
button
!=
cam
->
buttonsts
)
{
DEBUG
(
2
,
"button: %sclicked"
,
button
?
""
:
"un"
);
cam
->
buttonsts
=
button
;
#ifdef CONFIG_INPUT
input_report_key
(
&
cam
->
input
,
BTN_0
,
cam
->
buttonsts
);
input_sync
(
&
cam
->
input
);
#endif
}
if
(
sts
==
0x01
)
{
/* drop frame */
...
...
@@ -624,7 +632,7 @@ static void *konicawc_probe(struct usb_device *dev, unsigned int ifnum, const st
int
i
,
nas
;
int
actInterface
=-
1
,
inactInterface
=-
1
,
maxPS
=
0
;
unsigned
char
video_ep
=
0
;
DEBUG
(
1
,
"konicawc_probe(%p,%u.)"
,
dev
,
ifnum
);
/* We don't handle multi-config cameras */
...
...
@@ -735,6 +743,24 @@ static void *konicawc_probe(struct usb_device *dev, unsigned int ifnum, const st
err
(
"usbvideo_RegisterVideoDevice() failed."
);
uvd
=
NULL
;
}
#ifdef CONFIG_INPUT
/* Register input device for button */
memset
(
&
cam
->
input
,
0
,
sizeof
(
struct
input_dev
));
cam
->
input
.
name
=
"Konicawc snapshot button"
;
cam
->
input
.
private
=
cam
;
cam
->
input
.
evbit
[
0
]
=
BIT
(
EV_KEY
);
cam
->
input
.
keybit
[
LONG
(
BTN_0
)]
=
BIT
(
BTN_0
);
cam
->
input
.
id
.
bustype
=
BUS_USB
;
cam
->
input
.
id
.
vendor
=
dev
->
descriptor
.
idVendor
;
cam
->
input
.
id
.
product
=
dev
->
descriptor
.
idProduct
;
cam
->
input
.
id
.
version
=
dev
->
descriptor
.
bcdDevice
;
input_register_device
(
&
cam
->
input
);
usb_make_path
(
dev
,
cam
->
input_physname
,
56
);
strcat
(
cam
->
input_physname
,
"/input0"
);
cam
->
input
.
phys
=
cam
->
input_physname
;
info
(
"konicawc: %s on %s
\n
"
,
cam
->
input
.
name
,
cam
->
input
.
phys
);
#endif
}
MOD_DEC_USE_COUNT
;
return
uvd
;
...
...
@@ -746,6 +772,9 @@ static void konicawc_free_uvd(uvd_t *uvd)
int
i
;
struct
konicawc
*
cam
=
(
struct
konicawc
*
)
uvd
->
user_data
;
#ifdef CONFIG_INPUT
input_unregister_device
(
&
cam
->
input
);
#endif
for
(
i
=
0
;
i
<
USBVIDEO_NUMSBUF
;
i
++
)
{
usb_free_urb
(
cam
->
sts_urb
[
i
]);
cam
->
sts_urb
[
i
]
=
NULL
;
...
...
drivers/usb/media/usbvideo.c
View file @
8cacbeb0
...
...
@@ -135,9 +135,21 @@ static void RingQueue_Initialize(RingQueue_t *rq)
static
void
RingQueue_Allocate
(
RingQueue_t
*
rq
,
int
rqLen
)
{
/* Make sure the requested size is a power of 2 and
round up if necessary. This allows index wrapping
using masks rather than modulo */
int
i
=
1
;
assert
(
rq
!=
NULL
);
assert
(
rqLen
>
0
);
while
(
rqLen
>>
i
)
i
++
;
if
(
rqLen
!=
1
<<
(
i
-
1
))
rqLen
=
1
<<
i
;
rq
->
length
=
rqLen
;
rq
->
ri
=
rq
->
wi
=
0
;
rq
->
queue
=
usbvideo_rvmalloc
(
rq
->
length
);
assert
(
rq
->
queue
!=
NULL
);
}
...
...
@@ -161,12 +173,32 @@ static void RingQueue_Free(RingQueue_t *rq)
int
RingQueue_Dequeue
(
RingQueue_t
*
rq
,
unsigned
char
*
dst
,
int
len
)
{
int
i
;
int
rql
,
toread
;
assert
(
rq
!=
NULL
);
assert
(
dst
!=
NULL
);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
dst
[
i
]
=
rq
->
queue
[
rq
->
ri
];
RING_QUEUE_DEQUEUE_BYTES
(
rq
,
1
);
rql
=
RingQueue_GetLength
(
rq
);
if
(
!
rql
)
return
0
;
/* Clip requested length to available data */
if
(
len
>
rql
)
len
=
rql
;
toread
=
len
;
if
(
rq
->
ri
>
rq
->
wi
)
{
/* Read data from tail */
int
read
=
(
toread
<
(
rq
->
length
-
rq
->
ri
))
?
toread
:
rq
->
length
-
rq
->
ri
;
memcpy
(
dst
,
rq
->
queue
+
rq
->
ri
,
read
);
toread
-=
read
;
dst
+=
read
;
rq
->
ri
=
(
rq
->
ri
+
read
)
&
(
rq
->
length
-
1
);
}
if
(
toread
)
{
/* Read data from head */
memcpy
(
dst
,
rq
->
queue
+
rq
->
ri
,
toread
);
rq
->
ri
=
(
rq
->
ri
+
toread
)
&
(
rq
->
length
-
1
);
}
return
len
;
}
...
...
@@ -194,7 +226,7 @@ int RingQueue_Enqueue(RingQueue_t *rq, const unsigned char *cdata, int n)
if
(
m
>
q_avail
)
m
=
q_avail
;
mem
move
(
rq
->
queue
+
rq
->
wi
,
cdata
,
m
);
mem
cpy
(
rq
->
queue
+
rq
->
wi
,
cdata
,
m
);
RING_QUEUE_ADVANCE_INDEX
(
rq
,
wi
,
m
);
cdata
+=
m
;
enqueued
+=
m
;
...
...
@@ -205,24 +237,6 @@ int RingQueue_Enqueue(RingQueue_t *rq, const unsigned char *cdata, int n)
EXPORT_SYMBOL
(
RingQueue_Enqueue
);
int
RingQueue_GetLength
(
const
RingQueue_t
*
rq
)
{
int
ri
,
wi
;
assert
(
rq
!=
NULL
);
ri
=
rq
->
ri
;
wi
=
rq
->
wi
;
if
(
ri
==
wi
)
return
0
;
else
if
(
ri
<
wi
)
return
wi
-
ri
;
else
return
wi
+
(
rq
->
length
-
ri
);
}
EXPORT_SYMBOL
(
RingQueue_GetLength
);
static
void
RingQueue_InterruptibleSleepOn
(
RingQueue_t
*
rq
)
{
assert
(
rq
!=
NULL
);
...
...
@@ -238,6 +252,16 @@ void RingQueue_WakeUpInterruptible(RingQueue_t *rq)
EXPORT_SYMBOL
(
RingQueue_WakeUpInterruptible
);
void
RingQueue_Flush
(
RingQueue_t
*
rq
)
{
assert
(
rq
!=
NULL
);
rq
->
ri
=
0
;
rq
->
wi
=
0
;
}
EXPORT_SYMBOL
(
RingQueue_Flush
);
/*
* usbvideo_VideosizeToString()
*
...
...
@@ -374,7 +398,7 @@ static void usbvideo_OverlayStats(uvd_t *uvd, usbvideo_frame_t *frame)
q_used
=
RingQueue_GetLength
(
&
uvd
->
dp
);
if
((
uvd
->
dp
.
ri
+
q_used
)
>=
uvd
->
dp
.
length
)
{
u_hi
=
uvd
->
dp
.
length
;
u_lo
=
(
q_used
+
uvd
->
dp
.
ri
)
%
uvd
->
dp
.
length
;
u_lo
=
(
q_used
+
uvd
->
dp
.
ri
)
&
(
uvd
->
dp
.
length
-
1
)
;
}
else
{
u_hi
=
(
q_used
+
uvd
->
dp
.
ri
);
u_lo
=
-
1
;
...
...
@@ -1256,7 +1280,7 @@ static int usbvideo_v4l_open(struct inode *inode, struct file *file)
/* Allocate memory for the frame buffers */
uvd
->
fbuf_size
=
USBVIDEO_NUMFRAMES
*
uvd
->
max_frame_size
;
uvd
->
fbuf
=
usbvideo_rvmalloc
(
uvd
->
fbuf_size
);
RingQueue_Allocate
(
&
uvd
->
dp
,
128
*
1024
);
/* FIXME #define */
RingQueue_Allocate
(
&
uvd
->
dp
,
RING_QUEUE_SIZE
);
if
((
uvd
->
fbuf
==
NULL
)
||
(
!
RingQueue_IsAllocated
(
&
uvd
->
dp
)))
{
err
(
"%s: Failed to allocate fbuf or dp"
,
proc
);
...
...
@@ -1444,6 +1468,10 @@ static int usbvideo_v4l_do_ioctl(struct inode *inode, struct file *file,
{
struct
video_window
*
vw
=
arg
;
if
(
VALID_CALLBACK
(
uvd
,
setVideoMode
))
{
return
GET_CALLBACK
(
uvd
,
setVideoMode
)(
uvd
,
vw
);
}
if
(
vw
->
flags
)
return
-
EINVAL
;
if
(
vw
->
clipcount
)
...
...
@@ -1461,8 +1489,8 @@ static int usbvideo_v4l_do_ioctl(struct inode *inode, struct file *file,
vw
->
x
=
0
;
vw
->
y
=
0
;
vw
->
width
=
VIDEOSIZE_X
(
uvd
->
canvas
);
vw
->
height
=
VIDEOSIZE_Y
(
uvd
->
canvas
);
vw
->
width
=
VIDEOSIZE_X
(
uvd
->
videosize
);
vw
->
height
=
VIDEOSIZE_Y
(
uvd
->
videosize
);
vw
->
chromakey
=
0
;
if
(
VALID_CALLBACK
(
uvd
,
getFPS
))
vw
->
flags
=
GET_CALLBACK
(
uvd
,
getFPS
)(
uvd
);
...
...
drivers/usb/media/usbvideo.h
View file @
8cacbeb0
...
...
@@ -113,9 +113,10 @@ typedef unsigned long videosize_t;
mr = LIMIT_RGB(mm_r); \
}
#define RING_QUEUE_ADVANCE_INDEX(rq,ind,n) (rq)->ind = ((rq)->ind + (n)) % (rq)->length
#define RING_QUEUE_SIZE (128*1024)
/* Must be a power of 2 */
#define RING_QUEUE_ADVANCE_INDEX(rq,ind,n) (rq)->ind = ((rq)->ind + (n)) & ((rq)->length-1)
#define RING_QUEUE_DEQUEUE_BYTES(rq,n) RING_QUEUE_ADVANCE_INDEX(rq,ri,n)
#define RING_QUEUE_PEEK(rq,ofs) ((rq)->queue[((ofs) + (rq)->ri)
% (rq)->length
])
#define RING_QUEUE_PEEK(rq,ofs) ((rq)->queue[((ofs) + (rq)->ri)
& ((rq)->length-1)
])
typedef
struct
{
unsigned
char
*
queue
;
/* Data from the Isoc data pump */
...
...
@@ -271,6 +272,7 @@ typedef struct {
int
(
*
procfs_write
)(
struct
file
*
file
,
const
char
*
buffer
,
unsigned
long
count
,
void
*
data
);
int
(
*
startDataPump
)(
uvd_t
*
uvd
);
void
(
*
stopDataPump
)(
uvd_t
*
uvd
);
int
(
*
setVideoMode
)(
uvd_t
*
uvd
,
struct
video_window
*
vw
);
}
usbvideo_cb_t
;
struct
s_usbvideo_t
{
...
...
@@ -306,8 +308,18 @@ typedef struct s_usbvideo_t usbvideo_t;
int
RingQueue_Dequeue
(
RingQueue_t
*
rq
,
unsigned
char
*
dst
,
int
len
);
int
RingQueue_Enqueue
(
RingQueue_t
*
rq
,
const
unsigned
char
*
cdata
,
int
n
);
int
RingQueue_GetLength
(
const
RingQueue_t
*
rq
);
void
RingQueue_WakeUpInterruptible
(
RingQueue_t
*
rq
);
void
RingQueue_Flush
(
RingQueue_t
*
rq
);
static
inline
int
RingQueue_GetLength
(
const
RingQueue_t
*
rq
)
{
return
(
rq
->
wi
-
rq
->
ri
+
rq
->
length
)
&
(
rq
->
length
-
1
);
}
static
inline
int
RingQueue_GetFreeSpace
(
const
RingQueue_t
*
rq
)
{
return
rq
->
length
-
RingQueue_GetLength
(
rq
);
}
void
usbvideo_DrawLine
(
usbvideo_frame_t
*
frame
,
...
...
drivers/usb/serial/ipaq.h
View file @
8cacbeb0
...
...
@@ -19,7 +19,7 @@
#define COMPAQ_VENDOR_ID 0x049f
#define COMPAQ_IPAQ_ID 0x0003
#define HP_VENDOR_ID 0x0
03f
#define HP_VENDOR_ID 0x0
3f0
#define HP_JORNADA_548_ID 0x1016
#define HP_JORNADA_568_ID 0x1116
...
...
drivers/usb/storage/isd200.c
View file @
8cacbeb0
...
...
@@ -434,6 +434,12 @@ static int isd200_transfer_partial( struct us_data *us,
return
ISD200_TRANSPORT_GOOD
;
}
/* did we abort this command? */
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
US_DEBUGP
(
"isd200_transfer_partial(): transfer aborted
\n
"
);
return
ISD200_TRANSPORT_ABORTED
;
}
/* uh oh... we have an error code, so something went wrong. */
if
(
result
)
{
/* NAK - that means we've retried a few times already */
...
...
@@ -442,12 +448,6 @@ static int isd200_transfer_partial( struct us_data *us,
return
ISD200_TRANSPORT_FAILED
;
}
/* -ENOENT -- we canceled this transfer */
if
(
result
==
-
ENOENT
)
{
US_DEBUGP
(
"isd200_transfer_partial(): transfer aborted
\n
"
);
return
ISD200_TRANSPORT_ABORTED
;
}
/* the catch-all case */
US_DEBUGP
(
"isd200_transfer_partial(): unknown error
\n
"
);
return
ISD200_TRANSPORT_FAILED
;
...
...
@@ -581,8 +581,11 @@ int isd200_Bulk_transport( struct us_data *us, Scsi_Cmnd *srb,
&
partial
);
US_DEBUGP
(
"Bulk command transfer result=%d
\n
"
,
result
);
if
(
result
==
-
ENOENT
)
/* did we abort this command? */
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
return
ISD200_TRANSPORT_ABORTED
;
}
else
if
(
result
==
-
EPIPE
)
{
/* if we stall, we need to clear it before we go on */
US_DEBUGP
(
"clearing endpoint halt for pipe 0x%x
\n
"
,
pipe
);
...
...
@@ -610,8 +613,10 @@ int isd200_Bulk_transport( struct us_data *us, Scsi_Cmnd *srb,
US_DEBUGP
(
"Attempting to get CSW...
\n
"
);
result
=
usb_stor_bulk_msg
(
us
,
&
bcs
,
pipe
,
US_BULK_CS_WRAP_LEN
,
&
partial
);
if
(
result
==
-
ENOENT
)
return
ISD200_TRANSPORT_ABORTED
;
/* did we abort this command? */
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
return
ISD200_TRANSPORT_ABORTED
;
}
/* did the attempt to read the CSW fail? */
if
(
result
==
-
EPIPE
)
{
...
...
@@ -624,8 +629,9 @@ int isd200_Bulk_transport( struct us_data *us, Scsi_Cmnd *srb,
US_BULK_CS_WRAP_LEN
,
&
partial
);
/* if the command was aborted, indicate that */
if
(
result
==
-
ENOENT
)
return
ISD200_TRANSPORT_ABORTED
;
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
return
ISD200_TRANSPORT_ABORTED
;
}
/* if it fails again, we need a reset and return an error*/
if
(
result
==
-
EPIPE
)
{
...
...
drivers/usb/storage/raw_bulk.c
View file @
8cacbeb0
...
...
@@ -3,7 +3,7 @@
* Unrelated to CF/SM - just USB stuff.
*
* This is mostly a thin layer on top of transport.c.
* It converts routines that return values like -E
NOENT and -E
PIPE
* It converts routines that return values like -EPIPE
* into routines that return USB_STOR_TRANSPORT_ABORTED etc.
*
* There is also some debug printing here.
...
...
@@ -58,13 +58,14 @@ usb_storage_send_control(struct us_data *us,
request
,
requesttype
,
value
,
index
,
xfer_data
,
xfer_len
);
/* did we abort this command? */
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
US_DEBUGP
(
"usb_stor_send_control(): transfer aborted
\n
"
);
return
US_BULK_TRANSFER_ABORTED
;
}
// Check the return code for the command.
if
(
result
<
0
)
{
/* if the command was aborted, indicate that */
if
(
result
==
-
ENOENT
)
return
USB_STOR_TRANSPORT_ABORTED
;
/* a stall is a fatal condition from the device */
if
(
result
==
-
EPIPE
)
{
...
...
@@ -105,13 +106,13 @@ usb_storage_raw_bulk(struct us_data *us, int direction, unsigned char *data,
/* return US_BULK_TRANSFER_SHORT; */
}
if
(
result
)
{
/* -ENOENT -- we canceled this transfer */
if
(
result
==
-
ENOENT
)
{
US_DEBUGP
(
"raw_bulk(): transfer aborted
\n
"
);
return
US_BULK_TRANSFER_ABORTED
;
}
/* did we abort this command? */
if
(
atomic_read
(
&
us
->
sm_state
)
==
US_STATE_ABORTING
)
{
US_DEBUGP
(
"usb_storage_raw_bulk(): transfer aborted
\n
"
);
return
US_BULK_TRANSFER_ABORTED
;
}
if
(
result
)
{
/* NAK - that means we've retried a few times already */
if
(
result
==
-
ETIMEDOUT
)
US_DEBUGP
(
"raw_bulk(): device NAKed
\n
"
);
...
...
include/linux/usb.h
View file @
8cacbeb0
...
...
@@ -57,27 +57,6 @@
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
/*
* USB Packet IDs (PIDs)
*/
#define USB_PID_UNDEF_0 0xf0
#define USB_PID_OUT 0xe1
#define USB_PID_ACK 0xd2
#define USB_PID_DATA0 0xc3
#define USB_PID_PING 0xb4
/* USB 2.0 */
#define USB_PID_SOF 0xa5
#define USB_PID_NYET 0x96
/* USB 2.0 */
#define USB_PID_DATA2 0x87
/* USB 2.0 */
#define USB_PID_SPLIT 0x78
/* USB 2.0 */
#define USB_PID_IN 0x69
#define USB_PID_NAK 0x5a
#define USB_PID_DATA1 0x4b
#define USB_PID_PREAMBLE 0x3c
/* Token mode */
#define USB_PID_ERR 0x3c
/* USB 2.0: handshake mode */
#define USB_PID_SETUP 0x2d
#define USB_PID_STALL 0x1e
#define USB_PID_MDATA 0x0f
/* USB 2.0 */
/*
* Standard requests
*/
...
...
@@ -318,8 +297,6 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size,
struct
usb_operations
;
#define DEVNUM_ROUND_ROBIN
/***** OPTION *****/
/*
* Allocated per bus we have
*/
...
...
@@ -327,9 +304,7 @@ struct usb_bus {
int
busnum
;
/* Bus number (in order of reg) */
char
*
bus_name
;
/* stable id (PCI slot_name etc) */
#ifdef DEVNUM_ROUND_ROBIN
int
devnum_next
;
/* Next open device number in round-robin allocation */
#endif
/* DEVNUM_ROUND_ROBIN */
struct
usb_devmap
devmap
;
/* device address allocation map */
struct
usb_operations
*
op
;
/* Operations (specific to the HC) */
...
...
@@ -353,10 +328,6 @@ struct usb_bus {
atomic_t
refcnt
;
};
// FIXME: root_hub_string vanishes when "usb_hcd" conversion is done,
// along with pre-hcd versions of the OHCI and UHCI drivers.
extern
int
usb_root_hub_string
(
int
id
,
int
serial
,
char
*
type
,
__u8
*
data
,
int
len
);
/* -------------------------------------------------------------------------- */
...
...
@@ -745,7 +716,7 @@ typedef void (*usb_complete_t)(struct urb *);
/**
* struct urb - USB Request Block
* @urb_list: For use by current owner of the URB.
* @pipe: Holds endpoint number, direction, type, and m
ax packet siz
e.
* @pipe: Holds endpoint number, direction, type, and m
or
e.
* Create these values with the eight macros available;
* usb_{snd,rcv}TYPEpipe(dev,endpoint), where the type is "ctrl"
* (control), "bulk", "int" (interrupt), or "iso" (isochronous).
...
...
@@ -774,7 +745,8 @@ typedef void (*usb_complete_t)(struct urb *);
* @transfer_buffer_length: How big is transfer_buffer. The transfer may
* be broken up into chunks according to the current maximum packet
* size for the endpoint, which is a function of the configuration
* and is encoded in the pipe.
* and is encoded in the pipe. When the length is zero, neither
* transfer_buffer nor transfer_dma is used.
* @actual_length: This is read in non-iso completion functions, and
* it tells how many bytes (out of transfer_buffer_length) were
* transferred. It will normally be the same as requested, unless
...
...
@@ -787,7 +759,7 @@ typedef void (*usb_complete_t)(struct urb *);
* (Not used when URB_NO_DMA_MAP is set.)
* @setup_dma: For control transfers with URB_NO_DMA_MAP set, the device
* driver has provided this DMA address for the setup packet. The
* host controller driver should use instead of setup_buffer.
* host controller driver should use
this
instead of setup_buffer.
* If there is a data phase, its buffer is identified by transfer_dma.
* @start_frame: Returns the initial frame for interrupt or isochronous
* transfers.
...
...
@@ -817,8 +789,9 @@ typedef void (*usb_complete_t)(struct urb *);
* taken from the general page pool. That is provided by transfer_buffer
* (control requests also use setup_packet), and host controller drivers
* perform a dma mapping (and unmapping) for each buffer transferred. Those
* mapping operations can be expensive on some platforms (such using a dma
* bounce buffer), although they're cheap on commodity x86 and ppc hardware.
* mapping operations can be expensive on some platforms (perhaps using a dma
* bounce buffer or talking to an IOMMU),
* although they're cheap on commodity x86 and ppc hardware.
*
* Alternatively, drivers may pass the URB_NO_DMA_MAP transfer flag, which
* tells the host controller driver that no such mapping is needed since
...
...
@@ -884,7 +857,7 @@ typedef void (*usb_complete_t)(struct urb *);
* things that a completion handler should do is check the status field.
* The status field is provided for all URBs. It is used to report
* unlinked URBs, and status for all non-ISO transfers. It should not
* be examined
outside of
the completion handler.
* be examined
before the URB is returned to
the completion handler.
*
* The context field is normally used to link URBs back to the relevant
* driver or request state.
...
...
@@ -1075,7 +1048,6 @@ extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
int
timeout
);
/* wrappers around usb_control_msg() for the most common standard requests */
extern
int
usb_clear_halt
(
struct
usb_device
*
dev
,
int
pipe
);
extern
int
usb_get_descriptor
(
struct
usb_device
*
dev
,
unsigned
char
desctype
,
unsigned
char
descindex
,
void
*
buf
,
int
size
);
extern
int
usb_get_device_descriptor
(
struct
usb_device
*
dev
);
...
...
@@ -1085,6 +1057,9 @@ extern int usb_get_string(struct usb_device *dev,
unsigned
short
langid
,
unsigned
char
index
,
void
*
buf
,
int
size
);
extern
int
usb_string
(
struct
usb_device
*
dev
,
int
index
,
char
*
buf
,
size_t
size
);
/* wrappers that also update important state inside usbcore */
extern
int
usb_clear_halt
(
struct
usb_device
*
dev
,
int
pipe
);
extern
int
usb_set_configuration
(
struct
usb_device
*
dev
,
int
configuration
);
extern
int
usb_set_interface
(
struct
usb_device
*
dev
,
int
ifnum
,
int
alternate
);
...
...
@@ -1123,9 +1098,10 @@ extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
*
* - max size: bits 0-1 [Historical; now gone.]
* - direction: bit 7 (0 = Host-to-Device [Out],
* 1 = Device-to-Host [In])
* - device: bits 8-14
* - endpoint: bits 15-18
* 1 = Device-to-Host [In] ...
* like endpoint bEndpointAddress)
* - device: bits 8-14 ... bit positions known to uhci-hcd
* - endpoint: bits 15-18 ... bit positions known to uhci-hcd
* - Data0/1: bit 19 [Historical; now gone. ]
* - lowspeed: bit 26 [Historical; now gone. ]
* - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt,
...
...
@@ -1146,10 +1122,9 @@ extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
#define usb_maxpacket(dev, pipe, out) (out \
? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \
: (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )
#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT)
#define usb_pipe
out(pipe) ((((pipe) >> 7) & 1) ^ 1
)
#define usb_pipe
in(pipe) (((pipe) >> 7) & 1
)
#define usb_pipe
in(pipe) ((pipe) & USB_DIR_IN
)
#define usb_pipe
out(pipe) (!usb_pipein(pipe)
)
#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
...
...
@@ -1158,19 +1133,16 @@ extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)
#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)
#define PIPE_DEVEP_MASK 0x0007ff00
/* The D0/D1 toggle bits */
/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */
#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)
#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep)))
#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | ((bit) << (ep)))
/* Endpoint halt control/status */
#define usb_endpoint_out(ep_dir) ((((ep_dir) >> 7) & 1) ^ 1)
#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
/* Endpoint halt control/status ... likewise USE WITH CAUTION */
#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
static
inline
unsigned
int
__create_pipe
(
struct
usb_device
*
dev
,
unsigned
int
endpoint
)
{
return
(
dev
->
devnum
<<
8
)
|
(
endpoint
<<
15
);
...
...
@@ -1211,47 +1183,6 @@ void usb_show_string(struct usb_device *dev, char *id, int index);
#define warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ## arg)
/* -------------------------------------------------------------------------- */
/*
* driver list
* exported only for usbfs (not visible outside usbcore)
*/
extern
struct
list_head
usb_driver_list
;
/*
* USB device fs stuff
*/
#ifdef CONFIG_USB_DEVICEFS
/*
* these are expected to be called from the USB core/hub thread
* with the kernel lock held
*/
extern
void
usbfs_add_bus
(
struct
usb_bus
*
bus
);
extern
void
usbfs_remove_bus
(
struct
usb_bus
*
bus
);
extern
void
usbfs_add_device
(
struct
usb_device
*
dev
);
extern
void
usbfs_remove_device
(
struct
usb_device
*
dev
);
extern
void
usbfs_update_special
(
void
);
extern
int
usbfs_init
(
void
);
extern
void
usbfs_cleanup
(
void
);
#else
/* CONFIG_USB_DEVICEFS */
static
inline
void
usbfs_add_bus
(
struct
usb_bus
*
bus
)
{}
static
inline
void
usbfs_remove_bus
(
struct
usb_bus
*
bus
)
{}
static
inline
void
usbfs_add_device
(
struct
usb_device
*
dev
)
{}
static
inline
void
usbfs_remove_device
(
struct
usb_device
*
dev
)
{}
static
inline
void
usbfs_update_special
(
void
)
{}
static
inline
int
usbfs_init
(
void
)
{
return
0
;
}
static
inline
void
usbfs_cleanup
(
void
)
{
}
#endif
/* CONFIG_USB_DEVICEFS */
#endif
/* __KERNEL__ */
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment