#ifndef AGNX_DEBUG_H_
#define AGNX_DEBUG_H_

#include "agnx.h"
#include "phy.h"
#include "sta.h"
#include "xmit.h"

#define AGNX_TRACE              printk(KERN_ERR PFX "function:%s line:%d\n", __func__, __LINE__)

#define PRINTK_LE16(prefix, var)	printk(KERN_DEBUG PFX #prefix ": " #var " 0x%.4x\n", le16_to_cpu(var))
#define PRINTK_LE32(prefix, var)	printk(KERN_DEBUG PFX #prefix ": " #var " 0x%.8x\n", le32_to_cpu(var))
#define PRINTK_U8(prefix, var) 		printk(KERN_DEBUG PFX #prefix ": " #var " 0x%.2x\n", var)
#define PRINTK_BE16(prefix, var)	printk(KERN_DEBUG PFX #prefix ": " #var " 0x%.4x\n", be16_to_cpu(var))
#define PRINTK_BE32(prefix, var)	printk(KERN_DEBUG PFX #prefix ": " #var " 0x%.8x\n", be32_to_cpu(var))
#define PRINTK_BITS(prefix, field)    	printk(KERN_DEBUG PFX #prefix ": " #field ": 0x%x\n", (reg & field) >> field##_SHIFT)

static inline void agnx_bug(char *reason)
{
	printk(KERN_ERR PFX "%s\n", reason);
	BUG();
}

static inline void agnx_print_desc(struct agnx_desc *desc)
{
	u32 reg = be32_to_cpu(desc->frag);

	PRINTK_BITS(DESC, PACKET_LEN);

	if (reg & FIRST_FRAG) {
		PRINTK_BITS(DESC, FIRST_PACKET_MASK);
		PRINTK_BITS(DESC, FIRST_RESERV2);
		PRINTK_BITS(DESC, FIRST_TKIP_ERROR);
		PRINTK_BITS(DESC, FIRST_TKIP_PACKET);
		PRINTK_BITS(DESC, FIRST_RESERV1);
		PRINTK_BITS(DESC, FIRST_FRAG_LEN);
	} else {
		PRINTK_BITS(DESC, SUB_RESERV2);
		PRINTK_BITS(DESC, SUB_TKIP_ERROR);
		PRINTK_BITS(DESC, SUB_TKIP_PACKET);
		PRINTK_BITS(DESC, SUB_RESERV1);
		PRINTK_BITS(DESC, SUB_FRAG_LEN);
	}

	PRINTK_BITS(DESC, FIRST_FRAG);
	PRINTK_BITS(DESC, LAST_FRAG);
	PRINTK_BITS(DESC, OWNER);
}


static inline void dump_ieee80211b_phy_hdr(__be32 _11b0, __be32 _11b1)
{

}

