Lines Matching +full:dload +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
13 * May, 2, 1997: Added support for QLGC,isp --jj
29 #include <linux/dma-mapping.h>
135 #define QUEUE_DEPTH(in, out, ql) ((in - out) & (ql))
143 qpti->qregs + SBUS_CTRL); in qlogicpti_enable_irqs()
148 sbus_writew(0, qpti->qregs + SBUS_CTRL); in qlogicpti_disable_irqs()
154 u8 bursts = qpti->bursts; in set_sbus_cfg1()
157 * 64-byte bursts and that setting the B64 bit actually in set_sbus_cfg1()
159 * size. -DaveM in set_sbus_cfg1()
174 sbus_writew(val, qpti->qregs + SBUS_CFG1); in set_sbus_cfg1()
186 tmp = sbus_readw(qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_mbox_command()
188 sbus_writew(tmp, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_mbox_command()
192 while (--loop_count && (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_HIRQ)) { in qlogicpti_mbox_command()
198 qpti->qpti_id); in qlogicpti_mbox_command()
202 case 6: sbus_writew(param[5], qpti->qregs + MBOX5); in qlogicpti_mbox_command()
204 case 5: sbus_writew(param[4], qpti->qregs + MBOX4); in qlogicpti_mbox_command()
206 case 4: sbus_writew(param[3], qpti->qregs + MBOX3); in qlogicpti_mbox_command()
208 case 3: sbus_writew(param[2], qpti->qregs + MBOX2); in qlogicpti_mbox_command()
210 case 2: sbus_writew(param[1], qpti->qregs + MBOX1); in qlogicpti_mbox_command()
212 case 1: sbus_writew(param[0], qpti->qregs + MBOX0); in qlogicpti_mbox_command()
216 tmp = sbus_readw(qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
218 sbus_writew(tmp, qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
221 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_mbox_command()
224 tmp = sbus_readw(qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
226 sbus_writew(tmp, qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
230 while (--loop_count && in qlogicpti_mbox_command()
231 (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_CRIRQ)) in qlogicpti_mbox_command()
235 qpti->qpti_id, param[0]); in qlogicpti_mbox_command()
239 while (--loop_count && in qlogicpti_mbox_command()
240 !(sbus_readw(qpti->qregs + SBUS_SEMAPHORE) & SBUS_SEMAPHORE_LCK)) { in qlogicpti_mbox_command()
244 if (sbus_readw(qpti->qregs + MBOX0) & 0x4000) in qlogicpti_mbox_command()
249 qpti->qpti_id, param[0]); in qlogicpti_mbox_command()
253 while (--loop_count && (sbus_readw(qpti->qregs + MBOX0) == 0x04)) in qlogicpti_mbox_command()
257 qpti->qpti_id, param[0]); in qlogicpti_mbox_command()
261 case 6: param[5] = sbus_readw(qpti->qregs + MBOX5); in qlogicpti_mbox_command()
263 case 5: param[4] = sbus_readw(qpti->qregs + MBOX4); in qlogicpti_mbox_command()
265 case 4: param[3] = sbus_readw(qpti->qregs + MBOX3); in qlogicpti_mbox_command()
267 case 3: param[2] = sbus_readw(qpti->qregs + MBOX2); in qlogicpti_mbox_command()
269 case 2: param[1] = sbus_readw(qpti->qregs + MBOX1); in qlogicpti_mbox_command()
271 case 1: param[0] = sbus_readw(qpti->qregs + MBOX0); in qlogicpti_mbox_command()
275 tmp = sbus_readw(qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
277 sbus_writew(tmp, qpti->qregs + HCCTRL); in qlogicpti_mbox_command()
280 tmp = sbus_readw(qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_mbox_command()
282 sbus_writew(tmp, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_mbox_command()
292 qpti->host_param.initiator_scsi_id = qpti->scsi_id; in qlogicpti_set_hostdev_defaults()
293 qpti->host_param.bus_reset_delay = 3; in qlogicpti_set_hostdev_defaults()
294 qpti->host_param.retry_count = 0; in qlogicpti_set_hostdev_defaults()
295 qpti->host_param.retry_delay = 5; in qlogicpti_set_hostdev_defaults()
296 qpti->host_param.async_data_setup_time = 3; in qlogicpti_set_hostdev_defaults()
297 qpti->host_param.req_ack_active_negation = 1; in qlogicpti_set_hostdev_defaults()
298 qpti->host_param.data_line_active_negation = 1; in qlogicpti_set_hostdev_defaults()
299 qpti->host_param.data_dma_burst_enable = 1; in qlogicpti_set_hostdev_defaults()
300 qpti->host_param.command_dma_burst_enable = 1; in qlogicpti_set_hostdev_defaults()
301 qpti->host_param.tag_aging = 8; in qlogicpti_set_hostdev_defaults()
302 qpti->host_param.selection_timeout = 250; in qlogicpti_set_hostdev_defaults()
303 qpti->host_param.max_queue_depth = 256; in qlogicpti_set_hostdev_defaults()
310 * tag on a per-cmnd basis upon what the midlayer sez, we in qlogicpti_set_hostdev_defaults()
313 qpti->dev_param[i].device_flags = 0xcd; in qlogicpti_set_hostdev_defaults()
314 qpti->dev_param[i].execution_throttle = 16; in qlogicpti_set_hostdev_defaults()
315 if (qpti->ultra) { in qlogicpti_set_hostdev_defaults()
316 qpti->dev_param[i].synchronous_period = 12; in qlogicpti_set_hostdev_defaults()
317 qpti->dev_param[i].synchronous_offset = 8; in qlogicpti_set_hostdev_defaults()
319 qpti->dev_param[i].synchronous_period = 25; in qlogicpti_set_hostdev_defaults()
320 qpti->dev_param[i].synchronous_offset = 12; in qlogicpti_set_hostdev_defaults()
322 qpti->dev_param[i].device_enable = 1; in qlogicpti_set_hostdev_defaults()
328 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; in qlogicpti_reset_hardware()
336 spin_lock_irqsave(host->host_lock, flags); in qlogicpti_reset_hardware()
338 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL); in qlogicpti_reset_hardware()
341 if (sbus_readw(qpti->qregs + CPU_PCTRL) & CPU_PCTRL_BSY) { in qlogicpti_reset_hardware()
342 sbus_writew(CPU_ORIDE_RMOD, qpti->qregs + CPU_ORIDE); in qlogicpti_reset_hardware()
343 sbus_writew(CPU_CMD_BRESET, qpti->qregs + CPU_CMD); in qlogicpti_reset_hardware()
347 sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL); in qlogicpti_reset_hardware()
348 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL); in qlogicpti_reset_hardware()
349 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + DATA_DMA_CTRL); in qlogicpti_reset_hardware()
352 while (--loop_count && ((sbus_readw(qpti->qregs + MBOX0) & 0xff) == 0x04)) in qlogicpti_reset_hardware()
356 qpti->qpti_id); in qlogicpti_reset_hardware()
358 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL); in qlogicpti_reset_hardware()
362 if (sbus_readw(qpti->qregs + RISC_PSR) & RISC_PSR_ULTRA) { in qlogicpti_reset_hardware()
363 qpti->ultra = 1; in qlogicpti_reset_hardware()
365 qpti->qregs + RISC_MTREG); in qlogicpti_reset_hardware()
367 qpti->ultra = 0; in qlogicpti_reset_hardware()
369 qpti->qregs + RISC_MTREG); in qlogicpti_reset_hardware()
372 /* reset adapter and per-device default values. */ in qlogicpti_reset_hardware()
373 /* do it after finding out whether we're ultra mode capable */ in qlogicpti_reset_hardware()
377 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL); in qlogicpti_reset_hardware()
384 qpti->qpti_id); in qlogicpti_reset_hardware()
385 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_reset_hardware()
391 param[1] = qpti->host_param.initiator_scsi_id; in qlogicpti_reset_hardware()
395 qpti->qpti_id); in qlogicpti_reset_hardware()
396 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_reset_hardware()
401 qpti->req_in_ptr = qpti->res_out_ptr = 0; in qlogicpti_reset_hardware()
405 param[2] = (u_short) (qpti->res_dvma >> 16); in qlogicpti_reset_hardware()
406 param[3] = (u_short) (qpti->res_dvma & 0xffff); in qlogicpti_reset_hardware()
410 qpti->qpti_id); in qlogicpti_reset_hardware()
411 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_reset_hardware()
417 param[2] = (u_short) (qpti->req_dvma >> 16); in qlogicpti_reset_hardware()
418 param[3] = (u_short) (qpti->req_dvma & 0xffff); in qlogicpti_reset_hardware()
422 qpti->qpti_id); in qlogicpti_reset_hardware()
423 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_reset_hardware()
428 param[1] = qpti->host_param.retry_count; in qlogicpti_reset_hardware()
429 param[2] = qpti->host_param.retry_delay; in qlogicpti_reset_hardware()
433 param[1] = qpti->host_param.tag_aging; in qlogicpti_reset_hardware()
446 param[1] = qpti->host_param.selection_timeout; in qlogicpti_reset_hardware()
452 param[2] = (qpti->dev_param[i].device_flags << 8); in qlogicpti_reset_hardware()
457 param[3] = 0; /* no offset, we do not have sync mode yet */ in qlogicpti_reset_hardware()
465 param[1] = qpti->host_param.bus_reset_delay; in qlogicpti_reset_hardware()
467 qpti->send_marker = 1; in qlogicpti_reset_hardware()
469 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_reset_hardware()
480 struct Scsi_Host *host = qpti->qhost; in qlogicpti_load_firmware()
488 err = request_firmware(&fw, fwname, &qpti->op->dev); in qlogicpti_load_firmware()
494 if (fw->size % 2) { in qlogicpti_load_firmware()
496 fw->size, fwname); in qlogicpti_load_firmware()
497 err = -EINVAL; in qlogicpti_load_firmware()
500 fw_data = (const __le16 *)&fw->data[0]; in qlogicpti_load_firmware()
502 risc_code_length = fw->size / 2; in qlogicpti_load_firmware()
504 spin_lock_irqsave(host->host_lock, flags); in qlogicpti_load_firmware()
513 qpti->qpti_id); in qlogicpti_load_firmware()
517 sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL); in qlogicpti_load_firmware()
518 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL); in qlogicpti_load_firmware()
519 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + DATA_DMA_CTRL); in qlogicpti_load_firmware()
521 while (--timeout && (sbus_readw(qpti->qregs + SBUS_CTRL) & SBUS_CTRL_RESET)) in qlogicpti_load_firmware()
524 printk(KERN_EMERG "qlogicpti%d: Cannot reset the ISP.", qpti->qpti_id); in qlogicpti_load_firmware()
529 sbus_writew(HCCTRL_RESET, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
532 sbus_writew((SBUS_CTRL_GENAB | SBUS_CTRL_ERIRQ), qpti->qregs + SBUS_CTRL); in qlogicpti_load_firmware()
534 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_load_firmware()
536 if (sbus_readw(qpti->qregs + RISC_PSR) & RISC_PSR_ULTRA) { in qlogicpti_load_firmware()
537 qpti->ultra = 1; in qlogicpti_load_firmware()
539 qpti->qregs + RISC_MTREG); in qlogicpti_load_firmware()
541 qpti->ultra = 0; in qlogicpti_load_firmware()
543 qpti->qregs + RISC_MTREG); in qlogicpti_load_firmware()
546 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
549 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
550 if (sbus_readw(qpti->qregs + CPU_PDIFF) & CPU_PDIFF_MODE) in qlogicpti_load_firmware()
551 qpti->differential = 1; in qlogicpti_load_firmware()
553 qpti->differential = 0; in qlogicpti_load_firmware()
554 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
556 /* This shouldn't be necessary- we've reset things so we should be in qlogicpti_load_firmware()
563 qpti->qpti_id); in qlogicpti_load_firmware()
575 printk("qlogicpti%d: Firmware dload failed, I'm bolixed!\n", in qlogicpti_load_firmware()
576 qpti->qpti_id); in qlogicpti_load_firmware()
583 sbus_writew(HCCTRL_RESET, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
587 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_load_firmware()
588 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL); in qlogicpti_load_firmware()
596 qpti->qpti_id); in qlogicpti_load_firmware()
610 qpti->qpti_id); in qlogicpti_load_firmware()
616 qpti->fware_majrev = param[1]; in qlogicpti_load_firmware()
617 qpti->fware_minrev = param[2]; in qlogicpti_load_firmware()
618 qpti->fware_micrev = param[3]; in qlogicpti_load_firmware()
622 param[1] = qpti->clock; in qlogicpti_load_firmware()
626 qpti->qpti_id); in qlogicpti_load_firmware()
631 if (qpti->is_pti != 0) { in qlogicpti_load_firmware()
635 param[2] = (unsigned short) qpti->scsi_id; in qlogicpti_load_firmware()
645 spin_unlock_irqrestore(host->host_lock, flags); in qlogicpti_load_firmware()
653 int curstat = sbus_readb(qpti->sreg); in qlogicpti_verify_tmon()
656 if (!(curstat & SREG_FUSE) && (qpti->swsreg & SREG_FUSE)) in qlogicpti_verify_tmon()
657 printk("qlogicpti%d: Fuse returned to normal state.\n", qpti->qpti_id); in qlogicpti_verify_tmon()
658 if (!(curstat & SREG_TPOWER) && (qpti->swsreg & SREG_TPOWER)) in qlogicpti_verify_tmon()
659 printk("qlogicpti%d: termpwr back to normal state.\n", qpti->qpti_id); in qlogicpti_verify_tmon()
660 if (curstat != qpti->swsreg) { in qlogicpti_verify_tmon()
664 printk("qlogicpti%d: Fuse is open!\n", qpti->qpti_id); in qlogicpti_verify_tmon()
668 printk("qlogicpti%d: termpwr failure\n", qpti->qpti_id); in qlogicpti_verify_tmon()
670 if (qpti->differential && in qlogicpti_verify_tmon()
674 "differential bus! Please fix!\n", qpti->qpti_id); in qlogicpti_verify_tmon()
676 qpti->swsreg = curstat; in qlogicpti_verify_tmon()
690 while(qlink->next) in qpti_chain_add()
691 qlink = qlink->next; in qpti_chain_add()
692 qlink->next = qpti; in qpti_chain_add()
696 qpti->next = NULL; in qpti_chain_add()
704 qptichain = qpti->next; in qpti_chain_del()
707 while(qlink->next != qpti) in qpti_chain_del()
708 qlink = qlink->next; in qpti_chain_del()
709 qlink->next = qpti->next; in qpti_chain_del()
711 qpti->next = NULL; in qpti_chain_del()
717 struct platform_device *op = qpti->op; in qpti_map_regs()
719 qpti->qregs = of_ioremap(&op->resource[0], 0, in qpti_map_regs()
720 resource_size(&op->resource[0]), in qpti_map_regs()
722 if (!qpti->qregs) { in qpti_map_regs()
724 return -ENODEV; in qpti_map_regs()
726 if (qpti->is_pti) { in qpti_map_regs()
727 qpti->sreg = of_ioremap(&op->resource[0], (16 * 4096), in qpti_map_regs()
730 if (!qpti->sreg) { in qpti_map_regs()
732 return -ENODEV; in qpti_map_regs()
740 struct platform_device *op = qpti->op; in qpti_register_irq()
742 qpti->qhost->irq = qpti->irq = op->archdata.irqs[0]; in qpti_register_irq()
744 /* We used to try various overly-clever things to in qpti_register_irq()
750 if (request_irq(qpti->irq, qpti_intr, in qpti_register_irq()
754 printk("qlogicpti%d: IRQ %d ", qpti->qpti_id, qpti->irq); in qpti_register_irq()
759 printk("qlogicpti%d: Cannot acquire irq line\n", qpti->qpti_id); in qpti_register_irq()
760 return -1; in qpti_register_irq()
765 struct platform_device *op = qpti->op; in qpti_get_scsi_id()
768 dp = op->dev.of_node; in qpti_get_scsi_id()
770 qpti->scsi_id = of_getintprop_default(dp, "initiator-id", -1); in qpti_get_scsi_id()
771 if (qpti->scsi_id == -1) in qpti_get_scsi_id()
772 qpti->scsi_id = of_getintprop_default(dp, "scsi-initiator-id", in qpti_get_scsi_id()
773 -1); in qpti_get_scsi_id()
774 if (qpti->scsi_id == -1) in qpti_get_scsi_id()
775 qpti->scsi_id = in qpti_get_scsi_id()
776 of_getintprop_default(dp->parent, in qpti_get_scsi_id()
777 "scsi-initiator-id", 7); in qpti_get_scsi_id()
778 qpti->qhost->this_id = qpti->scsi_id; in qpti_get_scsi_id()
779 qpti->qhost->max_sectors = 64; in qpti_get_scsi_id()
781 printk("SCSI ID %d ", qpti->scsi_id); in qpti_get_scsi_id()
786 struct platform_device *op = qpti->op; in qpti_get_bursts()
789 bursts = of_getintprop_default(op->dev.of_node, "burst-sizes", 0xff); in qpti_get_bursts()
790 bmask = of_getintprop_default(op->dev.of_node->parent, "burst-sizes", 0xff); in qpti_get_bursts()
796 bursts = (DMA_BURST32 - 1); in qpti_get_bursts()
798 qpti->bursts = bursts; in qpti_get_bursts()
808 cfreq = prom_getintdefault(qpti->prom_node,"clock-frequency",40000000); in qpti_get_clock()
809 qpti->clock = (cfreq + 500000)/1000000; in qpti_get_clock()
810 if (qpti->clock == 0) /* bullshit */ in qpti_get_clock()
811 qpti->clock = 40; in qpti_get_clock()
819 struct platform_device *op = qpti->op; in qpti_map_queues()
822 qpti->res_cpu = dma_alloc_coherent(&op->dev, in qpti_map_queues()
824 &qpti->res_dvma, GFP_ATOMIC); in qpti_map_queues()
825 if (qpti->res_cpu == NULL || in qpti_map_queues()
826 qpti->res_dvma == 0) { in qpti_map_queues()
828 return -1; in qpti_map_queues()
831 qpti->req_cpu = dma_alloc_coherent(&op->dev, in qpti_map_queues()
833 &qpti->req_dvma, GFP_ATOMIC); in qpti_map_queues()
834 if (qpti->req_cpu == NULL || in qpti_map_queues()
835 qpti->req_dvma == 0) { in qpti_map_queues()
836 dma_free_coherent(&op->dev, QSIZE(RES_QUEUE_LEN), in qpti_map_queues()
837 qpti->res_cpu, qpti->res_dvma); in qpti_map_queues()
839 return -1; in qpti_map_queues()
841 memset(qpti->res_cpu, 0, QSIZE(RES_QUEUE_LEN)); in qpti_map_queues()
842 memset(qpti->req_cpu, 0, QSIZE(QLOGICPTI_REQ_QUEUE_LEN)); in qpti_map_queues()
849 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; in qlogicpti_info()
852 qpti->qhost->irq, qpti->qregs); in qlogicpti_info()
862 marker->hdr.entry_cnt = 1; in marker_frob()
863 marker->hdr.entry_type = ENTRY_MARKER; in marker_frob()
864 marker->modifier = SYNC_ALL; in marker_frob()
865 marker->rsvd = 0; in marker_frob()
872 cmd->hdr.entry_cnt = 1; in cmd_frob()
873 cmd->hdr.entry_type = ENTRY_COMMAND; in cmd_frob()
874 cmd->target_id = Cmnd->device->id; in cmd_frob()
875 cmd->target_lun = Cmnd->device->lun; in cmd_frob()
876 cmd->cdb_length = Cmnd->cmd_len; in cmd_frob()
877 cmd->control_flags = 0; in cmd_frob()
878 if (Cmnd->device->tagged_supported) { in cmd_frob()
879 if (qpti->cmd_count[Cmnd->device->id] == 0) in cmd_frob()
880 qpti->tag_ages[Cmnd->device->id] = jiffies; in cmd_frob()
881 if (time_after(jiffies, qpti->tag_ages[Cmnd->device->id] + (5*HZ))) { in cmd_frob()
882 cmd->control_flags = CFLAG_ORDERED_TAG; in cmd_frob()
883 qpti->tag_ages[Cmnd->device->id] = jiffies; in cmd_frob()
885 cmd->control_flags = CFLAG_SIMPLE_TAG; in cmd_frob()
887 if ((Cmnd->cmnd[0] == WRITE_6) || in cmd_frob()
888 (Cmnd->cmnd[0] == WRITE_10) || in cmd_frob()
889 (Cmnd->cmnd[0] == WRITE_12)) in cmd_frob()
890 cmd->control_flags |= CFLAG_WRITE; in cmd_frob()
892 cmd->control_flags |= CFLAG_READ; in cmd_frob()
893 cmd->time_out = scsi_cmd_to_rq(Cmnd)->timeout / HZ; in cmd_frob()
894 memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len); in cmd_frob()
909 sg_count = dma_map_sg(&qpti->op->dev, sg, in load_cmd()
911 Cmnd->sc_data_direction); in load_cmd()
913 return -1; in load_cmd()
914 ds = cmd->dataseg; in load_cmd()
915 cmd->segment_cnt = sg_count; in load_cmd()
925 sg_count -= 4; in load_cmd()
930 ++cmd->hdr.entry_cnt; in load_cmd()
931 cont = (struct Continuation_Entry *) &qpti->req_cpu[in_ptr]; in load_cmd()
934 return -1; in load_cmd()
936 cont->hdr.entry_type = ENTRY_CONTINUATION; in load_cmd()
937 cont->hdr.entry_cnt = 0; in load_cmd()
938 cont->hdr.sys_def_1 = 0; in load_cmd()
939 cont->hdr.flags = 0; in load_cmd()
940 cont->reserved = 0; in load_cmd()
941 ds = cont->dataseg; in load_cmd()
949 sg_count -= n; in load_cmd()
953 cmd->dataseg[0].d_base = 0; in load_cmd()
954 cmd->dataseg[0].d_count = 0; in load_cmd()
955 cmd->segment_cnt = 1; /* Shouldn't this be 0? */ in load_cmd()
959 cmd->handle = in_ptr; in load_cmd()
960 qpti->cmd_slots[in_ptr] = Cmnd; in load_cmd()
962 qpti->cmd_count[Cmnd->device->id]++; in load_cmd()
963 sbus_writew(in_ptr, qpti->qregs + MBOX4); in load_cmd()
964 qpti->req_in_ptr = in_ptr; in load_cmd()
972 already, but fixing it makes things even worse) -jj */ in update_can_queue()
973 int num_free = QLOGICPTI_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr) - 64; in update_can_queue()
974 host->can_queue = scsi_host_busy(host) + num_free; in update_can_queue()
975 host->sg_tablesize = QLOGICPTI_MAX_SG(num_free); in update_can_queue()
981 struct qlogicpti *qpti = shost_priv(sdev->host); in qlogicpti_sdev_configure()
982 int tgt = sdev->id; in qlogicpti_sdev_configure()
986 /* enable sync mode? */ in qlogicpti_sdev_configure()
987 if (sdev->sdtr) { in qlogicpti_sdev_configure()
988 qpti->dev_param[tgt].device_flags |= 0x10; in qlogicpti_sdev_configure()
990 qpti->dev_param[tgt].synchronous_offset = 0; in qlogicpti_sdev_configure()
991 qpti->dev_param[tgt].synchronous_period = 0; in qlogicpti_sdev_configure()
994 if (sdev->wdtr) in qlogicpti_sdev_configure()
995 qpti->dev_param[tgt].device_flags |= 0x20; in qlogicpti_sdev_configure()
999 param[2] = (qpti->dev_param[tgt].device_flags << 8); in qlogicpti_sdev_configure()
1000 if (qpti->dev_param[tgt].device_flags & 0x10) { in qlogicpti_sdev_configure()
1001 param[3] = (qpti->dev_param[tgt].synchronous_offset << 8) | in qlogicpti_sdev_configure()
1002 qpti->dev_param[tgt].synchronous_period; in qlogicpti_sdev_configure()
1014 * request-completion handling).
1016 * "This code must fly." -davem
1021 struct Scsi_Host *host = Cmnd->device->host; in qlogicpti_queuecommand_lck()
1022 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; in qlogicpti_queuecommand_lck()
1027 in_ptr = qpti->req_in_ptr; in qlogicpti_queuecommand_lck()
1028 cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr]; in qlogicpti_queuecommand_lck()
1029 out_ptr = sbus_readw(qpti->qregs + MBOX4); in qlogicpti_queuecommand_lck()
1034 if (qpti->send_marker) { in qlogicpti_queuecommand_lck()
1036 qpti->send_marker = 0; in qlogicpti_queuecommand_lck()
1038 sbus_writew(in_ptr, qpti->qregs + MBOX4); in qlogicpti_queuecommand_lck()
1039 qpti->req_in_ptr = in_ptr; in qlogicpti_queuecommand_lck()
1042 cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr]; in qlogicpti_queuecommand_lck()
1046 if ((in_ptr = load_cmd(Cmnd, cmd, qpti, in_ptr, out_ptr)) == -1) in qlogicpti_queuecommand_lck()
1055 qpti->qpti_id); in qlogicpti_queuecommand_lck()
1061 Cmnd->result = DID_BUS_BUSY; in qlogicpti_queuecommand_lck()
1072 switch (sts->completion_status) { in DEF_SCSI_QCMD()
1077 if (!(sts->state_flags & SF_GOT_BUS)) in DEF_SCSI_QCMD()
1079 else if (!(sts->state_flags & SF_GOT_TARGET)) in DEF_SCSI_QCMD()
1081 else if (!(sts->state_flags & SF_SENT_CDB)) in DEF_SCSI_QCMD()
1083 else if (!(sts->state_flags & SF_TRANSFERRED_DATA)) in DEF_SCSI_QCMD()
1085 else if (!(sts->state_flags & SF_GOT_STATUS)) in DEF_SCSI_QCMD()
1087 else if (!(sts->state_flags & SF_GOT_SENSE)) in DEF_SCSI_QCMD()
1124 id, sts->completion_status); in DEF_SCSI_QCMD()
1129 return (sts->scsi_status & STATUS_MASK) | (host_status << 16); in DEF_SCSI_QCMD()
1138 if (!(sbus_readw(qpti->qregs + SBUS_STAT) & SBUS_STAT_RINT)) in qlogicpti_intr_handler()
1141 in_ptr = sbus_readw(qpti->qregs + MBOX5); in qlogicpti_intr_handler()
1142 sbus_writew(HCCTRL_CRIRQ, qpti->qregs + HCCTRL); in qlogicpti_intr_handler()
1143 if (sbus_readw(qpti->qregs + SBUS_SEMAPHORE) & SBUS_SEMAPHORE_LCK) { in qlogicpti_intr_handler()
1144 switch (sbus_readw(qpti->qregs + MBOX0)) { in qlogicpti_intr_handler()
1147 qpti->send_marker = 1; in qlogicpti_intr_handler()
1155 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE); in qlogicpti_intr_handler()
1159 out_ptr = qpti->res_out_ptr; in qlogicpti_intr_handler()
1163 sts = (struct Status_Entry *) &qpti->res_cpu[out_ptr]; in qlogicpti_intr_handler()
1168 * that the handle provided is only 32-bits. -DaveM in qlogicpti_intr_handler()
1170 cmd_slot = sts->handle; in qlogicpti_intr_handler()
1171 Cmnd = qpti->cmd_slots[cmd_slot]; in qlogicpti_intr_handler()
1172 qpti->cmd_slots[cmd_slot] = NULL; in qlogicpti_intr_handler()
1174 if (sts->completion_status == CS_RESET_OCCURRED || in qlogicpti_intr_handler()
1175 sts->completion_status == CS_ABORTED || in qlogicpti_intr_handler()
1176 (sts->status_flags & STF_BUS_RESET)) in qlogicpti_intr_handler()
1177 qpti->send_marker = 1; in qlogicpti_intr_handler()
1179 if (sts->state_flags & SF_GOT_SENSE) in qlogicpti_intr_handler()
1180 memcpy(Cmnd->sense_buffer, sts->req_sense_data, in qlogicpti_intr_handler()
1183 if (sts->hdr.entry_type == ENTRY_STATUS) in qlogicpti_intr_handler()
1184 Cmnd->result = in qlogicpti_intr_handler()
1185 qlogicpti_return_status(sts, qpti->qpti_id); in qlogicpti_intr_handler()
1187 Cmnd->result = DID_ERROR << 16; in qlogicpti_intr_handler()
1190 dma_unmap_sg(&qpti->op->dev, in qlogicpti_intr_handler()
1192 Cmnd->sc_data_direction); in qlogicpti_intr_handler()
1194 qpti->cmd_count[Cmnd->device->id]--; in qlogicpti_intr_handler()
1195 sbus_writew(out_ptr, qpti->qregs + MBOX5); in qlogicpti_intr_handler()
1196 Cmnd->host_scribble = (unsigned char *) done_queue; in qlogicpti_intr_handler()
1199 qpti->res_out_ptr = out_ptr; in qlogicpti_intr_handler()
1210 spin_lock_irqsave(qpti->qhost->host_lock, flags); in qpti_intr()
1217 next = (struct scsi_cmnd *) dq->host_scribble; in qpti_intr()
1222 spin_unlock_irqrestore(qpti->qhost->host_lock, flags); in qpti_intr()
1230 struct Scsi_Host *host = Cmnd->device->host; in qlogicpti_abort()
1231 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; in qlogicpti_abort()
1237 qpti->qpti_id, (int)Cmnd->device->id, (int)Cmnd->device->lun); in qlogicpti_abort()
1241 /* Find the 32-bit cookie we gave to the firmware for in qlogicpti_abort()
1245 if (qpti->cmd_slots[i] == Cmnd) in qlogicpti_abort()
1250 param[1] = (((u_short) Cmnd->device->id) << 8) | Cmnd->device->lun; in qlogicpti_abort()
1256 qpti->qpti_id, param[0]); in qlogicpti_abort()
1268 struct Scsi_Host *host = Cmnd->device->host; in qlogicpti_reset()
1269 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; in qlogicpti_reset()
1273 qpti->qpti_id); in qlogicpti_reset()
1278 param[1] = qpti->host_param.bus_reset_delay; in qlogicpti_reset()
1282 qpti->qpti_id, param[0]); in qlogicpti_reset()
1307 struct device_node *dp = op->dev.of_node; in qpti_sbus_probe()
1316 if (op->archdata.irqs[0] == 0) in qpti_sbus_probe()
1317 return -ENODEV; in qpti_sbus_probe()
1321 return -ENOMEM; in qpti_sbus_probe()
1325 host->max_id = MAX_TARGETS; in qpti_sbus_probe()
1326 qpti->qhost = host; in qpti_sbus_probe()
1327 qpti->op = op; in qpti_sbus_probe()
1328 qpti->qpti_id = nqptis; in qpti_sbus_probe()
1329 qpti->is_pti = !of_node_name_eq(op->dev.of_node, "QLGC,isp"); in qpti_sbus_probe()
1342 memset(qpti->cmd_slots, 0, sizeof(qpti->cmd_slots)); in qpti_sbus_probe()
1350 if (qpti->is_pti) { in qpti_sbus_probe()
1360 printk("(Firmware v%d.%d.%d)", qpti->fware_majrev, in qpti_sbus_probe()
1361 qpti->fware_minrev, qpti->fware_micrev); in qpti_sbus_probe()
1363 fcode = of_get_property(dp, "isp-fcode", NULL); in qpti_sbus_probe()
1366 qpti->differential = of_property_read_bool(dp, "differential"); in qpti_sbus_probe()
1369 qpti->qpti_id, in qpti_sbus_probe()
1370 (qpti->ultra ? "Ultra" : "Fast"), in qpti_sbus_probe()
1371 (qpti->differential ? "differential" : "single ended")); in qpti_sbus_probe()
1373 if (scsi_add_host(host, &op->dev)) { in qpti_sbus_probe()
1374 printk("qlogicpti%d: Failed scsi_add_host\n", qpti->qpti_id); in qpti_sbus_probe()
1378 dev_set_drvdata(&op->dev, qpti); in qpti_sbus_probe()
1389 dma_free_coherent(&op->dev, in qpti_sbus_probe()
1391 qpti->res_cpu, qpti->res_dvma); in qpti_sbus_probe()
1392 dma_free_coherent(&op->dev, in qpti_sbus_probe()
1394 qpti->req_cpu, qpti->req_dvma); in qpti_sbus_probe()
1398 free_irq(qpti->irq, qpti); in qpti_sbus_probe()
1401 of_iounmap(&op->resource[0], qpti->qregs, in qpti_sbus_probe()
1402 resource_size(&op->resource[0])); in qpti_sbus_probe()
1403 if (qpti->is_pti) in qpti_sbus_probe()
1404 of_iounmap(&op->resource[0], qpti->sreg, in qpti_sbus_probe()
1410 return -ENODEV; in qpti_sbus_probe()
1415 struct qlogicpti *qpti = dev_get_drvdata(&op->dev); in qpti_sbus_remove()
1419 scsi_remove_host(qpti->qhost); in qpti_sbus_remove()
1422 sbus_writew(0, qpti->qregs + SBUS_CTRL); in qpti_sbus_remove()
1425 free_irq(qpti->irq, qpti); in qpti_sbus_remove()
1428 dma_free_coherent(&op->dev, in qpti_sbus_remove()
1430 qpti->res_cpu, qpti->res_dvma); in qpti_sbus_remove()
1431 dma_free_coherent(&op->dev, in qpti_sbus_remove()
1433 qpti->req_cpu, qpti->req_dvma); in qpti_sbus_remove()
1436 of_iounmap(&op->resource[0], qpti->qregs, in qpti_sbus_remove()
1437 resource_size(&op->resource[0])); in qpti_sbus_remove()
1438 if (qpti->is_pti) in qpti_sbus_remove()
1439 of_iounmap(&op->resource[0], qpti->sreg, sizeof(unsigned char)); in qpti_sbus_remove()
1441 scsi_host_put(qpti->qhost); in qpti_sbus_remove()