steelseries: Add datasz to fu_steelseries_device_cmd()

Additionaly, this:
 - removes the unused function fu_steelseries_device_get_transfer_size()
 - renames function fu_steelseries_device_command_error_to_error() to
  fu_steelseries_fizz_command_error_to_error()
This commit is contained in:
Gaël PORTAY 2022-06-09 15:34:50 +02:00 committed by Gaël PORTAY
parent 40ba65ce28
commit 99f310e11a
5 changed files with 121 additions and 52 deletions

View File

@ -18,13 +18,6 @@ typedef struct {
G_DEFINE_TYPE_WITH_PRIVATE(FuSteelseriesDevice, fu_steelseries_device, FU_TYPE_USB_DEVICE)
#define GET_PRIVATE(o) (fu_steelseries_device_get_instance_private(o))
gsize
fu_steelseries_device_get_transfer_size(FuSteelseriesDevice *self)
{
FuSteelseriesDevicePrivate *priv = GET_PRIVATE(self);
return priv->ep_in_size;
}
/* @iface_idx_offset can be negative to specify from the end */
void
fu_steelseries_device_set_iface_idx_offset(FuSteelseriesDevice *self, gint iface_idx_offset)
@ -34,7 +27,11 @@ fu_steelseries_device_set_iface_idx_offset(FuSteelseriesDevice *self, gint iface
}
gboolean
fu_steelseries_device_cmd(FuSteelseriesDevice *self, guint8 *data, gboolean answer, GError **error)
fu_steelseries_device_cmd(FuSteelseriesDevice *self,
guint8 *data,
gsize datasz,
gboolean answer,
GError **error)
{
FuSteelseriesDevicePrivate *priv = GET_PRIVATE(self);
GUsbDevice *usb_device = fu_usb_device_get_dev(FU_USB_DEVICE(self));
@ -49,7 +46,7 @@ fu_steelseries_device_cmd(FuSteelseriesDevice *self, guint8 *data, gboolean answ
0x0200,
priv->iface_idx,
data,
STEELSERIES_BUFFER_CONTROL_SIZE,
datasz,
&actual_len,
STEELSERIES_TRANSACTION_TIMEOUT,
NULL,
@ -58,7 +55,7 @@ fu_steelseries_device_cmd(FuSteelseriesDevice *self, guint8 *data, gboolean answ
g_prefix_error(error, "failed to do control transfer: ");
return FALSE;
}
if (actual_len != STEELSERIES_BUFFER_CONTROL_SIZE) {
if (actual_len != datasz) {
g_set_error(error,
G_IO_ERROR,
G_IO_ERROR_INVALID_DATA,
@ -68,7 +65,7 @@ fu_steelseries_device_cmd(FuSteelseriesDevice *self, guint8 *data, gboolean answ
}
/* cleanup the buffer before receiving any data */
memset(data, 0x00, STEELSERIES_BUFFER_CONTROL_SIZE);
memset(data, 0x00, datasz);
/* do not expect the answer from device */
if (answer != TRUE)

View File

@ -35,7 +35,9 @@ struct _FuSteelseriesDeviceClass {
void
fu_steelseries_device_set_iface_idx_offset(FuSteelseriesDevice *self, gint iface_idx_offset);
gsize
fu_steelseries_device_get_transfer_size(FuSteelseriesDevice *self);
gboolean
fu_steelseries_device_cmd(FuSteelseriesDevice *self, guint8 *data, gboolean answer, GError **error);
fu_steelseries_device_cmd(FuSteelseriesDevice *self,
guint8 *data,
gsize datasz,
gboolean answer,
GError **error);

View File

@ -79,7 +79,7 @@ struct _FuSteelseriesFizz {
G_DEFINE_TYPE(FuSteelseriesFizz, fu_steelseries_fizz, FU_TYPE_STEELSERIES_DEVICE)
static gboolean
fu_steelseries_device_command_error_to_error(guint8 cmd, guint8 err, GError **error)
fu_steelseries_fizz_command_error_to_error(guint8 cmd, guint8 err, GError **error)
{
/* success */
if (err == STEELSERIES_FIZZ_COMMAND_ERROR_SUCCESS)
@ -150,22 +150,20 @@ fu_steelseries_device_command_error_to_error(guint8 cmd, guint8 err, GError **er
}
static gboolean
fu_steelseries_device_command_and_check_error(FuDevice *device, guint8 *data, GError **error)
fu_steelseries_fizz_command_and_check_error(FuDevice *device,
guint8 *data,
gsize datasz,
GError **error)
{
gint gerr = G_FILE_ERROR_FAILED;
const guint8 command = data[0];
guint8 err;
guint8 cmd;
gsize transfer_sz = fu_steelseries_device_get_transfer_size(FU_STEELSERIES_DEVICE(device));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, datasz, TRUE, error))
return FALSE;
if (!fu_common_read_uint8_safe(data,
transfer_sz,
STEELSERIES_FIZZ_COMMAND_OFFSET,
&cmd,
error))
if (!fu_common_read_uint8_safe(data, datasz, STEELSERIES_FIZZ_COMMAND_OFFSET, &cmd, error))
return FALSE;
if (cmd != command) {
@ -178,14 +176,10 @@ fu_steelseries_device_command_and_check_error(FuDevice *device, guint8 *data, GE
return FALSE;
}
if (!fu_common_read_uint8_safe(data,
transfer_sz,
STEELSERIES_FIZZ_ERROR_OFFSET,
&err,
error))
if (!fu_common_read_uint8_safe(data, datasz, STEELSERIES_FIZZ_ERROR_OFFSET, &err, error))
return FALSE;
return fu_steelseries_device_command_error_to_error(cmd, err, error);
return fu_steelseries_fizz_command_error_to_error(cmd, err, error);
}
gchar *
@ -214,7 +208,11 @@ fu_steelseries_fizz_get_version(FuDevice *device, gboolean tunnel, GError **erro
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "Version", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return NULL;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "Version", data, sizeof(data));
@ -298,7 +296,7 @@ fu_steelseries_fizz_write_fs(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "AccessFile", data, sizeof(data));
if (!fu_steelseries_device_command_and_check_error(device, data, error))
if (!fu_steelseries_fizz_command_and_check_error(device, data, sizeof(data), error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "AccessFile", data, sizeof(data));
@ -346,7 +344,7 @@ fu_steelseries_fizz_erase_fs(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "EraseFile", data, sizeof(data));
if (!fu_steelseries_device_command_and_check_error(device, data, error))
if (!fu_steelseries_fizz_command_and_check_error(device, data, sizeof(data), error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "EraseFile", data, sizeof(data));
@ -380,7 +378,11 @@ fu_steelseries_fizz_reset(FuDevice *device, gboolean tunnel, guint8 mode, GError
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "Reset", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
/* success */
@ -426,7 +428,7 @@ fu_steelseries_fizz_get_crc32_fs(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "FileCRC32", data, sizeof(data));
if (!fu_steelseries_device_command_and_check_error(device, data, error))
if (!fu_steelseries_fizz_command_and_check_error(device, data, sizeof(data), error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "FileCRC32", data, sizeof(data));
@ -516,7 +518,7 @@ fu_steelseries_fizz_read_fs(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "AccessFile", data, sizeof(data));
if (!fu_steelseries_device_command_and_check_error(device, data, error))
if (!fu_steelseries_fizz_command_and_check_error(device, data, sizeof(data), error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "AccessFile", data, sizeof(data));
@ -559,7 +561,11 @@ fu_steelseries_fizz_get_battery_level(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "BatteryLevel", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "BatteryLevel", data, sizeof(data));
@ -590,7 +596,11 @@ fu_steelseries_fizz_get_paired_status(FuDevice *device, guint8 *status, GError *
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "PairedStatus", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "PairedStatus", data, sizeof(data));
@ -621,7 +631,11 @@ fu_steelseries_fizz_get_connection_status(FuDevice *device, guint8 *status, GErr
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "ConnectionStatus", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_FIZZ_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "ConnectionStatus", data, sizeof(data));

View File

@ -33,7 +33,11 @@ fu_steelseries_gamepad_cmd_erase(FuDevice *device, GError **error)
data[13] = 0x02;
}
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error)) {
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error)) {
g_prefix_error(error, "unable erase flash block: ");
return FALSE;
}
@ -57,7 +61,11 @@ fu_steelseries_gamepad_setup(FuDevice *device, GError **error)
/* get version of FW and bootloader */
data[0] = 0x12;
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (!fu_common_read_uint16_safe(data, sizeof(data), 0x01, &fw_ver, G_LITTLE_ENDIAN, error))
@ -86,7 +94,11 @@ fu_steelseries_gamepad_attach(FuDevice *device, FuProgress *progress, GError **e
return TRUE;
/* switch to runtime mode */
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, &error_local))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
&error_local))
g_debug("ignoring error on reset: %s", error_local->message);
fu_device_add_flag(device, FWUPD_DEVICE_FLAG_WAIT_FOR_REPLUG);
@ -104,7 +116,11 @@ fu_steelseries_gamepad_detach(FuDevice *device, FuProgress *progress, GError **e
return TRUE;
/* switch to bootloader mode */
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, &error_local))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
&error_local))
g_debug("ignoring error on reset: %s", error_local->message);
/* controller will be renumbered after switching to bootloader mode */
@ -160,7 +176,11 @@ fu_steelseries_gamepad_write_firmware_chunks(FuDevice *device,
*checksum += (guint32)chunk_checksum;
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error)) {
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error)) {
g_prefix_error(error, "unable to flash block %u: ", id);
return FALSE;
}
@ -186,7 +206,11 @@ fu_steelseries_gamepad_write_checksum(FuDevice *device, guint32 checksum, GError
error))
return FALSE;
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error)) {
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error)) {
g_prefix_error(error, "unable to write checksum: ");
return FALSE;
}

