162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Huawei HiNIC PCI Express Linux driver 362306a36Sopenharmony_ci * Copyright(c) 2017 Huawei Technologies Co., Ltd 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef HINIC_SRIOV_H 762306a36Sopenharmony_ci#define HINIC_SRIOV_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "hinic_hw_dev.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define OS_VF_ID_TO_HW(os_vf_id) ((os_vf_id) + 1) 1262306a36Sopenharmony_ci#define HW_VF_ID_TO_OS(hw_vf_id) ((hw_vf_id) - 1) 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cienum hinic_sriov_state { 1562306a36Sopenharmony_ci HINIC_SRIOV_DISABLE, 1662306a36Sopenharmony_ci HINIC_SRIOV_ENABLE, 1762306a36Sopenharmony_ci HINIC_FUNC_REMOVE, 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cienum { 2162306a36Sopenharmony_ci HINIC_IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ 2262306a36Sopenharmony_ci HINIC_IFLA_VF_LINK_STATE_ENABLE, /* link always up */ 2362306a36Sopenharmony_ci HINIC_IFLA_VF_LINK_STATE_DISABLE, /* link always down */ 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct hinic_sriov_info { 2762306a36Sopenharmony_ci struct pci_dev *pdev; 2862306a36Sopenharmony_ci struct hinic_hwdev *hwdev; 2962306a36Sopenharmony_ci bool sriov_enabled; 3062306a36Sopenharmony_ci unsigned int num_vfs; 3162306a36Sopenharmony_ci unsigned long state; 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct vf_data_storage { 3562306a36Sopenharmony_ci u8 vf_mac_addr[ETH_ALEN]; 3662306a36Sopenharmony_ci bool registered; 3762306a36Sopenharmony_ci bool pf_set_mac; 3862306a36Sopenharmony_ci u16 pf_vlan; 3962306a36Sopenharmony_ci u8 pf_qos; 4062306a36Sopenharmony_ci u32 max_rate; 4162306a36Sopenharmony_ci u32 min_rate; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci bool link_forced; 4462306a36Sopenharmony_ci bool link_up; /* only valid if VF link is forced */ 4562306a36Sopenharmony_ci bool spoofchk; 4662306a36Sopenharmony_ci bool trust; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct hinic_register_vf { 5062306a36Sopenharmony_ci u8 status; 5162306a36Sopenharmony_ci u8 version; 5262306a36Sopenharmony_ci u8 rsvd0[6]; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct hinic_port_mac_update { 5662306a36Sopenharmony_ci u8 status; 5762306a36Sopenharmony_ci u8 version; 5862306a36Sopenharmony_ci u8 rsvd0[6]; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci u16 func_id; 6162306a36Sopenharmony_ci u16 vlan_id; 6262306a36Sopenharmony_ci u16 rsvd1; 6362306a36Sopenharmony_ci u8 old_mac[ETH_ALEN]; 6462306a36Sopenharmony_ci u16 rsvd2; 6562306a36Sopenharmony_ci u8 new_mac[ETH_ALEN]; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct hinic_vf_vlan_config { 6962306a36Sopenharmony_ci u8 status; 7062306a36Sopenharmony_ci u8 version; 7162306a36Sopenharmony_ci u8 rsvd0[6]; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci u16 func_id; 7462306a36Sopenharmony_ci u16 vlan_id; 7562306a36Sopenharmony_ci u8 qos; 7662306a36Sopenharmony_ci u8 rsvd1[7]; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciint hinic_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciint hinic_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos, 8262306a36Sopenharmony_ci __be16 vlan_proto); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciint hinic_ndo_get_vf_config(struct net_device *netdev, 8562306a36Sopenharmony_ci int vf, struct ifla_vf_info *ivi); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciint hinic_ndo_set_vf_trust(struct net_device *netdev, int vf, bool setting); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciint hinic_ndo_set_vf_bw(struct net_device *netdev, 9062306a36Sopenharmony_ci int vf, int min_tx_rate, int max_tx_rate); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciint hinic_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciint hinic_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_civoid hinic_notify_all_vfs_link_changed(struct hinic_hwdev *hwdev, 9762306a36Sopenharmony_ci u8 link_status); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciint hinic_pci_sriov_disable(struct pci_dev *dev); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciint hinic_vf_func_init(struct hinic_hwdev *hwdev); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_civoid hinic_vf_func_free(struct hinic_hwdev *hwdev); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ciint hinic_pci_sriov_configure(struct pci_dev *dev, int num_vfs); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#endif 108