static int clariion_send_inquiry(struct scsi_device *sdev, struct clariion_dh_data *csdev) { int err, retry = CLARIION_RETRIES; retry: err = send_inquiry_cmd(sdev, 0xC0, csdev); if (err != SCSI_DH_OK && csdev->senselen) { struct scsi_sense_hdr sshdr; err = scsi_normalize_sense(csdev->sense, SCSI_SENSE_BUFFERSIZE, &sshdr); if (!err) return SCSI_DH_IO; err = clariion_check_sense(sdev, &sshdr); if (retry > 0 && err == ADD_TO_MLQUEUE) { retry--; goto retry; } sdev_printk(KERN_ERR, sdev, "%s: INQUIRY sense code " "%02x/%02x/%02x\n", CLARIION_NAME, sshdr.sense_key, sshdr.asc, sshdr.ascq); err = SCSI_DH_IO; } else { err = parse_sp_info_reply(sdev, csdev); } return err; }
static int sp_info_endio(struct scsi_device *sdev, int result, int mode_select_sent, int *done) { struct clariion_dh_data *csdev = get_clariion_data(sdev); int err_flags, default_sp, current_sp, new_current_sp; err_flags = parse_sp_info_reply(sdev, result, &default_sp, ¤t_sp, &new_current_sp); if (err_flags != SCSI_DH_OK) goto done; if (mode_select_sent) { csdev->default_sp = default_sp; csdev->current_sp = current_sp; } else { /* * Issue the actual module_selec request IFF either * (1) we do not know the identity of the current SP OR * (2) what we think we know is actually correct. */ if ((current_sp != CLARIION_UNBOUND_LU) && (new_current_sp != current_sp)) { csdev->default_sp = default_sp; csdev->current_sp = current_sp; sdev_printk(KERN_INFO, sdev, "Ignoring path group " "switch-over command for CLARiiON SP%s since " " mapped device is already initialized.", current_sp ? "B" : "A"); if (done) *done = 1; /* as good as doing it */ } } done: return err_flags; }