wok-current rev 25673

Up broadcom-wl drivers, add miss driver for mesa-dri (iris, crocus, virtio)
author Stanislas Leduc <shann@slitaz.org>
date Mon Mar 04 16:57:21 2024 +0000 (8 months ago)
parents d1dd7ab93442
children 9c5525edd04f
files broadcom-wl-pae/receipt broadcom-wl-pae/stuff/017-linux56.patch broadcom-wl-pae/stuff/018-linux59.patch broadcom-wl/receipt broadcom-wl/stuff/017-linux56.patch broadcom-wl/stuff/018-linux59.patch broadcom-wl64/receipt broadcom-wl64/stuff/017-linux56.patch broadcom-wl64/stuff/018-linux59.patch mesa-dri-crocus/receipt mesa-dri-iris/receipt mesa-dri-nouveau/receipt mesa-dri-virtio/receipt mesa/receipt
line diff
     1.1 --- a/broadcom-wl-pae/receipt	Sun Mar 03 17:58:42 2024 +0000
     1.2 +++ b/broadcom-wl-pae/receipt	Mon Mar 04 16:57:21 2024 +0000
     1.3 @@ -37,6 +37,9 @@
     1.4  008-linux415.patch
     1.5  009-fix_mac_profile_discrepancy.patch
     1.6  014-linux414.patch
     1.7 +016-linux51.patch
     1.8 +017-linux56.patch
     1.9 +018-linux59.patch
    1.10  EOT
    1.11  
    1.12      KBUILD_NOPEDANTIC=1 make -C /usr/src/linux M=`pwd`
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/broadcom-wl-pae/stuff/017-linux56.patch	Mon Mar 04 16:57:21 2024 +0000
     2.3 @@ -0,0 +1,55 @@
     2.4 +diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c
     2.5 +index 6157d18..8237ec7 100644
     2.6 +--- a/src/shared/linux_osl.c
     2.7 ++++ b/src/shared/linux_osl.c
     2.8 +@@ -942,7 +942,7 @@ osl_getcycles(void)
     2.9 + void *
    2.10 + osl_reg_map(uint32 pa, uint size)
    2.11 + {
    2.12 +-	return (ioremap_nocache((unsigned long)pa, (unsigned long)size));
    2.13 ++	return (ioremap((unsigned long)pa, (unsigned long)size));
    2.14 + }
    2.15 + 
    2.16 + void
    2.17 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
    2.18 +index 0d05100..2ed1f0d 100644
    2.19 +--- a/src/wl/sys/wl_linux.c
    2.20 ++++ b/src/wl/sys/wl_linux.c
    2.21 +@@ -582,7 +582,7 @@ wl_attach(uint16 vendor, uint16 device, ulong regs,
    2.22 + 	}
    2.23 + 	wl->bcm_bustype = bustype;
    2.24 + 
    2.25 +-	if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    2.26 ++	if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    2.27 + 		WL_ERROR(("wl%d: ioremap() failed\n", unit));
    2.28 + 		goto fail;
    2.29 + 	}
    2.30 +@@ -772,7 +772,7 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
    2.31 + 	if ((val & 0x0000ff00) != 0)
    2.32 + 		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
    2.33 + 		bar1_size = pci_resource_len(pdev, 2);
    2.34 +-		bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2),
    2.35 ++		bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2),
    2.36 + 			bar1_size);
    2.37 + 	wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev,
    2.38 + 		pdev->irq, bar1_addr, bar1_size);
    2.39 +@@ -3335,12 +3335,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t
    2.40 + }
    2.41 + 
    2.42 + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
    2.43 ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
    2.44 ++static struct proc_ops wl_fops = {
    2.45 ++        .proc_read     = wl_proc_read,
    2.46 ++        .proc_write    = wl_proc_write,
    2.47 ++};
    2.48 ++#else
    2.49 + static const struct file_operations wl_fops = {
    2.50 + 	.owner	= THIS_MODULE,
    2.51 + 	.read	= wl_proc_read,
    2.52 + 	.write	= wl_proc_write,
    2.53 + };
    2.54 + #endif
    2.55 ++#endif
    2.56 + 
    2.57 + static int
    2.58 + wl_reg_proc_entry(wl_info_t *wl)
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/broadcom-wl-pae/stuff/018-linux59.patch	Mon Mar 04 16:57:21 2024 +0000
     3.3 @@ -0,0 +1,211 @@
     3.4 +From f3d652840f8dd959395065a1cf67ca40b04ec69b Mon Sep 17 00:00:00 2001
     3.5 +From: Joan Bruguera <joanbrugueram@gmail.com>
     3.6 +Date: Tue, 13 Oct 2020 19:35:55 +0200
     3.7 +Subject: [PATCH] Get rid of get_fs/set_fs calls in Broadcom WL driver.
     3.8 +
     3.9 +Tentative patch for broadcom-wl 6.30.223.271 driver for Linux 5.10 (tested -rc1 up to 5.10.1)
    3.10 +
    3.11 +Applies on top of all the patches applied to broadcom-wl-dkms 6.30.223.271-23 on Arch Linux.
    3.12 +
    3.13 +NB: Some checks in wlc_ioctl_internal are likely superfluous,
    3.14 +    but I'm not familiar enough with the driver to remove them with confidence.
    3.15 +
    3.16 +See also: https://lwn.net/Articles/722267/
    3.17 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=47058bb54b57962b3958a936ddbc59355e4c5504
    3.18 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e6e9852d6f76e01b2e6803c74258afa5b432bc5
    3.19 +
    3.20 +Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
    3.21 +---
    3.22 + src/wl/sys/wl_cfg80211_hybrid.c | 25 ++-------------------
    3.23 + src/wl/sys/wl_iw.c              | 25 ++-------------------
    3.24 + src/wl/sys/wl_linux.c           | 40 ++++++++++++++++++++++++++++-----
    3.25 + src/wl/sys/wl_linux.h           |  2 ++
    3.26 + src/wl/sys/wlc_pub.h            |  1 +
    3.27 + 5 files changed, 42 insertions(+), 51 deletions(-)
    3.28 +
    3.29 +diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
    3.30 +index 7b606e0..1e0adb7 100644
    3.31 +--- a/src/wl/sys/wl_cfg80211_hybrid.c
    3.32 ++++ b/src/wl/sys/wl_cfg80211_hybrid.c
    3.33 +@@ -38,6 +38,7 @@
    3.34 + #include <wlioctl.h>
    3.35 + #include <proto/802.11.h>
    3.36 + #include <wl_cfg80211_hybrid.h>
    3.37 ++#include <wl_linux.h>
    3.38 + 
    3.39 + #define EVENT_TYPE(e) dtoh32((e)->event_type)
    3.40 + #define EVENT_FLAGS(e) dtoh16((e)->flags)
    3.41 +@@ -435,30 +436,7 @@ static void key_endian_to_host(struct wl_wsec_key *key)
    3.42 + static s32
    3.43 + wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
    3.44 + {
    3.45 +-	struct ifreq ifr;
    3.46 +-	struct wl_ioctl ioc;
    3.47 +-	mm_segment_t fs;
    3.48 +-	s32 err = 0;
    3.49 +-
    3.50 +-	BUG_ON(len < sizeof(int));
    3.51 +-
    3.52 +-	memset(&ioc, 0, sizeof(ioc));
    3.53 +-	ioc.cmd = cmd;
    3.54 +-	ioc.buf = arg;
    3.55 +-	ioc.len = len;
    3.56 +-	strcpy(ifr.ifr_name, dev->name);
    3.57 +-	ifr.ifr_data = (caddr_t)&ioc;
    3.58 +-
    3.59 +-	fs = get_fs();
    3.60 +-	set_fs(get_ds());
    3.61 +-#if defined(WL_USE_NETDEV_OPS)
    3.62 +-	err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    3.63 +-#else
    3.64 +-	err = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    3.65 +-#endif
    3.66 +-	set_fs(fs);
    3.67 +-
    3.68 +-	return err;
    3.69 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
    3.70 + }
    3.71 + 
    3.72 + static s32
    3.73 +diff --git a/src/wl/sys/wl_iw.c b/src/wl/sys/wl_iw.c
    3.74 +index c4c610b..e346b15 100644
    3.75 +--- a/src/wl/sys/wl_iw.c
    3.76 ++++ b/src/wl/sys/wl_iw.c
    3.77 +@@ -37,6 +37,7 @@ typedef const struct si_pub	si_t;
    3.78 + 
    3.79 + #include <wl_dbg.h>
    3.80 + #include <wl_iw.h>
    3.81 ++#include <wl_linux.h>
    3.82 + 
    3.83 + extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status,
    3.84 + 	uint32 reason, char* stringBuf, uint buflen);
    3.85 +@@ -103,29 +104,7 @@ dev_wlc_ioctl(
    3.86 + 	int len
    3.87 + )
    3.88 + {
    3.89 +-	struct ifreq ifr;
    3.90 +-	wl_ioctl_t ioc;
    3.91 +-	mm_segment_t fs;
    3.92 +-	int ret;
    3.93 +-
    3.94 +-	memset(&ioc, 0, sizeof(ioc));
    3.95 +-	ioc.cmd = cmd;
    3.96 +-	ioc.buf = arg;
    3.97 +-	ioc.len = len;
    3.98 +-
    3.99 +-	strcpy(ifr.ifr_name, dev->name);
   3.100 +-	ifr.ifr_data = (caddr_t) &ioc;
   3.101 +-
   3.102 +-	fs = get_fs();
   3.103 +-	set_fs(get_ds());
   3.104 +-#if defined(WL_USE_NETDEV_OPS)
   3.105 +-	ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   3.106 +-#else
   3.107 +-	ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   3.108 +-#endif
   3.109 +-	set_fs(fs);
   3.110 +-
   3.111 +-	return ret;
   3.112 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
   3.113 + }
   3.114 + 
   3.115 + static int
   3.116 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
   3.117 +index 947cef3..f04c148 100644
   3.118 +--- a/src/wl/sys/wl_linux.c
   3.119 ++++ b/src/wl/sys/wl_linux.c
   3.120 +@@ -1643,10 +1643,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   3.121 + 		goto done2;
   3.122 + 	}
   3.123 + 
   3.124 +-	if (segment_eq(get_fs(), KERNEL_DS))
   3.125 +-		buf = ioc.buf;
   3.126 +-
   3.127 +-	else if (ioc.buf) {
   3.128 ++	if (ioc.buf) {
   3.129 + 		if (!(buf = (void *) MALLOC(wl->osh, MAX(ioc.len, WLC_IOCTL_MAXLEN)))) {
   3.130 + 			bcmerror = BCME_NORESOURCE;
   3.131 + 			goto done2;
   3.132 +@@ -1667,7 +1664,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   3.133 + 	WL_UNLOCK(wl);
   3.134 + 
   3.135 + done1:
   3.136 +-	if (ioc.buf && (ioc.buf != buf)) {
   3.137 ++	if (ioc.buf) {
   3.138 + 		if (copy_to_user(ioc.buf, buf, ioc.len))
   3.139 + 			bcmerror = BCME_BADADDR;
   3.140 + 		MFREE(wl->osh, buf, MAX(ioc.len, WLC_IOCTL_MAXLEN));
   3.141 +@@ -1680,6 +1677,39 @@ done2:
   3.142 + 	return (OSL_ERROR(bcmerror));
   3.143 + }
   3.144 + 
   3.145 ++int
   3.146 ++wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len)
   3.147 ++{
   3.148 ++	wl_info_t *wl;
   3.149 ++	wl_if_t *wlif;
   3.150 ++	int bcmerror;
   3.151 ++
   3.152 ++	if (!dev)
   3.153 ++		return -ENETDOWN;
   3.154 ++
   3.155 ++	wl = WL_INFO(dev);
   3.156 ++	wlif = WL_DEV_IF(dev);
   3.157 ++	if (wlif == NULL || wl == NULL || wl->dev == NULL)
   3.158 ++		return -ENETDOWN;
   3.159 ++
   3.160 ++	bcmerror = 0;
   3.161 ++
   3.162 ++	WL_TRACE(("wl%d: wlc_ioctl_internal: cmd 0x%x\n", wl->pub->unit, cmd));
   3.163 ++
   3.164 ++	WL_LOCK(wl);
   3.165 ++	if (!capable(CAP_NET_ADMIN)) {
   3.166 ++		bcmerror = BCME_EPERM;
   3.167 ++	} else {
   3.168 ++		bcmerror = wlc_ioctl(wl->wlc, cmd, buf, len, wlif->wlcif);
   3.169 ++	}
   3.170 ++	WL_UNLOCK(wl);
   3.171 ++
   3.172 ++	ASSERT(VALID_BCMERROR(bcmerror));
   3.173 ++	if (bcmerror != 0)
   3.174 ++		wl->pub->bcmerror = bcmerror;
   3.175 ++	return (OSL_ERROR(bcmerror));
   3.176 ++}
   3.177 ++
   3.178 + static struct net_device_stats*
   3.179 + wl_get_stats(struct net_device *dev)
   3.180 + {
   3.181 +diff --git a/src/wl/sys/wl_linux.h b/src/wl/sys/wl_linux.h
   3.182 +index 5b1048e..c8c1f41 100644
   3.183 +--- a/src/wl/sys/wl_linux.h
   3.184 ++++ b/src/wl/sys/wl_linux.h
   3.185 +@@ -22,6 +22,7 @@
   3.186 + #define _wl_linux_h_
   3.187 + 
   3.188 + #include <wlc_types.h>
   3.189 ++#include <wlc_pub.h>
   3.190 + 
   3.191 + typedef struct wl_timer {
   3.192 + 	struct timer_list 	timer;
   3.193 +@@ -187,6 +188,7 @@ extern irqreturn_t wl_isr(int irq, void *dev_id, struct pt_regs *ptregs);
   3.194 + extern int __devinit wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
   3.195 + extern void wl_free(wl_info_t *wl);
   3.196 + extern int  wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
   3.197 ++extern int wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len);
   3.198 + extern struct net_device * wl_netdev_get(wl_info_t *wl);
   3.199 + 
   3.200 + #endif 
   3.201 +diff --git a/src/wl/sys/wlc_pub.h b/src/wl/sys/wlc_pub.h
   3.202 +index 53a98b8..2b5a029 100644
   3.203 +--- a/src/wl/sys/wlc_pub.h
   3.204 ++++ b/src/wl/sys/wlc_pub.h
   3.205 +@@ -24,6 +24,7 @@
   3.206 + 
   3.207 + #include <wlc_types.h>
   3.208 + #include <wlc_utils.h>
   3.209 ++#include <siutils.h>
   3.210 + #include "proto/802.11.h"
   3.211 + #include "proto/bcmevent.h"
   3.212 + 
   3.213 +--
   3.214 +2.28.0
     4.1 --- a/broadcom-wl/receipt	Sun Mar 03 17:58:42 2024 +0000
     4.2 +++ b/broadcom-wl/receipt	Mon Mar 04 16:57:21 2024 +0000
     4.3 @@ -36,6 +36,9 @@
     4.4  008-linux415.patch
     4.5  009-fix_mac_profile_discrepancy.patch
     4.6  014-linux414.patch
     4.7 +016-linux51.patch
     4.8 +017-linux56.patch
     4.9 +018-linux59.patch
    4.10  EOT
    4.11  
    4.12      KBUILD_NOPEDANTIC=1 make -C /usr/src/linux M=`pwd`
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/broadcom-wl/stuff/017-linux56.patch	Mon Mar 04 16:57:21 2024 +0000
     5.3 @@ -0,0 +1,55 @@
     5.4 +diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c
     5.5 +index 6157d18..8237ec7 100644
     5.6 +--- a/src/shared/linux_osl.c
     5.7 ++++ b/src/shared/linux_osl.c
     5.8 +@@ -942,7 +942,7 @@ osl_getcycles(void)
     5.9 + void *
    5.10 + osl_reg_map(uint32 pa, uint size)
    5.11 + {
    5.12 +-	return (ioremap_nocache((unsigned long)pa, (unsigned long)size));
    5.13 ++	return (ioremap((unsigned long)pa, (unsigned long)size));
    5.14 + }
    5.15 + 
    5.16 + void
    5.17 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
    5.18 +index 0d05100..2ed1f0d 100644
    5.19 +--- a/src/wl/sys/wl_linux.c
    5.20 ++++ b/src/wl/sys/wl_linux.c
    5.21 +@@ -582,7 +582,7 @@ wl_attach(uint16 vendor, uint16 device, ulong regs,
    5.22 + 	}
    5.23 + 	wl->bcm_bustype = bustype;
    5.24 + 
    5.25 +-	if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    5.26 ++	if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    5.27 + 		WL_ERROR(("wl%d: ioremap() failed\n", unit));
    5.28 + 		goto fail;
    5.29 + 	}
    5.30 +@@ -772,7 +772,7 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
    5.31 + 	if ((val & 0x0000ff00) != 0)
    5.32 + 		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
    5.33 + 		bar1_size = pci_resource_len(pdev, 2);
    5.34 +-		bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2),
    5.35 ++		bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2),
    5.36 + 			bar1_size);
    5.37 + 	wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev,
    5.38 + 		pdev->irq, bar1_addr, bar1_size);
    5.39 +@@ -3335,12 +3335,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t
    5.40 + }
    5.41 + 
    5.42 + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
    5.43 ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
    5.44 ++static struct proc_ops wl_fops = {
    5.45 ++        .proc_read     = wl_proc_read,
    5.46 ++        .proc_write    = wl_proc_write,
    5.47 ++};
    5.48 ++#else
    5.49 + static const struct file_operations wl_fops = {
    5.50 + 	.owner	= THIS_MODULE,
    5.51 + 	.read	= wl_proc_read,
    5.52 + 	.write	= wl_proc_write,
    5.53 + };
    5.54 + #endif
    5.55 ++#endif
    5.56 + 
    5.57 + static int
    5.58 + wl_reg_proc_entry(wl_info_t *wl)
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/broadcom-wl/stuff/018-linux59.patch	Mon Mar 04 16:57:21 2024 +0000
     6.3 @@ -0,0 +1,211 @@
     6.4 +From f3d652840f8dd959395065a1cf67ca40b04ec69b Mon Sep 17 00:00:00 2001
     6.5 +From: Joan Bruguera <joanbrugueram@gmail.com>
     6.6 +Date: Tue, 13 Oct 2020 19:35:55 +0200
     6.7 +Subject: [PATCH] Get rid of get_fs/set_fs calls in Broadcom WL driver.
     6.8 +
     6.9 +Tentative patch for broadcom-wl 6.30.223.271 driver for Linux 5.10 (tested -rc1 up to 5.10.1)
    6.10 +
    6.11 +Applies on top of all the patches applied to broadcom-wl-dkms 6.30.223.271-23 on Arch Linux.
    6.12 +
    6.13 +NB: Some checks in wlc_ioctl_internal are likely superfluous,
    6.14 +    but I'm not familiar enough with the driver to remove them with confidence.
    6.15 +
    6.16 +See also: https://lwn.net/Articles/722267/
    6.17 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=47058bb54b57962b3958a936ddbc59355e4c5504
    6.18 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e6e9852d6f76e01b2e6803c74258afa5b432bc5
    6.19 +
    6.20 +Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
    6.21 +---
    6.22 + src/wl/sys/wl_cfg80211_hybrid.c | 25 ++-------------------
    6.23 + src/wl/sys/wl_iw.c              | 25 ++-------------------
    6.24 + src/wl/sys/wl_linux.c           | 40 ++++++++++++++++++++++++++++-----
    6.25 + src/wl/sys/wl_linux.h           |  2 ++
    6.26 + src/wl/sys/wlc_pub.h            |  1 +
    6.27 + 5 files changed, 42 insertions(+), 51 deletions(-)
    6.28 +
    6.29 +diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
    6.30 +index 7b606e0..1e0adb7 100644
    6.31 +--- a/src/wl/sys/wl_cfg80211_hybrid.c
    6.32 ++++ b/src/wl/sys/wl_cfg80211_hybrid.c
    6.33 +@@ -38,6 +38,7 @@
    6.34 + #include <wlioctl.h>
    6.35 + #include <proto/802.11.h>
    6.36 + #include <wl_cfg80211_hybrid.h>
    6.37 ++#include <wl_linux.h>
    6.38 + 
    6.39 + #define EVENT_TYPE(e) dtoh32((e)->event_type)
    6.40 + #define EVENT_FLAGS(e) dtoh16((e)->flags)
    6.41 +@@ -435,30 +436,7 @@ static void key_endian_to_host(struct wl_wsec_key *key)
    6.42 + static s32
    6.43 + wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
    6.44 + {
    6.45 +-	struct ifreq ifr;
    6.46 +-	struct wl_ioctl ioc;
    6.47 +-	mm_segment_t fs;
    6.48 +-	s32 err = 0;
    6.49 +-
    6.50 +-	BUG_ON(len < sizeof(int));
    6.51 +-
    6.52 +-	memset(&ioc, 0, sizeof(ioc));
    6.53 +-	ioc.cmd = cmd;
    6.54 +-	ioc.buf = arg;
    6.55 +-	ioc.len = len;
    6.56 +-	strcpy(ifr.ifr_name, dev->name);
    6.57 +-	ifr.ifr_data = (caddr_t)&ioc;
    6.58 +-
    6.59 +-	fs = get_fs();
    6.60 +-	set_fs(get_ds());
    6.61 +-#if defined(WL_USE_NETDEV_OPS)
    6.62 +-	err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    6.63 +-#else
    6.64 +-	err = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    6.65 +-#endif
    6.66 +-	set_fs(fs);
    6.67 +-
    6.68 +-	return err;
    6.69 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
    6.70 + }
    6.71 + 
    6.72 + static s32
    6.73 +diff --git a/src/wl/sys/wl_iw.c b/src/wl/sys/wl_iw.c
    6.74 +index c4c610b..e346b15 100644
    6.75 +--- a/src/wl/sys/wl_iw.c
    6.76 ++++ b/src/wl/sys/wl_iw.c
    6.77 +@@ -37,6 +37,7 @@ typedef const struct si_pub	si_t;
    6.78 + 
    6.79 + #include <wl_dbg.h>
    6.80 + #include <wl_iw.h>
    6.81 ++#include <wl_linux.h>
    6.82 + 
    6.83 + extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status,
    6.84 + 	uint32 reason, char* stringBuf, uint buflen);
    6.85 +@@ -103,29 +104,7 @@ dev_wlc_ioctl(
    6.86 + 	int len
    6.87 + )
    6.88 + {
    6.89 +-	struct ifreq ifr;
    6.90 +-	wl_ioctl_t ioc;
    6.91 +-	mm_segment_t fs;
    6.92 +-	int ret;
    6.93 +-
    6.94 +-	memset(&ioc, 0, sizeof(ioc));
    6.95 +-	ioc.cmd = cmd;
    6.96 +-	ioc.buf = arg;
    6.97 +-	ioc.len = len;
    6.98 +-
    6.99 +-	strcpy(ifr.ifr_name, dev->name);
   6.100 +-	ifr.ifr_data = (caddr_t) &ioc;
   6.101 +-
   6.102 +-	fs = get_fs();
   6.103 +-	set_fs(get_ds());
   6.104 +-#if defined(WL_USE_NETDEV_OPS)
   6.105 +-	ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   6.106 +-#else
   6.107 +-	ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   6.108 +-#endif
   6.109 +-	set_fs(fs);
   6.110 +-
   6.111 +-	return ret;
   6.112 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
   6.113 + }
   6.114 + 
   6.115 + static int
   6.116 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
   6.117 +index 947cef3..f04c148 100644
   6.118 +--- a/src/wl/sys/wl_linux.c
   6.119 ++++ b/src/wl/sys/wl_linux.c
   6.120 +@@ -1643,10 +1643,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   6.121 + 		goto done2;
   6.122 + 	}
   6.123 + 
   6.124 +-	if (segment_eq(get_fs(), KERNEL_DS))
   6.125 +-		buf = ioc.buf;
   6.126 +-
   6.127 +-	else if (ioc.buf) {
   6.128 ++	if (ioc.buf) {
   6.129 + 		if (!(buf = (void *) MALLOC(wl->osh, MAX(ioc.len, WLC_IOCTL_MAXLEN)))) {
   6.130 + 			bcmerror = BCME_NORESOURCE;
   6.131 + 			goto done2;
   6.132 +@@ -1667,7 +1664,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   6.133 + 	WL_UNLOCK(wl);
   6.134 + 
   6.135 + done1:
   6.136 +-	if (ioc.buf && (ioc.buf != buf)) {
   6.137 ++	if (ioc.buf) {
   6.138 + 		if (copy_to_user(ioc.buf, buf, ioc.len))
   6.139 + 			bcmerror = BCME_BADADDR;
   6.140 + 		MFREE(wl->osh, buf, MAX(ioc.len, WLC_IOCTL_MAXLEN));
   6.141 +@@ -1680,6 +1677,39 @@ done2:
   6.142 + 	return (OSL_ERROR(bcmerror));
   6.143 + }
   6.144 + 
   6.145 ++int
   6.146 ++wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len)
   6.147 ++{
   6.148 ++	wl_info_t *wl;
   6.149 ++	wl_if_t *wlif;
   6.150 ++	int bcmerror;
   6.151 ++
   6.152 ++	if (!dev)
   6.153 ++		return -ENETDOWN;
   6.154 ++
   6.155 ++	wl = WL_INFO(dev);
   6.156 ++	wlif = WL_DEV_IF(dev);
   6.157 ++	if (wlif == NULL || wl == NULL || wl->dev == NULL)
   6.158 ++		return -ENETDOWN;
   6.159 ++
   6.160 ++	bcmerror = 0;
   6.161 ++
   6.162 ++	WL_TRACE(("wl%d: wlc_ioctl_internal: cmd 0x%x\n", wl->pub->unit, cmd));
   6.163 ++
   6.164 ++	WL_LOCK(wl);
   6.165 ++	if (!capable(CAP_NET_ADMIN)) {
   6.166 ++		bcmerror = BCME_EPERM;
   6.167 ++	} else {
   6.168 ++		bcmerror = wlc_ioctl(wl->wlc, cmd, buf, len, wlif->wlcif);
   6.169 ++	}
   6.170 ++	WL_UNLOCK(wl);
   6.171 ++
   6.172 ++	ASSERT(VALID_BCMERROR(bcmerror));
   6.173 ++	if (bcmerror != 0)
   6.174 ++		wl->pub->bcmerror = bcmerror;
   6.175 ++	return (OSL_ERROR(bcmerror));
   6.176 ++}
   6.177 ++
   6.178 + static struct net_device_stats*
   6.179 + wl_get_stats(struct net_device *dev)
   6.180 + {
   6.181 +diff --git a/src/wl/sys/wl_linux.h b/src/wl/sys/wl_linux.h
   6.182 +index 5b1048e..c8c1f41 100644
   6.183 +--- a/src/wl/sys/wl_linux.h
   6.184 ++++ b/src/wl/sys/wl_linux.h
   6.185 +@@ -22,6 +22,7 @@
   6.186 + #define _wl_linux_h_
   6.187 + 
   6.188 + #include <wlc_types.h>
   6.189 ++#include <wlc_pub.h>
   6.190 + 
   6.191 + typedef struct wl_timer {
   6.192 + 	struct timer_list 	timer;
   6.193 +@@ -187,6 +188,7 @@ extern irqreturn_t wl_isr(int irq, void *dev_id, struct pt_regs *ptregs);
   6.194 + extern int __devinit wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
   6.195 + extern void wl_free(wl_info_t *wl);
   6.196 + extern int  wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
   6.197 ++extern int wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len);
   6.198 + extern struct net_device * wl_netdev_get(wl_info_t *wl);
   6.199 + 
   6.200 + #endif 
   6.201 +diff --git a/src/wl/sys/wlc_pub.h b/src/wl/sys/wlc_pub.h
   6.202 +index 53a98b8..2b5a029 100644
   6.203 +--- a/src/wl/sys/wlc_pub.h
   6.204 ++++ b/src/wl/sys/wlc_pub.h
   6.205 +@@ -24,6 +24,7 @@
   6.206 + 
   6.207 + #include <wlc_types.h>
   6.208 + #include <wlc_utils.h>
   6.209 ++#include <siutils.h>
   6.210 + #include "proto/802.11.h"
   6.211 + #include "proto/bcmevent.h"
   6.212 + 
   6.213 +--
   6.214 +2.28.0
     7.1 --- a/broadcom-wl64/receipt	Sun Mar 03 17:58:42 2024 +0000
     7.2 +++ b/broadcom-wl64/receipt	Mon Mar 04 16:57:21 2024 +0000
     7.3 @@ -13,7 +13,8 @@
     7.4  PROVIDE="broadcom-wl:linux64"
     7.5  
     7.6  DEPENDS="linux64"
     7.7 -BUILD_DEPENDS="linux64-module-headers xz"
     7.8 +BUILD_DEPENDS="git xz sysfsutils-dev findutils diffutils \
     7.9 +libtool kmod bc elfutils-dev openssl-dev"
    7.10  
    7.11  # Rules to configure and make the package.
    7.12  compile_rules()
    7.13 @@ -37,13 +38,24 @@
    7.14  008-linux415.patch
    7.15  009-fix_mac_profile_discrepancy.patch
    7.16  014-linux414.patch
    7.17 +017-linux56.patch
    7.18 +018-linux59.patch
    7.19  EOT
    7.20  
    7.21      # Use cross toolchain x86_64
    7.22      export PATH=$PATH:/cross/x86_64/tools/bin
    7.23  
    7.24 +    # linux64-module-headers seem not enought for build module
    7.25 +    # Use linux kernel source and modules_prepare
    7.26 +    tar xf $SRC/linux-$kvers.tar.xz
    7.27 +    cd linux-$kvers
    7.28 +    cp $WOK/linux/stuff/linux-slitaz.config64 .config
    7.29 +    make ARCH=x86_64 CROSS_COMPILE=x86_64-slitaz-linux- modules_prepare
    7.30 +    cp $WOK/linux/install/linux64/usr/src/linux-$kvers-slitaz64/Module.symvers .
    7.31 +    cd -
    7.32 +
    7.33      KBUILD_NOPEDANTIC=1 make ARCH=x86_64 CROSS_COMPILE=x86_64-slitaz-linux- \
    7.34 -        -C /usr/src/linux M=`pwd`
    7.35 +        -C ./linux-$kvers M=`pwd`
    7.36      xz wl.ko
    7.37  }
    7.38  
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/broadcom-wl64/stuff/017-linux56.patch	Mon Mar 04 16:57:21 2024 +0000
     8.3 @@ -0,0 +1,55 @@
     8.4 +diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c
     8.5 +index 6157d18..8237ec7 100644
     8.6 +--- a/src/shared/linux_osl.c
     8.7 ++++ b/src/shared/linux_osl.c
     8.8 +@@ -942,7 +942,7 @@ osl_getcycles(void)
     8.9 + void *
    8.10 + osl_reg_map(uint32 pa, uint size)
    8.11 + {
    8.12 +-	return (ioremap_nocache((unsigned long)pa, (unsigned long)size));
    8.13 ++	return (ioremap((unsigned long)pa, (unsigned long)size));
    8.14 + }
    8.15 + 
    8.16 + void
    8.17 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
    8.18 +index 0d05100..2ed1f0d 100644
    8.19 +--- a/src/wl/sys/wl_linux.c
    8.20 ++++ b/src/wl/sys/wl_linux.c
    8.21 +@@ -582,7 +582,7 @@ wl_attach(uint16 vendor, uint16 device, ulong regs,
    8.22 + 	}
    8.23 + 	wl->bcm_bustype = bustype;
    8.24 + 
    8.25 +-	if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    8.26 ++	if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) {
    8.27 + 		WL_ERROR(("wl%d: ioremap() failed\n", unit));
    8.28 + 		goto fail;
    8.29 + 	}
    8.30 +@@ -772,7 +772,7 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
    8.31 + 	if ((val & 0x0000ff00) != 0)
    8.32 + 		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
    8.33 + 		bar1_size = pci_resource_len(pdev, 2);
    8.34 +-		bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2),
    8.35 ++		bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2),
    8.36 + 			bar1_size);
    8.37 + 	wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev,
    8.38 + 		pdev->irq, bar1_addr, bar1_size);
    8.39 +@@ -3335,12 +3335,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t
    8.40 + }
    8.41 + 
    8.42 + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
    8.43 ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
    8.44 ++static struct proc_ops wl_fops = {
    8.45 ++        .proc_read     = wl_proc_read,
    8.46 ++        .proc_write    = wl_proc_write,
    8.47 ++};
    8.48 ++#else
    8.49 + static const struct file_operations wl_fops = {
    8.50 + 	.owner	= THIS_MODULE,
    8.51 + 	.read	= wl_proc_read,
    8.52 + 	.write	= wl_proc_write,
    8.53 + };
    8.54 + #endif
    8.55 ++#endif
    8.56 + 
    8.57 + static int
    8.58 + wl_reg_proc_entry(wl_info_t *wl)
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/broadcom-wl64/stuff/018-linux59.patch	Mon Mar 04 16:57:21 2024 +0000
     9.3 @@ -0,0 +1,211 @@
     9.4 +From f3d652840f8dd959395065a1cf67ca40b04ec69b Mon Sep 17 00:00:00 2001
     9.5 +From: Joan Bruguera <joanbrugueram@gmail.com>
     9.6 +Date: Tue, 13 Oct 2020 19:35:55 +0200
     9.7 +Subject: [PATCH] Get rid of get_fs/set_fs calls in Broadcom WL driver.
     9.8 +
     9.9 +Tentative patch for broadcom-wl 6.30.223.271 driver for Linux 5.10 (tested -rc1 up to 5.10.1)
    9.10 +
    9.11 +Applies on top of all the patches applied to broadcom-wl-dkms 6.30.223.271-23 on Arch Linux.
    9.12 +
    9.13 +NB: Some checks in wlc_ioctl_internal are likely superfluous,
    9.14 +    but I'm not familiar enough with the driver to remove them with confidence.
    9.15 +
    9.16 +See also: https://lwn.net/Articles/722267/
    9.17 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=47058bb54b57962b3958a936ddbc59355e4c5504
    9.18 +          https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e6e9852d6f76e01b2e6803c74258afa5b432bc5
    9.19 +
    9.20 +Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
    9.21 +---
    9.22 + src/wl/sys/wl_cfg80211_hybrid.c | 25 ++-------------------
    9.23 + src/wl/sys/wl_iw.c              | 25 ++-------------------
    9.24 + src/wl/sys/wl_linux.c           | 40 ++++++++++++++++++++++++++++-----
    9.25 + src/wl/sys/wl_linux.h           |  2 ++
    9.26 + src/wl/sys/wlc_pub.h            |  1 +
    9.27 + 5 files changed, 42 insertions(+), 51 deletions(-)
    9.28 +
    9.29 +diff --git a/src/wl/sys/wl_cfg80211_hybrid.c b/src/wl/sys/wl_cfg80211_hybrid.c
    9.30 +index 7b606e0..1e0adb7 100644
    9.31 +--- a/src/wl/sys/wl_cfg80211_hybrid.c
    9.32 ++++ b/src/wl/sys/wl_cfg80211_hybrid.c
    9.33 +@@ -38,6 +38,7 @@
    9.34 + #include <wlioctl.h>
    9.35 + #include <proto/802.11.h>
    9.36 + #include <wl_cfg80211_hybrid.h>
    9.37 ++#include <wl_linux.h>
    9.38 + 
    9.39 + #define EVENT_TYPE(e) dtoh32((e)->event_type)
    9.40 + #define EVENT_FLAGS(e) dtoh16((e)->flags)
    9.41 +@@ -435,30 +436,7 @@ static void key_endian_to_host(struct wl_wsec_key *key)
    9.42 + static s32
    9.43 + wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len)
    9.44 + {
    9.45 +-	struct ifreq ifr;
    9.46 +-	struct wl_ioctl ioc;
    9.47 +-	mm_segment_t fs;
    9.48 +-	s32 err = 0;
    9.49 +-
    9.50 +-	BUG_ON(len < sizeof(int));
    9.51 +-
    9.52 +-	memset(&ioc, 0, sizeof(ioc));
    9.53 +-	ioc.cmd = cmd;
    9.54 +-	ioc.buf = arg;
    9.55 +-	ioc.len = len;
    9.56 +-	strcpy(ifr.ifr_name, dev->name);
    9.57 +-	ifr.ifr_data = (caddr_t)&ioc;
    9.58 +-
    9.59 +-	fs = get_fs();
    9.60 +-	set_fs(get_ds());
    9.61 +-#if defined(WL_USE_NETDEV_OPS)
    9.62 +-	err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    9.63 +-#else
    9.64 +-	err = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
    9.65 +-#endif
    9.66 +-	set_fs(fs);
    9.67 +-
    9.68 +-	return err;
    9.69 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
    9.70 + }
    9.71 + 
    9.72 + static s32
    9.73 +diff --git a/src/wl/sys/wl_iw.c b/src/wl/sys/wl_iw.c
    9.74 +index c4c610b..e346b15 100644
    9.75 +--- a/src/wl/sys/wl_iw.c
    9.76 ++++ b/src/wl/sys/wl_iw.c
    9.77 +@@ -37,6 +37,7 @@ typedef const struct si_pub	si_t;
    9.78 + 
    9.79 + #include <wl_dbg.h>
    9.80 + #include <wl_iw.h>
    9.81 ++#include <wl_linux.h>
    9.82 + 
    9.83 + extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status,
    9.84 + 	uint32 reason, char* stringBuf, uint buflen);
    9.85 +@@ -103,29 +104,7 @@ dev_wlc_ioctl(
    9.86 + 	int len
    9.87 + )
    9.88 + {
    9.89 +-	struct ifreq ifr;
    9.90 +-	wl_ioctl_t ioc;
    9.91 +-	mm_segment_t fs;
    9.92 +-	int ret;
    9.93 +-
    9.94 +-	memset(&ioc, 0, sizeof(ioc));
    9.95 +-	ioc.cmd = cmd;
    9.96 +-	ioc.buf = arg;
    9.97 +-	ioc.len = len;
    9.98 +-
    9.99 +-	strcpy(ifr.ifr_name, dev->name);
   9.100 +-	ifr.ifr_data = (caddr_t) &ioc;
   9.101 +-
   9.102 +-	fs = get_fs();
   9.103 +-	set_fs(get_ds());
   9.104 +-#if defined(WL_USE_NETDEV_OPS)
   9.105 +-	ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   9.106 +-#else
   9.107 +-	ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE);
   9.108 +-#endif
   9.109 +-	set_fs(fs);
   9.110 +-
   9.111 +-	return ret;
   9.112 ++	return wlc_ioctl_internal(dev, cmd, arg, len);
   9.113 + }
   9.114 + 
   9.115 + static int
   9.116 +diff --git a/src/wl/sys/wl_linux.c b/src/wl/sys/wl_linux.c
   9.117 +index 947cef3..f04c148 100644
   9.118 +--- a/src/wl/sys/wl_linux.c
   9.119 ++++ b/src/wl/sys/wl_linux.c
   9.120 +@@ -1643,10 +1643,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   9.121 + 		goto done2;
   9.122 + 	}
   9.123 + 
   9.124 +-	if (segment_eq(get_fs(), KERNEL_DS))
   9.125 +-		buf = ioc.buf;
   9.126 +-
   9.127 +-	else if (ioc.buf) {
   9.128 ++	if (ioc.buf) {
   9.129 + 		if (!(buf = (void *) MALLOC(wl->osh, MAX(ioc.len, WLC_IOCTL_MAXLEN)))) {
   9.130 + 			bcmerror = BCME_NORESOURCE;
   9.131 + 			goto done2;
   9.132 +@@ -1667,7 +1664,7 @@ wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   9.133 + 	WL_UNLOCK(wl);
   9.134 + 
   9.135 + done1:
   9.136 +-	if (ioc.buf && (ioc.buf != buf)) {
   9.137 ++	if (ioc.buf) {
   9.138 + 		if (copy_to_user(ioc.buf, buf, ioc.len))
   9.139 + 			bcmerror = BCME_BADADDR;
   9.140 + 		MFREE(wl->osh, buf, MAX(ioc.len, WLC_IOCTL_MAXLEN));
   9.141 +@@ -1680,6 +1677,39 @@ done2:
   9.142 + 	return (OSL_ERROR(bcmerror));
   9.143 + }
   9.144 + 
   9.145 ++int
   9.146 ++wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len)
   9.147 ++{
   9.148 ++	wl_info_t *wl;
   9.149 ++	wl_if_t *wlif;
   9.150 ++	int bcmerror;
   9.151 ++
   9.152 ++	if (!dev)
   9.153 ++		return -ENETDOWN;
   9.154 ++
   9.155 ++	wl = WL_INFO(dev);
   9.156 ++	wlif = WL_DEV_IF(dev);
   9.157 ++	if (wlif == NULL || wl == NULL || wl->dev == NULL)
   9.158 ++		return -ENETDOWN;
   9.159 ++
   9.160 ++	bcmerror = 0;
   9.161 ++
   9.162 ++	WL_TRACE(("wl%d: wlc_ioctl_internal: cmd 0x%x\n", wl->pub->unit, cmd));
   9.163 ++
   9.164 ++	WL_LOCK(wl);
   9.165 ++	if (!capable(CAP_NET_ADMIN)) {
   9.166 ++		bcmerror = BCME_EPERM;
   9.167 ++	} else {
   9.168 ++		bcmerror = wlc_ioctl(wl->wlc, cmd, buf, len, wlif->wlcif);
   9.169 ++	}
   9.170 ++	WL_UNLOCK(wl);
   9.171 ++
   9.172 ++	ASSERT(VALID_BCMERROR(bcmerror));
   9.173 ++	if (bcmerror != 0)
   9.174 ++		wl->pub->bcmerror = bcmerror;
   9.175 ++	return (OSL_ERROR(bcmerror));
   9.176 ++}
   9.177 ++
   9.178 + static struct net_device_stats*
   9.179 + wl_get_stats(struct net_device *dev)
   9.180 + {
   9.181 +diff --git a/src/wl/sys/wl_linux.h b/src/wl/sys/wl_linux.h
   9.182 +index 5b1048e..c8c1f41 100644
   9.183 +--- a/src/wl/sys/wl_linux.h
   9.184 ++++ b/src/wl/sys/wl_linux.h
   9.185 +@@ -22,6 +22,7 @@
   9.186 + #define _wl_linux_h_
   9.187 + 
   9.188 + #include <wlc_types.h>
   9.189 ++#include <wlc_pub.h>
   9.190 + 
   9.191 + typedef struct wl_timer {
   9.192 + 	struct timer_list 	timer;
   9.193 +@@ -187,6 +188,7 @@ extern irqreturn_t wl_isr(int irq, void *dev_id, struct pt_regs *ptregs);
   9.194 + extern int __devinit wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
   9.195 + extern void wl_free(wl_info_t *wl);
   9.196 + extern int  wl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
   9.197 ++extern int wlc_ioctl_internal(struct net_device *dev, int cmd, void *buf, int len);
   9.198 + extern struct net_device * wl_netdev_get(wl_info_t *wl);
   9.199 + 
   9.200 + #endif 
   9.201 +diff --git a/src/wl/sys/wlc_pub.h b/src/wl/sys/wlc_pub.h
   9.202 +index 53a98b8..2b5a029 100644
   9.203 +--- a/src/wl/sys/wlc_pub.h
   9.204 ++++ b/src/wl/sys/wlc_pub.h
   9.205 +@@ -24,6 +24,7 @@
   9.206 + 
   9.207 + #include <wlc_types.h>
   9.208 + #include <wlc_utils.h>
   9.209 ++#include <siutils.h>
   9.210 + #include "proto/802.11.h"
   9.211 + #include "proto/bcmevent.h"
   9.212 + 
   9.213 +--
   9.214 +2.28.0
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/mesa-dri-crocus/receipt	Mon Mar 04 16:57:21 2024 +0000
    10.3 @@ -0,0 +1,19 @@
    10.4 +# SliTaz package receipt.
    10.5 +
    10.6 +PACKAGE="mesa-dri-crocus"
    10.7 +VERSION="21.3.5"
    10.8 +CATEGORY="x-window"
    10.9 +SHORT_DESC="Mesa DRI drivers for Intel Crocus."
   10.10 +MAINTAINER="pascal.bellard@slitaz.org"
   10.11 +LICENSE="MIT"
   10.12 +WEB_SITE="https://www.mesa3d.org/"
   10.13 +
   10.14 +DEPENDS="libdrm-intel mesa mesa-dri"
   10.15 +WANTED="mesa"
   10.16 +
   10.17 +# Rules to gen a SliTaz package suitable for Tazpkg.
   10.18 +genpkg_rules()
   10.19 +{
   10.20 +	mkdir -p $fs/usr/lib/dri
   10.21 +	cp $install/usr/lib/dri/crocus_dri.so $fs/usr/lib/dri
   10.22 +}
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/mesa-dri-iris/receipt	Mon Mar 04 16:57:21 2024 +0000
    11.3 @@ -0,0 +1,19 @@
    11.4 +# SliTaz package receipt.
    11.5 +
    11.6 +PACKAGE="mesa-dri-iris"
    11.7 +VERSION="21.3.5"
    11.8 +CATEGORY="x-window"
    11.9 +SHORT_DESC="Mesa DRI drivers for Intel Iris."
   11.10 +MAINTAINER="pascal.bellard@slitaz.org"
   11.11 +LICENSE="MIT"
   11.12 +WEB_SITE="https://www.mesa3d.org/"
   11.13 +
   11.14 +DEPENDS="libdrm-intel mesa mesa-dri"
   11.15 +WANTED="mesa"
   11.16 +
   11.17 +# Rules to gen a SliTaz package suitable for Tazpkg.
   11.18 +genpkg_rules()
   11.19 +{
   11.20 +	mkdir -p $fs/usr/lib/dri
   11.21 +	cp $install/usr/lib/dri/iris_dri.so $fs/usr/lib/dri
   11.22 +}
    12.1 --- a/mesa-dri-nouveau/receipt	Sun Mar 03 17:58:42 2024 +0000
    12.2 +++ b/mesa-dri-nouveau/receipt	Mon Mar 04 16:57:21 2024 +0000
    12.3 @@ -17,7 +17,7 @@
    12.4  	mkdir -p $fs/usr/lib/dri
    12.5  	mkdir -p $fs/etc/X11/xorg.conf.d
    12.6  
    12.7 -	cp $install/usr/lib/dri/nouveau_vieux_dri.so	$fs/usr/lib/dri
    12.8 +	cp $install/usr/lib/dri/nouveau*_dri.so	$fs/usr/lib/dri
    12.9  
   12.10  	cat > $fs/etc/X11/xorg.conf.d/90-DRI.conf <<EOT
   12.11  Section "DRI"
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/mesa-dri-virtio/receipt	Mon Mar 04 16:57:21 2024 +0000
    13.3 @@ -0,0 +1,19 @@
    13.4 +# SliTaz package receipt.
    13.5 +
    13.6 +PACKAGE="mesa-dri-virtio"
    13.7 +VERSION="21.3.5"
    13.8 +CATEGORY="x-window"
    13.9 +SHORT_DESC="Mesa DRI drivers for virtio."
   13.10 +MAINTAINER="pascal.bellard@slitaz.org"
   13.11 +LICENSE="MIT"
   13.12 +WEB_SITE="https://www.mesa3d.org/"
   13.13 +
   13.14 +DEPENDS="libdrm mesa mesa-dri"
   13.15 +WANTED="mesa"
   13.16 +
   13.17 +# Rules to gen a SliTaz package suitable for Tazpkg.
   13.18 +genpkg_rules()
   13.19 +{
   13.20 +	mkdir -p $fs/usr/lib/dri
   13.21 +	cp $install/usr/lib/dri/virtio_gpu_dri.so $fs/usr/lib/dri
   13.22 +}
    14.1 --- a/mesa/receipt	Sun Mar 03 17:58:42 2024 +0000
    14.2 +++ b/mesa/receipt	Mon Mar 04 16:57:21 2024 +0000
    14.3 @@ -35,7 +35,7 @@
    14.4  compile_rules()
    14.5  {
    14.6  	DRI_DRIVERS="i915,i965,r100,r200,nouveau"
    14.7 -	GALLIUM_DRIVERS="nouveau,r300,r600,svga,radeonsi,swrast"
    14.8 +	GALLIUM_DRIVERS="nouveau,r300,r600,svga,radeonsi,swrast,virgl,iris,crocus"
    14.9  
   14.10  
   14.11  	# Use meson 0.54, issue with meson 0.62