📄 txproc.c
字号:
// UCHAR Buffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE];// BOOLEAN bIsEtherPacket = TRUE;// PUCHAR pDest = Buffer;// PUCHAR pHeader = NULL;// BOOLEAN useBuffer = FALSE;// ULONG coBufferLength = 0; //#ifdef IF_SDIO SD_API_STATUS sdstatus; // intermediate status// SDIO_TX_PKT downloadPkt;// UCHAR *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf;//#endif // IF_SDIO#ifdef WMM_UAPSD if ( Adapter->bNullFrameSent ) { return NDIS_STATUS_RESOURCES; }#else //++dralee_20060327 #ifdef PROPRIETARY_PERIODIC_PS if(Adapter->TxLock == 1) { //RETAILMSG(1,(L"TxLock: reject sent\n\r")); return NDIS_STATUS_RESOURCES; } #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 pDnldPacket->Buf.TxDataBuf.Wcb.Priority = wmm_get_pkt_priority( Packet ); #else pDnldPacket->Buf.TxDataBuf.Wcb.Priority = wmm_get_tos( Packet ); #endif // WMM_USE_NDIS_EXT pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt = 0; #ifdef WMM_UAPSD if( Adapter->WmmDesc.WmmUapsdEnabled && CheckLastPacketIndication(Adapter) ) { pDnldPacket->Buf.TxDataBuf.Wcb.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) ) { pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET; Adapter->TxLock = 1; } else pDnldPacket->Buf.TxDataBuf.Wcb.PowerMgmt &= ~MRVDRV_WCB_POWER_MGMT_LAST_PACKET; }#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, pDnldPacket); //lykao, 052605 //Adapter->ulTxByteInLastPeriod += downloadPkt.Len; Adapter->ulTxByteInLastPeriod += pDnldPacket->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;} #elseNDIS_STATUSSendSinglePacket( IN PMRVDRV_ADAPTER Adapter, IN PNDIS_PACKET Packet){ //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; UCHAR Buffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE]; BOOLEAN bIsEtherPacket = TRUE; PUCHAR pDest = Buffer; PUCHAR pHeader = NULL; BOOLEAN useBuffer = FALSE; ULONG coBufferLength = 0; //#ifdef IF_SDIO SD_API_STATUS sdstatus; // intermediate status SDIO_TX_PKT downloadPkt; UCHAR *pCurPtr = (UCHAR *)downloadPkt.Buf.CmdBuf;//#endif // IF_SDIO#ifdef WMM_UAPSD if ( Adapter->bNullFrameSent ) { return NDIS_STATUS_RESOURCES; }#else //++dralee_20060327 #ifdef PROPRIETARY_PERIODIC_PS if(Adapter->TxLock == 1) { //RETAILMSG(1,(L"TxLock: reject sent\n\r")); return NDIS_STATUS_RESOURCES;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -