xref: /openbmc/linux/drivers/net/wireless/silabs/wfx/queue.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*4a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only */
2*4a5fb1bbSJérôme Pouiller /*
3*4a5fb1bbSJérôme Pouiller  * Queue between the tx operation and the bh workqueue.
4*4a5fb1bbSJérôme Pouiller  *
5*4a5fb1bbSJérôme Pouiller  * Copyright (c) 2017-2020, Silicon Laboratories, Inc.
6*4a5fb1bbSJérôme Pouiller  * Copyright (c) 2010, ST-Ericsson
7*4a5fb1bbSJérôme Pouiller  */
8*4a5fb1bbSJérôme Pouiller #ifndef WFX_QUEUE_H
9*4a5fb1bbSJérôme Pouiller #define WFX_QUEUE_H
10*4a5fb1bbSJérôme Pouiller 
11*4a5fb1bbSJérôme Pouiller #include <linux/skbuff.h>
12*4a5fb1bbSJérôme Pouiller #include <linux/atomic.h>
13*4a5fb1bbSJérôme Pouiller 
14*4a5fb1bbSJérôme Pouiller struct wfx_dev;
15*4a5fb1bbSJérôme Pouiller struct wfx_vif;
16*4a5fb1bbSJérôme Pouiller 
17*4a5fb1bbSJérôme Pouiller struct wfx_queue {
18*4a5fb1bbSJérôme Pouiller 	struct sk_buff_head normal;
19*4a5fb1bbSJérôme Pouiller 	struct sk_buff_head cab; /* Content After (DTIM) Beacon */
20*4a5fb1bbSJérôme Pouiller 	atomic_t            pending_frames;
21*4a5fb1bbSJérôme Pouiller 	int                 priority;
22*4a5fb1bbSJérôme Pouiller };
23*4a5fb1bbSJérôme Pouiller 
24*4a5fb1bbSJérôme Pouiller void wfx_tx_lock(struct wfx_dev *wdev);
25*4a5fb1bbSJérôme Pouiller void wfx_tx_unlock(struct wfx_dev *wdev);
26*4a5fb1bbSJérôme Pouiller void wfx_tx_flush(struct wfx_dev *wdev);
27*4a5fb1bbSJérôme Pouiller void wfx_tx_lock_flush(struct wfx_dev *wdev);
28*4a5fb1bbSJérôme Pouiller 
29*4a5fb1bbSJérôme Pouiller void wfx_tx_queues_init(struct wfx_vif *wvif);
30*4a5fb1bbSJérôme Pouiller void wfx_tx_queues_check_empty(struct wfx_vif *wvif);
31*4a5fb1bbSJérôme Pouiller bool wfx_tx_queues_has_cab(struct wfx_vif *wvif);
32*4a5fb1bbSJérôme Pouiller void wfx_tx_queues_put(struct wfx_vif *wvif, struct sk_buff *skb);
33*4a5fb1bbSJérôme Pouiller struct wfx_hif_msg *wfx_tx_queues_get(struct wfx_dev *wdev);
34*4a5fb1bbSJérôme Pouiller 
35*4a5fb1bbSJérôme Pouiller bool wfx_tx_queue_empty(struct wfx_vif *wvif, struct wfx_queue *queue);
36*4a5fb1bbSJérôme Pouiller void wfx_tx_queue_drop(struct wfx_vif *wvif, struct wfx_queue *queue,
37*4a5fb1bbSJérôme Pouiller 		       struct sk_buff_head *dropped);
38*4a5fb1bbSJérôme Pouiller 
39*4a5fb1bbSJérôme Pouiller struct sk_buff *wfx_pending_get(struct wfx_dev *wdev, u32 packet_id);
40*4a5fb1bbSJérôme Pouiller void wfx_pending_drop(struct wfx_dev *wdev, struct sk_buff_head *dropped);
41*4a5fb1bbSJérôme Pouiller unsigned int wfx_pending_get_pkt_us_delay(struct wfx_dev *wdev, struct sk_buff *skb);
42*4a5fb1bbSJérôme Pouiller void wfx_pending_dump_old_frames(struct wfx_dev *wdev, unsigned int limit_ms);
43*4a5fb1bbSJérôme Pouiller 
44*4a5fb1bbSJérôme Pouiller #endif
45