Lines Matching refs:scmd

54 static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
71 * Schedule SCSI EH without scmd.
91 * @scmd: scmd to run eh on.
97 int scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag)
99 struct Scsi_Host *shost = scmd->device->host;
112 scmd->eh_eflags |= eh_flag;
113 list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q);
133 struct scsi_cmnd *scmd = req->special;
135 struct Scsi_Host *host = scmd->device->host;
137 trace_scsi_dispatch_cmd_timeout(scmd);
138 scsi_log_completion(scmd, TIMEOUT_ERROR);
141 rtn = host->transportt->eh_timed_out(scmd);
143 rtn = host->hostt->eh_timed_out(scmd);
145 scmd->result |= DID_TIME_OUT << 16;
148 !scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD)))
189 struct scsi_cmnd *scmd;
197 list_for_each_entry(scmd, work_q, eh_entry) {
198 if (scmd->device == sdev) {
200 if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD)
227 * @scmd: Cmd to have sense checked.
236 static int scsi_check_sense(struct scsi_cmnd *scmd)
238 struct scsi_device *sdev = scmd->device;
241 if (! scsi_command_normalize_sense(scmd, &sshdr))
263 if (scmd->sense_buffer[2] & 0xe0)
272 (scmd->sense_buffer[8] == 0x4) &&
273 (scmd->sense_buffer[11] & 0xe0))
296 if (scmd->device->expecting_cc_ua) {
304 scmd->device->expecting_cc_ua = 0;
318 if (scmd->device->allow_restart &&
323 scmd_printk(KERN_WARNING, scmd,
329 scmd_printk(KERN_WARNING, scmd,
336 scmd_printk(KERN_WARNING, scmd,
364 if (scmd->device->retry_hwerror)
443 * @scmd: SCSI cmd to examine.
451 static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
457 if (host_byte(scmd->result) == DID_RESET) {
464 return scsi_check_sense(scmd);
466 if (host_byte(scmd->result) != DID_OK)
472 if (msg_byte(scmd->result) != COMMAND_COMPLETE)
479 switch (status_byte(scmd->result)) {
481 scsi_handle_queue_ramp_up(scmd->device);
485 return scsi_check_sense(scmd);
494 if (scmd->cmnd[0] == TEST_UNIT_READY)
501 scsi_handle_queue_full(scmd->device);
513 * @scmd: Cmd that is done.
515 static void scsi_eh_done(struct scsi_cmnd *scmd)
520 printk("%s scmd: %p result: %x\n",
521 __func__, scmd, scmd->result));
523 eh_action = scmd->device->host->eh_action;
530 * @scmd: SCSI cmd to send hsot reset.
532 static int scsi_try_host_reset(struct scsi_cmnd *scmd)
536 struct Scsi_Host *host = scmd->device->host;
545 rtn = hostt->eh_host_reset_handler(scmd);
551 scsi_report_bus_reset(host, scmd_channel(scmd));
560 * @scmd: SCSI cmd to send bus reset.
562 static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
566 struct Scsi_Host *host = scmd->device->host;
575 rtn = hostt->eh_bus_reset_handler(scmd);
581 scsi_report_bus_reset(host, scmd_channel(scmd));
596 * @scmd: SCSI cmd used to send a target reset
604 static int scsi_try_target_reset(struct scsi_cmnd *scmd)
608 struct Scsi_Host *host = scmd->device->host;
614 rtn = hostt->eh_target_reset_handler(scmd);
617 __starget_for_each_device(scsi_target(scmd->device), NULL,
627 * @scmd: SCSI cmd used to send BDR
635 static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
638 struct scsi_host_template *hostt = scmd->device->host->hostt;
643 rtn = hostt->eh_device_reset_handler(scmd);
645 __scsi_report_device_reset(scmd->device, NULL);
649 static int scsi_try_to_abort_cmd(struct scsi_host_template *hostt, struct scsi_cmnd *scmd)
654 return hostt->eh_abort_handler(scmd);
657 static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
659 if (scsi_try_to_abort_cmd(scmd->device->host->hostt, scmd) != SUCCESS)
660 if (scsi_try_bus_device_reset(scmd) != SUCCESS)
661 if (scsi_try_target_reset(scmd) != SUCCESS)
662 if (scsi_try_bus_reset(scmd) != SUCCESS)
663 scsi_try_host_reset(scmd);
668 * @scmd: SCSI command structure to hijack
678 * and cmnd buffers to read @sense_bytes into @scmd->sense_buffer.
680 void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
683 struct scsi_device *sdev = scmd->device;
692 ses->cmd_len = scmd->cmd_len;
693 ses->cmnd = scmd->cmnd;
694 ses->data_direction = scmd->sc_data_direction;
695 ses->sdb = scmd->sdb;
696 ses->next_rq = scmd->request->next_rq;
697 ses->result = scmd->result;
698 ses->underflow = scmd->underflow;
699 ses->prot_op = scmd->prot_op;
701 scmd->prot_op = SCSI_PROT_NORMAL;
702 scmd->cmnd = ses->eh_cmnd;
703 memset(scmd->cmnd, 0, BLK_MAX_CDB);
704 memset(&scmd->sdb, 0, sizeof(scmd->sdb));
705 scmd->request->next_rq = NULL;
708 scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE,
710 sg_init_one(&ses->sense_sgl, scmd->sense_buffer,
711 scmd->sdb.length);
712 scmd->sdb.table.sgl = &ses->sense_sgl;
713 scmd->sc_data_direction = DMA_FROM_DEVICE;
714 scmd->sdb.table.nents = 1;
715 scmd->cmnd[0] = REQUEST_SENSE;
716 scmd->cmnd[4] = scmd->sdb.length;
717 scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
719 scmd->sc_data_direction = DMA_NONE;
722 memcpy(scmd->cmnd, cmnd, cmnd_size);
723 scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
727 scmd->underflow = 0;
730 scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) |
737 memset(scmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
743 * @scmd: SCSI command structure to restore
748 void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
753 scmd->cmd_len = ses->cmd_len;
754 scmd->cmnd = ses->cmnd;
755 scmd->sc_data_direction = ses->data_direction;
756 scmd->sdb = ses->sdb;
757 scmd->request->next_rq = ses->next_rq;
758 scmd->result = ses->result;
759 scmd->underflow = ses->underflow;
760 scmd->prot_op = ses->prot_op;
766 * @scmd: SCSI command structure to hijack
778 static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
781 struct scsi_device *sdev = scmd->device;
782 struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd);
789 scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes);
792 scsi_log_send(scmd);
793 scmd->scsi_done = scsi_eh_done;
794 shost->hostt->queuecommand(shost, scmd);
800 scsi_log_completion(scmd, SUCCESS);
803 printk("%s: scmd: %p, timeleft: %ld\n",
804 __func__, scmd, timeleft));
813 rtn = scsi_eh_completed_normally(scmd);
832 scsi_abort_eh_cmnd(scmd);
836 scsi_eh_restore_cmnd(scmd, &ses);
839 rtn = sdrv->eh_action(scmd, cmnd, cmnd_size, rtn);
846 * @scmd: SCSI cmd for request sense.
853 static int scsi_request_sense(struct scsi_cmnd *scmd)
855 return scsi_send_eh_cmnd(scmd, NULL, 0, SENSE_TIMEOUT, ~0);
860 * @scmd: Original SCSI cmd that eh has finished.
870 void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q)
872 scmd->device->host->host_failed--;
873 scmd->eh_eflags = 0;
874 list_move_tail(&scmd->eh_entry, done_q);
901 struct scsi_cmnd *scmd, *next;
904 list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
905 if ((scmd->eh_eflags & SCSI_EH_CANCEL_CMD) ||
906 SCSI_SENSE_VALID(scmd))
909 SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd,
912 rtn = scsi_request_sense(scmd);
917 " result %x\n", scmd,
918 scmd->result));
919 SCSI_LOG_ERROR_RECOVERY(3, scsi_print_sense("bh", scmd));
921 rtn = scsi_decide_disposition(scmd);
932 scmd->retries = scmd->allowed;
936 scsi_eh_finish_cmd(scmd, done_q);
945 * @scmd: &scsi_cmnd to send TUR
950 static int scsi_eh_tur(struct scsi_cmnd *scmd)
956 rtn = scsi_send_eh_cmnd(scmd, tur_command, 6, SENSE_TIMEOUT, 0);
958 SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd %p rtn %x\n",
959 __func__, scmd, rtn));
990 struct scsi_cmnd *scmd, *next;
995 scmd = list_entry(cmd_list->next, struct scsi_cmnd, eh_entry);
996 sdev = scmd->device;
998 finish_cmds = !scsi_device_online(scmd->device) ||
999 (try_stu && !scsi_eh_try_stu(scmd) &&
1000 !scsi_eh_tur(scmd)) ||
1001 !scsi_eh_tur(scmd);
1003 list_for_each_entry_safe(scmd, next, cmd_list, eh_entry)
1004 if (scmd->device == sdev) {
1006 scsi_eh_finish_cmd(scmd, done_q);
1008 list_move_tail(&scmd->eh_entry, work_q);
1030 struct scsi_cmnd *scmd, *next;
1034 list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1035 if (!(scmd->eh_eflags & SCSI_EH_CANCEL_CMD))
1039 scmd));
1040 rtn = scsi_try_to_abort_cmd(scmd->device->host->hostt, scmd);
1042 scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD;
1044 scsi_eh_finish_cmd(scmd, done_q);
1046 list_move_tail(&scmd->eh_entry, &check_list);
1052 scmd));
1060 * @scmd: &scsi_cmnd to send START_UNIT
1065 static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
1069 if (scmd->device->allow_restart) {
1073 rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, scmd->device->request_queue->rq_timeout, 0);
1096 struct scsi_cmnd *scmd, *stu_scmd, *next;
1101 list_for_each_entry(scmd, work_q, eh_entry)
1102 if (scmd->device == sdev && SCSI_SENSE_VALID(scmd) &&
1103 scsi_check_sense(scmd) == FAILED ) {
1104 stu_scmd = scmd;
1117 list_for_each_entry_safe(scmd, next,
1119 if (scmd->device == sdev)
1120 scsi_eh_finish_cmd(scmd, done_q);
1150 struct scsi_cmnd *scmd, *bdr_scmd, *next;
1156 list_for_each_entry(scmd, work_q, eh_entry)
1157 if (scmd->device == sdev) {
1158 bdr_scmd = scmd;
1173 list_for_each_entry_safe(scmd, next,
1175 if (scmd->device == sdev)
1176 scsi_eh_finish_cmd(scmd,
1211 struct scsi_cmnd *next, *scmd;
1215 scmd = list_entry(tmp_list.next, struct scsi_cmnd, eh_entry);
1216 id = scmd_id(scmd);
1221 rtn = scsi_try_target_reset(scmd);
1227 list_for_each_entry_safe(scmd, next, &tmp_list, eh_entry) {
1228 if (scmd_id(scmd) != id)
1232 list_move_tail(&scmd->eh_entry, &check_list);
1234 scsi_eh_finish_cmd(scmd, done_q);
1237 list_move(&scmd->eh_entry, work_q);
1254 struct scsi_cmnd *scmd, *chan_scmd, *next;
1268 list_for_each_entry(scmd, work_q, eh_entry) {
1269 if (channel == scmd_channel(scmd)) {
1270 chan_scmd = scmd;
1286 list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1287 if (channel == scmd_channel(scmd)) {
1289 scsi_eh_finish_cmd(scmd,
1292 list_move_tail(&scmd->eh_entry,
1314 struct scsi_cmnd *scmd, *next;
1319 scmd = list_entry(work_q->next,
1325 rtn = scsi_try_host_reset(scmd);
1329 list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1330 scsi_eh_finish_cmd(scmd, done_q);
1349 struct scsi_cmnd *scmd, *next;
1351 list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1352 sdev_printk(KERN_INFO, scmd->device, "Device offlined - "
1354 scsi_device_set_state(scmd->device, SDEV_OFFLINE);
1355 if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) {
1360 scsi_eh_finish_cmd(scmd, done_q);
1367 * @scmd: SCSI cmd to examine.
1369 int scsi_noretry_cmd(struct scsi_cmnd *scmd)
1371 switch (host_byte(scmd->result)) {
1375 return (scmd->request->cmd_flags & REQ_FAILFAST_TRANSPORT);
1377 return (scmd->request->cmd_flags & REQ_FAILFAST_DEV);
1379 if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
1380 status_byte(scmd->result) == RESERVATION_CONFLICT)
1384 return (scmd->request->cmd_flags & REQ_FAILFAST_DRIVER);
1387 switch (status_byte(scmd->result)) {
1393 if (scmd->request->cmd_flags & REQ_FAILFAST_DEV ||
1394 scmd->request->cmd_type == REQ_TYPE_BLOCK_PC)
1403 * @scmd: SCSI cmd to examine.
1415 int scsi_decide_disposition(struct scsi_cmnd *scmd)
1423 if (!scsi_device_online(scmd->device)) {
1434 switch (host_byte(scmd->result)) {
1441 scmd->result &= 0xff00ffff;
1489 if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
1490 status_byte(scmd->result) == RESERVATION_CONFLICT)
1506 if ((scmd->cmnd[0] == TEST_UNIT_READY ||
1507 scmd->cmnd[0] == INQUIRY)) {
1521 if (msg_byte(scmd->result) != COMMAND_COMPLETE)
1527 switch (status_byte(scmd->result)) {
1529 scsi_handle_queue_full(scmd->device);
1543 scsi_handle_queue_ramp_up(scmd->device);
1549 rtn = scsi_check_sense(scmd);
1557 set_host_byte(scmd, DID_TARGET_FAILURE);
1575 sdev_printk(KERN_INFO, scmd->device,
1577 set_host_byte(scmd, DID_NEXUS_FAILURE);
1590 if ((++scmd->retries) <= scmd->allowed
1591 && !scsi_noretry_cmd(scmd)) {
1718 struct scsi_cmnd *scmd, *next;
1720 list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
1721 list_del_init(&scmd->eh_entry);
1722 if (scsi_device_online(scmd->device) &&
1723 !scsi_noretry_cmd(scmd) &&
1724 (++scmd->retries <= scmd->allowed)) {
1728 scmd));
1729 scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
1733 * scsi_eh_get_sense), scmd->result is already
1736 if (!scmd->result)
1737 scmd->result |= (DRIVER_TIMEOUT << 24);
1740 current->comm, scmd));
1741 scsi_finish_command(scmd);
1929 scsi_reset_provider_done_command(struct scsi_cmnd *scmd)
1949 struct scsi_cmnd *scmd;
1958 scmd = scsi_get_command(dev, GFP_KERNEL);
1960 scmd->request = &req;
1962 scmd->cmnd = req.cmd;
1964 scmd->scsi_done = scsi_reset_provider_done_command;
1965 memset(&scmd->sdb, 0, sizeof(scmd->sdb));
1967 scmd->cmd_len = 0;
1969 scmd->sc_data_direction = DMA_BIDIRECTIONAL;
1977 rtn = scsi_try_bus_device_reset(scmd);
1982 rtn = scsi_try_target_reset(scmd);
1987 rtn = scsi_try_bus_reset(scmd);
1992 rtn = scsi_try_host_reset(scmd);
2014 scsi_next_command(scmd);