• Home
  • Raw
  • Download

Lines Matching +full:host +full:- +full:command

1 /* -*- mode: c; c-basic-offset: 8 -*- */
3 /* NCR (or Symbios) 53c700 and 53c700-66 Driver
6 **-----------------------------------------------------------------------------
22 **-----------------------------------------------------------------------------
33 * The 700-66 can at least do synchronous SCSI up to 10MHz.
35 * The 700 chip has no host bus interface logic of its own. However,
40 * minimal wrapper for the purpose---see the NCR_D700 driver for
58 * bad bug having to do with 10 byte command processing and REQUEST
59 * SENSE (the command would loop forever getting a transfer length
67 * Bogendoerfer). Added missing SCp->request_bufflen initialisation
86 * Added support for the 53c710 chip (in 53c700 emulation mode only---no
148 * a non dereferenceable pointer to point to a structure in dma-able
162 MODULE_DESCRIPTION("53c700 and 53c700-66 Driver");
172 STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
173 STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
186 "before command phase",
187 "after command phase",
241 * NOTE: According to SCSI-2, the true transfer period (in ns) is
249 __u8 min_xferp = (hostdata->chip710 in NCR_700_offset_period_to_sxfer()
251 __u8 max_offset = (hostdata->chip710 in NCR_700_offset_period_to_sxfer()
257 if(period < hostdata->min_period) { in NCR_700_offset_period_to_sxfer()
259 period = hostdata->min_period; in NCR_700_offset_period_to_sxfer()
261 XFERP = (period*4 * hostdata->sync_clock)/1000 - 4; in NCR_700_offset_period_to_sxfer()
277 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0]; in NCR_700_get_SXFER()
280 spi_offset(SDp->sdev_target), in NCR_700_get_SXFER()
281 spi_period(SDp->sdev_target)); in NCR_700_get_SXFER()
291 struct Scsi_Host *host; in NCR_700_detect() local
295 if(tpnt->sdev_attrs == NULL) in NCR_700_detect()
296 tpnt->sdev_attrs = NCR_700_dev_attrs; in NCR_700_detect()
306 hostdata->msgin = memory + MSGIN_OFFSET; in NCR_700_detect()
307 hostdata->msgout = memory + MSGOUT_OFFSET; in NCR_700_detect()
308 hostdata->status = memory + STATUS_OFFSET; in NCR_700_detect()
309 hostdata->slots = (struct NCR_700_command_slot *)(memory + SLOTS_OFFSET); in NCR_700_detect()
310 hostdata->dev = dev; in NCR_700_detect()
314 /* Fill in the missing routines from the host template */ in NCR_700_detect()
315 tpnt->queuecommand = NCR_700_queuecommand; in NCR_700_detect()
316 tpnt->eh_abort_handler = NCR_700_abort; in NCR_700_detect()
317 tpnt->eh_host_reset_handler = NCR_700_host_reset; in NCR_700_detect()
318 tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST; in NCR_700_detect()
319 tpnt->sg_tablesize = NCR_700_SG_SEGMENTS; in NCR_700_detect()
320 tpnt->cmd_per_lun = NCR_700_CMD_PER_LUN; in NCR_700_detect()
321 tpnt->use_clustering = ENABLE_CLUSTERING; in NCR_700_detect()
322 tpnt->slave_configure = NCR_700_slave_configure; in NCR_700_detect()
323 tpnt->slave_destroy = NCR_700_slave_destroy; in NCR_700_detect()
324 tpnt->slave_alloc = NCR_700_slave_alloc; in NCR_700_detect()
325 tpnt->change_queue_depth = NCR_700_change_queue_depth; in NCR_700_detect()
327 if(tpnt->name == NULL) in NCR_700_detect()
328 tpnt->name = "53c700"; in NCR_700_detect()
329 if(tpnt->proc_name == NULL) in NCR_700_detect()
330 tpnt->proc_name = "53c700"; in NCR_700_detect()
332 host = scsi_host_alloc(tpnt, 4); in NCR_700_detect()
333 if (!host) in NCR_700_detect()
335 memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot) in NCR_700_detect()
338 dma_addr_t offset = (dma_addr_t)((unsigned long)&hostdata->slots[j].SG[0] in NCR_700_detect()
339 - (unsigned long)&hostdata->slots[0].SG[0]); in NCR_700_detect()
340 hostdata->slots[j].pSG = (struct NCR_700_SG_List *)((unsigned long)(pSlots + offset)); in NCR_700_detect()
342 hostdata->free_list = &hostdata->slots[j]; in NCR_700_detect()
344 hostdata->slots[j-1].ITL_forw = &hostdata->slots[j]; in NCR_700_detect()
345 hostdata->slots[j].state = NCR_700_SLOT_FREE; in NCR_700_detect()
355 script_patch_32(hostdata->dev, script, MessageLocation, in NCR_700_detect()
357 script_patch_32(hostdata->dev, script, StatusAddress, in NCR_700_detect()
359 script_patch_32(hostdata->dev, script, ReceiveMsgAddress, in NCR_700_detect()
362 hostdata->script = script; in NCR_700_detect()
363 hostdata->pScript = pScript; in NCR_700_detect()
364 dma_sync_single_for_device(hostdata->dev, pScript, sizeof(SCRIPT), DMA_TO_DEVICE); in NCR_700_detect()
365 hostdata->state = NCR_700_HOST_FREE; in NCR_700_detect()
366 hostdata->cmd = NULL; in NCR_700_detect()
367 host->max_id = 8; in NCR_700_detect()
368 host->max_lun = NCR_700_MAX_LUNS; in NCR_700_detect()
370 host->transportt = NCR_700_transport_template; in NCR_700_detect()
371 host->unique_id = (unsigned long)hostdata->base; in NCR_700_detect()
372 hostdata->eh_complete = NULL; in NCR_700_detect()
373 host->hostdata[0] = (unsigned long)hostdata; in NCR_700_detect()
375 NCR_700_writeb(0xff, host, CTEST9_REG); in NCR_700_detect()
376 if (hostdata->chip710) in NCR_700_detect()
377 hostdata->rev = (NCR_700_readb(host, CTEST8_REG)>>4) & 0x0f; in NCR_700_detect()
379 hostdata->rev = (NCR_700_readb(host, CTEST7_REG)>>4) & 0x0f; in NCR_700_detect()
380 hostdata->fast = (NCR_700_readb(host, CTEST9_REG) == 0); in NCR_700_detect()
385 printk(KERN_NOTICE "scsi%d: %s rev %d %s\n", host->host_no, in NCR_700_detect()
386 hostdata->chip710 ? "53c710" : in NCR_700_detect()
387 (hostdata->fast ? "53c700-66" : "53c700"), in NCR_700_detect()
388 hostdata->rev, hostdata->differential ? in NCR_700_detect()
391 NCR_700_chip_reset(host); in NCR_700_detect()
393 if (scsi_add_host(host, dev)) { in NCR_700_detect()
395 scsi_host_put(host); in NCR_700_detect()
399 spi_signalling(host) = hostdata->differential ? SPI_SIGNAL_HVD : in NCR_700_detect()
402 return host; in NCR_700_detect()
406 NCR_700_release(struct Scsi_Host *host) in NCR_700_release() argument
409 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_release()
411 dma_free_attrs(hostdata->dev, TOTAL_MEM_SIZE, hostdata->script, in NCR_700_release()
412 hostdata->pScript, DMA_ATTR_NON_CONSISTENT); in NCR_700_release()
425 * Function : static int data_residual (Scsi_Host *host)
433 * Inputs : host - SCSI host */
435 NCR_700_data_residual (struct Scsi_Host *host) { in NCR_700_data_residual() argument
437 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_data_residual()
441 if(hostdata->chip710) { in NCR_700_data_residual()
442 count = ((NCR_700_readb(host, DFIFO_REG) & 0x7f) - in NCR_700_data_residual()
443 (NCR_700_readl(host, DBC_REG) & 0x7f)) & 0x7f; in NCR_700_data_residual()
445 count = ((NCR_700_readb(host, DFIFO_REG) & 0x3f) - in NCR_700_data_residual()
446 (NCR_700_readl(host, DBC_REG) & 0x3f)) & 0x3f; in NCR_700_data_residual()
449 if(hostdata->fast) in NCR_700_data_residual()
450 synchronous = NCR_700_readb(host, SXFER_REG) & 0x0f; in NCR_700_data_residual()
453 ddir = NCR_700_readb(host, CTEST0_REG) & 0x01; in NCR_700_data_residual()
458 count += (NCR_700_readb(host, SSTAT2_REG) & 0xf0) >> 4; in NCR_700_data_residual()
460 if (NCR_700_readb(host, SSTAT1_REG) & SIDL_REG_FULL) in NCR_700_data_residual()
464 __u8 sstat = NCR_700_readb(host, SSTAT1_REG); in NCR_700_data_residual()
508 struct NCR_700_command_slot *slot = hostdata->free_list; in find_empty_slot()
512 if(hostdata->command_slot_count != NCR_700_COMMAND_SLOTS_PER_HOST) in find_empty_slot()
513 …printk(KERN_ERR "SLOTS FULL, but count is %d, should be %d\n", hostdata->command_slot_count, NCR_7… in find_empty_slot()
517 if(slot->state != NCR_700_SLOT_FREE) in find_empty_slot()
522 hostdata->free_list = slot->ITL_forw; in find_empty_slot()
523 slot->ITL_forw = NULL; in find_empty_slot()
528 * finish routine. If we cannot queue the command when it in find_empty_slot()
530 slot->state = NCR_700_SLOT_BUSY; in find_empty_slot()
531 slot->flags = 0; in find_empty_slot()
532 hostdata->command_slot_count++; in find_empty_slot()
541 if((slot->state & NCR_700_SLOT_MASK) != NCR_700_SLOT_MAGIC) { in free_slot()
544 if(slot->state == NCR_700_SLOT_FREE) { in free_slot()
548 slot->resume_offset = 0; in free_slot()
549 slot->cmnd = NULL; in free_slot()
550 slot->state = NCR_700_SLOT_FREE; in free_slot()
551 slot->ITL_forw = hostdata->free_list; in free_slot()
552 hostdata->free_list = slot; in free_slot()
553 hostdata->command_slot_count--; in free_slot()
557 /* This routine really does very little. The command is indexed on
566 (struct NCR_700_command_slot *)SCp->host_scribble; in save_for_reselection()
568 slot->resume_offset = dsp; in save_for_reselection()
570 hostdata->state = NCR_700_HOST_FREE; in save_for_reselection()
571 hostdata->cmd = NULL; in save_for_reselection()
578 if(SCp->sc_data_direction != DMA_NONE && in NCR_700_unmap()
579 SCp->sc_data_direction != DMA_BIDIRECTIONAL) in NCR_700_unmap()
587 hostdata->state = NCR_700_HOST_FREE; in NCR_700_scsi_done()
588 hostdata->cmd = NULL; in NCR_700_scsi_done()
592 (struct NCR_700_command_slot *)SCp->host_scribble; in NCR_700_scsi_done()
594 dma_unmap_single(hostdata->dev, slot->pCmd, in NCR_700_scsi_done()
596 if (slot->flags == NCR_700_FLAG_AUTOSENSE) { in NCR_700_scsi_done()
597 char *cmnd = NCR_700_get_sense_cmnd(SCp->device); in NCR_700_scsi_done()
599 dma_unmap_single(hostdata->dev, slot->dma_handle, in NCR_700_scsi_done()
606 SCp->cmd_len = cmnd[8]; in NCR_700_scsi_done()
612 if(NCR_700_get_depth(SCp->device) == 0 || in NCR_700_scsi_done()
613 NCR_700_get_depth(SCp->device) > SCp->device->queue_depth) in NCR_700_scsi_done()
615 NCR_700_get_depth(SCp->device)); in NCR_700_scsi_done()
617 NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) - 1); in NCR_700_scsi_done()
619 SCp->host_scribble = NULL; in NCR_700_scsi_done()
620 SCp->result = result; in NCR_700_scsi_done()
621 SCp->scsi_done(SCp); in NCR_700_scsi_done()
629 NCR_700_internal_bus_reset(struct Scsi_Host *host) in NCR_700_internal_bus_reset() argument
632 NCR_700_writeb(ASSERT_RST, host, SCNTL1_REG); in NCR_700_internal_bus_reset()
634 NCR_700_writeb(0, host, SCNTL1_REG); in NCR_700_internal_bus_reset()
639 NCR_700_chip_setup(struct Scsi_Host *host) in NCR_700_chip_setup() argument
642 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_chip_setup()
644 __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP); in NCR_700_chip_setup()
646 if(hostdata->chip710) { in NCR_700_chip_setup()
650 switch (hostdata->burst_length) { in NCR_700_chip_setup()
667 hostdata->dcntl_extra |= COMPAT_700_MODE; in NCR_700_chip_setup()
669 NCR_700_writeb(hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
670 NCR_700_writeb(burst_length | hostdata->dmode_extra, in NCR_700_chip_setup()
671 host, DMODE_710_REG); in NCR_700_chip_setup()
672 NCR_700_writeb(burst_disable | hostdata->ctest7_extra | in NCR_700_chip_setup()
673 (hostdata->differential ? DIFF : 0), in NCR_700_chip_setup()
674 host, CTEST7_REG); in NCR_700_chip_setup()
675 NCR_700_writeb(BTB_TIMER_DISABLE, host, CTEST0_REG); in NCR_700_chip_setup()
677 | AUTO_ATN, host, SCNTL0_REG); in NCR_700_chip_setup()
679 NCR_700_writeb(BURST_LENGTH_8 | hostdata->dmode_extra, in NCR_700_chip_setup()
680 host, DMODE_700_REG); in NCR_700_chip_setup()
681 NCR_700_writeb(hostdata->differential ? in NCR_700_chip_setup()
682 DIFF : 0, host, CTEST7_REG); in NCR_700_chip_setup()
683 if(hostdata->fast) { in NCR_700_chip_setup()
684 /* this is for 700-66, does nothing on 700 */ in NCR_700_chip_setup()
686 | GENERATE_RECEIVE_PARITY, host, in NCR_700_chip_setup()
690 | PARITY | AUTO_ATN, host, SCNTL0_REG); in NCR_700_chip_setup()
694 NCR_700_writeb(1 << host->this_id, host, SCID_REG); in NCR_700_chip_setup()
695 NCR_700_writeb(0, host, SBCL_REG); in NCR_700_chip_setup()
696 NCR_700_writeb(ASYNC_OPERATION, host, SXFER_REG); in NCR_700_chip_setup()
699 | RST_INT | PAR_ERR_INT | SELECT_INT, host, SIEN_REG); in NCR_700_chip_setup()
701 NCR_700_writeb(ABORT_INT | INT_INST_INT | ILGL_INST_INT, host, DIEN_REG); in NCR_700_chip_setup()
702 NCR_700_writeb(ENABLE_SELECT, host, SCNTL1_REG); in NCR_700_chip_setup()
703 if(hostdata->clock > 75) { in NCR_700_chip_setup()
704 …lock speed %dMHz is too high: 75Mhz is the maximum this chip can be driven at\n", hostdata->clock); in NCR_700_chip_setup()
708 NCR_700_writeb(SYNC_DIV_2_0, host, SBCL_REG); in NCR_700_chip_setup()
709 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
710 hostdata->sync_clock = hostdata->clock/2; in NCR_700_chip_setup()
711 } else if(hostdata->clock > 50 && hostdata->clock <= 75) { in NCR_700_chip_setup()
714 NCR_700_writeb(SYNC_DIV_1_5, host, SBCL_REG); in NCR_700_chip_setup()
715 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
716 hostdata->sync_clock = hostdata->clock*2; in NCR_700_chip_setup()
717 hostdata->sync_clock /= 3; in NCR_700_chip_setup()
719 } else if(hostdata->clock > 37 && hostdata->clock <= 50) { in NCR_700_chip_setup()
722 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG); in NCR_700_chip_setup()
723 NCR_700_writeb(ASYNC_DIV_2_0 | hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
724 hostdata->sync_clock = hostdata->clock; in NCR_700_chip_setup()
725 } else if(hostdata->clock > 25 && hostdata->clock <=37) { in NCR_700_chip_setup()
728 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG); in NCR_700_chip_setup()
729 NCR_700_writeb(ASYNC_DIV_1_5 | hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
730 hostdata->sync_clock = hostdata->clock; in NCR_700_chip_setup()
733 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG); in NCR_700_chip_setup()
734 NCR_700_writeb(ASYNC_DIV_1_0 | hostdata->dcntl_extra, host, DCNTL_REG); in NCR_700_chip_setup()
736 hostdata->sync_clock = hostdata->clock; in NCR_700_chip_setup()
742 min_period = 1000*(4+min_xferp)/(4*hostdata->sync_clock); in NCR_700_chip_setup()
743 hostdata->min_period = NCR_700_MIN_PERIOD; in NCR_700_chip_setup()
745 hostdata->min_period = min_period; in NCR_700_chip_setup()
749 NCR_700_chip_reset(struct Scsi_Host *host) in NCR_700_chip_reset() argument
752 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_chip_reset()
753 if(hostdata->chip710) { in NCR_700_chip_reset()
754 NCR_700_writeb(SOFTWARE_RESET_710, host, ISTAT_REG); in NCR_700_chip_reset()
757 NCR_700_writeb(0, host, ISTAT_REG); in NCR_700_chip_reset()
759 NCR_700_writeb(SOFTWARE_RESET, host, DCNTL_REG); in NCR_700_chip_reset()
762 NCR_700_writeb(0, host, DCNTL_REG); in NCR_700_chip_reset()
767 NCR_700_chip_setup(host); in NCR_700_chip_reset()
777 process_extended_message(struct Scsi_Host *host, in process_extended_message() argument
785 pun = SCp->device->id; in process_extended_message()
786 lun = SCp->device->lun; in process_extended_message()
789 switch(hostdata->msgin[2]) { in process_extended_message()
791 if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) { in process_extended_message()
792 struct scsi_target *starget = SCp->device->sdev_target; in process_extended_message()
793 __u8 period = hostdata->msgin[3]; in process_extended_message()
794 __u8 offset = hostdata->msgin[4]; in process_extended_message()
804 if(NCR_700_is_flag_set(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION)) { in process_extended_message()
806 NCR_700_clear_flag(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION); in process_extended_message()
809 NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC); in process_extended_message()
810 NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION); in process_extended_message()
812 NCR_700_writeb(NCR_700_get_SXFER(SCp->device), in process_extended_message()
813 host, SXFER_REG); in process_extended_message()
817 shost_printk(KERN_WARNING, host, in process_extended_message()
819 hostdata->msgout[0] = A_REJECT_MSG; in process_extended_message()
820 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); in process_extended_message()
821 script_patch_16(hostdata->dev, hostdata->script, in process_extended_message()
825 resume_offset = hostdata->pScript + Ent_SendMessageWithATN; in process_extended_message()
831 host->host_no, pun, lun); in process_extended_message()
832 hostdata->msgout[0] = A_REJECT_MSG; in process_extended_message()
833 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); in process_extended_message()
834 script_patch_16(hostdata->dev, hostdata->script, MessageCount, in process_extended_message()
836 resume_offset = hostdata->pScript + Ent_SendMessageWithATN; in process_extended_message()
842 host->host_no, pun, lun, in process_extended_message()
844 spi_print_msg(hostdata->msgin); in process_extended_message()
847 hostdata->msgout[0] = A_REJECT_MSG; in process_extended_message()
848 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); in process_extended_message()
849 script_patch_16(hostdata->dev, hostdata->script, MessageCount, in process_extended_message()
853 resume_offset = hostdata->pScript + Ent_SendMessageWithATN; in process_extended_message()
855 NCR_700_writel(temp, host, TEMP_REG); in process_extended_message()
860 process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata, in process_message() argument
868 pun = SCp->device->id; in process_message()
869 lun = SCp->device->lun; in process_message()
873 printk("scsi%d (%d:%d): message %s: ", host->host_no, pun, lun, in process_message()
875 spi_print_msg(hostdata->msgin); in process_message()
879 switch(hostdata->msgin[0]) { in process_message()
882 resume_offset = process_extended_message(host, hostdata, SCp, in process_message()
887 if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) { in process_message()
889 spi_period(SCp->device->sdev_target) = in process_message()
890 spi_offset(SCp->device->sdev_target) = 0; in process_message()
891 NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC); in process_message()
892 NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION); in process_message()
893 …} else if(SCp != NULL && NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION)… in process_message()
898 NCR_700_set_tag_neg_state(SCp->device, NCR_700_FINISHED_TAG_NEGOTIATION); in process_message()
899 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); in process_message()
901 SCp->device->tagged_supported = 0; in process_message()
902 SCp->device->simple_tags = 0; in process_message()
903 scsi_change_queue_depth(SCp->device, host->cmd_per_lun); in process_message()
905 shost_printk(KERN_WARNING, host, in process_message()
914 printk(KERN_ERR "scsi%d (%d:%d) Parity Error!\n", host->host_no, in process_message()
916 NCR_700_internal_bus_reset(host); in process_message()
919 printk(KERN_INFO "scsi%d (%d:%d) SIMPLE TAG %d %s\n", host->host_no, in process_message()
920 pun, lun, hostdata->msgin[1], in process_message()
926 host->host_no, pun, lun, in process_message()
929 spi_print_msg(hostdata->msgin); in process_message()
932 hostdata->msgout[0] = A_REJECT_MSG; in process_message()
933 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); in process_message()
934 script_patch_16(hostdata->dev, hostdata->script, MessageCount, in process_message()
938 resume_offset = hostdata->pScript + Ent_SendMessageWithATN; in process_message()
942 NCR_700_writel(temp, host, TEMP_REG); in process_message()
944 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, DMA_FROM_DEVICE); in process_message()
950 struct Scsi_Host *host, in process_script_interrupt() argument
957 pun = SCp->device->id; in process_script_interrupt()
958 lun = SCp->device->lun; in process_script_interrupt()
962 DEBUG((" COMMAND COMPLETE, status=%02x\n", in process_script_interrupt()
963 hostdata->status[0])); in process_script_interrupt()
965 if (NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION) in process_script_interrupt()
966 NCR_700_set_tag_neg_state(SCp->device, in process_script_interrupt()
970 if(status_byte(hostdata->status[0]) == CHECK_CONDITION || in process_script_interrupt()
971 status_byte(hostdata->status[0]) == COMMAND_TERMINATED) { in process_script_interrupt()
973 (struct NCR_700_command_slot *)SCp->host_scribble; in process_script_interrupt()
974 if(slot->flags == NCR_700_FLAG_AUTOSENSE) { in process_script_interrupt()
979 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]); in process_script_interrupt()
982 NCR_700_get_sense_cmnd(SCp->device); in process_script_interrupt()
986 SCp, hostdata->status[0]); in process_script_interrupt()
988 /* we can destroy the command here in process_script_interrupt()
991 * will re-copy the command from the in process_script_interrupt()
993 * data associated with the command in process_script_interrupt()
996 dma_unmap_single(hostdata->dev, slot->pCmd, in process_script_interrupt()
1007 * REQUEST_SENSE command is six bytes, in process_script_interrupt()
1011 * of the command */ in process_script_interrupt()
1013 cmnd[7] = hostdata->status[0]; in process_script_interrupt()
1014 cmnd[8] = SCp->cmd_len; in process_script_interrupt()
1015 SCp->cmd_len = 6; /* command length for in process_script_interrupt()
1017 slot->pCmd = dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE); in process_script_interrupt()
1018 …slot->dma_handle = dma_map_single(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FRO… in process_script_interrupt()
1019 slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | SCSI_SENSE_BUFFERSIZE); in process_script_interrupt()
1020 slot->SG[0].pAddr = bS_to_host(slot->dma_handle); in process_script_interrupt()
1021 slot->SG[1].ins = bS_to_host(SCRIPT_RETURN); in process_script_interrupt()
1022 slot->SG[1].pAddr = 0; in process_script_interrupt()
1023 slot->resume_offset = hostdata->pScript; in process_script_interrupt()
1024 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG[0])*2, DMA_TO_DEVICE); in process_script_interrupt()
1025 dma_cache_sync(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE); in process_script_interrupt()
1027 /* queue the command for reissue */ in process_script_interrupt()
1028 slot->state = NCR_700_SLOT_QUEUED; in process_script_interrupt()
1029 slot->flags = NCR_700_FLAG_AUTOSENSE; in process_script_interrupt()
1030 hostdata->state = NCR_700_HOST_FREE; in process_script_interrupt()
1031 hostdata->cmd = NULL; in process_script_interrupt()
1037 //if(status_byte(hostdata->status[0]) == GOOD && in process_script_interrupt()
1038 // SCp->cmnd[0] == INQUIRY && SCp->use_sg == 0) { in process_script_interrupt()
1040 // * on this command */ in process_script_interrupt()
1041 // dma_sync_single_for_cpu(hostdata->dev, in process_script_interrupt()
1042 // slot->dma_handle, in process_script_interrupt()
1043 // SCp->request_bufflen, in process_script_interrupt()
1045 // if(((char *)SCp->request_buffer)[7] & 0x02) { in process_script_interrupt()
1047 // "Enabling Tag Command Queuing\n"); in process_script_interrupt()
1048 // hostdata->tag_negotiated |= (1<<scmd_id(SCp)); in process_script_interrupt()
1049 // NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING); in process_script_interrupt()
1051 // NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING); in process_script_interrupt()
1052 // hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); in process_script_interrupt()
1055 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]); in process_script_interrupt()
1062 sbcl_to_string(NCR_700_readb(host, SBCL_REG))); in process_script_interrupt()
1064 SCp->cmd_len); in process_script_interrupt()
1067 NCR_700_internal_bus_reset(host); in process_script_interrupt()
1072 host->host_no, pun, lun, NCR_700_fatal_messages[i]); in process_script_interrupt()
1075 hostdata->msgin[0], hostdata->msgin[1]); in process_script_interrupt()
1077 NCR_700_internal_bus_reset(host); in process_script_interrupt()
1083 host->host_no, pun, lun, in process_script_interrupt()
1091 __u8 reselection_id = hostdata->reselection_id; in process_script_interrupt()
1094 lun = hostdata->msgin[0] & 0x1f; in process_script_interrupt()
1096 hostdata->reselection_id = 0xff; in process_script_interrupt()
1098 host->host_no, reselection_id, lun)); in process_script_interrupt()
1100 SDp = __scsi_device_lookup(host, 0, reselection_id, lun); in process_script_interrupt()
1103 host->host_no, reselection_id, lun); in process_script_interrupt()
1106 if(hostdata->msgin[1] == A_SIMPLE_TAG_MSG) { in process_script_interrupt()
1109 SCp = scsi_host_find_tag(SDp->host, hostdata->msgin[2]); in process_script_interrupt()
1112 host->host_no, reselection_id, lun, hostdata->msgin[2]); in process_script_interrupt()
1116 slot = (struct NCR_700_command_slot *)SCp->host_scribble; in process_script_interrupt()
1119 hostdata->msgin[2], slot, slot->tag); in process_script_interrupt()
1121 struct NCR_700_Device_Parameters *p = SDp->hostdata; in process_script_interrupt()
1122 struct scsi_cmnd *SCp = p->current_cmnd; in process_script_interrupt()
1129 slot = (struct NCR_700_command_slot *)SCp->host_scribble; in process_script_interrupt()
1133 printk(KERN_ERR "scsi%d: (%d:%d) RESELECTED but no saved command (MSG = %02x %02x %02x)!!\n", in process_script_interrupt()
1134 host->host_no, reselection_id, lun, in process_script_interrupt()
1135 hostdata->msgin[0], hostdata->msgin[1], in process_script_interrupt()
1136 hostdata->msgin[2]); in process_script_interrupt()
1138 if(hostdata->state != NCR_700_HOST_BUSY) in process_script_interrupt()
1139 printk(KERN_ERR "scsi%d: FATAL, host not busy during valid reselection!\n", in process_script_interrupt()
1140 host->host_no); in process_script_interrupt()
1141 resume_offset = slot->resume_offset; in process_script_interrupt()
1142 hostdata->cmd = slot->cmnd; in process_script_interrupt()
1144 /* re-patch for this command */ in process_script_interrupt()
1145 script_patch_32_abs(hostdata->dev, hostdata->script, in process_script_interrupt()
1146 CommandAddress, slot->pCmd); in process_script_interrupt()
1147 script_patch_16(hostdata->dev, hostdata->script, in process_script_interrupt()
1148 CommandCount, slot->cmnd->cmd_len); in process_script_interrupt()
1149 script_patch_32_abs(hostdata->dev, hostdata->script, in process_script_interrupt()
1151 to32bit(&slot->pSG[0].ins)); in process_script_interrupt()
1158 NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device), in process_script_interrupt()
1159 host, SXFER_REG); in process_script_interrupt()
1160 dma_cache_sync(hostdata->dev, hostdata->msgin, in process_script_interrupt()
1162 dma_cache_sync(hostdata->dev, hostdata->msgout, in process_script_interrupt()
1164 /* I'm just being paranoid here, the command should in process_script_interrupt()
1166 dma_cache_sync(hostdata->dev, slot->cmnd->cmnd, in process_script_interrupt()
1167 slot->cmnd->cmd_len, DMA_TO_DEVICE); in process_script_interrupt()
1181 __u8 reselection_id = NCR_700_readb(host, SFBR_REG); in process_script_interrupt()
1185 reselection_id &= ~(1<<host->this_id); in process_script_interrupt()
1190host->host_no, reselection_id, lun, dsp, dsp - hostdata->pScript, hostdata->state, hostdata->comma… in process_script_interrupt()
1194 __u32 SG = (__u32)bS_to_cpu(hostdata->script[A_SGScriptStartAddress_used[0]]); in process_script_interrupt()
1198 if(SG >= to32bit(&hostdata->slots[i].pSG[0]) in process_script_interrupt()
1199 && SG <= to32bit(&hostdata->slots[i].pSG[NCR_700_SG_SEGMENTS])) in process_script_interrupt()
1202 …eing %08x in slot %p, cmd %p, slot->resume_offset=%08x\n", SG, &hostdata->slots[i], hostdata->slot… in process_script_interrupt()
1203 SCp = hostdata->slots[i].cmnd; in process_script_interrupt()
1207 slot = (struct NCR_700_command_slot *)SCp->host_scribble; in process_script_interrupt()
1208 /* change slot from busy to queued to redo command */ in process_script_interrupt()
1209 slot->state = NCR_700_SLOT_QUEUED; in process_script_interrupt()
1211 hostdata->cmd = NULL; in process_script_interrupt()
1214 if(hostdata->reselection_id == 0xff) { in process_script_interrupt()
1215 printk(KERN_ERR "scsi%d: Invalid reselection during selection!!\n", host->host_no); in process_script_interrupt()
1219 host->host_no); in process_script_interrupt()
1220 reselection_id = hostdata->reselection_id; in process_script_interrupt()
1227 hostdata->reselection_id = reselection_id; in process_script_interrupt()
1229 hostdata->msgin[1] = 0; in process_script_interrupt()
1230 dma_cache_sync(hostdata->dev, hostdata->msgin, in process_script_interrupt()
1232 if(hostdata->tag_negotiated & (1<<reselection_id)) { in process_script_interrupt()
1233 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag; in process_script_interrupt()
1235 resume_offset = hostdata->pScript + Ent_GetReselectionData; in process_script_interrupt()
1239 * a return here will re-run the queued command slot in process_script_interrupt()
1243 resume_offset = process_message(host, hostdata, SCp, in process_script_interrupt()
1248 host->host_no, pun, lun, NCR_700_condition[i], in process_script_interrupt()
1249 NCR_700_phase[j], dsp - hostdata->pScript); in process_script_interrupt()
1255 …08x\n", i, sg->length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NC… in process_script_interrupt()
1258 NCR_700_internal_bus_reset(host); in process_script_interrupt()
1261 host->host_no, pun, lun, dsps & 0xfff, dsp, dsp - hostdata->pScript); in process_script_interrupt()
1265 host->host_no, pun, lun, dsps, dsp - hostdata->pScript); in process_script_interrupt()
1266 NCR_700_internal_bus_reset(host); in process_script_interrupt()
1279 process_selection(struct Scsi_Host *host, __u32 dsp) in process_selection() argument
1285 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in process_selection()
1286 struct scsi_cmnd *SCp = hostdata->cmd; in process_selection()
1290 id = NCR_700_readb(host, hostdata->chip710 ? in process_selection()
1294 id &= ~(1<<host->this_id); in process_selection()
1299 sbcl = NCR_700_readb(host, SBCL_REG); in process_selection()
1305 hostdata->reselection_id = id = bitmap_to_number(id); in process_selection()
1307 host->host_no, id)); in process_selection()
1309 if(hostdata->state == NCR_700_HOST_BUSY && SCp != NULL) { in process_selection()
1311 (struct NCR_700_command_slot *)SCp->host_scribble; in process_selection()
1312 …G: RESELECTION OF BUSY HOST, saving cmd %p, slot %p, addr %x [%04x], resume %x!\n", id, hostdata->… in process_selection()
1314 switch(dsp - hostdata->pScript) { in process_selection()
1317 save_for_reselection(hostdata, SCp, Ent_Disconnect2 + hostdata->pScript); in process_selection()
1321 save_for_reselection(hostdata, SCp, Ent_Disconnect4 + hostdata->pScript); in process_selection()
1325 save_for_reselection(hostdata, SCp, Ent_Disconnect6 + hostdata->pScript); in process_selection()
1329 save_for_reselection(hostdata, SCp, Ent_Disconnect8 + hostdata->pScript); in process_selection()
1333 process_script_interrupt(A_GOOD_STATUS_AFTER_STATUS, dsp, SCp, host, hostdata); in process_selection()
1337 slot->state = NCR_700_SLOT_QUEUED; in process_selection()
1341 hostdata->state = NCR_700_HOST_BUSY; in process_selection()
1342 hostdata->cmd = NULL; in process_selection()
1344 hostdata->msgin[1] = 0; in process_selection()
1345 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, in process_selection()
1350 resume_offset = hostdata->pScript + Ent_SelectedAsTarget; in process_selection()
1351 } else if(hostdata->tag_negotiated & (1<<id)) { in process_selection()
1352 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag; in process_selection()
1354 resume_offset = hostdata->pScript + Ent_GetReselectionData; in process_selection()
1360 NCR_700_clear_fifo(struct Scsi_Host *host) { in NCR_700_clear_fifo() argument
1362 = (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_clear_fifo()
1363 if(hostdata->chip710) { in NCR_700_clear_fifo()
1364 NCR_700_writeb(CLR_FIFO_710, host, CTEST8_REG); in NCR_700_clear_fifo()
1366 NCR_700_writeb(CLR_FIFO, host, DFIFO_REG); in NCR_700_clear_fifo()
1371 NCR_700_flush_fifo(struct Scsi_Host *host) { in NCR_700_flush_fifo() argument
1373 = (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_flush_fifo()
1374 if(hostdata->chip710) { in NCR_700_flush_fifo()
1375 NCR_700_writeb(FLUSH_DMA_FIFO_710, host, CTEST8_REG); in NCR_700_flush_fifo()
1377 NCR_700_writeb(0, host, CTEST8_REG); in NCR_700_flush_fifo()
1379 NCR_700_writeb(FLUSH_DMA_FIFO, host, DFIFO_REG); in NCR_700_flush_fifo()
1381 NCR_700_writeb(0, host, DFIFO_REG); in NCR_700_flush_fifo()
1392 (struct NCR_700_command_slot *)SCp->host_scribble; in NCR_700_start_command()
1394 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0]; in NCR_700_start_command()
1396 u8 lun = SCp->device->lun; in NCR_700_start_command()
1398 if(hostdata->state != NCR_700_HOST_FREE) { in NCR_700_start_command()
1400 * the running command finishes on another CPU while we don't in NCR_700_start_command()
1402 slot->state = NCR_700_SLOT_QUEUED; in NCR_700_start_command()
1404 DEBUG(("scsi%d: host busy, queueing command %p, slot %p\n", in NCR_700_start_command()
1405 SCp->device->host->host_no, slot->cmnd, slot)); in NCR_700_start_command()
1408 hostdata->state = NCR_700_HOST_BUSY; in NCR_700_start_command()
1409 hostdata->cmd = SCp; in NCR_700_start_command()
1410 slot->state = NCR_700_SLOT_BUSY; in NCR_700_start_command()
1411 /* keep interrupts disabled until we have the command correctly in NCR_700_start_command()
1414 hostdata->msgout[0] = NCR_700_identify((SCp->cmnd[0] != REQUEST_SENSE && in NCR_700_start_command()
1415 slot->flags != NCR_700_FLAG_AUTOSENSE), in NCR_700_start_command()
1420 if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE || in NCR_700_start_command()
1421 slot->flags == NCR_700_FLAG_AUTOSENSE) { in NCR_700_start_command()
1422 NCR_700_clear_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC); in NCR_700_start_command()
1429 if((hostdata->tag_negotiated & (1<<scmd_id(SCp))) in NCR_700_start_command()
1430 && (slot->tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE && in NCR_700_start_command()
1431 slot->flags != NCR_700_FLAG_AUTOSENSE)) { in NCR_700_start_command()
1432 count += spi_populate_tag_msg(&hostdata->msgout[count], SCp); in NCR_700_start_command()
1435 if(hostdata->fast && in NCR_700_start_command()
1436 NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC)) { in NCR_700_start_command()
1437 count += spi_populate_sync_msg(&hostdata->msgout[count], in NCR_700_start_command()
1438 spi_period(SCp->device->sdev_target), in NCR_700_start_command()
1439 spi_offset(SCp->device->sdev_target)); in NCR_700_start_command()
1440 NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION); in NCR_700_start_command()
1443 script_patch_16(hostdata->dev, hostdata->script, MessageCount, count); in NCR_700_start_command()
1446 script_patch_ID(hostdata->dev, hostdata->script, in NCR_700_start_command()
1449 script_patch_32_abs(hostdata->dev, hostdata->script, CommandAddress, in NCR_700_start_command()
1450 slot->pCmd); in NCR_700_start_command()
1451 script_patch_16(hostdata->dev, hostdata->script, CommandCount, in NCR_700_start_command()
1452 SCp->cmd_len); in NCR_700_start_command()
1455 script_patch_32_abs(hostdata->dev, hostdata->script, in NCR_700_start_command()
1456 SGScriptStartAddress, to32bit(&slot->pSG[0].ins)); in NCR_700_start_command()
1457 NCR_700_clear_fifo(SCp->device->host); in NCR_700_start_command()
1459 if(slot->resume_offset == 0) in NCR_700_start_command()
1460 slot->resume_offset = hostdata->pScript; in NCR_700_start_command()
1462 dma_cache_sync(hostdata->dev, hostdata->msgout, count, DMA_TO_DEVICE); in NCR_700_start_command()
1463 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, in NCR_700_start_command()
1465 dma_cache_sync(hostdata->dev, SCp->cmnd, SCp->cmd_len, DMA_TO_DEVICE); in NCR_700_start_command()
1466 dma_cache_sync(hostdata->dev, hostdata->status, 1, DMA_FROM_DEVICE); in NCR_700_start_command()
1469 NCR_700_writeb(NCR_700_get_SXFER(SCp->device), in NCR_700_start_command()
1470 SCp->device->host, SXFER_REG); in NCR_700_start_command()
1471 NCR_700_writel(slot->temp, SCp->device->host, TEMP_REG); in NCR_700_start_command()
1472 NCR_700_writel(slot->resume_offset, SCp->device->host, DSP_REG); in NCR_700_start_command()
1480 struct Scsi_Host *host = (struct Scsi_Host *)dev_id; in NCR_700_intr() local
1482 (struct NCR_700_Host_Parameters *)host->hostdata[0]; in NCR_700_intr()
1489 /* Use the host lock to serialise access to the 53c700 in NCR_700_intr()
1492 * need to ensure that for this driver, the host lock and the in NCR_700_intr()
1494 spin_lock_irqsave(host->host_lock, flags); in NCR_700_intr()
1495 if((istat = NCR_700_readb(host, ISTAT_REG)) in NCR_700_intr()
1500 struct scsi_cmnd *SCp = hostdata->cmd; in NCR_700_intr()
1504 state = hostdata->state; in NCR_700_intr()
1505 SCp = hostdata->cmd; in NCR_700_intr()
1510 sstat0 = NCR_700_readb(host, SSTAT0_REG); in NCR_700_intr()
1516 dstat = NCR_700_readb(host, DSTAT_REG); in NCR_700_intr()
1519 dsps = NCR_700_readl(host, DSPS_REG); in NCR_700_intr()
1520 dsp = NCR_700_readl(host, DSP_REG); in NCR_700_intr()
1523 host->host_no, istat, sstat0, dstat, in NCR_700_intr()
1524 (dsp - (__u32)(hostdata->pScript))/4, in NCR_700_intr()
1528 pun = SCp->device->id; in NCR_700_intr()
1529 lun = SCp->device->lun; in NCR_700_intr()
1536 hostdata->state = NCR_700_HOST_BUSY; in NCR_700_intr()
1538 printk(KERN_ERR "scsi%d: Bus Reset detected, executing command %p, slot %p, dsp %08x[%04x]\n", in NCR_700_intr()
1539host->host_no, SCp, SCp == NULL ? NULL : SCp->host_scribble, dsp, dsp - hostdata->pScript); in NCR_700_intr()
1541 scsi_report_bus_reset(host, 0); in NCR_700_intr()
1544 __shost_for_each_device(SDp, host) in NCR_700_intr()
1551 &hostdata->slots[i]; in NCR_700_intr()
1553 if(slot->state == NCR_700_SLOT_FREE) in NCR_700_intr()
1556 SCp = slot->cmnd; in NCR_700_intr()
1557 printk(KERN_ERR " failing command because of reset, slot %p, cmnd %p\n", in NCR_700_intr()
1560 SCp->host_scribble = NULL; in NCR_700_intr()
1561 NCR_700_set_depth(SCp->device, 0); in NCR_700_intr()
1563 * rely on mid-layer guarantees that in NCR_700_intr()
1565 * command again otherwise we'll in NCR_700_intr()
1567 * hostdata->state_lock */ in NCR_700_intr()
1568 SCp->result = DID_RESET << 16; in NCR_700_intr()
1569 SCp->scsi_done(SCp); in NCR_700_intr()
1572 NCR_700_chip_setup(host); in NCR_700_intr()
1574 hostdata->state = NCR_700_HOST_FREE; in NCR_700_intr()
1575 hostdata->cmd = NULL; in NCR_700_intr()
1577 if(hostdata->eh_complete != NULL) in NCR_700_intr()
1578 complete(hostdata->eh_complete); in NCR_700_intr()
1582 host->host_no, pun, lun)); in NCR_700_intr()
1586 (struct NCR_700_command_slot *)SCp->host_scribble; in NCR_700_intr()
1588 if(dsp == Ent_SendMessage + 8 + hostdata->pScript) { in NCR_700_intr()
1592 __u32 temp = NCR_700_readl(host, TEMP_REG); in NCR_700_intr()
1593 …nt count = (hostdata->script[Ent_SendMessage/4] & 0xffffff) - ((NCR_700_readl(host, DBC_REG) & 0xf… in NCR_700_intr()
1594 … %p[%04x], phase %s\n", host->host_no, pun, lun, count, (void *)temp, temp - hostdata->pScript, sb… in NCR_700_intr()
1596 resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch; in NCR_700_intr()
1597 } else if(dsp >= to32bit(&slot->pSG[0].ins) && in NCR_700_intr()
1598 dsp <= to32bit(&slot->pSG[NCR_700_SG_SEGMENTS].ins)) { in NCR_700_intr()
1599 int data_transfer = NCR_700_readl(host, DBC_REG) & 0xffffff; in NCR_700_intr()
1600 int SGcount = (dsp - to32bit(&slot->pSG[0].ins))/sizeof(struct NCR_700_SG_List); in NCR_700_intr()
1601 int residual = NCR_700_data_residual(host); in NCR_700_intr()
1604 __u32 naddr = NCR_700_readl(host, DNAD_REG); in NCR_700_intr()
1606 printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%x\n", in NCR_700_intr()
1607 host->host_no, pun, lun, in NCR_700_intr()
1611 … printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%x, residual %d\n", in NCR_700_intr()
1612 host->host_no, pun, lun, in NCR_700_intr()
1622 SGcount--; in NCR_700_intr()
1624 count = (bS_to_cpu(slot->SG[SGcount].ins) & 0x00ffffff); in NCR_700_intr()
1625 DEBUG(("DATA TRANSFER MISMATCH, count = %d, transferred %d\n", count, count-data_transfer)); in NCR_700_intr()
1626 slot->SG[SGcount].ins &= bS_to_host(0xff000000); in NCR_700_intr()
1627 slot->SG[SGcount].ins |= bS_to_host(data_transfer); in NCR_700_intr()
1628 pAddr = bS_to_cpu(slot->SG[SGcount].pAddr); in NCR_700_intr()
1629 pAddr += (count - data_transfer); in NCR_700_intr()
1632 …transfer mismatch pAddr=%lx, naddr=%lx, data_transfer=%d, residual=%d\n", host->host_no, pun, lun,… in NCR_700_intr()
1635 slot->SG[SGcount].pAddr = bS_to_host(pAddr); in NCR_700_intr()
1639 slot->SG[i].ins = bS_to_host(SCRIPT_NOP); in NCR_700_intr()
1640 slot->SG[i].pAddr = 0; in NCR_700_intr()
1642 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE); in NCR_700_intr()
1644 * the command phase */ in NCR_700_intr()
1645 resume_offset = hostdata->pScript + Ent_MsgInDuringData; in NCR_700_intr()
1647 NCR_700_flush_fifo(host); in NCR_700_intr()
1649 __u8 sbcl = NCR_700_readb(host, SBCL_REG); in NCR_700_intr()
1651 host->host_no, pun, lun, dsp - hostdata->pScript, sbcl_to_string(sbcl)); in NCR_700_intr()
1652 NCR_700_internal_bus_reset(host); in NCR_700_intr()
1657 host->host_no, pun, lun); in NCR_700_intr()
1661 host->host_no, pun, lun); in NCR_700_intr()
1665 host->host_no, pun, lun)); in NCR_700_intr()
1666 resume_offset = process_script_interrupt(dsps, dsp, SCp, host, hostdata); in NCR_700_intr()
1670 host->host_no, pun, lun, in NCR_700_intr()
1671 dsp, dsp - hostdata->pScript); in NCR_700_intr()
1675 host->host_no, pun, lun, dstat); in NCR_700_intr()
1687 * interrupts to complete a command that in NCR_700_intr()
1691 * command. If we guess the reselected in NCR_700_intr()
1692 * command here and prepare it, we only need in NCR_700_intr()
1695 * overhead is much greater than the command in NCR_700_intr()
1698 * only have one outstanding command on a in NCR_700_intr()
1701 resume_offset = process_selection(host, dsp); in NCR_700_intr()
1708 if(hostdata->state != NCR_700_HOST_BUSY) { in NCR_700_intr()
1709 printk(KERN_ERR "scsi%d: Driver error: resume at 0x%08x [0x%04x] with non busy host!\n", in NCR_700_intr()
1710 host->host_no, resume_offset, resume_offset - hostdata->pScript); in NCR_700_intr()
1711 hostdata->state = NCR_700_HOST_BUSY; in NCR_700_intr()
1715 NCR_700_clear_fifo(host); in NCR_700_intr()
1716 NCR_700_writel(resume_offset, host, DSP_REG); in NCR_700_intr()
1718 /* There is probably a technical no-no about this: If we're a in NCR_700_intr()
1721 * check our queued commands here---of course, there shouldn't in NCR_700_intr()
1723 if(hostdata->state == NCR_700_HOST_FREE) { in NCR_700_intr()
1729 int j = (i + hostdata->saved_slot_position) in NCR_700_intr()
1732 if(hostdata->slots[j].state != NCR_700_SLOT_QUEUED) in NCR_700_intr()
1734 if(NCR_700_start_command(hostdata->slots[j].cmnd)) { in NCR_700_intr()
1735 DEBUG(("scsi%d: Issuing saved command slot %p, cmd %p\t\n", in NCR_700_intr()
1736 host->host_no, &hostdata->slots[j], in NCR_700_intr()
1737 hostdata->slots[j].cmnd)); in NCR_700_intr()
1738 hostdata->saved_slot_position = j + 1; in NCR_700_intr()
1745 spin_unlock_irqrestore(host->host_lock, flags); in NCR_700_intr()
1753 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0]; in NCR_700_queuecommand_lck()
1758 if(hostdata->command_slot_count >= NCR_700_COMMAND_SLOTS_PER_HOST) { in NCR_700_queuecommand_lck()
1761 …printk(KERN_WARNING "scsi%d: Command depth has gone over queue depth\n", SCp->device->host->host_n… in NCR_700_queuecommand_lck()
1767 * - The tag negotiated bitmap is clear in NCR_700_queuecommand_lck()
1768 * - The blk layer sent and untagged command in NCR_700_queuecommand_lck()
1770 if(NCR_700_get_depth(SCp->device) != 0 in NCR_700_queuecommand_lck()
1771 && (!(hostdata->tag_negotiated & (1<<scmd_id(SCp))) in NCR_700_queuecommand_lck()
1772 || !(SCp->flags & SCMD_TAGGED))) { in NCR_700_queuecommand_lck()
1774 NCR_700_get_depth(SCp->device)); in NCR_700_queuecommand_lck()
1777 if(NCR_700_get_depth(SCp->device) >= SCp->device->queue_depth) { in NCR_700_queuecommand_lck()
1779 NCR_700_get_depth(SCp->device)); in NCR_700_queuecommand_lck()
1782 NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) + 1); in NCR_700_queuecommand_lck()
1784 /* begin the command here */ in NCR_700_queuecommand_lck()
1789 slot->cmnd = SCp; in NCR_700_queuecommand_lck()
1791 SCp->scsi_done = done; in NCR_700_queuecommand_lck()
1792 SCp->host_scribble = (unsigned char *)slot; in NCR_700_queuecommand_lck()
1793 SCp->SCp.ptr = NULL; in NCR_700_queuecommand_lck()
1794 SCp->SCp.buffer = NULL; in NCR_700_queuecommand_lck()
1797 printk("53c700: scsi%d, command ", SCp->device->host->host_no); in NCR_700_queuecommand_lck()
1800 if ((SCp->flags & SCMD_TAGGED) in NCR_700_queuecommand_lck()
1801 && (hostdata->tag_negotiated &(1<<scmd_id(SCp))) == 0 in NCR_700_queuecommand_lck()
1802 && NCR_700_get_tag_neg_state(SCp->device) == NCR_700_START_TAG_NEGOTIATION) { in NCR_700_queuecommand_lck()
1803 scmd_printk(KERN_ERR, SCp, "Enabling Tag Command Queuing\n"); in NCR_700_queuecommand_lck()
1804 hostdata->tag_negotiated |= (1<<scmd_id(SCp)); in NCR_700_queuecommand_lck()
1805 NCR_700_set_tag_neg_state(SCp->device, NCR_700_DURING_TAG_NEGOTIATION); in NCR_700_queuecommand_lck()
1808 /* here we may have to process an untagged command. The gate in NCR_700_queuecommand_lck()
1814 if (!(SCp->flags & SCMD_TAGGED) in NCR_700_queuecommand_lck()
1815 && (hostdata->tag_negotiated &(1<<scmd_id(SCp)))) { in NCR_700_queuecommand_lck()
1816 scmd_printk(KERN_INFO, SCp, "Disabling Tag Command Queuing\n"); in NCR_700_queuecommand_lck()
1817 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); in NCR_700_queuecommand_lck()
1820 if ((hostdata->tag_negotiated & (1<<scmd_id(SCp))) && in NCR_700_queuecommand_lck()
1821 SCp->device->simple_tags) { in NCR_700_queuecommand_lck()
1822 slot->tag = SCp->request->tag; in NCR_700_queuecommand_lck()
1824 slot->tag, slot); in NCR_700_queuecommand_lck()
1826 struct NCR_700_Device_Parameters *p = SCp->device->hostdata; in NCR_700_queuecommand_lck()
1828 slot->tag = SCSI_NO_TAG; in NCR_700_queuecommand_lck()
1829 /* save current command for reselection */ in NCR_700_queuecommand_lck()
1830 p->current_cmnd = SCp; in NCR_700_queuecommand_lck()
1832 /* sanity check: some of the commands generated by the mid-layer in NCR_700_queuecommand_lck()
1835 SCp->sc_data_direction != DMA_NONE) { in NCR_700_queuecommand_lck()
1837 printk("53c700: Command"); in NCR_700_queuecommand_lck()
1839 printk("Has wrong data direction %d\n", SCp->sc_data_direction); in NCR_700_queuecommand_lck()
1841 SCp->sc_data_direction = DMA_NONE; in NCR_700_queuecommand_lck()
1844 switch (SCp->cmnd[0]) { in NCR_700_queuecommand_lck()
1847 SCp->cmnd[6] = 0; in NCR_700_queuecommand_lck()
1850 /* OK, get it from the command */ in NCR_700_queuecommand_lck()
1851 switch(SCp->sc_data_direction) { in NCR_700_queuecommand_lck()
1854 printk(KERN_ERR "53c700: Unknown command for data direction "); in NCR_700_queuecommand_lck()
1872 direction = SCp->sc_data_direction; in NCR_700_queuecommand_lck()
1887 slot->SG[i].ins = bS_to_host(move_ins | count); in NCR_700_queuecommand_lck()
1889 i, count, slot->SG[i].ins, (unsigned long)vPtr)); in NCR_700_queuecommand_lck()
1890 slot->SG[i].pAddr = bS_to_host(vPtr); in NCR_700_queuecommand_lck()
1892 slot->SG[i].ins = bS_to_host(SCRIPT_RETURN); in NCR_700_queuecommand_lck()
1893 slot->SG[i].pAddr = 0; in NCR_700_queuecommand_lck()
1894 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE); in NCR_700_queuecommand_lck()
1896 (&slot->pSG[i].ins), in NCR_700_queuecommand_lck()
1897 slot->SG[i].ins)); in NCR_700_queuecommand_lck()
1899 slot->resume_offset = 0; in NCR_700_queuecommand_lck()
1900 slot->pCmd = dma_map_single(hostdata->dev, SCp->cmnd, in NCR_700_queuecommand_lck()
1913 scmd_printk(KERN_INFO, SCp, "abort command\n"); in DEF_SCSI_QCMD()
1915 slot = (struct NCR_700_command_slot *)SCp->host_scribble; in DEF_SCSI_QCMD()
1918 /* no outstanding command to abort */ in DEF_SCSI_QCMD()
1920 if(SCp->cmnd[0] == TEST_UNIT_READY) { in DEF_SCSI_QCMD()
1927 * this would leave us with an outstanding command in DEF_SCSI_QCMD()
1931 NCR_700_internal_bus_reset(SCp->device->host); in DEF_SCSI_QCMD()
1943 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0]; in NCR_700_host_reset()
1946 "New error handler wants HOST reset, cmd %p\n\t", SCp); in NCR_700_host_reset()
1952 spin_lock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1953 while (hostdata->eh_complete != NULL) { in NCR_700_host_reset()
1954 spin_unlock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1956 spin_lock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1959 hostdata->eh_complete = &complete; in NCR_700_host_reset()
1960 NCR_700_internal_bus_reset(SCp->device->host); in NCR_700_host_reset()
1961 NCR_700_chip_reset(SCp->device->host); in NCR_700_host_reset()
1963 spin_unlock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1965 spin_lock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1967 hostdata->eh_complete = NULL; in NCR_700_host_reset()
1969 if(hostdata->fast) in NCR_700_host_reset()
1970 spi_schedule_dv_device(SCp->device); in NCR_700_host_reset()
1972 spin_unlock_irq(SCp->device->host->host_lock); in NCR_700_host_reset()
1979 struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent); in NCR_700_set_period()
1981 (struct NCR_700_Host_Parameters *)SHp->hostdata[0]; in NCR_700_set_period()
1983 if(!hostdata->fast) in NCR_700_set_period()
1986 if(period < hostdata->min_period) in NCR_700_set_period()
1987 period = hostdata->min_period; in NCR_700_set_period()
1998 struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent); in NCR_700_set_offset()
2000 (struct NCR_700_Host_Parameters *)SHp->hostdata[0]; in NCR_700_set_offset()
2001 int max_offset = hostdata->chip710 in NCR_700_set_offset()
2004 if(!hostdata->fast) in NCR_700_set_offset()
2011 if(spi_offset(STp) == 0 && (spi_period(STp) < hostdata->min_period || in NCR_700_set_offset()
2013 spi_period(STp) = hostdata->min_period; in NCR_700_set_offset()
2024 SDp->hostdata = kzalloc(sizeof(struct NCR_700_Device_Parameters), in NCR_700_slave_alloc()
2027 if (!SDp->hostdata) in NCR_700_slave_alloc()
2028 return -ENOMEM; in NCR_700_slave_alloc()
2037 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0]; in NCR_700_slave_configure()
2040 if(SDp->tagged_supported) { in NCR_700_slave_configure()
2045 if(hostdata->fast) { in NCR_700_slave_configure()
2047 if (!spi_initial_dv(SDp->sdev_target)) in NCR_700_slave_configure()
2050 spi_offset(SDp->sdev_target) = 0; in NCR_700_slave_configure()
2051 spi_period(SDp->sdev_target) = 0; in NCR_700_slave_configure()
2059 kfree(SDp->hostdata); in NCR_700_slave_destroy()
2060 SDp->hostdata = NULL; in NCR_700_slave_destroy()
2107 return -ENODEV; in NCR_700_init()