static inline void agnx_print_hdr(struct agnx_hdr *hdr)
{
	u32 reg;
	int i;

	reg = be32_to_cpu(hdr->reg0);
	PRINTK_BITS(HDR, RTS);
	PRINTK_BITS(HDR, MULTICAST);
	PRINTK_BITS(HDR, ACK);
	PRINTK_BITS(HDR, TM);
	PRINTK_BITS(HDR, RELAY);
	PRINTK_BITS(HDR, REVISED_FCS);
	PRINTK_BITS(HDR, NEXT_BUFFER_ADDR);

	reg = be32_to_cpu(hdr->reg1);
	PRINTK_BITS(HDR, MAC_HDR_LEN);
	PRINTK_BITS(HDR, DURATION_OVERIDE);
	PRINTK_BITS(HDR, PHY_HDR_OVERIDE);
	PRINTK_BITS(HDR, CRC_FAIL);
	PRINTK_BITS(HDR, SEQUENCE_NUMBER);
	PRINTK_BITS(HDR, BUFF_HEAD_ADDR);

	reg = be32_to_cpu(hdr->reg2);
	PRINTK_BITS(HDR, PDU_COUNT);
	PRINTK_BITS(HDR, WEP_KEY);
	PRINTK_BITS(HDR, USES_WEP_KEY);
	PRINTK_BITS(HDR, KEEP_ALIVE);
	PRINTK_BITS(HDR, BUFF_TAIL_ADDR);

	reg = be32_to_cpu(hdr->reg3);
	PRINTK_BITS(HDR, CTS_11G);
	PRINTK_BITS(HDR, RTS_11G);
	PRINTK_BITS(HDR, FRAG_SIZE);
	PRINTK_BITS(HDR, PAYLOAD_LEN);
	PRINTK_BITS(HDR, FRAG_NUM);

	reg = be32_to_cpu(hdr->reg4);
	PRINTK_BITS(HDR, RELAY_STAID);
	PRINTK_BITS(HDR, STATION_ID);
	PRINTK_BITS(HDR, WORKQUEUE_ID);

	reg = be32_to_cpu(hdr->reg5);
	/* printf the route flag */
	PRINTK_BITS(HDR, ROUTE_HOST);
	PRINTK_BITS(HDR, ROUTE_CARD_CPU);
	PRINTK_BITS(HDR, ROUTE_ENCRYPTION);
	PRINTK_BITS(HDR, ROUTE_TX);
	PRINTK_BITS(HDR, ROUTE_RX1);
	PRINTK_BITS(HDR, ROUTE_RX2);
	PRINTK_BITS(HDR, ROUTE_COMPRESSION);

	PRINTK_BE32(HDR, hdr->_11g0);
	PRINTK_BE32(HDR, hdr->_11g1);
	PRINTK_BE32(HDR, hdr->_11b0);
	PRINTK_BE32(HDR, hdr->_11b1);

	dump_ieee80211b_phy_hdr(hdr->_11b0, hdr->_11b1);

	/* Fixme */
	for (i = 0; i < ARRAY_SIZE(hdr->mac_hdr); i++) {
		if (i == 0)
			printk(KERN_DEBUG PFX "IEEE80211 HDR: ");
		printk("%.2x ", hdr->mac_hdr[i]);
		if (i + 1 == ARRAY_SIZE(hdr->mac_hdr))
			printk("\n");
	}

	PRINTK_BE16(HDR, hdr->rts_duration);
	PRINTK_BE16(HDR, hdr->last_duration);
	PRINTK_BE16(HDR, hdr->sec_last_duration);
	PRINTK_BE16(HDR, hdr->other_duration);
	PRINTK_BE16(HDR, hdr->tx_other_duration);
	PRINTK_BE16(HDR, hdr->last_11g_len);
	PRINTK_BE16(HDR, hdr->other_11g_len);
	PRINTK_BE16(HDR, hdr->last_11b_len);
	PRINTK_BE16(HDR, hdr->other_11b_len);

	/* FIXME */
	reg = be16_to_cpu(hdr->reg6);
	PRINTK_BITS(HDR, MBF);
	PRINTK_BITS(HDR, RSVD4);

	PRINTK_BE16(HDR, hdr->rx_frag_stat);

	PRINTK_BE32(HDR, hdr->time_stamp);
	PRINTK_BE32(HDR, hdr->phy_stats_hi);
	PRINTK_BE32(HDR, hdr->phy_stats_lo);
	PRINTK_BE32(HDR, hdr->mic_key0);
	PRINTK_BE32(HDR, hdr->mic_key1);
} /* agnx_print_hdr */


static inline void agnx_print_rx_hdr(struct agnx_hdr *hdr)
{
	agnx_print_hdr(hdr);

	PRINTK_BE16(HDR, hdr->rx.rx_packet_duration);
	PRINTK_BE16(HDR, hdr->rx.replay_cnt);

	PRINTK_U8(HDR, hdr->rx_channel);
}

