/* Do structure specific swaps if Eeprom format is non native to host */ static void eepromSwap(struct ar5416eeprom *ee) { uint32_t integer, i, j; uint16_t word; MODAL_EEP_HEADER *pModal; /* convert Base Eep header */ word = __bswap16(ee->baseEepHeader.length); ee->baseEepHeader.length = word; word = __bswap16(ee->baseEepHeader.checksum); ee->baseEepHeader.checksum = word; word = __bswap16(ee->baseEepHeader.version); ee->baseEepHeader.version = word; word = __bswap16(ee->baseEepHeader.regDmn[0]); ee->baseEepHeader.regDmn[0] = word; word = __bswap16(ee->baseEepHeader.regDmn[1]); ee->baseEepHeader.regDmn[1] = word; word = __bswap16(ee->baseEepHeader.rfSilent); ee->baseEepHeader.rfSilent = word; word = __bswap16(ee->baseEepHeader.blueToothOptions); ee->baseEepHeader.blueToothOptions = word; word = __bswap16(ee->baseEepHeader.deviceCap); ee->baseEepHeader.deviceCap = word; /* convert Modal Eep header */ for (j = 0; j < 2; j++) { pModal = &ee->modalHeader[j]; /* XXX linux/ah_osdep.h only defines __bswap32 for BE */ integer = __bswap32(pModal->antCtrlCommon); pModal->antCtrlCommon = integer; for (i = 0; i < AR5416_MAX_CHAINS; i++) { integer = __bswap32(pModal->antCtrlChain[i]); pModal->antCtrlChain[i] = integer; } for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { word = __bswap16(pModal->spurChans[i].spurChan); pModal->spurChans[i].spurChan = word; } } }
HAL_STATUS ath_hal_v4kEepromAttach(struct ath_hal *ah) { #define NW(a) (sizeof(a) / sizeof(uint16_t)) HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; uint16_t *eep_data, magic; HAL_BOOL need_swap; u_int w, off, len; uint32_t sum; HALASSERT(ee == AH_NULL); /* * Don't check magic if we're supplied with an EEPROM block, * typically this is from Howl but it may also be from later * boards w/ an embedded WMAC. */ if (ah->ah_eepromdata == NULL) { if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { HALDEBUG(ah, HAL_DEBUG_ANY, "%s Error reading Eeprom MAGIC\n", __func__); return HAL_EEREAD; } } HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s Eeprom Magic = 0x%x\n", __func__, magic); if (magic != AR5416_EEPROM_MAGIC) { HALDEBUG(ah, HAL_DEBUG_ANY, "Bad magic number\n"); return HAL_EEMAGIC; } ee = ath_hal_malloc(sizeof(HAL_EEPROM_v4k)); if (ee == AH_NULL) { /* XXX message */ return HAL_ENOMEM; } eep_data = (uint16_t *)&ee->ee_base; for (w = 0; w < NW(struct ar5416eeprom_4k); w++) { off = owl_eep_start_loc + w; /* NB: AP71 starts at 0 */ if (!ath_hal_eepromRead(ah, off, &eep_data[w])) { HALDEBUG(ah, HAL_DEBUG_ANY, "%s eeprom read error at offset 0x%x\n", __func__, off); return HAL_EEREAD; } } /* Convert to eeprom native eeprom endian format */ /* * XXX this is likely incorrect but will do for now * XXX to get embedded boards working. */ if (ah->ah_eepromdata == NULL && isBigEndian()) { for (w = 0; w < NW(struct ar5416eeprom_4k); w++) eep_data[w] = __bswap16(eep_data[w]); } /* * At this point, we're in the native eeprom endian format * Now, determine the eeprom endian by looking at byte 26?? */ need_swap = ((ee->ee_base.baseEepHeader.eepMisc & AR5416_EEPMISC_BIG_ENDIAN) != 0) ^ isBigEndian(); if (need_swap) { HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, "Byte swap EEPROM contents.\n"); len = __bswap16(ee->ee_base.baseEepHeader.length); } else { len = ee->ee_base.baseEepHeader.length; } len = AH_MIN(len, sizeof(struct ar5416eeprom_4k)) / sizeof(uint16_t); /* Apply the checksum, done in native eeprom format */ /* XXX - Need to check to make sure checksum calculation is done * in the correct endian format. Right now, it seems it would * cast the raw data to host format and do the calculation, which may * not be correct as the calculation may need to be done in the native * eeprom format */ sum = 0; for (w = 0; w < len; w++) { sum ^= eep_data[w]; } /* Check CRC - Attach should fail on a bad checksum */ if (sum != 0xffff) { HALDEBUG(ah, HAL_DEBUG_ANY, "Bad EEPROM checksum 0x%x (Len=%u)\n", sum, len); return HAL_EEBADSUM; } if (need_swap) eepromSwap(&ee->ee_base); /* byte swap multi-byte data */ /* swap words 0+2 so version is at the front */ magic = eep_data[0]; eep_data[0] = eep_data[2]; eep_data[2] = magic; HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, "%s Eeprom Version %u.%u\n", __func__, owl_get_eep_ver(ee), owl_get_eep_rev(ee)); /* NB: must be after all byte swapping */ if (owl_get_eep_ver(ee) != AR5416_EEP_VER) { HALDEBUG(ah, HAL_DEBUG_ANY, "Bad EEPROM version 0x%x\n", owl_get_eep_ver(ee)); return HAL_EEBADSUM; } v4kEepromReadCTLInfo(ah, ee); /* Get CTLs */ AH_PRIVATE(ah)->ah_eeprom = ee; AH_PRIVATE(ah)->ah_eeversion = ee->ee_base.baseEepHeader.version; AH_PRIVATE(ah)->ah_eepromDetach = v4kEepromDetach; AH_PRIVATE(ah)->ah_eepromGet = v4kEepromGet; AH_PRIVATE(ah)->ah_eepromSet = v4kEepromSet; AH_PRIVATE(ah)->ah_getSpurChan = v4kEepromGetSpurChan; AH_PRIVATE(ah)->ah_eepromDiag = v4kEepromDiag; return HAL_OK; #undef NW }
u_int16_t get_ctrl_msg_seq_no(aow_ctrl_msg_t* m) { u_int16_t seq_no = __bswap16(m->h.seq_no); return seq_no; }
u_int16_t get_ctrl_msg_cmd_type(aow_ctrl_msg_t* m) { u_int16_t cmd = (u_int16_t)__bswap16(m->h.desc) & (~AOW_CM_LOCAL_COMMAND_FLAG); return cmd; }
u_int16_t get_ctrl_msg_cmd_desc(aow_ctrl_msg_t *m) { u_int16_t desc = (u_int16_t)__bswap16(m->h.desc); return desc; }