git: d80c12ba682a - main - Revert "ixgbe: introduce new mailbox API"

From: Kevin Bowling <kbowling_at_FreeBSD.org>
Date: Fri, 20 Sep 2024 02:18:55 UTC
The branch main has been updated by kbowling:

URL: https://cgit.FreeBSD.org/src/commit/?id=d80c12ba682a6f23791f3d6e657f9e603b152aa2

commit d80c12ba682a6f23791f3d6e657f9e603b152aa2
Author:     Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2024-09-20 02:18:25 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2024-09-20 02:18:25 +0000

    Revert "ixgbe: introduce new mailbox API"
    
    This is missing the ixgbe_mbx.h changes, revert so it can be
    committed atomically.
    
    This reverts commit 68ba3eabd4869577bf11c03a6ec6f472502be07d.
---
 sys/dev/ixgbe/if_ix.c       |   7 +-
 sys/dev/ixgbe/ixgbe_82599.c |   4 +-
 sys/dev/ixgbe/ixgbe_mbx.c   | 839 ++++++++++++--------------------------------
 sys/dev/ixgbe/ixgbe_type.h  |  32 +-
 sys/dev/ixgbe/ixgbe_vf.c    |  42 +--
 sys/dev/ixgbe/ixgbe_x540.c  |   4 +-
 6 files changed, 278 insertions(+), 650 deletions(-)

diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c
index ed41f6b66e09..17f1f73a526e 100644
--- a/sys/dev/ixgbe/if_ix.c
+++ b/sys/dev/ixgbe/if_ix.c
@@ -879,7 +879,6 @@ ixgbe_if_attach_pre(if_ctx_t ctx)
 	struct ixgbe_hw *hw;
 	int             error = 0;
 	u32             ctrl_ext;
-	size_t i;
 
 	INIT_DEBUGOUT("ixgbe_attach: begin");
 
@@ -929,10 +928,8 @@ ixgbe_if_attach_pre(if_ctx_t ctx)
 		goto err_pci;
 	}
 
-	if (hw->mbx.ops[0].init_params) {
-		for (i = 0; i < sc->num_vfs; i++)
-			hw->mbx.ops[i].init_params(hw);
-	}
+	if (hw->mbx.ops.init_params)
+		hw->mbx.ops.init_params(hw);
 
 	hw->allow_unsupported_sfp = allow_unsupported_sfp;
 
diff --git a/sys/dev/ixgbe/ixgbe_82599.c b/sys/dev/ixgbe/ixgbe_82599.c
index 70b4cdc5c6ca..8c3df0fd4f59 100644
--- a/sys/dev/ixgbe/ixgbe_82599.c
+++ b/sys/dev/ixgbe/ixgbe_82599.c
@@ -324,7 +324,6 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw)
 	struct ixgbe_phy_info *phy = &hw->phy;
 	struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
 	s32 ret_val;
-	u16 i;
 
 	DEBUGFUNC("ixgbe_init_ops_82599");
 
@@ -386,8 +385,7 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw)
 	mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
 				      & IXGBE_FWSM_MODE_MASK);
 
-	for (i = 0; i < 64; i++)
-		hw->mbx.ops[i].init_params = ixgbe_init_mbx_params_pf;
+	hw->mbx.ops.init_params = ixgbe_init_mbx_params_pf;
 
 	/* EEPROM */
 	eeprom->ops.read = ixgbe_read_eeprom_82599;
diff --git a/sys/dev/ixgbe/ixgbe_mbx.c b/sys/dev/ixgbe/ixgbe_mbx.c
index 0a0c5abde157..c8f839fce85a 100644
--- a/sys/dev/ixgbe/ixgbe_mbx.c
+++ b/sys/dev/ixgbe/ixgbe_mbx.c
@@ -35,9 +35,6 @@
 #include "ixgbe_type.h"
 #include "ixgbe_mbx.h"
 
-static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id);
-static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id);
-
 /**
  * ixgbe_read_mbx - Reads a message from the mailbox
  * @hw: pointer to the HW structure
@@ -50,91 +47,42 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id);
 s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_read_mbx");
 
 	/* limit read to size of mailbox */
