ar5416_ds.c revision 245560
1243166Sadrian/* 2243166Sadrian * Copyright (c) 2012 Adrian Chadd <adrian@FreeBSD.org> 3243166Sadrian * All Rights Reserved. 4243166Sadrian * 5243166Sadrian * Permission to use, copy, modify, and/or distribute this software for any 6243166Sadrian * purpose with or without fee is hereby granted, provided that the above 7243166Sadrian * copyright notice and this permission notice appear in all copies. 8243166Sadrian * 9243166Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10243166Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11243166Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12243166Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13243166Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14243166Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15243166Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16243166Sadrian */ 17243166Sadrian 18243166Sadrian#include <sys/cdefs.h> 19243166Sadrian__FBSDID("$FreeBSD: head/tools/tools/ath/athalq/ar5416_ds.c 245560 2013-01-17 17:12:44Z adrian $"); 20243166Sadrian 21243166Sadrian#include <stdio.h> 22243166Sadrian#include <stdlib.h> 23243166Sadrian#include <unistd.h> 24243166Sadrian#include <fcntl.h> 25243166Sadrian#include <errno.h> 26243166Sadrian#include <string.h> 27243166Sadrian 28243166Sadrian#include <sys/types.h> 29243166Sadrian#include <sys/alq.h> 30243166Sadrian#include <sys/endian.h> 31243166Sadrian 32243166Sadrian#include <dev/ath/if_ath_alq.h> 33243166Sadrian#include <dev/ath/ath_hal/ar5416/ar5416desc.h> 34243166Sadrian 35243166Sadrian#include "ar5416_ds.h" 36243166Sadrian 37243166Sadrian#define MS(_v, _f) ( ((_v) & (_f)) >> _f##_S ) 38243166Sadrian#define MF(_v, _f) ( !! ((_v) & (_f))) 39243166Sadrian 40243166Sadrianstatic void 41243166Sadrianar5416_decode_txstatus(struct if_ath_alq_payload *a) 42243166Sadrian{ 43243166Sadrian struct ar5416_desc txs; 44243166Sadrian 45243166Sadrian /* XXX assumes txs is smaller than PAYLOAD_LEN! */ 46243166Sadrian memcpy(&txs, &a->payload, sizeof(struct ar5416_desc)); 47243166Sadrian 48245560Sadrian printf("[%u] [%llu] TXSTATUS: TxDone=%d, TS=0x%08x\n", 49243166Sadrian (unsigned int) be32toh(a->hdr.tstamp), 50245560Sadrian (unsigned long long) be64toh(a->hdr.threadid), 51245560Sadrian MF(txs.u.tx.status[9], AR_TxDone), 52245560Sadrian txs.u.tx.status[2]); 53243166Sadrian 54243166Sadrian /* ds_txstatus0 */ 55243166Sadrian printf(" RX RSSI 0 [%d %d %d]\n", 56243166Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt00), 57243166Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt01), 58243166Sadrian MS(txs.u.tx.status[0], AR_TxRSSIAnt02)); 59243166Sadrian printf(" BA Valid=%d\n", 60243166Sadrian MF(txs.u.tx.status[0], AR_TxBaStatus)); 61243166Sadrian 62243166Sadrian /* ds_txstatus1 */ 63243166Sadrian printf(" Frmok=%d, xretries=%d, fifounderrun=%d, filt=%d\n", 64243166Sadrian MF(txs.u.tx.status[1], AR_FrmXmitOK), 65243166Sadrian MF(txs.u.tx.status[1], AR_ExcessiveRetries), 66243166Sadrian MF(txs.u.tx.status[1], AR_FIFOUnderrun), 67243166Sadrian MF(txs.u.tx.status[1], AR_Filtered)); 68243166Sadrian printf(" DelimUnderrun=%d, DataUnderun=%d, DescCfgErr=%d," 69243166Sadrian " TxTimerExceeded=%d\n", 70243166Sadrian MF(txs.u.tx.status[1], AR_TxDelimUnderrun), 71243166Sadrian MF(txs.u.tx.status[1], AR_TxDataUnderrun), 72243166Sadrian MF(txs.u.tx.status[1], AR_DescCfgErr), 73243166Sadrian MF(txs.u.tx.status[1], AR_TxTimerExpired)); 74243166Sadrian 75243166Sadrian printf(" RTScnt=%d, FailCnt=%d, VRetryCnt=%d\n", 76243166Sadrian MS(txs.u.tx.status[1], AR_RTSFailCnt), 77243166Sadrian MS(txs.u.tx.status[1], AR_DataFailCnt), 78243166Sadrian MS(txs.u.tx.status[1], AR_VirtRetryCnt)); 79243166Sadrian 80243166Sadrian /* ds_txstatus2 */ 81243166Sadrian printf(" TxTimestamp=0x%08x\n", txs.u.tx.status[2]); 82243166Sadrian 83243166Sadrian /* ds_txstatus3 */ 84243166Sadrian /* ds_txstatus4 */ 85243166Sadrian printf(" BALow=0x%08x\n", txs.u.tx.status[3]); 86243166Sadrian printf(" BAHigh=0x%08x\n", txs.u.tx.status[4]); 87243166Sadrian 88243166Sadrian /* ds_txstatus5 */ 89243166Sadrian printf(" RX RSSI 1 [%d %d %d] Comb=%d\n", 90243166Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt10), 91243166Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt11), 92243166Sadrian MS(txs.u.tx.status[5], AR_TxRSSIAnt12), 93243166Sadrian MS(txs.u.tx.status[5], AR_TxRSSICombined)); 94243166Sadrian 95243166Sadrian /* ds_txstatus6 */ 96243166Sadrian /* ds_txstatus7 */ 97243166Sadrian /* ds_txstatus8 */ 98243166Sadrian printf(" TxEVM[0]=0x%08x, TxEVM[1]=0x%08x, TxEVM[2]=0x%08x\n", 99243166Sadrian txs.u.tx.status[6], 100243166Sadrian txs.u.tx.status[7], 101243166Sadrian txs.u.tx.status[8]); 102243166Sadrian 103243166Sadrian /* ds_txstatus9 */ 104243166Sadrian printf(" TxDone=%d, SeqNum=0x%04x, TxOpExceeded=%d, FinalTsIdx=%d\n", 105243166Sadrian MF(txs.u.tx.status[9], AR_TxDone), 106243166Sadrian MS(txs.u.tx.status[9], AR_SeqNum), 107243166Sadrian MF(txs.u.tx.status[9], AR_TxOpExceeded), 108243166Sadrian MS(txs.u.tx.status[9], AR_FinalTxIdx)); 109243166Sadrian printf(" PowerMgmt=%d, TxTid=%d\n", 110243166Sadrian MF(txs.u.tx.status[9], AR_PowerMgmt), 111243166Sadrian MS(txs.u.tx.status[9], AR_TxTid)); 112243166Sadrian 113243166Sadrian printf("\n ------\n"); 114243166Sadrian} 115243166Sadrian 116243166Sadrianstatic void 117243166Sadrianar5416_decode_txdesc(struct if_ath_alq_payload *a) 118243166Sadrian{ 119243166Sadrian struct ar5416_desc txc; 120243166Sadrian 121243166Sadrian /* XXX assumes txs is smaller than PAYLOAD_LEN! */ 122243166Sadrian memcpy(&txc, &a->payload, sizeof(struct ar5416_desc)); 123243166Sadrian 124243166Sadrian printf("[%u] [%llu] TXD\n", 125243166Sadrian (unsigned int) be32toh(a->hdr.tstamp), 126243166Sadrian (unsigned long long) be64toh(a->hdr.threadid)); 127243166Sadrian 128243166Sadrian printf(" link=0x%08x, data=0x%08x\n", 129243166Sadrian txc.ds_link, 130243166Sadrian txc.ds_data); 131243166Sadrian 132243166Sadrian /* ds_ctl0 */ 133243166Sadrian printf(" Frame Len=%d, VMF=%d\n", 134243166Sadrian txc.ds_ctl0 & AR_FrameLen, 135243166Sadrian MF(txc.ds_ctl0, AR_VirtMoreFrag)); 136243166Sadrian printf(" TX power0=%d, RtsEna=%d, Veol=%d, ClrDstMask=%d\n", 137243166Sadrian MS(txc.ds_ctl0, AR_XmitPower), 138243166Sadrian MF(txc.ds_ctl0, AR_RTSEnable), 139243166Sadrian MF(txc.ds_ctl0, AR_VEOL), 140243166Sadrian MF(txc.ds_ctl0, AR_ClrDestMask)); 141243166Sadrian printf(" TxIntrReq=%d, DestIdxValid=%d, CtsEnable=%d\n", 142243166Sadrian MF(txc.ds_ctl0, AR_TxIntrReq), 143243166Sadrian MF(txc.ds_ctl0, AR_DestIdxValid), 144243166Sadrian MF(txc.ds_ctl0, AR_CTSEnable)); 145243166Sadrian 146243166Sadrian /* ds_ctl1 */ 147243166Sadrian printf(" BufLen=%d, TxMore=%d, DestIdx=%d," 148243166Sadrian " FrType=0x%x\n", 149243166Sadrian txc.ds_ctl1 & AR_BufLen, 150243166Sadrian MF(txc.ds_ctl1, AR_TxMore), 151243166Sadrian MS(txc.ds_ctl1, AR_DestIdx), 152243166Sadrian MS(txc.ds_ctl1, AR_FrameType)); 153243166Sadrian printf(" NoAck=%d, InsertTs=%d, CorruptFcs=%d, ExtOnly=%d," 154243166Sadrian " ExtAndCtl=%d\n", 155243166Sadrian MF(txc.ds_ctl1, AR_NoAck), 156243166Sadrian MF(txc.ds_ctl1, AR_InsertTS), 157243166Sadrian MF(txc.ds_ctl1, AR_CorruptFCS), 158243166Sadrian MF(txc.ds_ctl1, AR_ExtOnly), 159243166Sadrian MF(txc.ds_ctl1, AR_ExtAndCtl)); 160243166Sadrian printf(" MoreAggr=%d, IsAggr=%d, MoreRifs=%d\n", 161243166Sadrian MF(txc.ds_ctl1, AR_MoreAggr), 162243166Sadrian MF(txc.ds_ctl1, AR_IsAggr), 163243166Sadrian MF(txc.ds_ctl1, AR_MoreRifs)); 164243166Sadrian 165243166Sadrian /* ds_ctl2 */ 166243166Sadrian printf(" DurUpEna=%d, Burstdur=0x%04x\n", 167243166Sadrian MF(txc.ds_ctl2, AR_DurUpdateEn), 168243166Sadrian MS(txc.ds_ctl2, AR_BurstDur)); 169243166Sadrian printf(" Try0=%d, Try1=%d, Try2=%d, Try3=%d\n", 170243166Sadrian MS(txc.ds_ctl2, AR_XmitDataTries0), 171243166Sadrian MS(txc.ds_ctl2, AR_XmitDataTries1), 172243166Sadrian MS(txc.ds_ctl2, AR_XmitDataTries2), 173243166Sadrian MS(txc.ds_ctl2, AR_XmitDataTries3)); 174243166Sadrian 175243166Sadrian /* ds_ctl3 */ 176243166Sadrian printf(" rate0=0x%02x, rate1=0x%02x, rate2=0x%02x, rate3=0x%02x\n", 177243166Sadrian MS(txc.ds_ctl3, AR_XmitRate0), 178243166Sadrian MS(txc.ds_ctl3, AR_XmitRate1), 179243166Sadrian MS(txc.ds_ctl3, AR_XmitRate2), 180243166Sadrian MS(txc.ds_ctl3, AR_XmitRate3)); 181243166Sadrian 182243166Sadrian /* ds_ctl4 */ 183243166Sadrian printf(" try 0: PktDur=%d, RTS/CTS ena=%d\n", 184243166Sadrian MS(txc.ds_ctl4, AR_PacketDur0), 185243166Sadrian MF(txc.ds_ctl4, AR_RTSCTSQual0)); 186243166Sadrian printf(" try 1: PktDur=%d, RTS/CTS ena=%d\n", 187243166Sadrian MS(txc.ds_ctl4, AR_PacketDur1), 188243166Sadrian MF(txc.ds_ctl4, AR_RTSCTSQual1)); 189243166Sadrian 190243166Sadrian /* ds_ctl5 */ 191243166Sadrian printf(" try 2: PktDur=%d, RTS/CTS ena=%d\n", 192243166Sadrian MS(txc.ds_ctl5, AR_PacketDur2), 193243166Sadrian MF(txc.ds_ctl5, AR_RTSCTSQual2)); 194243166Sadrian printf(" try 3: PktDur=%d, RTS/CTS ena=%d\n", 195243166Sadrian MS(txc.ds_ctl5, AR_PacketDur3), 196243166Sadrian MF(txc.ds_ctl5, AR_RTSCTSQual3)); 197243166Sadrian 198243166Sadrian /* ds_ctl6 */ 199243166Sadrian printf(" AggrLen=%d, PadDelim=%d, EncrType=%d\n", 200243166Sadrian MS(txc.ds_ctl6, AR_AggrLen), 201243166Sadrian MS(txc.ds_ctl6, AR_PadDelim), 202243166Sadrian MS(txc.ds_ctl6, AR_EncrType)); 203243166Sadrian 204243166Sadrian /* ds_ctl7 */ 205243166Sadrian printf(" try 0: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 206243166Sadrian MS(txc.ds_ctl7, AR_ChainSel0), 207243166Sadrian MF(txc.ds_ctl7, AR_GI0), 208243166Sadrian MF(txc.ds_ctl7, AR_2040_0), 209243166Sadrian MF(txc.ds_ctl7, AR_STBC0)); 210243166Sadrian printf(" try 1: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 211243166Sadrian MS(txc.ds_ctl7, AR_ChainSel1), 212243166Sadrian MF(txc.ds_ctl7, AR_GI1), 213243166Sadrian MF(txc.ds_ctl7, AR_2040_1), 214243166Sadrian MF(txc.ds_ctl7, AR_STBC1)); 215243166Sadrian printf(" try 2: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 216243166Sadrian MS(txc.ds_ctl7, AR_ChainSel2), 217243166Sadrian MF(txc.ds_ctl7, AR_GI2), 218243166Sadrian MF(txc.ds_ctl7, AR_2040_2), 219243166Sadrian MF(txc.ds_ctl7, AR_STBC2)); 220243166Sadrian printf(" try 3: chainMask=0x%x, GI=%d, 2040=%d, STBC=%d\n", 221243166Sadrian MS(txc.ds_ctl7, AR_ChainSel3), 222243166Sadrian MF(txc.ds_ctl7, AR_GI3), 223243166Sadrian MF(txc.ds_ctl7, AR_2040_3), 224243166Sadrian MF(txc.ds_ctl7, AR_STBC3)); 225243166Sadrian 226243166Sadrian /* ds_ctl8 */ 227243166Sadrian printf(" try 0: ant=0x%08x\n", txc.ds_ctl8 & AR_AntCtl0); 228243166Sadrian 229243166Sadrian /* ds_ctl9 */ 230243166Sadrian printf(" try 1: TxPower=%d, ant=0x%08x\n", 231243166Sadrian MS(txc.ds_ctl9, AR_XmitPower1), 232243166Sadrian txc.ds_ctl9 & AR_AntCtl1); 233243166Sadrian 234243166Sadrian /* ds_ctl10 */ 235243166Sadrian printf(" try 2: TxPower=%d, ant=0x%08x\n", 236243166Sadrian MS(txc.ds_ctl10, AR_XmitPower2), 237243166Sadrian txc.ds_ctl10 & AR_AntCtl2); 238243166Sadrian 239243166Sadrian /* ds_ctl11 */ 240243166Sadrian printf(" try 3: TxPower=%d, ant=0x%08x\n", 241243166Sadrian MS(txc.ds_ctl11, AR_XmitPower3), 242243166Sadrian txc.ds_ctl11 & AR_AntCtl3); 243243166Sadrian 244243166Sadrian printf("\n ------ \n"); 245243166Sadrian} 246243166Sadrian 247243166Sadrianstatic void 248243166Sadrianar5416_decode_rxstatus(struct if_ath_alq_payload *a) 249243166Sadrian{ 250243166Sadrian struct ar5416_desc rxs; 251243166Sadrian 252243166Sadrian /* XXX assumes rxs is smaller than PAYLOAD_LEN! */ 253243166Sadrian memcpy(&rxs, &a->payload, sizeof(struct ar5416_desc)); 254243166Sadrian 255245560Sadrian printf("[%u] [%llu] RXSTATUS: RxDone=%d, TS=0x%08x\n", 256243166Sadrian (unsigned int) be32toh(a->hdr.tstamp), 257245560Sadrian (unsigned long long) be64toh(a->hdr.threadid), 258245560Sadrian MF(rxs.ds_rxstatus8, AR_RxDone), 259245560Sadrian rxs.ds_rxstatus2); 260243166Sadrian 261243166Sadrian printf(" link=0x%08x, data=0x%08x, ctl0=0x%08x, ctl2=0x%08x\n", 262243166Sadrian rxs.ds_link, 263243166Sadrian rxs.ds_data, 264243166Sadrian rxs.ds_ctl0, 265243166Sadrian rxs.ds_ctl1); 266243166Sadrian 267243166Sadrian /* status0 */ 268243166Sadrian /* 269243166Sadrian * XXX TODO: For AR9285, the chain 1 and chain 2 RSSI values 270243166Sadrian * acutally contain the RX mixer configuration 271243166Sadrian */ 272243166Sadrian printf(" RSSICtl[0]=%d, RSSICtl[1]=%d, RSSICtl[2]=%d\n", 273243166Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt00), 274243166Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt01), 275243166Sadrian MS(rxs.ds_rxstatus0, AR_RxRSSIAnt02)); 276243166Sadrian 277243166Sadrian /* status1 */ 278243166Sadrian printf(" DataLen=%d, RxMore=%d, NumDelim=%d\n", 279243166Sadrian rxs.ds_rxstatus1 & AR_DataLen, 280243166Sadrian MF(rxs.ds_rxstatus1, AR_RxMore), 281243166Sadrian MS(rxs.ds_rxstatus1, AR_NumDelim)); 282243166Sadrian 283243166Sadrian /* status2 */ 284243166Sadrian printf(" RxTimestamp=0x%08x\n", rxs.ds_rxstatus2); 285243166Sadrian 286243166Sadrian /* status3 - RxRate however is for Owl 2.0 */ 287243166Sadrian printf(" GI=%d, 2040=%d, RxRate=0x%02x, DupFrame=%d, RxAnt=0x%08x\n", 288243166Sadrian MF(rxs.ds_rxstatus3, AR_GI), 289243166Sadrian MF(rxs.ds_rxstatus3, AR_2040), 290243166Sadrian MS(rxs.ds_rxstatus0, AR_RxRate), 291243166Sadrian MF(rxs.ds_rxstatus3, AR_DupFrame), 292243166Sadrian MS(rxs.ds_rxstatus3, AR_RxAntenna)); 293243166Sadrian 294243166Sadrian /* status4 */ 295243166Sadrian printf(" RSSIExt[0]=%d, RSSIExt[1]=%d, RSSIExt[2]=%d, RSSIComb=%d\n", 296243166Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt10), 297243166Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt11), 298243166Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSIAnt12), 299243166Sadrian MS(rxs.ds_rxstatus4, AR_RxRSSICombined)); 300243166Sadrian 301243166Sadrian /* status5 */ 302243166Sadrian /* status6 */ 303243166Sadrian /* status7 */ 304243166Sadrian printf(" RxEvm0=0x%08x, RxEvm1=0x%08x, RxEvm2=0x%08x\n", 305243166Sadrian rxs.ds_rxstatus5, 306243166Sadrian rxs.ds_rxstatus6, 307243166Sadrian rxs.ds_rxstatus7); 308243166Sadrian 309243166Sadrian /* status8 */ 310243166Sadrian printf(" RxDone=%d, RxFrameOk=%d, CrcErr=%d, DecryptCrcErr=%d\n", 311243166Sadrian MF(rxs.ds_rxstatus8, AR_RxDone), 312243166Sadrian MF(rxs.ds_rxstatus8, AR_RxFrameOK), 313243166Sadrian MF(rxs.ds_rxstatus8, AR_CRCErr), 314243166Sadrian MF(rxs.ds_rxstatus8, AR_DecryptCRCErr)); 315243166Sadrian printf(" PhyErr=%d, MichaelErr=%d, PreDelimCRCErr=%d, KeyIdxValid=%d\n", 316243166Sadrian MF(rxs.ds_rxstatus8, AR_PHYErr), 317243166Sadrian MF(rxs.ds_rxstatus8, AR_MichaelErr), 318243166Sadrian MF(rxs.ds_rxstatus8, AR_PreDelimCRCErr), 319243166Sadrian MF(rxs.ds_rxstatus8, AR_RxKeyIdxValid)); 320243166Sadrian 321243166Sadrian /* If PHY error, print that out. Otherwise, the key index */ 322243166Sadrian if (MF(rxs.ds_rxstatus8, AR_PHYErr)) 323243166Sadrian printf(" PhyErrCode=0x%02x\n", 324243166Sadrian MS(rxs.ds_rxstatus8, AR_PHYErrCode)); 325243166Sadrian else 326243166Sadrian printf(" KeyIdx=0x%02x\n", 327243166Sadrian MS(rxs.ds_rxstatus8, AR_KeyIdx)); 328243166Sadrian 329243166Sadrian printf(" RxMoreAggr=%d, RxAggr=%d, PostDelimCRCErr=%d, HiRxChain=%d\n", 330243166Sadrian MF(rxs.ds_rxstatus8, AR_RxMoreAggr), 331243166Sadrian MF(rxs.ds_rxstatus8, AR_RxAggr), 332243166Sadrian MF(rxs.ds_rxstatus8, AR_PostDelimCRCErr), 333243166Sadrian MF(rxs.ds_rxstatus8, AR_HiRxChain)); 334243166Sadrian printf(" KeyMiss=%d\n", 335243166Sadrian MF(rxs.ds_rxstatus8, AR_KeyMiss)); 336243166Sadrian 337243166Sadrian printf("\n ------\n"); 338243166Sadrian} 339243166Sadrian 340243166Sadrianvoid 341243166Sadrianar5416_alq_payload(struct if_ath_alq_payload *a) 342243166Sadrian{ 343243166Sadrian 344243166Sadrian switch (be16toh(a->hdr.op)) { 345243166Sadrian case ATH_ALQ_EDMA_TXSTATUS: /* TXSTATUS */ 346243166Sadrian ar5416_decode_txstatus(a); 347243166Sadrian break; 348243166Sadrian case ATH_ALQ_EDMA_RXSTATUS: /* RXSTATUS */ 349243166Sadrian ar5416_decode_rxstatus(a); 350243166Sadrian break; 351243166Sadrian case ATH_ALQ_EDMA_TXDESC: /* TXDESC */ 352243166Sadrian ar5416_decode_txdesc(a); 353243166Sadrian break; 354243166Sadrian default: 355243166Sadrian printf("[%d] [%lld] op: %d; len %d\n", 356243166Sadrian be32toh(a->hdr.tstamp), 357243166Sadrian be64toh(a->hdr.threadid), 358243166Sadrian be16toh(a->hdr.op), be16toh(a->hdr.len)); 359243166Sadrian } 360243166Sadrian} 361