return 0;
 }
 
+/* -------------------------------------------------------------------------- */
+/* 0x0003: Device Information                                                 */
+/* -------------------------------------------------------------------------- */
+
+#define HIDPP_PAGE_DEVICE_INFORMATION                  0x0003
+
+#define CMD_GET_DEVICE_INFO                            0x00
+
+static int hidpp_get_serial(struct hidpp_device *hidpp, u32 *serial)
+{
+       struct hidpp_report response;
+       u8 feature_type;
+       u8 feature_index;
+       int ret;
+
+       ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_DEVICE_INFORMATION,
+                                    &feature_index,
+                                    &feature_type);
+       if (ret)
+               return ret;
+
+       ret = hidpp_send_fap_command_sync(hidpp, feature_index,
+                                         CMD_GET_DEVICE_INFO,
+                                         NULL, 0, &response);
+       if (ret)
+               return ret;
+
+       /* See hidpp_unifying_get_serial() */
+       *serial = *((u32 *)&response.rap.params[1]);
+       return 0;
+}
+
+static int hidpp_serial_init(struct hidpp_device *hidpp)
+{
+       struct hid_device *hdev = hidpp->hid_dev;
+       u32 serial;
+       int ret;
+
+       ret = hidpp_get_serial(hidpp, &serial);
+       if (ret)
+               return ret;
+
+       snprintf(hdev->uniq, sizeof(hdev->uniq), "%04x-%4phD",
+                hdev->product, &serial);
+       dbg_hid("HID++ DeviceInformation: Got serial: %s\n", hdev->uniq);
+
+       return 0;
+}
+
 /* -------------------------------------------------------------------------- */
 /* 0x0005: GetDeviceNameType                                                  */
 /* -------------------------------------------------------------------------- */
 
        if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
                hidpp_unifying_init(hidpp);
+       else if (hid_is_usb(hidpp->hid_dev))
+               hidpp_serial_init(hidpp);
 
        connected = hidpp_root_get_protocol_version(hidpp) == 0;
        atomic_set(&hidpp->connected, connected);