-	if (size > mbx->size) {
-		ERROR_REPORT3(IXGBE_ERROR_ARGUMENT,
-			      "Invalid mailbox message size %u, changing to %u",
-			      size, mbx->size);
-		size = mbx->size;
-	}
-
-	if (mbx->ops[mbx_id].read)
-		return mbx->ops[mbx_id].read(hw, msg, size, mbx_id);
-
-	return IXGBE_ERR_CONFIG;
-}
-
-/**
- * ixgbe_poll_mbx - Wait for message and read it from the mailbox
- * @hw: pointer to the HW structure
- * @msg: The message buffer
- * @size: Length of buffer
- * @mbx_id: id of mailbox to read
- *
- * returns SUCCESS if it successfully read message from buffer
- **/
-s32 ixgbe_poll_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
-{
-	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	s32 ret_val;
-
-	DEBUGFUNC("ixgbe_poll_mbx");
-
-	if (!mbx->ops[mbx_id].read || !mbx->ops[mbx_id].check_for_msg ||
-	    !mbx->timeout)
-		return IXGBE_ERR_CONFIG;
-
-	/* limit read to size of mailbox */
-	if (size > mbx->size) {
-		ERROR_REPORT3(IXGBE_ERROR_ARGUMENT,
-			      "Invalid mailbox message size %u, changing to %u",
-			      size, mbx->size);
+	if (size > mbx->size)
 		size = mbx->size;
-	}
 
-	ret_val = ixgbe_poll_for_msg(hw, mbx_id);
-	/* if ack received read message, otherwise we timed out */
-	if (!ret_val)
-		return mbx->ops[mbx_id].read(hw, msg, size, mbx_id);
+	if (mbx->ops.read)
+		ret_val = mbx->ops.read(hw, msg, size, mbx_id);
 
 	return ret_val;
 }
 
 /**
- * ixgbe_write_mbx - Write a message to the mailbox and wait for ACK
+ * ixgbe_write_mbx - Write a message to the mailbox
  * @hw: pointer to the HW structure
  * @msg: The message buffer
  * @size: Length of buffer
  * @mbx_id: id of mailbox to write
  *
- * returns SUCCESS if it successfully copied message into the buffer and
- * received an ACK to that message within specified period
+ * returns SUCCESS if it successfully copied message into the buffer
  **/
 s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	s32 ret_val = IXGBE_ERR_MBX;
+	s32 ret_val = IXGBE_SUCCESS;
 
 	DEBUGFUNC("ixgbe_write_mbx");
 
-	/*
-	 * exit if either we can't write, release
-	 * or there is no timeout defined
-	 */
-	if (!mbx->ops[mbx_id].write || !mbx->ops[mbx_id].check_for_ack ||
-	    !mbx->ops[mbx_id].release || !mbx->timeout)
-		return IXGBE_ERR_CONFIG;
-
 	if (size > mbx->size) {
-		ret_val = IXGBE_ERR_PARAM;
+		ret_val = IXGBE_ERR_MBX;
 		ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
-			     "Invalid mailbox message size %u", size);
-	} else {
-		ret_val = mbx->ops[mbx_id].write(hw, msg, size, mbx_id);
-	}
+			     "Invalid mailbox message size %d", size);
+	} else if (mbx->ops.write)
+		ret_val = mbx->ops.write(hw, msg, size, mbx_id);
 
 	return ret_val;
 }
@@ -149,12 +97,12 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
 s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	s32 ret_val = IXGBE_ERR_CONFIG;
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_check_for_msg");
 
-	if (mbx->ops[mbx_id].check_for_msg)
-		ret_val = mbx->ops[mbx_id].check_for_msg(hw, mbx_id);
+	if (mbx->ops.check_for_msg)
+		ret_val = mbx->ops.check_for_msg(hw, mbx_id);
 
 	return ret_val;
 }
@@ -169,12 +117,12 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
 s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	s32 ret_val = IXGBE_ERR_CONFIG;
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_check_for_ack");
 
-	if (mbx->ops[mbx_id].check_for_ack)
-		ret_val = mbx->ops[mbx_id].check_for_ack(hw, mbx_id);
+	if (mbx->ops.check_for_ack)
+		ret_val = mbx->ops.check_for_ack(hw, mbx_id);
 
 	return ret_val;
 }
@@ -189,12 +137,12 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
 s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	s32 ret_val = IXGBE_ERR_CONFIG;
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_check_for_rst");
 
-	if (mbx->ops[mbx_id].check_for_rst)
-		ret_val = mbx->ops[mbx_id].check_for_rst(hw, mbx_id);
+	if (mbx->ops.check_for_rst)
+		ret_val = mbx->ops.check_for_rst(hw, mbx_id);
 
 	return ret_val;
 }
@@ -213,23 +161,22 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
 
 	DEBUGFUNC("ixgbe_poll_for_msg");
 
-	if (!countdown || !mbx->ops[mbx_id].check_for_msg)
-		return IXGBE_ERR_CONFIG;
+	if (!countdown || !mbx->ops.check_for_msg)
+		goto out;
 
-	while (countdown && mbx->ops[mbx_id].check_for_msg(hw, mbx_id)) {
+	while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
 		countdown--;
 		if (!countdown)
 			break;
 		usec_delay(mbx->usec_delay);
 	}
 
