예제 #1
0
/* 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;
}
예제 #2
0
/* 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);
}