View File

@ -102,7 +102,11 @@ fu_steelseries_sonic_wireless_status(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "WirelessStatus", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
@ -142,7 +146,11 @@ fu_steelseries_sonic_battery_state(FuDevice *device, guint16 *value, GError **er
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "BatteryState", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
@ -205,7 +213,11 @@ fu_steelseries_sonic_read_from_ram(FuDevice *device,
error))
return FALSE;
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, TRUE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
TRUE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "ReadFromRAM", data, sizeof(data));
@ -285,7 +297,11 @@ fu_steelseries_sonic_read_from_flash(FuDevice *device,
error))
return FALSE;
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "ReadFromFlash", data, sizeof(data));
@ -367,7 +383,11 @@ fu_steelseries_sonic_write_to_ram(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "WriteToRAM", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
/* timeout to give some time to write to ram */
@ -446,7 +466,11 @@ fu_steelseries_sonic_write_to_flash(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "WriteToFlash", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
/* timeout to give some time to write from ram to flash */
@ -491,7 +515,11 @@ fu_steelseries_sonic_erase(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "Erase", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
/* timeout to give some time to erase flash */
@ -526,7 +554,11 @@ fu_steelseries_sonic_restart(FuDevice *device,
if (g_getenv("FWUPD_STEELSERIES_SONIC_VERBOSE") != NULL)
fu_common_dump_raw(G_LOG_DOMAIN, "Restart", data, sizeof(data));
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device), data, FALSE, error))
if (!fu_steelseries_device_cmd(FU_STEELSERIES_DEVICE(device),
data,
sizeof(data),
FALSE,
error))
return FALSE;
/* timeout to give some time to restart chip */