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

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

?? 3c503.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
字號:
/* 3c503.c: A shared-memory NS8390 ethernet driver for linux. */
/*
    Written 1992,1993 by Donald Becker.

    Copyright 1993 United States Government as represented by the
    Director, National Security Agency.  This software may be used and
    distributed according to the terms of the GNU Public License,
    incorporated herein by reference.

    This driver should work with the 3c503 and 3c503/16.  It should be used
    in shared memory mode for best performance, although it may also work
    in programmed-I/O mode.

    The Author may be reached as becker@super.org or
    C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
*/

static char *version =
    "3c503.c:v0.99.15k 3/3/93 Donald Becker (becker@super.org)\n";

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <asm/io.h>
#include <asm/system.h>

#include "dev.h"

#include "8390.h"
#include "3c503.h"

int el2_probe(struct device *dev);
int el2_pio_autoprobe(struct device *dev);
int el2probe1(int ioaddr, struct device *dev);

static int el2_open(struct device *dev);
static int el2_close(struct device *dev);
static void el2_reset_8390(struct device *dev);
static void el2_init_card(struct device *dev);
static void el2_block_output(struct device *dev, int count,
			     const unsigned char *buf, const start_page);
static int el2_block_input(struct device *dev, int count, char *buf,
			   int ring_offset);


/* This routine probes for a memory-mapped 3c503 board by looking for
   the "location register" at the end of the jumpered boot PROM space.
   This works even if a PROM isn't there.

   If the ethercard isn't found there is an optional probe for
   ethercard jumpered to programmed-I/O mode.
   */

static int ports[] = {0x300,0x310,0x330,0x350,0x250,0x280,0x2a0,0x2e0,0};

int
el2_probe(struct device *dev)
{
    int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0};
    short ioaddr = dev->base_addr;

    if (ioaddr < 0)
	return ENXIO;		/* Don't probe at all. */
    if (ioaddr > 0)
	return ! el2probe1(ioaddr, dev);

    for (addr = addrs; *addr; addr++) {
	int i;
	unsigned int base_bits = *(unsigned char *)*addr;
	/* Find first set bit. */
	for(i = 7; i >= 0; i--, base_bits >>= 1)
	    if (base_bits & 0x1)
		break;
	if (base_bits != 1)
	    continue;
#ifdef HAVE_PORTRESERVE
	if (check_region(ports[i], 16))
	    continue;
#endif
	if (el2probe1(ports[i], dev))
	    return 0;
    }
#ifndef no_probe_nonshared_memory
    return el2_pio_autoprobe(dev);
#else
    return ENODEV;
#endif
}

/*  Try all of the locations that aren't obviously empty.  This touches
    a lot of locations, and is much riskier than the code above. */
int
el2_pio_autoprobe(struct device *dev)
{
    int i;
    for (i = 0; i < 8; i++) {
#ifdef HAVE_PORTRESERVE
	if (check_region(ports[i], 16))
	    continue;
#endif
	/* Reset and/or avoid any lurking NE2000 */
	if (inb_p(ports[i] + 0x408) == 0xff)
	    continue;
	if (inb(ports[i] + 0x403) == (0x80 >> i) /* Preliminary check */
	    && el2probe1(ports[i], dev))
	    return 0;
    }
    return ENODEV;
}

/* Probe for the Etherlink II card at I/O port base IOADDR,
   returning non-zero on sucess.  If found, set the station
   address and memory parameters in DEVICE. */
