diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-04-26 10:06:29 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-19 14:00:50 -0400 |
commit | 5f5d2df8ab0b5b6e8514c69b33cc92cac45cda75 (patch) | |
tree | c8d882729152ea8b4f5f774b7462a6bc4a980413 /drivers/staging/rt2860/sta/rtmp_data.c | |
parent | 371abf6def2dfa378b8012ca1d154909e5aecb1c (diff) |
Staging: rt2860: prepare for rt28[67]0/sta/*.[ch] merge
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/rt2860/sta/rtmp_data.c')
-rw-r--r-- | drivers/staging/rt2860/sta/rtmp_data.c | 119 |
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( | |||
762 | VOID RTMPHandleTwakeupInterrupt( | 811 | VOID 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 | ||
1122 | NDIS_STATUS RTMPFreeTXDRequest( | 1194 | NDIS_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. |