Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90123e04 authored by Seth Forshee's avatar Seth Forshee Committed by John W. Linville
Browse files

brcmsmac: Add brcms_dbg_dma() debug macro



Also convert relevant messages to use this macro.

Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarArend van Spriel <arend@broadcom.com>
Tested-by: default avatarDaniel Wagner <wagi@monom.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 229a41d9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -40,5 +40,6 @@ static inline void __brcms_dbg(struct device *dev, u32 level,
#define brcms_dbg_rx(core, f, a...)		brcms_dbg(core, BRCM_DL_RX, f, ##a)
#define brcms_dbg_tx(core, f, a...)		brcms_dbg(core, BRCM_DL_TX, f, ##a)
#define brcms_dbg_int(core, f, a...)		brcms_dbg(core, BRCM_DL_INT, f, ##a)
#define brcms_dbg_dma(core, f, a...)		brcms_dbg(core, BRCM_DL_DMA, f, ##a)

#endif /* _BRCMS_DEBUG_H_ */
+66 −89
Original line number Diff line number Diff line
@@ -14,8 +14,6 @@
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/pci.h>
@@ -30,6 +28,7 @@
#include "soc.h"
#include "scb.h"
#include "ampdu.h"
#include "debug.h"

/*
 * dma register field offset calculation
@@ -181,28 +180,6 @@

#define BCMEXTRAHDROOM 172

/* debug/trace */
#ifdef DEBUG
#define	DMA_ERROR(fmt, ...)					\
do {								\
	if (*di->msg_level & 1)					\
		pr_debug("%s: " fmt, __func__, ##__VA_ARGS__);	\
} while (0)
#define	DMA_TRACE(fmt, ...)					\
do {								\
	if (*di->msg_level & 2)					\
		pr_debug("%s: " fmt, __func__, ##__VA_ARGS__);	\
} while (0)
#else
#define	DMA_ERROR(fmt, ...)			\
	no_printk(fmt, ##__VA_ARGS__)
#define	DMA_TRACE(fmt, ...)			\
	no_printk(fmt, ##__VA_ARGS__)
#endif				/* DEBUG */

#define	DMA_NONE(fmt, ...)			\
	no_printk(fmt, ##__VA_ARGS__)

#define	MAXNAMEL	8	/* 8 char names */

/* macros to convert between byte offsets and indexes */
@@ -229,7 +206,6 @@ struct dma64desc {
/* dma engine software state */
struct dma_info {
	struct dma_pub dma; /* exported structure */
	uint *msg_level;	/* message level pointer */
	char name[MAXNAMEL];	/* callers name for diag msgs */

	struct bcma_device *core;
@@ -306,12 +282,6 @@ struct dma_info {
	bool aligndesc_4k;
};

/*
 * default dma message level (if input msg_level
 * pointer is null in dma_attach())
 */
static uint dma_msg_level;

/* Check for odd number of 1's */
static u32 parity32(__le32 data)
{
@@ -379,7 +349,7 @@ static uint _dma_ctrlflags(struct dma_info *di, uint mask, uint flags)
	uint dmactrlflags;

	if (di == NULL) {
		DMA_ERROR("NULL dma handle\n");
		brcms_dbg_dma(di->core, "NULL dma handle\n");
		return 0;
	}

@@ -431,12 +401,14 @@ static bool _dma_isaddrext(struct dma_info *di)
	/* not all tx or rx channel are available */
	if (di->d64txregbase != 0) {
		if (!_dma64_addrext(di, DMA64TXREGOFFS(di, control)))
			DMA_ERROR("%s: DMA64 tx doesn't have AE set\n",
			brcms_dbg_dma(di->core,
				      "%s: DMA64 tx doesn't have AE set\n",
				      di->name);
		return true;
	} else if (di->d64rxregbase != 0) {
		if (!_dma64_addrext(di, DMA64RXREGOFFS(di, control)))
			DMA_ERROR("%s: DMA64 rx doesn't have AE set\n",
			brcms_dbg_dma(di->core,
				      "%s: DMA64 rx doesn't have AE set\n",
				      di->name);
		return true;
	}
@@ -538,7 +510,8 @@ static bool dma64_alloc(struct dma_info *di, uint direction)
		va = dma_ringalloc(di, D64RINGALIGN, size, &align_bits,
			&alloced, &di->txdpaorig);
		if (va == NULL) {
			DMA_ERROR("%s: DMA_ALLOC_CONSISTENT(ntxd) failed\n",
			brcms_dbg_dma(di->core,
				      "%s: DMA_ALLOC_CONSISTENT(ntxd) failed\n",
				      di->name);
			return false;
		}
@@ -552,7 +525,8 @@ static bool dma64_alloc(struct dma_info *di, uint direction)
		va = dma_ringalloc(di, D64RINGALIGN, size, &align_bits,
			&alloced, &di->rxdpaorig);
		if (va == NULL) {
			DMA_ERROR("%s: DMA_ALLOC_CONSISTENT(nrxd) failed\n",
			brcms_dbg_dma(di->core,
				      "%s: DMA_ALLOC_CONSISTENT(nrxd) failed\n",
				      di->name);
			return false;
		}
@@ -575,7 +549,7 @@ static bool _dma_alloc(struct dma_info *di, uint direction)
struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
			   uint txregbase, uint rxregbase, uint ntxd, uint nrxd,
			   uint rxbufsize, int rxextheadroom,
			   uint nrxpost, uint rxoffset, uint *msg_level)
			   uint nrxpost, uint rxoffset)
{
	struct si_pub *sih = wlc->hw->sih;
	struct bcma_device *core = wlc->hw->d11core;
@@ -589,9 +563,6 @@ struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
	if (di == NULL)
		return NULL;

	di->msg_level = msg_level ? msg_level : &dma_msg_level;


	di->dma64 =
		((bcma_aread32(core, BCMA_IOST) & SISF_DMA64) == SISF_DMA64);

@@ -607,7 +578,7 @@ struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
	 */
	_dma_ctrlflags(di, DMA_CTRL_ROC | DMA_CTRL_PEN, 0);

	DMA_TRACE("%s: %s flags 0x%x ntxd %d nrxd %d "
	brcms_dbg_dma(di->core, "%s: %s flags 0x%x ntxd %d nrxd %d "
		      "rxbufsize %d rxextheadroom %d nrxpost %d rxoffset %d "
		      "txregbase %u rxregbase %u\n", name, "DMA64",
		      di->dma.dmactrlflags, ntxd, nrxd, rxbufsize,
@@ -673,7 +644,7 @@ struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
		di->dmadesc_align = 4;	/* 16 byte alignment */
	}

	DMA_NONE("DMA descriptor align_needed %d, align %d\n",
	brcms_dbg_dma(di->core, "DMA descriptor align_needed %d, align %d\n",
		      di->aligndesc_4k, di->dmadesc_align);

	/* allocate tx packet pointer vector */
@@ -712,12 +683,14 @@ struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,

	if ((di->ddoffsetlow != 0) && !di->addrext) {
		if (di->txdpa > SI_PCI_DMA_SZ) {
			DMA_ERROR("%s: txdpa 0x%x: addrext not supported\n",
			brcms_dbg_dma(di->core,
				      "%s: txdpa 0x%x: addrext not supported\n",
				      di->name, (u32)di->txdpa);
			goto fail;
		}
		if (di->rxdpa > SI_PCI_DMA_SZ) {
			DMA_ERROR("%s: rxdpa 0x%x: addrext not supported\n",
			brcms_dbg_dma(di->core,
				      "%s: rxdpa 0x%x: addrext not supported\n",
				      di->name, (u32)di->rxdpa);
			goto fail;
		}
@@ -726,7 +699,8 @@ struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
	/* Initialize AMPDU session */
	brcms_c_ampdu_reset_session(&di->ampdu_session, wlc);

	DMA_TRACE("ddoffsetlow 0x%x ddoffsethigh 0x%x dataoffsetlow 0x%x dataoffsethigh 0x%x addrext %d\n",
	brcms_dbg_dma(di->core,
		      "ddoffsetlow 0x%x ddoffsethigh 0x%x dataoffsetlow 0x%x dataoffsethigh 0x%x addrext %d\n",
		      di->ddoffsetlow, di->ddoffsethigh,
		      di->dataoffsetlow, di->dataoffsethigh,
		      di->addrext);
@@ -775,7 +749,7 @@ void dma_detach(struct dma_pub *pub)
{
	struct dma_info *di = (struct dma_info *)pub;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	/* free dma descriptor rings */
	if (di->txd64)
@@ -851,7 +825,7 @@ static void _dma_rxenable(struct dma_info *di)
	uint dmactrlflags = di->dma.dmactrlflags;
	u32 control;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	control = D64_RC_RE | (bcma_read32(di->core,
					   DMA64RXREGOFFS(di, control)) &
@@ -871,7 +845,7 @@ void dma_rxinit(struct dma_pub *pub)
{
	struct dma_info *di = (struct dma_info *)pub;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	if (di->nrxd == 0)
		return;
@@ -966,7 +940,7 @@ int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)
		return 0;

	len = le16_to_cpu(*(__le16 *) (p->data));
	DMA_TRACE("%s: dma_rx len %d\n", di->name, len);
	brcms_dbg_dma(di->core, "%s: dma_rx len %d\n", di->name, len);
	dma_spin_for_len(len, p);

	/* set actual length */
@@ -993,13 +967,14 @@ int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)
					      DMA64RXREGOFFS(di, status0)) &
				  D64_RS0_CD_MASK) - di->rcvptrbase) &
				D64_RS0_CD_MASK, struct dma64desc);
			DMA_ERROR("rxin %d rxout %d, hw_curr %d\n",
			brcms_dbg_dma(di->core,
				      "rxin %d rxout %d, hw_curr %d\n",
				      di->rxin, di->rxout, cur);
		}
#endif				/* DEBUG */

		if ((di->dma.dmactrlflags & DMA_CTRL_RXMULTI) == 0) {
			DMA_ERROR("%s: bad frame length (%d)\n",
			brcms_dbg_dma(di->core, "%s: bad frame length (%d)\n",
				      di->name, len);
			skb_queue_walk_safe(&dma_frames, p, next) {
				skb_unlink(p, &dma_frames);
@@ -1017,7 +992,7 @@ int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)

static bool dma64_rxidle(struct dma_info *di)
{
	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	if (di->nrxd == 0)
		return true;
@@ -1070,7 +1045,7 @@ bool dma_rxfill(struct dma_pub *pub)

	n = di->nrxpost - nrxdactive(di, rxin, rxout);

	DMA_TRACE("%s: post %d\n", di->name, n);
	brcms_dbg_dma(di->core, "%s: post %d\n", di->name, n);

	if (di->rxbufsize > BCMEXTRAHDROOM)
		extra_offset = di->rxextrahdrroom;
@@ -1083,9 +1058,11 @@ bool dma_rxfill(struct dma_pub *pub)
		p = brcmu_pkt_buf_get_skb(di->rxbufsize + extra_offset);

		if (p == NULL) {
			DMA_ERROR("%s: out of rxbufs\n", di->name);
			brcms_dbg_dma(di->core, "%s: out of rxbufs\n",
				      di->name);
			if (i == 0 && dma64_rxidle(di)) {
				DMA_ERROR("%s: ring is empty !\n", di->name);
				brcms_dbg_dma(di->core, "%s: ring is empty !\n",
					      di->name);
				ring_empty = true;
			}
			di->dma.rxnobuf++;
@@ -1130,7 +1107,7 @@ void dma_rxreclaim(struct dma_pub *pub)
	struct dma_info *di = (struct dma_info *)pub;
	struct sk_buff *p;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	while ((p = _dma_getnextrxp(di, true)))
		brcmu_pkt_buf_free_skb(p);
@@ -1161,7 +1138,7 @@ void dma_txinit(struct dma_pub *pub)
	struct dma_info *di = (struct dma_info *)pub;
	u32 control = D64_XC_XE;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	if (di->ntxd == 0)
		return;
@@ -1193,7 +1170,7 @@ void dma_txsuspend(struct dma_pub *pub)
{
	struct dma_info *di = (struct dma_info *)pub;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	if (di->ntxd == 0)
		return;
@@ -1205,7 +1182,7 @@ void dma_txresume(struct dma_pub *pub)
{
	struct dma_info *di = (struct dma_info *)pub;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	if (di->ntxd == 0)
		return;
@@ -1228,7 +1205,7 @@ void dma_txreclaim(struct dma_pub *pub, enum txd_range range)
	struct dma_info *di = (struct dma_info *)pub;
	struct sk_buff *p;

	DMA_TRACE("%s: %s\n",
	brcms_dbg_dma(di->core, "%s: %s\n",
		      di->name,
		      range == DMA_RANGE_ALL ? "all" :
		      range == DMA_RANGE_TRANSMITTED ? "transmitted" :
@@ -1392,7 +1369,7 @@ int dma_txfast(struct brcms_c_info *wlc, struct dma_pub *pub,
	struct ieee80211_tx_info *tx_info;
	bool is_ampdu;

	DMA_TRACE("%s:\n", di->name);
	brcms_dbg_dma(di->core, "%s:\n", di->name);

	/* no use to transmit a zero length packet */
	if (p->len == 0)
@@ -1430,7 +1407,7 @@ int dma_txfast(struct brcms_c_info *wlc, struct dma_pub *pub,
	return 0;

 outoftxd:
	DMA_ERROR("%s: out of txds !!!\n", di->name);
	brcms_dbg_dma(di->core, "%s: out of txds !!!\n", di->name);
	brcmu_pkt_buf_free_skb(p);
	di->dma.txavail = 0;
	di->dma.txnobuf++;
@@ -1482,7 +1459,7 @@ struct sk_buff *dma_getnexttxp(struct dma_pub *pub, enum txd_range range)
	u16 active_desc;
	struct sk_buff *txp;

	DMA_TRACE("%s: %s\n",
	brcms_dbg_dma(di->core, "%s: %s\n",
		      di->name,
		      range == DMA_RANGE_ALL ? "all" :
		      range == DMA_RANGE_TRANSMITTED ? "transmitted" :
@@ -1545,7 +1522,7 @@ struct sk_buff *dma_getnexttxp(struct dma_pub *pub, enum txd_range range)
	return txp;

 bogus:
	DMA_NONE("bogus curr: start %d end %d txout %d\n",
	brcms_dbg_dma(di->core, "bogus curr: start %d end %d txout %d\n",
		      start, end, di->txout);
	return NULL;
}
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ extern struct dma_pub *dma_attach(char *name, struct brcms_c_info *wlc,
				  uint txregbase, uint rxregbase,
				  uint ntxd, uint nrxd,
				  uint rxbufsize, int rxextheadroom,
				  uint nrxpost, uint rxoffset, uint *msg_level);
				  uint nrxpost, uint rxoffset);

void dma_rxinit(struct dma_pub *pub);
int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list);
+4 −6
Original line number Diff line number Diff line
@@ -1153,7 +1153,7 @@ static bool brcms_b_attach_dmapio(struct brcms_c_info *wlc, uint j, bool wme)
					   dmareg(DMA_RX, 0),
					   (wme ? NTXD : 0), NRXD,
					   RXBUFSZ, -1, NRXBUFPOST,
					   BRCMS_HWRXOFF, &brcm_msg_level);
					   BRCMS_HWRXOFF);
		dma_attach_err |= (NULL == wlc_hw->di[0]);

		/*
@@ -1164,8 +1164,7 @@ static bool brcms_b_attach_dmapio(struct brcms_c_info *wlc, uint j, bool wme)
		 */
		wlc_hw->di[1] = dma_attach(name, wlc,
					   dmareg(DMA_TX, 1), 0,
					   NTXD, 0, 0, -1, 0, 0,
					   &brcm_msg_level);
					   NTXD, 0, 0, -1, 0, 0);
		dma_attach_err |= (NULL == wlc_hw->di[1]);

		/*
@@ -1175,8 +1174,7 @@ static bool brcms_b_attach_dmapio(struct brcms_c_info *wlc, uint j, bool wme)
		 */
		wlc_hw->di[2] = dma_attach(name, wlc,
					   dmareg(DMA_TX, 2), 0,
					   NTXD, 0, 0, -1, 0, 0,
					   &brcm_msg_level);
					   NTXD, 0, 0, -1, 0, 0);
		dma_attach_err |= (NULL == wlc_hw->di[2]);
		/*
		 * FIFO 3
@@ -1186,7 +1184,7 @@ static bool brcms_b_attach_dmapio(struct brcms_c_info *wlc, uint j, bool wme)
		wlc_hw->di[3] = dma_attach(name, wlc,
					   dmareg(DMA_TX, 3),
					   0, NTXD, 0, 0, -1,
					   0, 0, &brcm_msg_level);
					   0, 0);
		dma_attach_err |= (NULL == wlc_hw->di[3]);
/* Cleaner to leave this as if with AP defined */

+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@
#define BRCM_DL_RX		0x00000004
#define BRCM_DL_TX		0x00000008
#define BRCM_DL_INT		0x00000010
#define BRCM_DL_DMA		0x00000020

#define PM_OFF	0
#define PM_MAX	1