1222322Sadrian/* 2222322Sadrian * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd. 3222322Sadrian * 4222322Sadrian * Redistribution and use in source and binary forms, with or without 5222322Sadrian * modification, are permitted provided that the following conditions 6222322Sadrian * are met: 7222322Sadrian * 1. Redistributions of source code must retain the above copyright 8222322Sadrian * notice, this list of conditions and the following disclaimer. 9222322Sadrian * 2. Redistributions in binary form must reproduce the above copyright 10222322Sadrian * notice, this list of conditions and the following disclaimer in the 11222322Sadrian * documentation and/or other materials provided with the distribution. 12222322Sadrian * 13222322Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14222322Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15222322Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16222322Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17222322Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18222322Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19222322Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20222322Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21222322Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22222322Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23222322Sadrian * SUCH DAMAGE. 24222322Sadrian * 25222322Sadrian * $FreeBSD$ 26222322Sadrian */ 27222322Sadrian 28222322Sadrian#include <stdio.h> 29222322Sadrian#include <stdlib.h> 30222322Sadrian#include <unistd.h> 31222322Sadrian#include <string.h> 32222322Sadrian#include <sys/types.h> 33222322Sadrian#include <err.h> 34222322Sadrian 35222322Sadriantypedef enum { 36222322Sadrian AH_FALSE = 0, /* NB: lots of code assumes false is zero */ 37222322Sadrian AH_TRUE = 1, 38222322Sadrian} HAL_BOOL; 39222322Sadrian 40222322Sadriantypedef enum { 41222322Sadrian HAL_OK = 0, /* No error */ 42222322Sadrian} HAL_STATUS; 43222322Sadrian 44222322Sadrianstruct ath_hal; 45222322Sadrian 46222322Sadrian#include "ah_eeprom_v14.h" 47222322Sadrian#include "ah_eeprom_9287.h" 48222322Sadrian 49222322Sadrianvoid 50222322Sadrianeeprom_9287_base_print(uint16_t *buf) 51222322Sadrian{ 52222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 53222322Sadrian BASE_EEP_9287_HEADER *eh = &eep->ee_base.baseEepHeader; 54222322Sadrian int i; 55222322Sadrian 56222322Sadrian printf("| Version: 0x%.4x | Length: 0x%.4x | Checksum: 0x%.4x ", 57222322Sadrian eh->version, eh->length, eh->checksum); 58222322Sadrian printf("| CapFlags: 0x%.2x | eepMisc: 0x%.2x | RegDomain: 0x%.4x 0x%.4x | \n", 59222322Sadrian eh->opCapFlags, eh->eepMisc, eh->regDmn[0], eh->regDmn[1]); 60222322Sadrian printf("| MAC: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ", 61222322Sadrian eh->macAddr[0], eh->macAddr[1], eh->macAddr[2], 62222322Sadrian eh->macAddr[3], eh->macAddr[4], eh->macAddr[5]); 63222322Sadrian printf("| RxMask: 0x%.2x | TxMask: 0x%.2x | RfSilent: 0x%.4x | btOptions: 0x%.4x |\n", 64222322Sadrian eh->rxMask, eh->txMask, eh->rfSilent, eh->blueToothOptions); 65222322Sadrian printf("| DeviceCap: 0x%.4x | binBuildNumber: %.8x | deviceType: 0x%.2x | openLoopPwrCntl 0x%.2x |\n", 66222322Sadrian eh->deviceCap, eh->binBuildNumber, eh->deviceType, eh->openLoopPwrCntl); 67222322Sadrian printf("| pwrTableOffset: %d | tempSensSlope: %d | tempSensSlopePalOn: %d |\n", 68222322Sadrian eh->pwrTableOffset, eh->tempSensSlope, eh->tempSensSlopePalOn); 69222322Sadrian 70222322Sadrian printf("Future:\n"); 71222322Sadrian for (i = 0; i < sizeof(eh->futureBase) / sizeof(uint16_t); i++) { 72222322Sadrian printf("0x%.2x ", eh->futureBase[i]); 73222322Sadrian } 74222322Sadrian printf("\n"); 75222322Sadrian} 76222322Sadrian 77222322Sadrianvoid 78222322Sadrianeeprom_9287_custdata_print(uint16_t *buf) 79222322Sadrian{ 80222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 81222322Sadrian uint8_t *custdata = (uint8_t *) &eep->ee_base.custData; 82222322Sadrian int i; 83222322Sadrian 84222322Sadrian printf("\n| Custdata: |\n"); 85222322Sadrian for (i = 0; i < 20; i++) { 86222322Sadrian printf("%s0x%.2x %s", 87222322Sadrian i % 16 == 0 ? "| " : "", 88222322Sadrian custdata[i], 89222322Sadrian i % 16 == 15 ? "|\n" : ""); 90222322Sadrian } 91222322Sadrian printf("\n"); 92222322Sadrian} 93222322Sadrian 94222322Sadrianvoid 95222322Sadrianeeprom_9287_modal_print(uint16_t *buf) 96222322Sadrian{ 97222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 98222322Sadrian MODAL_EEP_9287_HEADER *mh = &eep->ee_base.modalHeader; 99222322Sadrian int i; 100222322Sadrian 101222322Sadrian printf("| antCtrlCommon: 0x%.8x |\n", mh->antCtrlCommon); 102222322Sadrian printf("| switchSettling: 0x%.2x |\n", mh->switchSettling); 103222322Sadrian printf("| adcDesiredSize: %d |\n", mh->adcDesiredSize); 104222322Sadrian 105222322Sadrian for (i = 0; i < AR9287_MAX_CHAINS; i++) { 106222322Sadrian printf("| Chain %d:\n", i); 107222322Sadrian printf("| antCtrlChain: 0:0x%.4x |\n", mh->antCtrlChain[i]); 108222322Sadrian printf("| antennaGainCh: 0:0x%.2x |\n", mh->antennaGainCh[i]); 109222322Sadrian printf("| txRxAttenCh: 0:0x%.2x |\n", mh->txRxAttenCh[i]); 110222322Sadrian printf("| rxTxMarginCh: 0:0x%.2x |\n", mh->rxTxMarginCh[i]); 111222322Sadrian printf("| noiseFloorThresCh: 0:0x%.2x |\n", mh->noiseFloorThreshCh[i]); 112222322Sadrian printf("| iqCalICh: 0:0x%.2x |\n", mh->iqCalICh[i]); 113222322Sadrian printf("| iqCalQCh: 0:0x%.2x |\n", mh->iqCalQCh[i]); 114222322Sadrian printf("| bswAtten: 0:0x%.2x |\n", mh->bswAtten[i]); 115222322Sadrian printf("| bswMargin: 0:0x%.2x |\n", mh->bswMargin[i]); 116222322Sadrian printf("\n"); 117222322Sadrian } 118222322Sadrian 119222322Sadrian printf("| txEndToXpaOff: 0x%.2x | txEndToRxOn: 0x%.2x | txFrameToXpaOn: 0x%.2x |\n", 120222322Sadrian mh->txEndToXpaOff, mh->txEndToRxOn, mh->txFrameToXpaOn); 121222322Sadrian printf("| thres62: 0x%.2x\n", mh->thresh62); 122222322Sadrian printf("| xpdGain: 0x%.2x | xpd: 0x%.2x |\n", mh->xpdGain, mh->xpd); 123222322Sadrian 124222322Sadrian printf("| pdGainOverlap: 0x%.2x xpaBiasLvl: 0x%.2x |\n", mh->pdGainOverlap, mh->xpaBiasLvl); 125222322Sadrian printf("| txFrameToDataStart: 0x%.2x | txFrameToPaOn: 0x%.2x |\n", mh->txFrameToDataStart, mh->txFrameToPaOn); 126222322Sadrian printf("| ht40PowerIncForPdadc: 0x%.2x |\n", mh->ht40PowerIncForPdadc); 127222322Sadrian printf("| swSettleHt40: 0x%.2x |\n", mh->swSettleHt40); 128222322Sadrian 129222322Sadrian printf("| Modal Version: %.2x |\n", mh->version); 130222322Sadrian printf("| db1 = %d | db2 = %d |\n", mh->db1, mh->db2); 131222322Sadrian printf("| ob_cck = %d | ob_psk = %d | ob_qam = %d | ob_pal_off = %d |\n", 132222322Sadrian mh->ob_cck, mh->ob_psk, mh->ob_qam, mh->ob_pal_off); 133222322Sadrian 134222322Sadrian printf("| futureModal: "); 135222322Sadrian for (i = 0; i < sizeof(mh->futureModal) / sizeof(uint16_t); i++) { 136222322Sadrian printf("0x%.2x ", mh->futureModal[i]); 137222322Sadrian } 138222322Sadrian printf("\n"); 139222322Sadrian 140222322Sadrian /* and now, spur channels */ 141222322Sadrian for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { 142222322Sadrian printf("| Spur %d: spurChan: 0x%.4x spurRangeLow: 0x%.2x spurRangeHigh: 0x%.2x |\n", 143222322Sadrian i, mh->spurChans[i].spurChan, 144222322Sadrian (int) mh->spurChans[i].spurRangeLow, 145222322Sadrian (int) mh->spurChans[i].spurRangeHigh); 146222322Sadrian } 147222322Sadrian} 148222322Sadrian 149222322Sadrianstatic void 150222322Sadrianeeprom_9287_print_caldata_oploop(struct cal_data_op_loop_ar9287 *f) 151222322Sadrian{ 152222322Sadrian int i, j; 153222322Sadrian 154222322Sadrian /* XXX flesh out the rest */ 155222322Sadrian for (i = 0; i < 2; i++) { 156222322Sadrian printf(" pwrPdg:"); 157222322Sadrian for (j = 0; j < 5; j++) { 158222322Sadrian printf("[%d][%d]=%d, ", i, j, f->pwrPdg[i][j]); 159222322Sadrian } 160222322Sadrian printf("\n"); 161222322Sadrian 162222322Sadrian printf(" vpdPdg:"); 163222322Sadrian for (j = 0; j < 5; j++) { 164222322Sadrian printf("[%d][%d]=%d, ", i, j, f->vpdPdg[i][j]); 165222322Sadrian } 166222322Sadrian printf("\n"); 167222322Sadrian 168222322Sadrian printf(" pcdac:"); 169222322Sadrian for (j = 0; j < 5; j++) { 170222322Sadrian printf("[%d][%d]=%d, ", i, j, f->pcdac[i][j]); 171222322Sadrian } 172222322Sadrian printf("\n"); 173222322Sadrian 174222322Sadrian printf(" empty:"); 175222322Sadrian for (j = 0; j < 5; j++) { 176222322Sadrian printf("[%d][%d]=%d, ", i, j, f->empty[i][j]); 177222322Sadrian } 178222322Sadrian printf("\n\n"); 179222322Sadrian } 180222322Sadrian} 181222322Sadrian 182222322Sadrianvoid 183222322Sadrianeeprom_9287_calfreqpiers_print(uint16_t *buf) 184222322Sadrian{ 185222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 186222322Sadrian int i, n; 187222322Sadrian 188222322Sadrian /* 2ghz cal piers */ 189222322Sadrian printf("calFreqPier2G: "); 190222322Sadrian for (i = 0; i < AR9287_NUM_2G_CAL_PIERS; i++) { 191222322Sadrian printf(" 0x%.2x ", eep->ee_base.calFreqPier2G[i]); 192222322Sadrian } 193222322Sadrian printf("|\n"); 194222322Sadrian 195222322Sadrian for (i = 0; i < AR9287_NUM_2G_CAL_PIERS; i++) { 196222322Sadrian if (eep->ee_base.calFreqPier2G[i] == 0xff) 197222322Sadrian continue; 198222322Sadrian printf("2Ghz Cal Pier %d\n", i); 199222322Sadrian for (n = 0; n < AR9287_MAX_CHAINS; n++) { 200222322Sadrian printf(" Chain %d:\n", n); 201222322Sadrian eeprom_9287_print_caldata_oploop((void *)&eep->ee_base.calPierData2G[n][i]); 202222322Sadrian } 203222322Sadrian } 204222322Sadrian 205222322Sadrian printf("\n"); 206222322Sadrian} 207222322Sadrian 208222322Sadrian/* XXX these should just reference the v14 print routines */ 209222322Sadrianstatic void 210222322Sadrianeeprom_v14_target_legacy_print(CAL_TARGET_POWER_LEG *l) 211222322Sadrian{ 212222322Sadrian int i; 213222322Sadrian if (l->bChannel == 0xff) 214222322Sadrian return; 215222322Sadrian printf(" bChannel: %d;", l->bChannel); 216222322Sadrian for (i = 0; i < 4; i++) { 217222322Sadrian printf(" %.2f", (float) l->tPow2x[i] / 2.0); 218222322Sadrian } 219222322Sadrian printf(" (dBm)\n"); 220222322Sadrian} 221222322Sadrian 222222322Sadrianstatic void 223222322Sadrianeeprom_v14_target_ht_print(CAL_TARGET_POWER_HT *l) 224222322Sadrian{ 225222322Sadrian int i; 226222322Sadrian if (l->bChannel == 0xff) 227222322Sadrian return; 228222322Sadrian printf(" bChannel: %d;", l->bChannel); 229222322Sadrian for (i = 0; i < 8; i++) { 230222322Sadrian printf(" %.2f", (float) l->tPow2x[i] / 2.0); 231222322Sadrian } 232222322Sadrian printf(" (dBm)\n"); 233222322Sadrian} 234222322Sadrian 235222322Sadrianvoid 236222322Sadrianeeprom_9287_print_targets(uint16_t *buf) 237222322Sadrian{ 238222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 239222322Sadrian int i; 240222322Sadrian 241222322Sadrian /* 2ghz rates */ 242222322Sadrian printf("2Ghz CCK:\n"); 243222322Sadrian for (i = 0; i < AR9287_NUM_2G_CCK_TARGET_POWERS; i++) { 244222322Sadrian eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPowerCck[i]); 245222322Sadrian } 246222322Sadrian printf("2Ghz 11g:\n"); 247222322Sadrian for (i = 0; i < AR9287_NUM_2G_20_TARGET_POWERS; i++) { 248222322Sadrian eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPower2G[i]); 249222322Sadrian } 250222322Sadrian printf("2Ghz HT20:\n"); 251222322Sadrian for (i = 0; i < AR9287_NUM_2G_20_TARGET_POWERS; i++) { 252222322Sadrian eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT20[i]); 253222322Sadrian } 254222322Sadrian printf("2Ghz HT40:\n"); 255222322Sadrian for (i = 0; i < AR9287_NUM_2G_40_TARGET_POWERS; i++) { 256222322Sadrian eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT40[i]); 257222322Sadrian } 258222322Sadrian 259222322Sadrian} 260222322Sadrian 261222322Sadrianstatic void 262222322Sadrianeeprom_9287_ctl_edge_print(struct cal_ctl_data_ar9287 *ctl) 263222322Sadrian{ 264222322Sadrian int i, j; 265222322Sadrian uint8_t pow, flag; 266222322Sadrian 267222322Sadrian for (i = 0; i < AR9287_MAX_CHAINS; i++) { 268222322Sadrian printf(" chain %d: ", i); 269222322Sadrian for (j = 0; j < AR9287_NUM_BAND_EDGES; j++) { 270222322Sadrian pow = ctl->ctlEdges[i][j].tPowerFlag & 0x3f; 271222322Sadrian flag = (ctl->ctlEdges[i][j].tPowerFlag & 0xc0) >> 6; 272222322Sadrian printf(" %d:pow=%d,flag=%.2x", j, pow, flag); 273222322Sadrian } 274222322Sadrian printf("\n"); 275222322Sadrian } 276222322Sadrian} 277222322Sadrian 278222322Sadrianvoid 279222322Sadrianeeprom_9287_ctl_print(uint16_t *buf) 280222322Sadrian{ 281222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 282222322Sadrian int i; 283222322Sadrian 284222322Sadrian for (i = 0; i < AR9287_NUM_CTLS; i++) { 285222322Sadrian if (eep->ee_base.ctlIndex[i] == 0) 286222322Sadrian continue; 287222322Sadrian printf("| ctlIndex: offset %d, value %d\n", i, eep->ee_base.ctlIndex[i]); 288222322Sadrian eeprom_9287_ctl_edge_print(&eep->ee_base.ctlData[i]); 289222322Sadrian } 290222322Sadrian} 291222322Sadrian 292222322Sadrianvoid 293222322Sadrianeeprom_9287_print_edges(uint16_t *buf) 294222322Sadrian{ 295222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 296222322Sadrian int i; 297222322Sadrian 298222322Sadrian printf("| eeNumCtls: %d\n", eep->ee_numCtls); 299222322Sadrian for (i = 0; i < NUM_EDGES*eep->ee_numCtls; i++) { 300222322Sadrian /* XXX is flag 8 or 32 bits? */ 301222322Sadrian printf("| edge %2d/%2d: rdEdge: %5d EdgePower: %.2f dBm Flag: 0x%.8x\n", 302222322Sadrian i / NUM_EDGES, i % NUM_EDGES, 303222322Sadrian eep->ee_rdEdgesPower[i].rdEdge, 304222322Sadrian (float) eep->ee_rdEdgesPower[i].twice_rdEdgePower / 2.0, 305222322Sadrian eep->ee_rdEdgesPower[i].flag); 306222322Sadrian 307222322Sadrian if (i % NUM_EDGES == (NUM_EDGES -1)) 308222322Sadrian printf("|\n"); 309222322Sadrian } 310222322Sadrian} 311222322Sadrian 312222322Sadrianvoid 313222322Sadrianeeprom_9287_print_other(uint16_t *buf) 314222322Sadrian{ 315222322Sadrian HAL_EEPROM_9287 *eep = (HAL_EEPROM_9287 *) buf; 316222322Sadrian} 317