📄 txproc.c
字号:
Adapter->TxPacketSendComplete++; //dralee_20051128 if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected ) { LeaveCriticalSection(&Adapter->TxCriticalSection); CleanUpSingleTxBuffer(Adapter); ResetRxPDQ(Adapter); return NDIS_STATUS_FAILURE; } DBGPRINT(DBG_TXDATADUMP,("[Marvell:HandleTxSingleDoneEvent] Adapter->TxPacketSendComplete=%d\n", Adapter->TxPacketSendComplete)); #ifdef WMM_UAPSD if( Adapter->psState != PS_STATE_SLEEP ) { if( Adapter->TxPacketCount ) { TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode); //++dralee_20060327 Adapter->TxPacketCount--; pPacket = pTQNode -> pPacket; if(pPacket) { #ifdef RETQ_TIMER Status = SendSinglePacket(Adapter,pPacket); #else Status = SendSinglePacket(Adapter,pPacket,&(pTQNode->DnldPacket)); #endif if(Status == NDIS_STATUS_SUCCESS) { PushFreeTxQNode(Adapter->TxFreeQ,pTQNode); //Adapter->TxPacketCount--; //++dralee_20060327 } else { RETAILMSG(1,(TEXT("[TxDone] Send packet fail\r\n"))); //Error handling , push back this node InsertTxQNodeFromHead(pTxQKeeper,pTQNode); //++dralee_20060327 Adapter->TxPacketCount++; } } else { RETAILMSG(1,(TEXT("severe error, Get NULL packet...\n\r")));// tt ++ wmm PushFreeTxQNode(Adapter->TxFreeQ,pTQNode); // tt -- } } else if(Adapter->WmmDesc.WmmUapsdEnabled && Adapter->psState == PS_STATE_WAKEUP ) //PS mode enabled { Adapter->bNullFrameSent = 1; SendNullPacket(Adapter, MRVDRV_WCB_POWER_MGMT_NULL_PACKET|MRVDRV_WCB_POWER_MGMT_LAST_PACKET); } }#else //++dralee_20060327 #ifdef PROPRIETARY_PERIODIC_PS if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP && Adapter->TxLock == 0 ) #else if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP ) #endif { TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode); //++dralee_20060327 Adapter->TxPacketCount--; // tt ++ ps check // if ( pTQNode == NULL ) { ///crlo: queue is full. Leave now, instead of sending the packet // DBGPRINT(DBG_TXDATA, ("pq: 3\n") ); // RETAILMSG(1,(L"Exit: %s, queue is full, LeaveCriticalSection \n", TEXT(__FUNCTION__))); // LeaveCriticalSection(&Adapter->TxCriticalSection); // return NDIS_STATUS_FAILURE; // } // tt -- pPacket = pTQNode -> pPacket; if(pPacket) { #ifdef RETQ_TIMER Status = SendSinglePacket(Adapter,pPacket); #else Status = SendSinglePacket(Adapter,pPacket,&(pTQNode->DnldPacket)); #endif if(Status == NDIS_STATUS_SUCCESS) { PushFreeTxQNode(Adapter->TxFreeQ,pTQNode); //Adapter->TxPacketCount--; //++dralee_20060327 } else { RETAILMSG(1,(TEXT("[TxDone] Send packet fail\r\n"))); //Error handling , push back this node InsertTxQNodeFromHead(pTxQKeeper,pTQNode); //++dralee_20060327 Adapter->TxPacketCount++; } } else RETAILMSG(1,(TEXT("severe error, Get NULL packet...\n\r"))); }#ifdef PROPRIETARY_PERIODIC_PS else if( Adapter->psState == PS_STATE_WAKEUP && (CheckLastPacketIndication(Adapter)) ) { if(Adapter->TxLock == 0) { SendNullPacket(Adapter, (MRVDRV_WCB_POWER_MGMT_NULL_PACKET|MRVDRV_WCB_POWER_MGMT_LAST_PACKET)); Adapter->TxLock = 1; } }#endif #endif // WMM_UAPSD#ifdef CCX } else { DBGPRINT(DBG_CCX, ("[HandleTxSingleDone] It is CCX packet\n")); ///crlo:slowping ++ wlan_ccx_clrCurPacket(); ///crlo:slowping -- }#endif LeaveCriticalSection(&Adapter->TxCriticalSection); #if 1 //++dralee_20060327#ifdef NEW_PS_SCHEME //this condiction only true when ps_confirm is enqueue, but not txed. //It's possible when doing GetCmdFromQueueToExecute(), Adapter->SentPacket != 0 //that will stop downloading this command if ( Adapter->psState == PS_STATE_SLEEP && Adapter->bPSConfirm==FALSE ) { if( Adapter->HostPowerState == HTWK_STATE_FULL_POWER || Adapter->HostPowerState == HTWK_STATE_SLEEP ) { //++dralee_20060327 #ifdef PROPRIETARY_PERIODIC_PS if (Adapter->CurCmd == NULL) #else if( Adapter->SentPacket == NULL && Adapter->CurCmd == NULL ) #endif { //PSConfirmSleep(Adapter); GetCmdFromQueueToExecute (Adapter); } //RETAILMSG(1,(TEXT("PS_Confirm: in Txsingledone\n\r"))); } } ///crlo:added-2k60525 ++ //dralee_20060607, As command sending flow may be disrupted due to Adapter->SentPacket != null //we add this condition to let flow started again. else if ( Adapter->CurCmd == NULL && Adapter->SentPacket == NULL && Adapter->psState != PS_STATE_SLEEP ) { GetCmdFromQueueToExecute (Adapter); }#endif #endif return NDIS_STATUS_SUCCESS;} /****************************************************************************** * * Name: AllocateSingleTx() * * Description: Allocate single Tx * * Arguments: PMRVDRV_ADAPTER Adapter * * Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE * * Notes: * *****************************************************************************/ NDIS_STATUS AllocateSingleTx( IN PMRVDRV_ADAPTER Adapter ){ Adapter->TxNode.BufVirtualAddr = NULL; Adapter->TxNode.BufPhyAddr.LowPart = 0xffffffff; Adapter->TxNode.BufPhyAddr.HighPart = 0xffffffff; Adapter->TxNode.LocalWCB = &Adapter->Wcb; Adapter->TxNode.Status = MRVDRV_TX_CTRL_NODE_STATUS_IDLE; Adapter->Wcb.PktPtr = 0xffffffff; return NDIS_STATUS_SUCCESS;}VOID FreeSingleTx( IN PMRVDRV_ADAPTER Adapter ){ return;} #ifdef TX_PRY_QVOID InitializeTxNodeQ(IN PMRVDRV_ADAPTER Adapter ){ int i; Adapter->TxFreeQ = (PTXQ_NODE)&Adapter->FreeTxQNode[0]; for(i=0; i<MAX_TX_PACKETS-1; i++) Adapter->FreeTxQNode[i].next = (PTXQ_NODE)&Adapter->FreeTxQNode[i+1]; Adapter->FreeTxQNode[MAX_TX_PACKETS-1].next = NULL; }#endif/****************************************************************************** * * Name: CleanUpSingleTxBuffer() * * Description: Clean up single Tx Bbuffer * * Arguments: PMRVDRV_ADAPTER Adapter * * Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE * * Notes: * *****************************************************************************/NDIS_STATUSCleanUpSingleTxBuffer(IN PMRVDRV_ADAPTER Adapter){ ULONG i; BOOLEAN timerStatus; PNDIS_PACKET pPacket; RETAILMSG(1,(TEXT("[Marvell]+CleanUpSingleTxBuffer()\r\n"))); if(Adapter->TxPktTimerIsSet==TRUE) { NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus); Adapter->TxPktTimerIsSet=FALSE; } //dralee //tt ra fail: Dragon suggested 2005/10/17 EnterCriticalSection(&Adapter->TxCriticalSection); if( Adapter->SentPacket ) { pPacket = Adapter->SentPacket; Adapter->SentPacket = NULL; #ifdef RETQ_TIMER //++dralee_20060413 if( Adapter->bSentPacketReturned == 0 ) { NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_FAILURE); NdisMSendComplete( Adapter->MrvDrvAdapterHdl, pPacket, NDIS_STATUS_FAILURE); } else Adapter->bSentPacketReturned = 0; #endif } for(i=0; i< MAX_TX_PACKETS; i++) { PTXQ_KEEPER pTxQKeeper; PTXQ_NODE pTQNode; TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode); if(pTQNode == NULL) break; #ifdef RETQ_TIMER //++dralee_20060413 pPacket = pTQNode -> pPacket; if ( pPacket == NULL ) V5DbgMsg( (L" ??? nul pkt\n") ); if ( pPacket ) { NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_FAILURE); NdisMSendComplete( Adapter->MrvDrvAdapterHdl, pPacket, NDIS_STATUS_FAILURE); } //tt ra fail #endif//tt ++ ra fail // Dragon suggested 2005/10/17 PushFreeTxQNode( Adapter->TxFreeQ, pTQNode );//tt -- } //tt ++ ra fail#ifdef RETQ_TIMER if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); }//#else /// ///crlo:retqtm ++// EnterCriticalSection(&Adapter->TxCriticalSection);// BatchIndicateRetQPkts(Adapter); // LeaveCriticalSection(&Adapter->TxCriticalSection); ///crlo:retqtm --#endif ///RETQ_TIMER//tt -- InitializeTxNodeQ(Adapter); //set Tx queue parameter to default Adapter->TxPacketCount=0; Adapter->TxPacketComplete = 0; Adapter->TxPacketPut = 0; Adapter->TxPacketGet = 0; Adapter->SentPacket = NULL; //dralee //tt ra fail: Dragon suggested 2005/10/17 LeaveCriticalSection(&Adapter->TxCriticalSection); return NDIS_STATUS_SUCCESS;}#ifdef TX_PRY_Q void TxPacketEnQueue(PMRVDRV_ADAPTER Adapter,PNDIS_PACKET Packet){ PTXQ_KEEPER pTxQKeeper; PTXQ_NODE pTQNode; //int priority; UCHAR ac; #ifdef WMM UCHAR tos; #endif #ifndef RETQ_TIMER NDIS_STATUS Status; #endif #ifdef WMM if( Adapter->WmmDesc.enabled ) { #ifdef WMM_USE_NDIS_EXT tos = wmm_get_pkt_priority( Packet ); #else tos = wmm_get_tos(Packet); #endif // WMM_USE_NDIS_EXT ac = wmm_tos2ac[Adapter->WmmDesc.acstatus][tos]; //DbgWmmMsg( (L"Pkt pri: tos=%d, ac=%d\n", tos, ac) ); /* Access control of the current packet not the Lowest */ if(ac > AC_PRIO_BE) Adapter->WmmDesc.fw_notify = 1; } else ac = 3; #else // WMM #ifdef TX_PRY_Q_TEST ac = GetTickCount()&0x3; #else ac = 3; #endif #endif // WMM pTQNode = PopFreeTxQNode(Adapter->TxFreeQ); pTQNode->pPacket = Packet; #ifndef RETQ_TIMER Status = PrepareDownloadPacket(Adapter, Packet, &(pTQNode->DnldPacket)); #endif //RETAILMSG(1,(L"Enqueue: %x, %x\n\r",(ULONG)pTQNode,(ULONG)Packet)); //Adapter->TxPacketCount++; //Adapter->TxPacketSend++; pTxQKeeper = (PTXQ_KEEPER)&Adapter->TXPRYQ[ac]; InsertTxQNodeAtTail(pTxQKeeper,pTQNode); }VOID TxPacketDeQueue(PMRVDRV_ADAPTER Adapter,PPTXQ_KEEPER ppTxQKeeper,PPTXQ_NODE ppTQNode){ int pri; for(pri=0; pri<4; pri++) { *ppTxQKeeper = (PTXQ_KEEPER)&Adapter->TXPRYQ[pri]; *ppTQNode = PopFirstTxQNode(*ppTxQKeeper); if(*ppTQNode) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -