Commit 8c775344 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

ionic: block actions during fw reset

Block some actions while the FW is in a reset activity
and the queues are not configured.
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent acc606d3
...@@ -184,6 +184,10 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs) ...@@ -184,6 +184,10 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs)
struct device *dev = ionic->dev; struct device *dev = ionic->dev;
int ret = 0; int ret = 0;
if (ionic->lif &&
test_bit(IONIC_LIF_F_FW_RESET, ionic->lif->state))
return -EBUSY;
if (num_vfs > 0) { if (num_vfs > 0) {
ret = pci_enable_sriov(pdev, num_vfs); ret = pci_enable_sriov(pdev, num_vfs);
if (ret) { if (ret) {
......
...@@ -14,18 +14,20 @@ ...@@ -14,18 +14,20 @@
static void ionic_watchdog_cb(struct timer_list *t) static void ionic_watchdog_cb(struct timer_list *t)
{ {
struct ionic *ionic = from_timer(ionic, t, watchdog_timer); struct ionic *ionic = from_timer(ionic, t, watchdog_timer);
struct ionic_lif *lif = ionic->lif;
int hb; int hb;
mod_timer(&ionic->watchdog_timer, mod_timer(&ionic->watchdog_timer,
round_jiffies(jiffies + ionic->watchdog_period)); round_jiffies(jiffies + ionic->watchdog_period));
if (!ionic->lif) if (!lif)
return; return;
hb = ionic_heartbeat_check(ionic); hb = ionic_heartbeat_check(ionic);
if (hb >= 0) if (hb >= 0 &&
ionic_link_status_check_request(ionic->lif, CAN_NOT_SLEEP); !test_bit(IONIC_LIF_F_FW_RESET, lif->state))
ionic_link_status_check_request(lif, CAN_NOT_SLEEP);
} }
void ionic_init_devinfo(struct ionic *ionic) void ionic_init_devinfo(struct ionic *ionic)
......
...@@ -1477,7 +1477,8 @@ static void ionic_tx_timeout_work(struct work_struct *ws) ...@@ -1477,7 +1477,8 @@ static void ionic_tx_timeout_work(struct work_struct *ws)
{ {
struct ionic_lif *lif = container_of(ws, struct ionic_lif, tx_timeout_work); struct ionic_lif *lif = container_of(ws, struct ionic_lif, tx_timeout_work);
netdev_info(lif->netdev, "Tx Timeout recovery\n"); if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
return;
/* if we were stopped before this scheduled job was launched, /* if we were stopped before this scheduled job was launched,
* don't bother the queues as they are already stopped. * don't bother the queues as they are already stopped.
...@@ -1493,6 +1494,7 @@ static void ionic_tx_timeout(struct net_device *netdev, unsigned int txqueue) ...@@ -1493,6 +1494,7 @@ static void ionic_tx_timeout(struct net_device *netdev, unsigned int txqueue)
{ {
struct ionic_lif *lif = netdev_priv(netdev); struct ionic_lif *lif = netdev_priv(netdev);
netdev_info(lif->netdev, "Tx Timeout triggered - txq %d\n", txqueue);
schedule_work(&lif->tx_timeout_work); schedule_work(&lif->tx_timeout_work);
} }
...@@ -1834,6 +1836,9 @@ static int ionic_start_queues(struct ionic_lif *lif) ...@@ -1834,6 +1836,9 @@ static int ionic_start_queues(struct ionic_lif *lif)
{ {
int err; int err;
if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
return -EBUSY;
if (test_and_set_bit(IONIC_LIF_F_UP, lif->state)) if (test_and_set_bit(IONIC_LIF_F_UP, lif->state))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment