Skip to content

Commit e2eed0e

Browse files
NetanelBelgazaldavem330
authored andcommitted
net: ena: add reset reason for each device FLR
For each device reset, log to the device what is the cause the reset occur. Signed-off-by: Netanel Belgazal <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9175011 commit e2eed0e

File tree

5 files changed

+54
-6
lines changed

5 files changed

+54
-6
lines changed

drivers/net/ethernet/amazon/ena/ena_com.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1825,7 +1825,8 @@ void ena_com_aenq_intr_handler(struct ena_com_dev *dev, void *data)
18251825
writel((u32)aenq->head, dev->reg_bar + ENA_REGS_AENQ_HEAD_DB_OFF);
18261826
}
18271827

1828-
int ena_com_dev_reset(struct ena_com_dev *ena_dev)
1828+
int ena_com_dev_reset(struct ena_com_dev *ena_dev,
1829+
enum ena_regs_reset_reason_types reset_reason)
18291830
{
18301831
u32 stat, timeout, cap, reset_val;
18311832
int rc;
@@ -1853,6 +1854,8 @@ int ena_com_dev_reset(struct ena_com_dev *ena_dev)
18531854

18541855
/* start reset */
18551856
reset_val = ENA_REGS_DEV_CTL_DEV_RESET_MASK;
1857+
reset_val |= (reset_reason << ENA_REGS_DEV_CTL_RESET_REASON_SHIFT) &
1858+
ENA_REGS_DEV_CTL_RESET_REASON_MASK;
18561859
writel(reset_val, ena_dev->reg_bar + ENA_REGS_DEV_CTL_OFF);
18571860

18581861
/* Write again the MMIO read request address */

drivers/net/ethernet/amazon/ena/ena_com.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,12 @@ void ena_com_admin_destroy(struct ena_com_dev *ena_dev);
420420

421421
/* ena_com_dev_reset - Perform device FLR to the device.
422422
* @ena_dev: ENA communication layer struct
423+
* @reset_reason: Specify what is the trigger for the reset in case of an error.
423424
*
424425
* @return - 0 on success, negative value on failure.
425426
*/
426-
int ena_com_dev_reset(struct ena_com_dev *ena_dev);
427+
int ena_com_dev_reset(struct ena_com_dev *ena_dev,
428+
enum ena_regs_reset_reason_types reset_reason);
427429

428430
/* ena_com_create_io_queue - Create io queue.
429431
* @ena_dev: ENA communication layer struct

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ static void ena_tx_timeout(struct net_device *dev)
8787
if (test_and_set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags))
8888
return;
8989

90+
adapter->reset_reason = ENA_REGS_RESET_OS_NETDEV_WD;
9091
u64_stats_update_begin(&adapter->syncp);
9192
adapter->dev_stats.tx_timeout++;
9293
u64_stats_update_end(&adapter->syncp);
@@ -670,6 +671,7 @@ static int validate_tx_req_id(struct ena_ring *tx_ring, u16 req_id)
670671
u64_stats_update_end(&tx_ring->syncp);
671672

672673
/* Trigger device reset */
674+
tx_ring->adapter->reset_reason = ENA_REGS_RESET_INV_TX_REQ_ID;
673675
set_bit(ENA_FLAG_TRIGGER_RESET, &tx_ring->adapter->flags);
674676
return -EFAULT;
675677
}
@@ -1055,6 +1057,7 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
10551057
u64_stats_update_end(&rx_ring->syncp);
10561058

10571059
/* Too many desc from the device. Trigger reset */
1060+
adapter->reset_reason = ENA_REGS_RESET_TOO_MANY_RX_DESCS;
10581061
set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
10591062

10601063
return 0;
@@ -1720,7 +1723,7 @@ static void ena_down(struct ena_adapter *adapter)
17201723
if (test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags)) {
17211724
int rc;
17221725

1723-
rc = ena_com_dev_reset(adapter->ena_dev);
1726+
rc = ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason);
17241727
if (rc)
17251728
dev_err(&adapter->pdev->dev, "Device reset failed\n");
17261729
}
@@ -2353,7 +2356,7 @@ static int ena_device_init(struct ena_com_dev *ena_dev, struct pci_dev *pdev,
23532356
readless_supported = !(pdev->revision & ENA_MMIO_DISABLE_REG_READ);
23542357
ena_com_set_mmio_read_mode(ena_dev, readless_supported);
23552358

2356-
rc = ena_com_dev_reset(ena_dev);
2359+
rc = ena_com_dev_reset(ena_dev, ENA_REGS_RESET_NORMAL);
23572360
if (rc) {
23582361
dev_err(dev, "Can not reset device\n");
23592362
goto err_mmio_read_less;
@@ -2512,6 +2515,7 @@ static void ena_fw_reset_device(struct work_struct *work)
25122515

25132516
ena_com_mmio_reg_read_request_destroy(ena_dev);
25142517

2518+
adapter->reset_reason = ENA_REGS_RESET_NORMAL;
25152519
clear_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
25162520

25172521
/* Finish with the destroy part. Start the init part */
@@ -2591,6 +2595,8 @@ static int check_missing_comp_in_queue(struct ena_adapter *adapter,
25912595
"The number of lost tx completions is above the threshold (%d > %d). Reset the device\n",
25922596
missed_tx,
25932597
adapter->missing_tx_completion_threshold);
2598+
adapter->reset_reason =
2599+
ENA_REGS_RESET_MISS_TX_CMPL;
25942600
set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
25952601
return -EIO;
25962602
}
@@ -2705,6 +2711,7 @@ static void check_for_missing_keep_alive(struct ena_adapter *adapter)
27052711
u64_stats_update_begin(&adapter->syncp);
27062712
adapter->dev_stats.wd_expired++;
27072713
u64_stats_update_end(&adapter->syncp);
2714+
adapter->reset_reason = ENA_REGS_RESET_KEEP_ALIVE_TO;
27082715
set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
27092716
}
27102717
}
@@ -2717,6 +2724,7 @@ static void check_for_admin_com_state(struct ena_adapter *adapter)
27172724
u64_stats_update_begin(&adapter->syncp);
27182725
adapter->dev_stats.admin_q_pause++;
27192726
u64_stats_update_end(&adapter->syncp);
2727+
adapter->reset_reason = ENA_REGS_RESET_ADMIN_TO;
27202728
set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
27212729
}
27222730
}
@@ -3121,6 +3129,7 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
31213129
ena_set_conf_feat_params(adapter, &get_feat_ctx);
31223130

