static void bt3c_intr(void *context) { bt3c_softc_p sc = (bt3c_softc_p) context; u_int16_t control, status; if (sc == NULL || sc->ith == NULL) { printf("%s: bogus interrupt\n", NG_BT3C_NODE_TYPE); return; } bt3c_read_control(sc, control); if ((control & 0x80) == 0) return; bt3c_read(sc, 0x7001, status); NG_BT3C_INFO(sc->dev, "control=%#x, status=%#x\n", control, status); if ((status & 0xff) == 0x7f || (status & 0xff) == 0xff) { NG_BT3C_WARN(sc->dev, "Strange status=%#x\n", status); return; } /* Receive complete */ if (status & 0x0001) bt3c_receive(sc); /* Record status and schedule SWI */ sc->status |= status; swi_sched(sc->ith, 0); /* Complete interrupt */ bt3c_write(sc, 0x7001, 0x0000); bt3c_write_control(sc, control); } /* bt3c_intr */
static irqreturn_t bt3c_interrupt(int irq, void *dev_inst, struct pt_regs *regs) { bt3c_info_t *info = dev_inst; unsigned int iobase; int iir; if (!info || !info->hdev) { BT_ERR("Call of irq %d for unknown device", irq); return IRQ_NONE; } iobase = info->link.io.BasePort1; spin_lock(&(info->lock)); iir = inb(iobase + CONTROL); if (iir & 0x80) { int stat = bt3c_read(iobase, 0x7001); if ((stat & 0xff) == 0x7f) { BT_ERR("Very strange (stat=0x%04x)", stat); } else if ((stat & 0xff) != 0xff) { if (stat & 0x0020) { int stat = bt3c_read(iobase, 0x7002) & 0x10; BT_INFO("%s: Antenna %s", info->hdev->name, stat ? "out" : "in"); } if (stat & 0x0001) bt3c_receive(info); if (stat & 0x0002) { //BT_ERR("Ack (stat=0x%04x)", stat); clear_bit(XMIT_SENDING, &(info->tx_state)); bt3c_write_wakeup(info, 1); } bt3c_io_write(iobase, 0x7001, 0x0000); outb(iir, iobase + CONTROL); } } spin_unlock(&(info->lock)); return IRQ_HANDLED; }
static irqreturn_t bt3c_interrupt(int irq, void *dev_inst, struct pt_regs *regs) { bt3c_info_t *info = dev_inst; unsigned int iobase; int iir; if (!info) { printk(KERN_WARNING "bt3c_cs: Call of irq %d for unknown device.\n", irq); return IRQ_NONE; } iobase = info->link.io.BasePort1; spin_lock(&(info->lock)); iir = inb(iobase + CONTROL); if (iir & 0x80) { int stat = bt3c_read(iobase, 0x7001); if ((stat & 0xff) == 0x7f) { printk(KERN_WARNING "bt3c_cs: STRANGE stat=%04x\n", stat); } else if ((stat & 0xff) != 0xff) { if (stat & 0x0020) { int stat = bt3c_read(iobase, 0x7002) & 0x10; printk(KERN_WARNING "bt3c_cs: antena %s\n", stat ? "OUT" : "IN"); } if (stat & 0x0001) bt3c_receive(info); if (stat & 0x0002) { //printk("bt3c_cs: ACK %04x\n", stat); clear_bit(XMIT_SENDING, &(info->tx_state)); bt3c_write_wakeup(info, 1); } bt3c_io_write(iobase, 0x7001, 0x0000); outb(iir, iobase + CONTROL); } } spin_unlock(&(info->lock)); return IRQ_HANDLED; }