net/ice/base: set max number of TCs per port to 4
[dpdk.git] / drivers / net / ice / base / ice_common.c
index a0ab25a..81eab7e 100644 (file)
@@ -582,6 +582,49 @@ static void ice_cleanup_fltr_mgmt_struct(struct ice_hw *hw)
 #define ICE_FW_LOG_DESC_SIZE_MAX       \
        ICE_FW_LOG_DESC_SIZE(ICE_AQC_FW_LOG_ID_MAX)
 
+/**
+ * ice_get_fw_log_cfg - get FW logging configuration
+ * @hw: pointer to the HW struct
+ */
+static enum ice_status ice_get_fw_log_cfg(struct ice_hw *hw)
+{
+       struct ice_aqc_fw_logging_data *config;
+       struct ice_aq_desc desc;
+       enum ice_status status;
+       u16 size;
+
+       size = ICE_FW_LOG_DESC_SIZE_MAX;
+       config = (struct ice_aqc_fw_logging_data *)ice_malloc(hw, size);
+       if (!config)
+               return ICE_ERR_NO_MEMORY;
+
+       ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logging_info);
+
+       desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_BUF);
+       desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_RD);
+
+       status = ice_aq_send_cmd(hw, &desc, config, size, NULL);
+       if (!status) {
+               u16 i;
+
+               /* Save fw logging information into the HW structure */
+               for (i = 0; i < ICE_AQC_FW_LOG_ID_MAX; i++) {
+                       u16 v, m, flgs;
+
+                       v = LE16_TO_CPU(config->entry[i]);
+                       m = (v & ICE_AQC_FW_LOG_ID_M) >> ICE_AQC_FW_LOG_ID_S;
+                       flgs = (v & ICE_AQC_FW_LOG_EN_M) >> ICE_AQC_FW_LOG_EN_S;
+
+                       if (m < ICE_AQC_FW_LOG_ID_MAX)
+                               hw->fw_log.evnts[m].cur = flgs;
+               }
+       }
+
+       ice_free(hw, config);
+
+       return status;
+}
+
 /**
  * ice_cfg_fw_log - configure FW logging
  * @hw: pointer to the HW struct
@@ -636,6 +679,11 @@ static enum ice_status ice_cfg_fw_log(struct ice_hw *hw, bool enable)
            (!hw->fw_log.actv_evnts || !ice_check_sq_alive(hw, &hw->adminq)))
                return ICE_SUCCESS;
 
+       /* Get current FW log settings */
+       status = ice_get_fw_log_cfg(hw);
+       if (status)
+               return status;
+
        ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logging);
        cmd = &desc.params.fw_logging;
 
@@ -785,7 +833,7 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
        u16 mac_buf_len;
        void *mac_buf;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_init_hw");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
 
        /* Set MAC type based on DeviceID */
@@ -805,7 +853,7 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
        ice_get_itr_intrl_gran(hw);
 
 
-       status = ice_init_all_ctrlq(hw);
+       status = ice_create_all_ctrlq(hw);
        if (status)
                goto err_unroll_cqinit;
 
@@ -916,12 +964,13 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
 
        ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC);
        ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC_2);
-
        /* Obtain counter base index which would be used by flow director */
        status = ice_alloc_fd_res_cntr(hw, &hw->fd_ctr_base);
        if (status)
                goto err_unroll_fltr_mgmt_struct;
-
+       status = ice_init_hw_tbls(hw);
+       if (status)
+               goto err_unroll_fltr_mgmt_struct;
        return ICE_SUCCESS;
 
 err_unroll_fltr_mgmt_struct:
@@ -932,7 +981,7 @@ err_unroll_alloc:
        ice_free(hw, hw->port_info);
        hw->port_info = NULL;
 err_unroll_cqinit:
-       ice_shutdown_all_ctrlq(hw);
+       ice_destroy_all_ctrlq(hw);
        return status;
 }
 
@@ -952,6 +1001,7 @@ void ice_deinit_hw(struct ice_hw *hw)
        ice_sched_cleanup_all(hw);
        ice_sched_clear_agg(hw);
        ice_free_seg(hw);
