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 |
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 --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[] = {