1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 #ifndef _SYS_SCSI_IMPL_SCSI_SAS_H 26 #define _SYS_SCSI_IMPL_SCSI_SAS_H 27 28 #include <sys/types.h> 29 #include <sys/scsi/impl/usmp.h> 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #if defined(_KERNEL) 36 /* 37 * Phymap support 38 */ 39 typedef struct __sas_phymap sas_phymap_t; 40 typedef enum { PHYMAP_MODE_SIMPLE } sas_phymap_mode_t; 41 typedef void (*sas_phymap_activate_cb_t) 42 (void *phymap_priv, char *ua, void **ua_privp); 43 typedef void (*sas_phymap_deactivate_cb_t) 44 (void *phymap_priv, char *ua, void *ua_priv); 45 46 extern int sas_phymap_create(dev_info_t *hba_dip, 47 int settle_usec, 48 sas_phymap_mode_t mode, 49 void *mode_argument, 50 void *phymap_priv, 51 sas_phymap_activate_cb_t activate_cb, 52 sas_phymap_deactivate_cb_t deactivate_cb, 53 sas_phymap_t **phymapp); 54 void sas_phymap_destroy(sas_phymap_t *phymap); 55 56 extern int sas_phymap_phy_add(sas_phymap_t *phymap, 57 int phy, 58 uint64_t local_sas_address, 59 uint64_t remote_sas_address); 60 extern int sas_phymap_phy_rem(sas_phymap_t *phymap, 61 int phy); 62 63 extern char *sas_phymap_lookup_ua(sas_phymap_t *phymap, 64 uint64_t local_sas_address, 65 uint64_t remote_sas_address); 66 extern void *sas_phymap_lookup_uapriv(sas_phymap_t *phymap, 67 char *ua); 68 69 extern char *sas_phymap_phy2ua(sas_phymap_t *phymap, 70 int phy); 71 void sas_phymap_ua_free(char *); 72 73 extern int sas_phymap_uahasphys(sas_phymap_t *phymap, 74 char *ua); 75 76 typedef struct __sas_phymap_phys sas_phymap_phys_t; 77 extern sas_phymap_phys_t *sas_phymap_ua2phys(sas_phymap_t *phymap, 78 char *ua); 79 extern int sas_phymap_phys_next(sas_phymap_phys_t *phys); 80 void sas_phymap_phys_free(sas_phymap_phys_t *phys); 81 #endif /* defined(_KERNEL) */ 82 83 84 85 #define KSTAT_SAS_PHY_CLASS "SAS_phy_stat" 86 /* 87 * Format of the ks_name field for SAS Phy Stat 88 * 89 * driver_name.initiator_port_SAS_address.initiator_port_instance_number.phyid 90 * Example: pmcs.5000c50000d756aa.2.0 91 * 92 * driver_name: 93 * driver name from di_driver_name() on SAS initiator port devinfo node. 94 * 95 * initiator_port_SAS_address: 96 * SAS address of the initiator port that phy stat is reported for. 97 * 98 * initiator_port_instance_number: 99 * instance number of the initiator port that phy stat is reported for. 100 * 101 * phyid: 102 * prop phyIdentifier under initiator port node. 103 */ 104 105 /* Port Protocol - kstat structure definition */ 106 typedef struct sas_port_protocol_stats { 107 kstat_named_t seconds_since_last_reset; 108 kstat_named_t input_requests; 109 kstat_named_t output_requests; 110 kstat_named_t control_requests; 111 kstat_named_t input_megabytes; 112 kstat_named_t output_megabytes; 113 } sas_port_protocol_stats_t; 114 115 /* Port - kstat structure definition */ 116 typedef struct sas_port_stats { 117 kstat_named_t seconds_since_last_reset; 118 kstat_named_t tx_frames; 119 kstat_named_t tx_words; 120 kstat_named_t rx_frames; 121 kstat_named_t rx_words; 122 } sas_port_stats_t; 123 124 /* PHY - kstat structure definition */ 125 typedef struct sas_phy_stats { 126 kstat_named_t seconds_since_last_reset; 127 kstat_named_t tx_frames; 128 kstat_named_t tx_words; 129 kstat_named_t rx_frames; 130 kstat_named_t rx_words; 131 kstat_named_t invalid_dword_count; 132 kstat_named_t running_disparity_error_count; 133 kstat_named_t loss_of_dword_sync_count; 134 kstat_named_t phy_reset_problem_count; 135 } sas_phy_stats_t; 136 137 /* 138 * Supported Protocol property 139 */ 140 #define SAS_PROTOCOL_SSP 0x00000001 141 #define SAS_PROTOCOL_STP 0x00000010 142 #define SAS_PROTOCOL_SMP 0x00000100 143 #define SAS_PROTOCOL_SATA 0x00001000 144 145 146 /* 147 * Definition - Negotiated Physical Link Rate 148 * Based on Table 288 (Section 10.4.3.10) of the spec (SAS-2 r-15), these 149 * constants represent "Negotiated physical link rate" 150 * (and implicitly the State of the phy). 151 */ 152 #define SAS_LINK_RATE_UNKNOWN 0x0 /* Phy is enabled. */ 153 /* Speed is unknown */ 154 #define SAS_LINK_RATE_DISABLED 0x1 /* Phy is disabled. */ 155 /* Speed is undefined */ 156 #define SAS_LINK_RATE_FAILED 0x2 /* Phy is enabled. */ 157 /* Failed speed negotiation. */ 158 #define SAS_LINK_RATE_SATASPINUP 0x3 /* Phy is enabled. */ 159 /* Detected a SATA device and */ 160 /* entered the SATA Spinup hold */ 161 /* state */ 162 #define SAS_LINK_RATE_SATAPORTSEL 0x4 /* Phy enabled. */ 163 /* The phy is attached to a */ 164 /* Port Selector (SATA-2.6). */ 165 #define SAS_LINK_RATE_RESET_IN_PROGRESS 0x5 /* Phy is enabled. */ 166 /* Expander is performing SMP */ 167 /* PHY CONTROL Link/Hard Reset */ 168 #define SAS_LINK_RATE_PHY_UNSUPPORTED 0x6 /* Phy is enabled. */ 169 /* Unsupported phy settings */ 170 #define SAS_LINK_RATE_RESERVED 0x7 /* Undefined. Reserved. */ 171 #define SAS_LINK_RATE_1_5GBIT 0x8 /* Phy enabled at 1.5 GBit/sec */ 172 #define SAS_LINK_RATE_3GBIT 0x9 /* Phy enabled at 3 GBit/sec */ 173 #define SAS_LINK_RATE_6GBIT 0xA /* Phy enabled at 6 GBit/sec. */ 174 175 176 /* 177 * Definition - "phy-info" property 178 * 179 * The property is an nvlist_array that represents an array of the 180 * nvlists on a per HBA basis. The individual elements of the array 181 * (the nvlists) represent the following properties for each phy of the HBA 182 */ 183 #define SAS_PHY_INFO "phy-info" /* Phy property name */ 184 #define SAS_PHY_INFO_NVL "phy-info-nvl" /* NVL array name */ 185 186 #define SAS_PHY_ID "PhyIdentifier" /* DATA_TYPE_UINT8 */ 187 #define SAS_NEG_LINK_RATE "NegotiatedLinkRate" /* DATA_TYPE_INT8 */ 188 #define SAS_PROG_MIN_LINK_RATE "ProgrammedMinLinkRate" /* DATA_TYPE_INT8 */ 189 #define SAS_HW_MIN_LINK_RATE "HardwareMinLinkRate" /* DATA_TYPE_INT8 */ 190 #define SAS_PROG_MAX_LINK_RATE "ProgrammedMaxLinkRate" /* DATA_TYPE_INT8 */ 191 #define SAS_HW_MAX_LINK_RATE "HardwareMaxLinkRate" /* DATA_TYPE_INT8 */ 192 193 194 /* 195 * Phy-mask property names for the target port, attached port and receptacle 196 */ 197 #define SCSI_ADDR_PROP_TARGET_PORT_PM "target-port-pm" 198 #define SCSI_ADDR_PROP_ATTACHED_PORT_PM "attached-port-pm" 199 #define SCSI_HBA_PROP_RECEPTACLE_PM "receptacle-pm" 200 201 /* 202 * Target port depth property names - Indicates the number of expanders 203 * between the initiator port and the target port 204 */ 205 #define SCSI_ADDR_PROP_TARGET_PORT_DEPTH "target-port-depth" 206 207 208 /* 209 * Event definitions 210 */ 211 /* Event Class */ 212 #define EC_HBA "EC_hba" 213 214 /* Event Sub-Class */ 215 #define ESC_SAS_HBA_PORT_BROADCAST "ESC_sas_hba_port_broadcast" 216 /* Event Types for above Subclass */ 217 #define SAS_PORT_BROADCAST_CHANGE "port_broadcast_change" 218 #define SAS_PORT_BROADCAST_SES "port_broadcast_ses" 219 #define SAS_PORT_BROADCAST_D24_0 "port_broadcast_d24_0" 220 #define SAS_PORT_BROADCAST_D27_4 "port_broadcast_d27_4" 221 #define SAS_PORT_BROADCAST_D01_4 "port_broadcast_d01_4" 222 #define SAS_PORT_BROADCAST_D04_7 "port_broadcast_d04_7" 223 #define SAS_PORT_BROADCAST_D16_7 "port_broadcast_d16_7" 224 #define SAS_PORT_BROADCAST_D29_7 "port_broadcast_d29_7" 225 226 /* Event Sub-Class */ 227 #define ESC_SAS_PHY_EVENT "ESC_sas_phy_event" 228 /* Event Types for above Subclass */ 229 #define SAS_PHY_ONLINE "port_online" 230 #define SAS_PHY_OFFLINE "port_offline" 231 #define SAS_PHY_REMOVE "port_remove" 232 233 /* Event Payload Names */ 234 #define SAS_DRV_INST "driver_instance" 235 #define SAS_PORT_ADDR "port_address" 236 #define SAS_DEVFS_PATH "devfs_path" 237 #define SAS_EVENT_TYPE "event_type" 238 #define SAS_LINK_RATE "link_rate" 239 /* SAS_PHY_ID - Defined Above */ 240 241 #ifdef __cplusplus 242 } 243 #endif 244 245 #endif /* _SYS_SCSI_IMPL_SCSI_SAS_H */ 246