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

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

?? at1700.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:


static int net_open(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	int ioaddr = dev->base_addr;
	int i;

	/* Powerup the chip, initialize config register 1, and select bank 0. */
	outb(0xe0, ioaddr + CONFIG_1);

	/* Set the station address in bank zero. */
	for (i = 0; i < 6; i++)
		outb(dev->dev_addr[i], ioaddr + 8 + i);

	/* Switch to bank 1 and set the multicast table to accept none. */
	outb(0xe4, ioaddr + 7);
	for (i = 0; i < 8; i++)
		outb(0x00, ioaddr + 8 + i);

	/* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
	   bus access, and two 4K Tx queues. */
	outb(0xda, ioaddr + CONFIG_0);

	/* Same config 0, except enable the Rx and Tx. */
	outb(0x5a, ioaddr + CONFIG_0);
	/* Switch to register bank 2 for the run-time registers. */
	outb(0xe8, ioaddr + CONFIG_1);

	/* Turn on Rx interrupts, leave Tx interrupts off until packet Tx. */
	outb(0x00, ioaddr + TX_INTR);
	outb(0x81, ioaddr + RX_INTR);

	lp->open_time = jiffies;

	dev->tbusy = 0;
	dev->interrupt = 0;
	dev->start = 1;

	return 0;
}

static int
net_send_packet(struct sk_buff *skb, struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	int ioaddr = dev->base_addr;

	if (dev->tbusy) {
		/* If we get here, some higher level has decided we are broken.
		   There should really be a "kick me" function call instead. */
		int tickssofar = jiffies - dev->trans_start;
		if (tickssofar < 10)
			return 1;
		printk("%s: transmit timed out with status %04x, %s?\n", dev->name,
			   inw(ioaddr + STATUS), inb(ioaddr + TX_STATUS) & 0x80
			   ? "IRQ conflict" : "network cable problem");
		printk("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
			   dev->name, inw(ioaddr + 0), inw(ioaddr + 2), inw(ioaddr + 4),
			   inw(ioaddr + 6), inw(ioaddr + 8), inw(ioaddr + 10),
			   inw(ioaddr + 12), inw(ioaddr + 14));
		lp->stats.tx_errors++;
		/* ToDo: We should try to restart the adaptor... */
		outw(0xffff, ioaddr + 24);
		outw(0xffff, ioaddr + TX_STATUS);
		outw(0xe85a, ioaddr + CONFIG_0);
		outw(0x8100, ioaddr + TX_INTR);
		dev->tbusy=0;
		dev->trans_start = jiffies;
	}

	/* If some higher layer thinks we've missed an tx-done interrupt
	   we are passed NULL. Caution: dev_tint() handles the cli()/sti()
	   itself. */
	if (skb == NULL) {
		dev_tint(dev);
		return 0;
	}

	/* For ethernet, fill in the header.  This should really be done by a
	   higher level, rather than duplicated for each ethernet adaptor. */
	if (!skb->arp  &&  dev->rebuild_header(skb->data, dev)) {
		skb->dev = dev;
		arp_queue (skb);
		return 0;
	}
	skb->arp=1;

	/* Block a timer-based transmit from overlapping.  This could better be
	   done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
	if (set_bit(0, (void*)&dev->tbusy) != 0)
		printk("%s: Transmitter access conflict.\n", dev->name);
	else {
		short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
		unsigned char *buf = skb->data;

		/* Turn off the possible Tx interrupts. */
		outb(0x00, ioaddr + TX_INTR);
		
		outw(length, ioaddr + DATAPORT);
		outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);

		lp->tx_queue++;
		lp->tx_queue_len += length + 2;

		if (lp->tx_started == 0) {
			/* If the Tx is idle, always trigger a transmit. */
			outb(0x80 | lp->tx_queue, ioaddr + TX_START);
			lp->tx_queue = 0;
			lp->tx_queue_len = 0;
			dev->trans_start = jiffies;
			lp->tx_started = 1;
		} else if (lp->tx_queue_len < 4096 - 1502)	/* Room for one more packet? */
			dev->tbusy = 0;

		/* Turn on Tx interrupts back on. */
		outb(0x82, ioaddr + TX_INTR);
	}
	if (skb->free)
		kfree_skb (skb, FREE_WRITE);

	return 0;
}

