📄 txproc.c
字号:
} //RETAILMSG(1,(L"Dequeue:%x, %x\n\r",(ULONG)(*ppTQNode),(ULONG)((*ppTQNode)->pPacket))); /* if( *ppTQNode ) return NDIS_STATUS_SUCCESS; else return NDIS_STATUS_FAILURE; */}#endif /* We may not need this SendNullPacket. 36.p4 has already been added one.*/#if 0#ifdef WMM_UAPSDNDIS_STATUSSendNullPacket( IN PMRVDRV_ADAPTER Adapter, UCHAR pm ){ NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //UINT BufferCount; UINT TotalPacketLength=0; UINT TotalBufferLength=0; //PNDIS_BUFFER pBuffer, pNextBuffer; //ULONG i; //PVOID pVirtualAddr; PTxCtrlNode pTxNode; //BOOLEAN bIsEtherPacket = TRUE; //PUCHAR pDest = Buffer; //PUCHAR pHeader = NULL; SD_API_STATUS sdstatus; // intermediate status SDIO_TX_PKT downloadPkt; UCHAR *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf; //RETAILMSG(1,(TEXT("[Marvell]+SendSinglePacket()"))); if((Adapter->psState != PS_STATE_FULL_POWER) && (Adapter->psState != PS_STATE_WAKEUP)) { //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Tx can not send in the power state"))); return NDIS_STATUS_RESOURCES; } Status = NDIS_STATUS_SUCCESS; pTxNode=&Adapter->TxNode; NdisZeroMemory(pTxNode->LocalWCB, sizeof(WCB)); pTxNode->LocalWCB->Status = MRVDRV_WCB_STATUS_USED; pTxNode->LocalWCB->PktLen = 0; pTxNode->LocalWCB->PowerMgmt = pm;#ifdef INTERFACE20 // number of retry is 3 pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate); pTxNode->LocalWCB->PktPtr = sizeof(WCB);#endif // #ifdef INTERFACE20 TotalBufferLength = sizeof(WCB); downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength); NdisMoveMemory(pCurPtr, (PUCHAR)pTxNode->LocalWCB, sizeof(WCB)); pCurPtr += sizeof(WCB); downloadPkt.Type = SDIO_DATA_PKT; sdstatus = SDIODownloadPkt(Adapter, &downloadPkt); //lykao, 052605 Adapter->ulTxByteInLastPeriod += downloadPkt.Len; if (!SD_API_SUCCESS(sdstatus)) { DBGPRINT(DBG_ALLEN,("[Marvell]TX download failed!\n")); RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! "))); 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!"))); } return Status;} #endif //WMM_UAPSD #endif // 0 #ifndef RETQ_TIMER/****************************************************************************** * * Name: PrepareDownloadPacket() * * Description: Prepare the DownloadPacket from packet send by upper layer * * Conditions for Use: * * Arguments: * IN PMRVDRV_ADAPTER Adapter, * IN PNDIS_PACKET Packet, * IN PSDIO_TX_PKT pDnldPacket * * Return Value: None * * Notes: * *****************************************************************************/NDIS_STATUS PrepareDownloadPacket(PMRVDRV_ADAPTER Adapter,PNDIS_PACKET Packet, PSDIO_TX_PKT pDnldPacket){ NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UINT BufferCount; UINT TotalPacketLength=0; UINT TotalBufferLength=0; UINT BytesCopied=0; UINT Length,AccumLength; PNDIS_BUFFER pBuffer, pNextBuffer; PVOID pVirtualAddr; PUCHAR pHeader = NULL; ULONG coBufferLength = 0; ULONG i; PWCB pWcb; UCHAR *pCurPtr = pDnldPacket->Buf.CmdBuf; Status = NDIS_STATUS_SUCCESS; NdisQueryPacket( Packet, NULL, &BufferCount, &pBuffer, &TotalPacketLength); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryPacket"))); if(!pBuffer || !BufferCount || !TotalPacketLength) { Status=NDIS_STATUS_FAILURE; DBGPRINT(DBG_TXDATA|DBG_WARNING,("TX - NDIS buffer is not valid, return FAILURE \n")); DraleeMsg((L"[Marvell]SendSinglePacket:TX - NDIS buffer is not valid, return FAILURE ")); return Status; } //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryBuffer"))); NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryBuffer"))); pHeader = (PUCHAR)pVirtualAddr; //nFirstBufLen = Length;#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")); DraleeMsg((L"Got packet with size less than 14 bytes, reject!\n")); 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])); DraleeMsg((L"Still no key and packet type(0x%x 0x%x)is not 802.1x , drop!\n", pHeader[12], pHeader[13])); return NDIS_STATUS_FAILURE; } } #endif // #ifdef WPA#endif //ifdef MRVL_CHECK_TXPACKET DBGPRINT(DBG_TXDATA,("SendSinglePacket: buffers %d, packet len %d\n",BufferCount, TotalPacketLength)); pWcb = (PWCB)&(pDnldPacket->Buf.TxDataBuf.Wcb); NdisZeroMemory(pWcb,sizeof(WCB)); pWcb->Status = MRVDRV_WCB_STATUS_USED; pWcb->PktLen = (USHORT)TotalPacketLength; DBGPRINT(DBG_DATARATE,("DataRate = %x\n", (ULONG)Adapter -> DataRate));#ifdef INTERFACE20 // number of retry is 3// pWcb->TxControl = ( (3 << 12 ) | Adapter->DataRate); pWcb->TxControl =0; pWcb->PktPtr = sizeof(WCB); #endif // #ifdef INTERFACE20 /* dralee//???? dralee need check it#ifdef PROPRIETARY_PERIODIC_PS //dralee_20060327 if(Adapter->psState != PS_STATE_FULL_POWER) { if( CheckLastPacketIndication(Adapter) ) { pWcb->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)&(pWcb->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 pDnldPacket->Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength); DraleeMsg((L"Send Packet Length=%d \n",pDnldPacket->Len)); DBGPRINT(DBG_TXDATA,("TX %d bytes: packet size %d\n",(ULONG)TotalBufferLength, (ULONG)TotalPacketLength)); 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")); AccumLength = sizeof(WCB); // Query each buffer for the packet and move data to SQ 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; if( pVirtualAddr ) { NdisMoveMemory(pCurPtr, (PUCHAR)pVirtualAddr, (USHORT)Length); pCurPtr += Length; } NdisGetNextBuffer(pBuffer, &pNextBuffer); if( !pNextBuffer ) break; pBuffer = pNextBuffer; }//for(i=0; i<BufferCount; i++) DBGPRINT(DBG_TXDATADUMP | DBG_RAW,("\n")); DBGPRINT(DBG_ALLEN,("[Marvell]TX SendSinglePacket!\n")); pDnldPacket->Type = IF_DATA_PKT;return NDIS_STATUS_SUCCESS;}#endif#ifdef CCXNDIS_STATUSCCX_SendSinglePacket( IN PMRVDRV_ADAPTER Adapter, IN PNDIS_PACKET Packet){ NDIS_STATUS status; SDIO_TX_PKT downloadPkt; UCHAR *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf; UINT TotalPacketLength=0; UINT TotalBufferLength=0; UINT Length; UINT BufferCount; PNDIS_BUFFER pBuffer; PVOID pVirtualAddr; WCB LocalWCB; NdisQueryPacket(Packet, NULL, &BufferCount, &pBuffer, &TotalPacketLength); if(!pBuffer || !BufferCount || !TotalPacketLength) { RETAILMSG(1,(L"TX - NDIS buffer is not valid, return FAILURE \n")); status=NDIS_STATUS_FAILURE; goto end; } else { RETAILMSG(1,(L"BufferCount: %d\n", BufferCount)); } NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); /// ///Fill the WCB /// NdisZeroMemory(&LocalWCB, sizeof(WCB)); LocalWCB.Status = MRVDRV_WCB_STATUS_USED; ///crlo:s36 ++ ///LocalWCB.PktLen = (USHORT)TotalPacketLength; LocalWCB.PktLen = (USHORT)Length; ///crlo:s36 -- LocalWCB.TxControl = 0; LocalWCB.PktPtr = sizeof(WCB); ///LocalWCB.PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET; downloadPkt.Buf.TxDataBuf.Wcb.PowerMgmt = MRVDRV_WCB_POWER_MGMT_LAST_PACKET; NdisMoveMemory((PVOID)LocalWCB.DestMACAdrHi, pVirtualAddr, MRVDRV_ETH_ADDR_LEN); NdisMoveMemory(pCurPtr, (PUCHAR)&LocalWCB, sizeof(WCB)); pCurPtr += sizeof(WCB); /// /// Fill in the packet data content /// ///NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length); ///pHeader = (PUCHAR)pVirtualAddr; NdisMoveMemory(pCurPtr, (PUCHAR)pVirtualAddr, (USHORT)Length); pCurPtr += Length; ///downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(sizeof(WCB)); ///crlo:s36 ++ ///TotalBufferLength = TotalPacketLength; TotalBufferLength = Length; ///crlo:s36 -- TotalBufferLength += sizeof(WCB); downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength); 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)); RETAILMSG(1,(L"CCX_SendSinglePacket, calling If_DownloadPkt\n")); status = If_DownloadPkt(Adapter, &downloadPkt); if (!SD_API_SUCCESS(status)) { RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! "))); status = NDIS_STATUS_FAILURE; goto end; } else { RETAILMSG(1,(L"CCX_SendSinglePacket, If_DownloadPkt success\n")); }end: return status;}#if 0NDIS_STATUSCCX_SendSinglePacket( IN PMRVDRV_ADAPTER Adapter, IN PNDIS_PACKET Packet){ 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; UCHAR Buffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE]; BOOLEAN bIsEtherPacket = TRUE; PUCHAR pDest = Buffer; PUCHAR pHeader = NULL; BOOLEAN useBuffer = FALSE; ULONG coBufferLength = 0; SD_API_STATUS sdstatus; // intermediate status SDIO_TX_PKT downloadPkt; UCHAR *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf; //++dralee_20060327 #ifdef PROPRIETARY_PERIODIC_PS if(Adapter->TxLock == 1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -