1250003Sadrian/*
2250003Sadrian * Copyright (c) 2013 Qualcomm Atheros, Inc.
3250003Sadrian *
4250003Sadrian * Permission to use, copy, modify, and/or distribute this software for any
5250003Sadrian * purpose with or without fee is hereby granted, provided that the above
6250003Sadrian * copyright notice and this permission notice appear in all copies.
7250003Sadrian *
8250003Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9250003Sadrian * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10250003Sadrian * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11250003Sadrian * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12250003Sadrian * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13250003Sadrian * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14250003Sadrian * PERFORMANCE OF THIS SOFTWARE.
15250003Sadrian */
16250003Sadriandiff --git a/hal/ar9300/ar9300_eeprom.c b/hal/ar9300/ar9300_eeprom.c
17250003Sadrianindex 2fe5506..628026f 100644
18250003Sadrian--- a/hal/ar9300/ar9300_eeprom.c
19250003Sadrian+++ b/hal/ar9300/ar9300_eeprom.c
20250003Sadrian@@ -342,6 +342,8 @@ ar9300_otp_read(struct ath_hal *ah, u_int off, u_int32_t *data, HAL_BOOL is_wifi
21250003Sadrian     int status = 0;
22250003Sadrian     u_int32_t addr;
23250003Sadrian 
24250003Sadrian+    //ath_hal_printf(ah, "%s: reading offset 0x%x\n", __func__, off);
25250003Sadrian+
26250003Sadrian     addr = (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah))?
27250003Sadrian         OTP_MEM_START_ADDRESS_WASP : OTP_MEM_START_ADDRESS;
28250003Sadrian 	if (!is_wifi) {
29250003Sadrian@@ -372,6 +374,7 @@ ar9300_otp_read(struct ath_hal *ah, u_int off, u_int32_t *data, HAL_BOOL is_wifi
30250003Sadrian         addr = BTOTP_STATUS1_EFUSE_READ_DATA;
31250003Sadrian     }
32250003Sadrian     *data = OS_REG_READ(ah, addr);
33250003Sadrian+    //ath_hal_printf(ah, "%s:  data=0x%x\n", __func__, *data);
34250003Sadrian     return AH_TRUE;
35250003Sadrian }
36250003Sadrian 
37250003Sadrian@@ -603,6 +606,8 @@ ar9300_eeprom_attach(struct ath_hal *ah)
38250003Sadrian     systime_t current_system_time = OS_GET_TIMESTAMP();
39250003Sadrian #endif    
40250003Sadrian #endif
41250003Sadrian+
42250003Sadrian+    ath_hal_printf(ah, "%s: starting\n", __func__);
43250003Sadrian     ahp->try_dram = 1;
44250003Sadrian     ahp->try_eeprom = 1;
45250003Sadrian     ahp->try_otp = 1;
46250003Sadrian@@ -679,10 +684,14 @@ ar9300_eeprom_attach(struct ath_hal *ah)
47250003Sadrian #endif
48250003Sadrian #endif
49250003Sadrian     
50250003Sadrian+    ath_hal_printf(ah, "%s: calling ar9300_fill_eeprom\n", __func__);
51250003Sadrian     if (!ar9300_fill_eeprom(ah)) {
52250003Sadrian         return HAL_EIO;
53250003Sadrian     }
54250003Sadrian 
55250003Sadrian+    ath_hal_printf(ah, "%s: calibration data type = %d\n", __func__,
56250003Sadrian+      AH9300(ah)->calibration_data_source);
57250003Sadrian+
58250003Sadrian     return HAL_OK;
59250003Sadrian     /* return ar9300_check_eeprom(ah); */
60250003Sadrian #endif
61250003Sadrian@@ -704,6 +713,7 @@ ar9300_eeprom_attach(struct ath_hal *ah)
62250003Sadrian     ahp->ah_eeprom.mac_addr[4] = 0xD0;
63250003Sadrian     ahp->ah_eeprom.mac_addr[5] = 0x00;
64250003Sadrian #endif
65250003Sadrian+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
66250003Sadrian     return HAL_OK;
67250003Sadrian #else
68250003Sadrian #if ATH_DRIVER_SIM
69250003Sadrian@@ -764,13 +774,17 @@ ar9300_eeprom_attach(struct ath_hal *ah)
70250003Sadrian         return HAL_OK;
71250003Sadrian     }
72250003Sadrian #endif
73250003Sadrian+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
74250003Sadrian     if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
75250003Sadrian         ahp->try_eeprom = 0;
76250003Sadrian     }
77250003Sadrian 
78250003Sadrian+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
79250003Sadrian     if (!ar9300_eeprom_restore(ah)) {
80250003Sadrian+    	ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
81250003Sadrian         return HAL_EIO;
82250003Sadrian     }
83250003Sadrian+    ath_hal_printf(ah, "%s: %s:%d\n", __func__, __FILE__, __LINE__);
84250003Sadrian     return HAL_OK;
85250003Sadrian #endif
86250003Sadrian #endif
87250003Sadrian@@ -3743,6 +3757,12 @@ ar9300_calibration_data_read_otp(struct ath_hal *ah, long address,
88250003Sadrian     unsigned long byte_addr;
89250003Sadrian     u_int32_t svalue;
90250003Sadrian 
91250003Sadrian+    ath_hal_printf(ah, "%s: called: address=%d, many=%d, is_wifi=%d\n",
92250003Sadrian+        __func__,
93250003Sadrian+	(int) address,
94250003Sadrian+	many,
95250003Sadrian+	is_wifi);
96250003Sadrian+
97250003Sadrian     if (((address) < 0) || ((address + many) > 0x400)) {
98250003Sadrian         return AH_FALSE;
99250003Sadrian     }
100250003Sadrian@@ -3802,6 +3822,8 @@ ar9300_calibration_data_read_array(struct ath_hal *ah, int address,
101250003Sadrian {
102250003Sadrian     int it;
103250003Sadrian 
104250003Sadrian+    ath_hal_printf(ah, "%s: address=%d, many=%d\n", __func__, address, many);
105250003Sadrian+
106250003Sadrian     for (it = 0; it < many; it++) {
107250003Sadrian         (void)ar9300_calibration_data_read(ah, address - it, buffer + it, 1);
108250003Sadrian     }
109250003Sadrian@@ -4001,13 +4023,24 @@ ar9300_eeprom_restore_internal_address(struct ath_hal *ah,
110250003Sadrian     int restored;
111250003Sadrian     u_int16_t checksum, mchecksum;
112250003Sadrian 
113250003Sadrian+    ath_hal_printf(ah, "%s: called, cptr=0x%x, mdata_size=%d, blank=%d\n",
114250003Sadrian+      __func__, cptr, mdata_size, blank);
115250003Sadrian+
116250003Sadrian     restored = 0;
117250003Sadrian     for (it = 0; it < MSTATE; it++) {            
118250003Sadrian         (void) ar9300_calibration_data_read_array(
119250003Sadrian             ah, cptr, word, compression_header_length);
120250003Sadrian+        ath_hal_printf(ah, "%s:  word = 0x%x, 0x%x, 0x%x, 0x%x\n",
121250003Sadrian+          __func__,
122250003Sadrian+          word[0],
123250003Sadrian+          word[1],
124250003Sadrian+          word[2],
125250003Sadrian+          word[3]);
126250003Sadrian         if (word[0] == blank && word[1] == blank && word[2] == blank && word[3] == blank)
127250003Sadrian         {
128250003Sadrian-            break;
129250003Sadrian+            ath_hal_printf(ah, "%s: word=blank, skipping\n", __func__);
130250003Sadrian+            cptr -= compression_header_length;
131250003Sadrian+            continue;
132250003Sadrian         }
133250003Sadrian         ar9300_compression_header_unpack(
134250003Sadrian             word, &code, &reference, &length, &major, &minor);
135250003Sadrian@@ -4143,19 +4176,18 @@ static int
136250003Sadrian ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
137250003Sadrian     int mdata_size)
138250003Sadrian {
139250003Sadrian-#if 0
140250003Sadrian     struct ath_hal_9300 *ahp = AH9300(ah);
141250003Sadrian     char *cal_ptr;
142250003Sadrian-#endif
143250003Sadrian 
144250003Sadrian+#if 0
145250003Sadrian     /* cal data in flash / DRAM isn't currently supported */
146250003Sadrian     ath_hal_printf(ah, "%s: Cal data from DRAM isn't supported\n",
147250003Sadrian       __func__);
148250003Sadrian 
149250003Sadrian     return -1;
150250003Sadrian+#endif
151250003Sadrian 
152250003Sadrian #ifndef WIN32
153250003Sadrian-#if 0
154250003Sadrian     HALASSERT(mdata_size > 0);
155250003Sadrian 
156250003Sadrian     /* if cal_in_flash is true, the address sent by LMAC to HAL
157250003Sadrian@@ -4164,14 +4196,17 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
158250003Sadrian     if(ar9300_eep_data_in_flash(ah))
159250003Sadrian         return -1;
160250003Sadrian 
161250003Sadrian+#if 0
162250003Sadrian     /* check if LMAC sent DRAM address is valid */
163250003Sadrian     if (!(uintptr_t)(AH_PRIVATE(ah)->ah_st)) {
164250003Sadrian         return -1;
165250003Sadrian     }
166250003Sadrian+#endif
167250003Sadrian 
168250003Sadrian     /* When calibration data is from host, Host will copy the 
169250003Sadrian        compressed data to the predefined DRAM location saved at ah->ah_st */
170250003Sadrian     ath_hal_printf(ah, "Restoring Cal data from DRAM\n");
171250003Sadrian+#if 0
172250003Sadrian #ifdef __NetBSD__
173250003Sadrian     ahp->ah_cal_mem = OS_REMAP(ah, (uintptr_t)(AH_PRIVATE(ah)->ah_st), 
174250003Sadrian 							HOST_CALDATA_SIZE);
175250003Sadrian@@ -4184,6 +4219,20 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
176250003Sadrian        HALDEBUG(ah, HAL_DEBUG_EEPROM,"%s: can't remap dram region\n", __func__);
177250003Sadrian        return -1;
178250003Sadrian     }
179250003Sadrian+#endif
180250003Sadrian+
181250003Sadrian+    /*
182250003Sadrian+     * The atheros HAL passes in this buffer anyway, and we copy things
183250003Sadrian+     * into it.  However, the FreeBSD driver doesn't supply this
184250003Sadrian+     * particular memory.  So, let's just assume attach/detach will
185250003Sadrian+     * provide us with a 16 kilobyte buffer for now, and hope the whole
186250003Sadrian+     * OTP path works.
187250003Sadrian+     */
188250003Sadrian+    if (! ahp->ah_cal_mem) {
189250003Sadrian+        ath_hal_printf(ah, "%s: FreeBSD: ah_cal_mem isn't set\n", __func__);
190250003Sadrian+        return -1;
191250003Sadrian+    }
192250003Sadrian+
193250003Sadrian     cal_ptr = &((char *)(ahp->ah_cal_mem))[AR9300_FLASH_CAL_START_OFFSET];
194250003Sadrian     OS_MEMCPY(mptr, cal_ptr, mdata_size);
195250003Sadrian 
196250003Sadrian@@ -4201,7 +4250,6 @@ ar9300_eeprom_restore_from_dram(struct ath_hal *ah, ar9300_eeprom_t *mptr,
197250003Sadrian     }
198250003Sadrian 
199250003Sadrian     return mdata_size;
200250003Sadrian-#endif
201250003Sadrian #else
202250003Sadrian     return -1;
203250003Sadrian #endif
204250003Sadrian@@ -4290,6 +4338,11 @@ ar9300_eeprom_restore_from_flash(struct ath_hal *ah, ar9300_eeprom_t *mptr,
205250003Sadrian     }
206250003Sadrian 
207250003Sadrian #endif
208250003Sadrian+    ath_hal_printf(ah, "%s: eeprom version=%d, template version=%d\n",
209250003Sadrian+        __func__,
210250003Sadrian+        (int) mptr->eeprom_version,
211250003Sadrian+        (int) mptr->template_version);
212250003Sadrian+
213250003Sadrian     if (mptr->eeprom_version   == 0xff ||
214250003Sadrian         mptr->template_version == 0xff ||
215250003Sadrian         mptr->eeprom_version   == 0    ||
216250003Sadrian@@ -4321,10 +4374,11 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
217250003Sadrian 
218250003Sadrian     nptr = -1;    
219250003Sadrian 
220250003Sadrian-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
221250003Sadrian+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
222250003Sadrian          AH9300(ah)->calibration_data_try == calibration_data_dram) &&
223250003Sadrian          AH9300(ah)->try_dram && nptr < 0)
224250003Sadrian     {   
225250003Sadrian+        ath_hal_printf(ah, "%s: trying dram\n", __func__);
226250003Sadrian         AH9300(ah)->calibration_data_source = calibration_data_dram;
227250003Sadrian         AH9300(ah)->calibration_data_source_address = 0;
228250003Sadrian         nptr = ar9300_eeprom_restore_from_dram(ah, mptr, mdata_size);
229250003Sadrian@@ -4334,7 +4388,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
230250003Sadrian         }
231250003Sadrian     }
232250003Sadrian     
233250003Sadrian-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
234250003Sadrian+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
235250003Sadrian          AH9300(ah)->calibration_data_try == calibration_data_eeprom) &&
236250003Sadrian         AH9300(ah)->try_eeprom && nptr < 0)
237250003Sadrian     {
238250003Sadrian@@ -4343,6 +4397,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
239250003Sadrian          * base_address=0x3ff where we used to write the data
240250003Sadrian          */
241250003Sadrian         AH9300(ah)->calibration_data_source = calibration_data_eeprom;
242250003Sadrian+        ath_hal_printf(ah, "%s: trying eeprom\n", __func__);
243250003Sadrian         if (AH9300(ah)->calibration_data_try_address != 0) {
244250003Sadrian             AH9300(ah)->calibration_data_source_address =
245250003Sadrian                 AH9300(ah)->calibration_data_try_address;
246250003Sadrian@@ -4374,7 +4429,7 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
247250003Sadrian      * ##### should be an ifdef test for any AP usage,
248250003Sadrian      * either in driver or in nart
249250003Sadrian      */
250250003Sadrian-    if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
251250003Sadrian+    if (0 && (AH9300(ah)->calibration_data_try == calibration_data_none ||
252250003Sadrian          AH9300(ah)->calibration_data_try == calibration_data_flash) &&
253250003Sadrian         AH9300(ah)->try_flash && nptr < 0)
254250003Sadrian     {
255250003Sadrian@@ -4388,10 +4443,17 @@ ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr,
256250003Sadrian         }
257250003Sadrian     }
258250003Sadrian 
259250003Sadrian+    /* XXX FreeBSD? */
260250003Sadrian+    AH9300(ah)->calibration_data_try = calibration_data_otp;
261250003Sadrian+    AH9300(ah)->calibration_data_try_address = 0x2ff;
262250003Sadrian+
263250003Sadrian     if ((AH9300(ah)->calibration_data_try == calibration_data_none ||
264250003Sadrian          AH9300(ah)->calibration_data_try == calibration_data_otp) &&
265250003Sadrian         AH9300(ah)->try_otp && nptr < 0)
266250003Sadrian     {
267250003Sadrian+        ath_hal_printf(ah, "%s: trying OTP, try_address=0x%x\n",
268250003Sadrian+            __func__,
269250003Sadrian+            AH9300(ah)->calibration_data_try_address);
270250003Sadrian         AH9300(ah)->calibration_data_source = calibration_data_otp;
271250003Sadrian         if (AH9300(ah)->calibration_data_try_address != 0) {
272250003Sadrian             AH9300(ah)->calibration_data_source_address =
273250003Sadrian@@ -4526,6 +4588,8 @@ ar9300_eeprom_restore(struct ath_hal *ah)
274250003Sadrian     int mdata_size;
275250003Sadrian     HAL_BOOL status = AH_FALSE;
276250003Sadrian 
277250003Sadrian+    ath_hal_printf(ah, "%s: called\n", __func__);
278250003Sadrian+
279250003Sadrian     mptr = &ahp->ah_eeprom;
280250003Sadrian     mdata_size = ar9300_eeprom_struct_size();
281250003Sadrian 
282