Files
packages/anda/system/wl-kmod/wl-kmod-016_fix_unsupported_mesh_point.patch
T
2025-02-14 00:18:50 +08:00

118 lines
3.5 KiB
Diff

diff -Naur hybrid-v35_64-nodebug-pcoem-6_30_223_271.orig/src/wl/sys/wl_cfg80211_hybrid.c hybrid-v35_64-nodebug-pcoem-6_30_223_271/src/wl/sys/wl_cfg80211_hybrid.c
--- hybrid-v35_64-nodebug-pcoem-6_30_223_271.orig/src/wl/sys/wl_cfg80211_hybrid.c 2019-04-14 17:35:23.565460847 +0200
+++ hybrid-v35_64-nodebug-pcoem-6_30_223_271/src/wl/sys/wl_cfg80211_hybrid.c 2019-06-01 14:37:25.675650990 +0200
@@ -522,6 +522,10 @@
switch (type) {
case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_WDS:
+ case NL80211_IFTYPE_MESH_POINT:
+ case NL80211_IFTYPE_P2P_DEVICE:
+ case NL80211_IFTYPE_P2P_CLIENT:
+ case NL80211_IFTYPE_P2P_GO:
WL_ERR(("type (%d) : currently we do not support this type\n",
type));
return -EOPNOTSUPP;
@@ -532,6 +536,10 @@
wl->conf->mode = WL_MODE_BSS;
infra = 1;
break;
+ case NL80211_IFTYPE_AP:
+ wl->conf->mode = WL_MODE_AP;
+ ap = 1;
+ break;
default:
return -EINVAL;
}
@@ -1893,6 +1901,8 @@
return NL80211_IFTYPE_STATION;
case WL_MODE_IBSS:
return NL80211_IFTYPE_ADHOC;
+ case WL_MODE_AP:
+ return NL80211_IFTYPE_AP;
default:
return NL80211_IFTYPE_UNSPECIFIED;
}
@@ -1900,6 +1910,46 @@
return err;
}
+static const struct ieee80211_txrx_stypes
+wl_txrx_stypes[NUM_NL80211_IFTYPES] = {
+ [NL80211_IFTYPE_STATION] = {
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+ },
+ [NL80211_IFTYPE_AP] = {
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
+ BIT(IEEE80211_STYPE_DISASSOC >> 4) |
+ BIT(IEEE80211_STYPE_AUTH >> 4) |
+ BIT(IEEE80211_STYPE_DEAUTH >> 4) |
+ BIT(IEEE80211_STYPE_ACTION >> 4)
+ }
+};
+
+static const struct ieee80211_iface_limit wl_limits[] = {
+ {
+ .max = 1,
+ .types = BIT(NL80211_IFTYPE_STATION),
+ },
+ {
+ .max = 1,
+ .types = BIT(NL80211_IFTYPE_AP),
+ },
+};
+
+static const struct ieee80211_iface_combination wl_combination [] = {
+ {
+ .limits = wl_limits,
+ .n_limits = ARRAY_SIZE(wl_limits),
+ .max_interfaces = 2,
+ .num_different_channels = 1,
+ .beacon_int_infra_match = true,
+ },
+};
+
static s32 wl_alloc_wdev(struct device *dev, struct wireless_dev **rwdev)
{
struct wireless_dev *wdev;
@@ -1922,7 +1972,10 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)
wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX;
#endif
- wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
+ wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
+ wdev->wiphy->iface_combinations = wl_combination;
+ wdev->wiphy->n_iface_combinations = ARRAY_SIZE(wl_combination);
+ wdev->wiphy->mgmt_stypes = wl_txrx_stypes;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
wdev->wiphy->bands[NL80211_BAND_2GHZ] = &__wl_band_2ghz;
wdev->wiphy->bands[NL80211_BAND_5GHZ] = &__wl_band_5ghz_a;
@@ -2944,15 +2997,22 @@
switch (iftype) {
case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_WDS:
+ case NL80211_IFTYPE_MESH_POINT:
+ case NL80211_IFTYPE_P2P_DEVICE:
+ case NL80211_IFTYPE_P2P_CLIENT:
+ case NL80211_IFTYPE_P2P_GO:
WL_ERR(("type (%d) : currently we do not support this mode\n",
iftype));
- err = -EINVAL;
+ err = -EOPNOTSUPP;
return err;
case NL80211_IFTYPE_ADHOC:
break;
case NL80211_IFTYPE_STATION:
infra = 1;
break;
+ case NL80211_IFTYPE_AP:
+ ap = 1;
+ break;
default:
err = -EINVAL;
WL_ERR(("invalid type (%d)\n", iftype));