endmenu
-menu "802.11 Firmware Features"
-
-config CARL9170FW_CAB_QUEUE
- def_bool y
- prompt "Support software-based Content after Beacon Queue"
- ---help---
- This (software) queue is used to send any broad-/multi-cast buffered
- frames after the next DTIM beacon.
-
- This feature is required for Accesspoint mode operation.
-
- Say Y.
-
-endmenu
-
source "carlfw/usb/Kconfig"
menu "Experimental, Unstable & Testing Extensions"
__le16 control;
};
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
enum carl9170_cab_trigger {
CARL9170_CAB_TRIGGER_EMPTY = 0,
CARL9170_CAB_TRIGGER_ARMED = BIT(0),
CARL9170_CAB_TRIGGER_DEFER = BIT(1),
};
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
enum carl9170_ep0_action {
CARL9170_EP0_NO_ACTION = 0,
/* tx sequence control counters */
unsigned int sequence[CARL9170_INTF_NUM];
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
/* CAB */
struct dma_queue cab_queue[CARL9170_INTF_NUM];
unsigned int cab_queue_len[CARL9170_INTF_NUM];
unsigned int cab_flush_time;
enum carl9170_cab_trigger cab_flush_trigger[CARL9170_INTF_NUM];
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
/* tx status */
unsigned int tx_status_pending,
#define AR9170_TERMINATOR_NUMBER_INT 1
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
#define AR9170_TERMINATOR_NUMBER_CAB CARL9170_INTF_NUM
-#else
-#define AR9170_TERMINATOR_NUMBER_CAB 0
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
#define AR9170_TERMINATOR_NUMBER (AR9170_TERMINATOR_NUMBER_B + \
AR9170_TERMINATOR_NUMBER_INT + \
fw.usb.int_desc = &dma_mem.terminator[i++];
fw.wlan.fw_desc = &dma_mem.terminator[i++];
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
for (j = 0; j < CARL9170_INTF_NUM; j++)
init_queue(&fw.wlan.cab_queue[j], &dma_mem.terminator[i++]);
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
BUG_ON(AR9170_TERMINATOR_NUMBER != i);
#ifdef CONFIG_CARL9170FW_SECURITY_ENGINE
BIT(CARL9170FW_COMMAND_CAM) |
#endif /* CONFIG_CARL9170FW_SECURITY_ENGINE */
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
BIT(CARL9170FW_WLANTX_CAB) |
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
#ifdef CONFIG_CARL9170FW_UNUSABLE
BIT(CARL9170FW_UNUSABLE) |
#endif /* CONFIG_CARL9170FW_UNUSABLE */
memset(&fw.tally, 0, sizeof(struct carl9170_tally_rsp));
break;
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
case CARL9170_CMD_BCN_CTRL:
resp->hdr.len = 0;
fw.wlan.cab_flush_trigger[cmd->bcn_ctrl.vif_id] = CARL9170_CAB_TRIGGER_EMPTY;
}
break;
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
#ifdef CONFIG_CARL9170FW_SECURITY_ENGINE
case CARL9170_CMD_EKEY:
return true;
}
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
if (unlikely(super->s.cab))
fw.wlan.cab_queue_len[super->s.vif_id]--;
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
wlan_tx_complete(super, success);
super->s.cnt = 1;
hide_super(desc);
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
if (unlikely(super->s.cab)) {
fw.wlan.cab_queue_len[super->s.vif_id]++;
dma_put(&fw.wlan.cab_queue[super->s.vif_id], desc);
return;
}
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
_wlan_tx(desc);
__wlan_tx(desc);
}
}
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
void wlan_cab_flush_queue(const unsigned int vif)
{
struct dma_queue *cab_queue = &fw.wlan.cab_queue[vif];
}
}
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
static void handle_beacon_config(void)
{
static void handle_pretbtt(void)
{
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
fw.wlan.cab_flush_time = get_clock_counter();
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
#ifdef CONFIG_CARL9170FW_RADIO_FUNCTIONS
rf_psm();
static void wlan_janitor(void)
{
-#ifdef CONFIG_CARL9170FW_CAB_QUEUE
wlan_send_buffered_cab();
-#endif /* CONFIG_CARL9170FW_CAB_QUEUE */
wlan_send_buffered_tx_status();