Blame view

drivers/net/usb/plusb.c 4.81 KB
090ffa9d0   David Brownell   [PATCH] USB: usbn...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * PL-2301/2302 USB host-to-host link cables
   * Copyright (C) 2000-2005 by David Brownell
   *
   * 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.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
9cb00073d   Jeff Kirsher   usb: Fix FSF addr...
16
   * along with this program; if not, see <http://www.gnu.org/licenses/>.
090ffa9d0   David Brownell   [PATCH] USB: usbn...
17
18
19
20
   */
  
  // #define	DEBUG			// error path messages, extra info
  // #define	VERBOSE			// more; success messages
090ffa9d0   David Brownell   [PATCH] USB: usbn...
21
  #include <linux/module.h>
090ffa9d0   David Brownell   [PATCH] USB: usbn...
22
23
24
25
26
27
  #include <linux/netdevice.h>
  #include <linux/etherdevice.h>
  #include <linux/ethtool.h>
  #include <linux/workqueue.h>
  #include <linux/mii.h>
  #include <linux/usb.h>
3692e94f1   Jussi Kivilinna   Move usbnet.h and...
28
  #include <linux/usb/usbnet.h>
090ffa9d0   David Brownell   [PATCH] USB: usbn...
29
30
31
  
  
  /*
631dd1a88   Justin P. Mattock   Update broken web...
32
   * Prolific PL-2301/PL-2302 driver ... http://www.prolific.com.tw/ 
090ffa9d0   David Brownell   [PATCH] USB: usbn...
33
34
35
36
37
38
39
40
41
42
43
44
   *
   * The protocol and handshaking used here should be bug-compatible
   * with the Linux 2.2 "plusb" driver, by Deti Fliegl.
   *
   * HEADS UP:  this handshaking isn't all that robust.  This driver
   * gets confused easily if you unplug one end of the cable then
   * try to connect it again; you'll need to restart both ends. The
   * "naplink" software (used by some PlayStation/2 deveopers) does
   * the handshaking much better!   Also, sometimes this hardware
   * seems to get wedged under load.  Prolific docs are weak, and
   * don't identify differences between PL2301 and PL2302, much less
   * anything to explain the different PL2302 versions observed.
647da406e   simon   usb: plusb: Add s...
45
46
47
48
49
50
51
52
   *
   * NOTE:  pl2501 has several modes, including pl2301 and pl2302
   * compatibility.   Some docs suggest the difference between 2301
   * and 2302 is only to make MS-Windows use a different driver...
   *
   * pl25a1 glue based on patch from Tony Gibbs.  Prolific "docs" on
   * this chip are as usual incomplete about what control messages
   * are supported.
090ffa9d0   David Brownell   [PATCH] USB: usbn...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
   */
  
  /*
   * Bits 0-4 can be used for software handshaking; they're set from
   * one end, cleared from the other, "read" with the interrupt byte.
   */
  #define	PL_S_EN		(1<<7)		/* (feature only) suspend enable */
  /* reserved bit -- rx ready (6) ? */
  #define	PL_TX_READY	(1<<5)		/* (interrupt only) transmit ready */
  #define	PL_RESET_OUT	(1<<4)		/* reset output pipe */
  #define	PL_RESET_IN	(1<<3)		/* reset input pipe */
  #define	PL_TX_C		(1<<2)		/* transmission complete */
  #define	PL_TX_REQ	(1<<1)		/* transmission received */
  #define	PL_PEER_E	(1<<0)		/* peer exists */
  
  static inline int
  pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index)
  {
7cdd24879   Ming Lei   usbnet: plusb: ap...
71
72
73
74
  	return usbnet_read_cmd(dev, req,
  				USB_DIR_IN | USB_TYPE_VENDOR |
  				USB_RECIP_DEVICE,
  				val, index, NULL, 0);
090ffa9d0   David Brownell   [PATCH] USB: usbn...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  }
  
  static inline int
  pl_clear_QuickLink_features(struct usbnet *dev, int val)
  {
  	return pl_vendor_req(dev, 1, (u8) val, 0);
  }
  
  static inline int
  pl_set_QuickLink_features(struct usbnet *dev, int val)
  {
  	return pl_vendor_req(dev, 3, (u8) val, 0);
  }
  
  static int pl_reset(struct usbnet *dev)
  {
5325e92f3   simon   usb: plusb: Add d...
91
  	int status;
090ffa9d0   David Brownell   [PATCH] USB: usbn...
92
93
94
  	/* some units seem to need this reset, others reject it utterly.
  	 * FIXME be more like "naplink" or windows drivers.
  	 */
5325e92f3   simon   usb: plusb: Add d...
95
  	status = pl_set_QuickLink_features(dev,
090ffa9d0   David Brownell   [PATCH] USB: usbn...
96
  		PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E);
5325e92f3   simon   usb: plusb: Add d...
97
98
99
  	if (status != 0 && netif_msg_probe(dev))
  		netif_dbg(dev, link, dev->net, "pl_reset --> %d
  ", status);
090ffa9d0   David Brownell   [PATCH] USB: usbn...
100
101
102
103
  	return 0;
  }
  
  static const struct driver_info	prolific_info = {
647da406e   simon   usb: plusb: Add s...
104
  	.description =	"Prolific PL-2301/PL-2302/PL-25A1",
c261344d3   Arnd Bergmann   usbnet: use eth%d...
105
  	.flags =	FLAG_POINTTOPOINT | FLAG_NO_SETINT,
090ffa9d0   David Brownell   [PATCH] USB: usbn...
106
107
108
109
110
111
112
113
114
115
116
117
118
  		/* some PL-2302 versions seem to fail usb_set_interface() */
  	.reset =	pl_reset,
  };
  
  
  /*-------------------------------------------------------------------------*/
  
  /*
   * Proilific's name won't normally be on the cables, and
   * may not be on the device.
   */
  
  static const struct usb_device_id	products [] = {
647da406e   simon   usb: plusb: Add s...
119
  /* full speed cables */
090ffa9d0   David Brownell   [PATCH] USB: usbn...
120
121
122
123
124
125
126
  {
  	USB_DEVICE(0x067b, 0x0000),	// PL-2301
  	.driver_info =	(unsigned long) &prolific_info,
  }, {
  	USB_DEVICE(0x067b, 0x0001),	// PL-2302
  	.driver_info =	(unsigned long) &prolific_info,
  },
647da406e   simon   usb: plusb: Add s...
127
128
129
130
131
132
133
134
  /* high speed cables */
  {
  	USB_DEVICE(0x067b, 0x25a1),     /* PL-25A1, no eeprom */
  	.driver_info =  (unsigned long) &prolific_info,
  }, {
  	USB_DEVICE(0x050d, 0x258a),     /* Belkin F5U258/F5U279 (PL-25A1) */
  	.driver_info =  (unsigned long) &prolific_info,
  },
090ffa9d0   David Brownell   [PATCH] USB: usbn...
135
136
137
138
139
  	{ },		// END
  };
  MODULE_DEVICE_TABLE(usb, products);
  
  static struct usb_driver plusb_driver = {
090ffa9d0   David Brownell   [PATCH] USB: usbn...
140
141
142
143
144
145
  	.name =		"plusb",
  	.id_table =	products,
  	.probe =	usbnet_probe,
  	.disconnect =	usbnet_disconnect,
  	.suspend =	usbnet_suspend,
  	.resume =	usbnet_resume,
e1f12eb6b   Sarah Sharp   USB: Disable hub-...
146
  	.disable_hub_initiated_lpm = 1,
090ffa9d0   David Brownell   [PATCH] USB: usbn...
147
  };
d632eb1bf   Greg Kroah-Hartman   USB: convert driv...
148
  module_usb_driver(plusb_driver);
090ffa9d0   David Brownell   [PATCH] USB: usbn...
149
150
  
  MODULE_AUTHOR("David Brownell");
647da406e   simon   usb: plusb: Add s...
151
  MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1 USB Host to Host Link Driver");
090ffa9d0   David Brownell   [PATCH] USB: usbn...
152
  MODULE_LICENSE("GPL");