Kernel 7.1.1-1-siduction-amd64 und broadcom-sta-dkms mögen sich nicht mehr

Started by ReinerS, 2026/06/21, 15:25:43

Previous topic - Next topic

ReinerS

Beim Upgrade auf 7.1.1-1-siduction-amd64 steigt bei diesem Kernel der build von initramfs wie folgt aus:

Building initial module broadcom-sta/6.30.223.271 for 7.1.1-1-siduction-amd64
The kernel is built without module signing facility, modules won't be signed

Building module(s)...(bad exit status: 2)
Failed command:
make -j4 KERNELRELEASE=7.1.1-1-siduction-amd64 KVER=7.1.1-1-siduction-amd64

Error! Bad return status for module build on kernel: 7.1.1-1-siduction-amd64 (x86_64)
Consult /var/lib/dkms/broadcom-sta/6.30.223.271/build/make.log for more information.
dpkg: Fehler beim Bearbeiten des Paketes broadcom-sta-dkms (--configure):
»altes postinst-Betreuerskript des Paketes broadcom-sta-dkms«-Unterprozess mit Exit-Status 10 fehlgeschlagen
Trigger für initramfs-tools (0.151) werden verarbeitet ...
update-initramfs: Generating /boot/initrd.img-7.1.1-1-siduction-amd64
Fehler traten auf beim Bearbeiten von:
broadcom-sta-dkms

Beim Kernel davor (7.0.12-1-siduction-amd64) noch problemlos.

Das log hilft mir auch nicht wirklich weiter:
root@macbookair:/var/lib/dkms/broadcom-sta/6.30.223.271/7.0.12-1-siduction-amd64/x86_64/log# cat make.log
DKMS (dkms-3.2.2) make.log for broadcom-sta/6.30.223.271 for kernel 7.0.12-1-siduction-amd64 (x86_64)
So 21. Jun 15:09:43 CEST 2026

Building module(s)
# command: make -j4 KERNELRELEASE=7.0.12-1-siduction-amd64 KVER=7.0.12-1-siduction-amd64
CFG80211 API is prefered for this kernel version
Makefile:91: Neither CFG80211 nor Wireless Extension is enabled in kernel
KBUILD_NOPEDANTIC=1 make -C /lib/modules/7.0.12-1-siduction-amd64/build M=`pwd`
make[1]: Verzeichnis ,,/usr/src/linux-headers-7.0.12-1-siduction-amd64" wird betreten
make[2]: Verzeichnis ,,/var/lib/dkms/broadcom-sta/6.30.223.271/build" wird betreten
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc-15 (Debian 15.2.0-17) 15.2.0
  You are using:          gcc-15 (Debian 15.3.0-1) 15.3.0
warning: pahole version differs from the one used to build the kernel
  The kernel was built with: 131
  You are using:            0
CFG80211 API is prefered for this kernel version
Using CFG80211 API
Kernel architecture is X86_64
  CC [M]  src/shared/linux_osl.o
  CC [M]  src/wl/sys/wl_linux.o
  CC [M]  src/wl/sys/wl_iw.o
  CC [M]  src/wl/sys/wl_cfg80211_hybrid.o
  LD [M]  wl.o
CFG80211 API is prefered for this kernel version
Using CFG80211 API
Kernel architecture is X86_64
  MODPOST Module.symvers
  CC [M]  wl.mod.o
  CC [M]  .module-common.o
  LD [M]  wl.ko
make[2]: Verzeichnis ,,/var/lib/dkms/broadcom-sta/6.30.223.271/build" wird verlassen
make[1]: Verzeichnis ,,/usr/src/linux-headers-7.0.12-1-siduction-amd64" wird verlassen

# exit code: 0
# elapsed time: 00:00:04
Jemand eine Idee dazu? Das entsprechende Modul fehlt dann bei dem Kernel und die Netzwerkkarte wird natürlich nicht erkannt.

Hat jemand eine Idee dazu?


Grüße

Reiner
slackware => SuSE => kanotix => sidux => aptosid  => siduction

Teriarch

Though it's not very comforting, here is the reason why it fails:
Line 83 of  broadcom-sta-dkms_6.30.223.271-29_amd64.deb's file
./usr/src/broadcom-sta-6.30.223.271/src/wl/sys/wl_cfg80211_hybrid.c reads:
 
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
static s32
wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
                        u8 *mac, struct station_info *sinfo)
#else
static s32
83: wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
                        const u8 *mac, struct station_info *sinfo)
#endif
So parameter dev points to structure net_device. In line 1859 of the same file
we initialize wl_cfg80211_ops of static structure cfg80211_ops as:
 
static struct cfg80211_ops wl_cfg80211_ops = {
        .change_virtual_intf = wl_cfg80211_change_iface,
        .scan = wl_cfg80211_scan,
        .set_wiphy_params = wl_cfg80211_set_wiphy_params,
        .join_ibss = wl_cfg80211_join_ibss,
        .leave_ibss = wl_cfg80211_leave_ibss,
1859:   .get_station = wl_cfg80211_get_station,...
}
So we have to look for static structure cfg80211_ops, which is defined in
file /usr/src/linux-headers-7.0.12-1-siduction-amd64/include/net/cfg80211.h
of linux kernel 7.0.12-1 in lines 4901 and 4962 as
 
