1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Huawei HiNIC PCI Express Linux driver 3*4882a593Smuzhiyun * Copyright(c) 2017 Huawei Technologies Co., Ltd 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef HINIC_SRIOV_H 7*4882a593Smuzhiyun #define HINIC_SRIOV_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "hinic_hw_dev.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define OS_VF_ID_TO_HW(os_vf_id) ((os_vf_id) + 1) 12*4882a593Smuzhiyun #define HW_VF_ID_TO_OS(hw_vf_id) ((hw_vf_id) - 1) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun enum hinic_sriov_state { 15*4882a593Smuzhiyun HINIC_SRIOV_DISABLE, 16*4882a593Smuzhiyun HINIC_SRIOV_ENABLE, 17*4882a593Smuzhiyun HINIC_FUNC_REMOVE, 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun enum { 21*4882a593Smuzhiyun HINIC_IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ 22*4882a593Smuzhiyun HINIC_IFLA_VF_LINK_STATE_ENABLE, /* link always up */ 23*4882a593Smuzhiyun HINIC_IFLA_VF_LINK_STATE_DISABLE, /* link always down */ 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct hinic_sriov_info { 27*4882a593Smuzhiyun struct pci_dev *pdev; 28*4882a593Smuzhiyun struct hinic_hwdev *hwdev; 29*4882a593Smuzhiyun bool sriov_enabled; 30*4882a593Smuzhiyun unsigned int num_vfs; 31*4882a593Smuzhiyun unsigned long state; 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct vf_data_storage { 35*4882a593Smuzhiyun u8 vf_mac_addr[ETH_ALEN]; 36*4882a593Smuzhiyun bool registered; 37*4882a593Smuzhiyun bool pf_set_mac; 38*4882a593Smuzhiyun u16 pf_vlan; 39*4882a593Smuzhiyun u8 pf_qos; 40*4882a593Smuzhiyun u32 max_rate; 41*4882a593Smuzhiyun u32 min_rate; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun bool link_forced; 44*4882a593Smuzhiyun bool link_up; /* only valid if VF link is forced */ 45*4882a593Smuzhiyun bool spoofchk; 46*4882a593Smuzhiyun bool trust; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct hinic_register_vf { 50*4882a593Smuzhiyun u8 status; 51*4882a593Smuzhiyun u8 version; 52*4882a593Smuzhiyun u8 rsvd0[6]; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct hinic_port_mac_update { 56*4882a593Smuzhiyun u8 status; 57*4882a593Smuzhiyun u8 version; 58*4882a593Smuzhiyun u8 rsvd0[6]; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun u16 func_id; 61*4882a593Smuzhiyun u16 vlan_id; 62*4882a593Smuzhiyun u16 rsvd1; 63*4882a593Smuzhiyun u8 old_mac[ETH_ALEN]; 64*4882a593Smuzhiyun u16 rsvd2; 65*4882a593Smuzhiyun u8 new_mac[ETH_ALEN]; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct hinic_vf_vlan_config { 69*4882a593Smuzhiyun u8 status; 70*4882a593Smuzhiyun u8 version; 71*4882a593Smuzhiyun u8 rsvd0[6]; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun u16 func_id; 74*4882a593Smuzhiyun u16 vlan_id; 75*4882a593Smuzhiyun u8 qos; 76*4882a593Smuzhiyun u8 rsvd1[7]; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int hinic_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun int hinic_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos, 82*4882a593Smuzhiyun __be16 vlan_proto); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun int hinic_ndo_get_vf_config(struct net_device *netdev, 85*4882a593Smuzhiyun int vf, struct ifla_vf_info *ivi); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun int hinic_ndo_set_vf_trust(struct net_device *netdev, int vf, bool setting); 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun int hinic_ndo_set_vf_bw(struct net_device *netdev, 90*4882a593Smuzhiyun int vf, int min_tx_rate, int max_tx_rate); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun int hinic_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun int hinic_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun void hinic_notify_all_vfs_link_changed(struct hinic_hwdev *hwdev, 97*4882a593Smuzhiyun u8 link_status); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun int hinic_pci_sriov_disable(struct pci_dev *dev); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun int hinic_pci_sriov_enable(struct pci_dev *dev, int num_vfs); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun int hinic_vf_func_init(struct hinic_hwdev *hwdev); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun void hinic_vf_func_free(struct hinic_hwdev *hwdev); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun int hinic_pci_sriov_configure(struct pci_dev *dev, int num_vfs); 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #endif 110