/* * Validate the chanspec for this locale, for 40MHZ we need to also check that the sidebands * are valid 20MZH channels in this locale and they are also a legal HT combination */ static bool wlc_valid_chanspec_ext(wlc_cm_info_t *wlc_cm, chanspec_t chspec, bool dualband) { struct wlc_info *wlc = wlc_cm->wlc; u8 channel = CHSPEC_CHANNEL(chspec); /* check the chanspec */ if (wf_chspec_malformed(chspec)) { WL_ERROR("wl%d: malformed chanspec 0x%x\n", wlc->pub->unit, chspec); ASSERT(0); return false; } if (CHANNEL_BANDUNIT(wlc_cm->wlc, channel) != CHSPEC_WLCBANDUNIT(chspec)) return false; /* Check a 20Mhz channel */ if (CHSPEC_IS20(chspec)) { if (dualband) return VALID_CHANNEL20_DB(wlc_cm->wlc, channel); else return VALID_CHANNEL20(wlc_cm->wlc, channel); } #ifdef SUPPORT_40MHZ /* We know we are now checking a 40MHZ channel, so we should only be here * for NPHYS */ if (WLCISNPHY(wlc->band) || WLCISSSLPNPHY(wlc->band)) { u8 upper_sideband = 0, idx; u8 num_ch20_entries = sizeof(chan20_info) / sizeof(struct chan20_info); if (!VALID_40CHANSPEC_IN_BAND(wlc, CHSPEC_WLCBANDUNIT(chspec))) return false; if (dualband) { if (!VALID_CHANNEL20_DB(wlc, LOWER_20_SB(channel)) || !VALID_CHANNEL20_DB(wlc, UPPER_20_SB(channel))) return false; } else { if (!VALID_CHANNEL20(wlc, LOWER_20_SB(channel)) || !VALID_CHANNEL20(wlc, UPPER_20_SB(channel))) return false; } /* find the lower sideband info in the sideband array */ for (idx = 0; idx < num_ch20_entries; idx++) { if (chan20_info[idx].sb == LOWER_20_SB(channel)) upper_sideband = chan20_info[idx].adj_sbs; } /* check that the lower sideband allows an upper sideband */ if ((upper_sideband & (CH_UPPER_SB | CH_EWA_VALID)) == (CH_UPPER_SB | CH_EWA_VALID)) return true; return false; } #endif /* 40 MHZ */ return false; }
/* * Validate the chanspec for this locale, for 40MHZ we need to also * check that the sidebands are valid 20MZH channels in this locale * and they are also a legal HT combination */ static bool brcms_c_valid_chanspec_ext(struct brcms_cm_info *wlc_cm, u16 chspec, bool dualband) { struct brcms_c_info *wlc = wlc_cm->wlc; u8 channel = CHSPEC_CHANNEL(chspec); /* check the chanspec */ if (brcms_c_chspec_malformed(chspec)) { wiphy_err(wlc->wiphy, "wl%d: malformed chanspec 0x%x\n", wlc->pub->unit, chspec); return false; } if (CHANNEL_BANDUNIT(wlc_cm->wlc, channel) != chspec_bandunit(chspec)) return false; /* Check a 20Mhz channel */ if (CHSPEC_IS20(chspec)) { if (dualband) return brcms_c_valid_channel20_db(wlc_cm->wlc->cmi, channel); else return brcms_c_valid_channel20(wlc_cm->wlc->cmi, channel); } #ifdef SUPPORT_40MHZ /* * We know we are now checking a 40MHZ channel, so we should * only be here for NPHYS */ if (BRCMS_ISNPHY(wlc->band) || BRCMS_ISSSLPNPHY(wlc->band)) { u8 upper_sideband = 0, idx; u8 num_ch20_entries = sizeof(chan20_info) / sizeof(struct chan20_info); if (!VALID_40CHANSPEC_IN_BAND(wlc, chspec_bandunit(chspec))) return false; if (dualband) { if (!brcms_c_valid_channel20_db(wlc->cmi, lower_20_sb(channel)) || !brcms_c_valid_channel20_db(wlc->cmi, upper_20_sb(channel))) return false; } else { if (!brcms_c_valid_channel20(wlc->cmi, lower_20_sb(channel)) || !brcms_c_valid_channel20(wlc->cmi, upper_20_sb(channel))) return false; } /* find the lower sideband info in the sideband array */ for (idx = 0; idx < num_ch20_entries; idx++) { if (chan20_info[idx].sb == lower_20_sb(channel)) upper_sideband = chan20_info[idx].adj_sbs; } /* check that the lower sideband allows an upper sideband */ if ((upper_sideband & (CH_UPPER_SB | CH_EWA_VALID)) == (CH_UPPER_SB | CH_EWA_VALID)) return true; return false; } #endif /* 40 MHZ */ return false; }