int
el2probe1(int ioaddr, struct device *dev)
{
    int i, iobase_reg, membase_reg, saved_406;
    unsigned char *station_addr = dev->dev_addr;

    /* We verify that it's a 3C503 board by checking the first three octets
       of its ethernet address. */
    printk("3c503 probe at %#3x:", ioaddr);
    iobase_reg = inb(ioaddr+0x403);
    membase_reg = inb(ioaddr+0x404);
    /* Verify ASIC register that should be 0 or have a single bit set. */
    if (   (iobase_reg  & (iobase_reg - 1))
	|| (membase_reg & (membase_reg - 1))) {
	printk("  not found.\n");
	return 0;
    }
    saved_406 = inb_p(ioaddr + 0x406);
    outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
    outb_p(ECNTRL_THIN, ioaddr + 0x406);
    /* Map the station addr PROM into the lower I/O ports. */
    outb(ECNTRL_SAPROM|ECNTRL_THIN, ioaddr + 0x406);
    for (i = 0; i < ETHER_ADDR_LEN; i++) {
	printk(" %2.2X", (station_addr[i] = inb(ioaddr + i)));
    }
    if ( station_addr[0] != 0x02
	|| station_addr[1] != 0x60
	|| station_addr[2] != 0x8c) {
	printk("  3C503 not found.\n");
	/* Restore the register we frobbed. */
	outb(saved_406, ioaddr + 0x406);
	return 0;
    }

#ifdef HAVE_PORTRESERVE
    snarf_region(ioaddr, 16);
#endif
    ethdev_init(dev);

    /* Map the 8390 back into the window. */
    outb(ECNTRL_THIN, ioaddr + 0x406);
    dev->base_addr = ioaddr;
    /* Probe for, turn on and clear the board's shared memory. */
    if (ei_debug > 2) printk(" memory jumpers %2.2x ", membase_reg);
    outb(EGACFR_NORM, ioaddr + 0x405);	/* Enable RAM */

    /* This should be probed for (or set via an ioctl()) at run-time.
       Right now we use a sleazy hack to pass in the interface number
       at boot-time via the low bits of the mem_end field.  That value is
       unused, and the low bits would be discarded even if it was used. */
#if defined(EI8390_THICK) || defined(EL2_AUI)
    ei_status.interface_num = 1;
#else
    ei_status.interface_num = dev->mem_end & 0xf;
#endif

    if ((membase_reg & 0xf0) == 0) {
	dev->mem_start = 0;
    } else {
	dev->mem_start = ((membase_reg & 0xc0) ? 0xD8000 : 0xC8000) +
	    ((membase_reg & 0xA0) ? 0x4000 : 0);

#define EL2_MEMSIZE (EL2SM_STOP_PG - EL2SM_START_PG)*256
#ifdef EL2MEMTEST
	/* This has never found an error, but someone might care. */
	{			/* Check the card's memory. */
	    int *mem_base = (int *)dev->mem_start;
	    int memtest_value = 0xbbadf00d;
	    mem_base[0] = 0xba5eba5e;
	    for (i = 1; i < EL2_MEMSIZE/sizeof(mem_base[0]); i++) {
		mem_base[i] = memtest_value;
		if (mem_base[0] != 0xba5eba5e
		    || mem_base[i] != memtest_value) {
		    printk(" memory failure or memory address conflict.\n");
		    dev->mem_start = 0;
		    break;
		}
		memtest_value += 0x55555555;
		mem_base[i] = 0;
	    }
	}
#endif  /* EL2MEMTEST */
	/* Divide the on-board memory into a single maximum-sized transmit
	   (double-sized for ping-pong transmit) buffer at the base, and
	   use the rest as a receive ring. */
	dev->mem_end = dev->rmem_end = dev->mem_start + EL2_MEMSIZE;
	dev->rmem_start = TX_PAGES*256 + dev->mem_start;
    }

    /* Finish setting the board's parameters. */
    ei_status.name = "3C503";
    ei_status.tx_start_page = EL2SM_START_PG;
    ei_status.rx_start_page = EL2SM_START_PG + TX_PAGES;
    ei_status.stop_page = EL2SM_STOP_PG;
    ei_status.reset_8390 = &el2_reset_8390;
    ei_status.block_input = &el2_block_input;
    ei_status.block_output = &el2_block_output;

    if (dev->irq == 2)
	dev->irq = 9;
    else if (dev->irq > 5 && dev->irq != 9) {
	printk("\n3c503: configured interrupt %d invalid, using autoIRQ.\n",
	       dev->irq);
	dev->irq = 0;
    }

    ei_status.saved_irq = dev->irq;

    dev->start = 0;
    dev->open = &el2_open;
    dev->stop = &el2_close;

    if (dev->mem_start)
	printk("\n%s: %s with shared memory at %#6lx-%#6lx,\n",
	       dev->name, ei_status.name, dev->mem_start, dev->mem_end-1);
    else
	printk("\n%s: %s using programmed I/O (REJUMPER for SHARED MEMORY).\n",
	       dev->name, ei_status.name);
    if (ei_debug > 1)
	printk(version);

    return ioaddr;
}

