diff options
Diffstat (limited to 'drivers/w1/masters')
-rw-r--r-- | drivers/w1/masters/ds2490.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c index 9a7fd71e1461..0f356939b349 100644 --- a/drivers/w1/masters/ds2490.c +++ b/drivers/w1/masters/ds2490.c | |||
@@ -316,6 +316,15 @@ static int ds_recv_data(struct ds_device *dev, unsigned char *buf, int size) | |||
316 | int count, err; | 316 | int count, err; |
317 | struct ds_status st; | 317 | struct ds_status st; |
318 | 318 | ||
319 | /* Careful on size. If size is less than what is available in | ||
320 | * the input buffer, the device fails the bulk transfer and | ||
321 | * clears the input buffer. It could read the maximum size of | ||
322 | * the data buffer, but then do you return the first, last, or | ||
323 | * some set of the middle size bytes? As long as the rest of | ||
324 | * the code is correct there will be size bytes waiting. A | ||
325 | * call to ds_wait_status will wait until the device is idle | ||
326 | * and any data to be received would have been available. | ||
327 | */ | ||
319 | count = 0; | 328 | count = 0; |
320 | err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]), | 329 | err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]), |
321 | buf, size, &count, 1000); | 330 | buf, size, &count, 1000); |
@@ -824,6 +833,18 @@ static int ds_w1_init(struct ds_device *dev) | |||
824 | { | 833 | { |
825 | memset(&dev->master, 0, sizeof(struct w1_bus_master)); | 834 | memset(&dev->master, 0, sizeof(struct w1_bus_master)); |
826 | 835 | ||
836 | /* Reset the device as it can be in a bad state. | ||
837 | * This is necessary because a block write will wait for data | ||
838 | * to be placed in the output buffer and block any later | ||
839 | * commands which will keep accumulating and the device will | ||
840 | * not be idle. Another case is removing the ds2490 module | ||
841 | * while a bus search is in progress, somehow a few commands | ||
842 | * get through, but the input transfers fail leaving data in | ||
843 | * the input buffer. This will cause the next read to fail | ||
844 | * see the note in ds_recv_data. | ||
845 | */ | ||
846 | ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0); | ||
847 | |||
827 | dev->master.data = dev; | 848 | dev->master.data = dev; |
828 | dev->master.touch_bit = &ds9490r_touch_bit; | 849 | dev->master.touch_bit = &ds9490r_touch_bit; |
829 | /* read_bit and write_bit in w1_bus_master are expected to set and | 850 | /* read_bit and write_bit in w1_bus_master are expected to set and |