-	if (countdown == 0) {
+	if (countdown == 0)
 		ERROR_REPORT2(IXGBE_ERROR_POLLING,
-			   "Polling for VF%u mailbox message timedout", mbx_id);
-		return IXGBE_ERR_TIMEOUT;
-	}
+			   "Polling for VF%d mailbox message timedout", mbx_id);
 
-	return IXGBE_SUCCESS;
+out:
+	return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 }
 
 /**
@@ -246,71 +193,115 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
 
 	DEBUGFUNC("ixgbe_poll_for_ack");
 
-	if (!countdown || !mbx->ops[mbx_id].check_for_ack)
-		return IXGBE_ERR_CONFIG;
+	if (!countdown || !mbx->ops.check_for_ack)
+		goto out;
 
-	while (countdown && mbx->ops[mbx_id].check_for_ack(hw, mbx_id)) {
+	while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
 		countdown--;
 		if (!countdown)
 			break;
 		usec_delay(mbx->usec_delay);
 	}
 
-	if (countdown == 0) {
+	if (countdown == 0)
 		ERROR_REPORT2(IXGBE_ERROR_POLLING,
-			     "Polling for VF%u mailbox ack timedout", mbx_id);
-		return IXGBE_ERR_TIMEOUT;
-	}
+			     "Polling for VF%d mailbox ack timedout", mbx_id);
 
-	return IXGBE_SUCCESS;
+out:
+	return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 }
 
 /**
- * ixgbe_read_mailbox_vf - read VF's mailbox register
+ * ixgbe_read_posted_mbx - Wait for message notification and receive message
  * @hw: pointer to the HW structure
+ * @msg: The message buffer
+ * @size: Length of buffer
+ * @mbx_id: id of mailbox to write
  *
- * This function is used to read the mailbox register dedicated for VF without
- * losing the read to clear status bits.
+ * returns SUCCESS if it successfully received a message notification and
+ * copied it into the receive buffer.
  **/
-static u32 ixgbe_read_mailbox_vf(struct ixgbe_hw *hw)
+s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
+				 u16 mbx_id)
 {
-	u32 vf_mailbox = IXGBE_READ_REG(hw, IXGBE_VFMAILBOX);
+	struct ixgbe_mbx_info *mbx = &hw->mbx;
+	s32 ret_val = IXGBE_ERR_MBX;
+
+	DEBUGFUNC("ixgbe_read_posted_mbx");
+
+	if (!mbx->ops.read)
+		goto out;
 
-	vf_mailbox |= hw->mbx.vf_mailbox;
-	hw->mbx.vf_mailbox |= vf_mailbox % IXGBE_VFMAILBOX_R2C_BITS;
+	ret_val = ixgbe_poll_for_msg(hw, mbx_id);
 
-	return vf_mailbox;
+	/* if ack received read message, otherwise we timed out */
+	if (!ret_val)
+		ret_val = mbx->ops.read(hw, msg, size, mbx_id);
+out:
+	return ret_val;
 }
 
-static void ixgbe_clear_msg_vf(struct ixgbe_hw *hw)
+/**
+ * ixgbe_write_posted_mbx - Write a message to the mailbox, wait for ack
+ * @hw: pointer to the HW structure
+ * @msg: The message buffer
+ * @size: Length of buffer
+ * @mbx_id: id of mailbox to write
+ *
+ * returns SUCCESS if it successfully copied message into the buffer and
+ * received an ack to that message within delay * timeout period
+ **/
+s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
+				  u16 mbx_id)
 {
-	u32 vf_mailbox = ixgbe_read_mailbox_vf(hw);
+	struct ixgbe_mbx_info *mbx = &hw->mbx;
+	s32 ret_val = IXGBE_ERR_MBX;
 
-	if (vf_mailbox & IXGBE_VFMAILBOX_PFSTS) {
-		hw->mbx.stats.reqs++;
-		hw->mbx.vf_mailbox &= ~IXGBE_VFMAILBOX_PFSTS;
-	}
+	DEBUGFUNC("ixgbe_write_posted_mbx");
+
+	/* exit if either we can't write or there isn't a defined timeout */
+	if (!mbx->ops.write || !mbx->timeout)
+		goto out;
+
+	/* send msg */
+	ret_val = mbx->ops.write(hw, msg, size, mbx_id);
+
+	/* if msg sent wait until we receive an ack */
+	if (!ret_val)
+		ret_val = ixgbe_poll_for_ack(hw, mbx_id);
+out:
+	return ret_val;
 }
 