static int
el2_open(struct device *dev)
{

    if (dev->irq < 2) {
	int irqlist[] = {5, 9, 3, 4, 0};
	int *irqp = irqlist;

	outb(EGACFR_NORM, E33G_GACFR);	/* Enable RAM and interrupts. */
	do {
	    if (request_irq (*irqp, NULL) != -EBUSY) {
		/* Twinkle the interrupt, and check if it's seen. */
		autoirq_setup(0);
		outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
		outb_p(0x00, E33G_IDCFR);
		if (*irqp == autoirq_report(0)	 /* It's a good IRQ line! */
		    && request_irq (dev->irq = *irqp, &ei_interrupt) == 0)
		    break;
	    }
	} while (*++irqp);
	if (*irqp == 0) {
	    outb(EGACFR_IRQOFF, E33G_GACFR);	/* disable interrupts. */
	    return -EAGAIN;
	}
    } else {
	if (request_irq(dev->irq, &ei_interrupt)) {
	    return -EAGAIN;
	}
    }
    el2_init_card(dev);
    return ei_open(dev);
}

static int
el2_close(struct device *dev)
{
    free_irq(dev->irq);
    dev->irq = ei_status.saved_irq;
    irq2dev_map[dev->irq] = NULL;
    outb(EGACFR_IRQOFF, E33G_GACFR);	/* disable interrupts. */

    NS8390_init(dev, 0);

    return 0;
}

/* This is called whenever we have a unrecoverable failure:
       transmit timeout
       Bad ring buffer packet header
 */
static void
el2_reset_8390(struct device *dev)
{
    if (ei_debug > 1) {
	printk("%s: Resetting the 3c503 board...", dev->name);
	printk("%#x=%#02x %#x=%#02x %#x=%#02x...", E33G_IDCFR, inb(E33G_IDCFR),
	       E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR));
    }
    outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL);
    ei_status.txing = 0;
    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
    el2_init_card(dev);
    if (ei_debug > 1) printk("done\n");
}

/* Initialize the 3c503 GA registers after a reset. */
static void
el2_init_card(struct device *dev)
{
    /* Unmap the station PROM and select the DIX or BNC connector. */
    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);

    /* Set ASIC copy of rx's first and last+1 buffer pages */
    /* These must be the same as in the 8390. */
    outb(ei_status.rx_start_page, E33G_STARTPG);
    outb(ei_status.stop_page,  E33G_STOPPG);

    /* Point the vector pointer registers somewhere ?harmless?. */
    outb(0xff, E33G_VP2);	/* Point at the ROM restart location 0xffff0 */
    outb(0xff, E33G_VP1);
    outb(0x00, E33G_VP0);
    /* Turn off all interrupts until we're opened. */
    outb_p(0x00,  dev->base_addr + EN0_IMR);
    /* Enable IRQs iff started. */
    outb(EGACFR_NORM, E33G_GACFR);

    /* Set the interrupt line. */
    outb_p((0x04 << (dev->irq == 9 ? 2 : dev->irq)), E33G_IDCFR);
    outb_p(8, E33G_DRQCNT);		/* Set burst size to 8 */
    outb_p(0x20, E33G_DMAAH);	/* Put a valid addr in the GA DMA */
    outb_p(0x00, E33G_DMAAL);
    return;			/* We always succeed */
}

/* Either use the shared memory (if enabled on the board) or put the packet
   out through the ASIC FIFO.  The latter is probably much slower. */
static void
el2_block_output(struct device *dev, int count,
		 const unsigned char *buf, const start_page)
{
    int i;				/* Buffer index */
    int boguscount = 0;		/* timeout counter */

    /* This should really be set with during an open(). */
    outb(EGACFR_NORM, E33G_GACFR);	/* Enable RAM and interrupts. */

    if (dev->mem_start) {	/* Shared memory transfer */
	void *dest_addr = (void *)(dev->mem_start +
	    ((start_page - ei_status.tx_start_page) << 8));
	memcpy(dest_addr, buf, count);
	if (ei_debug > 2  &&  memcmp(dest_addr, buf, count))
	    printk("%s: 3c503 send_packet() bad memory copy @ %#5x.\n",
		   dev->name, (int) dest_addr);
	return;
    }
    /* No shared memory, put the packet out the slow way. */
    /* Set up then start the internal memory transfer to Tx Start Page */
    outb(0x00, E33G_DMAAL);
    outb_p(start_page, E33G_DMAAH);
    outb_p((ei_status.interface_num ? ECNTRL_AUI : ECNTRL_THIN ) | ECNTRL_OUTPUT
	   | ECNTRL_START, E33G_CNTRL);

    /* This is the byte copy loop: it should probably be tuned for
       for speed once everything is working.  I think it is possible
       to output 8 bytes between each check of the status bit. */
    for(i = 0; i < count; i++) {
	if (i % 8 == 0)
	    while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
		if (++boguscount > (i<<3) + 32) {
		    printk("%s: FIFO blocked in el2_block_output (at %d of %d, bc=%d).\n",
			   dev->name, i, count, boguscount);
		    return;
		}
	outb(buf[i], E33G_FIFOH);
    }
    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
    return;
}

