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
Kirill Smelkov
linux
Commits
c5fc26c9
Commit
c5fc26c9
authored
Dec 17, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linux-sound.bkbits.net/linux-sound
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
e1f8e356
59584359
Changes
39
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
521 additions
and
414 deletions
+521
-414
drivers/usb/core/hcd.c
drivers/usb/core/hcd.c
+2
-3
drivers/usb/core/hub.c
drivers/usb/core/hub.c
+36
-25
drivers/usb/core/inode.c
drivers/usb/core/inode.c
+5
-0
drivers/usb/host/ehci-dbg.c
drivers/usb/host/ehci-dbg.c
+31
-6
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hcd.c
+79
-80
drivers/usb/host/ehci-hub.c
drivers/usb/host/ehci-hub.c
+1
-1
drivers/usb/host/ehci-mem.c
drivers/usb/host/ehci-mem.c
+4
-1
drivers/usb/host/ehci-q.c
drivers/usb/host/ehci-q.c
+95
-94
drivers/usb/host/ehci-sched.c
drivers/usb/host/ehci-sched.c
+10
-16
drivers/usb/host/ehci.h
drivers/usb/host/ehci.h
+0
-3
drivers/usb/media/ibmcam.c
drivers/usb/media/ibmcam.c
+7
-7
drivers/usb/media/konicawc.c
drivers/usb/media/konicawc.c
+1
-1
drivers/usb/media/pwc-ctrl.c
drivers/usb/media/pwc-ctrl.c
+10
-2
drivers/usb/media/pwc-if.c
drivers/usb/media/pwc-if.c
+4
-5
drivers/usb/media/pwc-ioctl.h
drivers/usb/media/pwc-ioctl.h
+11
-2
drivers/usb/media/pwc-uncompress.h
drivers/usb/media/pwc-uncompress.h
+2
-2
drivers/usb/media/pwc.h
drivers/usb/media/pwc.h
+2
-2
drivers/usb/media/ultracam.c
drivers/usb/media/ultracam.c
+1
-1
drivers/usb/media/usbvideo.c
drivers/usb/media/usbvideo.c
+16
-16
drivers/usb/media/usbvideo.h
drivers/usb/media/usbvideo.h
+18
-18
drivers/usb/misc/speedtouch.c
drivers/usb/misc/speedtouch.c
+25
-20
drivers/usb/misc/usblcd.c
drivers/usb/misc/usblcd.c
+1
-1
drivers/usb/net/usbnet.c
drivers/usb/net/usbnet.c
+89
-79
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/belkin_sa.c
+1
-0
drivers/usb/serial/bus.c
drivers/usb/serial/bus.c
+4
-1
drivers/usb/serial/cyberjack.c
drivers/usb/serial/cyberjack.c
+1
-0
drivers/usb/serial/generic.c
drivers/usb/serial/generic.c
+1
-0
drivers/usb/serial/io_tables.h
drivers/usb/serial/io_tables.h
+4
-0
drivers/usb/serial/io_ti.c
drivers/usb/serial/io_ti.c
+2
-0
drivers/usb/serial/keyspan.h
drivers/usb/serial/keyspan.h
+4
-0
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/keyspan_pda.c
+3
-0
drivers/usb/serial/kl5kusb105.c
drivers/usb/serial/kl5kusb105.c
+1
-0
drivers/usb/serial/mct_u232.c
drivers/usb/serial/mct_u232.c
+1
-0
drivers/usb/serial/omninet.c
drivers/usb/serial/omninet.c
+1
-0
drivers/usb/serial/usb-serial.h
drivers/usb/serial/usb-serial.h
+4
-0
drivers/usb/serial/visor.c
drivers/usb/serial/visor.c
+2
-0
drivers/usb/serial/whiteheat.c
drivers/usb/serial/whiteheat.c
+4
-0
drivers/usb/storage/transport.c
drivers/usb/storage/transport.c
+24
-22
drivers/usb/storage/usb.c
drivers/usb/storage/usb.c
+14
-6
No files found.
drivers/usb/core/hcd.c
View file @
c5fc26c9
...
...
@@ -389,8 +389,8 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
break
;
case
DeviceOutRequest
|
USB_REQ_SET_ADDRESS
:
// wValue == urb->dev->devaddr
d
bg
(
"%s root hub device address %d
"
,
hcd
->
self
.
bus_name
,
wValue
);
d
ev_dbg
(
*
hcd
->
controller
,
"root hub device address %d
\n
"
,
wValue
);
break
;
/* INTERFACE REQUESTS (no defined feature/status flags) */
...
...
@@ -1188,7 +1188,6 @@ static int hcd_unlink_urb (struct urb *urb)
if
(
urb
->
transfer_flags
&
URB_ASYNC_UNLINK
)
return
-
EINPROGRESS
;
dev_dbg
(
*
sys
,
"wait for giveback urb %p
\n
"
,
urb
);
wait_for_completion
(
&
splice
.
done
);
return
0
;
...
...
drivers/usb/core/hub.c
View file @
c5fc26c9
...
...
@@ -57,6 +57,12 @@ static inline char *portspeed (int portstatus)
}
#endif
/* for dev_info, dev_dbg, etc */
static
inline
struct
device
*
hubdev
(
struct
usb_device
*
dev
)
{
return
&
dev
->
actconfig
->
interface
[
0
].
dev
;
}
/* USB 2.0 spec Section 11.24.4.5 */
static
int
usb_get_hub_descriptor
(
struct
usb_device
*
dev
,
void
*
data
,
int
size
)
{
...
...
@@ -298,7 +304,7 @@ static int usb_hub_configure(struct usb_hub *hub,
}
dev
->
maxchild
=
hub
->
descriptor
->
bNbrPorts
;
info
(
"%d port%s detected
"
,
dev
->
maxchild
,
dev_info
(
*
hubdev
(
dev
),
"%d port%s detected
\n
"
,
dev
->
maxchild
,
(
dev
->
maxchild
==
1
)
?
""
:
"s"
);
le16_to_cpus
(
&
hub
->
descriptor
->
wHubCharacteristics
);
...
...
@@ -521,7 +527,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
}
/* We found a hub */
info
(
"USB hub found at %s"
,
dev
->
devpath
);
dev_info
(
*
hubdev
(
dev
),
"USB hub found
\n
"
);
hub
=
kmalloc
(
sizeof
(
*
hub
),
GFP_KERNEL
);
if
(
!
hub
)
{
...
...
@@ -651,8 +657,6 @@ static int usb_hub_port_status(struct usb_device *hub, int port,
else
{
*
status
=
le16_to_cpu
(
portsts
->
wPortStatus
);
*
change
=
le16_to_cpu
(
portsts
->
wPortChange
);
dbg
(
"port %d, portstatus %x, change %x, %s"
,
port
+
1
,
*
status
,
*
change
,
portspeed
(
*
status
));
ret
=
0
;
}
kfree
(
portsts
);
...
...
@@ -710,8 +714,9 @@ static int usb_hub_port_wait_reset(struct usb_device *hub, int port,
if
(
delay_time
>=
2
*
HUB_SHORT_RESET_TIME
)
delay
=
HUB_LONG_RESET_TIME
;
dbg
(
"port %d of hub %s not reset yet, waiting %dms"
,
port
+
1
,
hub
->
devpath
,
delay
);
dev_dbg
(
*
hubdev
(
hub
),
"port %d not reset yet, waiting %dms
\n
"
,
port
+
1
,
delay
);
}
return
-
1
;
...
...
@@ -735,14 +740,15 @@ static int usb_hub_port_reset(struct usb_device *hub, int port,
return
status
;
}
dbg
(
"port %d of hub %s not enabled, trying reset again..."
,
port
+
1
,
hub
->
devpath
);
dev_dbg
(
*
hubdev
(
hub
),
"port %d not enabled, trying reset again...
\n
"
,
port
+
1
);
delay
=
HUB_LONG_RESET_TIME
;
}
err
(
"Cannot enable port %i of hub %s, disabling port."
,
port
+
1
,
hub
->
devpath
);
err
(
"Maybe the USB cable is bad?"
);
dev_err
(
*
hubdev
(
hub
)
,
"Cannot enable port %i. Maybe the USB cable is bad?
\n
"
,
port
+
1
);
return
-
1
;
}
...
...
@@ -808,8 +814,9 @@ static int usb_hub_port_debounce(struct usb_device *hub, int port)
}
/* XXX Replace this with dbg() when 2.6 is about to ship. */
info
(
"debounce: hub %d port %d: delay %dms stable %d status 0x%x
\n
"
,
hub
->
devnum
,
port
,
delay_time
,
stable_count
,
portstatus
);
dev_info
(
*
hubdev
(
hub
),
"debounce: port %d: delay %dms stable %d status 0x%x
\n
"
,
port
+
1
,
delay_time
,
stable_count
,
portstatus
);
return
((
portstatus
&
USB_PORT_STAT_CONNECTION
))
?
0
:
1
;
}
...
...
@@ -822,9 +829,9 @@ static void usb_hub_port_connect_change(struct usb_hub *hubstate, int port,
unsigned
int
delay
=
HUB_SHORT_RESET_TIME
;
int
i
;
d
bg
(
"hub %s port %d, portstatus %x, change %x, %s"
,
hub
->
devpath
,
port
+
1
,
portstatus
,
portchange
,
portspeed
(
portstatus
));
d
ev_dbg
(
hubstate
->
intf
->
dev
,
"port %d, status %x, change %x, %s
\n
"
,
port
+
1
,
port
status
,
portchange
,
portspeed
(
portstatus
));
/* Clear the connection change status */
usb_clear_port_feature
(
hub
,
port
+
1
,
USB_PORT_FEAT_C_CONNECTION
);
...
...
@@ -842,7 +849,9 @@ static void usb_hub_port_connect_change(struct usb_hub *hubstate, int port,
}
if
(
usb_hub_port_debounce
(
hub
,
port
))
{
err
(
"connect-debounce failed, port %d disabled"
,
port
+
1
);
dev_err
(
hubstate
->
intf
->
dev
,
"connect-debounce failed, port %d disabled
\n
"
,
port
+
1
);
usb_hub_port_disable
(
hub
,
port
);
return
;
}
...
...
@@ -861,7 +870,8 @@ static void usb_hub_port_connect_change(struct usb_hub *hubstate, int port,
/* Allocate a new device struct */
dev
=
usb_alloc_dev
(
hub
,
hub
->
bus
);
if
(
!
dev
)
{
err
(
"couldn't allocate usb_device"
);
dev_err
(
hubstate
->
intf
->
dev
,
"couldn't allocate usb_device
\n
"
);
break
;
}
...
...
@@ -904,10 +914,12 @@ static void usb_hub_port_connect_change(struct usb_hub *hubstate, int port,
len
=
snprintf
(
dev
->
devpath
,
sizeof
dev
->
devpath
,
"%d"
,
port
+
1
);
if
(
len
==
sizeof
dev
->
devpath
)
warn
(
"devpath size! usb/%03d/%03d path %s"
,
dev_err
(
hubstate
->
intf
->
dev
,
"devpath size! usb/%03d/%03d path %s
\n
"
,
dev
->
bus
->
busnum
,
dev
->
devnum
,
dev
->
devpath
);
info
(
"new USB device %s-%s, assigned address %d"
,
dev
->
bus
->
bus_name
,
dev
->
devpath
,
dev
->
devnum
);
dev_info
(
hubstate
->
intf
->
dev
,
"new USB device on port %d, assigned address %d
\n
"
,
port
+
1
,
dev
->
devnum
);
/* put the device in the global device tree. the hub port
* is the "bus_id"; hubs show in hierarchy like bridges
...
...
@@ -992,12 +1004,11 @@ static void usb_hub_events(void)
}
if
(
portchange
&
USB_PORT_STAT_C_CONNECTION
)
{
dbg
(
"hub %s port %d connection change"
,
dev
->
devpath
,
i
+
1
);
usb_hub_port_connect_change
(
hub
,
i
,
portstatus
,
portchange
);
}
else
if
(
portchange
&
USB_PORT_STAT_C_ENABLE
)
{
dbg
(
"hub %s port %d enable change, status %x"
,
dev
->
devpath
,
i
+
1
,
portstatus
);
dev_dbg
(
*
hubdev
(
dev
),
"port %d enable change, status %x
\n
"
,
i
+
1
,
portstatus
);
usb_clear_port_feature
(
dev
,
i
+
1
,
USB_PORT_FEAT_C_ENABLE
);
...
...
drivers/usb/core/inode.c
View file @
c5fc26c9
...
...
@@ -487,10 +487,15 @@ static void fs_remove_file (struct dentry *dentry)
* It will be removed when the 2.7.x development cycle is started.
* You have been warned :)
*/
static
struct
file_system_type
usbdevice_fs_type
;
static
struct
super_block
*
usb_get_sb
(
struct
file_system_type
*
fs_type
,
int
flags
,
char
*
dev_name
,
void
*
data
)
{
if
(
fs_type
==
&
usbdevice_fs_type
)
printk
(
KERN_INFO
"Please use the 'usbfs' filetype instead, "
"the 'usbdevfs' name is depreciated.
\n
"
);
return
get_sb_single
(
fs_type
,
flags
,
data
,
usbfs_fill_super
);
}
...
...
drivers/usb/host/ehci-dbg.c
View file @
c5fc26c9
...
...
@@ -18,21 +18,45 @@
/* this file is part of ehci-hcd.c */
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,50)
#define ehci_dbg(ehci, fmt, args...) \
dev_dbg (*(ehci)->hcd.controller, fmt, ## args )
#define ehci_err(ehci, fmt, args...) \
dev_err (*(ehci)->hcd.controller, fmt, ## args )
#define ehci_info(ehci, fmt, args...) \
dev_info (*(ehci)->hcd.controller, fmt, ## args )
#define ehci_warn(ehci, fmt, args...) \
dev_warn (*(ehci)->hcd.controller, fmt, ## args )
#ifdef EHCI_VERBOSE_DEBUG
#define ehci_vdbg(ehci, fmt, args...) \
dev_dbg (*(ehci)->hcd.controller, fmt, ## args )
#else
#define ehci_vdbg(ehci, fmt, args...) do { } while (0)
#ifdef DEBUG
#define ehci_dbg(ehci, fmt, args...) \
printk(KERN_DEBUG "%s %s: " fmt, hcd_name, \
(ehci)->hcd.pdev->slot_name, ## args )
#else
#define ehci_dbg(ehci, fmt, args...) do { } while (0)
#endif
#define ehci_err(ehci, fmt, args...) \
printk(KERN_ERR "%s %s: " fmt, hcd_name, \
(ehci)->hcd.pdev->slot_name, ## args )
#define ehci_info(ehci, fmt, args...) \
printk(KERN_INFO "%s %s: " fmt, hcd_name, \
(ehci)->hcd.pdev->slot_name, ## args )
#define ehci_warn(ehci, fmt, args...) \
printk(KERN_WARNING "%s %s: " fmt, hcd_name, \
(ehci)->hcd.pdev->slot_name, ## args )
#endif
#ifdef EHCI_VERBOSE_DEBUG
# define vdbg dbg
# define ehci_vdbg ehci_dbg
#else
static
inline
void
vdbg
(
char
*
fmt
,
...)
{
}
# define vdbg(fmt,args...) do { } while (0)
# define ehci_vdbg(ehci, fmt, args...) do { } while (0)
#endif
#ifdef DEBUG
...
...
@@ -289,7 +313,8 @@ static void qh_lines (struct ehci_qh *qh, char **nextp, unsigned *sizep)
scratch
=
cpu_to_le32p
(
&
qh
->
hw_info1
);
hw_curr
=
cpu_to_le32p
(
&
qh
->
hw_current
);
temp
=
snprintf
(
next
,
size
,
"qh/%p dev%d %cs ep%d %08x %08x (%08x %08x)"
,
temp
=
snprintf
(
next
,
size
,
"qh/%p dev%d %cs ep%d %08x %08x (%08x %08x)"
,
qh
,
scratch
&
0x007f
,
speed_char
(
scratch
),
(
scratch
>>
8
)
&
0x000f
,
...
...
drivers/usb/host/ehci-hcd.c
View file @
c5fc26c9
...
...
@@ -123,12 +123,6 @@ static int log2_irq_thresh = 0; // 0 to 6
MODULE_PARM
(
log2_irq_thresh
,
"i"
);
MODULE_PARM_DESC
(
log2_irq_thresh
,
"log2 IRQ latency, 1-64 microframes"
);
/* allow irqs at least every N URB completions */
static
int
max_completions
=
16
;
MODULE_PARM
(
max_completions
,
"i"
);
MODULE_PARM_DESC
(
max_completions
,
"limit for urb completions called with irqs disenabled"
);
#define INTR_MASK (STS_IAA | STS_FATAL | STS_ERR | STS_INT)
/*-------------------------------------------------------------------------*/
...
...
@@ -202,7 +196,7 @@ static int ehci_reset (struct ehci_hcd *ehci)
dbg_cmd
(
ehci
,
"reset"
,
command
);
writel
(
command
,
&
ehci
->
regs
->
command
);
ehci
->
hcd
.
state
=
USB_STATE_HALT
;
return
handshake
(
&
ehci
->
regs
->
command
,
CMD_RESET
,
0
,
250
);
return
handshake
(
&
ehci
->
regs
->
command
,
CMD_RESET
,
0
,
250
*
1000
);
}
/* idle the controller (from running) */
...
...
@@ -250,9 +244,7 @@ static void ehci_ready (struct ehci_hcd *ehci)
/*-------------------------------------------------------------------------*/
static
void
ehci_tasklet
(
unsigned
long
param
);
static
void
ehci_irq
(
struct
usb_hcd
*
hcd
,
struct
pt_regs
*
regs
);
static
void
ehci_work
(
struct
ehci_hcd
*
ehci
,
struct
pt_regs
*
regs
);
static
void
ehci_watchdog
(
unsigned
long
param
)
{
...
...
@@ -260,10 +252,25 @@ static void ehci_watchdog (unsigned long param)
unsigned
long
flags
;
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
/* guard against lost IAA, which wedges everything */
ehci_irq
(
&
ehci
->
hcd
,
NULL
);
/* lost IAA irqs wedge things badly; seen with a vt8235 */
if
(
ehci
->
reclaim
)
{
u32
status
=
readl
(
&
ehci
->
regs
->
status
);
if
(
status
&
STS_IAA
)
{
ehci_vdbg
(
ehci
,
"lost IAA
\n
"
);
writel
(
STS_IAA
,
&
ehci
->
regs
->
status
);
ehci
->
reclaim_ready
=
1
;
}
}
ehci_work
(
ehci
,
NULL
);
if
(
ehci
->
reclaim
&&
!
timer_pending
(
&
ehci
->
watchdog
))
mod_timer
(
&
ehci
->
watchdog
,
jiffies
+
EHCI_WATCHDOG_JIFFIES
);
/* stop async processing after it's idled a while */
if
(
ehci
->
async_idle
)
{
else
if
(
ehci
->
async_idle
)
{
start_unlink_async
(
ehci
,
ehci
->
async
);
ehci
->
async_idle
=
0
;
}
...
...
@@ -289,8 +296,7 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
pci_read_config_dword
(
ehci
->
hcd
.
pdev
,
where
,
&
cap
);
}
while
((
cap
&
(
1
<<
16
))
&&
msec
);
if
(
cap
&
(
1
<<
16
))
{
dev_info
(
*
ehci
->
hcd
.
controller
,
"BIOS handoff failed (%d, %04x)
\n
"
,
ehci_err
(
ehci
,
"BIOS handoff failed (%d, %04x)
\n
"
,
where
,
cap
);
return
1
;
}
...
...
@@ -333,8 +339,7 @@ static int ehci_start (struct usb_hcd *hcd)
return
-
EOPNOTSUPP
;
break
;
case
0
:
/* illegal reserved capability */
dev_warn
(
*
ehci
->
hcd
.
controller
,
"illegal capability!
\n
"
);
ehci_warn
(
ehci
,
"illegal capability!
\n
"
);
cap
=
0
;
/* FALLTHROUGH */
default:
/* unknown */
...
...
@@ -381,6 +386,8 @@ static int ehci_start (struct usb_hcd *hcd)
* dedicate a qh for the async ring head, since we couldn't unlink
* a 'real' qh without stopping the async schedule [4.8]. use it
* as the 'reclamation list head' too.
* its dummy is used in hw_alt_next of many tds, to prevent the qh
* from automatically advancing to the next td after short reads.
*/
ehci
->
async
->
qh_next
.
qh
=
0
;
ehci
->
async
->
hw_next
=
QH_NEXT
(
ehci
->
async
->
qh_dma
);
...
...
@@ -388,8 +395,7 @@ static int ehci_start (struct usb_hcd *hcd)
ehci
->
async
->
hw_token
=
cpu_to_le32
(
QTD_STS_HALT
);
ehci
->
async
->
hw_qtd_next
=
EHCI_LIST_END
;
ehci
->
async
->
qh_state
=
QH_STATE_LINKED
;
ehci_qtd_free
(
ehci
,
ehci
->
async
->
dummy
);
ehci
->
async
->
dummy
=
0
;
ehci
->
async
->
hw_alt_next
=
QTD_NEXT
(
ehci
->
async
->
dummy
->
qtd_dma
);
writel
((
u32
)
ehci
->
async
->
qh_dma
,
&
ehci
->
regs
->
async_next
);
/*
...
...
@@ -406,8 +412,7 @@ static int ehci_start (struct usb_hcd *hcd)
if
(
HCC_64BIT_ADDR
(
hcc_params
))
{
writel
(
0
,
&
ehci
->
regs
->
segment
);
if
(
!
pci_set_dma_mask
(
ehci
->
hcd
.
pdev
,
0xffffffffffffffffULL
))
dev_info
(
*
ehci
->
hcd
.
controller
,
"enabled 64bit PCI DMA (DAC)
\n
"
);
ehci_info
(
ehci
,
"enabled 64bit PCI DMA
\n
"
);
}
/* clear interrupt enables, set irq latency */
...
...
@@ -426,9 +431,6 @@ static int ehci_start (struct usb_hcd *hcd)
/* set async sleep time = 10 us ... ? */
ehci
->
tasklet
.
func
=
ehci_tasklet
;
ehci
->
tasklet
.
data
=
(
unsigned
long
)
ehci
;
init_timer
(
&
ehci
->
watchdog
);
ehci
->
watchdog
.
function
=
ehci_watchdog
;
ehci
->
watchdog
.
data
=
(
unsigned
long
)
ehci
;
...
...
@@ -454,7 +456,7 @@ static int ehci_start (struct usb_hcd *hcd)
/* PCI Serial Bus Release Number is at 0x60 offset */
pci_read_config_byte
(
hcd
->
pdev
,
0x60
,
&
tempbyte
);
temp
=
readw
(
&
ehci
->
caps
->
hci_version
);
dev_info
(
*
hcd
->
controller
,
ehci_info
(
ehci
,
"USB %x.%x enabled, EHCI %x.%02x, driver %s
\n
"
,
((
tempbyte
&
0xf0
)
>>
4
),
(
tempbyte
&
0x0f
),
temp
>>
8
,
temp
&
0xff
,
DRIVER_VERSION
);
...
...
@@ -494,10 +496,11 @@ static void ehci_stop (struct usb_hcd *hcd)
/* no more interrupts ... */
if
(
hcd
->
state
==
USB_STATE_RUNNING
)
ehci_ready
(
ehci
);
if
(
in_interrupt
())
/* should not happen!! */
dev_err
(
*
hcd
->
controller
,
"stopped %s!
\n
"
,
RUN_CONTEXT
);
else
del_timer_sync
(
&
ehci
->
watchdog
);
if
(
in_interrupt
())
{
/* must not happen!! */
ehci_err
(
ehci
,
"stopped in_interrupt!
\n
"
);
return
;
}
del_timer_sync
(
&
ehci
->
watchdog
);
ehci_reset
(
ehci
);
/* let companion controllers work when we aren't */
...
...
@@ -506,8 +509,9 @@ static void ehci_stop (struct usb_hcd *hcd)
remove_debug_files
(
ehci
);
/* root hub is shut down separately (first, when possible) */
tasklet_disable
(
&
ehci
->
tasklet
);
ehci_tasklet
((
unsigned
long
)
ehci
);
spin_lock_irq
(
&
ehci
->
lock
);
ehci_work
(
ehci
,
NULL
);
spin_unlock_irq
(
&
ehci
->
lock
);
ehci_mem_cleanup
(
ehci
);
#ifdef EHCI_STATS
...
...
@@ -615,22 +619,16 @@ dbg ("%s: resume port %d", hcd_to_bus (hcd)->bus_name, i);
/*-------------------------------------------------------------------------*/
/*
*
tasklet scheduled by some interrupts and other events
*
calls driver completion functions ... but not in_irq()
*
ehci_work is called from some interrupts, timers, and so on.
*
it calls driver completion functions, after dropping ehci->lock.
*/
static
void
ehci_
tasklet
(
unsigned
long
param
)
static
void
ehci_
work
(
struct
ehci_hcd
*
ehci
,
struct
pt_regs
*
regs
)
{
struct
ehci_hcd
*
ehci
=
(
struct
ehci_hcd
*
)
param
;
spin_lock_irq
(
&
ehci
->
lock
);
if
(
ehci
->
reclaim_ready
)
end_unlink_async
(
ehci
);
scan_async
(
ehci
);
end_unlink_async
(
ehci
,
regs
);
scan_async
(
ehci
,
regs
);
if
(
ehci
->
next_uframe
!=
-
1
)
scan_periodic
(
ehci
);
spin_unlock_irq
(
&
ehci
->
lock
);
scan_periodic
(
ehci
,
regs
);
}
/*-------------------------------------------------------------------------*/
...
...
@@ -643,7 +641,7 @@ static void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
/* e.g. cardbus physical eject */
if
(
status
==
~
(
u32
)
0
)
{
dbg
(
"%s: device removed!"
,
hcd_to_bus
(
hcd
)
->
bus_name
);
ehci_dbg
(
ehci
,
"device removed
\n
"
);
goto
dead
;
}
...
...
@@ -651,6 +649,8 @@ static void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
if
(
!
status
)
/* irq sharing? */
return
;
spin_lock
(
&
ehci
->
lock
);
/* clear (just) interrupts */
writel
(
status
,
&
ehci
->
regs
->
status
);
readl
(
&
ehci
->
regs
->
command
);
/* unblock posted write */
...
...
@@ -681,8 +681,7 @@ static void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
/* PCI errors [4.15.2.4] */
if
(
unlikely
((
status
&
STS_FATAL
)
!=
0
))
{
err
(
"%s: fatal error, state %x"
,
hcd_to_bus
(
hcd
)
->
bus_name
,
hcd
->
state
);
ehci_err
(
ehci
,
"fatal error
\n
"
);
dead:
ehci_reset
(
ehci
);
/* generic layer kills/unlinks all urbs, then
...
...
@@ -691,9 +690,9 @@ static void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
bh
=
1
;
}
/* most work doesn't need to be in_irq() */
if
(
likely
(
bh
==
1
))
tasklet_schedule
(
&
ehci
->
tasklet
);
if
(
bh
)
ehci_work
(
ehci
,
regs
);
spin_unlock
(
&
ehci
->
lock
);
}
/*-------------------------------------------------------------------------*/
...
...
@@ -754,52 +753,52 @@ static int ehci_urb_enqueue (
static
int
ehci_urb_dequeue
(
struct
usb_hcd
*
hcd
,
struct
urb
*
urb
)
{
struct
ehci_hcd
*
ehci
=
hcd_to_ehci
(
hcd
);
struct
ehci_qh
*
qh
=
(
struct
ehci_qh
*
)
urb
->
hcpriv
;
struct
ehci_qh
*
qh
;
unsigned
long
flags
;
int
maybe_irq
=
1
;
ehci_vdbg
(
ehci
,
"urb_dequeue %p qh %p state %d
\n
"
,
urb
,
qh
,
qh
->
qh_state
);
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
switch
(
usb_pipetype
(
urb
->
pipe
))
{
// case PIPE_CONTROL:
// case PIPE_BULK:
default:
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
if
(
ehci
->
reclaim
)
{
vdbg
(
"dq %p: reclaim = %p, %s"
,
qh
,
ehci
->
reclaim
,
RUN_CONTEXT
);
if
(
qh
==
ehci
->
reclaim
)
{
/* unlinking qh for another queued urb? */
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
return
0
;
}
if
(
in_interrupt
())
{
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
return
-
EAGAIN
;
}
while
(
qh
->
qh_state
==
QH_STATE_LINKED
&&
ehci
->
reclaim
&&
ehci
->
hcd
.
state
!=
USB_STATE_HALT
)
{
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
/* let pending unlinks complete */
wait_ms
(
1
);
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
qh
=
(
struct
ehci_qh
*
)
urb
->
hcpriv
;
if
(
!
qh
)
break
;
while
(
qh
->
qh_state
==
QH_STATE_LINKED
&&
ehci
->
reclaim
&&
HCD_IS_RUNNING
(
ehci
->
hcd
.
state
)
)
{
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
if
(
maybe_irq
)
{
if
(
in_interrupt
())
return
-
EAGAIN
;
maybe_irq
=
0
;
}
/* let pending unlinks complete, so this can start */
wait_ms
(
1
);
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
}
if
(
!
HCD_IS_RUNNING
(
ehci
->
hcd
.
state
)
&&
ehci
->
reclaim
)
end_unlink_async
(
ehci
,
NULL
);
/* something else might have unlinked the qh by now */
if
(
qh
->
qh_state
==
QH_STATE_LINKED
)
start_unlink_async
(
ehci
,
qh
);
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
break
;
case
PIPE_INTERRUPT
:
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
qh
=
(
struct
ehci_qh
*
)
urb
->
hcpriv
;
if
(
!
qh
)
break
;
if
(
qh
->
qh_state
==
QH_STATE_LINKED
)
{
/* messy, can spin or block a microframe ... */
intr_deschedule
(
ehci
,
qh
,
1
);
/* qh_state == IDLE */
}
qh_completions
(
ehci
,
qh
);
qh_completions
(
ehci
,
qh
,
NULL
);
/* reschedule QH iff another request is queued */
if
(
!
list_empty
(
&
qh
->
qtd_list
)
...
...
@@ -817,7 +816,6 @@ static int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
}
return
status
;
}
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
break
;
case
PIPE_ISOCHRONOUS
:
...
...
@@ -828,6 +826,7 @@ static int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
urb
->
transfer_flags
|=
EHCI_STATE_UNLINK
;
break
;
}
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
return
0
;
}
...
...
@@ -885,11 +884,11 @@ static void ehci_free_config (struct usb_hcd *hcd, struct usb_device *udev)
*/
while
(
qh
->
qh_state
==
QH_STATE_LINKED
&&
ehci
->
reclaim
&&
ehci
->
hcd
.
state
!=
USB_STATE_HALT
&&
HCD_IS_RUNNING
(
ehci
->
hcd
.
state
)
)
{
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
/* wait_ms() won't spin, we're a thread;
* and we know IRQ
+tasklet
can progress
* and we know IRQ
/timer/...
can progress
*/
wait_ms
(
1
);
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
...
...
drivers/usb/host/ehci-hub.c
View file @
c5fc26c9
...
...
@@ -315,7 +315,7 @@ static int ehci_hub_control (
wIndex
+
1
);
temp
|=
PORT_OWNER
;
}
else
{
ehci_vdbg
(
ehci
,
"port %d reset"
,
wIndex
+
1
);
ehci_vdbg
(
ehci
,
"port %d reset
\n
"
,
wIndex
+
1
);
temp
|=
PORT_RESET
;
temp
&=
~
PORT_PE
;
...
...
drivers/usb/host/ehci-mem.c
View file @
c5fc26c9
...
...
@@ -73,8 +73,11 @@ static struct ehci_qtd *ehci_qtd_alloc (struct ehci_hcd *ehci, int flags)
dma_addr_t
dma
;
qtd
=
pci_pool_alloc
(
ehci
->
qtd_pool
,
flags
,
&
dma
);
if
(
qtd
!=
0
)
if
(
qtd
!=
0
)
{
ehci_qtd_init
(
qtd
,
dma
);
if
(
ehci
->
async
)
qtd
->
hw_alt_next
=
ehci
->
async
->
hw_alt_next
;
}
return
qtd
;
}
...
...
drivers/usb/host/ehci-q.c
View file @
c5fc26c9
...
...
@@ -73,11 +73,6 @@ qtd_fill (struct ehci_qtd *qtd, dma_addr_t buf, size_t len, int token)
qtd
->
hw_token
=
cpu_to_le32
((
count
<<
16
)
|
token
);
qtd
->
length
=
count
;
#if 0
vdbg (" qtd_fill %p, token %8x bytes %d dma %x",
qtd, le32_to_cpu (qtd->hw_token), count, qtd->hw_buf [0]);
#endif
return
count
;
}
...
...
@@ -85,11 +80,12 @@ qtd_fill (struct ehci_qtd *qtd, dma_addr_t buf, size_t len, int token)
/* update halted (but potentially linked) qh */
static
void
qh_update
(
struct
ehci_qh
*
qh
,
struct
ehci_qtd
*
qtd
)
static
void
qh_update
(
struct
ehci_hcd
*
ehci
,
struct
ehci_qh
*
qh
,
struct
ehci_qtd
*
qtd
)
{
qh
->
hw_current
=
0
;
qh
->
hw_qtd_next
=
QTD_NEXT
(
qtd
->
qtd_dma
);
qh
->
hw_alt_next
=
EHCI_LIST_END
;
qh
->
hw_alt_next
=
ehci
->
async
->
hw_alt_next
;
/* HC must see latest qtd and qh data before we clear ACTIVE+HALT */
wmb
();
...
...
@@ -98,7 +94,12 @@ static void qh_update (struct ehci_qh *qh, struct ehci_qtd *qtd)
/*-------------------------------------------------------------------------*/
static
inline
void
qtd_copy_status
(
struct
urb
*
urb
,
size_t
length
,
u32
token
)
static
inline
void
qtd_copy_status
(
struct
ehci_hcd
*
ehci
,
struct
urb
*
urb
,
size_t
length
,
u32
token
)
{
/* count IN/OUT bytes, not SETUP (even short packets) */
if
(
likely
(
QTD_PID
(
token
)
!=
2
))
...
...
@@ -132,7 +133,7 @@ static inline void qtd_copy_status (struct urb *urb, size_t length, u32 token)
ehci_vdbg
(
ehci
,
"dev%d ep%d%s qtd token %08x --> status %d
\n
"
,
usb_pipedev
(
urb
->
pipe
),
usb_pipedev
ice
(
urb
->
pipe
),
usb_pipeendpoint
(
urb
->
pipe
),
usb_pipein
(
urb
->
pipe
)
?
"in"
:
"out"
,
token
,
urb
->
status
);
...
...
@@ -157,9 +158,17 @@ static inline void qtd_copy_status (struct urb *urb, size_t length, u32 token)
}
}
}
/* force cleanup after short read; not necessarily an error */
if
(
unlikely
(
urb
->
status
==
-
EINPROGRESS
&&
QTD_LENGTH
(
token
)
!=
0
&&
QTD_PID
(
token
)
==
1
))
{
urb
->
status
=
-
EREMOTEIO
;
}
}
static
void
ehci_urb_done
(
struct
ehci_hcd
*
ehci
,
struct
urb
*
urb
)
static
void
ehci_urb_done
(
struct
ehci_hcd
*
ehci
,
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
{
if
(
likely
(
urb
->
hcpriv
!=
0
))
{
struct
ehci_qh
*
qh
=
(
struct
ehci_qh
*
)
urb
->
hcpriv
;
...
...
@@ -171,27 +180,31 @@ static void ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb)
hcd_to_bus
(
&
ehci
->
hcd
)
->
bandwidth_int_reqs
--
;
}
qh_put
(
ehci
,
qh
);
urb
->
hcpriv
=
0
;
}
if
(
likely
(
urb
->
status
==
-
EINPROGRESS
))
{
if
(
urb
->
actual_length
!=
urb
->
transfer_buffer_length
&&
(
urb
->
transfer_flags
&
URB_SHORT_NOT_OK
))
urb
->
status
=
-
EREMOTEIO
;
else
spin_lock
(
&
urb
->
lock
);
urb
->
hcpriv
=
0
;
switch
(
urb
->
status
)
{
case
-
EINPROGRESS
:
/* success */
urb
->
status
=
0
;
default:
/* fault */
COUNT
(
ehci
->
stats
.
complete
);
break
;
case
-
EREMOTEIO
:
/* fault or normal */
if
(
!
(
urb
->
transfer_flags
&
URB_SHORT_NOT_OK
))
urb
->
status
=
0
;
}
if
(
likely
(
urb
->
status
==
0
))
COUNT
(
ehci
->
stats
.
complete
);
else
if
(
urb
->
status
==
-
ECONNRESET
||
urb
->
status
==
-
ENOENT
)
break
;
case
-
ECONNRESET
:
/* canceled */
case
-
ENOENT
:
COUNT
(
ehci
->
stats
.
unlink
);
else
COUNT
(
ehci
->
stats
.
error
);
break
;
}
spin_unlock
(
&
urb
->
lock
);
/* complete() can reenter this HCD */
spin_unlock
(
&
ehci
->
lock
);
usb_hcd_giveback_urb
(
&
ehci
->
hcd
,
urb
,
NULL
);
usb_hcd_giveback_urb
(
&
ehci
->
hcd
,
urb
,
regs
);
spin_lock
(
&
ehci
->
lock
);
}
...
...
@@ -203,14 +216,14 @@ static void ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb)
* indicating how much "real" work we did.
*/
static
unsigned
qh_completions
(
struct
ehci_hcd
*
ehci
,
struct
ehci_qh
*
qh
)
qh_completions
(
struct
ehci_hcd
*
ehci
,
struct
ehci_qh
*
qh
,
struct
pt_regs
*
regs
)
{
struct
ehci_qtd
*
qtd
,
*
last
;
struct
list_head
*
next
,
*
qtd_list
=
&
qh
->
qtd_list
;
int
unlink
=
0
,
halt
ed
=
0
;
int
unlink
=
0
,
stopp
ed
=
0
;
unsigned
count
=
0
;
if
(
unlikely
(
list_empty
(
qtd_list
)))
if
(
unlikely
(
list_empty
(
&
qh
->
qtd_list
)))
return
count
;
/* scan QTDs till end of list, or we reach an active one */
...
...
@@ -225,7 +238,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
/* clean up any state from previous QTD ...*/
if
(
last
)
{
if
(
likely
(
last
->
urb
!=
urb
))
{
ehci_urb_done
(
ehci
,
last
->
urb
);
ehci_urb_done
(
ehci
,
last
->
urb
,
regs
);
count
++
;
}
ehci_qtd_free
(
ehci
,
last
);
...
...
@@ -236,12 +249,14 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
/* QTDs at tail may be active if QH+HC are running,
* or when unlinking some urbs queued to this QH
*/
rmb
();
token
=
le32_to_cpu
(
qtd
->
hw_token
);
halted
=
halted
stopped
=
stopped
||
(
qh
->
qh_state
==
QH_STATE_IDLE
)
||
(
__constant_cpu_to_le32
(
QTD_STS_HALT
)
&
qh
->
hw_token
)
!=
0
||
(
ehci
->
hcd
.
state
==
USB_STATE_HALT
)
||
(
qh
->
qh_state
==
QH_STATE_IDLE
);
||
(
qh
->
hw_current
==
ehci
->
async
->
hw_alt_next
);
// FIXME Remove the automagic unlink mode.
// Drivers can now clean up safely; it's their job.
...
...
@@ -257,7 +272,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
/* status copied below */
/* QH halts only because of fault (above) or unlink (here). */
}
else
if
(
unlikely
(
halt
ed
!=
0
))
{
}
else
if
(
unlikely
(
stopp
ed
!=
0
))
{
/* unlinking everything because of HC shutdown? */
if
(
ehci
->
hcd
.
state
==
USB_STATE_HALT
)
{
...
...
@@ -293,32 +308,22 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
}
spin_lock
(
&
urb
->
lock
);
qtd_copy_status
(
urb
,
qtd
->
length
,
token
);
qtd_copy_status
(
ehci
,
urb
,
qtd
->
length
,
token
);
spin_unlock
(
&
urb
->
lock
);
list_del
(
&
qtd
->
qtd_list
);
#if 0
if (urb->status == -EINPROGRESS)
vdbg (" qtd %p ok, urb %p, token %8x, len %d",
qtd, urb, token, urb->actual_length);
else
vdbg ("urb %p status %d, qtd %p, token %8x, len %d",
urb, urb->status, qtd, token,
urb->actual_length);
#endif
}
/* last urb's completion might still need calling */
if
(
likely
(
last
!=
0
))
{
ehci_urb_done
(
ehci
,
last
->
urb
);
ehci_urb_done
(
ehci
,
last
->
urb
,
regs
);
count
++
;
ehci_qtd_free
(
ehci
,
last
);
}
/* reactivate queue after error and driver's cleanup */
if
(
unlikely
(
halted
&&
!
list_empty
(
qtd_list
)))
{
qh_update
(
qh
,
list_entry
(
qtd_list
->
next
,
if
(
unlikely
(
stopped
&&
!
list_empty
(
&
qh
->
qtd_list
)))
{
qh_update
(
ehci
,
qh
,
list_entry
(
qh
->
qtd_list
.
next
,
struct
ehci_qtd
,
qtd_list
));
}
...
...
@@ -369,7 +374,6 @@ qh_urb_transaction (
qtd
=
ehci_qtd_alloc
(
ehci
,
flags
);
if
(
unlikely
(
!
qtd
))
return
0
;
qtd_prev
=
0
;
list_add_tail
(
&
qtd
->
qtd_list
,
head
);
qtd
->
urb
=
urb
;
...
...
@@ -377,6 +381,8 @@ qh_urb_transaction (
token
|=
(
EHCI_TUNE_CERR
<<
10
);
/* for split transactions, SplitXState initialized to zero */
len
=
urb
->
transfer_buffer_length
;
is_input
=
usb_pipein
(
urb
->
pipe
);
if
(
usb_pipecontrol
(
urb
->
pipe
))
{
/* SETUP pid */
qtd_fill
(
qtd
,
urb
->
setup_dma
,
sizeof
(
struct
usb_ctrlrequest
),
...
...
@@ -392,15 +398,14 @@ qh_urb_transaction (
qtd_prev
->
hw_next
=
QTD_NEXT
(
qtd
->
qtd_dma
);
list_add_tail
(
&
qtd
->
qtd_list
,
head
);
if
(
!
(
urb
->
transfer_flags
&
URB_SHORT_NOT_OK
))
if
(
len
>
0
&&
is_input
&&
!
(
urb
->
transfer_flags
&
URB_SHORT_NOT_OK
))
status_patch
=
1
;
}
/*
* data transfer stage: buffer setup
*/
len
=
urb
->
transfer_buffer_length
;
is_input
=
usb_pipein
(
urb
->
pipe
);
if
(
likely
(
len
>
0
))
buf
=
urb
->
transfer_dma
;
else
...
...
@@ -420,7 +425,6 @@ qh_urb_transaction (
for
(;;)
{
int
this_qtd_len
;
qtd
->
urb
=
urb
;
this_qtd_len
=
qtd_fill
(
qtd
,
buf
,
len
,
token
);
len
-=
this_qtd_len
;
buf
+=
this_qtd_len
;
...
...
@@ -578,7 +582,6 @@ ehci_qh_make (
if
(
qh
->
period
<
1
)
{
dbg
(
"intr period %d uframes, NYET!"
,
urb
->
interval
);
qh
=
0
;
goto
done
;
}
}
else
{
...
...
@@ -639,7 +642,9 @@ ehci_qh_make (
break
;
default:
dbg
(
"bogus dev %p speed %d"
,
urb
->
dev
,
urb
->
dev
->
speed
);
return
0
;
done:
qh_put
(
ehci
,
qh
);
return
0
;
}
/* NOTE: if (PIPE_INTERRUPT) { scheduler sets s-mask } */
...
...
@@ -658,15 +663,13 @@ ehci_qh_make (
list_splice
(
qtd_list
,
&
qh
->
qtd_list
);
qtd
=
list_entry
(
qtd_list
->
next
,
struct
ehci_qtd
,
qtd_list
);
qh_update
(
qh
,
qtd
);
qh_update
(
ehci
,
qh
,
qtd
);
}
else
{
qh
->
hw_qtd_next
=
qh
->
hw_alt_next
=
EHCI_LIST_END
;
}
/* initialize data toggle state */
clear_toggle
(
urb
->
dev
,
usb_pipeendpoint
(
urb
->
pipe
),
!
is_input
,
qh
);
done:
return
qh
;
}
#undef hb_mult
...
...
@@ -685,7 +688,7 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
head
=
ehci
->
async
;
if
(
ehci
->
async_idle
)
del_timer
(
&
ehci
->
watchdog
);
else
if
(
!
head
->
qh_next
.
qh
)
{
if
(
!
head
->
qh_next
.
qh
)
{
u32
cmd
=
readl
(
&
ehci
->
regs
->
command
);
if
(
!
(
cmd
&
CMD_ASE
))
{
...
...
@@ -698,6 +701,8 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
}
}
qh
->
hw_token
&=
~
__constant_cpu_to_le32
(
QTD_STS_HALT
);
/* splice right after start */
qh
->
qh_next
=
head
->
qh_next
;
qh
->
hw_next
=
head
->
hw_next
;
...
...
@@ -774,8 +779,8 @@ static struct ehci_qh *qh_append_tds (
*/
token
=
qtd
->
hw_token
;
qtd
->
hw_token
=
0
;
wmb
();
dummy
=
qh
->
dummy
;
// dbg ("swap td %p with dummy %p", qtd, dummy);
dma
=
dummy
->
qtd_dma
;
*
dummy
=
*
qtd
;
...
...
@@ -784,9 +789,11 @@ static struct ehci_qh *qh_append_tds (
list_add
(
&
dummy
->
qtd_list
,
qtd_list
);
ehci_qtd_init
(
qtd
,
qtd
->
qtd_dma
);
qtd
->
hw_alt_next
=
ehci
->
async
->
hw_alt_next
;
qh
->
dummy
=
qtd
;
/* hc must see the new dummy at list end */
dma
=
qtd
->
qtd_dma
;
qtd
=
list_entry
(
qh
->
qtd_list
.
prev
,
struct
ehci_qtd
,
qtd_list
);
qtd
->
hw_next
=
QTD_NEXT
(
dma
);
...
...
@@ -797,15 +804,6 @@ static struct ehci_qh *qh_append_tds (
/* no URB queued */
}
else
{
struct
ehci_qtd
*
last_qtd
;
/* make sure hc sees current dummy at the end */
last_qtd
=
list_entry
(
qtd_list
->
prev
,
struct
ehci_qtd
,
qtd_list
);
last_qtd
->
hw_next
=
QTD_NEXT
(
qh
->
dummy
->
qtd_dma
);
// dbg_qh ("empty qh", ehci, qh);
/* usb_clear_halt() means qh data toggle gets reset */
if
(
unlikely
(
!
usb_gettoggle
(
urb
->
dev
,
(
epnum
&
0x0f
),
...
...
@@ -813,15 +811,23 @@ static struct ehci_qh *qh_append_tds (
clear_toggle
(
urb
->
dev
,
epnum
&
0x0f
,
!
(
epnum
&
0x10
),
qh
);
}
if
(
qtd
)
qh_update
(
qh
,
qtd
);
/* make sure hc sees current dummy at the end */
if
(
qtd
)
{
struct
ehci_qtd
*
last_qtd
;
last_qtd
=
list_entry
(
qtd_list
->
prev
,
struct
ehci_qtd
,
qtd_list
);
last_qtd
->
hw_next
=
QTD_NEXT
(
qh
->
dummy
->
qtd_dma
);
qh_update
(
ehci
,
qh
,
qtd
);
}
}
list_splice
(
qtd_list
,
qh
->
qtd_list
.
prev
);
}
else
{
/* can't sleep here, we have ehci->lock... */
qh
=
ehci_qh_make
(
ehci
,
urb
,
qtd_list
,
SLAB_ATOMIC
);
// if (qh) dbg_qh ("new qh", ehci, qh);
*
ptr
=
qh
;
}
if
(
qh
)
...
...
@@ -877,34 +883,38 @@ submit_async (
/*-------------------------------------------------------------------------*/
/* the async qh for the qtds being reclaimed are now unlinked from the HC */
/* caller must not own ehci->lock */
static
void
end_unlink_async
(
struct
ehci_hcd
*
ehci
)
static
void
end_unlink_async
(
struct
ehci_hcd
*
ehci
,
struct
pt_regs
*
regs
)
{
struct
ehci_qh
*
qh
=
ehci
->
reclaim
;
del_timer
(
&
ehci
->
watchdog
);
qh
->
hw_next
=
cpu_to_le32
(
qh
->
qh_dma
);
qh
->
qh_state
=
QH_STATE_IDLE
;
qh
->
qh_next
.
qh
=
0
;
qh_put
(
ehci
,
qh
);
// refcount from reclaim
ehci
->
reclaim
=
0
;
ehci
->
reclaim_ready
=
0
;
qh_completions
(
ehci
,
qh
);
qh_completions
(
ehci
,
qh
,
regs
);
if
(
!
list_empty
(
&
qh
->
qtd_list
)
&&
HCD_IS_RUNNING
(
ehci
->
hcd
.
state
))
qh_link_async
(
ehci
,
qh
);
else
else
{
qh_put
(
ehci
,
qh
);
// refcount from async list
/* it's not free to turn the async schedule on/off, so we leave it
* active but idle for a while once it empties.
*/
if
(
!
ehci
->
async
->
qh_next
.
qh
&&
!
timer_pending
(
&
ehci
->
watchdog
))
{
ehci
->
async_idle
=
1
;
mod_timer
(
&
ehci
->
watchdog
,
jiffies
+
EHCI_ASYNC_JIFFIES
);
/* it's not free to turn the async schedule on/off; leave it
* active but idle for a while once it empties.
*/
if
(
HCD_IS_RUNNING
(
ehci
->
hcd
.
state
)
&&
ehci
->
async
->
qh_next
.
qh
==
0
&&
!
timer_pending
(
&
ehci
->
watchdog
))
{
ehci
->
async_idle
=
1
;
mod_timer
(
&
ehci
->
watchdog
,
jiffies
+
EHCI_ASYNC_JIFFIES
);
}
}
}
...
...
@@ -941,12 +951,6 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
qh
->
qh_state
=
QH_STATE_UNLINK
;
ehci
->
reclaim
=
qh
=
qh_get
(
qh
);
if
(
unlikely
(
ehci
->
hcd
.
state
==
USB_STATE_HALT
))
{
ehci
->
reclaim_ready
=
1
;
tasklet_schedule
(
&
ehci
->
tasklet
);
return
;
}
prev
=
ehci
->
async
;
while
(
prev
->
qh_next
.
qh
!=
qh
)
prev
=
prev
->
qh_next
.
qh
;
...
...
@@ -955,6 +959,11 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
prev
->
qh_next
=
qh
->
qh_next
;
wmb
();
if
(
unlikely
(
ehci
->
hcd
.
state
==
USB_STATE_HALT
))
{
end_unlink_async
(
ehci
,
NULL
);
return
;
}
ehci
->
reclaim_ready
=
0
;
cmd
|=
CMD_IAAD
;
writel
(
cmd
,
&
ehci
->
regs
->
command
);
...
...
@@ -966,7 +975,7 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
/*-------------------------------------------------------------------------*/
static
void
scan_async
(
struct
ehci_hcd
*
ehci
)
scan_async
(
struct
ehci_hcd
*
ehci
,
struct
pt_regs
*
regs
)
{
struct
ehci_qh
*
qh
;
unsigned
count
;
...
...
@@ -984,7 +993,7 @@ scan_async (struct ehci_hcd *ehci)
* reporting drops the lock.
*/
qh
=
qh_get
(
qh
);
temp
=
qh_completions
(
ehci
,
qh
);
temp
=
qh_completions
(
ehci
,
qh
,
regs
);
qh_put
(
ehci
,
qh
);
if
(
temp
!=
0
)
{
count
+=
temp
;
...
...
@@ -1002,14 +1011,6 @@ scan_async (struct ehci_hcd *ehci)
start_unlink_async
(
ehci
,
qh
);
}
/* keep latencies down: let any irqs in */
if
(
count
>
max_completions
)
{
spin_unlock_irq
(
&
ehci
->
lock
);
cpu_relax
();
spin_lock_irq
(
&
ehci
->
lock
);
goto
rescan
;
}
qh
=
qh
->
qh_next
.
qh
;
}
while
(
qh
);
}
...
...
drivers/usb/host/ehci-sched.c
View file @
c5fc26c9
...
...
@@ -190,7 +190,7 @@ static int enable_periodic (struct ehci_hcd *ehci)
/* posted write ... PSS happens later */
ehci
->
hcd
.
state
=
USB_STATE_RUNNING
;
/* make sure
tasklet
scans these */
/* make sure
ehci_work
scans these */
ehci
->
next_uframe
=
readl
(
&
ehci
->
regs
->
frame_index
)
%
(
ehci
->
periodic_size
<<
3
);
return
0
;
...
...
@@ -495,7 +495,8 @@ static unsigned
intr_complete
(
struct
ehci_hcd
*
ehci
,
unsigned
frame
,
struct
ehci_qh
*
qh
struct
ehci_qh
*
qh
,
struct
pt_regs
*
regs
)
{
unsigned
count
;
...
...
@@ -509,7 +510,7 @@ intr_complete (
}
/* handle any completions */
count
=
qh_completions
(
ehci
,
qh
);
count
=
qh_completions
(
ehci
,
qh
,
regs
);
if
(
unlikely
(
list_empty
(
&
qh
->
qtd_list
)))
intr_deschedule
(
ehci
,
qh
,
0
);
...
...
@@ -867,7 +868,8 @@ static unsigned
itd_complete
(
struct
ehci_hcd
*
ehci
,
struct
ehci_itd
*
itd
,
unsigned
uframe
unsigned
uframe
,
struct
pt_regs
*
regs
)
{
struct
urb
*
urb
=
itd
->
urb
;
struct
usb_iso_packet_descriptor
*
desc
;
...
...
@@ -922,7 +924,7 @@ itd_complete (
/* complete() can reenter this HCD */
spin_unlock
(
&
ehci
->
lock
);
usb_hcd_giveback_urb
(
&
ehci
->
hcd
,
urb
,
NULL
);
usb_hcd_giveback_urb
(
&
ehci
->
hcd
,
urb
,
regs
);
spin_lock
(
&
ehci
->
lock
);
/* defer stopping schedule; completion can submit */
...
...
@@ -973,7 +975,7 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags)
/*-------------------------------------------------------------------------*/
static
void
scan_periodic
(
struct
ehci_hcd
*
ehci
)
scan_periodic
(
struct
ehci_hcd
*
ehci
,
struct
pt_regs
*
regs
)
{
unsigned
frame
,
clock
,
now_uframe
,
mod
;
unsigned
count
=
0
;
...
...
@@ -999,14 +1001,6 @@ scan_periodic (struct ehci_hcd *ehci)
u32
type
,
*
hw_p
;
unsigned
uframes
;
/* keep latencies down: let any irqs in */
if
(
count
>
max_completions
)
{
spin_unlock_irq
(
&
ehci
->
lock
);
cpu_relax
();
count
=
0
;
spin_lock_irq
(
&
ehci
->
lock
);
}
restart:
/* scan schedule to _before_ current frame index */
if
(
frame
==
clock
)
...
...
@@ -1031,7 +1025,7 @@ scan_periodic (struct ehci_hcd *ehci)
temp
=
q
.
qh
->
qh_next
;
type
=
Q_NEXT_TYPE
(
q
.
qh
->
hw_next
);
count
+=
intr_complete
(
ehci
,
frame
,
qh_get
(
q
.
qh
));
qh_get
(
q
.
qh
)
,
regs
);
qh_put
(
ehci
,
q
.
qh
);
q
=
temp
;
break
;
...
...
@@ -1064,7 +1058,7 @@ scan_periodic (struct ehci_hcd *ehci)
/* might free q.itd ... */
count
+=
itd_complete
(
ehci
,
temp
.
itd
,
uf
);
temp
.
itd
,
uf
,
regs
);
break
;
}
}
...
...
drivers/usb/host/ehci.h
View file @
c5fc26c9
...
...
@@ -65,9 +65,6 @@ struct ehci_hcd { /* one per controller */
int
next_uframe
;
/* scan periodic, start here */
unsigned
periodic_sched
;
/* periodic activity count */
/* deferred work from IRQ, etc */
struct
tasklet_struct
tasklet
;
/* per root hub port */
unsigned
long
reset_done
[
EHCI_MAX_ROOT_PORTS
];
...
...
drivers/usb/media/ibmcam.c
View file @
c5fc26c9
...
...
@@ -87,7 +87,7 @@ typedef struct {
}
ibmcam_t
;
#define IBMCAM_T(uvd) ((ibmcam_t *)((uvd)->user_data))
usbvideo_t
*
cams
=
NULL
;
struct
usbvideo
*
cams
=
NULL
;
static
int
debug
=
0
;
...
...
@@ -249,7 +249,7 @@ static videosize_t ibmcam_size_to_videosize(int size)
* History:
* 1/21/00 Created.
*/
static
ParseState_t
ibmcam_find_header
(
struct
uvd
*
uvd
)
/* FIXME: Add frame here */
static
enum
ParseState
ibmcam_find_header
(
struct
uvd
*
uvd
)
/* FIXME: Add frame here */
{
struct
usbvideo_frame
*
frame
;
ibmcam_t
*
icam
;
...
...
@@ -397,7 +397,7 @@ case IBMCAM_MODEL_4:
* 21-Jan-2000 Created.
* 12-Oct-2000 Reworked to reflect interlaced nature of the data.
*/
static
ParseState_t
ibmcam_parse_lines
(
static
enum
ParseState
ibmcam_parse_lines
(
struct
uvd
*
uvd
,
struct
usbvideo_frame
*
frame
,
long
*
pcopylen
)
...
...
@@ -662,7 +662,7 @@ static ParseState_t ibmcam_parse_lines(
* them both as R component in attempt to at least partially recover the
* lost resolution.
*/
static
ParseState_t
ibmcam_model2_320x240_parse_lines
(
static
enum
ParseState
ibmcam_model2_320x240_parse_lines
(
struct
uvd
*
uvd
,
struct
usbvideo_frame
*
frame
,
long
*
pcopylen
)
...
...
@@ -816,7 +816,7 @@ static ParseState_t ibmcam_model2_320x240_parse_lines(
return
scan_Continue
;
}
static
ParseState_t
ibmcam_model3_parse_lines
(
static
enum
ParseState
ibmcam_model3_parse_lines
(
struct
uvd
*
uvd
,
struct
usbvideo_frame
*
frame
,
long
*
pcopylen
)
...
...
@@ -961,7 +961,7 @@ static ParseState_t ibmcam_model3_parse_lines(
* History:
* 10-Feb-2001 Created.
*/
static
ParseState_t
ibmcam_model4_128x96_parse_lines
(
static
enum
ParseState
ibmcam_model4_128x96_parse_lines
(
struct
uvd
*
uvd
,
struct
usbvideo_frame
*
frame
,
long
*
pcopylen
)
...
...
@@ -1051,7 +1051,7 @@ static ParseState_t ibmcam_model4_128x96_parse_lines(
*/
void
ibmcam_ProcessIsocData
(
struct
uvd
*
uvd
,
struct
usbvideo_frame
*
frame
)
{
ParseState_t
newstate
;
enum
ParseState
newstate
;
long
copylen
=
0
;
int
mod
=
IBMCAM_T
(
uvd
)
->
camera_model
;
...
...
drivers/usb/media/konicawc.c
View file @
c5fc26c9
...
...
@@ -51,7 +51,7 @@ enum frame_sizes {
#define MAX_FRAME_SIZE SIZE_320X240
static
usbvideo_t
*
cams
;
static
struct
usbvideo
*
cams
;
#ifdef CONFIG_USB_DEBUG
static
int
debug
;
...
...
drivers/usb/media/pwc-ctrl.c
View file @
c5fc26c9
...
...
@@ -446,8 +446,8 @@ int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frame
Info
(
"Video mode %s@%d fps is only supported with the decompressor module (pwcx).
\n
"
,
size2name
[
size
],
frames
);
else
{
Err
(
"Failed to set video mode %s@%d fps; return code = %d
\n
"
,
size2name
[
size
],
frames
,
ret
);
return
ret
;
}
return
ret
;
}
pdev
->
view
.
x
=
width
;
pdev
->
view
.
y
=
height
;
...
...
@@ -1534,7 +1534,15 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
*
dynnoise
=
ret
;
break
;
}
case
VIDIOCPWCGREALSIZE
:
{
struct
pwc_imagesize
*
size
=
arg
;
size
->
width
=
pdev
->
image
.
x
;
size
->
height
=
pdev
->
image
.
y
;
break
;
}
default:
ret
=
-
ENOIOCTLCMD
;
...
...
drivers/usb/media/pwc-if.c
View file @
c5fc26c9
...
...
@@ -77,7 +77,7 @@ static struct usb_device_id pwc_device_table [] = {
{
USB_DEVICE
(
0x0471
,
0x0312
)
},
{
USB_DEVICE
(
0x069A
,
0x0001
)
},
/* Askey */
{
USB_DEVICE
(
0x046D
,
0x08b0
)
},
/* Logitech QuickCam Pro 3000 */
{
USB_DEVICE
(
0x046D
,
0x08b1
)
},
/* Logitech QuickCam
for Notebooks
*/
{
USB_DEVICE
(
0x046D
,
0x08b1
)
},
/* Logitech QuickCam
Notebook Pro
*/
{
USB_DEVICE
(
0x046D
,
0x08b2
)
},
/* Logitech QuickCam Pro 4000 */
{
USB_DEVICE
(
0x046D
,
0x08b3
)
},
/* Logitech QuickCam Zoom */
{
USB_DEVICE
(
0x055D
,
0x9000
)
},
/* Samsung */
...
...
@@ -992,7 +992,7 @@ static int pwc_video_open(struct inode *inode, struct file *file)
case
0x40
:
sensor_type
=
"UPA 1021 sensor"
;
break
;
case
0x100
:
sensor_type
=
"VGA sensor"
;
break
;
case
0x101
:
sensor_type
=
"PAL MR sensor"
;
break
;
default:
sensor_type
=
"unknown type of sensor"
;
break
;
default:
sensor_type
=
"unknown type of sensor"
;
break
;
}
if
(
sensor_type
!=
NULL
)
Info
(
"This %s camera is equipped with a %s (%d).
\n
"
,
pdev
->
vdev
->
name
,
sensor_type
,
i
);
...
...
@@ -1064,7 +1064,6 @@ static int pwc_video_open(struct inode *inode, struct file *file)
i
=
pwc_isoc_init
(
pdev
);
if
(
i
)
{
Trace
(
TRACE_OPEN
,
"Failed to init ISOC stuff = %d.
\n
"
,
i
);
MOD_DEC_USE_COUNT
;
up
(
&
pdev
->
modlock
);
return
i
;
}
...
...
@@ -1689,8 +1688,8 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
type_id
=
730
;
break
;
case
0x08b1
:
Info
(
"Logitech QuickCam
for Noteboos
USB webcam detected.
\n
"
);
name
=
"Logitech QuickCam Notebook"
;
Info
(
"Logitech QuickCam
Notebook Pro
USB webcam detected.
\n
"
);
name
=
"Logitech QuickCam Notebook
Pro
"
;
type_id
=
740
;
/* ?? unknown sensor */
break
;
case
0x08b2
:
...
...
drivers/usb/media/pwc-ioctl.h
View file @
c5fc26c9
...
...
@@ -18,12 +18,13 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* This is pwc-ioctl.h belonging to PWC 8.
7
*/
/* This is pwc-ioctl.h belonging to PWC 8.
10
*/
/*
Changes
2001/08/03 Alvarado Added ioctl constants to access methods for
changing white balance and red/blue gains
2002/12/15 G. H. Fernandez-Toribio VIDIOCGREALSIZE
*/
/* These are private ioctl() commands, specific for the Philips webcams.
...
...
@@ -104,7 +105,12 @@ struct pwc_leds
int
led_off
;
/* Led off-time; range = 0..25000 */
};
/* Image size (used with GREALSIZE) */
struct
pwc_imagesize
{
int
width
;
int
height
;
};
/* Restore user settings */
#define VIDIOCPWCRUSER _IO('v', 192)
...
...
@@ -173,4 +179,7 @@ struct pwc_leds
#define VIDIOCPWCSDYNNOISE _IOW('v', 209, int)
#define VIDIOCPWCGDYNNOISE _IOR('v', 209, int)
/* Real image size as used by the camera; tells you whether or not there's a gray border around the image */
#define VIDIOCPWCGREALSIZE _IOR('v', 210, struct pwc_imagesize)
#endif
drivers/usb/media/pwc-uncompress.h
View file @
c5fc26c9
...
...
@@ -20,8 +20,8 @@
significant change should be reflected by increasing the
pwc_decompressor_version major number.
*/
#ifndef PWC_
DEC
_H
#define PWC_
DEC
_H
#ifndef PWC_
UNCOMPRESS
_H
#define PWC_
UNCOMPRESS
_H
#include <linux/config.h>
#include <linux/list.h>
...
...
drivers/usb/media/pwc.h
View file @
c5fc26c9
...
...
@@ -60,8 +60,8 @@
/* Version block */
#define PWC_MAJOR 8
#define PWC_MINOR
9
#define PWC_VERSION "8.
9
"
#define PWC_MINOR
10
#define PWC_VERSION "8.
10
"
#define PWC_NAME "pwc"
/* Turn certain features on/off */
...
...
drivers/usb/media/ultracam.c
View file @
c5fc26c9
...
...
@@ -25,7 +25,7 @@ typedef struct {
}
ultracam_t
;
#define ULTRACAM_T(uvd) ((ultracam_t *)((uvd)->user_data))
static
usbvideo_t
*
cams
=
NULL
;
static
struct
usbvideo
*
cams
=
NULL
;
static
int
debug
=
0
;
...
...
drivers/usb/media/usbvideo.c
View file @
c5fc26c9
...
...
@@ -42,8 +42,8 @@ MODULE_PARM(video_nr, "i");
* Local prototypes.
*/
#if USES_PROC_FS
static
void
usbvideo_procfs_level1_create
(
usbvideo_t
*
ut
);
static
void
usbvideo_procfs_level1_destroy
(
usbvideo_t
*
ut
);
static
void
usbvideo_procfs_level1_create
(
struct
usbvideo
*
ut
);
static
void
usbvideo_procfs_level1_destroy
(
struct
usbvideo
*
ut
);
static
void
usbvideo_procfs_level2_create
(
struct
uvd
*
uvd
);
static
void
usbvideo_procfs_level2_destroy
(
struct
uvd
*
uvd
);
static
int
usbvideo_default_procfs_read_proc
(
...
...
@@ -765,7 +765,7 @@ static void usbvideo_ClientDecModCount(struct uvd *uvd)
}
int
usbvideo_register
(
usbvideo_t
**
pCams
,
struct
usbvideo
**
pCams
,
const
int
num_cams
,
const
int
num_extra
,
const
char
*
driverName
,
...
...
@@ -773,7 +773,7 @@ int usbvideo_register(
struct
module
*
md
,
const
struct
usb_device_id
*
id_table
)
{
usbvideo_t
*
cams
;
struct
usbvideo
*
cams
;
int
i
,
base_size
;
/* Check parameters for sanity */
...
...
@@ -788,10 +788,10 @@ int usbvideo_register(
return
-
EINVAL
;
}
base_size
=
num_cams
*
sizeof
(
struct
uvd
)
+
sizeof
(
usbvideo_t
);
cams
=
(
usbvideo_t
*
)
kmalloc
(
base_size
,
GFP_KERNEL
);
base_size
=
num_cams
*
sizeof
(
struct
uvd
)
+
sizeof
(
struct
usbvideo
);
cams
=
(
struct
usbvideo
*
)
kmalloc
(
base_size
,
GFP_KERNEL
);
if
(
cams
==
NULL
)
{
err
(
"Failed to allocate %d. bytes for usbvideo
_
t"
,
base_size
);
err
(
"Failed to allocate %d. bytes for usbvideo
struc
t"
,
base_size
);
return
-
ENOMEM
;
}
dbg
(
"%s: Allocated $%p (%d. bytes) for %d. cameras"
,
...
...
@@ -823,7 +823,7 @@ int usbvideo_register(
#else
/* !USES_PROC_FS */
/* Report a warning so that user knows why there is no /proc entries */
if
((
cams
->
cb
.
procfs_read
!=
NULL
)
||
(
cams
->
cb
.
procfs_write
==
NULL
))
{
dbg
(
"%s: /proc fs support requested but not configured!"
,
proc
);
dbg
(
"%s: /proc fs support requested but not configured!"
,
__FUNCTION__
);
}
#endif
cams
->
num_cameras
=
num_cams
;
...
...
@@ -889,9 +889,9 @@ EXPORT_SYMBOL(usbvideo_register);
* if you had some dynamically allocated components in ->user field then
* you should free them before calling here.
*/
void
usbvideo_Deregister
(
usbvideo_t
**
pCams
)
void
usbvideo_Deregister
(
struct
usbvideo
**
pCams
)
{
usbvideo_t
*
cams
;
struct
usbvideo
*
cams
;
int
i
;
if
(
pCams
==
NULL
)
{
...
...
@@ -1049,12 +1049,12 @@ static void usbvideo_CameraRelease(struct uvd *uvd)
* History:
* 27-Jan-2000 Created.
*/
static
int
usbvideo_find_struct
(
usbvideo_t
*
cams
)
static
int
usbvideo_find_struct
(
struct
usbvideo
*
cams
)
{
int
u
,
rv
=
-
1
;
if
(
cams
==
NULL
)
{
err
(
"No usbvideo
_t
handle?"
);
err
(
"No usbvideo handle?"
);
return
-
1
;
}
down
(
&
cams
->
lock
);
...
...
@@ -1089,13 +1089,13 @@ static struct video_device usbvideo_template = {
.
fops
=
&
usbvideo_fops
,
};
struct
uvd
*
usbvideo_AllocateDevice
(
usbvideo_t
*
cams
)
struct
uvd
*
usbvideo_AllocateDevice
(
struct
usbvideo
*
cams
)
{
int
i
,
devnum
;
struct
uvd
*
uvd
=
NULL
;
if
(
cams
==
NULL
)
{
err
(
"No usbvideo
_t
handle?"
);
err
(
"No usbvideo handle?"
);
return
NULL
;
}
...
...
@@ -2357,7 +2357,7 @@ static void usbvideo_SoftwareContrastAdjustment(struct uvd *uvd,
extern
struct
proc_dir_entry
*
video_proc_entry
;
static
void
usbvideo_procfs_level1_create
(
usbvideo_t
*
ut
)
static
void
usbvideo_procfs_level1_create
(
struct
usbvideo
*
ut
)
{
if
(
ut
==
NULL
)
{
err
(
"%s: ut == NULL"
,
__FUNCTION__
);
...
...
@@ -2376,7 +2376,7 @@ static void usbvideo_procfs_level1_create(usbvideo_t *ut)
}
}
static
void
usbvideo_procfs_level1_destroy
(
usbvideo_t
*
ut
)
static
void
usbvideo_procfs_level1_destroy
(
struct
usbvideo
*
ut
)
{
if
(
ut
==
NULL
)
{
err
(
"%s: ut == NULL"
,
__FUNCTION__
);
...
...
drivers/usb/media/usbvideo.h
View file @
c5fc26c9
...
...
@@ -126,37 +126,37 @@ struct RingQueue {
wait_queue_head_t
wqh
;
/* Processes waiting */
};
typedef
enum
{
enum
ScanState
{
ScanState_Scanning
,
/* Scanning for header */
ScanState_Lines
/* Parsing lines */
}
ScanState_t
;
};
/* Completion states of the data parser */
typedef
enum
{
enum
ParseState
{
scan_Continue
,
/* Just parse next item */
scan_NextFrame
,
/* Frame done, send it to V4L */
scan_Out
,
/* Not enough data for frame */
scan_EndParse
/* End parsing */
}
ParseState_t
;
};
typedef
enum
{
enum
FrameState
{
FrameState_Unused
,
/* Unused (no MCAPTURE) */
FrameState_Ready
,
/* Ready to start grabbing */
FrameState_Grabbing
,
/* In the process of being grabbed into */
FrameState_Done
,
/* Finished grabbing, but not been synced yet */
FrameState_Done_Hold
,
/* Are syncing or reading */
FrameState_Error
,
/* Something bad happened while processing */
}
FrameState_t
;
};
/*
* Some frames may contain only even or odd lines. This type
* specifies what type of deinterlacing is required.
*/
typedef
enum
{
enum
Deinterlace
{
Deinterlace_None
=
0
,
Deinterlace_FillOddLines
,
Deinterlace_FillEvenLines
}
Deinterlace_t
;
};
#define USBVIDEO_NUMFRAMES 2
/* How many frames we work with */
#define USBVIDEO_NUMSBUF 2
/* How many URBs linked in a ring */
...
...
@@ -175,9 +175,9 @@ struct usbvideo_frame {
videosize_t
request
;
/* That's what the application asked for */
unsigned
short
palette
;
/* The desired format */
FrameState_t
frameState
;
/* State of grabbing */
ScanState_t
scanstate
;
/* State of scanning */
Deinterlace_t
deinterlace
;
enum
FrameState
frameState
;
/* State of grabbing */
enum
ScanState
scanstate
;
/* State of scanning */
enum
Deinterlace
deinterlace
;
int
flags
;
/* USBVIDEO_FRAME_FLAG_xxx bit flags */
int
curline
;
/* Line of frame we're working on */
...
...
@@ -199,12 +199,12 @@ struct usbvideo_statistics {
unsigned
long
iso_err_count
;
/* How many bad ISO packets received */
};
struct
s_usbvideo_t
;
struct
usbvideo
;
struct
uvd
{
struct
video_device
vdev
;
/* Must be the first field! */
struct
usb_device
*
dev
;
struct
s_usbvideo_t
*
handle
;
/* Points back to the usbvideo_t
*/
struct
usbvideo
*
handle
;
/* Points back to the struct usbvideo
*/
void
*
user_data
;
/* Camera-dependent data */
int
user_size
;
/* Size of that camera-dependent data */
int
debug
;
/* Debug level for usbvideo */
...
...
@@ -273,7 +273,7 @@ struct usbvideo_cb {
int
(
*
setVideoMode
)(
struct
uvd
*
uvd
,
struct
video_window
*
vw
);
};
struct
s_usbvideo_t
{
struct
usbvideo
{
int
num_cameras
;
/* As allocated */
struct
usb_driver
usbdrv
;
/* Interface to the USB stack */
char
drvName
[
80
];
/* Driver name */
...
...
@@ -285,7 +285,7 @@ struct s_usbvideo_t {
struct
proc_dir_entry
*
procfs_dEntry
;
/* /proc/video/MYDRIVER */
struct
module
*
md_module
;
/* Minidriver module */
};
typedef
struct
s_usbvideo_t
usbvideo_t
;
/*
* This macro retrieves callback address from the struct uvd object.
...
...
@@ -332,16 +332,16 @@ void usbvideo_TestPattern(struct uvd *uvd, int fullframe, int pmode);
unsigned
long
usbvideo_kvirt_to_pa
(
unsigned
long
adr
);
int
usbvideo_register
(
usbvideo_t
**
pCams
,
struct
usbvideo
**
pCams
,
const
int
num_cams
,
const
int
num_extra
,
const
char
*
driverName
,
const
struct
usbvideo_cb
*
cbTable
,
struct
module
*
md
,
const
struct
usb_device_id
*
id_table
);
struct
uvd
*
usbvideo_AllocateDevice
(
usbvideo_t
*
cams
);
struct
uvd
*
usbvideo_AllocateDevice
(
struct
usbvideo
*
cams
);
int
usbvideo_RegisterVideoDevice
(
struct
uvd
*
uvd
);
void
usbvideo_Deregister
(
usbvideo_t
**
uvt
);
void
usbvideo_Deregister
(
struct
usbvideo
**
uvt
);
int
usbvideo_v4l_initialize
(
struct
video_device
*
dev
);
...
...
drivers/usb/misc/speedtouch.c
View file @
c5fc26c9
...
...
@@ -144,8 +144,9 @@ struct udsl_instance_data *minor_data[MAX_UDSL];
static
const
char
udsl_driver_name
[]
=
"Alcatel SpeedTouch USB"
;
/* data thread */
static
int
datapid
=
0
;
DECLARE_WAIT_QUEUE_HEAD
(
udsl_wqh
);
static
DECLARE_COMPLETION
(
thread_grave
);
static
unsigned
int
datapid
;
#ifdef DEBUG_PACKET
int
udsl_print_packet
(
const
unsigned
char
*
data
,
int
len
);
...
...
@@ -431,21 +432,36 @@ int udsl_atm_processqueue_thread (void *data)
strcpy
(
current
->
comm
,
"kSpeedSARd"
);
add_wait_queue
(
&
udsl_wqh
,
&
wait
);
set_current_state
(
TASK_INTERRUPTIBLE
);
for
(;;)
{
interruptible_sleep_on
(
&
udsl_wqh
);
schedule
(
);
if
(
signal_pending
(
current
))
break
;
PDEBUG
(
"SpeedSARd awoke
\n
"
);
retry:
for
(
i
=
0
;
i
<
MAX_UDSL
;
i
++
)
if
(
minor_data
[
i
])
udsl_atm_processqueue
(
minor_data
[
i
]);
set_current_state
(
TASK_INTERRUPTIBLE
);
/* we must check for data recieved and restart processing if there's any */
for
(
i
=
0
;
i
<
MAX_UDSL
;
i
++
)
{
spin_lock_irq
(
&
minor_data
[
i
]
->
recvqlock
);
if
(
!
skb_queue_empty
(
&
minor_data
[
i
]
->
recvqueue
))
{
spin_unlock_irq
(
&
minor_data
[
i
]
->
recvqlock
);
set_current_state
(
TASK_RUNNING
);
goto
retry
;
}
else
{
spin_unlock_irq
(
&
minor_data
[
i
]
->
recvqlock
);
}
}
};
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
&
udsl_wqh
,
&
wait
);
datapid
=
0
;
PDEBUG
(
"SpeedSARd is exiting
\n
"
);
return
0
;
complete_and_exit
(
&
thread_grave
,
0
);
return
0
;
//never reached
}
...
...
@@ -461,16 +477,7 @@ void udsl_atm_sar_stop (void)
/* Kill the thread */
ret
=
kill_proc
(
datapid
,
SIGTERM
,
1
);
if
(
!
ret
)
{
/* Wait 10 seconds */
int
count
=
10
*
100
;
while
(
datapid
&&
--
count
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
1
);
}
if
(
!
count
)
err
(
"giving up on killing SpeedSAR thread."
);
wait_for_completion
(
&
thread_grave
);
}
}
...
...
@@ -598,7 +605,7 @@ static void udsl_usb_send_data_complete (struct urb *urb, struct pt_regs *regs)
(
unsigned
char
*
)
ctx
->
skb
->
data
,
ctx
->
skb
->
len
,
udsl_usb_send_data_complete
,
ctx
);
err
=
usb_submit_urb
(
urb
,
GFP_
KERNEL
);
err
=
usb_submit_urb
(
urb
,
GFP_
ATOMIC
);
PDEBUG
(
"udsl_usb_send_data_completion (send packet %p with length %d), retval = %d
\n
"
,
ctx
->
skb
,
ctx
->
skb
->
len
,
err
);
...
...
@@ -747,7 +754,7 @@ void udsl_usb_data_receive (struct urb *urb, struct pt_regs *regs)
usb_rcvbulkpipe
(
instance
->
usb_dev
,
UDSL_ENDPOINT_DATA_IN
),
(
unsigned
char
*
)
ctx
->
skb
->
data
,
UDSL_RECEIVE_BUFFER_SIZE
,
udsl_usb_data_receive
,
ctx
);
usb_submit_urb
(
urb
,
GFP_
KERNEL
);
usb_submit_urb
(
urb
,
GFP_
ATOMIC
);
return
;
};
...
...
@@ -845,8 +852,7 @@ static int udsl_usb_data_exit (struct udsl_instance_data *instance)
if
((
!
ctx
->
urb
)
||
(
!
ctx
->
skb
))
continue
;
if
(
ctx
->
urb
->
status
==
-
EINPROGRESS
)
usb_unlink_urb
(
ctx
->
urb
);
usb_unlink_urb
(
ctx
->
urb
);
usb_free_urb
(
ctx
->
urb
);
kfree_skb
(
ctx
->
skb
);
...
...
@@ -856,8 +862,7 @@ static int udsl_usb_data_exit (struct udsl_instance_data *instance)
for
(
i
=
0
;
i
<
UDSL_NUMBER_SND_URBS
;
i
++
)
{
struct
udsl_usb_send_data_context
*
ctx
=
&
(
instance
->
send_ctx
[
i
]);
if
(
ctx
->
urb
->
status
==
-
EINPROGRESS
)
usb_unlink_urb
(
ctx
->
urb
);
usb_unlink_urb
(
ctx
->
urb
);
if
(
ctx
->
skb
)
ctx
->
vcc
->
pop
(
ctx
->
vcc
,
ctx
->
skb
);
...
...
drivers/usb/misc/usblcd.c
View file @
c5fc26c9
...
...
@@ -98,7 +98,7 @@ ioctl_lcd(struct inode *inode, struct file *file, unsigned int cmd,
return
-
EFAULT
;
break
;
default:
return
-
ENO
IOCTLCMD
;
return
-
ENO
TTY
;
break
;
}
...
...
drivers/usb/net/usbnet.c
View file @
c5fc26c9
...
...
@@ -35,7 +35,7 @@
* - GeneSys GL620USB-A
* - NetChip 1080 (interoperates with NetChip Win32 drivers)
* - Prolific PL-2301/2302 (replaces "plusb" driver)
* -
SA-1100 based
Linux PDAs like iPaq, Yopy, and Zaurus
* -
PXA-250 or SA-1100
Linux PDAs like iPaq, Yopy, and Zaurus
*
* USB devices can implement their side of this protocol at the cost
* of two bulk endpoints; it's not restricted to "cable" applications.
...
...
@@ -61,8 +61,9 @@
* sheets, sometimes it's not needed and sometimes it hangs. Prolific has
* not responded to repeated support/information requests.
*
* - SA-1100 PDAs ... the www.handhelds.org SA-1100 support works nicely.
* Zaurus support has some problems; it's made UHCI die.
* - SA-1100 PDAs ... the standard ARM Linux SA-1100 support works nicely,
* as found in www.handhelds.org and other kernels. The Sharp/Lineo
* kernels use different drivers, which also talk to this code.
*
* Interop with more Win32 drivers may be a good thing.
*
...
...
@@ -116,7 +117,10 @@
* 07-may-2002 Generalize/cleanup keventd support, handling rx stalls (mostly
* for USB 2.0 TTs) and memory shortages (potential) too. (db)
* Use "locally assigned" IEEE802 address space. (Brad Hards)
* 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db).
* 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db).
* 14-dec-2002 Remove Zaurus-private crc32 code (Pavel); 2.5 oops fix,
* cleanups and stubbed PXA-250 support (db), fix for framing
* issues on Z, net1080, and gl620a (Toby Milne)
*
*-------------------------------------------------------------------------*/
...
...
@@ -150,7 +154,8 @@
#define CONFIG_USB_GENESYS
#define CONFIG_USB_NET1080
#define CONFIG_USB_PL2301
#define CONFIG_USB_SA1110
// #define CONFIG_USB_PXA
#define CONFIG_USB_SA1100
#define CONFIG_USB_ZAURUS
...
...
@@ -162,6 +167,8 @@
* Nineteen USB 1.1 max size bulk transactions per frame (ms), max.
* Several dozen bytes of IPv4 data can fit in two such transactions.
* One maximum size Ethernet packet takes twenty four of them.
* For high speed, each frame comfortably fits almost 36 max size
* Ethernet packets (so queues should be bigger).
*/
#ifdef REALLY_QUEUE
#define RX_QLEN 4
...
...
@@ -233,6 +240,7 @@ struct driver_info {
int
flags
;
#define FLAG_FRAMING_NC 0x0001
/* guard against device dropouts */
#define FLAG_FRAMING_GL 0x0002
/* genelink batches packets */
#define FLAG_FRAMING_Z 0x0004
/* zaurus adds a trailer */
#define FLAG_NO_SETINT 0x0010
/* device can't set_interface() */
/* reset device ... can sleep */
...
...
@@ -287,6 +295,12 @@ MODULE_PARM_DESC (msg_level, "Initial message level (default = 1)");
#define RUN_CONTEXT (in_irq () ? "in_irq" \
: (in_interrupt () ? "in_interrupt" : "can sleep"))
/* mostly for PDA style devices, which are always present */
static
int
always_connected
(
struct
usbnet
*
dev
)
{
return
0
;
}
/*-------------------------------------------------------------------------*/
#ifdef DEBUG
...
...
@@ -364,6 +378,7 @@ static const struct driver_info belkin_info = {
static
const
struct
driver_info
epson2888_info
=
{
.
description
=
"Epson USB Device"
,
.
check_connect
=
always_connected
,
.
in
=
4
,
.
out
=
3
,
.
epsize
=
64
,
...
...
@@ -457,10 +472,12 @@ static void gl_interrupt_complete (struct urb *urb, struct pt_regs *regs)
case
-
ENOENT
:
case
-
ESHUTDOWN
:
/* this urb is terminated, clean up */
dbg
(
"%s - urb shutting down with status: %d"
,
__FUNCTION__
,
status
);
dbg
(
"%s - urb shutting down with status: %d"
,
__FUNCTION__
,
status
);
return
;
default:
dbg
(
"%s - nonzero urb status received: %d"
,
__FUNCTION__
,
urb
->
status
);
dbg
(
"%s - nonzero urb status received: %d"
,
__FUNCTION__
,
urb
->
status
);
}
status
=
usb_submit_urb
(
urb
,
GFP_ATOMIC
);
...
...
@@ -1223,6 +1240,27 @@ static const struct driver_info prolific_info = {
#endif
/* CONFIG_USB_PL2301 */
#ifdef CONFIG_USB_PXA
/*-------------------------------------------------------------------------
*
* PXA250 and PXA210 use XScale cores (ARM v5TE) with better USB support,
* and different USB endpoint numbering than the SA1100 devices.
*
*-------------------------------------------------------------------------*/
static
const
struct
driver_info
pxa_info
=
{
.
description
=
"PXA-250 Linux Device"
,
.
check_connect
=
always_connected
,
.
in
=
1
,
.
out
=
2
,
.
epsize
=
64
,
};
#endif
/* CONFIG_USB_PXA */
#ifdef CONFIG_USB_SA1100
...
...
@@ -1230,16 +1268,17 @@ static const struct driver_info prolific_info = {
*
* Intel's SA-1100 chip integrates basic USB support, and is used
* in PDAs like some iPaqs, the Yopy, some Zaurus models, and more.
* When they run
s Linux, arch/arm/
sa1100/usb-eth.c may be used to
* When they run
Linux, arch/arm/mach-
sa1100/usb-eth.c may be used to
* network using minimal USB framing data.
*
* This describes the driver currently in
www.handhelds.org
kernels.
* This describes the driver currently in
standard ARM Linux
kernels.
* The Zaurus uses a different driver (see later).
*
*-------------------------------------------------------------------------*/
static
const
struct
driver_info
linuxdev_info
=
{
.
description
=
"SA-1100 Linux Device"
,
.
check_connect
=
always_connected
,
.
in
=
2
,
.
out
=
1
,
.
epsize
=
64
,
...
...
@@ -1247,6 +1286,7 @@ static const struct driver_info linuxdev_info = {
static
const
struct
driver_info
yopy_info
=
{
.
description
=
"Yopy"
,
.
check_connect
=
always_connected
,
.
in
=
2
,
.
out
=
1
,
.
epsize
=
64
,
...
...
@@ -1257,65 +1297,20 @@ static const struct driver_info yopy_info = {
#ifdef CONFIG_USB_ZAURUS
#include <linux/crc32.h>
/*-------------------------------------------------------------------------
*
* Zaurus is also a SA-1110 based PDA, but one using a different driver
*
for its USB slave/tar
get controller than the case above.
*
(and framing) for its USB slave/gad
get controller than the case above.
*
* The key differences are that (a) it's got a msft-friendly configuration,
* and (b) the linux-friendly framing adds a crc32 to cope with some
* memory corruption observed with usb-to-memory DMA in some cases.
* For the current version of that driver, the main way that framing is
* nonstandard (also from perspective of the CDC ethernet model!) is a
* crc32, added to help detect when some sa1100 usb-to-memory DMA errata
* haven't been fully worked around.
*
*-------------------------------------------------------------------------*/
static
const
u32
crc32_table
[
256
]
=
{
0x00000000
,
0x77073096
,
0xee0e612c
,
0x990951ba
,
0x076dc419
,
0x706af48f
,
0xe963a535
,
0x9e6495a3
,
0x0edb8832
,
0x79dcb8a4
,
0xe0d5e91e
,
0x97d2d988
,
0x09b64c2b
,
0x7eb17cbd
,
0xe7b82d07
,
0x90bf1d91
,
0x1db71064
,
0x6ab020f2
,
0xf3b97148
,
0x84be41de
,
0x1adad47d
,
0x6ddde4eb
,
0xf4d4b551
,
0x83d385c7
,
0x136c9856
,
0x646ba8c0
,
0xfd62f97a
,
0x8a65c9ec
,
0x14015c4f
,
0x63066cd9
,
0xfa0f3d63
,
0x8d080df5
,
0x3b6e20c8
,
0x4c69105e
,
0xd56041e4
,
0xa2677172
,
0x3c03e4d1
,
0x4b04d447
,
0xd20d85fd
,
0xa50ab56b
,
0x35b5a8fa
,
0x42b2986c
,
0xdbbbc9d6
,
0xacbcf940
,
0x32d86ce3
,
0x45df5c75
,
0xdcd60dcf
,
0xabd13d59
,
0x26d930ac
,
0x51de003a
,
0xc8d75180
,
0xbfd06116
,
0x21b4f4b5
,
0x56b3c423
,
0xcfba9599
,
0xb8bda50f
,
0x2802b89e
,
0x5f058808
,
0xc60cd9b2
,
0xb10be924
,
0x2f6f7c87
,
0x58684c11
,
0xc1611dab
,
0xb6662d3d
,
0x76dc4190
,
0x01db7106
,
0x98d220bc
,
0xefd5102a
,
0x71b18589
,
0x06b6b51f
,
0x9fbfe4a5
,
0xe8b8d433
,
0x7807c9a2
,
0x0f00f934
,
0x9609a88e
,
0xe10e9818
,
0x7f6a0dbb
,
0x086d3d2d
,
0x91646c97
,
0xe6635c01
,
0x6b6b51f4
,
0x1c6c6162
,
0x856530d8
,
0xf262004e
,
0x6c0695ed
,
0x1b01a57b
,
0x8208f4c1
,
0xf50fc457
,
0x65b0d9c6
,
0x12b7e950
,
0x8bbeb8ea
,
0xfcb9887c
,
0x62dd1ddf
,
0x15da2d49
,
0x8cd37cf3
,
0xfbd44c65
,
0x4db26158
,
0x3ab551ce
,
0xa3bc0074
,
0xd4bb30e2
,
0x4adfa541
,
0x3dd895d7
,
0xa4d1c46d
,
0xd3d6f4fb
,
0x4369e96a
,
0x346ed9fc
,
0xad678846
,
0xda60b8d0
,
0x44042d73
,
0x33031de5
,
0xaa0a4c5f
,
0xdd0d7cc9
,
0x5005713c
,
0x270241aa
,
0xbe0b1010
,
0xc90c2086
,
0x5768b525
,
0x206f85b3
,
0xb966d409
,
0xce61e49f
,
0x5edef90e
,
0x29d9c998
,
0xb0d09822
,
0xc7d7a8b4
,
0x59b33d17
,
0x2eb40d81
,
0xb7bd5c3b
,
0xc0ba6cad
,
0xedb88320
,
0x9abfb3b6
,
0x03b6e20c
,
0x74b1d29a
,
0xead54739
,
0x9dd277af
,
0x04db2615
,
0x73dc1683
,
0xe3630b12
,
0x94643b84
,
0x0d6d6a3e
,
0x7a6a5aa8
,
0xe40ecf0b
,
0x9309ff9d
,
0x0a00ae27
,
0x7d079eb1
,
0xf00f9344
,
0x8708a3d2
,
0x1e01f268
,
0x6906c2fe
,
0xf762575d
,
0x806567cb
,
0x196c3671
,
0x6e6b06e7
,
0xfed41b76
,
0x89d32be0
,
0x10da7a5a
,
0x67dd4acc
,
0xf9b9df6f
,
0x8ebeeff9
,
0x17b7be43
,
0x60b08ed5
,
0xd6d6a3e8
,
0xa1d1937e
,
0x38d8c2c4
,
0x4fdff252
,
0xd1bb67f1
,
0xa6bc5767
,
0x3fb506dd
,
0x48b2364b
,
0xd80d2bda
,
0xaf0a1b4c
,
0x36034af6
,
0x41047a60
,
0xdf60efc3
,
0xa867df55
,
0x316e8eef
,
0x4669be79
,
0xcb61b38c
,
0xbc66831a
,
0x256fd2a0
,
0x5268e236
,
0xcc0c7795
,
0xbb0b4703
,
0x220216b9
,
0x5505262f
,
0xc5ba3bbe
,
0xb2bd0b28
,
0x2bb45a92
,
0x5cb36a04
,
0xc2d7ffa7
,
0xb5d0cf31
,
0x2cd99e8b
,
0x5bdeae1d
,
0x9b64c2b0
,
0xec63f226
,
0x756aa39c
,
0x026d930a
,
0x9c0906a9
,
0xeb0e363f
,
0x72076785
,
0x05005713
,
0x95bf4a82
,
0xe2b87a14
,
0x7bb12bae
,
0x0cb61b38
,
0x92d28e9b
,
0xe5d5be0d
,
0x7cdcefb7
,
0x0bdbdf21
,
0x86d3d2d4
,
0xf1d4e242
,
0x68ddb3f8
,
0x1fda836e
,
0x81be16cd
,
0xf6b9265b
,
0x6fb077e1
,
0x18b74777
,
0x88085ae6
,
0xff0f6a70
,
0x66063bca
,
0x11010b5c
,
0x8f659eff
,
0xf862ae69
,
0x616bffd3
,
0x166ccf45
,
0xa00ae278
,
0xd70dd2ee
,
0x4e048354
,
0x3903b3c2
,
0xa7672661
,
0xd06016f7
,
0x4969474d
,
0x3e6e77db
,
0xaed16a4a
,
0xd9d65adc
,
0x40df0b66
,
0x37d83bf0
,
0xa9bcae53
,
0xdebb9ec5
,
0x47b2cf7f
,
0x30b5ffe9
,
0xbdbdf21c
,
0xcabac28a
,
0x53b39330
,
0x24b4a3a6
,
0xbad03605
,
0xcdd70693
,
0x54de5729
,
0x23d967bf
,
0xb3667a2e
,
0xc4614ab8
,
0x5d681b02
,
0x2a6f2b94
,
0xb40bbe37
,
0xc30c8ea1
,
0x5a05df1b
,
0x2d02ef8d
};
#define CRC32_INITFCS 0xffffffff // Initial FCS value
#define CRC32_FCS(fcs, c) (((fcs) >> 8) ^ crc32_table[((fcs) ^ (c)) & 0xff])
/* fcs_compute32 - memcpy and calculate fcs
* Perform a memcpy and calculate fcs using ppp 32bit CRC algorithm.
*/
static
inline
u32
fcs_compute32
(
unsigned
char
*
sp
,
int
len
,
u32
fcs
)
{
for
(;
len
--
>
0
;
fcs
=
CRC32_FCS
(
fcs
,
*
sp
++
))
continue
;
return
fcs
;
}
static
struct
sk_buff
*
zaurus_tx_fixup
(
struct
usbnet
*
dev
,
struct
sk_buff
*
skb
,
int
flags
)
{
...
...
@@ -1334,11 +1329,9 @@ zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
if
(
skb
)
{
u32
fcs
;
done:
fcs
=
fcs_compute32
(
skb
->
data
,
skb
->
len
,
CRC32_INITFCS
);
fcs
=
crc32_le
(
~
0
,
skb
->
data
,
skb
->
len
);
fcs
=
~
fcs
;
// ? add optional byte make addr even ?
*
skb_put
(
skb
,
1
)
=
fcs
&
0xff
;
*
skb_put
(
skb
,
1
)
=
(
fcs
>>
8
)
&
0xff
;
*
skb_put
(
skb
,
1
)
=
(
fcs
>>
16
)
&
0xff
;
...
...
@@ -1349,6 +1342,8 @@ zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
static
const
struct
driver_info
zaurus_sl5x00_info
=
{
.
description
=
"Sharp Zaurus SL-5x00"
,
.
flags
=
FLAG_FRAMING_Z
,
.
check_connect
=
always_connected
,
.
tx_fixup
=
zaurus_tx_fixup
,
.
in
=
2
,
.
out
=
1
,
...
...
@@ -1356,11 +1351,16 @@ static const struct driver_info zaurus_sl5x00_info = {
};
static
const
struct
driver_info
zaurus_sla300_info
=
{
.
description
=
"Sharp Zaurus SL-A300"
,
.
flags
=
FLAG_FRAMING_Z
,
.
check_connect
=
always_connected
,
.
tx_fixup
=
zaurus_tx_fixup
,
.
in
=
1
,
.
out
=
2
,
.
epsize
=
64
,
};
// SL-5600 and C-700 are PXA based; should resemble A300
#endif
...
...
@@ -1403,7 +1403,7 @@ static struct net_device_stats *usbnet_get_stats (struct net_device *net)
/*-------------------------------------------------------------------------*/
/* urb completions
are currently
in_irq; avoid doing real work then. */
/* urb completions
may be
in_irq; avoid doing real work then. */
static
void
defer_bh
(
struct
usbnet
*
dev
,
struct
sk_buff
*
skb
)
{
...
...
@@ -1456,6 +1456,11 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags)
if
(
dev
->
driver_info
->
flags
&
FLAG_FRAMING_GL
)
size
=
GL_RCV_BUF_SIZE
;
else
#endif
#ifdef CONFIG_USB_ZAURUS
if
(
dev
->
driver_info
->
flags
&
FLAG_FRAMING_Z
)
size
=
6
+
(
sizeof
(
struct
ethhdr
)
+
dev
->
net
.
mtu
);
else
#endif
size
=
(
sizeof
(
struct
ethhdr
)
+
dev
->
net
.
mtu
);
...
...
@@ -1476,11 +1481,6 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags)
usb_rcvbulkpipe
(
dev
->
udev
,
dev
->
driver_info
->
in
),
skb
->
data
,
size
,
rx_complete
,
skb
);
urb
->
transfer_flags
|=
URB_ASYNC_UNLINK
;
#if 0
// Idle-but-posted reads with UHCI really chew up
// PCI bandwidth unless FSBR is disabled
urb->transfer_flags |= URB_NO_FSBR;
#endif
spin_lock_irqsave
(
&
dev
->
rxq
.
lock
,
lockflags
);
...
...
@@ -1524,8 +1524,6 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)
if
(
skb
->
len
)
{
int
status
;
// FIXME: eth_copy_and_csum "small" packets to new SKB (small < ~200 bytes) ?
skb
->
dev
=
&
dev
->
net
;
skb
->
protocol
=
eth_type_trans
(
skb
,
&
dev
->
net
);
dev
->
stats
.
rx_packets
++
;
...
...
@@ -1904,7 +1902,7 @@ static void usbnet_tx_timeout (struct net_device *net)
static
int
usbnet_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
net
)
{
struct
usbnet
*
dev
=
(
struct
usbnet
*
)
net
->
priv
;
int
length
=
skb
->
len
;
int
length
;
int
retval
=
NET_XMIT_SUCCESS
;
struct
urb
*
urb
=
0
;
struct
skb_data
*
entry
;
...
...
@@ -1924,6 +1922,7 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
goto
drop
;
}
}
length
=
skb
->
len
;
if
(
!
(
urb
=
usb_alloc_urb
(
0
,
GFP_ATOMIC
)))
{
dbg
(
"no urb"
);
...
...
@@ -1938,6 +1937,7 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
// FIXME: reorganize a bit, so that fixup() fills out NetChip
// framing too. (Packet ID update needs the spinlock...)
// [ BETTER: we already own net->xmit_lock, that's enough ]
#ifdef CONFIG_USB_NET1080
if
(
info
->
flags
&
FLAG_FRAMING_NC
)
{
...
...
@@ -1958,7 +1958,6 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
usb_sndbulkpipe
(
dev
->
udev
,
info
->
out
),
skb
->
data
,
skb
->
len
,
tx_complete
,
skb
);
urb
->
transfer_flags
|=
URB_ASYNC_UNLINK
;
// FIXME urb->timeout = ... jiffies ... ;
spin_lock_irqsave
(
&
dev
->
txq
.
lock
,
flags
);
...
...
@@ -2198,7 +2197,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
#endif
// ok, it's ready to go.
dev_set_drvdata
(
&
udev
->
dev
,
net
);
dev_set_drvdata
(
&
udev
->
dev
,
dev
);
mutex_lock
(
&
usbnet_mutex
);
list_add
(
&
dev
->
dev_list
,
&
usbnet_list
);
mutex_unlock
(
&
dev
->
mutex
);
...
...
@@ -2280,15 +2279,28 @@ static const struct usb_device_id products [] = {
},
#endif
#ifdef CONFIG_USB_PXA
/*
* PXA250 or PXA210 ... these use a "usb-eth" driver much like
* the sa1100 one.
*/
{
// Compaq "Itsy" vendor/product id, version "2.0"
USB_DEVICE_VER
(
0x049F
,
0x505A
,
0x0200
,
0x0200
),
.
driver_info
=
(
unsigned
long
)
&
pxa_info
,
},
#endif
#ifdef CONFIG_USB_SA1100
/*
* SA-1100 using
www.handhelds.org
kernels, or compatible.
* SA-1100 using
standard ARM Linux
kernels, or compatible.
* Often used when talking to Linux PDAs (iPaq, Yopy, etc).
* The sa-1100 "usb-eth" driver handles the basic framing.
*/
{
// 1183 = 0x049F, both used as hex values?
USB_DEVICE
(
0x049F
,
0x505A
),
// iPaq: Compaq "Itsy"
// Compaq "Itsy" vendor/product id, version "0.0"
USB_DEVICE_VER
(
0x049F
,
0x505A
,
0
,
0
),
.
driver_info
=
(
unsigned
long
)
&
linuxdev_info
,
},
{
USB_DEVICE
(
0x0E7E
,
0x1001
),
// G.Mate "Yopy"
...
...
@@ -2323,8 +2335,6 @@ static const struct usb_device_id products [] = {
},
#endif
/* KC2190 from www.sepoong.co.kr "InstaNET" */
{
},
// END
};
MODULE_DEVICE_TABLE
(
usb
,
products
);
...
...
drivers/usb/serial/belkin_sa.c
View file @
c5fc26c9
...
...
@@ -126,6 +126,7 @@ static struct usb_driver belkin_driver = {
static
struct
usb_serial_device_type
belkin_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Belkin / Peracom / GoHubs USB Serial Adapter"
,
.
short_name
=
"belkin"
,
.
id_table
=
id_table_combined
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/bus.c
View file @
c5fc26c9
...
...
@@ -121,7 +121,10 @@ int usb_serial_bus_register(struct usb_serial_device_type *device)
{
int
retval
;
device
->
driver
.
name
=
(
char
*
)
device
->
name
;
if
(
device
->
short_name
)
device
->
driver
.
name
=
(
char
*
)
device
->
short_name
;
else
device
->
driver
.
name
=
(
char
*
)
device
->
name
;
device
->
driver
.
bus
=
&
usb_serial_bus_type
;
device
->
driver
.
probe
=
usb_serial_device_probe
;
device
->
driver
.
remove
=
usb_serial_device_remove
;
...
...
drivers/usb/serial/cyberjack.c
View file @
c5fc26c9
...
...
@@ -83,6 +83,7 @@ static struct usb_driver cyberjack_driver = {
static
struct
usb_serial_device_type
cyberjack_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Reiner SCT Cyberjack USB card reader"
,
.
short_name
=
"cyberjack"
,
.
id_table
=
id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/generic.c
View file @
c5fc26c9
...
...
@@ -43,6 +43,7 @@ static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
struct
usb_serial_device_type
usb_serial_generic_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Generic"
,
.
short_name
=
"generic"
,
.
id_table
=
generic_device_ids
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
drivers/usb/serial/io_tables.h
View file @
c5fc26c9
...
...
@@ -100,6 +100,7 @@ MODULE_DEVICE_TABLE (usb, id_table_combined);
static
struct
usb_serial_device_type
edgeport_1port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport 1 port adapter"
,
.
short_name
=
"edgeport_1"
,
.
id_table
=
edgeport_1port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
@@ -122,6 +123,7 @@ static struct usb_serial_device_type edgeport_1port_device = {
static
struct
usb_serial_device_type
edgeport_2port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport 2 port adapter"
,
.
short_name
=
"edgeport_2"
,
.
id_table
=
edgeport_2port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
@@ -144,6 +146,7 @@ static struct usb_serial_device_type edgeport_2port_device = {
static
struct
usb_serial_device_type
edgeport_4port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport 4 port adapter"
,
.
short_name
=
"edgeport_4"
,
.
id_table
=
edgeport_4port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
@@ -166,6 +169,7 @@ static struct usb_serial_device_type edgeport_4port_device = {
static
struct
usb_serial_device_type
edgeport_8port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport 8 port adapter"
,
.
short_name
=
"edgeport_8"
,
.
id_table
=
edgeport_8port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/io_ti.c
View file @
c5fc26c9
...
...
@@ -2635,6 +2635,7 @@ static void edge_shutdown (struct usb_serial *serial)
static
struct
usb_serial_device_type
edgeport_1port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport TI 1 port adapter"
,
.
short_name
=
"edgeport_ti_1"
,
.
id_table
=
edgeport_1port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
@@ -2657,6 +2658,7 @@ static struct usb_serial_device_type edgeport_1port_device = {
static
struct
usb_serial_device_type
edgeport_2port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Edgeport TI 2 port adapter"
,
.
short_name
=
"edgeport_ti_2"
,
.
id_table
=
edgeport_2port_id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
2
,
...
...
drivers/usb/serial/keyspan.h
View file @
c5fc26c9
...
...
@@ -481,6 +481,7 @@ static struct usb_device_id keyspan_4port_ids[] = {
static
struct
usb_serial_device_type
keyspan_pre_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan - (without firmware)"
,
.
short_name
=
"keyspan_no_firm"
,
.
id_table
=
keyspan_pre_ids
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -492,6 +493,7 @@ static struct usb_serial_device_type keyspan_pre_device = {
static
struct
usb_serial_device_type
keyspan_1port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan 1 port adapter"
,
.
short_name
=
"keyspan_1"
,
.
id_table
=
keyspan_1port_ids
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
3
,
...
...
@@ -514,6 +516,7 @@ static struct usb_serial_device_type keyspan_1port_device = {
static
struct
usb_serial_device_type
keyspan_2port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan 2 port adapter"
,
.
short_name
=
"keyspan_2"
,
.
id_table
=
keyspan_2port_ids
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -536,6 +539,7 @@ static struct usb_serial_device_type keyspan_2port_device = {
static
struct
usb_serial_device_type
keyspan_4port_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan 4 port adapter"
,
.
short_name
=
"keyspan_4"
,
.
id_table
=
keyspan_4port_ids
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
5
,
...
...
drivers/usb/serial/keyspan_pda.c
View file @
c5fc26c9
...
...
@@ -827,6 +827,7 @@ static void keyspan_pda_shutdown (struct usb_serial *serial)
static
struct
usb_serial_device_type
keyspan_pda_fake_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan PDA - (prerenumeration)"
,
.
short_name
=
"kyspn_pda_nofirm"
,
.
id_table
=
id_table_fake
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -840,6 +841,7 @@ static struct usb_serial_device_type keyspan_pda_fake_device = {
static
struct
usb_serial_device_type
xircom_pgs_fake_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Xircom / Entregra PGS - (prerenumeration)"
,
.
short_name
=
"xircom_nofirm"
,
.
id_table
=
id_table_fake_xircom
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -852,6 +854,7 @@ static struct usb_serial_device_type xircom_pgs_fake_device = {
static
struct
usb_serial_device_type
keyspan_pda_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Keyspan PDA"
,
.
short_name
=
"keyspan_pda"
,
.
id_table
=
id_table_std
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
0
,
...
...
drivers/usb/serial/kl5kusb105.c
View file @
c5fc26c9
...
...
@@ -127,6 +127,7 @@ static struct usb_driver kl5kusb105d_driver = {
static
struct
usb_serial_device_type
kl5kusb105d_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"KL5KUSB105D / PalmConnect"
,
.
short_name
=
"kl5kusb105d"
,
.
id_table
=
id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/mct_u232.c
View file @
c5fc26c9
...
...
@@ -149,6 +149,7 @@ static struct usb_driver mct_u232_driver = {
static
struct
usb_serial_device_type
mct_u232_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Magic Control Technology USB-RS232"
,
.
short_name
=
"mct_u232"
,
.
id_table
=
id_table_combined
,
.
num_interrupt_in
=
2
,
.
num_bulk_in
=
0
,
...
...
drivers/usb/serial/omninet.c
View file @
c5fc26c9
...
...
@@ -94,6 +94,7 @@ static struct usb_driver omninet_driver = {
static
struct
usb_serial_device_type
zyxel_omninet_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"ZyXEL - omni.net lcd plus usb"
,
.
short_name
=
"omninet"
,
.
id_table
=
id_table
,
.
num_interrupt_in
=
1
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/usb-serial.h
View file @
c5fc26c9
...
...
@@ -168,6 +168,9 @@ struct usb_serial {
* @owner: pointer to the module that owns this device.
* @name: pointer to a string that describes this device. This string used
* in the syslog messages when a device is inserted or removed.
* @short_name: a pointer to a string that describes this device in
* KOBJ_NAME_LEN characters or less. This is used for the sysfs interface
* to describe the driver.
* @id_table: pointer to a list of usb_device_id structures that define all
* of the devices this structure can support.
* @num_interrupt_in: the number of interrupt in endpoints this device will
...
...
@@ -201,6 +204,7 @@ struct usb_serial {
struct
usb_serial_device_type
{
struct
module
*
owner
;
char
*
name
;
char
*
short_name
;
const
struct
usb_device_id
*
id_table
;
char
num_interrupt_in
;
char
num_bulk_in
;
...
...
drivers/usb/serial/visor.c
View file @
c5fc26c9
...
...
@@ -236,6 +236,7 @@ static struct usb_driver visor_driver = {
static
struct
usb_serial_device_type
handspring_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Handspring Visor / Treo / Palm 4.0 / Clié 4.x"
,
.
short_name
=
"visor"
,
.
id_table
=
id_table
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
2
,
...
...
@@ -262,6 +263,7 @@ static struct usb_serial_device_type handspring_device = {
static
struct
usb_serial_device_type
clie_3_5_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Sony Clié 3.5"
,
.
short_name
=
"clie_3.5"
,
.
id_table
=
clie_id_3_5_table
,
.
num_interrupt_in
=
0
,
.
num_bulk_in
=
1
,
...
...
drivers/usb/serial/whiteheat.c
View file @
c5fc26c9
...
...
@@ -156,6 +156,7 @@ static void whiteheat_write_callback (struct urb *urb, struct pt_regs *regs);
static
struct
usb_serial_device_type
whiteheat_fake_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Connect Tech - WhiteHEAT - (prerenumeration)"
,
.
short_name
=
"whiteheatnofirm"
,
.
id_table
=
id_table_prerenumeration
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -168,6 +169,7 @@ static struct usb_serial_device_type whiteheat_fake_device = {
static
struct
usb_serial_device_type
whiteheat_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Connect Tech - WhiteHEAT"
,
.
short_name
=
"whiteheat"
,
.
id_table
=
id_table_std
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
...
...
@@ -512,9 +514,11 @@ static int whiteheat_attach (struct usb_serial *serial)
no_rx_buf:
usb_free_urb
(
urb
);
no_rx_urb:
;
}
kfree
(
info
);
no_private:
;
}
return
-
ENOMEM
;
}
...
...
drivers/usb/storage/transport.c
View file @
c5fc26c9
...
...
@@ -480,7 +480,7 @@ int usb_stor_control_msg(struct us_data *us, unsigned int pipe,
status
=
usb_stor_msg_common
(
us
);
/* return the actual length of the data transferred if no error */
if
(
status
>
=
0
)
if
(
status
=
=
0
)
status
=
us
->
current_urb
->
actual_length
;
return
status
;
}
...
...
@@ -583,50 +583,52 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe,
US_DEBUGP
(
"Status code %d; transferred %u/%u
\n
"
,
result
,
partial
,
length
);
switch
(
result
)
{
/* stalled */
if
(
result
==
-
EPIPE
)
{
/* no error code; did we send all the data? */
case
0
:
if
(
partial
!=
length
)
{
US_DEBUGP
(
"-- short transfer
\n
"
);
return
USB_STOR_XFER_SHORT
;
}
US_DEBUGP
(
"-- transfer complete
\n
"
);
return
USB_STOR_XFER_GOOD
;
/* for non-bulk (i.e., control) endpoints, a stall indicates
* a protocol error */
if
(
!
usb_pipebulk
(
pipe
))
{
/* stalled */
case
-
EPIPE
:
/* for control endpoints, a stall indicates a protocol error */
if
(
usb_pipecontrol
(
pipe
))
{
US_DEBUGP
(
"-- stall on control pipe
\n
"
);
return
USB_STOR_XFER_ERROR
;
}
/* for
a bulk
endpoint, clear the stall */
/* for
other sorts of
endpoint, clear the stall */
US_DEBUGP
(
"clearing endpoint halt for pipe 0x%x
\n
"
,
pipe
);
if
(
usb_stor_clear_halt
(
us
,
pipe
)
<
0
)
return
USB_STOR_XFER_ERROR
;
return
USB_STOR_XFER_STALLED
;
}
/* NAK - that means we've retried this a few times already */
if
(
result
==
-
ETIMEDOUT
)
{
case
-
ETIMEDOUT
:
US_DEBUGP
(
"-- device NAKed
\n
"
);
return
USB_STOR_XFER_ERROR
;
}
/* the transfer was cancelled, presumably by an abort */
if
(
result
==
-
ENODEV
)
{
case
-
ENODEV
:
US_DEBUGP
(
"-- transfer cancelled
\n
"
);
return
USB_STOR_XFER_ERROR
;
}
/* short scatter-gather read transfer */
case
-
EREMOTEIO
:
US_DEBUGP
(
"-- short read transfer
\n
"
);
return
USB_STOR_XFER_SHORT
;
/* the catch-all error case */
if
(
result
<
0
)
{
default:
US_DEBUGP
(
"-- unknown error
\n
"
);
return
USB_STOR_XFER_ERROR
;
}
/* no error code; did we send all the data? */
if
(
partial
!=
length
)
{
US_DEBUGP
(
"-- transferred only %u bytes
\n
"
,
partial
);
return
USB_STOR_XFER_SHORT
;
}
US_DEBUGP
(
"-- transfer complete
\n
"
);
return
USB_STOR_XFER_GOOD
;
}
/*
...
...
drivers/usb/storage/usb.c
View file @
c5fc26c9
...
...
@@ -728,9 +728,13 @@ static int storage_probe(struct usb_interface *intf,
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_out
=
ep_out
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_int
=
ep_int
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_bInterval
=
ep_int
->
bInterval
;
if
(
ep_int
)
{
ss
->
ep_int
=
ep_int
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_bInterval
=
ep_int
->
bInterval
;
}
else
ss
->
ep_int
=
ss
->
ep_bInterval
=
0
;
/* allocate the URB, the usb_ctrlrequest, and the IRQ URB */
if
(
usb_stor_allocate_urbs
(
ss
))
...
...
@@ -771,9 +775,13 @@ static int storage_probe(struct usb_interface *intf,
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_out
=
ep_out
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_int
=
ep_int
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_bInterval
=
ep_int
->
bInterval
;
if
(
ep_int
)
{
ss
->
ep_int
=
ep_int
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
;
ss
->
ep_bInterval
=
ep_int
->
bInterval
;
}
else
ss
->
ep_int
=
ss
->
ep_bInterval
=
0
;
/* establish the connection to the new device */
ss
->
ifnum
=
ifnum
;
...
...
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