int aac_sa_init(struct aac_dev *dev) { unsigned long start; unsigned long status; int instance; const char *name; instance = dev->id; name = dev->name; if (aac_sa_ioremap(dev, dev->base_size)) { printk(KERN_WARNING "%s: unable to map adapter.\n", name); goto error_iounmap; } if (sa_readl(dev, Mailbox7) & SELF_TEST_FAILED) { printk(KERN_WARNING "%s%d: adapter self-test failed.\n", name, instance); goto error_iounmap; } if (sa_readl(dev, Mailbox7) & KERNEL_PANIC) { printk(KERN_WARNING "%s%d: adapter kernel panic'd.\n", name, instance); goto error_iounmap; } start = jiffies; while (!(sa_readl(dev, Mailbox7) & KERNEL_UP_AND_RUNNING)) { if (time_after(jiffies, start+startup_timeout*HZ)) { status = sa_readl(dev, Mailbox7); printk(KERN_WARNING "%s%d: adapter kernel failed to start, init status = %lx.\n", name, instance, status); goto error_iounmap; } msleep(1); } dev->a_ops.adapter_interrupt = aac_sa_interrupt_adapter; dev->a_ops.adapter_disable_int = aac_sa_disable_interrupt; dev->a_ops.adapter_enable_int = aac_sa_enable_interrupt; dev->a_ops.adapter_notify = aac_sa_notify_adapter; dev->a_ops.adapter_sync_cmd = sa_sync_cmd; dev->a_ops.adapter_check_health = aac_sa_check_health; dev->a_ops.adapter_restart = aac_sa_restart_adapter; dev->a_ops.adapter_intr = aac_sa_intr; dev->a_ops.adapter_deliver = aac_rx_deliver_producer; dev->a_ops.adapter_ioremap = aac_sa_ioremap; aac_adapter_disable_int(dev); aac_adapter_enable_int(dev); if(aac_init_adapter(dev) == NULL) goto error_irq; dev->sync_mode = 0; if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev ) < 0) { printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; } dev->dbg_base = dev->scsi_host_ptr->base; dev->dbg_base_mapped = dev->base; dev->dbg_size = dev->base_size; aac_adapter_enable_int(dev); aac_sa_start_adapter(dev); return 0; error_irq: aac_sa_disable_interrupt(dev); free_irq(dev->pdev->irq, (void *)dev); error_iounmap: return -1; }
int aac_sa_init(struct aac_dev *dev) { unsigned long start; unsigned long status; int instance; const char *name; instance = dev->id; name = dev->name; if (aac_sa_ioremap(dev, dev->base_size)) { printk(KERN_WARNING "%s: unable to map adapter.\n", name); goto error_iounmap; } /* * Check to see if the board failed any self tests. */ if (sa_readl(dev, Mailbox7) & SELF_TEST_FAILED) { printk(KERN_WARNING "%s%d: adapter self-test failed.\n", name, instance); goto error_iounmap; } /* * Check to see if the board panic'd while booting. */ if (sa_readl(dev, Mailbox7) & KERNEL_PANIC) { printk(KERN_WARNING "%s%d: adapter kernel panic'd.\n", name, instance); goto error_iounmap; } start = jiffies; /* * Wait for the adapter to be up and running. Wait up to 3 minutes. */ while (!(sa_readl(dev, Mailbox7) & KERNEL_UP_AND_RUNNING)) { if (time_after(jiffies, start+startup_timeout*HZ)) { status = sa_readl(dev, Mailbox7); printk(KERN_WARNING "%s%d: adapter kernel failed to start, init status = %lx.\n", name, instance, status); goto error_iounmap; } msleep(1); } /* * Fill in the function dispatch table. */ dev->a_ops.adapter_interrupt = aac_sa_interrupt_adapter; dev->a_ops.adapter_disable_int = aac_sa_disable_interrupt; dev->a_ops.adapter_enable_int = aac_sa_enable_interrupt; dev->a_ops.adapter_notify = aac_sa_notify_adapter; dev->a_ops.adapter_sync_cmd = sa_sync_cmd; dev->a_ops.adapter_check_health = aac_sa_check_health; dev->a_ops.adapter_restart = aac_sa_restart_adapter; dev->a_ops.adapter_intr = aac_sa_intr; dev->a_ops.adapter_deliver = aac_rx_deliver_producer; dev->a_ops.adapter_ioremap = aac_sa_ioremap; /* * First clear out all interrupts. Then enable the one's that * we can handle. */ aac_adapter_disable_int(dev); aac_adapter_enable_int(dev); if(aac_init_adapter(dev) == NULL) goto error_irq; dev->sync_mode = 0; /* sync. mode not supported */ if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev ) < 0) { printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; } dev->dbg_base = dev->scsi_host_ptr->base; dev->dbg_base_mapped = dev->base; dev->dbg_size = dev->base_size; aac_adapter_enable_int(dev); /* * Tell the adapter that all is configure, and it can start * accepting requests */ aac_sa_start_adapter(dev); return 0; error_irq: aac_sa_disable_interrupt(dev); free_irq(dev->pdev->irq, (void *)dev); error_iounmap: return -1; }
int aac_sa_init(struct aac_dev *dev) { unsigned long start; unsigned long status; int instance; const char *name; instance = dev->id; name = dev->name; /* * Check to see if the board failed any self tests. */ if (sa_readl(dev, Mailbox7) & SELF_TEST_FAILED) { printk(KERN_WARNING "%s%d: adapter self-test failed.\n", name, instance); goto error_iounmap; } /* * Check to see if the board panic'd while booting. */ if (sa_readl(dev, Mailbox7) & KERNEL_PANIC) { printk(KERN_WARNING "%s%d: adapter kernel panic'd.\n", name, instance); goto error_iounmap; } start = jiffies; /* * Wait for the adapter to be up and running. Wait up to 3 minutes. */ while (!(sa_readl(dev, Mailbox7) & KERNEL_UP_AND_RUNNING)) { if (time_after(jiffies, start+180*HZ)) { status = sa_readl(dev, Mailbox7); printk(KERN_WARNING "%s%d: adapter kernel failed to start, init status = %lx.\n", name, instance, status); goto error_iounmap; } set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(1); } if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, SA_SHIRQ|SA_INTERRUPT, "aacraid", (void *)dev ) < 0) { printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; } /* * Fill in the function dispatch table. */ dev->a_ops.adapter_interrupt = aac_sa_interrupt_adapter; dev->a_ops.adapter_disable_int = aac_sa_disable_interrupt; dev->a_ops.adapter_notify = aac_sa_notify_adapter; dev->a_ops.adapter_sync_cmd = sa_sync_cmd; dev->a_ops.adapter_check_health = aac_sa_check_health; dev->a_ops.adapter_intr = aac_sa_intr; /* * First clear out all interrupts. Then enable the one's that * we can handle. */ sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff); sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 | DOORBELL_2 | DOORBELL_3 | DOORBELL_4)); if(aac_init_adapter(dev) == NULL) goto error_irq; /* * Tell the adapter that all is configure, and it can start * accepting requests */ aac_sa_start_adapter(dev); return 0; error_irq: sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff); free_irq(dev->scsi_host_ptr->irq, (void *)dev); error_iounmap: return -1; }