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

Add low level support for Admin Command Interface (ACI). ACI is the
Firmware interface used by a driver to communicate with E610 adapter. Add
the following ACI features:
- data structures, macros, register definitions
- commands handling
- events handling

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      |  569 ++++++++
 drivers/net/ixgbe/base/ixgbe_e610.h      |   25 +
 drivers/net/ixgbe/base/ixgbe_osdep.c     |   47 +
 drivers/net/ixgbe/base/ixgbe_osdep.h     |   18 +-
 drivers/net/ixgbe/base/ixgbe_type.h      |   59 +-
 drivers/net/ixgbe/base/ixgbe_type_e610.h | 1682 ++++++++++++++++++++++
 drivers/net/ixgbe/base/meson.build       |    4 +-
 7 files changed, 2400 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/ixgbe/base/ixgbe_e610.c
 create mode 100644 drivers/net/ixgbe/base/ixgbe_e610.h
 create mode 100644 drivers/net/ixgbe/base/ixgbe_osdep.c
 create mode 100644 drivers/net/ixgbe/base/ixgbe_type_e610.h

diff --git a/drivers/net/ixgbe/base/ixgbe_e610.c 
b/drivers/net/ixgbe/base/ixgbe_e610.c
new file mode 100644
index 0000000000..a989fd741a
--- /dev/null
+++ b/drivers/net/ixgbe/base/ixgbe_e610.c
@@ -0,0 +1,569 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#include "ixgbe_type.h"
+#include "ixgbe_e610.h"
+#include "ixgbe_x550.h"
+#include "ixgbe_common.h"
+#include "ixgbe_phy.h"
+#include "ixgbe_api.h"
+
+/**
+ * ixgbe_init_aci - initialization routine for Admin Command Interface
+ * @hw: pointer to the hardware structure
+ *
+ * Initialize the ACI lock.
+ */
+void ixgbe_init_aci(struct ixgbe_hw *hw)
+{
+       ixgbe_init_lock(&hw->aci.lock);
+}
+
+/**
+ * ixgbe_shutdown_aci - shutdown routine for Admin Command Interface
+ * @hw: pointer to the hardware structure
+ *
+ * Destroy the ACI lock.
+ */
+void ixgbe_shutdown_aci(struct ixgbe_hw *hw)
+{
+       ixgbe_destroy_lock(&hw->aci.lock);
+}
+
+/**
+ * ixgbe_should_retry_aci_send_cmd_execute - decide if ACI command should
+ * be resent
+ * @opcode: ACI opcode
+ *
+ * Check if ACI command should be sent again depending on the provided opcode.
+ *
+ * Return: true if the sending command routine should be repeated,
+ * otherwise false.
+ */
+STATIC bool ixgbe_should_retry_aci_send_cmd_execute(u16 opcode)
+{
+
+       switch (opcode) {
+       case ixgbe_aci_opc_disable_rxen:
+       case ixgbe_aci_opc_get_phy_caps:
+       case ixgbe_aci_opc_get_link_status:
+       case ixgbe_aci_opc_get_link_topo:
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * ixgbe_aci_send_cmd_execute - execute sending FW Admin Command to FW Admin
+ * Command Interface
+ * @hw: pointer to the HW struct
+ * @desc: descriptor describing the command
+ * @buf: buffer to use for indirect commands (NULL for direct commands)
+ * @buf_size: size of buffer for indirect commands (0 for direct commands)
+ *
+ * Admin Command is sent using CSR by setting descriptor and buffer in specific
+ * registers.
+ *
+ * Return: the exit code of the operation.
+ * * - IXGBE_SUCCESS - success.
+ * * - IXGBE_ERR_ACI_DISABLED - CSR mechanism is not enabled.
+ * * - IXGBE_ERR_ACI_BUSY - CSR mechanism is busy.
+ * * - IXGBE_ERR_PARAM - buf_size is too big or
+ * invalid argument buf or buf_size.
+ * * - IXGBE_ERR_ACI_TIMEOUT - Admin Command X command timeout.
+ * * - IXGBE_ERR_ACI_ERROR - Admin Command X invalid state of HICR register or
+ * Admin Command failed because of bad opcode was returned or
+ * Admin Command failed with error Y.
+ */
+STATIC s32
+ixgbe_aci_send_cmd_execute(struct ixgbe_hw *hw, struct ixgbe_aci_desc *desc,
+                          void *buf, u16 buf_size)
+{
+       u32 hicr = 0, tmp_buf_size = 0, i = 0;
+       u32 *raw_desc = (u32 *)desc;
+       s32 status = IXGBE_SUCCESS;
+       bool valid_buf = false;
+       u32 *tmp_buf = NULL;
+       u16 opcode = 0;
+
+       do {
+               hw->aci.last_status = IXGBE_ACI_RC_OK;
+
+               /* It's necessary to check if mechanism is enabled */
+               hicr = IXGBE_READ_REG(hw, PF_HICR);
+               if (!(hicr & PF_HICR_EN)) {
+                       status = IXGBE_ERR_ACI_DISABLED;
+                       break;
+               }
+               if (hicr & PF_HICR_C) {
+                       hw->aci.last_status = IXGBE_ACI_RC_EBUSY;
+                       status = IXGBE_ERR_ACI_BUSY;
+                       break;
+               }
+               opcode = desc->opcode;
+
+               if (buf_size > IXGBE_ACI_MAX_BUFFER_SIZE) {
+                       status = IXGBE_ERR_PARAM;
+                       break;
+               }
+
+               if (buf)
+                       desc->flags |= IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_BUF);
+
+               /* Check if buf and buf_size are proper params */
+               if (desc->flags & IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_BUF)) {
+                       if ((buf && buf_size == 0) ||
+                           (buf == NULL && buf_size)) {
+                               status = IXGBE_ERR_PARAM;
+                               break;
+                       }
+                       if (buf && buf_size)
+                               valid_buf = true;
+               }
+
+               if (valid_buf == true) {
+                       if (buf_size % 4 == 0)
+                               tmp_buf_size = buf_size;
+                       else
+                               tmp_buf_size = (buf_size & (u16)(~0x03)) + 4;
+
+                       tmp_buf = (u32*)ixgbe_malloc(hw, tmp_buf_size);
+                       if (!tmp_buf)
+                               return IXGBE_ERR_OUT_OF_MEM;
+
+                       /* tmp_buf will be firstly filled with 0xFF and after
+                        * that the content of buf will be written into it.
+                        * This approach lets us use valid buf_size and
+                        * prevents us from reading past buf area
+                        * when buf_size mod 4 not equal to 0.
+                        */
+                       memset(tmp_buf, 0xFF, tmp_buf_size);
+                       memcpy(tmp_buf, buf, buf_size);
+
+                       if (tmp_buf_size > IXGBE_ACI_LG_BUF)
+                               desc->flags |=
+                               IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_LB);
+
+                       desc->datalen = IXGBE_CPU_TO_LE16(buf_size);
+
+                       if (desc->flags & IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_RD)) 
{
+                               for (i = 0; i < tmp_buf_size / 4; i++) {
+                                       IXGBE_WRITE_REG(hw, PF_HIBA(i),
+                                               IXGBE_LE32_TO_CPU(tmp_buf[i]));
+                               }
+                       }
+               }
+
+               /* Descriptor is written to specific registers */
+               for (i = 0; i < IXGBE_ACI_DESC_SIZE_IN_DWORDS; i++)
+                       IXGBE_WRITE_REG(hw, PF_HIDA(i),
+                                       IXGBE_LE32_TO_CPU(raw_desc[i]));
+
+               /* SW has to set PF_HICR.C bit and clear PF_HICR.SV and
+                * PF_HICR_EV
+                */
+               hicr = IXGBE_READ_REG(hw, PF_HICR);
+               hicr = (hicr | PF_HICR_C) & ~(PF_HICR_SV | PF_HICR_EV);
+               IXGBE_WRITE_REG(hw, PF_HICR, hicr);
+
+               /* Wait for sync Admin Command response */
+               for (i = 0; i < IXGBE_ACI_SYNC_RESPONSE_TIMEOUT; i += 1) {
+                       hicr = IXGBE_READ_REG(hw, PF_HICR);
+                       if ((hicr & PF_HICR_SV) || !(hicr & PF_HICR_C))
+                               break;
+
+                       msec_delay(1);
+               }
+
+               /* Wait for async Admin Command response */
+               if ((hicr & PF_HICR_SV) && (hicr & PF_HICR_C)) {
+                       for (i = 0; i < IXGBE_ACI_ASYNC_RESPONSE_TIMEOUT;
+                            i += 1) {
+                               hicr = IXGBE_READ_REG(hw, PF_HICR);
+                               if ((hicr & PF_HICR_EV) || !(hicr & PF_HICR_C))
+                                       break;
+
+                               msec_delay(1);
+                       }
+               }
+
+               /* Read sync Admin Command response */
+               if ((hicr & PF_HICR_SV)) {
+                       for (i = 0; i < IXGBE_ACI_DESC_SIZE_IN_DWORDS; i++) {
+                               raw_desc[i] = IXGBE_READ_REG(hw, PF_HIDA(i));
+                               raw_desc[i] = IXGBE_CPU_TO_LE32(raw_desc[i]);
+                       }
+               }
+
+               /* Read async Admin Command response */
+               if ((hicr & PF_HICR_EV) && !(hicr & PF_HICR_C)) {
+                       for (i = 0; i < IXGBE_ACI_DESC_SIZE_IN_DWORDS; i++) {
+                               raw_desc[i] = IXGBE_READ_REG(hw, PF_HIDA_2(i));
+                               raw_desc[i] = IXGBE_CPU_TO_LE32(raw_desc[i]);
+                       }
+               }
+
+               /* Handle timeout and invalid state of HICR register */
+               if (hicr & PF_HICR_C) {
+                       status = IXGBE_ERR_ACI_TIMEOUT;
+                       break;
+               } else if (!(hicr & PF_HICR_SV) && !(hicr & PF_HICR_EV)) {
+                       status = IXGBE_ERR_ACI_ERROR;
+                       break;
+               }
+
+               /* For every command other than 0x0014 treat opcode mismatch
+                * as an error. Response to 0x0014 command read from HIDA_2
+                * is a descriptor of an event which is expected to contain
+                * different opcode than the command.
+                */
+               if (desc->opcode != opcode &&
+                   opcode != IXGBE_CPU_TO_LE16(ixgbe_aci_opc_get_fw_event)) {
+                       status = IXGBE_ERR_ACI_ERROR;
+                       break;
+               }
+
+               if (desc->retval != IXGBE_ACI_RC_OK) {
+                       hw->aci.last_status = (enum ixgbe_aci_err)desc->retval;
+                       status = IXGBE_ERR_ACI_ERROR;
+                       break;
+               }
+
+               /* Write a response values to a buf */
+               if (valid_buf && (desc->flags &
+                                 IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_BUF))) {
+                       for (i = 0; i < tmp_buf_size / 4; i++) {
+                               tmp_buf[i] = IXGBE_READ_REG(hw, PF_HIBA(i));
+                               tmp_buf[i] = IXGBE_CPU_TO_LE32(tmp_buf[i]);
+                       }
+                       memcpy(buf, tmp_buf, buf_size);
+               }
+       } while (0);
+
+       if (tmp_buf)
+               ixgbe_free(hw, tmp_buf);
+
+       return status;
+}
+
+/**
+ * ixgbe_aci_send_cmd - send FW Admin Command to FW Admin Command Interface
+ * @hw: pointer to the HW struct
+ * @desc: descriptor describing the command
+ * @buf: buffer to use for indirect commands (NULL for direct commands)
+ * @buf_size: size of buffer for indirect commands (0 for direct commands)
+ *
+ * Helper function to send FW Admin Commands to the FW Admin Command Interface.
+ *
+ * Retry sending the FW Admin Command multiple times to the FW ACI
+ * if the EBUSY Admin Command error is returned.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_send_cmd(struct ixgbe_hw *hw, struct ixgbe_aci_desc *desc,
+                      void *buf, u16 buf_size)
+{
+       struct ixgbe_aci_desc desc_cpy;
+       enum ixgbe_aci_err last_status;
+       bool is_cmd_for_retry;
+       u8 *buf_cpy = NULL;
+       s32 status;
+       u16 opcode;
+       u8 idx = 0;
+
+       opcode = IXGBE_LE16_TO_CPU(desc->opcode);
+       is_cmd_for_retry = ixgbe_should_retry_aci_send_cmd_execute(opcode);
+       memset(&desc_cpy, 0, sizeof(desc_cpy));
+
+       if (is_cmd_for_retry) {
+               if (buf) {
+                       buf_cpy = (u8 *)ixgbe_malloc(hw, buf_size);
+                       if (!buf_cpy)
+                               return IXGBE_ERR_OUT_OF_MEM;
+               }
+               memcpy(&desc_cpy, desc, sizeof(desc_cpy));
+       }
+
+       do {
+               ixgbe_acquire_lock(&hw->aci.lock);
+               status = ixgbe_aci_send_cmd_execute(hw, desc, buf, buf_size);
+               last_status = hw->aci.last_status;
+               ixgbe_release_lock(&hw->aci.lock);
+
+               if (!is_cmd_for_retry || status == IXGBE_SUCCESS ||
+                   last_status != IXGBE_ACI_RC_EBUSY)
+                       break;
+
+               if (buf)
+                       memcpy(buf, buf_cpy, buf_size);
+               memcpy(desc, &desc_cpy, sizeof(desc_cpy));
+
+               msec_delay(IXGBE_ACI_SEND_DELAY_TIME_MS);
+       } while (++idx < IXGBE_ACI_SEND_MAX_EXECUTE);
+
+       if (buf_cpy)
+               ixgbe_free(hw, buf_cpy);
+
+       return status;
+}
+
+/**
+ * ixgbe_aci_check_event_pending - check if there are any pending events
+ * @hw: pointer to the HW struct
+ *
+ * Determine if there are any pending events.
+ *
+ * Return: true if there are any currently pending events
+ * otherwise false.
+ */
+bool ixgbe_aci_check_event_pending(struct ixgbe_hw *hw)
+{
+       u32 ep_bit_mask;
+       u32 fwsts;
+
+       ep_bit_mask = hw->bus.func ? GL_FWSTS_EP_PF1 : GL_FWSTS_EP_PF0;
+
+       /* Check state of Event Pending (EP) bit */
+       fwsts = IXGBE_READ_REG(hw, GL_FWSTS);
+       return (fwsts & ep_bit_mask) ? true : false;
+}
+
+/**
+ * ixgbe_aci_get_event - get an event from ACI
+ * @hw: pointer to the HW struct
+ * @e: event information structure
+ * @pending: optional flag signaling that there are more pending events
+ *
+ * Obtain an event from ACI and return its content
+ * through 'e' using ACI command (0x0014).
+ * Provide information if there are more events
+ * to retrieve through 'pending'.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_get_event(struct ixgbe_hw *hw, struct ixgbe_aci_event *e,
+                       bool *pending)
+{
+       struct ixgbe_aci_desc desc;
+       s32 status;
+
+       if (!e || (!e->msg_buf && e->buf_len) || (e->msg_buf && !e->buf_len))
+               return IXGBE_ERR_PARAM;
+
+       ixgbe_acquire_lock(&hw->aci.lock);
+
+       /* Check if there are any events pending */
+       if (!ixgbe_aci_check_event_pending(hw)) {
+               status = IXGBE_ERR_ACI_NO_EVENTS;
+               goto aci_get_event_exit;
+       }
+
+       /* Obtain pending event */
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_get_fw_event);
+       status = ixgbe_aci_send_cmd_execute(hw, &desc, e->msg_buf, e->buf_len);
+       if (status)
+               goto aci_get_event_exit;
+
+       /* Returned 0x0014 opcode indicates that no event was obtained */
+       if (desc.opcode == IXGBE_CPU_TO_LE16(ixgbe_aci_opc_get_fw_event)) {
+               status = IXGBE_ERR_ACI_NO_EVENTS;
+               goto aci_get_event_exit;
+       }
+
+       /* Determine size of event data */
+       e->msg_len = MIN_T(u16, IXGBE_LE16_TO_CPU(desc.datalen), e->buf_len);
+       /* Write event descriptor to event info structure */
+       memcpy(&e->desc, &desc, sizeof(e->desc));
+
+       /* Check if there are any further events pending */
+       if (pending) {
+               *pending = ixgbe_aci_check_event_pending(hw);
+       }
+
+aci_get_event_exit:
+       ixgbe_release_lock(&hw->aci.lock);
+
+       return status;
+}
+
+/**
+ * ixgbe_fill_dflt_direct_cmd_desc - fill ACI descriptor with default values.
+ * @desc: pointer to the temp descriptor (non DMA mem)
+ * @opcode: the opcode can be used to decide which flags to turn off or on
+ *
+ * Helper function to fill the descriptor desc with default values
+ * and the provided opcode.
+ */
+void ixgbe_fill_dflt_direct_cmd_desc(struct ixgbe_aci_desc *desc, u16 opcode)
+{
+       /* zero out the desc */
+       memset(desc, 0, sizeof(*desc));
+       desc->opcode = IXGBE_CPU_TO_LE16(opcode);
+       desc->flags = IXGBE_CPU_TO_LE16(IXGBE_ACI_FLAG_SI);
+}
+
+/**
+ * ixgbe_aci_req_res - request a common resource
+ * @hw: pointer to the HW struct
+ * @res: resource ID
+ * @access: access type
+ * @sdp_number: resource number
+ * @timeout: the maximum time in ms that the driver may hold the resource
+ *
+ * Requests a common resource using the ACI command (0x0008).
+ * Specifies the maximum time the driver may hold the resource.
+ * If the requested resource is currently occupied by some other driver,
+ * a busy return value is returned and the timeout field value indicates the
+ * maximum time the current owner has to free it.
+ *
+ * Return: the exit code of the operation.
+ */
+static s32
+ixgbe_aci_req_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res,
+                 enum ixgbe_aci_res_access_type access, u8 sdp_number,
+                 u32 *timeout)
+{
+       struct ixgbe_aci_cmd_req_res *cmd_resp;
+       struct ixgbe_aci_desc desc;
+       s32 status;
+
+       cmd_resp = &desc.params.res_owner;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_req_res);
+
+       cmd_resp->res_id = IXGBE_CPU_TO_LE16(res);
+       cmd_resp->access_type = IXGBE_CPU_TO_LE16(access);
+       cmd_resp->res_number = IXGBE_CPU_TO_LE32(sdp_number);
+       cmd_resp->timeout = IXGBE_CPU_TO_LE32(*timeout);
+       *timeout = 0;
+
+       status = ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+
+       /* The completion specifies the maximum time in ms that the driver
+        * may hold the resource in the Timeout field.
+        */
+
+       /* If the resource is held by some other driver, the command completes
+        * with a busy return value and the timeout field indicates the maximum
+        * time the current owner of the resource has to free it.
+        */
+       if (!status || hw->aci.last_status == IXGBE_ACI_RC_EBUSY)
+               *timeout = IXGBE_LE32_TO_CPU(cmd_resp->timeout);
+
+       return status;
+}
+
+/**
+ * ixgbe_aci_release_res - release a common resource using ACI
+ * @hw: pointer to the HW struct
+ * @res: resource ID
+ * @sdp_number: resource number
+ *
+ * Release a common resource using ACI command (0x0009).
+ *
+ * Return: the exit code of the operation.
+ */
+static s32
+ixgbe_aci_release_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res,
+                     u8 sdp_number)
+{
+       struct ixgbe_aci_cmd_req_res *cmd;
+       struct ixgbe_aci_desc desc;
+
+       cmd = &desc.params.res_owner;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_release_res);
+
+       cmd->res_id = IXGBE_CPU_TO_LE16(res);
+       cmd->res_number = IXGBE_CPU_TO_LE32(sdp_number);
+
+       return ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+}
+
+/**
+ * ixgbe_acquire_res - acquire the ownership of a resource
+ * @hw: pointer to the HW structure
+ * @res: resource ID
+ * @access: access type (read or write)
+ * @timeout: timeout in milliseconds
+ *
+ * Make an attempt to acquire the ownership of a resource using
+ * the ixgbe_aci_req_res to utilize ACI.
+ * In case if some other driver has previously acquired the resource and
+ * performed any necessary updates, the IXGBE_ERR_ACI_NO_WORK is returned,
+ * and the caller does not obtain the resource and has no further work to do.
+ * If needed, the function will poll until the current lock owner timeouts.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_acquire_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res,
+                     enum ixgbe_aci_res_access_type access, u32 timeout)
+{
+#define IXGBE_RES_POLLING_DELAY_MS     10
+       u32 delay = IXGBE_RES_POLLING_DELAY_MS;
+       u32 res_timeout = timeout;
+       u32 retry_timeout = 0;
+       s32 status;
+
+       status = ixgbe_aci_req_res(hw, res, access, 0, &res_timeout);
+
+       /* A return code of IXGBE_ERR_ACI_NO_WORK means that another driver has
+        * previously acquired the resource and performed any necessary updates;
+        * in this case the caller does not obtain the resource and has no
+        * further work to do.
+        */
+       if (status == IXGBE_ERR_ACI_NO_WORK)
+               goto ixgbe_acquire_res_exit;
+
+       /* If necessary, poll until the current lock owner timeouts.
+        * Set retry_timeout to the timeout value reported by the FW in the
+        * response to the "Request Resource Ownership" (0x0008) Admin Command
+        * as it indicates the maximum time the current owner of the resource
+        * is allowed to hold it.
+        */
+       retry_timeout = res_timeout;
+       while (status && retry_timeout && res_timeout) {
+               msec_delay(delay);
+               retry_timeout = (retry_timeout > delay) ?
+                       retry_timeout - delay : 0;
+               status = ixgbe_aci_req_res(hw, res, access, 0, &res_timeout);
+
+               if (status == IXGBE_ERR_ACI_NO_WORK)
+                       /* lock free, but no work to do */
+                       break;
+
+               if (!status)
+                       /* lock acquired */
+                       break;
+       }
+
+ixgbe_acquire_res_exit:
+       return status;
+}
+
+/**
+ * ixgbe_release_res - release a common resource
+ * @hw: pointer to the HW structure
+ * @res: resource ID
+ *
+ * Release a common resource using ixgbe_aci_release_res.
+ */
+void ixgbe_release_res(struct ixgbe_hw *hw, enum ixgbe_aci_res_ids res)
+{
+       u32 total_delay = 0;
+       s32 status;
+
+       status = ixgbe_aci_release_res(hw, res, 0);
+
+       /* There are some rare cases when trying to release the resource
+        * results in an admin command timeout, so handle them correctly.
+        */
+       while ((status == IXGBE_ERR_ACI_TIMEOUT) &&
+              (total_delay < IXGBE_ACI_RELEASE_RES_TIMEOUT)) {
+               msec_delay(1);
+               status = ixgbe_aci_release_res(hw, res, 0);
+               total_delay++;
+       }
+}
diff --git a/drivers/net/ixgbe/base/ixgbe_e610.h 
b/drivers/net/ixgbe/base/ixgbe_e610.h
new file mode 100644
index 0000000000..aeaa75af37
--- /dev/null
+++ b/drivers/net/ixgbe/base/ixgbe_e610.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#ifndef _IXGBE_E610_H_
+#define _IXGBE_E610_H_
+
+#include "ixgbe_type.h"
+
+void ixgbe_init_aci(struct ixgbe_hw *hw);
+void ixgbe_shutdown_aci(struct ixgbe_hw *hw);
+
+s32 ixgbe_aci_send_cmd(struct ixgbe_hw *hw, struct ixgbe_aci_desc *desc,
+                      void *buf, u16 buf_size);
+bool ixgbe_aci_check_event_pending(struct ixgbe_hw *hw);
+s32 ixgbe_aci_get_event(struct ixgbe_hw *hw, struct ixgbe_aci_event *e,
+                       bool *pending);
+
+void ixgbe_fill_dflt_direct_cmd_desc(struct ixgbe_aci_desc *desc, u16 opcode);
+
+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);
+
+#endif /* _IXGBE_E610_H_ */
diff --git a/drivers/net/ixgbe/base/ixgbe_osdep.c 
b/drivers/net/ixgbe/base/ixgbe_osdep.c
new file mode 100644
index 0000000000..d3d7e8e116
--- /dev/null
+++ b/drivers/net/ixgbe/base/ixgbe_osdep.c
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#include <stdlib.h>
+
+#include <rte_common.h>
+
+#include "ixgbe_osdep.h"
+
+void *
+ixgbe_calloc(struct ixgbe_hw __rte_unused *hw, size_t count, size_t size)
+{
+       return malloc(count * size);
+}
+
+void *
+ixgbe_malloc(struct ixgbe_hw __rte_unused *hw, size_t size)
+{
+       return malloc(size);
+}
+
+void
+ixgbe_free(struct ixgbe_hw __rte_unused *hw, void *addr)
+{
+       free(addr);
+}
+
+void ixgbe_init_lock(struct ixgbe_lock *lock)
+{
+       pthread_mutex_init(&lock->mutex, NULL);
+}
+
+void ixgbe_destroy_lock(struct ixgbe_lock *lock)
+{
+       pthread_mutex_destroy(&lock->mutex);
+}
+
+void ixgbe_acquire_lock(struct ixgbe_lock *lock)
+{
+       pthread_mutex_lock(&lock->mutex);
+}
+
+void ixgbe_release_lock(struct ixgbe_lock *lock)
+{
+       pthread_mutex_unlock(&lock->mutex);
+}
diff --git a/drivers/net/ixgbe/base/ixgbe_osdep.h 
b/drivers/net/ixgbe/base/ixgbe_osdep.h
index 6c25f608b1..b3266a3c77 100644
--- a/drivers/net/ixgbe/base/ixgbe_osdep.h
+++ b/drivers/net/ixgbe/base/ixgbe_osdep.h
@@ -1,10 +1,11 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2001-2020 Intel Corporation
+ * Copyright(c) 2001-2024 Intel Corporation
  */
 
 #ifndef _IXGBE_OS_H_
 #define _IXGBE_OS_H_
 
