Lines Matching refs:rspec
352 static u8 brcms_basic_rate(struct brcms_c_info *wlc, u32 rspec)
354 if (is_mcs_rate(rspec))
355 return wlc->band->basic_rate[mcs_table[rspec & RSPEC_RATE_MASK]
357 return wlc->band->basic_rate[rspec & RSPEC_RATE_MASK];
360 static u16 frametype(u32 rspec, u8 mimoframe)
362 if (is_mcs_rate(rspec))
364 return is_cck_rate(rspec) ? FT_CCK : FT_OFDM;
5673 brcms_c_calc_ack_time(struct brcms_c_info *wlc, u32 rspec,
5683 rspec = brcms_basic_rate(wlc, rspec);
5686 brcms_c_calc_frame_time(wlc, rspec, preamble_type,
5692 brcms_c_calc_cts_time(struct brcms_c_info *wlc, u32 rspec,
5695 return brcms_c_calc_ack_time(wlc, rspec, preamble_type);
5699 brcms_c_calc_ba_time(struct brcms_c_info *wlc, u32 rspec,
5707 rspec = brcms_basic_rate(wlc, rspec);
5709 return brcms_c_calc_frame_time(wlc, rspec, preamble_type,
5794 static bool brcms_c_valid_rate(struct brcms_c_info *wlc, u32 rspec, int band,
5809 if (is_mcs_rate(rspec)) {
5810 if ((rspec & RSPEC_RATE_MASK) >= MCS_TABLE_SIZE)
5813 return isset(hw_rateset->mcs, (rspec & RSPEC_RATE_MASK));
5817 if (hw_rateset->rates[i] == rspec2rate(rspec))
5822 "not in hw_rateset\n", wlc->pub->unit, rspec);
5834 u32 rspec;
5908 rspec = rate;
5910 rspec |= RSPEC_MIMORATE;
5915 rspec |= (stc << RSPEC_STC_SHIFT);
5919 rspec |= (stf << RSPEC_STF_SHIFT);
5922 rspec |= RSPEC_OVERRIDE_MCS_ONLY;
5925 rspec |= RSPEC_SHORT_GI;
5928 && !brcms_c_valid_rate(wlc, rspec, cur_band->bandtype, true))
5931 return rspec;
5991 static void brcms_c_compute_mimo_plcp(u32 rspec, uint length, u8 *plcp)
5993 u8 mcs = (u8) (rspec & RSPEC_RATE_MASK);
5995 if (rspec_is40mhz(rspec) || (mcs == 32))
5998 plcp[3] = rspec_mimoplcp3(rspec); /* rspec already holds this byte */
6006 brcms_c_compute_ofdm_plcp(u32 rspec, u32 length, u8 *plcp)
6010 int rate = rspec2rate(rspec);
6027 static void brcms_c_compute_cck_plcp(struct brcms_c_info *wlc, u32 rspec,
6030 int rate = rspec2rate(rspec);
6036 brcms_c_compute_plcp(struct brcms_c_info *wlc, u32 rspec,
6039 if (is_mcs_rate(rspec))
6040 brcms_c_compute_mimo_plcp(rspec, length, plcp);
6041 else if (is_ofdm_rate(rspec))
6042 brcms_c_compute_ofdm_plcp(rspec, length, plcp);
6044 brcms_c_compute_cck_plcp(wlc, rspec, length, plcp);
6093 static u16 brcms_c_phytxctl1_calc(struct brcms_c_info *wlc, u32 rspec)
6101 bw = rspec_get_bw(rspec);
6110 if (is_mcs_rate(rspec)) {
6111 uint mcs = rspec & RSPEC_RATE_MASK;
6114 phyctl1 = rspec_phytxbyte2(rspec);
6117 } else if (is_cck_rate(rspec) && !BRCMS_ISLCNPHY(wlc->band)
6125 phyctl1 = (bw | (rspec_stf(rspec) << PHY_TXC1_MODE_SHIFT));
6129 phycfg = brcms_c_rate_legacy_phyctl(rspec2rate(rspec));
6138 (rspec_stf(rspec) << PHY_TXC1_MODE_SHIFT));
6163 u32 rspec[2] = { BRCM_RATE_1M, BRCM_RATE_1M };
6250 rspec[k] =
6254 rspec[k] = BRCM_RATE_1M;
6257 rspec[k] = mac80211_wlc_set_nrate(wlc, wlc->band,
6279 if (!rspec_active(rspec[k])) {
6280 rspec[k] = BRCM_RATE_1M;
6296 * if rspec is auto selected
6298 if (((is_mcs_rate(rspec[k]) &&
6299 is_single_stream(rspec[k] & RSPEC_RATE_MASK)) ||
6300 is_ofdm_rate(rspec[k]))
6301 && ((rspec[k] & RSPEC_OVERRIDE_MCS_ONLY)
6302 || !(rspec[k] & RSPEC_OVERRIDE))) {
6303 rspec[k] &= ~(RSPEC_STF_MASK | RSPEC_STC_MASK);
6306 if (is_mcs_rate(rspec[k])
6312 rspec[k] |= (PHY_TXC1_MODE_STBC <<
6316 rspec[k] |=
6331 if (is_mcs_rate(rspec[k])) {
6333 if ((rspec[k] & RSPEC_RATE_MASK)
6343 } else if (is_ofdm_rate(rspec[k])) {
6355 if ((rspec[k] & RSPEC_RATE_MASK) == 32)
6357 rspec[k] = RSPEC_MIMORATE;
6363 rspec[k] &= ~RSPEC_BW_MASK;
6364 if ((k == 0) || ((k > 0) && is_mcs_rate(rspec[k])))
6365 rspec[k] |= (mimo_txbw << RSPEC_BW_SHIFT);
6367 rspec[k] |= (mimo_ctlchbw << RSPEC_BW_SHIFT);
6370 rspec[k] &= ~RSPEC_SHORT_GI;
6377 && (!is_mcs_rate(rspec[k]))) {
6379 "wl%d: %s: IEEE80211_TX_RC_MCS != is_mcs_rate(rspec)\n",
6383 if (is_mcs_rate(rspec[k])) {
6390 if ((rspec[k] & RSPEC_SHORT_GI)
6391 && is_single_stream(rspec[k] &
6397 if (!is_mcs_rate(rspec[0])
6405 rspec[k] &= ~RSPEC_BW_MASK;
6406 rspec[k] |= (PHY_TXC1_BW_20MHZ << RSPEC_BW_SHIFT);
6409 if (BRCMS_ISNPHY(wlc->band) && is_ofdm_rate(rspec[k])) {
6410 rspec[k] &= ~RSPEC_STF_MASK;
6411 rspec[k] |= phyctl1_stf << RSPEC_STF_SHIFT;
6420 /* (2) PROTECTION, may change rspec */
6428 brcms_c_compute_plcp(wlc, rspec[0], phylen, plcp);
6429 brcms_c_compute_plcp(wlc, rspec[1], phylen, plcp_fallback);
6434 if (is_cck_rate(rspec[1])) {
6440 mainrates = is_ofdm_rate(rspec[0]) ?
6448 brcms_c_compute_frame_dur(wlc, rspec[0], preamble_type[0],
6454 (u16) brcms_c_calc_frame_time(wlc, rspec[0],
6467 durid = brcms_c_compute_frame_dur(wlc, rspec[1],
6497 if (rspec2rate(rspec[1]) != BRCM_RATE_1M)
6536 rts_rspec[k] = brcms_c_rspec_to_rts_rspec(wlc, rspec[k],
6582 rspec[0], rts_preamble_type[0],
6587 rts_rspec[1], rspec[1],
6622 if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && is_mcs_rate(rspec))
6624 brcm_c_ampdu_null_delim_cnt(wlc->ampdu, scb, rspec, phylen);
6641 xfts = frametype(rspec[1], wlc->mimoft);
6649 phyctl = frametype(rspec[0], wlc->mimoft);
6652 if (rspec2rate(rspec[0]) != BRCM_RATE_1M)
6657 phyctl |= brcms_c_stf_d11hdrs_phyctl_txant(wlc, rspec[0]);
6664 phyctl1 = brcms_c_phytxctl1_calc(wlc, rspec[0]);
6666 phyctl1 = brcms_c_phytxctl1_calc(wlc, rspec[1]);
6681 if (is_mcs_rate(rspec[0]) &&
6684 brcms_c_calc_lsig_len(wlc, rspec[0], phylen);
6688 if (is_mcs_rate(rspec[1]) &&
6691 brcms_c_calc_lsig_len(wlc, rspec[1], phylen);
6703 brcms_c_calc_frame_time(wlc, rspec[0],
6725 brcms_c_compute_frame_dur(wlc, rspec[0],
6729 brcms_c_calc_frame_time(wlc, rspec[1],
6733 brcms_c_compute_frame_dur(wlc, rspec[1],
6754 rspec[0], preamble_type[0],
6774 rspec2rate(rspec[0]));
6885 brcms_c_rspec_to_rts_rspec(struct brcms_c_info *wlc, u32 rspec,
6892 rts_rspec = rspec;
6893 else if (wlc->band->gmode && wlc->protection->_g && !is_cck_rate(rspec))
6907 rts_rspec = brcms_basic_rate(wlc, rspec);
6914 * if rspec/rspec_fallback is 40MHz, then send RTS on both
6917 if (rspec_is40mhz(rspec) && !is_cck_rate(rts_rspec))
6997 u32 rspec;
7020 rspec = brcms_c_compute_rspec(rxh, plcp);
7021 if (is_mcs_rate(rspec)) {
7022 rx_status->rate_idx = rspec & RSPEC_RATE_MASK;
7024 if (rspec_is40mhz(rspec))
7027 switch (rspec2rate(rspec)) {
7078 if (is_cck_rate(rspec)) {
7081 } else if (is_ofdm_rate(rspec)) {
7250 /* Update the phytxctl for the beacon based on the rspec */