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

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

?? s2io.c

?? Linux Kernel 2.6.9 for OMAP1710
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
 *  The NIC supports 3 receive modes, viz *  1. single buffer, *  2. three buffer and *  3. Five buffer modes. *  Each mode defines how many fragments the received frame will be split  *  up into by the NIC. The frame is split into L3 header, L4 Header,  *  L4 payload in three buffer mode and in 5 buffer mode, L4 payload itself  *  is split into 3 fragments. As of now only single buffer mode is supported. */int fill_rx_buffers(struct s2io_nic *nic, int ring_no){	struct net_device *dev = nic->dev;	struct sk_buff *skb;	RxD_t *rxdp;	int off, off1, size, block_no, block_no1;	int offset, offset1;	u32 alloc_tab = 0;	u32 alloc_cnt = nic->pkt_cnt[ring_no] -	    atomic_read(&nic->rx_bufs_left[ring_no]);	mac_info_t *mac_control;	struct config_param *config;	mac_control = &nic->mac_control;	config = &nic->config;	if (frame_len[ring_no]) {		if (frame_len[ring_no] > dev->mtu)			dev->mtu = frame_len[ring_no];		size = frame_len[ring_no] + HEADER_ETHERNET_II_802_3_SIZE +		    HEADER_802_2_SIZE + HEADER_SNAP_SIZE;	} else {		size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE +		    HEADER_802_2_SIZE + HEADER_SNAP_SIZE;	}	while (alloc_tab < alloc_cnt) {		block_no = mac_control->rx_curr_put_info[ring_no].		    block_index;		block_no1 = mac_control->rx_curr_get_info[ring_no].		    block_index;		off = mac_control->rx_curr_put_info[ring_no].offset;		off1 = mac_control->rx_curr_get_info[ring_no].offset;		offset = block_no * (MAX_RXDS_PER_BLOCK + 1) + off;		offset1 = block_no1 * (MAX_RXDS_PER_BLOCK + 1) + off1;		rxdp = nic->rx_blocks[ring_no][block_no].		    block_virt_addr + off;		if ((offset == offset1) && (rxdp->Host_Control)) {			DBG_PRINT(INTR_DBG, "%s: Get and Put", dev->name);			DBG_PRINT(INTR_DBG, " info equated\n");			goto end;		}		if (rxdp->Control_1 == END_OF_BLOCK) {			mac_control->rx_curr_put_info[ring_no].			    block_index++;			mac_control->rx_curr_put_info[ring_no].			    block_index %= nic->block_count[ring_no];			block_no = mac_control->rx_curr_put_info			    [ring_no].block_index;			off++;			off %= (MAX_RXDS_PER_BLOCK + 1);			mac_control->rx_curr_put_info[ring_no].offset =			    off;			/*rxdp = nic->rx_blocks[ring_no][block_no].			   block_virt_addr + off; */			rxdp = (RxD_t *) ((unsigned long) rxdp->Control_2);			DBG_PRINT(INTR_DBG, "%s: Next block at: %p\n",				  dev->name, rxdp);		}		if (rxdp->Control_1 & RXD_OWN_XENA) {			mac_control->rx_curr_put_info[ring_no].			    offset = off;			goto end;		}		skb = dev_alloc_skb(size + NET_IP_ALIGN);		if (!skb) {			DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name);			DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n");			return -ENOMEM;		}		skb_reserve(skb, NET_IP_ALIGN);		memset(rxdp, 0, sizeof(RxD_t));		rxdp->Buffer0_ptr = pci_map_single		    (nic->pdev, skb->data, size, PCI_DMA_FROMDEVICE);		rxdp->Control_2 &= (~MASK_BUFFER0_SIZE);		rxdp->Control_2 |= SET_BUFFER0_SIZE(size);		rxdp->Host_Control = (unsigned long) (skb);		rxdp->Control_1 |= RXD_OWN_XENA;		off++;		off %= (MAX_RXDS_PER_BLOCK + 1);		mac_control->rx_curr_put_info[ring_no].offset = off;		atomic_inc(&nic->rx_bufs_left[ring_no]);		alloc_tab++;	}      end:	return SUCCESS;}/*   *  Input Arguments:  *  device private variable. *  Return Value:  *  NONE. *  Description:  *  This function will free all Rx buffers allocated by host. */static void freeRxBuffers(struct s2io_nic *sp){	struct net_device *dev = sp->dev;	int i, j, blk = 0, off, buf_cnt = 0;	RxD_t *rxdp;	struct sk_buff *skb;	mac_info_t *mac_control;	struct config_param *config;	mac_control = &sp->mac_control;	config = &sp->config;	for (i = 0; i < config->RxRingNum; i++) {		for (j = 0, blk = 0; j < config->RxCfg[i].NumRxd; j++) {			off = j % (MAX_RXDS_PER_BLOCK + 1);			rxdp = sp->rx_blocks[i][blk].block_virt_addr + off;			if (rxdp->Control_1 == END_OF_BLOCK) {				rxdp =				    (RxD_t *) ((unsigned long) rxdp->					       Control_2);				j++;				blk++;			}			skb =			    (struct sk_buff *) ((unsigned long) rxdp->						Host_Control);			if (skb) {				pci_unmap_single(sp->pdev, (dma_addr_t)						 rxdp->Buffer0_ptr,						 dev->mtu +						 HEADER_ETHERNET_II_802_3_SIZE						 + HEADER_802_2_SIZE +						 HEADER_SNAP_SIZE,						 PCI_DMA_FROMDEVICE);				dev_kfree_skb(skb);				atomic_dec(&sp->rx_bufs_left[i]);				buf_cnt++;			}			memset(rxdp, 0, sizeof(RxD_t));		}		mac_control->rx_curr_put_info[i].block_index = 0;		mac_control->rx_curr_get_info[i].block_index = 0;		mac_control->rx_curr_put_info[i].offset = 0;		mac_control->rx_curr_get_info[i].offset = 0;		atomic_set(&sp->rx_bufs_left[i], 0);		DBG_PRINT(INIT_DBG, "%s:Freed 0x%x Rx Buffers on ring%d\n",			  dev->name, buf_cnt, i);	}}/* *  Input Argument:  *   dev - pointer to the device structure. *   budget - The number of packets that were budgeted to be processed during *   one pass through the 'Poll" function. *  Return value: *   0 on success and 1 if there are No Rx packets to be processed. *  Description: *   Comes into picture only if NAPI support has been incorporated. It does *   the same thing that rxIntrHandler does, but not in a interrupt context *   also It will process only a given number of packets. */#ifdef CONFIG_S2IO_NAPIstatic int s2io_poll(struct net_device *dev, int *budget){	nic_t *nic = dev->priv;	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;	int pkts_to_process = *budget, pkt_cnt = 0;	register u64 val64 = 0;	rx_curr_get_info_t offset_info;	int i, block_no;	u16 val16, cksum;	struct sk_buff *skb;	RxD_t *rxdp;	mac_info_t *mac_control;	struct config_param *config;	mac_control = &nic->mac_control;	config = &nic->config;	if (pkts_to_process > dev->quota)		pkts_to_process = dev->quota;	val64 = readq(&bar0->rx_traffic_int);	writeq(val64, &bar0->rx_traffic_int);	for (i = 0; i < config->RxRingNum; i++) {		if (--pkts_to_process < 0) {			goto no_rx;		}		offset_info = mac_control->rx_curr_get_info[i];		block_no = offset_info.block_index;		rxdp = nic->rx_blocks[i][block_no].block_virt_addr +		    offset_info.offset;		while (!(rxdp->Control_1 & RXD_OWN_XENA)) {			if (rxdp->Control_1 == END_OF_BLOCK) {				rxdp =				    (RxD_t *) ((unsigned long) rxdp->					       Control_2);				offset_info.offset++;				offset_info.offset %=				    (MAX_RXDS_PER_BLOCK + 1);				block_no++;				block_no %= nic->block_count[i];				mac_control->rx_curr_get_info[i].				    offset = offset_info.offset;				mac_control->rx_curr_get_info[i].				    block_index = block_no;				continue;			}			skb =			    (struct sk_buff *) ((unsigned long) rxdp->						Host_Control);			if (skb == NULL) {				DBG_PRINT(ERR_DBG, "%s: The skb is ",					  dev->name);				DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");				return 0;			}			val64 = RXD_GET_BUFFER0_SIZE(rxdp->Control_2);			val16 = (u16) (val64 >> 48);			cksum = RXD_GET_L4_CKSUM(rxdp->Control_1);			pci_unmap_single(nic->pdev, (dma_addr_t)					 rxdp->Buffer0_ptr,					 dev->mtu +					 HEADER_ETHERNET_II_802_3_SIZE +					 HEADER_802_2_SIZE +					 HEADER_SNAP_SIZE,					 PCI_DMA_FROMDEVICE);			rxOsmHandler(nic, val16, rxdp, i);			pkt_cnt++;			offset_info.offset++;			offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1);			rxdp =			    nic->rx_blocks[i][block_no].block_virt_addr +			    offset_info.offset;			mac_control->rx_curr_get_info[i].offset =			    offset_info.offset;		}	}	if (!pkt_cnt)		pkt_cnt = 1;	for (i = 0; i < config->RxRingNum; i++)		fill_rx_buffers(nic, i);	dev->quota -= pkt_cnt;	*budget -= pkt_cnt;	netif_rx_complete(dev);/* Re enable the Rx interrupts. */	en_dis_able_NicIntrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS);	return 0;      no_rx:	for (i = 0; i < config->RxRingNum; i++)		fill_rx_buffers(nic, i);	dev->quota -= pkt_cnt;	*budget -= pkt_cnt;	return 1;}#else/*   *  Input Arguments:  *  device private variable. *  Return Value:  *  NONE. *  Description:  * If the interrupt is because of a received frame or if the  *  receive ring contains fresh as yet un-processed frames, this function is *  called. It picks out the RxD at which place the last Rx processing had  *  stopped and sends the skb to the OSM's Rx handler and then increments  *  the offset. */static void rxIntrHandler(struct s2io_nic *nic){	struct net_device *dev = (struct net_device *) nic->dev;	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;	rx_curr_get_info_t offset_info;	RxD_t *rxdp;	struct sk_buff *skb;	u16 val16, cksum;	register u64 val64 = 0;	int i, block_no;	mac_info_t *mac_control;	struct config_param *config;	mac_control = &nic->mac_control;	config = &nic->config;#if DEBUG_ON	nic->rxint_cnt++;#endif/* rx_traffic_int reg is an R1 register, hence we read and write back  * the samevalue in the register to clear it. */	val64 = readq(&bar0->rx_traffic_int);	writeq(val64, &bar0->rx_traffic_int);	for (i = 0; i < config->RxRingNum; i++) {		offset_info = mac_control->rx_curr_get_info[i];		block_no = offset_info.block_index;		rxdp = nic->rx_blocks[i][block_no].block_virt_addr +		    offset_info.offset;		while (!(rxdp->Control_1 & RXD_OWN_XENA)) {			if (rxdp->Control_1 == END_OF_BLOCK) {				rxdp = (RxD_t *) ((unsigned long)						  rxdp->Control_2);				offset_info.offset++;				offset_info.offset %=				    (MAX_RXDS_PER_BLOCK + 1);				block_no++;				block_no %= nic->block_count[i];				mac_control->rx_curr_get_info[i].				    offset = offset_info.offset;				mac_control->rx_curr_get_info[i].				    block_index = block_no;				continue;			}			skb = (struct sk_buff *) ((unsigned long)						  rxdp->Host_Control);			if (skb == NULL) {				DBG_PRINT(ERR_DBG, "%s: The skb is ",					  dev->name);				DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");				return;			}			val64 = RXD_GET_BUFFER0_SIZE(rxdp->Control_2);			val16 = (u16) (val64 >> 48);			cksum = RXD_GET_L4_CKSUM(rxdp->Control_1);			pci_unmap_single(nic->pdev, (dma_addr_t)					 rxdp->Buffer0_ptr,					 dev->mtu +					 HEADER_ETHERNET_II_802_3_SIZE +					 HEADER_802_2_SIZE +					 HEADER_SNAP_SIZE,					 PCI_DMA_FROMDEVICE);			rxOsmHandler(nic, val16, rxdp, i);			offset_info.offset++;			offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1);			rxdp =			    nic->rx_blocks[i][block_no].block_virt_addr +			    offset_info.offset;			mac_control->rx_curr_get_info[i].offset =			    offset_info.offset;		}	}}#endif/*   *  Input Arguments:  *  device private variable *  Return Value:  *  NONE *  Description:  *  If an interrupt was raised to indicate DMA complete of the  *  Tx packet, this function is called. It identifies the last TxD whose buffer *  was freed and frees all skbs whose data have already DMA'ed into the NICs *  internal memory. */static void txIntrHandler(struct s2io_nic *nic){	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;	struct net_device *dev = (struct net_device *) nic->dev;	tx_curr_get_info_t offset_info, offset_info1;	struct sk_buff *skb;	TxD_t *txdlp;	register u64 val64 = 0;	int i;	u16 j, frg_cnt;	mac_info_t *mac_control;	struct config_param *config;#if DEBUG_ON	int cnt = 0;	nic->txint_cnt++;#endif	mac_control = &nic->mac_control;	config = &nic->config;	/* tx_traffic_int reg is an R1 register, hence we read and write 	 * back the samevalue in the register to clear it.	 */	val64 = readq(&bar0->tx_traffic_int);	writeq(val64, &bar0->tx_traffic_int);	for (i = 0; i < config->TxFIFONum; i++) {		offset_info = mac_control->tx_curr_get_info[i];		offset_info1 = mac_control->tx_curr_put_info[i];		txdlp = mac_control->txdl_start[i] +		    (config->MaxTxDs * offset_info.offset);		while ((!(txdlp->Control_1 & TXD_LIST_OWN_XENA)) &&		       (offset_info.offset != offset_info1.offset) &&		       (txdlp->Host_Control)) {			/* Check for TxD errors */			if (txdlp->Control_1 & TXD_T_CODE) {				unsigned long long err;				err = txdlp->Control_1 & TXD_T_CODE;				DBG_PRINT(ERR_DBG, "***TxD error %llx\n",					  err);			}			skb = (struct sk_buff *) ((unsigned long)						  txdlp->Host_Control);			if (skb == NULL) {				DBG_PRINT(ERR_DBG, "%s: Null skb ",					  dev->name);				DBG_PRINT(ERR_DBG, "in Tx Free Intr\n");				return;			}			nic->tx_pkt_count++;			frg_cnt = skb_shinfo(skb)->nr_frags;			/*  For unfragmented skb */			pci_unmap_single(nic->pdev, (dma_addr_t)					 txdlp->Buffer_Pointer,					 skb->len - skb->data_len,					 PCI_DMA_TODEVICE);			if (frg_cnt) {				TxD_t *temp = txdlp;				txdlp++;				for (j = 0; j < frg_cnt; j++, txdlp++) {					skb_frag_t *frag =					    &skb_shinfo(skb)->frags[j];					pci_unmap_page(nic->pdev,						       (dma_addr_t)						       txdlp->						       Buffer_Pointer,						       frag->size,						       PCI_DMA_TODEVICE);				}				txdlp = temp;			}			memset(txdlp, 0,			       (sizeof(TxD_t) * config->MaxTxDs));

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大片拔萝卜| 欧美老女人第四色| 一区二区在线免费| 91精品国产综合久久久久| 久久99精品久久久| 日韩美女久久久| 日韩一区二区电影网| 丰满白嫩尤物一区二区| 亚洲高清视频的网址| 国产日韩在线不卡| 欧美性大战久久久久久久蜜臀| 久久精品国产亚洲一区二区三区| 中文在线资源观看网站视频免费不卡| 一本色道亚洲精品aⅴ| 青青草视频一区| 综合自拍亚洲综合图不卡区| 欧美一二三区在线观看| 99re这里只有精品首页| 精品一区二区日韩| 一区二区三区中文字幕精品精品| 亚洲美女免费在线| 91麻豆精品国产91久久久更新时间| 国产999精品久久久久久| 偷拍一区二区三区四区| 亚洲天堂久久久久久久| 日韩美女视频在线| 91成人在线免费观看| 国产乱对白刺激视频不卡| 婷婷成人激情在线网| 亚洲欧美偷拍三级| 国产欧美日韩三区| 日韩欧美一区二区免费| 欧美性猛交xxxx乱大交退制版 | 成人免费一区二区三区视频| 欧美一区二区二区| 欧美视频在线不卡| 在线免费不卡视频| 91小视频免费看| 成人免费电影视频| 国产综合色产在线精品 | 91在线播放网址| 激情五月婷婷综合网| 丝袜诱惑亚洲看片| 亚洲第一福利一区| 亚洲成人黄色影院| 亚洲午夜av在线| 一区二区高清视频在线观看| 国产亚洲精品bt天堂精选| 337p亚洲精品色噜噜噜| 欧美最新大片在线看| 不卡一二三区首页| 国产一级精品在线| 久久9热精品视频| 婷婷六月综合网| 一区二区三区蜜桃| 国产精品成人免费精品自在线观看 | 美腿丝袜一区二区三区| 亚洲免费高清视频在线| 国产精品国产三级国产专播品爱网 | 精品三级在线看| 欧美老肥妇做.爰bbww视频| 91视频91自| 丰满亚洲少妇av| 国产一区二区三区香蕉| 麻豆国产欧美日韩综合精品二区 | 丁香啪啪综合成人亚洲小说| 麻豆精品视频在线观看视频| 亚洲一区在线观看免费| 伊人色综合久久天天人手人婷| 国产精品久99| 中文字幕在线不卡一区二区三区| 久久精品欧美一区二区三区麻豆| 久久亚洲一区二区三区明星换脸| 一区二区三区成人| 国产精品看片你懂得| 久久久久88色偷偷免费| 久久精品一区四区| 久久久天堂av| 欧美mv和日韩mv的网站| 欧美xxxxxxxxx| 2023国产精品| 国产欧美一区二区精品婷婷| 国产精品久久福利| 成人免费在线播放视频| 亚洲精品乱码久久久久久黑人| 一区二区三区四区蜜桃| 亚洲午夜精品久久久久久久久| 亚洲综合丝袜美腿| 中文字幕一区二区三区色视频| 国产精品盗摄一区二区三区| 亚洲丝袜美腿综合| 亚洲影院在线观看| 午夜一区二区三区视频| 免费美女久久99| 麻豆精品在线播放| 国产91富婆露脸刺激对白| 成人av午夜电影| 在线影院国内精品| 欧美大尺度电影在线| 精品电影一区二区三区| 国产日韩亚洲欧美综合| 99久久精品国产导航| 欧美日韩国产经典色站一区二区三区 | 成人小视频免费观看| 亚洲精品在线观| 1024成人网色www| 依依成人综合视频| 国产一区在线视频| 国产成人在线看| 91麻豆6部合集magnet| 欧美高清www午色夜在线视频| 日韩精品一区二区三区视频在线观看| 日韩一级片网站| 国产日韩影视精品| 亚洲福利一区二区三区| 国产精品18久久久久久久网站| 欧美性猛交xxxx黑人交| 精品国产sm最大网站| 亚洲国产高清在线| 日韩精品一区第一页| 久久爱www久久做| 欧美午夜精品久久久久久超碰| 日韩一级成人av| 樱桃国产成人精品视频| 国产一区二区不卡在线| 欧美日韩成人在线一区| 欧美激情一区二区三区不卡 | 日本一区二区视频在线观看| 午夜精品一区二区三区电影天堂 | 成人avav在线| 欧美日韩黄色一区二区| 一区二区中文字幕在线| 免费成人性网站| 欧美专区亚洲专区| 日本一区二区免费在线观看视频 | 国产精品日韩精品欧美在线| 亚洲国产你懂的| 老司机精品视频线观看86| 色av一区二区| 国产亚洲污的网站| 蜜桃传媒麻豆第一区在线观看| 成人av影视在线观看| 欧美大度的电影原声| 亚洲福利电影网| 色丁香久综合在线久综合在线观看| 久久亚洲精精品中文字幕早川悠里| 丝袜诱惑制服诱惑色一区在线观看| 91亚洲国产成人精品一区二三| 欧美视频在线一区二区三区| 亚洲国产精品成人综合| 精品一区二区三区香蕉蜜桃| 欧美日韩成人综合| 怡红院av一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 欧美大片一区二区| 麻豆成人久久精品二区三区小说| 欧美亚洲丝袜传媒另类| 国产日韩欧美电影| 久久99蜜桃精品| 欧美丰满一区二区免费视频| 亚洲一区免费观看| aaa国产一区| 亚洲视频一区二区在线观看| 国产精品 欧美精品| 日韩午夜av一区| 紧缚捆绑精品一区二区| 91麻豆精品国产91久久久久| 亚洲成人中文在线| 色婷婷av一区二区三区大白胸| 中文字幕亚洲一区二区av在线| 不卡的av网站| 中文字幕亚洲欧美在线不卡| 国产精品一二三区在线| 国产日韩欧美不卡在线| 狠狠色综合色综合网络| 久久一夜天堂av一区二区三区| 六月婷婷色综合| 色天使色偷偷av一区二区| 国产亚洲精品久| 色综合久久88色综合天天免费| 亚洲精品午夜久久久| 色综合婷婷久久| 亚洲一区二区三区免费视频| 色八戒一区二区三区| 亚洲一区在线电影| 日韩一区二区三区在线视频| 日产国产高清一区二区三区| 日韩精品一区二区三区视频播放| 美女视频一区二区三区| 日韩一区二区三区视频在线观看| 狠狠色狠狠色合久久伊人| 国产午夜一区二区三区| 成人精品小蝌蚪| 伊人婷婷欧美激情| 97精品久久久午夜一区二区三区| 亚洲欧洲www| av一二三不卡影片| 亚洲一区在线免费观看| 欧美日韩一区二区三区在线看| 天天综合天天综合色|