亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rtusb_data.c

?? r73模塊的無線網(wǎng)卡在Linux下的驅(qū)動程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
		TransferBufferLength++;	if ((TransferBufferLength % pAd->BulkOutMaxPacketSize) == 0)		TransferBufferLength += 2;	pMLMEContext->BulkOutSize = TransferBufferLength;	RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);	DBGPRINT(RT_DEBUG_INFO, "<---MlmeHardTransmit\n");}/*	========================================================================	Routine	Description:		This subroutine will scan through releative ring descriptor to find		out avaliable free ring descriptor and compare with request size.	Arguments:		pAd			Pointer	to our adapter		RingType	Selected Ring	Return Value:		NDIS_STATUS_FAILURE		Not enough free descriptor		NDIS_STATUS_SUCCESS		Enough free descriptor	Note:	========================================================================*/NDIS_STATUS	RTUSBFreeDescriptorRequest(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			RingType,	IN	UCHAR			BulkOutPipeId,	IN	UCHAR			NumberRequired){	UCHAR			FreeNumber = 0;	UINT			Index;	NDIS_STATUS		Status = NDIS_STATUS_FAILURE;	switch (RingType)	{		case TX_RING:			Index = (pAd->NextTxIndex[BulkOutPipeId] + 1) % TX_RING_SIZE;			do			{				PTX_CONTEXT	pTxD  = &pAd->TxContext[BulkOutPipeId][Index];				// While Owner bit is NIC, obviously ASIC still need it.				// If valid bit is TRUE, indicate that TxDone has not process yet				// We should not use it until TxDone finish cleanup job				if (pTxD->InUse == FALSE)				{					// This one is free					FreeNumber++;				}				else				{					break;				}				Index = (Index + 1) % TX_RING_SIZE;			}	while (FreeNumber < NumberRequired);	// Quit here ! Free number is enough !			if (FreeNumber >= NumberRequired)			{				Status = NDIS_STATUS_SUCCESS;			}			break;		case PRIO_RING:			Index = pAd->NextMLMEIndex;			do			{				PTX_CONTEXT	pTxD  = &pAd->MLMEContext[Index];				// While Owner bit is NIC, obviously ASIC still need it.				// If valid bit is TRUE, indicate that TxDone has not process yet				// We should not use it until TxDone finish cleanup job				if (pTxD->InUse == FALSE)				{					// This one is free					FreeNumber++;				}				else				{					break;				}				Index = (Index + 1) % PRIO_RING_SIZE;			}	while (FreeNumber < NumberRequired);	// Quit here ! Free number is enough !			if (FreeNumber >= NumberRequired)			{				Status = NDIS_STATUS_SUCCESS;			}			break;		default:			DBGPRINT(RT_DEBUG_ERROR, "--->RTUSBFreeDescriptorRequest() -----!! \n");			break;	}	return (Status);}/*	========================================================================	Routine Description:	Arguments:	Return Value:	Note:	========================================================================*/VOID	RTUSBRejectPendingPackets(	IN	PRTMP_ADAPTER	pAd){	UCHAR			Index;	DBGPRINT(RT_DEBUG_TRACE, "--->RejectPendingPackets\n");	for (Index = 0; Index < 4; Index++)	{		skb_queue_purge(&pAd->SendTxWaitQueue[Index]);	}	DBGPRINT(RT_DEBUG_TRACE, "<---RejectPendingPackets\n");}/*	========================================================================	Routine	Description:		Calculates the duration which is required to transmit out frames	with given size and specified rate.	Arguments:		pTxD		Pointer to transmit descriptor		Ack			Setting for Ack requirement bit		Fragment	Setting for Fragment bit		RetryMode	Setting for retry mode		Ifs			Setting for IFS gap		Rate		Setting for transmit rate		Service		Setting for service		Length		Frame length		TxPreamble	Short or Long preamble when using CCK rates		QueIdx - 0-3, according to 802.11e/d4.4 June/2003	Return Value:		None	========================================================================*/VOID	RTUSBWriteTxDescriptor(	IN	PRTMP_ADAPTER pAd,	IN	PTXD_STRUC	pSourceTxD,	IN	UCHAR		CipherAlg,	IN	UCHAR		KeyTable,	IN	UCHAR		KeyIdx,	IN	BOOLEAN		Ack,	IN	BOOLEAN		Fragment,	IN	BOOLEAN 	InsTimestamp,	IN	UCHAR		RetryMode,	IN	UCHAR		Ifs,	IN	UINT		Rate,	IN	ULONG		Length,	IN	UCHAR		QueIdx,	IN	UCHAR		PID,	IN	BOOLEAN		bAfterRTSCTS){	UINT	Residual;	PTXD_STRUC		pTxD;#ifndef BIG_ENDIAN	pTxD = pSourceTxD;#else	TXD_STRUC		TxD;	TxD = *pSourceTxD;	pTxD = &TxD;	RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif	pTxD->HostQId	  = QueIdx;	pTxD->MoreFrag	  = Fragment;	pTxD->ACK		  = Ack;	pTxD->Timestamp   = InsTimestamp;	pTxD->RetryMd	  = RetryMode;	pTxD->Ofdm		  = (Rate < RATE_FIRST_OFDM_RATE)? 0:1;	pTxD->IFS		  = Ifs;	pTxD->PktId 	  = PID;	pTxD->Drop		  = 1;	 // 1:valid, 0:drop	pTxD->HwSeq 	  = 1;	  // (QueIdx == QID_MGMT)? 1:0;	pTxD->BbpTxPower  = DEFAULT_BBP_TX_POWER; // TODO: to be modified	pTxD->DataByteCnt = Length;	RTMPCckBbpTuning(pAd, Rate);	// fill encryption related information, if required	pTxD->CipherAlg   = CipherAlg;	if (CipherAlg != CIPHER_NONE)	{		pTxD->KeyTable	  = KeyTable;		pTxD->KeyIndex	  = KeyIdx;		pTxD->TkipMic	  = 1;	}	// In TKIP+fragmentation. TKIP MIC is already appended by driver. MAC needs not generate MIC	if (CipherAlg == CIPHER_TKIP_NO_MIC)	{		pTxD->CipherAlg   = CIPHER_TKIP;		pTxD->TkipMic	  = 0;	 // tell MAC need not insert TKIP MIC	}	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))	{		if ((pAd->PortCfg.APEdcaParm.bValid) && (QueIdx <= QID_AC_VO))		{			pTxD->Cwmin = pAd->PortCfg.APEdcaParm.Cwmin[QueIdx];			pTxD->Cwmax = pAd->PortCfg.APEdcaParm.Cwmax[QueIdx];			pTxD->Aifsn = pAd->PortCfg.APEdcaParm.Aifsn[QueIdx];		}		else		{			DBGPRINT(RT_DEBUG_ERROR," WMM in used but EDCA not valid ERROR !!\n)");		}	}	else	{        if (bAfterRTSCTS)        {            // After RTS/CTS frame, data frame should use SIFS time.            // To patch this code, add the following code.            // Recommended by Jerry 2005/07/25 for WiFi testing with Proxim AP            pTxD->Cwmin = 0;            pTxD->Cwmax = 0;            pTxD->Aifsn = 1;            pTxD->IFS = IFS_BACKOFF;        }        else        {            pTxD->Cwmin = CW_MIN_IN_BITS;            pTxD->Cwmax = CW_MAX_IN_BITS;            pTxD->Aifsn = 2;	    }	}	// fill up PLCP SIGNAL field	pTxD->PlcpSignal = RateIdToPlcpSignal[Rate];	if (((Rate == RATE_2) || (Rate == RATE_5_5) || (Rate == RATE_11)) &&		(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED)))	{		pTxD->PlcpSignal |= 0x0008;	}	// fill up PLCP SERVICE field, not used for OFDM rates	pTxD->PlcpService = 4; // Service;	// file up PLCP LENGTH_LOW and LENGTH_HIGH fields	Length += LENGTH_CRC;	// CRC length	switch (CipherAlg)	{		case CIPHER_WEP64:		 Length += 8;	 break;  // IV + ICV		case CIPHER_WEP128: 	 Length += 8;	 break;  // IV + ICV		case CIPHER_TKIP:		 Length += 20;	 break;  // IV + EIV + MIC + ICV		case CIPHER_AES:		 Length += 16;	 break;  // IV + EIV + MIC		case CIPHER_CKIP64: 	 Length += 8;	 break;  // IV + CMIC + ICV, but CMIC already inserted by driver		case CIPHER_CKIP128:	 Length += 8;	 break;  // IV + CMIC + ICV, but CMIC already inserted by driver		case CIPHER_TKIP_NO_MIC: Length += 12;	 break;  // IV + EIV + ICV		default:								 break;	}	if (Rate < RATE_FIRST_OFDM_RATE)	// 11b - RATE_1, RATE_2, RATE_5_5, RATE_11	{		if ((Rate == RATE_1) || ( Rate == RATE_2))		{			Length = Length * 8 / (Rate + 1);		}		else		{			Residual = ((Length * 16) % (11 * (1 + Rate - RATE_5_5)));			Length = Length * 16 / (11 * (1 + Rate - RATE_5_5));			if (Residual != 0)			{				Length++;			}			if ((Residual <= (3 * (1 + Rate - RATE_5_5))) && (Residual != 0))			{				if (Rate == RATE_11)			// Only 11Mbps require length extension bit					pTxD->PlcpService |= 0x80; // 11b's PLCP Length extension bit			}		}		pTxD->PlcpLengthHigh = Length >> 8; // 256;		pTxD->PlcpLengthLow = Length % 256;	}	else	// OFDM - RATE_6, RATE_9, RATE_12, RATE_18, RATE_24, RATE_36, RATE_48, RATE_54	{		pTxD->PlcpLengthHigh = Length >> 6; // 64;	// high 6-bit of total byte count		pTxD->PlcpLengthLow = Length % 64;	 // low 6-bit of total byte count	}	pTxD->Burst  = Fragment;	pTxD->Burst2 = pTxD->Burst;#ifdef BIG_ENDIAN	RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);	WriteBackToDescriptor((PUCHAR)pSourceTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);#endif}/*	========================================================================	Routine	Description:		To do the enqueue operation and extract the first item of waiting		list. If a number of available shared memory segments could meet		the request of extracted item, the extracted item will be fragmented		into shared memory segments.	Arguments:		pAd			Pointer	to our adapter		pQueue		Pointer to Waiting Queue	Return Value:		None	Note:		Called only from process context, protected by the usb semaphore.	========================================================================*/VOID	RTMPDeQueuePacket(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			BulkOutPipeId){	struct sk_buff	*pSkb;	UCHAR			FragmentRequired;	NDIS_STATUS		Status;	UCHAR			Count = 0;	struct sk_buff_head	*pQueue;	UCHAR			QueIdx;	QueIdx = BulkOutPipeId;	if (pAd->TxRingTotalNumber[BulkOutPipeId])		DBGPRINT(RT_DEBUG_INFO,"--RTMPDeQueuePacket %d TxRingTotalNumber= %d !!--\n", BulkOutPipeId, (INT)pAd->TxRingTotalNumber[BulkOutPipeId]);	// Select Queue	pQueue = &pAd->SendTxWaitQueue[BulkOutPipeId];	// Check queue before dequeue	while (!skb_queue_empty(pQueue) && (Count < MAX_TX_PROCESS))	{		// Reset is in progress, stop immediately		if ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||			 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))		{			DBGPRINT(RT_DEBUG_ERROR,"--RTMPDeQueuePacket %d reset-in-progress !!--\n", BulkOutPipeId);			RTUSBFreeSkbBuffer(skb_dequeue(pQueue));			continue;		}		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {			DBGPRINT(RT_DEBUG_TRACE,				 "RTUSBDeQueuePacket scanning. Flags = 0x%x\n",				 pAd->Flags);			break;		}		// Dequeue the first entry from head of queue list		pSkb = skb_dequeue(pQueue);		// RTS or CTS-to-self for B/G protection mode has been set already.		// There is no need to re-do it here.		// Total fragment required = number of fragment + RST if required		FragmentRequired = RTMP_GET_PACKET_FRAGMENTS(pSkb) + RTMP_GET_PACKET_RTS(pSkb);		if ((RTUSBFreeDescriptorRequest(pAd, TX_RING, BulkOutPipeId, FragmentRequired) == NDIS_STATUS_SUCCESS))		{			// Avaliable ring descriptors are enough for this frame			// Call hard transmit			// Nitro mode / Normal mode selection			Status = RTUSBHardTransmit(pAd, pSkb, FragmentRequired, QueIdx);			if (Status == NDIS_STATUS_FAILURE)			{				// Packet failed due to various Ndis Packet error				RTUSBFreeSkbBuffer(pSkb);				break;			}			else if (Status == NDIS_STATUS_RESOURCES)			{				// Not enough free tx ring, it might happen due to free descriptor inquery might be not correct				// It also might change to NDIS_STATUS_FAILURE to simply drop the frame				// Put the frame back into head of queue				skb_queue_head(pQueue, pSkb);				break;			}else if(Status == NDIS_STATUS_RINGFULL){//Thomas add				pAd->TxRingTotalNumber[QueIdx]= 0;				RTUSBFreeSkbBuffer(pSkb);				break;			}			Count++;		}		else		{			DBGPRINT(RT_DEBUG_INFO,"--RTMPDeQueuePacket %d queue full !! TxRingTotalNumber= %d !! FragmentRequired=%d !!\n", BulkOutPipeId, (INT)pAd->TxRingTotalNumber[BulkOutPipeId], FragmentRequired);			skb_queue_head(pQueue, pSkb);		    pAd->PrivateInfo.TxRingFullCnt++;			break;		}	}}VOID	RTMPDeQueuePackets(IN	PRTMP_ADAPTER	pAd){	int	Index;	for (Index = 0; Index < 4; Index++)	{		if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&			!skb_queue_empty(&pAd->SendTxWaitQueue[Index]))		{			RTMPDeQueuePacket(pAd, Index);		}	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区视频 | 欧美一激情一区二区三区| 美女国产一区二区三区| 国产精品成人网| 欧美大片在线观看一区| 色狠狠色狠狠综合| 国产激情偷乱视频一区二区三区| 午夜av区久久| 亚洲欧洲精品天堂一级| 日韩精品中文字幕一区| 色嗨嗨av一区二区三区| 成人高清免费观看| 韩国一区二区三区| 日本中文字幕一区二区视频| 捆绑调教一区二区三区| 中文字幕一区二区三区在线不卡| 精品国产一区二区三区久久久蜜月| 在线观看国产91| 成年人午夜久久久| 国产成人在线视频播放| 蜜桃传媒麻豆第一区在线观看| 亚洲国产sm捆绑调教视频| 中文字幕一区二区三区乱码在线| www国产亚洲精品久久麻豆| 欧美一级xxx| 69堂国产成人免费视频| 欧美日韩在线播| 在线观看日韩国产| 91福利视频在线| 91免费版在线| 色综合天天综合网天天狠天天| av电影一区二区| 成人免费va视频| 成人免费高清视频在线观看| 国产黄人亚洲片| 成人一区二区三区视频| 国产suv精品一区二区6| 成人午夜激情视频| 成人国产电影网| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 成人三级伦理片| 成人精品鲁一区一区二区| 福利一区福利二区| 成人污污视频在线观看| jizz一区二区| 91丨porny丨国产入口| 91丨porny丨中文| 欧美日韩一区国产| 日韩一级免费一区| 2017欧美狠狠色| 日本一区二区三区在线观看| 中文字幕国产一区二区| 中文字幕欧美国产| 亚洲精品国产第一综合99久久| 一区二区三区欧美久久| 午夜欧美一区二区三区在线播放| 日本在线不卡视频一二三区| 国产一区美女在线| 91在线观看下载| 欧美日韩你懂的| 欧美变态tickling挠脚心| 国产亚洲综合色| 亚洲综合在线视频| 麻豆精品久久久| 成人av网址在线| 欧美日韩你懂得| 久久久久久亚洲综合| 最新中文字幕一区二区三区| 亚洲一区二区三区不卡国产欧美| 日韩国产一二三区| 国产精品99久久久久久久vr | 99re这里只有精品6| 欧美视频日韩视频在线观看| 日韩欧美精品在线视频| 国产精品色一区二区三区| 亚洲国产婷婷综合在线精品| 蜜臀av性久久久久蜜臀aⅴ| 成人福利视频在线| 91精品国产高清一区二区三区| 国产午夜三级一区二区三| 亚洲精品免费看| 韩国v欧美v日本v亚洲v| 成人精品免费看| 欧美一区二区三区啪啪| 最新成人av在线| 蜜桃一区二区三区在线| 色综合咪咪久久| 久久综合精品国产一区二区三区| 亚洲视频电影在线| 狠狠色综合色综合网络| 欧美色爱综合网| 中文字幕日韩精品一区| 蜜桃视频免费观看一区| 91久久精品一区二区二区| 精品成人一区二区三区四区| 亚洲一区av在线| 国产高清久久久| 欧美一区二区三区免费大片 | 免费在线欧美视频| av在线不卡观看免费观看| 欧美tickling挠脚心丨vk| 亚洲美女视频在线观看| 成人污污视频在线观看| 精品国产免费人成在线观看| 亚洲国产精品久久人人爱蜜臀| 国产成人高清在线| 精品蜜桃在线看| 视频一区二区三区中文字幕| 一本久久综合亚洲鲁鲁五月天| 久久久久国产精品人| 日韩电影在线一区二区| 欧美色爱综合网| 一区二区三区欧美日| 97se亚洲国产综合自在线不卡| 久久综合九色综合97_久久久| 免费在线看一区| 91精品欧美一区二区三区综合在| 一区二区不卡在线播放| 99在线热播精品免费| 国产校园另类小说区| 精品系列免费在线观看| 日韩欧美一级二级三级| 青青草国产精品亚洲专区无| 欧美日韩国产中文| 亚洲国产欧美在线| 色av综合在线| 亚洲综合在线视频| 欧美日韩一区在线| 日韩精品一区第一页| 欧美日韩国产欧美日美国产精品| 亚洲一区二区成人在线观看| 91福利视频久久久久| 一区二区不卡在线播放| 欧美性一二三区| 婷婷一区二区三区| 日韩欧美高清在线| 精东粉嫩av免费一区二区三区| 日韩免费观看高清完整版 | 91.com视频| 日韩国产精品大片| 欧美一区二区成人| 免费视频一区二区| 精品久久五月天| 国产资源在线一区| 欧美国产欧美综合| 91在线视频观看| 亚洲成av人片在线观看无码| 欧美年轻男男videosbes| 日本亚洲欧美天堂免费| 精品免费视频.| 成人av免费在线| 亚洲激情自拍偷拍| 7777精品伊人久久久大香线蕉经典版下载| 亚洲.国产.中文慕字在线| 91精品国产综合久久久久久久| 欧美aaaaaa午夜精品| 久久久久久免费网| 97精品久久久午夜一区二区三区| 亚洲一区二区三区中文字幕 | 国产精品12区| 亚洲图片你懂的| 欧美少妇bbb| 美美哒免费高清在线观看视频一区二区| 精品三级在线看| 成人app软件下载大全免费| 亚洲欧洲国产专区| 欧美理论在线播放| 国产一区二区0| 亚洲欧美另类久久久精品2019| 欧美日本免费一区二区三区| 精品在线免费视频| 国产精品九色蝌蚪自拍| 欧美日韩一级片在线观看| 精品一区二区三区不卡| 国产精品乱码一区二区三区软件 | 欧美日韩中文字幕一区二区| 男女男精品视频网| 亚洲同性gay激情无套| 欧美另类久久久品| 成av人片一区二区| 欧美96一区二区免费视频| 国产精品久久久久三级| 欧美精品乱人伦久久久久久| 国产传媒日韩欧美成人| 一区二区免费视频| 国产欧美1区2区3区| 欧美日韩1区2区| 成人黄色av电影| 久久精品久久99精品久久| 日韩美女精品在线| 久久欧美中文字幕| 欧美日韩大陆一区二区| av午夜精品一区二区三区| 久久精品72免费观看| 一区二区三区在线观看国产| 久久婷婷一区二区三区| 这里是久久伊人| 日本高清无吗v一区| 国产a级毛片一区| 老司机一区二区|