]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[intelxl] Always issue "clear PXE mode" admin queue command
authorMichael Brown <mcb30@ipxe.org>
Thu, 17 Mar 2022 13:11:21 +0000 (13:11 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 11 Aug 2022 14:28:03 +0000 (15:28 +0100)
Remove knowledge of the GLLAN_RCTL_0 register (which changes location
between the XL810 and E810 register maps), and instead unconditionally
issue the "clear PXE mode" command with the EEXIST error silenced.

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

index c73285a6110579bf6b24588c5acecf2fdf6e6a26..3cba4ccc34007d512841387656a84408bc679bc4 100644 (file)
@@ -544,20 +544,12 @@ static int intelxl_admin_shutdown ( struct intelxl_nic *intelxl ) {
 static int intelxl_admin_clear_pxe ( struct intelxl_nic *intelxl ) {
        struct intelxl_admin_descriptor *cmd;
        struct intelxl_admin_clear_pxe_params *pxe;
-       uint32_t gllan_rctl_0;
        int rc;
 
-       /* Do nothing if device is already out of PXE mode */
-       gllan_rctl_0 = readl ( intelxl->regs + INTELXL_GLLAN_RCTL_0 );
-       if ( ! ( gllan_rctl_0 & INTELXL_GLLAN_RCTL_0_PXE_MODE ) ) {
-               DBGC2 ( intelxl, "INTELXL %p already in non-PXE mode\n",
-                       intelxl );
-               return 0;
-       }
-
        /* Populate descriptor */
        cmd = intelxl_admin_command_descriptor ( intelxl );
        cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_CLEAR_PXE );
+       cmd->ret = cpu_to_le16 ( INTELXL_ADMIN_EEXIST );
        pxe = &cmd->params.pxe;
        pxe->magic = INTELXL_ADMIN_CLEAR_PXE_MAGIC;
 
@@ -565,6 +557,13 @@ static int intelxl_admin_clear_pxe ( struct intelxl_nic *intelxl ) {
        if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 )
                return rc;
 
+       /* Check for expected errors */
+       if ( cmd->ret == cpu_to_le16 ( INTELXL_ADMIN_EEXIST ) ) {
+               DBGC ( intelxl, "INTELXL %p already in non-PXE mode\n",
+                      intelxl );
+               return 0;
+       }
+
        return 0;
 }
 
index 28893945dd6093a5b55ef83e1f0f3e2698b29946..7e4932619bb28b7c9ca81822661b6bb8c761e634 100644 (file)
@@ -377,6 +377,9 @@ struct intelxl_admin_descriptor {
 /** Admin descriptor uses data buffer */
 #define INTELXL_ADMIN_FL_BUF 0x1000
 
+/** Error: attempt to create something that already exists */
+#define INTELXL_ADMIN_EEXIST 13
+
 /** Admin queue */
 struct intelxl_admin {
        /** Descriptors */
@@ -577,10 +580,6 @@ struct intelxl_context_rx {
 /** Queue Tail Pointer Register (offset) */
 #define INTELXL_QXX_TAIL 0x8000
 
-/** Global RLAN Control 0 register */
-#define INTELXL_GLLAN_RCTL_0 0x12a500
-#define INTELXL_GLLAN_RCTL_0_PXE_MODE  0x00000001UL    /**< PXE mode */
-
 /** Transmit data descriptor */
 struct intelxl_tx_data_descriptor {
        /** Buffer address */