1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Huawei HiNIC PCI Express Linux driver 4 * Copyright(c) 2017 Huawei Technologies Co., Ltd 5 */ 6 7 #ifndef HINIC_DEV_H 8 #define HINIC_DEV_H 9 10 #include <linux/netdevice.h> 11 #include <linux/types.h> 12 #include <linux/semaphore.h> 13 #include <linux/workqueue.h> 14 #include <linux/bitops.h> 15 16 #include "hinic_hw_dev.h" 17 #include "hinic_tx.h" 18 #include "hinic_rx.h" 19 #include "hinic_sriov.h" 20 21 #define HINIC_DRV_NAME "hinic" 22 23 #define LP_PKT_CNT 64 24 25 enum hinic_flags { 26 HINIC_LINK_UP = BIT(0), 27 HINIC_INTF_UP = BIT(1), 28 HINIC_RSS_ENABLE = BIT(2), 29 HINIC_LINK_DOWN = BIT(3), 30 HINIC_LP_TEST = BIT(4), 31 }; 32 33 struct hinic_rx_mode_work { 34 struct work_struct work; 35 u32 rx_mode; 36 }; 37 38 struct hinic_rss_type { 39 u8 tcp_ipv6_ext; 40 u8 ipv6_ext; 41 u8 tcp_ipv6; 42 u8 ipv6; 43 u8 tcp_ipv4; 44 u8 ipv4; 45 u8 udp_ipv6; 46 u8 udp_ipv4; 47 }; 48 49 enum hinic_rss_hash_type { 50 HINIC_RSS_HASH_ENGINE_TYPE_XOR, 51 HINIC_RSS_HASH_ENGINE_TYPE_TOEP, 52 HINIC_RSS_HASH_ENGINE_TYPE_MAX, 53 }; 54 55 struct hinic_intr_coal_info { 56 u8 pending_limt; 57 u8 coalesce_timer_cfg; 58 u8 resend_timer_cfg; 59 }; 60 61 struct hinic_dev { 62 struct net_device *netdev; 63 struct hinic_hwdev *hwdev; 64 65 u32 msg_enable; 66 unsigned int tx_weight; 67 unsigned int rx_weight; 68 u16 num_qps; 69 u16 max_qps; 70 71 unsigned int flags; 72 73 struct semaphore mgmt_lock; 74 unsigned long *vlan_bitmap; 75 76 struct hinic_rx_mode_work rx_mode_work; 77 struct workqueue_struct *workq; 78 79 struct hinic_txq *txqs; 80 struct hinic_rxq *rxqs; 81 u16 sq_depth; 82 u16 rq_depth; 83 84 struct hinic_txq_stats tx_stats; 85 struct hinic_rxq_stats rx_stats; 86 87 u8 rss_tmpl_idx; 88 u8 rss_hash_engine; 89 u16 num_rss; 90 u16 rss_limit; 91 struct hinic_rss_type rss_type; 92 u8 *rss_hkey_user; 93 s32 *rss_indir_user; 94 struct hinic_intr_coal_info *rx_intr_coalesce; 95 struct hinic_intr_coal_info *tx_intr_coalesce; 96 struct hinic_sriov_info sriov_info; 97 int lb_test_rx_idx; 98 int lb_pkt_len; 99 u8 *lb_test_rx_buf; 100 struct devlink *devlink; 101 bool cable_unplugged; 102 bool module_unrecognized; 103 }; 104 105 struct hinic_devlink_priv { 106 struct hinic_hwdev *hwdev; 107 struct devlink_health_reporter *hw_fault_reporter; 108 struct devlink_health_reporter *fw_fault_reporter; 109 }; 110 111 #endif 112