-static void ixgbe_clear_ack_vf(struct ixgbe_hw *hw)
+/**
+ * ixgbe_init_mbx_ops_generic - Initialize MB function pointers
+ * @hw: pointer to the HW structure
+ *
+ * Setups up the mailbox read and write message function pointers
+ **/
+void ixgbe_init_mbx_ops_generic(struct ixgbe_hw *hw)
 {
-	u32 vf_mailbox = ixgbe_read_mailbox_vf(hw);
+	struct ixgbe_mbx_info *mbx = &hw->mbx;
 
-	if (vf_mailbox & IXGBE_VFMAILBOX_PFACK) {
-		hw->mbx.stats.acks++;
-		hw->mbx.vf_mailbox &= ~IXGBE_VFMAILBOX_PFACK;
-	}
+	mbx->ops.read_posted = ixgbe_read_posted_mbx;
+	mbx->ops.write_posted = ixgbe_write_posted_mbx;
 }
 
-static void ixgbe_clear_rst_vf(struct ixgbe_hw *hw)
+/**
+ * ixgbe_read_v2p_mailbox - read v2p mailbox
+ * @hw: pointer to the HW structure
+ *
+ * This function is used to read the v2p mailbox without losing the read to
+ * clear status bits.
+ **/
+static u32 ixgbe_read_v2p_mailbox(struct ixgbe_hw *hw)
 {
-	u32 vf_mailbox = ixgbe_read_mailbox_vf(hw);
+	u32 v2p_mailbox = IXGBE_READ_REG(hw, IXGBE_VFMAILBOX);
 
-	if (vf_mailbox & (IXGBE_VFMAILBOX_RSTI | IXGBE_VFMAILBOX_RSTD)) {
-		hw->mbx.stats.rsts++;
-		hw->mbx.vf_mailbox &= ~(IXGBE_VFMAILBOX_RSTI |
-					IXGBE_VFMAILBOX_RSTD);
-	}
+	v2p_mailbox |= hw->mbx.v2p_mailbox;
+	hw->mbx.v2p_mailbox |= v2p_mailbox & IXGBE_VFMAILBOX_R2C_BITS;
+
+	return v2p_mailbox;
 }
 
 /**
@@ -323,12 +314,15 @@ static void ixgbe_clear_rst_vf(struct ixgbe_hw *hw)
  **/
 static s32 ixgbe_check_for_bit_vf(struct ixgbe_hw *hw, u32 mask)
 {
-	u32 vf_mailbox = ixgbe_read_mailbox_vf(hw);
+	u32 v2p_mailbox = ixgbe_read_v2p_mailbox(hw);
+	s32 ret_val = IXGBE_ERR_MBX;
 
-	if (vf_mailbox & mask)
-		return IXGBE_SUCCESS;
+	if (v2p_mailbox & mask)
+		ret_val = IXGBE_SUCCESS;
 
-	return IXGBE_ERR_MBX;
+	hw->mbx.v2p_mailbox &= ~mask;
+
+	return ret_val;
 }
 
 /**
@@ -340,13 +334,17 @@ static s32 ixgbe_check_for_bit_vf(struct ixgbe_hw *hw, u32 mask)
  **/
 static s32 ixgbe_check_for_msg_vf(struct ixgbe_hw *hw, u16 mbx_id)
 {
+	s32 ret_val = IXGBE_ERR_MBX;
+
 	UNREFERENCED_1PARAMETER(mbx_id);
 	DEBUGFUNC("ixgbe_check_for_msg_vf");
 
-	if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFSTS))
-		return IXGBE_SUCCESS;
+	if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFSTS)) {
+		ret_val = IXGBE_SUCCESS;
+		hw->mbx.stats.reqs++;
+	}
 
-	return IXGBE_ERR_MBX;
+	return ret_val;
 }
 
 /**
@@ -358,16 +356,17 @@ static s32 ixgbe_check_for_msg_vf(struct ixgbe_hw *hw, u16 mbx_id)
  **/
 static s32 ixgbe_check_for_ack_vf(struct ixgbe_hw *hw, u16 mbx_id)
 {
+	s32 ret_val = IXGBE_ERR_MBX;
+
 	UNREFERENCED_1PARAMETER(mbx_id);
 	DEBUGFUNC("ixgbe_check_for_ack_vf");
 
 	if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFACK)) {
-		/* TODO: should this be autocleared? */
-		ixgbe_clear_ack_vf(hw);
-		return IXGBE_SUCCESS;
+		ret_val = IXGBE_SUCCESS;
+		hw->mbx.stats.acks++;
 	}
 
