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