Skip to content

Commit

Permalink
ionic: block actions during fw reset
Browse files Browse the repository at this point in the history
Block some actions while the FW is in a reset activity
and the queues are not configured.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Shannon Nelson authored and David S. Miller committed Mar 19, 2021
1 parent acc606d commit 8c77534
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
4 changes: 4 additions & 0 deletions drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,10 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs)
struct device *dev = ionic->dev;
int ret = 0;

if (ionic->lif &&
test_bit(IONIC_LIF_F_FW_RESET, ionic->lif->state))
return -EBUSY;

if (num_vfs > 0) {
ret = pci_enable_sriov(pdev, num_vfs);
if (ret) {
Expand Down
8 changes: 5 additions & 3 deletions drivers/net/ethernet/pensando/ionic/ionic_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,20 @@
static void ionic_watchdog_cb(struct timer_list *t)
{
struct ionic *ionic = from_timer(ionic, t, watchdog_timer);
struct ionic_lif *lif = ionic->lif;
int hb;

mod_timer(&ionic->watchdog_timer,
round_jiffies(jiffies + ionic->watchdog_period));

if (!ionic->lif)
if (!lif)
return;

hb = ionic_heartbeat_check(ionic);

if (hb >= 0)
ionic_link_status_check_request(ionic->lif, CAN_NOT_SLEEP);
if (hb >= 0 &&
!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)
Expand Down
7 changes: 6 additions & 1 deletion drivers/net/ethernet/pensando/ionic/ionic_lif.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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,
* don't bother the queues as they are already stopped.
Expand All @@ -1493,6 +1494,7 @@ static void ionic_tx_timeout(struct net_device *netdev, unsigned int txqueue)
{
struct ionic_lif *lif = netdev_priv(netdev);

netdev_info(lif->netdev, "Tx Timeout triggered - txq %d\n", txqueue);
schedule_work(&lif->tx_timeout_work);
}

Expand Down Expand Up @@ -1834,6 +1836,9 @@ static int ionic_start_queues(struct ionic_lif *lif)
{
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))
return 0;

Expand Down

0 comments on commit 8c77534

Please sign in to comment.