⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txproc.c.bak

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		
        //DBGPRINT(DBG_TXDATA  | DBG_MACEVENT ,("TX %d bytes: packet size %d\n",(ULONG)TotalBufferLength, (ULONG)TotalPacketLength));
        if ( !IX_SUCCESS(ixStatus) ) 
   	 {
                DBGPRINT(DBG_ERROR  | DBG_MACEVENT ,("Frame not accepted: interface still busy after waiting"));
		
	         Status = NDIS_STATUS_FAILURE;
	         goto end;
        }   	    

	 // Transmit the MAC header to the device.
        // NOTE:  WCB has to be EVEN in size!!!
        cf_TxBlock( pCf,(PUCHAR)pTxNode->LocalWCB, sizeof(WCB));
		
        HexDump(DBG_TXDATADUMP,"TX Buffer (WCB):", (PUCHAR )pTxNode->LocalWCB, sizeof(WCB));
		
        cf_TxBlock ( pCf, (PUCHAR)Buffer, (USHORT)coBufferLength);
    
        // finish up the packet 
	 cf_TxUpdateSeq( pCf, Adapter->SeqNum);
        cf_TxEndPacket(pCf);
	
	 // remember the current packet being sent
        Adapter->TxRetryCount = 0;
        Adapter->ulTxByteInLastPeriod += TotalPacketLength;

        // Start Tx timer
        NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, 
     	  		         MRVDRV_DEFAULT_TX_PKT_TIME_OUT);
	 Adapter->TxPktTimerIsSet=TRUE;

        // Update sequence number
 	 Adapter->SeqNum++;

  	 Adapter->SentPacket = Packet;  

/*
       {     
	  	ULONG i;
					for (i=0; i<coBufferLength; i++)
		{                     RETAILMSG(1, (TEXT("%02x  "), *(((UCHAR *)(Buffer))+ i) ));
			if (((i %16) == 0) && i)				RETAILMSG(1, (TEXT("\r\n")));					}		RETAILMSG(1, (TEXT("\r\n")));		        }	
*/

        DBGPRINT(DBG_TXDATA  | DBG_MACEVENT ,("-SendSinglePacket()\n"));

end:	
	
	 NdisReleaseSpinLock(&Adapter->lCFInterfaceLock);
	
        return Status;
}


/******************************************************************************
 *
 *  Name: FreeSingleTxBuffer()
 *
 *  Description: Free single Tx Bbuffer
 *
 *  Arguments:  PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE
 * 
 *  Notes:        
 *  TODO: Verify what should be in here.
 *****************************************************************************/
/*
NDIS_STATUS FreeSingleTxBuffer(
	IN PMRVDRV_ADAPTER Adapter
	)
{
	 
//    if( Adapter->TxNode.BufVirtualAddr ){
//	    NdisMFreeSharedMemory(Adapter->MrvDrvAdapterHdl, 
//							MRVDRV_ETH_PACKET_BUFFER_SIZE, 
//							TRUE, 
//							(PVOID)Adapter->TxNode.BufVirtualAddr, 
//							Adapter->TxNode.BufPhyAddr
//							);
//    }

    return NDIS_STATUS_SUCCESS;
}
*/
/******************************************************************************
 *
 *  Name: HandleTxSingleDoneEvent()
 *
 *  Description: TX done event handler
 *
 *  Arguments:	PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value:        
 * 
 *  Notes:               
 *
 *****************************************************************************/
