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

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

?? eexpress.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 3 頁
字號:

	/* ToDo: decide if there are any useful statistics from the SCB. */

	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 < 0) {
		/* Not written yet, this requires expanding the init_words config
		   cmd. */
	} else if (num_addrs > 0) {
		/* Fill in the SET_MC_CMD with the number of address bytes, followed
		   by the list of multicast addresses to be accepted. */
		outw(SET_MC_CMD + 6, ioaddr + WRITE_PTR);
		outw(num_addrs * 6, ioaddr);
		outsw(ioaddr, addrs, num_addrs*3);		/* 3 = addr len in words */
		/* We must trigger a whole 586 reset due to a bug. */
	} else {
		/* Not written yet, this requires expanding the init_words config
		   cmd. */
		outw(99, ioaddr);		/* Disable promiscuous mode, use normal mode */
	}
}
#endif

/* The horrible routine to read a word from the serial EEPROM. */

/* The delay between EEPROM clock transitions. */
#define eeprom_delay()	{ int _i = 40; while (--_i > 0) { __SLOW_DOWN_IO; }}
#define EE_READ_CMD (6 << 6)

int
read_eeprom(int ioaddr, int location)
{
	int i;
	unsigned short retval = 0;
	short ee_addr = ioaddr + EEPROM_Ctrl;
	int read_cmd = location | EE_READ_CMD;
	short ctrl_val = EE_CS | _586_RESET;
	
	outb(ctrl_val, ee_addr);
	
	/* Shift the read command bits out. */
	for (i = 8; i >= 0; i--) {
		short outval = (read_cmd & (1 << i)) ? ctrl_val | EE_DATA_WRITE
			: ctrl_val;
		outb(outval, ee_addr);
		outb(outval | EE_SHIFT_CLK, ee_addr);	/* EEPROM clock tick. */
		eeprom_delay();
		outb(outval, ee_addr);	/* Finish EEPROM a clock tick. */
		eeprom_delay();
	}
	outb(ctrl_val, ee_addr);
	
	for (i = 16; i > 0; i--) {
		outb(ctrl_val | EE_SHIFT_CLK, ee_addr);	 eeprom_delay();
		retval = (retval << 1) | ((inb(ee_addr) & EE_DATA_READ) ? 1 : 0);
		outb(ctrl_val, ee_addr);  eeprom_delay();
	}

	/* Terminate the EEPROM access. */
	ctrl_val &= ~EE_CS;
	outb(ctrl_val | EE_SHIFT_CLK, ee_addr);
	eeprom_delay();
	outb(ctrl_val, ee_addr);
	eeprom_delay();
	return retval;
}

static void
init_82586_mem(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	short ioaddr = dev->base_addr;

	/* Enable loopback to protect the wire while starting up.
	   This is Superstition From Crynwr. */
	outb(inb(ioaddr + Config) | 0x02, ioaddr + Config);

	/* Hold the 586 in reset during the memory initialization. */
	outb(_586_RESET, ioaddr + EEPROM_Ctrl);

	/* Place the write pointer at 0xfff6 (address-aliased to 0xfffff6). */
	outw(0xfff6, ioaddr + WRITE_PTR);
	outsw(ioaddr, init_words, sizeof(init_words)>>1);

	/* Fill in the station address. */
	outw(SA_OFFSET, ioaddr + WRITE_PTR);
	outsw(ioaddr, dev->dev_addr, 3);

	/* The Tx-block list is written as needed.  We just set up the values. */
#ifdef initial_text_tx
	lp->tx_cmd_link = DUMP_DATA + 4;
#else
	lp->tx_cmd_link = IDLELOOP + 4;
#endif
	lp->tx_head = lp->tx_reap = TX_BUF_START;

	init_rx_bufs(dev);

	/* Start the 586 by releasing the reset line. */
	outb(0x00, ioaddr + EEPROM_Ctrl);

	/* This was time consuming to track down: you need to give two channel
	   attention signals to reliably start up the i82586. */
	outb(0, ioaddr + SIGNAL_CA);

	{
		int boguscnt = 50;
		while (inw(ioaddr + SCB_STATUS) == 0)
			if (--boguscnt == 0) {
				printk("%s: i82586 initialization timed out with status %04x, cmd %04x.\n",
					   dev->name, inw(ioaddr + SCB_STATUS), inw(ioaddr + SCB_CMD));
				break;
			}
		/* Issue channel-attn -- the 82586 won't start without it. */
		outb(0, ioaddr + SIGNAL_CA);
	}

	/* Disable loopback. */
	outb(inb(ioaddr + Config) & ~0x02, ioaddr + Config);
	if (net_debug > 4)
		printk("%s: Initialized 82586, status %04x.\n", dev->name,
			   inw(ioaddr + SCB_STATUS));
	return;
}