-	return IXGBE_ERR_MBX;
+	return ret_val;
 }
 
 /**
@@ -379,17 +378,18 @@ static s32 ixgbe_check_for_ack_vf(struct ixgbe_hw *hw, u16 mbx_id)
  **/
 static s32 ixgbe_check_for_rst_vf(struct ixgbe_hw *hw, u16 mbx_id)
 {
+	s32 ret_val = IXGBE_ERR_MBX;
+
 	UNREFERENCED_1PARAMETER(mbx_id);
 	DEBUGFUNC("ixgbe_check_for_rst_vf");
 
-	if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_RSTI |
-					  IXGBE_VFMAILBOX_RSTD)) {
-		/* TODO: should this be autocleared? */
-		ixgbe_clear_rst_vf(hw);
-		return IXGBE_SUCCESS;
+	if (!ixgbe_check_for_bit_vf(hw, (IXGBE_VFMAILBOX_RSTD |
+	    IXGBE_VFMAILBOX_RSTI))) {
+		ret_val = IXGBE_SUCCESS;
+		hw->mbx.stats.rsts++;
 	}
 
-	return IXGBE_ERR_MBX;
+	return ret_val;
 }
 
 /**
@@ -400,114 +400,20 @@ static s32 ixgbe_check_for_rst_vf(struct ixgbe_hw *hw, u16 mbx_id)
  **/
 static s32 ixgbe_obtain_mbx_lock_vf(struct ixgbe_hw *hw)
 {
-	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	int countdown = mbx->timeout;
 	s32 ret_val = IXGBE_ERR_MBX;
-	u32 vf_mailbox;
 
 	DEBUGFUNC("ixgbe_obtain_mbx_lock_vf");
 
-	if (!mbx->timeout)
-		return IXGBE_ERR_CONFIG;
-
-	while (countdown--) {
-		/* Reserve mailbox for VF use */
-		vf_mailbox = ixgbe_read_mailbox_vf(hw);
-		vf_mailbox |= IXGBE_VFMAILBOX_VFU;
-		IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, vf_mailbox);
-
-		/* Verify that VF is the owner of the lock */
-		if (ixgbe_read_mailbox_vf(hw) & IXGBE_VFMAILBOX_VFU) {
-			ret_val = IXGBE_SUCCESS;
-			break;
-		}
-
-		/* Wait a bit before trying again */
-		usec_delay(mbx->usec_delay);
-	}
+	/* Take ownership of the buffer */
+	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_VFU);
 
-	if (ret_val != IXGBE_SUCCESS) {
-		ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
-				"Failed to obtain mailbox lock");
-		ret_val = IXGBE_ERR_TIMEOUT;
-	}
+	/* reserve mailbox for vf use */
+	if (ixgbe_read_v2p_mailbox(hw) & IXGBE_VFMAILBOX_VFU)
+		ret_val = IXGBE_SUCCESS;
 
 	return ret_val;
 }
 
-/**
- * ixgbe_release_mbx_lock_dummy - release mailbox lock
- * @hw: pointer to the HW structure
- * @mbx_id: id of mailbox to read
- **/
-static void ixgbe_release_mbx_lock_dummy(struct ixgbe_hw *hw, u16 mbx_id)
-{
-	UNREFERENCED_2PARAMETER(hw, mbx_id);
-
-	DEBUGFUNC("ixgbe_release_mbx_lock_dummy");
-}
-
-/**
- * ixgbe_release_mbx_lock_vf - release mailbox lock
- * @hw: pointer to the HW structure
- * @mbx_id: id of mailbox to read
- **/
-static void ixgbe_release_mbx_lock_vf(struct ixgbe_hw *hw, u16 mbx_id)
-{
-	u32 vf_mailbox;
-
-	UNREFERENCED_1PARAMETER(mbx_id);
-
-	DEBUGFUNC("ixgbe_release_mbx_lock_vf");
-
-	/* Return ownership of the buffer */
-	vf_mailbox = ixgbe_read_mailbox_vf(hw);
-	vf_mailbox &= ~IXGBE_VFMAILBOX_VFU;
-	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, vf_mailbox);
-}
-
-/**
- * ixgbe_write_mbx_vf_legacy - Write a message to the mailbox
- * @hw: pointer to the HW structure
- * @msg: The message buffer
- * @size: Length of buffer
- * @mbx_id: id of mailbox to write
- *
- * returns SUCCESS if it successfully copied message into the buffer
- **/
-static s32 ixgbe_write_mbx_vf_legacy(struct ixgbe_hw *hw, u32 *msg, u16 size,
-				     u16 mbx_id)
-{
-	s32 ret_val;
-	u16 i;
-
-	UNREFERENCED_1PARAMETER(mbx_id);
-	DEBUGFUNC("ixgbe_write_mbx_vf_legacy");
-
-	/* lock the mailbox to prevent pf/vf race condition */
-	ret_val = ixgbe_obtain_mbx_lock_vf(hw);
-	if (ret_val)
-		return ret_val;
-
-	/* flush msg and acks as we are overwriting the message buffer */
-	ixgbe_check_for_msg_vf(hw, 0);
-	ixgbe_clear_msg_vf(hw);
-	ixgbe_check_for_ack_vf(hw, 0);
-	ixgbe_clear_ack_vf(hw);
-
-	/* copy the caller specified message to the mailbox memory buffer */
-	for (i = 0; i < size; i++)
-		IXGBE_WRITE_REG_ARRAY(hw, IXGBE_VFMBMEM, i, msg[i]);
-
-	/* update stats */
-	hw->mbx.stats.msgs_tx++;
-
-	/* interrupt the PF to tell it a message has been sent */
-	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ);
-
-	return IXGBE_SUCCESS;
-}
-
 /**
  * ixgbe_write_mbx_vf - Write a message to the mailbox
  * @hw: pointer to the HW structure
@@ -520,7 +426,6 @@ static s32 ixgbe_write_mbx_vf_legacy(struct ixgbe_hw *hw, u32 *msg, u16 size,
 static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 			      u16 mbx_id)
 {
-	u32 vf_mailbox;
 	s32 ret_val;
 	u16 i;
 
@@ -531,11 +436,11 @@ static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 	/* lock the mailbox to prevent pf/vf race condition */
 	ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 	if (ret_val)
