#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/usbftdi/uftdi_var.h>
static void *usbser_uftdi_statep;
extern ds_ops_t uftdi_ds_ops;
static int
usbser_uftdi_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
void **result)
{
return (usbser_getinfo(dip, infocmd, arg, result, usbser_uftdi_statep));
}
static int
usbser_uftdi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
return (usbser_attach(dip, cmd, usbser_uftdi_statep, &uftdi_ds_ops));
}
static int
usbser_uftdi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
return (usbser_detach(dip, cmd, usbser_uftdi_statep));
}
static int
usbser_uftdi_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr)
{
return (usbser_open(rq, dev, flag, sflag, cr, usbser_uftdi_statep));
}
struct module_info uftdi_modinfo = {
0,
"uftdi",
USBSER_MIN_PKTSZ,
USBSER_MAX_PKTSZ,
USBSER_HIWAT,
USBSER_LOWAT
};
static struct qinit uftdi_rinit = {
putq,
usbser_rsrv,
usbser_uftdi_open,
usbser_close,
NULL,
&uftdi_modinfo,
};
static struct qinit uftdi_winit = {
usbser_wput,
usbser_wsrv,
NULL,
NULL,
NULL,
&uftdi_modinfo,
};
static struct streamtab uftdi_str_info = {
&uftdi_rinit,
&uftdi_winit,
};
static struct cb_ops uftdi_cb_ops = {
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nodev,
nochpoll,
ddi_prop_op,
&uftdi_str_info,
(int)(D_64BIT | D_NEW | D_MP | D_HOTPLUG)
};
static struct dev_ops uftdi_ops = {
DEVO_REV,
0,
usbser_uftdi_getinfo,
nulldev,
nulldev,
usbser_uftdi_attach,
usbser_uftdi_detach,
nodev,
&uftdi_cb_ops,
(struct bus_ops *)NULL,
usbser_power,
ddi_quiesce_not_needed
};
static struct modldrv modldrv = {
&mod_driverops,
"FTDI FT232R USB UART driver",
&uftdi_ops,
};
static struct modlinkage modlinkage = {
MODREV_1,
&modldrv
};
int
_init(void)
{
int error;
if ((error = mod_install(&modlinkage)) != 0)
return (error);
if ((error = ddi_soft_state_init(&usbser_uftdi_statep,
usbser_soft_state_size(), 1)) != 0)
(void) mod_remove(&modlinkage);
return (error);
}
int
_fini(void)
{
int error;
if ((error = mod_remove(&modlinkage)) == 0)
ddi_soft_state_fini(&usbser_uftdi_statep);
return (error);
}
int
_info(struct modinfo *modinfop)
{
return (mod_info(&modlinkage, modinfop));
}