diff options
Diffstat (limited to '0003-wifi.patch')
-rw-r--r-- | 0003-wifi.patch | 288 |
1 files changed, 245 insertions, 43 deletions
diff --git a/0003-wifi.patch b/0003-wifi.patch index e81ecef37277..587d799ea142 100644 --- a/0003-wifi.patch +++ b/0003-wifi.patch @@ -1,60 +1,98 @@ -diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c -index 025bc06a..07bdf271 100644 ---- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c -+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c -@@ -418,6 +418,9 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy, - - ps_mode = enabled; - -+ mwifiex_dbg(priv->adapter, ERROR, "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/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c -index 83916c14..b47def60 100644 ---- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c -+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c -@@ -2308,7 +2308,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, -@@ -2364,7 +2364,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/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c +index 05dca3e..59c2fcc 100644 +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = { + .driver_info = 0, + }, + +-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- + /* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ + { + USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM, +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index d51d9ab..b94ebe9 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -5310,7 +5310,6 @@ static const struct usb_device_id rtl8152_table[] = { + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)}, + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)}, + {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)}, +- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)}, + {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)}, diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c -index a75013ac..448ba72d 100644 +index 042a1d0..fc9041f 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 32c5074..33a7325 100644 +--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c ++++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c +@@ -2503,6 +2503,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 +2530,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/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index a76bd79..a34de85 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]; + }; + + diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c -index ac62bce5..293607e6 100644 +index cd31494..3f2a881 100644 --- a/drivers/net/wireless/marvell/mwifiex/pcie.c +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c -@@ -1716,6 +1716,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); + + @@ -68,4 +106,168 @@ index ac62bce5..293607e6 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) + + 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/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c +index fb09014..db03c6b 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c +@@ -2336,8 +2336,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 */ +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +index 0fba5b1..4e1687f 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/net/wireless/sme.c b/net/wireless/sme.c +index 3dd05a0..ab32ef1 100644 +--- a/net/wireless/sme.c ++++ b/net/wireless/sme.c +@@ -690,6 +690,11 @@ void __cfg80211_connect_result(struct net_device *dev, + return; + } + ++ if (WARN_ON(!wdev->ssid_len)) { ++ cfg80211_put_bss(wdev->wiphy, cr->bss); ++ return; ++ } ++ + 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, + /* + * If we have an ssid_len, we're trying to connect or are + * already connected, so reject a new SSID unless it's the +- * same (which is the case for re-association.) ++ * same (which is the case for Re-Association. + */ + if (wdev->ssid_len && + (wdev->ssid_len != connect->ssid_len || +diff --git b/net/wireless/sme.c.rej b/net/wireless/sme.c.rej +new file mode 100644 +index 0000000..e78d68c +--- /dev/null ++++ b/net/wireless/sme.c.rej +@@ -0,0 +1,82 @@ ++--- net/wireless/sme.c +++++ net/wireless/sme.c ++@@ -522,11 +522,6 @@ static int cfg80211_sme_connect(struct wireless_dev *wdev, ++ return -EOPNOTSUPP; ++ ++ if (wdev->current_bss) { ++- if (!prev_bssid) ++- return -EALREADY; ++- if (prev_bssid && ++- !ether_addr_equal(prev_bssid, wdev->current_bss->pub.bssid)) ++- return -ENOTCONN; ++ cfg80211_unhold_bss(wdev->current_bss); ++ cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); ++ wdev->current_bss = NULL; ++@@ -1063,11 +1058,35 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev, ++ ++ ASSERT_WDEV_LOCK(wdev); ++ ++- if (WARN_ON(wdev->connect_keys)) { ++- kzfree(wdev->connect_keys); ++- wdev->connect_keys = NULL; +++ /* +++ * If we have an ssid_len, we're trying to connect or are +++ * already connected, so reject a new SSID unless it's the +++ * same (which is the case for re-association.) +++ */ +++ if (wdev->ssid_len && +++ (wdev->ssid_len != connect->ssid_len || +++ memcmp(wdev->ssid, connect->ssid, wdev->ssid_len))) +++ return -EALREADY; +++ +++ /* +++ * If connected, reject (re-)association unless prev_bssid +++ * matches the current BSSID. +++ */ +++ if (wdev->current_bss) { +++ if (!prev_bssid) +++ return -EALREADY; +++ if (!ether_addr_equal(prev_bssid, wdev->current_bss->pub.bssid)) +++ return -ENOTCONN; ++ } ++ +++ /* +++ * Reject if we're in the process of connecting with WEP, +++ * this case isn't very interesting and trying to handle +++ * it would make the code much more complex. +++ */ +++ if (wdev->connect_keys) +++ return -EINPROGRESS; +++ ++ cfg80211_oper_and_ht_capa(&connect->ht_capa_mask, ++ rdev->wiphy.ht_capa_mod_mask); ++ ++@@ -1118,7 +1137,12 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev, ++ ++ if (err) { ++ wdev->connect_keys = NULL; ++- wdev->ssid_len = 0; +++ /* +++ * This could be reassoc getting refused, don't clear +++ * ssid_len in that case. +++ */ +++ if (!wdev->current_bss) +++ wdev->ssid_len = 0; ++ return err; ++ } ++ ++@@ -1145,6 +1169,14 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev, ++ else if (wdev->ssid_len) ++ err = rdev_disconnect(rdev, dev, reason); ++ +++ /* +++ * Clear ssid_len unless we actually were fully connected, +++ * in which case cfg80211_disconnected() will take care of +++ * this later. +++ */ +++ if (!wdev->current_bss) +++ wdev->ssid_len = 0; +++ ++ return err; ++ } ++ |