mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Merge e10b392a74 ("net: usb: rtl8150: enable basic endpoint checking") into android14-6.1-lts
Steps on the way to 6.1.129 Resolves merge conflicts in: scripts/Makefile.lib Change-Id: Id496f510e74b8576bd71449bf8ffa338072eb8e4 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -54,6 +54,15 @@ KCONFIG_OVERWRITECONFIG
|
||||
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
||||
break symlinks when .config is a symlink to somewhere else.
|
||||
|
||||
KCONFIG_WARN_UNKNOWN_SYMBOLS
|
||||
----------------------------
|
||||
This environment variable makes Kconfig warn about all unrecognized
|
||||
symbols in the config input.
|
||||
|
||||
KCONFIG_WERROR
|
||||
--------------
|
||||
If set, Kconfig treats warnings as errors.
|
||||
|
||||
`CONFIG_`
|
||||
---------
|
||||
If you set `CONFIG_` in the environment, Kconfig will prefix all symbols
|
||||
|
||||
@@ -56,7 +56,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
__typeof__(ptr) __ptr = (ptr); \
|
||||
__typeof__(*(ptr)) __old = (old); \
|
||||
__typeof__(*(ptr)) __new = (new); \
|
||||
__typeof__(*(ptr)) __oldval = 0; \
|
||||
__typeof__(*(ptr)) __oldval = (__typeof__(*(ptr))) 0; \
|
||||
\
|
||||
asm volatile( \
|
||||
"1: %0 = memw_locked(%1);\n" \
|
||||
|
||||
@@ -195,8 +195,10 @@ int die(const char *str, struct pt_regs *regs, long err)
|
||||
printk(KERN_EMERG "Oops: %s[#%d]:\n", str, ++die.counter);
|
||||
|
||||
if (notify_die(DIE_OOPS, str, regs, err, pt_cause(regs), SIGSEGV) ==
|
||||
NOTIFY_STOP)
|
||||
NOTIFY_STOP) {
|
||||
spin_unlock_irq(&die.lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
print_modules();
|
||||
show_regs(regs);
|
||||
|
||||
@@ -209,7 +209,6 @@ struct edma_desc {
|
||||
struct edma_cc;
|
||||
|
||||
struct edma_tc {
|
||||
struct device_node *node;
|
||||
u16 id;
|
||||
};
|
||||
|
||||
@@ -2475,13 +2474,13 @@ static int edma_probe(struct platform_device *pdev)
|
||||
if (ret || i == ecc->num_tc)
|
||||
break;
|
||||
|
||||
ecc->tc_list[i].node = tc_args.np;
|
||||
ecc->tc_list[i].id = i;
|
||||
queue_priority_mapping[i][1] = tc_args.args[0];
|
||||
if (queue_priority_mapping[i][1] > lowest_priority) {
|
||||
lowest_priority = queue_priority_mapping[i][1];
|
||||
info->default_queue = i;
|
||||
}
|
||||
of_node_put(tc_args.np);
|
||||
}
|
||||
|
||||
/* See if we have optional dma-channel-mask array */
|
||||
|
||||
@@ -445,8 +445,7 @@ static int mxc_gpio_probe(struct platform_device *pdev)
|
||||
port->gc.request = gpiochip_generic_request;
|
||||
port->gc.free = gpiochip_generic_free;
|
||||
port->gc.to_irq = mxc_gpio_to_irq;
|
||||
port->gc.base = (pdev->id < 0) ? of_alias_get_id(np, "gpio") * 32 :
|
||||
pdev->id * 32;
|
||||
port->gc.base = of_alias_get_id(np, "gpio") * 32;
|
||||
|
||||
err = devm_gpiochip_add_data(&pdev->dev, &port->gc, port);
|
||||
if (err)
|
||||
|
||||
@@ -83,7 +83,7 @@ static void dc_link_destruct(struct dc_link *link)
|
||||
if (link->panel_cntl)
|
||||
link->panel_cntl->funcs->destroy(&link->panel_cntl);
|
||||
|
||||
if (link->link_enc) {
|
||||
if (link->link_enc && !link->is_dig_mapping_flexible) {
|
||||
/* Update link encoder resource tracking variables. These are used for
|
||||
* the dynamic assignment of link encoders to streams. Virtual links
|
||||
* are not assigned encoder resources on creation.
|
||||
|
||||
@@ -328,8 +328,7 @@
|
||||
#define BGMAC_RX_FRAME_OFFSET 30 /* There are 2 unused bytes between header and real data */
|
||||
#define BGMAC_RX_BUF_OFFSET (NET_SKB_PAD + NET_IP_ALIGN - \
|
||||
BGMAC_RX_FRAME_OFFSET)
|
||||
/* Jumbo frame size with FCS */
|
||||
#define BGMAC_RX_MAX_FRAME_SIZE 9724
|
||||
#define BGMAC_RX_MAX_FRAME_SIZE 1536
|
||||
#define BGMAC_RX_BUF_SIZE (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
|
||||
#define BGMAC_RX_ALLOC_SIZE (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE + BGMAC_RX_BUF_OFFSET) + \
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
|
||||
|
||||
@@ -1778,10 +1778,11 @@ dm9000_drv_remove(struct platform_device *pdev)
|
||||
|
||||
unregister_netdev(ndev);
|
||||
dm9000_release_board(pdev, dm);
|
||||
free_netdev(ndev); /* free device structure */
|
||||
if (dm->power_supply)
|
||||
regulator_disable(dm->power_supply);
|
||||
|
||||
free_netdev(ndev); /* free device structure */
|
||||
|
||||
dev_dbg(&pdev->dev, "released and freed device\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -818,6 +818,8 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
int hdr_len, total_len, data_left;
|
||||
struct bufdesc *bdp = txq->bd.cur;
|
||||
struct bufdesc *tmp_bdp;
|
||||
struct bufdesc_ex *ebdp;
|
||||
struct tso_t tso;
|
||||
unsigned int index = 0;
|
||||
int ret;
|
||||
@@ -891,7 +893,34 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
|
||||
return 0;
|
||||
|
||||
err_release:
|
||||
/* TODO: Release all used data descriptors for TSO */
|
||||
/* Release all used data descriptors for TSO */
|
||||
tmp_bdp = txq->bd.cur;
|
||||
|
||||
while (tmp_bdp != bdp) {
|
||||
/* Unmap data buffers */
|
||||
if (tmp_bdp->cbd_bufaddr &&
|
||||
!IS_TSO_HEADER(txq, fec32_to_cpu(tmp_bdp->cbd_bufaddr)))
|
||||
dma_unmap_single(&fep->pdev->dev,
|
||||
fec32_to_cpu(tmp_bdp->cbd_bufaddr),
|
||||
fec16_to_cpu(tmp_bdp->cbd_datlen),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
/* Clear standard buffer descriptor fields */
|
||||
tmp_bdp->cbd_sc = 0;
|
||||
tmp_bdp->cbd_datlen = 0;
|
||||
tmp_bdp->cbd_bufaddr = 0;
|
||||
|
||||
/* Handle extended descriptor if enabled */
|
||||
if (fep->bufdesc_ex) {
|
||||
ebdp = (struct bufdesc_ex *)tmp_bdp;
|
||||
ebdp->cbd_esc = 0;
|
||||
}
|
||||
|
||||
tmp_bdp = fec_enet_get_nextdesc(tmp_bdp, &txq->bd);
|
||||
}
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,21 @@ EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);
|
||||
*/
|
||||
static DEFINE_MUTEX(hnae3_common_lock);
|
||||
|
||||
/* ensure the drivers being unloaded one by one */
|
||||
static DEFINE_MUTEX(hnae3_unload_lock);
|
||||
|
||||
void hnae3_acquire_unload_lock(void)
|
||||
{
|
||||
mutex_lock(&hnae3_unload_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(hnae3_acquire_unload_lock);
|
||||
|
||||
void hnae3_release_unload_lock(void)
|
||||
{
|
||||
mutex_unlock(&hnae3_unload_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(hnae3_release_unload_lock);
|
||||
|
||||
static bool hnae3_client_match(enum hnae3_client_type client_type)
|
||||
{
|
||||
if (client_type == HNAE3_CLIENT_KNIC ||
|
||||
|
||||
@@ -929,4 +929,6 @@ int hnae3_register_client(struct hnae3_client *client);
|
||||
void hnae3_set_client_init_flag(struct hnae3_client *client,
|
||||
struct hnae3_ae_dev *ae_dev,
|
||||
unsigned int inited);
|
||||
void hnae3_acquire_unload_lock(void);
|
||||
void hnae3_release_unload_lock(void);
|
||||
#endif
|
||||
|
||||
@@ -6007,9 +6007,11 @@ module_init(hns3_init_module);
|
||||
*/
|
||||
static void __exit hns3_exit_module(void)
|
||||
{
|
||||
hnae3_acquire_unload_lock();
|
||||
pci_unregister_driver(&hns3_driver);
|
||||
hnae3_unregister_client(&client);
|
||||
hns3_dbg_unregister_debugfs();
|
||||
hnae3_release_unload_lock();
|
||||
}
|
||||
module_exit(hns3_exit_module);
|
||||
|
||||
|
||||
@@ -13250,9 +13250,11 @@ static int __init hclge_init(void)
|
||||
|
||||
static void __exit hclge_exit(void)
|
||||
{
|
||||
hnae3_acquire_unload_lock();
|
||||
hnae3_unregister_ae_algo_prepare(&ae_algo);
|
||||
hnae3_unregister_ae_algo(&ae_algo);
|
||||
destroy_workqueue(hclge_wq);
|
||||
hnae3_release_unload_lock();
|
||||
}
|
||||
module_init(hclge_init);
|
||||
module_exit(hclge_exit);
|
||||
|
||||
@@ -3468,8 +3468,10 @@ static int __init hclgevf_init(void)
|
||||
|
||||
static void __exit hclgevf_exit(void)
|
||||
{
|
||||
hnae3_acquire_unload_lock();
|
||||
hnae3_unregister_ae_algo(&ae_algovf);
|
||||
destroy_workqueue(hclgevf_wq);
|
||||
hnae3_release_unload_lock();
|
||||
}
|
||||
module_init(hclgevf_init);
|
||||
module_exit(hclgevf_exit);
|
||||
|
||||
@@ -830,6 +830,11 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter,
|
||||
f->state = IAVF_VLAN_ADD;
|
||||
adapter->num_vlan_filters++;
|
||||
iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_ADD_VLAN_FILTER);
|
||||
} else if (f->state == IAVF_VLAN_REMOVE) {
|
||||
/* IAVF_VLAN_REMOVE means that VLAN wasn't yet removed.
|
||||
* We can safely only change the state here.
|
||||
*/
|
||||
f->state = IAVF_VLAN_ACTIVE;
|
||||
}
|
||||
|
||||
clearout:
|
||||
@@ -850,8 +855,18 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan)
|
||||
|
||||
f = iavf_find_vlan(adapter, vlan);
|
||||
if (f) {
|
||||
f->state = IAVF_VLAN_REMOVE;
|
||||
iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_DEL_VLAN_FILTER);
|
||||
/* IAVF_ADD_VLAN means that VLAN wasn't even added yet.
|
||||
* Remove it from the list.
|
||||
*/
|
||||
if (f->state == IAVF_VLAN_ADD) {
|
||||
list_del(&f->list);
|
||||
kfree(f);
|
||||
adapter->num_vlan_filters--;
|
||||
} else {
|
||||
f->state = IAVF_VLAN_REMOVE;
|
||||
iavf_schedule_aq_request(adapter,
|
||||
IAVF_FLAG_AQ_DEL_VLAN_FILTER);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_bh(&adapter->mac_vlan_list_lock);
|
||||
|
||||
@@ -3473,10 +3473,12 @@ static int sh_eth_suspend(struct device *dev)
|
||||
|
||||
netif_device_detach(ndev);
|
||||
|
||||
rtnl_lock();
|
||||
if (mdp->wol_enabled)
|
||||
ret = sh_eth_wol_setup(ndev);
|
||||
else
|
||||
ret = sh_eth_close(ndev);
|
||||
rtnl_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -3490,10 +3492,12 @@ static int sh_eth_resume(struct device *dev)
|
||||
if (!netif_running(ndev))
|
||||
return 0;
|
||||
|
||||
rtnl_lock();
|
||||
if (mdp->wol_enabled)
|
||||
ret = sh_eth_wol_restore(ndev);
|
||||
else
|
||||
ret = sh_eth_open(ndev);
|
||||
rtnl_unlock();
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -98,6 +98,7 @@ struct netdevsim {
|
||||
u32 sleep;
|
||||
u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS];
|
||||
u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS];
|
||||
struct dentry *ddir;
|
||||
struct debugfs_u32_array dfs_ports[2];
|
||||
} udp_ports;
|
||||
|
||||
|
||||
@@ -112,9 +112,11 @@ nsim_udp_tunnels_info_reset_write(struct file *file, const char __user *data,
|
||||
struct net_device *dev = file->private_data;
|
||||
struct netdevsim *ns = netdev_priv(dev);
|
||||
|
||||
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
|
||||
rtnl_lock();
|
||||
udp_tunnel_nic_reset_ntf(dev);
|
||||
if (dev->reg_state == NETREG_REGISTERED) {
|
||||
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
|
||||
udp_tunnel_nic_reset_ntf(dev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
return count;
|
||||
@@ -144,23 +146,23 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
|
||||
else
|
||||
ns->udp_ports.ports = nsim_dev->udp_ports.__ports;
|
||||
|
||||
debugfs_create_u32("udp_ports_inject_error", 0600,
|
||||
ns->nsim_dev_port->ddir,
|
||||
ns->udp_ports.ddir = debugfs_create_dir("udp_ports",
|
||||
ns->nsim_dev_port->ddir);
|
||||
|
||||
debugfs_create_u32("inject_error", 0600, ns->udp_ports.ddir,
|
||||
&ns->udp_ports.inject_error);
|
||||
|
||||
ns->udp_ports.dfs_ports[0].array = ns->udp_ports.ports[0];
|
||||
ns->udp_ports.dfs_ports[0].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
|
||||
debugfs_create_u32_array("udp_ports_table0", 0400,
|
||||
ns->nsim_dev_port->ddir,
|
||||
debugfs_create_u32_array("table0", 0400, ns->udp_ports.ddir,
|
||||
&ns->udp_ports.dfs_ports[0]);
|
||||
|
||||
ns->udp_ports.dfs_ports[1].array = ns->udp_ports.ports[1];
|
||||
ns->udp_ports.dfs_ports[1].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
|
||||
debugfs_create_u32_array("udp_ports_table1", 0400,
|
||||
ns->nsim_dev_port->ddir,
|
||||
debugfs_create_u32_array("table1", 0400, ns->udp_ports.ddir,
|
||||
&ns->udp_ports.dfs_ports[1]);
|
||||
|
||||
debugfs_create_file("udp_ports_reset", 0200, ns->nsim_dev_port->ddir,
|
||||
debugfs_create_file("reset", 0200, ns->udp_ports.ddir,
|
||||
dev, &nsim_udp_tunnels_info_reset_fops);
|
||||
|
||||
/* Note: it's not normal to allocate the info struct like this!
|
||||
@@ -196,6 +198,9 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
|
||||
|
||||
void nsim_udp_tunnels_info_destroy(struct net_device *dev)
|
||||
{
|
||||
struct netdevsim *ns = netdev_priv(dev);
|
||||
|
||||
debugfs_remove_recursive(ns->udp_ports.ddir);
|
||||
kfree(dev->udp_tunnel_nic_info);
|
||||
dev->udp_tunnel_nic_info = NULL;
|
||||
}
|
||||
|
||||
@@ -71,6 +71,14 @@
|
||||
#define MSR_SPEED (1<<3)
|
||||
#define MSR_LINK (1<<2)
|
||||
|
||||
/* USB endpoints */
|
||||
enum rtl8150_usb_ep {
|
||||
RTL8150_USB_EP_CONTROL = 0,
|
||||
RTL8150_USB_EP_BULK_IN = 1,
|
||||
RTL8150_USB_EP_BULK_OUT = 2,
|
||||
RTL8150_USB_EP_INT_IN = 3,
|
||||
};
|
||||
|
||||
/* Interrupt pipe data */
|
||||
#define INT_TSR 0x00
|
||||
#define INT_RSR 0x01
|
||||
@@ -867,6 +875,13 @@ static int rtl8150_probe(struct usb_interface *intf,
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
rtl8150_t *dev;
|
||||
struct net_device *netdev;
|
||||
static const u8 bulk_ep_addr[] = {
|
||||
RTL8150_USB_EP_BULK_IN | USB_DIR_IN,
|
||||
RTL8150_USB_EP_BULK_OUT | USB_DIR_OUT,
|
||||
0};
|
||||
static const u8 int_ep_addr[] = {
|
||||
RTL8150_USB_EP_INT_IN | USB_DIR_IN,
|
||||
0};
|
||||
|
||||
netdev = alloc_etherdev(sizeof(rtl8150_t));
|
||||
if (!netdev)
|
||||
@@ -880,6 +895,13 @@ static int rtl8150_probe(struct usb_interface *intf,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Verify that all required endpoints are present */
|
||||
if (!usb_check_bulk_endpoints(intf, bulk_ep_addr) ||
|
||||
!usb_check_int_endpoints(intf, int_ep_addr)) {
|
||||
dev_err(&intf->dev, "couldn't find required endpoints\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
tasklet_setup(&dev->tl, rx_fixup);
|
||||
spin_lock_init(&dev->rx_pool_lock);
|
||||
|
||||
|
||||
@@ -411,6 +411,11 @@ static int vxlan_vnifilter_dump(struct sk_buff *skb, struct netlink_callback *cb
|
||||
struct tunnel_msg *tmsg;
|
||||
struct net_device *dev;
|
||||
|
||||
if (cb->nlh->nlmsg_len < nlmsg_msg_size(sizeof(struct tunnel_msg))) {
|
||||
NL_SET_ERR_MSG(cb->extack, "Invalid msg length");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
tmsg = nlmsg_data(cb->nlh);
|
||||
|
||||
if (tmsg->flags & ~TUNNEL_MSG_VALID_USER_FLAGS) {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Copyright (c) 2011-2014, Intel Corporation.
|
||||
* Copyright (c) 2017-2021 Christoph Hellwig.
|
||||
*/
|
||||
#include <linux/blk-integrity.h>
|
||||
#include <linux/ptrace.h> /* for force_successful_syscall_return */
|
||||
#include <linux/nvme_ioctl.h>
|
||||
#include <linux/io_uring.h>
|
||||
@@ -95,10 +96,15 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
|
||||
struct request_queue *q = req->q;
|
||||
struct nvme_ns *ns = q->queuedata;
|
||||
struct block_device *bdev = ns ? ns->disk->part0 : NULL;
|
||||
bool supports_metadata = bdev && blk_get_integrity(bdev->bd_disk);
|
||||
bool has_metadata = meta_buffer && meta_len;
|
||||
struct bio *bio = NULL;
|
||||
void *meta = NULL;
|
||||
int ret;
|
||||
|
||||
if (has_metadata && !supports_metadata)
|
||||
return -EINVAL;
|
||||
|
||||
if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) {
|
||||
struct iov_iter iter;
|
||||
|
||||
@@ -122,7 +128,7 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
|
||||
if (bdev)
|
||||
bio_set_dev(bio, bdev);
|
||||
|
||||
if (bdev && meta_buffer && meta_len) {
|
||||
if (has_metadata) {
|
||||
meta = nvme_add_user_metadata(req, meta_buffer, meta_len,
|
||||
meta_seed);
|
||||
if (IS_ERR(meta)) {
|
||||
|
||||
@@ -4897,7 +4897,7 @@ int regulator_bulk_get(struct device *dev, int num_consumers,
|
||||
consumers[i].supply);
|
||||
if (IS_ERR(consumers[i].consumer)) {
|
||||
ret = dev_err_probe(dev, PTR_ERR(consumers[i].consumer),
|
||||
"Failed to get supply '%s'",
|
||||
"Failed to get supply '%s'\n",
|
||||
consumers[i].supply);
|
||||
consumers[i].consumer = NULL;
|
||||
goto err;
|
||||
|
||||
@@ -322,7 +322,16 @@ static const struct rtc_class_ops pcf85063_rtc_ops = {
|
||||
static int pcf85063_nvmem_read(void *priv, unsigned int offset,
|
||||
void *val, size_t bytes)
|
||||
{
|
||||
return regmap_read(priv, PCF85063_REG_RAM, val);
|
||||
unsigned int tmp;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(priv, PCF85063_REG_RAM, &tmp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*(u8 *)val = tmp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcf85063_nvmem_write(void *priv, unsigned int offset,
|
||||
|
||||
@@ -166,7 +166,8 @@ static unsigned long dir_block_index(unsigned int level,
|
||||
static struct f2fs_dir_entry *find_in_block(struct inode *dir,
|
||||
struct page *dentry_page,
|
||||
const struct f2fs_filename *fname,
|
||||
int *max_slots)
|
||||
int *max_slots,
|
||||
bool use_hash)
|
||||
{
|
||||
struct f2fs_dentry_block *dentry_blk;
|
||||
struct f2fs_dentry_ptr d;
|
||||
@@ -174,7 +175,7 @@ static struct f2fs_dir_entry *find_in_block(struct inode *dir,
|
||||
dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
|
||||
|
||||
make_dentry_ptr_block(dir, &d, dentry_blk);
|
||||
return f2fs_find_target_dentry(&d, fname, max_slots);
|
||||
return f2fs_find_target_dentry(&d, fname, max_slots, use_hash);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_UNICODE)
|
||||
@@ -251,7 +252,8 @@ static inline int f2fs_match_name(const struct inode *dir,
|
||||
}
|
||||
|
||||
struct f2fs_dir_entry *f2fs_find_target_dentry(const struct f2fs_dentry_ptr *d,
|
||||
const struct f2fs_filename *fname, int *max_slots)
|
||||
const struct f2fs_filename *fname, int *max_slots,
|
||||
bool use_hash)
|
||||
{
|
||||
struct f2fs_dir_entry *de;
|
||||
unsigned long bit_pos = 0;
|
||||
@@ -274,7 +276,7 @@ struct f2fs_dir_entry *f2fs_find_target_dentry(const struct f2fs_dentry_ptr *d,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (de->hash_code == fname->hash) {
|
||||
if (!use_hash || de->hash_code == fname->hash) {
|
||||
res = f2fs_match_name(d->inode, fname,
|
||||
d->filename[bit_pos],
|
||||
le16_to_cpu(de->name_len));
|
||||
@@ -301,11 +303,12 @@ found:
|
||||
static struct f2fs_dir_entry *find_in_level(struct inode *dir,
|
||||
unsigned int level,
|
||||
const struct f2fs_filename *fname,
|
||||
struct page **res_page)
|
||||
struct page **res_page,
|
||||
bool use_hash)
|
||||
{
|
||||
int s = GET_DENTRY_SLOTS(fname->disk_name.len);
|
||||
unsigned int nbucket, nblock;
|
||||
unsigned int bidx, end_block;
|
||||
unsigned int bidx, end_block, bucket_no;
|
||||
struct page *dentry_page;
|
||||
struct f2fs_dir_entry *de = NULL;
|
||||
pgoff_t next_pgofs;
|
||||
@@ -315,8 +318,11 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir,
|
||||
nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
|
||||
nblock = bucket_blocks(level);
|
||||
|
||||
bucket_no = use_hash ? le32_to_cpu(fname->hash) % nbucket : 0;
|
||||
|
||||
start_find_bucket:
|
||||
bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level,
|
||||
le32_to_cpu(fname->hash) % nbucket);
|
||||
bucket_no);
|
||||
end_block = bidx + nblock;
|
||||
|
||||
while (bidx < end_block) {
|
||||
@@ -333,7 +339,7 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir,
|
||||
}
|
||||
}
|
||||
|
||||
de = find_in_block(dir, dentry_page, fname, &max_slots);
|
||||
de = find_in_block(dir, dentry_page, fname, &max_slots, use_hash);
|
||||
if (IS_ERR(de)) {
|
||||
*res_page = ERR_CAST(de);
|
||||
de = NULL;
|
||||
@@ -350,12 +356,18 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir,
|
||||
bidx++;
|
||||
}
|
||||
|
||||
if (!de && room && F2FS_I(dir)->chash != fname->hash) {
|
||||
F2FS_I(dir)->chash = fname->hash;
|
||||
F2FS_I(dir)->clevel = level;
|
||||
}
|
||||
if (de)
|
||||
return de;
|
||||
|
||||
return de;
|
||||
if (likely(use_hash)) {
|
||||
if (room && F2FS_I(dir)->chash != fname->hash) {
|
||||
F2FS_I(dir)->chash = fname->hash;
|
||||
F2FS_I(dir)->clevel = level;
|
||||
}
|
||||
} else if (++bucket_no < nbucket) {
|
||||
goto start_find_bucket;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
|
||||
@@ -366,11 +378,15 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
|
||||
struct f2fs_dir_entry *de = NULL;
|
||||
unsigned int max_depth;
|
||||
unsigned int level;
|
||||
bool use_hash = true;
|
||||
|
||||
*res_page = NULL;
|
||||
|
||||
#if IS_ENABLED(CONFIG_UNICODE)
|
||||
start_find_entry:
|
||||
#endif
|
||||
if (f2fs_has_inline_dentry(dir)) {
|
||||
de = f2fs_find_in_inline_dir(dir, fname, res_page);
|
||||
de = f2fs_find_in_inline_dir(dir, fname, res_page, use_hash);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -386,11 +402,18 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
|
||||
}
|
||||
|
||||
for (level = 0; level < max_depth; level++) {
|
||||
de = find_in_level(dir, level, fname, res_page);
|
||||
de = find_in_level(dir, level, fname, res_page, use_hash);
|
||||
if (de || IS_ERR(*res_page))
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
#if IS_ENABLED(CONFIG_UNICODE)
|
||||
if (IS_CASEFOLDED(dir) && !de && use_hash) {
|
||||
use_hash = false;
|
||||
goto start_find_entry;
|
||||
}
|
||||
#endif
|
||||
/* This is to increase the speed of f2fs_create */
|
||||
if (!de)
|
||||
F2FS_I(dir)->task = current;
|
||||
|
||||
@@ -3502,7 +3502,8 @@ int f2fs_prepare_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct f2fs_filename *fname);
|
||||
void f2fs_free_filename(struct f2fs_filename *fname);
|
||||
struct f2fs_dir_entry *f2fs_find_target_dentry(const struct f2fs_dentry_ptr *d,
|
||||
const struct f2fs_filename *fname, int *max_slots);
|
||||
const struct f2fs_filename *fname, int *max_slots,
|
||||
bool use_hash);
|
||||
int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
|
||||
unsigned int start_pos, struct fscrypt_str *fstr);
|
||||
void f2fs_do_make_empty_dir(struct inode *inode, struct inode *parent,
|
||||
@@ -4121,7 +4122,8 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page);
|
||||
int f2fs_recover_inline_data(struct inode *inode, struct page *npage);
|
||||
struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
|
||||
const struct f2fs_filename *fname,
|
||||
struct page **res_page);
|
||||
struct page **res_page,
|
||||
bool use_hash);
|
||||
int f2fs_make_empty_inline_dir(struct inode *inode, struct inode *parent,
|
||||
struct page *ipage);
|
||||
int f2fs_add_inline_entry(struct inode *dir, const struct f2fs_filename *fname,
|
||||
|
||||
@@ -335,7 +335,8 @@ process_inline:
|
||||
|
||||
struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
|
||||
const struct f2fs_filename *fname,
|
||||
struct page **res_page)
|
||||
struct page **res_page,
|
||||
bool use_hash)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
|
||||
struct f2fs_dir_entry *de;
|
||||
@@ -352,7 +353,7 @@ struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
|
||||
inline_dentry = inline_data_addr(dir, ipage);
|
||||
|
||||
make_dentry_ptr_inline(dir, &d, inline_dentry);
|
||||
de = f2fs_find_target_dentry(&d, fname, NULL);
|
||||
de = f2fs_find_target_dentry(&d, fname, NULL, use_hash);
|
||||
unlock_page(ipage);
|
||||
if (IS_ERR(de)) {
|
||||
*res_page = ERR_CAST(de);
|
||||
|
||||
@@ -1202,6 +1202,7 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
|
||||
ret = false;
|
||||
break;
|
||||
case -NFS4ERR_DELAY:
|
||||
cb->cb_seq_status = 1;
|
||||
if (!rpc_restart_call(task))
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -946,16 +946,20 @@ void ubifs_dump_tnc(struct ubifs_info *c)
|
||||
|
||||
pr_err("\n");
|
||||
pr_err("(pid %d) start dumping TNC tree\n", current->pid);
|
||||
znode = ubifs_tnc_levelorder_next(c, c->zroot.znode, NULL);
|
||||
level = znode->level;
|
||||
pr_err("== Level %d ==\n", level);
|
||||
while (znode) {
|
||||
if (level != znode->level) {
|
||||
level = znode->level;
|
||||
pr_err("== Level %d ==\n", level);
|
||||
if (c->zroot.znode) {
|
||||
znode = ubifs_tnc_levelorder_next(c, c->zroot.znode, NULL);
|
||||
level = znode->level;
|
||||
pr_err("== Level %d ==\n", level);
|
||||
while (znode) {
|
||||
if (level != znode->level) {
|
||||
level = znode->level;
|
||||
pr_err("== Level %d ==\n", level);
|
||||
}
|
||||
ubifs_dump_znode(c, znode);
|
||||
znode = ubifs_tnc_levelorder_next(c, c->zroot.znode, znode);
|
||||
}
|
||||
ubifs_dump_znode(c, znode);
|
||||
znode = ubifs_tnc_levelorder_next(c, c->zroot.znode, znode);
|
||||
} else {
|
||||
pr_err("empty TNC tree in memory\n");
|
||||
}
|
||||
pr_err("(pid %d) finish dumping TNC tree\n", current->pid);
|
||||
}
|
||||
|
||||
@@ -608,7 +608,11 @@ int hibernation_platform_enter(void)
|
||||
|
||||
local_irq_disable();
|
||||
system_state = SYSTEM_SUSPEND;
|
||||
syscore_suspend();
|
||||
|
||||
error = syscore_suspend();
|
||||
if (error)
|
||||
goto Enable_irqs;
|
||||
|
||||
if (pm_wakeup_pending()) {
|
||||
error = -EAGAIN;
|
||||
goto Power_up;
|
||||
@@ -620,6 +624,7 @@ int hibernation_platform_enter(void)
|
||||
|
||||
Power_up:
|
||||
syscore_resume();
|
||||
Enable_irqs:
|
||||
system_state = SYSTEM_RUNNING;
|
||||
local_irq_enable();
|
||||
|
||||
|
||||
@@ -588,9 +588,12 @@ static int fill_frame_info(struct hsr_frame_info *frame,
|
||||
frame->is_vlan = true;
|
||||
|
||||
if (frame->is_vlan) {
|
||||
if (skb->mac_len < offsetofend(struct hsr_vlan_ethhdr, vlanhdr))
|
||||
/* Note: skb->mac_len might be wrong here. */
|
||||
if (!pskb_may_pull(skb,
|
||||
skb_mac_offset(skb) +
|
||||
offsetofend(struct hsr_vlan_ethhdr, vlanhdr)))
|
||||
return -EINVAL;
|
||||
vlan_hdr = (struct hsr_vlan_ethhdr *)ethhdr;
|
||||
vlan_hdr = (struct hsr_vlan_ethhdr *)skb_mac_header(skb);
|
||||
proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto;
|
||||
/* FIXME: */
|
||||
netdev_warn_once(skb->dev, "VLAN not yet supported");
|
||||
|
||||
@@ -330,9 +330,6 @@ next_entry:
|
||||
list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) {
|
||||
if (e < s_e)
|
||||
goto next_entry2;
|
||||
if (filter->dev &&
|
||||
!mr_mfc_uses_dev(mrt, mfc, filter->dev))
|
||||
goto next_entry2;
|
||||
|
||||
err = fill(mrt, skb, NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, mfc, RTM_NEWROUTE, flags);
|
||||
|
||||
@@ -4567,7 +4567,7 @@ static int nft_set_desc_concat_parse(const struct nlattr *attr,
|
||||
static int nft_set_desc_concat(struct nft_set_desc *desc,
|
||||
const struct nlattr *nla)
|
||||
{
|
||||
u32 num_regs = 0, key_num_regs = 0;
|
||||
u32 len = 0, num_regs;
|
||||
struct nlattr *attr;
|
||||
int rem, err, i;
|
||||
|
||||
@@ -4581,12 +4581,12 @@ static int nft_set_desc_concat(struct nft_set_desc *desc,
|
||||
}
|
||||
|
||||
for (i = 0; i < desc->field_count; i++)
|
||||
num_regs += DIV_ROUND_UP(desc->field_len[i], sizeof(u32));
|
||||
len += round_up(desc->field_len[i], sizeof(u32));
|
||||
|
||||
key_num_regs = DIV_ROUND_UP(desc->klen, sizeof(u32));
|
||||
if (key_num_regs != num_regs)
|
||||
if (len != desc->klen)
|
||||
return -EINVAL;
|
||||
|
||||
num_regs = DIV_ROUND_UP(desc->klen, sizeof(u32));
|
||||
if (num_regs > NFT_REG32_COUNT)
|
||||
return -E2BIG;
|
||||
|
||||
|
||||
@@ -122,6 +122,10 @@ static void rose_heartbeat_expiry(struct timer_list *t)
|
||||
struct rose_sock *rose = rose_sk(sk);
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (sock_owned_by_user(sk)) {
|
||||
sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ/20);
|
||||
goto out;
|
||||
}
|
||||
switch (rose->state) {
|
||||
case ROSE_STATE_0:
|
||||
/* Magic here: If we listen() and a new link dies before it
|
||||
@@ -152,6 +156,7 @@ static void rose_heartbeat_expiry(struct timer_list *t)
|
||||
}
|
||||
|
||||
rose_start_heartbeat(sk);
|
||||
out:
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
}
|
||||
@@ -162,6 +167,10 @@ static void rose_timer_expiry(struct timer_list *t)
|
||||
struct sock *sk = &rose->sock;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (sock_owned_by_user(sk)) {
|
||||
sk_reset_timer(sk, &rose->timer, jiffies + HZ/20);
|
||||
goto out;
|
||||
}
|
||||
switch (rose->state) {
|
||||
case ROSE_STATE_1: /* T1 */
|
||||
case ROSE_STATE_4: /* T2 */
|
||||
@@ -182,6 +191,7 @@ static void rose_timer_expiry(struct timer_list *t)
|
||||
}
|
||||
break;
|
||||
}
|
||||
out:
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
}
|
||||
@@ -192,6 +202,10 @@ static void rose_idletimer_expiry(struct timer_list *t)
|
||||
struct sock *sk = &rose->sock;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (sock_owned_by_user(sk)) {
|
||||
sk_reset_timer(sk, &rose->idletimer, jiffies + HZ/20);
|
||||
goto out;
|
||||
}
|
||||
rose_clear_queues(sk);
|
||||
|
||||
rose_write_internal(sk, ROSE_CLEAR_REQUEST);
|
||||
@@ -207,6 +221,7 @@ static void rose_idletimer_expiry(struct timer_list *t)
|
||||
sk->sk_state_change(sk);
|
||||
sock_set_flag(sk, SOCK_DEAD);
|
||||
}
|
||||
out:
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
}
|
||||
|
||||
@@ -714,10 +714,12 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff
|
||||
oseq += skb_shinfo(skb)->gso_segs;
|
||||
}
|
||||
|
||||
if (unlikely(xo->seq.low < replay_esn->oseq)) {
|
||||
XFRM_SKB_CB(skb)->seq.output.hi = ++oseq_hi;
|
||||
xo->seq.hi = oseq_hi;
|
||||
replay_esn->oseq_hi = oseq_hi;
|
||||
if (unlikely(oseq < replay_esn->oseq)) {
|
||||
replay_esn->oseq_hi = ++oseq_hi;
|
||||
if (xo->seq.low < replay_esn->oseq) {
|
||||
XFRM_SKB_CB(skb)->seq.output.hi = oseq_hi;
|
||||
xo->seq.hi = oseq_hi;
|
||||
}
|
||||
if (replay_esn->oseq_hi == 0) {
|
||||
replay_esn->oseq--;
|
||||
replay_esn->oseq_hi--;
|
||||
|
||||
@@ -461,10 +461,10 @@ quiet_cmd_lzo_with_size = LZO $@
|
||||
cmd_lzo_with_size = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@
|
||||
|
||||
quiet_cmd_lz4 = LZ4 $@
|
||||
cmd_lz4 = cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed stdin stdout > $@
|
||||
cmd_lz4 = cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed - - > $@
|
||||
|
||||
quiet_cmd_lz4_with_size = LZ4 $@
|
||||
cmd_lz4_with_size = { cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed stdin stdout; \
|
||||
cmd_lz4_with_size = { cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed - -; \
|
||||
$(size_append); } > $@
|
||||
|
||||
# U-Boot mkimage
|
||||
|
||||
@@ -241,6 +241,7 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
|
||||
"unchanged\n");
|
||||
}
|
||||
sym->is_declared = 1;
|
||||
free_list(defn, NULL);
|
||||
return sym;
|
||||
} else if (!sym->is_declared) {
|
||||
if (sym->is_override && flag_preserve) {
|
||||
@@ -249,6 +250,7 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
|
||||
print_type_name(type, name);
|
||||
fprintf(stderr, " modversion change\n");
|
||||
sym->is_declared = 1;
|
||||
free_list(defn, NULL);
|
||||
return sym;
|
||||
} else {
|
||||
status = is_unknown_symbol(sym) ?
|
||||
@@ -256,6 +258,7 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
|
||||
}
|
||||
} else {
|
||||
error_with_pos("redefinition of %s", name);
|
||||
free_list(defn, NULL);
|
||||
return sym;
|
||||
}
|
||||
break;
|
||||
@@ -271,11 +274,15 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free_list(sym->defn, NULL);
|
||||
free(sym->name);
|
||||
free(sym);
|
||||
--nsyms;
|
||||
}
|
||||
|
||||
sym = xmalloc(sizeof(*sym));
|
||||
sym->name = name;
|
||||
sym->name = xstrdup(name);
|
||||
sym->type = type;
|
||||
sym->defn = defn;
|
||||
sym->expansion_trail = NULL;
|
||||
@@ -482,7 +489,7 @@ static void read_reference(FILE *f)
|
||||
defn = def;
|
||||
def = read_node(f);
|
||||
}
|
||||
subsym = add_reference_symbol(xstrdup(sym->string), sym->tag,
|
||||
subsym = add_reference_symbol(sym->string, sym->tag,
|
||||
defn, is_extern);
|
||||
subsym->is_override = is_override;
|
||||
free_node(sym);
|
||||
|
||||
@@ -32,7 +32,7 @@ struct string_list {
|
||||
|
||||
struct symbol {
|
||||
struct symbol *hash_next;
|
||||
const char *name;
|
||||
char *name;
|
||||
enum symbol_type type;
|
||||
struct string_list *defn;
|
||||
struct symbol *expansion_trail;
|
||||
|
||||
@@ -152,14 +152,19 @@ simple_declaration:
|
||||
;
|
||||
|
||||
init_declarator_list_opt:
|
||||
/* empty */ { $$ = NULL; }
|
||||
| init_declarator_list
|
||||
/* empty */ { $$ = NULL; }
|
||||
| init_declarator_list { free_list(decl_spec, NULL); $$ = $1; }
|
||||
;
|
||||
|
||||
init_declarator_list:
|
||||
init_declarator
|
||||
{ struct string_list *decl = *$1;
|
||||
*$1 = NULL;
|
||||
|
||||
/* avoid sharing among multiple init_declarators */
|
||||
if (decl_spec)
|
||||
decl_spec = copy_list_range(decl_spec, NULL);
|
||||
|
||||
add_symbol(current_name,
|
||||
is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern);
|
||||
current_name = NULL;
|
||||
@@ -170,6 +175,11 @@ init_declarator_list:
|
||||
*$3 = NULL;
|
||||
free_list(*$2, NULL);
|
||||
*$2 = decl_spec;
|
||||
|
||||
/* avoid sharing among multiple init_declarators */
|
||||
if (decl_spec)
|
||||
decl_spec = copy_list_range(decl_spec, NULL);
|
||||
|
||||
add_symbol(current_name,
|
||||
is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern);
|
||||
current_name = NULL;
|
||||
@@ -472,12 +482,12 @@ enumerator_list:
|
||||
enumerator:
|
||||
IDENT
|
||||
{
|
||||
const char *name = strdup((*$1)->string);
|
||||
const char *name = (*$1)->string;
|
||||
add_symbol(name, SYM_ENUM_CONST, NULL, 0);
|
||||
}
|
||||
| IDENT '=' EXPRESSION_PHRASE
|
||||
{
|
||||
const char *name = strdup((*$1)->string);
|
||||
const char *name = (*$1)->string;
|
||||
struct string_list *expr = copy_list_range(*$3, *$2);
|
||||
add_symbol(name, SYM_ENUM_CONST, expr, 0);
|
||||
}
|
||||
|
||||
@@ -827,6 +827,9 @@ int main(int ac, char **av)
|
||||
break;
|
||||
}
|
||||
|
||||
if (conf_errors())
|
||||
exit(1);
|
||||
|
||||
if (sync_kconfig) {
|
||||
name = getenv("KCONFIG_NOSILENTUPDATE");
|
||||
if (name && *name) {
|
||||
@@ -890,6 +893,9 @@ int main(int ac, char **av)
|
||||
break;
|
||||
}
|
||||
|
||||
if (sym_dep_errors())
|
||||
exit(1);
|
||||
|
||||
if (input_mode == savedefconfig) {
|
||||
if (conf_write_defconfig(defconfig_file)) {
|
||||
fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n",
|
||||
|
||||
@@ -155,6 +155,13 @@ static void conf_message(const char *fmt, ...)
|
||||
static const char *conf_filename;
|
||||
static int conf_lineno, conf_warnings;
|
||||
|
||||
bool conf_errors(void)
|
||||
{
|
||||
if (conf_warnings)
|
||||
return getenv("KCONFIG_WERROR");
|
||||
return false;
|
||||
}
|
||||
|
||||
static void conf_warning(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -346,10 +353,12 @@ int conf_read_simple(const char *name, int def)
|
||||
FILE *in = NULL;
|
||||
char *line = NULL;
|
||||
size_t line_asize = 0;
|
||||
char *p, *p2;
|
||||
char *p, *p2, *val;
|
||||
struct symbol *sym;
|
||||
int i, def_flags;
|
||||
const char *warn_unknown, *sym_name;
|
||||
|
||||
warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
|
||||
if (name) {
|
||||
in = zconf_fopen(name);
|
||||
} else {
|
||||
@@ -382,10 +391,12 @@ int conf_read_simple(const char *name, int def)
|
||||
|
||||
*p = '\0';
|
||||
|
||||
in = zconf_fopen(env);
|
||||
name = env;
|
||||
|
||||
in = zconf_fopen(name);
|
||||
if (in) {
|
||||
conf_message("using defaults found in %s",
|
||||
env);
|
||||
name);
|
||||
goto load;
|
||||
}
|
||||
|
||||
@@ -424,71 +435,34 @@ load:
|
||||
|
||||
while (compat_getline(&line, &line_asize, in) != -1) {
|
||||
conf_lineno++;
|
||||
sym = NULL;
|
||||
if (line[0] == '#') {
|
||||
if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
|
||||
if (line[1] != ' ')
|
||||
continue;
|
||||
p = strchr(line + 2 + strlen(CONFIG_), ' ');
|
||||
p = line + 2;
|
||||
if (memcmp(p, CONFIG_, strlen(CONFIG_)))
|
||||
continue;
|
||||
sym_name = p + strlen(CONFIG_);
|
||||
p = strchr(sym_name, ' ');
|
||||
if (!p)
|
||||
continue;
|
||||
*p++ = 0;
|
||||
if (strncmp(p, "is not set", 10))
|
||||
continue;
|
||||
if (def == S_DEF_USER) {
|
||||
sym = sym_find(line + 2 + strlen(CONFIG_));
|
||||
if (!sym) {
|
||||
conf_set_changed(true);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
|
||||
if (sym->type == S_UNKNOWN)
|
||||
sym->type = S_BOOLEAN;
|
||||
}
|
||||
if (sym->flags & def_flags) {
|
||||
conf_warning("override: reassigning to symbol %s", sym->name);
|
||||
}
|
||||
switch (sym->type) {
|
||||
case S_BOOLEAN:
|
||||
case S_TRISTATE:
|
||||
sym->def[def].tri = no;
|
||||
sym->flags |= def_flags;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
val = "n";
|
||||
} else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
|
||||
p = strchr(line + strlen(CONFIG_), '=');
|
||||
sym_name = line + strlen(CONFIG_);
|
||||
p = strchr(sym_name, '=');
|
||||
if (!p)
|
||||
continue;
|
||||
*p++ = 0;
|
||||
val = p;
|
||||
p2 = strchr(p, '\n');
|
||||
if (p2) {
|
||||
*p2-- = 0;
|
||||
if (*p2 == '\r')
|
||||
*p2 = 0;
|
||||
}
|
||||
|
||||
sym = sym_find(line + strlen(CONFIG_));
|
||||
if (!sym) {
|
||||
if (def == S_DEF_AUTO)
|
||||
/*
|
||||
* Reading from include/config/auto.conf
|
||||
* If CONFIG_FOO previously existed in
|
||||
* auto.conf but it is missing now,
|
||||
* include/config/FOO must be touched.
|
||||
*/
|
||||
conf_touch_dep(line + strlen(CONFIG_));
|
||||
else
|
||||
conf_set_changed(true);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sym->flags & def_flags) {
|
||||
conf_warning("override: reassigning to symbol %s", sym->name);
|
||||
}
|
||||
if (conf_set_sym_val(sym, def, def_flags, p))
|
||||
continue;
|
||||
} else {
|
||||
if (line[0] != '\r' && line[0] != '\n')
|
||||
conf_warning("unexpected data: %.*s",
|
||||
@@ -497,6 +471,31 @@ load:
|
||||
continue;
|
||||
}
|
||||
|
||||
sym = sym_find(sym_name);
|
||||
if (!sym) {
|
||||
if (def == S_DEF_AUTO) {
|
||||
/*
|
||||
* Reading from include/config/auto.conf.
|
||||
* If CONFIG_FOO previously existed in auto.conf
|
||||
* but it is missing now, include/config/FOO
|
||||
* must be touched.
|
||||
*/
|
||||
conf_touch_dep(sym_name);
|
||||
} else {
|
||||
if (warn_unknown)
|
||||
conf_warning("unknown symbol: %s", sym_name);
|
||||
|
||||
conf_set_changed(true);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sym->flags & def_flags)
|
||||
conf_warning("override: reassigning to symbol %s", sym->name);
|
||||
|
||||
if (conf_set_sym_val(sym, def, def_flags, val))
|
||||
continue;
|
||||
|
||||
if (sym && sym_is_choice_value(sym)) {
|
||||
struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
|
||||
switch (sym->def[def].tri) {
|
||||
@@ -519,6 +518,7 @@ load:
|
||||
}
|
||||
free(line);
|
||||
fclose(in);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ void conf_set_changed(bool val);
|
||||
bool conf_get_changed(void);
|
||||
void conf_set_changed_callback(void (*fn)(void));
|
||||
void conf_set_message_callback(void (*fn)(const char *s));
|
||||
bool conf_errors(void);
|
||||
|
||||
/* symbol.c */
|
||||
extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
|
||||
@@ -22,6 +23,7 @@ void print_symbol_for_listconfig(struct symbol *sym);
|
||||
struct symbol ** sym_re_search(const char *pattern);
|
||||
const char * sym_type_name(enum symbol_type type);
|
||||
void sym_calc_value(struct symbol *sym);
|
||||
bool sym_dep_errors(void);
|
||||
enum symbol_type sym_get_type(struct symbol *sym);
|
||||
bool sym_tristate_within_range(struct symbol *sym,tristate tri);
|
||||
bool sym_set_tristate_value(struct symbol *sym,tristate tri);
|
||||
|
||||
@@ -40,6 +40,7 @@ static struct symbol symbol_empty = {
|
||||
|
||||
struct symbol *modules_sym;
|
||||
static tristate modules_val;
|
||||
static int sym_warnings;
|
||||
|
||||
enum symbol_type sym_get_type(struct symbol *sym)
|
||||
{
|
||||
@@ -320,6 +321,15 @@ static void sym_warn_unmet_dep(struct symbol *sym)
|
||||
" Selected by [m]:\n");
|
||||
|
||||
fputs(str_get(&gs), stderr);
|
||||
str_free(&gs);
|
||||
sym_warnings++;
|
||||
}
|
||||
|
||||
bool sym_dep_errors(void)
|
||||
{
|
||||
if (sym_warnings)
|
||||
return getenv("KCONFIG_WERROR");
|
||||
return false;
|
||||
}
|
||||
|
||||
void sym_calc_value(struct symbol *sym)
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#define DRV_NAME "rockchip-i2s-tdm"
|
||||
|
||||
#define DEFAULT_MCLK_FS 256
|
||||
#define CH_GRP_MAX 4 /* The max channel 8 / 2 */
|
||||
#define MULTIPLEX_CH_MAX 10
|
||||
|
||||
@@ -72,6 +71,8 @@ struct rk_i2s_tdm_dev {
|
||||
bool has_playback;
|
||||
bool has_capture;
|
||||
struct snd_soc_dai_driver *dai;
|
||||
unsigned int mclk_rx_freq;
|
||||
unsigned int mclk_tx_freq;
|
||||
};
|
||||
|
||||
static int to_ch_num(unsigned int val)
|
||||
@@ -641,6 +642,27 @@ static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
|
||||
unsigned int freq, int dir)
|
||||
{
|
||||
struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
|
||||
|
||||
if (i2s_tdm->clk_trcm) {
|
||||
i2s_tdm->mclk_tx_freq = freq;
|
||||
i2s_tdm->mclk_rx_freq = freq;
|
||||
} else {
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
i2s_tdm->mclk_tx_freq = freq;
|
||||
else
|
||||
i2s_tdm->mclk_rx_freq = freq;
|
||||
}
|
||||
|
||||
dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
|
||||
stream ? "rx" : "tx", freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
@@ -655,15 +677,19 @@ static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
if (i2s_tdm->clk_trcm == TRCM_TX) {
|
||||
mclk = i2s_tdm->mclk_tx;
|
||||
mclk_rate = i2s_tdm->mclk_tx_freq;
|
||||
} else if (i2s_tdm->clk_trcm == TRCM_RX) {
|
||||
mclk = i2s_tdm->mclk_rx;
|
||||
mclk_rate = i2s_tdm->mclk_rx_freq;
|
||||
} else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
mclk = i2s_tdm->mclk_tx;
|
||||
mclk_rate = i2s_tdm->mclk_tx_freq;
|
||||
} else {
|
||||
mclk = i2s_tdm->mclk_rx;
|
||||
mclk_rate = i2s_tdm->mclk_rx_freq;
|
||||
}
|
||||
|
||||
err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params));
|
||||
err = clk_set_rate(mclk, mclk_rate);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -822,6 +848,7 @@ static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
|
||||
.hw_params = rockchip_i2s_tdm_hw_params,
|
||||
.set_bclk_ratio = rockchip_i2s_tdm_set_bclk_ratio,
|
||||
.set_fmt = rockchip_i2s_tdm_set_fmt,
|
||||
.set_sysclk = rockchip_i2s_tdm_set_sysclk,
|
||||
.set_tdm_slot = rockchip_dai_tdm_slot,
|
||||
.trigger = rockchip_i2s_tdm_trigger,
|
||||
};
|
||||
|
||||
@@ -2241,6 +2241,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
|
||||
QUIRK_FLAG_IGNORE_CTL_ERROR),
|
||||
DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
|
||||
|
||||
@@ -2399,6 +2399,11 @@ sub get_version {
|
||||
return if ($have_version);
|
||||
doprint "$make kernelrelease ... ";
|
||||
$version = `$make -s kernelrelease | tail -1`;
|
||||
if (!length($version)) {
|
||||
run_command "$make allnoconfig" or return 0;
|
||||
doprint "$make kernelrelease ... ";
|
||||
$version = `$make -s kernelrelease | tail -1`;
|
||||
}
|
||||
chomp($version);
|
||||
doprint "$version\n";
|
||||
$have_version = 1;
|
||||
|
||||
@@ -142,7 +142,7 @@ function pre_ethtool {
|
||||
}
|
||||
|
||||
function check_table {
|
||||
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
|
||||
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
|
||||
local -n expected=$2
|
||||
local last=$3
|
||||
|
||||
@@ -212,7 +212,7 @@ function check_tables {
|
||||
}
|
||||
|
||||
function print_table {
|
||||
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
|
||||
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
|
||||
read -a have < $path
|
||||
|
||||
tree $NSIM_DEV_DFS/
|
||||
@@ -640,7 +640,7 @@ for port in 0 1; do
|
||||
NSIM_NETDEV=`get_netdev_name old_netdevs`
|
||||
ifconfig $NSIM_NETDEV up
|
||||
|
||||
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
|
||||
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
|
||||
|
||||
msg="1 - create VxLANs v6"
|
||||
exp0=( 0 0 0 0 )
|
||||
@@ -662,7 +662,7 @@ for port in 0 1; do
|
||||
new_geneve gnv0 20000
|
||||
|
||||
msg="2 - destroy GENEVE"
|
||||
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
|
||||
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
|
||||
exp1=( `mke 20000 2` 0 0 0 )
|
||||
del_dev gnv0
|
||||
|
||||
@@ -763,7 +763,7 @@ for port in 0 1; do
|
||||
msg="create VxLANs v4"
|
||||
new_vxlan vxlan0 10000 $NSIM_NETDEV
|
||||
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
|
||||
check_tables
|
||||
|
||||
msg="NIC device goes down"
|
||||
@@ -774,7 +774,7 @@ for port in 0 1; do
|
||||
fi
|
||||
check_tables
|
||||
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
|
||||
check_tables
|
||||
|
||||
msg="NIC device goes up again"
|
||||
@@ -788,7 +788,7 @@ for port in 0 1; do
|
||||
del_dev vxlan0
|
||||
check_tables
|
||||
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
|
||||
check_tables
|
||||
|
||||
msg="destroy NIC"
|
||||
@@ -895,7 +895,7 @@ msg="vacate VxLAN in overflow table"
|
||||
exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
|
||||
del_dev vxlan2
|
||||
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
|
||||
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
|
||||
check_tables
|
||||
|
||||
msg="tunnels destroyed 2"
|
||||
|
||||
Reference in New Issue
Block a user