Lines Matching +full:use +full:- +full:advanced +full:- +full:sector +full:- +full:protection
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ipr.c -- driver for IBM Power Linux RAID adapters
17 * IBM pSeries: PCI-X Dual Channel Ultra 320 SCSI RAID Adapter
18 * PCI-X Dual Channel Ultra 320 SCSI Adapter
19 * PCI-X Dual Channel Ultra 320 SCSI RAID Enablement Card
23 * - Ultra 320 SCSI controller
24 * - PCI-X host interface
25 * - Embedded PowerPC RISC Processor and Hardware XOR DMA Engine
26 * - Non-Volatile Write Cache
27 * - Supports attachment of non-RAID disks, tape, and optical devices
28 * - RAID Levels 0, 5, 10
29 * - Hot spare
30 * - Background Parity Checking
31 * - Background Data Scrubbing
32 * - Ability to increase the capacity of an existing RAID 5 disk array
36 * - Tagged command queuing
37 * - Adapter microcode download
38 * - PCI hot plug
39 * - SCSI device hot plug
91 { /* Gemstone, Citrine, Obsidian, and Obsidian-E */
192 MODULE_PARM_DESC(max_speed, "Maximum bus speed (0-2). Default: 1=U160. Speeds: 0=80 MB/s, 1=U160, 2…
194 MODULE_PARM_DESC(log_level, "Set to 0 - 4 for increasing verbosity of device driver");
207 …ESC(number_of_msix, "Specify the number of MSIX interrupts to use on capable adapters (1 - 16). (…
243 "FFF9: Device sector reassign successful"},
247 "7001: IOA sector reassignment successful"},
249 "FFF9: Soft media error. Sector reassignment recommended"},
375 "9073: Invalid multi-adapter configuration"},
397 "Illegal request, command not allowed to a non-optimized resource"},
413 "9031: Array protection temporarily suspended, protection resuming"},
415 "9040: Array protection temporarily suspended, protection resuming"},
447 "9074: Asymmetric advanced function disk configuration"},
469 "9041: Array protection temporarily suspended"},
521 "9092: Disk unit requires initialization before use"},
547 { "2104-DL1 ", "XXXXXXXXXXXXXXXX", 80 },
548 { "2104-TL1 ", "XXXXXXXXXXXXXXXX", 80 },
553 { "2104-DU3 ", "XXXXXXXXXXXXXXXX", 160 },
554 { "2104-TU3 ", "XXXXXXXXXXXXXXXX", 160 },
574 * ipr_trc_hook - Add a trace entry to the driver trace
586 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_trc_hook()
589 trace_index = atomic_add_return(1, &ioa_cfg->trace_index) & IPR_TRACE_INDEX_MASK; in ipr_trc_hook()
590 trace_entry = &ioa_cfg->trace[trace_index]; in ipr_trc_hook()
591 trace_entry->time = jiffies; in ipr_trc_hook()
592 trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0]; in ipr_trc_hook()
593 trace_entry->type = type; in ipr_trc_hook()
594 trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff; in ipr_trc_hook()
595 trace_entry->res_handle = ipr_cmd->ioarcb.res_handle; in ipr_trc_hook()
596 trace_entry->u.add_data = add_data; in ipr_trc_hook()
604 * ipr_lock_and_done - Acquire lock and complete command
613 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_lock_and_done()
615 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_lock_and_done()
616 ipr_cmd->done(ipr_cmd); in ipr_lock_and_done()
617 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_lock_and_done()
621 * ipr_reinit_ipr_cmnd - Re-initialize an IPR Cmnd block for reuse
629 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_reinit_ipr_cmnd()
630 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_reinit_ipr_cmnd()
631 dma_addr_t dma_addr = ipr_cmd->dma_addr; in ipr_reinit_ipr_cmnd()
634 hrrq_id = ioarcb->cmd_pkt.hrrq_id; in ipr_reinit_ipr_cmnd()
635 memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt)); in ipr_reinit_ipr_cmnd()
636 ioarcb->cmd_pkt.hrrq_id = hrrq_id; in ipr_reinit_ipr_cmnd()
637 ioarcb->data_transfer_length = 0; in ipr_reinit_ipr_cmnd()
638 ioarcb->read_data_transfer_length = 0; in ipr_reinit_ipr_cmnd()
639 ioarcb->ioadl_len = 0; in ipr_reinit_ipr_cmnd()
640 ioarcb->read_ioadl_len = 0; in ipr_reinit_ipr_cmnd()
642 if (ipr_cmd->ioa_cfg->sis64) { in ipr_reinit_ipr_cmnd()
643 ioarcb->u.sis64_addr_data.data_ioadl_addr = in ipr_reinit_ipr_cmnd()
646 ioarcb->write_ioadl_addr = in ipr_reinit_ipr_cmnd()
648 ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; in ipr_reinit_ipr_cmnd()
651 ioasa->hdr.ioasc = 0; in ipr_reinit_ipr_cmnd()
652 ioasa->hdr.residual_data_len = 0; in ipr_reinit_ipr_cmnd()
653 ipr_cmd->scsi_cmd = NULL; in ipr_reinit_ipr_cmnd()
654 ipr_cmd->sense_buffer[0] = 0; in ipr_reinit_ipr_cmnd()
655 ipr_cmd->dma_use_sg = 0; in ipr_reinit_ipr_cmnd()
659 * ipr_init_ipr_cmnd - Initialize an IPR Cmnd block
661 * @fast_done: fast done function call-back
670 ipr_cmd->u.scratch = 0; in ipr_init_ipr_cmnd()
671 ipr_cmd->sibling = NULL; in ipr_init_ipr_cmnd()
672 ipr_cmd->eh_comp = NULL; in ipr_init_ipr_cmnd()
673 ipr_cmd->fast_done = fast_done; in ipr_init_ipr_cmnd()
674 timer_setup(&ipr_cmd->timer, NULL, 0); in ipr_init_ipr_cmnd()
678 * __ipr_get_free_ipr_cmnd - Get a free IPR Cmnd block
689 if (likely(!list_empty(&hrrq->hrrq_free_q))) { in __ipr_get_free_ipr_cmnd()
690 ipr_cmd = list_entry(hrrq->hrrq_free_q.next, in __ipr_get_free_ipr_cmnd()
692 list_del(&ipr_cmd->queue); in __ipr_get_free_ipr_cmnd()
700 * ipr_get_free_ipr_cmnd - Get a free IPR Cmnd block and initialize it
710 __ipr_get_free_ipr_cmnd(&ioa_cfg->hrrq[IPR_INIT_HRRQ]); in ipr_get_free_ipr_cmnd()
716 * ipr_mask_and_clear_interrupts - Mask all and clear specified interrupts
732 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_mask_and_clear_interrupts()
733 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_mask_and_clear_interrupts()
734 ioa_cfg->hrrq[i].allow_interrupts = 0; in ipr_mask_and_clear_interrupts()
735 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_mask_and_clear_interrupts()
739 if (ioa_cfg->sis64) in ipr_mask_and_clear_interrupts()
740 writeq(~0, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_mask_and_clear_interrupts()
742 writel(~0, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_mask_and_clear_interrupts()
745 if (ioa_cfg->sis64) in ipr_mask_and_clear_interrupts()
746 writel(~0, ioa_cfg->regs.clr_interrupt_reg); in ipr_mask_and_clear_interrupts()
747 writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg32); in ipr_mask_and_clear_interrupts()
748 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_mask_and_clear_interrupts()
752 * ipr_save_pcix_cmd_reg - Save PCI-X command register
756 * 0 on success / -EIO on failure
760 int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX); in ipr_save_pcix_cmd_reg()
766 rc = pci_read_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD, in ipr_save_pcix_cmd_reg()
767 &ioa_cfg->saved_pcix_cmd_reg); in ipr_save_pcix_cmd_reg()
769 dev_err(&ioa_cfg->pdev->dev, "Failed to save PCI-X command register\n"); in ipr_save_pcix_cmd_reg()
770 return -EIO; in ipr_save_pcix_cmd_reg()
773 ioa_cfg->saved_pcix_cmd_reg |= PCI_X_CMD_DPERR_E | PCI_X_CMD_ERO; in ipr_save_pcix_cmd_reg()
778 * ipr_set_pcix_cmd_reg - Setup PCI-X command register
782 * 0 on success / -EIO on failure
786 int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX); in ipr_set_pcix_cmd_reg()
790 rc = pci_write_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD, in ipr_set_pcix_cmd_reg()
791 ioa_cfg->saved_pcix_cmd_reg); in ipr_set_pcix_cmd_reg()
793 dev_err(&ioa_cfg->pdev->dev, "Failed to setup PCI-X command register\n"); in ipr_set_pcix_cmd_reg()
794 return -EIO; in ipr_set_pcix_cmd_reg()
803 * __ipr_scsi_eh_done - mid-layer done function for aborted ops
807 * ops generated by the SCSI mid-layer which are being aborted.
814 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in __ipr_scsi_eh_done()
816 scsi_cmd->result |= (DID_ERROR << 16); in __ipr_scsi_eh_done()
818 scsi_dma_unmap(ipr_cmd->scsi_cmd); in __ipr_scsi_eh_done()
820 if (ipr_cmd->eh_comp) in __ipr_scsi_eh_done()
821 complete(ipr_cmd->eh_comp); in __ipr_scsi_eh_done()
822 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in __ipr_scsi_eh_done()
826 * ipr_scsi_eh_done - mid-layer done function for aborted ops
830 * ops generated by the SCSI mid-layer which are being aborted.
838 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_scsi_eh_done()
840 spin_lock_irqsave(&hrrq->_lock, hrrq_flags); in ipr_scsi_eh_done()
842 spin_unlock_irqrestore(&hrrq->_lock, hrrq_flags); in ipr_scsi_eh_done()
846 * ipr_fail_all_ops - Fails all outstanding ops.
861 spin_lock(&hrrq->_lock); in ipr_fail_all_ops()
863 temp, &hrrq->hrrq_pending_q, queue) { in ipr_fail_all_ops()
864 list_del(&ipr_cmd->queue); in ipr_fail_all_ops()
866 ipr_cmd->s.ioasa.hdr.ioasc = in ipr_fail_all_ops()
868 ipr_cmd->s.ioasa.hdr.ilid = in ipr_fail_all_ops()
871 if (ipr_cmd->scsi_cmd) in ipr_fail_all_ops()
872 ipr_cmd->done = __ipr_scsi_eh_done; in ipr_fail_all_ops()
876 del_timer(&ipr_cmd->timer); in ipr_fail_all_ops()
877 ipr_cmd->done(ipr_cmd); in ipr_fail_all_ops()
879 spin_unlock(&hrrq->_lock); in ipr_fail_all_ops()
885 * ipr_send_command - Send driver initiated requests.
897 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_command()
898 dma_addr_t send_dma_addr = ipr_cmd->dma_addr; in ipr_send_command()
900 if (ioa_cfg->sis64) { in ipr_send_command()
905 then use a 512 byte ioarcb */ in ipr_send_command()
906 if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 ) in ipr_send_command()
908 writeq(send_dma_addr, ioa_cfg->regs.ioarrin_reg); in ipr_send_command()
910 writel(send_dma_addr, ioa_cfg->regs.ioarrin_reg); in ipr_send_command()
914 * ipr_do_req - Send driver initiated requests.
930 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_do_req()
932 ipr_cmd->done = done; in ipr_do_req()
934 ipr_cmd->timer.expires = jiffies + timeout; in ipr_do_req()
935 ipr_cmd->timer.function = timeout_func; in ipr_do_req()
937 add_timer(&ipr_cmd->timer); in ipr_do_req()
945 * ipr_internal_cmd_done - Op done function for an internally generated op.
956 if (ipr_cmd->sibling) in ipr_internal_cmd_done()
957 ipr_cmd->sibling = NULL; in ipr_internal_cmd_done()
959 complete(&ipr_cmd->completion); in ipr_internal_cmd_done()
963 * ipr_init_ioadl - initialize the ioadl for the correct SIS type
978 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_init_ioadl()
979 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_init_ioadl()
981 ipr_cmd->dma_use_sg = 1; in ipr_init_ioadl()
983 if (ipr_cmd->ioa_cfg->sis64) { in ipr_init_ioadl()
984 ioadl64->flags = cpu_to_be32(flags); in ipr_init_ioadl()
985 ioadl64->data_len = cpu_to_be32(len); in ipr_init_ioadl()
986 ioadl64->address = cpu_to_be64(dma_addr); in ipr_init_ioadl()
988 ipr_cmd->ioarcb.ioadl_len = in ipr_init_ioadl()
990 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
992 ioadl->flags_and_data_len = cpu_to_be32(flags | len); in ipr_init_ioadl()
993 ioadl->address = cpu_to_be32(dma_addr); in ipr_init_ioadl()
996 ipr_cmd->ioarcb.read_ioadl_len = in ipr_init_ioadl()
998 ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
1000 ipr_cmd->ioarcb.ioadl_len = in ipr_init_ioadl()
1002 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
1008 * ipr_send_blocking_cmd - Send command and sleep on its completion.
1020 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_blocking_cmd()
1022 init_completion(&ipr_cmd->completion); in ipr_send_blocking_cmd()
1025 spin_unlock_irq(ioa_cfg->host->host_lock); in ipr_send_blocking_cmd()
1026 wait_for_completion(&ipr_cmd->completion); in ipr_send_blocking_cmd()
1027 spin_lock_irq(ioa_cfg->host->host_lock); in ipr_send_blocking_cmd()
1034 if (ioa_cfg->hrrq_num == 1) in ipr_get_hrrq_index()
1037 hrrq = atomic_add_return(1, &ioa_cfg->hrrq_index); in ipr_get_hrrq_index()
1038 hrrq = (hrrq % (ioa_cfg->hrrq_num - 1)) + 1; in ipr_get_hrrq_index()
1044 * ipr_send_hcam - Send an HCAM to the adapter.
1062 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) { in ipr_send_hcam()
1064 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_send_hcam()
1065 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_pending_q); in ipr_send_hcam()
1067 ipr_cmd->u.hostrcb = hostrcb; in ipr_send_hcam()
1068 ioarcb = &ipr_cmd->ioarcb; in ipr_send_hcam()
1070 ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_send_hcam()
1071 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_HCAM; in ipr_send_hcam()
1072 ioarcb->cmd_pkt.cdb[0] = IPR_HOST_CONTROLLED_ASYNC; in ipr_send_hcam()
1073 ioarcb->cmd_pkt.cdb[1] = type; in ipr_send_hcam()
1074 ioarcb->cmd_pkt.cdb[7] = (sizeof(hostrcb->hcam) >> 8) & 0xff; in ipr_send_hcam()
1075 ioarcb->cmd_pkt.cdb[8] = sizeof(hostrcb->hcam) & 0xff; in ipr_send_hcam()
1077 ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma, in ipr_send_hcam()
1078 sizeof(hostrcb->hcam), IPR_IOADL_FLAGS_READ_LAST); in ipr_send_hcam()
1081 ipr_cmd->done = ipr_process_ccn; in ipr_send_hcam()
1083 ipr_cmd->done = ipr_process_error; in ipr_send_hcam()
1089 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_send_hcam()
1094 * ipr_init_res_entry - Initialize a resource entry struct.
1105 struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; in ipr_init_res_entry()
1108 res->needs_sync_complete = 0; in ipr_init_res_entry()
1109 res->in_erp = 0; in ipr_init_res_entry()
1110 res->add_to_ml = 0; in ipr_init_res_entry()
1111 res->del_from_ml = 0; in ipr_init_res_entry()
1112 res->resetting_device = 0; in ipr_init_res_entry()
1113 res->reset_occurred = 0; in ipr_init_res_entry()
1114 res->sdev = NULL; in ipr_init_res_entry()
1116 if (ioa_cfg->sis64) { in ipr_init_res_entry()
1117 res->flags = be16_to_cpu(cfgtew->u.cfgte64->flags); in ipr_init_res_entry()
1118 res->res_flags = be16_to_cpu(cfgtew->u.cfgte64->res_flags); in ipr_init_res_entry()
1119 res->qmodel = IPR_QUEUEING_MODEL64(res); in ipr_init_res_entry()
1120 res->type = cfgtew->u.cfgte64->res_type; in ipr_init_res_entry()
1122 memcpy(res->res_path, &cfgtew->u.cfgte64->res_path, in ipr_init_res_entry()
1123 sizeof(res->res_path)); in ipr_init_res_entry()
1125 res->bus = 0; in ipr_init_res_entry()
1126 memcpy(&res->dev_lun.scsi_lun, &cfgtew->u.cfgte64->lun, in ipr_init_res_entry()
1127 sizeof(res->dev_lun.scsi_lun)); in ipr_init_res_entry()
1128 res->lun = scsilun_to_int(&res->dev_lun); in ipr_init_res_entry()
1130 if (res->type == IPR_RES_TYPE_GENERIC_SCSI) { in ipr_init_res_entry()
1131 list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) { in ipr_init_res_entry()
1132 if (gscsi_res->dev_id == cfgtew->u.cfgte64->dev_id) { in ipr_init_res_entry()
1134 res->target = gscsi_res->target; in ipr_init_res_entry()
1139 res->target = find_first_zero_bit(ioa_cfg->target_ids, in ipr_init_res_entry()
1140 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1141 set_bit(res->target, ioa_cfg->target_ids); in ipr_init_res_entry()
1143 } else if (res->type == IPR_RES_TYPE_IOAFP) { in ipr_init_res_entry()
1144 res->bus = IPR_IOAFP_VIRTUAL_BUS; in ipr_init_res_entry()
1145 res->target = 0; in ipr_init_res_entry()
1146 } else if (res->type == IPR_RES_TYPE_ARRAY) { in ipr_init_res_entry()
1147 res->bus = IPR_ARRAY_VIRTUAL_BUS; in ipr_init_res_entry()
1148 res->target = find_first_zero_bit(ioa_cfg->array_ids, in ipr_init_res_entry()
1149 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1150 set_bit(res->target, ioa_cfg->array_ids); in ipr_init_res_entry()
1151 } else if (res->type == IPR_RES_TYPE_VOLUME_SET) { in ipr_init_res_entry()
1152 res->bus = IPR_VSET_VIRTUAL_BUS; in ipr_init_res_entry()
1153 res->target = find_first_zero_bit(ioa_cfg->vset_ids, in ipr_init_res_entry()
1154 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1155 set_bit(res->target, ioa_cfg->vset_ids); in ipr_init_res_entry()
1157 res->target = find_first_zero_bit(ioa_cfg->target_ids, in ipr_init_res_entry()
1158 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1159 set_bit(res->target, ioa_cfg->target_ids); in ipr_init_res_entry()
1162 res->qmodel = IPR_QUEUEING_MODEL(res); in ipr_init_res_entry()
1163 res->flags = cfgtew->u.cfgte->flags; in ipr_init_res_entry()
1164 if (res->flags & IPR_IS_IOA_RESOURCE) in ipr_init_res_entry()
1165 res->type = IPR_RES_TYPE_IOAFP; in ipr_init_res_entry()
1167 res->type = cfgtew->u.cfgte->rsvd_subtype & 0x0f; in ipr_init_res_entry()
1169 res->bus = cfgtew->u.cfgte->res_addr.bus; in ipr_init_res_entry()
1170 res->target = cfgtew->u.cfgte->res_addr.target; in ipr_init_res_entry()
1171 res->lun = cfgtew->u.cfgte->res_addr.lun; in ipr_init_res_entry()
1172 res->lun_wwn = get_unaligned_be64(cfgtew->u.cfgte->lun_wwn); in ipr_init_res_entry()
1177 * ipr_is_same_device - Determine if two devices are the same.
1187 if (res->ioa_cfg->sis64) { in ipr_is_same_device()
1188 if (!memcmp(&res->dev_id, &cfgtew->u.cfgte64->dev_id, in ipr_is_same_device()
1189 sizeof(cfgtew->u.cfgte64->dev_id)) && in ipr_is_same_device()
1190 !memcmp(&res->dev_lun.scsi_lun, &cfgtew->u.cfgte64->lun, in ipr_is_same_device()
1191 sizeof(cfgtew->u.cfgte64->lun))) { in ipr_is_same_device()
1195 if (res->bus == cfgtew->u.cfgte->res_addr.bus && in ipr_is_same_device()
1196 res->target == cfgtew->u.cfgte->res_addr.target && in ipr_is_same_device()
1197 res->lun == cfgtew->u.cfgte->res_addr.lun) in ipr_is_same_device()
1205 * __ipr_format_res_path - Format the resource path for printing.
1219 p += scnprintf(p, buffer + len - p, "%02X", res_path[0]); in __ipr_format_res_path()
1221 p += scnprintf(p, buffer + len - p, "-%02X", res_path[i]); in __ipr_format_res_path()
1227 * ipr_format_res_path - Format the resource path for printing.
1242 p += scnprintf(p, buffer + len - p, "%d/", ioa_cfg->host->host_no); in ipr_format_res_path()
1243 __ipr_format_res_path(res_path, p, len - (p - buffer)); in ipr_format_res_path()
1248 * ipr_update_res_entry - Update the resource entry.
1261 if (res->ioa_cfg->sis64) { in ipr_update_res_entry()
1262 res->flags = be16_to_cpu(cfgtew->u.cfgte64->flags); in ipr_update_res_entry()
1263 res->res_flags = be16_to_cpu(cfgtew->u.cfgte64->res_flags); in ipr_update_res_entry()
1264 res->type = cfgtew->u.cfgte64->res_type; in ipr_update_res_entry()
1266 memcpy(&res->std_inq_data, &cfgtew->u.cfgte64->std_inq_data, in ipr_update_res_entry()
1269 res->qmodel = IPR_QUEUEING_MODEL64(res); in ipr_update_res_entry()
1270 res->res_handle = cfgtew->u.cfgte64->res_handle; in ipr_update_res_entry()
1271 res->dev_id = cfgtew->u.cfgte64->dev_id; in ipr_update_res_entry()
1273 memcpy(&res->dev_lun.scsi_lun, &cfgtew->u.cfgte64->lun, in ipr_update_res_entry()
1274 sizeof(res->dev_lun.scsi_lun)); in ipr_update_res_entry()
1276 if (memcmp(res->res_path, &cfgtew->u.cfgte64->res_path, in ipr_update_res_entry()
1277 sizeof(res->res_path))) { in ipr_update_res_entry()
1278 memcpy(res->res_path, &cfgtew->u.cfgte64->res_path, in ipr_update_res_entry()
1279 sizeof(res->res_path)); in ipr_update_res_entry()
1283 if (res->sdev && new_path) in ipr_update_res_entry()
1284 sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n", in ipr_update_res_entry()
1285 ipr_format_res_path(res->ioa_cfg, in ipr_update_res_entry()
1286 res->res_path, buffer, sizeof(buffer))); in ipr_update_res_entry()
1288 res->flags = cfgtew->u.cfgte->flags; in ipr_update_res_entry()
1289 if (res->flags & IPR_IS_IOA_RESOURCE) in ipr_update_res_entry()
1290 res->type = IPR_RES_TYPE_IOAFP; in ipr_update_res_entry()
1292 res->type = cfgtew->u.cfgte->rsvd_subtype & 0x0f; in ipr_update_res_entry()
1294 memcpy(&res->std_inq_data, &cfgtew->u.cfgte->std_inq_data, in ipr_update_res_entry()
1297 res->qmodel = IPR_QUEUEING_MODEL(res); in ipr_update_res_entry()
1298 res->res_handle = cfgtew->u.cfgte->res_handle; in ipr_update_res_entry()
1303 * ipr_clear_res_target - Clear the bit in the bit map representing the target
1313 struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; in ipr_clear_res_target()
1315 if (!ioa_cfg->sis64) in ipr_clear_res_target()
1318 if (res->bus == IPR_ARRAY_VIRTUAL_BUS) in ipr_clear_res_target()
1319 clear_bit(res->target, ioa_cfg->array_ids); in ipr_clear_res_target()
1320 else if (res->bus == IPR_VSET_VIRTUAL_BUS) in ipr_clear_res_target()
1321 clear_bit(res->target, ioa_cfg->vset_ids); in ipr_clear_res_target()
1322 else if (res->bus == 0 && res->type == IPR_RES_TYPE_GENERIC_SCSI) { in ipr_clear_res_target()
1323 list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) in ipr_clear_res_target()
1324 if (gscsi_res->dev_id == res->dev_id && gscsi_res != res) in ipr_clear_res_target()
1326 clear_bit(res->target, ioa_cfg->target_ids); in ipr_clear_res_target()
1328 } else if (res->bus == 0) in ipr_clear_res_target()
1329 clear_bit(res->target, ioa_cfg->target_ids); in ipr_clear_res_target()
1333 * ipr_handle_config_change - Handle a config change from the adapter
1349 if (ioa_cfg->sis64) { in ipr_handle_config_change()
1350 cfgtew.u.cfgte64 = &hostrcb->hcam.u.ccn.u.cfgte64; in ipr_handle_config_change()
1351 cc_res_handle = cfgtew.u.cfgte64->res_handle; in ipr_handle_config_change()
1353 cfgtew.u.cfgte = &hostrcb->hcam.u.ccn.u.cfgte; in ipr_handle_config_change()
1354 cc_res_handle = cfgtew.u.cfgte->res_handle; in ipr_handle_config_change()
1357 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_handle_config_change()
1358 if (res->res_handle == cc_res_handle) { in ipr_handle_config_change()
1365 if (list_empty(&ioa_cfg->free_res_q)) { in ipr_handle_config_change()
1372 res = list_entry(ioa_cfg->free_res_q.next, in ipr_handle_config_change()
1375 list_del(&res->queue); in ipr_handle_config_change()
1377 list_add_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_handle_config_change()
1382 if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { in ipr_handle_config_change()
1383 if (res->sdev) { in ipr_handle_config_change()
1384 res->del_from_ml = 1; in ipr_handle_config_change()
1385 res->res_handle = IPR_INVALID_RES_HANDLE; in ipr_handle_config_change()
1386 schedule_work(&ioa_cfg->work_q); in ipr_handle_config_change()
1389 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_handle_config_change()
1391 } else if (!res->sdev || res->del_from_ml) { in ipr_handle_config_change()
1392 res->add_to_ml = 1; in ipr_handle_config_change()
1393 schedule_work(&ioa_cfg->work_q); in ipr_handle_config_change()
1400 * ipr_process_ccn - Op done function for a CCN.
1411 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_ccn()
1412 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; in ipr_process_ccn()
1413 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_ccn()
1415 list_del_init(&hostrcb->queue); in ipr_process_ccn()
1416 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_process_ccn()
1421 dev_err(&ioa_cfg->pdev->dev, in ipr_process_ccn()
1431 * strip_whitespace - Strip and pad trailing whitespace.
1443 i--; in strip_whitespace()
1445 i--; in strip_whitespace()
1450 * ipr_log_vpd_compact - Log the passed extended VPD compactly.
1465 memcpy(vendor_id, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN); in ipr_log_vpd_compact()
1468 memcpy(product_id, vpd->vpids.product_id, IPR_PROD_ID_LEN); in ipr_log_vpd_compact()
1471 memcpy(sn, vpd->sn, IPR_SERIAL_NUM_LEN); in ipr_log_vpd_compact()
1479 * ipr_log_vpd - Log the passed VPD to the error log.
1490 memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN); in ipr_log_vpd()
1491 memcpy(buffer + IPR_VENDOR_ID_LEN, vpd->vpids.product_id, in ipr_log_vpd()
1496 memcpy(buffer, vpd->sn, IPR_SERIAL_NUM_LEN); in ipr_log_vpd()
1502 * ipr_log_ext_vpd_compact - Log the passed extended VPD compactly.
1513 ipr_log_vpd_compact(prefix, hostrcb, &vpd->vpd); in ipr_log_ext_vpd_compact()
1515 be32_to_cpu(vpd->wwid[0]), be32_to_cpu(vpd->wwid[1])); in ipr_log_ext_vpd_compact()
1519 * ipr_log_ext_vpd - Log the passed extended VPD to the error log.
1527 ipr_log_vpd(&vpd->vpd); in ipr_log_ext_vpd()
1528 ipr_err(" WWN: %08X%08X\n", be32_to_cpu(vpd->wwid[0]), in ipr_log_ext_vpd()
1529 be32_to_cpu(vpd->wwid[1])); in ipr_log_ext_vpd()
1533 * ipr_log_enhanced_cache_error - Log a cache error.
1545 if (ioa_cfg->sis64) in ipr_log_enhanced_cache_error()
1546 error = &hostrcb->hcam.u.error64.u.type_12_error; in ipr_log_enhanced_cache_error()
1548 error = &hostrcb->hcam.u.error.u.type_12_error; in ipr_log_enhanced_cache_error()
1550 ipr_err("-----Current Configuration-----\n"); in ipr_log_enhanced_cache_error()
1552 ipr_log_ext_vpd(&error->ioa_vpd); in ipr_log_enhanced_cache_error()
1554 ipr_log_ext_vpd(&error->cfc_vpd); in ipr_log_enhanced_cache_error()
1556 ipr_err("-----Expected Configuration-----\n"); in ipr_log_enhanced_cache_error()
1558 ipr_log_ext_vpd(&error->ioa_last_attached_to_cfc_vpd); in ipr_log_enhanced_cache_error()
1560 ipr_log_ext_vpd(&error->cfc_last_attached_to_ioa_vpd); in ipr_log_enhanced_cache_error()
1563 be32_to_cpu(error->ioa_data[0]), in ipr_log_enhanced_cache_error()
1564 be32_to_cpu(error->ioa_data[1]), in ipr_log_enhanced_cache_error()
1565 be32_to_cpu(error->ioa_data[2])); in ipr_log_enhanced_cache_error()
1569 * ipr_log_cache_error - Log a cache error.
1580 &hostrcb->hcam.u.error.u.type_02_error; in ipr_log_cache_error()
1582 ipr_err("-----Current Configuration-----\n"); in ipr_log_cache_error()
1584 ipr_log_vpd(&error->ioa_vpd); in ipr_log_cache_error()
1586 ipr_log_vpd(&error->cfc_vpd); in ipr_log_cache_error()
1588 ipr_err("-----Expected Configuration-----\n"); in ipr_log_cache_error()
1590 ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpd); in ipr_log_cache_error()
1592 ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpd); in ipr_log_cache_error()
1595 be32_to_cpu(error->ioa_data[0]), in ipr_log_cache_error()
1596 be32_to_cpu(error->ioa_data[1]), in ipr_log_cache_error()
1597 be32_to_cpu(error->ioa_data[2])); in ipr_log_cache_error()
1601 * ipr_log_enhanced_config_error - Log a configuration error.
1615 error = &hostrcb->hcam.u.error.u.type_13_error; in ipr_log_enhanced_config_error()
1616 errors_logged = be32_to_cpu(error->errors_logged); in ipr_log_enhanced_config_error()
1619 be32_to_cpu(error->errors_detected), errors_logged); in ipr_log_enhanced_config_error()
1621 dev_entry = error->dev; in ipr_log_enhanced_config_error()
1626 ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); in ipr_log_enhanced_config_error()
1627 ipr_log_ext_vpd(&dev_entry->vpd); in ipr_log_enhanced_config_error()
1629 ipr_err("-----New Device Information-----\n"); in ipr_log_enhanced_config_error()
1630 ipr_log_ext_vpd(&dev_entry->new_vpd); in ipr_log_enhanced_config_error()
1633 ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd); in ipr_log_enhanced_config_error()
1636 ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd); in ipr_log_enhanced_config_error()
1641 * ipr_log_sis64_config_error - Log a device error.
1656 error = &hostrcb->hcam.u.error64.u.type_23_error; in ipr_log_sis64_config_error()
1657 errors_logged = be32_to_cpu(error->errors_logged); in ipr_log_sis64_config_error()
1660 be32_to_cpu(error->errors_detected), errors_logged); in ipr_log_sis64_config_error()
1662 dev_entry = error->dev; in ipr_log_sis64_config_error()
1668 __ipr_format_res_path(dev_entry->res_path, in ipr_log_sis64_config_error()
1670 ipr_log_ext_vpd(&dev_entry->vpd); in ipr_log_sis64_config_error()
1672 ipr_err("-----New Device Information-----\n"); in ipr_log_sis64_config_error()
1673 ipr_log_ext_vpd(&dev_entry->new_vpd); in ipr_log_sis64_config_error()
1676 ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd); in ipr_log_sis64_config_error()
1679 ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd); in ipr_log_sis64_config_error()
1684 * ipr_log_config_error - Log a configuration error.
1698 error = &hostrcb->hcam.u.error.u.type_03_error; in ipr_log_config_error()
1699 errors_logged = be32_to_cpu(error->errors_logged); in ipr_log_config_error()
1702 be32_to_cpu(error->errors_detected), errors_logged); in ipr_log_config_error()
1704 dev_entry = error->dev; in ipr_log_config_error()
1709 ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); in ipr_log_config_error()
1710 ipr_log_vpd(&dev_entry->vpd); in ipr_log_config_error()
1712 ipr_err("-----New Device Information-----\n"); in ipr_log_config_error()
1713 ipr_log_vpd(&dev_entry->new_vpd); in ipr_log_config_error()
1716 ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpd); in ipr_log_config_error()
1719 ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpd); in ipr_log_config_error()
1722 be32_to_cpu(dev_entry->ioa_data[0]), in ipr_log_config_error()
1723 be32_to_cpu(dev_entry->ioa_data[1]), in ipr_log_config_error()
1724 be32_to_cpu(dev_entry->ioa_data[2]), in ipr_log_config_error()
1725 be32_to_cpu(dev_entry->ioa_data[3]), in ipr_log_config_error()
1726 be32_to_cpu(dev_entry->ioa_data[4])); in ipr_log_config_error()
1731 * ipr_log_enhanced_array_error - Log an array configuration error.
1744 const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' }; in ipr_log_enhanced_array_error()
1746 error = &hostrcb->hcam.u.error.u.type_14_error; in ipr_log_enhanced_array_error()
1751 error->protection_level, in ipr_log_enhanced_array_error()
1752 ioa_cfg->host->host_no, in ipr_log_enhanced_array_error()
1753 error->last_func_vset_res_addr.bus, in ipr_log_enhanced_array_error()
1754 error->last_func_vset_res_addr.target, in ipr_log_enhanced_array_error()
1755 error->last_func_vset_res_addr.lun); in ipr_log_enhanced_array_error()
1759 array_entry = error->array_member; in ipr_log_enhanced_array_error()
1760 num_entries = min_t(u32, be32_to_cpu(error->num_entries), in ipr_log_enhanced_array_error()
1761 ARRAY_SIZE(error->array_member)); in ipr_log_enhanced_array_error()
1764 if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) in ipr_log_enhanced_array_error()
1767 if (be32_to_cpu(error->exposed_mode_adn) == i) in ipr_log_enhanced_array_error()
1772 ipr_log_ext_vpd(&array_entry->vpd); in ipr_log_enhanced_array_error()
1773 ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); in ipr_log_enhanced_array_error()
1774 ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, in ipr_log_enhanced_array_error()
1782 * ipr_log_array_error - Log an array configuration error.
1795 const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' }; in ipr_log_array_error()
1797 error = &hostrcb->hcam.u.error.u.type_04_error; in ipr_log_array_error()
1802 error->protection_level, in ipr_log_array_error()
1803 ioa_cfg->host->host_no, in ipr_log_array_error()
1804 error->last_func_vset_res_addr.bus, in ipr_log_array_error()
1805 error->last_func_vset_res_addr.target, in ipr_log_array_error()
1806 error->last_func_vset_res_addr.lun); in ipr_log_array_error()
1810 array_entry = error->array_member; in ipr_log_array_error()
1813 if (!memcmp(array_entry->vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) in ipr_log_array_error()
1816 if (be32_to_cpu(error->exposed_mode_adn) == i) in ipr_log_array_error()
1821 ipr_log_vpd(&array_entry->vpd); in ipr_log_array_error()
1823 ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); in ipr_log_array_error()
1824 ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, in ipr_log_array_error()
1830 array_entry = error->array_member2; in ipr_log_array_error()
1837 * ipr_log_hex_data - Log additional hex IOA error data.
1852 if (ioa_cfg->log_level <= IPR_DEFAULT_LOG_LEVEL) in ipr_log_hex_data()
1865 * ipr_log_enhanced_dual_ioa_error - Log an enhanced dual adapter error.
1877 if (ioa_cfg->sis64) in ipr_log_enhanced_dual_ioa_error()
1878 error = &hostrcb->hcam.u.error64.u.type_17_error; in ipr_log_enhanced_dual_ioa_error()
1880 error = &hostrcb->hcam.u.error.u.type_17_error; in ipr_log_enhanced_dual_ioa_error()
1882 error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; in ipr_log_enhanced_dual_ioa_error()
1883 strim(error->failure_reason); in ipr_log_enhanced_dual_ioa_error()
1885 ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason, in ipr_log_enhanced_dual_ioa_error()
1886 be32_to_cpu(hostrcb->hcam.u.error.prc)); in ipr_log_enhanced_dual_ioa_error()
1887 ipr_log_ext_vpd_compact("Remote IOA", hostrcb, &error->vpd); in ipr_log_enhanced_dual_ioa_error()
1888 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_enhanced_dual_ioa_error()
1889 be32_to_cpu(hostrcb->hcam.length) - in ipr_log_enhanced_dual_ioa_error()
1895 * ipr_log_dual_ioa_error - Log a dual adapter error.
1907 error = &hostrcb->hcam.u.error.u.type_07_error; in ipr_log_dual_ioa_error()
1908 error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; in ipr_log_dual_ioa_error()
1909 strim(error->failure_reason); in ipr_log_dual_ioa_error()
1911 ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason, in ipr_log_dual_ioa_error()
1912 be32_to_cpu(hostrcb->hcam.u.error.prc)); in ipr_log_dual_ioa_error()
1913 ipr_log_vpd_compact("Remote IOA", hostrcb, &error->vpd); in ipr_log_dual_ioa_error()
1914 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_dual_ioa_error()
1915 be32_to_cpu(hostrcb->hcam.length) - in ipr_log_dual_ioa_error()
1940 * ipr_log_fabric_path - Log a fabric path error
1951 u8 path_state = fabric->path_state; in ipr_log_fabric_path()
1963 if (fabric->cascaded_expander == 0xff && fabric->phy == 0xff) { in ipr_log_fabric_path()
1966 fabric->ioa_port); in ipr_log_fabric_path()
1967 } else if (fabric->cascaded_expander == 0xff) { in ipr_log_fabric_path()
1970 fabric->ioa_port, fabric->phy); in ipr_log_fabric_path()
1971 } else if (fabric->phy == 0xff) { in ipr_log_fabric_path()
1974 fabric->ioa_port, fabric->cascaded_expander); in ipr_log_fabric_path()
1978 fabric->ioa_port, fabric->cascaded_expander, fabric->phy); in ipr_log_fabric_path()
1985 fabric->ioa_port, fabric->cascaded_expander, fabric->phy); in ipr_log_fabric_path()
1989 * ipr_log64_fabric_path - Log a fabric path error
2000 u8 path_state = fabric->path_state; in ipr_log64_fabric_path()
2015 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_fabric_path()
2016 fabric->res_path, in ipr_log64_fabric_path()
2023 ipr_format_res_path(hostrcb->ioa_cfg, fabric->res_path, in ipr_log64_fabric_path()
2069 * ipr_log_path_elem - Log a fabric path element.
2080 u8 type = cfg->type_status & IPR_PATH_CFG_TYPE_MASK; in ipr_log_path_elem()
2081 u8 status = cfg->type_status & IPR_PATH_CFG_STATUS_MASK; in ipr_log_path_elem()
2097 cfg->phy, link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2098 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2100 if (cfg->cascaded_expander == 0xff && cfg->phy == 0xff) { in ipr_log_path_elem()
2103 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2104 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2105 } else if (cfg->cascaded_expander == 0xff) { in ipr_log_path_elem()
2108 path_type_desc[i].desc, cfg->phy, in ipr_log_path_elem()
2109 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2110 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2111 } else if (cfg->phy == 0xff) { in ipr_log_path_elem()
2114 path_type_desc[i].desc, cfg->cascaded_expander, in ipr_log_path_elem()
2115 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2116 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2120 path_type_desc[i].desc, cfg->cascaded_expander, cfg->phy, in ipr_log_path_elem()
2121 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2122 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2130 "WWN=%08X%08X\n", cfg->type_status, cfg->cascaded_expander, cfg->phy, in ipr_log_path_elem()
2131 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log_path_elem()
2132 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log_path_elem()
2136 * ipr_log64_path_elem - Log a fabric path element.
2147 u8 desc_id = cfg->descriptor_id & IPR_DESCRIPTOR_MASK; in ipr_log64_path_elem()
2148 u8 type = cfg->type_status & IPR_PATH_CFG_TYPE_MASK; in ipr_log64_path_elem()
2149 u8 status = cfg->type_status & IPR_PATH_CFG_STATUS_MASK; in ipr_log64_path_elem()
2165 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_path_elem()
2166 cfg->res_path, buffer, sizeof(buffer)), in ipr_log64_path_elem()
2167 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log64_path_elem()
2168 be32_to_cpu(cfg->wwid[0]), in ipr_log64_path_elem()
2169 be32_to_cpu(cfg->wwid[1])); in ipr_log64_path_elem()
2174 "WWN=%08X%08X\n", cfg->type_status, in ipr_log64_path_elem()
2175 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_path_elem()
2176 cfg->res_path, buffer, sizeof(buffer)), in ipr_log64_path_elem()
2177 link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], in ipr_log64_path_elem()
2178 be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); in ipr_log64_path_elem()
2182 * ipr_log_fabric_error - Log a fabric error.
2197 error = &hostrcb->hcam.u.error.u.type_20_error; in ipr_log_fabric_error()
2198 error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; in ipr_log_fabric_error()
2199 ipr_hcam_err(hostrcb, "%s\n", error->failure_reason); in ipr_log_fabric_error()
2201 add_len = be32_to_cpu(hostrcb->hcam.length) - in ipr_log_fabric_error()
2205 for (i = 0, fabric = error->desc; i < error->num_entries; i++) { in ipr_log_fabric_error()
2210 add_len -= be16_to_cpu(fabric->length); in ipr_log_fabric_error()
2212 ((unsigned long)fabric + be16_to_cpu(fabric->length)); in ipr_log_fabric_error()
2219 * ipr_log_sis64_array_error - Log a sis64 array error.
2233 const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' }; in ipr_log_sis64_array_error()
2235 error = &hostrcb->hcam.u.error64.u.type_24_error; in ipr_log_sis64_array_error()
2240 error->protection_level, in ipr_log_sis64_array_error()
2241 ipr_format_res_path(ioa_cfg, error->last_res_path, in ipr_log_sis64_array_error()
2246 array_entry = error->array_member; in ipr_log_sis64_array_error()
2247 num_entries = min_t(u32, error->num_entries, in ipr_log_sis64_array_error()
2248 ARRAY_SIZE(error->array_member)); in ipr_log_sis64_array_error()
2252 if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) in ipr_log_sis64_array_error()
2255 if (error->exposed_mode_adn == i) in ipr_log_sis64_array_error()
2261 ipr_log_ext_vpd(&array_entry->vpd); in ipr_log_sis64_array_error()
2263 ipr_format_res_path(ioa_cfg, array_entry->res_path, in ipr_log_sis64_array_error()
2267 array_entry->expected_res_path, in ipr_log_sis64_array_error()
2275 * ipr_log_sis64_fabric_error - Log a sis64 fabric error.
2290 error = &hostrcb->hcam.u.error64.u.type_30_error; in ipr_log_sis64_fabric_error()
2292 error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; in ipr_log_sis64_fabric_error()
2293 ipr_hcam_err(hostrcb, "%s\n", error->failure_reason); in ipr_log_sis64_fabric_error()
2295 add_len = be32_to_cpu(hostrcb->hcam.length) - in ipr_log_sis64_fabric_error()
2299 for (i = 0, fabric = error->desc; i < error->num_entries; i++) { in ipr_log_sis64_fabric_error()
2304 add_len -= be16_to_cpu(fabric->length); in ipr_log_sis64_fabric_error()
2306 ((unsigned long)fabric + be16_to_cpu(fabric->length)); in ipr_log_sis64_fabric_error()
2313 * ipr_log_sis64_service_required_error - Log a sis64 service required error.
2325 error = &hostrcb->hcam.u.error64.u.type_41_error; in ipr_log_sis64_service_required_error()
2327 error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; in ipr_log_sis64_service_required_error()
2328 ipr_err("Primary Failure Reason: %s\n", error->failure_reason); in ipr_log_sis64_service_required_error()
2329 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_sis64_service_required_error()
2330 be32_to_cpu(hostrcb->hcam.length) - in ipr_log_sis64_service_required_error()
2335 * ipr_log_generic_error - Log an adapter error.
2345 ipr_log_hex_data(ioa_cfg, hostrcb->hcam.u.raw.data, in ipr_log_generic_error()
2346 be32_to_cpu(hostrcb->hcam.length)); in ipr_log_generic_error()
2350 * ipr_log_sis64_device_error - Log a cache error.
2363 error = &hostrcb->hcam.u.error64.u.type_21_error; in ipr_log_sis64_device_error()
2365 ipr_err("-----Failing Device Information-----\n"); in ipr_log_sis64_device_error()
2367 be32_to_cpu(error->wwn[0]), be32_to_cpu(error->wwn[1]), in ipr_log_sis64_device_error()
2368 be32_to_cpu(error->wwn[2]), be32_to_cpu(error->wwn[3])); in ipr_log_sis64_device_error()
2370 __ipr_format_res_path(error->res_path, in ipr_log_sis64_device_error()
2372 error->primary_problem_desc[sizeof(error->primary_problem_desc) - 1] = '\0'; in ipr_log_sis64_device_error()
2373 error->second_problem_desc[sizeof(error->second_problem_desc) - 1] = '\0'; in ipr_log_sis64_device_error()
2374 ipr_err("Primary Problem Description: %s\n", error->primary_problem_desc); in ipr_log_sis64_device_error()
2375 ipr_err("Secondary Problem Description: %s\n", error->second_problem_desc); in ipr_log_sis64_device_error()
2377 ipr_log_hex_data(ioa_cfg, error->sense_data, sizeof(error->sense_data)); in ipr_log_sis64_device_error()
2379 ipr_log_hex_data(ioa_cfg, error->cdb, sizeof(error->cdb)); in ipr_log_sis64_device_error()
2382 ipr_log_hex_data(ioa_cfg, error->ioa_data, be32_to_cpu(error->length_of_error)); in ipr_log_sis64_device_error()
2386 * ipr_get_error - Find the specfied IOASC in the ipr_error_table.
2408 * ipr_handle_log_data - Log an adapter error.
2424 if (hostrcb->hcam.notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY) in ipr_handle_log_data()
2427 if (hostrcb->hcam.notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST) in ipr_handle_log_data()
2428 dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n"); in ipr_handle_log_data()
2430 if (ioa_cfg->sis64) in ipr_handle_log_data()
2431 ioasc = be32_to_cpu(hostrcb->hcam.u.error64.fd_ioasc); in ipr_handle_log_data()
2433 ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); in ipr_handle_log_data()
2435 if (!ioa_cfg->sis64 && (ioasc == IPR_IOASC_BUS_WAS_RESET || in ipr_handle_log_data()
2438 scsi_report_bus_reset(ioa_cfg->host, in ipr_handle_log_data()
2439 hostrcb->hcam.u.error.fd_res_addr.bus); in ipr_handle_log_data()
2448 hostrcb->hcam.overlay_id == IPR_HOST_RCB_OVERLAY_ID_21) { in ipr_handle_log_data()
2449 error = &hostrcb->hcam.u.error64.u.type_21_error; in ipr_handle_log_data()
2451 if (((be32_to_cpu(error->sense_data[0]) & 0x0000ff00) >> 8) == ILLEGAL_REQUEST && in ipr_handle_log_data()
2452 ioa_cfg->log_level <= IPR_DEFAULT_LOG_LEVEL) in ipr_handle_log_data()
2459 ioa_cfg->errors_logged++; in ipr_handle_log_data()
2461 if (ioa_cfg->log_level < ipr_error_table[error_index].log_hcam) in ipr_handle_log_data()
2463 if (be32_to_cpu(hostrcb->hcam.length) > sizeof(hostrcb->hcam.u.raw)) in ipr_handle_log_data()
2464 hostrcb->hcam.length = cpu_to_be32(sizeof(hostrcb->hcam.u.raw)); in ipr_handle_log_data()
2466 switch (hostrcb->hcam.overlay_id) { in ipr_handle_log_data()
2524 hostrcb = list_first_entry_or_null(&ioa->hostrcb_free_q, in ipr_get_free_hostrcb()
2528 dev_info(&ioa->pdev->dev, "Reclaiming async error buffers."); in ipr_get_free_hostrcb()
2529 hostrcb = list_first_entry_or_null(&ioa->hostrcb_report_q, in ipr_get_free_hostrcb()
2533 list_del_init(&hostrcb->queue); in ipr_get_free_hostrcb()
2538 * ipr_process_error - Op done function for an adapter error log.
2550 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_error()
2551 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; in ipr_process_error()
2552 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_error()
2555 if (ioa_cfg->sis64) in ipr_process_error()
2556 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error64.fd_ioasc); in ipr_process_error()
2558 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); in ipr_process_error()
2560 list_del_init(&hostrcb->queue); in ipr_process_error()
2561 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_process_error()
2569 dev_err(&ioa_cfg->pdev->dev, in ipr_process_error()
2573 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_report_q); in ipr_process_error()
2574 schedule_work(&ioa_cfg->work_q); in ipr_process_error()
2581 * ipr_timeout - An internally generated op has timed out.
2594 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_timeout()
2597 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_timeout()
2599 ioa_cfg->errors_logged++; in ipr_timeout()
2600 dev_err(&ioa_cfg->pdev->dev, in ipr_timeout()
2603 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_timeout()
2604 ioa_cfg->sdt_state = GET_DUMP; in ipr_timeout()
2606 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) in ipr_timeout()
2609 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_timeout()
2614 * ipr_oper_timeout - Adapter timed out transitioning to operational
2627 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_oper_timeout()
2630 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_oper_timeout()
2632 ioa_cfg->errors_logged++; in ipr_oper_timeout()
2633 dev_err(&ioa_cfg->pdev->dev, in ipr_oper_timeout()
2636 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_oper_timeout()
2637 ioa_cfg->sdt_state = GET_DUMP; in ipr_oper_timeout()
2639 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) { in ipr_oper_timeout()
2641 ioa_cfg->reset_retries += IPR_NUM_RESET_RELOAD_RETRIES; in ipr_oper_timeout()
2645 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_oper_timeout()
2650 * ipr_find_ses_entry - Find matching SES in SES table
2665 if (ste->compare_product_id_byte[j] == 'X') { in ipr_find_ses_entry()
2666 vpids = &res->std_inq_data.vpids; in ipr_find_ses_entry()
2667 if (vpids->product_id[j] == ste->product_id[j]) in ipr_find_ses_entry()
2683 * ipr_get_max_scsi_speed - Determine max SCSI speed for a given bus
2690 * For a 2-byte wide SCSI bus, the maximum transfer speed is
2701 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_get_max_scsi_speed()
2702 if (!(IPR_IS_SES_DEVICE(res->std_inq_data))) in ipr_get_max_scsi_speed()
2705 if (bus != res->bus) in ipr_get_max_scsi_speed()
2711 max_xfer_rate = (ste->max_bus_speed_limit * 10) / (bus_width / 8); in ipr_get_max_scsi_speed()
2718 * ipr_wait_iodbg_ack - Wait for an IODEBUG ACK from the IOA
2720 * @max_delay: max delay in micro-seconds to wait
2734 pcii_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_wait_iodbg_ack()
2747 return -EIO; in ipr_wait_iodbg_ack()
2751 * ipr_get_sis64_dump_data_section - Dump IOA memory
2767 writel(start_addr+(i*4), ioa_cfg->regs.dump_addr_reg); in ipr_get_sis64_dump_data_section()
2768 *dest = cpu_to_be32(readl(ioa_cfg->regs.dump_data_reg)); in ipr_get_sis64_dump_data_section()
2776 * ipr_get_ldump_data_section - Dump IOA memory
2783 * 0 on success / -EIO on failure
2792 if (ioa_cfg->sis64) in ipr_get_ldump_data_section()
2798 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2803 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ldump_data_section()
2805 return -EIO; in ipr_get_ldump_data_section()
2808 /* Signal LDUMP interlocked - clear IO debug ack */ in ipr_get_ldump_data_section()
2810 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2813 writel(start_addr, ioa_cfg->ioa_mailbox); in ipr_get_ldump_data_section()
2815 /* Signal address valid - clear IOA Reset alert */ in ipr_get_ldump_data_section()
2817 ioa_cfg->regs.clr_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2823 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ldump_data_section()
2825 return -EIO; in ipr_get_ldump_data_section()
2829 *dest = cpu_to_be32(readl(ioa_cfg->ioa_mailbox)); in ipr_get_ldump_data_section()
2833 if (i < (length_in_words - 1)) { in ipr_get_ldump_data_section()
2834 /* Signal dump data received - Clear IO debug Ack */ in ipr_get_ldump_data_section()
2836 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2842 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2845 ioa_cfg->regs.clr_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2847 /* Signal dump data received - Clear IO debug Ack */ in ipr_get_ldump_data_section()
2849 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2851 /* Wait for IOA to signal LDUMP exit - IOA reset alert will be cleared */ in ipr_get_ldump_data_section()
2854 readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2868 * ipr_sdt_copy - Copy Smart Dump Table to kernel buffer
2885 struct ipr_ioa_dump *ioa_dump = &ioa_cfg->dump->ioa_dump; in ipr_sdt_copy()
2887 if (ioa_cfg->sis64) in ipr_sdt_copy()
2893 (ioa_dump->hdr.len + bytes_copied) < max_dump_size) { in ipr_sdt_copy()
2894 if (ioa_dump->page_offset >= PAGE_SIZE || in ipr_sdt_copy()
2895 ioa_dump->page_offset == 0) { in ipr_sdt_copy()
2903 ioa_dump->page_offset = 0; in ipr_sdt_copy()
2904 ioa_dump->ioa_data[ioa_dump->next_page_index] = page; in ipr_sdt_copy()
2905 ioa_dump->next_page_index++; in ipr_sdt_copy()
2907 page = ioa_dump->ioa_data[ioa_dump->next_page_index - 1]; in ipr_sdt_copy()
2909 rem_len = length - bytes_copied; in ipr_sdt_copy()
2910 rem_page_len = PAGE_SIZE - ioa_dump->page_offset; in ipr_sdt_copy()
2913 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_sdt_copy()
2914 if (ioa_cfg->sdt_state == ABORT_DUMP) { in ipr_sdt_copy()
2915 rc = -EIO; in ipr_sdt_copy()
2919 &page[ioa_dump->page_offset / 4], in ipr_sdt_copy()
2922 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sdt_copy()
2925 ioa_dump->page_offset += cur_len; in ipr_sdt_copy()
2938 * ipr_init_dump_entry_hdr - Initialize a dump entry header.
2946 hdr->eye_catcher = IPR_DUMP_EYE_CATCHER; in ipr_init_dump_entry_hdr()
2947 hdr->num_elems = 1; in ipr_init_dump_entry_hdr()
2948 hdr->offset = sizeof(*hdr); in ipr_init_dump_entry_hdr()
2949 hdr->status = IPR_DUMP_STATUS_SUCCESS; in ipr_init_dump_entry_hdr()
2953 * ipr_dump_ioa_type_data - Fill in the adapter type in the dump.
2963 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_dump_ioa_type_data()
2965 ipr_init_dump_entry_hdr(&driver_dump->ioa_type_entry.hdr); in ipr_dump_ioa_type_data()
2966 driver_dump->ioa_type_entry.hdr.len = in ipr_dump_ioa_type_data()
2967 sizeof(struct ipr_dump_ioa_type_entry) - in ipr_dump_ioa_type_data()
2969 driver_dump->ioa_type_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY; in ipr_dump_ioa_type_data()
2970 driver_dump->ioa_type_entry.hdr.id = IPR_DUMP_DRIVER_TYPE_ID; in ipr_dump_ioa_type_data()
2971 driver_dump->ioa_type_entry.type = ioa_cfg->type; in ipr_dump_ioa_type_data()
2972 driver_dump->ioa_type_entry.fw_version = (ucode_vpd->major_release << 24) | in ipr_dump_ioa_type_data()
2973 (ucode_vpd->card_type << 16) | (ucode_vpd->minor_release[0] << 8) | in ipr_dump_ioa_type_data()
2974 ucode_vpd->minor_release[1]; in ipr_dump_ioa_type_data()
2975 driver_dump->hdr.num_entries++; in ipr_dump_ioa_type_data()
2979 * ipr_dump_version_data - Fill in the driver version in the dump.
2989 ipr_init_dump_entry_hdr(&driver_dump->version_entry.hdr); in ipr_dump_version_data()
2990 driver_dump->version_entry.hdr.len = in ipr_dump_version_data()
2991 sizeof(struct ipr_dump_version_entry) - in ipr_dump_version_data()
2993 driver_dump->version_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_ASCII; in ipr_dump_version_data()
2994 driver_dump->version_entry.hdr.id = IPR_DUMP_DRIVER_VERSION_ID; in ipr_dump_version_data()
2995 strcpy(driver_dump->version_entry.version, IPR_DRIVER_VERSION); in ipr_dump_version_data()
2996 driver_dump->hdr.num_entries++; in ipr_dump_version_data()
3000 * ipr_dump_trace_data - Fill in the IOA trace in the dump.
3010 ipr_init_dump_entry_hdr(&driver_dump->trace_entry.hdr); in ipr_dump_trace_data()
3011 driver_dump->trace_entry.hdr.len = in ipr_dump_trace_data()
3012 sizeof(struct ipr_dump_trace_entry) - in ipr_dump_trace_data()
3014 driver_dump->trace_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY; in ipr_dump_trace_data()
3015 driver_dump->trace_entry.hdr.id = IPR_DUMP_TRACE_ID; in ipr_dump_trace_data()
3016 memcpy(driver_dump->trace_entry.trace, ioa_cfg->trace, IPR_TRACE_SIZE); in ipr_dump_trace_data()
3017 driver_dump->hdr.num_entries++; in ipr_dump_trace_data()
3021 * ipr_dump_location_data - Fill in the IOA location in the dump.
3031 ipr_init_dump_entry_hdr(&driver_dump->location_entry.hdr); in ipr_dump_location_data()
3032 driver_dump->location_entry.hdr.len = in ipr_dump_location_data()
3033 sizeof(struct ipr_dump_location_entry) - in ipr_dump_location_data()
3035 driver_dump->location_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_ASCII; in ipr_dump_location_data()
3036 driver_dump->location_entry.hdr.id = IPR_DUMP_LOCATION_ID; in ipr_dump_location_data()
3037 strcpy(driver_dump->location_entry.location, dev_name(&ioa_cfg->pdev->dev)); in ipr_dump_location_data()
3038 driver_dump->hdr.num_entries++; in ipr_dump_location_data()
3042 * ipr_get_ioa_dump - Perform a dump of the driver and adapter.
3053 struct ipr_driver_dump *driver_dump = &dump->driver_dump; in ipr_get_ioa_dump()
3054 struct ipr_ioa_dump *ioa_dump = &dump->ioa_dump; in ipr_get_ioa_dump()
3063 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3065 if (ioa_cfg->sdt_state != READ_DUMP) { in ipr_get_ioa_dump()
3066 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3070 if (ioa_cfg->sis64) { in ipr_get_ioa_dump()
3071 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3073 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3076 start_addr = readl(ioa_cfg->ioa_mailbox); in ipr_get_ioa_dump()
3078 if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(start_addr)) { in ipr_get_ioa_dump()
3079 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ioa_dump()
3081 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3085 dev_err(&ioa_cfg->pdev->dev, "Dump of IOA initiated\n"); in ipr_get_ioa_dump()
3087 driver_dump->hdr.eye_catcher = IPR_DUMP_EYE_CATCHER; in ipr_get_ioa_dump()
3090 driver_dump->hdr.len = sizeof(struct ipr_driver_dump); in ipr_get_ioa_dump()
3091 driver_dump->hdr.num_entries = 1; in ipr_get_ioa_dump()
3092 driver_dump->hdr.first_entry_offset = sizeof(struct ipr_dump_header); in ipr_get_ioa_dump()
3093 driver_dump->hdr.status = IPR_DUMP_STATUS_SUCCESS; in ipr_get_ioa_dump()
3094 driver_dump->hdr.os = IPR_DUMP_OS_LINUX; in ipr_get_ioa_dump()
3095 driver_dump->hdr.driver_name = IPR_DUMP_DRIVER_NAME; in ipr_get_ioa_dump()
3103 driver_dump->hdr.len += sizeof(struct ipr_dump_entry_header); in ipr_get_ioa_dump()
3106 ipr_init_dump_entry_hdr(&ioa_dump->hdr); in ipr_get_ioa_dump()
3107 ioa_dump->hdr.len = 0; in ipr_get_ioa_dump()
3108 ioa_dump->hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY; in ipr_get_ioa_dump()
3109 ioa_dump->hdr.id = IPR_DUMP_IOA_DUMP_ID; in ipr_get_ioa_dump()
3115 sdt = &ioa_dump->sdt; in ipr_get_ioa_dump()
3117 if (ioa_cfg->sis64) { in ipr_get_ioa_dump()
3130 /* Smart Dump table is ready to use and the first entry is valid */ in ipr_get_ioa_dump()
3131 if (rc || ((be32_to_cpu(sdt->hdr.state) != IPR_FMT3_SDT_READY_TO_USE) && in ipr_get_ioa_dump()
3132 (be32_to_cpu(sdt->hdr.state) != IPR_FMT2_SDT_READY_TO_USE))) { in ipr_get_ioa_dump()
3133 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ioa_dump()
3135 rc, be32_to_cpu(sdt->hdr.state)); in ipr_get_ioa_dump()
3136 driver_dump->hdr.status = IPR_DUMP_STATUS_FAILED; in ipr_get_ioa_dump()
3137 ioa_cfg->sdt_state = DUMP_OBTAINED; in ipr_get_ioa_dump()
3138 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3142 num_entries = be32_to_cpu(sdt->hdr.num_entries_used); in ipr_get_ioa_dump()
3148 dump->driver_dump.hdr.len += sizeof(struct ipr_sdt_header); in ipr_get_ioa_dump()
3149 if (ioa_cfg->sis64) in ipr_get_ioa_dump()
3150 dump->driver_dump.hdr.len += num_entries * sizeof(struct ipr_sdt_entry); in ipr_get_ioa_dump()
3152 dump->driver_dump.hdr.len += max_num_entries * sizeof(struct ipr_sdt_entry); in ipr_get_ioa_dump()
3154 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3157 if (ioa_dump->hdr.len > max_dump_size) { in ipr_get_ioa_dump()
3158 driver_dump->hdr.status = IPR_DUMP_STATUS_QUAL_SUCCESS; in ipr_get_ioa_dump()
3162 if (sdt->entry[i].flags & IPR_SDT_VALID_ENTRY) { in ipr_get_ioa_dump()
3163 sdt_word = be32_to_cpu(sdt->entry[i].start_token); in ipr_get_ioa_dump()
3164 if (ioa_cfg->sis64) in ipr_get_ioa_dump()
3165 bytes_to_copy = be32_to_cpu(sdt->entry[i].end_token); in ipr_get_ioa_dump()
3168 end_off = be32_to_cpu(sdt->entry[i].end_token); in ipr_get_ioa_dump()
3171 bytes_to_copy = end_off - start_off; in ipr_get_ioa_dump()
3177 sdt->entry[i].flags &= ~IPR_SDT_VALID_ENTRY; in ipr_get_ioa_dump()
3185 ioa_dump->hdr.len += bytes_copied; in ipr_get_ioa_dump()
3188 driver_dump->hdr.status = IPR_DUMP_STATUS_QUAL_SUCCESS; in ipr_get_ioa_dump()
3195 dev_err(&ioa_cfg->pdev->dev, "Dump of IOA completed.\n"); in ipr_get_ioa_dump()
3198 driver_dump->hdr.len += ioa_dump->hdr.len; in ipr_get_ioa_dump()
3200 ioa_cfg->sdt_state = DUMP_OBTAINED; in ipr_get_ioa_dump()
3209 * ipr_release_dump - Free adapter dump memory
3218 struct ipr_ioa_cfg *ioa_cfg = dump->ioa_cfg; in ipr_release_dump()
3223 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_release_dump()
3224 ioa_cfg->dump = NULL; in ipr_release_dump()
3225 ioa_cfg->sdt_state = INACTIVE; in ipr_release_dump()
3226 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_release_dump()
3228 for (i = 0; i < dump->ioa_dump.next_page_index; i++) in ipr_release_dump()
3229 free_page((unsigned long) dump->ioa_dump.ioa_data[i]); in ipr_release_dump()
3231 vfree(dump->ioa_dump.ioa_data); in ipr_release_dump()
3247 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3252 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) { in ipr_add_remove_thread()
3253 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3257 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_add_remove_thread()
3258 if (res->del_from_ml && res->sdev) { in ipr_add_remove_thread()
3260 sdev = res->sdev; in ipr_add_remove_thread()
3262 if (!res->add_to_ml) in ipr_add_remove_thread()
3263 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_add_remove_thread()
3265 res->del_from_ml = 0; in ipr_add_remove_thread()
3266 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3269 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3276 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_add_remove_thread()
3277 if (res->add_to_ml) { in ipr_add_remove_thread()
3278 bus = res->bus; in ipr_add_remove_thread()
3279 target = res->target; in ipr_add_remove_thread()
3280 lun = res->lun; in ipr_add_remove_thread()
3281 res->add_to_ml = 0; in ipr_add_remove_thread()
3282 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3283 scsi_add_device(ioa_cfg->host, bus, target, lun); in ipr_add_remove_thread()
3284 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3289 ioa_cfg->scan_done = 1; in ipr_add_remove_thread()
3290 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3291 kobject_uevent(&ioa_cfg->host->shost_dev.kobj, KOBJ_CHANGE); in ipr_add_remove_thread()
3296 * ipr_worker_thread - Worker thread
3300 * of adding and removing device from the mid-layer as configuration
3314 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3316 if (ioa_cfg->sdt_state == READ_DUMP) { in ipr_worker_thread()
3317 dump = ioa_cfg->dump; in ipr_worker_thread()
3319 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3322 kref_get(&dump->kref); in ipr_worker_thread()
3323 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3325 kref_put(&dump->kref, ipr_release_dump); in ipr_worker_thread()
3327 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3328 if (ioa_cfg->sdt_state == DUMP_OBTAINED && !ioa_cfg->dump_timeout) in ipr_worker_thread()
3330 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3334 if (ioa_cfg->scsi_unblock) { in ipr_worker_thread()
3335 ioa_cfg->scsi_unblock = 0; in ipr_worker_thread()
3336 ioa_cfg->scsi_blocked = 0; in ipr_worker_thread()
3337 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3338 scsi_unblock_requests(ioa_cfg->host); in ipr_worker_thread()
3339 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3340 if (ioa_cfg->scsi_blocked) in ipr_worker_thread()
3341 scsi_block_requests(ioa_cfg->host); in ipr_worker_thread()
3344 if (!ioa_cfg->scan_enabled) { in ipr_worker_thread()
3345 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3349 schedule_work(&ioa_cfg->scsi_add_work_q); in ipr_worker_thread()
3351 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3357 * ipr_read_trace - Dump the adapter trace
3374 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_trace()
3378 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_trace()
3379 ret = memory_read_from_buffer(buf, count, &off, ioa_cfg->trace, in ipr_read_trace()
3381 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_trace()
3397 * ipr_show_fw_version - Show the firmware version
3409 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_fw_version()
3410 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_show_fw_version()
3414 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_version()
3416 ucode_vpd->major_release, ucode_vpd->card_type, in ipr_show_fw_version()
3417 ucode_vpd->minor_release[0], in ipr_show_fw_version()
3418 ucode_vpd->minor_release[1]); in ipr_show_fw_version()
3419 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_version()
3432 * ipr_show_log_level - Show the adapter's error logging level
3444 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_log_level()
3448 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_log_level()
3449 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->log_level); in ipr_show_log_level()
3450 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_log_level()
3455 * ipr_store_log_level - Change the adapter's error logging level
3469 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_log_level()
3472 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_log_level()
3473 ioa_cfg->log_level = simple_strtoul(buf, NULL, 10); in ipr_store_log_level()
3474 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_log_level()
3488 * ipr_store_diagnostics - IOA Diagnostics interface
3505 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_diagnostics()
3510 return -EACCES; in ipr_store_diagnostics()
3512 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3513 while (ioa_cfg->in_reset_reload) { in ipr_store_diagnostics()
3514 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3515 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_diagnostics()
3516 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3519 ioa_cfg->errors_logged = 0; in ipr_store_diagnostics()
3522 if (ioa_cfg->in_reset_reload) { in ipr_store_diagnostics()
3523 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3524 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_diagnostics()
3529 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3530 return -EIO; in ipr_store_diagnostics()
3533 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3534 if (ioa_cfg->in_reset_reload || ioa_cfg->errors_logged) in ipr_store_diagnostics()
3535 rc = -EIO; in ipr_store_diagnostics()
3536 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3550 * ipr_show_adapter_state - Show the adapter's state
3562 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_adapter_state()
3566 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_state()
3567 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_show_adapter_state()
3571 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_state()
3576 * ipr_store_adapter_state - Change adapter state
3592 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_adapter_state()
3597 return -EACCES; in ipr_store_adapter_state()
3599 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_adapter_state()
3600 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead && in ipr_store_adapter_state()
3602 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_store_adapter_state()
3603 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_store_adapter_state()
3604 ioa_cfg->hrrq[i].ioa_is_dead = 0; in ipr_store_adapter_state()
3605 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_store_adapter_state()
3608 ioa_cfg->reset_retries = 0; in ipr_store_adapter_state()
3609 ioa_cfg->in_ioa_bringdown = 0; in ipr_store_adapter_state()
3612 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_adapter_state()
3613 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_adapter_state()
3628 * ipr_store_reset_adapter - Reset the adapter
3644 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_reset_adapter()
3649 return -EACCES; in ipr_store_reset_adapter()
3651 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_reset_adapter()
3652 if (!ioa_cfg->in_reset_reload) in ipr_store_reset_adapter()
3654 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_reset_adapter()
3655 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_reset_adapter()
3670 * ipr_show_iopoll_weight - Show ipr polling mode
3682 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_iopoll_weight()
3686 spin_lock_irqsave(shost->host_lock, lock_flags); in ipr_show_iopoll_weight()
3687 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->iopoll_weight); in ipr_show_iopoll_weight()
3688 spin_unlock_irqrestore(shost->host_lock, lock_flags); in ipr_show_iopoll_weight()
3694 * ipr_store_iopoll_weight - Change the adapter's polling mode
3708 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_iopoll_weight()
3713 if (!ioa_cfg->sis64) { in ipr_store_iopoll_weight()
3714 dev_info(&ioa_cfg->pdev->dev, "irq_poll not supported on this adapter\n"); in ipr_store_iopoll_weight()
3715 return -EINVAL; in ipr_store_iopoll_weight()
3718 return -EINVAL; in ipr_store_iopoll_weight()
3721 dev_info(&ioa_cfg->pdev->dev, "Invalid irq_poll weight. It must be less than 256\n"); in ipr_store_iopoll_weight()
3722 return -EINVAL; in ipr_store_iopoll_weight()
3725 if (user_iopoll_weight == ioa_cfg->iopoll_weight) { in ipr_store_iopoll_weight()
3726 dev_info(&ioa_cfg->pdev->dev, "Current irq_poll weight has the same weight\n"); in ipr_store_iopoll_weight()
3730 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_store_iopoll_weight()
3731 for (i = 1; i < ioa_cfg->hrrq_num; i++) in ipr_store_iopoll_weight()
3732 irq_poll_disable(&ioa_cfg->hrrq[i].iopoll); in ipr_store_iopoll_weight()
3735 spin_lock_irqsave(shost->host_lock, lock_flags); in ipr_store_iopoll_weight()
3736 ioa_cfg->iopoll_weight = user_iopoll_weight; in ipr_store_iopoll_weight()
3737 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_store_iopoll_weight()
3738 for (i = 1; i < ioa_cfg->hrrq_num; i++) { in ipr_store_iopoll_weight()
3739 irq_poll_init(&ioa_cfg->hrrq[i].iopoll, in ipr_store_iopoll_weight()
3740 ioa_cfg->iopoll_weight, ipr_iopoll); in ipr_store_iopoll_weight()
3743 spin_unlock_irqrestore(shost->host_lock, lock_flags); in ipr_store_iopoll_weight()
3758 * ipr_alloc_ucode_buffer - Allocates a microcode download buffer
3762 * list to use for microcode download
3773 sg_size = buf_len / (IPR_MAX_SGLIST - 1); in ipr_alloc_ucode_buffer()
3784 sglist->order = order; in ipr_alloc_ucode_buffer()
3785 sglist->scatterlist = sgl_alloc_order(buf_len, order, false, GFP_KERNEL, in ipr_alloc_ucode_buffer()
3786 &sglist->num_sg); in ipr_alloc_ucode_buffer()
3787 if (!sglist->scatterlist) { in ipr_alloc_ucode_buffer()
3796 * ipr_free_ucode_buffer - Frees a microcode download buffer
3807 sgl_free_order(sglist->scatterlist, sglist->order); in ipr_free_ucode_buffer()
3812 * ipr_copy_ucode_buffer - Copy user buffer to kernel buffer
3830 bsize_elem = PAGE_SIZE * (1 << sglist->order); in ipr_copy_ucode_buffer()
3832 sg = sglist->scatterlist; in ipr_copy_ucode_buffer()
3840 sg->length = bsize_elem; in ipr_copy_ucode_buffer()
3853 sg->length = len % bsize_elem; in ipr_copy_ucode_buffer()
3856 sglist->buffer_len = len; in ipr_copy_ucode_buffer()
3861 * ipr_build_ucode_ioadl64 - Build a microcode download IOADL
3871 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ucode_ioadl64()
3872 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_build_ucode_ioadl64()
3873 struct scatterlist *scatterlist = sglist->scatterlist; in ipr_build_ucode_ioadl64()
3877 ipr_cmd->dma_use_sg = sglist->num_dma_sg; in ipr_build_ucode_ioadl64()
3878 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_build_ucode_ioadl64()
3879 ioarcb->data_transfer_length = cpu_to_be32(sglist->buffer_len); in ipr_build_ucode_ioadl64()
3881 ioarcb->ioadl_len = in ipr_build_ucode_ioadl64()
3882 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); in ipr_build_ucode_ioadl64()
3883 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ucode_ioadl64()
3889 ioadl64[i-1].flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); in ipr_build_ucode_ioadl64()
3893 * ipr_build_ucode_ioadl - Build a microcode download IOADL
3903 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ucode_ioadl()
3904 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_build_ucode_ioadl()
3905 struct scatterlist *scatterlist = sglist->scatterlist; in ipr_build_ucode_ioadl()
3909 ipr_cmd->dma_use_sg = sglist->num_dma_sg; in ipr_build_ucode_ioadl()
3910 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_build_ucode_ioadl()
3911 ioarcb->data_transfer_length = cpu_to_be32(sglist->buffer_len); in ipr_build_ucode_ioadl()
3913 ioarcb->ioadl_len = in ipr_build_ucode_ioadl()
3914 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ucode_ioadl()
3916 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ucode_ioadl()
3923 ioadl[i-1].flags_and_data_len |= in ipr_build_ucode_ioadl()
3928 * ipr_update_ioa_ucode - Update IOA's microcode
3935 * 0 on success / -EIO on failure
3942 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3943 while (ioa_cfg->in_reset_reload) { in ipr_update_ioa_ucode()
3944 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3945 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_update_ioa_ucode()
3946 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3949 if (ioa_cfg->ucode_sglist) { in ipr_update_ioa_ucode()
3950 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3951 dev_err(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
3953 return -EIO; in ipr_update_ioa_ucode()
3956 sglist->num_dma_sg = dma_map_sg(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
3957 sglist->scatterlist, sglist->num_sg, in ipr_update_ioa_ucode()
3960 if (!sglist->num_dma_sg) { in ipr_update_ioa_ucode()
3961 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3962 dev_err(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
3964 return -EIO; in ipr_update_ioa_ucode()
3967 ioa_cfg->ucode_sglist = sglist; in ipr_update_ioa_ucode()
3969 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3970 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_update_ioa_ucode()
3972 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3973 ioa_cfg->ucode_sglist = NULL; in ipr_update_ioa_ucode()
3974 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
3979 * ipr_store_update_fw - Update the firmware on the adapter
3995 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_update_fw()
4005 return -EACCES; in ipr_store_update_fw()
4013 if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) { in ipr_store_update_fw()
4014 dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname); in ipr_store_update_fw()
4015 return -EIO; in ipr_store_update_fw()
4018 image_hdr = (struct ipr_ucode_image_header *)fw_entry->data; in ipr_store_update_fw()
4020 src = (u8 *)image_hdr + be32_to_cpu(image_hdr->header_length); in ipr_store_update_fw()
4021 dnld_size = fw_entry->size - be32_to_cpu(image_hdr->header_length); in ipr_store_update_fw()
4025 dev_err(&ioa_cfg->pdev->dev, "Microcode buffer allocation failed\n"); in ipr_store_update_fw()
4027 return -ENOMEM; in ipr_store_update_fw()
4033 dev_err(&ioa_cfg->pdev->dev, in ipr_store_update_fw()
4059 * ipr_show_fw_type - Show the adapter's firmware type.
4071 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_fw_type()
4075 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_type()
4076 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->sis64); in ipr_show_fw_type()
4077 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_type()
4095 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_async_err_log()
4100 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4101 hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q, in ipr_read_async_err_log()
4104 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4107 ret = memory_read_from_buffer(buf, count, &off, &hostrcb->hcam, in ipr_read_async_err_log()
4108 sizeof(hostrcb->hcam)); in ipr_read_async_err_log()
4109 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4119 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_next_async_err_log()
4123 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4124 hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q, in ipr_next_async_err_log()
4127 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4132 list_move_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_next_async_err_log()
4133 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4163 * ipr_read_dump - Dump the adapter
4180 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_dump()
4188 return -EACCES; in ipr_read_dump()
4190 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4191 dump = ioa_cfg->dump; in ipr_read_dump()
4193 if (ioa_cfg->sdt_state != DUMP_OBTAINED || !dump) { in ipr_read_dump()
4194 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4197 kref_get(&dump->kref); in ipr_read_dump()
4198 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4200 if (off > dump->driver_dump.hdr.len) { in ipr_read_dump()
4201 kref_put(&dump->kref, ipr_release_dump); in ipr_read_dump()
4205 if (off + count > dump->driver_dump.hdr.len) { in ipr_read_dump()
4206 count = dump->driver_dump.hdr.len - off; in ipr_read_dump()
4210 if (count && off < sizeof(dump->driver_dump)) { in ipr_read_dump()
4211 if (off + count > sizeof(dump->driver_dump)) in ipr_read_dump()
4212 len = sizeof(dump->driver_dump) - off; in ipr_read_dump()
4215 src = (u8 *)&dump->driver_dump + off; in ipr_read_dump()
4219 count -= len; in ipr_read_dump()
4222 off -= sizeof(dump->driver_dump); in ipr_read_dump()
4224 if (ioa_cfg->sis64) in ipr_read_dump()
4226 (be32_to_cpu(dump->ioa_dump.sdt.hdr.num_entries_used) * in ipr_read_dump()
4234 len = sdt_end - off; in ipr_read_dump()
4237 src = (u8 *)&dump->ioa_dump + off; in ipr_read_dump()
4241 count -= len; in ipr_read_dump()
4244 off -= sdt_end; in ipr_read_dump()
4248 len = PAGE_ALIGN(off) - off; in ipr_read_dump()
4251 src = (u8 *)dump->ioa_dump.ioa_data[(off & PAGE_MASK) >> PAGE_SHIFT]; in ipr_read_dump()
4256 count -= len; in ipr_read_dump()
4259 kref_put(&dump->kref, ipr_release_dump); in ipr_read_dump()
4264 * ipr_alloc_dump - Prepare for adapter dump
4280 return -ENOMEM; in ipr_alloc_dump()
4283 if (ioa_cfg->sis64) in ipr_alloc_dump()
4293 return -ENOMEM; in ipr_alloc_dump()
4296 dump->ioa_dump.ioa_data = ioa_data; in ipr_alloc_dump()
4298 kref_init(&dump->kref); in ipr_alloc_dump()
4299 dump->ioa_cfg = ioa_cfg; in ipr_alloc_dump()
4301 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4303 if (INACTIVE != ioa_cfg->sdt_state) { in ipr_alloc_dump()
4304 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4305 vfree(dump->ioa_dump.ioa_data); in ipr_alloc_dump()
4310 ioa_cfg->dump = dump; in ipr_alloc_dump()
4311 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_alloc_dump()
4312 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead && !ioa_cfg->dump_taken) { in ipr_alloc_dump()
4313 ioa_cfg->dump_taken = 1; in ipr_alloc_dump()
4314 schedule_work(&ioa_cfg->work_q); in ipr_alloc_dump()
4316 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4322 * ipr_free_dump - Free adapter dump memory
4335 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4336 dump = ioa_cfg->dump; in ipr_free_dump()
4338 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4342 ioa_cfg->dump = NULL; in ipr_free_dump()
4343 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4345 kref_put(&dump->kref, ipr_release_dump); in ipr_free_dump()
4352 * ipr_write_dump - Setup dump state of adapter
4369 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_write_dump()
4373 return -EACCES; in ipr_write_dump()
4380 return -EINVAL; in ipr_write_dump()
4402 * ipr_change_queue_depth - Change the device's queue depth
4412 return sdev->queue_depth; in ipr_change_queue_depth()
4416 * ipr_show_adapter_handle - Show the adapter's resource handle for this device
4427 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_adapter_handle()
4430 ssize_t len = -ENXIO; in ipr_show_adapter_handle()
4432 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_handle()
4433 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_show_adapter_handle()
4435 len = snprintf(buf, PAGE_SIZE, "%08X\n", res->res_handle); in ipr_show_adapter_handle()
4436 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_handle()
4449 * ipr_show_resource_path - Show the resource path or the resource address for
4461 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_resource_path()
4464 ssize_t len = -ENXIO; in ipr_show_resource_path()
4467 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_path()
4468 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_show_resource_path()
4469 if (res && ioa_cfg->sis64) in ipr_show_resource_path()
4471 __ipr_format_res_path(res->res_path, buffer, in ipr_show_resource_path()
4474 len = snprintf(buf, PAGE_SIZE, "%d:%d:%d:%d\n", ioa_cfg->host->host_no, in ipr_show_resource_path()
4475 res->bus, res->target, res->lun); in ipr_show_resource_path()
4477 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_path()
4490 * ipr_show_device_id - Show the device_id for this device.
4501 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_device_id()
4504 ssize_t len = -ENXIO; in ipr_show_device_id()
4506 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_device_id()
4507 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_show_device_id()
4508 if (res && ioa_cfg->sis64) in ipr_show_device_id()
4509 len = snprintf(buf, PAGE_SIZE, "0x%llx\n", be64_to_cpu(res->dev_id)); in ipr_show_device_id()
4511 len = snprintf(buf, PAGE_SIZE, "0x%llx\n", res->lun_wwn); in ipr_show_device_id()
4513 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_device_id()
4526 * ipr_show_resource_type - Show the resource type for this device.
4537 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_resource_type()
4540 ssize_t len = -ENXIO; in ipr_show_resource_type()
4542 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_type()
4543 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_show_resource_type()
4546 len = snprintf(buf, PAGE_SIZE, "%x\n", res->type); in ipr_show_resource_type()
4548 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_type()
4561 * ipr_show_raw_mode - Show the adapter's raw mode
4573 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_raw_mode()
4578 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_raw_mode()
4579 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_show_raw_mode()
4581 len = snprintf(buf, PAGE_SIZE, "%d\n", res->raw_mode); in ipr_show_raw_mode()
4583 len = -ENXIO; in ipr_show_raw_mode()
4584 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_raw_mode()
4589 * ipr_store_raw_mode - Change the adapter's raw mode
4603 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_store_raw_mode()
4608 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_raw_mode()
4609 res = (struct ipr_resource_entry *)sdev->hostdata; in ipr_store_raw_mode()
4612 res->raw_mode = simple_strtoul(buf, NULL, 10); in ipr_store_raw_mode()
4614 if (res->sdev) in ipr_store_raw_mode()
4615 sdev_printk(KERN_INFO, res->sdev, "raw mode is %s\n", in ipr_store_raw_mode()
4616 res->raw_mode ? "enabled" : "disabled"); in ipr_store_raw_mode()
4618 len = -EINVAL; in ipr_store_raw_mode()
4620 len = -ENXIO; in ipr_store_raw_mode()
4621 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_raw_mode()
4646 * ipr_biosparam - Return the HSC mapping
4681 * ipr_find_starget - Find target based on bus/target.
4689 struct Scsi_Host *shost = dev_to_shost(&starget->dev); in ipr_find_starget()
4690 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_find_starget()
4693 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_find_starget()
4694 if ((res->bus == starget->channel) && in ipr_find_starget()
4695 (res->target == starget->id)) { in ipr_find_starget()
4704 * ipr_target_destroy - Destroy a SCSI target
4710 struct Scsi_Host *shost = dev_to_shost(&starget->dev); in ipr_target_destroy()
4711 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_target_destroy()
4713 if (ioa_cfg->sis64) { in ipr_target_destroy()
4715 if (starget->channel == IPR_ARRAY_VIRTUAL_BUS) in ipr_target_destroy()
4716 clear_bit(starget->id, ioa_cfg->array_ids); in ipr_target_destroy()
4717 else if (starget->channel == IPR_VSET_VIRTUAL_BUS) in ipr_target_destroy()
4718 clear_bit(starget->id, ioa_cfg->vset_ids); in ipr_target_destroy()
4719 else if (starget->channel == 0) in ipr_target_destroy()
4720 clear_bit(starget->id, ioa_cfg->target_ids); in ipr_target_destroy()
4726 * ipr_find_sdev - Find device based on bus/target/lun.
4734 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_find_sdev()
4737 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_find_sdev()
4738 if ((res->bus == sdev->channel) && in ipr_find_sdev()
4739 (res->target == sdev->id) && in ipr_find_sdev()
4740 (res->lun == sdev->lun)) in ipr_find_sdev()
4748 * ipr_slave_destroy - Unconfigure a SCSI device
4760 ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_destroy()
4762 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_destroy()
4763 res = (struct ipr_resource_entry *) sdev->hostdata; in ipr_slave_destroy()
4765 sdev->hostdata = NULL; in ipr_slave_destroy()
4766 res->sdev = NULL; in ipr_slave_destroy()
4768 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_destroy()
4772 * ipr_slave_configure - Configure a SCSI device
4782 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_configure()
4787 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
4788 res = sdev->hostdata; in ipr_slave_configure()
4791 sdev->type = TYPE_RAID; in ipr_slave_configure()
4793 sdev->scsi_level = 4; in ipr_slave_configure()
4794 sdev->no_uld_attach = 1; in ipr_slave_configure()
4797 sdev->scsi_level = SCSI_SPC_3; in ipr_slave_configure()
4798 sdev->no_report_opcodes = 1; in ipr_slave_configure()
4799 blk_queue_rq_timeout(sdev->request_queue, in ipr_slave_configure()
4801 blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); in ipr_slave_configure()
4803 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
4805 if (ioa_cfg->sis64) in ipr_slave_configure()
4808 res->res_path, buffer, sizeof(buffer))); in ipr_slave_configure()
4811 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
4816 * ipr_slave_alloc - Prepare for commands to a device.
4821 * can then use this pointer in ipr_queuecommand when
4825 * 0 on success / -ENXIO if device does not exist
4829 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_alloc()
4832 int rc = -ENXIO; in ipr_slave_alloc()
4834 sdev->hostdata = NULL; in ipr_slave_alloc()
4836 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
4840 res->sdev = sdev; in ipr_slave_alloc()
4841 res->add_to_ml = 0; in ipr_slave_alloc()
4842 res->in_erp = 0; in ipr_slave_alloc()
4843 sdev->hostdata = res; in ipr_slave_alloc()
4845 res->needs_sync_complete = 1; in ipr_slave_alloc()
4850 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
4851 return -ENXIO; in ipr_slave_alloc()
4855 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
4861 * ipr_match_lun - Match function for specified LUN
4870 if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device) in ipr_match_lun()
4876 * ipr_cmnd_is_free - Check if a command is free or not
4886 list_for_each_entry(loop_cmd, &ipr_cmd->hrrq->hrrq_free_q, queue) { in ipr_cmnd_is_free()
4895 * ipr_wait_for_ops - Wait for matching commands to complete
4898 * @match: match function to use
4918 spin_lock_irqsave(hrrq->lock, flags); in ipr_wait_for_ops()
4919 for (i = hrrq->min_cmd_id; i <= hrrq->max_cmd_id; i++) { in ipr_wait_for_ops()
4920 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
4923 ipr_cmd->eh_comp = ∁ in ipr_wait_for_ops()
4928 spin_unlock_irqrestore(hrrq->lock, flags); in ipr_wait_for_ops()
4938 spin_lock_irqsave(hrrq->lock, flags); in ipr_wait_for_ops()
4939 for (i = hrrq->min_cmd_id; i <= hrrq->max_cmd_id; i++) { in ipr_wait_for_ops()
4940 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
4943 ipr_cmd->eh_comp = NULL; in ipr_wait_for_ops()
4948 spin_unlock_irqrestore(hrrq->lock, flags); in ipr_wait_for_ops()
4952 dev_err(&ioa_cfg->pdev->dev, "Timed out waiting for aborted commands\n"); in ipr_wait_for_ops()
4970 ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; in ipr_eh_host_reset()
4971 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
4973 if (!ioa_cfg->in_reset_reload && !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_eh_host_reset()
4975 dev_err(&ioa_cfg->pdev->dev, in ipr_eh_host_reset()
4978 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_eh_host_reset()
4979 ioa_cfg->sdt_state = GET_DUMP; in ipr_eh_host_reset()
4982 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
4983 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_eh_host_reset()
4984 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
4988 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_eh_host_reset()
4993 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
4999 * ipr_device_reset - Reset the device
5009 * 0 on success / non-zero on failure
5021 ioarcb = &ipr_cmd->ioarcb; in ipr_device_reset()
5022 cmd_pkt = &ioarcb->cmd_pkt; in ipr_device_reset()
5024 if (ipr_cmd->ioa_cfg->sis64) in ipr_device_reset()
5025 ioarcb->add_cmd_parms_offset = cpu_to_be16(sizeof(*ioarcb)); in ipr_device_reset()
5027 ioarcb->res_handle = res->res_handle; in ipr_device_reset()
5028 cmd_pkt->request_type = IPR_RQTYPE_IOACMD; in ipr_device_reset()
5029 cmd_pkt->cdb[0] = IPR_RESET_DEVICE; in ipr_device_reset()
5032 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_device_reset()
5033 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_device_reset()
5036 return IPR_IOASC_SENSE_KEY(ioasc) ? -EIO : 0; in ipr_device_reset()
5040 * __ipr_eh_dev_reset - Reset the device
5057 ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; in __ipr_eh_dev_reset()
5058 res = scsi_cmd->device->hostdata; in __ipr_eh_dev_reset()
5062 * mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the in __ipr_eh_dev_reset()
5065 if (ioa_cfg->in_reset_reload) in __ipr_eh_dev_reset()
5067 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in __ipr_eh_dev_reset()
5070 res->resetting_device = 1; in __ipr_eh_dev_reset()
5074 res->resetting_device = 0; in __ipr_eh_dev_reset()
5075 res->reset_occurred = 1; in __ipr_eh_dev_reset()
5087 ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; in ipr_eh_dev_reset()
5088 res = cmd->device->hostdata; in ipr_eh_dev_reset()
5093 spin_lock_irq(cmd->device->host->host_lock); in ipr_eh_dev_reset()
5095 spin_unlock_irq(cmd->device->host->host_lock); in ipr_eh_dev_reset()
5098 rc = ipr_wait_for_ops(ioa_cfg, cmd->device, ipr_match_lun); in ipr_eh_dev_reset()
5104 * ipr_bus_reset_done - Op done function for bus reset.
5114 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_bus_reset_done()
5118 if (!ioa_cfg->sis64) in ipr_bus_reset_done()
5119 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_bus_reset_done()
5120 if (res->res_handle == ipr_cmd->ioarcb.res_handle) { in ipr_bus_reset_done()
5121 scsi_report_bus_reset(ioa_cfg->host, res->bus); in ipr_bus_reset_done()
5130 if (ipr_cmd->sibling->sibling) in ipr_bus_reset_done()
5131 ipr_cmd->sibling->sibling = NULL; in ipr_bus_reset_done()
5133 ipr_cmd->sibling->done(ipr_cmd->sibling); in ipr_bus_reset_done()
5135 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_bus_reset_done()
5140 * ipr_abort_timeout - An abort task has timed out
5154 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_abort_timeout()
5159 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5160 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) { in ipr_abort_timeout()
5161 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5165 sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n"); in ipr_abort_timeout()
5167 ipr_cmd->sibling = reset_cmd; in ipr_abort_timeout()
5168 reset_cmd->sibling = ipr_cmd; in ipr_abort_timeout()
5169 reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle; in ipr_abort_timeout()
5170 cmd_pkt = &reset_cmd->ioarcb.cmd_pkt; in ipr_abort_timeout()
5171 cmd_pkt->request_type = IPR_RQTYPE_IOACMD; in ipr_abort_timeout()
5172 cmd_pkt->cdb[0] = IPR_RESET_DEVICE; in ipr_abort_timeout()
5173 cmd_pkt->cdb[2] = IPR_RESET_TYPE_SELECT | IPR_BUS_RESET; in ipr_abort_timeout()
5176 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5181 * ipr_cancel_op - Cancel specified op
5200 ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata; in ipr_cancel_op()
5201 res = scsi_cmd->device->hostdata; in ipr_cancel_op()
5204 * This will force the mid-layer to call ipr_eh_host_reset, in ipr_cancel_op()
5207 if (ioa_cfg->in_reset_reload || in ipr_cancel_op()
5208 ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_cancel_op()
5218 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_cancel_op()
5224 spin_lock(&hrrq->_lock); in ipr_cancel_op()
5225 for (i = hrrq->min_cmd_id; i <= hrrq->max_cmd_id; i++) { in ipr_cancel_op()
5226 if (ioa_cfg->ipr_cmnd_list[i]->scsi_cmd == scsi_cmd) { in ipr_cancel_op()
5227 if (!ipr_cmnd_is_free(ioa_cfg->ipr_cmnd_list[i])) { in ipr_cancel_op()
5233 spin_unlock(&hrrq->_lock); in ipr_cancel_op()
5240 ipr_cmd->ioarcb.res_handle = res->res_handle; in ipr_cancel_op()
5241 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_cancel_op()
5242 cmd_pkt->request_type = IPR_RQTYPE_IOACMD; in ipr_cancel_op()
5243 cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; in ipr_cancel_op()
5244 ipr_cmd->u.sdev = scsi_cmd->device; in ipr_cancel_op()
5247 scsi_cmd->cmnd[0]); in ipr_cancel_op()
5249 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_cancel_op()
5260 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_cancel_op()
5262 res->needs_sync_complete = 1; in ipr_cancel_op()
5269 * ipr_scan_finished - Report whether scan is done
5279 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_scan_finished()
5282 spin_lock_irqsave(shost->host_lock, lock_flags); in ipr_scan_finished()
5283 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead || ioa_cfg->scan_done) in ipr_scan_finished()
5285 if ((elapsed_time/HZ) > (ioa_cfg->transop_timeout * 2)) in ipr_scan_finished()
5287 spin_unlock_irqrestore(shost->host_lock, lock_flags); in ipr_scan_finished()
5292 * ipr_eh_abort - Reset the host adapter
5306 ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; in ipr_eh_abort()
5308 spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); in ipr_eh_abort()
5310 spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); in ipr_eh_abort()
5313 rc = ipr_wait_for_ops(ioa_cfg, scsi_cmd->device, ipr_match_lun); in ipr_eh_abort()
5319 * ipr_handle_other_interrupt - Handle "other" interrupts
5332 int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); in ipr_handle_other_interrupt()
5339 if (ioa_cfg->sis64) { in ipr_handle_other_interrupt()
5340 int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_handle_other_interrupt()
5341 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; in ipr_handle_other_interrupt()
5345 writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.clr_interrupt_reg); in ipr_handle_other_interrupt()
5346 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; in ipr_handle_other_interrupt()
5347 list_del(&ioa_cfg->reset_cmd->queue); in ipr_handle_other_interrupt()
5348 del_timer(&ioa_cfg->reset_cmd->timer); in ipr_handle_other_interrupt()
5349 ipr_reset_ioa_job(ioa_cfg->reset_cmd); in ipr_handle_other_interrupt()
5359 writel(IPR_PCII_IOA_TRANS_TO_OPER, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_handle_other_interrupt()
5360 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_handle_other_interrupt()
5362 list_del(&ioa_cfg->reset_cmd->queue); in ipr_handle_other_interrupt()
5363 del_timer(&ioa_cfg->reset_cmd->timer); in ipr_handle_other_interrupt()
5364 ipr_reset_ioa_job(ioa_cfg->reset_cmd); in ipr_handle_other_interrupt()
5366 if (ioa_cfg->clear_isr) { in ipr_handle_other_interrupt()
5368 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5370 writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32); in ipr_handle_other_interrupt()
5371 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_handle_other_interrupt()
5376 ioa_cfg->ioa_unit_checked = 1; in ipr_handle_other_interrupt()
5378 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5381 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5384 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_handle_other_interrupt()
5385 ioa_cfg->sdt_state = GET_DUMP; in ipr_handle_other_interrupt()
5395 * ipr_isr_eh - Interrupt service routine error handler
5405 ioa_cfg->errors_logged++; in ipr_isr_eh()
5406 dev_err(&ioa_cfg->pdev->dev, "%s %d\n", msg, number); in ipr_isr_eh()
5408 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_isr_eh()
5409 ioa_cfg->sdt_state = GET_DUMP; in ipr_isr_eh()
5420 struct ipr_ioa_cfg *ioa_cfg = hrr_queue->ioa_cfg; in ipr_process_hrrq()
5424 if (!hrr_queue->allow_interrupts) in ipr_process_hrrq()
5427 while ((be32_to_cpu(*hrr_queue->hrrq_curr) & IPR_HRRQ_TOGGLE_BIT) == in ipr_process_hrrq()
5428 hrr_queue->toggle_bit) { in ipr_process_hrrq()
5430 cmd_index = (be32_to_cpu(*hrr_queue->hrrq_curr) & in ipr_process_hrrq()
5434 if (unlikely(cmd_index > hrr_queue->max_cmd_id || in ipr_process_hrrq()
5435 cmd_index < hrr_queue->min_cmd_id)) { in ipr_process_hrrq()
5442 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index]; in ipr_process_hrrq()
5443 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_hrrq()
5447 list_move_tail(&ipr_cmd->queue, doneq); in ipr_process_hrrq()
5449 if (hrr_queue->hrrq_curr < hrr_queue->hrrq_end) { in ipr_process_hrrq()
5450 hrr_queue->hrrq_curr++; in ipr_process_hrrq()
5452 hrr_queue->hrrq_curr = hrr_queue->hrrq_start; in ipr_process_hrrq()
5453 hrr_queue->toggle_bit ^= 1u; in ipr_process_hrrq()
5473 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_iopoll()
5478 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_iopoll()
5481 list_del(&ipr_cmd->queue); in ipr_iopoll()
5482 del_timer(&ipr_cmd->timer); in ipr_iopoll()
5483 ipr_cmd->fast_done(ipr_cmd); in ipr_iopoll()
5490 * ipr_isr - Interrupt service routine
5500 struct ipr_ioa_cfg *ioa_cfg = hrrq->ioa_cfg; in ipr_isr()
5509 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_isr()
5511 if (!hrrq->allow_interrupts) { in ipr_isr()
5512 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_isr()
5517 if (ipr_process_hrrq(hrrq, -1, &doneq)) { in ipr_isr()
5520 if (!ioa_cfg->clear_isr) in ipr_isr()
5527 ioa_cfg->regs.clr_interrupt_reg32); in ipr_isr()
5528 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_isr()
5533 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_isr()
5548 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_isr()
5550 list_del(&ipr_cmd->queue); in ipr_isr()
5551 del_timer(&ipr_cmd->timer); in ipr_isr()
5552 ipr_cmd->fast_done(ipr_cmd); in ipr_isr()
5558 * ipr_isr_mhrrq - Interrupt service routine
5568 struct ipr_ioa_cfg *ioa_cfg = hrrq->ioa_cfg; in ipr_isr_mhrrq()
5574 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_isr_mhrrq()
5577 if (!hrrq->allow_interrupts) { in ipr_isr_mhrrq()
5578 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_isr_mhrrq()
5582 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_isr_mhrrq()
5583 if ((be32_to_cpu(*hrrq->hrrq_curr) & IPR_HRRQ_TOGGLE_BIT) == in ipr_isr_mhrrq()
5584 hrrq->toggle_bit) { in ipr_isr_mhrrq()
5585 irq_poll_sched(&hrrq->iopoll); in ipr_isr_mhrrq()
5586 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_isr_mhrrq()
5590 if ((be32_to_cpu(*hrrq->hrrq_curr) & IPR_HRRQ_TOGGLE_BIT) == in ipr_isr_mhrrq()
5591 hrrq->toggle_bit) in ipr_isr_mhrrq()
5593 if (ipr_process_hrrq(hrrq, -1, &doneq)) in ipr_isr_mhrrq()
5597 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_isr_mhrrq()
5600 list_del(&ipr_cmd->queue); in ipr_isr_mhrrq()
5601 del_timer(&ipr_cmd->timer); in ipr_isr_mhrrq()
5602 ipr_cmd->fast_done(ipr_cmd); in ipr_isr_mhrrq()
5608 * ipr_build_ioadl64 - Build a scatter/gather list and map the buffer
5613 * 0 on success / -1 on failure
5622 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_build_ioadl64()
5623 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioadl64()
5624 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_build_ioadl64()
5633 dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n"); in ipr_build_ioadl64()
5634 return -1; in ipr_build_ioadl64()
5637 ipr_cmd->dma_use_sg = nseg; in ipr_build_ioadl64()
5639 ioarcb->data_transfer_length = cpu_to_be32(length); in ipr_build_ioadl64()
5640 ioarcb->ioadl_len = in ipr_build_ioadl64()
5641 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl64()
5643 if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) { in ipr_build_ioadl64()
5645 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_build_ioadl64()
5646 } else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) in ipr_build_ioadl64()
5649 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ioadl64()
5655 ioadl64[i-1].flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); in ipr_build_ioadl64()
5660 * ipr_build_ioadl - Build a scatter/gather list and map the buffer
5665 * 0 on success / -1 on failure
5674 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_build_ioadl()
5675 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioadl()
5676 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_build_ioadl()
5684 dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n"); in ipr_build_ioadl()
5685 return -1; in ipr_build_ioadl()
5688 ipr_cmd->dma_use_sg = nseg; in ipr_build_ioadl()
5690 if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) { in ipr_build_ioadl()
5692 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_build_ioadl()
5693 ioarcb->data_transfer_length = cpu_to_be32(length); in ipr_build_ioadl()
5694 ioarcb->ioadl_len = in ipr_build_ioadl()
5695 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl()
5696 } else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) { in ipr_build_ioadl()
5698 ioarcb->read_data_transfer_length = cpu_to_be32(length); in ipr_build_ioadl()
5699 ioarcb->read_ioadl_len = in ipr_build_ioadl()
5700 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl()
5703 if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) { in ipr_build_ioadl()
5704 ioadl = ioarcb->u.add_data.u.ioadl; in ipr_build_ioadl()
5705 ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) + in ipr_build_ioadl()
5707 ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; in ipr_build_ioadl()
5710 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ioadl()
5716 ioadl[i-1].flags_and_data_len |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); in ipr_build_ioadl()
5721 * __ipr_erp_done - Process completion of ERP for a device
5732 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in __ipr_erp_done()
5733 struct ipr_resource_entry *res = scsi_cmd->device->hostdata; in __ipr_erp_done()
5734 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in __ipr_erp_done()
5737 scsi_cmd->result |= (DID_ERROR << 16); in __ipr_erp_done()
5741 memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, in __ipr_erp_done()
5747 res->needs_sync_complete = 1; in __ipr_erp_done()
5748 res->in_erp = 0; in __ipr_erp_done()
5750 scsi_dma_unmap(ipr_cmd->scsi_cmd); in __ipr_erp_done()
5752 if (ipr_cmd->eh_comp) in __ipr_erp_done()
5753 complete(ipr_cmd->eh_comp); in __ipr_erp_done()
5754 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in __ipr_erp_done()
5758 * ipr_erp_done - Process completion of ERP for a device
5769 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_erp_done()
5772 spin_lock_irqsave(&hrrq->_lock, hrrq_flags); in ipr_erp_done()
5774 spin_unlock_irqrestore(&hrrq->_lock, hrrq_flags); in ipr_erp_done()
5778 * ipr_reinit_ipr_cmnd_for_erp - Re-initialize a cmnd block to be used for ERP
5786 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_reinit_ipr_cmnd_for_erp()
5787 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_reinit_ipr_cmnd_for_erp()
5788 dma_addr_t dma_addr = ipr_cmd->dma_addr; in ipr_reinit_ipr_cmnd_for_erp()
5790 memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt)); in ipr_reinit_ipr_cmnd_for_erp()
5791 ioarcb->data_transfer_length = 0; in ipr_reinit_ipr_cmnd_for_erp()
5792 ioarcb->read_data_transfer_length = 0; in ipr_reinit_ipr_cmnd_for_erp()
5793 ioarcb->ioadl_len = 0; in ipr_reinit_ipr_cmnd_for_erp()
5794 ioarcb->read_ioadl_len = 0; in ipr_reinit_ipr_cmnd_for_erp()
5795 ioasa->hdr.ioasc = 0; in ipr_reinit_ipr_cmnd_for_erp()
5796 ioasa->hdr.residual_data_len = 0; in ipr_reinit_ipr_cmnd_for_erp()
5798 if (ipr_cmd->ioa_cfg->sis64) in ipr_reinit_ipr_cmnd_for_erp()
5799 ioarcb->u.sis64_addr_data.data_ioadl_addr = in ipr_reinit_ipr_cmnd_for_erp()
5802 ioarcb->write_ioadl_addr = in ipr_reinit_ipr_cmnd_for_erp()
5804 ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; in ipr_reinit_ipr_cmnd_for_erp()
5809 * __ipr_erp_request_sense - Send request sense to a device
5820 struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in __ipr_erp_request_sense()
5821 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in __ipr_erp_request_sense()
5830 cmd_pkt->request_type = IPR_RQTYPE_SCSICDB; in __ipr_erp_request_sense()
5831 cmd_pkt->cdb[0] = REQUEST_SENSE; in __ipr_erp_request_sense()
5832 cmd_pkt->cdb[4] = SCSI_SENSE_BUFFERSIZE; in __ipr_erp_request_sense()
5833 cmd_pkt->flags_hi |= IPR_FLAGS_HI_SYNC_OVERRIDE; in __ipr_erp_request_sense()
5834 cmd_pkt->flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; in __ipr_erp_request_sense()
5835 cmd_pkt->timeout = cpu_to_be16(IPR_REQUEST_SENSE_TIMEOUT / HZ); in __ipr_erp_request_sense()
5837 ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma, in __ipr_erp_request_sense()
5845 * ipr_erp_request_sense - Send request sense to a device
5856 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_erp_request_sense()
5859 spin_lock_irqsave(&hrrq->_lock, hrrq_flags); in ipr_erp_request_sense()
5861 spin_unlock_irqrestore(&hrrq->_lock, hrrq_flags); in ipr_erp_request_sense()
5865 * ipr_erp_cancel_all - Send cancel all to a device
5878 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_erp_cancel_all()
5879 struct ipr_resource_entry *res = scsi_cmd->device->hostdata; in ipr_erp_cancel_all()
5882 res->in_erp = 1; in ipr_erp_cancel_all()
5886 if (!scsi_cmd->device->simple_tags) { in ipr_erp_cancel_all()
5891 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_erp_cancel_all()
5892 cmd_pkt->request_type = IPR_RQTYPE_IOACMD; in ipr_erp_cancel_all()
5893 cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; in ipr_erp_cancel_all()
5900 * ipr_dump_ioasa - Dump contents of IOASA
5918 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_dump_ioasa()
5922 ioasc = be32_to_cpu(ioasa->hdr.ioasc) & IPR_IOASC_IOASC_MASK; in ipr_dump_ioasa()
5923 fd_ioasc = be32_to_cpu(ioasa->hdr.fd_ioasc) & IPR_IOASC_IOASC_MASK; in ipr_dump_ioasa()
5928 if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL) in ipr_dump_ioasa()
5936 if (ioa_cfg->log_level < IPR_MAX_LOG_LEVEL) { in ipr_dump_ioasa()
5938 if (ioasa->hdr.ilid != 0) in ipr_dump_ioasa()
5950 data_len = be16_to_cpu(ioasa->hdr.ret_stat_len); in ipr_dump_ioasa()
5951 if (ioa_cfg->sis64 && sizeof(struct ipr_ioasa64) < data_len) in ipr_dump_ioasa()
5953 else if (!ioa_cfg->sis64 && sizeof(struct ipr_ioasa) < data_len) in ipr_dump_ioasa()
5968 * ipr_gen_sense - Generate SCSI sense data from an IOASA
5977 u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer; in ipr_gen_sense()
5978 struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata; in ipr_gen_sense()
5979 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_gen_sense()
5980 u32 ioasc = be32_to_cpu(ioasa->hdr.ioasc); in ipr_gen_sense()
5987 ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION; in ipr_gen_sense()
5991 ioasa->u.vset.failing_lba_hi != 0) { in ipr_gen_sense()
6002 failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_hi); in ipr_gen_sense()
6009 failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo); in ipr_gen_sense()
6023 (be32_to_cpu(ioasa->hdr.ioasc_specific) & IPR_FIELD_POINTER_VALID)) { in ipr_gen_sense()
6034 be32_to_cpu(ioasa->hdr.ioasc_specific)) >> 8) & 0xff; in ipr_gen_sense()
6037 be32_to_cpu(ioasa->hdr.ioasc_specific)) & 0xff; in ipr_gen_sense()
6041 failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo); in ipr_gen_sense()
6043 failing_lba = be32_to_cpu(ioasa->u.dasd.failing_lba); in ipr_gen_sense()
6058 * ipr_get_autosense - Copy autosense data to sense buffer
6069 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_get_autosense()
6070 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64; in ipr_get_autosense()
6072 if ((be32_to_cpu(ioasa->hdr.ioasc_specific) & IPR_AUTOSENSE_VALID) == 0) in ipr_get_autosense()
6075 if (ipr_cmd->ioa_cfg->sis64) in ipr_get_autosense()
6076 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data, in ipr_get_autosense()
6077 min_t(u16, be16_to_cpu(ioasa64->auto_sense.auto_sense_len), in ipr_get_autosense()
6080 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data, in ipr_get_autosense()
6081 min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len), in ipr_get_autosense()
6087 * ipr_erp_start - Process an error response for a SCSI op
6100 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_erp_start()
6101 struct ipr_resource_entry *res = scsi_cmd->device->hostdata; in ipr_erp_start()
6102 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_erp_start()
6118 scsi_cmd->result |= (DID_ABORT << 16); in ipr_erp_start()
6120 scsi_cmd->result |= (DID_IMM_RETRY << 16); in ipr_erp_start()
6124 scsi_cmd->result |= (DID_NO_CONNECT << 16); in ipr_erp_start()
6127 scsi_cmd->result |= (DID_NO_CONNECT << 16); in ipr_erp_start()
6129 res->needs_sync_complete = 1; in ipr_erp_start()
6132 if (!res->in_erp) in ipr_erp_start()
6133 res->needs_sync_complete = 1; in ipr_erp_start()
6134 scsi_cmd->result |= (DID_IMM_RETRY << 16); in ipr_erp_start()
6140 * so SCSI mid-layer and upper layers handle it accordingly. in ipr_erp_start()
6142 if (scsi_cmd->result != SAM_STAT_CHECK_CONDITION) in ipr_erp_start()
6143 scsi_cmd->result |= (DID_PASSTHROUGH << 16); in ipr_erp_start()
6151 if (!res->resetting_device) in ipr_erp_start()
6152 scsi_report_bus_reset(ioa_cfg->host, scsi_cmd->device->channel); in ipr_erp_start()
6153 scsi_cmd->result |= (DID_ERROR << 16); in ipr_erp_start()
6155 res->needs_sync_complete = 1; in ipr_erp_start()
6158 scsi_cmd->result |= IPR_IOASC_SENSE_STATUS(ioasc); in ipr_erp_start()
6168 res->needs_sync_complete = 1; in ipr_erp_start()
6173 if (res->raw_mode) { in ipr_erp_start()
6174 res->raw_mode = 0; in ipr_erp_start()
6175 scsi_cmd->result |= (DID_IMM_RETRY << 16); in ipr_erp_start()
6177 scsi_cmd->result |= (DID_ERROR << 16); in ipr_erp_start()
6181 scsi_cmd->result |= (DID_ERROR << 16); in ipr_erp_start()
6183 res->needs_sync_complete = 1; in ipr_erp_start()
6187 scsi_dma_unmap(ipr_cmd->scsi_cmd); in ipr_erp_start()
6189 if (ipr_cmd->eh_comp) in ipr_erp_start()
6190 complete(ipr_cmd->eh_comp); in ipr_erp_start()
6191 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_erp_start()
6195 * ipr_scsi_done - mid-layer done function
6199 * ops generated by the SCSI mid-layer
6206 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_scsi_done()
6207 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_scsi_done()
6208 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_scsi_done()
6211 scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len)); in ipr_scsi_done()
6216 spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags); in ipr_scsi_done()
6218 if (ipr_cmd->eh_comp) in ipr_scsi_done()
6219 complete(ipr_cmd->eh_comp); in ipr_scsi_done()
6220 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_scsi_done()
6221 spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags); in ipr_scsi_done()
6223 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_scsi_done()
6224 spin_lock(&ipr_cmd->hrrq->_lock); in ipr_scsi_done()
6226 spin_unlock(&ipr_cmd->hrrq->_lock); in ipr_scsi_done()
6227 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_scsi_done()
6232 * ipr_queuecommand - Queue a mid-layer request
6236 * This function queues a request generated by the mid-layer.
6255 ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_queuecommand()
6257 scsi_cmd->result = (DID_OK << 16); in ipr_queuecommand()
6258 res = scsi_cmd->device->hostdata; in ipr_queuecommand()
6261 hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_queuecommand()
6263 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6269 if (unlikely(!hrrq->allow_cmds && !hrrq->ioa_is_dead && !hrrq->removing_ioa)) { in ipr_queuecommand()
6270 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6275 * FIXME - Create scsi_set_host_offline interface in ipr_queuecommand()
6278 if (unlikely(hrrq->ioa_is_dead || hrrq->removing_ioa || !res)) { in ipr_queuecommand()
6279 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6285 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6288 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6291 ioarcb = &ipr_cmd->ioarcb; in ipr_queuecommand()
6293 memcpy(ioarcb->cmd_pkt.cdb, scsi_cmd->cmnd, scsi_cmd->cmd_len); in ipr_queuecommand()
6294 ipr_cmd->scsi_cmd = scsi_cmd; in ipr_queuecommand()
6295 ipr_cmd->done = ipr_scsi_eh_done; in ipr_queuecommand()
6298 if (scsi_cmd->underflow == 0) in ipr_queuecommand()
6299 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; in ipr_queuecommand()
6301 if (res->reset_occurred) { in ipr_queuecommand()
6302 res->reset_occurred = 0; in ipr_queuecommand()
6303 ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_DELAY_AFTER_RST; in ipr_queuecommand()
6308 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC; in ipr_queuecommand()
6310 ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_ALIGNED_BFR; in ipr_queuecommand()
6311 if (scsi_cmd->flags & SCMD_TAGGED) in ipr_queuecommand()
6312 ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_SIMPLE_TASK; in ipr_queuecommand()
6314 ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_UNTAGGED_TASK; in ipr_queuecommand()
6317 if (scsi_cmd->cmnd[0] >= 0xC0 && in ipr_queuecommand()
6318 (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) { in ipr_queuecommand()
6319 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_queuecommand()
6321 if (res->raw_mode && ipr_is_af_dasd_device(res)) { in ipr_queuecommand()
6322 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_PIPE; in ipr_queuecommand()
6324 if (scsi_cmd->underflow == 0) in ipr_queuecommand()
6325 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; in ipr_queuecommand()
6328 if (ioa_cfg->sis64) in ipr_queuecommand()
6333 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6334 if (unlikely(rc || (!hrrq->allow_cmds && !hrrq->ioa_is_dead))) { in ipr_queuecommand()
6335 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q); in ipr_queuecommand()
6336 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6342 if (unlikely(hrrq->ioa_is_dead)) { in ipr_queuecommand()
6343 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q); in ipr_queuecommand()
6344 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6349 ioarcb->res_handle = res->res_handle; in ipr_queuecommand()
6350 if (res->needs_sync_complete) { in ipr_queuecommand()
6351 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_SYNC_COMPLETE; in ipr_queuecommand()
6352 res->needs_sync_complete = 0; in ipr_queuecommand()
6354 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_pending_q); in ipr_queuecommand()
6357 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6361 spin_lock_irqsave(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6362 memset(scsi_cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in ipr_queuecommand()
6363 scsi_cmd->result = (DID_NO_CONNECT << 16); in ipr_queuecommand()
6365 spin_unlock_irqrestore(hrrq->lock, hrrq_flags); in ipr_queuecommand()
6370 * ipr_ioa_info - Get information about the card/driver
6382 ioa_cfg = (struct ipr_ioa_cfg *) host->hostdata; in ipr_ioa_info()
6384 spin_lock_irqsave(host->host_lock, lock_flags); in ipr_ioa_info()
6385 sprintf(buffer, "IBM %X Storage Adapter", ioa_cfg->type); in ipr_ioa_info()
6386 spin_unlock_irqrestore(host->host_lock, lock_flags); in ipr_ioa_info()
6407 .this_id = -1,
6417 * ipr_ioa_bringdown_done - IOA bring down completion.
6428 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_bringdown_done()
6432 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in ipr_ioa_bringdown_done()
6434 ioa_cfg->scsi_unblock = 1; in ipr_ioa_bringdown_done()
6435 schedule_work(&ioa_cfg->work_q); in ipr_ioa_bringdown_done()
6438 ioa_cfg->in_reset_reload = 0; in ipr_ioa_bringdown_done()
6439 ioa_cfg->reset_retries = 0; in ipr_ioa_bringdown_done()
6440 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_ioa_bringdown_done()
6441 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_ioa_bringdown_done()
6442 ioa_cfg->hrrq[i].ioa_is_dead = 1; in ipr_ioa_bringdown_done()
6443 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_ioa_bringdown_done()
6447 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_ioa_bringdown_done()
6448 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_ioa_bringdown_done()
6455 * ipr_ioa_reset_done - IOA reset completion.
6459 * It schedules any necessary mid-layer add/removes and
6467 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_reset_done()
6472 ioa_cfg->in_reset_reload = 0; in ipr_ioa_reset_done()
6473 for (j = 0; j < ioa_cfg->hrrq_num; j++) { in ipr_ioa_reset_done()
6474 spin_lock(&ioa_cfg->hrrq[j]._lock); in ipr_ioa_reset_done()
6475 ioa_cfg->hrrq[j].allow_cmds = 1; in ipr_ioa_reset_done()
6476 spin_unlock(&ioa_cfg->hrrq[j]._lock); in ipr_ioa_reset_done()
6479 ioa_cfg->reset_cmd = NULL; in ipr_ioa_reset_done()
6480 ioa_cfg->doorbell |= IPR_RUNTIME_RESET; in ipr_ioa_reset_done()
6482 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_ioa_reset_done()
6483 if (res->add_to_ml || res->del_from_ml) { in ipr_ioa_reset_done()
6488 schedule_work(&ioa_cfg->work_q); in ipr_ioa_reset_done()
6491 list_del_init(&ioa_cfg->hostrcb[j]->queue); in ipr_ioa_reset_done()
6495 ioa_cfg->hostrcb[j]); in ipr_ioa_reset_done()
6499 ioa_cfg->hostrcb[j]); in ipr_ioa_reset_done()
6502 scsi_report_bus_reset(ioa_cfg->host, IPR_VSET_BUS); in ipr_ioa_reset_done()
6503 dev_info(&ioa_cfg->pdev->dev, "IOA initialized.\n"); in ipr_ioa_reset_done()
6505 ioa_cfg->reset_retries = 0; in ipr_ioa_reset_done()
6506 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_ioa_reset_done()
6507 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_ioa_reset_done()
6509 ioa_cfg->scsi_unblock = 1; in ipr_ioa_reset_done()
6510 schedule_work(&ioa_cfg->work_q); in ipr_ioa_reset_done()
6516 * ipr_set_sup_dev_dflt - Initialize a Set Supported Device buffer
6527 memcpy(&supported_dev->vpids, vpids, sizeof(struct ipr_std_inq_vpids)); in ipr_set_sup_dev_dflt()
6528 supported_dev->num_records = 1; in ipr_set_sup_dev_dflt()
6529 supported_dev->data_length = in ipr_set_sup_dev_dflt()
6531 supported_dev->reserved = 0; in ipr_set_sup_dev_dflt()
6535 * ipr_set_supported_devs - Send Set Supported Devices for a device
6545 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_set_supported_devs()
6546 struct ipr_supported_device *supp_dev = &ioa_cfg->vpd_cbs->supp_dev; in ipr_set_supported_devs()
6547 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_set_supported_devs()
6548 struct ipr_resource_entry *res = ipr_cmd->u.res; in ipr_set_supported_devs()
6550 ipr_cmd->job_step = ipr_ioa_reset_done; in ipr_set_supported_devs()
6552 list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) { in ipr_set_supported_devs()
6556 ipr_cmd->u.res = res; in ipr_set_supported_devs()
6557 ipr_set_sup_dev_dflt(supp_dev, &res->std_inq_data.vpids); in ipr_set_supported_devs()
6559 ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_set_supported_devs()
6560 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_set_supported_devs()
6561 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_set_supported_devs()
6563 ioarcb->cmd_pkt.cdb[0] = IPR_SET_SUPPORTED_DEVICES; in ipr_set_supported_devs()
6564 ioarcb->cmd_pkt.cdb[1] = IPR_SET_ALL_SUPPORTED_DEVICES; in ipr_set_supported_devs()
6565 ioarcb->cmd_pkt.cdb[7] = (sizeof(struct ipr_supported_device) >> 8) & 0xff; in ipr_set_supported_devs()
6566 ioarcb->cmd_pkt.cdb[8] = sizeof(struct ipr_supported_device) & 0xff; in ipr_set_supported_devs()
6569 ioa_cfg->vpd_cbs_dma + in ipr_set_supported_devs()
6577 if (!ioa_cfg->sis64) in ipr_set_supported_devs()
6578 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_set_supported_devs()
6588 * ipr_get_mode_page - Locate specified mode page
6603 if (!mode_pages || (mode_pages->hdr.length == 0)) in ipr_get_mode_page()
6606 length = (mode_pages->hdr.length + 1) - 4 - mode_pages->hdr.block_desc_len; in ipr_get_mode_page()
6608 (mode_pages->data + mode_pages->hdr.block_desc_len); in ipr_get_mode_page()
6612 if (mode_hdr->page_length >= (len - sizeof(struct ipr_mode_page_hdr))) in ipr_get_mode_page()
6617 mode_hdr->page_length); in ipr_get_mode_page()
6618 length -= page_length; in ipr_get_mode_page()
6627 * ipr_check_term_power - Check for term power errors
6647 entry_length = mode_page->entry_length; in ipr_check_term_power()
6649 bus = mode_page->bus; in ipr_check_term_power()
6651 for (i = 0; i < mode_page->num_entries; i++) { in ipr_check_term_power()
6652 if (bus->flags & IPR_SCSI_ATTR_NO_TERM_PWR) { in ipr_check_term_power()
6653 dev_err(&ioa_cfg->pdev->dev, in ipr_check_term_power()
6655 bus->res_addr.bus); in ipr_check_term_power()
6663 * ipr_scsi_bus_speed_limit - Limit the SCSI speed based on SES table
6680 ioa_cfg->bus_attr[i].bus_width); in ipr_scsi_bus_speed_limit()
6682 if (max_xfer_rate < ioa_cfg->bus_attr[i].max_xfer_rate) in ipr_scsi_bus_speed_limit()
6683 ioa_cfg->bus_attr[i].max_xfer_rate = max_xfer_rate; in ipr_scsi_bus_speed_limit()
6688 * ipr_modify_ioafp_mode_page_28 - Modify IOAFP Mode Page 28
6708 entry_length = mode_page->entry_length; in ipr_modify_ioafp_mode_page_28()
6711 for (i = 0, bus = mode_page->bus; in ipr_modify_ioafp_mode_page_28()
6712 i < mode_page->num_entries; in ipr_modify_ioafp_mode_page_28()
6714 if (bus->res_addr.bus > IPR_MAX_NUM_BUSES) { in ipr_modify_ioafp_mode_page_28()
6715 dev_err(&ioa_cfg->pdev->dev, in ipr_modify_ioafp_mode_page_28()
6717 IPR_GET_PHYS_LOC(bus->res_addr)); in ipr_modify_ioafp_mode_page_28()
6721 bus_attr = &ioa_cfg->bus_attr[i]; in ipr_modify_ioafp_mode_page_28()
6722 bus->extended_reset_delay = IPR_EXTENDED_RESET_DELAY; in ipr_modify_ioafp_mode_page_28()
6723 bus->bus_width = bus_attr->bus_width; in ipr_modify_ioafp_mode_page_28()
6724 bus->max_xfer_rate = cpu_to_be32(bus_attr->max_xfer_rate); in ipr_modify_ioafp_mode_page_28()
6725 bus->flags &= ~IPR_SCSI_ATTR_QAS_MASK; in ipr_modify_ioafp_mode_page_28()
6726 if (bus_attr->qas_enabled) in ipr_modify_ioafp_mode_page_28()
6727 bus->flags |= IPR_SCSI_ATTR_ENABLE_QAS; in ipr_modify_ioafp_mode_page_28()
6729 bus->flags |= IPR_SCSI_ATTR_DISABLE_QAS; in ipr_modify_ioafp_mode_page_28()
6734 * ipr_build_mode_select - Build a mode select command
6748 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_mode_select()
6750 ioarcb->res_handle = res_handle; in ipr_build_mode_select()
6751 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; in ipr_build_mode_select()
6752 ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; in ipr_build_mode_select()
6753 ioarcb->cmd_pkt.cdb[0] = MODE_SELECT; in ipr_build_mode_select()
6754 ioarcb->cmd_pkt.cdb[1] = parm; in ipr_build_mode_select()
6755 ioarcb->cmd_pkt.cdb[4] = xfer_len; in ipr_build_mode_select()
6761 * ipr_ioafp_mode_select_page28 - Issue Mode Select Page 28 to IOA
6772 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page28()
6773 struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages; in ipr_ioafp_mode_select_page28()
6780 length = mode_pages->hdr.length + 1; in ipr_ioafp_mode_select_page28()
6781 mode_pages->hdr.length = 0; in ipr_ioafp_mode_select_page28()
6784 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), in ipr_ioafp_mode_select_page28()
6787 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_ioafp_mode_select_page28()
6788 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_ioafp_mode_select_page28()
6797 * ipr_build_mode_sense - Builds a mode sense command
6811 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_mode_sense()
6813 ioarcb->res_handle = res_handle; in ipr_build_mode_sense()
6814 ioarcb->cmd_pkt.cdb[0] = MODE_SENSE; in ipr_build_mode_sense()
6815 ioarcb->cmd_pkt.cdb[2] = parm; in ipr_build_mode_sense()
6816 ioarcb->cmd_pkt.cdb[4] = xfer_len; in ipr_build_mode_sense()
6817 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; in ipr_build_mode_sense()
6823 * ipr_reset_cmd_failed - Handle failure of IOA reset command
6833 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cmd_failed()
6834 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_cmd_failed()
6836 dev_err(&ioa_cfg->pdev->dev, in ipr_reset_cmd_failed()
6838 ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc); in ipr_reset_cmd_failed()
6841 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_cmd_failed()
6846 * ipr_reset_mode_sense_failed - Handle failure of IOAFP mode sense
6857 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_mode_sense_failed()
6858 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_mode_sense_failed()
6861 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_reset_mode_sense_failed()
6862 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_reset_mode_sense_failed()
6871 * ipr_ioafp_mode_sense_page28 - Issue Mode Sense Page 28 to IOA
6882 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page28()
6886 0x28, ioa_cfg->vpd_cbs_dma + in ipr_ioafp_mode_sense_page28()
6890 ipr_cmd->job_step = ipr_ioafp_mode_select_page28; in ipr_ioafp_mode_sense_page28()
6891 ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed; in ipr_ioafp_mode_sense_page28()
6900 * ipr_ioafp_mode_select_page24 - Issue Mode Select to IOA
6910 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page24()
6911 struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages; in ipr_ioafp_mode_select_page24()
6920 mode_page->flags |= IPR_ENABLE_DUAL_IOA_AF; in ipr_ioafp_mode_select_page24()
6922 length = mode_pages->hdr.length + 1; in ipr_ioafp_mode_select_page24()
6923 mode_pages->hdr.length = 0; in ipr_ioafp_mode_select_page24()
6926 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), in ipr_ioafp_mode_select_page24()
6929 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_ioafp_mode_select_page24()
6937 * ipr_reset_mode_sense_page24_failed - Handle failure of IOAFP mode sense
6948 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_mode_sense_page24_failed()
6951 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_reset_mode_sense_page24_failed()
6959 * ipr_ioafp_mode_sense_page24 - Issue Page 24 Mode Sense to IOA
6963 * the IOA Advanced Function Control mode page.
6970 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page24()
6974 0x24, ioa_cfg->vpd_cbs_dma + in ipr_ioafp_mode_sense_page24()
6978 ipr_cmd->job_step = ipr_ioafp_mode_select_page24; in ipr_ioafp_mode_sense_page24()
6979 ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed; in ipr_ioafp_mode_sense_page24()
6988 * ipr_init_res_table - Initialize the resource table
6993 * devices and schedule adding/removing them from the mid-layer
7001 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_init_res_table()
7008 if (ioa_cfg->sis64) in ipr_init_res_table()
7009 flag = ioa_cfg->u.cfg_table64->hdr64.flags; in ipr_init_res_table()
7011 flag = ioa_cfg->u.cfg_table->hdr.flags; in ipr_init_res_table()
7014 dev_err(&ioa_cfg->pdev->dev, "Microcode download required\n"); in ipr_init_res_table()
7016 list_for_each_entry_safe(res, temp, &ioa_cfg->used_res_q, queue) in ipr_init_res_table()
7017 list_move_tail(&res->queue, &old_res); in ipr_init_res_table()
7019 if (ioa_cfg->sis64) in ipr_init_res_table()
7020 entries = be16_to_cpu(ioa_cfg->u.cfg_table64->hdr64.num_entries); in ipr_init_res_table()
7022 entries = ioa_cfg->u.cfg_table->hdr.num_entries; in ipr_init_res_table()
7025 if (ioa_cfg->sis64) in ipr_init_res_table()
7026 cfgtew.u.cfgte64 = &ioa_cfg->u.cfg_table64->dev[i]; in ipr_init_res_table()
7028 cfgtew.u.cfgte = &ioa_cfg->u.cfg_table->dev[i]; in ipr_init_res_table()
7033 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7040 if (list_empty(&ioa_cfg->free_res_q)) { in ipr_init_res_table()
7041 dev_err(&ioa_cfg->pdev->dev, "Too many devices attached\n"); in ipr_init_res_table()
7046 res = list_entry(ioa_cfg->free_res_q.next, in ipr_init_res_table()
7048 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7050 res->add_to_ml = 1; in ipr_init_res_table()
7051 } else if (res->sdev && (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))) in ipr_init_res_table()
7052 res->sdev->allow_restart = 1; in ipr_init_res_table()
7059 if (res->sdev) { in ipr_init_res_table()
7060 res->del_from_ml = 1; in ipr_init_res_table()
7061 res->res_handle = IPR_INVALID_RES_HANDLE; in ipr_init_res_table()
7062 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7068 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_init_res_table()
7071 if (ioa_cfg->dual_raid && ipr_dual_ioa_raid) in ipr_init_res_table()
7072 ipr_cmd->job_step = ipr_ioafp_mode_sense_page24; in ipr_init_res_table()
7074 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_init_res_table()
7081 * ipr_ioafp_query_ioa_cfg - Send a Query IOA Config to the adapter.
7092 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_query_ioa_cfg()
7093 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_query_ioa_cfg()
7094 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_ioafp_query_ioa_cfg()
7095 struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap; in ipr_ioafp_query_ioa_cfg()
7098 if (cap->cap & IPR_CAP_DUAL_IOA_RAID) in ipr_ioafp_query_ioa_cfg()
7099 ioa_cfg->dual_raid = 1; in ipr_ioafp_query_ioa_cfg()
7100 dev_info(&ioa_cfg->pdev->dev, "Adapter firmware version: %02X%02X%02X%02X\n", in ipr_ioafp_query_ioa_cfg()
7101 ucode_vpd->major_release, ucode_vpd->card_type, in ipr_ioafp_query_ioa_cfg()
7102 ucode_vpd->minor_release[0], ucode_vpd->minor_release[1]); in ipr_ioafp_query_ioa_cfg()
7103 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_ioafp_query_ioa_cfg()
7104 ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_ioafp_query_ioa_cfg()
7106 ioarcb->cmd_pkt.cdb[0] = IPR_QUERY_IOA_CONFIG; in ipr_ioafp_query_ioa_cfg()
7107 ioarcb->cmd_pkt.cdb[6] = (ioa_cfg->cfg_table_size >> 16) & 0xff; in ipr_ioafp_query_ioa_cfg()
7108 ioarcb->cmd_pkt.cdb[7] = (ioa_cfg->cfg_table_size >> 8) & 0xff; in ipr_ioafp_query_ioa_cfg()
7109 ioarcb->cmd_pkt.cdb[8] = ioa_cfg->cfg_table_size & 0xff; in ipr_ioafp_query_ioa_cfg()
7111 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size, in ipr_ioafp_query_ioa_cfg()
7114 ipr_cmd->job_step = ipr_init_res_table; in ipr_ioafp_query_ioa_cfg()
7124 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_ioa_service_action_failed()
7135 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioa_service_action()
7137 ioarcb->res_handle = res_handle; in ipr_build_ioa_service_action()
7138 ioarcb->cmd_pkt.cdb[0] = IPR_IOA_SERVICE_ACTION; in ipr_build_ioa_service_action()
7139 ioarcb->cmd_pkt.cdb[1] = sa_code; in ipr_build_ioa_service_action()
7140 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_build_ioa_service_action()
7144 * ipr_ioafp_set_caching_parameters - Issue Set Cache parameters service
7153 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_set_caching_parameters()
7154 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_set_caching_parameters()
7155 struct ipr_inquiry_pageC4 *pageC4 = &ioa_cfg->vpd_cbs->pageC4_data; in ipr_ioafp_set_caching_parameters()
7159 ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg; in ipr_ioafp_set_caching_parameters()
7161 if (pageC4->cache_cap[0] & IPR_CAP_SYNC_CACHE) { in ipr_ioafp_set_caching_parameters()
7166 ioarcb->cmd_pkt.cdb[2] = 0x40; in ipr_ioafp_set_caching_parameters()
7168 ipr_cmd->job_step_failed = ipr_ioa_service_action_failed; in ipr_ioafp_set_caching_parameters()
7181 * ipr_ioafp_inquiry - Send an Inquiry to the adapter.
7196 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_inquiry()
7199 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; in ipr_ioafp_inquiry()
7200 ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_ioafp_inquiry()
7202 ioarcb->cmd_pkt.cdb[0] = INQUIRY; in ipr_ioafp_inquiry()
7203 ioarcb->cmd_pkt.cdb[1] = flags; in ipr_ioafp_inquiry()
7204 ioarcb->cmd_pkt.cdb[2] = page; in ipr_ioafp_inquiry()
7205 ioarcb->cmd_pkt.cdb[4] = xfer_len; in ipr_ioafp_inquiry()
7214 * ipr_inquiry_page_supported - Is the given inquiry page supported
7227 for (i = 0; i < min_t(u8, page0->len, IPR_INQUIRY_PAGE0_ENTRIES); i++) in ipr_inquiry_page_supported()
7228 if (page0->page[i] == page) in ipr_inquiry_page_supported()
7235 * ipr_ioafp_pageC4_inquiry - Send a Page 0xC4 Inquiry to the adapter.
7246 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_pageC4_inquiry()
7247 struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; in ipr_ioafp_pageC4_inquiry()
7248 struct ipr_inquiry_pageC4 *pageC4 = &ioa_cfg->vpd_cbs->pageC4_data; in ipr_ioafp_pageC4_inquiry()
7251 ipr_cmd->job_step = ipr_ioafp_set_caching_parameters; in ipr_ioafp_pageC4_inquiry()
7256 (ioa_cfg->vpd_cbs_dma in ipr_ioafp_pageC4_inquiry()
7268 * ipr_ioafp_cap_inquiry - Send a Page 0xD0 Inquiry to the adapter.
7279 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_cap_inquiry()
7280 struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; in ipr_ioafp_cap_inquiry()
7281 struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap; in ipr_ioafp_cap_inquiry()
7284 ipr_cmd->job_step = ipr_ioafp_pageC4_inquiry; in ipr_ioafp_cap_inquiry()
7289 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, cap), in ipr_ioafp_cap_inquiry()
7299 * ipr_ioafp_page3_inquiry - Send a Page 3 Inquiry to the adapter.
7310 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page3_inquiry()
7314 ipr_cmd->job_step = ipr_ioafp_cap_inquiry; in ipr_ioafp_page3_inquiry()
7317 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data), in ipr_ioafp_page3_inquiry()
7325 * ipr_ioafp_page0_inquiry - Send a Page 0 Inquiry to the adapter.
7336 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page0_inquiry()
7342 memcpy(type, ioa_cfg->vpd_cbs->ioa_vpd.std_inq_data.vpids.product_id, 4); in ipr_ioafp_page0_inquiry()
7344 ioa_cfg->type = simple_strtoul((char *)type, NULL, 16); in ipr_ioafp_page0_inquiry()
7346 ipr_cmd->job_step = ipr_ioafp_page3_inquiry; in ipr_ioafp_page0_inquiry()
7349 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page0_data), in ipr_ioafp_page0_inquiry()
7357 * ipr_ioafp_std_inquiry - Send a Standard Inquiry to the adapter.
7367 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_std_inquiry()
7370 ipr_cmd->job_step = ipr_ioafp_page0_inquiry; in ipr_ioafp_std_inquiry()
7373 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, ioa_vpd), in ipr_ioafp_std_inquiry()
7381 * ipr_ioafp_identify_hrrq - Send Identify Host RRQ.
7392 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_identify_hrrq()
7393 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_identify_hrrq()
7397 ipr_cmd->job_step = ipr_ioafp_std_inquiry; in ipr_ioafp_identify_hrrq()
7398 if (ioa_cfg->identify_hrrq_index == 0) in ipr_ioafp_identify_hrrq()
7399 dev_info(&ioa_cfg->pdev->dev, "Starting IOA initialization sequence.\n"); in ipr_ioafp_identify_hrrq()
7401 if (ioa_cfg->identify_hrrq_index < ioa_cfg->hrrq_num) { in ipr_ioafp_identify_hrrq()
7402 hrrq = &ioa_cfg->hrrq[ioa_cfg->identify_hrrq_index]; in ipr_ioafp_identify_hrrq()
7404 ioarcb->cmd_pkt.cdb[0] = IPR_ID_HOST_RR_Q; in ipr_ioafp_identify_hrrq()
7405 ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_ioafp_identify_hrrq()
7407 ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_ioafp_identify_hrrq()
7408 if (ioa_cfg->sis64) in ipr_ioafp_identify_hrrq()
7409 ioarcb->cmd_pkt.cdb[1] = 0x1; in ipr_ioafp_identify_hrrq()
7411 if (ioa_cfg->nvectors == 1) in ipr_ioafp_identify_hrrq()
7412 ioarcb->cmd_pkt.cdb[1] &= ~IPR_ID_HRRQ_SELE_ENABLE; in ipr_ioafp_identify_hrrq()
7414 ioarcb->cmd_pkt.cdb[1] |= IPR_ID_HRRQ_SELE_ENABLE; in ipr_ioafp_identify_hrrq()
7416 ioarcb->cmd_pkt.cdb[2] = in ipr_ioafp_identify_hrrq()
7417 ((u64) hrrq->host_rrq_dma >> 24) & 0xff; in ipr_ioafp_identify_hrrq()
7418 ioarcb->cmd_pkt.cdb[3] = in ipr_ioafp_identify_hrrq()
7419 ((u64) hrrq->host_rrq_dma >> 16) & 0xff; in ipr_ioafp_identify_hrrq()
7420 ioarcb->cmd_pkt.cdb[4] = in ipr_ioafp_identify_hrrq()
7421 ((u64) hrrq->host_rrq_dma >> 8) & 0xff; in ipr_ioafp_identify_hrrq()
7422 ioarcb->cmd_pkt.cdb[5] = in ipr_ioafp_identify_hrrq()
7423 ((u64) hrrq->host_rrq_dma) & 0xff; in ipr_ioafp_identify_hrrq()
7424 ioarcb->cmd_pkt.cdb[7] = in ipr_ioafp_identify_hrrq()
7425 ((sizeof(u32) * hrrq->size) >> 8) & 0xff; in ipr_ioafp_identify_hrrq()
7426 ioarcb->cmd_pkt.cdb[8] = in ipr_ioafp_identify_hrrq()
7427 (sizeof(u32) * hrrq->size) & 0xff; in ipr_ioafp_identify_hrrq()
7429 if (ioarcb->cmd_pkt.cdb[1] & IPR_ID_HRRQ_SELE_ENABLE) in ipr_ioafp_identify_hrrq()
7430 ioarcb->cmd_pkt.cdb[9] = in ipr_ioafp_identify_hrrq()
7431 ioa_cfg->identify_hrrq_index; in ipr_ioafp_identify_hrrq()
7433 if (ioa_cfg->sis64) { in ipr_ioafp_identify_hrrq()
7434 ioarcb->cmd_pkt.cdb[10] = in ipr_ioafp_identify_hrrq()
7435 ((u64) hrrq->host_rrq_dma >> 56) & 0xff; in ipr_ioafp_identify_hrrq()
7436 ioarcb->cmd_pkt.cdb[11] = in ipr_ioafp_identify_hrrq()
7437 ((u64) hrrq->host_rrq_dma >> 48) & 0xff; in ipr_ioafp_identify_hrrq()
7438 ioarcb->cmd_pkt.cdb[12] = in ipr_ioafp_identify_hrrq()
7439 ((u64) hrrq->host_rrq_dma >> 40) & 0xff; in ipr_ioafp_identify_hrrq()
7440 ioarcb->cmd_pkt.cdb[13] = in ipr_ioafp_identify_hrrq()
7441 ((u64) hrrq->host_rrq_dma >> 32) & 0xff; in ipr_ioafp_identify_hrrq()
7444 if (ioarcb->cmd_pkt.cdb[1] & IPR_ID_HRRQ_SELE_ENABLE) in ipr_ioafp_identify_hrrq()
7445 ioarcb->cmd_pkt.cdb[14] = in ipr_ioafp_identify_hrrq()
7446 ioa_cfg->identify_hrrq_index; in ipr_ioafp_identify_hrrq()
7451 if (++ioa_cfg->identify_hrrq_index < ioa_cfg->hrrq_num) in ipr_ioafp_identify_hrrq()
7452 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_ioafp_identify_hrrq()
7463 * ipr_reset_timer_done - Adapter reset timer function
7478 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_timer_done()
7481 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_timer_done()
7483 if (ioa_cfg->reset_cmd == ipr_cmd) { in ipr_reset_timer_done()
7484 list_del(&ipr_cmd->queue); in ipr_reset_timer_done()
7485 ipr_cmd->done(ipr_cmd); in ipr_reset_timer_done()
7488 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_timer_done()
7492 * ipr_reset_start_timer - Start a timer for adapter reset job
7510 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_start_timer()
7511 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_start_timer()
7513 ipr_cmd->timer.expires = jiffies + timeout; in ipr_reset_start_timer()
7514 ipr_cmd->timer.function = ipr_reset_timer_done; in ipr_reset_start_timer()
7515 add_timer(&ipr_cmd->timer); in ipr_reset_start_timer()
7519 * ipr_init_ioa_mem - Initialize ioa_cfg control block
7530 spin_lock(&hrrq->_lock); in ipr_init_ioa_mem()
7531 memset(hrrq->host_rrq, 0, sizeof(u32) * hrrq->size); in ipr_init_ioa_mem()
7534 hrrq->hrrq_start = hrrq->host_rrq; in ipr_init_ioa_mem()
7535 hrrq->hrrq_end = &hrrq->host_rrq[hrrq->size - 1]; in ipr_init_ioa_mem()
7536 hrrq->hrrq_curr = hrrq->hrrq_start; in ipr_init_ioa_mem()
7537 hrrq->toggle_bit = 1; in ipr_init_ioa_mem()
7538 spin_unlock(&hrrq->_lock); in ipr_init_ioa_mem()
7542 ioa_cfg->identify_hrrq_index = 0; in ipr_init_ioa_mem()
7543 if (ioa_cfg->hrrq_num == 1) in ipr_init_ioa_mem()
7544 atomic_set(&ioa_cfg->hrrq_index, 0); in ipr_init_ioa_mem()
7546 atomic_set(&ioa_cfg->hrrq_index, 1); in ipr_init_ioa_mem()
7549 memset(ioa_cfg->u.cfg_table, 0, ioa_cfg->cfg_table_size); in ipr_init_ioa_mem()
7553 * ipr_reset_next_stage - Process IPL stage change based on feedback register.
7564 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_next_stage()
7567 feedback = readl(ioa_cfg->regs.init_feedback_reg); in ipr_reset_next_stage()
7582 writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_reset_next_stage()
7583 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_next_stage()
7584 stage_time = ioa_cfg->transop_timeout; in ipr_reset_next_stage()
7585 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_next_stage()
7587 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_reset_next_stage()
7589 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_next_stage()
7592 writeq(maskval, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_reset_next_stage()
7593 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_next_stage()
7598 ipr_cmd->timer.expires = jiffies + stage_time * HZ; in ipr_reset_next_stage()
7599 ipr_cmd->timer.function = ipr_oper_timeout; in ipr_reset_next_stage()
7600 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_next_stage()
7601 add_timer(&ipr_cmd->timer); in ipr_reset_next_stage()
7603 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_next_stage()
7609 * ipr_reset_enable_ioa - Enable the IOA following a reset.
7620 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_enable_ioa()
7626 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_enable_ioa()
7629 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_reset_enable_ioa()
7630 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_enable_ioa()
7631 ioa_cfg->hrrq[i].allow_interrupts = 1; in ipr_reset_enable_ioa()
7632 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_enable_ioa()
7634 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
7636 writel(IPR_ENDIAN_SWAP_KEY, ioa_cfg->regs.endian_swap_reg); in ipr_reset_enable_ioa()
7637 int_reg = readl(ioa_cfg->regs.endian_swap_reg); in ipr_reset_enable_ioa()
7640 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_reset_enable_ioa()
7644 ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_reset_enable_ioa()
7645 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_enable_ioa()
7650 writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_enable_ioa()
7652 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
7655 writeq(maskval, ioa_cfg->regs.clr_interrupt_mask_reg); in ipr_reset_enable_ioa()
7657 writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_reset_enable_ioa()
7659 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_enable_ioa()
7661 dev_info(&ioa_cfg->pdev->dev, "Initializing IOA.\n"); in ipr_reset_enable_ioa()
7663 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
7664 ipr_cmd->job_step = ipr_reset_next_stage; in ipr_reset_enable_ioa()
7668 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ); in ipr_reset_enable_ioa()
7669 ipr_cmd->timer.function = ipr_oper_timeout; in ipr_reset_enable_ioa()
7670 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_enable_ioa()
7671 add_timer(&ipr_cmd->timer); in ipr_reset_enable_ioa()
7672 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_enable_ioa()
7679 * ipr_reset_wait_for_dump - Wait for a dump to timeout.
7690 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_for_dump()
7692 if (ioa_cfg->sdt_state == GET_DUMP) in ipr_reset_wait_for_dump()
7693 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_reset_wait_for_dump()
7694 else if (ioa_cfg->sdt_state == READ_DUMP) in ipr_reset_wait_for_dump()
7695 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_reset_wait_for_dump()
7697 ioa_cfg->dump_timeout = 1; in ipr_reset_wait_for_dump()
7698 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_wait_for_dump()
7704 * ipr_unit_check_no_data - Log a unit check/no data error log
7715 ioa_cfg->errors_logged++; in ipr_unit_check_no_data()
7716 dev_err(&ioa_cfg->pdev->dev, "IOA unit check with no data\n"); in ipr_unit_check_no_data()
7720 * ipr_get_unit_check_buffer - Get the unit check buffer from the IOA
7737 mailbox = readl(ioa_cfg->ioa_mailbox); in ipr_get_unit_check_buffer()
7739 if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(mailbox)) { in ipr_get_unit_check_buffer()
7759 length = (be32_to_cpu(sdt.entry[0].end_token) - in ipr_get_unit_check_buffer()
7763 hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next, in ipr_get_unit_check_buffer()
7765 list_del_init(&hostrcb->queue); in ipr_get_unit_check_buffer()
7766 memset(&hostrcb->hcam, 0, sizeof(hostrcb->hcam)); in ipr_get_unit_check_buffer()
7770 (__be32 *)&hostrcb->hcam, in ipr_get_unit_check_buffer()
7771 min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32)); in ipr_get_unit_check_buffer()
7775 ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); in ipr_get_unit_check_buffer()
7777 ioa_cfg->sdt_state == GET_DUMP) in ipr_get_unit_check_buffer()
7778 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_get_unit_check_buffer()
7782 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_get_unit_check_buffer()
7786 * ipr_reset_get_unit_check_job - Call to get the unit check buffer.
7796 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_get_unit_check_job()
7799 ioa_cfg->ioa_unit_checked = 0; in ipr_reset_get_unit_check_job()
7801 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_get_unit_check_job()
7810 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_dump_mailbox_wait()
7814 if (ioa_cfg->sdt_state != GET_DUMP) in ipr_dump_mailbox_wait()
7817 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left || in ipr_dump_mailbox_wait()
7818 (readl(ioa_cfg->regs.sense_interrupt_reg) & in ipr_dump_mailbox_wait()
7821 if (!ipr_cmd->u.time_left) in ipr_dump_mailbox_wait()
7822 dev_err(&ioa_cfg->pdev->dev, in ipr_dump_mailbox_wait()
7825 ioa_cfg->sdt_state = READ_DUMP; in ipr_dump_mailbox_wait()
7826 ioa_cfg->dump_timeout = 0; in ipr_dump_mailbox_wait()
7827 if (ioa_cfg->sis64) in ipr_dump_mailbox_wait()
7831 ipr_cmd->job_step = ipr_reset_wait_for_dump; in ipr_dump_mailbox_wait()
7832 schedule_work(&ioa_cfg->work_q); in ipr_dump_mailbox_wait()
7835 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_dump_mailbox_wait()
7845 * ipr_reset_restore_cfg_space - Restore PCI config space.
7857 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_restore_cfg_space()
7860 ioa_cfg->pdev->state_saved = true; in ipr_reset_restore_cfg_space()
7861 pci_restore_state(ioa_cfg->pdev); in ipr_reset_restore_cfg_space()
7864 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR); in ipr_reset_restore_cfg_space()
7870 if (ioa_cfg->sis64) { in ipr_reset_restore_cfg_space()
7872 writel(IPR_ENDIAN_SWAP_KEY, ioa_cfg->regs.endian_swap_reg); in ipr_reset_restore_cfg_space()
7873 readl(ioa_cfg->regs.endian_swap_reg); in ipr_reset_restore_cfg_space()
7876 if (ioa_cfg->ioa_unit_checked) { in ipr_reset_restore_cfg_space()
7877 if (ioa_cfg->sis64) { in ipr_reset_restore_cfg_space()
7878 ipr_cmd->job_step = ipr_reset_get_unit_check_job; in ipr_reset_restore_cfg_space()
7882 ioa_cfg->ioa_unit_checked = 0; in ipr_reset_restore_cfg_space()
7884 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_restore_cfg_space()
7890 if (ioa_cfg->in_ioa_bringdown) { in ipr_reset_restore_cfg_space()
7891 ipr_cmd->job_step = ipr_ioa_bringdown_done; in ipr_reset_restore_cfg_space()
7892 } else if (ioa_cfg->sdt_state == GET_DUMP) { in ipr_reset_restore_cfg_space()
7893 ipr_cmd->job_step = ipr_dump_mailbox_wait; in ipr_reset_restore_cfg_space()
7894 ipr_cmd->u.time_left = IPR_WAIT_FOR_MAILBOX; in ipr_reset_restore_cfg_space()
7896 ipr_cmd->job_step = ipr_reset_enable_ioa; in ipr_reset_restore_cfg_space()
7904 * ipr_reset_bist_done - BIST has completed on the adapter.
7914 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_bist_done()
7917 if (ioa_cfg->cfg_locked) in ipr_reset_bist_done()
7918 pci_cfg_access_unlock(ioa_cfg->pdev); in ipr_reset_bist_done()
7919 ioa_cfg->cfg_locked = 0; in ipr_reset_bist_done()
7920 ipr_cmd->job_step = ipr_reset_restore_cfg_space; in ipr_reset_bist_done()
7926 * ipr_reset_start_bist - Run BIST on the adapter.
7936 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_start_bist()
7940 if (ioa_cfg->ipr_chip->bist_method == IPR_MMIO) in ipr_reset_start_bist()
7942 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_start_bist()
7944 rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START); in ipr_reset_start_bist()
7947 ipr_cmd->job_step = ipr_reset_bist_done; in ipr_reset_start_bist()
7951 if (ioa_cfg->cfg_locked) in ipr_reset_start_bist()
7952 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev); in ipr_reset_start_bist()
7953 ioa_cfg->cfg_locked = 0; in ipr_reset_start_bist()
7954 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR); in ipr_reset_start_bist()
7963 * ipr_reset_slot_reset_done - Clear PCI reset to the adapter
7974 ipr_cmd->job_step = ipr_reset_bist_done; in ipr_reset_slot_reset_done()
7981 * ipr_reset_reset_work - Pulse a PCIe fundamental reset
7990 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_reset_work()
7991 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_reset_reset_work()
7999 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_reset_work()
8000 if (ioa_cfg->reset_cmd == ipr_cmd) in ipr_reset_reset_work()
8002 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_reset_work()
8007 * ipr_reset_slot_reset - Reset the PCI slot of the adapter.
8017 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_slot_reset()
8020 INIT_WORK(&ipr_cmd->work, ipr_reset_reset_work); in ipr_reset_slot_reset()
8021 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work); in ipr_reset_slot_reset()
8022 ipr_cmd->job_step = ipr_reset_slot_reset_done; in ipr_reset_slot_reset()
8028 * ipr_reset_block_config_access_wait - Wait for permission to block config access
8038 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_block_config_access_wait()
8041 if (pci_cfg_access_trylock(ioa_cfg->pdev)) { in ipr_reset_block_config_access_wait()
8042 ioa_cfg->cfg_locked = 1; in ipr_reset_block_config_access_wait()
8043 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8045 if (ipr_cmd->u.time_left) { in ipr_reset_block_config_access_wait()
8047 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_reset_block_config_access_wait()
8051 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8052 dev_err(&ioa_cfg->pdev->dev, in ipr_reset_block_config_access_wait()
8061 * ipr_reset_block_config_access - Block config access to the IOA
8071 ipr_cmd->ioa_cfg->cfg_locked = 0; in ipr_reset_block_config_access()
8072 ipr_cmd->job_step = ipr_reset_block_config_access_wait; in ipr_reset_block_config_access()
8073 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT; in ipr_reset_block_config_access()
8078 * ipr_reset_allowed - Query whether or not IOA can be reset
8082 * 0 if reset not allowed / non-zero if reset is allowed
8088 temp_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_reset_allowed()
8093 * ipr_reset_wait_to_start_bist - Wait for permission to reset IOA.
8109 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_to_start_bist()
8112 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) { in ipr_reset_wait_to_start_bist()
8113 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_reset_wait_to_start_bist()
8116 ipr_cmd->job_step = ipr_reset_block_config_access; in ipr_reset_wait_to_start_bist()
8124 * ipr_reset_alert - Alert the adapter of a pending reset
8137 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_alert()
8142 rc = pci_read_config_word(ioa_cfg->pdev, PCI_COMMAND, &cmd_reg); in ipr_reset_alert()
8146 writel(IPR_UPROCI_RESET_ALERT, ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_alert()
8147 ipr_cmd->job_step = ipr_reset_wait_to_start_bist; in ipr_reset_alert()
8149 ipr_cmd->job_step = ipr_reset_block_config_access; in ipr_reset_alert()
8152 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT; in ipr_reset_alert()
8160 * ipr_reset_quiesce_done - Complete IOA disconnect
8170 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_quiesce_done()
8173 ipr_cmd->job_step = ipr_ioa_bringdown_done; in ipr_reset_quiesce_done()
8180 * ipr_reset_cancel_hcam_done - Check for outstanding commands
8191 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam_done()
8198 ipr_cmd->job_step = ipr_reset_quiesce_done; in ipr_reset_cancel_hcam_done()
8201 spin_lock(&hrrq->_lock); in ipr_reset_cancel_hcam_done()
8202 list_for_each_entry(loop_cmd, &hrrq->hrrq_pending_q, queue) { in ipr_reset_cancel_hcam_done()
8205 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_cancel_hcam_done()
8209 spin_unlock(&hrrq->_lock); in ipr_reset_cancel_hcam_done()
8220 * ipr_reset_cancel_hcam - Cancel outstanding HCAMs
8230 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam()
8234 struct ipr_hrr_queue *hrrq = &ioa_cfg->hrrq[IPR_INIT_HRRQ]; in ipr_reset_cancel_hcam()
8237 ipr_cmd->job_step = ipr_reset_cancel_hcam_done; in ipr_reset_cancel_hcam()
8239 if (!hrrq->ioa_is_dead) { in ipr_reset_cancel_hcam()
8240 if (!list_empty(&ioa_cfg->hostrcb_pending_q)) { in ipr_reset_cancel_hcam()
8241 list_for_each_entry(hcam_cmd, &hrrq->hrrq_pending_q, queue) { in ipr_reset_cancel_hcam()
8242 if (hcam_cmd->ioarcb.cmd_pkt.cdb[0] != IPR_HOST_CONTROLLED_ASYNC) in ipr_reset_cancel_hcam()
8245 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_cancel_hcam()
8246 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_reset_cancel_hcam()
8247 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_reset_cancel_hcam()
8248 cmd_pkt->request_type = IPR_RQTYPE_IOACMD; in ipr_reset_cancel_hcam()
8249 cmd_pkt->cdb[0] = IPR_CANCEL_REQUEST; in ipr_reset_cancel_hcam()
8250 cmd_pkt->cdb[1] = IPR_CANCEL_64BIT_IOARCB; in ipr_reset_cancel_hcam()
8251 cmd_pkt->cdb[10] = ((u64) hcam_cmd->dma_addr >> 56) & 0xff; in ipr_reset_cancel_hcam()
8252 cmd_pkt->cdb[11] = ((u64) hcam_cmd->dma_addr >> 48) & 0xff; in ipr_reset_cancel_hcam()
8253 cmd_pkt->cdb[12] = ((u64) hcam_cmd->dma_addr >> 40) & 0xff; in ipr_reset_cancel_hcam()
8254 cmd_pkt->cdb[13] = ((u64) hcam_cmd->dma_addr >> 32) & 0xff; in ipr_reset_cancel_hcam()
8255 cmd_pkt->cdb[2] = ((u64) hcam_cmd->dma_addr >> 24) & 0xff; in ipr_reset_cancel_hcam()
8256 cmd_pkt->cdb[3] = ((u64) hcam_cmd->dma_addr >> 16) & 0xff; in ipr_reset_cancel_hcam()
8257 cmd_pkt->cdb[4] = ((u64) hcam_cmd->dma_addr >> 8) & 0xff; in ipr_reset_cancel_hcam()
8258 cmd_pkt->cdb[5] = ((u64) hcam_cmd->dma_addr) & 0xff; in ipr_reset_cancel_hcam()
8264 ipr_cmd->job_step = ipr_reset_cancel_hcam; in ipr_reset_cancel_hcam()
8269 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_cancel_hcam()
8276 * ipr_reset_ucode_download_done - Microcode download completion
8286 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download_done()
8287 struct ipr_sglist *sglist = ioa_cfg->ucode_sglist; in ipr_reset_ucode_download_done()
8289 dma_unmap_sg(&ioa_cfg->pdev->dev, sglist->scatterlist, in ipr_reset_ucode_download_done()
8290 sglist->num_sg, DMA_TO_DEVICE); in ipr_reset_ucode_download_done()
8292 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_ucode_download_done()
8297 * ipr_reset_ucode_download - Download microcode to the adapter
8308 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download()
8309 struct ipr_sglist *sglist = ioa_cfg->ucode_sglist; in ipr_reset_ucode_download()
8312 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_ucode_download()
8317 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_ucode_download()
8318 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; in ipr_reset_ucode_download()
8319 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER; in ipr_reset_ucode_download()
8320 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE; in ipr_reset_ucode_download()
8321 ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16; in ipr_reset_ucode_download()
8322 ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8; in ipr_reset_ucode_download()
8323 ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff; in ipr_reset_ucode_download()
8325 if (ioa_cfg->sis64) in ipr_reset_ucode_download()
8329 ipr_cmd->job_step = ipr_reset_ucode_download_done; in ipr_reset_ucode_download()
8339 * ipr_reset_shutdown_ioa - Shutdown the adapter
8351 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_shutdown_ioa()
8352 enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type; in ipr_reset_shutdown_ioa()
8358 ipr_cmd->job_step = ipr_reset_cancel_hcam; in ipr_reset_shutdown_ioa()
8360 !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_reset_shutdown_ioa()
8361 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_shutdown_ioa()
8362 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_reset_shutdown_ioa()
8363 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; in ipr_reset_shutdown_ioa()
8364 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type; in ipr_reset_shutdown_ioa()
8370 else if (ioa_cfg->dual_raid && ipr_dual_ioa_raid) in ipr_reset_shutdown_ioa()
8378 ipr_cmd->job_step = ipr_reset_ucode_download; in ipr_reset_shutdown_ioa()
8380 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_shutdown_ioa()
8387 * ipr_reset_ioa_job - Adapter reset job
8398 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ioa_job()
8401 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_ioa_job()
8403 if (ioa_cfg->reset_cmd != ipr_cmd) { in ipr_reset_ioa_job()
8408 list_add_tail(&ipr_cmd->queue, in ipr_reset_ioa_job()
8409 &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_ioa_job()
8414 rc = ipr_cmd->job_step_failed(ipr_cmd); in ipr_reset_ioa_job()
8420 ipr_cmd->job_step_failed = ipr_reset_cmd_failed; in ipr_reset_ioa_job()
8421 rc = ipr_cmd->job_step(ipr_cmd); in ipr_reset_ioa_job()
8426 * _ipr_initiate_ioa_reset - Initiate an adapter reset
8446 ioa_cfg->in_reset_reload = 1; in _ipr_initiate_ioa_reset()
8447 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in _ipr_initiate_ioa_reset()
8448 spin_lock(&ioa_cfg->hrrq[i]._lock); in _ipr_initiate_ioa_reset()
8449 ioa_cfg->hrrq[i].allow_cmds = 0; in _ipr_initiate_ioa_reset()
8450 spin_unlock(&ioa_cfg->hrrq[i]._lock); in _ipr_initiate_ioa_reset()
8453 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in _ipr_initiate_ioa_reset()
8454 ioa_cfg->scsi_unblock = 0; in _ipr_initiate_ioa_reset()
8455 ioa_cfg->scsi_blocked = 1; in _ipr_initiate_ioa_reset()
8456 scsi_block_requests(ioa_cfg->host); in _ipr_initiate_ioa_reset()
8460 ioa_cfg->reset_cmd = ipr_cmd; in _ipr_initiate_ioa_reset()
8461 ipr_cmd->job_step = job_step; in _ipr_initiate_ioa_reset()
8462 ipr_cmd->u.shutdown_type = shutdown_type; in _ipr_initiate_ioa_reset()
8468 * ipr_initiate_ioa_reset - Initiate an adapter reset
8484 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_initiate_ioa_reset()
8487 if (ioa_cfg->in_reset_reload) { in ipr_initiate_ioa_reset()
8488 if (ioa_cfg->sdt_state == GET_DUMP) in ipr_initiate_ioa_reset()
8489 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_initiate_ioa_reset()
8490 else if (ioa_cfg->sdt_state == READ_DUMP) in ipr_initiate_ioa_reset()
8491 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_initiate_ioa_reset()
8494 if (ioa_cfg->reset_retries++ >= IPR_NUM_RESET_RELOAD_RETRIES) { in ipr_initiate_ioa_reset()
8495 dev_err(&ioa_cfg->pdev->dev, in ipr_initiate_ioa_reset()
8496 "IOA taken offline - error recovery failed\n"); in ipr_initiate_ioa_reset()
8498 ioa_cfg->reset_retries = 0; in ipr_initiate_ioa_reset()
8499 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_initiate_ioa_reset()
8500 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_initiate_ioa_reset()
8501 ioa_cfg->hrrq[i].ioa_is_dead = 1; in ipr_initiate_ioa_reset()
8502 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_initiate_ioa_reset()
8506 if (ioa_cfg->in_ioa_bringdown) { in ipr_initiate_ioa_reset()
8507 ioa_cfg->reset_cmd = NULL; in ipr_initiate_ioa_reset()
8508 ioa_cfg->in_reset_reload = 0; in ipr_initiate_ioa_reset()
8510 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_initiate_ioa_reset()
8512 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in ipr_initiate_ioa_reset()
8513 ioa_cfg->scsi_unblock = 1; in ipr_initiate_ioa_reset()
8514 schedule_work(&ioa_cfg->work_q); in ipr_initiate_ioa_reset()
8518 ioa_cfg->in_ioa_bringdown = 1; in ipr_initiate_ioa_reset()
8528 * ipr_reset_freeze - Hold off all I/O activity
8537 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_freeze()
8541 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_reset_freeze()
8542 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_freeze()
8543 ioa_cfg->hrrq[i].allow_interrupts = 0; in ipr_reset_freeze()
8544 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_freeze()
8547 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_freeze()
8548 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_freeze()
8553 * ipr_pci_mmio_enabled - Called when MMIO has been re-enabled
8564 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_mmio_enabled()
8565 if (!ioa_cfg->probe_done) in ipr_pci_mmio_enabled()
8567 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_mmio_enabled()
8572 * ipr_pci_frozen - Called when slot has experienced a PCI bus error.
8584 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_frozen()
8585 if (ioa_cfg->probe_done) in ipr_pci_frozen()
8587 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_frozen()
8591 * ipr_pci_slot_reset - Called when PCI slot has been reset.
8603 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_slot_reset()
8604 if (ioa_cfg->probe_done) { in ipr_pci_slot_reset()
8605 if (ioa_cfg->needs_warm_reset) in ipr_pci_slot_reset()
8611 wake_up_all(&ioa_cfg->eeh_wait_q); in ipr_pci_slot_reset()
8612 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_slot_reset()
8617 * ipr_pci_perm_failure - Called when PCI slot is dead for good.
8629 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_perm_failure()
8630 if (ioa_cfg->probe_done) { in ipr_pci_perm_failure()
8631 if (ioa_cfg->sdt_state == WAIT_FOR_DUMP) in ipr_pci_perm_failure()
8632 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_pci_perm_failure()
8633 ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES - 1; in ipr_pci_perm_failure()
8634 ioa_cfg->in_ioa_bringdown = 1; in ipr_pci_perm_failure()
8635 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_pci_perm_failure()
8636 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_pci_perm_failure()
8637 ioa_cfg->hrrq[i].allow_cmds = 0; in ipr_pci_perm_failure()
8638 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_pci_perm_failure()
8643 wake_up_all(&ioa_cfg->eeh_wait_q); in ipr_pci_perm_failure()
8644 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_perm_failure()
8648 * ipr_pci_error_detected - Called when a PCI error is detected.
8674 * ipr_probe_ioa_part2 - Initializes IOAs found in ipr_probe_ioa(..)
8688 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in ipr_probe_ioa_part2()
8689 dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg); in ipr_probe_ioa_part2()
8690 ioa_cfg->probe_done = 1; in ipr_probe_ioa_part2()
8691 if (ioa_cfg->needs_hard_reset) { in ipr_probe_ioa_part2()
8692 ioa_cfg->needs_hard_reset = 0; in ipr_probe_ioa_part2()
8697 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in ipr_probe_ioa_part2()
8703 * ipr_free_cmd_blks - Frees command blocks allocated for an adapter
8713 if (ioa_cfg->ipr_cmnd_list) { in ipr_free_cmd_blks()
8715 if (ioa_cfg->ipr_cmnd_list[i]) in ipr_free_cmd_blks()
8716 dma_pool_free(ioa_cfg->ipr_cmd_pool, in ipr_free_cmd_blks()
8717 ioa_cfg->ipr_cmnd_list[i], in ipr_free_cmd_blks()
8718 ioa_cfg->ipr_cmnd_list_dma[i]); in ipr_free_cmd_blks()
8720 ioa_cfg->ipr_cmnd_list[i] = NULL; in ipr_free_cmd_blks()
8724 dma_pool_destroy(ioa_cfg->ipr_cmd_pool); in ipr_free_cmd_blks()
8726 kfree(ioa_cfg->ipr_cmnd_list); in ipr_free_cmd_blks()
8727 kfree(ioa_cfg->ipr_cmnd_list_dma); in ipr_free_cmd_blks()
8728 ioa_cfg->ipr_cmnd_list = NULL; in ipr_free_cmd_blks()
8729 ioa_cfg->ipr_cmnd_list_dma = NULL; in ipr_free_cmd_blks()
8730 ioa_cfg->ipr_cmd_pool = NULL; in ipr_free_cmd_blks()
8734 * ipr_free_mem - Frees memory allocated for an adapter
8744 kfree(ioa_cfg->res_entries); in ipr_free_mem()
8745 dma_free_coherent(&ioa_cfg->pdev->dev, sizeof(struct ipr_misc_cbs), in ipr_free_mem()
8746 ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma); in ipr_free_mem()
8749 for (i = 0; i < ioa_cfg->hrrq_num; i++) in ipr_free_mem()
8750 dma_free_coherent(&ioa_cfg->pdev->dev, in ipr_free_mem()
8751 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_free_mem()
8752 ioa_cfg->hrrq[i].host_rrq, in ipr_free_mem()
8753 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_free_mem()
8755 dma_free_coherent(&ioa_cfg->pdev->dev, ioa_cfg->cfg_table_size, in ipr_free_mem()
8756 ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma); in ipr_free_mem()
8759 dma_free_coherent(&ioa_cfg->pdev->dev, in ipr_free_mem()
8761 ioa_cfg->hostrcb[i], in ipr_free_mem()
8762 ioa_cfg->hostrcb_dma[i]); in ipr_free_mem()
8766 kfree(ioa_cfg->trace); in ipr_free_mem()
8770 * ipr_free_irqs - Free all allocated IRQs for the adapter.
8781 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_free_irqs()
8784 for (i = 0; i < ioa_cfg->nvectors; i++) in ipr_free_irqs()
8785 free_irq(pci_irq_vector(pdev, i), &ioa_cfg->hrrq[i]); in ipr_free_irqs()
8790 * ipr_free_all_resources - Free all allocated resources for an adapter.
8801 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_free_all_resources()
8805 if (ioa_cfg->reset_work_q) in ipr_free_all_resources()
8806 destroy_workqueue(ioa_cfg->reset_work_q); in ipr_free_all_resources()
8807 iounmap(ioa_cfg->hdw_dma_regs); in ipr_free_all_resources()
8810 scsi_host_put(ioa_cfg->host); in ipr_free_all_resources()
8816 * ipr_alloc_cmd_blks - Allocate command blocks for an adapter
8820 * 0 on success / -ENOMEM on allocation failure
8829 ioa_cfg->ipr_cmd_pool = dma_pool_create(IPR_NAME, &ioa_cfg->pdev->dev, in ipr_alloc_cmd_blks()
8832 if (!ioa_cfg->ipr_cmd_pool) in ipr_alloc_cmd_blks()
8833 return -ENOMEM; in ipr_alloc_cmd_blks()
8835 ioa_cfg->ipr_cmnd_list = kcalloc(IPR_NUM_CMD_BLKS, sizeof(struct ipr_cmnd *), GFP_KERNEL); in ipr_alloc_cmd_blks()
8836 ioa_cfg->ipr_cmnd_list_dma = kcalloc(IPR_NUM_CMD_BLKS, sizeof(dma_addr_t), GFP_KERNEL); in ipr_alloc_cmd_blks()
8838 if (!ioa_cfg->ipr_cmnd_list || !ioa_cfg->ipr_cmnd_list_dma) { in ipr_alloc_cmd_blks()
8840 return -ENOMEM; in ipr_alloc_cmd_blks()
8843 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_cmd_blks()
8844 if (ioa_cfg->hrrq_num > 1) { in ipr_alloc_cmd_blks()
8847 ioa_cfg->hrrq[i].min_cmd_id = 0; in ipr_alloc_cmd_blks()
8848 ioa_cfg->hrrq[i].max_cmd_id = in ipr_alloc_cmd_blks()
8849 (entries_each_hrrq - 1); in ipr_alloc_cmd_blks()
8853 (ioa_cfg->hrrq_num - 1); in ipr_alloc_cmd_blks()
8854 ioa_cfg->hrrq[i].min_cmd_id = in ipr_alloc_cmd_blks()
8856 (i - 1) * entries_each_hrrq; in ipr_alloc_cmd_blks()
8857 ioa_cfg->hrrq[i].max_cmd_id = in ipr_alloc_cmd_blks()
8859 i * entries_each_hrrq - 1); in ipr_alloc_cmd_blks()
8863 ioa_cfg->hrrq[i].min_cmd_id = 0; in ipr_alloc_cmd_blks()
8864 ioa_cfg->hrrq[i].max_cmd_id = (entries_each_hrrq - 1); in ipr_alloc_cmd_blks()
8866 ioa_cfg->hrrq[i].size = entries_each_hrrq; in ipr_alloc_cmd_blks()
8869 BUG_ON(ioa_cfg->hrrq_num == 0); in ipr_alloc_cmd_blks()
8871 i = IPR_NUM_CMD_BLKS - in ipr_alloc_cmd_blks()
8872 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].max_cmd_id - 1; in ipr_alloc_cmd_blks()
8874 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].size += i; in ipr_alloc_cmd_blks()
8875 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].max_cmd_id += i; in ipr_alloc_cmd_blks()
8879 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool, in ipr_alloc_cmd_blks()
8884 return -ENOMEM; in ipr_alloc_cmd_blks()
8887 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd; in ipr_alloc_cmd_blks()
8888 ioa_cfg->ipr_cmnd_list_dma[i] = dma_addr; in ipr_alloc_cmd_blks()
8890 ioarcb = &ipr_cmd->ioarcb; in ipr_alloc_cmd_blks()
8891 ipr_cmd->dma_addr = dma_addr; in ipr_alloc_cmd_blks()
8892 if (ioa_cfg->sis64) in ipr_alloc_cmd_blks()
8893 ioarcb->a.ioarcb_host_pci_addr64 = cpu_to_be64(dma_addr); in ipr_alloc_cmd_blks()
8895 ioarcb->a.ioarcb_host_pci_addr = cpu_to_be32(dma_addr); in ipr_alloc_cmd_blks()
8897 ioarcb->host_response_handle = cpu_to_be32(i << 2); in ipr_alloc_cmd_blks()
8898 if (ioa_cfg->sis64) { in ipr_alloc_cmd_blks()
8899 ioarcb->u.sis64_addr_data.data_ioadl_addr = in ipr_alloc_cmd_blks()
8901 ioarcb->u.sis64_addr_data.ioasa_host_pci_addr = in ipr_alloc_cmd_blks()
8904 ioarcb->write_ioadl_addr = in ipr_alloc_cmd_blks()
8906 ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; in ipr_alloc_cmd_blks()
8907 ioarcb->ioasa_host_pci_addr = in ipr_alloc_cmd_blks()
8910 ioarcb->ioasa_len = cpu_to_be16(sizeof(struct ipr_ioasa)); in ipr_alloc_cmd_blks()
8911 ipr_cmd->cmd_index = i; in ipr_alloc_cmd_blks()
8912 ipr_cmd->ioa_cfg = ioa_cfg; in ipr_alloc_cmd_blks()
8913 ipr_cmd->sense_buffer_dma = dma_addr + in ipr_alloc_cmd_blks()
8916 ipr_cmd->ioarcb.cmd_pkt.hrrq_id = hrrq_id; in ipr_alloc_cmd_blks()
8917 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_alloc_cmd_blks()
8918 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_alloc_cmd_blks()
8919 if (i >= ioa_cfg->hrrq[hrrq_id].max_cmd_id) in ipr_alloc_cmd_blks()
8927 * ipr_alloc_mem - Allocate memory for an adapter
8931 * 0 on success / non-zero for error
8935 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_alloc_mem()
8936 int i, rc = -ENOMEM; in ipr_alloc_mem()
8939 ioa_cfg->res_entries = kcalloc(ioa_cfg->max_devs_supported, in ipr_alloc_mem()
8943 if (!ioa_cfg->res_entries) in ipr_alloc_mem()
8946 for (i = 0; i < ioa_cfg->max_devs_supported; i++) { in ipr_alloc_mem()
8947 list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q); in ipr_alloc_mem()
8948 ioa_cfg->res_entries[i].ioa_cfg = ioa_cfg; in ipr_alloc_mem()
8951 ioa_cfg->vpd_cbs = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
8953 &ioa_cfg->vpd_cbs_dma, in ipr_alloc_mem()
8956 if (!ioa_cfg->vpd_cbs) in ipr_alloc_mem()
8962 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_mem()
8963 ioa_cfg->hrrq[i].host_rrq = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
8964 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
8965 &ioa_cfg->hrrq[i].host_rrq_dma, in ipr_alloc_mem()
8968 if (!ioa_cfg->hrrq[i].host_rrq) { in ipr_alloc_mem()
8969 while (--i >= 0) in ipr_alloc_mem()
8970 dma_free_coherent(&pdev->dev, in ipr_alloc_mem()
8971 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
8972 ioa_cfg->hrrq[i].host_rrq, in ipr_alloc_mem()
8973 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_alloc_mem()
8976 ioa_cfg->hrrq[i].ioa_cfg = ioa_cfg; in ipr_alloc_mem()
8979 ioa_cfg->u.cfg_table = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
8980 ioa_cfg->cfg_table_size, in ipr_alloc_mem()
8981 &ioa_cfg->cfg_table_dma, in ipr_alloc_mem()
8984 if (!ioa_cfg->u.cfg_table) in ipr_alloc_mem()
8988 ioa_cfg->hostrcb[i] = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
8990 &ioa_cfg->hostrcb_dma[i], in ipr_alloc_mem()
8993 if (!ioa_cfg->hostrcb[i]) in ipr_alloc_mem()
8996 ioa_cfg->hostrcb[i]->hostrcb_dma = in ipr_alloc_mem()
8997 ioa_cfg->hostrcb_dma[i] + offsetof(struct ipr_hostrcb, hcam); in ipr_alloc_mem()
8998 ioa_cfg->hostrcb[i]->ioa_cfg = ioa_cfg; in ipr_alloc_mem()
8999 list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q); in ipr_alloc_mem()
9002 ioa_cfg->trace = kcalloc(IPR_NUM_TRACE_ENTRIES, in ipr_alloc_mem()
9006 if (!ioa_cfg->trace) in ipr_alloc_mem()
9015 while (i-- > 0) { in ipr_alloc_mem()
9016 dma_free_coherent(&pdev->dev, sizeof(struct ipr_hostrcb), in ipr_alloc_mem()
9017 ioa_cfg->hostrcb[i], in ipr_alloc_mem()
9018 ioa_cfg->hostrcb_dma[i]); in ipr_alloc_mem()
9020 dma_free_coherent(&pdev->dev, ioa_cfg->cfg_table_size, in ipr_alloc_mem()
9021 ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma); in ipr_alloc_mem()
9023 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_mem()
9024 dma_free_coherent(&pdev->dev, in ipr_alloc_mem()
9025 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
9026 ioa_cfg->hrrq[i].host_rrq, in ipr_alloc_mem()
9027 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_alloc_mem()
9032 dma_free_coherent(&pdev->dev, sizeof(struct ipr_misc_cbs), in ipr_alloc_mem()
9033 ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma); in ipr_alloc_mem()
9035 kfree(ioa_cfg->res_entries); in ipr_alloc_mem()
9040 * ipr_initialize_bus_attr - Initialize SCSI bus attributes to default values
9051 ioa_cfg->bus_attr[i].bus = i; in ipr_initialize_bus_attr()
9052 ioa_cfg->bus_attr[i].qas_enabled = 0; in ipr_initialize_bus_attr()
9053 ioa_cfg->bus_attr[i].bus_width = IPR_DEFAULT_BUS_WIDTH; in ipr_initialize_bus_attr()
9055 ioa_cfg->bus_attr[i].max_xfer_rate = ipr_max_bus_speeds[ipr_max_speed]; in ipr_initialize_bus_attr()
9057 ioa_cfg->bus_attr[i].max_xfer_rate = IPR_U160_SCSI_RATE; in ipr_initialize_bus_attr()
9062 * ipr_init_regs - Initialize IOA registers
9074 p = &ioa_cfg->chip_cfg->regs; in ipr_init_regs()
9075 t = &ioa_cfg->regs; in ipr_init_regs()
9076 base = ioa_cfg->hdw_dma_regs; in ipr_init_regs()
9078 t->set_interrupt_mask_reg = base + p->set_interrupt_mask_reg; in ipr_init_regs()
9079 t->clr_interrupt_mask_reg = base + p->clr_interrupt_mask_reg; in ipr_init_regs()
9080 t->clr_interrupt_mask_reg32 = base + p->clr_interrupt_mask_reg32; in ipr_init_regs()
9081 t->sense_interrupt_mask_reg = base + p->sense_interrupt_mask_reg; in ipr_init_regs()
9082 t->sense_interrupt_mask_reg32 = base + p->sense_interrupt_mask_reg32; in ipr_init_regs()
9083 t->clr_interrupt_reg = base + p->clr_interrupt_reg; in ipr_init_regs()
9084 t->clr_interrupt_reg32 = base + p->clr_interrupt_reg32; in ipr_init_regs()
9085 t->sense_interrupt_reg = base + p->sense_interrupt_reg; in ipr_init_regs()
9086 t->sense_interrupt_reg32 = base + p->sense_interrupt_reg32; in ipr_init_regs()
9087 t->ioarrin_reg = base + p->ioarrin_reg; in ipr_init_regs()
9088 t->sense_uproc_interrupt_reg = base + p->sense_uproc_interrupt_reg; in ipr_init_regs()
9089 t->sense_uproc_interrupt_reg32 = base + p->sense_uproc_interrupt_reg32; in ipr_init_regs()
9090 t->set_uproc_interrupt_reg = base + p->set_uproc_interrupt_reg; in ipr_init_regs()
9091 t->set_uproc_interrupt_reg32 = base + p->set_uproc_interrupt_reg32; in ipr_init_regs()
9092 t->clr_uproc_interrupt_reg = base + p->clr_uproc_interrupt_reg; in ipr_init_regs()
9093 t->clr_uproc_interrupt_reg32 = base + p->clr_uproc_interrupt_reg32; in ipr_init_regs()
9095 if (ioa_cfg->sis64) { in ipr_init_regs()
9096 t->init_feedback_reg = base + p->init_feedback_reg; in ipr_init_regs()
9097 t->dump_addr_reg = base + p->dump_addr_reg; in ipr_init_regs()
9098 t->dump_data_reg = base + p->dump_data_reg; in ipr_init_regs()
9099 t->endian_swap_reg = base + p->endian_swap_reg; in ipr_init_regs()
9104 * ipr_init_ioa_cfg - Initialize IOA config struct
9117 ioa_cfg->host = host; in ipr_init_ioa_cfg()
9118 ioa_cfg->pdev = pdev; in ipr_init_ioa_cfg()
9119 ioa_cfg->log_level = ipr_log_level; in ipr_init_ioa_cfg()
9120 ioa_cfg->doorbell = IPR_DOORBELL; in ipr_init_ioa_cfg()
9121 sprintf(ioa_cfg->eye_catcher, IPR_EYECATCHER); in ipr_init_ioa_cfg()
9122 sprintf(ioa_cfg->trace_start, IPR_TRACE_START_LABEL); in ipr_init_ioa_cfg()
9123 sprintf(ioa_cfg->cfg_table_start, IPR_CFG_TBL_START); in ipr_init_ioa_cfg()
9124 sprintf(ioa_cfg->resource_table_label, IPR_RES_TABLE_LABEL); in ipr_init_ioa_cfg()
9125 sprintf(ioa_cfg->ipr_hcam_label, IPR_HCAM_LABEL); in ipr_init_ioa_cfg()
9126 sprintf(ioa_cfg->ipr_cmd_label, IPR_CMD_LABEL); in ipr_init_ioa_cfg()
9128 INIT_LIST_HEAD(&ioa_cfg->hostrcb_free_q); in ipr_init_ioa_cfg()
9129 INIT_LIST_HEAD(&ioa_cfg->hostrcb_pending_q); in ipr_init_ioa_cfg()
9130 INIT_LIST_HEAD(&ioa_cfg->hostrcb_report_q); in ipr_init_ioa_cfg()
9131 INIT_LIST_HEAD(&ioa_cfg->free_res_q); in ipr_init_ioa_cfg()
9132 INIT_LIST_HEAD(&ioa_cfg->used_res_q); in ipr_init_ioa_cfg()
9133 INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread); in ipr_init_ioa_cfg()
9134 INIT_WORK(&ioa_cfg->scsi_add_work_q, ipr_add_remove_thread); in ipr_init_ioa_cfg()
9135 init_waitqueue_head(&ioa_cfg->reset_wait_q); in ipr_init_ioa_cfg()
9136 init_waitqueue_head(&ioa_cfg->msi_wait_q); in ipr_init_ioa_cfg()
9137 init_waitqueue_head(&ioa_cfg->eeh_wait_q); in ipr_init_ioa_cfg()
9138 ioa_cfg->sdt_state = INACTIVE; in ipr_init_ioa_cfg()
9141 ioa_cfg->max_devs_supported = ipr_max_devs; in ipr_init_ioa_cfg()
9143 if (ioa_cfg->sis64) { in ipr_init_ioa_cfg()
9144 host->max_channel = IPR_MAX_SIS64_BUSES; in ipr_init_ioa_cfg()
9145 host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; in ipr_init_ioa_cfg()
9146 host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; in ipr_init_ioa_cfg()
9148 ioa_cfg->max_devs_supported = IPR_MAX_SIS64_DEVS; in ipr_init_ioa_cfg()
9149 ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr64) in ipr_init_ioa_cfg()
9151 * ioa_cfg->max_devs_supported))); in ipr_init_ioa_cfg()
9153 host->max_channel = IPR_VSET_BUS; in ipr_init_ioa_cfg()
9154 host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; in ipr_init_ioa_cfg()
9155 host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; in ipr_init_ioa_cfg()
9157 ioa_cfg->max_devs_supported = IPR_MAX_PHYSICAL_DEVS; in ipr_init_ioa_cfg()
9158 ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr) in ipr_init_ioa_cfg()
9160 * ioa_cfg->max_devs_supported))); in ipr_init_ioa_cfg()
9163 host->unique_id = host->host_no; in ipr_init_ioa_cfg()
9164 host->max_cmd_len = IPR_MAX_CDB_LEN; in ipr_init_ioa_cfg()
9165 host->can_queue = ioa_cfg->max_cmds; in ipr_init_ioa_cfg()
9168 for (i = 0; i < ARRAY_SIZE(ioa_cfg->hrrq); i++) { in ipr_init_ioa_cfg()
9169 INIT_LIST_HEAD(&ioa_cfg->hrrq[i].hrrq_free_q); in ipr_init_ioa_cfg()
9170 INIT_LIST_HEAD(&ioa_cfg->hrrq[i].hrrq_pending_q); in ipr_init_ioa_cfg()
9171 spin_lock_init(&ioa_cfg->hrrq[i]._lock); in ipr_init_ioa_cfg()
9173 ioa_cfg->hrrq[i].lock = ioa_cfg->host->host_lock; in ipr_init_ioa_cfg()
9175 ioa_cfg->hrrq[i].lock = &ioa_cfg->hrrq[i]._lock; in ipr_init_ioa_cfg()
9180 * ipr_get_chip_info - Find adapter chip information
9192 if (ipr_chip[i].vendor == dev_id->vendor && in ipr_get_chip_info()
9193 ipr_chip[i].device == dev_id->device) in ipr_get_chip_info()
9199 * ipr_wait_for_pci_err_recovery - Wait for any PCI error recovery to complete
9208 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_wait_for_pci_err_recovery()
9211 wait_event_timeout(ioa_cfg->eeh_wait_q, in ipr_wait_for_pci_err_recovery()
9220 int vec_idx, n = sizeof(ioa_cfg->vectors_info[0].desc) - 1; in name_msi_vectors()
9222 for (vec_idx = 0; vec_idx < ioa_cfg->nvectors; vec_idx++) { in name_msi_vectors()
9223 snprintf(ioa_cfg->vectors_info[vec_idx].desc, n, in name_msi_vectors()
9224 "host%d-%d", ioa_cfg->host->host_no, vec_idx); in name_msi_vectors()
9225 ioa_cfg->vectors_info[vec_idx]. in name_msi_vectors()
9226 desc[strlen(ioa_cfg->vectors_info[vec_idx].desc)] = 0; in name_msi_vectors()
9235 for (i = 1; i < ioa_cfg->nvectors; i++) { in ipr_request_other_msi_irqs()
9239 ioa_cfg->vectors_info[i].desc, in ipr_request_other_msi_irqs()
9240 &ioa_cfg->hrrq[i]); in ipr_request_other_msi_irqs()
9242 while (--i > 0) in ipr_request_other_msi_irqs()
9244 &ioa_cfg->hrrq[i]); in ipr_request_other_msi_irqs()
9252 * ipr_test_intr - Handle the interrupt generated in ipr_test_msi().
9260 * 0 on success / non-zero on failure
9267 dev_info(&ioa_cfg->pdev->dev, "Received IRQ : %d\n", irq); in ipr_test_intr()
9268 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_intr()
9270 ioa_cfg->msi_received = 1; in ipr_test_intr()
9271 wake_up(&ioa_cfg->msi_wait_q); in ipr_test_intr()
9273 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_intr()
9278 * ipr_test_msi - Test for Message Signaled Interrupt (MSI) support.
9287 * 0 on success / non-zero on failure
9297 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
9298 init_waitqueue_head(&ioa_cfg->msi_wait_q); in ipr_test_msi()
9299 ioa_cfg->msi_received = 0; in ipr_test_msi()
9301 writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_test_msi()
9302 readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_test_msi()
9303 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
9307 dev_err(&pdev->dev, "Can not assign irq %d\n", irq); in ipr_test_msi()
9310 dev_info(&pdev->dev, "IRQ assigned: %d\n", irq); in ipr_test_msi()
9312 writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg32); in ipr_test_msi()
9313 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_test_msi()
9314 wait_event_timeout(ioa_cfg->msi_wait_q, ioa_cfg->msi_received, HZ); in ipr_test_msi()
9315 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
9318 if (!ioa_cfg->msi_received) { in ipr_test_msi()
9320 dev_info(&pdev->dev, "MSI test failed. Falling back to LSI.\n"); in ipr_test_msi()
9321 rc = -EOPNOTSUPP; in ipr_test_msi()
9323 dev_info(&pdev->dev, "MSI test succeeded.\n"); in ipr_test_msi()
9325 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
9334 /* ipr_probe_ioa - Allocates memory and does first stage of initialization
9339 * 0 on success / non-zero on failure
9355 dev_info(&pdev->dev, "Found IOA with IRQ: %d\n", pdev->irq); in ipr_probe_ioa()
9359 dev_err(&pdev->dev, "call to scsi_host_alloc failed!\n"); in ipr_probe_ioa()
9360 rc = -ENOMEM; in ipr_probe_ioa()
9364 ioa_cfg = (struct ipr_ioa_cfg *)host->hostdata; in ipr_probe_ioa()
9367 ioa_cfg->ipr_chip = ipr_get_chip_info(dev_id); in ipr_probe_ioa()
9369 if (!ioa_cfg->ipr_chip) { in ipr_probe_ioa()
9370 dev_err(&pdev->dev, "Unknown adapter chipset 0x%04X 0x%04X\n", in ipr_probe_ioa()
9371 dev_id->vendor, dev_id->device); in ipr_probe_ioa()
9376 ioa_cfg->sis64 = ioa_cfg->ipr_chip->sis_type == IPR_SIS64 ? 1 : 0; in ipr_probe_ioa()
9377 ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg; in ipr_probe_ioa()
9378 ioa_cfg->clear_isr = ioa_cfg->chip_cfg->clear_isr; in ipr_probe_ioa()
9379 ioa_cfg->max_cmds = ioa_cfg->chip_cfg->max_cmds; in ipr_probe_ioa()
9382 ioa_cfg->transop_timeout = ipr_transop_timeout; in ipr_probe_ioa()
9383 else if (dev_id->driver_data & IPR_USE_LONG_TRANSOP_TIMEOUT) in ipr_probe_ioa()
9384 ioa_cfg->transop_timeout = IPR_LONG_OPERATIONAL_TIMEOUT; in ipr_probe_ioa()
9386 ioa_cfg->transop_timeout = IPR_OPERATIONAL_TIMEOUT; in ipr_probe_ioa()
9388 ioa_cfg->revid = pdev->revision; in ipr_probe_ioa()
9396 dev_err(&pdev->dev, in ipr_probe_ioa()
9410 dev_err(&pdev->dev, "Cannot enable adapter\n"); in ipr_probe_ioa()
9419 dev_err(&pdev->dev, in ipr_probe_ioa()
9421 rc = -ENOMEM; in ipr_probe_ioa()
9425 ioa_cfg->hdw_dma_regs = ipr_regs; in ipr_probe_ioa()
9426 ioa_cfg->hdw_dma_regs_pci = ipr_regs_pci; in ipr_probe_ioa()
9427 ioa_cfg->ioa_mailbox = ioa_cfg->chip_cfg->mailbox + ipr_regs; in ipr_probe_ioa()
9431 if (ioa_cfg->sis64) { in ipr_probe_ioa()
9432 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in ipr_probe_ioa()
9434 dev_dbg(&pdev->dev, "Failed to set 64 bit DMA mask\n"); in ipr_probe_ioa()
9435 rc = dma_set_mask_and_coherent(&pdev->dev, in ipr_probe_ioa()
9439 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in ipr_probe_ioa()
9442 dev_err(&pdev->dev, "Failed to set DMA mask\n"); in ipr_probe_ioa()
9447 ioa_cfg->chip_cfg->cache_line_size); in ipr_probe_ioa()
9450 dev_err(&pdev->dev, "Write of cache line size failed\n"); in ipr_probe_ioa()
9452 rc = -EIO; in ipr_probe_ioa()
9457 interrupts = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_probe_ioa()
9461 dev_err(&pdev->dev, "The max number of MSIX is %d\n", in ipr_probe_ioa()
9467 if (ioa_cfg->ipr_chip->has_msi) in ipr_probe_ioa()
9474 ioa_cfg->nvectors = rc; in ipr_probe_ioa()
9476 if (!pdev->msi_enabled && !pdev->msix_enabled) in ipr_probe_ioa()
9477 ioa_cfg->clear_isr = 1; in ipr_probe_ioa()
9485 rc = -EIO; in ipr_probe_ioa()
9490 if (pdev->msi_enabled || pdev->msix_enabled) { in ipr_probe_ioa()
9494 dev_info(&pdev->dev, in ipr_probe_ioa()
9495 "Request for %d MSI%ss succeeded.", ioa_cfg->nvectors, in ipr_probe_ioa()
9496 pdev->msix_enabled ? "-X" : ""); in ipr_probe_ioa()
9498 case -EOPNOTSUPP: in ipr_probe_ioa()
9502 ioa_cfg->nvectors = 1; in ipr_probe_ioa()
9503 ioa_cfg->clear_isr = 1; in ipr_probe_ioa()
9510 ioa_cfg->hrrq_num = min3(ioa_cfg->nvectors, in ipr_probe_ioa()
9522 dev_err(&pdev->dev, in ipr_probe_ioa()
9527 /* Save away PCI config space for use following IOA reset */ in ipr_probe_ioa()
9531 dev_err(&pdev->dev, "Failed to save PCI config space\n"); in ipr_probe_ioa()
9532 rc = -EIO; in ipr_probe_ioa()
9540 mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); in ipr_probe_ioa()
9541 interrupts = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_probe_ioa()
9542 uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); in ipr_probe_ioa()
9544 ioa_cfg->needs_hard_reset = 1; in ipr_probe_ioa()
9546 ioa_cfg->needs_hard_reset = 1; in ipr_probe_ioa()
9548 ioa_cfg->ioa_unit_checked = 1; in ipr_probe_ioa()
9550 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_probe_ioa()
9552 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_probe_ioa()
9554 if (pdev->msi_enabled || pdev->msix_enabled) { in ipr_probe_ioa()
9557 ioa_cfg->vectors_info[0].desc, in ipr_probe_ioa()
9558 &ioa_cfg->hrrq[0]); in ipr_probe_ioa()
9562 rc = request_irq(pdev->irq, ipr_isr, in ipr_probe_ioa()
9564 IPR_NAME, &ioa_cfg->hrrq[0]); in ipr_probe_ioa()
9567 dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n", in ipr_probe_ioa()
9568 pdev->irq, rc); in ipr_probe_ioa()
9572 if ((dev_id->driver_data & IPR_USE_PCI_WARM_RESET) || in ipr_probe_ioa()
9573 (dev_id->device == PCI_DEVICE_ID_IBM_OBSIDIAN_E && !ioa_cfg->revid)) { in ipr_probe_ioa()
9574 ioa_cfg->needs_warm_reset = 1; in ipr_probe_ioa()
9575 ioa_cfg->reset = ipr_reset_slot_reset; in ipr_probe_ioa()
9577 ioa_cfg->reset_work_q = alloc_ordered_workqueue("ipr_reset_%d", in ipr_probe_ioa()
9578 WQ_MEM_RECLAIM, host->host_no); in ipr_probe_ioa()
9580 if (!ioa_cfg->reset_work_q) { in ipr_probe_ioa()
9581 dev_err(&pdev->dev, "Couldn't register reset workqueue\n"); in ipr_probe_ioa()
9582 rc = -ENOMEM; in ipr_probe_ioa()
9586 ioa_cfg->reset = ipr_reset_start_bist; in ipr_probe_ioa()
9589 list_add_tail(&ioa_cfg->queue, &ipr_ioa_head); in ipr_probe_ioa()
9615 * ipr_initiate_ioa_bringdown - Bring down an adapter
9632 if (ioa_cfg->sdt_state == WAIT_FOR_DUMP) in ipr_initiate_ioa_bringdown()
9633 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_initiate_ioa_bringdown()
9634 ioa_cfg->reset_retries = 0; in ipr_initiate_ioa_bringdown()
9635 ioa_cfg->in_ioa_bringdown = 1; in ipr_initiate_ioa_bringdown()
9641 * __ipr_remove - Remove a single adapter
9657 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9658 while (ioa_cfg->in_reset_reload) { in __ipr_remove()
9659 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9660 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in __ipr_remove()
9661 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9664 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in __ipr_remove()
9665 spin_lock(&ioa_cfg->hrrq[i]._lock); in __ipr_remove()
9666 ioa_cfg->hrrq[i].removing_ioa = 1; in __ipr_remove()
9667 spin_unlock(&ioa_cfg->hrrq[i]._lock); in __ipr_remove()
9672 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9673 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in __ipr_remove()
9674 flush_work(&ioa_cfg->work_q); in __ipr_remove()
9675 if (ioa_cfg->reset_work_q) in __ipr_remove()
9676 flush_workqueue(ioa_cfg->reset_work_q); in __ipr_remove()
9677 INIT_LIST_HEAD(&ioa_cfg->used_res_q); in __ipr_remove()
9678 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9681 list_del(&ioa_cfg->queue); in __ipr_remove()
9684 if (ioa_cfg->sdt_state == ABORT_DUMP) in __ipr_remove()
9685 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in __ipr_remove()
9686 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
9694 * ipr_remove - IOA hot plug remove entry point
9708 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
9710 ipr_remove_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
9712 sysfs_remove_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
9714 scsi_remove_host(ioa_cfg->host); in ipr_remove()
9722 * ipr_probe - Adapter hot plug add entry point
9727 * 0 on success / non-zero on failure
9743 rc = scsi_add_host(ioa_cfg->host, &pdev->dev); in ipr_probe()
9750 rc = ipr_create_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9754 scsi_remove_host(ioa_cfg->host); in ipr_probe()
9759 rc = sysfs_create_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9763 ipr_remove_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9765 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9767 scsi_remove_host(ioa_cfg->host); in ipr_probe()
9772 rc = ipr_create_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9776 sysfs_remove_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9778 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
9780 scsi_remove_host(ioa_cfg->host); in ipr_probe()
9784 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_probe()
9785 ioa_cfg->scan_enabled = 1; in ipr_probe()
9786 schedule_work(&ioa_cfg->work_q); in ipr_probe()
9787 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_probe()
9789 ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight; in ipr_probe()
9791 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_probe()
9792 for (i = 1; i < ioa_cfg->hrrq_num; i++) { in ipr_probe()
9793 irq_poll_init(&ioa_cfg->hrrq[i].iopoll, in ipr_probe()
9794 ioa_cfg->iopoll_weight, ipr_iopoll); in ipr_probe()
9798 scsi_scan_host(ioa_cfg->host); in ipr_probe()
9804 * ipr_shutdown - Shutdown handler.
9820 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
9821 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_shutdown()
9822 ioa_cfg->iopoll_weight = 0; in ipr_shutdown()
9823 for (i = 1; i < ioa_cfg->hrrq_num; i++) in ipr_shutdown()
9824 irq_poll_disable(&ioa_cfg->hrrq[i].iopoll); in ipr_shutdown()
9827 while (ioa_cfg->in_reset_reload) { in ipr_shutdown()
9828 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
9829 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_shutdown()
9830 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
9833 if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64) in ipr_shutdown()
9837 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
9838 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_shutdown()
9839 if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64) { in ipr_shutdown()
9841 pci_disable_device(ioa_cfg->pdev); in ipr_shutdown()
9975 * ipr_halt_done - Shutdown prepare completion
9983 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_halt_done()
9987 * ipr_halt - Issue shutdown prepare to all adapters
10007 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_halt()
10008 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds || in ipr_halt()
10009 (ipr_fast_reboot && event == SYS_RESTART && ioa_cfg->sis64)) { in ipr_halt()
10010 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_halt()
10015 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_halt()
10016 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_halt()
10017 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; in ipr_halt()
10018 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL; in ipr_halt()
10021 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_halt()
10033 * ipr_init - Module entry point
10056 * ipr_exit - Module unload