diff options
author | Malcolm Priestley <tvboxspy@gmail.com> | 2014-05-15 21:49:23 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-05-15 22:02:20 (GMT) |
commit | 0fb2af353f11ea939b29c8cf07ce70a3882824cc (patch) | |
tree | 7c3286312d449138b5ad4c2a32ec9884c75c5574 /drivers/staging/vt6656/usbpipe.c | |
parent | 7021b684eb1efa9a349785f919e177c1b63af313 (diff) | |
download | linux-0fb2af353f11ea939b29c8cf07ce70a3882824cc.tar.xz |
staging: vt6656: PIPEnsControlIn use usb_control_msg
Now that this function is nolonger atomic useusb_control_msg.
Return STATUS_FAILURE if ntStatus less than wLength
Remove the old struct urb and struct usb_ctrlrequest structures.
Remove fMP_CONTROL_READS flag.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/vt6656/usbpipe.c')
-rw-r--r-- | drivers/staging/vt6656/usbpipe.c | 94 |
1 files changed, 9 insertions, 85 deletions
diff --git a/drivers/staging/vt6656/usbpipe.c b/drivers/staging/vt6656/usbpipe.c index 1ab3958..9946bfd 100644 --- a/drivers/staging/vt6656/usbpipe.c +++ b/drivers/staging/vt6656/usbpipe.c @@ -63,7 +63,6 @@ static int msglevel =MSG_LEVEL_INFO; static void s_nsInterruptUsbIoCompleteRead(struct urb *urb); static void s_nsBulkInUsbIoCompleteRead(struct urb *urb); static void s_nsBulkOutIoCompleteWrite(struct urb *urb); -static void s_nsControlInUsbIoCompleteRead(struct urb *urb); int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest, u16 wValue, u16 wIndex, u16 wLength, u8 *pbyBuffer) @@ -126,100 +125,25 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue, } int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue, - u16 wIndex, u16 wLength, u8 *pbyBuffer) - __releases(&pDevice->lock) - __acquires(&pDevice->lock) + u16 wIndex, u16 wLength, u8 *pbyBuffer) { - int ntStatus = 0; - int ii; - - if (pDevice->Flags & fMP_DISCONNECTED) - return STATUS_FAILURE; - - if (pDevice->Flags & fMP_CONTROL_READS) - return STATUS_FAILURE; + int ntStatus; - if (pDevice->pControlURB->hcpriv) + if (pDevice->Flags & fMP_DISCONNECTED) return STATUS_FAILURE; mutex_lock(&pDevice->usb_lock); - MP_SET_FLAG(pDevice, fMP_CONTROL_READS); - - pDevice->sUsbCtlRequest.bRequestType = 0xC0; - pDevice->sUsbCtlRequest.bRequest = byRequest; - pDevice->sUsbCtlRequest.wValue = cpu_to_le16p(&wValue); - pDevice->sUsbCtlRequest.wIndex = cpu_to_le16p(&wIndex); - pDevice->sUsbCtlRequest.wLength = cpu_to_le16p(&wLength); - pDevice->pControlURB->transfer_flags |= URB_ASYNC_UNLINK; - pDevice->pControlURB->actual_length = 0; - usb_fill_control_urb(pDevice->pControlURB, pDevice->usb, - usb_rcvctrlpipe(pDevice->usb , 0), (char *) &pDevice->sUsbCtlRequest, - pbyBuffer, wLength, s_nsControlInUsbIoCompleteRead, pDevice); - - ntStatus = usb_submit_urb(pDevice->pControlURB, GFP_ATOMIC); - if (ntStatus != 0) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "control request submission failed: %d\n", ntStatus); - MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS); - mutex_unlock(&pDevice->usb_lock); - return STATUS_FAILURE; - } - - for (ii = 0; ii <= USB_CTL_WAIT; ii ++) { - - if (pDevice->Flags & fMP_CONTROL_READS) - mdelay(1); - else - break; - - if (ii >= USB_CTL_WAIT) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "control rcv request submission timeout\n"); - MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS); - mutex_unlock(&pDevice->usb_lock); - return STATUS_FAILURE; - } - } + ntStatus = usb_control_msg(pDevice->usb, + usb_rcvctrlpipe(pDevice->usb, 0), byRequest, 0xc0, wValue, + wIndex, pbyBuffer, wLength, USB_CTL_WAIT); mutex_unlock(&pDevice->usb_lock); - return ntStatus; -} - -/* - * Description: - * Complete function of usb Control callback - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -static void s_nsControlInUsbIoCompleteRead(struct urb *urb) -{ - struct vnt_private *pDevice = (struct vnt_private *)urb->context; - - switch (urb->status) { - case 0: - break; - case -EINPROGRESS: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status EINPROGRESS%d\n", urb->status); - break; - case -ENOENT: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status = ENOENT %d\n", urb->status); - break; - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status %d\n", urb->status); - } + if (ntStatus < (int)wLength) + return STATUS_FAILURE; - MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS); + return STATUS_SUCCESS; } /* |