/* The typical workload of the driver:
   Handle the network interface interrupts. */
static void
net_interrupt(int reg_ptr)
{
	int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
	struct device *dev = (struct device *)(irq2dev_map[irq]);
	struct net_local *lp;
	int ioaddr, status;

	if (dev == NULL) {
		printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
		return;
	}
	dev->interrupt = 1;

	ioaddr = dev->base_addr;
	lp = (struct net_local *)dev->priv;
	status = inw(ioaddr + TX_STATUS);
	outw(status, ioaddr + TX_STATUS);

	if (net_debug > 4)
		printk("%s: Interrupt with status %04x.\n", dev->name, status);
	if (status & 0xff00
		||  (inb(ioaddr + RX_MODE) & 0x40) == 0) {			/* Got a packet(s). */
		net_rx(dev);
	}
	if (status & 0x00ff) {
		if (status & 0x80) {
			lp->stats.tx_packets++;
			if (lp->tx_queue) {
				outb(0x80 | lp->tx_queue, ioaddr + TX_START);
				lp->tx_queue = 0;
				lp->tx_queue_len = 0;
				dev->trans_start = jiffies;
				dev->tbusy = 0;
				mark_bh(INET_BH);	/* Inform upper layers. */
			} else {
				lp->tx_started = 0;
				/* Turn on Tx interrupts off. */
				outb(0x00, ioaddr + TX_INTR);
				dev->tbusy = 0;
			}
		}
	}

	return;
}

/* We have a good packet(s), get it/them out of the buffers. */
static void
net_rx(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	int ioaddr = dev->base_addr;
	int boguscount = 5;

	while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
		ushort status = inw(ioaddr + DATAPORT);

		if (net_debug > 4)
			printk("%s: Rxing packet mode %02x status %04x.\n",
				   dev->name, inb(ioaddr + RX_MODE), status);
#ifndef final_version
		if (status == 0) {
			outb(0x05, ioaddr + 14);
			break;
		}
#endif

		if ((status & 0xF0) != 0x20) {	/* There was an error. */
			lp->stats.rx_errors++;
			if (status & 0x08) lp->stats.rx_length_errors++;
			if (status & 0x04) lp->stats.rx_frame_errors++;
			if (status & 0x02) lp->stats.rx_crc_errors++;
			if (status & 0x01) lp->stats.rx_over_errors++;
		} else {
			ushort pkt_len = inw(ioaddr + DATAPORT);
			/* Malloc up new buffer. */
			int sksize = sizeof(struct sk_buff) + pkt_len;
			struct sk_buff *skb;

			if (pkt_len > 1550) {
				printk("%s: The AT1700 claimed a very large packet, size %d.\n",
					   dev->name, pkt_len);
				outb(0x05, ioaddr + 14);
				lp->stats.rx_errors++;
				break;
			}
			skb = alloc_skb(sksize, GFP_ATOMIC);
			if (skb == NULL) {
				printk("%s: Memory squeeze, dropping packet (len %d).\n",
					   dev->name, pkt_len);
				outb(0x05, ioaddr + 14);
				lp->stats.rx_dropped++;
				break;
			}
			skb->mem_len = sksize;
			skb->mem_addr = skb;
			skb->len = pkt_len;
			skb->dev = dev;

			insw(ioaddr + DATAPORT, skb->data, (pkt_len + 1) >> 1);

			if (net_debug > 5) {
				int i;
				printk("%s: Rxed packet of length %d: ", dev->name, pkt_len);
				for (i = 0; i < 14; i++)
					printk(" %02x", skb->data[i]);
				printk(".\n");
			}

#ifdef HAVE_NETIF_RX
			netif_rx(skb);
#else
			skb->lock = 0;
			if (dev_rint((unsigned char*)skb, pkt_len, IN_SKBUFF, dev) != 0) {
				kfree_s(skb, sksize);
				lp->stats.rx_dropped++;
				break;
			}
#endif
			lp->stats.rx_packets++;
		}
		if (--boguscount <= 0)
			break;
	}

	/* If any worth-while packets have been received, dev_rint()
	   has done a mark_bh(INET_BH) for us and will work on them
	   when we get to the bottom-half routine. */
	{
		int i;
		for (i = 0; i < 20; i++) {
			if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
				break;
			outb(0x05, ioaddr + 14);
		}

		if (net_debug > 5)
			printk("%s: Exint Rx packet with mode %02x after %d ticks.\n", 
				   dev->name, inb(ioaddr + RX_MODE), i);
	}
	return;
}

