@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, ena_pci_tbl);
4242
4343static int ena_rss_init_default (struct ena_adapter * adapter );
4444static void check_for_admin_com_state (struct ena_adapter * adapter );
45- static void ena_destroy_device (struct ena_adapter * adapter , bool graceful );
45+ static int ena_destroy_device (struct ena_adapter * adapter , bool graceful );
4646static int ena_restore_device (struct ena_adapter * adapter );
4747
4848static void ena_tx_timeout (struct net_device * dev , unsigned int txqueue )
@@ -1347,6 +1347,8 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
13471347 if (rc == - ENOSPC ) {
13481348 ena_increase_stat (& rx_ring -> rx_stats .bad_desc_num , 1 , & rx_ring -> syncp );
13491349 ena_reset_device (adapter , ENA_REGS_RESET_TOO_MANY_RX_DESCS );
1350+ } else if (rc == - EFAULT ) {
1351+ ena_reset_device (adapter , ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED );
13501352 } else {
13511353 ena_increase_stat (& rx_ring -> rx_stats .bad_req_id , 1 ,
13521354 & rx_ring -> syncp );
@@ -2701,6 +2703,7 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pd
27012703{
27022704 struct device * dev = & pdev -> dev ;
27032705 struct ena_admin_host_info * host_info ;
2706+ ssize_t ret ;
27042707 int rc ;
27052708
27062709 /* Allocate only the host info */
@@ -2715,11 +2718,19 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pd
27152718 host_info -> bdf = pci_dev_id (pdev );
27162719 host_info -> os_type = ENA_ADMIN_OS_LINUX ;
27172720 host_info -> kernel_ver = LINUX_VERSION_CODE ;
2718- strscpy (host_info -> kernel_ver_str , utsname ()-> version ,
2719- sizeof (host_info -> kernel_ver_str ) - 1 );
2721+ ret = strscpy (host_info -> kernel_ver_str , utsname ()-> version ,
2722+ sizeof (host_info -> kernel_ver_str ));
2723+ if (ret < 0 )
2724+ dev_dbg (dev ,
2725+ "kernel version string will be truncated, status = %zd\n" , ret );
2726+
27202727 host_info -> os_dist = 0 ;
2721- strscpy (host_info -> os_dist_str , utsname ()-> release ,
2722- sizeof (host_info -> os_dist_str ));
2728+ ret = strscpy (host_info -> os_dist_str , utsname ()-> release ,
2729+ sizeof (host_info -> os_dist_str ));
2730+ if (ret < 0 )
2731+ dev_dbg (dev ,
2732+ "OS distribution string will be truncated, status = %zd\n" , ret );
2733+
27232734 host_info -> driver_version =
27242735 (DRV_MODULE_GEN_MAJOR ) |
27252736 (DRV_MODULE_GEN_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT ) |
@@ -3235,14 +3246,15 @@ static int ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *adapter)
32353246 return rc ;
32363247}
32373248
3238- static void ena_destroy_device (struct ena_adapter * adapter , bool graceful )
3249+ static int ena_destroy_device (struct ena_adapter * adapter , bool graceful )
32393250{
32403251 struct net_device * netdev = adapter -> netdev ;
32413252 struct ena_com_dev * ena_dev = adapter -> ena_dev ;
32423253 bool dev_up ;
3254+ int rc = 0 ;
32433255
32443256 if (!test_bit (ENA_FLAG_DEVICE_RUNNING , & adapter -> flags ))
3245- return ;
3257+ return 0 ;
32463258
32473259 netif_carrier_off (netdev );
32483260
@@ -3260,7 +3272,7 @@ static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
32603272 * and device is up, ena_down() already reset the device.
32613273 */
32623274 if (!(test_bit (ENA_FLAG_TRIGGER_RESET , & adapter -> flags ) && dev_up ))
3263- ena_com_dev_reset (adapter -> ena_dev , adapter -> reset_reason );
3275+ rc = ena_com_dev_reset (adapter -> ena_dev , adapter -> reset_reason );
32643276
32653277 ena_free_mgmnt_irq (adapter );
32663278
@@ -3279,6 +3291,8 @@ static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
32793291
32803292 clear_bit (ENA_FLAG_TRIGGER_RESET , & adapter -> flags );
32813293 clear_bit (ENA_FLAG_DEVICE_RUNNING , & adapter -> flags );
3294+
3295+ return rc ;
32823296}
32833297
32843298static int ena_restore_device (struct ena_adapter * adapter )
@@ -3355,14 +3369,17 @@ static int ena_restore_device(struct ena_adapter *adapter)
33553369
33563370static void ena_fw_reset_device (struct work_struct * work )
33573371{
3372+ int rc = 0 ;
3373+
33583374 struct ena_adapter * adapter =
33593375 container_of (work , struct ena_adapter , reset_task );
33603376
33613377 rtnl_lock ();
33623378
33633379 if (likely (test_bit (ENA_FLAG_TRIGGER_RESET , & adapter -> flags ))) {
3364- ena_destroy_device (adapter , false);
3365- ena_restore_device (adapter );
3380+ rc |= ena_destroy_device (adapter , false);
3381+ rc |= ena_restore_device (adapter );
3382+ adapter -> dev_stats .reset_fail += !!rc ;
33663383
33673384 dev_err (& adapter -> pdev -> dev , "Device reset completed successfully\n" );
33683385 }
0 commit comments