+#include <pthread.h>
 #include <string.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -79,6 +80,7 @@ enum {
 #define IXGBE_NTOHS(_i)        rte_be_to_cpu_16(_i)
 #define IXGBE_CPU_TO_LE16(_i)  rte_cpu_to_le_16(_i)
 #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_LE32_TO_CPUS(_i) rte_le_to_cpu_32(_i)
 #define IXGBE_CPU_TO_BE16(_i)  rte_cpu_to_be_16(_i)
@@ -152,4 +154,18 @@ do {                                                       
                \
                rte_delay_ms(1);                                        \
 } while (0)
 
+struct ixgbe_hw;
+struct ixgbe_lock {
+       pthread_mutex_t mutex;
+};
+
+void *ixgbe_calloc(struct ixgbe_hw *hw, size_t count, size_t size);
+void *ixgbe_malloc(struct ixgbe_hw *hw, size_t size);
+void ixgbe_free(struct ixgbe_hw *hw, void *addr);
+
+void ixgbe_init_lock(struct ixgbe_lock *lock);
+void ixgbe_destroy_lock(struct ixgbe_lock *lock);
+void ixgbe_acquire_lock(struct ixgbe_lock *lock);
+void ixgbe_release_lock(struct ixgbe_lock *lock);
+
 #endif /* _IXGBE_OS_H_ */
diff --git a/drivers/net/ixgbe/base/ixgbe_type.h 
b/drivers/net/ixgbe/base/ixgbe_type.h
index 5db9e03b4d..fe7411541e 100644
--- a/drivers/net/ixgbe/base/ixgbe_type.h
+++ b/drivers/net/ixgbe/base/ixgbe_type.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2001-2020 Intel Corporation
+ * Copyright(c) 2001-2024 Intel Corporation
  */
 
 #ifndef _IXGBE_TYPE_H_
@@ -44,6 +44,7 @@
  */
 
 #include "ixgbe_osdep.h"
+#include "ixgbe_type_e610.h"
 
 /* Override this by setting IOMEM in your ixgbe_osdep.h header */
 
@@ -124,6 +125,11 @@
 #define IXGBE_DEV_ID_X550EM_A_VF_HV            0x15B4
 #define IXGBE_DEV_ID_X550EM_X_VF               0x15A8
 #define IXGBE_DEV_ID_X550EM_X_VF_HV            0x15A9
+#define IXGBE_DEV_ID_E610_BACKPLANE            0x57AE
+#define IXGBE_DEV_ID_E610_SFP                  0x57AF
+#define IXGBE_DEV_ID_E610_10G_T                        0x57B0
+#define IXGBE_DEV_ID_E610_2_5G_T               0x57B1
+#define IXGBE_DEV_ID_E610_SGMII                        0x57B2
 
 #define IXGBE_CAT(r, m) IXGBE_##r##m
 
