0, mpt, index, NULL );
}
+static inline int
+hermon_cmd_hw2sw_mpt ( struct hermon *hermon, unsigned int index ) {
+ return hermon_cmd ( hermon,
+ HERMON_HCR_VOID_CMD ( HERMON_HCR_HW2SW_MPT ),
+ 0, NULL, index, NULL );
+}
+
static inline int
hermon_cmd_write_mtt ( struct hermon *hermon,
const struct hermonprm_write_mtt *write_mtt ) {
return 0;
}
+/**
+ * Unmap memory protection table
+ *
+ * @v hermon Hermon device
+ * @ret rc Return status code
+ */
+static int hermon_unmap_mpt ( struct hermon *hermon ) {
+ int rc;
+
+ if ( ( rc = hermon_cmd_hw2sw_mpt ( hermon,
+ hermon->cap.reserved_mrws ) ) != 0 ){
+ DBGC ( hermon, "Hermon %p could not unmap MPT: %s\n",
+ hermon, strerror ( rc ) );
+ return rc;
+ }
+
+ return 0;
+}
+
/**
* Configure special queue pairs
*
err_conf_special_qps:
hermon_destroy_eq ( hermon );
err_create_eq:
+ hermon_unmap_mpt ( hermon );
err_setup_mpt:
hermon_cmd_close_hca ( hermon );
err_init_hca:
*/
static void hermon_stop ( struct hermon *hermon ) {
hermon_destroy_eq ( hermon );
+ hermon_unmap_mpt ( hermon );
hermon_cmd_close_hca ( hermon );
hermon_unmap_icm ( hermon );
hermon_stop_firmware ( hermon );
#define HERMON_HCR_CLOSE_PORT 0x000a
#define HERMON_HCR_SET_PORT 0x000c
#define HERMON_HCR_SW2HW_MPT 0x000d
+#define HERMON_HCR_HW2SW_MPT 0x000f
#define HERMON_HCR_WRITE_MTT 0x0011
#define HERMON_HCR_MAP_EQ 0x0012
#define HERMON_HCR_SW2HW_EQ 0x0013