This adds a few tracepoints to ath5k driver transmit and
receive callbacks in order to record packet traffic.
We record the entire packet in the trace buffer so that
the data can be extracted with trace-cmd and external
plugins.

This approach removes an out-of-line function call
from the tx and rx paths when the debugging is compiled
in but disabled, while improving the ability to process
the logged data.  A new Kconfig option can disable the
tracepoints completely.

The corresponding debug dump functions are removed.

Signed-off-by: Bob Copeland <m...@bobcopeland.com>
---

(Actually this patch doesn't remove the debug_dump_skb() functions but
I'll probably do that before sending it on...)

I've been carrying this locally for a while and rebasing it, what are
thoughts on sending this upstream now?

Last time not everyone was sold on changing all debug to tracepoints,
so how about just these two?  I doubt anyone is really using debug
rx/tx since it produces so much log spam and there's no easy way to
post-process the data.  I find this pretty useful for correlating
the mac80211 tracepoints with ath5k -- for example, it's easy to see
where the PS code decides to send a nullfunc frame, and trace that
through ath5k's ->tx() because the timestamps all match up.

v2:
 - rebased to w-t
 - added Kconfig so everyone doesn't have to take the text hit (~4k)

 drivers/net/wireless/ath/ath5k/Kconfig       |   11 +++
 drivers/net/wireless/ath/ath5k/ath5k_trace.h |  107 ++++++++++++++++++++++++++
 drivers/net/wireless/ath/ath5k/base.c        |   16 +++--
 3 files changed, 128 insertions(+), 6 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath5k/ath5k_trace.h

diff --git a/drivers/net/wireless/ath/ath5k/Kconfig 
b/drivers/net/wireless/ath/ath5k/Kconfig
index e079331..e18a9aa 100644
--- a/drivers/net/wireless/ath/ath5k/Kconfig
+++ b/drivers/net/wireless/ath/ath5k/Kconfig
@@ -40,6 +40,17 @@ config ATH5K_DEBUG
 
          modprobe ath5k debug=0x00000400
 
+config ATH5K_TRACER
+       bool "Atheros 5xxx tracer"
+       depends on ATH5K
+       depends on EVENT_TRACING
+       ---help---
+         Say Y here to enable tracepoints for the ath5k driver
+         using the kernel tracing infrastructure.  Select this
+         option if you are interested in debugging the driver.
+
+         If unsure, say N.
+
 config ATH5K_AHB
        bool "Atheros 5xxx AHB bus support"
        depends on (ATHEROS_AR231X && !PCI)
diff --git a/drivers/net/wireless/ath/ath5k/ath5k_trace.h 
b/drivers/net/wireless/ath/ath5k/ath5k_trace.h
new file mode 100644
index 0000000..9011d0a
--- /dev/null
+++ b/drivers/net/wireless/ath/ath5k/ath5k_trace.h
@@ -0,0 +1,107 @@
+#if !defined(__TRACE_ATH5K_H) || defined(TRACE_HEADER_MULTI_READ)
+#define __TRACE_ATH5K_H
+
+#include <linux/tracepoint.h>
+#include "base.h"
+
+#ifndef CONFIG_ATH5K_TRACER
+#undef TRACE_EVENT
+#define TRACE_EVENT(name, proto, ...) \
+static inline void trace_ ## name(proto) {}
+#endif
+
+struct sk_buff;
+
+#define PRIV_ENTRY  __field(struct ath5k_softc *, priv)
+#define PRIV_ASSIGN __entry->priv = priv
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM ath5k
+
+TRACE_EVENT(ath5k_rx,
+       TP_PROTO(struct ath5k_softc *priv, struct sk_buff *skb),
+       TP_ARGS(priv, skb),
+       TP_STRUCT__entry(
+               PRIV_ENTRY
+               __field(unsigned long, skbaddr)
+               __dynamic_array(u8, frame, skb->len)
+       ),
+       TP_fast_assign(
+               PRIV_ASSIGN;
+               __entry->skbaddr = (unsigned long) skb;
+               memcpy(__get_dynamic_array(frame), skb->data, skb->len);
+       ),
+       TP_printk(
+               "[%p] RX skb=%lx", __entry->priv, __entry->skbaddr
+       )
+);
+
+TRACE_EVENT(ath5k_tx,
+       TP_PROTO(struct ath5k_softc *priv, struct sk_buff *skb,
+                struct ath5k_txq *q),
+
+       TP_ARGS(priv, skb, q),
+
+       TP_STRUCT__entry(
+               PRIV_ENTRY
+               __field(unsigned long, skbaddr)
+               __field(u8, qnum)
+               __dynamic_array(u8, frame, skb->len)
+       ),
+
+       TP_fast_assign(
+               PRIV_ASSIGN;
+               __entry->skbaddr = (unsigned long) skb;
+               __entry->qnum = (u8) q->qnum;
+               memcpy(__get_dynamic_array(frame), skb->data, skb->len);
+       ),
+
+       TP_printk(
+               "[%p] TX skb=%lx q=%d", __entry->priv, __entry->skbaddr,
+               __entry->qnum
+       )
+);
+
+TRACE_EVENT(ath5k_tx_complete,
+       TP_PROTO(struct ath5k_softc *priv, struct sk_buff *skb,
+                struct ath5k_txq *q, struct ath5k_tx_status *ts),
+
+       TP_ARGS(priv, skb, q, ts),
+
+       TP_STRUCT__entry(
+               PRIV_ENTRY
+               __field(unsigned long, skbaddr)
+               __field(u8, qnum)
+               __field(u8, ts_status)
+               __field(s8, ts_rssi)
+               __field(u8, ts_antenna)
+       ),
+
+       TP_fast_assign(
+               PRIV_ASSIGN;
+               __entry->skbaddr = (unsigned long) skb;
+               __entry->qnum = (u8) q->qnum;
+               __entry->ts_status = ts->ts_status;
+               __entry->ts_rssi =  ts->ts_rssi;
+               __entry->ts_antenna = ts->ts_antenna;
+       ),
+
+       TP_printk(
+               "[%p] TX end skb=%lx q=%d stat=%x rssi=%d ant=%x",
+               __entry->priv, __entry->skbaddr, __entry->qnum,
+               __entry->ts_status, __entry->ts_rssi, __entry->ts_antenna
+       )
+);
+
+#endif /* __TRACE_ATH5K_H */
+
+#ifdef CONFIG_ATH5K_TRACER
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../drivers/net/wireless/ath/ath5k
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE ath5k_trace
+
+#include <trace/define_trace.h>
+
+#endif
diff --git a/drivers/net/wireless/ath/ath5k/base.c 
b/drivers/net/wireless/ath/ath5k/base.c
index 14377ac..9ae51f2 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -61,6 +61,9 @@
 #include "debug.h"
 #include "ani.h"
 
+#define CREATE_TRACE_POINTS
+#include "ath5k_trace.h"
+
 int ath5k_modparam_nohwcrypt;
 module_param_named(nohwcrypt, ath5k_modparam_nohwcrypt, bool, S_IRUGO);
 MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
@@ -1384,7 +1387,7 @@ ath5k_receive_frame(struct ath5k_softc *sc, struct 
sk_buff *skb,
            
sc->sbands[sc->curchan->band].bitrates[rxs->rate_idx].hw_value_short)
                rxs->flag |= RX_FLAG_SHORTPRE;
 
-       ath5k_debug_dump_skb(sc, skb, "RX  ", 0);
+       trace_ath5k_rx(sc, skb);
 
        ath5k_update_beacon_rssi(sc, skb, rs->rs_rssi);
 
@@ -1529,7 +1532,7 @@ ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff 
*skb,
        unsigned long flags;
        int padsize;
 
-       ath5k_debug_dump_skb(sc, skb, "TX  ", 1);
+       trace_ath5k_tx(sc, skb, txq);
 
        /*
         * The hardware expects the header padded to 4 byte boundaries.
@@ -1578,7 +1581,7 @@ drop_packet:
 
 static void
 ath5k_tx_frame_completed(struct ath5k_softc *sc, struct sk_buff *skb,
-                        struct ath5k_tx_status *ts)
+                        struct ath5k_txq *txq, struct ath5k_tx_status *ts)
 {
        struct ieee80211_tx_info *info;
        int i;
@@ -1630,6 +1633,7 @@ ath5k_tx_frame_completed(struct ath5k_softc *sc, struct 
sk_buff *skb,
        else
                sc->stats.antenna_tx[0]++; /* invalid */
 
+       trace_ath5k_tx_complete(sc, skb, txq, ts);
        ieee80211_tx_status(sc->hw, skb);
 }
 
