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
e9b73ef9
Commit
e9b73ef9
authored
May 28, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/gregkh/linux/usb-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
3bf8a198
075769bc
Changes
23
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
670 additions
and
488 deletions
+670
-488
drivers/usb/class/usblp.c
drivers/usb/class/usblp.c
+17
-4
drivers/usb/core/Makefile
drivers/usb/core/Makefile
+1
-1
drivers/usb/core/config.c
drivers/usb/core/config.c
+9
-8
drivers/usb/core/hcd.h
drivers/usb/core/hcd.h
+2
-2
drivers/usb/core/hub.c
drivers/usb/core/hub.c
+300
-286
drivers/usb/core/message.c
drivers/usb/core/message.c
+1
-1
drivers/usb/core/sysfs.c
drivers/usb/core/sysfs.c
+4
-4
drivers/usb/core/usb.c
drivers/usb/core/usb.c
+54
-53
drivers/usb/core/usb.h
drivers/usb/core/usb.h
+2
-2
drivers/usb/gadget/Kconfig
drivers/usb/gadget/Kconfig
+1
-0
drivers/usb/gadget/epautoconf.c
drivers/usb/gadget/epautoconf.c
+2
-1
drivers/usb/gadget/serial.c
drivers/usb/gadget/serial.c
+3
-6
drivers/usb/host/uhci-hcd.c
drivers/usb/host/uhci-hcd.c
+46
-5
drivers/usb/host/uhci-hcd.h
drivers/usb/host/uhci-hcd.h
+3
-0
drivers/usb/input/hiddev.c
drivers/usb/input/hiddev.c
+1
-1
drivers/usb/input/powermate.c
drivers/usb/input/powermate.c
+12
-8
drivers/usb/net/kaweth.c
drivers/usb/net/kaweth.c
+5
-4
drivers/usb/net/pegasus.h
drivers/usb/net/pegasus.h
+3
-0
drivers/usb/serial/Kconfig
drivers/usb/serial/Kconfig
+2
-2
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.c
+103
-22
drivers/usb/serial/kobil_sct.c
drivers/usb/serial/kobil_sct.c
+33
-16
drivers/usb/serial/visor.c
drivers/usb/serial/visor.c
+65
-60
drivers/usb/storage/transport.c
drivers/usb/storage/transport.c
+1
-2
No files found.
drivers/usb/class/usblp.c
View file @
e9b73ef9
...
...
@@ -226,11 +226,21 @@ extern struct usb_driver usblp_driver;
static
int
usblp_ctrl_msg
(
struct
usblp
*
usblp
,
int
request
,
int
type
,
int
dir
,
int
recip
,
int
value
,
void
*
buf
,
int
len
)
{
int
retval
=
usb_control_msg
(
usblp
->
dev
,
int
retval
;
int
index
=
usblp
->
ifnum
;
/* High byte has the interface index.
Low byte has the alternate setting.
*/
if
((
request
==
USBLP_REQ_GET_ID
)
&&
(
type
==
USB_TYPE_CLASS
))
{
index
=
(
usblp
->
ifnum
<<
8
)
|
usblp
->
protocol
[
usblp
->
current_protocol
].
alt_setting
;
}
retval
=
usb_control_msg
(
usblp
->
dev
,
dir
?
usb_rcvctrlpipe
(
usblp
->
dev
,
0
)
:
usb_sndctrlpipe
(
usblp
->
dev
,
0
),
request
,
type
|
dir
|
recip
,
value
,
usblp
->
ifnum
,
buf
,
len
,
USBLP_WRITE_TIMEOUT
);
dbg
(
"usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d len: %#x result: %d"
,
request
,
!!
dir
,
recip
,
value
,
len
,
retval
);
request
,
type
|
dir
|
recip
,
value
,
index
,
buf
,
len
,
USBLP_WRITE_TIMEOUT
);
dbg
(
"usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d
idx: %d
len: %#x result: %d"
,
request
,
!!
dir
,
recip
,
value
,
index
,
len
,
retval
);
return
retval
<
0
?
retval
:
0
;
}
...
...
@@ -440,6 +450,9 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
goto
done
;
}
dbg
(
"usblp_ioctl: cmd=0x%x (%c nr=%d len=%d dir=%d)"
,
cmd
,
_IOC_TYPE
(
cmd
),
_IOC_NR
(
cmd
),
_IOC_SIZE
(
cmd
),
_IOC_DIR
(
cmd
)
);
if
(
_IOC_TYPE
(
cmd
)
==
'P'
)
/* new-style ioctl number */
switch
(
_IOC_NR
(
cmd
))
{
...
...
drivers/usb/core/Makefile
View file @
e9b73ef9
...
...
@@ -3,7 +3,7 @@
#
usbcore-objs
:=
usb.o hub.o hcd.o urb.o message.o
\
config.o file.o buffer.o
driver
fs.o
config.o file.o buffer.o
sys
fs.o
ifeq
($(CONFIG_PCI),y)
usbcore-objs
+=
hcd-pci.o
...
...
drivers/usb/core/config.c
View file @
e9b73ef9
...
...
@@ -465,23 +465,24 @@ int usb_get_configuration(struct usb_device *dev)
goto
err2
;
memset
(
dev
->
rawdescriptors
,
0
,
length
);
buffer
=
kmalloc
(
8
,
GFP_KERNEL
);
buffer
=
kmalloc
(
USB_DT_CONFIG_SIZE
,
GFP_KERNEL
);
if
(
!
buffer
)
goto
err2
;
desc
=
(
struct
usb_config_descriptor
*
)
buffer
;
for
(
cfgno
=
0
;
cfgno
<
ncfg
;
cfgno
++
)
{
/* We grab
the first 8 bytes so we know how long the whole */
/*
configuration is */
/* We grab
just the first descriptor so we know how long
* the whole
configuration is */
result
=
usb_get_descriptor
(
dev
,
USB_DT_CONFIG
,
cfgno
,
buffer
,
8
);
buffer
,
USB_DT_CONFIG_SIZE
);
if
(
result
<
0
)
{
dev_err
(
ddev
,
"unable to read config index %d "
"descriptor
\n
"
,
cfgno
);
"descriptor
/%s
\n
"
,
cfgno
,
"start"
);
goto
err
;
}
else
if
(
result
<
8
)
{
}
else
if
(
result
<
4
)
{
dev_err
(
ddev
,
"config index %d descriptor too short "
"(expected %i, got %i)
\n
"
,
cfgno
,
8
,
result
);
"(expected %i, got %i)
\n
"
,
cfgno
,
USB_DT_CONFIG_SIZE
,
result
);
result
=
-
EINVAL
;
goto
err
;
}
...
...
@@ -498,7 +499,7 @@ int usb_get_configuration(struct usb_device *dev)
bigbuffer
,
length
);
if
(
result
<
0
)
{
dev_err
(
ddev
,
"unable to read config index %d "
"descriptor
\n
"
,
cfgno
);
"descriptor
/%s
\n
"
,
cfgno
,
"all"
);
kfree
(
bigbuffer
);
goto
err
;
}
...
...
drivers/usb/core/hcd.h
View file @
e9b73ef9
...
...
@@ -243,13 +243,13 @@ extern void usb_hc_died (struct usb_hcd *hcd);
extern
struct
usb_device
*
usb_alloc_dev
(
struct
usb_device
*
parent
,
struct
usb_bus
*
,
unsigned
port
);
extern
int
usb_new_device
(
struct
usb_device
*
dev
);
extern
void
usb_choose_address
(
struct
usb_device
*
dev
);
extern
void
usb_disconnect
(
struct
usb_device
**
);
extern
void
usb_choose_address
(
struct
usb_device
*
dev
);
extern
void
usb_release_address
(
struct
usb_device
*
dev
);
/* exported to hub driver ONLY to support usb_reset_device () */
extern
int
usb_get_configuration
(
struct
usb_device
*
dev
);
extern
void
usb_destroy_configuration
(
struct
usb_device
*
dev
);
extern
int
usb_set_address
(
struct
usb_device
*
dev
);
/* use these only before the device's address has been set */
#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30))
...
...
drivers/usb/core/hub.c
View file @
e9b73ef9
This diff is collapsed.
Click to expand it.
drivers/usb/core/message.c
View file @
e9b73ef9
...
...
@@ -1252,7 +1252,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
ret
);
continue
;
}
usb_create_
driver
fs_intf_files
(
intf
);
usb_create_
sys
fs_intf_files
(
intf
);
}
}
...
...
drivers/usb/core/
driver
fs.c
→
drivers/usb/core/
sys
fs.c
View file @
e9b73ef9
/*
* drivers/usb/core/
driver
fs.c
* drivers/usb/core/
sys
fs.c
*
* (C) Copyright 2002 David Brownell
* (C) Copyright 2002 Greg Kroah-Hartman
* (C) Copyright 2002 IBM Corp.
*
* All of the
driver
fs file attributes for usb devices and interfaces.
* All of the
sys
fs file attributes for usb devices and interfaces.
*
*/
...
...
@@ -163,7 +163,7 @@ usb_descriptor_attr (bDeviceProtocol, "%02x\n")
usb_descriptor_attr
(
bNumConfigurations
,
"%d
\n
"
)
void
usb_create_
driver
fs_dev_files
(
struct
usb_device
*
udev
)
void
usb_create_
sys
fs_dev_files
(
struct
usb_device
*
udev
)
{
struct
device
*
dev
=
&
udev
->
dev
;
...
...
@@ -217,7 +217,7 @@ usb_intf_attr (bInterfaceSubClass, "%02x\n")
usb_intf_attr
(
bInterfaceProtocol
,
"%02x
\n
"
)
usb_intf_attr
(
iInterface
,
"%02x
\n
"
)
void
usb_create_
driver
fs_intf_files
(
struct
usb_interface
*
intf
)
void
usb_create_
sys
fs_intf_files
(
struct
usb_interface
*
intf
)
{
device_create_file
(
&
intf
->
dev
,
&
dev_attr_bInterfaceNumber
);
device_create_file
(
&
intf
->
dev
,
&
dev_attr_bAlternateSetting
);
...
...
drivers/usb/core/usb.c
View file @
e9b73ef9
...
...
@@ -998,12 +998,10 @@ void usb_disconnect(struct usb_device **pdev)
*/
usb_disable_device
(
dev
,
0
);
dev_dbg
(
&
dev
->
dev
,
"unregistering device
\n
"
);
/* Free the device number and remove the /proc/bus/usb entry */
if
(
dev
->
devnum
>
0
)
{
clear_bit
(
dev
->
devnum
,
dev
->
bus
->
devmap
.
devicemap
);
dev_dbg
(
&
dev
->
dev
,
"unregistering device
\n
"
);
usb_release_address
(
dev
);
usbfs_remove_device
(
dev
);
}
up
(
&
dev
->
serialize
);
device_unregister
(
&
dev
->
dev
);
}
...
...
@@ -1038,24 +1036,23 @@ void usb_choose_address(struct usb_device *dev)
}
}
// hub-only!! ... and only exported for reset/reinit path.
// otherwise used internally, for usb_new_device()
int
usb_set_address
(
struct
usb_device
*
dev
)
/**
* usb_release_address - deallocate device address (usbcore-internal)
* @dev: newly removed device
*
* Removes and deallocates the address assigned to a device.
* Only hub drivers (but not virtual root hub drivers for host
* controllers) should ever call this.
*/
void
usb_release_address
(
struct
usb_device
*
dev
)
{
int
retval
;
if
(
dev
->
devnum
==
0
)
return
-
EINVAL
;
if
(
dev
->
state
!=
USB_STATE_DEFAULT
&&
dev
->
state
!=
USB_STATE_ADDRESS
)
return
-
EINVAL
;
retval
=
usb_control_msg
(
dev
,
usb_snddefctrl
(
dev
),
USB_REQ_SET_ADDRESS
,
0
,
dev
->
devnum
,
0
,
NULL
,
0
,
HZ
*
USB_CTRL_SET_TIMEOUT
);
if
(
retval
==
0
)
dev
->
state
=
USB_STATE_ADDRESS
;
return
retval
;
if
(
dev
->
devnum
>
0
)
{
clear_bit
(
dev
->
devnum
,
dev
->
bus
->
devmap
.
devicemap
);
dev
->
devnum
=
-
1
;
}
}
static
inline
void
usb_show_string
(
struct
usb_device
*
dev
,
char
*
id
,
int
index
)
{
char
*
buf
;
...
...
@@ -1069,6 +1066,37 @@ static inline void usb_show_string(struct usb_device *dev, char *id, int index)
kfree
(
buf
);
}
static
int
usb_choose_configuration
(
struct
usb_device
*
dev
)
{
int
c
,
i
;
c
=
dev
->
config
[
0
].
desc
.
bConfigurationValue
;
if
(
dev
->
descriptor
.
bNumConfigurations
!=
1
)
{
for
(
i
=
0
;
i
<
dev
->
descriptor
.
bNumConfigurations
;
i
++
)
{
struct
usb_interface_descriptor
*
desc
;
/* heuristic: Linux is more likely to have class
* drivers, so avoid vendor-specific interfaces.
*/
desc
=
&
dev
->
config
[
i
].
intf_cache
[
0
]
->
altsetting
->
desc
;
if
(
desc
->
bInterfaceClass
==
USB_CLASS_VENDOR_SPEC
)
continue
;
/* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS */
if
(
desc
->
bInterfaceClass
==
USB_CLASS_COMM
&&
desc
->
bInterfaceSubClass
==
2
&&
desc
->
bInterfaceProtocol
==
0xff
)
continue
;
c
=
dev
->
config
[
i
].
desc
.
bConfigurationValue
;
break
;
}
dev_info
(
&
dev
->
dev
,
"configuration #%d chosen from %d choices
\n
"
,
c
,
dev
->
descriptor
.
bNumConfigurations
);
}
return
c
;
}
/*
* usb_new_device - perform initial device setup (usbcore-internal)
* @dev: newly addressed device (in ADDRESS state)
...
...
@@ -1090,8 +1118,7 @@ static inline void usb_show_string(struct usb_device *dev, char *id, int index)
int
usb_new_device
(
struct
usb_device
*
dev
)
{
int
err
;
int
i
;
int
config
;
int
c
;
err
=
usb_get_configuration
(
dev
);
if
(
err
<
0
)
{
...
...
@@ -1119,41 +1146,16 @@ int usb_new_device(struct usb_device *dev)
dev_err
(
&
dev
->
dev
,
"can't device_add, error %d
\n
"
,
err
);
goto
fail
;
}
usb_create_
driver
fs_dev_files
(
dev
);
usb_create_
sys
fs_dev_files
(
dev
);
/* choose and set the configuration. that registers the interfaces
* with the driver core, and lets usb device drivers bind to them.
* NOTE: should interact with hub power budgeting.
*/
config
=
dev
->
config
[
0
].
desc
.
bConfigurationValue
;
if
(
dev
->
descriptor
.
bNumConfigurations
!=
1
)
{
for
(
i
=
0
;
i
<
dev
->
descriptor
.
bNumConfigurations
;
i
++
)
{
struct
usb_interface_descriptor
*
desc
;
/* heuristic: Linux is more likely to have class
* drivers, so avoid vendor-specific interfaces.
*/
desc
=
&
dev
->
config
[
i
].
intf_cache
[
0
]
->
altsetting
->
desc
;
if
(
desc
->
bInterfaceClass
==
USB_CLASS_VENDOR_SPEC
)
continue
;
/* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS */
if
(
desc
->
bInterfaceClass
==
USB_CLASS_COMM
&&
desc
->
bInterfaceSubClass
==
2
&&
desc
->
bInterfaceProtocol
==
0xff
)
continue
;
config
=
dev
->
config
[
i
].
desc
.
bConfigurationValue
;
break
;
}
dev_info
(
&
dev
->
dev
,
"configuration #%d chosen from %d choices
\n
"
,
config
,
dev
->
descriptor
.
bNumConfigurations
);
}
err
=
usb_set_configuration
(
dev
,
config
);
c
=
usb_choose_configuration
(
dev
);
err
=
usb_set_configuration
(
dev
,
c
);
if
(
err
)
{
dev_err
(
&
dev
->
dev
,
"can't set config #%d, error %d
\n
"
,
config
,
err
);
dev_err
(
&
dev
->
dev
,
"can't set config #%d, error %d
\n
"
,
c
,
err
);
device_del
(
&
dev
->
dev
);
goto
fail
;
}
...
...
@@ -1166,8 +1168,7 @@ int usb_new_device(struct usb_device *dev)
return
0
;
fail:
dev
->
state
=
USB_STATE_NOTATTACHED
;
clear_bit
(
dev
->
devnum
,
dev
->
bus
->
devmap
.
devicemap
);
dev
->
devnum
=
-
1
;
usb_release_address
(
dev
);
usb_put_dev
(
dev
);
return
err
;
}
...
...
drivers/usb/core/usb.h
View file @
e9b73ef9
/* Functions local to drivers/usb/core/ */
extern
void
usb_create_
driver
fs_dev_files
(
struct
usb_device
*
dev
);
extern
void
usb_create_
driver
fs_intf_files
(
struct
usb_interface
*
intf
);
extern
void
usb_create_
sys
fs_dev_files
(
struct
usb_device
*
dev
);
extern
void
usb_create_
sys
fs_intf_files
(
struct
usb_interface
*
intf
);
extern
int
usb_probe_interface
(
struct
device
*
dev
);
extern
int
usb_unbind_interface
(
struct
device
*
dev
);
...
...
drivers/usb/gadget/Kconfig
View file @
e9b73ef9
...
...
@@ -95,6 +95,7 @@ config USB_PXA2XX
config USB_PXA2XX_SMALL
depends on USB_GADGET_PXA2XX
bool
default n if USB_ETH_RNDIS
default y if USB_ZERO
default y if USB_ETH
default y if USB_G_SERIAL
...
...
drivers/usb/gadget/epautoconf.c
View file @
e9b73ef9
...
...
@@ -96,7 +96,8 @@ ep_matches (
/* for now, avoid PXA "interrupt-in";
* it's documented as never using DATA1.
*/
if
(
gadget_is_pxa
(
gadget
))
if
(
gadget_is_pxa
(
gadget
)
&&
'i'
==
tmp
[
1
])
return
0
;
break
;
case
USB_ENDPOINT_XFER_BULK
:
...
...
drivers/usb/gadget/serial.c
View file @
e9b73ef9
...
...
@@ -154,14 +154,9 @@ do { \
#define GS_CLOSE_TIMEOUT 15
/* debug
macro
*/
/* debug
settings
*/
#if G_SERIAL_DEBUG
static
int
debug
=
G_SERIAL_DEBUG
;
#else
static
int
debug
=
0
;
#endif
#if G_SERIAL_DEBUG
#define gs_debug(format, arg...) \
do { if (debug) printk(KERN_DEBUG format, ## arg); } while(0)
...
...
@@ -598,8 +593,10 @@ MODULE_DESCRIPTION(GS_LONG_NAME);
MODULE_AUTHOR
(
"Al Borchers"
);
MODULE_LICENSE
(
"GPL"
);
#if G_SERIAL_DEBUG
MODULE_PARM
(
debug
,
"i"
);
MODULE_PARM_DESC
(
debug
,
"Enable debugging, 0=off, 1=on"
);
#endif
MODULE_PARM
(
read_q_size
,
"i"
);
MODULE_PARM_DESC
(
read_q_size
,
"Read request queue size, default=32"
);
...
...
drivers/usb/host/uhci-hcd.c
View file @
e9b73ef9
...
...
@@ -95,6 +95,10 @@ static kmem_cache_t *uhci_up_cachep; /* urb_priv */
static
int
uhci_get_current_frame_number
(
struct
uhci_hcd
*
uhci
);
static
int
uhci_urb_dequeue
(
struct
usb_hcd
*
hcd
,
struct
urb
*
urb
);
static
void
uhci_unlink_generic
(
struct
uhci_hcd
*
uhci
,
struct
urb
*
urb
);
static
void
uhci_remove_pending_urbps
(
struct
uhci_hcd
*
uhci
);
static
void
uhci_finish_completion
(
struct
usb_hcd
*
hcd
,
struct
pt_regs
*
regs
);
static
void
uhci_free_pending_qhs
(
struct
uhci_hcd
*
uhci
);
static
void
uhci_free_pending_tds
(
struct
uhci_hcd
*
uhci
);
static
void
hc_state_transitions
(
struct
uhci_hcd
*
uhci
);
...
...
@@ -373,6 +377,7 @@ static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
{
struct
uhci_qh
*
pqh
;
u32
newlink
;
unsigned
int
age
;
if
(
!
qh
)
return
;
...
...
@@ -425,6 +430,12 @@ static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
list_del_init
(
&
qh
->
urbp
->
queue_list
);
qh
->
urbp
=
NULL
;
age
=
uhci_get_current_frame_number
(
uhci
);
if
(
age
!=
uhci
->
qh_remove_age
)
{
uhci_free_pending_qhs
(
uhci
);
uhci
->
qh_remove_age
=
age
;
}
/* Check to see if the remove list is empty. Set the IOC bit */
/* to force an interrupt so we can remove the QH */
if
(
list_empty
(
&
uhci
->
qh_remove_list
))
...
...
@@ -628,6 +639,7 @@ static void uhci_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
{
struct
list_head
*
head
,
*
tmp
;
struct
urb_priv
*
urbp
;
unsigned
int
age
;
urbp
=
(
struct
urb_priv
*
)
urb
->
hcpriv
;
if
(
!
urbp
)
...
...
@@ -637,6 +649,12 @@ static void uhci_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
dev_warn
(
uhci_dev
(
uhci
),
"urb %p still on uhci->urb_list "
"or uhci->remove_list!
\n
"
,
urb
);
age
=
uhci_get_current_frame_number
(
uhci
);
if
(
age
!=
uhci
->
td_remove_age
)
{
uhci_free_pending_tds
(
uhci
);
uhci
->
td_remove_age
=
age
;
}
/* Check to see if the remove list is empty. Set the IOC bit */
/* to force an interrupt so we can remove the TD's*/
if
(
list_empty
(
&
uhci
->
td_remove_list
))
...
...
@@ -1512,6 +1530,7 @@ static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
struct
uhci_hcd
*
uhci
=
hcd_to_uhci
(
hcd
);
unsigned
long
flags
;
struct
urb_priv
*
urbp
;
unsigned
int
age
;
spin_lock_irqsave
(
&
uhci
->
schedule_lock
,
flags
);
urbp
=
urb
->
hcpriv
;
...
...
@@ -1521,6 +1540,12 @@ static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
uhci_unlink_generic
(
uhci
,
urb
);
age
=
uhci_get_current_frame_number
(
uhci
);
if
(
age
!=
uhci
->
urb_remove_age
)
{
uhci_remove_pending_urbps
(
uhci
);
uhci
->
urb_remove_age
=
age
;
}
/* If we're the first, set the next interrupt bit */
if
(
list_empty
(
&
uhci
->
urb_remove_list
))
uhci_set_next_interrupt
(
uhci
);
...
...
@@ -1590,6 +1615,12 @@ static void stall_callback(unsigned long ptr)
INIT_LIST_HEAD
(
&
list
);
spin_lock_irqsave
(
&
uhci
->
schedule_lock
,
flags
);
if
(
!
list_empty
(
&
uhci
->
urb_remove_list
)
&&
uhci_get_current_frame_number
(
uhci
)
!=
uhci
->
urb_remove_age
)
{
uhci_remove_pending_urbps
(
uhci
);
uhci_finish_completion
(
hcd
,
NULL
);
}
head
=
&
uhci
->
urb_list
;
tmp
=
head
->
next
;
while
(
tmp
!=
head
)
{
...
...
@@ -1728,6 +1759,7 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs)
unsigned
int
io_addr
=
uhci
->
io_addr
;
unsigned
short
status
;
struct
list_head
*
tmp
,
*
head
;
unsigned
int
age
;
/*
* Read the interrupt status, and write it back to clear the
...
...
@@ -1758,11 +1790,20 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs)
spin_lock
(
&
uhci
->
schedule_lock
);
age
=
uhci_get_current_frame_number
(
uhci
);
if
(
age
!=
uhci
->
qh_remove_age
)
uhci_free_pending_qhs
(
uhci
);
if
(
age
!=
uhci
->
td_remove_age
)
uhci_free_pending_tds
(
uhci
);
if
(
age
!=
uhci
->
urb_remove_age
)
uhci_remove_pending_urbps
(
uhci
);
if
(
list_empty
(
&
uhci
->
urb_remove_list
)
&&
list_empty
(
&
uhci
->
td_remove_list
)
&&
list_empty
(
&
uhci
->
qh_remove_list
))
uhci_clear_next_interrupt
(
uhci
);
else
uhci_set_next_interrupt
(
uhci
);
/* Walk the list of pending URB's to see which ones completed */
head
=
&
uhci
->
urb_list
;
...
...
drivers/usb/host/uhci-hcd.h
View file @
e9b73ef9
...
...
@@ -357,12 +357,15 @@ struct uhci_hcd {
/* List of QH's that are done, but waiting to be unlinked (race) */
struct
list_head
qh_remove_list
;
/* P: uhci->schedule_lock */
unsigned
int
qh_remove_age
;
/* Age in frames */
/* List of TD's that are done, but waiting to be freed (race) */
struct
list_head
td_remove_list
;
/* P: uhci->schedule_lock */
unsigned
int
td_remove_age
;
/* Age in frames */
/* List of asynchronously unlinked URB's */
struct
list_head
urb_remove_list
;
/* P: uhci->schedule_lock */
unsigned
int
urb_remove_age
;
/* Age in frames */
/* List of URB's awaiting completion callback */
struct
list_head
complete_list
;
/* P: uhci->schedule_lock */
...
...
drivers/usb/input/hiddev.c
View file @
e9b73ef9
...
...
@@ -232,7 +232,7 @@ static int hiddev_fasync(int fd, struct file *file, int on)
static
struct
usb_class_driver
hiddev_class
;
static
void
hiddev_cleanup
(
struct
hiddev
*
hiddev
)
{
hiddev_table
[
hiddev
->
hid
->
minor
]
=
NULL
;
hiddev_table
[
hiddev
->
hid
->
minor
-
HIDDEV_MINOR_BASE
]
=
NULL
;
usb_deregister_dev
(
hiddev
->
hid
->
intf
,
&
hiddev_class
);
kfree
(
hiddev
);
}
...
...
drivers/usb/input/powermate.c
View file @
e9b73ef9
...
...
@@ -33,6 +33,7 @@
#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/usb.h>
#define POWERMATE_VENDOR 0x077d
/* Griffin Technology, Inc. */
...
...
@@ -67,7 +68,7 @@ struct powermate_device {
dma_addr_t
configcr_dma
;
struct
usb_device
*
udev
;
struct
input_dev
input
;
s
truct
semaphore
lock
;
s
pinlock_t
lock
;
int
static_brightness
;
int
pulse_speed
;
int
pulse_table
;
...
...
@@ -116,7 +117,7 @@ static void powermate_irq(struct urb *urb, struct pt_regs *regs)
__FUNCTION__
,
retval
);
}
/* Decide if we need to issue a control message and do so. Must be called with pm->lock
dow
n */
/* Decide if we need to issue a control message and do so. Must be called with pm->lock
take
n */
static
void
powermate_sync_state
(
struct
powermate_device
*
pm
)
{
if
(
pm
->
requires_update
==
0
)
...
...
@@ -194,19 +195,22 @@ static void powermate_sync_state(struct powermate_device *pm)
static
void
powermate_config_complete
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
{
struct
powermate_device
*
pm
=
urb
->
context
;
unsigned
long
flags
;
if
(
urb
->
status
)
printk
(
KERN_ERR
"powermate: config urb returned %d
\n
"
,
urb
->
status
);
down
(
&
pm
->
lock
);
spin_lock_irqsave
(
&
pm
->
lock
,
flags
);
powermate_sync_state
(
pm
);
up
(
&
pm
->
lock
);
spin_unlock_irqrestore
(
&
pm
->
lock
,
flags
);
}
/* Set the LED up as described and begin the sync with the hardware if required */
static
void
powermate_pulse_led
(
struct
powermate_device
*
pm
,
int
static_brightness
,
int
pulse_speed
,
int
pulse_table
,
int
pulse_asleep
,
int
pulse_awake
)
{
unsigned
long
flags
;
if
(
pulse_speed
<
0
)
pulse_speed
=
0
;
if
(
pulse_table
<
0
)
...
...
@@ -219,7 +223,8 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne
pulse_asleep
=
!!
pulse_asleep
;
pulse_awake
=
!!
pulse_awake
;
down
(
&
pm
->
lock
);
spin_lock_irqsave
(
&
pm
->
lock
,
flags
);
/* mark state updates which are required */
if
(
static_brightness
!=
pm
->
static_brightness
){
...
...
@@ -242,7 +247,7 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne
powermate_sync_state
(
pm
);
up
(
&
pm
->
lock
);
spin_unlock_irqrestore
(
&
pm
->
lock
,
flags
);
}
/* Callback from the Input layer when an event arrives from userspace to configure the LED */
...
...
@@ -344,7 +349,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
return
-
ENOMEM
;
}
init_MUTEX
(
&
pm
->
lock
)
;
pm
->
lock
=
SPIN_LOCK_UNLOCKED
;
init_input_dev
(
&
pm
->
input
);
/* get a handle to the interrupt data pipe */
...
...
@@ -411,7 +416,6 @@ static void powermate_disconnect(struct usb_interface *intf)
usb_set_intfdata
(
intf
,
NULL
);
if
(
pm
)
{
down
(
&
pm
->
lock
);
pm
->
requires_update
=
0
;
usb_unlink_urb
(
pm
->
irq
);
input_unregister_device
(
&
pm
->
input
);
...
...
drivers/usb/net/kaweth.c
View file @
e9b73ef9
...
...
@@ -1240,20 +1240,21 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
init_waitqueue_head
(
&
awd
.
wqh
);
awd
.
done
=
0
;
set_current_state
(
TASK_INTERRUPTIBLE
);
add_wait_queue
(
&
awd
.
wqh
,
&
wait
);
urb
->
context
=
&
awd
;
status
=
usb_submit_urb
(
urb
,
GFP_
ATOMIC
);
status
=
usb_submit_urb
(
urb
,
GFP_
NOIO
);
if
(
status
)
{
// something went wrong
usb_free_urb
(
urb
);
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
&
awd
.
wqh
,
&
wait
);
return
status
;
}
while
(
timeout
&&
!
awd
.
done
)
set_current_state
(
TASK_UNINTERRUPTIBLE
);
while
(
timeout
&&
!
awd
.
done
)
{
timeout
=
schedule_timeout
(
timeout
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
}
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
&
awd
.
wqh
,
&
wait
);
...
...
drivers/usb/net/pegasus.h
View file @
e9b73ef9
...
...
@@ -136,6 +136,7 @@ struct usb_eth_dev {
#define VENDOR_LANEED 0x056e
#define VENDOR_LINKSYS 0x066b
#define VENDOR_MELCO 0x0411
#define VENDOR_MICROSOFT 0x045e
#define VENDOR_MOBILITY 0x1342
#define VENDOR_NETGEAR 0x0846
#define VENDOR_OCT 0x0b39
...
...
@@ -265,6 +266,8 @@ PEGASUS_DEV( "MELCO/BUFFALO LUA-TX", VENDOR_MELCO, 0x0005,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"MELCO/BUFFALO LUA2-TX"
,
VENDOR_MELCO
,
0x0009
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"Microsoft MN-110"
,
VENDOR_MICROSOFT
,
0x007a
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"NETGEAR FA101"
,
VENDOR_NETGEAR
,
0x1020
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"OCT Inc."
,
VENDOR_OCT
,
0x0109
,
...
...
drivers/usb/serial/Kconfig
View file @
e9b73ef9
...
...
@@ -314,8 +314,8 @@ config USB_SERIAL_KLSI
module will be called kl5kusb105.
config USB_SERIAL_KOBIL_SCT
tristate "USB KOBIL chipcard reader
(EXPERIMENTAL)
"
depends on USB_SERIAL
&& EXPERIMENTAL
tristate "USB KOBIL chipcard reader"
depends on USB_SERIAL
---help---
Say Y here if you want to use one of the following KOBIL USB chipcard
readers:
...
...
drivers/usb/serial/ftdi_sio.c
View file @
e9b73ef9
...
...
@@ -17,6 +17,9 @@
* See http://ftdi-usb-sio.sourceforge.net for upto date testing info
* and extra documentation
*
* (27/May/2004) Ian Abbott
* Improved throttling code, mostly stolen from the WhiteHEAT driver.
*
* (26/Mar/2004) Jan Capek
* Added PID's for ICD-U20/ICD-U40 - incircuit PIC debuggers from CCS Inc.
*
...
...
@@ -584,6 +587,10 @@ static struct usb_driver ftdi_driver = {
#define BUFSZ 512
#define PKTSZ 64
/* rx_flags */
#define THROTTLED 0x01
#define ACTUALLY_THROTTLED 0x02
struct
ftdi_private
{
ftdi_chip_type_t
chip_type
;
/* type of the device, either SIO or FT8U232AM */
...
...
@@ -598,6 +605,8 @@ struct ftdi_private {
unsigned
long
last_dtr_rts
;
/* saved modem control outputs */
wait_queue_head_t
delta_msr_wait
;
/* Used for TIOCMIWAIT */
char
prev_status
,
diff_status
;
/* Used for TIOCMIWAIT */
__u8
rx_flags
;
/* receive state flags (throttling) */
spinlock_t
rx_lock
;
/* spinlock for receive state */
int
force_baud
;
/* if non-zero, force the baud rate to this value */
int
force_rtscts
;
/* if non-zero, force RTS-CTS to always be enabled */
...
...
@@ -625,6 +634,7 @@ static int ftdi_write_room (struct usb_serial_port *port);
static
int
ftdi_chars_in_buffer
(
struct
usb_serial_port
*
port
);
static
void
ftdi_write_bulk_callback
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
);
static
void
ftdi_read_bulk_callback
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
);
static
void
ftdi_process_read
(
struct
usb_serial_port
*
port
);
static
void
ftdi_set_termios
(
struct
usb_serial_port
*
port
,
struct
termios
*
old
);
static
int
ftdi_tiocmget
(
struct
usb_serial_port
*
port
,
struct
file
*
file
);
static
int
ftdi_tiocmset
(
struct
usb_serial_port
*
port
,
struct
file
*
file
,
unsigned
int
set
,
unsigned
int
clear
);
...
...
@@ -1110,6 +1120,7 @@ static int ftdi_common_startup (struct usb_serial *serial)
}
memset
(
priv
,
0
,
sizeof
(
*
priv
));
spin_lock_init
(
&
priv
->
rx_lock
);
init_waitqueue_head
(
&
priv
->
delta_msr_wait
);
/* This will push the characters through immediately rather
than queue a task to deliver them */
...
...
@@ -1273,8 +1284,8 @@ static void ftdi_shutdown (struct usb_serial *serial)
*/
if
(
priv
)
{
kfree
(
priv
);
usb_set_serial_port_data
(
port
,
NULL
);
kfree
(
priv
);
}
}
/* ftdi_shutdown */
...
...
@@ -1284,6 +1295,7 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
struct
termios
tmp_termios
;
struct
usb_device
*
dev
=
port
->
serial
->
dev
;
struct
ftdi_private
*
priv
=
usb_get_serial_port_data
(
port
);
unsigned
long
flags
;
int
result
=
0
;
char
buf
[
1
];
/* Needed for the usb_control_msg I think */
...
...
@@ -1317,6 +1329,11 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
err
(
"%s Error from RTS HIGH urb"
,
__FUNCTION__
);
}
/* Not throttled */
spin_lock_irqsave
(
&
priv
->
rx_lock
,
flags
);
priv
->
rx_flags
&=
~
(
THROTTLED
|
ACTUALLY_THROTTLED
);
spin_unlock_irqrestore
(
&
priv
->
rx_lock
,
flags
);
/* Start reading from the device */
usb_fill_bulk_urb
(
port
->
read_urb
,
dev
,
usb_rcvbulkpipe
(
dev
,
port
->
bulk_in_endpointAddress
),
...
...
@@ -1370,7 +1387,12 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp)
/* shutdown our bulk read */
if
(
port
->
read_urb
)
{
if
(
usb_unlink_urb
(
port
->
read_urb
)
<
0
)
{
err
(
"Error unlinking read urb"
);
/* Generally, this isn't an error. If the previous
read bulk callback occurred (or is about to occur)
while the port was being closed or was throtted
(and is still throttled), the read urb will not
have been submitted. */
dbg
(
"%s - failed to unlink read urb (generally not an error)"
,
__FUNCTION__
);
}
}
}
/* ftdi_close */
...
...
@@ -1546,13 +1568,6 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
struct
usb_serial_port
*
port
=
(
struct
usb_serial_port
*
)
urb
->
context
;
struct
tty_struct
*
tty
;
struct
ftdi_private
*
priv
;
char
error_flag
;
unsigned
char
*
data
=
urb
->
transfer_buffer
;
int
i
;
int
result
;
int
need_flip
;
int
packet_offset
;
if
(
urb
->
number_of_packets
>
0
)
{
err
(
"%s transfer_buffer_length %d actual_length %d number of packets %d"
,
__FUNCTION__
,
...
...
@@ -1560,7 +1575,7 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
err
(
"%s transfer_flags %x "
,
__FUNCTION__
,
urb
->
transfer_flags
);
}
dbg
(
"%s
"
,
__FUNCTION__
);
dbg
(
"%s
- port %d"
,
__FUNCTION__
,
port
->
number
);
if
(
port
->
open_count
<=
0
)
return
;
...
...
@@ -1572,6 +1587,14 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
}
priv
=
usb_get_serial_port_data
(
port
);
if
(
!
priv
)
{
dbg
(
"%s - bad port private data pointer - exiting"
,
__FUNCTION__
);
return
;
}
if
(
urb
!=
port
->
read_urb
)
{
err
(
"%s - Not my urb!"
,
__FUNCTION__
);
}
if
(
urb
->
status
)
{
/* This will happen at close every time so it is a dbg not an err */
...
...
@@ -1579,6 +1602,59 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
return
;
}
/* If throttled, delay receive processing until unthrottled. */
spin_lock
(
&
priv
->
rx_lock
);
if
(
priv
->
rx_flags
&
THROTTLED
)
{
dbg
(
"Deferring read urb processing until unthrottled"
);
priv
->
rx_flags
|=
ACTUALLY_THROTTLED
;
spin_unlock
(
&
priv
->
rx_lock
);
return
;
}
spin_unlock
(
&
priv
->
rx_lock
);
ftdi_process_read
(
port
);
}
/* ftdi_read_bulk_callback */
static
void
ftdi_process_read
(
struct
usb_serial_port
*
port
)
{
/* ftdi_process_read */
struct
urb
*
urb
;
struct
tty_struct
*
tty
;
struct
ftdi_private
*
priv
;
char
error_flag
;
unsigned
char
*
data
;
int
i
;
int
result
;
int
need_flip
;
int
packet_offset
;
dbg
(
"%s - port %d"
,
__FUNCTION__
,
port
->
number
);
if
(
port
->
open_count
<=
0
)
return
;
tty
=
port
->
tty
;
if
(
!
tty
)
{
dbg
(
"%s - bad tty pointer - exiting"
,
__FUNCTION__
);
return
;
}
priv
=
usb_get_serial_port_data
(
port
);
if
(
!
priv
)
{
dbg
(
"%s - bad port private data pointer - exiting"
,
__FUNCTION__
);
return
;
}
urb
=
port
->
read_urb
;
if
(
!
urb
)
{
dbg
(
"%s - bad read_urb pointer - exiting"
,
__FUNCTION__
);
return
;
}
data
=
urb
->
transfer_buffer
;
/* The first two bytes of every read packet are status */
if
(
urb
->
actual_length
>
2
)
{
usb_serial_debug_data
(
__FILE__
,
__FUNCTION__
,
urb
->
actual_length
,
data
);
...
...
@@ -1683,7 +1759,7 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
}
return
;
}
/* ftdi_
read_bulk_callback
*/
}
/* ftdi_
process_read
*/
static
void
ftdi_break_ctl
(
struct
usb_serial_port
*
port
,
int
break_state
)
...
...
@@ -2073,27 +2149,32 @@ static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigne
static
void
ftdi_throttle
(
struct
usb_serial_port
*
port
)
{
struct
ftdi_private
*
priv
=
usb_get_serial_port_data
(
port
);
unsigned
long
flags
;
dbg
(
"%s - port %d"
,
__FUNCTION__
,
port
->
number
);
usb_unlink_urb
(
port
->
read_urb
);
spin_lock_irqsave
(
&
priv
->
rx_lock
,
flags
);
priv
->
rx_flags
|=
THROTTLED
;
spin_unlock_irqrestore
(
&
priv
->
rx_lock
,
flags
);
}
static
void
ftdi_unthrottle
(
struct
usb_serial_port
*
port
)
{
int
result
;
struct
ftdi_private
*
priv
=
usb_get_serial_port_data
(
port
);
int
actually_throttled
;
unsigned
long
flags
;
dbg
(
"%s - port %d"
,
__FUNCTION__
,
port
->
number
);
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
spin_lock_irqsave
(
&
priv
->
rx_lock
,
flags
);
actually_throttled
=
priv
->
rx_flags
&
ACTUALLY_THROTTLED
;
priv
->
rx_flags
&=
~
(
THROTTLED
|
ACTUALLY_THROTTLED
);
spin_unlock_irqrestore
(
&
priv
->
rx_lock
,
flags
);
usb_fill_bulk_urb
(
port
->
read_urb
,
port
->
serial
->
dev
,
usb_rcvbulkpipe
(
port
->
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ftdi_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_ATOMIC
);
if
(
result
)
err
(
"%s - failed submitting read urb, error %d"
,
__FUNCTION__
,
result
);
if
(
actually_throttled
)
ftdi_process_read
(
port
);
}
static
int
__init
ftdi_init
(
void
)
...
...
drivers/usb/serial/kobil_sct.c
View file @
e9b73ef9
...
...
@@ -21,6 +21,9 @@
* Supported readers: USB TWIN, KAAN Standard Plus and SecOVID Reader Plus
* (Adapter K), B1 Professional and KAAN Professional (Adapter B)
*
* (21/05/2004) tw
* Fix bug with P'n'P readers
*
* (28/05/2003) tw
* Add support for KAAN SIM
*
...
...
@@ -59,7 +62,7 @@
#include "usb-serial.h"
/* Version Information */
#define DRIVER_VERSION "2
8/05/2003
"
#define DRIVER_VERSION "2
1/05/2004
"
#define DRIVER_AUTHOR "KOBIL Systems GmbH - http://www.kobil.com"
#define DRIVER_DESC "KOBIL USB Smart Card Terminal Driver (experimental)"
...
...
@@ -339,6 +342,12 @@ static int kobil_open (struct usb_serial_port *port, struct file *filp)
);
dbg
(
"%s - port %d Send reset_all_queues URB returns: %i"
,
__FUNCTION__
,
port
->
number
,
result
);
}
if
(
priv
->
device_type
==
KOBIL_USBTWIN_PRODUCT_ID
||
priv
->
device_type
==
KOBIL_ADAPTER_B_PRODUCT_ID
||
priv
->
device_type
==
KOBIL_KAAN_SIM_PRODUCT_ID
)
{
// start reading (Adapter B 'cause PNP string)
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_ATOMIC
);
dbg
(
"%s - port %d Send read URB returns: %i"
,
__FUNCTION__
,
port
->
number
,
result
);
}
kfree
(
transfer_buffer
);
return
0
;
...
...
@@ -456,6 +465,11 @@ static int kobil_write (struct usb_serial_port *port, int from_user,
if
(
((
priv
->
device_type
!=
KOBIL_ADAPTER_B_PRODUCT_ID
)
&&
(
priv
->
filled
>
2
)
&&
(
priv
->
filled
>=
(
priv
->
buf
[
1
]
+
3
)))
||
((
priv
->
device_type
==
KOBIL_ADAPTER_B_PRODUCT_ID
)
&&
(
priv
->
filled
>
3
)
&&
(
priv
->
filled
>=
(
priv
->
buf
[
2
]
+
4
)))
)
{
// stop reading (except TWIN and KAAN SIM)
if
(
(
priv
->
device_type
==
KOBIL_ADAPTER_B_PRODUCT_ID
)
||
(
priv
->
device_type
==
KOBIL_ADAPTER_K_PRODUCT_ID
)
)
{
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
todo
=
priv
->
filled
-
priv
->
cur_pos
;
while
(
todo
>
0
)
{
...
...
@@ -463,25 +477,23 @@ static int kobil_write (struct usb_serial_port *port, int from_user,
length
=
(
todo
<
8
)
?
todo
:
8
;
// copy data to transfer buffer
memcpy
(
port
->
write_urb
->
transfer_buffer
,
priv
->
buf
+
priv
->
cur_pos
,
length
);
usb_fill_bulk_urb
(
port
->
write_urb
,
usb_fill_int_urb
(
port
->
write_urb
,
port
->
serial
->
dev
,
usb_sndbulkpipe
(
port
->
serial
->
dev
,
priv
->
write_int_endpoint_address
),
usb_sndintpipe
(
port
->
serial
->
dev
,
priv
->
write_int_endpoint_address
),
port
->
write_urb
->
transfer_buffer
,
length
,
kobil_write_callback
,
port
port
,
8
);
priv
->
cur_pos
=
priv
->
cur_pos
+
length
;
result
=
usb_submit_urb
(
port
->
write_urb
,
GFP_
ATOMIC
);
result
=
usb_submit_urb
(
port
->
write_urb
,
GFP_
NOIO
);
dbg
(
"%s - port %d Send write URB returns: %i"
,
__FUNCTION__
,
port
->
number
,
result
);
todo
=
priv
->
filled
-
priv
->
cur_pos
;
if
(
todo
>
0
)
{
//mdelay(16);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
24
*
HZ
/
1000
);
msleep
(
24
);
}
}
// end while
...
...
@@ -492,10 +504,15 @@ static int kobil_write (struct usb_serial_port *port, int from_user,
// someone sets the dev to 0 if the close method has been called
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
// start reading
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_ATOMIC
);
// start reading (except TWIN and KAAN SIM)
if
(
(
priv
->
device_type
==
KOBIL_ADAPTER_B_PRODUCT_ID
)
||
(
priv
->
device_type
==
KOBIL_ADAPTER_K_PRODUCT_ID
)
)
{
// someone sets the dev to 0 if the close method has been called
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_NOIO
);
dbg
(
"%s - port %d Send read URB returns: %i"
,
__FUNCTION__
,
port
->
number
,
result
);
}
}
return
count
;
}
...
...
drivers/usb/serial/visor.c
View file @
e9b73ef9
...
...
@@ -680,7 +680,7 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
char
*
string
;
int
retval
=
0
;
int
i
;
int
num_ports
;
int
num_ports
=
0
;
dbg
(
"%s"
,
__FUNCTION__
);
...
...
@@ -703,15 +703,11 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
goto
exit
;
}
if
(
retval
==
sizeof
(
*
connection_info
))
{
connection_info
=
(
struct
visor_connection_info
*
)
transfer_buffer
;
le16_to_cpus
(
&
connection_info
->
num_ports
);
num_ports
=
connection_info
->
num_ports
;
/* handle devices that report invalid stuff here */
if
(
num_ports
>
2
)
num_ports
=
2
;
dev_info
(
dev
,
"%s: Number of ports: %d
\n
"
,
serial
->
type
->
name
,
connection_info
->
num_ports
);
for
(
i
=
0
;
i
<
num_ports
;
++
i
)
{
switch
(
connection_info
->
connections
[
i
].
port_function_id
)
{
...
...
@@ -734,9 +730,22 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
string
=
"unknown"
;
break
;
}
dev_info
(
dev
,
"%s: port %d, is for %s use
\n
"
,
serial
->
type
->
name
,
dev_info
(
dev
,
"%s: port %d, is for %s use
\n
"
,
serial
->
type
->
name
,
connection_info
->
connections
[
i
].
port
,
string
);
}
}
/*
* Handle devices that report invalid stuff here.
*/
if
(
num_ports
==
0
||
num_ports
>
2
)
{
dev_warn
(
dev
,
"%s: No valid connect info available
\n
"
,
serial
->
type
->
name
);
num_ports
=
2
;
}
dev_info
(
dev
,
"%s: Number of ports: %d
\n
"
,
serial
->
type
->
name
,
num_ports
);
/*
* save off our num_ports info so that we can use it in the
...
...
@@ -868,8 +877,7 @@ static int clie_3_5_startup (struct usb_serial *serial)
static
int
treo_attach
(
struct
usb_serial
*
serial
)
{
struct
usb_serial_port
*
port
;
int
i
;
struct
usb_serial_port
*
swap_port
;
/* Only do this endpoint hack for the Handspring devices with
* interrupt in endpoints, which for now are the Treo devices. */
...
...
@@ -879,31 +887,28 @@ static int treo_attach (struct usb_serial *serial)
dbg
(
"%s"
,
__FUNCTION__
);
/* Ok, this is pretty ugly, but these devices want to use the
* interrupt endpoint as paired up with a bulk endpoint for a
* "virtual serial port". So let's force the endpoints to be
* where we want them to be. */
for
(
i
=
serial
->
num_bulk_in
;
i
<
serial
->
num_ports
;
++
i
)
{
port
=
serial
->
port
[
i
];
port
->
read_urb
=
serial
->
port
[
0
]
->
read_urb
;
port
->
bulk_in_endpointAddress
=
serial
->
port
[
0
]
->
bulk_in_endpointAddress
;
port
->
bulk_in_buffer
=
serial
->
port
[
0
]
->
bulk_in_buffer
;
}
for
(
i
=
serial
->
num_bulk_out
;
i
<
serial
->
num_ports
;
++
i
)
{
port
=
serial
->
port
[
i
];
port
->
write_urb
=
serial
->
port
[
0
]
->
write_urb
;
port
->
bulk_out_size
=
serial
->
port
[
0
]
->
bulk_out_size
;
port
->
bulk_out_endpointAddress
=
serial
->
port
[
0
]
->
bulk_out_endpointAddress
;
port
->
bulk_out_buffer
=
serial
->
port
[
0
]
->
bulk_out_buffer
;
}
for
(
i
=
serial
->
num_interrupt_in
;
i
<
serial
->
num_ports
;
++
i
)
{
port
=
serial
->
port
[
i
];
port
->
interrupt_in_urb
=
serial
->
port
[
0
]
->
interrupt_in_urb
;
port
->
interrupt_in_endpointAddress
=
serial
->
port
[
0
]
->
interrupt_in_endpointAddress
;
port
->
interrupt_in_buffer
=
serial
->
port
[
0
]
->
interrupt_in_buffer
;
}
/*
* It appears that Treos want to use the 1st interrupt endpoint to
* communicate with the 2nd bulk out endpoint, so let's swap the 1st
* and 2nd bulk in and interrupt endpoints. Note that swapping the
* bulk out endpoints would break lots of apps that want to communicate
* on the second port.
*/
#define COPY_PORT(dest, src) \
dest->read_urb = src->read_urb; \
dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress; \
dest->bulk_in_buffer = src->bulk_in_buffer; \
dest->interrupt_in_urb = src->interrupt_in_urb; \
dest->interrupt_in_endpointAddress = src->interrupt_in_endpointAddress; \
dest->interrupt_in_buffer = src->interrupt_in_buffer;
swap_port
=
kmalloc
(
sizeof
(
*
swap_port
),
GFP_KERNEL
);
if
(
!
swap_port
)
return
-
ENOMEM
;
COPY_PORT
(
swap_port
,
serial
->
port
[
0
]);
COPY_PORT
(
serial
->
port
[
0
],
serial
->
port
[
1
]);
COPY_PORT
(
serial
->
port
[
1
],
swap_port
);
kfree
(
swap_port
);
return
0
;
}
...
...
drivers/usb/storage/transport.c
View file @
e9b73ef9
...
...
@@ -1112,8 +1112,7 @@ static int usb_stor_reset_common(struct us_data *us,
/* long wait for reset, so unlock to allow disconnects */
up
(
&
us
->
dev_semaphore
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
HZ
*
6
);
msleep
(
6000
);
down
(
&
us
->
dev_semaphore
);
if
(
test_bit
(
US_FLIDX_DISCONNECTING
,
&
us
->
flags
))
{
US_DEBUGP
(
"Reset interrupted by disconnect
\n
"
);
...
...
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