mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge c0dde4a52b ("dm-ebs: don't set the flag DM_TARGET_PASSES_INTEGRITY") into android14-6.1-lts
Steps on the way to 6.1.125 Resolves merge conflicts in: net/core/sock_map.c Change-Id: Ie56905f271c73906e8176b2aaa69e368145b1bb9 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -540,12 +540,12 @@ static int sbi_cpuidle_probe(struct platform_device *pdev)
|
||||
int cpu, ret;
|
||||
struct cpuidle_driver *drv;
|
||||
struct cpuidle_device *dev;
|
||||
struct device_node *np, *pds_node;
|
||||
struct device_node *pds_node;
|
||||
|
||||
/* Detect OSI support based on CPU DT nodes */
|
||||
sbi_cpuidle_use_osi = true;
|
||||
for_each_possible_cpu(cpu) {
|
||||
np = of_cpu_device_node_get(cpu);
|
||||
struct device_node *np __free(device_node) = of_cpu_device_node_get(cpu);
|
||||
if (np &&
|
||||
of_find_property(np, "power-domains", NULL) &&
|
||||
of_find_property(np, "power-domain-names", NULL)) {
|
||||
|
||||
@@ -11,9 +11,6 @@ config DRM_MEDIATEK
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_MIPI_DSI
|
||||
select DRM_PANEL
|
||||
select MEMORY
|
||||
select MTK_SMI
|
||||
select PHY_MTK_MIPI_DSI
|
||||
select VIDEOMODE_HELPERS
|
||||
help
|
||||
Choose this option if you have a Mediatek SoCs.
|
||||
@@ -24,7 +21,6 @@ config DRM_MEDIATEK
|
||||
config DRM_MEDIATEK_DP
|
||||
tristate "DRM DPTX Support for MediaTek SoCs"
|
||||
depends on DRM_MEDIATEK
|
||||
select PHY_MTK_DP
|
||||
select DRM_DISPLAY_HELPER
|
||||
select DRM_DISPLAY_DP_HELPER
|
||||
select DRM_DP_AUX_BUS
|
||||
@@ -35,6 +31,5 @@ config DRM_MEDIATEK_HDMI
|
||||
tristate "DRM HDMI Support for Mediatek SoCs"
|
||||
depends on DRM_MEDIATEK
|
||||
select SND_SOC_HDMI_CODEC if SND_SOC
|
||||
select PHY_MTK_HDMI
|
||||
help
|
||||
DRM/KMS HDMI driver for Mediatek SoCs
|
||||
|
||||
@@ -457,18 +457,16 @@ static int mtk_dp_set_color_format(struct mtk_dp *mtk_dp,
|
||||
enum dp_pixelformat color_format)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* update MISC0 */
|
||||
mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034,
|
||||
color_format << DP_TEST_COLOR_FORMAT_SHIFT,
|
||||
DP_TEST_COLOR_FORMAT_MASK);
|
||||
u32 misc0_color;
|
||||
|
||||
switch (color_format) {
|
||||
case DP_PIXELFORMAT_YUV422:
|
||||
val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_YCBCR422;
|
||||
misc0_color = DP_COLOR_FORMAT_YCbCr422;
|
||||
break;
|
||||
case DP_PIXELFORMAT_RGB:
|
||||
val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_RGB;
|
||||
misc0_color = DP_COLOR_FORMAT_RGB;
|
||||
break;
|
||||
default:
|
||||
drm_warn(mtk_dp->drm_dev, "Unsupported color format: %d\n",
|
||||
@@ -476,6 +474,11 @@ static int mtk_dp_set_color_format(struct mtk_dp *mtk_dp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* update MISC0 */
|
||||
mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034,
|
||||
misc0_color,
|
||||
DP_TEST_COLOR_FORMAT_MASK);
|
||||
|
||||
mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,
|
||||
val, PIXEL_ENCODE_FORMAT_DP_ENC0_P0_MASK);
|
||||
return 0;
|
||||
@@ -1949,7 +1952,6 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
|
||||
struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
|
||||
enum drm_connector_status ret = connector_status_disconnected;
|
||||
bool enabled = mtk_dp->enabled;
|
||||
u8 sink_count = 0;
|
||||
|
||||
if (!mtk_dp->train_info.cable_plugged_in)
|
||||
return ret;
|
||||
@@ -1971,8 +1973,8 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
|
||||
* function, we just need to check the HPD connection to check
|
||||
* whether we connect to a sink device.
|
||||
*/
|
||||
drm_dp_dpcd_readb(&mtk_dp->aux, DP_SINK_COUNT, &sink_count);
|
||||
if (DP_GET_SINK_COUNT(sink_count))
|
||||
|
||||
if (drm_dp_read_sink_count(&mtk_dp->aux) > 0)
|
||||
ret = connector_status_connected;
|
||||
|
||||
if (!enabled) {
|
||||
@@ -2274,12 +2276,19 @@ mtk_dp_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
{
|
||||
struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
|
||||
u32 bpp = info->color_formats & DRM_COLOR_FORMAT_YCBCR422 ? 16 : 24;
|
||||
u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) *
|
||||
drm_dp_max_lane_count(mtk_dp->rx_cap),
|
||||
drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) *
|
||||
mtk_dp->max_lanes);
|
||||
u32 lane_count_min = mtk_dp->train_info.lane_count;
|
||||
u32 rate = drm_dp_bw_code_to_link_rate(mtk_dp->train_info.link_rate) *
|
||||
lane_count_min;
|
||||
|
||||
if (rate < mode->clock * bpp / 8)
|
||||
/*
|
||||
*FEC overhead is approximately 2.4% from DP 1.4a spec 2.2.1.4.2.
|
||||
*The down-spread amplitude shall either be disabled (0.0%) or up
|
||||
*to 0.5% from 1.4a 3.5.2.6. Add up to approximately 3% total overhead.
|
||||
*
|
||||
*Because rate is already divided by 10,
|
||||
*mode->clock does not need to be multiplied by 10
|
||||
*/
|
||||
if ((rate * 97 / 100) < (mode->clock * bpp / 8))
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
||||
return MODE_OK;
|
||||
@@ -2320,10 +2329,9 @@ static u32 *mtk_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
|
||||
struct drm_display_mode *mode = &crtc_state->adjusted_mode;
|
||||
struct drm_display_info *display_info =
|
||||
&conn_state->connector->display_info;
|
||||
u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) *
|
||||
drm_dp_max_lane_count(mtk_dp->rx_cap),
|
||||
drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) *
|
||||
mtk_dp->max_lanes);
|
||||
u32 lane_count_min = mtk_dp->train_info.lane_count;
|
||||
u32 rate = drm_dp_bw_code_to_link_rate(mtk_dp->train_info.link_rate) *
|
||||
lane_count_min;
|
||||
|
||||
*num_input_fmts = 0;
|
||||
|
||||
@@ -2332,8 +2340,8 @@ static u32 *mtk_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
|
||||
* datarate of YUV422 and sink device supports YUV422, we output YUV422
|
||||
* format. Use this condition, we can support more resolution.
|
||||
*/
|
||||
if ((rate < (mode->clock * 24 / 8)) &&
|
||||
(rate > (mode->clock * 16 / 8)) &&
|
||||
if (((rate * 97 / 100) < (mode->clock * 24 / 8)) &&
|
||||
((rate * 97 / 100) > (mode->clock * 16 / 8)) &&
|
||||
(display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {
|
||||
input_fmts = kcalloc(1, sizeof(*input_fmts), GFP_KERNEL);
|
||||
if (!input_fmts)
|
||||
|
||||
@@ -441,7 +441,7 @@ static int ebs_iterate_devices(struct dm_target *ti,
|
||||
static struct target_type ebs_target = {
|
||||
.name = "ebs",
|
||||
.version = {1, 0, 1},
|
||||
.features = DM_TARGET_PASSES_INTEGRITY,
|
||||
.features = 0,
|
||||
.module = THIS_MODULE,
|
||||
.ctr = ebs_ctr,
|
||||
.dtr = ebs_dtr,
|
||||
|
||||
@@ -2306,10 +2306,9 @@ static struct thin_c *get_first_thin(struct pool *pool)
|
||||
struct thin_c *tc = NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
if (!list_empty(&pool->active_thins)) {
|
||||
tc = list_entry_rcu(pool->active_thins.next, struct thin_c, list);
|
||||
tc = list_first_or_null_rcu(&pool->active_thins, struct thin_c, list);
|
||||
if (tc)
|
||||
thin_get(tc);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return tc;
|
||||
|
||||
@@ -912,23 +912,27 @@ static int load_ablock(struct dm_array_cursor *c)
|
||||
if (c->block)
|
||||
unlock_ablock(c->info, c->block);
|
||||
|
||||
c->block = NULL;
|
||||
c->ab = NULL;
|
||||
c->index = 0;
|
||||
|
||||
r = dm_btree_cursor_get_value(&c->cursor, &key, &value_le);
|
||||
if (r) {
|
||||
DMERR("dm_btree_cursor_get_value failed");
|
||||
dm_btree_cursor_end(&c->cursor);
|
||||
goto out;
|
||||
|
||||
} else {
|
||||
r = get_ablock(c->info, le64_to_cpu(value_le), &c->block, &c->ab);
|
||||
if (r) {
|
||||
DMERR("get_ablock failed");
|
||||
dm_btree_cursor_end(&c->cursor);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
dm_btree_cursor_end(&c->cursor);
|
||||
c->block = NULL;
|
||||
c->ab = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -951,10 +955,10 @@ EXPORT_SYMBOL_GPL(dm_array_cursor_begin);
|
||||
|
||||
void dm_array_cursor_end(struct dm_array_cursor *c)
|
||||
{
|
||||
if (c->block) {
|
||||
if (c->block)
|
||||
unlock_ablock(c->info, c->block);
|
||||
dm_btree_cursor_end(&c->cursor);
|
||||
}
|
||||
|
||||
dm_btree_cursor_end(&c->cursor);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_array_cursor_end);
|
||||
|
||||
@@ -994,6 +998,7 @@ int dm_array_cursor_skip(struct dm_array_cursor *c, uint32_t count)
|
||||
}
|
||||
|
||||
count -= remaining;
|
||||
c->index += (remaining - 1);
|
||||
r = dm_array_cursor_next(c);
|
||||
|
||||
} while (!r);
|
||||
|
||||
@@ -252,7 +252,7 @@ static int bnxt_send_msg(struct bnxt_en_dev *edev, unsigned int ulp_id,
|
||||
|
||||
rc = hwrm_req_replace(bp, req, fw_msg->msg, fw_msg->msg_len);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto drop_req;
|
||||
|
||||
hwrm_req_timeout(bp, req, fw_msg->timeout);
|
||||
resp = hwrm_req_hold(bp, req);
|
||||
@@ -264,6 +264,7 @@ static int bnxt_send_msg(struct bnxt_en_dev *edev, unsigned int ulp_id,
|
||||
|
||||
memcpy(fw_msg->resp, resp, resp_len);
|
||||
}
|
||||
drop_req:
|
||||
hwrm_req_drop(bp, req);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1800,7 +1800,10 @@ void cxgb4_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid,
|
||||
struct adapter *adap = container_of(t, struct adapter, tids);
|
||||
struct sk_buff *skb;
|
||||
|
||||
WARN_ON(tid_out_of_range(&adap->tids, tid));
|
||||
if (tid_out_of_range(&adap->tids, tid)) {
|
||||
dev_err(adap->pdev_dev, "tid %d out of range\n", tid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (t->tid_tab[tid - adap->tids.tid_base]) {
|
||||
t->tid_tab[tid - adap->tids.tid_base] = NULL;
|
||||
|
||||
@@ -359,9 +359,9 @@ const struct ice_vernier_info_e822 e822_vernier[NUM_ICE_PTP_LNK_SPD] = {
|
||||
/* rx_desk_rsgb_par */
|
||||
644531250, /* 644.53125 MHz Reed Solomon gearbox */
|
||||
/* tx_desk_rsgb_pcs */
|
||||
644531250, /* 644.53125 MHz Reed Solomon gearbox */
|
||||
390625000, /* 390.625 MHz Reed Solomon gearbox */
|
||||
/* rx_desk_rsgb_pcs */
|
||||
644531250, /* 644.53125 MHz Reed Solomon gearbox */
|
||||
390625000, /* 390.625 MHz Reed Solomon gearbox */
|
||||
/* tx_fixed_delay */
|
||||
1620,
|
||||
/* pmd_adj_divisor */
|
||||
|
||||
@@ -1003,6 +1003,7 @@ static void cmd_work_handler(struct work_struct *work)
|
||||
complete(&ent->done);
|
||||
}
|
||||
up(&cmd->vars.sem);
|
||||
complete(&ent->slotted);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -3078,7 +3078,11 @@ static int ca8210_probe(struct spi_device *spi_device)
|
||||
spi_set_drvdata(priv->spi, priv);
|
||||
if (IS_ENABLED(CONFIG_IEEE802154_CA8210_DEBUGFS)) {
|
||||
cascoda_api_upstream = ca8210_test_int_driver_write;
|
||||
ca8210_test_interface_init(priv);
|
||||
ret = ca8210_test_interface_init(priv);
|
||||
if (ret) {
|
||||
dev_crit(&spi_device->dev, "ca8210_test_interface_init failed\n");
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
cascoda_api_upstream = NULL;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <linux/in.h>
|
||||
|
||||
#define AFS_MAXCELLNAME 256 /* Maximum length of a cell name */
|
||||
#define AFS_MAXCELLNAME 253 /* Maximum length of a cell name (DNS limited) */
|
||||
#define AFS_MAXVOLNAME 64 /* Maximum length of a volume name */
|
||||
#define AFS_MAXNSERVERS 8 /* Maximum servers in a basic volume record */
|
||||
#define AFS_NMAXNSERVERS 13 /* Maximum servers in a N/U-class volume record */
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define AFS_VL_PORT 7003 /* volume location service port */
|
||||
#define VL_SERVICE 52 /* RxRPC service ID for the Volume Location service */
|
||||
#define YFS_VL_SERVICE 2503 /* Service ID for AuriStor upgraded VL service */
|
||||
#define YFS_VL_MAXCELLNAME 256 /* Maximum length of a cell name in YFS protocol */
|
||||
|
||||
enum AFSVL_Operations {
|
||||
VLGETENTRYBYID = 503, /* AFS Get VLDB entry by ID */
|
||||
|
||||
@@ -302,6 +302,7 @@ static char *afs_vl_get_cell_name(struct afs_cell *cell, struct key *key)
|
||||
static int yfs_check_canonical_cell_name(struct afs_cell *cell, struct key *key)
|
||||
{
|
||||
struct afs_cell *master;
|
||||
size_t name_len;
|
||||
char *cell_name;
|
||||
|
||||
cell_name = afs_vl_get_cell_name(cell, key);
|
||||
@@ -313,8 +314,11 @@ static int yfs_check_canonical_cell_name(struct afs_cell *cell, struct key *key)
|
||||
return 0;
|
||||
}
|
||||
|
||||
master = afs_lookup_cell(cell->net, cell_name, strlen(cell_name),
|
||||
NULL, false);
|
||||
name_len = strlen(cell_name);
|
||||
if (!name_len || name_len > AFS_MAXCELLNAME)
|
||||
master = ERR_PTR(-EOPNOTSUPP);
|
||||
else
|
||||
master = afs_lookup_cell(cell->net, cell_name, name_len, NULL, false);
|
||||
kfree(cell_name);
|
||||
if (IS_ERR(master))
|
||||
return PTR_ERR(master);
|
||||
|
||||
@@ -671,7 +671,7 @@ static int afs_deliver_yfsvl_get_cell_name(struct afs_call *call)
|
||||
return ret;
|
||||
|
||||
namesz = ntohl(call->tmp);
|
||||
if (namesz > AFS_MAXCELLNAME)
|
||||
if (namesz > YFS_VL_MAXCELLNAME)
|
||||
return afs_protocol_error(call, afs_eproto_cellname_len);
|
||||
paddedsz = (namesz + 3) & ~3;
|
||||
call->count = namesz;
|
||||
|
||||
@@ -2447,12 +2447,11 @@ retry:
|
||||
|
||||
if (pos < 0) {
|
||||
/*
|
||||
* A rename didn't occur, but somehow we didn't end up where
|
||||
* we thought we would. Throw a warning and try again.
|
||||
* The path is longer than PATH_MAX and this function
|
||||
* cannot ever succeed. Creating paths that long is
|
||||
* possible with Ceph, but Linux cannot use them.
|
||||
*/
|
||||
pr_warn("build_path did not end path lookup where "
|
||||
"expected, pos is %d\n", pos);
|
||||
goto retry;
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
}
|
||||
|
||||
*pbase = base;
|
||||
|
||||
@@ -125,7 +125,7 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent
|
||||
type = exfat_get_entry_type(ep);
|
||||
if (type == TYPE_UNUSED) {
|
||||
brelse(bh);
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (type != TYPE_FILE && type != TYPE_DIR) {
|
||||
@@ -185,6 +185,7 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
dir_entry->namebuf.lfn[0] = '\0';
|
||||
*cpos = EXFAT_DEN_TO_B(dentry);
|
||||
return 0;
|
||||
|
||||
@@ -216,6 +216,16 @@ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain
|
||||
|
||||
if (err)
|
||||
goto dec_used_clus;
|
||||
|
||||
if (num_clusters >= sbi->num_clusters - EXFAT_FIRST_CLUSTER) {
|
||||
/*
|
||||
* The cluster chain includes a loop, scan the
|
||||
* bitmap to get the number of used clusters.
|
||||
*/
|
||||
exfat_count_used_clusters(sb, &sbi->used_clusters);
|
||||
|
||||
return 0;
|
||||
}
|
||||
} while (clu != EXFAT_EOF_CLUSTER);
|
||||
}
|
||||
|
||||
|
||||
@@ -811,9 +811,9 @@ start_journal_io:
|
||||
/*
|
||||
* If the journal is not located on the file system device,
|
||||
* then we must flush the file system device before we issue
|
||||
* the commit record
|
||||
* the commit record and update the journal tail sequence.
|
||||
*/
|
||||
if (commit_transaction->t_need_data_flush &&
|
||||
if ((commit_transaction->t_need_data_flush || update_tail) &&
|
||||
(journal->j_fs_dev != journal->j_dev) &&
|
||||
(journal->j_flags & JBD2_BARRIER))
|
||||
blkdev_issue_flush(journal->j_fs_dev);
|
||||
|
||||
@@ -654,7 +654,7 @@ static void flush_descriptor(journal_t *journal,
|
||||
set_buffer_jwrite(descriptor);
|
||||
BUFFER_TRACE(descriptor, "write");
|
||||
set_buffer_dirty(descriptor);
|
||||
write_dirty_buffer(descriptor, REQ_SYNC);
|
||||
write_dirty_buffer(descriptor, JBD2_JOURNAL_REQ_FLAGS);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -712,6 +712,9 @@ void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status)
|
||||
struct smb2_hdr *rsp_hdr;
|
||||
struct ksmbd_work *in_work = ksmbd_alloc_work_struct();
|
||||
|
||||
if (!in_work)
|
||||
return;
|
||||
|
||||
if (allocate_interim_rsp_buf(in_work)) {
|
||||
pr_err("smb_allocate_rsp_buf failed!\n");
|
||||
ksmbd_free_work_struct(in_work);
|
||||
|
||||
@@ -1249,6 +1249,8 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
|
||||
filepath,
|
||||
flags,
|
||||
path);
|
||||
if (!is_last)
|
||||
next[0] = '/';
|
||||
if (err)
|
||||
goto out2;
|
||||
else if (is_last)
|
||||
@@ -1256,7 +1258,6 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
|
||||
path_put(parent_path);
|
||||
*parent_path = *path;
|
||||
|
||||
next[0] = '/';
|
||||
remain_len -= filename_len + 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/kasan.h>
|
||||
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
|
||||
@@ -88,6 +89,7 @@ static inline int object_is_on_stack(const void *obj)
|
||||
{
|
||||
void *stack = task_stack_page(current);
|
||||
|
||||
obj = kasan_reset_tag(obj);
|
||||
return (obj >= stack) && (obj < (stack + THREAD_SIZE));
|
||||
}
|
||||
|
||||
|
||||
@@ -286,7 +286,7 @@ static inline int inet_csk_reqsk_queue_len(const struct sock *sk)
|
||||
|
||||
static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
|
||||
{
|
||||
return inet_csk_reqsk_queue_len(sk) >= sk->sk_max_ack_backlog;
|
||||
return inet_csk_reqsk_queue_len(sk) > READ_ONCE(sk->sk_max_ack_backlog);
|
||||
}
|
||||
|
||||
bool inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req);
|
||||
|
||||
@@ -55,11 +55,11 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
goto drop;
|
||||
|
||||
rcu_read_lock();
|
||||
proto = find_snap_client(skb_transport_header(skb));
|
||||
proto = find_snap_client(skb->data);
|
||||
if (proto) {
|
||||
/* Pass the frame on. */
|
||||
skb->transport_header += 5;
|
||||
skb_pull_rcsum(skb, 5);
|
||||
skb_reset_transport_header(skb);
|
||||
rc = proto->rcvfunc(skb, dev, &snap_packet_type, orig_dev);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -1004,9 +1004,9 @@ static bool adv_use_rpa(struct hci_dev *hdev, uint32_t flags)
|
||||
|
||||
static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)
|
||||
{
|
||||
/* If we're advertising or initiating an LE connection we can't
|
||||
* go ahead and change the random address at this time. This is
|
||||
* because the eventual initiator address used for the
|
||||
/* If a random_addr has been set we're advertising or initiating an LE
|
||||
* connection we can't go ahead and change the random address at this
|
||||
* time. This is because the eventual initiator address used for the
|
||||
* subsequently created connection will be undefined (some
|
||||
* controllers use the new address and others the one we had
|
||||
* when the operation started).
|
||||
@@ -1014,8 +1014,9 @@ static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)
|
||||
* In this kind of scenario skip the update and let the random
|
||||
* address be updated at the next cycle.
|
||||
*/
|
||||
if (hci_dev_test_flag(hdev, HCI_LE_ADV) ||
|
||||
hci_lookup_le_connect(hdev)) {
|
||||
if (bacmp(&hdev->random_addr, BDADDR_ANY) &&
|
||||
(hci_dev_test_flag(hdev, HCI_LE_ADV) ||
|
||||
hci_lookup_le_connect(hdev))) {
|
||||
bt_dev_dbg(hdev, "Deferring random address update");
|
||||
hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
|
||||
return 0;
|
||||
|
||||
@@ -411,7 +411,7 @@ static void *sock_map_lookup_sys(struct bpf_map *map, void *key)
|
||||
static int __sock_map_delete(struct bpf_stab *stab, struct sock *sk_test,
|
||||
struct sock **psk)
|
||||
{
|
||||
struct sock *sk;
|
||||
struct sock *sk = NULL;
|
||||
int err = 0;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -419,8 +419,8 @@ static int __sock_map_delete(struct bpf_stab *stab, struct sock *sk_test,
|
||||
return -EOPNOTSUPP; /* locks here are hardirq-unsafe */
|
||||
|
||||
raw_spin_lock_irqsave(&stab->lock, flags);
|
||||
sk = *psk;
|
||||
if (!sk_test || sk_test == sk)
|
||||
|
||||
if (!sk_test || sk_test == *psk)
|
||||
sk = xchg(psk, NULL);
|
||||
|
||||
if (likely(sk))
|
||||
|
||||
@@ -832,7 +832,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
sock_net_set(ctl_sk, net);
|
||||
if (sk) {
|
||||
ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
|
||||
inet_twsk(sk)->tw_mark : sk->sk_mark;
|
||||
inet_twsk(sk)->tw_mark : READ_ONCE(sk->sk_mark);
|
||||
ctl_sk->sk_priority = (sk->sk_state == TCP_TIME_WAIT) ?
|
||||
inet_twsk(sk)->tw_priority : sk->sk_priority;
|
||||
transmit_time = tcp_transmit_time(sk);
|
||||
|
||||
@@ -2595,12 +2595,15 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
|
||||
struct hlist_nulls_head *hash;
|
||||
unsigned int nr_slots, i;
|
||||
|
||||
if (*sizep > (UINT_MAX / sizeof(struct hlist_nulls_head)))
|
||||
if (*sizep > (INT_MAX / sizeof(struct hlist_nulls_head)))
|
||||
return NULL;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct hlist_nulls_head) != sizeof(struct hlist_head));
|
||||
nr_slots = *sizep = roundup(*sizep, PAGE_SIZE / sizeof(struct hlist_nulls_head));
|
||||
|
||||
if (nr_slots > (INT_MAX / sizeof(struct hlist_nulls_head)))
|
||||
return NULL;
|
||||
|
||||
hash = kvcalloc(nr_slots, sizeof(struct hlist_nulls_head), GFP_KERNEL);
|
||||
|
||||
if (hash && nulls)
|
||||
|
||||
@@ -7979,6 +7979,7 @@ static void nft_unregister_flowtable_hook(struct net *net,
|
||||
}
|
||||
|
||||
static void __nft_unregister_flowtable_net_hooks(struct net *net,
|
||||
struct nft_flowtable *flowtable,
|
||||
struct list_head *hook_list,
|
||||
bool release_netdev)
|
||||
{
|
||||
@@ -7986,6 +7987,8 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,
|
||||
|
||||
list_for_each_entry_safe(hook, next, hook_list, list) {
|
||||
nf_unregister_net_hook(net, &hook->ops);
|
||||
flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
|
||||
FLOW_BLOCK_UNBIND);
|
||||
if (release_netdev) {
|
||||
list_del(&hook->list);
|
||||
kfree_rcu(hook, rcu);
|
||||
@@ -7994,9 +7997,10 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,
|
||||
}
|
||||
|
||||
static void nft_unregister_flowtable_net_hooks(struct net *net,
|
||||
struct nft_flowtable *flowtable,
|
||||
struct list_head *hook_list)
|
||||
{
|
||||
__nft_unregister_flowtable_net_hooks(net, hook_list, false);
|
||||
__nft_unregister_flowtable_net_hooks(net, flowtable, hook_list, false);
|
||||
}
|
||||
|
||||
static int nft_register_flowtable_net_hooks(struct net *net,
|
||||
@@ -8618,8 +8622,6 @@ static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
|
||||
|
||||
flowtable->data.type->free(&flowtable->data);
|
||||
list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
|
||||
flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
|
||||
FLOW_BLOCK_UNBIND);
|
||||
list_del_rcu(&hook->list);
|
||||
kfree_rcu(hook, rcu);
|
||||
}
|
||||
@@ -9902,6 +9904,7 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
|
||||
&nft_trans_flowtable_hooks(trans),
|
||||
NFT_MSG_DELFLOWTABLE);
|
||||
nft_unregister_flowtable_net_hooks(net,
|
||||
nft_trans_flowtable(trans),
|
||||
&nft_trans_flowtable_hooks(trans));
|
||||
} else {
|
||||
list_del_rcu(&nft_trans_flowtable(trans)->list);
|
||||
@@ -9910,6 +9913,7 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
|
||||
&nft_trans_flowtable(trans)->hook_list,
|
||||
NFT_MSG_DELFLOWTABLE);
|
||||
nft_unregister_flowtable_net_hooks(net,
|
||||
nft_trans_flowtable(trans),
|
||||
&nft_trans_flowtable(trans)->hook_list);
|
||||
}
|
||||
break;
|
||||
@@ -10140,11 +10144,13 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
|
||||
case NFT_MSG_NEWFLOWTABLE:
|
||||
if (nft_trans_flowtable_update(trans)) {
|
||||
nft_unregister_flowtable_net_hooks(net,
|
||||
nft_trans_flowtable(trans),
|
||||
&nft_trans_flowtable_hooks(trans));
|
||||
} else {
|
||||
nft_use_dec_restore(&trans->ctx.table->use);
|
||||
list_del_rcu(&nft_trans_flowtable(trans)->list);
|
||||
nft_unregister_flowtable_net_hooks(net,
|
||||
nft_trans_flowtable(trans),
|
||||
&nft_trans_flowtable(trans)->hook_list);
|
||||
}
|
||||
break;
|
||||
@@ -10685,7 +10691,8 @@ static void __nft_release_hook(struct net *net, struct nft_table *table)
|
||||
list_for_each_entry(chain, &table->chains, list)
|
||||
__nf_tables_unregister_hook(net, table, chain, true);
|
||||
list_for_each_entry(flowtable, &table->flowtables, list)
|
||||
__nft_unregister_flowtable_net_hooks(net, &flowtable->hook_list,
|
||||
__nft_unregister_flowtable_net_hooks(net, flowtable,
|
||||
&flowtable->hook_list,
|
||||
true);
|
||||
}
|
||||
|
||||
|
||||
@@ -354,7 +354,8 @@ static const struct nla_policy flow_policy[TCA_FLOW_MAX + 1] = {
|
||||
[TCA_FLOW_KEYS] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_MODE] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_BASECLASS] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_RSHIFT] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_RSHIFT] = NLA_POLICY_MAX(NLA_U32,
|
||||
31 /* BITS_PER_U32 - 1 */),
|
||||
[TCA_FLOW_ADDEND] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_MASK] = { .type = NLA_U32 },
|
||||
[TCA_FLOW_XOR] = { .type = NLA_U32 },
|
||||
|
||||
@@ -643,6 +643,63 @@ static bool cake_ddst(int flow_mode)
|
||||
return (flow_mode & CAKE_FLOW_DUAL_DST) == CAKE_FLOW_DUAL_DST;
|
||||
}
|
||||
|
||||
static void cake_dec_srchost_bulk_flow_count(struct cake_tin_data *q,
|
||||
struct cake_flow *flow,
|
||||
int flow_mode)
|
||||
{
|
||||
if (likely(cake_dsrc(flow_mode) &&
|
||||
q->hosts[flow->srchost].srchost_bulk_flow_count))
|
||||
q->hosts[flow->srchost].srchost_bulk_flow_count--;
|
||||
}
|
||||
|
||||
static void cake_inc_srchost_bulk_flow_count(struct cake_tin_data *q,
|
||||
struct cake_flow *flow,
|
||||
int flow_mode)
|
||||
{
|
||||
if (likely(cake_dsrc(flow_mode) &&
|
||||
q->hosts[flow->srchost].srchost_bulk_flow_count < CAKE_QUEUES))
|
||||
q->hosts[flow->srchost].srchost_bulk_flow_count++;
|
||||
}
|
||||
|
||||
static void cake_dec_dsthost_bulk_flow_count(struct cake_tin_data *q,
|
||||
struct cake_flow *flow,
|
||||
int flow_mode)
|
||||
{
|
||||
if (likely(cake_ddst(flow_mode) &&
|
||||
q->hosts[flow->dsthost].dsthost_bulk_flow_count))
|
||||
q->hosts[flow->dsthost].dsthost_bulk_flow_count--;
|
||||
}
|
||||
|
||||
static void cake_inc_dsthost_bulk_flow_count(struct cake_tin_data *q,
|
||||
struct cake_flow *flow,
|
||||
int flow_mode)
|
||||
{
|
||||
if (likely(cake_ddst(flow_mode) &&
|
||||
q->hosts[flow->dsthost].dsthost_bulk_flow_count < CAKE_QUEUES))
|
||||
q->hosts[flow->dsthost].dsthost_bulk_flow_count++;
|
||||
}
|
||||
|
||||
static u16 cake_get_flow_quantum(struct cake_tin_data *q,
|
||||
struct cake_flow *flow,
|
||||
int flow_mode)
|
||||
{
|
||||
u16 host_load = 1;
|
||||
|
||||
if (cake_dsrc(flow_mode))
|
||||
host_load = max(host_load,
|
||||
q->hosts[flow->srchost].srchost_bulk_flow_count);
|
||||
|
||||
if (cake_ddst(flow_mode))
|
||||
host_load = max(host_load,
|
||||
q->hosts[flow->dsthost].dsthost_bulk_flow_count);
|
||||
|
||||
/* The get_random_u16() is a way to apply dithering to avoid
|
||||
* accumulating roundoff errors
|
||||
*/
|
||||
return (q->flow_quantum * quantum_div[host_load] +
|
||||
get_random_u16()) >> 16;
|
||||
}
|
||||
|
||||
static u32 cake_hash(struct cake_tin_data *q, const struct sk_buff *skb,
|
||||
int flow_mode, u16 flow_override, u16 host_override)
|
||||
{
|
||||
@@ -789,10 +846,8 @@ skip_hash:
|
||||
allocate_dst = cake_ddst(flow_mode);
|
||||
|
||||
if (q->flows[outer_hash + k].set == CAKE_SET_BULK) {
|
||||
if (allocate_src)
|
||||
q->hosts[q->flows[reduced_hash].srchost].srchost_bulk_flow_count--;
|
||||
if (allocate_dst)
|
||||
q->hosts[q->flows[reduced_hash].dsthost].dsthost_bulk_flow_count--;
|
||||
cake_dec_srchost_bulk_flow_count(q, &q->flows[outer_hash + k], flow_mode);
|
||||
cake_dec_dsthost_bulk_flow_count(q, &q->flows[outer_hash + k], flow_mode);
|
||||
}
|
||||
found:
|
||||
/* reserve queue for future packets in same flow */
|
||||
@@ -817,9 +872,10 @@ found:
|
||||
q->hosts[outer_hash + k].srchost_tag = srchost_hash;
|
||||
found_src:
|
||||
srchost_idx = outer_hash + k;
|
||||
if (q->flows[reduced_hash].set == CAKE_SET_BULK)
|
||||
q->hosts[srchost_idx].srchost_bulk_flow_count++;
|
||||
q->flows[reduced_hash].srchost = srchost_idx;
|
||||
|
||||
if (q->flows[reduced_hash].set == CAKE_SET_BULK)
|
||||
cake_inc_srchost_bulk_flow_count(q, &q->flows[reduced_hash], flow_mode);
|
||||
}
|
||||
|
||||
if (allocate_dst) {
|
||||
@@ -840,9 +896,10 @@ found_src:
|
||||
q->hosts[outer_hash + k].dsthost_tag = dsthost_hash;
|
||||
found_dst:
|
||||
dsthost_idx = outer_hash + k;
|
||||
if (q->flows[reduced_hash].set == CAKE_SET_BULK)
|
||||
q->hosts[dsthost_idx].dsthost_bulk_flow_count++;
|
||||
q->flows[reduced_hash].dsthost = dsthost_idx;
|
||||
|
||||
if (q->flows[reduced_hash].set == CAKE_SET_BULK)
|
||||
cake_inc_dsthost_bulk_flow_count(q, &q->flows[reduced_hash], flow_mode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1855,10 +1912,6 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
|
||||
/* flowchain */
|
||||
if (!flow->set || flow->set == CAKE_SET_DECAYING) {
|
||||
struct cake_host *srchost = &b->hosts[flow->srchost];
|
||||
struct cake_host *dsthost = &b->hosts[flow->dsthost];
|
||||
u16 host_load = 1;
|
||||
|
||||
if (!flow->set) {
|
||||
list_add_tail(&flow->flowchain, &b->new_flows);
|
||||
} else {
|
||||
@@ -1868,18 +1921,8 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
flow->set = CAKE_SET_SPARSE;
|
||||
b->sparse_flow_count++;
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
host_load = max(host_load, srchost->srchost_bulk_flow_count);
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
host_load = max(host_load, dsthost->dsthost_bulk_flow_count);
|
||||
|
||||
flow->deficit = (b->flow_quantum *
|
||||
quantum_div[host_load]) >> 16;
|
||||
flow->deficit = cake_get_flow_quantum(b, flow, q->flow_mode);
|
||||
} else if (flow->set == CAKE_SET_SPARSE_WAIT) {
|
||||
struct cake_host *srchost = &b->hosts[flow->srchost];
|
||||
struct cake_host *dsthost = &b->hosts[flow->dsthost];
|
||||
|
||||
/* this flow was empty, accounted as a sparse flow, but actually
|
||||
* in the bulk rotation.
|
||||
*/
|
||||
@@ -1887,12 +1930,8 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
b->sparse_flow_count--;
|
||||
b->bulk_flow_count++;
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
srchost->srchost_bulk_flow_count++;
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
dsthost->dsthost_bulk_flow_count++;
|
||||
|
||||
cake_inc_srchost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
cake_inc_dsthost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
}
|
||||
|
||||
if (q->buffer_used > q->buffer_max_used)
|
||||
@@ -1949,13 +1988,11 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch)
|
||||
{
|
||||
struct cake_sched_data *q = qdisc_priv(sch);
|
||||
struct cake_tin_data *b = &q->tins[q->cur_tin];
|
||||
struct cake_host *srchost, *dsthost;
|
||||
ktime_t now = ktime_get();
|
||||
struct cake_flow *flow;
|
||||
struct list_head *head;
|
||||
bool first_flow = true;
|
||||
struct sk_buff *skb;
|
||||
u16 host_load;
|
||||
u64 delay;
|
||||
u32 len;
|
||||
|
||||
@@ -2055,11 +2092,6 @@ retry:
|
||||
q->cur_flow = flow - b->flows;
|
||||
first_flow = false;
|
||||
|
||||
/* triple isolation (modified DRR++) */
|
||||
srchost = &b->hosts[flow->srchost];
|
||||
dsthost = &b->hosts[flow->dsthost];
|
||||
host_load = 1;
|
||||
|
||||
/* flow isolation (DRR++) */
|
||||
if (flow->deficit <= 0) {
|
||||
/* Keep all flows with deficits out of the sparse and decaying
|
||||
@@ -2071,11 +2103,8 @@ retry:
|
||||
b->sparse_flow_count--;
|
||||
b->bulk_flow_count++;
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
srchost->srchost_bulk_flow_count++;
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
dsthost->dsthost_bulk_flow_count++;
|
||||
cake_inc_srchost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
cake_inc_dsthost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
|
||||
flow->set = CAKE_SET_BULK;
|
||||
} else {
|
||||
@@ -2087,19 +2116,7 @@ retry:
|
||||
}
|
||||
}
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
host_load = max(host_load, srchost->srchost_bulk_flow_count);
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
host_load = max(host_load, dsthost->dsthost_bulk_flow_count);
|
||||
|
||||
WARN_ON(host_load > CAKE_QUEUES);
|
||||
|
||||
/* The get_random_u16() is a way to apply dithering to avoid
|
||||
* accumulating roundoff errors
|
||||
*/
|
||||
flow->deficit += (b->flow_quantum * quantum_div[host_load] +
|
||||
get_random_u16()) >> 16;
|
||||
flow->deficit += cake_get_flow_quantum(b, flow, q->flow_mode);
|
||||
list_move_tail(&flow->flowchain, &b->old_flows);
|
||||
|
||||
goto retry;
|
||||
@@ -2123,11 +2140,8 @@ retry:
|
||||
if (flow->set == CAKE_SET_BULK) {
|
||||
b->bulk_flow_count--;
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
srchost->srchost_bulk_flow_count--;
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
dsthost->dsthost_bulk_flow_count--;
|
||||
cake_dec_srchost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
cake_dec_dsthost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
|
||||
b->decaying_flow_count++;
|
||||
} else if (flow->set == CAKE_SET_SPARSE ||
|
||||
@@ -2145,12 +2159,8 @@ retry:
|
||||
else if (flow->set == CAKE_SET_BULK) {
|
||||
b->bulk_flow_count--;
|
||||
|
||||
if (cake_dsrc(q->flow_mode))
|
||||
srchost->srchost_bulk_flow_count--;
|
||||
|
||||
if (cake_ddst(q->flow_mode))
|
||||
dsthost->dsthost_bulk_flow_count--;
|
||||
|
||||
cake_dec_srchost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
cake_dec_dsthost_bulk_flow_count(b, flow, q->flow_mode);
|
||||
} else
|
||||
b->decaying_flow_count--;
|
||||
|
||||
|
||||
@@ -458,7 +458,7 @@ int tls_tx_records(struct sock *sk, int flags)
|
||||
|
||||
tx_err:
|
||||
if (rc < 0 && rc != -EAGAIN)
|
||||
tls_err_abort(sk, -EBADMSG);
|
||||
tls_err_abort(sk, rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ static inline unsigned long orc_ip(const int *ip)
|
||||
|
||||
static int orc_sort_cmp(const void *_a, const void *_b)
|
||||
{
|
||||
struct orc_entry *orc_a;
|
||||
struct orc_entry *orc_a, *orc_b;
|
||||
const int *a = g_orc_ip_table + *(int *)_a;
|
||||
const int *b = g_orc_ip_table + *(int *)_b;
|
||||
unsigned long a_val = orc_ip(a);
|
||||
@@ -128,6 +128,10 @@ static int orc_sort_cmp(const void *_a, const void *_b)
|
||||
* whitelisted .o files which didn't get objtool generation.
|
||||
*/
|
||||
orc_a = g_orc_table + (a - g_orc_ip_table);
|
||||
orc_b = g_orc_table + (b - g_orc_ip_table);
|
||||
if (orc_a->sp_reg == ORC_REG_UNDEFINED && !orc_a->end &&
|
||||
orc_b->sp_reg == ORC_REG_UNDEFINED && !orc_b->end)
|
||||
return 0;
|
||||
return orc_a->sp_reg == ORC_REG_UNDEFINED && !orc_a->end ? -1 : 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -120,8 +120,8 @@ int mtk_afe_pcm_new(struct snd_soc_component *component,
|
||||
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
|
||||
|
||||
size = afe->mtk_afe_hardware->buffer_bytes_max;
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||
afe->dev, size, size);
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev, 0, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_afe_pcm_new);
|
||||
|
||||
Reference in New Issue
Block a user