From: Jason Wang <jasowang@redhat.com>
To: Jeff Kirsher <jeffrey.t.kirsher@intel.com>,
davem@davemloft.net, David Ertman <davidx.m.ertman@intel.com>
Cc: netdev@vger.kernel.org, gospo@redhat.com, sassmann@redhat.com,
Shawn Rader <shawn.t.rader@intel.com>
Subject: Re: [net 6/6] e1000e: fix overrun of PHY RAR array
Date: Tue, 17 Dec 2013 15:13:45 +0800 [thread overview]
Message-ID: <52AFF9A9.3050307@redhat.com> (raw)
In-Reply-To: <1379106730-14994-7-git-send-email-jeffrey.t.kirsher@intel.com>
On 09/14/2013 05:12 AM, Jeff Kirsher wrote:
> From: David Ertman <davidx.m.ertman@intel.com>
>
> When copying the MAC RAR registers to PHY there is an error in the
> calculation of the rar_entry_count, which causes a write of unknown/
> undefined register space in the MAC to unknown/undefined register space in
> the PHY.
>
> This patch fixes the overrun with writing to the PHY RAR and also fixes the
> ethtool offline register tests so that the correctly addressed registers
> have the appropriate bitmasks for R/W and RO bits for affected parts.
>
> Shawn Rader gets credit for finding and fixing the register overrun.
>
> Signed-off-by: Dave Ertman <davidx.m.ertman@intel.com>
> CC: Shawn Rader <shawn.t.rader@intel.com>
> Tested-by: Aaron Brown <aaron.f.brown@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> ---
> drivers/net/ethernet/intel/e1000e/ethtool.c | 8 ++++++++
> drivers/net/ethernet/intel/e1000e/ich8lan.c | 13 ++++++++-----
> drivers/net/ethernet/intel/e1000e/ich8lan.h | 2 +-
> 3 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c
> index a8633b8..d14c8f5 100644
> --- a/drivers/net/ethernet/intel/e1000e/ethtool.c
> +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c
> @@ -922,6 +922,14 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
> else
> mask &= ~(1 << 30);
> }
> + if (mac->type == e1000_pch2lan) {
> + /* SHRAH[0,1,2] different than previous */
> + if (i == 7)
> + mask &= 0xFFF4FFFF;
> + /* SHRAH[3] different than SHRAH[0,1,2] */
> + if (i == 10)
> + mask |= (1 << 30);
> + }
>
> REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), mask,
> 0xFFFFFFFF);
> diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
> index af08188..42f0f67 100644
> --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
> +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
> @@ -1371,7 +1371,10 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
> return;
> }
>
> - if (index < hw->mac.rar_entry_count) {
> + /* RAR[1-6] are owned by manageability. Skip those and program the
> + * next address into the SHRA register array.
> + */
> + if (index < (u32)(hw->mac.rar_entry_count - 6)) {
> s32 ret_val;
This looks wrong. The caller writes the addresses in the reverse order,
so the first index we get here is E1000_PCH2_RAR_ENTRIES - 1 which
obviously fails the check. So nothing were write to RAR/SHA.
This breaks macvtap guest, and after I revert this patch, it works.
Also the comment above looks confused, it said the RAR[1-6] should be
skipped, but E1000_PCH2_RAR_ENTRIES takes it into account which may need
some explanation.
>
> ret_val = e1000_acquire_swflag_ich8lan(hw);
> @@ -1962,8 +1965,8 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw)
> if (ret_val)
> goto release;
>
> - /* Copy both RAL/H (rar_entry_count) and SHRAL/H (+4) to PHY */
> - for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) {
> + /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */
> + for (i = 0; i < (hw->mac.rar_entry_count); i++) {
> mac_reg = er32(RAL(i));
> hw->phy.ops.write_reg_page(hw, BM_RAR_L(i),
> (u16)(mac_reg & 0xFFFF));
> @@ -2007,10 +2010,10 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
> return ret_val;
>
> if (enable) {
> - /* Write Rx addresses (rar_entry_count for RAL/H, +4 for
> + /* Write Rx addresses (rar_entry_count for RAL/H, and
> * SHRAL/H) and initial CRC values to the MAC
> */
> - for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) {
> + for (i = 0; i < hw->mac.rar_entry_count; i++) {
> u8 mac_addr[ETH_ALEN] = { 0 };
> u32 addr_high, addr_low;
>
> diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h
> index 5986569..217090d 100644
> --- a/drivers/net/ethernet/intel/e1000e/ich8lan.h
> +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h
> @@ -98,7 +98,7 @@
> #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL
>
> #define E1000_ICH_RAR_ENTRIES 7
> -#define E1000_PCH2_RAR_ENTRIES 5 /* RAR[0], SHRA[0-3] */
> +#define E1000_PCH2_RAR_ENTRIES 11 /* RAR[0-6], SHRA[0-3] */
> #define E1000_PCH_LPT_RAR_ENTRIES 12 /* RAR[0], SHRA[0-10] */
>
> #define PHY_PAGE_SHIFT 5
next prev parent reply other threads:[~2013-12-17 7:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-13 21:12 [net 0/6][pull request] Intel Wired LAN Driver Updates Jeff Kirsher
2013-09-13 21:12 ` [net 1/6] ixgbe: fully disable hardware RSC logic when disabling RSC Jeff Kirsher
2013-09-13 21:12 ` [net 2/6] ixgbe: fix ethtool loopback diagnostic with DCB enabled Jeff Kirsher
2013-09-13 21:12 ` [net 3/6] ixgbe: limit setting speed to only one at a time for QSFP modules Jeff Kirsher
2013-09-13 21:12 ` [net 4/6] ixgbe: fix ethtool reporting of supported links for SFP modules Jeff Kirsher
2013-09-13 21:12 ` [net 5/6] e1000e: cleanup boolean comparison to true Jeff Kirsher
2013-09-13 21:12 ` [net 6/6] e1000e: fix overrun of PHY RAR array Jeff Kirsher
2013-12-17 7:13 ` Jason Wang [this message]
2013-09-13 23:37 ` [net 0/6][pull request] Intel Wired LAN Driver Updates David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52AFF9A9.3050307@redhat.com \
--to=jasowang@redhat.com \
--cc=davem@davemloft.net \
--cc=davidx.m.ertman@intel.com \
--cc=gospo@redhat.com \
--cc=jeffrey.t.kirsher@intel.com \
--cc=netdev@vger.kernel.org \
--cc=sassmann@redhat.com \
--cc=shawn.t.rader@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.