@@ -1666,7 +1670,7 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct 
ath5k_txq *txq)
 
                        dma_unmap_single(sc->dev, bf->skbaddr, skb->len,
                                        DMA_TO_DEVICE);
-                       ath5k_tx_frame_completed(sc, skb, &ts);
+                       ath5k_tx_frame_completed(sc, skb, txq, &ts);
                }
 
                /*
@@ -1808,8 +1812,6 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct 
ieee80211_vif *vif)
                goto out;
        }
 
-       ath5k_debug_dump_skb(sc, skb, "BC  ", 1);
-
        ath5k_txbuf_free_skb(sc, avf->bbuf);
        avf->bbuf->skb = skb;
        ret = ath5k_beacon_setup(sc, avf->bbuf);
@@ -1904,6 +1906,8 @@ ath5k_beacon_send(struct ath5k_softc *sc)
                        sc->opmode == NL80211_IFTYPE_MESH_POINT)
                ath5k_beacon_update(sc->hw, vif);
 
+       trace_ath5k_tx(sc, bf->skb, &sc->txqs[sc->bhalq]);
+
        ath5k_hw_set_txdp(ah, sc->bhalq, bf->daddr);
        ath5k_hw_start_tx_dma(ah, sc->bhalq);
        ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, "TXDP[%u] = %llx (%p)\n",
-- 
1.7.1.1


_______________________________________________
ath5k-devel mailing list
ath5k-devel@lists.ath5k.org
https://lists.ath5k.org/mailman/listinfo/ath5k-devel

Reply via email to