aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-11-20 19:12:24 +0000
committerMichael Brown <mcb30@ipxe.org>2020-11-20 19:15:30 +0000
commitb6eb17cbd790b8336a9a5fe1878008f905642c9b (patch)
tree133056cb75bfbdde0e0fbf5a45196857426351b8
parente10a40d41fa082ddbd5ccca1d1cc415815759f02 (diff)
downloadipxe-b6eb17cbd790b8336a9a5fe1878008f905642c9b.tar.gz
[intelxl] Read MAC address from PRTPM_SA[HL] instead of PRTGL_SA[HL]
The datasheet is fairly incomprehensible in terms of identifying the appropriate MAC address for use by the physical function driver. Choose to read the MAC address from PRTPM_SAH and PRTPM_SAL, which at least matches the MAC address as selected by the Linux i40e driver. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/intelxl.c12
-rw-r--r--src/drivers/net/intelxl.h6
2 files changed, 13 insertions, 5 deletions
diff --git a/src/drivers/net/intelxl.c b/src/drivers/net/intelxl.c
index d16b759e7..fda8effbd 100644
--- a/src/drivers/net/intelxl.c
+++ b/src/drivers/net/intelxl.c
@@ -87,15 +87,16 @@ static int intelxl_reset ( struct intelxl_nic *intelxl ) {
static int intelxl_fetch_mac ( struct intelxl_nic *intelxl,
struct net_device *netdev ) {
union intelxl_receive_address mac;
- uint32_t prtgl_sal;
+ uint32_t prtpm_sal;
+ uint32_t prtpm_sah;
uint32_t prtgl_sah;
size_t mfs;
/* Read NVM-loaded address */
- prtgl_sal = readl ( intelxl->regs + INTELXL_PRTGL_SAL );
- prtgl_sah = readl ( intelxl->regs + INTELXL_PRTGL_SAH );
- mac.reg.low = cpu_to_le32 ( prtgl_sal );
- mac.reg.high = cpu_to_le32 ( prtgl_sah );
+ prtpm_sal = readl ( intelxl->regs + INTELXL_PRTPM_SAL );
+ prtpm_sah = readl ( intelxl->regs + INTELXL_PRTPM_SAH );
+ mac.reg.low = cpu_to_le32 ( prtpm_sal );
+ mac.reg.high = cpu_to_le32 ( prtpm_sah );
/* Check that address is valid */
if ( ! is_valid_ether_addr ( mac.raw ) ) {
@@ -110,6 +111,7 @@ static int intelxl_fetch_mac ( struct intelxl_nic *intelxl,
memcpy ( netdev->hw_addr, mac.raw, ETH_ALEN );
/* Get maximum frame size */
+ prtgl_sah = readl ( intelxl->regs + INTELXL_PRTGL_SAH );
mfs = INTELXL_PRTGL_SAH_MFS_GET ( prtgl_sah );
netdev->max_pkt_len = ( mfs - 4 /* CRC */ );
diff --git a/src/drivers/net/intelxl.h b/src/drivers/net/intelxl.h
index 80586cef0..2d33ed8e9 100644
--- a/src/drivers/net/intelxl.h
+++ b/src/drivers/net/intelxl.h
@@ -1005,6 +1005,12 @@ intelxl_init_ring ( struct intelxl_ring *ring, unsigned int count, size_t len,
#define INTELXL_PRTGL_SAH_MFS_GET(x) ( (x) >> 16 ) /**< Max frame size */
#define INTELXL_PRTGL_SAH_MFS_SET(x) ( (x) << 16 ) /**< Max frame size */
+/** Physical Function MAC Address Low Register */
+#define INTELXL_PRTPM_SAL 0x1e4440
+
+/** Physical Function MAC Address High Register */
+#define INTELXL_PRTPM_SAH 0x1e44c0
+
/** Receive address */
union intelxl_receive_address {
struct {