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

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

?? abyss.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
字號:
/* *  abyss.c: Network driver for the Madge Smart 16/4 PCI Mk2 token ring card. * *  Written 1999-2000 by Adam Fritzler * *  This software may be used and distributed according to the terms *  of the GNU General Public License, incorporated herein by reference. * *  This driver module supports the following cards: *      - Madge Smart 16/4 PCI Mk2 * *  Maintainer(s): *    AF	Adam Fritzler		mid@auk.cx * *  Modification History: *	30-Dec-99	AF	Split off from the tms380tr driver. *	22-Jan-00	AF	Updated to use indirect read/writes  *	23-Nov-00	JG	New PCI API, cleanups * * *  TODO: *	1. See if we can use MMIO instead of inb/outb/inw/outw *	2. Add support for Mk1 (has AT24 attached to the PCI *		config registers) * */#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/errno.h>#include <linux/pci.h>#include <linux/init.h>#include <asm/system.h>#include <asm/io.h>#include <asm/irq.h>#include <linux/netdevice.h>#include <linux/trdevice.h>#include "tms380tr.h"#include "abyss.h"            /* Madge-specific constants */static char version[] __initdata ="abyss.c: v1.02 23/11/2000 by Adam Fritzler\n";#define ABYSS_IO_EXTENT 64static struct pci_device_id abyss_pci_tbl[] __initdata = {	{ PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_MK2,	  PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_TOKEN_RING << 8, 0x00ffffff, },	{ }			/* Terminating entry */};MODULE_DEVICE_TABLE(pci, abyss_pci_tbl);MODULE_LICENSE("GPL");static int abyss_open(struct net_device *dev);static int abyss_close(struct net_device *dev);static void abyss_enable(struct net_device *dev);static int abyss_chipset_init(struct net_device *dev);static void abyss_read_eeprom(struct net_device *dev);static unsigned short abyss_setnselout_pins(struct net_device *dev);static void at24_writedatabyte(unsigned long regaddr, unsigned char byte);static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr);static int at24_sendcmd(unsigned long regaddr, unsigned char cmd);static unsigned char at24_readdatabit(unsigned long regaddr);static unsigned char at24_readdatabyte(unsigned long regaddr);static int at24_waitforack(unsigned long regaddr);static int at24_waitfornack(unsigned long regaddr);static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data);static void at24_start(unsigned long regaddr);static unsigned char at24_readb(unsigned long regaddr, unsigned char addr);static unsigned short abyss_sifreadb(struct net_device *dev, unsigned short reg){	return inb(dev->base_addr + reg);}static unsigned short abyss_sifreadw(struct net_device *dev, unsigned short reg){	return inw(dev->base_addr + reg);}static void abyss_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg){	outb(val, dev->base_addr + reg);}static void abyss_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg){	outw(val, dev->base_addr + reg);}static int __init abyss_attach(struct pci_dev *pdev, const struct pci_device_id *ent){		static int versionprinted;	struct net_device *dev;	struct net_local *tp;	int i, ret, pci_irq_line;	unsigned long pci_ioaddr;		if (versionprinted++ == 0)		printk("%s", version);	if (pci_enable_device(pdev))		return -EIO;	/* Remove I/O space marker in bit 0. */	pci_irq_line = pdev->irq;	pci_ioaddr = pci_resource_start (pdev, 0);			/* At this point we have found a valid card. */			dev = init_trdev(NULL, 0);	if (!dev)		return -ENOMEM;	SET_MODULE_OWNER(dev);	if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) {		ret = -EBUSY;		goto err_out_trdev;	}			ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ,			  dev->name, dev);	if (ret)		goto err_out_region;			dev->base_addr	= pci_ioaddr;	dev->irq	= pci_irq_line;			printk("%s: Madge Smart 16/4 PCI Mk2 (Abyss)\n", dev->name);	printk("%s:    IO: %#4lx  IRQ: %d\n",	       dev->name, pci_ioaddr, dev->irq);	/*	 * The TMS SIF registers lay 0x10 above the card base address.	 */	dev->base_addr += 0x10;			ret = tmsdev_init(dev, PCI_MAX_ADDRESS, pdev);	if (ret) {		printk("%s: unable to get memory for dev->priv.\n", 		       dev->name);		goto err_out_irq;	}	abyss_read_eeprom(dev);			printk("%s:    Ring Station Address: ", dev->name);	printk("%2.2x", dev->dev_addr[0]);	for (i = 1; i < 6; i++)		printk(":%2.2x", dev->dev_addr[i]);	printk("\n");	tp = dev->priv;	tp->setnselout = abyss_setnselout_pins;	tp->sifreadb = abyss_sifreadb;	tp->sifreadw = abyss_sifreadw;	tp->sifwriteb = abyss_sifwriteb;	tp->sifwritew = abyss_sifwritew;	memcpy(tp->ProductID, "Madge PCI 16/4 Mk2", PROD_ID_SIZE + 1);			dev->open = abyss_open;	dev->stop = abyss_close;	ret = register_trdev(dev);	if (ret)		goto err_out_tmsdev;	pci_set_drvdata(pdev, dev);	return 0;err_out_tmsdev:	tmsdev_term(dev);err_out_irq:	free_irq(pdev->irq, dev);err_out_region:	release_region(pci_ioaddr, ABYSS_IO_EXTENT);err_out_trdev:	unregister_netdev(dev);	kfree(dev);	return ret;}static unsigned short abyss_setnselout_pins(struct net_device *dev){	unsigned short val = 0;	struct net_local *tp = (struct net_local *)dev->priv;		if(tp->DataRate == SPEED_4)		val |= 0x01;  /* Set 4Mbps */	else		val |= 0x00;  /* Set 16Mbps */		return val;}/* * The following Madge boards should use this code: *   - Smart 16/4 PCI Mk2 (Abyss) *   - Smart 16/4 PCI Mk1 (PCI T) *   - Smart 16/4 Client Plus PnP (Big Apple) *   - Smart 16/4 Cardbus Mk2 * * These access an Atmel AT24 SEEPROM using their glue chip registers.  * */static void at24_writedatabyte(unsigned long regaddr, unsigned char byte){	int i;		for (i = 0; i < 8; i++) {		at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);		at24_setlines(regaddr, 1, (byte >> (7-i))&0x01);		at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);	}}static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr){	if (at24_sendcmd(regaddr, cmd)) {		at24_writedatabyte(regaddr, addr);		return at24_waitforack(regaddr);	}	return 0;}static int at24_sendcmd(unsigned long regaddr, unsigned char cmd){	int i;		for (i = 0; i < 10; i++) {		at24_start(regaddr);		at24_writedatabyte(regaddr, cmd);		if (at24_waitforack(regaddr))			return 1;	}	return 0;}static unsigned char at24_readdatabit(unsigned long regaddr){	unsigned char val;	at24_setlines(regaddr, 0, 1);	at24_setlines(regaddr, 1, 1);	val = (inb(regaddr) & AT24_DATA)?1:0;	at24_setlines(regaddr, 1, 1);	at24_setlines(regaddr, 0, 1);	return val;}static unsigned char at24_readdatabyte(unsigned long regaddr){	unsigned char data = 0;	int i;		for (i = 0; i < 8; i++) {		data <<= 1;		data |= at24_readdatabit(regaddr);	}	return data;}static int at24_waitforack(unsigned long regaddr){	int i;		for (i = 0; i < 10; i++) {		if ((at24_readdatabit(regaddr) & 0x01) == 0x00)			return 1;	}	return 0;}static int at24_waitfornack(unsigned long regaddr){	int i;	for (i = 0; i < 10; i++) {		if ((at24_readdatabit(regaddr) & 0x01) == 0x01)			return 1;	}	return 0;}static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data){	unsigned char val = AT24_ENABLE;	if (clock)		val |= AT24_CLOCK;	if (data)		val |= AT24_DATA;	outb(val, regaddr); 	tms380tr_wait(20); /* Very necessary. */}static void at24_start(unsigned long regaddr){	at24_setlines(regaddr, 0, 1);	at24_setlines(regaddr, 1, 1);	at24_setlines(regaddr, 1, 0);	at24_setlines(regaddr, 0, 1);}static unsigned char at24_readb(unsigned long regaddr, unsigned char addr){	unsigned char data = 0xff;		if (at24_sendfullcmd(regaddr, AT24_WRITE, addr)) {		if (at24_sendcmd(regaddr, AT24_READ)) {			data = at24_readdatabyte(regaddr);			if (!at24_waitfornack(regaddr))				data = 0xff;		}	}	return data;}/* * Enable basic functions of the Madge chipset needed * for initialization. */static void abyss_enable(struct net_device *dev){	unsigned char reset_reg;	unsigned long ioaddr;		ioaddr = dev->base_addr;	reset_reg = inb(ioaddr + PCIBM2_RESET_REG);	reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);	tms380tr_wait(100);}/* * Enable the functions of the Madge chipset needed for * full working order.  */static int abyss_chipset_init(struct net_device *dev){	unsigned char reset_reg;	unsigned long ioaddr;		ioaddr = dev->base_addr;		reset_reg = inb(ioaddr + PCIBM2_RESET_REG);		reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);		reset_reg &= ~(PCIBM2_RESET_REG_CHIP_NRES |		       PCIBM2_RESET_REG_FIFO_NRES | 		       PCIBM2_RESET_REG_SIF_NRES);	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);		tms380tr_wait(100);		reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);		reset_reg |= PCIBM2_RESET_REG_SIF_NRES;	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);	reset_reg |= PCIBM2_RESET_REG_FIFO_NRES;	outb(reset_reg, ioaddr + PCIBM2_RESET_REG);	outb(PCIBM2_INT_CONTROL_REG_SINTEN | 	     PCIBM2_INT_CONTROL_REG_PCI_ERR_ENABLE, 	     ioaddr + PCIBM2_INT_CONTROL_REG);  	outb(30, ioaddr + PCIBM2_FIFO_THRESHOLD);		return 0;}static inline void abyss_chipset_close(struct net_device *dev){	unsigned long ioaddr;		ioaddr = dev->base_addr;	outb(0, ioaddr + PCIBM2_RESET_REG);}/* * Read configuration data from the AT24 SEEPROM on Madge cards. * */static void abyss_read_eeprom(struct net_device *dev){	struct net_local *tp;	unsigned long ioaddr;	unsigned short val;	int i;		tp = (struct net_local *)dev->priv;	ioaddr = dev->base_addr;		/* Must enable glue chip first */	abyss_enable(dev);		val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 			 PCIBM2_SEEPROM_RING_SPEED);	tp->DataRate = val?SPEED_4:SPEED_16; /* set open speed */	printk("%s:    SEEPROM: ring speed: %dMb/sec\n", dev->name, tp->DataRate);		val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG,			 PCIBM2_SEEPROM_RAM_SIZE) * 128;	printk("%s:    SEEPROM: adapter RAM: %dkb\n", dev->name, val);		dev->addr_len = 6;	for (i = 0; i < 6; i++) 		dev->dev_addr[i] = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 					      PCIBM2_SEEPROM_BIA+i);}static int abyss_open(struct net_device *dev){  	abyss_chipset_init(dev);	tms380tr_open(dev);	return 0;}static int abyss_close(struct net_device *dev){	tms380tr_close(dev);	abyss_chipset_close(dev);	return 0;}static void __devexit abyss_detach (struct pci_dev *pdev){	struct net_device *dev = pci_get_drvdata(pdev);		if (!dev)		BUG();	unregister_netdev(dev);	release_region(dev->base_addr-0x10, ABYSS_IO_EXTENT);	free_irq(dev->irq, dev);	tmsdev_term(dev);	kfree(dev);	pci_set_drvdata(pdev, NULL);}static struct pci_driver abyss_driver = {	name:		"abyss",	id_table:	abyss_pci_tbl,	probe:		abyss_attach,	remove:		__devexit_p(abyss_detach),};static int __init abyss_init (void){	int rc = pci_register_driver (&abyss_driver);	if (rc < 0)		return rc;	if (rc == 0) {		pci_unregister_driver (&abyss_driver);		return -ENODEV;	}	return 0;}static void __exit abyss_rmmod (void){	pci_unregister_driver (&abyss_driver);}module_init(abyss_init);module_exit(abyss_rmmod);/* * Local variables: *  compile-command: "gcc -DMODVERSIONS  -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c abyss.c" *  alt-compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c abyss.c" *  c-set-style "K&R" *  c-indent-level: 8 *  c-basic-offset: 8 *  tab-width: 8 * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人亚洲一区二区一| 亚洲欧洲av一区二区三区久久| 悠悠色在线精品| 91麻豆精品在线观看| 亚洲人成精品久久久久久| 91片黄在线观看| 一区二区在线观看免费| 欧美在线观看视频在线| 婷婷开心久久网| 精品国产在天天线2019| 国产裸体歌舞团一区二区| 国产清纯美女被跳蛋高潮一区二区久久w| 久久99精品国产.久久久久久| www国产成人| 成人看片黄a免费看在线| 最近日韩中文字幕| 欧美欧美欧美欧美| 韩国理伦片一区二区三区在线播放 | 91精品国产乱| 麻豆一区二区三区| 欧美激情一二三区| 欧美亚洲综合网| 精品一区二区日韩| 国产精品久久福利| 欧美久久久久免费| 成人午夜视频在线| 午夜电影一区二区三区| 久久九九全国免费| 在线亚洲欧美专区二区| 精品一区二区三区影院在线午夜| 国产精品久久久久婷婷二区次| 欧美视频在线一区| 国产麻豆精品一区二区| 亚洲尤物在线视频观看| 成人av在线一区二区| 欧美巨大另类极品videosbest| 香蕉成人啪国产精品视频综合网| 欧美电视剧在线看免费| av在线播放不卡| 美女视频黄免费的久久| 亚洲欧洲www| 精品久久久久久最新网址| av亚洲产国偷v产偷v自拍| 日本欧美加勒比视频| 亚洲欧美一区二区三区孕妇| 精品国产一区二区三区四区四| 97精品久久久午夜一区二区三区 | 懂色av噜噜一区二区三区av| 日韩美女视频在线| 91免费版在线| 国产成人精品影院| 日韩电影一区二区三区四区| 亚洲婷婷综合久久一本伊一区| 精品999在线播放| 欧美色综合影院| 91小视频在线观看| 国产成人在线观看免费网站| 日本女优在线视频一区二区| 夜夜嗨av一区二区三区| 国产精品拍天天在线| 精品国产乱码久久久久久久| 欧美一区二区在线免费播放 | 久久99久国产精品黄毛片色诱| 亚洲精品视频在线观看网站| 国产三级精品视频| 久久一区二区三区四区| 日韩一区二区三区四区五区六区| 欧美性三三影院| 色一情一乱一乱一91av| 99久久婷婷国产精品综合| 国产精品一区二区你懂的| 激情亚洲综合在线| 久久国产精品第一页| 日韩avvvv在线播放| 日本中文字幕一区二区视频 | 欧美一区二区三区影视| 成人app在线| 国产精品99久| 国产一区二区h| 老司机精品视频一区二区三区| 日韩av电影免费观看高清完整版在线观看| 亚洲日本va在线观看| 亚洲色图视频网| 亚洲六月丁香色婷婷综合久久| 亚洲素人一区二区| 亚洲色图另类专区| 亚洲制服丝袜一区| 天堂蜜桃91精品| 午夜不卡av在线| 蜜桃av一区二区在线观看| 经典三级在线一区| 国产成人精品免费| 91蜜桃婷婷狠狠久久综合9色| 91玉足脚交白嫩脚丫在线播放| 日本二三区不卡| 日韩三级视频中文字幕| 精品少妇一区二区三区视频免付费 | 精品一区二区av| 国产一级精品在线| 成人免费视频网站在线观看| 97se狠狠狠综合亚洲狠狠| 色婷婷综合久久久久中文| 欧美日韩国产在线观看| 日韩午夜小视频| 欧美国产1区2区| 一区二区三区av电影 | 欧美日韩在线亚洲一区蜜芽| 欧美一级艳片视频免费观看| 精品国产乱码久久久久久1区2区| 中日韩免费视频中文字幕| 亚洲美女一区二区三区| 日本va欧美va精品发布| 粉嫩av一区二区三区粉嫩 | 亚洲免费观看视频| 日本最新不卡在线| 国产91精品精华液一区二区三区| 色婷婷av久久久久久久| 日韩免费看的电影| 亚洲女性喷水在线观看一区| 热久久国产精品| 波多野结衣亚洲一区| 欧美高清视频一二三区| 国产精品美女一区二区| 视频精品一区二区| 成人va在线观看| 日韩午夜激情av| 一区精品在线播放| 久久91精品国产91久久小草| 91在线视频免费观看| 日韩精品一区二区三区中文不卡 | 91精品午夜视频| 久久蜜桃av一区精品变态类天堂 | 欧美日韩视频一区二区| 久久久久国产一区二区三区四区| 亚洲一二三区视频在线观看| 粉嫩一区二区三区在线看| 欧美一区二区在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 久久99国产精品免费| 欧美日韩免费不卡视频一区二区三区| 久久久久久久性| 日本欧美久久久久免费播放网| 色婷婷国产精品久久包臀| 亚洲国产精品99久久久久久久久| 五月综合激情婷婷六月色窝| 成人一级黄色片| 精品久久久久久久久久久久包黑料| 一区二区三区四区在线| 不卡一区中文字幕| 亚洲精品一区二区在线观看| 天天色综合成人网| 一区二区三区四区亚洲| 国产亚洲成av人在线观看导航| 丝袜亚洲另类欧美综合| 在线视频国内一区二区| 亚洲视频1区2区| av网站免费线看精品| 国产亚洲美州欧州综合国| 久久国产精品第一页| 欧美一二三区在线观看| 午夜免费久久看| 欧美特级限制片免费在线观看| 亚洲欧美另类小说| 一本一本久久a久久精品综合麻豆| 国产欧美一区二区精品秋霞影院 | 国产日本欧洲亚洲| 国产伦精品一区二区三区免费迷| 欧美一卡二卡三卡四卡| 日韩黄色免费电影| 欧美一区二区视频免费观看| 婷婷综合五月天| 欧美老人xxxx18| 日韩av在线发布| 欧美一卡2卡3卡4卡| 男女视频一区二区| 日韩视频免费观看高清在线视频| 日韩高清不卡一区二区| 欧美一区二区视频观看视频| 日本不卡一二三| 欧美va亚洲va在线观看蝴蝶网| 另类综合日韩欧美亚洲| 日韩免费在线观看| 国产精品一区二区久久精品爱涩| 久久久国产综合精品女国产盗摄| 粉嫩aⅴ一区二区三区四区五区| 国产日韩精品一区| 97久久超碰国产精品| 亚洲成人在线免费| 欧美一区二区啪啪| 国产成人免费在线视频| 国产精品理论在线观看| 一本一道久久a久久精品| 亚洲6080在线| 亚洲精品一区二区三区99| 国产不卡在线一区| 一区二区三区四区蜜桃| 欧美另类变人与禽xxxxx| 激情综合网av| 国产精品福利av| 欧美日韩成人综合|