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 69 static inline int 70 pl_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 78 static inline int 79 pl_clear_QuickLink_features(struct usbnet *dev, int val) 80 { 81 return pl_vendor_req(dev, 1, (u8) val, 0); 82 } 83 84 static inline int 85 pl_set_QuickLink_features(struct usbnet *dev, int val) 86 { 87 return pl_vendor_req(dev, 3, (u8) val, 0); 88 } 89 90 static 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 104 static 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 119 static 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 }; 141 MODULE_DEVICE_TABLE(usb, products); 142 143 static 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 153 module_usb_driver(plusb_driver); 154 155 MODULE_AUTHOR("David Brownell"); 156 MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1 USB Host to Host Link Driver"); 157 MODULE_LICENSE("GPL"); 158