📄 txproc.c
字号:
} #endif#endif // WMM_UAPSD //// temporarily disable useBuffer optimization, it seems to cause problem useBuffer = TRUE; DBGPRINT(DBG_TXDATA | DBG_CRLF,("+SendSinglePacket()\n")); //RETAILMSG(1,(TEXT("[Marvell]+SendSinglePacket()"))); //lykao, 060905, test DBGPRINT(DBG_ALLEN,("[Marvell]SendSinglePacket Adapter->psState=%d\n",Adapter->psState)); if((Adapter->psState != PS_STATE_FULL_POWER) && (Adapter->psState != PS_STATE_WAKEUP)) { DBGPRINT(DBG_TXDATA ,("Tx can not send in the power state \n")); DBGPRINT(DBG_ALLEN ,("Tx can not send in the power state \n")); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Tx can not send in the power state"))); //070705 //Adapter->SendPSFlag=TRUE; return NDIS_STATUS_RESOURCES; //return NDIS_STATUS_FAILURE; } //BugFix //if (sd_UseAndLockSDDownloadPath(Adapter) == FALSE) //{ // return NDIS_STATUS_RESOURCES; //} Status = NDIS_STATUS_SUCCESS; pTxNode=&Adapter->TxNode; //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryPacket"))); NdisQueryPacket( Packet, NULL, &BufferCount, &pBuffer, &TotalPacketLength); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryPacket"))); if(!pBuffer || !BufferCount || !TotalPacketLength) { DBGPRINT(DBG_TXDATA|DBG_WARNING,("TX - NDIS buffer is not valid, return FAILURE \n")); Status=NDIS_STATUS_FAILURE; //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX - NDIS buffer is not valid, return FAILURE "))); goto end; } //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryBuffer"))); NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryBuffer"))); pHeader = (PUCHAR)pVirtualAddr;#ifndef MRVL_CHECK_TXPACKET#ifdef WPA // check if in key absent state, if so, block all packet other than // 802.1x if ( Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent ) { // no key yet, only allow 802.1x packets if ( TotalPacketLength < 14 ) { // malformed packet, blocked! DBGPRINT(DBG_TXDATA|DBG_WARNING,("Got packet with size less than 14 bytes, reject!\n")); Status = NDIS_STATUS_FAILURE; //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Got packet with size less than 14 bytes, reject! "))); goto end; } 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])); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Still no key and packet typeis not 802.1x drop! "))); Status = NDIS_STATUS_FAILURE; goto end; } } #endif // #ifdef WPA#endif //#ifdef MRVL_CHECK_TXPACKET DBGPRINT(DBG_TXDATA,("SendSinglePacket: buffers %d, packet len %d\n",BufferCount, TotalPacketLength)); pTxNode->NPTxPacket = Packet; NdisZeroMemory(pTxNode->LocalWCB, sizeof(WCB)); pTxNode->LocalWCB->Status = MRVDRV_WCB_STATUS_USED; pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength; DBGPRINT(DBG_DATARATE,("DataRate = %x\n", (ULONG)Adapter -> DataRate));#ifdef INTERFACE20 // number of retry is 3 //Ling++, 012706, Tx DataRate, Fix: Tx FixRate issue //pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate); pTxNode->LocalWCB->TxControl =0; //Ling--, 012706 pTxNode->LocalWCB->PktPtr = sizeof(WCB);#endif // #ifdef INTERFACE20 #ifdef WMM if ( Adapter->WmmDesc.enabled ) { #ifdef WMM_USE_NDIS_EXT pTxNode->LocalWCB->Priority = wmm_get_pkt_priority( Packet ); #else pTxNode->LocalWCB->Priority = wmm_get_tos( Packet ); #endif // WMM_USE_NDIS_EXT pTxNode->LocalWCB->PowerMgmt = 0; #ifdef WMM_UAPSD if( CheckLastPacketIndication(Adapter) ) { pTxNode->LocalWCB->PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET; } #endif // WMM_UAPSD }#endif // WMM#ifdef PROPRIETARY_PERIODIC_PS //dralee_20060327 //set last packet indication when PPS is enabled and system in PS mode. if(Adapter->psState != PS_STATE_FULL_POWER) { if( CheckLastPacketIndication(Adapter) ) { pTxNode->LocalWCB->PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET; Adapter->TxLock = 1; //RETAILMSG(1,(L"###LP indication\n\r")); //, powerMgmt=%x\n\r",pTxNode->LocalWCB->PowerMgmt)); } }#endif // First buffer contains the MAC header // Call NdisMoveMemory() to copy DEST MAC adress to WCB //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisMoveMemory"))); NdisMoveMemory( (PVOID)pTxNode->LocalWCB->DestMACAdrHi, pVirtualAddr, MRVDRV_ETH_ADDR_LEN); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisMoveMemory"))); // Start the packet. TotalBufferLength = TotalPacketLength; TotalBufferLength += sizeof(WCB);/* dralee_20060403 // check for 802.3 vs. ethernet encapsulation if( pHeader[12] > 0x05 ) { bIsEtherPacket = TRUE; } else { bIsEtherPacket = FALSE; } */ #ifdef UNDER_CE useBuffer = TRUE;#endif /* dralee_20060403 if ( bIsEtherPacket == FALSE ) { // if 802.3 packet, then omit the length field TotalBufferLength -= 2; }*/ // TotalBufferLength contains the size of the packet //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: before ADD_SDIO_PKT_HDR_LENGTH"))); downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength); // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: after ADD_SDIO_PKT_HDR_LENGTH"))); DBGPRINT(DBG_TXDATA,("TX %d bytes: packet size %d\n",(ULONG)TotalBufferLength, (ULONG)TotalPacketLength)); if ( bIsEtherPacket == FALSE ) { // in the case of 802.3 packet, the length field omitted when sent // to FW pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength - 2; } // Transmit the MAC header to the device. // NOTE: WCB has to be EVEN in size!!! // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **1NdisMoveMemory"))); NdisMoveMemory(pCurPtr, (PUCHAR)pTxNode->LocalWCB, sizeof(WCB)); pCurPtr += sizeof(WCB); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **2NdisMoveMemory"))); //HexDump(DBG_TXDATADUMP,"TX Buffer:", (PUCHAR )pTxNode->LocalWCB, sizeof(WCB)); DBGPRINT(DBG_T3 | DBG_CRLF ,("TX PACKET:\n")); // Query each buffer for the packet and move data to SQ AccumLength = sizeof(WCB); for(i=0; i<BufferCount; i++) { NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); AccumLength += Length; if( AccumLength > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE ) // PJG: accum length already counts the header... need to compare to entire buffer size break; // ***** Fix for odd sized buffer ***** // Because the CF controller needs 16 bit write, it will not handle // odd sized buffers if( pVirtualAddr ) { if ((bIsEtherPacket == FALSE) || (useBuffer) || ( (Length % 2) != 0 ) ) { // one of the previous buffer is odd, use coalescing buffer NdisMoveMemory((PVOID)pDest, pVirtualAddr, Length); pDest = (PUCHAR)((ULONG)pDest + Length); coBufferLength += Length; useBuffer = TRUE; //DBGPRINT(DBG_TXDATA,("buffer packet")); } else { DBGPRINT(DBG_TXDATA,("not buffer packet")); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **not buffer packet"))); NdisMoveMemory(pCurPtr, (PUCHAR)pVirtualAddr, (USHORT)Length); pCurPtr += Length; } }//if( pVirtualAddr ) NdisGetNextBuffer(pBuffer, &pNextBuffer); if( !pNextBuffer ) break; pBuffer = pNextBuffer; }//for(i=0; i<BufferCount; i++) //DBGPRINT(DBG_TXDATADUMP | DBG_RAW,("\n")); //102605 DBGPRINT(DBG_TXDATADUMP,("\n")); HexDump(DBG_TXDATADUMP,"[Marvell]TX Buffer:", Buffer, 64); DBGPRINT(DBG_TXDATADUMP,("\n")); //RETAILMSG(1,(TEXT("[Marvell]++SendSinglePacket: "))); // Check with Sean why he is doing this. And take appropriate action. For now send the complete // data as is. if ( bIsEtherPacket == FALSE ) { // 802.3 packet, already contains LLC // send DA MAC, SA MAC to FW NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)MRVDRV_ETH_ADDR_LEN * 2); pCurPtr += (USHORT)(MRVDRV_ETH_ADDR_LEN * 2); NdisMoveMemory(pCurPtr, (PUCHAR)(Buffer+MRVDRV_ETH_HEADER_SIZE), (USHORT)TotalPacketLength - MRVDRV_ETH_HEADER_SIZE); pCurPtr += (USHORT)(TotalPacketLength - MRVDRV_ETH_HEADER_SIZE); } else { if ( useBuffer ) { NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)coBufferLength); pCurPtr +=(USHORT)coBufferLength; } } DBGPRINT(DBG_ALLEN,("[Marvell]TX SendSinglePacket!\n")); //remember the current packet being sent Adapter->SentPacket = Packet; Adapter->TxPktTimerIsSet=TRUE; NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, MRVDRV_DEFAULT_TX_PKT_TIME_OUT); //RETAILMSG(1,(L"SendSinglePacket: SentPacket %x \n", (ULONG)Packet)); downloadPkt.Type = IF_DATA_PKT; sdstatus = If_DownloadPkt(Adapter, &downloadPkt); //lykao, 052605 Adapter->ulTxByteInLastPeriod += downloadPkt.Len; if (!SD_API_SUCCESS(sdstatus)) { BOOLEAN timerStatus; DBGPRINT(DBG_ALLEN,("[Marvell]TX download failed!\n")); RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! "))); //dralee 09202005 Adapter->SentPacket = NULL; Adapter->TxPktTimerIsSet=FALSE; NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus); return NDIS_STATUS_FAILURE; } else { DBGPRINT(DBG_LOAD,("TX download success!\n")); DBGPRINT(DBG_ALLEN,("[Marvell]TX download success!\n")); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download success!"))); } DBGSTROBE_LINE_ON(DBLINE2); // remember the current packet being sent //Adapter->TxRetryCount = 0; //dralee 09172005, unused flag // Start Tx timer //NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, // MRVDRV_DEFAULT_TX_PKT_TIME_OUT); //Adapter->TxPktTimerIsSet=TRUE; // Update sequence number Adapter->SeqNum++; //DBGPRINT(DBG_T3,("DONE TX PACKET:\n")); //DBGPRINT(DBG_TXDATA,("-SendSinglePacket()\n")); end: //RETAILMSG(1,(TEXT("[Marvell]-SendSinglePacket()"))); //BugFix, dralee mask off // sd_ReleaseSDDownloadPath(Adapter); return Status;} #endif NDIS_STATUSHandleTxSingleDoneEvent( PMRVDRV_ADAPTER Adapter){ PNDIS_PACKET pPacket; NDIS_STATUS Status; USHORT usTxFrmSeqNum = 0, usTxFrmStatus = 0, usTCNSeqNum = 0; USHORT usTxCurrentRate = 0; BOOLEAN timerStatus; PTXQ_KEEPER pTxQKeeper; PTXQ_NODE pTQNode; DBGSTROBE_LINE_OFF(DBLINE2); DBGPRINT(DBG_TXDATA | DBG_CRLF ,("+HandleTxSingleDoneEvent()\n")); if( Adapter->TxPktTimerIsSet==TRUE ) { NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus); Adapter->TxPktTimerIsSet=FALSE; } /* Handle Txsingle done may be caused by txed data packet and command packet. If caused by command packet, Adapter->SentPacket == null. If caused by data packet, Adapter->SentPacket != null except the txed packet is null packet. When PPS is actived, null packet with last packet indication set may be sent to FW */ #if 0 //++dralee_20060327 if( Adapter->SentPacket == NULL ) { DBGPRINT(DBG_TXDATA,("Adapter->SentPacket == NULL but received TX_DONE\n")); RETAILMSG(1,(TEXT("Adapter->SentPacket == NULL but received TX_DONE\n"))); return NDIS_STATUS_FAILURE; } #endif Status = NDIS_STATUS_SUCCESS; EnterCriticalSection(&Adapter->TxCriticalSection); pPacket = Adapter->SentPacket; Adapter->SentPacket = NULL; #ifdef CCX if ( ! wlan_ccx_isCurPacket(pPacket) ) {#endif #ifdef RETQ_TIMER if(pPacket && Adapter->bSentPacketReturned == 0) { //RETAILMSG(1,(L"\r\n indicate Tx complete: %x",(ULONG)pPacket)); #if 0 Status = NDIS_STATUS_SUCCESS; NDIS_SET_PACKET_STATUS(pPacket, Status); NdisMSendComplete( Adapter->MrvDrvAdapterHdl, pPacket, Status); #else pTQNode = PopFreeTxQNode(Adapter->TxFreeQ); pTQNode->pPacket = pPacket; pTxQKeeper = (PTXQ_KEEPER)&Adapter->TXRETQ; InsertTxQNodeAtTail(pTxQKeeper,pTQNode); #ifdef RETQ_TIMER if( Adapter->RetQTimerIsSet==0) { NdisMSetTimer(&Adapter->MrvRetQTimer, MRVDRV_DEFAULT_RETQ_TIME_OUT); Adapter->RetQTimerIsSet=1; } //#else ///crlo:retqtm ++ //EnterCriticalSection(&Adapter->TxCriticalSection); //BatchIndicateRetQPkts(Adapter); //LeaveCriticalSection(&Adapter->TxCriticalSection); ///crlo:retqtm -- #endif ///RETQ_TIMER #endif //0 } else Adapter->bSentPacketReturned = 0; #endif //RETQ_TIMER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -