carl9170 firmware: per-vif tx sequence counter
[carl9170fw.git] / carlfw / src / cmd.c
index a9bdb63368f01e8e84836e824273d94dd22049a6..a222c6ca25dff0bbaeb272c64e872423dd8498cf 100644 (file)
@@ -59,12 +59,14 @@ void handle_cmd(struct carl9170_rsp *resp)
                break;
 
        case CARL9170_CMD_SWRST:
+#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:
@@ -79,24 +81,36 @@ void handle_cmd(struct carl9170_rsp *resp)
                read_tsf((uint32_t *)resp->tsf.tsf);
                break;
 
+       case CARL9170_CMD_RX_FILTER:
+               resp->hdr.len = 0;
+               fw.wlan.rx_filter = cmd->rx_filter.rx_filter;
+               break;
+
 #ifdef CONFIG_CARL9170FW_CAB_QUEUE
-       case CARL9170_CMD_FLUSH_CAB:
+       case CARL9170_CMD_BCN_CTRL:
                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->bcn_ctrl.mode & CARL9170_BCN_CTRL_CAB_TRIGGER) {
+                       wlan_modify_beacon(cmd->bcn_ctrl.vif_id,
+                               cmd->bcn_ctrl.bcn_addr, cmd->bcn_ctrl.bcn_len);
+                       set(AR9170_MAC_REG_BCN_ADDR, cmd->bcn_ctrl.bcn_addr);
+                       set(AR9170_MAC_REG_BCN_LENGTH, cmd->bcn_ctrl.bcn_len);
+                       set(AR9170_MAC_REG_BCN_CTRL, AR9170_BCN_CTRL_READY);
+               } else {
+                       wlan_cab_flush_queue(cmd->bcn_ctrl.vif_id);
+                       fw.wlan.cab_flush_trigger[i] = 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 */
@@ -123,15 +137,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;
        }
 }