12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 251ba902aSAviad Krawczyk /* 351ba902aSAviad Krawczyk * Huawei HiNIC PCI Express Linux driver 451ba902aSAviad Krawczyk * Copyright(c) 2017 Huawei Technologies Co., Ltd 551ba902aSAviad Krawczyk */ 651ba902aSAviad Krawczyk 751ba902aSAviad Krawczyk #ifndef HINIC_DEV_H 851ba902aSAviad Krawczyk #define HINIC_DEV_H 951ba902aSAviad Krawczyk 1051ba902aSAviad Krawczyk #include <linux/netdevice.h> 1151ba902aSAviad Krawczyk #include <linux/types.h> 1225a3ba61SAviad Krawczyk #include <linux/semaphore.h> 13c4d06d2dSAviad Krawczyk #include <linux/workqueue.h> 14c4d06d2dSAviad Krawczyk #include <linux/bitops.h> 1551ba902aSAviad Krawczyk 1651ba902aSAviad Krawczyk #include "hinic_hw_dev.h" 17c3e79bafSAviad Krawczyk #include "hinic_tx.h" 18c3e79bafSAviad Krawczyk #include "hinic_rx.h" 197dd29ee1SLuo bin #include "hinic_sriov.h" 2051ba902aSAviad Krawczyk 2151ba902aSAviad Krawczyk #define HINIC_DRV_NAME "hinic" 2251ba902aSAviad Krawczyk 234aa218a4SLuo bin #define LP_PKT_CNT 64 244aa218a4SLuo bin 25*022f19cfScaihuoqing #define HINIC_MAX_JUMBO_FRAME_SIZE 15872 26*022f19cfScaihuoqing #define HINIC_MAX_MTU_SIZE (HINIC_MAX_JUMBO_FRAME_SIZE - ETH_HLEN - ETH_FCS_LEN) 27*022f19cfScaihuoqing #define HINIC_MIN_MTU_SIZE 256 28*022f19cfScaihuoqing 29c4d06d2dSAviad Krawczyk enum hinic_flags { 30c4d06d2dSAviad Krawczyk HINIC_LINK_UP = BIT(0), 31c4d06d2dSAviad Krawczyk HINIC_INTF_UP = BIT(1), 32421e9526SXue Chaojing HINIC_RSS_ENABLE = BIT(2), 337dd29ee1SLuo bin HINIC_LINK_DOWN = BIT(3), 344aa218a4SLuo bin HINIC_LP_TEST = BIT(4), 35c4d06d2dSAviad Krawczyk }; 36c4d06d2dSAviad Krawczyk 37c4d06d2dSAviad Krawczyk struct hinic_rx_mode_work { 38c4d06d2dSAviad Krawczyk struct work_struct work; 39c4d06d2dSAviad Krawczyk u32 rx_mode; 40c4d06d2dSAviad Krawczyk }; 41c4d06d2dSAviad Krawczyk 42421e9526SXue Chaojing struct hinic_rss_type { 43421e9526SXue Chaojing u8 tcp_ipv6_ext; 44421e9526SXue Chaojing u8 ipv6_ext; 45421e9526SXue Chaojing u8 tcp_ipv6; 46421e9526SXue Chaojing u8 ipv6; 47421e9526SXue Chaojing u8 tcp_ipv4; 48421e9526SXue Chaojing u8 ipv4; 49421e9526SXue Chaojing u8 udp_ipv6; 50421e9526SXue Chaojing u8 udp_ipv4; 51421e9526SXue Chaojing }; 52421e9526SXue Chaojing 53421e9526SXue Chaojing enum hinic_rss_hash_type { 54421e9526SXue Chaojing HINIC_RSS_HASH_ENGINE_TYPE_XOR, 55421e9526SXue Chaojing HINIC_RSS_HASH_ENGINE_TYPE_TOEP, 56421e9526SXue Chaojing HINIC_RSS_HASH_ENGINE_TYPE_MAX, 57421e9526SXue Chaojing }; 58421e9526SXue Chaojing 59a0337c0dSLuo bin struct hinic_intr_coal_info { 60a0337c0dSLuo bin u8 pending_limt; 61a0337c0dSLuo bin u8 coalesce_timer_cfg; 62a0337c0dSLuo bin u8 resend_timer_cfg; 63a0337c0dSLuo bin }; 64a0337c0dSLuo bin 65253ac3a9SLuo bin enum hinic_dbg_type { 66253ac3a9SLuo bin HINIC_DBG_SQ_INFO, 67626f0603SLuo bin HINIC_DBG_RQ_INFO, 685215e162SLuo bin HINIC_DBG_FUNC_TABLE, 69253ac3a9SLuo bin }; 70253ac3a9SLuo bin 71253ac3a9SLuo bin struct hinic_debug_priv { 72253ac3a9SLuo bin struct hinic_dev *dev; 73253ac3a9SLuo bin void *object; 74253ac3a9SLuo bin enum hinic_dbg_type type; 75253ac3a9SLuo bin struct dentry *root; 76253ac3a9SLuo bin int field_id[64]; 77253ac3a9SLuo bin }; 78253ac3a9SLuo bin 7951ba902aSAviad Krawczyk struct hinic_dev { 8051ba902aSAviad Krawczyk struct net_device *netdev; 8151ba902aSAviad Krawczyk struct hinic_hwdev *hwdev; 8251ba902aSAviad Krawczyk 8351ba902aSAviad Krawczyk u32 msg_enable; 8400e57a6dSAviad Krawczyk unsigned int tx_weight; 85e2585ea7SAviad Krawczyk unsigned int rx_weight; 86421e9526SXue Chaojing u16 num_qps; 87421e9526SXue Chaojing u16 max_qps; 8825a3ba61SAviad Krawczyk 89c4d06d2dSAviad Krawczyk unsigned int flags; 90c4d06d2dSAviad Krawczyk 9125a3ba61SAviad Krawczyk struct semaphore mgmt_lock; 9225a3ba61SAviad Krawczyk unsigned long *vlan_bitmap; 93c4d06d2dSAviad Krawczyk 94c4d06d2dSAviad Krawczyk struct hinic_rx_mode_work rx_mode_work; 95c4d06d2dSAviad Krawczyk struct workqueue_struct *workq; 96c3e79bafSAviad Krawczyk 97c3e79bafSAviad Krawczyk struct hinic_txq *txqs; 98c3e79bafSAviad Krawczyk struct hinic_rxq *rxqs; 99bcab6782SLuo bin u16 sq_depth; 100bcab6782SLuo bin u16 rq_depth; 101edd384f6SAviad Krawczyk 102421e9526SXue Chaojing u8 rss_tmpl_idx; 103421e9526SXue Chaojing u8 rss_hash_engine; 104421e9526SXue Chaojing u16 num_rss; 105421e9526SXue Chaojing u16 rss_limit; 106421e9526SXue Chaojing struct hinic_rss_type rss_type; 1074fdc51bbSXue Chaojing u8 *rss_hkey_user; 1084fdc51bbSXue Chaojing s32 *rss_indir_user; 109a0337c0dSLuo bin struct hinic_intr_coal_info *rx_intr_coalesce; 110a0337c0dSLuo bin struct hinic_intr_coal_info *tx_intr_coalesce; 1117dd29ee1SLuo bin struct hinic_sriov_info sriov_info; 1124aa218a4SLuo bin int lb_test_rx_idx; 1134aa218a4SLuo bin int lb_pkt_len; 1144aa218a4SLuo bin u8 *lb_test_rx_buf; 115253ac3a9SLuo bin 116253ac3a9SLuo bin struct dentry *dbgfs_root; 117253ac3a9SLuo bin struct dentry *sq_dbgfs; 118626f0603SLuo bin struct dentry *rq_dbgfs; 1195215e162SLuo bin struct dentry *func_tbl_dbgfs; 1205215e162SLuo bin struct hinic_debug_priv *dbg; 1215e126e7cSLuo bin struct devlink *devlink; 122c15850c7SLuo bin bool cable_unplugged; 123c15850c7SLuo bin bool module_unrecognized; 1245e126e7cSLuo bin }; 1255e126e7cSLuo bin 1265e126e7cSLuo bin struct hinic_devlink_priv { 1275e126e7cSLuo bin struct hinic_hwdev *hwdev; 128c15850c7SLuo bin struct devlink_health_reporter *hw_fault_reporter; 129c15850c7SLuo bin struct devlink_health_reporter *fw_fault_reporter; 13051ba902aSAviad Krawczyk }; 13151ba902aSAviad Krawczyk 13251ba902aSAviad Krawczyk #endif 133