mirror of
https://gitlab.com/nonguix/nonguix.git
synced 2024-11-25 09:58:09 +01:00
nongnu: broadcom-sta: Use Nixpkgs patch list.
Piggy-back off of the patch list in Nixpkgs instead of maintaining our own. This should make it easier to keep up to date so there's no need to advise users to stick with Linux LTS releases any longer. Though our existing patch list and Nixpkgs' differ the cumulative effect is exactly the same except for two patches we have that Nix doesn't, neither of which seem critical: - broadcom-sta-debian-fix-kernel-warnings.patch - broadcom-sta-fix_mac_profile_discrepancy.patch Closes #246 * nongnu/packages/linux.scm (broadcom-sta): Replace patches with code to fetch them from Nixpkgs. [arguments]: Replace `linux-lts` with `linux`. [description]: Remove Linux LTS recommendation. * nongnu/packages/patches/broadcom-sta-debian-fix-kernel-warnings.patch: Remove. * nongnu/packages/patches/broadcom-sta-fix_mac_profile_discrepancy.patch: Remove. * nongnu/packages/patches/broadcom-sta-gcc.patch: Remove. * nongnu/packages/patches/broadcom-sta-license.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-4.11.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-4.12.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-4.15.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-4.7.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-4.8.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-5.1.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-5.10.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-5.6.patch: Remove. * nongnu/packages/patches/broadcom-sta-linux-5.9.patch: Remove. * nongnu/packages/patches/broadcom-sta-null-pointer-fix.patch: Remove. * nongnu/packages/patches/broadcom-sta-rdtscl.patch: Remove. * README.org (Broadcom Wireless): Removed recommendation from Broadcom Wireless section. Signed-off-by: Jonathan Brielmaier <jonathan.brielmaier@web.de>
This commit is contained in:
parent
213be7ee66
commit
76a3478239
17 changed files with 41 additions and 963 deletions
|
@ -177,14 +177,13 @@ is exactly equivalent to:
|
|||
|
||||
Some Broadcom wireless hardware requires a proprietary kernel module in
|
||||
addition to firmware. To use such hardware you will also need to add a service
|
||||
to load that module on boot, blacklist conflicting kernel modules, and while not
|
||||
required, it is recommended to stay with Linux LTS releases:
|
||||
to load that module on boot and blacklist conflicting kernel modules:
|
||||
|
||||
#+BEGIN_SRC scheme
|
||||
(use-modules (nongnu packages linux))
|
||||
|
||||
(operating-system
|
||||
(kernel linux-lts)
|
||||
(kernel linux)
|
||||
;; Blacklist conflicting kernel modules.
|
||||
(kernel-arguments '("modprobe.blacklist=b43,b43legacy,ssb,bcm43xx,brcm80211,brcmfmac,brcmsmac,bcma"))
|
||||
(kernel-loadable-modules (list broadcom-sta))
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
;;; Copyright © 2022 Remco van 't Veer <remco@remworks.net>
|
||||
;;; Copyright © 2022 Simen Endsjø <simendsjo@gmail.com>
|
||||
;;; Copyright © 2022 Leo Famulari <leo@famulari.name>
|
||||
;;; Copyright © 2023 Krzysztof Baranowski <pharcosyle@gmail.com>
|
||||
;;; Copyright © 2023 Morgan Smith <Morgan.J.Smith@outlook.com>
|
||||
;;; Copyright © 2023 Jelle Licht <jlicht@fsfe.org>
|
||||
|
||||
|
@ -728,6 +729,18 @@ giving you trouble, you can try this module.")
|
|||
|
||||
(define broadcom-sta-version "6.30.223.271")
|
||||
|
||||
(define (broadcom-sta-patch name commit hash)
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "https://raw.githubusercontent.com/NixOS/nixpkgs/"
|
||||
commit
|
||||
"/pkgs/os-specific/linux/broadcom-sta/"
|
||||
name
|
||||
".patch"))
|
||||
(sha256
|
||||
(base32
|
||||
hash))))
|
||||
|
||||
(define broadcom-sta-x86_64-source
|
||||
(origin
|
||||
(method url-fetch/tarbomb)
|
||||
|
@ -736,29 +749,30 @@ giving you trouble, you can try this module.")
|
|||
(string-replace-substring broadcom-sta-version "." "_")
|
||||
".tar.gz"))
|
||||
(patches
|
||||
(parameterize
|
||||
((%patch-path
|
||||
(map (lambda (directory)
|
||||
(string-append directory "/nongnu/packages/patches"))
|
||||
%load-path)))
|
||||
;; https://github.com/NixOS/nixpkgs/tree/master/pkgs/os-specific/linux/broadcom-sta
|
||||
;; https://git.archlinux.org/svntogit/community.git/tree/trunk?h=packages/broadcom-wl-dkms
|
||||
(search-patches "broadcom-sta-gcc.patch"
|
||||
"broadcom-sta-license.patch"
|
||||
"broadcom-sta-null-pointer-fix.patch"
|
||||
"broadcom-sta-rdtscl.patch"
|
||||
"broadcom-sta-linux-4.7.patch"
|
||||
"broadcom-sta-linux-4.8.patch"
|
||||
"broadcom-sta-debian-fix-kernel-warnings.patch"
|
||||
"broadcom-sta-linux-4.11.patch"
|
||||
"broadcom-sta-linux-4.12.patch"
|
||||
"broadcom-sta-linux-4.15.patch"
|
||||
"broadcom-sta-fix_mac_profile_discrepancy.patch"
|
||||
"broadcom-sta-linux-5.1.patch"
|
||||
;; source: https://github.com/NixOS/nixpkgs/commit/8ce65087c333097ab714d23800b69fc471ec48ca
|
||||
"broadcom-sta-linux-5.6.patch"
|
||||
"broadcom-sta-linux-5.9.patch"
|
||||
"broadcom-sta-linux-5.10.patch")))
|
||||
;; Keep these in sync with the list at
|
||||
;; https://github.com/NixOS/nixpkgs/tree/master/pkgs/os-specific/linux/broadcom-sta.
|
||||
;; Nixpkgs is good about keeping broadcom patches up to date so updating
|
||||
;; for a new kernel release should be as simple as chaging the commit to
|
||||
;; the newest available and adding any new patches.
|
||||
(let ((commit "355042e2ff5933b245e804c5eaff4ec3f340e71b"))
|
||||
(list
|
||||
(broadcom-sta-patch "i686-build-failure" commit "1522w2gb698svlkb2b4lijbd740agvs2ibpz4g0jlv8v31cybkf4")
|
||||
(broadcom-sta-patch "license" commit "0rwlhafcmpp97cknqwv8gwf8sbxgqavgci1ywfkdxiylh4mhcvhr")
|
||||
(broadcom-sta-patch "linux-4.7" commit "1nn1p6j77s9zfpxy5gl6qg1kha45pc7ww0yfkn5dmhazi288wamf")
|
||||
(broadcom-sta-patch "linux-4.8" commit "0bjx4ayi30jbdm3sh38p52d6dnb3c44mqzqi8g51hhbn1kghkmq9")
|
||||
(broadcom-sta-patch "linux-4.11" commit "1s3n87v9cn3qicd5v4wzj20psl4gcn1ghz0fnsq60n05rriicywp")
|
||||
(broadcom-sta-patch "linux-4.12" commit "1kj7sfnw9hxjxzqm48565vniq7fkhapaqadfpw6l9bcnpf53xld3")
|
||||
(broadcom-sta-patch "linux-4.15" commit "0bvk7nrvqa066dpn6vvb6x00yrxa37iqv87135kay9mllmkjd70b")
|
||||
(broadcom-sta-patch "linux-5.1" commit "1kykpzhs19dwww6grav3qxsd28kn8y84i4b4csx2y5m2j629ncn0")
|
||||
(broadcom-sta-patch "linux-5.6" commit "0v1jkaf60jgjkrjfcmx1gin4b65cdv39glqy7l3cswkmzb60lz4l")
|
||||
(broadcom-sta-patch "linux-5.9" commit "1sgmbaahydk4j3i1jf8q1fz3a210fmakrpz0w1n9v3dcn23ladah")
|
||||
(broadcom-sta-patch "linux-5.17" commit "1qsllvykhs3nvjwv8d6bgsm2sc9a1lxf8yqf6fa99p60ggd253ps")
|
||||
(broadcom-sta-patch "linux-5.18" commit "1img0a0vqnkmq4c21aywq2ajyigzcfhbbpg1hw9nx7cbj9hf6d0l")
|
||||
(broadcom-sta-patch "linux-6.0" commit "0rv74j5giafzl19f01yvfa5rgvsdvcimxzhks2fp44wpnxq241nb")
|
||||
(broadcom-sta-patch "linux-6.1" commit "1pvx1h7iimcbfqdc13n1980ngxk9q6iyip8svn293x4h7jn472kf")
|
||||
(broadcom-sta-patch "pedantic-fix" commit "1kxmw1iyxnfwad75h981sak5qk16p81xy1f2qxss2d0v97vkfkl5")
|
||||
(broadcom-sta-patch "null-pointer-fix" commit "15c2vxgf7v5wy4s8w9jk7irf3fxxghy05gxmav1ss73a2azajdx7")
|
||||
(broadcom-sta-patch "gcc" commit "0jcqk2vapyy2pbsjv9n8b3qp6vqz17d6s07cr04cx7075q7yhz5h"))))
|
||||
(sha256
|
||||
(base32
|
||||
"1gj485qqr190idilacpxwgqyw21il03zph2rddizgj7fbd6pfyaz"))))
|
||||
|
@ -784,7 +798,7 @@ giving you trouble, you can try this module.")
|
|||
(_ broadcom-sta-i686-source)))
|
||||
(build-system linux-module-build-system)
|
||||
(arguments
|
||||
`(#:linux ,linux-lts
|
||||
`(#:linux ,linux
|
||||
#:tests? #f))
|
||||
(supported-systems '("i686-linux" "x86_64-linux"))
|
||||
(home-page "https://www.broadcom.com/support/802.11")
|
||||
|
@ -805,10 +819,7 @@ Linux device driver for the following chipsets:
|
|||
@item BCM4331
|
||||
@item BCM4352
|
||||
@item BCM4360
|
||||
@end itemize
|
||||
|
||||
It is recommended that anyone who uses this package stays with Linux LTS
|
||||
releases.")
|
||||
@end itemize")
|
||||
(license (nonfree "https://www.broadcom.com/support/802.11"))))
|
||||
|
||||
(define-public broadcom-bt-firmware
|
||||
|
|
|
@ -1,161 +0,0 @@
|
|||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -1968,7 +1968,7 @@
|
||||
|
||||
if (dtoh32(bi->length) > WL_BSS_INFO_MAX) {
|
||||
WL_DBG(("Beacon is larger than buffer. Discarding\n"));
|
||||
- return err;
|
||||
+ return -E2BIG;
|
||||
}
|
||||
notif_bss_info = kzalloc(sizeof(*notif_bss_info) + sizeof(*mgmt) - sizeof(u8) +
|
||||
WL_BSS_INFO_MAX, GFP_KERNEL);
|
||||
@@ -1992,9 +1992,15 @@
|
||||
beacon_proberesp->capab_info = cpu_to_le16(bi->capability);
|
||||
wl_rst_ie(wl);
|
||||
|
||||
- wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
|
||||
- wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
|
||||
+ err = wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
|
||||
+ if (err)
|
||||
+ goto inform_single_bss_out;
|
||||
+
|
||||
+ err = wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
|
||||
offsetof(struct wl_cfg80211_bss_info, frame_buf));
|
||||
+ if (err)
|
||||
+ goto inform_single_bss_out;
|
||||
+
|
||||
notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, u.beacon.variable) +
|
||||
wl_get_ielen(wl);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
|
||||
@@ -2006,14 +2012,14 @@
|
||||
#endif
|
||||
if (freq == 0) {
|
||||
WL_ERR(("Invalid channel, fail to chcnage channel to freq\n"));
|
||||
- kfree(notif_bss_info);
|
||||
- return -EINVAL;
|
||||
+ err = -EINVAL;
|
||||
+ goto inform_single_bss_out;
|
||||
}
|
||||
channel = ieee80211_get_channel(wiphy, freq);
|
||||
if (unlikely(!channel)) {
|
||||
WL_ERR(("ieee80211_get_channel error\n"));
|
||||
- kfree(notif_bss_info);
|
||||
- return -EINVAL;
|
||||
+ err = -EINVAL;
|
||||
+ goto inform_single_bss_out;
|
||||
}
|
||||
|
||||
WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x, bssid %pM\n",
|
||||
@@ -2021,28 +2027,37 @@
|
||||
mgmt->u.beacon.capab_info, &bi->BSSID));
|
||||
|
||||
signal = notif_bss_info->rssi * 100;
|
||||
- cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
|
||||
- le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
|
||||
- if (unlikely(!cbss)) {
|
||||
- WL_ERR(("cfg80211_inform_bss_frame error\n"));
|
||||
- kfree(notif_bss_info);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
|
||||
- notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
|
||||
- notify_ielen = le32_to_cpu(bi->ie_length);
|
||||
+ if (!wl->scan_request) {
|
||||
+ cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
|
||||
+ le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
|
||||
+ if (unlikely(!cbss)) {
|
||||
+ WL_ERR(("cfg80211_inform_bss_frame error\n"));
|
||||
+ err = -ENOMEM;
|
||||
+ goto inform_single_bss_out;
|
||||
+ }
|
||||
+ } else {
|
||||
+ notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
|
||||
+ notify_ielen = le32_to_cpu(bi->ie_length);
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
|
||||
- cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
|
||||
- 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
||||
- (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
||||
+ cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
|
||||
+ 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
||||
+ (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
||||
#else
|
||||
- cbss = cfg80211_inform_bss(wiphy, channel, CFG80211_BSS_FTYPE_UNKNOWN, (const u8 *)(bi->BSSID.octet),
|
||||
- 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
||||
- (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
||||
+ cbss = cfg80211_inform_bss(wiphy, channel,
|
||||
+ wl->active_scan ?
|
||||
+ CFG80211_BSS_FTYPE_PRESP : CFG80211_BSS_FTYPE_BEACON,
|
||||
+ (const u8 *)(bi->BSSID.octet), 0,
|
||||
+ beacon_proberesp->capab_info,
|
||||
+ beacon_proberesp->beacon_int,
|
||||
+ (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
||||
#endif
|
||||
-
|
||||
- if (unlikely(!cbss))
|
||||
- return -ENOMEM;
|
||||
+ if (unlikely(!cbss)) {
|
||||
+ WL_ERR(("cfg80211_inform_bss error\n"));
|
||||
+ err = -ENOMEM;
|
||||
+ goto inform_single_bss_out;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
cfg80211_put_bss(wiphy, cbss);
|
||||
@@ -2050,6 +2065,7 @@
|
||||
cfg80211_put_bss(cbss);
|
||||
#endif
|
||||
|
||||
+inform_single_bss_out:
|
||||
kfree(notif_bss_info);
|
||||
|
||||
return err;
|
||||
@@ -2316,6 +2332,9 @@
|
||||
if (err)
|
||||
goto update_bss_info_out;
|
||||
|
||||
+ bss = cfg80211_get_bss(wl_to_wiphy(wl), NULL, (s8 *)&wl->bssid,
|
||||
+ ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
|
||||
+
|
||||
ie = ((u8 *)bi) + bi->ie_offset;
|
||||
ie_len = bi->ie_length;
|
||||
} else {
|
||||
@@ -2328,11 +2347,18 @@
|
||||
ie_len = bss->len_information_elements;
|
||||
#endif
|
||||
wl->conf->channel = *bss->channel;
|
||||
+ }
|
||||
+
|
||||
+ if (bss) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
cfg80211_put_bss(wiphy, bss);
|
||||
#else
|
||||
cfg80211_put_bss(bss);
|
||||
#endif
|
||||
+ } else {
|
||||
+ WL_DBG(("Could not update BSS\n"));
|
||||
+ err = -EINVAL;
|
||||
+ goto update_bss_info_out;
|
||||
}
|
||||
|
||||
tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
|
||||
@@ -2360,10 +2386,17 @@
|
||||
struct wl_cfg80211_connect_info *conn_info = wl_to_conn(wl);
|
||||
s32 err = 0;
|
||||
|
||||
- wl_get_assoc_ies(wl);
|
||||
+ err = wl_get_assoc_ies(wl);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
memcpy(wl->profile->bssid, &e->addr, ETHER_ADDR_LEN);
|
||||
memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN);
|
||||
- wl_update_bss_info(wl);
|
||||
+
|
||||
+ err = wl_update_bss_info(wl);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
cfg80211_roamed(ndev,
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)
|
||||
&wl->conf->channel,
|
|
@ -1,16 +0,0 @@
|
|||
https://bugs.archlinux.org/task/61090
|
||||
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c 2015-09-19 00:47:30.000000000 +0200
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c 2018-11-14 14:06:03.313487995 +0100
|
||||
@@ -1444,11 +1444,10 @@
|
||||
s32 rate;
|
||||
s32 err = 0;
|
||||
|
||||
if (memcmp(mac, wl->profile->bssid, ETHER_ADDR_LEN)) {
|
||||
WL_ERR(("Wrong Mac address, mac = %pM profile =%pM\n", mac, wl->profile->bssid));
|
||||
- return -ENOENT;
|
||||
}
|
||||
|
||||
err = wl_dev_ioctl(dev, WLC_GET_RATE, &rate, sizeof(rate));
|
||||
if (err) {
|
||||
WL_DBG(("Could not get rate (%d)\n", err));
|
|
@ -1,11 +0,0 @@
|
|||
--- a/Makefile 2014-06-26 10:42:08.000000000 +0000
|
||||
+++ b/Makefile 2014-07-17 22:44:01.662297228 +0000
|
||||
@@ -126,6 +126,8 @@
|
||||
EXTRA_CFLAGS += -I$(src)/src/shared/bcmwifi/include
|
||||
#EXTRA_CFLAGS += -DBCMDBG_ASSERT -DBCMDBG_ERR
|
||||
|
||||
+EXTRA_CFLAGS += -Wno-date-time
|
||||
+
|
||||
EXTRA_LDFLAGS := $(src)/lib/wlc_hybrid.o_shipped
|
||||
|
||||
KBASE ?= /lib/modules/`uname -r`
|
|
@ -1,13 +0,0 @@
|
|||
diff -Naur hybrid-portsrc-x86_32-v5_10_91_9.orig/src/wl/sys/wl_linux.c hybrid-portsrc-x86_32-v5_10_91_9/src/wl/sys/wl_linux.c
|
||||
--- hybrid-portsrc-x86_32-v5_10_91_9.orig/src/wl/sys/wl_linux.c 2009-04-23 02:48:59.000000000 +0900
|
||||
+++ hybrid-portsrc-x86_32-v5_10_91_9/src/wl/sys/wl_linux.c 2009-05-08 00:48:20.000000000 +0900
|
||||
@@ -171,6 +171,8 @@
|
||||
static void wl_free_if(wl_info_t *wl, wl_if_t *wlif);
|
||||
static void wl_get_driver_info(struct net_device *dev, struct ethtool_drvinfo *info);
|
||||
|
||||
+MODULE_LICENSE("MIXED/Proprietary");
|
||||
+
|
||||
#if defined(WL_CONFIG_RFKILL)
|
||||
#include <linux/rfkill.h>
|
||||
static int wl_init_rfkill(wl_info_t *wl);
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
index a9671e2..da36405 100644
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -30,6 +30,9 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/ieee80211.h>
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
+#include <linux/sched/signal.h>
|
||||
+#endif
|
||||
#include <net/cfg80211.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <net/rtnetlink.h>
|
||||
diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
index 489c9f5..f8278ad 100644
|
||||
--- a/src/wl/sys/wl_linux.c
|
||||
+++ b/src/wl/sys/wl_linux.c
|
||||
@@ -117,6 +117,9 @@ int wl_found = 0;
|
||||
|
||||
typedef struct priv_link {
|
||||
wl_if_t *wlif;
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
+ unsigned long last_rx;
|
||||
+#endif
|
||||
} priv_link_t;
|
||||
|
||||
#define WL_DEV_IF(dev) ((wl_if_t*)((priv_link_t*)DEV_PRIV(dev))->wlif)
|
||||
@@ -2450,6 +2453,9 @@ wl_monitor(wl_info_t *wl, wl_rxsts_t *rxsts, void *p)
|
||||
{
|
||||
struct sk_buff *oskb = (struct sk_buff *)p;
|
||||
struct sk_buff *skb;
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
+ priv_link_t *priv_link;
|
||||
+#endif
|
||||
uchar *pdata;
|
||||
uint len;
|
||||
|
||||
@@ -2916,7 +2922,13 @@ wl_monitor(wl_info_t *wl, wl_rxsts_t *rxsts, void *p)
|
||||
if (skb == NULL) return;
|
||||
|
||||
skb->dev = wl->monitor_dev;
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
+ priv_link = MALLOC(wl->osh, sizeof(priv_link_t));
|
||||
+ priv_link = netdev_priv(skb->dev);
|
||||
+ priv_link->last_rx = jiffies;
|
||||
+#else
|
||||
skb->dev->last_rx = jiffies;
|
||||
+#endif
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
|
||||
skb_reset_mac_header(skb);
|
||||
#else
|
|
@ -1,68 +0,0 @@
|
|||
diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
index da36405..d3741eb 100644
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -53,7 +53,11 @@ u32 wl_dbg_level = WL_DBG_ERR;
|
||||
#endif
|
||||
|
||||
static s32 wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
+ enum nl80211_iftype type, struct vif_params *params);
|
||||
+#else
|
||||
enum nl80211_iftype type, u32 *flags, struct vif_params *params);
|
||||
+#endif
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
||||
static s32
|
||||
wl_cfg80211_scan(struct wiphy *wiphy,
|
||||
@@ -466,7 +470,11 @@ wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
|
||||
|
||||
static s32
|
||||
wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
+ enum nl80211_iftype type,
|
||||
+#else
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
+#endif
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct wl_cfg80211_priv *wl = wiphy_to_wl(wiphy);
|
||||
@@ -2361,6 +2369,20 @@ wl_bss_roaming_done(struct wl_cfg80211_priv *wl, struct net_device *ndev,
|
||||
const wl_event_msg_t *e, void *data)
|
||||
{
|
||||
struct wl_cfg80211_connect_info *conn_info = wl_to_conn(wl);
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
+ struct cfg80211_bss *bss;
|
||||
+ struct wlc_ssid *ssid;
|
||||
+ ssid = &wl->profile->ssid;
|
||||
+ bss = cfg80211_get_bss(wl_to_wiphy(wl), NULL, (s8 *)&wl->bssid,
|
||||
+ ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
|
||||
+ struct cfg80211_roam_info roam_info = {
|
||||
+ .bss = bss,
|
||||
+ .req_ie = conn_info->req_ie,
|
||||
+ .req_ie_len = conn_info->req_ie_len,
|
||||
+ .resp_ie = conn_info->resp_ie,
|
||||
+ .resp_ie_len = conn_info->resp_ie_len,
|
||||
+ };
|
||||
+#endif
|
||||
s32 err = 0;
|
||||
|
||||
wl_get_assoc_ies(wl);
|
||||
@@ -2368,12 +2390,17 @@ wl_bss_roaming_done(struct wl_cfg80211_priv *wl, struct net_device *ndev,
|
||||
memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN);
|
||||
wl_update_bss_info(wl);
|
||||
cfg80211_roamed(ndev,
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
+ &roam_info,
|
||||
+#else
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)
|
||||
&wl->conf->channel,
|
||||
#endif
|
||||
(u8 *)&wl->bssid,
|
||||
conn_info->req_ie, conn_info->req_ie_len,
|
||||
- conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
|
||||
+ conn_info->resp_ie, conn_info->resp_ie_len,
|
||||
+#endif
|
||||
+ GFP_KERNEL);
|
||||
WL_DBG(("Report roaming result\n"));
|
||||
|
||||
set_bit(WL_STATUS_CONNECTED, &wl->status);
|
|
@ -1,47 +0,0 @@
|
|||
See: https://lkml.org/lkml/2017/11/25/90
|
||||
|
||||
diff -urNZ a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
--- a/src/wl/sys/wl_linux.c 2015-09-18 22:47:30.000000000 +0000
|
||||
+++ b/src/wl/sys/wl_linux.c 2018-01-31 22:52:10.859856221 +0000
|
||||
@@ -93,7 +93,11 @@
|
||||
|
||||
#include <wlc_wowl.h>
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
|
||||
+static void wl_timer(struct timer_list *tl);
|
||||
+#else
|
||||
static void wl_timer(ulong data);
|
||||
+#endif
|
||||
static void _wl_timer(wl_timer_t *t);
|
||||
static struct net_device *wl_alloc_linux_if(wl_if_t *wlif);
|
||||
|
||||
@@ -2298,9 +2302,15 @@
|
||||
}
|
||||
|
||||
static void
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
|
||||
+wl_timer(struct timer_list *tl)
|
||||
+{
|
||||
+ wl_timer_t *t = from_timer(t, tl, timer);
|
||||
+#else
|
||||
wl_timer(ulong data)
|
||||
{
|
||||
wl_timer_t *t = (wl_timer_t *)data;
|
||||
+#endif
|
||||
|
||||
if (!WL_ALL_PASSIVE_ENAB(t->wl))
|
||||
_wl_timer(t);
|
||||
@@ -2352,9 +2362,13 @@
|
||||
|
||||
bzero(t, sizeof(wl_timer_t));
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
|
||||
+ timer_setup(&t->timer, wl_timer, 0);
|
||||
+#else
|
||||
init_timer(&t->timer);
|
||||
t->timer.data = (ulong) t;
|
||||
t->timer.function = wl_timer;
|
||||
+#endif
|
||||
t->wl = wl;
|
||||
t->fn = fn;
|
||||
t->arg = arg;
|
|
@ -1,109 +0,0 @@
|
|||
Since Linux 4.7, the enum ieee80211_band is no longer used
|
||||
|
||||
This shall cause no problem's since both enums ieee80211_band
|
||||
and nl80211_band were added in the same commit:
|
||||
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit?id=13ae75b103e07304a34ab40c9136e9f53e06475c
|
||||
|
||||
This patch refactors the references of IEEE80211_BAND_* to NL80211_BAND_*
|
||||
|
||||
Reference:
|
||||
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit?id=57fbcce37be7c1d2622b56587c10ade00e96afa3
|
||||
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-13 11:57:36.159340297 -0500
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c 2016-06-13 11:58:18.442323435 -0500
|
||||
@@ -236,7 +236,7 @@
|
||||
#endif
|
||||
|
||||
#define CHAN2G(_channel, _freq, _flags) { \
|
||||
- .band = IEEE80211_BAND_2GHZ, \
|
||||
+ .band = NL80211_BAND_2GHZ, \
|
||||
.center_freq = (_freq), \
|
||||
.hw_value = (_channel), \
|
||||
.flags = (_flags), \
|
||||
@@ -245,7 +245,7 @@
|
||||
}
|
||||
|
||||
#define CHAN5G(_channel, _flags) { \
|
||||
- .band = IEEE80211_BAND_5GHZ, \
|
||||
+ .band = NL80211_BAND_5GHZ, \
|
||||
.center_freq = 5000 + (5 * (_channel)), \
|
||||
.hw_value = (_channel), \
|
||||
.flags = (_flags), \
|
||||
@@ -379,7 +379,7 @@
|
||||
};
|
||||
|
||||
static struct ieee80211_supported_band __wl_band_2ghz = {
|
||||
- .band = IEEE80211_BAND_2GHZ,
|
||||
+ .band = NL80211_BAND_2GHZ,
|
||||
.channels = __wl_2ghz_channels,
|
||||
.n_channels = ARRAY_SIZE(__wl_2ghz_channels),
|
||||
.bitrates = wl_g_rates,
|
||||
@@ -387,7 +387,7 @@
|
||||
};
|
||||
|
||||
static struct ieee80211_supported_band __wl_band_5ghz_a = {
|
||||
- .band = IEEE80211_BAND_5GHZ,
|
||||
+ .band = NL80211_BAND_5GHZ,
|
||||
.channels = __wl_5ghz_a_channels,
|
||||
.n_channels = ARRAY_SIZE(__wl_5ghz_a_channels),
|
||||
.bitrates = wl_a_rates,
|
||||
@@ -395,7 +395,7 @@
|
||||
};
|
||||
|
||||
static struct ieee80211_supported_band __wl_band_5ghz_n = {
|
||||
- .band = IEEE80211_BAND_5GHZ,
|
||||
+ .band = NL80211_BAND_5GHZ,
|
||||
.channels = __wl_5ghz_n_channels,
|
||||
.n_channels = ARRAY_SIZE(__wl_5ghz_n_channels),
|
||||
.bitrates = wl_a_rates,
|
||||
@@ -1876,8 +1876,8 @@
|
||||
wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX;
|
||||
#endif
|
||||
wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
|
||||
- wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz;
|
||||
- wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a;
|
||||
+ wdev->wiphy->bands[NL80211_BAND_2GHZ] = &__wl_band_2ghz;
|
||||
+ wdev->wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_a;
|
||||
wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
|
||||
wdev->wiphy->cipher_suites = __wl_cipher_suites;
|
||||
wdev->wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites);
|
||||
@@ -2000,7 +2000,7 @@
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
|
||||
freq = ieee80211_channel_to_frequency(notif_bss_info->channel,
|
||||
(notif_bss_info->channel <= CH_MAX_2G_CHANNEL) ?
|
||||
- IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ);
|
||||
+ NL80211_BAND_2GHZ : NL80211_BAND_5GHZ);
|
||||
#else
|
||||
freq = ieee80211_channel_to_frequency(notif_bss_info->channel);
|
||||
#endif
|
||||
@@ -2116,7 +2116,7 @@
|
||||
return err;
|
||||
}
|
||||
chan = wf_chspec_ctlchan(chanspec);
|
||||
- band = (chan <= CH_MAX_2G_CHANNEL) ? IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
|
||||
+ band = (chan <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
|
||||
freq = ieee80211_channel_to_frequency(chan, band);
|
||||
channel = ieee80211_get_channel(wiphy, freq);
|
||||
cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, channel, GFP_KERNEL);
|
||||
@@ -2250,10 +2250,10 @@
|
||||
join_params->params.chanspec_list[0] =
|
||||
ieee80211_frequency_to_channel(chan->center_freq);
|
||||
|
||||
- if (chan->band == IEEE80211_BAND_2GHZ) {
|
||||
+ if (chan->band == NL80211_BAND_2GHZ) {
|
||||
chanspec |= WL_CHANSPEC_BAND_2G;
|
||||
}
|
||||
- else if (chan->band == IEEE80211_BAND_5GHZ) {
|
||||
+ else if (chan->band == NL80211_BAND_5GHZ) {
|
||||
chanspec |= WL_CHANSPEC_BAND_5G;
|
||||
}
|
||||
else {
|
||||
@@ -2885,7 +2885,7 @@
|
||||
|
||||
if (phy == 'n' || phy == 'a' || phy == 'v') {
|
||||
wiphy = wl_to_wiphy(wl);
|
||||
- wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_n;
|
||||
+ wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_n;
|
||||
}
|
||||
|
||||
return err;
|
|
@ -1,64 +0,0 @@
|
|||
From d3f93542326a06d920c6eb89b703384290d37b8b Mon Sep 17 00:00:00 2001
|
||||
From: Alberto Milone <alberto.milone@canonical.com>
|
||||
Date: Fri, 2 Sep 2016 17:35:34 +0200
|
||||
Subject: [PATCH 1/1] Add support for Linux 4.8
|
||||
|
||||
Orginal author: Krzysztof Kolasa
|
||||
---
|
||||
src/wl/sys/wl_cfg80211_hybrid.c | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
index 2fc71fe..ec5e472 100644
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -2388,8 +2388,16 @@ wl_bss_connect_done(struct wl_cfg80211_priv *wl, struct net_device *ndev,
|
||||
s32 err = 0;
|
||||
|
||||
if (wl->scan_request) {
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)
|
||||
+ struct cfg80211_scan_info info = {
|
||||
+ .aborted = true,
|
||||
+ };
|
||||
+ WL_DBG(("%s: Aborting scan\n", __FUNCTION__));
|
||||
+ cfg80211_scan_done(wl->scan_request, &info);
|
||||
+#else
|
||||
WL_DBG(("%s: Aborting scan\n", __FUNCTION__));
|
||||
cfg80211_scan_done(wl->scan_request, true);
|
||||
+#endif
|
||||
wl->scan_request = NULL;
|
||||
}
|
||||
|
||||
@@ -2490,7 +2498,14 @@ wl_notify_scan_status(struct wl_cfg80211_priv *wl, struct net_device *ndev,
|
||||
|
||||
scan_done_out:
|
||||
if (wl->scan_request) {
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)
|
||||
+ struct cfg80211_scan_info info = {
|
||||
+ .aborted = false,
|
||||
+ };
|
||||
+ cfg80211_scan_done(wl->scan_request, &info);
|
||||
+#else
|
||||
cfg80211_scan_done(wl->scan_request, false);
|
||||
+#endif
|
||||
wl->scan_request = NULL;
|
||||
}
|
||||
rtnl_unlock();
|
||||
@@ -2909,7 +2924,14 @@ s32 wl_cfg80211_down(struct net_device *ndev)
|
||||
s32 err = 0;
|
||||
|
||||
if (wl->scan_request) {
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)
|
||||
+ struct cfg80211_scan_info info = {
|
||||
+ .aborted = true,
|
||||
+ };
|
||||
+ cfg80211_scan_done(wl->scan_request, &info);
|
||||
+#else
|
||||
cfg80211_scan_done(wl->scan_request, true);
|
||||
+#endif
|
||||
wl->scan_request = NULL;
|
||||
}
|
||||
|
||||
--
|
||||
2.7.4
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
commit bcb06af629a36eb84f9a35ac599ec7e51e2d39fb
|
||||
Author: georgewhewell <georgerw@gmail.com>
|
||||
Date: Sat May 18 21:22:37 2019 +0100
|
||||
|
||||
find src -type f -name \'*.c\' -exec sed -i "s/get_ds()/KERNEL_DS/g" {} \;
|
||||
|
||||
diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
index 7b606e0..51c81bc 100644
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -450,7 +450,7 @@ wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
|
||||
ifr.ifr_data = (caddr_t)&ioc;
|
||||
|
||||
fs = get_fs();
|
||||
- set_fs(get_ds());
|
||||
+ set_fs(KERNEL_DS);
|
||||
#if defined(WL_USE_NETDEV_OPS)
|
||||
err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
#else
|
||||
diff --git a/src/wl/sys/wl_iw.c b/src/wl/sys/wl_iw.c
|
||||
index c4c610b..9c3c74e 100644
|
||||
--- a/src/wl/sys/wl_iw.c
|
||||
+++ b/src/wl/sys/wl_iw.c
|
||||
@@ -117,7 +117,7 @@ dev_wlc_ioctl(
|
||||
ifr.ifr_data = (caddr_t) &ioc;
|
||||
|
||||
fs = get_fs();
|
||||
- set_fs(get_ds());
|
||||
+ set_fs(KERNEL_DS);
|
||||
#if defined(WL_USE_NETDEV_OPS)
|
||||
ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
#else
|
|
@ -1,211 +0,0 @@
|
|||
From f3d652840f8dd959395065a1cf67ca40b04ec69b Mon Sep 17 00:00:00 2001
|
||||
From: Joan Bruguera <joanbrugueram@gmail.com>
|
||||
Date: Tue, 13 Oct 2020 19:35:55 +0200
|
||||
Subject: [PATCH] Get rid of get_fs/set_fs calls in Broadcom WL driver.
|
||||
|
||||
Tentative patch for broadcom-wl 6.30.223.271 driver for Linux 5.10 (tested -rc1 up to 5.10.1)
|
||||
|
||||
Applies on top of all the patches applied to broadcom-wl-dkms 6.30.223.271-23 on Arch Linux.
|
||||
|
||||
NB: Some checks in wlc_ioctl_internal are likely superfluous,
|
||||
but I'm not familiar enough with the driver to remove them with confidence.
|
||||
|
||||
See also: https://lwn.net/Articles/722267/
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=47058bb54b57962b3958a936ddbc59355e4c5504
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e6e9852d6f76e01b2e6803c74258afa5b432bc5
|
||||
|
||||
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
|
||||
---
|
||||
src/wl/sys/wl_cfg80211_hybrid.c | 25 ++-------------------
|
||||
src/wl/sys/wl_iw.c | 25 ++-------------------
|
||||
src/wl/sys/wl_linux.c | 40 ++++++++++++++++++++++++++++-----
|
||||
src/wl/sys/wl_linux.h | 2 ++
|
||||
src/wl/sys/wlc_pub.h | 1 +
|
||||
5 files changed, 42 insertions(+), 51 deletions(-)
|
||||
|
||||
diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
index 73c4b82..2e6df32 100644
|
||||
--- a/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
+++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <wlioctl.h>
|
||||
#include <proto/802.11.h>
|
||||
#include <wl_cfg80211_hybrid.h>
|
||||
+#include <wl_linux.h>
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
#include <linux/sched/signal.h>
|
||||
@@ -443,30 +444,8 @@ static void key_endian_to_host(struct wl_wsec_key *key)
|
||||
static s32
|
||||
wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
|
||||
{
|
||||
- struct ifreq ifr;
|
||||
- struct wl_ioctl ioc;
|
||||
- mm_segment_t fs;
|
||||
- s32 err = 0;
|
||||
-
|
||||
BUG_ON(len < sizeof(int));
|
||||
-
|
||||
- memset(&ioc, 0, sizeof(ioc));
|
||||
- ioc.cmd = cmd;
|
||||
- ioc.buf = arg;
|
||||
- ioc.len = len;
|
||||
- strcpy(ifr.ifr_name, dev->name);
|
||||
- ifr.ifr_data = (caddr_t)&ioc;
|
||||
-
|
||||
- fs = get_fs();
|
||||
- set_fs(KERNEL_DS);
|
||||
-#if defined(WL_USE_NETDEV_OPS)
|
||||
- err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
-#else
|
||||
- err = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
-#endif
|
||||
- set_fs(fs);
|
||||
-
|
||||
- return err;
|
||||
+ return wlc_ioctl_internal(dev, cmd, arg, len);
|
||||
}
|
||||
|
||||
static s32
|
||||
diff --git a/src/wl/sys/wl_iw.c b/src/wl/sys/wl_iw.c
|
||||
index 9c3c74e..e346b15 100644
|
||||
--- a/src/wl/sys/wl_iw.c
|
||||
+++ b/src/wl/sys/wl_iw.c
|
||||
@@ -37,6 +37,7 @@ typedef const struct si_pub si_t;
|
||||
|
||||
#include <wl_dbg.h>
|
||||
#include <wl_iw.h>
|
||||
+#include <wl_linux.h>
|
||||
|
||||
extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status,
|
||||
uint32 reason, char* stringBuf, uint buflen);
|
||||
@@ -103,29 +104,7 @@ dev_wlc_ioctl(
|
||||
int len
|
||||
)
|
||||
{
|
||||
- struct ifreq ifr;
|
||||
- wl_ioctl_t ioc;
|
||||
- mm_segment_t fs;
|
||||
- int ret;
|
||||
-
|
||||
- memset(&ioc, 0, sizeof(ioc));
|
||||
- ioc.cmd = cmd;
|
||||
- ioc.buf = arg;
|
||||
- ioc.len = len;
|
||||
-
|
||||
- strcpy(ifr.ifr_name, dev->name);
|
||||
- ifr.ifr_data = (caddr_t) &ioc;
|
||||
-
|
||||
- fs = get_fs();
|
||||
- set_fs(KERNEL_DS);
|
||||
-#if defined(WL_USE_NETDEV_OPS)
|
||||
- ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
-#else
|
||||
- ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
|
||||
-#endif
|
||||
- set_fs(fs);
|
||||
-
|
||||
- return ret;
|
||||
+ return wlc_ioctl_internal(dev, cmd, arg, len);
|
||||
}
|
||||
|
||||
static int
|
||||
diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
index cca7ee1..e491df7 100644
|
||||
--- a/src/wl/sys/wl_linux.c
|
||||
+++ b/src/wl/sys/wl_linux.c
|
||||
@@ -1647,10 +1647,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
goto done2;
|
||||
}
|
||||
|
||||
- if (get_fs().seg == KERNEL_DS.seg)
|
||||
- buf = ioc.buf;
|
||||
-
|
||||
- else if (ioc.buf) {
|
||||
+ if (ioc.buf) {
|
||||
if (!(buf = (void *) MALLOC(wl->osh, MAX(ioc.len, WLC_IOCTL_MAXLEN)))) {
|
||||
bcmerror = BCME_NORESOURCE;
|
||||
goto done2;
|
||||
@@ -1671,7 +1668,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
WL_UNLOCK(wl);
|
||||
|
||||
done1:
|
||||
- if (ioc.buf && (ioc.buf != buf)) {
|
||||
+ if (ioc.buf) {
|
||||
if (copy_to_user(ioc.buf, buf, ioc.len))
|
||||
bcmerror = BCME_BADADDR;
|
||||
MFREE(wl->osh, buf, MAX(ioc.len, WLC_IOCTL_MAXLEN));
|
||||
@@ -1684,6 +1681,39 @@ done2:
|
||||
return (OSL_ERROR(bcmerror));
|
||||
}
|
||||
|
||||
+int
|
||||
+wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len)
|
||||
+{
|
||||
+ wl_info_t *wl;
|
||||
+ wl_if_t *wlif;
|
||||
+ int bcmerror;
|
||||
+
|
||||
+ if (!dev)
|
||||
+ return -ENETDOWN;
|
||||
+
|
||||
+ wl = WL_INFO(dev);
|
||||
+ wlif = WL_DEV_IF(dev);
|
||||
+ if (wlif == NULL || wl == NULL || wl->dev == NULL)
|
||||
+ return -ENETDOWN;
|
||||
+
|
||||
+ bcmerror = 0;
|
||||
+
|
||||
+ WL_TRACE(("wl%d: wlc_ioctl_internal: cmd 0x%x\n", wl->pub->unit, cmd));
|
||||
+
|
||||
+ WL_LOCK(wl);
|
||||
+ if (!capable(CAP_NET_ADMIN)) {
|
||||
+ bcmerror = BCME_EPERM;
|
||||
+ } else {
|
||||
+ bcmerror = wlc_ioctl(wl->wlc, cmd, buf, len, wlif->wlcif);
|
||||
+ }
|
||||
+ WL_UNLOCK(wl);
|
||||
+
|
||||
+ ASSERT(VALID_BCMERROR(bcmerror));
|
||||
+ if (bcmerror != 0)
|
||||
+ wl->pub->bcmerror = bcmerror;
|
||||
+ return (OSL_ERROR(bcmerror));
|
||||
+}
|
||||
+
|
||||
static struct net_device_stats*
|
||||
wl_get_stats(struct net_device *dev)
|
||||
{
|
||||
diff --git a/src/wl/sys/wl_linux.h b/src/wl/sys/wl_linux.h
|
||||
index 5b1048e..c8c1f41 100644
|
||||
--- a/src/wl/sys/wl_linux.h
|
||||
+++ b/src/wl/sys/wl_linux.h
|
||||
@@ -22,6 +22,7 @@
|
||||
#define _wl_linux_h_
|
||||
|
||||
#include <wlc_types.h>
|
||||
+#include <wlc_pub.h>
|
||||
|
||||
typedef struct wl_timer {
|
||||
struct timer_list timer;
|
||||
@@ -187,6 +188,7 @@ extern irqreturn_t wl_isr(int irq, void *dev_id, struct pt_regs *ptregs);
|
||||
extern int __devinit wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||
extern void wl_free(wl_info_t *wl);
|
||||
extern int wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
|
||||
+extern int wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len);
|
||||
extern struct net_device * wl_netdev_get(wl_info_t *wl);
|
||||
|
||||
#endif
|
||||
diff --git a/src/wl/sys/wlc_pub.h b/src/wl/sys/wlc_pub.h
|
||||
index 53a98b8..2b5a029 100644
|
||||
--- a/src/wl/sys/wlc_pub.h
|
||||
+++ b/src/wl/sys/wlc_pub.h
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <wlc_types.h>
|
||||
#include <wlc_utils.h>
|
||||
+#include <siutils.h>
|
||||
#include "proto/802.11.h"
|
||||
#include "proto/bcmevent.h"
|
||||
|
||||
--
|
||||
2.28.0
|
|
@ -1,87 +0,0 @@
|
|||
From dd057e40a167f4febb1a7c77dd32b7d36056952c Mon Sep 17 00:00:00 2001
|
||||
From: Herman van Hazendonk <github.com@herrie.org>
|
||||
Date: Tue, 31 Mar 2020 17:09:55 +0200
|
||||
Subject: [PATCH] Add fixes for 5.6 kernel
|
||||
|
||||
Use ioremap instead of ioremap_nocache and proc_ops instead of file_operations on Linux kernel 5.6 and above.
|
||||
|
||||
Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
|
||||
---
|
||||
src/shared/linux_osl.c | 6 +++++-
|
||||
src/wl/sys/wl_linux.c | 21 ++++++++++++++++++++-
|
||||
2 files changed, 25 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c
|
||||
index 6157d18..dcfc075 100644
|
||||
--- a/src/shared/linux_osl.c
|
||||
+++ b/src/shared/linux_osl.c
|
||||
@@ -942,7 +942,11 @@ osl_getcycles(void)
|
||||
void *
|
||||
osl_reg_map(uint32 pa, uint size)
|
||||
{
|
||||
- return (ioremap_nocache((unsigned long)pa, (unsigned long)size));
|
||||
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+ return (ioremap((unsigned long)pa, (unsigned long)size));
|
||||
+ #else
|
||||
+ return (ioremap_nocache((unsigned long)pa, (unsigned long)size));
|
||||
+ #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
index 0d05100..6d9dd0d 100644
|
||||
--- a/src/wl/sys/wl_linux.c
|
||||
+++ b/src/wl/sys/wl_linux.c
|
||||
@@ -582,10 +582,17 @@ wl_attach(uint16 vendor, uint16 device, ulong regs,
|
||||
}
|
||||
wl->bcm_bustype = bustype;
|
||||
|
||||
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+ if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
|
||||
+ WL_ERROR(("wl%d: ioremap() failed\n", unit));
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ #else
|
||||
if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
|
||||
WL_ERROR(("wl%d: ioremap() failed\n", unit));
|
||||
goto fail;
|
||||
}
|
||||
+ #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */
|
||||
|
||||
wl->bar1_addr = bar1_addr;
|
||||
wl->bar1_size = bar1_size;
|
||||
@@ -772,8 +779,13 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if ((val & 0x0000ff00) != 0)
|
||||
pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
|
||||
bar1_size = pci_resource_len(pdev, 2);
|
||||
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+ bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2),
|
||||
+ bar1_size);
|
||||
+ #else
|
||||
bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2),
|
||||
bar1_size);
|
||||
+ #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */
|
||||
wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev,
|
||||
pdev->irq, bar1_addr, bar1_size);
|
||||
|
||||
@@ -3335,12 +3347,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+static const struct proc_ops wl_fops = {
|
||||
+ .proc_read = wl_proc_read,
|
||||
+ .proc_write = wl_proc_write,
|
||||
+};
|
||||
+#else
|
||||
static const struct file_operations wl_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = wl_proc_read,
|
||||
.write = wl_proc_write,
|
||||
};
|
||||
-#endif
|
||||
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */
|
||||
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) */
|
||||
|
||||
static int
|
||||
wl_reg_proc_entry(wl_info_t *wl)
|
|
@ -1,12 +0,0 @@
|
|||
diff -u -r a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
--- a/src/wl/sys/wl_linux.c 2020-10-12 21:19:15.256305165 +0000
|
||||
+++ b/src/wl/sys/wl_linux.c 2020-10-12 21:20:38.687530895 +0000
|
||||
@@ -1643,7 +1643,7 @@
|
||||
goto done2;
|
||||
}
|
||||
|
||||
- if (segment_eq(get_fs(), KERNEL_DS))
|
||||
+ if (get_fs().seg == KERNEL_DS.seg)
|
||||
buf = ioc.buf;
|
||||
|
||||
else if (ioc.buf) {
|
|
@ -1,27 +0,0 @@
|
|||
Description: Fixing null pointer crash
|
||||
|
||||
Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=773713
|
||||
Bug-Ubuntu: https://launchpad.net/bugs/1415880
|
||||
Last-Update: 2015-08-18
|
||||
|
||||
---
|
||||
src/wl/sys/wl_linux.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
|
||||
index 860b935..295156f 100644
|
||||
--- a/src/wl/sys/wl_linux.c
|
||||
+++ b/src/wl/sys/wl_linux.c
|
||||
@@ -2157,8 +2157,8 @@ wl_start(struct sk_buff *skb, struct net_device *dev)
|
||||
wlif = WL_DEV_IF(dev);
|
||||
wl = WL_INFO(dev);
|
||||
|
||||
+ skb->prev = NULL;
|
||||
if (WL_ALL_PASSIVE_ENAB(wl) || (WL_RTR() && WL_CONFIG_SMP())) {
|
||||
- skb->prev = NULL;
|
||||
|
||||
TXQ_LOCK(wl);
|
||||
|
||||
--
|
||||
1.9.1
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
Since Linux 4.3, rdtscl() is no longer available and native_read_tsc()
|
||||
is renamed to rdtsc(). Move the macro contents in-line and call the
|
||||
new function. References:
|
||||
|
||||
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit?id=fe47ae6e1a5005b2e82f7eab57b5c3820453293a
|
||||
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit?id=4ea1636b04dbd66536fa387bae2eea463efc705b
|
||||
|
||||
diff -ru a/src/shared/linux_osl.c b/src/shared/linux_osl.c
|
||||
--- a/src/shared/linux_osl.c 2015-09-19 01:47:15.000000000 +0300
|
||||
+++ b/src/shared/linux_osl.c 2015-11-21 15:20:30.585902518 +0200
|
||||
@@ -932,7 +932,11 @@
|
||||
uint cycles;
|
||||
|
||||
#if defined(__i386__)
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
|
||||
+ cycles = (u32)rdtsc();
|
||||
+#else
|
||||
rdtscl(cycles);
|
||||
+#endif
|
||||
#else
|
||||
cycles = 0;
|
||||
#endif
|
Loading…
Reference in a new issue