diff options
Diffstat (limited to 'drivers/usb/misc/usbtest.c')
-rw-r--r-- | drivers/usb/misc/usbtest.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 3104f28f6aa8..cda7249a90b2 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -461,7 +461,7 @@ static int perform_sglist ( | |||
461 | 461 | ||
462 | static unsigned realworld = 1; | 462 | static unsigned realworld = 1; |
463 | module_param (realworld, uint, 0); | 463 | module_param (realworld, uint, 0); |
464 | MODULE_PARM_DESC (realworld, "clear to demand stricter ch9 compliance"); | 464 | MODULE_PARM_DESC (realworld, "clear to demand stricter spec compliance"); |
465 | 465 | ||
466 | static int get_altsetting (struct usbtest_dev *dev) | 466 | static int get_altsetting (struct usbtest_dev *dev) |
467 | { | 467 | { |
@@ -604,9 +604,8 @@ static int ch9_postconfig (struct usbtest_dev *dev) | |||
604 | USB_DIR_IN | USB_RECIP_DEVICE, | 604 | USB_DIR_IN | USB_RECIP_DEVICE, |
605 | 0, 0, dev->buf, 1, USB_CTRL_GET_TIMEOUT); | 605 | 0, 0, dev->buf, 1, USB_CTRL_GET_TIMEOUT); |
606 | if (retval != 1 || dev->buf [0] != expected) { | 606 | if (retval != 1 || dev->buf [0] != expected) { |
607 | dev_dbg (&iface->dev, | 607 | dev_dbg (&iface->dev, "get config --> %d %d (1 %d)\n", |
608 | "get config --> %d (%d)\n", retval, | 608 | retval, dev->buf[0], expected); |
609 | expected); | ||
610 | return (retval < 0) ? retval : -EDOM; | 609 | return (retval < 0) ? retval : -EDOM; |
611 | } | 610 | } |
612 | } | 611 | } |
@@ -1243,7 +1242,7 @@ static int ctrl_out (struct usbtest_dev *dev, | |||
1243 | char *what = "?"; | 1242 | char *what = "?"; |
1244 | struct usb_device *udev; | 1243 | struct usb_device *udev; |
1245 | 1244 | ||
1246 | if (length > 0xffff || vary >= length) | 1245 | if (length < 1 || length > 0xffff || vary >= length) |
1247 | return -EINVAL; | 1246 | return -EINVAL; |
1248 | 1247 | ||
1249 | buf = kmalloc(length, SLAB_KERNEL); | 1248 | buf = kmalloc(length, SLAB_KERNEL); |
@@ -1266,6 +1265,11 @@ static int ctrl_out (struct usbtest_dev *dev, | |||
1266 | 0, 0, buf, len, USB_CTRL_SET_TIMEOUT); | 1265 | 0, 0, buf, len, USB_CTRL_SET_TIMEOUT); |
1267 | if (retval != len) { | 1266 | if (retval != len) { |
1268 | what = "write"; | 1267 | what = "write"; |
1268 | if (retval >= 0) { | ||
1269 | INFO(dev, "ctrl_out, wlen %d (expected %d)\n", | ||
1270 | retval, len); | ||
1271 | retval = -EBADMSG; | ||
1272 | } | ||
1269 | break; | 1273 | break; |
1270 | } | 1274 | } |
1271 | 1275 | ||
@@ -1275,6 +1279,11 @@ static int ctrl_out (struct usbtest_dev *dev, | |||
1275 | 0, 0, buf, len, USB_CTRL_GET_TIMEOUT); | 1279 | 0, 0, buf, len, USB_CTRL_GET_TIMEOUT); |
1276 | if (retval != len) { | 1280 | if (retval != len) { |
1277 | what = "read"; | 1281 | what = "read"; |
1282 | if (retval >= 0) { | ||
1283 | INFO(dev, "ctrl_out, rlen %d (expected %d)\n", | ||
1284 | retval, len); | ||
1285 | retval = -EBADMSG; | ||
1286 | } | ||
1278 | break; | 1287 | break; |
1279 | } | 1288 | } |
1280 | 1289 | ||
@@ -1293,8 +1302,13 @@ static int ctrl_out (struct usbtest_dev *dev, | |||
1293 | } | 1302 | } |
1294 | 1303 | ||
1295 | len += vary; | 1304 | len += vary; |
1305 | |||
1306 | /* [real world] the "zero bytes IN" case isn't really used. | ||
1307 | * hardware can easily trip up in this wierd case, since its | ||
1308 | * status stage is IN, not OUT like other ep0in transfers. | ||
1309 | */ | ||
1296 | if (len > length) | 1310 | if (len > length) |
1297 | len = 0; | 1311 | len = realworld ? 1 : 0; |
1298 | } | 1312 | } |
1299 | 1313 | ||
1300 | if (retval < 0) | 1314 | if (retval < 0) |
@@ -1519,6 +1533,11 @@ usbtest_ioctl (struct usb_interface *intf, unsigned int code, void *buf) | |||
1519 | if (down_interruptible (&dev->sem)) | 1533 | if (down_interruptible (&dev->sem)) |
1520 | return -ERESTARTSYS; | 1534 | return -ERESTARTSYS; |
1521 | 1535 | ||
1536 | if (intf->dev.power.power_state != PMSG_ON) { | ||
1537 | up (&dev->sem); | ||
1538 | return -EHOSTUNREACH; | ||
1539 | } | ||
1540 | |||
1522 | /* some devices, like ez-usb default devices, need a non-default | 1541 | /* some devices, like ez-usb default devices, need a non-default |
1523 | * altsetting to have any active endpoints. some tests change | 1542 | * altsetting to have any active endpoints. some tests change |
1524 | * altsettings; force a default so most tests don't need to check. | 1543 | * altsettings; force a default so most tests don't need to check. |
@@ -1762,8 +1781,10 @@ usbtest_ioctl (struct usb_interface *intf, unsigned int code, void *buf) | |||
1762 | case 14: | 1781 | case 14: |
1763 | if (!dev->info->ctrl_out) | 1782 | if (!dev->info->ctrl_out) |
1764 | break; | 1783 | break; |
1765 | dev_dbg (&intf->dev, "TEST 14: %d ep0out, 0..%d vary %d\n", | 1784 | dev_dbg (&intf->dev, "TEST 14: %d ep0out, %d..%d vary %d\n", |
1766 | param->iterations, param->length, param->vary); | 1785 | param->iterations, |
1786 | realworld ? 1 : 0, param->length, | ||
1787 | param->vary); | ||
1767 | retval = ctrl_out (dev, param->iterations, | 1788 | retval = ctrl_out (dev, param->iterations, |
1768 | param->length, param->vary); | 1789 | param->length, param->vary); |
1769 | break; | 1790 | break; |
@@ -1927,6 +1948,27 @@ usbtest_probe (struct usb_interface *intf, const struct usb_device_id *id) | |||
1927 | return 0; | 1948 | return 0; |
1928 | } | 1949 | } |
1929 | 1950 | ||
1951 | static int usbtest_suspend (struct usb_interface *intf, pm_message_t message) | ||
1952 | { | ||
1953 | struct usbtest_dev *dev = usb_get_intfdata (intf); | ||
1954 | |||
1955 | down (&dev->sem); | ||
1956 | intf->dev.power.power_state = PMSG_SUSPEND; | ||
1957 | up (&dev->sem); | ||
1958 | return 0; | ||
1959 | } | ||
1960 | |||
1961 | static int usbtest_resume (struct usb_interface *intf) | ||
1962 | { | ||
1963 | struct usbtest_dev *dev = usb_get_intfdata (intf); | ||
1964 | |||
1965 | down (&dev->sem); | ||
1966 | intf->dev.power.power_state = PMSG_ON; | ||
1967 | up (&dev->sem); | ||
1968 | return 0; | ||
1969 | } | ||
1970 | |||
1971 | |||
1930 | static void usbtest_disconnect (struct usb_interface *intf) | 1972 | static void usbtest_disconnect (struct usb_interface *intf) |
1931 | { | 1973 | { |
1932 | struct usbtest_dev *dev = usb_get_intfdata (intf); | 1974 | struct usbtest_dev *dev = usb_get_intfdata (intf); |
@@ -2115,6 +2157,8 @@ static struct usb_driver usbtest_driver = { | |||
2115 | .probe = usbtest_probe, | 2157 | .probe = usbtest_probe, |
2116 | .ioctl = usbtest_ioctl, | 2158 | .ioctl = usbtest_ioctl, |
2117 | .disconnect = usbtest_disconnect, | 2159 | .disconnect = usbtest_disconnect, |
2160 | .suspend = usbtest_suspend, | ||
2161 | .resume = usbtest_resume, | ||
2118 | }; | 2162 | }; |
2119 | 2163 | ||
2120 | /*-------------------------------------------------------------------------*/ | 2164 | /*-------------------------------------------------------------------------*/ |