vserver 2.0 rc7
[linux-2.6.git] / drivers / usb / gadget / zero.c
index b128bc8..6e49432 100644 (file)
@@ -919,6 +919,9 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
        struct zero_dev         *dev = get_gadget_data (gadget);
        struct usb_request      *req = dev->req;
        int                     value = -EOPNOTSUPP;
+       u16                     w_index = ctrl->wIndex;
+       u16                     w_value = ctrl->wValue;
+       u16                     w_length = ctrl->wLength;
 
        /* usually this stores reply data in the pre-allocated ep0 buffer,
         * but config change events will reconfigure hardware.
@@ -929,17 +932,17 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
        case USB_REQ_GET_DESCRIPTOR:
                if (ctrl->bRequestType != USB_DIR_IN)
                        goto unknown;
-               switch (ctrl->wValue >> 8) {
+               switch (w_value >> 8) {
 
                case USB_DT_DEVICE:
-                       value = min (ctrl->wLength, (u16) sizeof device_desc);
+                       value = min (w_length, (u16) sizeof device_desc);
                        memcpy (req->buf, &device_desc, value);
                        break;
 #ifdef CONFIG_USB_GADGET_DUALSPEED
                case USB_DT_DEVICE_QUALIFIER:
                        if (!gadget->is_dualspeed)
                                break;
-                       value = min (ctrl->wLength, (u16) sizeof dev_qualifier);
+                       value = min (w_length, (u16) sizeof dev_qualifier);
                        memcpy (req->buf, &dev_qualifier, value);
                        break;
 
@@ -950,10 +953,10 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
 #endif /* CONFIG_USB_GADGET_DUALSPEED */
                case USB_DT_CONFIG:
                        value = config_buf (gadget, req->buf,
-                                       ctrl->wValue >> 8,
-                                       ctrl->wValue & 0xff);
+                                       w_value >> 8,
+                                       w_value & 0xff);
                        if (value >= 0)
-                               value = min (ctrl->wLength, (u16) value);
+                               value = min (w_length, (u16) value);
                        break;
 
                case USB_DT_STRING:
@@ -963,9 +966,9 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                         * any UTF-8 characters
                         */
                        value = usb_gadget_get_string (&stringtab,
-                                       ctrl->wValue & 0xff, req->buf);
+                                       w_value & 0xff, req->buf);
                        if (value >= 0)
-                               value = min (ctrl->wLength, (u16) value);
+                               value = min (w_length, (u16) value);
                        break;
                }
                break;
@@ -981,14 +984,14 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                else
                        VDBG (dev, "HNP inactive\n");
                spin_lock (&dev->lock);
-               value = zero_set_config (dev, ctrl->wValue, GFP_ATOMIC);
+               value = zero_set_config (dev, w_value, GFP_ATOMIC);
                spin_unlock (&dev->lock);
                break;
        case USB_REQ_GET_CONFIGURATION:
                if (ctrl->bRequestType != USB_DIR_IN)
                        goto unknown;
                *(u8 *)req->buf = dev->config;
-               value = min (ctrl->wLength, (u16) 1);
+               value = min (w_length, (u16) 1);
                break;
 
        /* until we add altsetting support, or other interfaces,
@@ -999,7 +1002,7 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                if (ctrl->bRequestType != USB_RECIP_INTERFACE)
                        goto unknown;
                spin_lock (&dev->lock);
-               if (dev->config && ctrl->wIndex == 0 && ctrl->wValue == 0) {
+               if (dev->config && w_index == 0 && w_value == 0) {
                        u8              config = dev->config;
 
                        /* resets interface configuration, forgets about
@@ -1020,12 +1023,12 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                        goto unknown;
                if (!dev->config)
                        break;
-               if (ctrl->wIndex != 0) {
+               if (w_index != 0) {
                        value = -EDOM;
                        break;
                }
                *(u8 *)req->buf = 0;
-               value = min (ctrl->wLength, (u16) 1);
+               value = min (w_length, (u16) 1);
                break;
 
        /*
@@ -1036,23 +1039,23 @@ zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
        case 0x5b:      /* control WRITE test -- fill the buffer */
                if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR))
                        goto unknown;
-               if (ctrl->wValue || ctrl->wIndex)
+               if (w_value || w_index)
                        break;
                /* just read that many bytes into the buffer */
-               if (ctrl->wLength > USB_BUFSIZ)
+               if (w_length > USB_BUFSIZ)
                        break;
-               value = ctrl->wLength;
+               value = w_length;
                break;
        case 0x5c:      /* control READ test -- return the buffer */
                if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR))
                        goto unknown;
-               if (ctrl->wValue || ctrl->wIndex)
+               if (w_value || w_index)
                        break;
                /* expect those bytes are still in the buffer; send back */
-               if (ctrl->wLength > USB_BUFSIZ
-                               || ctrl->wLength != req->length)
+               if (w_length > USB_BUFSIZ
+                               || w_length != req->length)
                        break;
-               value = ctrl->wLength;
+               value = w_length;
                break;
 
        default:
@@ -1060,14 +1063,13 @@ unknown:
                VDBG (dev,
                        "unknown control req%02x.%02x v%04x i%04x l%d\n",
                        ctrl->bRequestType, ctrl->bRequest,
-                       ctrl->wValue, ctrl->wIndex, ctrl->wLength);
+                       w_value, w_index, w_length);
        }
 
        /* respond with data transfer before status phase? */
        if (value >= 0) {
                req->length = value;
-               req->zero = value < ctrl->wLength
-                               && (value % gadget->ep0->maxpacket) == 0;
+               req->zero = value < w_length;
                value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC);
                if (value < 0) {
                        DBG (dev, "ep_queue --> %d\n", value);
@@ -1191,6 +1193,10 @@ autoconf_fail:
                device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210);
        } else if (gadget_is_pxa27x(gadget)) {
                device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211);
+       } else if (gadget_is_s3c2410(gadget)) {
+               device_desc.bcdDevice = __constant_cpu_to_le16 (0x0212);
+       } else if (gadget_is_at91(gadget)) {
+               device_desc.bcdDevice = __constant_cpu_to_le16 (0x0213);
        } else {
                /* gadget zero is so simple (for now, no altsettings) that
                 * it SHOULD NOT have problems with bulk-capable hardware.