NDIS_STATUS
HandleTxSingleDoneEvent(
	PMRVDRV_ADAPTER Adapter
)
{
	PNDIS_PACKET 	pPacket;
	NDIS_STATUS  	Status;
	USHORT       		usTxFrmSeqNum = 0, usTxFrmStatus = 0, usTCNSeqNum = 0;
	USHORT       		usTxCurrentRate = 0;
	TxCtrlNode   		*pTCN;
	BOOLEAN      		timerStatus;

       DBGSTROBE_LINE_OFF(DBLINE2);
	DBGPRINT(DBG_TXDATA | DBG_CRLF ,("+HandleTxSingleDoneEvent()\n"));
	if ( Adapter->TxPktTimerIsSet==TRUE )
	{		
		NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);	
		Adapter->TxPktTimerIsSet=FALSE;
	}		
	
	if ( Adapter->SentPacket == NULL )
       {
       	DBGPRINT(DBG_TXDATA | DBG_WARNING, 
                		("TXDone event received eventhough there is no outstanding TX pkt!\n"));
		Adapter->bIsDoingTx = FALSE;
		return NDIS_STATUS_FAILURE;
       }

	// Check Tx frame seq num and Tx frame status
	NdisRawReadPortUshort(
			Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_TX_FRAME_SEQ_NUM,
			&usTxFrmSeqNum);

	// If Tx frame sequence number is out of sync, ignore it
	NdisRawReadPortUshort(
			Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_TX_FRAME_STATUS,
			&usTxFrmStatus);

    	DBGPRINT(DBG_DATARATE,("TX Status = 0x%x", usTxFrmStatus));
			usTxCurrentRate = usTxFrmStatus >> 4;
			usTxFrmStatus &= CFMACREG_CCR_TFS_MASK;         // mask unwanted bits.
	DBGPRINT(DBG_DATARATE,("Rate value reported by FW %d\n", (ULONG)usTxCurrentRate ));
	
	// Locate the packet
	pTCN = &(Adapter->TxNode);

	// Clear the data structure
	pTCN->Status = MRVDRV_TX_CTRL_NODE_STATUS_IDLE;
	pTCN->NPTxPacket = NULL;
	pTCN->LocalWCB->PktPtr = (ULONG)0;

	Status = NDIS_STATUS_FAILURE;
	// Check and update statistics
	if ( usTxFrmStatus & CFMACREG_CCR_TFS_TxFrmSent )
	{
    		DBGPRINT(DBG_TXDATA,("HandleTxSingleDoneEvent() - TX frame (0x%x) marked GOOD\n", 
                                Adapter->SentPacket));
		Adapter->XmitOK++;
		Status = NDIS_STATUS_SUCCESS;
	}
	else	if ( usTxFrmStatus & CFMACREG_CCR_TFS_RtyLmtExcd )
	{
    		DBGPRINT(DBG_TXDATA | DBG_WARNING, ("HandleTxSingleDoneEvent() - TX frame (0x%x) marked BAD\n",
                                Adapter->SentPacket));
		Adapter->XmitError++;
		Status = NDIS_STATUS_FAILURE;
	}
	else if ( usTxFrmStatus & CFMACREG_CCR_TFS_TimeOut )
	{
    		DBGPRINT(DBG_TXDATA | DBG_WARNING,("HandleTxSingleDoneEvent() - TX frame (0x%x) marked TIMEOUT\n",
                                Adapter->SentPacket));
		Adapter->XmitError++;
		Status = NDIS_STATUS_FAILURE;
	}
	else
	{
		DBGPRINT(DBG_TXDATA | DBG_WARNING,("HandleTxSingleDoneEvent() - TX frame (0x%x) marked no\n",
                                Adapter->SentPacket));
		Adapter->XmitError++;
		Status = NDIS_STATUS_FAILURE;	
	}
	
    	EnterCriticalSection(&Adapter->TxCriticalSection);

       if ( Adapter->SentPacket != NULL )
       {
    		pPacket = Adapter->SendPackets[Adapter->TxPacketComplete];
    		Adapter->SendPackets[Adapter->TxPacketComplete] = NULL;
   		Adapter->TxPacketComplete++; 
    		Adapter->TxPacketCount--;
    		Adapter->TxPacketComplete %= MAX_TX_PACKETS;
	  
   		Adapter->SentPacket = NULL;

    		if (pPacket)
    		{
			Status = NDIS_STATUS_SUCCESS;
			NDIS_SET_PACKET_STATUS(pPacket, Status);
			NdisMSendComplete(
						Adapter->MrvDrvAdapterHdl,
						pPacket,
						Status);
    		}
    
    		Adapter->TxPacketSendComplete++;
	  
    		// DBGPRINT(DBG_ERROR,("TxPktCnt %x TxSendCmp %x \n", Adapter->TxPacketCount, Adapter->TxPacketSendComplete));
 
    		if ( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP )
    		{
       		pPacket = Adapter->SendPackets[Adapter->TxPacketGet];
        		if (pPacket != NULL)
        		{
            			Status = SendSinglePacket(Adapter,pPacket);
            			if (Status == NDIS_STATUS_SUCCESS)
            			{
                 			Adapter->TxPacketGet++;
                 			Adapter->TxPacketGet %= MAX_TX_PACKETS;   
            			}  
            			else
            			{
                 			DBGPRINT(DBG_DRALEE,("Handle Tx single Done error\n\r"));
            			}				
         		}  
    		}
        }

	LeaveCriticalSection(&Adapter->TxCriticalSection);  
    
	Adapter->bIsDoingTx = FALSE;
	
