[phantom] Allow for PXE boot to be enabled/disabled on a per-port basis
authorMichael Brown <mcb30@etherboot.org>
Sat, 1 Nov 2008 01:55:13 +0000 (01:55 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sat, 1 Nov 2008 01:55:13 +0000 (01:55 +0000)
This is something of an ugly hack to accommodate an OEM requirement.
The NIC has only one expansion ROM BAR, rather than one per port.  To
allow individual ports to be selectively enabled/disabled for PXE boot
(as required), we must therefore leave the expansion ROM always
enabled, and place the per-port enable/disable logic within the gPXE
driver.

src/drivers/net/phantom/phantom.c
src/drivers/net/phantom/phantom.h

index 3b2fbfd..40fc953 100644 (file)
@@ -1937,6 +1937,32 @@ static void phantom_get_macaddr ( struct phantom_nic *phantom,
               phantom, eth_ntoa ( ll_addr ) );
 }
 
+/**
+ * Check Phantom is enabled for boot
+ *
+ * @v phanton_port     Phantom NIC
+ * @ret rc             Return status code
+ *
+ * This is something of an ugly hack to accommodate an OEM
+ * requirement.  The NIC has only one expansion ROM BAR, rather than
+ * one per port.  To allow individual ports to be selectively
+ * enabled/disabled for PXE boot (as required), we must therefore
+ * leave the expansion ROM always enabled, and place the per-port
+ * enable/disable logic within the gPXE driver.
+ */
+static int phantom_check_boot_enable ( struct phantom_nic *phantom ) {
+       unsigned long boot_enable;
+
+       boot_enable = phantom_readl ( phantom, UNM_CAM_RAM_BOOT_ENABLE );
+       if ( ! ( boot_enable & ( 1 << phantom->port ) ) ) {
+               DBGC ( phantom, "Phantom %p PXE boot is disabled\n",
+                      phantom );
+               return -ENOTSUP;
+       }
+
+       return 0;
+}
+
 /**
  * Initialise Phantom receive PEG
  *
@@ -2034,6 +2060,10 @@ static int phantom_probe ( struct pci_device *pci,
        /* Read MAC addresses */
        phantom_get_macaddr ( phantom, netdev->ll_addr );
 
+       /* Skip if boot disabled on NIC */
+       if ( ( rc = phantom_check_boot_enable ( phantom ) ) != 0 )
+               goto err_check_boot_enable;
+
        /* Register network devices */
        if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
                DBGC ( phantom, "Phantom %p could not register net device: "
@@ -2056,6 +2086,7 @@ static int phantom_probe ( struct pci_device *pci,
  err_register_settings:
        unregister_netdev ( netdev );
  err_register_netdev:
+ err_check_boot_enable:
  err_init_rcvpeg:
  err_init_cmdpeg:
        phantom_halt_pegs ( phantom );
index c62a230..974eeca 100644 (file)
@@ -109,6 +109,7 @@ enum unm_reg_blocks {
 #define UNM_CAM_RAM_CLP_STATUS_DONE            0x00000002UL
 #define UNM_CAM_RAM_CLP_STATUS_ERROR           0x0000ff00UL
 #define UNM_CAM_RAM_CLP_STATUS_UNINITIALISED   0xffffffffUL
+#define UNM_CAM_RAM_BOOT_ENABLE                ( UNM_CAM_RAM + 0x000fc )
 #define UNM_CAM_RAM_WOL_PORT_MODE      ( UNM_CAM_RAM + 0x00198 )
 #define UNM_CAM_RAM_MAC_ADDRS          ( UNM_CAM_RAM + 0x001c0 )
 #define UNM_CAM_RAM_COLD_BOOT          ( UNM_CAM_RAM + 0x001fc )