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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? rtusb_data.c

?? 臺(tái)灣RALink公司的 rt2570無(wú)線 802.11g 網(wǎng)卡的 驅(qū)動(dòng)的源代碼 ,支持linux2.4以上的 內(nèi)河
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
/*
 ***************************************************************************
 * Ralink Tech Inc.
 * 4F, No. 2 Technology 5th Rd.
 * Science-based Industrial Park
 * Hsin-chu, Taiwan, R.O.C.
 *
 * (c) Copyright 2002-2004, Ralink Technology, Inc.
 *
 * This program is free software; you can redistribute it and/or modify  * 
 * it under the terms of the GNU General Public License as published by  * 
 * the Free Software Foundation; either version 2 of the License, or     * 
 * (at your option) any later version.                                   * 
 *                                                                       * 
 * This program is distributed in the hope that it will be useful,       * 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        * 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * 
 * GNU General Public License for more details.                          * 
 *                                                                       * 
 * You should have received a copy of the GNU General Public License     * 
 * along with this program; if not, write to the                         * 
 * Free Software Foundation, Inc.,                                       * 
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * 
 *                                                                       * 
 ************************************************************************
	Module Name:
	rtusb_data.c

	Abstract:

	Revision History:
	Who			When			What
	--------	----------		----------------------------------------------
	Name		Date			Modification logs
	Jan Lee		2005-06-01		Release
*/
#include	"rt_config.h"

static  UCHAR PlcpSignal[12] = { 
	 0, /* RATE_1 */    1, /* RATE_2 */     2, /* RATE_5_5 */   3, /* RATE_11 */    // see BBP spec
	11, /* RATE_6 */   15, /* RATE_9 */    10, /* RATE_12 */   14, /* RATE_18 */    // see IEEE802.11a-1999 p.14
	 9, /* RATE_24 */  13, /* RATE_36 */    8, /* RATE_48 */    12  /* RATE_54 */ }; // see IEEE802.11a-1999 p.14
static	UCHAR	SNAP_802_1H[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
static	UCHAR	SNAP_BRIDGE_TUNNEL[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};
static	UCHAR	EAPOL[] = {0x88, 0x8e};
static	UCHAR	IPX[] = {0x81, 0x37};
static	UCHAR	APPLE_TALK[] = {0x80, 0xf3};
UCHAR	ARP[]={0x08, 0x06};
////////////////////////////////////////////////////////////////////////////
//
//	FUNCTION
//		RTUSBSendPackets
//		
//	DESCRIPTION
//	  VNETMultipleSend handler is called by NDIS to transmit packets
//	  through the adapter. If there are packets in the Q and the device
//	  can accept the Tx requests initiate a transmission and queue the
//	  rest of the packets (if any...). If we can not transmit or the
//	  station is not ready we imediatelly complete the request
//		
//	INPUT
//	  MiniportAdapterContext		Context registered with the wrapper
//									(Ptr to to the Adapter object)
//	  PacketArray					Array of Ptrs to NDIS_PACKET structs
//	  NumberOfPackets				Number of packets in PacketArray
//		
//	OUTPUT
//		-
//		
////////////////////////////////////////////////////////////////////////////
int RTUSBSendPackets(struct sk_buff *skb, struct net_device *net_dev)
{

	NDIS_STATUS 	Status = NDIS_STATUS_SUCCESS;
	PRT2570ADAPTER	pAdapter = net_dev->priv;
	
	skb->data_len = skb->len;
	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
		RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS) ||
		RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF) ||
		RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS))
	{
		RTUSBFreeSkbBuffer(skb);
		return 0;
	}
	// Drop packets if no associations
	else if (!INFRA_ON(pAdapter) && !ADHOC_ON(pAdapter))
	{
		RTUSBFreeSkbBuffer(skb);
		return 0;
	}
	else
	{
		Status = RTUSBSendPacket(pAdapter, skb);
	        if (Status != NDIS_STATUS_SUCCESS)
	        {
			// Errors before enqueue stage
			RTUSBFreeSkbBuffer(skb);
			DBGPRINT(RT_DEBUG_TRACE,"<---RTUSBSendPackets not dequeue\n");
			return 0;
	        }
	}
	// Dequeue one frame from SendTxWait queue and process it
	// There are two place calling dequeue for TX ring.
	// 1. Here, right after queueing the frame.
	// 2. At the end of TxRingTxDone service routine.
	if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) && 
		(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF)) &&
		(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
		(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
		(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)))
	{
	    //RTMPDeQueuePacket(pAdapter, &pAdapter->TxSwQueue0);
	    // Call dequeue without selected queue, let the subroutine select the right priority
	    // Tx software queue
	    RTUSBDeQueuePacket(pAdapter);
	}

	// Kick bulk out
	RTUSBKickBulkOut(pAdapter);
	return 0;
}