static inline void agnx_print_tx_hdr(struct agnx_hdr *hdr)
{
	agnx_print_hdr(hdr);

	PRINTK_U8(HDR, hdr->tx.long_retry_limit);
	PRINTK_U8(HDR, hdr->tx.short_retry_limit);
	PRINTK_U8(HDR, hdr->tx.long_retry_cnt);
	PRINTK_U8(HDR, hdr->tx.short_retry_cnt);

	PRINTK_U8(HDR, hdr->rx_channel);
}

static inline void
agnx_print_sta_power(struct agnx_priv *priv, unsigned int sta_idx)
{
	struct agnx_sta_power power;
	u32 reg;

	get_sta_power(priv, &power, sta_idx);

	reg = le32_to_cpu(power.reg);
	PRINTK_BITS(STA_POWER, SIGNAL);
	PRINTK_BITS(STA_POWER, RATE);
	PRINTK_BITS(STA_POWER, TIFS);
	PRINTK_BITS(STA_POWER, EDCF);
	PRINTK_BITS(STA_POWER, CHANNEL_BOND);
	PRINTK_BITS(STA_POWER, PHY_MODE);
	PRINTK_BITS(STA_POWER, POWER_LEVEL);
	PRINTK_BITS(STA_POWER, NUM_TRANSMITTERS);
}

static inline void
agnx_print_sta_tx_wq(struct agnx_priv *priv, unsigned int sta_idx, unsigned int wq_idx)
{
	struct agnx_sta_tx_wq tx_wq;
	u32 reg;

	get_sta_tx_wq(priv, &tx_wq, sta_idx, wq_idx);

	reg = le32_to_cpu(tx_wq.reg0);
	PRINTK_BITS(STA_TX_WQ, TAIL_POINTER);
	PRINTK_BITS(STA_TX_WQ, HEAD_POINTER_LOW);

	reg = le32_to_cpu(tx_wq.reg3);
	PRINTK_BITS(STA_TX_WQ, HEAD_POINTER_HIGH);
	PRINTK_BITS(STA_TX_WQ, ACK_POINTER_LOW);

	reg = le32_to_cpu(tx_wq.reg1);
	PRINTK_BITS(STA_TX_WQ, ACK_POINTER_HIGH);
	PRINTK_BITS(STA_TX_WQ, HEAD_TIMOUT_TAIL_PACK_CNT);
	PRINTK_BITS(STA_TX_WQ, ACK_TIMOUT_TAIL_PACK_CNT);

	reg = le32_to_cpu(tx_wq.reg2);
	PRINTK_BITS(STA_TX_WQ, HEAD_TIMOUT_WIN_LIM_BYTE_CNT);
	PRINTK_BITS(STA_TX_WQ, HEAD_TIMOUT_WIN_LIM_FRAG_CNT);
	PRINTK_BITS(STA_TX_WQ, WORK_QUEUE_ACK_TYPE);
	PRINTK_BITS(STA_TX_WQ, WORK_QUEUE_VALID);
}

static inline void agnx_print_sta_traffic(struct agnx_sta_traffic *traffic)
{
	u32 reg;

	reg = le32_to_cpu(traffic->reg0);
	PRINTK_BITS(STA_TRAFFIC, ACK_TIMOUT_CNT);
	PRINTK_BITS(STA_TRAFFIC, TRAFFIC_ACK_TYPE);
	PRINTK_BITS(STA_TRAFFIC, NEW_PACKET);
	PRINTK_BITS(STA_TRAFFIC, TRAFFIC_VALID);
	PRINTK_BITS(STA_TRAFFIC, RX_HDR_DESC_POINTER);

	reg = le32_to_cpu(traffic->reg1);
	PRINTK_BITS(STA_TRAFFIC, RX_PACKET_TIMESTAMP);
	PRINTK_BITS(STA_TRAFFIC, TRAFFIC_RESERVED);
	PRINTK_BITS(STA_TRAFFIC, SV);
	PRINTK_BITS(STA_TRAFFIC, RX_SEQUENCE_NUM);

	PRINTK_LE32(STA_TRAFFIC, traffic->tx_replay_cnt_low);

	PRINTK_LE16(STA_TRAFFIC, traffic->tx_replay_cnt_high);
	PRINTK_LE16(STA_TRAFFIC, traffic->rx_replay_cnt_high);

	PRINTK_LE32(STA_TRAFFIC, traffic->rx_replay_cnt_low);
}

