usbser_pl2303.c revision 903:a9ef93192894
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22/* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#pragma ident "%Z%%M% %I% %E% SMI" 28 29/* 30 * This driver supports Prolific PL-2303H/HX/X USB-to-serial adapters. It is a 31 * device-specific driver (DSD) working with USB generic serial driver (GSD). It 32 * implements the USB-to-serial device-specific driver interface (DSDI) which is 33 * offered by GSD. The interface is defined by ds_ops_t structure. 34 * 35 * 36 * PL-2303HX and PL-2303X devices have different hardware, but from the 37 * perspective of device driver, they have the same software interface. 38 */ 39 40/* 41 * 42 * USB Prolific PL2303 driver glue code 43 * 44 */ 45#include <sys/types.h> 46#include <sys/param.h> 47#include <sys/stream.h> 48#include <sys/conf.h> 49#include <sys/ddi.h> 50#include <sys/sunddi.h> 51 52#include <sys/usb/clients/usbser/usbser.h> 53#include <sys/usb/clients/usbser/usbsprl/pl2303_var.h> 54 55 56/* configuration entry points */ 57static int usbser_pl2303_attach(dev_info_t *, ddi_attach_cmd_t); 58static int usbser_pl2303_detach(dev_info_t *, ddi_detach_cmd_t); 59static int usbser_pl2303_getinfo(dev_info_t *, ddi_info_cmd_t, void *, 60 void **); 61static int usbser_pl2303_open(queue_t *, dev_t *, int, int, cred_t *); 62static void *usbser_pl2303_statep; /* soft state */ 63 64extern ds_ops_t ds_ops; /* DSD operations */ 65 66 67/* 68 * STREAMS structures 69 */ 70struct module_info usbser_pl2303_modinfo = { 71 0, /* module id */ 72 "usbsprl", /* module name */ 73 USBSER_MIN_PKTSZ, /* min pkt size */ 74 USBSER_MAX_PKTSZ, /* max pkt size */ 75 USBSER_HIWAT, /* hi watermark */ 76 USBSER_LOWAT /* low watermark */ 77}; 78 79 80static struct qinit usbser_pl2303_rinit = { 81 putq, 82 usbser_rsrv, 83 usbser_pl2303_open, 84 usbser_close, 85 NULL, 86 &usbser_pl2303_modinfo, 87 NULL 88}; 89 90 91static struct qinit usbser_pl2303_winit = { 92 usbser_wput, 93 usbser_wsrv, 94 NULL, 95 NULL, 96 NULL, 97 &usbser_pl2303_modinfo, 98 NULL 99}; 100 101 102struct streamtab usbser_pl2303_str_info = { 103 &usbser_pl2303_rinit, &usbser_pl2303_winit, NULL, NULL 104}; 105 106 107static struct cb_ops usbser_pl2303_cb_ops = { 108 nodev, /* cb_open */ 109 nodev, /* cb_close */ 110 nodev, /* cb_strategy */ 111 nodev, /* cb_print */ 112 nodev, /* cb_dump */ 113 nodev, /* cb_read */ 114 nodev, /* cb_write */ 115 nodev, /* cb_ioctl */ 116 nodev, /* cb_devmap */ 117 nodev, /* cb_mmap */ 118 nodev, /* cb_segmap */ 119 nochpoll, /* cb_chpoll */ 120 ddi_prop_op, /* cb_prop_op */ 121 &usbser_pl2303_str_info, /* cb_stream */ 122 (int)(D_64BIT | D_NEW | D_MP | D_HOTPLUG) /* cb_flag */ 123}; 124 125 126/* 127 * auto configuration ops 128 */ 129struct dev_ops usbser_pl2303_ops = { 130 DEVO_REV, /* devo_rev */ 131 0, /* devo_refcnt */ 132 usbser_pl2303_getinfo, /* devo_getinfo */ 133 nulldev, /* devo_identify */ 134 nulldev, /* devo_probe */ 135 usbser_pl2303_attach, /* devo_attach */ 136 usbser_pl2303_detach, /* devo_detach */ 137 nodev, /* devo_reset */ 138 &usbser_pl2303_cb_ops, /* devo_cb_ops */ 139 (struct bus_ops *)NULL, /* devo_bus_ops */ 140 usbser_power /* devo_power */ 141}; 142 143 144extern struct mod_ops mod_driverops; 145 146 147static struct modldrv modldrv = { 148 &mod_driverops, /* type of module - driver */ 149 "USB Prolific PL2303 driver 1.1", 150 &usbser_pl2303_ops, 151}; 152 153 154static struct modlinkage modlinkage = { 155 MODREV_1, &modldrv, 0 156}; 157 158 159/* 160 * entry points 161 * ------------ 162 * 163 */ 164int 165_init(void) 166{ 167 int error; 168 169 if ((error = mod_install(&modlinkage)) == 0) { 170 error = ddi_soft_state_init(&usbser_pl2303_statep, 171 usbser_soft_state_size(), 1); 172 } 173 174 return (error); 175} 176 177 178int 179_fini(void) 180{ 181 int error; 182 183 if ((error = mod_remove(&modlinkage)) == 0) { 184 ddi_soft_state_fini(&usbser_pl2303_statep); 185 } 186 187 return (error); 188} 189 190 191int 192_info(struct modinfo *modinfop) 193{ 194 return (mod_info(&modlinkage, modinfop)); 195} 196 197 198int 199usbser_pl2303_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 200 void **result) 201{ 202 return (usbser_getinfo(dip, infocmd, arg, result, 203 usbser_pl2303_statep)); 204} 205 206 207static int 208usbser_pl2303_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 209{ 210 return (usbser_attach(dip, cmd, usbser_pl2303_statep, &ds_ops)); 211} 212 213 214static int 215usbser_pl2303_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 216{ 217 return (usbser_detach(dip, cmd, usbser_pl2303_statep)); 218} 219 220 221static int 222usbser_pl2303_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr) 223{ 224 return (usbser_open(rq, dev, flag, sflag, cr, usbser_pl2303_statep)); 225} 226