NDIS_STATUS	RTUSBSendPacket(
	IN	PRT2570ADAPTER	pAdapter,
	IN  struct sk_buff  *skb)
{


	PVOID			pVirtualAddress;
	PQUEUE_HEADER			pTxQueue;
	ULONG					Priority;
	UCHAR			NumberOfFrag;
	UCHAR			RTSRequired;
	UINT			AllowFragSize;
	UCHAR                   AccessCategory;
	NDIS_STATUS		Status = NDIS_STATUS_FAILURE;
	UCHAR			PsMode;

	// Init priority value
	Priority = 0;
	AccessCategory = 0;
	
	if (skb)
	{
		Priority = skb->priority;
		// 802.11e/d4.4 June, 2003
		if (Priority <=2)
		    AccessCategory = 0;
		else if (Priority == 3)
		    AccessCategory = 1;
		else if (Priority <= 5)
		    AccessCategory = 2;
		else
		    AccessCategory = 3;
		DBGPRINT(RT_DEBUG_INFO, "Priority = %d, AC = %d\n", Priority, AccessCategory);
	}
	// For TKIP, MIC value is treated as payload, it might be fragmented through
	// different MPDUs.
	if (pAdapter->PortCfg.WepStatus == Ndis802_11Encryption2Enabled)
	{
		skb->data_len += 8;
	}

	pVirtualAddress = (PVOID)skb->data;
	// Check for virtual address allocation, it might fail !!!
	if (pVirtualAddress == NULL)
	{
		DBGPRINT(RT_DEBUG_TRACE,"<---RTUSBSendPacket NULL pVirtualAddress\n");
		// Resourece is low, system did not allocation virtual address
		// return NDIS_STATUS_FAILURE directly to upper layer
		return (Status);
	}

	//
	// Check for multicast or broadcast (First byte of DA)
	//
	if ((*((PUCHAR) pVirtualAddress) & 0x01) != 0)
	{
		// For multicast & broadcast, there is no fragment allowed
		NumberOfFrag = 1;
	}
	else
	{
		// Check for payload allowed for each fragment
		AllowFragSize = (pAdapter->PortCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;

		// Calculate fragments required
		NumberOfFrag = ((skb->data_len - LENGTH_802_3 + LENGTH_802_1_H) / AllowFragSize) + 1;
		// Minus 1 if the size just match to allowable fragment size
		if (((skb->data_len - LENGTH_802_3 + LENGTH_802_1_H) % AllowFragSize) == 0)
		{
			NumberOfFrag--;
		}
	}
	
	// Check for requirement of RTS 
	if (NumberOfFrag > 1)
	{
		// If multiple fragment required, RTS is required only for the first fragment
		// if the fragment size large than RTS threshold
		RTSRequired = (pAdapter->PortCfg.FragmentThreshold > pAdapter->PortCfg.RtsThreshold) ? 1 : 0;
	}
	else
	{
		RTSRequired = (skb->data_len > pAdapter->PortCfg.RtsThreshold) ? 1 : 0;
	}

	// RTS/CTS may also be required in order to protect OFDM frame
	if ((pAdapter->PortCfg.TxRate >= RATE_FIRST_OFDM_RATE) && pAdapter->PortCfg.BGProtectionInUsed)
		RTSRequired = 1;
	//DBGPRINT(RT_DEBUG_TEMP, "Number of fragments :%d , include RTS :%d\n", NumberOfFrag, NumberOfFrag + RTSRequired);
        
	// Save framnet number to Ndis packet reserved field
	RTMP_SET_PACKET_FRAGMENTS(skb, NumberOfFrag);	     

	// Save RTS requirement to Ndis packet reserved field
	RTMP_SET_PACKET_RTS(skb, RTSRequired);

	// Make sure SendTxWait queue resource won't be used by other threads
	NdisAcquireSpinLock(&pAdapter->SendTxWaitQueueLock);

	pTxQueue = &pAdapter->SendTxWaitQueue;
	if (INFRA_ON(pAdapter))
	{
		if(pTxQueue->Number > MAX_PACKETS_IN_QUEUE)
		    { 
		        DBGPRINT(RT_DEBUG_WARN, "pTxQueue is full!!!\n\n");
		        pAdapter->bNetDeviceStopQueue = TRUE;
		        netif_stop_queue(pAdapter->net);
		    }
		 
		// In infrastructure mode, simply enqueue the packet into Tx waiting queue.
		DBGPRINT(RT_DEBUG_INFO, "Infrastructure -> Enqueue one frame\n");

		// Enqueue Ndis packet to end of Tx wait queue
		InsertTailQueue(pTxQueue, skb);
		Status = NDIS_STATUS_SUCCESS;
	}
	else
	{
		if(pTxQueue->Number > MAX_PACKETS_IN_QUEUE)
		{
			DBGPRINT(RT_DEBUG_WARN, "pTxQueue is full!!!\n");
			pAdapter->bNetDeviceStopQueue = TRUE;
			netif_stop_queue(pAdapter->net);
		}

		// In IBSS mode, power state of destination should be considered.
		PsMode = PWR_ACTIVE;		// Faked
		if (PsMode == PWR_ACTIVE)
		{
			// Enqueue Ndis packet to end of Tx wait queue
			InsertTailQueue(pTxQueue, skb);
			Status = NDIS_STATUS_SUCCESS;
		}
	}
	
	NdisReleaseSpinLock(&pAdapter->SendTxWaitQueueLock);
	return Status;
}

VOID	RTUSBDeQueuePacket(
	IN	PRT2570ADAPTER	pAdapter)
{

	UCHAR			FragmentRequired;
	NDIS_STATUS		Status = NDIS_STATUS_SUCCESS;
	struct sk_buff  *skb;
	PQUEUE_HEADER	pQueue;
	UCHAR			Count = 0;
	// Make sure SendTxWait queue resource won't be used by other threads
	NdisAcquireSpinLock(&pAdapter->SendTxWaitQueueLock);

	// Select Queue
	pQueue = &pAdapter->SendTxWaitQueue;

	// Check queue before dequeue
	while ((pQueue->Head != NULL) && (Count < MAX_TX_PROCESS))
	{
		// Reset is in progress, stop immediately
		if ( RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
			 RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS) ||
		     RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS))
		{
			break;
		}
			
		// Dequeue the first entry from head of queue list
		skb = (struct sk_buff *)RemoveHeadQueue(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(skb) + RTMP_GET_PACKET_RTS(skb);
		
		if (RTUSBFreeDescriptorRequest(pAdapter, TX_RING, FragmentRequired) == NDIS_STATUS_SUCCESS)
		{
			// Avaliable ring descriptors are enough for this frame
			// Call hard transmit
			// Nitro mode / Normal mode selection
			NdisReleaseSpinLock(&pAdapter->SendTxWaitQueueLock);
			if (pAdapter->PortCfg.EnableTxBurst == 1)
				Status = RTUSBHardEncrypt(pAdapter, skb, FragmentRequired, TRUE);
			else				
				Status = RTUSBHardEncrypt(pAdapter, skb, FragmentRequired, FALSE);
			//
			// Acquire the resource again, snice we may need to process it in this while-loop.
			//
			NdisAcquireSpinLock(&pAdapter->SendTxWaitQueueLock);
			if (Status == NDIS_STATUS_FAILURE)
			{
				// Packet failed due to various Ndis Packet error
				RTUSBFreeSkbBuffer(skb);
				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
				InsertHeadQueue(pQueue, skb);
				break;
			}			
			Count++;
		}	
		else
		{
			InsertHeadQueue(pQueue, skb);
			break;
		}
	}
	
	NdisReleaseSpinLock(&pAdapter->SendTxWaitQueueLock);
	return;
	
}

