]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[intelxl] Use admin queue to get port MAC address
authorMichael Brown <mcb30@ipxe.org>
Fri, 18 Mar 2022 12:41:33 +0000 (12:41 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 12 Aug 2022 12:03:12 +0000 (13:03 +0100)
Remove knowledge of the PRTPM_SA[HL] registers, and instead use the
admin queue to retrieve the MAC address.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/intelxl.c
src/drivers/net/intelxl.h

index 438657fd34fb2514c035ace26cc56245bfc1c365..dcc8db562076ab2d61873cc254102a682eb8258f 100644 (file)
@@ -44,47 +44,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  */
 
-/******************************************************************************
- *
- * MAC address
- *
- ******************************************************************************
- */
-
-/**
- * Fetch initial MAC address and maximum frame size
- *
- * @v intelxl          Intel device
- * @v netdev           Network device
- * @ret rc             Return status code
- */
-static int intelxl_fetch_mac ( struct intelxl_nic *intelxl,
-                              struct net_device *netdev ) {
-       union intelxl_receive_address mac;
-       uint32_t prtpm_sal;
-       uint32_t prtpm_sah;
-
-       /* Read NVM-loaded address */
-       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 ) ) {
-               DBGC ( intelxl, "INTELXL %p has invalid MAC address (%s)\n",
-                      intelxl, eth_ntoa ( mac.raw ) );
-               return -ENOENT;
-       }
-
-       /* Copy MAC address */
-       DBGC ( intelxl, "INTELXL %p has autoloaded MAC address %s\n",
-              intelxl, eth_ntoa ( mac.raw ) );
-       memcpy ( netdev->hw_addr, mac.raw, ETH_ALEN );
-
-       return 0;
-}
-
 /******************************************************************************
  *
  * MSI-X interrupts
@@ -528,6 +487,54 @@ static int intelxl_admin_shutdown ( struct intelxl_nic *intelxl ) {
        return 0;
 }
 
+/**
+ * Get MAC address
+ *
+ * @v netdev           Network device
+ * @ret rc             Return status code
+ */
+static int intelxl_admin_mac_read ( struct net_device *netdev ) {
+       struct intelxl_nic *intelxl = netdev->priv;
+       struct intelxl_admin_descriptor *cmd;
+       struct intelxl_admin_mac_read_params *read;
+       union intelxl_admin_buffer *buf;
+       uint8_t *mac;
+       int rc;
+
+       /* Populate descriptor */
+       cmd = intelxl_admin_command_descriptor ( intelxl );
+       cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_MAC_READ );
+       cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_BUF );
+       cmd->len = cpu_to_le16 ( sizeof ( buf->mac_read ) );
+       read = &cmd->params.mac_read;
+       buf = intelxl_admin_command_buffer ( intelxl );
+       mac = buf->mac_read.pf;
+
+       /* Issue command */
+       if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 )
+               return rc;
+
+       /* Check that MAC address is present in response */
+       if ( ! ( read->valid & INTELXL_ADMIN_MAC_READ_VALID_LAN ) ) {
+               DBGC ( intelxl, "INTELXL %p has no MAC address\n", intelxl );
+               return -ENOENT;
+       }
+
+       /* Check that address is valid */
+       if ( ! is_valid_ether_addr ( mac ) ) {
+               DBGC ( intelxl, "INTELXL %p has invalid MAC address (%s)\n",
+                      intelxl, eth_ntoa ( mac ) );
+               return -ENOENT;
+       }
+
+       /* Copy MAC address */
+       DBGC ( intelxl, "INTELXL %p has MAC address %s\n",
+              intelxl, eth_ntoa ( mac ) );
+       memcpy ( netdev->hw_addr, mac, ETH_ALEN );
+
+       return 0;
+}
+
 /**
  * Clear PXE mode
  *
@@ -1721,9 +1728,9 @@ static int intelxl_probe ( struct pci_device *pci ) {
        if ( ( rc = intelxl_admin_promisc ( intelxl ) ) != 0 )
                goto err_admin_promisc;
 
-       /* Fetch MAC address and maximum frame size */
-       if ( ( rc = intelxl_fetch_mac ( intelxl, netdev ) ) != 0 )
-               goto err_fetch_mac;
+       /* Get MAC address */
+       if ( ( rc = intelxl_admin_mac_read ( netdev ) ) != 0 )
+               goto err_admin_mac_read;
 
        /* Configure queue register addresses */
        intelxl->tx.reg = INTELXL_QTX ( intelxl->queue );
@@ -1756,7 +1763,7 @@ static int intelxl_probe ( struct pci_device *pci ) {
 
        unregister_netdev ( netdev );
  err_register_netdev:
- err_fetch_mac:
+ err_admin_mac_read:
  err_admin_promisc:
  err_admin_vsi:
  err_admin_switch:
index ddd3e888c0229d9c96ffbe53a333ae622c4c0797..610b30140121bb249e42865aa3bdf2fb0f62de75 100644 (file)
@@ -145,6 +145,32 @@ struct intelxl_admin_shutdown_params {
 /** Driver is unloading */
 #define INTELXL_ADMIN_SHUTDOWN_UNLOADING 0x01
 
+/** Admin queue Manage MAC Address Read command */
+#define INTELXL_ADMIN_MAC_READ 0x0107
+
+/** Admin queue Manage MAC Address Read command parameters */
+struct intelxl_admin_mac_read_params {
+       /** Valid addresses */
+       uint8_t valid;
+       /** Reserved */
+       uint8_t reserved[15];
+} __attribute__ (( packed ));
+
+/** LAN MAC address is valid */
+#define INTELXL_ADMIN_MAC_READ_VALID_LAN 0x10
+
+/** Admin queue Manage MAC Address Read data buffer */
+struct intelxl_admin_mac_read_buffer {
+       /** Physical function MAC address */
+       uint8_t pf[ETH_ALEN];
+       /** Reserved */
+       uint8_t reserved[ETH_ALEN];
+       /** Port MAC address */
+       uint8_t port[ETH_ALEN];
+       /** Physical function wake-on-LAN MAC address */
+       uint8_t wol[ETH_ALEN];
+} __attribute__ (( packed ));
+
 /** Admin queue Clear PXE Mode command */
 #define INTELXL_ADMIN_CLEAR_PXE 0x0110
 
@@ -315,6 +341,8 @@ union intelxl_admin_params {
        struct intelxl_admin_driver_params driver;
        /** Shutdown command parameters */
        struct intelxl_admin_shutdown_params shutdown;
+       /** Manage MAC Address Read command parameters */
+       struct intelxl_admin_mac_read_params mac_read;
        /** Clear PXE Mode command parameters */
        struct intelxl_admin_clear_pxe_params pxe;
        /** Get Switch Configuration command parameters */
@@ -336,6 +364,8 @@ union intelxl_admin_params {
 union intelxl_admin_buffer {
        /** Driver Version data buffer */
        struct intelxl_admin_driver_buffer driver;
+       /** Manage MAC Address Read data buffer */
+       struct intelxl_admin_mac_read_buffer mac_read;
        /** Get Switch Configuration data buffer */
        struct intelxl_admin_switch_buffer sw;
        /** Get VSI Parameters data buffer */
@@ -831,12 +861,6 @@ intelxl_init_ring ( struct intelxl_ring *ring, unsigned int count, size_t len,
 #define INTELXL_PRTGL_SAH 0x1e2140
 #define INTELXL_PRTGL_SAH_MFS(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 {