From: Piotr Kwapulinski <piotr.kwapulin...@intel.com>

Add low level support for E610 device capabilities detection. The
capabilities are discovered via the Admin Command Interface.

Signed-off-by: Stefan Wegrzyn <stefan.wegr...@intel.com>
Signed-off-by: Jedrzej Jagielski <jedrzej.jagiel...@intel.com>
Signed-off-by: Piotr Kwapulinski <piotr.kwapulin...@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---
 drivers/net/ixgbe/base/ixgbe_e610.c  | 660 +++++++++++++++++++++++++++
 drivers/net/ixgbe/base/ixgbe_e610.h  |  12 +
 drivers/net/ixgbe/base/ixgbe_osdep.h |   1 +
 drivers/net/ixgbe/base/ixgbe_type.h  |   2 +
 4 files changed, 675 insertions(+)

diff --git a/drivers/net/ixgbe/base/ixgbe_e610.c 
b/drivers/net/ixgbe/base/ixgbe_e610.c
index a989fd741a..7f3eb0cf10 100644
--- a/drivers/net/ixgbe/base/ixgbe_e610.c
+++ b/drivers/net/ixgbe/base/ixgbe_e610.c
@@ -567,3 +567,663 @@ void ixgbe_release_res(struct ixgbe_hw *hw, enum 
ixgbe_aci_res_ids res)
                total_delay++;
        }
 }
