Beispiel #1
0
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;
}
Beispiel #2
0
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,
					     &current_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;
}