summaryrefslogtreecommitdiffstats
path: root/src/drivers/infiniband/hermon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/infiniband/hermon.c')
-rw-r--r--src/drivers/infiniband/hermon.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c
index 061ee81c7..68ce5d4a0 100644
--- a/src/drivers/infiniband/hermon.c
+++ b/src/drivers/infiniband/hermon.c
@@ -2121,6 +2121,32 @@ static void hermon_event_port_state_change ( struct hermon *hermon,
}
/**
+ * Handle port management event
+ *
+ * @v hermon Hermon device
+ * @v eqe Port management change event queue entry
+ */
+static void hermon_event_port_mgmnt_change ( struct hermon *hermon,
+ union hermonprm_event_entry *eqe){
+ unsigned int port;
+
+ /* Get port */
+ port = ( MLX_GET ( &eqe->port_mgmnt_change, port ) - 1 );
+ DBGC ( hermon, "Hermon %p port %d management change\n",
+ hermon, ( port + 1 ) );
+
+ /* Sanity check */
+ if ( port >= hermon->cap.num_ports ) {
+ DBGC ( hermon, "Hermon %p port %d does not exist!\n",
+ hermon, ( port + 1 ) );
+ return;
+ }
+
+ /* Update MAD parameters */
+ ib_smc_update ( hermon->port[port].ibdev, hermon_mad );
+}
+
+/**
* Poll event queue
*
* @v ibdev Infiniband device
@@ -2169,6 +2195,9 @@ static void hermon_poll_eq ( struct ib_device *ibdev ) {
case HERMON_EV_PORT_STATE_CHANGE:
hermon_event_port_state_change ( hermon, eqe );
break;
+ case HERMON_EV_PORT_MGMNT_CHANGE:
+ hermon_event_port_mgmnt_change ( hermon, eqe );
+ break;
default:
DBGC ( hermon, "Hermon %p EQN %#lx unrecognised event "
"type %#02x:%#02x\n",