Package: broadcom-sta-source Version: 6.30.223.271-6 I use the attached patch to get this module compiled with 4.12. Works fine for me the last few days.
Note, https://aur.archlinux.org/cgit/aur.git/tree/linux412.patch?h=broadcom-wl patch is different. It calculates the bss field, as my patch only sets the bssid field. Please refer to https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=29ce6ecbb83c9185d76e3a7c340c9702d2a54961 all other driver fixes seem to be also setting bssid when bss not already in scope. Also note that in the linux patch there where bss is set when NULL (search for "info->bss = cfg80211_get_bss") the flags differ. Cheers, Koos Vriezen
--- src/wl/sys/wl_cfg80211_hybrid.c.orig 2017-06-26 11:04:47.204814029 +0200 +++ src/wl/sys/wl_cfg80211_hybrid.c 2017-07-03 09:57:21.343667706 +0200 @@ -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, - enum nl80211_iftype type, u32 *flags, struct vif_params *params); + enum nl80211_iftype type, +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) + u32 *flags, +#endif + struct vif_params *params); #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) static s32 wl_cfg80211_scan(struct wiphy *wiphy, @@ -466,8 +470,11 @@ wl_dev_ioctl(struct net_device *dev, u32 static s32 wl_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) + enum nl80211_iftype type, +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) + u32 *flags, +#endif + struct vif_params *params) { struct wl_cfg80211_priv *wl = wiphy_to_wl(wiphy); struct wireless_dev *wdev; @@ -2387,6 +2394,15 @@ wl_bss_roaming_done(struct wl_cfg80211_p 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_roam_info roam_info = { + .bssid = wl->profile->bssid, + .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; err = wl_get_assoc_ies(wl); @@ -2401,12 +2417,17 @@ wl_bss_roaming_done(struct wl_cfg80211_p return err; 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);