|
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 |
|