Skip to content

Commit 090ffa9

Browse files
David Brownellgregkh
authored andcommitted
[PATCH] USB: usbnet (9/9) module for pl2301/2302 cables
This wraps up the conversion of the "usbnet" driver structure, by moving the Prolific PL-2201/2302 minidriver to a module of its own. It also includes some minor cleanups to the remaining "usbnet" file, notably removing that long changelog at the top. Minor historical note: Linux 2.2 first called the driver for this hardware "plusb". Signed-off-by: David Brownell <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 64e0491 commit 090ffa9

File tree

4 files changed

+179
-217
lines changed

4 files changed

+179
-217
lines changed

drivers/usb/net/Kconfig

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ config USB_USBNET
9999
with "minidrivers" built around a common network driver core
100100
that supports deep queues for efficient transfers. (This gives
101101
better performance with small packets and at high speeds).
102-
102+
103103
The USB host runs "usbnet", and the other end of the link might be:
104104

105105
- Another USB host, when using USB "network" or "data transfer"
@@ -125,20 +125,6 @@ config USB_USBNET
125125
To compile this driver as a module, choose M here: the
126126
module will be called usbnet.
127127

128-
comment "USB Host-to-Host Cables"
129-
depends on USB_USBNET
130-
131-
config USB_PL2301
132-
boolean "Prolific PL-2301/2302 based cables"
133-
default y
134-
# handshake/init/reset problems, from original 'plusb' driver
135-
depends on USB_USBNET && EXPERIMENTAL
136-
help
137-
Choose this option if you're using a host-to-host cable
138-
with one of these chips.
139-
140-
comment "Drivers built using the usbnet core"
141-
142128
config USB_NET_AX8817X
143129
tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters"
144130
depends on USB_USBNET && NET_ETHERNET
@@ -212,6 +198,15 @@ config USB_NET_NET1080
212198
on this design: one NetChip 1080 chip and supporting logic,
213199
optionally with LEDs that indicate traffic
214200

201+
config USB_NET_PLUSB
202+
tristate "Prolific PL-2301/2302 based cables"
203+
# if the handshake/init/reset problems, from original 'plusb',
204+
# are ever resolved ... then remove "experimental"
205+
depends on USB_USBNET && EXPERIMENTAL
206+
help
207+
Choose this option if you're using a host-to-host cable
208+
with one of these chips.
209+
215210
config USB_NET_RNDIS_HOST
216211
tristate "Host for RNDIS devices (EXPERIMENTAL)"
217212
depends on USB_USBNET && EXPERIMENTAL

drivers/usb/net/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ obj-$(CONFIG_USB_NET_AX8817X) += asix.o
1010
obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
1111
obj-$(CONFIG_USB_NET_GL620A) += gl620a.o
1212
obj-$(CONFIG_USB_NET_NET1080) += net1080.o
13+
obj-$(CONFIG_USB_NET_PLUSB) += plusb.o
1314
obj-$(CONFIG_USB_NET_RNDIS_HOST) += rndis_host.o
1415
obj-$(CONFIG_USB_NET_CDC_SUBSET) += cdc_subset.o
1516
obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o