+       ice_free_hw_tbls(hw);
 
        if (hw->port_info) {
                ice_free(hw, hw->port_info);
@@ -960,7 +1010,7 @@ void ice_deinit_hw(struct ice_hw *hw)
 
        /* Attempt to disable FW logging before shutting down control queues */
        ice_cfg_fw_log(hw, false);
-       ice_shutdown_all_ctrlq(hw);
+       ice_destroy_all_ctrlq(hw);
 
        /* Clear VSI contexts if not already cleared */
        ice_clear_all_vsi_ctx(hw);
@@ -1424,53 +1474,6 @@ ice_clear_tx_drbell_q_ctx(struct ice_hw *hw, u32 tx_drbell_q_index)
 }
 #endif /* !NO_UNUSED_CTX_CODE || AE_DRIVER */
 
-/**
- * ice_debug_cq
- * @hw: pointer to the hardware structure
- * @mask: debug mask
- * @desc: pointer to control queue descriptor
- * @buf: pointer to command buffer
- * @buf_len: max length of buf
- *
- * Dumps debug log about control command with descriptor contents.
- */
-void
-ice_debug_cq(struct ice_hw *hw, u32 mask, void *desc, void *buf, u16 buf_len)
-{
-       struct ice_aq_desc *cq_desc = (struct ice_aq_desc *)desc;
-       u16 len;
-
-       if (!(mask & hw->debug_mask))
-               return;
-
-       if (!desc)
-               return;
-
-       len = LE16_TO_CPU(cq_desc->datalen);
-
-       ice_debug(hw, mask,
-                 "CQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
-                 LE16_TO_CPU(cq_desc->opcode),
-                 LE16_TO_CPU(cq_desc->flags),
-                 LE16_TO_CPU(cq_desc->datalen), LE16_TO_CPU(cq_desc->retval));
-       ice_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
-                 LE32_TO_CPU(cq_desc->cookie_high),
-                 LE32_TO_CPU(cq_desc->cookie_low));
-       ice_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n",
-                 LE32_TO_CPU(cq_desc->params.generic.param0),
-                 LE32_TO_CPU(cq_desc->params.generic.param1));
-       ice_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n",
-                 LE32_TO_CPU(cq_desc->params.generic.addr_high),
-                 LE32_TO_CPU(cq_desc->params.generic.addr_low));
-       if (buf && cq_desc->datalen != 0) {
-               ice_debug(hw, mask, "Buffer:\n");
-               if (buf_len < len)
-                       len = buf_len;
-
-               ice_debug_array(hw, mask, 16, 1, (u8 *)buf, len);
-       }
-}
-
 
 /* FW Admin Queue command wrappers */
 
