net: thunderx: make CFG_DONE message to run through generic send-ack sequence [Linux 5.0]

This Linux kernel change "net: thunderx: make CFG_DONE message to run through generic send-ack sequence" is included in the Linux 5.0 release. This change is authored by Vadim Lomovtsev <vlomovtsev [at] marvell.com> on Wed Feb 20 11:02:43 2019 +0000. The commit for this change in Linux stable tree is 0dd563b (patch).

net: thunderx: make CFG_DONE message to run through generic send-ack sequence

At the end of NIC VF initialization VF sends CFG_DONE message to PF without
using nicvf_msg_send_to_pf routine. This potentially could re-write data in
mailbox. This commit is to implement common way of sending CFG_DONE message
by the same way with other configuration messages by using
nicvf_send_msg_to_pf() routine.

Signed-off-by: Vadim Lomovtsev <[email protected]>
Signed-off-by: David S. Miller <[email protected]>

There are 17 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/ethernet/cavium/thunder/nic_main.c   |  2 +-
 drivers/net/ethernet/cavium/thunder/nicvf_main.c | 15 ++++++++++++---
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 6c8dcb6..90497a2 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -1039,7 +1039,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
    case NIC_MBOX_MSG_CFG_DONE:
        /* Last message of VF config msg sequence */
        nic_enable_vf(nic, vf, true);
-       goto unlock;
+       break;
    case NIC_MBOX_MSG_SHUTDOWN:
        /* First msg in VF teardown sequence */
        if (vf >= nic->num_vf_en)
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index abf24e7..19b58fc 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -169,6 +169,17 @@ static int nicvf_check_pf_ready(struct nicvf *nic)
    return 1;
 }

+static void nicvf_send_cfg_done(struct nicvf *nic)
+{
+   union nic_mbx mbx = {};
+
+   mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
+   if (nicvf_send_msg_to_pf(nic, &mbx)) {
+       netdev_err(nic->netdev,
+              "PF didn't respond to CFG DONE msg\n");
+   }
+}
+
 static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx)
 {
    if (bgx->rx)
@@ -1416,7 +1427,6 @@ int nicvf_open(struct net_device *netdev)
    struct nicvf *nic = netdev_priv(netdev);
    struct queue_set *qs = nic->qs;
    struct nicvf_cq_poll *cq_poll = NULL;
-   union nic_mbx mbx = {};

    /* wait till all queued set_rx_mode tasks completes if any */
    drain_workqueue(nic->nicvf_rx_mode_wq);
@@ -1515,8 +1525,7 @@ int nicvf_open(struct net_device *netdev)
        nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx);

    /* Send VF config done msg to PF */
-   mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
-   nicvf_write_to_mbx(nic, &mbx);
+   nicvf_send_cfg_done(nic);

    return 0;
 cleanup:

Leave a Reply

Your email address will not be published. Required fields are marked *