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

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

?? rtl865x_fast.c

?? Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
	}

	/* Allocate socket buffer for this rx packet before trapping it to protocol stack */
	newSkb = dev_alloc_skb(pktTotalLen);

	if (newSkb == NULL)
	{
		/* This packet RX failed : ignore this packet and return directly */
		printk (	"%s -- (%s [%d]) socket buffer allocation failed.\n",
				dev->name,
				__FUNCTION__,
				__LINE__);
		goto err_out;
	}

	newSkb->data = newSkb->tail = newSkb->head;
	newSkb->len = 0;
	skb_reserve(newSkb, headroom);
	newSkb->dev = dev;

	/* We need to flush D-cache before TX to protocol stack */
	lx4180_writeCacheCtrl(0);
	lx4180_writeCacheCtrl(1);
	lx4180_writeCacheCtrl(0);

	/* attach mbuf/packet header to newly allocated socket buffer */
	mBuf_attachCluster(	mbuf,
						(void*)(UNCACHE((u32)(newSkb->head))),
						(unsigned int)newSkb,
						pktTotalLen,
						0,
						0);
	mBuf_reserve(mbuf, headroom);

	/* clear original Socket buffer */
	rtl865x_extDev_clr_skb_property(skb);

	/* re-link pointer of socket buffer to packet header */
	rtl865x_extDev_set_skb_property(	pktType,
										newSkb,
										dev,
										pktHdr,
										rxIdx);

	/* reclaim packet with new socket buffer */
	rtl865x_extDev_kfree_skb(newSkb, FALSE);

	return 0;

err_out:
	rtl865x_extDev_kfree_skb(skb, FALSE);
	return -1;
}
static void rtl865x_extDev_rx_skb(struct net_device *dev, struct sk_buff *skb)
{
	if (rtl865x_extDev_mbuf2Skb(dev, skb) != 0)
	{
		return;
	}

//	memDump(skb->data, skb->len>128?128:skb->len, "rx skb socket buffer");

	/* Trap original skb to protocol stack : we don't update statistics in this function because it's done in previous code. */
	skb->protocol = eth_type_trans(skb, dev);
	skb->dev = dev;							/* set RX device */
	netif_rx(skb);

}

/* ======================================================
						RTL865X Rome Driver interface
     ====================================================== */
int rtl865x_extDev_addHost (	u8 *hostMac,
											u16 vid,
											unsigned int linkid)
//											struct net_device *dev)
{
	unsigned int i;

	printk("@ = Add Host : [%02x:%02x:%02x:%02x:%02x:%02x] VID %d LinkID %d PortNumber %d\n",
		hostMac[0],
		hostMac[1],
		hostMac[2],
		hostMac[3],
		hostMac[4],
		hostMac[5],
		vid,
		linkid,
		CONFIG_RTL865XB_WLAN1_PORT);

	return rtl8651_fwdEngineAddWlanSTA(	hostMac,
											vid,
											(1 << CONFIG_RTL865XB_WLAN1_PORT),
											linkid);
}

int rtl865x_extDev_removeHost (	u8 *hostMac,
												u16 vid)
{
	return rtl8651_fwdEngineDelWlanSTA(	hostMac,
										vid);
}

#if 1
__IRAM_AIRGO static int rtl865x_extDev_unicastFastRecv (	struct sk_buff *skb,
															u16 vid,
															struct net_device *dev)
{
	struct rtl_pktHdr *pktHdr;
	struct rtl_mBuf *mbuf;

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

	mbuf->m_data = skb->data;
	mbuf->m_len = skb->len;
	pktHdr->ph_len = skb->len;
	pktHdr->ph_iphdrOffset = 0;
	pktHdr->ph_pppeTagged = 0;
	pktHdr->ph_LLCTagged = 0;
	pktHdr->ph_vlanTagged = 0;
	pktHdr->ph_extPortList = 0;

#ifdef DEBUG
	printk (	"%s -- (%s [%d]) Unicast Fast Tx to Rome Driver\n\t=> Type(%d) Rx Idx(%d) - pkt(%p) mbuf(%p) mdata(%p) vid(%d) dev(%p).\n\t=> leadroom %d\n\t=> head (%p) data(%p)\n",
			dev->name,
			__FUNCTION__,
			__LINE__,
			RTL865X_GET_PKTTYPE(skb),
			RTL865X_GET_RXDESC(skb),
			pktHdr,
			mbuf,
			mbuf->m_data,
			vid,
			skb->dev,
			mBuf_leadingSpace(mbuf),
			skb->head,
			skb->data);

