Commit b2082124 authored by Kalle Valo's avatar Kalle Valo
Browse files
ath.git patches for v6.14

This development cycle featured multiple patchsets to ath12k to
support the new 802.11be MLO feature, although the feature is still
incomplete. Also in ath12k, there were other feature patches.  In
ath11k, support was added for QCA6698AQ. And there was the usual set
of bug fixes and cleanups across most drivers, notable being the
addition of "noinline_for_stack" to some functions to avoid "stack
frame size" warnings when compiling with clang.
parents f143cece da865679
Loading
Loading
Loading
Loading
+132 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.tx_ring_size = DP_TCL_DATA_RING_SIZE,
		.smp2p_wow_exit = false,
		.support_dual_stations = false,
		.pdev_suspend = false,
	},
	{
		.hw_rev = ATH11K_HW_IPQ6018_HW10,
@@ -207,6 +208,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = false,
		.support_dual_stations = false,
		.pdev_suspend = false,
	},
	{
		.name = "qca6390 hw2.0",
@@ -296,6 +298,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = true,
		.support_dual_stations = true,
		.pdev_suspend = false,
	},
	{
		.name = "qcn9074 hw1.0",
@@ -379,6 +382,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = false,
		.support_dual_stations = false,
		.pdev_suspend = false,
	},
	{
		.name = "wcn6855 hw2.0",
@@ -468,6 +472,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = true,
		.support_dual_stations = true,
		.pdev_suspend = false,
	},
	{
		.name = "wcn6855 hw2.1",
@@ -555,6 +560,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = true,
		.support_dual_stations = true,
		.pdev_suspend = false,
	},
	{
		.name = "wcn6750 hw1.0",
@@ -637,6 +643,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = true,
		.support_fw_mac_sequence = true,
		.support_dual_stations = false,
		.pdev_suspend = true,
	},
	{
		.hw_rev = ATH11K_HW_IPQ5018_HW10,
@@ -719,6 +726,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = false,
		.support_dual_stations = false,
		.pdev_suspend = false,
	},
	{
		.name = "qca2066 hw2.1",
@@ -809,6 +817,94 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
		.support_fw_mac_sequence = true,
		.support_dual_stations = true,
	},
	{
		.name = "qca6698aq hw2.1",
		.hw_rev = ATH11K_HW_QCA6698AQ_HW21,
		.fw = {
			.dir = "QCA6698AQ/hw2.1",
			.board_size = 256 * 1024,
			.cal_offset = 128 * 1024,
		},
		.max_radios = 3,
		.bdf_addr = 0x4B0C0000,
		.hw_ops = &wcn6855_ops,
		.ring_mask = &ath11k_hw_ring_mask_qca6390,
		.internal_sleep_clock = true,
		.regs = &wcn6855_regs,
		.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390,
		.host_ce_config = ath11k_host_ce_config_qca6390,
		.ce_count = 9,
		.target_ce_config = ath11k_target_ce_config_wlan_qca6390,
		.target_ce_count = 9,
		.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
		.svc_to_ce_map_len = 14,
		.single_pdev_only = true,
		.rxdma1_enable = false,
		.num_rxdma_per_pdev = 2,
		.rx_mac_buf_ring = true,
		.vdev_start_delay = true,
		.htt_peer_map_v2 = false,

		.spectral = {
			.fft_sz = 0,
			.fft_pad_sz = 0,
			.summary_pad_sz = 0,
			.fft_hdr_len = 0,
			.max_fft_bins = 0,
			.fragment_160mhz = false,
		},

		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
					BIT(NL80211_IFTYPE_AP) |
					BIT(NL80211_IFTYPE_P2P_DEVICE) |
					BIT(NL80211_IFTYPE_P2P_CLIENT) |
					BIT(NL80211_IFTYPE_P2P_GO),
		.supports_monitor = false,
		.supports_shadow_regs = true,
		.idle_ps = true,
		.supports_sta_ps = true,
		.coldboot_cal_mm = false,
		.coldboot_cal_ftm = false,
		.cbcal_restart_fw = false,
		.fw_mem_mode = 0,
		.num_vdevs = 2 + 1,
		.num_peers = 512,
		.supports_suspend = true,
		.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
		.supports_regdb = true,
		.fix_l1ss = false,
		.credit_flow = true,
		.max_tx_ring = DP_TCL_NUM_RING_MAX_QCA6390,
		.hal_params = &ath11k_hw_hal_params_qca6390,
		.supports_dynamic_smps_6ghz = false,
		.alloc_cacheable_memory = false,
		.supports_rssi_stats = true,
		.fw_wmi_diag_event = true,
		.current_cc_support = true,
		.dbr_debug_support = false,
		.global_reset = true,
		.bios_sar_capa = &ath11k_hw_sar_capa_wcn6855,
		.m3_fw_support = true,
		.fixed_bdf_addr = false,
		.fixed_mem_region = false,
		.static_window_map = false,
		.hybrid_bus_type = false,
		.fixed_fw_mem = false,
		.support_off_channel_tx = true,
		.supports_multi_bssid = true,

		.sram_dump = {
			.start = 0x01400000,
			.end = 0x0177ffff,
		},

		.tcl_ring_retry = true,
		.tx_ring_size = DP_TCL_DATA_RING_SIZE,
		.smp2p_wow_exit = false,
		.support_fw_mac_sequence = true,
		.support_dual_stations = true,
		.pdev_suspend = false,
	},
};