//ahan, [2005-10-23]
//In SD driver, no PS_STATE_SLEEP_PENDING state, use bPSConfirm as pending state
//In CF driver, just checking PS_STATE_SLEEP_PENDING
    	if ( Adapter->psState == PS_STATE_SLEEP_PENDING )
    	{                     
       	// check another packet, if not, send sleep confirm  
#ifdef HOST_WAKEUP
        	if ( Adapter->HostPowerState == HTWK_STATE_FULL_POWER || 
            	     Adapter->HostPowerState == HTWK_STATE_SLEEP )
        	{
            		if ((Adapter->TxPacketCount == 0) && (Adapter->SentPacket == NULL) &&
                	    (Adapter->CurCmd == NULL))
            		{
                		PSConfirmSleep(Adapter); 
                		DBGPRINT(DBG_HOSTWAKEUP | DBG_SP,("No packet transmitted. Send sleep confirm\n"));
            		}
        	}
#endif  
    	}
//ahan, [2005-10-23]

    	DBGPRINT(DBG_TXDATA | DBG_SP,("-HandleTxSingleDoneEvent()\n"));

	return NDIS_STATUS_SUCCESS;
}

/******************************************************************************
 *
 *  Name: AllocateSingleTx()
 *
 *  Description: Allocate single Tx 
 *
 *  Arguments:  PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE
 * 
 *  Notes:        
 *
 *****************************************************************************/
 
NDIS_STATUS AllocateSingleTx(
	IN PMRVDRV_ADAPTER Adapter
	)
{
       ULONG i;
	   
	Adapter->TxNode.BufVirtualAddr = NULL;
	Adapter->TxNode.BufPhyAddr.LowPart = 0xffffffff;
	Adapter->TxNode.BufPhyAddr.HighPart = 0xffffffff;
	Adapter->TxNode.LocalWCB = &Adapter->Wcb;
	Adapter->TxNode.Status = MRVDRV_TX_CTRL_NODE_STATUS_IDLE;
	Adapter->Wcb.PktPtr = 0xffffffff;
	
       for (i =0; i<MAX_TX_PACKETS; i++)
       {
		Adapter->SendPackets[i] = NULL;    
       }
    	
    	Adapter->TxPacketCount = 0;               
    	Adapter->TxPacketPut = 0;                  
    	Adapter->TxPacketGet = 0;                  
    	Adapter->TxPacketComplete = 0;
    	Adapter->TxPacketSend = 0;
    	Adapter->TxPacketSendComplete = 0;

	return NDIS_STATUS_SUCCESS;
}

VOID FreeSingleTx(
	IN PMRVDRV_ADAPTER Adapter
	)
{
	CleanUpSingleTxBuffer(Adapter);
	return;
}