/* Initialize the Rx-block list. */
static void init_rx_bufs(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	short ioaddr = dev->base_addr;

	int cur_rxbuf = lp->rx_head = RX_BUF_START;
	
	/* Initialize each Rx frame + data buffer. */
	do {	/* While there is room for one more. */
		outw(cur_rxbuf, ioaddr + WRITE_PTR);
		outw(0x0000, ioaddr); 				/* Status */
		outw(0x0000, ioaddr);				/* Command */
		outw(cur_rxbuf + RX_BUF_SIZE, ioaddr); /* Link */
		outw(cur_rxbuf + 22, ioaddr);		/* Buffer offset */
		outw(0xFeed, ioaddr); 				/* Pad for dest addr. */
		outw(0xF00d, ioaddr);
		outw(0xF001, ioaddr);
		outw(0x0505, ioaddr); 				/* Pad for source addr. */
		outw(0x2424, ioaddr);
		outw(0x6565, ioaddr);
		outw(0xdeaf, ioaddr);				/* Pad for protocol. */

		outw(0x0000, ioaddr);				/* Buffer: Actual count */
		outw(-1, ioaddr);					/* Buffer: Next (none). */
		outw(cur_rxbuf + 0x20, ioaddr);		/* Buffer: Address low */
		outw(0x0000, ioaddr);
		/* Finally, the number of bytes in the buffer. */
		outw(0x8000 + RX_BUF_SIZE-0x20, ioaddr);
		
		lp->rx_tail = cur_rxbuf;
		cur_rxbuf += RX_BUF_SIZE;
	} while (cur_rxbuf <= RX_BUF_END - RX_BUF_SIZE);
	
	/* Terminate the list by setting the EOL bit, and wrap the pointer to make
	   the list a ring. */
	outw(lp->rx_tail + 2, ioaddr + WRITE_PTR);
	outw(0xC000, ioaddr);					/* Command, mark as last. */
	outw(lp->rx_head, ioaddr);				/* Link */
}

static void
hardware_send_packet(struct device *dev, void *buf, short length)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	short ioaddr = dev->base_addr;
	short tx_block = lp->tx_head;

	/* Set the write pointer to the Tx block, and put out the header. */
	outw(tx_block, ioaddr + WRITE_PTR);
	outw(0x0000, ioaddr);		/* Tx status */
	outw(CMD_INTR|CmdTx, ioaddr);		/* Tx command */
	outw(tx_block+16, ioaddr);	/* Next command is a NoOp. */
	outw(tx_block+8, ioaddr);	/* Data Buffer offset. */

	/* Output the data buffer descriptor. */
	outw(length | 0x8000, ioaddr); /* Byte count parameter. */
	outw(-1, ioaddr);			/* No next data buffer. */
	outw(tx_block+22, ioaddr);	/* Buffer follows the NoOp command. */
	outw(0x0000, ioaddr);		/* Buffer address high bits (always zero). */

	/* Output the Loop-back NoOp command. */
	outw(0x0000, ioaddr);		/* Tx status */
	outw(CmdNOp, ioaddr);		/* Tx command */
	outw(tx_block+16, ioaddr);	/* Next is myself. */

	/* Output the packet using the write pointer.
	   Hmmm, it feels a little like a 3c501! */
	outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);

	/* Set the old command link pointing to this send packet. */
	outw(lp->tx_cmd_link, ioaddr + WRITE_PTR);
	outw(tx_block, ioaddr);
	lp->tx_cmd_link = tx_block + 20;

	/* Set the next free tx region. */
	lp->tx_head = tx_block + TX_BUF_SIZE;
	if (lp->tx_head > TX_BUF_END - TX_BUF_SIZE)
		lp->tx_head = TX_BUF_START;

    if (net_debug > 4) {
		printk("%s: EExp @%x send length = %d, tx_block %3x, next %3x, "
			   "reap %4x status %4.4x.\n", dev->name, ioaddr, length,
			   tx_block, lp->tx_head, lp->tx_reap, inw(ioaddr + SCB_STATUS));
    }

	if (lp->tx_head != lp->tx_reap)
		dev->tbusy = 0;
}

