diff --git a/linux-5.10/rk3568_patch/kernel.patch b/linux-5.10/rk3568_patch/kernel.patch index 5e3a56fad58d9293f5ecd6d09fd020fdb93554b2..a8f67754cee252ba8dbc53b63d1d4525ebab1315 100755 --- a/linux-5.10/rk3568_patch/kernel.patch +++ b/linux-5.10/rk3568_patch/kernel.patch @@ -96413,8 +96413,8 @@ index 000000000..14d80d46b + &gmac0_rgmii_clk + &gmac0_rgmii_bus>; + -+ tx_delay = <0x37>; -+ rx_delay = <0x2e>; ++ tx_delay = <0x2d>; ++ rx_delay = <0x13>; + + phy-handle = <&rgmii_phy0>; + status = "okay"; @@ -96440,8 +96440,8 @@ index 000000000..14d80d46b + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + -+ tx_delay = <0x47>; -+ rx_delay = <0x28>; ++ tx_delay = <0x37>; ++ rx_delay = <0x0f>; + + phy-handle = <&rgmii_phy1>; + status = "okay"; @@ -838747,7 +838747,7 @@ new file mode 100755 index 000000000..f2b8b9cd8 --- /dev/null +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c -@@ -0,0 +1,4192 @@ +@@ -0,0 +1,4195 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020 Rockchip Electronics Co., Ltd. */ + @@ -842475,68 +842475,33 @@ index 000000000..f2b8b9cd8 + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true); +} + -+static int -+rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, -+ const struct isp21_isp_params_cfg *new_params) ++static void ++rkisp_alloc_bay3d_buf(struct rkisp_isp_params_vdev *params_vdev, ++ const struct isp21_isp_params_cfg *new_params) +{ + struct rkisp_device *ispdev = params_vdev->dev; + struct rkisp_isp_subdev *isp_sdev = &ispdev->isp_sdev; + struct rkisp_isp_params_val_v21 *priv_val; + u64 module_en_update, module_ens; + u32 w, h, size; -+ int ret, i; ++ int ret; + -+ priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + module_en_update = new_params->module_en_update; + module_ens = new_params->module_ens; + -+ priv_val->buf_3dlut_idx = 0; -+ for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) { -+ priv_val->buf_3dlut[i].is_need_vaddr = true; -+ priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE; -+ ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dlut[i]); -+ if (ret) { -+ dev_err(ispdev->dev, "can not alloc buffer\n"); -+ goto err_3dlut; -+ } -+ } -+ -+ priv_val->buf_lsclut_idx = 0; -+ for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) { -+ priv_val->buf_lsclut[i].is_need_vaddr = true; -+ priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE; -+ ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_lsclut[i]); -+ if (ret) { -+ dev_err(ispdev->dev, "can not alloc buffer\n"); -+ goto err_lsclut; -+ } -+ } -+ + if ((module_en_update & ISP2X_MODULE_BAY3D) && + (module_ens & ISP2X_MODULE_BAY3D)) { + w = isp_sdev->in_crop.width; + h = isp_sdev->in_crop.height; + size = 2 * ALIGN((ALIGN(w, 16) + (w + 15) / 8) * h, 16); ++ priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; ++ rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); ++ + priv_val->buf_3dnr.size = size; + ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dnr); -+ if (ret) { ++ if (ret) + dev_err(ispdev->dev, "can not alloc bay3d buffer\n"); -+ goto err_bay3d; -+ } + } -+ -+ return 0; -+err_bay3d: -+ rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); -+ i = RKISP_PARAM_LSC_LUT_BUF_NUM; -+err_lsclut: -+ for (i -= 1; i >= 0; i--) -+ rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]); -+ i = RKISP_PARAM_3DLUT_BUF_NUM; -+err_3dlut: -+ for (i -= 1; i >= 0; i--) -+ rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]); -+ return ret; +} + +/* Not called when the camera active, thus not isr protection. */ @@ -842551,7 +842516,7 @@ index 000000000..f2b8b9cd8 + u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width; + u32 size = hw->max_in.w ? hw->max_in.w * hw->max_in.h : isp_param_get_insize(params_vdev); + -+ rkisp_alloc_internal_buf(params_vdev, params_vdev->isp21_params); ++ rkisp_alloc_bay3d_buf(params_vdev, params_vdev->isp21_params); + spin_lock(¶ms_vdev->config_lock); + /* override the default things */ + if (!params_vdev->isp21_params->module_cfg_update && @@ -842699,16 +842664,9 @@ index 000000000..f2b8b9cd8 +{ + struct rkisp_device *ispdev = params_vdev->dev; + struct rkisp_isp_params_val_v21 *priv_val; -+ int i; + + priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); -+ for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) -+ rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]); -+ for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) -+ rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]); -+ for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) -+ rkisp_free_buffer(ispdev, &ispdev->stats_vdev.stats_buf[i]); +} + +static void @@ -842913,7 +842871,9 @@ index 000000000..f2b8b9cd8 + +int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) +{ ++ struct device *dev = params_vdev->dev->dev; + struct rkisp_isp_params_val_v21 *priv_val; ++ int i, ret; + + priv_val = kzalloc(sizeof(*priv_val), GFP_KERNEL); + if (!priv_val) @@ -842924,22 +842884,65 @@ index 000000000..f2b8b9cd8 + kfree(priv_val); + return -ENOMEM; + } ++ priv_val->buf_3dlut_idx = 0; ++ for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) { ++ priv_val->buf_3dlut[i].is_need_vaddr = true; ++ priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE; ++ ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); ++ if (ret) { ++ dev_err(dev, "can not alloc buffer\n"); ++ goto err; ++ } ++ } ++ ++ priv_val->buf_lsclut_idx = 0; ++ for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) { ++ priv_val->buf_lsclut[i].is_need_vaddr = true; ++ priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE; ++ ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); ++ if (ret) { ++ dev_err(dev, "can not alloc buffer\n"); ++ goto err; ++ } ++ } + + params_vdev->priv_val = (void *)priv_val; + params_vdev->ops = &rkisp_isp_params_ops_tbl; + params_vdev->priv_ops = &rkisp_v21_isp_params_ops; + rkisp_clear_first_param_v2x(params_vdev); + return 0; ++ ++ err: ++ for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) ++ rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); ++ ++ for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) ++ rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); ++ vfree(params_vdev->isp21_params); ++ ++ return ret; +} + +void rkisp_uninit_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) +{ -+ if (params_vdev->isp21_params) -+ vfree(params_vdev->isp21_params); -+ kfree(params_vdev->priv_val); ++ struct rkisp_isp_params_val_v21 *priv_val; ++ int i; ++ ++ priv_val = params_vdev->priv_val; ++ if (!priv_val) ++ return; ++ ++ rkisp_deinit_ldch_buf(params_vdev); ++ for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) ++ rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); ++ ++ for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) ++ rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); ++ vfree(params_vdev->isp21_params); ++ kfree(priv_val); ++ + params_vdev->priv_val = NULL; +} -+ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.h b/drivers/media/platform/rockchip/isp/isp_params_v21.h new file mode 100755 index 000000000..860b9156f @@ -853821,7 +853824,7 @@ new file mode 100755 index 000000000..d6946c9fe --- /dev/null +++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.c -@@ -0,0 +1,1169 @@ +@@ -0,0 +1,1166 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020 Rockchip Electronics Co., Ltd. */ + @@ -854942,19 +854945,11 @@ index 000000000..d6946c9fe + +void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev) +{ -+ int i; -+ + stats_vdev->rd_stats_from_ddr = false; + stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21; + -+ if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode)) { -+ for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) { -+ stats_vdev->stats_buf[i].is_need_vaddr = true; -+ stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE; -+ if (rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i])) -+ goto err; -+ } -+ ++ if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) && ++ stats_vdev->stats_buf[0].mem_priv) { + stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21; + stats_vdev->rd_stats_from_ddr = true; + stats_vdev->rd_buf_idx = 0; @@ -854967,15 +854962,12 @@ index 000000000..d6946c9fe + rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN, + SW_3A_DDR_WRITE_EN, false); + } -+ return; -+err: -+ for (i -= 1; i >= 0; i--) -+ rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); -+ dev_err(stats_vdev->dev->dev, "alloc stats ddr buf fail\n"); +} + +void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) +{ ++ int i; ++ + stats_vdev->vdev_fmt.fmt.meta.dataformat = + V4L2_META_FMT_RK_ISP1_STAT_3A; + stats_vdev->vdev_fmt.fmt.meta.buffersize = @@ -854984,13 +854976,21 @@ index 000000000..d6946c9fe + stats_vdev->ops = &rkisp_isp_stats_ops_tbl; + stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21; + stats_vdev->rd_stats_from_ddr = false; ++ ++ for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) { ++ stats_vdev->stats_buf[i].is_need_vaddr = true; ++ stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE; ++ rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); ++ } +} + +void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) +{ ++ int i; + ++ for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) ++ rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); +} -+ diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.h b/drivers/media/platform/rockchip/isp/isp_stats_v21.h new file mode 100755 index 000000000..c1dba6c65 @@ -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 debug_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); ++ ++ debug_add_p2p("p2p0",wl_to_p2p_bss_macaddr(cfg, P2PAPI_BSSCFG_DEVICE), &p2p_debug_ndev); ++ + return wdev; +} + @@ -1176228,6 +1176236,8 @@ index 000000000..2452ffa3b + + CFGP2P_ERR(("P2P interface unregistered\n")); + ++ dhd_del_monitor(p2p_debug_ndev); ++ + return 0; +} +#endif /* WL_CFG80211_P2P_DEV_IF */ @@ -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 debug_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 debug_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;