📄 txproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 ***************** * * Purpose: This module has the implementation of TX functions * * $Author: schiu $ * * $Date: 2004/11/03 $ * * $Revision: #7 $ * *****************************************************************************/#include "precomp.h"// compilation error if this file is not included#ifdef UNDER_CE#include "pkfuncs.h"#endif#ifdef IF_SDIO#include "SDCardDDK.h"#endif // IF_SDIO#ifdef WMMextern UCHAR wmm_tos2ac[16][8];#endif /****************************************************************************** * * Name: MrvDrvSend() * * Description: NDIS miniport serialized send packet routine * * Conditions for Use: Protocol driver will call this routine to pass Tx NDIS_PACKET * * Arguments: * IN NDIS_HANDLE MiniportAdapterContext * IN PPNDIS_PACKET Packet * IN UINT Flags * * Return Value: NDIS_STATUS_RESOURCES or NDIS_STATUS_PENDING * * Notes: * *****************************************************************************/NDIS_STATUSMrvDrvSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags){ PMRVDRV_ADAPTER Adapter; NDIS_STATUS Status; #if 0 NDIS_STATUS iStatus; #endif ///0 PNDIS_PACKET pPacket; //DWORD waitStatus; // wait status PTXQ_KEEPER pTxQKeeper; PTXQ_NODE pTQNode; //int pri; #ifdef RETQ_TIMER BOOLEAN timerStatus; #else SDIO_TX_PKT DnldPacket; #endif#ifdef MRVL_CHECK_TXPACKET PNDIS_BUFFER pBuffer; UINT BufferCount; UINT Length; UINT TotalPacketLength = 0; PVOID pVirtualAddr; PTxCtrlNode pTxNode; PUCHAR pHeader = NULL;#endif //MRVL_CHECK_TXPACKET Status = NDIS_STATUS_SUCCESS; Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext; DBGPRINT(DBG_TXDATA, ("+MrvDrvSend()\n")); // printf ("+MrvDrvSend()\n"); #ifdef DEEP_SLEEP // In Deep Sleep Mode no packet can be sent out if (Adapter->IsDeepSleep) { Status = NDIS_STATUS_NO_CABLE; } #endif // Check device removal status if( Adapter->SurpriseRemoved == TRUE ) { RETAILMSG(1,(TEXT("\n\r[MrvSend]: NDIS_STATUS_FAILURE"))); return NDIS_STATUS_FAILURE; } if ( Adapter->bIsPendingReset == TRUE ) { RETAILMSG(1,(TEXT("\n\r[MrvSend]: NDIS_STATUS_FAILURE"))); return NDIS_STATUS_FAILURE; } if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected ) { DBGPRINT(DBG_WARNING, ("***WARNING: OS attempted to send packet while disconnected!\n")); RETAILMSG(1,(TEXT("[Marvell]MrvDrvSend:***1WARNING: OS attempted to send packet while disconnected!"))); DraleeMsg((L"[MrvSend]:disconnected")); NdisMIndicateStatus( Adapter->MrvDrvAdapterHdl, NDIS_STATUS_MEDIA_DISCONNECT, (PVOID)NULL, 0); NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl); //RETAILMSG(1,(TEXT("[Marvell]MrvDrvSend:***2WARNING: OS attempted to send packet while disconnected!"))); V5DbgMsg( (L" * disconn\n") ); CleanUpSingleTxBuffer(Adapter); ResetRxPDQ(Adapter); return NDIS_STATUS_FAILURE; } //Plus if( Adapter->bIsScanInProgress == TRUE ) return NDIS_STATUS_SUCCESS;#ifdef MRVL_CHECK_TXPACKET // check if in key absent state, if so, block all packet other than // 802.1x if ( (Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )|| (Adapter->EncryptionStatus == Ndis802_11Encryption3KeyAbsent ) ) { pTxNode = &Adapter->TxNode; NdisQueryPacket( Packet, NULL, &BufferCount, &pBuffer, &TotalPacketLength ); if (!pBuffer || !BufferCount || !TotalPacketLength) { #ifdef MRVL_PRINT_FILE_MSG MrvPrintFileMSG("[Marvell]MrvDrvSend:NdisQueryPacket Fail!! Return NDIS_STATUS_FAILURE!!\n"); #endif return NDIS_STATUS_FAILURE; } NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); pHeader = (PUCHAR)pVirtualAddr; if ( TotalPacketLength < 14 ) { // malformed packet, blocked! DBGPRINT(DBG_TXDATA|DBG_WARNING,("Got packet with size less than 14 bytes, reject!\n")); #ifdef MRVL_PRINT_FILE_MSG MrvPrintFileMSG("[Marvell]MrvDrvSend:Got packet with size less than 14 bytes, reject!!\n"); #endif return NDIS_STATUS_FAILURE; } if ( (pHeader[12] != 0x88) || (pHeader[13] != 0x8E) ) { DBGPRINT(DBG_TXDATA|DBG_WARNING,("Still no key and packet type(0x%x 0x%x)is not 802.1x , drop!\n", pHeader[12], pHeader[13])); #ifdef MRVL_PRINT_FILE_MSG MrvPrintFileMSG("[Marvell]MrvDrvSend:pHeader[6]=0x%x\n,pHeader[7]=0x%x\n,pHeader[8]=0x%x\n,pHeader[9]=0x%x\n,pHeader[10]=0x%x\n,pHeader[11]=0x%x\n,pHeader[12]=0x%x\n,pHeader[13]=0x%x\n,pHeader[14]=0x%x\n,pHeader[15]=0x%x\n,Adapter->TxPacketCount =%d\n",pHeader[6],pHeader[7],pHeader[8],pHeader[9],pHeader[10],pHeader[11],pHeader[12],pHeader[13],pHeader[14],pHeader[15],Adapter->TxPacketCount); #endif return NDIS_STATUS_FAILURE; } }// if ( (Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )|| (Adapter->EncryptionStatus == Ndis802_11Encryption3KeyAbsent ) ) #endif //MRVL_PRINT_FILE_MSG if(Adapter->TxPacketCount > 6) //flow control NdisMSleep(1000); EnterCriticalSection(&Adapter->TxCriticalSection); if(Adapter->TxPacketCount >= (MAX_TX_PACKETS-1) ) { RETAILMSG(1,(L"Enter Waiting ..:%d\n\r",Adapter->TxPacketCount)); V5DbgMsg( (L"=== MrvDrvSend, TxPacketCount=%d\n", Adapter->TxPacketCount) ); //tt ra fail ///crlo:retqtm ++ #ifdef RETQ_TIMER if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); } //#else //++dralee_20060406 //BatchIndicateRetQPkts(Adapter); #endif //RETQ_TIMER /// Old implementation /* #if 1 if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); } */ ///crlo:retqtm -- LeaveCriticalSection(&Adapter->TxCriticalSection); V5DbgMsg( (L"- return resources\n") ); //return NDIS_STATUS_RESOURCES; //dralee_1209, resource hang system, return NDIS_STATUS_FAILURE; //so, return fail is a little better... } //record how many tx pkt is sent. Adapter->TxPacketSend++; DBGPRINT(DBG_TXDATADUMP,("[Marvell:MrvDrvSend] Adapter->TxPacketSend=%d\n", Adapter->TxPacketSend)); //if( Adapter->SentPacket || (Adapter->CurCmd != NULL)) //TxLock is set when last packet indication is set in last txed packet //so, stop tx to wait for ps_sleep event if( Adapter->SentPacket || Adapter->CurCmd != NULL || Adapter->TxLock ==1 ) //++dralee_20060327 { TxPacketEnQueue(Adapter, Packet); Adapter->TxPacketCount++; ///crlo:retqtm ++ #ifdef RETQ_TIMER if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); } //#else //dralee_20060406 //BatchIndicateRetQPkts(Adapter); #endif ///RETQ_TIMER ///Old implementation /*#if 1 if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); } #endif*/ ///crlo:retqtm -- LeaveCriticalSection(&Adapter->TxCriticalSection); #ifdef RETQ_TIMER return NDIS_STATUS_PENDING; #else return NDIS_STATUS_SUCCESS; #endif } if( Adapter->TxPacketCount ) { TxPacketEnQueue(Adapter, Packet); TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode); pPacket = pTQNode -> pPacket; //RETAILMSG(1,(L"Dequeue:%x, %x\n\r",(ULONG)pTQNode,(ULONG)(pTQNode->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); } else { InsertTxQNodeFromHead(pTxQKeeper,pTQNode); Adapter->TxPacketCount++; } #ifdef RETQ_TIMER Status = NDIS_STATUS_PENDING; #else Status = NDIS_STATUS_SUCCESS; #endif } else { pPacket = Packet; #ifdef RETQ_TIMER Status = SendSinglePacket(Adapter,pPacket); #else Status = PrepareDownloadPacket(Adapter,Packet,&DnldPacket); Status = SendSinglePacket(Adapter,pPacket,&DnldPacket); #endif if(Status == NDIS_STATUS_SUCCESS) { Adapter->bSentPacketReturned = 1; } else { #ifndef WMM_UAPSD RETAILMSG(1,(TEXT("[MrvSend] Send packet fail\r\n")));#endif TxPacketEnQueue(Adapter, Packet); #ifdef RETQ_TIMER Status = NDIS_STATUS_PENDING; #else Status = NDIS_STATUS_SUCCESS; #endif Adapter->TxPacketCount++; } } ///crlo:retqtm ++ #ifdef RETQ_TIMER if( Adapter->RetQTimerIsSet) { Adapter->RetQTimerIsSet = 0; NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus); BatchIndicateRetQPkts(Adapter); } //#else // BatchIndicateRetQPkts(Adapter); #endif ///RETQ_TIMER LeaveCriticalSection(&Adapter->TxCriticalSection); return Status;} //++dralee_20060327NDIS_STATUSSendNullPacket(IN PMRVDRV_ADAPTER Adapter,UCHAR pwmgr ){ NDIS_STATUS sdstatus; SDIO_TX_PKT downloadPkt; downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(sizeof(WCB)); downloadPkt.Type = IF_DATA_PKT; NdisZeroMemory(&downloadPkt.Buf.TxDataBuf.Wcb, sizeof(WCB)); downloadPkt.Buf.TxDataBuf.Wcb.PktPtr = sizeof(WCB); downloadPkt.Buf.TxDataBuf.Wcb.PowerMgmt = pwmgr; //RETAILMSG(1,(L"NULL pkt:%x\n\r",pwmgr)); sdstatus = If_DownloadPkt(Adapter, &downloadPkt); if (!SD_API_SUCCESS(sdstatus)) { RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! "))); return NDIS_STATUS_FAILURE; } return sdstatus;} //++dralee_20060327//only for PPS enabled. when sleepperiod command is set and no queued packets & pending QUCHAR CheckLastPacketIndication(IN PMRVDRV_ADAPTER Adapter){ if( Adapter->sleepperiod != 0 && Adapter->TxPacketCount == 0 && IsQEmpty(&Adapter->CmdPendQ) ) return 1; else return 0;} ///////////////////////////////////////////////////////////////****************************************************************************** * * Name: SendSinglePacket() * * Description: TX packet handler * * Arguments: PMRVDRV_ADAPTER Adapter * * Return Value: * * Notes: * *****************************************************************************/ #ifndef RETQ_TIMER NDIS_STATUSSendSinglePacket( IN PMRVDRV_ADAPTER Adapter, IN PNDIS_PACKET Packet, IN PSDIO_TX_PKT pDnldPacket){ //int ii; // ULONG bigTimeout = 250000; // about 500ms drop dead timeout timing on BUS IO. NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //UINT BufferCount; //UINT TotalPacketLength=0; // UINT TotalBufferLength=0; // UINT BytesCopied=0; // UINT Length, AccumLength; // PNDIS_BUFFER pBuffer, pNextBuffer; // ULONG i; // PVOID pVirtualAddr;// PTxCtrlNode pTxNode; // due to fix for odd sized buffers, WepBuffer is used in both // WEP and no-WEP scenarios //UCHAR WepBuffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE]; //BOOLEAN doWep = FALSE; //BOOLEAN NotEncryption4EAPOL = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -