]> Pileus Git - ~andy/linux/blobdiff - drivers/staging/rt2870/common/cmm_data.c
Staging: rt2870: prepare for rt{28,30}70/common/*.[ch] merge
[~andy/linux] / drivers / staging / rt2870 / common / cmm_data.c
index 0ca1ab6c8d833f6ac5a556cc3a8c1dcf094c7b2d..0513321bc03caf3fefb83bd4ad959b08ab8989ef 100644 (file)
@@ -172,7 +172,114 @@ NDIS_STATUS MiniportMMRequest(
        return Status;
 }
 
+#ifdef RT30xx
+NDIS_STATUS MlmeDataHardTransmit(
+       IN      PRTMP_ADAPTER   pAd,
+       IN      UCHAR   QueIdx,
+       IN      PNDIS_PACKET    pPacket);
+
+#define MAX_DATAMM_RETRY       3
+/*
+       ========================================================================
+
+       Routine Description:
+               API for MLME to transmit management frame to AP (BSS Mode)
+       or station (IBSS Mode)
+
+       Arguments:
+               pAd Pointer to our adapter
+               pData           Pointer to the outgoing 802.11 frame
+               Length          Size of outgoing management frame
 
+       Return Value:
+               NDIS_STATUS_FAILURE
+               NDIS_STATUS_PENDING
+               NDIS_STATUS_SUCCESS
+
+       IRQL = PASSIVE_LEVEL
+       IRQL = DISPATCH_LEVEL
+
+       Note:
+
+       ========================================================================
+*/
+NDIS_STATUS MiniportDataMMRequest(
+                                                        IN  PRTMP_ADAPTER   pAd,
+                                                        IN  UCHAR           QueIdx,
+                                                        IN  PUCHAR          pData,
+                                                        IN  UINT            Length)
+{
+       PNDIS_PACKET    pPacket;
+       NDIS_STATUS  Status = NDIS_STATUS_SUCCESS;
+       ULONG    FreeNum;
+       int     retry = 0;
+       UCHAR           IrqState;
+       UCHAR                   rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; //RTMP_HW_HDR_LEN];
+
+       ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);
+
+       // 2860C use Tx Ring
+       IrqState = pAd->irq_disabled;
+
+       do
+       {
+               // Reset is in progress, stop immediately
+               if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
+                        RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)||
+                       !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))
+               {
+                       Status = NDIS_STATUS_FAILURE;
+                       break;
+               }
+
+               // Check Free priority queue
+               // Since we use PBF Queue2 for management frame.  Its corresponding DMA ring should be using TxRing.
+
+               // 2860C use Tx Ring
+
+               // free Tx(QueIdx) resources
+               FreeNum = GET_TXRING_FREENO(pAd, QueIdx);
+
+               if ((FreeNum > 0))
+               {
+                       // We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870
+                       NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE));
+                       Status = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE), pData, Length);
+                       if (Status != NDIS_STATUS_SUCCESS)
+                       {
+                               DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));
+                               break;
+                       }
+
+                       //pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
+                       //pAd->CommonCfg.MlmeRate = RATE_2;
+
+
+                       Status = MlmeDataHardTransmit(pAd, QueIdx, pPacket);
+                       if (Status != NDIS_STATUS_SUCCESS)
+                               RTMPFreeNdisPacket(pAd, pPacket);
+                       retry = MAX_DATAMM_RETRY;
+               }
+               else
+               {
+                       retry ++;
+
+                       printk("retry %d\n", retry);
+                       pAd->RalinkCounters.MgmtRingFullCount++;
+
+                       if (retry >= MAX_DATAMM_RETRY)
+                       {
+                               DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n",
+                                                                                       QueIdx, pAd->RalinkCounters.MgmtRingFullCount));
+                       }
+               }
+
+       } while (retry < MAX_DATAMM_RETRY);
+
+
+       return Status;
+}
+#endif /* RT30xx */
 
 
 /*
@@ -214,7 +321,23 @@ NDIS_STATUS MlmeHardTransmit(
 
 }
 
+#ifdef RT30xx
+NDIS_STATUS MlmeDataHardTransmit(
+       IN      PRTMP_ADAPTER   pAd,
+       IN      UCHAR   QueIdx,
+       IN      PNDIS_PACKET    pPacket)
+{
+       if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
+               )
+       {
+               return NDIS_STATUS_FAILURE;
+       }
 
+#ifdef RT2870
+       return MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);
+#endif // RT2870 //
+}
+#endif /* RT30xx */
 
 NDIS_STATUS MlmeHardTransmitMgmtRing(
        IN      PRTMP_ADAPTER   pAd,
@@ -614,6 +737,11 @@ BOOLEAN RTMP_FillTxBlkInfo(
        }
 
        return TRUE;
+
+#ifdef RT30xx
+FillTxBlkErr:
+       return FALSE;
+#endif
 }
 
 
@@ -701,6 +829,7 @@ VOID RTMPDeQueuePacket(
        if (QIdx == NUM_OF_TX_RING)
        {
                sQIdx = 0;
+//PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
                eQIdx = 3;      // 4 ACs, start from 0.
        }
        else
@@ -1413,7 +1542,15 @@ VOID RTMPResumeMsduTransmission(
 {
        DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));
 
-
+#ifdef RT30xx
+       // After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value
+       // R66 should not be 0
+       if (pAd->BbpTuning.R66CurrentValue == 0)
+       {
+               pAd->BbpTuning.R66CurrentValue = 0x38;
+               DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n"));
+       }
+#endif
        RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);
 
        RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
@@ -1774,7 +1911,12 @@ BOOLEAN MacTableDeleteEntry(
        if (pAd->MacTab.Size == 0)
        {
                pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;
+#ifndef RT30xx
                AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);
+#endif
+#ifdef RT30xx
+               RT28XX_UPDATE_PROTECT(pAd);  // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
+#endif
        }
 
        return TRUE;