drivers/usb/net/plusb.c

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/*
2+
* PL-2301/2302 USB host-to-host link cables
3+
* Copyright (C) 2000-2005 by David Brownell
4+
*
5+
* This program is free software; you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation; either version 2 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program; if not, write to the Free Software
17+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18+
*/
19+
20+
// #define DEBUG // error path messages, extra info
21+
// #define VERBOSE // more; success messages
22+
23+
#include <linux/config.h>
24+
#ifdef CONFIG_USB_DEBUG
25+
# define DEBUG
26+
#endif
27+
#include <linux/module.h>
28+
#include <linux/sched.h>
29+
#include <linux/init.h>
30+
#include <linux/netdevice.h>
31+
#include <linux/etherdevice.h>
32+
#include <linux/ethtool.h>
33+
#include <linux/workqueue.h>
34+
#include <linux/mii.h>
35+
#include <linux/usb.h>
36+
37+
#include "usbnet.h"
38+
39+
40+
/*
41+
* Prolific PL-2301/PL-2302 driver ... http://www.prolifictech.com
42+
*
43+
* The protocol and handshaking used here should be bug-compatible
44+
* with the Linux 2.2 "plusb" driver, by Deti Fliegl.
45+
*
46+
* HEADS UP: this handshaking isn't all that robust. This driver
47+
* gets confused easily if you unplug one end of the cable then
48+
* try to connect it again; you'll need to restart both ends. The
49+
* "naplink" software (used by some PlayStation/2 deveopers) does
50+
* the handshaking much better! Also, sometimes this hardware
51+
* seems to get wedged under load. Prolific docs are weak, and
52+
* don't identify differences between PL2301 and PL2302, much less
53+
* anything to explain the different PL2302 versions observed.
54+
*/
55+
56+
/*
57+
* Bits 0-4 can be used for software handshaking; they're set from
58+
* one end, cleared from the other, "read" with the interrupt byte.
59+
*/
60+
#define PL_S_EN (1<<7) /* (feature only) suspend enable */
61+
/* reserved bit -- rx ready (6) ? */
62+
#define PL_TX_READY (1<<5) /* (interrupt only) transmit ready */
63+
#define PL_RESET_OUT (1<<4) /* reset output pipe */
64+
#define PL_RESET_IN (1<<3) /* reset input pipe */
65+
#define PL_TX_C (1<<2) /* transmission complete */
66+
#define PL_TX_REQ (1<<1) /* transmission received */
67+
#define PL_PEER_E (1<<0) /* peer exists */
68+
69+
static inline int
70+
pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index)
71+
{
72+
return usb_control_msg(dev->udev,
73+
usb_rcvctrlpipe(dev->udev, 0),
74+
req,
75+
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
76+
val, index,
77+
NULL, 0,
78+
USB_CTRL_GET_TIMEOUT);
79+
}
80+
81+
static inline int
82+
pl_clear_QuickLink_features(struct usbnet *dev, int val)
83+
{
84+
return pl_vendor_req(dev, 1, (u8) val, 0);
85+
}
86+
87+
static inline int
88+
pl_set_QuickLink_features(struct usbnet *dev, int val)
89+
{
90+
return pl_vendor_req(dev, 3, (u8) val, 0);
91+
}
92+
93+
static int pl_reset(struct usbnet *dev)
94+
{
95+
/* some units seem to need this reset, others reject it utterly.
96+
* FIXME be more like "naplink" or windows drivers.
97+
*/
98+
(void) pl_set_QuickLink_features(dev,
99+
PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E);
100+
return 0;
101+
}
102+
103+
static const struct driver_info prolific_info = {
104+
.description = "Prolific PL-2301/PL-2302",
105+
.flags = FLAG_NO_SETINT,
106+
/* some PL-2302 versions seem to fail usb_set_interface() */
107+
.reset = pl_reset,
108+
};
109+
110+
111+
/*-------------------------------------------------------------------------*/
112+
113+
/*
114+
* Proilific's name won't normally be on the cables, and
115+
* may not be on the device.
116+
*/
117+
118+
static const struct usb_device_id products [] = {
119+
120+
{
121+
USB_DEVICE(0x067b, 0x0000), // PL-2301
122+
.driver_info = (unsigned long) &prolific_info,
123+
}, {
124+
USB_DEVICE(0x067b, 0x0001), // PL-2302
125+
.driver_info = (unsigned long) &prolific_info,
126+
},
127+
128+
{ }, // END
129+
};
130+
MODULE_DEVICE_TABLE(usb, products);
131+
132+
static struct usb_driver plusb_driver = {
133+
.owner = THIS_MODULE,
134+
.name = "plusb",
135+
.id_table = products,
136+
.probe = usbnet_probe,
137+
.disconnect = usbnet_disconnect,
138+
.suspend = usbnet_suspend,
139+
.resume = usbnet_resume,
140+
};
141+
142+
static int __init plusb_init(void)
143+
{
144+
return usb_register(&plusb_driver);
145+
}
146+
module_init(plusb_init);
147+
148+
static void __exit plusb_exit(void)
149+
{
150+
usb_deregister(&plusb_driver);
151+
}
152+
module_exit(plusb_exit);
153+
154+
MODULE_AUTHOR("David Brownell");
155+
MODULE_DESCRIPTION("Prolific PL-2301/2302 USB Host to Host Link Driver");
156+
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)