/******************************************************************************
 *
 *  Name: CleanUpSingleTxBuffer()
 *
 *  Description: Clean up single Tx Bbuffer
 *
 *  Arguments:  PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE
 * 
 *  Notes:        
 *
 *****************************************************************************/
NDIS_STATUS
CleanUpSingleTxBuffer(
IN PMRVDRV_ADAPTER Adapter
)
{
    	BOOLEAN timerStatus;
	PNDIS_PACKET pPacket;	
       ULONG  i, index;

	   
	//RETAILMSG(1, (TEXT("CleanUpSingleTxBuffer  TxPacketCount= 0x%x>>> "), Adapter->TxPacketCount));	

 	EnterCriticalSection(&Adapter->TxCriticalSection);
 
	if (Adapter->bIsFreeNow == FALSE)
	{
/*	
    		if (Adapter->SentPacket)
    		{
	    		Adapter->XmitError++;
        		DBGPRINT(DBG_TXDATA, ("CleanUpSingleTxBuffer: Indicate failure for SentPacket\n"));
	    		NDIS_SET_PACKET_STATUS(Adapter->SentPacket, NDIS_STATUS_FAILURE);
	    		NdisMSendComplete(
				    	Adapter->MrvDrvAdapterHdl, 
		    			Adapter->SentPacket, 
		    			NDIS_STATUS_FAILURE);
	    		Adapter->SentPacket = NULL;
    		}
*/
       	for (i = 0; i< Adapter->TxPacketCount; i++)
       	{
			index = (Adapter->TxPacketComplete + i) % MAX_TX_PACKETS;
			pPacket = Adapter->SendPackets[index];
			NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_FAILURE);
			NdisMSendComplete(
				    	Adapter->MrvDrvAdapterHdl, 
		    			pPacket, 
		    			NDIS_STATUS_FAILURE);
	    		Adapter->SendPackets[index] = NULL;
       	}
		
		Adapter->SentPacket = NULL;
	}	

    	Adapter->TxPacketCount = 0;              
    	Adapter->TxPacketPut = 0;                  
    	Adapter->TxPacketGet = 0;                  
    	Adapter->TxPacketComplete = 0;
    	Adapter->TxPacketSend = 0;
    	Adapter->TxPacketSendComplete = 0;

    	if (Adapter->TxPktTimerIsSet==TRUE)
	{		
		NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);	
		Adapter->TxPktTimerIsSet=FALSE;
	}
		
	LeaveCriticalSection(&Adapter->TxCriticalSection);

    	return NDIS_STATUS_SUCCESS;
}
 

/******************************************************************************
 *
 *  Name: MrvDrvCancelSendPacket()
 *
 *  Description: Miniport Tx pakcet cancellation routine
 *
 *  Conditions for Use:
 *
 *  Arguments:
 *	    IN  NDIS_HANDLE MiniportAdapterContext,
 *      IN  PVOID       GroupCancelId
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
#ifdef MRVL_WINXP_NDIS51 
VOID
MrvDrvCancelSendPackets(
	IN  NDIS_HANDLE MiniportAdapterContext,
    	IN  PVOID       GroupCancelId
	)
{
	PMRVDRV_ADAPTER Adapter;
	PVOID CurCancelId;

	DBGPRINT(DBG_TXDATA,("TX - Enter MrvDrvCancelSendPackets \n"));
	//RETAILMSG(1, (TEXT("TX - Enter MrvDrvCancelSendPackets >>> ")));	
	
	Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

    	if (Adapter->SentPacket)
    	{
       	CurCancelId = NDIS_GET_PACKET_CANCEL_ID(Adapter->SentPacket);
    		if( CurCancelId == GroupCancelId )
	    	{
   			// Cancel the current packet
    			NdisMSendComplete(Adapter->MrvDrvAdapterHdl, Adapter->SentPacket, NDIS_STATUS_REQUEST_ABORTED);
            		Adapter->SentPacket = NULL;
        	}
    	}

	return;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -