mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-20 06:20:41 +00:00
78 lines
2.4 KiB
C
78 lines
2.4 KiB
C
![]() |
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||
|
/*
|
||
|
* Copyright (C) 2024 Intel Corporation
|
||
|
*/
|
||
|
#ifndef __iwl_mld_tx_h__
|
||
|
#define __iwl_mld_tx_h__
|
||
|
|
||
|
#include "mld.h"
|
||
|
|
||
|
#define IWL_MLD_INVALID_QUEUE 0xFFFF
|
||
|
#define IWL_MLD_INVALID_DROP_TX 0xFFFE
|
||
|
|
||
|
/**
|
||
|
* struct iwl_mld_txq - TX Queue data
|
||
|
*
|
||
|
* @fw_id: the fw id of this txq. Only valid when &status.allocated is true.
|
||
|
* @status: bitmap of the txq status
|
||
|
* @status.allocated: Indicates that the queue was allocated.
|
||
|
* @status.stop_full: Indicates that the queue is full and should stop TXing.
|
||
|
* @list: list pointer, for &mld::txqs_to_add
|
||
|
* @tx_request: makes sure that if there are multiple threads that want to tx
|
||
|
* from this txq, only one of them will do all the TXing.
|
||
|
* This is needed to avoid spinning the trans txq lock, which is expensive
|
||
|
*/
|
||
|
struct iwl_mld_txq {
|
||
|
/* Add here fields that need clean up on restart */
|
||
|
struct_group(zeroed_on_hw_restart,
|
||
|
u16 fw_id;
|
||
|
struct {
|
||
|
u8 allocated:1;
|
||
|
u8 stop_full:1;
|
||
|
} status;
|
||
|
);
|
||
|
struct list_head list;
|
||
|
atomic_t tx_request;
|
||
|
/* And here fields that survive a fw restart */
|
||
|
};
|
||
|
|
||
|
static inline void iwl_mld_init_txq(struct iwl_mld_txq *mld_txq)
|
||
|
{
|
||
|
INIT_LIST_HEAD(&mld_txq->list);
|
||
|
atomic_set(&mld_txq->tx_request, 0);
|
||
|
}
|
||
|
|
||
|
static inline struct iwl_mld_txq *
|
||
|
iwl_mld_txq_from_mac80211(struct ieee80211_txq *txq)
|
||
|
{
|
||
|
return (void *)txq->drv_priv;
|
||
|
}
|
||
|
|
||
|
void iwl_mld_add_txqs_wk(struct wiphy *wiphy, struct wiphy_work *wk);
|
||
|
void iwl_mld_remove_txq(struct iwl_mld *mld, struct ieee80211_txq *txq);
|
||
|
void iwl_mld_add_txq_list(struct iwl_mld *mld);
|
||
|
void
|
||
|
iwl_mld_free_txq(struct iwl_mld *mld, u32 fw_sta_mask, u32 tid, u32 queue_id);
|
||
|
void iwl_mld_tx_from_txq(struct iwl_mld *mld, struct ieee80211_txq *txq);
|
||
|
void iwl_mld_handle_tx_resp_notif(struct iwl_mld *mld,
|
||
|
struct iwl_rx_packet *pkt);
|
||
|
int iwl_mld_flush_link_sta_txqs(struct iwl_mld *mld, u32 fw_sta_id);
|
||
|
int iwl_mld_ensure_queue(struct iwl_mld *mld, struct ieee80211_txq *txq);
|
||
|
|
||
|
int iwl_mld_update_sta_txqs(struct iwl_mld *mld,
|
||
|
struct ieee80211_sta *sta,
|
||
|
u32 old_sta_mask, u32 new_sta_mask);
|
||
|
|
||
|
void iwl_mld_handle_compressed_ba_notif(struct iwl_mld *mld,
|
||
|
struct iwl_rx_packet *pkt);
|
||
|
void iwl_mld_toggle_tx_ant(struct iwl_mld *mld, u8 *ant);
|
||
|
|
||
|
u8 iwl_mld_get_lowest_rate(struct iwl_mld *mld,
|
||
|
struct ieee80211_tx_info *info,
|
||
|
struct ieee80211_vif *vif);
|
||
|
|
||
|
void iwl_mld_tx_skb(struct iwl_mld *mld, struct sk_buff *skb,
|
||
|
struct ieee80211_txq *txq);
|
||
|
|
||
|
#endif /* __iwl_mld_tx_h__ */
|