@@ -1620,7 +1623,7 @@ ice_aq_req_res(struct ice_hw *hw, enum ice_aq_res_ids res,
        struct ice_aq_desc desc;
        enum ice_status status;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_aq_req_res");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        cmd_resp = &desc.params.res_owner;
 
@@ -1689,7 +1692,7 @@ ice_aq_release_res(struct ice_hw *hw, enum ice_aq_res_ids res, u8 sdp_number,
        struct ice_aqc_req_res *cmd;
        struct ice_aq_desc desc;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_aq_release_res");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        cmd = &desc.params.res_owner;
 
@@ -1719,7 +1722,7 @@ ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res,
        u32 time_left = timeout;
        enum ice_status status;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_acquire_res");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        status = ice_aq_req_res(hw, res, access, 0, &time_left, NULL);
 
@@ -1777,7 +1780,7 @@ void ice_release_res(struct ice_hw *hw, enum ice_aq_res_ids res)
        enum ice_status status;
        u32 total_delay = 0;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_release_res");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        status = ice_aq_release_res(hw, res, 0, NULL);
 
@@ -1811,7 +1814,7 @@ ice_aq_alloc_free_res(struct ice_hw *hw, u16 num_entries,
        struct ice_aqc_alloc_free_res_cmd *cmd;
        struct ice_aq_desc desc;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_aq_alloc_free_res");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        cmd = &desc.params.sw_res_ctrl;
 
@@ -1945,6 +1948,7 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
        struct ice_hw_func_caps *func_p = NULL;
        struct ice_hw_dev_caps *dev_p = NULL;
        struct ice_hw_common_caps *caps;
+       char const *prefix;
        u32 i;
 
        if (!buf)
@@ -1955,9 +1959,11 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
        if (opc == ice_aqc_opc_list_dev_caps) {
                dev_p = &hw->dev_caps;
                caps = &dev_p->common_cap;
+               prefix = "dev cap";
        } else if (opc == ice_aqc_opc_list_func_caps) {
                func_p = &hw->func_caps;
                caps = &func_p->common_cap;
+               prefix = "func cap";
        } else {
                ice_debug(hw, ICE_DBG_INIT, "wrong opcode\n");
                return;
@@ -1973,21 +1979,25 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
                case ICE_AQC_CAPS_VALID_FUNCTIONS:
                        caps->valid_functions = number;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Valid Functions = %d\n",
+                                 "%s: valid functions = %d\n", prefix,
                                  caps->valid_functions);
                        break;
                case ICE_AQC_CAPS_VSI:
                        if (dev_p) {
                                dev_p->num_vsi_allocd_to_host = number;
                                ice_debug(hw, ICE_DBG_INIT,
-                                         "HW caps: Dev.VSI cnt = %d\n",
+                                         "%s: num VSI alloc to host = %d\n",
+                                         prefix,
                                          dev_p->num_vsi_allocd_to_host);
                        } else if (func_p) {
                                func_p->guar_num_vsi =
                                        ice_get_num_per_func(hw, ICE_MAX_VSI);
                                ice_debug(hw, ICE_DBG_INIT,
-                                         "HW caps: Func.VSI cnt = %d\n",
-                                         number);
+                                         "%s: num guaranteed VSI (fw) = %d\n",
+                                         prefix, number);
+                               ice_debug(hw, ICE_DBG_INIT,
+                                         "%s: num guaranteed VSI = %d\n",
+                                         prefix, func_p->guar_num_vsi);
                        }
                        break;
                case ICE_AQC_CAPS_DCB:
@@ -1995,49 +2005,51 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
                        caps->active_tc_bitmap = logical_id;
                        caps->maxtc = phys_id;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: DCB = %d\n", caps->dcb);
+                                 "%s: DCB = %d\n", prefix, caps->dcb);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Active TC bitmap = %d\n",
+                                 "%s: active TC bitmap = %d\n", prefix,
                                  caps->active_tc_bitmap);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: TC Max = %d\n", caps->maxtc);
+                                 "%s: TC max = %d\n", prefix, caps->maxtc);
                        break;
                case ICE_AQC_CAPS_RSS:
                        caps->rss_table_size = number;
                        caps->rss_table_entry_width = logical_id;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: RSS table size = %d\n",
+                                 "%s: RSS table size = %d\n", prefix,
                                  caps->rss_table_size);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: RSS table width = %d\n",
+                                 "%s: RSS table width = %d\n", prefix,
                                  caps->rss_table_entry_width);
                        break;
                case ICE_AQC_CAPS_RXQS:
                        caps->num_rxq = number;
                        caps->rxq_first_id = phys_id;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Num Rx Qs = %d\n", caps->num_rxq);
+                                 "%s: num Rx queues = %d\n", prefix,
+                                 caps->num_rxq);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Rx first queue ID = %d\n",
+                                 "%s: Rx first queue ID = %d\n", prefix,
                                  caps->rxq_first_id);
                        break;
                case ICE_AQC_CAPS_TXQS:
                        caps->num_txq = number;
                        caps->txq_first_id = phys_id;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Num Tx Qs = %d\n", caps->num_txq);
