📄 smctr.c
字号:
= (__u16 *)smctr_malloc(dev, tp->tx_buff_size[BUG_QUEUE]); tp->tx_buff_curr[BUG_QUEUE] = tp->tx_buff_head[BUG_QUEUE]; tp->tx_buff_end[BUG_QUEUE] = (__u16 *)smctr_malloc(dev, 0); /* Allocate MAC receive data buffers. * MAC Rx buffer doesn't have to be on a 256 byte boundary. */ tp->rx_buff_head[MAC_QUEUE] = (__u16 *)smctr_malloc(dev, RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[MAC_QUEUE]); tp->rx_buff_end[MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0); /* Allocate Non-MAC transmit buffers. * ?? For maximum Netware performance, put Tx Buffers on * ODD Boundry and then restore malloc to Even Boundrys. */ smctr_malloc(dev, 1L); tp->tx_buff_head[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[NON_MAC_QUEUE]); tp->tx_buff_curr[NON_MAC_QUEUE] = tp->tx_buff_head[NON_MAC_QUEUE]; tp->tx_buff_end [NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0); smctr_malloc(dev, 1L); /* Allocate Non-MAC receive data buffers. * To guarantee a minimum of 256 contigous memory to * UM_Receive_Packet's lookahead pointer, before a page * change or ring end is encountered, place each rx buffer on * a 256 byte boundary. */ smctr_malloc(dev, TO_256_BYTE_BOUNDRY(tp->sh_mem_used)); tp->rx_buff_head[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[NON_MAC_QUEUE]); tp->rx_buff_end[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0); return (0);}/* Enter Bypass state. */static int smctr_bypass_state(struct net_device *dev){ int err; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_bypass_state\n", dev->name); err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_BYPASS_STATE); return (err);}static int smctr_checksum_firmware(struct net_device *dev){ struct net_local *tp = netdev_priv(dev); __u16 i, checksum = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_checksum_firmware\n", dev->name); smctr_enable_adapter_ctrl_store(dev); for(i = 0; i < CS_RAM_SIZE; i += 2) checksum += *((__u16 *)(tp->ram_access + i)); tp->microcode_version = *(__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET); tp->microcode_version >>= 8; smctr_disable_adapter_ctrl_store(dev); if(checksum) return (checksum); return (0);}static int __init smctr_chk_mca(struct net_device *dev){#ifdef CONFIG_MCA_LEGACY struct net_local *tp = netdev_priv(dev); int current_slot; __u8 r1, r2, r3, r4, r5; current_slot = mca_find_unused_adapter(smctr_posid, 0); if(current_slot == MCA_NOTFOUND) return (-ENODEV); mca_set_adapter_name(current_slot, smctr_name); mca_mark_as_used(current_slot); tp->slot_num = current_slot; r1 = mca_read_stored_pos(tp->slot_num, 2); r2 = mca_read_stored_pos(tp->slot_num, 3); if(tp->slot_num) outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num - 1) | CNFG_SLOT_ENABLE_BIT)); else outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num) | CNFG_SLOT_ENABLE_BIT)); r1 = inb(CNFG_POS_REG1); r2 = inb(CNFG_POS_REG0); tp->bic_type = BIC_594_CHIP; /* IO */ r2 = mca_read_stored_pos(tp->slot_num, 2); r2 &= 0xF0; dev->base_addr = ((__u16)r2 << 8) + (__u16)0x800; request_region(dev->base_addr, SMCTR_IO_EXTENT, smctr_name); /* IRQ */ r5 = mca_read_stored_pos(tp->slot_num, 5); r5 &= 0xC; switch(r5) { case 0: dev->irq = 3; break; case 0x4: dev->irq = 4; break; case 0x8: dev->irq = 10; break; default: dev->irq = 15; break; } if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) { release_region(dev->base_addr, SMCTR_IO_EXTENT); return -ENODEV; } /* Get RAM base */ r3 = mca_read_stored_pos(tp->slot_num, 3); tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000; if (r3 & 0x8) tp->ram_base += 0x010000; if (r3 & 0x80) tp->ram_base += 0xF00000; /* Get Ram Size */ r3 &= 0x30; r3 >>= 4; tp->ram_usable = (__u16)CNFG_SIZE_8KB << r3; tp->ram_size = (__u16)CNFG_SIZE_64KB; tp->board_id |= TOKEN_MEDIA; r4 = mca_read_stored_pos(tp->slot_num, 4); tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0x0C0000; if (r4 & 0x8) tp->rom_base += 0x010000; /* Get ROM size. */ r4 >>= 4; switch (r4) { case 0: tp->rom_size = CNFG_SIZE_8KB; break; case 1: tp->rom_size = CNFG_SIZE_16KB; break; case 2: tp->rom_size = CNFG_SIZE_32KB; break; default: tp->rom_size = ROM_DISABLE; } /* Get Media Type. */ r5 = mca_read_stored_pos(tp->slot_num, 5); r5 &= CNFG_MEDIA_TYPE_MASK; switch(r5) { case (0): tp->media_type = MEDIA_STP_4; break; case (1): tp->media_type = MEDIA_STP_16; break; case (3): tp->media_type = MEDIA_UTP_16; break; default: tp->media_type = MEDIA_UTP_4; break; } tp->media_menu = 14; r2 = mca_read_stored_pos(tp->slot_num, 2); if(!(r2 & 0x02)) tp->mode_bits |= EARLY_TOKEN_REL; /* Disable slot */ outb(CNFG_POS_CONTROL_REG, 0); tp->board_id = smctr_get_boardid(dev, 1); 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; } return (0);#else return (-1);#endif /* CONFIG_MCA_LEGACY */}static int smctr_chg_rx_mask(struct net_device *dev){ struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_chg_rx_mask\n", dev->name); smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); if(tp->mode_bits & LOOPING_MODE_MASK) tp->config_word0 |= RX_OWN_BIT; else tp->config_word0 &= ~RX_OWN_BIT; if(tp->receive_mask & PROMISCUOUS_MODE) tp->config_word0 |= PROMISCUOUS_BIT; else tp->config_word0 &= ~PROMISCUOUS_BIT; if(tp->receive_mask & ACCEPT_ERR_PACKETS) tp->config_word0 |= SAVBAD_BIT; else tp->config_word0 &= ~SAVBAD_BIT; if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES) tp->config_word0 |= RXATMAC; else tp->config_word0 &= ~RXATMAC; if(tp->receive_mask & ACCEPT_MULTI_PROM) tp->config_word1 |= MULTICAST_ADDRESS_BIT; else tp->config_word1 &= ~MULTICAST_ADDRESS_BIT; if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING) tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS; else { if(tp->receive_mask & ACCEPT_SOURCE_ROUTING) tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT; else tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS; } if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_0, &tp->config_word0))) { return (err); } if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_1, &tp->config_word1))) { return (err); } smctr_disable_16bit(dev); return (0);}static int smctr_clear_int(struct net_device *dev){ struct net_local *tp = netdev_priv(dev); outb((tp->trc_mask | CSR_CLRTINT), dev->base_addr + CSR); return (0);}static int smctr_clear_trc_reset(int ioaddr){ __u8 r; r = inb(ioaddr + MSR); outb(~MSR_RST & r, ioaddr + MSR); return (0);}/* * The inverse routine to smctr_open(). */static int smctr_close(struct net_device *dev){ struct net_local *tp = netdev_priv(dev); struct sk_buff *skb; int err; netif_stop_queue(dev); tp->cleanup = 1; /* Check to see if adapter is already in a closed state. */ if(tp->status != OPEN) return (0); smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); if((err = smctr_issue_remove_cmd(dev))) { smctr_disable_16bit(dev); return (err); } for(;;) { skb = skb_dequeue(&tp->SendSkbQueue); if(skb == NULL) break; tp->QueueSkb++; dev_kfree_skb(skb); } return (0);}static int smctr_decode_firmware(struct net_device *dev){ struct net_local *tp = netdev_priv(dev); short bit = 0x80, shift = 12; DECODE_TREE_NODE *tree; short branch, tsize; __u16 buff = 0; long weight; __u8 *ucode; __u16 *mem; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name); weight = *(long *)(tp->ptr_ucode + WEIGHT_OFFSET); tsize = *(__u8 *)(tp->ptr_ucode + TREE_SIZE_OFFSET); tree = (DECODE_TREE_NODE *)(tp->ptr_ucode + TREE_OFFSET); ucode = (__u8 *)(tp->ptr_ucode + TREE_OFFSET + (tsize * sizeof(DECODE_TREE_NODE))); mem = (__u16 *)(tp->ram_access); while(weight) { branch = ROOT; while((tree + branch)->tag != LEAF && weight) { branch = *ucode & bit ? (tree + branch)->llink : (tree + branch)->rlink; bit >>= 1; weight--; if(bit == 0) { bit = 0x80; ucode++; } } buff |= (tree + branch)->info << shift; shift -= 4; if(shift < 0) { *(mem++) = SWAP_BYTES(buff); buff = 0; shift = 12; } } /* The following assumes the Control Store Memory has * been initialized to zero. If the last partial word * is zero, it will not be written. */ if(buff) *(mem++) = SWAP_BYTES(buff); return (0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -