Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Fun set of conflict resolutions here... For the mac80211 stuff, these were fortunately just parallel adds. Trivially resolved. In drivers/net/phy/phy.c we had a bug fix in 'net' that moved the function phy_disable_interrupts() earlier in the file, whilst in 'net-next' the phy_error() call from this function was removed. In net/ipv4/xfrm4_policy.c, David Ahern's changes to remove the 'rt_table_id' member of rtable collided with a bug fix in 'net' that added a new struct member "rt_mtu_locked" which needs to be copied over here. The mlxsw driver conflict consisted of net-next separating the span code and definitions into separate files, whilst a 'net' bug fix made some changes to that moved code. The mlx5 infiniband conflict resolution was quite non-trivial, the RDMA tree's merge commit was used as a guide here, and here are their notes: ==================== Due to bug fixes found by the syzkaller bot and taken into the for-rc branch after development for the 4.17 merge window had already started being taken into the for-next branch, there were fairly non-trivial merge issues that would need to be resolved between the for-rc branch and the for-next branch. This merge resolves those conflicts and provides a unified base upon which ongoing development for 4.17 can be based. Conflicts: drivers/infiniband/hw/mlx5/main.c - Commit42cea83f95
(IB/mlx5: Fix cleanup order on unload) added to for-rc and commitb5ca15ad7e
(IB/mlx5: Add proper representors support) add as part of the devel cycle both needed to modify the init/de-init functions used by mlx5. To support the new representors, the new functions added by the cleanup patch needed to be made non-static, and the init/de-init list added by the representors patch needed to be modified to match the init/de-init list changes made by the cleanup patch. Updates: drivers/infiniband/hw/mlx5/mlx5_ib.h - Update function prototypes added by representors patch to reflect new function names as changed by cleanup patch drivers/infiniband/hw/mlx5/ib_rep.c - Update init/de-init stage list to match new order from cleanup patch ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -755,13 +755,13 @@ struct sock_cgroup_data {
|
||||
* updaters and return part of the previous pointer as the prioidx or
|
||||
* classid. Such races are short-lived and the result isn't critical.
|
||||
*/
|
||||
static inline u16 sock_cgroup_prioidx(struct sock_cgroup_data *skcd)
|
||||
static inline u16 sock_cgroup_prioidx(const struct sock_cgroup_data *skcd)
|
||||
{
|
||||
/* fallback to 1 which is always the ID of the root cgroup */
|
||||
return (skcd->is_data & 1) ? skcd->prioidx : 1;
|
||||
}
|
||||
|
||||
static inline u32 sock_cgroup_classid(struct sock_cgroup_data *skcd)
|
||||
static inline u32 sock_cgroup_classid(const struct sock_cgroup_data *skcd)
|
||||
{
|
||||
/* fallback to 0 which is the unconfigured default classid */
|
||||
return (skcd->is_data & 1) ? skcd->classid : 0;
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#include <linux/if.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/aio_abi.h> /* for aio_context_t */
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/unistd.h>
|
||||
|
||||
#include <asm/compat.h>
|
||||
@@ -229,13 +230,13 @@ typedef struct compat_siginfo {
|
||||
short int _addr_lsb; /* Valid LSB of the reported address. */
|
||||
/* used when si_code=SEGV_BNDERR */
|
||||
struct {
|
||||
short _dummy_bnd;
|
||||
compat_uptr_t _dummy_bnd;
|
||||
compat_uptr_t _lower;
|
||||
compat_uptr_t _upper;
|
||||
} _addr_bnd;
|
||||
/* used when si_code=SEGV_PKUERR */
|
||||
struct {
|
||||
short _dummy_pkey;
|
||||
compat_uptr_t _dummy_pkey;
|
||||
u32 _pkey;
|
||||
} _addr_pkey;
|
||||
};
|
||||
@@ -550,8 +551,29 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
|
||||
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
||||
|
||||
extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
|
||||
extern int put_compat_sigset(compat_sigset_t __user *compat,
|
||||
const sigset_t *set, unsigned int size);
|
||||
|
||||
/*
|
||||
* Defined inline such that size can be compile time constant, which avoids
|
||||
* CONFIG_HARDENED_USERCOPY complaining about copies from task_struct
|
||||
*/
|
||||
static inline int
|
||||
put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
|
||||
unsigned int size)
|
||||
{
|
||||
/* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
|
||||
#ifdef __BIG_ENDIAN
|
||||
compat_sigset_t v;
|
||||
switch (_NSIG_WORDS) {
|
||||
case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
|
||||
case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2];
|
||||
case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1];
|
||||
case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0];
|
||||
}
|
||||
return copy_to_user(compat, &v, size) ? -EFAULT : 0;
|
||||
#else
|
||||
return copy_to_user(compat, set, size) ? -EFAULT : 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
|
||||
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
|
||||
|
@@ -1317,6 +1317,7 @@ extern int send_sigurg(struct fown_struct *fown);
|
||||
#define SB_I_CGROUPWB 0x00000001 /* cgroup-aware writeback enabled */
|
||||
#define SB_I_NOEXEC 0x00000002 /* Ignore executables on this fs */
|
||||
#define SB_I_NODEV 0x00000004 /* Ignore devices on this fs */
|
||||
#define SB_I_MULTIROOT 0x00000008 /* Multiple roots to the dentry tree */
|
||||
|
||||
/* sb->s_iflags to limit user namespace mounts */
|
||||
#define SB_I_USERNS_VISIBLE 0x00000010 /* fstype already mounted */
|
||||
|
@@ -25,6 +25,7 @@ struct ptr_ring *tun_get_tx_ring(struct file *file);
|
||||
bool tun_is_xdp_buff(void *ptr);
|
||||
void *tun_xdp_to_ptr(void *ptr);
|
||||
void *tun_ptr_to_xdp(void *ptr);
|
||||
void tun_ptr_free(void *ptr);
|
||||
#else
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -50,5 +51,8 @@ static inline void *tun_ptr_to_xdp(void *ptr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void tun_ptr_free(void *ptr)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_TUN */
|
||||
#endif /* __IF_TUN_H */
|
||||
|
@@ -299,6 +299,44 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features,
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* __vlan_insert_inner_tag - inner VLAN tag inserting
|
||||
* @skb: skbuff to tag
|
||||
* @vlan_proto: VLAN encapsulation protocol
|
||||
* @vlan_tci: VLAN TCI to insert
|
||||
* @mac_len: MAC header length including outer vlan headers
|
||||
*
|
||||
* Inserts the VLAN tag into @skb as part of the payload at offset mac_len
|
||||
* Returns error if skb_cow_head failes.
|
||||
*
|
||||
* Does not change skb->protocol so this function can be used during receive.
|
||||
*/
|
||||
static inline int __vlan_insert_inner_tag(struct sk_buff *skb,
|
||||
__be16 vlan_proto, u16 vlan_tci,
|
||||
unsigned int mac_len)
|
||||
{
|
||||
struct vlan_ethhdr *veth;
|
||||
|
||||
if (skb_cow_head(skb, VLAN_HLEN) < 0)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_push(skb, VLAN_HLEN);
|
||||
|
||||
/* Move the mac header sans proto to the beginning of the new header. */
|
||||
memmove(skb->data, skb->data + VLAN_HLEN, mac_len - ETH_TLEN);
|
||||
skb->mac_header -= VLAN_HLEN;
|
||||
|
||||
veth = (struct vlan_ethhdr *)(skb->data + mac_len - ETH_HLEN);
|
||||
|
||||
/* first, the ethernet type */
|
||||
veth->h_vlan_proto = vlan_proto;
|
||||
|
||||
/* now, the TCI */
|
||||
veth->h_vlan_TCI = htons(vlan_tci);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __vlan_insert_tag - regular VLAN tag inserting
|
||||
* @skb: skbuff to tag
|
||||
@@ -313,24 +351,37 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features,
|
||||
static inline int __vlan_insert_tag(struct sk_buff *skb,
|
||||
__be16 vlan_proto, u16 vlan_tci)
|
||||
{
|
||||
struct vlan_ethhdr *veth;
|
||||
return __vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, ETH_HLEN);
|
||||
}
|
||||
|
||||
if (skb_cow_head(skb, VLAN_HLEN) < 0)
|
||||
return -ENOMEM;
|
||||
/**
|
||||
* vlan_insert_inner_tag - inner VLAN tag inserting
|
||||
* @skb: skbuff to tag
|
||||
* @vlan_proto: VLAN encapsulation protocol
|
||||
* @vlan_tci: VLAN TCI to insert
|
||||
* @mac_len: MAC header length including outer vlan headers
|
||||
*
|
||||
* Inserts the VLAN tag into @skb as part of the payload at offset mac_len
|
||||
* Returns a VLAN tagged skb. If a new skb is created, @skb is freed.
|
||||
*
|
||||
* Following the skb_unshare() example, in case of error, the calling function
|
||||
* doesn't have to worry about freeing the original skb.
|
||||
*
|
||||
* Does not change skb->protocol so this function can be used during receive.
|
||||
*/
|
||||
static inline struct sk_buff *vlan_insert_inner_tag(struct sk_buff *skb,
|
||||
__be16 vlan_proto,
|
||||
u16 vlan_tci,
|
||||
unsigned int mac_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
veth = skb_push(skb, VLAN_HLEN);
|
||||
|
||||
/* Move the mac addresses to the beginning of the new header. */
|
||||
memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN);
|
||||
skb->mac_header -= VLAN_HLEN;
|
||||
|
||||
/* first, the ethernet type */
|
||||
veth->h_vlan_proto = vlan_proto;
|
||||
|
||||
/* now, the TCI */
|
||||
veth->h_vlan_TCI = htons(vlan_tci);
|
||||
|
||||
return 0;
|
||||
err = __vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, mac_len);
|
||||
if (err) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NULL;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -350,14 +401,7 @@ static inline int __vlan_insert_tag(struct sk_buff *skb,
|
||||
static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb,
|
||||
__be16 vlan_proto, u16 vlan_tci)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __vlan_insert_tag(skb, vlan_proto, vlan_tci);
|
||||
if (err) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NULL;
|
||||
}
|
||||
return skb;
|
||||
return vlan_insert_inner_tag(skb, vlan_proto, vlan_tci, ETH_HLEN);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -503,6 +503,7 @@
|
||||
|
||||
#define ICH_HCR_EN (1 << 0)
|
||||
#define ICH_HCR_UIE (1 << 1)
|
||||
#define ICH_HCR_NPIE (1 << 3)
|
||||
#define ICH_HCR_TC (1 << 10)
|
||||
#define ICH_HCR_TALL0 (1 << 11)
|
||||
#define ICH_HCR_TALL1 (1 << 12)
|
||||
|
@@ -84,6 +84,7 @@
|
||||
|
||||
#define GICH_HCR_EN (1 << 0)
|
||||
#define GICH_HCR_UIE (1 << 1)
|
||||
#define GICH_HCR_NPIE (1 << 3)
|
||||
|
||||
#define GICH_LR_VIRTUALID (0x3ff << 0)
|
||||
#define GICH_LR_PHYSID_CPUID_SHIFT (10)
|
||||
|
@@ -187,7 +187,6 @@ int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
|
||||
unsigned long *end_pfn);
|
||||
void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
|
||||
unsigned long *out_end_pfn, int *out_nid);
|
||||
unsigned long memblock_next_valid_pfn(unsigned long pfn, unsigned long max_pfn);
|
||||
|
||||
/**
|
||||
* for_each_mem_pfn_range - early memory pfn range iterator
|
||||
|
@@ -462,8 +462,8 @@ struct mlx5_core_srq {
|
||||
struct mlx5_core_rsc_common common; /* must be first */
|
||||
u32 srqn;
|
||||
int max;
|
||||
int max_gs;
|
||||
int max_avail_gather;
|
||||
size_t max_gs;
|
||||
size_t max_avail_gather;
|
||||
int wqe_shift;
|
||||
void (*event) (struct mlx5_core_srq *, enum mlx5_event);
|
||||
|
||||
|
@@ -222,6 +222,7 @@ enum {
|
||||
int sock_wake_async(struct socket_wq *sk_wq, int how, int band);
|
||||
int sock_register(const struct net_proto_family *fam);
|
||||
void sock_unregister(int family);
|
||||
bool sock_is_registered(int family);
|
||||
int __sock_create(struct net *net, int family, int type, int proto,
|
||||
struct socket **res, int kern);
|
||||
int sock_create(int family, int type, int proto, struct socket **res);
|
||||
|
@@ -285,6 +285,8 @@ unsigned int *xt_alloc_entry_offsets(unsigned int size);
|
||||
bool xt_find_jump_offset(const unsigned int *offsets,
|
||||
unsigned int target, unsigned int size);
|
||||
|
||||
int xt_check_proc_name(const char *name, unsigned int size);
|
||||
|
||||
int xt_check_match(struct xt_mtchk_param *, unsigned int size, u_int8_t proto,
|
||||
bool inv_proto);
|
||||
int xt_check_target(struct xt_tgchk_param *, unsigned int size, u_int8_t proto,
|
||||
|
@@ -13,7 +13,6 @@ struct device_node;
|
||||
struct device_node *of_pci_find_child_device(struct device_node *parent,
|
||||
unsigned int devfn);
|
||||
int of_pci_get_devfn(struct device_node *np);
|
||||
int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
|
||||
int of_get_pci_domain_nr(struct device_node *node);
|
||||
int of_pci_get_max_link_speed(struct device_node *node);
|
||||
@@ -33,12 +32,6 @@ static inline int of_pci_get_devfn(struct device_node *np)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int
|
||||
of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
of_pci_parse_bus_range(struct device_node *node, struct resource *res)
|
||||
{
|
||||
@@ -67,6 +60,16 @@ of_pci_get_max_link_speed(struct device_node *node)
|
||||
static inline void of_pci_check_probe_only(void) { }
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF_IRQ)
|
||||
int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
#else
|
||||
static inline int
|
||||
of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OF_ADDRESS)
|
||||
int of_pci_get_host_bridge_resources(struct device_node *dev,
|
||||
unsigned char busno, unsigned char bus_max,
|
||||
|
@@ -30,10 +30,14 @@
|
||||
* calls io_destroy() or the process exits.
|
||||
*
|
||||
* In the aio code, kill_ioctx() is called when we wish to destroy a kioctx; it
|
||||
* calls percpu_ref_kill(), then hlist_del_rcu() and synchronize_rcu() to remove
|
||||
* the kioctx from the proccess's list of kioctxs - after that, there can't be
|
||||
* any new users of the kioctx (from lookup_ioctx()) and it's then safe to drop
|
||||
* the initial ref with percpu_ref_put().
|
||||
* removes the kioctx from the proccess's table of kioctxs and kills percpu_ref.
|
||||
* After that, there can't be any new users of the kioctx (from lookup_ioctx())
|
||||
* and it's then safe to drop the initial ref with percpu_ref_put().
|
||||
*
|
||||
* Note that the free path, free_ioctx(), needs to go through explicit call_rcu()
|
||||
* to synchronize with RCU protected lookup_ioctx(). percpu_ref operations don't
|
||||
* imply RCU grace periods of any kind and if a user wants to combine percpu_ref
|
||||
* with RCU protection, it must be done explicitly.
|
||||
*
|
||||
* Code that does a two stage shutdown like this often needs some kind of
|
||||
* explicit synchronization to ensure the initial refcount can only be dropped
|
||||
@@ -113,8 +117,10 @@ void percpu_ref_reinit(struct percpu_ref *ref);
|
||||
* Must be used to drop the initial ref on a percpu refcount; must be called
|
||||
* precisely once before shutdown.
|
||||
*
|
||||
* Puts @ref in non percpu mode, then does a call_rcu() before gathering up the
|
||||
* percpu counters and dropping the initial ref.
|
||||
* Switches @ref into atomic mode before gathering up the percpu counters
|
||||
* and dropping the initial ref.
|
||||
*
|
||||
* There are no implied RCU grace periods between kill and release.
|
||||
*/
|
||||
static inline void percpu_ref_kill(struct percpu_ref *ref)
|
||||
{
|
||||
|
@@ -984,6 +984,10 @@ static inline int genphy_no_soft_reset(struct phy_device *phydev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad,
|
||||
u16 regnum);
|
||||
int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
|
||||
u16 regnum, u16 val);
|
||||
|
||||
/* Clause 45 PHY */
|
||||
int genphy_c45_restart_aneg(struct phy_device *phydev);
|
||||
@@ -1020,7 +1024,6 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner);
|
||||
int phy_drivers_register(struct phy_driver *new_driver, int n,
|
||||
struct module *owner);
|
||||
void phy_state_machine(struct work_struct *work);
|
||||
void phy_change(struct phy_device *phydev);
|
||||
void phy_change_work(struct work_struct *work);
|
||||
void phy_mac_interrupt(struct phy_device *phydev);
|
||||
void phy_start_machine(struct phy_device *phydev);
|
||||
|
@@ -766,8 +766,10 @@ slow_path:
|
||||
if (!key ||
|
||||
(params.obj_cmpfn ?
|
||||
params.obj_cmpfn(&arg, rht_obj(ht, head)) :
|
||||
rhashtable_compare(&arg, rht_obj(ht, head))))
|
||||
rhashtable_compare(&arg, rht_obj(ht, head)))) {
|
||||
pprev = &head->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
data = rht_obj(ht, head);
|
||||
|
||||
|
@@ -4040,6 +4040,12 @@ static inline bool skb_is_gso_v6(const struct sk_buff *skb)
|
||||
return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
|
||||
}
|
||||
|
||||
/* Note: Should be called only if skb_is_gso(skb) is true */
|
||||
static inline bool skb_is_gso_sctp(const struct sk_buff *skb)
|
||||
{
|
||||
return skb_shinfo(skb)->gso_type & SKB_GSO_SCTP;
|
||||
}
|
||||
|
||||
static inline void skb_gso_reset(struct sk_buff *skb)
|
||||
{
|
||||
skb_shinfo(skb)->gso_size = 0;
|
||||
@@ -4047,6 +4053,22 @@ static inline void skb_gso_reset(struct sk_buff *skb)
|
||||
skb_shinfo(skb)->gso_type = 0;
|
||||
}
|
||||
|
||||
static inline void skb_increase_gso_size(struct skb_shared_info *shinfo,
|
||||
u16 increment)
|
||||
{
|
||||
if (WARN_ON_ONCE(shinfo->gso_size == GSO_BY_FRAGS))
|
||||
return;
|
||||
shinfo->gso_size += increment;
|
||||
}
|
||||
|
||||
static inline void skb_decrease_gso_size(struct skb_shared_info *shinfo,
|
||||
u16 decrement)
|
||||
{
|
||||
if (WARN_ON_ONCE(shinfo->gso_size == GSO_BY_FRAGS))
|
||||
return;
|
||||
shinfo->gso_size -= decrement;
|
||||
}
|
||||
|
||||
void __skb_warn_lro_forwarding(const struct sk_buff *skb);
|
||||
|
||||
static inline bool skb_warn_if_lro(const struct sk_buff *skb)
|
||||
|
@@ -364,6 +364,7 @@ struct tty_file_private {
|
||||
#define TTY_PTY_LOCK 16 /* pty private */
|
||||
#define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */
|
||||
#define TTY_HUPPED 18 /* Post driver->hangup() */
|
||||
#define TTY_HUPPING 19 /* Hangup in progress */
|
||||
#define TTY_LDISC_HALTED 22 /* Line discipline is halted */
|
||||
|
||||
/* Values for tty->flow_change */
|
||||
|
@@ -90,6 +90,28 @@ static inline void u64_stats_update_end(struct u64_stats_sync *syncp)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
u64_stats_update_begin_irqsave(struct u64_stats_sync *syncp)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
||||
local_irq_save(flags);
|
||||
write_seqcount_begin(&syncp->seq);
|
||||
#endif
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void
|
||||
u64_stats_update_end_irqrestore(struct u64_stats_sync *syncp,
|
||||
unsigned long flags)
|
||||
{
|
||||
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
||||
write_seqcount_end(&syncp->seq);
|
||||
local_irq_restore(flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void u64_stats_update_begin_raw(struct u64_stats_sync *syncp)
|
||||
{
|
||||
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
||||
|
@@ -63,4 +63,7 @@
|
||||
*/
|
||||
#define USB_QUIRK_DISCONNECT_SUSPEND BIT(12)
|
||||
|
||||
/* Device needs a pause after every control message. */
|
||||
#define USB_QUIRK_DELAY_CTRL_MSG BIT(13)
|
||||
|
||||
#endif /* __LINUX_USB_QUIRKS_H */
|
||||
|
@@ -456,7 +456,6 @@ extern int schedule_on_each_cpu(work_func_t func);
|
||||
int execute_in_process_context(work_func_t fn, struct execute_work *);
|
||||
|
||||
extern bool flush_work(struct work_struct *work);
|
||||
extern bool cancel_work(struct work_struct *work);
|
||||
extern bool cancel_work_sync(struct work_struct *work);
|
||||
|
||||
extern bool flush_delayed_work(struct delayed_work *dwork);
|
||||
|
Reference in New Issue
Block a user