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
916da46b
Commit
916da46b
authored
Sep 11, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linuxusb.bkbits.net/linus-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
f2a7c782
6cbd4aa9
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
168 additions
and
186 deletions
+168
-186
drivers/usb/class/usb-midi.c
drivers/usb/class/usb-midi.c
+5
-5
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hcd.c
+13
-2
drivers/usb/host/ehci-q.c
drivers/usb/host/ehci-q.c
+40
-19
drivers/usb/host/ehci-sched.c
drivers/usb/host/ehci-sched.c
+2
-111
drivers/usb/host/ehci.h
drivers/usb/host/ehci.h
+2
-1
drivers/usb/image/hpusbscsi.c
drivers/usb/image/hpusbscsi.c
+7
-1
drivers/usb/image/microtek.c
drivers/usb/image/microtek.c
+14
-5
drivers/usb/misc/Config.in
drivers/usb/misc/Config.in
+1
-1
drivers/usb/net/kaweth.c
drivers/usb/net/kaweth.c
+31
-17
drivers/usb/net/usbnet.c
drivers/usb/net/usbnet.c
+51
-24
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/belkin_sa.c
+1
-0
drivers/usb/serial/belkin_sa.h
drivers/usb/serial/belkin_sa.h
+1
-0
No files found.
drivers/usb/class/usb-midi.c
View file @
916da46b
...
...
@@ -368,7 +368,7 @@ static void usb_bulk_read(struct urb *urb)
{
struct
midi_in_endpoint
*
ep
=
(
struct
midi_in_endpoint
*
)(
urb
->
context
);
unsigned
char
*
data
=
urb
->
transfer_buffer
;
int
i
,
l
,
wake
;
int
i
,
j
,
wake
;
unsigned
long
int
flags
;
if
(
!
ep
->
urbSubmitted
)
{
...
...
@@ -379,14 +379,14 @@ static void usb_bulk_read(struct urb *urb)
wake
=
0
;
spin_lock_irqsave
(
&
ep
->
lock
,
flags
);
for
(
l
=
0
;
l
<
urb
->
actual_length
;
l
+=
4
)
{
int
cin
=
(
data
[
l
]
>>
0
)
&
0xf
;
int
cab
=
(
data
[
l
]
>>
4
)
&
0xf
;
for
(
j
=
0
;
j
<
urb
->
actual_length
;
j
+=
4
)
{
int
cin
=
(
data
[
j
]
>>
0
)
&
0xf
;
int
cab
=
(
data
[
j
]
>>
4
)
&
0xf
;
struct
usb_mididev
*
cable
=
ep
->
cables
[
cab
];
if
(
cable
)
{
int
len
=
cin_to_len
[
cin
];
/** length of MIDI data **/
for
(
i
=
0
;
i
<
len
;
i
++
)
{
cable
->
min
.
buf
[
cable
->
min
.
bufWrPtr
]
=
data
[
1
+
i
];
cable
->
min
.
buf
[
cable
->
min
.
bufWrPtr
]
=
data
[
1
+
i
+
j
];
cable
->
min
.
bufWrPtr
=
(
cable
->
min
.
bufWrPtr
+
1
)
%
MIDI_IN_BUFSIZ
;
if
(
cable
->
min
.
bufRemains
<
MIDI_IN_BUFSIZ
)
cable
->
min
.
bufRemains
+=
1
;
...
...
drivers/usb/host/ehci-hcd.c
View file @
916da46b
...
...
@@ -111,6 +111,7 @@
#define EHCI_TUNE_MULT_TT 1
#define EHCI_WATCHDOG_JIFFIES (HZ/100)
/* arbitrary; ~10 msec */
#define EHCI_ASYNC_JIFFIES (HZ/3)
/* async idle timeout */
/* Initial IRQ latency: lower than default */
static
int
log2_irq_thresh
=
0
;
// 0 to 6
...
...
@@ -190,7 +191,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
,
0
50
);
return
handshake
(
&
ehci
->
regs
->
command
,
CMD_RESET
,
0
,
2
50
);
}
/* idle the controller (from running) */
...
...
@@ -247,9 +248,14 @@ static void ehci_watchdog (unsigned long param)
struct
ehci_hcd
*
ehci
=
(
struct
ehci_hcd
*
)
param
;
unsigned
long
flags
;
/* guard against lost IAA, which wedges everything */
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
/* guard against lost IAA, which wedges everything */
ehci_irq
(
&
ehci
->
hcd
);
/* unlink the last qh after it's idled a while */
if
(
ehci
->
async_idle
)
{
start_unlink_async
(
ehci
,
ehci
->
async
);
ehci
->
async_idle
=
0
;
}
spin_unlock_irqrestore
(
&
ehci
->
lock
,
flags
);
}
...
...
@@ -368,6 +374,7 @@ static int ehci_start (struct usb_hcd *hcd)
*
* NOTE: layered drivers can't yet tell when we enable that,
* so they can't pass this info along (like NETIF_F_HIGHDMA)
* (or like Scsi_Host.highmem_io) ... usb_bus.flags?
*/
if
(
HCC_64BIT_ADDR
(
hcc_params
))
{
writel
(
0
,
&
ehci
->
regs
->
segment
);
...
...
@@ -586,6 +593,10 @@ static void ehci_tasklet (unsigned long param)
struct
ehci_hcd
*
ehci
=
(
struct
ehci_hcd
*
)
param
;
unsigned
long
flags
;
// FIXME don't pass flags; on sparc they aren't really flags.
// qh_completions can just leave irqs blocked,
// then have scan_async() allow IRQs if it's very busy
spin_lock_irqsave
(
&
ehci
->
lock
,
flags
);
if
(
ehci
->
reclaim_ready
)
...
...
drivers/usb/host/ehci-q.c
View file @
916da46b
...
...
@@ -26,8 +26,7 @@
* Control, bulk, and interrupt traffic all use "qh" lists. They list "qtd"
* entries describing USB transactions, max 16-20kB/entry (with 4kB-aligned
* buffers needed for the larger number). We use one QH per endpoint, queue
* multiple (bulk or control) urbs per endpoint. URBs may need several qtds.
* A scheduled interrupt qh always (for now) has one qtd, one urb.
* multiple urbs (all three types) per endpoint. URBs may need several qtds.
*
* ISO traffic uses "ISO TD" (itd, and sitd) records, and (along with
* interrupts) needs careful scheduling. Performance improvements can be
...
...
@@ -281,7 +280,12 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh, unsigned long flags)
||
(
qh
->
qh_state
==
QH_STATE_IDLE
);
// FIXME Remove the automagic unlink mode.
// Drivers can now clean up safely; its' their job.
// Drivers can now clean up safely; it's their job.
//
// FIXME Removing it should fix the short read scenarios
// with "huge" urb data (more than one 16+KByte td) with
// the short read someplace other than the last data TD.
// Except the control case: 'retrigger' status ACKs.
/* fault: unlink the rest, since this qtd saw an error? */
if
(
unlikely
((
token
&
QTD_STS_HALT
)
!=
0
))
{
...
...
@@ -391,7 +395,7 @@ qh_urb_transaction (
struct
ehci_qtd
*
qtd
,
*
qtd_prev
;
dma_addr_t
buf
;
int
len
,
maxpacket
;
int
is_input
;
int
is_input
,
status_patch
=
0
;
u32
token
;
/*
...
...
@@ -422,6 +426,9 @@ qh_urb_transaction (
qtd
->
urb
=
urb
;
qtd_prev
->
hw_next
=
QTD_NEXT
(
qtd
->
qtd_dma
);
list_add_tail
(
&
qtd
->
qtd_list
,
head
);
if
(
!
(
urb
->
transfer_flags
&
URB_SHORT_NOT_OK
))
status_patch
=
1
;
}
/*
...
...
@@ -499,6 +506,19 @@ qh_urb_transaction (
}
}
/* if we're permitting a short control read, we want the hardware to
* just continue after short data and send the status ack. it can do
* that on the last data packet (typically the only one). for other
* packets, software fixup is needed (in qh_completions).
*/
if
(
status_patch
)
{
struct
ehci_qtd
*
prev
;
prev
=
list_entry
(
qtd
->
qtd_list
.
prev
,
struct
ehci_qtd
,
qtd_list
);
prev
->
hw_alt_next
=
QTD_NEXT
(
qtd
->
qtd_dma
);
}
/* by default, enable interrupt on urb completion */
if
(
likely
(
!
(
urb
->
transfer_flags
&
URB_NO_INTERRUPT
)))
qtd
->
hw_token
|=
__constant_cpu_to_le32
(
QTD_IOC
);
...
...
@@ -653,9 +673,8 @@ ehci_qh_make (
}
break
;
default:
#ifdef DEBUG
BUG
();
#endif
dbg
(
"bogus dev %p speed %d"
,
urb
->
dev
,
urb
->
dev
->
speed
);
return
0
;
}
/* NOTE: if (PIPE_INTERRUPT) { scheduler sets s-mask } */
...
...
@@ -717,6 +736,8 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
}
qh
->
qh_state
=
QH_STATE_LINKED
;
/* qtd completions reported later by interrupt */
ehci
->
async_idle
=
0
;
}
/*-------------------------------------------------------------------------*/
...
...
@@ -837,7 +858,7 @@ submit_async (
qtd
=
list_entry
(
qtd_list
->
next
,
struct
ehci_qtd
,
qtd_list
);
dev
=
(
struct
hcd_dev
*
)
urb
->
dev
->
hcpriv
;
epnum
=
usb_pipeendpoint
(
urb
->
pipe
);
if
(
usb_pipein
(
urb
->
pipe
))
if
(
usb_pipein
(
urb
->
pipe
)
&&
!
usb_pipecontrol
(
urb
->
pipe
)
)
epnum
|=
0x10
;
vdbg
(
"%s: submit_async urb %p len %d ep %d-%s qtd %p [qh %p]"
,
...
...
@@ -923,9 +944,11 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
if
(
unlikely
(
qh
==
ehci
->
async
&&
qh
->
qh_next
.
qh
==
qh
))
{
/* can't get here without STS_ASS set */
if
(
ehci
->
hcd
.
state
!=
USB_STATE_HALT
)
{
if
(
cmd
&
CMD_PSE
)
if
(
cmd
&
CMD_PSE
)
{
writel
(
cmd
&
~
CMD_ASE
,
&
ehci
->
regs
->
command
);
else
(
void
)
handshake
(
&
ehci
->
regs
->
status
,
STS_ASS
,
0
,
150
);
}
else
ehci_ready
(
ehci
);
}
qh
->
qh_next
.
qh
=
ehci
->
async
=
0
;
...
...
@@ -944,10 +967,6 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
prev
=
ehci
->
async
;
while
(
prev
->
qh_next
.
qh
!=
qh
&&
prev
->
qh_next
.
qh
!=
ehci
->
async
)
prev
=
prev
->
qh_next
.
qh
;
#ifdef DEBUG
if
(
prev
->
qh_next
.
qh
!=
qh
)
BUG
();
#endif
if
(
qh
->
hw_info1
&
__constant_cpu_to_le32
(
QH_HEAD
))
{
ehci
->
async
=
prev
;
...
...
@@ -987,16 +1006,18 @@ scan_async (struct ehci_hcd *ehci, unsigned long flags)
}
/* unlink idle entries, reducing HC PCI usage as
* well as HCD schedule-scanning costs
* well as HCD schedule-scanning costs. removing
* the last qh is deferred, since it's costly.
*/
if
(
list_empty
(
&
qh
->
qtd_list
)
&&
!
ehci
->
reclaim
)
{
if
(
qh
->
qh_next
.
qh
!=
qh
)
{
// dbg ("irq/empty");
start_unlink_async
(
ehci
,
qh
);
}
else
{
// FIXME: arrange to stop
// after it's been idle a while.
// stop/restart isn't free...
}
else
if
(
!
timer_pending
(
&
ehci
->
watchdog
))
{
/* can't use IAA for last entry */
ehci
->
async_idle
=
1
;
mod_timer
(
&
ehci
->
watchdog
,
jiffies
+
EHCI_ASYNC_JIFFIES
);
}
}
qh
=
qh
->
qh_next
.
qh
;
...
...
drivers/usb/host/ehci-sched.c
View file @
916da46b
...
...
@@ -971,119 +971,10 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags)
/*
* "Split ISO TDs" ... used for USB 1.1 devices going through
* the TTs in USB 2.0 hubs.
*
* FIXME not yet implemented
*/
static
void
sitd_free
(
struct
ehci_hcd
*
ehci
,
struct
ehci_sitd
*
sitd
)
{
pci_pool_free
(
ehci
->
sitd_pool
,
sitd
,
sitd
->
sitd_dma
);
}
static
struct
ehci_sitd
*
sitd_make
(
struct
ehci_hcd
*
ehci
,
struct
urb
*
urb
,
unsigned
index
,
// urb->iso_frame_desc [index]
unsigned
uframe
,
// scheduled start
dma_addr_t
dma
,
// mapped transfer buffer
int
mem_flags
)
{
struct
ehci_sitd
*
sitd
;
unsigned
length
;
sitd
=
pci_pool_alloc
(
ehci
->
sitd_pool
,
mem_flags
,
&
dma
);
if
(
!
sitd
)
return
sitd
;
sitd
->
urb
=
urb
;
length
=
urb
->
iso_frame_desc
[
index
].
length
;
dma
+=
urb
->
iso_frame_desc
[
index
].
offset
;
#if 0
// FIXME: do the rest!
#else
sitd_free
(
ehci
,
sitd
);
return
0
;
#endif
}
static
void
sitd_link
(
struct
ehci_hcd
*
ehci
,
unsigned
frame
,
struct
ehci_sitd
*
sitd
)
{
u32
ptr
;
ptr
=
cpu_to_le32
(
sitd
->
sitd_dma
|
2
);
// type 2 == sitd
if
(
ehci
->
pshadow
[
frame
].
ptr
)
{
if
(
!
sitd
->
sitd_next
.
ptr
)
{
sitd
->
sitd_next
=
ehci
->
pshadow
[
frame
];
sitd
->
hw_next
=
ehci
->
periodic
[
frame
];
}
else
if
(
sitd
->
sitd_next
.
ptr
!=
ehci
->
pshadow
[
frame
].
ptr
)
{
dbg
(
"frame %d sitd link goof"
,
frame
);
BUG
();
}
}
ehci
->
pshadow
[
frame
].
sitd
=
sitd
;
ehci
->
periodic
[
frame
]
=
ptr
;
}
static
unsigned
long
sitd_complete
(
struct
ehci_hcd
*
ehci
,
struct
ehci_sitd
*
sitd
,
unsigned
long
flags
)
{
// FIXME -- implement!
dbg
(
"NYI -- sitd_complete"
);
return
flags
;
}
/*-------------------------------------------------------------------------*/
static
int
sitd_submit
(
struct
ehci_hcd
*
ehci
,
struct
urb
*
urb
,
int
mem_flags
)
{
// struct ehci_sitd *first_sitd = 0;
unsigned
frame_index
;
dma_addr_t
dma
;
dbg
(
"NYI -- sitd_submit"
);
// FIXME -- implement!
// FIXME: setup one big dma mapping
dma
=
0
;
for
(
frame_index
=
0
;
frame_index
<
urb
->
number_of_packets
;
frame_index
++
)
{
struct
ehci_sitd
*
sitd
;
unsigned
uframe
;
// FIXME: use real arguments, schedule this!
uframe
=
-
1
;
sitd
=
sitd_make
(
ehci
,
urb
,
frame_index
,
uframe
,
dma
,
mem_flags
);
if
(
sitd
)
{
/*
if (first_sitd)
list_add_tail (&sitd->sitd_list,
&first_sitd->sitd_list);
else
first_sitd = sitd;
*/
}
else
{
// FIXME: clean everything up
}
}
// if we have a first sitd, then
// store them all into the periodic schedule!
// urb->hcpriv = first sitd in sitd_list
return
-
ENOSYS
;
}
#endif
/* have_split_iso */
/*-------------------------------------------------------------------------*/
...
...
drivers/usb/host/ehci.h
View file @
916da46b
...
...
@@ -39,7 +39,8 @@ struct ehci_hcd { /* one per controller */
/* async schedule support */
struct
ehci_qh
*
async
;
struct
ehci_qh
*
reclaim
;
int
reclaim_ready
;
int
reclaim_ready
:
1
,
async_idle
:
1
;
/* periodic schedule support */
#define DEFAULT_I_TDPS 1024
/* some HCs can do less */
...
...
drivers/usb/image/hpusbscsi.c
View file @
916da46b
...
...
@@ -154,7 +154,13 @@ hpusbscsi_usb_disconnect (struct usb_device *dev, void *ptr)
static
struct
usb_device_id
hpusbscsi_usb_ids
[]
=
{
{
USB_DEVICE
(
0x03f0
,
0x0701
)},
/* HP 53xx */
{
USB_DEVICE
(
0x03f0
,
0x0801
)},
/* HP 7400 */
{
USB_DEVICE
(
0x0638
,
0x0268
)},
/*iVina 1200U */
{
USB_DEVICE
(
0x0638
,
0x026a
)},
/*Scan Dual II */
{
USB_DEVICE
(
0x0638
,
0x0A13
)},
/*Avision AV600U */
{
USB_DEVICE
(
0x0638
,
0x0A16
)},
/*Avision DS610CU Scancopier */
{
USB_DEVICE
(
0x0638
,
0x0A18
)},
/*Avision AV600U Plus */
{
USB_DEVICE
(
0x0638
,
0x0A23
)},
/*Avision AV220 */
{
USB_DEVICE
(
0x0638
,
0x0A24
)},
/*Avision AV210 */
{
USB_DEVICE
(
0x0686
,
0x4004
)},
/*Minolta Elite II */
{}
/* Terminating entry */
};
...
...
drivers/usb/image/microtek.c
View file @
916da46b
...
...
@@ -583,13 +583,22 @@ static void mts_command_done( struct urb *transfer )
return
;
}
if
(
context
->
data
)
{
if
(
context
->
srb
->
cmnd
[
0
]
==
REQUEST_SENSE
)
{
mts_int_submit_urb
(
transfer
,
context
->
data_pipe
,
context
->
srb
->
sense_buffer
,
context
->
data_length
,
mts_data_done
);
}
else
{
if
(
context
->
data
)
{
mts_int_submit_urb
(
transfer
,
context
->
data_pipe
,
context
->
data
,
context
->
data_length
,
context
->
srb
->
use_sg
?
mts_do_sg
:
mts_data_done
);
}
else
mts_get_status
(
transfer
);
}
else
{
mts_get_status
(
transfer
);
}
}
return
;
}
...
...
drivers/usb/misc/Config.in
View file @
916da46b
...
...
@@ -8,4 +8,4 @@ dep_tristate ' USB Auerswald ISDN support (EXPERIMENTAL)' CONFIG_USB_AUERSWALD
dep_tristate ' USB Diamond Rio500 support (EXPERIMENTAL)' CONFIG_USB_RIO500 $CONFIG_USB $CONFIG_EXPERIMENTAL
dep_tristate ' Tieman Voyager USB Braille display support (EXPERIMENTAL)' CONFIG_USB_BRLVGER $CONFIG_USB $CONFIG_EXPERIMENTAL
dep_tristate ' USB LCD driver support' CONFIG_USB_LCD $CONFIG_USB
dep_tristate ' Alcatel Speedtouch ADSL USB Modem' CONFIG_USB_SPEEDTOUCH $CONFIG_USB
dep_tristate ' Alcatel Speedtouch ADSL USB Modem' CONFIG_USB_SPEEDTOUCH $CONFIG_USB
$CONFIG_ATM
drivers/usb/net/kaweth.c
View file @
916da46b
...
...
@@ -464,7 +464,7 @@ static int kaweth_reset(struct kaweth_device *kaweth)
}
static
void
kaweth_usb_receive
(
struct
urb
*
);
static
void
kaweth_resubmit_rx_urb
(
struct
kaweth_device
*
,
int
);
static
int
kaweth_resubmit_rx_urb
(
struct
kaweth_device
*
,
int
);
/****************************************************************
int_callback
...
...
@@ -493,7 +493,7 @@ static void int_callback(struct urb *u)
/****************************************************************
* kaweth_resubmit_rx_urb
****************************************************************/
static
void
kaweth_resubmit_rx_urb
(
struct
kaweth_device
*
kaweth
,
static
int
kaweth_resubmit_rx_urb
(
struct
kaweth_device
*
kaweth
,
int
mem_flags
)
{
int
result
;
...
...
@@ -513,6 +513,8 @@ static void kaweth_resubmit_rx_urb(struct kaweth_device *kaweth,
}
else
{
kaweth
->
suspend_lowmem
=
0
;
}
return
result
;
}
static
void
kaweth_async_set_rx_mode
(
struct
kaweth_device
*
kaweth
);
...
...
@@ -592,14 +594,15 @@ static void kaweth_usb_receive(struct urb *urb)
static
int
kaweth_open
(
struct
net_device
*
net
)
{
struct
kaweth_device
*
kaweth
=
(
struct
kaweth_device
*
)
net
->
priv
;
int
res
;
kaweth_dbg
(
"Dev usage: %d"
,
kaweth
->
dev
->
refcnt
.
counter
);
kaweth_dbg
(
"Opening network device."
);
MOD_INC_USE_COUNT
;
kaweth_resubmit_rx_urb
(
kaweth
,
GFP_KERNEL
)
;
res
=
kaweth_resubmit_rx_urb
(
kaweth
,
GFP_KERNEL
)
;
if
(
res
)
return
-
EIO
;
FILL_INT_URB
(
kaweth
->
irq_urb
,
...
...
@@ -611,7 +614,11 @@ static int kaweth_open(struct net_device *net)
kaweth
,
HZ
/
4
);
usb_submit_urb
(
kaweth
->
irq_urb
,
GFP_KERNEL
);
res
=
usb_submit_urb
(
kaweth
->
irq_urb
,
GFP_KERNEL
);
if
(
res
)
{
usb_unlink_urb
(
kaweth
->
rx_urb
);
return
-
EIO
;
}
netif_start_queue
(
net
);
...
...
@@ -635,7 +642,6 @@ static int kaweth_close(struct net_device *net)
kaweth
->
status
&=
~
KAWETH_STATUS_CLOSING
;
MOD_DEC_USE_COUNT
;
printk
(
"Dev usage: %d"
,
kaweth
->
dev
->
refcnt
.
counter
);
...
...
@@ -848,6 +854,7 @@ static void *kaweth_probe(
)
{
struct
kaweth_device
*
kaweth
;
struct
net_device
*
netdev
;
const
eth_addr_t
bcast_addr
=
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
};
int
result
=
0
;
...
...
@@ -863,10 +870,8 @@ static void *kaweth_probe(
(
int
)
dev
->
descriptor
.
bLength
,
(
int
)
dev
->
descriptor
.
bDescriptorType
);
if
(
!
(
kaweth
=
kmalloc
(
sizeof
(
struct
kaweth_device
),
GFP_KERNEL
)))
{
kaweth_dbg
(
"out of memory allocating device structure
\n
"
);
if
(
!
(
kaweth
=
kmalloc
(
sizeof
(
struct
kaweth_device
),
GFP_KERNEL
)))
return
NULL
;
}
memset
(
kaweth
,
0
,
sizeof
(
struct
kaweth_device
));
...
...
@@ -992,11 +997,17 @@ static void *kaweth_probe(
if
(
result
<
0
)
{
kaweth_err
(
"Error setting receive filter"
);
return
kaweth
;
kfree
(
kaweth
);
return
NULL
;
}
kaweth_dbg
(
"Initializing net device."
);
if
(
!
(
netdev
=
kmalloc
(
sizeof
(
struct
net_device
),
GFP_KERNEL
)))
{
kfree
(
kaweth
);
return
NULL
;
}
kaweth
->
tx_urb
=
usb_alloc_urb
(
0
,
GFP_KERNEL
);
if
(
!
kaweth
->
tx_urb
)
goto
err_no_urb
;
...
...
@@ -1007,12 +1018,7 @@ static void *kaweth_probe(
if
(
!
kaweth
->
irq_urb
)
goto
err_tx_and_rx
;
kaweth
->
net
=
init_etherdev
(
0
,
0
);
if
(
!
kaweth
->
net
)
{
kaweth_err
(
"Error calling init_etherdev."
);
return
kaweth
;
}
kaweth
->
net
=
netdev
;
memcpy
(
kaweth
->
net
->
broadcast
,
&
bcast_addr
,
sizeof
(
bcast_addr
));
memcpy
(
kaweth
->
net
->
dev_addr
,
&
kaweth
->
configuration
.
hw_addr
,
...
...
@@ -1033,6 +1039,13 @@ static void *kaweth_probe(
memset
(
&
kaweth
->
stats
,
0
,
sizeof
(
kaweth
->
stats
));
SET_MODULE_OWNER
(
netdev
);
if
(
!
init_etherdev
(
netdev
,
0
))
{
kaweth_err
(
"Error calling init_etherdev."
);
goto
err_tx_and_rx
;
}
kaweth_info
(
"kaweth interface created at %s"
,
kaweth
->
net
->
name
);
kaweth_dbg
(
"Kaweth probe returning."
);
...
...
@@ -1045,6 +1058,7 @@ static void *kaweth_probe(
usb_free_urb
(
kaweth
->
tx_urb
);
err_no_urb:
kfree
(
kaweth
);
kfree
(
netdev
);
return
NULL
;
}
...
...
drivers/usb/net/usbnet.c
View file @
916da46b
...
...
@@ -16,6 +16,7 @@
*
* - AnchorChip 2720
* - Belkin, eTEK (interops with Win32 drivers)
* - EPSON USB clients
* - GeneSys GL620USB-A
* - "Linux Devices" (like iPaq and similar SA-1100 based PDAs)
* - NetChip 1080 (interoperates with NetChip Win32 drivers)
...
...
@@ -23,7 +24,7 @@
*
* USB devices can implement their side of this protocol at the cost
* of two bulk endpoints; it's not restricted to "cable" applications.
* See the LINUXDEV support.
* See the LINUXDEV
or EPSON device/client
support.
*
*
* Status:
...
...
@@ -57,7 +58,7 @@
*
* Need smarter hotplug policy scripts ... ones that know how to arrange
* bridging with "brctl", and can handle static and dynamic ("pump") setups.
* Use those eventual "peer connected" events.
* Use those eventual "peer connected" events
, and zeroconf
.
*
*
* CHANGELOG:
...
...
@@ -128,6 +129,7 @@
/* minidrivers _could_ be individually configured */
#define CONFIG_USB_AN2720
#define CONFIG_USB_BELKIN
#define CONFIG_USB_EPSON2888
#define CONFIG_USB_GENESYS
#define CONFIG_USB_LINUXDEV
#define CONFIG_USB_NET1080
...
...
@@ -328,6 +330,29 @@ static const struct driver_info belkin_info = {
#endif
/* CONFIG_USB_BELKIN */
#ifdef CONFIG_USB_EPSON2888
/*-------------------------------------------------------------------------
*
* EPSON USB clients
*
* This is the same idea as "linuxdev" (below) except the firmware in the
* device might not be Tux-powered. Epson provides reference firmware that
* implements this interface. Product developers can reuse or modify that
* code, such as by using their own product and vendor codes.
*
*-------------------------------------------------------------------------*/
static
const
struct
driver_info
epson2888_info
=
{
.
description
=
"Epson USB Device"
,
.
in
=
4
,
.
out
=
3
,
.
epsize
=
64
,
};
#endif
/* CONFIG_USB_EPSON2888 */
#ifdef CONFIG_USB_GENESYS
...
...
@@ -338,6 +363,15 @@ static const struct driver_info belkin_info = {
* ... should partially interop with the Win32 driver for this hardware
* The GeneSys docs imply there's some NDIS issue motivating this framing.
*
* Some info from GeneSys:
* - GL620USB-A is full duplex; GL620USB is only half duplex for bulk.
* (Some cables, like the BAFO-100c, use the half duplex version.)
* - For the full duplex model, the low bit of the version code says
* which side is which ("left/right").
* - For the half duplex type, a control/interrupt handshake settles
* the transfer direction. (That's disabled here, partially coded.)
* A control URB would block until other side writes an interrupt.
*
*-------------------------------------------------------------------------*/
// control msg write command
...
...
@@ -504,13 +538,6 @@ static int genelink_free (struct usbnet *dev)
#endif
// reset the device status
static
int
genelink_reset
(
struct
usbnet
*
dev
)
{
// we don't need to reset, just return 0
return
0
;
}
static
int
genelink_rx_fixup
(
struct
usbnet
*
dev
,
struct
sk_buff
*
skb
)
{
struct
gl_header
*
header
;
...
...
@@ -632,7 +659,6 @@ genelink_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
static
const
struct
driver_info
genelink_info
=
{
.
description
=
"Genesys GeneLink"
,
.
flags
=
FLAG_FRAMING_GL
|
FLAG_NO_SETINT
,
.
reset
=
genelink_reset
,
.
rx_fixup
=
genelink_rx_fixup
,
.
tx_fixup
=
genelink_tx_fixup
,
...
...
@@ -662,25 +688,19 @@ static const struct driver_info genelink_info = {
*
* One example is Intel's SA-1100 chip, which integrates basic USB
* support (arch/arm/sa1100/usb-eth.c); it's used in the iPaq PDA.
* And others too, like the Yopy.
*
*-------------------------------------------------------------------------*/
static
int
linuxdev_check_connect
(
struct
usbnet
*
dev
)
{
return
0
;
// by definition, always connected
}
static
const
struct
driver_info
linuxdev_info
=
{
.
description
=
"Linux Device"
,
// no reset defined (yet?)
.
check_connect
=
linuxdev_check_connect
,
.
in
=
2
,
.
out
=
1
,
.
epsize
=
64
,
.
epsize
=
64
,
};
#endif
/* CONFIG_USB_LINUXDEV */
#ifdef CONFIG_USB_NET1080
...
...
@@ -2049,9 +2069,7 @@ static const struct usb_device_id products [] = {
{
USB_DEVICE
(
0x0547
,
0x2720
),
// AnchorChips defaults
.
driver_info
=
(
unsigned
long
)
&
an2720_info
,
},
{
},
{
USB_DEVICE
(
0x0547
,
0x2727
),
// Xircom PGUNET
.
driver_info
=
(
unsigned
long
)
&
an2720_info
,
},
...
...
@@ -2070,11 +2088,21 @@ static const struct usb_device_id products [] = {
},
#endif
#ifdef CONFIG_USB_EPSON2888
{
USB_DEVICE
(
0x0525
,
0x2888
),
// EPSON USB client
driver_info:
(
unsigned
long
)
&
epson2888_info
,
},
#endif
#ifdef CONFIG_USB_GENESYS
{
USB_DEVICE
(
0x05e3
,
0x0502
),
// GL620USB-A
.
driver_info
=
(
unsigned
long
)
&
genelink_info
,
},
/* NOT: USB_DEVICE (0x05e3, 0x0501), // GL620USB
* that's half duplex, not currently supported
*/
#endif
#ifdef CONFIG_USB_LINUXDEV
...
...
@@ -2098,8 +2126,7 @@ static const struct usb_device_id products [] = {
{
USB_DEVICE
(
0x0525
,
0x1080
),
// NetChip ref design
.
driver_info
=
(
unsigned
long
)
&
net1080_info
,
},
{
},
{
USB_DEVICE
(
0x06D0
,
0x0622
),
// Laplink Gold
.
driver_info
=
(
unsigned
long
)
&
net1080_info
,
},
...
...
drivers/usb/serial/belkin_sa.c
View file @
916da46b
...
...
@@ -108,6 +108,7 @@ static struct usb_device_id id_table_combined [] = {
{
USB_DEVICE
(
BELKIN_OLD_VID
,
BELKIN_OLD_PID
)
},
{
USB_DEVICE
(
PERACOM_VID
,
PERACOM_PID
)
},
{
USB_DEVICE
(
GOHUBS_VID
,
GOHUBS_PID
)
},
{
USB_DEVICE
(
GOHUBS_VID
,
HANDYLINK_PID
)
},
{
USB_DEVICE
(
BELKIN_DOCKSTATION_VID
,
BELKIN_DOCKSTATION_PID
)
},
{
}
/* Terminating entry */
};
...
...
drivers/usb/serial/belkin_sa.h
View file @
916da46b
...
...
@@ -47,6 +47,7 @@
#define GOHUBS_VID 0x0921
/* GoHubs vendor id */
#define GOHUBS_PID 0x1000
/* GoHubs single port serial converter's id (identical to the Peracom device) */
#define HANDYLINK_PID 0x1200
/* HandyLink USB's id (identical to the Peracom device) */
/* Vendor Request Interface */
#define BELKIN_SA_SET_BAUDRATE_REQUEST 0
/* Set baud rate */
...
...
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