mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-21 13:32:22 +00:00
Rescan the DFU device after replug to get the new version
This commit is contained in:
parent
a3a8f5039c
commit
a45d00eb2c
@ -67,15 +67,16 @@ fu_provider_usb_get_id (GUsbDevice *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_provider_usb_device_add:
|
* fu_provider_usb_device_update:
|
||||||
*
|
*
|
||||||
* Important, the device must already be open!
|
* Important, the device must already be open!
|
||||||
**/
|
**/
|
||||||
static void
|
static gboolean
|
||||||
fu_provider_usb_device_add (FuProviderUsb *provider_usb, const gchar *id, GUsbDevice *device)
|
fu_provider_usb_device_update (FuProviderUsb *provider_usb,
|
||||||
|
FuDevice *dev,
|
||||||
|
GUsbDevice *device,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
FuProviderUsbPrivate *priv = GET_PRIVATE (provider_usb);
|
|
||||||
FuDevice *dev;
|
|
||||||
guint8 idx = 0x00;
|
guint8 idx = 0x00;
|
||||||
g_autofree gchar *guid = NULL;
|
g_autofree gchar *guid = NULL;
|
||||||
g_autofree gchar *product = NULL;
|
g_autofree gchar *product = NULL;
|
||||||
@ -92,8 +93,11 @@ fu_provider_usb_device_add (FuProviderUsb *provider_usb, const gchar *id, GUsbDe
|
|||||||
product = g_usb_device_get_string_descriptor (device, idx, NULL);
|
product = g_usb_device_get_string_descriptor (device, idx, NULL);
|
||||||
}
|
}
|
||||||
if (product == NULL) {
|
if (product == NULL) {
|
||||||
g_debug ("ignoring %s as no product string descriptor", id);
|
g_set_error_literal (error,
|
||||||
return;
|
FWUPD_ERROR,
|
||||||
|
FWUPD_ERROR_NOT_SUPPORTED,
|
||||||
|
"no product string descriptor");
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get version number, falling back to the USB device release */
|
/* get version number, falling back to the USB device release */
|
||||||
@ -125,8 +129,6 @@ fu_provider_usb_device_add (FuProviderUsb *provider_usb, const gchar *id, GUsbDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* insert to hash */
|
/* insert to hash */
|
||||||
dev = fu_device_new ();
|
|
||||||
fu_device_set_id (dev, id);
|
|
||||||
fu_device_set_guid (dev, guid);
|
fu_device_set_guid (dev, guid);
|
||||||
fu_device_set_display_name (dev, product);
|
fu_device_set_display_name (dev, product);
|
||||||
fu_device_set_metadata (dev, FU_DEVICE_KEY_VERSION, version);
|
fu_device_set_metadata (dev, FU_DEVICE_KEY_VERSION, version);
|
||||||
@ -141,9 +143,29 @@ fu_provider_usb_device_add (FuProviderUsb *provider_usb, const gchar *id, GUsbDe
|
|||||||
} else {
|
} else {
|
||||||
g_debug ("not a DFU device");
|
g_debug ("not a DFU device");
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* good to go */
|
/**
|
||||||
g_hash_table_insert (priv->devices, g_strdup (id), dev);
|
* fu_provider_usb_device_add:
|
||||||
|
*
|
||||||
|
* Important, the device must already be open!
|
||||||
|
**/
|
||||||
|
static void
|
||||||
|
fu_provider_usb_device_add (FuProviderUsb *provider_usb, const gchar *id, GUsbDevice *device)
|
||||||
|
{
|
||||||
|
FuProviderUsbPrivate *priv = GET_PRIVATE (provider_usb);
|
||||||
|
g_autoptr(FuDevice) dev = NULL;
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
|
||||||
|
/* insert to hash if valid */
|
||||||
|
dev = fu_device_new ();
|
||||||
|
fu_device_set_id (dev, id);
|
||||||
|
if (!fu_provider_usb_device_update (provider_usb, dev, device, &error)) {
|
||||||
|
g_debug ("Failed to add %s: %s", id, error->message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_hash_table_insert (priv->devices, g_strdup (id), g_object_ref (dev));
|
||||||
fu_provider_device_add (FU_PROVIDER (provider_usb), dev);
|
fu_provider_device_add (FU_PROVIDER (provider_usb), dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,14 +201,6 @@ fu_provider_usb_device_added_cb (GUsbContext *ctx,
|
|||||||
g_autoptr(AsProfile) profile = as_profile_new ();
|
g_autoptr(AsProfile) profile = as_profile_new ();
|
||||||
g_autoptr(AsProfileTask) ptask = NULL;
|
g_autoptr(AsProfileTask) ptask = NULL;
|
||||||
|
|
||||||
/* doing DFU replug */
|
|
||||||
if (!fu_provider_usb_event_valid (provider_usb)) {
|
|
||||||
g_debug ("ignoring device addition of %04x:%04x",
|
|
||||||
g_usb_device_get_vid (device),
|
|
||||||
g_usb_device_get_pid (device));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ignore hubs */
|
/* ignore hubs */
|
||||||
if (g_usb_device_get_device_class (device) == G_USB_DEVICE_CLASS_HUB)
|
if (g_usb_device_get_device_class (device) == G_USB_DEVICE_CLASS_HUB)
|
||||||
return;
|
return;
|
||||||
@ -212,6 +226,19 @@ fu_provider_usb_device_added_cb (GUsbContext *ctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* doing DFU replug */
|
||||||
|
if (!fu_provider_usb_event_valid (provider_usb)) {
|
||||||
|
g_debug ("ignoring device addition of %04x:%04x",
|
||||||
|
g_usb_device_get_vid (device),
|
||||||
|
g_usb_device_get_pid (device));
|
||||||
|
dev = g_hash_table_lookup (priv->devices, id);
|
||||||
|
if (dev != NULL) {
|
||||||
|
g_debug ("Updating device after firmware flash");
|
||||||
|
fu_provider_usb_device_update (provider_usb, dev, device, NULL);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* is already in database */
|
/* is already in database */
|
||||||
dev = g_hash_table_lookup (priv->devices, id);
|
dev = g_hash_table_lookup (priv->devices, id);
|
||||||
if (dev != NULL) {
|
if (dev != NULL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user