-		goto out;
+		goto out_no_write;
 
 	/* flush msg and acks as we are overwriting the message buffer */
-	ixgbe_clear_msg_vf(hw);
-	ixgbe_clear_ack_vf(hw);
+	ixgbe_check_for_msg_vf(hw, 0);
+	ixgbe_check_for_ack_vf(hw, 0);
 
 	/* copy the caller specified message to the mailbox memory buffer */
 	for (i = 0; i < size; i++)
@@ -544,22 +449,15 @@ static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 	/* update stats */
 	hw->mbx.stats.msgs_tx++;
 
-	/* interrupt the PF to tell it a message has been sent */
-	vf_mailbox = ixgbe_read_mailbox_vf(hw);
-	vf_mailbox |= IXGBE_VFMAILBOX_REQ;
-	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, vf_mailbox);
-
-	/* if msg sent wait until we receive an ack */
-	ixgbe_poll_for_ack(hw, mbx_id);
-
-out:
-	hw->mbx.ops[mbx_id].release(hw, mbx_id);
+	/* Drop VFU and interrupt the PF to tell it a message has been sent */
+	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ);
 
+out_no_write:
 	return ret_val;
 }
 
 /**
- * ixgbe_read_mbx_vf_legacy - Reads a message from the inbox intended for vf
+ * ixgbe_read_mbx_vf - Reads a message from the inbox intended for vf
  * @hw: pointer to the HW structure
  * @msg: The message buffer
  * @size: Length of buffer
@@ -567,19 +465,19 @@ out:
  *
  * returns SUCCESS if it successfully read message from buffer
  **/
-static s32 ixgbe_read_mbx_vf_legacy(struct ixgbe_hw *hw, u32 *msg, u16 size,
-				 u16 mbx_id)
+static s32 ixgbe_read_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
+			     u16 mbx_id)
 {
-	s32 ret_val;
+	s32 ret_val = IXGBE_SUCCESS;
 	u16 i;
 
-	DEBUGFUNC("ixgbe_read_mbx_vf_legacy");
+	DEBUGFUNC("ixgbe_read_mbx_vf");
 	UNREFERENCED_1PARAMETER(mbx_id);
 
 	/* lock the mailbox to prevent pf/vf race condition */
 	ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 	if (ret_val)
-		return ret_val;
+		goto out_no_read;
 
 	/* copy the message from the mailbox memory buffer */
 	for (i = 0; i < size; i++)
@@ -591,104 +489,34 @@ static s32 ixgbe_read_mbx_vf_legacy(struct ixgbe_hw *hw, u32 *msg, u16 size,
 	/* update stats */
 	hw->mbx.stats.msgs_rx++;
 
-	return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_read_mbx_vf - Reads a message from the inbox intended for vf
- * @hw: pointer to the HW structure
- * @msg: The message buffer
- * @size: Length of buffer
- * @mbx_id: id of mailbox to read
- *
- * returns SUCCESS if it successfully read message from buffer
- **/
-static s32 ixgbe_read_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
-			     u16 mbx_id)
-{
-	u32 vf_mailbox;
-	s32 ret_val;
-	u16 i;
-
-	DEBUGFUNC("ixgbe_read_mbx_vf");
-	UNREFERENCED_1PARAMETER(mbx_id);
-
-	/* check if there is a message from PF */
-	ret_val = ixgbe_check_for_msg_vf(hw, 0);
-	if (ret_val != IXGBE_SUCCESS)
-		return IXGBE_ERR_MBX_NOMSG;
-
-	ixgbe_clear_msg_vf(hw);
-
-	/* copy the message from the mailbox memory buffer */
-	for (i = 0; i < size; i++)
-		msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_VFMBMEM, i);
-
-	/* Acknowledge receipt */
-	vf_mailbox = ixgbe_read_mailbox_vf(hw);
-	vf_mailbox |= IXGBE_VFMAILBOX_ACK;
-	IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, vf_mailbox);
-
-	/* update stats */
-	hw->mbx.stats.msgs_rx++;
-
-	return IXGBE_SUCCESS;
+out_no_read:
+	return ret_val;
 }
 
 /**
  * ixgbe_init_mbx_params_vf - set initial values for vf mailbox
  * @hw: pointer to the HW structure
  *
- * Initializes single set the hw->mbx struct to correct values for vf mailbox
- * Set of legacy functions is being used here
- */
-void ixgbe_init_mbx_params_vf(struct ixgbe_hw *hw)
-{
-	struct ixgbe_mbx_info *mbx = &hw->mbx;
-
-	mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT;
-	mbx->usec_delay = IXGBE_VF_MBX_INIT_DELAY;
-
-	mbx->size = IXGBE_VFMAILBOX_SIZE;
-
-	/* VF has only one mailbox connection, no need for more IDs */
-	mbx->ops[0].release = ixgbe_release_mbx_lock_dummy;
-	mbx->ops[0].read = ixgbe_read_mbx_vf_legacy;
-	mbx->ops[0].write = ixgbe_write_mbx_vf_legacy;
-	mbx->ops[0].check_for_msg = ixgbe_check_for_msg_vf;
-	mbx->ops[0].check_for_ack = ixgbe_check_for_ack_vf;
-	mbx->ops[0].check_for_rst = ixgbe_check_for_rst_vf;
-
-	mbx->stats.msgs_tx = 0;
-	mbx->stats.msgs_rx = 0;
-	mbx->stats.reqs = 0;
-	mbx->stats.acks = 0;
-	mbx->stats.rsts = 0;
-}
-
-/**
- * ixgbe_upgrade_mbx_params_vf - set initial values for vf mailbox
- * @hw: pointer to the HW structure
- *
  * Initializes the hw->mbx struct to correct values for vf mailbox
  */