@@ -1887,6 +1893,7 @@ enum {
 #define IXGBE_EICR_MAILBOX     0x00080000 /* VF to PF Mailbox Interrupt */
 #define IXGBE_EICR_LSC         0x00100000 /* Link Status Change */
 #define IXGBE_EICR_LINKSEC     0x00200000 /* PN Threshold */
+#define IXGBE_EICR_FW_EVENT    0x00200000 /* Async FW event */
 #define IXGBE_EICR_MNG         0x00400000 /* Manageability Event Interrupt */
 #define IXGBE_EICR_TS          0x00800000 /* Thermal Sensor Event */
 #define IXGBE_EICR_TIMESYNC    0x01000000 /* Timesync Event */
@@ -1922,6 +1929,7 @@ enum {
 #define IXGBE_EICS_PCI         IXGBE_EICR_PCI /* PCI Exception */
 #define IXGBE_EICS_MAILBOX     IXGBE_EICR_MAILBOX   /* VF to PF Mailbox Int */
 #define IXGBE_EICS_LSC         IXGBE_EICR_LSC /* Link Status Change */
+#define IXGBE_EICS_FW_EVENT    IXGBE_EICR_FW_EVENT /* Async FW event */
 #define IXGBE_EICS_MNG         IXGBE_EICR_MNG /* MNG Event Interrupt */
 #define IXGBE_EICS_TIMESYNC    IXGBE_EICR_TIMESYNC /* Timesync Event */
 #define IXGBE_EICS_GPI_SDP0    IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */
@@ -1943,6 +1951,7 @@ enum {
 #define IXGBE_EIMS_PCI         IXGBE_EICR_PCI /* PCI Exception */
 #define IXGBE_EIMS_MAILBOX     IXGBE_EICR_MAILBOX   /* VF to PF Mailbox Int */
 #define IXGBE_EIMS_LSC         IXGBE_EICR_LSC /* Link Status Change */
+#define IXGBE_EIMS_FW_EVENT    IXGBE_EICR_FW_EVENT /* Async FW event */
 #define IXGBE_EIMS_MNG         IXGBE_EICR_MNG /* MNG Event Interrupt */
 #define IXGBE_EIMS_TS          IXGBE_EICR_TS /* Thermal Sensor Event */
 #define IXGBE_EIMS_TIMESYNC    IXGBE_EICR_TIMESYNC /* Timesync Event */
@@ -1965,6 +1974,7 @@ enum {
 #define IXGBE_EIMC_PCI         IXGBE_EICR_PCI /* PCI Exception */
 #define IXGBE_EIMC_MAILBOX     IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */
 #define IXGBE_EIMC_LSC         IXGBE_EICR_LSC /* Link Status Change */
+#define IXGBE_EIMC_FW_EVENT    IXGBE_EICR_FW_EVENT /* Async FW event */
 #define IXGBE_EIMC_MNG         IXGBE_EICR_MNG /* MNG Event Interrupt */
 #define IXGBE_EIMC_TIMESYNC    IXGBE_EICR_TIMESYNC /* Timesync Event */
 #define IXGBE_EIMC_GPI_SDP0    IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */
@@ -2372,6 +2382,7 @@ enum {
 #define IXGBE_82599_SERIAL_NUMBER_MAC_ADDR     0x11
 #define IXGBE_X550_SERIAL_NUMBER_MAC_ADDR      0x04
 
+#define IXGBE_PCIE_MSIX_E610_CAPS              0xB2
 #define IXGBE_PCIE_MSIX_82599_CAPS     0x72
 #define IXGBE_MAX_MSIX_VECTORS_82599   0x40
 #define IXGBE_PCIE_MSIX_82598_CAPS     0x62
@@ -2489,6 +2500,7 @@ enum {
 #define IXGBE_PCI_DEVICE_STATUS                0xAA
 #define IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING    0x0020
 #define IXGBE_PCI_LINK_STATUS          0xB2
+#define IXGBE_PCI_LINK_STATUS_E610     0x82
 #define IXGBE_PCI_DEVICE_CONTROL2      0xC8
 #define IXGBE_PCI_LINK_WIDTH           0x3F0
 #define IXGBE_PCI_LINK_WIDTH_1         0x10
@@ -2626,6 +2638,7 @@ enum {
 #define IXGBE_RXMTRL_V2_MGMT_MSG       0x0D00
 
 #define IXGBE_FCTRL_SBP                0x00000002 /* Store Bad Packet */
+#define IXGBE_FCTRL_TPE                0x00000080 /* Tag Promiscuous Ena*/
 #define IXGBE_FCTRL_MPE                0x00000100 /* Multicast Promiscuous 
Ena*/
 #define IXGBE_FCTRL_UPE                0x00000200 /* Unicast Promiscuous Ena */
 #define IXGBE_FCTRL_BAM                0x00000400 /* Broadcast Accept Mode */
@@ -2693,6 +2706,7 @@ enum {
 /* Multiple Transmit Queue Command Register */
 #define IXGBE_MTQC_RT_ENA      0x1 /* DCB Enable */
 #define IXGBE_MTQC_VT_ENA      0x2 /* VMDQ2 Enable */
+#define IXGBE_MTQC_NUM_TC_OR_Q  0xC /* Numer of TCs or TxQs per pool */
 #define IXGBE_MTQC_64Q_1PB     0x0 /* 64 queues 1 pack buffer */
 #define IXGBE_MTQC_32VF                0x8 /* 4 TX Queues per pool w/32VF's */
 #define IXGBE_MTQC_64VF                0x4 /* 2 TX Queues per pool w/64VF's */
@@ -3660,6 +3674,7 @@ enum ixgbe_mac_type {
        ixgbe_mac_X550_vf,
        ixgbe_mac_X550EM_x_vf,
        ixgbe_mac_X550EM_a_vf,
+       ixgbe_mac_E610,
        ixgbe_num_macs
 };
 
@@ -3738,7 +3753,9 @@ enum ixgbe_media_type {
        ixgbe_media_type_copper,
        ixgbe_media_type_backplane,
        ixgbe_media_type_cx4,
-       ixgbe_media_type_virtual
+       ixgbe_media_type_virtual,
+       ixgbe_media_type_da,
+       ixgbe_media_type_aui
 };
 
 /* Flow Control Settings */
@@ -3747,6 +3764,8 @@ enum ixgbe_fc_mode {
        ixgbe_fc_rx_pause,
        ixgbe_fc_tx_pause,
        ixgbe_fc_full,
+       ixgbe_fc_auto,
+       ixgbe_fc_pfc,
        ixgbe_fc_default
 };
 
@@ -4073,6 +4092,9 @@ struct ixgbe_link_operations {
 struct ixgbe_link_info {
        struct ixgbe_link_operations ops;
        u8 addr;
+       struct ixgbe_link_status link_info;
+       struct ixgbe_link_status link_info_old;
+       u8 get_link_info;
 };
 
 struct ixgbe_eeprom_info {
@@ -4144,6 +4166,9 @@ struct ixgbe_phy_info {
        bool reset_if_overtemp;
        bool qsfp_shared_i2c_bus;
        u32 nw_mng_if_sel;
+       u64 phy_type_low;
+       u64 phy_type_high;
+       struct ixgbe_aci_cmd_set_phy_cfg_data curr_user_phy_cfg;
 };
 
 #include "ixgbe_mbx.h"
@@ -4172,6 +4197,19 @@ struct ixgbe_hw {
        bool wol_enabled;
        bool need_crosstalk_fix;
        u32 fw_rst_cnt;
+       u8 api_branch;
+       u8 api_maj_ver;
+       u8 api_min_ver;
+       u8 api_patch;
+       u8 fw_branch;
+       u8 fw_maj_ver;
+       u8 fw_min_ver;
+       u8 fw_patch;
+       u32 fw_build;
+       struct ixgbe_aci_info aci;
+       struct ixgbe_flash_info flash;
+       struct ixgbe_hw_dev_caps dev_caps;
+       struct ixgbe_hw_func_caps func_caps;
 };
 
 #define ixgbe_call_func(hw, func, params, error) \
@@ -4221,6 +4259,23 @@ struct ixgbe_hw {
 #define IXGBE_ERR_MBX                          -41
 #define IXGBE_ERR_MBX_NOMSG                    -42
 #define IXGBE_ERR_TIMEOUT                      -43
+#define IXGBE_ERR_NOT_SUPPORTED                        -45
+#define IXGBE_ERR_OUT_OF_RANGE                 -46
+
+#define IXGBE_ERR_NVM                          -50
+#define IXGBE_ERR_NVM_CHECKSUM                 -51
+#define IXGBE_ERR_BUF_TOO_SHORT                        -52
+#define IXGBE_ERR_NVM_BLANK_MODE               -53
+#define IXGBE_ERR_INVAL_SIZE                   -54
+#define IXGBE_ERR_DOES_NOT_EXIST               -55
+
+#define IXGBE_ERR_ACI_ERROR                    -100
+#define IXGBE_ERR_ACI_DISABLED                 -101
+#define IXGBE_ERR_ACI_TIMEOUT                  -102
+#define IXGBE_ERR_ACI_BUSY                     -103
+#define IXGBE_ERR_ACI_NO_WORK                  -104
+#define IXGBE_ERR_ACI_NO_EVENTS                        -105
+#define IXGBE_ERR_FW_API_VER                   -106
 
 #define IXGBE_NOT_IMPLEMENTED                  0x7FFFFFFF
 
diff --git a/drivers/net/ixgbe/base/ixgbe_type_e610.h 
b/drivers/net/ixgbe/base/ixgbe_type_e610.h
new file mode 100644
index 0000000000..a50603d1b7
--- /dev/null
+++ b/drivers/net/ixgbe/base/ixgbe_type_e610.h
@@ -0,0 +1,1682 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#ifndef _IXGBE_TYPE_E610_H_
+#define _IXGBE_TYPE_E610_H_
+
+/* Little Endian defines */
+#ifndef __le16
+#define __le16  u16
+#endif
+#ifndef __le32
+#define __le32  u32
+#endif
+#ifndef __le64
+#define __le64  u64
+#endif
+
+/* Generic defines */
+#ifndef BIT
+#define BIT(a) (1UL << (a))
+#endif /* !BIT */
+#ifndef BIT_ULL
+#define BIT_ULL(a) (1ULL << (a))
+#endif /* !BIT_ULL */
+#ifndef BITS_PER_BYTE
+#define BITS_PER_BYTE  8
+#endif /* !BITS_PER_BYTE */
+#ifndef DIVIDE_AND_ROUND_UP
+#define DIVIDE_AND_ROUND_UP(a, b) (((a) + (b) - 1) / (b))
+#endif /* !DIVIDE_AND_ROUND_UP */
+
+#ifndef ROUND_UP
+/**
+ * ROUND_UP - round up to next arbitrary multiple (not a power of 2)
+ * @a: value to round up
+ * @b: arbitrary multiple
+ *
+ * Round up to the next multiple of the arbitrary b.
+ */
+#define ROUND_UP(a, b) ((b) * DIVIDE_AND_ROUND_UP((a), (b)))
+#endif /* !ROUND_UP */
+
+#define MAKEMASK(mask, shift) (mask << shift)
+
+#define BYTES_PER_WORD 2
+#define BYTES_PER_DWORD        4
+
+#ifndef BITS_PER_LONG
+#define BITS_PER_LONG          64
+#endif /* !BITS_PER_LONG */
+#ifndef BITS_PER_LONG_LONG
+#define BITS_PER_LONG_LONG     64
+#endif /* !BITS_PER_LONG_LONG */
+#undef GENMASK
+#define GENMASK(h, l) \
+       (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
+#undef GENMASK_ULL
+#define GENMASK_ULL(h, l) \
+       (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
+
+/* Data type manipulation macros. */
+#define HI_DWORD(x)    ((u32)((((x) >> 16) >> 16) & 0xFFFFFFFF))
+#define LO_DWORD(x)    ((u32)((x) & 0xFFFFFFFF))
+#define HI_WORD(x)     ((u16)(((x) >> 16) & 0xFFFF))
+#define LO_WORD(x)     ((u16)((x) & 0xFFFF))
+#define HI_BYTE(x)     ((u8)(((x) >> 8) & 0xFF))
+#define LO_BYTE(x)     ((u8)((x) & 0xFF))
+
+#define MIN_T(_t, _a, _b)      min((_t)(_a), (_t)(_b))
+
+#define IS_ASCII(_ch)  ((_ch) < 0x80)
+
+#define STRUCT_HACK_VAR_LEN
+/**
+ * ixgbe_struct_size - size of struct with C99 flexible array member
+ * @ptr: pointer to structure
+ * @field: flexible array member (last member of the structure)
+ * @num: number of elements of that flexible array member
+ */
+#define ixgbe_struct_size(ptr, field, num) \
+       (sizeof(*(ptr)) + sizeof(*(ptr)->field) * (num))
+
+/* General E610 defines */
+#define IXGBE_MAX_VSI                  768
+
+/* Checksum and Shadow RAM pointers */
+#define E610_SR_SW_CHECKSUM_WORD               0x3F
+
+/* General registers */
+
+/* Firmware Status Register (GL_FWSTS) */
+#define GL_FWSTS                               0x00083048 /* Reset Source: POR 
*/
+#define GL_FWSTS_FWS0B_S                       0
+#define GL_FWSTS_FWS0B_M                       MAKEMASK(0xFF, 0)
+#define GL_FWSTS_FWROWD_S                      8
+#define GL_FWSTS_FWROWD_M                      BIT(8)
+#define GL_FWSTS_FWRI_S                                9
+#define GL_FWSTS_FWRI_M                                BIT(9)
+#define GL_FWSTS_FWS1B_S                       16
+#define GL_FWSTS_FWS1B_M                       MAKEMASK(0xFF, 16)
+#define GL_FWSTS_EP_PF0                                BIT(24)
+#define GL_FWSTS_EP_PF1                                BIT(25)
+
+/* Recovery mode values of Firmware Status 1 Byte (FWS1B) bitfield */
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_CORER_LEGACY  0x0B
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_GLOBR_LEGACY  0x0C
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_CORER         0x30
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_GLOBR         0x31
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_TRANSITION    0x32
+#define GL_FWSTS_FWS1B_RECOVERY_MODE_NVM           0x33
+
+/* Firmware Status (GL_MNG_FWSM) */
+#define GL_MNG_FWSM                            0x000B6134 /* Reset Source: POR 
*/
+#define GL_MNG_FWSM_FW_MODES_S                 0
+#define GL_MNG_FWSM_FW_MODES_M                 MAKEMASK(0x7, 0)
+#define GL_MNG_FWSM_RSV0_S                     2
+#define GL_MNG_FWSM_RSV0_M                     MAKEMASK(0xFF, 2)
+#define GL_MNG_FWSM_EEP_RELOAD_IND_S           10
+#define GL_MNG_FWSM_EEP_RELOAD_IND_M           BIT(10)
+#define GL_MNG_FWSM_RSV1_S                     11
+#define GL_MNG_FWSM_RSV1_M                     MAKEMASK(0xF, 11)
+#define GL_MNG_FWSM_RSV2_S                     15
+#define GL_MNG_FWSM_RSV2_M                     BIT(15)
+#define GL_MNG_FWSM_PCIR_AL_FAILURE_S          16
+#define GL_MNG_FWSM_PCIR_AL_FAILURE_M          BIT(16)
+#define GL_MNG_FWSM_POR_AL_FAILURE_S           17
+#define GL_MNG_FWSM_POR_AL_FAILURE_M           BIT(17)
+#define GL_MNG_FWSM_RSV3_S                     18
+#define GL_MNG_FWSM_RSV3_M                     BIT(18)
+#define GL_MNG_FWSM_EXT_ERR_IND_S              19
+#define GL_MNG_FWSM_EXT_ERR_IND_M              MAKEMASK(0x3F, 19)
+#define GL_MNG_FWSM_RSV4_S                     25
+#define GL_MNG_FWSM_RSV4_M                     BIT(25)
+#define GL_MNG_FWSM_RESERVED_11_S              26
+#define GL_MNG_FWSM_RESERVED_11_M              MAKEMASK(0xF, 26)
+#define GL_MNG_FWSM_RSV5_S                     30
+#define GL_MNG_FWSM_RSV5_M                     MAKEMASK(0x3, 30)
+
+/* Flash Access Register */
+#define GLNVM_FLA                              0x000B6108 /* Reset Source: POR 
*/
+#define GLNVM_FLA_LOCKED_S                     6
+#define GLNVM_FLA_LOCKED_M                     BIT(6)
+
+/* Admin Command Interface (ACI) registers */
+#define PF_HIDA(_i)                    (0x00085000 + ((_i) * 4))
+#define PF_HIDA_2(_i)                  (0x00085020 + ((_i) * 4))
+#define PF_HIBA(_i)                    (0x00084000 + ((_i) * 4))
+#define PF_HICR                                0x00082048
+
+#define PF_HICR_EN                     BIT(0)
+#define PF_HICR_C                      BIT(1)
+#define PF_HICR_SV                     BIT(2)
+#define PF_HICR_EV                     BIT(3)
+
+#define IXGBE_ACI_DESC_SIZE            32
+#define IXGBE_ACI_DESC_SIZE_IN_DWORDS  IXGBE_ACI_DESC_SIZE / BYTES_PER_DWORD
+
+#define IXGBE_ACI_MAX_BUFFER_SIZE              4096    /* Size in bytes */
+#define IXGBE_ACI_DESC_COOKIE_L_DWORD_OFFSET   3
+#define IXGBE_ACI_SEND_DELAY_TIME_MS           10
+#define IXGBE_ACI_SEND_MAX_EXECUTE             3
+/* [ms] timeout of waiting for sync response */
+#define IXGBE_ACI_SYNC_RESPONSE_TIMEOUT                100000
+/* [ms] timeout of waiting for async response */
+#define IXGBE_ACI_ASYNC_RESPONSE_TIMEOUT       150000
+/* [ms] timeout of waiting for resource release */
+#define IXGBE_ACI_RELEASE_RES_TIMEOUT          10000
+
+/* FW defined boundary for a large buffer, 4k >= Large buffer > 512 bytes */
+#define IXGBE_ACI_LG_BUF               512
+
+/* Flags sub-structure
+ * |0  |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 |11 |12 |13 |14 |15 |
+ * |DD |CMP|ERR|VFE| * *  RESERVED * * |LB |RD |VFC|BUF|SI |EI |FE |
+ */
+
+/* command flags and offsets */
+#define IXGBE_ACI_FLAG_DD_S    0
+#define IXGBE_ACI_FLAG_CMP_S   1
+#define IXGBE_ACI_FLAG_ERR_S   2
+#define IXGBE_ACI_FLAG_VFE_S   3
+#define IXGBE_ACI_FLAG_LB_S    9
+#define IXGBE_ACI_FLAG_RD_S    10
+#define IXGBE_ACI_FLAG_VFC_S   11
+#define IXGBE_ACI_FLAG_BUF_S   12
+#define IXGBE_ACI_FLAG_SI_S    13
+#define IXGBE_ACI_FLAG_EI_S    14
+#define IXGBE_ACI_FLAG_FE_S    15
+
+#define IXGBE_ACI_FLAG_DD              BIT(IXGBE_ACI_FLAG_DD_S)  /* 0x1    */
+#define IXGBE_ACI_FLAG_CMP             BIT(IXGBE_ACI_FLAG_CMP_S) /* 0x2    */
+#define IXGBE_ACI_FLAG_ERR             BIT(IXGBE_ACI_FLAG_ERR_S) /* 0x4    */
+#define IXGBE_ACI_FLAG_VFE             BIT(IXGBE_ACI_FLAG_VFE_S) /* 0x8    */
+#define IXGBE_ACI_FLAG_LB              BIT(IXGBE_ACI_FLAG_LB_S)  /* 0x200  */
+#define IXGBE_ACI_FLAG_RD              BIT(IXGBE_ACI_FLAG_RD_S)  /* 0x400  */
+#define IXGBE_ACI_FLAG_VFC             BIT(IXGBE_ACI_FLAG_VFC_S) /* 0x800  */
+#define IXGBE_ACI_FLAG_BUF             BIT(IXGBE_ACI_FLAG_BUF_S) /* 0x1000 */
+#define IXGBE_ACI_FLAG_SI              BIT(IXGBE_ACI_FLAG_SI_S)  /* 0x2000 */
+#define IXGBE_ACI_FLAG_EI              BIT(IXGBE_ACI_FLAG_EI_S)  /* 0x4000 */
+#define IXGBE_ACI_FLAG_FE              BIT(IXGBE_ACI_FLAG_FE_S)  /* 0x8000 */
+
+/* Admin Command Interface (ACI) error codes */
+enum ixgbe_aci_err {
+       IXGBE_ACI_RC_OK                 = 0,  /* Success */
+       IXGBE_ACI_RC_EPERM              = 1,  /* Operation not permitted */
+       IXGBE_ACI_RC_ENOENT             = 2,  /* No such element */
+       IXGBE_ACI_RC_ESRCH              = 3,  /* Bad opcode */
+       IXGBE_ACI_RC_EINTR              = 4,  /* Operation interrupted */
+       IXGBE_ACI_RC_EIO                = 5,  /* I/O error */
+       IXGBE_ACI_RC_ENXIO              = 6,  /* No such resource */
+       IXGBE_ACI_RC_E2BIG              = 7,  /* Arg too long */
+       IXGBE_ACI_RC_EAGAIN             = 8,  /* Try again */
+       IXGBE_ACI_RC_ENOMEM             = 9,  /* Out of memory */
+       IXGBE_ACI_RC_EACCES             = 10, /* Permission denied */
+       IXGBE_ACI_RC_EFAULT             = 11, /* Bad address */
+       IXGBE_ACI_RC_EBUSY              = 12, /* Device or resource busy */
+       IXGBE_ACI_RC_EEXIST             = 13, /* Object already exists */
+       IXGBE_ACI_RC_EINVAL             = 14, /* Invalid argument */
+       IXGBE_ACI_RC_ENOTTY             = 15, /* Not a typewriter */
+       IXGBE_ACI_RC_ENOSPC             = 16, /* No space left or allocation 
failure */
+       IXGBE_ACI_RC_ENOSYS             = 17, /* Function not implemented */
+       IXGBE_ACI_RC_ERANGE             = 18, /* Parameter out of range */
+       IXGBE_ACI_RC_EFLUSHED           = 19, /* Cmd flushed due to prev cmd 
error */
+       IXGBE_ACI_RC_BAD_ADDR           = 20, /* Descriptor contains a bad 
pointer */
+       IXGBE_ACI_RC_EMODE              = 21, /* Op not allowed in current dev 
mode */
+       IXGBE_ACI_RC_EFBIG              = 22, /* File too big */
+       IXGBE_ACI_RC_ESBCOMP            = 23, /* SB-IOSF completion 
unsuccessful */
+       IXGBE_ACI_RC_ENOSEC             = 24, /* Missing security manifest */
+       IXGBE_ACI_RC_EBADSIG            = 25, /* Bad RSA signature */
+       IXGBE_ACI_RC_ESVN               = 26, /* SVN number prohibits this 
package */
+       IXGBE_ACI_RC_EBADMAN            = 27, /* Manifest hash mismatch */
+       IXGBE_ACI_RC_EBADBUF            = 28, /* Buffer hash mismatches 
manifest */
+       IXGBE_ACI_RC_EACCES_BMCU        = 29, /* BMC Update in progress */
+};
+
+/* Admin Command Interface (ACI) opcodes */
+enum ixgbe_aci_opc {
+       ixgbe_aci_opc_get_ver                           = 0x0001,
+       ixgbe_aci_opc_driver_ver                        = 0x0002,
+       ixgbe_aci_opc_get_exp_err                       = 0x0005,
+
+       /* resource ownership */
+       ixgbe_aci_opc_req_res                           = 0x0008,
+       ixgbe_aci_opc_release_res                       = 0x0009,
+
+       /* device/function capabilities */
+       ixgbe_aci_opc_list_func_caps                    = 0x000A,
+       ixgbe_aci_opc_list_dev_caps                     = 0x000B,
+
+       /* safe disable of RXEN */
+       ixgbe_aci_opc_disable_rxen                      = 0x000C,
+
+       /* FW events */
+       ixgbe_aci_opc_get_fw_event                      = 0x0014,
+
+       /* PHY commands */
+       ixgbe_aci_opc_get_phy_caps                      = 0x0600,
+       ixgbe_aci_opc_set_phy_cfg                       = 0x0601,
+       ixgbe_aci_opc_restart_an                        = 0x0605,
+       ixgbe_aci_opc_get_link_status                   = 0x0607,
+       ixgbe_aci_opc_set_event_mask                    = 0x0613,
+       ixgbe_aci_opc_get_link_topo                     = 0x06E0,
+       ixgbe_aci_opc_get_link_topo_pin                 = 0x06E1,
+       ixgbe_aci_opc_read_i2c                          = 0x06E2,
+       ixgbe_aci_opc_write_i2c                         = 0x06E3,
+       ixgbe_aci_opc_read_mdio                         = 0x06E4,
+       ixgbe_aci_opc_write_mdio                        = 0x06E5,
+       ixgbe_aci_opc_set_gpio_by_func                  = 0x06E6,
+       ixgbe_aci_opc_get_gpio_by_func                  = 0x06E7,
+       ixgbe_aci_opc_set_gpio                          = 0x06EC,
+       ixgbe_aci_opc_get_gpio                          = 0x06ED,
+       ixgbe_aci_opc_sff_eeprom                        = 0x06EE,
+       ixgbe_aci_opc_prog_topo_dev_nvm                 = 0x06F2,
+       ixgbe_aci_opc_read_topo_dev_nvm                 = 0x06F3,
+
+       /* NVM commands */
+       ixgbe_aci_opc_nvm_read                          = 0x0701,
+       ixgbe_aci_opc_nvm_erase                         = 0x0702,
+       ixgbe_aci_opc_nvm_write                         = 0x0703,
+       ixgbe_aci_opc_nvm_cfg_read                      = 0x0704,
+       ixgbe_aci_opc_nvm_cfg_write                     = 0x0705,
+       ixgbe_aci_opc_nvm_checksum                      = 0x0706,
+       ixgbe_aci_opc_nvm_write_activate                = 0x0707,
+       ixgbe_aci_opc_nvm_sr_dump                       = 0x0707,
+       ixgbe_aci_opc_nvm_save_factory_settings         = 0x0708,
+       ixgbe_aci_opc_nvm_update_empr                   = 0x0709,
+       ixgbe_aci_opc_nvm_pkg_data                      = 0x070A,
+       ixgbe_aci_opc_nvm_pass_component_tbl            = 0x070B,
+       ixgbe_aci_opc_nvm_sanitization                  = 0x070C,
+
+       /* Alternate Structure Commands */
+       ixgbe_aci_opc_write_alt_direct                  = 0x0900,
+       ixgbe_aci_opc_write_alt_indirect                = 0x0901,
+       ixgbe_aci_opc_read_alt_direct                   = 0x0902,
+       ixgbe_aci_opc_read_alt_indirect                 = 0x0903,
+       ixgbe_aci_opc_done_alt_write                    = 0x0904,
+       ixgbe_aci_opc_clear_port_alt_write              = 0x0906,
+
+       /* debug commands */
+       ixgbe_aci_opc_debug_dump_internals              = 0xFF08,
+
+       /* SystemDiagnostic commands */
+       ixgbe_aci_opc_set_health_status_config          = 0xFF20,
+       ixgbe_aci_opc_get_supported_health_status_codes = 0xFF21,
+       ixgbe_aci_opc_get_health_status                 = 0xFF22,
+       ixgbe_aci_opc_clear_health_status               = 0xFF23,
+
+};
+
+/* This macro is used to generate a compilation error if a structure
+ * is not exactly the correct length. It gives a divide by zero error if the
+ * structure is not of the correct size, otherwise it creates an enum that is
+ * never used.
+ */
+#define IXGBE_CHECK_STRUCT_LEN(n, X) enum ixgbe_static_assert_enum_##X \
+       { ixgbe_static_assert_##X = (n) / ((sizeof(struct X) == (n)) ? 1 : 0) }
+
+/* This macro is used to generate a compilation error if a variable-length
+ * structure is not exactly the correct length assuming a single element of
+ * the variable-length object as the last element of the structure. It gives
+ * a divide by zero error if the structure is not of the correct size,
+ * otherwise it creates an enum that is never used.
+ */
+#define IXGBE_CHECK_VAR_LEN_STRUCT_LEN(n, X, T) enum 
ixgbe_static_assert_enum_##X \
+       { ixgbe_static_assert_##X = (n) / \
+         (((sizeof(struct X) + sizeof(T)) == (n)) ? 1 : 0) }
+
+/* This macro is used to ensure that parameter structures (i.e. structures
+ * in the params union member of struct ixgbe_aci_desc) are 16 bytes in length.
+ *
+ * NOT intended to be used to check the size of an indirect command/response
+ * additional data buffer (e.g. struct foo) which should just happen to be 16
+ * bytes (instead, use IXGBE_CHECK_STRUCT_LEN(16, foo) for that).
+ */
+#define IXGBE_CHECK_PARAM_LEN(X)       IXGBE_CHECK_STRUCT_LEN(16, X)
+
+struct ixgbe_aci_cmd_generic {
+       __le32 param0;
+       __le32 param1;
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_generic);
+
+/* Get version (direct 0x0001) */
+struct ixgbe_aci_cmd_get_ver {
+       __le32 rom_ver;
+       __le32 fw_build;
+       u8 fw_branch;
+       u8 fw_major;
+       u8 fw_minor;
+       u8 fw_patch;
+       u8 api_branch;
+       u8 api_major;
+       u8 api_minor;
+       u8 api_patch;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_ver);
+
+#define IXGBE_DRV_VER_STR_LEN_E610     32
+
+struct ixgbe_driver_ver {
+       u8 major_ver;
+       u8 minor_ver;
+       u8 build_ver;
+       u8 subbuild_ver;
+       u8 driver_string[IXGBE_DRV_VER_STR_LEN_E610];
+};
+
+/* Send driver version (indirect 0x0002) */
+struct ixgbe_aci_cmd_driver_ver {
+       u8 major_ver;
+       u8 minor_ver;
+       u8 build_ver;
+       u8 subbuild_ver;
+       u8 reserved[4];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_driver_ver);
+
+/* Get Expanded Error Code (0x0005, direct) */
+struct ixgbe_aci_cmd_get_exp_err {
+       __le32 reason;
+#define IXGBE_ACI_EXPANDED_ERROR_NOT_PROVIDED  0xFFFFFFFF
+       __le32 identifier;
+       u8 rsvd[8];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_exp_err);
+
+/* FW update timeout definitions are in milliseconds */
+#define IXGBE_NVM_TIMEOUT              180000
+
+enum ixgbe_aci_res_access_type {
+       IXGBE_RES_READ = 1,
+       IXGBE_RES_WRITE
+};
+
+enum ixgbe_aci_res_ids {
+       IXGBE_NVM_RES_ID = 1,
+       IXGBE_SPD_RES_ID,
+       IXGBE_CHANGE_LOCK_RES_ID,
+       IXGBE_GLOBAL_CFG_LOCK_RES_ID
+};
+
+/* Request resource ownership (direct 0x0008)
+ * Release resource ownership (direct 0x0009)
+ */
+struct ixgbe_aci_cmd_req_res {
+       __le16 res_id;
+#define IXGBE_ACI_RES_ID_NVM           1
+#define IXGBE_ACI_RES_ID_SDP           2
+#define IXGBE_ACI_RES_ID_CHNG_LOCK     3
+#define IXGBE_ACI_RES_ID_GLBL_LOCK     4
+       __le16 access_type;
+#define IXGBE_ACI_RES_ACCESS_READ      1
+#define IXGBE_ACI_RES_ACCESS_WRITE     2
+
+       /* Upon successful completion, FW writes this value and driver is
+        * expected to release resource before timeout. This value is provided
+        * in milliseconds.
+        */
+       __le32 timeout;
+#define IXGBE_ACI_RES_NVM_READ_DFLT_TIMEOUT_MS 3000
+#define IXGBE_ACI_RES_NVM_WRITE_DFLT_TIMEOUT_MS        180000
+#define IXGBE_ACI_RES_CHNG_LOCK_DFLT_TIMEOUT_MS        1000
+#define IXGBE_ACI_RES_GLBL_LOCK_DFLT_TIMEOUT_MS        3000
+       /* For SDP: pin ID of the SDP */
+       __le32 res_number;
+       /* Status is only used for IXGBE_ACI_RES_ID_GLBL_LOCK */
+       __le16 status;
+#define IXGBE_ACI_RES_GLBL_SUCCESS             0
+#define IXGBE_ACI_RES_GLBL_IN_PROG             1
+#define IXGBE_ACI_RES_GLBL_DONE                        2
+       u8 reserved[2];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_req_res);
+
+/* Get function capabilities (indirect 0x000A)
+ * Get device capabilities (indirect 0x000B)
+ */
+struct ixgbe_aci_cmd_list_caps {
+       u8 cmd_flags;
+       u8 pf_index;
+       u8 reserved[2];
+       __le32 count;
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_list_caps);
+
+/* Device/Function buffer entry, repeated per reported capability */
+struct ixgbe_aci_cmd_list_caps_elem {
+       __le16 cap;
+#define IXGBE_ACI_CAPS_VALID_FUNCTIONS                 0x0005
+#define IXGBE_ACI_MAX_VALID_FUNCTIONS                  0x8
+#define IXGBE_ACI_CAPS_VMDQ                            0x0014
+#define IXGBE_ACI_CAPS_VSI                             0x0017
+#define IXGBE_ACI_CAPS_DCB                             0x0018
+#define IXGBE_ACI_CAPS_RSS                             0x0040
+#define IXGBE_ACI_CAPS_RXQS                            0x0041
+#define IXGBE_ACI_CAPS_TXQS                            0x0042
+#define IXGBE_ACI_CAPS_MSIX                            0x0043
+#define IXGBE_ACI_CAPS_FD                              0x0045
+#define IXGBE_ACI_CAPS_1588                            0x0046
+#define IXGBE_ACI_CAPS_MAX_MTU                         0x0047
+#define IXGBE_ACI_CAPS_NVM_VER                         0x0048
+#define IXGBE_ACI_CAPS_OROM_VER                                0x004A
+#define IXGBE_ACI_CAPS_INLINE_IPSEC                    0x0070
+#define IXGBE_ACI_CAPS_NUM_ENABLED_PORTS               0x0072
+#define IXGBE_ACI_CAPS_PCIE_RESET_AVOIDANCE            0x0076
+#define IXGBE_ACI_CAPS_POST_UPDATE_RESET_RESTRICT      0x0077
+#define IXGBE_ACI_CAPS_NVM_MGMT                                0x0080
+#define IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG0               0x0081
+#define IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG1               0x0082
+#define IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG2               0x0083
+#define IXGBE_ACI_CAPS_EXT_TOPO_DEV_IMG3               0x0084
+#define IXGBE_ACI_CAPS_NEXT_CLUSTER_ID                 0x0096
+       u8 major_ver;
+       u8 minor_ver;
+       /* Number of resources described by this capability */
+       __le32 number;
+       /* Only meaningful for some types of resources */
+       __le32 logical_id;
+       /* Only meaningful for some types of resources */
+       __le32 phys_id;
+       __le64 rsvd1;
+       __le64 rsvd2;
+};
+
+IXGBE_CHECK_STRUCT_LEN(32, ixgbe_aci_cmd_list_caps_elem);
+
+/* Disable RXEN (direct 0x000C) */
+struct ixgbe_aci_cmd_disable_rxen {
+       u8 lport_num;
+       u8 reserved[15];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_disable_rxen);
+
+/* Get FW Event (indirect 0x0014) */
+struct ixgbe_aci_cmd_get_fw_event {
+       __le16 fw_buf_status;
+#define IXGBE_ACI_GET_FW_EVENT_STATUS_OBTAINED BIT(0)
+#define IXGBE_ACI_GET_FW_EVENT_STATUS_PENDING  BIT(1)
+       u8 rsvd[14];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_fw_event);
+
+/* Get PHY capabilities (indirect 0x0600) */
+struct ixgbe_aci_cmd_get_phy_caps {
+       u8 lport_num;
+       u8 reserved;
+       __le16 param0;
+       /* 18.0 - Report qualified modules */
+#define IXGBE_ACI_GET_PHY_RQM          BIT(0)
+       /* 18.1 - 18.3 : Report mode
+        * 000b - Report topology capabilities, without media
+        * 001b - Report topology capabilities, with media
+        * 010b - Report Active configuration
+        * 011b - Report PHY Type and FEC mode capabilities
+        * 100b - Report Default capabilities
+        */
+#define IXGBE_ACI_REPORT_MODE_S                        1
+#define IXGBE_ACI_REPORT_MODE_M                        (7 << 
IXGBE_ACI_REPORT_MODE_S)
+#define IXGBE_ACI_REPORT_TOPO_CAP_NO_MEDIA     0
+#define IXGBE_ACI_REPORT_TOPO_CAP_MEDIA                BIT(1)
+#define IXGBE_ACI_REPORT_ACTIVE_CFG            BIT(2)
+#define IXGBE_ACI_REPORT_DFLT_CFG              BIT(3)
+       __le32 reserved1;
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_phy_caps);
+
+/* This is #define of PHY type (Extended):
+ * The first set of defines is for phy_type_low.
+ */
+#define IXGBE_PHY_TYPE_LOW_100BASE_TX          BIT_ULL(0)
+#define IXGBE_PHY_TYPE_LOW_100M_SGMII          BIT_ULL(1)
+#define IXGBE_PHY_TYPE_LOW_1000BASE_T          BIT_ULL(2)
+#define IXGBE_PHY_TYPE_LOW_1000BASE_SX         BIT_ULL(3)
+#define IXGBE_PHY_TYPE_LOW_1000BASE_LX         BIT_ULL(4)
+#define IXGBE_PHY_TYPE_LOW_1000BASE_KX         BIT_ULL(5)
+#define IXGBE_PHY_TYPE_LOW_1G_SGMII            BIT_ULL(6)
+#define IXGBE_PHY_TYPE_LOW_2500BASE_T          BIT_ULL(7)
+#define IXGBE_PHY_TYPE_LOW_2500BASE_X          BIT_ULL(8)
+#define IXGBE_PHY_TYPE_LOW_2500BASE_KX         BIT_ULL(9)
+#define IXGBE_PHY_TYPE_LOW_5GBASE_T            BIT_ULL(10)
+#define IXGBE_PHY_TYPE_LOW_5GBASE_KR           BIT_ULL(11)
+#define IXGBE_PHY_TYPE_LOW_10GBASE_T           BIT_ULL(12)
+#define IXGBE_PHY_TYPE_LOW_10G_SFI_DA          BIT_ULL(13)
+#define IXGBE_PHY_TYPE_LOW_10GBASE_SR          BIT_ULL(14)
+#define IXGBE_PHY_TYPE_LOW_10GBASE_LR          BIT_ULL(15)
+#define IXGBE_PHY_TYPE_LOW_10GBASE_KR_CR1      BIT_ULL(16)
+#define IXGBE_PHY_TYPE_LOW_10G_SFI_AOC_ACC     BIT_ULL(17)
+#define IXGBE_PHY_TYPE_LOW_10G_SFI_C2C         BIT_ULL(18)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_T           BIT_ULL(19)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_CR          BIT_ULL(20)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_CR_S                BIT_ULL(21)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_CR1         BIT_ULL(22)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_SR          BIT_ULL(23)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_LR          BIT_ULL(24)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_KR          BIT_ULL(25)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_KR_S                BIT_ULL(26)
+#define IXGBE_PHY_TYPE_LOW_25GBASE_KR1         BIT_ULL(27)
+#define IXGBE_PHY_TYPE_LOW_25G_AUI_AOC_ACC     BIT_ULL(28)
+#define IXGBE_PHY_TYPE_LOW_25G_AUI_C2C         BIT_ULL(29)
+#define IXGBE_PHY_TYPE_LOW_MAX_INDEX           29
+/* The second set of defines is for phy_type_high. */
+#define IXGBE_PHY_TYPE_HIGH_10BASE_T           BIT_ULL(1)
+#define IXGBE_PHY_TYPE_HIGH_10M_SGMII          BIT_ULL(2)
+#define IXGBE_PHY_TYPE_HIGH_2500M_SGMII                BIT_ULL(56)
+#define IXGBE_PHY_TYPE_HIGH_100M_USXGMII       BIT_ULL(57)
+#define IXGBE_PHY_TYPE_HIGH_1G_USXGMII         BIT_ULL(58)
+#define IXGBE_PHY_TYPE_HIGH_2500M_USXGMII      BIT_ULL(59)
+#define IXGBE_PHY_TYPE_HIGH_5G_USXGMII         BIT_ULL(60)
+#define IXGBE_PHY_TYPE_HIGH_10G_USXGMII                BIT_ULL(61)
+#define IXGBE_PHY_TYPE_HIGH_MAX_INDEX          61
+
+struct ixgbe_aci_cmd_get_phy_caps_data {
+       __le64 phy_type_low; /* Use values from IXGBE_PHY_TYPE_LOW_* */
+       __le64 phy_type_high; /* Use values from IXGBE_PHY_TYPE_HIGH_* */
+       u8 caps;
+#define IXGBE_ACI_PHY_EN_TX_LINK_PAUSE                 BIT(0)
+#define IXGBE_ACI_PHY_EN_RX_LINK_PAUSE                 BIT(1)
+#define IXGBE_ACI_PHY_LOW_POWER_MODE                   BIT(2)
+#define IXGBE_ACI_PHY_EN_LINK                          BIT(3)
+#define IXGBE_ACI_PHY_AN_MODE                          BIT(4)
+#define IXGBE_ACI_PHY_EN_MOD_QUAL                      BIT(5)
+#define IXGBE_ACI_PHY_EN_LESM                          BIT(6)
+#define IXGBE_ACI_PHY_EN_AUTO_FEC                      BIT(7)
+#define IXGBE_ACI_PHY_CAPS_MASK                                MAKEMASK(0xff, 
0)
+       u8 low_power_ctrl_an;
+#define IXGBE_ACI_PHY_EN_D3COLD_LOW_POWER_AUTONEG      BIT(0)
+#define IXGBE_ACI_PHY_AN_EN_CLAUSE28                   BIT(1)
+#define IXGBE_ACI_PHY_AN_EN_CLAUSE73                   BIT(2)
+#define IXGBE_ACI_PHY_AN_EN_CLAUSE37                   BIT(3)
+       __le16 eee_cap;
+#define IXGBE_ACI_PHY_EEE_EN_100BASE_TX                        BIT(0)
+#define IXGBE_ACI_PHY_EEE_EN_1000BASE_T                        BIT(1)
+#define IXGBE_ACI_PHY_EEE_EN_10GBASE_T                 BIT(2)
+#define IXGBE_ACI_PHY_EEE_EN_1000BASE_KX               BIT(3)
+#define IXGBE_ACI_PHY_EEE_EN_10GBASE_KR                        BIT(4)
+#define IXGBE_ACI_PHY_EEE_EN_25GBASE_KR                        BIT(5)
+#define IXGBE_ACI_PHY_EEE_EN_10BASE_T                  BIT(11)
+       __le16 eeer_value;
+       u8 phy_id_oui[4]; /* PHY/Module ID connected on the port */
+       u8 phy_fw_ver[8];
+       u8 link_fec_options;
+#define IXGBE_ACI_PHY_FEC_10G_KR_40G_KR4_EN            BIT(0)
+#define IXGBE_ACI_PHY_FEC_10G_KR_40G_KR4_REQ           BIT(1)
+#define IXGBE_ACI_PHY_FEC_25G_RS_528_REQ               BIT(2)
+#define IXGBE_ACI_PHY_FEC_25G_KR_REQ                   BIT(3)
+#define IXGBE_ACI_PHY_FEC_25G_RS_544_REQ               BIT(4)
+#define IXGBE_ACI_PHY_FEC_25G_RS_CLAUSE91_EN           BIT(6)
+#define IXGBE_ACI_PHY_FEC_25G_KR_CLAUSE74_EN           BIT(7)
+#define IXGBE_ACI_PHY_FEC_MASK                         MAKEMASK(0xdf, 0)
+       u8 module_compliance_enforcement;
+#define IXGBE_ACI_MOD_ENFORCE_STRICT_MODE              BIT(0)
+       u8 extended_compliance_code;
+#define IXGBE_ACI_MODULE_TYPE_TOTAL_BYTE               3
+       u8 module_type[IXGBE_ACI_MODULE_TYPE_TOTAL_BYTE];
+#define IXGBE_ACI_MOD_TYPE_BYTE0_SFP_PLUS              0xA0
+#define IXGBE_ACI_MOD_TYPE_BYTE0_QSFP_PLUS             0x80
+#define IXGBE_ACI_MOD_TYPE_IDENT                       1
+#define IXGBE_ACI_MOD_TYPE_BYTE1_SFP_PLUS_CU_PASSIVE   BIT(0)
+#define IXGBE_ACI_MOD_TYPE_BYTE1_SFP_PLUS_CU_ACTIVE    BIT(1)
+#define IXGBE_ACI_MOD_TYPE_BYTE1_10G_BASE_SR           BIT(4)
+#define IXGBE_ACI_MOD_TYPE_BYTE1_10G_BASE_LR           BIT(5)
+#define IXGBE_ACI_MOD_TYPE_BYTE1_10G_BASE_LRM          BIT(6)
+#define IXGBE_ACI_MOD_TYPE_BYTE1_10G_BASE_ER           BIT(7)
+#define IXGBE_ACI_MOD_TYPE_BYTE2_SFP_PLUS              0xA0
+#define IXGBE_ACI_MOD_TYPE_BYTE2_QSFP_PLUS             0x86
+       u8 qualified_module_count;
+       u8 rsvd2[7];    /* Bytes 47:41 reserved */
+#define IXGBE_ACI_QUAL_MOD_COUNT_MAX                   16
+       struct {
+               u8 v_oui[3];
+               u8 rsvd3;
+               u8 v_part[16];
+               __le32 v_rev;
+               __le64 rsvd4;
+       } qual_modules[IXGBE_ACI_QUAL_MOD_COUNT_MAX];
+};
+
+IXGBE_CHECK_STRUCT_LEN(560, ixgbe_aci_cmd_get_phy_caps_data);
+
+/* Set PHY capabilities (direct 0x0601)
+ * NOTE: This command must be followed by setup link and restart auto-neg
+ */
+struct ixgbe_aci_cmd_set_phy_cfg {
+       u8 reserved[8];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_set_phy_cfg);
+
+/* Set PHY config command data structure */
+struct ixgbe_aci_cmd_set_phy_cfg_data {
+       __le64 phy_type_low; /* Use values from IXGBE_PHY_TYPE_LOW_* */
+       __le64 phy_type_high; /* Use values from IXGBE_PHY_TYPE_HIGH_* */
+       u8 caps;
+#define IXGBE_ACI_PHY_ENA_VALID_MASK           MAKEMASK(0xef, 0)
+#define IXGBE_ACI_PHY_ENA_TX_PAUSE_ABILITY     BIT(0)
+#define IXGBE_ACI_PHY_ENA_RX_PAUSE_ABILITY     BIT(1)
+#define IXGBE_ACI_PHY_ENA_LOW_POWER            BIT(2)
+#define IXGBE_ACI_PHY_ENA_LINK                 BIT(3)
+#define IXGBE_ACI_PHY_ENA_AUTO_LINK_UPDT       BIT(5)
+#define IXGBE_ACI_PHY_ENA_LESM                 BIT(6)
+#define IXGBE_ACI_PHY_ENA_AUTO_FEC             BIT(7)
+       u8 low_power_ctrl_an;
+       __le16 eee_cap; /* Value from ixgbe_aci_get_phy_caps */
+       __le16 eeer_value; /* Use defines from ixgbe_aci_get_phy_caps */
+       u8 link_fec_opt; /* Use defines from ixgbe_aci_get_phy_caps */
+       u8 module_compliance_enforcement;
+};
+
+IXGBE_CHECK_STRUCT_LEN(24, ixgbe_aci_cmd_set_phy_cfg_data);
+
+/* Restart AN command data structure (direct 0x0605)
+ * Also used for response, with only the lport_num field present.
+ */
+struct ixgbe_aci_cmd_restart_an {
+       u8 reserved[2];
+       u8 cmd_flags;
+#define IXGBE_ACI_RESTART_AN_LINK_RESTART      BIT(1)
+#define IXGBE_ACI_RESTART_AN_LINK_ENABLE       BIT(2)
+       u8 reserved2[13];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_restart_an);
+
+#pragma pack(1)
+/* Get link status (indirect 0x0607), also used for Link Status Event */
+struct ixgbe_aci_cmd_get_link_status {
+       u8 reserved[2];
+       u8 cmd_flags;
+#define IXGBE_ACI_LSE_M                                0x3
+#define IXGBE_ACI_LSE_NOP                      0x0
+#define IXGBE_ACI_LSE_DIS                      0x2
+#define IXGBE_ACI_LSE_ENA                      0x3
+       /* only response uses this flag */
+#define IXGBE_ACI_LSE_IS_ENABLED               0x1
+       u8 reserved2[5];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_link_status);
+
+/* Get link status response data structure, also used for Link Status Event */
+struct ixgbe_aci_cmd_get_link_status_data {
+       u8 topo_media_conflict;
+#define IXGBE_ACI_LINK_TOPO_CONFLICT           BIT(0)
+#define IXGBE_ACI_LINK_MEDIA_CONFLICT          BIT(1)
+#define IXGBE_ACI_LINK_TOPO_CORRUPT            BIT(2)
+#define IXGBE_ACI_LINK_TOPO_UNREACH_PRT                BIT(4)
+#define IXGBE_ACI_LINK_TOPO_UNDRUTIL_PRT       BIT(5)
+#define IXGBE_ACI_LINK_TOPO_UNDRUTIL_MEDIA     BIT(6)
+#define IXGBE_ACI_LINK_TOPO_UNSUPP_MEDIA       BIT(7)
+       u8 link_cfg_err;
+#define IXGBE_ACI_LINK_CFG_ERR                         BIT(0)
+#define IXGBE_ACI_LINK_CFG_COMPLETED                   BIT(1)
+#define IXGBE_ACI_LINK_ACT_PORT_OPT_INVAL              BIT(2)
+#define IXGBE_ACI_LINK_FEAT_ID_OR_CONFIG_ID_INVAL      BIT(3)
+#define IXGBE_ACI_LINK_TOPO_CRITICAL_SDP_ERR           BIT(4)
+#define IXGBE_ACI_LINK_MODULE_POWER_UNSUPPORTED                BIT(5)
+#define IXGBE_ACI_LINK_EXTERNAL_PHY_LOAD_FAILURE       BIT(6)
+#define IXGBE_ACI_LINK_INVAL_MAX_POWER_LIMIT           BIT(7)
+       u8 link_info;
+#define IXGBE_ACI_LINK_UP              BIT(0)  /* Link Status */
+#define IXGBE_ACI_LINK_FAULT           BIT(1)
+#define IXGBE_ACI_LINK_FAULT_TX                BIT(2)
+#define IXGBE_ACI_LINK_FAULT_RX                BIT(3)
+#define IXGBE_ACI_LINK_FAULT_REMOTE    BIT(4)
+#define IXGBE_ACI_LINK_UP_PORT         BIT(5)  /* External Port Link Status */
+#define IXGBE_ACI_MEDIA_AVAILABLE      BIT(6)
+#define IXGBE_ACI_SIGNAL_DETECT                BIT(7)
+       u8 an_info;
+#define IXGBE_ACI_AN_COMPLETED         BIT(0)
+#define IXGBE_ACI_LP_AN_ABILITY                BIT(1)
+#define IXGBE_ACI_PD_FAULT             BIT(2)  /* Parallel Detection Fault */
+#define IXGBE_ACI_FEC_EN               BIT(3)
+#define IXGBE_ACI_PHY_LOW_POWER                BIT(4)  /* Low Power State */
+#define IXGBE_ACI_LINK_PAUSE_TX                BIT(5)
+#define IXGBE_ACI_LINK_PAUSE_RX                BIT(6)
+#define IXGBE_ACI_QUALIFIED_MODULE     BIT(7)
+       u8 ext_info;
+#define IXGBE_ACI_LINK_PHY_TEMP_ALARM  BIT(0)
+#define IXGBE_ACI_LINK_EXCESSIVE_ERRORS        BIT(1)  /* Excessive Link 
Errors */
+       /* Port Tx Suspended */
+#define IXGBE_ACI_LINK_TX_S            2
+#define IXGBE_ACI_LINK_TX_M            (0x03 << IXGBE_ACI_LINK_TX_S)
+#define IXGBE_ACI_LINK_TX_ACTIVE       0
+#define IXGBE_ACI_LINK_TX_DRAINED      1
+#define IXGBE_ACI_LINK_TX_FLUSHED      3
+       u8 lb_status;
+#define IXGBE_ACI_LINK_LB_PHY_LCL      BIT(0)
+#define IXGBE_ACI_LINK_LB_PHY_RMT      BIT(1)
+#define IXGBE_ACI_LINK_LB_MAC_LCL      BIT(2)
+#define IXGBE_ACI_LINK_LB_PHY_IDX_S    3
+#define IXGBE_ACI_LINK_LB_PHY_IDX_M    (0x7 << IXGBE_ACI_LB_PHY_IDX_S)
+       __le16 max_frame_size;
+       u8 cfg;
+#define IXGBE_ACI_LINK_25G_KR_FEC_EN           BIT(0)
+#define IXGBE_ACI_LINK_25G_RS_528_FEC_EN       BIT(1)
+#define IXGBE_ACI_LINK_25G_RS_544_FEC_EN       BIT(2)
+#define IXGBE_ACI_FEC_MASK                     MAKEMASK(0x7, 0)
+       /* Pacing Config */
+#define IXGBE_ACI_CFG_PACING_S         3
+#define IXGBE_ACI_CFG_PACING_M         (0xF << IXGBE_ACI_CFG_PACING_S)
+#define IXGBE_ACI_CFG_PACING_TYPE_M    BIT(7)
+#define IXGBE_ACI_CFG_PACING_TYPE_AVG  0
+#define IXGBE_ACI_CFG_PACING_TYPE_FIXED        IXGBE_ACI_CFG_PACING_TYPE_M
+       /* External Device Power Ability */
+       u8 power_desc;
+#define IXGBE_ACI_PWR_CLASS_M                  0x3F
+#define IXGBE_ACI_LINK_PWR_BASET_LOW_HIGH      0
+#define IXGBE_ACI_LINK_PWR_BASET_HIGH          1
+#define IXGBE_ACI_LINK_PWR_QSFP_CLASS_1                0
+#define IXGBE_ACI_LINK_PWR_QSFP_CLASS_2                1
+#define IXGBE_ACI_LINK_PWR_QSFP_CLASS_3                2
+#define IXGBE_ACI_LINK_PWR_QSFP_CLASS_4                3
+       __le16 link_speed;
+#define IXGBE_ACI_LINK_SPEED_M                 0x7FF
+#define IXGBE_ACI_LINK_SPEED_10MB              BIT(0)
+#define IXGBE_ACI_LINK_SPEED_100MB             BIT(1)
+#define IXGBE_ACI_LINK_SPEED_1000MB            BIT(2)
+#define IXGBE_ACI_LINK_SPEED_2500MB            BIT(3)
+#define IXGBE_ACI_LINK_SPEED_5GB               BIT(4)
+#define IXGBE_ACI_LINK_SPEED_10GB              BIT(5)
+#define IXGBE_ACI_LINK_SPEED_20GB              BIT(6)
+#define IXGBE_ACI_LINK_SPEED_25GB              BIT(7)
+#define IXGBE_ACI_LINK_SPEED_40GB              BIT(8)
+#define IXGBE_ACI_LINK_SPEED_50GB              BIT(9)
+#define IXGBE_ACI_LINK_SPEED_100GB             BIT(10)
+#define IXGBE_ACI_LINK_SPEED_200GB             BIT(11)
+#define IXGBE_ACI_LINK_SPEED_UNKNOWN           BIT(15)
+       __le16 reserved3; /* Aligns next field to 8-byte boundary */
+       u8 ext_fec_status;
+#define IXGBE_ACI_LINK_RS_272_FEC_EN   BIT(0) /* RS 272 FEC enabled */
+       u8 reserved4;
+       __le64 phy_type_low; /* Use values from IXGBE_PHY_TYPE_LOW_* */
+       __le64 phy_type_high; /* Use values from IXGBE_PHY_TYPE_HIGH_* */
+       /* Get link status version 2 link partner data */
+       __le64 lp_phy_type_low; /* Use values from IXGBE_PHY_TYPE_LOW_* */
+       __le64 lp_phy_type_high; /* Use values from IXGBE_PHY_TYPE_HIGH_* */
+       u8 lp_fec_adv;
+#define IXGBE_ACI_LINK_LP_10G_KR_FEC_CAP       BIT(0)
+#define IXGBE_ACI_LINK_LP_25G_KR_FEC_CAP       BIT(1)
+#define IXGBE_ACI_LINK_LP_RS_528_FEC_CAP       BIT(2)
+#define IXGBE_ACI_LINK_LP_50G_KR_272_FEC_CAP   BIT(3)
+#define IXGBE_ACI_LINK_LP_100G_KR_272_FEC_CAP  BIT(4)
+#define IXGBE_ACI_LINK_LP_200G_KR_272_FEC_CAP  BIT(5)
+       u8 lp_fec_req;
+#define IXGBE_ACI_LINK_LP_10G_KR_FEC_REQ       BIT(0)
+#define IXGBE_ACI_LINK_LP_25G_KR_FEC_REQ       BIT(1)
+#define IXGBE_ACI_LINK_LP_RS_528_FEC_REQ       BIT(2)
+#define IXGBE_ACI_LINK_LP_KR_272_FEC_REQ       BIT(3)
+       u8 lp_flowcontrol;
+#define IXGBE_ACI_LINK_LP_PAUSE_ADV            BIT(0)
+#define IXGBE_ACI_LINK_LP_ASM_DIR_ADV          BIT(1)
+       u8 reserved5[5];
+};
+#pragma pack()
+
+IXGBE_CHECK_STRUCT_LEN(56, ixgbe_aci_cmd_get_link_status_data);
+
+/* Set event mask command (direct 0x0613) */
+struct ixgbe_aci_cmd_set_event_mask {
+       u8      reserved[8];
+       __le16  event_mask;
+#define IXGBE_ACI_LINK_EVENT_UPDOWN            BIT(1)
+#define IXGBE_ACI_LINK_EVENT_MEDIA_NA          BIT(2)
+#define IXGBE_ACI_LINK_EVENT_LINK_FAULT                BIT(3)
+#define IXGBE_ACI_LINK_EVENT_PHY_TEMP_ALARM    BIT(4)
+#define IXGBE_ACI_LINK_EVENT_EXCESSIVE_ERRORS  BIT(5)
+#define IXGBE_ACI_LINK_EVENT_SIGNAL_DETECT     BIT(6)
+#define IXGBE_ACI_LINK_EVENT_AN_COMPLETED      BIT(7)
+#define IXGBE_ACI_LINK_EVENT_MODULE_QUAL_FAIL  BIT(8)
+#define IXGBE_ACI_LINK_EVENT_PORT_TX_SUSPENDED BIT(9)
+#define IXGBE_ACI_LINK_EVENT_TOPO_CONFLICT     BIT(10)
+#define IXGBE_ACI_LINK_EVENT_MEDIA_CONFLICT    BIT(11)
+#define IXGBE_ACI_LINK_EVENT_PHY_FW_LOAD_FAIL  BIT(12)
+       u8      reserved1[6];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_set_event_mask);
+
+struct ixgbe_aci_cmd_link_topo_params {
+       u8 lport_num;
+       u8 lport_num_valid;
+#define IXGBE_ACI_LINK_TOPO_PORT_NUM_VALID     BIT(0)
+       u8 node_type_ctx;
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_S                0
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_M                (0xF << 
IXGBE_ACI_LINK_TOPO_NODE_TYPE_S)
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_PHY      0
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_GPIO_CTRL        1
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_MUX_CTRL 2
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_LED_CTRL 3
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_LED      4
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_THERMAL  5
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_CAGE     6
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_MEZZ     7
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_ID_EEPROM        8
+#define IXGBE_ACI_LINK_TOPO_NODE_TYPE_GPS      11
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_S         4
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_M         \
+                               (0xF << IXGBE_ACI_LINK_TOPO_NODE_CTX_S)
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_GLOBAL                    0
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_BOARD                     1
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_PORT                      2
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_NODE                      3
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_NODE_HANDLE               4
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_DIRECT_BUS_ACCESS         5
+#define IXGBE_ACI_LINK_TOPO_NODE_CTX_NODE_HANDLE_BUS_ADDRESS   6
+       u8 index;
+};
+
+IXGBE_CHECK_STRUCT_LEN(4, ixgbe_aci_cmd_link_topo_params);
+
+struct ixgbe_aci_cmd_link_topo_addr {
+       struct ixgbe_aci_cmd_link_topo_params topo_params;
+       __le16 handle;
+#define IXGBE_ACI_LINK_TOPO_HANDLE_S   0
+#define IXGBE_ACI_LINK_TOPO_HANDLE_M   (0x3FF << IXGBE_ACI_LINK_TOPO_HANDLE_S)
+/* Used to decode the handle field */
+#define IXGBE_ACI_LINK_TOPO_HANDLE_BRD_TYPE_M          BIT(9)
+#define IXGBE_ACI_LINK_TOPO_HANDLE_BRD_TYPE_LOM                BIT(9)
+#define IXGBE_ACI_LINK_TOPO_HANDLE_BRD_TYPE_MEZZ       0
+#define IXGBE_ACI_LINK_TOPO_HANDLE_NODE_S              0
+/* In case of a Mezzanine type */
+#define IXGBE_ACI_LINK_TOPO_HANDLE_MEZZ_NODE_M \
+                               (0x3F << IXGBE_ACI_LINK_TOPO_HANDLE_NODE_S)
+#define IXGBE_ACI_LINK_TOPO_HANDLE_MEZZ_S      6
+#define IXGBE_ACI_LINK_TOPO_HANDLE_MEZZ_M      \
+                               (0x7 << IXGBE_ACI_LINK_TOPO_HANDLE_MEZZ_S)
+/* In case of a LOM type */
+#define IXGBE_ACI_LINK_TOPO_HANDLE_LOM_NODE_M  \
+                               (0x1FF << IXGBE_ACI_LINK_TOPO_HANDLE_NODE_S)
+};
+
+IXGBE_CHECK_STRUCT_LEN(6, ixgbe_aci_cmd_link_topo_addr);
+
+/* Get Link Topology Handle (direct, 0x06E0) */
+struct ixgbe_aci_cmd_get_link_topo {
+       struct ixgbe_aci_cmd_link_topo_addr addr;
+       u8 node_part_num;
+#define IXGBE_ACI_GET_LINK_TOPO_NODE_NR_PCA9575                0x21
+#define IXGBE_ACI_GET_LINK_TOPO_NODE_NR_GEN_GPS                0x48
+#define IXGBE_ACI_GET_LINK_TOPO_NODE_NR_E610_PTC       0x49
+       u8 rsvd[9];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_link_topo);
+
+/* Get Link Topology Pin (direct, 0x06E1) */
+struct ixgbe_aci_cmd_get_link_topo_pin {
+       struct ixgbe_aci_cmd_link_topo_addr addr;
+       u8 input_io_params;
+#define IXGBE_ACI_LINK_TOPO_INPUT_IO_FUNC_S    0
+#define IXGBE_ACI_LINK_TOPO_INPUT_IO_FUNC_M    \
+                               (0x1F << IXGBE_ACI_LINK_TOPO_INPUT_IO_FUNC_S)
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_GPIO       0
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_RESET_N    1
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_INT_N      2
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_PRESENT_N  3
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_TX_DIS     4
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_MODSEL_N   5
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_LPMODE     6
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_TX_FAULT   7
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_RX_LOSS    8
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_RS0                9
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_RS1                10
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_EEPROM_WP  11
+/* 12 repeats intentionally due to two different uses depending on context */
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_LED                12
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_RED_LED    12
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_GREEN_LED  13
+#define IXGBE_ACI_LINK_TOPO_IO_FUNC_BLUE_LED   14
+#define IXGBE_ACI_LINK_TOPO_INPUT_IO_TYPE_S    5
+#define IXGBE_ACI_LINK_TOPO_INPUT_IO_TYPE_M    \
+                       (0x7 << IXGBE_ACI_LINK_TOPO_INPUT_IO_TYPE_S)
+#define IXGBE_ACI_LINK_TOPO_INPUT_IO_TYPE_GPIO 3
+/* Use IXGBE_ACI_LINK_TOPO_NODE_TYPE_* for the type values */
+       u8 output_io_params;
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_IO_FUNC_S   0
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_IO_FUNC_M   \
+                       (0x1F << \ IXGBE_ACI_LINK_TOPO_INPUT_IO_FUNC_NUM_S)
+/* Use IXGBE_ACI_LINK_TOPO_IO_FUNC_* for the non-numerical options */
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_IO_TYPE_S   5
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_IO_TYPE_M   \
+                       (0x7 << IXGBE_ACI_LINK_TOPO_INPUT_IO_TYPE_S)
+/* Use IXGBE_ACI_LINK_TOPO_NODE_TYPE_* for the type values */
+       u8 output_io_flags;
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_SPEED_S     0
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_SPEED_M     \
+                       (0x7 << IXGBE_ACI_LINK_TOPO_OUTPUT_SPEED_S)
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_INT_S       3
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_INT_M       \
+                       (0x3 << IXGBE_ACI_LINK_TOPO_OUTPUT_INT_S)
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_POLARITY    BIT(5)
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_VALUE       BIT(6)
+#define IXGBE_ACI_LINK_TOPO_OUTPUT_DRIVEN      BIT(7)
+       u8 rsvd[7];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_link_topo_pin);
+
+/* Read/Write I2C (direct, 0x06E2/0x06E3) */
+struct ixgbe_aci_cmd_i2c {
+       struct ixgbe_aci_cmd_link_topo_addr topo_addr;
+       __le16 i2c_addr;
+       u8 i2c_params;
+#define IXGBE_ACI_I2C_DATA_SIZE_S              0
+#define IXGBE_ACI_I2C_DATA_SIZE_M              (0xF << 
IXGBE_ACI_I2C_DATA_SIZE_S)
+#define IXGBE_ACI_I2C_ADDR_TYPE_M              BIT(4)
+#define IXGBE_ACI_I2C_ADDR_TYPE_7BIT           0
+#define IXGBE_ACI_I2C_ADDR_TYPE_10BIT          IXGBE_ACI_I2C_ADDR_TYPE_M
+#define IXGBE_ACI_I2C_DATA_OFFSET_S            5
+#define IXGBE_ACI_I2C_DATA_OFFSET_M            (0x3 << 
IXGBE_ACI_I2C_DATA_OFFSET_S)
+#define IXGBE_ACI_I2C_USE_REPEATED_START       BIT(7)
+       u8 rsvd;
+       __le16 i2c_bus_addr;
+#define IXGBE_ACI_I2C_ADDR_7BIT_MASK           0x7F
+#define IXGBE_ACI_I2C_ADDR_10BIT_MASK          0x3FF
+       u8 i2c_data[4]; /* Used only by write command, reserved in read. */
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_i2c);
+
+/* Read I2C Response (direct, 0x06E2) */
+struct ixgbe_aci_cmd_read_i2c_resp {
+       u8 i2c_data[16];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_read_i2c_resp);
+
+/* Read/Write MDIO (direct, 0x06E4/0x06E5) */
+struct ixgbe_aci_cmd_mdio {
+       struct ixgbe_aci_cmd_link_topo_addr topo_addr;
+       u8 mdio_device_addr;
+#define IXGBE_ACI_MDIO_DEV_S           0
+#define IXGBE_ACI_MDIO_DEV_M           (0x1F << IXGBE_ACI_MDIO_DEV_S)
+#define IXGBE_ACI_MDIO_CLAUSE_22       BIT(5)
+#define IXGBE_ACI_MDIO_CLAUSE_45       BIT(6)
+       u8 mdio_bus_address;
+#define IXGBE_ACI_MDIO_BUS_ADDR_S 0
+#define IXGBE_ACI_MDIO_BUS_ADDR_M (0x1F << IXGBE_ACI_MDIO_BUS_ADDR_S)
+       __le16 offset;
+       __le16 data; /* Input in write cmd, output in read cmd. */
+       u8 rsvd1[4];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_mdio);
+
+/* Set/Get GPIO By Function (direct, 0x06E6/0x06E7) */
+struct ixgbe_aci_cmd_gpio_by_func {
+       struct ixgbe_aci_cmd_link_topo_addr topo_addr;
+       u8 io_func_num;
+#define IXGBE_ACI_GPIO_FUNC_S  0
+#define IXGBE_ACI_GPIO_FUNC_M  (0x1F << IXGBE_ACI_GPIO_IO_FUNC_NUM_S)
+       u8 io_value; /* Input in write cmd, output in read cmd. */
+#define IXGBE_ACI_GPIO_ON      BIT(0)
+#define IXGBE_ACI_GPIO_OFF     0
+       u8 rsvd[8];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_gpio_by_func);
+
+/* Set/Get GPIO (direct, 0x06EC/0x06ED) */
+struct ixgbe_aci_cmd_gpio {
+       __le16 gpio_ctrl_handle;
+#define IXGBE_ACI_GPIO_HANDLE_S        0
+#define IXGBE_ACI_GPIO_HANDLE_M        (0x3FF << IXGBE_ACI_GPIO_HANDLE_S)
+       u8 gpio_num;
+       u8 gpio_val;
+       u8 rsvd[12];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_gpio);
+
+/* Read/Write SFF EEPROM command (indirect 0x06EE) */
+struct ixgbe_aci_cmd_sff_eeprom {
+       u8 lport_num;
+       u8 lport_num_valid;
+#define IXGBE_ACI_SFF_PORT_NUM_VALID           BIT(0)
+       __le16 i2c_bus_addr;
+#define IXGBE_ACI_SFF_I2CBUS_7BIT_M            0x7F
+#define IXGBE_ACI_SFF_I2CBUS_10BIT_M           0x3FF
+#define IXGBE_ACI_SFF_I2CBUS_TYPE_M            BIT(10)
+#define IXGBE_ACI_SFF_I2CBUS_TYPE_7BIT         0
+#define IXGBE_ACI_SFF_I2CBUS_TYPE_10BIT                
IXGBE_ACI_SFF_I2CBUS_TYPE_M
+#define IXGBE_ACI_SFF_PAGE_BANK_CTRL_S         11
+#define IXGBE_ACI_SFF_PAGE_BANK_CTRL_M         (0x3 << 
IXGBE_ACI_SFF_PAGE_BANK_CTRL_S)
+#define IXGBE_ACI_SFF_NO_PAGE_BANK_UPDATE      0
+#define IXGBE_ACI_SFF_UPDATE_PAGE              1
+#define IXGBE_ACI_SFF_UPDATE_BANK              2
+#define IXGBE_ACI_SFF_UPDATE_PAGE_BANK         3
+#define IXGBE_ACI_SFF_IS_WRITE                 BIT(15)
+       __le16 i2c_offset;
+       u8 module_bank;
+       u8 module_page;
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_sff_eeprom);
+
+/* Program Topology Device NVM (direct, 0x06F2) */
+struct ixgbe_aci_cmd_prog_topo_dev_nvm {
+       struct ixgbe_aci_cmd_link_topo_params topo_params;
+       u8 rsvd[12];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_prog_topo_dev_nvm);
+
+/* Read Topology Device NVM (direct, 0x06F3) */
+struct ixgbe_aci_cmd_read_topo_dev_nvm {
+       struct ixgbe_aci_cmd_link_topo_params topo_params;
+       __le32 start_address;
+#define IXGBE_ACI_READ_TOPO_DEV_NVM_DATA_READ_SIZE 8
+       u8 data_read[IXGBE_ACI_READ_TOPO_DEV_NVM_DATA_READ_SIZE];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_read_topo_dev_nvm);
+
+/* NVM Read command (indirect 0x0701)
+ * NVM Erase commands (direct 0x0702)
+ * NVM Write commands (indirect 0x0703)
+ * NVM Write Activate commands (direct 0x0707)
+ * NVM Shadow RAM Dump commands (direct 0x0707)
+ */
+struct ixgbe_aci_cmd_nvm {
+#define IXGBE_ACI_NVM_MAX_OFFSET       0xFFFFFF
+       __le16 offset_low;
+       u8 offset_high; /* For Write Activate offset_high is used as flags2 */
+       u8 cmd_flags;
+#define IXGBE_ACI_NVM_LAST_CMD         BIT(0)
+#define IXGBE_ACI_NVM_PCIR_REQ         BIT(0)  /* Used by NVM Write reply */
+#define IXGBE_ACI_NVM_PRESERVATION_S   1 /* Used by NVM Write Activate only */
+#define IXGBE_ACI_NVM_PRESERVATION_M   (3 << IXGBE_ACI_NVM_PRESERVATION_S)
+#define IXGBE_ACI_NVM_NO_PRESERVATION  (0 << IXGBE_ACI_NVM_PRESERVATION_S)
+#define IXGBE_ACI_NVM_PRESERVE_ALL     BIT(1)
+#define IXGBE_ACI_NVM_FACTORY_DEFAULT  (2 << IXGBE_ACI_NVM_PRESERVATION_S)
+#define IXGBE_ACI_NVM_PRESERVE_SELECTED        (3 << 
IXGBE_ACI_NVM_PRESERVATION_S)
+#define IXGBE_ACI_NVM_ACTIV_SEL_NVM    BIT(3) /* Write Activate/SR Dump only */
+#define IXGBE_ACI_NVM_ACTIV_SEL_OROM   BIT(4)
+#define IXGBE_ACI_NVM_ACTIV_SEL_NETLIST        BIT(5)
+#define IXGBE_ACI_NVM_SPECIAL_UPDATE   BIT(6)
+#define IXGBE_ACI_NVM_REVERT_LAST_ACTIV        BIT(6) /* Write Activate only */
+#define IXGBE_ACI_NVM_ACTIV_SEL_MASK   MAKEMASK(0x7, 3)
+#define IXGBE_ACI_NVM_FLASH_ONLY               BIT(7)
+#define IXGBE_ACI_NVM_RESET_LVL_M              MAKEMASK(0x3, 0) /* Write reply 
only */
+#define IXGBE_ACI_NVM_POR_FLAG         0
+#define IXGBE_ACI_NVM_PERST_FLAG       1
+#define IXGBE_ACI_NVM_EMPR_FLAG                2
+#define IXGBE_ACI_NVM_EMPR_ENA         BIT(0) /* Write Activate reply only */
+       /* For Write Activate, several flags are sent as part of a separate
+        * flags2 field using a separate byte. For simplicity of the software
+        * interface, we pass the flags as a 16 bit value so these flags are
+        * all offset by 8 bits
+        */
+#define IXGBE_ACI_NVM_ACTIV_REQ_EMPR   BIT(8) /* NVM Write Activate only */
+       __le16 module_typeid;
+       __le16 length;
+#define IXGBE_ACI_NVM_ERASE_LEN        0xFFFF
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+/* NVM Module_Type ID, needed offset and read_len for struct 
ixgbe_aci_cmd_nvm. */
+#define IXGBE_ACI_NVM_START_POINT              0
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm);
+
+/* Used for 0x0704 as well as for 0x0705 commands */
+struct ixgbe_aci_cmd_nvm_cfg {
+       u8      cmd_flags;
+#define IXGBE_ACI_ANVM_MULTIPLE_ELEMS  BIT(0)
+#define IXGBE_ACI_ANVM_IMMEDIATE_FIELD BIT(1)
+#define IXGBE_ACI_ANVM_NEW_CFG         BIT(2)
+       u8      reserved;
+       __le16 count;
+       __le16 id;
+       u8 reserved1[2];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm_cfg);
+
+/* NVM Checksum Command (direct, 0x0706) */
+struct ixgbe_aci_cmd_nvm_checksum {
+       u8 flags;
+#define IXGBE_ACI_NVM_CHECKSUM_VERIFY  BIT(0)
+#define IXGBE_ACI_NVM_CHECKSUM_RECALC  BIT(1)
+       u8 rsvd;
+       __le16 checksum; /* Used only by response */
+#define IXGBE_ACI_NVM_CHECKSUM_CORRECT 0xBABA
+       u8 rsvd2[12];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm_checksum);
+
+/* Used for NVM Sanitization command - 0x070C */
+struct ixgbe_aci_cmd_nvm_sanitization {
+       u8 cmd_flags;
+#define IXGBE_ACI_SANITIZE_REQ_READ                    0
+#define IXGBE_ACI_SANITIZE_REQ_OPERATE                 BIT(0)
+
+#define IXGBE_ACI_SANITIZE_READ_SUBJECT_NVM_BITS       0
+#define IXGBE_ACI_SANITIZE_READ_SUBJECT_NVM_STATE      BIT(1)
+#define IXGBE_ACI_SANITIZE_OPERATE_SUBJECT_CLEAR       0
+       u8 values;
+#define IXGBE_ACI_SANITIZE_NVM_BITS_HOST_CLEAN_SUPPORT BIT(0)
+#define IXGBE_ACI_SANITIZE_NVM_BITS_BMC_CLEAN_SUPPORT  BIT(2)
+#define IXGBE_ACI_SANITIZE_NVM_STATE_HOST_CLEAN_DONE   BIT(0)
+#define IXGBE_ACI_SANITIZE_NVM_STATE_HOST_CLEAN_SUCCESS        BIT(1)
+#define IXGBE_ACI_SANITIZE_NVM_STATE_BMC_CLEAN_DONE    BIT(2)
+#define IXGBE_ACI_SANITIZE_NVM_STATE_BMC_CLEAN_SUCCESS BIT(3)
+#define IXGBE_ACI_SANITIZE_OPERATE_HOST_CLEAN_DONE     BIT(0)
+#define IXGBE_ACI_SANITIZE_OPERATE_HOST_CLEAN_SUCCESS  BIT(1)
+#define IXGBE_ACI_SANITIZE_OPERATE_BMC_CLEAN_DONE      BIT(2)
+#define IXGBE_ACI_SANITIZE_OPERATE_BMC_CLEAN_SUCCESS   BIT(3)
+       u8 reserved[14];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm_sanitization);
+
+/* Write/Read Alternate - Direct (direct 0x0900/0x0902) */
+struct ixgbe_aci_cmd_read_write_alt_direct {
+       __le32 dword0_addr;
+       __le32 dword0_value;
+       __le32 dword1_addr;
+       __le32 dword1_value;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_read_write_alt_direct);
+
+/* Write/Read Alternate - Indirect (indirect 0x0901/0x0903) */
+struct ixgbe_aci_cmd_read_write_alt_indirect {
+       __le32 base_dword_addr;
+       __le32 num_dwords;
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_read_write_alt_indirect);
+
+/* Done Alternate Write (direct 0x0904) */
+struct ixgbe_aci_cmd_done_alt_write {
+       u8 flags;
+#define IXGBE_ACI_CMD_UEFI_BIOS_MODE   BIT(0)
+#define IXGBE_ACI_RESP_RESET_NEEDED    BIT(1)
+       u8 reserved[15];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_done_alt_write);
+
+/* Clear Port Alternate Write (direct 0x0906) */
+struct ixgbe_aci_cmd_clear_port_alt_write {
+       u8 reserved[16];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_clear_port_alt_write);
+
+/* Debug Dump Internal Data (indirect 0xFF08) */
+struct ixgbe_aci_cmd_debug_dump_internals {
+       __le16 cluster_id; /* Expresses next cluster ID in response */
+#define IXGBE_ACI_DBG_DUMP_CLUSTER_ID_LINK             0
+#define IXGBE_ACI_DBG_DUMP_CLUSTER_ID_FULL_CSR_SPACE   1
+       __le16 table_id; /* Used only for non-memory clusters */
+       __le32 idx; /* In table entries for tables, in bytes for memory */
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_debug_dump_internals);
+
+/* Set Health Status (direct 0xFF20) */
+struct ixgbe_aci_cmd_set_health_status_config {
+       u8 event_source;
+#define IXGBE_ACI_HEALTH_STATUS_SET_PF_SPECIFIC_MASK   BIT(0)
+#define IXGBE_ACI_HEALTH_STATUS_SET_ALL_PF_MASK                BIT(1)
+#define IXGBE_ACI_HEALTH_STATUS_SET_GLOBAL_MASK                BIT(2)
+       u8 reserved[15];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_set_health_status_config);
+
+#define IXGBE_ACI_HEALTH_STATUS_ERR_UNKNOWN_MOD_STRICT         0x101
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_TYPE                   0x102
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_QUAL                   0x103
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_COMM                   0x104
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_CONFLICT               0x105
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_NOT_PRESENT            0x106
+#define IXGBE_ACI_HEALTH_STATUS_INFO_MOD_UNDERUTILIZED         0x107
+#define IXGBE_ACI_HEALTH_STATUS_ERR_UNKNOWN_MOD_LENIENT                0x108
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MOD_DIAGNOSTIC_FEATURE     0x109
+#define IXGBE_ACI_HEALTH_STATUS_ERR_INVALID_LINK_CFG           0x10B
+#define IXGBE_ACI_HEALTH_STATUS_ERR_PORT_ACCESS                        0x10C
+#define IXGBE_ACI_HEALTH_STATUS_ERR_PORT_UNREACHABLE           0x10D
+#define IXGBE_ACI_HEALTH_STATUS_INFO_PORT_SPEED_MOD_LIMITED    0x10F
+#define IXGBE_ACI_HEALTH_STATUS_ERR_PARALLEL_FAULT             0x110
+#define IXGBE_ACI_HEALTH_STATUS_INFO_PORT_SPEED_PHY_LIMITED    0x111
+#define IXGBE_ACI_HEALTH_STATUS_ERR_NETLIST_TOPO               0x112
+#define IXGBE_ACI_HEALTH_STATUS_ERR_NETLIST                    0x113
+#define IXGBE_ACI_HEALTH_STATUS_ERR_TOPO_CONFLICT              0x114
+#define IXGBE_ACI_HEALTH_STATUS_ERR_LINK_HW_ACCESS             0x115
+#define IXGBE_ACI_HEALTH_STATUS_ERR_LINK_RUNTIME               0x116
+#define IXGBE_ACI_HEALTH_STATUS_ERR_DNL_INIT                   0x117
+#define IXGBE_ACI_HEALTH_STATUS_ERR_PHY_NVM_PROG               0x120
+#define IXGBE_ACI_HEALTH_STATUS_ERR_PHY_FW_LOAD                        0x121
+#define IXGBE_ACI_HEALTH_STATUS_INFO_RECOVERY                  0x500
+#define IXGBE_ACI_HEALTH_STATUS_ERR_FLASH_ACCESS               0x501
+#define IXGBE_ACI_HEALTH_STATUS_ERR_NVM_AUTH                   0x502
+#define IXGBE_ACI_HEALTH_STATUS_ERR_OROM_AUTH                  0x503
+#define IXGBE_ACI_HEALTH_STATUS_ERR_DDP_AUTH                   0x504
+#define IXGBE_ACI_HEALTH_STATUS_ERR_NVM_COMPAT                 0x505
+#define IXGBE_ACI_HEALTH_STATUS_ERR_OROM_COMPAT                        0x506
+#define IXGBE_ACI_HEALTH_STATUS_ERR_NVM_SEC_VIOLATION          0x507
+#define IXGBE_ACI_HEALTH_STATUS_ERR_OROM_SEC_VIOLATION         0x508
+#define IXGBE_ACI_HEALTH_STATUS_ERR_DCB_MIB                    0x509
+#define IXGBE_ACI_HEALTH_STATUS_ERR_MNG_TIMEOUT                        0x50A
+#define IXGBE_ACI_HEALTH_STATUS_ERR_BMC_RESET                  0x50B
+#define IXGBE_ACI_HEALTH_STATUS_ERR_LAST_MNG_FAIL              0x50C
+#define IXGBE_ACI_HEALTH_STATUS_ERR_RESOURCE_ALLOC_FAIL                0x50D
+#define IXGBE_ACI_HEALTH_STATUS_ERR_FW_LOOP                    0x1000
+#define IXGBE_ACI_HEALTH_STATUS_ERR_FW_PFR_FAIL                        0x1001
+#define IXGBE_ACI_HEALTH_STATUS_ERR_LAST_FAIL_AQ               0x1002
+
+/* Get Health Status codes (indirect 0xFF21) */
+struct ixgbe_aci_cmd_get_supported_health_status_codes {
+       __le16 health_code_count;
+       u8 reserved[6];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_supported_health_status_codes);
+
+/* Get Health Status (indirect 0xFF22) */
+struct ixgbe_aci_cmd_get_health_status {
+       __le16 health_status_count;
+       u8 reserved[6];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_get_health_status);
+
+/* Get Health Status event buffer entry, (0xFF22)
+ * repeated per reported health status
+ */
+struct ixgbe_aci_cmd_health_status_elem {
+       __le16 health_status_code;
+       __le16 event_source;
+#define IXGBE_ACI_HEALTH_STATUS_PF             (0x1)
+#define IXGBE_ACI_HEALTH_STATUS_PORT           (0x2)
+#define IXGBE_ACI_HEALTH_STATUS_GLOBAL         (0x3)
+       __le32 internal_data1;
+#define IXGBE_ACI_HEALTH_STATUS_UNDEFINED_DATA (0xDEADBEEF)
+       __le32 internal_data2;
+};
+
+IXGBE_CHECK_STRUCT_LEN(12, ixgbe_aci_cmd_health_status_elem);
+
+/* Clear Health Status (direct 0xFF23) */
+struct ixgbe_aci_cmd_clear_health_status {
+       __le32 reserved[4];
+};
+
+IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_clear_health_status);
+
+/**
+ * struct ixgbe_aq_desc - Admin Command (AC) descriptor
+ * @flags: IXGBE_ACI_FLAG_* flags
+ * @opcode: Admin command opcode
+ * @datalen: length in bytes of indirect/external data buffer
+ * @retval: return value from firmware
+ * @cookie_high: opaque data high-half
+ * @cookie_low: opaque data low-half
+ * @params: command-specific parameters
+ *
+ * Descriptor format for commands the driver posts via the Admin Command 
Interface
+ * (ACI). The firmware writes back onto the command descriptor and returns
+ * the result of the command. Asynchronous events that are not an immediate
+ * result of the command are written to the Admin Command Interface (ACI) using
+ * the same descriptor format. Descriptors are in little-endian notation with
+ * 32-bit words.
+ */
+struct ixgbe_aci_desc {
+       __le16 flags;
+       __le16 opcode;
+       __le16 datalen;
+       __le16 retval;
+       __le32 cookie_high;
+       __le32 cookie_low;
+       union {
+               u8 raw[16];
+               struct ixgbe_aci_cmd_generic generic;
+               struct ixgbe_aci_cmd_get_ver get_ver;
+               struct ixgbe_aci_cmd_driver_ver driver_ver;
+               struct ixgbe_aci_cmd_get_exp_err exp_err;
+               struct ixgbe_aci_cmd_req_res res_owner;
+               struct ixgbe_aci_cmd_list_caps get_cap;
+               struct ixgbe_aci_cmd_disable_rxen disable_rxen;
+               struct ixgbe_aci_cmd_get_fw_event get_fw_event;
+               struct ixgbe_aci_cmd_get_phy_caps get_phy;
+               struct ixgbe_aci_cmd_set_phy_cfg set_phy;
+               struct ixgbe_aci_cmd_restart_an restart_an;
+               struct ixgbe_aci_cmd_get_link_status get_link_status;
+               struct ixgbe_aci_cmd_set_event_mask set_event_mask;
+               struct ixgbe_aci_cmd_get_link_topo get_link_topo;
+               struct ixgbe_aci_cmd_get_link_topo_pin get_link_topo_pin;
+               struct ixgbe_aci_cmd_i2c read_write_i2c;
+               struct ixgbe_aci_cmd_read_i2c_resp read_i2c_resp;
+               struct ixgbe_aci_cmd_mdio read_write_mdio;
+               struct ixgbe_aci_cmd_mdio read_mdio;
+               struct ixgbe_aci_cmd_mdio write_mdio;
+               struct ixgbe_aci_cmd_gpio_by_func read_write_gpio_by_func;
+               struct ixgbe_aci_cmd_gpio read_write_gpio;
+               struct ixgbe_aci_cmd_sff_eeprom read_write_sff_param;
+               struct ixgbe_aci_cmd_prog_topo_dev_nvm prog_topo_dev_nvm;
+               struct ixgbe_aci_cmd_read_topo_dev_nvm read_topo_dev_nvm;
+               struct ixgbe_aci_cmd_nvm nvm;
+               struct ixgbe_aci_cmd_nvm_cfg nvm_cfg;
+               struct ixgbe_aci_cmd_nvm_checksum nvm_checksum;
+               struct ixgbe_aci_cmd_read_write_alt_direct 
read_write_alt_direct;
+               struct ixgbe_aci_cmd_read_write_alt_indirect 
read_write_alt_indirect;
+               struct ixgbe_aci_cmd_done_alt_write done_alt_write;
+               struct ixgbe_aci_cmd_clear_port_alt_write clear_port_alt_write;
+               struct ixgbe_aci_cmd_debug_dump_internals debug_dump;
+               struct ixgbe_aci_cmd_set_health_status_config
+                       set_health_status_config;
+               struct ixgbe_aci_cmd_get_supported_health_status_codes
+                       get_supported_health_status_codes;
+               struct ixgbe_aci_cmd_get_health_status get_health_status;
+               struct ixgbe_aci_cmd_clear_health_status clear_health_status;
+               struct ixgbe_aci_cmd_nvm_sanitization nvm_sanitization;
+       } params;
+};
+
+/* E610-specific adapter context structures */
+
+struct ixgbe_link_status {
+       /* Refer to ixgbe_aci_phy_type for bits definition */
+       u64 phy_type_low;
+       u64 phy_type_high;
+       u8 topo_media_conflict;
+       u16 max_frame_size;
+       u16 link_speed;
+       u16 req_speeds;
+       u8 link_cfg_err;
+       u8 lse_ena;     /* Link Status Event notification */
+       u8 link_info;
+       u8 an_info;
+       u8 ext_info;
+       u8 fec_info;
+       u8 pacing;
+       /* Refer to #define from module_type[IXGBE_ACI_MODULE_TYPE_TOTAL_BYTE] 
of
+        * ixgbe_aci_get_phy_caps structure
+        */
+       u8 module_type[IXGBE_ACI_MODULE_TYPE_TOTAL_BYTE];
+};
+
+/* Common HW capabilities for SW use */
+struct ixgbe_hw_common_caps {
+       /* Write CSR protection */
+       u64 wr_csr_prot;
+       u32 switching_mode;
+       /* switching mode supported - EVB switching (including cloud) */
+#define IXGBE_NVM_IMAGE_TYPE_EVB               0x0
+
+       /* Manageability mode & supported protocols over MCTP */
+       u32 mgmt_mode;
+#define IXGBE_MGMT_MODE_PASS_THRU_MODE_M       0xF
+#define IXGBE_MGMT_MODE_CTL_INTERFACE_M                0xF0
+#define IXGBE_MGMT_MODE_REDIR_SB_INTERFACE_M   0xF00
+
+       u32 mgmt_protocols_mctp;
+#define IXGBE_MGMT_MODE_PROTO_RSVD     BIT(0)
+#define IXGBE_MGMT_MODE_PROTO_PLDM     BIT(1)
+#define IXGBE_MGMT_MODE_PROTO_OEM      BIT(2)
+#define IXGBE_MGMT_MODE_PROTO_NC_SI    BIT(3)
+
+       u32 os2bmc;
+       u32 valid_functions;
+       /* DCB capabilities */
+       u32 active_tc_bitmap;
+       u32 maxtc;
+
+       /* RSS related capabilities */
+       u32 rss_table_size;             /* 512 for PFs and 64 for VFs */
+       u32 rss_table_entry_width;      /* RSS Entry width in bits */
+
+       /* Tx/Rx queues */
+       u32 num_rxq;                    /* Number/Total Rx queues */
+       u32 rxq_first_id;               /* First queue ID for Rx queues */
+       u32 num_txq;                    /* Number/Total Tx queues */
+       u32 txq_first_id;               /* First queue ID for Tx queues */
+
+       /* MSI-X vectors */
+       u32 num_msix_vectors;
+       u32 msix_vector_first_id;
+
+       /* Max MTU for function or device */
+       u32 max_mtu;
+
+       /* WOL related */
+       u32 num_wol_proxy_fltr;
+       u32 wol_proxy_vsi_seid;
+
+       /* LED/SDP pin count */
+       u32 led_pin_num;
+       u32 sdp_pin_num;
+
+       /* LED/SDP - Supports up to 12 LED pins and 8 SDP signals */
+#define IXGBE_MAX_SUPPORTED_GPIO_LED   12
+#define IXGBE_MAX_SUPPORTED_GPIO_SDP   8
+       u8 led[IXGBE_MAX_SUPPORTED_GPIO_LED];
+       u8 sdp[IXGBE_MAX_SUPPORTED_GPIO_SDP];
+       /* VMDQ */
+       u8 vmdq;                        /* VMDQ supported */
+
+       /* EVB capabilities */
+       u8 evb_802_1_qbg;               /* Edge Virtual Bridging */
+       u8 evb_802_1_qbh;               /* Bridge Port Extension */
+
+       u8 dcb;
+       u8 iscsi;
+       u8 ieee_1588;
+       u8 mgmt_cem;
+
+       /* WoL and APM support */
+#define IXGBE_WOL_SUPPORT_M            BIT(0)
+#define IXGBE_ACPI_PROG_MTHD_M         BIT(1)
+#define IXGBE_PROXY_SUPPORT_M          BIT(2)
+       u8 apm_wol_support;
+       u8 acpi_prog_mthd;
+       u8 proxy_support;
+       bool sec_rev_disabled;
+       bool update_disabled;
+       bool nvm_unified_update;
+       bool netlist_auth;
+#define IXGBE_NVM_MGMT_SEC_REV_DISABLED                BIT(0)
+#define IXGBE_NVM_MGMT_UPDATE_DISABLED         BIT(1)
+#define IXGBE_NVM_MGMT_UNIFIED_UPD_SUPPORT     BIT(3)
+#define IXGBE_NVM_MGMT_NETLIST_AUTH_SUPPORT    BIT(5)
+       bool no_drop_policy_support;
+       /* PCIe reset avoidance */
+       bool pcie_reset_avoidance; /* false: not supported, true: supported */
+       /* Post update reset restriction */
+       bool reset_restrict_support; /* false: not supported, true: supported */
+
+       /* External topology device images within the NVM */
+#define IXGBE_EXT_TOPO_DEV_IMG_COUNT   4
+       u32 ext_topo_dev_img_ver_high[IXGBE_EXT_TOPO_DEV_IMG_COUNT];
+       u32 ext_topo_dev_img_ver_low[IXGBE_EXT_TOPO_DEV_IMG_COUNT];
+       u8 ext_topo_dev_img_part_num[IXGBE_EXT_TOPO_DEV_IMG_COUNT];
+#define IXGBE_EXT_TOPO_DEV_IMG_PART_NUM_S      8
+#define IXGBE_EXT_TOPO_DEV_IMG_PART_NUM_M      \
+               MAKEMASK(0xFF, IXGBE_EXT_TOPO_DEV_IMG_PART_NUM_S)
+       bool ext_topo_dev_img_load_en[IXGBE_EXT_TOPO_DEV_IMG_COUNT];
+#define IXGBE_EXT_TOPO_DEV_IMG_LOAD_EN BIT(0)
+       bool ext_topo_dev_img_prog_en[IXGBE_EXT_TOPO_DEV_IMG_COUNT];
+#define IXGBE_EXT_TOPO_DEV_IMG_PROG_EN BIT(1)
+       bool next_cluster_id_support;
+};
+
+/* IEEE 1588 TIME_SYNC specific info */
+/* Function specific definitions */
+#define IXGBE_TS_FUNC_ENA_M            BIT(0)
+#define IXGBE_TS_SRC_TMR_OWND_M                BIT(1)
+#define IXGBE_TS_TMR_ENA_M             BIT(2)
+#define IXGBE_TS_TMR_IDX_OWND_S                4
+#define IXGBE_TS_TMR_IDX_OWND_M                BIT(4)
+#define IXGBE_TS_CLK_FREQ_S            16
+#define IXGBE_TS_CLK_FREQ_M            MAKEMASK(0x7, IXGBE_TS_CLK_FREQ_S)
+#define IXGBE_TS_CLK_SRC_S             20
+#define IXGBE_TS_CLK_SRC_M             BIT(20)
+#define IXGBE_TS_TMR_IDX_ASSOC_S       24
+#define IXGBE_TS_TMR_IDX_ASSOC_M       BIT(24)
+
+/* TIME_REF clock rate specification */
+enum ixgbe_time_ref_freq {
+       IXGBE_TIME_REF_FREQ_25_000      = 0,
+       IXGBE_TIME_REF_FREQ_122_880     = 1,
+       IXGBE_TIME_REF_FREQ_125_000     = 2,
+       IXGBE_TIME_REF_FREQ_153_600     = 3,
+       IXGBE_TIME_REF_FREQ_156_250     = 4,
+       IXGBE_TIME_REF_FREQ_245_760     = 5,
+
+       NUM_IXGBE_TIME_REF_FREQ
+};
+
+struct ixgbe_ts_func_info {
+       /* Function specific info */
+       enum ixgbe_time_ref_freq time_ref;
+       u8 clk_freq;
+       u8 clk_src;
+       u8 tmr_index_assoc;
+       u8 ena;
+       u8 tmr_index_owned;
+       u8 src_tmr_owned;
+       u8 tmr_ena;
+};
+
+/* Device specific definitions */
+#define IXGBE_TS_TMR0_OWNR_M           0x7
+#define IXGBE_TS_TMR0_OWND_M           BIT(3)
+#define IXGBE_TS_TMR1_OWNR_S           4
+#define IXGBE_TS_TMR1_OWNR_M           MAKEMASK(0x7, IXGBE_TS_TMR1_OWNR_S)
+#define IXGBE_TS_TMR1_OWND_M           BIT(7)
+#define IXGBE_TS_DEV_ENA_M             BIT(24)
+#define IXGBE_TS_TMR0_ENA_M            BIT(25)
+#define IXGBE_TS_TMR1_ENA_M            BIT(26)
+
+struct ixgbe_ts_dev_info {
+       /* Device specific info */
+       u32 ena_ports;
+       u32 tmr_own_map;
+       u32 tmr0_owner;
+       u32 tmr1_owner;
+       u8 tmr0_owned;
+       u8 tmr1_owned;
+       u8 ena;
+       u8 tmr0_ena;
+       u8 tmr1_ena;
+};
+
+/* Function specific capabilities */
+struct ixgbe_hw_func_caps {
+       struct ixgbe_hw_common_caps common_cap;
+       u32 guar_num_vsi;
+       struct ixgbe_ts_func_info ts_func_info;
+       bool no_drop_policy_ena;
+};
+
+/* Device wide capabilities */
+struct ixgbe_hw_dev_caps {
+       struct ixgbe_hw_common_caps common_cap;
+       u32 num_vsi_allocd_to_host;     /* Excluding EMP VSI */
+       u32 num_flow_director_fltr;     /* Number of FD filters available */
+       struct ixgbe_ts_dev_info ts_dev_info;
+       u32 num_funcs;
+};
+
+/* ACI event information */
+struct ixgbe_aci_event {
+       struct ixgbe_aci_desc desc;
+       u16 msg_len;
+       u16 buf_len;
+       u8 *msg_buf;
+};
+
+struct ixgbe_aci_info {
+       enum ixgbe_aci_err last_status; /* last status of sent admin command */
+       struct ixgbe_lock lock;         /* admin command interface lock */
+};
+
+/* Option ROM version information */
+struct ixgbe_orom_info {
+       u8 major;                       /* Major version of OROM */
+       u8 patch;                       /* Patch version of OROM */
+       u16 build;                      /* Build version of OROM */
+       u32 srev;                       /* Security revision */
+};
+
+/* NVM version information */
+struct ixgbe_nvm_info {
+       u32 eetrack;
+       u32 srev;
+       u8 major;
+       u8 minor;
+};
+
+/* Enumeration of possible flash banks for the NVM, OROM, and Netlist modules
+ * of the flash image.
+ */
+enum ixgbe_flash_bank {
+       IXGBE_INVALID_FLASH_BANK,
+       IXGBE_1ST_FLASH_BANK,
+       IXGBE_2ND_FLASH_BANK,
+};
+
+/* information for accessing NVM, OROM, and Netlist flash banks */
+struct ixgbe_bank_info {
+       u32 nvm_ptr;                            /* Pointer to 1st NVM bank */
+       u32 nvm_size;                           /* Size of NVM bank */
+       u32 orom_ptr;                           /* Pointer to 1st OROM bank */
+       u32 orom_size;                          /* Size of OROM bank */
+       u32 netlist_ptr;                        /* Pointer to 1st Netlist bank 
*/
+       u32 netlist_size;                       /* Size of Netlist bank */
+       enum ixgbe_flash_bank nvm_bank;         /* Active NVM bank */
+       enum ixgbe_flash_bank orom_bank;        /* Active OROM bank */
+       enum ixgbe_flash_bank netlist_bank;     /* Active Netlist bank */
+};
+
+/* Flash Chip Information */
+struct ixgbe_flash_info {
+       struct ixgbe_orom_info orom;            /* Option ROM version info */
+       struct ixgbe_nvm_info nvm;              /* NVM version information */
+       struct ixgbe_bank_info banks;           /* Flash Bank information */
+       u16 sr_words;                           /* Shadow RAM size in words */
+       u32 flash_size;                         /* Size of available flash in 
bytes */
+       u8 blank_nvm_mode;                      /* is NVM empty (no FW present) 
*/
+};
+
+#endif /* _IXGBE_TYPE_E610_H_ */
diff --git a/drivers/net/ixgbe/base/meson.build 
b/drivers/net/ixgbe/base/meson.build
index f6497014da..7e4fbdfa0f 100644
--- a/drivers/net/ixgbe/base/meson.build
+++ b/drivers/net/ixgbe/base/meson.build
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017-2020 Intel Corporation
+# Copyright(c) 2017-2024 Intel Corporation
 
 sources = [
         'ixgbe_82598.c',
@@ -9,8 +9,10 @@ sources = [
         'ixgbe_dcb_82598.c',
         'ixgbe_dcb_82599.c',
         'ixgbe_dcb.c',
+        'ixgbe_e610.c',
         'ixgbe_hv_vf.c',
         'ixgbe_mbx.c',
+        'ixgbe_osdep.c',
         'ixgbe_phy.c',
         'ixgbe_vf.c',
         'ixgbe_x540.c',
-- 
2.43.0


Reply via email to