3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER START
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The contents of this file are subject to the terms of the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Common Development and Distribution License (the "License").
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You may not use this file except in compliance with the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * or http://www.opensolaris.org/os/licensing.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * See the License for the specific language governing permissions
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and limitations under the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * When distributing Covered Code, include this CDDL HEADER in each
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * If applicable, add the following below this CDDL HEADER, with the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * fields enclosed by brackets "[]" replaced with your own identifying
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * information: Portions Copyright [yyyy] [name of copyright owner]
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER END
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
1ed830817782694e7259ee818a2f8eee72233f1eMichael Speer * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use is subject to license terms.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_impl.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qslb_property_t lb_normal = {normal, "normal", hxge_lb_normal};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qslb_property_t lb_mac10g = {internal, "mac10g", hxge_lb_mac10g};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsuint32_t hxge_lb_dbg = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United Statesextern uint32_t hxge_jumbo_frame_size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_rtrace_ioctl(p_hxge_t, queue_t *, mblk_t *, struct iocblk *);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_global_reset(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_global_reset"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_intr_hw_disable(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep->suspended)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_link_init(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_vmac_init(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_intr_hw_enable(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_global_reset"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_hw_id_init(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_hw_id_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States * Initialize the frame size to either standard "1500 + 38" or
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States * jumbo. The user may tune the frame size through the "mtu" parameter
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States * using "dladm set-linkprop"
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States hxgep->vmac.minframesize = MIN_FRAME_SIZE;
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States hxgep->vmac.maxframesize = HXGE_DEFAULT_MTU + MTU_TO_FRAME_SIZE;
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States if (hxgep->param_arr[param_accept_jumbo].value)
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States hxgep->vmac.maxframesize = (uint16_t)hxge_jumbo_frame_size;
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_hw_id_init: maxframesize %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->vmac.maxframesize));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_hw_id_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_hw_init_niu_common(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_list_t hw_p;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_hw_init_niu_common"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((hw_p = hxgep->hxge_hw_p) == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MUTEX_ENTER(&hw_p->hxge_cfg_lock);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hw_p->flags & COMMON_INIT_DONE) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, MOD_CTL, "hxge_hw_init_niu_common"
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " already done for dip $%p exiting", hw_p->parent_devp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MUTEX_EXIT(&hw_p->hxge_cfg_lock);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hw_p->flags = COMMON_INIT_START;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, MOD_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "hxge_hw_init_niu_common Started for device id %x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hw_p->parent_devp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_pfc_hw_reset(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hw_p->flags = COMMON_INIT_DONE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MUTEX_EXIT(&hw_p->hxge_cfg_lock);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, MOD_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "hxge_hw_init_niu_common Done for device id %x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hw_p->parent_devp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_hw_init_niu_common"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsuint_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr(caddr_t arg1, caddr_t arg2)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t ldvp = (p_hxge_ldv_t)arg1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_t hxgep = (p_hxge_t)arg2;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_handle_t handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldg_t ldgp, t_ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t t_ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t vector0 = 0, vector1 = 0;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer int j, nldvs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_status_t rs = HPI_SUCCESS;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * DDI interface returns second arg as NULL
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((arg2 == NULL) || ((void *) ldvp->hxgep != arg2)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep = ldvp->hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (hxgep->hxge_mac_state != HXGE_MAC_STARTED) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, INT_CTL,
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "<== hxge_intr: not initialized"));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp = hxgep->ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr: ldgvp $%p", ldgvp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (ldvp == NULL && ldgvp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs t_ldvp = ldvp = ldgvp->ldvp;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (ldvp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = t_ldgp = ldvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ldgvp $%p ldvp $%p ldgp $%p", ldgvp, ldvp, ldgp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp == NULL || ldvp == NULL || ldgp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, INT_CTL, "==> hxge_intr: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ldgvp $%p ldvp $%p ldgp $%p", ldgvp, ldvp, ldgp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, INT_CTL, "<== hxge_intr: not ready"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * This interrupt handler will have to go through
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * all the logical devices to find out which
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * logical device interrupts us and then call
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * its handler to process the events.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs handle = HXGE_DEV_HPI_HANDLE(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs t_ldgp = ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs t_ldvp = ldgp->ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs = ldgp->nldvs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr: #ldvs %d #intrs %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs, ldgvp->ldg_intrs));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer HXGE_DEBUG_MSG((hxgep, INT_CTL,
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "==> hxge_intr(%d): #ldvs %d", i, nldvs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer /*
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer * Get this group's flag bits.
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer */
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer t_ldgp->interrupted = B_FALSE;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer rs = hpi_ldsv_ldfs_get(handle, t_ldgp->ldg, &vector0, &vector1);
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (rs != HPI_SUCCESS)
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (!vector0 && !vector1) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr: "
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "no interrupts on group %d", t_ldgp->ldg));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr: "
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "vector0 0x%llx vector1 0x%llx", vector0, vector1));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer t_ldgp->interrupted = B_TRUE;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer nldvs = t_ldgp->nldvs;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer /*
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer * Process all devices that share this group.
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer */
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer for (j = 0; j < nldvs; j++, t_ldvp++) {
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer /*
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer * Call device's handler if flag bits are on.
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer */
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer ldv = t_ldvp->ldv;
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if ((LDV_ON(ldv, vector0) | (LDV_ON(ldv, vector1)))) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "==> hxge_intr: calling device %d"
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer " #ldvs %d #intrs %d", j, nldvs, nintrs));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer (void) (t_ldvp->ldv_intr_handler)(
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer (caddr_t)t_ldvp, arg2);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer /*
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer * Re-arm group interrupts
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer */
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer if (t_ldgp->interrupted) {
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer HXGE_DEBUG_MSG((hxgep, INT_CTL,
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer "==> hxge_intr: arm group %d", t_ldgp->ldg));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer (void) hpi_intr_ldg_mgmt_set(handle, t_ldgp->ldg,
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer t_ldgp->arm, t_ldgp->ldg_timer);
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer }
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_intr"));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_CLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_peu_handle_sys_errors(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_handle_t handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_peu_sys_stats_t statsp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs peu_intr_stat_t stat;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs handle = hxgep->hpi_handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp = (p_hxge_peu_sys_stats_t)&hxgep->statsp->peu_sys_stats;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States HXGE_REG_RD32(handle, PEU_INTR_STAT, &stat.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The PCIE errors are unrecoverrable and cannot be cleared.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The only thing we can do here is to mask them off to prevent
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * continued interrupts.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
a512c5d1f2908d965887ad5494954ba2cf904bd2Qiyan Sun - Sun Microsystems - San Diego United States HXGE_REG_WR32(handle, PEU_INTR_MASK, 0xffffffff);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.spc_acc_err) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->spc_acc_err++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: spc_acc_err"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.tdc_pioacc_err) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->tdc_pioacc_err++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: tdc_pioacc_err"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.rdc_pioacc_err) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->rdc_pioacc_err++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: rdc_pioacc_err"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.pfc_pioacc_err) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->pfc_pioacc_err++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: pfc_pioacc_err"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.vmac_pioacc_err) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->vmac_pioacc_err++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: vmac_pioacc_err"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.cpl_hdrq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->cpl_hdrq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: cpl_hdrq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.cpl_dataq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->cpl_dataq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: cpl_dataq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.retryram_xdlh_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->retryram_xdlh_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: retryram_xdlh_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.retrysotram_xdlh_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->retrysotram_xdlh_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: retrysotram_xdlh_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.p_hdrq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->p_hdrq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: p_hdrq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.p_dataq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->p_dataq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: p_dataq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.np_hdrq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->np_hdrq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: np_hdrq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.np_dataq_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->np_dataq_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: np_dataq_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.eic_msix_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->eic_msix_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: eic_msix_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (stat.bits.hcr_parerr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->hcr_parerr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_peu_handle_sys_errors: hcr_parerr"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
1c29f7e382074ff2792b7f30c9be898ead487a30Qiyan Sun - Sun Microsystems - San Diego United States HXGE_FM_REPORT_ERROR(hxgep, NULL, HXGE_FM_EREPORT_PEU_ERR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsuint_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_syserr_intr(caddr_t arg1, caddr_t arg2)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t ldvp = (p_hxge_ldv_t)arg1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_t hxgep = (p_hxge_t)arg2;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldg_t ldgp = NULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_handle_t handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs dev_err_stat_t estat;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((arg1 == NULL) && (arg2 == NULL)) {
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((arg2 == NULL) ||
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ((ldvp != NULL) && ((void *)ldvp->hxgep != arg2))) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldvp != NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep = ldvp->hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_syserr_intr: arg2 $%p arg1 $%p", hxgep, ldvp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldvp != NULL && ldvp->use_timer == B_FALSE) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, SYSERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_syserrintr(no logical group): "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "arg2 $%p arg1 $%p", hxgep, ldvp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (DDI_INTR_UNCLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer /*
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer * This interrupt handler is for system error interrupts.
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs handle = HXGE_DEV_HPI_HANDLE(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs estat.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_fzc_sys_err_stat_get(handle, &estat);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_syserr_intr: device error 0x%016llx", estat.value));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (estat.bits.tdc_err0 || estat.bits.tdc_err1) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* TDMC */
3a109ad9413b360a5bfa6fa5ddfacef5fd64fe5bQiyan Sun - Sun Microsystems - San Diego United States HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3a109ad9413b360a5bfa6fa5ddfacef5fd64fe5bQiyan Sun - Sun Microsystems - San Diego United States "==> hxge_syserr_intr: device error - TDMC"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_txdma_handle_sys_errors(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else if (estat.bits.rdc_err0 || estat.bits.rdc_err1) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* RDMC */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_syserr_intr: device error - RDMC"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_rxdma_handle_sys_errors(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else if (estat.bits.vnm_pio_err1 || estat.bits.peu_err1) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* PCI-E */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_syserr_intr: device error - PCI-E"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* kstats are updated here */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_peu_handle_sys_errors(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (estat.bits.peu_err1)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_FM_REPORT_ERROR(hxgep, NULL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_FM_EREPORT_PEU_ERR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (estat.bits.vnm_pio_err1)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_FM_REPORT_ERROR(hxgep, NULL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_FM_EREPORT_PEU_VNM_PIO_ERR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else if (estat.value != 0) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_syserr_intr: device error - unknown"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((ldgp != NULL) && (ldvp != NULL) &&
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (ldgp->nldvs == 1) && !ldvp->use_timer) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_intr_ldg_mgmt_set(handle, ldgp->ldg,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs B_TRUE, ldgp->ldg_timer);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL, "<== hxge_syserr_intr"));
6ffca240bba331a8b22ff3ce47de58da6a205843Michael Speer return (DDI_INTR_CLAIMED);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr_hw_enable(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr_hw_enable"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_intr_mask_mgmt_set(hxgep, B_TRUE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_intr_hw_enable"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr_hw_disable(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr_hw_disable"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_intr_mask_mgmt_set(hxgep, B_FALSE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_intr_hw_disable"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
676f04004b15fc2872dfb0b7349d2d821a6eaa31Michael Speer/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_rx_hw_blank(void *arg, time_t ticks, uint_t count)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_t hxgep = (p_hxge_t)arg;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_rx_hw_blank"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Replace current ticks and counts for later
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * processing by the receive packet interrupt routines.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->intr_timeout = (uint16_t)ticks;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_rx_hw_blank"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_hw_stop(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_hw_stop"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_tx_vmac_disable(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_rx_vmac_disable(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_txdma_hw_mode(hxgep, HXGE_DMA_STOP);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_rxdma_hw_mode(hxgep, HXGE_DMA_STOP);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_hw_stop"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_hw_ioctl(p_hxge_t hxgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int cmd;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "==> hxge_hw_ioctl"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs iocp->ioc_error = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmd = iocp->ioc_cmd;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (cmd) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs default:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_PUT_TCAM:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_put_tcam(hxgep, mp->b_cont);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, 0, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_GET_TCAM:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_get_tcam(hxgep, mp->b_cont);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, 0, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_RTRACE:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_rtrace_ioctl(hxgep, wq, mp, iocp);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * 10G is the only loopback mode for Hydra.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_loopback_ioctl(p_hxge_t hxgep, queue_t *wq, mblk_t *mp,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs struct iocblk *iocp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_lb_property_t lb_props;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs size_t size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (mp->b_cont == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (iocp->ioc_cmd) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case LB_GET_MODE:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "HXGE_GET_LB_MODE command"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep != NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *(lb_info_sz_t *)mp->b_cont->b_rptr =
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->port_stats.lb_mode;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, sizeof (hxge_lb_t), 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case LB_SET_MODE:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "HXGE_SET_LB_MODE command"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (iocp->ioc_count != sizeof (uint32_t)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, 0, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((hxgep != NULL) && hxge_set_lb(hxgep, wq, mp->b_cont)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, 0, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EPROTO);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case LB_GET_INFO_SIZE:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "LB_GET_INFO_SIZE command"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep != NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs size = sizeof (lb_normal) + sizeof (lb_mac10g);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *(lb_info_sz_t *)mp->b_cont->b_rptr = size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "HXGE_GET_LB_INFO command: size %d", size));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, sizeof (lb_info_sz_t), 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case LB_GET_INFO:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "HXGE_GET_LB_INFO command"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep != NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs size = sizeof (lb_normal) + sizeof (lb_mac10g);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "HXGE_GET_LB_INFO command: size %d", size));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (size == iocp->ioc_count) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs i = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_props = (p_lb_property_t)mp->b_cont->b_rptr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_props[i++] = lb_normal;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_props[i++] = lb_mac10g;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, size, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE, "hxge_hw_ioctl: invalid command 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs iocp->ioc_cmd);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsboolean_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_set_lb(p_hxge_t hxgep, queue_t *wq, p_mblk_t mp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs boolean_t status = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t lb_mode;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_property_t *lb_info;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, IOC_CTL, "<== hxge_set_lb"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_mode = hxgep->statsp->port_stats.lb_mode;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (lb_mode == *(uint32_t *)mp->b_rptr) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "hxge%d: Loopback mode already set (lb_mode %d).\n",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->instance, lb_mode);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_set_lb_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_mode = *(uint32_t *)mp->b_rptr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_info = NULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* 10G is the only loopback mode for Hydra */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (lb_mode == lb_normal.value)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_info = &lb_normal;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else if (lb_mode == lb_mac10g.value)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs lb_info = &lb_mac10g;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "hxge%d: Loopback mode not supported(mode %d).\n",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->instance, lb_mode);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_set_lb_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (lb_mode == hxge_lb_normal) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxge_lb_dbg) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "!hxge%d: Returning to normal operation",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->instance);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->port_stats.lb_mode = hxge_lb_normal;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_global_reset(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_set_lb_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->port_stats.lb_mode = lb_mode;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxge_lb_dbg)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE, "!hxge%d: Adapter now in %s loopback mode",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->instance, lb_info->key);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (lb_info->lb_type == internal) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((hxgep->statsp->port_stats.lb_mode == hxge_lb_mac10g))
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->mac_stats.link_speed = 10000;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cmn_err(CE_NOTE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "hxge%d: Loopback mode not supported(mode %d).\n",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->instance, lb_mode);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_set_lb_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->mac_stats.link_duplex = 2;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->statsp->mac_stats.link_up = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_global_reset(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_set_lb_exit:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_set_lb status = 0x%08x", status));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_check_hw_state(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t t_ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL, "==> hxge_check_hw_state"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MUTEX_ENTER(hxgep->genlock);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->hxge_timerid = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!(hxgep->drv_state & STATE_HW_INITIALIZED)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_check_hw_state_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_check_tx_hang(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp = hxgep->ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp == NULL || (ldgvp->ldvp_syserr == NULL)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, SYSERR_CTL, "<== hxge_check_hw_state: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "NULL ldgvp (interrupt not ready)."));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_check_hw_state_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs t_ldvp = ldgvp->ldvp_syserr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!t_ldvp->use_timer) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL, "<== hxge_check_hw_state: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ldgvp $%p t_ldvp $%p use_timer flag %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp, t_ldvp, t_ldvp->use_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs goto hxge_check_hw_state_exit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (fm_check_acc_handle(hxgep->dev_regs->hxge_regh) != DDI_FM_OK) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "Bad register acc handle"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_syserr_intr((caddr_t)t_ldvp, (caddr_t)hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->hxge_timerid = hxge_start_timer(hxgep, hxge_check_hw_state,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_CHECK_TIMER);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_check_hw_state_exit:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MUTEX_EXIT(hxgep->genlock);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, SYSERR_CTL, "<== hxge_check_hw_state"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_rtrace_ioctl(p_hxge_t hxgep, queue_t *wq, mblk_t *mp,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs struct iocblk *iocp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ssize_t size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtrace_t *rtp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mblk_t *nmp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t i, j;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t start_blk;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t base_entry;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t num_entries;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL, "==> hxge_rtrace_ioctl"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs size = 1024;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (mp->b_cont == NULL || MBLKL(mp->b_cont) < size) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "malformed M_IOCTL MBLKL = %d size = %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs MBLKL(mp->b_cont), size));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocnak(wq, mp, 0, EINVAL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nmp = mp->b_cont;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp = (rtrace_t *)nmp->b_rptr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs start_blk = rtp->next_idx;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs num_entries = rtp->last_idx;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs base_entry = start_blk * MAX_RTRACE_IOC_ENTRIES;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL, "start_blk = %d\n", start_blk));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL, "num_entries = %d\n", num_entries));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL, "base_entry = %d\n", base_entry));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->next_idx = hpi_rtracebuf.next_idx;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->last_idx = hpi_rtracebuf.last_idx;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->wrapped = hpi_rtracebuf.wrapped;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0, j = base_entry; i < num_entries; i++, j++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->buf[i].ctl_addr = hpi_rtracebuf.buf[j].ctl_addr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->buf[i].val_l32 = hpi_rtracebuf.buf[j].val_l32;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rtp->buf[i].val_h32 = hpi_rtracebuf.buf[j].val_h32;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nmp->b_wptr = nmp->b_rptr + size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, STR_CTL, "<== hxge_rtrace_ioctl"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs miocack(wq, mp, (int)size, 0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}