1*00c4da27SChristian Lamparter /* 2*00c4da27SChristian Lamparter * Atheros CARL9170 driver 3*00c4da27SChristian Lamparter * 4*00c4da27SChristian Lamparter * debug header 5*00c4da27SChristian Lamparter * 6*00c4da27SChristian Lamparter * Copyright 2010, Christian Lamparter <chunkeey@googlemail.com> 7*00c4da27SChristian Lamparter * 8*00c4da27SChristian Lamparter * This program is free software; you can redistribute it and/or modify 9*00c4da27SChristian Lamparter * it under the terms of the GNU General Public License as published by 10*00c4da27SChristian Lamparter * the Free Software Foundation; either version 2 of the License, or 11*00c4da27SChristian Lamparter * (at your option) any later version. 12*00c4da27SChristian Lamparter * 13*00c4da27SChristian Lamparter * This program is distributed in the hope that it will be useful, 14*00c4da27SChristian Lamparter * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*00c4da27SChristian Lamparter * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*00c4da27SChristian Lamparter * GNU General Public License for more details. 17*00c4da27SChristian Lamparter * 18*00c4da27SChristian Lamparter * You should have received a copy of the GNU General Public License 19*00c4da27SChristian Lamparter * along with this program; see the file COPYING. If not, see 20*00c4da27SChristian Lamparter * http://www.gnu.org/licenses/. 21*00c4da27SChristian Lamparter * 22*00c4da27SChristian Lamparter * This file incorporates work covered by the following copyright and 23*00c4da27SChristian Lamparter * permission notice: 24*00c4da27SChristian Lamparter * Copyright (c) 2007-2008 Atheros Communications, Inc. 25*00c4da27SChristian Lamparter * 26*00c4da27SChristian Lamparter * Permission to use, copy, modify, and/or distribute this software for any 27*00c4da27SChristian Lamparter * purpose with or without fee is hereby granted, provided that the above 28*00c4da27SChristian Lamparter * copyright notice and this permission notice appear in all copies. 29*00c4da27SChristian Lamparter * 30*00c4da27SChristian Lamparter * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 31*00c4da27SChristian Lamparter * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 32*00c4da27SChristian Lamparter * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 33*00c4da27SChristian Lamparter * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 34*00c4da27SChristian Lamparter * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 35*00c4da27SChristian Lamparter * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 36*00c4da27SChristian Lamparter * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 37*00c4da27SChristian Lamparter */ 38*00c4da27SChristian Lamparter #ifndef __DEBUG_H 39*00c4da27SChristian Lamparter #define __DEBUG_H 40*00c4da27SChristian Lamparter 41*00c4da27SChristian Lamparter #include "eeprom.h" 42*00c4da27SChristian Lamparter #include "wlan.h" 43*00c4da27SChristian Lamparter #include "hw.h" 44*00c4da27SChristian Lamparter #include "fwdesc.h" 45*00c4da27SChristian Lamparter #include "fwcmd.h" 46*00c4da27SChristian Lamparter #include "../regd.h" 47*00c4da27SChristian Lamparter 48*00c4da27SChristian Lamparter struct hw_stat_reg_entry { 49*00c4da27SChristian Lamparter u32 reg; 50*00c4da27SChristian Lamparter char nreg[32]; 51*00c4da27SChristian Lamparter }; 52*00c4da27SChristian Lamparter 53*00c4da27SChristian Lamparter #define STAT_MAC_REG(reg) \ 54*00c4da27SChristian Lamparter { (AR9170_MAC_REG_##reg), #reg } 55*00c4da27SChristian Lamparter 56*00c4da27SChristian Lamparter #define STAT_PTA_REG(reg) \ 57*00c4da27SChristian Lamparter { (AR9170_PTA_REG_##reg), #reg } 58*00c4da27SChristian Lamparter 59*00c4da27SChristian Lamparter #define STAT_USB_REG(reg) \ 60*00c4da27SChristian Lamparter { (AR9170_USB_REG_##reg), #reg } 61*00c4da27SChristian Lamparter 62*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_rx_tally_regs[] = { 63*00c4da27SChristian Lamparter STAT_MAC_REG(RX_CRC32), STAT_MAC_REG(RX_CRC16), 64*00c4da27SChristian Lamparter STAT_MAC_REG(RX_TIMEOUT_COUNT), STAT_MAC_REG(RX_ERR_DECRYPTION_UNI), 65*00c4da27SChristian Lamparter STAT_MAC_REG(RX_ERR_DECRYPTION_MUL), STAT_MAC_REG(RX_MPDU), 66*00c4da27SChristian Lamparter STAT_MAC_REG(RX_DROPPED_MPDU), STAT_MAC_REG(RX_DEL_MPDU), 67*00c4da27SChristian Lamparter }; 68*00c4da27SChristian Lamparter 69*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_phy_errors_regs[] = { 70*00c4da27SChristian Lamparter STAT_MAC_REG(RX_PHY_MISC_ERROR), STAT_MAC_REG(RX_PHY_XR_ERROR), 71*00c4da27SChristian Lamparter STAT_MAC_REG(RX_PHY_OFDM_ERROR), STAT_MAC_REG(RX_PHY_CCK_ERROR), 72*00c4da27SChristian Lamparter STAT_MAC_REG(RX_PHY_HT_ERROR), STAT_MAC_REG(RX_PHY_TOTAL), 73*00c4da27SChristian Lamparter }; 74*00c4da27SChristian Lamparter 75*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_tx_tally_regs[] = { 76*00c4da27SChristian Lamparter STAT_MAC_REG(TX_TOTAL), STAT_MAC_REG(TX_UNDERRUN), 77*00c4da27SChristian Lamparter STAT_MAC_REG(TX_RETRY), 78*00c4da27SChristian Lamparter }; 79*00c4da27SChristian Lamparter 80*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_wlan_queue_regs[] = { 81*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_STATUS), STAT_MAC_REG(DMA_TRIGGER), 82*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_TXQ0_ADDR), STAT_MAC_REG(DMA_TXQ0_CURR_ADDR), 83*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_TXQ1_ADDR), STAT_MAC_REG(DMA_TXQ1_CURR_ADDR), 84*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_TXQ2_ADDR), STAT_MAC_REG(DMA_TXQ2_CURR_ADDR), 85*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_TXQ3_ADDR), STAT_MAC_REG(DMA_TXQ3_CURR_ADDR), 86*00c4da27SChristian Lamparter STAT_MAC_REG(DMA_RXQ_ADDR), STAT_MAC_REG(DMA_RXQ_CURR_ADDR), 87*00c4da27SChristian Lamparter }; 88*00c4da27SChristian Lamparter 89*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_ampdu_info_regs[] = { 90*00c4da27SChristian Lamparter STAT_MAC_REG(AMPDU_DENSITY), STAT_MAC_REG(AMPDU_FACTOR), 91*00c4da27SChristian Lamparter }; 92*00c4da27SChristian Lamparter 93*00c4da27SChristian Lamparter static const struct hw_stat_reg_entry hw_pta_queue_regs[] = { 94*00c4da27SChristian Lamparter STAT_PTA_REG(DN_CURR_ADDRH), STAT_PTA_REG(DN_CURR_ADDRL), 95*00c4da27SChristian Lamparter STAT_PTA_REG(UP_CURR_ADDRH), STAT_PTA_REG(UP_CURR_ADDRL), 96*00c4da27SChristian Lamparter STAT_PTA_REG(DMA_STATUS), STAT_PTA_REG(DMA_MODE_CTRL), 97*00c4da27SChristian Lamparter }; 98*00c4da27SChristian Lamparter 99*00c4da27SChristian Lamparter #define DEFINE_TALLY(name) \ 100*00c4da27SChristian Lamparter u32 name##_sum[ARRAY_SIZE(name##_regs)], \ 101*00c4da27SChristian Lamparter name##_counter[ARRAY_SIZE(name##_regs)] \ 102*00c4da27SChristian Lamparter 103*00c4da27SChristian Lamparter #define DEFINE_STAT(name) \ 104*00c4da27SChristian Lamparter u32 name##_counter[ARRAY_SIZE(name##_regs)] \ 105*00c4da27SChristian Lamparter 106*00c4da27SChristian Lamparter struct ath_stats { 107*00c4da27SChristian Lamparter DEFINE_TALLY(hw_tx_tally); 108*00c4da27SChristian Lamparter DEFINE_TALLY(hw_rx_tally); 109*00c4da27SChristian Lamparter DEFINE_TALLY(hw_phy_errors); 110*00c4da27SChristian Lamparter DEFINE_STAT(hw_wlan_queue); 111*00c4da27SChristian Lamparter DEFINE_STAT(hw_pta_queue); 112*00c4da27SChristian Lamparter DEFINE_STAT(hw_ampdu_info); 113*00c4da27SChristian Lamparter }; 114*00c4da27SChristian Lamparter 115*00c4da27SChristian Lamparter struct carl9170_debug_mem_rbe { 116*00c4da27SChristian Lamparter u32 reg; 117*00c4da27SChristian Lamparter u32 value; 118*00c4da27SChristian Lamparter }; 119*00c4da27SChristian Lamparter 120*00c4da27SChristian Lamparter #define CARL9170_DEBUG_RING_SIZE 64 121*00c4da27SChristian Lamparter 122*00c4da27SChristian Lamparter struct carl9170_debug { 123*00c4da27SChristian Lamparter struct ath_stats stats; 124*00c4da27SChristian Lamparter struct carl9170_debug_mem_rbe ring[CARL9170_DEBUG_RING_SIZE]; 125*00c4da27SChristian Lamparter struct mutex ring_lock; 126*00c4da27SChristian Lamparter unsigned int ring_head, ring_tail; 127*00c4da27SChristian Lamparter struct delayed_work update_tally; 128*00c4da27SChristian Lamparter }; 129*00c4da27SChristian Lamparter 130*00c4da27SChristian Lamparter struct ar9170; 131*00c4da27SChristian Lamparter 132*00c4da27SChristian Lamparter void carl9170_debugfs_register(struct ar9170 *ar); 133*00c4da27SChristian Lamparter void carl9170_debugfs_unregister(struct ar9170 *ar); 134*00c4da27SChristian Lamparter #endif /* __DEBUG_H */ 135