diff --git a/patches/4.18/0008-wifi.patch b/patches/4.18/0008-wifi.patch index 01d31b3ca..41e7e0af2 100644 --- a/patches/4.18/0008-wifi.patch +++ b/patches/4.18/0008-wifi.patch @@ -1,16 +1,231 @@ -From fcdceb24f246ff4ffebfcced57e8c10d332a2a0c Mon Sep 17 00:00:00 2001 -From: qzed -Date: Mon, 24 Dec 2018 14:21:12 +0100 -Subject: [PATCH 8/8] wifi - ---- - scripts/leaking_addresses.pl | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - mode change 100755 => 100644 scripts/leaking_addresses.pl - diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl old mode 100755 new mode 100644 -- 2.20.1 - +diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c +index 042a1d07f686..fc9041f58e9f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c ++++ b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c +@@ -200,8 +200,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, + + do { + /* Check if AMSDU can accommodate this MSDU */ +- if ((skb_aggr->len + skb_src->len + LLC_SNAP_LEN) > +- adapter->tx_buf_size) ++ if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN)) + break; + + 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 4b5ae9098504..754c6f755c7b 100644 +--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c ++++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c +@@ -428,7 +428,10 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy, + mwifiex_dbg(priv->adapter, INFO, + "info: ignore timeout value for IEEE Power Save\n"); + +- ps_mode = enabled; ++ //ps_mode = enabled; ++ ++ mwifiex_dbg(priv->adapter, INFO, "overriding ps_mode to false\n"); ++ ps_mode = 0; + + return mwifiex_drv_set_power(priv, &ps_mode); + } +diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c +index 9cfcdf6bec52..45a04eb66bc6 100644 +--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c ++++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c +@@ -997,6 +997,7 @@ mwifiex_cmd_timeout_func(struct timer_list *t) + if (cmd_node->wait_q_enabled) { + adapter->cmd_wait_q.status = -ETIMEDOUT; + mwifiex_cancel_pending_ioctl(adapter); ++ adapter->cmd_sent = false; + } + } + if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) { +diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c +index 510f6b8e717d..a8a030496a36 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,6 +195,7 @@ 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 { +@@ -199,6 +203,7 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) + 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 +225,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,11 +293,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) && + (adapter->pm_wakeup_card_req && +diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index 69ac0a22c28c..14088344f7a1 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.h ++++ b/drivers/net/wireless/marvell/mwifiex/main.h +@@ -903,6 +903,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 */ +@@ -1693,6 +1694,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter); + void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags); + void mwifiex_fw_dump_event(struct mwifiex_private *priv); + 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 0c42b7296ddd..1e471ed0de8b 100644 +--- a/drivers/net/wireless/marvell/mwifiex/pcie.c ++++ b/drivers/net/wireless/marvell/mwifiex/pcie.c +@@ -1743,6 +1743,15 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) + } + + rx_len = get_unaligned_le16(skb->data); ++ ++ if (rx_len == 0) { ++ mwifiex_dbg(adapter, ERROR, ++ "0 byte cmdrsp\n"); ++ mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, ++ PCI_DMA_FROMDEVICE); ++ return 0; ++ } ++ + skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len); + skb_trim(skb, rx_len); + +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c +index 4ed10cf82f9a..f17af83f5669 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c +@@ -2339,7 +2339,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init) + if (ret) + return -1; + +- if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { ++ if (0 && priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { + /* Enable IEEE PS by default */ + priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP; + ret = mwifiex_send_cmd(priv, +@@ -2362,8 +2362,8 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init) + return -1; + } + +- mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG, +- HostCmd_ACT_GEN_GET, 0, NULL, true); ++ //mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG, ++ // HostCmd_ACT_GEN_GET, 0, NULL, true); + } + + /* get tx rate */ +@@ -2395,7 +2395,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init) + if (ret) + return -1; + +- if (!disable_auto_ds && first_sta && ++ if (0 && !disable_auto_ds && first_sta && + priv->bss_type != MWIFIEX_BSS_TYPE_UAP) { + /* 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 69e3b624adbb..884bad677cc3 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, + struct host_cmd_ds_802_11_ps_mode_enh *pm; + unsigned long flags; + +- mwifiex_dbg(adapter, ERROR, +- "CMD_RESP: cmd %#x error, result=%#x\n", +- resp->command, resp->result); ++ if (resp->command == 271 && resp->result == 2){ ++ // ignore this command as the firmware does not support it ++ } ++ else { ++ mwifiex_dbg(adapter, ERROR, ++ "CMD_RESP: cmd %#x error, result=%#x\n", ++ resp->command, resp->result); ++ } + + 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 88f4c89f89ba..4f740f6feec4 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,