31233131
adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
3132+
adapter->reset_reason = ENA_REGS_RESET_NORMAL;
31243133

31253134
adapter->tx_ring_size = queue_size;
31263135
adapter->rx_ring_size = queue_size;
@@ -3205,7 +3214,7 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
32053214
ena_com_delete_debug_area(ena_dev);
32063215
ena_com_rss_destroy(ena_dev);
32073216
err_free_msix:
3208-
ena_com_dev_reset(ena_dev);
3217+
ena_com_dev_reset(ena_dev, ENA_REGS_RESET_INIT_ERR);
32093218
ena_free_mgmnt_irq(adapter);
32103219
pci_free_irq_vectors(adapter->pdev);
32113220
err_worker_destroy:
@@ -3288,7 +3297,7 @@ static void ena_remove(struct pci_dev *pdev)
32883297

32893298
/* Reset the device only if the device is running. */
32903299
if (test_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags))
3291-
ena_com_dev_reset(ena_dev);
3300+
ena_com_dev_reset(ena_dev, adapter->reset_reason);
32923301

32933302
ena_free_mgmnt_irq(adapter);
32943303

drivers/net/ethernet/amazon/ena/ena_netdev.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ struct ena_adapter {
327327

328328
/* last queue index that was checked for uncompleted tx packets */
329329
u32 last_monitored_tx_qid;
330+
331+
enum ena_regs_reset_reason_types reset_reason;
330332
};
331333

332334
void ena_set_ethtool_ops(struct net_device *netdev);

drivers/net/ethernet/amazon/ena/ena_regs_defs.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,36 @@
3232
#ifndef _ENA_REGS_H_
3333
#define _ENA_REGS_H_
3434

35+
enum ena_regs_reset_reason_types {
36+
ENA_REGS_RESET_NORMAL = 0,
37+
38+
ENA_REGS_RESET_KEEP_ALIVE_TO = 1,
39+
40+
ENA_REGS_RESET_ADMIN_TO = 2,
41+
42+
ENA_REGS_RESET_MISS_TX_CMPL = 3,
43+
44+
ENA_REGS_RESET_INV_RX_REQ_ID = 4,
45+
46+
ENA_REGS_RESET_INV_TX_REQ_ID = 5,
47+
48+
ENA_REGS_RESET_TOO_MANY_RX_DESCS = 6,
49+
50+
ENA_REGS_RESET_INIT_ERR = 7,
51+
52+
ENA_REGS_RESET_DRIVER_INVALID_STATE = 8,
53+
54+
ENA_REGS_RESET_OS_TRIGGER = 9,
55+
56+
ENA_REGS_RESET_OS_NETDEV_WD = 10,
57+
58+
ENA_REGS_RESET_SHUTDOWN = 11,
59+
60+
ENA_REGS_RESET_USER_TRIGGER = 12,
61+
62+
ENA_REGS_RESET_GENERIC = 13,
63+
};
64+
3565
/* ena_registers offsets */
3666
#define ENA_REGS_VERSION_OFF 0x0
3767
#define ENA_REGS_CONTROLLER_VERSION_OFF 0x4
@@ -104,6 +134,8 @@
104134
#define ENA_REGS_DEV_CTL_QUIESCENT_MASK 0x4
105135
#define ENA_REGS_DEV_CTL_IO_RESUME_SHIFT 3
106136
#define ENA_REGS_DEV_CTL_IO_RESUME_MASK 0x8
137+
#define ENA_REGS_DEV_CTL_RESET_REASON_SHIFT 28
138+
#define ENA_REGS_DEV_CTL_RESET_REASON_MASK 0xf0000000
107139

108140
/* dev_sts register */
109141
#define ENA_REGS_DEV_STS_READY_MASK 0x1

0 commit comments

Comments
 (0)