Date: Thu, 11 Sep 2008 08:05:11 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 149591 for review Message-ID: <200809110805.m8B85BZU091209@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=149591 Change 149591 by hselasky@hselasky_laptop001 on 2008/09/11 08:04:35 The new UGEN ioctls needs to be split in RX and TX part, else all the parameters will not be accessable in case an endpoint is opened for read and write! Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#23 edit .. //depot/projects/usb/src/sys/dev/usb2/include/usb2_ioctl.h#15 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#23 (text+ko) ==== @@ -442,8 +442,8 @@ case USB_ST_SETUP: case USB_ST_TRANSFERRED: /* - * If writing is in stall, just jump to clear stall callback and - * solve the situation. + * If writing is in stall, just jump to clear stall + * callback and solve the situation. */ if (f->flag_stall) { usb2_transfer_start(f->xfer[1]); @@ -1633,99 +1633,227 @@ } static int -ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) +ugen_set_short_xfer(struct usb2_fifo *f, void *addr) +{ + if (f->xfer[0] || f->xfer[1]) { + /* cannot change this during transfer */ + return (EBUSY); + } + if (*(int *)addr) + f->flag_short = 1; + else + f->flag_short = 0; + return (0); +} + +static int +ugen_set_timeout(struct usb2_fifo *f, void *addr) +{ + f->timeout = *(int *)addr; + if (f->timeout > 65535) { + /* limit user input */ + f->timeout = 65535; + } + return (0); +} + +static int +ugen_get_frame_size(struct usb2_fifo *f, void *addr) +{ + if (f->xfer[0]) { + *(int *)addr = f->xfer[0]->max_frame_size; + } else { + return (EINVAL); + } + return (0); +} + +static int +ugen_set_buffer_size(struct usb2_fifo *f, void *addr) +{ + if (f->xfer[0] || f->xfer[1]) { + /* cannot change this during transfer */ + return (EBUSY); + } + if (*(int *)addr < 1024) + f->bufsize = 1024; + else if (*(int *)addr < (256 * 1024)) + f->bufsize = *(int *)addr; + else + f->bufsize = 256 * 1024; + return (0); +} + +static int +ugen_get_buffer_size(struct usb2_fifo *f, void *addr) +{ + *(int *)addr = f->bufsize; + return (0); +} + +static int +ugen_get_iface_desc(struct usb2_fifo *f, + struct usb2_interface_descriptor *idesc) { - union { - struct usb2_interface_descriptor *idesc; - struct usb2_endpoint_descriptor *ed; - struct usb2_alt_interface *ai; - int *pint; - void *addr; - } u; struct usb2_interface *iface; + + iface = usb2_get_iface(f->udev, f->iface_index); + if (iface && iface->idesc) { + *idesc = *(iface->idesc); + } else { + return (EIO); + } + return (0); +} + +static int +ugen_get_endpoint_desc(struct usb2_fifo *f, + struct usb2_endpoint_descriptor *ed) +{ struct usb2_pipe *pipe; + + pipe = f->priv_sc0; + + if (pipe && pipe->edesc) { + *ed = *pipe->edesc; + } else { + return (EINVAL); + } + return (0); +} + +static int +ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) +{ + struct usb2_fifo *f_rx; + struct usb2_fifo *f_tx; int error = 0; - u.addr = addr; + f_rx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_RX]; + f_tx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_TX]; switch (cmd) { - case USB_SET_SHORT_XFER: - if (f->xfer[0] || f->xfer[1]) { - /* cannot change this during transfer */ - error = EBUSY; - break; + case USB_SET_RX_SHORT_XFER: + if (fflags & FREAD) { + error = ugen_set_short_xfer(f_rx, addr); + } else { + error = EINVAL; + } + break; + + case USB_SET_TX_FORCE_SHORT: + if (fflags & FWRITE) { + error = ugen_set_short_xfer(f_tx, addr); + } else { + error = EINVAL; + } + break; + + case USB_SET_RX_TIMEOUT: + if (fflags & FREAD) { + error = ugen_set_timeout(f_rx, addr); + } else { + error = EINVAL; + } + break; + + case USB_SET_TX_TIMEOUT: + if (fflags & FWRITE) { + error = ugen_set_timeout(f_tx, addr); + } else { + error = EINVAL; + } + break; + + case USB_GET_RX_FRAME_SIZE: + if (fflags & FREAD) { + error = ugen_get_frame_size(f_rx, addr); + } else { + error = EINVAL; + } + break; + + case USB_GET_TX_FRAME_SIZE: + if (fflags & FWRITE) { + error = ugen_get_frame_size(f_tx, addr); + } else { + error = EINVAL; } - if (*(int *)addr) - f->flag_short = 1; - else - f->flag_short = 0; break; - case USB_SET_TIMEOUT: - f->timeout = *(int *)addr; - if (f->timeout > 65535) { - /* limit user input */ - f->timeout = 65535; + case USB_SET_RX_BUFFER_SIZE: + if (fflags & FREAD) { + error = ugen_set_buffer_size(f_rx, addr); + } else { + error = EINVAL; } break; - case USB_GET_FRAME_SIZE: - if (f->xfer[0]) { - *(int *)addr = f->xfer[0]->max_frame_size; + case USB_SET_TX_BUFFER_SIZE: + if (fflags & FWRITE) { + error = ugen_set_buffer_size(f_tx, addr); } else { error = EINVAL; } break; - case USB_SET_BUFFER_SIZE: - if (f->xfer[0] || f->xfer[1]) { - /* cannot change this during transfer */ - error = EBUSY; - break; + case USB_GET_RX_BUFFER_SIZE: + if (fflags & FREAD) { + error = ugen_get_buffer_size(f_rx, addr); + } else { + error = EINVAL; } - if (*(int *)addr < 1024) - f->bufsize = 1024; - else if (*(int *)addr < (256 * 1024)) - f->bufsize = *(int *)addr; - else - f->bufsize = 256 * 1024; break; - case USB_GET_BUFFER_SIZE: - *(int *)addr = f->bufsize; + case USB_GET_TX_BUFFER_SIZE: + if (fflags & FWRITE) { + error = ugen_get_buffer_size(f_tx, addr); + } else { + error = EINVAL; + } break; - case USB_GET_INTERFACE_DESC: - iface = usb2_get_iface(f->udev, f->iface_index); - if (iface && iface->idesc) { - *u.idesc = *(iface->idesc); + case USB_GET_RX_INTERFACE_DESC: + if (fflags & FREAD) { + error = ugen_get_iface_desc(f_rx, addr); } else { - error = EIO; - break; + error = EINVAL; } break; - case USB_GET_ENDPOINT_DESC: + case USB_GET_TX_INTERFACE_DESC: + if (fflags & FWRITE) { + error = ugen_get_iface_desc(f_tx, addr); + } else { + error = EINVAL; + } + break; - pipe = f->priv_sc0; + case USB_GET_RX_ENDPOINT_DESC: + if (fflags & FREAD) { + error = ugen_get_endpoint_desc(f_rx, addr); + } else { + error = EINVAL; + } + break; - if (pipe && pipe->edesc) { - *u.ed = *pipe->edesc; + case USB_GET_TX_ENDPOINT_DESC: + if (fflags & FWRITE) { + error = ugen_get_endpoint_desc(f_tx, addr); } else { error = EINVAL; - break; } break; case USB_SET_RX_STALL_FLAG: - if ((fflags & FREAD) && (*u.pint)) { - f->flag_stall = 1; + if ((fflags & FREAD) && (*(int *)addr)) { + f_rx->flag_stall = 1; } break; case USB_SET_TX_STALL_FLAG: - if ((fflags & FWRITE) && (*u.pint)) { - f->flag_stall = 1; + if ((fflags & FWRITE) && (*(int *)addr)) { + f_tx->flag_stall = 1; } break; ==== //depot/projects/usb/src/sys/dev/usb2/include/usb2_ioctl.h#15 (text+ko) ==== @@ -217,17 +217,17 @@ #define USB_SET_ALTINTERFACE _IOWR('U', 103, struct usb2_alt_interface) #define USB_GET_DEVICE_DESC _IOR ('U', 105, struct usb2_device_descriptor) #define USB_GET_CONFIG_DESC _IOR ('U', 106, struct usb2_config_descriptor) -#define USB_GET_INTERFACE_DESC _IOR ('U', 107, struct usb2_interface_descriptor) -#define USB_GET_ENDPOINT_DESC _IOR ('U', 108, struct usb2_endpoint_descriptor) +#define USB_GET_RX_INTERFACE_DESC _IOR ('U', 107, struct usb2_interface_descriptor) +#define USB_GET_RX_ENDPOINT_DESC _IOR ('U', 108, struct usb2_endpoint_descriptor) #define USB_GET_FULL_DESC _IOWR('U', 109, struct usb2_gen_descriptor) #define USB_GET_STRING_DESC _IOWR('U', 110, struct usb2_gen_descriptor) #define USB_DO_REQUEST _IOWR('U', 111, struct usb2_ctl_request) #define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb2_device_info) -#define USB_SET_SHORT_XFER _IOW ('U', 113, int) -#define USB_SET_TIMEOUT _IOW ('U', 114, uint32_t) -#define USB_GET_FRAME_SIZE _IOR ('U', 115, uint32_t) -#define USB_GET_BUFFER_SIZE _IOR ('U', 117, uint32_t) -#define USB_SET_BUFFER_SIZE _IOW ('U', 118, uint32_t) +#define USB_SET_RX_SHORT_XFER _IOW ('U', 113, int) +#define USB_SET_RX_TIMEOUT _IOW ('U', 114, int) +#define USB_GET_RX_FRAME_SIZE _IOR ('U', 115, int) +#define USB_GET_RX_BUFFER_SIZE _IOR ('U', 117, int) +#define USB_SET_RX_BUFFER_SIZE _IOW ('U', 118, int) #define USB_SET_RX_STALL_FLAG _IOW ('U', 119, int) #define USB_SET_TX_STALL_FLAG _IOW ('U', 120, int) #define USB_GET_DEVICENAMES _IOW ('U', 121, struct usb2_device_names) @@ -245,6 +245,13 @@ #define USB_GET_BUS_PERM _IOW ('U', 133, struct usb2_dev_perm) #define USB_GET_DEVICE_PERM _IOW ('U', 134, struct usb2_dev_perm) #define USB_GET_IFACE_PERM _IOW ('U', 135, struct usb2_dev_perm) +#define USB_SET_TX_FORCE_SHORT _IOW ('U', 136, int) +#define USB_SET_TX_TIMEOUT _IOW ('U', 137, int) +#define USB_GET_TX_FRAME_SIZE _IOR ('U', 138, int) +#define USB_GET_TX_BUFFER_SIZE _IOR ('U', 139, int) +#define USB_SET_TX_BUFFER_SIZE _IOW ('U', 140, int) +#define USB_GET_TX_INTERFACE_DESC _IOR ('U', 141, struct usb2_interface_descriptor) +#define USB_GET_TX_ENDPOINT_DESC _IOR ('U', 142, struct usb2_endpoint_descriptor) /* Modem device */ #define USB_GET_CM_OVER_DATA _IOR ('U', 160, int)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809110805.m8B85BZU091209>