diff options
| -rw-r--r-- | drivers/staging/usbip/vhci_rx.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/staging/usbip/vhci_rx.c b/drivers/staging/usbip/vhci_rx.c index ac15cea75396..bf6991470941 100644 --- a/drivers/staging/usbip/vhci_rx.c +++ b/drivers/staging/usbip/vhci_rx.c | |||
| @@ -193,6 +193,19 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev, | |||
| 193 | return; | 193 | return; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | static int vhci_priv_tx_empty(struct vhci_device *vdev) | ||
| 197 | { | ||
| 198 | int empty = 0; | ||
| 199 | |||
| 200 | spin_lock(&vdev->priv_lock); | ||
| 201 | |||
| 202 | empty = list_empty(&vdev->priv_rx); | ||
| 203 | |||
| 204 | spin_unlock(&vdev->priv_lock); | ||
| 205 | |||
| 206 | return empty; | ||
| 207 | } | ||
| 208 | |||
| 196 | /* recv a pdu */ | 209 | /* recv a pdu */ |
| 197 | static void vhci_rx_pdu(struct usbip_device *ud) | 210 | static void vhci_rx_pdu(struct usbip_device *ud) |
| 198 | { | 211 | { |
| @@ -210,8 +223,14 @@ static void vhci_rx_pdu(struct usbip_device *ud) | |||
| 210 | if (ret < 0) { | 223 | if (ret < 0) { |
| 211 | if (ret == -ECONNRESET) | 224 | if (ret == -ECONNRESET) |
| 212 | usbip_uinfo("connection reset by peer\n"); | 225 | usbip_uinfo("connection reset by peer\n"); |
| 213 | else if (ret != -ERESTARTSYS) | 226 | else if (ret == -EAGAIN) { |
| 227 | /* ignore if connection was idle */ | ||
| 228 | if (vhci_priv_tx_empty(vdev)) | ||
| 229 | return; | ||
| 230 | usbip_uinfo("connection timed out with pending urbs\n"); | ||
| 231 | } else if (ret != -ERESTARTSYS) | ||
| 214 | usbip_uinfo("xmit failed %d\n", ret); | 232 | usbip_uinfo("xmit failed %d\n", ret); |
| 233 | |||
| 215 | usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); | 234 | usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); |
| 216 | return; | 235 | return; |
| 217 | } | 236 | } |