/* The inverse routine to net_open(). */
static int net_close(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	int ioaddr = dev->base_addr;

	lp->open_time = 0;

	dev->tbusy = 1;
	dev->start = 0;

	/* Set configuration register 0 to disable Tx and Rx. */
	outb(0xda, ioaddr + CONFIG_0);

	/* Update the statistics -- ToDo. */

	/* Power-down the chip.  Green, green, green! */
	outb(0x00, ioaddr + CONFIG_1);

	return 0;
}

/* Get the current statistics.	This may be called with the card open or
   closed. */
static struct enet_statistics *
net_get_stats(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;

	cli();
	/* ToDo: Update the statistics from the device registers. */
	sti();

	return &lp->stats;
}

#ifdef HAVE_MULTICAST
/* Set or clear the multicast filter for this adaptor.
   num_addrs == -1	Promiscuous mode, receive all packets
   num_addrs == 0	Normal mode, clear multicast list
   num_addrs > 0	Multicast mode, receive normal and MC packets, and do
			best-effort filtering.
 */
static void
set_multicast_list(struct device *dev, int num_addrs, void *addrs)
{
	short ioaddr = dev->base_addr;
	if (num_addrs) {
		outw(3, ioaddr + RX_MODE);	/* Enable promiscuous mode */
	} else
		outw(2, ioaddr + RX_MODE);	/* Disable promiscuous, use normal mode */
}
#endif

