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