static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab)
@@ -1669,11 +1765,47 @@ static int ath11k_core_pdev_create(struct ath11k_base *ab)
	return ret;
}

static void ath11k_core_pdev_suspend_target(struct ath11k_base *ab)
{
	struct ath11k *ar;
	struct ath11k_pdev *pdev;
	unsigned long time_left;
	int ret;
	int i;

	if (!ab->hw_params.pdev_suspend)
		return;

	for (i = 0; i < ab->num_radios; i++) {
		pdev = &ab->pdevs[i];
		ar = pdev->ar;

		reinit_completion(&ab->htc_suspend);

		ret = ath11k_wmi_pdev_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR,
					      pdev->pdev_id);
		if (ret) {
			ath11k_warn(ab, "could not suspend target :%d\n", ret);
			/* pointless to try other pdevs */
			return;
		}

		time_left = wait_for_completion_timeout(&ab->htc_suspend, 3 * HZ);

		if (!time_left) {
			ath11k_warn(ab, "suspend timed out - target pause event never came\n");
			/* pointless to try other pdevs */
			return;
		}
	}
}

static void ath11k_core_pdev_destroy(struct ath11k_base *ab)
{
	ath11k_spectral_deinit(ab);
	ath11k_thermal_unregister(ab);
	ath11k_mac_unregister(ab);
	ath11k_core_pdev_suspend_target(ab);
	ath11k_hif_irq_disable(ab);
	ath11k_dp_pdev_free(ab);
	ath11k_debugfs_pdev_destroy(ab);
+1 −3
Original line number Diff line number Diff line
@@ -148,6 +148,7 @@ enum ath11k_hw_rev {
	ATH11K_HW_WCN6750_HW10,
	ATH11K_HW_IPQ5018_HW10,
	ATH11K_HW_QCA2066_HW21,
	ATH11K_HW_QCA6698AQ_HW21,
};

enum ath11k_firmware_mode {
@@ -340,7 +341,6 @@ struct ath11k_chan_power_info {
 * @ap_power_type: type of power (SP/LPI/VLP)
 * @num_pwr_levels: number of power levels
 * @reg_max: Array of maximum TX power (dBm) per PSD value
 * @ap_constraint_power: AP constraint power (dBm)
 * @tpe: TPE values processed from TPE IE
 * @chan_power_info: power info to send to firmware
 */
@@ -350,7 +350,6 @@ struct ath11k_reg_tpc_power_info {
	enum wmi_reg_6ghz_ap_type ap_power_type;
	u8 num_pwr_levels;
	u8 reg_max[ATH11K_NUM_PWR_LEVELS];
	u8 ap_constraint_power;
	s8 tpe[ATH11K_NUM_PWR_LEVELS];
	struct ath11k_chan_power_info chan_power_info[ATH11K_NUM_PWR_LEVELS];
};
@@ -370,7 +369,6 @@ struct ath11k_vif {
	struct ath11k *ar;
	struct ieee80211_vif *vif;

	u16 tx_seq_no;
	struct wmi_wmm_params_all_arg wmm_params;
	struct list_head list;
	union {
+0 −1
Original line number Diff line number Diff line
@@ -165,7 +165,6 @@ struct ath11k_mon_data {
	struct ath11k_pdev_mon_stats rx_mon_stats;
	/* lock for monitor data */
	spinlock_t mon_lock;
	struct sk_buff_head rx_status_q;
};

struct ath11k_pdev_dp {
+7 −7
Original line number Diff line number Diff line
@@ -3872,6 +3872,7 @@ int ath11k_dp_process_rx_err(struct ath11k_base *ab, struct napi_struct *napi,
		ath11k_hal_rx_msdu_link_info_get(link_desc_va, &num_msdus, msdu_cookies,
						 &rbm);
		if (rbm != HAL_RX_BUF_RBM_WBM_IDLE_DESC_LIST &&
		    rbm != HAL_RX_BUF_RBM_SW1_BM &&
		    rbm != HAL_RX_BUF_RBM_SW3_BM) {
			ab->soc_stats.invalid_rbm++;
			ath11k_warn(ab, "invalid return buffer manager %d\n", rbm);
@@ -4690,8 +4691,9 @@ static void ath11k_dp_mon_get_buf_len(struct hal_rx_msdu_desc_info *info,
	}
}

static u32
ath11k_dp_rx_mon_mpdu_pop(struct ath11k *ar, int mac_id,
/* clang stack usage explodes if this is inlined */
static noinline_for_stack
u32 ath11k_dp_rx_mon_mpdu_pop(struct ath11k *ar, int mac_id,
			      void *ring_entry, struct sk_buff **head_msdu,
			      struct sk_buff **tail_msdu, u32 *npackets,
			      u32 *ppdu_id)
@@ -5705,8 +5707,6 @@ static int ath11k_dp_rx_pdev_mon_status_attach(struct ath11k *ar)
	struct ath11k_pdev_dp *dp = &ar->dp;
	struct ath11k_mon_data *pmon = (struct ath11k_mon_data *)&dp->mon_data;

	skb_queue_head_init(&pmon->rx_status_q);

	pmon->mon_ppdu_status = DP_PPDU_STATUS_START;

	memset(&pmon->rx_mon_stats, 0,
+3 −3
Original line number Diff line number Diff line
@@ -700,7 +700,7 @@ enum hal_rx_buf_return_buf_manager {
#define HAL_REO_CMD_FLG_UNBLK_RESOURCE		BIT(7)
#define HAL_REO_CMD_FLG_UNBLK_CACHE		BIT(8)

/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO0_UPD_* feilds */
/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO0_UPD_* fields */
#define HAL_REO_CMD_UPD0_RX_QUEUE_NUM		BIT(8)
#define HAL_REO_CMD_UPD0_VLD			BIT(9)
#define HAL_REO_CMD_UPD0_ALDC			BIT(10)
@@ -725,7 +725,7 @@ enum hal_rx_buf_return_buf_manager {
#define HAL_REO_CMD_UPD0_PN_VALID		BIT(29)
#define HAL_REO_CMD_UPD0_PN			BIT(30)

/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO1_* feilds */
/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO1_* fields */
#define HAL_REO_CMD_UPD1_VLD			BIT(16)
#define HAL_REO_CMD_UPD1_ALDC			GENMASK(18, 17)
#define HAL_REO_CMD_UPD1_DIS_DUP_DETECTION	BIT(19)
@@ -741,7 +741,7 @@ enum hal_rx_buf_return_buf_manager {
#define HAL_REO_CMD_UPD1_PN_HANDLE_ENABLE	BIT(30)
#define HAL_REO_CMD_UPD1_IGNORE_AMPDU_FLG	BIT(31)

/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO2_* feilds */
/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO2_* fields */
#define HAL_REO_CMD_UPD2_SVLD			BIT(10)
#define HAL_REO_CMD_UPD2_SSN			GENMASK(22, 11)
#define HAL_REO_CMD_UPD2_SEQ_2K_ERR		BIT(23)
Loading