summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/bluetooth/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netgraph/bluetooth/drivers')
-rw-r--r--sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c525
-rw-r--r--sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h8
2 files changed, 1 insertions, 532 deletions
diff --git a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
index aca8dc1..a539f52 100644
--- a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
+++ b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
@@ -183,13 +183,6 @@ Static const struct ng_cmdlist ng_ubt_cmdlist[] = {
NULL,
NULL
},
-{
- NGM_UBT_COOKIE,
- NGM_UBT_NODE_DEV_NODES,
- "dev_nodes",
- &ng_parse_uint16_type,
- NULL
-},
{ 0, }
};
@@ -208,36 +201,6 @@ Static struct ng_type typestruct = {
};
/*
- * Device methods
- */
-
-#define UBT_UNIT(n) ((minor(n) >> 4) & 0xf)
-#define UBT_ENDPOINT(n) (minor(n) & 0xf)
-#define UBT_MINOR(u, e) (((u) << 4) | (e))
-#define UBT_BSIZE 1024
-
-Static d_open_t ubt_open;
-Static d_close_t ubt_close;
-Static d_read_t ubt_read;
-Static d_write_t ubt_write;
-Static d_ioctl_t ubt_ioctl;
-Static d_poll_t ubt_poll;
-Static void ubt_create_device_nodes (ubt_softc_p);
-Static void ubt_destroy_device_nodes (ubt_softc_p);
-
-Static struct cdevsw ubt_cdevsw = {
- .d_version = D_VERSION,
- .d_flags = D_NEEDGIANT,
- .d_open = ubt_open,
- .d_close = ubt_close,
- .d_read = ubt_read,
- .d_write = ubt_write,
- .d_ioctl = ubt_ioctl,
- .d_poll = ubt_poll,
- .d_name = "ubt",
-};
-
-/*
* Module
*/
@@ -345,7 +308,7 @@ USB_ATTACH(ubt)
usb_config_descriptor_t *cd = NULL;
usb_interface_descriptor_t *id = NULL;
usb_endpoint_descriptor_t *ed = NULL;
- char devinfo[UBT_BSIZE];
+ char devinfo[1024];
usbd_status error;
int i, ai, alt_no, isoc_in, isoc_out,
isoc_isize, isoc_osize;
@@ -408,10 +371,6 @@ USB_ATTACH(ubt)
sc->sc_node = NULL;
sc->sc_hook = NULL;
- /* Device part */
- sc->sc_ctrl_dev = sc->sc_intr_dev = sc->sc_bulk_dev = NULL;
- sc->sc_refcnt = sc->sc_dying = 0;
-
/*
* XXX set configuration?
*
@@ -804,10 +763,6 @@ USB_DETACH(ubt)
{
USB_DETACH_START(ubt, sc);
- sc->sc_dying = 1;
-
- ubt_destroy_device_nodes(sc); /* XXX FIXME locking? */
-
/* Destroy Netgraph node */
if (sc->sc_node != NULL) {
NG_NODE_SET_PRIVATE(sc->sc_node, NULL);
@@ -1903,11 +1858,6 @@ ng_ubt_newhook(node_p node, hook_p hook, char const *name)
{
ubt_softc_p sc = (ubt_softc_p) NG_NODE_PRIVATE(node);
- /* Refuse to create new hook if device interface is active */
- if (sc->sc_ctrl_dev != NULL || sc->sc_intr_dev != NULL ||
- sc->sc_bulk_dev != NULL)
- return (EBUSY);
-
if (strcmp(name, NG_UBT_HOOK) != 0)
return (EINVAL);
@@ -1929,11 +1879,6 @@ ng_ubt_connect(hook_p hook)
ubt_softc_p sc = (ubt_softc_p) NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
usbd_status status;
- /* Refuse to connect hook if device interface is active */
- if (sc->sc_ctrl_dev != NULL || sc->sc_intr_dev != NULL ||
- sc->sc_bulk_dev != NULL)
- return (EBUSY);
-
NG_HOOK_FORCE_QUEUE(NG_HOOK_PEER(hook));
/* Start intr transfer */
@@ -2160,25 +2105,6 @@ ng_ubt_rcvmsg(node_p node, item_p item, hook_p lasthook)
NG_UBT_STAT_RESET(sc->sc_stat);
break;
- case NGM_UBT_NODE_DEV_NODES:
- if (msg->header.arglen !=
- sizeof(ng_ubt_node_dev_nodes_ep)) {
- error = EMSGSIZE;
- break;
- }
-
- if ((sc->sc_flags & UBT_ANY_DEV) ||
- sc->sc_hook != NULL) {
- error = EBUSY;
- break;
- }
-
- if (*((ng_ubt_node_dev_nodes_ep *)(msg->data)))
- ubt_create_device_nodes(sc);
- else
- ubt_destroy_device_nodes(sc);
- break;
-
default:
error = EINVAL;
break;
@@ -2280,452 +2206,3 @@ done:
return (error);
} /* ng_ubt_rcvdata */
-/****************************************************************************
- ****************************************************************************
- ** Device specific
- ****************************************************************************
- ****************************************************************************/
-
-/*
- * Open endpoint device
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_open(struct cdev *dev, int flag, int mode, usb_proc_ptr p)
-{
- ubt_softc_p sc = NULL;
- int ep = UBT_ENDPOINT(dev);
-
- USB_GET_SC_OPEN(ubt, UBT_UNIT(dev), sc); /* check for sc != NULL */
- if (sc->sc_dying)
- return (ENXIO);
-
- if (ep == USB_CONTROL_ENDPOINT) {
- if (sc->sc_flags & UBT_CTRL_DEV)
- return (EBUSY);
-
- sc->sc_flags |= UBT_CTRL_DEV;
- } else if (ep == UE_GET_ADDR(sc->sc_intr_ep)) {
- if (sc->sc_flags & UBT_INTR_DEV)
- return (EBUSY);
- if (sc->sc_intr_pipe == NULL)
- return (ENXIO);
-
- sc->sc_flags |= UBT_INTR_DEV;
- } else if (ep == UE_GET_ADDR(sc->sc_bulk_in_ep)) {
- if (sc->sc_flags & UBT_BULK_DEV)
- return (EBUSY);
- if (sc->sc_bulk_in_pipe == NULL || sc->sc_bulk_out_pipe == NULL)
- return (ENXIO);
-
- sc->sc_flags |= UBT_BULK_DEV;
- } else
- return (EINVAL);
-
- return (0);
-} /* ubt_open */
-
-/*
- * Close endpoint device
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_close(struct cdev *dev, int flag, int mode, usb_proc_ptr p)
-{
- ubt_softc_p sc = NULL;
- int ep = UBT_ENDPOINT(dev);
-
- USB_GET_SC(ubt, UBT_UNIT(dev), sc);
- if (sc == NULL)
- return (ENXIO);
-
- if (ep == USB_CONTROL_ENDPOINT)
- sc->sc_flags &= ~UBT_CTRL_DEV;
- else if (ep == UE_GET_ADDR(sc->sc_intr_ep)) {
- if (sc->sc_intr_pipe != NULL)
- usbd_abort_pipe(sc->sc_intr_pipe);
-
- sc->sc_flags &= ~UBT_INTR_DEV;
- } else if (ep == UE_GET_ADDR(sc->sc_bulk_in_ep)) {
- /* Close both in and out bulk pipes */
- if (sc->sc_bulk_in_pipe != NULL)
- usbd_abort_pipe(sc->sc_bulk_in_pipe);
-
- if (sc->sc_bulk_out_pipe != NULL)
- usbd_abort_pipe(sc->sc_bulk_out_pipe);
-
- sc->sc_flags &= ~UBT_BULK_DEV;
- } else
- return (EINVAL);
-
- return (0);
-} /* ubt_close */
-
-/*
- * Read from the endpoint device
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_read(struct cdev *dev, struct uio *uio, int flag)
-{
- ubt_softc_p sc = NULL;
- int error = 0, n, tn, ep = UBT_ENDPOINT(dev);
- usbd_status status;
- usbd_pipe_handle pipe = NULL;
- usbd_xfer_handle xfer = NULL;
- u_int8_t buf[UBT_BSIZE];
-
- USB_GET_SC(ubt, UBT_UNIT(dev), sc);
- if (sc == NULL || sc->sc_dying)
- return (ENXIO);
-
- if (ep == USB_CONTROL_ENDPOINT)
- return (EOPNOTSUPP);
-
- if (ep == UE_GET_ADDR(sc->sc_intr_ep)) {
- pipe = sc->sc_intr_pipe;
- xfer = sc->sc_intr_xfer;
- } else if (ep == UE_GET_ADDR(sc->sc_bulk_in_ep)) {
- pipe = sc->sc_bulk_in_pipe;
- xfer = sc->sc_bulk_in_xfer;
- } else
- return (EINVAL);
-
- if (pipe == NULL || xfer == NULL)
- return (ENXIO);
-
- sc->sc_refcnt ++;
-
- while ((n = min(sizeof(buf), uio->uio_resid)) != 0) {
- tn = n;
- status = usbd_bulk_transfer(xfer, pipe, USBD_SHORT_XFER_OK,
- USBD_DEFAULT_TIMEOUT, buf, &tn, "ubtrd");
- switch (status) {
- case USBD_NORMAL_COMPLETION:
- error = uiomove(buf, tn, uio);
- break;
-
- case USBD_INTERRUPTED:
- error = EINTR;
- break;
-
- case USBD_TIMEOUT:
- error = ETIMEDOUT;
- break;
-
- default:
- error = EIO;
- break;
- }
-
- if (error != 0 || tn < n)
- break;
- }
-
- if (-- sc->sc_refcnt < 0)
- usb_detach_wakeup(USBDEV(sc->sc_dev));
-
- return (error);
-} /* ubt_read */
-
-/*
- * Write into the endpoint device
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_write(struct cdev *dev, struct uio *uio, int flag)
-{
- ubt_softc_p sc = NULL;
- int error = 0, n, ep = UBT_ENDPOINT(dev);
- usbd_status status;
- u_int8_t buf[UBT_BSIZE];
-
- USB_GET_SC(ubt, UBT_UNIT(dev), sc);
- if (sc == NULL || sc->sc_dying)
- return (ENXIO);
-
- if (ep == USB_CONTROL_ENDPOINT || ep == UE_GET_ADDR(sc->sc_intr_ep))
- return (EOPNOTSUPP);
- if (ep != UE_GET_ADDR(sc->sc_bulk_in_ep))
- return (EINVAL);
-
- sc->sc_refcnt ++;
-
- while ((n = min(sizeof(buf), uio->uio_resid)) != 0) {
- error = uiomove(buf, n, uio);
- if (error != 0)
- break;
-
- status = usbd_bulk_transfer(sc->sc_bulk_out_xfer,
- sc->sc_bulk_out_pipe, 0, USBD_DEFAULT_TIMEOUT,
- buf, &n,"ubtwr");
- switch (status) {
- case USBD_NORMAL_COMPLETION:
- break;
-
- case USBD_INTERRUPTED:
- error = EINTR;
- break;
-
- case USBD_TIMEOUT:
- error = ETIMEDOUT;
- break;
-
- default:
- error = EIO;
- break;
- }
-
- if (error != 0)
- break;
- }
-
- if (-- sc->sc_refcnt < 0)
- usb_detach_wakeup(USBDEV(sc->sc_dev));
-
- return (error);
-} /* ubt_write */
-
-/*
- * Process ioctl on the endpoint device. Mostly stolen from ugen(4)
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p)
-{
- ubt_softc_p sc = NULL;
- int len, error = 0, ep = UBT_ENDPOINT(dev);
- usbd_status status;
- struct usb_string_desc *si = NULL;
- struct usb_ctl_request *ur = NULL;
- void *ptr = NULL;
- struct iovec iov;
- struct uio uio;
-
- USB_GET_SC(ubt, UBT_UNIT(dev), sc);
- if (sc == NULL || sc->sc_dying)
- return (ENXIO);
-
- if (ep != USB_CONTROL_ENDPOINT)
- return (EOPNOTSUPP);
-
- sc->sc_refcnt ++;
-
- switch (cmd) {
- case USB_GET_DEVICE_DESC:
- *(usb_device_descriptor_t *) data =
- *usbd_get_device_descriptor(sc->sc_udev);
- break;
-
- case USB_GET_STRING_DESC:
- si = (struct usb_string_desc *) data;
- status = usbd_get_string_desc(sc->sc_udev, si->usd_string_index,
- si->usd_language_id, &si->usd_desc, &len);
- if (status != USBD_NORMAL_COMPLETION)
- error = EINVAL;
- break;
-
- case USB_DO_REQUEST:
- ur = (void *) data;
- len = UGETW(ur->ucr_request.wLength);
-
- if (!(flag & FWRITE)) {
- error = EPERM;
- break;
- }
-
- /* Avoid requests that would damage the bus integrity. */
- if ((ur->ucr_request.bmRequestType == UT_WRITE_DEVICE &&
- ur->ucr_request.bRequest == UR_SET_ADDRESS) ||
- (ur->ucr_request.bmRequestType == UT_WRITE_DEVICE &&
- ur->ucr_request.bRequest == UR_SET_CONFIG) ||
- (ur->ucr_request.bmRequestType == UT_WRITE_INTERFACE &&
- ur->ucr_request.bRequest == UR_SET_INTERFACE) ||
- len < 0 || len > 32767) {
- error = EINVAL;
- break;
- }
-
- if (len != 0) {
- iov.iov_base = (caddr_t) ur->ucr_data;
- iov.iov_len = len;
-
- uio.uio_iov = &iov;
- uio.uio_iovcnt = 1;
- uio.uio_resid = len;
- uio.uio_offset = 0;
- uio.uio_segflg = UIO_USERSPACE;
- uio.uio_rw = ur->ucr_request.bmRequestType & UT_READ ?
- UIO_READ : UIO_WRITE;
- uio.uio_procp = p;
-
- ptr = malloc(len, M_TEMP, M_WAITOK);
- if (uio.uio_rw == UIO_WRITE) {
- error = uiomove(ptr, len, &uio);
- if (error != 0)
- goto ret;
- }
- }
-
- status = usbd_do_request_flags(sc->sc_udev, &ur->ucr_request,
- ptr, ur->ucr_flags, &ur->ucr_actlen,
- USBD_DEFAULT_TIMEOUT);
- if (status != USBD_NORMAL_COMPLETION) {
- error = EIO;
- goto ret;
- }
-
- if (len != 0) {
- if (uio.uio_rw == UIO_READ) {
- error = uiomove(ptr, len, &uio);
- if (error != 0)
- goto ret;
- }
- }
-ret:
- if (ptr != NULL)
- free(ptr, M_TEMP);
- break;
-
- case USB_GET_DEVICEINFO:
- usbd_fill_deviceinfo(sc->sc_udev,
- (struct usb_device_info *) data, 1);
- break;
-
- default:
- error = EINVAL;
- break;
- }
-
- if (-- sc->sc_refcnt < 0)
- usb_detach_wakeup(USBDEV(sc->sc_dev));
-
- return (error);
-} /* ubt_ioctl */
-
-/*
- * Poll the endpoint device
- * XXX FIXME softc locking
- */
-
-Static int
-ubt_poll(struct cdev *dev, int events, usb_proc_ptr p)
-{
- ubt_softc_p sc = NULL;
- int revents = 0, ep = UBT_ENDPOINT(dev);
-
- USB_GET_SC(ubt, UBT_UNIT(dev), sc);
- if (sc == NULL || sc->sc_dying)
- return (ENXIO);
-
- if (ep == USB_CONTROL_ENDPOINT)
- return (EOPNOTSUPP);
-
- if (ep == UE_GET_ADDR(sc->sc_intr_ep)) {
- if (sc->sc_intr_pipe != NULL)
- revents |= events & (POLLIN | POLLRDNORM);
- else
- revents = EIO;
- } else if (ep == UE_GET_ADDR(sc->sc_bulk_in_ep)) {
- if (sc->sc_bulk_in_pipe != NULL)
- revents |= events & (POLLIN | POLLRDNORM);
-
- if (sc->sc_bulk_out_pipe != NULL)
- revents |= events & (POLLOUT | POLLWRNORM);
-
- if (revents == 0)
- revents = EIO; /* both pipes closed */
- } else
- revents = EINVAL;
-
- return (revents);
-} /* ubt_poll */
-
-/*
- * Create device nodes for all endpoints. Must be called with node locked.
- */
-
-Static void
-ubt_create_device_nodes(ubt_softc_p sc)
-{
- int ep;
-
- KASSERT((sc->sc_hook == NULL), (
-"%s: %s - hook != NULL!\n", __func__, USBDEVNAME(sc->sc_dev)));
-
- /* Control device */
- if (sc->sc_ctrl_dev == NULL)
- sc->sc_ctrl_dev = make_dev(&ubt_cdevsw,
- UBT_MINOR(USBDEVUNIT(sc->sc_dev), 0),
- UID_ROOT, GID_OPERATOR, 0644,
- "%s", USBDEVNAME(sc->sc_dev));
-
- /* Interrupt device */
- if (sc->sc_intr_dev == NULL && sc->sc_intr_ep != -1) {
- ep = UE_GET_ADDR(sc->sc_intr_ep);
- sc->sc_intr_dev = make_dev(&ubt_cdevsw,
- UBT_MINOR(USBDEVUNIT(sc->sc_dev), ep),
- UID_ROOT, GID_OPERATOR, 0644,
- "%s.%d", USBDEVNAME(sc->sc_dev), ep);
- }
-
- /*
- * Bulk-in and bulk-out device
- * XXX will create one device for both in and out endpoints.
- * XXX note that address of the in and out endpoint should be the same
- */
-
- if (sc->sc_bulk_dev == NULL &&
- sc->sc_bulk_in_ep != -1 && sc->sc_bulk_out_ep != -1 &&
- UE_GET_ADDR(sc->sc_bulk_in_ep) == UE_GET_ADDR(sc->sc_bulk_out_ep)) {
- ep = UE_GET_ADDR(sc->sc_bulk_in_ep);
- sc->sc_bulk_dev = make_dev(&ubt_cdevsw,
- UBT_MINOR(USBDEVUNIT(sc->sc_dev), ep),
- UID_ROOT, GID_OPERATOR, 0644,
- "%s.%d", USBDEVNAME(sc->sc_dev), ep);
- }
-} /* ubt_create_device_nodes */
-
-/*
- * Destroy device nodes for all endpoints
- * XXX FIXME locking
- */
-
-Static void
-ubt_destroy_device_nodes(ubt_softc_p sc)
-{
- /*
- * Wait for processes to go away. This should be safe as we will not
- * call ubt_destroy_device_nodes() from Netgraph unless all devices
- * were closed (and thus no active processes).
- */
-
- if (-- sc->sc_refcnt >= 0) {
- ubt_reset(sc);
- usb_detach_wait(USBDEV(sc->sc_dev));
- }
-
- sc->sc_refcnt = 0;
-
- /* Destroy device nodes */
- if (sc->sc_bulk_dev != NULL) {
- destroy_dev(sc->sc_bulk_dev);
- sc->sc_bulk_dev = NULL;
- }
-
- if (sc->sc_intr_dev != NULL) {
- destroy_dev(sc->sc_intr_dev);
- sc->sc_intr_dev = NULL;
- }
-
- if (sc->sc_ctrl_dev != NULL) {
- destroy_dev(sc->sc_ctrl_dev);
- sc->sc_ctrl_dev = NULL;
- }
-} /* ubt_destroy_device_nodes */
-
diff --git a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h
index fef8189..33dfbae 100644
--- a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h
+++ b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h
@@ -137,14 +137,6 @@ struct ubt_softc {
/* Netgraph specific */
node_p sc_node; /* pointer back to node */
hook_p sc_hook; /* upstream hook */
-
- /* Device specific */
- struct cdev *sc_ctrl_dev; /* control device */
- struct cdev *sc_intr_dev; /* interrupt device */
- struct cdev *sc_bulk_dev; /* bulk device */
-
- int sc_refcnt; /* device ref. count */
- int sc_dying;
};
typedef struct ubt_softc ubt_softc_t;
typedef struct ubt_softc * ubt_softc_p;
OpenPOWER on IntegriCloud