ADL: Updated support for AMD Display Library to 14.0, updated datatypes and added support for OverDrive 7 and 8 based GPUs
This commit is contained in:
+42
-17
@@ -50,27 +50,27 @@ int adl_init (void *hashcat_ctx)
|
||||
return -1;
|
||||
}
|
||||
|
||||
HC_LOAD_FUNC(adl, ADL_Main_Control_Destroy, ADL_MAIN_CONTROL_DESTROY, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Main_Control_Create, ADL_MAIN_CONTROL_CREATE, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_NumberOfAdapters_Get, ADL_ADAPTER_NUMBEROFADAPTERS_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_Active_Get, ADL_ADAPTER_ACTIVE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_AdapterInfo_Get, ADL_ADAPTER_ADAPTERINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_NumberOfAdapters_Get, ADL_ADAPTER_NUMBEROFADAPTERS_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Display_DisplayInfo_Get, ADL_DISPLAY_DISPLAYINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_ID_Get, ADL_ADAPTER_ID_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_VideoBiosInfo_Get, ADL_ADAPTER_VIDEOBIOSINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_ThermalDevices_Enum, ADL_OVERDRIVE5_THERMALDEVICES_ENUM, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_Temperature_Get, ADL_OVERDRIVE5_TEMPERATURE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_Temperature_Get, ADL_OVERDRIVE6_TEMPERATURE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Main_Control_Create, ADL_MAIN_CONTROL_CREATE, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Main_Control_Destroy, ADL_MAIN_CONTROL_DESTROY, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_CurrentActivity_Get, ADL_OVERDRIVE5_CURRENTACTIVITY_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeedInfo_Get, ADL_OVERDRIVE5_FANSPEEDINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_FanSpeed_Get, ADL_OVERDRIVE5_FANSPEED_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_FanSpeed_Get, ADL_OVERDRIVE6_FANSPEED_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Adapter_Active_Get, ADL_ADAPTER_ACTIVE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive_Caps, ADL_OVERDRIVE_CAPS, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_ODParameters_Get, ADL_OVERDRIVE5_ODPARAMETERS_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_ODPerformanceLevels_Get, ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_Temperature_Get, ADL_OVERDRIVE5_TEMPERATURE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive5_ThermalDevices_Enum, ADL_OVERDRIVE5_THERMALDEVICES_ENUM, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_Capabilities_Get, ADL_OVERDRIVE6_CAPABILITIES_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_StateInfo_Get, ADL_OVERDRIVE6_STATEINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_CurrentStatus_Get, ADL_OVERDRIVE6_CURRENTSTATUS_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_TargetTemperatureData_Get, ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_TargetTemperatureRangeInfo_Get, ADL_OVERDRIVE6_TARGETTEMPERATURERANGEINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_FanSpeed_Get, ADL_OVERDRIVE6_FANSPEED_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_StateInfo_Get, ADL_OVERDRIVE6_STATEINFO_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive6_Temperature_Get, ADL_OVERDRIVE6_TEMPERATURE_GET, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL_Overdrive_Caps, ADL_OVERDRIVE_CAPS, ADL, 0);
|
||||
HC_LOAD_FUNC(adl, ADL2_Overdrive_Caps, ADL2_OVERDRIVE_CAPS, ADL, 1);
|
||||
HC_LOAD_FUNC(adl, ADL2_New_QueryPMLogData_Get, ADL2_NEW_QUERYPMLOGDATA_GET, ADL, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -270,17 +270,42 @@ int hm_ADL_Overdrive_Caps (void *hashcat_ctx, int iAdapterIndex, int *od_support
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hm_ADL_Overdrive6_TargetTemperatureData_Get (void *hashcat_ctx, int iAdapterIndex, int *cur_temp, int *default_temp)
|
||||
int hm_ADL2_Overdrive_Caps (void *hashcat_ctx, int iAdapterIndex, int *iSupported, int *iEnabled, int *iVersion)
|
||||
{
|
||||
hwmon_ctx_t *hwmon_ctx = ((hashcat_ctx_t *) hashcat_ctx)->hwmon_ctx;
|
||||
|
||||
ADL_PTR *adl = (ADL_PTR *) hwmon_ctx->hm_adl;
|
||||
|
||||
const int ADL_rc = adl->ADL_Overdrive6_TargetTemperatureData_Get (iAdapterIndex, cur_temp, default_temp);
|
||||
// Not sure if that makes any sense...
|
||||
|
||||
if (adl->ADL2_Overdrive_Caps == NULL)
|
||||
{
|
||||
return hm_ADL_Overdrive_Caps (hashcat_ctx, iAdapterIndex, iSupported, iEnabled, iVersion);
|
||||
}
|
||||
|
||||
const int ADL_rc = adl->ADL2_Overdrive_Caps (NULL, iAdapterIndex, iSupported, iEnabled, iVersion);
|
||||
|
||||
if (ADL_rc != ADL_OK)
|
||||
{
|
||||
event_log_error (hashcat_ctx, "ADL_Overdrive6_TargetTemperatureData_Get(): %d", ADL_rc);
|
||||
event_log_error (hashcat_ctx, "ADL2_Overdrive_Caps(): %d", ADL_rc);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hm_ADL2_New_QueryPMLogData_Get (void *hashcat_ctx, int iAdapterIndex, ADLPMLogDataOutput *lpDataOutput)
|
||||
{
|
||||
hwmon_ctx_t *hwmon_ctx = ((hashcat_ctx_t *) hashcat_ctx)->hwmon_ctx;
|
||||
|
||||
ADL_PTR *adl = (ADL_PTR *) hwmon_ctx->hm_adl;
|
||||
|
||||
const int ADL_rc = adl->ADL2_New_QueryPMLogData_Get (NULL, iAdapterIndex, lpDataOutput);
|
||||
|
||||
if (ADL_rc != ADL_OK)
|
||||
{
|
||||
event_log_error (hashcat_ctx, "ADL2_New_QueryPMLogData_Get(): %d", ADL_rc);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
+158
-53
@@ -109,19 +109,7 @@ int hm_get_threshold_slowdown_with_devices_idx (hashcat_ctx_t *hashcat_ctx, cons
|
||||
}
|
||||
else if (hwmon_ctx->hm_device[backend_device_idx].od_version == 6)
|
||||
{
|
||||
int CurrentValue = 0;
|
||||
int DefaultValue = 0;
|
||||
|
||||
if (hm_ADL_Overdrive6_TargetTemperatureData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &CurrentValue, &DefaultValue) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].threshold_slowdown_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
|
||||
|
||||
return DefaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -346,6 +334,22 @@ int hm_get_temperature_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int b
|
||||
|
||||
return Temperature / 1000;
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].temperature_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_TEMPERATURE_EDGE].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -431,8 +435,37 @@ int hm_get_fanpolicy_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int bac
|
||||
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 6)
|
||||
{
|
||||
ADLOD6FanSpeedInfo lpFanSpeedInfo;
|
||||
|
||||
memset (&lpFanSpeedInfo, 0, sizeof (lpFanSpeedInfo));
|
||||
|
||||
if (hm_ADL_Overdrive6_FanSpeed_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &lpFanSpeedInfo) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].fanpolicy_get_supported = false;
|
||||
hwmon_ctx->hm_device[backend_device_idx].fanspeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].fanpolicy_get_supported = false;
|
||||
hwmon_ctx->hm_device[backend_device_idx].fanspeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_FAN_PERCENTAGE].supported;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -542,6 +575,22 @@ int hm_get_fanspeed_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int back
|
||||
|
||||
return faninfo.iFanSpeedPercent;
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].fanspeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_FAN_PERCENTAGE].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -617,18 +666,23 @@ int hm_get_buslanes_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int back
|
||||
{
|
||||
if (hwmon_ctx->hm_adl)
|
||||
{
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 5)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].buslanes_get_supported = false;
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
return -1;
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].buslanes_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return PMActivity.iCurrentBusLanes;
|
||||
}
|
||||
|
||||
return PMActivity.iCurrentBusLanes;
|
||||
// NO OD8
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -704,18 +758,37 @@ int hm_get_utilization_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int b
|
||||
{
|
||||
if (hwmon_ctx->hm_adl)
|
||||
{
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 5)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].utilization_get_supported = false;
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
return -1;
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].utilization_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return PMActivity.iActivityPercent;
|
||||
}
|
||||
|
||||
return PMActivity.iActivityPercent;
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].utilization_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_INFO_ACTIVITY_GFX].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -808,18 +881,37 @@ int hm_get_memoryspeed_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int b
|
||||
{
|
||||
if (hwmon_ctx->hm_adl)
|
||||
{
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 5)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].memoryspeed_get_supported = false;
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
return -1;
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].memoryspeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return PMActivity.iMemoryClock / 100;
|
||||
}
|
||||
|
||||
return PMActivity.iMemoryClock / 100;
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].memoryspeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_CLK_MEMCLK].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -895,18 +987,37 @@ int hm_get_corespeed_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int bac
|
||||
{
|
||||
if (hwmon_ctx->hm_adl)
|
||||
{
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 5)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].corespeed_get_supported = false;
|
||||
ADLPMActivity PMActivity;
|
||||
|
||||
return -1;
|
||||
PMActivity.iSize = sizeof (ADLPMActivity);
|
||||
|
||||
if (hm_ADL_Overdrive_CurrentActivity_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &PMActivity) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].corespeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return PMActivity.iEngineClock / 100;
|
||||
}
|
||||
|
||||
return PMActivity.iEngineClock / 100;
|
||||
if (hwmon_ctx->hm_device[backend_device_idx].od_version == 8)
|
||||
{
|
||||
ADLPMLogDataOutput odlpDataOutput;
|
||||
|
||||
memset (&odlpDataOutput, 0, sizeof (ADLPMLogDataOutput));
|
||||
|
||||
if (hm_ADL2_New_QueryPMLogData_Get (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].adl, &odlpDataOutput) == -1)
|
||||
{
|
||||
hwmon_ctx->hm_device[backend_device_idx].corespeed_get_supported = false;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return odlpDataOutput.sensors[PMLOG_CLK_GFXCLK].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (hwmon_ctx->hm_sysfs_amdgpu)
|
||||
@@ -1400,7 +1511,9 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
||||
int od_enabled = 0;
|
||||
int od_version = 0;
|
||||
|
||||
hm_ADL_Overdrive_Caps (hashcat_ctx, lpAdapterInfo[i].iAdapterIndex, &od_supported, &od_enabled, &od_version);
|
||||
hm_ADL2_Overdrive_Caps (hashcat_ctx, lpAdapterInfo[i].iAdapterIndex, &od_supported, &od_enabled, &od_version);
|
||||
|
||||
if (od_version < 8) od_version = 5;
|
||||
|
||||
hm_adapters_adl[device_id].od_version = od_version;
|
||||
|
||||
@@ -1534,12 +1647,6 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
hwmon_ctx->enabled = true;
|
||||
|
||||
/**
|
||||
* save buffer required for later restores
|
||||
*/
|
||||
|
||||
hwmon_ctx->od_clock_mem_status = (ADLOD6MemClockState *) hccalloc (backend_ctx->backend_devices_cnt, sizeof (ADLOD6MemClockState));
|
||||
|
||||
/**
|
||||
* HM devices: copy
|
||||
*/
|
||||
@@ -1795,8 +1902,6 @@ void hwmon_ctx_destroy (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
// free memory
|
||||
|
||||
hcfree (hwmon_ctx->od_clock_mem_status);
|
||||
|
||||
hcfree (hwmon_ctx->hm_device);
|
||||
|
||||
memset (hwmon_ctx, 0, sizeof (hwmon_ctx_t));
|
||||
|
||||
Reference in New Issue
Block a user