/* Deserialize the contents of a buffer into an opaque ppr struct. * Creates an opaque structure referenced by *pptrptr, NULL on error. * Returns error code, BCME_OK if successful. */ int ppr_deserialize_create(osl_t *osh, const uint8* buf, uint buflen, ppr_t** pprptr) { const uint8* bptr = buf; int err = BCME_OK; ppr_t* lpprptr = NULL; if ((buflen > SER_HDR_LEN) && (bptr != NULL) && (*bptr == PPR_SERIALIZATION_VER)) { const ppr_deser_header_t * ser_head = (const ppr_deser_header_t *)bptr; wl_tx_bw_t ch_bw = ser_head->bw; /* struct size plus header */ uint32 ser_size = ppr_pwrs_size(ch_bw) + SER_HDR_LEN; if ((buflen >= ser_size) && ((lpprptr = ppr_create(osh, ch_bw)) != NULL)) { uint32 flags = NTOH32(ser_head->flags); /* set the data with default value before deserialize */ ppr_set_cmn_val(lpprptr, WL_RATE_DISABLED); ppr_deser_cpy(lpprptr, bptr + sizeof(*ser_head), flags, ch_bw); } else if (buflen < ser_size) { err = BCME_BUFTOOSHORT; } else { err = BCME_NOMEM; } } else if (buflen <= SER_HDR_LEN) { err = BCME_BUFTOOSHORT; } else if (bptr == NULL) { err = BCME_BADARG; } else { err = BCME_VERSION; } *pprptr = lpprptr; return err; }
/* use ppr to find min tgt power (2ss/3ss sdm) in .25dBm units */ static int wlc_olpc_get_min_tgt_pwr(wlc_olpc_eng_info_t *olpc, chanspec_t channel) { wlc_info_t* wlc = olpc->wlc; int cur_min = 0xFFFF; wlc_phy_t *pi = wlc->band->pi; ppr_t *txpwr; ppr_t *srommax; int8 min_srom; if ((txpwr = ppr_create(wlc->pub->osh, PPR_CHSPEC_BW(channel))) == NULL) { return WL_RATE_DISABLED; } if ((srommax = ppr_create(wlc->pub->osh, PPR_CHSPEC_BW(channel))) == NULL) { ppr_delete(wlc->pub->osh, txpwr); return WL_RATE_DISABLED; } /* use the control channel to get the regulatory limits and srom max/min */ wlc_channel_reg_limits(wlc->cmi, channel, txpwr); wlc_phy_txpower_sromlimit(pi, channel, (uint8*)&min_srom, srommax, 0); /* bound the regulatory limit by srom min/max */ ppr_apply_vector_ceiling(txpwr, srommax); /* apply min and then disable powers below min */ ppr_apply_min(txpwr, min_srom); ppr_force_disabled(txpwr, min_srom); WL_NONE(("min_srom %d\n", min_srom)); cur_min = wlc_olpc_get_min_2ss3ss_sdm_pwr(olpc, txpwr, channel); ppr_delete(wlc->pub->osh, srommax); ppr_delete(wlc->pub->osh, txpwr); return (int)(cur_min); }