Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
99805f47
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
99805f47
编写于
4月 26, 2005
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Automatic merge of
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git/
上级
a1342206
9719b0c2
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
534 addition
and
247 deletion
+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
未找到文件。
drivers/usb/core/usb.c
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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,25 +613,23 @@ 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
(
netif_carrier_ok
(
dev
->
net
)
!=
link
)
{
if
(
link
)
netif_carrier_on
(
dev
->
net
);
else
netif_carrier_off
(
dev
->
net
);
devdbg
(
dev
,
"ax8817x - Link Status is: %d"
,
link
);
}
usb_submit_urb
(
data
->
int_urb
,
GFP_ATOMIC
);
if
(
urb
->
actual_length
<
8
)
return
;
event
=
urb
->
transfer_buffer
;
link
=
event
->
link
&
0x01
;
if
(
netif_carrier_ok
(
dev
->
net
)
!=
link
)
{
if
(
link
)
{
netif_carrier_on
(
dev
->
net
);
defer_kevent
(
dev
,
EVENT_LINK_RESET
);
}
else
netif_carrier_off
(
dev
->
net
);
devdbg
(
dev
,
"ax8817x - Link Status is: %d"
,
link
);
}
}
...
...
@@ -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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录