// SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2013 - 2019 Intel Corporation. */ #include <linux/module.h> #include <linux/interrupt.h> #include "fm10k.h" static const struct fm10k_info *fm10k_info_tbl[] = …; /* * fm10k_pci_tbl - PCI Device ID Table * * Wildcard entries (PCI_ANY_ID) should come last * Last entry must be all 0s * * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, * Class, Class Mask, private data (not used) } */ static const struct pci_device_id fm10k_pci_tbl[] = …; MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl); u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg) { … } u32 fm10k_read_reg(struct fm10k_hw *hw, int reg) { … } static int fm10k_hw_ready(struct fm10k_intfc *interface) { … } /** * fm10k_macvlan_schedule - Schedule MAC/VLAN queue task * @interface: fm10k private interface structure * * Schedule the MAC/VLAN queue monitor task. If the MAC/VLAN task cannot be * started immediately, request that it be restarted when possible. */ void fm10k_macvlan_schedule(struct fm10k_intfc *interface) { … } /** * fm10k_stop_macvlan_task - Stop the MAC/VLAN queue monitor * @interface: fm10k private interface structure * * Wait until the MAC/VLAN queue task has stopped, and cancel any future * requests. */ static void fm10k_stop_macvlan_task(struct fm10k_intfc *interface) { … } /** * fm10k_resume_macvlan_task - Restart the MAC/VLAN queue monitor * @interface: fm10k private interface structure * * Clear the __FM10K_MACVLAN_DISABLE bit and, if a request occurred, schedule * the MAC/VLAN work monitor. */ static void fm10k_resume_macvlan_task(struct fm10k_intfc *interface) { … } void fm10k_service_event_schedule(struct fm10k_intfc *interface) { … } static void fm10k_service_event_complete(struct fm10k_intfc *interface) { … } static void fm10k_stop_service_event(struct fm10k_intfc *interface) { … } static void fm10k_start_service_event(struct fm10k_intfc *interface) { … } /** * fm10k_service_timer - Timer Call-back * @t: pointer to timer data **/ static void fm10k_service_timer(struct timer_list *t) { … } /** * fm10k_prepare_for_reset - Prepare the driver and device for a pending reset * @interface: fm10k private data structure * * This function prepares for a device reset by shutting as much down as we * can. It does nothing and returns false if __FM10K_RESETTING was already set * prior to calling this function. It returns true if it actually did work. */ static bool fm10k_prepare_for_reset(struct fm10k_intfc *interface) { … } static int fm10k_handle_reset(struct fm10k_intfc *interface) { … } static void fm10k_detach_subtask(struct fm10k_intfc *interface) { … } static void fm10k_reset_subtask(struct fm10k_intfc *interface) { … } /** * fm10k_configure_swpri_map - Configure Receive SWPRI to PC mapping * @interface: board private structure * * Configure the SWPRI to PC mapping for the port. **/ static void fm10k_configure_swpri_map(struct fm10k_intfc *interface) { … } /** * fm10k_watchdog_update_host_state - Update the link status based on host. * @interface: board private structure **/ static void fm10k_watchdog_update_host_state(struct fm10k_intfc *interface) { … } /** * fm10k_mbx_subtask - Process upstream and downstream mailboxes * @interface: board private structure * * This function will process both the upstream and downstream mailboxes. **/ static void fm10k_mbx_subtask(struct fm10k_intfc *interface) { … } /** * fm10k_watchdog_host_is_ready - Update netdev status based on host ready * @interface: board private structure **/ static void fm10k_watchdog_host_is_ready(struct fm10k_intfc *interface) { … } /** * fm10k_watchdog_host_not_ready - Update netdev status based on host not ready * @interface: board private structure **/ static void fm10k_watchdog_host_not_ready(struct fm10k_intfc *interface) { … } /** * fm10k_update_stats - Update the board statistics counters. * @interface: board private structure **/ void fm10k_update_stats(struct fm10k_intfc *interface) { … } /** * fm10k_watchdog_flush_tx - flush queues on host not ready * @interface: pointer to the device interface structure **/ static void fm10k_watchdog_flush_tx(struct fm10k_intfc *interface) { … } /** * fm10k_watchdog_subtask - check and bring link up * @interface: pointer to the device interface structure **/ static void fm10k_watchdog_subtask(struct fm10k_intfc *interface) { … } /** * fm10k_check_hang_subtask - check for hung queues and dropped interrupts * @interface: pointer to the device interface structure * * This function serves two purposes. First it strobes the interrupt lines * in order to make certain interrupts are occurring. Secondly it sets the * bits needed to check for TX hangs. As a result we should immediately * determine if a hang has occurred. */ static void fm10k_check_hang_subtask(struct fm10k_intfc *interface) { … } /** * fm10k_service_task - manages and runs subtasks * @work: pointer to work_struct containing our data **/ static void fm10k_service_task(struct work_struct *work) { … } /** * fm10k_macvlan_task - send queued MAC/VLAN requests to switch manager * @work: pointer to work_struct containing our data * * This work item handles sending MAC/VLAN updates to the switch manager. When * the interface is up, it will attempt to queue mailbox messages to the * switch manager requesting updates for MAC/VLAN pairs. If the Tx fifo of the * mailbox is full, it will reschedule itself to try again in a short while. * This ensures that the driver does not overload the switch mailbox with too * many simultaneous requests, causing an unnecessary reset. **/ static void fm10k_macvlan_task(struct work_struct *work) { … } /** * fm10k_configure_tx_ring - Configure Tx ring after Reset * @interface: board private structure * @ring: structure containing ring specific data * * Configure the Tx descriptor ring after a reset. **/ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface, struct fm10k_ring *ring) { … } /** * fm10k_enable_tx_ring - Verify Tx ring is enabled after configuration * @interface: board private structure * @ring: structure containing ring specific data * * Verify the Tx descriptor ring is ready for transmit. **/ static void fm10k_enable_tx_ring(struct fm10k_intfc *interface, struct fm10k_ring *ring) { … } /** * fm10k_configure_tx - Configure Transmit Unit after Reset * @interface: board private structure * * Configure the Tx unit of the MAC after a reset. **/ static void fm10k_configure_tx(struct fm10k_intfc *interface) { … } /** * fm10k_configure_rx_ring - Configure Rx ring after Reset * @interface: board private structure * @ring: structure containing ring specific data * * Configure the Rx descriptor ring after a reset. **/ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface, struct fm10k_ring *ring) { … } /** * fm10k_update_rx_drop_en - Configures the drop enable bits for Rx rings * @interface: board private structure * * Configure the drop enable bits for the Rx rings. **/ void fm10k_update_rx_drop_en(struct fm10k_intfc *interface) { … } /** * fm10k_configure_dglort - Configure Receive DGLORT after reset * @interface: board private structure * * Configure the DGLORT description and RSS tables. **/ static void fm10k_configure_dglort(struct fm10k_intfc *interface) { … } /** * fm10k_configure_rx - Configure Receive Unit after Reset * @interface: board private structure * * Configure the Rx unit of the MAC after a reset. **/ static void fm10k_configure_rx(struct fm10k_intfc *interface) { … } static void fm10k_napi_enable_all(struct fm10k_intfc *interface) { … } static irqreturn_t fm10k_msix_clean_rings(int __always_unused irq, void *data) { … } static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data) { … } #define FM10K_ERR_MSG(type) … static void fm10k_handle_fault(struct fm10k_intfc *interface, int type, struct fm10k_fault *fault) { … } static void fm10k_report_fault(struct fm10k_intfc *interface, u32 eicr) { … } static void fm10k_reset_drop_on_empty(struct fm10k_intfc *interface, u32 eicr) { … } static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) { … } void fm10k_mbx_free_irq(struct fm10k_intfc *interface) { … } static s32 fm10k_mbx_mac_addr(struct fm10k_hw *hw, u32 **results, struct fm10k_mbx_info *mbx) { … } /* generic error handler for mailbox issues */ static s32 fm10k_mbx_error(struct fm10k_hw *hw, u32 **results, struct fm10k_mbx_info __always_unused *mbx) { … } static const struct fm10k_msg_data vf_mbx_data[] = …; static int fm10k_mbx_request_irq_vf(struct fm10k_intfc *interface) { … } static s32 fm10k_lport_map(struct fm10k_hw *hw, u32 **results, struct fm10k_mbx_info *mbx) { … } static s32 fm10k_update_pvid(struct fm10k_hw *hw, u32 **results, struct fm10k_mbx_info __always_unused *mbx) { … } static const struct fm10k_msg_data pf_mbx_data[] = …; static int fm10k_mbx_request_irq_pf(struct fm10k_intfc *interface) { … } int fm10k_mbx_request_irq(struct fm10k_intfc *interface) { … } /** * fm10k_qv_free_irq - release interrupts associated with queue vectors * @interface: board private structure * * Release all interrupts associated with this interface **/ void fm10k_qv_free_irq(struct fm10k_intfc *interface) { … } /** * fm10k_qv_request_irq - initialize interrupts for queue vectors * @interface: board private structure * * Attempts to configure interrupts using the best available * capabilities of the hardware and kernel. **/ int fm10k_qv_request_irq(struct fm10k_intfc *interface) { … } void fm10k_up(struct fm10k_intfc *interface) { … } static void fm10k_napi_disable_all(struct fm10k_intfc *interface) { … } void fm10k_down(struct fm10k_intfc *interface) { … } /** * fm10k_sw_init - Initialize general software structures * @interface: host interface private structure to initialize * @ent: PCI device ID entry * * fm10k_sw_init initializes the interface private data structure. * Fields are initialized based on PCI device information and * OS network device settings (MTU size). **/ static int fm10k_sw_init(struct fm10k_intfc *interface, const struct pci_device_id *ent) { … } /** * fm10k_probe - Device Initialization Routine * @pdev: PCI device information struct * @ent: entry in fm10k_pci_tbl * * Returns 0 on success, negative on failure * * fm10k_probe initializes an interface identified by a pci_dev structure. * The OS initialization, configuring of the interface private structure, * and a hardware reset occur. **/ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { … } /** * fm10k_remove - Device Removal Routine * @pdev: PCI device information struct * * fm10k_remove is called by the PCI subsystem to alert the driver * that it should release a PCI device. The could be caused by a * Hot-Plug event, or because the driver is going to be removed from * memory. **/ static void fm10k_remove(struct pci_dev *pdev) { … } static void fm10k_prepare_suspend(struct fm10k_intfc *interface) { … } static int fm10k_handle_resume(struct fm10k_intfc *interface) { … } /** * fm10k_resume - Generic PM resume hook * @dev: generic device structure * * Generic PM hook used when waking the device from a low power state after * suspend or hibernation. This function does not need to handle lower PCIe * device state as the stack takes care of that for us. **/ static int fm10k_resume(struct device *dev) { … } /** * fm10k_suspend - Generic PM suspend hook * @dev: generic device structure * * Generic PM hook used when setting the device into a low power state for * system suspend or hibernation. This function does not need to handle lower * PCIe device state as the stack takes care of that for us. **/ static int fm10k_suspend(struct device *dev) { … } /** * fm10k_io_error_detected - called when PCI error is detected * @pdev: Pointer to PCI device * @state: The current pci connection state * * This function is called after a PCI bus error affecting * this device has been detected. */ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state) { … } /** * fm10k_io_slot_reset - called after the pci bus has been reset. * @pdev: Pointer to PCI device * * Restart the card from scratch, as if from a cold-boot. */ static pci_ers_result_t fm10k_io_slot_reset(struct pci_dev *pdev) { … } /** * fm10k_io_resume - called when traffic can start flowing again. * @pdev: Pointer to PCI device * * This callback is called when the error recovery driver tells us that * its OK to resume normal operation. */ static void fm10k_io_resume(struct pci_dev *pdev) { … } /** * fm10k_io_reset_prepare - called when PCI function is about to be reset * @pdev: Pointer to PCI device * * This callback is called when the PCI function is about to be reset, * allowing the device driver to prepare for it. */ static void fm10k_io_reset_prepare(struct pci_dev *pdev) { … } /** * fm10k_io_reset_done - called when PCI function has finished resetting * @pdev: Pointer to PCI device * * This callback is called just after the PCI function is reset, such as via * /sys/class/net/<enpX>/device/reset or similar. */ static void fm10k_io_reset_done(struct pci_dev *pdev) { … } static const struct pci_error_handlers fm10k_err_handler = …; static DEFINE_SIMPLE_DEV_PM_OPS(fm10k_pm_ops, fm10k_suspend, fm10k_resume); static struct pci_driver fm10k_driver = …; /** * fm10k_register_pci_driver - register driver interface * * This function is called on module load in order to register the driver. **/ int fm10k_register_pci_driver(void) { … } /** * fm10k_unregister_pci_driver - unregister driver interface * * This function is called on module unload in order to remove the driver. **/ void fm10k_unregister_pci_driver(void) { … }