18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
28c2ecf20Sopenharmony_ci/* Copyright (c) 2015-2016 Quantenna Communications. All rights reserved. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _QTN_FMAC_SHM_IPC_H_
58c2ecf20Sopenharmony_ci#define _QTN_FMAC_SHM_IPC_H_
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/workqueue.h>
88c2ecf20Sopenharmony_ci#include <linux/completion.h>
98c2ecf20Sopenharmony_ci#include <linux/mutex.h>
108c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include "shm_ipc_defs.h"
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#define QTN_SHM_IPC_ACK_TIMEOUT		(2 * HZ)
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistruct qtnf_shm_ipc_int {
178c2ecf20Sopenharmony_ci	void (*fn)(void *arg);
188c2ecf20Sopenharmony_ci	void *arg;
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistruct qtnf_shm_ipc_rx_callback {
228c2ecf20Sopenharmony_ci	void (*fn)(void *arg, const u8 __iomem *buf, size_t len);
238c2ecf20Sopenharmony_ci	void *arg;
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cienum qtnf_shm_ipc_direction {
278c2ecf20Sopenharmony_ci	QTNF_SHM_IPC_OUTBOUND		= BIT(0),
288c2ecf20Sopenharmony_ci	QTNF_SHM_IPC_INBOUND		= BIT(1),
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct qtnf_shm_ipc {
328c2ecf20Sopenharmony_ci	struct qtnf_shm_ipc_region __iomem *shm_region;
338c2ecf20Sopenharmony_ci	enum qtnf_shm_ipc_direction direction;
348c2ecf20Sopenharmony_ci	size_t tx_packet_count;
358c2ecf20Sopenharmony_ci	size_t rx_packet_count;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	size_t tx_timeout_count;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	u8 waiting_for_ack;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	struct qtnf_shm_ipc_int interrupt;
428c2ecf20Sopenharmony_ci	struct qtnf_shm_ipc_rx_callback rx_callback;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	void (*irq_handler)(struct qtnf_shm_ipc *ipc);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	struct workqueue_struct *workqueue;
478c2ecf20Sopenharmony_ci	struct work_struct irq_work;
488c2ecf20Sopenharmony_ci	struct completion tx_completion;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ciint qtnf_shm_ipc_init(struct qtnf_shm_ipc *ipc,
528c2ecf20Sopenharmony_ci		      enum qtnf_shm_ipc_direction direction,
538c2ecf20Sopenharmony_ci		      struct qtnf_shm_ipc_region __iomem *shm_region,
548c2ecf20Sopenharmony_ci		      struct workqueue_struct *workqueue,
558c2ecf20Sopenharmony_ci		      const struct qtnf_shm_ipc_int *interrupt,
568c2ecf20Sopenharmony_ci		      const struct qtnf_shm_ipc_rx_callback *rx_callback);
578c2ecf20Sopenharmony_civoid qtnf_shm_ipc_free(struct qtnf_shm_ipc *ipc);
588c2ecf20Sopenharmony_ciint qtnf_shm_ipc_send(struct qtnf_shm_ipc *ipc, const u8 *buf, size_t size);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistatic inline void qtnf_shm_ipc_irq_handler(struct qtnf_shm_ipc *ipc)
618c2ecf20Sopenharmony_ci{
628c2ecf20Sopenharmony_ci	ipc->irq_handler(ipc);
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#endif /* _QTN_FMAC_SHM_IPC_H_ */
66