/* Returns the new ring pointer. */
static int
el2_block_input(struct device *dev, int count, char *buf, int ring_offset)
{
    int boguscount = 0;
    int end_of_ring = dev->rmem_end;
    unsigned int i;

    /* Maybe enable shared memory just be to be safe... nahh.*/
    if (dev->mem_start) {	/* Use the shared memory. */
	ring_offset -= (EL2SM_START_PG<<8);
	if (dev->mem_start + ring_offset + count > end_of_ring) {
	    /* We must wrap the input move. */
	    int semi_count = end_of_ring - (dev->mem_start + ring_offset);
	    memcpy(buf, (char *)dev->mem_start + ring_offset, semi_count);
	    count -= semi_count;
	    memcpy(buf + semi_count, (char *)dev->rmem_start, count);
	    return dev->rmem_start + count;
	}
	memcpy(buf, (char *)dev->mem_start + ring_offset, count);
	return ring_offset + count;
    }
    /* No shared memory, use programmed I/O. */
    outb(ring_offset & 0xff, E33G_DMAAL);
    outb_p((ring_offset >> 8) & 0xff, E33G_DMAAH);
    outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
	   | ECNTRL_START, E33G_CNTRL);

    /* This is the byte copy loop: it should probably be tuned for
       for speed once everything is working. */
    for(i = 0; i < count; i++) {
	if (i % 8 == 0)
	    while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
		if (++boguscount > (i<<3) + 32) {
		    printk("%s: FIFO blocked in el2_block_input() (at %d of %d, bc=%d).\n",
			   dev->name, i, count, boguscount);
		    boguscount = 0;
		    break;
		}
	buf[i] = inb_p(E33G_FIFOH);
    }
    outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
    return 0;
}

