Static void ar9287_olpc_get_pdgain(struct athn_softc *sc, struct ieee80211_channel *c, int chain, int8_t *pwr) { const struct ar9287_eeprom *eep = sc->sc_eep; const struct ar_cal_data_per_freq_olpc *pierdata; const uint8_t *pierfreq; uint8_t fbin; int lo, hi, npiers; pierfreq = eep->calFreqPier2G; pierdata = (const struct ar_cal_data_per_freq_olpc *) eep->calPierData2G[chain]; npiers = AR9287_NUM_2G_CAL_PIERS; /* Find channel in ROM pier table. */ fbin = athn_chan2fbin(c); athn_get_pier_ival(fbin, pierfreq, npiers, &lo, &hi); #if 0 *pwr = athn_interpolate(fbin, pierfreq[lo], pierdata[lo].pwrPdg[0][0], pierfreq[hi], pierdata[hi].pwrPdg[0][0]); #else *pwr = (pierdata[lo].pwrPdg[0][0] + pierdata[hi].pwrPdg[0][0]) / 2; #endif }
void ar9380_get_correction(struct athn_softc *sc, struct ieee80211_channel *c, int chain, int *corr, int *temp) { const struct ar9380_eeprom *eep = sc->eep; const struct ar9380_cal_data_per_freq_op_loop *pierdata; const uint8_t *pierfreq; uint8_t fbin; int lo, hi, npiers; if (IEEE80211_IS_CHAN_2GHZ(c)) { pierfreq = eep->calFreqPier2G; pierdata = eep->calPierData2G[chain]; npiers = AR9380_NUM_2G_CAL_PIERS; } else { pierfreq = eep->calFreqPier5G; pierdata = eep->calPierData5G[chain]; npiers = AR9380_NUM_5G_CAL_PIERS; } /* Find channel in ROM pier table. */ fbin = athn_chan2fbin(c); athn_get_pier_ival(fbin, pierfreq, npiers, &lo, &hi); *corr = athn_interpolate(fbin, pierfreq[lo], pierdata[lo].refPower, pierfreq[hi], pierdata[hi].refPower); *temp = athn_interpolate(fbin, pierfreq[lo], pierdata[lo].tempMeas, pierfreq[hi], pierdata[hi].tempMeas); }
void ar9280_olpc_get_pdadcs(struct athn_softc *sc, struct ieee80211_channel *c, int chain, uint8_t *boundaries, uint8_t *pdadcs, uint8_t *txgain) { const struct ar5416_eeprom *eep = sc->eep; const struct ar_cal_data_per_freq_olpc *pierdata; const uint8_t *pierfreq; uint8_t fbin, pcdac, pwr, idx; int i, lo, hi, npiers; if (IEEE80211_IS_CHAN_2GHZ(c)) { pierfreq = eep->calFreqPier2G; pierdata = (const struct ar_cal_data_per_freq_olpc *) eep->calPierData2G[chain]; npiers = AR5416_NUM_2G_CAL_PIERS; } else { pierfreq = eep->calFreqPier5G; pierdata = (const struct ar_cal_data_per_freq_olpc *) eep->calPierData5G[chain]; npiers = AR5416_NUM_5G_CAL_PIERS; } /* Find channel in ROM pier table. */ fbin = athn_chan2fbin(c); athn_get_pier_ival(fbin, pierfreq, npiers, &lo, &hi); /* Get average. */ pwr = (pierdata[lo].pwrPdg[0][0] + pierdata[hi].pwrPdg[0][0]) / 2; pwr /= 2; /* Convert to dB. */ /* Find power control digital-to-analog converter (PCDAC) value. */ pcdac = pierdata[hi].pcdac[0][0]; for (idx = 0; idx < AR9280_TX_GAIN_TABLE_SIZE - 1; idx++) if (pcdac <= sc->tx_gain_tbl[idx]) break; *txgain = idx; DPRINTFN(3, ("fbin=%d lo=%d hi=%d pwr=%d pcdac=%d txgain=%d\n", fbin, lo, hi, pwr, pcdac, idx)); /* Fill phase domain analog-to-digital converter (PDADC) table. */ for (i = 0; i < AR_NUM_PDADC_VALUES; i++) pdadcs[i] = (i < pwr) ? 0x00 : 0xff; for (i = 0; i < AR_PD_GAINS_IN_MASK; i++) boundaries[i] = AR9280_PD_GAIN_BOUNDARY_DEFAULT; }
Static void ar9287_get_pdadcs(struct athn_softc *sc, struct ieee80211_channel *c, int chain, int nxpdgains, uint8_t overlap, uint8_t *boundaries, uint8_t *pdadcs) { const struct ar9287_eeprom *eep = sc->sc_eep; const struct ar9287_cal_data_per_freq *pierdata; const uint8_t *pierfreq; struct athn_pier lopier, hipier; int16_t delta; uint8_t fbin; int i, lo, hi, npiers; pierfreq = eep->calFreqPier2G; pierdata = (const struct ar9287_cal_data_per_freq *) eep->calPierData2G[chain]; npiers = AR9287_NUM_2G_CAL_PIERS; /* Find channel in ROM pier table. */ fbin = athn_chan2fbin(c); athn_get_pier_ival(fbin, pierfreq, npiers, &lo, &hi); lopier.fbin = pierfreq[lo]; hipier.fbin = pierfreq[hi]; for (i = 0; i < nxpdgains; i++) { lopier.pwr[i] = pierdata[lo].pwrPdg[i]; lopier.vpd[i] = pierdata[lo].vpdPdg[i]; hipier.pwr[i] = pierdata[lo].pwrPdg[i]; hipier.vpd[i] = pierdata[lo].vpdPdg[i]; } ar5008_get_pdadcs(sc, fbin, &lopier, &hipier, nxpdgains, AR9287_PD_GAIN_ICEPTS, overlap, boundaries, pdadcs); delta = (eep->baseEepHeader.pwrTableOffset - AR_PWR_TABLE_OFFSET_DB) * 2; /* In half dB. */ if (delta != 0) { /* Shift the PDADC table to start at the new offset. */ /* XXX Our padding value differs from Linux. */ for (i = 0; i < AR_NUM_PDADC_VALUES; i++) pdadcs[i] = pdadcs[MIN(i + delta, AR_NUM_PDADC_VALUES - 1)]; } }