2026-01-29 22:25:33 +08:00

183 lines
4.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2021 Huawei Technologies Co., Ltd */
#ifndef HINIC3_NIC_H
#define HINIC3_NIC_H
#include <linux/types.h>
#include <linux/semaphore.h>
#include "hinic3_common.h"
#include "hinic3_nic_io.h"
#include "hinic3_nic_cfg.h"
/* ************************ array index define ********************* */
#define ARRAY_INDEX_0 0
#define ARRAY_INDEX_1 1
#define ARRAY_INDEX_2 2
#define ARRAY_INDEX_3 3
#define ARRAY_INDEX_4 4
#define ARRAY_INDEX_5 5
#define ARRAY_INDEX_6 6
#define ARRAY_INDEX_7 7
struct hinic3_sq_attr {
u8 dma_attr_off;
u8 pending_limit;
u8 coalescing_time;
u8 intr_en;
u16 intr_idx;
u32 l2nic_sqn;
u64 ci_dma_base;
};
struct vf_data_storage {
u8 drv_mac_addr[ETH_ALEN];
u8 user_mac_addr[ETH_ALEN];
bool registered;
bool use_specified_mac;
u16 pf_vlan;
u8 pf_qos;
u8 rsvd2;
u32 max_rate;
u32 min_rate;
bool link_forced;
bool link_up; /* only valid if VF link is forced */
bool spoofchk;
bool trust;
u16 num_qps;
u32 support_extra_feature;
};
struct hinic3_port_routine_cmd {
bool mpu_send_sfp_info;
bool mpu_send_sfp_abs;
struct mag_cmd_get_xsfp_info std_sfp_info;
struct mag_cmd_get_xsfp_present abs;
};
struct hinic3_nic_cfg {
struct semaphore cfg_lock;
/* Valid when pfc is disable */
bool pause_set;
struct nic_pause_config nic_pause;
u8 pfc_en;
u8 pfc_bitmap;
struct nic_port_info port_info;
/* percentage of pf link bandwidth */
u32 pf_bw_limit;
u32 rsvd2;
struct hinic3_port_routine_cmd rt_cmd;
struct mutex sfp_mutex; /* mutex used for copy sfp info */
};
struct hinic3_nic_io {
void *hwdev;
void *pcidev_hdl;
void *dev_hdl;
u8 link_status;
u8 rsvd1;
u32 rsvd2;
struct hinic3_io_queue *sq;
struct hinic3_io_queue *rq;
u16 num_qps;
u16 max_qps;
void *ci_vaddr_base;
dma_addr_t ci_dma_base;
u8 __iomem *sqs_db_addr;
u8 __iomem *rqs_db_addr;
u16 max_vfs;
u16 rsvd3;
u32 rsvd4;
struct vf_data_storage *vf_infos;
struct hinic3_dcb_state dcb_state;
struct hinic3_nic_cfg nic_cfg;
u16 rx_buff_len;
u16 rsvd5;
u32 rsvd6;
u64 feature_cap;
u64 rsvd7;
};
struct vf_msg_handler {
u16 cmd;
int (*handler)(struct hinic3_nic_io *nic_io, u16 vf,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
};
struct nic_event_handler {
u16 cmd;
void (*handler)(void *hwdev, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
};
int hinic3_set_ci_table(void *hwdev, struct hinic3_sq_attr *attr);
int l2nic_msg_to_mgmt_sync(void *hwdev, u16 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
int l2nic_msg_to_mgmt_sync_ch(void *hwdev, u16 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u16 channel);
int hinic3_cfg_vf_vlan(struct hinic3_nic_io *nic_io, u8 opcode, u16 vid,
u8 qos, int vf_id);
int hinic3_vf_event_handler(void *hwdev,
u16 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
void hinic3_pf_event_handler(void *hwdev, u16 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
int hinic3_pf_mbox_handler(void *hwdev,
u16 vf_id, u16 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
u8 hinic3_nic_sw_aeqe_handler(void *hwdev, u8 event, u8 *data);
int hinic3_vf_func_init(struct hinic3_nic_io *nic_io);
void hinic3_vf_func_free(struct hinic3_nic_io *nic_io);
void hinic3_notify_dcb_state_event(struct hinic3_nic_io *nic_io,
struct hinic3_dcb_state *dcb_state);
int hinic3_save_dcb_state(struct hinic3_nic_io *nic_io,
struct hinic3_dcb_state *dcb_state);
void hinic3_notify_vf_link_status(struct hinic3_nic_io *nic_io,
u16 vf_id, u8 link_status);
int hinic3_vf_mag_event_handler(void *hwdev, u16 cmd,
void *buf_in, u16 in_size, void *buf_out,
u16 *out_size);
void hinic3_pf_mag_event_handler(void *pri_handle, u16 cmd,
void *buf_in, u16 in_size, void *buf_out,
u16 *out_size);
int hinic3_pf_mag_mbox_handler(void *hwdev, u16 vf_id,
u16 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
void hinic3_unregister_vf(struct hinic3_nic_io *nic_io, u16 vf_id);
#endif