/*
* Copyright (c) 2008, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#ifndef _ADAPT_IMPL_H_
#define _ADAPT_IMPL_H_
#define SYSFS_HOST_DIR "/sys/class/fc_host"
#define SYSFS_HBA_DIR "/sys/class/net"
#define SYSFS_LUN_DIR "/sys/class/scsi_device"
#define SYSFS_MODULE "/driver/module"
#define SYSFS_MODULE_VER "driver/module/version"
#define SYSFS_RPORT_ROOT "/sys/class/fc_remote_ports"
#define SYSFS_RPORT_DIR "rport-%u:%u-%u" /* host, chan, rport */
struct hba_info {
u_int32_t domain;
u_int32_t bus;
u_int32_t dev;
u_int32_t func;
u_int32_t vendor_id;
u_int32_t subsystem_vendor_id;
u_int32_t subsystem_device_id;
u_int32_t device_id;
u_int32_t device_class;
u_int32_t irq;
char Manufacturer[64];
char SerialNumber[64];
char Model[256];
char ModelDescription[256];
char HardwareVersion[256];
char OptionROMVersion[256];
char FirmwareVersion[256];
u_int32_t VendorSpecificID;
u_int32_t NumberOfPorts;
};
#define MAX_DRIVER_NAME_LEN 20
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
HBA_STATUS sysfs_get_port_stats(char *dir, HBA_PORTSTATISTICS *sp);
HBA_STATUS sysfs_get_port_fc4stats(char *dir, HBA_FC4STATISTICS *fc4sp);
extern struct sa_nameval port_states_table[];
extern struct sa_nameval port_speeds_table[];
extern void adapter_scan(void);
extern int sys_read_wwn(const char *, const char *, HBA_WWN *);
extern HBA_STATUS find_pci_device(struct hba_info *);
/*
* per-adapter interface.
*/
/*
* Information about a particular adapter.
*/
struct adapter_info {
u_int32_t ad_index; /* adapter's library index */
u_int32_t ad_kern_index; /* adapter's kernel index */
const char *ad_name; /* adapter driver name */
struct sa_table ad_ports; /* table of ports */
u_int32_t ad_port_count; /* adapter's number of ports */
HBA_ADAPTERATTRIBUTES ad_attr; /* HBA-API attributes */
};
/*
* Information about a port on an adapter or a discovered remote port.
*/
struct port_info {
struct adapter_info *ap_adapt;
u_int32_t ap_index;
u_int32_t ap_disc_index; /* discovered port index */
u_int32_t ap_scsi_target; /* SCSI target index (rports) */
u_int32_t ap_kern_hba; /* kernel HBA index (rports) */
struct sa_table ap_rports; /* discovered ports */
HBA_PORTATTRIBUTES ap_attr; /* HBA-API port attributes */
char host_dir[80]; /* sysfs directory save area */
};
/*
* Internal functions.
*/
HBA_UINT32 adapter_get_count(void);
HBA_STATUS adapter_get_name(HBA_UINT32 index, char *);
struct port_info *adapter_get_port_by_wwn(HBA_HANDLE, HBA_WWN, int *countp);
HBA_STATUS adapter_create(struct adapter_info *);
void adapter_destroy(struct adapter_info *);
void adapter_destroy_all(void);
struct adapter_info *adapter_open_handle(HBA_HANDLE);
struct port_info *adapter_get_port(HBA_HANDLE, HBA_UINT32 port);
struct port_info *adapter_get_rport(HBA_HANDLE, HBA_UINT32, HBA_UINT32);
struct port_info *adapter_get_rport_n(HBA_HANDLE, HBA_UINT32, HBA_UINT32);
struct port_info *adapter_get_rport_target(HBA_HANDLE, HBA_UINT32, HBA_UINT32);
struct port_info *adapter_get_rport_by_wwn(struct port_info *, HBA_WWN);
struct port_info *adapter_get_rport_by_fcid(struct port_info *, fc_fid_t);
void get_rport_info(struct port_info *);
void sg_get_dev_id(const char *name, char *buf, size_t result_len);
void copy_wwn(HBA_WWN *dest, fc_wwn_t src);
int is_wwn_nonzero(HBA_WWN *wwn);
HBA_STATUS sg_issue_read_capacity(const char *, void *, HBA_UINT32 *,
HBA_UINT8 *, void *, HBA_UINT32 *);
HBA_STATUS sg_issue_report_luns(const char *, void *, HBA_UINT32 *,
HBA_UINT8 *, void *, HBA_UINT32 *);
/*
* Library functions.
*/
HBA_HANDLE adapter_open(char *name);
HBA_STATUS adapter_open_by_wwn(HBA_HANDLE *, HBA_WWN);
void adapter_close(HBA_HANDLE);
HBA_STATUS adapter_get_attr(HBA_HANDLE, HBA_ADAPTERATTRIBUTES *);
HBA_STATUS adapter_get_port_attr(HBA_HANDLE, HBA_UINT32 port,
HBA_PORTATTRIBUTES *);
HBA_STATUS adapter_get_port_attr_by_wwn(HBA_HANDLE, HBA_WWN,
HBA_PORTATTRIBUTES *);
HBA_STATUS adapter_get_rport_attr(HBA_HANDLE, HBA_UINT32 port,
HBA_UINT32 rport, HBA_PORTATTRIBUTES *);
HBA_STATUS get_port_statistics(HBA_HANDLE, HBA_UINT32 port,
HBA_PORTSTATISTICS *);
HBA_STATUS get_port_fc4_statistics(HBA_HANDLE, HBA_WWN,
HBA_UINT8 fc4_type, HBA_FC4STATISTICS *);
HBA_STATUS scsi_read_capacity_v1(HBA_HANDLE, HBA_WWN, HBA_UINT64,
void *, HBA_UINT32, void *, HBA_UINT32);
HBA_STATUS scsi_read_capacity_v2(HBA_HANDLE, HBA_WWN, HBA_WWN,
HBA_UINT64, void *, HBA_UINT32 *, HBA_UINT8 *,
void *, HBA_UINT32 *);
HBA_STATUS scsi_inquiry_v1(HBA_HANDLE, HBA_WWN, HBA_UINT64, HBA_UINT8,
HBA_UINT32, void *, HBA_UINT32, void *, HBA_UINT32);
HBA_STATUS scsi_inquiry_v2(HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT64,
HBA_UINT8, HBA_UINT8, void *, HBA_UINT32 *,
HBA_UINT8 *, void *, HBA_UINT32 *);
HBA_STATUS scsi_report_luns_v1(HBA_HANDLE, HBA_WWN,
void *, HBA_UINT32, void *, HBA_UINT32);
HBA_STATUS scsi_report_luns_v2(HBA_HANDLE, HBA_WWN, HBA_WWN,
void *, HBA_UINT32 *, HBA_UINT8 *,
void *, HBA_UINT32 *);
HBA_STATUS sg_issue_inquiry(const char *, HBA_UINT8, HBA_UINT8,
void *, HBA_UINT32 *, HBA_UINT8 *, void *, HBA_UINT32 *);
int adapter_init(void);
void adapter_shutdown(void);
/* struct port_stats; */
#endif /* _ADAPT_IMPL_H_ */