xref: /onnv-gate/usr/src/uts/common/io/ixgbe/ixgbe_debug.c (revision 11878:ac93462db6d7)
16621Sbt150084 /*
26621Sbt150084  * CDDL HEADER START
36621Sbt150084  *
49353SSamuel.Tu@Sun.COM  * Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
56621Sbt150084  * The contents of this file are subject to the terms of the
66621Sbt150084  * Common Development and Distribution License (the "License").
76621Sbt150084  * You may not use this file except in compliance with the License.
86621Sbt150084  *
9*11878SVenu.Iyer@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*11878SVenu.Iyer@Sun.COM  * or http://www.opensolaris.org/os/licensing.
116621Sbt150084  * See the License for the specific language governing permissions
126621Sbt150084  * and limitations under the License.
136621Sbt150084  *
14*11878SVenu.Iyer@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
15*11878SVenu.Iyer@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
166621Sbt150084  * If applicable, add the following below this CDDL HEADER, with the
176621Sbt150084  * fields enclosed by brackets "[]" replaced with your own identifying
186621Sbt150084  * information: Portions Copyright [yyyy] [name of copyright owner]
196621Sbt150084  *
206621Sbt150084  * CDDL HEADER END
216621Sbt150084  */
226621Sbt150084 
236621Sbt150084 /*
24*11878SVenu.Iyer@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
259353SSamuel.Tu@Sun.COM  * Use is subject to license terms.
266621Sbt150084  */
276621Sbt150084 
286621Sbt150084 #include "ixgbe_sw.h"
296621Sbt150084 #include "ixgbe_debug.h"
306621Sbt150084 
316621Sbt150084 #ifdef IXGBE_DEBUG
326621Sbt150084 extern ddi_device_acc_attr_t ixgbe_regs_acc_attr;
336621Sbt150084 
346621Sbt150084 /*
356621Sbt150084  * Dump interrupt-related registers & structures
366621Sbt150084  */
376621Sbt150084 void
ixgbe_dump_interrupt(void * adapter,char * tag)386621Sbt150084 ixgbe_dump_interrupt(void *adapter, char *tag)
396621Sbt150084 {
406621Sbt150084 	ixgbe_t *ixgbe = (ixgbe_t *)adapter;
416621Sbt150084 	struct ixgbe_hw	*hw = &ixgbe->hw;
42*11878SVenu.Iyer@Sun.COM 	ixgbe_intr_vector_t *vect;
43*11878SVenu.Iyer@Sun.COM 	uint32_t ivar, reg, hw_index;
446621Sbt150084 	int i, j;
456621Sbt150084 
466621Sbt150084 	/*
476621Sbt150084 	 * interrupt control registers
486621Sbt150084 	 */
496621Sbt150084 	ixgbe_log(ixgbe, "interrupt: %s\n", tag);
506621Sbt150084 	ixgbe_log(ixgbe, "..eims: 0x%x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
516621Sbt150084 	ixgbe_log(ixgbe, "..eimc: 0x%x\n", IXGBE_READ_REG(hw, IXGBE_EIMC));
526621Sbt150084 	ixgbe_log(ixgbe, "..eiac: 0x%x\n", IXGBE_READ_REG(hw, IXGBE_EIAC));
536621Sbt150084 	ixgbe_log(ixgbe, "..eiam: 0x%x\n", IXGBE_READ_REG(hw, IXGBE_EIAM));
546621Sbt150084 	ixgbe_log(ixgbe, "..gpie: 0x%x\n", IXGBE_READ_REG(hw, IXGBE_GPIE));
558490SPaul.Guo@Sun.COM 	ixgbe_log(ixgbe, "otherflag: 0x%x\n", ixgbe->capab->other_intr);
568490SPaul.Guo@Sun.COM 	ixgbe_log(ixgbe, "eims_mask: 0x%x\n", ixgbe->eims);
576621Sbt150084 
586621Sbt150084 	/* ivar: interrupt vector allocation registers */
596621Sbt150084 	for (i = 0; i < IXGBE_IVAR_REG_NUM; i++) {
606621Sbt150084 		if (ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(i))) {
616621Sbt150084 			ixgbe_log(ixgbe, "ivar[%d]: 0x%x\n", i, ivar);
626621Sbt150084 		}
636621Sbt150084 	}
646621Sbt150084 
656621Sbt150084 	/* each allocated vector */
666621Sbt150084 	for (i = 0; i < ixgbe->intr_cnt; i++) {
676621Sbt150084 	vect =  &ixgbe->vect_map[i];
686621Sbt150084 	ixgbe_log(ixgbe,
696621Sbt150084 	    "vector %d  rx rings %d  tx rings %d  eitr: 0x%x\n",
706621Sbt150084 	    i, vect->rxr_cnt, vect->txr_cnt,
716621Sbt150084 	    IXGBE_READ_REG(hw, IXGBE_EITR(i)));
726621Sbt150084 
736621Sbt150084 	/* for each rx ring bit set */
746621Sbt150084 	j = bt_getlowbit(vect->rx_map, 0, (ixgbe->num_rx_rings - 1));
756621Sbt150084 	while (j >= 0) {
76*11878SVenu.Iyer@Sun.COM 		hw_index = ixgbe->rx_rings[j].hw_index;
776621Sbt150084 		ixgbe_log(ixgbe, "rx %d  ivar %d  rxdctl: 0x%x  srrctl: 0x%x\n",
78*11878SVenu.Iyer@Sun.COM 		    hw_index, IXGBE_IVAR_RX_QUEUE(hw_index),
79*11878SVenu.Iyer@Sun.COM 		    IXGBE_READ_REG(hw, IXGBE_RXDCTL(hw_index)),
80*11878SVenu.Iyer@Sun.COM 		    IXGBE_READ_REG(hw, IXGBE_SRRCTL(hw_index)));
816621Sbt150084 		j = bt_getlowbit(vect->rx_map, (j + 1),
826621Sbt150084 		    (ixgbe->num_rx_rings - 1));
836621Sbt150084 	}
846621Sbt150084 
856621Sbt150084 	/* for each tx ring bit set */
866621Sbt150084 	j = bt_getlowbit(vect->tx_map, 0, (ixgbe->num_tx_rings - 1));
876621Sbt150084 	while (j >= 0) {
886621Sbt150084 		ixgbe_log(ixgbe, "tx %d  ivar %d  txdctl: 0x%x\n",
896621Sbt150084 		    j, IXGBE_IVAR_TX_QUEUE(j),
906621Sbt150084 		    IXGBE_READ_REG(hw, IXGBE_TXDCTL(j)));
916621Sbt150084 		j = bt_getlowbit(vect->tx_map, (j + 1),
926621Sbt150084 		    (ixgbe->num_tx_rings - 1));
936621Sbt150084 	}
946621Sbt150084 	}
956621Sbt150084 
966621Sbt150084 	/* reta: RSS redirection table */
976621Sbt150084 	for (i = 0; i < 32; i++) {
986621Sbt150084 		ixgbe_log(ixgbe, "reta(%d): 0x%x\n",
996621Sbt150084 		    i, IXGBE_READ_REG(hw, IXGBE_RETA(i)));
1006621Sbt150084 	}
1016621Sbt150084 
1026621Sbt150084 	/* rssrk: RSS random key */
1036621Sbt150084 	for (i = 0; i < 10; i++) {
1046621Sbt150084 		ixgbe_log(ixgbe, "rssrk(%d): 0x%x\n",
1056621Sbt150084 		    i, IXGBE_READ_REG(hw, IXGBE_RSSRK(i)));
1066621Sbt150084 	}
1076621Sbt150084 
1086621Sbt150084 	/* check ral/rah */
1096621Sbt150084 	ixgbe_log(ixgbe, "-- ral/rah --\n");
1106621Sbt150084 	for (i = 0; i < 16; i++) {
1116621Sbt150084 		if (reg = IXGBE_READ_REG(hw, IXGBE_RAL(i))) {
1126621Sbt150084 			ixgbe_log(ixgbe, "ral(%d): 0x%x  rah(%d): 0x%x\n",
1136621Sbt150084 			    i, reg, i, IXGBE_READ_REG(hw, IXGBE_RAH(i)));
1146621Sbt150084 		}
1156621Sbt150084 	}
1166621Sbt150084 
1176621Sbt150084 	/* check mta */
1186621Sbt150084 	ixgbe_log(ixgbe, "-- mta --\n");
1196621Sbt150084 	for (i = 0; i < 128; i++) {
1206621Sbt150084 		if (reg = IXGBE_READ_REG(hw, IXGBE_MTA(i))) {
1216621Sbt150084 			ixgbe_log(ixgbe, "mta(%d): 0x%x\n", i, reg);
1226621Sbt150084 		}
1236621Sbt150084 	}
1246621Sbt150084 
1256621Sbt150084 	/* check vfta */
1266621Sbt150084 	{
1276621Sbt150084 	uint32_t off = IXGBE_VFTA(0);
1286621Sbt150084 	ixgbe_log(ixgbe, "-- vfta --\n");
1296621Sbt150084 	for (i = 0; i < 640; i++) {
1306621Sbt150084 		if (reg = IXGBE_READ_REG(hw, off)) {
1316621Sbt150084 			ixgbe_log(ixgbe, "vfta(0x%x): 0x%x\n", off, reg);
1326621Sbt150084 		}
1336621Sbt150084 		off += 4;
1346621Sbt150084 	}
1356621Sbt150084 	}
1366621Sbt150084 
1376621Sbt150084 	/* check mdef */
1386621Sbt150084 	ixgbe_log(ixgbe, "-- mdef --\n");
1396621Sbt150084 	for (i = 0; i < 8; i++) {
1406621Sbt150084 		if (reg = IXGBE_READ_REG(hw, IXGBE_MDEF(i))) {
1416621Sbt150084 			ixgbe_log(ixgbe, "mdef(%d): 0x%x\n", i, reg);
1426621Sbt150084 		}
1436621Sbt150084 	}
1446621Sbt150084 }
1456621Sbt150084 
1466621Sbt150084 /*
1476621Sbt150084  * Dump an ethernet address
1486621Sbt150084  */
1496621Sbt150084 void
ixgbe_dump_addr(void * adapter,char * tag,const uint8_t * addr)1506621Sbt150084 ixgbe_dump_addr(void *adapter, char *tag, const uint8_t *addr)
1516621Sbt150084 {
1526621Sbt150084 	ixgbe_t *ixgbe = (ixgbe_t *)adapter;
1536621Sbt150084 	char		form[25];
1546621Sbt150084 
1556621Sbt150084 	(void) sprintf(form, "%02x:%02x:%02x:%02x:%02x:%02x",
1566621Sbt150084 	    *addr, *(addr + 1), *(addr + 2),
1576621Sbt150084 	    *(addr + 3), *(addr + 4), *(addr + 5));
1586621Sbt150084 
1596621Sbt150084 	ixgbe_log(ixgbe, "%s %s\n", tag, form);
1606621Sbt150084 }
1616621Sbt150084 
1626621Sbt150084 void
ixgbe_pci_dump(void * arg)1636621Sbt150084 ixgbe_pci_dump(void *arg)
1646621Sbt150084 {
1656621Sbt150084 	ixgbe_t *ixgbe = (ixgbe_t *)arg;
1666621Sbt150084 	ddi_acc_handle_t handle;
1676621Sbt150084 	uint8_t cap_ptr;
1686621Sbt150084 	uint8_t next_ptr;
1696621Sbt150084 	uint32_t msix_bar;
1706621Sbt150084 	uint32_t msix_ctrl;
1716621Sbt150084 	uint32_t msix_tbl_sz;
1726621Sbt150084 	uint32_t tbl_offset;
1736621Sbt150084 	uint32_t tbl_bir;
1746621Sbt150084 	uint32_t pba_offset;
1756621Sbt150084 	uint32_t pba_bir;
1766621Sbt150084 	off_t offset;
1776621Sbt150084 	off_t mem_size;
1786621Sbt150084 	uintptr_t base;
1796621Sbt150084 	ddi_acc_handle_t acc_hdl;
1806621Sbt150084 	int i;
1816621Sbt150084 
1826621Sbt150084 	handle = ixgbe->osdep.cfg_handle;
1836621Sbt150084 
1846621Sbt150084 	ixgbe_log(ixgbe, "Begin dump PCI config space");
1856621Sbt150084 
1866621Sbt150084 	ixgbe_log(ixgbe,
1876621Sbt150084 	    "PCI_CONF_VENID:\t0x%x\n",
1886621Sbt150084 	    pci_config_get16(handle, PCI_CONF_VENID));
1896621Sbt150084 	ixgbe_log(ixgbe,
1906621Sbt150084 	    "PCI_CONF_DEVID:\t0x%x\n",
1916621Sbt150084 	    pci_config_get16(handle, PCI_CONF_DEVID));
1926621Sbt150084 	ixgbe_log(ixgbe,
1936621Sbt150084 	    "PCI_CONF_COMMAND:\t0x%x\n",
1946621Sbt150084 	    pci_config_get16(handle, PCI_CONF_COMM));
1956621Sbt150084 	ixgbe_log(ixgbe,
1966621Sbt150084 	    "PCI_CONF_STATUS:\t0x%x\n",
1976621Sbt150084 	    pci_config_get16(handle, PCI_CONF_STAT));
1986621Sbt150084 	ixgbe_log(ixgbe,
1996621Sbt150084 	    "PCI_CONF_REVID:\t0x%x\n",
2006621Sbt150084 	    pci_config_get8(handle, PCI_CONF_REVID));
2016621Sbt150084 	ixgbe_log(ixgbe,
2026621Sbt150084 	    "PCI_CONF_PROG_CLASS:\t0x%x\n",
2036621Sbt150084 	    pci_config_get8(handle, PCI_CONF_PROGCLASS));
2046621Sbt150084 	ixgbe_log(ixgbe,
2056621Sbt150084 	    "PCI_CONF_SUB_CLASS:\t0x%x\n",
2066621Sbt150084 	    pci_config_get8(handle, PCI_CONF_SUBCLASS));
2076621Sbt150084 	ixgbe_log(ixgbe,
2086621Sbt150084 	    "PCI_CONF_BAS_CLASS:\t0x%x\n",
2096621Sbt150084 	    pci_config_get8(handle, PCI_CONF_BASCLASS));
2106621Sbt150084 	ixgbe_log(ixgbe,
2116621Sbt150084 	    "PCI_CONF_CACHE_LINESZ:\t0x%x\n",
2126621Sbt150084 	    pci_config_get8(handle, PCI_CONF_CACHE_LINESZ));
2136621Sbt150084 	ixgbe_log(ixgbe,
2146621Sbt150084 	    "PCI_CONF_LATENCY_TIMER:\t0x%x\n",
2156621Sbt150084 	    pci_config_get8(handle, PCI_CONF_LATENCY_TIMER));
2166621Sbt150084 	ixgbe_log(ixgbe,
2176621Sbt150084 	    "PCI_CONF_HEADER_TYPE:\t0x%x\n",
2186621Sbt150084 	    pci_config_get8(handle, PCI_CONF_HEADER));
2196621Sbt150084 	ixgbe_log(ixgbe,
2206621Sbt150084 	    "PCI_CONF_BIST:\t0x%x\n",
2216621Sbt150084 	    pci_config_get8(handle, PCI_CONF_BIST));
2226621Sbt150084 	ixgbe_log(ixgbe,
2236621Sbt150084 	    "PCI_CONF_BASE0:\t0x%x\n",
2246621Sbt150084 	    pci_config_get32(handle, PCI_CONF_BASE0));
2256621Sbt150084 	ixgbe_log(ixgbe,
2266621Sbt150084 	    "PCI_CONF_BASE1:\t0x%x\n",
2276621Sbt150084 	    pci_config_get32(handle, PCI_CONF_BASE1));
2286621Sbt150084 	ixgbe_log(ixgbe,
2296621Sbt150084 	    "PCI_CONF_BASE2:\t0x%x\n",
2306621Sbt150084 	    pci_config_get32(handle, PCI_CONF_BASE2));
2316621Sbt150084 
2326621Sbt150084 	/* MSI-X BAR */
2336621Sbt150084 	msix_bar = pci_config_get32(handle, PCI_CONF_BASE3);
2346621Sbt150084 	ixgbe_log(ixgbe,
2356621Sbt150084 	    "PCI_CONF_BASE3:\t0x%x\n", msix_bar);
2366621Sbt150084 
2376621Sbt150084 	ixgbe_log(ixgbe,
2386621Sbt150084 	    "PCI_CONF_BASE4:\t0x%x\n",
2396621Sbt150084 	    pci_config_get32(handle, PCI_CONF_BASE4));
2406621Sbt150084 	ixgbe_log(ixgbe,
2416621Sbt150084 	    "PCI_CONF_BASE5:\t0x%x\n",
2426621Sbt150084 	    pci_config_get32(handle, PCI_CONF_BASE5));
2436621Sbt150084 	ixgbe_log(ixgbe,
2446621Sbt150084 	    "PCI_CONF_CIS:\t0x%x\n",
2456621Sbt150084 	    pci_config_get32(handle, PCI_CONF_CIS));
2466621Sbt150084 	ixgbe_log(ixgbe,
2476621Sbt150084 	    "PCI_CONF_SUBVENID:\t0x%x\n",
2486621Sbt150084 	    pci_config_get16(handle, PCI_CONF_SUBVENID));
2496621Sbt150084 	ixgbe_log(ixgbe,
2506621Sbt150084 	    "PCI_CONF_SUBSYSID:\t0x%x\n",
2516621Sbt150084 	    pci_config_get16(handle, PCI_CONF_SUBSYSID));
2526621Sbt150084 	ixgbe_log(ixgbe,
2536621Sbt150084 	    "PCI_CONF_ROM:\t0x%x\n",
2546621Sbt150084 	    pci_config_get32(handle, PCI_CONF_ROM));
2556621Sbt150084 
2566621Sbt150084 	cap_ptr = pci_config_get8(handle, PCI_CONF_CAP_PTR);
2576621Sbt150084 
2586621Sbt150084 	ixgbe_log(ixgbe,
2596621Sbt150084 	    "PCI_CONF_CAP_PTR:\t0x%x\n", cap_ptr);
2606621Sbt150084 	ixgbe_log(ixgbe,
2616621Sbt150084 	    "PCI_CONF_ILINE:\t0x%x\n",
2626621Sbt150084 	    pci_config_get8(handle, PCI_CONF_ILINE));
2636621Sbt150084 	ixgbe_log(ixgbe,
2646621Sbt150084 	    "PCI_CONF_IPIN:\t0x%x\n",
2656621Sbt150084 	    pci_config_get8(handle, PCI_CONF_IPIN));
2666621Sbt150084 	ixgbe_log(ixgbe,
2676621Sbt150084 	    "PCI_CONF_MIN_G:\t0x%x\n",
2686621Sbt150084 	    pci_config_get8(handle, PCI_CONF_MIN_G));
2696621Sbt150084 	ixgbe_log(ixgbe,
2706621Sbt150084 	    "PCI_CONF_MAX_L:\t0x%x\n",
2716621Sbt150084 	    pci_config_get8(handle, PCI_CONF_MAX_L));
2726621Sbt150084 
2736621Sbt150084 	/* Power Management */
2746621Sbt150084 	offset = cap_ptr;
2756621Sbt150084 
2766621Sbt150084 	ixgbe_log(ixgbe,
2776621Sbt150084 	    "PCI_PM_CAP_ID:\t0x%x\n",
2786621Sbt150084 	    pci_config_get8(handle, offset));
2796621Sbt150084 
2806621Sbt150084 	next_ptr = pci_config_get8(handle, offset + 1);
2816621Sbt150084 
2826621Sbt150084 	ixgbe_log(ixgbe,
2836621Sbt150084 	    "PCI_PM_NEXT_PTR:\t0x%x\n", next_ptr);
2846621Sbt150084 	ixgbe_log(ixgbe,
2856621Sbt150084 	    "PCI_PM_CAP:\t0x%x\n",
2866621Sbt150084 	    pci_config_get16(handle, offset + PCI_PMCAP));
2876621Sbt150084 	ixgbe_log(ixgbe,
2886621Sbt150084 	    "PCI_PM_CSR:\t0x%x\n",
2896621Sbt150084 	    pci_config_get16(handle, offset + PCI_PMCSR));
2906621Sbt150084 	ixgbe_log(ixgbe,
2916621Sbt150084 	    "PCI_PM_CSR_BSE:\t0x%x\n",
2926621Sbt150084 	    pci_config_get8(handle, offset + PCI_PMCSR_BSE));
2936621Sbt150084 	ixgbe_log(ixgbe,
2946621Sbt150084 	    "PCI_PM_DATA:\t0x%x\n",
2956621Sbt150084 	    pci_config_get8(handle, offset + PCI_PMDATA));
2966621Sbt150084 
2976621Sbt150084 	/* MSI Configuration */
2986621Sbt150084 	offset = next_ptr;
2996621Sbt150084 
3006621Sbt150084 	ixgbe_log(ixgbe,
3016621Sbt150084 	    "PCI_MSI_CAP_ID:\t0x%x\n",
3026621Sbt150084 	    pci_config_get8(handle, offset));
3036621Sbt150084 
3046621Sbt150084 	next_ptr = pci_config_get8(handle, offset + 1);
3056621Sbt150084 
3066621Sbt150084 	ixgbe_log(ixgbe,
3076621Sbt150084 	    "PCI_MSI_NEXT_PTR:\t0x%x\n", next_ptr);
3086621Sbt150084 	ixgbe_log(ixgbe,
3096621Sbt150084 	    "PCI_MSI_CTRL:\t0x%x\n",
3106621Sbt150084 	    pci_config_get16(handle, offset + PCI_MSI_CTRL));
3116621Sbt150084 	ixgbe_log(ixgbe,
3126621Sbt150084 	    "PCI_MSI_ADDR:\t0x%x\n",
3136621Sbt150084 	    pci_config_get32(handle, offset + PCI_MSI_ADDR_OFFSET));
3146621Sbt150084 	ixgbe_log(ixgbe,
3156621Sbt150084 	    "PCI_MSI_ADDR_HI:\t0x%x\n",
3166621Sbt150084 	    pci_config_get32(handle, offset + 0x8));
3176621Sbt150084 	ixgbe_log(ixgbe,
3186621Sbt150084 	    "PCI_MSI_DATA:\t0x%x\n",
3196621Sbt150084 	    pci_config_get16(handle, offset + 0xC));
3206621Sbt150084 
3216621Sbt150084 	/* MSI-X Configuration */
3226621Sbt150084 	offset = next_ptr;
3236621Sbt150084 
3246621Sbt150084 	ixgbe_log(ixgbe,
3256621Sbt150084 	    "PCI_MSIX_CAP_ID:\t0x%x\n",
3266621Sbt150084 	    pci_config_get8(handle, offset));
3276621Sbt150084 
3286621Sbt150084 	next_ptr = pci_config_get8(handle, offset + 1);
3296621Sbt150084 	ixgbe_log(ixgbe,
3306621Sbt150084 	    "PCI_MSIX_NEXT_PTR:\t0x%x\n", next_ptr);
3316621Sbt150084 
3326621Sbt150084 	msix_ctrl = pci_config_get16(handle, offset + PCI_MSIX_CTRL);
3336621Sbt150084 	msix_tbl_sz = msix_ctrl & 0x7ff;
3346621Sbt150084 	ixgbe_log(ixgbe,
3356621Sbt150084 	    "PCI_MSIX_CTRL:\t0x%x\n", msix_ctrl);
3366621Sbt150084 
3376621Sbt150084 	tbl_offset = pci_config_get32(handle, offset + PCI_MSIX_TBL_OFFSET);
3386621Sbt150084 	tbl_bir = tbl_offset & PCI_MSIX_TBL_BIR_MASK;
3396621Sbt150084 	tbl_offset = tbl_offset & ~PCI_MSIX_TBL_BIR_MASK;
3406621Sbt150084 	ixgbe_log(ixgbe,
3416621Sbt150084 	    "PCI_MSIX_TBL_OFFSET:\t0x%x\n", tbl_offset);
3426621Sbt150084 	ixgbe_log(ixgbe,
3436621Sbt150084 	    "PCI_MSIX_TBL_BIR:\t0x%x\n", tbl_bir);
3446621Sbt150084 
3456621Sbt150084 	pba_offset = pci_config_get32(handle, offset + PCI_MSIX_PBA_OFFSET);
3466621Sbt150084 	pba_bir = pba_offset & PCI_MSIX_PBA_BIR_MASK;
3476621Sbt150084 	pba_offset = pba_offset & ~PCI_MSIX_PBA_BIR_MASK;
3486621Sbt150084 	ixgbe_log(ixgbe,
3496621Sbt150084 	    "PCI_MSIX_PBA_OFFSET:\t0x%x\n", pba_offset);
3506621Sbt150084 	ixgbe_log(ixgbe,
3516621Sbt150084 	    "PCI_MSIX_PBA_BIR:\t0x%x\n", pba_bir);
3526621Sbt150084 
3536621Sbt150084 	/* PCI Express Configuration */
3546621Sbt150084 	offset = next_ptr;
3556621Sbt150084 
3566621Sbt150084 	ixgbe_log(ixgbe,
3576621Sbt150084 	    "PCIE_CAP_ID:\t0x%x\n",
3586621Sbt150084 	    pci_config_get8(handle, offset + PCIE_CAP_ID));
3596621Sbt150084 
3606621Sbt150084 	next_ptr = pci_config_get8(handle, offset + PCIE_CAP_NEXT_PTR);
3616621Sbt150084 
3626621Sbt150084 	ixgbe_log(ixgbe,
3636621Sbt150084 	    "PCIE_CAP_NEXT_PTR:\t0x%x\n", next_ptr);
3646621Sbt150084 	ixgbe_log(ixgbe,
3656621Sbt150084 	    "PCIE_PCIECAP:\t0x%x\n",
3666621Sbt150084 	    pci_config_get16(handle, offset + PCIE_PCIECAP));
3676621Sbt150084 	ixgbe_log(ixgbe,
3686621Sbt150084 	    "PCIE_DEVCAP:\t0x%x\n",
3696621Sbt150084 	    pci_config_get32(handle, offset + PCIE_DEVCAP));
3706621Sbt150084 	ixgbe_log(ixgbe,
3716621Sbt150084 	    "PCIE_DEVCTL:\t0x%x\n",
3726621Sbt150084 	    pci_config_get16(handle, offset + PCIE_DEVCTL));
3736621Sbt150084 	ixgbe_log(ixgbe,
3746621Sbt150084 	    "PCIE_DEVSTS:\t0x%x\n",
3756621Sbt150084 	    pci_config_get16(handle, offset + PCIE_DEVSTS));
3766621Sbt150084 	ixgbe_log(ixgbe,
3776621Sbt150084 	    "PCIE_LINKCAP:\t0x%x\n",
3786621Sbt150084 	    pci_config_get32(handle, offset + PCIE_LINKCAP));
3796621Sbt150084 	ixgbe_log(ixgbe,
3806621Sbt150084 	    "PCIE_LINKCTL:\t0x%x\n",
3816621Sbt150084 	    pci_config_get16(handle, offset + PCIE_LINKCTL));
3826621Sbt150084 	ixgbe_log(ixgbe,
3836621Sbt150084 	    "PCIE_LINKSTS:\t0x%x\n",
3846621Sbt150084 	    pci_config_get16(handle, offset + PCIE_LINKSTS));
3856621Sbt150084 
3866621Sbt150084 	/* MSI-X Memory Space */
3876621Sbt150084 	if (ddi_dev_regsize(ixgbe->dip, 4, &mem_size) != DDI_SUCCESS) {
3886621Sbt150084 		ixgbe_log(ixgbe, "ddi_dev_regsize() failed");
3896621Sbt150084 		return;
3906621Sbt150084 	}
3916621Sbt150084 
3926621Sbt150084 	if ((ddi_regs_map_setup(ixgbe->dip, 4, (caddr_t *)&base, 0, mem_size,
3936621Sbt150084 	    &ixgbe_regs_acc_attr, &acc_hdl)) != DDI_SUCCESS) {
3946621Sbt150084 		ixgbe_log(ixgbe, "ddi_regs_map_setup() failed");
3956621Sbt150084 		return;
3966621Sbt150084 	}
3976621Sbt150084 
3986621Sbt150084 	ixgbe_log(ixgbe, "MSI-X Memory Space: (mem_size = %d, base = %x)",
3996621Sbt150084 	    mem_size, base);
4006621Sbt150084 
4016621Sbt150084 	for (i = 0; i <= msix_tbl_sz; i++) {
4026621Sbt150084 		ixgbe_log(ixgbe, "MSI-X Table Entry(%d):", i);
4036621Sbt150084 		ixgbe_log(ixgbe, "lo_addr:\t%x",
4046621Sbt150084 		    ddi_get32(acc_hdl,
4056621Sbt150084 		    (uint32_t *)(base + tbl_offset + (i * 16))));
4066621Sbt150084 		ixgbe_log(ixgbe, "up_addr:\t%x",
4076621Sbt150084 		    ddi_get32(acc_hdl,
4086621Sbt150084 		    (uint32_t *)(base + tbl_offset + (i * 16) + 4)));
4096621Sbt150084 		ixgbe_log(ixgbe, "msg_data:\t%x",
4106621Sbt150084 		    ddi_get32(acc_hdl,
4116621Sbt150084 		    (uint32_t *)(base + tbl_offset + (i * 16) + 8)));
4126621Sbt150084 		ixgbe_log(ixgbe, "vct_ctrl:\t%x",
4136621Sbt150084 		    ddi_get32(acc_hdl,
4146621Sbt150084 		    (uint32_t *)(base + tbl_offset + (i * 16) + 12)));
4156621Sbt150084 	}
4166621Sbt150084 
4176621Sbt150084 	ixgbe_log(ixgbe, "MSI-X Pending Bits:\t%x",
4186621Sbt150084 	    ddi_get32(acc_hdl, (uint32_t *)(base + pba_offset)));
4196621Sbt150084 
4206621Sbt150084 	ddi_regs_map_free(&acc_hdl);
4216621Sbt150084 }
4229353SSamuel.Tu@Sun.COM 
4239353SSamuel.Tu@Sun.COM /*
4249353SSamuel.Tu@Sun.COM  * Dump registers
4259353SSamuel.Tu@Sun.COM  */
4269353SSamuel.Tu@Sun.COM void
ixgbe_dump_regs(void * adapter)4279353SSamuel.Tu@Sun.COM ixgbe_dump_regs(void *adapter)
4289353SSamuel.Tu@Sun.COM {
4299353SSamuel.Tu@Sun.COM 	ixgbe_t *ixgbe = (ixgbe_t *)adapter;
430*11878SVenu.Iyer@Sun.COM 	uint32_t reg_val, hw_index;
4319353SSamuel.Tu@Sun.COM 	struct ixgbe_hw *hw = &ixgbe->hw;
4329353SSamuel.Tu@Sun.COM 	int i;
4339353SSamuel.Tu@Sun.COM 	DEBUGFUNC("ixgbe_dump_regs");
4349353SSamuel.Tu@Sun.COM 
4359353SSamuel.Tu@Sun.COM 	/* Dump basic's like CTRL, STATUS, CTRL_EXT. */
4369353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "Basic IXGBE registers..");
4379353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_CTRL);
4389353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tCTRL=%x\n", reg_val);
4399353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_STATUS);
4409353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tSTATUS=%x\n", reg_val);
4419353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
4429353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tCTRL_EXT=%x\n", reg_val);
4439353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_FCTRL);
4449353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tFCTRL=%x\n", reg_val);
4459353SSamuel.Tu@Sun.COM 
4469353SSamuel.Tu@Sun.COM 	/* Misc Interrupt regs */
4479353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "Some IXGBE interrupt registers..");
4489353SSamuel.Tu@Sun.COM 
4499353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_GPIE);
4509353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tGPIE=%x\n", reg_val);
4519353SSamuel.Tu@Sun.COM 
4529353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_IVAR(0));
4539353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tIVAR(0)=%x\n", reg_val);
4549353SSamuel.Tu@Sun.COM 
4559353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4569353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tIVAR_MISC=%x\n", reg_val);
4579353SSamuel.Tu@Sun.COM 
4589353SSamuel.Tu@Sun.COM 	/* Dump RX related reg's */
4599353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "Receive registers...");
4609353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
4619353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tRXCTRL=%x\n", reg_val);
4629353SSamuel.Tu@Sun.COM 	for (i = 0; i < ixgbe->num_rx_rings; i++) {
463*11878SVenu.Iyer@Sun.COM 		hw_index = ixgbe->rx_rings[i].hw_index;
464*11878SVenu.Iyer@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(hw_index));
465*11878SVenu.Iyer@Sun.COM 		ixgbe_log(ixgbe, "\tRXDCTL(%d)=%x\n", hw_index, reg_val);
466*11878SVenu.Iyer@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_SRRCTL(hw_index));
467*11878SVenu.Iyer@Sun.COM 		ixgbe_log(ixgbe, "\tSRRCTL(%d)=%x\n", hw_index, reg_val);
4689353SSamuel.Tu@Sun.COM 	}
4699353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
4709353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tRXCSUM=%x\n", reg_val);
4719353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_MRQC);
4729353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tMRQC=%x\n", reg_val);
4739353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
4749353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tRDRXCTL=%x\n", reg_val);
4759353SSamuel.Tu@Sun.COM 
4769353SSamuel.Tu@Sun.COM 	/* Dump TX related regs */
4779353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "Some transmit registers..");
4789353SSamuel.Tu@Sun.COM 	reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
4799353SSamuel.Tu@Sun.COM 	ixgbe_log(ixgbe, "\tDMATXCTL=%x\n", reg_val);
4809353SSamuel.Tu@Sun.COM 	for (i = 0; i < ixgbe->num_tx_rings; i++) {
4819353SSamuel.Tu@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
4829353SSamuel.Tu@Sun.COM 		ixgbe_log(ixgbe, "\tTXDCTL(%d)=%x\n", i, reg_val);
4839353SSamuel.Tu@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_TDWBAL(i));
4849353SSamuel.Tu@Sun.COM 		ixgbe_log(ixgbe, "\tTDWBAL(%d)=%x\n", i, reg_val);
4859353SSamuel.Tu@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_TDWBAH(i));
4869353SSamuel.Tu@Sun.COM 		ixgbe_log(ixgbe, "\tTDWBAH(%d)=%x\n", i, reg_val);
4879353SSamuel.Tu@Sun.COM 		reg_val = IXGBE_READ_REG(hw, IXGBE_TXPBSIZE(i));
4889353SSamuel.Tu@Sun.COM 		ixgbe_log(ixgbe, "\tTXPBSIZE(%d)=%x\n", i, reg_val);
4899353SSamuel.Tu@Sun.COM 	}
4909353SSamuel.Tu@Sun.COM }
4919353SSamuel.Tu@Sun.COM 
4926621Sbt150084 #endif
493