Commit 3f39a5e9 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

sfc: Fix reporting of PHY id

Shuffle bits of the OUI into the conventional written order.

Replace PHY id component macros with functions.

Zero-pad PHY id components in log messages.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f794fd44
...@@ -17,6 +17,21 @@ ...@@ -17,6 +17,21 @@
#include "boards.h" #include "boards.h"
#include "workarounds.h" #include "workarounds.h"
unsigned mdio_id_oui(u32 id)
{
unsigned oui = 0;
int i;
/* The bits of the OUI are designated a..x, with a=0 and b variable.
* In the id register c is the MSB but the OUI is conventionally
* written as bytes h..a, p..i, x..q. Reorder the bits accordingly. */
for (i = 0; i < 22; ++i)
if (id & (1 << (i + 10)))
oui |= 1 << (i ^ 7);
return oui;
}
int mdio_clause45_reset_mmd(struct efx_nic *port, int mmd, int mdio_clause45_reset_mmd(struct efx_nic *port, int mmd,
int spins, int spintime) int spins, int spintime)
{ {
......
...@@ -70,10 +70,10 @@ ...@@ -70,10 +70,10 @@
#define MDIO_MMDREG_STAT1_LPABLE_LBN (1) #define MDIO_MMDREG_STAT1_LPABLE_LBN (1)
#define MDIO_MMDREG_STAT1_LPABLE_WIDTH (1) #define MDIO_MMDREG_STAT1_LPABLE_WIDTH (1)
/* Bits in ID reg */ /* Bits in combined ID regs */
#define MDIO_ID_REV(_id32) (_id32 & 0xf) static inline unsigned mdio_id_rev(u32 id) { return id & 0xf; }
#define MDIO_ID_MODEL(_id32) ((_id32 >> 4) & 0x3f) static inline unsigned mdio_id_model(u32 id) { return (id >> 4) & 0x3f; }
#define MDIO_ID_OUI(_id32) (_id32 >> 10) extern unsigned mdio_id_oui(u32 id);
/* Bits in MMDREG_DEVS0/1. Someone thoughtfully layed things out /* Bits in MMDREG_DEVS0/1. Someone thoughtfully layed things out
* so the 'bit present' bit number of an MMD is the number of * so the 'bit present' bit number of an MMD is the number of
......
...@@ -88,9 +88,9 @@ static int xfp_phy_init(struct efx_nic *efx) ...@@ -88,9 +88,9 @@ static int xfp_phy_init(struct efx_nic *efx)
return -ENOMEM; return -ENOMEM;
efx->phy_data = phy_data; efx->phy_data = phy_data;
EFX_INFO(efx, "PHY ID reg %x (OUI %x model %x revision %x)\n", EFX_INFO(efx, "PHY ID reg %x (OUI %06x model %02x revision %x)\n",
devid, MDIO_ID_OUI(devid), MDIO_ID_MODEL(devid), devid, mdio_id_oui(devid), mdio_id_model(devid),
MDIO_ID_REV(devid)); mdio_id_rev(devid));
phy_data->phy_mode = efx->phy_mode; phy_data->phy_mode = efx->phy_mode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment