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