+
+/**
+ * ixgbe_parse_common_caps - Parse common device/function capabilities
+ * @hw: pointer to the HW struct
+ * @caps: pointer to common capabilities structure
+ * @elem: the capability element to parse
+ * @prefix: message prefix for tracing capabilities
+ *
+ * Given a capability element, extract relevant details into the common
+ * capability structure.
+ *
+ * Return: true if the capability matches one of the common capability ids,
+ * false otherwise.
+ */
+static bool
+ixgbe_parse_common_caps(struct ixgbe_hw *hw, struct ixgbe_hw_common_caps *caps,
+                       struct ixgbe_aci_cmd_list_caps_elem *elem,
+                       const char *prefix)
+{
+       u32 logical_id = IXGBE_LE32_TO_CPU(elem->logical_id);
+       u32 phys_id = IXGBE_LE32_TO_CPU(elem->phys_id);
+       u32 number = IXGBE_LE32_TO_CPU(elem->number);
+       u16 cap = IXGBE_LE16_TO_CPU(elem->cap);
+       bool found = true;
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       switch (cap) {
+       case IXGBE_ACI_CAPS_VALID_FUNCTIONS:
+               caps->valid_functions = number;
+               break;
+       case IXGBE_ACI_CAPS_VMDQ:
+               caps->vmdq = (number == 1);
+               break;
+       case IXGBE_ACI_CAPS_DCB:
+               caps->dcb = (number == 1);
+               caps->active_tc_bitmap = logical_id;
+               caps->maxtc = phys_id;
+               break;
+       case IXGBE_ACI_CAPS_RSS:
+               caps->rss_table_size = number;
+               caps->rss_table_entry_width = logical_id;
+               break;
+       case IXGBE_ACI_CAPS_RXQS:
+               caps->num_rxq = number;
+               caps->rxq_first_id = phys_id;
+               break;
+       case IXGBE_ACI_CAPS_TXQS:
+               caps->num_txq = number;
+               caps->txq_first_id = phys_id;
+               break;
+       case IXGBE_ACI_CAPS_MSIX:
+               caps->num_msix_vectors = number;
+               caps->msix_vector_first_id = phys_id;
+               break;
+       case IXGBE_ACI_CAPS_NVM_VER:
+               break;
+       case IXGBE_ACI_CAPS_NVM_MGMT:
+               caps->sec_rev_disabled =
+                       (number & IXGBE_NVM_MGMT_SEC_REV_DISABLED) ?
+                       true : false;
+               caps->update_disabled =
+                       (number & IXGBE_NVM_MGMT_UPDATE_DISABLED) ?
+                       true : false;
+               caps->nvm_unified_update =
+                       (number & IXGBE_NVM_MGMT_UNIFIED_UPD_SUPPORT) ?
+                       true : false;
+               caps->netlist_auth =
+                       (number & IXGBE_NVM_MGMT_NETLIST_AUTH_SUPPORT) ?
+                       true : false;
+               break;
+       case IXGBE_ACI_CAPS_MAX_MTU:
+               caps->max_mtu = number;
+               break;
+       case IXGBE_ACI_CAPS_PCIE_RESET_AVOIDANCE:
+               caps->pcie_reset_avoidance = (number > 0);
+               break;
+       case IXGBE_ACI_CAPS_POST_UPDATE_RESET_RESTRICT:
+               caps->reset_restrict_support = (number == 1);
+               break;
+       case IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG0:
+       case IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG1:
+       case IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG2:
+       case IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG3:
+       {
+               u8 index = cap - IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG0;
+
+               caps->ext_topo_dev_img_ver_high[index] = number;
+               caps->ext_topo_dev_img_ver_low[index] = logical_id;
+               caps->ext_topo_dev_img_part_num[index] =
+                       (phys_id & IXGBE_EXT_TOPO_DEV_IMG_PART_NUM_M) >>
+                       IXGBE_EXT_TOPO_DEV_IMG_PART_NUM_S;
+               caps->ext_topo_dev_img_load_en[index] =
+                       (phys_id & IXGBE_EXT_TOPO_DEV_IMG_LOAD_EN) != 0;
+               caps->ext_topo_dev_img_prog_en[index] =
+                       (phys_id & IXGBE_EXT_TOPO_DEV_IMG_PROG_EN) != 0;
+               break;
+       }
+
+       case IXGBE_ACI_CAPS_NEXT_CLUSTER_ID:
+               caps->next_cluster_id_support = (number == 1);
+               DEBUGOUT2("%s: next_cluster_id_support = %d\n",
+                         prefix, caps->next_cluster_id_support);
+               break;
+       default:
+               /* Not one of the recognized common capabilities */
+               found = false;
+       }
+
+       return found;
+}
+
+/**
+ * ixgbe_hweight8 - count set bits among the 8 lowest bits
+ * @w: variable storing set bits to count
+ *
+ * Return: the number of set bits among the 8 lowest bits in the provided 
value.
+ */
+static u8 ixgbe_hweight8(u32 w)
+{
+       u8 hweight = 0, i;
+
+       for (i = 0; i < 8; i++)
+               if (w & (1 << i))
+                       hweight++;
+
+       return hweight;
+}
+
+/**
+ * ixgbe_hweight32 - count set bits among the 32 lowest bits
+ * @w: variable storing set bits to count
+ *
+ * Return: the number of set bits among the 32 lowest bits in the
+ * provided value.
+ */
+static u8 ixgbe_hweight32(u32 w)
+{
+       u32 bitMask = 0x1, i;
+       u8  bitCnt = 0;
+
+       for (i = 0; i < 32; i++)
+       {
+               if (w & bitMask)
+                       bitCnt++;
+
+               bitMask = bitMask << 0x1;
+       }
+
+       return bitCnt;
+}
+
+/**
+ * ixgbe_func_id_to_logical_id - map from function id to logical pf id
+ * @active_function_bitmap: active function bitmap
+ * @pf_id: function number of device
+ *
+ * Return: the logical id of a function mapped by the provided pf_id.
+ */
+static int ixgbe_func_id_to_logical_id(u32 active_function_bitmap, u8 pf_id)
+{
+       u8 logical_id = 0;
+       u8 i;
+
+       for (i = 0; i < pf_id; i++)
+               if (active_function_bitmap & BIT(i))
+                       logical_id++;
+
+       return logical_id;
+}
+
+/**
+ * ixgbe_parse_valid_functions_cap - Parse IXGBE_ACI_CAPS_VALID_FUNCTIONS caps
+ * @hw: pointer to the HW struct
+ * @dev_p: pointer to device capabilities structure
+ * @cap: capability element to parse
+ *
+ * Parse IXGBE_ACI_CAPS_VALID_FUNCTIONS for device capabilities.
+ */
+static void
+ixgbe_parse_valid_functions_cap(struct ixgbe_hw *hw,
+                               struct ixgbe_hw_dev_caps *dev_p,
+                               struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       u32 number = IXGBE_LE32_TO_CPU(cap->number);
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       dev_p->num_funcs = ixgbe_hweight32(number);
+
+       hw->logical_pf_id = ixgbe_func_id_to_logical_id(number, hw->pf_id);
+}
+
+/**
+ * ixgbe_parse_vsi_dev_caps - Parse IXGBE_ACI_CAPS_VSI device caps
+ * @hw: pointer to the HW struct
+ * @dev_p: pointer to device capabilities structure
+ * @cap: capability element to parse
+ *
+ * Parse IXGBE_ACI_CAPS_VSI for device capabilities.
+ */
+static void ixgbe_parse_vsi_dev_caps(struct ixgbe_hw *hw,
+                                    struct ixgbe_hw_dev_caps *dev_p,
+                                    struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       u32 number = IXGBE_LE32_TO_CPU(cap->number);
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       dev_p->num_vsi_allocd_to_host = number;
+}
+
+/**
+ * ixgbe_parse_1588_dev_caps - Parse IXGBE_ACI_CAPS_1588 device caps
+ * @hw: pointer to the HW struct
+ * @dev_p: pointer to device capabilities structure
+ * @cap: capability element to parse
+ *
+ * Parse IXGBE_ACI_CAPS_1588 for device capabilities.
+ */
+static void ixgbe_parse_1588_dev_caps(struct ixgbe_hw *hw,
+                                     struct ixgbe_hw_dev_caps *dev_p,
+                                     struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       struct ixgbe_ts_dev_info *info = &dev_p->ts_dev_info;
+       u32 logical_id = IXGBE_LE32_TO_CPU(cap->logical_id);
+       u32 phys_id = IXGBE_LE32_TO_CPU(cap->phys_id);
+       u32 number = IXGBE_LE32_TO_CPU(cap->number);
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       info->ena = ((number & IXGBE_TS_DEV_ENA_M) != 0);
+       dev_p->common_cap.ieee_1588 = info->ena;
+
+       info->tmr0_owner = number & IXGBE_TS_TMR0_OWNR_M;
+       info->tmr0_owned = ((number & IXGBE_TS_TMR0_OWND_M) != 0);
+       info->tmr0_ena = ((number & IXGBE_TS_TMR0_ENA_M) != 0);
+
+       info->tmr1_owner = (number & IXGBE_TS_TMR1_OWNR_M) >>
+                          IXGBE_TS_TMR1_OWNR_S;
+       info->tmr1_owned = ((number & IXGBE_TS_TMR1_OWND_M) != 0);
+       info->tmr1_ena = ((number & IXGBE_TS_TMR1_ENA_M) != 0);
+
+       info->ena_ports = logical_id;
+       info->tmr_own_map = phys_id;
+
+}
+
+/**
+ * ixgbe_parse_fdir_dev_caps - Parse IXGBE_ACI_CAPS_FD device caps
+ * @hw: pointer to the HW struct
+ * @dev_p: pointer to device capabilities structure
+ * @cap: capability element to parse
+ *
+ * Parse IXGBE_ACI_CAPS_FD for device capabilities.
+ */
+static void ixgbe_parse_fdir_dev_caps(struct ixgbe_hw *hw,
+                                     struct ixgbe_hw_dev_caps *dev_p,
+                                     struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       u32 number = IXGBE_LE32_TO_CPU(cap->number);
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       dev_p->num_flow_director_fltr = number;
+}
+
+/**
+ * ixgbe_parse_dev_caps - Parse device capabilities
+ * @hw: pointer to the HW struct
+ * @dev_p: pointer to device capabilities structure
+ * @buf: buffer containing the device capability records
+ * @cap_count: the number of capabilities
+ *
+ * Helper device to parse device (0x000B) capabilities list. For
+ * capabilities shared between device and function, this relies on
+ * ixgbe_parse_common_caps.
+ *
+ * Loop through the list of provided capabilities and extract the relevant
+ * data into the device capabilities structured.
+ */
+static void ixgbe_parse_dev_caps(struct ixgbe_hw *hw,
+                                struct ixgbe_hw_dev_caps *dev_p,
+                                void *buf, u32 cap_count)
+{
+       struct ixgbe_aci_cmd_list_caps_elem *cap_resp;
+       u32 i;
+
+       cap_resp = (struct ixgbe_aci_cmd_list_caps_elem *)buf;
+
+       memset(dev_p, 0, sizeof(*dev_p));
+
+       for (i = 0; i < cap_count; i++) {
+               u16 cap = IXGBE_LE16_TO_CPU(cap_resp[i].cap);
+               bool found;
+
+               found = ixgbe_parse_common_caps(hw, &dev_p->common_cap,
+                                             &cap_resp[i], "dev caps");
+
+               switch (cap) {
+               case IXGBE_ACI_CAPS_VALID_FUNCTIONS:
+                       ixgbe_parse_valid_functions_cap(hw, dev_p,
+                                                       &cap_resp[i]);
+                       break;
+               case IXGBE_ACI_CAPS_VSI:
+                       ixgbe_parse_vsi_dev_caps(hw, dev_p, &cap_resp[i]);
+                       break;
+               case IXGBE_ACI_CAPS_1588:
+                       ixgbe_parse_1588_dev_caps(hw, dev_p, &cap_resp[i]);
+                       break;
+               case  IXGBE_ACI_CAPS_FD:
+                       ixgbe_parse_fdir_dev_caps(hw, dev_p, &cap_resp[i]);
+                       break;
+               default:
+                       /* Don't list common capabilities as unknown */
+                       if (!found)
+                       break;
+               }
+       }
+
+}
+
+/**
+ * ixgbe_get_num_per_func - determine number of resources per PF
+ * @hw: pointer to the HW structure
+ * @max: value to be evenly split between each PF
+ *
+ * Determine the number of valid functions by going through the bitmap returned
+ * from parsing capabilities and use this to calculate the number of resources
+ * per PF based on the max value passed in.
+ *
+ * Return: the number of resources per PF or 0, if no PH are available.
+ */
+static u32 ixgbe_get_num_per_func(struct ixgbe_hw *hw, u32 max)
+{
+       u8 funcs;
+
+#define IXGBE_CAPS_VALID_FUNCS_M       0xFF
+       funcs = ixgbe_hweight8(hw->dev_caps.common_cap.valid_functions &
+                            IXGBE_CAPS_VALID_FUNCS_M);
+
+       if (!funcs)
+               return 0;
+
+       return max / funcs;
+}
+
+/**
+ * ixgbe_parse_vsi_func_caps - Parse IXGBE_ACI_CAPS_VSI function caps
+ * @hw: pointer to the HW struct
+ * @func_p: pointer to function capabilities structure
+ * @cap: pointer to the capability element to parse
+ *
+ * Extract function capabilities for IXGBE_ACI_CAPS_VSI.
+ */
+static void ixgbe_parse_vsi_func_caps(struct ixgbe_hw *hw,
+                                     struct ixgbe_hw_func_caps *func_p,
+                                     struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       func_p->guar_num_vsi = ixgbe_get_num_per_func(hw, IXGBE_MAX_VSI);
+}
+
+/**
+ * ixgbe_parse_1588_func_caps - Parse IXGBE_ACI_CAPS_1588 function caps
+ * @hw: pointer to the HW struct
+ * @func_p: pointer to function capabilities structure
+ * @cap: pointer to the capability element to parse
+ *
+ * Extract function capabilities for IXGBE_ACI_CAPS_1588.
+ */
+static void ixgbe_parse_1588_func_caps(struct ixgbe_hw *hw,
+                                      struct ixgbe_hw_func_caps *func_p,
+                                      struct ixgbe_aci_cmd_list_caps_elem *cap)
+{
+       struct ixgbe_ts_func_info *info = &func_p->ts_func_info;
+       u32 number = IXGBE_LE32_TO_CPU(cap->number);
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       info->ena = ((number & IXGBE_TS_FUNC_ENA_M) != 0);
+       func_p->common_cap.ieee_1588 = info->ena;
+
+       info->src_tmr_owned = ((number & IXGBE_TS_SRC_TMR_OWND_M) != 0);
+       info->tmr_ena = ((number & IXGBE_TS_TMR_ENA_M) != 0);
+       info->tmr_index_owned = ((number & IXGBE_TS_TMR_IDX_OWND_M) != 0);
+       info->tmr_index_assoc = ((number & IXGBE_TS_TMR_IDX_ASSOC_M) != 0);
+
+       info->clk_freq = (number & IXGBE_TS_CLK_FREQ_M) >> IXGBE_TS_CLK_FREQ_S;
+       info->clk_src = ((number & IXGBE_TS_CLK_SRC_M) != 0);
+
+       if (info->clk_freq < NUM_IXGBE_TIME_REF_FREQ) {
+               info->time_ref = (enum ixgbe_time_ref_freq)info->clk_freq;
+       } else {
+               /* Unknown clock frequency, so assume a (probably incorrect)
+                * default to avoid out-of-bounds look ups of frequency
+                * related information.
+                */
+               info->time_ref = IXGBE_TIME_REF_FREQ_25_000;
+       }
+
+}
+/**
+ * ixgbe_parse_func_caps - Parse function capabilities
+ * @hw: pointer to the HW struct
+ * @func_p: pointer to function capabilities structure
+ * @buf: buffer containing the function capability records
+ * @cap_count: the number of capabilities
+ *
+ * Helper function to parse function (0x000A) capabilities list. For
+ * capabilities shared between device and function, this relies on
+ * ixgbe_parse_common_caps.
+ *
+ * Loop through the list of provided capabilities and extract the relevant
+ * data into the function capabilities structured.
+ */
+static void ixgbe_parse_func_caps(struct ixgbe_hw *hw,
+                                 struct ixgbe_hw_func_caps *func_p,
+                                 void *buf, u32 cap_count)
+{
+       struct ixgbe_aci_cmd_list_caps_elem *cap_resp;
+       u32 i;
+
+       cap_resp = (struct ixgbe_aci_cmd_list_caps_elem *)buf;
+
+       memset(func_p, 0, sizeof(*func_p));
+
+       for (i = 0; i < cap_count; i++) {
+               u16 cap = IXGBE_LE16_TO_CPU(cap_resp[i].cap);
+
+               ixgbe_parse_common_caps(hw, &func_p->common_cap,
+                                       &cap_resp[i], "func caps");
+
+               switch (cap) {
+               case IXGBE_ACI_CAPS_VSI:
+                       ixgbe_parse_vsi_func_caps(hw, func_p, &cap_resp[i]);
+                       break;
+               case IXGBE_ACI_CAPS_1588:
+                       ixgbe_parse_1588_func_caps(hw, func_p, &cap_resp[i]);
+                       break;
+               default:
+                       /* Don't list common capabilities as unknown */
+                       break;
+               }
+       }
+
+}
+
+/**
+ * ixgbe_aci_list_caps - query function/device capabilities
+ * @hw: pointer to the HW struct
+ * @buf: a buffer to hold the capabilities
+ * @buf_size: size of the buffer
+ * @cap_count: if not NULL, set to the number of capabilities reported
+ * @opc: capabilities type to discover, device or function
+ *
+ * Get the function (0x000A) or device (0x000B) capabilities description from
+ * firmware and store it in the buffer.
+ *
+ * If the cap_count pointer is not NULL, then it is set to the number of
+ * capabilities firmware will report. Note that if the buffer size is too
+ * small, it is possible the command will return IXGBE_ERR_OUT_OF_MEM. The
+ * cap_count will still be updated in this case. It is recommended that the
+ * buffer size be set to IXGBE_ACI_MAX_BUFFER_SIZE (the largest possible
+ * buffer that firmware could return) to avoid this.
+ *
+ * Return: the exit code of the operation.
+ * Exit code of IXGBE_ERR_OUT_OF_MEM means the buffer size is too small.
+ */
+s32 ixgbe_aci_list_caps(struct ixgbe_hw *hw, void *buf, u16 buf_size,
+                       u32 *cap_count, enum ixgbe_aci_opc opc)
+{
+       struct ixgbe_aci_cmd_list_caps *cmd;
+       struct ixgbe_aci_desc desc;
+       s32 status;
+
+       cmd = &desc.params.get_cap;
+
+       if (opc != ixgbe_aci_opc_list_func_caps &&
+           opc != ixgbe_aci_opc_list_dev_caps)
+               return IXGBE_ERR_PARAM;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, opc);
+       status = ixgbe_aci_send_cmd(hw, &desc, buf, buf_size);
+
+       if (cap_count)
+               *cap_count = IXGBE_LE32_TO_CPU(cmd->count);
+
+       return status;
+}
+
+/**
+ * ixgbe_discover_dev_caps - Read and extract device capabilities
+ * @hw: pointer to the hardware structure
+ * @dev_caps: pointer to device capabilities structure
+ *
+ * Read the device capabilities and extract them into the dev_caps structure
+ * for later use.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_discover_dev_caps(struct ixgbe_hw *hw,
+                           struct ixgbe_hw_dev_caps *dev_caps)
+{
+       u32 status, cap_count = 0;
+       u8 *cbuf = NULL;
+
+       cbuf = (u8*)ixgbe_malloc(hw, IXGBE_ACI_MAX_BUFFER_SIZE);
+       if (!cbuf)
+               return IXGBE_ERR_OUT_OF_MEM;
+       /* Although the driver doesn't know the number of capabilities the
+        * device will return, we can simply send a 4KB buffer, the maximum
+        * possible size that firmware can return.
+        */
+       cap_count = IXGBE_ACI_MAX_BUFFER_SIZE /
+                   sizeof(struct ixgbe_aci_cmd_list_caps_elem);
+
+       status = ixgbe_aci_list_caps(hw, cbuf, IXGBE_ACI_MAX_BUFFER_SIZE,
+                                    &cap_count,
+                                    ixgbe_aci_opc_list_dev_caps);
+       if (!status)
+               ixgbe_parse_dev_caps(hw, dev_caps, cbuf, cap_count);
+
+       if (cbuf)
+               ixgbe_free(hw, cbuf);
+
+       return status;
+}
+
+/**
+ * ixgbe_discover_func_caps - Read and extract function capabilities
+ * @hw: pointer to the hardware structure
+ * @func_caps: pointer to function capabilities structure
+ *
+ * Read the function capabilities and extract them into the func_caps structure
+ * for later use.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_discover_func_caps(struct ixgbe_hw *hw,
+                            struct ixgbe_hw_func_caps *func_caps)
+{
+       u32 cap_count = 0;
+       u8 *cbuf = NULL;
+       s32 status;
+
+       cbuf = (u8*)ixgbe_malloc(hw, IXGBE_ACI_MAX_BUFFER_SIZE);
+       if(!cbuf)
+               return IXGBE_ERR_OUT_OF_MEM;
+       /* Although the driver doesn't know the number of capabilities the
+        * device will return, we can simply send a 4KB buffer, the maximum
+        * possible size that firmware can return.
+        */
+       cap_count = IXGBE_ACI_MAX_BUFFER_SIZE /
+                   sizeof(struct ixgbe_aci_cmd_list_caps_elem);
+
+       status = ixgbe_aci_list_caps(hw, cbuf, IXGBE_ACI_MAX_BUFFER_SIZE,
+                                    &cap_count,
+                                    ixgbe_aci_opc_list_func_caps);
+       if (!status)
+               ixgbe_parse_func_caps(hw, func_caps, cbuf, cap_count);
+
+       if (cbuf)
+               ixgbe_free(hw, cbuf);
+
+       return status;
+}
+
+/**
+ * ixgbe_aci_disable_rxen - disable RX
+ * @hw: pointer to the HW struct
+ *
+ * Request a safe disable of Receive Enable using ACI command (0x000C).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_disable_rxen(struct ixgbe_hw *hw)
+{
+       struct ixgbe_aci_cmd_disable_rxen *cmd;
+       struct ixgbe_aci_desc desc;
+
+       UNREFERENCED_1PARAMETER(hw);
+
+       cmd = &desc.params.disable_rxen;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_disable_rxen);
+
+       cmd->lport_num = (u8)hw->bus.func;
+
+       return ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+}
+
+/**
+ * ixgbe_aci_get_phy_caps - returns PHY capabilities
+ * @hw: pointer to the HW struct
+ * @qual_mods: report qualified modules
+ * @report_mode: report mode capabilities
+ * @pcaps: structure for PHY capabilities to be filled
+ *
+ * Returns the various PHY capabilities supported on the Port
+ * using ACI command (0x0600).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_get_phy_caps(struct ixgbe_hw *hw, bool qual_mods, u8 report_mode,
+                          struct ixgbe_aci_cmd_get_phy_caps_data *pcaps)
+{
+       struct ixgbe_aci_cmd_get_phy_caps *cmd;
+       u16 pcaps_size = sizeof(*pcaps);
+       struct ixgbe_aci_desc desc;
+       s32 status;
+
+       cmd = &desc.params.get_phy;
+
+       if (!pcaps || (report_mode & ~IXGBE_ACI_REPORT_MODE_M))
+               return IXGBE_ERR_PARAM;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_get_phy_caps);
+
+       if (qual_mods)
+               cmd->param0 |= IXGBE_CPU_TO_LE16(IXGBE_ACI_GET_PHY_RQM);
+
+       cmd->param0 |= IXGBE_CPU_TO_LE16(report_mode);
+       status = ixgbe_aci_send_cmd(hw, &desc, pcaps, pcaps_size);
+
+       if (status == IXGBE_SUCCESS &&
+           report_mode == IXGBE_ACI_REPORT_TOPO_CAP_MEDIA) {
+               hw->phy.phy_type_low = IXGBE_LE64_TO_CPU(pcaps->phy_type_low);
+               hw->phy.phy_type_high = IXGBE_LE64_TO_CPU(pcaps->phy_type_high);
+               memcpy(hw->link.link_info.module_type, &pcaps->module_type,
+                          sizeof(hw->link.link_info.module_type));
+       }
+
+       return status;
+}
+
+/**
+ * ixgbe_copy_phy_caps_to_cfg - Copy PHY ability data to configuration data
+ * @caps: PHY ability structure to copy data from
+ * @cfg: PHY configuration structure to copy data to
+ *
+ * Helper function to copy data from PHY capabilities data structure
+ * to PHY configuration data structure
+ */
+void ixgbe_copy_phy_caps_to_cfg(struct ixgbe_aci_cmd_get_phy_caps_data *caps,
+                               struct ixgbe_aci_cmd_set_phy_cfg_data *cfg)
+{
+       if (!caps || !cfg)
+               return;
+
+       memset(cfg, 0, sizeof(*cfg));
+       cfg->phy_type_low = caps->phy_type_low;
+       cfg->phy_type_high = caps->phy_type_high;
+       cfg->caps = caps->caps;
+       cfg->low_power_ctrl_an = caps->low_power_ctrl_an;
+       cfg->eee_cap = caps->eee_cap;
+       cfg->eeer_value = caps->eeer_value;
+       cfg->link_fec_opt = caps->link_fec_options;
+       cfg->module_compliance_enforcement =
+               caps->module_compliance_enforcement;
+}
diff --git a/drivers/net/ixgbe/base/ixgbe_e610.h 
b/drivers/net/ixgbe/base/ixgbe_e610.h
index aeaa75af37..5f78f970c4 100644
--- a/drivers/net/ixgbe/base/ixgbe_e610.h
+++ b/drivers/net/ixgbe/base/ixgbe_e610.h
@@ -18,8 +18,20 @@ s32 ixgbe_aci_get_event(struct ixgbe_hw *hw, struct 
ixgbe_aci_event *e,
 
 void ixgbe_fill_dflt_direct_cmd_desc(struct ixgbe_aci_desc *desc, u16 opcode);
 
+s32 ixgbe_aci_get_fw_ver(struct ixgbe_hw *hw);
 s32 ixgbe_acquire_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res,
                      enum ixgbe_aci_res_access_type access, u32 timeout);
 void ixgbe_release_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res);
