X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tools%2Fcarlu%2Fsrc%2Fusb.c;h=53bcb5244ab2a946ffd312440823dd44a6348751;hb=13859edfa20c4b84b575f8e872636fd8cdd81d7f;hp=a6d7cb8ab8514a988b5a044daf192fe9c2b59eae;hpb=e72388a0aa23da8bc8e24a0cbe9d523c5a9ce294;p=carl9170fw.git diff --git a/tools/carlu/src/usb.c b/tools/carlu/src/usb.c index a6d7cb8..53bcb52 100644 --- a/tools/carlu/src/usb.c +++ b/tools/carlu/src/usb.c @@ -35,6 +35,7 @@ #include "usb.h" #include "debug.h" #include "list.h" +#include "cmd.h" #define ADD_DEV(_vid, _pid, _vs, _ps) { \ .idVendor = _vid, \ @@ -562,14 +563,6 @@ static int carlusb_upload_firmware(struct carlusb *ar, bool boot) if (IS_ERR_OR_NULL(buf)) return PTR_ERR(buf); - ret = carlu_fw_check(&ar->common); - if (ret) - return ret; - - ret = carlusb_fw_check(ar); - if (ret) - return ret; - if (ar->miniboot_size) { dbg("Miniboot firmware size:%d\n", ar->miniboot_size); len -= ar->miniboot_size; @@ -617,6 +610,35 @@ static int carlusb_upload_firmware(struct carlusb *ar, bool boot) return 0; } +int carlusb_cmd_async(struct carlu *_ar, struct carl9170_cmd *cmd, + const bool free_buf) +{ + struct carlusb *ar = (void *)_ar; + struct libusb_transfer *urb; + int ret, send; + + if (cmd->hdr.len > (CARL9170_MAX_CMD_LEN - 4)) { + err("|-> too much payload\n"); + return -EINVAL; + } + + if (cmd->hdr.len % 4) { + err("|-> invalid command length\n"); + return -EINVAL; + } + + ret = libusb_interrupt_transfer(ar->dev, AR9170_EP_CMD, (void *) cmd, cmd->hdr.len + 4, &send, 32); + if (ret != 0) { + err("OID:0x%.2x failed due to (%d) (%d).\n", cmd->hdr.cmd, ret, send); + print_hex_dump_bytes(ERROR, "CMD:", cmd, cmd->hdr.len); + } + + if (free_buf) + free((void *)cmd); + + return ret; +} + int carlusb_cmd(struct carlu *_ar, uint8_t oid, uint8_t *cmd, size_t clen, uint8_t *rsp, size_t rlen) @@ -632,23 +654,23 @@ int carlusb_cmd(struct carlu *_ar, uint8_t oid, ret = SDL_mutexP(ar->common.resp_lock); if (ret != 0) { err("failed to acquire resp_lock.\n"); - print_hex_dump_bytes(ERROR, "CMD:", ar->cmd_buf, clen); + print_hex_dump_bytes(ERROR, "CMD:", ar->cmd.buf, clen); return -1; } - ar->cmd_buf[0] = clen; - ar->cmd_buf[1] = oid; + ar->cmd.cmd.hdr.len = clen; + ar->cmd.cmd.hdr.cmd = oid; /* buf[2] & buf[3] are padding */ - if (clen && cmd != (uint8_t *)(&ar->cmd_buf[4])) - memcpy(&ar->cmd_buf[4], cmd, clen); + if (clen && cmd != (uint8_t *)(&ar->cmd.cmd.data)) + memcpy(&ar->cmd.cmd.data, cmd, clen); ar->common.resp_buf = (uint8_t *)rsp; ar->common.resp_len = rlen; - ret = libusb_interrupt_transfer(ar->dev, AR9170_EP_CMD, ar->cmd_buf, clen + 4, &send, 32); + ret = carlusb_cmd_async(_ar, &ar->cmd.cmd, false); if (ret != 0) { err("OID:0x%.2x failed due to (%d) (%d).\n", oid, ret, send); - print_hex_dump_bytes(ERROR, "CMD:", ar->cmd_buf, clen); + print_hex_dump_bytes(ERROR, "CMD:", ar->cmd.buf, clen); SDL_mutexV(ar->common.resp_lock); return ret; } @@ -689,10 +711,6 @@ struct carlu *carlusb_probe(void) ar->stop_event_polling = false; ar->event_thread = SDL_CreateThread(carlusb_event_thread, ar); - ret = carlusb_load_firmware(ar); - if (ret) - goto err_out; - ret = carlusb_upload_firmware(ar, true); if (ret) goto err_kill;