Commit 0fb2af35 authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Greg Kroah-Hartman
Browse files

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: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7021b684
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -380,9 +380,7 @@ struct vnt_private {
	u32 uCurrentDFCBIdx;

	/* USB */
	struct urb *pControlURB;
	struct urb *pInterruptURB;
	struct usb_ctrlrequest sUsbCtlRequest;
	u32 int_interval;

	/* Variables to track resources for the BULK In Pipe */
@@ -743,7 +741,6 @@ struct vnt_private {
#define fMP_RECV_SIDE_RESOURCE_ALLOCATED    0x00000080
#define fMP_POST_READS                      0x00000100
#define fMP_POST_WRITES                     0x00000200
#define fMP_CONTROL_READS                   0x00000400

#define MP_SET_FLAG(_M, _F)             ((_M)->Flags |= (_F))
#define MP_CLEAR_FLAG(_M, _F)            ((_M)->Flags &= ~(_F))
+0 −11
Original line number Diff line number Diff line
@@ -702,12 +702,6 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
	INIT_WORK(&pDevice->read_work_item, RXvWorkItem);
	INIT_WORK(&pDevice->rx_mng_work_item, RXvMngWorkItem);

	pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
	if (!pDevice->pControlURB) {
		DBG_PRT(MSG_LEVEL_ERR, KERN_ERR"Failed to alloc control urb\n");
		goto err_netdev;
	}

	pDevice->tx_80211 = device_dma0_tx_80211;
	pDevice->vnt_mgmt.pAdapter = (void *) pDevice;

@@ -964,7 +958,6 @@ static int device_open(struct net_device *dev)
    }

    MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
    MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
    MP_SET_FLAG(pDevice, fMP_POST_READS);
    MP_SET_FLAG(pDevice, fMP_POST_WRITES);

@@ -1130,10 +1123,6 @@ static void vt6656_disconnect(struct usb_interface *intf)

	if (device->dev) {
		unregister_netdev(device->dev);

		usb_kill_urb(device->pControlURB);
		usb_free_urb(device->pControlURB);

		free_netdev(device->dev);
	}
}
+9 −85
Original line number Diff line number Diff line
@@ -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)
@@ -127,99 +126,24 @@ 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)
{
	int ntStatus = 0;
	int ii;
	int ntStatus;

	if (pDevice->Flags & fMP_DISCONNECTED)
		return STATUS_FAILURE;

    if (pDevice->Flags & fMP_CONTROL_READS)
	return STATUS_FAILURE;

	if (pDevice->pControlURB->hcpriv)
		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;
}

/*