net/ice: save rule on switch filter creation
[dpdk.git] / drivers / net / bnxt / tf_core / tf_msg.c
index 2ee8a1e..0fbb2fe 100644 (file)
@@ -58,6 +58,16 @@ static_assert(sizeof(struct hwrm_tf_tbl_type_set_input) ==
  */
 #define TF_PCI_BUF_SIZE_MAX 88
 
+/**
+ * This is the length of shared session name "tf_share"
+ */
+#define TF_SHARED_SESSION_NAME_LEN 8
+
+/**
+ * This is the length of tcam shared session name "tf_shared-wc_tcam"
+ */
+#define TF_TCAM_SHARED_SESSION_NAME_LEN 17
+
 /**
  * If data bigger than TF_PCI_BUF_SIZE_MAX then use DMA method
  */
@@ -125,9 +135,20 @@ tf_msg_session_open(struct bnxt *bp,
        struct hwrm_tf_session_open_input req = { 0 };
        struct hwrm_tf_session_open_output resp = { 0 };
        struct tfp_send_msg_parms parms = { 0 };
+       int name_len;
+       char *session_name;
+       char *tcam_session_name;
 
        /* Populate the request */
-       tfp_memcpy(&req.session_name, ctrl_chan_name, TF_SESSION_NAME_MAX);
+       name_len = strnlen(ctrl_chan_name, TF_SESSION_NAME_MAX);
+       session_name = &ctrl_chan_name[name_len - strlen("tf_shared")];
+       tcam_session_name = &ctrl_chan_name[name_len - strlen("tf_shared-wc_tcam")];
+       if (!strncmp(tcam_session_name, "tf_shared-wc_tcam", strlen("tf_shared-wc_tcam")))
+               tfp_memcpy(&req.session_name, tcam_session_name, TF_TCAM_SHARED_SESSION_NAME_LEN);
+       else if (!strncmp(session_name, "tf_shared", strlen("tf_shared")))
+               tfp_memcpy(&req.session_name, session_name, TF_SHARED_SESSION_NAME_LEN);
+       else
+               tfp_memcpy(&req.session_name, ctrl_chan_name, TF_SESSION_NAME_MAX);
 
        parms.tf_type = HWRM_TF_SESSION_OPEN;
        parms.req_data = (uint32_t *)&req;
@@ -170,6 +191,9 @@ tf_msg_session_client_register(struct tf *tfp,
        struct tfp_send_msg_parms parms = { 0 };
        uint8_t fw_session_id;
        struct tf_dev_info *dev;
+       int name_len;
+       char *session_name;
+       char *tcam_session_name;
 
        /* Retrieve the device information */
        rc = tf_session_get_device(tfs, &dev);
@@ -190,9 +214,24 @@ tf_msg_session_client_register(struct tf *tfp,
 
        /* Populate the request */
        req.fw_session_id = tfp_cpu_to_le_32(fw_session_id);
-       tfp_memcpy(&req.session_client_name,
-                  ctrl_channel_name,
-                  TF_SESSION_NAME_MAX);
+       name_len = strnlen(ctrl_channel_name, TF_SESSION_NAME_MAX);
+       session_name = &ctrl_channel_name[name_len - strlen("tf_shared")];
+       tcam_session_name = &ctrl_channel_name[name_len -
+               strlen("tf_shared-wc_tcam")];
+       if (!strncmp(tcam_session_name,
+                               "tf_shared-wc_tcam",
+                               strlen("tf_shared-wc_tcam")))
+               tfp_memcpy(&req.session_client_name,
+                               tcam_session_name,
+                               TF_TCAM_SHARED_SESSION_NAME_LEN);
+       else if (!strncmp(session_name, "tf_shared", strlen("tf_shared")))
+               tfp_memcpy(&req.session_client_name,
+                               session_name,
+                               TF_SHARED_SESSION_NAME_LEN);
+       else
+               tfp_memcpy(&req.session_client_name,
+                               ctrl_channel_name,
+                               TF_SESSION_NAME_MAX);
 
        parms.tf_type = HWRM_TF_SESSION_REGISTER;
        parms.req_data = (uint32_t *)&req;
@@ -201,7 +240,7 @@ tf_msg_session_client_register(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -252,7 +291,7 @@ tf_msg_session_client_unregister(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
 
        return rc;
@@ -260,31 +299,13 @@ tf_msg_session_client_unregister(struct tf *tfp,
 
 int
 tf_msg_session_close(struct tf *tfp,
-                    struct tf_session *tfs)
+                    uint8_t fw_session_id,
+                    int mailbox)
 {
        int rc;
        struct hwrm_tf_session_close_input req = { 0 };
        struct hwrm_tf_session_close_output resp = { 0 };
        struct tfp_send_msg_parms parms = { 0 };
-       uint8_t fw_session_id;
-       struct tf_dev_info *dev;
-
-       /* Retrieve the device information */
-       rc = tf_session_get_device(tfs, &dev);
-       if (rc) {
-               TFP_DRV_LOG(ERR,
-                           "Failed to lookup device, rc:%s\n",
-                           strerror(-rc));
-               return rc;
-       }
-
-       rc = tf_session_get_fw_session_id(tfp, &fw_session_id);
-       if (rc) {
-               TFP_DRV_LOG(ERR,
-                           "Unable to lookup FW id, rc:%s\n",
-                           strerror(-rc));
-               return rc;
-       }
 
        /* Populate the request */
        req.fw_session_id = tfp_cpu_to_le_32(fw_session_id);
@@ -294,9 +315,9 @@ tf_msg_session_close(struct tf *tfp,
        parms.req_size = sizeof(req);
        parms.resp_data = (uint32_t *)&resp;
        parms.resp_size = sizeof(resp);
-       parms.mailbox = dev->ops->tf_dev_get_mailbox();
+       parms.mailbox = mailbox;
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -348,7 +369,7 @@ tf_msg_session_qcfg(struct tf *tfp)
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -411,7 +432,7 @@ tf_msg_session_resc_qcaps(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
        if (rc)
                goto cleanup;
 
@@ -419,18 +440,18 @@ tf_msg_session_resc_qcaps(struct tf *tfp,
         * Should always get expected number of entries
         */
        if (tfp_le_to_cpu_32(resp.size) != size) {
-               TFP_DRV_LOG(ERR,
-                           "%s: QCAPS message size error, rc:%s\n",
+               TFP_DRV_LOG(WARNING,
+                           "%s: QCAPS message size error, rc:%s, request %d vs response %d\n",
                            tf_dir_2_str(dir),
-                           strerror(EINVAL));
-               rc = -EINVAL;
-               goto cleanup;
+                           strerror(EINVAL),
+                           size,
+                           resp.size);
        }
 
        /* Post process the response */
        data = (struct tf_rm_resc_req_entry *)qcaps_buf.va_addr;
 
-       for (i = 0; i < size; i++) {
+       for (i = 0; i < resp.size; i++) {
                query[i].type = tfp_le_to_cpu_32(data[i].type);
                query[i].min = tfp_le_to_cpu_16(data[i].min);
                query[i].max = tfp_le_to_cpu_16(data[i].max);
@@ -521,7 +542,7 @@ tf_msg_session_resc_alloc(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
        if (rc)
                goto cleanup;
 
@@ -628,7 +649,7 @@ tf_msg_session_resc_info(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
        if (rc)
                goto cleanup;
 
@@ -735,7 +756,7 @@ tf_msg_session_resc_flush(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
 
        tf_msg_free_dma_buf(&resv_buf);
 
@@ -829,7 +850,7 @@ tf_msg_insert_em_internal_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -924,7 +945,7 @@ tf_msg_hash_insert_em_internal_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -994,7 +1015,7 @@ tf_msg_delete_em_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1063,7 +1084,7 @@ tf_msg_move_em_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1119,7 +1140,7 @@ int tf_msg_ext_em_ctxt_mem_alloc(struct tf *tfp,
                parms.resp_data = (uint32_t *)&resp;
                parms.resp_size = sizeof(resp);
                parms.mailbox = dev->ops->tf_dev_get_mailbox();
-               rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+               rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
                if (rc) {
                        TFP_DRV_LOG(ERR, "Failed ext_em_alloc error rc:%s\n",
                                strerror(-rc));
@@ -1179,7 +1200,7 @@ int tf_msg_ext_em_ctxt_mem_free(struct tf *tfp,
        parms.resp_data = (uint32_t *)&resp;
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
 
        return rc;
 }
@@ -1230,7 +1251,7 @@ tf_msg_em_mem_rgtr(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1282,7 +1303,7 @@ tf_msg_em_mem_unrgtr(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -1334,7 +1355,7 @@ tf_msg_em_qcaps(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1409,7 +1430,7 @@ tf_msg_em_cfg(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -1483,7 +1504,7 @@ tf_msg_ext_em_cfg(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -1533,7 +1554,7 @@ tf_msg_em_op(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -1611,7 +1632,7 @@ tf_msg_tcam_entry_set(struct tf *tfp,
        mparms.resp_size = sizeof(resp);
        mparms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &mparms);
 
 cleanup:
@@ -1664,7 +1685,7 @@ tf_msg_tcam_entry_get(struct tf *tfp,
        mparms.resp_size = sizeof(resp);
        mparms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &mparms);
 
        if (rc != 0)
@@ -1735,7 +1756,7 @@ tf_msg_tcam_entry_free(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        return rc;
 }
@@ -1816,7 +1837,7 @@ tf_msg_set_tbl_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1882,7 +1903,7 @@ tf_msg_get_tbl_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -1968,7 +1989,7 @@ tf_msg_get_global_cfg(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
        if (rc != 0)
                return rc;
 
@@ -2069,7 +2090,7 @@ tf_msg_set_global_cfg(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
 
        if (rc != 0)
                return rc;
@@ -2142,7 +2163,7 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs),
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp),
                                 &parms);
        if (rc)
                return rc;
@@ -2205,12 +2226,12 @@ tf_msg_get_if_tbl_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
 
        if (rc != 0)
                return rc;
 
-       tfp_memcpy(params->data, resp.data, req.size);
+       tfp_memcpy(&params->data[0], resp.data, req.size);
 
        return 0;
 }
@@ -2262,7 +2283,7 @@ tf_msg_set_if_tbl_entry(struct tf *tfp,
        parms.resp_size = sizeof(resp);
        parms.mailbox = dev->ops->tf_dev_get_mailbox();
 
-       rc = tfp_send_msg_direct(tf_session_get_bp(tfs), &parms);
+       rc = tfp_send_msg_direct(tf_session_get_bp(tfp), &parms);
 
        if (rc != 0)
                return rc;