+                                 "%s: num Tx queues = %d\n", prefix,
+                                 caps->num_txq);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Tx first queue ID = %d\n",
+                                 "%s: Tx first queue ID = %d\n", prefix,
                                  caps->txq_first_id);
                        break;
                case ICE_AQC_CAPS_MSIX:
                        caps->num_msix_vectors = number;
                        caps->msix_vector_first_id = phys_id;
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: MSIX vector count = %d\n",
+                                 "%s: MSIX vector count = %d\n", prefix,
                                  caps->num_msix_vectors);
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: MSIX first vector index = %d\n",
+                                 "%s: MSIX first vector index = %d\n", prefix,
                                  caps->msix_vector_first_id);
                        break;
                case ICE_AQC_CAPS_FD:
@@ -2047,7 +2059,7 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
                        if (dev_p) {
                                dev_p->num_flow_director_fltr = number;
                                ice_debug(hw, ICE_DBG_INIT,
-                                         "HW caps: Dev.fd_fltr =%d\n",
+                                         "%s: num FD filters = %d\n", prefix,
                                          dev_p->num_flow_director_fltr);
                        }
                        if (func_p) {
@@ -2060,32 +2072,38 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
                                      GLQF_FD_SIZE_FD_BSIZE_S;
                                func_p->fd_fltr_best_effort = val;
                                ice_debug(hw, ICE_DBG_INIT,
-                                         "HW:func.fd_fltr guar= %d\n",
-                                         func_p->fd_fltr_guar);
+                                         "%s: num guaranteed FD filters = %d\n",
+                                         prefix, func_p->fd_fltr_guar);
                                ice_debug(hw, ICE_DBG_INIT,
-                                         "HW:func.fd_fltr best effort=%d\n",
-                                         func_p->fd_fltr_best_effort);
+                                         "%s: num best effort FD filters = %d\n",
+                                         prefix, func_p->fd_fltr_best_effort);
                        }
                        break;
                }
                case ICE_AQC_CAPS_MAX_MTU:
                        caps->max_mtu = number;
-                       if (dev_p)
-                               ice_debug(hw, ICE_DBG_INIT,
-                                         "HW caps: Dev.MaxMTU = %d\n",
-                                         caps->max_mtu);
-                       else if (func_p)
-                               ice_debug(hw, ICE_DBG_INIT,
-                                         "HW caps: func.MaxMTU = %d\n",
-                                         caps->max_mtu);
+                       ice_debug(hw, ICE_DBG_INIT, "%s: max MTU = %d\n",
+                                 prefix, caps->max_mtu);
                        break;
                default:
                        ice_debug(hw, ICE_DBG_INIT,
-                                 "HW caps: Unknown capability[%d]: 0x%x\n", i,
-                                 cap);
+                                 "%s: unknown capability[%d]: 0x%x\n", prefix,
+                                 i, cap);
                        break;
                }
        }
+
+       /* Re-calculate capabilities that are dependent on the number of
+        * physical ports; i.e. some features are not supported or function
+        * differently on devices with more than 4 ports.
+        */
+       if (caps && (ice_hweight32(caps->valid_functions) > 4)) {
+               /* Max 4 TCs per port */
+               caps->maxtc = 4;
+               ice_debug(hw, ICE_DBG_INIT,
+                         "%s: TC max = %d (based on #ports)\n", prefix,
+                         caps->maxtc);
+       }
 }
 
 /**
@@ -3103,7 +3121,7 @@ ice_aq_add_lan_txq(struct ice_hw *hw, u8 num_qgrps,
        struct ice_aqc_add_txqs *cmd;
        struct ice_aq_desc desc;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_aq_add_lan_txq");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
        cmd = &desc.params.add_txqs;
 
@@ -3159,7 +3177,7 @@ ice_aq_dis_lan_txq(struct ice_hw *hw, u8 num_qgrps,
        enum ice_status status;
        u16 i, sz = 0;
 
-       ice_debug(hw, ICE_DBG_TRACE, "ice_aq_dis_lan_txq");
+       ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
        cmd = &desc.params.dis_txqs;
        ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_dis_txqs);