* [PATCH 1/5] ath10k: prevent using invalid ringbuffer indexes
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
@ 2013-07-31 8:55 ` Michal Kazior
2013-07-31 8:55 ` [PATCH 2/5] ath10k: make sure to use passive scan when n_ssids is 0 Michal Kazior
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michal Kazior @ 2013-07-31 8:55 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
If the device is removed and hotplug fails
ioread32() will return 0xFFFFFFFF. In that case
reading ringbuffer during device bringup led to
out-of-bounds addressing of a ringbuffer array
that in turn led to a paging failure.
This could be reproduced by the following:
* boot without acpi/prevent hotplug from working
* insert and manually detect (pci rescan) the device
* remove the device physically
* load ath10k driver
* kernel crashed
Ringbuffer index reading is now protected by using
an appropriate mask to prevent addressing an
invalid array index.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/ce.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c
index b407929..f8b969f 100644
--- a/drivers/net/wireless/ath/ath10k/ce.c
+++ b/drivers/net/wireless/ath/ath10k/ce.c
@@ -637,6 +637,7 @@ static int ath10k_ce_completed_send_next_nolock(struct ce_state *ce_state,
ath10k_pci_wake(ar);
src_ring->hw_index =
ath10k_ce_src_ring_read_index_get(ar, ctrl_addr);
+ src_ring->hw_index &= nentries_mask;
ath10k_pci_sleep(ar);
}
read_index = src_ring->hw_index;
@@ -950,10 +951,12 @@ static int ath10k_ce_init_src_ring(struct ath10k *ar,
ath10k_pci_wake(ar);
src_ring->sw_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr);
+ src_ring->sw_index &= src_ring->nentries_mask;
src_ring->hw_index = src_ring->sw_index;
src_ring->write_index =
ath10k_ce_src_ring_write_index_get(ar, ctrl_addr);
+ src_ring->write_index &= src_ring->nentries_mask;
ath10k_pci_sleep(ar);
src_ring->per_transfer_context = (void **)ptr;
@@ -1035,8 +1038,10 @@ static int ath10k_ce_init_dest_ring(struct ath10k *ar,
ath10k_pci_wake(ar);
dest_ring->sw_index = ath10k_ce_dest_ring_read_index_get(ar, ctrl_addr);
+ dest_ring->sw_index &= dest_ring->nentries_mask;
dest_ring->write_index =
ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr);
+ dest_ring->write_index &= dest_ring->nentries_mask;
ath10k_pci_sleep(ar);
dest_ring->per_transfer_context = (void **)ptr;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/5] ath10k: make sure to use passive scan when n_ssids is 0
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
2013-07-31 8:55 ` [PATCH 1/5] ath10k: prevent using invalid ringbuffer indexes Michal Kazior
@ 2013-07-31 8:55 ` Michal Kazior
2013-07-31 8:55 ` [PATCH 3/5] ath10k: advertise more conservative intf combinations Michal Kazior
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michal Kazior @ 2013-07-31 8:55 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
Normally user specifies broadcast ssid for
scanning. If the user wants to do a passive scan
it does not pass any ssids.
The patch makes sure we ath10k tells firmware to
not send anything at all in case it decides no
ssids equals broadcast ssid.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 344ad27..1ea386e 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2338,6 +2338,8 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
arg.ssids[i].len = req->ssids[i].ssid_len;
arg.ssids[i].ssid = req->ssids[i].ssid;
}
+ } else {
+ arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
}
if (req->n_channels) {
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 3/5] ath10k: advertise more conservative intf combinations
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
2013-07-31 8:55 ` [PATCH 1/5] ath10k: prevent using invalid ringbuffer indexes Michal Kazior
2013-07-31 8:55 ` [PATCH 2/5] ath10k: make sure to use passive scan when n_ssids is 0 Michal Kazior
@ 2013-07-31 8:55 ` Michal Kazior
2013-07-31 8:55 ` [PATCH 4/5] ath10k: zero arvif memory on add_interface() Michal Kazior
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michal Kazior @ 2013-07-31 8:55 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
Apparently the available firmware has a limit of
handling 7 APs, 3 GOs or 8 STAs. This is based on
empirical tests and it is still possible some
combinations may crash the firmware.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 1ea386e..6a130c5 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -3078,9 +3078,15 @@ static const struct ieee80211_iface_limit ath10k_if_limits[] = {
.max = 8,
.types = BIT(NL80211_IFTYPE_STATION)
| BIT(NL80211_IFTYPE_P2P_CLIENT)
- | BIT(NL80211_IFTYPE_P2P_GO)
- | BIT(NL80211_IFTYPE_AP)
- }
+ },
+ {
+ .max = 3,
+ .types = BIT(NL80211_IFTYPE_P2P_GO)
+ },
+ {
+ .max = 7,
+ .types = BIT(NL80211_IFTYPE_AP)
+ },
};
static const struct ieee80211_iface_combination ath10k_if_comb = {
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 4/5] ath10k: zero arvif memory on add_interface()
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
` (2 preceding siblings ...)
2013-07-31 8:55 ` [PATCH 3/5] ath10k: advertise more conservative intf combinations Michal Kazior
@ 2013-07-31 8:55 ` Michal Kazior
2013-07-31 8:55 ` [PATCH 5/5] ath10k: fix failpath in MSI-X setup Michal Kazior
2013-08-02 6:38 ` [PATCH 0/5] ath10k: fixes Kalle Valo
5 siblings, 0 replies; 7+ messages in thread
From: Michal Kazior @ 2013-07-31 8:55 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
The private memory area in vif provided by
mac80211 isn't guaranteed to be zeroed.
This patch should fix issues when switching
between STA and AP interface types.
The tim_bitmap could become polluted by STA bssid
field (since it's a union), wep_keys array
could also become polluted with invalid pointers
and probably much more.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 6a130c5..1aa5a39 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1925,6 +1925,8 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
mutex_lock(&ar->conf_mutex);
+ memset(arvif, 0, sizeof(*arvif));
+
arvif->ar = ar;
arvif->vif = vif;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 5/5] ath10k: fix failpath in MSI-X setup
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
` (3 preceding siblings ...)
2013-07-31 8:55 ` [PATCH 4/5] ath10k: zero arvif memory on add_interface() Michal Kazior
@ 2013-07-31 8:55 ` Michal Kazior
2013-08-02 6:38 ` [PATCH 0/5] ath10k: fixes Kalle Valo
5 siblings, 0 replies; 7+ messages in thread
From: Michal Kazior @ 2013-07-31 8:55 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
pci_disable_msi() must be called if the initial
request_irq() fails.
Also add a warning message so it's possible to
distinguish request_irq() failure and
pci_enable_msi() failure.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/pci.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index c71b488..d95439b 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -1990,8 +1990,13 @@ static int ath10k_pci_start_intr_msix(struct ath10k *ar, int num)
ret = request_irq(ar_pci->pdev->irq + MSI_ASSIGN_FW,
ath10k_pci_msi_fw_handler,
IRQF_SHARED, "ath10k_pci", ar);
- if (ret)
+ if (ret) {
+ ath10k_warn("request_irq(%d) failed %d\n",
+ ar_pci->pdev->irq + MSI_ASSIGN_FW, ret);
+
+ pci_disable_msi(ar_pci->pdev);
return ret;
+ }
for (i = MSI_ASSIGN_CE_INITIAL; i <= MSI_ASSIGN_CE_MAX; i++) {
ret = request_irq(ar_pci->pdev->irq + i,
--
1.7.9.5
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 0/5] ath10k: fixes
2013-07-31 8:55 [PATCH 0/5] ath10k: fixes Michal Kazior
` (4 preceding siblings ...)
2013-07-31 8:55 ` [PATCH 5/5] ath10k: fix failpath in MSI-X setup Michal Kazior
@ 2013-08-02 6:38 ` Kalle Valo
5 siblings, 0 replies; 7+ messages in thread
From: Kalle Valo @ 2013-08-02 6:38 UTC (permalink / raw)
To: Michal Kazior; +Cc: ath10k, linux-wireless
Michal Kazior <michal.kazior@tieto.com> writes:
> Hi,
>
> This is a batch up of a few fixes for ath10k
> driver I had in my queue for some time now.
>
>
> Michal Kazior (5):
> ath10k: prevent using invalid ringbuffer indexes
> ath10k: make sure to use passive scan when n_ssids is 0
> ath10k: advertise more conservative intf combinations
> ath10k: zero arvif memory on add_interface()
> ath10k: fix failpath in MSI-X setup
All applied, thanks.
--
Kalle Valo
^ permalink raw reply [flat|nested] 7+ messages in thread