Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivi...
[cascardo/linux.git] / drivers / staging / vt6656 / usbpipe.c
index c5838d9..e4751b7 100644 (file)
  * Date: Mar. 29, 2005
  *
  * Functions:
- *      CONTROLnsRequestOut - Write variable length bytes to MEM/BB/MAC/EEPROM
- *      CONTROLnsRequestIn - Read variable length bytes from MEM/BB/MAC/EEPROM
- *      ControlvWriteByte - Write one byte to MEM/BB/MAC/EEPROM
- *      ControlvReadByte - Read one byte from MEM/BB/MAC/EEPROM
+ *     vnt_control_out - Write variable length bytes to MEM/BB/MAC/EEPROM
+ *     vnt_control_in - Read variable length bytes from MEM/BB/MAC/EEPROM
+ *     vnt_control_out_u8 - Write one byte to MEM/BB/MAC/EEPROM
+ *     vnt_control_in_u8 - Read one byte from MEM/BB/MAC/EEPROM
  *      ControlvMaskByte - Read one byte from MEM/BB/MAC/EEPROM and clear/set some bits in the same address
  *
  * Revision History:
@@ -41,9 +41,9 @@
 #include "int.h"
 #include "rxtx.h"
 #include "dpc.h"
-#include "control.h"
 #include "desc.h"
 #include "device.h"
+#include "usbpipe.h"
 
 //endpoint def
 //endpoint 0: control
@@ -51,9 +51,6 @@
 //endpoint 2: read bulk
 //endpoint 3: write bulk
 
-//static int          msglevel                =MSG_LEVEL_DEBUG;
-static int          msglevel                =MSG_LEVEL_INFO;
-
 #define USB_CTL_WAIT   500 //ms
 
 #ifndef URB_ASYNC_UNLINK
@@ -63,226 +60,61 @@ 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);
-static void s_nsControlInUsbIoCompleteWrite(struct urb *urb);
 
-int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
-       u16 wValue, u16 wIndex, u16 wLength, u8 *pbyBuffer)
+int vnt_control_out(struct vnt_private *priv, u8 request, u16 value,
+               u16 index, u16 length, u8 *buffer)
 {
-       int ntStatus;
-
-    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;
-    }
-
-    ntStatus = usb_control_msg(
-                            pDevice->usb,
-                            usb_sndctrlpipe(pDevice->usb , 0),
-                            byRequest,
-                            0x40, // RequestType
-                            wValue,
-                            wIndex,
-                           (void *) pbyBuffer,
-                            wLength,
-                            HZ
-                          );
-    if (ntStatus >= 0) {
-        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe ntStatus= %d\n", ntStatus);
-        ntStatus = 0;
-    } else {
-        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe fail, ntStatus= %d\n", ntStatus);
-    }
-
-    return ntStatus;
-}
-
-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;
+       int status = 0;
 
-       if (pDevice->Flags & fMP_CONTROL_READS)
+       if (priv->Flags & fMP_DISCONNECTED)
                return STATUS_FAILURE;
 
-       if (pDevice->pControlURB->hcpriv)
-               return STATUS_FAILURE;
+       mutex_lock(&priv->usb_lock);
 
-       MP_SET_FLAG(pDevice, fMP_CONTROL_WRITES);
-
-       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);
-
-       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);
-               return STATUS_FAILURE;
-       }
+       status = usb_control_msg(priv->usb,
+               usb_sndctrlpipe(priv->usb, 0), request, 0x40, value,
+                       index, buffer, length, USB_CTL_WAIT);
 
-       spin_unlock_irq(&pDevice->lock);
-    for (ii = 0; ii <= USB_CTL_WAIT; ii ++) {
+       mutex_unlock(&priv->usb_lock);
 
-       if (pDevice->Flags & fMP_CONTROL_WRITES)
-               mdelay(1);
-        else
-               break;
+       if (status < (int)length)
+               return STATUS_FAILURE;
 
-        if (ii >= USB_CTL_WAIT) {
-               DBG_PRT(MSG_LEVEL_DEBUG,
-                       KERN_INFO "control send request submission timeout\n");
-            spin_lock_irq(&pDevice->lock);
-            MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
-            return STATUS_FAILURE;
-        }
-    }
-       spin_lock_irq(&pDevice->lock);
-
-    return STATUS_SUCCESS;
+       return STATUS_SUCCESS;
 }
 
-int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
-       u16 wIndex, u16 wLength,  u8 *pbyBuffer)
-       __releases(&pDevice->lock)
-       __acquires(&pDevice->lock)
+void vnt_control_out_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 data)
 {
-       int ntStatus = 0;
-       int ii;
-
-    if (pDevice->Flags & fMP_DISCONNECTED)
-        return STATUS_FAILURE;
-
-    if (pDevice->Flags & fMP_CONTROL_READS)
-       return STATUS_FAILURE;
-
-       if (pDevice->Flags & fMP_CONTROL_WRITES)
-               return STATUS_FAILURE;
+       vnt_control_out(priv, MESSAGE_TYPE_WRITE,
+                                       reg_off, reg, sizeof(u8), &data);
+}
 
