xref: /freebsd/sys/contrib/dev/iwlwifi/mvm/rs.h (revision 3f8cfb8a3a3b9fbe6d4aebde81aee80f8e89e2ea)
1bfcc09ddSBjoern A. Zeeb /*-
2*3f8cfb8aSBjoern A. Zeeb  * Copyright (c) 2020-2025 The FreeBSD Foundation
3bfcc09ddSBjoern A. Zeeb  *
4bfcc09ddSBjoern A. Zeeb  * This software was developed by Björn Zeeb under sponsorship from
5bfcc09ddSBjoern A. Zeeb  * the FreeBSD Foundation.
6bfcc09ddSBjoern A. Zeeb  *
7bfcc09ddSBjoern A. Zeeb  * Redistribution and use in source and binary forms, with or without
8bfcc09ddSBjoern A. Zeeb  * modification, are permitted provided that the following conditions
9bfcc09ddSBjoern A. Zeeb  * are met:
10bfcc09ddSBjoern A. Zeeb  * 1. Redistributions of source code must retain the above copyright
11bfcc09ddSBjoern A. Zeeb  *    notice, this list of conditions and the following disclaimer.
12bfcc09ddSBjoern A. Zeeb  * 2. Redistributions in binary form must reproduce the above copyright
13bfcc09ddSBjoern A. Zeeb  *    notice, this list of conditions and the following disclaimer in the
14bfcc09ddSBjoern A. Zeeb  *    documentation and/or other materials provided with the distribution.
15bfcc09ddSBjoern A. Zeeb  *
16bfcc09ddSBjoern A. Zeeb  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17bfcc09ddSBjoern A. Zeeb  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18bfcc09ddSBjoern A. Zeeb  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19bfcc09ddSBjoern A. Zeeb  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20bfcc09ddSBjoern A. Zeeb  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21bfcc09ddSBjoern A. Zeeb  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22bfcc09ddSBjoern A. Zeeb  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23bfcc09ddSBjoern A. Zeeb  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24bfcc09ddSBjoern A. Zeeb  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25bfcc09ddSBjoern A. Zeeb  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26bfcc09ddSBjoern A. Zeeb  * SUCH DAMAGE.
27bfcc09ddSBjoern A. Zeeb  *
28bfcc09ddSBjoern A. Zeeb  * $FreeBSD$
29bfcc09ddSBjoern A. Zeeb  */
30bfcc09ddSBjoern A. Zeeb 
31bfcc09ddSBjoern A. Zeeb /*
32bfcc09ddSBjoern A. Zeeb  * XXX-BZ:
33bfcc09ddSBjoern A. Zeeb  * This file is left as a wrapper to make mvm compile and we will only
34bfcc09ddSBjoern A. Zeeb  * deal with it on a need basis.  Most newer chipsets do this in firmware.
35bfcc09ddSBjoern A. Zeeb  */
36bfcc09ddSBjoern A. Zeeb 
37bfcc09ddSBjoern A. Zeeb #ifndef	_IWLWIFI_MVM_RS_H
38bfcc09ddSBjoern A. Zeeb #define	_IWLWIFI_MVM_RS_H
39bfcc09ddSBjoern A. Zeeb 
40bfcc09ddSBjoern A. Zeeb #include <net/mac80211.h>
41bfcc09ddSBjoern A. Zeeb 
42bfcc09ddSBjoern A. Zeeb #include "iwl-trans.h"
43bfcc09ddSBjoern A. Zeeb #include "fw-api.h"
44bfcc09ddSBjoern A. Zeeb 
45bfcc09ddSBjoern A. Zeeb #define	RS_NAME		"XXX_unknown"
46bfcc09ddSBjoern A. Zeeb 
47bfcc09ddSBjoern A. Zeeb #define	LINK_QUAL_AGG_FRAME_LIMIT_DEF		(64-1)
48bfcc09ddSBjoern A. Zeeb #define	LINK_QUAL_AGG_FRAME_LIMIT_GEN2_DEF	(256-1)
49bfcc09ddSBjoern A. Zeeb 
50bfcc09ddSBjoern A. Zeeb struct iwl_mvm;
51bfcc09ddSBjoern A. Zeeb 
52bfcc09ddSBjoern A. Zeeb struct iwl_lq_sta_rs_fw {
53bfcc09ddSBjoern A. Zeeb 	int	last_rate_n_flags;
54bfcc09ddSBjoern A. Zeeb 	struct {
55bfcc09ddSBjoern A. Zeeb 		struct iwl_mvm	*drv;
5692daf3a6SBjoern A. Zeeb 		uint8_t		sta_id;
5792daf3a6SBjoern A. Zeeb 		uint8_t		chains;
5892daf3a6SBjoern A. Zeeb 		uint8_t		chain_signal[IEEE80211_MAX_CHAINS];
5992daf3a6SBjoern A. Zeeb 		uint8_t		last_rssi;
6092daf3a6SBjoern A. Zeeb #ifdef CONFIG_MAC80211_DEBUGFS
6192daf3a6SBjoern A. Zeeb 		uint32_t	dbg_fixed_rate;
6292daf3a6SBjoern A. Zeeb 		uint32_t	dbg_agg_frame_count_lim;
6392daf3a6SBjoern A. Zeeb #endif
64bfcc09ddSBjoern A. Zeeb 	} pers;
65bfcc09ddSBjoern A. Zeeb };
66bfcc09ddSBjoern A. Zeeb 
67bfcc09ddSBjoern A. Zeeb struct iwl_lq_sta {
68bfcc09ddSBjoern A. Zeeb 	struct iwl_lq_cmd	lq;
69bfcc09ddSBjoern A. Zeeb 	struct {
70bfcc09ddSBjoern A. Zeeb 		spinlock_t	lock;
719af1bba4SBjoern A. Zeeb 		uint16_t	max_agg_bufsize;
72*3f8cfb8aSBjoern A. Zeeb 		/*
73*3f8cfb8aSBjoern A. Zeeb 		 * Based on the assumption that these are in "FW" too and
74*3f8cfb8aSBjoern A. Zeeb 		 * there is a f() to set last_rssi add them here too.
75*3f8cfb8aSBjoern A. Zeeb 		 */
76*3f8cfb8aSBjoern A. Zeeb 		uint8_t		chains;
77*3f8cfb8aSBjoern A. Zeeb 		uint8_t		chain_signal[IEEE80211_MAX_CHAINS];
78*3f8cfb8aSBjoern A. Zeeb 		uint8_t		last_rssi;
79bfcc09ddSBjoern A. Zeeb 	} pers;
80bfcc09ddSBjoern A. Zeeb };
81bfcc09ddSBjoern A. Zeeb 
82d9836fb4SBjoern A. Zeeb #define	RS_DRV_DATA_PACK(_c, _f)	((void *)(uintptr_t)(_c | (uintptr_t)(_f) << sizeof(_c)))	/* XXX TODO | ? */
83bfcc09ddSBjoern A. Zeeb 
84bfcc09ddSBjoern A. Zeeb struct iwl_mvm_sta;
859af1bba4SBjoern A. Zeeb struct iwl_mvm_link_sta;
86bfcc09ddSBjoern A. Zeeb 
8792daf3a6SBjoern A. Zeeb #ifdef CONFIG_IWLWIFI_DEBUGFS
8892daf3a6SBjoern A. Zeeb void iwl_mvm_reset_frame_stats(struct iwl_mvm *);
8992daf3a6SBjoern A. Zeeb #endif
9092daf3a6SBjoern A. Zeeb 
91bfcc09ddSBjoern A. Zeeb void iwl_mvm_rs_add_sta(struct iwl_mvm *, struct iwl_mvm_sta *);
92bfcc09ddSBjoern A. Zeeb void iwl_mvm_tlc_update_notif(struct iwl_mvm *, struct iwl_rx_cmd_buffer *);
939af1bba4SBjoern A. Zeeb u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *,
949af1bba4SBjoern A. Zeeb     struct ieee80211_bss_conf *, struct ieee80211_link_sta *);
95bfcc09ddSBjoern A. Zeeb void rs_fw_rate_init(struct iwl_mvm *, struct ieee80211_sta *,
96bfcc09ddSBjoern A. Zeeb     enum nl80211_band, bool);
97bfcc09ddSBjoern A. Zeeb int rs_fw_tx_protection(struct iwl_mvm *, struct iwl_mvm_sta *, bool);
98bfcc09ddSBjoern A. Zeeb int iwl_mvm_tx_protection(struct iwl_mvm *, struct iwl_mvm_sta *, bool);
99bfcc09ddSBjoern A. Zeeb 
100bfcc09ddSBjoern A. Zeeb int iwl_mvm_rate_control_register(void);
101bfcc09ddSBjoern A. Zeeb void iwl_mvm_rate_control_unregister(void);
1029af1bba4SBjoern A. Zeeb void iwl_mvm_rs_rate_init(struct iwl_mvm *, struct ieee80211_vif *,
1039af1bba4SBjoern A. Zeeb     struct ieee80211_sta *, struct ieee80211_bss_conf *,
1049af1bba4SBjoern A. Zeeb     struct ieee80211_link_sta *, enum nl80211_band);
1059af1bba4SBjoern A. Zeeb void iwl_mvm_rs_fw_rate_init(struct iwl_mvm *, struct ieee80211_vif *,
1069af1bba4SBjoern A. Zeeb     struct ieee80211_sta *, struct ieee80211_bss_conf *,
1079af1bba4SBjoern A. Zeeb     struct ieee80211_link_sta *, enum nl80211_band);
108bfcc09ddSBjoern A. Zeeb void iwl_mvm_rs_tx_status(struct iwl_mvm *, struct ieee80211_sta *,
109bfcc09ddSBjoern A. Zeeb     int, struct ieee80211_tx_info *, bool);
1109af1bba4SBjoern A. Zeeb void iwl_mvm_rs_add_sta_link(struct iwl_mvm *, struct iwl_mvm_link_sta *);
111bfcc09ddSBjoern A. Zeeb 
112bfcc09ddSBjoern A. Zeeb #endif	/* _IWLWIFI_MVM_RS_H */
113