162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Huawei HiNIC PCI Express Linux driver
462306a36Sopenharmony_ci * Copyright(c) 2017 Huawei Technologies Co., Ltd
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef HINIC_DEV_H
862306a36Sopenharmony_ci#define HINIC_DEV_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/netdevice.h>
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci#include <linux/semaphore.h>
1362306a36Sopenharmony_ci#include <linux/workqueue.h>
1462306a36Sopenharmony_ci#include <linux/bitops.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include "hinic_hw_dev.h"
1762306a36Sopenharmony_ci#include "hinic_tx.h"
1862306a36Sopenharmony_ci#include "hinic_rx.h"
1962306a36Sopenharmony_ci#include "hinic_sriov.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define HINIC_DRV_NAME          "hinic"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define LP_PKT_CNT		64
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define HINIC_MAX_JUMBO_FRAME_SIZE      15872
2662306a36Sopenharmony_ci#define HINIC_MAX_MTU_SIZE      (HINIC_MAX_JUMBO_FRAME_SIZE - ETH_HLEN - ETH_FCS_LEN)
2762306a36Sopenharmony_ci#define HINIC_MIN_MTU_SIZE      256
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cienum hinic_flags {
3062306a36Sopenharmony_ci	HINIC_LINK_UP = BIT(0),
3162306a36Sopenharmony_ci	HINIC_INTF_UP = BIT(1),
3262306a36Sopenharmony_ci	HINIC_RSS_ENABLE = BIT(2),
3362306a36Sopenharmony_ci	HINIC_LINK_DOWN = BIT(3),
3462306a36Sopenharmony_ci	HINIC_LP_TEST = BIT(4),
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct hinic_rx_mode_work {
3862306a36Sopenharmony_ci	struct work_struct      work;
3962306a36Sopenharmony_ci	u32                     rx_mode;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct hinic_rss_type {
4362306a36Sopenharmony_ci	u8 tcp_ipv6_ext;
4462306a36Sopenharmony_ci	u8 ipv6_ext;
4562306a36Sopenharmony_ci	u8 tcp_ipv6;
4662306a36Sopenharmony_ci	u8 ipv6;
4762306a36Sopenharmony_ci	u8 tcp_ipv4;
4862306a36Sopenharmony_ci	u8 ipv4;
4962306a36Sopenharmony_ci	u8 udp_ipv6;
5062306a36Sopenharmony_ci	u8 udp_ipv4;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cienum hinic_rss_hash_type {
5462306a36Sopenharmony_ci	HINIC_RSS_HASH_ENGINE_TYPE_XOR,
5562306a36Sopenharmony_ci	HINIC_RSS_HASH_ENGINE_TYPE_TOEP,
5662306a36Sopenharmony_ci	HINIC_RSS_HASH_ENGINE_TYPE_MAX,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct hinic_intr_coal_info {
6062306a36Sopenharmony_ci	u8	pending_limt;
6162306a36Sopenharmony_ci	u8	coalesce_timer_cfg;
6262306a36Sopenharmony_ci	u8	resend_timer_cfg;
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cienum hinic_dbg_type {
6662306a36Sopenharmony_ci	HINIC_DBG_SQ_INFO,
6762306a36Sopenharmony_ci	HINIC_DBG_RQ_INFO,
6862306a36Sopenharmony_ci	HINIC_DBG_FUNC_TABLE,
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct hinic_debug_priv {
7262306a36Sopenharmony_ci	struct hinic_dev	*dev;
7362306a36Sopenharmony_ci	void			*object;
7462306a36Sopenharmony_ci	enum hinic_dbg_type	type;
7562306a36Sopenharmony_ci	struct dentry		*root;
7662306a36Sopenharmony_ci	int			field_id[64];
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct hinic_dev {
8062306a36Sopenharmony_ci	struct net_device               *netdev;
8162306a36Sopenharmony_ci	struct hinic_hwdev              *hwdev;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	u32                             msg_enable;
8462306a36Sopenharmony_ci	unsigned int                    tx_weight;
8562306a36Sopenharmony_ci	unsigned int                    rx_weight;
8662306a36Sopenharmony_ci	u16				num_qps;
8762306a36Sopenharmony_ci	u16				max_qps;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	unsigned int                    flags;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	struct semaphore                mgmt_lock;
9262306a36Sopenharmony_ci	unsigned long                   *vlan_bitmap;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	struct hinic_rx_mode_work       rx_mode_work;
9562306a36Sopenharmony_ci	struct workqueue_struct         *workq;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	struct hinic_txq                *txqs;
9862306a36Sopenharmony_ci	struct hinic_rxq                *rxqs;
9962306a36Sopenharmony_ci	u16				sq_depth;
10062306a36Sopenharmony_ci	u16				rq_depth;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	u8				rss_tmpl_idx;
10362306a36Sopenharmony_ci	u8				rss_hash_engine;
10462306a36Sopenharmony_ci	u16				num_rss;
10562306a36Sopenharmony_ci	u16				rss_limit;
10662306a36Sopenharmony_ci	struct hinic_rss_type		rss_type;
10762306a36Sopenharmony_ci	u8				*rss_hkey_user;
10862306a36Sopenharmony_ci	s32				*rss_indir_user;
10962306a36Sopenharmony_ci	struct hinic_intr_coal_info	*rx_intr_coalesce;
11062306a36Sopenharmony_ci	struct hinic_intr_coal_info	*tx_intr_coalesce;
11162306a36Sopenharmony_ci	struct hinic_sriov_info sriov_info;
11262306a36Sopenharmony_ci	int				lb_test_rx_idx;
11362306a36Sopenharmony_ci	int				lb_pkt_len;
11462306a36Sopenharmony_ci	u8				*lb_test_rx_buf;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	struct dentry			*dbgfs_root;
11762306a36Sopenharmony_ci	struct dentry			*sq_dbgfs;
11862306a36Sopenharmony_ci	struct dentry			*rq_dbgfs;
11962306a36Sopenharmony_ci	struct dentry			*func_tbl_dbgfs;
12062306a36Sopenharmony_ci	struct hinic_debug_priv		*dbg;
12162306a36Sopenharmony_ci	struct devlink			*devlink;
12262306a36Sopenharmony_ci	bool				cable_unplugged;
12362306a36Sopenharmony_ci	bool				module_unrecognized;
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistruct hinic_devlink_priv {
12762306a36Sopenharmony_ci	struct hinic_hwdev		*hwdev;
12862306a36Sopenharmony_ci	struct devlink_health_reporter  *hw_fault_reporter;
12962306a36Sopenharmony_ci	struct devlink_health_reporter  *fw_fault_reporter;
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#endif
133