1221167Sgnn/*-
2221167Sgnn * Copyright(c) 2002-2011 Exar Corp.
3221167Sgnn * All rights reserved.
4221167Sgnn *
5221167Sgnn * Redistribution and use in source and binary forms, with or without
6221167Sgnn * modification are permitted provided the following conditions are met:
7221167Sgnn *
8221167Sgnn *    1. Redistributions of source code must retain the above copyright notice,
9221167Sgnn *       this list of conditions and the following disclaimer.
10221167Sgnn *
11221167Sgnn *    2. Redistributions in binary form must reproduce the above copyright
12221167Sgnn *       notice, this list of conditions and the following disclaimer in the
13221167Sgnn *       documentation and/or other materials provided with the distribution.
14221167Sgnn *
15221167Sgnn *    3. Neither the name of the Exar Corporation nor the names of its
16221167Sgnn *       contributors may be used to endorse or promote products derived from
17221167Sgnn *       this software without specific prior written permission.
18221167Sgnn *
19221167Sgnn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20221167Sgnn * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21221167Sgnn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22221167Sgnn * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23221167Sgnn * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24221167Sgnn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25221167Sgnn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26221167Sgnn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27221167Sgnn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28221167Sgnn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29221167Sgnn * POSSIBILITY OF SUCH DAMAGE.
30221167Sgnn */
31221167Sgnn/*$FreeBSD$*/
32221167Sgnn
33221167Sgnn#include <dev/vxge/vxgehal/vxgehal.h>
34221167Sgnn
35221167Sgnn/*
36221167Sgnn * vxge_hal_mgmt_about - Retrieve about info.
37221167Sgnn * @devh: HAL device handle.
38221167Sgnn * @about_info: Filled in by HAL. See vxge_hal_mgmt_about_info_t {}.
39221167Sgnn * @size: Pointer to buffer containing the Size of the @buffer_info.
40221167Sgnn * HAL will return an error if the size is smaller than
41221167Sgnn * sizeof(vxge_hal_mgmt_about_info_t) and returns required size in this field
42221167Sgnn *
43221167Sgnn * Retrieve information such as PCI device and vendor IDs, board
44221167Sgnn * revision number, HAL version number, etc.
45221167Sgnn *
46221167Sgnn * Returns: VXGE_HAL_OK - success;
47221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
48221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
49221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient
50221167Sgnn * VXGE_HAL_FAIL - Failed to retrieve the information.
51221167Sgnn *
52221167Sgnn * See also: vxge_hal_mgmt_about_info_t {}.
53221167Sgnn */
54221167Sgnnvxge_hal_status_e
55221167Sgnnvxge_hal_mgmt_about(vxge_hal_device_h devh,
56221167Sgnn    vxge_hal_mgmt_about_info_t *about_info,
57221167Sgnn    u32 *size)
58221167Sgnn{
59221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
60221167Sgnn
61221167Sgnn	vxge_assert((hldev != NULL) && (about_info != NULL) && (size != NULL));
62221167Sgnn
63221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
64221167Sgnn	    __FILE__, __func__, __LINE__);
65221167Sgnn
66221167Sgnn	vxge_hal_trace_log_device(
67221167Sgnn	    "hldev = 0x"VXGE_OS_STXFMT", about_info = 0x"VXGE_OS_STXFMT", "
68221167Sgnn	    "size = 0x"VXGE_OS_STXFMT,
69221167Sgnn	    (ptr_t) hldev, (ptr_t) about_info, (ptr_t) size);
70221167Sgnn
71221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
72221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
73221167Sgnn		    __FILE__, __func__, __LINE__,
74221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
75221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
76221167Sgnn	}
77221167Sgnn
78221167Sgnn	if (*size < sizeof(vxge_hal_mgmt_about_info_t)) {
79221167Sgnn		*size = sizeof(vxge_hal_mgmt_about_info_t);
80221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
81221167Sgnn		    __FILE__, __func__, __LINE__,
82221167Sgnn		    VXGE_HAL_ERR_OUT_OF_SPACE);
83221167Sgnn		return (VXGE_HAL_ERR_OUT_OF_SPACE);
84221167Sgnn	}
85221167Sgnn
86221167Sgnn	about_info->vendor = hldev->pci_config_space_bios.vendor_id;
87221167Sgnn	about_info->device = hldev->pci_config_space_bios.device_id;
88221167Sgnn	about_info->subsys_vendor =
89221167Sgnn	    hldev->pci_config_space_bios.subsystem_vendor_id;
90221167Sgnn	about_info->subsys_device = hldev->pci_config_space_bios.subsystem_id;
91221167Sgnn	about_info->board_rev = hldev->pci_config_space_bios.revision;
92221167Sgnn
93221167Sgnn	vxge_os_strlcpy(about_info->vendor_name, VXGE_DRIVER_VENDOR,
94221167Sgnn	    sizeof(about_info->vendor_name));
95221167Sgnn	vxge_os_strlcpy(about_info->chip_name, VXGE_CHIP_FAMILY,
96221167Sgnn	    sizeof(about_info->chip_name));
97221167Sgnn	vxge_os_strlcpy(about_info->media, VXGE_SUPPORTED_MEDIA_0,
98221167Sgnn	    sizeof(about_info->media));
99221167Sgnn
100221167Sgnn	(void) vxge_os_snprintf(about_info->hal_major,
101221167Sgnn	    sizeof(about_info->hal_major), "%d", VXGE_HAL_VERSION_MAJOR);
102221167Sgnn	(void) vxge_os_snprintf(about_info->hal_minor,
103221167Sgnn	    sizeof(about_info->hal_minor), "%d", VXGE_HAL_VERSION_MINOR);
104221167Sgnn	(void) vxge_os_snprintf(about_info->hal_fix,
105221167Sgnn	    sizeof(about_info->hal_fix), "%d", VXGE_HAL_VERSION_FIX);
106221167Sgnn	(void) vxge_os_snprintf(about_info->hal_build,
107221167Sgnn	    sizeof(about_info->hal_build), "%d", VXGE_HAL_VERSION_BUILD);
108221167Sgnn
109221167Sgnn	(void) vxge_os_snprintf(about_info->ll_major,
110221167Sgnn	    sizeof(about_info->ll_major), "%d", XGELL_VERSION_MAJOR);
111221167Sgnn	(void) vxge_os_snprintf(about_info->ll_minor,
112221167Sgnn	    sizeof(about_info->ll_minor), "%d", XGELL_VERSION_MINOR);
113221167Sgnn	(void) vxge_os_snprintf(about_info->ll_fix,
114221167Sgnn	    sizeof(about_info->ll_fix), "%d", XGELL_VERSION_FIX);
115221167Sgnn	(void) vxge_os_snprintf(about_info->ll_build,
116221167Sgnn	    sizeof(about_info->ll_build), "%d", XGELL_VERSION_BUILD);
117221167Sgnn
118221167Sgnn	*size = sizeof(vxge_hal_mgmt_about_info_t);
119221167Sgnn
120221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
121221167Sgnn	    __FILE__, __func__, __LINE__);
122221167Sgnn
123221167Sgnn	return (VXGE_HAL_OK);
124221167Sgnn}
125221167Sgnn
126221167Sgnn/*
127221167Sgnn * vxge_hal_mgmt_pci_config - Retrieve PCI configuration.
128221167Sgnn * @devh: HAL device handle.
129221167Sgnn * @buffer: Buffer to return pci config.
130221167Sgnn * @size: Pointer to buffer containing the Size of the @buffer.
131221167Sgnn * HAL will return an error if the size is smaller than
132221167Sgnn * sizeof(vxge_hal_pci_config_t) and returns required size in this field
133221167Sgnn *
134221167Sgnn * Get PCI configuration. Permits to retrieve at run-time configuration
135221167Sgnn * values that were used to configure the device at load-time.
136221167Sgnn *
137221167Sgnn * Returns: VXGE_HAL_OK - success.
138221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
139221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
140221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient
141221167Sgnn *
142221167Sgnn */
143221167Sgnnvxge_hal_status_e
144221167Sgnnvxge_hal_mgmt_pci_config(vxge_hal_device_h devh, u8 *buffer, u32 *size)
145221167Sgnn{
146221167Sgnn	int i;
147221167Sgnn	vxge_hal_pci_config_t *pci_config = (vxge_hal_pci_config_t *) buffer;
148221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
149221167Sgnn
150221167Sgnn	vxge_assert((hldev != NULL) && (buffer != NULL) && (size != NULL));
151221167Sgnn
152221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
153221167Sgnn	    __FILE__, __func__, __LINE__);
154221167Sgnn
155221167Sgnn	vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT", "
156221167Sgnn	    "buffer = 0x"VXGE_OS_STXFMT", "
157221167Sgnn	    "size = 0x"VXGE_OS_STXFMT,
158221167Sgnn	    (ptr_t) hldev, (ptr_t) buffer, (ptr_t) size);
159221167Sgnn
160221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
161221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
162221167Sgnn		    __FILE__, __func__, __LINE__,
163221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
164221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
165221167Sgnn	}
166221167Sgnn
167221167Sgnn	if (*size < sizeof(vxge_hal_pci_config_t)) {
168221167Sgnn		*size = sizeof(vxge_hal_pci_config_t);
169221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
170221167Sgnn		    __FILE__, __func__, __LINE__,
171221167Sgnn		    VXGE_HAL_ERR_OUT_OF_SPACE);
172221167Sgnn		return (VXGE_HAL_ERR_OUT_OF_SPACE);
173221167Sgnn	}
174221167Sgnn
175221167Sgnn	/* refresh PCI config space */
176221167Sgnn	for (i = 0; i < VXGE_HAL_PCI_CONFIG_SPACE_SIZE / 4; i++) {
177221167Sgnn		(void) __hal_vpath_pci_read(hldev,
178221167Sgnn		    hldev->first_vp_id,
179221167Sgnn		    i * 4,
180221167Sgnn		    4,
181221167Sgnn		    (u32 *) ((void *)&hldev->pci_config_space) + i);
182221167Sgnn	}
183221167Sgnn
184221167Sgnn	vxge_os_memcpy(pci_config, &hldev->pci_config_space,
185221167Sgnn	    sizeof(vxge_hal_pci_config_t));
186221167Sgnn
187221167Sgnn	*size = sizeof(vxge_hal_pci_config_t);
188221167Sgnn
189221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
190221167Sgnn	    __FILE__, __func__, __LINE__);
191221167Sgnn
192221167Sgnn	return (VXGE_HAL_OK);
193221167Sgnn}
194221167Sgnn
195221167Sgnn/*
196221167Sgnn * vxge_hal_mgmt_msi_capabilities_get - Returns the msi capabilities
197221167Sgnn * @devh: HAL device handle.
198221167Sgnn * @msi_cap: MSI Capabilities
199221167Sgnn *
200221167Sgnn * Return the msi capabilities
201221167Sgnn */
202221167Sgnnvxge_hal_status_e
203221167Sgnnvxge_hal_mgmt_msi_capabilities_get(vxge_hal_device_h devh,
204221167Sgnn    vxge_hal_mgmt_msi_cap_t *msi_cap)
205221167Sgnn{
206221167Sgnn	u16 msi_control_reg;
207221167Sgnn	u32 addr32;
208221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
209221167Sgnn
210221167Sgnn	vxge_assert((hldev != NULL) && (msi_cap != NULL));
211221167Sgnn
212221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
213221167Sgnn	    __FILE__, __func__, __LINE__);
214221167Sgnn
215221167Sgnn	vxge_hal_trace_log_device(
216221167Sgnn	    "hldev = 0x"VXGE_OS_STXFMT", msi_cap = 0x"VXGE_OS_STXFMT,
217221167Sgnn	    (ptr_t) hldev, (ptr_t) msi_cap);
218221167Sgnn
219221167Sgnn	if (hldev->pci_caps.msi_cap_offset == 0) {
220221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
221221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
222221167Sgnn		return (VXGE_HAL_FAIL);
223221167Sgnn	}
224221167Sgnn
225221167Sgnn	vxge_os_memzero(msi_cap, sizeof(vxge_hal_mgmt_msi_cap_t));
226221167Sgnn
227221167Sgnn	(void) __hal_vpath_pci_read(hldev,
228221167Sgnn	    hldev->first_vp_id,
229221167Sgnn	    hldev->pci_caps.msi_cap_offset +
230221167Sgnn	    vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control),
231221167Sgnn	    2,
232221167Sgnn	    &msi_control_reg);
233221167Sgnn
234221167Sgnn	if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_ENABLE)
235221167Sgnn		msi_cap->enable = 1;
236221167Sgnn
237221167Sgnn	if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK)
238221167Sgnn		msi_cap->is_pvm_capable = 1;
239221167Sgnn
240221167Sgnn	if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_64BIT)
241221167Sgnn		msi_cap->is_64bit_addr_capable = 1;
242221167Sgnn
243221167Sgnn	msi_cap->vectors_allocated =
244221167Sgnn	    (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QSIZE) >> 4;
245221167Sgnn
246221167Sgnn	msi_cap->max_vectors_capable =
247221167Sgnn	    (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QMASK) >> 1;
248221167Sgnn
249221167Sgnn	if (msi_cap->is_64bit_addr_capable) {
250221167Sgnn		if (msi_cap->is_pvm_capable) {
251221167Sgnn			(void) __hal_vpath_pci_read(hldev,
252221167Sgnn			    hldev->first_vp_id,
253221167Sgnn			    hldev->pci_caps.msi_cap_offset +
254221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
255221167Sgnn			    au.ma64_pvm.msi_addr_hi),
256221167Sgnn			    4, &addr32);
257221167Sgnn
258221167Sgnn			msi_cap->address = ((u64) addr32) << 32;
259221167Sgnn
260221167Sgnn			(void) __hal_vpath_pci_read(hldev,
261221167Sgnn			    hldev->first_vp_id,
262221167Sgnn			    hldev->pci_caps.msi_cap_offset +
263221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
264221167Sgnn			    au.ma64_pvm.msi_addr_lo),
265221167Sgnn			    4, &addr32);
266221167Sgnn
267221167Sgnn			msi_cap->address |= (u64) addr32;
268221167Sgnn
269221167Sgnn			(void) __hal_vpath_pci_read(hldev,
270221167Sgnn			    hldev->first_vp_id,
271221167Sgnn			    hldev->pci_caps.msi_cap_offset +
272221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
273221167Sgnn			    au.ma64_pvm.msi_data),
274221167Sgnn			    2, &msi_cap->data);
275221167Sgnn
276221167Sgnn			(void) __hal_vpath_pci_read(hldev,
277221167Sgnn			    hldev->first_vp_id,
278221167Sgnn			    hldev->pci_caps.msi_cap_offset +
279221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
280221167Sgnn			    au.ma64_pvm.msi_mask),
281221167Sgnn			    4, &msi_cap->mask_bits);
282221167Sgnn
283221167Sgnn			(void) __hal_vpath_pci_read(hldev,
284221167Sgnn			    hldev->first_vp_id,
285221167Sgnn			    hldev->pci_caps.msi_cap_offset +
286221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
287221167Sgnn			    au.ma64_pvm.msi_pending),
288221167Sgnn			    4, &msi_cap->pending_bits);
289221167Sgnn		} else {
290221167Sgnn			(void) __hal_vpath_pci_read(hldev,
291221167Sgnn			    hldev->first_vp_id,
292221167Sgnn			    hldev->pci_caps.msi_cap_offset +
293221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
294221167Sgnn			    au.ma64_no_pvm.msi_addr_hi),
295221167Sgnn			    4, &addr32);
296221167Sgnn
297221167Sgnn			msi_cap->address = ((u64) addr32) << 32;
298221167Sgnn
299221167Sgnn			(void) __hal_vpath_pci_read(hldev,
300221167Sgnn			    hldev->first_vp_id,
301221167Sgnn			    hldev->pci_caps.msi_cap_offset +
302221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
303221167Sgnn			    au.ma64_no_pvm.msi_addr_lo),
304221167Sgnn			    4, &addr32);
305221167Sgnn
306221167Sgnn			msi_cap->address |= (u64) addr32;
307221167Sgnn
308221167Sgnn			(void) __hal_vpath_pci_read(hldev,
309221167Sgnn			    hldev->first_vp_id,
310221167Sgnn			    hldev->pci_caps.msi_cap_offset +
311221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
312221167Sgnn			    au.ma64_no_pvm.msi_data),
313221167Sgnn			    2, &msi_cap->data);
314221167Sgnn
315221167Sgnn		}
316221167Sgnn	} else {
317221167Sgnn		if (msi_cap->is_pvm_capable) {
318221167Sgnn			(void) __hal_vpath_pci_read(hldev,
319221167Sgnn			    hldev->first_vp_id,
320221167Sgnn			    hldev->pci_caps.msi_cap_offset +
321221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
322221167Sgnn			    au.ma32_pvm.msi_addr),
323221167Sgnn			    4, &addr32);
324221167Sgnn
325221167Sgnn			msi_cap->address = (u64) addr32;
326221167Sgnn
327221167Sgnn			(void) __hal_vpath_pci_read(hldev,
328221167Sgnn			    hldev->first_vp_id,
329221167Sgnn			    hldev->pci_caps.msi_cap_offset +
330221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
331221167Sgnn			    au.ma32_pvm.msi_data),
332221167Sgnn			    2, &msi_cap->data);
333221167Sgnn
334221167Sgnn			(void) __hal_vpath_pci_read(hldev,
335221167Sgnn			    hldev->first_vp_id,
336221167Sgnn			    hldev->pci_caps.msi_cap_offset +
337221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
338221167Sgnn			    au.ma32_pvm.msi_mask),
339221167Sgnn			    4, &msi_cap->mask_bits);
340221167Sgnn
341221167Sgnn			(void) __hal_vpath_pci_read(hldev,
342221167Sgnn			    hldev->first_vp_id,
343221167Sgnn			    hldev->pci_caps.msi_cap_offset +
344221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
345221167Sgnn			    au.ma32_pvm.msi_pending),
346221167Sgnn			    4, &msi_cap->pending_bits);
347221167Sgnn
348221167Sgnn		} else {
349221167Sgnn			(void) __hal_vpath_pci_read(hldev,
350221167Sgnn			    hldev->first_vp_id,
351221167Sgnn			    hldev->pci_caps.msi_cap_offset +
352221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
353221167Sgnn			    au.ma32_no_pvm.msi_addr),
354221167Sgnn			    4, &addr32);
355221167Sgnn
356221167Sgnn			msi_cap->address = (u64) addr32;
357221167Sgnn
358221167Sgnn			(void) __hal_vpath_pci_read(hldev,
359221167Sgnn			    hldev->first_vp_id,
360221167Sgnn			    hldev->pci_caps.msi_cap_offset +
361221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
362221167Sgnn			    au.ma32_no_pvm.msi_data),
363221167Sgnn			    2, &msi_cap->data);
364221167Sgnn		}
365221167Sgnn	}
366221167Sgnn
367221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
368221167Sgnn	    __FILE__, __func__, __LINE__);
369221167Sgnn	return (VXGE_HAL_OK);
370221167Sgnn}
371221167Sgnn
372221167Sgnn/*
373221167Sgnn * vxge_hal_mgmt_msi_capabilities_set - Sets the msi capabilities
374221167Sgnn * @devh: HAL device handle.
375221167Sgnn * @msi_cap: MSI Capabilities
376221167Sgnn *
377221167Sgnn * Sets the msi capabilities
378221167Sgnn */
379221167Sgnnvxge_hal_status_e
380221167Sgnnvxge_hal_mgmt_msi_capabilities_set(vxge_hal_device_h devh,
381221167Sgnn    vxge_hal_mgmt_msi_cap_t *msi_cap)
382221167Sgnn{
383221167Sgnn	u16 msi_control_reg;
384221167Sgnn	u32 addr32;
385221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
386221167Sgnn
387221167Sgnn	vxge_assert((hldev != NULL) && (msi_cap != NULL));
388221167Sgnn
389221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
390221167Sgnn	    __FILE__, __func__, __LINE__);
391221167Sgnn
392221167Sgnn	vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT","
393221167Sgnn	    "msi_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) msi_cap);
394221167Sgnn
395221167Sgnn	if (hldev->pci_caps.msi_cap_offset == 0) {
396221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
397221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
398221167Sgnn		return (VXGE_HAL_FAIL);
399221167Sgnn	}
400221167Sgnn
401221167Sgnn	(void) __hal_vpath_pci_read(hldev,
402221167Sgnn	    hldev->first_vp_id,
403221167Sgnn	    hldev->pci_caps.msi_cap_offset +
404221167Sgnn	    vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control),
405221167Sgnn	    2, &msi_control_reg);
406221167Sgnn
407221167Sgnn	if (msi_cap->enable)
408221167Sgnn		msi_control_reg |= VXGE_HAL_PCI_MSI_FLAGS_ENABLE;
409221167Sgnn	else
410221167Sgnn		msi_control_reg &= ~VXGE_HAL_PCI_MSI_FLAGS_ENABLE;
411221167Sgnn
412221167Sgnn	if (msi_cap->vectors_allocated >
413221167Sgnn	    (u32) ((msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QMASK) >> 1)) {
414221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
415221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
416221167Sgnn		return (VXGE_HAL_FAIL);
417221167Sgnn	}
418221167Sgnn
419221167Sgnn	msi_control_reg &= ~VXGE_HAL_PCI_MSI_FLAGS_QSIZE;
420221167Sgnn
421221167Sgnn	msi_control_reg |= (msi_cap->vectors_allocated & 0x7) << 4;
422221167Sgnn
423221167Sgnn	if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_64BIT) {
424221167Sgnn		if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK) {
425221167Sgnn
426221167Sgnn			addr32 = (u32) (msi_cap->address >> 32);
427221167Sgnn
428221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
429221167Sgnn			    hldev->header.cfgh,
430221167Sgnn			    hldev->pci_caps.msi_cap_offset +
431221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
432221167Sgnn			    au.ma64_pvm.msi_addr_hi), addr32);
433221167Sgnn
434221167Sgnn			addr32 = (u32) msi_cap->address;
435221167Sgnn
436221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
437221167Sgnn			    hldev->header.cfgh,
438221167Sgnn			    hldev->pci_caps.msi_cap_offset +
439221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
440221167Sgnn			    au.ma64_pvm.msi_addr_lo), addr32);
441221167Sgnn
442221167Sgnn			vxge_os_pci_write16(hldev->header.pdev,
443221167Sgnn			    hldev->header.cfgh,
444221167Sgnn			    hldev->pci_caps.msi_cap_offset +
445221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
446221167Sgnn			    au.ma64_pvm.msi_data), msi_cap->data);
447221167Sgnn
448221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
449221167Sgnn			    hldev->header.cfgh,
450221167Sgnn			    hldev->pci_caps.msi_cap_offset +
451221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
452221167Sgnn			    au.ma64_pvm.msi_mask), msi_cap->mask_bits);
453221167Sgnn
454221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
455221167Sgnn			    hldev->header.cfgh,
456221167Sgnn			    hldev->pci_caps.msi_cap_offset +
457221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
458221167Sgnn			    au.ma64_pvm.msi_pending), msi_cap->pending_bits);
459221167Sgnn		} else {
460221167Sgnn			addr32 = (u32) (msi_cap->address >> 32);
461221167Sgnn
462221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
463221167Sgnn			    hldev->header.cfgh,
464221167Sgnn			    hldev->pci_caps.msi_cap_offset +
465221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
466221167Sgnn			    au.ma64_no_pvm.msi_addr_hi), addr32);
467221167Sgnn
468221167Sgnn			addr32 = (u32) msi_cap->address;
469221167Sgnn
470221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
471221167Sgnn			    hldev->header.cfgh,
472221167Sgnn			    hldev->pci_caps.msi_cap_offset +
473221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
474221167Sgnn			    au.ma64_no_pvm.msi_addr_lo), addr32);
475221167Sgnn
476221167Sgnn			vxge_os_pci_write16(hldev->header.pdev,
477221167Sgnn			    hldev->header.cfgh,
478221167Sgnn			    hldev->pci_caps.msi_cap_offset +
479221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
480221167Sgnn			    au.ma64_no_pvm.msi_data), msi_cap->data);
481221167Sgnn
482221167Sgnn		}
483221167Sgnn	} else {
484221167Sgnn		if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK) {
485221167Sgnn
486221167Sgnn			addr32 = (u32) msi_cap->address;
487221167Sgnn
488221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
489221167Sgnn			    hldev->header.cfgh,
490221167Sgnn			    hldev->pci_caps.msi_cap_offset +
491221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
492221167Sgnn			    au.ma32_pvm.msi_addr), addr32);
493221167Sgnn
494221167Sgnn			vxge_os_pci_write16(hldev->header.pdev,
495221167Sgnn			    hldev->header.cfgh,
496221167Sgnn			    hldev->pci_caps.msi_cap_offset +
497221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
498221167Sgnn			    au.ma32_pvm.msi_data), msi_cap->data);
499221167Sgnn
500221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
501221167Sgnn			    hldev->header.cfgh,
502221167Sgnn			    hldev->pci_caps.msi_cap_offset +
503221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
504221167Sgnn			    au.ma32_pvm.msi_mask), msi_cap->mask_bits);
505221167Sgnn
506221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
507221167Sgnn			    hldev->header.cfgh,
508221167Sgnn			    hldev->pci_caps.msi_cap_offset +
509221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
510221167Sgnn			    au.ma32_pvm.msi_pending), msi_cap->pending_bits);
511221167Sgnn
512221167Sgnn		} else {
513221167Sgnn			addr32 = (u32) msi_cap->address;
514221167Sgnn
515221167Sgnn			vxge_os_pci_write32(hldev->header.pdev,
516221167Sgnn			    hldev->header.cfgh,
517221167Sgnn			    hldev->pci_caps.msi_cap_offset +
518221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
519221167Sgnn			    au.ma32_no_pvm.msi_addr), addr32);
520221167Sgnn
521221167Sgnn			vxge_os_pci_write16(hldev->header.pdev,
522221167Sgnn			    hldev->header.cfgh,
523221167Sgnn			    hldev->pci_caps.msi_cap_offset +
524221167Sgnn			    vxge_offsetof(vxge_hal_msi_capability_le_t,
525221167Sgnn			    au.ma32_no_pvm.msi_data), msi_cap->data);
526221167Sgnn		}
527221167Sgnn	}
528221167Sgnn
529221167Sgnn	vxge_os_pci_write16(hldev->header.pdev, hldev->header.cfgh,
530221167Sgnn	    hldev->pci_caps.msi_cap_offset +
531221167Sgnn	    vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control),
532221167Sgnn	    msi_control_reg);
533221167Sgnn
534221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
535221167Sgnn	    __FILE__, __func__, __LINE__);
536221167Sgnn
537221167Sgnn	return (VXGE_HAL_OK);
538221167Sgnn}
539221167Sgnn
540221167Sgnn/*
541221167Sgnn * vxge_hal_mgmt_msix_capabilities_get - Returns the msix capabilities
542221167Sgnn * @devh: HAL device handle.
543221167Sgnn * @msix_cap: MSIX Capabilities
544221167Sgnn *
545221167Sgnn * Return the msix capabilities
546221167Sgnn */
547221167Sgnnvxge_hal_status_e
548221167Sgnnvxge_hal_mgmt_msix_capabilities_get(vxge_hal_device_h devh,
549221167Sgnn    vxge_hal_mgmt_msix_cap_t *msix_cap)
550221167Sgnn{
551221167Sgnn	u16 msix_control_reg;
552221167Sgnn	u32 msix_offset;
553221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
554221167Sgnn
555221167Sgnn	vxge_assert((hldev != NULL) && (msix_cap != NULL));
556221167Sgnn
557221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
558221167Sgnn	    __FILE__, __func__, __LINE__);
559221167Sgnn
560221167Sgnn	vxge_hal_trace_log_device(
561221167Sgnn	    "hldev = 0x"VXGE_OS_STXFMT", msix_cap = 0x"VXGE_OS_STXFMT,
562221167Sgnn	    (ptr_t) hldev, (ptr_t) msix_cap);
563221167Sgnn
564221167Sgnn	if (hldev->pci_caps.msix_cap_offset == 0) {
565221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
566221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
567221167Sgnn		return (VXGE_HAL_FAIL);
568221167Sgnn	}
569221167Sgnn
570221167Sgnn	vxge_os_memzero(msix_cap, sizeof(vxge_hal_mgmt_msix_cap_t));
571221167Sgnn
572221167Sgnn	(void) __hal_vpath_pci_read(hldev,
573221167Sgnn	    hldev->first_vp_id,
574221167Sgnn	    hldev->pci_caps.msix_cap_offset +
575221167Sgnn	    vxge_offsetof(vxge_hal_msix_capability_le_t, msix_control),
576221167Sgnn	    2, &msix_control_reg);
577221167Sgnn
578221167Sgnn	if (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_ENABLE)
579221167Sgnn		msix_cap->enable = 1;
580221167Sgnn
581221167Sgnn	if (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_MASK)
582221167Sgnn		msix_cap->mask_all_vect = 1;
583221167Sgnn
584221167Sgnn	msix_cap->table_size =
585221167Sgnn	    (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_TSIZE) + 1;
586221167Sgnn
587221167Sgnn	(void) __hal_vpath_pci_read(hldev,
588221167Sgnn	    hldev->first_vp_id,
589221167Sgnn	    hldev->pci_caps.msix_cap_offset +
590221167Sgnn	    vxge_offsetof(vxge_hal_msix_capability_le_t, table_offset),
591221167Sgnn	    4, &msix_offset);
592221167Sgnn
593221167Sgnn	msix_cap->table_offset =
594221167Sgnn	    (msix_offset & VXGE_HAL_PCI_MSIX_TABLE_OFFSET) >> 3;
595221167Sgnn
596221167Sgnn	msix_cap->table_bir = msix_offset & VXGE_HAL_PCI_MSIX_TABLE_BIR;
597221167Sgnn
598221167Sgnn	(void) __hal_vpath_pci_read(hldev,
599221167Sgnn	    hldev->first_vp_id,
600221167Sgnn	    hldev->pci_caps.msix_cap_offset +
601221167Sgnn	    vxge_offsetof(vxge_hal_msix_capability_le_t, pba_offset),
602221167Sgnn	    4, &msix_offset);
603221167Sgnn
604221167Sgnn	msix_cap->pba_offset =
605221167Sgnn	    (msix_offset & VXGE_HAL_PCI_MSIX_PBA_OFFSET) >> 3;
606221167Sgnn
607221167Sgnn	msix_cap->pba_bir = msix_offset & VXGE_HAL_PCI_MSIX_PBA_BIR;
608221167Sgnn
609221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
610221167Sgnn	    __FILE__, __func__, __LINE__);
611221167Sgnn	return (VXGE_HAL_OK);
612221167Sgnn}
613221167Sgnn
614221167Sgnn/*
615221167Sgnn * vxge_hal_mgmt_pm_capabilities_get - Returns the pm capabilities
616221167Sgnn * @devh: HAL device handle.
617221167Sgnn * @pm_cap: pm Capabilities
618221167Sgnn *
619221167Sgnn * Return the pm capabilities
620221167Sgnn */
621221167Sgnnvxge_hal_status_e
622221167Sgnnvxge_hal_mgmt_pm_capabilities_get(vxge_hal_device_h devh,
623221167Sgnn    vxge_hal_mgmt_pm_cap_t *pm_cap)
624221167Sgnn{
625221167Sgnn	u16 pm_cap_reg;
626221167Sgnn	u16 pm_control_reg;
627221167Sgnn	u8 pm_ppb_ext;
628221167Sgnn	u8 pm_data_reg;
629221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
630221167Sgnn
631221167Sgnn	vxge_assert((hldev != NULL) && (pm_cap != NULL));
632221167Sgnn
633221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
634221167Sgnn	    __FILE__, __func__, __LINE__);
635221167Sgnn
636221167Sgnn	vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT", "
637221167Sgnn	    "pm_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) pm_cap);
638221167Sgnn
639221167Sgnn	if (hldev->pci_caps.pm_cap_offset == 0) {
640221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
641221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
642221167Sgnn		return (VXGE_HAL_FAIL);
643221167Sgnn	}
644221167Sgnn
645221167Sgnn	vxge_os_memzero(pm_cap, sizeof(vxge_hal_mgmt_pm_cap_t));
646221167Sgnn
647221167Sgnn	(void) __hal_vpath_pci_read(hldev,
648221167Sgnn	    hldev->first_vp_id,
649221167Sgnn	    hldev->pci_caps.pm_cap_offset +
650221167Sgnn	    vxge_offsetof(vxge_hal_pm_capability_le_t, capabilities_reg),
651221167Sgnn	    2, &pm_cap_reg);
652221167Sgnn
653221167Sgnn	pm_cap->pm_cap_ver =
654221167Sgnn	    (u32) (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_VER_MASK);
655221167Sgnn
656221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_CLOCK)
657221167Sgnn		pm_cap->pm_cap_pme_clock = 1;
658221167Sgnn
659221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_AUX_POWER)
660221167Sgnn		pm_cap->pm_cap_aux_power = 1;
661221167Sgnn
662221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_DSI)
663221167Sgnn		pm_cap->pm_cap_dsi = 1;
664221167Sgnn
665221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_AUX_CURRENT)
666221167Sgnn		pm_cap->pm_cap_aux_current = 1;
667221167Sgnn
668221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_D1)
669221167Sgnn		pm_cap->pm_cap_cap_d0 = 1;
670221167Sgnn
671221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_D2)
672221167Sgnn		pm_cap->pm_cap_cap_d1 = 1;
673221167Sgnn
674221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D0)
675221167Sgnn		pm_cap->pm_cap_pme_d0 = 1;
676221167Sgnn
677221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D1)
678221167Sgnn		pm_cap->pm_cap_pme_d1 = 1;
679221167Sgnn
680221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D2)
681221167Sgnn		pm_cap->pm_cap_pme_d2 = 1;
682221167Sgnn
683221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D3_HOT)
684221167Sgnn		pm_cap->pm_cap_pme_d3_hot = 1;
685221167Sgnn
686221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D3_COLD)
687221167Sgnn		pm_cap->pm_cap_pme_d3_cold = 1;
688221167Sgnn
689221167Sgnn	(void) __hal_vpath_pci_read(hldev,
690221167Sgnn	    hldev->first_vp_id,
691221167Sgnn	    hldev->pci_caps.pm_cap_offset +
692221167Sgnn	    vxge_offsetof(vxge_hal_pm_capability_le_t, pm_ctrl),
693221167Sgnn	    2, &pm_control_reg);
694221167Sgnn
695221167Sgnn	pm_cap->pm_ctrl_state =
696221167Sgnn	    pm_control_reg & VXGE_HAL_PCI_PM_CTRL_STATE_MASK;
697221167Sgnn
698221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_NO_SOFT_RESET)
699221167Sgnn		pm_cap->pm_ctrl_no_soft_reset = 1;
700221167Sgnn
701221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_PME_ENABLE)
702221167Sgnn		pm_cap->pm_ctrl_pme_enable = 1;
703221167Sgnn
704221167Sgnn	pm_cap->pm_ctrl_pme_data_sel =
705221167Sgnn	    (u32) (pm_control_reg & VXGE_HAL_PCI_PM_CTRL_DATA_SEL_MASK) >> 10;
706221167Sgnn
707221167Sgnn	pm_cap->pm_ctrl_pme_data_scale =
708221167Sgnn	    (u32) (pm_control_reg & VXGE_HAL_PCI_PM_CTRL_DATA_SCALE_MASK) >> 13;
709221167Sgnn
710221167Sgnn	if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_PME_STATUS)
711221167Sgnn		pm_cap->pm_ctrl_pme_status = 1;
712221167Sgnn
713221167Sgnn	(void) __hal_vpath_pci_read(hldev,
714221167Sgnn	    hldev->first_vp_id,
715221167Sgnn	    hldev->pci_caps.pm_cap_offset +
716221167Sgnn	    vxge_offsetof(vxge_hal_pm_capability_le_t, pm_ctrl),
717221167Sgnn	    1, &pm_ppb_ext);
718221167Sgnn
719221167Sgnn	if (pm_ppb_ext & VXGE_HAL_PCI_PM_PPB_B2_B3)
720221167Sgnn		pm_cap->pm_ppb_ext_b2_b3 = 1;
721221167Sgnn
722221167Sgnn	if (pm_ppb_ext & VXGE_HAL_PCI_PM_BPCC_ENABLE)
723221167Sgnn		pm_cap->pm_ppb_ext_ecc_en = 1;
724221167Sgnn
725221167Sgnn	(void) __hal_vpath_pci_read(hldev,
726221167Sgnn	    hldev->first_vp_id,
727221167Sgnn	    hldev->pci_caps.pm_cap_offset +
728221167Sgnn	    vxge_offsetof(vxge_hal_pm_capability_le_t, pm_data_reg),
729221167Sgnn	    1, &pm_data_reg);
730221167Sgnn
731221167Sgnn	pm_cap->pm_data_reg = (u32) pm_data_reg;
732221167Sgnn
733221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
734221167Sgnn	    __FILE__, __func__, __LINE__);
735221167Sgnn	return (VXGE_HAL_OK);
736221167Sgnn}
737221167Sgnn
738221167Sgnn/*
739221167Sgnn * vxge_hal_mgmt_sid_capabilities_get - Returns the sid capabilities
740221167Sgnn * @devh: HAL device handle.
741221167Sgnn * @sid_cap: Slot Id Capabilities
742221167Sgnn *
743221167Sgnn * Return the Slot Id capabilities
744221167Sgnn */
745221167Sgnnvxge_hal_status_e
746221167Sgnnvxge_hal_mgmt_sid_capabilities_get(vxge_hal_device_h devh,
747221167Sgnn    vxge_hal_mgmt_sid_cap_t *sid_cap)
748221167Sgnn{
749221167Sgnn	u8 chasis_num_reg;
750221167Sgnn	u8 slot_num_reg;
751221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
752221167Sgnn
753221167Sgnn	vxge_assert((hldev != NULL) && (sid_cap != NULL));
754221167Sgnn
755221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
756221167Sgnn	    __FILE__, __func__, __LINE__);
757221167Sgnn
758221167Sgnn	vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT
759221167Sgnn	    ", sid_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) sid_cap);
760221167Sgnn
761221167Sgnn	if (hldev->pci_caps.sid_cap_offset == 0) {
762221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
763221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
764221167Sgnn		return (VXGE_HAL_FAIL);
765221167Sgnn	}
766221167Sgnn
767221167Sgnn	vxge_os_memzero(sid_cap, sizeof(vxge_hal_mgmt_sid_cap_t));
768221167Sgnn
769221167Sgnn	(void) __hal_vpath_pci_read(hldev,
770221167Sgnn	    hldev->first_vp_id,
771221167Sgnn	    hldev->pci_caps.sid_cap_offset +
772221167Sgnn	    vxge_offsetof(vxge_hal_sid_capability_le_t, sid_esr),
773221167Sgnn	    1, &slot_num_reg);
774221167Sgnn
775221167Sgnn	sid_cap->sid_number_of_slots =
776221167Sgnn	    (u32) (slot_num_reg & VXGE_HAL_PCI_SID_ESR_NSLOTS);
777221167Sgnn
778221167Sgnn	if (slot_num_reg & VXGE_HAL_PCI_SID_ESR_FIC)
779221167Sgnn		sid_cap->sid_number_of_slots = 1;
780221167Sgnn
781221167Sgnn	(void) __hal_vpath_pci_read(hldev,
782221167Sgnn	    hldev->first_vp_id,
783221167Sgnn	    hldev->pci_caps.sid_cap_offset +
784221167Sgnn	    vxge_offsetof(vxge_hal_sid_capability_le_t, sid_chasis_nr),
785221167Sgnn	    1, &chasis_num_reg);
786221167Sgnn
787221167Sgnn	sid_cap->sid_chasis_number = (u32) chasis_num_reg;
788221167Sgnn
789221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
790221167Sgnn	    __FILE__, __func__, __LINE__);
791221167Sgnn
792221167Sgnn	return (VXGE_HAL_OK);
793221167Sgnn}
794221167Sgnn
795221167Sgnn/*
796221167Sgnn * vxge_hal_mgmt_pci_err_capabilities_get - Returns the pci error capabilities
797221167Sgnn * @devh: HAL device handle.
798221167Sgnn * @err_cap: PCI-E Extended Error Capabilities
799221167Sgnn *
800221167Sgnn * Return the PCI-E Extended Error capabilities
801221167Sgnn */
802221167Sgnnvxge_hal_status_e
803221167Sgnnvxge_hal_mgmt_pci_err_capabilities_get(vxge_hal_device_h devh,
804221167Sgnn    vxge_hal_pci_err_cap_t *err_cap)
805221167Sgnn{
806221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
807221167Sgnn
808221167Sgnn	vxge_assert((hldev != NULL) && (err_cap != NULL));
809221167Sgnn
810221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
811221167Sgnn	    __FILE__, __func__, __LINE__);
812221167Sgnn
813221167Sgnn	vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT
814221167Sgnn	    ",sid_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) err_cap);
815221167Sgnn
816221167Sgnn	if (hldev->pci_e_ext_caps.err_cap_offset == 0) {
817221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
818221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
819221167Sgnn		return (VXGE_HAL_FAIL);
820221167Sgnn	}
821221167Sgnn
822221167Sgnn	vxge_os_memzero(err_cap, sizeof(vxge_hal_pci_err_cap_t));
823221167Sgnn
824221167Sgnn	(void) __hal_vpath_pci_read(hldev,
825221167Sgnn	    hldev->first_vp_id,
826221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
827221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_header),
828221167Sgnn	    4,
829221167Sgnn	    &err_cap->pci_err_header);
830221167Sgnn
831221167Sgnn	(void) __hal_vpath_pci_read(hldev,
832221167Sgnn	    hldev->first_vp_id,
833221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
834221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_status),
835221167Sgnn	    4,
836221167Sgnn	    &err_cap->pci_err_uncor_status);
837221167Sgnn
838221167Sgnn	(void) __hal_vpath_pci_read(hldev,
839221167Sgnn	    hldev->first_vp_id,
840221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
841221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_mask),
842221167Sgnn	    4,
843221167Sgnn	    &err_cap->pci_err_uncor_mask);
844221167Sgnn
845221167Sgnn	(void) __hal_vpath_pci_read(hldev,
846221167Sgnn	    hldev->first_vp_id,
847221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
848221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_server),
849221167Sgnn	    4,
850221167Sgnn	    &err_cap->pci_err_uncor_server);
851221167Sgnn
852221167Sgnn	(void) __hal_vpath_pci_read(hldev,
853221167Sgnn	    hldev->first_vp_id,
854221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
855221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_cor_status),
856221167Sgnn	    4,
857221167Sgnn	    &err_cap->pci_err_cor_status);
858221167Sgnn
859221167Sgnn	(void) __hal_vpath_pci_read(hldev,
860221167Sgnn	    hldev->first_vp_id,
861221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
862221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_cap),
863221167Sgnn	    4,
864221167Sgnn	    &err_cap->pci_err_cap);
865221167Sgnn
866221167Sgnn	(void) __hal_vpath_pci_read(hldev,
867221167Sgnn	    hldev->first_vp_id,
868221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
869221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, err_header_log),
870221167Sgnn	    4,
871221167Sgnn	    &err_cap->err_header_log);
872221167Sgnn
873221167Sgnn	(void) __hal_vpath_pci_read(hldev,
874221167Sgnn	    hldev->first_vp_id,
875221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
876221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_command),
877221167Sgnn	    4,
878221167Sgnn	    &err_cap->pci_err_root_command);
879221167Sgnn
880221167Sgnn	(void) __hal_vpath_pci_read(hldev,
881221167Sgnn	    hldev->first_vp_id,
882221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
883221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_status),
884221167Sgnn	    4,
885221167Sgnn	    &err_cap->pci_err_root_status);
886221167Sgnn
887221167Sgnn	(void) __hal_vpath_pci_read(hldev,
888221167Sgnn	    hldev->first_vp_id,
889221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
890221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_cor_src),
891221167Sgnn	    4,
892221167Sgnn	    &err_cap->pci_err_root_cor_src);
893221167Sgnn
894221167Sgnn	(void) __hal_vpath_pci_read(hldev,
895221167Sgnn	    hldev->first_vp_id,
896221167Sgnn	    hldev->pci_e_ext_caps.err_cap_offset +
897221167Sgnn	    vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_src),
898221167Sgnn	    4,
899221167Sgnn	    &err_cap->pci_err_root_src);
900221167Sgnn
901221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
902221167Sgnn	    __FILE__, __func__, __LINE__);
903221167Sgnn
904221167Sgnn	return (VXGE_HAL_OK);
905221167Sgnn}
906221167Sgnn
907221167Sgnn/*
908221167Sgnn * vxge_hal_mgmt_driver_config - Retrieve driver configuration.
909221167Sgnn * @drv_config: Device configuration, see vxge_hal_driver_config_t {}.
910221167Sgnn * @size: Pointer to buffer containing the Size of the @drv_config.
911221167Sgnn * HAL will return an error if the size is smaller than
912221167Sgnn * sizeof(vxge_hal_driver_config_t) and returns required size in this field
913221167Sgnn *
914221167Sgnn * Get driver configuration. Permits to retrieve at run-time configuration
915221167Sgnn * values that were used to configure the device at load-time.
916221167Sgnn *
917221167Sgnn * Returns: VXGE_HAL_OK - success.
918221167Sgnn * VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED - HAL is not initialized.
919221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version is not maching.
920221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient
921221167Sgnn *
922221167Sgnn * See also: vxge_hal_driver_config_t {}, vxge_hal_mgmt_device_config().
923221167Sgnn */
924221167Sgnnvxge_hal_status_e
925221167Sgnnvxge_hal_mgmt_driver_config(vxge_hal_driver_config_t *drv_config, u32 *size)
926221167Sgnn{
927221167Sgnn
928221167Sgnn	vxge_assert((drv_config != NULL) && (size != NULL));
929221167Sgnn
930221167Sgnn	vxge_hal_trace_log_driver("==> %s:%s:%d",
931221167Sgnn	    __FILE__, __func__, __LINE__);
932221167Sgnn
933221167Sgnn	vxge_hal_trace_log_driver(
934221167Sgnn	    "drv_config = 0x"VXGE_OS_STXFMT", size = 0x"VXGE_OS_STXFMT,
935221167Sgnn	    (ptr_t) drv_config, (ptr_t) size);
936221167Sgnn
937221167Sgnn	if (g_vxge_hal_driver == NULL) {
938221167Sgnn		vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d",
939221167Sgnn		    __FILE__, __func__, __LINE__,
940221167Sgnn		    VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED);
941221167Sgnn		return (VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED);
942221167Sgnn	}
943221167Sgnn
944221167Sgnn	if (*size < sizeof(vxge_hal_driver_config_t)) {
945221167Sgnn		*size = sizeof(vxge_hal_driver_config_t);
946221167Sgnn		vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d",
947221167Sgnn		    __FILE__, __func__, __LINE__,
948221167Sgnn		    VXGE_HAL_ERR_OUT_OF_SPACE);
949221167Sgnn		return (VXGE_HAL_ERR_OUT_OF_SPACE);
950221167Sgnn	}
951221167Sgnn
952221167Sgnn	vxge_os_memcpy(drv_config, &g_vxge_hal_driver->config,
953221167Sgnn	    sizeof(vxge_hal_driver_config_t));
954221167Sgnn
955221167Sgnn	*size = sizeof(vxge_hal_driver_config_t);
956221167Sgnn
957221167Sgnn	vxge_hal_trace_log_driver("<== %s:%s:%d Result = 0",
958221167Sgnn	    __FILE__, __func__, __LINE__);
959221167Sgnn
960221167Sgnn	return (VXGE_HAL_OK);
961221167Sgnn}
962221167Sgnn
963221167Sgnn
964221167Sgnn/*
965221167Sgnn * vxge_hal_mgmt_device_config - Retrieve device configuration.
966221167Sgnn * @devh: HAL device handle.
967221167Sgnn * @dev_config: Device configuration, see vxge_hal_device_config_t {}.
968221167Sgnn * @size: Pointer to buffer containing the Size of the @dev_config.
969221167Sgnn * HAL will return an error if the size is smaller than
970221167Sgnn * sizeof(vxge_hal_device_config_t) and returns required size in this field
971221167Sgnn *
972221167Sgnn * Get device configuration. Permits to retrieve at run-time configuration
973221167Sgnn * values that were used to initialize and configure the device.
974221167Sgnn *
975221167Sgnn * Returns: VXGE_HAL_OK - success.
976221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
977221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
978221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient
979221167Sgnn *
980221167Sgnn * See also: vxge_hal_device_config_t {}, vxge_hal_mgmt_driver_config().
981221167Sgnn */
982221167Sgnnvxge_hal_status_e
983221167Sgnnvxge_hal_mgmt_device_config(vxge_hal_device_h devh,
984221167Sgnn    vxge_hal_device_config_t *dev_config, u32 *size)
985221167Sgnn{
986221167Sgnn	vxge_hal_device_t *hldev = (vxge_hal_device_t *) devh;
987221167Sgnn
988221167Sgnn	vxge_assert((devh != NULL) && (dev_config != NULL) && (size != NULL));
989221167Sgnn
990221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
991221167Sgnn	    __FILE__, __func__, __LINE__);
992221167Sgnn
993221167Sgnn	vxge_hal_trace_log_device(
994221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", dev_config = 0x"VXGE_OS_STXFMT", "
995221167Sgnn	    "size = 0x"VXGE_OS_STXFMT, (ptr_t) devh, (ptr_t) dev_config,
996221167Sgnn	    (ptr_t) size);
997221167Sgnn
998221167Sgnn	if (hldev->magic != VXGE_HAL_DEVICE_MAGIC) {
999221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
1000221167Sgnn		    __FILE__, __func__, __LINE__,
1001221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1002221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1003221167Sgnn	}
1004221167Sgnn
1005221167Sgnn	if (*size < sizeof(vxge_hal_device_config_t)) {
1006221167Sgnn		*size = sizeof(vxge_hal_device_config_t);
1007221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
1008221167Sgnn		    __FILE__, __func__, __LINE__,
1009221167Sgnn		    VXGE_HAL_ERR_OUT_OF_SPACE);
1010221167Sgnn		return (VXGE_HAL_ERR_OUT_OF_SPACE);
1011221167Sgnn	}
1012221167Sgnn
1013221167Sgnn	vxge_os_memcpy(dev_config, &hldev->config,
1014221167Sgnn	    sizeof(vxge_hal_device_config_t));
1015221167Sgnn
1016221167Sgnn	*size = sizeof(vxge_hal_device_config_t);
1017221167Sgnn
1018221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
1019221167Sgnn	    __FILE__, __func__, __LINE__);
1020221167Sgnn
1021221167Sgnn	return (VXGE_HAL_OK);
1022221167Sgnn}
1023221167Sgnn
1024221167Sgnn/*
1025221167Sgnn * vxge_hal_mgmt_pcireg_read - Read PCI configuration at a specified
1026221167Sgnn * offset.
1027221167Sgnn * @devh: HAL device handle.
1028221167Sgnn * @offset: Offset in the 256 byte PCI configuration space.
1029221167Sgnn * @value_bits: 8, 16, or 32 (bits) to read.
1030221167Sgnn * @value: Value returned by HAL.
1031221167Sgnn *
1032221167Sgnn * Read PCI configuration, given device and offset in the PCI space.
1033221167Sgnn *
1034221167Sgnn * Returns: VXGE_HAL_OK - success.
1035221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1036221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
1037221167Sgnn * valid.
1038221167Sgnn * VXGE_HAL_ERR_INVALID_VALUE_BIT_SIZE - Invalid bits size. Valid
1039221167Sgnn * values(8/16/32).
1040221167Sgnn *
1041221167Sgnn */
1042221167Sgnnvxge_hal_status_e
1043221167Sgnnvxge_hal_mgmt_pcireg_read(vxge_hal_device_h devh, unsigned int offset,
1044221167Sgnn    int value_bits, u32 *value)
1045221167Sgnn{
1046221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1047221167Sgnn
1048221167Sgnn	vxge_assert((devh != NULL) && (value != NULL));
1049221167Sgnn
1050221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1051221167Sgnn	    __FILE__, __func__, __LINE__);
1052221167Sgnn
1053221167Sgnn	vxge_hal_trace_log_device(
1054221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", offset = %d, value_bits = %d, "
1055221167Sgnn	    "value = 0x"VXGE_OS_STXFMT, (ptr_t) devh, offset,
1056221167Sgnn	    value_bits, (ptr_t) value);
1057221167Sgnn
1058221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1059221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
1060221167Sgnn		    __FILE__, __func__, __LINE__,
1061221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1062221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1063221167Sgnn	}
1064221167Sgnn
1065221167Sgnn	if (offset > sizeof(vxge_hal_pci_config_t) - value_bits / 8) {
1066221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d Result = %d",
1067221167Sgnn		    __FILE__, __func__, __LINE__,
1068221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1069221167Sgnn		return (VXGE_HAL_ERR_INVALID_OFFSET);
1070221167Sgnn	}
1071221167Sgnn
1072221167Sgnn	(void) __hal_vpath_pci_read(hldev,
1073221167Sgnn	    hldev->first_vp_id,
1074221167Sgnn	    offset,
1075221167Sgnn	    value_bits / 8,
1076221167Sgnn	    value);
1077221167Sgnn
1078221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d Result = 0",
1079221167Sgnn	    __FILE__, __func__, __LINE__);
1080221167Sgnn
1081221167Sgnn	return (VXGE_HAL_OK);
1082221167Sgnn}
1083221167Sgnn
1084221167Sgnn/*
1085221167Sgnn * vxge_hal_mgmt_reg_read - Read X3100 register.
1086221167Sgnn * @devh: HAL device handle.
1087221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {}
1088221167Sgnn * @Index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index
1089221167Sgnn *		ignored for others
1090221167Sgnn * @offset: Register offset in the register space qualified by the type and
1091221167Sgnn *		index.
1092221167Sgnn * @value: Register value. Returned by HAL.
1093221167Sgnn * Read X3100 register.
1094221167Sgnn *
1095221167Sgnn * Returns: VXGE_HAL_OK - success.
1096221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1097221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid.
1098221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid.
1099221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid.
1100221167Sgnn *
1101221167Sgnn */
1102221167Sgnnvxge_hal_status_e
1103221167Sgnnvxge_hal_mgmt_reg_read(vxge_hal_device_h devh,
1104221167Sgnn    vxge_hal_mgmt_reg_type_e type,
1105221167Sgnn    u32 vp_id,
1106221167Sgnn    u32 offset,
1107221167Sgnn    u64 *value)
1108221167Sgnn{
1109221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1110221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1111221167Sgnn
1112221167Sgnn	vxge_assert((devh != NULL) && (value != NULL));
1113221167Sgnn
1114221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1115221167Sgnn	    __FILE__, __func__, __LINE__);
1116221167Sgnn
1117221167Sgnn	vxge_hal_trace_log_device(
1118221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", type = %d, "
1119221167Sgnn	    "vp_id = %d, offset = %d, value = 0x"VXGE_OS_STXFMT,
1120221167Sgnn	    (ptr_t) devh, type, vp_id, offset, (ptr_t) value);
1121221167Sgnn
1122221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1123221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1124221167Sgnn		    __FILE__, __func__, __LINE__,
1125221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1126221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1127221167Sgnn	}
1128221167Sgnn
1129221167Sgnn	switch (type) {
1130221167Sgnn	case vxge_hal_mgmt_reg_type_legacy:
1131221167Sgnn		if (offset > sizeof(vxge_hal_legacy_reg_t) - 8) {
1132221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1133221167Sgnn			break;
1134221167Sgnn		}
1135221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1136221167Sgnn		    hldev->header.regh0,
1137221167Sgnn		    (void *)(((ptr_t) hldev->legacy_reg) + offset));
1138221167Sgnn		break;
1139221167Sgnn	case vxge_hal_mgmt_reg_type_toc:
1140221167Sgnn		if (offset > sizeof(vxge_hal_toc_reg_t) - 8) {
1141221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1142221167Sgnn			break;
1143221167Sgnn		}
1144221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1145221167Sgnn		    hldev->header.regh0,
1146221167Sgnn		    (void *)(((ptr_t) hldev->toc_reg) + offset));
1147221167Sgnn		break;
1148221167Sgnn	case vxge_hal_mgmt_reg_type_common:
1149221167Sgnn		if (offset > sizeof(vxge_hal_common_reg_t) - 8) {
1150221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1151221167Sgnn			break;
1152221167Sgnn		}
1153221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1154221167Sgnn		    hldev->header.regh0,
1155221167Sgnn		    (void *)(((ptr_t) hldev->common_reg) + offset));
1156221167Sgnn		break;
1157221167Sgnn	case vxge_hal_mgmt_reg_type_memrepair:
1158221167Sgnn		if (!(hldev->access_rights &
1159221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1160221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1161221167Sgnn			break;
1162221167Sgnn		}
1163221167Sgnn		if (offset > sizeof(vxge_hal_memrepair_reg_t) - 8) {
1164221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1165221167Sgnn			break;
1166221167Sgnn		}
1167221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1168221167Sgnn		    hldev->header.regh0,
1169221167Sgnn		    (void *)(((ptr_t) hldev->memrepair_reg) + offset));
1170221167Sgnn		break;
1171221167Sgnn	case vxge_hal_mgmt_reg_type_pcicfgmgmt:
1172221167Sgnn		if (!(hldev->access_rights &
1173221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1174221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1175221167Sgnn			break;
1176221167Sgnn		}
1177221167Sgnn		if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) {
1178221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1179221167Sgnn			break;
1180221167Sgnn		}
1181221167Sgnn		if (offset > sizeof(vxge_hal_pcicfgmgmt_reg_t) - 8) {
1182221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1183221167Sgnn			break;
1184221167Sgnn		}
1185221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1186221167Sgnn		    hldev->header.regh0,
1187221167Sgnn		    (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset));
1188221167Sgnn		break;
1189221167Sgnn	case vxge_hal_mgmt_reg_type_mrpcim:
1190221167Sgnn		if (!(hldev->access_rights &
1191221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1192221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1193221167Sgnn			break;
1194221167Sgnn		}
1195221167Sgnn		if (offset > sizeof(vxge_hal_mrpcim_reg_t) - 8) {
1196221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1197221167Sgnn			break;
1198221167Sgnn		}
1199221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1200221167Sgnn		    hldev->header.regh0,
1201221167Sgnn		    (void *)(((ptr_t) hldev->mrpcim_reg) + offset));
1202221167Sgnn		break;
1203221167Sgnn	case vxge_hal_mgmt_reg_type_srpcim:
1204221167Sgnn		if (!(hldev->access_rights &
1205221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM)) {
1206221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1207221167Sgnn			break;
1208221167Sgnn		}
1209221167Sgnn		if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) {
1210221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1211221167Sgnn			break;
1212221167Sgnn		}
1213221167Sgnn		if (offset > sizeof(vxge_hal_srpcim_reg_t) - 8) {
1214221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1215221167Sgnn			break;
1216221167Sgnn		}
1217221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1218221167Sgnn		    hldev->header.regh0,
1219221167Sgnn		    (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset));
1220221167Sgnn		break;
1221221167Sgnn	case vxge_hal_mgmt_reg_type_vpmgmt:
1222221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) ||
1223221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1224221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1225221167Sgnn			break;
1226221167Sgnn		}
1227221167Sgnn		if (offset > sizeof(vxge_hal_vpmgmt_reg_t) - 8) {
1228221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1229221167Sgnn			break;
1230221167Sgnn		}
1231221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1232221167Sgnn		    hldev->header.regh0,
1233221167Sgnn		    (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset));
1234221167Sgnn		break;
1235221167Sgnn	case vxge_hal_mgmt_reg_type_vpath:
1236221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) ||
1237221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1238221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1239221167Sgnn			break;
1240221167Sgnn		}
1241221167Sgnn		if (vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) {
1242221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1243221167Sgnn			break;
1244221167Sgnn		}
1245221167Sgnn		if (offset > sizeof(vxge_hal_vpath_reg_t) - 8) {
1246221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1247221167Sgnn			break;
1248221167Sgnn		}
1249221167Sgnn		*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1250221167Sgnn		    hldev->header.regh0,
1251221167Sgnn		    (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset));
1252221167Sgnn		break;
1253221167Sgnn	default:
1254221167Sgnn		status = VXGE_HAL_ERR_INVALID_TYPE;
1255221167Sgnn		break;
1256221167Sgnn	}
1257221167Sgnn
1258221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1259221167Sgnn	    __FILE__, __func__, __LINE__, status);
1260221167Sgnn	return (status);
1261221167Sgnn}
1262221167Sgnn
1263221167Sgnn/*
1264221167Sgnn * vxge_hal_mgmt_reg_Write - Write X3100 register.
1265221167Sgnn * @devh: HAL device handle.
1266221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {}
1267221167Sgnn * @index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index
1268221167Sgnn *		ignored for others
1269221167Sgnn * @offset: Register offset in the register space qualified by the type and
1270221167Sgnn *		index.
1271221167Sgnn * @value: Register value to be written.
1272221167Sgnn * Write X3100 register.
1273221167Sgnn *
1274221167Sgnn * Returns: VXGE_HAL_OK - success.
1275221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1276221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid.
1277221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid.
1278221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid.
1279221167Sgnn *
1280221167Sgnn */
1281221167Sgnnvxge_hal_status_e
1282221167Sgnnvxge_hal_mgmt_reg_write(vxge_hal_device_h devh,
1283221167Sgnn    vxge_hal_mgmt_reg_type_e type,
1284221167Sgnn    u32 vp_id,
1285221167Sgnn    u32 offset,
1286221167Sgnn    u64 value)
1287221167Sgnn{
1288221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1289221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1290221167Sgnn
1291221167Sgnn	vxge_assert(devh != NULL);
1292221167Sgnn
1293221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1294221167Sgnn	    __FILE__, __func__, __LINE__);
1295221167Sgnn
1296221167Sgnn	vxge_hal_trace_log_device(
1297221167Sgnn		"devh = 0x"VXGE_OS_STXFMT", type = %d, "
1298221167Sgnn	    "index = %d, offset = %d, value = 0x"VXGE_OS_STXFMT,
1299221167Sgnn	    (ptr_t) devh, type, vp_id, offset, (ptr_t) value);
1300221167Sgnn
1301221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1302221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1303221167Sgnn		    __FILE__, __func__, __LINE__,
1304221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1305221167Sgnn
1306221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1307221167Sgnn	}
1308221167Sgnn
1309221167Sgnn	switch (type) {
1310221167Sgnn	case vxge_hal_mgmt_reg_type_legacy:
1311221167Sgnn		if (offset > sizeof(vxge_hal_legacy_reg_t) - 8) {
1312221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1313221167Sgnn			break;
1314221167Sgnn		}
1315221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1316221167Sgnn		    hldev->header.regh0,
1317221167Sgnn		    value,
1318221167Sgnn		    (void *)(((ptr_t) hldev->legacy_reg) + offset));
1319221167Sgnn		break;
1320221167Sgnn	case vxge_hal_mgmt_reg_type_toc:
1321221167Sgnn		if (offset > sizeof(vxge_hal_toc_reg_t) - 8) {
1322221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1323221167Sgnn			break;
1324221167Sgnn		}
1325221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1326221167Sgnn		    hldev->header.regh0,
1327221167Sgnn		    value,
1328221167Sgnn		    (void *)(((ptr_t) hldev->toc_reg) + offset));
1329221167Sgnn		break;
1330221167Sgnn	case vxge_hal_mgmt_reg_type_common:
1331221167Sgnn		if (offset > sizeof(vxge_hal_common_reg_t) - 8) {
1332221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1333221167Sgnn			break;
1334221167Sgnn		}
1335221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1336221167Sgnn		    hldev->header.regh0,
1337221167Sgnn		    value,
1338221167Sgnn		    (void *)(((ptr_t) hldev->common_reg) + offset));
1339221167Sgnn		break;
1340221167Sgnn	case vxge_hal_mgmt_reg_type_memrepair:
1341221167Sgnn		if (!(hldev->access_rights &
1342221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1343221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1344221167Sgnn			break;
1345221167Sgnn		}
1346221167Sgnn		if (offset > sizeof(vxge_hal_memrepair_reg_t) - 8) {
1347221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1348221167Sgnn			break;
1349221167Sgnn		}
1350221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1351221167Sgnn		    hldev->header.regh0,
1352221167Sgnn		    value,
1353221167Sgnn		    (void *)(((ptr_t) hldev->memrepair_reg) + offset));
1354221167Sgnn		break;
1355221167Sgnn	case vxge_hal_mgmt_reg_type_pcicfgmgmt:
1356221167Sgnn		if (!(hldev->access_rights &
1357221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1358221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1359221167Sgnn			break;
1360221167Sgnn		}
1361221167Sgnn		if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) {
1362221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1363221167Sgnn			break;
1364221167Sgnn		}
1365221167Sgnn		if (offset > sizeof(vxge_hal_pcicfgmgmt_reg_t) - 8) {
1366221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1367221167Sgnn			break;
1368221167Sgnn		}
1369221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1370221167Sgnn		    hldev->header.regh0,
1371221167Sgnn		    value,
1372221167Sgnn		    (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset));
1373221167Sgnn		break;
1374221167Sgnn	case vxge_hal_mgmt_reg_type_mrpcim:
1375221167Sgnn		if (!(hldev->access_rights &
1376221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1377221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1378221167Sgnn			break;
1379221167Sgnn		}
1380221167Sgnn		if (offset > sizeof(vxge_hal_mrpcim_reg_t) - 8) {
1381221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1382221167Sgnn			break;
1383221167Sgnn		}
1384221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1385221167Sgnn		    hldev->header.regh0,
1386221167Sgnn		    value,
1387221167Sgnn		    (void *)(((ptr_t) hldev->mrpcim_reg) + offset));
1388221167Sgnn		break;
1389221167Sgnn	case vxge_hal_mgmt_reg_type_srpcim:
1390221167Sgnn		if (!(hldev->access_rights &
1391221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1392221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1393221167Sgnn			break;
1394221167Sgnn		}
1395221167Sgnn		if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) {
1396221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1397221167Sgnn			break;
1398221167Sgnn		}
1399221167Sgnn		if (offset > sizeof(vxge_hal_srpcim_reg_t) - 8) {
1400221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1401221167Sgnn			break;
1402221167Sgnn		}
1403221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1404221167Sgnn		    hldev->header.regh0,
1405221167Sgnn		    value,
1406221167Sgnn		    (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset));
1407221167Sgnn		break;
1408221167Sgnn	case vxge_hal_mgmt_reg_type_vpmgmt:
1409221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) ||
1410221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1411221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1412221167Sgnn			break;
1413221167Sgnn		}
1414221167Sgnn		if (offset > sizeof(vxge_hal_vpmgmt_reg_t) - 8) {
1415221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1416221167Sgnn			break;
1417221167Sgnn		}
1418221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1419221167Sgnn		    hldev->header.regh0,
1420221167Sgnn		    value,
1421221167Sgnn		    (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset));
1422221167Sgnn		break;
1423221167Sgnn	case vxge_hal_mgmt_reg_type_vpath:
1424221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) ||
1425221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1426221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1427221167Sgnn			break;
1428221167Sgnn		}
1429221167Sgnn		if (offset > sizeof(vxge_hal_vpath_reg_t) - 8) {
1430221167Sgnn			status = VXGE_HAL_ERR_INVALID_OFFSET;
1431221167Sgnn			break;
1432221167Sgnn		}
1433221167Sgnn		vxge_os_pio_mem_write64(hldev->header.pdev,
1434221167Sgnn		    hldev->header.regh0,
1435221167Sgnn		    value,
1436221167Sgnn		    (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset));
1437221167Sgnn		break;
1438221167Sgnn	default:
1439221167Sgnn		status = VXGE_HAL_ERR_INVALID_TYPE;
1440221167Sgnn		break;
1441221167Sgnn	}
1442221167Sgnn
1443221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1444221167Sgnn	    __FILE__, __func__, __LINE__, status);
1445221167Sgnn	return (status);
1446221167Sgnn}
1447221167Sgnn
1448221167Sgnn/*
1449221167Sgnn * vxge_hal_mgmt_bar0_read - Read X3100 register located at the offset
1450221167Sgnn *                           from bar0.
1451221167Sgnn * @devh: HAL device handle.
1452221167Sgnn * @offset: Register offset from bar0
1453221167Sgnn * @value: Register value. Returned by HAL.
1454221167Sgnn * Read X3100 register.
1455221167Sgnn *
1456221167Sgnn * Returns: VXGE_HAL_OK - success.
1457221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1458221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid.
1459221167Sgnn *
1460221167Sgnn */
1461221167Sgnnvxge_hal_status_e
1462221167Sgnnvxge_hal_mgmt_bar0_read(vxge_hal_device_h devh,
1463221167Sgnn    u32 offset,
1464221167Sgnn    u64 *value)
1465221167Sgnn{
1466221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1467221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1468221167Sgnn
1469221167Sgnn	vxge_assert(devh != NULL);
1470221167Sgnn
1471221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1472221167Sgnn	    __FILE__, __func__, __LINE__);
1473221167Sgnn
1474221167Sgnn	vxge_hal_trace_log_device(
1475221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT,
1476221167Sgnn	    (ptr_t) devh, offset, (ptr_t) value);
1477221167Sgnn
1478221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1479221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1480221167Sgnn		    __FILE__, __func__, __LINE__,
1481221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1482221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1483221167Sgnn	}
1484221167Sgnn
1485221167Sgnn	if (((ptr_t) hldev->header.bar0 + offset) >
1486221167Sgnn	    ((ptr_t) hldev->vpath_reg[VXGE_HAL_MAX_VIRTUAL_PATHS - 1] +
1487221167Sgnn	    sizeof(vxge_hal_vpath_reg_t) - 8)) {
1488221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1489221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_OFFSET);
1490221167Sgnn		return (VXGE_HAL_ERR_INVALID_OFFSET);
1491221167Sgnn	}
1492221167Sgnn
1493221167Sgnn	*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1494221167Sgnn	    hldev->header.regh0,
1495221167Sgnn	    (void *)(((ptr_t) hldev->header.bar0) + offset));
1496221167Sgnn
1497221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1498221167Sgnn	    __FILE__, __func__, __LINE__, status);
1499221167Sgnn	return (status);
1500221167Sgnn}
1501221167Sgnn
1502221167Sgnn/*
1503221167Sgnn * vxge_hal_mgmt_bar1_read - Read X3100 register located at the offset
1504221167Sgnn *                           from bar1.
1505221167Sgnn * @devh: HAL device handle.
1506221167Sgnn * @offset: Register offset from bar1
1507221167Sgnn * @value: Register value. Returned by HAL.
1508221167Sgnn * Read X3100 register.
1509221167Sgnn *
1510221167Sgnn * Returns: VXGE_HAL_OK - success.
1511221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1512221167Sgnn *
1513221167Sgnn */
1514221167Sgnnvxge_hal_status_e
1515221167Sgnnvxge_hal_mgmt_bar1_read(vxge_hal_device_h devh,
1516221167Sgnn    u32 offset,
1517221167Sgnn    u64 *value)
1518221167Sgnn{
1519221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1520221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1521221167Sgnn
1522221167Sgnn	vxge_assert(devh != NULL);
1523221167Sgnn
1524221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1525221167Sgnn	    __FILE__, __func__, __LINE__);
1526221167Sgnn
1527221167Sgnn	vxge_hal_trace_log_device(
1528221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT,
1529221167Sgnn	    (ptr_t) devh, offset, (ptr_t) value);
1530221167Sgnn
1531221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1532221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1533221167Sgnn		    __FILE__, __func__, __LINE__,
1534221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1535221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1536221167Sgnn	}
1537221167Sgnn
1538221167Sgnn	*value = vxge_os_pio_mem_read64(hldev->header.pdev,
1539221167Sgnn	    hldev->header.regh0,
1540221167Sgnn	    (void *)(((ptr_t) hldev->header.bar1) + offset));
1541221167Sgnn
1542221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1543221167Sgnn	    __FILE__, __func__, __LINE__, status);
1544221167Sgnn	return (status);
1545221167Sgnn}
1546221167Sgnn
1547221167Sgnn/*
1548221167Sgnn * vxge_hal_mgmt_bar0_Write - Write X3100 register located at the offset
1549221167Sgnn *			    from bar0.
1550221167Sgnn * @devh: HAL device handle.
1551221167Sgnn * @offset: Register offset from bar0
1552221167Sgnn * @value: Register value to be written.
1553221167Sgnn * Write X3100 register.
1554221167Sgnn *
1555221167Sgnn * Returns: VXGE_HAL_OK - success.
1556221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1557221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid.
1558221167Sgnn *
1559221167Sgnn */
1560221167Sgnnvxge_hal_status_e
1561221167Sgnnvxge_hal_mgmt_bar0_write(vxge_hal_device_h devh,
1562221167Sgnn    u32 offset,
1563221167Sgnn    u64 value)
1564221167Sgnn{
1565221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1566221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1567221167Sgnn
1568221167Sgnn	vxge_assert(devh != NULL);
1569221167Sgnn
1570221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1571221167Sgnn	    __FILE__, __func__, __LINE__);
1572221167Sgnn
1573221167Sgnn	vxge_hal_trace_log_device(
1574221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT,
1575221167Sgnn	    (ptr_t) devh, offset, (ptr_t) value);
1576221167Sgnn
1577221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1578221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1579221167Sgnn		    __FILE__, __func__, __LINE__,
1580221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1581221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1582221167Sgnn	}
1583221167Sgnn	if (((ptr_t) hldev->header.bar0 + offset) >
1584221167Sgnn	    ((ptr_t) hldev->vpath_reg[VXGE_HAL_MAX_VIRTUAL_PATHS - 1] +
1585221167Sgnn	    sizeof(vxge_hal_vpath_reg_t) - 8)) {
1586221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1587221167Sgnn		    __FILE__, __func__, __LINE__,
1588221167Sgnn		    VXGE_HAL_ERR_INVALID_OFFSET);
1589221167Sgnn		return (VXGE_HAL_ERR_INVALID_OFFSET);
1590221167Sgnn	}
1591221167Sgnn
1592221167Sgnn	vxge_os_pio_mem_write64(hldev->header.pdev,
1593221167Sgnn	    hldev->header.regh0,
1594221167Sgnn	    value,
1595221167Sgnn	    (void *)(((ptr_t) hldev->header.bar0) + offset));
1596221167Sgnn
1597221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1598221167Sgnn	    __FILE__, __func__, __LINE__, status);
1599221167Sgnn	return (status);
1600221167Sgnn}
1601221167Sgnn
1602221167Sgnn/*
1603221167Sgnn * vxge_hal_mgmt_register_config - Retrieve register configuration.
1604221167Sgnn * @devh: HAL device handle.
1605221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {}
1606221167Sgnn * @Index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index
1607221167Sgnn *		ignored for others
1608221167Sgnn * @config: Device configuration, see vxge_hal_device_config_t {}.
1609221167Sgnn * @size: Pointer to buffer containing the Size of the @reg_config.
1610221167Sgnn * HAL will return an error if the size is smaller than
1611221167Sgnn * requested register space and returns required size in this field
1612221167Sgnn *
1613221167Sgnn * Get register configuration. Permits to retrieve register values.
1614221167Sgnn *
1615221167Sgnn * Returns: VXGE_HAL_OK - success.
1616221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1617221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid.
1618221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid.
1619221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient
1620221167Sgnn *
1621221167Sgnn */
1622221167Sgnnvxge_hal_status_e
1623221167Sgnnvxge_hal_mgmt_register_config(vxge_hal_device_h devh,
1624221167Sgnn    vxge_hal_mgmt_reg_type_e type, u32 vp_id, u8 *config, u32 *size)
1625221167Sgnn{
1626221167Sgnn	u32 offset;
1627221167Sgnn	u64 *reg_config = (u64 *) ((void *)config);
1628221167Sgnn	vxge_hal_status_e status = VXGE_HAL_OK;
1629221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1630221167Sgnn
1631221167Sgnn	vxge_assert((devh != NULL) && (reg_config != NULL) && (size != NULL));
1632221167Sgnn
1633221167Sgnn	vxge_hal_trace_log_device("==> %s:%s:%d",
1634221167Sgnn	    __FILE__, __func__, __LINE__);
1635221167Sgnn
1636221167Sgnn	vxge_hal_trace_log_device(
1637221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", type = %d, index = %d, "
1638221167Sgnn	    "reg_config = 0x"VXGE_OS_STXFMT", size = 0x"VXGE_OS_STXFMT,
1639221167Sgnn	    (ptr_t) devh, type, vp_id, (ptr_t) reg_config, (ptr_t) size);
1640221167Sgnn
1641221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1642221167Sgnn		vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1643221167Sgnn		    __FILE__, __func__, __LINE__,
1644221167Sgnn		    VXGE_HAL_ERR_INVALID_DEVICE);
1645221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1646221167Sgnn	}
1647221167Sgnn
1648221167Sgnn	switch (type) {
1649221167Sgnn	case vxge_hal_mgmt_reg_type_legacy:
1650221167Sgnn		if (*size < sizeof(vxge_hal_legacy_reg_t)) {
1651221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1652221167Sgnn			*size = sizeof(vxge_hal_legacy_reg_t);
1653221167Sgnn			break;
1654221167Sgnn		}
1655221167Sgnn
1656221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_legacy_reg_t);
1657221167Sgnn		    offset += 8) {
1658221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1659221167Sgnn			    hldev->header.pdev,
1660221167Sgnn			    hldev->header.regh0,
1661221167Sgnn			    (void *)(((ptr_t) hldev->legacy_reg) + offset));
1662221167Sgnn		}
1663221167Sgnn		*size = sizeof(vxge_hal_legacy_reg_t);
1664221167Sgnn		break;
1665221167Sgnn
1666221167Sgnn	case vxge_hal_mgmt_reg_type_toc:
1667221167Sgnn		if (*size < sizeof(vxge_hal_toc_reg_t)) {
1668221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1669221167Sgnn			*size = sizeof(vxge_hal_toc_reg_t);
1670221167Sgnn			break;
1671221167Sgnn		}
1672221167Sgnn
1673221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_toc_reg_t);
1674221167Sgnn		    offset += 8) {
1675221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1676221167Sgnn			    hldev->header.pdev,
1677221167Sgnn			    hldev->header.regh0,
1678221167Sgnn			    (void *)(((ptr_t) hldev->toc_reg) + offset));
1679221167Sgnn		}
1680221167Sgnn		*size = sizeof(vxge_hal_toc_reg_t);
1681221167Sgnn		break;
1682221167Sgnn
1683221167Sgnn	case vxge_hal_mgmt_reg_type_common:
1684221167Sgnn		if (*size < sizeof(vxge_hal_common_reg_t)) {
1685221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1686221167Sgnn			*size = sizeof(vxge_hal_common_reg_t);
1687221167Sgnn			break;
1688221167Sgnn		}
1689221167Sgnn
1690221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_common_reg_t);
1691221167Sgnn		    offset += 8) {
1692221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1693221167Sgnn			    hldev->header.pdev,
1694221167Sgnn			    hldev->header.regh0,
1695221167Sgnn			    (void *)(((ptr_t) hldev->common_reg) + offset));
1696221167Sgnn		}
1697221167Sgnn		*size = sizeof(vxge_hal_common_reg_t);
1698221167Sgnn		break;
1699221167Sgnn
1700221167Sgnn	case vxge_hal_mgmt_reg_type_memrepair:
1701221167Sgnn		if (!(hldev->access_rights &
1702221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1703221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1704221167Sgnn			break;
1705221167Sgnn		}
1706221167Sgnn
1707221167Sgnn		if (*size < sizeof(vxge_hal_memrepair_reg_t)) {
1708221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1709221167Sgnn			*size = sizeof(vxge_hal_memrepair_reg_t);
1710221167Sgnn			break;
1711221167Sgnn		}
1712221167Sgnn
1713221167Sgnn		for (offset = 0;
1714221167Sgnn		    offset < sizeof(vxge_hal_memrepair_reg_t); offset += 8) {
1715221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1716221167Sgnn			    hldev->header.pdev,
1717221167Sgnn			    hldev->header.regh0,
1718221167Sgnn			    (void *)(((ptr_t) hldev->memrepair_reg) + offset));
1719221167Sgnn		}
1720221167Sgnn		*size = sizeof(vxge_hal_memrepair_reg_t);
1721221167Sgnn		break;
1722221167Sgnn
1723221167Sgnn	case vxge_hal_mgmt_reg_type_pcicfgmgmt:
1724221167Sgnn		if (!(hldev->access_rights &
1725221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1726221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1727221167Sgnn			break;
1728221167Sgnn		}
1729221167Sgnn
1730221167Sgnn		if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) {
1731221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1732221167Sgnn			break;
1733221167Sgnn		}
1734221167Sgnn
1735221167Sgnn		if (*size < sizeof(vxge_hal_pcicfgmgmt_reg_t)) {
1736221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1737221167Sgnn			*size = sizeof(vxge_hal_pcicfgmgmt_reg_t);
1738221167Sgnn			break;
1739221167Sgnn		}
1740221167Sgnn
1741221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_pcicfgmgmt_reg_t);
1742221167Sgnn		    offset += 8) {
1743221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1744221167Sgnn			    hldev->header.pdev,
1745221167Sgnn			    hldev->header.regh0,
1746221167Sgnn			    (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset));
1747221167Sgnn		}
1748221167Sgnn		*size = sizeof(vxge_hal_pcicfgmgmt_reg_t);
1749221167Sgnn		break;
1750221167Sgnn
1751221167Sgnn	case vxge_hal_mgmt_reg_type_mrpcim:
1752221167Sgnn		if (!(hldev->access_rights &
1753221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1754221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1755221167Sgnn			break;
1756221167Sgnn		}
1757221167Sgnn
1758221167Sgnn		if (*size < sizeof(vxge_hal_mrpcim_reg_t)) {
1759221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1760221167Sgnn			*size = sizeof(vxge_hal_mrpcim_reg_t);
1761221167Sgnn			break;
1762221167Sgnn		}
1763221167Sgnn
1764221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_mrpcim_reg_t);
1765221167Sgnn		    offset += 8) {
1766221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1767221167Sgnn			    hldev->header.pdev,
1768221167Sgnn			    hldev->header.regh0,
1769221167Sgnn			    (void *)(((ptr_t) hldev->mrpcim_reg) + offset));
1770221167Sgnn		}
1771221167Sgnn		*size = sizeof(vxge_hal_mrpcim_reg_t);
1772221167Sgnn		break;
1773221167Sgnn
1774221167Sgnn	case vxge_hal_mgmt_reg_type_srpcim:
1775221167Sgnn		if (!(hldev->access_rights &
1776221167Sgnn		    VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM)) {
1777221167Sgnn			status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION;
1778221167Sgnn			break;
1779221167Sgnn		}
1780221167Sgnn
1781221167Sgnn		if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) {
1782221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1783221167Sgnn			break;
1784221167Sgnn		}
1785221167Sgnn
1786221167Sgnn		if (*size < sizeof(vxge_hal_srpcim_reg_t)) {
1787221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1788221167Sgnn			*size = sizeof(vxge_hal_srpcim_reg_t);
1789221167Sgnn			break;
1790221167Sgnn		}
1791221167Sgnn
1792221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_srpcim_reg_t);
1793221167Sgnn		    offset += 8) {
1794221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1795221167Sgnn			    hldev->header.pdev,
1796221167Sgnn			    hldev->header.regh0,
1797221167Sgnn			    (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset));
1798221167Sgnn		}
1799221167Sgnn		*size = sizeof(vxge_hal_srpcim_reg_t);
1800221167Sgnn		break;
1801221167Sgnn
1802221167Sgnn	case vxge_hal_mgmt_reg_type_vpmgmt:
1803221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) ||
1804221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1805221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1806221167Sgnn			break;
1807221167Sgnn		}
1808221167Sgnn
1809221167Sgnn		if (*size < sizeof(vxge_hal_vpmgmt_reg_t)) {
1810221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1811221167Sgnn			*size = sizeof(vxge_hal_vpmgmt_reg_t);
1812221167Sgnn			break;
1813221167Sgnn		}
1814221167Sgnn
1815221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_vpmgmt_reg_t);
1816221167Sgnn		    offset += 8) {
1817221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1818221167Sgnn			    hldev->header.pdev,
1819221167Sgnn			    hldev->header.regh0,
1820221167Sgnn			    (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset));
1821221167Sgnn		}
1822221167Sgnn		*size = sizeof(vxge_hal_vpmgmt_reg_t);
1823221167Sgnn		break;
1824221167Sgnn
1825221167Sgnn	case vxge_hal_mgmt_reg_type_vpath:
1826221167Sgnn		if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) ||
1827221167Sgnn		    (!(hldev->vpath_assignments & mBIT(vp_id)))) {
1828221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1829221167Sgnn			break;
1830221167Sgnn		}
1831221167Sgnn
1832221167Sgnn		if (vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) {
1833221167Sgnn			status = VXGE_HAL_ERR_INVALID_INDEX;
1834221167Sgnn			break;
1835221167Sgnn		}
1836221167Sgnn
1837221167Sgnn		if (*size < sizeof(vxge_hal_vpath_reg_t)) {
1838221167Sgnn			status = VXGE_HAL_ERR_OUT_OF_SPACE;
1839221167Sgnn			*size = sizeof(vxge_hal_vpath_reg_t);
1840221167Sgnn			break;
1841221167Sgnn		}
1842221167Sgnn
1843221167Sgnn		for (offset = 0; offset < sizeof(vxge_hal_vpath_reg_t);
1844221167Sgnn		    offset += 8) {
1845221167Sgnn			*reg_config++ = vxge_os_pio_mem_read64(
1846221167Sgnn			    hldev->header.pdev,
1847221167Sgnn			    hldev->header.regh0,
1848221167Sgnn			    (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset));
1849221167Sgnn		}
1850221167Sgnn		*size = sizeof(vxge_hal_vpath_reg_t);
1851221167Sgnn		break;
1852221167Sgnn
1853221167Sgnn	default:
1854221167Sgnn		status = VXGE_HAL_ERR_INVALID_TYPE;
1855221167Sgnn		break;
1856221167Sgnn	}
1857221167Sgnn
1858221167Sgnn	vxge_hal_trace_log_device("<== %s:%s:%d  Result: %d",
1859221167Sgnn	    __FILE__, __func__, __LINE__, status);
1860221167Sgnn	return (status);
1861221167Sgnn}
1862221167Sgnn
1863221167Sgnn/*
1864221167Sgnn * vxge_hal_mgmt_read_xfp_current_temp - Read current temparature of given port
1865221167Sgnn * @hldev: HAL device handle.
1866221167Sgnn * @port: Port number
1867221167Sgnn *
1868221167Sgnn * This routine only gets the temperature for XFP modules. Also, updating of the
1869221167Sgnn * NVRAM can sometimes fail and so the reading we might get may not be uptodate.
1870221167Sgnn */
1871221167Sgnnu32
1872221167Sgnnvxge_hal_mgmt_read_xfp_current_temp(vxge_hal_device_h devh, u32 port)
1873221167Sgnn{
1874221167Sgnn	u16 val1, val2, count = 0;
1875221167Sgnn	u32 actual;
1876221167Sgnn	vxge_hal_status_e status;
1877221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
1878221167Sgnn
1879221167Sgnn	vxge_assert(devh != NULL);
1880221167Sgnn
1881221167Sgnn	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
1882221167Sgnn	    __FILE__, __func__, __LINE__);
1883221167Sgnn
1884221167Sgnn	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT", port = %d",
1885221167Sgnn	    (ptr_t) devh, port);
1886221167Sgnn
1887221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
1888221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1889221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
1890221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
1891221167Sgnn	}
1892221167Sgnn
1893221167Sgnn	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
1894221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1895221167Sgnn		    __FILE__, __func__, __LINE__,
1896221167Sgnn		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
1897221167Sgnn		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
1898221167Sgnn	}
1899221167Sgnn
1900221167Sgnn	val1 = VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_256_BYTES;
1901221167Sgnn
1902221167Sgnn	status = __hal_mrpcim_mdio_access(devh, port,
1903221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_WRITE,
1904221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
1905221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL,
1906221167Sgnn	    &val1);
1907221167Sgnn
1908221167Sgnn	if (status != VXGE_HAL_OK) {
1909221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1910221167Sgnn		    __FILE__, __func__, __LINE__, status);
1911221167Sgnn		return (status);
1912221167Sgnn	}
1913221167Sgnn
1914221167Sgnn	/* Now wait for the transfer to complete */
1915221167Sgnn	do {
1916221167Sgnn		vxge_os_mdelay(50);	/* wait 50 milliseonds */
1917221167Sgnn
1918221167Sgnn		status = __hal_mrpcim_mdio_access(devh, port,
1919221167Sgnn		    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
1920221167Sgnn		    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
1921221167Sgnn		    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL,
1922221167Sgnn		    &val1);
1923221167Sgnn
1924221167Sgnn		if (status != VXGE_HAL_OK) {
1925221167Sgnn			vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1926221167Sgnn			    __FILE__, __func__, __LINE__, status);
1927221167Sgnn			return (status);
1928221167Sgnn		}
1929221167Sgnn
1930221167Sgnn		if (count++ > 10) {
1931221167Sgnn			/* waited 500 ms which should be plenty of time */
1932221167Sgnn			break;
1933221167Sgnn		}
1934221167Sgnn
1935221167Sgnn	} while ((val1 &
1936221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_STAT_MASK)
1937221167Sgnn	    == VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_PROGRESS);
1938221167Sgnn
1939221167Sgnn	if ((val1 &
1940221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_STAT_MASK) ==
1941221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_FAILED) {
1942221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1943221167Sgnn		    __FILE__, __func__, __LINE__, status);
1944221167Sgnn		return (VXGE_HAL_FAIL);
1945221167Sgnn	}
1946221167Sgnn
1947221167Sgnn	status = __hal_mrpcim_mdio_access(devh, port,
1948221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
1949221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
1950221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_DATA_XFP_TEMP_1,
1951221167Sgnn	    &val1);
1952221167Sgnn
1953221167Sgnn	if (status != VXGE_HAL_OK) {
1954221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1955221167Sgnn		    __FILE__, __func__, __LINE__, status);
1956221167Sgnn		return (status);
1957221167Sgnn	}
1958221167Sgnn
1959221167Sgnn	status = __hal_mrpcim_mdio_access(devh, port,
1960221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
1961221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
1962221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_DATA_XFP_TEMP_2,
1963221167Sgnn	    &val2);
1964221167Sgnn
1965221167Sgnn	if (status != VXGE_HAL_OK) {
1966221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1967221167Sgnn		    __FILE__, __func__, __LINE__, status);
1968221167Sgnn		return (status);
1969221167Sgnn	}
1970221167Sgnn
1971221167Sgnn	actual = ((val1 << 8) | val2);
1972221167Sgnn
1973221167Sgnn	if (actual >= 32768)
1974221167Sgnn		actual = actual - 65536;
1975221167Sgnn
1976221167Sgnn	actual = actual / 256;
1977221167Sgnn
1978221167Sgnn	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
1979221167Sgnn	    __FILE__, __func__, __LINE__, status);
1980221167Sgnn
1981221167Sgnn	return (actual);
1982221167Sgnn
1983221167Sgnn}
1984221167Sgnn
1985221167Sgnn/*
1986221167Sgnn * vxge_hal_mgmt_pma_loopback - Enable or disable PMA loopback
1987221167Sgnn * @devh: HAL device handle.
1988221167Sgnn * @port: Port number
1989221167Sgnn * @enable:Boolean set to 1 to enable and 0 to disable.
1990221167Sgnn *
1991221167Sgnn * Enable or disable PMA loopback.
1992221167Sgnn * Return value:
1993221167Sgnn * 0 on success.
1994221167Sgnn */
1995221167Sgnnvxge_hal_status_e
1996221167Sgnnvxge_hal_mgmt_pma_loopback(vxge_hal_device_h devh, u32 port, u32 enable)
1997221167Sgnn{
1998221167Sgnn	u16 val;
1999221167Sgnn	vxge_hal_status_e status;
2000221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
2001221167Sgnn
2002221167Sgnn	vxge_assert(devh != NULL);
2003221167Sgnn
2004221167Sgnn	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
2005221167Sgnn	    __FILE__, __func__, __LINE__);
2006221167Sgnn
2007221167Sgnn	vxge_hal_trace_log_mrpcim(
2008221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", port = %d, enable = %d",
2009221167Sgnn	    (ptr_t) devh, port, enable);
2010221167Sgnn
2011221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
2012221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2013221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
2014221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
2015221167Sgnn	}
2016221167Sgnn
2017221167Sgnn	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
2018221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2019221167Sgnn		    __FILE__, __func__, __LINE__,
2020221167Sgnn		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
2021221167Sgnn		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
2022221167Sgnn	}
2023221167Sgnn
2024221167Sgnn	status = __hal_mrpcim_mdio_access(devh, port,
2025221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
2026221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
2027221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1,
2028221167Sgnn	    &val);
2029221167Sgnn
2030221167Sgnn	if (status != VXGE_HAL_OK) {
2031221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2032221167Sgnn		    __FILE__, __func__, __LINE__, status);
2033221167Sgnn		return (status);
2034221167Sgnn	}
2035221167Sgnn
2036221167Sgnn	if (enable)
2037221167Sgnn		val |=
2038221167Sgnn		    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1_LOOPBACK;
2039221167Sgnn	else
2040221167Sgnn		val &=
2041221167Sgnn		    ~VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1_LOOPBACK;
2042221167Sgnn
2043221167Sgnn	status = __hal_mrpcim_mdio_access(devh, port,
2044221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_WRITE,
2045221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
2046221167Sgnn	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1,
2047221167Sgnn	    &val);
2048221167Sgnn
2049221167Sgnn	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2050221167Sgnn	    __FILE__, __func__, __LINE__, status);
2051221167Sgnn
2052221167Sgnn	return (VXGE_HAL_OK);
2053221167Sgnn}
2054221167Sgnn
2055221167Sgnn/*
2056221167Sgnn * vxge_hal_mgmt_xgmii_loopback - Enable or disable xgmii loopback
2057221167Sgnn * @devh: HAL device handle.
2058221167Sgnn * @port: Port number
2059221167Sgnn * @enable:Boolean set to 1 to enable and 0 to disable.
2060221167Sgnn *
2061221167Sgnn * Enable or disable xgmii loopback.
2062221167Sgnn * Return value:
2063221167Sgnn * 0 on success.
2064221167Sgnn */
2065221167Sgnnvxge_hal_status_e
2066221167Sgnnvxge_hal_mgmt_xgmii_loopback(vxge_hal_device_h devh, u32 port, u32 enable)
2067221167Sgnn{
2068221167Sgnn	u64 val64;
2069221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
2070221167Sgnn
2071221167Sgnn	vxge_assert(devh != NULL);
2072221167Sgnn
2073221167Sgnn	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
2074221167Sgnn	    __FILE__, __func__, __LINE__);
2075221167Sgnn
2076221167Sgnn	vxge_hal_trace_log_mrpcim(
2077221167Sgnn	    "devh = 0x"VXGE_OS_STXFMT", port = %d, enable = %d",
2078221167Sgnn	    (ptr_t) devh, port, enable);
2079221167Sgnn
2080221167Sgnn	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
2081221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2082221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
2083221167Sgnn		return (VXGE_HAL_ERR_INVALID_DEVICE);
2084221167Sgnn	}
2085221167Sgnn
2086221167Sgnn	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
2087221167Sgnn		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
2088221167Sgnn		    __FILE__, __func__, __LINE__,
2089221167Sgnn		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
2090221167Sgnn		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
2091221167Sgnn	}
2092221167Sgnn
2093221167Sgnn	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
2094221167Sgnn	    hldev->header.regh0,
2095221167Sgnn	    &hldev->mrpcim_reg->xmac_cfg_port[port]);
2096221167Sgnn	if (enable)
2097221167Sgnn		val64 |= VXGE_HAL_XMAC_CFG_PORT_XGMII_LOOPBACK;
2098221167Sgnn	else
2099221167Sgnn		val64 &= ~VXGE_HAL_XMAC_CFG_PORT_XGMII_LOOPBACK;
2100221167Sgnn
2101221167Sgnn	vxge_os_pio_mem_write64(hldev->header.pdev,
2102221167Sgnn	    hldev->header.regh0,
2103221167Sgnn	    val64,
2104221167Sgnn	    &hldev->mrpcim_reg->xmac_cfg_port[port]);
2105221167Sgnn
2106221167Sgnn	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
2107221167Sgnn	    __FILE__, __func__, __LINE__);
2108221167Sgnn
2109221167Sgnn	return (VXGE_HAL_OK);
2110221167Sgnn}
2111221167Sgnn
2112