diff mbox series

[net-next,v1] igbvf: add PCI reset handler functions

Message ID 20230216122410.337212-1-kamil.maziarz@intel.com
State Changes Requested
Headers show
Series [net-next,v1] igbvf: add PCI reset handler functions | expand

Commit Message

Kamil Maziarz Feb. 16, 2023, 12:24 p.m. UTC
From: Dawid Wesierski <dawidx.wesierski@intel.com>

There was a problem with resuming ping after conducting a PCI reset.
This commit adds two functions, igbvf_io_prepare and igbvf_io_done,
which, after being added to the pci_error_handlers struct,
will prepare the drivers for a PCI reset and then bring the interface up
and reset it after the reset. This will prevent the driver from
ending up in an incorrect state.

Signed-off-by: Dawid Wesierski <dawidx.wesierski@intel.com>
Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com>
---
 drivers/net/ethernet/intel/igbvf/netdev.c | 27 +++++++++++++++++++++++
 1 file changed, 27 insertions(+)

Comments

Tony Nguyen Feb. 16, 2023, 5:13 p.m. UTC | #1
On 2/16/2023 4:24 AM, Kamil Maziarz wrote:
> From: Dawid Wesierski <dawidx.wesierski@intel.com>
> 
> There was a problem with resuming ping after conducting a PCI reset.
> This commit adds two functions, igbvf_io_prepare and igbvf_io_done,
> which, after being added to the pci_error_handlers struct,
> will prepare the drivers for a PCI reset and then bring the interface up
> and reset it after the reset. This will prevent the driver from
> ending up in an incorrect state.
> 
> Signed-off-by: Dawid Wesierski <dawidx.wesierski@intel.com>
> Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com>
> ---
>   drivers/net/ethernet/intel/igbvf/netdev.c | 27 +++++++++++++++++++++++
>   1 file changed, 27 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
> index 72cb1b56e9f2..a89fa422cc5c 100644
> --- a/drivers/net/ethernet/intel/igbvf/netdev.c
> +++ b/drivers/net/ethernet/intel/igbvf/netdev.c
> @@ -2593,6 +2593,31 @@ static void igbvf_io_resume(struct pci_dev *pdev)
>   	netif_device_attach(netdev);
>   }
>   
> +/**
> + * igbvf_io_prepare - prepare device driver for PCI reset
> + * @pdev: PCI device information struct
> + */
> +static void igbvf_io_prepare(struct pci_dev *pdev)
> +{
> +	struct net_device *netdev = pci_get_drvdata(pdev);
> +	struct igbvf_adapter *adapter = netdev_priv(netdev);

newline needed here...

> +	while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state))
> +		usleep_range(1000, 2000);
> +	igbvf_down(adapter);
> +}
> +
> +/**
> + * igbvf_io_reset_done - PCI reset done, device driver reset can begin
> + * @pdev: PCI device information struct
> + */
> +static void igbvf_io_reset_done(struct pci_dev *pdev)
> +{
> +	struct net_device *netdev = pci_get_drvdata(pdev);
> +	struct igbvf_adapter *adapter = netdev_priv(netdev);

... and here

> +	igbvf_up(adapter);
> +	clear_bit(__IGBVF_RESETTING, &adapter->state);
> +}
> +
>   static void igbvf_print_device_info(struct igbvf_adapter *adapter)
>   {
>   	struct e1000_hw *hw = &adapter->hw;
> @@ -2920,6 +2945,8 @@ static const struct pci_error_handlers igbvf_err_handler = {
>   	.error_detected = igbvf_io_error_detected,
>   	.slot_reset = igbvf_io_slot_reset,
>   	.resume = igbvf_io_resume,
> +	.reset_prepare = igbvf_io_prepare,
> +	.reset_done = igbvf_io_reset_done,
>   };
>   
>   static const struct pci_device_id igbvf_pci_tbl[] = {
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
index 72cb1b56e9f2..a89fa422cc5c 100644
--- a/drivers/net/ethernet/intel/igbvf/netdev.c
+++ b/drivers/net/ethernet/intel/igbvf/netdev.c
@@ -2593,6 +2593,31 @@  static void igbvf_io_resume(struct pci_dev *pdev)
 	netif_device_attach(netdev);
 }
 
+/**
+ * igbvf_io_prepare - prepare device driver for PCI reset
+ * @pdev: PCI device information struct
+ */
+static void igbvf_io_prepare(struct pci_dev *pdev)
+{
+	struct net_device *netdev = pci_get_drvdata(pdev);
+	struct igbvf_adapter *adapter = netdev_priv(netdev);
+	while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state))
+		usleep_range(1000, 2000);
+	igbvf_down(adapter);
+}
+
+/**
+ * igbvf_io_reset_done - PCI reset done, device driver reset can begin
+ * @pdev: PCI device information struct
+ */
+static void igbvf_io_reset_done(struct pci_dev *pdev)
+{
+	struct net_device *netdev = pci_get_drvdata(pdev);
+	struct igbvf_adapter *adapter = netdev_priv(netdev);
+	igbvf_up(adapter);
+	clear_bit(__IGBVF_RESETTING, &adapter->state);
+}
+
 static void igbvf_print_device_info(struct igbvf_adapter *adapter)
 {
 	struct e1000_hw *hw = &adapter->hw;
@@ -2920,6 +2945,8 @@  static const struct pci_error_handlers igbvf_err_handler = {
 	.error_detected = igbvf_io_error_detected,
 	.slot_reset = igbvf_io_slot_reset,
 	.resume = igbvf_io_resume,
+	.reset_prepare = igbvf_io_prepare,
+	.reset_done = igbvf_io_reset_done,
 };
 
 static const struct pci_device_id igbvf_pci_tbl[] = {