summaryrefslogtreecommitdiffstats
path: root/src/drivers
diff options
context:
space:
mode:
authorMichael Brown2011-02-10 17:40:56 +0100
committerMichael Brown2011-03-03 03:40:12 +0100
commite809985ca90425af37fbbae0e60f6f76bc029cf9 (patch)
tree14d3198d65ee891a40824fe38aac394ea6d3f266 /src/drivers
parent[bofm] Allow garbage collection of BOFM code in non-BOFM builds (diff)
downloadipxe-e809985ca90425af37fbbae0e60f6f76bc029cf9.tar.gz
ipxe-e809985ca90425af37fbbae0e60f6f76bc029cf9.tar.xz
ipxe-e809985ca90425af37fbbae0e60f6f76bc029cf9.zip
[hermon] Add BOFM support
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/infiniband/MT25408_PRM.h121
-rw-r--r--src/drivers/infiniband/hermon.c327
-rw-r--r--src/drivers/infiniband/hermon.h25
3 files changed, 415 insertions, 58 deletions
diff --git a/src/drivers/infiniband/MT25408_PRM.h b/src/drivers/infiniband/MT25408_PRM.h
index fac39c82..cc248daf 100644
--- a/src/drivers/infiniband/MT25408_PRM.h
+++ b/src/drivers/infiniband/MT25408_PRM.h
@@ -1335,7 +1335,11 @@ struct hermonprm_virtual_physical_mapping_st { /* Little Endian */
/* MOD_STAT_CFG #### michal - gdror fix */
struct hermonprm_mod_stat_cfg_st { /* Little Endian */
- pseudo_bit_t reserved0[0x00010];
+ pseudo_bit_t log_pg_sz[0x00008];
+ pseudo_bit_t log_pg_sz_m[0x00001];
+ pseudo_bit_t reserved0[0x00005];
+ pseudo_bit_t dife[0x00001];
+ pseudo_bit_t dife_m[0x00001];
pseudo_bit_t rx_options[0x00004]; /* number of RX options to sweep when doing SerDes parameters AutoNegotiation. */
pseudo_bit_t reserved1[0x00003];
pseudo_bit_t rx_options_m[0x00001]; /* Modify rx_options */
@@ -1343,46 +1347,129 @@ struct hermonprm_mod_stat_cfg_st { /* Little Endian */
pseudo_bit_t reserved2[0x00003];
pseudo_bit_t tx_options_m[0x00001]; /* Modify tx_options */
/* -------------- */
- pseudo_bit_t reserved3[0x00020];
+ pseudo_bit_t reserved3[0x00010];
+ pseudo_bit_t qdr_rx_options[0x00004];
+ pseudo_bit_t reserved4[0x00003];
+ pseudo_bit_t qdr_rx_options_m[0x00001];
+ pseudo_bit_t qdr_tx_options[0x00004];
+ pseudo_bit_t reserved5[0x00003];
+ pseudo_bit_t qdr_tx_options_m[0x00001];
/* -------------- */
- pseudo_bit_t pre_amp[0x00004]; /* Pre Amplitude */
- pseudo_bit_t pre_emp_pre_amp[0x00004];
- pseudo_bit_t pre_emp_out[0x00004]; /* Pre Emphasis Out */
- pseudo_bit_t voltage[0x00004];
- pseudo_bit_t equ[0x00004]; /* Equalization */
- pseudo_bit_t reserved4[0x0000b];
- pseudo_bit_t serdes_m[0x00001]; /* Modify serdes parameters */
+ pseudo_bit_t reserved6[0x00020];
/* -------------- */
pseudo_bit_t lid[0x00010]; /* default LID */
pseudo_bit_t lid_m[0x00001]; /* Modify default LID */
- pseudo_bit_t reserved5[0x00003];
+ pseudo_bit_t reserved7[0x00003];
pseudo_bit_t port_en[0x00001]; /* enable port (E_Key) */
pseudo_bit_t port_en_m[0x00001]; /* Modify port_en */
- pseudo_bit_t reserved6[0x0000a];
+ pseudo_bit_t reserved8[0x00002];
+ pseudo_bit_t port_pause_mode[0x00002];
+ pseudo_bit_t reserved9[0x00001];
+ pseudo_bit_t port_pause_mode_m[0x00001];
+ pseudo_bit_t reserved10[0x00004];
/* -------------- */
- pseudo_bit_t reserved7[0x0001f];
+ pseudo_bit_t reserved11[0x0001f];
pseudo_bit_t guid_hi_m[0x00001]; /* Modify guid_hi */
/* -------------- */
pseudo_bit_t guid_hi[0x00020];
/* -------------- */
- pseudo_bit_t reserved8[0x0001f];
+ pseudo_bit_t reserved12[0x0001f];
pseudo_bit_t guid_lo_m[0x00001]; /* Modify guid_lo */
/* -------------- */
pseudo_bit_t guid_lo[0x00020];
/* -------------- */
- pseudo_bit_t reserved9[0x0001f];
+ pseudo_bit_t reserved13[0x0001f];
pseudo_bit_t nodeguid_hi_m[0x00001];
/* -------------- */
pseudo_bit_t nodeguid_hi[0x00020];
/* -------------- */
- pseudo_bit_t reserved10[0x0001f];
+ pseudo_bit_t reserved14[0x0001f];
pseudo_bit_t nodeguid_lo_m[0x00001];
/* -------------- */
pseudo_bit_t nodeguid_lo[0x00020];
/* -------------- */
- pseudo_bit_t reserved11[0x00680];
+ pseudo_bit_t ob_preemp_pre[0x00005];
+ pseudo_bit_t reserved15[0x00003];
+ pseudo_bit_t ob_preemp_post[0x00005];
+ pseudo_bit_t reserved16[0x00003];
+ pseudo_bit_t ob_preemp_main[0x00005];
+ pseudo_bit_t reserved17[0x00003];
+ pseudo_bit_t ob_preemp[0x00005];
+ pseudo_bit_t reserved18[0x00002];
+ pseudo_bit_t serdes_m[0x00001];
/* -------------- */
-};
+ pseudo_bit_t inbuf_ind_en[0x00003];
+ pseudo_bit_t reserved19[0x00001];
+ pseudo_bit_t sd_main[0x00004];
+ pseudo_bit_t reserved20[0x00004];
+ pseudo_bit_t sd_equal[0x00004];
+ pseudo_bit_t reserved21[0x00004];
+ pseudo_bit_t sd_mux_main[0x00002];
+ pseudo_bit_t reserved22[0x00002];
+ pseudo_bit_t mux_eq[0x00002];
+ pseudo_bit_t reserved23[0x00002];
+ pseudo_bit_t sigdet_th[0x00003];
+ pseudo_bit_t reserved24[0x00001];
+/* -------------- */
+ pseudo_bit_t reserved25[0x00040];
+/* -------------- */
+ pseudo_bit_t port_protocol[0x00008];
+ pseudo_bit_t port_dual[0x00001];
+ pseudo_bit_t reserved26[0x00006];
+ pseudo_bit_t port_protocol_m[0x00001];
+ pseudo_bit_t num_port[0x00008];
+ pseudo_bit_t reserved27[0x00008];
+/* -------------- */
+ pseudo_bit_t port_protocol_vpi[0x00008];
+ pseudo_bit_t reserved28[0x00018];
+/* -------------- */
+ pseudo_bit_t reserved29[0x00180];
+/* -------------- */
+ pseudo_bit_t fw_rev_major[0x00010];
+ pseudo_bit_t reserved30[0x0000f];
+ pseudo_bit_t fw_rev_support[0x00001];
+/* -------------- */
+ pseudo_bit_t fw_rev_minor[0x00010];
+ pseudo_bit_t fw_rev_subminor[0x00010];
+/* -------------- */
+ pseudo_bit_t cmd_interface_rev[0x00010];
+ pseudo_bit_t reserved31[0x00010];
+/* -------------- */
+ pseudo_bit_t reserved32[0x00060];
+/* -------------- */
+ pseudo_bit_t mac_high[0x00010];
+ pseudo_bit_t reserved33[0x0000f];
+ pseudo_bit_t mac_m[0x00001];
+/* -------------- */
+ pseudo_bit_t mac_low[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved34[0x00010];
+ pseudo_bit_t num_veps[0x00008];
+ pseudo_bit_t num_vep_groups[0x00008];
+/* -------------- */
+ pseudo_bit_t reserved35[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved36[0x00018];
+ pseudo_bit_t outer_vlan_en[0x00001];
+ pseudo_bit_t reserved37[0x00002];
+ pseudo_bit_t outer_vlan_en_m[0x00001];
+ pseudo_bit_t port_net_boot[0x00001];
+ pseudo_bit_t reserved38[0x00002];
+ pseudo_bit_t port_net_boot_m[0x00001];
+/* -------------- */
+ pseudo_bit_t reserved39[0x00060];
+/* -------------- */
+ pseudo_bit_t port_eth_mode_capability[0x0001f];
+ pseudo_bit_t reserved40[0x00001];
+/* -------------- */
+ pseudo_bit_t port_eth_mode_enabled[0x0001f];
+ pseudo_bit_t port_eth_mod_m[0x00001];
+/* -------------- */
+ pseudo_bit_t port_eth_mode_current[0x0001f];
+ pseudo_bit_t reserved41[0x00001];
+/* -------------- */
+ pseudo_bit_t reserved42[0x00220];
+};
/* SRQ Context */
diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c
index 011892f2..043f2a68 100644
--- a/src/drivers/infiniband/hermon.c
+++ b/src/drivers/infiniband/hermon.c
@@ -40,6 +40,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/ethernet.h>
#include <ipxe/fcoe.h>
#include <ipxe/vlan.h>
+#include <ipxe/bofm.h>
#include "hermon.h"
/**
@@ -497,6 +498,17 @@ hermon_cmd_mgid_hash ( struct hermon *hermon, const union ib_gid *gid,
}
static inline int
+hermon_cmd_mod_stat_cfg ( struct hermon *hermon, unsigned int mode,
+ unsigned int input_mod,
+ struct hermonprm_scalar_parameter *portion ) {
+ return hermon_cmd ( hermon,
+ HERMON_HCR_INOUT_CMD ( HERMON_HCR_MOD_STAT_CFG,
+ 0, sizeof ( *portion ),
+ 0, sizeof ( *portion ) ),
+ mode, portion, input_mod, portion );
+}
+
+static inline int
hermon_cmd_query_port ( struct hermon *hermon, unsigned int port,
struct hermonprm_query_port_cap *query_port ) {
return hermon_cmd ( hermon,
@@ -684,6 +696,59 @@ static void hermon_free_mtt ( struct hermon *hermon,
/***************************************************************************
*
+ * Static configuration operations
+ *
+ ***************************************************************************
+ */
+
+/**
+ * Calculate offset within static configuration
+ *
+ * @v field Field
+ * @ret offset Offset
+ */
+#define HERMON_MOD_STAT_CFG_OFFSET( field ) \
+ ( ( MLX_BIT_OFFSET ( struct hermonprm_mod_stat_cfg_st, field ) / 8 ) \
+ & ~( sizeof ( struct hermonprm_scalar_parameter ) - 1 ) )
+
+/**
+ * Query or modify static configuration
+ *
+ * @v hermon Hermon device
+ * @v port Port
+ * @v mode Command mode
+ * @v offset Offset within static configuration
+ * @v stat_cfg Static configuration
+ * @ret rc Return status code
+ */
+static int hermon_mod_stat_cfg ( struct hermon *hermon, unsigned int port,
+ unsigned int mode, unsigned int offset,
+ struct hermonprm_mod_stat_cfg *stat_cfg ) {
+ struct hermonprm_scalar_parameter *portion =
+ ( ( void * ) &stat_cfg->u.bytes[offset] );
+ struct hermonprm_mod_stat_cfg_input_mod mod;
+ int rc;
+
+ /* Sanity check */
+ assert ( ( offset % sizeof ( *portion ) ) == 0 );
+
+ /* Construct input modifier */
+ memset ( &mod, 0, sizeof ( mod ) );
+ MLX_FILL_2 ( &mod, 0,
+ portnum, port,
+ offset, offset );
+
+ /* Issue command */
+ if ( ( rc = hermon_cmd_mod_stat_cfg ( hermon, mode,
+ be32_to_cpu ( mod.u.dwords[0] ),
+ portion ) ) != 0 )
+ return rc;
+
+ return 0;
+}
+
+/***************************************************************************
+ *
* MAD operations
*
***************************************************************************
@@ -3232,6 +3297,103 @@ static void hermon_free_icm ( struct hermon *hermon ) {
/***************************************************************************
*
+ * BOFM interface
+ *
+ ***************************************************************************
+ */
+
+/**
+ * Harvest Ethernet MAC for BOFM
+ *
+ * @v bofm BOFM device
+ * @v mport Multi-port index
+ * @v mac MAC to fill in
+ * @ret rc Return status code
+ */
+static int hermon_bofm_harvest ( struct bofm_device *bofm, unsigned int mport,
+ uint8_t *mac ) {
+ struct hermon *hermon = container_of ( bofm, struct hermon, bofm );
+ struct hermonprm_mod_stat_cfg stat_cfg;
+ union {
+ uint8_t bytes[8];
+ uint32_t dwords[2];
+ } buf;
+ int rc;
+
+ /* Query static configuration */
+ if ( ( rc = hermon_mod_stat_cfg ( hermon, mport,
+ HERMON_MOD_STAT_CFG_QUERY,
+ HERMON_MOD_STAT_CFG_OFFSET ( mac_m ),
+ &stat_cfg ) ) != 0 ) {
+ DBGC ( hermon, "Hermon %p port %d could not query "
+ "configuration: %s\n", hermon, mport, strerror ( rc ) );
+ return rc;
+ }
+
+ /* Retrieve MAC address */
+ buf.dwords[0] = htonl ( MLX_GET ( &stat_cfg, mac_high ) );
+ buf.dwords[1] = htonl ( MLX_GET ( &stat_cfg, mac_low ) );
+ memcpy ( mac, &buf.bytes[ sizeof ( buf.bytes ) - ETH_ALEN ],
+ ETH_ALEN );
+
+ DBGC ( hermon, "Hermon %p port %d harvested MAC address %s\n",
+ hermon, mport, eth_ntoa ( mac ) );
+
+ return 0;
+}
+
+/**
+ * Update Ethernet MAC for BOFM
+ *
+ * @v bofm BOFM device
+ * @v mport Multi-port index
+ * @v mac MAC to fill in
+ * @ret rc Return status code
+ */
+static int hermon_bofm_update ( struct bofm_device *bofm, unsigned int mport,
+ const uint8_t *mac ) {
+ struct hermon *hermon = container_of ( bofm, struct hermon, bofm );
+ struct hermonprm_mod_stat_cfg stat_cfg;
+ union {
+ uint8_t bytes[8];
+ uint32_t dwords[2];
+ } buf;
+ int rc;
+
+ /* Prepare MAC address */
+ memset ( &buf, 0, sizeof ( buf ) );
+ memcpy ( &buf.bytes[ sizeof ( buf.bytes ) - ETH_ALEN ], mac,
+ ETH_ALEN );
+
+ /* Modify static configuration */
+ memset ( &stat_cfg, 0, sizeof ( stat_cfg ) );
+ MLX_FILL_2 ( &stat_cfg, 36,
+ mac_m, 1,
+ mac_high, ntohl ( buf.dwords[0] ) );
+ MLX_FILL_1 ( &stat_cfg, 37, mac_low, ntohl ( buf.dwords[1] ) );
+ if ( ( rc = hermon_mod_stat_cfg ( hermon, mport,
+ HERMON_MOD_STAT_CFG_SET,
+ HERMON_MOD_STAT_CFG_OFFSET ( mac_m ),
+ &stat_cfg ) ) != 0 ) {
+ DBGC ( hermon, "Hermon %p port %d could not modify "
+ "configuration: %s\n", hermon, mport, strerror ( rc ) );
+ return rc;
+ }
+
+ DBGC ( hermon, "Hermon %p port %d updated MAC address to %s\n",
+ hermon, mport, eth_ntoa ( mac ) );
+
+ return 0;
+}
+
+/** Hermon BOFM operations */
+static struct bofm_operations hermon_bofm_operations = {
+ .harvest = hermon_bofm_harvest,
+ .update = hermon_bofm_update,
+};
+
+/***************************************************************************
+ *
* PCI interface
*
***************************************************************************
@@ -3326,6 +3488,72 @@ static void hermon_reset ( struct hermon *hermon,
}
/**
+ * Allocate Hermon device
+ *
+ * @v pci PCI device
+ * @v id PCI ID
+ * @ret rc Return status code
+ */
+static struct hermon * hermon_alloc ( void ) {
+ struct hermon *hermon;
+
+ /* Allocate Hermon device */
+ hermon = zalloc ( sizeof ( *hermon ) );
+ if ( ! hermon )
+ goto err_hermon;
+
+ /* Allocate space for mailboxes */
+ hermon->mailbox_in = malloc_dma ( HERMON_MBOX_SIZE,
+ HERMON_MBOX_ALIGN );
+ if ( ! hermon->mailbox_in )
+ goto err_mailbox_in;
+ hermon->mailbox_out = malloc_dma ( HERMON_MBOX_SIZE,
+ HERMON_MBOX_ALIGN );
+ if ( ! hermon->mailbox_out )
+ goto err_mailbox_out;
+
+ return hermon;
+
+ free_dma ( hermon->mailbox_out, HERMON_MBOX_SIZE );
+ err_mailbox_out:
+ free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
+ err_mailbox_in:
+ free ( hermon );
+ err_hermon:
+ return NULL;
+}
+
+/**
+ * Free Hermon device
+ *
+ * @v hermon Hermon device
+ */
+static void hermon_free ( struct hermon *hermon ) {
+
+ free_dma ( hermon->mailbox_out, HERMON_MBOX_SIZE );
+ free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
+ free ( hermon );
+}
+
+/**
+ * Initialise Hermon PCI parameters
+ *
+ * @v hermon Hermon device
+ * @v pci PCI device
+ */
+static void hermon_pci_init ( struct hermon *hermon, struct pci_device *pci ) {
+
+ /* Fix up PCI device */
+ adjust_pci_device ( pci );
+
+ /* Get PCI BARs */
+ hermon->config = ioremap ( pci_bar_start ( pci, HERMON_PCI_CONFIG_BAR),
+ HERMON_PCI_CONFIG_BAR_SIZE );
+ hermon->uar = ioremap ( pci_bar_start ( pci, HERMON_PCI_UAR_BAR ),
+ HERMON_UAR_NON_EQ_PAGE * HERMON_PAGE_SIZE );
+}
+
+/**
* Probe PCI device
*
* @v pci PCI device
@@ -3342,39 +3570,19 @@ static int hermon_probe ( struct pci_device *pci ) {
int rc;
/* Allocate Hermon device */
- hermon = zalloc ( sizeof ( *hermon ) );
+ hermon = hermon_alloc();
if ( ! hermon ) {
rc = -ENOMEM;
- goto err_alloc_hermon;
+ goto err_alloc;
}
pci_set_drvdata ( pci, hermon );
- /* Fix up PCI device */
- adjust_pci_device ( pci );
-
- /* Get PCI BARs */
- hermon->config = ioremap ( pci_bar_start ( pci, HERMON_PCI_CONFIG_BAR),
- HERMON_PCI_CONFIG_BAR_SIZE );
- hermon->uar = ioremap ( pci_bar_start ( pci, HERMON_PCI_UAR_BAR ),
- HERMON_UAR_NON_EQ_PAGE * HERMON_PAGE_SIZE );
+ /* Initialise PCI parameters */
+ hermon_pci_init ( hermon, pci );
/* Reset device */
hermon_reset ( hermon, pci );
- /* Allocate space for mailboxes */
- hermon->mailbox_in = malloc_dma ( HERMON_MBOX_SIZE,
- HERMON_MBOX_ALIGN );
- if ( ! hermon->mailbox_in ) {
- rc = -ENOMEM;
- goto err_mailbox_in;
- }
- hermon->mailbox_out = malloc_dma ( HERMON_MBOX_SIZE,
- HERMON_MBOX_ALIGN );
- if ( ! hermon->mailbox_out ) {
- rc = -ENOMEM;
- goto err_mailbox_out;
- }
-
/* Start firmware */
if ( ( rc = hermon_start_firmware ( hermon ) ) != 0 )
goto err_start_firmware;
@@ -3483,12 +3691,8 @@ static int hermon_probe ( struct pci_device *pci ) {
err_get_cap:
hermon_stop_firmware ( hermon );
err_start_firmware:
- free_dma ( hermon->mailbox_out, HERMON_MBOX_SIZE );
- err_mailbox_out:
- free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
- err_mailbox_in:
- free ( hermon );
- err_alloc_hermon:
+ hermon_free ( hermon );
+ err_alloc:
return rc;
}
@@ -3511,15 +3715,65 @@ static void hermon_remove ( struct pci_device *pci ) {
hermon_free_icm ( hermon );
hermon_stop_firmware ( hermon );
hermon_stop_firmware ( hermon );
- free_dma ( hermon->mailbox_out, HERMON_MBOX_SIZE );
- free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
for ( i = ( hermon->cap.num_ports - 1 ) ; i >= 0 ; i-- ) {
netdev_nullify ( hermon->port[i].netdev );
netdev_put ( hermon->port[i].netdev );
}
for ( i = ( hermon->cap.num_ports - 1 ) ; i >= 0 ; i-- )
ibdev_put ( hermon->port[i].ibdev );
- free ( hermon );
+ hermon_free ( hermon );
+}
+
+/**
+ * Probe PCI device for BOFM
+ *
+ * @v pci PCI device
+ * @v id PCI ID
+ * @ret rc Return status code
+ */
+static int hermon_bofm_probe ( struct pci_device *pci ) {
+ struct hermon *hermon;
+ int rc;
+
+ /* Allocate Hermon device */
+ hermon = hermon_alloc();
+ if ( ! hermon ) {
+ rc = -ENOMEM;
+ goto err_alloc;
+ }
+ pci_set_drvdata ( pci, hermon );
+
+ /* Initialise PCI parameters */
+ hermon_pci_init ( hermon, pci );
+
+ /* Initialise BOFM device */
+ bofm_init ( &hermon->bofm, pci, &hermon_bofm_operations );
+
+ /* Register BOFM device */
+ if ( ( rc = bofm_register ( &hermon->bofm ) ) != 0 ) {
+ DBGC ( hermon, "Hermon %p could not register BOFM device: "
+ "%s\n", hermon, strerror ( rc ) );
+ goto err_bofm_register;
+ }
+
+ return 0;
+
+ err_bofm_register:
+ hermon_free ( hermon );
+ err_alloc:
+ return rc;
+}
+
+/**
+ * Remove PCI device for BOFM
+ *
+ * @v pci PCI device
+ */
+static void hermon_bofm_remove ( struct pci_device *pci ) {
+ struct hermon *hermon = pci_get_drvdata ( pci );
+
+ bofm_unregister ( &hermon->bofm );
+ hermon_free ( hermon );
}
static struct pci_device_id hermon_nics[] = {
@@ -3543,3 +3797,10 @@ struct pci_driver hermon_driver __pci_driver = {
.probe = hermon_probe,
.remove = hermon_remove,
};
+
+struct pci_driver hermon_bofm_driver __bofm_driver = {
+ .ids = hermon_nics,
+ .id_count = ( sizeof ( hermon_nics ) / sizeof ( hermon_nics[0] ) ),
+ .probe = hermon_bofm_probe,
+ .remove = hermon_bofm_remove,
+};
diff --git a/src/drivers/infiniband/hermon.h b/src/drivers/infiniband/hermon.h
index ca343f7a..1c862303 100644
--- a/src/drivers/infiniband/hermon.h
+++ b/src/drivers/infiniband/hermon.h
@@ -12,6 +12,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdint.h>
#include <ipxe/uaccess.h>
#include <ipxe/ib_packet.h>
+#include <ipxe/bofm.h>
#include "mlx_bitops.h"
#include "MT25408_PRM.h"
@@ -131,6 +132,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define HERMON_RETRY_MAX 0x07
+#define HERMON_MOD_STAT_CFG_SET 0x01
+#define HERMON_MOD_STAT_CFG_QUERY 0x03
+
/*
* Datatypes that seem to be missing from the autogenerated documentation
*
@@ -417,13 +421,14 @@ struct hermonprm_set_port_vlan_st {
/* -------------- */
} __attribute__ (( packed ));
-struct hermonprm_mod_stat_cfg_pf_net_boot_st {
- pseudo_bit_t reserved1[0x0001c];
- pseudo_bit_t pf_net_boot[0x00001];
- pseudo_bit_t reserved2[0x00002];
- pseudo_bit_t pf_net_boot_m[0x00001];
-/* -------------- */
- pseudo_bit_t reserved0[0x00020];
+struct hermonprm_mod_stat_cfg_input_mod_st {
+ pseudo_bit_t offset[0x00008];
+ pseudo_bit_t portnum[0x00008];
+ pseudo_bit_t xnum[0x00004];
+ pseudo_bit_t linkspeed[0x00003];
+ pseudo_bit_t autoneg[0x00001];
+ pseudo_bit_t reserved[0x00004];
+ pseudo_bit_t setup_mode[0x00004];
} __attribute__ (( packed ));
/*
@@ -444,7 +449,8 @@ struct MLX_DECLARE_STRUCT ( hermonprm_init_hca );
struct MLX_DECLARE_STRUCT ( hermonprm_mad_ifc );
struct MLX_DECLARE_STRUCT ( hermonprm_mcg_entry );
struct MLX_DECLARE_STRUCT ( hermonprm_mgm_hash );
-struct MLX_DECLARE_STRUCT ( hermonprm_mod_stat_cfg_pf_net_boot );
+struct MLX_DECLARE_STRUCT ( hermonprm_mod_stat_cfg );
+struct MLX_DECLARE_STRUCT ( hermonprm_mod_stat_cfg_input_mod );
struct MLX_DECLARE_STRUCT ( hermonprm_mpt );
struct MLX_DECLARE_STRUCT ( hermonprm_mtt );
struct MLX_DECLARE_STRUCT ( hermonprm_port_state_change_event );
@@ -866,6 +872,9 @@ struct hermon {
/** Ports */
struct hermon_port port[HERMON_MAX_PORTS];
+
+ /** BOFM device */
+ struct bofm_device bofm;
};
/** Global protection domain */