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

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

?? rtl865x_fast.c

?? Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
?? C
?? 第 1 頁 / 共 2 頁
字號:
#ifdef RTL865X_FAST_PATH 

#include "rt_config.h"
#include "re865x/rtl865x/mbuf.h" 
#include "re865x/rtl865x/rtl8651_tblDrvFwd.h"
#include "re865x/rtl865x/rtl8651_tblAsicDrv.h"
#include "re865x/rtl865x/rtl8651_tblDrv.h"

/* ============================ Declaration ============================ */
static inline void rtl865x_extDev_set_skb_property(	u16 pktType,
													struct sk_buff *skb,
													struct net_device *dev,
													struct rtl_pktHdr *pktHdr,
													u16 rxIdx);
static inline void rtl865x_extDev_clr_skb_property(	struct sk_buff *skb);
static struct sk_buff *rtl865x_extDev_alloc_skb (	u32 length,
												u32 headroom,
												u16 rxIdx,
												struct net_device *dev);
static void rtl865x_extDev_actualFreeRxRingSkb(struct sk_buff *skb);

static int rtl865x_extDev_mbuf2Skb(struct net_device *dev, struct sk_buff *skb);
static void rtl865x_extDev_rx_skb(struct net_device *dev, struct sk_buff *skb);


int rtl865x_extDev_addHost (	u8 *hostMac,
								u16 vid,
								unsigned int linkid);
int rtl865x_extDev_removeHost (	u8 *hostMac,
								u16 vid);

int rtl865x_extDev_unicastFastRecv (	struct sk_buff *skb,
												u16 vid,
												struct net_device *dev);
static int rtl865x_extDev_rxRunoutTxPending(	struct sk_buff *skb,
												struct net_device *dev);
static int rtl865x_extDev_pktUcastTx(struct rtl_pktHdr *pkt);
static void rtl865x_extDev_pktFree(struct rtl_pktHdr *pkt);
/*
	design note:

	[chenyl] In order to simplify the flow, we only speed up single 8139CP.
*/
static struct net_device *rt61_txDev = NULL;
static int rt61_activeCnt = 0;
static int rt61_firstPkt = 0;

/* ============================ Implementation ============================ */

/* ======================================================
						Library
     ====================================================== */

static inline void rtl865x_extDev_set_skb_property(	u16 pktType,
													struct sk_buff *skb,
													struct net_device *dev,
													struct rtl_pktHdr *pktHdr,
													u16 rxIdx)
{
	struct rtl_mBuf *mbuf;

	/*
		1) Link socket buffer and mbuf/packet header.
		2) Set property of this socket buffer.
		3) Set rx-descriptor ring index for this packet
		4) Set cp pointer for this packet
		5) Set proprietary magic number for Rome Driver process.
	*/

	mbuf = pktHdr->ph_mbuf;

	RTL865X_SET_PKTHDR(skb, pktHdr);
	RTL865X_SET_DEVPTR(skb, dev);
	RTL865X_SET_PKTTYPE(skb, pktType);

	if (	(pktType == RTL865X_TYPE_RXRING) ||
		(pktType == RTL865X_TYPE_RUNOUTRX))
	{
		mbuf->m_unused1 = RTL865X_MBUF_MAGIC_EXTDEV;
		skb->pkt_type = PACKET_AIRGO;
		RTL865X_SET_RXDESC(skb, rxIdx);
	} else
	{
		RTL865X_SET_RXDESC(skb, RTL865X_MBUF_MAX_RXDESC);
	}
}

static inline void rtl865x_extDev_clr_skb_property(	struct sk_buff *skb)
{
	u16 type;

	type = RTL865X_GET_PKTTYPE(skb);

	if (	(type == RTL865X_TYPE_RXRING) ||
		(type == RTL865X_TYPE_RUNOUTRX))
	{
		struct rtl_pktHdr *pktHdr;
		struct rtl_mBuf *mbuf;

		pktHdr = RTL865X_GET_PKTHDR(skb);

		if (pktHdr)
		{
			mbuf = pktHdr->ph_mbuf;
			mbuf->m_unused1 = RTL865X_MBUF_MAGIC_NONE;
		}
	}

	RTL865X_SET_RXDESC(skb, 0);
	RTL865X_SET_DEVPTR(skb, NULL);
	RTL865X_SET_SKBOWNER(skb, 0);
	RTL865X_SET_PKTHDR(skb, NULL);
	RTL865X_SET_PKTTYPE(skb, RTL865X_TYPE_NONE);
	skb->pkt_type = PACKET_HOST;	/* default type */
}

