📄 smctr.c
字号:
}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 + -