1251738Sadrian
2251738Sadrian/*
3251738Sadrian * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd.
4251738Sadrian *
5251738Sadrian * Redistribution and use in source and binary forms, with or without
6251738Sadrian * modification, are permitted provided that the following conditions
7251738Sadrian * are met:
8251738Sadrian * 1. Redistributions of source code must retain the above copyright
9251738Sadrian *    notice, this list of conditions and the following disclaimer.
10251738Sadrian * 2. Redistributions in binary form must reproduce the above copyright
11251738Sadrian *    notice, this list of conditions and the following disclaimer in the
12251738Sadrian *    documentation and/or other materials provided with the distribution.
13251738Sadrian *
14251738Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15251738Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16251738Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17251738Sadrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18251738Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19251738Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20251738Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21251738Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22251738Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23251738Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24251738Sadrian * SUCH DAMAGE.
25251738Sadrian *
26251738Sadrian * $FreeBSD$
27251738Sadrian */
28251738Sadrian
29251738Sadrian#include <stdio.h>
30251738Sadrian#include <stdlib.h>
31251738Sadrian#include <unistd.h>
32251738Sadrian#include <string.h>
33251738Sadrian#include <sys/types.h>
34251738Sadrian#include <err.h>
35251738Sadrian
36251738Sadrianstruct ath_hal;
37251738Sadrian
38251738Sadrian#include "ar9300/ar9300eep.h"
39251738Sadrian
40251738Sadrianstatic void
41251738Sadrianeeprom_9300_hdr_print(const uint16_t *buf)
42251738Sadrian{
43251738Sadrian	const ar9300_eeprom_t *ee = (ar9300_eeprom_t *) buf;
44251738Sadrian
45251738Sadrian	printf("| Version: %d, Template: %d, MAC: %02x:%02x:%02x:%02x:%02x:%02x |\n",
46251738Sadrian	    ee->eeprom_version,
47251738Sadrian	    ee->template_version,
48251738Sadrian	    ee->mac_addr[0],
49251738Sadrian	    ee->mac_addr[1],
50251738Sadrian	    ee->mac_addr[2],
51251738Sadrian	    ee->mac_addr[3],
52251738Sadrian	    ee->mac_addr[4],
53251738Sadrian	    ee->mac_addr[5]);
54251738Sadrian}
55251738Sadrian
56251738Sadrianstatic void
57251738Sadrianeeprom_9300_base_print(const uint16_t *buf)
58251738Sadrian{
59251738Sadrian	const ar9300_eeprom_t *ee = (ar9300_eeprom_t *) buf;
60251738Sadrian	const OSPREY_BASE_EEP_HEADER *ee_base = &ee->base_eep_header;
61251738Sadrian
62251738Sadrian	printf("| RegDomain: 0x%02x 0x%02x TxRxMask: 0x%02x OpFlags: 0x%02x OpMisc: 0x%02x |\n",
63251738Sadrian	    ee_base->reg_dmn[0],
64251738Sadrian	    ee_base->reg_dmn[1],
65251738Sadrian	    ee_base->txrx_mask,
66251738Sadrian	    ee_base->op_cap_flags.op_flags,
67251738Sadrian	    ee_base->op_cap_flags.eepMisc);
68251738Sadrian
69251738Sadrian	printf("| RfSilent: 0x%02x BtOptions: 0x%02x DeviceCap: 0x%02x DeviceType: 0x%02x |\n",
70251738Sadrian	    ee_base->rf_silent,
71251738Sadrian	    ee_base->blue_tooth_options,
72251738Sadrian	    ee_base->device_cap,
73251738Sadrian	    ee_base->device_type);
74251738Sadrian
75251738Sadrian	printf("| pwrTableOffset: %d dB, feature_enable: 0x%02x MiscConfig: 0x%02x |\n",
76251738Sadrian	    ee_base->pwrTableOffset,
77251738Sadrian	    ee_base->feature_enable,
78251738Sadrian	    ee_base->misc_configuration);
79251738Sadrian
80251738Sadrian	printf("| EepromWriteGpio: %d, WlanDisableGpio: %d, WlanLedGpio: %d RxBandSelectGpio: %d |\n",
81251738Sadrian	    ee_base->eeprom_write_enable_gpio,
82251738Sadrian	    ee_base->wlan_disable_gpio,
83251738Sadrian	    ee_base->wlan_led_gpio,
84251738Sadrian	    ee_base->rx_band_select_gpio);
85251738Sadrian
86251738Sadrian	printf("| TxRxGain: %d, SwReg: %d |\n",
87251738Sadrian	    ee_base->txrxgain,
88251738Sadrian	    ee_base->swreg);
89251738Sadrian}
90251738Sadrian
91251738Sadrianstatic void
92251738Sadrianeeprom_9300_modal_print(const OSPREY_MODAL_EEP_HEADER *m)
93251738Sadrian{
94251738Sadrian	int i;
95251738Sadrian
96251738Sadrian	printf("| AntCtrl: 0x%08x AntCtrl2: 0x%08x |\n",
97251738Sadrian	    m->ant_ctrl_common,
98251738Sadrian	    m->ant_ctrl_common2);
99251738Sadrian
100251738Sadrian	for (i = 0; i < OSPREY_MAX_CHAINS; i++) {
101251738Sadrian		printf("| Ch %d: AntCtrl: 0x%08x Atten1: %d, atten1_margin: %d, NfThresh: %d |\n",
102251738Sadrian		    i,
103251738Sadrian		    m->ant_ctrl_chain[i],
104251738Sadrian		    m->xatten1_db[i],
105251738Sadrian		    m->xatten1_margin[i],
106251738Sadrian		    m->noise_floor_thresh_ch[i]);
107251738Sadrian	}
108251738Sadrian
109251738Sadrian	printf("| Spur: ");
110251738Sadrian	for (i = 0; i < OSPREY_EEPROM_MODAL_SPURS; i++) {
111251738Sadrian		printf("(%d: %d) ", i, m->spur_chans[i]);
112251738Sadrian	}
113251738Sadrian	printf("|\n");
114251738Sadrian
115251738Sadrian	printf("| TempSlope: %d, VoltSlope: %d, QuickDrop: %d, XpaBiasLvl %d |\n",
116251738Sadrian	    m->temp_slope,
117251738Sadrian	    m->voltSlope,
118251738Sadrian	    m->quick_drop,
119251738Sadrian	    m->xpa_bias_lvl);
120251738Sadrian
121251738Sadrian	printf("| txFrameToDataStart: %d, TxFrameToPaOn: %d, TxEndToXpaOff: %d, TxEndToRxOn: %d, TxFrameToXpaOn: %d |\n",
122251738Sadrian	    m->tx_frame_to_data_start,
123251738Sadrian	    m->tx_frame_to_pa_on,
124251738Sadrian	    m->tx_end_to_xpa_off,
125251738Sadrian	    m->txEndToRxOn,
126251738Sadrian	    m->tx_frame_to_xpa_on);
127251738Sadrian
128251738Sadrian	printf("| txClip: %d, AntGain: %d, SwitchSettling: %d, adcDesiredSize: %d |\n",
129251738Sadrian	    m->txClip,
130251738Sadrian	    m->antenna_gain,
131251738Sadrian	    m->switchSettling,
132251738Sadrian	    m->adcDesiredSize);
133251738Sadrian
134251738Sadrian	printf("| Thresh62: %d, PaprdMaskHt20: 0x%08x, PaPrdMaskHt40: 0x%08x |\n",
135251738Sadrian	    m->thresh62,
136251738Sadrian	    m->paprd_rate_mask_ht20,
137251738Sadrian	    m->paprd_rate_mask_ht40);
138251738Sadrian
139251738Sadrian	printf("| SwitchComSpdt: %02x, XlnaBiasStrength: %d, RfGainCap: %d, TxGainCap: %x\n",
140251738Sadrian	    m->switchcomspdt,
141251738Sadrian	    m->xLNA_bias_strength,
142251738Sadrian	    m->rf_gain_cap,
143251738Sadrian	    m->tx_gain_cap);
144251738Sadrian
145251738Sadrian#if 0
146251738Sadrian    u_int8_t   reserved[MAX_MODAL_RESERVED];
147251738Sadrian    u_int16_t  switchcomspdt;
148251738Sadrian    u_int8_t   xLNA_bias_strength;                      // bit: 0,1:chain0, 2,3:chain1, 4,5:chain2
149251738Sadrian    u_int8_t   rf_gain_cap;
150251738Sadrian    u_int8_t   tx_gain_cap;                             // bit0:4 txgain cap, txgain index for max_txgain + 20 (10dBm higher than max txgain)
151251738Sadrian    u_int8_t   futureModal[MAX_MODAL_FUTURE];
152251738Sadrian    // last 12 bytes stolen and moved to newly created base extension structure
153251738Sadrian#endif
154251738Sadrian}
155251738Sadrian
156251738Sadrianstatic void
157251738Sadrianload_eeprom_dump(const char *file, uint16_t *buf)
158251738Sadrian{
159251738Sadrian	unsigned int r[8];
160251738Sadrian	FILE *fp;
161251738Sadrian	char b[1024];
162251738Sadrian	int i;
163251738Sadrian
164251738Sadrian	fp = fopen(file, "r");
165251738Sadrian	if (!fp)
166251738Sadrian		err(1, "fopen");
167251738Sadrian
168251738Sadrian	while (!feof(fp)) {
169251738Sadrian		if (fgets(b, 1024, fp) == NULL)
170251738Sadrian			break;
171251738Sadrian		if (feof(fp))
172251738Sadrian			break;
173251738Sadrian		if (strlen(b) > 0)
174251738Sadrian			b[strlen(b)-1] = '\0';
175251738Sadrian		if (strlen(b) == 0)
176251738Sadrian			break;
177251738Sadrian		sscanf(b, "%x: %x %x %x %x %x %x %x %x\n",
178251738Sadrian		    &i, &r[0], &r[1], &r[2], &r[3], &r[4],
179251738Sadrian		    &r[5], &r[6], &r[7]);
180251738Sadrian		buf[i++] = r[0];
181251738Sadrian		buf[i++] = r[1];
182251738Sadrian		buf[i++] = r[2];
183251738Sadrian		buf[i++] = r[3];
184251738Sadrian		buf[i++] = r[4];
185251738Sadrian		buf[i++] = r[5];
186251738Sadrian		buf[i++] = r[6];
187251738Sadrian		buf[i++] = r[7];
188251738Sadrian	}
189251738Sadrian	fclose(fp);
190251738Sadrian}
191251738Sadrian
192251738Sadrianvoid
193251738Sadrianusage(char *argv[])
194251738Sadrian{
195251738Sadrian	printf("Usage: %s <eeprom dump file>\n", argv[0]);
196251738Sadrian	printf("\n");
197251738Sadrian	printf("  The eeprom dump file is a text hexdump of an EEPROM.\n");
198251738Sadrian	printf("  The lines must be formatted as follows:\n");
199251738Sadrian	printf("  0xAAAA: 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD\n");
200251738Sadrian	printf("  where each line must have exactly eight data bytes.\n");
201251738Sadrian	exit(127);
202251738Sadrian}
203251738Sadrian
204251738Sadrianint
205251738Sadrianmain(int argc, char *argv[])
206251738Sadrian{
207251738Sadrian	uint16_t *eep = NULL;
208251738Sadrian	const ar9300_eeprom_t *ee;
209251738Sadrian
210251738Sadrian	eep = calloc(4096, sizeof(int16_t));
211251738Sadrian
212251738Sadrian	if (argc < 2)
213251738Sadrian		usage(argv);
214251738Sadrian
215251738Sadrian	load_eeprom_dump(argv[1], eep);
216251738Sadrian	ee = (ar9300_eeprom_t *) eep;
217251738Sadrian
218251738Sadrian	eeprom_9300_hdr_print(eep);
219251738Sadrian	eeprom_9300_base_print(eep);
220251738Sadrian
221251738Sadrian	printf("\n2GHz modal:\n");
222251738Sadrian	eeprom_9300_modal_print(&ee->modal_header_2g);
223251738Sadrian
224251738Sadrian	printf("\n5GHz modal:\n");
225251738Sadrian	eeprom_9300_modal_print(&ee->modal_header_5g);
226251738Sadrian
227251738Sadrian	free(eep);
228251738Sadrian	exit(0);
229251738Sadrian}
230