1243593Sadrian/* 2243593Sadrian * Copyright (c) 2012 Adrian Chadd <adrian@FreeBSD.org> 3243593Sadrian * All Rights Reserved. 4243593Sadrian * 5243593Sadrian * Permission to use, copy, modify, and/or distribute this software for any 6243593Sadrian * purpose with or without fee is hereby granted, provided that the above 7243593Sadrian * copyright notice and this permission notice appear in all copies. 8243593Sadrian * 9243593Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10243593Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11243593Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12243593Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13243593Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14243593Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15243593Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16243593Sadrian */ 17243593Sadrian 18243593Sadrian#include <sys/cdefs.h> 19243593Sadrian__FBSDID("$FreeBSD$"); 20243593Sadrian 21243593Sadrian#include <stdio.h> 22243593Sadrian#include <stdlib.h> 23243593Sadrian#include <unistd.h> 24243593Sadrian#include <fcntl.h> 25243593Sadrian#include <errno.h> 26243593Sadrian#include <string.h> 27243593Sadrian 28243593Sadrian#include <sys/types.h> 29243593Sadrian#include <sys/alq.h> 30243593Sadrian#include <sys/endian.h> 31243593Sadrian 32243593Sadrian#include <dev/ath/if_ath_alq.h> 33243593Sadrian#include <dev/ath/ath_hal/ar5416/ar5416desc.h> 34243593Sadrian 35243593Sadrian#include "ar5416_ds.h" 36243593Sadrian 37243593Sadrian#define MS(_v, _f) ( ((_v) & (_f)) >> _f##_S ) 38243593Sadrian#define MF(_v, _f) ( !! ((_v) & (_f))) 39243593Sadrian 40243593Sadrianstatic void 41243593Sadrianar5416_decode_txstatus(struct if_ath_alq_payload *a) 42243593Sadrian{ 43243593Sadrian struct ar5416_desc txs; 44243593Sadrian static uint64_t tx_tsf = 0; 45243593Sadrian 46243593Sadrian /* XXX assumes txs is smaller than PAYLOAD_LEN! */ 47243593Sadrian memcpy(&txs, &a->payload, sizeof(struct ar5416_desc)); 48243593Sadrian 49243593Sadrian if (MF(txs.u.tx.status[9], AR_TxDone) == 0) 50243593Sadrian return; 51243593Sadrian 52243593Sadrian printf("[%u] [%llu] TXSTATUS: TxDone=%d, TS=0x%08x (delta %d)\n", 53243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 54243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 55243593Sadrian MF(txs.u.tx.status[9], AR_TxDone), 56243593Sadrian txs.u.tx.status[2], 57243593Sadrian txs.u.tx.status[2] - tx_tsf); 58243593Sadrian 59243593Sadrian tx_tsf = txs.u.tx.status[2]; 60243593Sadrian 61243593Sadrian#if 0 62243593Sadrian /* ds_txstatus0 */ 63243593Sadrian printf(" RX RSSI 0 [%d %d %d]\n", 64243593Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt00), 65243593Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt01), 66243593Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt02)); 67243593Sadrian printf(" BA Valid=%d\n", 68243593Sadrian MF(txs.u.tx.status[0], AR_TxBaStatus)); 69243593Sadrian 70243593Sadrian /* ds_txstatus1 */ 71243593Sadrian printf(" Frmok=%d, xretries=%d, fifounderrun=%d, filt=%d\n", 72243593Sadrian MF(txs.u.tx.status[1], AR_FrmXmitOK), 73243593Sadrian MF(txs.u.tx.status[1], AR_ExcessiveRetries), 74243593Sadrian MF(txs.u.tx.status[1], AR_FIFOUnderrun), 75243593Sadrian MF(txs.u.tx.status[1], AR_Filtered)); 76243593Sadrian printf(" DelimUnderrun=%d, DataUnderun=%d, DescCfgErr=%d," 77243593Sadrian " TxTimerExceeded=%d\n", 78243593Sadrian MF(txs.u.tx.status[1], AR_TxDelimUnderrun), 79243593Sadrian MF(txs.u.tx.status[1], AR_TxDataUnderrun), 80243593Sadrian MF(txs.u.tx.status[1], AR_DescCfgErr), 81243593Sadrian MF(txs.u.tx.status[1], AR_TxTimerExpired)); 82243593Sadrian 83243593Sadrian printf(" RTScnt=%d, FailCnt=%d, VRetryCnt=%d\n", 84243593Sadrian MS(txs.u.tx.status[1], AR_RTSFailCnt), 85243593Sadrian MS(txs.u.tx.status[1], AR_DataFailCnt), 86243593Sadrian MS(txs.u.tx.status[1], AR_VirtRetryCnt)); 87243593Sadrian 88243593Sadrian /* ds_txstatus2 */ 89243593Sadrian printf(" TxTimestamp=0x%08x\n", txs.u.tx.status[2]); 90243593Sadrian 91243593Sadrian /* ds_txstatus3 */ 92243593Sadrian /* ds_txstatus4 */ 93243593Sadrian printf(" BALow=0x%08x\n", txs.u.tx.status[3]); 94243593Sadrian printf(" BAHigh=0x%08x\n", txs.u.tx.status[4]); 95243593Sadrian 96243593Sadrian /* ds_txstatus5 */ 97243593Sadrian printf(" RX RSSI 1 [%d %d %d] Comb=%d\n", 98243593Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt10), 99243593Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt11), 100243593Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt12), 101243593Sadrian MS(txs.u.tx.status[5], AR_TxRSSICombined)); 102243593Sadrian 103243593Sadrian /* ds_txstatus6 */ 104243593Sadrian /* ds_txstatus7 */ 105243593Sadrian /* ds_txstatus8 */ 106243593Sadrian printf(" TxEVM[0]=0x%08x, TxEVM[1]=0x%08x, TxEVM[2]=0x%08x\n", 107243593Sadrian txs.u.tx.status[6], 108243593Sadrian txs.u.tx.status[7], 109243593Sadrian txs.u.tx.status[8]); 110243593Sadrian 111243593Sadrian /* ds_txstatus9 */ 112243593Sadrian printf(" TxDone=%d, SeqNum=0x%04x, TxOpExceeded=%d, FinalTsIdx=%d\n", 113243593Sadrian MF(txs.u.tx.status[9], AR_TxDone), 114243593Sadrian MS(txs.u.tx.status[9], AR_SeqNum), 115243593Sadrian MF(txs.u.tx.status[9], AR_TxOpExceeded), 116243593Sadrian MS(txs.u.tx.status[9], AR_FinalTxIdx)); 117243593Sadrian printf(" PowerMgmt=%d, TxTid=%d\n", 118243593Sadrian MF(txs.u.tx.status[9], AR_PowerMgmt), 119243593Sadrian MS(txs.u.tx.status[9], AR_TxTid)); 120243593Sadrian 121243593Sadrian printf("\n ------\n"); 122243593Sadrian#endif 123243593Sadrian} 124243593Sadrian 125243593Sadrianstatic void 126243593Sadrianar5416_decode_txdesc(struct if_ath_alq_payload *a) 127243593Sadrian{ 128243593Sadrian struct ar5416_desc txc; 129243593Sadrian 130243593Sadrian /* XXX assumes txs is smaller than PAYLOAD_LEN! */ 131243593Sadrian memcpy(&txc, &a->payload, sizeof(struct ar5416_desc)); 132243593Sadrian 133243593Sadrian printf("[%u] [%llu] TXD\n", 134243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 135243593Sadrian (unsigned long long) be64toh(a->hdr.threadid)); 136243593Sadrian 137243593Sadrian#if 0 138243593Sadrian printf(" link=0x%08x, data=0x%08x\n", 139243593Sadrian txc.ds_link, 140243593Sadrian txc.ds_data); 141243593Sadrian 142243593Sadrian /* ds_ctl0 */ 143243593Sadrian printf(" Frame Len=%d, VMF=%d\n", 144243593Sadrian txc.ds_ctl0 & AR_FrameLen, 145243593Sadrian MF(txc.ds_ctl0, AR_VirtMoreFrag)); 146243593Sadrian printf(" TX power0=%d, RtsEna=%d, Veol=%d, ClrDstMask=%d\n", 147243593Sadrian MS(txc.ds_ctl0, AR_XmitPower), 148243593Sadrian MF(txc.ds_ctl0, AR_RTSEnable), 149243593Sadrian MF(txc.ds_ctl0, AR_VEOL), 150243593Sadrian MF(txc.ds_ctl0, AR_ClrDestMask)); 151243593Sadrian printf(" TxIntrReq=%d, DestIdxValid=%d, CtsEnable=%d\n", 152243593Sadrian MF(txc.ds_ctl0, AR_TxIntrReq), 153243593Sadrian MF(txc.ds_ctl0, AR_DestIdxValid), 154243593Sadrian MF(txc.ds_ctl0, AR_CTSEnable)); 155243593Sadrian 156243593Sadrian /* ds_ctl1 */ 157243593Sadrian printf(" BufLen=%d, TxMore=%d, DestIdx=%d," 158243593Sadrian " FrType=0x%x\n", 159243593Sadrian txc.ds_ctl1 & AR_BufLen, 160243593Sadrian MF(txc.ds_ctl1, AR_TxMore), 161243593Sadrian MS(txc.ds_ctl1, AR_DestIdx), 162243593Sadrian MS(txc.ds_ctl1, AR_FrameType)); 163243593Sadrian printf(" NoAck=%d, InsertTs=%d, CorruptFcs=%d, ExtOnly=%d," 164243593Sadrian " ExtAndCtl=%d\n", 165243593Sadrian MF(txc.ds_ctl1, AR_NoAck), 166243593Sadrian MF(txc.ds_ctl1, AR_InsertTS), 167243593Sadrian MF(txc.ds_ctl1, AR_CorruptFCS), 168243593Sadrian MF(txc.ds_ctl1, AR_ExtOnly), 169243593Sadrian MF(txc.ds_ctl1, AR_ExtAndCtl)); 170243593Sadrian printf(" MoreAggr=%d, IsAggr=%d, MoreRifs=%d\n", 171243593Sadrian MF(txc.ds_ctl1, AR_MoreAggr), 172243593Sadrian MF(txc.ds_ctl1, AR_IsAggr), 173243593Sadrian MF(txc.ds_ctl1, AR_MoreRifs)); 174243593Sadrian 175243593Sadrian /* ds_ctl2 */ 176243593Sadrian printf(" DurUpEna=%d, Burstdur=0x%04x\n", 177243593Sadrian MF(txc.ds_ctl2, AR_DurUpdateEn), 178243593Sadrian MS(txc.ds_ctl2, AR_BurstDur)); 179243593Sadrian printf(" Try0=%d, Try1=%d, Try2=%d, Try3=%d\n", 180243593Sadrian MS(txc.ds_ctl2, AR_XmitDataTries0), 181243593Sadrian MS(txc.ds_ctl2, AR_XmitDataTries1), 182243593Sadrian MS(txc.ds_ctl2, AR_XmitDataTries2), 183243593Sadrian MS(txc.ds_ctl2, AR_XmitDataTries3)); 184243593Sadrian 185243593Sadrian /* ds_ctl3 */ 186243593Sadrian printf(" rate0=0x%02x, rate1=0x%02x, rate2=0x%02x, rate3=0x%02x\n", 187243593Sadrian MS(txc.ds_ctl3, AR_XmitRate0), 188243593Sadrian MS(txc.ds_ctl3, AR_XmitRate1), 189243593Sadrian MS(txc.ds_ctl3, AR_XmitRate2), 190243593Sadrian MS(txc.ds_ctl3, AR_XmitRate3)); 191243593Sadrian 192243593Sadrian /* ds_ctl4 */ 193243593Sadrian printf(" try 0: PktDur=%d, RTS/CTS ena=%d\n", 194243593Sadrian MS(txc.ds_ctl4, AR_PacketDur0), 195243593Sadrian MF(txc.ds_ctl4, AR_RTSCTSQual0)); 196243593Sadrian printf(" try 1: PktDur=%d, RTS/CTS ena=%d\n", 197243593Sadrian MS(txc.ds_ctl4, AR_PacketDur1), 198243593Sadrian MF(txc.ds_ctl4, AR_RTSCTSQual1)); 199243593Sadrian 200243593Sadrian /* ds_ctl5 */ 201243593Sadrian printf(" try 2: PktDur=%d, RTS/CTS ena=%d\n", 202243593Sadrian MS(txc.ds_ctl5, AR_PacketDur2), 203243593Sadrian MF(txc.ds_ctl5, AR_RTSCTSQual2)); 204243593Sadrian printf(" try 3: PktDur=%d, RTS/CTS ena=%d\n", 205243593Sadrian MS(txc.ds_ctl5, AR_PacketDur3), 206243593Sadrian MF(txc.ds_ctl5, AR_RTSCTSQual3)); 207243593Sadrian 208243593Sadrian /* ds_ctl6 */ 209243593Sadrian printf(" AggrLen=%d, PadDelim=%d, EncrType=%d\n", 210243593Sadrian MS(txc.ds_ctl6, AR_AggrLen), 211243593Sadrian MS(txc.ds_ctl6, AR_PadDelim), 212243593Sadrian MS(txc.ds_ctl6, AR_EncrType)); 213243593Sadrian 214243593Sadrian /* ds_ctl7 */ 215243593Sadrian printf(" try 0: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 216243593Sadrian MS(txc.ds_ctl7, AR_ChainSel0), 217243593Sadrian MF(txc.ds_ctl7, AR_GI0), 218243593Sadrian MF(txc.ds_ctl7, AR_2040_0), 219243593Sadrian MF(txc.ds_ctl7, AR_STBC0)); 220243593Sadrian printf(" try 1: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 221243593Sadrian MS(txc.ds_ctl7, AR_ChainSel1), 222243593Sadrian MF(txc.ds_ctl7, AR_GI1), 223243593Sadrian MF(txc.ds_ctl7, AR_2040_1), 224243593Sadrian MF(txc.ds_ctl7, AR_STBC1)); 225243593Sadrian printf(" try 2: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 226243593Sadrian MS(txc.ds_ctl7, AR_ChainSel2), 227243593Sadrian MF(txc.ds_ctl7, AR_GI2), 228243593Sadrian MF(txc.ds_ctl7, AR_2040_2), 229243593Sadrian MF(txc.ds_ctl7, AR_STBC2)); 230243593Sadrian printf(" try 3: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 231243593Sadrian MS(txc.ds_ctl7, AR_ChainSel3), 232243593Sadrian MF(txc.ds_ctl7, AR_GI3), 233243593Sadrian MF(txc.ds_ctl7, AR_2040_3), 234243593Sadrian MF(txc.ds_ctl7, AR_STBC3)); 235243593Sadrian 236243593Sadrian /* ds_ctl8 */ 237243593Sadrian printf(" try 0: ant=0x%08x\n", txc.ds_ctl8 & AR_AntCtl0); 238243593Sadrian 239243593Sadrian /* ds_ctl9 */ 240243593Sadrian printf(" try 1: TxPower=%d, ant=0x%08x\n", 241243593Sadrian MS(txc.ds_ctl9, AR_XmitPower1), 242243593Sadrian txc.ds_ctl9 & AR_AntCtl1); 243243593Sadrian 244243593Sadrian /* ds_ctl10 */ 245243593Sadrian printf(" try 2: TxPower=%d, ant=0x%08x\n", 246243593Sadrian MS(txc.ds_ctl10, AR_XmitPower2), 247243593Sadrian txc.ds_ctl10 & AR_AntCtl2); 248243593Sadrian 249243593Sadrian /* ds_ctl11 */ 250243593Sadrian printf(" try 3: TxPower=%d, ant=0x%08x\n", 251243593Sadrian MS(txc.ds_ctl11, AR_XmitPower3), 252243593Sadrian txc.ds_ctl11 & AR_AntCtl3); 253243593Sadrian 254243593Sadrian printf("\n ------ \n"); 255243593Sadrian#endif 256243593Sadrian} 257243593Sadrian 258243593Sadrianstatic void 259243593Sadrianar5416_decode_rxstatus(struct if_ath_alq_payload *a) 260243593Sadrian{ 261243593Sadrian struct ar5416_desc rxs; 262243593Sadrian static uint64_t rx_tsf = 0; 263243593Sadrian 264243593Sadrian /* XXX assumes rxs is smaller than PAYLOAD_LEN! */ 265243593Sadrian memcpy(&rxs, &a->payload, sizeof(struct ar5416_desc)); 266243593Sadrian 267243593Sadrian if (MF(rxs.ds_rxstatus8, AR_RxDone) == 0) 268243593Sadrian return; 269243593Sadrian 270243593Sadrian printf("[%u] [%llu] RXSTATUS: RxDone=%d, TS=0x%08x (delta %d)\n", 271243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 272243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 273243593Sadrian MF(rxs.ds_rxstatus8, AR_RxDone), 274243593Sadrian rxs.ds_rxstatus2, 275243593Sadrian rxs.ds_rxstatus2 - rx_tsf); 276243593Sadrian 277243593Sadrian rx_tsf = rxs.ds_rxstatus2; 278243593Sadrian 279243593Sadrian#if 0 280243593Sadrian printf(" link=0x%08x, data=0x%08x, ctl0=0x%08x, ctl2=0x%08x\n", 281243593Sadrian rxs.ds_link, 282243593Sadrian rxs.ds_data, 283243593Sadrian rxs.ds_ctl0, 284243593Sadrian rxs.ds_ctl1); 285243593Sadrian 286243593Sadrian /* status0 */ 287243593Sadrian /* 288243593Sadrian * XXX TODO: For AR9285, the chain 1 and chain 2 RSSI values 289243593Sadrian * acutally contain the RX mixer configuration 290243593Sadrian */ 291243593Sadrian printf(" RSSICtl[0]=%d, RSSICtl[1]=%d, RSSICtl[2]=%d\n", 292243593Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt00), 293243593Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt01), 294243593Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt02)); 295243593Sadrian 296243593Sadrian /* status1 */ 297243593Sadrian printf(" DataLen=%d, RxMore=%d, NumDelim=%d\n", 298243593Sadrian rxs.ds_rxstatus1 & AR_DataLen, 299243593Sadrian MF(rxs.ds_rxstatus1, AR_RxMore), 300243593Sadrian MS(rxs.ds_rxstatus1, AR_NumDelim)); 301243593Sadrian 302243593Sadrian /* status2 */ 303243593Sadrian printf(" RxTimestamp=0x%08x\n", rxs.ds_rxstatus2); 304243593Sadrian 305243593Sadrian /* status3 - RxRate however is for Owl 2.0 */ 306243593Sadrian printf(" GI=%d, 2040=%d, RxRate=0x%02x, DupFrame=%d, RxAnt=0x%08x\n", 307243593Sadrian MF(rxs.ds_rxstatus3, AR_GI), 308243593Sadrian MF(rxs.ds_rxstatus3, AR_2040), 309243593Sadrian MS(rxs.ds_rxstatus0, AR_RxRate), 310243593Sadrian MF(rxs.ds_rxstatus3, AR_DupFrame), 311243593Sadrian MS(rxs.ds_rxstatus3, AR_RxAntenna)); 312243593Sadrian 313243593Sadrian /* status4 */ 314243593Sadrian printf(" RSSIExt[0]=%d, RSSIExt[1]=%d, RSSIExt[2]=%d, RSSIComb=%d\n", 315243593Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt10), 316243593Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt11), 317243593Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt12), 318243593Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSICombined)); 319243593Sadrian 320243593Sadrian /* status5 */ 321243593Sadrian /* status6 */ 322243593Sadrian /* status7 */ 323243593Sadrian printf(" RxEvm0=0x%08x, RxEvm1=0x%08x, RxEvm2=0x%08x\n", 324243593Sadrian rxs.ds_rxstatus5, 325243593Sadrian rxs.ds_rxstatus6, 326243593Sadrian rxs.ds_rxstatus7); 327243593Sadrian 328243593Sadrian /* status8 */ 329243593Sadrian printf(" RxDone=%d, RxFrameOk=%d, CrcErr=%d, DecryptCrcErr=%d\n", 330243593Sadrian MF(rxs.ds_rxstatus8, AR_RxDone), 331243593Sadrian MF(rxs.ds_rxstatus8, AR_RxFrameOK), 332243593Sadrian MF(rxs.ds_rxstatus8, AR_CRCErr), 333243593Sadrian MF(rxs.ds_rxstatus8, AR_DecryptCRCErr)); 334243593Sadrian printf(" PhyErr=%d, MichaelErr=%d, PreDelimCRCErr=%d, KeyIdxValid=%d\n", 335243593Sadrian MF(rxs.ds_rxstatus8, AR_PHYErr), 336243593Sadrian MF(rxs.ds_rxstatus8, AR_MichaelErr), 337243593Sadrian MF(rxs.ds_rxstatus8, AR_PreDelimCRCErr), 338243593Sadrian MF(rxs.ds_rxstatus8, AR_RxKeyIdxValid)); 339243593Sadrian 340243593Sadrian /* If PHY error, print that out. Otherwise, the key index */ 341243593Sadrian if (MF(rxs.ds_rxstatus8, AR_PHYErr)) 342243593Sadrian printf(" PhyErrCode=0x%02x\n", 343243593Sadrian MS(rxs.ds_rxstatus8, AR_PHYErrCode)); 344243593Sadrian else 345243593Sadrian printf(" KeyIdx=0x%02x\n", 346243593Sadrian MS(rxs.ds_rxstatus8, AR_KeyIdx)); 347243593Sadrian 348243593Sadrian printf(" RxMoreAggr=%d, RxAggr=%d, PostDelimCRCErr=%d, HiRxChain=%d\n", 349243593Sadrian MF(rxs.ds_rxstatus8, AR_RxMoreAggr), 350243593Sadrian MF(rxs.ds_rxstatus8, AR_RxAggr), 351243593Sadrian MF(rxs.ds_rxstatus8, AR_PostDelimCRCErr), 352243593Sadrian MF(rxs.ds_rxstatus8, AR_HiRxChain)); 353243593Sadrian printf(" KeyMiss=%d\n", 354243593Sadrian MF(rxs.ds_rxstatus8, AR_KeyMiss)); 355243593Sadrian 356243593Sadrian printf("\n ------\n"); 357243593Sadrian#endif 358243593Sadrian} 359243593Sadrian 360243593Sadrianstatic void 361243593Sadrianath_tdma_beacon_state(struct if_ath_alq_payload *a) 362243593Sadrian{ 363243593Sadrian struct if_ath_alq_tdma_beacon_state t; 364243593Sadrian static uint64_t last_beacon_tx = 0; 365243593Sadrian 366243593Sadrian memcpy(&t, &a->payload, sizeof(t)); 367243593Sadrian 368243593Sadrian printf("[%u] [%llu] BEACON: RX TSF=%llu Beacon TSF=%llu (%d)\n", 369243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 370243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 371243593Sadrian (unsigned long long) be64toh(t.rx_tsf), 372243593Sadrian (unsigned long long) be64toh(t.beacon_tsf), 373243593Sadrian be64toh(t.beacon_tsf) - last_beacon_tx); 374243593Sadrian 375243593Sadrian last_beacon_tx = be64toh(t.beacon_tsf); 376243593Sadrian} 377243593Sadrian 378243593Sadrianstatic void 379243593Sadrianath_tdma_timer_config(struct if_ath_alq_payload *a) 380243593Sadrian{ 381243593Sadrian struct if_ath_alq_tdma_timer_config t; 382243593Sadrian 383243593Sadrian memcpy(&t, &a->payload, sizeof(t)); 384243593Sadrian} 385243593Sadrian 386243593Sadrianstatic void 387243593Sadrianath_tdma_slot_calc(struct if_ath_alq_payload *a) 388243593Sadrian{ 389243593Sadrian struct if_ath_alq_tdma_slot_calc t; 390243593Sadrian 391243593Sadrian memcpy(&t, &a->payload, sizeof(t)); 392243593Sadrian printf("[%u] [%llu] SLOTCALC: NEXTTBTT=%llu nextslot=%llu tsfdelta=%d avg (%d/%d)\n", 393243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 394243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 395243593Sadrian (unsigned long long) be64toh(t.nexttbtt), 396243593Sadrian (unsigned long long) be64toh(t.next_slot), 397243593Sadrian (int) be32toh(t.tsfdelta), 398243593Sadrian (int) be32toh(t.avg_plus), 399243593Sadrian (int) be32toh(t.avg_minus)); 400243593Sadrian} 401243593Sadrian 402243593Sadrianstatic void 403243593Sadrianath_tdma_tsf_adjust(struct if_ath_alq_payload *a) 404243593Sadrian{ 405243593Sadrian struct if_ath_alq_tdma_tsf_adjust t; 406243593Sadrian 407243593Sadrian memcpy(&t, &a->payload, sizeof(t)); 408243593Sadrian printf("[%u] [%llu] TSFADJUST: TSF64 was %llu, adj=%d, now %llu\n", 409243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 410243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 411243593Sadrian (unsigned long long) be64toh(t.tsf64_old), 412243593Sadrian (int) be32toh(t.tsfdelta), 413243593Sadrian (unsigned long long) be64toh(t.tsf64_new)); 414243593Sadrian} 415243593Sadrian 416243593Sadrianstatic void 417243593Sadrianath_tdma_timer_set(struct if_ath_alq_payload *a) 418243593Sadrian{ 419243593Sadrian struct if_ath_alq_tdma_timer_set t; 420243593Sadrian 421243593Sadrian memcpy(&t, &a->payload, sizeof(t)); 422243593Sadrian printf("[%u] [%llu] TIMERSET: bt_intval=%d nexttbtt=%d nextdba=%d nextswba=%d nextatim=%d flags=0x%x tdmadbaprep=%d tdmaswbaprep=%d\n", 423243593Sadrian (unsigned int) be32toh(a->hdr.tstamp), 424243593Sadrian (unsigned long long) be64toh(a->hdr.threadid), 425243593Sadrian be32toh(t.bt_intval), 426243593Sadrian be32toh(t.bt_nexttbtt), 427243593Sadrian be32toh(t.bt_nextdba), 428243593Sadrian be32toh(t.bt_nextswba), 429243593Sadrian be32toh(t.bt_nextatim), 430243593Sadrian be32toh(t.bt_flags), 431243593Sadrian be32toh(t.sc_tdmadbaprep), 432243593Sadrian be32toh(t.sc_tdmaswbaprep)); 433243593Sadrian} 434243593Sadrian 435243593Sadrianvoid 436243593Sadrianar5416_alq_payload(struct if_ath_alq_payload *a) 437243593Sadrian{ 438243593Sadrian 439243593Sadrian switch (be16toh(a->hdr.op)) { 440243593Sadrian case ATH_ALQ_EDMA_TXSTATUS: /* TXSTATUS */ 441243593Sadrian ar5416_decode_txstatus(a); 442243593Sadrian break; 443243593Sadrian case ATH_ALQ_EDMA_RXSTATUS: /* RXSTATUS */ 444243593Sadrian ar5416_decode_rxstatus(a); 445243593Sadrian break; 446243593Sadrian case ATH_ALQ_EDMA_TXDESC: /* TXDESC */ 447243593Sadrian ar5416_decode_txdesc(a); 448243593Sadrian break; 449243593Sadrian case ATH_ALQ_TDMA_BEACON_STATE: 450243593Sadrian ath_tdma_beacon_state(a); 451243593Sadrian break; 452243593Sadrian case ATH_ALQ_TDMA_TIMER_CONFIG: 453243593Sadrian ath_tdma_timer_config(a); 454243593Sadrian break; 455243593Sadrian case ATH_ALQ_TDMA_SLOT_CALC: 456243593Sadrian ath_tdma_slot_calc(a); 457243593Sadrian break; 458243593Sadrian case ATH_ALQ_TDMA_TSF_ADJUST: 459243593Sadrian ath_tdma_tsf_adjust(a); 460243593Sadrian break; 461243593Sadrian case ATH_ALQ_TDMA_TIMER_SET: 462243593Sadrian ath_tdma_timer_set(a); 463243593Sadrian break; 464243593Sadrian default: 465243593Sadrian printf("[%d] [%lld] op: %d; len %d\n", 466243593Sadrian be32toh(a->hdr.tstamp), 467243593Sadrian be64toh(a->hdr.threadid), 468243593Sadrian be16toh(a->hdr.op), be16toh(a->hdr.len)); 469243593Sadrian } 470243593Sadrian} 471