static void
eexp_rx(struct device *dev)
{
	struct net_local *lp = (struct net_local *)dev->priv;
	short ioaddr = dev->base_addr;
	short saved_write_ptr = inw(ioaddr + WRITE_PTR);
	short rx_head = lp->rx_head;
	short rx_tail = lp->rx_tail;
	short boguscount = 10;
	short frame_status;

	/* Set the read pointer to the Rx frame. */
	outw(rx_head, ioaddr + READ_PTR);
	while ((frame_status = inw(ioaddr)) < 0) {		/* Command complete */
		short rfd_cmd = inw(ioaddr);
		short next_rx_frame = inw(ioaddr);
		short data_buffer_addr = inw(ioaddr);
		short pkt_len;
		
		/* Set the read pointer the data buffer. */
		outw(data_buffer_addr, ioaddr + READ_PTR);
		pkt_len = inw(ioaddr);

		if (rfd_cmd != 0  ||  data_buffer_addr != rx_head + 22
			||  pkt_len & 0xC000 != 0xC000) {
			printk("%s: Rx frame at %#x corrupted, status %04x cmd %04x"
				   "next %04x data-buf @%04x %04x.\n", dev->name, rx_head,
				   frame_status, rfd_cmd, next_rx_frame, data_buffer_addr,
				   pkt_len);
		} else if ((frame_status & 0x2000) == 0) {
			/* Frame Rxed, but with error. */
			lp->stats.rx_errors++;
			if (frame_status & 0x0800) lp->stats.rx_crc_errors++;
			if (frame_status & 0x0400) lp->stats.rx_frame_errors++;
			if (frame_status & 0x0200) lp->stats.rx_fifo_errors++;
			if (frame_status & 0x0100) lp->stats.rx_over_errors++;
			if (frame_status & 0x0080) lp->stats.rx_length_errors++;
		} else {
			/* Malloc up new buffer. */
			int sksize;
			struct sk_buff *skb;

			pkt_len &= 0x3fff;
			sksize = sizeof(struct sk_buff) + pkt_len;
			skb = alloc_skb(sksize, GFP_ATOMIC);
			if (skb == NULL) {
				printk("%s: Memory squeeze, dropping packet.\n", dev->name);
				lp->stats.rx_dropped++;
				break;
			}
			skb->mem_len = sksize;
			skb->mem_addr = skb;
			skb->len = pkt_len;
			skb->dev = dev;

			outw(data_buffer_addr + 10, ioaddr + READ_PTR);

			insw(ioaddr, skb->data, (pkt_len + 1) >> 1);
		
#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++;
		}

		/* Clear the status word and set End-of-List on the rx frame. */
		outw(rx_head, ioaddr + WRITE_PTR);
		outw(0x0000, ioaddr);
		outw(0xC000, ioaddr);
#ifndef final_version
		if (next_rx_frame != rx_head + RX_BUF_SIZE
			&& next_rx_frame != RX_BUF_START) {
			printk("%s: Rx next frame at %#x is %#x instead of %#x.\n", dev->name,
				   rx_head, next_rx_frame, rx_head + RX_BUF_SIZE);
			next_rx_frame = rx_head + RX_BUF_SIZE;
			if (next_rx_frame >= RX_BUF_END - RX_BUF_SIZE)
				next_rx_frame = RX_BUF_START;
		}
#endif
		outw(rx_tail+2, ioaddr + WRITE_PTR);
		outw(0x0000, ioaddr);	/* Clear the end-of-list on the prev. RFD. */

#ifndef final_version
		outw(rx_tail+4, ioaddr + READ_PTR);
		if (inw(ioaddr) != rx_head) {
			printk("%s: Rx buf link mismatch, at %04x link %04x instead of %04x.\n",
				   dev->name, rx_tail, (outw(rx_tail+4, ioaddr + READ_PTR),inw(ioaddr)),
				   rx_head);
			outw(rx_head, ioaddr);
		}
#endif

		rx_tail = rx_head;
		rx_head = next_rx_frame;
		if (--boguscount == 0)
			break;
		outw(rx_head, ioaddr + READ_PTR);
	}
	
	lp->rx_head = rx_head;
	lp->rx_tail = rx_tail;
	
	/* Restore the original write pointer. */
	outw(saved_write_ptr, ioaddr + WRITE_PTR);
}

