net/mlx5: fix index handling for Tx ring
[dpdk.git] / drivers / net / ena / base / ena_com.c
index b5b8cd9..38a0587 100644 (file)
@@ -329,6 +329,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
                              struct ena_com_io_sq *io_sq)
 {
        size_t size;
+       int dev_node = 0;
 
        ENA_TOUCH(ctx);
 
@@ -341,15 +342,29 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
 
        size = io_sq->desc_entry_size * io_sq->q_depth;
 
-       if (io_sq->mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_HOST)
-               ENA_MEM_ALLOC_COHERENT(ena_dev->dmadev,
-                                      size,
-                                      io_sq->desc_addr.virt_addr,
-                                      io_sq->desc_addr.phys_addr,
-                                      io_sq->desc_addr.mem_handle);
-       else
-               io_sq->desc_addr.virt_addr =
-                       ENA_MEM_ALLOC(ena_dev->dmadev, size);
+       if (io_sq->mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_HOST) {
+               ENA_MEM_ALLOC_COHERENT_NODE(ena_dev->dmadev,
+                                           size,
+                                           io_sq->desc_addr.virt_addr,
+                                           io_sq->desc_addr.phys_addr,
+                                           ctx->numa_node,
+                                           dev_node);
+               if (!io_sq->desc_addr.virt_addr)
+                       ENA_MEM_ALLOC_COHERENT(ena_dev->dmadev,
+                                              size,
+                                              io_sq->desc_addr.virt_addr,
+                                              io_sq->desc_addr.phys_addr,
+                                              io_sq->desc_addr.mem_handle);
+       } else {
+               ENA_MEM_ALLOC_NODE(ena_dev->dmadev,
+                                  size,
+                                  io_sq->desc_addr.virt_addr,
+                                  ctx->numa_node,
+                                  dev_node);
+               if (!io_sq->desc_addr.virt_addr)
+                       io_sq->desc_addr.virt_addr =
+                               ENA_MEM_ALLOC(ena_dev->dmadev, size);
+       }
 
        if (!io_sq->desc_addr.virt_addr) {
                ena_trc_err("memory allocation failed");
@@ -368,6 +383,7 @@ static int ena_com_init_io_cq(struct ena_com_dev *ena_dev,
                              struct ena_com_io_cq *io_cq)
 {
        size_t size;
+       int prev_node = 0;
 
        ENA_TOUCH(ctx);
        memset(&io_cq->cdesc_addr, 0x0, sizeof(struct ena_com_io_desc_addr));
@@ -380,11 +396,18 @@ static int ena_com_init_io_cq(struct ena_com_dev *ena_dev,
 
        size = io_cq->cdesc_entry_size_in_bytes * io_cq->q_depth;
 
-       ENA_MEM_ALLOC_COHERENT(ena_dev->dmadev,
-                              size,
-                              io_cq->cdesc_addr.virt_addr,
-                              io_cq->cdesc_addr.phys_addr,
-                              io_cq->cdesc_addr.mem_handle);
+       ENA_MEM_ALLOC_COHERENT_NODE(ena_dev->dmadev,
+                                   size,
+                                   io_cq->cdesc_addr.virt_addr,
+                                   io_cq->cdesc_addr.phys_addr,
+                                   ctx->numa_node,
+                                   prev_node);
+       if (!io_cq->cdesc_addr.virt_addr)
+               ENA_MEM_ALLOC_COHERENT(ena_dev->dmadev,
+                                      size,
+                                      io_cq->cdesc_addr.virt_addr,
+                                      io_cq->cdesc_addr.phys_addr,
+                                      io_cq->cdesc_addr.mem_handle);
 
        if (!io_cq->cdesc_addr.virt_addr) {
                ena_trc_err("memory allocation failed");
@@ -2219,7 +2242,6 @@ int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev)
 {
        struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
        struct ena_rss *rss = &ena_dev->rss;
-       struct ena_admin_feature_rss_hash_control *hash_ctrl = rss->hash_ctrl;
        struct ena_admin_set_feat_cmd cmd;
        struct ena_admin_set_feat_resp resp;
        int ret;
@@ -2246,7 +2268,8 @@ int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev)
                ena_trc_err("memory address set failed\n");
                return ret;
        }
-       cmd.control_buffer.length = sizeof(*hash_ctrl);
+       cmd.control_buffer.length =
+               sizeof(struct ena_admin_feature_rss_hash_control);
 
        ret = ena_com_execute_admin_command(admin_queue,
                                            (struct ena_admin_aq_entry *)&cmd,
@@ -2255,7 +2278,7 @@ int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev)
                                            sizeof(resp));
        if (unlikely(ret)) {
                ena_trc_err("Failed to set hash input. error: %d\n", ret);
-               ret = ENA_COM_INVAL;
+               return ENA_COM_INVAL;
        }
 
        return 0;
@@ -2567,19 +2590,11 @@ int ena_com_set_host_attributes(struct ena_com_dev *ena_dev)
        struct ena_com_admin_queue *admin_queue;
        struct ena_admin_set_feat_cmd cmd;
        struct ena_admin_set_feat_resp resp;
+       int ret;
 
-       int ret = 0;
-
-       if (unlikely(!ena_dev)) {
-               ena_trc_err("%s : ena_dev is NULL\n", __func__);
-               return ENA_COM_NO_DEVICE;
-       }
-
-       if (!ena_com_check_supported_feature_id(ena_dev,
-                                               ENA_ADMIN_HOST_ATTR_CONFIG)) {
-               ena_trc_warn("Set host attribute isn't supported\n");
-               return ENA_COM_PERMISSION;
-       }
+       /* Host attribute config is called before ena_com_get_dev_attr_feat
+        * so ena_com can't check if the feature is supported.
+        */
 
        memset(&cmd, 0x0, sizeof(cmd));
        admin_queue = &ena_dev->admin_queue;