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