/* ======================================================
						sock-buffer interface
     ====================================================== */
/*
	This function must be called when Rx Ring init. => Only allocate packet in Rx Ring.

	- This function do the following thing to allocate mbuf structure:

		1. Allocate socket buffer.
		2. Attach mbuf & packet header gotten from mbuf system of Rome Driver.
		3. Set related parameter to link mbuf, packet header and socket buffer.
*/
struct sk_buff *rtl865x_extDev_alloc_skb (	u32 length,
												u32 headroom,
												u16 rxIdx,
												struct net_device *dev)
{
	struct sk_buff *skb = NULL;
	struct rtl_mBuf *mbuf = NULL;
	struct rtl_pktHdr *pktHdr = NULL;

#ifdef DEBUG
	printk (	"%s -- (%s [%d]) Allocate Socket buffer for Rx Ring (len %d headroom %d rxIdx %d).\n",
			dev->name,
			__FUNCTION__,
			__LINE__,
			length,
			headroom,
			rxIdx);
#endif

	/* 1 & 2. allocate skbuff / mbuf / packet header and reserve headroom */
	skb = dev_alloc_skb(length + headroom);

	if (skb == NULL)
	{
		goto out;
	}

	skb_reserve(skb, headroom);

	mbuf = mBuf_attachHeader(	(void*)(UNCACHE((u32)(skb->head))),
								(u32)(skb),
								length,
								0,
								skb_headroom(skb));

	if (mbuf == NULL)
	{
		dev_kfree_skb(skb);
		skb = NULL;
		goto out;
	}

	pktHdr = mbuf->m_pkthdr;

#ifdef DEBUG
	printk (	"\t=>mbuf (%p) pktHdr (%p) m_data(%p) leadingSpace(%d) skb-head(%p) skb-data(%p).\n",
			mbuf,
			pktHdr,
			mbuf->m_data,
			mBuf_leadingSpace(mbuf),
			skb->head,
			skb->data);
#endif

	/*	3. Set relative fields */
	skb->dev = dev;
	rtl865x_extDev_set_skb_property(	RTL865X_TYPE_RXRING,
										skb,
										dev,
										pktHdr,
										rxIdx);

	RTL865X_SET_SKBOWNER(skb, RTL865X_RXRING_OWN);

out:
	return skb;
}

/*
	Actually free socket buffer of RxRing or Runout
*/
static void rtl865x_extDev_actualFreeRxRingSkb(struct sk_buff *skb)
{
	struct rtl_pktHdr *pktHdr;
	u16 headroom;

	pktHdr = RTL865X_GET_PKTHDR(skb);

	rtl865x_extDev_clr_skb_property(skb);

	headroom = mBuf_leadingSpace(pktHdr->ph_mbuf);
	mBuf_freeOneMbufPkthdr(	pktHdr->ph_mbuf,
								NULL,
								NULL,
								NULL);

#ifdef DEBUG
	printk (	"(%s [%d]) Free Rx Ring packet (pkt %p rxIdx %d).\n",
			__FUNCTION__,
			__LINE__,
			RTL865X_GET_PKTHDR(skb),
			RTL865X_GET_RXDESC(skb));
#endif

	/*
		clear this socket buffer.
	*/
	skb->data = skb->tail = skb->head;
	skb->len  = skb->data_len = 0;
	skb_reserve(skb, headroom);

	dev_kfree_skb(skb);
}

