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
99805f47
Commit
99805f47
authored
Apr 26, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git/
parents
a1342206
9719b0c2
Changes
17
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
534 additions
and
247 deletions
+534
-247
drivers/usb/core/usb.c
drivers/usb/core/usb.c
+2
-4
drivers/usb/image/microtek.c
drivers/usb/image/microtek.c
+1
-1
drivers/usb/input/ati_remote.c
drivers/usb/input/ati_remote.c
+1
-1
drivers/usb/input/usbkbd.c
drivers/usb/input/usbkbd.c
+2
-1
drivers/usb/media/pwc/pwc-ctrl.c
drivers/usb/media/pwc/pwc-ctrl.c
+39
-39
drivers/usb/media/pwc/pwc-if.c
drivers/usb/media/pwc/pwc-if.c
+1
-1
drivers/usb/media/pwc/pwc.h
drivers/usb/media/pwc/pwc.h
+1
-5
drivers/usb/media/sn9c102_core.c
drivers/usb/media/sn9c102_core.c
+2
-2
drivers/usb/media/sn9c102_sensor.h
drivers/usb/media/sn9c102_sensor.h
+0
-2
drivers/usb/misc/sisusbvga/sisusb.c
drivers/usb/misc/sisusbvga/sisusb.c
+1
-0
drivers/usb/net/usbnet.c
drivers/usb/net/usbnet.c
+270
-157
drivers/usb/net/zd1201.c
drivers/usb/net/zd1201.c
+11
-9
drivers/usb/serial/Kconfig
drivers/usb/serial/Kconfig
+9
-0
drivers/usb/serial/Makefile
drivers/usb/serial/Makefile
+1
-0
drivers/usb/serial/hp4x.c
drivers/usb/serial/hp4x.c
+85
-0
drivers/usb/storage/unusual_devs.h
drivers/usb/storage/unusual_devs.h
+20
-2
scripts/mod/file2alias.c
scripts/mod/file2alias.c
+88
-23
No files found.
drivers/usb/core/usb.c
View file @
99805f47
...
...
@@ -611,11 +611,10 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
if
(
add_hotplug_env_var
(
envp
,
num_envp
,
&
i
,
buffer
,
buffer_size
,
&
length
,
"MODALIAS=usb:v%04Xp%04Xd
l%04Xdh
%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X"
,
"MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X"
,
le16_to_cpu
(
usb_dev
->
descriptor
.
idVendor
),
le16_to_cpu
(
usb_dev
->
descriptor
.
idProduct
),
le16_to_cpu
(
usb_dev
->
descriptor
.
bcdDevice
),
le16_to_cpu
(
usb_dev
->
descriptor
.
bcdDevice
),
usb_dev
->
descriptor
.
bDeviceClass
,
usb_dev
->
descriptor
.
bDeviceSubClass
,
usb_dev
->
descriptor
.
bDeviceProtocol
,
...
...
@@ -626,11 +625,10 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
}
else
{
if
(
add_hotplug_env_var
(
envp
,
num_envp
,
&
i
,
buffer
,
buffer_size
,
&
length
,
"MODALIAS=usb:v%04Xp%04Xd
l%04Xdh
%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*"
,
"MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*"
,
le16_to_cpu
(
usb_dev
->
descriptor
.
idVendor
),
le16_to_cpu
(
usb_dev
->
descriptor
.
idProduct
),
le16_to_cpu
(
usb_dev
->
descriptor
.
bcdDevice
),
le16_to_cpu
(
usb_dev
->
descriptor
.
bcdDevice
),
usb_dev
->
descriptor
.
bDeviceClass
,
usb_dev
->
descriptor
.
bDeviceSubClass
,
usb_dev
->
descriptor
.
bDeviceProtocol
))
...
...
drivers/usb/image/microtek.c
View file @
99805f47
...
...
@@ -335,7 +335,7 @@ static int mts_scsi_abort (Scsi_Cmnd *srb)
mts_urb_abort
(
desc
);
return
FAIL
URE
;
return
FAIL
ED
;
}
static
int
mts_scsi_host_reset
(
Scsi_Cmnd
*
srb
)
...
...
drivers/usb/input/ati_remote.c
View file @
99805f47
...
...
@@ -619,7 +619,7 @@ static void ati_remote_delete(struct ati_remote *ati_remote)
if
(
ati_remote
->
outbuf
)
usb_buffer_free
(
ati_remote
->
udev
,
DATA_BUFSIZE
,
ati_remote
->
in
buf
,
ati_remote
->
outbuf_dma
);
ati_remote
->
out
buf
,
ati_remote
->
outbuf_dma
);
if
(
ati_remote
->
irq_urb
)
usb_free_urb
(
ati_remote
->
irq_urb
);
...
...
drivers/usb/input/usbkbd.c
View file @
99805f47
...
...
@@ -133,7 +133,8 @@ static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs)
kbd
->
usbdev
->
devpath
,
i
);
}
int
usb_kbd_event
(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
)
static
int
usb_kbd_event
(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
)
{
struct
usb_kbd
*
kbd
=
dev
->
private
;
...
...
drivers/usb/media/pwc/pwc-ctrl.c
View file @
99805f47
...
...
@@ -418,6 +418,44 @@ static inline int set_video_mode_Kiara(struct pwc_device *pdev, int size, int fr
static
void
pwc_set_image_buffer_size
(
struct
pwc_device
*
pdev
)
{
int
i
,
factor
=
0
,
filler
=
0
;
/* for PALETTE_YUV420P */
switch
(
pdev
->
vpalette
)
{
case
VIDEO_PALETTE_YUV420P
:
factor
=
6
;
filler
=
128
;
break
;
case
VIDEO_PALETTE_RAW
:
factor
=
6
;
/* can be uncompressed YUV420P */
filler
=
0
;
break
;
}
/* Set sizes in bytes */
pdev
->
image
.
size
=
pdev
->
image
.
x
*
pdev
->
image
.
y
*
factor
/
4
;
pdev
->
view
.
size
=
pdev
->
view
.
x
*
pdev
->
view
.
y
*
factor
/
4
;
/* Align offset, or you'll get some very weird results in
YUV420 mode... x must be multiple of 4 (to get the Y's in
place), and y even (or you'll mixup U & V). This is less of a
problem for YUV420P.
*/
pdev
->
offset
.
x
=
((
pdev
->
view
.
x
-
pdev
->
image
.
x
)
/
2
)
&
0xFFFC
;
pdev
->
offset
.
y
=
((
pdev
->
view
.
y
-
pdev
->
image
.
y
)
/
2
)
&
0xFFFE
;
/* Fill buffers with gray or black */
for
(
i
=
0
;
i
<
MAX_IMAGES
;
i
++
)
{
if
(
pdev
->
image_ptr
[
i
]
!=
NULL
)
memset
(
pdev
->
image_ptr
[
i
],
filler
,
pdev
->
view
.
size
);
}
}
/**
@pdev: device structure
@width: viewport width
...
...
@@ -475,44 +513,6 @@ int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frame
}
void
pwc_set_image_buffer_size
(
struct
pwc_device
*
pdev
)
{
int
i
,
factor
=
0
,
filler
=
0
;
/* for PALETTE_YUV420P */
switch
(
pdev
->
vpalette
)
{
case
VIDEO_PALETTE_YUV420P
:
factor
=
6
;
filler
=
128
;
break
;
case
VIDEO_PALETTE_RAW
:
factor
=
6
;
/* can be uncompressed YUV420P */
filler
=
0
;
break
;
}
/* Set sizes in bytes */
pdev
->
image
.
size
=
pdev
->
image
.
x
*
pdev
->
image
.
y
*
factor
/
4
;
pdev
->
view
.
size
=
pdev
->
view
.
x
*
pdev
->
view
.
y
*
factor
/
4
;
/* Align offset, or you'll get some very weird results in
YUV420 mode... x must be multiple of 4 (to get the Y's in
place), and y even (or you'll mixup U & V). This is less of a
problem for YUV420P.
*/
pdev
->
offset
.
x
=
((
pdev
->
view
.
x
-
pdev
->
image
.
x
)
/
2
)
&
0xFFFC
;
pdev
->
offset
.
y
=
((
pdev
->
view
.
y
-
pdev
->
image
.
y
)
/
2
)
&
0xFFFE
;
/* Fill buffers with gray or black */
for
(
i
=
0
;
i
<
MAX_IMAGES
;
i
++
)
{
if
(
pdev
->
image_ptr
[
i
]
!=
NULL
)
memset
(
pdev
->
image_ptr
[
i
],
filler
,
pdev
->
view
.
size
);
}
}
/* BRIGHTNESS */
int
pwc_get_brightness
(
struct
pwc_device
*
pdev
)
...
...
@@ -949,7 +949,7 @@ int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value)
return
SendControlMsg
(
SET_STATUS_CTL
,
LED_FORMATTER
,
2
);
}
int
pwc_get_leds
(
struct
pwc_device
*
pdev
,
int
*
on_value
,
int
*
off_value
)
static
int
pwc_get_leds
(
struct
pwc_device
*
pdev
,
int
*
on_value
,
int
*
off_value
)
{
unsigned
char
buf
[
2
];
int
ret
;
...
...
drivers/usb/media/pwc/pwc-if.c
View file @
99805f47
...
...
@@ -129,7 +129,7 @@ static int default_mbufs = 2; /* Default number of mmap() buffers */
int
pwc_trace
=
TRACE_MODULE
|
TRACE_FLOW
|
TRACE_PWCX
;
static
int
power_save
=
0
;
static
int
led_on
=
100
,
led_off
=
0
;
/* defaults to LED that is on while in use */
int
pwc_preferred_compression
=
2
;
/* 0..3 = uncompressed..high */
static
int
pwc_preferred_compression
=
2
;
/* 0..3 = uncompressed..high */
static
struct
{
int
type
;
char
serial_number
[
30
];
...
...
drivers/usb/media/pwc/pwc.h
View file @
99805f47
...
...
@@ -226,9 +226,8 @@ struct pwc_device
extern
"C"
{
#endif
/* Global variable
s
*/
/* Global variable */
extern
int
pwc_trace
;
extern
int
pwc_preferred_compression
;
/** functions in pwc-if.c */
int
pwc_try_video_mode
(
struct
pwc_device
*
pdev
,
int
width
,
int
height
,
int
new_fps
,
int
new_compression
,
int
new_snapshot
);
...
...
@@ -243,8 +242,6 @@ void pwc_construct(struct pwc_device *pdev);
/** Functions in pwc-ctrl.c */
/* Request a certain video mode. Returns < 0 if not possible */
extern
int
pwc_set_video_mode
(
struct
pwc_device
*
pdev
,
int
width
,
int
height
,
int
frames
,
int
compression
,
int
snapshot
);
/* Calculate the number of bytes per image (not frame) */
extern
void
pwc_set_image_buffer_size
(
struct
pwc_device
*
pdev
);
/* Various controls; should be obvious. Value 0..65535, or < 0 on error */
extern
int
pwc_get_brightness
(
struct
pwc_device
*
pdev
);
...
...
@@ -256,7 +253,6 @@ extern int pwc_set_gamma(struct pwc_device *pdev, int value);
extern
int
pwc_get_saturation
(
struct
pwc_device
*
pdev
);
extern
int
pwc_set_saturation
(
struct
pwc_device
*
pdev
,
int
value
);
extern
int
pwc_set_leds
(
struct
pwc_device
*
pdev
,
int
on_value
,
int
off_value
);
extern
int
pwc_get_leds
(
struct
pwc_device
*
pdev
,
int
*
on_value
,
int
*
off_value
);
extern
int
pwc_get_cmos_sensor
(
struct
pwc_device
*
pdev
,
int
*
sensor
);
/* Power down or up the camera; not supported by all models */
...
...
drivers/usb/media/sn9c102_core.c
View file @
99805f47
...
...
@@ -429,7 +429,7 @@ sn9c102_i2c_try_read(struct sn9c102_device* cam,
}
int
static
int
sn9c102_i2c_try_write
(
struct
sn9c102_device
*
cam
,
struct
sn9c102_sensor
*
sensor
,
u8
address
,
u8
value
)
{
...
...
@@ -785,7 +785,7 @@ static int sn9c102_stop_transfer(struct sn9c102_device* cam)
}
int
sn9c102_stream_interrupt
(
struct
sn9c102_device
*
cam
)
static
int
sn9c102_stream_interrupt
(
struct
sn9c102_device
*
cam
)
{
int
err
=
0
;
...
...
drivers/usb/media/sn9c102_sensor.h
View file @
99805f47
...
...
@@ -145,8 +145,6 @@ static const struct usb_device_id sn9c102_id_table[] = { \
*/
/* The "try" I2C I/O versions are used when probing the sensor */
extern
int
sn9c102_i2c_try_write
(
struct
sn9c102_device
*
,
struct
sn9c102_sensor
*
,
u8
address
,
u8
value
);
extern
int
sn9c102_i2c_try_read
(
struct
sn9c102_device
*
,
struct
sn9c102_sensor
*
,
u8
address
);
...
...
drivers/usb/misc/sisusbvga/sisusb.c
View file @
99805f47
...
...
@@ -3105,6 +3105,7 @@ static void sisusb_disconnect(struct usb_interface *intf)
static
struct
usb_device_id
sisusb_table
[]
=
{
{
USB_DEVICE
(
0x0711
,
0x0900
)
},
{
USB_DEVICE
(
0x182d
,
0x021c
)
},
{
USB_DEVICE
(
0x182d
,
0x0269
)
},
{
}
};
...
...
drivers/usb/net/usbnet.c
View file @
99805f47
/*
* USB Networking Links
* Copyright (C) 2000-200
3
by David Brownell <dbrownell@users.sourceforge.net>
* Copyright (C) 2000-200
5
by David Brownell <dbrownell@users.sourceforge.net>
* Copyright (C) 2002 Pavel Machek <pavel@ucw.cz>
* Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
* Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
...
...
@@ -210,6 +210,7 @@ struct usbnet {
# define EVENT_RX_HALT 1
# define EVENT_RX_MEMORY 2
# define EVENT_STS_SPLIT 3
# define EVENT_LINK_RESET 4
};
// device-specific info used by the driver
...
...
@@ -243,6 +244,9 @@ struct driver_info {
/* for status polling */
void
(
*
status
)(
struct
usbnet
*
,
struct
urb
*
);
/* link reset handling, called from defer_kevent */
int
(
*
link_reset
)(
struct
usbnet
*
);
/* fixup rx packet (strip framing) */
int
(
*
rx_fixup
)(
struct
usbnet
*
dev
,
struct
sk_buff
*
skb
);
...
...
@@ -304,6 +308,7 @@ static void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *);
static
u32
usbnet_get_link
(
struct
net_device
*
);
static
u32
usbnet_get_msglevel
(
struct
net_device
*
);
static
void
usbnet_set_msglevel
(
struct
net_device
*
,
u32
);
static
void
defer_kevent
(
struct
usbnet
*
,
int
);
/* mostly for PDA style devices, which are always connected if present */
static
int
always_connected
(
struct
usbnet
*
dev
)
...
...
@@ -501,6 +506,7 @@ static const struct driver_info an2720_info = {
#define AX_CMD_WRITE_MULTI_FILTER 0x16
#define AX_CMD_READ_NODE_ID 0x17
#define AX_CMD_READ_PHY_ID 0x19
#define AX_CMD_READ_MEDIUM_STATUS 0x1a
#define AX_CMD_WRITE_MEDIUM_MODE 0x1b
#define AX_CMD_READ_MONITOR_MODE 0x1c
#define AX_CMD_WRITE_MONITOR_MODE 0x1d
...
...
@@ -515,11 +521,14 @@ static const struct driver_info an2720_info = {
#define AX_MONITOR_MAGIC 0x04
#define AX_MONITOR_HSFS 0x10
/* AX88172 Medium Status Register values */
#define AX_MEDIUM_FULL_DUPLEX 0x02
#define AX_MEDIUM_TX_ABORT_ALLOW 0x04
#define AX_MEDIUM_FLOW_CONTROL_EN 0x10
#define AX_MCAST_FILTER_SIZE 8
#define AX_MAX_MCAST 64
#define AX_INTERRUPT_BUFSIZE 8
#define AX_EEPROM_LEN 0x40
#define AX_SWRESET_CLEAR 0x00
...
...
@@ -535,15 +544,33 @@ static const struct driver_info an2720_info = {
#define AX88772_IPG1_DEFAULT 0x0c
#define AX88772_IPG2_DEFAULT 0x12
#define AX88772_MEDIUM_FULL_DUPLEX 0x0002
#define AX88772_MEDIUM_RESERVED 0x0004
#define AX88772_MEDIUM_RX_FC_ENABLE 0x0010
#define AX88772_MEDIUM_TX_FC_ENABLE 0x0020
#define AX88772_MEDIUM_PAUSE_FORMAT 0x0080
#define AX88772_MEDIUM_RX_ENABLE 0x0100
#define AX88772_MEDIUM_100MB 0x0200
#define AX88772_MEDIUM_DEFAULT \
(AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \
AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \
AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE )
#define AX_EEPROM_MAGIC 0xdeadbeef
/* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */
struct
ax8817x_data
{
u8
multi_filter
[
AX_MCAST_FILTER_SIZE
];
struct
urb
*
int_urb
;
u8
*
int_buf
;
};
struct
ax88172_int_data
{
u16
res1
;
u8
link
;
u16
res2
;
u8
status
;
u16
res3
;
}
__attribute__
((
packed
));
static
int
ax8817x_read_cmd
(
struct
usbnet
*
dev
,
u8
cmd
,
u16
value
,
u16
index
,
u16
size
,
void
*
data
)
{
...
...
@@ -586,26 +613,24 @@ static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
usb_free_urb
(
urb
);
}
static
void
ax8817x_
interrupt_complete
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
static
void
ax8817x_
status
(
struct
usbnet
*
dev
,
struct
urb
*
urb
)
{
struct
usbnet
*
dev
=
(
struct
usbnet
*
)
urb
->
context
;
struct
ax8817x_data
*
data
=
(
struct
ax8817x_data
*
)
&
dev
->
data
;
struct
ax88172_int_data
*
event
;
int
link
;
if
(
urb
->
status
<
0
)
{
devdbg
(
dev
,
"ax8817x_interrupt_complete() failed with %d"
,
urb
->
status
);
}
else
{
link
=
data
->
int_buf
[
2
]
&
0x01
;
if
(
urb
->
actual_length
<
8
)
return
;
event
=
urb
->
transfer_buffer
;
link
=
event
->
link
&
0x01
;
if
(
netif_carrier_ok
(
dev
->
net
)
!=
link
)
{
if
(
link
)
if
(
link
)
{
netif_carrier_on
(
dev
->
net
);
else
defer_kevent
(
dev
,
EVENT_LINK_RESET
);
}
else
netif_carrier_off
(
dev
->
net
);
devdbg
(
dev
,
"ax8817x - Link Status is: %d"
,
link
);
}
usb_submit_urb
(
data
->
int_urb
,
GFP_ATOMIC
);
}
}
static
void
ax8817x_write_cmd_async
(
struct
usbnet
*
dev
,
u8
cmd
,
u16
value
,
u16
index
,
...
...
@@ -711,6 +736,20 @@ static void ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, i
ax8817x_write_cmd
(
dev
,
AX_CMD_SET_HW_MII
,
0
,
0
,
0
,
&
buf
);
}
static
int
ax88172_link_reset
(
struct
usbnet
*
dev
)
{
u16
lpa
;
u8
mode
;
mode
=
AX_MEDIUM_TX_ABORT_ALLOW
|
AX_MEDIUM_FLOW_CONTROL_EN
;
lpa
=
ax8817x_mdio_read
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_LPA
);
if
(
lpa
&
LPA_DUPLEX
)
mode
|=
AX_MEDIUM_FULL_DUPLEX
;
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_MEDIUM_MODE
,
mode
,
0
,
0
,
NULL
);
return
0
;
}
static
void
ax8817x_get_wol
(
struct
net_device
*
net
,
struct
ethtool_wolinfo
*
wolinfo
)
{
struct
usbnet
*
dev
=
netdev_priv
(
net
);
...
...
@@ -824,35 +863,13 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
void
*
buf
;
int
i
;
unsigned
long
gpio_bits
=
dev
->
driver_info
->
data
;
struct
ax8817x_data
*
data
=
(
struct
ax8817x_data
*
)
dev
->
data
;
get_endpoints
(
dev
,
intf
);
if
((
data
->
int_urb
=
usb_alloc_urb
(
0
,
GFP_KERNEL
))
==
NULL
)
{
dbg
(
"%s: cannot allocate interrupt URB"
,
dev
->
net
->
name
);
ret
=
-
ENOMEM
;
goto
out1
;
}
if
((
data
->
int_buf
=
kmalloc
(
AX_INTERRUPT_BUFSIZE
,
GFP_KERNEL
))
==
NULL
)
{
dbg
(
"%s: cannot allocate memory for interrupt buffer"
,
dev
->
net
->
name
);
ret
=
-
ENOMEM
;
goto
out1
;
}
memset
(
data
->
int_buf
,
0
,
AX_INTERRUPT_BUFSIZE
);
usb_fill_int_urb
(
data
->
int_urb
,
dev
->
udev
,
usb_rcvintpipe
(
dev
->
udev
,
1
),
data
->
int_buf
,
AX_INTERRUPT_BUFSIZE
,
ax8817x_interrupt_complete
,
dev
,
dev
->
udev
->
speed
==
USB_SPEED_HIGH
?
8
:
100
);
buf
=
kmalloc
(
ETH_ALEN
,
GFP_KERNEL
);
if
(
!
buf
)
{
ret
=
-
ENOMEM
;
goto
out
2
;
goto
out
1
;
}
/* Toggle the GPIOs in a manufacturer/model specific way */
...
...
@@ -860,32 +877,32 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_GPIOS
,
(
gpio_bits
>>
(
i
*
8
))
&
0xff
,
0
,
0
,
buf
))
<
0
)
goto
out
3
;
goto
out
2
;
msleep
(
5
);
}
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_RX_CTL
,
0x80
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"send AX_CMD_WRITE_RX_CTL failed: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
/* Get the MAC address */
memset
(
buf
,
0
,
ETH_ALEN
);
if
((
ret
=
ax8817x_read_cmd
(
dev
,
AX_CMD_READ_NODE_ID
,
0
,
0
,
6
,
buf
))
<
0
)
{
dbg
(
"read AX_CMD_READ_NODE_ID failed: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
memcpy
(
dev
->
net
->
dev_addr
,
buf
,
ETH_ALEN
);
/* Get the PHY id */
if
((
ret
=
ax8817x_read_cmd
(
dev
,
AX_CMD_READ_PHY_ID
,
0
,
0
,
2
,
buf
))
<
0
)
{
dbg
(
"error on read AX_CMD_READ_PHY_ID: %02x"
,
ret
);
goto
out
3
;
goto
out
2
;
}
else
if
(
ret
<
2
)
{
/* this should always return 2 bytes */
dbg
(
"AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x"
,
ret
);
ret
=
-
EIO
;
goto
out
3
;
goto
out
2
;
}
/* Initialize MII structure */
...
...
@@ -899,36 +916,18 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
dev
->
net
->
set_multicast_list
=
ax8817x_set_multicast
;
dev
->
net
->
ethtool_ops
=
&
ax8817x_ethtool_ops
;
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_BMCR
,
cpu_to_le16
(
BMCR_RESET
));
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_BMCR
,
BMCR_RESET
);
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_ADVERTISE
,
cpu_to_le16
(
ADVERTISE_ALL
|
ADVERTISE_CSMA
|
0x0400
)
);
ADVERTISE_ALL
|
ADVERTISE_CSMA
|
ADVERTISE_PAUSE_CAP
);
mii_nway_restart
(
&
dev
->
mii
);
if
((
ret
=
usb_submit_urb
(
data
->
int_urb
,
GFP_KERNEL
))
<
0
)
{
dbg
(
"Failed to submit interrupt URB: %02x"
,
ret
);
goto
out2
;
}
return
0
;
out3:
kfree
(
buf
);
out2:
kfree
(
data
->
int_
buf
);
kfree
(
buf
);
out1:
usb_free_urb
(
data
->
int_urb
);
return
ret
;
}
static
void
ax8817x_unbind
(
struct
usbnet
*
dev
,
struct
usb_interface
*
intf
)
{
struct
ax8817x_data
*
data
=
(
struct
ax8817x_data
*
)
dev
->
data
;
usb_kill_urb
(
data
->
int_urb
);
usb_free_urb
(
data
->
int_urb
);
kfree
(
data
->
int_buf
);
}
static
struct
ethtool_ops
ax88772_ethtool_ops
=
{
.
get_drvinfo
=
ax8817x_get_drvinfo
,
.
get_link
=
ethtool_op_get_link
,
...
...
@@ -946,64 +945,44 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
{
int
ret
;
void
*
buf
;
struct
ax8817x_data
*
data
=
(
struct
ax8817x_data
*
)
dev
->
data
;
get_endpoints
(
dev
,
intf
);
if
((
data
->
int_urb
=
usb_alloc_urb
(
0
,
GFP_KERNEL
))
==
0
)
{
dbg
(
"Cannot allocate interrupt URB"
);
ret
=
-
ENOMEM
;
goto
out1
;
}
if
((
data
->
int_buf
=
kmalloc
(
AX_INTERRUPT_BUFSIZE
,
GFP_KERNEL
))
==
NULL
)
{
dbg
(
"Cannot allocate memory for interrupt buffer"
);
ret
=
-
ENOMEM
;
goto
out1
;
}
memset
(
data
->
int_buf
,
0
,
AX_INTERRUPT_BUFSIZE
);
usb_fill_int_urb
(
data
->
int_urb
,
dev
->
udev
,
usb_rcvintpipe
(
dev
->
udev
,
1
),
data
->
int_buf
,
AX_INTERRUPT_BUFSIZE
,
ax8817x_interrupt_complete
,
dev
,
dev
->
udev
->
speed
==
USB_SPEED_HIGH
?
8
:
100
);
buf
=
kmalloc
(
6
,
GFP_KERNEL
);
if
(
!
buf
)
{
dbg
(
"Cannot allocate memory for buffer"
);
ret
=
-
ENOMEM
;
goto
out
2
;
goto
out
1
;
}
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_GPIOS
,
0x00B0
,
0
,
0
,
buf
))
<
0
)
goto
out
3
;
goto
out
2
;
msleep
(
5
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_PHY_SELECT
,
0x0001
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Select PHY #1 failed: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_RESET
,
AX_SWRESET_IPPD
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Failed to power down internal PHY: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
msleep
(
150
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_RESET
,
AX_SWRESET_CLEAR
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Failed to perform software reset: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
msleep
(
150
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_RESET
,
AX_SWRESET_IPRL
|
AX_SWRESET_PRL
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Failed to set Internal/External PHY reset control: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
msleep
(
150
);
...
...
@@ -1011,27 +990,27 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_RX_CTL
,
0x0000
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Failed to reset RX_CTL: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
/* Get the MAC address */
memset
(
buf
,
0
,
ETH_ALEN
);
if
((
ret
=
ax8817x_read_cmd
(
dev
,
AX88772_CMD_READ_NODE_ID
,
0
,
0
,
ETH_ALEN
,
buf
))
<
0
)
{
dbg
(
"Failed to read MAC address: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
memcpy
(
dev
->
net
->
dev_addr
,
buf
,
ETH_ALEN
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SET_SW_MII
,
0
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Enabling software MII failed: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
if
(((
ret
=
ax8817x_read_cmd
(
dev
,
AX_CMD_READ_MII_REG
,
0x0010
,
2
,
2
,
buf
))
<
0
)
||
(
*
((
u16
*
)
buf
)
!=
0x003b
))
{
dbg
(
"Read PHY register 2 must be 0x3b00: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
/* Initialize MII structure */
...
...
@@ -1044,26 +1023,26 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
/* Get the PHY id */
if
((
ret
=
ax8817x_read_cmd
(
dev
,
AX_CMD_READ_PHY_ID
,
0
,
0
,
2
,
buf
))
<
0
)
{
dbg
(
"Error reading PHY ID: %02x"
,
ret
);
goto
out
3
;
goto
out
2
;
}
else
if
(
ret
<
2
)
{
/* this should always return 2 bytes */
dbg
(
"AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x"
,
ret
);
ret
=
-
EIO
;
goto
out
3
;
goto
out
2
;
}
dev
->
mii
.
phy_id
=
*
((
u8
*
)
buf
+
1
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_RESET
,
AX_SWRESET_PRL
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Set external PHY reset pin level: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
msleep
(
150
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SW_RESET
,
AX_SWRESET_IPRL
|
AX_SWRESET_PRL
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Set Internal/External PHY reset control: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
msleep
(
150
);
...
...
@@ -1071,25 +1050,24 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
dev
->
net
->
set_multicast_list
=
ax8817x_set_multicast
;
dev
->
net
->
ethtool_ops
=
&
ax88772_ethtool_ops
;
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_BMCR
,
cpu_to_le16
(
BMCR_RESET
));
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_BMCR
,
BMCR_RESET
);
ax8817x_mdio_write
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_ADVERTISE
,
cpu_to_le16
(
ADVERTISE_ALL
|
ADVERTISE_CSMA
)
);
ADVERTISE_ALL
|
ADVERTISE_CSMA
);
mii_nway_restart
(
&
dev
->
mii
);
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_MEDIUM_MODE
,
0x0336
,
0
,
0
,
buf
))
<
0
)
{
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_MEDIUM_MODE
,
AX88772_MEDIUM_DEFAULT
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Write medium mode register: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_IPG0
,
AX88772_IPG0_DEFAULT
|
AX88772_IPG1_DEFAULT
,
AX88772_IPG2_DEFAULT
,
0
,
buf
))
<
0
)
{
dbg
(
"Write IPG,IPG1,IPG2 failed: %d"
,
ret
);
goto
out
3
;
goto
out
2
;
}
if
((
ret
=
ax8817x_write_cmd
(
dev
,
AX_CMD_SET_HW_MII
,
0
,
0
,
0
,
&
buf
))
<
0
)
{
dbg
(
"Failed to set hardware MII: %02x"
,
ret
);
goto
out
3
;
goto
out
2
;
}
/* Set RX_CTL to default values with 2k buffer, and enable cactus */
...
...
@@ -1097,25 +1075,16 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_RX_CTL
,
0x0088
,
0
,
0
,
buf
))
<
0
)
{
dbg
(
"Reset RX_CTL failed: %d"
,
ret
);
goto
out3
;
}
if
((
ret
=
usb_submit_urb
(
data
->
int_urb
,
GFP_KERNEL
))
<
0
)
{
dbg
(
"Failed to submit interrupt URB: %02x"
,
ret
);
goto
out3
;
goto
out2
;
}
kfree
(
buf
);
return
0
;
out3:
kfree
(
buf
);
out2:
kfree
(
data
->
int_
buf
);
kfree
(
buf
);
out1:
usb_free_urb
(
data
->
int_urb
);
return
ret
;
}
...
...
@@ -1213,10 +1182,29 @@ static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
return
skb
;
}
static
int
ax88772_link_reset
(
struct
usbnet
*
dev
)
{
u16
lpa
;
u16
mode
;
mode
=
AX88772_MEDIUM_DEFAULT
;
lpa
=
ax8817x_mdio_read
(
dev
->
net
,
dev
->
mii
.
phy_id
,
MII_LPA
);
if
((
lpa
&
LPA_DUPLEX
)
==
0
)
mode
&=
~
AX88772_MEDIUM_FULL_DUPLEX
;
if
((
lpa
&
LPA_100
)
==
0
)
mode
&=
~
AX88772_MEDIUM_100MB
;
ax8817x_write_cmd
(
dev
,
AX_CMD_WRITE_MEDIUM_MODE
,
mode
,
0
,
0
,
NULL
);
return
0
;
}
static
const
struct
driver_info
ax8817x_info
=
{
.
description
=
"ASIX AX8817x USB 2.0 Ethernet"
,
.
bind
=
ax8817x_bind
,
.
unbind
=
ax8817x_unbind
,
.
status
=
ax8817x_status
,
.
link_reset
=
ax88172_link_reset
,
.
reset
=
ax88172_link_reset
,
.
flags
=
FLAG_ETHER
,
.
data
=
0x00130103
,
};
...
...
@@ -1224,7 +1212,9 @@ static const struct driver_info ax8817x_info = {
static
const
struct
driver_info
dlink_dub_e100_info
=
{
.
description
=
"DLink DUB-E100 USB Ethernet"
,
.
bind
=
ax8817x_bind
,
.
unbind
=
ax8817x_unbind
,
.
status
=
ax8817x_status
,
.
link_reset
=
ax88172_link_reset
,
.
reset
=
ax88172_link_reset
,
.
flags
=
FLAG_ETHER
,
.
data
=
0x009f9d9f
,
};
...
...
@@ -1232,7 +1222,9 @@ static const struct driver_info dlink_dub_e100_info = {
static
const
struct
driver_info
netgear_fa120_info
=
{
.
description
=
"Netgear FA-120 USB Ethernet"
,
.
bind
=
ax8817x_bind
,
.
unbind
=
ax8817x_unbind
,
.
status
=
ax8817x_status
,
.
link_reset
=
ax88172_link_reset
,
.
reset
=
ax88172_link_reset
,
.
flags
=
FLAG_ETHER
,
.
data
=
0x00130103
,
};
...
...
@@ -1240,7 +1232,9 @@ static const struct driver_info netgear_fa120_info = {
static
const
struct
driver_info
hawking_uf200_info
=
{
.
description
=
"Hawking UF200 USB Ethernet"
,
.
bind
=
ax8817x_bind
,
.
unbind
=
ax8817x_unbind
,
.
status
=
ax8817x_status
,
.
link_reset
=
ax88172_link_reset
,
.
reset
=
ax88172_link_reset
,
.
flags
=
FLAG_ETHER
,
.
data
=
0x001f1d1f
,
};
...
...
@@ -1248,7 +1242,9 @@ static const struct driver_info hawking_uf200_info = {
static
const
struct
driver_info
ax88772_info
=
{
.
description
=
"ASIX AX88772 USB 2.0 Ethernet"
,
.
bind
=
ax88772_bind
,
.
unbind
=
ax8817x_unbind
,
.
status
=
ax8817x_status
,
.
link_reset
=
ax88772_link_reset
,
.
reset
=
ax88772_link_reset
,
.
flags
=
FLAG_ETHER
|
FLAG_FRAMING_AX
,
.
rx_fixup
=
ax88772_rx_fixup
,
.
tx_fixup
=
ax88772_tx_fixup
,
...
...
@@ -2661,7 +2657,7 @@ static const struct driver_info blob_info = {
* All known Zaurii lie about their standards conformance. Most lie by
* saying they support CDC Ethernet. Some lie and say they support CDC
* MDLM (as if for access to cell phone modems). Someone, please beat
* on Sharp for a while with a cluestick.
* on Sharp
(and other such vendors)
for a while with a cluestick.
*
*-------------------------------------------------------------------------*/
...
...
@@ -2714,13 +2710,6 @@ static const struct driver_info zaurus_pxa_info = {
};
#define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info)
static
const
struct
driver_info
zaurus_pxa_mdlm_info
=
{
.
description
=
"Sharp Zaurus, PXA-255 based"
,
.
flags
=
FLAG_FRAMING_Z
,
.
check_connect
=
always_connected
,
.
tx_fixup
=
zaurus_tx_fixup
,
};
static
const
struct
driver_info
olympus_mxl_info
=
{
.
description
=
"Olympus R1000"
,
.
flags
=
FLAG_FRAMING_Z
,
...
...
@@ -2731,6 +2720,133 @@ static const struct driver_info olympus_mxl_info = {
};
#define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info)
/* Some more recent products using Lineo/Belcarra code will wrongly claim
* CDC MDLM conformance. They aren't conformant: data endpoints live
* in the control interface, there's no data interface, and it's not used
* to talk to a cell phone radio. But at least we can detect these two
* pseudo-classes, rather than growing this product list with entries for
* each new nonconformant product (sigh).
*/
static
const
u8
safe_guid
[
16
]
=
{
0x5d
,
0x34
,
0xcf
,
0x66
,
0x11
,
0x18
,
0x11
,
0xd6
,
0xa2
,
0x1a
,
0x00
,
0x01
,
0x02
,
0xca
,
0x9a
,
0x7f
,
};
static
const
u8
blan_guid
[
16
]
=
{
0x74
,
0xf0
,
0x3d
,
0xbd
,
0x1e
,
0xc1
,
0x44
,
0x70
,
0xa3
,
0x67
,
0x71
,
0x34
,
0xc9
,
0xf5
,
0x54
,
0x37
,
};
static
int
blan_mdlm_bind
(
struct
usbnet
*
dev
,
struct
usb_interface
*
intf
)
{
u8
*
buf
=
intf
->
cur_altsetting
->
extra
;
int
len
=
intf
->
cur_altsetting
->
extralen
;
struct
usb_cdc_mdlm_desc
*
desc
=
NULL
;
struct
usb_cdc_mdlm_detail_desc
*
detail
=
NULL
;
while
(
len
>
3
)
{
if
(
buf
[
1
]
!=
USB_DT_CS_INTERFACE
)
goto
next_desc
;
/* use bDescriptorSubType, and just verify that we get a
* "BLAN" (or "SAFE") descriptor.
*/
switch
(
buf
[
2
])
{
case
USB_CDC_MDLM_TYPE
:
if
(
desc
)
{
dev_dbg
(
&
intf
->
dev
,
"extra MDLM
\n
"
);
goto
bad_desc
;
}
desc
=
(
void
*
)
buf
;
if
(
desc
->
bLength
!=
sizeof
*
desc
)
{
dev_dbg
(
&
intf
->
dev
,
"MDLM len %u
\n
"
,
desc
->
bLength
);
goto
bad_desc
;
}
/* expect bcdVersion 1.0, ignore */
if
(
memcmp
(
&
desc
->
bGUID
,
blan_guid
,
16
)
||
memcmp
(
&
desc
->
bGUID
,
blan_guid
,
16
)
)
{
/* hey, this one might _really_ be MDLM! */
dev_dbg
(
&
intf
->
dev
,
"MDLM guid
\n
"
);
goto
bad_desc
;
}
break
;
case
USB_CDC_MDLM_DETAIL_TYPE
:
if
(
detail
)
{
dev_dbg
(
&
intf
->
dev
,
"extra MDLM detail
\n
"
);
goto
bad_desc
;
}
detail
=
(
void
*
)
buf
;
switch
(
detail
->
bGuidDescriptorType
)
{
case
0
:
/* "SAFE" */
if
(
detail
->
bLength
!=
(
sizeof
*
detail
+
2
))
goto
bad_detail
;
break
;
case
1
:
/* "BLAN" */
if
(
detail
->
bLength
!=
(
sizeof
*
detail
+
3
))
goto
bad_detail
;
break
;
default:
goto
bad_detail
;
}
/* assuming we either noticed BLAN already, or will
* find it soon, there are some data bytes here:
* - bmNetworkCapabilities (unused)
* - bmDataCapabilities (bits, see below)
* - bPad (ignored, for PADAFTER -- BLAN-only)
* bits are:
* - 0x01 -- Zaurus framing (add CRC)
* - 0x02 -- PADBEFORE
* - 0x04 -- PADAFTER
* - 0x08 -- "fermat" packet mangling (for hw bugs)
*/
if
(
detail
->
bDetailData
[
1
]
!=
0x01
)
{
/* bmDataCapabilites == 0 would be fine too,
* but framing is minidriver-coupled for now.
*/
bad_detail:
dev_dbg
(
&
intf
->
dev
,
"bad MDLM detail, %d %d %d
\n
"
,
detail
->
bLength
,
detail
->
bDetailData
[
0
],
detail
->
bDetailData
[
2
]);
goto
bad_desc
;
}
break
;
}
next_desc:
len
-=
buf
[
0
];
/* bLength */
buf
+=
buf
[
0
];
}
if
(
!
desc
||
!
detail
)
{
dev_dbg
(
&
intf
->
dev
,
"missing cdc mdlm %s%sdescriptor
\n
"
,
desc
?
""
:
"func "
,
detail
?
""
:
"detail "
);
goto
bad_desc
;
}
/* There's probably a CDC Ethernet descriptor there, but we can't
* rely on the Ethernet address it provides since not all vendors
* bother to make it unique. Likewise there's no point in tracking
* of the CDC event notifications.
*/
return
get_endpoints
(
dev
,
intf
);
bad_desc:
dev_info
(
&
dev
->
udev
->
dev
,
"unsupported MDLM descriptors
\n
"
);
return
-
ENODEV
;
}
static
const
struct
driver_info
bogus_mdlm_info
=
{
.
description
=
"pseudo-MDLM (BLAN) device"
,
.
flags
=
FLAG_FRAMING_Z
,
.
check_connect
=
always_connected
,
.
tx_fixup
=
zaurus_tx_fixup
,
.
bind
=
blan_mdlm_bind
,
};
#else
/* blacklist all those devices */
...
...
@@ -3307,6 +3423,19 @@ kevent (void *data)
}
}
if
(
test_bit
(
EVENT_LINK_RESET
,
&
dev
->
flags
))
{
struct
driver_info
*
info
=
dev
->
driver_info
;
int
retval
=
0
;
clear_bit
(
EVENT_LINK_RESET
,
&
dev
->
flags
);
if
(
info
->
link_reset
&&
(
retval
=
info
->
link_reset
(
dev
))
<
0
)
{
devinfo
(
dev
,
"link reset failed (%d) usbnet usb-%s-%s, %s"
,
retval
,
dev
->
udev
->
bus
->
bus_name
,
dev
->
udev
->
devpath
,
info
->
description
);
}
}
if
(
dev
->
flags
)
devdbg
(
dev
,
"kevent done, flags = 0x%lx"
,
dev
->
flags
);
...
...
@@ -4020,30 +4149,14 @@ static const struct usb_device_id products [] = {
},
#ifdef CONFIG_USB_ZAURUS
/*
at least some (reports vary) PXA units have very different
*
lies about their standards support: they claim to be cell
*
phones giving direct radio access (which they aren't).
/*
At least some (reports vary) PXA units have very different lies
*
about their standards support: they claim to be cell phones with
*
direct access to their radios. (They don't conform to CDC MDLM.)
*/
{
.
match_flags
=
USB_DEVICE_ID_MATCH_INT_INFO
|
USB_DEVICE_ID_MATCH_DEVICE
,
.
idVendor
=
0x04DD
,
/* Sharp ROM v1.32 */
.
idProduct
=
0x8006
,
/* SL-5600 */
.
bInterfaceClass
=
USB_CLASS_COMM
,
.
bInterfaceSubClass
=
USB_CDC_SUBCLASS_MDLM
,
.
bInterfaceProtocol
=
USB_CDC_PROTO_NONE
,
.
driver_info
=
(
unsigned
long
)
&
zaurus_pxa_mdlm_info
,
},
{
.
match_flags
=
USB_DEVICE_ID_MATCH_INT_INFO
|
USB_DEVICE_ID_MATCH_DEVICE
,
.
idVendor
=
0x04DD
,
/* reported with some C860 units */
.
idProduct
=
0x9031
,
/* C-860 */
.
bInterfaceClass
=
USB_CLASS_COMM
,
.
bInterfaceSubClass
=
USB_CDC_SUBCLASS_MDLM
,
.
bInterfaceProtocol
=
USB_CDC_PROTO_NONE
,
.
driver_info
=
(
unsigned
long
)
&
zaurus_pxa_mdlm_info
,
USB_INTERFACE_INFO
(
USB_CLASS_COMM
,
USB_CDC_SUBCLASS_MDLM
,
USB_CDC_PROTO_NONE
),
.
driver_info
=
(
unsigned
long
)
&
bogus_mdlm_info
,
},
#endif
...
...
drivers/usb/net/zd1201.c
View file @
99805f47
...
...
@@ -45,7 +45,7 @@ MODULE_PARM_DESC(ap, "If non-zero Access Point firmware will be loaded");
MODULE_DEVICE_TABLE
(
usb
,
zd1201_table
);
int
zd1201_fw_upload
(
struct
usb_device
*
dev
,
int
apfw
)
static
int
zd1201_fw_upload
(
struct
usb_device
*
dev
,
int
apfw
)
{
const
struct
firmware
*
fw_entry
;
char
*
data
;
...
...
@@ -111,7 +111,7 @@ int zd1201_fw_upload(struct usb_device *dev, int apfw)
return
err
;
}
void
zd1201_usbfree
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
static
void
zd1201_usbfree
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
{
struct
zd1201
*
zd
=
urb
->
context
;
...
...
@@ -142,7 +142,8 @@ void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
total: 4 + 2 + 2 + 2 + 2 + 4 = 16
*/
int
zd1201_docmd
(
struct
zd1201
*
zd
,
int
cmd
,
int
parm0
,
int
parm1
,
int
parm2
)
static
int
zd1201_docmd
(
struct
zd1201
*
zd
,
int
cmd
,
int
parm0
,
int
parm1
,
int
parm2
)
{
unsigned
char
*
command
;
int
ret
;
...
...
@@ -175,7 +176,7 @@ int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0, int parm1, int parm2)
}
/* Callback after sending out a packet */
void
zd1201_usbtx
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
static
void
zd1201_usbtx
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
{
struct
zd1201
*
zd
=
urb
->
context
;
netif_wake_queue
(
zd
->
dev
);
...
...
@@ -183,7 +184,7 @@ void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
}
/* Incomming data */
void
zd1201_usbrx
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
static
void
zd1201_usbrx
(
struct
urb
*
urb
,
struct
pt_regs
*
regs
)
{
struct
zd1201
*
zd
=
urb
->
context
;
int
free
=
0
;
...
...
@@ -613,7 +614,7 @@ static inline int zd1201_setconfig16(struct zd1201 *zd, int rid, short val)
return
(
zd1201_setconfig
(
zd
,
rid
,
&
zdval
,
sizeof
(
__le16
),
1
));
}
int
zd1201_drvr_start
(
struct
zd1201
*
zd
)
static
int
zd1201_drvr_start
(
struct
zd1201
*
zd
)
{
int
err
,
i
;
short
max
;
...
...
@@ -1739,7 +1740,8 @@ static const struct iw_handler_def zd1201_iw_handlers = {
.
private_args
=
(
struct
iw_priv_args
*
)
zd1201_private_args
,
};
int
zd1201_probe
(
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
id
)
static
int
zd1201_probe
(
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
id
)
{
struct
zd1201
*
zd
;
struct
usb_device
*
usb
;
...
...
@@ -1851,7 +1853,7 @@ int zd1201_probe(struct usb_interface *interface, const struct usb_device_id *id
return
err
;
}
void
zd1201_disconnect
(
struct
usb_interface
*
interface
)
static
void
zd1201_disconnect
(
struct
usb_interface
*
interface
)
{
struct
zd1201
*
zd
=
(
struct
zd1201
*
)
usb_get_intfdata
(
interface
);
struct
hlist_node
*
node
,
*
node2
;
...
...
@@ -1882,7 +1884,7 @@ void zd1201_disconnect(struct usb_interface *interface)
kfree
(
zd
);
}
struct
usb_driver
zd1201_usb
=
{
st
atic
st
ruct
usb_driver
zd1201_usb
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"zd1201"
,
.
probe
=
zd1201_probe
,
...
...
drivers/usb/serial/Kconfig
View file @
99805f47
...
...
@@ -395,6 +395,15 @@ config USB_SERIAL_PL2303
To compile this driver as a module, choose M here: the
module will be called pl2303.
config USB_SERIAL_HP4X
tristate "USB HP4x Calculators support"
depends on USB_SERIAL
help
Say Y here if you want to use an Hewlett-Packard 4x Calculator.
To compile this driver as a module, choose M here: the
module will be called hp4x.
config USB_SERIAL_SAFE
tristate "USB Safe Serial (Encapsulated) Driver (EXPERIMENTAL)"
depends on USB_SERIAL && EXPERIMENTAL
...
...
drivers/usb/serial/Makefile
View file @
99805f47
...
...
@@ -21,6 +21,7 @@ obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o
obj-$(CONFIG_USB_SERIAL_EMPEG)
+=
empeg.o
obj-$(CONFIG_USB_SERIAL_FTDI_SIO)
+=
ftdi_sio.o
obj-$(CONFIG_USB_SERIAL_GARMIN)
+=
garmin_gps.o
obj-$(CONFIG_USB_SERIAL_HP4X)
+=
hp4x.o
obj-$(CONFIG_USB_SERIAL_IPAQ)
+=
ipaq.o
obj-$(CONFIG_USB_SERIAL_IPW)
+=
ipw.o
obj-$(CONFIG_USB_SERIAL_IR)
+=
ir-usb.o
...
...
drivers/usb/serial/hp4x.c
0 → 100644
View file @
99805f47
/*
* HP4x Calculators Serial USB driver
*
* Copyright (C) 2005 Arthur Huillet (ahuillet@users.sf.net)
* Copyright (C) 2001-2005 Greg Kroah-Hartman (greg@kroah.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* See Documentation/usb/usb-serial.txt for more information on using this driver
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/module.h>
#include <linux/usb.h>
#include "usb-serial.h"
/*
* Version Information
*/
#define DRIVER_VERSION "v1.00"
#define DRIVER_DESC "HP4x (48/49) Generic Serial driver"
#define HP_VENDOR_ID 0x03f0
#define HP49GP_PRODUCT_ID 0x0121
static
struct
usb_device_id
id_table
[]
=
{
{
USB_DEVICE
(
HP_VENDOR_ID
,
HP49GP_PRODUCT_ID
)
},
{
}
/* Terminating entry */
};
MODULE_DEVICE_TABLE
(
usb
,
id_table
);
static
struct
usb_driver
hp49gp_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"HP4X"
,
.
probe
=
usb_serial_probe
,
.
disconnect
=
usb_serial_disconnect
,
.
id_table
=
id_table
,
};
static
struct
usb_serial_device_type
hp49gp_device
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"HP4X"
,
.
id_table
=
id_table
,
.
num_interrupt_in
=
NUM_DONT_CARE
,
.
num_bulk_in
=
NUM_DONT_CARE
,
.
num_bulk_out
=
NUM_DONT_CARE
,
.
num_ports
=
1
,
};
static
int
__init
hp49gp_init
(
void
)
{
int
retval
;
retval
=
usb_serial_register
(
&
hp49gp_device
);
if
(
retval
)
goto
failed_usb_serial_register
;
retval
=
usb_register
(
&
hp49gp_driver
);
if
(
retval
)
goto
failed_usb_register
;
info
(
DRIVER_DESC
" "
DRIVER_VERSION
);
return
0
;
failed_usb_register:
usb_serial_deregister
(
&
hp49gp_device
);
failed_usb_serial_register:
return
retval
;
}
static
void
__exit
hp49gp_exit
(
void
)
{
usb_deregister
(
&
hp49gp_driver
);
usb_serial_deregister
(
&
hp49gp_device
);
}
module_init
(
hp49gp_init
);
module_exit
(
hp49gp_exit
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_VERSION
(
DRIVER_VERSION
);
MODULE_LICENSE
(
"GPL"
);
drivers/usb/storage/unusual_devs.h
View file @
99805f47
...
...
@@ -517,14 +517,32 @@ UNUSUAL_DEV( 0x05ab, 0x5701, 0x0100, 0x0110,
0
),
#endif
/* Submitted by Sven Anderson <sven-linux@anderson.de>
* There are at least four ProductIDs used for iPods, so I added 0x1202 and
* 0x1204. They just need the US_FL_FIX_CAPACITY. As the bcdDevice appears
* to change with firmware updates, I changed the range to maximum for all
* iPod entries.
*/
UNUSUAL_DEV
(
0x05ac
,
0x1202
,
0x0000
,
0x9999
,
"Apple"
,
"iPod"
,
US_SC_DEVICE
,
US_PR_DEVICE
,
NULL
,
US_FL_FIX_CAPACITY
),
/* Reported by Avi Kivity <avi@argo.co.il> */
UNUSUAL_DEV
(
0x05ac
,
0x1203
,
0x0001
,
0x0001
,
UNUSUAL_DEV
(
0x05ac
,
0x1203
,
0x0000
,
0x9999
,
"Apple"
,
"iPod"
,
US_SC_DEVICE
,
US_PR_DEVICE
,
NULL
,
US_FL_FIX_CAPACITY
),
UNUSUAL_DEV
(
0x05ac
,
0x1204
,
0x0000
,
0x9999
,
"Apple"
,
"iPod"
,
US_SC_DEVICE
,
US_PR_DEVICE
,
NULL
,
US_FL_FIX_CAPACITY
),
UNUSUAL_DEV
(
0x05ac
,
0x1205
,
0x000
1
,
0x0001
,
UNUSUAL_DEV
(
0x05ac
,
0x1205
,
0x000
0
,
0x9999
,
"Apple"
,
"iPod"
,
US_SC_DEVICE
,
US_PR_DEVICE
,
NULL
,
...
...
scripts/mod/file2alias.c
View file @
99805f47
...
...
@@ -47,32 +47,31 @@ do { \
sprintf(str + strlen(str), "*"); \
} while(0)
/* Looks like "usb:vNpNdlNdhNdcNdscNdpNicNiscNipN" */
static
int
do_usb_entry
(
const
char
*
filename
,
struct
usb_device_id
*
id
,
char
*
alias
)
/* USB is special because the bcdDevice can be matched against a numeric range */
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
static
void
do_usb_entry
(
struct
usb_device_id
*
id
,
unsigned
int
bcdDevice_initial
,
int
bcdDevice_initial_digits
,
unsigned
char
range_lo
,
unsigned
char
range_hi
,
struct
module
*
mod
)
{
id
->
match_flags
=
TO_NATIVE
(
id
->
match_flags
);
id
->
idVendor
=
TO_NATIVE
(
id
->
idVendor
);
id
->
idProduct
=
TO_NATIVE
(
id
->
idProduct
);
id
->
bcdDevice_lo
=
TO_NATIVE
(
id
->
bcdDevice_lo
);
id
->
bcdDevice_hi
=
TO_NATIVE
(
id
->
bcdDevice_hi
);
/*
* Some modules (visor) have empty slots as placeholder for
* run-time specification that results in catch-all alias
*/
if
(
!
(
id
->
idVendor
|
id
->
bDeviceClass
|
id
->
bInterfaceClass
))
return
1
;
char
alias
[
500
];
strcpy
(
alias
,
"usb:"
);
ADD
(
alias
,
"v"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_VENDOR
,
id
->
idVendor
);
ADD
(
alias
,
"p"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_PRODUCT
,
id
->
idProduct
);
ADD
(
alias
,
"dl"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_DEV_LO
,
id
->
bcdDevice_lo
);
ADD
(
alias
,
"dh"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_DEV_HI
,
id
->
bcdDevice_hi
);
strcat
(
alias
,
"d"
);
if
(
bcdDevice_initial_digits
)
sprintf
(
alias
+
strlen
(
alias
),
"%0*X"
,
bcdDevice_initial_digits
,
bcdDevice_initial
);
if
(
range_lo
==
range_hi
)
sprintf
(
alias
+
strlen
(
alias
),
"%u"
,
range_lo
);
else
if
(
range_lo
>
0
||
range_hi
<
9
)
sprintf
(
alias
+
strlen
(
alias
),
"[%u-%u]"
,
range_lo
,
range_hi
);
if
(
bcdDevice_initial_digits
<
(
sizeof
(
id
->
bcdDevice_lo
)
*
2
-
1
))
strcat
(
alias
,
"*"
);
ADD
(
alias
,
"dc"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_DEV_CLASS
,
id
->
bDeviceClass
);
ADD
(
alias
,
"dsc"
,
...
...
@@ -90,7 +89,73 @@ static int do_usb_entry(const char *filename,
ADD
(
alias
,
"ip"
,
id
->
match_flags
&
USB_DEVICE_ID_MATCH_INT_PROTOCOL
,
id
->
bInterfaceProtocol
);
return
1
;
/* Always end in a wildcard, for future extension */
if
(
alias
[
strlen
(
alias
)
-
1
]
!=
'*'
)
strcat
(
alias
,
"*"
);
buf_printf
(
&
mod
->
dev_table_buf
,
"MODULE_ALIAS(
\"
%s
\"
);
\n
"
,
alias
);
}
static
void
do_usb_entry_multi
(
struct
usb_device_id
*
id
,
struct
module
*
mod
)
{
unsigned
int
devlo
,
devhi
;
unsigned
char
chi
,
clo
;
int
ndigits
;
id
->
match_flags
=
TO_NATIVE
(
id
->
match_flags
);
id
->
idVendor
=
TO_NATIVE
(
id
->
idVendor
);
id
->
idProduct
=
TO_NATIVE
(
id
->
idProduct
);
devlo
=
id
->
match_flags
&
USB_DEVICE_ID_MATCH_DEV_LO
?
TO_NATIVE
(
id
->
bcdDevice_lo
)
:
0x0U
;
devhi
=
id
->
match_flags
&
USB_DEVICE_ID_MATCH_DEV_HI
?
TO_NATIVE
(
id
->
bcdDevice_hi
)
:
~
0x0U
;
/*
* Some modules (visor) have empty slots as placeholder for
* run-time specification that results in catch-all alias
*/
if
(
!
(
id
->
idVendor
|
id
->
bDeviceClass
|
id
->
bInterfaceClass
))
return
;
/* Convert numeric bcdDevice range into fnmatch-able pattern(s) */
for
(
ndigits
=
sizeof
(
id
->
bcdDevice_lo
)
*
2
-
1
;
devlo
<=
devhi
;
ndigits
--
)
{
clo
=
devlo
&
0xf
;
chi
=
devhi
&
0xf
;
if
(
chi
>
9
)
/* it's bcd not hex */
chi
=
9
;
devlo
>>=
4
;
devhi
>>=
4
;
if
(
devlo
==
devhi
||
!
ndigits
)
{
do_usb_entry
(
id
,
devlo
,
ndigits
,
clo
,
chi
,
mod
);
break
;
}
if
(
clo
>
0
)
do_usb_entry
(
id
,
devlo
++
,
ndigits
,
clo
,
9
,
mod
);
if
(
chi
<
9
)
do_usb_entry
(
id
,
devhi
--
,
ndigits
,
0
,
chi
,
mod
);
}
}
static
void
do_usb_table
(
void
*
symval
,
unsigned
long
size
,
struct
module
*
mod
)
{
unsigned
int
i
;
const
unsigned
long
id_size
=
sizeof
(
struct
usb_device_id
);
if
(
size
%
id_size
||
size
<
id_size
)
{
fprintf
(
stderr
,
"*** Warning: %s ids %lu bad size "
"(each on %lu)
\n
"
,
mod
->
name
,
size
,
id_size
);
}
/* Leave last one: it's the terminator. */
size
-=
id_size
;
for
(
i
=
0
;
i
<
size
;
i
+=
id_size
)
do_usb_entry_multi
(
symval
+
i
,
mod
);
}
/* Looks like: ieee1394:venNmoNspNverN */
...
...
@@ -280,8 +345,8 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
do_table
(
symval
,
sym
->
st_size
,
sizeof
(
struct
pci_device_id
),
do_pci_entry
,
mod
);
else
if
(
sym_is
(
symname
,
"__mod_usb_device_table"
))
do_table
(
symval
,
sym
->
st_size
,
sizeof
(
struct
usb_device_id
),
do_usb_entry
,
mod
);
/* special case to handle bcdDevice ranges */
do_usb_table
(
symval
,
sym
->
st_size
,
mod
);
else
if
(
sym_is
(
symname
,
"__mod_ieee1394_device_table"
))
do_table
(
symval
,
sym
->
st_size
,
sizeof
(
struct
ieee1394_device_id
),
do_ieee1394_entry
,
mod
);
...
...
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