1f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2f2e8686eSxun ni - Sun Microsystems - Beijing China  * CDDL HEADER START
3f2e8686eSxun ni - Sun Microsystems - Beijing China  *
4f2e8686eSxun ni - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
5f2e8686eSxun ni - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
6f2e8686eSxun ni - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
7f2e8686eSxun ni - Sun Microsystems - Beijing China  *
8f2e8686eSxun ni - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9f2e8686eSxun ni - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
10f2e8686eSxun ni - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
11f2e8686eSxun ni - Sun Microsystems - Beijing China  * and limitations under the License.
12f2e8686eSxun ni - Sun Microsystems - Beijing China  *
13f2e8686eSxun ni - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
14f2e8686eSxun ni - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15f2e8686eSxun ni - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
16f2e8686eSxun ni - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
17f2e8686eSxun ni - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
18f2e8686eSxun ni - Sun Microsystems - Beijing China  *
19f2e8686eSxun ni - Sun Microsystems - Beijing China  * CDDL HEADER END
20f2e8686eSxun ni - Sun Microsystems - Beijing China  */
21f2e8686eSxun ni - Sun Microsystems - Beijing China 
22f2e8686eSxun ni - Sun Microsystems - Beijing China /*
23f2e8686eSxun ni - Sun Microsystems - Beijing China  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
248b1f072cSHans Rosenfeld  * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
25*72a2c484SHans Rosenfeld  * Copyright 2023 Racktop Systems, Inc.
26f2e8686eSxun ni - Sun Microsystems - Beijing China  */
27f2e8686eSxun ni - Sun Microsystems - Beijing China /*
28f2e8686eSxun ni - Sun Microsystems - Beijing China  * This file contains SM-HBA support for MPT SAS driver
29f2e8686eSxun ni - Sun Microsystems - Beijing China  */
30f2e8686eSxun ni - Sun Microsystems - Beijing China 
31f2e8686eSxun ni - Sun Microsystems - Beijing China #if defined(lint) || defined(DEBUG)
32f2e8686eSxun ni - Sun Microsystems - Beijing China #define	MPTSAS_DEBUG
33f2e8686eSxun ni - Sun Microsystems - Beijing China #endif
34f2e8686eSxun ni - Sun Microsystems - Beijing China 
35f2e8686eSxun ni - Sun Microsystems - Beijing China /*
36f2e8686eSxun ni - Sun Microsystems - Beijing China  * standard header files
37f2e8686eSxun ni - Sun Microsystems - Beijing China  */
38f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/note.h>
39f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
40f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/pci.h>
41a9b51062SAda #include <sys/scsi/generic/sas.h>
42a9b51062SAda #include <sys/scsi/impl/scsi_sas.h>
43f2e8686eSxun ni - Sun Microsystems - Beijing China 
44f2e8686eSxun ni - Sun Microsystems - Beijing China #pragma pack(1)
45*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_type.h>
46*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2.h>
47*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_cnfg.h>
48*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_init.h>
49*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_ioc.h>
50*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_sas.h>
51f2e8686eSxun ni - Sun Microsystems - Beijing China #pragma pack()
52f2e8686eSxun ni - Sun Microsystems - Beijing China 
53f2e8686eSxun ni - Sun Microsystems - Beijing China /*
54f2e8686eSxun ni - Sun Microsystems - Beijing China  * private header files.
55f2e8686eSxun ni - Sun Microsystems - Beijing China  */
56f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
57f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_smhba.h>
58f2e8686eSxun ni - Sun Microsystems - Beijing China 
59a9b51062SAda /*
60a9b51062SAda  * SM - HBA statics
61a9b51062SAda  */
62a9b51062SAda extern char *mptsas_driver_rev;
63a9b51062SAda 
648b1f072cSHans Rosenfeld static void mptsas_smhba_create_phy_props(nvlist_t **, smhba_info_t *, uint8_t,
658b1f072cSHans Rosenfeld     uint16_t *);
668b1f072cSHans Rosenfeld static void mptsas_smhba_update_phy_props(mptsas_t *, dev_info_t *, nvlist_t **,
678b1f072cSHans Rosenfeld     uint8_t);
688b1f072cSHans Rosenfeld 
69a9b51062SAda static void
70f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_add_hba_prop(mptsas_t *mpt, data_type_t dt,
71f2e8686eSxun ni - Sun Microsystems - Beijing China     char *prop_name, void *prop_val);
72f2e8686eSxun ni - Sun Microsystems - Beijing China 
73f2e8686eSxun ni - Sun Microsystems - Beijing China void
74f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_show_phy_info(mptsas_t *mpt);
75f2e8686eSxun ni - Sun Microsystems - Beijing China 
76a9b51062SAda static void
mptsas_smhba_add_hba_prop(mptsas_t * mpt,data_type_t dt,char * prop_name,void * prop_val)77f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_add_hba_prop(mptsas_t *mpt, data_type_t dt,
78f2e8686eSxun ni - Sun Microsystems - Beijing China     char *prop_name, void *prop_val)
79f2e8686eSxun ni - Sun Microsystems - Beijing China {
80f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(mpt != NULL);
81f2e8686eSxun ni - Sun Microsystems - Beijing China 
82f2e8686eSxun ni - Sun Microsystems - Beijing China 	switch (dt) {
83f2e8686eSxun ni - Sun Microsystems - Beijing China 	case DATA_TYPE_INT32:
84f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (ddi_prop_update_int(DDI_DEV_T_NONE, mpt->m_dip,
85f2e8686eSxun ni - Sun Microsystems - Beijing China 		    prop_name, *(int *)prop_val)) {
86f2e8686eSxun ni - Sun Microsystems - Beijing China 			mptsas_log(mpt, CE_WARN,
87f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "%s: %s prop update failed", __func__, prop_name);
88f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
89f2e8686eSxun ni - Sun Microsystems - Beijing China 		break;
90f2e8686eSxun ni - Sun Microsystems - Beijing China 	case DATA_TYPE_STRING:
91f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
92f2e8686eSxun ni - Sun Microsystems - Beijing China 		    prop_name, (char *)prop_val)) {
93f2e8686eSxun ni - Sun Microsystems - Beijing China 			mptsas_log(mpt, CE_WARN,
94f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "%s: %s prop update failed", __func__, prop_name);
95f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
96f2e8686eSxun ni - Sun Microsystems - Beijing China 		break;
97f2e8686eSxun ni - Sun Microsystems - Beijing China 	default:
98f2e8686eSxun ni - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "%s: "
99f2e8686eSxun ni - Sun Microsystems - Beijing China 		    "Unhandled datatype(%d) for (%s). Skipping prop update.",
100f2e8686eSxun ni - Sun Microsystems - Beijing China 		    __func__, dt, prop_name);
101f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
102f2e8686eSxun ni - Sun Microsystems - Beijing China }
103f2e8686eSxun ni - Sun Microsystems - Beijing China 
104f2e8686eSxun ni - Sun Microsystems - Beijing China void
mptsas_smhba_show_phy_info(mptsas_t * mpt)105f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_show_phy_info(mptsas_t *mpt)
106f2e8686eSxun ni - Sun Microsystems - Beijing China {
107f2e8686eSxun ni - Sun Microsystems - Beijing China 	int i;
108f2e8686eSxun ni - Sun Microsystems - Beijing China 
109f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(mpt != NULL);
110f2e8686eSxun ni - Sun Microsystems - Beijing China 
111f2e8686eSxun ni - Sun Microsystems - Beijing China 	for (i = 0; i < MPTSAS_MAX_PHYS; i++) {
112f2e8686eSxun ni - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN,
113f2e8686eSxun ni - Sun Microsystems - Beijing China 		    "phy %d, Owner hdl:0x%x, attached hdl: 0x%x,"
114f2e8686eSxun ni - Sun Microsystems - Beijing China 		    "attached phy identifier %d,Program link rate 0x%x,"
115f2e8686eSxun ni - Sun Microsystems - Beijing China 		    "hw link rate 0x%x, negotiator link rate 0x%x, path %s",
116f2e8686eSxun ni - Sun Microsystems - Beijing China 		    i, mpt->m_phy_info[i].smhba_info.owner_devhdl,
117f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.attached_devhdl,
118f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.attached_phy_identify,
119f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.programmed_link_rate,
120f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.hw_link_rate,
121f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.negotiated_link_rate,
122f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->m_phy_info[i].smhba_info.path);
123f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
124f2e8686eSxun ni - Sun Microsystems - Beijing China }
125f2e8686eSxun ni - Sun Microsystems - Beijing China 
1268b1f072cSHans Rosenfeld static void
mptsas_smhba_create_phy_props(nvlist_t ** phy_props,smhba_info_t * pSmhba,uint8_t phy_id,uint16_t * attached_devhdl)1278b1f072cSHans Rosenfeld mptsas_smhba_create_phy_props(nvlist_t **phy_props, smhba_info_t *pSmhba,
1288b1f072cSHans Rosenfeld     uint8_t phy_id, uint16_t *attached_devhdl)
1298b1f072cSHans Rosenfeld {
1308b1f072cSHans Rosenfeld 	(void) nvlist_alloc(phy_props, NV_UNIQUE_NAME, KM_SLEEP);
1318b1f072cSHans Rosenfeld 	(void) nvlist_add_uint8(*phy_props, SAS_PHY_ID, phy_id);
1328b1f072cSHans Rosenfeld 	(void) nvlist_add_uint8(*phy_props, "phyState",
1338b1f072cSHans Rosenfeld 	    (pSmhba->negotiated_link_rate & 0x0f));
1348b1f072cSHans Rosenfeld 	(void) nvlist_add_int8(*phy_props, SAS_NEG_LINK_RATE,
1358b1f072cSHans Rosenfeld 	    (pSmhba->negotiated_link_rate & 0x0f));
1368b1f072cSHans Rosenfeld 	(void) nvlist_add_int8(*phy_props, SAS_PROG_MIN_LINK_RATE,
1378b1f072cSHans Rosenfeld 	    (pSmhba->programmed_link_rate & 0x0f));
1388b1f072cSHans Rosenfeld 	(void) nvlist_add_int8(*phy_props, SAS_HW_MIN_LINK_RATE,
1398b1f072cSHans Rosenfeld 	    (pSmhba->hw_link_rate & 0x0f));
1408b1f072cSHans Rosenfeld 	(void) nvlist_add_int8(*phy_props, SAS_PROG_MAX_LINK_RATE,
1418b1f072cSHans Rosenfeld 	    ((pSmhba->programmed_link_rate & 0xf0) >> 4));
1428b1f072cSHans Rosenfeld 	(void) nvlist_add_int8(*phy_props, SAS_HW_MAX_LINK_RATE,
1438b1f072cSHans Rosenfeld 	    ((pSmhba->hw_link_rate & 0xf0) >> 4));
1448b1f072cSHans Rosenfeld 
1458b1f072cSHans Rosenfeld 	if (pSmhba->attached_devhdl && (attached_devhdl != NULL))
1468b1f072cSHans Rosenfeld 		*attached_devhdl = pSmhba->attached_devhdl;
1478b1f072cSHans Rosenfeld }
1488b1f072cSHans Rosenfeld 
1498b1f072cSHans Rosenfeld static void
mptsas_smhba_update_phy_props(mptsas_t * mpt,dev_info_t * dip,nvlist_t ** phy_props,uint8_t phy_nums)1508b1f072cSHans Rosenfeld mptsas_smhba_update_phy_props(mptsas_t *mpt, dev_info_t *dip,
1518b1f072cSHans Rosenfeld     nvlist_t **phy_props, uint8_t phy_nums)
152f2e8686eSxun ni - Sun Microsystems - Beijing China {
153f2e8686eSxun ni - Sun Microsystems - Beijing China 	int		rval;
154f2e8686eSxun ni - Sun Microsystems - Beijing China 	size_t		packed_size;
155f2e8686eSxun ni - Sun Microsystems - Beijing China 	char		*packed_data = NULL;
156f2e8686eSxun ni - Sun Microsystems - Beijing China 	nvlist_t	*nvl;
157f2e8686eSxun ni - Sun Microsystems - Beijing China 
1588b1f072cSHans Rosenfeld 	if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) != 0) {
159f2e8686eSxun ni - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "%s: nvlist_alloc() failed", __func__);
1608b1f072cSHans Rosenfeld 		return;
161f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
162f2e8686eSxun ni - Sun Microsystems - Beijing China 
163f2e8686eSxun ni - Sun Microsystems - Beijing China 	rval = nvlist_add_nvlist_array(nvl, SAS_PHY_INFO_NVL, phy_props,
164f2e8686eSxun ni - Sun Microsystems - Beijing China 	    phy_nums);
165f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (rval) {
166f2e8686eSxun ni - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN,
1678b1f072cSHans Rosenfeld 		    " nv list array add failed, return value %d.", rval);
168f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto exit;
169f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
170f2e8686eSxun ni - Sun Microsystems - Beijing China 	(void) nvlist_size(nvl, &packed_size, NV_ENCODE_NATIVE);
171f2e8686eSxun ni - Sun Microsystems - Beijing China 	packed_data = kmem_zalloc(packed_size, KM_SLEEP);
172f2e8686eSxun ni - Sun Microsystems - Beijing China 	(void) nvlist_pack(nvl, &packed_data, &packed_size,
173f2e8686eSxun ni - Sun Microsystems - Beijing China 	    NV_ENCODE_NATIVE, 0);
174f2e8686eSxun ni - Sun Microsystems - Beijing China 
175f2e8686eSxun ni - Sun Microsystems - Beijing China 	(void) ddi_prop_update_byte_array(DDI_DEV_T_NONE, dip,
176f2e8686eSxun ni - Sun Microsystems - Beijing China 	    SAS_PHY_INFO, (uchar_t *)packed_data, packed_size);
177f2e8686eSxun ni - Sun Microsystems - Beijing China 
178f2e8686eSxun ni - Sun Microsystems - Beijing China exit:
179f2e8686eSxun ni - Sun Microsystems - Beijing China 	nvlist_free(nvl);
180f2e8686eSxun ni - Sun Microsystems - Beijing China 
181f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (packed_data != NULL) {
182f2e8686eSxun ni - Sun Microsystems - Beijing China 		kmem_free(packed_data, packed_size);
183f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
184f2e8686eSxun ni - Sun Microsystems - Beijing China }
185f2e8686eSxun ni - Sun Microsystems - Beijing China 
1868b1f072cSHans Rosenfeld void
mptsas_smhba_set_one_phy_props(mptsas_t * mpt,dev_info_t * dip,uint8_t phy_id,uint16_t * attached_devhdl)1878b1f072cSHans Rosenfeld mptsas_smhba_set_one_phy_props(mptsas_t *mpt, dev_info_t *dip, uint8_t phy_id,
1888b1f072cSHans Rosenfeld     uint16_t *attached_devhdl)
1898b1f072cSHans Rosenfeld {
1908b1f072cSHans Rosenfeld 	nvlist_t	*phy_props;
1918b1f072cSHans Rosenfeld 
1928b1f072cSHans Rosenfeld 	ASSERT(phy_id < mpt->m_num_phys);
1938b1f072cSHans Rosenfeld 
1948b1f072cSHans Rosenfeld 	mptsas_smhba_create_phy_props(&phy_props,
1958b1f072cSHans Rosenfeld 	    &mpt->m_phy_info[phy_id].smhba_info, phy_id, attached_devhdl);
1968b1f072cSHans Rosenfeld 
1978b1f072cSHans Rosenfeld 	mptsas_smhba_update_phy_props(mpt, dip, &phy_props, 1);
1988b1f072cSHans Rosenfeld 
1998b1f072cSHans Rosenfeld 	nvlist_free(phy_props);
2008b1f072cSHans Rosenfeld }
2018b1f072cSHans Rosenfeld 
2028b1f072cSHans Rosenfeld void
mptsas_smhba_set_all_phy_props(mptsas_t * mpt,dev_info_t * dip,uint8_t phy_nums,mptsas_phymask_t phy_mask,uint16_t * attached_devhdl)2038b1f072cSHans Rosenfeld mptsas_smhba_set_all_phy_props(mptsas_t *mpt, dev_info_t *dip, uint8_t phy_nums,
2048b1f072cSHans Rosenfeld     mptsas_phymask_t phy_mask, uint16_t *attached_devhdl)
2058b1f072cSHans Rosenfeld {
2068b1f072cSHans Rosenfeld 	int		i, j;
2078b1f072cSHans Rosenfeld 	nvlist_t	**phy_props;
2088b1f072cSHans Rosenfeld 
2098b1f072cSHans Rosenfeld 	if (phy_nums == 0)
2108b1f072cSHans Rosenfeld 		return;
2118b1f072cSHans Rosenfeld 
2128b1f072cSHans Rosenfeld 	phy_props = kmem_zalloc(sizeof (nvlist_t *) * phy_nums, KM_SLEEP);
2138b1f072cSHans Rosenfeld 
2148b1f072cSHans Rosenfeld 	for (i = 0, j = 0; i < mpt->m_num_phys && j < phy_nums; i++)
2158b1f072cSHans Rosenfeld 		if (phy_mask == mpt->m_phy_info[i].phy_mask)
2168b1f072cSHans Rosenfeld 			mptsas_smhba_create_phy_props(&phy_props[j++],
2178b1f072cSHans Rosenfeld 			    &mpt->m_phy_info[i].smhba_info, i, attached_devhdl);
2188b1f072cSHans Rosenfeld 
2198b1f072cSHans Rosenfeld 	mptsas_smhba_update_phy_props(mpt, dip, phy_props, j);
2208b1f072cSHans Rosenfeld 
2218b1f072cSHans Rosenfeld 	for (i = 0; i < j && phy_props[i] != NULL; i++)
2228b1f072cSHans Rosenfeld 		nvlist_free(phy_props[i]);
2238b1f072cSHans Rosenfeld 
2248b1f072cSHans Rosenfeld 	kmem_free(phy_props, sizeof (nvlist_t *) * phy_nums);
2258b1f072cSHans Rosenfeld }
2268b1f072cSHans Rosenfeld 
227f2e8686eSxun ni - Sun Microsystems - Beijing China /*
228f2e8686eSxun ni - Sun Microsystems - Beijing China  * Called with PHY lock held on phyp
229f2e8686eSxun ni - Sun Microsystems - Beijing China  */
230f2e8686eSxun ni - Sun Microsystems - Beijing China void
mptsas_smhba_log_sysevent(mptsas_t * mpt,char * subclass,char * etype,smhba_info_t * phyp)231f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_log_sysevent(mptsas_t *mpt, char *subclass, char *etype,
232f2e8686eSxun ni - Sun Microsystems - Beijing China     smhba_info_t *phyp)
233f2e8686eSxun ni - Sun Microsystems - Beijing China {
234f2e8686eSxun ni - Sun Microsystems - Beijing China 	nvlist_t	*attr_list;
235f2e8686eSxun ni - Sun Microsystems - Beijing China 	char		*pname;
236f2e8686eSxun ni - Sun Microsystems - Beijing China 	char		sas_addr[MPTSAS_WWN_STRLEN];
237f2e8686eSxun ni - Sun Microsystems - Beijing China 	uint8_t		phynum = 0;
238f2e8686eSxun ni - Sun Microsystems - Beijing China 	uint8_t		lrate = 0;
239f2e8686eSxun ni - Sun Microsystems - Beijing China 
240f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (mpt->m_dip == NULL)
241f2e8686eSxun ni - Sun Microsystems - Beijing China 		return;
242f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (phyp == NULL)
243f2e8686eSxun ni - Sun Microsystems - Beijing China 		return;
244f2e8686eSxun ni - Sun Microsystems - Beijing China 
245f2e8686eSxun ni - Sun Microsystems - Beijing China 	pname = kmem_zalloc(MAXPATHLEN, KM_NOSLEEP);
246f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (pname == NULL)
247f2e8686eSxun ni - Sun Microsystems - Beijing China 		return;
248f2e8686eSxun ni - Sun Microsystems - Beijing China 
249f2e8686eSxun ni - Sun Microsystems - Beijing China 	if ((strcmp(subclass, ESC_SAS_PHY_EVENT) == 0) ||
250f2e8686eSxun ni - Sun Microsystems - Beijing China 	    (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0)) {
251f2e8686eSxun ni - Sun Microsystems - Beijing China 		ASSERT(phyp != NULL);
252f2e8686eSxun ni - Sun Microsystems - Beijing China 		(void) strncpy(pname, phyp->path, strlen(phyp->path));
253f2e8686eSxun ni - Sun Microsystems - Beijing China 		phynum = phyp->phy_id;
254f2e8686eSxun ni - Sun Microsystems - Beijing China 		bzero(sas_addr, sizeof (sas_addr));
255f2e8686eSxun ni - Sun Microsystems - Beijing China 		(void) sprintf(sas_addr, "w%016"PRIx64, phyp->sas_addr);
256f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
257f2e8686eSxun ni - Sun Microsystems - Beijing China 			lrate = phyp->negotiated_link_rate;
258f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
259f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
260f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0) {
261f2e8686eSxun ni - Sun Microsystems - Beijing China 		(void) ddi_pathname(mpt->m_dip, pname);
262f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
263f2e8686eSxun ni - Sun Microsystems - Beijing China 
264f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, 0) != 0) {
265f2e8686eSxun ni - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN,
266f2e8686eSxun ni - Sun Microsystems - Beijing China 		    "%s: Failed to post sysevent", __func__);
267f2e8686eSxun ni - Sun Microsystems - Beijing China 		kmem_free(pname, MAXPATHLEN);
268f2e8686eSxun ni - Sun Microsystems - Beijing China 		return;
269f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
270f2e8686eSxun ni - Sun Microsystems - Beijing China 
271f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_add_int32(attr_list, SAS_DRV_INST,
272f2e8686eSxun ni - Sun Microsystems - Beijing China 	    ddi_get_instance(mpt->m_dip)) != 0)
273f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
274f2e8686eSxun ni - Sun Microsystems - Beijing China 
275f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_add_string(attr_list, SAS_PORT_ADDR, sas_addr) != 0)
276f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
277f2e8686eSxun ni - Sun Microsystems - Beijing China 
278f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_add_string(attr_list, SAS_DEVFS_PATH, pname) != 0)
279f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
280f2e8686eSxun ni - Sun Microsystems - Beijing China 
281f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_add_uint8(attr_list, SAS_PHY_ID, phynum) != 0)
282f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
283f2e8686eSxun ni - Sun Microsystems - Beijing China 
284f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
285f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (nvlist_add_uint8(attr_list, SAS_LINK_RATE, lrate) != 0)
286f2e8686eSxun ni - Sun Microsystems - Beijing China 			goto fail;
287f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
288f2e8686eSxun ni - Sun Microsystems - Beijing China 
289f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (nvlist_add_string(attr_list, SAS_EVENT_TYPE, etype) != 0)
290f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
291f2e8686eSxun ni - Sun Microsystems - Beijing China 
292f2e8686eSxun ni - Sun Microsystems - Beijing China 	(void) ddi_log_sysevent(mpt->m_dip, DDI_VENDOR_SUNW, EC_HBA, subclass,
293f2e8686eSxun ni - Sun Microsystems - Beijing China 	    attr_list, NULL, DDI_NOSLEEP);
294f2e8686eSxun ni - Sun Microsystems - Beijing China 
295f2e8686eSxun ni - Sun Microsystems - Beijing China fail:
296f2e8686eSxun ni - Sun Microsystems - Beijing China 	kmem_free(pname, MAXPATHLEN);
297f2e8686eSxun ni - Sun Microsystems - Beijing China 	nvlist_free(attr_list);
298f2e8686eSxun ni - Sun Microsystems - Beijing China }
299f2e8686eSxun ni - Sun Microsystems - Beijing China 
300f2e8686eSxun ni - Sun Microsystems - Beijing China void
mptsas_create_phy_stats(mptsas_t * mpt,char * iport,dev_info_t * dip)301f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_create_phy_stats(mptsas_t *mpt, char *iport, dev_info_t *dip)
302f2e8686eSxun ni - Sun Microsystems - Beijing China {
303f2e8686eSxun ni - Sun Microsystems - Beijing China 	sas_phy_stats_t		*ps;
304f2e8686eSxun ni - Sun Microsystems - Beijing China 	smhba_info_t		*phyp;
305f2e8686eSxun ni - Sun Microsystems - Beijing China 	int			ndata;
306f2e8686eSxun ni - Sun Microsystems - Beijing China 	char			ks_name[KSTAT_STRLEN];
307f2e8686eSxun ni - Sun Microsystems - Beijing China 	char			phymask[MPTSAS_MAX_PHYS];
308f2e8686eSxun ni - Sun Microsystems - Beijing China 	int			i;
309f2e8686eSxun ni - Sun Microsystems - Beijing China 
310f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(iport != NULL);
311f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(mpt != NULL);
312f2e8686eSxun ni - Sun Microsystems - Beijing China 
313f2e8686eSxun ni - Sun Microsystems - Beijing China 	for (i = 0; i < mpt->m_num_phys; i++) {
314f2e8686eSxun ni - Sun Microsystems - Beijing China 
315f2e8686eSxun ni - Sun Microsystems - Beijing China 		bzero(phymask, sizeof (phymask));
316f2e8686eSxun ni - Sun Microsystems - Beijing China 		(void) sprintf(phymask, "%x", mpt->m_phy_info[i].phy_mask);
317f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (strcmp(phymask, iport) == 0) {
318f2e8686eSxun ni - Sun Microsystems - Beijing China 
319f2e8686eSxun ni - Sun Microsystems - Beijing China 			phyp = &mpt->m_phy_info[i].smhba_info;
320f2e8686eSxun ni - Sun Microsystems - Beijing China 			mutex_enter(&phyp->phy_mutex);
321f2e8686eSxun ni - Sun Microsystems - Beijing China 
322f2e8686eSxun ni - Sun Microsystems - Beijing China 			if (phyp->phy_stats != NULL) {
323f2e8686eSxun ni - Sun Microsystems - Beijing China 				mutex_exit(&phyp->phy_mutex);
324f2e8686eSxun ni - Sun Microsystems - Beijing China 				/* We've already created this kstat instance */
325f2e8686eSxun ni - Sun Microsystems - Beijing China 				continue;
326f2e8686eSxun ni - Sun Microsystems - Beijing China 			}
327f2e8686eSxun ni - Sun Microsystems - Beijing China 
328f2e8686eSxun ni - Sun Microsystems - Beijing China 			ndata = (sizeof (sas_phy_stats_t)/
329f2e8686eSxun ni - Sun Microsystems - Beijing China 			    sizeof (kstat_named_t));
330f2e8686eSxun ni - Sun Microsystems - Beijing China 			(void) snprintf(ks_name, sizeof (ks_name),
331f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "%s.%llx.%d.%d", ddi_driver_name(dip),
332f2e8686eSxun ni - Sun Microsystems - Beijing China 			    (longlong_t)mpt->un.m_base_wwid,
333f2e8686eSxun ni - Sun Microsystems - Beijing China 			    ddi_get_instance(dip), i);
334f2e8686eSxun ni - Sun Microsystems - Beijing China 
335f2e8686eSxun ni - Sun Microsystems - Beijing China 			phyp->phy_stats = kstat_create("mptsas",
336f2e8686eSxun ni - Sun Microsystems - Beijing China 			    ddi_get_instance(dip), ks_name, KSTAT_SAS_PHY_CLASS,
337f2e8686eSxun ni - Sun Microsystems - Beijing China 			    KSTAT_TYPE_NAMED, ndata, 0);
338f2e8686eSxun ni - Sun Microsystems - Beijing China 
339f2e8686eSxun ni - Sun Microsystems - Beijing China 			if (phyp->phy_stats == NULL) {
340f2e8686eSxun ni - Sun Microsystems - Beijing China 				mutex_exit(&phyp->phy_mutex);
341f2e8686eSxun ni - Sun Microsystems - Beijing China 				mptsas_log(mpt, CE_WARN,
342f2e8686eSxun ni - Sun Microsystems - Beijing China 				    "%s: Failed to create %s kstats", __func__,
343f2e8686eSxun ni - Sun Microsystems - Beijing China 				    ks_name);
344f2e8686eSxun ni - Sun Microsystems - Beijing China 				continue;
345f2e8686eSxun ni - Sun Microsystems - Beijing China 			}
346f2e8686eSxun ni - Sun Microsystems - Beijing China 
347f2e8686eSxun ni - Sun Microsystems - Beijing China 			ps = (sas_phy_stats_t *)phyp->phy_stats->ks_data;
348f2e8686eSxun ni - Sun Microsystems - Beijing China 
349f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->seconds_since_last_reset,
350f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "SecondsSinceLastReset", KSTAT_DATA_ULONGLONG);
351f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->tx_frames,
352f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "TxFrames", KSTAT_DATA_ULONGLONG);
353f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->rx_frames,
354f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "RxFrames", KSTAT_DATA_ULONGLONG);
355f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->tx_words,
356f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "TxWords", KSTAT_DATA_ULONGLONG);
357f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->rx_words,
358f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "RxWords", KSTAT_DATA_ULONGLONG);
359f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->invalid_dword_count,
360f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "InvalidDwordCount", KSTAT_DATA_ULONGLONG);
361f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->running_disparity_error_count,
362f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "RunningDisparityErrorCount", KSTAT_DATA_ULONGLONG);
363f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->loss_of_dword_sync_count,
364f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "LossofDwordSyncCount", KSTAT_DATA_ULONGLONG);
365f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_named_init(&ps->phy_reset_problem_count,
366f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "PhyResetProblemCount", KSTAT_DATA_ULONGLONG);
367f2e8686eSxun ni - Sun Microsystems - Beijing China 
368f2e8686eSxun ni - Sun Microsystems - Beijing China 			phyp->phy_stats->ks_private = phyp;
369f2e8686eSxun ni - Sun Microsystems - Beijing China 			phyp->phy_stats->ks_update = mptsas_update_phy_stats;
370f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_install(phyp->phy_stats);
371f2e8686eSxun ni - Sun Microsystems - Beijing China 			mutex_exit(&phyp->phy_mutex);
372f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
373f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
374f2e8686eSxun ni - Sun Microsystems - Beijing China }
375f2e8686eSxun ni - Sun Microsystems - Beijing China 
376f2e8686eSxun ni - Sun Microsystems - Beijing China int
mptsas_update_phy_stats(kstat_t * ks,int rw)377f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_update_phy_stats(kstat_t *ks, int rw)
378f2e8686eSxun ni - Sun Microsystems - Beijing China {
379f2e8686eSxun ni - Sun Microsystems - Beijing China 	int			ret = DDI_FAILURE;
380f2e8686eSxun ni - Sun Microsystems - Beijing China 	smhba_info_t		*pptr = NULL;
381f2e8686eSxun ni - Sun Microsystems - Beijing China 	sas_phy_stats_t		*ps = ks->ks_data;
382*72a2c484SHans Rosenfeld 	uint32_t		page_address;
383*72a2c484SHans Rosenfeld 	mptsas_t		*mpt;
384f2e8686eSxun ni - Sun Microsystems - Beijing China 
385f2e8686eSxun ni - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(rw));
386f2e8686eSxun ni - Sun Microsystems - Beijing China 
387f2e8686eSxun ni - Sun Microsystems - Beijing China 	pptr = (smhba_info_t *)ks->ks_private;
388f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT((pptr != NULL));
389f2e8686eSxun ni - Sun Microsystems - Beijing China 	mpt = (mptsas_t *)pptr->mpt;
390f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT((mpt != NULL));
391f2e8686eSxun ni - Sun Microsystems - Beijing China 	page_address = (MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | pptr->phy_id);
392f2e8686eSxun ni - Sun Microsystems - Beijing China 
393f2e8686eSxun ni - Sun Microsystems - Beijing China 	/*
394f2e8686eSxun ni - Sun Microsystems - Beijing China 	 * We just want to lock against other invocations of kstat;
395f2e8686eSxun ni - Sun Microsystems - Beijing China 	 * we don't need to pmcs_lock_phy() for this.
396f2e8686eSxun ni - Sun Microsystems - Beijing China 	 */
397f2e8686eSxun ni - Sun Microsystems - Beijing China 	mutex_enter(&mpt->m_mutex);
398f2e8686eSxun ni - Sun Microsystems - Beijing China 
399f2e8686eSxun ni - Sun Microsystems - Beijing China 	ret = mptsas_get_sas_phy_page1(pptr->mpt, page_address, pptr);
400f2e8686eSxun ni - Sun Microsystems - Beijing China 
401f2e8686eSxun ni - Sun Microsystems - Beijing China 	if (ret == DDI_FAILURE)
402f2e8686eSxun ni - Sun Microsystems - Beijing China 		goto fail;
403f2e8686eSxun ni - Sun Microsystems - Beijing China 
404f2e8686eSxun ni - Sun Microsystems - Beijing China 	ps->invalid_dword_count.value.ull =
405f2e8686eSxun ni - Sun Microsystems - Beijing China 	    (unsigned long long)pptr->invalid_dword_count;
406f2e8686eSxun ni - Sun Microsystems - Beijing China 
407f2e8686eSxun ni - Sun Microsystems - Beijing China 	ps->running_disparity_error_count.value.ull =
408f2e8686eSxun ni - Sun Microsystems - Beijing China 	    (unsigned long long)pptr->running_disparity_error_count;
409f2e8686eSxun ni - Sun Microsystems - Beijing China 
410f2e8686eSxun ni - Sun Microsystems - Beijing China 	ps->loss_of_dword_sync_count.value.ull =
411f2e8686eSxun ni - Sun Microsystems - Beijing China 	    (unsigned long long)pptr->loss_of_dword_sync_count;
412f2e8686eSxun ni - Sun Microsystems - Beijing China 
413f2e8686eSxun ni - Sun Microsystems - Beijing China 	ps->phy_reset_problem_count.value.ull =
414f2e8686eSxun ni - Sun Microsystems - Beijing China 	    (unsigned long long)pptr->phy_reset_problem_count;
415f2e8686eSxun ni - Sun Microsystems - Beijing China 
416f2e8686eSxun ni - Sun Microsystems - Beijing China 	ret = DDI_SUCCESS;
417f2e8686eSxun ni - Sun Microsystems - Beijing China fail:
418f2e8686eSxun ni - Sun Microsystems - Beijing China 	mutex_exit(&mpt->m_mutex);
419f2e8686eSxun ni - Sun Microsystems - Beijing China 
420f2e8686eSxun ni - Sun Microsystems - Beijing China 	return (ret);
421f2e8686eSxun ni - Sun Microsystems - Beijing China }
422f2e8686eSxun ni - Sun Microsystems - Beijing China 
423f2e8686eSxun ni - Sun Microsystems - Beijing China void
mptsas_destroy_phy_stats(mptsas_t * mpt)424f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_destroy_phy_stats(mptsas_t *mpt)
425f2e8686eSxun ni - Sun Microsystems - Beijing China {
426f2e8686eSxun ni - Sun Microsystems - Beijing China 	smhba_info_t	*phyp;
427f2e8686eSxun ni - Sun Microsystems - Beijing China 	int			i = 0;
428f2e8686eSxun ni - Sun Microsystems - Beijing China 
429f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(mpt != NULL);
430f2e8686eSxun ni - Sun Microsystems - Beijing China 
431f2e8686eSxun ni - Sun Microsystems - Beijing China 	for (i = 0; i < mpt->m_num_phys; i++) {
432f2e8686eSxun ni - Sun Microsystems - Beijing China 		phyp = &mpt->m_phy_info[i].smhba_info;
433f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (phyp == NULL) {
434f2e8686eSxun ni - Sun Microsystems - Beijing China 			continue;
435f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
436f2e8686eSxun ni - Sun Microsystems - Beijing China 
437f2e8686eSxun ni - Sun Microsystems - Beijing China 		mutex_enter(&phyp->phy_mutex);
438f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (phyp->phy_stats != NULL) {
439f2e8686eSxun ni - Sun Microsystems - Beijing China 			kstat_delete(phyp->phy_stats);
440f2e8686eSxun ni - Sun Microsystems - Beijing China 			phyp->phy_stats = NULL;
441f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
442f2e8686eSxun ni - Sun Microsystems - Beijing China 		mutex_exit(&phyp->phy_mutex);
443f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
444f2e8686eSxun ni - Sun Microsystems - Beijing China }
445f2e8686eSxun ni - Sun Microsystems - Beijing China 
446f2e8686eSxun ni - Sun Microsystems - Beijing China int
mptsas_smhba_phy_init(mptsas_t * mpt)447f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_smhba_phy_init(mptsas_t *mpt)
448f2e8686eSxun ni - Sun Microsystems - Beijing China {
449f2e8686eSxun ni - Sun Microsystems - Beijing China 	int		i = 0;
450f2e8686eSxun ni - Sun Microsystems - Beijing China 	int		rval = DDI_SUCCESS;
451f2e8686eSxun ni - Sun Microsystems - Beijing China 	uint32_t	page_address;
452f2e8686eSxun ni - Sun Microsystems - Beijing China 
453f2e8686eSxun ni - Sun Microsystems - Beijing China 	ASSERT(mutex_owned(&mpt->m_mutex));
454f2e8686eSxun ni - Sun Microsystems - Beijing China 
455f2e8686eSxun ni - Sun Microsystems - Beijing China 	for (i = 0; i < mpt->m_num_phys; i++) {
456f2e8686eSxun ni - Sun Microsystems - Beijing China 		page_address =
457f2e8686eSxun ni - Sun Microsystems - Beijing China 		    (MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER |
458f2e8686eSxun ni - Sun Microsystems - Beijing China 		    (MPI2_SAS_PHY_PGAD_PHY_NUMBER_MASK & i));
459f2e8686eSxun ni - Sun Microsystems - Beijing China 		rval = mptsas_get_sas_phy_page0(mpt,
460f2e8686eSxun ni - Sun Microsystems - Beijing China 		    page_address, &mpt->m_phy_info[i].smhba_info);
461f2e8686eSxun ni - Sun Microsystems - Beijing China 		if (rval != DDI_SUCCESS) {
462f2e8686eSxun ni - Sun Microsystems - Beijing China 			mptsas_log(mpt, CE_WARN,
463f2e8686eSxun ni - Sun Microsystems - Beijing China 			    "Failed to get sas phy page 0"
464f2e8686eSxun ni - Sun Microsystems - Beijing China 			    " for each phy");
465f2e8686eSxun ni - Sun Microsystems - Beijing China 			return (DDI_FAILURE);
466f2e8686eSxun ni - Sun Microsystems - Beijing China 		}
467f2e8686eSxun ni - Sun Microsystems - Beijing China 		mpt->m_phy_info[i].smhba_info.phy_id = (uint8_t)i;
468f2e8686eSxun ni - Sun Microsystems - Beijing China 		mpt->m_phy_info[i].smhba_info.sas_addr =
469f2e8686eSxun ni - Sun Microsystems - Beijing China 		    mpt->un.m_base_wwid + i;
470f2e8686eSxun ni - Sun Microsystems - Beijing China 		mpt->m_phy_info[i].smhba_info.mpt = mpt;
471f2e8686eSxun ni - Sun Microsystems - Beijing China 	}
472a9b51062SAda 	return (DDI_SUCCESS);
473a9b51062SAda }
474a9b51062SAda 
475a9b51062SAda int
mptsas_smhba_setup(mptsas_t * mpt)476a9b51062SAda mptsas_smhba_setup(mptsas_t *mpt)
477a9b51062SAda {
478a9b51062SAda 	int		sm_hba = 1;
479a9b51062SAda 	char		chiprev, hw_rev[24];
480a9b51062SAda 	char		serial_number[72];
481a9b51062SAda 	int		protocol = 0;
482a9b51062SAda 
483a9b51062SAda 	mutex_enter(&mpt->m_mutex);
484a9b51062SAda 	if (mptsas_smhba_phy_init(mpt)) {
485a9b51062SAda 		mutex_exit(&mpt->m_mutex);
486a9b51062SAda 		return (DDI_FAILURE);
487a9b51062SAda 	}
488a9b51062SAda 	mutex_exit(&mpt->m_mutex);
489a9b51062SAda 
490a9b51062SAda 	/* SM-HBA support */
491a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32, MPTSAS_SMHBA_SUPPORTED,
492a9b51062SAda 	    &sm_hba);
493a9b51062SAda 
494a9b51062SAda 	/* SM-HBA driver version */
495a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_DRV_VERSION,
496a9b51062SAda 	    mptsas_driver_rev);
497a9b51062SAda 
498a9b51062SAda 	/* SM-HBA hardware version */
499a9b51062SAda 	chiprev = 'A' + mpt->m_revid;
500a9b51062SAda 	(void) snprintf(hw_rev, 2, "%s", &chiprev);
501a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_HWARE_VERSION,
502a9b51062SAda 	    hw_rev);
503a9b51062SAda 
504a9b51062SAda 	/* SM-HBA phy number per HBA */
505a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32, MPTSAS_NUM_PHYS_HBA,
506a9b51062SAda 	    &(mpt->m_num_phys));
507a9b51062SAda 
508a9b51062SAda 	/* SM-HBA protocal support */
509a9b51062SAda 	protocol = SAS_SSP_SUPPORT | SAS_SATA_SUPPORT | SAS_SMP_SUPPORT;
510a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32,
511a9b51062SAda 	    MPTSAS_SUPPORTED_PROTOCOL, &protocol);
512a9b51062SAda 
513a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_MANUFACTURER,
514a9b51062SAda 	    mpt->m_MANU_page0.ChipName);
515a9b51062SAda 
516a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_MODEL_NAME,
517a9b51062SAda 	    mpt->m_MANU_page0.BoardName);
518a9b51062SAda 
519a9b51062SAda 	/*
520a9b51062SAda 	 * VPD data is not available, we make a serial number for this.
521a9b51062SAda 	 */
522a9b51062SAda 
523a9b51062SAda 	(void) sprintf(serial_number, "%s%s%s%s%s",
524a9b51062SAda 	    mpt->m_MANU_page0.ChipName,
525a9b51062SAda 	    mpt->m_MANU_page0.ChipRevision,
526a9b51062SAda 	    mpt->m_MANU_page0.BoardName,
527a9b51062SAda 	    mpt->m_MANU_page0.BoardAssembly,
528a9b51062SAda 	    mpt->m_MANU_page0.BoardTracerNumber);
529a9b51062SAda 
530a9b51062SAda 	mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_SERIAL_NUMBER,
531a9b51062SAda 	    &serial_number[0]);
532f2e8686eSxun ni - Sun Microsystems - Beijing China 
533f2e8686eSxun ni - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
534f2e8686eSxun ni - Sun Microsystems - Beijing China }
535