1217770Sadrian 2217770Sadrian/* 3217770Sadrian * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd. 4217770Sadrian * 5217770Sadrian * Redistribution and use in source and binary forms, with or without 6217770Sadrian * modification, are permitted provided that the following conditions 7217770Sadrian * are met: 8217770Sadrian * 1. Redistributions of source code must retain the above copyright 9217770Sadrian * notice, this list of conditions and the following disclaimer. 10217770Sadrian * 2. Redistributions in binary form must reproduce the above copyright 11217770Sadrian * notice, this list of conditions and the following disclaimer in the 12217770Sadrian * documentation and/or other materials provided with the distribution. 13217770Sadrian * 14217770Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15217770Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16217770Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17217770Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18217770Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19217770Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20217770Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21217770Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22217770Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23217770Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24217770Sadrian * SUCH DAMAGE. 25217770Sadrian * 26217770Sadrian * $FreeBSD: releng/10.2/tools/tools/ath/ath_ee_v4k_print/v4k.c 221691 2011-05-09 10:39:15Z adrian $ 27217770Sadrian */ 28217770Sadrian 29217770Sadrian#include <stdio.h> 30217770Sadrian#include <stdlib.h> 31217770Sadrian#include <unistd.h> 32217770Sadrian#include <string.h> 33217770Sadrian#include <sys/types.h> 34217770Sadrian#include <err.h> 35217770Sadrian 36217770Sadriantypedef enum { 37217770Sadrian AH_FALSE = 0, /* NB: lots of code assumes false is zero */ 38217770Sadrian AH_TRUE = 1, 39217770Sadrian} HAL_BOOL; 40217770Sadrian 41217770Sadriantypedef enum { 42217770Sadrian HAL_OK = 0, /* No error */ 43217770Sadrian} HAL_STATUS; 44217770Sadrian 45217770Sadrianstruct ath_hal; 46217770Sadrian 47217770Sadrian#include "ah_eeprom_v4k.h" 48217770Sadrian 49217770Sadrianvoid 50217770Sadrianeeprom_v4k_base_print(uint16_t *buf) 51217770Sadrian{ 52217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 53217770Sadrian BASE_EEP4K_HEADER *eh = &eep->ee_base.baseEepHeader; 54217770Sadrian 55217770Sadrian printf("| Version: 0x%.4x | Length: 0x%.4x | Checksum: 0x%.4x ", 56217770Sadrian eh->version, eh->length, eh->checksum); 57219420Sadrian printf("| CapFlags: 0x%.2x | eepMisc: 0x%.2x | RegDomain: 0x%.4x 0x%.4x | \n", 58217770Sadrian eh->opCapFlags, eh->eepMisc, eh->regDmn[0], eh->regDmn[1]); 59217770Sadrian printf("| MAC: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ", 60217770Sadrian eh->macAddr[0], eh->macAddr[1], eh->macAddr[2], 61217770Sadrian eh->macAddr[3], eh->macAddr[4], eh->macAddr[5]); 62217770Sadrian printf("| RxMask: 0x%.2x | TxMask: 0x%.2x | RfSilent: 0x%.4x | btOptions: 0x%.4x |\n", 63217770Sadrian eh->rxMask, eh->txMask, eh->rfSilent, eh->blueToothOptions); 64217770Sadrian printf("| DeviceCap: 0x%.4x | binBuildNumber: %.8x | deviceType: 0x%.2x | txGainType 0x%.2x |\n", 65217770Sadrian eh->deviceCap, eh->binBuildNumber, eh->deviceType, eh->txGainType); 66217770Sadrian} 67217770Sadrian 68217770Sadrianvoid 69217770Sadrianeeprom_v4k_custdata_print(uint16_t *buf) 70217770Sadrian{ 71217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 72217770Sadrian uint8_t *custdata = (uint8_t *) &eep->ee_base.custData; 73217770Sadrian int i; 74217770Sadrian 75217770Sadrian printf("\n| Custdata: |\n"); 76217770Sadrian for (i = 0; i < 20; i++) { 77217770Sadrian printf("%s0x%.2x %s", 78217770Sadrian i % 16 == 0 ? "| " : "", 79217770Sadrian custdata[i], 80217770Sadrian i % 16 == 15 ? "|\n" : ""); 81217770Sadrian } 82217770Sadrian printf("\n"); 83217770Sadrian} 84217770Sadrian 85217770Sadrianvoid 86217770Sadrianeeprom_v4k_modal_print(uint16_t *buf) 87217770Sadrian{ 88217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 89217770Sadrian MODAL_EEP4K_HEADER *mh = &eep->ee_base.modalHeader; 90217770Sadrian int i; 91217770Sadrian 92221691Sadrian printf("| antCtrlCommon: 0x%.8x |\n", mh->antCtrlCommon); 93217770Sadrian printf("| switchSettling: 0x%.2x |\n", mh->switchSettling); 94217770Sadrian printf("| adcDesiredSize: %d |\n| pgaDesiredSize: %.2f dBm |\n", 95217770Sadrian mh->adcDesiredSize, (float) mh->pgaDesiredSize / 2.0); 96217770Sadrian 97217770Sadrian printf("| antCtrlChain: 0:0x%.4x |\n", mh->antCtrlChain[0]); 98217770Sadrian printf("| antennaGainCh: 0:0x%.2x |\n", mh->antennaGainCh[0]); 99217770Sadrian printf("| txRxAttenCh: 0:0x%.2x |\n", mh->txRxAttenCh[0]); 100217770Sadrian printf("| rxTxMarginCh: 0:0x%.2x |\n", mh->rxTxMarginCh[0]); 101217770Sadrian printf("| noiseFloorThresCh: 0:0x%.2x |\n", mh->noiseFloorThreshCh[0]); 102217770Sadrian printf("| xlnaGainCh: 0:0x%.2x |\n", mh->xlnaGainCh[0]); 103217770Sadrian printf("| iqCalICh: 0:0x%.2x |\n", mh->iqCalICh[0]); 104217770Sadrian printf("| iqCalQCh: 0:0x%.2x |\n", mh->iqCalQCh[0]); 105217770Sadrian printf("| bswAtten: 0:0x%.2x |\n", mh->bswAtten[0]); 106217770Sadrian printf("| bswMargin: 0:0x%.2x |\n", mh->bswMargin[0]); 107217770Sadrian printf("| xatten2Db: 0:0x%.2x |\n", mh->xatten2Db[0]); 108217770Sadrian printf("| xatten2Margin: 0:0x%.2x |\n", mh->xatten2Margin[0]); 109217770Sadrian 110217770Sadrian printf("| txEndToXpaOff: 0x%.2x | txEndToRxOn: 0x%.2x | txFrameToXpaOn: 0x%.2x |\n", 111217770Sadrian mh->txEndToXpaOff, mh->txEndToRxOn, mh->txFrameToXpaOn); 112217770Sadrian printf("| thres62: 0x%.2x\n", mh->thresh62); 113217770Sadrian printf("| xpdGain: 0x%.2x | xpd: 0x%.2x |\n", mh->xpdGain, mh->xpd); 114217810Sadrian 115217810Sadrian printf("| pdGainOverlap: 0x%.2x xpaBiasLvl: 0x%.2x |\n", mh->pdGainOverlap, mh->xpaBiasLvl); 116217770Sadrian printf("| txFrameToDataStart: 0x%.2x | txFrameToPaOn: 0x%.2x |\n", mh->txFrameToDataStart, mh->txFrameToPaOn); 117217770Sadrian printf("| ht40PowerIncForPdadc: 0x%.2x |\n", mh->ht40PowerIncForPdadc); 118217770Sadrian printf("| swSettleHt40: 0x%.2x |\n", mh->swSettleHt40); 119217770Sadrian 120217810Sadrian printf("| ob_0: 0x%.2x | ob_1: 0x%.2x | ob_2: 0x%.2x | ob_3: 0x%.2x |\n", 121217810Sadrian mh->ob_0, mh->ob_1, mh->ob_2, mh->ob_3); 122217810Sadrian printf("| db_1_0: 0x%.2x | db_1_1: 0x%.2x | db_1_2: 0x%.2x | db_1_3: 0x%.2x db_1_4: 0x%.2x|\n", 123217810Sadrian mh->db1_0, mh->db1_1, mh->db1_2, mh->db1_3, mh->db1_4); 124217810Sadrian printf("| db_1_0: 0x%.2x | db_1_1: 0x%.2x | db_1_2: 0x%.2x | db_1_3: 0x%.2x db_1_4: 0x%.2x|\n", 125217810Sadrian mh->db2_0, mh->db2_1, mh->db2_2, mh->db2_3, mh->db2_4); 126217810Sadrian 127217810Sadrian printf("| antdiv_ctl1: 0x%.2x antdiv_ctl2: 0x%.2x |\n", mh->antdiv_ctl1, mh->antdiv_ctl2); 128217810Sadrian 129217810Sadrian printf("| Modal Version: %.2x |\n", mh->version); 130217810Sadrian 131217810Sadrian printf("| futureModal: 0x%.2x 0x%.2x 0x%.2x 0x%.2x |\n", 132217810Sadrian mh->futureModal[0], 133217810Sadrian mh->futureModal[1], 134217810Sadrian mh->futureModal[2], 135217810Sadrian mh->futureModal[3] 136217810Sadrian ); 137217810Sadrian 138217770Sadrian /* and now, spur channels */ 139217770Sadrian for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { 140217770Sadrian printf("| Spur %d: spurChan: 0x%.4x spurRangeLow: 0x%.2x spurRangeHigh: 0x%.2x |\n", 141217770Sadrian i, mh->spurChans[i].spurChan, 142217770Sadrian (int) mh->spurChans[i].spurRangeLow, 143217770Sadrian (int) mh->spurChans[i].spurRangeHigh); 144217770Sadrian } 145217770Sadrian} 146217770Sadrian 147217770Sadrianstatic void 148217770Sadrianeeprom_v4k_print_caldata_perfreq(CAL_DATA_PER_FREQ_4K *f) 149217770Sadrian{ 150217770Sadrian int i, j; 151217770Sadrian 152217770Sadrian for (i = 0; i < AR5416_4K_NUM_PD_GAINS; i++) { 153217770Sadrian printf(" Gain %d: pwr dBm/vpd: ", i); 154217770Sadrian for (j = 0; j < AR5416_PD_GAIN_ICEPTS; j++) { 155217770Sadrian /* These are stored in 0.25dBm increments */ 156217770Sadrian /* XXX is this assumption correct for ar9285? */ 157217770Sadrian /* XXX shouldn't we care about the power table offset, if there is one? */ 158217770Sadrian printf("%d:(%.2f/%d) ", j, (float) f->pwrPdg[i][j] / 4.00, 159217770Sadrian f->vpdPdg[i][j]); 160217770Sadrian } 161217770Sadrian printf("\n"); 162217770Sadrian } 163217770Sadrian} 164217770Sadrian 165217770Sadrianvoid 166217770Sadrianeeprom_v4k_calfreqpiers_print(uint16_t *buf) 167217770Sadrian{ 168217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 169217770Sadrian int i, n; 170217770Sadrian 171217770Sadrian /* 2ghz cal piers */ 172217770Sadrian printf("calFreqPier2G: "); 173217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_CAL_PIERS; i++) { 174217770Sadrian printf(" 0x%.2x ", eep->ee_base.calFreqPier2G[i]); 175217770Sadrian } 176217770Sadrian printf("|\n"); 177217770Sadrian 178217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_CAL_PIERS; i++) { 179217770Sadrian if (eep->ee_base.calFreqPier2G[i] == 0xff) 180217770Sadrian continue; 181217770Sadrian printf("2Ghz Cal Pier %d\n", i); 182217770Sadrian for (n = 0; n < AR5416_4K_MAX_CHAINS; n++) { 183217770Sadrian printf(" Chain %d:\n", n); 184217770Sadrian eeprom_v4k_print_caldata_perfreq(&eep->ee_base.calPierData2G[n][i]); 185217770Sadrian } 186217770Sadrian } 187217770Sadrian 188217770Sadrian printf("\n"); 189217770Sadrian} 190217770Sadrian 191217770Sadrian/* XXX these should just reference the v14 print routines */ 192217770Sadrianstatic void 193217770Sadrianeeprom_v14_target_legacy_print(CAL_TARGET_POWER_LEG *l) 194217770Sadrian{ 195217770Sadrian int i; 196217770Sadrian if (l->bChannel == 0xff) 197217770Sadrian return; 198217770Sadrian printf(" bChannel: %d;", l->bChannel); 199217770Sadrian for (i = 0; i < 4; i++) { 200217770Sadrian printf(" %.2f", (float) l->tPow2x[i] / 2.0); 201217770Sadrian } 202217770Sadrian printf(" (dBm)\n"); 203217770Sadrian} 204217770Sadrian 205217770Sadrianstatic void 206217770Sadrianeeprom_v14_target_ht_print(CAL_TARGET_POWER_HT *l) 207217770Sadrian{ 208217770Sadrian int i; 209217770Sadrian if (l->bChannel == 0xff) 210217770Sadrian return; 211217770Sadrian printf(" bChannel: %d;", l->bChannel); 212217770Sadrian for (i = 0; i < 8; i++) { 213217770Sadrian printf(" %.2f", (float) l->tPow2x[i] / 2.0); 214217770Sadrian } 215217770Sadrian printf(" (dBm)\n"); 216217770Sadrian} 217217770Sadrian 218217770Sadrianvoid 219217770Sadrianeeprom_v4k_print_targets(uint16_t *buf) 220217770Sadrian{ 221217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 222217770Sadrian int i; 223217770Sadrian 224217770Sadrian /* 2ghz rates */ 225217770Sadrian printf("2Ghz CCK:\n"); 226217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_CCK_TARGET_POWERS; i++) { 227217770Sadrian eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPowerCck[i]); 228217770Sadrian } 229217770Sadrian printf("2Ghz 11g:\n"); 230217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_20_TARGET_POWERS; i++) { 231217770Sadrian eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPower2G[i]); 232217770Sadrian } 233217770Sadrian printf("2Ghz HT20:\n"); 234217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_20_TARGET_POWERS; i++) { 235217770Sadrian eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT20[i]); 236217770Sadrian } 237217770Sadrian printf("2Ghz HT40:\n"); 238217770Sadrian for (i = 0; i < AR5416_4K_NUM_2G_40_TARGET_POWERS; i++) { 239217770Sadrian eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT40[i]); 240217770Sadrian } 241217770Sadrian 242217770Sadrian} 243217770Sadrian 244217770Sadrianstatic void 245217770Sadrianeeprom_v4k_ctl_edge_print(CAL_CTL_DATA_4K *ctl) 246217770Sadrian{ 247217770Sadrian int i, j; 248217770Sadrian uint8_t pow, flag; 249217770Sadrian 250217770Sadrian for (i = 0; i < AR5416_4K_MAX_CHAINS; i++) { 251217770Sadrian printf(" chain %d: ", i); 252217770Sadrian for (j = 0; j < AR5416_4K_NUM_BAND_EDGES; j++) { 253217770Sadrian pow = ctl->ctlEdges[i][j].tPowerFlag & 0x3f; 254217770Sadrian flag = (ctl->ctlEdges[i][j].tPowerFlag & 0xc0) >> 6; 255217770Sadrian printf(" %d:pow=%d,flag=%.2x", j, pow, flag); 256217770Sadrian } 257217770Sadrian printf("\n"); 258217770Sadrian } 259217770Sadrian} 260217770Sadrian 261217770Sadrianvoid 262217770Sadrianeeprom_v4k_ctl_print(uint16_t *buf) 263217770Sadrian{ 264217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 265217770Sadrian int i; 266217770Sadrian 267217770Sadrian for (i = 0; i < AR5416_4K_NUM_CTLS; i++) { 268217770Sadrian if (eep->ee_base.ctlIndex[i] == 0) 269217770Sadrian continue; 270217770Sadrian printf("| ctlIndex: offset %d, value %d\n", i, eep->ee_base.ctlIndex[i]); 271217770Sadrian eeprom_v4k_ctl_edge_print(&eep->ee_base.ctlData[i]); 272217770Sadrian } 273217770Sadrian} 274217770Sadrian 275217770Sadrianvoid 276217770Sadrianeeprom_v4k_print_edges(uint16_t *buf) 277217770Sadrian{ 278217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 279217770Sadrian int i; 280217770Sadrian 281217770Sadrian printf("| eeNumCtls: %d\n", eep->ee_numCtls); 282217770Sadrian for (i = 0; i < NUM_EDGES*eep->ee_numCtls; i++) { 283217770Sadrian /* XXX is flag 8 or 32 bits? */ 284217770Sadrian printf("| edge %2d/%2d: rdEdge: %5d EdgePower: %.2f dBm Flag: 0x%.8x\n", 285217770Sadrian i / NUM_EDGES, i % NUM_EDGES, 286217770Sadrian eep->ee_rdEdgesPower[i].rdEdge, 287217770Sadrian (float) eep->ee_rdEdgesPower[i].twice_rdEdgePower / 2.0, 288217770Sadrian eep->ee_rdEdgesPower[i].flag); 289217770Sadrian 290217770Sadrian if (i % NUM_EDGES == (NUM_EDGES -1)) 291217770Sadrian printf("|\n"); 292217770Sadrian } 293217770Sadrian} 294217770Sadrian 295217770Sadrianvoid 296217770Sadrianeeprom_v4k_print_other(uint16_t *buf) 297217770Sadrian{ 298217770Sadrian HAL_EEPROM_v4k *eep = (HAL_EEPROM_v4k *) buf; 299217770Sadrian printf("| ee_antennaGainMax: %.2x\n", eep->ee_antennaGainMax); 300217770Sadrian} 301