Blame scsi.c

Packit Service 35c908
/*
Packit Service 35c908
 * Copyright (c) 2008, Intel Corporation.
Packit Service 35c908
 *
Packit Service 35c908
 * This program is free software; you can redistribute it and/or modify it
Packit Service 35c908
 * under the terms and conditions of the GNU Lesser General Public License,
Packit Service 35c908
 * version 2.1, as published by the Free Software Foundation.
Packit Service 35c908
 *
Packit Service 35c908
 * This program is distributed in the hope it will be useful, but WITHOUT
Packit Service 35c908
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit Service 35c908
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
Packit Service 35c908
 * for more details.
Packit Service 35c908
 *
Packit Service 35c908
 * You should have received a copy of the GNU Lesser General Public License
Packit Service 35c908
 * along with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service 35c908
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service 35c908
 *
Packit Service 35c908
 */
Packit Service 35c908
Packit Service 35c908
#include "utils.h"
Packit Service 35c908
#include "api_lib.h"
Packit Service 35c908
#include "adapt_impl.h"
Packit Service 35c908
#include "bind_impl.h"
Packit Service 35c908
#include "fc_scsi.h"
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Inquiry V1.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_inquiry_v1(HBA_HANDLE handle, HBA_WWN disc_wwpn, HBA_UINT64 fc_lun,
Packit Service 35c908
		    HBA_UINT8 evpd, HBA_UINT32 page_code, void *resp,
Packit Service 35c908
		    HBA_UINT32 resp_len, void *sense, HBA_UINT32 sense_len)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
	HBA_UINT8 stat;
Packit Service 35c908
	HBA_STATUS status;
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port(handle, 0);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_INVALID_HANDLE;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, fc_lun, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_LUN;
Packit Service 35c908
Packit Service 35c908
	status = sg_issue_inquiry(sg_name, evpd ? SCSI_INQF_EVPD : 0, page_code,
Packit Service 35c908
				resp, &resp_len, &stat, sense, &sense_len);
Packit Service 35c908
	if (status == HBA_STATUS_OK && stat == SCSI_ST_CHECK)
Packit Service 35c908
		status = HBA_STATUS_SCSI_CHECK_CONDITION;
Packit Service 35c908
Packit Service 35c908
	return status;
Packit Service 35c908
}
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Inquiry V2.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_inquiry_v2(HBA_HANDLE handle, HBA_WWN wwpn, HBA_WWN disc_wwpn,
Packit Service 35c908
		    HBA_UINT64 fc_lun, HBA_UINT8 cdb_byte1,
Packit Service 35c908
		    HBA_UINT8 cdb_byte2, void *resp, HBA_UINT32 *resp_lenp,
Packit Service 35c908
		    HBA_UINT8 *statp, void *sense, HBA_UINT32 *sense_lenp)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port_by_wwn(handle, wwpn, NULL);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_ILLEGAL_WWN;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, fc_lun, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_LUN;
Packit Service 35c908
Packit Service 35c908
	return sg_issue_inquiry(sg_name, cdb_byte1, cdb_byte2,
Packit Service 35c908
			       resp, resp_lenp, statp, sense, sense_lenp);
Packit Service 35c908
}
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Read capacity V1.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_read_capacity_v1(HBA_HANDLE handle, HBA_WWN disc_wwpn,
Packit Service 35c908
			  HBA_UINT64 fc_lun, void *resp,
Packit Service 35c908
			  HBA_UINT32 resp_len, void *sense,
Packit Service 35c908
			  HBA_UINT32 sense_len)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
	HBA_UINT8 stat;
Packit Service 35c908
	HBA_STATUS status;
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port(handle, 0);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_INVALID_HANDLE;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, fc_lun, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_LUN;
Packit Service 35c908
Packit Service 35c908
	status = sg_issue_read_capacity(sg_name, resp, &resp_len,
Packit Service 35c908
				 &stat, sense, &sense_len);
Packit Service 35c908
	if (status == HBA_STATUS_OK && stat == SCSI_ST_CHECK)
Packit Service 35c908
		status = HBA_STATUS_SCSI_CHECK_CONDITION;
Packit Service 35c908
Packit Service 35c908
	return status;
Packit Service 35c908
}
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Read capacity V2.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_read_capacity_v2(HBA_HANDLE handle, HBA_WWN wwpn,
Packit Service 35c908
			  HBA_WWN disc_wwpn, HBA_UINT64 fc_lun,
Packit Service 35c908
			  void *resp, HBA_UINT32 *resp_lenp,
Packit Service 35c908
			  HBA_UINT8 *statp, void *sense,
Packit Service 35c908
			  HBA_UINT32 *sense_lenp)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port_by_wwn(handle, wwpn, NULL);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_ILLEGAL_WWN;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, fc_lun, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_LUN;
Packit Service 35c908
Packit Service 35c908
	return sg_issue_read_capacity(sg_name, resp, resp_lenp,
Packit Service 35c908
				statp, sense, sense_lenp);
Packit Service 35c908
}
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Report LUNS V1.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_report_luns_v1(HBA_HANDLE handle, HBA_WWN disc_wwpn,
Packit Service 35c908
			void *resp, HBA_UINT32 resp_len,
Packit Service 35c908
			void *sense, HBA_UINT32 sense_len)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
	HBA_UINT8 stat;
Packit Service 35c908
	HBA_STATUS status;
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port(handle, 0);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_INVALID_HANDLE;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, 0, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_PORT_WWN;
Packit Service 35c908
Packit Service 35c908
	status = sg_issue_report_luns(sg_name, resp, &resp_len,
Packit Service 35c908
				    &stat, sense, &sense_len);
Packit Service 35c908
	if (status == HBA_STATUS_OK && stat == SCSI_ST_CHECK)
Packit Service 35c908
		status = HBA_STATUS_SCSI_CHECK_CONDITION;
Packit Service 35c908
Packit Service 35c908
	return status;
Packit Service 35c908
}
Packit Service 35c908
Packit Service 35c908
/*
Packit Service 35c908
 * Report LUNS V2.
Packit Service 35c908
 */
Packit Service 35c908
HBA_STATUS
Packit Service 35c908
scsi_report_luns_v2(HBA_HANDLE handle, HBA_WWN wwpn,
Packit Service 35c908
			HBA_WWN disc_wwpn, void *resp,
Packit Service 35c908
			HBA_UINT32 *resp_lenp, HBA_UINT8 *statp,
Packit Service 35c908
			void *sense, HBA_UINT32 *sense_lenp)
Packit Service 35c908
{
Packit Service 35c908
	struct port_info *pp;
Packit Service 35c908
	char sg_name[50];
Packit Service 35c908
Packit Service 35c908
	/*
Packit Service 35c908
	 * Find port.
Packit Service 35c908
	 */
Packit Service 35c908
	pp = adapter_get_port_by_wwn(handle, wwpn, NULL);
Packit Service 35c908
	if (pp == NULL)
Packit Service 35c908
		return HBA_STATUS_ERROR_ILLEGAL_WWN;
Packit Service 35c908
Packit Service 35c908
	if (get_binding_sg_name(
Packit Service 35c908
	    pp, disc_wwpn, 0, sg_name, sizeof(sg_name)) != 0)
Packit Service 35c908
		return HBA_STATUS_ERROR_TARGET_PORT_WWN;
Packit Service 35c908
Packit Service 35c908
	return sg_issue_report_luns(sg_name, resp, resp_lenp,
Packit Service 35c908
				  statp, sense, sense_lenp);
Packit Service 35c908
}
Packit Service 35c908