⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smctr.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
}static int smctr_disable_16bit(struct net_device *dev){        return (0);}/* * On Exit, Adapter is: * 1. TRC is in a reset state and un-initialized. * 2. Adapter memory is enabled. * 3. Control Store memory is out of context (-WCSS is 1). */static int smctr_disable_adapter_ctrl_store(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        if(smctr_debug > 10)                printk(KERN_DEBUG "%s: smctr_disable_adapter_ctrl_store\n", dev->name);        tp->trc_mask |= CSR_WCSS;        outb(tp->trc_mask, ioaddr + CSR);        return (0);}static int smctr_disable_bic_int(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        tp->trc_mask = CSR_MSK_ALL | CSR_MSKCBUSY	        | CSR_MSKTINT | CSR_WCSS;        outb(tp->trc_mask, ioaddr + CSR);        return (0);}static int smctr_enable_16bit(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        __u8    r;        if(tp->adapter_bus == BUS_ISA16_TYPE)        {                r = inb(dev->base_addr + LAAR);                outb((r | LAAR_MEM16ENB), dev->base_addr + LAAR);        }        return (0);}/* * To enable the adapter control store memory: * 1. Adapter must be in a RESET state. * 2. Adapter memory must be enabled. * 3. Control Store Memory is in context (-WCSS is 0). */static int smctr_enable_adapter_ctrl_store(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        if(smctr_debug > 10)                printk(KERN_DEBUG "%s: smctr_enable_adapter_ctrl_store\n", dev->name);        smctr_set_trc_reset(ioaddr);        smctr_enable_adapter_ram(dev);        tp->trc_mask &= ~CSR_WCSS;        outb(tp->trc_mask, ioaddr + CSR);        return (0);}static int smctr_enable_adapter_ram(struct net_device *dev){        int ioaddr = dev->base_addr;        __u8 r;        if(smctr_debug > 10)                printk(KERN_DEBUG "%s: smctr_enable_adapter_ram\n", dev->name);        r = inb(ioaddr + MSR);        outb(MSR_MEMB | r, ioaddr + MSR);        return (0);}static int smctr_enable_bic_int(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        __u8 r;        switch(tp->bic_type)        {                case (BIC_584_CHIP):                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;                        outb(tp->trc_mask, ioaddr + CSR);                        r = inb(ioaddr + IRR);                        outb(r | IRR_IEN, ioaddr + IRR);                        break;                case (BIC_594_CHIP):                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;                        outb(tp->trc_mask, ioaddr + CSR);                        r = inb(ioaddr + IMCCR);                        outb(r | IMCCR_EIL, ioaddr + IMCCR);                        break;        }        return (0);}static int __init smctr_chk_isa(struct net_device *dev){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        __u8 r1, r2, b, chksum = 0;        __u16 r;	int i;	int err = -ENODEV;        if(smctr_debug > 10)                printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr);	if((ioaddr & 0x1F) != 0)                goto out;        /* Grab the region so that no one else tries to probe our ioports. */	if (!request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name)) {		err = -EBUSY;		goto out;	}        /* Checksum SMC node address */        for(i = 0; i < 8; i++)        {                b = inb(ioaddr + LAR0 + i);                chksum += b;        }        if (chksum != NODE_ADDR_CKSUM)                goto out2;        b = inb(ioaddr + BDID);	if(b != BRD_ID_8115T)        {                printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name);                goto out2;        }        /* Check for 8115T Board ID */        r2 = 0;        for(r = 0; r < 8; r++)        {            r1 = inb(ioaddr + 0x8 + r);            r2 += r1;        }        /* value of RegF adds up the sum to 0xFF */        if((r2 != 0xFF) && (r2 != 0xEE))                goto out2;        /* Get adapter ID */        tp->board_id = smctr_get_boardid(dev, 0);        switch(tp->board_id & 0xffff)        {                case WD8115TA:                        smctr_model = "8115T/A";                        break;                case WD8115T:			if(tp->extra_info & CHIP_REV_MASK)                                smctr_model = "8115T rev XE";                        else                                smctr_model = "8115T rev XD";                        break;                default:                        smctr_model = "Unknown";                        break;        }        /* Store BIC type. */        tp->bic_type = BIC_584_CHIP;        tp->nic_type = NIC_825_CHIP;        /* Copy Ram Size */        tp->ram_usable  = CNFG_SIZE_16KB;        tp->ram_size    = CNFG_SIZE_64KB;        /* Get 58x Ram Base */        r1 = inb(ioaddr);        r1 &= 0x3F;        r2 = inb(ioaddr + CNFG_LAAR_584);        r2 &= CNFG_LAAR_MASK;        r2 <<= 3;        r2 |= ((r1 & 0x38) >> 3);        tp->ram_base = ((__u32)r2 << 16) + (((__u32)(r1 & 0x7)) << 13);        /* Get 584 Irq */        r1 = 0;        r1 = inb(ioaddr + CNFG_ICR_583);        r1 &= CNFG_ICR_IR2_584;        r2 = inb(ioaddr + CNFG_IRR_583);        r2 &= CNFG_IRR_IRQS;     /* 0x60 */        r2 >>= 5;        switch(r2)        {                case 0:                        if(r1 == 0)                                dev->irq = 2;                        else                                dev->irq = 10;                        break;                case 1:                        if(r1 == 0)                                dev->irq = 3;                        else                                dev->irq = 11;                        break;                case 2:                        if(r1 == 0)                        {                                if(tp->extra_info & ALTERNATE_IRQ_BIT)                                        dev->irq = 5;                                else                                        dev->irq = 4;                        }                        else                                dev->irq = 15;                        break;                case 3:                        if(r1 == 0)                                dev->irq = 7;                        else                                dev->irq = 4;                        break;                default:                        printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name);                        goto out2;         }        if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev))                goto out2;        /* Get 58x Rom Base */        r1 = inb(ioaddr + CNFG_BIO_583);        r1 &= 0x3E;        r1 |= 0x40;        tp->rom_base = (__u32)r1 << 13;        /* Get 58x Rom Size */        r1 = inb(ioaddr + CNFG_BIO_583);        r1 &= 0xC0;        if(r1 == 0)                tp->rom_size = ROM_DISABLE;        else        {                r1 >>= 6;                tp->rom_size = (__u16)CNFG_SIZE_8KB << r1;        }        /* Get 58x Boot Status */        r1 = inb(ioaddr + CNFG_GP2);        tp->mode_bits &= (~BOOT_STATUS_MASK);        if(r1 & CNFG_GP2_BOOT_NIBBLE)                tp->mode_bits |= BOOT_TYPE_1;        /* Get 58x Zero Wait State */        tp->mode_bits &= (~ZERO_WAIT_STATE_MASK);        r1 = inb(ioaddr + CNFG_IRR_583);        if(r1 & CNFG_IRR_ZWS)                 tp->mode_bits |= ZERO_WAIT_STATE_8_BIT;        if(tp->board_id & BOARD_16BIT)        {                r1 = inb(ioaddr + CNFG_LAAR_584);                if(r1 & CNFG_LAAR_ZWS)                        tp->mode_bits |= ZERO_WAIT_STATE_16_BIT;        }        /* Get 584 Media Menu */        tp->media_menu = 14;        r1 = inb(ioaddr + CNFG_IRR_583);        tp->mode_bits &= 0xf8ff;       /* (~CNFG_INTERFACE_TYPE_MASK) */        if((tp->board_id & TOKEN_MEDIA) == TOKEN_MEDIA)        {                /* Get Advanced Features */                if(((r1 & 0x6) >> 1) == 0x3)                        tp->media_type |= MEDIA_UTP_16;                else                {                        if(((r1 & 0x6) >> 1) == 0x2)                                tp->media_type |= MEDIA_STP_16;                        else                        {                                if(((r1 & 0x6) >> 1) == 0x1)                                        tp->media_type |= MEDIA_UTP_4;                                else                                        tp->media_type |= MEDIA_STP_4;                        }                }                r1 = inb(ioaddr + CNFG_GP2);                if(!(r1 & 0x2) )           /* GP2_ETRD */                        tp->mode_bits |= EARLY_TOKEN_REL;                /* see if the chip is corrupted                if(smctr_read_584_chksum(ioaddr))                {                        printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name);			free_irq(dev->irq, dev);                        goto out2;                }		*/        }        return (0);out2:	release_region(ioaddr, SMCTR_IO_EXTENT);out:	return err;}static int __init smctr_get_boardid(struct net_device *dev, int mca){        struct net_local *tp = netdev_priv(dev);        int ioaddr = dev->base_addr;        __u8 r, r1, IdByte;        __u16 BoardIdMask;        tp->board_id = BoardIdMask = 0;	if(mca)	{		BoardIdMask |= (MICROCHANNEL+INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);		tp->extra_info |= (INTERFACE_594_CHIP+RAM_SIZE_64K+NIC_825_BIT+ALTERNATE_IRQ_BIT+SLOT_16BIT);	}	else	{        	BoardIdMask|=(INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);        	tp->extra_info |= (INTERFACE_584_CHIP + RAM_SIZE_64K        	        + NIC_825_BIT + ALTERNATE_IRQ_BIT);	}	if(!mca)	{        	r = inb(ioaddr + BID_REG_1);        	r &= 0x0c;       		outb(r, ioaddr + BID_REG_1);        	r = inb(ioaddr + BID_REG_1);        	if(r & BID_SIXTEEN_BIT_BIT)        	{        	        tp->extra_info |= SLOT_16BIT;        	        tp->adapter_bus = BUS_ISA16_TYPE;        	}        	else        	        tp->adapter_bus = BUS_ISA8_TYPE;	}	else		tp->adapter_bus = BUS_MCA_TYPE;        /* Get Board Id Byte */        IdByte = inb(ioaddr + BID_BOARD_ID_BYTE);        /* if Major version > 1.0 then         *      return;         */        if(IdByte & 0xF8)                return (-1);        r1 = inb(ioaddr + BID_REG_1);        r1 &= BID_ICR_MASK;        r1 |= BID_OTHER_BIT;        outb(r1, ioaddr + BID_REG_1);        r1 = inb(ioaddr + BID_REG_3);        r1 &= BID_EAR_MASK;        r1 |= BID_ENGR_PAGE;        outb(r1, ioaddr + BID_REG_3);        r1 = inb(ioaddr + BID_REG_1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -