// SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 1999 - 2018 Intel Corporation. */ #include "vf.h" #include "ixgbevf.h" /* On Hyper-V, to reset, we need to read from this offset * from the PCI config space. This is the mechanism used on * Hyper-V to support PF/VF communication. */ #define IXGBE_HV_RESET_OFFSET … static inline s32 ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, u32 *msg, u32 *retmsg, u16 size) { … } /** * ixgbevf_start_hw_vf - Prepare hardware for Tx/Rx * @hw: pointer to hardware structure * * Starts the hardware by filling the bus info structure and media type, clears * all on chip counters, initializes receive address registers, multicast * table, VLAN filter table, calls routine to set up link and flow control * settings, and leaves transmit and receive units disabled and uninitialized **/ static s32 ixgbevf_start_hw_vf(struct ixgbe_hw *hw) { … } /** * ixgbevf_init_hw_vf - virtual function hardware initialization * @hw: pointer to hardware structure * * Initialize the hardware by resetting the hardware and then starting * the hardware **/ static s32 ixgbevf_init_hw_vf(struct ixgbe_hw *hw) { … } /** * ixgbevf_reset_hw_vf - Performs hardware reset * @hw: pointer to hardware structure * * Resets the hardware by resetting the transmit and receive units, masks and * clears all interrupts. **/ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw) { … } /** * ixgbevf_hv_reset_hw_vf - reset via Hyper-V * @hw: pointer to private hardware struct * * Hyper-V variant; the VF/PF communication is through the PCI * config space. */ static s32 ixgbevf_hv_reset_hw_vf(struct ixgbe_hw *hw) { … } /** * ixgbevf_stop_hw_vf - Generic stop Tx/Rx units * @hw: pointer to hardware structure * * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts, * disables transmit and receive units. The adapter_stopped flag is used by * the shared code and drivers to determine if the adapter is in a stopped * state and should not touch the hardware. **/ static s32 ixgbevf_stop_hw_vf(struct ixgbe_hw *hw) { … } /** * ixgbevf_mta_vector - Determines bit-vector in multicast table to set * @hw: pointer to hardware structure * @mc_addr: the multicast address * * Extracts the 12 bits, from a multicast address, to determine which * bit-vector to set in the multicast table. The hardware uses 12 bits, from * incoming Rx multicast addresses, to determine the bit-vector to check in * the MTA. Which of the 4 combination, of 12-bits, the hardware uses is set * by the MO field of the MCSTCTRL. The MO field is set during initialization * to mc_filter_type. **/ static s32 ixgbevf_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr) { … } /** * ixgbevf_get_mac_addr_vf - Read device MAC address * @hw: pointer to the HW structure * @mac_addr: pointer to storage for retrieved MAC address **/ static s32 ixgbevf_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr) { … } static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr) { … } static s32 ixgbevf_hv_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr) { … } /** * ixgbevf_get_reta_locked - get the RSS redirection table (RETA) contents. * @hw: pointer to hardware structure * @reta: buffer to fill with RETA contents. * @num_rx_queues: Number of Rx queues configured for this port * * The "reta" buffer should be big enough to contain 32 registers. * * Returns: 0 on success. * if API doesn't support this operation - (-EOPNOTSUPP). */ int ixgbevf_get_reta_locked(struct ixgbe_hw *hw, u32 *reta, int num_rx_queues) { … } /** * ixgbevf_get_rss_key_locked - get the RSS Random Key * @hw: pointer to the HW structure * @rss_key: buffer to fill with RSS Hash Key contents. * * The "rss_key" buffer should be big enough to contain 10 registers. * * Returns: 0 on success. * if API doesn't support this operation - (-EOPNOTSUPP). */ int ixgbevf_get_rss_key_locked(struct ixgbe_hw *hw, u8 *rss_key) { … } /** * ixgbevf_set_rar_vf - set device MAC address * @hw: pointer to hardware structure * @index: Receive address register to write * @addr: Address to put into receive address register * @vmdq: Unused in this implementation **/ static s32 ixgbevf_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq) { … } /** * ixgbevf_hv_set_rar_vf - set device MAC address Hyper-V variant * @hw: pointer to hardware structure * @index: Receive address register to write * @addr: Address to put into receive address register * @vmdq: Unused in this implementation * * We don't really allow setting the device MAC address. However, * if the address being set is the permanent MAC address we will * permit that. **/ static s32 ixgbevf_hv_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq) { … } /** * ixgbevf_update_mc_addr_list_vf - Update Multicast addresses * @hw: pointer to the HW structure * @netdev: pointer to net device structure * * Updates the Multicast Table Array. **/ static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, struct net_device *netdev) { … } /** * ixgbevf_hv_update_mc_addr_list_vf - stub * @hw: unused * @netdev: unused * * Hyper-V variant - just a stub. */ static s32 ixgbevf_hv_update_mc_addr_list_vf(struct ixgbe_hw *hw, struct net_device *netdev) { … } /** * ixgbevf_update_xcast_mode - Update Multicast mode * @hw: pointer to the HW structure * @xcast_mode: new multicast mode * * Updates the Multicast Mode of VF. **/ static s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode) { … } /** * ixgbevf_hv_update_xcast_mode - stub * @hw: unused * @xcast_mode: unused * * Hyper-V variant - just a stub. */ static s32 ixgbevf_hv_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode) { … } /** * ixgbevf_get_link_state_vf - Get VF link state from PF * @hw: pointer to the HW structure * @link_state: link state storage * * Returns state of the operation error or success. */ static s32 ixgbevf_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state) { … } /** * ixgbevf_hv_get_link_state_vf - * Hyper-V variant - just a stub. * @hw: unused * @link_state: unused * * Hyper-V variant; there is no mailbox communication. */ static s32 ixgbevf_hv_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state) { … } /** * ixgbevf_set_vfta_vf - Set/Unset VLAN filter table address * @hw: pointer to the HW structure * @vlan: 12 bit VLAN ID * @vind: unused by VF drivers * @vlan_on: if true then set bit, else clear bit **/ static s32 ixgbevf_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on) { … } /** * ixgbevf_hv_set_vfta_vf - * Hyper-V variant - just a stub. * @hw: unused * @vlan: unused * @vind: unused * @vlan_on: unused */ static s32 ixgbevf_hv_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on) { … } /** * ixgbevf_setup_mac_link_vf - Setup MAC link settings * @hw: pointer to hardware structure * @speed: Unused in this implementation * @autoneg: Unused in this implementation * @autoneg_wait_to_complete: Unused in this implementation * * Do nothing and return success. VF drivers are not allowed to change * global settings. Maintained for driver compatibility. **/ static s32 ixgbevf_setup_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { … } /** * ixgbevf_check_mac_link_vf - Get link/speed status * @hw: pointer to hardware structure * @speed: pointer to link speed * @link_up: true is link is up, false otherwise * @autoneg_wait_to_complete: unused * * Reads the links register to determine if link is up and the current speed **/ static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *link_up, bool autoneg_wait_to_complete) { … } /** * ixgbevf_hv_check_mac_link_vf - check link * @hw: pointer to private hardware struct * @speed: pointer to link speed * @link_up: true is link is up, false otherwise * @autoneg_wait_to_complete: unused * * Hyper-V variant; there is no mailbox communication. */ static s32 ixgbevf_hv_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *link_up, bool autoneg_wait_to_complete) { … } /** * ixgbevf_set_rlpml_vf - Set the maximum receive packet length * @hw: pointer to the HW structure * @max_size: value to assign to max frame size **/ static s32 ixgbevf_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size) { … } /** * ixgbevf_hv_set_rlpml_vf - Set the maximum receive packet length * @hw: pointer to the HW structure * @max_size: value to assign to max frame size * Hyper-V variant. **/ static s32 ixgbevf_hv_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size) { … } /** * ixgbevf_negotiate_api_version_vf - Negotiate supported API version * @hw: pointer to the HW structure * @api: integer containing requested API version **/ static int ixgbevf_negotiate_api_version_vf(struct ixgbe_hw *hw, int api) { … } /** * ixgbevf_hv_negotiate_api_version_vf - Negotiate supported API version * @hw: pointer to the HW structure * @api: integer containing requested API version * Hyper-V version - only ixgbe_mbox_api_10 supported. **/ static int ixgbevf_hv_negotiate_api_version_vf(struct ixgbe_hw *hw, int api) { … } int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs, unsigned int *default_tc) { … } static const struct ixgbe_mac_operations ixgbevf_mac_ops = …; static const struct ixgbe_mac_operations ixgbevf_hv_mac_ops = …; const struct ixgbevf_info ixgbevf_82599_vf_info = …; const struct ixgbevf_info ixgbevf_82599_vf_hv_info = …; const struct ixgbevf_info ixgbevf_X540_vf_info = …; const struct ixgbevf_info ixgbevf_X540_vf_hv_info = …; const struct ixgbevf_info ixgbevf_X550_vf_info = …; const struct ixgbevf_info ixgbevf_X550_vf_hv_info = …; const struct ixgbevf_info ixgbevf_X550EM_x_vf_info = …; const struct ixgbevf_info ixgbevf_X550EM_x_vf_hv_info = …; const struct ixgbevf_info ixgbevf_x550em_a_vf_info = …;