aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rt2860/sta/rtmp_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt2860/sta/rtmp_data.c')
-rw-r--r--drivers/staging/rt2860/sta/rtmp_data.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/drivers/staging/rt2860/sta/rtmp_data.c b/drivers/staging/rt2860/sta/rtmp_data.c
index b5cceaa3ae7..b41ce230c50 100644
--- a/drivers/staging/rt2860/sta/rtmp_data.c
+++ b/drivers/staging/rt2860/sta/rtmp_data.c
@@ -74,6 +74,7 @@ VOID STARxEAPOLFrameIndicate(
74 74
75 if (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0) 75 if (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0)
76 { 76 {
77#ifdef RT2860
77 MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID]; 78 MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID];
78 79
79 // Set key material and cipherAlg to Asic 80 // Set key material and cipherAlg to Asic
@@ -87,6 +88,32 @@ VOID STARxEAPOLFrameIndicate(
87 88
88 pAd->IndicateMediaState = NdisMediaStateConnected; 89 pAd->IndicateMediaState = NdisMediaStateConnected;
89 pAd->ExtraInfo = GENERAL_LINK_UP; 90 pAd->ExtraInfo = GENERAL_LINK_UP;
91#endif
92#ifdef RT2870
93 union
94 {
95 char buf[sizeof(NDIS_802_11_WEP)+MAX_LEN_OF_KEY- 1];
96 NDIS_802_11_WEP keyinfo;
97 } WepKey;
98 int len;
99
100
101 NdisZeroMemory(&WepKey, sizeof(WepKey));
102 len =pAd->StaCfg.DesireSharedKey[idx].KeyLen;
103
104 NdisMoveMemory(WepKey.keyinfo.KeyMaterial,
105 pAd->StaCfg.DesireSharedKey[idx].Key,
106 pAd->StaCfg.DesireSharedKey[idx].KeyLen);
107
108 WepKey.keyinfo.KeyIndex = 0x80000000 + idx;
109 WepKey.keyinfo.KeyLength = len;
110 pAd->SharedKey[BSS0][idx].KeyLen =(UCHAR) (len <= 5 ? 5 : 13);
111
112 pAd->IndicateMediaState = NdisMediaStateConnected;
113 pAd->ExtraInfo = GENERAL_LINK_UP;
114 // need to enqueue cmd to thread
115 RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_WEP, TRUE, &WepKey, sizeof(WepKey.keyinfo) + len - 1);
116#endif // RT2870 //
90 // For Preventing ShardKey Table is cleared by remove key procedure. 117 // For Preventing ShardKey Table is cleared by remove key procedure.
91 pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg; 118 pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg;
92 pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen; 119 pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen;
@@ -548,7 +575,13 @@ VOID STAHandleRxMgmtFrame(
548 { 575 {
549 576
550 // We should collect RSSI not only U2M data but also my beacon 577 // We should collect RSSI not only U2M data but also my beacon
578#ifdef RT30xx
579 if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))
580 && (pAd->RxAnt.EvaluatePeriod == 0))
581#endif
582#ifndef RT30xx
551 if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))) 583 if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)))
584#endif
552 { 585 {
553 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI); 586 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
554 587
@@ -556,6 +589,18 @@ VOID STAHandleRxMgmtFrame(
556 pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1); 589 pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1);
557 } 590 }
558 591
592#ifdef RT30xx
593 // collect rssi information for antenna diversity
594 if (pAd->NicConfig2.field.AntDiversity)
595 {
596 if ((pRxD->U2M) || ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))))
597 {
598 COLLECT_RX_ANTENNA_AVERAGE_RSSI(pAd, ConvertToRssi(pAd, (UCHAR)pRxWI->RSSI0, RSSI_0), 0); //Note: RSSI2 not used on RT73
599 pAd->StaCfg.NumOfAvgRssiSample ++;
600 }
601 }
602#endif // RT30xx //
603
559 // First check the size, it MUST not exceed the mlme queue size 604 // First check the size, it MUST not exceed the mlme queue size
560 if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE) 605 if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE)
561 { 606 {
@@ -643,12 +688,14 @@ BOOLEAN STARxDoneInterruptHandle(
643 break; 688 break;
644 } 689 }
645 690
691#ifdef RT2860
646 if (RxProcessed++ > MAX_RX_PROCESS_CNT) 692 if (RxProcessed++ > MAX_RX_PROCESS_CNT)
647 { 693 {
648 // need to reschedule rx handle 694 // need to reschedule rx handle
649 bReschedule = TRUE; 695 bReschedule = TRUE;
650 break; 696 break;
651 } 697 }
698#endif
652 699
653 RxProcessed ++; // test 700 RxProcessed ++; // test
654 701
@@ -738,6 +785,7 @@ BOOLEAN STARxDoneInterruptHandle(
738 } 785 }
739 } 786 }
740 787
788#ifdef RT2860
741 // fRTMP_PS_GO_TO_SLEEP_NOW is set if receiving beacon. 789 // fRTMP_PS_GO_TO_SLEEP_NOW is set if receiving beacon.
742 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW) && (INFRA_ON(pAd))) 790 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW) && (INFRA_ON(pAd)))
743 { 791 {
@@ -745,6 +793,7 @@ BOOLEAN STARxDoneInterruptHandle(
745 AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp); 793 AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp);
746 bReschedule = FALSE; 794 bReschedule = FALSE;
747 } 795 }
796#endif
748 return bReschedule; 797 return bReschedule;
749} 798}
750 799
@@ -762,7 +811,12 @@ BOOLEAN STARxDoneInterruptHandle(
762VOID RTMPHandleTwakeupInterrupt( 811VOID RTMPHandleTwakeupInterrupt(
763 IN PRTMP_ADAPTER pAd) 812 IN PRTMP_ADAPTER pAd)
764{ 813{
814#ifdef RT2860
765 AsicForceWakeup(pAd, DOT11POWERSAVE); 815 AsicForceWakeup(pAd, DOT11POWERSAVE);
816#endif
817#ifdef RT2870
818 AsicForceWakeup(pAd, FALSE);
819#endif
766} 820}
767 821
768/* 822/*
@@ -1011,7 +1065,13 @@ NDIS_STATUS STASendPacket(
1011 // 1065 //
1012 UserPriority = 0; 1066 UserPriority = 0;
1013 QueIdx = QID_AC_BE; 1067 QueIdx = QID_AC_BE;
1068#ifdef RT2860
1014 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)) 1069 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1070#endif
1071#ifdef RT2870
1072 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) &&
1073 CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))
1074#endif
1015 { 1075 {
1016 USHORT Protocol; 1076 USHORT Protocol;
1017 UCHAR LlcSnapLen = 0, Byte0, Byte1; 1077 UCHAR LlcSnapLen = 0, Byte0, Byte1;
@@ -1075,7 +1135,12 @@ NDIS_STATUS STASendPacket(
1075 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); 1135 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
1076 1136
1077 if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&& 1137 if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&&
1138#ifdef RT2860
1078 (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) 1139 (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE))
1140#endif
1141#ifdef RT2870
1142 IS_HT_STA(pEntry))
1143#endif
1079 { 1144 {
1080 if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) && 1145 if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) &&
1081 ((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) && 1146 ((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) &&
@@ -1119,14 +1184,27 @@ NDIS_STATUS STASendPacket(
1119 1184
1120 ======================================================================== 1185 ========================================================================
1121*/ 1186*/
1187
1188#ifdef RT2870
1189/*
1190 Actually, this function used to check if the TxHardware Queue still has frame need to send.
1191 If no frame need to send, go to sleep, else, still wake up.
1192*/
1193#endif
1122NDIS_STATUS RTMPFreeTXDRequest( 1194NDIS_STATUS RTMPFreeTXDRequest(
1123 IN PRTMP_ADAPTER pAd, 1195 IN PRTMP_ADAPTER pAd,
1124 IN UCHAR QueIdx, 1196 IN UCHAR QueIdx,
1125 IN UCHAR NumberRequired, 1197 IN UCHAR NumberRequired,
1126 IN PUCHAR FreeNumberIs) 1198 IN PUCHAR FreeNumberIs)
1127{ 1199{
1200#ifdef RT2860
1128 ULONG FreeNumber = 0; 1201 ULONG FreeNumber = 0;
1202#endif
1129 NDIS_STATUS Status = NDIS_STATUS_FAILURE; 1203 NDIS_STATUS Status = NDIS_STATUS_FAILURE;
1204#ifdef RT2870
1205 unsigned long IrqFlags;
1206 HT_TX_CONTEXT *pHTTXContext;
1207#endif
1130 1208
1131 switch (QueIdx) 1209 switch (QueIdx)
1132 { 1210 {
@@ -1135,6 +1213,7 @@ NDIS_STATUS RTMPFreeTXDRequest(
1135 case QID_AC_VI: 1213 case QID_AC_VI:
1136 case QID_AC_VO: 1214 case QID_AC_VO:
1137 case QID_HCCA: 1215 case QID_HCCA:
1216#ifdef RT2860
1138 if (pAd->TxRing[QueIdx].TxSwFreeIdx > pAd->TxRing[QueIdx].TxCpuIdx) 1217 if (pAd->TxRing[QueIdx].TxSwFreeIdx > pAd->TxRing[QueIdx].TxCpuIdx)
1139 FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx - pAd->TxRing[QueIdx].TxCpuIdx - 1; 1218 FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx - pAd->TxRing[QueIdx].TxCpuIdx - 1;
1140 else 1219 else
@@ -1142,9 +1221,27 @@ NDIS_STATUS RTMPFreeTXDRequest(
1142 1221
1143 if (FreeNumber >= NumberRequired) 1222 if (FreeNumber >= NumberRequired)
1144 Status = NDIS_STATUS_SUCCESS; 1223 Status = NDIS_STATUS_SUCCESS;
1224#endif
1225#ifdef RT2870
1226 {
1227 pHTTXContext = &pAd->TxContext[QueIdx];
1228 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
1229 if ((pHTTXContext->CurWritePosition != pHTTXContext->ENextBulkOutPosition) ||
1230 (pHTTXContext->IRPPending == TRUE))
1231 {
1232 Status = NDIS_STATUS_FAILURE;
1233 }
1234 else
1235 {
1236 Status = NDIS_STATUS_SUCCESS;
1237 }
1238 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
1239 }
1240#endif
1145 break; 1241 break;
1146 1242
1147 case QID_MGMT: 1243 case QID_MGMT:
1244#ifdef RT2860
1148 if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx) 1245 if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx)
1149 FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1; 1246 FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1;
1150 else 1247 else
@@ -1152,13 +1249,22 @@ NDIS_STATUS RTMPFreeTXDRequest(
1152 1249
1153 if (FreeNumber >= NumberRequired) 1250 if (FreeNumber >= NumberRequired)
1154 Status = NDIS_STATUS_SUCCESS; 1251 Status = NDIS_STATUS_SUCCESS;
1252#endif
1253#ifdef RT2870
1254 if (pAd->MgmtRing.TxSwFreeIdx != MGMT_RING_SIZE)
1255 Status = NDIS_STATUS_FAILURE;
1256 else
1257 Status = NDIS_STATUS_SUCCESS;
1258#endif
1155 break; 1259 break;
1156 1260
1157 default: 1261 default:
1158 DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx)); 1262 DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx));
1159 break; 1263 break;
1160 } 1264 }
1265#ifdef RT2860
1161 *FreeNumberIs = (UCHAR)FreeNumber; 1266 *FreeNumberIs = (UCHAR)FreeNumber;
1267#endif
1162 1268
1163 return (Status); 1269 return (Status);
1164} 1270}
@@ -1689,7 +1795,9 @@ VOID STA_AMPDU_Frame_Tx(
1689 // 1795 //
1690 // Kick out Tx 1796 // Kick out Tx
1691 // 1797 //
1798#ifdef RT2860
1692 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) 1799 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
1800#endif
1693 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 1801 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
1694 1802
1695 pAd->RalinkCounters.KickTxCount++; 1803 pAd->RalinkCounters.KickTxCount++;
@@ -1820,7 +1928,9 @@ VOID STA_AMSDU_Frame_Tx(
1820 // 1928 //
1821 // Kick out Tx 1929 // Kick out Tx
1822 // 1930 //
1931#ifdef RT2860
1823 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) 1932 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
1933#endif
1824 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 1934 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
1825} 1935}
1826 1936
@@ -1940,7 +2050,9 @@ VOID STA_Legacy_Frame_Tx(
1940 // 2050 //
1941 // Kick out Tx 2051 // Kick out Tx
1942 // 2052 //
2053#ifdef RT2860
1943 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) 2054 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2055#endif
1944 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2056 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
1945} 2057}
1946 2058
@@ -2051,7 +2163,9 @@ VOID STA_ARalink_Frame_Tx(
2051 // 2163 //
2052 // Kick out Tx 2164 // Kick out Tx
2053 // 2165 //
2166#ifdef RT2860
2054 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) 2167 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2168#endif
2055 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2169 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2056 2170
2057} 2171}
@@ -2320,7 +2434,12 @@ NDIS_STATUS STAHardTransmit(
2320 if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 2434 if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
2321 { 2435 {
2322 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicForceWakeup At HardTx\n")); 2436 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicForceWakeup At HardTx\n"));
2437#ifdef RT2860
2323 AsicForceWakeup(pAd, FROM_TX); 2438 AsicForceWakeup(pAd, FROM_TX);
2439#endif
2440#ifdef RT2870
2441 AsicForceWakeup(pAd, TRUE);
2442#endif
2324 } 2443 }
2325 2444
2326 // It should not change PSM bit, when APSD turn on. 2445 // It should not change PSM bit, when APSD turn on.