/*
	3 processes for socket buffer free module:

		1. This packet is from RX ring.
			A. bridge between 8139cp devices.
			B. RX failed.
				- packet type == RTL865X_TYPE_RXRING
				- put it back to corresponding RX ring if "actualFree" == FALSE.
				- actually free scoket buffer / mbuf / packet header if "actualFree" == TRUE.

		2. This packet is from Rome Driver.
			A. Rx frome Rome Driver and Tx to 8139cp.
				- packet type != RTL865X_TYPE_RXRING && packet type != RTL865X_TYPE_PS
				- use Rome Driver's MBUF API to free this packet.

		3. This packet is from other position.
			A. Direct TX from protocol stack.
				- packet type == RTL865X_TYPE_PS
				- free socket buffer directly.
*/
__IRAM_AIRGO  void rtl865x_extDev_kfree_skb(struct sk_buff *skb, u32 actualFree)
{
	u16 pktType = RTL865X_GET_PKTTYPE(skb);

#ifdef DEBUG
	printk("free socket buffer : %p (type %d), actualFree (%d)\n", skb, pktType, actualFree);
#endif

	switch (pktType)
	{
		case RTL865X_TYPE_RT61:
	        RTMPFreeSkbBuffer(skb);
			break;
		case RTL865X_TYPE_ROMEDRV:
		/* packet from Rome Driver */
		{
			struct rtl_pktHdr *pktHdr;
			struct rtl_mBuf *mbuf;

			pktHdr = RTL865X_GET_PKTHDR(skb);
			mbuf = pktHdr->ph_mbuf;

			/*	we just modify some socket buffer's fields in rtl865x_extDev_pktUcastTx(),
				so we MUST restore them before free it back to Rome Driver				*/
			skb->data = RTL865X_GET_ROMEDRV_SKBINFO(skb, data);
			skb->tail = RTL865X_GET_ROMEDRV_SKBINFO(skb, tail);
			skb->len = RTL865X_GET_ROMEDRV_SKBINFO(skb, len);
			skb->data_len = 0;

			RTL865X_SET_ROMEDRV_SKBINFO(skb, 0, data);
			RTL865X_SET_ROMEDRV_SKBINFO(skb, 0, tail);
			RTL865X_SET_ROMEDRV_SKBINFO(skb, 0, len);
			RTL865X_SET_PKTHDR(skb, NULL);
			RTL865X_SET_PKTTYPE(skb, RTL865X_TYPE_NONE);

			mBuf_freeMbufChain(mbuf);
		}
		break;

		case RTL865X_TYPE_RXRING:
		/* packet from RX Ring */
		{
//			printk("RTL865X_TYPE_RXRING\n");
#if 0
			u16 rxIdx;
			struct net_device *dev;
			struct cp_private *cp;
			struct rtl_pktHdr *pktHdr;
			struct rtl_mBuf *mbuf;

			if (actualFree == FALSE)
			{
				rxIdx = RTL865X_GET_RXDESC(skb);
				dev = RTL865X_GET_DEVPTR(skb);
				pktHdr = RTL865X_GET_PKTHDR(skb);
				cp = dev->priv;
				mbuf = pktHdr->ph_mbuf;

				/*
					clear this socket buffer.
				*/
				skb->data = skb->tail = skb->head;
				skb->len  = skb->data_len = 0;
				skb_reserve(skb, mBuf_leadingSpace(mbuf));
				skb->dev = cp->dev;

#ifdef DEBUG
				printk("\t=> Reclaim socket buff (0x%p) into RxRing Idx (%d)\n\t\t(data(0x%p) tail(0x%p) head(0x%p) len(%d) trueSize(%d)) - dev (%s).\n\t\tmbuf(0x%p) pktHdr(0x%p) mbufLead(%d)\n",
						skb,
						rxIdx,
						skb->data,
						skb->tail,
						skb->head,
						skb->len,
						skb->truesize,
						skb->dev->name,
						RTL865X_GET_PKTHDR(skb),
						((struct rtl_pktHdr*)(RTL865X_GET_PKTHDR(skb)))->ph_mbuf,
						mBuf_leadingSpace(((struct rtl_pktHdr*)(RTL865X_GET_PKTHDR(skb)))->ph_mbuf));
#endif

				rtlglue_drvMutexLock();
				/* ================================================================== */
				/* put this socket buffer back to Rx Ring */
				cp->rx_skb[rxIdx].mapping = pci_map_single(	cp->pdev,
															skb->tail,
															cp->rx_buf_sz,
															PCI_DMA_FROMDEVICE);
				cp->rx_skb[rxIdx].skb = skb;
				cp->rx_skb[rxIdx].frag = 0;

				if (rxIdx == (CP_RX_RING_SIZE - 1))
				{
					cp->rx_ring[rxIdx].opts1 = cpu_to_le32( DescOwn | RingEnd | cp->rx_buf_sz );
				} else
				{
					cp->rx_ring[rxIdx].opts1 = cpu_to_le32( DescOwn | cp->rx_buf_sz );
				}

				cp->rx_ring[rxIdx].opts2 = 0;
				cp->rx_ring[rxIdx].addr_lo = cpu_to_le32(cp->rx_skb[rxIdx].mapping);
				cp->rx_ring[rxIdx].addr_hi = 0;

				RTL865X_SET_SKBOWNER(skb, RTL865X_RXRING_OWN);

				/* ================================================================== */
				rtlglue_drvMutexUnlock();

			}else
#endif
			{
				/* actualFree == TRUE: actually free Rx Ring Socket buffer */
				rtl865x_extDev_actualFreeRxRingSkb(skb);
			}
		}
		break;

		case RTL865X_TYPE_PS:
		/* packet from Protocol Stack */
		{
			rtl865x_extDev_clr_skb_property(skb);
			dev_kfree_skb(skb);
		}
		break;

		case RTL865X_TYPE_RUNOUTRX:
		{
			/* the position of this packet in RX Ring is replaced : actually free it */
			rtl865x_extDev_actualFreeRxRingSkb(skb);
		}
		break;

		default:
			printk("Packet type : %d -- free socket buffer only\n", pktType);
			dev_kfree_skb(skb);
	}
}