-void ixgbe_upgrade_mbx_params_vf(struct ixgbe_hw *hw)
+void ixgbe_init_mbx_params_vf(struct ixgbe_hw *hw)
 {
 	struct ixgbe_mbx_info *mbx = &hw->mbx;
 
-	mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT;
+	/* start mailbox as timed out and let the reset_hw call set the timeout
+	 * value to begin communications */
+	mbx->timeout = 0;
 	mbx->usec_delay = IXGBE_VF_MBX_INIT_DELAY;
 
 	mbx->size = IXGBE_VFMAILBOX_SIZE;
 
-	/* VF has only one mailbox connection, no need for more IDs */
-	mbx->ops[0].release = ixgbe_release_mbx_lock_vf;
-	mbx->ops[0].read = ixgbe_read_mbx_vf;
-	mbx->ops[0].write = ixgbe_write_mbx_vf;
-	mbx->ops[0].check_for_msg = ixgbe_check_for_msg_vf;
-	mbx->ops[0].check_for_ack = ixgbe_check_for_ack_vf;
-	mbx->ops[0].check_for_rst = ixgbe_check_for_rst_vf;
-	mbx->ops[0].clear = NULL;
+	mbx->ops.read = ixgbe_read_mbx_vf;
+	mbx->ops.write = ixgbe_write_mbx_vf;
+	mbx->ops.read_posted = ixgbe_read_posted_mbx;
+	mbx->ops.write_posted = ixgbe_write_posted_mbx;
+	mbx->ops.check_for_msg = ixgbe_check_for_msg_vf;
+	mbx->ops.check_for_ack = ixgbe_check_for_ack_vf;
+	mbx->ops.check_for_rst = ixgbe_check_for_rst_vf;
 
 	mbx->stats.msgs_tx = 0;
 	mbx->stats.msgs_rx = 0;
@@ -697,79 +525,54 @@ void ixgbe_upgrade_mbx_params_vf(struct ixgbe_hw *hw)
 	mbx->stats.rsts = 0;
 }
 
-static void ixgbe_clear_msg_pf(struct ixgbe_hw *hw, u16 vf_id)
-{
-	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_id);
-	s32 index = IXGBE_PFMBICR_INDEX(vf_id);
-	u32 pfmbicr;
-
-	pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index));
-
-	if (pfmbicr & (IXGBE_PFMBICR_VFREQ_VF1 << vf_shift))
-		hw->mbx.stats.reqs++;
-
-	IXGBE_WRITE_REG(hw, IXGBE_PFMBICR(index),
-			IXGBE_PFMBICR_VFREQ_VF1 << vf_shift);
-}
-
-static void ixgbe_clear_ack_pf(struct ixgbe_hw *hw, u16 vf_id)
-{
-	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_id);
-	s32 index = IXGBE_PFMBICR_INDEX(vf_id);
-	u32 pfmbicr;
-
-	pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index));
-
-	if (pfmbicr & (IXGBE_PFMBICR_VFACK_VF1 << vf_shift))
-		hw->mbx.stats.acks++;
-
-	IXGBE_WRITE_REG(hw, IXGBE_PFMBICR(index),
-			IXGBE_PFMBICR_VFACK_VF1 << vf_shift);
-}
-
 static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
 {
 	u32 pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index));
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	if (pfmbicr & mask) {
-		return IXGBE_SUCCESS;
+		ret_val = IXGBE_SUCCESS;
+		IXGBE_WRITE_REG(hw, IXGBE_PFMBICR(index), mask);
 	}
 
