14de26129Sxs156463 /* 24de26129Sxs156463 * CDDL HEADER START 34de26129Sxs156463 * 44de26129Sxs156463 * The contents of this file are subject to the terms of the 5*77e51571Sgongtian zhao - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License"). 6*77e51571Sgongtian zhao - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License. 74de26129Sxs156463 * 84de26129Sxs156463 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 94de26129Sxs156463 * or http://www.opensolaris.org/os/licensing. 104de26129Sxs156463 * See the License for the specific language governing permissions 114de26129Sxs156463 * and limitations under the License. 124de26129Sxs156463 * 134de26129Sxs156463 * When distributing Covered Code, include this CDDL HEADER in each 144de26129Sxs156463 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 154de26129Sxs156463 * If applicable, add the following below this CDDL HEADER, with the 164de26129Sxs156463 * fields enclosed by brackets "[]" replaced with your own identifying 174de26129Sxs156463 * information: Portions Copyright [yyyy] [name of copyright owner] 184de26129Sxs156463 * 194de26129Sxs156463 * CDDL HEADER END 204de26129Sxs156463 */ 214de26129Sxs156463 /* 22*77e51571Sgongtian zhao - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 234de26129Sxs156463 * Use is subject to license terms. 244de26129Sxs156463 */ 254de26129Sxs156463 264de26129Sxs156463 274de26129Sxs156463 /* 284de26129Sxs156463 * This driver supports Prolific PL-2303H/HX/X USB-to-serial adapters. It is a 294de26129Sxs156463 * device-specific driver (DSD) working with USB generic serial driver (GSD). It 304de26129Sxs156463 * implements the USB-to-serial device-specific driver interface (DSDI) which is 314de26129Sxs156463 * offered by GSD. The interface is defined by ds_ops_t structure. 324de26129Sxs156463 * 334de26129Sxs156463 * 344de26129Sxs156463 * PL-2303HX and PL-2303X devices have different hardware, but from the 354de26129Sxs156463 * perspective of device driver, they have the same software interface. 364de26129Sxs156463 */ 374de26129Sxs156463 384de26129Sxs156463 /* 394de26129Sxs156463 * 404de26129Sxs156463 * USB Prolific PL2303 driver glue code 414de26129Sxs156463 * 424de26129Sxs156463 */ 434de26129Sxs156463 #include <sys/types.h> 444de26129Sxs156463 #include <sys/param.h> 454de26129Sxs156463 #include <sys/stream.h> 464de26129Sxs156463 #include <sys/conf.h> 474de26129Sxs156463 #include <sys/ddi.h> 484de26129Sxs156463 #include <sys/sunddi.h> 494de26129Sxs156463 504de26129Sxs156463 #include <sys/usb/clients/usbser/usbser.h> 514de26129Sxs156463 #include <sys/usb/clients/usbser/usbsprl/pl2303_var.h> 524de26129Sxs156463 534de26129Sxs156463 544de26129Sxs156463 /* configuration entry points */ 554de26129Sxs156463 static int usbser_pl2303_attach(dev_info_t *, ddi_attach_cmd_t); 564de26129Sxs156463 static int usbser_pl2303_detach(dev_info_t *, ddi_detach_cmd_t); 574de26129Sxs156463 static int usbser_pl2303_getinfo(dev_info_t *, ddi_info_cmd_t, void *, 584de26129Sxs156463 void **); 594de26129Sxs156463 static int usbser_pl2303_open(queue_t *, dev_t *, int, int, cred_t *); 604de26129Sxs156463 static void *usbser_pl2303_statep; /* soft state */ 614de26129Sxs156463 624de26129Sxs156463 extern ds_ops_t ds_ops; /* DSD operations */ 634de26129Sxs156463 644de26129Sxs156463 654de26129Sxs156463 /* 664de26129Sxs156463 * STREAMS structures 674de26129Sxs156463 */ 684de26129Sxs156463 struct module_info usbser_pl2303_modinfo = { 694de26129Sxs156463 0, /* module id */ 704de26129Sxs156463 "usbsprl", /* module name */ 714de26129Sxs156463 USBSER_MIN_PKTSZ, /* min pkt size */ 724de26129Sxs156463 USBSER_MAX_PKTSZ, /* max pkt size */ 734de26129Sxs156463 USBSER_HIWAT, /* hi watermark */ 744de26129Sxs156463 USBSER_LOWAT /* low watermark */ 754de26129Sxs156463 }; 764de26129Sxs156463 774de26129Sxs156463 784de26129Sxs156463 static struct qinit usbser_pl2303_rinit = { 794de26129Sxs156463 putq, 804de26129Sxs156463 usbser_rsrv, 814de26129Sxs156463 usbser_pl2303_open, 824de26129Sxs156463 usbser_close, 834de26129Sxs156463 NULL, 844de26129Sxs156463 &usbser_pl2303_modinfo, 854de26129Sxs156463 NULL 864de26129Sxs156463 }; 874de26129Sxs156463 884de26129Sxs156463 894de26129Sxs156463 static struct qinit usbser_pl2303_winit = { 904de26129Sxs156463 usbser_wput, 914de26129Sxs156463 usbser_wsrv, 924de26129Sxs156463 NULL, 934de26129Sxs156463 NULL, 944de26129Sxs156463 NULL, 954de26129Sxs156463 &usbser_pl2303_modinfo, 964de26129Sxs156463 NULL 974de26129Sxs156463 }; 984de26129Sxs156463 994de26129Sxs156463 1004de26129Sxs156463 struct streamtab usbser_pl2303_str_info = { 1014de26129Sxs156463 &usbser_pl2303_rinit, &usbser_pl2303_winit, NULL, NULL 1024de26129Sxs156463 }; 1034de26129Sxs156463 1044de26129Sxs156463 1054de26129Sxs156463 static struct cb_ops usbser_pl2303_cb_ops = { 1064de26129Sxs156463 nodev, /* cb_open */ 1074de26129Sxs156463 nodev, /* cb_close */ 1084de26129Sxs156463 nodev, /* cb_strategy */ 1094de26129Sxs156463 nodev, /* cb_print */ 1104de26129Sxs156463 nodev, /* cb_dump */ 1114de26129Sxs156463 nodev, /* cb_read */ 1124de26129Sxs156463 nodev, /* cb_write */ 1134de26129Sxs156463 nodev, /* cb_ioctl */ 1144de26129Sxs156463 nodev, /* cb_devmap */ 1154de26129Sxs156463 nodev, /* cb_mmap */ 1164de26129Sxs156463 nodev, /* cb_segmap */ 1174de26129Sxs156463 nochpoll, /* cb_chpoll */ 1184de26129Sxs156463 ddi_prop_op, /* cb_prop_op */ 1194de26129Sxs156463 &usbser_pl2303_str_info, /* cb_stream */ 1204de26129Sxs156463 (int)(D_64BIT | D_NEW | D_MP | D_HOTPLUG) /* cb_flag */ 1214de26129Sxs156463 }; 1224de26129Sxs156463 1234de26129Sxs156463 1244de26129Sxs156463 /* 1254de26129Sxs156463 * auto configuration ops 1264de26129Sxs156463 */ 1274de26129Sxs156463 struct dev_ops usbser_pl2303_ops = { 1284de26129Sxs156463 DEVO_REV, /* devo_rev */ 1294de26129Sxs156463 0, /* devo_refcnt */ 1304de26129Sxs156463 usbser_pl2303_getinfo, /* devo_getinfo */ 1314de26129Sxs156463 nulldev, /* devo_identify */ 1324de26129Sxs156463 nulldev, /* devo_probe */ 1334de26129Sxs156463 usbser_pl2303_attach, /* devo_attach */ 1344de26129Sxs156463 usbser_pl2303_detach, /* devo_detach */ 1354de26129Sxs156463 nodev, /* devo_reset */ 1364de26129Sxs156463 &usbser_pl2303_cb_ops, /* devo_cb_ops */ 1374de26129Sxs156463 (struct bus_ops *)NULL, /* devo_bus_ops */ 1384de26129Sxs156463 usbser_power /* devo_power */ 1394de26129Sxs156463 }; 1404de26129Sxs156463 1414de26129Sxs156463 1424de26129Sxs156463 extern struct mod_ops mod_driverops; 1434de26129Sxs156463 1444de26129Sxs156463 1454de26129Sxs156463 static struct modldrv modldrv = { 1464de26129Sxs156463 &mod_driverops, /* type of module - driver */ 1474de26129Sxs156463 "USB Prolific PL2303 driver 1.1", 1484de26129Sxs156463 &usbser_pl2303_ops, 1494de26129Sxs156463 }; 1504de26129Sxs156463 1514de26129Sxs156463 1524de26129Sxs156463 static struct modlinkage modlinkage = { 1534de26129Sxs156463 MODREV_1, &modldrv, 0 1544de26129Sxs156463 }; 1554de26129Sxs156463 1564de26129Sxs156463 1574de26129Sxs156463 /* 1584de26129Sxs156463 * entry points 1594de26129Sxs156463 * ------------ 1604de26129Sxs156463 * 1614de26129Sxs156463 */ 1624de26129Sxs156463 int 1634de26129Sxs156463 _init(void) 1644de26129Sxs156463 { 1654de26129Sxs156463 int error; 1664de26129Sxs156463 1674de26129Sxs156463 if ((error = mod_install(&modlinkage)) == 0) { 1684de26129Sxs156463 error = ddi_soft_state_init(&usbser_pl2303_statep, 1694de26129Sxs156463 usbser_soft_state_size(), 1); 1704de26129Sxs156463 } 1714de26129Sxs156463 1724de26129Sxs156463 return (error); 1734de26129Sxs156463 } 1744de26129Sxs156463 1754de26129Sxs156463 1764de26129Sxs156463 int 1774de26129Sxs156463 _fini(void) 1784de26129Sxs156463 { 1794de26129Sxs156463 int error; 1804de26129Sxs156463 1814de26129Sxs156463 if ((error = mod_remove(&modlinkage)) == 0) { 1824de26129Sxs156463 ddi_soft_state_fini(&usbser_pl2303_statep); 1834de26129Sxs156463 } 1844de26129Sxs156463 1854de26129Sxs156463 return (error); 1864de26129Sxs156463 } 1874de26129Sxs156463 1884de26129Sxs156463 1894de26129Sxs156463 int 1904de26129Sxs156463 _info(struct modinfo *modinfop) 1914de26129Sxs156463 { 1924de26129Sxs156463 return (mod_info(&modlinkage, modinfop)); 1934de26129Sxs156463 } 1944de26129Sxs156463 1954de26129Sxs156463 1964de26129Sxs156463 int 1974de26129Sxs156463 usbser_pl2303_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 1984de26129Sxs156463 void **result) 1994de26129Sxs156463 { 2004de26129Sxs156463 return (usbser_getinfo(dip, infocmd, arg, result, 2014de26129Sxs156463 usbser_pl2303_statep)); 2024de26129Sxs156463 } 2034de26129Sxs156463 2044de26129Sxs156463 2054de26129Sxs156463 static int 2064de26129Sxs156463 usbser_pl2303_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 2074de26129Sxs156463 { 2084de26129Sxs156463 return (usbser_attach(dip, cmd, usbser_pl2303_statep, &ds_ops)); 2094de26129Sxs156463 } 2104de26129Sxs156463 2114de26129Sxs156463 2124de26129Sxs156463 static int 2134de26129Sxs156463 usbser_pl2303_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 2144de26129Sxs156463 { 2154de26129Sxs156463 return (usbser_detach(dip, cmd, usbser_pl2303_statep)); 2164de26129Sxs156463 } 2174de26129Sxs156463 2184de26129Sxs156463 2194de26129Sxs156463 static int 2204de26129Sxs156463 usbser_pl2303_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr) 2214de26129Sxs156463 { 2224de26129Sxs156463 return (usbser_open(rq, dev, flag, sflag, cr, usbser_pl2303_statep)); 2234de26129Sxs156463 } 224