[intelxl] Use admin queue to get port MAC address

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>
pull/697/head^2
Michael Brown 2022-03-18 12:41:33 +00:00
parent 06467ee70f
commit 727b034f11
2 changed files with 82 additions and 51 deletions

View 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:

View 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 {