-       if (pDevice->pControlURB->hcpriv)
-               return STATUS_FAILURE;
+int vnt_control_in(struct vnt_private *priv, u8 request, u16 value,
+               u16 index, u16 length, u8 *buffer)
+{
+       int status;
 
-       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);
+       if (priv->Flags & fMP_DISCONNECTED)
                return STATUS_FAILURE;
-       }
 
-       spin_unlock_irq(&pDevice->lock);
-    for (ii = 0; ii <= USB_CTL_WAIT; ii ++) {
+       mutex_lock(&priv->usb_lock);
 
-       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");
-            spin_lock_irq(&pDevice->lock);
-            MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
-            return STATUS_FAILURE;
-        }
-    }
-       spin_lock_irq(&pDevice->lock);
-
-    return ntStatus;
-}
+       status = usb_control_msg(priv->usb,
+               usb_rcvctrlpipe(priv->usb, 0), request, 0xc0, value,
+                       index, buffer, length, USB_CTL_WAIT);
 
-static void s_nsControlInUsbIoCompleteWrite(struct urb *urb)
-{
-       struct vnt_private *pDevice = (struct vnt_private *)urb->context;
+       mutex_unlock(&priv->usb_lock);
 
-       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);
-       }
+       if (status < (int)length)
+               return STATUS_FAILURE;
 
-    MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
+       return STATUS_SUCCESS;
 }
 
