Skip site navigation (1)Skip section navigation (2)
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>