diff options
author | David Fries <David@Fries.net> | 2014-01-15 23:29:22 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-02-07 18:40:18 -0500 |
commit | da78b7e74ac5964015bed78d27e1fca8bae8e29a (patch) | |
tree | 0c50d36115a9e8634a0bc183c8f7be8d8cb202d9 /drivers/w1/masters | |
parent | f28c4e1f31802ec746a1b1dc0d7ec97f8de47024 (diff) |
w1: ds2490 USB setup fixes
Calling usb_reset_configuration after usb_set_interface resets the
interface that was just selected, so call reset first.
Using alternative 3 greatly speeds the one wire search.
alt 0 or 1, 10ms int, 23.16 seconds
alt 2 or 3, 1ms int, 2.99 to 3.05 seconds
Use usb_interrupt_msg not usb_bulk_msg as it is an interrupt pipe
(bulk worked, it was just technically the wrong call).
Signed-off-by: David Fries <David@Fries.net>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/w1/masters')
-rw-r--r-- | drivers/w1/masters/ds2490.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c index 6a3d0a1e02b8..cd59e12e8a78 100644 --- a/drivers/w1/masters/ds2490.c +++ b/drivers/w1/masters/ds2490.c | |||
@@ -252,7 +252,8 @@ static int ds_recv_status_nodump(struct ds_device *dev, struct ds_status *st, | |||
252 | memset(st, 0, sizeof(*st)); | 252 | memset(st, 0, sizeof(*st)); |
253 | 253 | ||
254 | count = 0; | 254 | count = 0; |
255 | err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_STATUS]), buf, size, &count, 100); | 255 | err = usb_interrupt_msg(dev->udev, usb_rcvintpipe(dev->udev, |
256 | dev->ep[EP_STATUS]), buf, size, &count, 100); | ||
256 | if (err < 0) { | 257 | if (err < 0) { |
257 | printk(KERN_ERR "Failed to read 1-wire data from 0x%x: err=%d.\n", dev->ep[EP_STATUS], err); | 258 | printk(KERN_ERR "Failed to read 1-wire data from 0x%x: err=%d.\n", dev->ep[EP_STATUS], err); |
258 | return err; | 259 | return err; |
@@ -917,7 +918,7 @@ static int ds_probe(struct usb_interface *intf, | |||
917 | struct usb_endpoint_descriptor *endpoint; | 918 | struct usb_endpoint_descriptor *endpoint; |
918 | struct usb_host_interface *iface_desc; | 919 | struct usb_host_interface *iface_desc; |
919 | struct ds_device *dev; | 920 | struct ds_device *dev; |
920 | int i, err; | 921 | int i, err, alt; |
921 | 922 | ||
922 | dev = kmalloc(sizeof(struct ds_device), GFP_KERNEL); | 923 | dev = kmalloc(sizeof(struct ds_device), GFP_KERNEL); |
923 | if (!dev) { | 924 | if (!dev) { |
@@ -935,20 +936,25 @@ static int ds_probe(struct usb_interface *intf, | |||
935 | 936 | ||
936 | usb_set_intfdata(intf, dev); | 937 | usb_set_intfdata(intf, dev); |
937 | 938 | ||
938 | err = usb_set_interface(dev->udev, intf->altsetting[0].desc.bInterfaceNumber, 3); | 939 | err = usb_reset_configuration(dev->udev); |
939 | if (err) { | 940 | if (err) { |
940 | printk(KERN_ERR "Failed to set alternative setting 3 for %d interface: err=%d.\n", | 941 | dev_err(&dev->udev->dev, |
941 | intf->altsetting[0].desc.bInterfaceNumber, err); | 942 | "Failed to reset configuration: err=%d.\n", err); |
942 | goto err_out_clear; | 943 | goto err_out_clear; |
943 | } | 944 | } |
944 | 945 | ||
945 | err = usb_reset_configuration(dev->udev); | 946 | /* alternative 3, 1ms interrupt (greatly speeds search), 64 byte bulk */ |
947 | alt = 3; | ||
948 | err = usb_set_interface(dev->udev, | ||
949 | intf->altsetting[alt].desc.bInterfaceNumber, alt); | ||
946 | if (err) { | 950 | if (err) { |
947 | printk(KERN_ERR "Failed to reset configuration: err=%d.\n", err); | 951 | dev_err(&dev->udev->dev, "Failed to set alternative setting %d " |
952 | "for %d interface: err=%d.\n", alt, | ||
953 | intf->altsetting[alt].desc.bInterfaceNumber, err); | ||
948 | goto err_out_clear; | 954 | goto err_out_clear; |
949 | } | 955 | } |
950 | 956 | ||
951 | iface_desc = &intf->altsetting[0]; | 957 | iface_desc = &intf->altsetting[alt]; |
952 | if (iface_desc->desc.bNumEndpoints != NUM_EP-1) { | 958 | if (iface_desc->desc.bNumEndpoints != NUM_EP-1) { |
953 | printk(KERN_INFO "Num endpoints=%d. It is not DS9490R.\n", iface_desc->desc.bNumEndpoints); | 959 | printk(KERN_INFO "Num endpoints=%d. It is not DS9490R.\n", iface_desc->desc.bNumEndpoints); |
954 | err = -EINVAL; | 960 | err = -EINVAL; |