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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).