Merge "qcacmn: Rewrite util_gen_new_bssid functionality"
diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h
index 8050ba9..885b2a4 100644
--- a/dp/inc/cdp_txrx_cmn_struct.h
+++ b/dp/inc/cdp_txrx_cmn_struct.h
@@ -56,6 +56,7 @@
#define CDP_BA_64_BIT_MAP_SIZE_DWORDS 2
#define CDP_RSSI_CHAIN_LEN 8
+#define OL_TXRX_INVALID_PDEV_ID 0xff
#define OL_TXRX_INVALID_LOCAL_PEER_ID 0xffff
#define CDP_INVALID_VDEV_ID 0xff
/* Options for Dump Statistics */
diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h
index fef1029..14e0120 100644
--- a/dp/wifi3.0/dp_internal.h
+++ b/dp/wifi3.0/dp_internal.h
@@ -1417,6 +1417,19 @@
return (struct cdp_soc_t *)psoc;
}
+/**
+ * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to
+ * dp soc handle
+ * @psoc: CDP psoc handle
+ *
+ * Return: struct dp_soc pointer
+ */
+static inline
+struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc)
+{
+ return (struct dp_soc *)psoc;
+}
+
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
/**
* dp_rx_flow_update_fse_stats() - Update a flow's statistics
@@ -1502,4 +1515,39 @@
{
}
#endif /* WLAN_SUPPORT_RX_FLOW_TAG */
+
+/**
+ * dp_get_vdev_from_soc_vdev_id_wifi3() - Returns vdev object given the vdev id
+ * @soc: core DP soc context
+ * @vdev_id: vdev id from vdev object can be retrieved
+ *
+ * Return: struct dp_vdev*: Pointer to DP vdev object
+ */
+static inline struct dp_vdev *
+dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
+ uint8_t vdev_id)
+{
+ if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
+ return NULL;
+
+ return soc->vdev_id_map[vdev_id];
+}
+
+/**
+ * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id
+ * @soc: core DP soc context
+ * @pdev_id: pdev id from pdev object can be retrieved
+ *
+ * Return: struct dp_pdev*: Pointer to DP pdev object
+ */
+static inline struct dp_pdev *
+dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
+ uint8_t pdev_id)
+{
+ if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT))
+ return NULL;
+
+ return soc->pdev_list[pdev_id];
+}
+
#endif /* #ifndef _DP_INTERNAL_H_ */
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index 51d76e3..dcb62cb 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -4757,6 +4757,8 @@
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
}
+ soc->vdev_id_map[vdev_id] = vdev;
+
if (wlan_op_mode_monitor == vdev->opmode) {
pdev->monitor_vdev = vdev;
return (struct cdp_vdev *)vdev;
@@ -4982,6 +4984,8 @@
pdev = vdev->pdev;
soc = pdev->soc;
+ soc->vdev_id_map[vdev->vdev_id] = NULL;
+
if (wlan_op_mode_monitor == vdev->opmode)
goto free_vdev;
@@ -5854,6 +5858,8 @@
FLOW_TYPE_VDEV, vdev_id);
dp_tx_vdev_detach(vdev);
+ pdev->soc->vdev_id_map[vdev_id] = NULL;
+
qdf_spin_lock_bh(&pdev->vdev_list_lock);
TAILQ_REMOVE(&pdev->vdev_list, vdev, vdev_list_elem);
qdf_spin_unlock_bh(&pdev->vdev_list_lock);
@@ -9383,10 +9389,10 @@
static uint32_t dp_tx_get_success_ack_stats(struct cdp_pdev *pdev,
uint8_t vdev_id)
{
- struct dp_vdev *vdev =
- (struct dp_vdev *)dp_get_vdev_from_vdev_id_wifi3(pdev,
- vdev_id);
struct dp_soc *soc = ((struct dp_pdev *)pdev)->soc;
+ struct dp_vdev *vdev =
+ (struct dp_vdev *)dp_get_vdev_from_soc_vdev_id_wifi3(soc,
+ vdev_id);
struct cdp_vdev_stats *vdev_stats = NULL;
uint32_t tx_success;
@@ -9728,6 +9734,7 @@
soc->num_hw_dscp_tid_map = HAL_MAX_HW_DSCP_TID_MAPS;
wlan_set_srng_cfg(&soc->wlan_srng_cfg);
+ qdf_mem_zero(&soc->vdev_id_map, sizeof(soc->vdev_id_map));
soc->wlan_cfg_ctx = wlan_cfg_soc_attach(soc->ctrl_psoc);
if (!soc->wlan_cfg_ctx) {
diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h
index b3ad006..d67576d 100644
--- a/dp/wifi3.0/dp_peer.h
+++ b/dp/wifi3.0/dp_peer.h
@@ -149,41 +149,6 @@
struct dp_ast_entry *ase);
/*
- * dp_get_vdev_from_soc_vdev_id_wifi3() -
- * Returns vdev object given the vdev id
- * vdev id is unique across pdev's
- *
- * @soc : core DP soc context
- * @vdev_id : vdev id from vdev object can be retrieved
- *
- * Return: struct dp_vdev*: Pointer to DP vdev object
- */
-static inline struct dp_vdev *
-dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
- uint8_t vdev_id)
-{
- struct dp_pdev *pdev = NULL;
- struct dp_vdev *vdev = NULL;
- int i;
-
- for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) {
- pdev = soc->pdev_list[i];
- qdf_spin_lock_bh(&pdev->vdev_list_lock);
- TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
- if (vdev->vdev_id == vdev_id) {
- qdf_spin_unlock_bh(&pdev->vdev_list_lock);
- return vdev;
- }
- }
- qdf_spin_unlock_bh(&pdev->vdev_list_lock);
- }
- dp_err("Failed to find vdev for vdev_id %d", vdev_id);
-
- return NULL;
-
-}
-
-/*
* dp_peer_find_by_id_exist - check if peer exists for given id
* @soc: core DP soc context
* @peer_id: peer id from peer object can be retrieved
diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c
index 363f980..659c225 100644
--- a/dp/wifi3.0/dp_rx.c
+++ b/dp/wifi3.0/dp_rx.c
@@ -1649,9 +1649,46 @@
#endif
/**
+ * dp_rx_srng_get_num_pending() - get number of pending entries
+ * @hal_soc: hal soc opaque pointer
+ * @hal_ring: opaque pointer to the HAL Rx Ring
+ * @num_entries: number of entries in the hal_ring.
+ * @near_full: pointer to a boolean. This is set if ring is near full.
+ *
+ * The function returns the number of entries in a destination ring which are
+ * yet to be reaped. The function also checks if the ring is near full.
+ * If more than half of the ring needs to be reaped, the ring is considered
+ * approaching full.
+ * The function useses hal_srng_dst_num_valid_locked to get the number of valid
+ * entries. It should not be called within a SRNG lock. HW pointer value is
+ * synced into cached_hp.
+ *
+ * Return: Number of pending entries if any
+ */
+static
+uint32_t dp_rx_srng_get_num_pending(hal_soc_handle_t hal_soc,
+ hal_ring_handle_t hal_ring_hdl,
+ uint32_t num_entries,
+ bool *near_full)
+{
+ uint32_t num_pending = 0;
+
+ num_pending = hal_srng_dst_num_valid_locked(hal_soc,
+ hal_ring_hdl,
+ true);
+
+ if (num_entries && (num_pending >= num_entries >> 1))
+ *near_full = true;
+ else
+ *near_full = false;
+
+ return num_pending;
+}
+
+/**
* dp_rx_process() - Brain of the Rx processing functionality
* Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
- * @soc: core txrx main context
+ * @int_ctx: per interrupt context
* @hal_ring: opaque pointer to the HAL Rx Ring, which will be serviced
* @reo_ring_num: ring number (0, 1, 2 or 3) of the reo ring.
* @quota: No. of units (packets) that can be serviced in one shot.
@@ -1662,14 +1699,16 @@
* Return: uint32_t: No. of elements processed
*/
uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
- uint8_t reo_ring_num, uint32_t quota)
+ uint8_t reo_ring_num, uint32_t quota)
{
hal_ring_desc_t ring_desc;
hal_soc_handle_t hal_soc;
struct dp_rx_desc *rx_desc = NULL;
qdf_nbuf_t nbuf, next;
+ bool near_full;
union dp_rx_desc_list_elem_t *head[MAX_PDEV_CNT];
union dp_rx_desc_list_elem_t *tail[MAX_PDEV_CNT];
+ uint32_t num_pending;
uint32_t rx_bufs_used = 0, rx_buf_cookie;
uint32_t l2_hdr_offset = 0;
uint16_t msdu_len = 0;
@@ -1703,6 +1742,7 @@
bool is_prev_msdu_last = true;
uint32_t num_entries_avail = 0;
uint32_t rx_ol_pkt_cnt = 0;
+ uint32_t num_entries = 0;
DP_HIST_INIT();
@@ -1713,6 +1753,7 @@
scn = soc->hif_handle;
hif_pm_runtime_mark_dp_rx_busy(scn);
intr_id = int_ctx->dp_intr_id;
+ num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl);
more_data:
/* reset local variables here to be re-used in the function */
@@ -2196,12 +2237,23 @@
deliver_list_tail);
if (dp_rx_enable_eol_data_check(soc) && rx_bufs_used) {
- if (quota &&
- hal_srng_dst_peek_sync_locked(soc->hal_soc,
- hal_ring_hdl)) {
- DP_STATS_INC(soc, rx.hp_oos2, 1);
- if (!hif_exec_should_yield(scn, intr_id))
- goto more_data;
+ if (quota) {
+ num_pending =
+ dp_rx_srng_get_num_pending(hal_soc,
+ hal_ring_hdl,
+ num_entries,
+ &near_full);
+ if (num_pending) {
+ DP_STATS_INC(soc, rx.hp_oos2, 1);
+
+ if (!hif_exec_should_yield(scn, intr_id))
+ goto more_data;
+
+ if (qdf_unlikely(near_full)) {
+ DP_STATS_INC(soc, rx.near_full, 1);
+ goto more_data;
+ }
+ }
}
if (vdev && vdev->osif_gro_flush && rx_ol_pkt_cnt) {
diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c
index 218e8db..ef3b368 100644
--- a/dp/wifi3.0/dp_rx_err.c
+++ b/dp/wifi3.0/dp_rx_err.c
@@ -1834,3 +1834,153 @@
return work_done;
}
+
+static inline uint32_t
+dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
+ hal_rxdma_desc_t rxdma_dst_ring_desc,
+ union dp_rx_desc_list_elem_t **head,
+ union dp_rx_desc_list_elem_t **tail)
+{
+ void *rx_msdu_link_desc;
+ qdf_nbuf_t msdu;
+ qdf_nbuf_t last;
+ struct hal_rx_msdu_list msdu_list;
+ uint16_t num_msdus;
+ struct hal_buf_info buf_info;
+ void *p_buf_addr_info;
+ void *p_last_buf_addr_info;
+ uint32_t rx_bufs_used = 0;
+ uint32_t msdu_cnt;
+ uint32_t i;
+
+ msdu = 0;
+
+ last = NULL;
+
+ hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, &buf_info,
+ &p_last_buf_addr_info, &msdu_cnt);
+
+ do {
+ rx_msdu_link_desc =
+ dp_rx_cookie_2_link_desc_va(soc, &buf_info);
+
+ if (!rx_msdu_link_desc) {
+ DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC], 1);
+ break;
+ }
+
+ hal_rx_msdu_list_get(soc->hal_soc, rx_msdu_link_desc,
+ &msdu_list, &num_msdus);
+
+ if (msdu_list.sw_cookie[0] != HAL_RX_COOKIE_SPECIAL) {
+ for (i = 0; i < num_msdus; i++) {
+ struct dp_rx_desc *rx_desc =
+ dp_rx_cookie_2_va_rxdma_buf(
+ soc,
+ msdu_list.sw_cookie[i]);
+ qdf_assert_always(rx_desc);
+ msdu = rx_desc->nbuf;
+
+ qdf_nbuf_unmap_single(soc->osdev, msdu,
+ QDF_DMA_FROM_DEVICE);
+
+ qdf_nbuf_free(msdu);
+ rx_bufs_used++;
+ dp_rx_add_to_free_desc_list(head,
+ tail, rx_desc);
+ }
+ }
+
+ hal_rx_mon_next_link_desc_get(rx_msdu_link_desc, &buf_info,
+ &p_buf_addr_info);
+
+ dp_rx_link_desc_return(soc, p_last_buf_addr_info,
+ HAL_BM_ACTION_PUT_IN_IDLE_LIST);
+ p_last_buf_addr_info = p_buf_addr_info;
+
+ } while (buf_info.paddr);
+
+ return rx_bufs_used;
+}
+
+/*
+ *
+ * dp_handle_wbm_internal_error() - handles wbm_internal_error case
+ *
+ * @soc: core DP main context
+ * @hal_desc: hal descriptor
+ * @buf_type: indicates if the buffer is of type link disc or msdu
+ * Return: None
+ *
+ * wbm_internal_error is seen in following scenarios :
+ *
+ * 1. Null pointers detected in WBM_RELEASE_RING descriptors
+ * 2. Null pointers detected during delinking process
+ *
+ * Some null pointer cases:
+ *
+ * a. MSDU buffer pointer is NULL
+ * b. Next_MSDU_Link_Desc pointer is NULL, with no last msdu flag
+ * c. MSDU buffer pointer is NULL or Next_Link_Desc pointer is NULL
+ */
+void
+dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
+ uint32_t buf_type)
+{
+ struct hal_buf_info buf_info = {0};
+ struct dp_pdev *dp_pdev;
+ struct dp_rx_desc *rx_desc = NULL;
+ uint32_t rx_buf_cookie;
+ uint32_t rx_bufs_reaped = 0;
+ union dp_rx_desc_list_elem_t *head = NULL;
+ union dp_rx_desc_list_elem_t *tail = NULL;
+ uint8_t pool_id;
+
+ hal_rx_reo_buf_paddr_get(hal_desc, &buf_info);
+
+ if (!buf_info.paddr) {
+ DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER], 1);
+ return;
+ }
+
+ rx_buf_cookie = HAL_RX_REO_BUF_COOKIE_GET(hal_desc);
+ pool_id = DP_RX_DESC_COOKIE_POOL_ID_GET(rx_buf_cookie);
+
+ if (buf_type == HAL_WBM_RELEASE_RING_2_BUFFER_TYPE) {
+ DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF], 1);
+ rx_desc = dp_rx_cookie_2_va_rxdma_buf(soc, rx_buf_cookie);
+
+ if (rx_desc && rx_desc->nbuf) {
+ qdf_nbuf_unmap_single(soc->osdev, rx_desc->nbuf,
+ QDF_DMA_FROM_DEVICE);
+
+ rx_desc->unmapped = 1;
+
+ qdf_nbuf_free(rx_desc->nbuf);
+ dp_rx_add_to_free_desc_list(&head,
+ &tail,
+ rx_desc);
+
+ rx_bufs_reaped++;
+ }
+ } else if (buf_type == HAL_WBM_RELEASE_RING_2_DESC_TYPE) {
+ rx_bufs_reaped = dp_wbm_int_err_mpdu_pop(soc, pool_id,
+ hal_desc,
+ &head, &tail);
+ }
+
+ if (rx_bufs_reaped) {
+ struct rx_desc_pool *rx_desc_pool;
+ struct dp_srng *dp_rxdma_srng;
+
+ DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED], 1);
+ dp_pdev = soc->pdev_list[pool_id];
+ dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring;
+ rx_desc_pool = &soc->rx_desc_buf[pool_id];
+
+ dp_rx_buffers_replenish(soc, pool_id, dp_rxdma_srng,
+ rx_desc_pool,
+ rx_bufs_reaped,
+ &head, &tail);
+ }
+}
diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c
index 3c21c8b..4077be0 100644
--- a/dp/wifi3.0/dp_stats.c
+++ b/dp/wifi3.0/dp_stats.c
@@ -5068,6 +5068,8 @@
total_packets = 0;
DP_PRINT_STATS("Packets on ring %u:", ring);
for (core = 0; core < num_possible_cpus(); core++) {
+ if (!soc->stats.rx.ring_packets[core][ring])
+ continue;
DP_PRINT_STATS("Packets arriving on core %u: %llu",
core,
soc->stats.rx.ring_packets[core][ring]);
@@ -5154,11 +5156,14 @@
DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
pdev->stats.rx.to_stack.num,
pdev->stats.rx.to_stack.bytes);
- for (i = 0; i < CDP_MAX_RX_RINGS; i++)
+ for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
+ if (!pdev->stats.rx.rcvd_reo[i].num)
+ continue;
DP_PRINT_STATS(
"received on reo[%d] %u msdus( %llu bytes),",
i, pdev->stats.rx.rcvd_reo[i].num,
pdev->stats.rx.rcvd_reo[i].bytes);
+ }
DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
pdev->stats.rx.intra_bss.pkts.num,
pdev->stats.rx.intra_bss.pkts.bytes);
@@ -5187,6 +5192,7 @@
pdev->soc->stats.rx.err.pkt_delivered_no_peer);
DP_PRINT_STATS("Reo Statistics");
+ DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
DP_PRINT_STATS("rbm error: %u msdus",
pdev->soc->stats.rx.err.invalid_rbm);
DP_PRINT_STATS("hal ring access fail: %u msdus",
@@ -5597,8 +5603,12 @@
soc->stats.tx.tcl_ring_full[2]);
DP_PRINT_STATS("Tx invalid completion release = %d",
soc->stats.tx.invalid_release_source);
- DP_PRINT_STATS("Tx comp wbm internal error = %d",
- soc->stats.tx.wbm_internal_error);
+ DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
+ soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
+ soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
+ soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
+ soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
+ soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
soc->stats.tx.tx_comp_loop_pkt_limit_hit);
DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
@@ -5613,7 +5623,7 @@
DP_PRINT_STATS("INT: Total |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon |rx_err | wbm |reo_sta|rxdm2hst|hst2rxdm|");
for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
intr_stats = &soc->intr_ctx[i].intr_stats;
- DP_PRINT_STATS("%3u[%d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u",
+ DP_PRINT_STATS("%3u[%3d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u",
i,
hif_get_int_ctx_irq_num(soc->hif_handle, i),
intr_stats->num_masks,
@@ -5672,6 +5682,8 @@
DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
+ DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
+
DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
soc->stats.rx.reap_loop_pkt_limit_hit);
DP_PRINT_STATS("RX DESC invalid magic: %u",
diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c
index deb5334..86e59dd 100644
--- a/dp/wifi3.0/dp_tx.c
+++ b/dp/wifi3.0/dp_tx.c
@@ -3472,7 +3472,16 @@
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_ERROR,
"Tx comp wbm_internal_error!!!\n");
- DP_STATS_INC(soc, tx.wbm_internal_error, 1);
+ DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_ALL], 1);
+
+ if (HAL_TX_COMP_RELEASE_SOURCE_REO ==
+ buffer_src)
+ dp_handle_wbm_internal_error(
+ soc,
+ tx_comp_hal_desc,
+ hal_tx_comp_get_buffer_type(
+ tx_comp_hal_desc));
+
continue;
} else {
qdf_assert_always(0);
diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h
index 32466ff..e6fe1fe 100644
--- a/dp/wifi3.0/dp_tx.h
+++ b/dp/wifi3.0/dp_tx.h
@@ -330,6 +330,10 @@
#define DP_TX_TID_OVERRIDE(_msdu_info, _nbuf)
#endif
+void
+dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
+ uint32_t buf_type);
+
/* TODO TX_FEATURE_NOT_YET */
static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
{
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index 3870ac6..7120cfd 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -78,6 +78,13 @@
#define MAX_PDEV_CNT 3
#endif
+/* Max no. of VDEV per PSOC */
+#ifdef WLAN_PSOC_MAX_VDEVS
+#define MAX_VDEV_CNT WLAN_PSOC_MAX_VDEVS
+#else
+#define MAX_VDEV_CNT 51
+#endif
+
#define MAX_LINK_DESC_BANKS 8
#define MAX_TXDESC_POOLS 4
#define MAX_RXDESC_POOLS 4
@@ -88,6 +95,13 @@
#define DP_MAX_IRQ_PER_CONTEXT 12
#define DEFAULT_HW_PEER_ID 0xffff
+#define WBM_INT_ERROR_ALL 0
+#define WBM_INT_ERROR_REO_NULL_BUFFER 1
+#define WBM_INT_ERROR_REO_NULL_LINK_DESC 2
+#define WBM_INT_ERROR_REO_NULL_MSDU_BUFF 3
+#define WBM_INT_ERROR_REO_BUFF_REAPED 4
+#define MAX_WBM_INT_ERROR_REASONS 5
+
#define MAX_TX_HW_QUEUES MAX_TCL_DATA_RINGS
/* Maximum retries for Delba per tid per peer */
#define DP_MAX_DELBA_RETRY 3
@@ -662,7 +676,7 @@
/* tx completion release_src != TQM or FW */
uint32_t invalid_release_source;
/* tx completion wbm_internal_error */
- uint32_t wbm_internal_error;
+ uint32_t wbm_internal_error[MAX_WBM_INT_ERROR_REASONS];
/* TX Comp loop packet limit hit */
uint32_t tx_comp_loop_pkt_limit_hit;
/* Head pointer Out of sync at the end of dp_tx_comp_handler */
@@ -686,6 +700,8 @@
uint32_t reap_loop_pkt_limit_hit;
/* Head pointer Out of sync at the end of dp_rx_process */
uint32_t hp_oos2;
+ /* Rx ring near full */
+ uint32_t near_full;
struct {
/* Invalid RBM error count */
uint32_t invalid_rbm;
@@ -973,6 +989,9 @@
uint32_t wbm_idle_scatter_buf_size;
+ /* VDEVs on this SOC */
+ struct dp_vdev *vdev_id_map[MAX_VDEV_CNT];
+
/* Tx H/W queues lock */
qdf_spinlock_t tx_queue_lock[MAX_TX_HW_QUEUES];
diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h
index 20d2fc0..8b7b158 100644
--- a/hal/wifi3.0/hal_api.h
+++ b/hal/wifi3.0/hal_api.h
@@ -789,9 +789,10 @@
* @sync_hw_ptr: Sync cached head pointer with HW
*
*/
-static inline uint32_t hal_srng_dst_num_valid(void *hal_soc,
- hal_ring_handle_t hal_ring_hdl,
- int sync_hw_ptr)
+static inline
+uint32_t hal_srng_dst_num_valid(void *hal_soc,
+ hal_ring_handle_t hal_ring_hdl,
+ int sync_hw_ptr)
{
struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
uint32_t hp;
@@ -811,6 +812,33 @@
}
/**
+ * hal_srng_dst_num_valid_locked - Returns num valid entries to be processed
+ *
+ * @hal_soc: Opaque HAL SOC handle
+ * @hal_ring_hdl: Destination ring pointer
+ * @sync_hw_ptr: Sync cached head pointer with HW
+ *
+ * Returns number of valid entries to be processed by the host driver. The
+ * function takes up SRNG lock.
+ *
+ * Return: Number of valid destination entries
+ */
+static inline uint32_t
+hal_srng_dst_num_valid_locked(hal_soc_handle_t hal_soc,
+ hal_ring_handle_t hal_ring_hdl,
+ int sync_hw_ptr)
+{
+ uint32_t num_valid;
+ struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
+
+ SRNG_LOCK(&srng->lock);
+ num_valid = hal_srng_dst_num_valid(hal_soc, hal_ring_hdl, sync_hw_ptr);
+ SRNG_UNLOCK(&srng->lock);
+
+ return num_valid;
+}
+
+/**
* hal_srng_src_reap_next - Reap next entry from a source ring and move reap
* pointer. This can be used to release any buffers associated with completed
* ring entries. Note that this should not be used for posting new descriptor
@@ -1385,6 +1413,23 @@
}
/**
+ * hal_srng_get_num_entries - Get total entries in the HAL Srng
+ *
+ * @hal_soc: Opaque HAL SOC handle
+ * @hal_ring_hdl: Ring pointer (Source or Destination ring)
+ *
+ * Return: total number of entries in hal ring
+ */
+static inline
+uint32_t hal_srng_get_num_entries(hal_soc_handle_t hal_soc_hdl,
+ hal_ring_handle_t hal_ring_hdl)
+{
+ struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
+
+ return srng->num_entries;
+}
+
+/**
* hal_get_srng_params - Retrieve SRNG parameters for a given ring from HAL
*
* @hal_soc: Opaque HAL SOC handle
diff --git a/hal/wifi3.0/hal_tx.h b/hal/wifi3.0/hal_tx.h
index 0d263de..ea343ff 100644
--- a/hal/wifi3.0/hal_tx.h
+++ b/hal/wifi3.0/hal_tx.h
@@ -29,6 +29,8 @@
#define WBM_RELEASE_RING_5_TX_RATE_STATS_LSB 0
#define WBM_RELEASE_RING_5_TX_RATE_STATS_MASK 0xffffffff
+#define HAL_WBM_RELEASE_RING_2_BUFFER_TYPE 0
+#define HAL_WBM_RELEASE_RING_2_DESC_TYPE 1
/*---------------------------------------------------------------------------
Preprocessor definitions and constants
@@ -91,6 +93,7 @@
#define HAL_TX_COMPLETION_DESC_BASE_LEN 12
#define HAL_TX_COMP_RELEASE_SOURCE_TQM 0
+#define HAL_TX_COMP_RELEASE_SOURCE_REO 2
#define HAL_TX_COMP_RELEASE_SOURCE_FW 3
/* Define a place-holder release reason for FW */
diff --git a/hif/src/ce/ce_internal.h b/hif/src/ce/ce_internal.h
index 0dac6c3..a5edd14 100644
--- a/hif/src/ce/ce_internal.h
+++ b/hif/src/ce/ce_internal.h
@@ -427,6 +427,9 @@
* @HIF_CE_DEST_RING_BUFFER_POST: record the packet when buffer is posted to ce dst ring
* @HIF_CE_DEST_RING_BUFFER_REAP: record the packet when buffer is reaped from ce dst ring
* @HIF_CE_DEST_STATUS_RING_REAP: record the packet when status ring is reaped
+ * @HIF_RX_DESC_PRE_NBUF_ALLOC: record the packet before nbuf allocation
+ * @HIF_RX_DESC_PRE_NBUF_MAP: record the packet before nbuf map
+ * @HIF_RX_DESC_POST_NBUF_MAP: record the packet after nbuf map
*/
enum hif_ce_event_type {
HIF_RX_DESC_POST,
@@ -461,6 +464,10 @@
HIF_CE_DEST_RING_BUFFER_POST,
HIF_CE_DEST_RING_BUFFER_REAP,
HIF_CE_DEST_STATUS_RING_REAP,
+
+ HIF_RX_DESC_PRE_NBUF_ALLOC,
+ HIF_RX_DESC_PRE_NBUF_MAP,
+ HIF_RX_DESC_POST_NBUF_MAP,
};
void ce_init_ce_desc_event_log(struct hif_softc *scn, int ce_id, int size);
@@ -547,13 +554,16 @@
/**
* struct hif_ce_desc_event - structure for detailing a ce event
+ * @index: location of the descriptor in the ce ring;
* @type: what the event was
* @time: when it happened
* @current_hp: holds the current ring hp value
* @current_tp: holds the current ring tp value
* @descriptor: descriptor enqueued or dequeued
* @memory: virtual address that was used
- * @index: location of the descriptor in the ce ring;
+ * @dma_addr: physical/iova address based on smmu status
+ * @dma_to_phy: physical address from iova address
+ * @virt_to_phy: physical address from virtual address
* @actual_data_len: length of the data
* @data: data pointed by descriptor
*/
@@ -569,19 +579,25 @@
union ce_srng_desc descriptor;
#endif
void *memory;
+
+#ifdef HIF_RECORD_PADDR
+ /* iova/pa based on smmu status */
+ qdf_dma_addr_t dma_addr;
+ /* store pa from iova address */
+ qdf_dma_addr_t dma_to_phy;
+ /* store pa */
+ qdf_dma_addr_t virt_to_phy;
+#endif /* HIF_RECORD_ADDR */
+
#ifdef HIF_CE_DEBUG_DATA_BUF
size_t actual_data_len;
uint8_t *data;
#endif /* HIF_CE_DEBUG_DATA_BUF */
-
-#ifdef HIF_CONFIG_SLUB_DEBUG_ON
- qdf_dma_addr_t dma_to_phy;
- qdf_dma_addr_t virt_to_phy;
-#endif
};
#else
struct hif_ce_desc_event;
#endif /*#if defined(HIF_CONFIG_SLUB_DEBUG_ON)||defined(HIF_CE_DEBUG_DATA_BUF)*/
+
/**
* get_next_record_index() - get the next record index
* @table_index: atomic index variable to increment
@@ -615,25 +631,6 @@
union ce_srng_desc *descriptor,
void *memory, int index,
int len, void *hal_ring);
-#else
-static inline
-void hif_record_ce_srng_desc_event(struct hif_softc *scn, int ce_id,
- enum hif_ce_event_type type,
- union ce_srng_desc *descriptor,
- void *memory, int index,
- int len, void *hal_ring)
-{
-}
-#endif
-
-#ifdef HIF_CE_DEBUG_DATA_BUF
-/**
- * hif_ce_desc_data_record() - Record data pointed by the CE descriptor
- * @event: structure detailing a ce event
- * @len: length of the data
- * Return:
- */
-void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len);
/**
* hif_clear_ce_desc_debug_data() - Clear the contents of hif_ce_desc_event
@@ -644,6 +641,31 @@
* Return: None
*/
void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event);
+#else
+static inline
+void hif_record_ce_srng_desc_event(struct hif_softc *scn, int ce_id,
+ enum hif_ce_event_type type,
+ union ce_srng_desc *descriptor,
+ void *memory, int index,
+ int len, void *hal_ring)
+{
+}
+
+static inline
+void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event)
+{
+}
+#endif /* HIF_CONFIG_SLUB_DEBUG_ON || HIF_CE_DEBUG_DATA_BUF */
+
+#ifdef HIF_CE_DEBUG_DATA_BUF
+/**
+ * hif_ce_desc_data_record() - Record data pointed by the CE descriptor
+ * @event: structure detailing a ce event
+ * @len: length of the data
+ * Return:
+ */
+void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len);
+
QDF_STATUS alloc_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id);
void free_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id);
#else
@@ -660,8 +682,6 @@
void hif_ce_desc_data_record(struct hif_ce_desc_event *event, int len)
{
}
-
-void hif_clear_ce_desc_debug_data(struct hif_ce_desc_event *event);
#endif /*HIF_CE_DEBUG_DATA_BUF*/
#ifdef HIF_CONFIG_SLUB_DEBUG_ON
@@ -685,14 +705,14 @@
struct CE_state *ce_state)
{
}
-#endif
+#endif /* HIF_CONFIG_SLUB_DEBUG_ON */
-#if defined(HIF_CONFIG_SLUB_DEBUG_ON) && defined(HIF_RECORD_RX_PADDR)
+#if defined(HIF_RECORD_PADDR)
/**
* hif_ce_desc_record_rx_paddr() - record physical address for IOMMU
* IOVA addr and MMU virtual addr for Rx
* @scn: hif_softc
- * @event: structure detailing a ce event
+ * @nbuf: buffer posted to fw
*
* record physical address for ce_event_type HIF_RX_DESC_POST and
* HIF_RX_DESC_COMPLETION
@@ -700,12 +720,14 @@
* Return: none
*/
void hif_ce_desc_record_rx_paddr(struct hif_softc *scn,
- struct hif_ce_desc_event *event);
+ struct hif_ce_desc_event *event,
+ qdf_nbuf_t nbuf);
#else
static inline
void hif_ce_desc_record_rx_paddr(struct hif_softc *scn,
- struct hif_ce_desc_event *event)
+ struct hif_ce_desc_event *event,
+ qdf_nbuf_t nbuf)
{
}
-#endif
+#endif /* HIF_RECORD_PADDR */
#endif /* __COPY_ENGINE_INTERNAL_H__ */
diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c
index 47a9f6c..f5661a2 100644
--- a/hif/src/ce/ce_main.c
+++ b/hif/src/ce/ce_main.c
@@ -2410,6 +2410,7 @@
struct hif_softc *scn = HIF_GET_SOFTC(pipe_info->HIF_CE_state);
QDF_STATUS status;
uint32_t bufs_posted = 0;
+ unsigned int ce_id;
buf_sz = pipe_info->buf_sz;
if (buf_sz == 0) {
@@ -2418,6 +2419,7 @@
}
ce_hdl = pipe_info->ce_hdl;
+ ce_id = ((struct CE_state *)ce_hdl)->id;
qdf_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
while (atomic_read(&pipe_info->recv_bufs_needed) > 0) {
@@ -2427,6 +2429,9 @@
atomic_dec(&pipe_info->recv_bufs_needed);
qdf_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
+ hif_record_ce_desc_event(scn, ce_id,
+ HIF_RX_DESC_PRE_NBUF_ALLOC, NULL, NULL,
+ 0, 0);
nbuf = qdf_nbuf_alloc(scn->qdf_dev, buf_sz, 0, 4, false);
if (!nbuf) {
hif_post_recv_buffers_failure(pipe_info, nbuf,
@@ -2436,6 +2441,9 @@
return QDF_STATUS_E_NOMEM;
}
+ hif_record_ce_desc_event(scn, ce_id,
+ HIF_RX_DESC_PRE_NBUF_MAP, NULL, nbuf,
+ 0, 0);
/*
* qdf_nbuf_peek_header(nbuf, &data, &unused);
* CE_data = dma_map_single(dev, data, buf_sz, );
@@ -2454,7 +2462,9 @@
}
CE_data = qdf_nbuf_get_frag_paddr(nbuf, 0);
-
+ hif_record_ce_desc_event(scn, ce_id,
+ HIF_RX_DESC_POST_NBUF_MAP, NULL, nbuf,
+ 0, 0);
qdf_mem_dma_sync_single_for_device(scn->qdf_dev, CE_data,
buf_sz, DMA_FROM_DEVICE);
status = ce_recv_buf_enqueue(ce_hdl, (void *)nbuf, CE_data);
diff --git a/hif/src/ce/ce_service.c b/hif/src/ce/ce_service.c
index 4736539..2bd149e 100644
--- a/hif/src/ce/ce_service.c
+++ b/hif/src/ce/ce_service.c
@@ -139,36 +139,24 @@
{
qdf_mem_zero(event, sizeof(struct hif_ce_desc_event));
}
-#endif
+#endif /* HIF_CE_DEBUG_DATA_BUF */
-#if defined(HIF_CONFIG_SLUB_DEBUG_ON) && defined(HIF_RECORD_RX_PADDR)
-/**
- * hif_ce_desc_record_rx_paddr() - record physical address for IOMMU
- * IOVA addr and MMU virtual addr for Rx
- * @scn: hif_softc
- * @event: structure detailing a ce event
- *
- * Record physical address for ce event type HIF_RX_DESC_POST and
- * HIF_RX_DESC_COMPLETION
- *
- * Return: none
- */
+#if defined(HIF_RECORD_PADDR)
void hif_ce_desc_record_rx_paddr(struct hif_softc *scn,
- struct hif_ce_desc_event *event)
+ struct hif_ce_desc_event *event,
+ qdf_nbuf_t memory)
{
- if (event->type != HIF_RX_DESC_POST &&
- event->type != HIF_RX_DESC_COMPLETION)
- return;
-
- if (event->descriptor.dest_desc.buffer_addr)
+ if (memory) {
+ event->dma_addr = QDF_NBUF_CB_PADDR(memory);
event->dma_to_phy = qdf_mem_paddr_from_dmaaddr(
- scn->qdf_dev,
- event->descriptor.dest_desc.buffer_addr);
+ scn->qdf_dev,
+ event->dma_addr);
- if (event->memory)
- event->virt_to_phy = virt_to_phys(qdf_nbuf_data(event->memory));
+ event->virt_to_phy =
+ virt_to_phys(qdf_nbuf_data(memory));
+ }
}
-#endif
+#endif /* HIF_RECORD_RX_PADDR */
/**
* hif_record_ce_desc_event() - record ce descriptor events
@@ -217,12 +205,14 @@
if (descriptor)
qdf_mem_copy(&event->descriptor, descriptor,
- sizeof(union ce_srng_desc));
+ sizeof(union ce_desc));
event->memory = memory;
event->index = index;
- hif_ce_desc_record_rx_paddr(scn, event);
+ if (event->type == HIF_RX_DESC_POST ||
+ event->type == HIF_RX_DESC_COMPLETION)
+ hif_ce_desc_record_rx_paddr(scn, event, memory);
if (ce_hist->data_enable[ce_id])
hif_ce_desc_data_record(event, len);
diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c
index 7018f4c..4456f57 100644
--- a/hif/src/ce/ce_service_srng.c
+++ b/hif/src/ce/ce_service_srng.c
@@ -124,10 +124,13 @@
event->memory = memory;
event->index = index;
+ if (event->type == HIF_CE_SRC_RING_BUFFER_POST)
+ hif_ce_desc_record_rx_paddr(scn, event, memory);
+
if (ce_hist->data_enable[ce_id])
hif_ce_desc_data_record(event, len);
}
-#endif
+#endif /* HIF_CONFIG_SLUB_DEBUG_ON || HIF_CE_DEBUG_DATA_BUF */
static int
ce_send_nolock_srng(struct CE_handle *copyeng,
diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h
index 2de9b3e..13bb021 100644
--- a/os_if/linux/qca_vendor.h
+++ b/os_if/linux/qca_vendor.h
@@ -98,7 +98,11 @@
* @QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH: After roaming, send the
* roaming and auth information.
* @QCA_NL80211_VENDOR_SUBCMD_OCB_SET_SCHED: Set OCB schedule
- * @QCA_NL80211_VENDOR_SUBCMD_DO_ACS: ACS offload flag
+ *
+ * @QCA_NL80211_VENDOR_SUBCMD_DO_ACS: ACS command/event which is used to
+ * invoke the ACS function in device and pass selected channels to
+ * hostapd. Uses enum qca_wlan_vendor_attr_acs_offload attributes.
+ *
* @QCA_NL80211_VENDOR_SUBCMD_GET_FEATURES: Get the supported features by the
* driver.
* @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_STARTED: Indicate that driver
@@ -352,6 +356,9 @@
* binary blobs from application/service to firmware. The attributes
* defined in enum qca_wlan_vendor_attr_oem_data_params are used to
* deliver the parameters.
+ * @QCA_NL80211_VENDOR_SUBCMD_ADD_STA_NODE: This vendor subcommand is used to
+ * add the STA node details in driver/firmware. Attributes for this event
+ * are specified in enum qca_wlan_vendor_attr_add_sta_node_params.
*/
enum qca_nl80211_vendor_subcmds {
@@ -567,6 +574,7 @@
QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING = 180,
QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP = 181,
QCA_NL80211_VENDOR_SUBCMD_OEM_DATA = 182,
+ QCA_NL80211_VENDOR_SUBCMD_ADD_STA_NODE = 184,
};
enum qca_wlan_vendor_tos {
@@ -3503,45 +3511,52 @@
};
/**
- * enum qca_wlan_vendor_features - vendor device/driver features
+ * enum qca_wlan_vendor_features - Vendor device/driver feature flags
+ *
* @QCA_WLAN_VENDOR_FEATURE_KEY_MGMT_OFFLOAD: Device supports key
- * management offload, a mechanism where the station's firmware
- * does the exchange with the AP to establish the temporal keys
- * after roaming, rather than having the supplicant do it.
+ * management offload, a mechanism where the station's firmware
+ * does the exchange with the AP to establish the temporal keys
+ * after roaming, rather than having the user space wpa_supplicant do it.
+ * @QCA_WLAN_VENDOR_FEATURE_SUPPORT_HW_MODE_ANY: Device supports automatic
+ * band selection based on channel selection results.
* @QCA_WLAN_VENDOR_FEATURE_OFFCHANNEL_SIMULTANEOUS: Device supports
- * simultaneous off-channel operations.
- * @QQCA_WLAN_VENDOR_FEATURE_P2P_LISTEN_OFFLOAD: Device supports P2P
- * Listen offload; a mechanism where the station's firmware
- * takes care of responding to incoming Probe Request frames received
- * from other P2P devices whilst in Listen state, rather than having the
- * user space wpa_supplicant do it. Information from received P2P
- * Requests are forwarded from firmware to host whenever the APPS
- * processor exits power collapse state.
+ * simultaneous off-channel operations.
+ * @QCA_WLAN_VENDOR_FEATURE_P2P_LISTEN_OFFLOAD: Device supports P2P
+ * Listen offload; a mechanism where the station's firmware takes care of
+ * responding to incoming Probe Request frames received from other P2P
+ * Devices whilst in Listen state, rather than having the user space
+ * wpa_supplicant do it. Information from received P2P requests are
+ * forwarded from firmware to host whenever the host processor wakes up.
* @QCA_WLAN_VENDOR_FEATURE_OCE_STA: Device supports all OCE non-AP STA
- * specific features
+ * specific features.
* @QCA_WLAN_VENDOR_FEATURE_OCE_AP: Device supports all OCE AP specific
* features.
* @QCA_WLAN_VENDOR_FEATURE_OCE_STA_CFON: Device supports OCE STA-CFON
* specific features only. If a Device sets this bit but not the
- * QCA_WLAN_VENDOR_FEATURE_OCE_AP, the userspace shall assume that
+ * %QCA_WLAN_VENDOR_FEATURE_OCE_AP, the userspace shall assume that
* this Device may not support all OCE AP functionalities but can support
* only OCE STA-CFON functionalities.
* @QCA_WLAN_VENDOR_FEATURE_SELF_MANAGED_REGULATORY: Device supports self
* managed regulatory.
* @QCA_WLAN_VENDOR_FEATURE_TWT: Device supports TWT (Target Wake Time).
+ * @QCA_WLAN_VENDOR_FEATURE_11AX: Device supports 802.11ax (HE)
+ * @QCA_WLAN_VENDOR_FEATURE_6GHZ_SUPPORT: Device supports 6 GHz band operation
+ * @NUM_QCA_WLAN_VENDOR_FEATURES: Number of assigned feature bits
*/
enum qca_wlan_vendor_features {
QCA_WLAN_VENDOR_FEATURE_KEY_MGMT_OFFLOAD = 0,
QCA_WLAN_VENDOR_FEATURE_SUPPORT_HW_MODE_ANY = 1,
QCA_WLAN_VENDOR_FEATURE_OFFCHANNEL_SIMULTANEOUS = 2,
- QCA_WLAN_VENDOR_FEATURE_P2P_LISTEN_OFFLOAD = 3,
+ QCA_WLAN_VENDOR_FEATURE_P2P_LISTEN_OFFLOAD = 3,
QCA_WLAN_VENDOR_FEATURE_OCE_STA = 4,
QCA_WLAN_VENDOR_FEATURE_OCE_AP = 5,
QCA_WLAN_VENDOR_FEATURE_OCE_STA_CFON = 6,
QCA_WLAN_VENDOR_FEATURE_SELF_MANAGED_REGULATORY = 7,
QCA_WLAN_VENDOR_FEATURE_TWT = 8,
- /* Additional features need to be added above this */
- NUM_QCA_WLAN_VENDOR_FEATURES
+ QCA_WLAN_VENDOR_FEATURE_11AX = 9,
+ QCA_WLAN_VENDOR_FEATURE_6GHZ_SUPPORT = 10,
+
+ NUM_QCA_WLAN_VENDOR_FEATURES /* keep last */
};
/**
@@ -3589,41 +3604,155 @@
WIFI_LOGGER_DRIVER_DUMP_SUPPORTED = (1 << (7)),
WIFI_LOGGER_PACKET_FATE_SUPPORTED = (1 << (8))
};
+
/**
- * enum qca_wlan_vendor_attr_acs_offload
+ * enum qca_wlan_vendor_attr_acs_offload - Defines attributes to be used with
+ * vendor command/event QCA_NL80211_VENDOR_SUBCMD_DO_ACS.
*
- * @QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL: ACS selected primary channel
- * @QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL: ACS selected secondary channel
- * @QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE: hw_mode for ACS
- * @QCA_WLAN_VENDOR_ATTR_ACS_HT_ENABLED: indicate if HT capability is enabled
- * @QCA_WLAN_VENDOR_ATTR_ACS_HT40_ENABLED: indicate HT capability
+ * @QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL: Required (u8).
+ * Used with event to notify the primary channel number selected in ACS
+ * operation.
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL is deprecated; use
+ * QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_FREQUENCY instead.
+ * To maintain backward compatibility, QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL
+ * is still used if either of the driver or user space application doesn't
+ * support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL: Required (u8).
+ * Used with event to notify the secondary channel number selected in ACS
+ * operation.
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL is deprecated; use
+ * QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_FREQUENCY instead.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL is still used if either of
+ * the driver or user space application doesn't support 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE: Required (u8).
+ * (a) Used with command to configure hw_mode from
+ * enum qca_wlan_vendor_acs_hw_mode for ACS operation.
+ * (b) Also used with event to notify the hw_mode of selected primary channel
+ * in ACS operation.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_HT_ENABLED: Flag attribute.
+ * Used with command to configure ACS operation for HT mode.
+ * Disable (flag attribute not present) - HT disabled and
+ * Enable (flag attribute present) - HT enabled.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_HT40_ENABLED: Flag attribute.
+ * Used with command to configure ACS operation for HT40 mode.
+ * Disable (flag attribute not present) - HT40 disabled and
+ * Enable (flag attribute present) - HT40 enabled.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_VHT_ENABLED: Flag attribute.
+ * Used with command to configure ACS operation for VHT mode.
+ * Disable (flag attribute not present) - VHT disabled and
+ * Enable (flag attribute present) - VHT enabled.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH: Optional (u16) with command and
+ * mandatory with event.
+ * If specified in command path, ACS operation is configured with the given
+ * channel width (in MHz).
+ * In event path, specifies the channel width of the primary channel selected.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST: Required and type is NLA_UNSPEC.
+ * Used with command to configure channel list using an array of
+ * channel numbers (u8).
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * the driver mandates use of QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST whereas
+ * QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST is optional.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL: Required (u8).
+ * Used with event to notify the VHT segment 0 center channel number selected in
+ * ACS operation.
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL is deprecated; use
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_FREQUENCY instead.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL is still used if either of
+ * the driver or user space application doesn't support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL: Required (u8).
+ * Used with event to notify the VHT segment 1 center channel number selected in
+ * ACS operation.
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL is deprecated; use
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_FREQUENCY instead.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL is still used if either of
+ * the driver or user space application doesn't support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST: Required and type is NLA_UNSPEC.
+ * Used with command to configure the channel list using an array of channel
+ * center frequencies in MHz (u32).
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * the driver first parses the frequency list and if it fails to get a frequency
+ * list, parses the channel list specified using
+ * QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST (considers only 2 GHz and 5 GHz channels in
+ * QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST).
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_FREQUENCY: Required (u32).
+ * Used with event to notify the primary channel center frequency (MHz) selected
+ * in ACS operation.
+ * Note: If the driver supports the 6 GHz band, the event sent from the driver
+ * includes this attribute along with QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_FREQUENCY: Required (u32).
+ * Used with event to notify the secondary channel center frequency (MHz)
+ * selected in ACS operation.
+ * Note: If the driver supports the 6 GHz band, the event sent from the driver
+ * includes this attribute along with
+ * QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_FREQUENCY: Required (u32).
+ * Used with event to notify the VHT segment 0 center channel frequency (MHz)
+ * selected in ACS operation.
+ * Note: If the driver supports the 6 GHz band, the event sent from the driver
+ * includes this attribute along with
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_FREQUENCY: Required (u32).
+ * Used with event to notify the VHT segment 1 center channel frequency (MHz)
+ * selected in ACS operation.
+ * Note: If the driver supports the 6 GHz band, the event sent from the driver
+ * includes this attribute along with
+ * QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL.
*/
enum qca_wlan_vendor_attr_acs_offload {
QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_INVALID = 0,
- QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL,
- QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL,
- QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE,
- QCA_WLAN_VENDOR_ATTR_ACS_HT_ENABLED,
- QCA_WLAN_VENDOR_ATTR_ACS_HT40_ENABLED,
- QCA_WLAN_VENDOR_ATTR_ACS_VHT_ENABLED,
- QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH,
- QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST,
- QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL,
- QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL,
- QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST,
+ QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL = 1,
+ QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL = 2,
+ QCA_WLAN_VENDOR_ATTR_ACS_HW_MODE = 3,
+ QCA_WLAN_VENDOR_ATTR_ACS_HT_ENABLED = 4,
+ QCA_WLAN_VENDOR_ATTR_ACS_HT40_ENABLED = 5,
+ QCA_WLAN_VENDOR_ATTR_ACS_VHT_ENABLED = 6,
+ QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH = 7,
+ QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST = 8,
+ QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL = 9,
+ QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_CHANNEL = 10,
+ QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST = 11,
+ QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_FREQUENCY = 12,
+ QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_FREQUENCY = 13,
+ QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_FREQUENCY = 14,
+ QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG1_CENTER_FREQUENCY = 15,
+
/* keep last */
QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_ACS_MAX =
- QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST - 1
};
/**
- * enum qca_wlan_vendor_acs_hw_mode
+ * enum qca_wlan_vendor_acs_hw_mode - Defines HW mode to be used with the
+ * vendor command/event QCA_NL80211_VENDOR_SUBCMD_DO_ACS.
*
- * @QCA_ACS_MODE_IEEE80211B: 11b mode
- * @QCA_ACS_MODE_IEEE80211G: 11g mode
- * @QCA_ACS_MODE_IEEE80211A: 11a mode
- * @QCA_ACS_MODE_IEEE80211AD: 11ad mode
+ * @QCA_ACS_MODE_IEEE80211B: 802.11b mode
+ * @QCA_ACS_MODE_IEEE80211G: 802.11g mode
+ * @QCA_ACS_MODE_IEEE80211A: 802.11a mode
+ * @QCA_ACS_MODE_IEEE80211AD: 802.11ad mode
+ * @QCA_ACS_MODE_IEEE80211ANY: all modes
+ * @QCA_ACS_MODE_IEEE80211AX: 802.11ax mode
*/
enum qca_wlan_vendor_acs_hw_mode {
QCA_ACS_MODE_IEEE80211B,
@@ -3631,6 +3760,7 @@
QCA_ACS_MODE_IEEE80211A,
QCA_ACS_MODE_IEEE80211AD,
QCA_ACS_MODE_IEEE80211ANY,
+ QCA_ACS_MODE_IEEE80211AX,
};
/**
@@ -4295,6 +4425,10 @@
* antenna gain in dbm
* @QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_0: vht segment 0
* @QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_1: vht segment 1
+ * @QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_0: vht
+ * segment 0 in center freq in MHz.
+ * @QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_1: vht
+ * segment 1 in center freq in MHz.
*
*/
enum qca_wlan_vendor_external_acs_event_chan_info_attr {
@@ -4316,6 +4450,46 @@
*/
QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FLAGS_2 = 11,
+ /*
+ * VHT segment 0 in MHz (u32) and the attribute is mandatory.
+ * Note: Event QCA_NL80211_VENDOR_SUBCMD_EXTERNAL_ACS includes
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_0
+ * along with
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_0.
+ *
+ * If both the driver and user-space application supports the 6 GHz
+ * band, QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_0
+ * is deprecated and
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_0
+ * should be used.
+ *
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_0
+ * is still used if either of the driver or user space application
+ * doesn't support the 6 GHz band.
+ */
+ QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_0 = 12,
+
+ /*
+ * VHT segment 1 in MHz (u32) and the attribute is mandatory.
+ * Note: Event QCA_NL80211_VENDOR_SUBCMD_EXTERNAL_ACS includes
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_1
+ * along with
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_1.
+ *
+ * If both the driver and user-space application supports the 6 GHz
+ * band, QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_VHT_SEG_1
+ * is deprecated and
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_1
+ * should be considered.
+ *
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_1
+ * is still used if either of the driver or user space application
+ * doesn't support the 6 GHz band.
+ */
+ QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_FREQ_VHT_SEG_1 = 13,
+
/* keep last */
QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_LAST,
QCA_WLAN_VENDOR_EXTERNAL_ACS_EVENT_CHAN_INFO_ATTR_MAX =
@@ -4806,22 +4980,35 @@
};
/**
- * enum qca_wlan_vendor_attr_acs_config - Config params for ACS
- * @QCA_WLAN_VENDOR_ATTR_ACS_MODE_INVALID: Invalid
- * @QCA_WLAN_VENDOR_ATTR_ACS_DFS_MODE: Dfs mode for ACS
- * QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_HINT: channel_hint for ACS
- * QCA_WLAN_VENDOR_ATTR_ACS_DFS_AFTER_LAST: after_last
- * QCA_WLAN_VENDOR_ATTR_ACS_DFS_MAX: max attribute
+ * enum qca_wlan_vendor_attr_acs_config - Defines Configuration attributes
+ * used by the vendor command QCA_NL80211_VENDOR_SUBCMD_ACS_POLICY.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_DFS_MODE: Required (u8)
+ * DFS mode for ACS operation from enum qca_acs_dfs_mode.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_HINT: Required (u8)
+ * channel number hint for ACS operation, if valid channel is specified then
+ * ACS operation gives priority to this channel.
+ * Note: If both the driver and user space application supports the 6 GHz band,
+ * this attribute is deprecated and QCA_WLAN_VENDOR_ATTR_ACS_FREQUENCY_HINT
+ * should be used.
+ * To maintain backward compatibility, QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_HINT
+ * is still used if either of the driver or user space application doesn't
+ * support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_ACS_FREQUENCY_HINT: Required (u32).
+ * Channel center frequency (MHz) hint for ACS operation, if a valid center
+ * frequency is specified, ACS operation gives priority to this channel.
*/
enum qca_wlan_vendor_attr_acs_config {
QCA_WLAN_VENDOR_ATTR_ACS_MODE_INVALID = 0,
- QCA_WLAN_VENDOR_ATTR_ACS_DFS_MODE,
- QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_HINT,
+ QCA_WLAN_VENDOR_ATTR_ACS_DFS_MODE = 1,
+ QCA_WLAN_VENDOR_ATTR_ACS_CHANNEL_HINT = 2,
+ QCA_WLAN_VENDOR_ATTR_ACS_FREQUENCY_HINT = 3,
QCA_WLAN_VENDOR_ATTR_ACS_DFS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_ACS_DFS_MAX =
QCA_WLAN_VENDOR_ATTR_ACS_DFS_AFTER_LAST - 1,
-
};
/**
@@ -4938,22 +5125,34 @@
};
/**
- * enum qca_wlan_vendor_attr_sap_config - config params for sap configuration
- * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_INVALID: invalid
- * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL: Channel on which SAP should start
- * @QCA_WLAN_VENDOR_ATTR_SAP_MANDATORY_FREQUENCY_LIST: List of frequencies on
- * which AP is expected to operate. This is irrespective of ACS configuration.
- * This list is a priority based one and is looked for before the AP is created
- * to ensure the best concurrency sessions (avoid MCC and use DBS/SCC) co-exist
- * in the system.
- * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST: after last
- * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX: max attribute
+ * enum qca_wlan_vendor_attr_sap_config - Parameters for AP configuration
+ *
+ * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL: Optional (u8)
+ * Channel number on which Access Point should restart.
+ * Note: If both the driver and user space application supports the 6 GHz band,
+ * this attribute is deprecated and QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_FREQUENCY
+ * should be used.
+ * To maintain backward compatibility, QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL
+ * is still used if either of the driver or user space application doesn't
+ * support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_SAP_MANDATORY_FREQUENCY_LIST: Required
+ * Nested attribute to hold list of center frequencies on which AP is
+ * expected to operate. This is irrespective of ACS configuration.
+ * This list is a priority based one and is looked for before the AP is
+ * created to ensure the best concurrency sessions (avoid MCC and use DBS/SCC)
+ * co-exist in the system.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_FREQUENCY: Optional (u32)
+ * Channel center frequency (MHz) on which the access point should restart.
*/
enum qca_wlan_vendor_attr_sap_config {
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_INVALID = 0,
- QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL,
+ QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL = 1,
QCA_WLAN_VENDOR_ATTR_SAP_MANDATORY_FREQUENCY_LIST = 2,
- /* keep last */
+ QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_FREQUENCY = 3,
+
+ /* Keep last */
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX =
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST - 1,
@@ -5862,39 +6061,136 @@
};
/**
- * qca_wlan_vendor_attr_external_acs_channels: attribute to vendor subcmd
- * QCA_NL80211_VENDOR_SUBCMD_EXTERNAL_ACS. This carry a list of channels
- * in priority order as decided after acs operation in userspace.
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_REASON: One of reason code from
- * qca_wlan_vendor_acs_select_reason.
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_COUNT: Number of channels in
- * this list
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LIST: Array of nested values
- * for each channel with following attributes:
+ * enum qca_wlan_vendor_attr_external_acs_channels: Attributes to vendor subcmd
+ * QCA_NL80211_VENDOR_SUBCMD_EXTERNAL_ACS. This carries a list of channels
+ * in priority order as decided after ACS operation in userspace.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_REASON: Required (u8).
+ * One of reason code from enum qca_wlan_vendor_acs_select_reason.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LIST: Required
+ * Array of nested values for each channel with following attributes:
* QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY,
* QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY,
* QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0,
* QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1,
* QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY: Primary channel (u8)
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY: Secondary channel (u8)
- * required only for 160 / 80 + 80
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0: VHT seg0 channel (u8)
- * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1: VHT seg1 channel (u8)
- * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH:channel width (u8)
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LIST is deprecated and use
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_LIST.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LIST
+ * is still used if either of the driver or user space application doesn't
+ * support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY: Required (u8).
+ * Primary channel number
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY is deprecated and use
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_PRIMARY.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY
+ * is still used if either of the driver or user space application doesn't
+ * support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY: Required (u8).
+ * Secondary channel number, required only for 160 and 80+80 MHz bandwidths.
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY is deprecated and use
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_SECONDARY.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY
+ * is still used if either of the driver or user space application
+ * doesn't support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0: Required (u8).
+ * VHT seg0 channel number
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0 is deprecated and use
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG0.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0
+ * is still used if either of the driver or user space application
+ * doesn't support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1: Required (u8).
+ * VHT seg1 channel number
+ * Note: If both the driver and user-space application supports the 6 GHz band,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1 is deprecated and use
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG1.
+ * To maintain backward compatibility,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1
+ * is still used if either of the driver or user space application
+ * doesn't support the 6 GHz band.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH: Required (u8).
+ * Takes one of enum nl80211_chan_width values.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_LIST: Required
+ * Array of nested values for each channel with following attributes:
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_PRIMARY in MHz (u32),
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_SECONDARY in MHz (u32),
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG0 in MHz (u32),
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG1 in MHz (u32),
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH
+ * Note: If user-space application has no support of the 6 GHz band, this
+ * attribute is optional.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_PRIMARY: Required (u32)
+ * Primary channel frequency in MHz
+ * Note: If user-space application has no support of the 6 GHz band, this
+ * attribute is optional.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_SECONDARY: Required (u32)
+ * Secondary channel frequency in MHz used for HT 40 MHz channels.
+ * Note: If user-space application has no support of the 6 GHz band, this
+ * attribute is optional.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG0: Required (u32)
+ * VHT seg0 channel frequency in MHz
+ * Note: If user-space application has no support of the 6GHz band, this
+ * attribute is optional.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG1: Required (u32)
+ * VHT seg1 channel frequency in MHz
+ * Note: If user-space application has no support of the 6 GHz band, this
+ * attribute is optional.
*/
enum qca_wlan_vendor_attr_external_acs_channels {
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_INVALID = 0,
+ /* One of reason code (u8) from enum qca_wlan_vendor_acs_select_reason
+ */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_REASON = 1,
+
+ /* Array of nested values for each channel with following attributes:
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_BAND,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1,
+ * QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH
+ */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LIST = 2,
+ /* This (u8) will hold values of one of enum nl80211_bands */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_BAND = 3,
+ /* Primary channel (u8) */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_PRIMARY = 4,
+ /* Secondary channel (u8) used for HT 40 MHz channels */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_SECONDARY = 5,
+ /* VHT seg0 channel (u8) */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG0 = 6,
+ /* VHT seg1 channel (u8) */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_CENTER_SEG1 = 7,
+ /* Channel width (u8). Takes one of enum nl80211_chan_width values. */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_WIDTH = 8,
+ QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_LIST = 9,
+ QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_PRIMARY = 10,
+ QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_SECONDARY = 11,
+ QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG0 = 12,
+ QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_FREQUENCY_CENTER_SEG1 = 13,
+
/* keep last */
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_LAST,
QCA_WLAN_VENDOR_ATTR_EXTERNAL_ACS_CHANNEL_MAX =
@@ -7813,4 +8109,23 @@
QCA_WLAN_VENDOR_ATTR_OEM_DATA_PARAMS_MAX =
QCA_WLAN_VENDOR_ATTR_OEM_DATA_PARAMS_AFTER_LAST - 1
};
+
+/*
+ * enum qca_wlan_vendor_attr_add_sta_node_params - Used by the vendor command
+ * QCA_NL80211_VENDOR_SUBCMD_ADD_STA_NODE.
+ */
+enum qca_wlan_vendor_attr_add_sta_node_params {
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_INVALID = 0,
+ /* 6 byte MAC address of STA */
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_MAC_ADDR = 1,
+ /* Authentication algorithm used by the station of size u16;
+ * defined in enum nl80211_auth_type.
+ */
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_AUTH_ALGO = 2,
+
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_PARAM_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_PARAM_MAX =
+ QCA_WLAN_VENDOR_ATTR_ADD_STA_NODE_PARAM_AFTER_LAST - 1
+};
#endif
diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h
index 1d7bb51..1c5f207 100644
--- a/qdf/inc/qdf_nbuf.h
+++ b/qdf/inc/qdf_nbuf.h
@@ -3267,8 +3267,9 @@
if (qdf_likely(buf != unshared_buf)) {
qdf_net_buf_debug_delete_node(buf);
- qdf_net_buf_debug_add_node(unshared_buf, 0,
- func_name, line_num);
+ if (unshared_buf)
+ qdf_net_buf_debug_add_node(unshared_buf, 0,
+ func_name, line_num);
}
return unshared_buf;
diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
index 76ec1b8..a304485 100644
--- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
+++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
@@ -1156,6 +1156,22 @@
}
/**
+ * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
+ * @vdev: VDEV object
+ * @peer_mac: mac address of the peer to be found
+ * @dbg_id: dbg_id of the module
+ *
+ * API to get and increment ref count of BSS peer of VDEV
+ *
+ * Return:
+ * @peer: peer pointer to the peer of the mac address
+ */
+struct wlan_objmgr_peer *
+wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
+ uint8_t *peer_mac,
+ wlan_objmgr_ref_dbgid dbg_id);
+
+/**
* wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
* of VDEV
* @vdev: VDEV object
diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c
index dcbb96e..404543d 100644
--- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c
+++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c
@@ -504,8 +504,8 @@
if (vdev->obj_state != WLAN_OBJ_STATE_CREATED) {
wlan_vdev_obj_unlock(vdev);
- obj_mgr_err("VDEV is not in create state(:%d): vdev-id:%d",
- vdev_id, vdev->obj_state);
+ obj_mgr_err("VDEV is not in create state:%d: vdev-id:%d",
+ vdev->obj_state, vdev_id);
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_vdev_get_ref(vdev, dbg_id);
@@ -531,6 +531,59 @@
}
/**
+ ** APIs to get a peer with given mac in a vdev
+ */
+struct wlan_objmgr_peer *
+wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
+ uint8_t *peer_mac,
+ wlan_objmgr_ref_dbgid dbg_id)
+{
+ qdf_list_t *peer_list;
+ struct wlan_objmgr_peer *peer = NULL;
+ struct wlan_objmgr_peer *peer_next = NULL;
+ uint8_t vdev_id;
+
+ if (!vdev) {
+ obj_mgr_err("VDEV is NULL");
+ return NULL;
+ }
+ wlan_vdev_obj_lock(vdev);
+ vdev_id = wlan_vdev_get_id(vdev);
+
+ if (vdev->obj_state != WLAN_OBJ_STATE_CREATED) {
+ wlan_vdev_obj_unlock(vdev);
+ obj_mgr_err("VDEV is not in create state:%d: vdev-id:%d",
+ vdev->obj_state, vdev_id);
+ return NULL;
+ }
+ wlan_objmgr_vdev_get_ref(vdev, dbg_id);
+ peer_list = &vdev->vdev_objmgr.wlan_peer_list;
+ /* Iterate through VDEV's peer list */
+ peer = wlan_vdev_peer_list_peek_head(peer_list);
+ while (peer) {
+ peer_next = wlan_peer_get_next_peer_of_vdev(peer_list,
+ peer);
+ if (wlan_objmgr_peer_try_get_ref(peer, dbg_id) ==
+ QDF_STATUS_SUCCESS) {
+ if (!WLAN_ADDR_EQ(peer_mac,
+ wlan_peer_get_macaddr(peer))) {
+ wlan_objmgr_vdev_release_ref(vdev,
+ dbg_id);
+ wlan_vdev_obj_unlock(vdev);
+ return peer;
+ }
+ wlan_objmgr_peer_release_ref(peer, dbg_id);
+ }
+ peer = peer_next;
+ }
+ wlan_objmgr_vdev_release_ref(vdev, dbg_id);
+ wlan_vdev_obj_unlock(vdev);
+ return NULL;
+}
+
+qdf_export_symbol(wlan_objmgr_vdev_find_peer_by_mac);
+
+/**
* wlan_obj_vdev_populate_logically_del_peerlist() - get peer
* from vdev peer list
* @obj_list: peer object list
diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c
index e2550a9..9748371 100644
--- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c
+++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c
@@ -1236,7 +1236,7 @@
lsb_n = bssid_tmp & ((1 << max_bssid) - 1);
new_bssid = bssid_tmp;
new_bssid &= ~((1 << max_bssid) - 1);
- new_bssid |= (lsb_n + mbssid_index) % (1 << max_bssid);
+ new_bssid |= qdf_do_div((lsb_n + mbssid_index), (1 << max_bssid));
for (i = QDF_MAC_ADDR_SIZE - 1; i >= 0; i--) {
new_bssid_addr[i] = new_bssid & 0xff;
diff --git a/umac/wifi_pos/src/wifi_pos_main.c b/umac/wifi_pos/src/wifi_pos_main.c
index 2f97e0a..a8bba7c 100644
--- a/umac/wifi_pos/src/wifi_pos_main.c
+++ b/umac/wifi_pos/src/wifi_pos_main.c
@@ -305,8 +305,9 @@
wlan_reg_set_channel_params(pdev, chan, sec_ch_2g, &ch_params);
if (ch_params.center_freq_seg0)
chan_info->band_center_freq1 =
- wlan_reg_get_channel_freq(pdev,
- ch_params.center_freq_seg0);
+ wlan_reg_legacy_chan_to_freq(
+ pdev,
+ ch_params.center_freq_seg0);
wifi_pos_psoc->wifi_pos_get_phy_mode(chan, ch_params.ch_width,
&phy_mode);
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h
index da4cda4..17c6b5e 100644
--- a/wmi/inc/wmi_unified_param.h
+++ b/wmi/inc/wmi_unified_param.h
@@ -4823,6 +4823,7 @@
wmi_vdev_param_mcast_rc_stale_period,
wmi_vdev_param_enable_multi_group_key,
wmi_vdev_param_max_group_keys,
+ wmi_vdev_param_enable_mcast_rc,
} wmi_conv_vdev_param_id;
/**
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index bdf4c77..702366c 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -478,6 +478,7 @@
[wmi_vdev_param_enable_multi_group_key] =
WMI_VDEV_PARAM_ENABLE_MULTI_GROUP_KEY,
[wmi_vdev_param_max_group_keys] = WMI_VDEV_PARAM_NUM_GROUP_KEYS,
+ [wmi_vdev_param_enable_mcast_rc] = WMI_VDEV_PARAM_ENABLE_MCAST_RC,
};
#endif
@@ -3036,6 +3037,40 @@
return ret;
}
+#define WMI_MAX_CHAN_INFO_LOG 192
+
+/**
+ * wmi_scan_chanlist_dump() - Dump scan channel list info
+ * @scan_chan_list: scan channel list
+ *
+ * Return: void
+ */
+static void wmi_scan_chanlist_dump(struct scan_chan_list_params *scan_chan_list)
+{
+ uint32_t i;
+ uint8_t info[WMI_MAX_CHAN_INFO_LOG];
+ int len = 0;
+ struct channel_param *chan;
+ int ret;
+
+ WMI_LOGD(FL("start (freq MHz, tx power dBm):"));
+ for (i = 0; i < scan_chan_list->nallchans; i++) {
+ chan = &scan_chan_list->ch_param[i];
+ ret = scnprintf(info + len, sizeof(info) - len, "%d %d ",
+ chan->mhz, chan->maxregpower);
+ if (ret <= 0)
+ break;
+ len += ret;
+ if (len >= (sizeof(info) - 20)) {
+ WMI_LOGD(FL("%s"), info);
+ len = 0;
+ }
+ }
+ if (len > 0)
+ WMI_LOGD(FL("%s"), info);
+ WMI_LOGD(FL("end total_count %d"), scan_chan_list->nallchans);
+}
+
static QDF_STATUS send_scan_chan_list_cmd_tlv(wmi_unified_t wmi_handle,
struct scan_chan_list_params *chan_list)
{
@@ -3049,6 +3084,7 @@
uint16_t len;
uint16_t num_send_chans, num_sends = 0;
+ wmi_scan_chanlist_dump(chan_list);
tchan_info = &chan_list->ch_param[0];
while (chan_list->nallchans) {
len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
@@ -3153,7 +3189,6 @@
tchan_info->maxregpower);
WMI_SET_CHANNEL_MAX_BANDWIDTH(chan_info,
tchan_info->max_bw_supported);
- WMI_LOGD("chan[%d] = %u", i, chan_info->mhz);
tchan_info++;
chan_info++;