static inline void agnx_print_sta(struct agnx_priv *priv, unsigned int sta_idx)
{
	struct agnx_sta station;
	struct agnx_sta *sta = &station;
	u32 reg;
	unsigned int i;

	get_sta(priv, sta, sta_idx);

	for (i = 0; i < 4; i++)
		PRINTK_LE32(STA, sta->tx_session_keys[i]);
	for (i = 0; i < 4; i++)
		PRINTK_LE32(STA, sta->rx_session_keys[i]);

	reg = le32_to_cpu(sta->reg);
	PRINTK_BITS(STA, ID_1);
	PRINTK_BITS(STA, ID_0);
	PRINTK_BITS(STA, ENABLE_CONCATENATION);
	PRINTK_BITS(STA, ENABLE_DECOMPRESSION);
	PRINTK_BITS(STA, STA_RESERVED);
	PRINTK_BITS(STA, EAP);
	PRINTK_BITS(STA, ED_NULL);
	PRINTK_BITS(STA, ENCRYPTION_POLICY);
	PRINTK_BITS(STA, DEFINED_KEY_ID);
	PRINTK_BITS(STA, FIXED_KEY);
	PRINTK_BITS(STA, KEY_VALID);
	PRINTK_BITS(STA, STATION_VALID);

	PRINTK_LE32(STA, sta->tx_aes_blks_unicast);
	PRINTK_LE32(STA, sta->rx_aes_blks_unicast);

	PRINTK_LE16(STA, sta->aes_format_err_unicast_cnt);
	PRINTK_LE16(STA, sta->aes_replay_unicast);

	PRINTK_LE16(STA, sta->aes_decrypt_err_unicast);
	PRINTK_LE16(STA, sta->aes_decrypt_err_default);

	PRINTK_LE16(STA, sta->single_retry_packets);
	PRINTK_LE16(STA, sta->failed_tx_packets);

	PRINTK_LE16(STA, sta->muti_retry_packets);
	PRINTK_LE16(STA, sta->ack_timeouts);

	PRINTK_LE16(STA, sta->frag_tx_cnt);
	PRINTK_LE16(STA, sta->rts_brq_sent);

	PRINTK_LE16(STA, sta->tx_packets);
	PRINTK_LE16(STA, sta->cts_back_timeout);

	PRINTK_LE32(STA, sta->phy_stats_high);
	PRINTK_LE32(STA, sta->phy_stats_low);

	/* for (i = 0; i < 8; i++) */
	agnx_print_sta_traffic(sta->traffic + 0);

	PRINTK_LE16(STA, sta->traffic_class0_frag_success);
	PRINTK_LE16(STA, sta->traffic_class1_frag_success);
	PRINTK_LE16(STA, sta->traffic_class2_frag_success);
	PRINTK_LE16(STA, sta->traffic_class3_frag_success);
	PRINTK_LE16(STA, sta->traffic_class4_frag_success);
	PRINTK_LE16(STA, sta->traffic_class5_frag_success);
	PRINTK_LE16(STA, sta->traffic_class6_frag_success);
	PRINTK_LE16(STA, sta->traffic_class7_frag_success);

	PRINTK_LE16(STA, sta->num_frag_non_prime_rates);
	PRINTK_LE16(STA, sta->ack_timeout_non_prime_rates);
}


