summaryrefslogtreecommitdiff
path: root/drivers/staging/vt6656/usbpipe.c
diff options
context:
space:
mode:
authorMalcolm Priestley <tvboxspy@gmail.com>2014-05-15 21:49:22 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-15 22:02:20 (GMT)
commit7021b684eb1efa9a349785f919e177c1b63af313 (patch)
tree9f2833335a275fee5f98a4201ce342a77ad65cbf /drivers/staging/vt6656/usbpipe.c
parent3c647642f6658c693d090b12c1b5bf901f3b7440 (diff)
downloadlinux-7021b684eb1efa9a349785f919e177c1b63af313.tar.xz
staging: vt6656: usbpipe.c PIPEnsControlOut use usb_control_msg
Now that this fucntion is nolonger atomic change to usb_control_msg Return STATUS_FAILURE if ntStatus less than wLength. Remove fMP_CONTROL_WRITES 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.c87
1 files changed, 7 insertions, 80 deletions
diff --git a/drivers/staging/vt6656/usbpipe.c b/drivers/staging/vt6656/usbpipe.c
index b707470..1ab3958 100644
--- a/drivers/staging/vt6656/usbpipe.c
+++ b/drivers/staging/vt6656/usbpipe.c
@@ -64,7 +64,6 @@ 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);
-static void s_nsControlInUsbIoCompleteWrite(struct urb *urb);
int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
u16 wValue, u16 wIndex, u16 wLength, u8 *pbyBuffer)
@@ -74,9 +73,6 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
if (pDevice->Flags & fMP_DISCONNECTED)
return STATUS_FAILURE;
- if (pDevice->Flags & fMP_CONTROL_WRITES)
- return STATUS_FAILURE;
-
if (in_interrupt()) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"in_interrupt return ..byRequest %x\n", byRequest);
return STATUS_FAILURE;
@@ -109,69 +105,24 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
u16 wIndex, u16 wLength, u8 *pbyBuffer)
- __releases(&pDevice->lock)
- __acquires(&pDevice->lock)
{
int ntStatus = 0;
- int ii;
-
- if (pDevice->Flags & fMP_DISCONNECTED)
- return STATUS_FAILURE;
-
- if (pDevice->Flags & fMP_CONTROL_WRITES)
- return STATUS_FAILURE;
- if (pDevice->Flags & fMP_CONTROL_READS)
- return STATUS_FAILURE;
-
- if (pDevice->pControlURB->hcpriv)
+ if (pDevice->Flags & fMP_DISCONNECTED)
return STATUS_FAILURE;
mutex_lock(&pDevice->usb_lock);
- MP_SET_FLAG(pDevice, fMP_CONTROL_WRITES);
+ ntStatus = usb_control_msg(pDevice->usb,
+ usb_sndctrlpipe(pDevice->usb, 0), byRequest, 0x40, wValue,
+ wIndex, pbyBuffer, wLength, USB_CTL_WAIT);
- pDevice->sUsbCtlRequest.bRequestType = 0x40;
- 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;
- // Notice, pbyBuffer limited point to variable buffer, can't be constant.
- usb_fill_control_urb(pDevice->pControlURB, pDevice->usb,
- usb_sndctrlpipe(pDevice->usb , 0), (char *) &pDevice->sUsbCtlRequest,
- pbyBuffer, wLength, s_nsControlInUsbIoCompleteWrite, pDevice);
+ mutex_unlock(&pDevice->usb_lock);
- ntStatus = usb_submit_urb(pDevice->pControlURB, GFP_ATOMIC);
- if (ntStatus != 0) {
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
- "control send request submission failed: %d\n",
- ntStatus);
- MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
- mutex_unlock(&pDevice->usb_lock);
+ if (ntStatus < (int)wLength)
return STATUS_FAILURE;
- }
-
- for (ii = 0; ii <= USB_CTL_WAIT; ii ++) {
-
- if (pDevice->Flags & fMP_CONTROL_WRITES)
- mdelay(1);
- else
- break;
-
- if (ii >= USB_CTL_WAIT) {
- DBG_PRT(MSG_LEVEL_DEBUG,
- KERN_INFO "control send request submission timeout\n");
- MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
- mutex_unlock(&pDevice->usb_lock);
- return STATUS_FAILURE;
- }
- }
-
- mutex_unlock(&pDevice->usb_lock);
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
@@ -188,9 +139,6 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
if (pDevice->Flags & fMP_CONTROL_READS)
return STATUS_FAILURE;
- if (pDevice->Flags & fMP_CONTROL_WRITES)
- return STATUS_FAILURE;
-
if (pDevice->pControlURB->hcpriv)
return STATUS_FAILURE;
@@ -239,27 +187,6 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
return ntStatus;
}
-static void s_nsControlInUsbIoCompleteWrite(struct urb *urb)
-{
- struct vnt_private *pDevice = (struct vnt_private *)urb->context;
-
- pDevice = urb->context;
- switch (urb->status) {
- case 0:
- break;
- case -EINPROGRESS:
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status EINPROGRESS%d\n", urb->status);
- break;
- case -ENOENT:
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status ENOENT %d\n", urb->status);
- break;
- default:
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status %d\n", urb->status);
- }
-
- MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
-}
-
/*
* Description:
* Complete function of usb Control callback