mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'wireless-next-2026-03-26' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next
Johannes Berg says: ==================== A fairly big set of changes all over, notably with: - cfg80211: new APIs for NAN (Neighbor Aware Networking, aka Wi-Fi Aware) so less work must be in firmware - mt76: - mt7996/mt7925 MLO fixes/improvements - mt7996 NPU support (HW eth/wifi traffic offload) - iwlwifi: UNII-9 and continuing UHR work * tag 'wireless-next-2026-03-26' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (230 commits) wifi: mac80211: ignore reserved bits in reconfiguration status wifi: cfg80211: allow protected action frame TX for NAN wifi: ieee80211: Add some missing NAN definitions wifi: nl80211: Add a notification to notify NAN channel evacuation wifi: nl80211: add NL80211_CMD_NAN_ULW_UPDATE notification wifi: nl80211: allow reporting spurious NAN Data frames wifi: cfg80211: allow ToDS=0/FromDS=0 data frames on NAN data interfaces wifi: nl80211: define an API for configuring the NAN peer's schedule wifi: nl80211: add support for NAN stations wifi: cfg80211: separately store HT, VHT and HE capabilities for NAN wifi: cfg80211: add support for NAN data interface wifi: cfg80211: make sure NAN chandefs are valid wifi: cfg80211: Add an API to configure local NAN schedule wifi: mac80211: cleanup error path of ieee80211_do_open wifi: mac80211: extract channel logic from link logic wifi: iwlwifi: mld: set RX_FLAG_RADIOTAP_TLV_AT_END generically wifi: iwlwifi: reduce the number of prints upon firmware crash wifi: iwlwifi: fix the description of SESSION_PROTECTION_CMD wifi: iwlwifi: mld: introduce iwl_mld_vif_fw_id_valid wifi: iwlwifi: mld: block EMLSR during TDLS connections ... ==================== Link: https://patch.msgid.link/20260326152021.305959-3-johannes@sipsolutions.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -1016,7 +1016,6 @@ static int ath10k_usb_probe(struct usb_interface *interface,
|
||||
|
||||
netif_napi_add(ar->napi_dev, &ar->napi, ath10k_usb_napi_poll);
|
||||
|
||||
usb_get_dev(dev);
|
||||
vendor_id = le16_to_cpu(dev->descriptor.idVendor);
|
||||
product_id = le16_to_cpu(dev->descriptor.idProduct);
|
||||
|
||||
@@ -1055,12 +1054,10 @@ err_usb_destroy:
|
||||
err:
|
||||
ath10k_core_destroy(ar);
|
||||
|
||||
usb_put_dev(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath10k_usb_remove(struct usb_interface *interface)
|
||||
static void ath10k_usb_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct ath10k_usb *ar_usb;
|
||||
|
||||
@@ -1071,7 +1068,6 @@ static void ath10k_usb_remove(struct usb_interface *interface)
|
||||
ath10k_core_unregister(ar_usb->ar);
|
||||
netif_napi_del(&ar_usb->ar->napi);
|
||||
ath10k_usb_destroy(ar_usb->ar);
|
||||
usb_put_dev(interface_to_usbdev(interface));
|
||||
ath10k_core_destroy(ar_usb->ar);
|
||||
}
|
||||
|
||||
@@ -1117,7 +1113,7 @@ static struct usb_driver ath10k_usb_driver = {
|
||||
.probe = ath10k_usb_probe,
|
||||
.suspend = ath10k_usb_pm_suspend,
|
||||
.resume = ath10k_usb_pm_resume,
|
||||
.disconnect = ath10k_usb_remove,
|
||||
.disconnect = ath10k_usb_disconnect,
|
||||
.id_table = ath10k_usb_ids,
|
||||
.supports_autosuspend = true,
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
#define ATH12K_ROOTPD_READY_TIMEOUT (5 * HZ)
|
||||
#define ATH12K_RPROC_AFTER_POWERUP QCOM_SSR_AFTER_POWERUP
|
||||
#define ATH12K_AHB_FW_PREFIX "q6_fw"
|
||||
#define ATH12K_AHB_FW_SUFFIX ".mdt"
|
||||
#define ATH12K_AHB_FW2 "iu_fw.mdt"
|
||||
#define ATH12K_AHB_FW_SUFFIX ".mbn"
|
||||
#define ATH12K_AHB_FW2 "iu_fw.mbn"
|
||||
#define ATH12K_AHB_UPD_SWID 0x12
|
||||
#define ATH12K_USERPD_SPAWN_TIMEOUT (5 * HZ)
|
||||
#define ATH12K_USERPD_READY_TIMEOUT (10 * HZ)
|
||||
|
||||
@@ -523,7 +523,7 @@ struct ath12k_sta {
|
||||
u16 links_map;
|
||||
u8 assoc_link_id;
|
||||
u16 ml_peer_id;
|
||||
u8 num_peer;
|
||||
u16 free_logical_link_idx_map;
|
||||
|
||||
enum ieee80211_sta_state state;
|
||||
};
|
||||
|
||||
@@ -205,16 +205,9 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,
|
||||
if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
|
||||
return;
|
||||
|
||||
if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON)) {
|
||||
if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON))
|
||||
is_ampdu =
|
||||
HTT_USR_CMPLTN_IS_AMPDU(usr_stats->cmpltn_cmn.flags);
|
||||
tx_retry_failed =
|
||||
__le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_tried) -
|
||||
__le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_success);
|
||||
tx_retry_count =
|
||||
HTT_USR_CMPLTN_LONG_RETRY(usr_stats->cmpltn_cmn.flags) +
|
||||
HTT_USR_CMPLTN_SHORT_RETRY(usr_stats->cmpltn_cmn.flags);
|
||||
}
|
||||
|
||||
if (usr_stats->tlv_flags &
|
||||
BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_ACK_BA_STATUS)) {
|
||||
@@ -223,10 +216,19 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,
|
||||
HTT_PPDU_STATS_ACK_BA_INFO_NUM_MSDU_M);
|
||||
tid = le32_get_bits(usr_stats->ack_ba.info,
|
||||
HTT_PPDU_STATS_ACK_BA_INFO_TID_NUM);
|
||||
}
|
||||
|
||||
if (common->fes_duration_us)
|
||||
tx_duration = le32_to_cpu(common->fes_duration_us);
|
||||
if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON)) {
|
||||
tx_retry_failed =
|
||||
__le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_tried) -
|
||||
__le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_success);
|
||||
tx_retry_count =
|
||||
HTT_USR_CMPLTN_LONG_RETRY(usr_stats->cmpltn_cmn.flags) +
|
||||
HTT_USR_CMPLTN_SHORT_RETRY(usr_stats->cmpltn_cmn.flags);
|
||||
}
|
||||
|
||||
if (common->fes_duration_us)
|
||||
tx_duration = le32_to_cpu(common->fes_duration_us);
|
||||
}
|
||||
|
||||
user_rate = &usr_stats->rate;
|
||||
flags = HTT_USR_RATE_PREAMBLE(user_rate->rate_flags);
|
||||
|
||||
@@ -268,21 +268,28 @@ enum hal_rx_reception_type {
|
||||
};
|
||||
|
||||
enum hal_rx_legacy_rate {
|
||||
HAL_RX_LEGACY_RATE_1_MBPS,
|
||||
HAL_RX_LEGACY_RATE_2_MBPS,
|
||||
HAL_RX_LEGACY_RATE_5_5_MBPS,
|
||||
HAL_RX_LEGACY_RATE_6_MBPS,
|
||||
HAL_RX_LEGACY_RATE_9_MBPS,
|
||||
HAL_RX_LEGACY_RATE_11_MBPS,
|
||||
HAL_RX_LEGACY_RATE_12_MBPS,
|
||||
HAL_RX_LEGACY_RATE_18_MBPS,
|
||||
HAL_RX_LEGACY_RATE_24_MBPS,
|
||||
HAL_RX_LEGACY_RATE_36_MBPS,
|
||||
HAL_RX_LEGACY_RATE_48_MBPS,
|
||||
HAL_RX_LEGACY_RATE_54_MBPS,
|
||||
HAL_RX_LEGACY_RATE_LP_1_MBPS,
|
||||
HAL_RX_LEGACY_RATE_LP_2_MBPS,
|
||||
HAL_RX_LEGACY_RATE_LP_5_5_MBPS,
|
||||
HAL_RX_LEGACY_RATE_LP_11_MBPS,
|
||||
HAL_RX_LEGACY_RATE_SP_2_MBPS,
|
||||
HAL_RX_LEGACY_RATE_SP_5_5_MBPS,
|
||||
HAL_RX_LEGACY_RATE_SP_11_MBPS,
|
||||
HAL_RX_LEGACY_RATE_INVALID,
|
||||
};
|
||||
|
||||
enum hal_rx_legacy_rates_ofdm {
|
||||
HAL_RX_LEGACY_RATE_OFDM_48_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_24_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_12_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_6_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_54_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_36_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_18_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_9_MBPS,
|
||||
HAL_RX_LEGACY_RATE_OFDM_INVALID,
|
||||
};
|
||||
|
||||
enum hal_ring_type {
|
||||
HAL_REO_DST,
|
||||
HAL_REO_EXCEPTION,
|
||||
|
||||
@@ -164,30 +164,31 @@ static const struct ieee80211_channel ath12k_6ghz_channels[] = {
|
||||
CHAN6G(233, 7115, 0),
|
||||
};
|
||||
|
||||
#define ATH12K_MAC_RATE_A_M(bps, code) \
|
||||
{ .bitrate = (bps), .hw_value = (code),\
|
||||
.flags = IEEE80211_RATE_MANDATORY_A }
|
||||
|
||||
#define ATH12K_MAC_RATE_B(bps, code, code_short) \
|
||||
{ .bitrate = (bps), .hw_value = (code), .hw_value_short = (code_short),\
|
||||
.flags = IEEE80211_RATE_SHORT_PREAMBLE }
|
||||
|
||||
static struct ieee80211_rate ath12k_legacy_rates[] = {
|
||||
{ .bitrate = 10,
|
||||
.hw_value = ATH12K_HW_RATE_CCK_LP_1M },
|
||||
{ .bitrate = 20,
|
||||
.hw_value = ATH12K_HW_RATE_CCK_LP_2M,
|
||||
.hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
|
||||
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
|
||||
{ .bitrate = 55,
|
||||
.hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
|
||||
.hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
|
||||
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
|
||||
{ .bitrate = 110,
|
||||
.hw_value = ATH12K_HW_RATE_CCK_LP_11M,
|
||||
.hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
|
||||
.flags = IEEE80211_RATE_SHORT_PREAMBLE },
|
||||
|
||||
{ .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
|
||||
{ .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
|
||||
{ .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
|
||||
{ .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
|
||||
{ .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
|
||||
{ .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
|
||||
{ .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
|
||||
{ .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
|
||||
ATH12K_MAC_RATE_B(20, ATH12K_HW_RATE_CCK_LP_2M,
|
||||
ATH12K_HW_RATE_CCK_SP_2M),
|
||||
ATH12K_MAC_RATE_B(55, ATH12K_HW_RATE_CCK_LP_5_5M,
|
||||
ATH12K_HW_RATE_CCK_SP_5_5M),
|
||||
ATH12K_MAC_RATE_B(110, ATH12K_HW_RATE_CCK_LP_11M,
|
||||
ATH12K_HW_RATE_CCK_SP_11M),
|
||||
ATH12K_MAC_RATE_A_M(60, ATH12K_HW_RATE_OFDM_6M),
|
||||
ATH12K_MAC_RATE_A_M(90, ATH12K_HW_RATE_OFDM_9M),
|
||||
ATH12K_MAC_RATE_A_M(120, ATH12K_HW_RATE_OFDM_12M),
|
||||
ATH12K_MAC_RATE_A_M(180, ATH12K_HW_RATE_OFDM_18M),
|
||||
ATH12K_MAC_RATE_A_M(240, ATH12K_HW_RATE_OFDM_24M),
|
||||
ATH12K_MAC_RATE_A_M(360, ATH12K_HW_RATE_OFDM_36M),
|
||||
ATH12K_MAC_RATE_A_M(480, ATH12K_HW_RATE_OFDM_48M),
|
||||
ATH12K_MAC_RATE_A_M(540, ATH12K_HW_RATE_OFDM_54M),
|
||||
};
|
||||
|
||||
static const int
|
||||
@@ -732,11 +733,17 @@ u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
|
||||
if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
|
||||
continue;
|
||||
|
||||
if (rate->hw_value == hw_rate)
|
||||
/* To handle 802.11a PPDU type */
|
||||
if ((!cck) && (rate->hw_value == hw_rate) &&
|
||||
(rate->flags & IEEE80211_RATE_MANDATORY_A))
|
||||
return i;
|
||||
/* To handle 802.11b short PPDU type */
|
||||
else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
|
||||
rate->hw_value_short == hw_rate)
|
||||
return i;
|
||||
/* To handle 802.11b long PPDU type */
|
||||
else if (rate->hw_value == hw_rate)
|
||||
return i;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -6786,6 +6793,8 @@ static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
|
||||
return;
|
||||
|
||||
ahsta->links_map &= ~BIT(link_id);
|
||||
ahsta->free_logical_link_idx_map |= BIT(arsta->link_idx);
|
||||
|
||||
rcu_assign_pointer(ahsta->link[link_id], NULL);
|
||||
synchronize_rcu();
|
||||
|
||||
@@ -7104,6 +7113,7 @@ static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
|
||||
struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct ath12k_link_vif *arvif;
|
||||
int link_idx;
|
||||
|
||||
lockdep_assert_wiphy(ah->hw->wiphy);
|
||||
|
||||
@@ -7122,8 +7132,16 @@ static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
|
||||
|
||||
ether_addr_copy(arsta->addr, link_sta->addr);
|
||||
|
||||
/* logical index of the link sta in order of creation */
|
||||
arsta->link_idx = ahsta->num_peer++;
|
||||
if (!ahsta->free_logical_link_idx_map)
|
||||
return -ENOSPC;
|
||||
|
||||
/*
|
||||
* Allocate a logical link index by selecting the first available bit
|
||||
* from the free logical index map
|
||||
*/
|
||||
link_idx = __ffs(ahsta->free_logical_link_idx_map);
|
||||
ahsta->free_logical_link_idx_map &= ~BIT(link_idx);
|
||||
arsta->link_idx = link_idx;
|
||||
|
||||
arsta->link_id = link_id;
|
||||
ahsta->links_map |= BIT(arsta->link_id);
|
||||
@@ -7632,6 +7650,7 @@ int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
|
||||
if (old_state == IEEE80211_STA_NOTEXIST &&
|
||||
new_state == IEEE80211_STA_NONE) {
|
||||
memset(ahsta, 0, sizeof(*ahsta));
|
||||
ahsta->free_logical_link_idx_map = U16_MAX;
|
||||
|
||||
arsta = &ahsta->deflink;
|
||||
|
||||
|
||||
@@ -405,6 +405,42 @@ ath12k_wifi7_dp_mon_hal_rx_parse_user_info(const struct hal_receive_user_info *r
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline u8
|
||||
ath12k_wifi7_hal_mon_map_legacy_rate_to_hw_rate(u8 rate)
|
||||
{
|
||||
u8 ath12k_rate;
|
||||
|
||||
/* Map hal_rx_legacy_rate to ath12k_hw_rate_cck */
|
||||
switch (rate) {
|
||||
case HAL_RX_LEGACY_RATE_LP_1_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_LP_1M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_LP_2_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_LP_2M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_LP_5_5_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_LP_5_5M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_LP_11_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_LP_11M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_SP_2_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_SP_2M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_SP_5_5_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_SP_5_5M;
|
||||
break;
|
||||
case HAL_RX_LEGACY_RATE_SP_11_MBPS:
|
||||
ath12k_rate = ATH12K_HW_RATE_CCK_SP_11M;
|
||||
break;
|
||||
default:
|
||||
ath12k_rate = rate;
|
||||
break;
|
||||
}
|
||||
|
||||
return ath12k_rate;
|
||||
}
|
||||
|
||||
static void
|
||||
ath12k_wifi7_dp_mon_parse_l_sig_b(const struct hal_rx_lsig_b_info *lsigb,
|
||||
struct hal_rx_mon_ppdu_info *ppdu_info)
|
||||
@@ -415,25 +451,32 @@ ath12k_wifi7_dp_mon_parse_l_sig_b(const struct hal_rx_lsig_b_info *lsigb,
|
||||
rate = u32_get_bits(info0, HAL_RX_LSIG_B_INFO_INFO0_RATE);
|
||||
switch (rate) {
|
||||
case 1:
|
||||
rate = HAL_RX_LEGACY_RATE_1_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_LP_1_MBPS;
|
||||
break;
|
||||
case 2:
|
||||
case 5:
|
||||
rate = HAL_RX_LEGACY_RATE_2_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_LP_2_MBPS;
|
||||
break;
|
||||
case 3:
|
||||
case 6:
|
||||
rate = HAL_RX_LEGACY_RATE_5_5_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_LP_5_5_MBPS;
|
||||
break;
|
||||
case 4:
|
||||
rate = HAL_RX_LEGACY_RATE_LP_11_MBPS;
|
||||
break;
|
||||
case 5:
|
||||
rate = HAL_RX_LEGACY_RATE_SP_2_MBPS;
|
||||
break;
|
||||
case 6:
|
||||
rate = HAL_RX_LEGACY_RATE_SP_5_5_MBPS;
|
||||
break;
|
||||
case 7:
|
||||
rate = HAL_RX_LEGACY_RATE_11_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_SP_11_MBPS;
|
||||
break;
|
||||
default:
|
||||
rate = HAL_RX_LEGACY_RATE_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
ppdu_info->rate = rate;
|
||||
ppdu_info->rate = ath12k_wifi7_hal_mon_map_legacy_rate_to_hw_rate(rate);
|
||||
ppdu_info->cck_flag = 1;
|
||||
}
|
||||
|
||||
@@ -447,31 +490,32 @@ ath12k_wifi7_dp_mon_parse_l_sig_a(const struct hal_rx_lsig_a_info *lsiga,
|
||||
rate = u32_get_bits(info0, HAL_RX_LSIG_A_INFO_INFO0_RATE);
|
||||
switch (rate) {
|
||||
case 8:
|
||||
rate = HAL_RX_LEGACY_RATE_48_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_48_MBPS;
|
||||
break;
|
||||
case 9:
|
||||
rate = HAL_RX_LEGACY_RATE_24_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_24_MBPS;
|
||||
break;
|
||||
case 10:
|
||||
rate = HAL_RX_LEGACY_RATE_12_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_12_MBPS;
|
||||
break;
|
||||
case 11:
|
||||
rate = HAL_RX_LEGACY_RATE_6_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_6_MBPS;
|
||||
break;
|
||||
case 12:
|
||||
rate = HAL_RX_LEGACY_RATE_54_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_54_MBPS;
|
||||
break;
|
||||
case 13:
|
||||
rate = HAL_RX_LEGACY_RATE_36_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_36_MBPS;
|
||||
break;
|
||||
case 14:
|
||||
rate = HAL_RX_LEGACY_RATE_18_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_18_MBPS;
|
||||
break;
|
||||
case 15:
|
||||
rate = HAL_RX_LEGACY_RATE_9_MBPS;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_9_MBPS;
|
||||
break;
|
||||
default:
|
||||
rate = HAL_RX_LEGACY_RATE_INVALID;
|
||||
rate = HAL_RX_LEGACY_RATE_OFDM_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
ppdu_info->rate = rate;
|
||||
|
||||
@@ -10017,50 +10017,46 @@ static int ath12k_connect_pdev_htc_service(struct ath12k_base *ab,
|
||||
|
||||
static int
|
||||
ath12k_wmi_send_unit_test_cmd(struct ath12k *ar,
|
||||
struct wmi_unit_test_cmd ut_cmd,
|
||||
u32 *test_args)
|
||||
const struct wmi_unit_test_arg *ut)
|
||||
{
|
||||
struct ath12k_wmi_pdev *wmi = ar->wmi;
|
||||
struct wmi_unit_test_cmd *cmd;
|
||||
int buf_len, arg_len;
|
||||
struct sk_buff *skb;
|
||||
struct wmi_tlv *tlv;
|
||||
__le32 *ut_cmd_args;
|
||||
void *ptr;
|
||||
u32 *ut_cmd_args;
|
||||
int buf_len, arg_len;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
arg_len = sizeof(u32) * le32_to_cpu(ut_cmd.num_args);
|
||||
buf_len = sizeof(ut_cmd) + arg_len + TLV_HDR_SIZE;
|
||||
arg_len = sizeof(*ut_cmd_args) * ut->num_args;
|
||||
buf_len = sizeof(*cmd) + arg_len + TLV_HDR_SIZE;
|
||||
|
||||
skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, buf_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
cmd = (struct wmi_unit_test_cmd *)skb->data;
|
||||
ptr = skb->data;
|
||||
cmd = ptr;
|
||||
cmd->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_UNIT_TEST_CMD,
|
||||
sizeof(ut_cmd));
|
||||
|
||||
cmd->vdev_id = ut_cmd.vdev_id;
|
||||
cmd->module_id = ut_cmd.module_id;
|
||||
cmd->num_args = ut_cmd.num_args;
|
||||
cmd->diag_token = ut_cmd.diag_token;
|
||||
|
||||
ptr = skb->data + sizeof(ut_cmd);
|
||||
sizeof(*cmd));
|
||||
cmd->vdev_id = cpu_to_le32(ut->vdev_id);
|
||||
cmd->module_id = cpu_to_le32(ut->module_id);
|
||||
cmd->num_args = cpu_to_le32(ut->num_args);
|
||||
cmd->diag_token = cpu_to_le32(ut->diag_token);
|
||||
|
||||
ptr += sizeof(*cmd);
|
||||
tlv = ptr;
|
||||
tlv->header = ath12k_wmi_tlv_hdr(WMI_TAG_ARRAY_UINT32, arg_len);
|
||||
|
||||
ptr += TLV_HDR_SIZE;
|
||||
|
||||
ut_cmd_args = ptr;
|
||||
for (i = 0; i < le32_to_cpu(ut_cmd.num_args); i++)
|
||||
ut_cmd_args[i] = test_args[i];
|
||||
for (i = 0; i < ut->num_args; i++)
|
||||
ut_cmd_args[i] = cpu_to_le32(ut->args[i]);
|
||||
|
||||
ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
||||
"WMI unit test : module %d vdev %d n_args %d token %d\n",
|
||||
cmd->module_id, cmd->vdev_id, cmd->num_args,
|
||||
cmd->diag_token);
|
||||
ut->module_id, ut->vdev_id, ut->num_args, ut->diag_token);
|
||||
|
||||
ret = ath12k_wmi_cmd_send(wmi, skb, WMI_UNIT_TEST_CMDID);
|
||||
|
||||
@@ -10076,8 +10072,7 @@ ath12k_wmi_send_unit_test_cmd(struct ath12k *ar,
|
||||
int ath12k_wmi_simulate_radar(struct ath12k *ar)
|
||||
{
|
||||
struct ath12k_link_vif *arvif;
|
||||
u32 dfs_args[DFS_MAX_TEST_ARGS];
|
||||
struct wmi_unit_test_cmd wmi_ut;
|
||||
struct wmi_unit_test_arg wmi_ut = {};
|
||||
bool arvif_found = false;
|
||||
|
||||
list_for_each_entry(arvif, &ar->arvifs, list) {
|
||||
@@ -10090,22 +10085,23 @@ int ath12k_wmi_simulate_radar(struct ath12k *ar)
|
||||
if (!arvif_found)
|
||||
return -EINVAL;
|
||||
|
||||
dfs_args[DFS_TEST_CMDID] = 0;
|
||||
dfs_args[DFS_TEST_PDEV_ID] = ar->pdev->pdev_id;
|
||||
/* Currently we could pass segment_id(b0 - b1), chirp(b2)
|
||||
wmi_ut.args[DFS_TEST_CMDID] = 0;
|
||||
wmi_ut.args[DFS_TEST_PDEV_ID] = ar->pdev->pdev_id;
|
||||
/*
|
||||
* Currently we could pass segment_id(b0 - b1), chirp(b2)
|
||||
* freq offset (b3 - b10) to unit test. For simulation
|
||||
* purpose this can be set to 0 which is valid.
|
||||
*/
|
||||
dfs_args[DFS_TEST_RADAR_PARAM] = 0;
|
||||
wmi_ut.args[DFS_TEST_RADAR_PARAM] = 0;
|
||||
|
||||
wmi_ut.vdev_id = cpu_to_le32(arvif->vdev_id);
|
||||
wmi_ut.module_id = cpu_to_le32(DFS_UNIT_TEST_MODULE);
|
||||
wmi_ut.num_args = cpu_to_le32(DFS_MAX_TEST_ARGS);
|
||||
wmi_ut.diag_token = cpu_to_le32(DFS_UNIT_TEST_TOKEN);
|
||||
wmi_ut.vdev_id = arvif->vdev_id;
|
||||
wmi_ut.module_id = DFS_UNIT_TEST_MODULE;
|
||||
wmi_ut.num_args = DFS_MAX_TEST_ARGS;
|
||||
wmi_ut.diag_token = DFS_UNIT_TEST_TOKEN;
|
||||
|
||||
ath12k_dbg(ar->ab, ATH12K_DBG_REG, "Triggering Radar Simulation\n");
|
||||
|
||||
return ath12k_wmi_send_unit_test_cmd(ar, wmi_ut, dfs_args);
|
||||
return ath12k_wmi_send_unit_test_cmd(ar, &wmi_ut);
|
||||
}
|
||||
|
||||
int ath12k_wmi_send_tpc_stats_request(struct ath12k *ar,
|
||||
|
||||
@@ -4193,7 +4193,6 @@ struct wmi_addba_clear_resp_cmd {
|
||||
struct ath12k_wmi_mac_addr_params peer_macaddr;
|
||||
} __packed;
|
||||
|
||||
#define DFS_PHYERR_UNIT_TEST_CMD 0
|
||||
#define DFS_UNIT_TEST_MODULE 0x2b
|
||||
#define DFS_UNIT_TEST_TOKEN 0xAA
|
||||
|
||||
@@ -4204,10 +4203,15 @@ enum dfs_test_args_idx {
|
||||
DFS_MAX_TEST_ARGS,
|
||||
};
|
||||
|
||||
struct wmi_dfs_unit_test_arg {
|
||||
u32 cmd_id;
|
||||
u32 pdev_id;
|
||||
u32 radar_param;
|
||||
/* update if another test command requires more */
|
||||
#define WMI_UNIT_TEST_ARGS_MAX DFS_MAX_TEST_ARGS
|
||||
|
||||
struct wmi_unit_test_arg {
|
||||
u32 vdev_id;
|
||||
u32 module_id;
|
||||
u32 diag_token;
|
||||
u32 num_args;
|
||||
u32 args[WMI_UNIT_TEST_ARGS_MAX];
|
||||
};
|
||||
|
||||
struct wmi_unit_test_cmd {
|
||||
|
||||
@@ -1124,8 +1124,6 @@ static int ath6kl_usb_probe(struct usb_interface *interface,
|
||||
int vendor_id, product_id;
|
||||
int ret = 0;
|
||||
|
||||
usb_get_dev(dev);
|
||||
|
||||
vendor_id = le16_to_cpu(dev->descriptor.idVendor);
|
||||
product_id = le16_to_cpu(dev->descriptor.idProduct);
|
||||
|
||||
@@ -1143,11 +1141,8 @@ static int ath6kl_usb_probe(struct usb_interface *interface,
|
||||
ath6kl_dbg(ATH6KL_DBG_USB, "USB 1.1 Host\n");
|
||||
|
||||
ar_usb = ath6kl_usb_create(interface);
|
||||
|
||||
if (ar_usb == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err_usb_put;
|
||||
}
|
||||
if (ar_usb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ar = ath6kl_core_create(&ar_usb->udev->dev);
|
||||
if (ar == NULL) {
|
||||
@@ -1176,15 +1171,12 @@ err_core_free:
|
||||
ath6kl_core_destroy(ar);
|
||||
err_usb_destroy:
|
||||
ath6kl_usb_destroy(ar_usb);
|
||||
err_usb_put:
|
||||
usb_put_dev(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath6kl_usb_remove(struct usb_interface *interface)
|
||||
static void ath6kl_usb_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
usb_put_dev(interface_to_usbdev(interface));
|
||||
ath6kl_usb_device_detached(interface);
|
||||
}
|
||||
|
||||
@@ -1235,7 +1227,7 @@ static struct usb_driver ath6kl_usb_driver = {
|
||||
.probe = ath6kl_usb_probe,
|
||||
.suspend = ath6kl_usb_pm_suspend,
|
||||
.resume = ath6kl_usb_pm_resume,
|
||||
.disconnect = ath6kl_usb_remove,
|
||||
.disconnect = ath6kl_usb_disconnect,
|
||||
.id_table = ath6kl_usb_ids,
|
||||
.supports_autosuspend = true,
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
|
||||
@@ -1630,16 +1630,6 @@ enum wmi_roam_mode {
|
||||
WMI_LOCK_BSS_MODE = 3, /* Lock to the current BSS */
|
||||
};
|
||||
|
||||
struct bss_bias {
|
||||
u8 bssid[ETH_ALEN];
|
||||
s8 bias;
|
||||
} __packed;
|
||||
|
||||
struct bss_bias_info {
|
||||
u8 num_bss;
|
||||
struct bss_bias bss_bias[];
|
||||
} __packed;
|
||||
|
||||
struct low_rssi_scan_params {
|
||||
__le16 lrssi_scan_period;
|
||||
a_sle16 lrssi_scan_threshold;
|
||||
@@ -1652,7 +1642,6 @@ struct roam_ctrl_cmd {
|
||||
union {
|
||||
u8 bssid[ETH_ALEN]; /* WMI_FORCE_ROAM */
|
||||
u8 roam_mode; /* WMI_SET_ROAM_MODE */
|
||||
struct bss_bias_info bss; /* WMI_SET_HOST_BIAS */
|
||||
struct low_rssi_scan_params params; /* WMI_SET_LRSSI_SCAN_PARAMS
|
||||
*/
|
||||
} __packed info;
|
||||
|
||||
@@ -1382,8 +1382,6 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
usb_get_dev(udev);
|
||||
|
||||
hif_dev->udev = udev;
|
||||
hif_dev->interface = interface;
|
||||
hif_dev->usb_device_id = id;
|
||||
@@ -1403,7 +1401,6 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
|
||||
err_fw_req:
|
||||
usb_set_intfdata(interface, NULL);
|
||||
kfree(hif_dev);
|
||||
usb_put_dev(udev);
|
||||
err_alloc:
|
||||
return ret;
|
||||
}
|
||||
@@ -1451,7 +1448,6 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
|
||||
|
||||
kfree(hif_dev);
|
||||
dev_info(&udev->dev, "ath9k_htc: USB layer deinitialized\n");
|
||||
usb_put_dev(udev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -837,18 +837,19 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
struct b43_dmaring *ring;
|
||||
int i, err;
|
||||
dma_addr_t dma_test;
|
||||
size_t nr_slots;
|
||||
|
||||
ring = kzalloc_obj(*ring);
|
||||
if (for_tx)
|
||||
nr_slots = B43_TXRING_SLOTS;
|
||||
else
|
||||
nr_slots = B43_RXRING_SLOTS;
|
||||
|
||||
ring = kzalloc_flex(*ring, meta, nr_slots);
|
||||
if (!ring)
|
||||
goto out;
|
||||
|
||||
ring->nr_slots = B43_RXRING_SLOTS;
|
||||
if (for_tx)
|
||||
ring->nr_slots = B43_TXRING_SLOTS;
|
||||
ring->nr_slots = nr_slots;
|
||||
|
||||
ring->meta = kzalloc_objs(struct b43_dmadesc_meta, ring->nr_slots);
|
||||
if (!ring->meta)
|
||||
goto err_kfree_ring;
|
||||
for (i = 0; i < ring->nr_slots; i++)
|
||||
ring->meta->skb = B43_DMA_PTR_POISON;
|
||||
|
||||
@@ -943,8 +944,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
err_kfree_txhdr_cache:
|
||||
kfree(ring->txhdr_cache);
|
||||
err_kfree_meta:
|
||||
kfree(ring->meta);
|
||||
err_kfree_ring:
|
||||
kfree(ring);
|
||||
ring = NULL;
|
||||
goto out;
|
||||
@@ -1004,7 +1003,6 @@ static void b43_destroy_dmaring(struct b43_dmaring *ring,
|
||||
free_ringmemory(ring);
|
||||
|
||||
kfree(ring->txhdr_cache);
|
||||
kfree(ring->meta);
|
||||
kfree(ring);
|
||||
}
|
||||
|
||||
|
||||
@@ -228,8 +228,6 @@ struct b43_dmaring {
|
||||
const struct b43_dma_ops *ops;
|
||||
/* Kernel virtual base address of the ring memory. */
|
||||
void *descbase;
|
||||
/* Meta data about all descriptors. */
|
||||
struct b43_dmadesc_meta *meta;
|
||||
/* Cache of TX headers for each TX frame.
|
||||
* This is to avoid an allocation on each TX.
|
||||
* This is NULL for an RX ring.
|
||||
@@ -273,6 +271,8 @@ struct b43_dmaring {
|
||||
/* Statistics: Total number of TX plus all retries. */
|
||||
u64 nr_total_packet_tries;
|
||||
#endif /* CONFIG_B43_DEBUG */
|
||||
/* Meta data about all descriptors. */
|
||||
struct b43_dmadesc_meta meta[] __counted_by(nr_slots);
|
||||
};
|
||||
|
||||
static inline u32 b43_dma_read(struct b43_dmaring *ring, u16 offset)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "fw/api/txq.h"
|
||||
|
||||
/* Highest firmware core release supported */
|
||||
#define IWL_BZ_UCODE_CORE_MAX 101
|
||||
#define IWL_BZ_UCODE_CORE_MAX 102
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_BZ_UCODE_API_MIN 100
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "fw/api/txq.h"
|
||||
|
||||
/* Highest firmware core release supported */
|
||||
#define IWL_DR_UCODE_CORE_MAX 101
|
||||
#define IWL_DR_UCODE_CORE_MAX 102
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_DR_UCODE_API_MIN 100
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "fw/api/txq.h"
|
||||
|
||||
/* Highest firmware core release supported */
|
||||
#define IWL_SC_UCODE_CORE_MAX 101
|
||||
#define IWL_SC_UCODE_CORE_MAX 102
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_SC_UCODE_API_MIN 100
|
||||
|
||||
@@ -504,7 +504,8 @@ iwl_acpi_parse_chains_table(union acpi_object *table,
|
||||
u8 num_chains, u8 num_sub_bands)
|
||||
{
|
||||
for (u8 chain = 0; chain < num_chains; chain++) {
|
||||
for (u8 subband = 0; subband < BIOS_SAR_MAX_SUB_BANDS_NUM;
|
||||
for (u8 subband = 0;
|
||||
subband < ARRAY_SIZE(chains[chain].subbands);
|
||||
subband++) {
|
||||
/* if we don't have the values, use the default */
|
||||
if (subband >= num_sub_bands) {
|
||||
@@ -534,7 +535,23 @@ int iwl_acpi_get_wrds_table(struct iwl_fw_runtime *fwrt)
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
/* start by trying to read revision 2 */
|
||||
/* start by trying to read revision 3 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_WRDS_WIFI_DATA_SIZE_REV3,
|
||||
&tbl_rev);
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev != 3) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
num_chains = ACPI_SAR_NUM_CHAINS_REV2;
|
||||
num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV3;
|
||||
|
||||
goto read_table;
|
||||
}
|
||||
|
||||
/* then try revision 2 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_WRDS_WIFI_DATA_SIZE_REV2,
|
||||
&tbl_rev);
|
||||
@@ -591,6 +608,13 @@ read_table:
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (WARN_ON(num_chains * num_sub_bands >
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains) *
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains[0].subbands))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
IWL_DEBUG_RADIO(fwrt, "Reading WRDS tbl_rev=%d\n", tbl_rev);
|
||||
|
||||
flags = wifi_pkg->package.elements[1].integer.value;
|
||||
@@ -624,7 +648,22 @@ int iwl_acpi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
/* start by trying to read revision 2 */
|
||||
/* start by trying to read revision 3 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_EWRD_WIFI_DATA_SIZE_REV3,
|
||||
&tbl_rev);
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev != 3) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV3;
|
||||
|
||||
goto read_table;
|
||||
}
|
||||
|
||||
/* then try revision 2 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_EWRD_WIFI_DATA_SIZE_REV2,
|
||||
&tbl_rev);
|
||||
@@ -679,6 +718,13 @@ read_table:
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (WARN_ON(ACPI_SAR_NUM_CHAINS_REV0 * num_sub_bands >
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains) *
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains[0].subbands))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
enabled = !!(wifi_pkg->package.elements[1].integer.value);
|
||||
n_profiles = wifi_pkg->package.elements[2].integer.value;
|
||||
|
||||
@@ -721,6 +767,13 @@ read_table:
|
||||
if (tbl_rev < 2)
|
||||
goto set_enabled;
|
||||
|
||||
if (WARN_ON(ACPI_SAR_NUM_CHAINS_REV0 * 2 * num_sub_bands >
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains) *
|
||||
ARRAY_SIZE(fwrt->sar_profiles[0].chains[0].subbands))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* parse cdb chains for all profiles */
|
||||
for (i = 0; i < n_profiles; i++) {
|
||||
struct iwl_sar_profile_chain *chains;
|
||||
@@ -759,6 +812,12 @@ int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt)
|
||||
u8 profiles;
|
||||
u8 min_profiles;
|
||||
} rev_data[] = {
|
||||
{
|
||||
.revisions = BIT(4),
|
||||
.bands = ACPI_GEO_NUM_BANDS_REV4,
|
||||
.profiles = ACPI_NUM_GEO_PROFILES_REV3,
|
||||
.min_profiles = BIOS_GEO_MIN_PROFILE_NUM,
|
||||
},
|
||||
{
|
||||
.revisions = BIT(3),
|
||||
.bands = ACPI_GEO_NUM_BANDS_REV2,
|
||||
@@ -812,6 +871,18 @@ int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt)
|
||||
num_bands = rev_data[idx].bands;
|
||||
num_profiles = rev_data[idx].profiles;
|
||||
|
||||
if (WARN_ON(num_profiles >
|
||||
ARRAY_SIZE(fwrt->geo_profiles))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (WARN_ON(num_bands >
|
||||
ARRAY_SIZE(fwrt->geo_profiles[0].bands))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (rev_data[idx].min_profiles) {
|
||||
/* read header that says # of profiles */
|
||||
union acpi_object *entry;
|
||||
@@ -851,18 +922,20 @@ int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt)
|
||||
|
||||
read_table:
|
||||
fwrt->geo_rev = tbl_rev;
|
||||
|
||||
for (i = 0; i < num_profiles; i++) {
|
||||
for (j = 0; j < BIOS_GEO_MAX_NUM_BANDS; j++) {
|
||||
struct iwl_geo_profile *prof = &fwrt->geo_profiles[i];
|
||||
|
||||
for (j = 0; j < ARRAY_SIZE(prof->bands); j++) {
|
||||
union acpi_object *entry;
|
||||
|
||||
/*
|
||||
* num_bands is either 2 or 3, if it's only 2 then
|
||||
* fill the third band (6 GHz) with the values from
|
||||
* 5 GHz (second band)
|
||||
* num_bands is either 2 or 3 or 4, if it's lower
|
||||
* than 4, fill the third band (6 GHz) with the values
|
||||
* from 5 GHz (second band)
|
||||
*/
|
||||
if (j >= num_bands) {
|
||||
fwrt->geo_profiles[i].bands[j].max =
|
||||
fwrt->geo_profiles[i].bands[1].max;
|
||||
prof->bands[j].max = prof->bands[1].max;
|
||||
} else {
|
||||
entry = &wifi_pkg->package.elements[entry_idx];
|
||||
entry_idx++;
|
||||
@@ -872,15 +945,17 @@ read_table:
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
fwrt->geo_profiles[i].bands[j].max =
|
||||
prof->bands[j].max =
|
||||
entry->integer.value;
|
||||
}
|
||||
|
||||
for (k = 0; k < BIOS_GEO_NUM_CHAINS; k++) {
|
||||
for (k = 0;
|
||||
k < ARRAY_SIZE(prof->bands[0].chains);
|
||||
k++) {
|
||||
/* same here as above */
|
||||
if (j >= num_bands) {
|
||||
fwrt->geo_profiles[i].bands[j].chains[k] =
|
||||
fwrt->geo_profiles[i].bands[1].chains[k];
|
||||
prof->bands[j].chains[k] =
|
||||
prof->bands[1].chains[k];
|
||||
} else {
|
||||
entry = &wifi_pkg->package.elements[entry_idx];
|
||||
entry_idx++;
|
||||
@@ -890,7 +965,7 @@ read_table:
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
fwrt->geo_profiles[i].bands[j].chains[k] =
|
||||
prof->bands[j].chains[k] =
|
||||
entry->integer.value;
|
||||
}
|
||||
}
|
||||
@@ -898,6 +973,7 @@ read_table:
|
||||
}
|
||||
|
||||
fwrt->geo_num_profiles = num_profiles;
|
||||
fwrt->geo_bios_source = BIOS_SOURCE_ACPI;
|
||||
fwrt->geo_enabled = true;
|
||||
ret = 0;
|
||||
out_free:
|
||||
@@ -915,6 +991,22 @@ int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
/* try to read ppag table rev 5 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V3, &tbl_rev);
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev == 5) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V3;
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"Reading PPAG table (tbl_rev=%d)\n",
|
||||
tbl_rev);
|
||||
goto read_table;
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
/* try to read ppag table rev 1 to 4 (all have the same data size) */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V2, &tbl_rev);
|
||||
@@ -950,6 +1042,15 @@ int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
|
||||
goto out_free;
|
||||
|
||||
read_table:
|
||||
if (WARN_ON_ONCE(num_sub_bands >
|
||||
ARRAY_SIZE(fwrt->ppag_chains[0].subbands))) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
BUILD_BUG_ON(ACPI_PPAG_NUM_CHAINS >
|
||||
ARRAY_SIZE(fwrt->ppag_chains));
|
||||
|
||||
fwrt->ppag_bios_rev = tbl_rev;
|
||||
flags = &wifi_pkg->package.elements[1];
|
||||
|
||||
@@ -966,7 +1067,7 @@ read_table:
|
||||
* first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
|
||||
* following sub-bands to High-Band (5GHz).
|
||||
*/
|
||||
for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
|
||||
for (i = 0; i < ACPI_PPAG_NUM_CHAINS; i++) {
|
||||
for (j = 0; j < num_sub_bands; j++) {
|
||||
union acpi_object *ent;
|
||||
|
||||
@@ -980,6 +1081,7 @@ read_table:
|
||||
}
|
||||
}
|
||||
|
||||
iwl_bios_print_ppag(fwrt, num_sub_bands);
|
||||
fwrt->ppag_bios_source = BIOS_SOURCE_ACPI;
|
||||
ret = 0;
|
||||
|
||||
|
||||
@@ -8,11 +8,6 @@
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include "fw/regulatory.h"
|
||||
#include "fw/api/commands.h"
|
||||
#include "fw/api/power.h"
|
||||
#include "fw/api/phy.h"
|
||||
#include "fw/api/nvm-reg.h"
|
||||
#include "fw/api/config.h"
|
||||
#include "fw/img.h"
|
||||
#include "iwl-trans.h"
|
||||
|
||||
@@ -44,6 +39,7 @@
|
||||
#define ACPI_SAR_NUM_SUB_BANDS_REV0 5
|
||||
#define ACPI_SAR_NUM_SUB_BANDS_REV1 11
|
||||
#define ACPI_SAR_NUM_SUB_BANDS_REV2 11
|
||||
#define ACPI_SAR_NUM_SUB_BANDS_REV3 12
|
||||
|
||||
#define ACPI_WRDS_WIFI_DATA_SIZE_REV0 (ACPI_SAR_NUM_CHAINS_REV0 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV0 + 2)
|
||||
@@ -51,6 +47,8 @@
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV1 + 2)
|
||||
#define ACPI_WRDS_WIFI_DATA_SIZE_REV2 (ACPI_SAR_NUM_CHAINS_REV2 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV2 + 2)
|
||||
#define ACPI_WRDS_WIFI_DATA_SIZE_REV3 (ACPI_SAR_NUM_CHAINS_REV2 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV3 + 2)
|
||||
#define ACPI_EWRD_WIFI_DATA_SIZE_REV0 ((ACPI_SAR_PROFILE_NUM - 1) * \
|
||||
ACPI_SAR_NUM_CHAINS_REV0 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV0 + 3)
|
||||
@@ -60,11 +58,15 @@
|
||||
#define ACPI_EWRD_WIFI_DATA_SIZE_REV2 ((ACPI_SAR_PROFILE_NUM - 1) * \
|
||||
ACPI_SAR_NUM_CHAINS_REV2 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV2 + 3)
|
||||
#define ACPI_EWRD_WIFI_DATA_SIZE_REV3 ((ACPI_SAR_PROFILE_NUM - 1) * \
|
||||
ACPI_SAR_NUM_CHAINS_REV2 * \
|
||||
ACPI_SAR_NUM_SUB_BANDS_REV3 + 3)
|
||||
#define ACPI_WPFC_WIFI_DATA_SIZE 5 /* domain and 4 filter config words */
|
||||
|
||||
/* revision 0 and 1 are identical, except for the semantics in the FW */
|
||||
#define ACPI_GEO_NUM_BANDS_REV0 2
|
||||
#define ACPI_GEO_NUM_BANDS_REV2 3
|
||||
#define ACPI_GEO_NUM_BANDS_REV4 4
|
||||
|
||||
#define ACPI_WRDD_WIFI_DATA_SIZE 2
|
||||
#define ACPI_SPLC_WIFI_DATA_SIZE 2
|
||||
@@ -96,10 +98,18 @@
|
||||
*/
|
||||
#define ACPI_WTAS_WIFI_DATA_SIZE (3 + IWL_WTAS_BLACK_LIST_MAX)
|
||||
|
||||
#define ACPI_PPAG_WIFI_DATA_SIZE_V1 ((IWL_NUM_CHAIN_LIMITS * \
|
||||
IWL_NUM_SUB_BANDS_V1) + 2)
|
||||
#define ACPI_PPAG_WIFI_DATA_SIZE_V2 ((IWL_NUM_CHAIN_LIMITS * \
|
||||
IWL_NUM_SUB_BANDS_V2) + 2)
|
||||
#define ACPI_PPAG_NUM_CHAINS 2
|
||||
#define ACPI_PPAG_NUM_BANDS_V1 5
|
||||
#define ACPI_PPAG_NUM_BANDS_V2 11
|
||||
#define ACPI_PPAG_NUM_BANDS_V3 12
|
||||
#define ACPI_PPAG_WIFI_DATA_SIZE_V1 ((ACPI_PPAG_NUM_CHAINS * \
|
||||
ACPI_PPAG_NUM_BANDS_V1) + 2)
|
||||
#define ACPI_PPAG_WIFI_DATA_SIZE_V2 ((ACPI_PPAG_NUM_CHAINS * \
|
||||
ACPI_PPAG_NUM_BANDS_V2) + 2)
|
||||
|
||||
/* used for ACPI PPAG table rev 5 */
|
||||
#define ACPI_PPAG_WIFI_DATA_SIZE_V3 ((ACPI_PPAG_NUM_CHAINS * \
|
||||
ACPI_PPAG_NUM_BANDS_V3) + 2)
|
||||
|
||||
#define IWL_SAR_ENABLE_MSK BIT(0)
|
||||
#define IWL_REDUCE_POWER_FLAGS_POS 1
|
||||
|
||||
@@ -56,7 +56,8 @@ enum iwl_data_path_subcmd_ids {
|
||||
RFH_QUEUE_CONFIG_CMD = 0xD,
|
||||
|
||||
/**
|
||||
* @TLC_MNG_CONFIG_CMD: &struct iwl_tlc_config_cmd_v4
|
||||
* @TLC_MNG_CONFIG_CMD: &struct iwl_tlc_config_cmd_v4 or
|
||||
* &struct iwl_tlc_config_cmd_v5 or &struct iwl_tlc_config_cmd.
|
||||
*/
|
||||
TLC_MNG_CONFIG_CMD = 0xF,
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user