xref: /freebsd/sys/contrib/dev/ath/ath_hal/ar9300/eeprom.diff (revision d1d015864103b253b3fcb2f72a0da5b0cfeb31b6)
1*76bd547bSAdrian Chadd/*
2*76bd547bSAdrian Chadd * Copyright (c) 2013 Qualcomm Atheros, Inc.
3*76bd547bSAdrian Chadd *
4*76bd547bSAdrian Chadd * Permission to use, copy, modify, and/or distribute this software for any
5*76bd547bSAdrian Chadd * purpose with or without fee is hereby granted, provided that the above
6*76bd547bSAdrian Chadd * copyright notice and this permission notice appear in all copies.
7*76bd547bSAdrian Chadd *
8*76bd547bSAdrian Chadd * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9*76bd547bSAdrian Chadd * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10*76bd547bSAdrian Chadd * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11*76bd547bSAdrian Chadd * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12*76bd547bSAdrian Chadd * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13*76bd547bSAdrian Chadd * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14*76bd547bSAdrian Chadd * PERFORMANCE OF THIS SOFTWARE.
15*76bd547bSAdrian Chadd */
16*76bd547bSAdrian Chadddiff --git a/hal/ar9300/ar9300_eeprom.c b/hal/ar9300/ar9300_eeprom.c
17*76bd547bSAdrian Chaddindex 2fe5506..628026f 100644
18*76bd547bSAdrian Chadd--- a/hal/ar9300/ar9300_eeprom.c
19*76bd547bSAdrian Chadd+++ b/hal/ar9300/ar9300_eeprom.c
20*76bd547bSAdrian Chadd@@ -342,6 +342,8 @@ ar9300_otp_read(struct ath_hal *ah, u_int off, u_int32_t *data, HAL_BOOL is_wifi
21*76bd547bSAdrian Chadd     int status = 0;
22*76bd547bSAdrian Chadd     u_int32_t addr;
23*76bd547bSAdrian Chadd
24*76bd547bSAdrian Chadd+    //ath_hal_printf(ah, "%s: reading offset 0x%x\n", __func__, off);
25*76bd547bSAdrian Chadd+
26*76bd547bSAdrian Chadd     addr = (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah))?
27*76bd547bSAdrian Chadd         OTP_MEM_START_ADDRESS_WASP : OTP_MEM_START_ADDRESS;
28*76bd547bSAdrian Chadd 	if (!is_wifi) {
29*76bd547bSAdrian Chadd@@ -372,6 +374,7 @@ ar9300_otp_read(struct ath_hal *ah, u_int off, u_int32_t *data, HAL_BOOL is_wifi
30*76bd547bSAdrian Chadd         addr = BTOTP_STATUS1_EFUSE_READ_DATA;
31*76bd547bSAdrian Chadd     }
32*76bd547bSAdrian Chadd     *data = OS_REG_READ(ah, addr);
33*76bd547bSAdrian Chadd+    //ath_hal_printf(ah, "%s:  data=0x%x\n", __func__, *data);
34*76bd547bSAdrian Chadd     return AH_TRUE;
35*76bd547bSAdrian Chadd }
36*76bd547bSAdrian Chadd
37*76bd547bSAdrian Chadd@@ -603,6 +606,8 @@ ar9300_eeprom_attach(struct ath_hal *ah)
38*76bd547bSAdrian Chadd     systime_t current_system_time = OS_GET_TIMESTAMP();
39*76bd547bSAdrian Chadd #endif
40*76bd547bSAdrian Chadd #endif
41*76bd547bSAdrian Chadd+
42*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: starting\n", __func__);
43*76bd547bSAdrian Chadd     ahp->try_dram = 1;
44*76bd547bSAdrian Chadd     ahp->try_eeprom = 1;
45*76bd547bSAdrian Chadd     ahp->try_otp = 1;
46*76bd547bSAdrian Chadd@@ -679,10 +684,14 @@ ar9300_eeprom_attach(struct ath_hal *ah)
47*76bd547bSAdrian Chadd #endif
48*76bd547bSAdrian Chadd #endif
49*76bd547bSAdrian Chadd
50*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: calling ar9300_fill_eeprom\n", __func__);
51*76bd547bSAdrian Chadd     if (!ar9300_fill_eeprom(ah)) {
52*76bd547bSAdrian Chadd         return HAL_EIO;
53*76bd547bSAdrian Chadd     }
54*76bd547bSAdrian Chadd
55*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: calibration data type = %d\n", __func__,
56*76bd547bSAdrian Chadd+      AH9300(ah)->calibration_data_source);
57*76bd547bSAdrian Chadd+
58*76bd547bSAdrian Chadd     return HAL_OK;
59*76bd547bSAdrian Chadd     /* return ar9300_check_eeprom(ah); */
60*76bd547bSAdrian Chadd #endif
61*76bd547bSAdrian Chadd@@ -704,6 +713,7 @@ ar9300_eeprom_attach(struct ath_hal *ah)
62*76bd547bSAdrian Chadd     ahp->ah_eeprom.mac_addr[4] = 0xD0;
63*76bd547bSAdrian Chadd     ahp->ah_eeprom.mac_addr[5] = 0x00;
64*76bd547bSAdrian Chadd #endif
65*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
66*76bd547bSAdrian Chadd     return HAL_OK;
67*76bd547bSAdrian Chadd #else
68*76bd547bSAdrian Chadd #if ATH_DRIVER_SIM
69*76bd547bSAdrian Chadd@@ -764,13 +774,17 @@ ar9300_eeprom_attach(struct ath_hal *ah)
70*76bd547bSAdrian Chadd         return HAL_OK;
71*76bd547bSAdrian Chadd     }
72*76bd547bSAdrian Chadd #endif
73*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
74*76bd547bSAdrian Chadd     if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
75*76bd547bSAdrian Chadd         ahp->try_eeprom = 0;
76*76bd547bSAdrian Chadd     }
77*76bd547bSAdrian Chadd
78*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
79*76bd547bSAdrian Chadd     if (!ar9300_eeprom_restore(ah)) {
80*76bd547bSAdrian Chadd+    	ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
81*76bd547bSAdrian Chadd         return HAL_EIO;
82*76bd547bSAdrian Chadd     }
83*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
84*76bd547bSAdrian Chadd     return HAL_OK;
85*76bd547bSAdrian Chadd #endif
86*76bd547bSAdrian Chadd #endif
87*76bd547bSAdrian Chadd@@ -3743,6 +3757,12 @@ ar9300_calibration_data_read_otp(struct ath_hal *ah, long address,
88*76bd547bSAdrian Chadd     unsigned long byte_addr;
89*76bd547bSAdrian Chadd     u_int32_t svalue;
90*76bd547bSAdrian Chadd
91*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: called: address=%d, many=%d, is_wifi=%d\n",
92*76bd547bSAdrian Chadd+        __func__,
93*76bd547bSAdrian Chadd+	(int) address,
94*76bd547bSAdrian Chadd+	many,
95*76bd547bSAdrian Chadd+	is_wifi);
96*76bd547bSAdrian Chadd+
97*76bd547bSAdrian Chadd     if (((address) < 0) || ((address + many) > 0x400)) {
98*76bd547bSAdrian Chadd         return AH_FALSE;
99*76bd547bSAdrian Chadd     }
100*76bd547bSAdrian Chadd@@ -3802,6 +3822,8 @@ ar9300_calibration_data_read_array(struct ath_hal *ah, int address,
101*76bd547bSAdrian Chadd {
102*76bd547bSAdrian Chadd     int it;
103*76bd547bSAdrian Chadd
104*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: address=%d, many=%d\n", __func__, address, many);
105*76bd547bSAdrian Chadd+
106*76bd547bSAdrian Chadd     for (it = 0; it < many; it++) {
107*76bd547bSAdrian Chadd         (void)ar9300_calibration_data_read(ah, address - it, buffer + it, 1);
108*76bd547bSAdrian Chadd     }
109*76bd547bSAdrian Chadd@@ -4001,13 +4023,24 @@ ar9300_eeprom_restore_internal_address(struct ath_hal *ah,
110*76bd547bSAdrian Chadd     int restored;
111*76bd547bSAdrian Chadd     u_int16_t checksum, mchecksum;
112*76bd547bSAdrian Chadd
113*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: called, cptr=0x%x, mdata_size=%d, blank=%d\n",
114*76bd547bSAdrian Chadd+      __func__, cptr, mdata_size, blank);
115*76bd547bSAdrian Chadd+
116*76bd547bSAdrian Chadd     restored = 0;
117*76bd547bSAdrian Chadd     for (it = 0; it < MSTATE; it++) {
118*76bd547bSAdrian Chadd         (void) ar9300_calibration_data_read_array(
119*76bd547bSAdrian Chadd             ah, cptr, word, compression_header_length);
120*76bd547bSAdrian Chadd+        ath_hal_printf(ah, "%s:  word = 0x%x, 0x%x, 0x%x, 0x%x\n",
121*76bd547bSAdrian Chadd+          __func__,
122*76bd547bSAdrian Chadd+          word[0],
123*76bd547bSAdrian Chadd+          word[1],
124*76bd547bSAdrian Chadd+          word[2],
125*76bd547bSAdrian Chadd+          word[3]);
126*76bd547bSAdrian Chadd         if (word[0] == blank && word[1] == blank && word[2] == blank && word[3] == blank)
127*76bd547bSAdrian Chadd         {
128*76bd547bSAdrian Chadd-            break;
129*76bd547bSAdrian Chadd+            ath_hal_printf(ah, "%s: word=blank, skipping\n", __func__);
130*76bd547bSAdrian Chadd+            cptr -= compression_header_length;
131*76bd547bSAdrian Chadd+            continue;
132*76bd547bSAdrian Chadd         }
133*76bd547bSAdrian Chadd         ar9300_compression_header_unpack(
134*76bd547bSAdrian Chadd             word, &code, &reference, &length, &major, &minor);
135*76bd547bSAdrian Chadd@@ -4143,19 +4176,18 @@ static int
136*76bd547bSAdrian Chadd ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
137*76bd547bSAdrian Chadd     int mdata_size)
138*76bd547bSAdrian Chadd {
139*76bd547bSAdrian Chadd-#if 0
140*76bd547bSAdrian Chadd     struct ath_hal_9300 *ahp = AH9300(ah);
141*76bd547bSAdrian Chadd     char *cal_ptr;
142*76bd547bSAdrian Chadd-#endif
143*76bd547bSAdrian Chadd
144*76bd547bSAdrian Chadd+#if 0
145*76bd547bSAdrian Chadd     /* cal data in flash / DRAM isn't currently supported */
146*76bd547bSAdrian Chadd     ath_hal_printf(ah, "%s: Cal data from DRAM isn't supported\n",
147*76bd547bSAdrian Chadd       __func__);
148*76bd547bSAdrian Chadd
149*76bd547bSAdrian Chadd     return -1;
150*76bd547bSAdrian Chadd+#endif
151*76bd547bSAdrian Chadd
152*76bd547bSAdrian Chadd #ifndef WIN32
153*76bd547bSAdrian Chadd-#if 0
154*76bd547bSAdrian Chadd     HALASSERT(mdata_size > 0);
155*76bd547bSAdrian Chadd
156*76bd547bSAdrian Chadd     /* if cal_in_flash is true, the address sent by LMAC to HAL
157*76bd547bSAdrian Chadd@@ -4164,14 +4196,17 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
158*76bd547bSAdrian Chadd     if(ar9300_eep_data_in_flash(ah))
159*76bd547bSAdrian Chadd         return -1;
160*76bd547bSAdrian Chadd
161*76bd547bSAdrian Chadd+#if 0
162*76bd547bSAdrian Chadd     /* check if LMAC sent DRAM address is valid */
163*76bd547bSAdrian Chadd     if (!(uintptr_t)(AH_PRIVATE(ah)->ah_st)) {
164*76bd547bSAdrian Chadd         return -1;
165*76bd547bSAdrian Chadd     }
166*76bd547bSAdrian Chadd+#endif
167*76bd547bSAdrian Chadd
168*76bd547bSAdrian Chadd     /* When calibration data is from host, Host will copy the
169*76bd547bSAdrian Chadd        compressed data to the predefined DRAM location saved at ah->ah_st */
170*76bd547bSAdrian Chadd     ath_hal_printf(ah, "Restoring Cal data from DRAM\n");
171*76bd547bSAdrian Chadd+#if 0
172*76bd547bSAdrian Chadd #ifdef __NetBSD__
173*76bd547bSAdrian Chadd     ahp->ah_cal_mem = OS_REMAP(ah, (uintptr_t)(AH_PRIVATE(ah)->ah_st),
174*76bd547bSAdrian Chadd 							HOST_CALDATA_SIZE);
175*76bd547bSAdrian Chadd@@ -4184,6 +4219,20 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
176*76bd547bSAdrian Chadd        HALDEBUG(ah, HAL_DEBUG_EEPROM,"%s: can't remap dram region\n", __func__);
177*76bd547bSAdrian Chadd        return -1;
178*76bd547bSAdrian Chadd     }
179*76bd547bSAdrian Chadd+#endif
180*76bd547bSAdrian Chadd+
181*76bd547bSAdrian Chadd+    /*
182*76bd547bSAdrian Chadd+     * The atheros HAL passes in this buffer anyway, and we copy things
183*76bd547bSAdrian Chadd+     * into it.  However, the FreeBSD driver doesn't supply this
184*76bd547bSAdrian Chadd+     * particular memory.  So, let's just assume attach/detach will
185*76bd547bSAdrian Chadd+     * provide us with a 16 kilobyte buffer for now, and hope the whole
186*76bd547bSAdrian Chadd+     * OTP path works.
187*76bd547bSAdrian Chadd+     */
188*76bd547bSAdrian Chadd+    if (! ahp->ah_cal_mem) {
189*76bd547bSAdrian Chadd+        ath_hal_printf(ah, "%s: FreeBSD: ah_cal_mem isn't set\n", __func__);
190*76bd547bSAdrian Chadd+        return -1;
191*76bd547bSAdrian Chadd+    }
192*76bd547bSAdrian Chadd+
193*76bd547bSAdrian Chadd     cal_ptr = &((char *)(ahp->ah_cal_mem))[AR9300_FLASH_CAL_START_OFFSET];
194*76bd547bSAdrian Chadd     OS_MEMCPY(mptr, cal_ptr, mdata_size);
195*76bd547bSAdrian Chadd
196*76bd547bSAdrian Chadd@@ -4201,7 +4250,6 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
197*76bd547bSAdrian Chadd     }
198*76bd547bSAdrian Chadd
199*76bd547bSAdrian Chadd     return mdata_size;
200*76bd547bSAdrian Chadd-#endif
201*76bd547bSAdrian Chadd #else
202*76bd547bSAdrian Chadd     return -1;
203*76bd547bSAdrian Chadd #endif
204*76bd547bSAdrian Chadd@@ -4290,6 +4338,11 @@ ar9300_eeprom_restore_from_flash(struct ath_hal *ah, ar9300_eeprom_t *mptr,
205*76bd547bSAdrian Chadd     }
206*76bd547bSAdrian Chadd
207*76bd547bSAdrian Chadd #endif
208*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: eeprom version=%d, template version=%d\n",
209*76bd547bSAdrian Chadd+        __func__,
210*76bd547bSAdrian Chadd+        (int) mptr->eeprom_version,
211*76bd547bSAdrian Chadd+        (int) mptr->template_version);
212*76bd547bSAdrian Chadd+
213*76bd547bSAdrian Chadd     if (mptr->eeprom_version   == 0xff ||
214*76bd547bSAdrian Chadd         mptr->template_version == 0xff ||
215*76bd547bSAdrian Chadd         mptr->eeprom_version   == 0    ||
216*76bd547bSAdrian Chadd@@ -4321,10 +4374,11 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
217*76bd547bSAdrian Chadd
218*76bd547bSAdrian Chadd     nptr = -1;
219*76bd547bSAdrian Chadd
220*76bd547bSAdrian Chadd-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
221*76bd547bSAdrian Chadd+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
222*76bd547bSAdrian Chadd          AH9300(ah)->calibration_data_try == calibration_data_dram) &&
223*76bd547bSAdrian Chadd          AH9300(ah)->try_dram && nptr < 0)
224*76bd547bSAdrian Chadd     {
225*76bd547bSAdrian Chadd+        ath_hal_printf(ah, "%s: trying dram\n", __func__);
226*76bd547bSAdrian Chadd         AH9300(ah)->calibration_data_source = calibration_data_dram;
227*76bd547bSAdrian Chadd         AH9300(ah)->calibration_data_source_address = 0;
228*76bd547bSAdrian Chadd         nptr = ar9300_eeprom_restore_from_dram(ah, mptr, mdata_size);
229*76bd547bSAdrian Chadd@@ -4334,7 +4388,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
230*76bd547bSAdrian Chadd         }
231*76bd547bSAdrian Chadd     }
232*76bd547bSAdrian Chadd
233*76bd547bSAdrian Chadd-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
234*76bd547bSAdrian Chadd+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
235*76bd547bSAdrian Chadd          AH9300(ah)->calibration_data_try == calibration_data_eeprom) &&
236*76bd547bSAdrian Chadd         AH9300(ah)->try_eeprom && nptr < 0)
237*76bd547bSAdrian Chadd     {
238*76bd547bSAdrian Chadd@@ -4343,6 +4397,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
239*76bd547bSAdrian Chadd          * base_address=0x3ff where we used to write the data
240*76bd547bSAdrian Chadd          */
241*76bd547bSAdrian Chadd         AH9300(ah)->calibration_data_source = calibration_data_eeprom;
242*76bd547bSAdrian Chadd+        ath_hal_printf(ah, "%s: trying eeprom\n", __func__);
243*76bd547bSAdrian Chadd         if (AH9300(ah)->calibration_data_try_address != 0) {
244*76bd547bSAdrian Chadd             AH9300(ah)->calibration_data_source_address =
245*76bd547bSAdrian Chadd                 AH9300(ah)->calibration_data_try_address;
246*76bd547bSAdrian Chadd@@ -4374,7 +4429,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
247*76bd547bSAdrian Chadd      * ##### should be an ifdef test for any AP usage,
248*76bd547bSAdrian Chadd      * either in driver or in nart
249*76bd547bSAdrian Chadd      */
250*76bd547bSAdrian Chadd-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
251*76bd547bSAdrian Chadd+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
252*76bd547bSAdrian Chadd          AH9300(ah)->calibration_data_try == calibration_data_flash) &&
253*76bd547bSAdrian Chadd         AH9300(ah)->try_flash && nptr < 0)
254*76bd547bSAdrian Chadd     {
255*76bd547bSAdrian Chadd@@ -4388,10 +4443,17 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
256*76bd547bSAdrian Chadd         }
257*76bd547bSAdrian Chadd     }
258*76bd547bSAdrian Chadd
259*76bd547bSAdrian Chadd+    /* XXX FreeBSD? */
260*76bd547bSAdrian Chadd+    AH9300(ah)->calibration_data_try = calibration_data_otp;
261*76bd547bSAdrian Chadd+    AH9300(ah)->calibration_data_try_address = 0x2ff;
262*76bd547bSAdrian Chadd+
263*76bd547bSAdrian Chadd     if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
264*76bd547bSAdrian Chadd          AH9300(ah)->calibration_data_try == calibration_data_otp) &&
265*76bd547bSAdrian Chadd         AH9300(ah)->try_otp && nptr < 0)
266*76bd547bSAdrian Chadd     {
267*76bd547bSAdrian Chadd+        ath_hal_printf(ah, "%s: trying OTP, try_address=0x%x\n",
268*76bd547bSAdrian Chadd+            __func__,
269*76bd547bSAdrian Chadd+            AH9300(ah)->calibration_data_try_address);
270*76bd547bSAdrian Chadd         AH9300(ah)->calibration_data_source = calibration_data_otp;
271*76bd547bSAdrian Chadd         if (AH9300(ah)->calibration_data_try_address != 0) {
272*76bd547bSAdrian Chadd             AH9300(ah)->calibration_data_source_address =
273*76bd547bSAdrian Chadd@@ -4526,6 +4588,8 @@ ar9300_eeprom_restore(struct ath_hal *ah)
274*76bd547bSAdrian Chadd     int mdata_size;
275*76bd547bSAdrian Chadd     HAL_BOOL status = AH_FALSE;
276*76bd547bSAdrian Chadd
277*76bd547bSAdrian Chadd+    ath_hal_printf(ah, "%s: called\n", __func__);
278*76bd547bSAdrian Chadd+
279*76bd547bSAdrian Chadd     mptr = &ahp->ah_eeprom;
280*76bd547bSAdrian Chadd     mdata_size = ar9300_eeprom_struct_size();
281*76bd547bSAdrian Chadd
282