summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorItay Gazit2011-02-08 14:06:30 +0100
committerMichael Brown2011-02-17 02:25:10 +0100
commit0e878b30fe59041d3f86cf87d7a93d700dabfda6 (patch)
tree68dddc4705449b8aa273f5aa35033927933ebaf8
parent[hermon] Use circular event queue (diff)
downloadipxe-0e878b30fe59041d3f86cf87d7a93d700dabfda6.tar.gz
ipxe-0e878b30fe59041d3f86cf87d7a93d700dabfda6.tar.xz
ipxe-0e878b30fe59041d3f86cf87d7a93d700dabfda6.zip
[hermon] Force link speed to SDR
SDR link comes up much faster than other speeds. Signed-off-by: Itay Gazit <itaygazit@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/infiniband/hermon.c7
-rw-r--r--src/drivers/infiniband/hermon.h48
-rw-r--r--src/drivers/infiniband/mlx_bitops.h12
3 files changed, 62 insertions, 5 deletions
diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c
index 6a1ca8e50..a67c67871 100644
--- a/src/drivers/infiniband/hermon.c
+++ b/src/drivers/infiniband/hermon.c
@@ -1969,17 +1969,20 @@ static int hermon_open ( struct ib_device *ibdev ) {
/* Set port parameters */
memset ( &set_port, 0, sizeof ( set_port ) );
- MLX_FILL_7 ( &set_port.ib, 0,
+ MLX_FILL_8 ( &set_port.ib, 0,
mmc, 1,
mvc, 1,
mp, 1,
mg, 1,
mtu_cap, IB_MTU_2048,
vl_cap, IB_VL_0,
- rcm, 1 );
+ rcm, 1,
+ lss, 1 );
MLX_FILL_2 ( &set_port.ib, 10,
max_pkey, 1,
max_gid, 1 );
+ MLX_FILL_1 ( &set_port.ib, 28,
+ link_speed_supported, 1 );
if ( ( rc = hermon_cmd_set_port ( hermon, 0, ibdev->port,
&set_port ) ) != 0 ) {
DBGC ( hermon, "Hermon %p port %d could not set port: %s\n",
diff --git a/src/drivers/infiniband/hermon.h b/src/drivers/infiniband/hermon.h
index 865539365..ca343f7aa 100644
--- a/src/drivers/infiniband/hermon.h
+++ b/src/drivers/infiniband/hermon.h
@@ -228,7 +228,10 @@ struct hermonprm_set_port_ib_st {
pseudo_bit_t mp[0x00001];
pseudo_bit_t mvc[0x00001];
pseudo_bit_t mmc[0x00001];
- pseudo_bit_t reserved2[0x00009];
+ pseudo_bit_t reserved2[0x00004];
+ pseudo_bit_t lws[0x00001];
+ pseudo_bit_t lss[0x00001];
+ pseudo_bit_t reserved3[0x00003];
/* -------------- */
pseudo_bit_t capability_mask[0x00020];
/* -------------- */
@@ -246,14 +249,53 @@ struct hermonprm_set_port_ib_st {
/* -------------- */
pseudo_bit_t egress_sniff_qpn[0x00018];
pseudo_bit_t egress_sniff_mode[0x00002];
- pseudo_bit_t reserved3[0x00006];
+ pseudo_bit_t reserved4[0x00006];
/* -------------- */
pseudo_bit_t ingress_sniff_qpn[0x00018];
pseudo_bit_t ingress_sniff_mode[0x00002];
- pseudo_bit_t reserved4[0x00006];
+ pseudo_bit_t reserved5[0x00006];
/* -------------- */
pseudo_bit_t max_gid[0x00010];
pseudo_bit_t max_pkey[0x00010];
+/* -------------- */
+ pseudo_bit_t reserved6[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved7[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved8[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved9[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved10[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved11[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved12[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved13[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved14[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved15[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved16[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved17[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved18[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved19[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved20[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved21[0x00020];
+/* -------------- */
+ pseudo_bit_t reserved22[0x00020];
+/* -------------- */
+ pseudo_bit_t link_width_supported[0x00004];
+ pseudo_bit_t link_speed_supported[0x00004];
+ pseudo_bit_t reserved23[0x00018];
+/* -------------- */
} __attribute__ (( packed ));
struct hermonprm_query_port_cap_st {
diff --git a/src/drivers/infiniband/mlx_bitops.h b/src/drivers/infiniband/mlx_bitops.h
index 71a9bf1ec..5215f9a8a 100644
--- a/src/drivers/infiniband/mlx_bitops.h
+++ b/src/drivers/infiniband/mlx_bitops.h
@@ -110,6 +110,10 @@ typedef unsigned char pseudo_bit_t;
( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) | \
MLX_ASSEMBLE_6 ( _structure_st, _index, __VA_ARGS__ ) )
+#define MLX_ASSEMBLE_8( _structure_st, _index, _field, _value, ... ) \
+ ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) | \
+ MLX_ASSEMBLE_7 ( _structure_st, _index, __VA_ARGS__ ) )
+
/*
* Build native-endian (positive) dword bitmasks from named fields
*
@@ -143,6 +147,10 @@ typedef unsigned char pseudo_bit_t;
( MLX_MASK_1 ( _structure_st, _index, _field ) | \
MLX_MASK_6 ( _structure_st, _index, __VA_ARGS__ ) )
+#define MLX_MASK_8( _structure_st, _index, _field, ... ) \
+ ( MLX_MASK_1 ( _structure_st, _index, _field ) | \
+ MLX_MASK_7 ( _structure_st, _index, __VA_ARGS__ ) )
+
/*
* Populate big-endian dwords from named fields and values
*
@@ -183,6 +191,10 @@ typedef unsigned char pseudo_bit_t;
MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_7 ( MLX_PSEUDO_STRUCT ( _ptr ),\
_index, __VA_ARGS__ ) )
+#define MLX_FILL_8( _ptr, _index, ... ) \
+ MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_8 ( MLX_PSEUDO_STRUCT ( _ptr ),\
+ _index, __VA_ARGS__ ) )
+
/*
* Modify big-endian dword using named field and value
*