NDIS_STATUS	RTUSBFreeDescriptorRequest(
	IN		PRT2570ADAPTER	pAdapter,
	IN		UCHAR			RingType,
	IN		UCHAR			NumberRequired)
{
	UCHAR			FreeNumber = 0;
	UINT			Index;
	NDIS_STATUS		Status = NDIS_STATUS_FAILURE;

	switch (RingType)
	{
		case TX_RING:
			Index = pAdapter->NextTxIndex;
			do
			{
				PTX_CONTEXT	pTxD  = &pAdapter->TxContext[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 = pAdapter->NextMLMEIndex;
			do
			{
				PTX_CONTEXT	pTxD  = &pAdapter->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:
			break;


	
	}

	return (Status);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品乱人伦小说| 欧美色精品天天在线观看视频| 在线不卡免费欧美| 五月激情综合网| 欧美精选在线播放| 狠狠狠色丁香婷婷综合久久五月| 欧美色综合网站| 天天av天天翘天天综合网| 日韩一二三区不卡| 国产福利电影一区二区三区| 中文字幕在线观看一区| 欧美性一二三区| 久久精品国产亚洲a| 亚洲国产精品av| 色综合激情久久| 美女网站在线免费欧美精品| 国产午夜精品在线观看| 色婷婷久久一区二区三区麻豆| 亚洲r级在线视频| 精品欧美一区二区久久| 9l国产精品久久久久麻豆| 亚洲超丰满肉感bbw| www一区二区| 色94色欧美sute亚洲线路一久| 视频在线观看一区| 国产精品全国免费观看高清 | 中文字幕一区二区视频| 欧美日韩国产一二三| 麻豆91精品91久久久的内涵| 国产亚洲精品精华液| 欧美视频在线一区二区三区 | 久久久综合激的五月天| 91社区在线播放| 青娱乐精品在线视频| 1000部国产精品成人观看| 91麻豆精品91久久久久久清纯| 国产盗摄视频一区二区三区| 亚洲一区免费视频| 日本一区二区三区电影| 91麻豆精品国产91久久久久久久久| 国产成人av福利| 午夜精品成人在线| 国产精品久久久久一区| 精品欧美一区二区久久| 在线一区二区三区| 成人av网址在线| 韩国一区二区视频| 爽好多水快深点欧美视频| 亚洲婷婷在线视频| 中文字幕免费观看一区| 日韩欧美激情在线| 欧美日韩一区中文字幕| 91美女视频网站| 国产成人丝袜美腿| 九九视频精品免费| 美日韩一区二区三区| 亚洲在线一区二区三区| 自拍偷拍欧美激情| 国产精品污网站| 久久久av毛片精品| 日韩片之四级片| 精品视频在线免费看| 一本久久综合亚洲鲁鲁五月天 | 亚洲第一在线综合网站| 最新中文字幕一区二区三区| 久久精品欧美一区二区三区不卡| 日韩欧美国产不卡| 日韩一级大片在线| 日韩一区二区免费在线电影| 6080yy午夜一二三区久久| 欧美视频一区二| 91黄色免费网站| 在线亚洲高清视频| 色偷偷久久人人79超碰人人澡 | 欧美在线三级电影| 在线观看日韩电影| 欧美视频你懂的| 欧美浪妇xxxx高跟鞋交| 欧美日韩精品系列| 欧美精品电影在线播放| 欧美一区二区三区精品| 日韩一区二区三区免费观看| 精品久久久久久无| 国产亚洲精品aa午夜观看| 国产网红主播福利一区二区| 中文乱码免费一区二区| 国产精品国产三级国产专播品爱网| 中文字幕亚洲精品在线观看| 亚洲精品日韩专区silk| 亚洲综合色噜噜狠狠| 午夜视频一区二区| 美国精品在线观看| 国产精品18久久久久久久久久久久| 国产盗摄精品一区二区三区在线 | 亚洲三级久久久| 一区二区三区四区五区视频在线观看| 亚洲品质自拍视频| 午夜精品视频在线观看| 久久精品国产网站| av网站一区二区三区| 欧美性大战久久久| 精品国产区一区| 国产精品进线69影院| 一区二区久久久| 奇米精品一区二区三区在线观看| 狠狠色狠狠色综合系列| 91丨porny丨蝌蚪视频| 欧美精品日韩一区| 国产亚洲成aⅴ人片在线观看| 亚洲卡通动漫在线| 麻豆免费看一区二区三区| 高清免费成人av| 欧美男同性恋视频网站| 久久久久久久综合日本| 伊人色综合久久天天| 久久99国内精品| 色婷婷综合激情| 欧美成人一区二区三区片免费 | 色久综合一二码| 日韩免费看的电影| 亚洲丝袜美腿综合| 精品系列免费在线观看| 91在线免费视频观看| 日韩精品中文字幕在线一区| 亚洲人成在线播放网站岛国| 精品一区二区三区日韩| 91官网在线免费观看| 久久你懂得1024| 视频一区视频二区中文| 99在线精品一区二区三区| 欧美电影免费观看完整版| 亚洲精品久久久蜜桃| 国产成a人无v码亚洲福利| 欧美日韩不卡在线| 亚洲美女少妇撒尿| 国产精品一二一区| 欧美一区二区视频在线观看| 亚洲精品老司机| 国产v综合v亚洲欧| 精品久久人人做人人爽| 亚洲国产美女搞黄色| 99久久综合精品| 国产欧美日韩视频在线观看| 免费成人av资源网| 欧美日本一区二区| 亚洲自拍另类综合| 色老汉一区二区三区| 亚洲欧美综合另类在线卡通| 国产美女视频一区| 精品日韩欧美在线| 首页欧美精品中文字幕| 欧美日韩视频不卡| 亚洲精品成人悠悠色影视| 成人精品国产免费网站| 国产亚洲欧美日韩日本| 激情综合五月天| 精品国产自在久精品国产| 日韩电影在线一区| 91精品国产综合久久久久久久久久| 亚洲影院免费观看| 91麻豆国产福利精品| 亚洲男人的天堂在线aⅴ视频| 白白色 亚洲乱淫| 自拍偷自拍亚洲精品播放| av在线不卡免费看| 中文字幕视频一区| 97精品久久久午夜一区二区三区| 日本一区二区视频在线| 99久久精品情趣| 17c精品麻豆一区二区免费| 97久久超碰精品国产| 亚洲精品第一国产综合野| 欧美视频在线一区二区三区| 亚洲成人福利片| 日韩一区二区视频| 国产一区999| 欧美激情综合五月色丁香| www.欧美亚洲| 一区二区三区在线视频观看| 欧美三电影在线| 日韩av在线免费观看不卡| 精品国产污网站| 成人精品高清在线| 亚洲最大成人网4388xx| 777a∨成人精品桃花网| 九九九精品视频| 国产精品久久久久久久久动漫| www.色综合.com| 午夜天堂影视香蕉久久| 日韩欧美你懂的| 波多野结衣亚洲| 午夜视频在线观看一区| 久久久精品中文字幕麻豆发布| 成人伦理片在线| 亚洲电影中文字幕在线观看| 日韩视频一区二区| 成人国产亚洲欧美成人综合网| 一区二区久久久久| 久久女同互慰一区二区三区| 色噜噜狠狠一区二区三区果冻|