diff options
Diffstat (limited to 'util/ectool.c')
-rw-r--r-- | util/ectool.c | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/util/ectool.c b/util/ectool.c index dedb617cf9..f0c3d3500f 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -158,7 +158,7 @@ const char help_str[] = " Set USB mux switch state\n" " version\n" " Prints EC version\n" - " wireless <mask>\n" + " wireless <flags> [<mask> [<suspend_flags> <suspend_mask>]]\n" " Enable/disable WLAN/Bluetooth radio\n" "\n" "Not working for you? Make sure LPC I/O is configured:\n" @@ -2316,30 +2316,77 @@ int cmd_switches(int argc, char *argv[]) int cmd_wireless(int argc, char *argv[]) { - struct ec_params_switch_enable_wireless p; char *e; int rv; + int now_flags; - if (argc != 2) { - fprintf(stderr, "Usage: %s <mask>\n", argv[0]); + if (argc < 2) { + fprintf(stderr, + "Usage: %s <flags> [<mask> [<susflags> <susmask>]]\n", + argv[0]); fprintf(stderr, " 0x1 = WLAN radio\n" " 0x2 = Bluetooth radio\n" " 0x4 = WWAN power\n" " 0x8 = WLAN power\n"); return -1; } - p.enabled = strtol(argv[1], &e, 0); + + now_flags = strtol(argv[1], &e, 0); if (e && *e) { - fprintf(stderr, "Bad value.\n"); + fprintf(stderr, "Bad flags.\n"); return -1; } - rv = ec_command(EC_CMD_SWITCH_ENABLE_WIRELESS, 0, - &p, sizeof(p), NULL, 0); - if (rv < 0) - return rv; + if (argc < 3) { + /* Old-style - current flags only */ + struct ec_params_switch_enable_wireless_v0 p; + + p.enabled = now_flags; + rv = ec_command(EC_CMD_SWITCH_ENABLE_WIRELESS, 0, + &p, sizeof(p), NULL, 0); + if (rv < 0) + return rv; + + printf("Success.\n"); + } else { + /* New-style - masks and suspend flags */ + struct ec_params_switch_enable_wireless_v1 p; + struct ec_response_switch_enable_wireless_v1 r; + + memset(&p, 0, sizeof(p)); + + p.now_flags = now_flags; + + p.now_mask = strtol(argv[2], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad mask.\n"); + return -1; + } + + if (argc > 4) { + p.suspend_flags = strtol(argv[3], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad suspend flags.\n"); + return -1; + } + + p.suspend_mask = strtol(argv[4], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad suspend mask.\n"); + return -1; + } + } + + rv = ec_command(EC_CMD_SWITCH_ENABLE_WIRELESS, + EC_VER_SWITCH_ENABLE_WIRELESS, + &p, sizeof(p), &r, sizeof(r)); + if (rv < 0) + return rv; + + printf("Now=0x%x, suspend=0x%x\n", + r.now_flags, r.suspend_flags); + } - printf("Success.\n"); return 0; } |