| From a56d3e40bda460edf3f8d6aac00ec0b322b4ab83 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Mon, 25 Oct 2021 13:45:32 +0200 |
| Subject: comedi: vmk80xx: fix bulk and interrupt message timeouts |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit a56d3e40bda460edf3f8d6aac00ec0b322b4ab83 upstream. |
| |
| USB bulk and interrupt message timeouts are specified in milliseconds |
| and should specifically not vary with CONFIG_HZ. |
| |
| Note that the bulk-out transfer timeout was set to the endpoint |
| bInterval value, which should be ignored for bulk endpoints and is |
| typically set to zero. This meant that a failing bulk-out transfer |
| would never time out. |
| |
| Assume that the 10 second timeout used for all other transfers is more |
| than enough also for the bulk-out endpoint. |
| |
| Fixes: 985cafccbf9b ("Staging: Comedi: vmk80xx: Add k8061 support") |
| Fixes: 951348b37738 ("staging: comedi: vmk80xx: wait for URBs to complete") |
| Cc: stable@vger.kernel.org # 2.6.31 |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Reviewed-by: Ian Abbott <abbotti@mev.co.uk> |
| Link: https://lore.kernel.org/r/20211025114532.4599-6-johan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/staging/comedi/drivers/vmk80xx.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/staging/comedi/drivers/vmk80xx.c |
| +++ b/drivers/staging/comedi/drivers/vmk80xx.c |
| @@ -100,6 +100,7 @@ enum { |
| #define IC6_VERSION BIT(1) |
| |
| #define MIN_BUF_SIZE 64 |
| +#define PACKET_TIMEOUT 10000 /* ms */ |
| |
| enum vmk80xx_model { |
| VMK8055_MODEL, |
| @@ -178,10 +179,11 @@ static void vmk80xx_do_bulk_msg(struct c |
| tx_size = usb_endpoint_maxp(devpriv->ep_tx); |
| rx_size = usb_endpoint_maxp(devpriv->ep_rx); |
| |
| - usb_bulk_msg(usb, tx_pipe, devpriv->usb_tx_buf, |
| - tx_size, NULL, devpriv->ep_tx->bInterval); |
| + usb_bulk_msg(usb, tx_pipe, devpriv->usb_tx_buf, tx_size, NULL, |
| + PACKET_TIMEOUT); |
| |
| - usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, rx_size, NULL, HZ * 10); |
| + usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, rx_size, NULL, |
| + PACKET_TIMEOUT); |
| } |
| |
| static int vmk80xx_read_packet(struct comedi_device *dev) |
| @@ -200,7 +202,7 @@ static int vmk80xx_read_packet(struct co |
| pipe = usb_rcvintpipe(usb, ep->bEndpointAddress); |
| return usb_interrupt_msg(usb, pipe, devpriv->usb_rx_buf, |
| usb_endpoint_maxp(ep), NULL, |
| - HZ * 10); |
| + PACKET_TIMEOUT); |
| } |
| |
| static int vmk80xx_write_packet(struct comedi_device *dev, int cmd) |
| @@ -221,7 +223,7 @@ static int vmk80xx_write_packet(struct c |
| pipe = usb_sndintpipe(usb, ep->bEndpointAddress); |
| return usb_interrupt_msg(usb, pipe, devpriv->usb_tx_buf, |
| usb_endpoint_maxp(ep), NULL, |
| - HZ * 10); |
| + PACKET_TIMEOUT); |
| } |
| |
| static int vmk80xx_reset_device(struct comedi_device *dev) |