X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fsrc%2Fcmd.c;h=281ae9c9a1b19ad1f8befb896843e54c10a23771;hb=bc1a720197add99d877e4099a4ad272aec88b74f;hp=f5bbad86f8e5393083881f3b5c7f5129c9a56e72;hpb=e72388a0aa23da8bc8e24a0cbe9d523c5a9ce294;p=carl9170fw.git diff --git a/carlfw/src/cmd.c b/carlfw/src/cmd.c index f5bbad8..281ae9c 100644 --- a/carlfw/src/cmd.c +++ b/carlfw/src/cmd.c @@ -37,9 +37,12 @@ void handle_cmd(struct carl9170_rsp *resp) unsigned int i; /* copies cmd, len and extra fields */ - resp->hdr.hdr_data = cmd->hdr.hdr_data; + resp->hdr.len = cmd->hdr.len; + resp->hdr.cmd = cmd->hdr.cmd; + resp->hdr.ext = cmd->hdr.ext; + resp->hdr.seq |= cmd->hdr.seq; - switch (cmd->hdr.cmd) { + switch (cmd->hdr.cmd & ~CARL9170_CMD_ASYNC_FLAG) { case CARL9170_CMD_RREG: for (i = 0; i < (cmd->hdr.len / 4); i++) resp->rreg_res.vals[i] = get(cmd->rreg.regs[i]); @@ -56,17 +59,21 @@ void handle_cmd(struct carl9170_rsp *resp) break; case CARL9170_CMD_SWRST: - resp->hdr.len = 0; +#ifdef CONFIG_CARL9170FW_FW_MAC_RESET + /* + * Command has no payload, so the response + * has no payload either. + * resp->hdr.len = 0; + */ fw.wlan.mac_reset = CARL9170_MAC_RESET_FORCE; +#endif /* CONFIG_CARL9170FW_FW_MAC_RESET */ break; case CARL9170_CMD_REBOOT: /* - * reboot does not return and generates no response * resp->len = 0; */ - - reboot(); + fw.reboot = 1; break; case CARL9170_CMD_READ_TSF: @@ -77,21 +84,26 @@ void handle_cmd(struct carl9170_rsp *resp) #ifdef CONFIG_CARL9170FW_CAB_QUEUE case CARL9170_CMD_FLUSH_CAB: resp->hdr.len = 0; - fw.wlan.cab_flush_trigger = CARL9170_CAB_TRIGGER_ARMED; - fw.wlan.cab_flush_time = get_clock_counter() + - CARL9170_TBTT_DELTA; + + if (cmd->cab_flush.mode & CARL9170_CAB_FLUSH_CAB_TRIGGER) { + wlan_cab_modify_dtim_beacon(cmd->cab_flush.vif_id); + set(AR9170_MAC_REG_BCN_CTRL, AR9170_BCN_CTRL_READY); + } else { + wlan_cab_flush_queue(cmd->cab_flush.vif_id); + if (fw.wlan.cab_flush_vif == cmd->cab_flush.vif_id) + fw.wlan.cab_flush_trigger = CARL9170_CAB_TRIGGER_EMPTY; + } break; #endif /* CONFIG_CARL9170FW_CAB_QUEUE */ #ifdef CONFIG_CARL9170FW_SECURITY_ENGINE case CARL9170_CMD_EKEY: - resp->hdr.len = 1; + resp->hdr.len = 0; set_key(&cmd->setkey); break; case CARL9170_CMD_DKEY: - /* Disable Key */ - resp->hdr.len = 1; + resp->hdr.len = 0; disable_key(&cmd->disablekey); break; #endif /* CONFIG_CARL9170FW_SECURIT_ENGINE */ @@ -103,7 +115,9 @@ void handle_cmd(struct carl9170_rsp *resp) break; case CARL9170_CMD_FREQ_START: - resp->hdr.len = 0; + /* + * resp->hdr.len = 0; + */ rf_notify_set_channel(); break; @@ -116,15 +130,8 @@ void handle_cmd(struct carl9170_rsp *resp) # endif /* CONFIG_CARL9170FW_PSM */ #endif /* CONFIG_CARL9170FW_RADIO_FUNCTIOS */ -#ifdef CONFIG_CARL9170FW_USB_WATCHDOG - case CARL9170_CMD_USB_WD: - resp->hdr.len = 4; - fw.usb.watchdog.state = le32_to_cpu(cmd->watchdog.state); - break; - -#endif /* CONFIG_CARL9170FW_USB_WATCHDOG */ - default: + BUG("Unknown command %x\n", cmd->hdr.cmd); break; } }