Lines Matching full:sh

207 static int aha1542_test_port(struct Scsi_Host *sh)  in aha1542_test_port()  argument
213 if (inb(STATUS(sh->io_port)) == 0xff) in aha1542_test_port()
219 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */ in aha1542_test_port()
221 outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port)); in aha1542_test_port()
226 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) in aha1542_test_port()
230 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK) in aha1542_test_port()
238 aha1542_outb(sh->io_port, CMD_INQUIRY); in aha1542_test_port()
241 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0)) in aha1542_test_port()
243 inquiry_result[i] = inb(DATA(sh->io_port)); in aha1542_test_port()
247 if (inb(STATUS(sh->io_port)) & DF) in aha1542_test_port()
251 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0)) in aha1542_test_port()
255 outb(IRST, CONTROL(sh->io_port)); in aha1542_test_port()
282 struct Scsi_Host *sh = dev_id; in aha1542_interrupt() local
283 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_interrupt()
295 flag = inb(INTRFLAGS(sh->io_port)); in aha1542_interrupt()
296 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: "); in aha1542_interrupt()
307 printk("status %02x\n", inb(STATUS(sh->io_port))); in aha1542_interrupt()
312 spin_lock_irqsave(sh->host_lock, flags); in aha1542_interrupt()
314 flag = inb(INTRFLAGS(sh->io_port)); in aha1542_interrupt()
330 aha1542_intr_reset(sh->io_port); in aha1542_interrupt()
345 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_interrupt()
348 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n"); in aha1542_interrupt()
359 shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n", in aha1542_interrupt()
367 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi); in aha1542_interrupt()
373 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_interrupt()
374 shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n"); in aha1542_interrupt()
375 shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat, in aha1542_interrupt()
402 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus, in aha1542_interrupt()
418 static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) in aha1542_queuecommand() argument
421 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_queuecommand()
444 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d", in aha1542_queuecommand()
468 spin_lock_irqsave(sh->host_lock, flags); in aha1542_queuecommand()
491 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done); in aha1542_queuecommand()
525 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_queuecommand()
531 static void setup_mailboxes(struct Scsi_Host *sh) in setup_mailboxes() argument
533 struct aha1542_hostdata *aha1542 = shost_priv(sh); in setup_mailboxes()
543 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */ in setup_mailboxes()
545 if (aha1542_out(sh->io_port, mb_cmd, 5)) in setup_mailboxes()
546 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n"); in setup_mailboxes()
547 aha1542_intr_reset(sh->io_port); in setup_mailboxes()
550 static int aha1542_getconfig(struct Scsi_Host *sh) in aha1542_getconfig() argument
554 i = inb(STATUS(sh->io_port)); in aha1542_getconfig()
556 i = inb(DATA(sh->io_port)); in aha1542_getconfig()
558 aha1542_outb(sh->io_port, CMD_RETCONF); in aha1542_getconfig()
559 aha1542_in(sh->io_port, inquiry_result, 3, 0); in aha1542_getconfig()
560 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0)) in aha1542_getconfig()
561 shost_printk(KERN_ERR, sh, "error querying board settings\n"); in aha1542_getconfig()
562 aha1542_intr_reset(sh->io_port); in aha1542_getconfig()
565 sh->dma_channel = 7; in aha1542_getconfig()
568 sh->dma_channel = 6; in aha1542_getconfig()
571 sh->dma_channel = 5; in aha1542_getconfig()
574 sh->dma_channel = 0; in aha1542_getconfig()
581 sh->dma_channel = 0xFF; in aha1542_getconfig()
584 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n"); in aha1542_getconfig()
589 sh->irq = 15; in aha1542_getconfig()
592 sh->irq = 14; in aha1542_getconfig()
595 sh->irq = 12; in aha1542_getconfig()
598 sh->irq = 11; in aha1542_getconfig()
601 sh->irq = 10; in aha1542_getconfig()
604 sh->irq = 9; in aha1542_getconfig()
607 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n"); in aha1542_getconfig()
610 sh->this_id = inquiry_result[2] & 7; in aha1542_getconfig()
619 static int aha1542_mbenable(struct Scsi_Host *sh) in aha1542_mbenable() argument
627 aha1542_outb(sh->io_port, CMD_EXTBIOS); in aha1542_mbenable()
628 if (aha1542_in(sh->io_port, mbenable_result, 2, 100)) in aha1542_mbenable()
630 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100)) in aha1542_mbenable()
632 aha1542_intr_reset(sh->io_port); in aha1542_mbenable()
642 if (aha1542_out(sh->io_port, mbenable_cmd, 3)) in aha1542_mbenable()
647 shost_printk(KERN_ERR, sh, "Mailbox init failed\n"); in aha1542_mbenable()
649 aha1542_intr_reset(sh->io_port); in aha1542_mbenable()
654 static int aha1542_query(struct Scsi_Host *sh) in aha1542_query() argument
656 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_query()
659 i = inb(STATUS(sh->io_port)); in aha1542_query()
661 i = inb(DATA(sh->io_port)); in aha1542_query()
663 aha1542_outb(sh->io_port, CMD_INQUIRY); in aha1542_query()
664 aha1542_in(sh->io_port, inquiry_result, 4, 0); in aha1542_query()
665 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0)) in aha1542_query()
666 shost_printk(KERN_ERR, sh, "error querying card type\n"); in aha1542_query()
667 aha1542_intr_reset(sh->io_port); in aha1542_query()
679 …shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 drive… in aha1542_query()
688 aha1542->bios_translation = aha1542_mbenable(sh); in aha1542_query()
712 static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed) in aha1542_set_bus_times() argument
717 aha1542_intr_reset(sh->io_port); in aha1542_set_bus_times()
718 if (aha1542_out(sh->io_port, oncmd, 2)) in aha1542_set_bus_times()
725 aha1542_intr_reset(sh->io_port); in aha1542_set_bus_times()
726 if (aha1542_out(sh->io_port, offcmd, 2)) in aha1542_set_bus_times()
733 aha1542_intr_reset(sh->io_port); in aha1542_set_bus_times()
734 if (aha1542_out(sh->io_port, dmacmd, 2)) in aha1542_set_bus_times()
737 aha1542_intr_reset(sh->io_port); in aha1542_set_bus_times()
740 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n"); in aha1542_set_bus_times()
741 aha1542_intr_reset(sh->io_port); in aha1542_set_bus_times()
748 struct Scsi_Host *sh; in aha1542_hw_init() local
758 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata)); in aha1542_hw_init()
759 if (!sh) in aha1542_hw_init()
761 aha1542 = shost_priv(sh); in aha1542_hw_init()
763 sh->unique_id = base_io; in aha1542_hw_init()
764 sh->io_port = base_io; in aha1542_hw_init()
765 sh->n_io_port = AHA1542_REGION_SIZE; in aha1542_hw_init()
769 if (!aha1542_test_port(sh)) in aha1542_hw_init()
772 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]); in aha1542_hw_init()
773 if (aha1542_query(sh)) in aha1542_hw_init()
775 if (aha1542_getconfig(sh) == -1) in aha1542_hw_init()
778 if (sh->dma_channel != 0xFF) in aha1542_hw_init()
779 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel); in aha1542_hw_init()
780 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n", in aha1542_hw_init()
781 sh->this_id, base_io, sh->irq, dma_info); in aha1542_hw_init()
783 shost_printk(KERN_INFO, sh, "Using extended bios translation\n"); in aha1542_hw_init()
800 setup_mailboxes(sh); in aha1542_hw_init()
802 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) { in aha1542_hw_init()
803 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n"); in aha1542_hw_init()
806 if (sh->dma_channel != 0xFF) { in aha1542_hw_init()
807 if (request_dma(sh->dma_channel, "aha1542")) { in aha1542_hw_init()
808 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n"); in aha1542_hw_init()
811 if (sh->dma_channel == 0 || sh->dma_channel >= 5) { in aha1542_hw_init()
812 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE); in aha1542_hw_init()
813 enable_dma(sh->dma_channel); in aha1542_hw_init()
817 if (scsi_add_host(sh, pdev)) in aha1542_hw_init()
820 scsi_scan_host(sh); in aha1542_hw_init()
822 return sh; in aha1542_hw_init()
825 if (sh->dma_channel != 0xff) in aha1542_hw_init()
826 free_dma(sh->dma_channel); in aha1542_hw_init()
828 free_irq(sh->irq, sh); in aha1542_hw_init()
836 scsi_host_put(sh); in aha1542_hw_init()
843 static int aha1542_release(struct Scsi_Host *sh) in aha1542_release() argument
845 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_release()
846 struct device *dev = sh->dma_dev; in aha1542_release()
848 scsi_remove_host(sh); in aha1542_release()
849 if (sh->dma_channel != 0xff) in aha1542_release()
850 free_dma(sh->dma_channel); in aha1542_release()
855 if (sh->irq) in aha1542_release()
856 free_irq(sh->irq, sh); in aha1542_release()
857 if (sh->io_port && sh->n_io_port) in aha1542_release()
858 release_region(sh->io_port, sh->n_io_port); in aha1542_release()
859 scsi_host_put(sh); in aha1542_release()
870 struct Scsi_Host *sh = cmd->device->host; in aha1542_dev_reset() local
871 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_dev_reset()
879 spin_lock_irqsave(sh->host_lock, flags); in aha1542_dev_reset()
918 aha1542_outb(sh->io_port, CMD_START_SCSI); in aha1542_dev_reset()
919 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_dev_reset()
929 struct Scsi_Host *sh = cmd->device->host; in aha1542_reset() local
930 struct aha1542_hostdata *aha1542 = shost_priv(sh); in aha1542_reset()
934 spin_lock_irqsave(sh->host_lock, flags); in aha1542_reset()
945 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_reset()
984 spin_unlock_irqrestore(sh->host_lock, flags); in aha1542_reset()
1059 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev); in aha1542_isa_match() local
1061 if (!sh) in aha1542_isa_match()
1064 dev_set_drvdata(pdev, sh); in aha1542_isa_match()
1094 struct Scsi_Host *sh; in aha1542_pnp_probe() local
1113 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx); in aha1542_pnp_probe()
1114 if (!sh) in aha1542_pnp_probe()
1117 pnp_set_drvdata(pdev, sh); in aha1542_pnp_probe()