root/drivers/net/wwan/t7xx/t7xx_port_proxy.h
/* SPDX-License-Identifier: GPL-2.0-only
 *
 * Copyright (c) 2021, MediaTek Inc.
 * Copyright (c) 2021-2022, Intel Corporation.
 *
 * Authors:
 *  Amir Hanania <amir.hanania@intel.com>
 *  Haijun Liu <haijun.liu@mediatek.com>
 *  Moises Veleta <moises.veleta@intel.com>
 *  Ricardo Martinez <ricardo.martinez@linux.intel.com>
 *
 * Contributors:
 *  Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com>
 *  Eliot Lee <eliot.lee@intel.com>
 *  Sreehari Kancharla <sreehari.kancharla@intel.com>
 */

#ifndef __T7XX_PORT_PROXY_H__
#define __T7XX_PORT_PROXY_H__

#include <linux/bits.h>
#include <linux/device.h>
#include <linux/skbuff.h>
#include <linux/types.h>

#include "t7xx_hif_cldma.h"
#include "t7xx_modem_ops.h"
#include "t7xx_port.h"

#define MTK_QUEUES              16
#define RX_QUEUE_MAXLEN         32
#define CTRL_QUEUE_MAXLEN       16

enum port_cfg_id {
        PORT_CFG_ID_INVALID,
        PORT_CFG_ID_NORMAL,
        PORT_CFG_ID_EARLY,
};

struct port_proxy {
        int                     port_count;
        struct list_head        rx_ch_ports[PORT_CH_ID_MASK + 1];
        struct list_head        queue_ports[CLDMA_NUM][MTK_QUEUES];
        struct device           *dev;
        enum port_cfg_id        cfg_id;
        struct t7xx_port        ports[];
};

struct ccci_header {
        __le32 packet_header;
        __le32 packet_len;
        __le32 status;
        __le32 ex_msg;
};

/* Coupled with HW - indicates if there is data following the CCCI header or not */
#define CCCI_HEADER_NO_DATA     0xffffffff

#define CCCI_H_AST_BIT          BIT(31)
#define CCCI_H_SEQ_FLD          GENMASK(30, 16)
#define CCCI_H_CHN_FLD          GENMASK(15, 0)

struct ctrl_msg_header {
        __le32  ctrl_msg_id;
        __le32  ex_msg;
        __le32  data_length;
};

/* Control identification numbers for AP<->MD messages  */
#define CTL_ID_HS1_MSG          0x0
#define CTL_ID_HS2_MSG          0x1
#define CTL_ID_HS3_MSG          0x2
#define CTL_ID_MD_EX            0x4
#define CTL_ID_DRV_VER_ERROR    0x5
#define CTL_ID_MD_EX_ACK        0x6
#define CTL_ID_MD_EX_PASS       0x8
#define CTL_ID_PORT_ENUM        0x9

/* Modem exception check identification code - "EXCP" */
#define MD_EX_CHK_ID            0x45584350
/* Modem exception check acknowledge identification code - "EREC" */
#define MD_EX_CHK_ACK_ID        0x45524543

#define PORT_INFO_RSRVD         GENMASK(31, 16)
#define PORT_INFO_ENFLG         BIT(15)
#define PORT_INFO_CH_ID         GENMASK(14, 0)

#define PORT_ENUM_VER           0
#define PORT_ENUM_HEAD_PATTERN  0x5a5a5a5a
#define PORT_ENUM_TAIL_PATTERN  0xa5a5a5a5
#define PORT_ENUM_VER_MISMATCH  0x00657272

/* Port operations mapping */
extern struct port_ops wwan_sub_port_ops;
extern struct port_ops ctl_port_ops;

#ifdef CONFIG_WWAN_DEBUGFS
extern struct port_ops t7xx_trace_port_ops;
#endif

void t7xx_proxy_debug_ports_show(struct t7xx_pci_dev *t7xx_dev, bool show);
void t7xx_port_proxy_reset(struct port_proxy *port_prox);
void t7xx_port_proxy_uninit(struct port_proxy *port_prox);
int t7xx_port_proxy_init(struct t7xx_modem *md);
void t7xx_port_proxy_md_status_notify(struct port_proxy *port_prox, unsigned int state);
int t7xx_port_enum_msg_handler(struct t7xx_modem *md, void *msg, size_t msg_len);
int t7xx_port_proxy_chl_enable_disable(struct port_proxy *port_prox, unsigned int ch_id,
                                       bool en_flag);
void t7xx_port_proxy_set_cfg(struct t7xx_modem *md, enum port_cfg_id cfg_id);
int t7xx_port_proxy_recv_skb(struct cldma_queue *queue, struct sk_buff *skb);
int t7xx_port_proxy_recv_skb_from_dedicated_queue(struct cldma_queue *queue, struct sk_buff *skb);

#endif /* __T7XX_PORT_PROXY_H__ */