]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
idpf: refactor vport virtchnl messages
authorAlan Brady <alan.brady@intel.com>
Thu, 22 Feb 2024 19:04:33 +0000 (11:04 -0800)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 4 Mar 2024 17:33:35 +0000 (09:33 -0800)
This reworks the way vport related virtchnl messages work to take
advantage of the added transaction API. It is fairly mechanical as, to
use the transaction API, the function just needs to fill out an
appropriate idpf_vc_xn_params struct to pass to idpf_vc_xn_exec which
will take care of the actual send and recv.

Tested-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Igor Bagnucki <igor.bagnucki@intel.com>
Co-developed-by: Joshua Hay <joshua.a.hay@intel.com>
Signed-off-by: Joshua Hay <joshua.a.hay@intel.com>
Signed-off-by: Alan Brady <alan.brady@intel.com>
Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/idpf/idpf_virtchnl.c

index 95ca10f644b2147f72207ebd27b7a883d8cfacf2..2dab7122615f59a1e440ae851c1d0bc9fd30c8fb 100644 (file)
@@ -858,7 +858,6 @@ int idpf_recv_mb_msg(struct idpf_adapter *adapter, u32 op,
 
        while (1) {
                struct idpf_vport_config *vport_config;
-               int payload_size = 0;
 
                /* Try to get one message */
                num_q_msg = 1;
@@ -895,47 +894,17 @@ int idpf_recv_mb_msg(struct idpf_adapter *adapter, u32 op,
                if (err)
                        goto post_buffs;
 
-               if (ctlq_msg.data_len)
-                       payload_size = ctlq_msg.ctx.indirect.payload->size;
-
                /* All conditions are met. Either a message requested is
                 * received or we received a message to be processed
                 */
                switch (ctlq_msg.cookie.mbx.chnl_opcode) {
                case VIRTCHNL2_OP_VERSION:
-                       err = idpf_vc_xn_forward_reply(adapter, &ctlq_msg);
-                       break;
                case VIRTCHNL2_OP_GET_CAPS:
-                       if (ctlq_msg.cookie.mbx.chnl_retval) {
-                               dev_err(&adapter->pdev->dev, "Failure initializing, vc op: %u retval: %u\n",
-                                       ctlq_msg.cookie.mbx.chnl_opcode,
-                                       ctlq_msg.cookie.mbx.chnl_retval);
-                               err = -EBADMSG;
-                       } else if (msg) {
-                               memcpy(msg, ctlq_msg.ctx.indirect.payload->va,
-                                      min_t(int, payload_size, msg_size));
-                       }
-                       work_done = true;
-                       break;
                case VIRTCHNL2_OP_CREATE_VPORT:
-                       idpf_recv_vchnl_op(adapter, NULL, &ctlq_msg,
-                                          IDPF_VC_CREATE_VPORT,
-                                          IDPF_VC_CREATE_VPORT_ERR);
-                       break;
                case VIRTCHNL2_OP_ENABLE_VPORT:
-                       idpf_recv_vchnl_op(adapter, vport, &ctlq_msg,
-                                          IDPF_VC_ENA_VPORT,
-                                          IDPF_VC_ENA_VPORT_ERR);
-                       break;
                case VIRTCHNL2_OP_DISABLE_VPORT:
-                       idpf_recv_vchnl_op(adapter, vport, &ctlq_msg,
-                                          IDPF_VC_DIS_VPORT,
-                                          IDPF_VC_DIS_VPORT_ERR);
-                       break;
                case VIRTCHNL2_OP_DESTROY_VPORT:
-                       idpf_recv_vchnl_op(adapter, vport, &ctlq_msg,
-                                          IDPF_VC_DESTROY_VPORT,
-                                          IDPF_VC_DESTROY_VPORT_ERR);
+                       err = idpf_vc_xn_forward_reply(adapter, &ctlq_msg);
                        break;
                case VIRTCHNL2_OP_CONFIG_TX_QUEUES:
                        idpf_recv_vchnl_op(adapter, vport, &ctlq_msg,
@@ -1322,7 +1291,9 @@ static int idpf_send_ver_msg(struct idpf_adapter *adapter)
  */
 static int idpf_send_get_caps_msg(struct idpf_adapter *adapter)
 {
-       struct virtchnl2_get_capabilities caps = { };
+       struct virtchnl2_get_capabilities caps = {};
+       struct idpf_vc_xn_params xn_params = {};
+       ssize_t reply_sz;
 
        caps.csum_caps =
                cpu_to_le32(VIRTCHNL2_CAP_TX_CSUM_L3_IPV4       |
@@ -1379,21 +1350,20 @@ static int idpf_send_get_caps_msg(struct idpf_adapter *adapter)
                            VIRTCHNL2_CAP_PROMISC               |
                            VIRTCHNL2_CAP_LOOPBACK);
 
-       return idpf_send_mb_msg(adapter, VIRTCHNL2_OP_GET_CAPS, sizeof(caps),
-                               (u8 *)&caps, 0);
-}
+       xn_params.vc_op = VIRTCHNL2_OP_GET_CAPS;
+       xn_params.send_buf.iov_base = &caps;
+       xn_params.send_buf.iov_len = sizeof(caps);
+       xn_params.recv_buf.iov_base = &adapter->caps;
+       xn_params.recv_buf.iov_len = sizeof(adapter->caps);
+       xn_params.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC;
 
-/**
- * idpf_recv_get_caps_msg - Receive virtchnl get capabilities message
- * @adapter: Driver specific private structure
- *
- * Receive virtchnl get capabilities message. Returns 0 on success, negative on
- * failure.
- */
-static int idpf_recv_get_caps_msg(struct idpf_adapter *adapter)
-{
-       return idpf_recv_mb_msg(adapter, VIRTCHNL2_OP_GET_CAPS, &adapter->caps,
-                               sizeof(struct virtchnl2_get_capabilities));
+       reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
+       if (reply_sz < 0)
+               return reply_sz;
+       if (reply_sz < sizeof(adapter->caps))
+               return -EIO;
+
+       return 0;
 }
 
 /**
@@ -1720,8 +1690,10 @@ int idpf_send_create_vport_msg(struct idpf_adapter *adapter,
                               struct idpf_vport_max_q *max_q)
 {
        struct virtchnl2_create_vport *vport_msg;
+       struct idpf_vc_xn_params xn_params = {};
        u16 idx = adapter->next_vport;
        int err, buf_size;
+       ssize_t reply_sz;
 
        buf_size = sizeof(struct virtchnl2_create_vport);
        if (!adapter->vport_params_reqd[idx]) {
@@ -1752,35 +1724,38 @@ int idpf_send_create_vport_msg(struct idpf_adapter *adapter,
                return err;
        }
 
-       mutex_lock(&adapter->vc_buf_lock);
-
-       err = idpf_send_mb_msg(adapter, VIRTCHNL2_OP_CREATE_VPORT, buf_size,
-                              (u8 *)vport_msg, 0);
-       if (err)
-               goto rel_lock;
-
-       err = idpf_wait_for_event(adapter, NULL, IDPF_VC_CREATE_VPORT,
-                                 IDPF_VC_CREATE_VPORT_ERR);
-       if (err) {
-               dev_err(&adapter->pdev->dev, "Failed to receive create vport message");
-
-               goto rel_lock;
-       }
-
        if (!adapter->vport_params_recvd[idx]) {
                adapter->vport_params_recvd[idx] = kzalloc(IDPF_CTLQ_MAX_BUF_LEN,
                                                           GFP_KERNEL);
                if (!adapter->vport_params_recvd[idx]) {
                        err = -ENOMEM;
-                       goto rel_lock;
+                       goto free_vport_params;
                }
        }
 
-       vport_msg = adapter->vport_params_recvd[idx];
-       memcpy(vport_msg, adapter->vc_msg, IDPF_CTLQ_MAX_BUF_LEN);
+       xn_params.vc_op = VIRTCHNL2_OP_CREATE_VPORT;
+       xn_params.send_buf.iov_base = vport_msg;
+       xn_params.send_buf.iov_len = buf_size;
+       xn_params.recv_buf.iov_base = adapter->vport_params_recvd[idx];
+       xn_params.recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN;
+       xn_params.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC;
+       reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
+       if (reply_sz < 0) {
+               err = reply_sz;
+               goto free_vport_params;
+       }
+       if (reply_sz < IDPF_CTLQ_MAX_BUF_LEN) {
+               err = -EIO;
+               goto free_vport_params;
+       }
 
-rel_lock:
-       mutex_unlock(&adapter->vc_buf_lock);
+       return 0;
+
+free_vport_params:
+       kfree(adapter->vport_params_recvd[idx]);
+       adapter->vport_params_recvd[idx] = NULL;
+       kfree(adapter->vport_params_reqd[idx]);
+       adapter->vport_params_reqd[idx] = NULL;
 
        return err;
 }
@@ -1832,26 +1807,19 @@ int idpf_check_supported_desc_ids(struct idpf_vport *vport)
  */
 int idpf_send_destroy_vport_msg(struct idpf_vport *vport)
 {
-       struct idpf_adapter *adapter = vport->adapter;
+       struct idpf_vc_xn_params xn_params = {};
        struct virtchnl2_vport v_id;
-       int err;
+       ssize_t reply_sz;
 
        v_id.vport_id = cpu_to_le32(vport->vport_id);
 
-       mutex_lock(&vport->vc_buf_lock);
-
-       err = idpf_send_mb_msg(adapter, VIRTCHNL2_OP_DESTROY_VPORT,
-                              sizeof(v_id), (u8 *)&v_id, 0);
-       if (err)
-               goto rel_lock;
-
-       err = idpf_min_wait_for_event(adapter, vport, IDPF_VC_DESTROY_VPORT,
-                                     IDPF_VC_DESTROY_VPORT_ERR);
-
-rel_lock:
-       mutex_unlock(&vport->vc_buf_lock);
+       xn_params.vc_op = VIRTCHNL2_OP_DESTROY_VPORT;
+       xn_params.send_buf.iov_base = &v_id;
+       xn_params.send_buf.iov_len = sizeof(v_id);
+       xn_params.timeout_ms = IDPF_VC_XN_MIN_TIMEOUT_MSEC;
+       reply_sz = idpf_vc_xn_exec(vport->adapter, &xn_params);
 
-       return err;
+       return reply_sz < 0 ? reply_sz : 0;
 }
 
 /**
@@ -1863,26 +1831,19 @@ rel_lock:
  */
 int idpf_send_enable_vport_msg(struct idpf_vport *vport)
 {
-       struct idpf_adapter *adapter = vport->adapter;
+       struct idpf_vc_xn_params xn_params = {};
        struct virtchnl2_vport v_id;
-       int err;
+       ssize_t reply_sz;
 
        v_id.vport_id = cpu_to_le32(vport->vport_id);
 
-       mutex_lock(&vport->vc_buf_lock);
-
-       err = idpf_send_mb_msg(adapter, VIRTCHNL2_OP_ENABLE_VPORT,
-                              sizeof(v_id), (u8 *)&v_id, 0);
-       if (err)
-               goto rel_lock;
-
-       err = idpf_wait_for_event(adapter, vport, IDPF_VC_ENA_VPORT,
-                                 IDPF_VC_ENA_VPORT_ERR);
-
-rel_lock:
-       mutex_unlock(&vport->vc_buf_lock);
+       xn_params.vc_op = VIRTCHNL2_OP_ENABLE_VPORT;
+       xn_params.send_buf.iov_base = &v_id;
+       xn_params.send_buf.iov_len = sizeof(v_id);
+       xn_params.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC;
+       reply_sz = idpf_vc_xn_exec(vport->adapter, &xn_params);
 
-       return err;
+       return reply_sz < 0 ? reply_sz : 0;
 }
 
 /**
@@ -1894,26 +1855,19 @@ rel_lock:
  */
 int idpf_send_disable_vport_msg(struct idpf_vport *vport)
 {
-       struct idpf_adapter *adapter = vport->adapter;
+       struct idpf_vc_xn_params xn_params = {};
        struct virtchnl2_vport v_id;
-       int err;
+       ssize_t reply_sz;
 
        v_id.vport_id = cpu_to_le32(vport->vport_id);
 
-       mutex_lock(&vport->vc_buf_lock);
-
-       err = idpf_send_mb_msg(adapter, VIRTCHNL2_OP_DISABLE_VPORT,
-                              sizeof(v_id), (u8 *)&v_id, 0);
-       if (err)
-               goto rel_lock;
-
-       err = idpf_min_wait_for_event(adapter, vport, IDPF_VC_DIS_VPORT,
-                                     IDPF_VC_DIS_VPORT_ERR);
+       xn_params.vc_op = VIRTCHNL2_OP_DISABLE_VPORT;
+       xn_params.send_buf.iov_base = &v_id;
+       xn_params.send_buf.iov_len = sizeof(v_id);
+       xn_params.timeout_ms = IDPF_VC_XN_MIN_TIMEOUT_MSEC;
+       reply_sz = idpf_vc_xn_exec(vport->adapter, &xn_params);
 
-rel_lock:
-       mutex_unlock(&vport->vc_buf_lock);
-
-       return err;
+       return reply_sz < 0 ? reply_sz : 0;
 }
 
 /**
@@ -3538,9 +3492,6 @@ int idpf_vc_core_init(struct idpf_adapter *adapter)
                        case 0:
                                /* success, move state machine forward */
                                adapter->state = __IDPF_GET_CAPS;
-                               err = idpf_send_get_caps_msg(adapter);
-                               if (err)
-                                       goto init_failed;
                                fallthrough;
                        case -EAGAIN:
                                goto restart;
@@ -3551,13 +3502,15 @@ int idpf_vc_core_init(struct idpf_adapter *adapter)
                                goto init_failed;
                        }
                case __IDPF_GET_CAPS:
-                       if (idpf_recv_get_caps_msg(adapter))
+                       err = idpf_send_get_caps_msg(adapter);
+                       if (err)
                                goto init_failed;
                        adapter->state = __IDPF_INIT_SW;
                        break;
                default:
                        dev_err(&adapter->pdev->dev, "Device is in bad state: %d\n",
                                adapter->state);
+                       err = -EINVAL;
                        goto init_failed;
                }
                break;