	printk("=============================================\n");
	memDump(pktHdr->ph_mbuf->m_data, pktHdr->ph_len, "Fast Tx pkt");
	printk("=============================================\n");
#endif

#if 0
	if ((rt61_firstPkt ++) < 3)
	{
		rtl865x_extDev_addHost(&(skb->data[6]), vid, rt61_txDev);
	}
#endif

	return rtl8651_fwdEngineExtPortUcastFastRecv(	pktHdr,
													vid,
													(1 << CONFIG_RTL865XB_WLAN1_PORT));
}

#if 0
static int rtl865x_extDev_rxRunoutTxPending(struct sk_buff *skb, struct net_device *dev)
{
	struct cp_private *cp = dev->priv;
	struct sk_buff *newSkb = NULL;
	struct rtl_pktHdr *pktHdr = NULL;
	u16 rxIdx;
	u16 orgOwner;

	orgOwner = RTL865X_GET_SKBOWNER(skb);

	rxIdx = RTL865X_GET_RXDESC(skb);
	pktHdr = RTL865X_GET_PKTHDR(skb);

	/* -------------- Allocate new Socket buffer ------------- */
	if ((newSkb = rtl865x_extDev_alloc_skb(	cp->rx_buf_sz,
											RX_OFFSET + 4,
											rxIdx,
											dev)) == NULL)
	{
		printk("FATAL!! Rx Run-out CAN NOT be solved.!\n");
		return FAILED;
	}

	rtlglue_drvMutexLock();

	/* -------------- Put this socket buffer into Rx Ring to replace original one -------------- */
	cp->rx_skb[rxIdx].mapping = pci_map_single(	cp->pdev,
												newSkb->tail,
												cp->rx_buf_sz,
												PCI_DMA_FROMDEVICE);

	cp->rx_skb[rxIdx].skb = newSkb;
	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;

	/* -------------- Original packet : change its property to freed by our driver -------------- */
	switch (orgOwner)
	{
		case RTL865X_RXRING_OWN:
			rtl865x_extDev_kfree_skb(skb, TRUE);
			break;
		case RTL865X_DRIVER_OWN:
			RTL865X_SET_PKTTYPE(skb, RTL865X_TYPE_RUNOUTRX);
			break;
		default:
			printk("BUG! Unknown owner type: %d\n", orgOwner);
			rtl865x_extDev_kfree_skb(skb, TRUE);
	}

	rtlglue_drvMutexUnlock();
	return SUCCESS;
}
#endif
#endif


/* declaration of fast Tx function */
static int RT61_start_FastUnicastXmit (struct sk_buff *skb, struct net_device *dev);

void rtl865x_extDev_registerUcastTxDev(struct net_device *txDev)
{
	printk (	"%s -- (%s [%d]) Register Unicast Tx Device [%p].\n",
			txDev->name,
			__FUNCTION__,
			__LINE__,
			txDev);

	if (rt61_txDev == NULL)
	{
		rt61_txDev = txDev;
		rt61_firstPkt = 0;
	} else
	{
		printk(	"%s -- (%s [%d])  The Fast Tx device is owned by [%s] (current active count = %d).\n",
				txDev->name,
				__FUNCTION__,
				__LINE__,
				rt61_txDev->name,
				rt61_activeCnt);
	}

	rt61_activeCnt ++;
}

void rtl865x_extDev_unregisterUcastTxDev(struct net_device *txDev)
{
	printk (	"%s -- (%s [%d]) Un-Register Unicast Tx Device [%p].\n",
			txDev->name,
			__FUNCTION__,
			__LINE__,
			txDev);

	if (rt61_activeCnt == 0)
	{
		printk (	"%s -- (%s [%d]) unregister device with current active count = %d.\n",
				txDev->name,
				__FUNCTION__,
				__LINE__,
				rt61_activeCnt);
		return;
}
	if (rt61_txDev == txDev)
	{
		rt61_txDev = NULL;
		rt61_firstPkt = 0;
	}

	rt61_activeCnt --;
}