/*
 * Local variables:
 *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c at1700.c"
 *  version-control: t
 *  kept-new-versions: 5
 *  tab-width: 4
 * End:
 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜不卡在线观看免费| 秋霞电影一区二区| 成人免费视频一区| 欧美激情一区在线| 成人黄页在线观看| 亚洲精品综合在线| 欧美日韩国产综合久久| 日韩精品久久理论片| 日韩欧美色综合网站| 国产精品一区二区不卡| 国产精品免费aⅴ片在线观看| 成人av先锋影音| 亚洲精品视频在线| 在线成人免费观看| 国产精品影视天天线| 中文字幕一区日韩精品欧美| 91国产福利在线| 成人免费高清视频在线观看| 91麻豆精品国产| 日韩欧美电影一区| 国产成人av一区二区三区在线 | 欧美国产一区在线| 99国产精品视频免费观看| 亚洲午夜精品在线| 亚洲精品在线三区| 91视频在线看| 久久不见久久见免费视频7| 国产精品私人影院| 欧美特级限制片免费在线观看| 日本va欧美va欧美va精品| 日本一区二区三区dvd视频在线| www.在线成人| 男人的天堂亚洲一区| 国产精品福利av| 欧美一区二区久久久| av电影天堂一区二区在线观看| 亚洲国产一区二区在线播放| 久久美女高清视频| 欧美日韩午夜精品| 成人精品视频.| 美女脱光内衣内裤视频久久网站 | 欧美亚一区二区| 狠狠色狠狠色综合系列| 亚洲黄网站在线观看| 久久久99精品免费观看不卡| 欧洲精品视频在线观看| 国产成人精品www牛牛影视| 天堂一区二区在线| 亚洲蜜臀av乱码久久精品蜜桃| 日韩精品一区二区在线| 欧美在线三级电影| 成人免费的视频| 精品在线你懂的| 亚洲第一会所有码转帖| 国产精品黄色在线观看| 久久影院视频免费| 欧美精品乱人伦久久久久久| 色婷婷综合久久久久中文一区二区 | 日韩欧美国产一区二区三区| 日本福利一区二区| 成人app在线观看| 国产在线播放一区| 青青青伊人色综合久久| 亚洲成人av电影| 伊人一区二区三区| 亚洲女厕所小便bbb| 国产人久久人人人人爽| 久久免费视频一区| 精品国产乱子伦一区| 91精品国产日韩91久久久久久| 欧美熟乱第一页| 欧美亚洲一区二区在线观看| 色婷婷久久久综合中文字幕 | 国产在线播精品第三| 狂野欧美性猛交blacked| jvid福利写真一区二区三区| 麻豆精品新av中文字幕| 亚洲国产视频直播| 亚洲午夜av在线| 一区二区三区日本| 亚洲最大成人网4388xx| 亚洲一区二区av电影| 亚洲国产美国国产综合一区二区| 亚洲免费视频中文字幕| 亚洲精品免费在线观看| 亚洲人一二三区| 亚洲一区二区三区精品在线| 亚洲尤物在线视频观看| 亚洲成va人在线观看| 日本不卡在线视频| 精品一区二区三区在线播放| 精品一区二区精品| 成人一道本在线| 91视频在线观看| 日韩亚洲欧美中文三级| 久久精品久久综合| 国产精品一区二区在线播放| 成人性生交大合| 91美女在线看| 在线成人av影院| 国产日韩精品一区二区三区| 国产精品婷婷午夜在线观看| 亚洲精品久久久久久国产精华液| 亚洲成人tv网| 韩国女主播成人在线| 粉嫩欧美一区二区三区高清影视| 99久久99久久免费精品蜜臀| 欧美日韩一区二区在线观看| 日韩网站在线看片你懂的| 国产亚洲女人久久久久毛片| 亚洲女与黑人做爰| 日本女人一区二区三区| 丁香婷婷深情五月亚洲| 欧美激情综合五月色丁香| 久草中文综合在线| 亚洲综合激情小说| 蓝色福利精品导航| 91首页免费视频| 日韩欧美专区在线| 国产无人区一区二区三区| 亚洲一区二区在线视频| 国产尤物一区二区在线| 91蜜桃在线免费视频| 欧美成人福利视频| 亚洲免费视频中文字幕| 国产在线精品一区二区夜色 | 国产精品综合在线视频| 91视频免费观看| 欧美精品一区二区三区蜜臀| 亚洲青青青在线视频| 国精产品一区一区三区mba视频| 色激情天天射综合网| 久久久精品日韩欧美| 亚洲一级二级在线| 成人av网站在线观看| 精品国产乱子伦一区| 亚洲一线二线三线视频| 国产69精品一区二区亚洲孕妇| 欧美日韩亚洲不卡| 日韩伦理电影网| 国产老肥熟一区二区三区| 欧美日本一区二区三区| 亚洲日本欧美天堂| 国产精品一区二区久久精品爱涩| av亚洲精华国产精华| 久久久噜噜噜久久人人看| 日本强好片久久久久久aaa| 99国内精品久久| 中文字幕欧美激情一区| 激情国产一区二区| 日韩无一区二区| 日韩综合在线视频| 欧美日韩一区二区三区高清| 日韩毛片精品高清免费| 成人av网在线| 国产女同性恋一区二区| 国产在线精品一区在线观看麻豆| 日韩视频免费观看高清完整版| 一区二区不卡在线播放 | 色域天天综合网| 中文字幕 久热精品 视频在线| 久久国内精品自在自线400部| 欧美男女性生活在线直播观看| 亚洲男女一区二区三区| 色综合咪咪久久| 日韩美女精品在线| 91丝袜高跟美女视频| 日韩一区中文字幕| 91丝袜呻吟高潮美腿白嫩在线观看| 中文字幕在线不卡视频| 99久久久久免费精品国产| 国产精品国产成人国产三级 | 日本韩国一区二区| 亚洲人成在线播放网站岛国| 99在线精品免费| 亚洲女同女同女同女同女同69| 色偷偷久久一区二区三区| 亚洲国产精品久久久久婷婷884| 欧美亚洲日本国产| 日韩成人午夜电影| 欧美xxxx老人做受| 国产一区二区剧情av在线| 国产亚洲精品aa午夜观看| 成人av电影免费在线播放| 亚洲三级免费观看| 欧美日高清视频| 理论片日本一区| 国产免费成人在线视频| 91色九色蝌蚪| 亚洲成年人影院| 精品播放一区二区| fc2成人免费人成在线观看播放| 国产精品白丝在线| 欧美色图12p| 韩国成人在线视频| 1024精品合集| 欧美一区二区三区精品| 粉嫩嫩av羞羞动漫久久久| 伊人性伊人情综合网| 日韩欧美久久一区|