-	return IXGBE_ERR_MBX;
+	return ret_val;
 }
 
 /**
  * ixgbe_check_for_msg_pf - checks to see if the VF has sent mail
  * @hw: pointer to the HW structure
- * @vf_id: the VF index
+ * @vf_number: the VF index
  *
  * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  **/
-static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_id)
+static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
 {
-	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_id);
-	s32 index = IXGBE_PFMBICR_INDEX(vf_id);
+	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_number);
+	s32 index = IXGBE_PFMBICR_INDEX(vf_number);
+	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_check_for_msg_pf");
 
 	if (!ixgbe_check_for_bit_pf(hw, IXGBE_PFMBICR_VFREQ_VF1 << vf_shift,
-				    index))
-		return IXGBE_SUCCESS;
+				    index)) {
+		ret_val = IXGBE_SUCCESS;
+		hw->mbx.stats.reqs++;
+	}
 
-	return IXGBE_ERR_MBX;
+	return ret_val;
 }
 
 /**
  * ixgbe_check_for_ack_pf - checks to see if the VF has ACKed
  * @hw: pointer to the HW structure
- * @vf_id: the VF index
+ * @vf_number: the VF index
  *
  * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  **/
-static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_id)
+static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)
 {
-	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_id);
-	s32 index = IXGBE_PFMBICR_INDEX(vf_id);
+	u32 vf_shift = IXGBE_PFMBICR_SHIFT(vf_number);
+	s32 index = IXGBE_PFMBICR_INDEX(vf_number);
 	s32 ret_val = IXGBE_ERR_MBX;
 
 	DEBUGFUNC("ixgbe_check_for_ack_pf");
@@ -777,8 +580,7 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_id)
 	if (!ixgbe_check_for_bit_pf(hw, IXGBE_PFMBICR_VFACK_VF1 << vf_shift,
 				    index)) {
 		ret_val = IXGBE_SUCCESS;
-		/* TODO: should this be autocleared? */
-		ixgbe_clear_ack_pf(hw, vf_id);
+		hw->mbx.stats.acks++;
 	}
 
 	return ret_val;
@@ -787,14 +589,14 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_id)
 /**
  * ixgbe_check_for_rst_pf - checks to see if the VF has reset
  * @hw: pointer to the HW structure
- * @vf_id: the VF index
+ * @vf_number: the VF index
  *
  * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  **/
-static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_id)
+static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
 {
-	u32 vf_shift = IXGBE_PFVFLRE_SHIFT(vf_id);
-	u32 index = IXGBE_PFVFLRE_INDEX(vf_id);
+	u32 vf_shift = IXGBE_PFVFLRE_SHIFT(vf_number);
+	u32 index = IXGBE_PFVFLRE_INDEX(vf_number);
 	s32 ret_val = IXGBE_ERR_MBX;
 	u32 vflre = 0;
 
@@ -826,268 +628,121 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_id)
 /**
  * ixgbe_obtain_mbx_lock_pf - obtain mailbox lock
  * @hw: pointer to the HW structure
- * @vf_id: the VF index
+ * @vf_number: the VF index
  *
  * return SUCCESS if we obtained the mailbox lock
  **/
-static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_id)
+static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
 {
-	struct ixgbe_mbx_info *mbx = &hw->mbx;
-	int countdown = mbx->timeout;
 	s32 ret_val = IXGBE_ERR_MBX;
-	u32 pf_mailbox;
+	u32 p2v_mailbox;
 
 	DEBUGFUNC("ixgbe_obtain_mbx_lock_pf");
 
-	if (!mbx->timeout)
-		return IXGBE_ERR_CONFIG;
-
-	while (countdown--) {
-		/* Reserve mailbox for PF use */
-		pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id));
-		pf_mailbox |= IXGBE_PFMAILBOX_PFU;
-		IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), pf_mailbox);
-
-		/* Verify that PF is the owner of the lock */
-		pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id));
-		if (pf_mailbox & IXGBE_PFMAILBOX_PFU) {
-			ret_val = IXGBE_SUCCESS;
-			break;
-		}
+	/* Take ownership of the buffer */
+	IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU);
 
-		/* Wait a bit before trying again */
*** 557 LINES SKIPPED ***