summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/digiPiper/digiDebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/digiPiper/digiDebug.c')
-rw-r--r--drivers/net/wireless/digiPiper/digiDebug.c205
1 files changed, 205 insertions, 0 deletions
diff --git a/drivers/net/wireless/digiPiper/digiDebug.c b/drivers/net/wireless/digiPiper/digiDebug.c
new file mode 100644
index 000000000000..627dd8c698ec
--- /dev/null
+++ b/drivers/net/wireless/digiPiper/digiDebug.c
@@ -0,0 +1,205 @@
+/*
+ * digiDebug.c
+ *
+ * Copyright (C) 2009 by Digi International Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+/*
+ * This file contains some debugging routines.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kthread.h>
+
+#include "pipermain.h"
+#include "mac.h"
+
+#define DUMP_WORDS_MAX (700)
+static unsigned int dumpWordsWord[DUMP_WORDS_MAX];
+static unsigned int dumpWordsCount = 0;
+
+void digiWifiDumpWordsAdd(unsigned int word)
+{
+ if (dumpWordsCount < DUMP_WORDS_MAX)
+ {
+ dumpWordsWord[dumpWordsCount++] = word;
+ }
+}
+void digiWifiDumpWordsDump(void)
+{
+ unsigned int *p = dumpWordsWord;
+ unsigned int wordsToGo = dumpWordsCount;
+
+ dumpWordsCount = 0;
+
+ while (wordsToGo >= 4)
+ {
+ digi_dbg("%8.8X %8.8X - %8.8X %8.8X\n", p[0], p[1], p[2], p[3]);
+ p += 4;
+ wordsToGo -= 4;
+ }
+ if (wordsToGo == 3)
+ {
+ digi_dbg("%8.8X %8.8X - %8.8X\n", p[0], p[1], p[2]);
+ }
+ else if (wordsToGo == 2)
+ {
+ digi_dbg("%8.8X %8.8X \n", p[0], p[1]);
+ }
+ else if (wordsToGo == 1)
+ {
+ digi_dbg("%8.8X \n", p[0]);
+ }
+ digi_dbg("--------------\n");
+}
+
+void digiWifiDumpWordsReset(void)
+{
+ dumpWordsCount = 0;
+}
+
+
+void digiWifiDumpBuffer(u8 *buffer, unsigned int length)
+{
+ unsigned int i, word;
+
+ digiWifiDumpWordsReset();
+
+ for (i = 0; i < length / sizeof(unsigned int); i++)
+ {
+ memcpy(&word, &buffer[i*sizeof(unsigned int)], sizeof(word));
+ digiWifiDumpWordsAdd(cpu_to_be32(word));
+ }
+
+ digiWifiDumpWordsDump();
+}
+
+
+void digiWifiDumpSkb(struct sk_buff *skb)
+{
+ unsigned int bytesLeft = skb->len;
+ unsigned char *p = skb->data;
+
+ digi_dbg("skb has %d bytes\n", skb->len);
+ while (bytesLeft >= 16)
+ {
+ digi_dbg("%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X - %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
+ p += 16;
+ bytesLeft -= 16;
+ }
+ if (bytesLeft >= 8)
+ {
+ digi_dbg("%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+ p += 8;
+ bytesLeft -= 8;
+ }
+ if (bytesLeft >= 4)
+ {
+ digi_dbg("%2.2X %2.2X %2.2X %2.2X \n",
+ p[0], p[1], p[2], p[3]);
+ p += 4;
+ bytesLeft -= 4;
+ }
+ if (bytesLeft >= 2)
+ {
+ digi_dbg("%2.2X %2.2X \n",
+ p[0], p[1]);
+ p += 2;
+ bytesLeft -= 2;
+ }
+ if (bytesLeft >= 1)
+ {
+ digi_dbg("%2.2X \n",
+ p[0]);
+ p += 1;
+ bytesLeft -= 1;
+ }
+}
+
+EXPORT_SYMBOL_GPL(digiWifiDumpSkb);
+
+
+void digiWifiDumpRegisters(struct piper_priv *digi, unsigned int regs)
+{
+#ifdef WANT_DEBUG
+ unsigned int i;
+
+ if (regs & CTRL_STATUS_REGS)
+ {
+ printk(KERN_ERR " %10.10s = 0x%8.8X %10.10s = 0x%8.8X\n", "Gen Ctrl", digi->ac->rd_reg(digi, BB_GENERAL_CTL),
+ "Gen Status", digi->ac->rd_reg(digi, BB_GENERAL_STAT));
+ }
+ else if (regs & IRQ_REGS)
+ {
+ printk(KERN_ERR " %10.10s = 0x%8.8X %10.10s = 0x%8.8X\n", "IRQ Mask", digi->ac->rd_reg(digi, BB_IRQ_MASK),
+ "IRQ Status", digi->ac->rd_reg(digi, BB_IRQ_STAT));
+ }
+ else if (regs & MAIN_REGS)
+ {
+ const char *regNames[] = {"Version", "Gen Ctrl", "Gen Status", "RSSI/AES",
+ "Int Mask", "Int Status", "SPI Data", "SPI Ctrl",
+ "Data FIFO", "not used", "conf-1", "conf-2", "AES FIFO",
+ "not used", "AES Ctrl", "IO Ctrl"};
+ printk(KERN_ERR "Main Registers:\n");
+ for (i = BB_VERSION; i <= BB_OUTPUT_CONTROL; i = i+8)
+ {
+ if ((i != BB_DATA_FIFO) && (i != BB_AES_FIFO))
+ {
+ printk(KERN_ERR " %10.10s = 0x%8.8X %10.10s = 0x%8.8X\n", regNames[i>>2], digi->ac->rd_reg(digi, i), regNames[(i>>2) + 1], digi->ac->rd_reg(digi, i+4));
+ }
+ }
+ }
+ if (regs & MAC_REGS)
+ {
+ const char *regNames[] = {"STA ID0", "STA ID1", "BSS ID0", "BSS ID1",
+ "OFDM/PSK", "Backoff", "DTIM/List", "B Int",
+ "Rev/M Stat", "C C/M CTL", "Measure", "Beac Fltr"};
+
+ printk(KERN_ERR "Secondary Registers:\n");
+ for (i = MAC_STA_ID0; i <= MAC_BEACON_FILT; i = i+8)
+ {
+ printk(KERN_ERR " %10.10s = 0x%8.8X %10.10s = 0x%8.8X\n", regNames[((i - MAC_STA_ID0) >>2)], digi->ac->rd_reg(digi, i), regNames[((i - MAC_STA_ID0)>>2) + 1], digi->ac->rd_reg(digi, i+4));
+ }
+ }
+ if (regs & FRAME_BUFFER_REGS)
+ {
+ unsigned int word[4];
+ printk(KERN_ERR "Real time frame buffer\n");
+
+ word[0] = be32_to_cpu(digi->ac->rd_reg(digi, 0xc0));
+ word[1] = be32_to_cpu(digi->ac->rd_reg(digi, 0xc4));
+ word[2] = be32_to_cpu(digi->ac->rd_reg(digi, 0xc8));
+ word[3] = be32_to_cpu(digi->ac->rd_reg(digi, 0xcc));
+ printk(KERN_ERR " %8.8X %8.8X - %8.8X %8.8X\n", word[0], word[1], word[2], word[3]);
+ word[0] = be32_to_cpu(digi->ac->rd_reg(digi, 0xd0));
+ word[1] = be32_to_cpu(digi->ac->rd_reg(digi, 0xd4));
+ word[2] = be32_to_cpu(digi->ac->rd_reg(digi, 0xd8));
+ word[3] = be32_to_cpu(digi->ac->rd_reg(digi, 0xdc));
+ printk(KERN_ERR " %8.8X %8.8X - %8.8X %8.8X\n", word[0], word[1], word[2], word[3]);
+ }
+ if (regs & FIFO_REGS)
+ {
+ unsigned int word[4];
+ printk(KERN_ERR "FIFO contents\n");
+
+ word[0] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[1] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[2] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[3] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ printk(KERN_ERR " %8.8X %8.8X - %8.8X %8.8X\n", word[0], word[1], word[2], word[3]);
+ word[0] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[1] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[2] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ word[3] = digi->ac->rd_reg(digi, BB_DATA_FIFO);
+ printk(KERN_ERR " %8.8X %8.8X - %8.8X %8.8X\n", word[0], word[1], word[2], word[3]);
+ }
+#endif
+}
+EXPORT_SYMBOL_GPL(digiWifiDumpRegisters);