/*
 * Local variables:
 *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -I/usr/src/linux/drivers/net -Wall -Wstrict-prototypes -O6 -m486 -c eexpress.c"
 *  version-control: t
 *  kept-new-versions: 5
 *  tab-width: 4
 * End:
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区黑丝| 亚洲免费av高清| 国产亚洲精品7777| 亚洲国产精品综合小说图片区| 婷婷久久综合九色国产成人 | 免费的国产精品| av中文字幕在线不卡| 精品久久久久一区| 亚洲午夜久久久| 97久久超碰国产精品电影| 精品国产3级a| 日本不卡视频一二三区| 欧美日本韩国一区二区三区视频| 亚洲免费观看高清| 成人精品一区二区三区四区| 精品欧美黑人一区二区三区| 日本aⅴ亚洲精品中文乱码| 欧美中文字幕亚洲一区二区va在线| 国产精品久久毛片av大全日韩| 国产乱人伦精品一区二区在线观看 | 国产一区二区不卡在线| 欧美精品在线一区二区三区| 日韩美女啊v在线免费观看| 久久精品国产一区二区三| 91精品欧美久久久久久动漫| 亚洲mv大片欧洲mv大片精品| 欧美亚洲一区二区三区四区| 亚洲男人的天堂在线观看| 91在线无精精品入口| 自拍视频在线观看一区二区| 91在线视频播放| 一区二区三区日韩在线观看| 欧美唯美清纯偷拍| 日韩福利视频导航| 日韩欧美国产麻豆| 国产精品资源网站| 国产女人18水真多18精品一级做| 国产成人日日夜夜| 亚洲三级在线观看| 欧美性生活影院| 日韩精品国产欧美| 欧美电视剧在线观看完整版| 国产真实乱子伦精品视频| 久久久精品欧美丰满| 成人97人人超碰人人99| 国产精品久久久久久户外露出 | 精品一区二区免费看| 久久综合久色欧美综合狠狠| 国产麻豆精品一区二区| 国产精品国产a级| 色噜噜狠狠成人网p站| 亚洲国产成人av网| 精品久久国产老人久久综合| 国产成人在线色| 亚洲欧美日韩国产成人精品影院| 欧美中文字幕亚洲一区二区va在线| 亚洲国产精品久久人人爱蜜臀| 日韩精品中文字幕在线一区| 国产91丝袜在线播放九色| 亚洲欧美另类小说| 日韩美女天天操| 91色九色蝌蚪| 美女一区二区久久| 国产精品乱人伦一区二区| 日本黄色一区二区| 久久精品国产在热久久| 亚洲免费电影在线| 精品国产乱码久久久久久久久| 99久久精品国产网站| 亚洲成在线观看| 中文文精品字幕一区二区| 欧美日韩五月天| 粉嫩绯色av一区二区在线观看| 午夜av一区二区| 中文字幕巨乱亚洲| 日韩欧美中文一区二区| 91蜜桃免费观看视频| 国产在线观看一区二区| 亚洲成人一区二区在线观看| 亚洲国产精品黑人久久久| 欧美高清性hdvideosex| 99久久婷婷国产| 另类的小说在线视频另类成人小视频在线| 亚洲国产精品黑人久久久| 日韩一级大片在线| 日本精品免费观看高清观看| 成人在线视频一区二区| 美女视频免费一区| 亚洲成人黄色小说| 亚洲卡通动漫在线| 亚洲国产电影在线观看| 久久婷婷综合激情| 欧美一区二区大片| 欧美日韩一区二区三区四区 | 精品一区二区三区蜜桃| 亚洲国产成人精品视频| 一区二区成人在线| 日韩理论片网站| 国产免费观看久久| 精品福利一区二区三区免费视频| 97se亚洲国产综合在线| 欧美精品丝袜中出| 懂色av一区二区三区免费观看| 亚洲欧洲日韩av| 欧美在线视频你懂得| 亚洲欧美在线高清| 欧美日韩一区中文字幕| 日韩精品久久理论片| 久久―日本道色综合久久| 欧美亚洲国产bt| 久久精品人人爽人人爽| 亚洲永久精品国产| 国产精品传媒入口麻豆| 国产无人区一区二区三区| 久久久久国产成人精品亚洲午夜| 欧美成人一区二区三区片免费| 91精品国产91久久久久久最新毛片| 欧美亚洲高清一区二区三区不卡| 欧美羞羞免费网站| 欧美久久免费观看| 欧美一区二区久久| 久久婷婷一区二区三区| 日本一区二区动态图| 亚洲色图制服丝袜| 亚洲制服丝袜av| 日韩影院在线观看| 久久精品噜噜噜成人av农村| 国产乱国产乱300精品| 国产乱码精品一区二区三| av男人天堂一区| 色爱区综合激月婷婷| 欧美视频一区二| 欧美变态口味重另类| 国产午夜精品理论片a级大结局| 国产欧美日韩一区二区三区在线观看| 国产日韩综合av| 亚洲精品免费播放| 国产98色在线|日韩| 91精品国产综合久久蜜臀| 99久久99精品久久久久久| 日本亚洲免费观看| 捆绑变态av一区二区三区| 韩国av一区二区三区四区| caoporn国产一区二区| 在线精品亚洲一区二区不卡| 日韩欧美一级精品久久| 欧美国产一区二区在线观看| 国产精品久久久久久久裸模| 亚洲精品成a人| 日本sm残虐另类| 99热99精品| 日韩一二三区不卡| 国产精品久久看| 欧美aaaaa成人免费观看视频| 国产成人在线看| 欧美久久一二三四区| 国产日韩欧美精品在线| 视频一区视频二区中文| 国产成人亚洲精品狼色在线| 欧美日韩国产高清一区二区| 欧美精彩视频一区二区三区| 日韩av高清在线观看| 97久久久精品综合88久久| 欧美一级在线视频| 亚洲精品国产无天堂网2021| 久久99国产精品免费| 在线看日韩精品电影| 国产亚洲短视频| 日韩电影一区二区三区| 欧美综合一区二区三区| 中文字幕精品一区二区精品绿巨人| 性久久久久久久久久久久| jizzjizzjizz欧美| 久久婷婷综合激情| 奇米影视7777精品一区二区| 91片在线免费观看| 国产精品日产欧美久久久久| 蜜臀va亚洲va欧美va天堂 | 日韩欧美国产系列| 亚洲电影在线播放| 91丨porny丨国产入口| 欧美高清一级片在线观看| 国产一区二区三区美女| 欧美一区二区播放| 日本欧美韩国一区三区| 欧美亚洲国产一卡| 一区二区三区在线不卡| 99久久伊人精品| 中文字幕一区二区三区精华液| 国产乱子伦视频一区二区三区| 欧美大片日本大片免费观看| 午夜精品免费在线| 欧美日韩一本到| 亚洲一二三四久久| 欧美午夜寂寞影院| 午夜成人在线视频| 日韩一区二区中文字幕| 美女在线一区二区| 26uuu另类欧美| 国产成人av一区|