link_up );
}
+/**
+ * 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
*
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",
#define HERMON_SET_PORT_GID_TABLE 0x0500
#define HERMON_EV_PORT_STATE_CHANGE 0x09
+#define HERMON_EV_PORT_MGMNT_CHANGE 0x1d
#define HERMON_SCHED_QP0 0x3f
#define HERMON_SCHED_DEFAULT 0x83
struct hermonprm_port_state_change_st data;
} __attribute__ (( packed ));
+struct hermonprm_port_mgmnt_change_event_st {
+ pseudo_bit_t reserved[0x00020];
+/* -------------- */
+ pseudo_bit_t port[0x00008];
+ pseudo_bit_t reserved0[0x00018];
+} __attribute__ (( packed ));
+
struct hermonprm_sense_port_st {
pseudo_bit_t reserved0[0x00020];
/* -------------- */
struct MLX_DECLARE_STRUCT ( hermonprm_mpt );
struct MLX_DECLARE_STRUCT ( hermonprm_mtt );
struct MLX_DECLARE_STRUCT ( hermonprm_port_state_change_event );
+struct MLX_DECLARE_STRUCT ( hermonprm_port_mgmnt_change_event );
struct MLX_DECLARE_STRUCT ( hermonprm_qp_db_record );
struct MLX_DECLARE_STRUCT ( hermonprm_qp_ee_state_transitions );
struct MLX_DECLARE_STRUCT ( hermonprm_query_dev_cap );
union hermonprm_event_entry {
struct hermonprm_event_queue_entry generic;
struct hermonprm_port_state_change_event port_state_change;
+ struct hermonprm_port_mgmnt_change_event port_mgmnt_change;
} __attribute__ (( packed ));
union hermonprm_doorbell_register {