+s32 ixgbe_aci_list_caps(struct ixgbe_hw *hw, void *buf, u16 buf_size,
+                       u32 *cap_count, enum ixgbe_aci_opc opc);
+s32 ixgbe_discover_dev_caps(struct ixgbe_hw *hw,
+                           struct ixgbe_hw_dev_caps *dev_caps);
+s32 ixgbe_discover_func_caps(struct ixgbe_hw* hw,
+                            struct ixgbe_hw_func_caps* func_caps);
+s32 ixgbe_aci_disable_rxen(struct ixgbe_hw *hw);
+s32 ixgbe_aci_get_phy_caps(struct ixgbe_hw *hw, bool qual_mods, u8 report_mode,
+                          struct ixgbe_aci_cmd_get_phy_caps_data *pcaps);
+void ixgbe_copy_phy_caps_to_cfg(struct ixgbe_aci_cmd_get_phy_caps_data *caps,
+                               struct ixgbe_aci_cmd_set_phy_cfg_data *cfg);
 
 #endif /* _IXGBE_E610_H_ */
diff --git a/drivers/net/ixgbe/base/ixgbe_osdep.h 
b/drivers/net/ixgbe/base/ixgbe_osdep.h
index b3266a3c77..e832a7bec8 100644
--- a/drivers/net/ixgbe/base/ixgbe_osdep.h
+++ b/drivers/net/ixgbe/base/ixgbe_osdep.h
@@ -82,6 +82,7 @@ enum {
 #define IXGBE_CPU_TO_LE32(_i)  rte_cpu_to_le_32(_i)
 #define IXGBE_LE16_TO_CPU(_i)  rte_le_to_cpu_16(_i)
 #define IXGBE_LE32_TO_CPU(_i)  rte_le_to_cpu_32(_i)
+#define IXGBE_LE64_TO_CPU(_i)  rte_le_to_cpu_64(_i)
 #define IXGBE_LE32_TO_CPUS(_i) rte_le_to_cpu_32(_i)
 #define IXGBE_CPU_TO_BE16(_i)  rte_cpu_to_be_16(_i)
 #define IXGBE_CPU_TO_BE32(_i)  rte_cpu_to_be_32(_i)
diff --git a/drivers/net/ixgbe/base/ixgbe_type.h 
b/drivers/net/ixgbe/base/ixgbe_type.h
index fe7411541e..5ba15fc721 100644
--- a/drivers/net/ixgbe/base/ixgbe_type.h
+++ b/drivers/net/ixgbe/base/ixgbe_type.h
@@ -4190,6 +4190,8 @@ struct ixgbe_hw {
        u16 subsystem_device_id;
        u16 subsystem_vendor_id;
        u8 revision_id;
+       u8 pf_id;
+       u8 logical_pf_id;
        bool adapter_stopped;
        int api_version;
        bool force_full_reset;
-- 
2.43.0

Reply via email to