Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: add urb->unlinked field

This patch (as970) adds a new urb->unlinked field, which is used to
store the status of unlinked URBs since we can't use urb->status for
that purpose any more. To help simplify the HCDs, usbcore will check
urb->unlinked before calling the completion handler; if the value is
set it will automatically override the status reported by the HCD.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: David Brownell <david-b@pacbell.net>
CC: Olav Kongas <ok@artecdesign.ee>
CC: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
CC: Tony Olech <tony.olech@elandigitalsystems.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Alan Stern and committed by
Greg Kroah-Hartman
eb231054 b0d9efba

+108 -125
+12 -7
drivers/usb/core/hcd.c
··· 532 532 533 533 /* any errors get returned through the urb completion */ 534 534 spin_lock_irq(&hcd_root_hub_lock); 535 - if (urb->status == -EINPROGRESS) 536 - urb->status = status; 535 + urb->status = status; 537 536 usb_hcd_unlink_urb_from_ep(hcd, urb); 538 537 539 538 /* This peculiar use of spinlocks echoes what real HC drivers do. ··· 1023 1024 switch (hcd->state) { 1024 1025 case HC_STATE_RUNNING: 1025 1026 case HC_STATE_RESUMING: 1027 + urb->unlinked = 0; 1026 1028 list_add_tail(&urb->urb_list, &urb->ep->urb_list); 1027 1029 break; 1028 1030 default: ··· 1071 1071 /* Any status except -EINPROGRESS means something already started to 1072 1072 * unlink this URB from the hardware. So there's no more work to do. 1073 1073 */ 1074 - if (urb->status != -EINPROGRESS) 1074 + if (urb->unlinked) 1075 1075 return -EBUSY; 1076 - urb->status = status; 1076 + urb->unlinked = status; 1077 1077 1078 1078 /* IRQ setup can easily be broken so that USB controllers 1079 1079 * never get completion IRQs ... maybe even the ones we need to ··· 1259 1259 * (and is done using urb->hcpriv). It also released all HCD locks; 1260 1260 * the device driver won't cause problems if it frees, modifies, 1261 1261 * or resubmits this URB. 1262 + * 1263 + * If @urb was unlinked, the value of @urb->status will be overridden by 1264 + * @urb->unlinked. Erroneous short transfers are detected in case 1265 + * the HCD hasn't checked for them. 1262 1266 */ 1263 1267 void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb) 1264 1268 { ··· 1270 1266 usbmon_urb_complete (&hcd->self, urb); 1271 1267 usb_unanchor_urb(urb); 1272 1268 urb->hcpriv = NULL; 1273 - if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && 1269 + if (unlikely(urb->unlinked)) 1270 + urb->status = urb->unlinked; 1271 + else if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && 1274 1272 urb->actual_length < urb->transfer_buffer_length && 1275 1273 !urb->status)) 1276 1274 urb->status = -EREMOTEIO; ··· 1311 1305 list_for_each_entry (urb, &ep->urb_list, urb_list) { 1312 1306 int is_in; 1313 1307 1314 - /* the urb may already have been unlinked */ 1315 - if (urb->status != -EINPROGRESS) 1308 + if (urb->unlinked) 1316 1309 continue; 1317 1310 usb_get_urb (urb); 1318 1311 is_in = usb_urb_dir_in(urb);
+3 -5
drivers/usb/gadget/dummy_hcd.c
··· 1029 1029 static void maybe_set_status (struct urb *urb, int status) 1030 1030 { 1031 1031 spin_lock (&urb->lock); 1032 - if (urb->status == -EINPROGRESS) 1033 - urb->status = status; 1032 + urb->status = status; 1034 1033 spin_unlock (&urb->lock); 1035 1034 } 1036 1035 ··· 1256 1257 int type; 1257 1258 1258 1259 urb = urbp->urb; 1259 - if (urb->status != -EINPROGRESS) { 1260 - /* likely it was just unlinked */ 1260 + if (urb->unlinked) 1261 1261 goto return_urb; 1262 - } else if (dum->rh_state != DUMMY_RH_RUNNING) 1262 + else if (dum->rh_state != DUMMY_RH_RUNNING) 1263 1263 continue; 1264 1264 type = usb_pipetype (urb->pipe); 1265 1265
+12 -17
drivers/usb/host/ehci-q.c
··· 151 151 urb->actual_length += length - QTD_LENGTH (token); 152 152 153 153 /* don't modify error codes */ 154 - if (unlikely (urb->status != -EINPROGRESS)) 154 + if (unlikely(urb->unlinked)) 155 155 return; 156 156 157 157 /* force cleanup after short read; not always an error */ ··· 232 232 } 233 233 234 234 spin_lock (&urb->lock); 235 - switch (urb->status) { 236 - case -EINPROGRESS: /* success */ 237 - urb->status = 0; 238 - default: /* fault */ 239 - COUNT (ehci->stats.complete); 240 - break; 241 - case -EREMOTEIO: /* fault or normal */ 242 - if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) 235 + if (unlikely(urb->unlinked)) { 236 + COUNT(ehci->stats.unlink); 237 + } else { 238 + if (likely(urb->status == -EINPROGRESS || 239 + (urb->status == -EREMOTEIO && 240 + !(urb->transfer_flags & URB_SHORT_NOT_OK)))) 243 241 urb->status = 0; 244 - COUNT (ehci->stats.complete); 245 - break; 246 - case -ECONNRESET: /* canceled */ 247 - case -ENOENT: 248 - COUNT (ehci->stats.unlink); 249 - break; 242 + COUNT(ehci->stats.complete); 250 243 } 251 244 spin_unlock (&urb->lock); 252 245 ··· 357 364 * for the urb faulted (including short read) or 358 365 * its urb was canceled. we may patch qh or qtds. 359 366 */ 360 - if (likely (urb->status == -EINPROGRESS)) 367 + if (likely(urb->status == -EINPROGRESS && 368 + !urb->unlinked)) 361 369 continue; 362 370 363 371 /* issue status after short control reads */ ··· 389 395 spin_lock (&urb->lock); 390 396 qtd_copy_status (ehci, urb, qtd->length, token); 391 397 if (unlikely(urb->status == -EREMOTEIO)) { 392 - do_status = usb_pipecontrol(urb->pipe); 398 + do_status = (!urb->unlinked && 399 + usb_pipecontrol(urb->pipe)); 393 400 urb->status = 0; 394 401 } 395 402 spin_unlock (&urb->lock);
+2 -3
drivers/usb/host/isp116x-hcd.c
··· 455 455 done: 456 456 if (status != -EINPROGRESS) { 457 457 spin_lock(&urb->lock); 458 - if (urb->status == -EINPROGRESS) 459 - urb->status = status; 458 + urb->status = status; 460 459 spin_unlock(&urb->lock); 461 460 } 462 - if (urb->status != -EINPROGRESS) 461 + if (urb->status != -EINPROGRESS || urb->unlinked) 463 462 finish_request(isp116x, ep, urb); 464 463 } 465 464 }
+2 -3
drivers/usb/host/ohci-q.c
··· 758 758 cc = TD_CC_NOERROR; 759 759 if (cc != TD_CC_NOERROR && cc < 0x0E) { 760 760 spin_lock (&urb->lock); 761 - if (urb->status == -EINPROGRESS) 762 - urb->status = cc_to_error [cc]; 761 + urb->status = cc_to_error[cc]; 763 762 spin_unlock (&urb->lock); 764 763 } 765 764 ··· 971 972 urb = td->urb; 972 973 urb_priv = td->urb->hcpriv; 973 974 974 - if (urb->status == -EINPROGRESS) { 975 + if (!urb->unlinked) { 975 976 prev = &td->hwNextTD; 976 977 continue; 977 978 }
+7 -17
drivers/usb/host/r8a66597-hcd.c
··· 1118 1118 r8a66597->timeout_map &= ~(1 << pipenum); 1119 1119 1120 1120 if (likely(td)) { 1121 - if (td->set_address && urb->status != 0) 1121 + if (td->set_address && (urb->status != 0 || urb->unlinked)) 1122 1122 r8a66597->address_map &= ~(1 << urb->setup_packet[2]); 1123 1123 1124 1124 pipe_toggle_save(r8a66597, td->pipe, urb); ··· 1225 1225 } 1226 1226 1227 1227 if (finish && pipenum != 0) { 1228 - if (td->urb->status == -EINPROGRESS) 1229 - td->urb->status = status; 1228 + td->urb->status = status; 1230 1229 finish_request(r8a66597, td, pipenum, urb); 1231 1230 } 1232 1231 } ··· 1307 1308 switch (td->type) { 1308 1309 case USB_PID_IN: 1309 1310 case USB_PID_OUT: 1310 - if (urb->status != -EINPROGRESS) { 1311 - finish = 1; 1312 - break; 1313 - } 1314 1311 if (check_transfer_finish(td, urb)) 1315 1312 td->type = USB_PID_ACK; 1316 1313 break; 1317 1314 case USB_PID_SETUP: 1318 - if (urb->status != -EINPROGRESS) 1319 - finish = 1; 1320 - else if (urb->transfer_buffer_length == urb->actual_length) { 1315 + if (urb->transfer_buffer_length == urb->actual_length) 1321 1316 td->type = USB_PID_ACK; 1322 - urb->status = 0; 1323 - } else if (usb_pipeout(urb->pipe)) 1317 + else if (usb_pipeout(urb->pipe)) 1324 1318 td->type = USB_PID_OUT; 1325 1319 else 1326 1320 td->type = USB_PID_IN; 1327 1321 break; 1328 1322 case USB_PID_ACK: 1329 1323 finish = 1; 1330 - if (urb->status == -EINPROGRESS) 1331 - urb->status = 0; 1324 + urb->status = 0; 1332 1325 break; 1333 1326 } 1334 1327 1335 - if (finish) 1328 + if (finish || urb->unlinked) 1336 1329 finish_request(r8a66597, td, 0, urb); 1337 1330 else 1338 1331 start_transfer(r8a66597, td); ··· 1409 1418 if ((tmp & INBUFM) == 0) { 1410 1419 disable_irq_empty(r8a66597, pipenum); 1411 1420 pipe_irq_disable(r8a66597, pipenum); 1412 - if (td->urb->status == -EINPROGRESS) 1413 - td->urb->status = 0; 1421 + td->urb->status = 0; 1414 1422 finish_request(r8a66597, td, pipenum, td->urb); 1415 1423 } 1416 1424 }
+2 -3
drivers/usb/host/sl811-hcd.c
··· 436 436 ep->nextpid = USB_PID_SETUP; 437 437 438 438 spin_lock(&urb->lock); 439 - if (urb->status == -EINPROGRESS) 440 - urb->status = status; 439 + urb->status = status; 441 440 spin_unlock(&urb->lock); 442 441 443 442 usb_hcd_unlink_urb_from_ep(sl811_to_hcd(sl811), urb); ··· 597 598 bank, status, ep, urbstat); 598 599 } 599 600 600 - if (urb && (urbstat != -EINPROGRESS || urb->status != -EINPROGRESS)) 601 + if (urb && (urbstat != -EINPROGRESS || urb->unlinked)) 601 602 finish_request(sl811, ep, urb, urbstat); 602 603 } 603 604
+62 -62
drivers/usb/host/u132-hcd.c
··· 645 645 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 646 646 return; 647 647 } else if (u132->going > 0) { 648 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 649 - "%p status=%d\n", urb, urb->status); 648 + dev_err(&u132->platform_dev->dev, "device is being removed " 649 + "urb=%p\n", urb); 650 650 up(&u132->scheduler_lock); 651 651 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 652 652 return; 653 - } else if (urb->status == -EINPROGRESS) { 653 + } else if (!urb->unlinked) { 654 654 struct u132_ring *ring = endp->ring; 655 655 u8 *u = urb->transfer_buffer + urb->actual_length; 656 656 u8 *b = buf; ··· 716 716 return; 717 717 } 718 718 } else { 719 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 720 - "s=%d\n", urb, urb->status); 719 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 720 + "unlinked=%d\n", urb, urb->unlinked); 721 721 up(&u132->scheduler_lock); 722 722 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 723 723 return; ··· 744 744 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 745 745 return; 746 746 } else if (u132->going > 0) { 747 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 748 - "%p status=%d\n", urb, urb->status); 747 + dev_err(&u132->platform_dev->dev, "device is being removed " 748 + "urb=%p\n", urb); 749 749 up(&u132->scheduler_lock); 750 750 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 751 751 return; 752 - } else if (urb->status == -EINPROGRESS) { 752 + } else if (!urb->unlinked) { 753 753 struct u132_ring *ring = endp->ring; 754 754 urb->actual_length += len; 755 755 endp->toggle_bits = toggle_bits; ··· 768 768 return; 769 769 } 770 770 } else { 771 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 772 - "s=%d\n", urb, urb->status); 771 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 772 + "unlinked=%d\n", urb, urb->unlinked); 773 773 up(&u132->scheduler_lock); 774 774 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 775 775 return; ··· 797 797 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 798 798 return; 799 799 } else if (u132->going > 0) { 800 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 801 - "%p status=%d\n", urb, urb->status); 800 + dev_err(&u132->platform_dev->dev, "device is being removed " 801 + "urb=%p\n", urb); 802 802 up(&u132->scheduler_lock); 803 803 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 804 804 return; 805 - } else if (urb->status == -EINPROGRESS) { 805 + } else if (!urb->unlinked) { 806 806 struct u132_ring *ring = endp->ring; 807 807 u8 *u = urb->transfer_buffer + urb->actual_length; 808 808 u8 *b = buf; ··· 871 871 return; 872 872 } 873 873 } else { 874 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 875 - "s=%d\n", urb, urb->status); 874 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 875 + "unlinked=%d\n", urb, urb->unlinked); 876 876 up(&u132->scheduler_lock); 877 877 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 878 878 return; ··· 898 898 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 899 899 return; 900 900 } else if (u132->going > 0) { 901 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 902 - "%p status=%d\n", urb, urb->status); 901 + dev_err(&u132->platform_dev->dev, "device is being removed " 902 + "urb=%p\n", urb); 903 903 up(&u132->scheduler_lock); 904 904 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 905 905 return; 906 - } else if (urb->status == -EINPROGRESS) { 906 + } else if (!urb->unlinked) { 907 907 up(&u132->scheduler_lock); 908 908 u132_hcd_giveback_urb(u132, endp, urb, 0); 909 909 return; 910 910 } else { 911 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 912 - "s=%d\n", urb, urb->status); 911 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 912 + "unlinked=%d\n", urb, urb->unlinked); 913 913 up(&u132->scheduler_lock); 914 914 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 915 915 return; ··· 936 936 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 937 937 return; 938 938 } else if (u132->going > 0) { 939 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 940 - "%p status=%d\n", urb, urb->status); 939 + dev_err(&u132->platform_dev->dev, "device is being removed " 940 + "urb=%p\n", urb); 941 941 up(&u132->scheduler_lock); 942 942 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 943 943 return; 944 - } else if (urb->status == -EINPROGRESS) { 944 + } else if (!urb->unlinked) { 945 945 struct u132_ring *ring = endp->ring; 946 946 u8 *u = urb->transfer_buffer; 947 947 u8 *b = buf; ··· 980 980 return; 981 981 } 982 982 } else { 983 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 984 - "s=%d\n", urb, urb->status); 983 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 984 + "unlinked=%d\n", urb, urb->unlinked); 985 985 up(&u132->scheduler_lock); 986 986 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 987 987 return; ··· 1007 1007 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1008 1008 return; 1009 1009 } else if (u132->going > 0) { 1010 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1011 - "%p status=%d\n", urb, urb->status); 1010 + dev_err(&u132->platform_dev->dev, "device is being removed " 1011 + "urb=%p\n", urb); 1012 1012 up(&u132->scheduler_lock); 1013 1013 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1014 1014 return; 1015 - } else if (urb->status == -EINPROGRESS) { 1015 + } else if (!urb->unlinked) { 1016 1016 up(&u132->scheduler_lock); 1017 1017 u132_hcd_giveback_urb(u132, endp, urb, 0); 1018 1018 return; 1019 1019 } else { 1020 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1021 - "s=%d\n", urb, urb->status); 1020 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1021 + "unlinked=%d\n", urb, urb->unlinked); 1022 1022 up(&u132->scheduler_lock); 1023 1023 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1024 1024 return; ··· 1045 1045 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1046 1046 return; 1047 1047 } else if (u132->going > 0) { 1048 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1049 - "%p status=%d\n", urb, urb->status); 1048 + dev_err(&u132->platform_dev->dev, "device is being removed " 1049 + "urb=%p\n", urb); 1050 1050 up(&u132->scheduler_lock); 1051 1051 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1052 1052 return; 1053 - } else if (urb->status == -EINPROGRESS) { 1053 + } else if (!urb->unlinked) { 1054 1054 if (usb_pipein(urb->pipe)) { 1055 1055 int retval; 1056 1056 struct u132_ring *ring = endp->ring; ··· 1077 1077 return; 1078 1078 } 1079 1079 } else { 1080 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1081 - "s=%d\n", urb, urb->status); 1080 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1081 + "unlinked=%d\n", urb, urb->unlinked); 1082 1082 up(&u132->scheduler_lock); 1083 1083 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1084 1084 return; ··· 1106 1106 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1107 1107 return; 1108 1108 } else if (u132->going > 0) { 1109 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1110 - "%p status=%d\n", urb, urb->status); 1109 + dev_err(&u132->platform_dev->dev, "device is being removed " 1110 + "urb=%p\n", urb); 1111 1111 up(&u132->scheduler_lock); 1112 1112 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1113 1113 return; 1114 - } else if (urb->status == -EINPROGRESS) { 1114 + } else if (!urb->unlinked) { 1115 1115 u132->addr[0].address = 0; 1116 1116 endp->usb_addr = udev->usb_addr; 1117 1117 up(&u132->scheduler_lock); 1118 1118 u132_hcd_giveback_urb(u132, endp, urb, 0); 1119 1119 return; 1120 1120 } else { 1121 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1122 - "s=%d\n", urb, urb->status); 1121 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1122 + "unlinked=%d\n", urb, urb->unlinked); 1123 1123 up(&u132->scheduler_lock); 1124 1124 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1125 1125 return; ··· 1145 1145 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1146 1146 return; 1147 1147 } else if (u132->going > 0) { 1148 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1149 - "%p status=%d\n", urb, urb->status); 1148 + dev_err(&u132->platform_dev->dev, "device is being removed " 1149 + "urb=%p\n", urb); 1150 1150 up(&u132->scheduler_lock); 1151 1151 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1152 1152 return; 1153 - } else if (urb->status == -EINPROGRESS) { 1153 + } else if (!urb->unlinked) { 1154 1154 int retval; 1155 1155 struct u132_ring *ring = endp->ring; 1156 1156 up(&u132->scheduler_lock); ··· 1162 1162 u132_hcd_giveback_urb(u132, endp, urb, retval); 1163 1163 return; 1164 1164 } else { 1165 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1166 - "s=%d\n", urb, urb->status); 1165 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1166 + "unlinked=%d\n", urb, urb->unlinked); 1167 1167 up(&u132->scheduler_lock); 1168 1168 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1169 1169 return; ··· 1189 1189 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1190 1190 return; 1191 1191 } else if (u132->going > 0) { 1192 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1193 - "%p status=%d\n", urb, urb->status); 1192 + dev_err(&u132->platform_dev->dev, "device is being removed " 1193 + "urb=%p\n", urb); 1194 1194 up(&u132->scheduler_lock); 1195 1195 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1196 1196 return; 1197 - } else if (urb->status == -EINPROGRESS) { 1197 + } else if (!urb->unlinked) { 1198 1198 up(&u132->scheduler_lock); 1199 1199 u132_hcd_giveback_urb(u132, endp, urb, 0); 1200 1200 return; 1201 1201 } else { 1202 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1203 - "s=%d\n", urb, urb->status); 1202 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1203 + "unlinked=%d\n", urb, urb->unlinked); 1204 1204 up(&u132->scheduler_lock); 1205 1205 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1206 1206 return; ··· 1227 1227 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1228 1228 return; 1229 1229 } else if (u132->going > 0) { 1230 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1231 - "%p status=%d\n", urb, urb->status); 1230 + dev_err(&u132->platform_dev->dev, "device is being removed " 1231 + "urb=%p\n", urb); 1232 1232 up(&u132->scheduler_lock); 1233 1233 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1234 1234 return; 1235 - } else if (urb->status == -EINPROGRESS) { 1235 + } else if (!urb->unlinked) { 1236 1236 int retval; 1237 1237 struct u132_ring *ring = endp->ring; 1238 1238 u8 *u = urb->transfer_buffer; ··· 1251 1251 u132_hcd_giveback_urb(u132, endp, urb, retval); 1252 1252 return; 1253 1253 } else { 1254 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1255 - "s=%d\n", urb, urb->status); 1254 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1255 + "unlinked=%d\n", urb, urb->unlinked); 1256 1256 up(&u132->scheduler_lock); 1257 1257 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1258 1258 return; ··· 1279 1279 u132_hcd_giveback_urb(u132, endp, urb, -EINTR); 1280 1280 return; 1281 1281 } else if (u132->going > 0) { 1282 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 1283 - "%p status=%d\n", urb, urb->status); 1282 + dev_err(&u132->platform_dev->dev, "device is being removed " 1283 + "urb=%p\n", urb); 1284 1284 up(&u132->scheduler_lock); 1285 1285 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV); 1286 1286 return; 1287 - } else if (urb->status == -EINPROGRESS) { 1287 + } else if (!urb->unlinked) { 1288 1288 int retval; 1289 1289 struct u132_ring *ring = endp->ring; 1290 1290 up(&u132->scheduler_lock); ··· 1296 1296 u132_hcd_giveback_urb(u132, endp, urb, retval); 1297 1297 return; 1298 1298 } else { 1299 - dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu" 1300 - "s=%d\n", urb, urb->status); 1299 + dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p " 1300 + "unlinked=%d\n", urb, urb->unlinked); 1301 1301 up(&u132->scheduler_lock); 1302 1302 u132_hcd_giveback_urb(u132, endp, urb, urb->status); 1303 1303 return; ··· 2279 2279 , u132->going); 2280 2280 return -ENODEV; 2281 2281 } else if (u132->going > 0) { 2282 - dev_err(&u132->platform_dev->dev, "device is being removed urb=" 2283 - "%p status=%d\n", urb, urb->status); 2282 + dev_err(&u132->platform_dev->dev, "device is being removed " 2283 + "urb=%p\n", urb); 2284 2284 return -ESHUTDOWN; 2285 2285 } else { 2286 2286 u8 usb_addr = usb_pipedevice(urb->pipe);
+2 -2
drivers/usb/host/uhci-debug.c
··· 120 120 out += sprintf(out, "%s%s", ptype, (urbp->fsbr ? " FSBR" : "")); 121 121 out += sprintf(out, " Actlen=%d", urbp->urb->actual_length); 122 122 123 - if (urbp->urb->status != -EINPROGRESS) 124 - out += sprintf(out, " Status=%d", urbp->urb->status); 123 + if (urbp->urb->unlinked) 124 + out += sprintf(out, " Unlinked=%d", urbp->urb->unlinked); 125 125 out += sprintf(out, "\n"); 126 126 127 127 i = nactive = ninactive = 0;
+3 -6
drivers/usb/host/uhci-q.c
··· 1557 1557 break; 1558 1558 1559 1559 spin_lock(&urb->lock); 1560 - if (urb->status == -EINPROGRESS) /* Not dequeued */ 1561 - urb->status = status; 1562 - else 1563 - status = ECONNRESET; /* Not -ECONNRESET */ 1560 + urb->status = status; 1564 1561 spin_unlock(&urb->lock); 1565 1562 1566 1563 /* Dequeued but completed URBs can't be given back unless 1567 1564 * the QH is stopped or has finished unlinking. */ 1568 - if (status == ECONNRESET) { 1565 + if (urb->unlinked) { 1569 1566 if (QH_FINISHED_UNLINKING(qh)) 1570 1567 qh->is_stopped = 1; 1571 1568 else if (!qh->is_stopped) ··· 1585 1588 restart: 1586 1589 list_for_each_entry(urbp, &qh->queue, node) { 1587 1590 urb = urbp->urb; 1588 - if (urb->status != -EINPROGRESS) { 1591 + if (urb->unlinked) { 1589 1592 1590 1593 /* Fix up the TD links and save the toggles for 1591 1594 * non-Isochronous queues. For Isochronous queues,
+1
include/linux/usb.h
··· 1245 1245 void *hcpriv; /* private data for host controller */ 1246 1246 atomic_t use_count; /* concurrent submissions counter */ 1247 1247 u8 reject; /* submissions will fail */ 1248 + int unlinked; /* unlink error code */ 1248 1249 1249 1250 /* public: documented fields in the urb that can be used by drivers */ 1250 1251 struct list_head urb_list; /* list head for use by the urb's