From nobody Fri Sep 20 02:18:55 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4X8wzz1nbZz5WPhW; Fri, 20 Sep 2024 02:18:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4X8wzz0vyFz48tx; Fri, 20 Sep 2024 02:18:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1726798735; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mJMpcZ7ToE1An1cN2tCpbfpaVWFjXYa3DdadKPVayxY=; b=lzTpMh4Q5mtigshiY8LMePs8x8fzcIBcr9wDorEHN3Nsw+gFMq9IEk7CRUrENp2proINGs jOqD8E5vc5sWSTrLh2oyOkEo33ghxpAv/kAactOtNP6uSSqu2Sopl5oHN4Tm2Fj08DXxIt tS1VC4ttRmcIyCecIlOG8SzXU9kRLCtyPpCjqU081TnxdRVVJdcUy6T0UfEINOp8OGuCRW hctSgaZgFdOVLnsZjYr9nGznvGZQ3UBDcT3tZe7qPzkHG9P2/2ezRF94wjUSxbS5sCKQ2u rGzQrDmv4LlcstoIAYnYNcE5uLCqg4xCvw6RWCIjx2G1ADLHP/PT0f/T4OGRBg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1726798735; a=rsa-sha256; cv=none; b=ho6AzWzhEW0Yw81Wri+hRHIJQFqizxH/BvMj2yqw/klLXw4079IYoK9A4YNerq/Wik3AqT Iy96kuHTd1t9cviPFvU3la4ooa6QzHMHLfD6/46p1wp48kncDjvtNg5mi9sw+rgVJRxFQ+ QqiLSK5AMvofOOP4HLDvtzxiDCUexgwq/+NDBGBXmioFUtEA5jvO+U4yFurnfA3j79cQlA TRNLlw1DY+tLxE0VP0q8beGzh6WZXC6+kshc4ZVWXDcoflf5gEowbZ6TnQGHe8F9SN5qGf doO1MgIjOO0ehirlaE1+hS5E+pBZ/dezj/rCoqMr1KbSmhrC9MFbCoJx4ynLXg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1726798735; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mJMpcZ7ToE1An1cN2tCpbfpaVWFjXYa3DdadKPVayxY=; b=tJgtRxZhIc9xt/kSkp7q/lj/Tk3INs9OAJ7PlNemKVntddgFtdwdkLEULCdfJL0oJoMZdq Aiqz24ofi09V+VM+P3xnFQ6UJoEbBoeJPL0te54gWosIW82I/6jrx9mMHLwoEldZTeB+Zh 6Jl+BjpRWiGWcVQMKNejDkNTziJXDElHymI6JURuUNzKY5jMbcXJt/hnS4ksqIMFJNE1qG WzWz0kP2/s/W8JUYwAKMfjEG8ikDcCwzyj8+dxrYnGwMjFequAoIfHvCcd2wf+wOipZxjF mMHb1ekbtpAzg8q3EPp8/JZWgG+1WSjNvpPigxr//Pck/pS/yFjkaiQl38ITZw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4X8wzz0WWvzX5L; Fri, 20 Sep 2024 02:18:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 48K2It2D048591; Fri, 20 Sep 2024 02:18:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 48K2It2I048588; Fri, 20 Sep 2024 02:18:55 GMT (envelope-from git) Date: Fri, 20 Sep 2024 02:18:55 GMT Message-Id: <202409200218.48K2It2I048588@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kevin Bowling Subject: git: d80c12ba682a - main - Revert "ixgbe: introduce new mailbox API" List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d80c12ba682a6f23791f3d6e657f9e603b152aa2 Auto-Submitted: auto-generated The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=d80c12ba682a6f23791f3d6e657f9e603b152aa2 commit d80c12ba682a6f23791f3d6e657f9e603b152aa2 Author: Kevin Bowling AuthorDate: 2024-09-20 02:18:25 +0000 Commit: Kevin Bowling 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 ***