Message ID | 20180119064551.10084-11-pkshih@realtek.com (mailing list archive) |
---|---|
State | Accepted |
Commit | a75f3eebfa3d7557d6bf240bb4fa84036b496a97 |
Delegated to: | Kalle Valo |
Headers | show |
On 01/19/2018 12:45 AM, pkshih@realtek.com wrote: > From: Ping-Ke Shih <pkshih@realtek.com> > > The field spec_ver is IC's specification mask for common code to do proper > process to specified IC. This commit add a field new rate ID for new > generation IC. > > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Acked-by: Larry Finger <Larry.Finger@lwfinger.net> > --- > drivers/net/wireless/realtek/rtlwifi/base.c | 126 +++++++++++++++++++++++++--- > drivers/net/wireless/realtek/rtlwifi/base.h | 2 + > drivers/net/wireless/realtek/rtlwifi/wifi.h | 5 ++ > 3 files changed, 121 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c > index 7fa435e95c0e..d6c03bd5cc65 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/base.c > +++ b/drivers/net/wireless/realtek/rtlwifi/base.c > @@ -698,14 +698,94 @@ static void _rtl_query_protection_mode(struct ieee80211_hw *hw, > } > } > > +u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index, > + enum wireless_mode wirelessmode) > +{ > + struct rtl_priv *rtlpriv = rtl_priv(hw); > + struct rtl_phy *rtlphy = &rtlpriv->phy; > + u8 ret = 0; > + > + switch (rate_index) { > + case RATR_INX_WIRELESS_NGB: > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_BGN_40M_1SS; > + else > + ret = RATEID_IDX_BGN_40M_2SS; > + ; break; > + case RATR_INX_WIRELESS_N: > + case RATR_INX_WIRELESS_NG: > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_GN_N1SS; > + else > + ret = RATEID_IDX_GN_N2SS; > + ; break; > + case RATR_INX_WIRELESS_NB: > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_BGN_20M_1SS_BN; > + else > + ret = RATEID_IDX_BGN_20M_2SS_BN; > + ; break; > + case RATR_INX_WIRELESS_GB: > + ret = RATEID_IDX_BG; > + break; > + case RATR_INX_WIRELESS_G: > + ret = RATEID_IDX_G; > + break; > + case RATR_INX_WIRELESS_B: > + ret = RATEID_IDX_B; > + break; > + case RATR_INX_WIRELESS_MC: > + if (wirelessmode == WIRELESS_MODE_B || > + wirelessmode == WIRELESS_MODE_G || > + wirelessmode == WIRELESS_MODE_N_24G || > + wirelessmode == WIRELESS_MODE_AC_24G) > + ret = RATEID_IDX_BG; > + else > + ret = RATEID_IDX_G; > + break; > + case RATR_INX_WIRELESS_AC_5N: > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_VHT_1SS; > + else > + ret = RATEID_IDX_VHT_2SS; > + break; > + case RATR_INX_WIRELESS_AC_24N: > + if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) { > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_VHT_1SS; > + else > + ret = RATEID_IDX_VHT_2SS; > + } else { > + if (rtlphy->rf_type == RF_1T1R) > + ret = RATEID_IDX_MIX1; > + else > + ret = RATEID_IDX_MIX2; > + } > + break; > + default: > + ret = RATEID_IDX_BGN_40M_2SS; > + break; > + } > + return ret; > +} > +EXPORT_SYMBOL(rtl_mrate_idx_to_arfr_id); > + > static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, > struct ieee80211_sta *sta, > struct rtl_tcb_desc *tcb_desc) > { > +#define SET_RATE_ID(rate_id) \ > + ({typeof(rate_id) _id = rate_id; \ > + ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ? \ > + rtl_mrate_idx_to_arfr_id(hw, _id, \ > + (sta_entry ? sta_entry->wireless_mode : \ > + WIRELESS_MODE_G)) : \ > + _id); }) > + > struct rtl_priv *rtlpriv = rtl_priv(hw); > struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); > struct rtl_sta_info *sta_entry = NULL; > - u8 ratr_index = 7; > + u8 ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC); > > if (sta) { > sta_entry = (struct rtl_sta_info *) sta->drv_priv; > @@ -720,7 +800,8 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, > tcb_desc->hw_rate = > rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M]; > tcb_desc->use_driver_rate = 1; > - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_MC); > } else { > tcb_desc->ratr_index = ratr_index; > } > @@ -736,22 +817,30 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, > mac->opmode == NL80211_IFTYPE_MESH_POINT) { > tcb_desc->mac_id = 0; > > - if (mac->mode == WIRELESS_MODE_AC_5G) > + if (sta && > + (rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID)) > + ; /* use sta_entry->ratr_index */ > + else if (mac->mode == WIRELESS_MODE_AC_5G) > tcb_desc->ratr_index = > - RATR_INX_WIRELESS_AC_5N; > + SET_RATE_ID(RATR_INX_WIRELESS_AC_5N); > else if (mac->mode == WIRELESS_MODE_AC_24G) > tcb_desc->ratr_index = > - RATR_INX_WIRELESS_AC_24N; > + SET_RATE_ID(RATR_INX_WIRELESS_AC_24N); > else if (mac->mode == WIRELESS_MODE_N_24G) > - tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_NGB); > else if (mac->mode == WIRELESS_MODE_N_5G) > - tcb_desc->ratr_index = RATR_INX_WIRELESS_NG; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_NG); > else if (mac->mode & WIRELESS_MODE_G) > - tcb_desc->ratr_index = RATR_INX_WIRELESS_GB; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_GB); > else if (mac->mode & WIRELESS_MODE_B) > - tcb_desc->ratr_index = RATR_INX_WIRELESS_B; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_B); > else if (mac->mode & WIRELESS_MODE_A) > - tcb_desc->ratr_index = RATR_INX_WIRELESS_G; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_G); > > } else if (mac->opmode == NL80211_IFTYPE_AP || > mac->opmode == NL80211_IFTYPE_ADHOC) { > @@ -765,6 +854,7 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, > } > } > } > +#undef SET_RATE_ID > } > > static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw, > @@ -1141,9 +1231,19 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, > struct ieee80211_sta *sta, > struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc) > { > +#define SET_RATE_ID(rate_id) \ > + ({typeof(rate_id) _id = rate_id; \ > + ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ? \ > + rtl_mrate_idx_to_arfr_id(hw, _id, \ > + (sta_entry ? sta_entry->wireless_mode : \ > + WIRELESS_MODE_G)) : \ > + _id); }) > + > struct rtl_priv *rtlpriv = rtl_priv(hw); > struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw)); > struct ieee80211_hdr *hdr = rtl_get_hdr(skb); > + struct rtl_sta_info *sta_entry = > + (sta ? (struct rtl_sta_info *)sta->drv_priv : NULL); > > __le16 fc = rtl_get_fc(skb); > > @@ -1166,7 +1266,8 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, > if (info->control.rates[0].idx == 0 || > ieee80211_is_nullfunc(fc)) { > tcb_desc->use_driver_rate = true; > - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; > + tcb_desc->ratr_index = > + SET_RATE_ID(RATR_INX_WIRELESS_MC); > > tcb_desc->disable_ratefallback = 1; > } else { > @@ -1208,11 +1309,12 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, > _rtl_query_protection_mode(hw, tcb_desc, info); > } else { > tcb_desc->use_driver_rate = true; > - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; > + tcb_desc->ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC); > tcb_desc->disable_ratefallback = 1; > tcb_desc->mac_id = 0; > tcb_desc->packet_bw = false; > } > +#undef SET_RATE_ID > } > EXPORT_SYMBOL(rtl_get_tcb_desc); > > diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h b/drivers/net/wireless/realtek/rtlwifi/base.h > index 26735319b38f..acc924635818 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/base.h > +++ b/drivers/net/wireless/realtek/rtlwifi/base.h > @@ -162,6 +162,8 @@ void rtl_c2hcmd_wq_callback(void *data); > void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec); > void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val); > > +u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index, > + enum wireless_mode wirelessmode); > void rtl_get_tcb_desc(struct ieee80211_hw *hw, > struct ieee80211_tx_info *info, > struct ieee80211_sta *sta, > diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h > index 2d8e96896f49..a7aacbc3984e 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h > +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h > @@ -949,6 +949,10 @@ enum package_type { > PACKAGE_TFBGA79 > }; > > +enum rtl_spec_ver { > + RTL_SPEC_NEW_RATEID = BIT(0), /* use ratr_table_mode_new */ > +}; > + > struct octet_string { > u8 *octet; > u16 length; > @@ -2333,6 +2337,7 @@ struct rtl_hal_cfg { > struct rtl_hal_ops *ops; > struct rtl_mod_params *mod_params; > struct rtl_hal_usbint_cfg *usb_interface_cfg; > + enum rtl_spec_ver spec_ver; > > /*this map used for some registers or vars > defined int HAL but used in MAIN */ >
On Mon, 2018-01-22 at 13:10 -0600, Larry Finger wrote: > On 01/19/2018 12:45 AM, pkshih@realtek.com wrote: > > > > From: Ping-Ke Shih <pkshih@realtek.com> > > > > The field spec_ver is IC's specification mask for common code to do proper > > process to specified IC. This commit add a field new rate ID for new > > generation IC. > > > > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> > Acked-by: Larry Finger <Larry.Finger@lwfinger.net> > Shall I append "Acked-by" in v2?
Pkshih <pkshih@realtek.com> writes: > On Mon, 2018-01-22 at 13:10 -0600, Larry Finger wrote: >> On 01/19/2018 12:45 AM, pkshih@realtek.com wrote: >> > >> > From: Ping-Ke Shih <pkshih@realtek.com> >> > >> > The field spec_ver is IC's specification mask for common code to do proper >> > process to specified IC. This commit add a field new rate ID for new >> > generation IC. >> > >> > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> >> Acked-by: Larry Finger <Larry.Finger@lwfinger.net> >> > > Shall I append "Acked-by" in v2? Yes, you can add Acked-by in the next version (if the patch in question is not modified after the ack). But do note that patchwork can automatically take Acked-by from the mailing list, for example that happened in the 9 patches I just applied from this series. So you no need to resend the rtlwifi patches for just to add the Acked-by line.
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c index 7fa435e95c0e..d6c03bd5cc65 100644 --- a/drivers/net/wireless/realtek/rtlwifi/base.c +++ b/drivers/net/wireless/realtek/rtlwifi/base.c @@ -698,14 +698,94 @@ static void _rtl_query_protection_mode(struct ieee80211_hw *hw, } } +u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index, + enum wireless_mode wirelessmode) +{ + struct rtl_priv *rtlpriv = rtl_priv(hw); + struct rtl_phy *rtlphy = &rtlpriv->phy; + u8 ret = 0; + + switch (rate_index) { + case RATR_INX_WIRELESS_NGB: + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_BGN_40M_1SS; + else + ret = RATEID_IDX_BGN_40M_2SS; + ; break; + case RATR_INX_WIRELESS_N: + case RATR_INX_WIRELESS_NG: + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_GN_N1SS; + else + ret = RATEID_IDX_GN_N2SS; + ; break; + case RATR_INX_WIRELESS_NB: + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_BGN_20M_1SS_BN; + else + ret = RATEID_IDX_BGN_20M_2SS_BN; + ; break; + case RATR_INX_WIRELESS_GB: + ret = RATEID_IDX_BG; + break; + case RATR_INX_WIRELESS_G: + ret = RATEID_IDX_G; + break; + case RATR_INX_WIRELESS_B: + ret = RATEID_IDX_B; + break; + case RATR_INX_WIRELESS_MC: + if (wirelessmode == WIRELESS_MODE_B || + wirelessmode == WIRELESS_MODE_G || + wirelessmode == WIRELESS_MODE_N_24G || + wirelessmode == WIRELESS_MODE_AC_24G) + ret = RATEID_IDX_BG; + else + ret = RATEID_IDX_G; + break; + case RATR_INX_WIRELESS_AC_5N: + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_VHT_1SS; + else + ret = RATEID_IDX_VHT_2SS; + break; + case RATR_INX_WIRELESS_AC_24N: + if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) { + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_VHT_1SS; + else + ret = RATEID_IDX_VHT_2SS; + } else { + if (rtlphy->rf_type == RF_1T1R) + ret = RATEID_IDX_MIX1; + else + ret = RATEID_IDX_MIX2; + } + break; + default: + ret = RATEID_IDX_BGN_40M_2SS; + break; + } + return ret; +} +EXPORT_SYMBOL(rtl_mrate_idx_to_arfr_id); + static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, struct ieee80211_sta *sta, struct rtl_tcb_desc *tcb_desc) { +#define SET_RATE_ID(rate_id) \ + ({typeof(rate_id) _id = rate_id; \ + ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ? \ + rtl_mrate_idx_to_arfr_id(hw, _id, \ + (sta_entry ? sta_entry->wireless_mode : \ + WIRELESS_MODE_G)) : \ + _id); }) + struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); struct rtl_sta_info *sta_entry = NULL; - u8 ratr_index = 7; + u8 ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC); if (sta) { sta_entry = (struct rtl_sta_info *) sta->drv_priv; @@ -720,7 +800,8 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, tcb_desc->hw_rate = rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M]; tcb_desc->use_driver_rate = 1; - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_MC); } else { tcb_desc->ratr_index = ratr_index; } @@ -736,22 +817,30 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, mac->opmode == NL80211_IFTYPE_MESH_POINT) { tcb_desc->mac_id = 0; - if (mac->mode == WIRELESS_MODE_AC_5G) + if (sta && + (rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID)) + ; /* use sta_entry->ratr_index */ + else if (mac->mode == WIRELESS_MODE_AC_5G) tcb_desc->ratr_index = - RATR_INX_WIRELESS_AC_5N; + SET_RATE_ID(RATR_INX_WIRELESS_AC_5N); else if (mac->mode == WIRELESS_MODE_AC_24G) tcb_desc->ratr_index = - RATR_INX_WIRELESS_AC_24N; + SET_RATE_ID(RATR_INX_WIRELESS_AC_24N); else if (mac->mode == WIRELESS_MODE_N_24G) - tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_NGB); else if (mac->mode == WIRELESS_MODE_N_5G) - tcb_desc->ratr_index = RATR_INX_WIRELESS_NG; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_NG); else if (mac->mode & WIRELESS_MODE_G) - tcb_desc->ratr_index = RATR_INX_WIRELESS_GB; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_GB); else if (mac->mode & WIRELESS_MODE_B) - tcb_desc->ratr_index = RATR_INX_WIRELESS_B; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_B); else if (mac->mode & WIRELESS_MODE_A) - tcb_desc->ratr_index = RATR_INX_WIRELESS_G; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_G); } else if (mac->opmode == NL80211_IFTYPE_AP || mac->opmode == NL80211_IFTYPE_ADHOC) { @@ -765,6 +854,7 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw, } } } +#undef SET_RATE_ID } static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw, @@ -1141,9 +1231,19 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, struct ieee80211_sta *sta, struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc) { +#define SET_RATE_ID(rate_id) \ + ({typeof(rate_id) _id = rate_id; \ + ((rtlpriv->cfg->spec_ver & RTL_SPEC_NEW_RATEID) ? \ + rtl_mrate_idx_to_arfr_id(hw, _id, \ + (sta_entry ? sta_entry->wireless_mode : \ + WIRELESS_MODE_G)) : \ + _id); }) + struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw)); struct ieee80211_hdr *hdr = rtl_get_hdr(skb); + struct rtl_sta_info *sta_entry = + (sta ? (struct rtl_sta_info *)sta->drv_priv : NULL); __le16 fc = rtl_get_fc(skb); @@ -1166,7 +1266,8 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, if (info->control.rates[0].idx == 0 || ieee80211_is_nullfunc(fc)) { tcb_desc->use_driver_rate = true; - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; + tcb_desc->ratr_index = + SET_RATE_ID(RATR_INX_WIRELESS_MC); tcb_desc->disable_ratefallback = 1; } else { @@ -1208,11 +1309,12 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, _rtl_query_protection_mode(hw, tcb_desc, info); } else { tcb_desc->use_driver_rate = true; - tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; + tcb_desc->ratr_index = SET_RATE_ID(RATR_INX_WIRELESS_MC); tcb_desc->disable_ratefallback = 1; tcb_desc->mac_id = 0; tcb_desc->packet_bw = false; } +#undef SET_RATE_ID } EXPORT_SYMBOL(rtl_get_tcb_desc); diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h b/drivers/net/wireless/realtek/rtlwifi/base.h index 26735319b38f..acc924635818 100644 --- a/drivers/net/wireless/realtek/rtlwifi/base.h +++ b/drivers/net/wireless/realtek/rtlwifi/base.h @@ -162,6 +162,8 @@ void rtl_c2hcmd_wq_callback(void *data); void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec); void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val); +u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index, + enum wireless_mode wirelessmode); void rtl_get_tcb_desc(struct ieee80211_hw *hw, struct ieee80211_tx_info *info, struct ieee80211_sta *sta, diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h index 2d8e96896f49..a7aacbc3984e 100644 --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h @@ -949,6 +949,10 @@ enum package_type { PACKAGE_TFBGA79 }; +enum rtl_spec_ver { + RTL_SPEC_NEW_RATEID = BIT(0), /* use ratr_table_mode_new */ +}; + struct octet_string { u8 *octet; u16 length; @@ -2333,6 +2337,7 @@ struct rtl_hal_cfg { struct rtl_hal_ops *ops; struct rtl_mod_params *mod_params; struct rtl_hal_usbint_cfg *usb_interface_cfg; + enum rtl_spec_ver spec_ver; /*this map used for some registers or vars defined int HAL but used in MAIN */