/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at * http://www.opensource.org/licenses/cddl1.txt. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2004-2012 Emulex. All rights reserved. * Use is subject to license terms. */ #ifndef _EMLXS_FCIO_H #define _EMLXS_FCIO_H #ifdef __cplusplus extern "C" { #endif /* * FCIO_REV: 1 - Initial implementation 2 - Added EMLXS_GET_FCIO_REV support */ #define FCIO_REV 2 /* Emulex ULP Diag Codes */ #define EMLXS_DIAG ('E'<< 8) #define EMLXS_DIAG_BIU (EMLXS_DIAG | 100) #define EMLXS_DIAG_POST (EMLXS_DIAG | 101) #define EMLXS_DIAG_ECHO (EMLXS_DIAG | 102) #define EMLXS_PARM_GET_NUM (EMLXS_DIAG | 200) #define EMLXS_PARM_GET_LIST (EMLXS_DIAG | 201) #define EMLXS_PARM_GET (EMLXS_DIAG | 202) #define EMLXS_PARM_SET (EMLXS_DIAG | 203) #define EMLXS_GET_BOOT_REV (EMLXS_DIAG | 204) #define EMLXS_DOWNLOAD_BOOT (EMLXS_DIAG | 205) #define EMLXS_DOWNLOAD_CFL (EMLXS_DIAG | 206) #define EMLXS_VPD_GET (EMLXS_DIAG | 207) #define EMLXS_GET_FCIO_REV (EMLXS_DIAG | 208) #define EMLXS_SET_BOOT_STATE_old (EMLXS_DIAG | 209) #define EMLXS_GET_BOOT_STATE_old (EMLXS_DIAG | 210) #define EMLXS_DFC_COMMAND (EMLXS_DIAG | 211) #define EMLXS_SET_BOOT_STATE (EMLXS_DIAG | 212) #define EMLXS_GET_BOOT_STATE (EMLXS_DIAG | 213) #define EMLXS_GET_DFC_REV (EMLXS_DIAG | 214) #define EMLXS_PHY_GET (EMLXS_DIAG | 215) #define EMLXS_SET_THROTTLE (EMLXS_DIAG | 216) #define EMLXS_GET_THROTTLE (EMLXS_DIAG | 217) #define EMLXS_VPD_GET_V2 (EMLXS_DIAG | 218) #define EMLXS_BAR_IO (EMLXS_DIAG | 253) #define EMLXS_TEST_CODE (EMLXS_DIAG | 254) #define EMLXS_HW_ERROR_TEST (EMLXS_DIAG | 255) #define EMLXS_MB_TIMEOUT_TEST (EMLXS_DIAG | 256) #define EMLXS_LOG_GET (EMLXS_DIAG | 300) /* DUMP file ids */ #define EMLXS_TXT_FILE_ID 1 #define EMLXS_DMP_FILE_ID 2 #define EMLXS_CEE_FILE_ID 3 #define EMLXS_FAT_FILE_ID 4 /* Emulex specific error codes */ #define EMLXS_ERRNO_START 0x100 #define EMLXS_TEST_FAILED (EMLXS_ERRNO_START + 0) /* Diagnostic */ /* test fail */ #define EMLXS_IMAGE_BAD (EMLXS_ERRNO_START + 1) /* Image has */ /* bad data */ #define EMLXS_IMAGE_INCOMPATIBLE (EMLXS_ERRNO_START + 2) /* Image not */ /* compatible */ /* with H/W */ #define EMLXS_IMAGE_FAILED (EMLXS_ERRNO_START + 3) /* Image */ /* download */ /* failed */ #define EMLXS_OFFLINE_FAILED (EMLXS_ERRNO_START + 4) /* Unable to */ /* take HBA */ /* offline */ #define EMLXS_NO_BOOT_CODE (EMLXS_ERRNO_START + 5) /* No boot */ /* code image */ #define EMLXS_OP_NOT_SUP (EMLXS_ERRNO_START + 6) /* Operation */ /* not supp */ #define EMLXS_REBOOT_REQUIRED (EMLXS_ERRNO_START + 7) /* Reboot */ /* required */ #define EMLXS_ERRNO_END (EMLXS_ERRNO_START + 7) typedef struct emlxs_parm { char label[32]; uint32_t min; uint32_t max; uint32_t def; uint32_t current; uint32_t flags; char help[128]; } emlxs_parm_t; /* emlxs_parm_t flags */ #define PARM_DYNAMIC 0x00000001 /* Reboot not required */ #define PARM_BOOLEAN 0x00000002 #define PARM_HEX 0x00000004 /* PARM_DYNAMIC subtypes */ #define PARM_DYNAMIC_RESET (PARM_DYNAMIC | 0x00000010) /* Hard reset */ /* required */ #define PARM_DYNAMIC_LINK (PARM_DYNAMIC | 0x00000020) /* Link reset */ /* required */ typedef struct emlxs_vpd_desc { char id[80]; char part_num[32]; char eng_change[32]; char manufacturer[80]; char serial_num[32]; char model[32]; char model_desc[80]; char port_num[4]; char prog_types[80]; } emlxs_vpd_desc_t; typedef struct emlxs_vpd_desc_v2 { char id[256]; char part_num[256]; char eng_change[256]; char manufacturer[256]; char serial_num[256]; char model[256]; char model_desc[256]; char port_num[256]; char prog_types[256]; } emlxs_vpd_desc_v2_t; typedef struct emlxs_phy_desc { uint32_t phy_type; uint32_t interface_type; uint32_t misc_params; uint32_t rsvd[4]; } emlxs_phy_desc_t; typedef struct emlxs_throttle_desc { uint8_t wwpn[8]; uint32_t throttle; } emlxs_throttle_desc_t; typedef struct emlxs_log_req { uint32_t first; /* First msg id requested */ uint32_t count; /* Maximum number of messages */ /* capable of receiving */ /* This value can be set to zero */ /* to receive just log stats */ } emlxs_log_req_t; typedef struct emlxs_log_resp { uint32_t first; /* Actual starting msg id in resp buffer */ /* This represents the first available */ /* msg id >= first id requested */ uint32_t last; /* Current last msg id in log file */ uint32_t count; /* Total number of messages in resp buffer */ /* This value will be <= the max count */ /* requested */ /* If count > 0, then the response buffer */ /* will immediately follow this structure */ /* The response buffer will be an array of */ /* string buffers MAX_MSG_LENGTH in size */ #define MAX_LOG_MSG_LENGTH 160 } emlxs_log_resp_t; typedef struct FCIO_EQ_DESC { uint32_t host_index; uint32_t max_index; uint32_t qid; uint32_t msix_vector; uint32_t phys; /* specifies physical buffer pointer */ uint32_t virt; /* specifies virtual buffer pointer */ uint32_t virt_hi; /* specifies virtual buffer pointer */ /* Statistics */ uint32_t max_proc; uint32_t isr_count; uint32_t num_proc; } FCIO_EQ_DESC_t; typedef struct FCIO_CQ_DESC { uint32_t host_index; uint32_t max_index; uint32_t qid; uint32_t eqid; uint32_t type; uint32_t phys; /* specifies physical buffer pointer */ uint32_t virt; /* specifies virtual buffer pointer */ uint32_t virt_hi; /* specifies virtual buffer pointer */ /* Statistics */ uint32_t max_proc; uint32_t isr_count; uint32_t num_proc; uint32_t rsvd; } FCIO_CQ_DESC_t; typedef struct FCIO_WQ_DESC { uint32_t host_index; uint32_t max_index; uint32_t port_index; uint32_t release_depth; uint32_t qid; uint32_t cqid; uint32_t phys; /* specifies physical buffer pointer */ uint32_t virt; /* specifies virtual buffer pointer */ uint32_t virt_hi; /* specifies virtual buffer pointer */ /* Statistics */ uint32_t num_proc; uint32_t num_busy; uint32_t rsvd; } FCIO_WQ_DESC_t; typedef struct FCIO_RQ_DESC { uint32_t host_index; uint32_t max_index; uint32_t qid; uint32_t cqid; uint32_t phys; /* specifies physical buffer pointer */ uint32_t virt; /* specifies virtual buffer pointer */ uint32_t virt_hi; /* specifies virtual buffer pointer */ /* Statistics */ uint32_t num_proc; } FCIO_RQ_DESC_t; #define FCIO_MSI_MAX_INTRS 8 #define FCIO_MAX_WQS_PER_EQ 4 #define FCIO_MAX_EQS FCIO_MSI_MAX_INTRS #define FCIO_MAX_WQS FCIO_MAX_WQS_PER_EQ * FCIO_MAX_EQS #define FCIO_MAX_RQS 2 /* ONLY 1 pair is allowed */ /* One CQ for each WQ & (RQ pair) plus one for the MQ */ #define FCIO_MAX_CQS (FCIO_MAX_WQS + (FCIO_MAX_RQS/2) + 1) typedef struct FCIO_Q_STAT { FCIO_EQ_DESC_t eq[FCIO_MAX_EQS]; FCIO_CQ_DESC_t cq[FCIO_MAX_CQS]; FCIO_WQ_DESC_t wq[FCIO_MAX_WQS]; FCIO_RQ_DESC_t rq[FCIO_MAX_RQS]; uint32_t que_start_timer; uint32_t que_current_timer; uint32_t intr_count; } FCIO_Q_STAT_t; #ifdef __cplusplus } #endif #endif /* _EMLXS_FCIO_H */