aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class/usbtmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/class/usbtmc.c')
-rw-r--r--drivers/usb/class/usbtmc.c59
1 files changed, 23 insertions, 36 deletions
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index 2473cf0c6b1d..3e7c1b800ebb 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -1,5 +1,5 @@
1/** 1/**
2 * drivers/usb/class/usbtmc.c - USB Test & Measurment class driver 2 * drivers/usb/class/usbtmc.c - USB Test & Measurement class driver
3 * 3 *
4 * Copyright (C) 2007 Stefan Kopp, Gechingen, Germany 4 * Copyright (C) 2007 Stefan Kopp, Gechingen, Germany
5 * Copyright (C) 2008 Novell, Inc. 5 * Copyright (C) 2008 Novell, Inc.
@@ -25,6 +25,7 @@
25#include <linux/fs.h> 25#include <linux/fs.h>
26#include <linux/uaccess.h> 26#include <linux/uaccess.h>
27#include <linux/kref.h> 27#include <linux/kref.h>
28#include <linux/slab.h>
28#include <linux/mutex.h> 29#include <linux/mutex.h>
29#include <linux/usb.h> 30#include <linux/usb.h>
30#include <linux/usb/tmc.h> 31#include <linux/usb/tmc.h>
@@ -48,7 +49,7 @@
48 */ 49 */
49#define USBTMC_MAX_READS_TO_CLEAR_BULK_IN 100 50#define USBTMC_MAX_READS_TO_CLEAR_BULK_IN 100
50 51
51static struct usb_device_id usbtmc_devices[] = { 52static const struct usb_device_id usbtmc_devices[] = {
52 { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), }, 53 { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), },
53 { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 1), }, 54 { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 1), },
54 { 0, } /* terminating entry */ 55 { 0, } /* terminating entry */
@@ -347,13 +348,8 @@ usbtmc_abort_bulk_out_check_status:
347 goto exit; 348 goto exit;
348 349
349usbtmc_abort_bulk_out_clear_halt: 350usbtmc_abort_bulk_out_clear_halt:
350 rv = usb_control_msg(data->usb_dev, 351 rv = usb_clear_halt(data->usb_dev,
351 usb_sndctrlpipe(data->usb_dev, 0), 352 usb_sndbulkpipe(data->usb_dev, data->bulk_out));
352 USB_REQ_CLEAR_FEATURE,
353 USB_DIR_OUT | USB_TYPE_STANDARD |
354 USB_RECIP_ENDPOINT,
355 USB_ENDPOINT_HALT, data->bulk_out, buffer,
356 0, USBTMC_TIMEOUT);
357 353
358 if (rv < 0) { 354 if (rv < 0) {
359 dev_err(dev, "usb_control_msg returned %d\n", rv); 355 dev_err(dev, "usb_control_msg returned %d\n", rv);
@@ -562,10 +558,16 @@ static ssize_t usbtmc_write(struct file *filp, const char __user *buf,
562 n_bytes = roundup(12 + this_part, 4); 558 n_bytes = roundup(12 + this_part, 4);
563 memset(buffer + 12 + this_part, 0, n_bytes - (12 + this_part)); 559 memset(buffer + 12 + this_part, 0, n_bytes - (12 + this_part));
564 560
565 retval = usb_bulk_msg(data->usb_dev, 561 do {
566 usb_sndbulkpipe(data->usb_dev, 562 retval = usb_bulk_msg(data->usb_dev,
567 data->bulk_out), 563 usb_sndbulkpipe(data->usb_dev,
568 buffer, n_bytes, &actual, USBTMC_TIMEOUT); 564 data->bulk_out),
565 buffer, n_bytes,
566 &actual, USBTMC_TIMEOUT);
567 if (retval != 0)
568 break;
569 n_bytes -= actual;
570 } while (n_bytes);
569 571
570 data->bTag_last_write = data->bTag; 572 data->bTag_last_write = data->bTag;
571 data->bTag++; 573 data->bTag++;
@@ -702,14 +704,8 @@ usbtmc_clear_check_status:
702 704
703usbtmc_clear_bulk_out_halt: 705usbtmc_clear_bulk_out_halt:
704 706
705 rv = usb_control_msg(data->usb_dev, 707 rv = usb_clear_halt(data->usb_dev,
706 usb_sndctrlpipe(data->usb_dev, 0), 708 usb_sndbulkpipe(data->usb_dev, data->bulk_out));
707 USB_REQ_CLEAR_FEATURE,
708 USB_DIR_OUT | USB_TYPE_STANDARD |
709 USB_RECIP_ENDPOINT,
710 USB_ENDPOINT_HALT,
711 data->bulk_out, buffer, 0,
712 USBTMC_TIMEOUT);
713 if (rv < 0) { 709 if (rv < 0) {
714 dev_err(dev, "usb_control_msg returned %d\n", rv); 710 dev_err(dev, "usb_control_msg returned %d\n", rv);
715 goto exit; 711 goto exit;
@@ -730,13 +726,8 @@ static int usbtmc_ioctl_clear_out_halt(struct usbtmc_device_data *data)
730 if (!buffer) 726 if (!buffer)
731 return -ENOMEM; 727 return -ENOMEM;
732 728
733 rv = usb_control_msg(data->usb_dev, 729 rv = usb_clear_halt(data->usb_dev,
734 usb_sndctrlpipe(data->usb_dev, 0), 730 usb_sndbulkpipe(data->usb_dev, data->bulk_out));
735 USB_REQ_CLEAR_FEATURE,
736 USB_DIR_OUT | USB_TYPE_STANDARD |
737 USB_RECIP_ENDPOINT,
738 USB_ENDPOINT_HALT, data->bulk_out,
739 buffer, 0, USBTMC_TIMEOUT);
740 731
741 if (rv < 0) { 732 if (rv < 0) {
742 dev_err(&data->usb_dev->dev, "usb_control_msg returned %d\n", 733 dev_err(&data->usb_dev->dev, "usb_control_msg returned %d\n",
@@ -759,12 +750,8 @@ static int usbtmc_ioctl_clear_in_halt(struct usbtmc_device_data *data)
759 if (!buffer) 750 if (!buffer)
760 return -ENOMEM; 751 return -ENOMEM;
761 752
762 rv = usb_control_msg(data->usb_dev, usb_sndctrlpipe(data->usb_dev, 0), 753 rv = usb_clear_halt(data->usb_dev,
763 USB_REQ_CLEAR_FEATURE, 754 usb_rcvbulkpipe(data->usb_dev, data->bulk_in));
764 USB_DIR_OUT | USB_TYPE_STANDARD |
765 USB_RECIP_ENDPOINT,
766 USB_ENDPOINT_HALT, data->bulk_in, buffer, 0,
767 USBTMC_TIMEOUT);
768 755
769 if (rv < 0) { 756 if (rv < 0) {
770 dev_err(&data->usb_dev->dev, "usb_control_msg returned %d\n", 757 dev_err(&data->usb_dev->dev, "usb_control_msg returned %d\n",
@@ -1109,13 +1096,13 @@ static void usbtmc_disconnect(struct usb_interface *intf)
1109 kref_put(&data->kref, usbtmc_delete); 1096 kref_put(&data->kref, usbtmc_delete);
1110} 1097}
1111 1098
1112static int usbtmc_suspend (struct usb_interface *intf, pm_message_t message) 1099static int usbtmc_suspend(struct usb_interface *intf, pm_message_t message)
1113{ 1100{
1114 /* this driver does not have pending URBs */ 1101 /* this driver does not have pending URBs */
1115 return 0; 1102 return 0;
1116} 1103}
1117 1104
1118static int usbtmc_resume (struct usb_interface *intf) 1105static int usbtmc_resume(struct usb_interface *intf)
1119{ 1106{
1120 return 0; 1107 return 0;
1121} 1108}