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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtusb_data.c

?? 臺灣RALink公司的 rt2570無線 802.11g 網卡的 驅動的源代碼 ,支持linux2.4以上的 內河
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*
 ***************************************************************************
 * 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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲自拍偷拍| 国内一区二区在线| 欧美在线一二三四区| 一区二区欧美国产| 精品一区二区三区在线视频| 欧美视频一二三区| 亚洲在线成人精品| 69成人精品免费视频| 狠狠色丁香九九婷婷综合五月| 精品久久久久香蕉网| 成人精品视频网站| 一区二区三区中文在线| 91精品国产综合久久久久久漫画 | 国产一区二区三区蝌蚪| 国产视频在线观看一区二区三区| 成a人片国产精品| 亚洲一卡二卡三卡四卡无卡久久| 911精品国产一区二区在线| 免费观看91视频大全| 中文字幕中文字幕一区| 欧美日韩国产电影| 成人综合在线观看| 亚洲国产美女搞黄色| 欧美区一区二区三区| 国产在线视频一区二区三区| 亚洲欧洲韩国日本视频| 日韩精品一区国产麻豆| 91在线porny国产在线看| 美女脱光内衣内裤视频久久影院| 国产精品久久久久久久蜜臀| 91精品国产麻豆国产自产在线 | 蜜桃视频在线观看一区二区| 国产精品嫩草99a| 日韩西西人体444www| 一本久道久久综合中文字幕| 精品一区二区三区蜜桃| 一区二区三区鲁丝不卡| 久久精品在线观看| 日韩一本二本av| 精品国产乱码久久久久久浪潮| av网站免费线看精品| 极品尤物av久久免费看| 亚洲自拍偷拍九九九| 日韩视频一区在线观看| 色妹子一区二区| 国产乱一区二区| 日韩精品电影在线观看| 亚洲影院久久精品| 中文字幕一区日韩精品欧美| 久久―日本道色综合久久| 欧美日韩小视频| 色婷婷综合久色| 东方欧美亚洲色图在线| 激情深爱一区二区| 全国精品久久少妇| 午夜视频在线观看一区二区三区| 亚洲欧美一区二区三区国产精品 | 日韩视频免费观看高清完整版 | 日韩一区二区三区四区五区六区| 色婷婷av一区二区三区之一色屋| 国产91在线观看丝袜| 韩国成人福利片在线播放| 日本vs亚洲vs韩国一区三区| 国产aⅴ综合色| 亚洲精品在线电影| 欧美日韩视频一区二区| 91丨九色丨蝌蚪富婆spa| 成人黄色软件下载| 懂色av一区二区三区免费看| 国产高清亚洲一区| 国产精品一级片在线观看| 精品一区二区日韩| 九九久久精品视频| 国产乱码精品一区二区三区五月婷 | 国产大片一区二区| 国产精品中文字幕欧美| 国产精品一二二区| 丁香激情综合国产| av中文一区二区三区| 欧美一激情一区二区三区| 在线成人高清不卡| 日韩小视频在线观看专区| 欧美xxxxx牲另类人与| 久久日一线二线三线suv| 久久综合五月天婷婷伊人| **网站欧美大片在线观看| 欧美精品一区二区久久婷婷| 久久久久久黄色| 国产嫩草影院久久久久| 亚洲欧美色一区| 亚洲电影一级片| 奇米精品一区二区三区在线观看一 | 久久精品在这里| 中文字幕一区二区三区色视频 | 秋霞影院一区二区| 国产最新精品精品你懂的| 成人精品视频一区二区三区| 在线中文字幕一区二区| 日韩午夜电影在线观看| 亚洲国产岛国毛片在线| 亚洲电影视频在线| 韩国成人在线视频| 色www精品视频在线观看| 日韩亚洲电影在线| 国产精品无遮挡| 亚洲观看高清完整版在线观看| 精品亚洲成a人| 成人午夜短视频| 欧美剧在线免费观看网站 | 91精品国产免费| 国产欧美一区二区三区鸳鸯浴| 亚洲美女精品一区| 久久99久久精品| 一本久久精品一区二区| 亚洲精品一区二区三区四区高清| 综合在线观看色| 另类小说视频一区二区| 91浏览器在线视频| 精品国产凹凸成av人网站| 亚洲免费高清视频在线| 捆绑紧缚一区二区三区视频| 色综合天天综合给合国产| 精品国产一区二区精华| 一区二区三区不卡视频| 精品欧美一区二区久久| 26uuu色噜噜精品一区| 亚洲黄网站在线观看| 国产又黄又大久久| 欧美性生活影院| 欧美激情中文不卡| 日本欧美在线看| 91网页版在线| 欧美激情艳妇裸体舞| 麻豆国产精品官网| 欧美日韩美少妇| 亚洲人成小说网站色在线| 国产在线视频不卡二| 欧美精品vⅰdeose4hd| 亚洲日本成人在线观看| 国产精品一区二区不卡| 日韩欧美国产综合| 天天色天天操综合| 一本在线高清不卡dvd| 中文一区二区完整视频在线观看| 精品亚洲国产成人av制服丝袜| 欧美日本乱大交xxxxx| 亚洲伦理在线精品| 北岛玲一区二区三区四区| 国产亚洲精久久久久久| 久久99精品国产| 欧美大黄免费观看| 免费人成黄页网站在线一区二区| 91福利资源站| 亚洲伦理在线免费看| 91精品麻豆日日躁夜夜躁| 国产一区二区三区久久悠悠色av| 欧美日韩国产a| 亚洲综合av网| 欧美性色aⅴ视频一区日韩精品| 亚洲码国产岛国毛片在线| 波波电影院一区二区三区| 国产精品久久久久久久久久免费看 | 毛片不卡一区二区| 91精品国产入口| 另类的小说在线视频另类成人小视频在线| 欧美日韩精品三区| 亚洲成人久久影院| 欧美精品一级二级| 日本亚洲视频在线| 日韩精品一区在线| 国产一区二区视频在线| 日本一区二区动态图| 不卡av在线免费观看| 亚洲欧美中日韩| 色呦呦一区二区三区| 亚洲高清免费观看 | 亚洲成人免费视| 91精品国模一区二区三区| 久草在线在线精品观看| 国产亚洲欧美激情| 国产精品18久久久久久久久久久久 | 成人免费福利片| 亚洲日本电影在线| 欧美日韩亚洲综合一区| 美女国产一区二区三区| 国产欧美精品一区二区色综合| 成人的网站免费观看| 亚洲一区在线视频观看| 日韩你懂的电影在线观看| 国产成人99久久亚洲综合精品| 亚洲色图.com| 欧美日韩aaa| 国产在线精品免费| 亚洲欧美日韩久久| 日韩色视频在线观看| aa级大片欧美| 亚洲bt欧美bt精品| 久久久九九九九| 色噜噜偷拍精品综合在线| 久国产精品韩国三级视频|