#include <sys/types.h>
#include <sys/param.h>
#include <sys/stream.h>
#include <sys/conf.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/usb/clients/usbser/usbser.h>
#include <sys/usb/clients/usbser/usbsprl/pl2303_var.h>
static int usbser_pl2303_attach(dev_info_t *, ddi_attach_cmd_t);
static int usbser_pl2303_detach(dev_info_t *, ddi_detach_cmd_t);
static int usbser_pl2303_getinfo(dev_info_t *, ddi_info_cmd_t, void *,
void **);
static int usbser_pl2303_open(queue_t *, dev_t *, int, int, cred_t *);
static void *usbser_pl2303_statep;
extern ds_ops_t pl2303_ds_ops;
struct module_info usbser_pl2303_modinfo = {
0,
"usbsprl",
USBSER_MIN_PKTSZ,
USBSER_MAX_PKTSZ,
USBSER_HIWAT,
USBSER_LOWAT
};
static struct qinit usbser_pl2303_rinit = {
putq,
usbser_rsrv,
usbser_pl2303_open,
usbser_close,
NULL,
&usbser_pl2303_modinfo,
NULL
};
static struct qinit usbser_pl2303_winit = {
usbser_wput,
usbser_wsrv,
NULL,
NULL,
NULL,
&usbser_pl2303_modinfo,
NULL
};
struct streamtab usbser_pl2303_str_info = {
&usbser_pl2303_rinit, &usbser_pl2303_winit, NULL, NULL
};
static struct cb_ops usbser_pl2303_cb_ops = {
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nochpoll,
ddi_prop_op,
&usbser_pl2303_str_info,
(int)(D_64BIT | D_NEW | D_MP | D_HOTPLUG)
};
struct dev_ops usbser_pl2303_ops = {
DEVO_REV,
0,
usbser_pl2303_getinfo,
nulldev,
nulldev,
usbser_pl2303_attach,
usbser_pl2303_detach,
nodev,
&usbser_pl2303_cb_ops,
(struct bus_ops *)NULL,
usbser_power,
ddi_quiesce_not_needed,
};
extern struct mod_ops mod_driverops;
static struct modldrv modldrv = {
&mod_driverops,
"USB Prolific PL2303 driver",
&usbser_pl2303_ops,
};
static struct modlinkage modlinkage = {
MODREV_1, &modldrv, 0
};
int
_init(void)
{
int error;
if ((error = mod_install(&modlinkage)) == 0) {
error = ddi_soft_state_init(&usbser_pl2303_statep,
usbser_soft_state_size(), 1);
}
return (error);
}
int
_fini(void)
{
int error;
if ((error = mod_remove(&modlinkage)) == 0) {
ddi_soft_state_fini(&usbser_pl2303_statep);
}
return (error);
}
int
_info(struct modinfo *modinfop)
{
return (mod_info(&modlinkage, modinfop));
}
int
usbser_pl2303_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
void **result)
{
return (usbser_getinfo(dip, infocmd, arg, result,
usbser_pl2303_statep));
}
static int
usbser_pl2303_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
return (usbser_attach(dip, cmd, usbser_pl2303_statep, &pl2303_ds_ops));
}
static int
usbser_pl2303_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
return (usbser_detach(dip, cmd, usbser_pl2303_statep));
}
static int
usbser_pl2303_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr)
{
return (usbser_open(rq, dev, flag, sflag, cr, usbser_pl2303_statep));
}