OSDN Git Service

staging: vt6656: lock changes: csMgmt_xmit.
authorMalcolm Priestley <tvboxspy@gmail.com>
Thu, 15 May 2014 21:49:15 +0000 (22:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 May 2014 22:02:19 +0000 (15:02 -0700)
csMgmt_xmit is nolonger atomically called but part of must be.

Reorder the function so that RFbSetPower is called first.

Add new lock spinlock for the remainder of the function.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vt6656/rxtx.c

index 52be7b0..c6ac263 100644 (file)
@@ -1383,13 +1383,32 @@ CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
        u16 wTxBufSize;
        u32 cbMacHdLen;
        u16 wCurrentRate = RATE_1M;
+       unsigned long flags;
 
-       pContext = s_vGetFreeContext(pDevice);
+       if (pDevice->byBBType == BB_TYPE_11A) {
+               wCurrentRate = RATE_6M;
+               byPktType = PK_TYPE_11A;
+       } else {
+               wCurrentRate = RATE_1M;
+               byPktType = PK_TYPE_11B;
+       }
 
-    if (NULL == pContext) {
-        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
-        return CMD_STATUS_RESOURCES;
-    }
+       if (pMgmt->eScanState != WMAC_NO_SCANNING)
+               RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
+       else
+               RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
+
+       pDevice->wCurrentRate = wCurrentRate;
+
+       spin_lock_irqsave(&pDevice->lock, flags);
+
+       pContext = s_vGetFreeContext(pDevice);
+       if (!pContext) {
+               DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
+                       "ManagementSend TX...NO CONTEXT!\n");
+               spin_unlock_irqrestore(&pDevice->lock, flags);
+               return CMD_STATUS_RESOURCES;
+       }
 
        pTX_Buffer = (struct vnt_tx_buffer *)&pContext->data[0];
     cbFrameBodySize = pPacket->cbPayloadLen;
@@ -1397,24 +1416,6 @@ CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
        pbyTxBufferAddr = (u8 *)&pTxBufHead->adwTxKey[0];
        wTxBufSize = sizeof(struct vnt_tx_fifo_head);
 
-    if (pDevice->byBBType == BB_TYPE_11A) {
-        wCurrentRate = RATE_6M;
-        byPktType = PK_TYPE_11A;
-    } else {
-        wCurrentRate = RATE_1M;
-        byPktType = PK_TYPE_11B;
-    }
-
-    // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
-    // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
-    //                    And cmd timer will wait data pkt TX finish before scanning so it's OK
-    //                    to set power here.
-    if (pMgmt->eScanState != WMAC_NO_SCANNING) {
-        RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
-    } else {
-        RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
-    }
-    pDevice->wCurrentRate = wCurrentRate;
 
     //Set packet type
     if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
@@ -1625,6 +1626,9 @@ CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
     }
 
     PIPEnsSendBulkOut(pDevice,pContext);
+
+       spin_unlock_irqrestore(&pDevice->lock, flags);
+
     return CMD_STATUS_PENDING;
 }