int nbpmacscsi_detect(struct scsi_host_template * tpnt) { int flags = 0; struct Scsi_Host *instance; struct device_node *dp; const u32 *reg; if (called) return( 0 ); // dp = find_devices("5380"); dp = of_find_node_by_name(NULL, "5380"); if (!dp) return 0; reg = of_get_property(dp, "reg", NULL); if (reg == NULL) { printk(KERN_ERR "nbpmac5380: No \"reg\" property !\n"); of_node_put(dp); return 0; } tpnt->proc_name = "nbpmac5380"; /* setup variables */ tpnt->can_queue = (setup_can_queue > 0) ? setup_can_queue : CAN_QUEUE; tpnt->cmd_per_lun = (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : CMD_PER_LUN; tpnt->sg_tablesize = (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_TABLESIZE; if (setup_hostid >= 0) tpnt->this_id = setup_hostid; else /* use 7 as default */ tpnt->this_id = 7; #ifdef SUPPORT_TAGS if (setup_use_tagged_queuing < 0) setup_use_tagged_queuing = USE_TAGGED_QUEUING; #endif /* Once we support multiple 5380s (e.g. DuoDock) we'll do something different here */ instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata)); #if NDEBUG default_instance = instance; #endif /* mac68k source says multiple device support is broken */ mac_scsi_regp = (volatile unsigned char *) of_iomap(dp, 0); mac_scsi_drq = (volatile unsigned char *) of_iomap(dp, 1); mac_scsi_nodrq = (volatile unsigned char *) of_iomap(dp, 2); if (! setup_use_pdma) flags = FLAG_NO_PSEUDO_DMA; instance->io_port = (unsigned long) mac_scsi_regp; instance->irq = irq_of_parse_and_map(dp, 0); instance->n_io_port = 255; ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0; if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, NCR5380_intr, 0, "ncr5380", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; } #ifdef DRQ_INTERRUPT drq = irq_of_parse_and_map(vias, 1); request_irq(drq, macscsi_dma_intr, 0, "ncr5380 DRQ", instance); #endif of_node_put(dp); #ifdef RESET_BOOT mac_scsi_reset_boot(instance); #endif flags |= FLAG_HAS_LAST_BYTE_SENT; NCR5380_init(instance, flags); printk(KERN_INFO "scsi%d : generic 5380 at port %lX irq", instance->host_no, instance->io_port); if (instance->irq == SCSI_IRQ_NONE) printk (KERN_INFO "s disabled"); else printk (KERN_INFO " %d", instance->irq); printk(KERN_INFO " options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", instance->can_queue, instance->cmd_per_lun, MACSCSI_PUBLIC_RELEASE); printk(KERN_INFO "\nscsi%d :", instance->host_no); NCR5380_print_options(instance); printk("\n"); called = 1; return 1; }
int macscsi_detect(struct scsi_host_template * tpnt) { static int called = 0; int flags = 0; struct Scsi_Host *instance; if (!MACH_IS_MAC || called) return( 0 ); if (macintosh_config->scsi_type != MAC_SCSI_OLD) return( 0 ); /* setup variables */ tpnt->can_queue = (setup_can_queue > 0) ? setup_can_queue : CAN_QUEUE; tpnt->cmd_per_lun = (setup_cmd_per_lun > 0) ? setup_cmd_per_lun : CMD_PER_LUN; tpnt->sg_tablesize = (setup_sg_tablesize >= 0) ? setup_sg_tablesize : SG_TABLESIZE; if (setup_hostid >= 0) tpnt->this_id = setup_hostid; else { /* use 7 as default */ tpnt->this_id = 7; } #ifdef SUPPORT_TAGS if (setup_use_tagged_queuing < 0) setup_use_tagged_queuing = USE_TAGGED_QUEUING; #endif /* Once we support multiple 5380s (e.g. DuoDock) we'll do something different here */ instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata)); #if NDEBUG default_instance = instance; #endif if (macintosh_config->ident == MAC_MODEL_IIFX) { mac_scsi_regp = via1+0x8000; mac_scsi_drq = via1+0xE000; mac_scsi_nodrq = via1+0xC000; /* The IIFX should be able to do true DMA, but pseudo-dma doesn't work */ flags = FLAG_NO_PSEUDO_DMA; } else { mac_scsi_regp = via1+0x10000; mac_scsi_drq = via1+0x6000; mac_scsi_nodrq = via1+0x12000; } if (! setup_use_pdma) flags = FLAG_NO_PSEUDO_DMA; instance->io_port = (unsigned long) mac_scsi_regp; instance->irq = IRQ_MAC_SCSI; #ifdef RESET_BOOT mac_scsi_reset_boot(instance); #endif NCR5380_init(instance, flags); instance->n_io_port = 255; ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0; if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, NCR5380_intr, IRQ_FLG_SLOW, "ncr5380", instance)) { printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; } printk(KERN_INFO "scsi%d: generic 5380 at port %lX irq", instance->host_no, instance->io_port); if (instance->irq == SCSI_IRQ_NONE) printk (KERN_INFO "s disabled"); else printk (KERN_INFO " %d", instance->irq); printk(KERN_INFO " options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", instance->can_queue, instance->cmd_per_lun, MACSCSI_PUBLIC_RELEASE); printk(KERN_INFO "\nscsi%d:", instance->host_no); NCR5380_print_options(instance); printk("\n"); called = 1; return 1; }
static int __init mac_scsi_probe(struct platform_device *pdev) { struct Scsi_Host *instance; int error; int host_flags = 0; struct resource *irq, *pio_mem, *pdma_mem = NULL; pio_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!pio_mem) return -ENODEV; #ifdef PSEUDO_DMA pdma_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); #endif irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (!hwreg_present((unsigned char *)pio_mem->start + (STATUS_REG << 4))) { pr_info(PFX "no device detected at %pap\n", &pio_mem->start); return -ENODEV; } if (setup_can_queue > 0) mac_scsi_template.can_queue = setup_can_queue; if (setup_cmd_per_lun > 0) mac_scsi_template.cmd_per_lun = setup_cmd_per_lun; if (setup_sg_tablesize >= 0) mac_scsi_template.sg_tablesize = setup_sg_tablesize; if (setup_hostid >= 0) mac_scsi_template.this_id = setup_hostid & 7; if (setup_use_pdma < 0) setup_use_pdma = 0; instance = scsi_host_alloc(&mac_scsi_template, sizeof(struct NCR5380_hostdata)); if (!instance) return -ENOMEM; instance->base = pio_mem->start; if (irq) instance->irq = irq->start; else instance->irq = NO_IRQ; if (pdma_mem && setup_use_pdma) { struct NCR5380_hostdata *hostdata = shost_priv(instance); hostdata->pdma_base = (unsigned char *)pdma_mem->start; } else host_flags |= FLAG_NO_PSEUDO_DMA; #ifdef RESET_BOOT mac_scsi_reset_boot(instance); #endif #ifdef SUPPORT_TAGS host_flags |= setup_use_tagged_queuing > 0 ? FLAG_TAGGED_QUEUING : 0; #endif NCR5380_init(instance, host_flags); if (instance->irq != NO_IRQ) { error = request_irq(instance->irq, macscsi_intr, IRQF_SHARED, "NCR5380", instance); if (error) goto fail_irq; } error = scsi_add_host(instance, NULL); if (error) goto fail_host; platform_set_drvdata(pdev, instance); scsi_scan_host(instance); return 0; fail_host: if (instance->irq != NO_IRQ) free_irq(instance->irq, instance); fail_irq: NCR5380_exit(instance); scsi_host_put(instance); return error; }