diff options
| author | Raed Salem | 2016-12-08 10:01:51 +0100 |
|---|---|---|
| committer | Michael Brown | 2016-12-08 10:35:52 +0100 |
| commit | 26050fd4c87c50503d5bd573b2ec91703676e211 (patch) | |
| tree | 51dac8a878d188803b1d76d7a0f150656f466ed3 /src/drivers/infiniband/mlx_utils | |
| parent | [efi] Work around temporal anomaly encountered during ExitBootServices() (diff) | |
| download | ipxe-26050fd4c87c50503d5bd573b2ec91703676e211.tar.gz ipxe-26050fd4c87c50503d5bd573b2ec91703676e211.tar.xz ipxe-26050fd4c87c50503d5bd573b2ec91703676e211.zip | |
[golan] Update Connect-IB, ConnectX-4 and ConnectX-4 Lx (Infiniband) support
Updates:
- Nodnic: Support for arm cq doorbell via the UAR BAR
- Ensure hardware is quiescent when no interface is open - WinPE WA
- Support for clear interrupt via BAR
- Nodnic: Support for send TX doorbells via the UAR BAR
- Added ConnectX-5EX device
- Added ConnectX-5 device
Signed-off-by: Raed Salem <raeds@mellanox.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/infiniband/mlx_utils')
12 files changed, 176 insertions, 16 deletions
diff --git a/src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h b/src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h index 89cad75eb..cf35e5b73 100644 --- a/src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h +++ b/src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h @@ -31,6 +31,11 @@ mlx_pci_init_priv( ); mlx_status +mlx_pci_teardown_priv( + IN mlx_utils *utils + ); + +mlx_status mlx_pci_read_priv( IN mlx_utils *utils, IN mlx_pci_width width, diff --git a/src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h b/src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h index 7b7b852d1..7ff06bbf5 100644 --- a/src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h +++ b/src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h @@ -24,6 +24,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include "../../../mlx_utils_flexboot/include/mlx_logging_priv.h" +#define MLX_PRINT(...) MLX_PRINT_PRIVATE(__VA_ARGS__) #define MLX_DEBUG_FATAL_ERROR(...) MLX_DEBUG_FATAL_ERROR_PRIVATE(__VA_ARGS__) #define MLX_DEBUG_ERROR(...) MLX_DEBUG_ERROR_PRIVATE(__VA_ARGS__) #define MLX_DEBUG_WARN(...) MLX_DEBUG_WARN_PRIVATE(__VA_ARGS__) diff --git a/src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h b/src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h index 416bdb66b..60eb55d52 100644 --- a/src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h +++ b/src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h @@ -37,6 +37,11 @@ mlx_pci_init( ); mlx_status +mlx_pci_teardown( + IN mlx_utils *utils + ); + +mlx_status mlx_pci_read( IN mlx_utils *utils, IN mlx_pci_width width, diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h index 15b28f57a..cb167d6ae 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h @@ -124,6 +124,11 @@ struct mlx_link_speed { /* -------------- */ mlx_uint32 ib_proto_oper :16; mlx_uint32 ib_link_width_oper :16; + /* -------------- */ + mlx_uint32 reserved7 :32; + /* -------------- */ + mlx_uint32 eth_proto_lp_advertise :32; + mlx_uint32 reserved[3]; }; mlx_status diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c index 2277e0c76..1ea68dd8a 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c @@ -42,6 +42,7 @@ struct nvconfig_tlv_mapping nvconfig_tlv_mapping[] = { TlvMappingEntry(0x2020, 0x2020, NVRAM_TLV_CLASS_PHYSICAL_PORT, FALSE), TlvMappingEntry(0x2021, 0x221, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2023, 0x223, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x2006, 0x206, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2100, 0x230, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2101, 0x231, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2102, 0x232, NVRAM_TLV_CLASS_HOST, FALSE), @@ -53,6 +54,7 @@ struct nvconfig_tlv_mapping nvconfig_tlv_mapping[] = { TlvMappingEntry(0x2108, 0x238, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2109, 0x239, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x210A, 0x23A, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x2022, 0x222, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2200, 0x240, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2201, 0x241, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2202, 0x242, NVRAM_TLV_CLASS_HOST, FALSE), @@ -60,6 +62,11 @@ struct nvconfig_tlv_mapping nvconfig_tlv_mapping[] = { TlvMappingEntry(0x2204, 0x244, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2205, 0x245, NVRAM_TLV_CLASS_HOST, FALSE), TlvMappingEntry(0x2207, 0x247, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x2002, 0x202, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x2004, 0x204, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x110, 0x110, NVRAM_TLV_CLASS_HOST, FALSE), + TlvMappingEntry(0x192, 0x192, NVRAM_TLV_CLASS_GLOBAL, FALSE), + TlvMappingEntry(0x101, 0x101, NVRAM_TLV_CLASS_GLOBAL, TRUE), TlvMappingEntry(0, 0, 0, 0), }; diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h index 8333e8368..0a99bb1b5 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h @@ -107,6 +107,22 @@ struct nvconfig_nvda { mlx_uint8 data[NVCONFIG_MAX_TLV_SIZE]; }; +struct nv_conf_cap { + /** WOL En/Dis **/ + mlx_uint8 wol_en; + /** VPI En/Dis **/ + mlx_uint8 vpi_en; +}; + +struct mlx_nvconfig_virt_net_addr { + mlx_uint32 reserved1 :29; + mlx_uint32 erase_on_powerup:1; + mlx_uint32 reserverd2 :1; + mlx_uint32 virtual_mac_en :1; + mlx_uint32 virtual_mac_high; + mlx_uint32 virtual_mac_low; +}; + mlx_status nvconfig_query_capability( diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c index 77eda8a5c..f5b2f155f 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c @@ -86,13 +86,13 @@ nvconfig_get_boot_ext_default_conf( "TLV not found. Using hard-coded defaults "); port_conf_def->linkup_timeout = nic_boot_ext_conf->linkup_timeout; port_conf_def->ip_ver = nic_boot_ext_conf->ip_ver; - + port_conf_def->undi_network_wait_to = nic_boot_ext_conf->undi_network_wait_to; return MLX_SUCCESS; nvdata_access_err: port_conf_def->linkup_timeout = DEFAULT_BOOT_LINK_UP_TO; port_conf_def->ip_ver = DEFAULT_BOOT_IP_VER; - + port_conf_def->undi_network_wait_to = DEFAULT_BOOT_UNDI_NETWORK_WAIT_TO; return status; } @@ -185,8 +185,12 @@ nvconfig_get_iscsi_gen_default_conf( port_conf_def->iscsi_chap_auth_en = iscsi_gen->chap_auth_en; port_conf_def->iscsi_lun_busy_retry_count = iscsi_gen->lun_busy_retry_count; port_conf_def->iscsi_link_up_delay_time = iscsi_gen->link_up_delay_time; + port_conf_def->iscsi_drive_num = iscsi_gen->drive_num; + + return MLX_SUCCESS; nvdata_access_err: + port_conf_def->iscsi_drive_num = DEFAULT_ISCSI_DRIVE_NUM; return status; } @@ -327,6 +331,27 @@ nvdata_access_err: return status; } +static +mlx_status +nvconfig_get_rom_cap_default_conf( IN void *data, + IN int status, OUT void *def_struct) { + union mlx_nvconfig_rom_cap_conf *rom_cap_conf = + (union mlx_nvconfig_rom_cap_conf *) data; + struct mlx_nvconfig_conf_defaults *conf_def = + (struct mlx_nvconfig_conf_defaults *) def_struct; + + MLX_CHECK_STATUS(NULL, status, nvdata_access_err, + "TLV not found. Using hard-coded defaults "); + conf_def->boot_ip_ver_en = rom_cap_conf->boot_ip_ver_en; + + return MLX_SUCCESS; + +nvdata_access_err: + rom_cap_conf->boot_ip_ver_en = DEFAULT_BOOT_IP_VERSION_EN; + + return status; +} + static struct tlv_default tlv_port_defaults[] = { TlvDefaultEntry(BOOT_SETTINGS_TYPE, union mlx_nvconfig_nic_boot_conf, &nvconfig_get_boot_default_conf), TlvDefaultEntry(BOOT_SETTINGS_EXT_TYPE, union mlx_nvconfig_nic_boot_ext_conf, &nvconfig_get_boot_ext_default_conf), @@ -343,6 +368,7 @@ static struct tlv_default tlv_general_defaults[] = { TlvDefaultEntry(GLOPAL_PCI_CAPS_TYPE, union mlx_nvconfig_virt_caps, &nvconfig_get_nv_virt_caps_default_conf), TlvDefaultEntry(GLOPAL_PCI_SETTINGS_TYPE, union mlx_nvconfig_virt_conf, &nvconfig_get_nv_virt_default_conf), TlvDefaultEntry(OCSD_OCBB_TYPE, union mlx_nvconfig_ocsd_ocbb_conf, &nvconfig_get_ocsd_ocbb_default_conf), + TlvDefaultEntry(NV_ROM_CAP_TYPE, union mlx_nvconfig_rom_cap_conf, &nvconfig_get_rom_cap_default_conf), }; static diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h index 163c2a35f..48699c358 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h @@ -32,9 +32,12 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define DEFAULT_BOOT_VLAN 1 #define DEFAULT_ISCSI_DHCP_PARAM_EN 1 #define DEFAULT_ISCSI_IPV4_DHCP_EN 1 +#define DEFAULT_ISCSI_DRIVE_NUM 0x80 #define DEFAULT_OCSD_OCBB_EN 1 #define DEFAULT_BOOT_IP_VER 0 #define DEFAULT_BOOT_LINK_UP_TO 0 +#define DEFAULT_BOOT_UNDI_NETWORK_WAIT_TO 30 +#define DEFAULT_BOOT_IP_VERSION_EN 1 struct mlx_nvconfig_port_conf_defaults { mlx_uint8 pptx; @@ -56,11 +59,13 @@ struct mlx_nvconfig_port_conf_defaults { mlx_boolean iscsi_ipv4_dhcp_en; mlx_uint8 iscsi_lun_busy_retry_count; mlx_uint8 iscsi_link_up_delay_time; + mlx_uint8 iscsi_drive_num; mlx_uint8 client_identifier; mlx_uint8 mac_admin_bit; mlx_uint8 default_link_type; mlx_uint8 linkup_timeout; mlx_uint8 ip_ver; + mlx_uint8 undi_network_wait_to; }; struct mlx_nvconfig_conf_defaults { @@ -71,6 +76,7 @@ struct mlx_nvconfig_conf_defaults { mlx_uint8 uar_bar_size; mlx_uint8 flexboot_menu_to; mlx_boolean ocsd_ocbb_en; + mlx_boolean boot_ip_ver_en; }; mlx_status diff --git a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h index 5b3af1e78..7fd52accc 100644 --- a/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h +++ b/src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h @@ -33,12 +33,15 @@ enum { OCSD_OCBB_TYPE = 0x2011, FLOW_CONTROL_TYPE = 0x2020, BOOT_SETTINGS_TYPE = 0x2021, + NV_ROM_FLEXBOOT_DEBUG = 0x2004, + ISCSI_GENERAL_SETTINGS_TYPE = 0x2100, IB_BOOT_SETTING_TYPE = 0x2022, IB_DHCP_SETTINGS_TYPE = 0x2023, GLOPAL_PCI_SETTINGS_TYPE = 0x80, GLOPAL_PCI_CAPS_TYPE = 0x81, GLOBAL_ROM_INI_TYPE = 0x100, + NV_VIRT_NET_ADDR = 0x110, // Types for iSCSI strings DHCP_VEND_ID = 0x2101, @@ -59,6 +62,8 @@ enum { FIRST_TGT_ISCSI_NAME = 0x2204, FIRST_TGT_CHAP_ID = 0x2205, FIRST_TGT_CHAP_PWD = 0x2207, + NV_ROM_DEBUG_LEVEL = 0x2002, + NV_ROM_CAP_TYPE = 0x101, }; union mlx_nvconfig_nic_boot_conf { @@ -78,7 +83,9 @@ union mlx_nvconfig_nic_boot_ext_conf { struct { mlx_uint32 linkup_timeout : 8; mlx_uint32 ip_ver : 2; - mlx_uint32 reserved0 : 22; + mlx_uint32 reserved0 : 6; + mlx_uint32 undi_network_wait_to : 8; + mlx_uint32 reserved1 : 8; }; mlx_uint32 dword; }; @@ -194,7 +201,8 @@ union mlx_nvconfig_iscsi_general { /*-------------------*/ mlx_uint32 lun_busy_retry_count:8; mlx_uint32 link_up_delay_time :8; - mlx_uint32 reserved4 :16; + mlx_uint32 drive_num :8; + mlx_uint32 reserved4 :8; }; mlx_uint32 dword[3]; }; @@ -226,34 +234,98 @@ union mlx_nvconfig_vpi_link_conf { }; struct mlx_nvcofnig_romini { - mlx_uint32 reserved0 :1; + mlx_uint32 reserved0 :1; mlx_uint32 shared_memory_en :1; - mlx_uint32 hii_vpi_en :1; - mlx_uint32 tech_enum :1; - mlx_uint32 reserved1 :4; + mlx_uint32 hii_vpi_en :1; + mlx_uint32 tech_enum :1; + mlx_uint32 reserved1 :4; mlx_uint32 static_component_name_string :1; mlx_uint32 hii_iscsi_configuration :1; - mlx_uint32 hii_ibm_aim :1; + mlx_uint32 hii_ibm_aim :1; mlx_uint32 hii_platform_setup :1; mlx_uint32 hii_bdf_decimal :1; mlx_uint32 hii_read_only :1; - mlx_uint32 reserved2 :10; + mlx_uint32 reserved2 :10; mlx_uint32 mac_enum :1; - mlx_uint32 port_enum :1; + mlx_uint32 port_enum :1; mlx_uint32 flash_en :1; mlx_uint32 fmp_en :1; mlx_uint32 bofm_en :1; - mlx_uint32 platform_to_driver_en :1; + mlx_uint32 platform_to_driver_en:1; mlx_uint32 hii_en :1; mlx_uint32 undi_en :1; /* -------------- */ mlx_uint64 dhcp_user_class; /* -------------- */ - mlx_uint32 reserved3 :22; + mlx_uint32 reserved3 :10; + mlx_uint32 ucm_single_port :1; + mlx_uint32 tivoli_wa_en :1; + mlx_uint32 dhcp_pxe_discovery_control_dis :1; + mlx_uint32 hii_flexaddr_override:1; + mlx_uint32 hii_flexaddr_setting :1; + mlx_uint32 guided_ops :1; + mlx_uint32 hii_type :4; + mlx_uint32 hii_mriname2 :1; + mlx_uint32 hii_aim_ucm_ver2 :1; mlx_uint32 uri_boot_retry_delay :4; mlx_uint32 uri_boot_retry :4; mlx_uint32 option_rom_debug :1; mlx_uint32 promiscuous_vlan :1; + +} __attribute__ ((packed)); + +union mlx_nvconfig_debug_conf { + struct { + mlx_uint32 dbg_log_en :1; + mlx_uint32 reserved1 :31; + /***************************************************/ + mlx_uint32 stp_dbg_lvl :2; + mlx_uint32 romprefix_dbg_lvl :2; + mlx_uint32 dhcp_dbg_lvl :2; + mlx_uint32 dhcpv6_dbg_lvl :2; + mlx_uint32 arp_dbg_lvl :2; + mlx_uint32 neighbor_dbg_lvl :2; + mlx_uint32 ndp_dbg_lvl :2; + mlx_uint32 uri_dbg_lvl :2; + mlx_uint32 driver_dbg_lvl :2; + mlx_uint32 nodnic_dbg_lvl :2; + mlx_uint32 nodnic_cmd_dbg_lvl :2; + mlx_uint32 nodnic_device_dbg_lvl :2; + mlx_uint32 nodnic_port_dbg_lvl :2; + mlx_uint32 netdevice_dbg_lvl :2; + mlx_uint32 tftp_dbg_lvl :2; + mlx_uint32 udp_dbg_lvl :2; + /***************************************************/ + mlx_uint32 tcp_dbg_lvl :2; + mlx_uint32 tcpip_dbg_lvl :2; + mlx_uint32 ipv4_dbg_lvl :2; + mlx_uint32 ipv6_dbg_lvl :2; + mlx_uint32 drv_set_dbg_lvl :2; + mlx_uint32 stat_update_dbg_lvl :2; + mlx_uint32 pxe_undi_dbg_lvl :2; + mlx_uint32 reserved2 :18; + }; + mlx_uint32 dword[3]; +}; + +union mlx_nvconfig_flexboot_debug { + struct { + mlx_uint32 reserved0 :29; + mlx_uint32 panic_behavior :2; + mlx_uint32 boot_to_shell :1; + }; + mlx_uint32 dword; +}; + +union mlx_nvconfig_rom_cap_conf { + struct { + mlx_uint32 reserved0 :28; + mlx_uint32 uefi_logs_en :1; + mlx_uint32 flexboot_debug_en :1; + mlx_uint32 boot_debug_log_en :1; + mlx_uint32 boot_ip_ver_en :1; + }; + mlx_uint32 dword; }; #endif /* MLX_NVCONFIG_PRM_H_ */ diff --git a/src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c b/src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c index f7d365dee..e4ab5f0ad 100644 --- a/src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c +++ b/src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c @@ -316,7 +316,7 @@ mlx_icmd_send_command( ) { mlx_status status = MLX_SUCCESS; - mlx_uint32 icmd_status = MLX_FAILED; + mlx_uint32 icmd_status = 0; if (utils == NULL || data == NULL) { status = MLX_INVALID_PARAMETER; diff --git a/src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c b/src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c index 91c44d991..f9f9b2a12 100644 --- a/src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c +++ b/src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c @@ -20,6 +20,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <stddef.h> + #include "../../include/private/mlx_pci_priv.h" #include "../../include/public/mlx_pci.h" @@ -39,6 +40,21 @@ bail: } mlx_status +mlx_pci_teardown( + IN mlx_utils *utils + ) +{ + mlx_status status = MLX_SUCCESS; + if( utils == NULL){ + status = MLX_INVALID_PARAMETER; + goto bail; + } + status = mlx_pci_teardown_priv(utils); +bail: + return status; +} + +mlx_status mlx_pci_read( IN mlx_utils *utils, IN mlx_pci_width width, diff --git a/src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c b/src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c index c824b17e9..7ae35355d 100644 --- a/src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c +++ b/src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c @@ -20,10 +20,10 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <stddef.h> + #include "../../include/private/mlx_utils_priv.h" #include "../../include/public/mlx_pci.h" #include "../../include/public/mlx_utils.h" - mlx_status mlx_utils_init( IN mlx_utils *utils, @@ -44,11 +44,12 @@ bail: mlx_status mlx_utils_teardown( - IN mlx_utils *utils __attribute__ ((unused)) + IN mlx_utils *utils ) { mlx_status status = MLX_SUCCESS; mlx_utils_free_lock(utils); + mlx_pci_teardown(utils); return status; } |
