亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产免费久久精品| 日韩欧美一区中文| 亚洲少妇30p| 欧美在线看片a免费观看| 亚洲国产你懂的| 91精品国产综合久久香蕉麻豆| 午夜不卡av在线| 欧美v日韩v国产v| 99久久精品国产精品久久| 亚洲女同女同女同女同女同69| 欧美色窝79yyyycom| 麻豆精品在线看| 国产三级三级三级精品8ⅰ区| 国产91露脸合集magnet| 成人欧美一区二区三区黑人麻豆 | 久久综合九色综合欧美亚洲| 国产精品资源网| 一区二区视频在线看| 欧美丰满一区二区免费视频| 国产专区欧美精品| 亚洲手机成人高清视频| 欧美一区二区三区成人| 丁香桃色午夜亚洲一区二区三区| 综合激情成人伊人| 日韩一区二区在线免费观看| 国产成人夜色高潮福利影视| 成人免费视频在线观看| 日韩写真欧美这视频| 成人午夜视频在线| 日韩精品一级二级 | 亚洲国产精品99久久久久久久久 | 日本乱码高清不卡字幕| 麻豆久久一区二区| 亚洲欧美日韩精品久久久久| 日韩免费性生活视频播放| 91亚洲资源网| 美国三级日本三级久久99| 中文字幕在线观看不卡视频| 精品少妇一区二区三区视频免付费| 91小视频免费观看| 国内外精品视频| 亚洲成人自拍偷拍| 亚洲女厕所小便bbb| 精品电影一区二区| 欧美日韩国产高清一区| 成人福利电影精品一区二区在线观看| 日本女优在线视频一区二区| 亚洲欧美日韩在线播放| 国产亚洲欧美中文| 日韩欧美一区电影| 欧美日韩综合在线| caoporen国产精品视频| 国产精一品亚洲二区在线视频| 亚洲va欧美va天堂v国产综合| 中文字幕在线免费不卡| 欧美—级在线免费片| 欧美成人一区二区三区在线观看| 欧美午夜片在线看| 一本到三区不卡视频| 成人av电影观看| 国产成人aaa| 国产河南妇女毛片精品久久久| 精品一区二区在线播放| 日韩精品五月天| 亚洲高清不卡在线观看| 亚洲自拍偷拍图区| 亚洲自拍偷拍欧美| 亚洲精品视频在线看| 中文字幕在线观看不卡| 国产精品剧情在线亚洲| 久久精品一级爱片| 欧美—级在线免费片| 国产精品丝袜久久久久久app| 亚洲精品在线电影| 久久久久久免费网| 国产亚洲视频系列| 国产欧美一区二区三区沐欲| 久久日韩精品一区二区五区| 欧美成人伊人久久综合网| www国产精品av| 久久嫩草精品久久久精品一| 久久精品一区四区| 中文字幕视频一区| 亚洲精品成a人| 亚洲成av人影院在线观看网| 日韩激情av在线| 精品一区二区久久| 国产成人在线影院| 99精品视频在线观看免费| 91麻豆精品秘密| 欧美精品久久99久久在免费线| 欧美日本不卡视频| 精品国产一二三区| 中文字幕免费不卡在线| 亚洲欧美日韩在线| 午夜影院在线观看欧美| 久久99精品久久久久| 国产不卡视频在线观看| 91美女在线观看| 欧美日韩国产免费一区二区| 欧美电视剧免费观看| 欧美极品xxx| 亚洲国产精品久久人人爱| 日韩av电影免费观看高清完整版| 激情久久久久久久久久久久久久久久| 国产精品综合av一区二区国产馆| av在线一区二区三区| 欧美日韩一卡二卡三卡 | 综合色中文字幕| 婷婷亚洲久悠悠色悠在线播放| 久久99精品久久久久久久久久久久| 成人免费毛片高清视频| 欧美日韩中文精品| 国产亚洲精品bt天堂精选| 一区二区三区中文字幕在线观看| 日本美女一区二区三区视频| 成人av免费在线观看| 制服丝袜中文字幕一区| 国产视频911| 日日夜夜一区二区| 成人福利电影精品一区二区在线观看| 欧美日韩久久久一区| 国产三级一区二区| 日韩高清一区在线| 91丝袜高跟美女视频| 日韩欧美一区二区久久婷婷| 亚洲少妇中出一区| 国产精品538一区二区在线| 91色九色蝌蚪| 久久久www成人免费毛片麻豆| 亚洲一区二区三区爽爽爽爽爽 | 欧美成人一区二区三区| 夜夜爽夜夜爽精品视频| 国产成人综合网站| 91精品国产aⅴ一区二区| 最新日韩av在线| 国产精品18久久久久久vr| 欧美日本不卡视频| 亚洲六月丁香色婷婷综合久久| 国模套图日韩精品一区二区| 欧美年轻男男videosbes| 国产精品久久久久久久久免费桃花| 精品一区二区日韩| 欧美精品精品一区| 亚洲午夜精品网| 91在线国内视频| 中文字幕va一区二区三区| 精品一二三四区| 日韩精品一区二区三区在线| 亚洲一卡二卡三卡四卡无卡久久| 不卡一区二区中文字幕| 国产欧美一区二区精品性| 狂野欧美性猛交blacked| 欧美日韩成人综合| 亚洲日本乱码在线观看| 成人看片黄a免费看在线| 久久久三级国产网站| 国模一区二区三区白浆| 欧美成人精精品一区二区频| 裸体一区二区三区| 91精品国产一区二区三区| 婷婷六月综合亚洲| 欧美精品丝袜中出| 视频一区欧美精品| 欧美精品亚洲一区二区在线播放| 午夜精品福利久久久| 欧美日韩三级一区| 日韩成人伦理电影在线观看| 欧美二区在线观看| 奇米一区二区三区| 日韩欧美国产系列| 国产美女主播视频一区| 久久综合九色综合97_久久久| 精品在线视频一区| 久久久电影一区二区三区| 成人a免费在线看| 中文字幕中文字幕在线一区 | 欧美天堂一区二区三区| 亚洲久本草在线中文字幕| 91久久国产综合久久| 亚洲国产人成综合网站| 欧美日韩国产综合视频在线观看| 午夜精品福利在线| 亚洲精品一区二区三区精华液 | 欧美网站一区二区| 午夜精品成人在线| wwwwxxxxx欧美| 成人av资源下载| 亚洲影视在线观看| 欧美一区二区三区电影| 国产成人一级电影| 亚洲天天做日日做天天谢日日欢| 91国偷自产一区二区三区成为亚洲经典| 亚洲视频在线一区| 91精品国产欧美一区二区18| 精品无人码麻豆乱码1区2区| 亚洲欧洲成人精品av97| 欧美私人免费视频| 国产一区二区影院| 一区二区三区四区不卡在线 |