/*
		Fast Unicast Tx function
*/
static __IRAM_AIRGO int rtl865x_extDev_pktUcastTx(struct rtl_pktHdr *pkt)
{
	struct rtl_mBuf *mbuf;
	struct sk_buff *skb;

    PRTMP_ADAPTER   pAdapter;
	int i;



	/*
		[chenyl] In order to simplify the flow, we only speed up single 8139CP.
	*/
	if ((rt61_txDev == NULL) ||
		(netif_queue_stopped(rt61_txDev)) ||
		(rt61_activeCnt > 1))
	{
		mBuf_freeMbufChain(pkt->ph_mbuf);
		return SUCCESS;
	}


	pAdapter = rt61_txDev->priv;

	if (pkt->ph_extDev_linkID == 0) {
		printk("fast tx link id == 0\n");
		mBuf_freeMbufChain(pkt->ph_mbuf);
		return SUCCESS;		
	}


#ifdef DEBUG
	printk (	"(%s [%d]) Unicast TX by Rome Driver -- Pkt (%p) mbuf (%p) skb (%p) type(%d).\n",
			__FUNCTION__,
			__LINE__,
			pkt,
			pkt->ph_mbuf,
			(struct sk_buff *)(pkt->ph_mbuf->m_extClusterId),
			RTL865X_GET_PKTTYPE((struct sk_buff *)(pkt->ph_mbuf->m_extClusterId)));
#endif

	mbuf = pkt->ph_mbuf;
	skb = (struct sk_buff*)(mbuf->m_extClusterId);
	skb->ip_summed = CHECKSUM_NONE;

	skb->dev = rt61_txDev;
	RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb, 0);

#if 0
{
	int j;
	for (j=0; j<48; j++) {
		if (skb->cb[j] != 0)
			printk("cb[%d] = %02x\n", j, skb->cb[j]);
	} 	
}
#endif

	/* record information */
	RTL865X_SET_PKTTYPE(skb, RTL865X_TYPE_ROMEDRV);
	RTL865X_SET_PKTHDR(skb, pkt);
	RTL865X_SET_ROMEDRV_SKBINFO(skb, skb->data, data);
	RTL865X_SET_ROMEDRV_SKBINFO(skb, skb->tail, tail);
	RTL865X_SET_ROMEDRV_SKBINFO(skb, skb->len, len);


#ifdef MBSS_SUPPORT
    for (i = FIRST_MBSSID; i < pAdapter->PortCfg.BssidNum; i++)
    {
        if (pAdapter->PortCfg.MBSSID[i].mylinkid == pkt->ph_extDev_linkID)
        {
        	RTMP_SET_PACKET_SOURCE(skb, PKTSRC_NDIS);
            RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb, i);
            //skb->dev = pAdapter->PortCfg.MBSSID[i].MSSIDDev;
			break;
        }
    }
#endif /* MBSS_SUPPORT */


#ifdef WDS_SUPPORT
    for (i = 0; i < MAX_WDS_ENTRY; i++)
    {
        if ((pAdapter->WdsTab.WdsEntry[i].Valid == TRUE) && (pAdapter->WdsTab.WdsEntry[i].mylinkid == pkt->ph_extDev_linkID))
        {
        	RTMP_SET_PACKET_SOURCE(skb, PKTSRC_NDIS);
            RTMP_SET_PACKET_NET_DEVICE_WDS(skb, i);
			//skb->dev = pAdapter->WdsTab.WdsEntry[i].dev;
			break;
		}
    }
#endif 


	/* set socket buffer's field for TX */
	skb->data = skb->tail = skb->head;
	skb->len = 0;
	skb->data_len = 0;
	skb_reserve(skb, 16 /* please refer to __dev_alloc_skb() in the skbuff.h */ + mBuf_leadingSpace(mbuf));
	skb_put(skb, pkt->ph_len);

#ifdef DEBUG
	memDump(skb->data, 64, "Fast TX to RT61");
#endif

