Commit a0929621 authored by Kalle Valo's avatar Kalle Valo

Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git

ath.git patches for v5.15. Major changes:

wcn36xx

* allow firmware name to be overridden by DT
parents 50cbbfd4 fd6729ec
...@@ -2504,8 +2504,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx) ...@@ -2504,8 +2504,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx)
goto free_data_skb; goto free_data_skb;
for (index = 0; index < num_pri_streams; index++) { for (index = 0; index < num_pri_streams; index++) {
if (WARN_ON(!data_sync_bufs[index].skb)) if (WARN_ON(!data_sync_bufs[index].skb)) {
ret = -ENOMEM;
goto free_data_skb; goto free_data_skb;
}
ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev, ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev,
data_sync_bufs[index]. data_sync_bufs[index].
......
...@@ -3351,7 +3351,8 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah, ...@@ -3351,7 +3351,8 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah,
"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n", "Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
cptr, code, reference, length, major, minor); cptr, code, reference, length, major, minor);
if ((!AR_SREV_9485(ah) && length >= 1024) || if ((!AR_SREV_9485(ah) && length >= 1024) ||
(AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485)) { (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) ||
(length > cptr)) {
ath_dbg(common, EEPROM, "Skipping bad header\n"); ath_dbg(common, EEPROM, "Skipping bad header\n");
cptr -= COMP_HDR_LEN; cptr -= COMP_HDR_LEN;
continue; continue;
......
...@@ -1621,7 +1621,6 @@ static void ath9k_hw_apply_gpio_override(struct ath_hw *ah) ...@@ -1621,7 +1621,6 @@ static void ath9k_hw_apply_gpio_override(struct ath_hw *ah)
ath9k_hw_gpio_request_out(ah, i, NULL, ath9k_hw_gpio_request_out(ah, i, NULL,
AR_GPIO_OUTPUT_MUX_AS_OUTPUT); AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i))); ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i)));
ath9k_hw_gpio_free(ah, i);
} }
} }
...@@ -2728,14 +2727,17 @@ static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah, u32 gpio, u32 type) ...@@ -2728,14 +2727,17 @@ static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah, u32 gpio, u32 type)
static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out, static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out,
const char *label) const char *label)
{ {
int err;
if (ah->caps.gpio_requested & BIT(gpio)) if (ah->caps.gpio_requested & BIT(gpio))
return; return;
/* may be requested by BSP, free anyway */ err = gpio_request_one(gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label);
gpio_free(gpio); if (err) {
ath_err(ath9k_hw_common(ah), "request GPIO%d failed:%d\n",
if (gpio_request_one(gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label)) gpio, err);
return; return;
}
ah->caps.gpio_requested |= BIT(gpio); ah->caps.gpio_requested |= BIT(gpio);
} }
......
...@@ -408,13 +408,14 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) ...@@ -408,13 +408,14 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n", wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n",
ch); ch);
if (wcn->sw_scan_opchannel == ch) { if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) {
/* If channel is the initial operating channel, we may /* If channel is the initial operating channel, we may
* want to receive/transmit regular data packets, then * want to receive/transmit regular data packets, then
* simply stop the scan session and exit PS mode. * simply stop the scan session and exit PS mode.
*/ */
wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN,
wcn->sw_scan_vif); wcn->sw_scan_vif);
wcn->sw_scan_channel = 0;
} else if (wcn->sw_scan) { } else if (wcn->sw_scan) {
/* A scan is ongoing, do not change the operating /* A scan is ongoing, do not change the operating
* channel, but start a scan session on the channel. * channel, but start a scan session on the channel.
...@@ -422,6 +423,7 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) ...@@ -422,6 +423,7 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN, wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN,
wcn->sw_scan_vif); wcn->sw_scan_vif);
wcn36xx_smd_start_scan(wcn, ch); wcn36xx_smd_start_scan(wcn, ch);
wcn->sw_scan_channel = ch;
} else { } else {
wcn36xx_change_opchannel(wcn, ch); wcn36xx_change_opchannel(wcn, ch);
} }
...@@ -702,6 +704,7 @@ static void wcn36xx_sw_scan_start(struct ieee80211_hw *hw, ...@@ -702,6 +704,7 @@ static void wcn36xx_sw_scan_start(struct ieee80211_hw *hw,
wcn->sw_scan = true; wcn->sw_scan = true;
wcn->sw_scan_vif = vif; wcn->sw_scan_vif = vif;
wcn->sw_scan_channel = 0;
if (vif_priv->sta_assoc) if (vif_priv->sta_assoc)
wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn);
else else
...@@ -1500,6 +1503,13 @@ static int wcn36xx_probe(struct platform_device *pdev) ...@@ -1500,6 +1503,13 @@ static int wcn36xx_probe(struct platform_device *pdev)
goto out_wq; goto out_wq;
} }
wcn->nv_file = WLAN_NV_FILE;
ret = of_property_read_string(wcn->dev->parent->of_node, "firmware-name", &wcn->nv_file);
if (ret < 0 && ret != -EINVAL) {
wcn36xx_err("failed to read \"firmware-name\" property: %d\n", ret);
goto out_wq;
}
wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw); wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw);
if (IS_ERR(wcn->smd_channel)) { if (IS_ERR(wcn->smd_channel)) {
wcn36xx_err("failed to open WLAN_CTRL channel\n"); wcn36xx_err("failed to open WLAN_CTRL channel\n");
......
...@@ -504,10 +504,10 @@ int wcn36xx_smd_load_nv(struct wcn36xx *wcn) ...@@ -504,10 +504,10 @@ int wcn36xx_smd_load_nv(struct wcn36xx *wcn)
u16 fm_offset = 0; u16 fm_offset = 0;
if (!wcn->nv) { if (!wcn->nv) {
ret = request_firmware(&wcn->nv, WLAN_NV_FILE, wcn->dev); ret = request_firmware(&wcn->nv, wcn->nv_file, wcn->dev);
if (ret) { if (ret) {
wcn36xx_err("Failed to load nv file %s: %d\n", wcn36xx_err("Failed to load nv file %s: %d\n",
WLAN_NV_FILE, ret); wcn->nv_file, ret);
goto out; goto out;
} }
} }
......
...@@ -287,6 +287,10 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) ...@@ -287,6 +287,10 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb)
status.rate_idx = 0; status.rate_idx = 0;
} }
if (ieee80211_is_beacon(hdr->frame_control) ||
ieee80211_is_probe_resp(hdr->frame_control))
status.boottime_ns = ktime_get_boottime_ns();
memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status)); memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
if (ieee80211_is_beacon(hdr->frame_control)) { if (ieee80211_is_beacon(hdr->frame_control)) {
......
...@@ -199,6 +199,7 @@ struct wcn36xx { ...@@ -199,6 +199,7 @@ struct wcn36xx {
struct device *dev; struct device *dev;
struct list_head vif_list; struct list_head vif_list;
const char *nv_file;
const struct firmware *nv; const struct firmware *nv;
u8 fw_revision; u8 fw_revision;
...@@ -246,6 +247,7 @@ struct wcn36xx { ...@@ -246,6 +247,7 @@ struct wcn36xx {
struct cfg80211_scan_request *scan_req; struct cfg80211_scan_request *scan_req;
bool sw_scan; bool sw_scan;
u8 sw_scan_opchannel; u8 sw_scan_opchannel;
u8 sw_scan_channel;
struct ieee80211_vif *sw_scan_vif; struct ieee80211_vif *sw_scan_vif;
struct mutex scan_lock; struct mutex scan_lock;
bool scan_aborted; bool scan_aborted;
......
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