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

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

?? cs89x0.c

?? CS8900網(wǎng)卡驅(qū)動(dòng)源碼 初學(xué)者可參考 附有詳細(xì)注釋
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
#endif                 );        netif_start_queue(dev);	if (net_debug > 1)		printk("cs89x0: net_open() succeeded\n");	return 0;bad_out:	return ret;}static void net_timeout(struct net_device *dev){	/* If we get here, some higher level has decided we are broken.	   There should really be a "kick me" function call instead. */	if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,		   tx_done(dev) ? "IRQ conflict ?" : "network cable problem");	/* Try to restart the adaptor. */	netif_wake_queue(dev);}static int net_send_packet(struct sk_buff *skb, struct net_device *dev){	struct net_local *lp = netdev_priv(dev);	if (net_debug > 3) {		printk("%s: sent %d byte packet of type %x\n",			dev->name, skb->len,			(skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);	}	/* keep the upload from being interrupted, since we                  ask the chip to start transmitting before the                  whole packet has been completely uploaded. */	spin_lock_irq(&lp->lock);	netif_stop_queue(dev);	/* initiate a transmit sequence */	writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd);	writeword(dev->base_addr, TX_LEN_PORT, skb->len);	/* Test to see if the chip has allocated memory for the packet */	if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {		/*		 * Gasp!  It hasn't.  But that shouldn't happen since		 * we're waiting for TxOk, so return 1 and requeue this packet.		 */				spin_unlock_irq(&lp->lock);		if (net_debug) printk("cs89x0: Tx buffer not free!\n");		return 1;	}	/* Write the contents of the packet */	writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);	spin_unlock_irq(&lp->lock);	lp->stats.tx_bytes += skb->len;	dev->trans_start = jiffies;	dev_kfree_skb (skb);	/*	 * We DO NOT call netif_wake_queue() here.	 * We also DO NOT call netif_start_queue().	 *	 * Either of these would cause another bottom half run through	 * net_send_packet() before this packet has fully gone out.  That causes	 * us to hit the "Gasp!" above and the send is rescheduled.  it runs like	 * a dog.  We just return and wait for the Tx completion interrupt handler	 * to restart the netdevice layer	 */	return 0;}/* The typical workload of the driver:   Handle the network interface interrupts. */   static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs * regs){	struct net_device *dev = dev_id;	struct net_local *lp;	int ioaddr, status; 	int handled = 0;	ioaddr = dev->base_addr;	lp = netdev_priv(dev);	/* we MUST read all the events out of the ISQ, otherwise we'll never           get interrupted again.  As a consequence, we can't have any limit           on the number of times we loop in the interrupt handler.  The           hardware guarantees that eventually we'll run out of events.  Of           course, if you're on a slow machine, and packets are arriving           faster than you can read them off, you're screwed.  Hasta la           vista, baby!  */	while ((status = readword(dev->base_addr, ISQ_PORT))) {		if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);		handled = 1;		switch(status & ISQ_EVENT_MASK) {		case ISQ_RECEIVER_EVENT:			/* Got a packet(s). */			net_rx(dev);			break;		case ISQ_TRANSMITTER_EVENT:			lp->stats.tx_packets++;			netif_wake_queue(dev);	/* Inform upper layers. */			if ((status & (	TX_OK |					TX_LOST_CRS |					TX_SQE_ERROR |					TX_LATE_COL |					TX_16_COL)) != TX_OK) {				if ((status & TX_OK) == 0) lp->stats.tx_errors++;				if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;				if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;				if (status & TX_LATE_COL) lp->stats.tx_window_errors++;				if (status & TX_16_COL) lp->stats.tx_aborted_errors++;			}			break;		case ISQ_BUFFER_EVENT:			if (status & READY_FOR_TX) {				/* we tried to transmit a packet earlier,                                   but inexplicably ran out of buffers.                                   That shouldn't happen since we only ever                                   load one packet.  Shrug.  Do the right                                   thing anyway. */				netif_wake_queue(dev);	/* Inform upper layers. */			}			if (status & TX_UNDERRUN) {				if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);                                lp->send_underrun++;                                if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;                                else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;				/* transmit cycle is done, although				   frame wasn't transmitted - this				   avoids having to wait for the upper				   layers to timeout on us, in the				   event of a tx underrun */				netif_wake_queue(dev);	/* Inform upper layers. */                        }#if ALLOW_DMA			if (lp->use_dma && (status & RX_DMA)) {				int count = readreg(dev, PP_DmaFrameCnt);				while(count) {					if (net_debug > 5)						printk("%s: receiving %d DMA frames\n", dev->name, count);					if (net_debug > 2 && count >1)						printk("%s: receiving %d DMA frames\n", dev->name, count);					dma_rx(dev);					if (--count == 0)						count = readreg(dev, PP_DmaFrameCnt);					if (net_debug > 2 && count > 0)						printk("%s: continuing with %d DMA frames\n", dev->name, count);				}			}#endif			break;		case ISQ_RX_MISS_EVENT:			lp->stats.rx_missed_errors += (status >>6);			break;		case ISQ_TX_COL_EVENT:			lp->stats.collisions += (status >>6);			break;		}	}	return IRQ_RETVAL(handled);}static voidcount_rx_errors(int status, struct net_local *lp){	lp->stats.rx_errors++;	if (status & RX_RUNT) lp->stats.rx_length_errors++;	if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;	if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))		/* per str 172 */		lp->stats.rx_crc_errors++;	if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;	return;}/* We have a good packet(s), get it/them out of the buffers. */static voidnet_rx(struct net_device *dev){	struct net_local *lp = netdev_priv(dev);	struct sk_buff *skb;	int status, length;	int ioaddr = dev->base_addr;	status = readword(ioaddr, RX_FRAME_PORT);	length = readword(ioaddr, RX_FRAME_PORT);	if ((status & RX_OK) == 0) {		count_rx_errors(status, lp);		return;	}	/* Malloc up new buffer. */	skb = dev_alloc_skb(length + 2);	if (skb == NULL) {#if 0		/* Again, this seems a cruel thing to do */		printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);#endif		lp->stats.rx_dropped++;		return;	}	skb_reserve(skb, 2);	/* longword align L3 header */	skb->dev = dev;	readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1);	if (length & 1)		skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT);	if (net_debug > 3) {		printk(	"%s: received %d byte packet of type %x\n",			dev->name, length,			(skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);	}        skb->protocol=eth_type_trans(skb,dev);	netif_rx(skb);	dev->last_rx = jiffies;	lp->stats.rx_packets++;	lp->stats.rx_bytes += length;}#if ALLOW_DMAstatic void release_dma_buff(struct net_local *lp){	if (lp->dma_buff) {		free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024));		lp->dma_buff = NULL;	}}#endif/* The inverse routine to net_open(). */static intnet_close(struct net_device *dev){#if ALLOW_DMA	struct net_local *lp = netdev_priv(dev);#endif	netif_stop_queue(dev);		writereg(dev, PP_RxCFG, 0);	writereg(dev, PP_TxCFG, 0);	writereg(dev, PP_BufCFG, 0);	writereg(dev, PP_BusCTL, 0);	free_irq(dev->irq, dev);#if ALLOW_DMA	if (lp->use_dma && lp->dma) {		free_dma(dev->dma);		release_dma_buff(lp);	}#endif	/* Update the statistics here. */	return 0;}/* Get the current statistics.	This may be called with the card open or   closed. */static struct net_device_stats *net_get_stats(struct net_device *dev){	struct net_local *lp = netdev_priv(dev);	unsigned long flags;	spin_lock_irqsave(&lp->lock, flags);	/* Update the statistics from the device registers. */	lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);	lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);	spin_unlock_irqrestore(&lp->lock, flags);	return &lp->stats;}static void set_multicast_list(struct net_device *dev){	struct net_local *lp = netdev_priv(dev);	unsigned long flags;	spin_lock_irqsave(&lp->lock, flags);	if(dev->flags&IFF_PROMISC)	{		lp->rx_mode = RX_ALL_ACCEPT;	}	else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)	{		/* The multicast-accept list is initialized to accept-all, and we		   rely on higher-level filtering for now. */		lp->rx_mode = RX_MULTCAST_ACCEPT;	} 	else		lp->rx_mode = 0;	writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);	/* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */	writereg(dev, PP_RxCFG, lp->curr_rx_cfg |	     (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));	spin_unlock_irqrestore(&lp->lock, flags);}static int set_mac_address(struct net_device *dev, void *p){	int i;	struct sockaddr *addr = p;	if (netif_running(dev))		return -EBUSY;	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);	if (net_debug) {		printk("%s: Setting MAC address to ", dev->name);		for (i = 0; i < dev->addr_len; i++)			printk(" %2.2x", dev->dev_addr[i]);		printk(".\n");	}	/* set the Ethernet address */	for (i=0; i < ETH_ALEN/2; i++)		writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));	return 0;}#ifdef MODULEstatic struct net_device *dev_cs89x0;/* * Support the 'debug' module parm even if we're compiled for non-debug to  * avoid breaking someone's startup scripts  */static int io;static int irq;static int debug;static char media[8];static int duplex=-1;static int use_dma;			/* These generate unused var warnings if ALLOW_DMA = 0 */static int dma;static int dmasize=16;			/* or 64 */module_param(io, int, 0);module_param(irq, int, 0);module_param(debug, int, 0);module_param_string(media, media, sizeof(media), 0);module_param(duplex, int, 0);module_param(dma , int, 0);module_param(dmasize , int, 0);module_param(use_dma , int, 0);MODULE_PARM_DESC(io, "cs89x0 I/O base address");MODULE_PARM_DESC(irq, "cs89x0 IRQ number");#if DEBUGGINGMODULE_PARM_DESC(debug, "cs89x0 debug level (0-6)");#elseMODULE_PARM_DESC(debug, "(ignored)");#endifMODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");/* No other value than -1 for duplex seems to be currently interpreted */MODULE_PARM_DESC(duplex, "(ignored)");#if ALLOW_DMAMODULE_PARM_DESC(dma , "cs89x0 ISA DMA channel; ignored if use_dma=0");MODULE_PARM_DESC(dmasize , "cs89x0 DMA size in kB (16,64); ignored if use_dma=0");MODULE_PARM_DESC(use_dma , "cs89x0 using DMA (0-1)");#elseMODULE_PARM_DESC(dma , "(ignored)");MODULE_PARM_DESC(dmasize , "(ignored)");MODULE_PARM_DESC(use_dma , "(ignored)");#endifMODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>");MODULE_LICENSE("GPL");/** media=t             - specify media type   or media=2   or media=aui   or medai=auto* duplex=0            - specify forced half/full/autonegotiate duplex* debug=#             - debug level* Default Chip Configuration:  * DMA Burst = enabled  * IOCHRDY Enabled = enabled    * UseSA = enabled    * CS8900 defaults to half-duplex if not specified on command-line    * CS8920 defaults to autoneg if not specified on command-line    * Use reset defaults for other config parameters* Assumptions:  * media type specified is supported (circuitry is present)  * if memory address is > 1MB, then required mem decode hw is present  * if 10B-2, then agent other than driver will enable DC/DC converter    (hw or software util)*/intinit_module(void){	struct net_device *dev = alloc_etherdev(sizeof(struct net_local));	struct net_local *lp;	int ret = 0;#if DEBUGGING	net_debug = debug;#else	debug = 0;#endif	if (!dev)		return -ENOMEM;	dev->irq = irq;	dev->base_addr = io;	lp = netdev_priv(dev);#if ALLOW_DMA	if (use_dma) {		lp->use_dma = use_dma;		lp->dma = dma;		lp->dmasize = dmasize;	}#endif	spin_lock_init(&lp->lock);        /* boy, they'd better get these right */        if (!strcmp(media, "rj45"))		lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;	else if (!strcmp(media, "aui"))		lp->adapter_cnf = A_CNF_MEDIA_AUI   | A_CNF_AUI;	else if (!strcmp(media, "bnc"))		lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;	else		lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;        if (duplex==-1)		lp->auto_neg_cnf = AUTO_NEG_ENABLE;        if (io == 0) {                printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.\n");                printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");                ret = -EPERM;		goto out;        } else if (io <= 0x1ff) {		ret = -ENXIO;		goto out;	}#if ALLOW_DMA	if (use_dma && dmasize != 16 && dmasize != 64) {		printk(KERN_ERR "cs89x0.c: dma size must be either 16K or 64K, not %dK\n", dmasize);		ret = -EPERM;		goto out;	}#endif	ret = cs89x0_probe1(dev, io, 1);	if (ret)		goto out;	dev_cs89x0 = dev;	return 0;out:	free_netdev(dev);	return ret;}voidcleanup_module(void){	unregister_netdev(dev_cs89x0);	writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);	release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);	free_netdev(dev_cs89x0);}#endif /* MODULE *//* * Local variables: *  version-control: t *  kept-new-versions: 5 *  c-indent-level: 8 *  tab-width: 8 * End: * */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕中文字幕一区二区| 国产精品综合av一区二区国产馆| 自拍视频在线观看一区二区| 久久这里只有精品6| 精品国产乱码久久久久久蜜臀| 欧美日韩在线观看一区二区| 91免费观看视频| 99精品桃花视频在线观看| a在线欧美一区| 91香蕉视频mp4| 欧美中文字幕一区二区三区亚洲| 91精彩视频在线观看| 欧美色视频在线观看| 欧美精品高清视频| 日韩欧美国产三级| 久久在线观看免费| 国产视频一区二区在线观看| 欧美国产精品中文字幕| 国产精品国产三级国产aⅴ入口| 亚洲欧美日韩一区二区| 一区二区理论电影在线观看| 亚洲一区视频在线观看视频| 日本视频一区二区三区| 久久99久久精品欧美| 国产精品1区2区3区| av在线一区二区| 欧洲av一区二区嗯嗯嗯啊| 欧美视频中文一区二区三区在线观看| 欧美夫妻性生活| 久久久久久9999| 亚洲精品一二三区| 日本欧美一区二区| 国产91高潮流白浆在线麻豆| 91年精品国产| 91精品国产综合久久精品| 精品日韩一区二区三区免费视频| 中文字幕久久午夜不卡| 一区二区三区日韩精品视频| 日韩成人免费在线| 国产成人在线影院| 欧美专区在线观看一区| 欧美mv日韩mv亚洲| 亚洲欧洲日韩综合一区二区| 亚洲h在线观看| 国产精品18久久久久久久久久久久| 不卡视频一二三| 777午夜精品视频在线播放| 久久久电影一区二区三区| 亚洲日本中文字幕区| 日韩电影在线观看一区| 成人蜜臀av电影| 在线观看91精品国产麻豆| 国产精品三级视频| 日本不卡不码高清免费观看 | 99精品一区二区三区| 777午夜精品视频在线播放| 国产精品丝袜在线| 日韩1区2区3区| 色婷婷精品大在线视频| 久久久一区二区| 午夜久久久久久久久久一区二区| 国产大陆精品国产| 91精品免费在线观看| 国产精品久久久久久户外露出 | 亚洲欧美激情插| 国内精品伊人久久久久av一坑| 色偷偷久久一区二区三区| 国产日本欧美一区二区| 男人的天堂亚洲一区| 色婷婷久久久综合中文字幕| 欧美精品一区二区精品网| 亚洲国产色一区| eeuss鲁片一区二区三区在线观看| 日韩三级av在线播放| 一区二区三区四区中文字幕| 国产成人亚洲综合a∨猫咪| 欧美一区二区三区人| 亚洲免费av在线| 成人a区在线观看| 久久综合久久鬼色中文字| 日韩精品亚洲专区| 欧美在线短视频| 亚洲婷婷在线视频| 国产suv精品一区二区三区| 精品盗摄一区二区三区| 日韩成人一级大片| 欧美精品高清视频| 午夜精品久久久久久久久| 91黄视频在线观看| 亚洲欧洲精品成人久久奇米网| 国产精品77777| 国产亚洲精品7777| 国产老肥熟一区二区三区| 欧美不卡视频一区| 蜜臀va亚洲va欧美va天堂| 制服丝袜中文字幕一区| 亚洲成人午夜影院| 在线观看免费亚洲| 亚洲国产一区二区视频| 精品视频999| 婷婷国产v国产偷v亚洲高清| 欧美日韩一区二区电影| 亚洲一区在线视频| 欧美人妖巨大在线| 天天色 色综合| 欧美三级日韩三级| 日韩专区中文字幕一区二区| 欧美乱熟臀69xxxxxx| 午夜影视日本亚洲欧洲精品| 欧美三级日韩三级| 日韩中文字幕1| 欧美一区二区黄色| 精品一区二区三区在线播放| 久久人人爽爽爽人久久久| 丁香另类激情小说| 综合激情成人伊人| 欧美日韩一区在线观看| 亚洲高清在线视频| 日韩免费一区二区| 国产一区二区三区日韩| 国产欧美日韩视频一区二区| av中文字幕亚洲| 亚洲国产综合在线| 日韩美女在线视频| 国产91露脸合集magnet| 亚洲色图.com| 欧美顶级少妇做爰| 国产一区欧美日韩| 最新中文字幕一区二区三区| 色网综合在线观看| 免费成人你懂的| 国产精品女上位| 欧美手机在线视频| 国产一区二区福利视频| 国产精品久久毛片av大全日韩| 91丝袜美腿高跟国产极品老师| 性做久久久久久久免费看| www久久久久| 色诱视频网站一区| 日本亚洲三级在线| 国产精品久久久一本精品| 欧美三级日本三级少妇99| 国产专区综合网| 亚洲一区二区三区四区不卡| 日韩欧美中文字幕一区| 国产精品1024| 亚洲成人动漫在线观看| 26uuuu精品一区二区| 色成人在线视频| 九九**精品视频免费播放| 国产精品久久久久久户外露出| 51精品秘密在线观看| 岛国av在线一区| 人人精品人人爱| 亚洲精品久久7777| 久久久久久9999| 在线不卡中文字幕播放| 成人黄色a**站在线观看| 日韩精彩视频在线观看| 国产精品每日更新| 日韩视频在线你懂得| 一本色道亚洲精品aⅴ| 国产一区二区三区蝌蚪| 亚洲一区二区三区免费视频| 久久久精品人体av艺术| 337p亚洲精品色噜噜狠狠| 99精品国产热久久91蜜凸| 美国毛片一区二区三区| 亚洲综合色婷婷| 亚洲国产精品国自产拍av| 欧美一区二区三区免费大片| 成人白浆超碰人人人人| 国模套图日韩精品一区二区| 亚洲一区免费在线观看| 国产精品对白交换视频| 久久亚洲影视婷婷| 91精品国产福利| 欧美中文字幕一区二区三区亚洲| 国产91精品欧美| 国产最新精品免费| 日产欧产美韩系列久久99| 亚洲精品国产无天堂网2021| 国产精品女主播在线观看| 久久久久久毛片| 日韩你懂的在线播放| 91精品国产色综合久久久蜜香臀| 91成人免费在线| 一本色道久久综合精品竹菊| av在线播放成人| 懂色av一区二区三区蜜臀| 国产在线精品免费| 精品一区二区三区在线播放视频| 日本视频免费一区| 日本欧美一区二区| 青青青伊人色综合久久| 日韩高清一区在线| 婷婷久久综合九色国产成人| 性久久久久久久久久久久| 亚洲制服欧美中文字幕中文字幕| 一区二区三区四区av|