diff --git a/linux-5.10/rk3568_patch/kernel.patch b/linux-5.10/rk3568_patch/kernel.patch index b0c67f8511b85388b0fce44c0f219f587a830348..dfac1734dc87f092faae652dc40a35e0f82d3029 100755 --- a/linux-5.10/rk3568_patch/kernel.patch +++ b/linux-5.10/rk3568_patch/kernel.patch @@ -1173528,7 +1173528,7 @@ new file mode 100755 index 000000000..2452ffa3b --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd_wifi6/wl_cfgp2p.c -@@ -0,0 +1,2740 @@ +@@ -0,0 +1,2750 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Linux cfgp2p driver @@ -1173614,6 +1173614,10 @@ index 000000000..2452ffa3b +}; +#endif /* WL_ENABLE_P2P_IF */ + ++int dhd_del_monitor(struct net_device *ndev); ++int magiclink_add_p2p(const char *name, struct ether_addr *p2p_dev_addr, struct net_device **new_ndev); ++struct net_device* p2p_debug_ndev = NULL; ++ +bool wl_cfgp2p_is_pub_action(void *frame, u32 frame_len) +{ + wifi_p2p_pub_act_frame_t *pact_frm; @@ -1175315,6 +1175319,7 @@ index 000000000..2452ffa3b + dhd_generate_mac_addr(mac_addr); +#else + memcpy(mac_addr, primary_addr, sizeof(struct ether_addr)); ++ mac_addr->octet[0] |= 0x02; + WL_DBG(("P2P Discovery address:"MACDBG "\n", MAC2STRDBG(mac_addr->octet))); +#endif /* WL_P2P_USE_RANDMAC */ + @@ -1176109,6 +1176114,9 @@ index 000000000..2452ffa3b + + printf("P2P interface registered\n"); + printf("%s: wdev: %p, wdev->net: %p\n", __FUNCTION__, wdev, wdev->netdev); ++ ++ magiclink_add_p2p("p2p0",wl_to_p2p_bss_macaddr(cfg, P2PAPI_BSSCFG_DEVICE), &p2p_debug_ndev); ++ + return wdev; +} + @@ -1176227,6 +1176235,8 @@ index 000000000..2452ffa3b + cfg->p2p_wdev = NULL; + + CFGP2P_ERR(("P2P interface unregistered\n")); ++ if (p2p_debug_ndev != NULL) ++ dhd_del_monitor(p2p_debug_ndev); + + return 0; +} @@ -1197410,7 +1197420,7 @@ new file mode 100755 index 000000000..7ed4d120d --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd_wifi6/wl_linux_mon.c -@@ -0,0 +1,407 @@ +@@ -0,0 +1,474 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Broadcom Dongle Host Driver (DHD), Linux monitor network interface @@ -1197465,6 +1197475,7 @@ index 000000000..7ed4d120d + MONITOR_STATE_INTERFACE_DELETED = 0x4 +} monitor_states_t; +int dhd_add_monitor(const char *name, struct net_device **new_ndev); ++int magiclink_add_p2p(const char *name, struct ether_addr *p2p_dev_addr, struct net_device **new_ndev); +extern int dhd_start_xmit(struct sk_buff *skb, struct net_device *net); +int dhd_del_monitor(struct net_device *ndev); +int dhd_monitor_init(void *dhd_pub); @@ -1197762,6 +1197773,72 @@ index 000000000..7ed4d120d + +} + ++int magiclink_add_p2p(const char *name, struct ether_addr *p2p_dev_addr, struct net_device **new_ndev) ++{ ++ int i; ++ int idx = -1; ++ int ret = 0; ++ struct net_device* ndev = NULL; ++ dhd_linux_monitor_t **dhd_mon; ++ mutex_lock(&g_monitor.lock); ++ ++ MON_TRACE("enter, if name: %s\n", name); ++ if (!name || !new_ndev) { ++ MON_PRINT("invalid parameters\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ /* ++ * Find a vacancy ++ */ ++ for (i = 0; i < DHD_MAX_IFS; i++) ++ if (g_monitor.mon_if[i].mon_ndev == NULL) { ++ idx = i; ++ break; ++ } ++ if (idx == -1) { ++ MON_PRINT("exceeds maximum interfaces\n"); ++ ret = -EFAULT; ++ goto out; ++ } ++ ++ ndev = alloc_etherdev(sizeof(struct net_device)); ++ if (!ndev) { ++ MON_PRINT("failed to allocate memory\n"); ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ strncpy(ndev->name, name, IFNAMSIZ); ++ ndev->name[IFNAMSIZ - 1] = 0; ++ ndev->netdev_ops = &dhd_mon_if_ops; ++ ++ memcpy(ndev->dev_addr, p2p_dev_addr, sizeof(struct ether_addr)); ++ ret = register_netdevice(ndev); ++ if (ret) { ++ MON_PRINT(" register_netdevice failed (%d)\n", ret); ++ goto out; ++ } ++ ++ *new_ndev = ndev; ++ g_monitor.mon_if[idx].radiotap_enabled = TRUE; ++ g_monitor.mon_if[idx].mon_ndev = ndev; ++ g_monitor.mon_if[idx].real_ndev = lookup_real_netdev(name); ++ dhd_mon = (dhd_linux_monitor_t **)netdev_priv(ndev); ++ *dhd_mon = &g_monitor; ++ g_monitor.monitor_state = MONITOR_STATE_INTERFACE_ADDED; ++ MON_PRINT("net device returned: 0x%p\n", ndev); ++ MON_PRINT("found a matched net device, name %s\n", g_monitor.mon_if[idx].real_ndev->name); ++out: ++ if (ret && ndev) ++ free_netdev(ndev); ++ ++ mutex_unlock(&g_monitor.lock); ++ return ret; ++ ++} ++ +int dhd_del_monitor(struct net_device *ndev) +{ + int i;