static inline void dump_ieee80211_hdr(struct ieee80211_hdr *hdr, char *tag)
{
	u16 fctl;
	int hdrlen;
	DECLARE_MAC_BUF(mac);

	fctl = le16_to_cpu(hdr->frame_control);
	switch (fctl & IEEE80211_FCTL_FTYPE) {
	case IEEE80211_FTYPE_DATA:
		printk(PFX "%s DATA ", tag);
		break;
	case IEEE80211_FTYPE_CTL:
		printk(PFX "%s CTL ", tag);
		break;
	case IEEE80211_FTYPE_MGMT:
		printk(PFX "%s MGMT ", tag);
		switch (fctl & IEEE80211_FCTL_STYPE) {
		case IEEE80211_STYPE_ASSOC_REQ:
			printk("SubType: ASSOC_REQ ");
			break;
		case IEEE80211_STYPE_ASSOC_RESP:
			printk("SubType: ASSOC_RESP ");
			break;
		case IEEE80211_STYPE_REASSOC_REQ:
			printk("SubType: REASSOC_REQ ");
			break;
		case IEEE80211_STYPE_REASSOC_RESP:
			printk("SubType: REASSOC_RESP ");
			break;
		case IEEE80211_STYPE_PROBE_REQ:
			printk("SubType: PROBE_REQ ");
			break;
		case IEEE80211_STYPE_PROBE_RESP:
			printk("SubType: PROBE_RESP ");
			break;
		case IEEE80211_STYPE_BEACON:
			printk("SubType: BEACON ");
			break;
		case IEEE80211_STYPE_ATIM:
			printk("SubType: ATIM ");
			break;
		case IEEE80211_STYPE_DISASSOC:
			printk("SubType: DISASSOC ");
			break;
		case IEEE80211_STYPE_AUTH:
			printk("SubType: AUTH ");
			break;
		case IEEE80211_STYPE_DEAUTH:
			printk("SubType: DEAUTH ");
			break;
		case IEEE80211_STYPE_ACTION:
			printk("SubType: ACTION ");
			break;
		default:
			printk("SubType: Unknow\n");
		}
		break;
	default:
		printk(PFX "%s Packet type: Unknow\n", tag);
	}

	hdrlen = ieee80211_hdrlen(fctl);

	if (hdrlen >= 4)
		printk("FC=0x%04x DUR=0x%04x",
		       fctl, le16_to_cpu(hdr->duration_id));
	if (hdrlen >= 10)
		printk(" A1=%s", print_mac(mac, hdr->addr1));
	if (hdrlen >= 16)
		printk(" A2=%s", print_mac(mac, hdr->addr2));
	if (hdrlen >= 24)
		printk(" A3=%s", print_mac(mac, hdr->addr3));
	if (hdrlen >= 30)
		printk(" A4=%s", print_mac(mac, hdr->addr4));
	printk("\n");
}

static inline void dump_txm_registers(struct agnx_priv *priv)
{
	void __iomem *ctl = priv->ctl;
	int i;
	for (i = 0; i <= 0x1e8; i += 4)
		printk(KERN_DEBUG PFX "TXM: %x---> 0x%.8x\n", i, ioread32(ctl + i));
}
static inline void dump_rxm_registers(struct agnx_priv *priv)
{
	void __iomem *ctl = priv->ctl;
	int i;
	for (i = 0; i <= 0x108; i += 4)
		printk(KERN_DEBUG PFX "RXM: %x---> 0x%.8x\n", i, ioread32(ctl + 0x2000 + i));
}
static inline void dump_bm_registers(struct agnx_priv *priv)
{
	void __iomem *ctl = priv->ctl;
	int i;
	for (i = 0; i <= 0x90; i += 4)
		printk(KERN_DEBUG PFX "BM: %x---> 0x%.8x\n", i, ioread32(ctl + 0x2c00 + i));
}
static inline void dump_cir_registers(struct agnx_priv *priv)
{
	void __iomem *ctl = priv->ctl;
	int i;
	for (i = 0; i <= 0xb8; i += 4)
		printk(KERN_DEBUG PFX "CIR: %x---> 0x%.8x\n", i, ioread32(ctl + 0x3000 + i));
}

#endif /* AGNX_DEBUG_H_ */
