static irqreturn_t aac_sa_intr(int irq, void *dev_id, struct pt_regs *regs) { struct aac_dev *dev = dev_id; unsigned short intstat, mask; intstat = sa_readw(dev, DoorbellReg_p); /* * Read mask and invert because drawbridge is reversed. * This allows us to only service interrupts that have been enabled. */ mask = ~(sa_readw(dev, SaDbCSR.PRISETIRQMASK)); /* Check to see if this is our interrupt. If it isn't just return */ if (intstat & mask) { if (intstat & PrintfReady) { aac_printf(dev, le32_to_cpu(sa_readl(dev, Mailbox5))); sa_writew(dev, DoorbellClrReg_p, PrintfReady); /* clear PrintfReady */ sa_writew(dev, DoorbellReg_s, PrintfDone); } else if (intstat & DOORBELL_1) { // dev -> Host Normal Command Ready aac_command_normal(&dev->queues->queue[HostNormCmdQueue]); sa_writew(dev, DoorbellClrReg_p, DOORBELL_1); } else if (intstat & DOORBELL_2) { // dev -> Host Normal Response Ready aac_response_normal(&dev->queues->queue[HostNormRespQueue]); sa_writew(dev, DoorbellClrReg_p, DOORBELL_2); } else if (intstat & DOORBELL_3) { // dev -> Host Normal Command Not Full sa_writew(dev, DoorbellClrReg_p, DOORBELL_3); } else if (intstat & DOORBELL_4) { // dev -> Host Normal Response Not Full sa_writew(dev, DoorbellClrReg_p, DOORBELL_4); } return IRQ_HANDLED; } return IRQ_NONE; }
static irqreturn_t aac_sa_intr(int irq, void *dev_id) { struct aac_dev *dev = dev_id; unsigned short intstat, mask; intstat = sa_readw(dev, DoorbellReg_p); mask = ~(sa_readw(dev, SaDbCSR.PRISETIRQMASK)); if (intstat & mask) { if (intstat & PrintfReady) { aac_printf(dev, sa_readl(dev, Mailbox5)); sa_writew(dev, DoorbellClrReg_p, PrintfReady); sa_writew(dev, DoorbellReg_s, PrintfDone); } else if (intstat & DOORBELL_1) { sa_writew(dev, DoorbellClrReg_p, DOORBELL_1); aac_command_normal(&dev->queues->queue[HostNormCmdQueue]); } else if (intstat & DOORBELL_2) { sa_writew(dev, DoorbellClrReg_p, DOORBELL_2); aac_response_normal(&dev->queues->queue[HostNormRespQueue]); } else if (intstat & DOORBELL_3) { sa_writew(dev, DoorbellClrReg_p, DOORBELL_3); } else if (intstat & DOORBELL_4) { sa_writew(dev, DoorbellClrReg_p, DOORBELL_4); } return IRQ_HANDLED; } return IRQ_NONE; }
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret) { unsigned long start; int ok; /* * Write the Command into Mailbox 0 */ sa_writel(dev, Mailbox0, cpu_to_le32(command)); /* * Write the parameters into Mailboxes 1 - 4 */ sa_writel(dev, Mailbox1, cpu_to_le32(p1)); sa_writel(dev, Mailbox2, 0); sa_writel(dev, Mailbox3, 0); sa_writel(dev, Mailbox4, 0); /* * Clear the synch command doorbell to start on a clean slate. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Signal that there is a new synch command */ sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { /* * Delay 5uS so that the monitor gets access */ udelay(5); /* * Mon110 will set doorbell0 bit when it has * completed the command. */ if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(1); } if (ok != 1) return -ETIMEDOUT; /* * Clear the synch command doorbell. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Pull the synch status from Mailbox 0. */ *ret = le32_to_cpu(sa_readl(dev, Mailbox0)); return 0; }
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4) { unsigned long start; int ok; sa_writel(dev, Mailbox0, command); sa_writel(dev, Mailbox1, p1); sa_writel(dev, Mailbox2, p2); sa_writel(dev, Mailbox3, p3); sa_writel(dev, Mailbox4, p4); sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { udelay(5); if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } msleep(1); } if (ok != 1) return -ETIMEDOUT; sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); if (ret) *ret = sa_readl(dev, Mailbox0); if (r1) *r1 = sa_readl(dev, Mailbox1); if (r2) *r2 = sa_readl(dev, Mailbox2); if (r3) *r3 = sa_readl(dev, Mailbox3); if (r4) *r4 = sa_readl(dev, Mailbox4); return 0; }
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4) { unsigned long start; int ok; /* * Write the Command into Mailbox 0 */ sa_writel(dev, Mailbox0, command); /* * Write the parameters into Mailboxes 1 - 4 */ sa_writel(dev, Mailbox1, p1); sa_writel(dev, Mailbox2, p2); sa_writel(dev, Mailbox3, p3); sa_writel(dev, Mailbox4, p4); /* * Clear the synch command doorbell to start on a clean slate. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Signal that there is a new synch command */ sa_writew(dev, DoorbellReg_s, DOORBELL_0); ok = 0; start = jiffies; while(time_before(jiffies, start+30*HZ)) { /* * Delay 5uS so that the monitor gets access */ udelay(5); /* * Mon110 will set doorbell0 bit when it has * completed the command. */ if(sa_readw(dev, DoorbellReg_p) & DOORBELL_0) { ok = 1; break; } msleep(1); } if (ok != 1) return -ETIMEDOUT; /* * Clear the synch command doorbell. */ sa_writew(dev, DoorbellClrReg_p, DOORBELL_0); /* * Pull the synch status from Mailbox 0. */ if (ret) *ret = sa_readl(dev, Mailbox0); if (r1) *r1 = sa_readl(dev, Mailbox1); if (r2) *r2 = sa_readl(dev, Mailbox2); if (r3) *r3 = sa_readl(dev, Mailbox3); if (r4) *r4 = sa_readl(dev, Mailbox4); return 0; }