/* Not supposed to use this function! */ void mca_pos_set (device_t dev, u_int8_t reg, u_int8_t data) { struct mca_device * m_dev = device_get_ivars(dev); u_int8_t slot = mca_get_slot(dev); if ((slot > MCA_MAX_ADAPTERS) || (reg > MCA_POS7)) return; /* Disable motherboard setup */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS); /* Select adapter setup regs */ outb(MCA_ADAP_SETUP_REG, ((slot & 0x0f) | MCA_ADAP_SET)); /* Write the register */ outb(MCA_POS_REG(reg), data); /* Disable adapter setup */ outb(MCA_ADAP_SETUP_REG, MCA_ADAP_SETUP_DIS); /* Update the IVAR copy */ m_dev->pos[reg] = data; return; }
u_int8_t mca_pos_get (device_t dev, u_int8_t reg) { u_int8_t slot = mca_get_slot(dev); u_int8_t data = 0; if ((slot > MCA_MAX_ADAPTERS) || (reg > MCA_POS7)) return (0); /* Disable motherboard setup */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS); switch (slot) { case MCA_MB_SCSI_SLOT: /* Disable adapter setup */ outb(MCA_ADAP_SETUP_REG, MCA_ADAP_SETUP_DIS); /* Select motherboard video setup regs */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_SCSI); /* read the register */ data = inb(MCA_POS_REG(reg)); /* Disable motherboard setup */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS); break; case MCA_MB_VIDEO_SLOT: /* Disable adapter setup */ outb(MCA_ADAP_SETUP_REG, MCA_ADAP_SETUP_DIS); /* Select motherboard scsi setup regs */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_VIDEO); /* read the register */ data = inb(MCA_POS_REG(reg)); /* Disable motherboard setup */ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS); break; default: /* Select adapter setup regs */ outb(MCA_ADAP_SETUP_REG, ((slot & 0x0f) | MCA_ADAP_SET)); /* read the register */ data = inb(MCA_POS_REG(reg)); /* Disable adapter setup */ outb(MCA_ADAP_SETUP_REG, MCA_ADAP_SETUP_DIS); break; } return (data); }
static int bt_mca_probe (device_t dev) { const char * desc; mca_id_t id = mca_get_id(dev); struct bt_probe_info info; u_int32_t iobase = 0; u_int32_t iosize = 0; u_int8_t drq = 0; u_int8_t irq = 0; u_int8_t pos; int result; desc = mca_match_id(id, bt_mca_devs); if (!desc) return (ENXIO); device_set_desc(dev, desc); pos = (mca_pos_read(dev, BT_MCA_IOPORT_POS1) & BT_MCA_IOPORT_MASK1) | (mca_pos_read(dev, BT_MCA_IOPORT_POS2) & BT_MCA_IOPORT_MASK2); iobase = BT_MCA_IOPORT(pos); iosize = BT_MCA_IOPORT_SIZE; pos = mca_pos_read(dev, BT_MCA_DRQ_POS); drq = BT_MCA_DRQ(pos); pos = mca_pos_read(dev, BT_MCA_IRQ_POS); irq = BT_MCA_IRQ(pos); bt_mark_probed_iop(iobase); mca_add_iospace(dev, iobase, iosize); /* And allocate them */ bt_mca_alloc_resources(dev, BT_MCA_PROBE); if (bt_port_probe(dev, &info) != 0) { printf("bt_mca_probe: Probe failed for " "card at slot %d\n", mca_get_slot(dev) + 1); result = ENXIO; } else { mca_add_drq(dev, drq); mca_add_irq(dev, irq); result = BUS_PROBE_DEFAULT; } bt_mca_release_resources(dev); return (result); }