mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-16 11:57:32 +00:00
trivial: dell: move some dock lookup code into -common
This allows other plugins to compile in -common to be able look up some dock related items.
This commit is contained in:
parent
694bb60f2c
commit
bae3a02348
@ -21,7 +21,6 @@
|
|||||||
|
|
||||||
#include <appstream-glib.h>
|
#include <appstream-glib.h>
|
||||||
#include "fu-dell-common.h"
|
#include "fu-dell-common.h"
|
||||||
#include "fu-plugin.h"
|
|
||||||
|
|
||||||
/* These are for dock query capabilities */
|
/* These are for dock query capabilities */
|
||||||
struct dock_count_in {
|
struct dock_count_in {
|
||||||
@ -151,6 +150,96 @@ fu_dell_detect_dock (FuDellSmiObj *smi_obj, guint32 *location)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
fu_dell_query_dock (FuDellSmiObj *smi_obj, DOCK_UNION *buf)
|
||||||
|
{
|
||||||
|
gint result;
|
||||||
|
guint32 location;
|
||||||
|
guint buf_size;
|
||||||
|
|
||||||
|
if (!fu_dell_detect_dock (smi_obj, &location))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
fu_dell_clear_smi (smi_obj);
|
||||||
|
|
||||||
|
/* look up more information on dock */
|
||||||
|
if (smi_obj->fake_smbios)
|
||||||
|
buf->buf = smi_obj->fake_buffer;
|
||||||
|
else {
|
||||||
|
dell_smi_obj_set_class (smi_obj->smi, DACI_DOCK_CLASS);
|
||||||
|
dell_smi_obj_set_select (smi_obj->smi, DACI_DOCK_SELECT);
|
||||||
|
dell_smi_obj_set_arg (smi_obj->smi, cbARG1, DACI_DOCK_ARG_INFO);
|
||||||
|
dell_smi_obj_set_arg (smi_obj->smi, cbARG2, location);
|
||||||
|
buf_size = sizeof (DOCK_INFO_RECORD);
|
||||||
|
buf->buf = dell_smi_obj_make_buffer_frombios_auto (smi_obj->smi,
|
||||||
|
cbARG3,
|
||||||
|
buf_size);
|
||||||
|
if (!buf->buf) {
|
||||||
|
g_debug ("Failed to initialize buffer");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!fu_dell_execute_smi (smi_obj))
|
||||||
|
return FALSE;
|
||||||
|
result = fu_dell_get_res (smi_obj, cbARG1);
|
||||||
|
if (result != SMI_SUCCESS) {
|
||||||
|
if (result == SMI_INVALID_BUFFER) {
|
||||||
|
g_debug ("Invalid buffer size, needed %" G_GUINT32_FORMAT,
|
||||||
|
fu_dell_get_res (smi_obj, cbARG2));
|
||||||
|
} else {
|
||||||
|
g_debug ("SMI execution returned error: %d",
|
||||||
|
result);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const gchar*
|
||||||
|
fu_dell_get_dock_type (guint8 type)
|
||||||
|
{
|
||||||
|
g_autoptr (FuDellSmiObj) smi_obj = NULL;
|
||||||
|
DOCK_UNION buf;
|
||||||
|
|
||||||
|
/* not yet initialized, look it up */
|
||||||
|
if (type == DOCK_TYPE_NONE) {
|
||||||
|
smi_obj = g_malloc0 (sizeof(FuDellSmiObj));
|
||||||
|
smi_obj->smi = dell_smi_factory (DELL_SMI_DEFAULTS);
|
||||||
|
if (!fu_dell_query_dock (smi_obj, &buf))
|
||||||
|
return NULL;
|
||||||
|
type = buf.record->dock_info_header.dock_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case DOCK_TYPE_TB16:
|
||||||
|
return "TB16";
|
||||||
|
case DOCK_TYPE_WD15:
|
||||||
|
return "WD15";
|
||||||
|
default:
|
||||||
|
g_debug ("Dock type %d unknown",
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
guint32
|
||||||
|
fu_dell_get_cable_type (guint8 type)
|
||||||
|
{
|
||||||
|
g_autoptr (FuDellSmiObj) smi_obj = NULL;
|
||||||
|
DOCK_UNION buf;
|
||||||
|
|
||||||
|
/* not yet initialized, look it up */
|
||||||
|
if (type == CABLE_TYPE_NONE) {
|
||||||
|
smi_obj = g_malloc0 (sizeof(FuDellSmiObj));
|
||||||
|
smi_obj->smi = dell_smi_factory (DELL_SMI_DEFAULTS);
|
||||||
|
if (!fu_dell_query_dock (smi_obj, &buf))
|
||||||
|
return 0;
|
||||||
|
type = (buf.record->dock_info).cable_type;
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fu_dell_toggle_dock_mode (FuDellSmiObj *smi_obj, guint32 new_mode,
|
fu_dell_toggle_dock_mode (FuDellSmiObj *smi_obj, guint32 new_mode,
|
||||||
guint32 dock_location, GError **error)
|
guint32 dock_location, GError **error)
|
||||||
@ -167,8 +256,8 @@ fu_dell_toggle_dock_mode (FuDellSmiObj *smi_obj, guint32 new_mode,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
if (smi_obj->output[1] != 0) {
|
if (smi_obj->output[1] != 0) {
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
G_IO_ERROR,
|
||||||
FWUPD_ERROR_NOT_SUPPORTED,
|
G_IO_ERROR_INVALID_DATA,
|
||||||
"Failed to set dock flash mode: %u",
|
"Failed to set dock flash mode: %u",
|
||||||
smi_obj->output[1]);
|
smi_obj->output[1]);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -35,6 +35,57 @@ typedef struct {
|
|||||||
guint8 *fake_buffer;
|
guint8 *fake_buffer;
|
||||||
} FuDellSmiObj;
|
} FuDellSmiObj;
|
||||||
|
|
||||||
|
/* Dock Info version 1 */
|
||||||
|
#pragma pack(1)
|
||||||
|
#define MAX_COMPONENTS 5
|
||||||
|
|
||||||
|
typedef struct _COMPONENTS {
|
||||||
|
gchar description[80];
|
||||||
|
guint32 fw_version; /* BCD format: 0x00XXYYZZ */
|
||||||
|
} COMPONENTS;
|
||||||
|
|
||||||
|
typedef struct _DOCK_INFO {
|
||||||
|
gchar dock_description[80];
|
||||||
|
guint32 flash_pkg_version; /* BCD format: 0x00XXYYZZ */
|
||||||
|
guint32 cable_type; /* bit0-7 cable type, bit7-31 set to 0 */
|
||||||
|
guint8 location; /* Location of the dock */
|
||||||
|
guint8 reserved;
|
||||||
|
guint8 component_count;
|
||||||
|
COMPONENTS components[MAX_COMPONENTS]; /* number of component_count */
|
||||||
|
} DOCK_INFO;
|
||||||
|
|
||||||
|
typedef struct _DOCK_INFO_HEADER {
|
||||||
|
guint8 dir_version; /* version 1, 2 … */
|
||||||
|
guint8 dock_type;
|
||||||
|
guint16 reserved;
|
||||||
|
} DOCK_INFO_HEADER;
|
||||||
|
|
||||||
|
typedef struct _DOCK_INFO_RECORD {
|
||||||
|
DOCK_INFO_HEADER dock_info_header; /* dock version specific definition */
|
||||||
|
DOCK_INFO dock_info;
|
||||||
|
} DOCK_INFO_RECORD;
|
||||||
|
|
||||||
|
typedef union _DOCK_UNION{
|
||||||
|
guint8 *buf;
|
||||||
|
DOCK_INFO_RECORD *record;
|
||||||
|
} DOCK_UNION;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
typedef enum _DOCK_TYPE
|
||||||
|
{
|
||||||
|
DOCK_TYPE_NONE,
|
||||||
|
DOCK_TYPE_TB16,
|
||||||
|
DOCK_TYPE_WD15
|
||||||
|
} DOCK_TYPE;
|
||||||
|
|
||||||
|
typedef enum _CABLE_TYPE
|
||||||
|
{
|
||||||
|
CABLE_TYPE_NONE,
|
||||||
|
CABLE_TYPE_LEGACY,
|
||||||
|
CABLE_TYPE_UNIV,
|
||||||
|
CABLE_TYPE_TBT
|
||||||
|
} CABLE_TYPE;
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_dell_clear_smi (FuDellSmiObj *obj);
|
fu_dell_clear_smi (FuDellSmiObj *obj);
|
||||||
|
|
||||||
@ -50,6 +101,15 @@ fu_dell_execute_simple_smi (FuDellSmiObj *obj, guint16 class, guint16 select);
|
|||||||
gboolean
|
gboolean
|
||||||
fu_dell_detect_dock (FuDellSmiObj *obj, guint32 *location);
|
fu_dell_detect_dock (FuDellSmiObj *obj, guint32 *location);
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
fu_dell_query_dock (FuDellSmiObj *smi_obj, DOCK_UNION *buf);
|
||||||
|
|
||||||
|
const gchar*
|
||||||
|
fu_dell_get_dock_type (guint8 type);
|
||||||
|
|
||||||
|
guint32
|
||||||
|
fu_dell_get_cable_type (guint8 type);
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_dell_toggle_flash (FuDevice *device, GError **error, gboolean enable);
|
fu_dell_toggle_flash (FuDevice *device, GError **error, gboolean enable);
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
|
|
||||||
#include "fu-plugin-dell.h"
|
#include "fu-plugin-dell.h"
|
||||||
#include "fu-quirks.h"
|
#include "fu-quirks.h"
|
||||||
#include "fu-plugin.h"
|
|
||||||
#include "fu-plugin-vfuncs.h"
|
#include "fu-plugin-vfuncs.h"
|
||||||
|
|
||||||
/* These are used to indicate the status of a previous DELL flash */
|
/* These are used to indicate the status of a previous DELL flash */
|
||||||
@ -76,9 +75,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (FuDellSmiObj, _dell_smi_obj_free);
|
|||||||
|
|
||||||
/* These are for matching the components */
|
/* These are for matching the components */
|
||||||
#define WD15_EC_STR "2 0 2 2 0"
|
#define WD15_EC_STR "2 0 2 2 0"
|
||||||
#define TB15_EC_STR "2 0 2 1 0"
|
#define TB16_EC_STR "2 0 2 1 0"
|
||||||
#define TB15_PC2_STR "2 1 0 1 1"
|
#define TB16_PC2_STR "2 1 0 1 1"
|
||||||
#define TB15_PC1_STR "2 1 0 1 0"
|
#define TB16_PC1_STR "2 1 0 1 0"
|
||||||
#define WD15_PC1_STR "2 1 0 2 0"
|
#define WD15_PC1_STR "2 1 0 2 0"
|
||||||
#define LEGACY_CBL_STR "2 2 2 1 0"
|
#define LEGACY_CBL_STR "2 2 2 1 0"
|
||||||
#define UNIV_CBL_STR "2 2 2 2 0"
|
#define UNIV_CBL_STR "2 2 2 2 0"
|
||||||
@ -87,9 +86,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (FuDellSmiObj, _dell_smi_obj_free);
|
|||||||
/* supported dock related GUIDs */
|
/* supported dock related GUIDs */
|
||||||
#define DOCK_FLASH_GUID EFI_GUID (0xE7CA1F36, 0xBF73, 0x4574, 0xAFE6, 0xA4, 0xCC, 0xAC, 0xAB, 0xF4, 0x79)
|
#define DOCK_FLASH_GUID EFI_GUID (0xE7CA1F36, 0xBF73, 0x4574, 0xAFE6, 0xA4, 0xCC, 0xAC, 0xAB, 0xF4, 0x79)
|
||||||
#define WD15_EC_GUID EFI_GUID (0xE8445370, 0x0211, 0x449D, 0x9FAA, 0x10, 0x79, 0x06, 0xAB, 0x18, 0x9F)
|
#define WD15_EC_GUID EFI_GUID (0xE8445370, 0x0211, 0x449D, 0x9FAA, 0x10, 0x79, 0x06, 0xAB, 0x18, 0x9F)
|
||||||
#define TB15_EC_GUID EFI_GUID (0x33CC8870, 0xB1FC, 0x4EC7, 0x948A, 0xC0, 0x74, 0x96, 0x87, 0x4F, 0xAF)
|
#define TB16_EC_GUID EFI_GUID (0x33CC8870, 0xB1FC, 0x4EC7, 0x948A, 0xC0, 0x74, 0x96, 0x87, 0x4F, 0xAF)
|
||||||
#define TB15_PC2_GUID EFI_GUID (0x1B52C630, 0x86F6, 0x4AEE, 0x9F0C, 0x47, 0x4D, 0xC6, 0xBE, 0x49, 0xB6)
|
#define TB16_PC2_GUID EFI_GUID (0x1B52C630, 0x86F6, 0x4AEE, 0x9F0C, 0x47, 0x4D, 0xC6, 0xBE, 0x49, 0xB6)
|
||||||
#define TB15_PC1_GUID EFI_GUID (0x8FE183DA, 0xC94E, 0x4804, 0xB319, 0x0F, 0x1B, 0xA5, 0x45, 0x7A, 0x69)
|
#define TB16_PC1_GUID EFI_GUID (0x8FE183DA, 0xC94E, 0x4804, 0xB319, 0x0F, 0x1B, 0xA5, 0x45, 0x7A, 0x69)
|
||||||
#define WD15_PC1_GUID EFI_GUID (0x8BA2B709, 0x6F97, 0x47FC, 0xB7E7, 0x6A, 0x87, 0xB5, 0x78, 0xFE, 0x25)
|
#define WD15_PC1_GUID EFI_GUID (0x8BA2B709, 0x6F97, 0x47FC, 0xB7E7, 0x6A, 0x87, 0xB5, 0x78, 0xFE, 0x25)
|
||||||
#define LEGACY_CBL_GUID EFI_GUID (0xFECE1537, 0xD683, 0x4EA8, 0xB968, 0x15, 0x45, 0x30, 0xBB, 0x6F, 0x73)
|
#define LEGACY_CBL_GUID EFI_GUID (0xFECE1537, 0xD683, 0x4EA8, 0xB968, 0x15, 0x45, 0x30, 0xBB, 0x6F, 0x73)
|
||||||
#define UNIV_CBL_GUID EFI_GUID (0xE2BF3AAD, 0x61A3, 0x44BF, 0x91EF, 0x34, 0x9B, 0x39, 0x51, 0x5D, 0x29)
|
#define UNIV_CBL_GUID EFI_GUID (0xE2BF3AAD, 0x61A3, 0x44BF, 0x91EF, 0x34, 0x9B, 0x39, 0x51, 0x5D, 0x29)
|
||||||
@ -129,10 +128,10 @@ fu_plugin_dell_match_dock_component (const gchar *query_str,
|
|||||||
{
|
{
|
||||||
const DOCK_DESCRIPTION list[] = {
|
const DOCK_DESCRIPTION list[] = {
|
||||||
{WD15_EC_GUID, WD15_EC_STR, EC_DESC},
|
{WD15_EC_GUID, WD15_EC_STR, EC_DESC},
|
||||||
{TB15_EC_GUID, TB15_EC_STR, EC_DESC},
|
{TB16_EC_GUID, TB16_EC_STR, EC_DESC},
|
||||||
{WD15_PC1_GUID, WD15_PC1_STR, PC1_DESC},
|
{WD15_PC1_GUID, WD15_PC1_STR, PC1_DESC},
|
||||||
{TB15_PC1_GUID, TB15_PC1_STR, PC1_DESC},
|
{TB16_PC1_GUID, TB16_PC1_STR, PC1_DESC},
|
||||||
{TB15_PC2_GUID, TB15_PC2_STR, PC2_DESC},
|
{TB16_PC2_GUID, TB16_PC2_STR, PC2_DESC},
|
||||||
{TBT_CBL_GUID, TBT_CBL_STR, TBT_CBL_DESC},
|
{TBT_CBL_GUID, TBT_CBL_STR, TBT_CBL_DESC},
|
||||||
{UNIV_CBL_GUID, UNIV_CBL_STR, UNIV_CBL_DESC},
|
{UNIV_CBL_GUID, UNIV_CBL_STR, UNIV_CBL_DESC},
|
||||||
{LEGACY_CBL_GUID, LEGACY_CBL_STR, LEGACY_CBL_DESC},
|
{LEGACY_CBL_GUID, LEGACY_CBL_STR, LEGACY_CBL_DESC},
|
||||||
@ -243,16 +242,9 @@ fu_plugin_dock_node (FuPlugin *plugin, GUsbDevice *device,
|
|||||||
g_autofree gchar *dock_key = NULL;
|
g_autofree gchar *dock_key = NULL;
|
||||||
g_autofree gchar *dock_name = NULL;
|
g_autofree gchar *dock_name = NULL;
|
||||||
|
|
||||||
switch (type) {
|
dock_type = fu_dell_get_dock_type (type);
|
||||||
case DOCK_TYPE_TB15:
|
if (dock_type == NULL) {
|
||||||
dock_type = "TB15/TB16";
|
g_debug ("Unknown dock type %d", type);
|
||||||
break;
|
|
||||||
case DOCK_TYPE_WD15:
|
|
||||||
dock_type = "WD15";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_debug ("Dock type %d unknown",
|
|
||||||
type);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,15 +296,11 @@ fu_plugin_dell_device_added_cb (GUsbContext *ctx,
|
|||||||
guint16 vid;
|
guint16 vid;
|
||||||
const gchar *query_str;
|
const gchar *query_str;
|
||||||
const gchar *component_name = NULL;
|
const gchar *component_name = NULL;
|
||||||
INFO_UNION buf;
|
DOCK_UNION buf;
|
||||||
DOCK_INFO *dock_info;
|
DOCK_INFO *dock_info;
|
||||||
guint buf_size;
|
|
||||||
gint result;
|
|
||||||
guint32 location;
|
|
||||||
efi_guid_t guid_raw;
|
efi_guid_t guid_raw;
|
||||||
efi_guid_t tmpguid;
|
efi_guid_t tmpguid;
|
||||||
gboolean old_ec = FALSE;
|
gboolean old_ec = FALSE;
|
||||||
|
|
||||||
g_autofree gchar *fw_str = NULL;
|
g_autofree gchar *fw_str = NULL;
|
||||||
|
|
||||||
/* don't look up immediately if a dock is connected as that would
|
/* don't look up immediately if a dock is connected as that would
|
||||||
@ -328,37 +316,10 @@ fu_plugin_dell_device_added_cb (GUsbContext *ctx,
|
|||||||
/* we're going to match on the Realtek NIC in the dock */
|
/* we're going to match on the Realtek NIC in the dock */
|
||||||
if (vid != DOCK_NIC_VID || pid != DOCK_NIC_PID)
|
if (vid != DOCK_NIC_VID || pid != DOCK_NIC_PID)
|
||||||
return;
|
return;
|
||||||
if (!fu_dell_detect_dock (data->smi_obj, &location))
|
|
||||||
return;
|
|
||||||
|
|
||||||
fu_dell_clear_smi (data->smi_obj);
|
buf.buf = NULL;
|
||||||
|
if (!fu_dell_query_dock (data->smi_obj, &buf)) {
|
||||||
/* look up more information on dock */
|
g_debug ("No dock detected.");
|
||||||
if (!data->smi_obj->fake_smbios) {
|
|
||||||
dell_smi_obj_set_class (data->smi_obj->smi, DACI_DOCK_CLASS);
|
|
||||||
dell_smi_obj_set_select (data->smi_obj->smi, DACI_DOCK_SELECT);
|
|
||||||
dell_smi_obj_set_arg (data->smi_obj->smi, cbARG1, DACI_DOCK_ARG_INFO);
|
|
||||||
dell_smi_obj_set_arg (data->smi_obj->smi, cbARG2, location);
|
|
||||||
buf_size = sizeof (DOCK_INFO_RECORD);
|
|
||||||
buf.buf = dell_smi_obj_make_buffer_frombios_auto (data->smi_obj->smi, cbARG3, buf_size);
|
|
||||||
if (!buf.buf) {
|
|
||||||
g_debug ("Failed to initialize buffer");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buf.buf = data->smi_obj->fake_buffer;
|
|
||||||
}
|
|
||||||
if (!fu_dell_execute_smi (data->smi_obj))
|
|
||||||
return;
|
|
||||||
result = fu_dell_get_res (data->smi_obj, cbARG1);
|
|
||||||
if (result != SMI_SUCCESS) {
|
|
||||||
if (result == SMI_INVALID_BUFFER) {
|
|
||||||
g_debug ("Invalid buffer size, needed %" G_GUINT32_FORMAT,
|
|
||||||
fu_dell_get_res (data->smi_obj, cbARG2));
|
|
||||||
} else {
|
|
||||||
g_debug ("SMI execution returned error: %d",
|
|
||||||
result);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,8 +408,8 @@ fu_plugin_dell_device_removed_cb (GUsbContext *ctx,
|
|||||||
FuPluginData *data = fu_plugin_get_data (plugin);
|
FuPluginData *data = fu_plugin_get_data (plugin);
|
||||||
FuPluginDockItem *item;
|
FuPluginDockItem *item;
|
||||||
g_autofree gchar *dock_key = NULL;
|
g_autofree gchar *dock_key = NULL;
|
||||||
const efi_guid_t guids[] = { WD15_EC_GUID, TB15_EC_GUID, TB15_PC2_GUID,
|
const efi_guid_t guids[] = { WD15_EC_GUID, TB16_EC_GUID, TB16_PC2_GUID,
|
||||||
TB15_PC1_GUID, WD15_PC1_GUID,
|
TB16_PC1_GUID, WD15_PC1_GUID,
|
||||||
LEGACY_CBL_GUID, UNIV_CBL_GUID,
|
LEGACY_CBL_GUID, UNIV_CBL_GUID,
|
||||||
TBT_CBL_GUID, DOCK_FLASH_GUID};
|
TBT_CBL_GUID, DOCK_FLASH_GUID};
|
||||||
const efi_guid_t *guid_raw;
|
const efi_guid_t *guid_raw;
|
||||||
|
@ -66,55 +66,4 @@ struct tpm_status {
|
|||||||
#define TPM_1_2_MODE 0x0001
|
#define TPM_1_2_MODE 0x0001
|
||||||
#define TPM_2_0_MODE 0x0002
|
#define TPM_2_0_MODE 0x0002
|
||||||
|
|
||||||
/* Dock Info version 1 */
|
|
||||||
#pragma pack(1)
|
|
||||||
#define MAX_COMPONENTS 5
|
|
||||||
|
|
||||||
typedef struct _COMPONENTS {
|
|
||||||
gchar description[80];
|
|
||||||
guint32 fw_version; /* BCD format: 0x00XXYYZZ */
|
|
||||||
} COMPONENTS;
|
|
||||||
|
|
||||||
typedef struct _DOCK_INFO {
|
|
||||||
gchar dock_description[80];
|
|
||||||
guint32 flash_pkg_version; /* BCD format: 0x00XXYYZZ */
|
|
||||||
guint32 cable_type; /* bit0-7 cable type, bit7-31 set to 0 */
|
|
||||||
guint8 location; /* Location of the dock */
|
|
||||||
guint8 reserved;
|
|
||||||
guint8 component_count;
|
|
||||||
COMPONENTS components[MAX_COMPONENTS]; /* number of component_count */
|
|
||||||
} DOCK_INFO;
|
|
||||||
|
|
||||||
typedef struct _DOCK_INFO_HEADER {
|
|
||||||
guint8 dir_version; /* version 1, 2 … */
|
|
||||||
guint8 dock_type;
|
|
||||||
guint16 reserved;
|
|
||||||
} DOCK_INFO_HEADER;
|
|
||||||
|
|
||||||
typedef struct _DOCK_INFO_RECORD {
|
|
||||||
DOCK_INFO_HEADER dock_info_header; /* dock version specific definition */
|
|
||||||
DOCK_INFO dock_info;
|
|
||||||
} DOCK_INFO_RECORD;
|
|
||||||
|
|
||||||
typedef union _INFO_UNION{
|
|
||||||
guint8 *buf;
|
|
||||||
DOCK_INFO_RECORD *record;
|
|
||||||
} INFO_UNION;
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
typedef enum _DOCK_TYPE
|
|
||||||
{
|
|
||||||
DOCK_TYPE_NONE,
|
|
||||||
DOCK_TYPE_TB15,
|
|
||||||
DOCK_TYPE_WD15
|
|
||||||
} DOCK_TYPE;
|
|
||||||
|
|
||||||
typedef enum _CABLE_TYPE
|
|
||||||
{
|
|
||||||
CABLE_TYPE_NONE,
|
|
||||||
CABLE_TYPE_LEGACY,
|
|
||||||
CABLE_TYPE_UNIV,
|
|
||||||
CABLE_TYPE_TBT
|
|
||||||
} CABLE_TYPE;
|
|
||||||
|
|
||||||
#endif /* __FU_PLUGIN_DELL_H */
|
#endif /* __FU_PLUGIN_DELL_H */
|
||||||
|
@ -235,7 +235,7 @@ fu_plugin_dell_dock_func (void)
|
|||||||
gboolean ret;
|
gboolean ret;
|
||||||
guint cnt = 0;
|
guint cnt = 0;
|
||||||
guint32 out[4];
|
guint32 out[4];
|
||||||
INFO_UNION buf;
|
DOCK_UNION buf;
|
||||||
DOCK_INFO *dock_info;
|
DOCK_INFO *dock_info;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
g_autoptr(FuDevice) device = NULL;
|
g_autoptr(FuDevice) device = NULL;
|
||||||
@ -275,11 +275,11 @@ fu_plugin_dell_dock_func (void)
|
|||||||
fu_plugin_dell_device_added_cb (NULL, NULL, plugin);
|
fu_plugin_dell_device_added_cb (NULL, NULL, plugin);
|
||||||
g_assert (device == NULL);
|
g_assert (device == NULL);
|
||||||
|
|
||||||
/* inject valid TB15 dock w/ invalid flash pkg version */
|
/* inject valid TB16 dock w/ invalid flash pkg version */
|
||||||
buf.record = g_malloc0(sizeof(DOCK_INFO_RECORD));
|
buf.record = g_malloc0 (sizeof(DOCK_INFO_RECORD));
|
||||||
dock_info = &buf.record->dock_info;
|
dock_info = &buf.record->dock_info;
|
||||||
buf.record->dock_info_header.dir_version = 1;
|
buf.record->dock_info_header.dir_version = 1;
|
||||||
buf.record->dock_info_header.dock_type = DOCK_TYPE_TB15;
|
buf.record->dock_info_header.dock_type = DOCK_TYPE_TB16;
|
||||||
memcpy (dock_info->dock_description,
|
memcpy (dock_info->dock_description,
|
||||||
"BME_Dock", 8);
|
"BME_Dock", 8);
|
||||||
dock_info->flash_pkg_version = 0x00ffffff;
|
dock_info->flash_pkg_version = 0x00ffffff;
|
||||||
@ -312,11 +312,11 @@ fu_plugin_dell_dock_func (void)
|
|||||||
fu_plugin_dell_device_removed_cb (NULL, NULL,
|
fu_plugin_dell_device_removed_cb (NULL, NULL,
|
||||||
plugin);
|
plugin);
|
||||||
|
|
||||||
/* inject valid TB15 dock w/ older system EC */
|
/* inject valid TB16 dock w/ older system EC */
|
||||||
buf.record = g_malloc0(sizeof(DOCK_INFO_RECORD));
|
buf.record = g_malloc0 (sizeof(DOCK_INFO_RECORD));
|
||||||
dock_info = &buf.record->dock_info;
|
dock_info = &buf.record->dock_info;
|
||||||
buf.record->dock_info_header.dir_version = 1;
|
buf.record->dock_info_header.dir_version = 1;
|
||||||
buf.record->dock_info_header.dock_type = DOCK_TYPE_TB15;
|
buf.record->dock_info_header.dock_type = DOCK_TYPE_TB16;
|
||||||
memcpy (dock_info->dock_description,
|
memcpy (dock_info->dock_description,
|
||||||
"BME_Dock", 8);
|
"BME_Dock", 8);
|
||||||
dock_info->flash_pkg_version = 0x43;
|
dock_info->flash_pkg_version = 0x43;
|
||||||
@ -351,7 +351,7 @@ fu_plugin_dell_dock_func (void)
|
|||||||
|
|
||||||
|
|
||||||
/* inject valid WD15 dock w/ invalid flash pkg version */
|
/* inject valid WD15 dock w/ invalid flash pkg version */
|
||||||
buf.record = g_malloc0(sizeof(DOCK_INFO_RECORD));
|
buf.record = g_malloc0 (sizeof(DOCK_INFO_RECORD));
|
||||||
dock_info = &buf.record->dock_info;
|
dock_info = &buf.record->dock_info;
|
||||||
buf.record->dock_info_header.dir_version = 1;
|
buf.record->dock_info_header.dir_version = 1;
|
||||||
buf.record->dock_info_header.dock_type = DOCK_TYPE_WD15;
|
buf.record->dock_info_header.dock_type = DOCK_TYPE_WD15;
|
||||||
@ -386,7 +386,7 @@ fu_plugin_dell_dock_func (void)
|
|||||||
|
|
||||||
|
|
||||||
/* inject valid WD15 dock w/ older system EC */
|
/* inject valid WD15 dock w/ older system EC */
|
||||||
buf.record = g_malloc0(sizeof(DOCK_INFO_RECORD));
|
buf.record = g_malloc0 (sizeof(DOCK_INFO_RECORD));
|
||||||
dock_info = &buf.record->dock_info;
|
dock_info = &buf.record->dock_info;
|
||||||
buf.record->dock_info_header.dir_version = 1;
|
buf.record->dock_info_header.dir_version = 1;
|
||||||
buf.record->dock_info_header.dock_type = DOCK_TYPE_WD15;
|
buf.record->dock_info_header.dock_type = DOCK_TYPE_WD15;
|
||||||
@ -420,7 +420,7 @@ fu_plugin_dell_dock_func (void)
|
|||||||
plugin);
|
plugin);
|
||||||
|
|
||||||
/* inject an invalid future dock */
|
/* inject an invalid future dock */
|
||||||
buf.record = g_malloc0(sizeof(DOCK_INFO_RECORD));
|
buf.record = g_malloc0 (sizeof(DOCK_INFO_RECORD));
|
||||||
dock_info = &buf.record->dock_info;
|
dock_info = &buf.record->dock_info;
|
||||||
buf.record->dock_info_header.dir_version = 1;
|
buf.record->dock_info_header.dir_version = 1;
|
||||||
buf.record->dock_info_header.dock_type = 50;
|
buf.record->dock_info_header.dock_type = 50;
|
||||||
|
Loading…
Reference in New Issue
Block a user