4901: struct cfg80211_ops {...
4962:    int     (*get_station)(struct wiphy *wiphy, struct net_device *dev,
                               const u8 *mac, struct station_info *sinfo);
...}
However, linux kernel  7.1.1-1-siduction-amd64 in file
/usr/src/linux-headers-7.1.1-1-siduction-amd64/include/net/cfg80211.h
defines it as
5080: struct cfg80211_ops {...
5150:    int     (*get_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
                               const u8 *mac, struct station_info *sinfo);
...}
in lines 5080 and 5150. So according to broadcom its second parameter is always of
type struct net_device. But this is only compatible with kernel 7.0.12-1, since
kernel 7.1.1-1 defines it of struct wireless_dev, which is completely different.

This is not an easy fix, because subsequent code must be rewritten to accommodate
for the changes. It is possible, though, but very time consuming for a hobbyist.
So I suggest you wait for an update from broadcom-sta.

Teriarch

> This is not an easy fix [...]
Maybe it is after all...

--- a/wl_cfg80211_hybrid.c      2025-11-09 07:49:03.000000000 +0100
+++ b/wl_cfg80211_hybrid.c      2026-06-22 00:16:34.333612980 +0200
@@ -1366,6 +1366,16 @@ wl_cfg80211_add_key(struct wiphy *wiphy,
        return err;
 }
 
+static s32 my_driver_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
+                            int link_id, u8 key_index, bool pairwise, const u8 *mac_addr,
+                            struct key_params *params)
+{
+    struct net_device *netdev = wdev->netdev;
+    if (!netdev) return -ENODEV;
+
+    return wl_cfg80211_add_key(wiphy, netdev, link_id, key_index, pairwise, mac_addr, params);
+}
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
 static s32
 wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev,
@@ -1413,6 +1423,15 @@ wl_cfg80211_del_key(struct wiphy *wiphy,
        return err;
 }
 
+static s32 my_driver_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
+                            int link_id, u8 key_index, bool pairwise, const u8 *mac_addr)
+{
+    struct net_device *netdev = wdev->netdev;
+    if (!netdev) return -ENODEV;
+
+    return wl_cfg80211_del_key(wiphy, netdev, link_id, key_index, pairwise, mac_addr);
+}
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
 static s32
 wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev,
@@ -1486,6 +1505,16 @@ wl_cfg80211_get_key(struct wiphy *wiphy,
        return err;
 }
 
+static s32 my_driver_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
+                            int link_id, u8 key_index, bool pairwise, const u8 *mac_addr,
+                            void *cookie, void (*callback) (void *cookie, struct key_params * params))
+{
+    struct net_device *netdev = wdev->netdev;
+    if (!netdev) return -ENODEV;
+   
+    return wl_cfg80211_get_key(wiphy, netdev, link_id, key_index, pairwise, mac_addr, cookie, callback);
+}
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
 static s32
 wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
@@ -1541,6 +1570,21 @@ wl_cfg80211_get_station(struct wiphy *wi
        return err;
 }
 
+// New Kernel 7.1+ API footprint
+static s32 my_driver_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
+                                const u8 *mac_addr, struct station_info *sinfo)
+{
+    // Extract the net_device pointer from the new wdev parameter
+    struct net_device *netdev = wdev->netdev;
+   
+    if (!netdev)
+        return -ENODEV;
+
+    // Pass the old netdev structure right into your existing legacy driver logic
+    return wl_cfg80211_get_station(wiphy, netdev, mac_addr, sinfo);
+}
+
+
 static s32
 wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
                            bool enabled, s32 timeout)
@@ -1856,12 +1900,12 @@ static struct cfg80211_ops wl_cfg80211_o
        .set_wiphy_params = wl_cfg80211_set_wiphy_params,
        .join_ibss = wl_cfg80211_join_ibss,
        .leave_ibss = wl_cfg80211_leave_ibss,
-      .get_station = wl_cfg80211_get_station,
+      .get_station = my_driver_get_station,
        .set_tx_power = wl_cfg80211_set_tx_power,
        .get_tx_power = wl_cfg80211_get_tx_power,
-      .add_key = wl_cfg80211_add_key,
-      .del_key = wl_cfg80211_del_key,
-      .get_key = wl_cfg80211_get_key,
+      .add_key = my_driver_add_key,
+      .del_key = my_driver_del_key,
+      .get_key = my_driver_get_key,
        .set_default_key = wl_cfg80211_config_default_key,
        .set_power_mgmt = wl_cfg80211_set_power_mgmt,
        .connect = wl_cfg80211_connect,
At the time being it compiles against kernel 7.1.1-1 only (no time to include ifdefs for other kernels, yet).
So I suggest you keep a copy of original  /usr/src/wl/sys/wl_cfg80211_hybrid.c of
broadcom-sta-dkms_6.30.223.271-29_amd64.deb. Change to /usr/src/wl/sys, apply the patch:
$ patch -p1 < /tmp/patch
(You save the above code as /tmp/patch first)
Then you reconfigure the module build via:
$ sudo dpkg-reconfigure linux-image-7.1.1-1-siduction-amd64

I own no broadcom wireless card, so maybe you can report back whether it works.

HTH

PS.: also check:
<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1136423>