📄 cmm_data.c
字号:
*pQueIdx = QID_AC_VO; return (&pAd->TxSwQueue[QID_AC_VO]); } else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL) { *pQueIdx = QID_AC_VI; return (&pAd->TxSwQueue[QID_AC_VI]); } else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL) { *pQueIdx = QID_AC_BE; return (&pAd->TxSwQueue[QID_AC_BE]); } else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL) { *pQueIdx = QID_AC_BK; return (&pAd->TxSwQueue[QID_AC_BK]); } else if (pAd->TxSwQueue[QID_HCCA].Head != NULL) { *pQueIdx = QID_HCCA; return (&pAd->TxSwQueue[QID_HCCA]); } // No packet pending in Tx Sw queue *pQueIdx = QID_AC_BK; return (NULL);}/* ======================================================================== Routine Description: Process TX Rings DMA Done interrupt, running in DPC level Arguments: Adapter Pointer to our adapter Return Value: None IRQL = DISPATCH_LEVEL ========================================================================*/BOOLEAN RTMPHandleTxRingDmaDoneInterrupt( IN PRTMP_ADAPTER pAd, IN INT_SOURCE_CSR_STRUC TxRingBitmap){// UCHAR Count = 0; unsigned long IrqFlags; BOOLEAN bReschedule = FALSE; // Make sure Tx ring resource won't be used by other threads //NdisAcquireSpinLock(&pAd->TxRingLock); RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); if (TxRingBitmap.field.Ac0DmaDone) bReschedule = RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BE); if (TxRingBitmap.field.HccaDmaDone) bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_HCCA); if (TxRingBitmap.field.Ac3DmaDone) bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VO); if (TxRingBitmap.field.Ac2DmaDone) bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VI); if (TxRingBitmap.field.Ac1DmaDone) bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BK); // Make sure to release Tx ring resource //NdisReleaseSpinLock(&pAd->TxRingLock); RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); // Dequeue outgoing frames from TxSwQueue[] and process it RTMPDeQueuePacket(pAd, FALSE, MAX_TX_PROCESS); return bReschedule;}/* ======================================================================== Routine Description: Process MGMT ring DMA done interrupt, running in DPC level Arguments: pAd Pointer to our adapter Return Value: None IRQL = DISPATCH_LEVEL Note: ========================================================================*/VOID RTMPHandleMgmtRingDmaDoneInterrupt( IN PRTMP_ADAPTER pAd){ PTXD_STRUC pTxD;#ifdef BIG_ENDIAN PTXD_STRUC pDestTxD; TXD_STRUC TxD;#endif PNDIS_PACKET pPacket;// int i; UCHAR FREE = 0; PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing; NdisAcquireSpinLock(&pAd->MgmtRingLock); RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pMgmtRing->TxDmaIdx); while (pMgmtRing->TxSwFreeIdx!= pMgmtRing->TxDmaIdx) { FREE++;#ifndef BIG_ENDIAN pTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa);#else pDestTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa); TxD = *pDestTxD; pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif pTxD->DMADONE = 0; pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket = NULL; pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket = NULL; INC_RING_INDEX(pMgmtRing->TxSwFreeIdx, MGMT_RING_SIZE);#ifdef BIG_ENDIAN RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, TRUE, TYPE_TXD);#endif } NdisReleaseSpinLock(&pAd->MgmtRingLock);}/* ======================================================================== Routine Description: Arguments: Adapter Pointer to our adapter. Dequeue all power safe delayed braodcast frames after beacon. IRQL = DISPATCH_LEVEL ========================================================================*/VOID RTMPHandleTBTTInterrupt( IN PRTMP_ADAPTER pAd){ { if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) { DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandleTBTTInterrupt...\n")); } }}/* ======================================================================== Routine Description: Arguments: Adapter Pointer to our adapter. Rewrite beacon content before next send-out. IRQL = DISPATCH_LEVEL ========================================================================*/VOID RTMPHandlePreTBTTInterrupt( IN PRTMP_ADAPTER pAd){ { if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) { DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandlePreTBTTInterrupt...\n")); } }}VOID RTMPHandleRxCoherentInterrupt( IN PRTMP_ADAPTER pAd){ WPDMA_GLO_CFG_STRUC GloCfg; DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPHandleRxCoherentInterrupt \n")); RTMP_IO_READ32(pAd, WPDMA_GLO_CFG , &GloCfg.word); GloCfg.field.EnTXWriteBackDDONE = 0; GloCfg.field.EnableRxDMA = 0; GloCfg.field.EnableTxDMA = 0; RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); RTMPRingCleanUp(pAd, QID_AC_BE); RTMPRingCleanUp(pAd, QID_AC_BK); RTMPRingCleanUp(pAd, QID_AC_VI); RTMPRingCleanUp(pAd, QID_AC_VO); RTMPRingCleanUp(pAd, QID_HCCA); RTMPRingCleanUp(pAd, QID_MGMT); RTMPRingCleanUp(pAd, QID_RX); RTMPEnableRxTx(pAd); DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n")); }VOID DBGPRINT_TX_RING( IN PRTMP_ADAPTER pAd, IN UCHAR QueIdx){ ULONG Ac0Base; ULONG Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx; int i;// PULONG pTxD; PULONG ptemp; DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n " )); switch (QueIdx) { case QID_AC_BE: RTMP_IO_READ32(pAd, TX_BASE_PTR0, &Ac0Base); RTMP_IO_READ32(pAd, TX_CTX_IDX0, &Ac0SwIdx); RTMP_IO_READ32(pAd, TX_DTX_IDX0, &Ac0HwIdx); DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BE DESCRIPTOR \n " )); for (i=0;i<TX_RING_SIZE;i++) { ptemp= (PULONG)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); break; case QID_AC_BK: RTMP_IO_READ32(pAd, TX_BASE_PTR1, &Ac0Base); RTMP_IO_READ32(pAd, TX_CTX_IDX1, &Ac0SwIdx); RTMP_IO_READ32(pAd, TX_DTX_IDX1, &Ac0HwIdx); DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BK DESCRIPTOR \n " )); for (i=0;i<TX_RING_SIZE;i++) { ptemp= (PULONG)pAd->TxRing[QID_AC_BK].Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); break; case QID_AC_VI: RTMP_IO_READ32(pAd, TX_BASE_PTR2, &Ac0Base); RTMP_IO_READ32(pAd, TX_CTX_IDX2, &Ac0SwIdx); RTMP_IO_READ32(pAd, TX_DTX_IDX2, &Ac0HwIdx); DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VI DESCRIPTOR \n " )); for (i=0;i<TX_RING_SIZE;i++) { ptemp= (PULONG)pAd->TxRing[QID_AC_VI].Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); break; case QID_AC_VO: RTMP_IO_READ32(pAd, TX_BASE_PTR3, &Ac0Base); RTMP_IO_READ32(pAd, TX_CTX_IDX3, &Ac0SwIdx); RTMP_IO_READ32(pAd, TX_DTX_IDX3, &Ac0HwIdx); DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VO DESCRIPTOR \n " )); for (i=0;i<TX_RING_SIZE;i++) { ptemp= (PULONG)pAd->TxRing[QID_AC_VO].Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); break; case QID_MGMT: RTMP_IO_READ32(pAd, TX_BASE_PTR5, &Ac0Base); RTMP_IO_READ32(pAd, TX_CTX_IDX5, &Ac0SwIdx); RTMP_IO_READ32(pAd, TX_DTX_IDX5, &Ac0HwIdx); DBGPRINT_RAW(RT_DEBUG_TRACE, (" All QID_MGMT DESCRIPTOR \n " )); for (i=0;i<MGMT_RING_SIZE;i++) { ptemp= (PULONG)pAd->MgmtRing.Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); break; default: DBGPRINT_ERR(("DBGPRINT_TX_RING(Ring %d) not supported\n", QueIdx)); break; } AC0freeIdx = pAd->TxRing[QueIdx].TxSwFreeIdx; DBGPRINT(RT_DEBUG_TRACE,("TxRing%d, TX_DTX_IDX=%ld, TX_CTX_IDX=%ld\n", QueIdx, Ac0HwIdx, Ac0SwIdx)); DBGPRINT_RAW(RT_DEBUG_TRACE,(" TxSwFreeIdx[%ld]", AC0freeIdx)); DBGPRINT_RAW(RT_DEBUG_TRACE,(" pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount)); }VOID DBGPRINT_RX_RING( IN PRTMP_ADAPTER pAd){ ULONG Ac0Base; ULONG Ac0HwIdx, Ac0SwIdx, AC0freeIdx;// PULONG pTxD; int i; UINT32 *ptemp;// PRXD_STRUC pRxD; DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n " )); RTMP_IO_READ32(pAd, RX_BASE_PTR, &Ac0Base); RTMP_IO_READ32(pAd, RX_CRX_IDX, &Ac0SwIdx); RTMP_IO_READ32(pAd, RX_DRX_IDX, &Ac0HwIdx); AC0freeIdx = pAd->RxRing.RxSwReadIdx; DBGPRINT_RAW(RT_DEBUG_TRACE, ("All RX DSP \n " )); for (i=0;i<RX_RING_SIZE;i++) { ptemp = (UINT32 *)pAd->RxRing.Cell[i].AllocVa; DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08x: %08x: %08x: %08x\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); } DBGPRINT(RT_DEBUG_TRACE,("RxRing, RX_DRX_IDX=%ld, RX_CRX_IDX=%ld \n", Ac0HwIdx, Ac0SwIdx)); DBGPRINT_RAW(RT_DEBUG_TRACE,(" RxSwReadIdx [%ld]=", AC0freeIdx)); DBGPRINT_RAW(RT_DEBUG_TRACE,(" pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount));}/* ======================================================================== Routine Description: Suspend MSDU transmission Arguments: pAd Pointer to our adapter Return Value: None Note: ========================================================================*/VOID RTMPSuspendMsduTransmission( IN PRTMP_ADAPTER pAd){ DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n")); // // Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and // use Lowbound as R66 value on ScanNextChannel(...) // RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); // set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning) RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd))); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000); // abort all TX rings}/* ======================================================================== Routine Description: Resume MSDU transmission Arguments: pAd Pointer to our adapter Return Value: None IRQL = DISPATCH_LEVEL Note: ========================================================================*/VOID RTMPResumeMsduTransmission( IN PRTMP_ADAPTER pAd){ UCHAR IrqState; DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n")); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); IrqState = pAd->irq_disabled; if (IrqState) RTMPDeQueuePacket(pAd, TRUE, MAX_TX_PROCESS); else RTMPDeQueuePacket(pAd, FALSE, MAX_TX_PROCESS);}UINT deaggregate_AMSDU_announce( IN PRTMP_ADAPTER pAd, PNDIS_PACKET pPacket, IN PUCHAR pData, IN ULONG DataSize) { USHORT PayloadSize; USHORT SubFrameSize; PHEADER_802_3 pAMSDUsubheader; UINT nMSDU; UCHAR Header802_3[14]; PUCHAR pPayload, pDA, pSA, pRemovedLLCSNAP; PNDIS_PACKET pClonePacket; nMSDU = 0; while (DataSize > LENGTH_802_3) { nMSDU++; //hex_dump("subheader", pData, 64); pAMSDUsubheader = (PHEADER_802_3)pData; //pData += LENGTH_802_3; PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8); SubFrameSize = PayloadSize + LENGTH_802_3; if ((DataSize < SubFrameSize) || (PayloadSize > 1518 )) { break; } //printk("%d subframe: Size = %d\n", nMSDU, PayloadSize); pPayload = pData + LENGTH_802_3; pDA = pData; pSA = pData + MAC_ADDR_LEN; // convert to 802.3 header CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);#ifdef CONFIG_STA_SUPPORT if (pRemovedLLCSNAP) { pPayload -= LENGTH_802_3; PayloadSize += LENGTH_802_3; NdisMoveMemory(pPayload, &Header802_3, LENGTH_802_3); }#endif // CONFIG_STA_SUPPORT // pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -