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

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

?? plip.c

?? linux 1.0 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Plip.c: A parallel port "network" driver for linux. *//*    Written 1993 by Donald Becker and TANABE Hiroyasu.    This code is distributed under the GPL.        The current author is reached as hiro@sanpo.t.u-tokyo.ac.jp .    For more information do 'whois -h whois.nic.ad.jp HT043JP'    The original author may be reached as becker@super.org or    C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715    This is parallel port packet pusher.  It's actually more general    than the "IP" in its name suggests -- but 'plip' is just such a    great name!    This driver was first developed by D. Becker, when he was inspired by    Russ Nelson's parallel port packet driver.  He also did the update    to 0.99.10.    It was further developed by Tommy Thorn (tthorn@daimi.aau.dk).    Recent versions were debugged and maintained by TANABE Hiroyasu.    Updated for 0.99pl12 by Donald Becker.        Changes even more Alan Cox <iiitac@pyr.swan.ac.uk>    Fixed: sets skb->arp=1, always claims success like ethernet, doesn't    free skb and then claim fail. Incorrect brackets causing reset problem    Attempting to make it work (works for me - email me if it does work)        Bugs:    	Should be timer oriented state machine.     	Should never use jiffies for timeouts.    	Protocol is buggy when broadcasts occur (Must ask Russ Nelson)    	Can hang forever on collisions (tough - you fix it!).    	I get 15K/second NFS throughput (about 20-25K second IP).    	Change the protocol back.    	*/static char *version =    "Net2Debugged PLIP 1.01 (from plip.c:v0.15 for 0.99pl12+, 8/11/93)\n";#include <linux/config.h>/*  Sources:	Ideas and protocols came from Russ Nelson's (nelson@crynwr.com)	"parallel.asm" parallel port packet driver.	TANABE Hiroyasu changes the protocol.  The "Crynwr" parallel port standard specifies the following protocol:   send header nibble '8'   type octet '0xfd' or '0xfc'   count-low octet   count-high octet   ... data octets   checksum octetEach octet is sent as <wait for rx. '0x1?'> <send 0x10+(octet&0x0F)>			<wait for rx. '0x0?'> <send 0x00+((octet>>4)&0x0F)>The cable used is a de facto standard parallel null cable -- sold asa "LapLink" cable by various places.  You'll need a 10-conductor cable tomake one yourself.  The wiring is:    INIT	16 - 16		SLCTIN	17 - 17    GROUND	25 - 25    D0->ERROR	2 - 15		15 - 2    D1->SLCT	3 - 13		13 - 3    D2->PAPOUT	4 - 12		12 - 4    D3->ACK	5 - 10		10 - 5    D4->BUSY	6 - 11		11 - 6  Do not connect the other pins.  They are    D5,D6,D7 are 7,8,9    STROBE is 1, FEED is 14    extra grounds are 18,19,20,21,22,23,24*/#include <linux/kernel.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/interrupt.h>#include <linux/string.h>#include <linux/ptrace.h>#include <linux/if_ether.h>#include <asm/system.h>#include <asm/io.h>#include <netinet/in.h>#include <errno.h>#include "dev.h"#include "eth.h"#include "ip.h"#include "protocol.h"#include "tcp.h"#include "skbuff.h"#include "sock.h"#include "arp.h"#ifdef PRINTK#undef PRINTK#endif#ifdef PRINTK2#undef PRINTK2#endif#define PLIP_DEBUG	/* debugging */#undef  PLIP_DEBUG2	/* debugging with more varbose report */#ifdef PLIP_DEBUG#define PRINTK(x) printk x#else#define PRINTK(x) /**/#endif#ifdef PLIP_DEBUG2#define PRINTK2(x) printk x#else#define PRINTK2(x) /**/#endif/* The map from IRQ number (as passed to the interrupt handler) to   'struct device'. */extern struct device *irq2dev_map[16];/* Network statistics, with the same names as 'struct enet_statistics'. */#define netstats enet_statistics/* constants */#define PAR_DATA	0#define PAR_STATUS	1#define PAR_CONTROL	2#define PLIP_MTU 1600#define PLIP_HEADER_TYPE1 0xfd#define PLIP_HEADER_TYPE2 0xfc/* Index to functions, as function prototypes. */extern int plip_probe(int ioaddr, struct device *dev);static int plip_open(struct device *dev);static int plip_close(struct device *dev);static int plip_tx_packet(struct sk_buff *skb, struct device *dev);static int plip_header (unsigned char *buff, struct device *dev,		 unsigned short type, unsigned long h_dest,		 unsigned long h_source, unsigned len);/* variables used internally. */#define INITIALTIMEOUTFACTOR 4#define MAXTIMEOUTFACTOR 20static int timeoutfactor = INITIALTIMEOUTFACTOR;/* Routines used internally. */static void plip_device_clear(struct device *dev);static void plip_receiver_error(struct device *dev);static void plip_set_physicaladdr(struct device *dev, unsigned long ipaddr);static int plip_addrcmp(struct ethhdr *eth);static int plip_send_enethdr(struct device *dev, struct ethhdr *eth);static int plip_rebuild_enethdr(struct device *dev, struct ethhdr *eth,				unsigned char h_dest, unsigned char h_source,				unsigned short type);static void cold_sleep(int tics);static void plip_interrupt(int reg_ptr); /* Dispatch from interrupts. */static int plip_receive_packet(struct device *dev);static int plip_send_packet(struct device *dev, unsigned char *buf, int length);static int plip_send_start(struct device *dev, struct ethhdr *eth);static void double_timeoutfactor(void);static struct enet_statistics *plip_get_stats(struct device *dev);intplip_init(struct device *dev){    int port_base = dev->base_addr;    int i;    /* Check that there is something at base_addr. */    outb(0x00, port_base + PAR_CONTROL);    outb(0x55, port_base + PAR_DATA);    if (inb(port_base + PAR_DATA) != 0x55)	return -ENODEV;    /* Alpha testers must have the version number to report bugs. */#ifdef PLIP_DEBUG    {	static int version_shown = 0;	if (! version_shown)	    printk(version), version_shown++;    }#endif    /* Initialize the device structure. */    dev->priv = kmalloc(sizeof(struct netstats), GFP_KERNEL);    memset(dev->priv, 0, sizeof(struct netstats));    for (i = 0; i < DEV_NUMBUFFS; i++)	dev->buffs[i] = NULL;    dev->hard_header = &plip_header;    dev->add_arp = eth_add_arp;    dev->queue_xmit = dev_queue_xmit;    dev->rebuild_header = eth_rebuild_header;    dev->type_trans = eth_type_trans;    dev->open = &plip_open;    dev->stop = &plip_close;    dev->hard_start_xmit = &plip_tx_packet;    dev->get_stats = &plip_get_stats;    /* These are ethernet specific. */    dev->type = ARPHRD_ETHER;    dev->hard_header_len = ETH_HLEN;    dev->mtu = PLIP_MTU;	/* PLIP may later negotiate max pkt size */    dev->addr_len = ETH_ALEN;    for (i = 0; i < dev->addr_len; i++) {	dev->broadcast[i]=0xff;	dev->dev_addr[i] = 0;    }    printk("%s: configured for parallel port at %#3x, IRQ %d.\n",	   dev->name, dev->base_addr, dev->irq);    /* initialize internal value */    timeoutfactor = INITIALTIMEOUTFACTOR;    return 0;}/* Open/initialize the board.  This is called (in the current kernel)   sometime after booting when the 'config <dev->name>' program is   run.   This routine gets exclusive access to the parallel port by allocating   its IRQ line.   */static intplip_open(struct device *dev){    if (dev->irq == 0)	dev->irq = 7;    cli();    if (request_irq(dev->irq , &plip_interrupt) != 0) {    	sti();	PRINTK(("%s: couldn't get IRQ %d.\n", dev->name, dev->irq));	return -EAGAIN;    }    irq2dev_map[dev->irq] = dev;    sti();    plip_device_clear(dev);    dev->tbusy = 0;    dev->interrupt = 0;    dev->start = 1;    return 0;}/* The inverse routine to plip_open(). */static intplip_close(struct device *dev){    dev->tbusy = 1;    dev->start = 0;    cli();    free_irq(dev->irq);    irq2dev_map[dev->irq] = NULL;    sti();    outb(0x00, dev->base_addr);		/* Release the interrupt. */    return 0;}static intplip_tx_packet(struct sk_buff *skb, struct device *dev){    int ret_val;    if (dev->tbusy || dev->interrupt) {	/* Do timeouts, to avoid hangs. */	int tickssofar = jiffies - dev->trans_start;	if (tickssofar < 50)	    return 1;	printk("%s: transmit timed out\n", dev->name);	/* Try to restart the adaptor. */	plip_device_clear(dev);	return 0;    }    /* 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;    }    /* Pretend we are an ethernet and fill in the header.  This could use       a simplified routine someday. */    if (!skb->arp  &&  dev->rebuild_header(skb->data, dev)) {	skb->dev = dev;	arp_queue (skb);	return 0;    }    skb->arp=1;    dev->trans_start = jiffies;    ret_val = plip_send_packet(dev, skb->data, skb->len);    if (skb->free)	kfree_skb (skb, FREE_WRITE);    dev->tbusy = 0;    mark_bh (INET_BH);    return 0/*ret_val*/;}static intplip_header (unsigned char *buff, struct device *dev,	     unsigned short type, unsigned long h_dest,	     unsigned long h_source, unsigned len){    if (dev->dev_addr[0] == 0) {	/* set physical address */	plip_set_physicaladdr(dev, h_source);    }    return eth_header(buff, dev, type, h_dest, h_source, len);}static void  plip_device_clear(struct device *dev){    dev->interrupt = 0;    dev->tbusy = 0;    outb(0x00, dev->base_addr + PAR_DATA);    outb(0x10, dev->base_addr + PAR_CONTROL);		/* Enable the rx interrupt. */}static void  plip_receiver_error(struct device *dev){    dev->interrupt = 0;    dev->tbusy = 0;    outb(0x02, dev->base_addr + PAR_DATA);    outb(0x10, dev->base_addr + PAR_CONTROL);		/* Enable the rx interrupt. */}static int  get_byte(struct device *dev){    unsigned char val, oldval;    unsigned char low_nibble;    int timeout;    int error = 0;    val = inb(dev->base_addr + PAR_STATUS);    timeout = jiffies + timeoutfactor * 2;    do {	oldval = val;	val = inb(dev->base_addr + PAR_STATUS);	if ( oldval != val ) continue; /* it's unstable */	if ( timeout < jiffies ) {	    error++;	    break;	}    } while ( (val & 0x80) );    val = inb(dev->base_addr + PAR_STATUS);    low_nibble = (val >> 3) & 0x0f;    outb(0x11, dev->base_addr + PAR_DATA);    timeout = jiffies + timeoutfactor * 2;    do {	oldval = val;	val = inb(dev->base_addr + PAR_STATUS);	if (oldval != val) continue; /* it's unstable */	if ( timeout < jiffies ) {	    error++;	    break;	}    } while ( !(val & 0x80) );    val = inb(dev->base_addr + PAR_STATUS);    PRINTK2(("%02x %s ", low_nibble | ((val << 1) & 0xf0),	       error ? "t":""));    outb(0x01, dev->base_addr + PAR_DATA);    if (error) {	/* timeout error */	double_timeoutfactor();	return -1;    }    return low_nibble | ((val << 1) & 0xf0);}/* The typical workload of the driver:   Handle the parallel port interrupts. */static void  plip_interrupt(int reg_ptr){    int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);    struct device *dev = irq2dev_map[irq];    struct netstats *localstats;    if (dev == NULL) {	PRINTK(("plip_interrupt(): irq %d for unknown device.\n", irq));	return;    }    localstats = (struct netstats*) dev->priv;    if (dev->tbusy || dev->interrupt) return;    dev->interrupt = 1;    outb(0x00, dev->base_addr + PAR_CONTROL);  /* Disable the rx interrupt. */    sti(); /* Allow other interrupts. */    PRINTK2(("%s: interrupt.  ", dev->name));    {	/* check whether the interrupt is valid or not.*/	int timeout = jiffies + timeoutfactor;	while ((inb(dev->base_addr + PAR_STATUS) & 0xf8) != 0xc0) {	    if ( timeout < jiffies ) {		PRINTK2(("%s: No interrupt (status=%#02x)!\n",			 dev->name, inb(dev->base_addr + PAR_STATUS)));		plip_device_clear(dev);		return;	    }	}    }    if (plip_receive_packet(dev)) {	/* get some error while receiving data */	localstats->rx_errors++;	plip_receiver_error(dev);    } else {	plip_device_clear(dev);    }}static int

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美一区二区三区极速播放 | 亚洲欧美另类图片小说| 欧美一区二视频| 欧美群妇大交群的观看方式| 欧美中文字幕一区二区三区| 99国产精品视频免费观看| 成人听书哪个软件好| 国产91在线|亚洲| 国产91丝袜在线播放0| 国产成人高清在线| 成人免费看的视频| 99久久亚洲一区二区三区青草| 成人av影视在线观看| 91在线观看一区二区| 欧美视频三区在线播放| 欧美一区二区三区在线看| 日韩一区二区在线看| 国产亚洲一区二区三区| 国产精品久久久久久久午夜片| 综合欧美亚洲日本| 亚洲国产一区二区三区| 亚洲第一福利一区| 国内精品国产成人| 91视频观看视频| 91精品午夜视频| 久久精品一二三| 亚洲精选视频免费看| 美女视频黄频大全不卡视频在线播放| 国产在线播放一区| 日本韩国精品在线| 日韩免费福利电影在线观看| 亚洲欧洲国产日韩| 奇米影视7777精品一区二区| 99免费精品在线| 欧美一区二区三区男人的天堂| 国产欧美日韩不卡| 偷拍与自拍一区| 成人av在线观| 日韩欧美黄色影院| 亚洲精品大片www| 国产精品1024| 日韩一区二区三区观看| 中文字幕一区av| 秋霞午夜鲁丝一区二区老狼| 99久久婷婷国产精品综合| 日韩一区二区三区电影| 亚洲欧美一区二区三区孕妇| 国产盗摄视频一区二区三区| 欧美精品色一区二区三区| 国产精品高潮呻吟久久| 精品综合久久久久久8888| 在线看国产一区二区| 国产精品丝袜一区| 国内精品免费**视频| 日韩一级视频免费观看在线| 中文字幕制服丝袜成人av| 国精产品一区一区三区mba桃花| 欧美色国产精品| 亚洲三级在线看| jiyouzz国产精品久久| 久久夜色精品国产欧美乱极品| 夜色激情一区二区| 91美女片黄在线观看91美女| 国产精品二区一区二区aⅴ污介绍| 乱一区二区av| 91精品国产色综合久久ai换脸 | 国产高清亚洲一区| 欧美精品一区二区蜜臀亚洲| 亚洲国产aⅴ天堂久久| 色综合色综合色综合色综合色综合| 中文字幕+乱码+中文字幕一区| 国产一区二区三区黄视频 | 日韩av电影免费观看高清完整版| 97精品国产97久久久久久久久久久久 | 欧美国产欧美亚州国产日韩mv天天看完整 | 国产精品网站在线播放| 精品一区在线看| 欧美大肚乱孕交hd孕妇| 蜜臀av在线播放一区二区三区 | 免费在线观看成人| 日韩丝袜情趣美女图片| 麻豆成人久久精品二区三区红| 日韩一区二区三区在线视频| 美女性感视频久久| 久久久久久久久久久久电影| 精品一区二区三区在线播放| 精品国产a毛片| 国产精品白丝av| 中文字幕一区二区三区乱码在线| 91亚洲国产成人精品一区二区三| 亚洲少妇最新在线视频| 在线观看日韩电影| 三级久久三级久久久| 日韩三级精品电影久久久| 久久se这里有精品| 国产精品盗摄一区二区三区| 91福利精品第一导航| 亚洲va在线va天堂| 久久在线观看免费| 不卡影院免费观看| 五月天婷婷综合| 2019国产精品| 91精品福利视频| 久久成人羞羞网站| 亚洲色图19p| 精品三级av在线| 91丨九色porny丨蝌蚪| 丝袜亚洲另类丝袜在线| 久久久久久久久久久久久久久99| www.视频一区| 蜜臀va亚洲va欧美va天堂| 国产精品国产自产拍在线| 欧美久久一二三四区| 国产91清纯白嫩初高中在线观看| 亚洲高清在线视频| 伊人性伊人情综合网| 91精品国产一区二区三区蜜臀| 国产成人福利片| 日韩电影在线免费看| 国产精品日产欧美久久久久| 欧美一区二区三区色| 99精品1区2区| 国产一区二区网址| 亚洲国产日韩a在线播放| 久久午夜电影网| 欧美一区二区播放| 日本韩国欧美在线| 99久久精品国产一区| 精品写真视频在线观看| 丝袜国产日韩另类美女| 亚洲欧美日韩人成在线播放| 国产人伦精品一区二区| 精品国产免费久久| 欧美一级片免费看| 欧美日韩五月天| aaa亚洲精品| 国产精品一区一区| 久久精品国产一区二区| 亚洲电影一级片| 一区二区在线观看免费| 国产精品久久久久永久免费观看 | 欧美无砖专区一中文字| 97精品电影院| 色婷婷综合久色| hitomi一区二区三区精品| 成人一区二区三区中文字幕| 精彩视频一区二区| 国产一区二区伦理片| 国产又黄又大久久| 国产精品一区二区久久精品爱涩| 麻豆精品视频在线观看视频| 丝袜国产日韩另类美女| 日本中文在线一区| 美腿丝袜在线亚洲一区| 另类小说欧美激情| 国产一区高清在线| 国产高清视频一区| 99久久免费视频.com| 欧美国产在线观看| 国产精品毛片高清在线完整版| 成人av电影在线| 国产成人综合视频| av在线综合网| 欧美三级视频在线| 欧美一区二区视频在线观看| 日韩精品资源二区在线| 久久午夜羞羞影院免费观看| 国产欧美一区二区三区在线看蜜臀| 欧美韩日一区二区三区四区| 成人欧美一区二区三区| 亚洲图片一区二区| 免费欧美日韩国产三级电影| 美女精品一区二区| 丁香六月综合激情| 欧美亚日韩国产aⅴ精品中极品| 欧美猛男男办公室激情| 久久久亚洲精品石原莉奈| 综合久久给合久久狠狠狠97色| 一区二区久久久久久| 久久69国产一区二区蜜臀| 国产中文字幕一区| 色综合天天综合给合国产| 欧美电影在线免费观看| 欧美激情在线免费观看| 亚洲一区二区三区国产| 久久91精品国产91久久小草 | 国产欧美日韩视频一区二区 | 久久久影院官网| 亚洲同性gay激情无套| 强制捆绑调教一区二区| 91在线国内视频| 91精品国产乱| 亚洲欧洲综合另类| 激情伊人五月天久久综合| 成人h版在线观看| 日韩一区二区影院| 亚洲永久免费视频| 国产成人啪免费观看软件| 制服丝袜中文字幕一区| 亚洲视频一二三区|