xref: /linux/drivers/net/wireless/morsemicro/mm81x/yaps.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*b1906ceaSLachlan Hodges /* SPDX-License-Identifier: GPL-2.0-only */
2*b1906ceaSLachlan Hodges /*
3*b1906ceaSLachlan Hodges  * Copyright (c) 2017-2026 Morse Micro
4*b1906ceaSLachlan Hodges  */
5*b1906ceaSLachlan Hodges 
6*b1906ceaSLachlan Hodges #ifndef _MM81X_YAPS_H_
7*b1906ceaSLachlan Hodges #define _MM81X_YAPS_H_
8*b1906ceaSLachlan Hodges 
9*b1906ceaSLachlan Hodges #include <linux/skbuff.h>
10*b1906ceaSLachlan Hodges #include <linux/workqueue.h>
11*b1906ceaSLachlan Hodges #include "skbq.h"
12*b1906ceaSLachlan Hodges 
13*b1906ceaSLachlan Hodges #define YAPS_TX_SKBQ_MAX 4
14*b1906ceaSLachlan Hodges 
15*b1906ceaSLachlan Hodges struct mm81x_hif_ops;
16*b1906ceaSLachlan Hodges extern const struct mm81x_hif_ops mm81x_yaps_ops;
17*b1906ceaSLachlan Hodges 
18*b1906ceaSLachlan Hodges enum mm81x_yaps_to_chip_q {
19*b1906ceaSLachlan Hodges 	MM81X_YAPS_TX_Q = 0,
20*b1906ceaSLachlan Hodges 	MM81X_YAPS_CMD_Q,
21*b1906ceaSLachlan Hodges 	MM81X_YAPS_BEACON_Q,
22*b1906ceaSLachlan Hodges 	MM81X_YAPS_MGMT_Q,
23*b1906ceaSLachlan Hodges 	/* Keep this last */
24*b1906ceaSLachlan Hodges 	MM81X_YAPS_NUM_TC_Q
25*b1906ceaSLachlan Hodges };
26*b1906ceaSLachlan Hodges 
27*b1906ceaSLachlan Hodges struct mm81x_yaps_pkt {
28*b1906ceaSLachlan Hodges 	struct sk_buff *skb;
29*b1906ceaSLachlan Hodges 	enum mm81x_yaps_to_chip_q tc_queue;
30*b1906ceaSLachlan Hodges };
31*b1906ceaSLachlan Hodges 
32*b1906ceaSLachlan Hodges struct mm81x_yaps {
33*b1906ceaSLachlan Hodges 	struct mm81x *mors;
34*b1906ceaSLachlan Hodges 	struct mm81x_yaps_hw_aux_data *aux_data;
35*b1906ceaSLachlan Hodges 	const struct mm81x_yaps_ops *ops;
36*b1906ceaSLachlan Hodges 	u8 flags;
37*b1906ceaSLachlan Hodges 	struct {
38*b1906ceaSLachlan Hodges 		struct mm81x_yaps_pkt *to_chip_pkts;
39*b1906ceaSLachlan Hodges 		struct mm81x_yaps_pkt *from_chip_pkts;
40*b1906ceaSLachlan Hodges 	} hw;
41*b1906ceaSLachlan Hodges 
42*b1906ceaSLachlan Hodges 	/* Chip interface is stopping, new work should not be enqueued. */
43*b1906ceaSLachlan Hodges 	bool finish;
44*b1906ceaSLachlan Hodges 
45*b1906ceaSLachlan Hodges 	struct mm81x_skbq data_tx_qs[YAPS_TX_SKBQ_MAX];
46*b1906ceaSLachlan Hodges 	struct mm81x_skbq beacon_q;
47*b1906ceaSLachlan Hodges 	struct mm81x_skbq mgmt_q;
48*b1906ceaSLachlan Hodges 	struct mm81x_skbq data_rx_q;
49*b1906ceaSLachlan Hodges 	struct mm81x_skbq cmd_q;
50*b1906ceaSLachlan Hodges 	struct mm81x_skbq cmd_resp_q;
51*b1906ceaSLachlan Hodges 
52*b1906ceaSLachlan Hodges 	struct {
53*b1906ceaSLachlan Hodges 		struct timer_list timer;
54*b1906ceaSLachlan Hodges 		unsigned long retry_expiry;
55*b1906ceaSLachlan Hodges 		bool is_full;
56*b1906ceaSLachlan Hodges 	} chip_queue_full;
57*b1906ceaSLachlan Hodges };
58*b1906ceaSLachlan Hodges 
59*b1906ceaSLachlan Hodges struct mm81x_yaps_ops {
60*b1906ceaSLachlan Hodges 	int (*write_pkts)(struct mm81x_yaps *yaps, struct mm81x_yaps_pkt *pkts,
61*b1906ceaSLachlan Hodges 			  int num_pkts, int *num_pkts_sent);
62*b1906ceaSLachlan Hodges 	int (*read_pkts)(struct mm81x_yaps *yaps, struct mm81x_yaps_pkt *pkts,
63*b1906ceaSLachlan Hodges 			 int num_pkts_max, int *num_pkts_received);
64*b1906ceaSLachlan Hodges 	int (*update_status)(struct mm81x_yaps *yaps);
65*b1906ceaSLachlan Hodges };
66*b1906ceaSLachlan Hodges 
67*b1906ceaSLachlan Hodges int mm81x_yaps_init(struct mm81x *mors);
68*b1906ceaSLachlan Hodges void mm81x_yaps_show(struct mm81x_yaps *yaps, struct seq_file *file);
69*b1906ceaSLachlan Hodges void mm81x_yaps_finish(struct mm81x *mors);
70*b1906ceaSLachlan Hodges void mm81x_yaps_flush_tx_data(struct mm81x *mors);
71*b1906ceaSLachlan Hodges void mm81x_yaps_flush_cmds(struct mm81x *mors);
72*b1906ceaSLachlan Hodges void mm81x_yaps_work(struct work_struct *work);
73*b1906ceaSLachlan Hodges void mm81x_yaps_stale_tx_work(struct work_struct *work);
74*b1906ceaSLachlan Hodges int mm81x_yaps_get_tx_status_pending_count(struct mm81x *mors);
75*b1906ceaSLachlan Hodges int mm81x_yaps_get_tx_buffered_count(struct mm81x *mors);
76*b1906ceaSLachlan Hodges 
77*b1906ceaSLachlan Hodges #endif /* !_MM81X_YAPS_H_ */
78