Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8e626ad authored by Alexander Bondar's avatar Alexander Bondar Committed by Emmanuel Grumbach
Browse files

iwlwifi: mvm: update UAPSD support TLV bits



Change old UAPSD bit to PM_CMD_SUPPORT, and add a new bit to indicate
real UAPSD support.
Don't use UAPSD when the firmware doesn't support it.

Signed-off-by: default avatarDavid Spinadel <david.spinadel@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 246dd992
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,7 @@ enum iwl_ucode_tlv_flag {
	IWL_UCODE_TLV_FLAGS_P2P			= BIT(3),
	IWL_UCODE_TLV_FLAGS_P2P			= BIT(3),
	IWL_UCODE_TLV_FLAGS_DW_BC_TABLE		= BIT(4),
	IWL_UCODE_TLV_FLAGS_DW_BC_TABLE		= BIT(4),
	IWL_UCODE_TLV_FLAGS_NEWBT_COEX		= BIT(5),
	IWL_UCODE_TLV_FLAGS_NEWBT_COEX		= BIT(5),
	IWL_UCODE_TLV_FLAGS_UAPSD		= BIT(6),
	IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT	= BIT(6),
	IWL_UCODE_TLV_FLAGS_SHORT_BL		= BIT(7),
	IWL_UCODE_TLV_FLAGS_SHORT_BL		= BIT(7),
	IWL_UCODE_TLV_FLAGS_RX_ENERGY_API	= BIT(8),
	IWL_UCODE_TLV_FLAGS_RX_ENERGY_API	= BIT(8),
	IWL_UCODE_TLV_FLAGS_TIME_EVENT_API_V2	= BIT(9),
	IWL_UCODE_TLV_FLAGS_TIME_EVENT_API_V2	= BIT(9),
@@ -113,6 +113,7 @@ enum iwl_ucode_tlv_flag {
	IWL_UCODE_TLV_FLAGS_SCHED_SCAN		= BIT(17),
	IWL_UCODE_TLV_FLAGS_SCHED_SCAN		= BIT(17),
	IWL_UCODE_TLV_FLAGS_STA_KEY_CMD		= BIT(19),
	IWL_UCODE_TLV_FLAGS_STA_KEY_CMD		= BIT(19),
	IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD	= BIT(20),
	IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD	= BIT(20),
	IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT	= BIT(24),
};
};


/* The default calibrate table size if not specified by firmware file */
/* The default calibrate table size if not specified by firmware file */
+9 −5
Original line number Original line Diff line number Diff line
@@ -164,8 +164,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
		    IEEE80211_HW_TIMING_BEACON_ONLY |
		    IEEE80211_HW_TIMING_BEACON_ONLY |
		    IEEE80211_HW_CONNECTION_MONITOR |
		    IEEE80211_HW_CONNECTION_MONITOR |
		    IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
		    IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
		    IEEE80211_HW_SUPPORTS_STATIC_SMPS |
		    IEEE80211_HW_SUPPORTS_STATIC_SMPS;
		    IEEE80211_HW_SUPPORTS_UAPSD;


	hw->queues = mvm->first_agg_queue;
	hw->queues = mvm->first_agg_queue;
	hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
	hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
@@ -180,6 +179,12 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
	    !iwlwifi_mod_params.sw_crypto)
	    !iwlwifi_mod_params.sw_crypto)
		hw->flags |= IEEE80211_HW_MFP_CAPABLE;
		hw->flags |= IEEE80211_HW_MFP_CAPABLE;


	if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT) {
		hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD;
		hw->uapsd_queues = IWL_UAPSD_AC_INFO;
		hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
	}

	hw->sta_data_size = sizeof(struct iwl_mvm_sta);
	hw->sta_data_size = sizeof(struct iwl_mvm_sta);
	hw->vif_data_size = sizeof(struct iwl_mvm_vif);
	hw->vif_data_size = sizeof(struct iwl_mvm_vif);
	hw->chanctx_data_size = sizeof(u16);
	hw->chanctx_data_size = sizeof(u16);
@@ -204,8 +209,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)


	hw->wiphy->max_remain_on_channel_duration = 10000;
	hw->wiphy->max_remain_on_channel_duration = 10000;
	hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
	hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
	hw->uapsd_queues = IWL_UAPSD_AC_INFO;
	hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;


	/* Extract MAC address */
	/* Extract MAC address */
	memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
	memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
@@ -861,7 +864,8 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
		/* reset rssi values */
		/* reset rssi values */
		mvmvif->bf_data.ave_beacon_signal = 0;
		mvmvif->bf_data.ave_beacon_signal = 0;


		if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD)) {
		if (!(mvm->fw->ucode_capa.flags &
					IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)) {
			/* Workaround for FW bug, otherwise FW disables device
			/* Workaround for FW bug, otherwise FW disables device
			 * power save upon disassociation
			 * power save upon disassociation
			 */
			 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -459,7 +459,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
	if (err)
	if (err)
		goto out_unregister;
		goto out_unregister;


	if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD)
	if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)
		mvm->pm_ops = &pm_mac_ops;
		mvm->pm_ops = &pm_mac_ops;
	else
	else
		mvm->pm_ops = &pm_legacy_ops;
		mvm->pm_ops = &pm_legacy_ops;