9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _SYS_IB_ADAPTERS_HERMON_FM_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define _SYS_IB_ADAPTERS_HERMON_FM_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * hermon_fm.h
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ddifm.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/fm/protocol.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/fm/util.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/fm/io/ddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern "C" {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FMA compile note.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FMA_TEST is used for HCA function tests, and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the macro can be on by changing Makefile.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in case of DEBUG
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FMA_TEST is on
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in case of non-DEBUG (DEBUG is off)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FMA_TEST is off
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FM common data structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FM Structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This structure is used to catch HCA HW errors.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct i_hca_fm {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ref_cnt; /* the number of instances referring to this */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t lock; /* protection for last_err & polling thread */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct i_hca_acc_handle *hdl; /* HCA FM acc handle structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct kmem_cache *fm_acc_cache; /* HCA acc handle cache */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FM acc handle structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This structure is holding ddi_acc_handle_t and other members
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to deal with HCA PIO FM.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct i_hca_acc_handle {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct i_hca_acc_handle *next; /* next structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t save_hdl; /* acc handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t lock; /* mutex lock for thread count */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t thread_cnt; /* number of threads issuing PIOs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(SCHEME_PROTECTS_DATA("safe sharing", i_hca_acc_handle::save_hdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define fm_acc_hdl(hdl) (((struct i_hca_acc_handle *)(hdl))->save_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define FM_POLL_INTERVAL (10000000) /* 10ms (nano) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FM function test structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This structure can be used to test the basic fm function test for HCA.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The test code is included if the FMA_TEST macro is defined.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct i_hca_fm_test {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int num; /* serial numner */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int type; /* PIO or Hermon specific errors */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_PIO 0x1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_IBA 0x2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int trigger; /* how to trigger a HW error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_TRANSIENT 0x0001
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_PERSISTENT 0x0002
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_ATTACH 0x0010
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_START 0x0100
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_TEST_END 0x0200
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void (*pio_injection)(struct i_hca_fm_test *, ddi_fm_error_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int errcnt; /* how many transient error occurs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int line_num; /* line number in the source code */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *file_name; /* source filename */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *hash_key; /* hash table for test items */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *private; /* private data */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Hermon FM data structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct i_hca_fm hermon_hca_fm_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct i_hca_acc_handle hermon_acc_handle_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct i_hca_fm_test hermon_test_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines are to supplement device error reporting.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * At each place where the planned FMA error matrix specifies that
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * an ereport will be generated, for now there is a HERMON_FMANOTE()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * call generating an appropriate message string.
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * This has been revised since it has been realized that FMA is only
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * to be used for hardware errors. HERMON_FMANOTE() is used to report
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * errors that are likely to be hardware, but possibly are not.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMANOTE(state, string) \
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor cmn_err(CE_WARN, "hermon%d: Device Error: %s", \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->hs_instance, string)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* CQE Syndrome errors - see hermon_cq.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCLEN "CQE local length error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCQPOP "CQE local qp operation error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCPROT "CQE local protection error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_WQFLUSH "CQE wqe flushed in error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_MWBIND "CQE memory window bind error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_RESP "CQE bad response"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCACC "CQE local access error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_REMREQ "CQE remote invalid request error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_REMACC "CQE remote access error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_REMOP "CQE remote operation error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_XPORTCNT "CQE transport retry counter exceeded"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_RNRCNT "CQE RNR retry counter exceeded"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_REMABRT "CQE remote aborted error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_UNKN "CQE unknown/reserved error returned"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* event errors - see hermon_event.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_OVERRUN "EQE cq overrun or protection error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCCAT "EQE local work queue catastrophic error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_QPCAT "EQE local queue pair catastrophic error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_PATHMIG "EQE path migration failed"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCINV "EQE invalid request - local work queue"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_LOCACEQ "EQE local access violation"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_SRQCAT "EQE shared received queue catastrophic"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_INTERNAL "EQE hca internal error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCR device failure returns - see hermon_cmd.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_HCRINT "HCR internal error processing command"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_NVMEM "HCR NVRAM checksum/CRC failure"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_TOTOG "HCR Timeout waiting for command toggle"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_GOBIT "HCR Timeout waiting for command go bit"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_RSRC "HCR Command insufficient resources"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_CMDINV "HCR Command invalid status returned"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA initialization errors - see hermon.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_FWVER "HCA firmware not at minimum version"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_PCIID "HCA PCIe devid not supported"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_MAINT "HCA device set to memory controller mode"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_FMA_BADNVMEM "HCR bad NVMEM error"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA FM constants
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA FM state */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_NO_FM 0x0000 /* HCA FM is not supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA FM state flags */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_PIO_FM 0x0001 /* PIO is fma-protected */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_DMA_FM 0x0002 /* DMA is fma-protected */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_EREPORT_FM 0x0004 /* FMA ereport is available */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERRCB_FM 0x0010 /* FMA error callback is supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ATTCH_FM 0x0100 /* HCA FM attach mode */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_RUNTM_FM 0x0200 /* HCA FM runtime mode */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA ererport type */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_SYS_ERR 0x001 /* HW error reported by Solaris FMA */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_IBA_ERR 0x002 /* IB specific HW error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA ereport detail */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_TRANSIENT 0x010 /* HCA temporary error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_NON_FATAL 0x020 /* HCA persistent error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_SRV_LOST 0x040 /* HCA attach failure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_DEGRADED 0x080 /* HCA maintenance mode */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_FATAL 0x100 /* HCA critical situation */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_ERR_IOCTL 0x200 /* EIO */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Ignore HCA HW error check */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_SKIP_HW_CHK (-1)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA FM pio retry operation state */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_PIO_OK (0) /* No HW errors */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_PIO_TRANSIENT (1) /* transient error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_PIO_PERSISTENT (2) /* persistent error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HCA_PIO_RETRY_CNT (3)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
32c5adfd7396fc0a0807a6f8cbb3a257e4c27af2Eiji Ota/* HCA firmware faults */
32c5adfd7396fc0a0807a6f8cbb3a257e4c27af2Eiji Ota#define HCA_FW_MISC 0x1 /* firmware misc faults */
32c5adfd7396fc0a0807a6f8cbb3a257e4c27af2Eiji Ota#define HCA_FW_CORRUPT 0x2 /* firmware corruption */
32c5adfd7396fc0a0807a6f8cbb3a257e4c27af2Eiji Ota#define HCA_FW_MISMATCH 0x3 /* firmware version mismatch */
32c5adfd7396fc0a0807a6f8cbb3a257e4c27af2Eiji Ota
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Hermon FM macros
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef FMA_TEST
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TEST_DECLARE(tst) hermon_test_t *tst;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define REGISTER_PIO_TEST(st, tst) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tst = hermon_test_register(st, __FILE__, __LINE__, HCA_TEST_PIO)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PIO_START(st, hdl, tst) hermon_PIO_start(st, hdl, tst)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PIO_END(st, hdl, cnt, tst) hermon_PIO_end(st, hdl, &cnt, tst)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#else
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TEST_DECLARE(tst)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define REGISTER_PIO_TEST(st, tst)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PIO_START(st, hdl, tst) hermon_PIO_start(st, hdl, NULL)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PIO_END(st, hdl, cnt, tst) hermon_PIO_end(st, hdl, &cnt, NULL)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* FMA_TEST */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * hermon_pio_init() is a macro initializing variables.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define hermon_pio_init(cnt, status, tst) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TEST_DECLARE(tst) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status = HCA_PIO_OK; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int cnt = HCA_PIO_RETRY_CNT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * hermon_pio_start() is one of a pair of macros checking HW errors
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * at PIO requests, which should be called before the requests are issued.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define hermon_pio_start(st, hdl, label, cnt, status, tst) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (st->hs_fm_state & HCA_PIO_FM) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (st->hs_fm_async_fatal) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_fm_ereport(st, HCA_SYS_ERR, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor HCA_ERR_NON_FATAL); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto label; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor REGISTER_PIO_TEST(st, tst); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cnt = HCA_PIO_RETRY_CNT; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (PIO_START(st, hdl, tst) == \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor HCA_PIO_PERSISTENT) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto label; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = HCA_SKIP_HW_CHK; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor do {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * hermon_pio_end() is the other of a pair of macros checking HW errors
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * at PIO requests, which should be called after the requests end.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If a HW error is detected and can be isolated well, these macros
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * retry the operation to determine if the error is persistent or not.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define hermon_pio_end(st, hdl, label, cnt, status, tst) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != HCA_SKIP_HW_CHK) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (st->hs_fm_async_fatal) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_fm_ereport(st, HCA_SYS_ERR, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor HCA_ERR_NON_FATAL); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto label; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((status = PIO_END(st, hdl, cnt, tst)) == \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor HCA_PIO_PERSISTENT) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto label; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else if (status == HCA_PIO_TRANSIENT) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_fm_ereport(st, HCA_SYS_ERR, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor HCA_ERR_TRANSIENT); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } while (status == HCA_PIO_TRANSIENT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_fm_init(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_fm_fini(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_fm_ereport_init(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_fm_ereport_fini(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_get_state(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern boolean_t hermon_init_failure(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern boolean_t hermon_cmd_retry_ok(hermon_cmd_post_t *, int);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_fm_ereport(hermon_state_t *, int, int);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_regs_map_setup(hermon_state_t *, uint_t, caddr_t *, offset_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor offset_t, ddi_device_acc_attr_t *, ddi_acc_handle_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_regs_map_free(hermon_state_t *, ddi_acc_handle_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_pci_config_setup(hermon_state_t *, ddi_acc_handle_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_pci_config_teardown(hermon_state_t *, ddi_acc_handle_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ushort_t hermon_devacc_attr_version(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern uchar_t hermon_devacc_attr_access(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_PIO_start(hermon_state_t *, ddi_acc_handle_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_test_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_PIO_end(hermon_state_t *, ddi_acc_handle_t, int *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_test_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_rsrc_alloc_uarhdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_get_uarhdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_get_cmdhdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_get_msix_tblhdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_get_msix_pbahdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern ddi_acc_handle_t hermon_get_pcihdl(hermon_state_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_clr_state_nolock(hermon_state_t *, int);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_inter_err_chk(void *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef FMA_TEST
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern hermon_test_t *hermon_test_register(hermon_state_t *, char *, int, int);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern void hermon_test_deregister(void);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_test_num;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* FMA_TEST */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _SYS_IB_ADAPTERS_HERMON_FM_H */