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, see <http://www.gnu.org/licenses/>. 17 */ 18 19// #define DEBUG // error path messages, extra info 20// #define VERBOSE // more; success messages 21 22#include <linux/module.h> 23#include <linux/netdevice.h> 24#include <linux/etherdevice.h> 25#include <linux/ethtool.h> 26#include <linux/workqueue.h> 27#include <linux/mii.h> 28#include <linux/usb.h> 29#include <linux/usb/usbnet.h> 30 31 32/* 33 * Prolific PL-2301/PL-2302 driver ... http://www.prolific.com.tw/ 34 * 35 * The protocol and handshaking used here should be bug-compatible 36 * with the Linux 2.2 "plusb" driver, by Deti Fliegl. 37 * 38 * HEADS UP: this handshaking isn't all that robust. This driver 39 * gets confused easily if you unplug one end of the cable then 40 * try to connect it again; you'll need to restart both ends. The 41 * "naplink" software (used by some PlayStation/2 deveopers) does 42 * the handshaking much better! Also, sometimes this hardware 43 * seems to get wedged under load. Prolific docs are weak, and 44 * don't identify differences between PL2301 and PL2302, much less 45 * anything to explain the different PL2302 versions observed. 46 * 47 * NOTE: pl2501 has several modes, including pl2301 and pl2302 48 * compatibility. Some docs suggest the difference between 2301 49 * and 2302 is only to make MS-Windows use a different driver... 50 * 51 * pl25a1 glue based on patch from Tony Gibbs. Prolific "docs" on 52 * this chip are as usual incomplete about what control messages 53 * are supported. 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 69static inline int 70pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index) 71{ 72 return usbnet_read_cmd(dev, req, 73 USB_DIR_IN | USB_TYPE_VENDOR | 74 USB_RECIP_DEVICE, 75 val, index, NULL, 0); 76} 77 78static inline int 79pl_clear_QuickLink_features(struct usbnet *dev, int val) 80{ 81 return pl_vendor_req(dev, 1, (u8) val, 0); 82} 83 84static inline int 85pl_set_QuickLink_features(struct usbnet *dev, int val) 86{ 87 return pl_vendor_req(dev, 3, (u8) val, 0); 88} 89 90static int pl_reset(struct usbnet *dev) 91{ 92 int status; 93 94 /* some units seem to need this reset, others reject it utterly. 95 * FIXME be more like "naplink" or windows drivers. 96 */ 97 status = pl_set_QuickLink_features(dev, 98 PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E); 99 if (status != 0 && netif_msg_probe(dev)) 100 netif_dbg(dev, link, dev->net, "pl_reset --> %d\n", status); 101 return 0; 102} 103 104static const struct driver_info prolific_info = { 105 .description = "Prolific PL-2301/PL-2302/PL-25A1", 106 .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT, 107 /* some PL-2302 versions seem to fail usb_set_interface() */ 108 .reset = pl_reset, 109}; 110 111 112/*-------------------------------------------------------------------------*/ 113 114/* 115 * Proilific's name won't normally be on the cables, and 116 * may not be on the device. 117 */ 118 119static const struct usb_device_id products [] = { 120 121/* full speed cables */ 122{ 123 USB_DEVICE(0x067b, 0x0000), // PL-2301 124 .driver_info = (unsigned long) &prolific_info, 125}, { 126 USB_DEVICE(0x067b, 0x0001), // PL-2302 127 .driver_info = (unsigned long) &prolific_info, 128}, 129 130/* high speed cables */ 131{ 132 USB_DEVICE(0x067b, 0x25a1), /* PL-25A1, no eeprom */ 133 .driver_info = (unsigned long) &prolific_info, 134}, { 135 USB_DEVICE(0x050d, 0x258a), /* Belkin F5U258/F5U279 (PL-25A1) */ 136 .driver_info = (unsigned long) &prolific_info, 137}, 138 139 { }, // END 140}; 141MODULE_DEVICE_TABLE(usb, products); 142 143static struct usb_driver plusb_driver = { 144 .name = "plusb", 145 .id_table = products, 146 .probe = usbnet_probe, 147 .disconnect = usbnet_disconnect, 148 .suspend = usbnet_suspend, 149 .resume = usbnet_resume, 150 .disable_hub_initiated_lpm = 1, 151}; 152 153module_usb_driver(plusb_driver); 154 155MODULE_AUTHOR("David Brownell"); 156MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1 USB Host to Host Link Driver"); 157MODULE_LICENSE("GPL"); 158