qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v1 2/3] e1000: improve auto-negotiation reporting vi


From: Gabriel L. Somlo
Subject: [Qemu-devel] [PATCH v1 2/3] e1000: improve auto-negotiation reporting via mii-tool
Date: Mon, 16 Jun 2014 13:29:10 -0400

Using mii-tool (on F20-live), the following output is produced:

  SIOCGMIIREG on ens3 failed: Input/output error
  ens3: no autonegotiation, 1000baseT-FD flow-control, link ok

The first line (SIOCGMIIREG error) is due to mii-tool's inability
to read the PHY auto-negotiation expansion register.
On the second line, "no autonegotiation" is wrong, and caused by
the absence of a flag in the link partner ability register which
would indicate that our link partner has acked us. This flag not
documented in the Intel e1000 manual (bit shown as "reserved"),
but mii-tool uses it as LPA_LPACK from /usr/include/linux/mii.h.

This patch adds read access to PHY_AUTONEG_EXP and defines the
link partner ack flag, allowing mii-tool to generate output as
normally expected:

  ens3: negotiated 1000baseT-FD flow-control, link ok

Signed-off-by: Gabriel Somlo <address@hidden>
---

Checkpatch generates two errors for this patch, related to where
PHY_AUTONEG_EXP is added to phy_regcap:

  ERROR: code indent should never use tabs
  #56: FILE: hw/net/e1000.c:232:
  +    [PHY_ID2] = PHY_R,^I^I[M88E1000_PHY_SPEC_STATUS] = PHY_R,$

  ERROR: space prohibited before open square bracket '['
  #56: FILE: hw/net/e1000.c:232:
  +    [PHY_ID2] = PHY_R,         [M88E1000_PHY_SPEC_STATUS] = PHY_R,

  total: 2 errors, 0 warnings, 32 lines checked

I merely added a comma at the end of the [PHY_ID2]... line, so I can
add the entry for PHY_AUTONEG_EXP. Tabs are there in all previous
lines, so not much of a choice unless we want to rat-hole into replacing
tabs everywhere first...

Thanks,
  Gabriel


 hw/net/e1000.c      | 5 ++++-
 hw/net/e1000_regs.h | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index f0070ca..04e4044 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -176,6 +176,7 @@ e1000_link_down(E1000State *s)
     s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
     s->phy_reg[PHY_STATUS] &= ~MII_SR_LINK_STATUS;
     s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
+    s->phy_reg[PHY_LP_ABILITY] &= ~MII_LPAR_LPACK;
 }
 
 static void
@@ -209,6 +210,7 @@ e1000_autoneg_timer(void *opaque)
     E1000State *s = opaque;
     if (!qemu_get_queue(s->nic)->link_down) {
         e1000_link_up(s);
+        s->phy_reg[PHY_LP_ABILITY] |= MII_LPAR_LPACK;
         s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
         DBGOUT(PHY, "Auto negotiation is completed\n");
     }
@@ -227,7 +229,8 @@ static const char phy_regcap[0x20] = {
     [PHY_CTRL] = PHY_RW,       [PHY_1000T_CTRL] = PHY_RW,
     [PHY_LP_ABILITY] = PHY_R,  [PHY_1000T_STATUS] = PHY_R,
     [PHY_AUTONEG_ADV] = PHY_RW,        [M88E1000_RX_ERR_CNTR] = PHY_R,
-    [PHY_ID2] = PHY_R,         [M88E1000_PHY_SPEC_STATUS] = PHY_R
+    [PHY_ID2] = PHY_R,         [M88E1000_PHY_SPEC_STATUS] = PHY_R,
+    [PHY_AUTONEG_EXP] = PHY_R,
 };
 
 /* PHY_ID2 documented in 8254x_GBe_SDM.pdf, pp. 250 */
diff --git a/hw/net/e1000_regs.h b/hw/net/e1000_regs.h
index 13ac671..60b96aa 100644
--- a/hw/net/e1000_regs.h
+++ b/hw/net/e1000_regs.h
@@ -384,6 +384,9 @@
 #define MII_SR_100X_FD_CAPS      0x4000        /* 100X  Full Duplex Capable */
 #define MII_SR_100T4_CAPS        0x8000        /* 100T4 Capable */
 
+/* PHY Link Partner Ability Register */
+#define MII_LPAR_LPACK           0x4000 /* Acked by link partner */
+
 /* Interrupt Cause Read */
 #define E1000_ICR_TXDW          0x00000001 /* Transmit desc written back */
 #define E1000_ICR_TXQE          0x00000002 /* Transmit Queue empty */
-- 
1.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]