📄 txproc.c
字号:
//// 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;
//-dzj , now the maroc WPA isn't used, it need modify when add WPA function
#if 1
#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"));
// RETAILMSG(DBG_TXDATA|DBG_WARNING,("\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]));
// 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
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
#ifdef DEBUG_PARA_ROAMING
pTxNode->LocalWCB->TxControl = ( (PARA_802_11_TXRETRY << 12 ) | PARA_802_11_AUTORATE);
#else
// number of retry is 3
pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate);
#endif
pTxNode->LocalWCB->PktPtr = sizeof(WCB);
#endif // #ifdef INTERFACE20
// 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);
// check for 802.3 vs. ethernet encapsulation
if( pHeader[12] > 0x05 )
{
bIsEtherPacket = TRUE;
}
else
{
bIsEtherPacket = FALSE;
}
#ifdef UNDER_CE
useBuffer = TRUE;
#endif
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;
NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);
NdisMSetTimer(&Adapter->MrvDrvTxPktTimer,
MRVDRV_DEFAULT_TX_PKT_TIME_OUT);
//RETAILMSG(1,(L"SendSinglePacket: SentPacket %x \n", (ULONG)Packet));
#ifdef CONFIG_WLAN_DHCP_PROXY
if(wlan_DHCPProxyTxPkt(Adapter,(UCHAR *)downloadPkt.Buf.CmdBuf, TotalPacketLength) == 1)
{
return NDIS_STATUS_SUCCESS;
}
#endif
downloadPkt.Type = SDIO_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;
}
NDIS_STATUS
HandleTxSingleDoneEvent(
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;
}
#if 1
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")));
/*
if (Adapter->bEAPOLSendPending == TRUE )
{
Adapter->bEAPOLSendPending = FALSE;
// indicate TX resource available
NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
}
*/
return NDIS_STATUS_FAILURE;
}
#endif
Status = NDIS_STATUS_SUCCESS;
EnterCriticalSection(&Adapter->TxCriticalSection);
pPacket = Adapter->SentPacket;
Adapter->SentPacket = NULL;
if(pPacket && Adapter->bSentPacketReturned == 0)
{
//tt ++ ra fail
// static USHORT s_nInsCount=0;
//tt --
//if(Adapter->TxPacketCount == 0)
// NdisMSleep(1);
//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);
//tt ++ ra fail
// s_nInsCount ++;
// V5DbgMsg( (L" + iq: %d\n", s_nInsCount) );
//tt --
#ifdef RETQ_TIMER
if( Adapter->RetQTimerIsSet==0)
{
NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);
NdisMSetTimer(&Adapter->MrvRetQTimer,
MRVDRV_DEFAULT_RETQ_TIME_OUT);
Adapter->RetQTimerIsSet=1;
}
#endif
#endif
}
else
Adapter->bSentPacketReturned = 0;
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));
/* //dralee_0110, dummy code
if(Adapter->PendingTxCnt && Adapter->TxPacketCount < MAX_TX_PACKETS/2 )
{
Adapter->PendingTxCnt = 0;
RETAILMSG(1,(TEXT("event send to protocol thread\r\n")));
V5DbgMsg( (L"* indicate avail -1\n") );
NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
V5DbgMsg( (L"* indicate avail -2\n") );
//SetEvent(Adapter->TxResourceControlEvent);
}
*/
/*
#if 1
if(Adapter->PendingTxCnt && Adapter->TxPacketCount < MAX_TX_PACKETS/2 )
{
//if(Adapter->DisplayTxMsg)
// NKDbgPrintfW( L"-- call SendResourceAvailable %d \r\n", Adapter->TxPacketCount);
NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
RETAILMSG(1,(TEXT("\r\n TxQ half empty, send SendResourceAvailable...")));
//if( Adapter->TxPacketCount < 2 )
Adapter->PendingTxCnt = 0;
}
#endif
*/
if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP )
{
#if 0
MrvPrintFile("[TxDone]:CurrCmd+TxDone");
if( Adapter->CurCmd )
{
MrvPrintFile("[TxDone]:CurrCmd+TxDone");
Adapter->TxPktTimerIsSet=TRUE;
NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, 5);
}
else
{
#endif
TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode);
// tt ++ ps check
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -