Lines Matching defs:ipr_cmd

579  * @ipr_cmd:	ipr command struct
586 static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
590 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
596 trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
598 if (ipr_cmd->ioa_cfg->sis64)
599 trace_entry->ata_op_code = ipr_cmd->i.ata_ioadl.regs.command;
601 trace_entry->ata_op_code = ipr_cmd->ioarcb.u.add_data.u.regs.command;
602 trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff;
603 trace_entry->res_handle = ipr_cmd->ioarcb.res_handle;
608 #define ipr_trc_hook(ipr_cmd, type, add_data) do { } while (0)
613 * @ipr_cmd: ipr command struct
618 static void ipr_lock_and_done(struct ipr_cmnd *ipr_cmd)
621 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
624 ipr_cmd->done(ipr_cmd);
630 * @ipr_cmd: ipr command struct
635 static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
637 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
638 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
639 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
640 dma_addr_t dma_addr = ipr_cmd->dma_addr;
651 if (ipr_cmd->ioa_cfg->sis64) {
664 ipr_cmd->scsi_cmd = NULL;
665 ipr_cmd->qc = NULL;
666 ipr_cmd->sense_buffer[0] = 0;
667 ipr_cmd->dma_use_sg = 0;
672 * @ipr_cmd: ipr command struct
678 static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd,
681 ipr_reinit_ipr_cmnd(ipr_cmd);
682 ipr_cmd->u.scratch = 0;
683 ipr_cmd->sibling = NULL;
684 ipr_cmd->eh_comp = NULL;
685 ipr_cmd->fast_done = fast_done;
686 timer_setup(&ipr_cmd->timer, NULL, 0);
699 struct ipr_cmnd *ipr_cmd = NULL;
702 ipr_cmd = list_entry(hrrq->hrrq_free_q.next,
704 list_del(&ipr_cmd->queue);
708 return ipr_cmd;
721 struct ipr_cmnd *ipr_cmd =
723 ipr_init_ipr_cmnd(ipr_cmd, ipr_lock_and_done);
724 return ipr_cmd;
811 * @ipr_cmd: ipr command struct
819 static void __ipr_sata_eh_done(struct ipr_cmnd *ipr_cmd)
821 struct ata_queued_cmd *qc = ipr_cmd->qc;
827 if (ipr_cmd->eh_comp)
828 complete(ipr_cmd->eh_comp);
829 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
834 * @ipr_cmd: ipr command struct
842 static void ipr_sata_eh_done(struct ipr_cmnd *ipr_cmd)
844 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
848 __ipr_sata_eh_done(ipr_cmd);
854 * @ipr_cmd: ipr command struct
862 static void __ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
864 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
868 scsi_dma_unmap(ipr_cmd->scsi_cmd);
870 if (ipr_cmd->eh_comp)
871 complete(ipr_cmd->eh_comp);
872 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
877 * @ipr_cmd: ipr command struct
885 static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
888 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
891 __ipr_scsi_eh_done(ipr_cmd);
906 struct ipr_cmnd *ipr_cmd, *temp;
912 list_for_each_entry_safe(ipr_cmd,
914 list_del(&ipr_cmd->queue);
916 ipr_cmd->s.ioasa.hdr.ioasc =
918 ipr_cmd->s.ioasa.hdr.ilid =
921 if (ipr_cmd->scsi_cmd)
922 ipr_cmd->done = __ipr_scsi_eh_done;
923 else if (ipr_cmd->qc)
924 ipr_cmd->done = __ipr_sata_eh_done;
926 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH,
928 del_timer(&ipr_cmd->timer);
929 ipr_cmd->done(ipr_cmd);
938 * @ipr_cmd: ipr command struct
947 static void ipr_send_command(struct ipr_cmnd *ipr_cmd)
949 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
950 dma_addr_t send_dma_addr = ipr_cmd->dma_addr;
958 if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 )
967 * @ipr_cmd: ipr command struct
978 static void ipr_do_req(struct ipr_cmnd *ipr_cmd,
982 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
984 ipr_cmd->done = done;
986 ipr_cmd->timer.expires = jiffies + timeout;
987 ipr_cmd->timer.function = timeout_func;
989 add_timer(&ipr_cmd->timer);
991 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0);
993 ipr_send_command(ipr_cmd);
998 * @ipr_cmd: ipr command struct
1006 static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd)
1008 if (ipr_cmd->sibling)
1009 ipr_cmd->sibling = NULL;
1011 complete(&ipr_cmd->completion);
1016 * @ipr_cmd: ipr command struct
1027 static void ipr_init_ioadl(struct ipr_cmnd *ipr_cmd, dma_addr_t dma_addr,
1030 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
1031 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
1033 ipr_cmd->dma_use_sg = 1;
1035 if (ipr_cmd->ioa_cfg->sis64) {
1040 ipr_cmd->ioarcb.ioadl_len =
1042 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
1048 ipr_cmd->ioarcb.read_ioadl_len =
1050 ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len);
1052 ipr_cmd->ioarcb.ioadl_len =
1054 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
1061 * @ipr_cmd: ipr command struct
1068 static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
1072 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1074 init_completion(&ipr_cmd->completion);
1075 ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout);
1078 wait_for_completion(&ipr_cmd->completion);
1111 struct ipr_cmnd *ipr_cmd;
1115 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
1116 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
1119 ipr_cmd->u.hostrcb = hostrcb;
1120 ioarcb = &ipr_cmd->ioarcb;
1129 ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma,
1133 ipr_cmd->done = ipr_process_ccn;
1135 ipr_cmd->done = ipr_process_error;
1137 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR);
1139 ipr_send_command(ipr_cmd);
1489 * @ipr_cmd: ipr command struct
1497 static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
1499 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1500 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
1501 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
1504 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2627 * @ipr_cmd: ipr command struct
2636 static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
2638 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2639 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
2640 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
2649 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2680 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2682 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2694 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd)
2713 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2715 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2727 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) {
3955 * @ipr_cmd: ipr command struct
3961 static void ipr_build_ucode_ioadl64(struct ipr_cmnd *ipr_cmd,
3964 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3965 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
3970 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3975 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
3976 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
3987 * @ipr_cmd: ipr command struct
3993 static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd,
3996 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3997 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
4002 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
4007 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
4009 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
5063 * @ipr_cmd: ipr command struct
5069 static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device)
5071 if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device)
5078 * @ipr_cmd: ipr command struct
5083 static bool ipr_cmnd_is_free(struct ipr_cmnd *ipr_cmd)
5087 list_for_each_entry(loop_cmd, &ipr_cmd->hrrq->hrrq_free_q, queue) {
5088 if (loop_cmd == ipr_cmd)
5097 * @ipr_cmd: ipr command struct
5103 static int ipr_match_res(struct ipr_cmnd *ipr_cmd, void *resource)
5107 if (res && ipr_cmd->ioarcb.res_handle == res->res_handle)
5124 struct ipr_cmnd *ipr_cmd;
5138 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
5139 if (!ipr_cmnd_is_free(ipr_cmd)) {
5140 if (match(ipr_cmd, device)) {
5141 ipr_cmd->eh_comp = ∁
5158 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
5159 if (!ipr_cmnd_is_free(ipr_cmd)) {
5160 if (match(ipr_cmd, device)) {
5161 ipr_cmd->eh_comp = NULL;
5233 struct ipr_cmnd *ipr_cmd;
5240 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5241 ioarcb = &ipr_cmd->ioarcb;
5244 if (ipr_cmd->ioa_cfg->sis64) {
5245 regs = &ipr_cmd->i.ata_ioadl.regs;
5259 ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
5260 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5261 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5263 if (ipr_cmd->ioa_cfg->sis64)
5264 memcpy(&res->sata_port->ioasa, &ipr_cmd->s.ioasa64.u.gata,
5267 memcpy(&res->sata_port->ioasa, &ipr_cmd->s.ioasa.u.gata,
5337 struct ipr_cmnd *ipr_cmd;
5361 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
5363 if (ipr_cmd->ioarcb.res_handle == res->res_handle) {
5364 if (!ipr_cmd->qc)
5366 if (ipr_cmnd_is_free(ipr_cmd))
5369 ipr_cmd->done = ipr_sata_eh_done;
5370 if (!(ipr_cmd->qc->flags & ATA_QCFLAG_FAILED)) {
5371 ipr_cmd->qc->err_mask |= AC_ERR_TIMEOUT;
5372 ipr_cmd->qc->flags |= ATA_QCFLAG_FAILED;
5423 * @ipr_cmd: ipr command struct
5430 static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd)
5432 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5438 if (res->res_handle == ipr_cmd->ioarcb.res_handle) {
5448 if (ipr_cmd->sibling->sibling)
5449 ipr_cmd->sibling->sibling = NULL;
5451 ipr_cmd->sibling->done(ipr_cmd->sibling);
5453 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5470 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
5472 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5478 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) {
5483 sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n");
5485 ipr_cmd->sibling = reset_cmd;
5486 reset_cmd->sibling = ipr_cmd;
5487 reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle;
5509 struct ipr_cmnd *ipr_cmd;
5557 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5558 ipr_cmd->ioarcb.res_handle = res->res_handle;
5559 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5562 ipr_cmd->u.sdev = scsi_cmd->device;
5566 ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT);
5567 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5578 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5737 struct ipr_cmnd *ipr_cmd;
5760 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index];
5761 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5763 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc);
5765 list_move_tail(&ipr_cmd->queue, doneq);
5784 struct ipr_cmnd *ipr_cmd, *temp;
5798 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5799 list_del(&ipr_cmd->queue);
5800 del_timer(&ipr_cmd->timer);
5801 ipr_cmd->fast_done(ipr_cmd);
5823 struct ipr_cmnd *ipr_cmd, *temp;
5867 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5868 list_del(&ipr_cmd->queue);
5869 del_timer(&ipr_cmd->timer);
5870 ipr_cmd->fast_done(ipr_cmd);
5888 struct ipr_cmnd *ipr_cmd, *temp;
5917 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5918 list_del(&ipr_cmd->queue);
5919 del_timer(&ipr_cmd->timer);
5920 ipr_cmd->fast_done(ipr_cmd);
5928 * @ipr_cmd: ipr command struct
5934 struct ipr_cmnd *ipr_cmd)
5940 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5941 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5942 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
5955 ipr_cmd->dma_use_sg = nseg;
5959 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
5967 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
5980 * @ipr_cmd: ipr command struct
5986 struct ipr_cmnd *ipr_cmd)
5992 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5993 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5994 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
6006 ipr_cmd->dma_use_sg = nseg;
6013 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
6018 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
6021 if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) {
6023 ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) +
6028 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
6040 * @ipr_cmd: ipr command struct
6048 static void __ipr_erp_done(struct ipr_cmnd *ipr_cmd)
6050 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6052 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6059 memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer,
6068 scsi_dma_unmap(ipr_cmd->scsi_cmd);
6070 if (ipr_cmd->eh_comp)
6071 complete(ipr_cmd->eh_comp);
6072 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6077 * @ipr_cmd: ipr command struct
6085 static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
6087 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
6091 __ipr_erp_done(ipr_cmd);
6097 * @ipr_cmd: ipr command struct
6102 static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
6104 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6105 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6106 dma_addr_t dma_addr = ipr_cmd->dma_addr;
6116 if (ipr_cmd->ioa_cfg->sis64)
6128 * @ipr_cmd: ipr command struct
6136 static void __ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
6138 struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
6139 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6142 __ipr_erp_done(ipr_cmd);
6146 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
6155 ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma,
6158 ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout,
6164 * @ipr_cmd: ipr command struct
6172 static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
6174 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
6178 __ipr_erp_request_sense(ipr_cmd);
6184 * @ipr_cmd: ipr command struct
6194 static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd)
6196 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6202 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
6205 __ipr_erp_request_sense(ipr_cmd);
6209 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
6213 ipr_do_req(ipr_cmd, ipr_erp_request_sense, ipr_timeout,
6220 * @ipr_cmd: ipr command struct
6231 struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res)
6236 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6287 * @ipr_cmd: ipr command struct
6292 static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
6295 u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
6296 struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata;
6297 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6305 ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION;
6377 * @ipr_cmd: ipr command struct
6385 static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
6387 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6388 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
6393 if (ipr_cmd->ioa_cfg->sis64)
6394 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data,
6398 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
6407 * @ipr_cmd: ipr command struct
6416 struct ipr_cmnd *ipr_cmd)
6418 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6420 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6424 __ipr_scsi_eh_done(ipr_cmd);
6429 ipr_gen_sense(ipr_cmd);
6431 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
6478 if (!ipr_get_autosense(ipr_cmd)) {
6480 ipr_erp_cancel_all(ipr_cmd);
6505 scsi_dma_unmap(ipr_cmd->scsi_cmd);
6507 if (ipr_cmd->eh_comp)
6508 complete(ipr_cmd->eh_comp);
6509 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6514 * @ipr_cmd: ipr command struct
6522 static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
6524 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6525 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6526 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6529 scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len));
6534 spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
6536 if (ipr_cmd->eh_comp)
6537 complete(ipr_cmd->eh_comp);
6538 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6539 spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
6542 spin_lock(&ipr_cmd->hrrq->_lock);
6543 ipr_erp_start(ioa_cfg, ipr_cmd);
6544 spin_unlock(&ipr_cmd->hrrq->_lock);
6567 struct ipr_cmnd *ipr_cmd;
6608 ipr_cmd = __ipr_get_free_ipr_cmnd(hrrq);
6609 if (ipr_cmd == NULL) {
6615 ipr_init_ipr_cmnd(ipr_cmd, ipr_scsi_done);
6616 ioarcb = &ipr_cmd->ioarcb;
6619 ipr_cmd->scsi_cmd = scsi_cmd;
6620 ipr_cmd->done = ipr_scsi_eh_done;
6654 rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd);
6656 rc = ipr_build_ioadl(ioa_cfg, ipr_cmd);
6660 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6668 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6679 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_pending_q);
6680 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res));
6681 ipr_send_command(ipr_cmd);
6822 struct ipr_cmnd *ipr_cmd;
6835 list_for_each_entry(ipr_cmd, &hrrq->hrrq_pending_q, queue) {
6836 if (ipr_cmd->qc == qc) {
6874 * @ipr_cmd: ipr command struct
6882 static void ipr_sata_done(struct ipr_cmnd *ipr_cmd)
6884 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6885 struct ata_queued_cmd *qc = ipr_cmd->qc;
6888 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6890 spin_lock(&ipr_cmd->hrrq->_lock);
6891 if (ipr_cmd->ioa_cfg->sis64)
6892 memcpy(&sata_port->ioasa, &ipr_cmd->s.ioasa64.u.gata,
6895 memcpy(&sata_port->ioasa, &ipr_cmd->s.ioasa.u.gata,
6897 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
6899 if (be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc_specific) & IPR_ATA_DEVICE_WAS_RESET)
6906 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6907 spin_unlock(&ipr_cmd->hrrq->_lock);
6913 * @ipr_cmd: ipr command struct
6917 static void ipr_build_ata_ioadl64(struct ipr_cmnd *ipr_cmd,
6921 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6922 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ata_ioadl.ioadl64;
6927 dma_addr_t dma_addr = ipr_cmd->dma_addr;
6940 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
6959 * @ipr_cmd: ipr command struct
6963 static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd,
6967 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6968 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
6982 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
6987 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
7003 * ipr_qc_defer - Get a free ipr_cmd
7014 struct ipr_cmnd *ipr_cmd;
7033 ipr_cmd = __ipr_get_free_ipr_cmnd(hrrq);
7034 if (ipr_cmd == NULL) {
7039 qc->lldd_task = ipr_cmd;
7057 struct ipr_cmnd *ipr_cmd;
7064 ipr_cmd = qc->lldd_task;
7065 if (ipr_cmd == NULL)
7069 spin_lock(&ipr_cmd->hrrq->_lock);
7070 if (unlikely(!ipr_cmd->hrrq->allow_cmds ||
7071 ipr_cmd->hrrq->ioa_is_dead)) {
7072 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
7073 spin_unlock(&ipr_cmd->hrrq->_lock);
7077 ipr_init_ipr_cmnd(ipr_cmd, ipr_lock_and_done);
7078 ioarcb = &ipr_cmd->ioarcb;
7081 regs = &ipr_cmd->i.ata_ioadl.regs;
7089 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7090 ipr_cmd->qc = qc;
7091 ipr_cmd->done = ipr_sata_done;
7092 ipr_cmd->ioarcb.res_handle = res->res_handle;
7096 ipr_cmd->dma_use_sg = qc->n_elem;
7099 ipr_build_ata_ioadl64(ipr_cmd, qc);
7101 ipr_build_ata_ioadl(ipr_cmd, qc);
7106 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res));
7129 spin_unlock(&ipr_cmd->hrrq->_lock);
7133 ipr_send_command(ipr_cmd);
7134 spin_unlock(&ipr_cmd->hrrq->_lock);
7229 * @ipr_cmd: ipr command struct
7237 static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
7239 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7258 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
7267 * @ipr_cmd: ipr command struct
7276 static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
7278 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7317 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
7347 * @ipr_cmd: ipr command struct
7354 static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
7356 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7358 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7359 struct ipr_resource_entry *res = ipr_cmd->u.res;
7361 ipr_cmd->job_step = ipr_ioa_reset_done;
7367 ipr_cmd->u.res = res;
7379 ipr_init_ioadl(ipr_cmd,
7385 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7389 ipr_cmd->job_step = ipr_set_supported_devs;
7546 * @ipr_cmd: ipr command struct
7555 static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd,
7559 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7568 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_WRITE_LAST);
7573 * @ipr_cmd: ipr command struct
7581 static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
7583 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7594 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
7598 ipr_cmd->job_step = ipr_set_supported_devs;
7599 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
7601 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7609 * @ipr_cmd: ipr command struct
7618 static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd,
7622 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7630 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
7635 * @ipr_cmd: ipr command struct
7642 static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
7644 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7645 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7649 ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
7652 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
7658 * @ipr_cmd: ipr command struct
7666 static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
7668 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7669 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7672 ipr_cmd->job_step = ipr_set_supported_devs;
7673 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
7678 return ipr_reset_cmd_failed(ipr_cmd);
7683 * @ipr_cmd: ipr command struct
7691 static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd)
7693 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7696 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
7701 ipr_cmd->job_step = ipr_ioafp_mode_select_page28;
7702 ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed;
7704 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7712 * @ipr_cmd: ipr command struct
7719 static int ipr_ioafp_mode_select_page24(struct ipr_cmnd *ipr_cmd)
7721 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7736 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
7740 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
7741 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7749 * @ipr_cmd: ipr command struct
7757 static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd)
7759 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7762 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
7766 return ipr_reset_cmd_failed(ipr_cmd);
7771 * @ipr_cmd: ipr command struct
7779 static int ipr_ioafp_mode_sense_page24(struct ipr_cmnd *ipr_cmd)
7781 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7784 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
7789 ipr_cmd->job_step = ipr_ioafp_mode_select_page24;
7790 ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed;
7792 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7800 * @ipr_cmd: ipr command struct
7810 static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd)
7812 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7883 ipr_cmd->job_step = ipr_ioafp_mode_sense_page24;
7885 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
7893 * @ipr_cmd: ipr command struct
7901 static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd)
7903 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7904 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7922 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size,
7925 ipr_cmd->job_step = ipr_init_res_table;
7927 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7933 static int ipr_ioa_service_action_failed(struct ipr_cmnd *ipr_cmd)
7935 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7940 return ipr_reset_cmd_failed(ipr_cmd);
7943 static void ipr_build_ioa_service_action(struct ipr_cmnd *ipr_cmd,
7946 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7957 * @ipr_cmd: ipr command struct
7962 static int ipr_ioafp_set_caching_parameters(struct ipr_cmnd *ipr_cmd)
7964 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7965 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7970 ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
7973 ipr_build_ioa_service_action(ipr_cmd,
7979 ipr_cmd->job_step_failed = ipr_ioa_service_action_failed;
7980 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7993 * @ipr_cmd: ipr command struct
8004 static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
8007 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
8018 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
8020 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
8047 * @ipr_cmd: ipr command struct
8055 static int ipr_ioafp_pageC4_inquiry(struct ipr_cmnd *ipr_cmd)
8057 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8062 ipr_cmd->job_step = ipr_ioafp_set_caching_parameters;
8066 ipr_ioafp_inquiry(ipr_cmd, 1, 0xC4,
8080 * @ipr_cmd: ipr command struct
8088 static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd)
8090 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8095 ipr_cmd->job_step = ipr_ioafp_pageC4_inquiry;
8099 ipr_ioafp_inquiry(ipr_cmd, 1, 0xD0,
8111 * @ipr_cmd: ipr command struct
8119 static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
8121 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8125 ipr_cmd->job_step = ipr_ioafp_cap_inquiry;
8127 ipr_ioafp_inquiry(ipr_cmd, 1, 3,
8137 * @ipr_cmd: ipr command struct
8145 static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd)
8147 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8164 list_add_tail(&ipr_cmd->queue,
8170 ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
8172 ipr_ioafp_inquiry(ipr_cmd, 1, 0,
8182 * @ipr_cmd: ipr command struct
8189 static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd)
8191 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8194 ipr_cmd->job_step = ipr_ioafp_page0_inquiry;
8196 ipr_ioafp_inquiry(ipr_cmd, 0, 0,
8206 * @ipr_cmd: ipr command struct
8214 static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd)
8216 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8217 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
8221 ipr_cmd->job_step = ipr_ioafp_std_inquiry;
8272 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
8276 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
8301 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
8302 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8307 if (ioa_cfg->reset_cmd == ipr_cmd) {
8308 list_del(&ipr_cmd->queue);
8309 ipr_cmd->done(ipr_cmd);
8317 * @ipr_cmd: ipr command struct
8329 static void ipr_reset_start_timer(struct ipr_cmnd *ipr_cmd,
8334 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
8335 ipr_cmd->done = ipr_reset_ioa_job;
8337 ipr_cmd->timer.expires = jiffies + timeout;
8338 ipr_cmd->timer.function = ipr_reset_timer_done;
8339 add_timer(&ipr_cmd->timer);
8378 * @ipr_cmd: ipr command struct
8383 static int ipr_reset_next_stage(struct ipr_cmnd *ipr_cmd)
8388 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8409 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
8413 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
8422 ipr_cmd->timer.expires = jiffies + stage_time * HZ;
8423 ipr_cmd->timer.function = ipr_oper_timeout;
8424 ipr_cmd->done = ipr_reset_ioa_job;
8425 add_timer(&ipr_cmd->timer);
8427 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
8434 * @ipr_cmd: ipr command struct
8442 static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
8444 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8450 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
8488 ipr_cmd->job_step = ipr_reset_next_stage;
8492 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ);
8493 ipr_cmd->timer.function = ipr_oper_timeout;
8494 ipr_cmd->done = ipr_reset_ioa_job;
8495 add_timer(&ipr_cmd->timer);
8496 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
8504 * @ipr_cmd: ipr command struct
8512 static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd)
8514 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8522 ipr_cmd->job_step = ipr_reset_alert;
8611 * @ipr_cmd: ipr command struct
8618 static int ipr_reset_get_unit_check_job(struct ipr_cmnd *ipr_cmd)
8620 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8625 ipr_cmd->job_step = ipr_reset_alert;
8626 ipr_reset_start_timer(ipr_cmd, 0);
8632 static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd)
8634 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8641 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left ||
8645 if (!ipr_cmd->u.time_left)
8652 ipr_reset_start_timer(ipr_cmd, IPR_SIS64_DUMP_TIMEOUT);
8654 ipr_reset_start_timer(ipr_cmd, IPR_SIS32_DUMP_TIMEOUT);
8655 ipr_cmd->job_step = ipr_reset_wait_for_dump;
8659 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8660 ipr_reset_start_timer(ipr_cmd,
8670 * @ipr_cmd: ipr command struct
8679 static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
8681 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8688 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
8702 ipr_cmd->job_step = ipr_reset_get_unit_check_job;
8703 ipr_reset_start_timer(ipr_cmd, IPR_DUMP_DELAY_TIMEOUT);
8708 ipr_cmd->job_step = ipr_reset_alert;
8709 ipr_reset_start_timer(ipr_cmd, 0);
8715 ipr_cmd->job_step = ipr_ioa_bringdown_done;
8717 ipr_cmd->job_step = ipr_dump_mailbox_wait;
8718 ipr_cmd->u.time_left = IPR_WAIT_FOR_MAILBOX;
8720 ipr_cmd->job_step = ipr_reset_enable_ioa;
8729 * @ipr_cmd: ipr command struct
8736 static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
8738 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8744 ipr_cmd->job_step = ipr_reset_restore_cfg_space;
8751 * @ipr_cmd: ipr command struct
8758 static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
8760 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8771 ipr_cmd->job_step = ipr_reset_bist_done;
8772 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
8776 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev);
8778 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
8788 * @ipr_cmd: ipr command struct
8795 static int ipr_reset_slot_reset_done(struct ipr_cmnd *ipr_cmd)
8798 ipr_cmd->job_step = ipr_reset_bist_done;
8799 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
8813 struct ipr_cmnd *ipr_cmd = container_of(work, struct ipr_cmnd, work);
8814 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8824 if (ioa_cfg->reset_cmd == ipr_cmd)
8825 ipr_reset_ioa_job(ipr_cmd);
8832 * @ipr_cmd: ipr command struct
8839 static int ipr_reset_slot_reset(struct ipr_cmnd *ipr_cmd)
8841 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8844 INIT_WORK(&ipr_cmd->work, ipr_reset_reset_work);
8845 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work);
8846 ipr_cmd->job_step = ipr_reset_slot_reset_done;
8853 * @ipr_cmd: ipr command struct
8860 static int ipr_reset_block_config_access_wait(struct ipr_cmnd *ipr_cmd)
8862 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8867 ipr_cmd->job_step = ioa_cfg->reset;
8869 if (ipr_cmd->u.time_left) {
8871 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8872 ipr_reset_start_timer(ipr_cmd,
8875 ipr_cmd->job_step = ioa_cfg->reset;
8886 * @ipr_cmd: ipr command struct
8893 static int ipr_reset_block_config_access(struct ipr_cmnd *ipr_cmd)
8895 ipr_cmd->ioa_cfg->cfg_locked = 0;
8896 ipr_cmd->job_step = ipr_reset_block_config_access_wait;
8897 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8918 * @ipr_cmd: ipr command struct
8931 static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd)
8933 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8936 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) {
8937 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8938 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8940 ipr_cmd->job_step = ipr_reset_block_config_access;
8949 * @ipr_cmd: ipr command struct
8959 static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd)
8961 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8971 ipr_cmd->job_step = ipr_reset_wait_to_start_bist;
8973 ipr_cmd->job_step = ipr_reset_block_config_access;
8976 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8977 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8985 * @ipr_cmd: ipr command struct
8992 static int ipr_reset_quiesce_done(struct ipr_cmnd *ipr_cmd)
8994 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8997 ipr_cmd->job_step = ipr_ioa_bringdown_done;
9005 * @ipr_cmd: ipr command struct
9013 static int ipr_reset_cancel_hcam_done(struct ipr_cmnd *ipr_cmd)
9015 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9022 ipr_cmd->job_step = ipr_reset_quiesce_done;
9029 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
9045 * @ipr_cmd: ipr command struct
9052 static int ipr_reset_cancel_hcam(struct ipr_cmnd *ipr_cmd)
9054 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9061 ipr_cmd->job_step = ipr_reset_cancel_hcam_done;
9069 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
9070 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
9071 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
9084 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
9088 ipr_cmd->job_step = ipr_reset_cancel_hcam;
9093 ipr_cmd->job_step = ipr_reset_alert;
9101 * @ipr_cmd: ipr command struct
9108 static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd)
9110 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9116 ipr_cmd->job_step = ipr_reset_alert;
9122 * @ipr_cmd: ipr command struct
9130 static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd)
9132 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9136 ipr_cmd->job_step = ipr_reset_alert;
9141 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
9142 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
9143 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER;
9144 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE;
9145 ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16;
9146 ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8;
9147 ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff;
9150 ipr_build_ucode_ioadl64(ipr_cmd, sglist);
9152 ipr_build_ucode_ioadl(ipr_cmd, sglist);
9153 ipr_cmd->job_step = ipr_reset_ucode_download_done;
9155 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
9164 * @ipr_cmd: ipr command struct
9173 static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
9175 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9176 enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type;
9182 ipr_cmd->job_step = ipr_reset_cancel_hcam;
9185 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
9186 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
9187 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
9188 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type;
9199 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, timeout);
9202 ipr_cmd->job_step = ipr_reset_ucode_download;
9204 ipr_cmd->job_step = ipr_reset_alert;
9212 * @ipr_cmd: ipr command struct
9219 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
9222 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9225 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
9227 if (ioa_cfg->reset_cmd != ipr_cmd) {
9232 list_add_tail(&ipr_cmd->queue,
9233 &ipr_cmd->hrrq->hrrq_free_q);
9238 rc = ipr_cmd->job_step_failed(ipr_cmd);
9243 ipr_reinit_ipr_cmnd(ipr_cmd);
9244 ipr_cmd->job_step_failed = ipr_reset_cmd_failed;
9245 rc = ipr_cmd->job_step(ipr_cmd);
9267 struct ipr_cmnd *ipr_cmd;
9283 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
9284 ioa_cfg->reset_cmd = ipr_cmd;
9285 ipr_cmd->job_step = job_step;
9286 ipr_cmd->u.shutdown_type = shutdown_type;
9288 ipr_reset_ioa_job(ipr_cmd);
9353 * @ipr_cmd: ipr command struct
9359 static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd)
9361 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
9371 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
9372 ipr_cmd->done = ipr_reset_ioa_job;
9651 struct ipr_cmnd *ipr_cmd;
9706 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool,
9709 if (!ipr_cmd) {
9714 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd;
9717 ioarcb = &ipr_cmd->ioarcb;
9718 ipr_cmd->dma_addr = dma_addr;
9738 ipr_cmd->cmd_index = i;
9739 ipr_cmd->ioa_cfg = ioa_cfg;
9740 ipr_cmd->sense_buffer_dma = dma_addr +
9743 ipr_cmd->ioarcb.cmd_pkt.hrrq_id = hrrq_id;
9744 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id];
9745 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
10810 * @ipr_cmd: ipr command struct
10815 static void ipr_halt_done(struct ipr_cmnd *ipr_cmd)
10817 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
10831 struct ipr_cmnd *ipr_cmd;
10848 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
10849 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
10850 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
10851 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
10852 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
10854 ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);