|
@@ -136,11 +136,9 @@ static void fm10k_detach_subtask(struct fm10k_intfc *interface)
|
|
rtnl_unlock();
|
|
rtnl_unlock();
|
|
}
|
|
}
|
|
|
|
|
|
-static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
|
|
+static void fm10k_prepare_for_reset(struct fm10k_intfc *interface)
|
|
{
|
|
{
|
|
struct net_device *netdev = interface->netdev;
|
|
struct net_device *netdev = interface->netdev;
|
|
- struct fm10k_hw *hw = &interface->hw;
|
|
|
|
- int err;
|
|
|
|
|
|
|
|
WARN_ON(in_interrupt());
|
|
WARN_ON(in_interrupt());
|
|
|
|
|
|
@@ -165,6 +163,17 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
/* delay any future reset requests */
|
|
/* delay any future reset requests */
|
|
interface->last_reset = jiffies + (10 * HZ);
|
|
interface->last_reset = jiffies + (10 * HZ);
|
|
|
|
|
|
|
|
+ rtnl_unlock();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int fm10k_handle_reset(struct fm10k_intfc *interface)
|
|
|
|
+{
|
|
|
|
+ struct net_device *netdev = interface->netdev;
|
|
|
|
+ struct fm10k_hw *hw = &interface->hw;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ rtnl_lock();
|
|
|
|
+
|
|
/* reset and initialize the hardware so it is in a known state */
|
|
/* reset and initialize the hardware so it is in a known state */
|
|
err = hw->mac.ops.reset_hw(hw);
|
|
err = hw->mac.ops.reset_hw(hw);
|
|
if (err) {
|
|
if (err) {
|
|
@@ -185,7 +194,7 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
goto reinit_err;
|
|
goto reinit_err;
|
|
}
|
|
}
|
|
|
|
|
|
- /* reassociate interrupts */
|
|
|
|
|
|
+ /* re-associate interrupts */
|
|
err = fm10k_mbx_request_irq(interface);
|
|
err = fm10k_mbx_request_irq(interface);
|
|
if (err)
|
|
if (err)
|
|
goto err_mbx_irq;
|
|
goto err_mbx_irq;
|
|
@@ -219,7 +228,7 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
|
|
clear_bit(__FM10K_RESETTING, &interface->state);
|
|
clear_bit(__FM10K_RESETTING, &interface->state);
|
|
|
|
|
|
- return;
|
|
|
|
|
|
+ return err;
|
|
err_open:
|
|
err_open:
|
|
fm10k_mbx_free_irq(interface);
|
|
fm10k_mbx_free_irq(interface);
|
|
err_mbx_irq:
|
|
err_mbx_irq:
|
|
@@ -230,6 +239,20 @@ reinit_err:
|
|
rtnl_unlock();
|
|
rtnl_unlock();
|
|
|
|
|
|
clear_bit(__FM10K_RESETTING, &interface->state);
|
|
clear_bit(__FM10K_RESETTING, &interface->state);
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
+{
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ fm10k_prepare_for_reset(interface);
|
|
|
|
+
|
|
|
|
+ err = fm10k_handle_reset(interface);
|
|
|
|
+ if (err)
|
|
|
|
+ dev_err(&interface->pdev->dev,
|
|
|
|
+ "fm10k_handle_reset failed: %d\n", err);
|
|
}
|
|
}
|
|
|
|
|
|
static void fm10k_reset_subtask(struct fm10k_intfc *interface)
|
|
static void fm10k_reset_subtask(struct fm10k_intfc *interface)
|