2 * Copyright (c) 2012 Adrian Chadd <adrian@FreeBSD.org>
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include <sys/cdefs.h>
19 __FBSDID("$FreeBSD$");
28 #include <sys/types.h>
30 #include <sys/endian.h>
32 #include <dev/ath/if_ath_alq.h>
33 #include <dev/ath/ath_hal/ar5210/ar5210desc.h>
35 #include "ar5210_ds.h"
37 #define MS(_v, _f) ( ((_v) & (_f)) >> _f##_S )
38 #define MF(_v, _f) ( !! ((_v) & (_f)))
41 ar5210_decode_txstatus(struct if_ath_alq_payload *a)
43 struct ar5210_desc txs;
45 /* XXX assumes txs is smaller than PAYLOAD_LEN! */
46 memcpy(&txs, &a->payload, sizeof(struct ar5210_desc));
48 printf("[%u.%06u] [%llu] TXSTATUS\n",
49 (unsigned int) be32toh(a->hdr.tstamp_sec),
50 (unsigned int) be32toh(a->hdr.tstamp_usec),
51 (unsigned long long) be64toh(a->hdr.threadid));
54 printf(" Frmok=%d, xretries=%d, fifounderrun=%d, filt=%d\n",
55 MF(txs.ds_status0, AR_FrmXmitOK),
56 MF(txs.ds_status0, AR_ExcessiveRetries),
57 MF(txs.ds_status0, AR_FIFOUnderrun),
58 MF(txs.ds_status0, AR_Filtered));
59 printf(" LongRetryCnt=%d, ShortRetryCnt=%d\n",
60 MS(txs.ds_status0, AR_LongRetryCnt),
61 MS(txs.ds_status0, AR_ShortRetryCnt));
62 printf(" SndTimestamp=0x%04x\n",
63 MS(txs.ds_status0, AR_SendTimestamp));
66 printf(" Done=%d, SeqNum=0x%04x, AckRSSI=%d\n",
67 MF(txs.ds_status1, AR_Done),
68 txs.ds_status1 & AR_SeqNum,
69 MS(txs.ds_status1, AR_AckSigStrength));
71 printf("\n ------\n");
75 ar5210_decode_txdesc(struct if_ath_alq_payload *a)
77 struct ar5210_desc txc;
79 /* XXX assumes txs is smaller than PAYLOAD_LEN! */
80 memcpy(&txc, &a->payload, sizeof(struct ar5210_desc));
82 printf("[%u.%06u] [%llu] TXD\n",
83 (unsigned int) be32toh(a->hdr.tstamp_sec),
84 (unsigned int) be32toh(a->hdr.tstamp_usec),
85 (unsigned long long) be64toh(a->hdr.threadid));
87 printf(" link=0x%08x, data=0x%08x\n",
92 printf(" Frame Len=%d\n", txc.ds_ctl0 & AR_FrameLen);
93 printf(" TX Rate=0x%02x, RtsEna=%d, ClrDstMask=%d AntModeXmit=0x%02x\n",
94 MS(txc.ds_ctl0, AR_XmitRate),
95 MF(txc.ds_ctl0, AR_RTSCTSEnable),
96 MF(txc.ds_ctl0, AR_ClearDestMask),
97 MF(txc.ds_ctl0, AR_AntModeXmit));
98 printf(" FrmType=0x%02x, TxIntrReq=%d\n",
99 MS(txc.ds_ctl0, AR_FrmType),
100 MF(txc.ds_ctl0, AR_TxInterReq));
101 printf(" LongPkt=%d\n", MF(txc.ds_ctl0, AR_LongPkt));
104 printf(" BufLen=%d, TxMore=%d, EncryptKeyIdx=%d, RtsDuration=%d\n",
105 txc.ds_ctl1 & AR_BufLen,
106 MF(txc.ds_ctl1, AR_More),
107 MS(txc.ds_ctl1, AR_EncryptKeyIdx),
108 MS(txc.ds_ctl1, AR_RTSDuration));
110 printf("\n ------ \n");
114 ar5210_decode_rxstatus(struct if_ath_alq_payload *a)
116 struct ar5210_desc rxs;
118 /* XXX assumes rxs is smaller than PAYLOAD_LEN! */
119 memcpy(&rxs, &a->payload, sizeof(struct ar5210_desc));
121 printf("[%u.%06u] [%llu] RXSTATUS\n",
122 (unsigned int) be32toh(a->hdr.tstamp_sec),
123 (unsigned int) be32toh(a->hdr.tstamp_usec),
124 (unsigned long long) be64toh(a->hdr.threadid));
126 printf(" link=0x%08x, data=0x%08x\n",
131 printf(" DataLen=%d, ArMore=%d, RSSI=%d, RcvAntenna=0x%x\n",
132 rxs.ds_status0 & AR_DataLen,
133 MF(rxs.ds_status0, AR_More),
134 MS(rxs.ds_status0, AR_RcvSigStrength),
135 MF(rxs.ds_status0, AR_RcvAntenna));
138 printf(" RxDone=%d, RxFrameOk=%d, CrcErr=%d, DecryptCrcErr=%d\n",
139 MF(rxs.ds_status1, AR_Done),
140 MF(rxs.ds_status1, AR_FrmRcvOK),
141 MF(rxs.ds_status1, AR_CRCErr),
142 MF(rxs.ds_status1, AR_DecryptCRCErr));
143 printf(" KeyIdxValid=%d\n",
144 MF(rxs.ds_status1, AR_KeyIdxValid));
146 printf(" PhyErrCode=0x%02x\n",
147 MS(rxs.ds_status1, AR_PHYErr));
149 printf(" KeyMiss=%d\n",
150 MF(rxs.ds_status1, AR_KeyCacheMiss));
152 printf(" Timetamp: 0x%05x\n",
153 MS(rxs.ds_status1, AR_RcvTimestamp));
155 printf("\n ------\n");
159 ar5210_alq_payload(struct if_ath_alq_payload *a)
162 switch (be16toh(a->hdr.op)) {
163 case ATH_ALQ_EDMA_TXSTATUS: /* TXSTATUS */
164 ar5210_decode_txstatus(a);
166 case ATH_ALQ_EDMA_RXSTATUS: /* RXSTATUS */
167 ar5210_decode_rxstatus(a);
169 case ATH_ALQ_EDMA_TXDESC: /* TXDESC */
170 ar5210_decode_txdesc(a);
173 printf("[%d.%06d] [%lld] op: %d; len %d\n",
174 be32toh(a->hdr.tstamp_sec),
175 be32toh(a->hdr.tstamp_usec),
176 be64toh(a->hdr.threadid),
177 be16toh(a->hdr.op), be16toh(a->hdr.len));