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

📄 smctr.c

📁 h内核
💻 C
📖 第 1 页 / 共 5 页
字号:
                = (__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 + -