mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 08:02:07 +00:00
wireless-next patches for v5.20
Fourth set of patches for v5.20, last few patches before the merge window. Only driver changes this time, mostly just fixes and cleanup. Major changes: brcmfmac * support brcm,ccode-map-trivial DT property wcn36xx * add debugfs file to show firmware feature strings -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEiBjanGPFTz4PRfLobhckVSbrbZsFAmLkNBQRHGt2YWxvQGtl cm5lbC5vcmcACgkQbhckVSbrbZudPggApmxPMrdOV2RzCQI48SvmR1KiP8GnN9nw 08hIky9yRFz+feNfoXic4XAxSlYmHpOlByBQO8GzpejsCE7OUH9d4xRrXyIj21sx bP8PhKg50H5UKZCD0laLRe1vjoSFOcXzTUh+B03IaLVof0Ky6C9N2oS6qF+oyrBs yBqZE2idJEqrqYkEvhbdt0201tKh/ePEbcvfJ8CU5HinoX+q6Pqb1xlsqTy8mJ8H 6OO8wNEwVncwDZLq1dRvKEAgR4w/Zye5s+fTaO9j8X1GfTFncBWc4XYjnxOHuV1i 4PrVN1tgYhSMWD0JEJifoox3mORO9MIL5loPqufPfYAs98iBa9TtPQ== =pvLH -----END PGP SIGNATURE----- Merge tag 'wireless-next-2022-07-29' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next Kalle Valo says: ==================== wireless-next patches for v5.20 Fourth set of patches for v5.20, last few patches before the merge window. Only driver changes this time, mostly just fixes and cleanup. Major changes: brcmfmac - support brcm,ccode-map-trivial DT property wcn36xx - add debugfs file to show firmware feature strings * tag 'wireless-next-2022-07-29' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (36 commits) wifi: rtw88: check the return value of alloc_workqueue() wifi: rtw89: 8852a: adjust IMR for SER L1 wifi: rtw89: 8852a: update RF radio A/B R56 wifi: wcn36xx: Add debugfs entry to read firmware feature strings wifi: wcn36xx: Move capability bitmap to string translation function to firmware.c wifi: wcn36xx: Move firmware feature bit storage to dedicated firmware.c file wifi: wcn36xx: Rename clunky firmware feature bit enum wifi: brcmfmac: prevent double-free on hardware-reset wifi: brcmfmac: support brcm,ccode-map-trivial DT property dt-bindings: bcm4329-fmac: add optional brcm,ccode-map-trivial wifi: brcmfmac: Replace default (not configured) MAC with a random MAC wifi: brcmfmac: Add brcmf_c_set_cur_etheraddr() helper wifi: brcmfmac: Remove #ifdef guards for PM related functions wifi: brcmfmac: use strreplace() in brcmf_of_probe() wifi: plfxlc: Use eth_zero_addr() to assign zero address wifi: wilc1000: use existing iftype variable to store the interface type wifi: wilc1000: add 'isinit' flag for SDIO bus similar to SPI wifi: wilc1000: cancel the connect operation during interface down wifi: wilc1000: get correct length of string WID from received config packet wifi: wilc1000: set station_info flag only when signal value is valid ... ==================== Link: https://lore.kernel.org/r/20220729192832.A5011C433D6@smtp.kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
ff4970b130
@ -75,6 +75,16 @@ properties:
|
||||
items:
|
||||
pattern: '^[A-Z][A-Z]-[A-Z][0-9A-Z]-[0-9]+$'
|
||||
|
||||
brcm,ccode-map-trivial:
|
||||
description: |
|
||||
Use a trivial mapping of ISO3166 country codes to brcmfmac firmware
|
||||
country code and revision: cc -> { cc, 0 }. In other words, assume that
|
||||
the CLM blob firmware uses ISO3166 country codes as well, and that all
|
||||
revisions are zero. This property is mutually exclusive with
|
||||
brcm,ccode-map. If both properties are specified, then brcm,ccode-map
|
||||
takes precedence.
|
||||
type: boolean
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
@ -140,8 +140,53 @@ ath11k_ahb_get_msi_irq_wcn6750(struct ath11k_base *ab, unsigned int vector)
|
||||
return ab->pci.msi.irqs[vector];
|
||||
}
|
||||
|
||||
static inline u32
|
||||
ath11k_ahb_get_window_start_wcn6750(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
u32 window_start = 0;
|
||||
|
||||
/* If offset lies within DP register range, use 1st window */
|
||||
if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
window_start = ATH11K_PCI_WINDOW_START;
|
||||
/* If offset lies within CE register range, use 2nd window */
|
||||
else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) <
|
||||
ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
window_start = 2 * ATH11K_PCI_WINDOW_START;
|
||||
|
||||
return window_start;
|
||||
}
|
||||
|
||||
static void
|
||||
ath11k_ahb_window_write32_wcn6750(struct ath11k_base *ab, u32 offset, u32 value)
|
||||
{
|
||||
u32 window_start;
|
||||
|
||||
/* WCN6750 uses static window based register access*/
|
||||
window_start = ath11k_ahb_get_window_start_wcn6750(ab, offset);
|
||||
|
||||
iowrite32(value, ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
}
|
||||
|
||||
static u32 ath11k_ahb_window_read32_wcn6750(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
u32 window_start;
|
||||
u32 val;
|
||||
|
||||
/* WCN6750 uses static window based register access */
|
||||
window_start = ath11k_ahb_get_window_start_wcn6750(ab, offset);
|
||||
|
||||
val = ioread32(ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
return val;
|
||||
}
|
||||
|
||||
static const struct ath11k_pci_ops ath11k_ahb_pci_ops_wcn6750 = {
|
||||
.wakeup = NULL,
|
||||
.release = NULL,
|
||||
.get_msi_irq = ath11k_ahb_get_msi_irq_wcn6750,
|
||||
.window_write32 = ath11k_ahb_window_write32_wcn6750,
|
||||
.window_read32 = ath11k_ahb_window_read32_wcn6750,
|
||||
};
|
||||
|
||||
static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset)
|
||||
@ -971,11 +1016,16 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
ab->hif.ops = hif_ops;
|
||||
ab->pci.ops = pci_ops;
|
||||
ab->pdev = pdev;
|
||||
ab->hw_rev = hw_rev;
|
||||
platform_set_drvdata(pdev, ab);
|
||||
|
||||
ret = ath11k_pcic_register_pci_ops(ab, pci_ops);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
|
||||
goto err_core_free;
|
||||
}
|
||||
|
||||
ret = ath11k_core_pre_init(ab);
|
||||
if (ret)
|
||||
goto err_core_free;
|
||||
|
@ -54,9 +54,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 11,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq8074,
|
||||
.svc_to_ce_map_len = 21,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.single_pdev_only = false,
|
||||
.rxdma1_enable = true,
|
||||
.num_rxmda_per_pdev = 1,
|
||||
@ -107,8 +104,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = true,
|
||||
.static_window_map = false,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 0,
|
||||
.ce_window_idx = 0,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = false,
|
||||
},
|
||||
@ -133,9 +128,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 11,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq6018,
|
||||
.svc_to_ce_map_len = 19,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.single_pdev_only = false,
|
||||
.rxdma1_enable = true,
|
||||
.num_rxmda_per_pdev = 1,
|
||||
@ -183,8 +175,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = true,
|
||||
.static_window_map = false,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 0,
|
||||
.ce_window_idx = 0,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = false,
|
||||
},
|
||||
@ -209,9 +199,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 9,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
|
||||
.svc_to_ce_map_len = 14,
|
||||
.rfkill_pin = 48,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 1,
|
||||
.single_pdev_only = true,
|
||||
.rxdma1_enable = false,
|
||||
.num_rxmda_per_pdev = 2,
|
||||
@ -258,8 +245,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = false,
|
||||
.static_window_map = false,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 0,
|
||||
.ce_window_idx = 0,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = true,
|
||||
},
|
||||
@ -284,9 +269,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 9,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qcn9074,
|
||||
.svc_to_ce_map_len = 18,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.rxdma1_enable = true,
|
||||
.num_rxmda_per_pdev = 1,
|
||||
.rx_mac_buf_ring = false,
|
||||
@ -333,8 +315,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = false,
|
||||
.static_window_map = true,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 3,
|
||||
.ce_window_idx = 2,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = false,
|
||||
},
|
||||
@ -359,9 +339,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 9,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
|
||||
.svc_to_ce_map_len = 14,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.single_pdev_only = true,
|
||||
.rxdma1_enable = false,
|
||||
.num_rxmda_per_pdev = 2,
|
||||
@ -408,8 +385,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = false,
|
||||
.static_window_map = false,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 0,
|
||||
.ce_window_idx = 0,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = true,
|
||||
},
|
||||
@ -434,9 +409,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 9,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
|
||||
.svc_to_ce_map_len = 14,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.single_pdev_only = true,
|
||||
.rxdma1_enable = false,
|
||||
.num_rxmda_per_pdev = 2,
|
||||
@ -482,8 +454,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = false,
|
||||
.static_window_map = false,
|
||||
.hybrid_bus_type = false,
|
||||
.dp_window_idx = 0,
|
||||
.ce_window_idx = 0,
|
||||
.fixed_fw_mem = false,
|
||||
.support_off_channel_tx = true,
|
||||
},
|
||||
@ -508,9 +478,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.target_ce_count = 9,
|
||||
.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
|
||||
.svc_to_ce_map_len = 14,
|
||||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
.single_pdev_only = true,
|
||||
.rxdma1_enable = false,
|
||||
.num_rxmda_per_pdev = 1,
|
||||
@ -556,8 +523,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
.fixed_mem_region = false,
|
||||
.static_window_map = true,
|
||||
.hybrid_bus_type = true,
|
||||
.dp_window_idx = 1,
|
||||
.ce_window_idx = 2,
|
||||
.fixed_fw_mem = true,
|
||||
.support_off_channel_tx = false,
|
||||
},
|
||||
@ -1402,27 +1367,6 @@ static int ath11k_core_start_firmware(struct ath11k_base *ab,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath11k_core_rfkill_config(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k *ar;
|
||||
int ret = 0, i;
|
||||
|
||||
if (!(ab->target_caps.sys_cap_info & WMI_SYS_CAP_INFO_RFKILL))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
ar = ab->pdevs[i].ar;
|
||||
|
||||
ret = ath11k_mac_rfkill_config(ar);
|
||||
if (ret && ret != -EOPNOTSUPP) {
|
||||
ath11k_warn(ab, "failed to configure rfkill: %d", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab)
|
||||
{
|
||||
int ret;
|
||||
@ -1475,13 +1419,6 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab)
|
||||
goto err_core_stop;
|
||||
}
|
||||
ath11k_hif_irq_enable(ab);
|
||||
|
||||
ret = ath11k_core_rfkill_config(ab);
|
||||
if (ret && ret != -EOPNOTSUPP) {
|
||||
ath11k_err(ab, "failed to config rfkill: %d\n", ret);
|
||||
goto err_core_stop;
|
||||
}
|
||||
|
||||
mutex_unlock(&ab->core_lock);
|
||||
|
||||
return 0;
|
||||
@ -1550,7 +1487,6 @@ void ath11k_core_halt(struct ath11k *ar)
|
||||
cancel_delayed_work_sync(&ar->scan.timeout);
|
||||
cancel_work_sync(&ar->regd_update_work);
|
||||
cancel_work_sync(&ab->update_11d_work);
|
||||
cancel_work_sync(&ab->rfkill_work);
|
||||
|
||||
rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL);
|
||||
synchronize_rcu();
|
||||
@ -1558,28 +1494,6 @@ void ath11k_core_halt(struct ath11k *ar)
|
||||
idr_init(&ar->txmgmt_idr);
|
||||
}
|
||||
|
||||
static void ath11k_rfkill_work(struct work_struct *work)
|
||||
{
|
||||
struct ath11k_base *ab = container_of(work, struct ath11k_base, rfkill_work);
|
||||
struct ath11k *ar;
|
||||
bool rfkill_radio_on;
|
||||
int i;
|
||||
|
||||
spin_lock_bh(&ab->base_lock);
|
||||
rfkill_radio_on = ab->rfkill_radio_on;
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
ar = ab->pdevs[i].ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
||||
/* notify cfg80211 radio state change */
|
||||
ath11k_mac_rfkill_enable_radio(ar, rfkill_radio_on);
|
||||
wiphy_rfkill_set_hw_state(ar->hw->wiphy, !rfkill_radio_on);
|
||||
}
|
||||
}
|
||||
|
||||
static void ath11k_update_11d(struct work_struct *work)
|
||||
{
|
||||
struct ath11k_base *ab = container_of(work, struct ath11k_base, update_11d_work);
|
||||
@ -1891,7 +1805,6 @@ struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
||||
init_waitqueue_head(&ab->qmi.cold_boot_waitq);
|
||||
INIT_WORK(&ab->restart_work, ath11k_core_restart);
|
||||
INIT_WORK(&ab->update_11d_work, ath11k_update_11d);
|
||||
INIT_WORK(&ab->rfkill_work, ath11k_rfkill_work);
|
||||
INIT_WORK(&ab->reset_work, ath11k_core_reset);
|
||||
timer_setup(&ab->rx_replenish_retry, ath11k_ce_rx_replenish_retry, 0);
|
||||
init_completion(&ab->htc_suspend);
|
||||
|
@ -929,10 +929,6 @@ struct ath11k_base {
|
||||
|
||||
struct ath11k_dbring_cap *db_caps;
|
||||
u32 num_db_cap;
|
||||
struct work_struct rfkill_work;
|
||||
|
||||
/* true means radio is on */
|
||||
bool rfkill_radio_on;
|
||||
|
||||
/* To synchronize 11d scan vdev id */
|
||||
struct mutex vdev_id_11d_lock;
|
||||
|
@ -153,9 +153,6 @@ struct ath11k_hw_params {
|
||||
u32 svc_to_ce_map_len;
|
||||
|
||||
bool single_pdev_only;
|
||||
u32 rfkill_pin;
|
||||
u32 rfkill_cfg;
|
||||
u32 rfkill_on_level;
|
||||
|
||||
bool rxdma1_enable;
|
||||
int num_rxmda_per_pdev;
|
||||
@ -201,8 +198,6 @@ struct ath11k_hw_params {
|
||||
bool fixed_mem_region;
|
||||
bool static_window_map;
|
||||
bool hybrid_bus_type;
|
||||
u8 dp_window_idx;
|
||||
u8 ce_window_idx;
|
||||
bool fixed_fw_mem;
|
||||
bool support_off_channel_tx;
|
||||
};
|
||||
|
@ -5611,63 +5611,6 @@ static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath11k_mac_rfkill_config(struct ath11k *ar)
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
u32 param;
|
||||
int ret;
|
||||
|
||||
if (ab->hw_params.rfkill_pin == 0)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_MAC,
|
||||
"mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
|
||||
ab->hw_params.rfkill_pin, ab->hw_params.rfkill_cfg,
|
||||
ab->hw_params.rfkill_on_level);
|
||||
|
||||
param = FIELD_PREP(WMI_RFKILL_CFG_RADIO_LEVEL,
|
||||
ab->hw_params.rfkill_on_level) |
|
||||
FIELD_PREP(WMI_RFKILL_CFG_GPIO_PIN_NUM,
|
||||
ab->hw_params.rfkill_pin) |
|
||||
FIELD_PREP(WMI_RFKILL_CFG_PIN_AS_GPIO,
|
||||
ab->hw_params.rfkill_cfg);
|
||||
|
||||
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
|
||||
param, ar->pdev->pdev_id);
|
||||
if (ret) {
|
||||
ath11k_warn(ab,
|
||||
"failed to set rfkill config 0x%x: %d\n",
|
||||
param, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath11k_mac_rfkill_enable_radio(struct ath11k *ar, bool enable)
|
||||
{
|
||||
enum wmi_rfkill_enable_radio param;
|
||||
int ret;
|
||||
|
||||
if (enable)
|
||||
param = WMI_RFKILL_ENABLE_RADIO_ON;
|
||||
else
|
||||
param = WMI_RFKILL_ENABLE_RADIO_OFF;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac %d rfkill enable %d",
|
||||
ar->pdev_idx, param);
|
||||
|
||||
ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
|
||||
param, ar->pdev->pdev_id);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
|
||||
param, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_tx_control *control,
|
||||
struct sk_buff *skb)
|
||||
@ -5922,7 +5865,6 @@ static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
|
||||
cancel_delayed_work_sync(&ar->scan.timeout);
|
||||
cancel_work_sync(&ar->regd_update_work);
|
||||
cancel_work_sync(&ar->ab->update_11d_work);
|
||||
cancel_work_sync(&ar->ab->rfkill_work);
|
||||
|
||||
if (ar->state_11d == ATH11K_11D_PREPARING) {
|
||||
ar->state_11d = ATH11K_11D_IDLE;
|
||||
|
@ -148,8 +148,6 @@ u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
|
||||
|
||||
void __ath11k_mac_scan_finish(struct ath11k *ar);
|
||||
void ath11k_mac_scan_finish(struct ath11k *ar);
|
||||
int ath11k_mac_rfkill_enable_radio(struct ath11k *ar, bool enable);
|
||||
int ath11k_mac_rfkill_config(struct ath11k *ar);
|
||||
|
||||
struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id);
|
||||
struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
|
||||
|
@ -50,6 +50,22 @@ static void ath11k_pci_bus_release(struct ath11k_base *ab)
|
||||
mhi_device_put(ab_pci->mhi_ctrl->mhi_dev);
|
||||
}
|
||||
|
||||
static u32 ath11k_pci_get_window_start(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
if (!ab->hw_params.static_window_map)
|
||||
return ATH11K_PCI_WINDOW_START;
|
||||
|
||||
if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
/* if offset lies within DP register range, use 3rd window */
|
||||
return 3 * ATH11K_PCI_WINDOW_START;
|
||||
else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) <
|
||||
ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
/* if offset lies within CE register range, use 2nd window */
|
||||
return 2 * ATH11K_PCI_WINDOW_START;
|
||||
else
|
||||
return ATH11K_PCI_WINDOW_START;
|
||||
}
|
||||
|
||||
static inline void ath11k_pci_select_window(struct ath11k_pci *ab_pci, u32 offset)
|
||||
{
|
||||
struct ath11k_base *ab = ab_pci->ab;
|
||||
@ -70,26 +86,39 @@ static void
|
||||
ath11k_pci_window_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
||||
{
|
||||
struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
|
||||
u32 window_start = ATH11K_PCI_WINDOW_START;
|
||||
u32 window_start;
|
||||
|
||||
spin_lock_bh(&ab_pci->window_lock);
|
||||
ath11k_pci_select_window(ab_pci, offset);
|
||||
iowrite32(value, ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
spin_unlock_bh(&ab_pci->window_lock);
|
||||
window_start = ath11k_pci_get_window_start(ab, offset);
|
||||
|
||||
if (window_start == ATH11K_PCI_WINDOW_START) {
|
||||
spin_lock_bh(&ab_pci->window_lock);
|
||||
ath11k_pci_select_window(ab_pci, offset);
|
||||
iowrite32(value, ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
spin_unlock_bh(&ab_pci->window_lock);
|
||||
} else {
|
||||
iowrite32(value, ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
}
|
||||
}
|
||||
|
||||
static u32 ath11k_pci_window_read32(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
|
||||
u32 window_start = ATH11K_PCI_WINDOW_START;
|
||||
u32 val;
|
||||
u32 window_start, val;
|
||||
|
||||
spin_lock_bh(&ab_pci->window_lock);
|
||||
ath11k_pci_select_window(ab_pci, offset);
|
||||
val = ioread32(ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
spin_unlock_bh(&ab_pci->window_lock);
|
||||
window_start = ath11k_pci_get_window_start(ab, offset);
|
||||
|
||||
if (window_start == ATH11K_PCI_WINDOW_START) {
|
||||
spin_lock_bh(&ab_pci->window_lock);
|
||||
ath11k_pci_select_window(ab_pci, offset);
|
||||
val = ioread32(ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
spin_unlock_bh(&ab_pci->window_lock);
|
||||
} else {
|
||||
val = ioread32(ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
@ -110,6 +139,8 @@ static const struct ath11k_pci_ops ath11k_pci_ops_qca6390 = {
|
||||
};
|
||||
|
||||
static const struct ath11k_pci_ops ath11k_pci_ops_qcn9074 = {
|
||||
.wakeup = NULL,
|
||||
.release = NULL,
|
||||
.get_msi_irq = ath11k_pci_get_msi_irq,
|
||||
.window_write32 = ath11k_pci_window_write32,
|
||||
.window_read32 = ath11k_pci_window_read32,
|
||||
@ -697,6 +728,7 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
|
||||
struct ath11k_base *ab;
|
||||
struct ath11k_pci *ab_pci;
|
||||
u32 soc_hw_version_major, soc_hw_version_minor, addr;
|
||||
const struct ath11k_pci_ops *pci_ops;
|
||||
int ret;
|
||||
|
||||
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
|
||||
@ -754,10 +786,10 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
|
||||
goto err_pci_free_region;
|
||||
}
|
||||
|
||||
ab->pci.ops = &ath11k_pci_ops_qca6390;
|
||||
pci_ops = &ath11k_pci_ops_qca6390;
|
||||
break;
|
||||
case QCN9074_DEVICE_ID:
|
||||
ab->pci.ops = &ath11k_pci_ops_qcn9074;
|
||||
pci_ops = &ath11k_pci_ops_qcn9074;
|
||||
ab->hw_rev = ATH11K_HW_QCN9074_HW10;
|
||||
break;
|
||||
case WCN6855_DEVICE_ID:
|
||||
@ -787,7 +819,7 @@ unsupported_wcn6855_soc:
|
||||
goto err_pci_free_region;
|
||||
}
|
||||
|
||||
ab->pci.ops = &ath11k_pci_ops_qca6390;
|
||||
pci_ops = &ath11k_pci_ops_qca6390;
|
||||
break;
|
||||
default:
|
||||
dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n",
|
||||
@ -796,6 +828,12 @@ unsupported_wcn6855_soc:
|
||||
goto err_pci_free_region;
|
||||
}
|
||||
|
||||
ret = ath11k_pcic_register_pci_ops(ab, pci_ops);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
|
||||
goto err_pci_free_region;
|
||||
}
|
||||
|
||||
ret = ath11k_pcic_init_msi_config(ab);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to init msi config: %d\n", ret);
|
||||
|
@ -140,23 +140,8 @@ int ath11k_pcic_init_msi_config(struct ath11k_base *ab)
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_pcic_init_msi_config);
|
||||
|
||||
static inline u32 ath11k_pcic_get_window_start(struct ath11k_base *ab,
|
||||
u32 offset)
|
||||
{
|
||||
u32 window_start = 0;
|
||||
|
||||
if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
window_start = ab->hw_params.dp_window_idx * ATH11K_PCI_WINDOW_START;
|
||||
else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) <
|
||||
ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||
window_start = ab->hw_params.ce_window_idx * ATH11K_PCI_WINDOW_START;
|
||||
|
||||
return window_start;
|
||||
}
|
||||
|
||||
void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
||||
{
|
||||
u32 window_start;
|
||||
int ret = 0;
|
||||
|
||||
/* for offset beyond BAR + 4K - 32, may
|
||||
@ -166,15 +151,10 @@ void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
||||
offset >= ATH11K_PCI_ACCESS_ALWAYS_OFF && ab->pci.ops->wakeup)
|
||||
ret = ab->pci.ops->wakeup(ab);
|
||||
|
||||
if (offset < ATH11K_PCI_WINDOW_START) {
|
||||
if (offset < ATH11K_PCI_WINDOW_START)
|
||||
iowrite32(value, ab->mem + offset);
|
||||
} else if (ab->hw_params.static_window_map) {
|
||||
window_start = ath11k_pcic_get_window_start(ab, offset);
|
||||
iowrite32(value, ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
} else if (ab->pci.ops->window_write32) {
|
||||
else
|
||||
ab->pci.ops->window_write32(ab, offset, value);
|
||||
}
|
||||
|
||||
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
||||
offset >= ATH11K_PCI_ACCESS_ALWAYS_OFF && ab->pci.ops->release &&
|
||||
@ -185,9 +165,8 @@ EXPORT_SYMBOL(ath11k_pcic_write32);
|
||||
|
||||
u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
u32 val = 0;
|
||||
u32 window_start;
|
||||
int ret = 0;
|
||||
u32 val;
|
||||
|
||||
/* for offset beyond BAR + 4K - 32, may
|
||||
* need to wakeup the device to access.
|
||||
@ -196,15 +175,10 @@ u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
||||
offset >= ATH11K_PCI_ACCESS_ALWAYS_OFF && ab->pci.ops->wakeup)
|
||||
ret = ab->pci.ops->wakeup(ab);
|
||||
|
||||
if (offset < ATH11K_PCI_WINDOW_START) {
|
||||
if (offset < ATH11K_PCI_WINDOW_START)
|
||||
val = ioread32(ab->mem + offset);
|
||||
} else if (ab->hw_params.static_window_map) {
|
||||
window_start = ath11k_pcic_get_window_start(ab, offset);
|
||||
val = ioread32(ab->mem + window_start +
|
||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||
} else if (ab->pci.ops->window_read32) {
|
||||
else
|
||||
val = ab->pci.ops->window_read32(ab, offset);
|
||||
}
|
||||
|
||||
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
||||
offset >= ATH11K_PCI_ACCESS_ALWAYS_OFF && ab->pci.ops->release &&
|
||||
@ -516,11 +490,6 @@ static irqreturn_t ath11k_pcic_ext_interrupt_handler(int irq, void *arg)
|
||||
static int
|
||||
ath11k_pcic_get_msi_irq(struct ath11k_base *ab, unsigned int vector)
|
||||
{
|
||||
if (!ab->pci.ops->get_msi_irq) {
|
||||
WARN_ONCE(1, "get_msi_irq pci op not defined");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return ab->pci.ops->get_msi_irq(ab, vector);
|
||||
}
|
||||
|
||||
@ -746,3 +715,19 @@ int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_pcic_map_service_to_pipe);
|
||||
|
||||
int ath11k_pcic_register_pci_ops(struct ath11k_base *ab,
|
||||
const struct ath11k_pci_ops *pci_ops)
|
||||
{
|
||||
if (!pci_ops)
|
||||
return 0;
|
||||
|
||||
/* Return error if mandatory pci_ops callbacks are missing */
|
||||
if (!pci_ops->get_msi_irq || !pci_ops->window_write32 ||
|
||||
!pci_ops->window_read32)
|
||||
return -EINVAL;
|
||||
|
||||
ab->pci.ops = pci_ops;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_pcic_register_pci_ops);
|
||||
|
@ -43,4 +43,6 @@ int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
||||
void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab);
|
||||
void ath11k_pcic_ce_irq_disable_sync(struct ath11k_base *ab);
|
||||
int ath11k_pcic_init_msi_config(struct ath11k_base *ab);
|
||||
int ath11k_pcic_register_pci_ops(struct ath11k_base *ab,
|
||||
const struct ath11k_pci_ops *pci_ops);
|
||||
#endif
|
||||
|
@ -129,8 +129,6 @@ static const struct wmi_tlv_policy wmi_tlv_policies[] = {
|
||||
= { .min_len = sizeof(struct wmi_peer_assoc_conf_event) },
|
||||
[WMI_TAG_STATS_EVENT]
|
||||
= { .min_len = sizeof(struct wmi_stats_event) },
|
||||
[WMI_TAG_RFKILL_EVENT] = {
|
||||
.min_len = sizeof(struct wmi_rfkill_state_change_ev) },
|
||||
[WMI_TAG_PDEV_CTL_FAILSAFE_CHECK_EVENT]
|
||||
= { .min_len = sizeof(struct wmi_pdev_ctl_failsafe_chk_event) },
|
||||
[WMI_TAG_HOST_SWFDA_EVENT] = {
|
||||
@ -533,8 +531,6 @@ static int ath11k_pull_service_ready_tlv(struct ath11k_base *ab,
|
||||
cap->default_dbs_hw_mode_index = ev->default_dbs_hw_mode_index;
|
||||
cap->num_msdu_desc = ev->num_msdu_desc;
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI, "wmi sys cap info 0x%x\n", cap->sys_cap_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -7566,40 +7562,6 @@ exit:
|
||||
kfree(tb);
|
||||
}
|
||||
|
||||
static void ath11k_rfkill_state_change_event(struct ath11k_base *ab,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
const struct wmi_rfkill_state_change_ev *ev;
|
||||
const void **tb;
|
||||
int ret;
|
||||
|
||||
tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
|
||||
if (IS_ERR(tb)) {
|
||||
ret = PTR_ERR(tb);
|
||||
ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ev = tb[WMI_TAG_RFKILL_EVENT];
|
||||
if (!ev) {
|
||||
kfree(tb);
|
||||
return;
|
||||
}
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_MAC,
|
||||
"wmi tlv rfkill state change gpio %d type %d radio_state %d\n",
|
||||
ev->gpio_pin_num,
|
||||
ev->int_type,
|
||||
ev->radio_state);
|
||||
|
||||
spin_lock_bh(&ab->base_lock);
|
||||
ab->rfkill_radio_on = (ev->radio_state == WMI_RFKILL_RADIO_STATE_ON);
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
|
||||
queue_work(ab->workqueue, &ab->rfkill_work);
|
||||
kfree(tb);
|
||||
}
|
||||
|
||||
static void
|
||||
ath11k_wmi_pdev_temperature_event(struct ath11k_base *ab,
|
||||
struct sk_buff *skb)
|
||||
@ -7995,9 +7957,6 @@ static void ath11k_wmi_tlv_op_rx(struct ath11k_base *ab, struct sk_buff *skb)
|
||||
case WMI_11D_NEW_COUNTRY_EVENTID:
|
||||
ath11k_reg_11d_new_cc_event(ab, skb);
|
||||
break;
|
||||
case WMI_RFKILL_STATE_CHANGE_EVENTID:
|
||||
ath11k_rfkill_state_change_event(ab, skb);
|
||||
break;
|
||||
case WMI_DIAG_EVENTID:
|
||||
ath11k_wmi_diag_event(ab, skb);
|
||||
break;
|
||||
|
@ -5328,31 +5328,6 @@ struct target_resource_config {
|
||||
u32 twt_ap_sta_count;
|
||||
};
|
||||
|
||||
enum wmi_sys_cap_info_flags {
|
||||
WMI_SYS_CAP_INFO_RXTX_LED = BIT(0),
|
||||
WMI_SYS_CAP_INFO_RFKILL = BIT(1),
|
||||
};
|
||||
|
||||
#define WMI_RFKILL_CFG_GPIO_PIN_NUM GENMASK(5, 0)
|
||||
#define WMI_RFKILL_CFG_RADIO_LEVEL BIT(6)
|
||||
#define WMI_RFKILL_CFG_PIN_AS_GPIO GENMASK(10, 7)
|
||||
|
||||
enum wmi_rfkill_enable_radio {
|
||||
WMI_RFKILL_ENABLE_RADIO_ON = 0,
|
||||
WMI_RFKILL_ENABLE_RADIO_OFF = 1,
|
||||
};
|
||||
|
||||
enum wmi_rfkill_radio_state {
|
||||
WMI_RFKILL_RADIO_STATE_OFF = 1,
|
||||
WMI_RFKILL_RADIO_STATE_ON = 2,
|
||||
};
|
||||
|
||||
struct wmi_rfkill_state_change_ev {
|
||||
u32 gpio_pin_num;
|
||||
u32 int_type;
|
||||
u32 radio_state;
|
||||
} __packed;
|
||||
|
||||
enum wmi_debug_log_param {
|
||||
WMI_DEBUG_LOG_PARAM_LOG_LEVEL = 0x1,
|
||||
WMI_DEBUG_LOG_PARAM_VDEV_ENABLE,
|
||||
|
@ -5,6 +5,7 @@ wcn36xx-y += main.o \
|
||||
txrx.o \
|
||||
smd.o \
|
||||
pmc.o \
|
||||
debug.o
|
||||
debug.o \
|
||||
firmware.o
|
||||
|
||||
wcn36xx-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "wcn36xx.h"
|
||||
#include "debug.h"
|
||||
#include "pmc.h"
|
||||
#include "firmware.h"
|
||||
|
||||
#ifdef CONFIG_WCN36XX_DEBUGFS
|
||||
|
||||
@ -136,6 +137,42 @@ static const struct file_operations fops_wcn36xx_dump = {
|
||||
.write = write_file_dump,
|
||||
};
|
||||
|
||||
static ssize_t read_file_firmware_feature_caps(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct wcn36xx *wcn = file->private_data;
|
||||
size_t len = 0, buf_len = 2048;
|
||||
char *buf;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
buf = kzalloc(buf_len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&wcn->hal_mutex);
|
||||
for (i = 0; i < MAX_FEATURE_SUPPORTED; i++) {
|
||||
if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, i)) {
|
||||
len += scnprintf(buf + len, buf_len - len, "%s\n",
|
||||
wcn36xx_firmware_get_cap_name(i));
|
||||
}
|
||||
if (len >= buf_len)
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&wcn->hal_mutex);
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_wcn36xx_firmware_feat_caps = {
|
||||
.open = simple_open,
|
||||
.read = read_file_firmware_feature_caps,
|
||||
};
|
||||
|
||||
#define ADD_FILE(name, mode, fop, priv_data) \
|
||||
do { \
|
||||
struct dentry *d; \
|
||||
@ -163,6 +200,8 @@ void wcn36xx_debugfs_init(struct wcn36xx *wcn)
|
||||
|
||||
ADD_FILE(bmps_switcher, 0600, &fops_wcn36xx_bmps, wcn);
|
||||
ADD_FILE(dump, 0200, &fops_wcn36xx_dump, wcn);
|
||||
ADD_FILE(firmware_feat_caps, 0200,
|
||||
&fops_wcn36xx_firmware_feat_caps, wcn);
|
||||
}
|
||||
|
||||
void wcn36xx_debugfs_exit(struct wcn36xx *wcn)
|
||||
|
@ -31,6 +31,7 @@ struct wcn36xx_dfs_entry {
|
||||
struct dentry *rootdir;
|
||||
struct wcn36xx_dfs_file file_bmps_switcher;
|
||||
struct wcn36xx_dfs_file file_dump;
|
||||
struct wcn36xx_dfs_file file_firmware_feat_caps;
|
||||
};
|
||||
|
||||
void wcn36xx_debugfs_init(struct wcn36xx *wcn);
|
||||
|
125
drivers/net/wireless/ath/wcn36xx/firmware.c
Normal file
125
drivers/net/wireless/ath/wcn36xx/firmware.c
Normal file
@ -0,0 +1,125 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include "wcn36xx.h"
|
||||
#include "firmware.h"
|
||||
|
||||
#define DEFINE(s)[s] = #s
|
||||
|
||||
static const char * const wcn36xx_firmware_caps_names[] = {
|
||||
DEFINE(MCC),
|
||||
DEFINE(P2P),
|
||||
DEFINE(DOT11AC),
|
||||
DEFINE(SLM_SESSIONIZATION),
|
||||
DEFINE(DOT11AC_OPMODE),
|
||||
DEFINE(SAP32STA),
|
||||
DEFINE(TDLS),
|
||||
DEFINE(P2P_GO_NOA_DECOUPLE_INIT_SCAN),
|
||||
DEFINE(WLANACTIVE_OFFLOAD),
|
||||
DEFINE(BEACON_OFFLOAD),
|
||||
DEFINE(SCAN_OFFLOAD),
|
||||
DEFINE(ROAM_OFFLOAD),
|
||||
DEFINE(BCN_MISS_OFFLOAD),
|
||||
DEFINE(STA_POWERSAVE),
|
||||
DEFINE(STA_ADVANCED_PWRSAVE),
|
||||
DEFINE(AP_UAPSD),
|
||||
DEFINE(AP_DFS),
|
||||
DEFINE(BLOCKACK),
|
||||
DEFINE(PHY_ERR),
|
||||
DEFINE(BCN_FILTER),
|
||||
DEFINE(RTT),
|
||||
DEFINE(RATECTRL),
|
||||
DEFINE(WOW),
|
||||
DEFINE(WLAN_ROAM_SCAN_OFFLOAD),
|
||||
DEFINE(SPECULATIVE_PS_POLL),
|
||||
DEFINE(SCAN_SCH),
|
||||
DEFINE(IBSS_HEARTBEAT_OFFLOAD),
|
||||
DEFINE(WLAN_SCAN_OFFLOAD),
|
||||
DEFINE(WLAN_PERIODIC_TX_PTRN),
|
||||
DEFINE(ADVANCE_TDLS),
|
||||
DEFINE(BATCH_SCAN),
|
||||
DEFINE(FW_IN_TX_PATH),
|
||||
DEFINE(EXTENDED_NSOFFLOAD_SLOT),
|
||||
DEFINE(CH_SWITCH_V1),
|
||||
DEFINE(HT40_OBSS_SCAN),
|
||||
DEFINE(UPDATE_CHANNEL_LIST),
|
||||
DEFINE(WLAN_MCADDR_FLT),
|
||||
DEFINE(WLAN_CH144),
|
||||
DEFINE(NAN),
|
||||
DEFINE(TDLS_SCAN_COEXISTENCE),
|
||||
DEFINE(LINK_LAYER_STATS_MEAS),
|
||||
DEFINE(MU_MIMO),
|
||||
DEFINE(EXTENDED_SCAN),
|
||||
DEFINE(DYNAMIC_WMM_PS),
|
||||
DEFINE(MAC_SPOOFED_SCAN),
|
||||
DEFINE(BMU_ERROR_GENERIC_RECOVERY),
|
||||
DEFINE(DISA),
|
||||
DEFINE(FW_STATS),
|
||||
DEFINE(WPS_PRBRSP_TMPL),
|
||||
DEFINE(BCN_IE_FLT_DELTA),
|
||||
DEFINE(TDLS_OFF_CHANNEL),
|
||||
DEFINE(RTT3),
|
||||
DEFINE(MGMT_FRAME_LOGGING),
|
||||
DEFINE(ENHANCED_TXBD_COMPLETION),
|
||||
DEFINE(LOGGING_ENHANCEMENT),
|
||||
DEFINE(EXT_SCAN_ENHANCED),
|
||||
DEFINE(MEMORY_DUMP_SUPPORTED),
|
||||
DEFINE(PER_PKT_STATS_SUPPORTED),
|
||||
DEFINE(EXT_LL_STAT),
|
||||
DEFINE(WIFI_CONFIG),
|
||||
DEFINE(ANTENNA_DIVERSITY_SELECTION),
|
||||
};
|
||||
|
||||
#undef DEFINE
|
||||
|
||||
const char *wcn36xx_firmware_get_cap_name(enum wcn36xx_firmware_feat_caps x)
|
||||
{
|
||||
if (x >= ARRAY_SIZE(wcn36xx_firmware_caps_names))
|
||||
return "UNKNOWN";
|
||||
return wcn36xx_firmware_caps_names[x];
|
||||
}
|
||||
|
||||
void wcn36xx_firmware_set_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
bitmap[arr_idx] |= (1 << bit_idx);
|
||||
}
|
||||
|
||||
int wcn36xx_firmware_get_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
|
||||
return (bitmap[arr_idx] & (1 << bit_idx)) ? 1 : 0;
|
||||
}
|
||||
|
||||
void wcn36xx_firmware_clear_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
bitmap[arr_idx] &= ~(1 << bit_idx);
|
||||
}
|
84
drivers/net/wireless/ath/wcn36xx/firmware.h
Normal file
84
drivers/net/wireless/ath/wcn36xx/firmware.h
Normal file
@ -0,0 +1,84 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef _FIRMWARE_H_
|
||||
#define _FIRMWARE_H_
|
||||
|
||||
/* Capability bitmap exchange definitions and macros starts */
|
||||
|
||||
enum wcn36xx_firmware_feat_caps {
|
||||
MCC = 0,
|
||||
P2P = 1,
|
||||
DOT11AC = 2,
|
||||
SLM_SESSIONIZATION = 3,
|
||||
DOT11AC_OPMODE = 4,
|
||||
SAP32STA = 5,
|
||||
TDLS = 6,
|
||||
P2P_GO_NOA_DECOUPLE_INIT_SCAN = 7,
|
||||
WLANACTIVE_OFFLOAD = 8,
|
||||
BEACON_OFFLOAD = 9,
|
||||
SCAN_OFFLOAD = 10,
|
||||
ROAM_OFFLOAD = 11,
|
||||
BCN_MISS_OFFLOAD = 12,
|
||||
STA_POWERSAVE = 13,
|
||||
STA_ADVANCED_PWRSAVE = 14,
|
||||
AP_UAPSD = 15,
|
||||
AP_DFS = 16,
|
||||
BLOCKACK = 17,
|
||||
PHY_ERR = 18,
|
||||
BCN_FILTER = 19,
|
||||
RTT = 20,
|
||||
RATECTRL = 21,
|
||||
WOW = 22,
|
||||
WLAN_ROAM_SCAN_OFFLOAD = 23,
|
||||
SPECULATIVE_PS_POLL = 24,
|
||||
SCAN_SCH = 25,
|
||||
IBSS_HEARTBEAT_OFFLOAD = 26,
|
||||
WLAN_SCAN_OFFLOAD = 27,
|
||||
WLAN_PERIODIC_TX_PTRN = 28,
|
||||
ADVANCE_TDLS = 29,
|
||||
BATCH_SCAN = 30,
|
||||
FW_IN_TX_PATH = 31,
|
||||
EXTENDED_NSOFFLOAD_SLOT = 32,
|
||||
CH_SWITCH_V1 = 33,
|
||||
HT40_OBSS_SCAN = 34,
|
||||
UPDATE_CHANNEL_LIST = 35,
|
||||
WLAN_MCADDR_FLT = 36,
|
||||
WLAN_CH144 = 37,
|
||||
NAN = 38,
|
||||
TDLS_SCAN_COEXISTENCE = 39,
|
||||
LINK_LAYER_STATS_MEAS = 40,
|
||||
MU_MIMO = 41,
|
||||
EXTENDED_SCAN = 42,
|
||||
DYNAMIC_WMM_PS = 43,
|
||||
MAC_SPOOFED_SCAN = 44,
|
||||
BMU_ERROR_GENERIC_RECOVERY = 45,
|
||||
DISA = 46,
|
||||
FW_STATS = 47,
|
||||
WPS_PRBRSP_TMPL = 48,
|
||||
BCN_IE_FLT_DELTA = 49,
|
||||
TDLS_OFF_CHANNEL = 51,
|
||||
RTT3 = 52,
|
||||
MGMT_FRAME_LOGGING = 53,
|
||||
ENHANCED_TXBD_COMPLETION = 54,
|
||||
LOGGING_ENHANCEMENT = 55,
|
||||
EXT_SCAN_ENHANCED = 56,
|
||||
MEMORY_DUMP_SUPPORTED = 57,
|
||||
PER_PKT_STATS_SUPPORTED = 58,
|
||||
EXT_LL_STAT = 60,
|
||||
WIFI_CONFIG = 61,
|
||||
ANTENNA_DIVERSITY_SELECTION = 62,
|
||||
|
||||
MAX_FEATURE_SUPPORTED = 128,
|
||||
};
|
||||
|
||||
void wcn36xx_firmware_set_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap);
|
||||
int wcn36xx_firmware_get_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap);
|
||||
void wcn36xx_firmware_clear_feat_caps(u32 *bitmap,
|
||||
enum wcn36xx_firmware_feat_caps cap);
|
||||
|
||||
const char *wcn36xx_firmware_get_cap_name(enum wcn36xx_firmware_feat_caps x);
|
||||
|
||||
#endif /* _FIRMWARE_H_ */
|
||||
|
@ -4758,74 +4758,6 @@ struct wcn36xx_hal_set_power_params_resp {
|
||||
u32 status;
|
||||
} __packed;
|
||||
|
||||
/* Capability bitmap exchange definitions and macros starts */
|
||||
|
||||
enum place_holder_in_cap_bitmap {
|
||||
MCC = 0,
|
||||
P2P = 1,
|
||||
DOT11AC = 2,
|
||||
SLM_SESSIONIZATION = 3,
|
||||
DOT11AC_OPMODE = 4,
|
||||
SAP32STA = 5,
|
||||
TDLS = 6,
|
||||
P2P_GO_NOA_DECOUPLE_INIT_SCAN = 7,
|
||||
WLANACTIVE_OFFLOAD = 8,
|
||||
BEACON_OFFLOAD = 9,
|
||||
SCAN_OFFLOAD = 10,
|
||||
ROAM_OFFLOAD = 11,
|
||||
BCN_MISS_OFFLOAD = 12,
|
||||
STA_POWERSAVE = 13,
|
||||
STA_ADVANCED_PWRSAVE = 14,
|
||||
AP_UAPSD = 15,
|
||||
AP_DFS = 16,
|
||||
BLOCKACK = 17,
|
||||
PHY_ERR = 18,
|
||||
BCN_FILTER = 19,
|
||||
RTT = 20,
|
||||
RATECTRL = 21,
|
||||
WOW = 22,
|
||||
WLAN_ROAM_SCAN_OFFLOAD = 23,
|
||||
SPECULATIVE_PS_POLL = 24,
|
||||
SCAN_SCH = 25,
|
||||
IBSS_HEARTBEAT_OFFLOAD = 26,
|
||||
WLAN_SCAN_OFFLOAD = 27,
|
||||
WLAN_PERIODIC_TX_PTRN = 28,
|
||||
ADVANCE_TDLS = 29,
|
||||
BATCH_SCAN = 30,
|
||||
FW_IN_TX_PATH = 31,
|
||||
EXTENDED_NSOFFLOAD_SLOT = 32,
|
||||
CH_SWITCH_V1 = 33,
|
||||
HT40_OBSS_SCAN = 34,
|
||||
UPDATE_CHANNEL_LIST = 35,
|
||||
WLAN_MCADDR_FLT = 36,
|
||||
WLAN_CH144 = 37,
|
||||
NAN = 38,
|
||||
TDLS_SCAN_COEXISTENCE = 39,
|
||||
LINK_LAYER_STATS_MEAS = 40,
|
||||
MU_MIMO = 41,
|
||||
EXTENDED_SCAN = 42,
|
||||
DYNAMIC_WMM_PS = 43,
|
||||
MAC_SPOOFED_SCAN = 44,
|
||||
BMU_ERROR_GENERIC_RECOVERY = 45,
|
||||
DISA = 46,
|
||||
FW_STATS = 47,
|
||||
WPS_PRBRSP_TMPL = 48,
|
||||
BCN_IE_FLT_DELTA = 49,
|
||||
TDLS_OFF_CHANNEL = 51,
|
||||
RTT3 = 52,
|
||||
MGMT_FRAME_LOGGING = 53,
|
||||
ENHANCED_TXBD_COMPLETION = 54,
|
||||
LOGGING_ENHANCEMENT = 55,
|
||||
EXT_SCAN_ENHANCED = 56,
|
||||
MEMORY_DUMP_SUPPORTED = 57,
|
||||
PER_PKT_STATS_SUPPORTED = 58,
|
||||
EXT_LL_STAT = 60,
|
||||
WIFI_CONFIG = 61,
|
||||
ANTENNA_DIVERSITY_SELECTION = 62,
|
||||
|
||||
MAX_FEATURE_SUPPORTED = 128,
|
||||
};
|
||||
|
||||
#define WCN36XX_HAL_CAPS_SIZE 4
|
||||
|
||||
struct wcn36xx_hal_feat_caps_msg {
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <net/ipv6.h>
|
||||
#include "wcn36xx.h"
|
||||
#include "testmode.h"
|
||||
#include "firmware.h"
|
||||
|
||||
unsigned int wcn36xx_dbg_mask;
|
||||
module_param_named(debug_mask, wcn36xx_dbg_mask, uint, 0644);
|
||||
@ -192,88 +193,15 @@ static inline u8 get_sta_index(struct ieee80211_vif *vif,
|
||||
sta_priv->sta_index;
|
||||
}
|
||||
|
||||
#define DEFINE(s) [s] = #s
|
||||
|
||||
static const char * const wcn36xx_caps_names[] = {
|
||||
DEFINE(MCC),
|
||||
DEFINE(P2P),
|
||||
DEFINE(DOT11AC),
|
||||
DEFINE(SLM_SESSIONIZATION),
|
||||
DEFINE(DOT11AC_OPMODE),
|
||||
DEFINE(SAP32STA),
|
||||
DEFINE(TDLS),
|
||||
DEFINE(P2P_GO_NOA_DECOUPLE_INIT_SCAN),
|
||||
DEFINE(WLANACTIVE_OFFLOAD),
|
||||
DEFINE(BEACON_OFFLOAD),
|
||||
DEFINE(SCAN_OFFLOAD),
|
||||
DEFINE(ROAM_OFFLOAD),
|
||||
DEFINE(BCN_MISS_OFFLOAD),
|
||||
DEFINE(STA_POWERSAVE),
|
||||
DEFINE(STA_ADVANCED_PWRSAVE),
|
||||
DEFINE(AP_UAPSD),
|
||||
DEFINE(AP_DFS),
|
||||
DEFINE(BLOCKACK),
|
||||
DEFINE(PHY_ERR),
|
||||
DEFINE(BCN_FILTER),
|
||||
DEFINE(RTT),
|
||||
DEFINE(RATECTRL),
|
||||
DEFINE(WOW),
|
||||
DEFINE(WLAN_ROAM_SCAN_OFFLOAD),
|
||||
DEFINE(SPECULATIVE_PS_POLL),
|
||||
DEFINE(SCAN_SCH),
|
||||
DEFINE(IBSS_HEARTBEAT_OFFLOAD),
|
||||
DEFINE(WLAN_SCAN_OFFLOAD),
|
||||
DEFINE(WLAN_PERIODIC_TX_PTRN),
|
||||
DEFINE(ADVANCE_TDLS),
|
||||
DEFINE(BATCH_SCAN),
|
||||
DEFINE(FW_IN_TX_PATH),
|
||||
DEFINE(EXTENDED_NSOFFLOAD_SLOT),
|
||||
DEFINE(CH_SWITCH_V1),
|
||||
DEFINE(HT40_OBSS_SCAN),
|
||||
DEFINE(UPDATE_CHANNEL_LIST),
|
||||
DEFINE(WLAN_MCADDR_FLT),
|
||||
DEFINE(WLAN_CH144),
|
||||
DEFINE(NAN),
|
||||
DEFINE(TDLS_SCAN_COEXISTENCE),
|
||||
DEFINE(LINK_LAYER_STATS_MEAS),
|
||||
DEFINE(MU_MIMO),
|
||||
DEFINE(EXTENDED_SCAN),
|
||||
DEFINE(DYNAMIC_WMM_PS),
|
||||
DEFINE(MAC_SPOOFED_SCAN),
|
||||
DEFINE(BMU_ERROR_GENERIC_RECOVERY),
|
||||
DEFINE(DISA),
|
||||
DEFINE(FW_STATS),
|
||||
DEFINE(WPS_PRBRSP_TMPL),
|
||||
DEFINE(BCN_IE_FLT_DELTA),
|
||||
DEFINE(TDLS_OFF_CHANNEL),
|
||||
DEFINE(RTT3),
|
||||
DEFINE(MGMT_FRAME_LOGGING),
|
||||
DEFINE(ENHANCED_TXBD_COMPLETION),
|
||||
DEFINE(LOGGING_ENHANCEMENT),
|
||||
DEFINE(EXT_SCAN_ENHANCED),
|
||||
DEFINE(MEMORY_DUMP_SUPPORTED),
|
||||
DEFINE(PER_PKT_STATS_SUPPORTED),
|
||||
DEFINE(EXT_LL_STAT),
|
||||
DEFINE(WIFI_CONFIG),
|
||||
DEFINE(ANTENNA_DIVERSITY_SELECTION),
|
||||
};
|
||||
|
||||
#undef DEFINE
|
||||
|
||||
static const char *wcn36xx_get_cap_name(enum place_holder_in_cap_bitmap x)
|
||||
{
|
||||
if (x >= ARRAY_SIZE(wcn36xx_caps_names))
|
||||
return "UNKNOWN";
|
||||
return wcn36xx_caps_names[x];
|
||||
}
|
||||
|
||||
static void wcn36xx_feat_caps_info(struct wcn36xx *wcn)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_FEATURE_SUPPORTED; i++) {
|
||||
if (get_feat_caps(wcn->fw_feat_caps, i))
|
||||
wcn36xx_dbg(WCN36XX_DBG_MAC, "FW Cap %s\n", wcn36xx_get_cap_name(i));
|
||||
if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, i)) {
|
||||
wcn36xx_dbg(WCN36XX_DBG_MAC, "FW Cap %s\n",
|
||||
wcn36xx_firmware_get_cap_name(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -705,7 +633,7 @@ static int wcn36xx_hw_scan(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct wcn36xx *wcn = hw->priv;
|
||||
|
||||
if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
|
||||
if (!wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
|
||||
/* fallback to mac80211 software scan */
|
||||
return 1;
|
||||
}
|
||||
@ -743,7 +671,7 @@ static void wcn36xx_cancel_hw_scan(struct ieee80211_hw *hw,
|
||||
wcn->scan_aborted = true;
|
||||
mutex_unlock(&wcn->scan_lock);
|
||||
|
||||
if (get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
|
||||
if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) {
|
||||
/* ieee80211_scan_completed will be called on FW scan
|
||||
* indication */
|
||||
wcn36xx_smd_stop_hw_scan(wcn);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/rpmsg.h>
|
||||
#include "smd.h"
|
||||
#include "firmware.h"
|
||||
|
||||
struct wcn36xx_cfg_val {
|
||||
u32 cfg_id;
|
||||
@ -295,7 +296,7 @@ static void wcn36xx_smd_set_sta_vht_params(struct wcn36xx *wcn,
|
||||
sta_params->vht_capable = sta->deflink.vht_cap.vht_supported;
|
||||
sta_params->vht_ldpc_enabled =
|
||||
is_cap_supported(caps, IEEE80211_VHT_CAP_RXLDPC);
|
||||
if (get_feat_caps(wcn->fw_feat_caps, MU_MIMO)) {
|
||||
if (wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, MU_MIMO)) {
|
||||
sta_params->vht_tx_mu_beamformee_capable =
|
||||
is_cap_supported(caps, IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
|
||||
if (sta_params->vht_tx_mu_beamformee_capable)
|
||||
@ -2431,49 +2432,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void set_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
bitmap[arr_idx] |= (1 << bit_idx);
|
||||
}
|
||||
|
||||
int get_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
|
||||
return (bitmap[arr_idx] & (1 << bit_idx)) ? 1 : 0;
|
||||
}
|
||||
|
||||
void clear_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
|
||||
{
|
||||
int arr_idx, bit_idx;
|
||||
|
||||
if (cap < 0 || cap > 127) {
|
||||
wcn36xx_warn("error cap idx %d\n", cap);
|
||||
return;
|
||||
}
|
||||
|
||||
arr_idx = cap / 32;
|
||||
bit_idx = cap % 32;
|
||||
bitmap[arr_idx] &= ~(1 << bit_idx);
|
||||
}
|
||||
|
||||
int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn)
|
||||
{
|
||||
struct wcn36xx_hal_feat_caps_msg msg_body, *rsp;
|
||||
@ -2482,11 +2440,12 @@ int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn)
|
||||
mutex_lock(&wcn->hal_mutex);
|
||||
INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ);
|
||||
|
||||
set_feat_caps(msg_body.feat_caps, STA_POWERSAVE);
|
||||
wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE);
|
||||
if (wcn->rf_id == RF_IRIS_WCN3680) {
|
||||
set_feat_caps(msg_body.feat_caps, DOT11AC);
|
||||
set_feat_caps(msg_body.feat_caps, WLAN_CH144);
|
||||
set_feat_caps(msg_body.feat_caps, ANTENNA_DIVERSITY_SELECTION);
|
||||
wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, DOT11AC);
|
||||
wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, WLAN_CH144);
|
||||
wcn36xx_firmware_set_feat_caps(msg_body.feat_caps,
|
||||
ANTENNA_DIVERSITY_SELECTION);
|
||||
}
|
||||
|
||||
PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
|
||||
@ -3300,7 +3259,7 @@ int wcn36xx_smd_add_beacon_filter(struct wcn36xx *wcn,
|
||||
size_t payload_size;
|
||||
int ret;
|
||||
|
||||
if (!get_feat_caps(wcn->fw_feat_caps, BCN_FILTER))
|
||||
if (!wcn36xx_firmware_get_feat_caps(wcn->fw_feat_caps, BCN_FILTER))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&wcn->hal_mutex);
|
||||
|
@ -125,9 +125,6 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn,
|
||||
int wcn36xx_smd_dump_cmd_req(struct wcn36xx *wcn, u32 arg1, u32 arg2,
|
||||
u32 arg3, u32 arg4, u32 arg5);
|
||||
int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn);
|
||||
void set_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
|
||||
int get_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
|
||||
void clear_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
|
||||
|
||||
int wcn36xx_smd_add_ba_session(struct wcn36xx *wcn,
|
||||
struct ieee80211_sta *sta,
|
||||
|
@ -1010,7 +1010,7 @@ static ssize_t wil_write_file_wmi(struct file *file, const char __user *buf,
|
||||
void *cmd;
|
||||
int cmdlen = len - sizeof(struct wmi_cmd_hdr);
|
||||
u16 cmdid;
|
||||
int rc, rc1;
|
||||
int rc1;
|
||||
|
||||
if (cmdlen < 0 || *ppos != 0)
|
||||
return -EINVAL;
|
||||
@ -1027,7 +1027,7 @@ static ssize_t wil_write_file_wmi(struct file *file, const char __user *buf,
|
||||
|
||||
wil_info(wil, "0x%04x[%d] -> %d\n", cmdid, cmdlen, rc1);
|
||||
|
||||
return rc;
|
||||
return len;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_wmi = {
|
||||
|
@ -105,7 +105,7 @@ int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
|
||||
module_param_named(verbose, b43_modparam_verbose, int, 0644);
|
||||
MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
|
||||
|
||||
static int b43_modparam_pio = 0;
|
||||
static int b43_modparam_pio;
|
||||
module_param_named(pio, b43_modparam_pio, int, 0644);
|
||||
MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
|
||||
|
||||
|
@ -2944,7 +2944,7 @@ static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev)
|
||||
dev_kfree_skb(skb_dequeue(&wl->tx_queue[queue_num]));
|
||||
}
|
||||
|
||||
b43legacy_mac_suspend(dev);
|
||||
b43legacy_mac_suspend(dev);
|
||||
free_irq(dev->dev->irq, dev);
|
||||
b43legacydbg(wl, "Wireless interface stopped\n");
|
||||
}
|
||||
|
@ -784,9 +784,11 @@ void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev)
|
||||
sdiodev->txglomsz = sdiodev->settings->bus.sdio.txglomsz;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int brcmf_sdiod_freezer_attach(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_PM_SLEEP))
|
||||
return 0;
|
||||
|
||||
sdiodev->freezer = kzalloc(sizeof(*sdiodev->freezer), GFP_KERNEL);
|
||||
if (!sdiodev->freezer)
|
||||
return -ENOMEM;
|
||||
@ -802,6 +804,7 @@ static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
|
||||
if (sdiodev->freezer) {
|
||||
WARN_ON(atomic_read(&sdiodev->freezer->freezing));
|
||||
kfree(sdiodev->freezer);
|
||||
sdiodev->freezer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -833,7 +836,8 @@ static void brcmf_sdiod_freezer_off(struct brcmf_sdio_dev *sdiodev)
|
||||
|
||||
bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
return atomic_read(&sdiodev->freezer->freezing);
|
||||
return IS_ENABLED(CONFIG_PM_SLEEP) &&
|
||||
atomic_read(&sdiodev->freezer->freezing);
|
||||
}
|
||||
|
||||
void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
|
||||
@ -847,23 +851,15 @@ void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
|
||||
|
||||
void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
atomic_inc(&sdiodev->freezer->thread_count);
|
||||
if (IS_ENABLED(CONFIG_PM_SLEEP))
|
||||
atomic_inc(&sdiodev->freezer->thread_count);
|
||||
}
|
||||
|
||||
void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
atomic_dec(&sdiodev->freezer->thread_count);
|
||||
if (IS_ENABLED(CONFIG_PM_SLEEP))
|
||||
atomic_dec(&sdiodev->freezer->thread_count);
|
||||
}
|
||||
#else
|
||||
static int brcmf_sdiod_freezer_attach(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
@ -875,13 +871,9 @@ int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
|
||||
|
||||
brcmf_sdiod_freezer_detach(sdiodev);
|
||||
|
||||
/* Disable Function 2 */
|
||||
sdio_claim_host(sdiodev->func2);
|
||||
sdio_disable_func(sdiodev->func2);
|
||||
sdio_release_host(sdiodev->func2);
|
||||
|
||||
/* Disable Function 1 */
|
||||
/* Disable functions 2 then 1. */
|
||||
sdio_claim_host(sdiodev->func1);
|
||||
sdio_disable_func(sdiodev->func2);
|
||||
sdio_disable_func(sdiodev->func1);
|
||||
sdio_release_host(sdiodev->func1);
|
||||
|
||||
@ -911,7 +903,7 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
|
||||
if (ret) {
|
||||
brcmf_err("Failed to set F1 blocksize\n");
|
||||
sdio_release_host(sdiodev->func1);
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
switch (sdiodev->func2->device) {
|
||||
case SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373:
|
||||
@ -933,7 +925,7 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
|
||||
if (ret) {
|
||||
brcmf_err("Failed to set F2 blocksize\n");
|
||||
sdio_release_host(sdiodev->func1);
|
||||
goto out;
|
||||
return ret;
|
||||
} else {
|
||||
brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
|
||||
}
|
||||
@ -1136,7 +1128,6 @@ notsup:
|
||||
brcmf_dbg(SDIO, "WOWL not supported\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int brcmf_ops_sdio_suspend(struct device *dev)
|
||||
{
|
||||
struct sdio_func *func;
|
||||
@ -1204,11 +1195,9 @@ static int brcmf_ops_sdio_resume(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops brcmf_sdio_pm_ops = {
|
||||
.suspend = brcmf_ops_sdio_suspend,
|
||||
.resume = brcmf_ops_sdio_resume,
|
||||
};
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(brcmf_sdio_pm_ops,
|
||||
brcmf_ops_sdio_suspend,
|
||||
brcmf_ops_sdio_resume);
|
||||
|
||||
static struct sdio_driver brcmf_sdmmc_driver = {
|
||||
.probe = brcmf_ops_sdio_probe,
|
||||
@ -1217,9 +1206,7 @@ static struct sdio_driver brcmf_sdmmc_driver = {
|
||||
.id_table = brcmf_sdmmc_ids,
|
||||
.drv = {
|
||||
.owner = THIS_MODULE,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.pm = &brcmf_sdio_pm_ops,
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
.pm = pm_sleep_ptr(&brcmf_sdio_pm_ops),
|
||||
.coredump = brcmf_dev_coredump,
|
||||
},
|
||||
};
|
||||
|
@ -7481,6 +7481,9 @@ int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg,
|
||||
|
||||
static bool brmcf_use_iso3166_ccode_fallback(struct brcmf_pub *drvr)
|
||||
{
|
||||
if (drvr->settings->trivial_ccode_map)
|
||||
return true;
|
||||
|
||||
switch (drvr->bus_if->chip) {
|
||||
case BRCM_CC_4345_CHIP_ID:
|
||||
case BRCM_CC_43602_CHIP_ID:
|
||||
|
@ -190,6 +190,31 @@ done:
|
||||
return err;
|
||||
}
|
||||
|
||||
int brcmf_c_set_cur_etheraddr(struct brcmf_if *ifp, const u8 *addr)
|
||||
{
|
||||
s32 err;
|
||||
|
||||
err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", addr, ETH_ALEN);
|
||||
if (err < 0)
|
||||
bphy_err(ifp->drvr, "Setting cur_etheraddr failed, %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* On some boards there is no eeprom to hold the nvram, in this case instead
|
||||
* a board specific nvram is loaded from /lib/firmware. On most boards the
|
||||
* macaddr setting in the /lib/firmware nvram file is ignored because the
|
||||
* wifibt chip has a unique MAC programmed into the chip itself.
|
||||
* But in some cases the actual MAC from the /lib/firmware nvram file gets
|
||||
* used, leading to MAC conflicts.
|
||||
* The MAC addresses in the troublesome nvram files seem to all come from
|
||||
* the same nvram file template, so we only need to check for 1 known
|
||||
* address to detect this.
|
||||
*/
|
||||
static const u8 brcmf_default_mac_address[ETH_ALEN] = {
|
||||
0x00, 0x90, 0x4c, 0xc5, 0x12, 0x38
|
||||
};
|
||||
|
||||
int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||
{
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
@ -204,12 +229,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||
|
||||
if (is_valid_ether_addr(ifp->mac_addr)) {
|
||||
/* set mac address */
|
||||
err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
ETH_ALEN);
|
||||
if (err < 0) {
|
||||
bphy_err(ifp->drvr, "Setting cur_etheraddr failed, %d\n", err);
|
||||
err = brcmf_c_set_cur_etheraddr(ifp, ifp->mac_addr);
|
||||
if (err < 0)
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
/* retrieve mac address */
|
||||
err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
@ -218,6 +240,15 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||
bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ether_addr_equal_unaligned(ifp->mac_addr, brcmf_default_mac_address)) {
|
||||
bphy_err(drvr, "Default MAC is used, replacing with random MAC to avoid conflicts\n");
|
||||
eth_random_addr(ifp->mac_addr);
|
||||
ifp->ndev->addr_assign_type = NET_ADDR_RANDOM;
|
||||
err = brcmf_c_set_cur_etheraddr(ifp, ifp->mac_addr);
|
||||
if (err < 0)
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
||||
|
@ -38,6 +38,7 @@ extern struct brcmf_mp_global_t brcmf_mp_global;
|
||||
* @fcmode: FWS flow control.
|
||||
* @roamoff: Firmware roaming off?
|
||||
* @ignore_probe_fail: Ignore probe failure.
|
||||
* @trivial_ccode_map: Assume firmware uses ISO3166 country codes with rev 0
|
||||
* @country_codes: If available, pointer to struct for translating country codes
|
||||
* @bus: Bus specific platform data. Only SDIO at the mmoment.
|
||||
*/
|
||||
@ -48,6 +49,7 @@ struct brcmf_mp_device {
|
||||
bool roamoff;
|
||||
bool iapp;
|
||||
bool ignore_probe_fail;
|
||||
bool trivial_ccode_map;
|
||||
struct brcmfmac_pd_cc *country_codes;
|
||||
const char *board_type;
|
||||
unsigned char mac[ETH_ALEN];
|
||||
@ -65,6 +67,7 @@ void brcmf_release_module_param(struct brcmf_mp_device *module_param);
|
||||
|
||||
/* Sets dongle media info (drv_version, mac address). */
|
||||
int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
|
||||
int brcmf_c_set_cur_etheraddr(struct brcmf_if *ifp, const u8 *addr);
|
||||
|
||||
#ifdef CONFIG_DMI
|
||||
void brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev);
|
||||
|
@ -233,16 +233,12 @@ static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct sockaddr *sa = (struct sockaddr *)addr;
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
|
||||
err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", sa->sa_data,
|
||||
ETH_ALEN);
|
||||
if (err < 0) {
|
||||
bphy_err(drvr, "Setting cur_etheraddr failed, %d\n", err);
|
||||
} else {
|
||||
err = brcmf_c_set_cur_etheraddr(ifp, sa->sa_data);
|
||||
if (err >= 0) {
|
||||
brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data);
|
||||
memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN);
|
||||
eth_hw_addr_set(ifp->ndev, ifp->mac_addr);
|
||||
|
@ -24,6 +24,12 @@ static int brcmf_of_get_country_codes(struct device *dev,
|
||||
|
||||
count = of_property_count_strings(np, "brcm,ccode-map");
|
||||
if (count < 0) {
|
||||
/* If no explicit country code map is specified, check whether
|
||||
* the trivial map should be used.
|
||||
*/
|
||||
settings->trivial_ccode_map =
|
||||
of_property_read_bool(np, "brcm,ccode-map-trivial");
|
||||
|
||||
/* The property is optional, so return success if it doesn't
|
||||
* exist. Otherwise propagate the error code.
|
||||
*/
|
||||
@ -72,7 +78,6 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
/* Set board-type to the first string of the machine compatible prop */
|
||||
root = of_find_node_by_path("/");
|
||||
if (root) {
|
||||
int i;
|
||||
char *board_type;
|
||||
const char *tmp;
|
||||
|
||||
@ -84,10 +89,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
of_node_put(root);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < board_type[i]; i++) {
|
||||
if (board_type[i] == '/')
|
||||
board_type[i] = '-';
|
||||
}
|
||||
strreplace(board_type, '/', '-');
|
||||
settings->board_type = board_type;
|
||||
|
||||
of_node_put(root);
|
||||
|
@ -4020,15 +4020,14 @@ brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
|
||||
*/
|
||||
brcmf_sdiod_sgtable_alloc(sdiodev);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
/* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ
|
||||
* is true or when platform data OOB irq is true).
|
||||
*/
|
||||
if ((sdio_get_host_pm_caps(sdiodev->func1) & MMC_PM_KEEP_POWER) &&
|
||||
if (IS_ENABLED(CONFIG_PM_SLEEP) &&
|
||||
(sdio_get_host_pm_caps(sdiodev->func1) & MMC_PM_KEEP_POWER) &&
|
||||
((sdio_get_host_pm_caps(sdiodev->func1) & MMC_PM_WAKE_SDIO_IRQ) ||
|
||||
(sdiodev->settings->bus.sdio.oob_irq_supported)))
|
||||
sdiodev->bus_if->wowl_supported = true;
|
||||
#endif
|
||||
|
||||
if (brcmf_sdio_kso_init(bus)) {
|
||||
brcmf_err("error enabling KSO\n");
|
||||
@ -4152,7 +4151,6 @@ int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
|
||||
static int brcmf_sdio_bus_reset(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
||||
|
||||
@ -4169,14 +4167,7 @@ static int brcmf_sdio_bus_reset(struct device *dev)
|
||||
sdio_release_host(sdiodev->func1);
|
||||
|
||||
brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
|
||||
|
||||
ret = brcmf_sdiod_probe(sdiodev);
|
||||
if (ret) {
|
||||
brcmf_err("Failed to probe after sdio device reset: ret %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
||||
|
@ -346,26 +346,10 @@ int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
|
||||
void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
|
||||
void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
|
||||
enum brcmf_sdiod_state state);
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
|
||||
void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
|
||||
void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
|
||||
void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
|
||||
#else
|
||||
static inline bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
}
|
||||
static inline void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
}
|
||||
static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
|
||||
int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
|
||||
|
@ -1105,10 +1105,10 @@ static void iwl_mvm_debug_range_resp(struct iwl_mvm *mvm, u8 index,
|
||||
IWL_DEBUG_INFO(mvm, "\tstatus: %d\n", res->status);
|
||||
IWL_DEBUG_INFO(mvm, "\tBSSID: %pM\n", res->addr);
|
||||
IWL_DEBUG_INFO(mvm, "\thost time: %llu\n", res->host_time);
|
||||
IWL_DEBUG_INFO(mvm, "\tburst index: %hhu\n", res->ftm.burst_index);
|
||||
IWL_DEBUG_INFO(mvm, "\tburst index: %d\n", res->ftm.burst_index);
|
||||
IWL_DEBUG_INFO(mvm, "\tsuccess num: %u\n", res->ftm.num_ftmr_successes);
|
||||
IWL_DEBUG_INFO(mvm, "\trssi: %d\n", res->ftm.rssi_avg);
|
||||
IWL_DEBUG_INFO(mvm, "\trssi spread: %hhu\n", res->ftm.rssi_spread);
|
||||
IWL_DEBUG_INFO(mvm, "\trssi spread: %d\n", res->ftm.rssi_spread);
|
||||
IWL_DEBUG_INFO(mvm, "\trtt: %lld\n", res->ftm.rtt_avg);
|
||||
IWL_DEBUG_INFO(mvm, "\trtt var: %llu\n", res->ftm.rtt_variance);
|
||||
IWL_DEBUG_INFO(mvm, "\trtt spread: %llu\n", res->ftm.rtt_spread);
|
||||
|
@ -1861,6 +1861,7 @@ static void iwl_mvm_disable_sta_queues(struct iwl_mvm *mvm,
|
||||
iwl_mvm_txq_from_mac80211(sta->txq[i]);
|
||||
|
||||
mvmtxq->txq_id = IWL_MVM_INVALID_QUEUE;
|
||||
list_del_init(&mvmtxq->list);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,6 +287,7 @@ static int if_usb_probe(struct usb_interface *intf,
|
||||
return 0;
|
||||
|
||||
err_get_fw:
|
||||
usb_put_dev(udev);
|
||||
lbs_remove_card(priv);
|
||||
err_add_card:
|
||||
if_usb_reset_device(cardp);
|
||||
|
@ -3373,7 +3373,7 @@ static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
|
||||
} else {
|
||||
mwifiex_dbg(adapter, INFO,
|
||||
"%s(): calling free_irq()\n", __func__);
|
||||
free_irq(card->dev->irq, &card->share_irq_ctx);
|
||||
free_irq(card->dev->irq, &card->share_irq_ctx);
|
||||
|
||||
if (card->msi_enable)
|
||||
pci_disable_msi(pdev);
|
||||
|
@ -1549,7 +1549,7 @@ done:
|
||||
/*
|
||||
* This function decode sdio aggreation pkt.
|
||||
*
|
||||
* Based on the the data block size and pkt_len,
|
||||
* Based on the data block size and pkt_len,
|
||||
* skb data will be decoded to few packets.
|
||||
*/
|
||||
static void mwifiex_deaggr_sdio_pkt(struct mwifiex_adapter *adapter,
|
||||
|
@ -1880,7 +1880,7 @@ static inline void mwl8k_tx_count_packet(struct ieee80211_sta *sta, u8 tid)
|
||||
* packets ever exceeds the ampdu_min_traffic threshold, we will allow
|
||||
* an ampdu stream to be started.
|
||||
*/
|
||||
if (jiffies - tx_stats->start_time > HZ) {
|
||||
if (time_after(jiffies, (unsigned long)tx_stats->start_time + HZ)) {
|
||||
tx_stats->pkts = 0;
|
||||
tx_stats->start_time = 0;
|
||||
} else
|
||||
|
@ -1312,12 +1312,11 @@ static int dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (idx != 0)
|
||||
return -ENOENT;
|
||||
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
|
||||
|
||||
ret = wilc_get_rssi(vif, &sinfo->signal);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
|
||||
memcpy(mac, vif->priv.associated_bss, ETH_ALEN);
|
||||
return 0;
|
||||
}
|
||||
|
@ -635,7 +635,7 @@ static inline void host_int_parse_assoc_resp_info(struct wilc_vif *vif,
|
||||
conn_info->req_ies_len = 0;
|
||||
}
|
||||
|
||||
static inline void host_int_handle_disconnect(struct wilc_vif *vif)
|
||||
inline void wilc_handle_disconnect(struct wilc_vif *vif)
|
||||
{
|
||||
struct host_if_drv *hif_drv = vif->hif_drv;
|
||||
|
||||
@ -647,8 +647,6 @@ static inline void host_int_handle_disconnect(struct wilc_vif *vif)
|
||||
if (hif_drv->conn_info.conn_result)
|
||||
hif_drv->conn_info.conn_result(CONN_DISCONN_EVENT_DISCONN_NOTIF,
|
||||
0, hif_drv->conn_info.arg);
|
||||
else
|
||||
netdev_err(vif->ndev, "%s: conn_result is NULL\n", __func__);
|
||||
|
||||
eth_zero_addr(hif_drv->assoc_bssid);
|
||||
|
||||
@ -684,7 +682,7 @@ static void handle_rcvd_gnrl_async_info(struct work_struct *work)
|
||||
host_int_parse_assoc_resp_info(vif, mac_info->status);
|
||||
} else if (mac_info->status == WILC_MAC_STATUS_DISCONNECTED) {
|
||||
if (hif_drv->hif_state == HOST_IF_CONNECTED) {
|
||||
host_int_handle_disconnect(vif);
|
||||
wilc_handle_disconnect(vif);
|
||||
} else if (hif_drv->usr_scan_req.scan_result) {
|
||||
del_timer(&hif_drv->scan_timer);
|
||||
handle_scan_done(vif, SCAN_EVENT_ABORTED);
|
||||
|
@ -215,4 +215,5 @@ void wilc_gnrl_async_info_received(struct wilc *wilc, u8 *buffer, u32 length);
|
||||
void *wilc_parse_join_bss_param(struct cfg80211_bss *bss,
|
||||
struct cfg80211_crypto_settings *crypto);
|
||||
int wilc_set_default_mgmt_key_index(struct wilc_vif *vif, u8 index);
|
||||
inline void wilc_handle_disconnect(struct wilc_vif *vif);
|
||||
#endif
|
||||
|
@ -97,12 +97,12 @@ static struct net_device *get_if_handler(struct wilc *wilc, u8 *mac_header)
|
||||
struct ieee80211_hdr *h = (struct ieee80211_hdr *)mac_header;
|
||||
|
||||
list_for_each_entry_rcu(vif, &wilc->vif_list, list) {
|
||||
if (vif->mode == WILC_STATION_MODE)
|
||||
if (vif->iftype == WILC_STATION_MODE)
|
||||
if (ether_addr_equal_unaligned(h->addr2, vif->bssid)) {
|
||||
ndev = vif->ndev;
|
||||
goto out;
|
||||
}
|
||||
if (vif->mode == WILC_AP_MODE)
|
||||
if (vif->iftype == WILC_AP_MODE)
|
||||
if (ether_addr_equal_unaligned(h->addr1, vif->bssid)) {
|
||||
ndev = vif->ndev;
|
||||
goto out;
|
||||
@ -122,7 +122,7 @@ void wilc_wlan_set_bssid(struct net_device *wilc_netdev, const u8 *bssid,
|
||||
else
|
||||
eth_zero_addr(vif->bssid);
|
||||
|
||||
vif->mode = mode;
|
||||
vif->iftype = mode;
|
||||
}
|
||||
|
||||
int wilc_wlan_get_num_conn_ifcs(struct wilc *wilc)
|
||||
@ -472,7 +472,7 @@ static int wlan_initialize_threads(struct net_device *dev)
|
||||
"%s-tx", dev->name);
|
||||
if (IS_ERR(wilc->txq_thread)) {
|
||||
netdev_err(dev, "couldn't create TXQ thread\n");
|
||||
wilc->close = 0;
|
||||
wilc->close = 1;
|
||||
return PTR_ERR(wilc->txq_thread);
|
||||
}
|
||||
wait_for_completion(&wilc->txq_thread_started);
|
||||
@ -780,6 +780,7 @@ static int wilc_mac_close(struct net_device *ndev)
|
||||
if (vif->ndev) {
|
||||
netif_stop_queue(vif->ndev);
|
||||
|
||||
wilc_handle_disconnect(vif);
|
||||
wilc_deinit_host_int(vif->ndev);
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,6 @@ struct wilc_vif {
|
||||
u8 bssid[ETH_ALEN];
|
||||
struct host_if_drv *hif_drv;
|
||||
struct net_device *ndev;
|
||||
u8 mode;
|
||||
struct timer_list during_ip_timer;
|
||||
struct timer_list periodic_rssi;
|
||||
struct rf_info periodic_stat;
|
||||
|
@ -26,6 +26,7 @@ static const struct sdio_device_id wilc_sdio_ids[] = {
|
||||
struct wilc_sdio {
|
||||
bool irq_gpio;
|
||||
u32 block_size;
|
||||
bool isinit;
|
||||
int has_thrpt_enh3;
|
||||
};
|
||||
|
||||
@ -193,6 +194,13 @@ static int wilc_sdio_reset(struct wilc *wilc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool wilc_sdio_is_init(struct wilc *wilc)
|
||||
{
|
||||
struct wilc_sdio *sdio_priv = wilc->bus_data;
|
||||
|
||||
return sdio_priv->isinit;
|
||||
}
|
||||
|
||||
static int wilc_sdio_suspend(struct device *dev)
|
||||
{
|
||||
struct sdio_func *func = dev_to_sdio_func(dev);
|
||||
@ -581,6 +589,9 @@ static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
|
||||
|
||||
static int wilc_sdio_deinit(struct wilc *wilc)
|
||||
{
|
||||
struct wilc_sdio *sdio_priv = wilc->bus_data;
|
||||
|
||||
sdio_priv->isinit = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -700,6 +711,7 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
|
||||
sdio_priv->has_thrpt_enh3);
|
||||
}
|
||||
|
||||
sdio_priv->isinit = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -981,6 +993,7 @@ static const struct wilc_hif_func wilc_hif_sdio = {
|
||||
.enable_interrupt = wilc_sdio_enable_interrupt,
|
||||
.disable_interrupt = wilc_sdio_disable_interrupt,
|
||||
.hif_reset = wilc_sdio_reset,
|
||||
.hif_is_init = wilc_sdio_is_init,
|
||||
};
|
||||
|
||||
static int wilc_sdio_resume(struct device *dev)
|
||||
|
@ -1029,6 +1029,13 @@ static int wilc_spi_reset(struct wilc *wilc)
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool wilc_spi_is_init(struct wilc *wilc)
|
||||
{
|
||||
struct wilc_spi *spi_priv = wilc->bus_data;
|
||||
|
||||
return spi_priv->isinit;
|
||||
}
|
||||
|
||||
static int wilc_spi_deinit(struct wilc *wilc)
|
||||
{
|
||||
struct wilc_spi *spi_priv = wilc->bus_data;
|
||||
@ -1250,4 +1257,5 @@ static const struct wilc_hif_func wilc_hif_spi = {
|
||||
.hif_block_rx_ext = wilc_spi_read,
|
||||
.hif_sync_ext = wilc_spi_sync_ext,
|
||||
.hif_reset = wilc_spi_reset,
|
||||
.hif_is_init = wilc_spi_is_init,
|
||||
};
|
||||
|
@ -1481,9 +1481,12 @@ int wilc_wlan_init(struct net_device *dev)
|
||||
|
||||
wilc->quit = 0;
|
||||
|
||||
if (wilc->hif_func->hif_init(wilc, false)) {
|
||||
ret = -EIO;
|
||||
goto fail;
|
||||
if (!wilc->hif_func->hif_is_init(wilc)) {
|
||||
acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
|
||||
ret = wilc->hif_func->hif_init(wilc, false);
|
||||
release_bus(wilc, WILC_BUS_RELEASE_ONLY);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!wilc->tx_buffer)
|
||||
|
@ -373,6 +373,7 @@ struct wilc_hif_func {
|
||||
int (*enable_interrupt)(struct wilc *nic);
|
||||
void (*disable_interrupt)(struct wilc *nic);
|
||||
int (*hif_reset)(struct wilc *wilc);
|
||||
bool (*hif_is_init)(struct wilc *wilc);
|
||||
};
|
||||
|
||||
#define WILC_MAX_CFG_FRAME_SIZE 1468
|
||||
|
@ -22,6 +22,7 @@ static const struct wilc_cfg_byte g_cfg_byte[] = {
|
||||
{WID_STATUS, 0},
|
||||
{WID_RSSI, 0},
|
||||
{WID_LINKSPEED, 0},
|
||||
{WID_TX_POWER, 0},
|
||||
{WID_WOWLAN_TRIGGER, 0},
|
||||
{WID_NIL, 0}
|
||||
};
|
||||
@ -180,9 +181,10 @@ static void wilc_wlan_parse_response_frame(struct wilc *wl, u8 *info, int size)
|
||||
i++;
|
||||
|
||||
if (cfg->s[i].id == wid)
|
||||
memcpy(cfg->s[i].str, &info[2], info[2] + 2);
|
||||
memcpy(cfg->s[i].str, &info[2],
|
||||
get_unaligned_le16(&info[2]) + 2);
|
||||
|
||||
len = 2 + info[2];
|
||||
len = 2 + get_unaligned_le16(&info[2]);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -562,7 +562,7 @@ static void sta_queue_cleanup_timer_callb(struct timer_list *t)
|
||||
if (tx->station[sidx].flag & STATION_HEARTBEAT_FLAG) {
|
||||
tx->station[sidx].flag ^= STATION_HEARTBEAT_FLAG;
|
||||
} else {
|
||||
memset(tx->station[sidx].mac, 0, ETH_ALEN);
|
||||
eth_zero_addr(tx->station[sidx].mac);
|
||||
tx->station[sidx].flag = 0;
|
||||
}
|
||||
}
|
||||
|
@ -6658,7 +6658,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
if (!hw) {
|
||||
ret = -ENOMEM;
|
||||
priv = NULL;
|
||||
goto exit;
|
||||
goto err_put_dev;
|
||||
}
|
||||
|
||||
priv = hw->priv;
|
||||
@ -6680,24 +6680,24 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
|
||||
ret = rtl8xxxu_parse_usb(priv, interface);
|
||||
if (ret)
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
|
||||
ret = rtl8xxxu_identify_chip(priv);
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "Fatal - failed to identify chip\n");
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
}
|
||||
|
||||
ret = rtl8xxxu_read_efuse(priv);
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "Fatal - failed to read EFuse\n");
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
}
|
||||
|
||||
ret = priv->fops->parse_efuse(priv);
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "Fatal - failed to parse EFuse\n");
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
}
|
||||
|
||||
rtl8xxxu_print_chipinfo(priv);
|
||||
@ -6705,12 +6705,12 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
ret = priv->fops->load_firmware(priv);
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "Fatal - failed to load firmware\n");
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
}
|
||||
|
||||
ret = rtl8xxxu_init_device(hw);
|
||||
if (ret)
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
|
||||
hw->wiphy->max_scan_ssids = 1;
|
||||
hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
|
||||
@ -6760,12 +6760,12 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "%s: Failed to register: %i\n",
|
||||
__func__, ret);
|
||||
goto exit;
|
||||
goto err_set_intfdata;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
err_set_intfdata:
|
||||
usb_set_intfdata(interface, NULL);
|
||||
|
||||
if (priv) {
|
||||
@ -6773,9 +6773,10 @@ exit:
|
||||
mutex_destroy(&priv->usb_buf_mutex);
|
||||
mutex_destroy(&priv->h2c_mutex);
|
||||
}
|
||||
usb_put_dev(udev);
|
||||
|
||||
ieee80211_free_hw(hw);
|
||||
err_put_dev:
|
||||
usb_put_dev(udev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1703,7 +1703,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
rtlpriv->sec.key_len[key_idx] = 0;
|
||||
eth_zero_addr(mac_addr);
|
||||
/*
|
||||
*mac80211 will delete entrys one by one,
|
||||
*mac80211 will delete entries one by one,
|
||||
*so don't use rtl_cam_reset_all_entry
|
||||
*or clear all entry here.
|
||||
*/
|
||||
|
@ -1992,6 +1992,10 @@ int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
timer_setup(&rtwdev->tx_report.purge_timer,
|
||||
rtw_tx_report_purge_timer, 0);
|
||||
rtwdev->tx_wq = alloc_workqueue("rtw_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
|
||||
if (!rtwdev->tx_wq) {
|
||||
rtw_warn(rtwdev, "alloc_workqueue rtw_tx_wq failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work);
|
||||
INIT_DELAYED_WORK(&coex->bt_relink_work, rtw_coex_bt_relink_work);
|
||||
|
@ -3111,7 +3111,7 @@ void rtw89_pci_config_intr_mask(struct rtw89_dev *rtwdev)
|
||||
rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN | 0;
|
||||
|
||||
if (rtwpci->under_recovery) {
|
||||
rtwpci->intrs[0] = 0;
|
||||
rtwpci->intrs[0] = B_AX_HS0ISR_IND_INT_EN;
|
||||
rtwpci->intrs[1] = 0;
|
||||
} else {
|
||||
rtwpci->intrs[0] = B_AX_TXDMA_STUCK_INT_EN |
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1924,13 +1924,10 @@ static int wl12xx_remove(struct platform_device *pdev)
|
||||
struct wl1271 *wl = platform_get_drvdata(pdev);
|
||||
struct wl12xx_priv *priv;
|
||||
|
||||
if (!wl)
|
||||
goto out;
|
||||
priv = wl->priv;
|
||||
|
||||
kfree(priv->rx_mem_addr);
|
||||
|
||||
out:
|
||||
return wlcore_remove(pdev);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user