1*06e79492SKenneth D. Merry /*- 2*06e79492SKenneth D. Merry * Copyright (c) 2010 Spectra Logic Corporation 3*06e79492SKenneth D. Merry * All rights reserved. 4*06e79492SKenneth D. Merry * 5*06e79492SKenneth D. Merry * Redistribution and use in source and binary forms, with or without 6*06e79492SKenneth D. Merry * modification, are permitted provided that the following conditions 7*06e79492SKenneth D. Merry * are met: 8*06e79492SKenneth D. Merry * 1. Redistributions of source code must retain the above copyright 9*06e79492SKenneth D. Merry * notice, this list of conditions, and the following disclaimer, 10*06e79492SKenneth D. Merry * without modification. 11*06e79492SKenneth D. Merry * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12*06e79492SKenneth D. Merry * substantially similar to the "NO WARRANTY" disclaimer below 13*06e79492SKenneth D. Merry * ("Disclaimer") and any redistribution must be conditioned upon 14*06e79492SKenneth D. Merry * including a substantially similar Disclaimer requirement for further 15*06e79492SKenneth D. Merry * binary redistribution. 16*06e79492SKenneth D. Merry * 17*06e79492SKenneth D. Merry * NO WARRANTY 18*06e79492SKenneth D. Merry * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*06e79492SKenneth D. Merry * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*06e79492SKenneth D. Merry * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21*06e79492SKenneth D. Merry * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*06e79492SKenneth D. Merry * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*06e79492SKenneth D. Merry * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*06e79492SKenneth D. Merry * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*06e79492SKenneth D. Merry * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26*06e79492SKenneth D. Merry * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27*06e79492SKenneth D. Merry * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*06e79492SKenneth D. Merry * POSSIBILITY OF SUCH DAMAGES. 29*06e79492SKenneth D. Merry * 30*06e79492SKenneth D. Merry * $Id: //depot/users/kenm/FreeBSD-test/sys/cam/scsi/smp_all.h#4 $ 31*06e79492SKenneth D. Merry * $FreeBSD$ 32*06e79492SKenneth D. Merry */ 33*06e79492SKenneth D. Merry 34*06e79492SKenneth D. Merry /* 35*06e79492SKenneth D. Merry * Serial Management Protocol definitions. 36*06e79492SKenneth D. Merry */ 37*06e79492SKenneth D. Merry 38*06e79492SKenneth D. Merry #ifndef _SCSI_SMP_ALL_H 39*06e79492SKenneth D. Merry #define _SCSI_SMP_ALL_H 1 40*06e79492SKenneth D. Merry 41*06e79492SKenneth D. Merry #define SMP_FRAME_TYPE_REQUEST 0x40 42*06e79492SKenneth D. Merry #define SMP_FRAME_TYPE_RESPONSE 0x41 43*06e79492SKenneth D. Merry #define SMP_WORD_LEN 4 44*06e79492SKenneth D. Merry #define SMP_CRC_LEN 4 45*06e79492SKenneth D. Merry 46*06e79492SKenneth D. Merry /* 47*06e79492SKenneth D. Merry * SMP Functions (current as of SPL Revision 7) 48*06e79492SKenneth D. Merry */ 49*06e79492SKenneth D. Merry /* 0x00 to 0x7f: SMP input functions */ 50*06e79492SKenneth D. Merry /* 0x00 to 0x0f: General SMP input functions */ 51*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_GENERAL 0x00 52*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_MANUF_INFO 0x01 53*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_SC_STATUS 0x03 54*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_ZONE_PERM_TBL 0x04 55*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_ZONE_MAN_PWD 0x05 56*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_BROADCAST 0x06 57*06e79492SKenneth D. Merry 58*06e79492SKenneth D. Merry /* 0x10 to 0x1f: Phy-based SMP input functions */ 59*06e79492SKenneth D. Merry #define SMP_FUNC_DISCOVER 0x10 60*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_PHY_ERR_LOG 0x11 61*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_PHY_SATA 0x12 62*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_ROUTE_INFO 0x13 63*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_PHY_EVENT 0x14 64*06e79492SKenneth D. Merry 65*06e79492SKenneth D. Merry /* 0x20 to 0x2f: Descriptor list-based SMP input functions */ 66*06e79492SKenneth D. Merry #define SMP_FUNC_DISCOVER_LIST 0x20 67*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_PHY_EVENT_LIST 0x21 68*06e79492SKenneth D. Merry #define SMP_FUNC_REPORT_EXP_RTL 0x22 69*06e79492SKenneth D. Merry 70*06e79492SKenneth D. Merry /* 0x30 to 0x3f: Reserved for SMP input functions */ 71*06e79492SKenneth D. Merry /* 0x40 to 0x7f: Vendor specific */ 72*06e79492SKenneth D. Merry 73*06e79492SKenneth D. Merry /* 0x80 to 0xff: SMP output functions */ 74*06e79492SKenneth D. Merry /* 0x80 to 0x8f: General SMP output functions */ 75*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_GENERAL 0x80 76*06e79492SKenneth D. Merry #define SMP_FUNC_ENABLE_DISABLE_ZONING 0x81 77*06e79492SKenneth D. Merry #define SMP_FUNC_ZONED_BROADCAST 0x85 78*06e79492SKenneth D. Merry #define SMP_FUNC_ZONE_LOCK 0x86 79*06e79492SKenneth D. Merry #define SMP_FUNC_ZONE_ACTIVATE 0x87 80*06e79492SKenneth D. Merry #define SMP_FUNC_ZONE_UNLOCK 0x88 81*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_ZM_PWD 0x89 82*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_ZONE_PHY_INFO 0x8a 83*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_ZONE_PERM_TBL 0x8b 84*06e79492SKenneth D. Merry 85*06e79492SKenneth D. Merry /* 0x90 to 0x9f: Phy-based SMP output functions */ 86*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_ROUTE_INFO 0x90 87*06e79492SKenneth D. Merry #define SMP_FUNC_PHY_CONTROL 0x91 88*06e79492SKenneth D. Merry #define SMP_FUNC_PHY_TEST_FUNC 0x92 89*06e79492SKenneth D. Merry #define SMP_FUNC_CONFIG_PHY_EVENT 0x93 90*06e79492SKenneth D. Merry 91*06e79492SKenneth D. Merry /* 0xa0 to 0xbf: Reserved for SMP output functions */ 92*06e79492SKenneth D. Merry /* 0xc0 to 0xff: Vendor specific */ 93*06e79492SKenneth D. Merry 94*06e79492SKenneth D. Merry /* 95*06e79492SKenneth D. Merry * Function Results (current as of SPL Revision 7) 96*06e79492SKenneth D. Merry */ 97*06e79492SKenneth D. Merry #define SMP_FR_ACCEPTED 0x00 98*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_FUNC 0x01 99*06e79492SKenneth D. Merry #define SMP_FR_FUNCTION_FAILED 0x02 100*06e79492SKenneth D. Merry #define SMP_FR_INVALID_REQ_FRAME_LEN 0x03 101*06e79492SKenneth D. Merry #define SMP_FR_INVALID_EXP_CHG_CNT 0x04 102*06e79492SKenneth D. Merry #define SMP_FR_BUSY 0x05 103*06e79492SKenneth D. Merry #define SMP_FR_INCOMPLETE_DESC_LIST 0x06 104*06e79492SKenneth D. Merry #define SMP_FR_PHY_DOES_NOT_EXIST 0x10 105*06e79492SKenneth D. Merry #define SMP_FR_INDEX_DOES_NOT_EXIST 0x11 106*06e79492SKenneth D. Merry #define SMP_FR_PHY_DOES_NOT_SUP_SATA 0x12 107*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_PHY_OP 0x13 108*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_PHY_TEST_FUNC 0x14 109*06e79492SKenneth D. Merry #define SMP_FR_PHY_TEST_FUNC_INPROG 0x15 110*06e79492SKenneth D. Merry #define SMP_FR_PHY_VACANT 0x16 111*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_PHY_EVENT_SRC 0x17 112*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_DESC_TYPE 0x18 113*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_PHY_FILTER 0x19 114*06e79492SKenneth D. Merry #define SMP_FR_AFFILIATION_VIOLATION 0x1a 115*06e79492SKenneth D. Merry #define SMP_FR_SMP_ZONE_VIOLATION 0x20 116*06e79492SKenneth D. Merry #define SMP_FR_NO_MGMT_ACCESS_RIGHTS 0x21 117*06e79492SKenneth D. Merry #define SMP_FR_UNKNOWN_ED_ZONING_VAL 0x22 118*06e79492SKenneth D. Merry #define SMP_FR_ZONE_LOCK_VIOLATION 0x23 119*06e79492SKenneth D. Merry #define SMP_FR_NOT_ACTIVATED 0x24 120*06e79492SKenneth D. Merry #define SMP_FR_ZG_OUT_OF_RANGE 0x25 121*06e79492SKenneth D. Merry #define SMP_FR_NO_PHYS_PRESENCE 0x26 122*06e79492SKenneth D. Merry #define SMP_FR_SAVING_NOT_SUP 0x27 123*06e79492SKenneth D. Merry #define SMP_FR_SRC_ZONE_DNE 0x28 124*06e79492SKenneth D. Merry #define SMP_FR_DISABLED_PWD_NOT_SUP 0x29 125*06e79492SKenneth D. Merry 126*06e79492SKenneth D. Merry /* 127*06e79492SKenneth D. Merry * REPORT GENERAL request and response, current as of SPL Revision 7. 128*06e79492SKenneth D. Merry */ 129*06e79492SKenneth D. Merry struct smp_report_general_request 130*06e79492SKenneth D. Merry { 131*06e79492SKenneth D. Merry uint8_t frame_type; 132*06e79492SKenneth D. Merry uint8_t function; 133*06e79492SKenneth D. Merry uint8_t response_len; 134*06e79492SKenneth D. Merry uint8_t request_len; 135*06e79492SKenneth D. Merry uint8_t crc[4]; 136*06e79492SKenneth D. Merry }; 137*06e79492SKenneth D. Merry 138*06e79492SKenneth D. Merry struct smp_report_general_response 139*06e79492SKenneth D. Merry { 140*06e79492SKenneth D. Merry uint8_t frame_type; 141*06e79492SKenneth D. Merry uint8_t function; 142*06e79492SKenneth D. Merry uint8_t function_result; 143*06e79492SKenneth D. Merry uint8_t response_len; 144*06e79492SKenneth D. Merry #define SMP_RG_RESPONSE_LEN 0x11 145*06e79492SKenneth D. Merry uint8_t expander_change_count[2]; 146*06e79492SKenneth D. Merry uint8_t expander_route_indexes[2]; 147*06e79492SKenneth D. Merry uint8_t long_response; 148*06e79492SKenneth D. Merry #define SMP_RG_LONG_RESPONSE 0x80 149*06e79492SKenneth D. Merry uint8_t num_phys; 150*06e79492SKenneth D. Merry uint8_t config_bits0; 151*06e79492SKenneth D. Merry #define SMP_RG_TABLE_TO_TABLE_SUP 0x80 152*06e79492SKenneth D. Merry #define SMP_RG_ZONE_CONFIGURING 0x40 153*06e79492SKenneth D. Merry #define SMP_RG_SELF_CONFIGURING 0x20 154*06e79492SKenneth D. Merry #define SMP_RG_STP_CONTINUE_AWT 0x10 155*06e79492SKenneth D. Merry #define SMP_RG_OPEN_REJECT_RETRY_SUP 0x08 156*06e79492SKenneth D. Merry #define SMP_RG_CONFIGURES_OTHERS 0x04 157*06e79492SKenneth D. Merry #define SMP_RG_CONFIGURING 0x02 158*06e79492SKenneth D. Merry #define SMP_RG_EXT_CONFIG_ROUTE_TABLE 0x01 159*06e79492SKenneth D. Merry uint8_t reserved0; 160*06e79492SKenneth D. Merry uint8_t encl_logical_id[8]; 161*06e79492SKenneth D. Merry uint8_t reserved1[8]; 162*06e79492SKenneth D. Merry uint8_t reserved2[2]; 163*06e79492SKenneth D. Merry uint8_t stp_bus_inact_time_limit[2]; 164*06e79492SKenneth D. Merry uint8_t stp_max_conn_time_limit[2]; 165*06e79492SKenneth D. Merry uint8_t stp_smp_it_nexus_loss_time[2]; 166*06e79492SKenneth D. Merry uint8_t config_bits1; 167*06e79492SKenneth D. Merry #define SMP_RG_NUM_ZONE_GROUPS_MASK 0xc0 168*06e79492SKenneth D. Merry #define SMP_RG_NUM_ZONE_GROUPS_SHIFT 6 169*06e79492SKenneth D. Merry #define SMP_RG_ZONE_LOCKED 0x10 170*06e79492SKenneth D. Merry #define SMP_RG_PP_SUPPORTED 0x08 171*06e79492SKenneth D. Merry #define SMP_RG_PP_ASSERTED 0x04 172*06e79492SKenneth D. Merry #define SMP_RG_ZONING_SUPPORTED 0x02 173*06e79492SKenneth D. Merry #define SMP_RG_ZONING_ENABLED 0x01 174*06e79492SKenneth D. Merry uint8_t config_bits2; 175*06e79492SKenneth D. Merry #define SMP_RG_SAVING 0x10 176*06e79492SKenneth D. Merry #define SMP_RG_SAVING_ZM_PWD_SUP 0x08 177*06e79492SKenneth D. Merry #define SMP_RG_SAVING_PHY_INFO_SUP 0x04 178*06e79492SKenneth D. Merry #define SMP_RG_SAVING_ZPERM_TAB_SUP 0x02 179*06e79492SKenneth D. Merry #define SMP_RG_SAVING_ZENABLED_SUP 0x01 180*06e79492SKenneth D. Merry uint8_t max_num_routed_addrs[2]; 181*06e79492SKenneth D. Merry uint8_t active_zm_address[8]; 182*06e79492SKenneth D. Merry uint8_t zone_lock_inact_time_limit[2]; 183*06e79492SKenneth D. Merry uint8_t reserved3[2]; 184*06e79492SKenneth D. Merry uint8_t reserved4; 185*06e79492SKenneth D. Merry uint8_t first_encl_conn_el_index; 186*06e79492SKenneth D. Merry uint8_t num_encl_conn_el_indexes; 187*06e79492SKenneth D. Merry uint8_t reserved5; 188*06e79492SKenneth D. Merry uint8_t reduced_functionality; 189*06e79492SKenneth D. Merry #define SMP_RG_REDUCED_FUNCTIONALITY 0x80 190*06e79492SKenneth D. Merry uint8_t time_to_reduced_func; 191*06e79492SKenneth D. Merry uint8_t initial_time_to_reduced_func; 192*06e79492SKenneth D. Merry uint8_t max_reduced_func_time; 193*06e79492SKenneth D. Merry uint8_t last_sc_stat_desc_index[2]; 194*06e79492SKenneth D. Merry uint8_t max_sc_stat_descs[2]; 195*06e79492SKenneth D. Merry uint8_t last_phy_evl_desc_index[2]; 196*06e79492SKenneth D. Merry uint8_t max_stored_pel_descs[2]; 197*06e79492SKenneth D. Merry uint8_t stp_reject_to_open_limit[2]; 198*06e79492SKenneth D. Merry uint8_t reserved6[2]; 199*06e79492SKenneth D. Merry uint8_t crc[4]; 200*06e79492SKenneth D. Merry }; 201*06e79492SKenneth D. Merry 202*06e79492SKenneth D. Merry /* 203*06e79492SKenneth D. Merry * REPORT MANUFACTURER INFORMATION request and response, current as of SPL 204*06e79492SKenneth D. Merry * Revision 7. 205*06e79492SKenneth D. Merry */ 206*06e79492SKenneth D. Merry struct smp_report_manuf_info_request 207*06e79492SKenneth D. Merry { 208*06e79492SKenneth D. Merry uint8_t frame_type; 209*06e79492SKenneth D. Merry uint8_t function; 210*06e79492SKenneth D. Merry uint8_t response_len; 211*06e79492SKenneth D. Merry uint8_t request_len; 212*06e79492SKenneth D. Merry #define SMP_RMI_REQUEST_LEN 0x00 213*06e79492SKenneth D. Merry uint8_t crc[4]; 214*06e79492SKenneth D. Merry }; 215*06e79492SKenneth D. Merry 216*06e79492SKenneth D. Merry struct smp_report_manuf_info_response 217*06e79492SKenneth D. Merry { 218*06e79492SKenneth D. Merry uint8_t frame_type; 219*06e79492SKenneth D. Merry uint8_t function; 220*06e79492SKenneth D. Merry uint8_t function_result; 221*06e79492SKenneth D. Merry uint8_t response_len; 222*06e79492SKenneth D. Merry #define SMP_RMI_RESPONSE_LEN 0x0e 223*06e79492SKenneth D. Merry uint8_t expander_change_count[2]; 224*06e79492SKenneth D. Merry uint8_t reserved0[2]; 225*06e79492SKenneth D. Merry uint8_t sas_11_format; 226*06e79492SKenneth D. Merry #define SMP_RMI_SAS11_FORMAT 0x01 227*06e79492SKenneth D. Merry uint8_t reserved1[3]; 228*06e79492SKenneth D. Merry uint8_t vendor[8]; 229*06e79492SKenneth D. Merry uint8_t product[16]; 230*06e79492SKenneth D. Merry uint8_t revision[4]; 231*06e79492SKenneth D. Merry uint8_t comp_vendor[8]; 232*06e79492SKenneth D. Merry uint8_t comp_id[2]; 233*06e79492SKenneth D. Merry uint8_t comp_revision; 234*06e79492SKenneth D. Merry uint8_t reserved2; 235*06e79492SKenneth D. Merry uint8_t vendor_specific[8]; 236*06e79492SKenneth D. Merry uint8_t crc[4]; 237*06e79492SKenneth D. Merry }; 238*06e79492SKenneth D. Merry 239*06e79492SKenneth D. Merry /* 240*06e79492SKenneth D. Merry * DISCOVER request and response, current as of SPL Revision 7. 241*06e79492SKenneth D. Merry */ 242*06e79492SKenneth D. Merry struct smp_discover_request 243*06e79492SKenneth D. Merry { 244*06e79492SKenneth D. Merry uint8_t frame_type; 245*06e79492SKenneth D. Merry uint8_t function; 246*06e79492SKenneth D. Merry uint8_t response_len; 247*06e79492SKenneth D. Merry uint8_t request_len; 248*06e79492SKenneth D. Merry #define SMP_DIS_REQUEST_LEN 0x02 249*06e79492SKenneth D. Merry uint8_t reserved0[4]; 250*06e79492SKenneth D. Merry uint8_t ignore_zone_group; 251*06e79492SKenneth D. Merry #define SMP_DIS_IGNORE_ZONE_GROUP 0x01 252*06e79492SKenneth D. Merry uint8_t phy; 253*06e79492SKenneth D. Merry uint8_t reserved1[2]; 254*06e79492SKenneth D. Merry uint8_t crc[4]; 255*06e79492SKenneth D. Merry }; 256*06e79492SKenneth D. Merry 257*06e79492SKenneth D. Merry struct smp_discover_response 258*06e79492SKenneth D. Merry { 259*06e79492SKenneth D. Merry uint8_t frame_type; 260*06e79492SKenneth D. Merry uint8_t function; 261*06e79492SKenneth D. Merry uint8_t function_result; 262*06e79492SKenneth D. Merry uint8_t response_len; 263*06e79492SKenneth D. Merry #define SMP_DIS_RESPONSE_LEN 0x20 264*06e79492SKenneth D. Merry uint8_t expander_change_count[2]; 265*06e79492SKenneth D. Merry uint8_t reserved0[3]; 266*06e79492SKenneth D. Merry uint8_t phy; 267*06e79492SKenneth D. Merry uint8_t reserved1[2]; 268*06e79492SKenneth D. Merry uint8_t attached_device; 269*06e79492SKenneth D. Merry #define SMP_DIS_AD_TYPE_MASK 0x70 270*06e79492SKenneth D. Merry #define SMP_DIS_AD_TYPE_NONE 0x00 271*06e79492SKenneth D. Merry #define SMP_DIS_AD_TYPE_SAS_SATA 0x10 272*06e79492SKenneth D. Merry #define SMP_DIS_AD_TYPE_EXP 0x20 273*06e79492SKenneth D. Merry #define SMP_DIS_AD_TYPE_EXP_OLD 0x30 274*06e79492SKenneth D. Merry #define SMP_DIS_ATTACH_REASON_MASK 0x0f 275*06e79492SKenneth D. Merry uint8_t neg_logical_link_rate; 276*06e79492SKenneth D. Merry #define SMP_DIS_LR_MASK 0x0f 277*06e79492SKenneth D. Merry #define SMP_DIS_LR_DISABLED 0x01 278*06e79492SKenneth D. Merry #define SMP_DIS_LR_PHY_RES_PROB 0x02 279*06e79492SKenneth D. Merry #define SMP_DIS_LR_SPINUP_HOLD 0x03 280*06e79492SKenneth D. Merry #define SMP_DIS_LR_PORT_SEL 0x04 281*06e79492SKenneth D. Merry #define SMP_DIS_LR_RESET_IN_PROG 0x05 282*06e79492SKenneth D. Merry #define SMP_DIS_LR_UNSUP_PHY_ATTACHED 0x06 283*06e79492SKenneth D. Merry #define SMP_DIS_LR_G1_15GBPS 0x08 284*06e79492SKenneth D. Merry #define SMP_DIS_LR_G2_30GBPS 0x09 285*06e79492SKenneth D. Merry #define SMP_DIS_LR_G3_60GBPS 0x0a 286*06e79492SKenneth D. Merry uint8_t config_bits0; 287*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SSP_INIT 0x08 288*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_STP_INIT 0x04 289*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SMP_INIT 0x02 290*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SATA_HOST 0x01 291*06e79492SKenneth D. Merry uint8_t config_bits1; 292*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SATA_PORTSEL 0x80 293*06e79492SKenneth D. Merry #define SMP_DIS_STP_BUFFER_TOO_SMALL 0x10 294*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SSP_TARG 0x08 295*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_STP_TARG 0x04 296*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SMP_TARG 0x02 297*06e79492SKenneth D. Merry #define SMP_DIS_ATTACHED_SATA_DEV 0x01 298*06e79492SKenneth D. Merry uint8_t sas_address[8]; 299*06e79492SKenneth D. Merry uint8_t attached_sas_address[8]; 300*06e79492SKenneth D. Merry uint8_t attached_phy_id; 301*06e79492SKenneth D. Merry uint8_t config_bits2; 302*06e79492SKenneth D. Merry #define SMP_DIS_ATT_SLUMB_CAP 0x10 303*06e79492SKenneth D. Merry #define SMP_DIS_ATT_PAR_CAP 0x08 304*06e79492SKenneth D. Merry #define SMP_DIS_ATT_IN_ZPSDS_PER 0x04 305*06e79492SKenneth D. Merry #define SMP_DIS_ATT_REQ_IN_ZPSDS 0x02 306*06e79492SKenneth D. Merry #define SMP_DIS_ATT_BREAK_RPL_CAP 0x01 307*06e79492SKenneth D. Merry uint8_t reserved2[6]; 308*06e79492SKenneth D. Merry uint8_t link_rate0; 309*06e79492SKenneth D. Merry #define SMP_DIS_PROG_MIN_LR_MASK 0xf0 310*06e79492SKenneth D. Merry #define SMP_DIS_PROG_MIN_LR_SHIFT 4 311*06e79492SKenneth D. Merry #define SMP_DIS_HARD_MIN_LR_MASK 0x0f 312*06e79492SKenneth D. Merry uint8_t link_rate1; 313*06e79492SKenneth D. Merry #define SMP_DIS_PROG_MAX_LR_MAX 0xf0 314*06e79492SKenneth D. Merry #define SMP_DIS_PROG_MAX_LR_SHIFT 4 315*06e79492SKenneth D. Merry #define SMP_DIS_HARD_MAX_LR_MASK 0x0f 316*06e79492SKenneth D. Merry uint8_t phy_change_count; 317*06e79492SKenneth D. Merry uint8_t pp_timeout; 318*06e79492SKenneth D. Merry #define SMP_DIS_VIRTUAL_PHY 0x80 319*06e79492SKenneth D. Merry #define SMP_DIS_PP_TIMEOUT_MASK 0x0f 320*06e79492SKenneth D. Merry uint8_t routing_attr; 321*06e79492SKenneth D. Merry uint8_t conn_type; 322*06e79492SKenneth D. Merry uint8_t conn_el_index; 323*06e79492SKenneth D. Merry uint8_t conn_phys_link; 324*06e79492SKenneth D. Merry uint8_t config_bits3; 325*06e79492SKenneth D. Merry #define SMP_DIS_PHY_POW_COND_MASK 0xc0 326*06e79492SKenneth D. Merry #define SMP_DIS_PHY_POW_COND_SHIFT 6 327*06e79492SKenneth D. Merry #define SMP_DIS_SAS_SLUMB_CAP 0x08 328*06e79492SKenneth D. Merry #define SMP_DIS_SAS_PART_CAP 0x04 329*06e79492SKenneth D. Merry #define SMP_DIS_SATA_SLUMB_CAP 0x02 330*06e79492SKenneth D. Merry #define SMP_DIS_SATA_PART_CAP 0x01 331*06e79492SKenneth D. Merry uint8_t config_bits4; 332*06e79492SKenneth D. Merry #define SMP_DIS_SAS_SLUMB_ENB 0x08 333*06e79492SKenneth D. Merry #define SMP_DIS_SAS_PART_ENB 0x04 334*06e79492SKenneth D. Merry #define SMP_DIS_SATA_SLUMB_ENB 0x02 335*06e79492SKenneth D. Merry #define SMP_DIS_SATA_PART_ENB 0x01 336*06e79492SKenneth D. Merry uint8_t vendor_spec[2]; 337*06e79492SKenneth D. Merry uint8_t attached_dev_name[8]; 338*06e79492SKenneth D. Merry uint8_t config_bits5; 339*06e79492SKenneth D. Merry #define SMP_DIS_REQ_IN_ZPSDS_CHG 0x40 340*06e79492SKenneth D. Merry #define SMP_DIS_IN_ZPSDS_PER 0x20 341*06e79492SKenneth D. Merry #define SMP_DIS_REQ_IN_ZPSDS 0x10 342*06e79492SKenneth D. Merry #define SMP_DIS_ZG_PER 0x04 343*06e79492SKenneth D. Merry #define SMP_DIS_IN_ZPSDS 0x02 344*06e79492SKenneth D. Merry #define SMP_DIS_ZONING_ENB 0x01 345*06e79492SKenneth D. Merry uint8_t reserved3[2]; 346*06e79492SKenneth D. Merry uint8_t zone_group; 347*06e79492SKenneth D. Merry uint8_t self_config_status; 348*06e79492SKenneth D. Merry uint8_t self_config_levels_comp; 349*06e79492SKenneth D. Merry uint8_t reserved4[2]; 350*06e79492SKenneth D. Merry uint8_t self_config_sas_addr[8]; 351*06e79492SKenneth D. Merry uint8_t prog_phy_cap[4]; 352*06e79492SKenneth D. Merry uint8_t current_phy_cap[4]; 353*06e79492SKenneth D. Merry uint8_t attached_phy_cap[4]; 354*06e79492SKenneth D. Merry uint8_t reserved5[6]; 355*06e79492SKenneth D. Merry uint8_t neg_phys_link_rate; 356*06e79492SKenneth D. Merry #define SMP_DIS_REASON_MASK 0xf0 357*06e79492SKenneth D. Merry #define SMP_DIS_REASON_SHIFT 4 358*06e79492SKenneth D. Merry #define SMP_DIS_PHYS_LR_MASK 0x0f 359*06e79492SKenneth D. Merry uint8_t config_bits6; 360*06e79492SKenneth D. Merry #define SMP_DIS_OPTICAL_MODE_ENB 0x04 361*06e79492SKenneth D. Merry #define SMP_DIS_NEG_SSC 0x02 362*06e79492SKenneth D. Merry #define SMP_DIS_HW_MUX_SUP 0x01 363*06e79492SKenneth D. Merry uint8_t config_bits7; 364*06e79492SKenneth D. Merry #define SMP_DIS_DEF_IN_ZPSDS_PER 0x20 365*06e79492SKenneth D. Merry #define SMP_DIS_DEF_REQ_IN_ZPSDS 0x10 366*06e79492SKenneth D. Merry #define SMP_DIS_DEF_ZG_PER 0x04 367*06e79492SKenneth D. Merry #define SMP_DIS_DEF_ZONING_ENB 0x01 368*06e79492SKenneth D. Merry uint8_t reserved6; 369*06e79492SKenneth D. Merry uint8_t reserved7; 370*06e79492SKenneth D. Merry uint8_t default_zone_group; 371*06e79492SKenneth D. Merry uint8_t config_bits8; 372*06e79492SKenneth D. Merry #define SMP_DIS_SAVED_IN_ZPSDS_PER 0x20 373*06e79492SKenneth D. Merry #define SMP_DIS_SAVED_REQ_IN_SPSDS 0x10 374*06e79492SKenneth D. Merry #define SMP_DIS_SAVED_ZG_PER 0x04 375*06e79492SKenneth D. Merry #define SMP_DIS_SAVED_ZONING_ENB 0x01 376*06e79492SKenneth D. Merry uint8_t reserved8; 377*06e79492SKenneth D. Merry uint8_t reserved9; 378*06e79492SKenneth D. Merry uint8_t saved_zone_group; 379*06e79492SKenneth D. Merry uint8_t config_bits9; 380*06e79492SKenneth D. Merry #define SMP_DIS_SHADOW_IN_ZPSDS_PER 0x20 381*06e79492SKenneth D. Merry #define SMP_DIS_SHADOW_IN_REQ_IN_ZPSDS 0x10 382*06e79492SKenneth D. Merry #define SMP_DIS_SHADOW_ZG_PER 0x04 383*06e79492SKenneth D. Merry uint8_t reserved10; 384*06e79492SKenneth D. Merry uint8_t reserved11; 385*06e79492SKenneth D. Merry uint8_t shadow_zone_group; 386*06e79492SKenneth D. Merry uint8_t device_slot_num; 387*06e79492SKenneth D. Merry uint8_t device_slot_group_num; 388*06e79492SKenneth D. Merry uint8_t device_slot_group_out_conn[6]; 389*06e79492SKenneth D. Merry uint8_t stp_buffer_size[2]; 390*06e79492SKenneth D. Merry uint8_t reserved12; 391*06e79492SKenneth D. Merry uint8_t reserved13; 392*06e79492SKenneth D. Merry uint8_t crc[4]; 393*06e79492SKenneth D. Merry }; 394*06e79492SKenneth D. Merry 395*06e79492SKenneth D. Merry /* 396*06e79492SKenneth D. Merry * PHY CONTROL request and response. Current as of SPL Revision 7. 397*06e79492SKenneth D. Merry */ 398*06e79492SKenneth D. Merry struct smp_phy_control_request 399*06e79492SKenneth D. Merry { 400*06e79492SKenneth D. Merry uint8_t frame_type; 401*06e79492SKenneth D. Merry uint8_t function; 402*06e79492SKenneth D. Merry uint8_t response_len; 403*06e79492SKenneth D. Merry #define SMP_PC_RESPONSE_LEN 0x00 404*06e79492SKenneth D. Merry uint8_t request_len; 405*06e79492SKenneth D. Merry #define SMP_PC_REQUEST_LEN 0x09 406*06e79492SKenneth D. Merry uint8_t expected_exp_chg_cnt[2]; 407*06e79492SKenneth D. Merry uint8_t reserved0[3]; 408*06e79492SKenneth D. Merry uint8_t phy; 409*06e79492SKenneth D. Merry uint8_t phy_operation; 410*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_NOP 0x00 411*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_LINK_RESET 0x01 412*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_HARD_RESET 0x02 413*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_DISABLE 0x03 414*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_CLEAR_ERR_LOG 0x05 415*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_CLEAR_AFFILIATON 0x06 416*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_TRANS_SATA_PSS 0x07 417*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_CLEAR_STP_ITN_LS 0x08 418*06e79492SKenneth D. Merry #define SMP_PC_PHY_OP_SET_ATT_DEV_NAME 0x09 419*06e79492SKenneth D. Merry uint8_t update_pp_timeout; 420*06e79492SKenneth D. Merry #define SMP_PC_UPDATE_PP_TIMEOUT 0x01 421*06e79492SKenneth D. Merry uint8_t reserved1[12]; 422*06e79492SKenneth D. Merry uint8_t attached_device_name[8]; 423*06e79492SKenneth D. Merry uint8_t prog_min_phys_link_rate; 424*06e79492SKenneth D. Merry #define SMP_PC_PROG_MIN_PL_RATE_MASK 0xf0 425*06e79492SKenneth D. Merry #define SMP_PC_PROG_MIN_PL_RATE_SHIFT 4 426*06e79492SKenneth D. Merry uint8_t prog_max_phys_link_rate; 427*06e79492SKenneth D. Merry #define SMP_PC_PROG_MAX_PL_RATE_MASK 0xf0 428*06e79492SKenneth D. Merry #define SMP_PC_PROG_MAX_PL_RATE_SHIFT 4 429*06e79492SKenneth D. Merry uint8_t config_bits0; 430*06e79492SKenneth D. Merry #define SMP_PC_SP_NC 0x00 431*06e79492SKenneth D. Merry #define SMP_PC_SP_DISABLE 0x02 432*06e79492SKenneth D. Merry #define SMP_PC_SP_ENABLE 0x01 433*06e79492SKenneth D. Merry #define SMP_PC_SAS_SLUMBER_NC 0x00 434*06e79492SKenneth D. Merry #define SMP_PC_SAS_SLUMBER_DISABLE 0x80 435*06e79492SKenneth D. Merry #define SMP_PC_SAS_SLUMBER_ENABLE 0x40 436*06e79492SKenneth D. Merry #define SMP_PC_SAS_SLUMBER_MASK 0xc0 437*06e79492SKenneth D. Merry #define SMP_PC_SAS_SLUMBER_SHIFT 6 438*06e79492SKenneth D. Merry #define SMP_PC_SAS_PARTIAL_NC 0x00 439*06e79492SKenneth D. Merry #define SMP_PC_SAS_PARTIAL_DISABLE 0x20 440*06e79492SKenneth D. Merry #define SMP_PC_SAS_PARTIAL_ENABLE 0x10 441*06e79492SKenneth D. Merry #define SMP_PC_SAS_PARTIAL_MASK 0x30 442*06e79492SKenneth D. Merry #define SMP_PC_SAS_PARTIAL_SHIFT 4 443*06e79492SKenneth D. Merry #define SMP_PC_SATA_SLUMBER_NC 0x00 444*06e79492SKenneth D. Merry #define SMP_PC_SATA_SLUMBER_DISABLE 0x08 445*06e79492SKenneth D. Merry #define SMP_PC_SATA_SLUMBER_ENABLE 0x04 446*06e79492SKenneth D. Merry #define SMP_PC_SATA_SLUMBER_MASK 0x0c 447*06e79492SKenneth D. Merry #define SMP_PC_SATA_SLUMBER_SHIFT 2 448*06e79492SKenneth D. Merry #define SMP_PC_SATA_PARTIAL_NC 0x00 449*06e79492SKenneth D. Merry #define SMP_PC_SATA_PARTIAL_DISABLE 0x02 450*06e79492SKenneth D. Merry #define SMP_PC_SATA_PARTIAL_ENABLE 0x01 451*06e79492SKenneth D. Merry #define SMP_PC_SATA_PARTIAL_MASK 0x03 452*06e79492SKenneth D. Merry #define SMP_PC_SATA_PARTIAL_SHIFT 0 453*06e79492SKenneth D. Merry uint8_t reserved2; 454*06e79492SKenneth D. Merry uint8_t pp_timeout_value; 455*06e79492SKenneth D. Merry #define SMP_PC_PP_TIMEOUT_MASK 0x0f 456*06e79492SKenneth D. Merry uint8_t reserved3[3]; 457*06e79492SKenneth D. Merry uint8_t crc[4]; 458*06e79492SKenneth D. Merry }; 459*06e79492SKenneth D. Merry 460*06e79492SKenneth D. Merry struct smp_phy_control_response 461*06e79492SKenneth D. Merry { 462*06e79492SKenneth D. Merry uint8_t frame_type; 463*06e79492SKenneth D. Merry uint8_t function; 464*06e79492SKenneth D. Merry uint8_t function_result; 465*06e79492SKenneth D. Merry uint8_t response_len; 466*06e79492SKenneth D. Merry #define SMP_PC_RESPONSE_LEN 0x00 467*06e79492SKenneth D. Merry uint8_t crc[4]; 468*06e79492SKenneth D. Merry }; 469*06e79492SKenneth D. Merry 470*06e79492SKenneth D. Merry __BEGIN_DECLS 471*06e79492SKenneth D. Merry 472*06e79492SKenneth D. Merry const char *smp_error_desc(int function_result); 473*06e79492SKenneth D. Merry const char *smp_command_desc(uint8_t cmd_num); 474*06e79492SKenneth D. Merry void smp_command_decode(uint8_t *smp_request, int request_len, struct sbuf *sb, 475*06e79492SKenneth D. Merry char *line_prefix, int first_line_len, int line_len); 476*06e79492SKenneth D. Merry void smp_command_sbuf(struct ccb_smpio *smpio, struct sbuf *sb, 477*06e79492SKenneth D. Merry char *line_prefix, int first_line_len, int line_len); 478*06e79492SKenneth D. Merry 479*06e79492SKenneth D. Merry #ifdef _KERNEL 480*06e79492SKenneth D. Merry void smp_error_sbuf(struct ccb_smpio *smpio, struct sbuf *sb); 481*06e79492SKenneth D. Merry #else /* !_KERNEL*/ 482*06e79492SKenneth D. Merry void smp_error_sbuf(struct cam_device *device, struct ccb_smpio *smpio, 483*06e79492SKenneth D. Merry struct sbuf *sb); 484*06e79492SKenneth D. Merry #endif /* _KERNEL/!_KERNEL */ 485*06e79492SKenneth D. Merry 486*06e79492SKenneth D. Merry void smp_report_general_sbuf(struct smp_report_general_response *response, 487*06e79492SKenneth D. Merry int response_len, struct sbuf *sb); 488*06e79492SKenneth D. Merry 489*06e79492SKenneth D. Merry void smp_report_manuf_info_sbuf(struct smp_report_manuf_info_response *response, 490*06e79492SKenneth D. Merry int response_len, struct sbuf *sb); 491*06e79492SKenneth D. Merry 492*06e79492SKenneth D. Merry void smp_report_general(struct ccb_smpio *smpio, uint32_t retries, 493*06e79492SKenneth D. Merry void (*cbfcnp)(struct cam_periph *, union ccb *), 494*06e79492SKenneth D. Merry struct smp_report_general_request *request, 495*06e79492SKenneth D. Merry int request_len, uint8_t *response, int response_len, 496*06e79492SKenneth D. Merry int long_response, uint32_t timeout); 497*06e79492SKenneth D. Merry 498*06e79492SKenneth D. Merry void smp_discover(struct ccb_smpio *smpio, uint32_t retries, 499*06e79492SKenneth D. Merry void (*cbfcnp)(struct cam_periph *, union ccb *), 500*06e79492SKenneth D. Merry struct smp_discover_request *request, int request_len, 501*06e79492SKenneth D. Merry uint8_t *response, int response_len, int long_response, 502*06e79492SKenneth D. Merry int ignore_zone_group, int phy, uint32_t timeout); 503*06e79492SKenneth D. Merry 504*06e79492SKenneth D. Merry void smp_report_manuf_info(struct ccb_smpio *smpio, uint32_t retries, 505*06e79492SKenneth D. Merry void (*cbfcnp)(struct cam_periph *, union ccb *), 506*06e79492SKenneth D. Merry struct smp_report_manuf_info_request *request, 507*06e79492SKenneth D. Merry int request_len, uint8_t *response, int response_len, 508*06e79492SKenneth D. Merry int long_response, uint32_t timeout); 509*06e79492SKenneth D. Merry 510*06e79492SKenneth D. Merry void smp_phy_control(struct ccb_smpio *smpio, uint32_t retries, 511*06e79492SKenneth D. Merry void (*cbfcnp)(struct cam_periph *, union ccb *), 512*06e79492SKenneth D. Merry struct smp_phy_control_request *request, int request_len, 513*06e79492SKenneth D. Merry uint8_t *response, int response_len, int long_response, 514*06e79492SKenneth D. Merry uint32_t expected_exp_change_count, int phy, int phy_op, 515*06e79492SKenneth D. Merry int update_pp_timeout_val, uint64_t attached_device_name, 516*06e79492SKenneth D. Merry int prog_min_prl, int prog_max_prl, int slumber_partial, 517*06e79492SKenneth D. Merry int pp_timeout_value, uint32_t timeout); 518*06e79492SKenneth D. Merry __END_DECLS 519*06e79492SKenneth D. Merry 520*06e79492SKenneth D. Merry #endif /*_SCSI_SMP_ALL_H*/ 521