Refactor bnx2x_do_req4pf() to be easier to read and return errors when
the transaction fails -- Previously, it could succeed when the control
channel was down.

Fixes: 540a211084a7 ("bnx2x: driver core")

Signed-off-by: Chas Williams <3chas3 at gmail.com>
---
 drivers/net/bnx2x/bnx2x_vfpf.c | 110 +++++++++++++++++++++++------------------
 1 file changed, 61 insertions(+), 49 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_vfpf.c b/drivers/net/bnx2x/bnx2x_vfpf.c
index 46b56b4..70622db 100644
--- a/drivers/net/bnx2x/bnx2x_vfpf.c
+++ b/drivers/net/bnx2x/bnx2x_vfpf.c
@@ -118,39 +118,36 @@ bnx2x_do_req4pf(struct bnx2x_softc *sc, phys_addr_t 
phys_addr)
        uint8_t *status = &sc->vf2pf_mbox->resp.common_reply.status;
        uint8_t i;

-       if (!*status) {
-               bnx2x_check_bull(sc);
-               if (sc->old_bulletin.valid_bitmap & (1 << CHANNEL_DOWN)) {
-                       PMD_DRV_LOG(ERR, "channel is down. Aborting message 
sending");
-                       *status = BNX2X_VF_STATUS_SUCCESS;
-                       return 0;
-               }
+       if (*status) {
+               PMD_DRV_LOG(ERR, "status should be zero before message"
+                                " to pf was sent");
+               return -EINVAL;
+       }

-               REG_WR(sc, BNX2X_VF_CMD_ADDR_LO, U64_LO(phys_addr));
-               REG_WR(sc, BNX2X_VF_CMD_ADDR_HI, U64_HI(phys_addr));
+       bnx2x_check_bull(sc);
+       if (sc->old_bulletin.valid_bitmap & (1 << CHANNEL_DOWN)) {
+               PMD_DRV_LOG(ERR, "channel is down. Aborting message sending");
+               return -EINVAL;
+       }

-               /* memory barrier to ensure that FW can read phys_addr */
-               wmb();
+       REG_WR(sc, BNX2X_VF_CMD_ADDR_LO, U64_LO(phys_addr));
+       REG_WR(sc, BNX2X_VF_CMD_ADDR_HI, U64_HI(phys_addr));

-               REG_WR8(sc, BNX2X_VF_CMD_TRIGGER, 1);
+       /* memory barrier to ensure that FW can read phys_addr */
+       wmb();

-               /* Do several attempts until PF completes
-                * "." is used to show progress
-                */
-               for (i = 0; i < BNX2X_VF_CHANNEL_TRIES; i++) {
-                       DELAY_MS(BNX2X_VF_CHANNEL_DELAY);
-                       if (*status)
-                               break;
-               }
+       REG_WR8(sc, BNX2X_VF_CMD_TRIGGER, 1);

-               if (!*status) {
-                       PMD_DRV_LOG(ERR, "Response from PF timed out");
-                       return -EAGAIN;
-               }
-       } else {
-               PMD_DRV_LOG(ERR, "status should be zero before message"
-                               "to pf was sent");
-               return -EINVAL;
+       /* Do several attempts until PF completes */
+       for (i = 0; i < BNX2X_VF_CHANNEL_TRIES; i++) {
+               DELAY_MS(BNX2X_VF_CHANNEL_DELAY);
+               if (*status)
+                       break;
+       }
+
+       if (!*status) {
+               PMD_DRV_LOG(ERR, "Response from PF timed out");
+               return -EAGAIN;
        }

        PMD_DRV_LOG(DEBUG, "Response from PF was received");
@@ -337,6 +334,7 @@ bnx2x_vf_close(struct bnx2x_softc *sc)
        struct vf_release_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
        int vf_id = bnx2x_read_vf_id(sc);
+       int rc;

        if (vf_id >= 0) {
                query = &sc->vf2pf_mbox->query[0].release;
@@ -348,8 +346,8 @@ bnx2x_vf_close(struct bnx2x_softc *sc)
                              BNX2X_VF_TLV_LIST_END,
                              sizeof(struct channel_list_end_tlv));

-               bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
-               if (reply->status != BNX2X_VF_STATUS_SUCCESS)
+               rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+               if (rc || reply->status != BNX2X_VF_STATUS_SUCCESS)
                        PMD_DRV_LOG(ERR, "Failed to release VF");

                bnx2x_vf_finalize(sc, &query->first_tlv);
@@ -362,7 +360,7 @@ bnx2x_vf_init(struct bnx2x_softc *sc)
 {
        struct vf_init_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
-       int i, rc = 0;
+       int i, rc;

        query = &sc->vf2pf_mbox->query[0].init;
        bnx2x_vf_prep(sc, &query->first_tlv, BNX2X_VF_TLV_INIT,
@@ -380,7 +378,9 @@ bnx2x_vf_init(struct bnx2x_softc *sc)
                      BNX2X_VF_TLV_LIST_END,
                      sizeof(struct channel_list_end_tlv));

-       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       if (rc)
+               goto out;
        if (reply->status != BNX2X_VF_STATUS_SUCCESS) {
                PMD_DRV_LOG(ERR, "Failed to init VF");
                rc = -EINVAL;
@@ -399,7 +399,7 @@ bnx2x_vf_unload(struct bnx2x_softc *sc)
        struct vf_close_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
        struct vf_q_op_tlv *query_op;
-       int i, vf_id;
+       int i, vf_id, rc;

        vf_id = bnx2x_read_vf_id(sc);
        if (vf_id > 0) {
@@ -416,8 +416,8 @@ bnx2x_vf_unload(struct bnx2x_softc *sc)
                                      BNX2X_VF_TLV_LIST_END,
                                      sizeof(struct channel_list_end_tlv));

-                       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
-                       if (reply->status != BNX2X_VF_STATUS_SUCCESS)
+                       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+                       if (rc || reply->status != BNX2X_VF_STATUS_SUCCESS)
                                PMD_DRV_LOG(ERR,
                                            "Bad reply for vf_q %d teardown", 
i);

@@ -436,8 +436,8 @@ bnx2x_vf_unload(struct bnx2x_softc *sc)
                              BNX2X_VF_TLV_LIST_END,
                              sizeof(struct channel_list_end_tlv));

-               bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
-               if (reply->status != BNX2X_VF_STATUS_SUCCESS)
+               rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+               if (rc || reply->status != BNX2X_VF_STATUS_SUCCESS)
                        PMD_DRV_LOG(ERR,
                                    "Bad reply from PF for close message");

@@ -506,7 +506,7 @@ bnx2x_vf_setup_queue(struct bnx2x_softc *sc, struct 
bnx2x_fastpath *fp, int lead
        struct vf_setup_q_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
        uint16_t flags = bnx2x_vf_q_flags(leading);
-       int rc = 0;
+       int rc;

        query = &sc->vf2pf_mbox->query[0].setup_q;
        bnx2x_vf_prep(sc, &query->first_tlv, BNX2X_VF_TLV_SETUP_Q,
@@ -522,13 +522,15 @@ bnx2x_vf_setup_queue(struct bnx2x_softc *sc, struct 
bnx2x_fastpath *fp, int lead
                      BNX2X_VF_TLV_LIST_END,
                      sizeof(struct channel_list_end_tlv));

-       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       if (rc)
+               goto out;
        if (reply->status != BNX2X_VF_STATUS_SUCCESS) {
                PMD_DRV_LOG(ERR, "Failed to setup VF queue[%d]",
                                 fp->index);
                rc = -EINVAL;
        }
-
+out:
        bnx2x_vf_finalize(sc, &query->first_tlv);

        return rc;
@@ -539,7 +541,7 @@ bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set)
 {
        struct vf_set_q_filters_tlv *query;
        struct vf_common_reply_tlv *reply;
-       int rc = 0;
+       int rc;

        query = &sc->vf2pf_mbox->query[0].set_q_filters;
        bnx2x_vf_prep(sc, &query->first_tlv, BNX2X_VF_TLV_SET_Q_FILTERS,
@@ -560,7 +562,9 @@ bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set)
                      BNX2X_VF_TLV_LIST_END,
                      sizeof(struct channel_list_end_tlv));

-       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       if (rc)
+               goto out;
        reply = &sc->vf2pf_mbox->resp.common_reply;

        while (BNX2X_VF_STATUS_FAILURE == reply->status &&
@@ -571,7 +575,9 @@ bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set)
                rte_memcpy(query->filters[0].mac, sc->pf2vf_bulletin->mac,
                                ETH_ALEN);

-               bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+               rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+               if (rc)
+                       goto out;
        }

        if (BNX2X_VF_STATUS_SUCCESS != reply->status) {
@@ -579,7 +585,7 @@ bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set)
                                reply->status);
                rc = -EINVAL;
        }
-
+out:
        bnx2x_vf_finalize(sc, &query->first_tlv);

        return rc;
@@ -591,7 +597,7 @@ bnx2x_vf_config_rss(struct bnx2x_softc *sc,
 {
        struct vf_rss_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
-       int rc = 0;
+       int rc;

        query = &sc->vf2pf_mbox->query[0].update_rss;

@@ -612,12 +618,15 @@ bnx2x_vf_config_rss(struct bnx2x_softc *sc,
        query->rss_result_mask = params->rss_result_mask;
        query->rss_flags = params->rss_flags;

-       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       if (rc)
+               goto out;
+
        if (reply->status != BNX2X_VF_STATUS_SUCCESS) {
                PMD_DRV_LOG(ERR, "Failed to configure RSS");
                rc = -EINVAL;
        }
-
+out:
        bnx2x_vf_finalize(sc, &query->first_tlv);

        return rc;
@@ -628,7 +637,7 @@ bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc)
 {
        struct vf_set_q_filters_tlv *query;
        struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply;
-       int rc = 0;
+       int rc;

        query = &sc->vf2pf_mbox->query[0].set_q_filters;
        bnx2x_vf_prep(sc, &query->first_tlv, BNX2X_VF_TLV_SET_Q_FILTERS,
@@ -666,7 +675,10 @@ bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc)
                      BNX2X_VF_TLV_LIST_END,
                      sizeof(struct channel_list_end_tlv));

-       bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       rc = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr);
+       if (rc)
+               goto out;
+
        if (reply->status != BNX2X_VF_STATUS_SUCCESS) {
                PMD_DRV_LOG(ERR, "Failed to set RX mode");
                rc = -EINVAL;
-- 
2.5.5

Reply via email to