/*
 * Local variables:
 *  version-control: t
 *  kept-new-versions: 5
 * End:
 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产久精国产爱| 日韩伦理电影网| 国产精品免费视频观看| 亚洲裸体在线观看| 婷婷国产在线综合| 国产精品影视在线观看| 91麻豆国产在线观看| 欧美日韩综合一区| 久久天堂av综合合色蜜桃网| 国产精品久久久久影院色老大| 亚洲午夜羞羞片| 国产麻豆视频精品| 欧美亚一区二区| www一区二区| 亚洲国产综合色| 国产激情精品久久久第一区二区| 91国模大尺度私拍在线视频| 日韩欧美国产精品| 亚洲同性gay激情无套| 日韩成人av影视| 99re视频精品| 久久嫩草精品久久久久| 一区二区三区四区高清精品免费观看 | 国产精品久久久久婷婷| 亚洲成a人片综合在线| 国产成人8x视频一区二区 | 日韩高清在线不卡| 成人午夜私人影院| 欧美一区二区三级| 亚洲日本中文字幕区| 久久99精品久久久久久动态图| 91啪在线观看| 国产亚洲一二三区| 99re8在线精品视频免费播放| 欧美精品色综合| 国产精品国产三级国产专播品爱网| 婷婷开心激情综合| 91网站视频在线观看| 精品国产乱子伦一区| 亚洲狠狠爱一区二区三区| 成人午夜av电影| 精品国产91乱码一区二区三区| 一片黄亚洲嫩模| 粉嫩一区二区三区性色av| 欧美第一区第二区| 偷拍亚洲欧洲综合| 在线观看亚洲精品| 国产精品久久精品日日| 麻豆一区二区三| 欧美日韩国产小视频在线观看| 国产精品久久久久久久久免费樱桃 | 9色porny自拍视频一区二区| 日韩美女天天操| 日精品一区二区三区| 色婷婷av一区二区三区大白胸| 欧美国产一区在线| 国产在线不卡视频| 欧美不卡一区二区三区| 天天操天天干天天综合网| 色成年激情久久综合| 《视频一区视频二区| 懂色av噜噜一区二区三区av| 精品国产人成亚洲区| 青椒成人免费视频| 欧美一区二区三级| 麻豆视频一区二区| 日韩一区二区三区在线观看| 五月天丁香久久| 欧美日韩精品福利| 偷拍一区二区三区四区| 欧美精品丝袜中出| 舔着乳尖日韩一区| 欧美日韩国产色站一区二区三区| 一区二区三区欧美在线观看| 色综合天天天天做夜夜夜夜做| 国产精品短视频| 99麻豆久久久国产精品免费优播| 国产精品免费视频一区| 99热国产精品| 亚洲精品国产无天堂网2021| 91在线国产观看| 亚洲激情男女视频| 欧美日韩一区三区| 五月综合激情网| 日韩网站在线看片你懂的| 免费人成精品欧美精品| 精品国产亚洲一区二区三区在线观看| 美女一区二区三区在线观看| 久久只精品国产| 国产精品99久久久| 国产精品久久久久久久久果冻传媒| av在线免费不卡| 一区二区视频免费在线观看| 欧美日韩国产区一| 精品一区二区三区免费视频| 久久精品亚洲国产奇米99| 成人激情图片网| 一区二区三区不卡视频| 欧美日韩国产成人在线免费| 麻豆成人在线观看| 久久久www成人免费无遮挡大片| 成人精品免费看| 亚洲另类在线一区| 欧美一二三区在线观看| 高清不卡一区二区在线| 亚洲免费色视频| 91精品国产综合久久蜜臀 | 久久亚区不卡日本| 99久久99久久久精品齐齐| 性感美女久久精品| 26uuu亚洲综合色| 91女人视频在线观看| 天天av天天翘天天综合网| 欧美精品一区二区在线播放| 97久久精品人人做人人爽| 亚洲成av人片观看| 久久精品亚洲乱码伦伦中文| 在线观看一区二区视频| 另类小说视频一区二区| 亚洲欧洲无码一区二区三区| 欧美电影一区二区三区| 国产99精品国产| 亚洲国产成人91porn| 国产日韩v精品一区二区| 欧美乱熟臀69xxxxxx| 国产成人免费在线视频| 亚洲国产aⅴ成人精品无吗| 国产日韩精品一区二区三区| 欧美日韩中文精品| 丁香婷婷深情五月亚洲| 性欧美疯狂xxxxbbbb| 国产精品入口麻豆九色| 欧美一区二区三区四区久久| 成人免费视频app| 亚洲123区在线观看| 中文字幕久久午夜不卡| 欧美一区二区三区啪啪| 91丨九色丨尤物| 黄色日韩网站视频| 亚洲一区二区免费视频| 久久精品人人做人人综合 | 蜜桃一区二区三区在线观看| 国产精品国产自产拍高清av王其| 欧美一二三四区在线| 色88888久久久久久影院按摩| 激情偷乱视频一区二区三区| 夜色激情一区二区| 国产精品白丝在线| 久久久亚洲精品石原莉奈| 69久久夜色精品国产69蝌蚪网 | 亚洲成av人影院在线观看网| 国产精品国产精品国产专区不蜜| 欧美mv日韩mv国产| 91精品一区二区三区久久久久久| 色综合久久久久综合99| 国产超碰在线一区| 紧缚捆绑精品一区二区| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品综合在线视频| 视频一区二区中文字幕| 一区二区三区丝袜| 中文字幕一区二| 欧美国产乱子伦| 精品国产一区二区三区不卡| 日韩视频一区二区三区在线播放| 欧美在线观看视频一区二区三区| av一区二区三区四区| 成人一级黄色片| 国产又黄又大久久| 久久99精品久久久久久久久久久久| 偷拍自拍另类欧美| 五月婷婷综合网| 日韩电影在线一区二区三区| 午夜久久久久久久久| 一区二区三区欧美日韩| 一区二区三区四区激情 | 欧美精品自拍偷拍| 欧美在线不卡视频| 欧美在线你懂的| 欧美色欧美亚洲另类二区| 欧美在线视频不卡| 欧美人妖巨大在线| 欧美日韩1234| 欧美狂野另类xxxxoooo| 欧美日韩激情一区| 91麻豆精品国产91久久久久久久久| 欧美日韩精品福利| 欧美精品日日鲁夜夜添| 88在线观看91蜜桃国自产| 欧美福利视频一区| 日韩欧美一级特黄在线播放| 日韩欧美激情四射| 精品国产污污免费网站入口 | 99久久综合国产精品| 91小视频免费观看| 欧美亚洲一区三区| 欧美理论在线播放| 精品99久久久久久| 国产精品美女久久久久aⅴ| 亚洲欧洲99久久|