carlu: put command definitions into separate header
[carl9170fw.git] / tools / carlu / src / usb.c
index a6d7cb8ab8514a988b5a044daf192fe9c2b59eae..53bcb5244ab2a946ffd312440823dd44a6348751 100644 (file)
@@ -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;