Patchwork [1/3] dediprog: Fix dediprog_device_init()

login
register
about
Submitter David Hendricks
Date 2015-08-02 01:07:16
Message ID <CAAAYX_gZNPEmssYcR3QQL39KWP9=wyT5pZxNicqWTq8cLSXzKQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/4313/
State Not for merge
Headers show

Comments

David Hendricks - 2015-08-02 01:07:16
As per e-mail with Dediprog, command 0x0B (which is not listed in the
command spec) is used to set voltage level on older Dediprogs. SF100
V6.0.0 and newer as well as all SF600 programmers do not support it.

This patch renames the function and adds comments for clarity, and
only runs it conditionally if we cannot query the devicestring during
init.

Tested with SF100 V:5.1.5 and SF600 V:7.1.4 (with subsequent patches).
Signed-off-by: David Hendricks <dhendrix@chromium.org>

  msg_perr("Command A failed (%s)!\n", usb_strerror());
@@ -595,6 +598,7 @@
  msg_perr("Unexpected response to init!\n");
  return 1;
  }
+
  return 0;
 }

@@ -853,11 +857,15 @@
  if (register_shutdown(dediprog_shutdown, NULL))
  return 1;

- /* Perform basic setup. */
- if (dediprog_device_init())
- return 1;
- if (dediprog_check_devicestring())
- return 1;
+ /* Try reading the devicestring. If that fails and the device is old
+ * (FW < 6.0.0) then we need to try the "set voltage" command and then
+ * attempt to read the devicestring again. */
+ if (dediprog_check_devicestring()) {
+ if (dediprog_set_voltage())
+ return 1;
+ if (dediprog_check_devicestring())
+ return 1;
+ }

  /* Set all possible LEDs as soon as possible to indicate activity.
  * Because knowing the firmware version is required to set the LEDs
correctly we need to this after
David Hendricks - 2015-08-02 01:25:29
Hmmm, on second thoughts my other 2 patches were basically just
rebasing the other patches to add new protocol support and add basic
SF600 support. No need to re-hash them. Just apply this along with the
other two patches and SF600 should work (reads, not writes).

On Sat, Aug 1, 2015 at 6:07 PM, David Hendricks <dhendrix@chromium.org> wrote:
> As per e-mail with Dediprog, command 0x0B (which is not listed in the
> command spec) is used to set voltage level on older Dediprogs. SF100
> V6.0.0 and newer as well as all SF600 programmers do not support it.
>
> This patch renames the function and adds comments for clarity, and
> only runs it conditionally if we cannot query the devicestring during
> init.
>
> Tested with SF100 V:5.1.5 and SF600 V:7.1.4 (with subsequent patches).
> Signed-off-by: David Hendricks <dhendrix@chromium.org>
>
> Index: dediprog.c
> ===================================================================
> --- dediprog.c (revision 1896)
> +++ dediprog.c (working copy)
> @@ -75,6 +75,7 @@
>   CMD_READ_PROG_INFO = 0x08,
>   CMD_SET_VCC = 0x09,
>   CMD_SET_STANDALONE = 0x0A,
> + CMD_SET_VOLTAGE = 0x0B, /* Only in firmware older than 6.0.0 */
>   CMD_GET_BUTTON = 0x11,
>   CMD_GET_UID = 0x12,
>   CMD_SET_CS = 0x14,
> @@ -579,13 +580,15 @@
>   return 0;
>  }
>
> -static int dediprog_device_init(void)
> +/* Only use dediprog_set_voltage on SF100 programmers with firmware older
> + * than V6.0.0. Newer programmers (including all SF600s) do not support it. */
> +static int dediprog_set_voltage(void)
>  {
>   int ret;
>   char buf[0x1];
>
>   memset(buf, 0, sizeof(buf));
> - ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN, 0x0B, 0x0, 0x0,
> + ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN,
> CMD_SET_VOLTAGE, 0x0, 0x0,
>        buf, 0x1, DEFAULT_TIMEOUT);
>   if (ret < 0) {
>   msg_perr("Command A failed (%s)!\n", usb_strerror());
> @@ -595,6 +598,7 @@
>   msg_perr("Unexpected response to init!\n");
>   return 1;
>   }
> +
>   return 0;
>  }
>
> @@ -853,11 +857,15 @@
>   if (register_shutdown(dediprog_shutdown, NULL))
>   return 1;
>
> - /* Perform basic setup. */
> - if (dediprog_device_init())
> - return 1;
> - if (dediprog_check_devicestring())
> - return 1;
> + /* Try reading the devicestring. If that fails and the device is old
> + * (FW < 6.0.0) then we need to try the "set voltage" command and then
> + * attempt to read the devicestring again. */
> + if (dediprog_check_devicestring()) {
> + if (dediprog_set_voltage())
> + return 1;
> + if (dediprog_check_devicestring())
> + return 1;
> + }
>
>   /* Set all possible LEDs as soon as possible to indicate activity.
>   * Because knowing the firmware version is required to set the LEDs
> correctly we need to this after

Patch

Index: dediprog.c
===================================================================
--- dediprog.c (revision 1896)
+++ dediprog.c (working copy)
@@ -75,6 +75,7 @@ 
  CMD_READ_PROG_INFO = 0x08,
  CMD_SET_VCC = 0x09,
  CMD_SET_STANDALONE = 0x0A,
+ CMD_SET_VOLTAGE = 0x0B, /* Only in firmware older than 6.0.0 */
  CMD_GET_BUTTON = 0x11,
  CMD_GET_UID = 0x12,
  CMD_SET_CS = 0x14,
@@ -579,13 +580,15 @@ 
  return 0;
 }

-static int dediprog_device_init(void)
+/* Only use dediprog_set_voltage on SF100 programmers with firmware older
+ * than V6.0.0. Newer programmers (including all SF600s) do not support it. */
+static int dediprog_set_voltage(void)
 {
  int ret;
  char buf[0x1];

  memset(buf, 0, sizeof(buf));
- ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN, 0x0B, 0x0, 0x0,
+ ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN,
CMD_SET_VOLTAGE, 0x0, 0x0,
       buf, 0x1, DEFAULT_TIMEOUT);
  if (ret < 0) {