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