//	printk("skb: data = %lx, tail = %lx, len = %d(%d)\n", skb->data, skb->tail, skb->len, skb->tail-skb->data);

	if (RTMPSendFastPackets(skb, rt61_txDev) != 0)
	{
		rtl865x_extDev_kfree_skb(skb, FALSE);
	}

	return SUCCESS;
}

static __IRAM_AIRGO void rtl865x_extDev_pktFree(struct rtl_pktHdr *pkt)
{
#ifdef DEBUG
	printk("-------------------------------------------------------\n");
	printk (	"(%s [%d]) Free Packet by Rome Driver -- Pkt (%p) mbuf (%p) skb (%p).\n",
			__FUNCTION__,
			__LINE__,
			pkt,
			pkt->ph_mbuf,
			(struct sk_buff *)(pkt->ph_mbuf->m_extClusterId));
	printk("--------------------------------------------------------Printk done\n");
#endif

	rtl865x_extDev_kfree_skb(	(struct sk_buff*)(pkt->ph_mbuf->m_extClusterId),
								FALSE);
}

void rtl865x_extDev_regCallBack(u16 linkid)
{
	printk (	"(%s [%d]) Register CallBack function -- Ucast Tx (%p) Free (%p).\n",
			__FUNCTION__,
			__LINE__,
			rtl865x_extDev_pktUcastTx,
			rtl865x_extDev_pktFree);

	rtlairgo_fast_tx_register(	rtl865x_extDev_pktUcastTx,
								rtl865x_extDev_pktFree);
}
#endif /* RTL865X_FAST_PATH */


