diff --git a/patches-4.14/wifi.patch b/patches-4.14/wifi.patch index ea070de49..b06740540 100644 --- a/patches-4.14/wifi.patch +++ b/patches-4.14/wifi.patch @@ -1,6 +1,6 @@ -From 1126c7e788d3295e2f98d40662edf22155633267 Mon Sep 17 00:00:00 2001 +From a359b5adc91cb9f2d3cc07705d804ef60bf6e4e3 Mon Sep 17 00:00:00 2001 From: Jake Day -Date: Thu, 1 Feb 2018 19:23:39 -0500 +Date: Fri, 2 Feb 2018 12:57:32 -0500 Subject: fixes for marvell mwifiex @@ -19,7 +19,7 @@ index 042a1d0..fc9041f 100644 skb_src = skb_dequeue(&pra_list->skb_head); diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c -index 32c5074..4160551 100644 +index 6e0d9a9..d008687 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -416,6 +416,9 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy, @@ -32,39 +32,11 @@ index 32c5074..4160551 100644 return mwifiex_drv_set_power(priv, &ps_mode); } -@@ -2503,6 +2506,7 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, - struct ieee80211_channel *chan; - struct ieee_types_header *ie; - struct mwifiex_user_scan_cfg *user_scan_cfg; -+ u8 mac_addr[ETH_ALEN]; - - mwifiex_dbg(priv->adapter, CMD, - "info: received scan request on %s\n", dev->name); -@@ -2529,15 +2533,10 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, - priv->scan_request = request; - - if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { -- ether_addr_copy(priv->random_mac, request->mac_addr); -- for (i = 0; i < ETH_ALEN; i++) { -- priv->random_mac[i] &= request->mac_addr_mask[i]; -- priv->random_mac[i] |= get_random_int() & -- ~(request->mac_addr_mask[i]); -- } -- ether_addr_copy(user_scan_cfg->random_mac, priv->random_mac); -- } else { -- eth_zero_addr(priv->random_mac); -+ get_random_mask_addr(mac_addr, request->mac_addr, -+ request->mac_addr_mask); -+ ether_addr_copy(request->mac_addr, mac_addr); -+ ether_addr_copy(user_scan_cfg->random_mac, mac_addr); - } - - user_scan_cfg->num_ssids = request->n_ssids; diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c -index e11919d..7f41cf8 100644 +index e1aa860..328829b 100644 --- a/drivers/net/wireless/marvell/mwifiex/init.c +++ b/drivers/net/wireless/marvell/mwifiex/init.c -@@ -60,7 +60,7 @@ static void wakeup_timer_fn(unsigned long data) +@@ -60,7 +60,7 @@ static void wakeup_timer_fn(struct timer_list *t) adapter->hw_status = MWIFIEX_HW_STATUS_RESET; mwifiex_cancel_all_pending_cmd(adapter); @@ -73,32 +45,106 @@ index e11919d..7f41cf8 100644 adapter->if_ops.card_reset(adapter); } +diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c +index a96bd7e..79b026f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.c ++++ b/drivers/net/wireless/marvell/mwifiex/main.c +@@ -163,6 +163,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter) + spin_lock_irqsave(&adapter->main_proc_lock, flags); + if (adapter->mwifiex_processing) { + adapter->more_task_flag = true; ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); + } else { + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); +@@ -171,18 +172,20 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter) + } + EXPORT_SYMBOL_GPL(mwifiex_queue_main_work); + +-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter) ++void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter) + { + unsigned long flags; + + spin_lock_irqsave(&adapter->rx_proc_lock, flags); + if (adapter->rx_processing) { ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + } else { + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + queue_work(adapter->rx_workqueue, &adapter->rx_work); + } + } ++EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work); + + static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + { +@@ -192,13 +195,14 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + + spin_lock_irqsave(&adapter->rx_proc_lock, flags); + if (adapter->rx_processing || adapter->rx_locked) { ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + goto exit_rx_proc; + } else { + adapter->rx_processing = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + } +- ++rx_process_start: + /* Check for Rx data */ + while ((skb = skb_dequeue(&adapter->rx_data_q))) { + atomic_dec(&adapter->rx_pending); +@@ -220,6 +224,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + } + } + spin_lock_irqsave(&adapter->rx_proc_lock, flags); ++ if (adapter->more_rx_task_flag) { ++ adapter->more_rx_task_flag = false; ++ spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); ++ goto rx_process_start; ++ } + adapter->rx_processing = false; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + +@@ -283,10 +292,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) + mwifiex_process_hs_config(adapter); + if (adapter->if_ops.process_int_status) + adapter->if_ops.process_int_status(adapter); ++ if (adapter->rx_work_enabled && adapter->data_received) ++ mwifiex_queue_rx_work(adapter); + } + +- if (adapter->rx_work_enabled && adapter->data_received) +- mwifiex_queue_rx_work(adapter); + + /* Need to wake up the card ? */ + if ((adapter->ps_state == PS_STATE_SLEEP) && diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h -index a76bd79..a34de85 100644 +index 154c079..4205344 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h -@@ -680,7 +680,6 @@ struct mwifiex_private { - struct mwifiex_user_scan_chan hidden_chan[MWIFIEX_USER_SCAN_CHAN_MAX]; - u8 assoc_resp_ht_param; - bool ht_param_present; -- u8 random_mac[ETH_ALEN]; - }; - - +@@ -889,6 +889,7 @@ struct mwifiex_adapter { + spinlock_t main_proc_lock; + u32 mwifiex_processing; + u8 more_task_flag; ++ u8 more_rx_task_flag; + u16 tx_buf_size; + u16 curr_tx_buf_size; + /* sdio single port rx aggregation capability */ +@@ -1661,6 +1662,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter, void *drv_info, + int drv_info_size); + void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags); + void mwifiex_queue_main_work(struct mwifiex_adapter *adapter); ++void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter); + int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action, + int cmd_type, + struct mwifiex_ds_wakeup_reason *wakeup_reason); diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c -index cd31494..50df1c0 100644 +index cd31494..575da92 100644 --- a/drivers/net/wireless/marvell/mwifiex/pcie.c +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c -@@ -310,6 +310,8 @@ static void mwifiex_pcie_remove(struct pci_dev *pdev) - mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN); - } - -+ cancel_work_sync(&card->work); -+ - mwifiex_remove_card(adapter); - } - -@@ -1729,6 +1731,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) +@@ -1729,6 +1729,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) } rx_len = get_unaligned_le16(skb->data); @@ -115,33 +161,15 @@ index cd31494..50df1c0 100644 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len); skb_trim(skb, rx_len); -diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c -index c9d41ed..cddf412 100644 ---- a/drivers/net/wireless/marvell/mwifiex/scan.c -+++ b/drivers/net/wireless/marvell/mwifiex/scan.c -@@ -1948,7 +1948,8 @@ mwifiex_active_scan_req_for_passive_chan(struct mwifiex_private *priv) +@@ -2781,7 +2791,7 @@ static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter) + { + struct pcie_service_card *card = adapter->card; - adapter->active_scan_triggered = true; - if (priv->scan_request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) -- ether_addr_copy(user_scan_cfg->random_mac, priv->random_mac); -+ ether_addr_copy(user_scan_cfg->random_mac, -+ priv->scan_request->mac_addr); - user_scan_cfg->num_ssids = priv->scan_request->n_ssids; - user_scan_cfg->ssid_list = priv->scan_request->ssids; - -diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c -index fd5183c..832824a 100644 ---- a/drivers/net/wireless/marvell/mwifiex/sdio.c -+++ b/drivers/net/wireless/marvell/mwifiex/sdio.c -@@ -399,6 +399,8 @@ mwifiex_sdio_remove(struct sdio_func *func) - mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN); - } - -+ cancel_work_sync(&card->work); -+ - mwifiex_remove_card(adapter); +- pci_reset_function(card->dev); ++ pci_try_reset_function(card->dev); } + static void mwifiex_pcie_work(struct work_struct *work) diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c index fb09014..5b8329e 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c @@ -176,7 +204,7 @@ index fb09014..5b8329e 100644 /* Enable auto deep sleep */ auto_ds.auto_ds = DEEP_SLEEP_ON; diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c -index 0fba5b1..4e1687f 100644 +index 1bd4e13..27d2bac 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c @@ -48,9 +48,14 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv, @@ -197,8 +225,21 @@ index 0fba5b1..4e1687f 100644 if (adapter->curr_cmd->wait_q_enabled) adapter->cmd_wait_q.status = -1; +diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c +index 4bc2448..d20fda1 100644 +--- a/drivers/net/wireless/marvell/mwifiex/usb.c ++++ b/drivers/net/wireless/marvell/mwifiex/usb.c +@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, + skb_queue_tail(&adapter->rx_data_q, skb); + adapter->data_received = true; + atomic_inc(&adapter->rx_pending); ++ if (adapter->rx_work_enabled) ++ mwifiex_queue_rx_work(adapter); + break; + default: + mwifiex_dbg(adapter, ERROR, diff --git a/net/wireless/sme.c b/net/wireless/sme.c -index 3dd05a0..ab32ef1 100644 +index fdb3646..b44b23b 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -690,6 +690,11 @@ void __cfg80211_connect_result(struct net_device *dev, @@ -213,7 +254,7 @@ index 3dd05a0..ab32ef1 100644 nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr, GFP_KERNEL); -@@ -1062,7 +1067,7 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev, +@@ -1105,7 +1110,7 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev, /* * If we have an ssid_len, we're trying to connect or are * already connected, so reject a new SSID unless it's the diff --git a/patches-4.15/wifi.patch b/patches-4.15/wifi.patch index 196ac089e..b06740540 100644 --- a/patches-4.15/wifi.patch +++ b/patches-4.15/wifi.patch @@ -45,20 +45,106 @@ index e1aa860..328829b 100644 adapter->if_ops.card_reset(adapter); } +diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c +index a96bd7e..79b026f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.c ++++ b/drivers/net/wireless/marvell/mwifiex/main.c +@@ -163,6 +163,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter) + spin_lock_irqsave(&adapter->main_proc_lock, flags); + if (adapter->mwifiex_processing) { + adapter->more_task_flag = true; ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); + } else { + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); +@@ -171,18 +172,20 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter) + } + EXPORT_SYMBOL_GPL(mwifiex_queue_main_work); + +-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter) ++void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter) + { + unsigned long flags; + + spin_lock_irqsave(&adapter->rx_proc_lock, flags); + if (adapter->rx_processing) { ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + } else { + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + queue_work(adapter->rx_workqueue, &adapter->rx_work); + } + } ++EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work); + + static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + { +@@ -192,13 +195,14 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + + spin_lock_irqsave(&adapter->rx_proc_lock, flags); + if (adapter->rx_processing || adapter->rx_locked) { ++ adapter->more_rx_task_flag = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + goto exit_rx_proc; + } else { + adapter->rx_processing = true; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + } +- ++rx_process_start: + /* Check for Rx data */ + while ((skb = skb_dequeue(&adapter->rx_data_q))) { + atomic_dec(&adapter->rx_pending); +@@ -220,6 +224,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + } + } + spin_lock_irqsave(&adapter->rx_proc_lock, flags); ++ if (adapter->more_rx_task_flag) { ++ adapter->more_rx_task_flag = false; ++ spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); ++ goto rx_process_start; ++ } + adapter->rx_processing = false; + spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); + +@@ -283,10 +292,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) + mwifiex_process_hs_config(adapter); + if (adapter->if_ops.process_int_status) + adapter->if_ops.process_int_status(adapter); ++ if (adapter->rx_work_enabled && adapter->data_received) ++ mwifiex_queue_rx_work(adapter); + } + +- if (adapter->rx_work_enabled && adapter->data_received) +- mwifiex_queue_rx_work(adapter); + + /* Need to wake up the card ? */ + if ((adapter->ps_state == PS_STATE_SLEEP) && +diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index 154c079..4205344 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.h ++++ b/drivers/net/wireless/marvell/mwifiex/main.h +@@ -889,6 +889,7 @@ struct mwifiex_adapter { + spinlock_t main_proc_lock; + u32 mwifiex_processing; + u8 more_task_flag; ++ u8 more_rx_task_flag; + u16 tx_buf_size; + u16 curr_tx_buf_size; + /* sdio single port rx aggregation capability */ +@@ -1661,6 +1662,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter, void *drv_info, + int drv_info_size); + void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags); + void mwifiex_queue_main_work(struct mwifiex_adapter *adapter); ++void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter); + int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action, + int cmd_type, + struct mwifiex_ds_wakeup_reason *wakeup_reason); diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c -index cd31494..50df1c0 100644 +index cd31494..575da92 100644 --- a/drivers/net/wireless/marvell/mwifiex/pcie.c +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c -@@ -310,6 +310,8 @@ static void mwifiex_pcie_remove(struct pci_dev *pdev) - mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN); - } - -+ cancel_work_sync(&card->work); -+ - mwifiex_remove_card(adapter); - } - -@@ -1729,6 +1731,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) +@@ -1729,6 +1729,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) } rx_len = get_unaligned_le16(skb->data); @@ -75,19 +161,15 @@ index cd31494..50df1c0 100644 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len); skb_trim(skb, rx_len); -diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c -index fd5183c..832824a 100644 ---- a/drivers/net/wireless/marvell/mwifiex/sdio.c -+++ b/drivers/net/wireless/marvell/mwifiex/sdio.c -@@ -399,6 +399,8 @@ mwifiex_sdio_remove(struct sdio_func *func) - mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN); - } +@@ -2781,7 +2791,7 @@ static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter) + { + struct pcie_service_card *card = adapter->card; -+ cancel_work_sync(&card->work); -+ - mwifiex_remove_card(adapter); +- pci_reset_function(card->dev); ++ pci_try_reset_function(card->dev); } + static void mwifiex_pcie_work(struct work_struct *work) diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c index fb09014..5b8329e 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c @@ -143,6 +225,19 @@ index 1bd4e13..27d2bac 100644 if (adapter->curr_cmd->wait_q_enabled) adapter->cmd_wait_q.status = -1; +diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c +index 4bc2448..d20fda1 100644 +--- a/drivers/net/wireless/marvell/mwifiex/usb.c ++++ b/drivers/net/wireless/marvell/mwifiex/usb.c +@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, + skb_queue_tail(&adapter->rx_data_q, skb); + adapter->data_received = true; + atomic_inc(&adapter->rx_pending); ++ if (adapter->rx_work_enabled) ++ mwifiex_queue_rx_work(adapter); + break; + default: + mwifiex_dbg(adapter, ERROR, diff --git a/net/wireless/sme.c b/net/wireless/sme.c index fdb3646..b44b23b 100644 --- a/net/wireless/sme.c