// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2015 - 2022 Beijing WangXun Technology Co., Ltd. */ #include <linux/etherdevice.h> #include <linux/netdevice.h> #include <linux/if_ether.h> #include <linux/if_vlan.h> #include <linux/iopoll.h> #include <linux/pci.h> #include "wx_type.h" #include "wx_lib.h" #include "wx_hw.h" static int wx_phy_read_reg_mdi(struct mii_bus *bus, int phy_addr, int devnum, int regnum) { … } static int wx_phy_write_reg_mdi(struct mii_bus *bus, int phy_addr, int devnum, int regnum, u16 value) { … } int wx_phy_read_reg_mdi_c22(struct mii_bus *bus, int phy_addr, int regnum) { … } EXPORT_SYMBOL(…); int wx_phy_write_reg_mdi_c22(struct mii_bus *bus, int phy_addr, int regnum, u16 value) { … } EXPORT_SYMBOL(…); int wx_phy_read_reg_mdi_c45(struct mii_bus *bus, int phy_addr, int devnum, int regnum) { … } EXPORT_SYMBOL(…); int wx_phy_write_reg_mdi_c45(struct mii_bus *bus, int phy_addr, int devnum, int regnum, u16 value) { … } EXPORT_SYMBOL(…); static void wx_intr_disable(struct wx *wx, u64 qmask) { … } void wx_intr_enable(struct wx *wx, u64 qmask) { … } EXPORT_SYMBOL(…); /** * wx_irq_disable - Mask off interrupt generation on the NIC * @wx: board private structure **/ void wx_irq_disable(struct wx *wx) { … } EXPORT_SYMBOL(…); /* cmd_addr is used for some special command: * 1. to be sector address, when implemented erase sector command * 2. to be flash address when implemented read, write flash address */ static int wx_fmgr_cmd_op(struct wx *wx, u32 cmd, u32 cmd_addr) { … } static int wx_flash_read_dword(struct wx *wx, u32 addr, u32 *data) { … } int wx_check_flash_load(struct wx *hw, u32 check_bit) { … } EXPORT_SYMBOL(…); void wx_control_hw(struct wx *wx, bool drv) { … } EXPORT_SYMBOL(…); /** * wx_mng_present - returns 0 when management capability is present * @wx: pointer to hardware structure */ int wx_mng_present(struct wx *wx) { … } EXPORT_SYMBOL(…); /* Software lock to be held while software semaphore is being accessed. */ static DEFINE_MUTEX(wx_sw_sync_lock); /** * wx_release_sw_sync - Release SW semaphore * @wx: pointer to hardware structure * @mask: Mask to specify which semaphore to release * * Releases the SW semaphore for the specified * function (CSR, PHY0, PHY1, EEPROM, Flash) **/ static void wx_release_sw_sync(struct wx *wx, u32 mask) { … } /** * wx_acquire_sw_sync - Acquire SW semaphore * @wx: pointer to hardware structure * @mask: Mask to specify which semaphore to acquire * * Acquires the SW semaphore for the specified * function (CSR, PHY0, PHY1, EEPROM, Flash) **/ static int wx_acquire_sw_sync(struct wx *wx, u32 mask) { … } /** * wx_host_interface_command - Issue command to manageability block * @wx: pointer to the HW structure * @buffer: contains the command to write and where the return status will * be placed * @length: length of buffer, must be multiple of 4 bytes * @timeout: time in ms to wait for command completion * @return_data: read and return data from the buffer (true) or not (false) * Needed because FW structures are big endian and decoding of * these fields can be 8 bit or 16 bit based on command. Decoding * is not easily understood without making a table of commands. * So we will leave this up to the caller to read back the data * in these cases. **/ int wx_host_interface_command(struct wx *wx, u32 *buffer, u32 length, u32 timeout, bool return_data) { … } EXPORT_SYMBOL(…); /** * wx_read_ee_hostif_data - Read EEPROM word using a host interface cmd * assuming that the semaphore is already obtained. * @wx: pointer to hardware structure * @offset: offset of word in the EEPROM to read * @data: word read from the EEPROM * * Reads a 16 bit word from the EEPROM using the hostif. **/ static int wx_read_ee_hostif_data(struct wx *wx, u16 offset, u16 *data) { … } /** * wx_read_ee_hostif - Read EEPROM word using a host interface cmd * @wx: pointer to hardware structure * @offset: offset of word in the EEPROM to read * @data: word read from the EEPROM * * Reads a 16 bit word from the EEPROM using the hostif. **/ int wx_read_ee_hostif(struct wx *wx, u16 offset, u16 *data) { … } EXPORT_SYMBOL(…); /** * wx_read_ee_hostif_buffer- Read EEPROM word(s) using hostif * @wx: pointer to hardware structure * @offset: offset of word in the EEPROM to read * @words: number of words * @data: word(s) read from the EEPROM * * Reads a 16 bit word(s) from the EEPROM using the hostif. **/ int wx_read_ee_hostif_buffer(struct wx *wx, u16 offset, u16 words, u16 *data) { … } EXPORT_SYMBOL(…); /** * wx_init_eeprom_params - Initialize EEPROM params * @wx: pointer to hardware structure * * Initializes the EEPROM parameters wx_eeprom_info within the * wx_hw struct in order to set up EEPROM access. **/ void wx_init_eeprom_params(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_get_mac_addr - Generic get MAC address * @wx: pointer to hardware structure * @mac_addr: Adapter MAC address * * Reads the adapter's MAC address from first Receive Address Register (RAR0) * A reset of the adapter must be performed prior to calling this function * in order for the MAC address to have been loaded from the EEPROM into RAR0 **/ void wx_get_mac_addr(struct wx *wx, u8 *mac_addr) { … } EXPORT_SYMBOL(…); /** * wx_set_rar - Set Rx address register * @wx: pointer to hardware structure * @index: Receive address register to write * @addr: Address to put into receive address register * @pools: VMDq "set" or "pool" index * @enable_addr: set flag that address is active * * Puts an ethernet address into a receive address register. **/ static int wx_set_rar(struct wx *wx, u32 index, u8 *addr, u64 pools, u32 enable_addr) { … } /** * wx_clear_rar - Remove Rx address register * @wx: pointer to hardware structure * @index: Receive address register to write * * Clears an ethernet address from a receive address register. **/ static int wx_clear_rar(struct wx *wx, u32 index) { … } /** * wx_clear_vmdq - Disassociate a VMDq pool index from a rx address * @wx: pointer to hardware struct * @rar: receive address register index to disassociate * @vmdq: VMDq pool index to remove from the rar **/ static int wx_clear_vmdq(struct wx *wx, u32 rar, u32 __maybe_unused vmdq) { … } /** * wx_init_uta_tables - Initialize the Unicast Table Array * @wx: pointer to hardware structure **/ static void wx_init_uta_tables(struct wx *wx) { … } /** * wx_init_rx_addrs - Initializes receive address filters. * @wx: pointer to hardware structure * * Places the MAC address in receive address register 0 and clears the rest * of the receive address registers. Clears the multicast table. Assumes * the receiver is in reset when the routine is called. **/ void wx_init_rx_addrs(struct wx *wx) { … } EXPORT_SYMBOL(…); static void wx_sync_mac_table(struct wx *wx) { … } /* this function destroys the first RAR entry */ void wx_mac_set_default_filter(struct wx *wx, u8 *addr) { … } EXPORT_SYMBOL(…); void wx_flush_sw_mac_table(struct wx *wx) { … } EXPORT_SYMBOL(…); static int wx_add_mac_filter(struct wx *wx, u8 *addr, u16 pool) { … } static int wx_del_mac_filter(struct wx *wx, u8 *addr, u16 pool) { … } static int wx_available_rars(struct wx *wx) { … } /** * wx_write_uc_addr_list - write unicast addresses to RAR table * @netdev: network interface device structure * @pool: index for mac table * * Writes unicast address list to the RAR table. * Returns: -ENOMEM on failure/insufficient address space * 0 on no addresses written * X on writing X addresses to the RAR table **/ static int wx_write_uc_addr_list(struct net_device *netdev, int pool) { … } /** * wx_mta_vector - Determines bit-vector in multicast table to set * @wx: pointer to private 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 u32 wx_mta_vector(struct wx *wx, u8 *mc_addr) { … } /** * wx_set_mta - Set bit-vector in multicast table * @wx: pointer to private structure * @mc_addr: Multicast address * * Sets the bit-vector in the multicast table. **/ static void wx_set_mta(struct wx *wx, u8 *mc_addr) { … } /** * wx_update_mc_addr_list - Updates MAC list of multicast addresses * @wx: pointer to private structure * @netdev: pointer to net device structure * * The given list replaces any existing list. Clears the MC addrs from receive * address registers and the multicast table. Uses unused receive address * registers for the first multicast addresses, and hashes the rest into the * multicast table. **/ static void wx_update_mc_addr_list(struct wx *wx, struct net_device *netdev) { … } /** * wx_write_mc_addr_list - write multicast addresses to MTA * @netdev: network interface device structure * * Writes multicast address list to the MTA hash table. * Returns: 0 on no addresses written * X on writing X addresses to MTA **/ static int wx_write_mc_addr_list(struct net_device *netdev) { … } /** * wx_set_mac - Change the Ethernet Address of the NIC * @netdev: network interface device structure * @p: pointer to an address structure * * Returns 0 on success, negative on failure **/ int wx_set_mac(struct net_device *netdev, void *p) { … } EXPORT_SYMBOL(…); void wx_disable_rx(struct wx *wx) { … } EXPORT_SYMBOL(…); static void wx_enable_rx(struct wx *wx) { … } /** * wx_set_rxpba - Initialize Rx packet buffer * @wx: pointer to private structure **/ static void wx_set_rxpba(struct wx *wx) { … } #define WX_ETH_FRAMING … /** * wx_hpbthresh - calculate high water mark for flow control * * @wx: board private structure to calculate for **/ static int wx_hpbthresh(struct wx *wx) { … } /** * wx_lpbthresh - calculate low water mark for flow control * * @wx: board private structure to calculate for **/ static int wx_lpbthresh(struct wx *wx) { … } /** * wx_pbthresh_setup - calculate and setup high low water marks * * @wx: board private structure to calculate for **/ static void wx_pbthresh_setup(struct wx *wx) { … } static void wx_configure_port(struct wx *wx) { … } /** * wx_disable_sec_rx_path - Stops the receive data path * @wx: pointer to private structure * * Stops the receive data path and waits for the HW to internally empty * the Rx security block **/ int wx_disable_sec_rx_path(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_enable_sec_rx_path - Enables the receive data path * @wx: pointer to private structure * * Enables the receive data path. **/ void wx_enable_sec_rx_path(struct wx *wx) { … } EXPORT_SYMBOL(…); static void wx_vlan_strip_control(struct wx *wx, bool enable) { … } void wx_set_rx_mode(struct net_device *netdev) { … } EXPORT_SYMBOL(…); static void wx_set_rx_buffer_len(struct wx *wx) { … } /** * wx_change_mtu - Change the Maximum Transfer Unit * @netdev: network interface device structure * @new_mtu: new value for maximum frame size * * Returns 0 on success, negative on failure **/ int wx_change_mtu(struct net_device *netdev, int new_mtu) { … } EXPORT_SYMBOL(…); /* Disable the specified rx queue */ void wx_disable_rx_queue(struct wx *wx, struct wx_ring *ring) { … } EXPORT_SYMBOL(…); static void wx_enable_rx_queue(struct wx *wx, struct wx_ring *ring) { … } static void wx_configure_srrctl(struct wx *wx, struct wx_ring *rx_ring) { … } static void wx_configure_tx_ring(struct wx *wx, struct wx_ring *ring) { … } static void wx_configure_rx_ring(struct wx *wx, struct wx_ring *ring) { … } /** * wx_configure_tx - Configure Transmit Unit after Reset * @wx: pointer to private structure * * Configure the Tx unit of the MAC after a reset. **/ static void wx_configure_tx(struct wx *wx) { … } static void wx_restore_vlan(struct wx *wx) { … } static void wx_store_reta(struct wx *wx) { … } static void wx_setup_reta(struct wx *wx) { … } static void wx_setup_mrqc(struct wx *wx) { … } /** * wx_configure_rx - Configure Receive Unit after Reset * @wx: pointer to private structure * * Configure the Rx unit of the MAC after a reset. **/ void wx_configure_rx(struct wx *wx) { … } EXPORT_SYMBOL(…); static void wx_configure_isb(struct wx *wx) { … } void wx_configure(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_disable_pcie_master - Disable PCI-express master access * @wx: pointer to hardware structure * * Disables PCI-Express master access and verifies there are no pending * requests. **/ int wx_disable_pcie_master(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_stop_adapter - Generic stop Tx/Rx units * @wx: pointer to hardware structure * * Sets the adapter_stopped flag within wx_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. **/ int wx_stop_adapter(struct wx *wx) { … } EXPORT_SYMBOL(…); void wx_reset_misc(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_get_pcie_msix_counts - Gets MSI-X vector count * @wx: pointer to hardware structure * @msix_count: number of MSI interrupts that can be obtained * @max_msix_count: number of MSI interrupts that mac need * * Read PCIe configuration space, and get the MSI-X vector count from * the capabilities table. **/ int wx_get_pcie_msix_counts(struct wx *wx, u16 *msix_count, u16 max_msix_count) { … } EXPORT_SYMBOL(…); /** * wx_init_rss_key - Initialize wx RSS key * @wx: device handle * * Allocates and initializes the RSS key if it is not allocated. **/ static int wx_init_rss_key(struct wx *wx) { … } int wx_sw_init(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_find_vlvf_slot - find the vlanid or the first empty slot * @wx: pointer to hardware structure * @vlan: VLAN id to write to VLAN filter * * return the VLVF index where this VLAN id should be placed * **/ static int wx_find_vlvf_slot(struct wx *wx, u32 vlan) { … } /** * wx_set_vlvf - Set VLAN Pool Filter * @wx: pointer to hardware structure * @vlan: VLAN id to write to VLAN filter * @vind: VMDq output index that maps queue to VLAN id in VFVFB * @vlan_on: boolean flag to turn on/off VLAN in VFVF * @vfta_changed: pointer to boolean flag which indicates whether VFTA * should be changed * * Turn on/off specified bit in VLVF table. **/ static int wx_set_vlvf(struct wx *wx, u32 vlan, u32 vind, bool vlan_on, bool *vfta_changed) { … } /** * wx_set_vfta - Set VLAN filter table * @wx: pointer to hardware structure * @vlan: VLAN id to write to VLAN filter * @vind: VMDq output index that maps queue to VLAN id in VFVFB * @vlan_on: boolean flag to turn on/off VLAN in VFVF * * Turn on/off specified VLAN in the VLAN filter table. **/ static int wx_set_vfta(struct wx *wx, u32 vlan, u32 vind, bool vlan_on) { … } /** * wx_clear_vfta - Clear VLAN filter table * @wx: pointer to hardware structure * * Clears the VLAN filer table, and the VMDq index associated with the filter **/ static void wx_clear_vfta(struct wx *wx) { … } int wx_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid) { … } EXPORT_SYMBOL(…); int wx_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid) { … } EXPORT_SYMBOL(…); static void wx_enable_rx_drop(struct wx *wx, struct wx_ring *ring) { … } static void wx_disable_rx_drop(struct wx *wx, struct wx_ring *ring) { … } int wx_fc_enable(struct wx *wx, bool tx_pause, bool rx_pause) { … } EXPORT_SYMBOL(…); /** * wx_update_stats - Update the board statistics counters. * @wx: board private structure **/ void wx_update_stats(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_clear_hw_cntrs - Generic clear hardware counters * @wx: board private structure * * Clears all hardware statistics counters by reading them from the hardware * Statistics counters are clear on read. **/ void wx_clear_hw_cntrs(struct wx *wx) { … } EXPORT_SYMBOL(…); /** * wx_start_hw - Prepare hardware for Tx/Rx * @wx: pointer to hardware structure * * Starts the hardware using the generic start_hw function * and the generation start_hw function. * Then performs revision-specific operations, if any. **/ void wx_start_hw(struct wx *wx) { … } EXPORT_SYMBOL(…); MODULE_LICENSE(…) …;