@@ -1526,71 +1526,102 @@ static int setup_vq(struct mlx5_vdpa_net *ndev,
1526
1526
return err ;
1527
1527
}
1528
1528
1529
- static void suspend_vq (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq )
1529
+ static int suspend_vq (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq )
1530
1530
{
1531
1531
struct mlx5_virtq_attr attr ;
1532
+ int err ;
1532
1533
1533
1534
if (!mvq -> initialized )
1534
- return ;
1535
+ return 0 ;
1535
1536
1536
1537
if (mvq -> fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY )
1537
- return ;
1538
+ return 0 ;
1538
1539
1539
- if (modify_virtqueue_state (ndev , mvq , MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND ))
1540
- mlx5_vdpa_warn (& ndev -> mvdev , "modify to suspend failed\n" );
1540
+ err = modify_virtqueue_state (ndev , mvq , MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND );
1541
+ if (err ) {
1542
+ mlx5_vdpa_warn (& ndev -> mvdev , "modify to suspend failed, err: %d\n" , err );
1543
+ return err ;
1544
+ }
1541
1545
1542
- if (query_virtqueue (ndev , mvq , & attr )) {
1543
- mlx5_vdpa_warn (& ndev -> mvdev , "failed to query virtqueue\n" );
1544
- return ;
1546
+ err = query_virtqueue (ndev , mvq , & attr );
1547
+ if (err ) {
1548
+ mlx5_vdpa_warn (& ndev -> mvdev , "failed to query virtqueue, err: %d\n" , err );
1549
+ return err ;
1545
1550
}
1551
+
1546
1552
mvq -> avail_idx = attr .available_index ;
1547
1553
mvq -> used_idx = attr .used_index ;
1554
+
1555
+ return 0 ;
1548
1556
}
1549
1557
1550
- static void suspend_vqs (struct mlx5_vdpa_net * ndev )
1558
+ static int suspend_vqs (struct mlx5_vdpa_net * ndev )
1551
1559
{
1560
+ int err = 0 ;
1552
1561
int i ;
1553
1562
1554
- for (i = 0 ; i < ndev -> cur_num_vqs ; i ++ )
1555
- suspend_vq (ndev , & ndev -> vqs [i ]);
1563
+ for (i = 0 ; i < ndev -> cur_num_vqs ; i ++ ) {
1564
+ int local_err = suspend_vq (ndev , & ndev -> vqs [i ]);
1565
+
1566
+ err = local_err ? local_err : err ;
1567
+ }
1568
+
1569
+ return err ;
1556
1570
}
1557
1571
1558
- static void resume_vq (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq )
1572
+ static int resume_vq (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq )
1559
1573
{
1574
+ int err ;
1575
+
1560
1576
if (!mvq -> initialized )
1561
- return ;
1577
+ return 0 ;
1562
1578
1563
1579
switch (mvq -> fw_state ) {
1564
1580
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT :
1565
1581
/* Due to a FW quirk we need to modify the VQ fields first then change state.
1566
1582
* This should be fixed soon. After that, a single command can be used.
1567
1583
*/
1568
- if (modify_virtqueue (ndev , mvq , 0 ))
1584
+ err = modify_virtqueue (ndev , mvq , 0 );
1585
+ if (err ) {
1569
1586
mlx5_vdpa_warn (& ndev -> mvdev ,
1570
- "modify vq properties failed for vq %u\n" , mvq -> index );
1587
+ "modify vq properties failed for vq %u, err: %d\n" ,
1588
+ mvq -> index , err );
1589
+ return err ;
1590
+ }
1571
1591
break ;
1572
1592
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND :
1573
1593
if (!is_resumable (ndev )) {
1574
1594
mlx5_vdpa_warn (& ndev -> mvdev , "vq %d is not resumable\n" , mvq -> index );
1575
- return ;
1595
+ return - EINVAL ;
1576
1596
}
1577
1597
break ;
1578
1598
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY :
1579
- return ;
1599
+ return 0 ;
1580
1600
default :
1581
1601
mlx5_vdpa_warn (& ndev -> mvdev , "resume vq %u called from bad state %d\n" ,
1582
1602
mvq -> index , mvq -> fw_state );
1583
- return ;
1603
+ return - EINVAL ;
1584
1604
}
1585
1605
1586
- if (modify_virtqueue_state (ndev , mvq , MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY ))
1587
- mlx5_vdpa_warn (& ndev -> mvdev , "modify to resume failed for vq %u\n" , mvq -> index );
1606
+ err = modify_virtqueue_state (ndev , mvq , MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY );
1607
+ if (err )
1608
+ mlx5_vdpa_warn (& ndev -> mvdev , "modify to resume failed for vq %u, err: %d\n" ,
1609
+ mvq -> index , err );
1610
+
1611
+ return err ;
1588
1612
}
1589
1613
1590
- static void resume_vqs (struct mlx5_vdpa_net * ndev )
1614
+ static int resume_vqs (struct mlx5_vdpa_net * ndev )
1591
1615
{
1592
- for (int i = 0 ; i < ndev -> cur_num_vqs ; i ++ )
1593
- resume_vq (ndev , & ndev -> vqs [i ]);
1616
+ int err = 0 ;
1617
+
1618
+ for (int i = 0 ; i < ndev -> cur_num_vqs ; i ++ ) {
1619
+ int local_err = resume_vq (ndev , & ndev -> vqs [i ]);
1620
+
1621
+ err = local_err ? local_err : err ;
1622
+ }
1623
+
1624
+ return err ;
1594
1625
}
1595
1626
1596
1627
static void teardown_vq (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq )
0 commit comments