111304SJanie.Lu@Sun.COM /*
211304SJanie.Lu@Sun.COM * CDDL HEADER START
311304SJanie.Lu@Sun.COM *
411304SJanie.Lu@Sun.COM * The contents of this file are subject to the terms of the
511304SJanie.Lu@Sun.COM * Common Development and Distribution License (the "License").
611304SJanie.Lu@Sun.COM * You may not use this file except in compliance with the License.
711304SJanie.Lu@Sun.COM *
811304SJanie.Lu@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911304SJanie.Lu@Sun.COM * or http://www.opensolaris.org/os/licensing.
1011304SJanie.Lu@Sun.COM * See the License for the specific language governing permissions
1111304SJanie.Lu@Sun.COM * and limitations under the License.
1211304SJanie.Lu@Sun.COM *
1311304SJanie.Lu@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
1411304SJanie.Lu@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1511304SJanie.Lu@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
1611304SJanie.Lu@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
1711304SJanie.Lu@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
1811304SJanie.Lu@Sun.COM *
1911304SJanie.Lu@Sun.COM * CDDL HEADER END
2011304SJanie.Lu@Sun.COM */
2111304SJanie.Lu@Sun.COM
2211304SJanie.Lu@Sun.COM /*
23*12132SSean.Ye@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2411304SJanie.Lu@Sun.COM */
2511304SJanie.Lu@Sun.COM #include <sys/types.h>
2611304SJanie.Lu@Sun.COM #include <px_err.h>
2711304SJanie.Lu@Sun.COM
2811304SJanie.Lu@Sun.COM #include "fabric-xlate.h"
2911304SJanie.Lu@Sun.COM
3011304SJanie.Lu@Sun.COM #define EPKT_DESC(b, o, p, c, d) (BLOCK_##b << 16 | OP_##o << 12 | \
3111304SJanie.Lu@Sun.COM PH_##p << 8 | CND_##c << 4 | DIR_##d)
3211304SJanie.Lu@Sun.COM
3311304SJanie.Lu@Sun.COM /* EPKT Table used only for RC/RP errors */
3411304SJanie.Lu@Sun.COM typedef struct fab_epkt_tbl {
3511304SJanie.Lu@Sun.COM uint32_t epkt_desc;
3611304SJanie.Lu@Sun.COM uint32_t pcie_ue_sts; /* Equivalent PCIe UE Status */
3711304SJanie.Lu@Sun.COM uint16_t pci_err_sts; /* Equivalent PCI Error Status */
3811304SJanie.Lu@Sun.COM uint16_t pci_bdg_sts; /* Equivalent PCI Bridge Status */
3911304SJanie.Lu@Sun.COM const char *tgt_class; /* Target Ereport Class */
4011304SJanie.Lu@Sun.COM } fab_epkt_tbl_t;
4111304SJanie.Lu@Sun.COM
4211304SJanie.Lu@Sun.COM static fab_epkt_tbl_t fab_epkt_tbl[] = {
4311304SJanie.Lu@Sun.COM EPKT_DESC(MMU, XLAT, DATA, INV, RDWR),
4411304SJanie.Lu@Sun.COM PCIE_AER_UCE_CA, 0, PCI_STAT_S_TARG_AB, 0,
4511304SJanie.Lu@Sun.COM EPKT_DESC(MMU, XLAT, ADDR, UNMAP, RDWR),
4611304SJanie.Lu@Sun.COM PCIE_AER_UCE_CA, 0, PCI_STAT_S_TARG_AB, 0,
4711304SJanie.Lu@Sun.COM EPKT_DESC(MMU, XLAT, DATA, PROT, RDWR),
4811304SJanie.Lu@Sun.COM PCIE_AER_UCE_CA, 0, PCI_STAT_S_TARG_AB, 0,
4911304SJanie.Lu@Sun.COM
5011304SJanie.Lu@Sun.COM EPKT_DESC(INTR, MSI32, DATA, ILL, IRR),
5111304SJanie.Lu@Sun.COM PCIE_AER_UCE_MTLP, PCI_STAT_S_SYSERR, 0, 0,
5211304SJanie.Lu@Sun.COM
5311304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, RCA, WRITE),
5411468SSean.Ye@Sun.COM 0, PCI_STAT_S_SYSERR, PCI_STAT_R_TARG_AB, 0,
5511304SJanie.Lu@Sun.COM
5611304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, RUR, WRITE),
5711468SSean.Ye@Sun.COM 0, PCI_STAT_S_SYSERR, PCI_STAT_R_MAST_AB, 0,
5811304SJanie.Lu@Sun.COM
5911304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, INV, RDWR),
6011304SJanie.Lu@Sun.COM PCIE_AER_UCE_MTLP, PCI_STAT_S_SYSERR, 0, 0,
6111304SJanie.Lu@Sun.COM
6211304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, TO, READ),
6311304SJanie.Lu@Sun.COM PCIE_AER_UCE_TO, PCI_STAT_S_SYSERR, 0, PCI_TARG_MA,
6411304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, TO, WRITE),
6511304SJanie.Lu@Sun.COM PCIE_AER_UCE_TO, PCI_STAT_S_SYSERR, 0, PCI_TARG_MA,
6611304SJanie.Lu@Sun.COM
6711304SJanie.Lu@Sun.COM EPKT_DESC(PORT, PIO, IRR, UC, IRR),
6811304SJanie.Lu@Sun.COM PCIE_AER_UCE_UC, PCI_STAT_S_SYSERR, 0, 0,
6911304SJanie.Lu@Sun.COM
7011304SJanie.Lu@Sun.COM EPKT_DESC(PORT, LINK, FC, TO, IRR),
7111304SJanie.Lu@Sun.COM PCIE_AER_UCE_FCP, PCI_STAT_S_SYSERR, 0, 0,
7211304SJanie.Lu@Sun.COM
7311304SJanie.Lu@Sun.COM 0, 0, 0, 0, 0
7411304SJanie.Lu@Sun.COM };
7511304SJanie.Lu@Sun.COM
7611304SJanie.Lu@Sun.COM /* ARGSUSED */
7711304SJanie.Lu@Sun.COM void
fab_epkt_to_data(fmd_hdl_t * hdl,nvlist_t * nvl,fab_data_t * data)7811304SJanie.Lu@Sun.COM fab_epkt_to_data(fmd_hdl_t *hdl, nvlist_t *nvl, fab_data_t *data)
7911304SJanie.Lu@Sun.COM {
8011304SJanie.Lu@Sun.COM data->nvl = nvl;
8111304SJanie.Lu@Sun.COM
8211304SJanie.Lu@Sun.COM /* Always Root Complex */
8311304SJanie.Lu@Sun.COM data->dev_type = PCIE_PCIECAP_DEV_TYPE_ROOT;
8411304SJanie.Lu@Sun.COM
8511304SJanie.Lu@Sun.COM data->pcie_ue_sev = (PCIE_AER_UCE_DLP | PCIE_AER_UCE_SD |
8611304SJanie.Lu@Sun.COM PCIE_AER_UCE_FCP | PCIE_AER_UCE_RO | PCIE_AER_UCE_MTLP);
8711304SJanie.Lu@Sun.COM }
8811304SJanie.Lu@Sun.COM
8911304SJanie.Lu@Sun.COM static int
fab_xlate_epkt(fmd_hdl_t * hdl,fab_data_t * data,px_rc_err_t * epktp)9011304SJanie.Lu@Sun.COM fab_xlate_epkt(fmd_hdl_t *hdl, fab_data_t *data, px_rc_err_t *epktp)
9111304SJanie.Lu@Sun.COM {
9211304SJanie.Lu@Sun.COM fab_epkt_tbl_t *entry;
9311304SJanie.Lu@Sun.COM uint32_t temp;
9411304SJanie.Lu@Sun.COM
9511304SJanie.Lu@Sun.COM for (entry = fab_epkt_tbl; entry->epkt_desc != 0; entry++) {
9611304SJanie.Lu@Sun.COM temp = *(uint32_t *)&epktp->rc_descr >> 12;
9711304SJanie.Lu@Sun.COM if (entry->epkt_desc == temp)
9811304SJanie.Lu@Sun.COM goto send;
9911304SJanie.Lu@Sun.COM }
10011304SJanie.Lu@Sun.COM
10111304SJanie.Lu@Sun.COM return (0);
10211304SJanie.Lu@Sun.COM
10311304SJanie.Lu@Sun.COM send:
10411304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "Translate epkt DESC = %#x\n", temp);
10511304SJanie.Lu@Sun.COM
10611304SJanie.Lu@Sun.COM /* Fill in PCI Status Register */
10711304SJanie.Lu@Sun.COM data->pci_err_status = entry->pci_err_sts;
10811304SJanie.Lu@Sun.COM data->pci_bdg_sec_stat = entry->pci_bdg_sts;
10911304SJanie.Lu@Sun.COM
11011304SJanie.Lu@Sun.COM /* Fill in the device status register */
11111304SJanie.Lu@Sun.COM if (epktp->rc_descr.STOP)
11211304SJanie.Lu@Sun.COM data->pcie_err_status = PCIE_DEVSTS_FE_DETECTED;
11311304SJanie.Lu@Sun.COM else if (epktp->rc_descr.C)
11411304SJanie.Lu@Sun.COM data->pcie_err_status = PCIE_DEVSTS_CE_DETECTED;
11511304SJanie.Lu@Sun.COM else
11611304SJanie.Lu@Sun.COM data->pcie_err_status = PCIE_DEVSTS_NFE_DETECTED;
11711304SJanie.Lu@Sun.COM
11811304SJanie.Lu@Sun.COM /* Fill in the AER UE register */
11911304SJanie.Lu@Sun.COM data->pcie_ue_status = entry->pcie_ue_sts;
12011304SJanie.Lu@Sun.COM
12111304SJanie.Lu@Sun.COM /* Fill in the AER Control register */
12211304SJanie.Lu@Sun.COM temp = entry->pcie_ue_sts;
12311304SJanie.Lu@Sun.COM for (data->pcie_adv_ctl = (uint32_t)-1; temp; data->pcie_adv_ctl++)
12411304SJanie.Lu@Sun.COM temp = temp >> 1;
12511304SJanie.Lu@Sun.COM
12611304SJanie.Lu@Sun.COM /* Send target ereports */
12711304SJanie.Lu@Sun.COM data->pcie_ue_no_tgt_erpt = B_TRUE;
12811304SJanie.Lu@Sun.COM if (entry->tgt_class && !epktp->rc_descr.STOP) {
12911304SJanie.Lu@Sun.COM if (epktp->rc_descr.D) {
13011304SJanie.Lu@Sun.COM data->pcie_ue_tgt_trans = PF_ADDR_DMA;
13111304SJanie.Lu@Sun.COM data->pcie_ue_tgt_addr = epktp->addr;
13211304SJanie.Lu@Sun.COM } else if (epktp->rc_descr.M) {
13311304SJanie.Lu@Sun.COM data->pcie_ue_tgt_trans = PF_ADDR_PIO;
13411304SJanie.Lu@Sun.COM data->pcie_ue_tgt_addr = epktp->addr;
13511304SJanie.Lu@Sun.COM }
13611304SJanie.Lu@Sun.COM
13711304SJanie.Lu@Sun.COM if (data->pcie_ue_tgt_trans)
13811304SJanie.Lu@Sun.COM fab_send_tgt_erpt(hdl, data, entry->tgt_class,
13911304SJanie.Lu@Sun.COM B_TRUE);
14011304SJanie.Lu@Sun.COM }
14111304SJanie.Lu@Sun.COM return (1);
14211304SJanie.Lu@Sun.COM }
14311304SJanie.Lu@Sun.COM
14411304SJanie.Lu@Sun.COM void
fab_xlate_epkt_erpts(fmd_hdl_t * hdl,nvlist_t * nvl,const char * class)14511304SJanie.Lu@Sun.COM fab_xlate_epkt_erpts(fmd_hdl_t *hdl, nvlist_t *nvl, const char *class)
14611304SJanie.Lu@Sun.COM {
14711304SJanie.Lu@Sun.COM fab_data_t data = {0};
14811304SJanie.Lu@Sun.COM px_rc_err_t epkt = {0};
14911304SJanie.Lu@Sun.COM pcie_tlp_hdr_t *tlp_hdr;
15011304SJanie.Lu@Sun.COM void *ptr;
15111304SJanie.Lu@Sun.COM uint8_t ver;
15211304SJanie.Lu@Sun.COM int err;
153*12132SSean.Ye@Sun.COM char *devpath, *rppath = NULL;
15411304SJanie.Lu@Sun.COM nvlist_t *detector;
15511304SJanie.Lu@Sun.COM
15611304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "epkt ereport received: %s\n", class);
15711304SJanie.Lu@Sun.COM fab_epkt_to_data(hdl, nvl, &data);
15811304SJanie.Lu@Sun.COM
15911304SJanie.Lu@Sun.COM err = nvlist_lookup_uint8(nvl, "epkt_ver", &ver);
16011304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint32(nvl, "desc", (uint32_t *)&epkt.rc_descr);
16111304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint32(nvl, "size", &epkt.size);
16211304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint64(nvl, "addr", &epkt.addr);
16311304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint64(nvl, "hdr1", &epkt.hdr[0]);
16411304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint64(nvl, "hdr2", &epkt.hdr[1]);
16511304SJanie.Lu@Sun.COM err |= nvlist_lookup_uint64(nvl, "reserved", &epkt.reserved);
16611304SJanie.Lu@Sun.COM
16711304SJanie.Lu@Sun.COM if (err != 0) {
16811304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "Failed to retrieve all epkt payloads");
16911304SJanie.Lu@Sun.COM return;
17011304SJanie.Lu@Sun.COM }
17111304SJanie.Lu@Sun.COM
17211304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "epkt flags: %c%c%c%c%c%c%c%c%c %s",
17311304SJanie.Lu@Sun.COM epkt.rc_descr.S ? 'S' : '-', epkt.rc_descr.M ? 'M' : '-',
17411304SJanie.Lu@Sun.COM epkt.rc_descr.S ? 'Q' : '-', epkt.rc_descr.D ? 'D' : '-',
17511304SJanie.Lu@Sun.COM epkt.rc_descr.R ? 'R' : '-', epkt.rc_descr.H ? 'H' : '-',
17611304SJanie.Lu@Sun.COM epkt.rc_descr.C ? 'C' : '-', epkt.rc_descr.I ? 'I' : '-',
17711304SJanie.Lu@Sun.COM epkt.rc_descr.B ? 'B' : '-', epkt.rc_descr.STOP ? "STOP" : "");
17811304SJanie.Lu@Sun.COM
17911304SJanie.Lu@Sun.COM /*
18011304SJanie.Lu@Sun.COM * If the least byte of the 'reserved' is non zero, it is device
18111304SJanie.Lu@Sun.COM * and function of the port
18211304SJanie.Lu@Sun.COM */
18311304SJanie.Lu@Sun.COM if (epkt.reserved && 0xff)
18411304SJanie.Lu@Sun.COM rppath = fab_find_rppath_by_df(hdl, nvl, epkt.reserved & 0xff);
18511304SJanie.Lu@Sun.COM
18611304SJanie.Lu@Sun.COM if (epkt.rc_descr.H) {
18711304SJanie.Lu@Sun.COM data.pcie_ue_hdr[0] = (uint32_t)(epkt.hdr[0] >> 32);
18811304SJanie.Lu@Sun.COM data.pcie_ue_hdr[1] = (uint32_t)epkt.hdr[0];
18911304SJanie.Lu@Sun.COM data.pcie_ue_hdr[2] = (uint32_t)(epkt.hdr[1] >> 32);
19011304SJanie.Lu@Sun.COM data.pcie_ue_hdr[3] = (uint32_t)(epkt.hdr[1]);
19111304SJanie.Lu@Sun.COM
19211304SJanie.Lu@Sun.COM tlp_hdr = (pcie_tlp_hdr_t *)&data.pcie_ue_hdr[0];
19311304SJanie.Lu@Sun.COM ptr = &data.pcie_ue_hdr[1];
19411304SJanie.Lu@Sun.COM switch (tlp_hdr->type) {
19511304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_IO:
19611304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_MEM:
19711304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_MEMLK:
19811304SJanie.Lu@Sun.COM {
19911304SJanie.Lu@Sun.COM pcie_mem64_t *pmp = ptr;
20011304SJanie.Lu@Sun.COM data.pcie_ue_tgt_trans = PF_ADDR_PIO;
20111304SJanie.Lu@Sun.COM data.pcie_ue_tgt_bdf = pmp->rid;
20211304SJanie.Lu@Sun.COM if (tlp_hdr->fmt & 0x1)
20311304SJanie.Lu@Sun.COM data.pcie_ue_tgt_addr =
20411304SJanie.Lu@Sun.COM ((uint64_t)pmp->addr1 << 32) | pmp->addr0;
20511304SJanie.Lu@Sun.COM else
20611304SJanie.Lu@Sun.COM data.pcie_ue_tgt_addr =
20711304SJanie.Lu@Sun.COM ((pcie_memio32_t *)ptr)->addr0;
20811304SJanie.Lu@Sun.COM
20911304SJanie.Lu@Sun.COM break;
21011304SJanie.Lu@Sun.COM }
21111304SJanie.Lu@Sun.COM
21211304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_CFG0:
21311304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_CFG1:
21411304SJanie.Lu@Sun.COM {
21511304SJanie.Lu@Sun.COM pcie_cfg_t *pcp = ptr;
21611304SJanie.Lu@Sun.COM
21711304SJanie.Lu@Sun.COM data.pcie_ue_tgt_trans = PF_ADDR_CFG;
21811304SJanie.Lu@Sun.COM data.pcie_ue_tgt_bdf =
21911304SJanie.Lu@Sun.COM (pcp->bus << 8) | (pcp->dev << 3) | pcp->func;
22011304SJanie.Lu@Sun.COM break;
22111304SJanie.Lu@Sun.COM }
22211304SJanie.Lu@Sun.COM
22311304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_CPL:
22411304SJanie.Lu@Sun.COM case PCIE_TLP_TYPE_CPLLK:
22511304SJanie.Lu@Sun.COM data.pcie_ue_tgt_bdf = ((pcie_cpl_t *)ptr)->rid;
22611304SJanie.Lu@Sun.COM break;
22711304SJanie.Lu@Sun.COM }
22811304SJanie.Lu@Sun.COM
22911304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "HEADER 0 0x%x", data.pcie_ue_hdr[0]);
23011304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "HEADER 1 0x%x", data.pcie_ue_hdr[1]);
23111304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "HEADER 2 0x%x", data.pcie_ue_hdr[2]);
23211304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "HEADER 3 0x%x", data.pcie_ue_hdr[3]);
23311304SJanie.Lu@Sun.COM fmd_hdl_debug(hdl, "In header bdf = %#hx addr = %#llx",
23411304SJanie.Lu@Sun.COM data.pcie_ue_tgt_bdf,
23511304SJanie.Lu@Sun.COM (uint64_t)data.pcie_ue_tgt_addr);
23611304SJanie.Lu@Sun.COM
23711304SJanie.Lu@Sun.COM /* find the root port to which this error is related */
238*12132SSean.Ye@Sun.COM if (rppath == NULL && data.pcie_ue_tgt_bdf)
23911304SJanie.Lu@Sun.COM rppath = fab_find_rppath_by_devbdf(hdl, nvl,
24011304SJanie.Lu@Sun.COM data.pcie_ue_tgt_bdf);
24111304SJanie.Lu@Sun.COM }
24211304SJanie.Lu@Sun.COM
243*12132SSean.Ye@Sun.COM /* find the root port by address */
244*12132SSean.Ye@Sun.COM if (rppath == NULL && epkt.rc_descr.M != 0) {
245*12132SSean.Ye@Sun.COM devpath = fab_find_addr(hdl, nvl, epkt.addr);
246*12132SSean.Ye@Sun.COM if (devpath) {
247*12132SSean.Ye@Sun.COM rppath = fab_find_rppath_by_devpath(hdl, devpath);
248*12132SSean.Ye@Sun.COM fmd_hdl_strfree(hdl, devpath);
249*12132SSean.Ye@Sun.COM }
250*12132SSean.Ye@Sun.COM }
251*12132SSean.Ye@Sun.COM
25211304SJanie.Lu@Sun.COM /*
25311304SJanie.Lu@Sun.COM * reset the detector in the original ereport to the root port
25411304SJanie.Lu@Sun.COM */
25511862SSean.Ye@Sun.COM if (rppath) {
25611862SSean.Ye@Sun.COM if (nvlist_alloc(&detector, NV_UNIQUE_NAME, 0) != 0) {
25711862SSean.Ye@Sun.COM fmd_hdl_error(hdl, "failed to allocate nvlist");
25811862SSean.Ye@Sun.COM fmd_hdl_strfree(hdl, rppath);
25911862SSean.Ye@Sun.COM return;
26011862SSean.Ye@Sun.COM }
26111304SJanie.Lu@Sun.COM (void) nvlist_add_string(detector, FM_VERSION,
26211304SJanie.Lu@Sun.COM FM_DEV_SCHEME_VERSION);
26311304SJanie.Lu@Sun.COM (void) nvlist_add_string(detector, FM_FMRI_SCHEME,
26411304SJanie.Lu@Sun.COM FM_FMRI_SCHEME_DEV);
26511304SJanie.Lu@Sun.COM (void) nvlist_add_string(detector, FM_FMRI_DEV_PATH, rppath);
26611304SJanie.Lu@Sun.COM (void) nvlist_remove_all(nvl, FM_EREPORT_DETECTOR);
26711304SJanie.Lu@Sun.COM (void) nvlist_add_nvlist(nvl, FM_EREPORT_DETECTOR, detector);
26811304SJanie.Lu@Sun.COM nvlist_free(detector);
26911862SSean.Ye@Sun.COM fmd_hdl_strfree(hdl, rppath);
27011862SSean.Ye@Sun.COM } else {
27111862SSean.Ye@Sun.COM /*
27211862SSean.Ye@Sun.COM * We can not locate the root port the error originated from.
27311862SSean.Ye@Sun.COM * Likely this is because the original ereport is malformed or
27411862SSean.Ye@Sun.COM * the hw error register has corrupted contents. In this case,
27511862SSean.Ye@Sun.COM * the best we can do is send ereports on all root ports.
27611862SSean.Ye@Sun.COM *
27711862SSean.Ye@Sun.COM * Set pcie_rp_send_all for fab_send_erpt() to process later.
27811862SSean.Ye@Sun.COM */
27911862SSean.Ye@Sun.COM fmd_hdl_debug(hdl, "RP not fond. Will translate on all RPs.\n");
28011862SSean.Ye@Sun.COM data.pcie_rp_send_all = B_TRUE;
28111304SJanie.Lu@Sun.COM }
28211304SJanie.Lu@Sun.COM
28311304SJanie.Lu@Sun.COM (void) fab_xlate_epkt(hdl, &data, &epkt);
28411304SJanie.Lu@Sun.COM fab_xlate_pcie_erpts(hdl, &data);
28511304SJanie.Lu@Sun.COM }
286