/* ======================================================
						protocol stack interface
     ====================================================== */
static int rtl865x_extDev_mbuf2Skb(struct net_device *dev, struct sk_buff *skb)
{
	struct sk_buff *newSkb = NULL;
	struct rtl_pktHdr *pktHdr = NULL;
	struct rtl_mBuf *mbuf = NULL;
	unsigned int pktLen = 0;
	unsigned int pktTotalLen = 0;
	u16 rxIdx;
	u16 pktType;
	u16 headroom;

#ifdef DEBUG
	printk("%s -- for socket buffer (%p) -- head %p data %p headroom %d len %d mbuf_head %d\n",
		__FUNCTION__,
		skb,
		skb->head,
		skb->data,
		(u32)skb->data - (u32)skb->head,
		skb->len,
		mBuf_leadingSpace(((struct rtl_pktHdr*)RTL865X_GET_PKTHDR(skb))->ph_mbuf)
		);
#endif

	pktHdr = RTL865X_GET_PKTHDR(skb);
	mbuf = pktHdr->ph_mbuf;
	pktLen = pktHdr->ph_len;
	pktTotalLen = mbuf->m_extsize;
	rxIdx = RTL865X_GET_RXDESC(skb);
	pktType = RTL865X_GET_PKTTYPE(skb);
	headroom = mBuf_leadingSpace(mbuf);

	if (pktType != RTL865X_TYPE_RXRING)
	{
		printk("BUG ! socket buffer which put into %s is not from Rx Ring!!\n", __FUNCTION__);
		goto err_out;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
大白屁股一区二区视频| 日韩欧美在线1卡| 精品久久久网站| 中文字幕日韩av资源站| 亚洲图片欧美综合| 春色校园综合激情亚洲| 7777女厕盗摄久久久| 自拍偷拍欧美精品| 国产一区二区三区四区五区美女| 在线免费观看不卡av| 国产日韩三级在线| 奇米一区二区三区av| 91成人免费网站| 国产精品不卡在线观看| 韩国三级中文字幕hd久久精品| 欧美日韩国产一二三| 亚洲视频一二三区| 成人av在线资源网站| 久久综合久色欧美综合狠狠| 日本伊人色综合网| 欧美日韩国产综合视频在线观看 | 亚洲午夜国产一区99re久久| 国产不卡在线视频| 久久久久久久久免费| 日本欧美肥老太交大片| 欧美视频精品在线| 一区二区三区在线免费视频| av不卡一区二区三区| 国产精品欧美一区喷水| 国产露脸91国语对白| 2017欧美狠狠色| 精品在线观看免费| 精品av综合导航| 韩国精品一区二区| 久久久天堂av| 高清shemale亚洲人妖| 国产欧美日产一区| 成人午夜碰碰视频| 国产精品三级视频| aaa欧美日韩| 亚洲黄网站在线观看| 91精品办公室少妇高潮对白| 亚洲综合色网站| 欧美日本一区二区| 美脚の诱脚舐め脚责91 | 国产精品传媒入口麻豆| 成人高清视频在线观看| 中文字幕一区av| 色94色欧美sute亚洲线路二| 亚洲伊人伊色伊影伊综合网| 欧美日韩二区三区| 麻豆成人久久精品二区三区小说| 精品sm捆绑视频| a级精品国产片在线观看| 亚洲欧美另类在线| 欧美日韩免费在线视频| 久久精品国产99久久6| 久久欧美中文字幕| 99久久综合精品| 亚洲va欧美va国产va天堂影院| 精品日韩欧美一区二区| 国产成人av电影| 亚洲永久精品大片| 2023国产精品视频| 色综合天天综合色综合av| 午夜一区二区三区在线观看| 精品伦理精品一区| 色综合咪咪久久| 奇米影视一区二区三区小说| 1区2区3区国产精品| 欧美日韩免费观看一区三区| 狠狠久久亚洲欧美| 一区二区成人在线视频| 精品美女一区二区| 色婷婷综合久久久久中文一区二区 | 99视频在线观看一区三区| 亚洲国产你懂的| 久久色视频免费观看| 欧洲亚洲精品在线| 国产一区不卡视频| 亚洲福利电影网| 国产精品丝袜91| 日韩欧美专区在线| 欧美在线一二三四区| 国产电影精品久久禁18| 五月婷婷另类国产| 亚洲欧洲av一区二区三区久久| 欧美一级久久久久久久大片| 91香蕉国产在线观看软件| 精品一区二区影视| 性做久久久久久久久| 国产精品第一页第二页第三页| 精品免费国产一区二区三区四区| 色94色欧美sute亚洲线路一ni| 国产成人在线观看免费网站| 日韩精品高清不卡| 樱花影视一区二区| 国产精品久久久久国产精品日日| 精品国产91乱码一区二区三区| 欧美日精品一区视频| a级精品国产片在线观看| 国产裸体歌舞团一区二区| 日韩高清欧美激情| 亚洲一区在线免费观看| 综合久久综合久久| 国产精品久久久久久户外露出| 久久亚洲私人国产精品va媚药| 欧美一区二区三区电影| 欧美色视频在线| 日本乱码高清不卡字幕| 成人午夜电影久久影院| 国产精品自产自拍| 国产一区二区在线观看视频| 麻豆精品视频在线观看免费| 日本美女一区二区三区| 婷婷开心久久网| 丝袜美腿亚洲一区二区图片| 亚洲高清免费视频| 亚洲不卡在线观看| 日韩综合一区二区| 免费成人av资源网| 黄一区二区三区| 国产电影一区二区三区| 成人黄色电影在线| 97久久精品人人爽人人爽蜜臀| 91原创在线视频| 在线观看国产91| 欧美福利视频一区| 日韩免费成人网| 久久久国产精华| 日韩毛片视频在线看| 亚洲一区二区三区四区中文字幕| 午夜久久久久久久久| 六月丁香综合在线视频| 成人做爰69片免费看网站| www.久久精品| 欧美日韩视频一区二区| 337p日本欧洲亚洲大胆精品| 国产亚洲成年网址在线观看| 亚洲视频你懂的| 青青草91视频| av在线一区二区三区| 欧美少妇bbb| 久久久久久久久97黄色工厂| 亚洲女子a中天字幕| 日本人妖一区二区| 成人精品视频网站| 欧美性色欧美a在线播放| 欧美电影免费观看高清完整版在线观看 | 成人免费毛片片v| 99精品欧美一区二区三区小说| 97久久人人超碰| 欧美日韩不卡一区二区| 精品播放一区二区| 国产精品久久久久一区| 亚洲精品久久久蜜桃| 天天综合网 天天综合色| 国产凹凸在线观看一区二区| av在线这里只有精品| 欧美日韩一级二级| 精品久久久三级丝袜| 久久久五月婷婷| 亚洲欧美激情在线| 日韩有码一区二区三区| 国产精品主播直播| 欧美日韩电影在线| 国产亚洲精品资源在线26u| 综合久久久久久久| 久久不见久久见免费视频1| 色吧成人激情小说| 26uuu亚洲综合色欧美| 亚洲品质自拍视频网站| 男人的j进女人的j一区| 在线观看www91| 久久精品欧美一区二区三区麻豆| 一区二区三区四区精品在线视频| 麻豆国产欧美日韩综合精品二区| 欧美性猛交一区二区三区精品| 久久综合狠狠综合久久激情| 一区二区三区日本| 国产精品一区二区在线播放| 69久久99精品久久久久婷婷| 国产精品久线在线观看| 免费在线观看精品| 国产一区在线观看视频| 国产亚洲欧美日韩日本| 亚洲尤物在线视频观看| 成人丝袜18视频在线观看| 2023国产精品| 精品久久一区二区| 亚洲国产欧美日韩另类综合 | 精品国产免费人成在线观看| 中文字幕欧美日本乱码一线二线| 三级欧美在线一区| jizzjizzjizz欧美| 欧美xxx久久| 国产激情一区二区三区| 6080国产精品一区二区| 亚洲精品v日韩精品| 五月激情综合色|