-/*
- * 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)
+void vnt_control_in_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 *data)
 {
-       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);
-       }
-
-    MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
+       vnt_control_in(priv, MESSAGE_TYPE_READ,
+                       reg_off, reg, sizeof(u8), data);
 }
 
 /*
@@ -303,9 +135,6 @@ int PIPEnsInterruptRead(struct vnt_private *priv)
 {
        int status = STATUS_FAILURE;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "---->s_nsStartInterruptUsbRead()\n");
-
        if (priv->int_buf.in_use == true)
                return STATUS_FAILURE;
 
@@ -322,14 +151,10 @@ int PIPEnsInterruptRead(struct vnt_private *priv)
 
        status = usb_submit_urb(priv->pInterruptURB, GFP_ATOMIC);
        if (status) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "Submit int URB failed %d\n", status);
+               dev_dbg(&priv->usb->dev, "Submit int URB failed %d\n", status);
                priv->int_buf.in_use = false;
        }
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-               "<----s_nsStartInterruptUsbRead Return(%x)\n", status);
-
        return status;
 }
 
@@ -353,9 +178,6 @@ static void s_nsInterruptUsbIoCompleteRead(struct urb *urb)
        struct vnt_private *priv = urb->context;
        int status;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "---->s_nsInterruptUsbIoCompleteRead\n");
-
        switch (urb->status) {
        case 0:
        case -ETIMEDOUT:
@@ -371,22 +193,17 @@ static void s_nsInterruptUsbIoCompleteRead(struct urb *urb)
 
        status = urb->status;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-               "s_nsInterruptUsbIoCompleteRead Status %d\n", status);
-
        if (status != STATUS_SUCCESS) {
                priv->int_buf.in_use = false;
 
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "IntUSBIoCompleteControl STATUS = %d\n", status);
+               dev_dbg(&priv->usb->dev, "%s status = %d\n", __func__, status);
        } else {
                INTnsProcessData(priv);
        }
 
        status = usb_submit_urb(priv->pInterruptURB, GFP_ATOMIC);
        if (status) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "Submit int URB failed %d\n", status);
+               dev_dbg(&priv->usb->dev, "Submit int URB failed %d\n", status);
        } else {
                priv->int_buf.in_use = true;
        }
@@ -413,14 +230,12 @@ int PIPEnsBulkInUsbRead(struct vnt_private *priv, struct vnt_rcb *rcb)
        int status = 0;
        struct urb *urb;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsStartBulkInUsbRead\n");
-
        if (priv->Flags & fMP_DISCONNECTED)
                return STATUS_FAILURE;
 
        urb = rcb->pUrb;
        if (rcb->skb == NULL) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"rcb->skb is null\n");
+               dev_dbg(&priv->usb->dev, "rcb->skb is null\n");
                return status;
        }
 
@@ -434,8 +249,7 @@ int PIPEnsBulkInUsbRead(struct vnt_private *priv, struct vnt_rcb *rcb)
 
        status = usb_submit_urb(urb, GFP_ATOMIC);
        if (status != 0) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                               "Submit Rx URB failed %d\n", status);
+               dev_dbg(&priv->usb->dev, "Submit Rx URB failed %d\n", status);
                return STATUS_FAILURE ;
        }
 
@@ -464,10 +278,9 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb)
 {
        struct vnt_rcb *rcb = urb->context;
        struct vnt_private *priv = rcb->pDevice;
+       unsigned long flags;
        int re_alloc_skb = false;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkInUsbIoCompleteRead\n");
-
        switch (urb->status) {
        case 0:
                break;
@@ -477,29 +290,29 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb)
                return;
        case -ETIMEDOUT:
        default:
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                               "BULK In failed %d\n", urb->status);
+               dev_dbg(&priv->usb->dev, "BULK In failed %d\n", urb->status);
                break;
        }
 
        if (urb->actual_length) {
-               spin_lock(&priv->lock);
+               spin_lock_irqsave(&priv->lock, flags);
 
                if (RXbBulkInProcessData(priv, rcb, urb->actual_length) == true)
                        re_alloc_skb = true;
 
-               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->lock, flags);
        }
 
        rcb->Ref--;
        if (rcb->Ref == 0) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeNormal %d\n",
-                                                       priv->NumRecvFreeList);
-               spin_lock(&priv->lock);
+               dev_dbg(&priv->usb->dev,
+                               "RxvFreeNormal %d\n", priv->NumRecvFreeList);
+
+               spin_lock_irqsave(&priv->lock, flags);
 
                RXvFreeRCB(rcb, re_alloc_skb);
 
-               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->lock, flags);
        }
 
        return;
@@ -527,28 +340,26 @@ int PIPEnsSendBulkOut(struct vnt_private *priv,
 
        priv->bPWBitOn = false;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_nsSendBulkOut\n");
-
        if (!(MP_IS_READY(priv) && priv->Flags & fMP_POST_WRITES)) {
-               context->bBoolInUse = false;
+               context->in_use = false;
                return STATUS_RESOURCES;
        }
 
-       urb = context->pUrb;
+       urb = context->urb;
 
        usb_fill_bulk_urb(urb,
                        priv->usb,
                        usb_sndbulkpipe(priv->usb, 3),
-                       context->Data,
-                       context->uBufLen,
+                       context->data,
+                       context->buf_len,
                        s_nsBulkOutIoCompleteWrite,
                        context);
 
        status = usb_submit_urb(urb, GFP_ATOMIC);
        if (status != 0) {
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                               "Submit Tx URB failed %d\n", status);
-               context->bBoolInUse = false;
+               dev_dbg(&priv->usb->dev, "Submit Tx URB failed %d\n", status);
+
+               context->in_use = false;
                return STATUS_FAILURE;
        }
 
@@ -586,25 +397,21 @@ int PIPEnsSendBulkOut(struct vnt_private *priv,
 static void s_nsBulkOutIoCompleteWrite(struct urb *urb)
 {
        struct vnt_usb_send_context *context = urb->context;
-       struct vnt_private *priv = context->pDevice;
+       struct vnt_private *priv = context->priv;
        u8 context_type = context->type;
 
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkOutIoCompleteWrite\n");
-
        switch (urb->status) {
        case 0:
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                       "Write %d bytes\n", context->uBufLen);
+               dev_dbg(&priv->usb->dev, "Write %d bytes\n", context->buf_len);
                break;
        case -ECONNRESET:
        case -ENOENT:
        case -ESHUTDOWN:
-               context->bBoolInUse = false;
+               context->in_use = false;
                return;
        case -ETIMEDOUT:
        default:
-               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                               "BULK Out failed %d\n", urb->status);
+               dev_dbg(&priv->usb->dev, "BULK Out failed %d\n", urb->status);
                break;
        }
 
@@ -612,11 +419,11 @@ static void s_nsBulkOutIoCompleteWrite(struct urb *urb)
                return;
 
        if (CONTEXT_DATA_PACKET == context_type) {
-               if (context->pPacket != NULL) {
-                       dev_kfree_skb_irq(context->pPacket);
-                       context->pPacket = NULL;
-                       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
-                               "tx  %d bytes\n", context->uBufLen);
+               if (context->skb != NULL) {
+                       dev_kfree_skb_irq(context->skb);
+                       context->skb = NULL;
+                       dev_dbg(&priv->usb->dev,
+                                       "tx  %d bytes\n", context->buf_len);
                }
 
                priv->dev->trans_start = jiffies;
@@ -627,7 +434,7 @@ static void s_nsBulkOutIoCompleteWrite(struct urb *urb)
                        netif_wake_queue(priv->dev);
        }
 
-       context->bBoolInUse = false;
+       context->in_use = false;
 
        return;
 }