?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久成人麻豆午夜电影| 玖玖九九国产精品| 久久久亚洲午夜电影| 色狠狠色噜噜噜综合网| 国产一区二区免费视频| 婷婷成人综合网| 亚洲男人的天堂在线aⅴ视频| 日韩欧美三级在线| 欧美日韩中文国产| 97aⅴ精品视频一二三区| 国产美女一区二区| 奇米精品一区二区三区在线观看| 亚洲精品成人天堂一二三| 国产欧美视频在线观看| 精品乱码亚洲一区二区不卡| 欧美日韩精品二区第二页| 91视频免费观看| 成人av综合一区| 国产成人鲁色资源国产91色综 | 欧美精品三级在线观看| fc2成人免费人成在线观看播放 | 国内精品久久久久影院一蜜桃| 亚洲一级在线观看| 亚洲裸体xxx| 国产精品久久久久久久久免费相片| 精品嫩草影院久久| 日韩视频中午一区| 日韩一级免费观看| 欧美大片在线观看一区二区| 欧美一区二区三区四区在线观看 | 日本一二三不卡| 久久久久久97三级| 久久精品人人爽人人爽| 精品国产污污免费网站入口| 日韩欧美国产三级电影视频| 日韩欧美一级片| 亚洲精品一区二区三区蜜桃下载| 日韩一区二区三区电影在线观看| 4438亚洲最大| 日韩无一区二区| 日韩精品一区二区三区中文不卡| 欧美一区二区三区四区久久| 911精品国产一区二区在线| 欧美日韩精品一区二区三区蜜桃| 欧美日韩国产首页| 欧美一区二区三区在线电影| 日韩欧美一二区| 久久免费精品国产久精品久久久久| 精品成人在线观看| 国产丝袜在线精品| 亚洲欧美一区二区久久| 亚洲午夜精品一区二区三区他趣| 亚洲电影在线免费观看| 亚洲第一成人在线| 性做久久久久久久久| 免费不卡在线观看| 另类小说图片综合网| 狠狠久久亚洲欧美| 成人一区二区三区| 91精品福利在线| 日韩亚洲国产中文字幕欧美| 久久久久久久精| 亚洲柠檬福利资源导航| 亚洲1区2区3区4区| 国产成人在线视频网址| 91网站视频在线观看| 欧美久久久久久久久| 久久免费视频色| 亚洲精品日韩综合观看成人91| 日韩电影免费在线观看网站| 国产美女视频一区| 欧美主播一区二区三区美女| 日韩欧美色综合| 亚洲色图一区二区三区| 日韩精品一二三四| 波多野结衣一区二区三区| 欧美日韩一区二区电影| 国产三区在线成人av| 亚洲国产一区二区三区青草影视| 精品一区二区三区欧美| 一本色道久久综合狠狠躁的推荐| 日韩三级伦理片妻子的秘密按摩| 亚洲国产成人午夜在线一区| 五月婷婷综合网| 成人福利视频在线| 日韩视频一区在线观看| 日韩毛片一二三区| 狠狠色狠狠色综合| 欧美日韩视频在线一区二区 | 久久婷婷久久一区二区三区| 亚洲图片欧美激情| 韩国三级在线一区| 91精品福利视频| 欧美激情一二三区| 麻豆精品久久久| 91福利视频久久久久| 久久精品一区八戒影视| 丝袜美腿成人在线| 色综合天天综合狠狠| 久久久久久久久岛国免费| 亚洲成人免费av| 91丨九色丨尤物| 久久久久成人黄色影片| 五月激情综合网| 色狠狠一区二区三区香蕉| 欧美激情一区二区三区全黄| 麻豆91精品91久久久的内涵| 欧美日韩高清在线播放| 亚洲精品国产品国语在线app| 国产91精品欧美| www国产成人免费观看视频 深夜成人网| 亚洲国产裸拍裸体视频在线观看乱了 | 在线观看区一区二| 国产精品久久久爽爽爽麻豆色哟哟| 久久激情综合网| 欧美一区二区视频在线观看| 亚洲国产wwwccc36天堂| 不卡一区二区在线| 欧美国产日韩一二三区| 国产精品91一区二区| 欧美精品一区二区三| 久久国产精品99精品国产| 日韩亚洲欧美中文三级| 日韩国产在线观看一区| 欧美日韩激情一区二区| 香蕉影视欧美成人| 欧美日韩日日骚| 日日夜夜免费精品视频| 制服丝袜亚洲精品中文字幕| 日精品一区二区三区| 欧美一区二区网站| 免费成人在线播放| 欧美大片顶级少妇| 国产一区二区三区在线看麻豆| 欧美大片在线观看一区二区| 极品少妇xxxx精品少妇偷拍| wwww国产精品欧美| 成人一区在线观看| 亚洲天天做日日做天天谢日日欢| 91浏览器在线视频| 亚洲一区二区综合| 欧美日韩激情一区二区| 美腿丝袜亚洲色图| 亚洲精品一区二区三区福利| 国产成人啪午夜精品网站男同| 国产欧美一区二区精品性| 成人免费黄色在线| 亚洲精品少妇30p| 7777精品久久久大香线蕉| 欧美aaa在线| 国产欧美一区二区三区在线看蜜臀| 成人黄色小视频| 亚洲一区二区五区| 欧美日韩国产高清一区二区| 麻豆精品蜜桃视频网站| 国产欧美日韩在线观看| eeuss影院一区二区三区| 亚洲狼人国产精品| 91精品国产全国免费观看| 亚洲一区二区偷拍精品| 欧美裸体bbwbbwbbw| 免费观看日韩av| 久久蜜桃av一区二区天堂| 99久久精品国产观看| 亚洲午夜在线视频| 欧美成人一区二区三区| av亚洲精华国产精华精| 亚洲一区免费观看| 精品国产免费人成电影在线观看四季| 国产suv一区二区三区88区| 亚洲女与黑人做爰| 日韩免费观看高清完整版| 成人黄色免费短视频| 午夜精品久久久久久久久| 日韩一级在线观看| 91色九色蝌蚪| 麻豆精品国产91久久久久久| 中文天堂在线一区| 91精品国产一区二区人妖| 国产成人在线视频播放| 亚洲成人免费av| 亚洲国产成人午夜在线一区 | 中文成人综合网| 欧美三区在线观看| 美女性感视频久久| 一区二区三区国产豹纹内裤在线| 欧美大片日本大片免费观看| 91在线观看高清| 极品少妇一区二区三区精品视频 | 亚洲狠狠爱一区二区三区| 久久一区二区三区四区| 在线观看一区不卡| 国产福利91精品一区| 日本 国产 欧美色综合| 国产精品成人在线观看| 26uuu国产一区二区三区| 91久久国产最好的精华液| 成人精品在线视频观看| 麻豆成人免费电影| 亚洲妇熟xx妇色黄|