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

📄 wt_stmac.c

📁 mini-PCI driver for LHWT chipsets
💻 C
📖 第 1 页 / 共 2 页
字号:
					if( !IsQueueEmpty( &Adapter->AnFrmQ ) )					{						pEntry = RemoveHeadQueue(&Adapter->AnFrmQ); 						////////////////////////////////////////////////////////////						pWtTxBuf = (PWTWLAN_TXBUF)list_entry( (struct list_head *)pEntry, WTWLAN_TXBUF, List );						////////////////////////////////////////////////////////////						Adapter->AnQLen--;												}					else					{											pWtTxBuf = QosSendProcess( Adapter );					}				}			}			break;		case ASOC_PASS:			{				if( Adapter->MacParameter.sCfPollable & Adapter->MacParameter.mCfp )				{					if( Adapter->MacParameter.bNeedCFACK )					{						Adapter->MacParameter.bNeedCFACK = FALSE;						// add CFRSP code here						pWtTxBuf = QosSendProcess( Adapter );					}				}				else					pWtTxBuf = QosSendProcess( Adapter );			}			break;		case BSS:		case AUTH_PASS:		case NO_BSS:		default:			{				//pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; 				//WT_FREE_SEND_PACKET( Adapter, pWtTxBuf);				break;								}		}		break;	case WLAN_MACMODE_ESS_AP:	case WLAN_MACMODE_NONE:	default :		{			//pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE;			//WT_FREE_SEND_PACKET( Adapter, pWtTxBuf);			break;				}	}        FN_EXIT(0,0);	return pWtTxBuf;}// Now tx bank4 as the special bank // mgmt frm and cfack etc urgency frm send via bank4// canceal mechanism can be adopted to optimize performanceBOOL MpSend(IN PWT_ADAPTER Adapter, IN PWTWLAN_TXBUF pWtTxBuf, IN BOOL bMgmtFrm){	int loopCount = MAX_URGENCY_BANK_LOOP_COUNT;	int loopIndex = 0;	PWTWLAN_TXBUF  pWtSentBuf = NULL;	UINT MsecDelay = 1;	UCHAR TxBank;	UCHAR TxBankStatus;	p80211_hdr_t *w_hdr;	FN_ENTER;		w_hdr = (p80211_hdr_t *)&pWtTxBuf->TXHwBuf.pHwTxBuf->dot11Head;	pWtTxBuf->Frmtype = ( WLAN_GET_FC_FTYPE(ieee2host16(w_hdr->a3.fc)) ) | ( WLAN_GET_FC_FSTYPE(ieee2host16(w_hdr->a3.fc)) );	if( Adapter->MacParameter.bPowerMgtPend )	{		pWtSentBuf->bPowerMgtPend = TRUE;	}	if( bMgmtFrm )	{		// define bank4 as special bank 		TxBank = WtWlanGetUrgentFreeBank( Adapter );		TxBankStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );		if( pWtTxBuf->bUrgency )		{			if( TxBankStatus != TX_STATUS_BANK_EMPTY )			{				ASSERT( Adapter->WtTDB.pTxbuf[TxBank] );				pWtSentBuf = Adapter->WtTDB.pTxbuf[TxBank];				Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = TxBankStatus;				Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START;			}		}		else		{			while( (loopIndex < loopCount )&&(! (MASK_TX_STATUS_BANK_AVAILABLE & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3)))))			{				udelay( MsecDelay );				loopIndex++;			}			TxBankStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );			if( TxBankStatus != TX_STATUS_BANK_EMPTY )			{				Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START;				if( Adapter->WtTDB.pTxbuf[TxBank] != NULL )					{						pWtSentBuf = Adapter->WtTDB.pTxbuf[TxBank];						Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );					}			}		}		pWtTxBuf->TxBank = TxBank;		NICSendPacket(Adapter, pWtTxBuf);	}	else	{		TxBank = WtWlanGetFreeBank( Adapter );		//	a freebank var may accelerate to find free bank find		switch ( Adapter->MacParameter.macmode )		{		case WLAN_MACMODE_IBSS_STA:		case WLAN_MACMODE_ESS_STA:			switch( Adapter->MacParameter.CurrentState )			{			case IBSS_IDLE:			case IBSS_ACTIVE:				{					TxBankStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );					if( TxBankStatus != TX_STATUS_BANK_EMPTY )					{						//ASSERT( Adapter->WtTDB.pTxbuf[TxBank] );						if( Adapter->WtTDB.pTxbuf[TxBank] != NULL )							{								Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );								if(Adapter->WtTDB.pTxbuf[TxBank]->TxStatus == TX_STATUS_SUCCESS_DONE)								{									Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_SUCCESS;								}								else								{									Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_FAILURE;								}								TxDoneHandle( Adapter, Adapter->WtTDB.pTxbuf[TxBank]);							}						Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START;					}					pWtTxBuf->TxBank = TxBank;					NICSendPacket(Adapter, pWtTxBuf);				}				break;			case ASOC_PASS:				{					TxBankStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );					if( TxBankStatus != TX_STATUS_BANK_EMPTY )					{						//ASSERT( Adapter->WtTDB.pTxbuf[TxBank] );						if( Adapter->WtTDB.pTxbuf[TxBank] != NULL )						{							Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & (  Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) );							if(Adapter->WtTDB.pTxbuf[TxBank]->TxStatus == TX_STATUS_SUCCESS_DONE)							{								Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_SUCCESS;							}							else							{								Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_FAILURE;							}							TxDoneHandle( Adapter, Adapter->WtTDB.pTxbuf[TxBank]);						}						Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START;					}					pWtTxBuf->TxBank = TxBank;					NICSendPacket(Adapter, pWtTxBuf);				}				break;			case BSS:			case AUTH_PASS:			case NO_BSS:			default:				{					pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; 					//dev_kfree_skb(pWtTxBuf->skb);					WT_FREE_SEND_PACKET( Adapter, pWtTxBuf);					break;									}			}			break;		case WLAN_MACMODE_ESS_AP:		case WLAN_MACMODE_NONE:		default :			{				pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE;				//dev_kfree_skb(pWtTxBuf->skb);				WT_FREE_SEND_PACKET( Adapter, pWtTxBuf);				break;					}		}	}	if( pWtSentBuf )	{		switch ( pWtSentBuf->TxStatus )		{		case TX_STATUS_SUCCESS_DONE:			pWtSentBuf->SendStatus = NDIS_STATUS_SUCCESS;			break;		case TX_STATUS_FAILURE_DONE:		case TX_STATUS_FAILURE_TTL:			pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE;  			break;		case TX_STATUS_UNDERGO:		case TX_STATUS_WAITSEND:			pWtTxBuf->ReQueueCount = 0;			pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE;  			break;		default :			pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE;  			break;						}		WT_SET_FLAG( pWtSentBuf, fWT_TX_CANCEAL_MASK);		TxDoneHandle( Adapter, pWtSentBuf);	} 	FN_EXIT(0,0);	return TRUE;}BOOL NICRecv(IN PWT_ADAPTER Adapter, IN UINT RcvBank, OUT PWTWLAN_RXBUF pWtRxBuf ){	PWTWLAN_RXBUF           pEncryptRxbuf = NULL;	PWTWLAN_HWRXBUF         pHwRxbuf = NULL;	BOOL 			bSoftDecrypt;	ULONG			Length;	//UINT 			payload_offset;	p80211_hdr_t            *w_hdr;	UINT8 *daddr = NULL;	UINT8 *saddr = NULL;	wlan_ethhdr_t           *e_hdr;	wlan_llc_t              *e_llc;	wlan_snap_t             *e_snap;	UINT8                   *e_payload;	BOOL		        bEtherIIhead = FALSE;	FN_ENTER;	pHwRxbuf = &Adapter->MainMemAddress->RxBufMap[RcvBank].HwRxBuf;	// auth fram3 also need decrypt, check condition	if( pWtRxBuf->ftype == WLAN_FTYPE_DATA )  	{		if( Adapter->MacParameter.bSoftDecrypt &&(WLAN_GET_FC_ISWEP(pWtRxBuf->FrmCtl)))		{			bSoftDecrypt	= TRUE;			//pEncryptRxbuf->RXHwBuf.pHwRxBuf;			AllocRxMgmtBuff(Adapter,  &pEncryptRxbuf);			if( 	pEncryptRxbuf  )			{				if( !WTWlanDecryptMPDU( Adapter, RcvBank, pEncryptRxbuf->RXHwBuf.pHwRxBuf ))				{					NICReturnRxMgmtBuf( Adapter, pEncryptRxbuf);					//DBGPRINT(WT_TRACE, ("<-- NICRecv\n"));					return FALSE;				}				else				{					pHwRxbuf = pEncryptRxbuf->RXHwBuf.pHwRxBuf;				}			}			else			{				//DBGPRINT(WT_TRACE, ("<-- NICRecv\n"));				return FALSE;			}		}		Length = sizeof( WTWLAN_RSB) + MAX_HW_HEAD_LEN ;                ////////////////////////////////////////////////////////////////////////////////////////		/*		NdisMoveFromMappedMemory( 			pWtRxBuf->RXHwBuf.pRxBuffer,			pHwRxbuf,			Length			);		*/		memmove( pWtRxBuf->RXHwBuf.pRxBuffer, pHwRxbuf, Length);		/////////////////////////////////////////////////////////////////////////////////////////		//Dump( (char *)pWtRxBuf->RXHwBuf.pHwRxBuf,Length, TRUE, 1 );		//Dump( (char *)pHwRxbuf,Length + pHwRxbuf->RxStatus.RecvBodyLen, TRUE, 1 );		//swap for date add ether head here--------------				e_hdr = (wlan_ethhdr_t *)(pWtRxBuf->RXHwBuf.pHwRxBuf->Buffer);		e_llc = (wlan_llc_t *)(&pHwRxbuf->Buffer);		e_snap = (wlan_snap_t *) (((UINT8 *) e_llc) + sizeof(wlan_llc_t));		e_payload = ((UINT8 *) e_snap) + sizeof(wlan_snap_t);		w_hdr = 	(p80211_hdr_t*)&pWtRxBuf->RXHwBuf.pHwRxBuf->dot11Head;		//DbgPrint("\nThe sequence number of data frame is %4x\n", w_hdr->a3.seq);		//FrmCtrl has been changed from ieee to host				if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 0) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 0)) {			daddr = w_hdr->a3.a1;			saddr = w_hdr->a3.a2;		} else if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 0) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 1)) {			daddr = w_hdr->a3.a1;			saddr = w_hdr->a3.a3;		} else if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 1) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 0)) {			daddr = w_hdr->a3.a3;			saddr = w_hdr->a3.a2;		} else {			daddr = w_hdr->a4.a3;			saddr = w_hdr->a4.a4;		}		// data should > 0 discard other frame include nodata 		if( ieee2host16( pHwRxbuf->RxStatus.RecvBodyLen ) > 0 )		{			if( ( e_llc->dsap == 0xaa ) && 				( e_llc->ssap == 0xaa ) &&				( e_llc->ctl == 0x03 ) )			{				if ((e_snap->oui[0] == 0x00 )&&(e_snap->oui[1] == 0x00 )&&(e_snap->oui[2] == 0xf8 ) ) 				{  //8021h					bEtherIIhead = TRUE;				}				else				{					// check					if( (e_snap->type == host2ieee16(0x80f3))||(e_snap->type == host2ieee16(0x8137)) )						bEtherIIhead  = FALSE;					else						bEtherIIhead = TRUE;				}			}		}		else		{			//DBGPRINT(WT_TRACE, ("<-- NICRecv\n"));			return FALSE;		}		if( bEtherIIhead )			{			pWtRxBuf->NDISPacketOffset = sizeof(wlan_llc_t) + sizeof(wlan_snap_t);			pWtRxBuf->CopyLen = ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) - pWtRxBuf->NDISPacketOffset ;			e_hdr->type = e_snap->type;			//printk("File %s Line = %d e_hdr->type = %04x pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen =%d \n", __FILE__, __LINE__,e_hdr->type, ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) );		}		else		{			pWtRxBuf->NDISPacketOffset = 0;			pWtRxBuf->CopyLen = ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) - pWtRxBuf->NDISPacketOffset ;			e_hdr->type = host2ieee16( ieee2host16( pHwRxbuf->RxStatus.RecvBodyLen ) );			//printk("File %s Line = %d e_hdr->type = %d\n",  __FILE__, __LINE__, e_hdr->type );		}                ////////////////////////////////////////////////////////////////////////////////////		/*		NdisMoveMemory( e_hdr->daddr,  daddr,  ETH_ALEN );		NdisMoveMemory( e_hdr->saddr,  saddr,  ETH_ALEN );		*/		memmove(e_hdr->daddr, daddr, ETH_ALEN);		memmove(e_hdr->saddr, saddr, ETH_ALEN);		////////////////////////////////////////////////////////////////////////////////////		Length = pWtRxBuf->CopyLen;  		//printk("File %s Line = %d Length = %d\n",  __FILE__, __LINE__, Length );		if( ( Length <= 0 ) || ( pWtRxBuf->NDISPacketOffset >= ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) ) )		{			//DBGPRINT(WT_TRACE, ("<-- NICRecv\n"));			return FALSE;		} 		////////////////////////////////////////////////////////////////////////////////////		/*NdisMoveFromMappedMemory(//锟給dy锟?转为锟教

⌨️ 快捷键说明

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