static void v4kEepromReadCTLInfo(struct ath_hal *ah, HAL_EEPROM_v4k *ee) { RD_EDGES_POWER *rep = ee->ee_rdEdgesPower; int i, j; HALASSERT(AR5416_4K_NUM_CTLS <= sizeof(ee->ee_rdEdgesPower)/NUM_EDGES); for (i = 0; ee->ee_base.ctlIndex[i] != 0 && i < AR5416_4K_NUM_CTLS; i++) { for (j = 0; j < NUM_EDGES; j ++) { /* XXX Confirm this is the right thing to do when an invalid channel is stored */ if (ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].bChannel == AR5416_BCHAN_UNUSED) { rep[j].rdEdge = 0; rep[j].twice_rdEdgePower = 0; rep[j].flag = 0; } else { rep[j].rdEdge = fbin2freq( ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].bChannel, (ee->ee_base.ctlIndex[i] & CTL_MODE_M) != CTL_11A); rep[j].twice_rdEdgePower = MS(ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].tPowerFlag, CAL_CTL_EDGES_POWER); rep[j].flag = MS(ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].tPowerFlag, CAL_CTL_EDGES_FLAG) != 0; } } rep += NUM_EDGES; } ee->ee_numCtls = i; HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, "%s Numctls = %u\n",__func__,i); }
/************************************************************** * ar5416GetTargetPowersLeg * * Return the four rates of target power for the given target power table * channel, and number of channels */ void ar5416GetTargetPowersLeg(struct ath_hal *ah, HAL_CHANNEL_INTERNAL *chan, CAL_TARGET_POWER_LEG *powInfo, u_int16_t numChannels, CAL_TARGET_POWER_LEG *pNewPower, u_int16_t numRates, HAL_BOOL isExtTarget) { u_int16_t clo, chi; int i; int matchIndex = -1, lowIndex = -1; u_int16_t freq; CHAN_CENTERS centers; ar5416GetChannelCenters(ah, chan, ¢ers); freq = (isExtTarget) ? centers.ext_center : centers.ctl_center; /* Copy the target powers into the temp channel list */ if (freq <= fbin2freq(powInfo[0].bChannel, IS_CHAN_2GHZ(chan))) { matchIndex = 0; } else { for (i = 0; (i < numChannels) && (powInfo[i].bChannel != AR5416_BCHAN_UNUSED); i++) { if (freq == fbin2freq(powInfo[i].bChannel, IS_CHAN_2GHZ(chan))) { matchIndex = i; break; } else if ((freq < fbin2freq(powInfo[i].bChannel, IS_CHAN_2GHZ(chan))) && (freq > fbin2freq(powInfo[i - 1].bChannel, IS_CHAN_2GHZ(chan)))) { lowIndex = i - 1; break; } } if ((matchIndex == -1) && (lowIndex == -1)) { HALASSERT(freq > fbin2freq(powInfo[i - 1].bChannel, IS_CHAN_2GHZ(chan))); matchIndex = i - 1; } } if (matchIndex != -1) { *pNewPower = powInfo[matchIndex]; } else { HALASSERT(lowIndex != -1); /* * Get the lower and upper channels, target powers, * and interpolate between them. */ clo = fbin2freq(powInfo[lowIndex].bChannel, IS_CHAN_2GHZ(chan)); chi = fbin2freq(powInfo[lowIndex + 1].bChannel, IS_CHAN_2GHZ(chan)); for (i = 0; i < numRates; i++) { pNewPower->tPow2x[i] = (u_int8_t)interpolate(freq, clo, chi, powInfo[lowIndex].tPow2x[i], powInfo[lowIndex + 1].tPow2x[i]); } } }