Commit de8781d7 authored by Govind Singh's avatar Govind Singh Committed by Kalle Valo

ath10k: disable interface pause wow config for integrated chipset

wow pause iface config controls the PCI D0/D3-WOW cases for pcie
bus state. Firmware does not expects WOW_IFACE_PAUSE_ENABLED config
for bus/link that cannot be suspended ex:snoc and does not trigger
common subsystem shutdown.
Disable interface pause wow config for integrated chipset(WCN3990)
for correct WOW configuration in the firmware.

Testing:
    Tested on WCN3990 HW.
    Tested FW: WLAN.HL.2.0-01192-QCAHLSWMTPLZ-1.
Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 185be1c6
...@@ -2994,8 +2994,9 @@ static void ath10k_core_register_work(struct work_struct *work) ...@@ -2994,8 +2994,9 @@ static void ath10k_core_register_work(struct work_struct *work)
int ath10k_core_register(struct ath10k *ar, int ath10k_core_register(struct ath10k *ar,
const struct ath10k_bus_params *bus_params) const struct ath10k_bus_params *bus_params)
{ {
ar->chip_id = bus_params->chip_id; ar->bus_param.chip_id = bus_params->chip_id;
ar->dev_type = bus_params->dev_type; ar->bus_param.dev_type = bus_params->dev_type;
ar->bus_param.link_can_suspend = bus_params->link_can_suspend;
queue_work(ar->workqueue, &ar->register_work); queue_work(ar->workqueue, &ar->register_work);
return 0; return 0;
......
...@@ -922,6 +922,7 @@ enum ath10k_dev_type { ...@@ -922,6 +922,7 @@ enum ath10k_dev_type {
struct ath10k_bus_params { struct ath10k_bus_params {
u32 chip_id; u32 chip_id;
enum ath10k_dev_type dev_type; enum ath10k_dev_type dev_type;
bool link_can_suspend;
}; };
struct ath10k { struct ath10k {
...@@ -1191,6 +1192,7 @@ struct ath10k { ...@@ -1191,6 +1192,7 @@ struct ath10k {
enum ath10k_radar_confirmation_state radar_conf_state; enum ath10k_radar_confirmation_state radar_conf_state;
struct ath10k_radar_found_info last_radar_info; struct ath10k_radar_found_info last_radar_info;
struct work_struct radar_confirmation_work; struct work_struct radar_confirmation_work;
struct ath10k_bus_params bus_param;
/* must be last */ /* must be last */
u8 drv_priv[0] __aligned(sizeof(void *)); u8 drv_priv[0] __aligned(sizeof(void *));
......
...@@ -1167,7 +1167,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) ...@@ -1167,7 +1167,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)
dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION); dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);
guid_copy(&dump_data->guid, &crash_data->guid); guid_copy(&dump_data->guid, &crash_data->guid);
dump_data->chip_id = cpu_to_le32(ar->chip_id); dump_data->chip_id = cpu_to_le32(ar->bus_param.chip_id);
dump_data->bus_type = cpu_to_le32(0); dump_data->bus_type = cpu_to_le32(0);
dump_data->target_version = cpu_to_le32(ar->target_version); dump_data->target_version = cpu_to_le32(ar->target_version);
dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major); dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);
......
...@@ -58,7 +58,7 @@ void ath10k_debug_print_hwfw_info(struct ath10k *ar) ...@@ -58,7 +58,7 @@ void ath10k_debug_print_hwfw_info(struct ath10k *ar)
ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x", ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x",
ar->hw_params.name, ar->hw_params.name,
ar->target_version, ar->target_version,
ar->chip_id, ar->bus_param.chip_id,
ar->id.subsystem_vendor, ar->id.subsystem_device); ar->id.subsystem_vendor, ar->id.subsystem_device);
ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n", ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n",
...@@ -625,7 +625,7 @@ static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf, ...@@ -625,7 +625,7 @@ static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
size_t len; size_t len;
char buf[50]; char buf[50];
len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id); len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->bus_param.chip_id);
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }
......
...@@ -53,7 +53,7 @@ static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc, ...@@ -53,7 +53,7 @@ static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc,
{ {
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
if (htc->ar->dev_type != ATH10K_DEV_TYPE_HL) if (htc->ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
skb_pull(skb, sizeof(struct ath10k_htc_hdr)); skb_pull(skb, sizeof(struct ath10k_htc_hdr));
} }
...@@ -138,7 +138,7 @@ int ath10k_htc_send(struct ath10k_htc *htc, ...@@ -138,7 +138,7 @@ int ath10k_htc_send(struct ath10k_htc *htc,
ath10k_htc_prepare_tx_skb(ep, skb); ath10k_htc_prepare_tx_skb(ep, skb);
skb_cb->eid = eid; skb_cb->eid = eid;
if (ar->dev_type != ATH10K_DEV_TYPE_HL) { if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL) {
skb_cb->paddr = dma_map_single(dev, skb->data, skb->len, skb_cb->paddr = dma_map_single(dev, skb->data, skb->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
ret = dma_mapping_error(dev, skb_cb->paddr); ret = dma_mapping_error(dev, skb_cb->paddr);
...@@ -161,7 +161,7 @@ int ath10k_htc_send(struct ath10k_htc *htc, ...@@ -161,7 +161,7 @@ int ath10k_htc_send(struct ath10k_htc *htc,
return 0; return 0;
err_unmap: err_unmap:
if (ar->dev_type != ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
err_credits: err_credits:
if (ep->tx_credit_flow_enabled) { if (ep->tx_credit_flow_enabled) {
......
...@@ -265,7 +265,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar) ...@@ -265,7 +265,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar)
struct ath10k_htt *htt = &ar->htt; struct ath10k_htt *htt = &ar->htt;
int ret; int ret;
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
return 0; return 0;
spin_lock_bh(&htt->rx_ring.lock); spin_lock_bh(&htt->rx_ring.lock);
...@@ -282,7 +282,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar) ...@@ -282,7 +282,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar)
void ath10k_htt_rx_free(struct ath10k_htt *htt) void ath10k_htt_rx_free(struct ath10k_htt *htt)
{ {
if (htt->ar->dev_type == ATH10K_DEV_TYPE_HL) if (htt->ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
return; return;
del_timer_sync(&htt->rx_ring.refill_retry_timer); del_timer_sync(&htt->rx_ring.refill_retry_timer);
...@@ -760,7 +760,7 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt) ...@@ -760,7 +760,7 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
size_t size; size_t size;
struct timer_list *timer = &htt->rx_ring.refill_retry_timer; struct timer_list *timer = &htt->rx_ring.refill_retry_timer;
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
return 0; return 0;
htt->rx_confused = false; htt->rx_confused = false;
...@@ -3237,7 +3237,7 @@ bool ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb) ...@@ -3237,7 +3237,7 @@ bool ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
break; break;
} }
case HTT_T2H_MSG_TYPE_RX_IND: case HTT_T2H_MSG_TYPE_RX_IND:
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
return ath10k_htt_rx_proc_rx_ind_hl(htt, return ath10k_htt_rx_proc_rx_ind_hl(htt,
&resp->rx_ind_hl, &resp->rx_ind_hl,
skb); skb);
...@@ -3533,7 +3533,7 @@ void ath10k_htt_set_rx_ops(struct ath10k_htt *htt) ...@@ -3533,7 +3533,7 @@ void ath10k_htt_set_rx_ops(struct ath10k_htt *htt)
{ {
struct ath10k *ar = htt->ar; struct ath10k *ar = htt->ar;
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
htt->rx_ops = &htt_rx_ops_hl; htt->rx_ops = &htt_rx_ops_hl;
else if (ar->hw_params.target_64bit) else if (ar->hw_params.target_64bit)
htt->rx_ops = &htt_rx_ops_64; htt->rx_ops = &htt_rx_ops_64;
......
...@@ -495,7 +495,7 @@ int ath10k_htt_tx_start(struct ath10k_htt *htt) ...@@ -495,7 +495,7 @@ int ath10k_htt_tx_start(struct ath10k_htt *htt)
if (htt->tx_mem_allocated) if (htt->tx_mem_allocated)
return 0; return 0;
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
return 0; return 0;
ret = ath10k_htt_tx_alloc_buf(htt); ret = ath10k_htt_tx_alloc_buf(htt);
...@@ -1224,7 +1224,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu) ...@@ -1224,7 +1224,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
return 0; return 0;
err_unmap_msdu: err_unmap_msdu:
if (ar->dev_type != ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
err_free_txdesc: err_free_txdesc:
dev_kfree_skb_any(txdesc); dev_kfree_skb_any(txdesc);
...@@ -1763,7 +1763,7 @@ void ath10k_htt_set_tx_ops(struct ath10k_htt *htt) ...@@ -1763,7 +1763,7 @@ void ath10k_htt_set_tx_ops(struct ath10k_htt *htt)
{ {
struct ath10k *ar = htt->ar; struct ath10k *ar = htt->ar;
if (ar->dev_type == ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
htt->tx_ops = &htt_tx_ops_hl; htt->tx_ops = &htt_tx_ops_hl;
else if (ar->hw_params.target_64bit) else if (ar->hw_params.target_64bit)
htt->tx_ops = &htt_tx_ops_64; htt->tx_ops = &htt_tx_ops_64;
......
...@@ -2283,7 +2283,7 @@ static int ath10k_pci_get_num_banks(struct ath10k *ar) ...@@ -2283,7 +2283,7 @@ static int ath10k_pci_get_num_banks(struct ath10k *ar)
return 1; return 1;
case QCA6164_2_1_DEVICE_ID: case QCA6164_2_1_DEVICE_ID:
case QCA6174_2_1_DEVICE_ID: case QCA6174_2_1_DEVICE_ID:
switch (MS(ar->chip_id, SOC_CHIP_ID_REV)) { switch (MS(ar->bus_param.chip_id, SOC_CHIP_ID_REV)) {
case QCA6174_HW_1_0_CHIP_ID_REV: case QCA6174_HW_1_0_CHIP_ID_REV:
case QCA6174_HW_1_1_CHIP_ID_REV: case QCA6174_HW_1_1_CHIP_ID_REV:
case QCA6174_HW_2_1_CHIP_ID_REV: case QCA6174_HW_2_1_CHIP_ID_REV:
...@@ -3636,6 +3636,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev, ...@@ -3636,6 +3636,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
} }
bus_params.dev_type = ATH10K_DEV_TYPE_LL; bus_params.dev_type = ATH10K_DEV_TYPE_LL;
bus_params.link_can_suspend = true;
bus_params.chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS); bus_params.chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
if (bus_params.chip_id == 0xffffffff) { if (bus_params.chip_id == 0xffffffff) {
ath10k_err(ar, "failed to get chip id\n"); ath10k_err(ar, "failed to get chip id\n");
......
...@@ -95,7 +95,7 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt, ...@@ -95,7 +95,7 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
wake_up(&htt->empty_tx_wq); wake_up(&htt->empty_tx_wq);
spin_unlock_bh(&htt->tx_lock); spin_unlock_bh(&htt->tx_lock);
if (ar->dev_type != ATH10K_DEV_TYPE_HL) if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
ath10k_report_offchan_tx(htt->ar, msdu); ath10k_report_offchan_tx(htt->ar, msdu);
......
...@@ -3323,6 +3323,8 @@ ath10k_wmi_tlv_op_gen_wow_enable(struct ath10k *ar) ...@@ -3323,6 +3323,8 @@ ath10k_wmi_tlv_op_gen_wow_enable(struct ath10k *ar)
cmd = (void *)tlv->value; cmd = (void *)tlv->value;
cmd->enable = __cpu_to_le32(1); cmd->enable = __cpu_to_le32(1);
if (!ar->bus_param.link_can_suspend)
cmd->pause_iface_config = __cpu_to_le32(WOW_IFACE_PAUSE_DISABLED);
ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv wow enable\n"); ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv wow enable\n");
return skb; return skb;
......
...@@ -2001,8 +2001,15 @@ struct wmi_tlv_set_quiet_cmd { ...@@ -2001,8 +2001,15 @@ struct wmi_tlv_set_quiet_cmd {
__le32 enabled; __le32 enabled;
} __packed; } __packed;
enum wmi_tlv_wow_interface_cfg {
WOW_IFACE_PAUSE_ENABLED,
WOW_IFACE_PAUSE_DISABLED
};
struct wmi_tlv_wow_enable_cmd { struct wmi_tlv_wow_enable_cmd {
__le32 enable; __le32 enable;
__le32 pause_iface_config;
__le32 flags;
} __packed; } __packed;
struct wmi_tlv_wow_host_wakeup_ind { struct wmi_tlv_wow_host_wakeup_ind {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment