diff options
Diffstat (limited to 'include/linux')
284 files changed, 5249 insertions, 3513 deletions
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index bcbdd7484e5..17b5b596764 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -152,15 +152,6 @@ void acpi_penalize_isa_irq(int irq, int active);  void acpi_pci_irq_disable (struct pci_dev *dev); -struct acpi_pci_driver { -	struct list_head node; -	int (*add)(struct acpi_pci_root *root); -	void (*remove)(struct acpi_pci_root *root); -}; - -int acpi_pci_register_driver(struct acpi_pci_driver *driver); -void acpi_pci_unregister_driver(struct acpi_pci_driver *driver); -  extern int ec_read(u8 addr, u8 *val);  extern int ec_write(u8 addr, u8 val);  extern int ec_transaction(u8 command, @@ -204,7 +195,7 @@ extern bool wmi_has_guid(const char *guid);  #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)  extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle); -extern long acpi_is_video_device(struct acpi_device *device); +extern long acpi_is_video_device(acpi_handle handle);  extern void acpi_video_dmi_promote_vendor(void);  extern void acpi_video_dmi_demote_vendor(void);  extern int acpi_video_backlight_support(void); @@ -217,7 +208,7 @@ static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle)  	return 0;  } -static inline long acpi_is_video_device(struct acpi_device *device) +static inline long acpi_is_video_device(acpi_handle handle)  {  	return 0;  } diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index f612c783170..62d9303c283 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h @@ -203,6 +203,9 @@ struct amba_pl011_data {  	bool (*dma_filter)(struct dma_chan *chan, void *filter_param);  	void *dma_rx_param;  	void *dma_tx_param; +	bool dma_rx_poll_enable; +	unsigned int dma_rx_poll_rate; +	unsigned int dma_rx_poll_timeout;          void (*init) (void);  	void (*exit) (void);  }; diff --git a/include/linux/async.h b/include/linux/async.h index a2e3f18b2ad..6b0226bdaad 100644 --- a/include/linux/async.h +++ b/include/linux/async.h @@ -16,9 +16,8 @@  #include <linux/list.h>  typedef u64 async_cookie_t; -typedef void (async_func_ptr) (void *data, async_cookie_t cookie); +typedef void (*async_func_t) (void *data, async_cookie_t cookie);  struct async_domain { -	struct list_head node;  	struct list_head pending;  	unsigned registered:1;  }; @@ -27,8 +26,7 @@ struct async_domain {   * domain participates in global async_synchronize_full   */  #define ASYNC_DOMAIN(_name) \ -	struct async_domain _name = { .node = LIST_HEAD_INIT(_name.node), \ -				      .pending = LIST_HEAD_INIT(_name.pending), \ +	struct async_domain _name = { .pending = LIST_HEAD_INIT(_name.pending),	\  				      .registered = 1 }  /* @@ -36,12 +34,11 @@ struct async_domain {   * complete, this domain does not participate in async_synchronize_full   */  #define ASYNC_DOMAIN_EXCLUSIVE(_name) \ -	struct async_domain _name = { .node = LIST_HEAD_INIT(_name.node), \ -				      .pending = LIST_HEAD_INIT(_name.pending), \ +	struct async_domain _name = { .pending = LIST_HEAD_INIT(_name.pending), \  				      .registered = 0 } -extern async_cookie_t async_schedule(async_func_ptr *ptr, void *data); -extern async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data, +extern async_cookie_t async_schedule(async_func_t func, void *data); +extern async_cookie_t async_schedule_domain(async_func_t func, void *data,  					    struct async_domain *domain);  void async_unregister_domain(struct async_domain *domain);  extern void async_synchronize_full(void); diff --git a/include/linux/ata.h b/include/linux/ata.h index 8f7a3d68371..ee0bd952405 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -954,7 +954,7 @@ static inline int atapi_cdb_len(const u16 *dev_id)  	}  } -static inline bool atapi_command_packet_set(const u16 *dev_id) +static inline int atapi_command_packet_set(const u16 *dev_id)  {  	return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;  } diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index e0ce311011c..f14a98a79c9 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -134,6 +134,7 @@ struct bcma_host_ops {  #define BCMA_CORE_I2S			0x834  #define BCMA_CORE_SDR_DDR1_MEM_CTL	0x835	/* SDR/DDR1 memory controller core */  #define BCMA_CORE_SHIM			0x837	/* SHIM component in ubus/6362 */ +#define BCMA_CORE_ARM_CR4		0x83e  #define BCMA_CORE_DEFAULT		0xFFF  #define BCMA_MAX_NR_CORES		16 @@ -173,6 +174,60 @@ struct bcma_host_ops {  #define BCMA_CHIP_ID_BCM53572	53572  #define  BCMA_PKG_ID_BCM47188	9 +/* Board types (on PCI usually equals to the subsystem dev id) */ +/* BCM4313 */ +#define BCMA_BOARD_TYPE_BCM94313BU	0X050F +#define BCMA_BOARD_TYPE_BCM94313HM	0X0510 +#define BCMA_BOARD_TYPE_BCM94313EPA	0X0511 +#define BCMA_BOARD_TYPE_BCM94313HMG	0X051C +/* BCM4716 */ +#define BCMA_BOARD_TYPE_BCM94716NR2	0X04CD +/* BCM43224 */ +#define BCMA_BOARD_TYPE_BCM943224X21	0X056E +#define BCMA_BOARD_TYPE_BCM943224X21_FCC	0X00D1 +#define BCMA_BOARD_TYPE_BCM943224X21B	0X00E9 +#define BCMA_BOARD_TYPE_BCM943224M93	0X008B +#define BCMA_BOARD_TYPE_BCM943224M93A	0X0090 +#define BCMA_BOARD_TYPE_BCM943224X16	0X0093 +#define BCMA_BOARD_TYPE_BCM94322X9	0X008D +#define BCMA_BOARD_TYPE_BCM94322M35E	0X008E +/* BCM43228 */ +#define BCMA_BOARD_TYPE_BCM943228BU8	0X0540 +#define BCMA_BOARD_TYPE_BCM943228BU9	0X0541 +#define BCMA_BOARD_TYPE_BCM943228BU	0X0542 +#define BCMA_BOARD_TYPE_BCM943227HM4L	0X0543 +#define BCMA_BOARD_TYPE_BCM943227HMB	0X0544 +#define BCMA_BOARD_TYPE_BCM943228HM4L	0X0545 +#define BCMA_BOARD_TYPE_BCM943228SD	0X0573 +/* BCM4331 */ +#define BCMA_BOARD_TYPE_BCM94331X19	0X00D6 +#define BCMA_BOARD_TYPE_BCM94331X28	0X00E4 +#define BCMA_BOARD_TYPE_BCM94331X28B	0X010E +#define BCMA_BOARD_TYPE_BCM94331PCIEBT3AX	0X00E4 +#define BCMA_BOARD_TYPE_BCM94331X12_2G	0X00EC +#define BCMA_BOARD_TYPE_BCM94331X12_5G	0X00ED +#define BCMA_BOARD_TYPE_BCM94331X29B	0X00EF +#define BCMA_BOARD_TYPE_BCM94331CSAX	0X00EF +#define BCMA_BOARD_TYPE_BCM94331X19C	0X00F5 +#define BCMA_BOARD_TYPE_BCM94331X33	0X00F4 +#define BCMA_BOARD_TYPE_BCM94331BU	0X0523 +#define BCMA_BOARD_TYPE_BCM94331S9BU	0X0524 +#define BCMA_BOARD_TYPE_BCM94331MC	0X0525 +#define BCMA_BOARD_TYPE_BCM94331MCI	0X0526 +#define BCMA_BOARD_TYPE_BCM94331PCIEBT4	0X0527 +#define BCMA_BOARD_TYPE_BCM94331HM	0X0574 +#define BCMA_BOARD_TYPE_BCM94331PCIEDUAL	0X059B +#define BCMA_BOARD_TYPE_BCM94331MCH5	0X05A9 +#define BCMA_BOARD_TYPE_BCM94331CS	0X05C6 +#define BCMA_BOARD_TYPE_BCM94331CD	0X05DA +/* BCM53572 */ +#define BCMA_BOARD_TYPE_BCM953572BU	0X058D +#define BCMA_BOARD_TYPE_BCM953572NR2	0X058E +#define BCMA_BOARD_TYPE_BCM947188NR2	0X058F +#define BCMA_BOARD_TYPE_BCM953572SDRNR2	0X0590 +/* BCM43142 */ +#define BCMA_BOARD_TYPE_BCM943142HM	0X05E0 +  struct bcma_device {  	struct bcma_bus *bus;  	struct bcma_device_id id; diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 8390c474f69..b8b09eac60a 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h @@ -104,6 +104,7 @@  #define  BCMA_CC_CHIPST_4706_MIPS_BENDIAN	BIT(3) /* 0: little, 1: big endian */  #define  BCMA_CC_CHIPST_4706_PCIE1_DISABLE	BIT(5) /* PCIE1 enable strap pin */  #define  BCMA_CC_CHIPST_5357_NAND_BOOT		BIT(4) /* NAND boot, valid for CC rev 38 and/or BCM5357 */ +#define  BCMA_CC_CHIPST_4360_XTAL_40MZ		0x00000001  #define BCMA_CC_JCMD			0x0030		/* Rev >= 10 only */  #define  BCMA_CC_JCMD_START		0x80000000  #define  BCMA_CC_JCMD_BUSY		0x80000000 @@ -315,6 +316,9 @@  #define BCMA_CC_PMU_CTL			0x0600 /* PMU control */  #define  BCMA_CC_PMU_CTL_ILP_DIV	0xFFFF0000 /* ILP div mask */  #define  BCMA_CC_PMU_CTL_ILP_DIV_SHIFT	16 +#define  BCMA_CC_PMU_CTL_RES		0x00006000 /* reset control mask */ +#define  BCMA_CC_PMU_CTL_RES_SHIFT	13 +#define  BCMA_CC_PMU_CTL_RES_RELOAD	0x2	/* reload POR values */  #define  BCMA_CC_PMU_CTL_PLL_UPD	0x00000400  #define  BCMA_CC_PMU_CTL_NOILPONW	0x00000200 /* No ILP on wait */  #define  BCMA_CC_PMU_CTL_HTREQEN	0x00000100 /* HT req enable */ @@ -607,6 +611,8 @@ void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable);  extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks); +extern u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc); +  void bcma_chipco_irq_mask(struct bcma_drv_cc *cc, u32 mask, u32 value);  u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask); diff --git a/include/linux/bcma/bcma_regs.h b/include/linux/bcma/bcma_regs.h index 7e8104bb7a7..917dcd7965e 100644 --- a/include/linux/bcma/bcma_regs.h +++ b/include/linux/bcma/bcma_regs.h @@ -37,6 +37,7 @@  #define  BCMA_IOST_BIST_DONE		0x8000  #define BCMA_RESET_CTL			0x0800  #define  BCMA_RESET_CTL_RESET		0x0001 +#define BCMA_RESET_ST			0x0804  /* BCMA PCI config space registers. */  #define BCMA_PCI_PMCSR			0x44 diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index c3a09149f79..70cf138690e 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -118,5 +118,6 @@ extern int prepare_bprm_creds(struct linux_binprm *bprm);  extern void install_exec_creds(struct linux_binprm *bprm);  extern void set_binfmt(struct linux_binfmt *new);  extern void free_bprm(struct linux_binprm *); +extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t);  #endif /* _LINUX_BINFMTS_H */ diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index cdf11191e64..22990cf4439 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -111,12 +111,13 @@ struct bio {  #define BIO_FS_INTEGRITY 9	/* fs owns integrity data, not block layer */  #define BIO_QUIET	10	/* Make BIO Quiet */  #define BIO_MAPPED_INTEGRITY 11/* integrity metadata has been remapped */ +#define BIO_SNAP_STABLE	12	/* bio data must be snapshotted during write */  /*   * Flags starting here get preserved by bio_reset() - this includes   * BIO_POOL_IDX()   */ -#define BIO_RESET_BITS	12 +#define BIO_RESET_BITS	13  #define bio_flagged(bio, flag)	((bio)->bi_flags & (1 << (flag))) diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 0ea61e07a91..7c2e030e72f 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -12,7 +12,6 @@  struct blk_trace {  	int trace_state; -	bool rq_based;  	struct rchan *rchan;  	unsigned long __percpu *sequence;  	unsigned char __percpu *msg_data; diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index cdc3bab0183..5f0b0e1f7c0 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h @@ -44,7 +44,6 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat,  				       unsigned long endpfn);  extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); -extern unsigned long free_low_memory_core_early(int nodeid);  extern unsigned long free_all_bootmem_node(pg_data_t *pgdat);  extern unsigned long free_all_bootmem(void); diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 5afc4f94d11..9e52b0626b3 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -34,6 +34,8 @@ enum bh_state_bits {  	BH_Write_EIO,	/* I/O error on write */  	BH_Unwritten,	/* Buffer is allocated on disk but not written */  	BH_Quiet,	/* Buffer Error Prinks to be quiet */ +	BH_Meta,	/* Buffer contains metadata */ +	BH_Prio,	/* Buffer should be submitted with REQ_PRIO */  	BH_PrivateStart,/* not a state bit, but the first bit available  			 * for private allocation by other entities @@ -124,6 +126,8 @@ BUFFER_FNS(Delay, delay)  BUFFER_FNS(Boundary, boundary)  BUFFER_FNS(Write_EIO, write_io_error)  BUFFER_FNS(Unwritten, unwritten) +BUFFER_FNS(Meta, meta) +BUFFER_FNS(Prio, prio)  #define bh_offset(bh)		((unsigned long)(bh)->b_data & ~PAGE_MASK) @@ -181,6 +185,7 @@ void ll_rw_block(int, int, struct buffer_head * bh[]);  int sync_dirty_buffer(struct buffer_head *bh);  int __sync_dirty_buffer(struct buffer_head *bh, int rw);  void write_dirty_buffer(struct buffer_head *bh, int rw); +int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags);  int submit_bh(int, struct buffer_head *);  void write_boundary_block(struct block_device *bdev,  			sector_t bblock, unsigned blocksize); diff --git a/include/linux/capability.h b/include/linux/capability.h index 98503b79236..d9a4f7f40f3 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -35,6 +35,7 @@ struct cpu_vfs_cap_data {  #define _KERNEL_CAP_T_SIZE     (sizeof(kernel_cap_t)) +struct file;  struct inode;  struct dentry;  struct user_namespace; @@ -211,6 +212,7 @@ extern bool capable(int cap);  extern bool ns_capable(struct user_namespace *ns, int cap);  extern bool nsown_capable(int cap);  extern bool inode_capable(const struct inode *inode, int cap); +extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);  /* audit system wants to get cap info from files as well */  extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps); diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 900af5964f5..3bff9ce09cf 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -19,6 +19,7 @@  #include <linux/idr.h>  #include <linux/workqueue.h>  #include <linux/xattr.h> +#include <linux/fs.h>  #ifdef CONFIG_CGROUPS @@ -30,10 +31,6 @@ struct css_id;  extern int cgroup_init_early(void);  extern int cgroup_init(void); -extern void cgroup_lock(void); -extern int cgroup_lock_is_held(void); -extern bool cgroup_lock_live_group(struct cgroup *cgrp); -extern void cgroup_unlock(void);  extern void cgroup_fork(struct task_struct *p);  extern void cgroup_post_fork(struct task_struct *p);  extern void cgroup_exit(struct task_struct *p, int run_callbacks); @@ -42,16 +39,27 @@ extern int cgroupstats_build(struct cgroupstats *stats,  extern int cgroup_load_subsys(struct cgroup_subsys *ss);  extern void cgroup_unload_subsys(struct cgroup_subsys *ss); -extern const struct file_operations proc_cgroup_operations; +extern int proc_cgroup_show(struct seq_file *, void *); -/* Define the enumeration of all builtin cgroup subsystems */ +/* + * Define the enumeration of all cgroup subsystems. + * + * We define ids for builtin subsystems and then modular ones. + */  #define SUBSYS(_x) _x ## _subsys_id, -#define IS_SUBSYS_ENABLED(option) IS_ENABLED(option)  enum cgroup_subsys_id { +#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option)  #include <linux/cgroup_subsys.h> +#undef IS_SUBSYS_ENABLED +	CGROUP_BUILTIN_SUBSYS_COUNT, + +	__CGROUP_SUBSYS_TEMP_PLACEHOLDER = CGROUP_BUILTIN_SUBSYS_COUNT - 1, + +#define IS_SUBSYS_ENABLED(option) IS_MODULE(option) +#include <linux/cgroup_subsys.h> +#undef IS_SUBSYS_ENABLED  	CGROUP_SUBSYS_COUNT,  }; -#undef IS_SUBSYS_ENABLED  #undef SUBSYS  /* Per-subsystem/per-cgroup state maintained by the system. */ @@ -148,6 +156,13 @@ enum {  	 * specified at mount time and thus is implemented here.  	 */  	CGRP_CPUSET_CLONE_CHILDREN, +	/* see the comment above CGRP_ROOT_SANE_BEHAVIOR for details */ +	CGRP_SANE_BEHAVIOR, +}; + +struct cgroup_name { +	struct rcu_head rcu_head; +	char name[];  };  struct cgroup { @@ -172,11 +187,23 @@ struct cgroup {  	struct cgroup *parent;		/* my parent */  	struct dentry *dentry;		/* cgroup fs entry, RCU protected */ +	/* +	 * This is a copy of dentry->d_name, and it's needed because +	 * we can't use dentry->d_name in cgroup_path(). +	 * +	 * You must acquire rcu_read_lock() to access cgrp->name, and +	 * the only place that can change it is rename(), which is +	 * protected by parent dir's i_mutex. +	 * +	 * Normally you should use cgroup_name() wrapper rather than +	 * access it directly. +	 */ +	struct cgroup_name __rcu *name; +  	/* Private pointers for each registered subsystem */  	struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];  	struct cgroupfs_root *root; -	struct cgroup *top_cgroup;  	/*  	 * List of cg_cgroup_links pointing at css_sets with @@ -213,6 +240,96 @@ struct cgroup {  	struct simple_xattrs xattrs;  }; +#define MAX_CGROUP_ROOT_NAMELEN 64 + +/* cgroupfs_root->flags */ +enum { +	/* +	 * Unfortunately, cgroup core and various controllers are riddled +	 * with idiosyncrasies and pointless options.  The following flag, +	 * when set, will force sane behavior - some options are forced on, +	 * others are disallowed, and some controllers will change their +	 * hierarchical or other behaviors. +	 * +	 * The set of behaviors affected by this flag are still being +	 * determined and developed and the mount option for this flag is +	 * prefixed with __DEVEL__.  The prefix will be dropped once we +	 * reach the point where all behaviors are compatible with the +	 * planned unified hierarchy, which will automatically turn on this +	 * flag. +	 * +	 * The followings are the behaviors currently affected this flag. +	 * +	 * - Mount options "noprefix" and "clone_children" are disallowed. +	 *   Also, cgroupfs file cgroup.clone_children is not created. +	 * +	 * - When mounting an existing superblock, mount options should +	 *   match. +	 * +	 * - Remount is disallowed. +	 * +	 * - memcg: use_hierarchy is on by default and the cgroup file for +	 *   the flag is not created. +	 * +	 * The followings are planned changes. +	 * +	 * - release_agent will be disallowed once replacement notification +	 *   mechanism is implemented. +	 */ +	CGRP_ROOT_SANE_BEHAVIOR	= (1 << 0), + +	CGRP_ROOT_NOPREFIX	= (1 << 1), /* mounted subsystems have no named prefix */ +	CGRP_ROOT_XATTR		= (1 << 2), /* supports extended attributes */ +}; + +/* + * A cgroupfs_root represents the root of a cgroup hierarchy, and may be + * associated with a superblock to form an active hierarchy.  This is + * internal to cgroup core.  Don't access directly from controllers. + */ +struct cgroupfs_root { +	struct super_block *sb; + +	/* +	 * The bitmask of subsystems intended to be attached to this +	 * hierarchy +	 */ +	unsigned long subsys_mask; + +	/* Unique id for this hierarchy. */ +	int hierarchy_id; + +	/* The bitmask of subsystems currently attached to this hierarchy */ +	unsigned long actual_subsys_mask; + +	/* A list running through the attached subsystems */ +	struct list_head subsys_list; + +	/* The root cgroup for this hierarchy */ +	struct cgroup top_cgroup; + +	/* Tracks how many cgroups are currently defined in hierarchy.*/ +	int number_of_cgroups; + +	/* A list running through the active hierarchies */ +	struct list_head root_list; + +	/* All cgroups on this root, cgroup_mutex protected */ +	struct list_head allcg_list; + +	/* Hierarchy-specific flags */ +	unsigned long flags; + +	/* IDs for cgroups in this hierarchy */ +	struct ida cgroup_ida; + +	/* The path to use for release notifications. */ +	char release_agent_path[PATH_MAX]; + +	/* The name for this hierarchy - may be empty */ +	char name[MAX_CGROUP_ROOT_NAMELEN]; +}; +  /*   * A css_set is a structure holding pointers to a set of   * cgroup_subsys_state objects. This saves space in the task struct @@ -278,6 +395,7 @@ struct cgroup_map_cb {  /* cftype->flags */  #define CFTYPE_ONLY_ON_ROOT	(1U << 0)	/* only create on root cg */  #define CFTYPE_NOT_ON_ROOT	(1U << 1)	/* don't create on root cg */ +#define CFTYPE_INSANE		(1U << 2)	/* don't create if sane_behavior */  #define MAX_CFTYPE_NAME		64 @@ -304,9 +422,6 @@ struct cftype {  	/* CFTYPE_* flags */  	unsigned int flags; -	/* file xattrs */ -	struct simple_xattrs xattrs; -  	int (*open)(struct inode *inode, struct file *file);  	ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,  			struct file *file, @@ -404,18 +519,31 @@ struct cgroup_scanner {  	void *data;  }; +/* + * See the comment above CGRP_ROOT_SANE_BEHAVIOR for details.  This + * function can be called as long as @cgrp is accessible. + */ +static inline bool cgroup_sane_behavior(const struct cgroup *cgrp) +{ +	return cgrp->root->flags & CGRP_ROOT_SANE_BEHAVIOR; +} + +/* Caller should hold rcu_read_lock() */ +static inline const char *cgroup_name(const struct cgroup *cgrp) +{ +	return rcu_dereference(cgrp->name)->name; +} +  int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts);  int cgroup_rm_cftypes(struct cgroup_subsys *ss, struct cftype *cfts);  int cgroup_is_removed(const struct cgroup *cgrp); +bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor);  int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);  int cgroup_task_count(const struct cgroup *cgrp); -/* Return true if cgrp is a descendant of the task's cgroup */ -int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task); -  /*   * Control Group taskset, used to pass around set of tasks to cgroup_subsys   * methods. @@ -458,7 +586,6 @@ struct cgroup_subsys {  	void (*bind)(struct cgroup *root);  	int subsys_id; -	int active;  	int disabled;  	int early_init;  	/* @@ -523,10 +650,16 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state(   * rcu_dereference_check() conditions, such as locks used during the   * cgroup_subsys::attach() methods.   */ +#ifdef CONFIG_PROVE_RCU +extern struct mutex cgroup_mutex;  #define task_subsys_state_check(task, subsys_id, __c)			\ -	rcu_dereference_check(task->cgroups->subsys[subsys_id],		\ -			      lockdep_is_held(&task->alloc_lock) ||	\ -			      cgroup_lock_is_held() || (__c)) +	rcu_dereference_check((task)->cgroups->subsys[(subsys_id)],	\ +			      lockdep_is_held(&(task)->alloc_lock) ||	\ +			      lockdep_is_held(&cgroup_mutex) || (__c)) +#else +#define task_subsys_state_check(task, subsys_id, __c)			\ +	rcu_dereference((task)->cgroups->subsys[(subsys_id)]) +#endif  static inline struct cgroup_subsys_state *  task_subsys_state(struct task_struct *task, int subsys_id) @@ -661,8 +794,8 @@ struct task_struct *cgroup_iter_next(struct cgroup *cgrp,  					struct cgroup_iter *it);  void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);  int cgroup_scan_tasks(struct cgroup_scanner *scan); -int cgroup_attach_task(struct cgroup *, struct task_struct *);  int cgroup_attach_task_all(struct task_struct *from, struct task_struct *); +int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from);  /*   * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works @@ -687,13 +820,6 @@ void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);  struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id); -/* - * Get a cgroup whose id is greater than or equal to id under tree of root. - * Returning a cgroup_subsys_state or NULL. - */ -struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id, -		struct cgroup_subsys_state *root, int *foundid); -  /* Returns true if root is ancestor of cg */  bool css_is_ancestor(struct cgroup_subsys_state *cg,  		     const struct cgroup_subsys_state *root); diff --git a/include/linux/cleancache.h b/include/linux/cleancache.h index 42e55deee75..4ce9056b31a 100644 --- a/include/linux/cleancache.h +++ b/include/linux/cleancache.h @@ -33,7 +33,7 @@ struct cleancache_ops {  	void (*invalidate_fs)(int);  }; -extern struct cleancache_ops +extern struct cleancache_ops *  	cleancache_register_ops(struct cleancache_ops *ops);  extern void __cleancache_init_fs(struct super_block *);  extern void __cleancache_init_shared_fs(char *, struct super_block *); @@ -42,9 +42,9 @@ extern void __cleancache_put_page(struct page *);  extern void __cleancache_invalidate_page(struct address_space *, struct page *);  extern void __cleancache_invalidate_inode(struct address_space *);  extern void __cleancache_invalidate_fs(struct super_block *); -extern int cleancache_enabled;  #ifdef CONFIG_CLEANCACHE +#define cleancache_enabled (1)  static inline bool cleancache_fs_enabled(struct page *page)  {  	return page->mapping->host->i_sb->cleancache_poolid >= 0; diff --git a/include/linux/clk-private.h b/include/linux/clk-private.h index 9c7f5807824..dd7adff76e8 100644 --- a/include/linux/clk-private.h +++ b/include/linux/clk-private.h @@ -152,7 +152,7 @@ struct clk {  		},						\  		.reg = _reg,					\  		.shift = _shift,				\ -		.width = _width,				\ +		.mask = BIT(_width) - 1,			\  		.flags = _mux_flags,				\  		.lock = _lock,					\  	};							\ diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 7f197d7addb..11860985fec 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -45,6 +45,14 @@ struct clk_hw;   * 		undo any work done in the @prepare callback. Called with   * 		prepare_lock held.   * + * @is_prepared: Queries the hardware to determine if the clock is prepared. + *		This function is allowed to sleep. Optional, if this op is not + *		set then the prepare count will be used. + * + * @unprepare_unused: Unprepare the clock atomically.  Only called from + *		clk_disable_unused for prepare clocks with special needs. + *		Called with prepare mutex held. This function may sleep. + *   * @enable:	Enable the clock atomically. This must not return until the   * 		clock is generating a valid clock signal, usable by consumer   * 		devices. Called with enable_lock held. This function must not @@ -108,6 +116,8 @@ struct clk_hw;  struct clk_ops {  	int		(*prepare)(struct clk_hw *hw);  	void		(*unprepare)(struct clk_hw *hw); +	int		(*is_prepared)(struct clk_hw *hw); +	void		(*unprepare_unused)(struct clk_hw *hw);  	int		(*enable)(struct clk_hw *hw);  	void		(*disable)(struct clk_hw *hw);  	int		(*is_enabled)(struct clk_hw *hw); @@ -239,9 +249,14 @@ struct clk_div_table {   * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the   * 	register plus one.  If CLK_DIVIDER_ONE_BASED is set then the divider is   * 	the raw value read from the register, with the value of zero considered - * 	invalid + *	invalid, unless CLK_DIVIDER_ALLOW_ZERO is set.   * CLK_DIVIDER_POWER_OF_TWO - clock divisor is 2 raised to the value read from   * 	the hardware register + * CLK_DIVIDER_ALLOW_ZERO - Allow zero divisors.  For dividers which have + *	CLK_DIVIDER_ONE_BASED set, it is possible to end up with a zero divisor. + *	Some hardware implementations gracefully handle this case and allow a + *	zero divisor by not modifying their input clock + *	(divide by one / bypass).   */  struct clk_divider {  	struct clk_hw	hw; @@ -255,6 +270,7 @@ struct clk_divider {  #define CLK_DIVIDER_ONE_BASED		BIT(0)  #define CLK_DIVIDER_POWER_OF_TWO	BIT(1) +#define CLK_DIVIDER_ALLOW_ZERO		BIT(2)  extern const struct clk_ops clk_divider_ops;  struct clk *clk_register_divider(struct device *dev, const char *name, @@ -274,7 +290,7 @@ struct clk *clk_register_divider_table(struct device *dev, const char *name,   * @reg:	register controlling multiplexer   * @shift:	shift to multiplexer bit field   * @width:	width of mutliplexer bit field - * @num_clks:	number of parent clocks + * @flags:	hardware-specific flags   * @lock:	register lock   *   * Clock with multiple selectable parents.  Implements .get_parent, .set_parent @@ -287,8 +303,9 @@ struct clk *clk_register_divider_table(struct device *dev, const char *name,  struct clk_mux {  	struct clk_hw	hw;  	void __iomem	*reg; +	u32		*table; +	u32		mask;  	u8		shift; -	u8		width;  	u8		flags;  	spinlock_t	*lock;  }; @@ -297,11 +314,19 @@ struct clk_mux {  #define CLK_MUX_INDEX_BIT		BIT(1)  extern const struct clk_ops clk_mux_ops; +  struct clk *clk_register_mux(struct device *dev, const char *name,  		const char **parent_names, u8 num_parents, unsigned long flags,  		void __iomem *reg, u8 shift, u8 width,  		u8 clk_mux_flags, spinlock_t *lock); +struct clk *clk_register_mux_table(struct device *dev, const char *name, +		const char **parent_names, u8 num_parents, unsigned long flags, +		void __iomem *reg, u8 shift, u32 mask, +		u8 clk_mux_flags, u32 *table, spinlock_t *lock); + +void of_fixed_factor_clk_setup(struct device_node *node); +  /**   * struct clk_fixed_factor - fixed multiplier and divider clock   * @@ -325,6 +350,37 @@ struct clk *clk_register_fixed_factor(struct device *dev, const char *name,  		const char *parent_name, unsigned long flags,  		unsigned int mult, unsigned int div); +/*** + * struct clk_composite - aggregate clock of mux, divider and gate clocks + * + * @hw:		handle between common and hardware-specific interfaces + * @mux_hw:	handle between composite and hardware-specific mux clock + * @rate_hw:	handle between composite and hardware-specific rate clock + * @gate_hw:	handle between composite and hardware-specific gate clock + * @mux_ops:	clock ops for mux + * @rate_ops:	clock ops for rate + * @gate_ops:	clock ops for gate + */ +struct clk_composite { +	struct clk_hw	hw; +	struct clk_ops	ops; + +	struct clk_hw	*mux_hw; +	struct clk_hw	*rate_hw; +	struct clk_hw	*gate_hw; + +	const struct clk_ops	*mux_ops; +	const struct clk_ops	*rate_ops; +	const struct clk_ops	*gate_ops; +}; + +struct clk *clk_register_composite(struct device *dev, const char *name, +		const char **parent_names, int num_parents, +		struct clk_hw *mux_hw, const struct clk_ops *mux_ops, +		struct clk_hw *rate_hw, const struct clk_ops *rate_ops, +		struct clk_hw *gate_hw, const struct clk_ops *gate_ops, +		unsigned long flags); +  /**   * clk_register - allocate a new clock, register it and return an opaque cookie   * @dev: device that is registering this clock @@ -351,6 +407,7 @@ unsigned int __clk_get_enable_count(struct clk *clk);  unsigned int __clk_get_prepare_count(struct clk *clk);  unsigned long __clk_get_rate(struct clk *clk);  unsigned long __clk_get_flags(struct clk *clk); +bool __clk_is_prepared(struct clk *clk);  bool __clk_is_enabled(struct clk *clk);  struct clk *__clk_lookup(const char *name); diff --git a/include/linux/clk.h b/include/linux/clk.h index b3ac22d0fc1..9a6d04524b1 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -28,16 +28,16 @@ struct clk;   * PRE_RATE_CHANGE - called immediately before the clk rate is changed,   *     to indicate that the rate change will proceed.  Drivers must   *     immediately terminate any operations that will be affected by the - *     rate change.  Callbacks may either return NOTIFY_DONE or - *     NOTIFY_STOP. + *     rate change.  Callbacks may either return NOTIFY_DONE, NOTIFY_OK, + *     NOTIFY_STOP or NOTIFY_BAD.   *   * ABORT_RATE_CHANGE: called if the rate change failed for some reason   *     after PRE_RATE_CHANGE.  In this case, all registered notifiers on   *     the clk will be called with ABORT_RATE_CHANGE. Callbacks must - *     always return NOTIFY_DONE. + *     always return NOTIFY_DONE or NOTIFY_OK.   *   * POST_RATE_CHANGE - called after the clk rate change has successfully - *     completed.  Callbacks must always return NOTIFY_DONE. + *     completed.  Callbacks must always return NOTIFY_DONE or NOTIFY_OK.   *   */  #define PRE_RATE_CHANGE			BIT(0) diff --git a/include/linux/clk/mxs.h b/include/linux/clk/mxs.h new file mode 100644 index 00000000000..90c30dc3efc --- /dev/null +++ b/include/linux/clk/mxs.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2013 Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_CLK_MXS_H +#define __LINUX_CLK_MXS_H + +int mx23_clocks_init(void); +int mx28_clocks_init(void); +int mxs_saif_clkmux_select(unsigned int clkmux); + +#endif diff --git a/include/linux/sunxi_timer.h b/include/linux/clk/sunxi.h index 18081787e5f..e074fdd5a23 100644 --- a/include/linux/sunxi_timer.h +++ b/include/linux/clk/sunxi.h @@ -14,11 +14,9 @@   * GNU General Public License for more details.   */ -#ifndef __SUNXI_TIMER_H -#define __SUNXI_TIMER_H +#ifndef __LINUX_CLK_SUNXI_H_ +#define __LINUX_CLK_SUNXI_H_ -#include <asm/mach/time.h> - -void sunxi_timer_init(void); +void __init sunxi_init_clocks(void);  #endif diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 66346521cb6..963d7143138 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -8,6 +8,20 @@  #ifndef _LINUX_CLOCKCHIPS_H  #define _LINUX_CLOCKCHIPS_H +/* Clock event notification values */ +enum clock_event_nofitiers { +	CLOCK_EVT_NOTIFY_ADD, +	CLOCK_EVT_NOTIFY_BROADCAST_ON, +	CLOCK_EVT_NOTIFY_BROADCAST_OFF, +	CLOCK_EVT_NOTIFY_BROADCAST_FORCE, +	CLOCK_EVT_NOTIFY_BROADCAST_ENTER, +	CLOCK_EVT_NOTIFY_BROADCAST_EXIT, +	CLOCK_EVT_NOTIFY_SUSPEND, +	CLOCK_EVT_NOTIFY_RESUME, +	CLOCK_EVT_NOTIFY_CPU_DYING, +	CLOCK_EVT_NOTIFY_CPU_DEAD, +}; +  #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD  #include <linux/clocksource.h> @@ -26,20 +40,6 @@ enum clock_event_mode {  	CLOCK_EVT_MODE_RESUME,  }; -/* Clock event notification values */ -enum clock_event_nofitiers { -	CLOCK_EVT_NOTIFY_ADD, -	CLOCK_EVT_NOTIFY_BROADCAST_ON, -	CLOCK_EVT_NOTIFY_BROADCAST_OFF, -	CLOCK_EVT_NOTIFY_BROADCAST_FORCE, -	CLOCK_EVT_NOTIFY_BROADCAST_ENTER, -	CLOCK_EVT_NOTIFY_BROADCAST_EXIT, -	CLOCK_EVT_NOTIFY_SUSPEND, -	CLOCK_EVT_NOTIFY_RESUME, -	CLOCK_EVT_NOTIFY_CPU_DYING, -	CLOCK_EVT_NOTIFY_CPU_DEAD, -}; -  /*   * Clock event features   */ @@ -55,6 +55,11 @@ enum clock_event_nofitiers {  #define CLOCK_EVT_FEAT_C3STOP		0x000008  #define CLOCK_EVT_FEAT_DUMMY		0x000010 +/* + * Core shall set the interrupt affinity dynamically in broadcast mode + */ +#define CLOCK_EVT_FEAT_DYNIRQ		0x000020 +  /**   * struct clock_event_device - clock event device descriptor   * @event_handler:	Assigned by the framework to be called by the low @@ -170,10 +175,16 @@ extern void tick_broadcast(const struct cpumask *mask);  extern int tick_receive_broadcast(void);  #endif +#if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT) +extern int tick_check_broadcast_expired(void); +#else +static inline int tick_check_broadcast_expired(void) { return 0; } +#endif +  #ifdef CONFIG_GENERIC_CLOCKEVENTS  extern void clockevents_notify(unsigned long reason, void *arg);  #else -# define clockevents_notify(reason, arg) do { } while (0) +static inline void clockevents_notify(unsigned long reason, void *arg) {}  #endif  #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */ @@ -181,7 +192,8 @@ extern void clockevents_notify(unsigned long reason, void *arg);  static inline void clockevents_suspend(void) {}  static inline void clockevents_resume(void) {} -#define clockevents_notify(reason, arg) do { } while (0) +static inline void clockevents_notify(unsigned long reason, void *arg) {} +static inline int tick_check_broadcast_expired(void) { return 0; }  #endif diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 27cfda427dd..7279b94c01d 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -206,6 +206,7 @@ struct clocksource {  #define CLOCK_SOURCE_WATCHDOG			0x10  #define CLOCK_SOURCE_VALID_FOR_HRES		0x20  #define CLOCK_SOURCE_UNSTABLE			0x40 +#define CLOCK_SOURCE_SUSPEND_NONSTOP		0x80  /* simplify initialization of mask field */  #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) @@ -332,15 +333,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *,  extern int clocksource_i8253_init(void); +struct device_node; +typedef void(*clocksource_of_init_fn)(struct device_node *);  #ifdef CONFIG_CLKSRC_OF  extern void clocksource_of_init(void);  #define CLOCKSOURCE_OF_DECLARE(name, compat, fn)			\  	static const struct of_device_id __clksrc_of_table_##name	\  		__used __section(__clksrc_of_table)			\ -		 = { .compatible = compat, .data = fn }; +		 = { .compatible = compat,				\ +		     .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }  #else -#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) +static inline void clocksource_of_init(void) {} +#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)			\ +	static const struct of_device_id __clksrc_of_table_##name	\ +		__attribute__((unused))					\ +		 = { .compatible = compat,				\ +		     .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }  #endif  #endif /* _LINUX_CLOCKSOURCE_H */ diff --git a/include/linux/cn_proc.h b/include/linux/cn_proc.h index 2c1bc1ea04e..1d5b02a96c4 100644 --- a/include/linux/cn_proc.h +++ b/include/linux/cn_proc.h @@ -26,6 +26,7 @@ void proc_id_connector(struct task_struct *task, int which_id);  void proc_sid_connector(struct task_struct *task);  void proc_ptrace_connector(struct task_struct *task, int which_id);  void proc_comm_connector(struct task_struct *task); +void proc_coredump_connector(struct task_struct *task);  void proc_exit_connector(struct task_struct *task);  #else  static inline void proc_fork_connector(struct task_struct *task) @@ -48,6 +49,9 @@ static inline void proc_ptrace_connector(struct task_struct *task,  					 int ptrace_id)  {} +static inline void proc_coredump_connector(struct task_struct *task) +{} +  static inline void proc_exit_connector(struct task_struct *task)  {}  #endif	/* CONFIG_PROC_EVENTS */ diff --git a/include/linux/compat.h b/include/linux/compat.h index 76a87fb57ac..d53c35352ea 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -27,12 +27,6 @@  #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))  #endif -#define __SC_CCAST1(t1, a1)      __SC_DELOUSE(t1,a1) -#define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__) -#define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__) -#define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__) -#define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__) -#define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)  #define COMPAT_SYSCALL_DEFINE1(name, ...) \          COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)  #define COMPAT_SYSCALL_DEFINE2(name, ...) \ @@ -46,24 +40,15 @@  #define COMPAT_SYSCALL_DEFINE6(name, ...) \  	COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -  #define COMPAT_SYSCALL_DEFINEx(x, name, ...)				\ -	asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__));	\ -	static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__));	\ -	asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__))	\ +	asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ +	static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ +	asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\  	{								\ -		return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__));	\ +		return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));	\  	}								\  	SYSCALL_ALIAS(compat_sys##name, compat_SyS##name);		\ -	static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)) - -#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ - -#define COMPAT_SYSCALL_DEFINEx(x, name, ...)				\ -	asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)) - -#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ +	static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))  #ifndef compat_user_stack_pointer  #define compat_user_stack_pointer() current_user_stack_pointer() @@ -141,11 +126,11 @@ typedef struct {  } compat_sigset_t;  struct compat_sigaction { -#ifndef __ARCH_HAS_ODD_SIGACTION +#ifndef __ARCH_HAS_IRIX_SIGACTION  	compat_uptr_t			sa_handler;  	compat_ulong_t			sa_flags;  #else -	compat_ulong_t			sa_flags; +	compat_uint_t			sa_flags;  	compat_uptr_t			sa_handler;  #endif  #ifdef __ARCH_HAS_SA_RESTORER @@ -326,21 +311,13 @@ asmlinkage long  compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,  			   compat_size_t __user *len_ptr); -#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC -long compat_sys_semctl(int first, int second, int third, void __user *uptr); -long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); -long compat_sys_msgrcv(int first, int second, int msgtyp, int third, -		int version, void __user *uptr); -long compat_sys_shmat(int first, int second, compat_uptr_t third, int version, -		void __user *uptr); -#else -long compat_sys_semctl(int semid, int semnum, int cmd, int arg); -long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, +asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32); +asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); +asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg); +asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,  		compat_ssize_t msgsz, int msgflg); -long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, +asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,  		compat_ssize_t msgsz, long msgtyp, int msgflg); -long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); -#endif  long compat_sys_msgctl(int first, int second, void __user *uptr);  long compat_sys_shmctl(int first, int second, void __user *uptr);  long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, @@ -444,13 +421,13 @@ extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,  asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,  				  compat_long_t addr, compat_long_t data); +asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, size_t);  /*   * epoll (fs/eventpoll.c) compat bits follow ...   */ -struct epoll_event; -#define compat_epoll_event	epoll_event +struct epoll_event;	/* fortunately, this one is fixed-layout */  asmlinkage long compat_sys_epoll_pwait(int epfd, -			struct compat_epoll_event __user *events, +			struct epoll_event __user *events,  			int maxevents, int timeout,  			const compat_sigset_t __user *sigmask,  			compat_size_t sigsetsize); @@ -685,6 +662,8 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,  asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,  				    compat_off_t __user *offset, compat_size_t count); +asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd, +				    compat_loff_t __user *offset, compat_size_t count);  asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,  				       compat_stack_t __user *uoss_ptr); diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 68b162d9225..842de225055 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h @@ -13,7 +13,7 @@  #define __must_check 		__attribute__((warn_unused_result))  #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) -#if GCC_VERSION >= 40100 +#if GCC_VERSION >= 40100 && GCC_VERSION < 40600  # define __compiletime_object_size(obj) __builtin_object_size(obj, 0)  #endif diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 10b8f23fab0..92669cd182a 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -351,4 +351,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);   */  #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) +/* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ +#ifdef CONFIG_KPROBES +# define __kprobes	__attribute__((__section__(".kprobes.text"))) +#else +# define __kprobes +#endif  #endif /* __LINUX_COMPILER_H */ diff --git a/include/linux/console.h b/include/linux/console.h index 29680a8cda9..73bab0f58af 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -141,6 +141,7 @@ struct console {  	for (con = console_drivers; con != NULL; con = con->next)  extern int console_set_on_cmdline; +extern struct console *early_console;  extern int add_preferred_console(char *name, int idx, char *options);  extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options); diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h index b28d161c109..365f4a61bf0 100644 --- a/include/linux/context_tracking.h +++ b/include/linux/context_tracking.h @@ -1,9 +1,9 @@  #ifndef _LINUX_CONTEXT_TRACKING_H  #define _LINUX_CONTEXT_TRACKING_H -#ifdef CONFIG_CONTEXT_TRACKING  #include <linux/sched.h>  #include <linux/percpu.h> +#include <asm/ptrace.h>  struct context_tracking {  	/* @@ -13,12 +13,13 @@ struct context_tracking {  	 * may be further optimized using static keys.  	 */  	bool active; -	enum { +	enum ctx_state {  		IN_KERNEL = 0,  		IN_USER,  	} state;  }; +#ifdef CONFIG_CONTEXT_TRACKING  DECLARE_PER_CPU(struct context_tracking, context_tracking);  static inline bool context_tracking_in_user(void) @@ -33,12 +34,31 @@ static inline bool context_tracking_active(void)  extern void user_enter(void);  extern void user_exit(void); + +static inline enum ctx_state exception_enter(void) +{ +	enum ctx_state prev_ctx; + +	prev_ctx = this_cpu_read(context_tracking.state); +	user_exit(); + +	return prev_ctx; +} + +static inline void exception_exit(enum ctx_state prev_ctx) +{ +	if (prev_ctx == IN_USER) +		user_enter(); +} +  extern void context_tracking_task_switch(struct task_struct *prev,  					 struct task_struct *next);  #else  static inline bool context_tracking_in_user(void) { return false; }  static inline void user_enter(void) { }  static inline void user_exit(void) { } +static inline enum ctx_state exception_enter(void) { return 0; } +static inline void exception_exit(enum ctx_state prev_ctx) { }  static inline void context_tracking_task_switch(struct task_struct *prev,  						struct task_struct *next) { }  #endif /* !CONFIG_CONTEXT_TRACKING */ diff --git a/include/linux/cpu.h b/include/linux/cpu.h index ce7a074f251..c6f6e0839b6 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -212,4 +212,20 @@ static inline int disable_nonboot_cpus(void) { return 0; }  static inline void enable_nonboot_cpus(void) {}  #endif /* !CONFIG_PM_SLEEP_SMP */ +enum cpuhp_state { +	CPUHP_OFFLINE, +	CPUHP_ONLINE, +}; + +void cpu_startup_entry(enum cpuhp_state state); +void cpu_idle(void); + +void cpu_idle_poll_ctrl(bool enable); + +void arch_cpu_idle(void); +void arch_cpu_idle_prepare(void); +void arch_cpu_idle_enter(void); +void arch_cpu_idle_exit(void); +void arch_cpu_idle_dead(void); +  #endif /* _LINUX_CPU_H_ */ diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index a22944ca052..037d36ae63e 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -106,6 +106,7 @@ struct cpufreq_policy {  					 * governors are used */  	unsigned int		policy; /* see above */  	struct cpufreq_governor	*governor; /* see below */ +	void			*governor_data;  	struct work_struct	update; /* if update_policy() needs to be  					 * called, but you're in IRQ context */ @@ -178,9 +179,11 @@ static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mu   *                          CPUFREQ GOVERNORS                        *   *********************************************************************/ -#define CPUFREQ_GOV_START  1 -#define CPUFREQ_GOV_STOP   2 -#define CPUFREQ_GOV_LIMITS 3 +#define CPUFREQ_GOV_START	1 +#define CPUFREQ_GOV_STOP	2 +#define CPUFREQ_GOV_LIMITS	3 +#define CPUFREQ_GOV_POLICY_INIT	4 +#define CPUFREQ_GOV_POLICY_EXIT	5  struct cpufreq_governor {  	char	name[CPUFREQ_NAME_LEN]; @@ -229,6 +232,13 @@ struct cpufreq_driver {  	struct module           *owner;  	char			name[CPUFREQ_NAME_LEN];  	u8			flags; +	/* +	 * This should be set by platforms having multiple clock-domains, i.e. +	 * supporting multiple policies. With this sysfs directories of governor +	 * would be created in cpu/cpu<num>/cpufreq/ directory and so they can +	 * use the same governor with different tunables for different clusters. +	 */ +	bool			have_governor_per_policy;  	/* needed by all drivers */  	int	(*init)		(struct cpufreq_policy *policy); @@ -268,8 +278,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data);  int cpufreq_unregister_driver(struct cpufreq_driver *driver_data); -void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state); - +void cpufreq_notify_transition(struct cpufreq_policy *policy, +		struct cpufreq_freqs *freqs, unsigned int state);  static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max)  { @@ -329,6 +339,7 @@ const char *cpufreq_get_current_driver(void);   *********************************************************************/  int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);  int cpufreq_update_policy(unsigned int cpu); +bool have_governor_per_policy(void);  #ifdef CONFIG_CPU_FREQ  /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */ diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 480c14dc1dd..3c86faa5979 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -57,6 +57,7 @@ struct cpuidle_state {  /* Idle State Flags */  #define CPUIDLE_FLAG_TIME_VALID	(0x01) /* is residency time measurable? */  #define CPUIDLE_FLAG_COUPLED	(0x02) /* state applies to multiple cpus */ +#define CPUIDLE_FLAG_TIMER_STOP (0x04)  /* timer is stopped on this state */  #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) @@ -104,8 +105,8 @@ struct cpuidle_driver {  	struct module 		*owner;  	int                     refcnt; -	/* set to 1 to use the core cpuidle time keeping (for all states). */ -	unsigned int		en_core_tk_irqen:1; +        /* used by the cpuidle framework to setup the broadcast timer */ +	unsigned int            bctimer:1;  	/* states array must be ordered in decreasing power consumption */  	struct cpuidle_state	states[CPUIDLE_STATE_MAX];  	int			state_count; @@ -122,17 +123,15 @@ extern void cpuidle_driver_unref(void);  extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);  extern int cpuidle_register_device(struct cpuidle_device *dev);  extern void cpuidle_unregister_device(struct cpuidle_device *dev); - +extern int cpuidle_register(struct cpuidle_driver *drv, +			    const struct cpumask *const coupled_cpus); +extern void cpuidle_unregister(struct cpuidle_driver *drv);  extern void cpuidle_pause_and_lock(void);  extern void cpuidle_resume_and_unlock(void);  extern void cpuidle_pause(void);  extern void cpuidle_resume(void);  extern int cpuidle_enable_device(struct cpuidle_device *dev);  extern void cpuidle_disable_device(struct cpuidle_device *dev); -extern int cpuidle_wrap_enter(struct cpuidle_device *dev, -				struct cpuidle_driver *drv, int index, -				int (*enter)(struct cpuidle_device *dev, -					struct cpuidle_driver *drv, int index));  extern int cpuidle_play_dead(void);  extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev); @@ -151,7 +150,10 @@ static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }  static inline int cpuidle_register_device(struct cpuidle_device *dev)  {return -ENODEV; }  static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { } - +static inline int cpuidle_register(struct cpuidle_driver *drv, +				   const struct cpumask *const coupled_cpus) +{return -ENODEV; } +static inline void cpuidle_unregister(struct cpuidle_driver *drv) { }  static inline void cpuidle_pause_and_lock(void) { }  static inline void cpuidle_resume_and_unlock(void) { }  static inline void cpuidle_pause(void) { } @@ -159,11 +161,6 @@ static inline void cpuidle_resume(void) { }  static inline int cpuidle_enable_device(struct cpuidle_device *dev)  {return -ENODEV; }  static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } -static inline int cpuidle_wrap_enter(struct cpuidle_device *dev, -				struct cpuidle_driver *drv, int index, -				int (*enter)(struct cpuidle_device *dev, -					struct cpuidle_driver *drv, int index)) -{ return -ENODEV; }  static inline int cpuidle_play_dead(void) {return -ENODEV; }  #endif diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 032560295fc..d08e4d2a9b9 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -591,6 +591,21 @@ static inline int cpulist_scnprintf(char *buf, int len,  }  /** + * cpumask_parse - extract a cpumask from from a string + * @buf: the buffer to extract from + * @dstp: the cpumask to set. + * + * Returns -errno, or 0 for success. + */ +static inline int cpumask_parse(const char *buf, struct cpumask *dstp) +{ +	char *nl = strchr(buf, '\n'); +	int len = nl ? nl - buf : strlen(buf); + +	return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpumask_bits); +} + +/**   * cpulist_parse - extract a cpumask from a user string of ranges   * @buf: the buffer to extract from   * @dstp: the cpumask to set. diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 8c8a60d2940..cc1b01cf203 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h @@ -11,7 +11,6 @@  #include <linux/sched.h>  #include <linux/cpumask.h>  #include <linux/nodemask.h> -#include <linux/cgroup.h>  #include <linux/mm.h>  #ifdef CONFIG_CPUSETS @@ -64,10 +63,9 @@ extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,  extern int cpuset_memory_pressure_enabled;  extern void __cpuset_memory_pressure_bump(void); -extern const struct file_operations proc_cpuset_operations; -struct seq_file;  extern void cpuset_task_status_allowed(struct seq_file *m,  					struct task_struct *task); +extern int proc_cpuset_show(struct seq_file *, void *);  extern int cpuset_mem_spread_node(void);  extern int cpuset_slab_spread_node(void); diff --git a/include/linux/ctype.h b/include/linux/ctype.h index 8acfe312f94..653589e3e30 100644 --- a/include/linux/ctype.h +++ b/include/linux/ctype.h @@ -61,4 +61,10 @@ static inline char _tolower(const char c)  	return c | 0x20;  } +/* Fast check for octal digit */ +static inline int isodigit(const char c) +{ +	return c >= '0' && c <= '7'; +} +  #endif diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index a975de1ff59..21ca773f77b 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h @@ -27,7 +27,7 @@ extern int debug_locks_off(void);  									\  	if (!oops_in_progress && unlikely(c)) {				\  		if (debug_locks_off() && !debug_locks_silent)		\ -			WARN_ON(1);					\ +			WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c);		\  		__ret = 1;						\  	}								\  	__ret;								\ @@ -51,7 +51,7 @@ struct task_struct;  extern void debug_show_all_locks(void);  extern void debug_show_held_locks(struct task_struct *task);  extern void debug_check_no_locks_freed(const void *from, unsigned long len); -extern void debug_check_no_locks_held(void); +extern void debug_check_no_locks_held(struct task_struct *task);  #else  static inline void debug_show_all_locks(void)  { @@ -67,7 +67,7 @@ debug_check_no_locks_freed(const void *from, unsigned long len)  }  static inline void -debug_check_no_locks_held(void) +debug_check_no_locks_held(struct task_struct *task)  {  }  #endif diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index e83ef39b3be..fe8c4476f7e 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -213,7 +213,7 @@ struct devfreq_simple_ondemand_data {  #endif  #else /* !CONFIG_PM_DEVFREQ */ -static struct devfreq *devfreq_add_device(struct device *dev, +static inline struct devfreq *devfreq_add_device(struct device *dev,  					  struct devfreq_dev_profile *profile,  					  const char *governor_name,  					  void *data) @@ -221,34 +221,34 @@ static struct devfreq *devfreq_add_device(struct device *dev,  	return NULL;  } -static int devfreq_remove_device(struct devfreq *devfreq) +static inline int devfreq_remove_device(struct devfreq *devfreq)  {  	return 0;  } -static int devfreq_suspend_device(struct devfreq *devfreq) +static inline int devfreq_suspend_device(struct devfreq *devfreq)  {  	return 0;  } -static int devfreq_resume_device(struct devfreq *devfreq) +static inline int devfreq_resume_device(struct devfreq *devfreq)  {  	return 0;  } -static struct opp *devfreq_recommended_opp(struct device *dev, +static inline struct opp *devfreq_recommended_opp(struct device *dev,  					   unsigned long *freq, u32 flags)  { -	return -EINVAL; +	return ERR_PTR(-EINVAL);  } -static int devfreq_register_opp_notifier(struct device *dev, +static inline int devfreq_register_opp_notifier(struct device *dev,  					 struct devfreq *devfreq)  {  	return -EINVAL;  } -static int devfreq_unregister_opp_notifier(struct device *dev, +static inline int devfreq_unregister_opp_notifier(struct device *dev,  					   struct devfreq *devfreq)  {  	return -EINVAL; diff --git a/include/linux/device.h b/include/linux/device.h index 9d6464ea99c..c0a12612532 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -25,6 +25,7 @@  #include <linux/pm.h>  #include <linux/atomic.h>  #include <linux/ratelimit.h> +#include <linux/uidgid.h>  #include <asm/device.h>  struct device; @@ -111,17 +112,11 @@ struct bus_type {  	struct iommu_ops *iommu_ops;  	struct subsys_private *p; +	struct lock_class_key lock_key;  }; -/* This is a #define to keep the compiler from merging different - * instances of the __key variable */ -#define bus_register(subsys)			\ -({						\ -	static struct lock_class_key __key;	\ -	__bus_register(subsys, &__key);	\ -}) -extern int __must_check __bus_register(struct bus_type *bus, -				       struct lock_class_key *key); +extern int __must_check bus_register(struct bus_type *bus); +  extern void bus_unregister(struct bus_type *bus);  extern int __must_check bus_rescan_devices(struct bus_type *bus); @@ -302,6 +297,8 @@ void subsys_interface_unregister(struct subsys_interface *sif);  int subsys_system_register(struct bus_type *subsys,  			   const struct attribute_group **groups); +int subsys_virtual_register(struct bus_type *subsys, +			    const struct attribute_group **groups);  /**   * struct class - device classes @@ -471,7 +468,8 @@ struct device_type {  	const char *name;  	const struct attribute_group **groups;  	int (*uevent)(struct device *dev, struct kobj_uevent_env *env); -	char *(*devnode)(struct device *dev, umode_t *mode); +	char *(*devnode)(struct device *dev, umode_t *mode, +			 kuid_t *uid, kgid_t *gid);  	void (*release)(struct device *dev);  	const struct dev_pm_ops *pm; @@ -578,6 +576,10 @@ void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res);  void __iomem *devm_request_and_ioremap(struct device *dev,  			struct resource *res); +/* allows to add/remove a custom action to devres stack */ +int devm_add_action(struct device *dev, void (*action)(void *), void *data); +void devm_remove_action(struct device *dev, void (*action)(void *), void *data); +  struct device_dma_parameters {  	/*  	 * a low level driver may set these to teach IOMMU code about @@ -849,7 +851,8 @@ extern int device_rename(struct device *dev, const char *new_name);  extern int device_move(struct device *dev, struct device *new_parent,  		       enum dpm_order dpm_order);  extern const char *device_get_devnode(struct device *dev, -				      umode_t *mode, const char **tmp); +				      umode_t *mode, kuid_t *uid, kgid_t *gid, +				      const char **tmp);  extern void *dev_get_drvdata(const struct device *dev);  extern int dev_set_drvdata(struct device *dev, void *data); diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 9978b614a1a..dfac5ed3112 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -112,6 +112,8 @@ struct dma_buf_ops {   * @file: file pointer used for sharing buffers across, and for refcounting.   * @attachments: list of dma_buf_attachment that denotes all devices attached.   * @ops: dma_buf_ops associated with this buffer object. + * @exp_name: name of the exporter; useful for debugging. + * @list_node: node for dma_buf accounting and debugging.   * @priv: exporter specific private data for this buffer object.   */  struct dma_buf { @@ -123,6 +125,8 @@ struct dma_buf {  	struct mutex lock;  	unsigned vmapping_counter;  	void *vmap_ptr; +	const char *exp_name; +	struct list_head list_node;  	void *priv;  }; @@ -162,8 +166,13 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,  							struct device *dev);  void dma_buf_detach(struct dma_buf *dmabuf,  				struct dma_buf_attachment *dmabuf_attach); -struct dma_buf *dma_buf_export(void *priv, const struct dma_buf_ops *ops, -			       size_t size, int flags); + +struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, +			       size_t size, int flags, const char *); + +#define dma_buf_export(priv, ops, size, flags)	\ +	dma_buf_export_named(priv, ops, size, flags, __FILE__) +  int dma_buf_fd(struct dma_buf *dmabuf, int flags);  struct dma_buf *dma_buf_get(int fd);  void dma_buf_put(struct dma_buf *dmabuf); @@ -185,5 +194,6 @@ int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,  		 unsigned long);  void *dma_buf_vmap(struct dma_buf *);  void dma_buf_vunmap(struct dma_buf *, void *vaddr); - +int dma_buf_debugfs_create_file(const char *name, +				int (*write)(struct seq_file *));  #endif /* __DMA_BUF_H__ */ diff --git a/include/linux/dmi.h b/include/linux/dmi.h index f156cca25ad..b6eb7a05d58 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h @@ -99,6 +99,7 @@ extern const char * dmi_get_system_info(int field);  extern const struct dmi_device * dmi_find_device(int type, const char *name,  	const struct dmi_device *from);  extern void dmi_scan_machine(void); +extern void dmi_set_dump_stack_arch_desc(void);  extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);  extern int dmi_name_in_vendors(const char *str);  extern int dmi_name_in_serial(const char *str); @@ -114,6 +115,7 @@ static inline const char * dmi_get_system_info(int field) { return NULL; }  static inline const struct dmi_device * dmi_find_device(int type, const char *name,  	const struct dmi_device *from) { return NULL; }  static inline void dmi_scan_machine(void) { return; } +static inline void dmi_set_dump_stack_arch_desc(void) { }  static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)  {  	if (yearp) diff --git a/include/linux/edac.h b/include/linux/edac.h index 4fd4999ccb5..0b763276f61 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -561,7 +561,6 @@ struct csrow_info {  	u32 ue_count;		/* Uncorrectable Errors for this csrow */  	u32 ce_count;		/* Correctable Errors for this csrow */ -	u32 nr_pages;		/* combined pages count of all channels */  	struct mem_ctl_info *mci;	/* the parent */ @@ -676,11 +675,11 @@ struct mem_ctl_info {  	 * sees memory sticks ("dimms"), and the ones that sees memory ranks.  	 * All old memory controllers enumerate memories per rank, but most  	 * of the recent drivers enumerate memories per DIMM, instead. -	 * When the memory controller is per rank, mem_is_per_rank is true. +	 * When the memory controller is per rank, csbased is true.  	 */  	unsigned n_layers;  	struct edac_mc_layer *layers; -	bool mem_is_per_rank; +	bool csbased;  	/*  	 * DIMM info. Will eventually remove the entire csrows_info some day @@ -741,8 +740,6 @@ struct mem_ctl_info {  	u32 fake_inject_ue;  	u16 fake_inject_count;  #endif -	__u8 csbased : 1,	/* csrow-based memory controller */ -	     __resv  : 7;  };  #endif diff --git a/include/linux/efi.h b/include/linux/efi.h index 9bf2f1fcae2..2bc0ad78d05 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -333,6 +333,7 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,  					      unsigned long count,  					      u64 *max_size,  					      int *reset_type); +typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long size);  /*   *  EFI Configuration Table and GUID definitions @@ -575,9 +576,15 @@ extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if pos  #ifdef CONFIG_X86  extern void efi_late_init(void);  extern void efi_free_boot_services(void); +extern efi_status_t efi_query_variable_store(u32 attributes, unsigned long size);  #else  static inline void efi_late_init(void) {}  static inline void efi_free_boot_services(void) {} + +static inline efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) +{ +	return EFI_SUCCESS; +}  #endif  extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);  extern u64 efi_get_iobase (void); @@ -663,6 +670,12 @@ static inline int efi_enabled(int facility)  				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \  				EFI_VARIABLE_APPEND_WRITE)  /* + * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) + * not including trailing NUL + */ +#define EFI_VARIABLE_GUID_LEN 36 + +/*   * The type of search to perform when calling boottime->locate_handle   */  #define EFI_LOCATE_ALL_HANDLES			0 @@ -719,7 +732,6 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages)  	*addr &= PAGE_MASK;  } -#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)  /*   * EFI Variable support.   * @@ -731,7 +743,7 @@ struct efivar_operations {  	efi_get_variable_t *get_variable;  	efi_get_next_variable_t *get_next_variable;  	efi_set_variable_t *set_variable; -	efi_query_variable_info_t *query_variable_info; +	efi_query_variable_store_t *query_variable_store;  };  struct efivars { @@ -745,19 +757,88 @@ struct efivars {  	 * which is protected by the BKL, so that path is safe.  	 */  	spinlock_t lock; -	struct list_head list;  	struct kset *kset;  	struct kobject *kobject; -	struct bin_attribute *new_var, *del_var;  	const struct efivar_operations *ops; -	struct efivar_entry *walk_entry; -	struct pstore_info efi_pstore_info;  }; -int register_efivars(struct efivars *efivars, +/* + * The maximum size of VariableName + Data = 1024 + * Therefore, it's reasonable to save that much + * space in each part of the structure, + * and we use a page for reading/writing. + */ + +struct efi_variable { +	efi_char16_t  VariableName[1024/sizeof(efi_char16_t)]; +	efi_guid_t    VendorGuid; +	unsigned long DataSize; +	__u8          Data[1024]; +	efi_status_t  Status; +	__u32         Attributes; +} __attribute__((packed)); + +struct efivar_entry { +	struct efi_variable var; +	struct list_head list; +	struct kobject kobj; +}; + +extern struct list_head efivar_sysfs_list; + +static inline void +efivar_unregister(struct efivar_entry *var) +{ +	kobject_put(&var->kobj); +} + +int efivars_register(struct efivars *efivars,  		     const struct efivar_operations *ops, -		     struct kobject *parent_kobj); -void unregister_efivars(struct efivars *efivars); +		     struct kobject *kobject); +int efivars_unregister(struct efivars *efivars); +struct kobject *efivars_kobject(void); + +int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), +		void *data, bool atomic, bool duplicates, +		struct list_head *head); + +void efivar_entry_add(struct efivar_entry *entry, struct list_head *head); +void efivar_entry_remove(struct efivar_entry *entry); + +int __efivar_entry_delete(struct efivar_entry *entry); +int efivar_entry_delete(struct efivar_entry *entry); + +int efivar_entry_size(struct efivar_entry *entry, unsigned long *size); +int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, +		       unsigned long *size, void *data); +int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, +		     unsigned long *size, void *data); +int efivar_entry_set(struct efivar_entry *entry, u32 attributes, +		     unsigned long size, void *data, struct list_head *head); +int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, +			      unsigned long *size, void *data, bool *set); +int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, +			  bool block, unsigned long size, void *data); + +void efivar_entry_iter_begin(void); +void efivar_entry_iter_end(void); + +int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), +			struct list_head *head, void *data, +			struct efivar_entry **prev); +int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), +		      struct list_head *head, void *data); + +struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, +				       struct list_head *head, bool remove); + +bool efivar_validate(struct efi_variable *var, u8 *data, unsigned long len); + +extern struct work_struct efivar_work; +void efivar_run_worker(void); + +#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) +int efivars_sysfs_init(void);  #endif /* CONFIG_EFI_VARS */ diff --git a/include/linux/evm.h b/include/linux/evm.h index 9fc13a76092..1fcb88ca88d 100644 --- a/include/linux/evm.h +++ b/include/linux/evm.h @@ -96,5 +96,5 @@ static inline int evm_inode_init_security(struct inode *inode,  	return 0;  } -#endif /* CONFIG_EVM_H */ +#endif /* CONFIG_EVM */  #endif /* LINUX_EVM_H */ diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 5b9b5b31718..41b223a59a6 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -85,6 +85,17 @@ enum fid_type {  	FILEID_NILFS_WITH_PARENT = 0x62,  	/* +	 * 32 bit generation number, 40 bit i_pos. +	 */ +	FILEID_FAT_WITHOUT_PARENT = 0x71, + +	/* +	 * 32 bit generation number, 40 bit i_pos, +	 * 32 bit parent generation number, 40 bit parent i_pos +	 */ +	FILEID_FAT_WITH_PARENT = 0x72, + +	/*  	 * Filesystems must not use 0xff file ID.  	 */  	FILEID_INVALID = 0xff, diff --git a/include/linux/fb.h b/include/linux/fb.h index 58b98606ac2..d49c60f5aa4 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -501,6 +501,8 @@ struct fb_info {  			resource_size_t size;  		} ranges[0];  	} *apertures; + +	bool skip_vt_switch; /* no VT switch on suspend/resume required */  };  static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index fb7dacae052..085197bd881 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h @@ -27,7 +27,6 @@ struct fdtable {  	unsigned long *close_on_exec;  	unsigned long *open_fds;  	struct rcu_head rcu; -	struct fdtable *next;  };  static inline bool close_on_exec(int fd, const struct fdtable *fdt) diff --git a/include/linux/filter.h b/include/linux/filter.h index c45eabc135e..c050dcc322a 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -48,8 +48,22 @@ extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen);  extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len);  #ifdef CONFIG_BPF_JIT +#include <stdarg.h> +#include <linux/linkage.h> +#include <linux/printk.h> +  extern void bpf_jit_compile(struct sk_filter *fp);  extern void bpf_jit_free(struct sk_filter *fp); + +static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen, +				u32 pass, void *image) +{ +	pr_err("flen=%u proglen=%u pass=%u image=%p\n", +	       flen, proglen, pass, image); +	if (image) +		print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_ADDRESS, +			       16, 1, image, proglen, false); +}  #define SK_RUN_FILTER(FILTER, SKB) (*FILTER->bpf_func)(SKB, FILTER->insns)  #else  static inline void bpf_jit_compile(struct sk_filter *fp) @@ -126,6 +140,7 @@ enum {  	BPF_S_ANC_SECCOMP_LD_W,  	BPF_S_ANC_VLAN_TAG,  	BPF_S_ANC_VLAN_TAG_PRESENT, +	BPF_S_ANC_PAY_OFFSET,  };  #endif /* __LINUX_FILTER_H__ */ diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 043a5cf8b5b..e70df40d84f 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -3,7 +3,6 @@  #ifndef FREEZER_H_INCLUDED  #define FREEZER_H_INCLUDED -#include <linux/debug_locks.h>  #include <linux/sched.h>  #include <linux/wait.h>  #include <linux/atomic.h> @@ -49,8 +48,6 @@ extern void thaw_kernel_threads(void);  static inline bool try_to_freeze(void)  { -	if (!(current->flags & PF_NOFREEZE)) -		debug_check_no_locks_held();  	might_sleep();  	if (likely(!freezing(current)))  		return false; diff --git a/include/linux/frontswap.h b/include/linux/frontswap.h index 30442547b9e..8293262401d 100644 --- a/include/linux/frontswap.h +++ b/include/linux/frontswap.h @@ -14,7 +14,7 @@ struct frontswap_ops {  };  extern bool frontswap_enabled; -extern struct frontswap_ops +extern struct frontswap_ops *  	frontswap_register_ops(struct frontswap_ops *ops);  extern void frontswap_shrink(unsigned long);  extern unsigned long frontswap_curr_pages(void); @@ -22,33 +22,19 @@ extern void frontswap_writethrough(bool);  #define FRONTSWAP_HAS_EXCLUSIVE_GETS  extern void frontswap_tmem_exclusive_gets(bool); -extern void __frontswap_init(unsigned type); +extern bool __frontswap_test(struct swap_info_struct *, pgoff_t); +extern void __frontswap_init(unsigned type, unsigned long *map);  extern int __frontswap_store(struct page *page);  extern int __frontswap_load(struct page *page);  extern void __frontswap_invalidate_page(unsigned, pgoff_t);  extern void __frontswap_invalidate_area(unsigned);  #ifdef CONFIG_FRONTSWAP +#define frontswap_enabled (1)  static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset)  { -	bool ret = false; - -	if (frontswap_enabled && sis->frontswap_map) -		ret = test_bit(offset, sis->frontswap_map); -	return ret; -} - -static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) -{ -	if (frontswap_enabled && sis->frontswap_map) -		set_bit(offset, sis->frontswap_map); -} - -static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) -{ -	if (frontswap_enabled && sis->frontswap_map) -		clear_bit(offset, sis->frontswap_map); +	return __frontswap_test(sis, offset);  }  static inline void frontswap_map_set(struct swap_info_struct *p, @@ -71,14 +57,6 @@ static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset)  	return false;  } -static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) -{ -} - -static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) -{ -} -  static inline void frontswap_map_set(struct swap_info_struct *p,  				     unsigned long *map)  { @@ -120,10 +98,10 @@ static inline void frontswap_invalidate_area(unsigned type)  		__frontswap_invalidate_area(type);  } -static inline void frontswap_init(unsigned type) +static inline void frontswap_init(unsigned type, unsigned long *map)  {  	if (frontswap_enabled) -		__frontswap_init(type); +		__frontswap_init(type, map);  }  #endif /* _LINUX_FRONTSWAP_H */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 2c28271ab9d..e8cd6b83967 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -675,9 +675,11 @@ static inline loff_t i_size_read(const struct inode *inode)  static inline void i_size_write(struct inode *inode, loff_t i_size)  {  #if BITS_PER_LONG==32 && defined(CONFIG_SMP) +	preempt_disable();  	write_seqcount_begin(&inode->i_size_seqcount);  	inode->i_size = i_size;  	write_seqcount_end(&inode->i_size_seqcount); +	preempt_enable();  #elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPT)  	preempt_disable();  	inode->i_size = i_size; @@ -2080,7 +2082,6 @@ extern int sync_filesystem(struct super_block *);  extern const struct file_operations def_blk_fops;  extern const struct file_operations def_chr_fops;  extern const struct file_operations bad_sock_fops; -extern const struct file_operations def_fifo_fops;  #ifdef CONFIG_BLOCK  extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);  extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); @@ -2152,10 +2153,6 @@ extern void init_special_inode(struct inode *, umode_t, dev_t);  extern void make_bad_inode(struct inode *);  extern int is_bad_inode(struct inode *); -extern const struct file_operations read_pipefifo_fops; -extern const struct file_operations write_pipefifo_fops; -extern const struct file_operations rdwr_pipefifo_fops; -  #ifdef CONFIG_BLOCK  /*   * return READ, READA, or WRITE @@ -2223,6 +2220,20 @@ static inline struct inode *file_inode(struct file *f)  	return f->f_inode;  } +static inline void file_start_write(struct file *file) +{ +	if (!S_ISREG(file_inode(file)->i_mode)) +		return; +	__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true); +} + +static inline void file_end_write(struct file *file) +{ +	if (!S_ISREG(file_inode(file)->i_mode)) +		return; +	__sb_end_write(file_inode(file)->i_sb, SB_FREEZE_WRITE); +} +  /*   * get_write_access() gets write permission for a file.   * put_write_access() releases this write permission. diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index 729eded4b24..2b93a9a5a1e 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h @@ -50,4 +50,6 @@ static inline void get_fs_root_and_pwd(struct fs_struct *fs, struct path *root,  	spin_unlock(&fs->lock);  } +extern bool current_chrooted(void); +  #endif /* _LINUX_FS_STRUCT_H */ diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index d5b0910d496..4b2ee8d12f5 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -157,7 +157,6 @@ struct fsnotify_group {  		struct inotify_group_private_data {  			spinlock_t	idr_lock;  			struct idr      idr; -			u32             last_wd;  			struct user_struct      *user;  		} inotify_data;  #endif diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index e5ca8ef50e9..f83e17a40e8 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -89,6 +89,7 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,   *            that the call back has its own recursion protection. If it does   *            not set this, then the ftrace infrastructure will add recursion   *            protection for the caller. + * STUB   - The ftrace_ops is just a place holder.   */  enum {  	FTRACE_OPS_FL_ENABLED			= 1 << 0, @@ -98,6 +99,7 @@ enum {  	FTRACE_OPS_FL_SAVE_REGS			= 1 << 4,  	FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED	= 1 << 5,  	FTRACE_OPS_FL_RECURSION_SAFE		= 1 << 6, +	FTRACE_OPS_FL_STUB			= 1 << 7,  };  struct ftrace_ops { @@ -259,8 +261,10 @@ struct ftrace_probe_ops {  	void			(*func)(unsigned long ip,  					unsigned long parent_ip,  					void **data); -	int			(*callback)(unsigned long ip, void **data); -	void			(*free)(void **data); +	int			(*init)(struct ftrace_probe_ops *ops, +					unsigned long ip, void **data); +	void			(*free)(struct ftrace_probe_ops *ops, +					unsigned long ip, void **data);  	int			(*print)(struct seq_file *m,  					 unsigned long ip,  					 struct ftrace_probe_ops *ops, @@ -394,7 +398,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,  			    size_t cnt, loff_t *ppos);  ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,  			     size_t cnt, loff_t *ppos); -loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int whence);  int ftrace_regex_release(struct inode *inode, struct file *file);  void __init @@ -567,6 +570,8 @@ static inline int  ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }  #endif /* CONFIG_DYNAMIC_FTRACE */ +loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); +  /* totally disable ftrace - can not re-enable after this */  void ftrace_kill(void); diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 13a54d0bdfa..34e00fb49be 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h @@ -8,6 +8,7 @@  #include <linux/perf_event.h>  struct trace_array; +struct trace_buffer;  struct tracer;  struct dentry; @@ -38,6 +39,12 @@ const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,  const char *ftrace_print_hex_seq(struct trace_seq *p,  				 const unsigned char *buf, int len); +struct trace_iterator; +struct trace_event; + +int ftrace_raw_output_prep(struct trace_iterator *iter, +			   struct trace_event *event); +  /*   * The trace entry - the most basic unit of tracing. This is what   * is printed in the end as a single line in the trace output, such as: @@ -61,6 +68,7 @@ struct trace_entry {  struct trace_iterator {  	struct trace_array	*tr;  	struct tracer		*trace; +	struct trace_buffer	*trace_buffer;  	void			*private;  	int			cpu_file;  	struct mutex		mutex; @@ -95,8 +103,6 @@ enum trace_iter_flags {  }; -struct trace_event; -  typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,  				      int flags, struct trace_event *event); @@ -128,6 +134,13 @@ enum print_line_t {  void tracing_generic_entry_update(struct trace_entry *entry,  				  unsigned long flags,  				  int pc); +struct ftrace_event_file; + +struct ring_buffer_event * +trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer, +				struct ftrace_event_file *ftrace_file, +				int type, unsigned long len, +				unsigned long flags, int pc);  struct ring_buffer_event *  trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer,  				  int type, unsigned long len, @@ -182,53 +195,49 @@ extern int ftrace_event_reg(struct ftrace_event_call *event,  			    enum trace_reg type, void *data);  enum { -	TRACE_EVENT_FL_ENABLED_BIT,  	TRACE_EVENT_FL_FILTERED_BIT, -	TRACE_EVENT_FL_RECORDED_CMD_BIT,  	TRACE_EVENT_FL_CAP_ANY_BIT,  	TRACE_EVENT_FL_NO_SET_FILTER_BIT,  	TRACE_EVENT_FL_IGNORE_ENABLE_BIT, +	TRACE_EVENT_FL_WAS_ENABLED_BIT,  }; +/* + * Event flags: + *  FILTERED	  - The event has a filter attached + *  CAP_ANY	  - Any user can enable for perf + *  NO_SET_FILTER - Set when filter has error and is to be ignored + *  IGNORE_ENABLE - For ftrace internal events, do not enable with debugfs file + *  WAS_ENABLED   - Set and stays set when an event was ever enabled + *                    (used for module unloading, if a module event is enabled, + *                     it is best to clear the buffers that used it). + */  enum { -	TRACE_EVENT_FL_ENABLED		= (1 << TRACE_EVENT_FL_ENABLED_BIT),  	TRACE_EVENT_FL_FILTERED		= (1 << TRACE_EVENT_FL_FILTERED_BIT), -	TRACE_EVENT_FL_RECORDED_CMD	= (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT),  	TRACE_EVENT_FL_CAP_ANY		= (1 << TRACE_EVENT_FL_CAP_ANY_BIT),  	TRACE_EVENT_FL_NO_SET_FILTER	= (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),  	TRACE_EVENT_FL_IGNORE_ENABLE	= (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), +	TRACE_EVENT_FL_WAS_ENABLED	= (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT),  };  struct ftrace_event_call {  	struct list_head	list;  	struct ftrace_event_class *class;  	char			*name; -	struct dentry		*dir;  	struct trace_event	event;  	const char		*print_fmt;  	struct event_filter	*filter; +	struct list_head	*files;  	void			*mod;  	void			*data; -  	/* -	 * 32 bit flags: -	 *   bit 1:		enabled -	 *   bit 2:		filter_active -	 *   bit 3:		enabled cmd record -	 *   bit 4:		allow trace by non root (cap any) -	 *   bit 5:		failed to apply filter -	 *   bit 6:		ftrace internal event (do not enable) -	 * -	 * Changes to flags must hold the event_mutex. -	 * -	 * Note: Reads of flags do not hold the event_mutex since -	 * they occur in critical sections. But the way flags -	 * is currently used, these changes do no affect the code -	 * except that when a change is made, it may have a slight -	 * delay in propagating the changes to other CPUs due to -	 * caching and such. +	 *   bit 0:		filter_active +	 *   bit 1:		allow trace by non root (cap any) +	 *   bit 2:		failed to apply filter +	 *   bit 3:		ftrace internal event (do not enable) +	 *   bit 4:		Event was enabled by module  	 */ -	unsigned int		flags; +	int			flags; /* static flags of different events */  #ifdef CONFIG_PERF_EVENTS  	int				perf_refcount; @@ -236,6 +245,56 @@ struct ftrace_event_call {  #endif  }; +struct trace_array; +struct ftrace_subsystem_dir; + +enum { +	FTRACE_EVENT_FL_ENABLED_BIT, +	FTRACE_EVENT_FL_RECORDED_CMD_BIT, +	FTRACE_EVENT_FL_SOFT_MODE_BIT, +	FTRACE_EVENT_FL_SOFT_DISABLED_BIT, +}; + +/* + * Ftrace event file flags: + *  ENABLED	  - The event is enabled + *  RECORDED_CMD  - The comms should be recorded at sched_switch + *  SOFT_MODE     - The event is enabled/disabled by SOFT_DISABLED + *  SOFT_DISABLED - When set, do not trace the event (even though its + *                   tracepoint may be enabled) + */ +enum { +	FTRACE_EVENT_FL_ENABLED		= (1 << FTRACE_EVENT_FL_ENABLED_BIT), +	FTRACE_EVENT_FL_RECORDED_CMD	= (1 << FTRACE_EVENT_FL_RECORDED_CMD_BIT), +	FTRACE_EVENT_FL_SOFT_MODE	= (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT), +	FTRACE_EVENT_FL_SOFT_DISABLED	= (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT), +}; + +struct ftrace_event_file { +	struct list_head		list; +	struct ftrace_event_call	*event_call; +	struct dentry			*dir; +	struct trace_array		*tr; +	struct ftrace_subsystem_dir	*system; + +	/* +	 * 32 bit flags: +	 *   bit 0:		enabled +	 *   bit 1:		enabled cmd record +	 *   bit 2:		enable/disable with the soft disable bit +	 *   bit 3:		soft disabled +	 * +	 * Note: The bits must be set atomically to prevent races +	 * from other writers. Reads of flags do not need to be in +	 * sync as they occur in critical sections. But the way flags +	 * is currently used, these changes do not affect the code +	 * except that when a change is made, it may have a slight +	 * delay in propagating the changes to other CPUs due to +	 * caching and such. Which is mostly OK ;-) +	 */ +	unsigned long		flags; +}; +  #define __TRACE_EVENT_FLAGS(name, value)				\  	static int __init trace_init_flags_##name(void)			\  	{								\ @@ -274,7 +333,7 @@ extern int trace_define_field(struct ftrace_event_call *call, const char *type,  extern int trace_add_event_call(struct ftrace_event_call *call);  extern void trace_remove_event_call(struct ftrace_event_call *call); -#define is_signed_type(type)	(((type)(-1)) < (type)0) +#define is_signed_type(type)	(((type)(-1)) < (type)1)  int trace_set_clr_event(const char *system, const char *event, int set); diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index dd7c569aaca..661d374aeb2 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -29,6 +29,10 @@  #ifndef __GENALLOC_H__  #define __GENALLOC_H__ + +struct device; +struct device_node; +  /**   * Allocation callback function type definition   * @map: Pointer to bitmap @@ -105,4 +109,18 @@ extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,  extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,  		unsigned long start, unsigned int nr, void *data); +extern struct gen_pool *devm_gen_pool_create(struct device *dev, +		int min_alloc_order, int nid); +extern struct gen_pool *dev_get_gen_pool(struct device *dev); + +#ifdef CONFIG_OF +extern struct gen_pool *of_get_named_gen_pool(struct device_node *np, +	const char *propname, int index); +#else +static inline struct gen_pool *of_get_named_gen_pool(struct device_node *np, +	const char *propname, int index) +{ +	return NULL; +} +#endif  #endif /* __GENALLOC_H__ */ diff --git a/include/linux/hash.h b/include/linux/hash.h index 61c97ae22e0..f09a0ae4d85 100644 --- a/include/linux/hash.h +++ b/include/linux/hash.h @@ -15,6 +15,7 @@   */  #include <asm/types.h> +#include <linux/compiler.h>  /* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */  #define GOLDEN_RATIO_PRIME_32 0x9e370001UL @@ -31,7 +32,7 @@  #error Wordsize not 32 or 64  #endif -static inline u64 hash_64(u64 val, unsigned int bits) +static __always_inline u64 hash_64(u64 val, unsigned int bits)  {  	u64 hash = val; diff --git a/include/linux/hid-debug.h b/include/linux/hid-debug.h index 53744fa1c8b..8663f216c56 100644 --- a/include/linux/hid-debug.h +++ b/include/linux/hid-debug.h @@ -22,11 +22,12 @@   *   */ -#define HID_DEBUG_BUFSIZE 512 -  #ifdef CONFIG_DEBUG_FS +#define HID_DEBUG_BUFSIZE 512 +  void hid_dump_input(struct hid_device *, struct hid_usage *, __s32); +void hid_dump_report(struct hid_device *, int , u8 *, int);  void hid_dump_device(struct hid_device *, struct seq_file *);  void hid_dump_field(struct hid_field *, int, struct seq_file *);  char *hid_resolv_usage(unsigned, struct seq_file *); @@ -50,6 +51,7 @@ struct hid_debug_list {  #else  #define hid_dump_input(a,b,c)		do { } while (0) +#define hid_dump_report(a,b,c,d)	do { } while (0)  #define hid_dump_device(a,b)		do { } while (0)  #define hid_dump_field(a,b,c)		do { } while (0)  #define hid_resolv_usage(a,b)		do { } while (0) diff --git a/include/linux/hid.h b/include/linux/hid.h index e14b465b114..af1b86d46f6 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -282,6 +282,7 @@ struct hid_item {  #define HID_QUIRK_BADPAD			0x00000020  #define HID_QUIRK_MULTI_INPUT			0x00000040  #define HID_QUIRK_HIDINPUT_FORCE		0x00000080 +#define HID_QUIRK_NO_EMPTY_INPUT		0x00000100  #define HID_QUIRK_SKIP_OUTPUT_REPORTS		0x00010000  #define HID_QUIRK_FULLSPEED_INTERVAL		0x10000000  #define HID_QUIRK_NO_INIT_REPORTS		0x20000000 @@ -456,7 +457,8 @@ struct hid_device {							/* device report descriptor */  	unsigned country;						/* HID country */  	struct hid_report_enum report_enum[HID_REPORT_TYPES]; -	struct semaphore driver_lock;					/* protects the current driver */ +	struct semaphore driver_lock;					/* protects the current driver, except during input */ +	struct semaphore driver_input_lock;				/* protects the current driver */  	struct device dev;						/* device */  	struct hid_driver *driver;  	struct hid_ll_driver *ll_driver; @@ -477,6 +479,7 @@ struct hid_device {							/* device report descriptor */  	unsigned int status;						/* see STAT flags above */  	unsigned claimed;						/* Claimed by hidinput, hiddev? */  	unsigned quirks;						/* Various quirks the device can pull on us */ +	bool io_started;						/* Protected by driver_lock. If IO has started */  	struct list_head inputs;					/* The list of inputs */  	void *hiddev;							/* The hiddev structure */ @@ -512,6 +515,7 @@ struct hid_device {							/* device report descriptor */  	struct dentry *debug_rdesc;  	struct dentry *debug_events;  	struct list_head debug_list; +	struct mutex debug_list_lock;  	wait_queue_head_t debug_wait;  }; @@ -599,6 +603,10 @@ struct hid_usage_id {   * @resume: invoked on resume if device was not reset (NULL means nop)   * @reset_resume: invoked on resume if device was reset (NULL means nop)   * + * probe should return -errno on error, or 0 on success. During probe, + * input will not be passed to raw_event unless hid_device_io_start is + * called. + *   * raw_event and event should return 0 on no action performed, 1 when no   * further processing should be done and negative on error   * @@ -662,6 +670,9 @@ struct hid_driver {   * @hidinput_input_event: event input event (e.g. ff or leds)   * @parse: this method is called only once to parse the device data,   *	   shouldn't allocate anything to not leak memory + * @request: send report request to device (e.g. feature report) + * @wait: wait for buffered io to complete (send/recv reports) + * @idle: send idle request to device   */  struct hid_ll_driver {  	int (*start)(struct hid_device *hdev); @@ -676,6 +687,13 @@ struct hid_ll_driver {  			unsigned int code, int value);  	int (*parse)(struct hid_device *hdev); + +	void (*request)(struct hid_device *hdev, +			struct hid_report *report, int reqtype); + +	int (*wait)(struct hid_device *hdev); +	int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype); +  };  #define	PM_HINT_FULLON	1<<5 @@ -738,6 +756,44 @@ const struct hid_device_id *hid_match_id(struct hid_device *hdev,  s32 hid_snto32(__u32 value, unsigned n);  /** + * hid_device_io_start - enable HID input during probe, remove + * + * @hid - the device + * + * This should only be called during probe or remove and only be + * called by the thread calling probe or remove. It will allow + * incoming packets to be delivered to the driver. + */ +static inline void hid_device_io_start(struct hid_device *hid) { +	if (hid->io_started) { +		dev_warn(&hid->dev, "io already started"); +		return; +	} +	hid->io_started = true; +	up(&hid->driver_input_lock); +} + +/** + * hid_device_io_stop - disable HID input during probe, remove + * + * @hid - the device + * + * Should only be called after hid_device_io_start. It will prevent + * incoming packets from going to the driver for the duration of + * probe, remove. If called during probe, packets will still go to the + * driver after probe is complete. This function should only be called + * by the thread calling probe or remove. + */ +static inline void hid_device_io_stop(struct hid_device *hid) { +	if (!hid->io_started) { +		dev_warn(&hid->dev, "io already stopped"); +		return; +	} +	hid->io_started = false; +	down(&hid->driver_input_lock); +} + +/**   * hid_map_usage - map usage input bits   *   * @hidinput: hidinput which we are interested in @@ -883,6 +939,49 @@ static inline int hid_hw_power(struct hid_device *hdev, int level)  	return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0;  } + +/** + * hid_hw_request - send report request to device + * + * @hdev: hid device + * @report: report to send + * @reqtype: hid request type + */ +static inline void hid_hw_request(struct hid_device *hdev, +				  struct hid_report *report, int reqtype) +{ +	if (hdev->ll_driver->request) +		hdev->ll_driver->request(hdev, report, reqtype); +} + +/** + * hid_hw_idle - send idle request to device + * + * @hdev: hid device + * @report: report to control + * @idle: idle state + * @reqtype: hid request type + */ +static inline int hid_hw_idle(struct hid_device *hdev, int report, int idle, +		int reqtype) +{ +	if (hdev->ll_driver->idle) +		return hdev->ll_driver->idle(hdev, report, idle, reqtype); + +	return 0; +} + +/** + * hid_hw_wait - wait for buffered io to complete + * + * @hdev: hid device + */ +static inline void hid_hw_wait(struct hid_device *hdev) +{ +	if (hdev->ll_driver->wait) +		hdev->ll_driver->wait(hdev); +} +  int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,  		int interrupt); diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index cc07d2777bb..d19a5c2d227 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -157,6 +157,7 @@ enum  hrtimer_base_type {  	HRTIMER_BASE_MONOTONIC,  	HRTIMER_BASE_REALTIME,  	HRTIMER_BASE_BOOTTIME, +	HRTIMER_BASE_TAI,  	HRTIMER_MAX_CLOCK_BASES,  }; @@ -327,7 +328,9 @@ extern ktime_t ktime_get(void);  extern ktime_t ktime_get_real(void);  extern ktime_t ktime_get_boottime(void);  extern ktime_t ktime_get_monotonic_offset(void); -extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot); +extern ktime_t ktime_get_clocktai(void); +extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot, +					 ktime_t *offs_tai);  DECLARE_PER_CPU(struct tick_device, tick_cpu_device); diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index ee1c244a62a..528454c2caa 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -99,7 +99,11 @@ extern int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,  extern int handle_pte_fault(struct mm_struct *mm,  			    struct vm_area_struct *vma, unsigned long address,  			    pte_t *pte, pmd_t *pmd, unsigned int flags); -extern int split_huge_page(struct page *page); +extern int split_huge_page_to_list(struct page *page, struct list_head *list); +static inline int split_huge_page(struct page *page) +{ +	return split_huge_page_to_list(page, NULL); +}  extern void __split_huge_page_pmd(struct vm_area_struct *vma,  		unsigned long address, pmd_t *pmd);  #define split_huge_page_pmd(__vma, __address, __pmd)			\ @@ -186,6 +190,11 @@ extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vm  #define transparent_hugepage_enabled(__vma) 0  #define transparent_hugepage_flags 0UL +static inline int +split_huge_page_to_list(struct page *page, struct list_head *list) +{ +	return 0; +}  static inline int split_huge_page(struct page *page)  {  	return 0; diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 16e4e9a643f..3a62df310f2 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -58,6 +58,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,  int hugetlb_prefault(struct address_space *, struct vm_area_struct *);  void hugetlb_report_meminfo(struct seq_file *);  int hugetlb_report_node_meminfo(int, char *); +void hugetlb_show_meminfo(void);  unsigned long hugetlb_total_pages(void);  int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,  			unsigned long address, unsigned int flags); @@ -114,6 +115,9 @@ static inline void hugetlb_report_meminfo(struct seq_file *m)  {  }  #define hugetlb_report_node_meminfo(n, buf)	0 +static inline void hugetlb_show_meminfo(void) +{ +}  #define follow_huge_pmd(mm, addr, pmd, write)	NULL  #define follow_huge_pud(mm, addr, pud, write)	NULL  #define prepare_hugepage_range(file, addr, len)	(-EINVAL) diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index df77ba9a816..c2559847d7e 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -27,6 +27,63 @@  #include <linux/types.h> + +/* + * Implementation of host controlled snapshot of the guest. + */ + +#define VSS_OP_REGISTER 128 + +enum hv_vss_op { +	VSS_OP_CREATE = 0, +	VSS_OP_DELETE, +	VSS_OP_HOT_BACKUP, +	VSS_OP_GET_DM_INFO, +	VSS_OP_BU_COMPLETE, +	/* +	 * Following operations are only supported with IC version >= 5.0 +	 */ +	VSS_OP_FREEZE, /* Freeze the file systems in the VM */ +	VSS_OP_THAW, /* Unfreeze the file systems */ +	VSS_OP_AUTO_RECOVER, +	VSS_OP_COUNT /* Number of operations, must be last */ +}; + + +/* + * Header for all VSS messages. + */ +struct hv_vss_hdr { +	__u8 operation; +	__u8 reserved[7]; +} __attribute__((packed)); + + +/* + * Flag values for the hv_vss_check_feature. Linux supports only + * one value. + */ +#define VSS_HBU_NO_AUTO_RECOVERY	0x00000005 + +struct hv_vss_check_feature { +	__u32 flags; +} __attribute__((packed)); + +struct hv_vss_check_dm_info { +	__u32 flags; +} __attribute__((packed)); + +struct hv_vss_msg { +	union { +		struct hv_vss_hdr vss_hdr; +		int error; +	}; +	union { +		struct hv_vss_check_feature vss_cf; +		struct hv_vss_check_dm_info dm_info; +	}; +} __attribute__((packed)); +  /*   * An implementation of HyperV key value pair (KVP) functionality for Linux.   * @@ -1253,6 +1310,25 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver);  		}  /* + * VSS (Backup/Restore) GUID + */ +#define HV_VSS_GUID \ +	.guid = { \ +			0x29, 0x2e, 0xfa, 0x35, 0x23, 0xea, 0x36, 0x42, \ +			0x96, 0xae, 0x3a, 0x6e, 0xba, 0xcb, 0xa4,  0x40 \ +		} +/* + * Synthetic Video GUID + * {DA0A7802-E377-4aac-8E77-0558EB1073F8} + */ +#define HV_SYNTHVID_GUID \ +	.guid = { \ +			0x02, 0x78, 0x0a, 0xda, 0x77, 0xe3, 0xac, 0x4a, \ +			0x8e, 0x77, 0x05, 0x58, 0xeb, 0x10, 0x73, 0xf8 \ +		} + + +/*   * Common header for Hyper-V ICs   */ @@ -1356,6 +1432,10 @@ int hv_kvp_init(struct hv_util_service *);  void hv_kvp_deinit(void);  void hv_kvp_onchannelcallback(void *); +int hv_vss_init(struct hv_util_service *); +void hv_vss_deinit(void); +void hv_vss_onchannelcallback(void *); +  /*   * Negotiated version with the Host.   */ diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h index 40cb05a97b4..b5f9a007a3a 100644 --- a/include/linux/i2c-mux.h +++ b/include/linux/i2c-mux.h @@ -42,7 +42,7 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent,  				int (*deselect) (struct i2c_adapter *,  						 void *mux_dev, u32 chan_id)); -int i2c_del_mux_adapter(struct i2c_adapter *adap); +void i2c_del_mux_adapter(struct i2c_adapter *adap);  #endif /* __KERNEL__ */ diff --git a/include/linux/i2c-tegra.h b/include/linux/i2c-tegra.h deleted file mode 100644 index 9c85da49857..00000000000 --- a/include/linux/i2c-tegra.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * drivers/i2c/busses/i2c-tegra.c - * - * Copyright (C) 2010 Google, Inc. - * Author: Colin Cross <ccross@android.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ - -#ifndef _LINUX_I2C_TEGRA_H -#define _LINUX_I2C_TEGRA_H - -struct tegra_i2c_platform_data { -	unsigned long bus_clk_rate; -}; - -#endif /* _LINUX_I2C_TEGRA_H */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index d0c4db7b487..e988fa935b3 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -125,7 +125,6 @@ extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,   * struct i2c_driver - represent an I2C device driver   * @class: What kind of i2c device we instantiate (for detect)   * @attach_adapter: Callback for bus addition (deprecated) - * @detach_adapter: Callback for bus removal (deprecated)   * @probe: Callback for device binding   * @remove: Callback for device unbinding   * @shutdown: Callback for device shutdown @@ -162,12 +161,10 @@ extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,  struct i2c_driver {  	unsigned int class; -	/* Notifies the driver that a new bus has appeared or is about to be -	 * removed. You should avoid using this, it will be removed in a -	 * near future. +	/* Notifies the driver that a new bus has appeared. You should avoid +	 * using this, it will be removed in a near future.  	 */  	int (*attach_adapter)(struct i2c_adapter *) __deprecated; -	int (*detach_adapter)(struct i2c_adapter *) __deprecated;  	/* Standard driver model interfaces */  	int (*probe)(struct i2c_client *, const struct i2c_device_id *); @@ -370,6 +367,45 @@ struct i2c_algorithm {  	u32 (*functionality) (struct i2c_adapter *);  }; +/** + * struct i2c_bus_recovery_info - I2C bus recovery information + * @recover_bus: Recover routine. Either pass driver's recover_bus() routine, or + *	i2c_generic_scl_recovery() or i2c_generic_gpio_recovery(). + * @get_scl: This gets current value of SCL line. Mandatory for generic SCL + *      recovery. Used internally for generic GPIO recovery. + * @set_scl: This sets/clears SCL line. Mandatory for generic SCL recovery. Used + *      internally for generic GPIO recovery. + * @get_sda: This gets current value of SDA line. Optional for generic SCL + *      recovery. Used internally, if sda_gpio is a valid GPIO, for generic GPIO + *      recovery. + * @prepare_recovery: This will be called before starting recovery. Platform may + *	configure padmux here for SDA/SCL line or something else they want. + * @unprepare_recovery: This will be called after completing recovery. Platform + *	may configure padmux here for SDA/SCL line or something else they want. + * @scl_gpio: gpio number of the SCL line. Only required for GPIO recovery. + * @sda_gpio: gpio number of the SDA line. Only required for GPIO recovery. + */ +struct i2c_bus_recovery_info { +	int (*recover_bus)(struct i2c_adapter *); + +	int (*get_scl)(struct i2c_adapter *); +	void (*set_scl)(struct i2c_adapter *, int val); +	int (*get_sda)(struct i2c_adapter *); + +	void (*prepare_recovery)(struct i2c_bus_recovery_info *bri); +	void (*unprepare_recovery)(struct i2c_bus_recovery_info *bri); + +	/* gpio recovery */ +	int scl_gpio; +	int sda_gpio; +}; + +int i2c_recover_bus(struct i2c_adapter *adap); + +/* Generic recovery routines */ +int i2c_generic_gpio_recovery(struct i2c_adapter *adap); +int i2c_generic_scl_recovery(struct i2c_adapter *adap); +  /*   * i2c_adapter is the structure used to identify a physical i2c bus along   * with the access algorithms necessary to access it. @@ -393,6 +429,8 @@ struct i2c_adapter {  	struct mutex userspace_clients_lock;  	struct list_head userspace_clients; + +	struct i2c_bus_recovery_info *bus_recovery_info;  };  #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) @@ -450,7 +488,7 @@ void i2c_unlock_adapter(struct i2c_adapter *);   */  #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)  extern int i2c_add_adapter(struct i2c_adapter *); -extern int i2c_del_adapter(struct i2c_adapter *); +extern void i2c_del_adapter(struct i2c_adapter *);  extern int i2c_add_numbered_adapter(struct i2c_adapter *);  extern int i2c_register_driver(struct module *, struct i2c_driver *); diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h index b4f6c29cace..630f45335c7 100644 --- a/include/linux/icmpv6.h +++ b/include/linux/icmpv6.h @@ -11,9 +11,21 @@ static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)  #include <linux/netdevice.h> -extern void				icmpv6_send(struct sk_buff *skb, -						    u8 type, u8 code, -						    __u32 info); +#if IS_ENABLED(CONFIG_IPV6) +extern void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info); + +typedef void ip6_icmp_send_t(struct sk_buff *skb, u8 type, u8 code, __u32 info); +extern int inet6_register_icmp_sender(ip6_icmp_send_t *fn); +extern int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn); + +#else + +static inline void icmpv6_send(struct sk_buff *skb, +			       u8 type, u8 code, __u32 info) +{ + +} +#endif  extern int				icmpv6_init(void);  extern int				icmpv6_err_convert(u8 type, u8 code, diff --git a/include/linux/idr.h b/include/linux/idr.h index 2640c7e99e5..a470ac3ef49 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h @@ -42,6 +42,7 @@ struct idr {  	struct idr_layer	*id_free;  	int			layers;	/* only valid w/o concurrent changes */  	int			id_free_cnt; +	int			cur;	/* current pos for cyclic allocation */  	spinlock_t		lock;  }; @@ -75,6 +76,7 @@ struct idr {  void *idr_find_slowpath(struct idr *idp, int id);  void idr_preload(gfp_t gfp_mask);  int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask); +int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp_mask);  int idr_for_each(struct idr *idp,  		 int (*fn)(int id, void *p, void *data), void *data);  void *idr_get_next(struct idr *idp, int *nextid); diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 7e24fe0cfbc..06b0ed0154a 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -113,6 +113,34 @@  #define IEEE80211_CTL_EXT_SSW_FBACK	0x9000  #define IEEE80211_CTL_EXT_SSW_ACK	0xa000 + +#define IEEE80211_SN_MASK		((IEEE80211_SCTL_SEQ) >> 4) +#define IEEE80211_MAX_SN		IEEE80211_SN_MASK +#define IEEE80211_SN_MODULO		(IEEE80211_MAX_SN + 1) + +static inline int ieee80211_sn_less(u16 sn1, u16 sn2) +{ +	return ((sn1 - sn2) & IEEE80211_SN_MASK) > (IEEE80211_SN_MODULO >> 1); +} + +static inline u16 ieee80211_sn_add(u16 sn1, u16 sn2) +{ +	return (sn1 + sn2) & IEEE80211_SN_MASK; +} + +static inline u16 ieee80211_sn_inc(u16 sn) +{ +	return ieee80211_sn_add(sn, 1); +} + +static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2) +{ +	return (sn1 - sn2) & IEEE80211_SN_MASK; +} + +#define IEEE80211_SEQ_TO_SN(seq)	(((seq) & IEEE80211_SCTL_SEQ) >> 4) +#define IEEE80211_SN_TO_SEQ(ssn)	(((ssn) << 4) & IEEE80211_SCTL_SEQ) +  /* miscellaneous IEEE 802.11 constants */  #define IEEE80211_MAX_FRAG_THRESHOLD	2352  #define IEEE80211_MAX_RTS_THRESHOLD	2353 @@ -185,7 +213,7 @@ struct ieee80211_hdr {  	u8 addr3[6];  	__le16 seq_ctrl;  	u8 addr4[6]; -} __packed; +} __packed __aligned(2);  struct ieee80211_hdr_3addr {  	__le16 frame_control; @@ -194,7 +222,7 @@ struct ieee80211_hdr_3addr {  	u8 addr2[6];  	u8 addr3[6];  	__le16 seq_ctrl; -} __packed; +} __packed __aligned(2);  struct ieee80211_qos_hdr {  	__le16 frame_control; @@ -204,7 +232,7 @@ struct ieee80211_qos_hdr {  	u8 addr3[6];  	__le16 seq_ctrl;  	__le16 qos_ctrl; -} __packed; +} __packed __aligned(2);  /**   * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set @@ -581,7 +609,7 @@ struct ieee80211s_hdr {  	__le32 seqnum;  	u8 eaddr1[6];  	u8 eaddr2[6]; -} __packed; +} __packed __aligned(2);  /* Mesh flags */  #define MESH_FLAGS_AE_A4 	0x1 @@ -645,6 +673,36 @@ struct ieee80211_channel_sw_ie {  } __packed;  /** + * struct ieee80211_ext_chansw_ie + * + * This structure represents the "Extended Channel Switch Announcement element" + */ +struct ieee80211_ext_chansw_ie { +	u8 mode; +	u8 new_operating_class; +	u8 new_ch_num; +	u8 count; +} __packed; + +/** + * struct ieee80211_sec_chan_offs_ie - secondary channel offset IE + * @sec_chan_offs: secondary channel offset, uses IEEE80211_HT_PARAM_CHA_SEC_* + *	values here + * This structure represents the "Secondary Channel Offset element" + */ +struct ieee80211_sec_chan_offs_ie { +	u8 sec_chan_offs; +} __packed; + +/** + * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE + */ +struct ieee80211_wide_bw_chansw_ie { +	u8 new_channel_width; +	u8 new_center_freq_seg0, new_center_freq_seg1; +} __packed; + +/**   * struct ieee80211_tim   *   * This structure refers to "Traffic Indication Map information element" @@ -812,12 +870,15 @@ struct ieee80211_mgmt {  				} __packed wme_action;  				struct{  					u8 action_code; -					u8 element_id; -					u8 length; -					struct ieee80211_channel_sw_ie sw_elem; +					u8 variable[0];  				} __packed chan_switch;  				struct{  					u8 action_code; +					struct ieee80211_ext_chansw_ie data; +					u8 variable[0]; +				} __packed ext_chan_switch; +				struct{ +					u8 action_code;  					u8 dialog_token;  					u8 element_id;  					u8 length; @@ -875,7 +936,7 @@ struct ieee80211_mgmt {  			} u;  		} __packed action;  	} u; -} __packed; +} __packed __aligned(2);  /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */  #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127 @@ -906,20 +967,20 @@ struct ieee80211_rts {  	__le16 duration;  	u8 ra[6];  	u8 ta[6]; -} __packed; +} __packed __aligned(2);  struct ieee80211_cts {  	__le16 frame_control;  	__le16 duration;  	u8 ra[6]; -} __packed; +} __packed __aligned(2);  struct ieee80211_pspoll {  	__le16 frame_control;  	__le16 aid;  	u8 bssid[6];  	u8 ta[6]; -} __packed; +} __packed __aligned(2);  /* TDLS */ @@ -999,6 +1060,26 @@ enum ieee80211_p2p_attr_id {  	IEEE80211_P2P_ATTR_MAX  }; +/* Notice of Absence attribute - described in P2P spec 4.1.14 */ +/* Typical max value used here */ +#define IEEE80211_P2P_NOA_DESC_MAX	4 + +struct ieee80211_p2p_noa_desc { +	u8 count; +	__le32 duration; +	__le32 interval; +	__le32 start_time; +} __packed; + +struct ieee80211_p2p_noa_attr { +	u8 index; +	u8 oppps_ctwindow; +	struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX]; +} __packed; + +#define IEEE80211_P2P_OPPPS_ENABLE_BIT		BIT(7) +#define IEEE80211_P2P_OPPPS_CTWINDOW_MASK	0x7F +  /**   * struct ieee80211_bar - HT Block Ack Request   * @@ -1290,11 +1371,6 @@ struct ieee80211_vht_operation {  } __packed; -#define IEEE80211_VHT_MCS_ZERO_TO_SEVEN_SUPPORT 0 -#define IEEE80211_VHT_MCS_ZERO_TO_EIGHT_SUPPORT 1 -#define IEEE80211_VHT_MCS_ZERO_TO_NINE_SUPPORT  2 -#define IEEE80211_VHT_MCS_NOT_SUPPORTED 3 -  /* 802.11ac VHT Capabilities */  #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895			0x00000000  #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991			0x00000001 @@ -1310,10 +1386,11 @@ struct ieee80211_vht_operation {  #define IEEE80211_VHT_CAP_RXSTBC_2				0x00000200  #define IEEE80211_VHT_CAP_RXSTBC_3				0x00000300  #define IEEE80211_VHT_CAP_RXSTBC_4				0x00000400 +#define IEEE80211_VHT_CAP_RXSTBC_MASK				0x00000700  #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE			0x00000800  #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE			0x00001000  #define IEEE80211_VHT_CAP_BEAMFORMER_ANTENNAS_MAX		0x00006000 -#define IEEE80211_VHT_CAP_SOUNDING_DIMENTION_MAX		0x00030000 +#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MAX		0x00030000  #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE			0x00080000  #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE			0x00100000  #define IEEE80211_VHT_CAP_VHT_TXOP_PS				0x00200000 @@ -1594,6 +1671,7 @@ enum ieee80211_eid {  	WLAN_EID_HT_CAPABILITY = 45,  	WLAN_EID_HT_OPERATION = 61, +	WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,  	WLAN_EID_RSN = 48,  	WLAN_EID_MMIE = 76, @@ -1628,6 +1706,8 @@ enum ieee80211_eid {  	WLAN_EID_VHT_CAPABILITY = 191,  	WLAN_EID_VHT_OPERATION = 192,  	WLAN_EID_OPMODE_NOTIF = 199, +	WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194, +	WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,  	/* 802.11ad */  	WLAN_EID_NON_TX_BSSID_CAP =  83, @@ -1751,6 +1831,7 @@ enum ieee80211_key_len {  /* Public action codes */  enum ieee80211_pub_actioncode { +	WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,  	WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,  }; @@ -1911,6 +1992,16 @@ enum ieee80211_timeout_interval_type {  	WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,  }; +/** + * struct ieee80211_timeout_interval_ie - Timeout Interval element + * @type: type, see &enum ieee80211_timeout_interval_type + * @value: timeout interval value + */ +struct ieee80211_timeout_interval_ie { +	u8 type; +	__le32 value; +} __packed; +  /* BACK action code */  enum ieee80211_back_actioncode {  	WLAN_ACTION_ADDBA_REQ = 0, diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index 89b4614a472..f563907ed77 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -33,7 +33,15 @@ static inline struct arphdr *arp_hdr(const struct sk_buff *skb)  static inline int arp_hdr_len(struct net_device *dev)  { -	/* ARP header, plus 2 device addresses, plus 2 IP addresses. */ -	return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2; +	switch (dev->type) { +#if IS_ENABLED(CONFIG_FIREWIRE_NET) +	case ARPHRD_IEEE1394: +		/* ARP header, device address and 2 IP addresses */ +		return sizeof(struct arphdr) + dev->addr_len + sizeof(u32) * 2; +#endif +	default: +		/* ARP header, plus 2 device addresses, plus 2 IP addresses. */ +		return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2; +	}  }  #endif	/* _LINUX_IF_ARP_H */ diff --git a/include/linux/if_team.h b/include/linux/if_team.h index cfd21e3d550..4474557904f 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h @@ -112,6 +112,10 @@ struct team_mode_ops {  	void (*port_disabled)(struct team *team, struct team_port *port);  }; +extern int team_modeop_port_enter(struct team *team, struct team_port *port); +extern void team_modeop_port_change_dev_addr(struct team *team, +					     struct team_port *port); +  enum team_option_type {  	TEAM_OPTION_TYPE_U32,  	TEAM_OPTION_TYPE_STRING, @@ -236,7 +240,26 @@ static inline struct team_port *team_get_port_by_index_rcu(struct team *team,  	return NULL;  } -extern int team_port_set_team_dev_addr(struct team_port *port); +static inline struct team_port * +team_get_first_port_txable_rcu(struct team *team, struct team_port *port) +{ +	struct team_port *cur; + +	if (likely(team_port_txable(port))) +		return port; +	cur = port; +	list_for_each_entry_continue_rcu(cur, &team->port_list, list) +		if (team_port_txable(port)) +			return cur; +	list_for_each_entry_rcu(cur, &team->port_list, list) { +		if (cur == port) +			break; +		if (team_port_txable(port)) +			return cur; +	} +	return NULL; +} +  extern int team_options_register(struct team *team,  				 const struct team_option *option,  				 size_t option_count); diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 218a3b686d9..52bd03b3896 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -86,15 +86,15 @@ static inline int is_vlan_dev(struct net_device *dev)  #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)  extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev, -					       u16 vlan_id); +					       __be16 vlan_proto, u16 vlan_id);  extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);  extern u16 vlan_dev_vlan_id(const struct net_device *dev);  extern bool vlan_do_receive(struct sk_buff **skb);  extern struct sk_buff *vlan_untag(struct sk_buff *skb); -extern int vlan_vid_add(struct net_device *dev, unsigned short vid); -extern void vlan_vid_del(struct net_device *dev, unsigned short vid); +extern int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid); +extern void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid);  extern int vlan_vids_add_by_dev(struct net_device *dev,  				const struct net_device *by_dev); @@ -104,7 +104,8 @@ extern void vlan_vids_del_by_dev(struct net_device *dev,  extern bool vlan_uses_dev(const struct net_device *dev);  #else  static inline struct net_device * -__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) +__vlan_find_dev_deep(struct net_device *real_dev, +		     __be16 vlan_proto, u16 vlan_id)  {  	return NULL;  } @@ -131,12 +132,12 @@ static inline struct sk_buff *vlan_untag(struct sk_buff *skb)  	return skb;  } -static inline int vlan_vid_add(struct net_device *dev, unsigned short vid) +static inline int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid)  {  	return 0;  } -static inline void vlan_vid_del(struct net_device *dev, unsigned short vid) +static inline void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid)  {  } @@ -157,9 +158,20 @@ static inline bool vlan_uses_dev(const struct net_device *dev)  }  #endif +static inline bool vlan_hw_offload_capable(netdev_features_t features, +					   __be16 proto) +{ +	if (proto == htons(ETH_P_8021Q) && features & NETIF_F_HW_VLAN_CTAG_TX) +		return true; +	if (proto == htons(ETH_P_8021AD) && features & NETIF_F_HW_VLAN_STAG_TX) +		return true; +	return false; +} +  /**   * vlan_insert_tag - regular VLAN tag inserting   * @skb: skbuff to tag + * @vlan_proto: VLAN encapsulation protocol   * @vlan_tci: VLAN TCI to insert   *   * Inserts the VLAN tag into @skb as part of the payload @@ -170,7 +182,8 @@ static inline bool vlan_uses_dev(const struct net_device *dev)   *   * Does not change skb->protocol so this function can be used during receive.   */ -static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, u16 vlan_tci) +static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, +					      __be16 vlan_proto, u16 vlan_tci)  {  	struct vlan_ethhdr *veth; @@ -185,7 +198,7 @@ static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, u16 vlan_tci)  	skb->mac_header -= VLAN_HLEN;  	/* first, the ethernet type */ -	veth->h_vlan_proto = htons(ETH_P_8021Q); +	veth->h_vlan_proto = vlan_proto;  	/* now, the TCI */  	veth->h_vlan_TCI = htons(vlan_tci); @@ -204,24 +217,28 @@ static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, u16 vlan_tci)   * Following the skb_unshare() example, in case of error, the calling function   * doesn't have to worry about freeing the original skb.   */ -static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) +static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, +					     __be16 vlan_proto, u16 vlan_tci)  { -	skb = vlan_insert_tag(skb, vlan_tci); +	skb = vlan_insert_tag(skb, vlan_proto, vlan_tci);  	if (skb) -		skb->protocol = htons(ETH_P_8021Q); +		skb->protocol = vlan_proto;  	return skb;  }  /**   * __vlan_hwaccel_put_tag - hardware accelerated VLAN inserting   * @skb: skbuff to tag + * @vlan_proto: VLAN encapsulation protocol   * @vlan_tci: VLAN TCI to insert   *   * Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest   */  static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, +						     __be16 vlan_proto,  						     u16 vlan_tci)  { +	skb->vlan_proto = vlan_proto;  	skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci;  	return skb;  } @@ -236,12 +253,13 @@ static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb,   * Assumes skb->dev is the target that will xmit this frame.   * Returns a VLAN tagged skb.   */ -static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) +static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, +					   __be16 vlan_proto, u16 vlan_tci)  { -	if (skb->dev->features & NETIF_F_HW_VLAN_TX) { -		return __vlan_hwaccel_put_tag(skb, vlan_tci); +	if (vlan_hw_offload_capable(skb->dev->features, vlan_proto)) { +		return __vlan_hwaccel_put_tag(skb, vlan_proto, vlan_tci);  	} else { -		return __vlan_put_tag(skb, vlan_tci); +		return __vlan_put_tag(skb, vlan_proto, vlan_tci);  	}  } @@ -256,9 +274,9 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)  {  	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data; -	if (veth->h_vlan_proto != htons(ETH_P_8021Q)) { +	if (veth->h_vlan_proto != htons(ETH_P_8021Q) && +	    veth->h_vlan_proto != htons(ETH_P_8021AD))  		return -EINVAL; -	}  	*vlan_tci = ntohs(veth->h_vlan_TCI);  	return 0; @@ -294,7 +312,7 @@ static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb,   */  static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)  { -	if (skb->dev->features & NETIF_F_HW_VLAN_TX) { +	if (skb->dev->features & NETIF_F_HW_VLAN_CTAG_TX) {  		return __vlan_hwaccel_get_tag(skb, vlan_tci);  	} else {  		return __vlan_get_tag(skb, vlan_tci); @@ -339,7 +357,7 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb,  	 */  	proto = vhdr->h_vlan_encapsulated_proto; -	if (ntohs(proto) >= 1536) { +	if (ntohs(proto) >= ETH_P_802_3_MIN) {  		skb->protocol = proto;  		return;  	} diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h index 2e4eab9868a..e7fdec4db9d 100644 --- a/include/linux/iio/adc/ad_sigma_delta.h +++ b/include/linux/iio/adc/ad_sigma_delta.h @@ -133,9 +133,9 @@ int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig);  		.channel2 = (_channel2), \  		.address = (_address), \  		.extend_name = (_extend_name), \ -		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -			IIO_CHAN_INFO_SCALE_SHARED_BIT | \ -			IIO_CHAN_INFO_OFFSET_SEPARATE_BIT, \ +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +			BIT(IIO_CHAN_INFO_OFFSET), \ +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \  		.scan_index = (_si), \  		.scan_type = { \  			.sign = 'u', \ diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h index 8bd12be0b02..172c5b23cb8 100644 --- a/include/linux/iio/common/st_sensors.h +++ b/include/linux/iio/common/st_sensors.h @@ -15,6 +15,7 @@  #include <linux/spi/spi.h>  #include <linux/irqreturn.h>  #include <linux/iio/trigger.h> +#include <linux/bitops.h>  #define ST_SENSORS_TX_MAX_LENGTH		2  #define ST_SENSORS_RX_MAX_LENGTH		6 @@ -45,8 +46,8 @@  { \  	.type = device_type, \  	.modified = 1, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -			IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +			BIT(IIO_CHAN_INFO_SCALE), \  	.scan_index = index, \  	.channel2 = mod, \  	.address = addr, \ diff --git a/include/linux/iio/gyro/itg3200.h b/include/linux/iio/gyro/itg3200.h index c53f16914b7..2a820850f28 100644 --- a/include/linux/iio/gyro/itg3200.h +++ b/include/linux/iio/gyro/itg3200.h @@ -149,6 +149,6 @@ static inline void itg3200_buffer_unconfigure(struct iio_dev *indio_dev)  {  } -#endif  /* CONFIG_IIO_RING_BUFFER */ +#endif  /* CONFIG_IIO_BUFFER */  #endif /* ITG3200_H_ */ diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index da8c776ba0b..8d171f42763 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -38,76 +38,6 @@ enum iio_chan_info_enum {  	IIO_CHAN_INFO_HYSTERESIS,  }; -#define IIO_CHAN_INFO_SHARED_BIT(type) BIT(type*2) -#define IIO_CHAN_INFO_SEPARATE_BIT(type) BIT(type*2 + 1) -#define IIO_CHAN_INFO_BITS(type) (IIO_CHAN_INFO_SHARED_BIT(type) | \ -				    IIO_CHAN_INFO_SEPARATE_BIT(type)) - -#define IIO_CHAN_INFO_RAW_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_RAW) -#define IIO_CHAN_INFO_PROCESSED_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PROCESSED) -#define IIO_CHAN_INFO_SCALE_SEPARATE_BIT		\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SCALE) -#define IIO_CHAN_INFO_SCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SCALE) -#define IIO_CHAN_INFO_OFFSET_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_OFFSET) -#define IIO_CHAN_INFO_OFFSET_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_OFFSET) -#define IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBSCALE) -#define IIO_CHAN_INFO_CALIBSCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBSCALE) -#define IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBBIAS) -#define IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBBIAS) -#define IIO_CHAN_INFO_PEAK_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAK) -#define IIO_CHAN_INFO_PEAK_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAK) -#define IIO_CHAN_INFO_PEAKSCALE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAKSCALE) -#define IIO_CHAN_INFO_PEAKSCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAKSCALE) -#define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE_BIT	\ -	IIO_CHAN_INFO_SEPARATE_BIT(				\ -		IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) -#define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SHARED_BIT	\ -	IIO_CHAN_INFO_SHARED_BIT(				\ -		IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) -#define IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_AVERAGE_RAW) -#define IIO_CHAN_INFO_AVERAGE_RAW_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_AVERAGE_RAW) -#define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT \ -	IIO_CHAN_INFO_SHARED_BIT(			       \ -		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) -#define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SEPARATE_BIT \ -	IIO_CHAN_INFO_SEPARATE_BIT(			       \ -		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) -#define IIO_CHAN_INFO_SAMP_FREQ_SEPARATE_BIT		\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SAMP_FREQ) -#define IIO_CHAN_INFO_SAMP_FREQ_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SAMP_FREQ) -#define IIO_CHAN_INFO_FREQUENCY_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_FREQUENCY) -#define IIO_CHAN_INFO_FREQUENCY_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_FREQUENCY) -#define IIO_CHAN_INFO_PHASE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PHASE) -#define IIO_CHAN_INFO_PHASE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PHASE) -#define IIO_CHAN_INFO_HARDWAREGAIN_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HARDWAREGAIN) -#define IIO_CHAN_INFO_HARDWAREGAIN_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HARDWAREGAIN) -#define IIO_CHAN_INFO_HYSTERESIS_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HYSTERESIS) -#define IIO_CHAN_INFO_HYSTERESIS_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HYSTERESIS) -  enum iio_endian {  	IIO_CPU,  	IIO_BE, @@ -218,6 +148,10 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,   *			endianness:	little or big endian   * @info_mask:		What information is to be exported about this channel.   *			This includes calibbias, scale etc. + * @info_mask_separate: What information is to be exported that is specific to + *			this channel. + * @info_mask_shared_by_type: What information is to be exported that is shared +*			by all channels of the same type.   * @event_mask:		What events can this channel produce.   * @ext_info:		Array of extended info attributes for this channel.   *			The array is NULL terminated, the last element should @@ -253,6 +187,8 @@ struct iio_chan_spec {  		enum iio_endian endianness;  	} scan_type;  	long			info_mask; +	long			info_mask_separate; +	long			info_mask_shared_by_type;  	long			event_mask;  	const struct iio_chan_spec_ext_info *ext_info;  	const char		*extend_name; @@ -275,7 +211,8 @@ struct iio_chan_spec {  static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,  	enum iio_chan_info_enum type)  { -	return chan->info_mask & IIO_CHAN_INFO_BITS(type); +	return (chan->info_mask_separate & type) | +	       (chan->info_mask_shared_by_type & type);  }  #define IIO_ST(si, rb, sb, sh)						\ diff --git a/include/linux/iio/imu/adis.h b/include/linux/iio/imu/adis.h index ff781dca2e9..b665dc7f017 100644 --- a/include/linux/iio/imu/adis.h +++ b/include/linux/iio/imu/adis.h @@ -162,8 +162,8 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	.indexed = 1, \  	.channel = (chan), \  	.extend_name = name, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		BIT(IIO_CHAN_INFO_SCALE), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -184,9 +184,9 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	.type = IIO_TEMP, \  	.indexed = 1, \  	.channel = 0, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		IIO_CHAN_INFO_SCALE_SEPARATE_BIT | \ -		IIO_CHAN_INFO_OFFSET_SEPARATE_BIT, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		BIT(IIO_CHAN_INFO_SCALE) | \ +		BIT(IIO_CHAN_INFO_OFFSET), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -197,13 +197,13 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	}, \  } -#define ADIS_MOD_CHAN(_type, mod, addr, si, info, bits) { \ +#define ADIS_MOD_CHAN(_type, mod, addr, si, info_sep, bits) { \  	.type = (_type), \  	.modified = 1, \  	.channel2 = IIO_MOD_ ## mod, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		 IIO_CHAN_INFO_SCALE_SHARED_BIT | \ -		 info, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		 info_sep, \ +	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -214,17 +214,17 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	}, \  } -#define ADIS_ACCEL_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info, bits) +#define ADIS_ACCEL_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, bits) -#define ADIS_GYRO_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info, bits) +#define ADIS_GYRO_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, bits) -#define ADIS_INCLI_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info, bits) +#define ADIS_INCLI_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, bits) -#define ADIS_ROT_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info, bits) +#define ADIS_ROT_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, bits)  #ifdef CONFIG_IIO_ADIS_LIB_BUFFER diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h index c66e0a96f6e..3869c525b05 100644 --- a/include/linux/iio/trigger.h +++ b/include/linux/iio/trigger.h @@ -44,7 +44,6 @@ struct iio_trigger_ops {   * @id:			[INTERN] unique id number   * @name:		[DRIVER] unique name   * @dev:		[DRIVER] associated device (if relevant) - * @private_data:	[DRIVER] device specific data   * @list:		[INTERN] used in maintenance of global trigger list   * @alloc_list:		[DRIVER] used for driver specific trigger list   * @use_count:		use count for the trigger @@ -60,7 +59,6 @@ struct iio_trigger {  	const char			*name;  	struct device			dev; -	void				*private_data;  	struct list_head		list;  	struct list_head		alloc_list;  	int use_count; @@ -92,6 +90,30 @@ static inline void iio_trigger_get(struct iio_trigger *trig)  }  /** + * iio_device_set_drvdata() - Set trigger driver data + * @trig: IIO trigger structure + * @data: Driver specific data + * + * Allows to attach an arbitrary pointer to an IIO trigger, which can later be + * retrieved by iio_trigger_get_drvdata(). + */ +static inline void iio_trigger_set_drvdata(struct iio_trigger *trig, void *data) +{ +	dev_set_drvdata(&trig->dev, data); +} + +/** + * iio_trigger_get_drvdata() - Get trigger driver data + * @trig: IIO trigger structure + * + * Returns the data previously set with iio_trigger_set_drvdata() + */ +static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig) +{ +	return dev_get_drvdata(&trig->dev); +} + +/**   * iio_trigger_register() - register a trigger with the IIO core   * @trig_info:	trigger to be registered   **/ diff --git a/include/linux/ima.h b/include/linux/ima.h index 86c361e947b..1b7f268cddc 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h @@ -46,7 +46,7 @@ static inline int ima_module_check(struct file *file)  	return 0;  } -#endif /* CONFIG_IMA_H */ +#endif /* CONFIG_IMA */  #ifdef CONFIG_IMA_APPRAISE  extern void ima_inode_post_setattr(struct dentry *dentry); @@ -72,5 +72,5 @@ static inline int ima_inode_removexattr(struct dentry *dentry,  {  	return 0;  } -#endif /* CONFIG_IMA_APPRAISE_H */ +#endif /* CONFIG_IMA_APPRAISE */  #endif /* _LINUX_IMA_H */ diff --git a/include/linux/input/auo-pixcir-ts.h b/include/linux/input/auo-pixcir-ts.h index 75d4be71771..5049f21928e 100644 --- a/include/linux/input/auo-pixcir-ts.h +++ b/include/linux/input/auo-pixcir-ts.h @@ -43,12 +43,10 @@   */  struct auo_pixcir_ts_platdata {  	int gpio_int; +	int gpio_rst;  	int int_setting; -	void (*init_hw)(struct i2c_client *); -	void (*exit_hw)(struct i2c_client *); -  	unsigned int x_max;  	unsigned int y_max;  }; diff --git a/include/linux/input/mt.h b/include/linux/input/mt.h index 2e86bd0bfba..1b1dfa80d9f 100644 --- a/include/linux/input/mt.h +++ b/include/linux/input/mt.h @@ -19,6 +19,7 @@  #define INPUT_MT_DIRECT		0x0002	/* direct device, e.g. touchscreen */  #define INPUT_MT_DROP_UNUSED	0x0004	/* drop contacts not seen in frame */  #define INPUT_MT_TRACK		0x0008	/* use in-kernel tracking */ +#define INPUT_MT_SEMI_MT	0x0010	/* semi-mt device, finger count handled manually */  /**   * struct input_mt_slot - represents the state of an input MT slot diff --git a/include/linux/integrity.h b/include/linux/integrity.h index 66c5fe9550a..83222cebd47 100644 --- a/include/linux/integrity.h +++ b/include/linux/integrity.h @@ -36,5 +36,5 @@ static inline void integrity_inode_free(struct inode *inode)  {  	return;  } -#endif /* CONFIG_INTEGRITY_H */ +#endif /* CONFIG_INTEGRITY */  #endif /* _LINUX_INTEGRITY_H */ diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 85ac9b9b72a..89b7c24a36e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,10 @@ extern struct resource * __request_region(struct resource *,  extern int __check_region(struct resource *, resource_size_t, resource_size_t);  extern void __release_region(struct resource *, resource_size_t,  				resource_size_t); +#ifdef CONFIG_MEMORY_HOTREMOVE +extern int release_mem_region_adjustable(struct resource *, resource_size_t, +				resource_size_t); +#endif  static inline int __deprecated check_region(resource_size_t s,  						resource_size_t n) diff --git a/include/linux/ipack.h b/include/linux/ipack.h index fea12cbb2ae..1888e06ddf6 100644 --- a/include/linux/ipack.h +++ b/include/linux/ipack.h @@ -207,19 +207,41 @@ int ipack_driver_register(struct ipack_driver *edrv, struct module *owner,  void ipack_driver_unregister(struct ipack_driver *edrv);  /** - *	ipack_device_register -- register an IPack device with the kernel - *	@dev: the new device to register. + *	ipack_device_init -- initialize an IPack device + * @dev: the new device to initialize.   * - *	Register a new IPack device ("module" in IndustryPack jargon). The call - *	is done by the carrier driver.  The carrier should populate the fields - *	bus and slot as well as the region array of @dev prior to calling this - *	function.  The rest of the fields will be allocated and populated - *	during registration. + * Initialize a new IPack device ("module" in IndustryPack jargon). The call + * is done by the carrier driver.  The carrier should populate the fields + * bus and slot as well as the region array of @dev prior to calling this + * function.  The rest of the fields will be allocated and populated + * during initalization.   * - *	Return zero on success or error code on failure. + * Return zero on success or error code on failure. + * + * NOTE: _Never_ directly free @dev after calling this function, even + * if it returned an error! Always use ipack_put_device() to give up the + * reference initialized in this function instead. + */ +int ipack_device_init(struct ipack_device *dev); + +/** + *	ipack_device_add -- Add an IPack device + * @dev: the new device to add. + * + * Add a new IPack device. The call is done by the carrier driver + * after calling ipack_device_init(). + * + * Return zero on success or error code on failure. + * + * NOTE: _Never_ directly free @dev after calling this function, even + * if it returned an error! Always use ipack_put_device() to give up the + * reference initialized in this function instead.   */ -int ipack_device_register(struct ipack_device *dev); -void ipack_device_unregister(struct ipack_device *dev); +int ipack_device_add(struct ipack_device *dev); +void ipack_device_del(struct ipack_device *dev); + +void ipack_get_device(struct ipack_device *dev); +void ipack_put_device(struct ipack_device *dev);  /**   * DEFINE_IPACK_DEVICE_TABLE - macro used to describe a IndustryPack table diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index ae221a7b509..c4d870b0d5e 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h @@ -43,8 +43,8 @@ struct ipc_namespace {  	size_t		shm_ctlmax;  	size_t		shm_ctlall; +	unsigned long	shm_tot;  	int		shm_ctlmni; -	int		shm_tot;  	/*  	 * Defines whether IPC_RMID is forced for _all_ shm segments regardless  	 * of shmctl() diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index f5dbce50466..66017028dcb 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -37,7 +37,7 @@ void irq_work_sync(struct irq_work *work);  #ifdef CONFIG_IRQ_WORK  bool irq_work_needs_cpu(void);  #else -static bool irq_work_needs_cpu(void) { return false; } +static inline bool irq_work_needs_cpu(void) { return false; }  #endif  #endif /* _LINUX_IRQ_WORK_H */ diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h index 3fd8e4290a1..3e203eb23cc 100644 --- a/include/linux/irqchip/arm-gic.h +++ b/include/linux/irqchip/arm-gic.h @@ -65,7 +65,6 @@ extern struct irq_chip gic_arch_extn;  void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *,  		    u32 offset, struct device_node *); -void gic_secondary_init(unsigned int);  void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);  static inline void gic_init(unsigned int nr, int start, diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h new file mode 100644 index 00000000000..adf4c30f3af --- /dev/null +++ b/include/linux/irqchip/chained_irq.h @@ -0,0 +1,52 @@ +/* + * Chained IRQ handlers support. + * + * Copyright (C) 2011 ARM Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef __IRQCHIP_CHAINED_IRQ_H +#define __IRQCHIP_CHAINED_IRQ_H + +#include <linux/irq.h> + +/* + * Entry/exit functions for chained handlers where the primary IRQ chip + * may implement either fasteoi or level-trigger flow control. + */ +static inline void chained_irq_enter(struct irq_chip *chip, +				     struct irq_desc *desc) +{ +	/* FastEOI controllers require no action on entry. */ +	if (chip->irq_eoi) +		return; + +	if (chip->irq_mask_ack) { +		chip->irq_mask_ack(&desc->irq_data); +	} else { +		chip->irq_mask(&desc->irq_data); +		if (chip->irq_ack) +			chip->irq_ack(&desc->irq_data); +	} +} + +static inline void chained_irq_exit(struct irq_chip *chip, +				    struct irq_desc *desc) +{ +	if (chip->irq_eoi) +		chip->irq_eoi(&desc->irq_data); +	else +		chip->irq_unmask(&desc->irq_data); +} + +#endif /* __IRQCHIP_CHAINED_IRQ_H */ diff --git a/include/linux/irqchip/mxs.h b/include/linux/irqchip/mxs.h new file mode 100644 index 00000000000..9039a538a91 --- /dev/null +++ b/include/linux/irqchip/mxs.h @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2013 Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_IRQCHIP_MXS_H +#define __LINUX_IRQCHIP_MXS_H + +extern void icoll_handle_irq(struct pt_regs *); + +#endif diff --git a/include/linux/jbd.h b/include/linux/jbd.h index c8f32975f0e..7e0b622503c 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -887,7 +887,7 @@ extern struct kmem_cache *jbd_handle_cache;  static inline handle_t *jbd_alloc_handle(gfp_t gfp_flags)  { -	return kmem_cache_alloc(jbd_handle_cache, gfp_flags); +	return kmem_cache_zalloc(jbd_handle_cache, gfp_flags);  }  static inline void jbd_free_handle(handle_t *handle) diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 50e5a5e6a71..6e051f472ed 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -480,6 +480,7 @@ struct transaction_s  		T_COMMIT,  		T_COMMIT_DFLUSH,  		T_COMMIT_JFLUSH, +		T_COMMIT_CALLBACK,  		T_FINISHED  	}			t_state; @@ -1144,7 +1145,7 @@ extern struct kmem_cache *jbd2_handle_cache;  static inline handle_t *jbd2_alloc_handle(gfp_t gfp_flags)  { -	return kmem_cache_alloc(jbd2_handle_cache, gfp_flags); +	return kmem_cache_zalloc(jbd2_handle_cache, gfp_flags);  }  static inline void jbd2_free_handle(handle_t *handle) @@ -1200,6 +1201,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t tid);  int jbd2_journal_start_commit(journal_t *journal, tid_t *tid);  int jbd2_journal_force_commit_nested(journal_t *journal);  int jbd2_log_wait_commit(journal_t *journal, tid_t tid); +int jbd2_complete_transaction(journal_t *journal, tid_t tid);  int jbd2_log_do_checkpoint(journal_t *journal);  int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid); diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 82ed068b1eb..8fb8edf1241 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -75,7 +75,6 @@ extern int register_refined_jiffies(long clock_tick_rate);   */  extern u64 __jiffy_data jiffies_64;  extern unsigned long volatile __jiffy_data jiffies; -extern seqlock_t jiffies_lock;  #if (BITS_PER_LONG < 64)  u64 get_jiffies_64(void); diff --git a/include/linux/journal-head.h b/include/linux/journal-head.h index c18b46f8aee..13a3da25ff0 100644 --- a/include/linux/journal-head.h +++ b/include/linux/journal-head.h @@ -31,21 +31,14 @@ struct journal_head {  	/*  	 * Journalling list for this buffer [jbd_lock_bh_state()]  	 */ -	unsigned b_jlist; +	unsigned b_jlist:4;  	/*  	 * This flag signals the buffer has been modified by  	 * the currently running transaction  	 * [jbd_lock_bh_state()]  	 */ -	unsigned b_modified; - -	/* -	 * This feild tracks the last transaction id in which this buffer -	 * has been cowed -	 * [jbd_lock_bh_state()] -	 */ -	tid_t b_cow_tid; +	unsigned b_modified:1;  	/*  	 * Copy of the buffer data frozen for writing to the log. diff --git a/include/linux/kcore.h b/include/linux/kcore.h new file mode 100644 index 00000000000..d9276228664 --- /dev/null +++ b/include/linux/kcore.h @@ -0,0 +1,38 @@ +/* + * /proc/kcore definitions + */ +#ifndef _LINUX_KCORE_H +#define _LINUX_KCORE_H + +enum kcore_type { +	KCORE_TEXT, +	KCORE_VMALLOC, +	KCORE_RAM, +	KCORE_VMEMMAP, +	KCORE_OTHER, +}; + +struct kcore_list { +	struct list_head list; +	unsigned long addr; +	size_t size; +	int type; +}; + +struct vmcore { +	struct list_head list; +	unsigned long long paddr; +	unsigned long long size; +	loff_t offset; +}; + +#ifdef CONFIG_PROC_KCORE +extern void kclist_add(struct kcore_list *, void *, size_t, int type); +#else +static inline +void kclist_add(struct kcore_list *new, void *addr, size_t size, int type) +{ +} +#endif + +#endif /* _LINUX_KCORE_H */ diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 80d36874689..6d1844f393c 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -390,7 +390,6 @@ extern struct pid *session_of_pgrp(struct pid *pgrp);  unsigned long int_sqrt(unsigned long);  extern void bust_spinlocks(int yes); -extern void wake_up_klogd(void);  extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */  extern int panic_timeout;  extern int panic_on_oops; @@ -487,6 +486,8 @@ enum ftrace_dump_mode {  void tracing_on(void);  void tracing_off(void);  int tracing_is_on(void); +void tracing_snapshot(void); +void tracing_snapshot_alloc(void);  extern void tracing_start(void);  extern void tracing_stop(void); @@ -516,10 +517,32 @@ do {									\   *   * This is intended as a debugging tool for the developer only.   * Please refrain from leaving trace_printks scattered around in - * your code. + * your code. (Extra memory is used for special buffers that are + * allocated when trace_printk() is used) + * + * A little optization trick is done here. If there's only one + * argument, there's no need to scan the string for printf formats. + * The trace_puts() will suffice. But how can we take advantage of + * using trace_puts() when trace_printk() has only one argument? + * By stringifying the args and checking the size we can tell + * whether or not there are args. __stringify((__VA_ARGS__)) will + * turn into "()\0" with a size of 3 when there are no args, anything + * else will be bigger. All we need to do is define a string to this, + * and then take its size and compare to 3. If it's bigger, use + * do_trace_printk() otherwise, optimize it to trace_puts(). Then just + * let gcc optimize the rest.   */ -#define trace_printk(fmt, args...)					\ +#define trace_printk(fmt, ...)				\ +do {							\ +	char _______STR[] = __stringify((__VA_ARGS__));	\ +	if (sizeof(_______STR) > 3)			\ +		do_trace_printk(fmt, ##__VA_ARGS__);	\ +	else						\ +		trace_puts(fmt);			\ +} while (0) + +#define do_trace_printk(fmt, args...)					\  do {									\  	static const char *trace_printk_fmt				\  		__attribute__((section("__trace_printk_fmt"))) =	\ @@ -539,7 +562,45 @@ int __trace_bprintk(unsigned long ip, const char *fmt, ...);  extern __printf(2, 3)  int __trace_printk(unsigned long ip, const char *fmt, ...); -extern void trace_dump_stack(void); +/** + * trace_puts - write a string into the ftrace buffer + * @str: the string to record + * + * Note: __trace_bputs is an internal function for trace_puts and + *       the @ip is passed in via the trace_puts macro. + * + * This is similar to trace_printk() but is made for those really fast + * paths that a developer wants the least amount of "Heisenbug" affects, + * where the processing of the print format is still too much. + * + * This function allows a kernel developer to debug fast path sections + * that printk is not appropriate for. By scattering in various + * printk like tracing in the code, a developer can quickly see + * where problems are occurring. + * + * This is intended as a debugging tool for the developer only. + * Please refrain from leaving trace_puts scattered around in + * your code. (Extra memory is used for special buffers that are + * allocated when trace_puts() is used) + * + * Returns: 0 if nothing was written, positive # if string was. + *  (1 when __trace_bputs is used, strlen(str) when __trace_puts is used) + */ + +extern int __trace_bputs(unsigned long ip, const char *str); +extern int __trace_puts(unsigned long ip, const char *str, int size); +#define trace_puts(str) ({						\ +	static const char *trace_printk_fmt				\ +		__attribute__((section("__trace_printk_fmt"))) =	\ +		__builtin_constant_p(str) ? str : NULL;			\ +									\ +	if (__builtin_constant_p(str))					\ +		__trace_bputs(_THIS_IP_, trace_printk_fmt);		\ +	else								\ +		__trace_puts(_THIS_IP_, str, strlen(str));		\ +}) + +extern void trace_dump_stack(int skip);  /*   * The double __builtin_constant_p is because gcc will give us an error @@ -574,6 +635,8 @@ static inline void trace_dump_stack(void) { }  static inline void tracing_on(void) { }  static inline void tracing_off(void) { }  static inline int tracing_is_on(void) { return 0; } +static inline void tracing_snapshot(void) { } +static inline void tracing_snapshot_alloc(void) { }  static inline __printf(1, 2)  int trace_printk(const char *fmt, ...) @@ -735,6 +798,4 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD  #endif -extern int do_sysinfo(struct sysinfo *info); -  #endif diff --git a/include/linux/kexec.h b/include/linux/kexec.h index d2e6927bbaa..d78d28a733b 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -200,6 +200,8 @@ extern size_t vmcoreinfo_max_size;  int __init parse_crashkernel(char *cmdline, unsigned long long system_ram,  		unsigned long long *crash_size, unsigned long long *crash_base); +int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, +		unsigned long long *crash_size, unsigned long long *crash_base);  int parse_crashkernel_low(char *cmdline, unsigned long long system_ram,  		unsigned long long *crash_size, unsigned long long *crash_base);  int crash_shrink_memory(unsigned long new_size); diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 5398d580707..0555cc66a15 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -67,16 +67,15 @@ struct subprocess_info {  };  extern int -call_usermodehelper_fns(char *path, char **argv, char **envp, int wait, -			int (*init)(struct subprocess_info *info, struct cred *new), -			void (*cleanup)(struct subprocess_info *), void *data); +call_usermodehelper(char *path, char **argv, char **envp, int wait); -static inline int -call_usermodehelper(char *path, char **argv, char **envp, int wait) -{ -	return call_usermodehelper_fns(path, argv, envp, wait, -				       NULL, NULL, NULL); -} +extern struct subprocess_info * +call_usermodehelper_setup(char *path, char **argv, char **envp, gfp_t gfp_mask, +			  int (*init)(struct subprocess_info *info, struct cred *new), +			  void (*cleanup)(struct subprocess_info *), void *data); + +extern int +call_usermodehelper_exec(struct subprocess_info *info, int wait);  extern struct ctl_table usermodehelper_table[]; diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 4b6ef4d33cc..ca1d27a0d6a 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -29,6 +29,7 @@   *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi   *		<prasanna@in.ibm.com> added function-return probes.   */ +#include <linux/compiler.h>	/* for __kprobes */  #include <linux/linkage.h>  #include <linux/list.h>  #include <linux/notifier.h> @@ -49,16 +50,11 @@  #define KPROBE_REENTER		0x00000004  #define KPROBE_HIT_SSDONE	0x00000008 -/* Attach to insert probes on any functions which should be ignored*/ -#define __kprobes	__attribute__((__section__(".kprobes.text"))) -  #else /* CONFIG_KPROBES */  typedef int kprobe_opcode_t;  struct arch_specific_insn {  	int dummy;  }; -#define __kprobes -  #endif /* CONFIG_KPROBES */  struct kprobe; diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 8d816646f76..7dcef331768 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -43,6 +43,7 @@ bool kthread_should_stop(void);  bool kthread_should_park(void);  bool kthread_freezable_should_stop(bool *was_frozen);  void *kthread_data(struct task_struct *k); +void *probe_kthread_data(struct task_struct *k);  int kthread_park(struct task_struct *k);  void kthread_unpark(struct task_struct *k);  void kthread_parkme(void); diff --git a/include/linux/ktime.h b/include/linux/ktime.h index e83512f63df..bbca12804d1 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h @@ -330,6 +330,24 @@ static inline ktime_t ktime_sub_us(const ktime_t kt, const u64 usec)  extern ktime_t ktime_add_safe(const ktime_t lhs, const ktime_t rhs); +/** + * ktime_to_timespec_cond - convert a ktime_t variable to timespec + *			    format only if the variable contains data + * @kt:		the ktime_t variable to convert + * @ts:		the timespec variable to store the result in + * + * Returns true if there was a successful conversion, false if kt was 0. + */ +static inline bool ktime_to_timespec_cond(const ktime_t kt, struct timespec *ts) +{ +	if (kt.tv64) { +		*ts = ktime_to_timespec(kt); +		return true; +	} else { +		return false; +	} +} +  /*   * The resolution of the clocks. The resolution value is returned in   * the clock_getres() system call to give application programmers an diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index cad77fe09d7..c1395825192 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -518,7 +518,7 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,  int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,  			   void *data, unsigned long len);  int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, -			      gpa_t gpa); +			      gpa_t gpa, unsigned long len);  int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);  int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);  struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h index fa7cc7244cb..b0bcce0ddc9 100644 --- a/include/linux/kvm_types.h +++ b/include/linux/kvm_types.h @@ -71,6 +71,7 @@ struct gfn_to_hva_cache {  	u64 generation;  	gpa_t gpa;  	unsigned long hva; +	unsigned long len;  	struct kvm_memory_slot *memslot;  }; diff --git a/include/linux/libata.h b/include/linux/libata.h index 91c9d109e5f..eae7a053dc5 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -398,6 +398,7 @@ enum {  	ATA_HORKAGE_NOSETXFER	= (1 << 14),	/* skip SETXFER, SATA only */  	ATA_HORKAGE_BROKEN_FPDMA_AA	= (1 << 15),	/* skip AA */  	ATA_HORKAGE_DUMP_ID	= (1 << 16),	/* dump IDENTIFY data */ +	ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17),	/* Set max sects to 65535 */  	 /* DMA mask for user DMA control: User visible values; DO NOT  	    renumber */ diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 807f1e53322..de09dec25ec 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -2,6 +2,7 @@  #define _LINUX_LINKAGE_H  #include <linux/compiler.h> +#include <linux/stringify.h>  #include <asm/linkage.h>  #ifdef __cplusplus @@ -14,6 +15,23 @@  #define asmlinkage CPP_ASMLINKAGE  #endif +#ifdef CONFIG_SYMBOL_PREFIX +#define __SYMBOL_NAME(x) CONFIG_SYMBOL_PREFIX __stringify(x) +#else +#define __SYMBOL_NAME(x) __stringify(x) +#endif + +#ifndef cond_syscall +#define cond_syscall(x) asm(".weak\t" __SYMBOL_NAME(x) \ +	"\n\t.set\t" __SYMBOL_NAME(x) "," __SYMBOL_NAME(sys_ni_syscall)); +#endif + +#ifndef SYSCALL_ALIAS +#define SYSCALL_ALIAS(alias, name)				\ +	asm ("\t.globl " __SYMBOL_NAME(alias)			\ +	"\n\t.set\t" __SYMBOL_NAME(alias) "," __SYMBOL_NAME(name)) +#endif +  #define __page_aligned_data	__section(.data..page_aligned) __aligned(PAGE_SIZE)  #define __page_aligned_bss	__section(.bss..page_aligned) __aligned(PAGE_SIZE) diff --git a/include/linux/list_bl.h b/include/linux/list_bl.h index 31f9d75adc5..2eb88556c5c 100644 --- a/include/linux/list_bl.h +++ b/include/linux/list_bl.h @@ -125,6 +125,11 @@ static inline void hlist_bl_unlock(struct hlist_bl_head *b)  	__bit_spin_unlock(0, (unsigned long *)b);  } +static inline bool hlist_bl_is_locked(struct hlist_bl_head *b) +{ +	return bit_spin_is_locked(0, (unsigned long *)b); +} +  /**   * hlist_bl_for_each_entry	- iterate over list of given type   * @tpos:	the type * to use as a loop cursor. diff --git a/include/linux/mei_cl_bus.h b/include/linux/mei_cl_bus.h new file mode 100644 index 00000000000..d14af7b722e --- /dev/null +++ b/include/linux/mei_cl_bus.h @@ -0,0 +1,44 @@ +#ifndef _LINUX_MEI_CL_BUS_H +#define _LINUX_MEI_CL_BUS_H + +#include <linux/device.h> +#include <linux/uuid.h> + +struct mei_cl_device; + +struct mei_cl_driver { +	struct device_driver driver; +	const char *name; + +	const struct mei_cl_device_id *id_table; + +	int (*probe)(struct mei_cl_device *dev, +		     const struct mei_cl_device_id *id); +	int (*remove)(struct mei_cl_device *dev); +}; + +int __mei_cl_driver_register(struct mei_cl_driver *driver, +				struct module *owner); +#define mei_cl_driver_register(driver)             \ +	__mei_cl_driver_register(driver, THIS_MODULE) + +void mei_cl_driver_unregister(struct mei_cl_driver *driver); + +int mei_cl_send(struct mei_cl_device *device, u8 *buf, size_t length); +int mei_cl_recv(struct mei_cl_device *device, u8 *buf, size_t length); + +typedef void (*mei_cl_event_cb_t)(struct mei_cl_device *device, +			       u32 events, void *context); +int mei_cl_register_event_cb(struct mei_cl_device *device, +			  mei_cl_event_cb_t read_cb, void *context); + +#define MEI_CL_EVENT_RX 0 +#define MEI_CL_EVENT_TX 1 + +void *mei_cl_get_drvdata(const struct mei_cl_device *device); +void mei_cl_set_drvdata(struct mei_cl_device *device, void *data); + +int mei_cl_enable_device(struct mei_cl_device *device); +int mei_cl_disable_device(struct mei_cl_device *device); + +#endif /* _LINUX_MEI_CL_BUS_H */ diff --git a/include/linux/memory.h b/include/linux/memory.h index 45e93b46887..85c31a8e290 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -18,6 +18,7 @@  #include <linux/node.h>  #include <linux/compiler.h>  #include <linux/mutex.h> +#include <linux/notifier.h>  #define MIN_MEMORY_BLOCK_SIZE     (1UL << SECTION_SIZE_BITS) @@ -114,9 +115,10 @@ extern void unregister_memory_notifier(struct notifier_block *nb);  extern int register_memory_isolate_notifier(struct notifier_block *nb);  extern void unregister_memory_isolate_notifier(struct notifier_block *nb);  extern int register_new_memory(int, struct mem_section *); +#ifdef CONFIG_MEMORY_HOTREMOVE  extern int unregister_memory_section(struct mem_section *); +#endif  extern int memory_dev_init(void); -extern int remove_memory_block(unsigned long, struct mem_section *, int);  extern int memory_notify(unsigned long val, void *v);  extern int memory_isolate_notify(unsigned long val, void *v);  extern struct memory_block *find_memory_block_hinted(struct mem_section *, @@ -127,13 +129,18 @@ enum mem_add_context { BOOT, HOTPLUG };  #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */  #ifdef CONFIG_MEMORY_HOTPLUG -#define hotplug_memory_notifier(fn, pri) {			\ +#define hotplug_memory_notifier(fn, pri) ({		\  	static __meminitdata struct notifier_block fn##_mem_nb =\ -		{ .notifier_call = fn, .priority = pri };	\ +		{ .notifier_call = fn, .priority = pri };\  	register_memory_notifier(&fn##_mem_nb);			\ -} +}) +#define register_hotmemory_notifier(nb)		register_memory_notifier(nb) +#define unregister_hotmemory_notifier(nb) 	unregister_memory_notifier(nb)  #else -#define hotplug_memory_notifier(fn, pri) do { } while (0) +#define hotplug_memory_notifier(fn, pri)	({ 0; }) +/* These aren't inline functions due to a GCC bug. */ +#define register_hotmemory_notifier(nb)    ({ (void)(nb); 0; }) +#define unregister_hotmemory_notifier(nb)  ({ (void)(nb); })  #endif  /* diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index b6a3be7d47b..3e622c61092 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -97,13 +97,13 @@ extern void __online_page_free(struct page *page);  #ifdef CONFIG_MEMORY_HOTREMOVE  extern bool is_pageblock_removable_nolock(struct page *page);  extern int arch_remove_memory(u64 start, u64 size); +extern int __remove_pages(struct zone *zone, unsigned long start_pfn, +	unsigned long nr_pages);  #endif /* CONFIG_MEMORY_HOTREMOVE */  /* reasonably generic interface to expand the physical pages in a zone  */  extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn,  	unsigned long nr_pages); -extern int __remove_pages(struct zone *zone, unsigned long start_pfn, -	unsigned long nr_pages);  #ifdef CONFIG_NUMA  extern int memory_add_physaddr_to_nid(u64 start); diff --git a/include/linux/mfd/abx500.h b/include/linux/mfd/abx500.h index 9ead60bc66b..3301b2031c8 100644 --- a/include/linux/mfd/abx500.h +++ b/include/linux/mfd/abx500.h @@ -89,6 +89,11 @@ struct abx500_fg;   *				points.   * @maint_thres			This is the threshold where we stop reporting   *				battery full while in maintenance, in per cent + * @pcut_enable:			Enable power cut feature in ab8505 + * @pcut_max_time:		Max time threshold + * @pcut_flag_time:		Flagtime threshold + * @pcut_max_restart:		Max number of restarts + * @pcut_debounce_time:		Sets battery debounce time   */  struct abx500_fg_parameters {  	int recovery_sleep_timer; @@ -106,6 +111,11 @@ struct abx500_fg_parameters {  	int battok_raising_th_sel1;  	int user_cap_limit;  	int maint_thres; +	bool pcut_enable; +	u8 pcut_max_time; +	u8 pcut_flag_time; +	u8 pcut_max_restart; +	u8 pcut_debounce_time;  };  /** @@ -173,11 +183,11 @@ struct abx500_battery_type {  	int low_high_vol_lvl;  	int battery_resistance;  	int n_temp_tbl_elements; -	struct abx500_res_to_temp *r_to_t_tbl; +	const struct abx500_res_to_temp *r_to_t_tbl;  	int n_v_cap_tbl_elements; -	struct abx500_v_to_cap *v_to_cap_tbl; +	const struct abx500_v_to_cap *v_to_cap_tbl;  	int n_batres_tbl_elements; -	struct batres_vs_temp *batres_tbl; +	const struct batres_vs_temp *batres_tbl;  };  /** @@ -236,7 +246,11 @@ struct abx500_bm_charger_parameters {   * @interval_not_charging charge alg cycle period time when not charging (sec)   * @temp_hysteresis	temperature hysteresis   * @gnd_lift_resistance	Battery ground to phone ground resistance (mOhm) - * @maxi:		maximization parameters + * @n_chg_out_curr		number of elements in array chg_output_curr + * @n_chg_in_curr		number of elements in array chg_input_curr + * @chg_output_curr	charger output current level map + * @chg_input_curr		charger input current level map + * @maxi		maximization parameters   * @cap_levels		capacity in percent for the different capacity levels   * @bat_type		table of supported battery types   * @chg_params		charger parameters @@ -257,6 +271,7 @@ struct abx500_bm_data {  	bool autopower_cfg;  	bool ac_enabled;  	bool usb_enabled; +	bool usb_power_path;  	bool no_maintenance;  	bool capacity_scaling;  	bool chg_unknown_bat; @@ -270,6 +285,10 @@ struct abx500_bm_data {  	int interval_not_charging;  	int temp_hysteresis;  	int gnd_lift_resistance; +	int n_chg_out_curr; +	int n_chg_in_curr; +	int *chg_output_curr; +	int *chg_input_curr;  	const struct abx500_maxim_parameters *maxi;  	const struct abx500_bm_capacity_levels *cap_levels;  	struct abx500_battery_type *bat_type; diff --git a/include/linux/mfd/abx500/ab8500-bm.h b/include/linux/mfd/abx500/ab8500-bm.h index 8d35bfe164c..cc892a8d8d6 100644 --- a/include/linux/mfd/abx500/ab8500-bm.h +++ b/include/linux/mfd/abx500/ab8500-bm.h @@ -23,6 +23,7 @@   * Bank : 0x5   */  #define AB8500_USB_LINE_STAT_REG	0x80 +#define AB8500_USB_LINE_CTRL2_REG	0x82  #define AB8500_USB_LINK1_STAT_REG	0x94  /* @@ -33,7 +34,7 @@  #define AB8500_CH_STATUS2_REG		0x01  #define AB8500_CH_USBCH_STAT1_REG	0x02  #define AB8500_CH_USBCH_STAT2_REG	0x03 -#define AB8500_CH_FSM_STAT_REG		0x04 +#define AB8540_CH_USBCH_STAT3_REG	0x04  #define AB8500_CH_STAT_REG		0x05  /* @@ -69,6 +70,8 @@  #define AB8500_USBCH_CTRL1_REG		0xC0  #define AB8500_USBCH_CTRL2_REG		0xC1  #define AB8500_USBCH_IPT_CRNTLVL_REG	0xC2 +#define AB8540_USB_PP_MODE_REG		0xC5 +#define AB8540_USB_PP_CHR_REG		0xC6  /*   * Gas Gauge register offsets @@ -105,6 +108,7 @@  #define AB8500_RTC_BACKUP_CHG_REG	0x0C  #define AB8500_RTC_CC_CONF_REG		0x01  #define AB8500_RTC_CTRL_REG		0x0B +#define AB8500_RTC_CTRL1_REG		0x11  /*   * OTP register offsets @@ -154,6 +158,7 @@  #define CH_OP_CUR_LVL_1P4		0x0D  #define CH_OP_CUR_LVL_1P5		0x0E  #define CH_OP_CUR_LVL_1P6		0x0F +#define CH_OP_CUR_LVL_2P		0x3F  /* BTEMP High thermal limits */  #define BTEMP_HIGH_TH_57_0		0x00 @@ -179,10 +184,25 @@  #define BUP_ICH_SEL_300UA		0x08  #define BUP_ICH_SEL_700UA		0x0C -#define BUP_VCH_SEL_2P5V		0x00 -#define BUP_VCH_SEL_2P6V		0x01 -#define BUP_VCH_SEL_2P8V		0x02 -#define BUP_VCH_SEL_3P1V		0x03 +enum bup_vch_sel { +	BUP_VCH_SEL_2P5V, +	BUP_VCH_SEL_2P6V, +	BUP_VCH_SEL_2P8V, +	BUP_VCH_SEL_3P1V, +	/* +	 * Note that the following 5 values 2.7v, 2.9v, 3.0v, 3.2v, 3.3v +	 * are only available on ab8540. You can't choose these 5 +	 * voltage on ab8500/ab8505/ab9540. +	 */ +	BUP_VCH_SEL_2P7V, +	BUP_VCH_SEL_2P9V, +	BUP_VCH_SEL_3P0V, +	BUP_VCH_SEL_3P2V, +	BUP_VCH_SEL_3P3V, +}; + +#define BUP_VCH_RANGE		0x02 +#define VBUP33_VRTCN		0x01  /* Battery OVV constants */  #define BATT_OVV_ENA			0x02 @@ -228,6 +248,8 @@  #define BAT_CTRL_20U_ENA		0x02  #define BAT_CTRL_18U_ENA		0x01  #define BAT_CTRL_16U_ENA		0x02 +#define BAT_CTRL_60U_ENA		0x01 +#define BAT_CTRL_120U_ENA		0x02  #define BAT_CTRL_CMP_ENA		0x04  #define FORCE_BAT_CTRL_CMP_HIGH		0x08  #define BAT_CTRL_PULL_UP_ENA		0x10 @@ -235,6 +257,24 @@  /* Battery type */  #define BATTERY_UNKNOWN			00 +/* Registers for pcut feature in ab8505 and ab9540 */ +#define AB8505_RTC_PCUT_CTL_STATUS_REG	0x12 +#define AB8505_RTC_PCUT_TIME_REG	0x13 +#define AB8505_RTC_PCUT_MAX_TIME_REG	0x14 +#define AB8505_RTC_PCUT_FLAG_TIME_REG	0x15 +#define AB8505_RTC_PCUT_RESTART_REG	0x16 +#define AB8505_RTC_PCUT_DEBOUNCE_REG	0x17 + +/* USB Power Path constants for ab8540 */ +#define BUS_VSYS_VOL_SELECT_MASK		0x06 +#define BUS_VSYS_VOL_SELECT_3P6V		0x00 +#define BUS_VSYS_VOL_SELECT_3P325V		0x02 +#define BUS_VSYS_VOL_SELECT_3P9V		0x04 +#define BUS_VSYS_VOL_SELECT_4P3V		0x06 +#define BUS_POWER_PATH_MODE_ENA			0x01 +#define BUS_PP_PRECHG_CURRENT_MASK		0x0E +#define BUS_POWER_PATH_PRECHG_ENA		0x01 +  /**   * struct res_to_temp - defines one point in a temp to res curve. To   * be used in battery packs that combines the identification resistor with a @@ -283,6 +323,11 @@ struct ab8500_fg;   *				points.   * @maint_thres			This is the threshold where we stop reporting   *				battery full while in maintenance, in per cent + * @pcut_enable:			Enable power cut feature in ab8505 + * @pcut_max_time:		Max time threshold + * @pcut_flag_time:		Flagtime threshold + * @pcut_max_restart:		Max number of restarts + * @pcut_debunce_time:	Sets battery debounce time   */  struct ab8500_fg_parameters {  	int recovery_sleep_timer; @@ -299,6 +344,11 @@ struct ab8500_fg_parameters {  	int battok_raising_th_sel1;  	int user_cap_limit;  	int maint_thres; +	bool pcut_enable; +	u8 pcut_max_time; +	u8 pcut_flag_time; +	u8 pcut_max_restart; +	u8 pcut_debunce_time;  };  /** @@ -415,6 +465,7 @@ void ab8500_fg_reinit(void);  void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA);  struct ab8500_btemp *ab8500_btemp_get(void);  int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp); +int ab8500_btemp_get_temp(struct ab8500_btemp *btemp);  struct ab8500_fg *ab8500_fg_get(void);  int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev);  int ab8500_fg_inst_curr_start(struct ab8500_fg *di); diff --git a/include/linux/mfd/abx500/ab8500-gpadc.h b/include/linux/mfd/abx500/ab8500-gpadc.h index 252966769d9..49ded001049 100644 --- a/include/linux/mfd/abx500/ab8500-gpadc.h +++ b/include/linux/mfd/abx500/ab8500-gpadc.h @@ -4,32 +4,72 @@   *   * Author: Arun R Murthy <arun.murthy@stericsson.com>   * Author: Daniel Willerud <daniel.willerud@stericsson.com> + * Author: M'boumba Cedric Madianga <cedric.madianga@stericsson.com>   */  #ifndef	_AB8500_GPADC_H  #define _AB8500_GPADC_H -/* GPADC source: From datasheet(ADCSwSel[4:0] in GPADCCtrl2) */ -#define BAT_CTRL	0x01 -#define BTEMP_BALL	0x02 -#define MAIN_CHARGER_V	0x03 -#define ACC_DETECT1	0x04 -#define ACC_DETECT2	0x05 -#define ADC_AUX1	0x06 -#define ADC_AUX2	0x07 -#define MAIN_BAT_V	0x08 -#define VBUS_V		0x09 -#define MAIN_CHARGER_C	0x0A -#define USB_CHARGER_C	0x0B -#define BK_BAT_V	0x0C -#define DIE_TEMP	0x0D +/* GPADC source: From datasheet(ADCSwSel[4:0] in GPADCCtrl2 + * and ADCHwSel[4:0] in GPADCCtrl3 ) */ +#define BAT_CTRL		0x01 +#define BTEMP_BALL		0x02 +#define MAIN_CHARGER_V		0x03 +#define ACC_DETECT1		0x04 +#define ACC_DETECT2		0x05 +#define ADC_AUX1		0x06 +#define ADC_AUX2		0x07 +#define MAIN_BAT_V		0x08 +#define VBUS_V			0x09 +#define MAIN_CHARGER_C		0x0A +#define USB_CHARGER_C		0x0B +#define BK_BAT_V		0x0C +#define DIE_TEMP		0x0D +#define USB_ID			0x0E +#define XTAL_TEMP		0x12 +#define VBAT_TRUE_MEAS		0x13 +#define BAT_CTRL_AND_IBAT	0x1C +#define VBAT_MEAS_AND_IBAT	0x1D +#define VBAT_TRUE_MEAS_AND_IBAT	0x1E +#define BAT_TEMP_AND_IBAT	0x1F + +/* Virtual channel used only for ibat convertion to ampere + * Battery current conversion (ibat) cannot be requested as a single conversion + *  but it is always in combination with other input requests + */ +#define IBAT_VIRTUAL_CHANNEL		0xFF + +#define SAMPLE_1        1 +#define SAMPLE_4        4 +#define SAMPLE_8        8 +#define SAMPLE_16       16 +#define RISING_EDGE     0 +#define FALLING_EDGE    1 + +/* Arbitrary ADC conversion type constants */ +#define ADC_SW				0 +#define ADC_HW				1  struct ab8500_gpadc;  struct ab8500_gpadc *ab8500_gpadc_get(char *name); -int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 channel); -int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel); +int ab8500_gpadc_sw_hw_convert(struct ab8500_gpadc *gpadc, u8 channel, +		u8 avg_sample, u8 trig_edge, u8 trig_timer, u8 conv_type); +static inline int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 channel) +{ +	return ab8500_gpadc_sw_hw_convert(gpadc, channel, +			SAMPLE_16, 0, 0, ADC_SW); +} + +int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel, +		u8 avg_sample, u8 trig_edge, u8 trig_timer, u8 conv_type); +int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, +		u8 avg_sample, u8 trig_edge, u8 trig_timer, u8 conv_type, +		int *ibat);  int ab8500_gpadc_ad_to_voltage(struct ab8500_gpadc *gpadc, -    u8 channel, int ad_value); +		u8 channel, int ad_value); +void ab8540_gpadc_get_otp(struct ab8500_gpadc *gpadc, +			u16 *vmain_l, u16 *vmain_h, u16 *btemp_l, u16 *btemp_h, +			u16 *vbat_l, u16 *vbat_h, u16 *ibat_l, u16 *ibat_h);  #endif /* _AB8500_GPADC_H */ diff --git a/include/linux/mfd/abx500/ab8500-sysctrl.h b/include/linux/mfd/abx500/ab8500-sysctrl.h index ebf12e793db..990bc93f46e 100644 --- a/include/linux/mfd/abx500/ab8500-sysctrl.h +++ b/include/linux/mfd/abx500/ab8500-sysctrl.h @@ -12,6 +12,7 @@  int ab8500_sysctrl_read(u16 reg, u8 *value);  int ab8500_sysctrl_write(u16 reg, u8 mask, u8 value); +void ab8500_restart(char mode, const char *cmd);  #else @@ -40,6 +41,7 @@ static inline int ab8500_sysctrl_clear(u16 reg, u8 bits)  /* Configuration data for SysClkReq1RfClkBuf - SysClkReq8RfClkBuf */  struct ab8500_sysctrl_platform_data {  	u8 initial_req_buf_config[8]; +	u16 (*reboot_reason_code)(const char *cmd);  };  /* Registers */ @@ -299,4 +301,8 @@ struct ab8500_sysctrl_platform_data {  #define AB9540_SYSCLK12BUF4VALID_SYSCLK12BUF4VALID_MASK 0xFF  #define AB9540_SYSCLK12BUF4VALID_SYSCLK12BUF4VALID_SHIFT 0 +#define AB8500_ENABLE_WD 0x1 +#define AB8500_KICK_WD 0x2 +#define AB8500_WD_RESTART_ON_EXPIRE 0x10 +  #endif /* __AB8500_SYSCTRL_H */ diff --git a/include/linux/mfd/abx500/ab8500.h b/include/linux/mfd/abx500/ab8500.h index 9db0bda446a..fb1bf7d6a41 100644 --- a/include/linux/mfd/abx500/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h @@ -362,10 +362,10 @@ struct ab8500 {  	u8 *oldmask;  	int mask_size;  	const int *irq_reg_offset; +	int it_latchhier_num;  }; -struct regulator_reg_init; -struct regulator_init_data; +struct ab8500_regulator_platform_data;  struct ab8500_gpio_platform_data;  struct ab8500_codec_platform_data;  struct ab8500_sysctrl_platform_data; @@ -375,19 +375,13 @@ struct ab8500_sysctrl_platform_data;   * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used   * @pm_power_off: Should machine pm power off hook be registered or not   * @init: board-specific initialization after detection of ab8500 - * @num_regulator_reg_init: number of regulator init registers - * @regulator_reg_init: regulator init registers - * @num_regulator: number of regulators   * @regulator: machine-specific constraints for regulators   */  struct ab8500_platform_data {  	int irq_base;  	bool pm_power_off;  	void (*init) (struct ab8500 *); -	int num_regulator_reg_init; -	struct ab8500_regulator_reg_init *regulator_reg_init; -	int num_regulator; -	struct regulator_init_data *regulator; +	struct ab8500_regulator_platform_data *regulator;  	struct abx500_gpio_platform_data *gpio;  	struct ab8500_codec_platform_data *codec;  	struct ab8500_sysctrl_platform_data *sysctrl; @@ -512,6 +506,8 @@ static inline int is_ab9540_2p0_or_earlier(struct ab8500 *ab)  	return (is_ab9540(ab) && (ab->chip_id < AB8500_CUT2P0));  } +void ab8500_override_turn_on_stat(u8 mask, u8 set); +  #ifdef CONFIG_AB8500_DEBUG  void ab8500_dump_all_banks(struct device *dev);  void ab8500_debug_register_interrupt(int line); diff --git a/include/linux/mfd/abx500/ux500_chargalg.h b/include/linux/mfd/abx500/ux500_chargalg.h index d43ac0f3552..234c99143bf 100644 --- a/include/linux/mfd/abx500/ux500_chargalg.h +++ b/include/linux/mfd/abx500/ux500_chargalg.h @@ -17,8 +17,11 @@ struct ux500_charger;  struct ux500_charger_ops {  	int (*enable) (struct ux500_charger *, int, int, int); +	int (*check_enable) (struct ux500_charger *, int, int);  	int (*kick_wd) (struct ux500_charger *);  	int (*update_curr) (struct ux500_charger *, int); +	int (*pp_enable) (struct ux500_charger *, bool); +	int (*pre_chg_enable) (struct ux500_charger *, bool);  };  /** @@ -29,6 +32,7 @@ struct ux500_charger_ops {   * @max_out_curr	maximum output charger current in mA   * @enabled		indicates if this charger is used or not   * @external		external charger unit (pm2xxx) + * @power_path		USB power path support   */  struct ux500_charger {  	struct power_supply psy; @@ -38,6 +42,9 @@ struct ux500_charger {  	int wdt_refresh;  	bool enabled;  	bool external; +	bool power_path;  }; +extern struct blocking_notifier_head charger_notifier_list; +  #endif diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h index a710255528d..cc281368dc5 100644 --- a/include/linux/mfd/arizona/core.h +++ b/include/linux/mfd/arizona/core.h @@ -100,6 +100,9 @@ struct arizona {  	struct regmap_irq_chip_data *aod_irq_chip;  	struct regmap_irq_chip_data *irq_chip; +	bool hpdet_magic; +	unsigned int hp_ena; +  	struct mutex clk_lock;  	int clk32k_ref; diff --git a/include/linux/mfd/arizona/pdata.h b/include/linux/mfd/arizona/pdata.h index 455c51d22d6..a0f940987a3 100644 --- a/include/linux/mfd/arizona/pdata.h +++ b/include/linux/mfd/arizona/pdata.h @@ -86,6 +86,11 @@ struct arizona_micd_config {  	bool gpio;  }; +struct arizona_micd_range { +	int max;  /** Ohms */ +	int key;  /** Key to report to input layer */ +}; +  struct arizona_pdata {  	int reset;      /** GPIO controlling /RESET, if any */  	int ldoena;     /** GPIO controlling LODENA, if any */ @@ -117,12 +122,21 @@ struct arizona_pdata {  	/** GPIO5 is used for jack detection */  	bool jd_gpio5; +	/** Internal pull on GPIO5 is disabled when used for jack detection */ +	bool jd_gpio5_nopull; +  	/** Use the headphone detect circuit to identify the accessory */  	bool hpdet_acc_id; +	/** Check for line output with HPDET method */ +	bool hpdet_acc_id_line; +  	/** GPIO used for mic isolation with HPDET */  	int hpdet_id_gpio; +	/** Extra debounce timeout used during initial mic detection (ms) */ +	int micd_detect_debounce; +  	/** GPIO for mic detection polarity */  	int micd_pol_gpio; @@ -135,9 +149,16 @@ struct arizona_pdata {  	/** Mic detect debounce level */  	int micd_dbtime; +	/** Mic detect timeout (ms) */ +	int micd_timeout; +  	/** Force MICBIAS on for mic detect */  	bool micd_force_micbias; +	/** Mic detect level parameters */ +	const struct arizona_micd_range *micd_ranges; +	int num_micd_ranges; +  	/** Headset polarity configurations */  	struct arizona_micd_config *micd_configs;  	int num_micd_configs; diff --git a/include/linux/mfd/arizona/registers.h b/include/linux/mfd/arizona/registers.h index 34035513606..715b6ba3d52 100644 --- a/include/linux/mfd/arizona/registers.h +++ b/include/linux/mfd/arizona/registers.h @@ -85,12 +85,14 @@  #define ARIZONA_FLL1_CONTROL_6                   0x176  #define ARIZONA_FLL1_LOOP_FILTER_TEST_1          0x177  #define ARIZONA_FLL1_NCO_TEST_0                  0x178 +#define ARIZONA_FLL1_CONTROL_7                   0x179  #define ARIZONA_FLL1_SYNCHRONISER_1              0x181  #define ARIZONA_FLL1_SYNCHRONISER_2              0x182  #define ARIZONA_FLL1_SYNCHRONISER_3              0x183  #define ARIZONA_FLL1_SYNCHRONISER_4              0x184  #define ARIZONA_FLL1_SYNCHRONISER_5              0x185  #define ARIZONA_FLL1_SYNCHRONISER_6              0x186 +#define ARIZONA_FLL1_SYNCHRONISER_7              0x187  #define ARIZONA_FLL1_SPREAD_SPECTRUM             0x189  #define ARIZONA_FLL1_GPIO_CLOCK                  0x18A  #define ARIZONA_FLL2_CONTROL_1                   0x191 @@ -101,12 +103,14 @@  #define ARIZONA_FLL2_CONTROL_6                   0x196  #define ARIZONA_FLL2_LOOP_FILTER_TEST_1          0x197  #define ARIZONA_FLL2_NCO_TEST_0                  0x198 +#define ARIZONA_FLL2_CONTROL_7                   0x199  #define ARIZONA_FLL2_SYNCHRONISER_1              0x1A1  #define ARIZONA_FLL2_SYNCHRONISER_2              0x1A2  #define ARIZONA_FLL2_SYNCHRONISER_3              0x1A3  #define ARIZONA_FLL2_SYNCHRONISER_4              0x1A4  #define ARIZONA_FLL2_SYNCHRONISER_5              0x1A5  #define ARIZONA_FLL2_SYNCHRONISER_6              0x1A6 +#define ARIZONA_FLL2_SYNCHRONISER_7              0x1A7  #define ARIZONA_FLL2_SPREAD_SPECTRUM             0x1A9  #define ARIZONA_FLL2_GPIO_CLOCK                  0x1AA  #define ARIZONA_MIC_CHARGE_PUMP_1                0x200 @@ -124,6 +128,10 @@  #define ARIZONA_MIC_DETECT_1                     0x2A3  #define ARIZONA_MIC_DETECT_2                     0x2A4  #define ARIZONA_MIC_DETECT_3                     0x2A5 +#define ARIZONA_MIC_DETECT_LEVEL_1		 0x2A6 +#define ARIZONA_MIC_DETECT_LEVEL_2		 0x2A7 +#define ARIZONA_MIC_DETECT_LEVEL_3		 0x2A8 +#define ARIZONA_MIC_DETECT_LEVEL_4		 0x2A9  #define ARIZONA_MIC_NOISE_MIX_CONTROL_1          0x2C3  #define ARIZONA_ISOLATION_CONTROL                0x2CB  #define ARIZONA_JACK_DETECT_ANALOGUE             0x2D3 @@ -213,6 +221,8 @@  #define ARIZONA_PDM_SPK1_CTRL_2                  0x491  #define ARIZONA_PDM_SPK2_CTRL_1                  0x492  #define ARIZONA_PDM_SPK2_CTRL_2                  0x493 +#define ARIZONA_SPK_CTRL_2                       0x4B5 +#define ARIZONA_SPK_CTRL_3                       0x4B6  #define ARIZONA_DAC_COMP_1                       0x4DC  #define ARIZONA_DAC_COMP_2                       0x4DD  #define ARIZONA_DAC_COMP_3                       0x4DE @@ -1678,6 +1688,13 @@  #define ARIZONA_FLL1_FRC_INTEG_VAL_WIDTH             12  /* FLL1_FRC_INTEG_VAL - [11:0] */  /* + * R377 (0x179) - FLL1 Control 7 + */ +#define ARIZONA_FLL1_GAIN_MASK                   0x003c  /* FLL1_GAIN */ +#define ARIZONA_FLL1_GAIN_SHIFT                       2  /* FLL1_GAIN */ +#define ARIZONA_FLL1_GAIN_WIDTH                       4  /* FLL1_GAIN */ + +/*   * R385 (0x181) - FLL1 Synchroniser 1   */  #define ARIZONA_FLL1_SYNC_ENA                    0x0001  /* FLL1_SYNC_ENA */ @@ -1724,6 +1741,17 @@  #define ARIZONA_FLL1_CLK_SYNC_SRC_WIDTH               4  /* FLL1_CLK_SYNC_SRC - [3:0] */  /* + * R391 (0x187) - FLL1 Synchroniser 7 + */ +#define ARIZONA_FLL1_SYNC_GAIN_MASK              0x003c  /* FLL1_SYNC_GAIN */ +#define ARIZONA_FLL1_SYNC_GAIN_SHIFT                  2  /* FLL1_SYNC_GAIN */ +#define ARIZONA_FLL1_SYNC_GAIN_WIDTH                  4  /* FLL1_SYNC_GAIN */ +#define ARIZONA_FLL1_SYNC_BW                     0x0001  /* FLL1_SYNC_BW */ +#define ARIZONA_FLL1_SYNC_BW_MASK                0x0001  /* FLL1_SYNC_BW */ +#define ARIZONA_FLL1_SYNC_BW_SHIFT                    0  /* FLL1_SYNC_BW */ +#define ARIZONA_FLL1_SYNC_BW_WIDTH                    1  /* FLL1_SYNC_BW */ + +/*   * R393 (0x189) - FLL1 Spread Spectrum   */  #define ARIZONA_FLL1_SS_AMPL_MASK                0x0030  /* FLL1_SS_AMPL - [5:4] */ @@ -1816,6 +1844,13 @@  #define ARIZONA_FLL2_FRC_INTEG_VAL_WIDTH             12  /* FLL2_FRC_INTEG_VAL - [11:0] */  /* + * R409 (0x199) - FLL2 Control 7 + */ +#define ARIZONA_FLL2_GAIN_MASK                   0x003c  /* FLL2_GAIN */ +#define ARIZONA_FLL2_GAIN_SHIFT                       2  /* FLL2_GAIN */ +#define ARIZONA_FLL2_GAIN_WIDTH                       4  /* FLL2_GAIN */ + +/*   * R417 (0x1A1) - FLL2 Synchroniser 1   */  #define ARIZONA_FLL2_SYNC_ENA                    0x0001  /* FLL2_SYNC_ENA */ @@ -1862,6 +1897,17 @@  #define ARIZONA_FLL2_CLK_SYNC_SRC_WIDTH               4  /* FLL2_CLK_SYNC_SRC - [3:0] */  /* + * R423 (0x1A7) - FLL2 Synchroniser 7 + */ +#define ARIZONA_FLL2_SYNC_GAIN_MASK              0x003c  /* FLL2_SYNC_GAIN */ +#define ARIZONA_FLL2_SYNC_GAIN_SHIFT                  2  /* FLL2_SYNC_GAIN */ +#define ARIZONA_FLL2_SYNC_GAIN_WIDTH                  4  /* FLL2_SYNC_GAIN */ +#define ARIZONA_FLL2_SYNC_BW_MASK                0x0001  /* FLL2_SYNC_BW */ +#define ARIZONA_FLL2_SYNC_BW_MASK                0x0001  /* FLL2_SYNC_BW */ +#define ARIZONA_FLL2_SYNC_BW_SHIFT                    0  /* FLL2_SYNC_BW */ +#define ARIZONA_FLL2_SYNC_BW_WIDTH                    1  /* FLL2_SYNC_BW */ + +/*   * R425 (0x1A9) - FLL2 Spread Spectrum   */  #define ARIZONA_FLL2_SS_AMPL_MASK                0x0030  /* FLL2_SS_AMPL - [5:4] */ diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index 77a46ae2fc1..0bd69446bb0 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h @@ -489,7 +489,7 @@ struct prcmu_auto_pm_config {  #ifdef CONFIG_MFD_DB8500_PRCMU -void db8500_prcmu_early_init(void); +void db8500_prcmu_early_init(u32 phy_base, u32 size);  int prcmu_set_rc_a2p(enum romcode_write);  enum romcode_read prcmu_get_rc_p2a(void);  enum ap_pwrst prcmu_get_xp70_current_state(void); @@ -522,12 +522,6 @@ int db8500_prcmu_load_a9wdog(u8 id, u32 val);  void db8500_prcmu_system_reset(u16 reset_code);  int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll);  u8 db8500_prcmu_get_power_state_result(void); -int db8500_prcmu_gic_decouple(void); -int db8500_prcmu_gic_recouple(void); -int db8500_prcmu_copy_gic_settings(void); -bool db8500_prcmu_gic_pending_irq(void); -bool db8500_prcmu_pending_irq(void); -bool db8500_prcmu_is_cpu_in_wfi(int cpu);  void db8500_prcmu_enable_wakeups(u32 wakeups);  int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state);  int db8500_prcmu_request_clock(u8 clock, bool enable); @@ -553,7 +547,7 @@ void db8500_prcmu_write_masked(unsigned int reg, u32 mask, u32 value);  #else /* !CONFIG_MFD_DB8500_PRCMU */ -static inline void db8500_prcmu_early_init(void) {} +static inline void db8500_prcmu_early_init(u32 phy_base, u32 size) {}  static inline int prcmu_set_rc_a2p(enum romcode_write code)  { diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 3abcca91eec..689e6a0d9c9 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -237,6 +237,8 @@ struct prcmu_pdata  	bool enable_set_ddr_opp;  	bool enable_ape_opp_100_voltage;  	struct ab8500_platform_data *ab_platdata; +	int ab_irq; +	int irq_base;  	u32 version_offset;  	u32 legacy_offset;  	u32 adt_offset; @@ -276,9 +278,9 @@ struct prcmu_fw_version {  #if defined(CONFIG_UX500_SOC_DB8500) -static inline void __init prcmu_early_init(void) +static inline void prcmu_early_init(u32 phy_base, u32 size)  { -	return db8500_prcmu_early_init(); +	return db8500_prcmu_early_init(phy_base, size);  }  static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk, @@ -293,36 +295,6 @@ static inline u8 prcmu_get_power_state_result(void)  	return db8500_prcmu_get_power_state_result();  } -static inline int prcmu_gic_decouple(void) -{ -	return db8500_prcmu_gic_decouple(); -} - -static inline int prcmu_gic_recouple(void) -{ -	return db8500_prcmu_gic_recouple(); -} - -static inline bool prcmu_gic_pending_irq(void) -{ -	return db8500_prcmu_gic_pending_irq(); -} - -static inline bool prcmu_is_cpu_in_wfi(int cpu) -{ -	return db8500_prcmu_is_cpu_in_wfi(cpu); -} - -static inline int prcmu_copy_gic_settings(void) -{ -	return db8500_prcmu_copy_gic_settings(); -} - -static inline bool prcmu_pending_irq(void) -{ -	return db8500_prcmu_pending_irq(); -} -  static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)  {  	return db8500_prcmu_set_epod(epod_id, epod_state); @@ -500,7 +472,7 @@ static inline int prcmu_config_a9wdog(u8 num, bool sleep_auto_off)  }  #else -static inline void __init prcmu_early_init(void) {} +static inline void prcmu_early_init(u32 phy_base, u32 size) {}  static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk,  	bool keep_ap_pll) diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h index 5b18ecde69b..1aa4f13cdfa 100644 --- a/include/linux/mfd/max77693-private.h +++ b/include/linux/mfd/max77693-private.h @@ -106,6 +106,29 @@ enum max77693_muic_reg {  	MAX77693_MUIC_REG_END,  }; +/* MAX77693 INTMASK1~2 Register */ +#define INTMASK1_ADC1K_SHIFT		3 +#define INTMASK1_ADCERR_SHIFT		2 +#define INTMASK1_ADCLOW_SHIFT		1 +#define INTMASK1_ADC_SHIFT		0 +#define INTMASK1_ADC1K_MASK		(1 << INTMASK1_ADC1K_SHIFT) +#define INTMASK1_ADCERR_MASK		(1 << INTMASK1_ADCERR_SHIFT) +#define INTMASK1_ADCLOW_MASK		(1 << INTMASK1_ADCLOW_SHIFT) +#define INTMASK1_ADC_MASK		(1 << INTMASK1_ADC_SHIFT) + +#define INTMASK2_VIDRM_SHIFT		5 +#define INTMASK2_VBVOLT_SHIFT		4 +#define INTMASK2_DXOVP_SHIFT		3 +#define INTMASK2_DCDTMR_SHIFT		2 +#define INTMASK2_CHGDETRUN_SHIFT	1 +#define INTMASK2_CHGTYP_SHIFT		0 +#define INTMASK2_VIDRM_MASK		(1 << INTMASK2_VIDRM_SHIFT) +#define INTMASK2_VBVOLT_MASK		(1 << INTMASK2_VBVOLT_SHIFT) +#define INTMASK2_DXOVP_MASK		(1 << INTMASK2_DXOVP_SHIFT) +#define INTMASK2_DCDTMR_MASK		(1 << INTMASK2_DCDTMR_SHIFT) +#define INTMASK2_CHGDETRUN_MASK		(1 << INTMASK2_CHGDETRUN_SHIFT) +#define INTMASK2_CHGTYP_MASK		(1 << INTMASK2_CHGTYP_SHIFT) +  /* MAX77693 MUIC - STATUS1~3 Register */  #define STATUS1_ADC_SHIFT		(0)  #define STATUS1_ADCLOW_SHIFT		(5) diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h index 3bbda22721e..ecddc5173c7 100644 --- a/include/linux/mfd/palmas.h +++ b/include/linux/mfd/palmas.h @@ -109,19 +109,6 @@ struct palmas_reg_init {  	 */  	int mode_sleep; -	/* tstep is the timestep loaded to the TSTEP register -	 * -	 * For SMPS -	 * -	 * 0: Jump (no slope control) -	 * 1: 10mV/us -	 * 2: 5mV/us -	 * 3: 2.5mV/us -	 * -	 * For LDO unused -	 */ -	int tstep; -  	/* voltage_sel is the bitfield loaded onto the SMPSX_VOLTAGE  	 * register. Set this is the default voltage set in OTP needs  	 * to be overridden. @@ -154,6 +141,12 @@ enum palmas_regulators {  	PALMAS_REG_LDO9,  	PALMAS_REG_LDOLN,  	PALMAS_REG_LDOUSB, +	/* External regulators */ +	PALMAS_REG_REGEN1, +	PALMAS_REG_REGEN2, +	PALMAS_REG_REGEN3, +	PALMAS_REG_SYSEN1, +	PALMAS_REG_SYSEN2,  	/* Total number of regulators */  	PALMAS_NUM_REGS,  }; @@ -171,6 +164,9 @@ struct palmas_pmic_platform_data {  	/* use LDO6 for vibrator control */  	int ldo6_vibrator; + +	/* Enable tracking mode of LDO8 */ +	bool enable_ldo8_tracking;  };  struct palmas_usb_platform_data { @@ -331,6 +327,8 @@ struct palmas_pmic {  	int smps457;  	int range[PALMAS_REG_SMPS10]; +	unsigned int ramp_delay[PALMAS_REG_SMPS10]; +	unsigned int current_reg_mode[PALMAS_REG_SMPS10];  };  struct palmas_resource { diff --git a/include/linux/mfd/tps65090.h b/include/linux/mfd/tps65090.h index 6694cf43e8b..998628a2b08 100644 --- a/include/linux/mfd/tps65090.h +++ b/include/linux/mfd/tps65090.h @@ -86,6 +86,11 @@ struct tps65090_regulator_plat_data {  struct tps65090_platform_data {  	int irq_base; + +	char **supplied_to; +	size_t num_supplicants; +	int enable_low_current_chrg; +  	struct tps65090_regulator_plat_data *reg_pdata[TPS65090_REGULATOR_MAX];  }; diff --git a/include/linux/mfd/tps65217.h b/include/linux/mfd/tps65217.h index 290762f9393..29eab2bd3df 100644 --- a/include/linux/mfd/tps65217.h +++ b/include/linux/mfd/tps65217.h @@ -228,6 +228,7 @@ enum tps65217_bl_fdim {  struct tps65217_bl_pdata {  	enum tps65217_bl_isel isel;  	enum tps65217_bl_fdim fdim; +	int dft_brightness;  };  /** diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index 8e21a094836..68e77659488 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h @@ -17,6 +17,7 @@  #define WM8994_NUM_LDO   2  #define WM8994_NUM_GPIO 11 +#define WM8994_NUM_AIF   3  struct wm8994_ldo_pdata {  	/** GPIOs to enable regulator, 0 or less if not available */ @@ -215,6 +216,13 @@ struct wm8994_pdata {  	 * system.  	 */  	bool spkmode_pu; + +	/** +	 * Maximum number of channels clocks will be generated for, +	 * useful for systems where and I2S bus with multiple data +	 * lines is mastered. +	 */ +	int max_channels_clocked[WM8994_NUM_AIF];  };  #endif diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h index 9dbb41a4e25..8752dbbc613 100644 --- a/include/linux/micrel_phy.h +++ b/include/linux/micrel_phy.h @@ -19,6 +19,7 @@  #define PHY_ID_KSZ9021		0x00221610  #define PHY_ID_KS8737		0x00221720  #define PHY_ID_KSZ8021		0x00221555 +#define PHY_ID_KSZ8031		0x00221556  #define PHY_ID_KSZ8041		0x00221510  #define PHY_ID_KSZ8051		0x00221550  /* same id: ks8001 Rev. A/B, and ks8721 Rev 3. */ diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index 26069518625..adf6e0648f2 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h @@ -34,6 +34,7 @@  #define MLX4_CMD_H  #include <linux/dma-mapping.h> +#include <linux/if_link.h>  enum {  	/* initialization and general commands */ @@ -232,6 +233,11 @@ struct mlx4_cmd_mailbox *mlx4_alloc_cmd_mailbox(struct mlx4_dev *dev);  void mlx4_free_cmd_mailbox(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox);  u32 mlx4_comm_get_version(void); +int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac); +int mlx4_set_vf_vlan(struct mlx4_dev *dev, int port, int vf, u16 vlan, u8 qos); +int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting); +int mlx4_get_vf_config(struct mlx4_dev *dev, int port, int vf, struct ifla_vf_info *ivf); +  #define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8) diff --git a/include/linux/mlx4/cq.h b/include/linux/mlx4/cq.h index 6f65b2c8bb8..98fa492cf40 100644 --- a/include/linux/mlx4/cq.h +++ b/include/linux/mlx4/cq.h @@ -64,6 +64,22 @@ struct mlx4_err_cqe {  	u8			owner_sr_opcode;  }; +struct mlx4_ts_cqe { +	__be32			vlan_my_qpn; +	__be32			immed_rss_invalid; +	__be32			g_mlpath_rqpn; +	__be32			timestamp_hi; +	__be16			status; +	u8			ipv6_ext_mask; +	u8			badfcs_enc; +	__be32			byte_cnt; +	__be16			wqe_index; +	__be16			checksum; +	u8			reserved; +	__be16			timestamp_lo; +	u8			owner_sr_opcode; +} __packed; +  enum {  	MLX4_CQE_VLAN_PRESENT_MASK	= 1 << 29,  	MLX4_CQE_QPN_MASK		= 0xffffff, diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 811f91cf5e8..53acaf64189 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -40,6 +40,8 @@  #include <linux/atomic.h> +#include <linux/clocksource.h> +  #define MAX_MSIX_P_PORT		17  #define MAX_MSIX		64  #define MSIX_LEGACY_SZ		4 @@ -140,6 +142,7 @@ enum {  	MLX4_DEV_CAP_FLAG_VEP_UC_STEER	= 1LL << 41,  	MLX4_DEV_CAP_FLAG_VEP_MC_STEER	= 1LL << 42,  	MLX4_DEV_CAP_FLAG_COUNTERS	= 1LL << 48, +	MLX4_DEV_CAP_FLAG_SET_ETH_SCHED = 1LL << 53,  	MLX4_DEV_CAP_FLAG_SENSE_SUPPORT	= 1LL << 55,  	MLX4_DEV_CAP_FLAG_PORT_MNG_CHG_EV = 1LL << 59,  	MLX4_DEV_CAP_FLAG_64B_EQE	= 1LL << 61, @@ -151,7 +154,10 @@ enum {  	MLX4_DEV_CAP_FLAG2_RSS_TOP		= 1LL <<  1,  	MLX4_DEV_CAP_FLAG2_RSS_XOR		= 1LL <<  2,  	MLX4_DEV_CAP_FLAG2_FS_EN		= 1LL <<  3, -	MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN	= 1LL <<  4 +	MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN	= 1LL <<  4, +	MLX4_DEV_CAP_FLAG2_TS			= 1LL <<  5, +	MLX4_DEV_CAP_FLAG2_VLAN_CONTROL		= 1LL <<  6, +	MLX4_DEV_CAP_FLAG2_FSM			= 1LL <<  7  };  enum { @@ -443,6 +449,7 @@ struct mlx4_caps {  	u8			eqe_factor;  	u32			userspace_caps; /* userspace must be aware of these */  	u32			function_caps;  /* VFs must be aware of these */ +	u16			hca_core_clock;  };  struct mlx4_buf_list { @@ -837,7 +844,7 @@ void mlx4_free_hwq_res(struct mlx4_dev *mdev, struct mlx4_hwq_resources *wqres,  int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,  		  struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq, -		  unsigned vector, int collapsed); +		  unsigned vector, int collapsed, int timestamp_en);  void mlx4_cq_free(struct mlx4_dev *dev, struct mlx4_cq *cq);  int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, int *base); @@ -1028,4 +1035,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, u8 port, int  void mlx4_put_slave_node_guid(struct mlx4_dev *dev, int slave, __be64 guid);  __be64 mlx4_get_slave_node_guid(struct mlx4_dev *dev, int slave); +cycle_t mlx4_read_clock(struct mlx4_dev *dev); +  #endif /* MLX4_DEVICE_H */ diff --git a/include/linux/mm.h b/include/linux/mm.h index 7acc9dc73c9..1a7f19e7f1a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -44,6 +44,9 @@ extern int sysctl_legacy_va_layout;  #include <asm/pgtable.h>  #include <asm/processor.h> +extern unsigned long sysctl_user_reserve_kbytes; +extern unsigned long sysctl_admin_reserve_kbytes; +  #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))  /* to align the pointer to the (next) page boundary */ @@ -87,7 +90,6 @@ extern unsigned int kobjsize(const void *objp);  #define VM_PFNMAP	0x00000400	/* Page-ranges managed without "struct page", just pure PFN */  #define VM_DENYWRITE	0x00000800	/* ETXTBSY on write attempts.. */ -#define VM_POPULATE     0x00001000  #define VM_LOCKED	0x00002000  #define VM_IO           0x00004000	/* Memory mapped I/O or similar */ @@ -900,7 +902,8 @@ extern void pagefault_out_of_memory(void);   * Flags passed to show_mem() and show_free_areas() to suppress output in   * various contexts.   */ -#define SHOW_MEM_FILTER_NODES	(0x0001u)	/* filter disallowed nodes */ +#define SHOW_MEM_FILTER_NODES		(0x0001u)	/* disallowed nodes */ +#define SHOW_MEM_FILTER_PAGE_COUNT	(0x0002u)	/* page type count */  extern void show_free_areas(unsigned int flags);  extern bool skip_free_areas_node(unsigned int flags, int nid); @@ -1079,9 +1082,6 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma,  		unsigned long old_addr, struct vm_area_struct *new_vma,  		unsigned long new_addr, unsigned long len,  		bool need_rmap_locks); -extern unsigned long do_mremap(unsigned long addr, -			       unsigned long old_len, unsigned long new_len, -			       unsigned long flags, unsigned long new_addr);  extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,  			      unsigned long end, pgprot_t newprot,  			      int dirty_accountable, int prot_numa); @@ -1295,6 +1295,61 @@ extern void free_area_init_node(int nid, unsigned long * zones_size,  		unsigned long zone_start_pfn, unsigned long *zholes_size);  extern void free_initmem(void); +/* + * Free reserved pages within range [PAGE_ALIGN(start), end & PAGE_MASK) + * into the buddy system. The freed pages will be poisoned with pattern + * "poison" if it's non-zero. + * Return pages freed into the buddy system. + */ +extern unsigned long free_reserved_area(unsigned long start, unsigned long end, +					int poison, char *s); +#ifdef	CONFIG_HIGHMEM +/* + * Free a highmem page into the buddy system, adjusting totalhigh_pages + * and totalram_pages. + */ +extern void free_highmem_page(struct page *page); +#endif + +static inline void adjust_managed_page_count(struct page *page, long count) +{ +	totalram_pages += count; +} + +/* Free the reserved page into the buddy system, so it gets managed. */ +static inline void __free_reserved_page(struct page *page) +{ +	ClearPageReserved(page); +	init_page_count(page); +	__free_page(page); +} + +static inline void free_reserved_page(struct page *page) +{ +	__free_reserved_page(page); +	adjust_managed_page_count(page, 1); +} + +static inline void mark_page_reserved(struct page *page) +{ +	SetPageReserved(page); +	adjust_managed_page_count(page, -1); +} + +/* + * Default method to free all the __init memory into the buddy system. + * The freed pages will be poisoned with pattern "poison" if it is + * non-zero. Return pages freed into the buddy system. + */ +static inline unsigned long free_initmem_default(int poison) +{ +	extern char __init_begin[], __init_end[]; + +	return free_reserved_area(PAGE_ALIGN((unsigned long)&__init_begin) , +				  ((unsigned long)&__init_end) & PAGE_MASK, +				  poison, "unused kernel"); +} +  #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP  /*   * With CONFIG_HAVE_MEMBLOCK_NODE_MAP set, an architecture may initialise its @@ -1612,6 +1667,8 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,  			unsigned long pfn);  int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,  			unsigned long pfn); +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len); +  struct page *follow_page_mask(struct vm_area_struct *vma,  			      unsigned long address, unsigned int foll_flags, @@ -1674,8 +1731,12 @@ int in_gate_area_no_mm(unsigned long addr);  #define in_gate_area(mm, addr) ({(void)mm; in_gate_area_no_mm(addr);})  #endif	/* __HAVE_ARCH_GATE_AREA */ +#ifdef CONFIG_SYSCTL +extern int sysctl_drop_caches;  int drop_caches_sysctl_handler(struct ctl_table *, int,  					void __user *, size_t *, loff_t *); +#endif +  unsigned long shrink_slab(struct shrink_control *shrink,  			  unsigned long nr_pages_scanned,  			  unsigned long lru_pages); @@ -1703,12 +1764,12 @@ pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);  void *vmemmap_alloc_block(unsigned long size, int node);  void *vmemmap_alloc_block_buf(unsigned long size, int node);  void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); -int vmemmap_populate_basepages(struct page *start_page, -						unsigned long pages, int node); -int vmemmap_populate(struct page *start_page, unsigned long pages, int node); +int vmemmap_populate_basepages(unsigned long start, unsigned long end, +			       int node); +int vmemmap_populate(unsigned long start, unsigned long end, int node);  void vmemmap_populate_print_last(void);  #ifdef CONFIG_MEMORY_HOTPLUG -void vmemmap_free(struct page *memmap, unsigned long nr_pages); +void vmemmap_free(unsigned long start, unsigned long end);  #endif  void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,  				  unsigned long size); @@ -1755,5 +1816,11 @@ static inline unsigned int debug_guardpage_minorder(void) { return 0; }  static inline bool page_is_guard(struct page *page) { return false; }  #endif /* CONFIG_DEBUG_PAGEALLOC */ +#if MAX_NUMNODES > 1 +void __init setup_nr_node_ids(void); +#else +static inline void setup_nr_node_ids(void) {} +#endif +  #endif /* __KERNEL__ */  #endif /* _LINUX_MM_H */ diff --git a/include/linux/mman.h b/include/linux/mman.h index 61c7a87e5d2..9aa863da287 100644 --- a/include/linux/mman.h +++ b/include/linux/mman.h @@ -79,8 +79,6 @@ calc_vm_flag_bits(unsigned long flags)  {  	return _calc_vm_trans(flags, MAP_GROWSDOWN,  VM_GROWSDOWN ) |  	       _calc_vm_trans(flags, MAP_DENYWRITE,  VM_DENYWRITE ) | -	       ((flags & MAP_LOCKED) ? (VM_LOCKED | VM_POPULATE) : 0) | -	       (((flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE) ? -							VM_POPULATE : 0); +	       _calc_vm_trans(flags, MAP_LOCKED,     VM_LOCKED    );  }  #endif /* _LINUX_MMAN_H */ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index ede274957e0..5c76737d836 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -450,7 +450,7 @@ struct zone {  	 *  	 * present_pages is physical pages existing within the zone, which  	 * is calculated as: -	 *	present_pages = spanned_pages - absent_pages(pags in holes); +	 *	present_pages = spanned_pages - absent_pages(pages in holes);  	 *  	 * managed_pages is present pages managed by the buddy system, which  	 * is calculated as (reserved_pages includes pages allocated by the @@ -527,7 +527,7 @@ static inline int zone_is_oom_locked(const struct zone *zone)  	return test_bit(ZONE_OOM_LOCKED, &zone->flags);  } -static inline unsigned zone_end_pfn(const struct zone *zone) +static inline unsigned long zone_end_pfn(const struct zone *zone)  {  	return zone->zone_start_pfn + zone->spanned_pages;  } diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 779cf7c4a3d..b508016fb76 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -9,6 +9,7 @@  #ifdef __KERNEL__  #include <linux/types.h> +#include <linux/uuid.h>  typedef unsigned long kernel_ulong_t;  #endif @@ -568,4 +569,12 @@ struct ipack_device_id {  	__u32 device;			/* Device ID or IPACK_ANY_ID */  }; +#define MEI_CL_MODULE_PREFIX "mei:" +#define MEI_CL_NAME_SIZE 32 + +struct mei_cl_device_id { +	char name[MEI_CL_NAME_SIZE]; +	kernel_ulong_t driver_info; +}; +  #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/mount.h b/include/linux/mount.h index d7029f4a191..73005f9957e 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -47,6 +47,8 @@ struct mnt_namespace;  #define MNT_INTERNAL	0x4000 +#define MNT_LOCK_READONLY	0x400000 +  struct vfsmount {  	struct dentry *mnt_root;	/* root of the mounted tree */  	struct super_block *mnt_sb;	/* pointer to superblock */ diff --git a/include/linux/msi.h b/include/linux/msi.h index ce93a341337..20c2d6dd5d2 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -13,14 +13,14 @@ struct msi_msg {  /* Helper functions */  struct irq_data;  struct msi_desc; -extern void mask_msi_irq(struct irq_data *data); -extern void unmask_msi_irq(struct irq_data *data); -extern void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); -extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); -extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); +void mask_msi_irq(struct irq_data *data); +void unmask_msi_irq(struct irq_data *data); +void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void read_msi_msg(unsigned int irq, struct msi_msg *msg); +void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); +void write_msi_msg(unsigned int irq, struct msi_msg *msg);  struct msi_desc {  	struct { @@ -54,9 +54,8 @@ struct msi_desc {   */  int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);  void arch_teardown_msi_irq(unsigned int irq); -extern int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); -extern void arch_teardown_msi_irqs(struct pci_dev *dev); -extern int arch_msi_check_device(struct pci_dev* dev, int nvec, int type); - +int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); +void arch_teardown_msi_irqs(struct pci_dev *dev); +int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);  #endif /* LINUX_MSI_H */ diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 7ccb3c59ed6..ef52d9c9145 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -187,6 +187,13 @@ typedef enum {   * This happens with the Renesas AG-AND chips, possibly others.   */  #define BBT_AUTO_REFRESH	0x00000080 +/* + * Chip requires ready check on read (for auto-incremented sequential read). + * True only for small page devices; large page devices do not support + * autoincrement. + */ +#define NAND_NEED_READRDY	0x00000100 +  /* Chip does not allow subpage writes */  #define NAND_NO_SUBPAGE_WRITE	0x00000200 diff --git a/include/linux/mutex.h b/include/linux/mutex.h index 9121595a8eb..433da8a1a42 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -53,6 +53,9 @@ struct mutex {  #if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP)  	struct task_struct	*owner;  #endif +#ifdef CONFIG_MUTEX_SPIN_ON_OWNER +	void			*spin_mlock;	/* Spinner MCS lock */ +#endif  #ifdef CONFIG_DEBUG_MUTEXES  	const char 		*name;  	void			*magic; diff --git a/include/linux/mv643xx_eth.h b/include/linux/mv643xx_eth.h index 49258e0ed1c..141d395bbb5 100644 --- a/include/linux/mv643xx_eth.h +++ b/include/linux/mv643xx_eth.h @@ -19,7 +19,6 @@  struct mv643xx_eth_shared_platform_data {  	struct mbus_dram_target_info	*dram; -	struct platform_device	*shared_smi;  	/*  	 * Max packet size for Tx IP/Layer 4 checksum, when set to 0, default  	 * limit of 9KiB will be used. diff --git a/include/linux/mxsfb.h b/include/linux/mxsfb.h index f14943d5531..f80af867434 100644 --- a/include/linux/mxsfb.h +++ b/include/linux/mxsfb.h @@ -24,8 +24,8 @@  #define STMLCDIF_18BIT 2 /** pixel data bus to the display is of 18 bit width */  #define STMLCDIF_24BIT 3 /** pixel data bus to the display is of 24 bit width */ -#define FB_SYNC_DATA_ENABLE_HIGH_ACT	(1 << 6) -#define FB_SYNC_DOTCLK_FAILING_ACT	(1 << 7) /* failing/negtive edge sampling */ +#define MXSFB_SYNC_DATA_ENABLE_HIGH_ACT	(1 << 6) +#define MXSFB_SYNC_DOTCLK_FAILING_ACT	(1 << 7) /* failing/negtive edge sampling */  struct mxsfb_platform_data {  	struct fb_videomode *mode_list; @@ -44,6 +44,9 @@ struct mxsfb_platform_data {  				 * allocated. If specified,fb_size must also be specified.  				 * fb_phys must be unused by Linux.  				 */ +	u32 sync;		/* sync mask, contains MXSFB specifics not +				 * carried in fb_info->var.sync +				 */  };  #endif /* __LINUX_MXSFB_H */ diff --git a/include/linux/net.h b/include/linux/net.h index aa1673160a4..99c9f0c103c 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -240,8 +240,8 @@ do {								\  #define net_dbg_ratelimited(fmt, ...)				\  	net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__) -#define net_random()		random32() -#define net_srandom(seed)	srandom32((__force u32)seed) +#define net_random()		prandom_u32() +#define net_srandom(seed)	prandom_seed((__force u32)(seed))  extern int   	     kernel_sendmsg(struct socket *sock, struct msghdr *msg,  				    struct kvec *vec, size_t num, size_t len); diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index 3dd39340430..09906b7ca47 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h @@ -22,9 +22,9 @@ enum {  	NETIF_F_IPV6_CSUM_BIT,		/* Can checksum TCP/UDP over IPV6 */  	NETIF_F_HIGHDMA_BIT,		/* Can DMA to high memory. */  	NETIF_F_FRAGLIST_BIT,		/* Scatter/gather IO. */ -	NETIF_F_HW_VLAN_TX_BIT,		/* Transmit VLAN hw acceleration */ -	NETIF_F_HW_VLAN_RX_BIT,		/* Receive VLAN hw acceleration */ -	NETIF_F_HW_VLAN_FILTER_BIT,	/* Receive filtering on VLAN */ +	NETIF_F_HW_VLAN_CTAG_TX_BIT,	/* Transmit VLAN CTAG HW acceleration */ +	NETIF_F_HW_VLAN_CTAG_RX_BIT,	/* Receive VLAN CTAG HW acceleration */ +	NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */  	NETIF_F_VLAN_CHALLENGED_BIT,	/* Device cannot handle VLAN packets */  	NETIF_F_GSO_BIT,		/* Enable software GSO. */  	NETIF_F_LLTX_BIT,		/* LockLess TX - deprecated. Please */ @@ -42,9 +42,9 @@ enum {  	NETIF_F_TSO6_BIT,		/* ... TCPv6 segmentation */  	NETIF_F_FSO_BIT,		/* ... FCoE segmentation */  	NETIF_F_GSO_GRE_BIT,		/* ... GRE with TSO */ -	/**/NETIF_F_GSO_LAST,		/* [can't be last bit, see GSO_MASK] */ -	NETIF_F_GSO_RESERVED2		/* ... free (fill GSO_MASK to 8 bits) */ -		= NETIF_F_GSO_LAST, +	NETIF_F_GSO_UDP_TUNNEL_BIT,	/* ... UDP TUNNEL with TSO */ +	/**/NETIF_F_GSO_LAST =		/* last bit, see GSO_MASK */ +		NETIF_F_GSO_UDP_TUNNEL_BIT,  	NETIF_F_FCOE_CRC_BIT,		/* FCoE CRC32 */  	NETIF_F_SCTP_CSUM_BIT,		/* SCTP checksum offload */ @@ -56,6 +56,9 @@ enum {  	NETIF_F_LOOPBACK_BIT,		/* Enable loopback */  	NETIF_F_RXFCS_BIT,		/* Append FCS to skb pkt data */  	NETIF_F_RXALL_BIT,		/* Receive errored frames too */ +	NETIF_F_HW_VLAN_STAG_TX_BIT,	/* Transmit VLAN STAG HW acceleration */ +	NETIF_F_HW_VLAN_STAG_RX_BIT,	/* Receive VLAN STAG HW acceleration */ +	NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */  	/*  	 * Add your fresh new feature above and remember to update @@ -80,9 +83,9 @@ enum {  #define NETIF_F_GSO_ROBUST	__NETIF_F(GSO_ROBUST)  #define NETIF_F_HIGHDMA		__NETIF_F(HIGHDMA)  #define NETIF_F_HW_CSUM		__NETIF_F(HW_CSUM) -#define NETIF_F_HW_VLAN_FILTER	__NETIF_F(HW_VLAN_FILTER) -#define NETIF_F_HW_VLAN_RX	__NETIF_F(HW_VLAN_RX) -#define NETIF_F_HW_VLAN_TX	__NETIF_F(HW_VLAN_TX) +#define NETIF_F_HW_VLAN_CTAG_FILTER __NETIF_F(HW_VLAN_CTAG_FILTER) +#define NETIF_F_HW_VLAN_CTAG_RX	__NETIF_F(HW_VLAN_CTAG_RX) +#define NETIF_F_HW_VLAN_CTAG_TX	__NETIF_F(HW_VLAN_CTAG_TX)  #define NETIF_F_IP_CSUM		__NETIF_F(IP_CSUM)  #define NETIF_F_IPV6_CSUM	__NETIF_F(IPV6_CSUM)  #define NETIF_F_LLTX		__NETIF_F(LLTX) @@ -102,7 +105,11 @@ enum {  #define NETIF_F_VLAN_CHALLENGED	__NETIF_F(VLAN_CHALLENGED)  #define NETIF_F_RXFCS		__NETIF_F(RXFCS)  #define NETIF_F_RXALL		__NETIF_F(RXALL) -#define NETIF_F_GRE_GSO		__NETIF_F(GSO_GRE) +#define NETIF_F_GSO_GRE		__NETIF_F(GSO_GRE) +#define NETIF_F_GSO_UDP_TUNNEL	__NETIF_F(GSO_UDP_TUNNEL) +#define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) +#define NETIF_F_HW_VLAN_STAG_RX	__NETIF_F(HW_VLAN_STAG_RX) +#define NETIF_F_HW_VLAN_STAG_TX	__NETIF_F(HW_VLAN_STAG_TX)  /* Features valid for ethtool to change */  /* = all defined minus driver/device-class-related */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b3d00fa4b31..f8898a435dc 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -144,8 +144,6 @@ static inline bool dev_xmit_complete(int rc)  # else  #  define LL_MAX_HEADER 96  # endif -#elif IS_ENABLED(CONFIG_TR) -# define LL_MAX_HEADER 48  #else  # define LL_MAX_HEADER 32  #endif @@ -210,9 +208,10 @@ struct netdev_hw_addr {  #define NETDEV_HW_ADDR_T_SLAVE		3  #define NETDEV_HW_ADDR_T_UNICAST	4  #define NETDEV_HW_ADDR_T_MULTICAST	5 -	bool			synced;  	bool			global_use; +	int			sync_cnt;  	int			refcount; +	int			synced;  	struct rcu_head		rcu_head;  }; @@ -785,13 +784,13 @@ struct netdev_fcoe_hbainfo {   *	3. Update dev->stats asynchronously and atomically, and define   *	   neither operation.   * - * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid); - *	If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) - *	this function is called when a VLAN id is registered. + * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16t vid); + *	If device support VLAN filtering this function is called when a + *	VLAN id is registered.   *   * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); - *	If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) - *	this function is called when a VLAN id is unregistered. + *	If device support VLAN filtering this function is called when a + *	VLAN id is unregistered.   *   * void (*ndo_poll_controller)(struct net_device *dev);   * @@ -895,7 +894,7 @@ struct netdev_fcoe_hbainfo {   *   * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh)   * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq, - *			     struct net_device *dev) + *			     struct net_device *dev, u32 filter_mask)   *   * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);   *	Called to change device carrier. Soft-devices (like dummy, team, etc) @@ -935,9 +934,9 @@ struct net_device_ops {  	struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);  	int			(*ndo_vlan_rx_add_vid)(struct net_device *dev, -						       unsigned short vid); +						       __be16 proto, u16 vid);  	int			(*ndo_vlan_rx_kill_vid)(struct net_device *dev, -						        unsigned short vid); +						        __be16 proto, u16 vid);  #ifdef CONFIG_NET_POLL_CONTROLLER  	void                    (*ndo_poll_controller)(struct net_device *dev);  	int			(*ndo_netpoll_setup)(struct net_device *dev, @@ -1073,6 +1072,8 @@ struct net_device {  	struct list_head	dev_list;  	struct list_head	napi_list;  	struct list_head	unreg_list; +	struct list_head	upper_dev_list; /* List of upper devices */ +  	/* currently active device features */  	netdev_features_t	features; @@ -1145,6 +1146,13 @@ struct net_device {  	spinlock_t		addr_list_lock;  	struct netdev_hw_addr_list	uc;	/* Unicast mac addresses */  	struct netdev_hw_addr_list	mc;	/* Multicast mac addresses */ +	struct netdev_hw_addr_list	dev_addrs; /* list of device +						    * hw addresses +						    */ +#ifdef CONFIG_SYSFS +	struct kset		*queues_kset; +#endif +  	bool			uc_promisc;  	unsigned int		promiscuity;  	unsigned int		allmulti; @@ -1177,21 +1185,11 @@ struct net_device {  						 * avoid dirtying this cache line.  						 */ -	struct list_head	upper_dev_list; /* List of upper devices */ -  	/* Interface address info used in eth_type_trans() */  	unsigned char		*dev_addr;	/* hw address, (before bcast  						   because most packets are  						   unicast) */ -	struct netdev_hw_addr_list	dev_addrs; /* list of device -						      hw addresses */ - -	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/ - -#ifdef CONFIG_SYSFS -	struct kset		*queues_kset; -#endif  #ifdef CONFIG_RPS  	struct netdev_rx_queue	*_rx; @@ -1202,18 +1200,14 @@ struct net_device {  	/* Number of RX queues currently active in device */  	unsigned int		real_num_rx_queues; -#ifdef CONFIG_RFS_ACCEL -	/* CPU reverse-mapping for RX completion interrupts, indexed -	 * by RX queue number.  Assigned by driver.  This must only be -	 * set if the ndo_rx_flow_steer operation is defined. */ -	struct cpu_rmap		*rx_cpu_rmap; -#endif  #endif  	rx_handler_func_t __rcu	*rx_handler;  	void __rcu		*rx_handler_data;  	struct netdev_queue __rcu *ingress_queue; +	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/ +  /*   * Cache lines mostly used on transmit path @@ -1235,6 +1229,12 @@ struct net_device {  #ifdef CONFIG_XPS  	struct xps_dev_maps __rcu *xps_maps;  #endif +#ifdef CONFIG_RFS_ACCEL +	/* CPU reverse-mapping for RX completion interrupts, indexed +	 * by RX queue number.  Assigned by driver.  This must only be +	 * set if the ndo_rx_flow_steer operation is defined. */ +	struct cpu_rmap		*rx_cpu_rmap; +#endif  	/* These may be needed for future network-power-down code. */ @@ -1475,6 +1475,11 @@ static inline void *netdev_priv(const struct net_device *dev)   */  #define SET_NETDEV_DEVTYPE(net, devtype)	((net)->dev.type = (devtype)) +/* Default NAPI poll() weight + * Device drivers are strongly advised to not use bigger value + */ +#define NAPI_POLL_WEIGHT 64 +  /**   *	netif_napi_add - initialize a napi context   *	@dev:  network device @@ -1612,6 +1617,9 @@ extern seqcount_t	devnet_rename_seq;	/* Device rename seq */  		list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)  #define for_each_netdev_continue_rcu(net, d)		\  	list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list) +#define for_each_netdev_in_bond_rcu(bond, slave)	\ +		for_each_netdev_rcu(&init_net, slave)	\ +			if (netdev_master_upper_dev_get_rcu(slave) == bond)  #define net_device_entry(lh)	list_entry(lh, struct net_device, dev_list)  static inline struct net_device *next_net_device(struct net_device *dev) @@ -1684,7 +1692,6 @@ extern int 		netdev_refcnt_read(const struct net_device *dev);  extern void		free_netdev(struct net_device *dev);  extern void		synchronize_net(void);  extern int		init_dummy_netdev(struct net_device *dev); -extern void		netdev_resync_ops(struct net_device *dev);  extern struct net_device	*dev_get_by_index(struct net *net, int ifindex);  extern struct net_device	*__dev_get_by_index(struct net *net, int ifindex); @@ -2621,6 +2628,7 @@ extern int dev_uc_add(struct net_device *dev, const unsigned char *addr);  extern int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr);  extern int dev_uc_del(struct net_device *dev, const unsigned char *addr);  extern int dev_uc_sync(struct net_device *to, struct net_device *from); +extern int dev_uc_sync_multiple(struct net_device *to, struct net_device *from);  extern void dev_uc_unsync(struct net_device *to, struct net_device *from);  extern void dev_uc_flush(struct net_device *dev);  extern void dev_uc_init(struct net_device *dev); @@ -2632,6 +2640,7 @@ extern int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr);  extern int dev_mc_del(struct net_device *dev, const unsigned char *addr);  extern int dev_mc_del_global(struct net_device *dev, const unsigned char *addr);  extern int dev_mc_sync(struct net_device *to, struct net_device *from); +extern int dev_mc_sync_multiple(struct net_device *to, struct net_device *from);  extern void dev_mc_unsync(struct net_device *to, struct net_device *from);  extern void dev_mc_flush(struct net_device *dev);  extern void dev_mc_init(struct net_device *dev); @@ -2678,6 +2687,19 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)  {  	return __skb_gso_segment(skb, features, true);  } +__be16 skb_network_protocol(struct sk_buff *skb); + +static inline bool can_checksum_protocol(netdev_features_t features, +					 __be16 protocol) +{ +	return ((features & NETIF_F_GEN_CSUM) || +		((features & NETIF_F_V4_CSUM) && +		 protocol == htons(ETH_P_IP)) || +		((features & NETIF_F_V6_CSUM) && +		 protocol == htons(ETH_P_IPV6)) || +		((features & NETIF_F_FCOE_CRC) && +		 protocol == htons(ETH_P_FCOE))); +}  #ifdef CONFIG_BUG  extern void netdev_rx_csum_fault(struct net_device *dev); @@ -2756,6 +2778,11 @@ static inline void netif_set_gso_max_size(struct net_device *dev,  	dev->gso_max_size = size;  } +static inline bool netif_is_bond_master(struct net_device *dev) +{ +	return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING; +} +  static inline bool netif_is_bond_slave(struct net_device *dev)  {  	return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING; diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index ee142846f56..0060fde3160 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -289,11 +289,6 @@ nf_nat_decode_session(struct sk_buff *skb, struct flowi *fl, u_int8_t family)  #endif  } -#ifdef CONFIG_PROC_FS -#include <linux/proc_fs.h> -extern struct proc_dir_entry *proc_net_netfilter; -#endif -  #else /* !CONFIG_NETFILTER */  #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)  #define NF_HOOK_COND(pf, hook, skb, indev, outdev, okfn, cond) (okfn)(skb) diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h index 7958e84a65a..d80e2753847 100644 --- a/include/linux/netfilter/ipset/ip_set.h +++ b/include/linux/netfilter/ipset/ip_set.h @@ -1,7 +1,7 @@  /* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>   *                         Patrick Schaaf <bof@bof.de>   *                         Martin Josefsson <gandalf@wlug.westbo.se> - * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> + * Copyright (C) 2003-2013 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -47,10 +47,36 @@ enum ip_set_feature {  	IPSET_DUMP_LAST = (1 << IPSET_DUMP_LAST_FLAG),  }; +/* Set extensions */ +enum ip_set_extension { +	IPSET_EXT_NONE = 0, +	IPSET_EXT_BIT_TIMEOUT = 1, +	IPSET_EXT_TIMEOUT = (1 << IPSET_EXT_BIT_TIMEOUT), +	IPSET_EXT_BIT_COUNTER = 2, +	IPSET_EXT_COUNTER = (1 << IPSET_EXT_BIT_COUNTER), +}; + +/* Extension offsets */ +enum ip_set_offset { +	IPSET_OFFSET_TIMEOUT = 0, +	IPSET_OFFSET_COUNTER, +	IPSET_OFFSET_MAX, +}; + +#define SET_WITH_TIMEOUT(s)	((s)->extensions & IPSET_EXT_TIMEOUT) +#define SET_WITH_COUNTER(s)	((s)->extensions & IPSET_EXT_COUNTER) + +struct ip_set_ext { +	unsigned long timeout; +	u64 packets; +	u64 bytes; +}; +  struct ip_set;  typedef int (*ipset_adtfn)(struct ip_set *set, void *value, -			   u32 timeout, u32 flags); +			   const struct ip_set_ext *ext, +			   struct ip_set_ext *mext, u32 cmdflags);  /* Kernel API function options */  struct ip_set_adt_opt { @@ -58,7 +84,7 @@ struct ip_set_adt_opt {  	u8 dim;			/* Dimension of match/target */  	u8 flags;		/* Direction and negation flags */  	u32 cmdflags;		/* Command-like flags */ -	u32 timeout;		/* Timeout value */ +	struct ip_set_ext ext;	/* Extensions */  };  /* Set type, variant-specific part */ @@ -69,7 +95,7 @@ struct ip_set_type_variant {  	 *			positive for matching element */  	int (*kadt)(struct ip_set *set, const struct sk_buff *skb,  		    const struct xt_action_param *par, -		    enum ipset_adt adt, const struct ip_set_adt_opt *opt); +		    enum ipset_adt adt, struct ip_set_adt_opt *opt);  	/* Userspace: test/add/del entries  	 *		returns negative error code, @@ -151,10 +177,76 @@ struct ip_set {  	u8 family;  	/* The type revision */  	u8 revision; +	/* Extensions */ +	u8 extensions;  	/* The type specific data */  	void *data;  }; +struct ip_set_counter { +	atomic64_t bytes; +	atomic64_t packets; +}; + +static inline void +ip_set_add_bytes(u64 bytes, struct ip_set_counter *counter) +{ +	atomic64_add((long long)bytes, &(counter)->bytes); +} + +static inline void +ip_set_add_packets(u64 packets, struct ip_set_counter *counter) +{ +	atomic64_add((long long)packets, &(counter)->packets); +} + +static inline u64 +ip_set_get_bytes(const struct ip_set_counter *counter) +{ +	return (u64)atomic64_read(&(counter)->bytes); +} + +static inline u64 +ip_set_get_packets(const struct ip_set_counter *counter) +{ +	return (u64)atomic64_read(&(counter)->packets); +} + +static inline void +ip_set_update_counter(struct ip_set_counter *counter, +		      const struct ip_set_ext *ext, +		      struct ip_set_ext *mext, u32 flags) +{ +	if (ext->packets != ULLONG_MAX && +	    !(flags & IPSET_FLAG_SKIP_COUNTER_UPDATE)) { +		ip_set_add_bytes(ext->bytes, counter); +		ip_set_add_packets(ext->packets, counter); +	} +	if (flags & IPSET_FLAG_MATCH_COUNTERS) { +		mext->packets = ip_set_get_packets(counter); +		mext->bytes = ip_set_get_bytes(counter); +	} +} + +static inline bool +ip_set_put_counter(struct sk_buff *skb, struct ip_set_counter *counter) +{ +	return nla_put_net64(skb, IPSET_ATTR_BYTES, +			     cpu_to_be64(ip_set_get_bytes(counter))) || +	       nla_put_net64(skb, IPSET_ATTR_PACKETS, +			     cpu_to_be64(ip_set_get_packets(counter))); +} + +static inline void +ip_set_init_counter(struct ip_set_counter *counter, +		    const struct ip_set_ext *ext) +{ +	if (ext->bytes != ULLONG_MAX) +		atomic64_set(&(counter)->bytes, (long long)(ext->bytes)); +	if (ext->packets != ULLONG_MAX) +		atomic64_set(&(counter)->packets, (long long)(ext->packets)); +} +  /* register and unregister set references */  extern ip_set_id_t ip_set_get_byname(const char *name, struct ip_set **set);  extern void ip_set_put_byindex(ip_set_id_t index); @@ -167,19 +259,21 @@ extern void ip_set_nfnl_put(ip_set_id_t index);  extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb,  		      const struct xt_action_param *par, -		      const struct ip_set_adt_opt *opt); +		      struct ip_set_adt_opt *opt);  extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb,  		      const struct xt_action_param *par, -		      const struct ip_set_adt_opt *opt); +		      struct ip_set_adt_opt *opt);  extern int ip_set_test(ip_set_id_t id, const struct sk_buff *skb,  		       const struct xt_action_param *par, -		       const struct ip_set_adt_opt *opt); +		       struct ip_set_adt_opt *opt);  /* Utility functions */  extern void *ip_set_alloc(size_t size);  extern void ip_set_free(void *members);  extern int ip_set_get_ipaddr4(struct nlattr *nla,  __be32 *ipaddr);  extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); +extern int ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[], +				 struct ip_set_ext *ext);  static inline int  ip_set_get_hostipaddr4(struct nlattr *nla, u32 *ipaddr) @@ -200,6 +294,14 @@ ip_set_eexist(int ret, u32 flags)  	return ret == -IPSET_ERR_EXIST && (flags & IPSET_FLAG_EXIST);  } +/* Match elements marked with nomatch */ +static inline bool +ip_set_enomatch(int ret, u32 flags, enum ipset_adt adt) +{ +	return adt == IPSET_TEST && +	       ret == -ENOTEMPTY && ((flags >> 16) & IPSET_FLAG_NOMATCH); +} +  /* Check the NLA_F_NET_BYTEORDER flag */  static inline bool  ip_set_attr_netorder(struct nlattr *tb[], int type) @@ -284,4 +386,14 @@ bitmap_bytes(u32 a, u32 b)  	return 4 * ((((b - a + 8) / 8) + 3) / 4);  } +#include <linux/netfilter/ipset/ip_set_timeout.h> + +#define IP_SET_INIT_KEXT(skb, opt, map)			\ +	{ .bytes = (skb)->len, .packets = 1,		\ +	  .timeout = ip_set_adt_opt_timeout(opt, map) } + +#define IP_SET_INIT_UEXT(map)				\ +	{ .bytes = ULLONG_MAX, .packets = ULLONG_MAX,	\ +	  .timeout = (map)->timeout } +  #endif /*_IP_SET_H */ diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h deleted file mode 100644 index 01d25e6fc79..00000000000 --- a/include/linux/netfilter/ipset/ip_set_ahash.h +++ /dev/null @@ -1,1225 +0,0 @@ -#ifndef _IP_SET_AHASH_H -#define _IP_SET_AHASH_H - -#include <linux/rcupdate.h> -#include <linux/jhash.h> -#include <linux/netfilter/ipset/ip_set_timeout.h> - -#define CONCAT(a, b, c)		a##b##c -#define TOKEN(a, b, c)		CONCAT(a, b, c) - -#define type_pf_next		TOKEN(TYPE, PF, _elem) - -/* Hashing which uses arrays to resolve clashing. The hash table is resized - * (doubled) when searching becomes too long. - * Internally jhash is used with the assumption that the size of the - * stored data is a multiple of sizeof(u32). If storage supports timeout, - * the timeout field must be the last one in the data structure - that field - * is ignored when computing the hash key. - * - * Readers and resizing - * - * Resizing can be triggered by userspace command only, and those - * are serialized by the nfnl mutex. During resizing the set is - * read-locked, so the only possible concurrent operations are - * the kernel side readers. Those must be protected by proper RCU locking. - */ - -/* Number of elements to store in an initial array block */ -#define AHASH_INIT_SIZE			4 -/* Max number of elements to store in an array block */ -#define AHASH_MAX_SIZE			(3*AHASH_INIT_SIZE) - -/* Max number of elements can be tuned */ -#ifdef IP_SET_HASH_WITH_MULTI -#define AHASH_MAX(h)			((h)->ahash_max) - -static inline u8 -tune_ahash_max(u8 curr, u32 multi) -{ -	u32 n; - -	if (multi < curr) -		return curr; - -	n = curr + AHASH_INIT_SIZE; -	/* Currently, at listing one hash bucket must fit into a message. -	 * Therefore we have a hard limit here. -	 */ -	return n > curr && n <= 64 ? n : curr; -} -#define TUNE_AHASH_MAX(h, multi)	\ -	((h)->ahash_max = tune_ahash_max((h)->ahash_max, multi)) -#else -#define AHASH_MAX(h)			AHASH_MAX_SIZE -#define TUNE_AHASH_MAX(h, multi) -#endif - -/* A hash bucket */ -struct hbucket { -	void *value;		/* the array of the values */ -	u8 size;		/* size of the array */ -	u8 pos;			/* position of the first free entry */ -}; - -/* The hash table: the table size stored here in order to make resizing easy */ -struct htable { -	u8 htable_bits;		/* size of hash table == 2^htable_bits */ -	struct hbucket bucket[0]; /* hashtable buckets */ -}; - -#define hbucket(h, i)		(&((h)->bucket[i])) - -/* Book-keeping of the prefixes added to the set */ -struct ip_set_hash_nets { -	u8 cidr;		/* the different cidr values in the set */ -	u32 nets;		/* number of elements per cidr */ -}; - -/* The generic ip_set hash structure */ -struct ip_set_hash { -	struct htable *table;	/* the hash table */ -	u32 maxelem;		/* max elements in the hash */ -	u32 elements;		/* current element (vs timeout) */ -	u32 initval;		/* random jhash init value */ -	u32 timeout;		/* timeout value, if enabled */ -	struct timer_list gc;	/* garbage collection when timeout enabled */ -	struct type_pf_next next; /* temporary storage for uadd */ -#ifdef IP_SET_HASH_WITH_MULTI -	u8 ahash_max;		/* max elements in an array block */ -#endif -#ifdef IP_SET_HASH_WITH_NETMASK -	u8 netmask;		/* netmask value for subnets to store */ -#endif -#ifdef IP_SET_HASH_WITH_RBTREE -	struct rb_root rbtree; -#endif -#ifdef IP_SET_HASH_WITH_NETS -	struct ip_set_hash_nets nets[0]; /* book-keeping of prefixes */ -#endif -}; - -static size_t -htable_size(u8 hbits) -{ -	size_t hsize; - -	/* We must fit both into u32 in jhash and size_t */ -	if (hbits > 31) -		return 0; -	hsize = jhash_size(hbits); -	if ((((size_t)-1) - sizeof(struct htable))/sizeof(struct hbucket) -	    < hsize) -		return 0; - -	return hsize * sizeof(struct hbucket) + sizeof(struct htable); -} - -/* Compute htable_bits from the user input parameter hashsize */ -static u8 -htable_bits(u32 hashsize) -{ -	/* Assume that hashsize == 2^htable_bits */ -	u8 bits = fls(hashsize - 1); -	if (jhash_size(bits) != hashsize) -		/* Round up to the first 2^n value */ -		bits = fls(hashsize); - -	return bits; -} - -#ifdef IP_SET_HASH_WITH_NETS -#ifdef IP_SET_HASH_WITH_NETS_PACKED -/* When cidr is packed with nomatch, cidr - 1 is stored in the entry */ -#define CIDR(cidr)	(cidr + 1) -#else -#define CIDR(cidr)	(cidr) -#endif - -#define SET_HOST_MASK(family)	(family == AF_INET ? 32 : 128) -#ifdef IP_SET_HASH_WITH_MULTI -#define NETS_LENGTH(family)	(SET_HOST_MASK(family) + 1) -#else -#define NETS_LENGTH(family)	SET_HOST_MASK(family) -#endif - -/* Network cidr size book keeping when the hash stores different - * sized networks */ -static void -add_cidr(struct ip_set_hash *h, u8 cidr, u8 nets_length) -{ -	int i, j; - -	/* Add in increasing prefix order, so larger cidr first */ -	for (i = 0, j = -1; i < nets_length && h->nets[i].nets; i++) { -		if (j != -1) -			continue; -		else if (h->nets[i].cidr < cidr) -			j = i; -		else if (h->nets[i].cidr == cidr) { -			h->nets[i].nets++; -			return; -		} -	} -	if (j != -1) { -		for (; i > j; i--) { -			h->nets[i].cidr = h->nets[i - 1].cidr; -			h->nets[i].nets = h->nets[i - 1].nets; -		} -	} -	h->nets[i].cidr = cidr; -	h->nets[i].nets = 1; -} - -static void -del_cidr(struct ip_set_hash *h, u8 cidr, u8 nets_length) -{ -	u8 i, j; - -	for (i = 0; i < nets_length - 1 && h->nets[i].cidr != cidr; i++) -		; -	h->nets[i].nets--; - -	if (h->nets[i].nets != 0) -		return; - -	for (j = i; j < nets_length - 1 && h->nets[j].nets; j++) { -		h->nets[j].cidr = h->nets[j + 1].cidr; -		h->nets[j].nets = h->nets[j + 1].nets; -	} -} -#else -#define NETS_LENGTH(family)		0 -#endif - -/* Destroy the hashtable part of the set */ -static void -ahash_destroy(struct htable *t) -{ -	struct hbucket *n; -	u32 i; - -	for (i = 0; i < jhash_size(t->htable_bits); i++) { -		n = hbucket(t, i); -		if (n->size) -			/* FIXME: use slab cache */ -			kfree(n->value); -	} - -	ip_set_free(t); -} - -/* Calculate the actual memory size of the set data */ -static size_t -ahash_memsize(const struct ip_set_hash *h, size_t dsize, u8 nets_length) -{ -	u32 i; -	struct htable *t = h->table; -	size_t memsize = sizeof(*h) -			 + sizeof(*t) -#ifdef IP_SET_HASH_WITH_NETS -			 + sizeof(struct ip_set_hash_nets) * nets_length -#endif -			 + jhash_size(t->htable_bits) * sizeof(struct hbucket); - -	for (i = 0; i < jhash_size(t->htable_bits); i++) -			memsize += t->bucket[i].size * dsize; - -	return memsize; -} - -/* Flush a hash type of set: destroy all elements */ -static void -ip_set_hash_flush(struct ip_set *set) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	struct hbucket *n; -	u32 i; - -	for (i = 0; i < jhash_size(t->htable_bits); i++) { -		n = hbucket(t, i); -		if (n->size) { -			n->size = n->pos = 0; -			/* FIXME: use slab cache */ -			kfree(n->value); -		} -	} -#ifdef IP_SET_HASH_WITH_NETS -	memset(h->nets, 0, sizeof(struct ip_set_hash_nets) -			   * NETS_LENGTH(set->family)); -#endif -	h->elements = 0; -} - -/* Destroy a hash type of set */ -static void -ip_set_hash_destroy(struct ip_set *set) -{ -	struct ip_set_hash *h = set->data; - -	if (with_timeout(h->timeout)) -		del_timer_sync(&h->gc); - -	ahash_destroy(h->table); -#ifdef IP_SET_HASH_WITH_RBTREE -	rbtree_destroy(&h->rbtree); -#endif -	kfree(h); - -	set->data = NULL; -} - -#endif /* _IP_SET_AHASH_H */ - -#ifndef HKEY_DATALEN -#define HKEY_DATALEN	sizeof(struct type_pf_elem) -#endif - -#define HKEY(data, initval, htable_bits)			\ -(jhash2((u32 *)(data), HKEY_DATALEN/sizeof(u32), initval)	\ -	& jhash_mask(htable_bits)) - -/* Type/family dependent function prototypes */ - -#define type_pf_data_equal	TOKEN(TYPE, PF, _data_equal) -#define type_pf_data_isnull	TOKEN(TYPE, PF, _data_isnull) -#define type_pf_data_copy	TOKEN(TYPE, PF, _data_copy) -#define type_pf_data_zero_out	TOKEN(TYPE, PF, _data_zero_out) -#define type_pf_data_netmask	TOKEN(TYPE, PF, _data_netmask) -#define type_pf_data_list	TOKEN(TYPE, PF, _data_list) -#define type_pf_data_tlist	TOKEN(TYPE, PF, _data_tlist) -#define type_pf_data_next	TOKEN(TYPE, PF, _data_next) -#define type_pf_data_flags	TOKEN(TYPE, PF, _data_flags) -#ifdef IP_SET_HASH_WITH_NETS -#define type_pf_data_match	TOKEN(TYPE, PF, _data_match) -#else -#define type_pf_data_match(d)	1 -#endif - -#define type_pf_elem		TOKEN(TYPE, PF, _elem) -#define type_pf_telem		TOKEN(TYPE, PF, _telem) -#define type_pf_data_timeout	TOKEN(TYPE, PF, _data_timeout) -#define type_pf_data_expired	TOKEN(TYPE, PF, _data_expired) -#define type_pf_data_timeout_set TOKEN(TYPE, PF, _data_timeout_set) - -#define type_pf_elem_add	TOKEN(TYPE, PF, _elem_add) -#define type_pf_add		TOKEN(TYPE, PF, _add) -#define type_pf_del		TOKEN(TYPE, PF, _del) -#define type_pf_test_cidrs	TOKEN(TYPE, PF, _test_cidrs) -#define type_pf_test		TOKEN(TYPE, PF, _test) - -#define type_pf_elem_tadd	TOKEN(TYPE, PF, _elem_tadd) -#define type_pf_del_telem	TOKEN(TYPE, PF, _ahash_del_telem) -#define type_pf_expire		TOKEN(TYPE, PF, _expire) -#define type_pf_tadd		TOKEN(TYPE, PF, _tadd) -#define type_pf_tdel		TOKEN(TYPE, PF, _tdel) -#define type_pf_ttest_cidrs	TOKEN(TYPE, PF, _ahash_ttest_cidrs) -#define type_pf_ttest		TOKEN(TYPE, PF, _ahash_ttest) - -#define type_pf_resize		TOKEN(TYPE, PF, _resize) -#define type_pf_tresize		TOKEN(TYPE, PF, _tresize) -#define type_pf_flush		ip_set_hash_flush -#define type_pf_destroy		ip_set_hash_destroy -#define type_pf_head		TOKEN(TYPE, PF, _head) -#define type_pf_list		TOKEN(TYPE, PF, _list) -#define type_pf_tlist		TOKEN(TYPE, PF, _tlist) -#define type_pf_same_set	TOKEN(TYPE, PF, _same_set) -#define type_pf_kadt		TOKEN(TYPE, PF, _kadt) -#define type_pf_uadt		TOKEN(TYPE, PF, _uadt) -#define type_pf_gc		TOKEN(TYPE, PF, _gc) -#define type_pf_gc_init		TOKEN(TYPE, PF, _gc_init) -#define type_pf_variant		TOKEN(TYPE, PF, _variant) -#define type_pf_tvariant	TOKEN(TYPE, PF, _tvariant) - -/* Flavour without timeout */ - -/* Get the ith element from the array block n */ -#define ahash_data(n, i)	\ -	((struct type_pf_elem *)((n)->value) + (i)) - -/* Add an element to the hash table when resizing the set: - * we spare the maintenance of the internal counters. */ -static int -type_pf_elem_add(struct hbucket *n, const struct type_pf_elem *value, -		 u8 ahash_max, u32 cadt_flags) -{ -	struct type_pf_elem *data; - -	if (n->pos >= n->size) { -		void *tmp; - -		if (n->size >= ahash_max) -			/* Trigger rehashing */ -			return -EAGAIN; - -		tmp = kzalloc((n->size + AHASH_INIT_SIZE) -			      * sizeof(struct type_pf_elem), -			      GFP_ATOMIC); -		if (!tmp) -			return -ENOMEM; -		if (n->size) { -			memcpy(tmp, n->value, -			       sizeof(struct type_pf_elem) * n->size); -			kfree(n->value); -		} -		n->value = tmp; -		n->size += AHASH_INIT_SIZE; -	} -	data = ahash_data(n, n->pos++); -	type_pf_data_copy(data, value); -#ifdef IP_SET_HASH_WITH_NETS -	/* Resizing won't overwrite stored flags */ -	if (cadt_flags) -		type_pf_data_flags(data, cadt_flags); -#endif -	return 0; -} - -/* Resize a hash: create a new hash table with doubling the hashsize - * and inserting the elements to it. Repeat until we succeed or - * fail due to memory pressures. */ -static int -type_pf_resize(struct ip_set *set, bool retried) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t, *orig = h->table; -	u8 htable_bits = orig->htable_bits; -	const struct type_pf_elem *data; -	struct hbucket *n, *m; -	u32 i, j; -	int ret; - -retry: -	ret = 0; -	htable_bits++; -	pr_debug("attempt to resize set %s from %u to %u, t %p\n", -		 set->name, orig->htable_bits, htable_bits, orig); -	if (!htable_bits) { -		/* In case we have plenty of memory :-) */ -		pr_warning("Cannot increase the hashsize of set %s further\n", -			   set->name); -		return -IPSET_ERR_HASH_FULL; -	} -	t = ip_set_alloc(sizeof(*t) -			 + jhash_size(htable_bits) * sizeof(struct hbucket)); -	if (!t) -		return -ENOMEM; -	t->htable_bits = htable_bits; - -	read_lock_bh(&set->lock); -	for (i = 0; i < jhash_size(orig->htable_bits); i++) { -		n = hbucket(orig, i); -		for (j = 0; j < n->pos; j++) { -			data = ahash_data(n, j); -			m = hbucket(t, HKEY(data, h->initval, htable_bits)); -			ret = type_pf_elem_add(m, data, AHASH_MAX(h), 0); -			if (ret < 0) { -				read_unlock_bh(&set->lock); -				ahash_destroy(t); -				if (ret == -EAGAIN) -					goto retry; -				return ret; -			} -		} -	} - -	rcu_assign_pointer(h->table, t); -	read_unlock_bh(&set->lock); - -	/* Give time to other readers of the set */ -	synchronize_rcu_bh(); - -	pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name, -		 orig->htable_bits, orig, t->htable_bits, t); -	ahash_destroy(orig); - -	return 0; -} - -static inline void -type_pf_data_next(struct ip_set_hash *h, const struct type_pf_elem *d); - -/* Add an element to a hash and update the internal counters when succeeded, - * otherwise report the proper error code. */ -static int -type_pf_add(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t; -	const struct type_pf_elem *d = value; -	struct hbucket *n; -	int i, ret = 0; -	u32 key, multi = 0; -	u32 cadt_flags = flags >> 16; - -	if (h->elements >= h->maxelem) { -		if (net_ratelimit()) -			pr_warning("Set %s is full, maxelem %u reached\n", -				   set->name, h->maxelem); -		return -IPSET_ERR_HASH_FULL; -	} - -	rcu_read_lock_bh(); -	t = rcu_dereference_bh(h->table); -	key = HKEY(value, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) -		if (type_pf_data_equal(ahash_data(n, i), d, &multi)) { -#ifdef IP_SET_HASH_WITH_NETS -			if (flags & IPSET_FLAG_EXIST) -				/* Support overwriting just the flags */ -				type_pf_data_flags(ahash_data(n, i), -						   cadt_flags); -#endif -			ret = -IPSET_ERR_EXIST; -			goto out; -		} -	TUNE_AHASH_MAX(h, multi); -	ret = type_pf_elem_add(n, value, AHASH_MAX(h), cadt_flags); -	if (ret != 0) { -		if (ret == -EAGAIN) -			type_pf_data_next(h, d); -		goto out; -	} - -#ifdef IP_SET_HASH_WITH_NETS -	add_cidr(h, CIDR(d->cidr), NETS_LENGTH(set->family)); -#endif -	h->elements++; -out: -	rcu_read_unlock_bh(); -	return ret; -} - -/* Delete an element from the hash: swap it with the last element - * and free up space if possible. - */ -static int -type_pf_del(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	const struct type_pf_elem *d = value; -	struct hbucket *n; -	int i; -	struct type_pf_elem *data; -	u32 key, multi = 0; - -	key = HKEY(value, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) { -		data = ahash_data(n, i); -		if (!type_pf_data_equal(data, d, &multi)) -			continue; -		if (i != n->pos - 1) -			/* Not last one */ -			type_pf_data_copy(data, ahash_data(n, n->pos - 1)); - -		n->pos--; -		h->elements--; -#ifdef IP_SET_HASH_WITH_NETS -		del_cidr(h, CIDR(d->cidr), NETS_LENGTH(set->family)); -#endif -		if (n->pos + AHASH_INIT_SIZE < n->size) { -			void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) -					    * sizeof(struct type_pf_elem), -					    GFP_ATOMIC); -			if (!tmp) -				return 0; -			n->size -= AHASH_INIT_SIZE; -			memcpy(tmp, n->value, -			       n->size * sizeof(struct type_pf_elem)); -			kfree(n->value); -			n->value = tmp; -		} -		return 0; -	} - -	return -IPSET_ERR_EXIST; -} - -#ifdef IP_SET_HASH_WITH_NETS - -/* Special test function which takes into account the different network - * sizes added to the set */ -static int -type_pf_test_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	struct hbucket *n; -	const struct type_pf_elem *data; -	int i, j = 0; -	u32 key, multi = 0; -	u8 nets_length = NETS_LENGTH(set->family); - -	pr_debug("test by nets\n"); -	for (; j < nets_length && h->nets[j].nets && !multi; j++) { -		type_pf_data_netmask(d, h->nets[j].cidr); -		key = HKEY(d, h->initval, t->htable_bits); -		n = hbucket(t, key); -		for (i = 0; i < n->pos; i++) { -			data = ahash_data(n, i); -			if (type_pf_data_equal(data, d, &multi)) -				return type_pf_data_match(data); -		} -	} -	return 0; -} -#endif - -/* Test whether the element is added to the set */ -static int -type_pf_test(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	struct type_pf_elem *d = value; -	struct hbucket *n; -	const struct type_pf_elem *data; -	int i; -	u32 key, multi = 0; - -#ifdef IP_SET_HASH_WITH_NETS -	/* If we test an IP address and not a network address, -	 * try all possible network sizes */ -	if (CIDR(d->cidr) == SET_HOST_MASK(set->family)) -		return type_pf_test_cidrs(set, d, timeout); -#endif - -	key = HKEY(d, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) { -		data = ahash_data(n, i); -		if (type_pf_data_equal(data, d, &multi)) -			return type_pf_data_match(data); -	} -	return 0; -} - -/* Reply a HEADER request: fill out the header part of the set */ -static int -type_pf_head(struct ip_set *set, struct sk_buff *skb) -{ -	const struct ip_set_hash *h = set->data; -	struct nlattr *nested; -	size_t memsize; - -	read_lock_bh(&set->lock); -	memsize = ahash_memsize(h, with_timeout(h->timeout) -					? sizeof(struct type_pf_telem) -					: sizeof(struct type_pf_elem), -				NETS_LENGTH(set->family)); -	read_unlock_bh(&set->lock); - -	nested = ipset_nest_start(skb, IPSET_ATTR_DATA); -	if (!nested) -		goto nla_put_failure; -	if (nla_put_net32(skb, IPSET_ATTR_HASHSIZE, -			  htonl(jhash_size(h->table->htable_bits))) || -	    nla_put_net32(skb, IPSET_ATTR_MAXELEM, htonl(h->maxelem))) -		goto nla_put_failure; -#ifdef IP_SET_HASH_WITH_NETMASK -	if (h->netmask != HOST_MASK && -	    nla_put_u8(skb, IPSET_ATTR_NETMASK, h->netmask)) -		goto nla_put_failure; -#endif -	if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref - 1)) || -	    nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || -	    (with_timeout(h->timeout) && -	     nla_put_net32(skb, IPSET_ATTR_TIMEOUT, htonl(h->timeout)))) -		goto nla_put_failure; -	ipset_nest_end(skb, nested); - -	return 0; -nla_put_failure: -	return -EMSGSIZE; -} - -/* Reply a LIST/SAVE request: dump the elements of the specified set */ -static int -type_pf_list(const struct ip_set *set, -	     struct sk_buff *skb, struct netlink_callback *cb) -{ -	const struct ip_set_hash *h = set->data; -	const struct htable *t = h->table; -	struct nlattr *atd, *nested; -	const struct hbucket *n; -	const struct type_pf_elem *data; -	u32 first = cb->args[2]; -	/* We assume that one hash bucket fills into one page */ -	void *incomplete; -	int i; - -	atd = ipset_nest_start(skb, IPSET_ATTR_ADT); -	if (!atd) -		return -EMSGSIZE; -	pr_debug("list hash set %s\n", set->name); -	for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) { -		incomplete = skb_tail_pointer(skb); -		n = hbucket(t, cb->args[2]); -		pr_debug("cb->args[2]: %lu, t %p n %p\n", cb->args[2], t, n); -		for (i = 0; i < n->pos; i++) { -			data = ahash_data(n, i); -			pr_debug("list hash %lu hbucket %p i %u, data %p\n", -				 cb->args[2], n, i, data); -			nested = ipset_nest_start(skb, IPSET_ATTR_DATA); -			if (!nested) { -				if (cb->args[2] == first) { -					nla_nest_cancel(skb, atd); -					return -EMSGSIZE; -				} else -					goto nla_put_failure; -			} -			if (type_pf_data_list(skb, data)) -				goto nla_put_failure; -			ipset_nest_end(skb, nested); -		} -	} -	ipset_nest_end(skb, atd); -	/* Set listing finished */ -	cb->args[2] = 0; - -	return 0; - -nla_put_failure: -	nlmsg_trim(skb, incomplete); -	ipset_nest_end(skb, atd); -	if (unlikely(first == cb->args[2])) { -		pr_warning("Can't list set %s: one bucket does not fit into " -			   "a message. Please report it!\n", set->name); -		cb->args[2] = 0; -		return -EMSGSIZE; -	} -	return 0; -} - -static int -type_pf_kadt(struct ip_set *set, const struct sk_buff *skb, -	     const struct xt_action_param *par, -	     enum ipset_adt adt, const struct ip_set_adt_opt *opt); -static int -type_pf_uadt(struct ip_set *set, struct nlattr *tb[], -	     enum ipset_adt adt, u32 *lineno, u32 flags, bool retried); - -static const struct ip_set_type_variant type_pf_variant = { -	.kadt	= type_pf_kadt, -	.uadt	= type_pf_uadt, -	.adt	= { -		[IPSET_ADD] = type_pf_add, -		[IPSET_DEL] = type_pf_del, -		[IPSET_TEST] = type_pf_test, -	}, -	.destroy = type_pf_destroy, -	.flush	= type_pf_flush, -	.head	= type_pf_head, -	.list	= type_pf_list, -	.resize	= type_pf_resize, -	.same_set = type_pf_same_set, -}; - -/* Flavour with timeout support */ - -#define ahash_tdata(n, i) \ -	(struct type_pf_elem *)((struct type_pf_telem *)((n)->value) + (i)) - -static inline u32 -type_pf_data_timeout(const struct type_pf_elem *data) -{ -	const struct type_pf_telem *tdata = -		(const struct type_pf_telem *) data; - -	return tdata->timeout; -} - -static inline bool -type_pf_data_expired(const struct type_pf_elem *data) -{ -	const struct type_pf_telem *tdata = -		(const struct type_pf_telem *) data; - -	return ip_set_timeout_expired(tdata->timeout); -} - -static inline void -type_pf_data_timeout_set(struct type_pf_elem *data, u32 timeout) -{ -	struct type_pf_telem *tdata = (struct type_pf_telem *) data; - -	tdata->timeout = ip_set_timeout_set(timeout); -} - -static int -type_pf_elem_tadd(struct hbucket *n, const struct type_pf_elem *value, -		  u8 ahash_max, u32 cadt_flags, u32 timeout) -{ -	struct type_pf_elem *data; - -	if (n->pos >= n->size) { -		void *tmp; - -		if (n->size >= ahash_max) -			/* Trigger rehashing */ -			return -EAGAIN; - -		tmp = kzalloc((n->size + AHASH_INIT_SIZE) -			      * sizeof(struct type_pf_telem), -			      GFP_ATOMIC); -		if (!tmp) -			return -ENOMEM; -		if (n->size) { -			memcpy(tmp, n->value, -			       sizeof(struct type_pf_telem) * n->size); -			kfree(n->value); -		} -		n->value = tmp; -		n->size += AHASH_INIT_SIZE; -	} -	data = ahash_tdata(n, n->pos++); -	type_pf_data_copy(data, value); -	type_pf_data_timeout_set(data, timeout); -#ifdef IP_SET_HASH_WITH_NETS -	/* Resizing won't overwrite stored flags */ -	if (cadt_flags) -		type_pf_data_flags(data, cadt_flags); -#endif -	return 0; -} - -/* Delete expired elements from the hashtable */ -static void -type_pf_expire(struct ip_set_hash *h, u8 nets_length) -{ -	struct htable *t = h->table; -	struct hbucket *n; -	struct type_pf_elem *data; -	u32 i; -	int j; - -	for (i = 0; i < jhash_size(t->htable_bits); i++) { -		n = hbucket(t, i); -		for (j = 0; j < n->pos; j++) { -			data = ahash_tdata(n, j); -			if (type_pf_data_expired(data)) { -				pr_debug("expired %u/%u\n", i, j); -#ifdef IP_SET_HASH_WITH_NETS -				del_cidr(h, CIDR(data->cidr), nets_length); -#endif -				if (j != n->pos - 1) -					/* Not last one */ -					type_pf_data_copy(data, -						ahash_tdata(n, n->pos - 1)); -				n->pos--; -				h->elements--; -			} -		} -		if (n->pos + AHASH_INIT_SIZE < n->size) { -			void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) -					    * sizeof(struct type_pf_telem), -					    GFP_ATOMIC); -			if (!tmp) -				/* Still try to delete expired elements */ -				continue; -			n->size -= AHASH_INIT_SIZE; -			memcpy(tmp, n->value, -			       n->size * sizeof(struct type_pf_telem)); -			kfree(n->value); -			n->value = tmp; -		} -	} -} - -static int -type_pf_tresize(struct ip_set *set, bool retried) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t, *orig = h->table; -	u8 htable_bits = orig->htable_bits; -	const struct type_pf_elem *data; -	struct hbucket *n, *m; -	u32 i, j; -	int ret; - -	/* Try to cleanup once */ -	if (!retried) { -		i = h->elements; -		write_lock_bh(&set->lock); -		type_pf_expire(set->data, NETS_LENGTH(set->family)); -		write_unlock_bh(&set->lock); -		if (h->elements <  i) -			return 0; -	} - -retry: -	ret = 0; -	htable_bits++; -	pr_debug("attempt to resize set %s from %u to %u, t %p\n", -		 set->name, orig->htable_bits, htable_bits, orig); -	if (!htable_bits) { -		/* In case we have plenty of memory :-) */ -		pr_warning("Cannot increase the hashsize of set %s further\n", -			   set->name); -		return -IPSET_ERR_HASH_FULL; -	} -	t = ip_set_alloc(sizeof(*t) -			 + jhash_size(htable_bits) * sizeof(struct hbucket)); -	if (!t) -		return -ENOMEM; -	t->htable_bits = htable_bits; - -	read_lock_bh(&set->lock); -	for (i = 0; i < jhash_size(orig->htable_bits); i++) { -		n = hbucket(orig, i); -		for (j = 0; j < n->pos; j++) { -			data = ahash_tdata(n, j); -			m = hbucket(t, HKEY(data, h->initval, htable_bits)); -			ret = type_pf_elem_tadd(m, data, AHASH_MAX(h), 0, -						ip_set_timeout_get(type_pf_data_timeout(data))); -			if (ret < 0) { -				read_unlock_bh(&set->lock); -				ahash_destroy(t); -				if (ret == -EAGAIN) -					goto retry; -				return ret; -			} -		} -	} - -	rcu_assign_pointer(h->table, t); -	read_unlock_bh(&set->lock); - -	/* Give time to other readers of the set */ -	synchronize_rcu_bh(); - -	ahash_destroy(orig); - -	return 0; -} - -static int -type_pf_tadd(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	const struct type_pf_elem *d = value; -	struct hbucket *n; -	struct type_pf_elem *data; -	int ret = 0, i, j = AHASH_MAX(h) + 1; -	bool flag_exist = flags & IPSET_FLAG_EXIST; -	u32 key, multi = 0; -	u32 cadt_flags = flags >> 16; - -	if (h->elements >= h->maxelem) -		/* FIXME: when set is full, we slow down here */ -		type_pf_expire(h, NETS_LENGTH(set->family)); -	if (h->elements >= h->maxelem) { -		if (net_ratelimit()) -			pr_warning("Set %s is full, maxelem %u reached\n", -				   set->name, h->maxelem); -		return -IPSET_ERR_HASH_FULL; -	} - -	rcu_read_lock_bh(); -	t = rcu_dereference_bh(h->table); -	key = HKEY(d, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) { -		data = ahash_tdata(n, i); -		if (type_pf_data_equal(data, d, &multi)) { -			if (type_pf_data_expired(data) || flag_exist) -				/* Just timeout value may be updated */ -				j = i; -			else { -				ret = -IPSET_ERR_EXIST; -				goto out; -			} -		} else if (j == AHASH_MAX(h) + 1 && -			   type_pf_data_expired(data)) -			j = i; -	} -	if (j != AHASH_MAX(h) + 1) { -		data = ahash_tdata(n, j); -#ifdef IP_SET_HASH_WITH_NETS -		del_cidr(h, CIDR(data->cidr), NETS_LENGTH(set->family)); -		add_cidr(h, CIDR(d->cidr), NETS_LENGTH(set->family)); -#endif -		type_pf_data_copy(data, d); -		type_pf_data_timeout_set(data, timeout); -#ifdef IP_SET_HASH_WITH_NETS -		type_pf_data_flags(data, cadt_flags); -#endif -		goto out; -	} -	TUNE_AHASH_MAX(h, multi); -	ret = type_pf_elem_tadd(n, d, AHASH_MAX(h), cadt_flags, timeout); -	if (ret != 0) { -		if (ret == -EAGAIN) -			type_pf_data_next(h, d); -		goto out; -	} - -#ifdef IP_SET_HASH_WITH_NETS -	add_cidr(h, CIDR(d->cidr), NETS_LENGTH(set->family)); -#endif -	h->elements++; -out: -	rcu_read_unlock_bh(); -	return ret; -} - -static int -type_pf_tdel(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	const struct type_pf_elem *d = value; -	struct hbucket *n; -	int i; -	struct type_pf_elem *data; -	u32 key, multi = 0; - -	key = HKEY(value, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) { -		data = ahash_tdata(n, i); -		if (!type_pf_data_equal(data, d, &multi)) -			continue; -		if (type_pf_data_expired(data)) -			return -IPSET_ERR_EXIST; -		if (i != n->pos - 1) -			/* Not last one */ -			type_pf_data_copy(data, ahash_tdata(n, n->pos - 1)); - -		n->pos--; -		h->elements--; -#ifdef IP_SET_HASH_WITH_NETS -		del_cidr(h, CIDR(d->cidr), NETS_LENGTH(set->family)); -#endif -		if (n->pos + AHASH_INIT_SIZE < n->size) { -			void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) -					    * sizeof(struct type_pf_telem), -					    GFP_ATOMIC); -			if (!tmp) -				return 0; -			n->size -= AHASH_INIT_SIZE; -			memcpy(tmp, n->value, -			       n->size * sizeof(struct type_pf_telem)); -			kfree(n->value); -			n->value = tmp; -		} -		return 0; -	} - -	return -IPSET_ERR_EXIST; -} - -#ifdef IP_SET_HASH_WITH_NETS -static int -type_pf_ttest_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	struct type_pf_elem *data; -	struct hbucket *n; -	int i, j = 0; -	u32 key, multi = 0; -	u8 nets_length = NETS_LENGTH(set->family); - -	for (; j < nets_length && h->nets[j].nets && !multi; j++) { -		type_pf_data_netmask(d, h->nets[j].cidr); -		key = HKEY(d, h->initval, t->htable_bits); -		n = hbucket(t, key); -		for (i = 0; i < n->pos; i++) { -			data = ahash_tdata(n, i); -#ifdef IP_SET_HASH_WITH_MULTI -			if (type_pf_data_equal(data, d, &multi)) { -				if (!type_pf_data_expired(data)) -					return type_pf_data_match(data); -				multi = 0; -			} -#else -			if (type_pf_data_equal(data, d, &multi) && -			    !type_pf_data_expired(data)) -				return type_pf_data_match(data); -#endif -		} -	} -	return 0; -} -#endif - -static int -type_pf_ttest(struct ip_set *set, void *value, u32 timeout, u32 flags) -{ -	struct ip_set_hash *h = set->data; -	struct htable *t = h->table; -	struct type_pf_elem *data, *d = value; -	struct hbucket *n; -	int i; -	u32 key, multi = 0; - -#ifdef IP_SET_HASH_WITH_NETS -	if (CIDR(d->cidr) == SET_HOST_MASK(set->family)) -		return type_pf_ttest_cidrs(set, d, timeout); -#endif -	key = HKEY(d, h->initval, t->htable_bits); -	n = hbucket(t, key); -	for (i = 0; i < n->pos; i++) { -		data = ahash_tdata(n, i); -		if (type_pf_data_equal(data, d, &multi) && -		    !type_pf_data_expired(data)) -			return type_pf_data_match(data); -	} -	return 0; -} - -static int -type_pf_tlist(const struct ip_set *set, -	      struct sk_buff *skb, struct netlink_callback *cb) -{ -	const struct ip_set_hash *h = set->data; -	const struct htable *t = h->table; -	struct nlattr *atd, *nested; -	const struct hbucket *n; -	const struct type_pf_elem *data; -	u32 first = cb->args[2]; -	/* We assume that one hash bucket fills into one page */ -	void *incomplete; -	int i; - -	atd = ipset_nest_start(skb, IPSET_ATTR_ADT); -	if (!atd) -		return -EMSGSIZE; -	for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) { -		incomplete = skb_tail_pointer(skb); -		n = hbucket(t, cb->args[2]); -		for (i = 0; i < n->pos; i++) { -			data = ahash_tdata(n, i); -			pr_debug("list %p %u\n", n, i); -			if (type_pf_data_expired(data)) -				continue; -			pr_debug("do list %p %u\n", n, i); -			nested = ipset_nest_start(skb, IPSET_ATTR_DATA); -			if (!nested) { -				if (cb->args[2] == first) { -					nla_nest_cancel(skb, atd); -					return -EMSGSIZE; -				} else -					goto nla_put_failure; -			} -			if (type_pf_data_tlist(skb, data)) -				goto nla_put_failure; -			ipset_nest_end(skb, nested); -		} -	} -	ipset_nest_end(skb, atd); -	/* Set listing finished */ -	cb->args[2] = 0; - -	return 0; - -nla_put_failure: -	nlmsg_trim(skb, incomplete); -	ipset_nest_end(skb, atd); -	if (unlikely(first == cb->args[2])) { -		pr_warning("Can't list set %s: one bucket does not fit into " -			   "a message. Please report it!\n", set->name); -		cb->args[2] = 0; -		return -EMSGSIZE; -	} -	return 0; -} - -static const struct ip_set_type_variant type_pf_tvariant = { -	.kadt	= type_pf_kadt, -	.uadt	= type_pf_uadt, -	.adt	= { -		[IPSET_ADD] = type_pf_tadd, -		[IPSET_DEL] = type_pf_tdel, -		[IPSET_TEST] = type_pf_ttest, -	}, -	.destroy = type_pf_destroy, -	.flush	= type_pf_flush, -	.head	= type_pf_head, -	.list	= type_pf_tlist, -	.resize	= type_pf_tresize, -	.same_set = type_pf_same_set, -}; - -static void -type_pf_gc(unsigned long ul_set) -{ -	struct ip_set *set = (struct ip_set *) ul_set; -	struct ip_set_hash *h = set->data; - -	pr_debug("called\n"); -	write_lock_bh(&set->lock); -	type_pf_expire(h, NETS_LENGTH(set->family)); -	write_unlock_bh(&set->lock); - -	h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ; -	add_timer(&h->gc); -} - -static void -type_pf_gc_init(struct ip_set *set) -{ -	struct ip_set_hash *h = set->data; - -	init_timer(&h->gc); -	h->gc.data = (unsigned long) set; -	h->gc.function = type_pf_gc; -	h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ; -	add_timer(&h->gc); -	pr_debug("gc initialized, run in every %u\n", -		 IPSET_GC_PERIOD(h->timeout)); -} - -#undef HKEY_DATALEN -#undef HKEY -#undef type_pf_data_equal -#undef type_pf_data_isnull -#undef type_pf_data_copy -#undef type_pf_data_zero_out -#undef type_pf_data_netmask -#undef type_pf_data_list -#undef type_pf_data_tlist -#undef type_pf_data_next -#undef type_pf_data_flags -#undef type_pf_data_match - -#undef type_pf_elem -#undef type_pf_telem -#undef type_pf_data_timeout -#undef type_pf_data_expired -#undef type_pf_data_timeout_set - -#undef type_pf_elem_add -#undef type_pf_add -#undef type_pf_del -#undef type_pf_test_cidrs -#undef type_pf_test - -#undef type_pf_elem_tadd -#undef type_pf_del_telem -#undef type_pf_expire -#undef type_pf_tadd -#undef type_pf_tdel -#undef type_pf_ttest_cidrs -#undef type_pf_ttest - -#undef type_pf_resize -#undef type_pf_tresize -#undef type_pf_flush -#undef type_pf_destroy -#undef type_pf_head -#undef type_pf_list -#undef type_pf_tlist -#undef type_pf_same_set -#undef type_pf_kadt -#undef type_pf_uadt -#undef type_pf_gc -#undef type_pf_gc_init -#undef type_pf_variant -#undef type_pf_tvariant diff --git a/include/linux/netfilter/ipset/ip_set_bitmap.h b/include/linux/netfilter/ipset/ip_set_bitmap.h index 1a30646d5be..5e4662a71e0 100644 --- a/include/linux/netfilter/ipset/ip_set_bitmap.h +++ b/include/linux/netfilter/ipset/ip_set_bitmap.h @@ -5,6 +5,12 @@  #define IPSET_BITMAP_MAX_RANGE	0x0000FFFF +enum { +	IPSET_ADD_FAILED = 1, +	IPSET_ADD_STORE_PLAIN_TIMEOUT, +	IPSET_ADD_START_STORED_TIMEOUT, +}; +  /* Common functions */  static inline u32 diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h index 41d9cfa0816..3aac04167ca 100644 --- a/include/linux/netfilter/ipset/ip_set_timeout.h +++ b/include/linux/netfilter/ipset/ip_set_timeout.h @@ -1,7 +1,7 @@  #ifndef _IP_SET_TIMEOUT_H  #define _IP_SET_TIMEOUT_H -/* Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> +/* Copyright (C) 2003-2013 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -17,13 +17,14 @@  #define IPSET_GC_PERIOD(timeout) \  	((timeout/3) ? min_t(u32, (timeout)/3, IPSET_GC_TIME) : 1) -/* Set is defined without timeout support: timeout value may be 0 */ -#define IPSET_NO_TIMEOUT	UINT_MAX +/* Entry is set with no timeout value */ +#define IPSET_ELEM_PERMANENT	0 -#define with_timeout(timeout)	((timeout) != IPSET_NO_TIMEOUT) +/* Set is defined with timeout support: timeout value may be 0 */ +#define IPSET_NO_TIMEOUT	UINT_MAX -#define opt_timeout(opt, map)	\ -	(with_timeout((opt)->timeout) ? (opt)->timeout : (map)->timeout) +#define ip_set_adt_opt_timeout(opt, map)	\ +((opt)->ext.timeout != IPSET_NO_TIMEOUT ? (opt)->ext.timeout : (map)->timeout)  static inline unsigned int  ip_set_timeout_uget(struct nlattr *tb) @@ -38,61 +39,6 @@ ip_set_timeout_uget(struct nlattr *tb)  	return timeout == IPSET_NO_TIMEOUT ? IPSET_NO_TIMEOUT - 1 : timeout;  } -#ifdef IP_SET_BITMAP_TIMEOUT - -/* Bitmap specific timeout constants and macros for the entries */ - -/* Bitmap entry is unset */ -#define IPSET_ELEM_UNSET	0 -/* Bitmap entry is set with no timeout value */ -#define IPSET_ELEM_PERMANENT	(UINT_MAX/2) - -static inline bool -ip_set_timeout_test(unsigned long timeout) -{ -	return timeout != IPSET_ELEM_UNSET && -	       (timeout == IPSET_ELEM_PERMANENT || -		time_is_after_jiffies(timeout)); -} - -static inline bool -ip_set_timeout_expired(unsigned long timeout) -{ -	return timeout != IPSET_ELEM_UNSET && -	       timeout != IPSET_ELEM_PERMANENT && -	       time_is_before_jiffies(timeout); -} - -static inline unsigned long -ip_set_timeout_set(u32 timeout) -{ -	unsigned long t; - -	if (!timeout) -		return IPSET_ELEM_PERMANENT; - -	t = msecs_to_jiffies(timeout * 1000) + jiffies; -	if (t == IPSET_ELEM_UNSET || t == IPSET_ELEM_PERMANENT) -		/* Bingo! */ -		t++; - -	return t; -} - -static inline u32 -ip_set_timeout_get(unsigned long timeout) -{ -	return timeout == IPSET_ELEM_PERMANENT ? 0 : -		jiffies_to_msecs(timeout - jiffies)/1000; -} - -#else - -/* Hash specific timeout constants and macros for the entries */ - -/* Hash entry is set with no timeout value */ -#define IPSET_ELEM_PERMANENT	0 -  static inline bool  ip_set_timeout_test(unsigned long timeout)  { @@ -101,36 +47,32 @@ ip_set_timeout_test(unsigned long timeout)  }  static inline bool -ip_set_timeout_expired(unsigned long timeout) +ip_set_timeout_expired(unsigned long *timeout)  { -	return timeout != IPSET_ELEM_PERMANENT && -	       time_is_before_jiffies(timeout); +	return *timeout != IPSET_ELEM_PERMANENT && +	       time_is_before_jiffies(*timeout);  } -static inline unsigned long -ip_set_timeout_set(u32 timeout) +static inline void +ip_set_timeout_set(unsigned long *timeout, u32 t)  { -	unsigned long t; - -	if (!timeout) -		return IPSET_ELEM_PERMANENT; +	if (!t) { +		*timeout = IPSET_ELEM_PERMANENT; +		return; +	} -	t = msecs_to_jiffies(timeout * 1000) + jiffies; -	if (t == IPSET_ELEM_PERMANENT) +	*timeout = msecs_to_jiffies(t * 1000) + jiffies; +	if (*timeout == IPSET_ELEM_PERMANENT)  		/* Bingo! :-) */ -		t++; - -	return t; +		(*timeout)--;  }  static inline u32 -ip_set_timeout_get(unsigned long timeout) +ip_set_timeout_get(unsigned long *timeout)  { -	return timeout == IPSET_ELEM_PERMANENT ? 0 : -		jiffies_to_msecs(timeout - jiffies)/1000; +	return *timeout == IPSET_ELEM_PERMANENT ? 0 : +		jiffies_to_msecs(*timeout - jiffies)/1000;  } -#endif /* ! IP_SET_BITMAP_TIMEOUT */  #endif	/* __KERNEL__ */ -  #endif /* _IP_SET_TIMEOUT_H */ diff --git a/include/linux/netfilter/ipset/pfxlen.h b/include/linux/netfilter/ipset/pfxlen.h index 199fd11fedc..1afbb94b4b6 100644 --- a/include/linux/netfilter/ipset/pfxlen.h +++ b/include/linux/netfilter/ipset/pfxlen.h @@ -41,4 +41,13 @@ do {						\  	to = from | ~ip_set_hostmask(cidr);	\  } while (0) +static inline void +ip6_netmask(union nf_inet_addr *ip, u8 prefix) +{ +	ip->ip6[0] &= ip_set_netmask6(prefix)[0]; +	ip->ip6[1] &= ip_set_netmask6(prefix)[1]; +	ip->ip6[2] &= ip_set_netmask6(prefix)[2]; +	ip->ip6[3] &= ip_set_netmask6(prefix)[3]; +} +  #endif /*_PFXLEN_H */ diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index ecbb8e49591..cadb7402d7a 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h @@ -29,10 +29,13 @@ extern int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n);  extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);  extern int nfnetlink_has_listeners(struct net *net, unsigned int group); -extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, -			  int echo, gfp_t flags); -extern int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error); -extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u_int32_t pid, int flags); +extern struct sk_buff *nfnetlink_alloc_skb(struct net *net, unsigned int size, +					   u32 dst_portid, gfp_t gfp_mask); +extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, +			  unsigned int group, int echo, gfp_t flags); +extern int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); +extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, +			     u32 portid, int flags);  extern void nfnl_lock(__u8 subsys_id);  extern void nfnl_unlock(__u8 subsys_id); diff --git a/include/linux/netlink.h b/include/linux/netlink.h index e0f746b7b95..6358da5eeee 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -15,11 +15,18 @@ static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb)  	return (struct nlmsghdr *)skb->data;  } +enum netlink_skb_flags { +	NETLINK_SKB_MMAPED	= 0x1,		/* Packet data is mmaped */ +	NETLINK_SKB_TX		= 0x2,		/* Packet was sent by userspace */ +	NETLINK_SKB_DELIVERED	= 0x4,		/* Packet was delivered */ +}; +  struct netlink_skb_parms {  	struct scm_creds	creds;		/* Skb credentials	*/  	__u32			portid;  	__u32			dst_group; -	struct sock		*ssk; +	__u32			flags; +	struct sock		*sk;  };  #define NETLINK_CB(skb)		(*(struct netlink_skb_parms*)&((skb)->cb)) @@ -57,6 +64,8 @@ extern void __netlink_clear_multicast_users(struct sock *sk, unsigned int group)  extern void netlink_clear_multicast_users(struct sock *sk, unsigned int group);  extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);  extern int netlink_has_listeners(struct sock *sk, unsigned int group); +extern struct sk_buff *netlink_alloc_skb(struct sock *ssk, unsigned int size, +					 u32 dst_portid, gfp_t gfp_mask);  extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 portid, int nonblock);  extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 portid,  			     __u32 group, gfp_t allocation); diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 9d7d8c64f7c..fa2cb76a702 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -40,7 +40,7 @@ struct netpoll_info {  	unsigned long rx_flags;  	spinlock_t rx_lock; -	struct mutex dev_lock; +	struct semaphore dev_lock;  	struct list_head rx_np; /* netpolls that registered an rx_hook */  	struct sk_buff_head neigh_tx; /* list of neigh requests to reply to */ diff --git a/include/linux/notifier.h b/include/linux/notifier.h index d65746efc95..d14a4c36246 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h @@ -47,8 +47,11 @@   * runtime initialization.   */ +typedef	int (*notifier_fn_t)(struct notifier_block *nb, +			unsigned long action, void *data); +  struct notifier_block { -	int (*notifier_call)(struct notifier_block *, unsigned long, void *); +	notifier_fn_t notifier_call;  	struct notifier_block __rcu *next;  	int priority;  }; diff --git a/include/linux/nubus.h b/include/linux/nubus.h index a8696bbdfbc..b3740527571 100644 --- a/include/linux/nubus.h +++ b/include/linux/nubus.h @@ -80,7 +80,11 @@ extern struct nubus_board* nubus_boards;  /* Generic NuBus interface functions, modelled after the PCI interface */  void nubus_scan_bus(void); +#ifdef CONFIG_PROC_FS  extern void nubus_proc_init(void); +#else +static inline void nubus_proc_init(void) {} +#endif  int get_nubus_list(char *buf);  int nubus_proc_attach_device(struct nubus_dev *dev);  int nubus_proc_detach_device(struct nubus_dev *dev); diff --git a/include/linux/nvme.h b/include/linux/nvme.h index c25cccaa555..4fa3b0b9b07 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -137,6 +137,34 @@ enum {  	NVME_LBAF_RP_DEGRADED	= 3,  }; +struct nvme_smart_log { +	__u8			critical_warning; +	__u8			temperature[2]; +	__u8			avail_spare; +	__u8			spare_thresh; +	__u8			percent_used; +	__u8			rsvd6[26]; +	__u8			data_units_read[16]; +	__u8			data_units_written[16]; +	__u8			host_reads[16]; +	__u8			host_writes[16]; +	__u8			ctrl_busy_time[16]; +	__u8			power_cycles[16]; +	__u8			power_on_hours[16]; +	__u8			unsafe_shutdowns[16]; +	__u8			media_errors[16]; +	__u8			num_err_log_entries[16]; +	__u8			rsvd192[320]; +}; + +enum { +	NVME_SMART_CRIT_SPARE		= 1 << 0, +	NVME_SMART_CRIT_TEMPERATURE	= 1 << 1, +	NVME_SMART_CRIT_RELIABILITY	= 1 << 2, +	NVME_SMART_CRIT_MEDIA		= 1 << 3, +	NVME_SMART_CRIT_VOLATILE_MEMORY	= 1 << 4, +}; +  struct nvme_lba_range_type {  	__u8			type;  	__u8			attributes; diff --git a/include/linux/of.h b/include/linux/of.h index a0f12928494..2d25ff8fe39 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -540,4 +540,14 @@ static inline int of_property_read_u32(const struct device_node *np,  	return of_property_read_u32_array(np, propname, out_value, 1);  } +#if defined(CONFIG_PROC_FS) && defined(CONFIG_PROC_DEVICETREE) +extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); +extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop); +extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde, +					 struct property *prop); +extern void proc_device_tree_update_prop(struct proc_dir_entry *pde, +					 struct property *newprop, +					 struct property *oldprop); +#endif +  #endif /* _LINUX_OF_H */ diff --git a/include/linux/of_net.h b/include/linux/of_net.h index f4746418871..61bf53b0277 100644 --- a/include/linux/of_net.h +++ b/include/linux/of_net.h @@ -11,6 +11,16 @@  #include <linux/of.h>  extern const int of_get_phy_mode(struct device_node *np);  extern const void *of_get_mac_address(struct device_node *np); +#else +static inline const int of_get_phy_mode(struct device_node *np) +{ +	return -ENODEV; +} + +static inline const void *of_get_mac_address(struct device_node *np) +{ +	return NULL; +}  #endif  #endif /* __LINUX_OF_NET_H */ diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index d42e174bd0c..e6b240b6196 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -19,435 +19,6 @@  #ifndef _LINUX_OPENVSWITCH_H  #define _LINUX_OPENVSWITCH_H 1 -#include <linux/types.h> - -/** - * struct ovs_header - header for OVS Generic Netlink messages. - * @dp_ifindex: ifindex of local port for datapath (0 to make a request not - * specific to a datapath). - * - * Attributes following the header are specific to a particular OVS Generic - * Netlink family, but all of the OVS families use this header. - */ - -struct ovs_header { -	int dp_ifindex; -}; - -/* Datapaths. */ - -#define OVS_DATAPATH_FAMILY  "ovs_datapath" -#define OVS_DATAPATH_MCGROUP "ovs_datapath" -#define OVS_DATAPATH_VERSION 0x1 - -enum ovs_datapath_cmd { -	OVS_DP_CMD_UNSPEC, -	OVS_DP_CMD_NEW, -	OVS_DP_CMD_DEL, -	OVS_DP_CMD_GET, -	OVS_DP_CMD_SET -}; - -/** - * enum ovs_datapath_attr - attributes for %OVS_DP_* commands. - * @OVS_DP_ATTR_NAME: Name of the network device that serves as the "local - * port".  This is the name of the network device whose dp_ifindex is given in - * the &struct ovs_header.  Always present in notifications.  Required in - * %OVS_DP_NEW requests.  May be used as an alternative to specifying - * dp_ifindex in other requests (with a dp_ifindex of 0). - * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially - * set on the datapath port (for OVS_ACTION_ATTR_MISS).  Only valid on - * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should - * not be sent. - * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the - * datapath.  Always present in notifications. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_DP_* commands. - */ -enum ovs_datapath_attr { -	OVS_DP_ATTR_UNSPEC, -	OVS_DP_ATTR_NAME,       /* name of dp_ifindex netdev */ -	OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ -	OVS_DP_ATTR_STATS,      /* struct ovs_dp_stats */ -	__OVS_DP_ATTR_MAX -}; - -#define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1) - -struct ovs_dp_stats { -	__u64 n_hit;             /* Number of flow table matches. */ -	__u64 n_missed;          /* Number of flow table misses. */ -	__u64 n_lost;            /* Number of misses not sent to userspace. */ -	__u64 n_flows;           /* Number of flows present */ -}; - -struct ovs_vport_stats { -	__u64   rx_packets;		/* total packets received       */ -	__u64   tx_packets;		/* total packets transmitted    */ -	__u64   rx_bytes;		/* total bytes received         */ -	__u64   tx_bytes;		/* total bytes transmitted      */ -	__u64   rx_errors;		/* bad packets received         */ -	__u64   tx_errors;		/* packet transmit problems     */ -	__u64   rx_dropped;		/* no space in linux buffers    */ -	__u64   tx_dropped;		/* no space available in linux  */ -}; - -/* Fixed logical ports. */ -#define OVSP_LOCAL      ((__u16)0) - -/* Packet transfer. */ - -#define OVS_PACKET_FAMILY "ovs_packet" -#define OVS_PACKET_VERSION 0x1 - -enum ovs_packet_cmd { -	OVS_PACKET_CMD_UNSPEC, - -	/* Kernel-to-user notifications. */ -	OVS_PACKET_CMD_MISS,    /* Flow table miss. */ -	OVS_PACKET_CMD_ACTION,  /* OVS_ACTION_ATTR_USERSPACE action. */ - -	/* Userspace commands. */ -	OVS_PACKET_CMD_EXECUTE  /* Apply actions to a packet. */ -}; - -/** - * enum ovs_packet_attr - attributes for %OVS_PACKET_* commands. - * @OVS_PACKET_ATTR_PACKET: Present for all notifications.  Contains the entire - * packet as received, from the start of the Ethernet header onward.  For - * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by - * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is - * the flow key extracted from the packet as originally received. - * @OVS_PACKET_ATTR_KEY: Present for all notifications.  Contains the flow key - * extracted from the packet as nested %OVS_KEY_ATTR_* attributes.  This allows - * userspace to adapt its flow setup strategy by comparing its notion of the - * flow key against the kernel's. - * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet.  Used - * for %OVS_PACKET_CMD_EXECUTE.  It has nested %OVS_ACTION_ATTR_* attributes. - * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION - * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an - * %OVS_USERSPACE_ATTR_USERDATA attribute. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_PACKET_* commands. - */ -enum ovs_packet_attr { -	OVS_PACKET_ATTR_UNSPEC, -	OVS_PACKET_ATTR_PACKET,      /* Packet data. */ -	OVS_PACKET_ATTR_KEY,         /* Nested OVS_KEY_ATTR_* attributes. */ -	OVS_PACKET_ATTR_ACTIONS,     /* Nested OVS_ACTION_ATTR_* attributes. */ -	OVS_PACKET_ATTR_USERDATA,    /* u64 OVS_ACTION_ATTR_USERSPACE arg. */ -	__OVS_PACKET_ATTR_MAX -}; - -#define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1) - -/* Virtual ports. */ - -#define OVS_VPORT_FAMILY  "ovs_vport" -#define OVS_VPORT_MCGROUP "ovs_vport" -#define OVS_VPORT_VERSION 0x1 - -enum ovs_vport_cmd { -	OVS_VPORT_CMD_UNSPEC, -	OVS_VPORT_CMD_NEW, -	OVS_VPORT_CMD_DEL, -	OVS_VPORT_CMD_GET, -	OVS_VPORT_CMD_SET -}; - -enum ovs_vport_type { -	OVS_VPORT_TYPE_UNSPEC, -	OVS_VPORT_TYPE_NETDEV,   /* network device */ -	OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */ -	__OVS_VPORT_TYPE_MAX -}; - -#define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1) - -/** - * enum ovs_vport_attr - attributes for %OVS_VPORT_* commands. - * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath. - * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type - * of vport. - * @OVS_VPORT_ATTR_NAME: Name of vport.  For a vport based on a network device - * this is the name of the network device.  Maximum length %IFNAMSIZ-1 bytes - * plus a null terminator. - * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information. - * @OVS_VPORT_ATTR_UPCALL_PID: The Netlink socket in userspace that - * OVS_PACKET_CMD_MISS upcalls will be directed to for packets received on - * this port.  A value of zero indicates that upcalls should not be sent. - * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for - * packets sent or received through the vport. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_VPORT_* commands. - * - * For %OVS_VPORT_CMD_NEW requests, the %OVS_VPORT_ATTR_TYPE and - * %OVS_VPORT_ATTR_NAME attributes are required.  %OVS_VPORT_ATTR_PORT_NO is - * optional; if not specified a free port number is automatically selected. - * Whether %OVS_VPORT_ATTR_OPTIONS is required or optional depends on the type - * of vport. - * and other attributes are ignored. - * - * For other requests, if %OVS_VPORT_ATTR_NAME is specified then it is used to - * look up the vport to operate on; otherwise dp_idx from the &struct - * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. - */ -enum ovs_vport_attr { -	OVS_VPORT_ATTR_UNSPEC, -	OVS_VPORT_ATTR_PORT_NO,	/* u32 port number within datapath */ -	OVS_VPORT_ATTR_TYPE,	/* u32 OVS_VPORT_TYPE_* constant. */ -	OVS_VPORT_ATTR_NAME,	/* string name, up to IFNAMSIZ bytes long */ -	OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */ -	OVS_VPORT_ATTR_UPCALL_PID, /* u32 Netlink PID to receive upcalls */ -	OVS_VPORT_ATTR_STATS,	/* struct ovs_vport_stats */ -	__OVS_VPORT_ATTR_MAX -}; - -#define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) - -/* Flows. */ - -#define OVS_FLOW_FAMILY  "ovs_flow" -#define OVS_FLOW_MCGROUP "ovs_flow" -#define OVS_FLOW_VERSION 0x1 - -enum ovs_flow_cmd { -	OVS_FLOW_CMD_UNSPEC, -	OVS_FLOW_CMD_NEW, -	OVS_FLOW_CMD_DEL, -	OVS_FLOW_CMD_GET, -	OVS_FLOW_CMD_SET -}; - -struct ovs_flow_stats { -	__u64 n_packets;         /* Number of matched packets. */ -	__u64 n_bytes;           /* Number of matched bytes. */ -}; - -enum ovs_key_attr { -	OVS_KEY_ATTR_UNSPEC, -	OVS_KEY_ATTR_ENCAP,	/* Nested set of encapsulated attributes. */ -	OVS_KEY_ATTR_PRIORITY,  /* u32 skb->priority */ -	OVS_KEY_ATTR_IN_PORT,   /* u32 OVS dp port number */ -	OVS_KEY_ATTR_ETHERNET,  /* struct ovs_key_ethernet */ -	OVS_KEY_ATTR_VLAN,	/* be16 VLAN TCI */ -	OVS_KEY_ATTR_ETHERTYPE,	/* be16 Ethernet type */ -	OVS_KEY_ATTR_IPV4,      /* struct ovs_key_ipv4 */ -	OVS_KEY_ATTR_IPV6,      /* struct ovs_key_ipv6 */ -	OVS_KEY_ATTR_TCP,       /* struct ovs_key_tcp */ -	OVS_KEY_ATTR_UDP,       /* struct ovs_key_udp */ -	OVS_KEY_ATTR_ICMP,      /* struct ovs_key_icmp */ -	OVS_KEY_ATTR_ICMPV6,    /* struct ovs_key_icmpv6 */ -	OVS_KEY_ATTR_ARP,       /* struct ovs_key_arp */ -	OVS_KEY_ATTR_ND,        /* struct ovs_key_nd */ -	OVS_KEY_ATTR_SKB_MARK,  /* u32 skb mark */ -	__OVS_KEY_ATTR_MAX -}; - -#define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1) - -/** - * enum ovs_frag_type - IPv4 and IPv6 fragment type - * @OVS_FRAG_TYPE_NONE: Packet is not a fragment. - * @OVS_FRAG_TYPE_FIRST: Packet is a fragment with offset 0. - * @OVS_FRAG_TYPE_LATER: Packet is a fragment with nonzero offset. - * - * Used as the @ipv4_frag in &struct ovs_key_ipv4 and as @ipv6_frag &struct - * ovs_key_ipv6. - */ -enum ovs_frag_type { -	OVS_FRAG_TYPE_NONE, -	OVS_FRAG_TYPE_FIRST, -	OVS_FRAG_TYPE_LATER, -	__OVS_FRAG_TYPE_MAX -}; - -#define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) - -struct ovs_key_ethernet { -	__u8	 eth_src[6]; -	__u8	 eth_dst[6]; -}; - -struct ovs_key_ipv4 { -	__be32 ipv4_src; -	__be32 ipv4_dst; -	__u8   ipv4_proto; -	__u8   ipv4_tos; -	__u8   ipv4_ttl; -	__u8   ipv4_frag;	/* One of OVS_FRAG_TYPE_*. */ -}; - -struct ovs_key_ipv6 { -	__be32 ipv6_src[4]; -	__be32 ipv6_dst[4]; -	__be32 ipv6_label;	/* 20-bits in least-significant bits. */ -	__u8   ipv6_proto; -	__u8   ipv6_tclass; -	__u8   ipv6_hlimit; -	__u8   ipv6_frag;	/* One of OVS_FRAG_TYPE_*. */ -}; - -struct ovs_key_tcp { -	__be16 tcp_src; -	__be16 tcp_dst; -}; - -struct ovs_key_udp { -	__be16 udp_src; -	__be16 udp_dst; -}; - -struct ovs_key_icmp { -	__u8 icmp_type; -	__u8 icmp_code; -}; - -struct ovs_key_icmpv6 { -	__u8 icmpv6_type; -	__u8 icmpv6_code; -}; - -struct ovs_key_arp { -	__be32 arp_sip; -	__be32 arp_tip; -	__be16 arp_op; -	__u8   arp_sha[6]; -	__u8   arp_tha[6]; -}; - -struct ovs_key_nd { -	__u32 nd_target[4]; -	__u8  nd_sll[6]; -	__u8  nd_tll[6]; -}; - -/** - * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. - * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow - * key.  Always present in notifications.  Required for all requests (except - * dumps). - * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying - * the actions to take for packets that match the key.  Always present in - * notifications.  Required for %OVS_FLOW_CMD_NEW requests, optional for - * %OVS_FLOW_CMD_SET requests. - * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this - * flow.  Present in notifications if the stats would be nonzero.  Ignored in - * requests. - * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the - * TCP flags seen on packets in this flow.  Only present in notifications for - * TCP flows, and only if it would be nonzero.  Ignored in requests. - * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on - * the system monotonic clock, at which a packet was last processed for this - * flow.  Only present in notifications if a packet has been processed for this - * flow.  Ignored in requests. - * @OVS_FLOW_ATTR_CLEAR: If present in a %OVS_FLOW_CMD_SET request, clears the - * last-used time, accumulated TCP flags, and statistics for this flow. - * Otherwise ignored in requests.  Never present in notifications. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_FLOW_* commands. - */ -enum ovs_flow_attr { -	OVS_FLOW_ATTR_UNSPEC, -	OVS_FLOW_ATTR_KEY,       /* Sequence of OVS_KEY_ATTR_* attributes. */ -	OVS_FLOW_ATTR_ACTIONS,   /* Nested OVS_ACTION_ATTR_* attributes. */ -	OVS_FLOW_ATTR_STATS,     /* struct ovs_flow_stats. */ -	OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */ -	OVS_FLOW_ATTR_USED,      /* u64 msecs last used in monotonic time. */ -	OVS_FLOW_ATTR_CLEAR,     /* Flag to clear stats, tcp_flags, used. */ -	__OVS_FLOW_ATTR_MAX -}; - -#define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) - -/** - * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. - * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with - * @OVS_ACTION_ATTR_SAMPLE.  A value of 0 samples no packets, a value of - * %UINT32_MAX samples all packets and intermediate values sample intermediate - * fractions of packets. - * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. - * Actions are passed as nested attributes. - * - * Executes the specified actions with the given probability on a per-packet - * basis. - */ -enum ovs_sample_attr { -	OVS_SAMPLE_ATTR_UNSPEC, -	OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ -	OVS_SAMPLE_ATTR_ACTIONS,     /* Nested OVS_ACTION_ATTR_* attributes. */ -	__OVS_SAMPLE_ATTR_MAX, -}; - -#define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1) - -/** - * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. - * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION - * message should be sent.  Required. - * @OVS_USERSPACE_ATTR_USERDATA: If present, its u64 argument is copied to the - * %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA, - */ -enum ovs_userspace_attr { -	OVS_USERSPACE_ATTR_UNSPEC, -	OVS_USERSPACE_ATTR_PID,	      /* u32 Netlink PID to receive upcalls. */ -	OVS_USERSPACE_ATTR_USERDATA,  /* u64 optional user-specified cookie. */ -	__OVS_USERSPACE_ATTR_MAX -}; - -#define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) - -/** - * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. - * @vlan_tpid: Tag protocol identifier (TPID) to push. - * @vlan_tci: Tag control identifier (TCI) to push.  The CFI bit must be set - * (but it will not be set in the 802.1Q header that is pushed). - * - * The @vlan_tpid value is typically %ETH_P_8021Q.  The only acceptable TPID - * values are those that the kernel module also parses as 802.1Q headers, to - * prevent %OVS_ACTION_ATTR_PUSH_VLAN followed by %OVS_ACTION_ATTR_POP_VLAN - * from having surprising results. - */ -struct ovs_action_push_vlan { -	__be16 vlan_tpid;	/* 802.1Q TPID. */ -	__be16 vlan_tci;	/* 802.1Q TCI (VLAN ID and priority). */ -}; - -/** - * enum ovs_action_attr - Action types. - * - * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. - * @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested - * %OVS_USERSPACE_ATTR_* attributes. - * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header.  The - * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its - * value. - * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the - * packet. - * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. - * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in - * the nested %OVS_SAMPLE_ATTR_* attributes. - * - * Only a single header can be set with a single %OVS_ACTION_ATTR_SET.  Not all - * fields within a header are modifiable, e.g. the IPv4 protocol and fragment - * type may not be changed. - */ - -enum ovs_action_attr { -	OVS_ACTION_ATTR_UNSPEC, -	OVS_ACTION_ATTR_OUTPUT,	      /* u32 port number. */ -	OVS_ACTION_ATTR_USERSPACE,    /* Nested OVS_USERSPACE_ATTR_*. */ -	OVS_ACTION_ATTR_SET,          /* One nested OVS_KEY_ATTR_*. */ -	OVS_ACTION_ATTR_PUSH_VLAN,    /* struct ovs_action_push_vlan. */ -	OVS_ACTION_ATTR_POP_VLAN,     /* No argument. */ -	OVS_ACTION_ATTR_SAMPLE,       /* Nested OVS_SAMPLE_ATTR_*. */ -	__OVS_ACTION_ATTR_MAX -}; - -#define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) +#include <uapi/linux/openvswitch.h>  #endif /* _LINUX_OPENVSWITCH_H */ diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 0e38e13eb24..e3dea75a078 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -149,7 +149,7 @@ static inline int page_cache_get_speculative(struct page *page)  {  	VM_BUG_ON(in_interrupt()); -#if !defined(CONFIG_SMP) && defined(CONFIG_TREE_RCU) +#ifdef CONFIG_TINY_RCU  # ifdef CONFIG_PREEMPT_COUNT  	VM_BUG_ON(!in_atomic());  # endif diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 9a22b5efb38..81b31613eb2 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -41,8 +41,37 @@ static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)  	return DEVICE_ACPI_HANDLE(dev);  } + +void acpi_pci_add_bus(struct pci_bus *bus); +void acpi_pci_remove_bus(struct pci_bus *bus); + +#ifdef	CONFIG_ACPI_PCI_SLOT +void acpi_pci_slot_init(void); +void acpi_pci_slot_enumerate(struct pci_bus *bus, acpi_handle handle); +void acpi_pci_slot_remove(struct pci_bus *bus); +#else +static inline void acpi_pci_slot_init(void) { } +static inline void acpi_pci_slot_enumerate(struct pci_bus *bus, +					   acpi_handle handle) { } +static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }  #endif +#ifdef	CONFIG_HOTPLUG_PCI_ACPI +void acpiphp_init(void); +void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle); +void acpiphp_remove_slots(struct pci_bus *bus); +#else +static inline void acpiphp_init(void) { } +static inline void acpiphp_enumerate_slots(struct pci_bus *bus, +					   acpi_handle handle) { } +static inline void acpiphp_remove_slots(struct pci_bus *bus) { } +#endif + +#else	/* CONFIG_ACPI */ +static inline void acpi_pci_add_bus(struct pci_bus *bus) { } +static inline void acpi_pci_remove_bus(struct pci_bus *bus) { } +#endif	/* CONFIG_ACPI */ +  #ifdef CONFIG_ACPI_APEI  extern bool aer_acpi_firmware_first(void);  #else diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index c8320144fe7..8af4610c2e4 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h @@ -23,14 +23,14 @@  #define PCIE_LINK_STATE_CLKPM	4  #ifdef CONFIG_PCIEASPM -extern void pcie_aspm_init_link_state(struct pci_dev *pdev); -extern void pcie_aspm_exit_link_state(struct pci_dev *pdev); -extern void pcie_aspm_pm_state_change(struct pci_dev *pdev); -extern void pcie_aspm_powersave_config_link(struct pci_dev *pdev); -extern void pci_disable_link_state(struct pci_dev *pdev, int state); -extern void pci_disable_link_state_locked(struct pci_dev *pdev, int state); -extern void pcie_clear_aspm(struct pci_bus *bus); -extern void pcie_no_aspm(void); +void pcie_aspm_init_link_state(struct pci_dev *pdev); +void pcie_aspm_exit_link_state(struct pci_dev *pdev); +void pcie_aspm_pm_state_change(struct pci_dev *pdev); +void pcie_aspm_powersave_config_link(struct pci_dev *pdev); +void pci_disable_link_state(struct pci_dev *pdev, int state); +void pci_disable_link_state_locked(struct pci_dev *pdev, int state); +void pcie_clear_aspm(struct pci_bus *bus); +void pcie_no_aspm(void);  #else  static inline void pcie_aspm_init_link_state(struct pci_dev *pdev)  { @@ -56,8 +56,8 @@ static inline void pcie_no_aspm(void)  #endif  #ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */ -extern void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); -extern void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev); +void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); +void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev);  #else  static inline void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)  { diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index 7ef68724f0f..68bcefd7fca 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -14,9 +14,9 @@ struct pci_ats {  #ifdef CONFIG_PCI_ATS -extern int pci_enable_ats(struct pci_dev *dev, int ps); -extern void pci_disable_ats(struct pci_dev *dev); -extern int pci_ats_queue_depth(struct pci_dev *dev); +int pci_enable_ats(struct pci_dev *dev, int ps); +void pci_disable_ats(struct pci_dev *dev); +int pci_ats_queue_depth(struct pci_dev *dev);  /**   * pci_ats_enabled - query the ATS status @@ -54,12 +54,12 @@ static inline int pci_ats_enabled(struct pci_dev *dev)  #ifdef CONFIG_PCI_PRI -extern int  pci_enable_pri(struct pci_dev *pdev, u32 reqs); -extern void pci_disable_pri(struct pci_dev *pdev); -extern bool pci_pri_enabled(struct pci_dev *pdev); -extern int  pci_reset_pri(struct pci_dev *pdev); -extern bool pci_pri_stopped(struct pci_dev *pdev); -extern int  pci_pri_status(struct pci_dev *pdev); +int pci_enable_pri(struct pci_dev *pdev, u32 reqs); +void pci_disable_pri(struct pci_dev *pdev); +bool pci_pri_enabled(struct pci_dev *pdev); +int pci_reset_pri(struct pci_dev *pdev); +bool pci_pri_stopped(struct pci_dev *pdev); +int pci_pri_status(struct pci_dev *pdev);  #else /* CONFIG_PCI_PRI */ @@ -95,10 +95,10 @@ static inline int pci_pri_status(struct pci_dev *pdev)  #ifdef CONFIG_PCI_PASID -extern int pci_enable_pasid(struct pci_dev *pdev, int features); -extern void pci_disable_pasid(struct pci_dev *pdev); -extern int pci_pasid_features(struct pci_dev *pdev); -extern int pci_max_pasids(struct pci_dev *pdev); +int pci_enable_pasid(struct pci_dev *pdev, int features); +void pci_disable_pasid(struct pci_dev *pdev); +int pci_pasid_features(struct pci_dev *pdev); +int pci_max_pasids(struct pci_dev *pdev);  #else  /* CONFIG_PCI_PASID */ diff --git a/include/linux/pci.h b/include/linux/pci.h index 2461033a798..3a24e4ff324 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -35,6 +35,21 @@  /* Include the ID list */  #include <linux/pci_ids.h> +/* + * The PCI interface treats multi-function devices as independent + * devices.  The slot/function address of each device is encoded + * in a single byte as follows: + * + *	7:3 = slot + *	2:0 = function + * PCI_DEVFN(), PCI_SLOT(), and PCI_FUNC() are defined uapi/linux/pci.h + * In the interest of not exposing interfaces to user-space unnecessarily, + * the following kernel only defines are being added here. + */ +#define PCI_DEVID(bus, devfn)  ((((u16)bus) << 8) | devfn) +/* return bus from PCI devid = ((u16)bus_number) << 8) | devfn */ +#define PCI_BUS_NUM(x) (((x) >> 8) & 0xff) +  /* pci_slot represents a physical slot */  struct pci_slot {  	struct pci_bus *bus;		/* The bus this slot is on */ @@ -232,6 +247,8 @@ struct pci_dev {  	u8		revision;	/* PCI revision, low byte of class word */  	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */  	u8		pcie_cap;	/* PCI-E capability offset */ +	u8		msi_cap;	/* MSI capability offset */ +	u8		msix_cap;	/* MSI-X capability offset */  	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */  	u8		rom_base_reg;	/* which config register controls the ROM */  	u8		pin;  		/* which interrupt pin this device uses */ @@ -249,8 +266,7 @@ struct pci_dev {  	pci_power_t     current_state;  /* Current operating state. In ACPI-speak,  					   this is D0-D3, D0 being fully functional,  					   and D3 being off. */ -	int		pm_cap;		/* PM capability offset in the -					   configuration space */ +	u8		pm_cap;		/* PM capability offset */  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#  					   can be generated */  	unsigned int	pme_interrupt:1; @@ -348,7 +364,7 @@ static inline struct pci_dev *pci_physfn(struct pci_dev *dev)  	return dev;  } -extern struct pci_dev *alloc_pci_dev(void); +struct pci_dev *alloc_pci_dev(void);  #define	to_pci_dev(n) container_of(n, struct pci_dev, dev)  #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) @@ -504,10 +520,10 @@ struct pci_ops {   * ACPI needs to be able to access PCI config space before we've done a   * PCI bus scan and created pci_bus structures.   */ -extern int raw_pci_read(unsigned int domain, unsigned int bus, -			unsigned int devfn, int reg, int len, u32 *val); -extern int raw_pci_write(unsigned int domain, unsigned int bus, -			unsigned int devfn, int reg, int len, u32 val); +int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, +		 int reg, int len, u32 *val); +int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, +		  int reg, int len, u32 val);  struct pci_bus_region {  	resource_size_t start; @@ -658,7 +674,7 @@ struct pci_driver {  /* these external functions are only available when PCI support is enabled */  #ifdef CONFIG_PCI -extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); +void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss);  enum pcie_bus_config_types {  	PCIE_BUS_TUNE_OFF, @@ -675,9 +691,11 @@ extern struct bus_type pci_bus_type;   * code, or pci core code. */  extern struct list_head pci_root_buses;	/* list of all known PCI buses */  /* Some device drivers need know if pci is initiated */ -extern int no_pci_devices(void); +int no_pci_devices(void);  void pcibios_resource_survey_bus(struct pci_bus *bus); +void pcibios_add_bus(struct pci_bus *bus); +void pcibios_remove_bus(struct pci_bus *bus);  void pcibios_fixup_bus(struct pci_bus *);  int __must_check pcibios_enable_device(struct pci_dev *, int mask);  /* Architecture specific versions may override this (weak) */ @@ -699,7 +717,7 @@ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,  void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,  			     struct pci_bus_region *region);  void pcibios_scan_specific_bus(int busn); -extern struct pci_bus *pci_find_bus(int domain, int busnr); +struct pci_bus *pci_find_bus(int domain, int busnr);  void pci_bus_add_devices(const struct pci_bus *bus);  struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,  				      struct pci_ops *ops, void *sysdata); @@ -732,14 +750,14 @@ struct resource *pci_find_parent_resource(const struct pci_dev *dev,  u8 pci_swizzle_interrupt_pin(const struct pci_dev *dev, u8 pin);  int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);  u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp); -extern struct pci_dev *pci_dev_get(struct pci_dev *dev); -extern void pci_dev_put(struct pci_dev *dev); -extern void pci_remove_bus(struct pci_bus *b); -extern void pci_stop_and_remove_bus_device(struct pci_dev *dev); +struct pci_dev *pci_dev_get(struct pci_dev *dev); +void pci_dev_put(struct pci_dev *dev); +void pci_remove_bus(struct pci_bus *b); +void pci_stop_and_remove_bus_device(struct pci_dev *dev);  void pci_stop_root_bus(struct pci_bus *bus);  void pci_remove_root_bus(struct pci_bus *bus);  void pci_setup_cardbus(struct pci_bus *bus); -extern void pci_sort_breadthfirst(void); +void pci_sort_breadthfirst(void);  #define dev_is_pci(d) ((d)->bus == &pci_bus_type)  #define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false))  #define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0)) @@ -916,6 +934,7 @@ void pci_disable_rom(struct pci_dev *pdev);  void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);  void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);  size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size); +void __iomem __must_check *pci_platform_rom(struct pci_dev *pdev, size_t *size);  /* Power management related routines */  int pci_save_state(struct pci_dev *dev); @@ -1141,18 +1160,17 @@ static inline int pci_msi_enabled(void)  	return 0;  }  #else -extern int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec); -extern int pci_enable_msi_block_auto(struct pci_dev *dev, unsigned int *maxvec); -extern void pci_msi_shutdown(struct pci_dev *dev); -extern void pci_disable_msi(struct pci_dev *dev); -extern int pci_msix_table_size(struct pci_dev *dev); -extern int pci_enable_msix(struct pci_dev *dev, -	struct msix_entry *entries, int nvec); -extern void pci_msix_shutdown(struct pci_dev *dev); -extern void pci_disable_msix(struct pci_dev *dev); -extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); -extern void pci_restore_msi_state(struct pci_dev *dev); -extern int pci_msi_enabled(void); +int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec); +int pci_enable_msi_block_auto(struct pci_dev *dev, unsigned int *maxvec); +void pci_msi_shutdown(struct pci_dev *dev); +void pci_disable_msi(struct pci_dev *dev); +int pci_msix_table_size(struct pci_dev *dev); +int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec); +void pci_msix_shutdown(struct pci_dev *dev); +void pci_disable_msix(struct pci_dev *dev); +void msi_remove_pci_irq_vectors(struct pci_dev *dev); +void pci_restore_msi_state(struct pci_dev *dev); +int pci_msi_enabled(void);  #endif  #ifdef CONFIG_PCIEPORTBUS @@ -1167,8 +1185,8 @@ extern bool pcie_ports_auto;  static inline int pcie_aspm_enabled(void) { return 0; }  static inline bool pcie_aspm_support_enabled(void) { return false; }  #else -extern int pcie_aspm_enabled(void); -extern bool pcie_aspm_support_enabled(void); +int pcie_aspm_enabled(void); +bool pcie_aspm_support_enabled(void);  #endif  #ifdef CONFIG_PCIEAER @@ -1186,8 +1204,8 @@ static inline void pcie_set_ecrc_checking(struct pci_dev *dev)  }  static inline void pcie_ecrc_get_policy(char *str) {};  #else -extern void pcie_set_ecrc_checking(struct pci_dev *dev); -extern void pcie_ecrc_get_policy(char *str); +void pcie_set_ecrc_checking(struct pci_dev *dev); +void pcie_ecrc_get_policy(char *str);  #endif  #define pci_enable_msi(pdev)	pci_enable_msi_block(pdev, 1) @@ -1198,9 +1216,9 @@ int  ht_create_irq(struct pci_dev *dev, int idx);  void ht_destroy_irq(unsigned int irq);  #endif /* CONFIG_HT_IRQ */ -extern void pci_cfg_access_lock(struct pci_dev *dev); -extern bool pci_cfg_access_trylock(struct pci_dev *dev); -extern void pci_cfg_access_unlock(struct pci_dev *dev); +void pci_cfg_access_lock(struct pci_dev *dev); +bool pci_cfg_access_trylock(struct pci_dev *dev); +void pci_cfg_access_unlock(struct pci_dev *dev);  /*   * PCI domain support.  Sometimes called PCI segment (eg by ACPI), @@ -1225,7 +1243,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)  /* some architectures require additional setup to direct VGA traffic */  typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,  		      unsigned int command_bits, u32 flags); -extern void pci_register_set_vga_state(arch_set_vga_state_t func); +void pci_register_set_vga_state(arch_set_vga_state_t func);  #else /* CONFIG_PCI is not enabled */ @@ -1627,8 +1645,8 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,  int pcibios_add_device(struct pci_dev *dev);  #ifdef CONFIG_PCI_MMCONFIG -extern void __init pci_mmcfg_early_init(void); -extern void __init pci_mmcfg_late_init(void); +void __init pci_mmcfg_early_init(void); +void __init pci_mmcfg_late_init(void);  #else  static inline void pci_mmcfg_early_init(void) { }  static inline void pci_mmcfg_late_init(void) { } @@ -1639,12 +1657,13 @@ int pci_ext_cfg_avail(void);  void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);  #ifdef CONFIG_PCI_IOV -extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); -extern void pci_disable_sriov(struct pci_dev *dev); -extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); -extern int pci_num_vf(struct pci_dev *dev); -extern int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); -extern int pci_sriov_get_totalvfs(struct pci_dev *dev); +int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); +void pci_disable_sriov(struct pci_dev *dev); +irqreturn_t pci_sriov_migration(struct pci_dev *dev); +int pci_num_vf(struct pci_dev *dev); +int pci_vfs_assigned(struct pci_dev *dev); +int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); +int pci_sriov_get_totalvfs(struct pci_dev *dev);  #else  static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)  { @@ -1661,6 +1680,10 @@ static inline int pci_num_vf(struct pci_dev *dev)  {  	return 0;  } +static inline int pci_vfs_assigned(struct pci_dev *dev) +{ +	return 0; +}  static inline int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)  {  	return 0; @@ -1672,8 +1695,8 @@ static inline int pci_sriov_get_totalvfs(struct pci_dev *dev)  #endif  #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) -extern void pci_hp_create_module_link(struct pci_slot *pci_slot); -extern void pci_hp_remove_module_link(struct pci_slot *pci_slot); +void pci_hp_create_module_link(struct pci_slot *pci_slot); +void pci_hp_remove_module_link(struct pci_slot *pci_slot);  #endif  /** @@ -1817,13 +1840,13 @@ int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,  /* PCI <-> OF binding helpers */  #ifdef CONFIG_OF  struct device_node; -extern void pci_set_of_node(struct pci_dev *dev); -extern void pci_release_of_node(struct pci_dev *dev); -extern void pci_set_bus_of_node(struct pci_bus *bus); -extern void pci_release_bus_of_node(struct pci_bus *bus); +void pci_set_of_node(struct pci_dev *dev); +void pci_release_of_node(struct pci_dev *dev); +void pci_set_bus_of_node(struct pci_bus *bus); +void pci_release_bus_of_node(struct pci_bus *bus);  /* Arch may override this (weak) */ -extern struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus); +struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);  static inline struct device_node *  pci_device_to_OF_node(const struct pci_dev *pdev) diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h index 45fc162cbdc..8db71dcd633 100644 --- a/include/linux/pci_hotplug.h +++ b/include/linux/pci_hotplug.h @@ -125,12 +125,12 @@ static inline const char *hotplug_slot_name(const struct hotplug_slot *slot)  	return pci_slot_name(slot->pci_slot);  } -extern int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, -			     int nr, const char *name, -			     struct module *owner, const char *mod_name); -extern int pci_hp_deregister(struct hotplug_slot *slot); -extern int __must_check pci_hp_change_slot_info	(struct hotplug_slot *slot, -						 struct hotplug_slot_info *info); +int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, int nr, +		      const char *name, struct module *owner, +		      const char *mod_name); +int pci_hp_deregister(struct hotplug_slot *slot); +int __must_check pci_hp_change_slot_info(struct hotplug_slot *slot, +					 struct hotplug_slot_info *info);  /* use a define to avoid include chaining to get THIS_MODULE & friends */  #define pci_hp_register(slot, pbus, devnr, name) \ diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index f11c1c2609d..2b85c521f73 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -524,6 +524,8 @@  #define PCI_DEVICE_ID_AMD_15H_NB_F3	0x1603  #define PCI_DEVICE_ID_AMD_15H_NB_F4	0x1604  #define PCI_DEVICE_ID_AMD_15H_NB_F5	0x1605 +#define PCI_DEVICE_ID_AMD_16H_NB_F3	0x1533 +#define PCI_DEVICE_ID_AMD_16H_NB_F4	0x1534  #define PCI_DEVICE_ID_AMD_CNB17H_F3	0x1703  #define PCI_DEVICE_ID_AMD_LANCE		0x2000  #define PCI_DEVICE_ID_AMD_LANCE_HOME	0x2001 @@ -1604,6 +1606,7 @@  #define PCI_SUBDEVICE_ID_KEYSPAN_SX2	0x5334  #define PCI_VENDOR_ID_MARVELL		0x11ab +#define PCI_VENDOR_ID_MARVELL_EXT	0x1b4b  #define PCI_DEVICE_ID_MARVELL_GT64111	0x4146  #define PCI_DEVICE_ID_MARVELL_GT64260	0x6430  #define PCI_DEVICE_ID_MARVELL_MV64360	0x6460 diff --git a/include/linux/pcieport_if.h b/include/linux/pcieport_if.h index e6f91b1406d..9572669eea9 100644 --- a/include/linux/pcieport_if.h +++ b/include/linux/pcieport_if.h @@ -62,7 +62,7 @@ struct pcie_port_service_driver {  #define to_service_driver(d) \  	container_of(d, struct pcie_port_service_driver, driver) -extern int pcie_port_service_register(struct pcie_port_service_driver *new); -extern void pcie_port_service_unregister(struct pcie_port_service_driver *new); +int pcie_port_service_register(struct pcie_port_service_driver *new); +void pcie_port_service_unregister(struct pcie_port_service_driver *new);  #endif /* _PCIEPORT_IF_H_ */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 1d795df6f4c..e0373d26c24 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -21,7 +21,6 @@   */  #ifdef CONFIG_PERF_EVENTS -# include <linux/cgroup.h>  # include <asm/perf_event.h>  # include <asm/local64.h>  #endif @@ -128,6 +127,7 @@ struct hw_perf_event {  			int		event_base_rdpmc;  			int		idx;  			int		last_cpu; +			int		flags;  			struct hw_perf_event_extra extra_reg;  			struct hw_perf_event_extra branch_reg; @@ -299,22 +299,7 @@ struct swevent_hlist {  #define PERF_ATTACH_GROUP	0x02  #define PERF_ATTACH_TASK	0x04 -#ifdef CONFIG_CGROUP_PERF -/* - * perf_cgroup_info keeps track of time_enabled for a cgroup. - * This is a per-cpu dynamically allocated data structure. - */ -struct perf_cgroup_info { -	u64				time; -	u64				timestamp; -}; - -struct perf_cgroup { -	struct				cgroup_subsys_state css; -	struct				perf_cgroup_info *info;	/* timing info, one per cpu */ -}; -#endif - +struct perf_cgroup;  struct ring_buffer;  /** @@ -583,11 +568,13 @@ struct perf_sample_data {  		u32	reserved;  	}				cpu_entry;  	u64				period; +	union  perf_mem_data_src	data_src;  	struct perf_callchain_entry	*callchain;  	struct perf_raw_record		*raw;  	struct perf_branch_stack	*br_stack;  	struct perf_regs_user		regs_user;  	u64				stack_user_size; +	u64				weight;  };  static inline void perf_sample_data_init(struct perf_sample_data *data, @@ -601,6 +588,8 @@ static inline void perf_sample_data_init(struct perf_sample_data *data,  	data->regs_user.abi = PERF_SAMPLE_REGS_ABI_NONE;  	data->regs_user.regs = NULL;  	data->stack_user_size = 0; +	data->weight = 0; +	data->data_src.val = 0;  }  extern void perf_output_sample(struct perf_output_handle *handle, @@ -831,6 +820,7 @@ do {									\  struct perf_pmu_events_attr {  	struct device_attribute attr;  	u64 id; +	const char *event_str;  };  #define PMU_EVENT_ATTR(_name, _var, _id, _show)				\ diff --git a/include/linux/phy.h b/include/linux/phy.h index 33999adbf8c..9e11039dd7a 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -455,6 +455,14 @@ struct phy_driver {  	 */  	void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); +	/* Some devices (e.g. qnap TS-119P II) require PHY register changes to +	 * enable Wake on LAN, so set_wol is provided to be called in the +	 * ethernet driver's set_wol function. */ +	int (*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); + +	/* See set_wol, but for checking whether Wake on LAN is enabled. */ +	void (*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); +  	struct device_driver driver;  };  #define to_phy_driver(d) container_of(d, struct phy_driver, driver) @@ -560,6 +568,8 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable);  int phy_get_eee_err(struct phy_device *phydev);  int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data);  int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data); +int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); +void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol);  int __init mdio_bus_init(void);  void mdio_bus_exit(void); diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h index 215e5e3dda1..731e4ecee3b 100644 --- a/include/linux/pid_namespace.h +++ b/include/linux/pid_namespace.h @@ -13,7 +13,9 @@ struct pidmap {         void *page;  }; -#define PIDMAP_ENTRIES         ((PID_MAX_LIMIT + 8*PAGE_SIZE - 1)/PAGE_SIZE/8) +#define BITS_PER_PAGE		(PAGE_SIZE * 8) +#define BITS_PER_PAGE_MASK	(BITS_PER_PAGE-1) +#define PIDMAP_ENTRIES		((PID_MAX_LIMIT+BITS_PER_PAGE-1)/BITS_PER_PAGE)  struct bsd_acct_struct; @@ -28,6 +30,7 @@ struct pid_namespace {  	struct pid_namespace *parent;  #ifdef CONFIG_PROC_FS  	struct vfsmount *proc_mnt; +	struct dentry *proc_self;  #endif  #ifdef CONFIG_BSD_PROCESS_ACCT  	struct bsd_acct_struct *bacct; diff --git a/include/linux/pinctrl/pinconf.h b/include/linux/pinctrl/pinconf.h index e7a720104a4..1ad4f31ef6b 100644 --- a/include/linux/pinctrl/pinconf.h +++ b/include/linux/pinctrl/pinconf.h @@ -14,6 +14,8 @@  #ifdef CONFIG_PINCONF +#include <linux/pinctrl/machine.h> +  struct pinctrl_dev;  struct seq_file; @@ -28,6 +30,7 @@ struct seq_file;   * @pin_config_set: configure an individual pin   * @pin_config_group_get: get configurations for an entire pin group   * @pin_config_group_set: configure all pins in a group + * @pin_config_group_dbg_set: optional debugfs to modify a pin configuration   * @pin_config_dbg_show: optional debugfs display hook that will provide   *	per-device info for a certain pin in debugfs   * @pin_config_group_dbg_show: optional debugfs display hook that will provide @@ -51,6 +54,9 @@ struct pinconf_ops {  	int (*pin_config_group_set) (struct pinctrl_dev *pctldev,  				     unsigned selector,  				     unsigned long config); +	int (*pin_config_dbg_parse_modify) (struct pinctrl_dev *pctldev, +					   const char *arg, +					   unsigned long *config);  	void (*pin_config_dbg_show) (struct pinctrl_dev *pctldev,  				     struct seq_file *s,  				     unsigned offset); diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 778804df293..2c2a9e8d857 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h @@ -118,9 +118,9 @@ struct pinctrl_desc {  	const char *name;  	struct pinctrl_pin_desc const *pins;  	unsigned int npins; -	struct pinctrl_ops *pctlops; -	struct pinmux_ops *pmxops; -	struct pinconf_ops *confops; +	const struct pinctrl_ops *pctlops; +	const struct pinmux_ops *pmxops; +	const struct pinconf_ops *confops;  	struct module *owner;  }; diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index ad1a427b526..b8809fef61f 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -27,6 +27,7 @@ struct pipe_buffer {  /**   *	struct pipe_inode_info - a linux kernel pipe + *	@mutex: mutex protecting the whole thing   *	@wait: reader/writer wait point in case of empty/full pipe   *	@nrbufs: the number of non-empty pipe buffers in this pipe   *	@buffers: total number of buffers (should be a power of 2) @@ -34,26 +35,27 @@ struct pipe_buffer {   *	@tmp_page: cached released page   *	@readers: number of current readers of this pipe   *	@writers: number of current writers of this pipe + *	@files: number of struct file refering this pipe (protected by ->i_lock)   *	@waiting_writers: number of writers blocked waiting for room   *	@r_counter: reader counter   *	@w_counter: writer counter   *	@fasync_readers: reader side fasync   *	@fasync_writers: writer side fasync - *	@inode: inode this pipe is attached to   *	@bufs: the circular array of pipe buffers   **/  struct pipe_inode_info { +	struct mutex mutex;  	wait_queue_head_t wait;  	unsigned int nrbufs, curbuf, buffers;  	unsigned int readers;  	unsigned int writers; +	unsigned int files;  	unsigned int waiting_writers;  	unsigned int r_counter;  	unsigned int w_counter;  	struct page *tmp_page;  	struct fasync_struct *fasync_readers;  	struct fasync_struct *fasync_writers; -	struct inode *inode;  	struct pipe_buffer *bufs;  }; @@ -144,9 +146,8 @@ int pipe_proc_fn(struct ctl_table *, int, void __user *, size_t *, loff_t *);  /* Drop the inode semaphore and wait for a pipe event, atomically */  void pipe_wait(struct pipe_inode_info *pipe); -struct pipe_inode_info * alloc_pipe_info(struct inode * inode); -void free_pipe_info(struct inode * inode); -void __free_pipe_info(struct pipe_inode_info *); +struct pipe_inode_info *alloc_pipe_info(void); +void free_pipe_info(struct pipe_inode_info *);  /* Generic pipe buffer ops functions */  void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int); diff --git a/include/linux/platform_data/arm-ux500-pm.h b/include/linux/platform_data/arm-ux500-pm.h new file mode 100644 index 00000000000..8dff64b29ec --- /dev/null +++ b/include/linux/platform_data/arm-ux500-pm.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) ST-Ericsson SA 2010-2013 + * Author: Rickard Andersson <rickard.andersson@stericsson.com> for + *         ST-Ericsson. + * Author: Daniel Lezcano <daniel.lezcano@linaro.org> for Linaro. + * License terms: GNU General Public License (GPL) version 2 + * + */ + +#ifndef ARM_UX500_PM_H +#define ARM_UX500_PM_H + +int prcmu_gic_decouple(void); +int prcmu_gic_recouple(void); +bool prcmu_gic_pending_irq(void); +bool prcmu_pending_irq(void); +bool prcmu_is_cpu_in_wfi(int cpu); +int prcmu_copy_gic_settings(void); +void ux500_pm_init(u32 phy_base, u32 size); + +#endif /* ARM_UX500_PM_H */ diff --git a/include/linux/platform_data/asoc-ux500-msp.h b/include/linux/platform_data/asoc-ux500-msp.h new file mode 100644 index 00000000000..9991aea3d57 --- /dev/null +++ b/include/linux/platform_data/asoc-ux500-msp.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson + * License terms: GNU General Public License (GPL), version 2. + */ + +#ifndef __MSP_H +#define __MSP_H + +#include <linux/platform_data/dma-ste-dma40.h> + +enum msp_i2s_id { +	MSP_I2S_0 = 0, +	MSP_I2S_1, +	MSP_I2S_2, +	MSP_I2S_3, +}; + +/* Platform data structure for a MSP I2S-device */ +struct msp_i2s_platform_data { +	enum msp_i2s_id id; +	struct stedma40_chan_cfg *msp_i2s_dma_rx; +	struct stedma40_chan_cfg *msp_i2s_dma_tx; +}; + +#endif diff --git a/include/linux/platform_data/atmel-aes.h b/include/linux/platform_data/atmel-aes.h deleted file mode 100644 index ab68082fbcb..00000000000 --- a/include/linux/platform_data/atmel-aes.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __LINUX_ATMEL_AES_H -#define __LINUX_ATMEL_AES_H - -#include <linux/platform_data/dma-atmel.h> - -/** - * struct aes_dma_data - DMA data for AES - */ -struct aes_dma_data { -	struct at_dma_slave	txdata; -	struct at_dma_slave	rxdata; -}; - -/** - * struct aes_platform_data - board-specific AES configuration - * @dma_slave: DMA slave interface to use in data transfers. - */ -struct aes_platform_data { -	struct aes_dma_data	*dma_slave; -}; - -#endif /* __LINUX_ATMEL_AES_H */ diff --git a/include/linux/platform_data/brcmfmac-sdio.h b/include/linux/platform_data/brcmfmac-sdio.h new file mode 100644 index 00000000000..1ade657d5fc --- /dev/null +++ b/include/linux/platform_data/brcmfmac-sdio.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2013 Broadcom Corporation + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _LINUX_BRCMFMAC_PLATFORM_H +#define _LINUX_BRCMFMAC_PLATFORM_H + +/* + * Platform specific driver functions and data. Through the platform specific + * device data functions can be provided to help the brcmfmac driver to + * operate with the device in combination with the used platform. + * + * Use the platform data in the following (similar) way: + * + * +#include <brcmfmac_platform.h> + + +static void brcmfmac_power_on(void) +{ +} + +static void brcmfmac_power_off(void) +{ +} + +static void brcmfmac_reset(void) +{ +} + +static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = { +	.power_on		= brcmfmac_power_on, +	.power_off		= brcmfmac_power_off, +	.reset			= brcmfmac_reset +}; + +static struct platform_device brcmfmac_device = { +	.name			= BRCMFMAC_SDIO_PDATA_NAME, +	.id			= PLATFORM_DEVID_NONE, +	.dev.platform_data	= &brcmfmac_sdio_pdata +}; + +void __init brcmfmac_init_pdata(void) +{ +	brcmfmac_sdio_pdata.oob_irq_supported = true; +	brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB); +	brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ | +					    IORESOURCE_IRQ_HIGHLEVEL; +	platform_device_register(&brcmfmac_device); +} + * + * + * Note: the brcmfmac can be loaded as module or be statically built-in into + * the kernel. If built-in then do note that it uses module_init (and + * module_exit) routines which equal device_initcall. So if you intend to + * create a module with the platform specific data for the brcmfmac and have + * it built-in to the kernel then use a higher initcall then device_initcall + * (see init.h). If this is not done then brcmfmac will load without problems + * but will not pickup the platform data. + * + * When the driver does not "detect" platform driver data then it will continue + * without reporting anything and just assume there is no data needed. Which is + * probably true for most platforms. + * + * Explanation of the platform_data fields: + * + * drive_strength: is the preferred drive_strength to be used for the SDIO + * pins. If 0 then a default value will be used. This is the target drive + * strength, the exact drive strength which will be used depends on the + * capabilities of the device. + * + * oob_irq_supported: does the board have support for OOB interrupts. SDIO + * in-band interrupts are relatively slow and for having less overhead on + * interrupt processing an out of band interrupt can be used. If the HW + * supports this then enable this by setting this field to true and configure + * the oob related fields. + * + * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are + * used for registering the irq using request_irq function. + * + * power_on: This function is called by the brcmfmac when the module gets + * loaded. This can be particularly useful for low power devices. The platform + * spcific routine may for example decide to power up the complete device. + * If there is no use-case for this function then provide NULL. + * + * power_off: This function is called by the brcmfmac when the module gets + * unloaded. At this point the device can be powered down or otherwise be reset. + * So if an actual power_off is not supported but reset is then reset the device + * when this function gets called. This can be particularly useful for low power + * devices. If there is no use-case for this function (either power-down or + * reset) then provide NULL. + * + * reset: This function can get called if the device communication broke down. + * This functionality is particularly useful in case of SDIO type devices. It is + * possible to reset a dongle via sdio data interface, but it requires that + * this is fully functional. This function is chip/module specific and this + * function should return only after the complete reset has completed. + */ + +#define BRCMFMAC_SDIO_PDATA_NAME	"brcmfmac_sdio" + +struct brcmfmac_sdio_platform_data { +	unsigned int drive_strength; +	bool oob_irq_supported; +	unsigned int oob_irq_nr; +	unsigned long oob_irq_flags; +	void (*power_on)(void); +	void (*power_off)(void); +	void (*reset)(void); +}; + +#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ diff --git a/include/linux/platform_data/clk-lpss.h b/include/linux/platform_data/clk-lpss.h new file mode 100644 index 00000000000..528e73ce46d --- /dev/null +++ b/include/linux/platform_data/clk-lpss.h @@ -0,0 +1,18 @@ +/* + * Intel Low Power Subsystem clocks. + * + * Copyright (C) 2013, Intel Corporation + * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> + *          Rafael J. Wysocki <rafael.j.wysocki@intel.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CLK_LPSS_H +#define __CLK_LPSS_H + +extern int lpt_clk_init(void); + +#endif /* __CLK_LPSS_H */ diff --git a/include/linux/platform_data/clk-ux500.h b/include/linux/platform_data/clk-ux500.h index 3af0da1f3be..320d9c39ea0 100644 --- a/include/linux/platform_data/clk-ux500.h +++ b/include/linux/platform_data/clk-ux500.h @@ -10,7 +10,8 @@  #ifndef __CLK_UX500_H  #define __CLK_UX500_H -void u8500_clk_init(void); +void u8500_clk_init(u32 clkrst1_base, u32 clkrst2_base, u32 clkrst3_base, +		    u32 clkrst5_base, u32 clkrst6_base);  void u9540_clk_init(void);  void u8540_clk_init(void); diff --git a/include/linux/platform_data/coda.h b/include/linux/platform_data/coda.h new file mode 100644 index 00000000000..6ad4410d9e2 --- /dev/null +++ b/include/linux/platform_data/coda.h @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2013 Philipp Zabel, Pengutronix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#ifndef PLATFORM_CODA_H +#define PLATFORM_CODA_H + +struct device; + +struct coda_platform_data { +	struct device *iram_dev; +}; + +#endif diff --git a/include/linux/platform_data/cpsw.h b/include/linux/platform_data/cpsw.h index 798fb80b024..bb3cd58d71e 100644 --- a/include/linux/platform_data/cpsw.h +++ b/include/linux/platform_data/cpsw.h @@ -30,7 +30,7 @@ struct cpsw_platform_data {  	u32	channels;	/* number of cpdma channels (symmetric) */  	u32	slaves;		/* number of slave cpgmac ports */  	struct cpsw_slave_data	*slave_data; -	u32	cpts_active_slave; /* time stamping slave */ +	u32	active_slave; /* time stamping, ethtool and SIOCGMIIPHY slave */  	u32	cpts_clock_mult;  /* convert input clock ticks to nanoseconds */  	u32	cpts_clock_shift; /* convert input clock ticks to nanoseconds */  	u32	ale_entries;	/* ale table size */ diff --git a/include/linux/platform_data/crypto-atmel.h b/include/linux/platform_data/crypto-atmel.h new file mode 100644 index 00000000000..b46e0d9062a --- /dev/null +++ b/include/linux/platform_data/crypto-atmel.h @@ -0,0 +1,22 @@ +#ifndef __LINUX_CRYPTO_ATMEL_H +#define __LINUX_CRYPTO_ATMEL_H + +#include <linux/platform_data/dma-atmel.h> + +/** + * struct crypto_dma_data - DMA data for AES/TDES/SHA + */ +struct crypto_dma_data { +	struct at_dma_slave	txdata; +	struct at_dma_slave	rxdata; +}; + +/** + * struct crypto_platform_data - board-specific AES/TDES/SHA configuration + * @dma_slave: DMA slave interface to use in data transfers. + */ +struct crypto_platform_data { +	struct crypto_dma_data	*dma_slave; +}; + +#endif /* __LINUX_CRYPTO_ATMEL_H */ diff --git a/include/linux/platform_data/dwc3-omap.h b/include/linux/platform_data/dwc3-omap.h index ada401244e0..1d36ca874cc 100644 --- a/include/linux/platform_data/dwc3-omap.h +++ b/include/linux/platform_data/dwc3-omap.h @@ -41,7 +41,3 @@ enum dwc3_omap_utmi_mode {  	DWC3_OMAP_UTMI_MODE_HW,  	DWC3_OMAP_UTMI_MODE_SW,  }; - -struct dwc3_omap_data { -	enum dwc3_omap_utmi_mode	utmi_mode; -}; diff --git a/include/linux/platform_data/emif_plat.h b/include/linux/platform_data/emif_plat.h index 03378ca8406..5c19a2a647c 100644 --- a/include/linux/platform_data/emif_plat.h +++ b/include/linux/platform_data/emif_plat.h @@ -40,6 +40,7 @@  /* Custom config requests */  #define EMIF_CUSTOM_CONFIG_LPMODE			0x00000001  #define EMIF_CUSTOM_CONFIG_TEMP_ALERT_POLL_INTERVAL	0x00000002 +#define EMIF_CUSTOM_CONFIG_EXTENDED_TEMP_PART		0x00000004  #ifndef __ASSEMBLY__  /** diff --git a/include/linux/platform_data/lp855x.h b/include/linux/platform_data/lp855x.h index 20ee8b221db..ea3200527dd 100644 --- a/include/linux/platform_data/lp855x.h +++ b/include/linux/platform_data/lp855x.h @@ -69,11 +69,6 @@ enum lp855x_chip_id {  	LP8557,  }; -enum lp855x_brightness_ctrl_mode { -	PWM_BASED = 1, -	REGISTER_BASED, -}; -  enum lp8550_brighntess_source {  	LP8550_PWM_ONLY,  	LP8550_I2C_ONLY = 2, @@ -116,24 +111,18 @@ struct lp855x_rom_data {  /**   * struct lp855x_platform_data   * @name : Backlight driver name. If it is not defined, default name is set. - * @mode : brightness control by pwm or lp855x register   * @device_control : value of DEVICE CONTROL register   * @initial_brightness : initial value of backlight brightness   * @period_ns : platform specific pwm period value. unit is nano.  		Only valid when mode is PWM_BASED. - * @load_new_rom_data : -	0 : use default configuration data -	1 : update values of eeprom or eprom registers on loading driver   * @size_program : total size of lp855x_rom_data   * @rom_data : list of new eeprom/eprom registers   */  struct lp855x_platform_data { -	char *name; -	enum lp855x_brightness_ctrl_mode mode; +	const char *name;  	u8 device_control; -	int initial_brightness; +	u8 initial_brightness;  	unsigned int period_ns; -	u8 load_new_rom_data;  	int size_program;  	struct lp855x_rom_data *rom_data;  }; diff --git a/include/linux/platform_data/mmc-davinci.h b/include/linux/platform_data/mmc-davinci.h index 5ba6b22ce33..9cea4ee377b 100644 --- a/include/linux/platform_data/mmc-davinci.h +++ b/include/linux/platform_data/mmc-davinci.h @@ -23,9 +23,6 @@ struct davinci_mmc_config {  	/* any additional host capabilities: OR'd in to mmc->f_caps */  	u32     caps; -	/* Version of the MMC/SD controller */ -	u8	version; -  	/* Number of sg segments */  	u8	nr_sg;  }; diff --git a/include/linux/platform_data/mmc-sdhci-s3c.h b/include/linux/platform_data/mmc-sdhci-s3c.h new file mode 100644 index 00000000000..249f02387a3 --- /dev/null +++ b/include/linux/platform_data/mmc-sdhci-s3c.h @@ -0,0 +1,56 @@ +#ifndef __PLATFORM_DATA_SDHCI_S3C_H +#define __PLATFORM_DATA_SDHCI_S3C_H + +struct platform_device; + +enum cd_types { +	S3C_SDHCI_CD_INTERNAL,	/* use mmc internal CD line */ +	S3C_SDHCI_CD_EXTERNAL,	/* use external callback */ +	S3C_SDHCI_CD_GPIO,	/* use external gpio pin for CD line */ +	S3C_SDHCI_CD_NONE,	/* no CD line, use polling to detect card */ +	S3C_SDHCI_CD_PERMANENT,	/* no CD line, card permanently wired to host */ +}; + +/** + * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI + * @max_width: The maximum number of data bits supported. + * @host_caps: Standard MMC host capabilities bit field. + * @host_caps2: The second standard MMC host capabilities bit field. + * @cd_type: Type of Card Detection method (see cd_types enum above) + * @ext_cd_init: Initialize external card detect subsystem. Called on + *		 sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL. + *		 notify_func argument is a callback to the sdhci-s3c driver + *		 that triggers the card detection event. Callback arguments: + *		 dev is pointer to platform device of the host controller, + *		 state is new state of the card (0 - removed, 1 - inserted). + * @ext_cd_cleanup: Cleanup external card detect subsystem. Called on + *		 sdhci-s3c driver remove when cd_type == S3C_SDHCI_CD_EXTERNAL. + *		 notify_func argument is the same callback as for ext_cd_init. + * @ext_cd_gpio: gpio pin used for external CD line, valid only if + *		 cd_type == S3C_SDHCI_CD_GPIO + * @ext_cd_gpio_invert: invert values for external CD gpio line + * @cfg_gpio: Configure the GPIO for a specific card bit-width + * + * Initialisation data specific to either the machine or the platform + * for the device driver to use or call-back when configuring gpio or + * card speed information. +*/ +struct s3c_sdhci_platdata { +	unsigned int	max_width; +	unsigned int	host_caps; +	unsigned int	host_caps2; +	unsigned int	pm_caps; +	enum cd_types	cd_type; + +	int		ext_cd_gpio; +	bool		ext_cd_gpio_invert; +	int	(*ext_cd_init)(void (*notify_func)(struct platform_device *, +						   int state)); +	int	(*ext_cd_cleanup)(void (*notify_func)(struct platform_device *, +						      int state)); + +	void	(*cfg_gpio)(struct platform_device *dev, int width); +}; + + +#endif /* __PLATFORM_DATA_SDHCI_S3C_H */ diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h index 944b01dd103..98b7925f1a2 100644 --- a/include/linux/platform_data/mv_usb.h +++ b/include/linux/platform_data/mv_usb.h @@ -34,8 +34,6 @@ struct mv_usb_addon_irq {  };  struct mv_usb_platform_data { -	unsigned int		clknum; -	char			**clkname;  	struct mv_usb_addon_irq	*id;	/* Only valid for OTG. ID pin change*/  	struct mv_usb_addon_irq	*vbus;	/* valid for OTG/UDC. VBUS change*/ diff --git a/include/linux/platform_data/ntc_thermistor.h b/include/linux/platform_data/ntc_thermistor.h index 88734e871e3..c7285b57546 100644 --- a/include/linux/platform_data/ntc_thermistor.h +++ b/include/linux/platform_data/ntc_thermistor.h @@ -21,6 +21,8 @@  #ifndef _LINUX_NTC_H  #define _LINUX_NTC_H +struct iio_channel; +  enum ntc_thermistor_type {  	TYPE_NCPXXWB473,  	TYPE_NCPXXWL333, @@ -39,13 +41,17 @@ struct ntc_thermistor_platform_data {  	 * described at Documentation/hwmon/ntc_thermistor  	 *  	 * pullup/down_ohm: 0 for infinite / not-connected +	 * +	 * chan: iio_channel pointer to communicate with the ADC which the +	 * thermistor is using for conversion of the analog values.  	 */ -	int (*read_uV)(void); -	unsigned int pullup_uV; +	int (*read_uv)(struct ntc_thermistor_platform_data *); +	unsigned int pullup_uv;  	unsigned int pullup_ohm;  	unsigned int pulldown_ohm;  	enum { NTC_CONNECTED_POSITIVE, NTC_CONNECTED_GROUND } connect; +	struct iio_channel *chan;  	int (*read_ohm)(void);  }; diff --git a/include/linux/platform_data/serial-sccnxp.h b/include/linux/platform_data/serial-sccnxp.h index 215574d1e81..bdc510d0324 100644 --- a/include/linux/platform_data/serial-sccnxp.h +++ b/include/linux/platform_data/serial-sccnxp.h @@ -86,10 +86,6 @@ struct sccnxp_pdata {  	const u32		mctrl_cfg[SCCNXP_MAX_UARTS];  	/* Timer value for polling mode (usecs) */  	const unsigned int	poll_time_us; -	/* Called during startup */ -	void (*init)(void); -	/* Called before finish */ -	void (*exit)(void);  };  #endif diff --git a/include/linux/platform_data/si5351.h b/include/linux/platform_data/si5351.h new file mode 100644 index 00000000000..92dabcaf649 --- /dev/null +++ b/include/linux/platform_data/si5351.h @@ -0,0 +1,114 @@ +/* + * Si5351A/B/C programmable clock generator platform_data. + */ + +#ifndef __LINUX_PLATFORM_DATA_SI5351_H__ +#define __LINUX_PLATFORM_DATA_SI5351_H__ + +struct clk; + +/** + * enum si5351_variant - SiLabs Si5351 chip variant + * @SI5351_VARIANT_A: Si5351A (8 output clocks, XTAL input) + * @SI5351_VARIANT_A3: Si5351A MSOP10 (3 output clocks, XTAL input) + * @SI5351_VARIANT_B: Si5351B (8 output clocks, XTAL/VXCO input) + * @SI5351_VARIANT_C: Si5351C (8 output clocks, XTAL/CLKIN input) + */ +enum si5351_variant { +	SI5351_VARIANT_A = 1, +	SI5351_VARIANT_A3 = 2, +	SI5351_VARIANT_B = 3, +	SI5351_VARIANT_C = 4, +}; + +/** + * enum si5351_pll_src - Si5351 pll clock source + * @SI5351_PLL_SRC_DEFAULT: default, do not change eeprom config + * @SI5351_PLL_SRC_XTAL: pll source clock is XTAL input + * @SI5351_PLL_SRC_CLKIN: pll source clock is CLKIN input (Si5351C only) + */ +enum si5351_pll_src { +	SI5351_PLL_SRC_DEFAULT = 0, +	SI5351_PLL_SRC_XTAL = 1, +	SI5351_PLL_SRC_CLKIN = 2, +}; + +/** + * enum si5351_multisynth_src - Si5351 multisynth clock source + * @SI5351_MULTISYNTH_SRC_DEFAULT: default, do not change eeprom config + * @SI5351_MULTISYNTH_SRC_VCO0: multisynth source clock is VCO0 + * @SI5351_MULTISYNTH_SRC_VCO1: multisynth source clock is VCO1/VXCO + */ +enum si5351_multisynth_src { +	SI5351_MULTISYNTH_SRC_DEFAULT = 0, +	SI5351_MULTISYNTH_SRC_VCO0 = 1, +	SI5351_MULTISYNTH_SRC_VCO1 = 2, +}; + +/** + * enum si5351_clkout_src - Si5351 clock output clock source + * @SI5351_CLKOUT_SRC_DEFAULT: default, do not change eeprom config + * @SI5351_CLKOUT_SRC_MSYNTH_N: clkout N source clock is multisynth N + * @SI5351_CLKOUT_SRC_MSYNTH_0_4: clkout N source clock is multisynth 0 (N<4) + *                                or 4 (N>=4) + * @SI5351_CLKOUT_SRC_XTAL: clkout N source clock is XTAL + * @SI5351_CLKOUT_SRC_CLKIN: clkout N source clock is CLKIN (Si5351C only) + */ +enum si5351_clkout_src { +	SI5351_CLKOUT_SRC_DEFAULT = 0, +	SI5351_CLKOUT_SRC_MSYNTH_N = 1, +	SI5351_CLKOUT_SRC_MSYNTH_0_4 = 2, +	SI5351_CLKOUT_SRC_XTAL = 3, +	SI5351_CLKOUT_SRC_CLKIN = 4, +}; + +/** + * enum si5351_drive_strength - Si5351 clock output drive strength + * @SI5351_DRIVE_DEFAULT: default, do not change eeprom config + * @SI5351_DRIVE_2MA: 2mA clock output drive strength + * @SI5351_DRIVE_4MA: 4mA clock output drive strength + * @SI5351_DRIVE_6MA: 6mA clock output drive strength + * @SI5351_DRIVE_8MA: 8mA clock output drive strength + */ +enum si5351_drive_strength { +	SI5351_DRIVE_DEFAULT = 0, +	SI5351_DRIVE_2MA = 2, +	SI5351_DRIVE_4MA = 4, +	SI5351_DRIVE_6MA = 6, +	SI5351_DRIVE_8MA = 8, +}; + +/** + * struct si5351_clkout_config - Si5351 clock output configuration + * @clkout: clkout number + * @multisynth_src: multisynth source clock + * @clkout_src: clkout source clock + * @pll_master: if true, clkout can also change pll rate + * @drive: output drive strength + * @rate: initial clkout rate, or default if 0 + */ +struct si5351_clkout_config { +	enum si5351_multisynth_src multisynth_src; +	enum si5351_clkout_src clkout_src; +	enum si5351_drive_strength drive; +	bool pll_master; +	unsigned long rate; +}; + +/** + * struct si5351_platform_data - Platform data for the Si5351 clock driver + * @variant: Si5351 chip variant + * @clk_xtal: xtal input clock + * @clk_clkin: clkin input clock + * @pll_src: array of pll source clock setting + * @clkout: array of clkout configuration + */ +struct si5351_platform_data { +	enum si5351_variant variant; +	struct clk *clk_xtal; +	struct clk *clk_clkin; +	enum si5351_pll_src pll_src[2]; +	struct si5351_clkout_config clkout[8]; +}; + +#endif diff --git a/include/linux/platform_data/spi-s3c64xx.h b/include/linux/platform_data/spi-s3c64xx.h index ceba18d23a5..8447f634c7f 100644 --- a/include/linux/platform_data/spi-s3c64xx.h +++ b/include/linux/platform_data/spi-s3c64xx.h @@ -11,6 +11,8 @@  #ifndef __S3C64XX_PLAT_SPI_H  #define __S3C64XX_PLAT_SPI_H +#include <linux/dmaengine.h> +  struct platform_device;  /** @@ -38,6 +40,7 @@ struct s3c64xx_spi_info {  	int src_clk_nr;  	int num_cs;  	int (*cfg_gpio)(void); +	dma_filter_fn filter;  };  /** diff --git a/include/linux/platform_data/st1232_pdata.h b/include/linux/platform_data/st1232_pdata.h new file mode 100644 index 00000000000..cac3e7b4c45 --- /dev/null +++ b/include/linux/platform_data/st1232_pdata.h @@ -0,0 +1,13 @@ +#ifndef _LINUX_ST1232_PDATA_H +#define _LINUX_ST1232_PDATA_H + +/* + * Optional platform data + * + * Use this if you want the driver to drive the reset pin. + */ +struct st1232_pdata { +	int reset_gpio; +}; + +#endif diff --git a/include/linux/platform_data/usb-exynos.h b/include/linux/platform_data/usb-ohci-exynos.h index c256c595be5..c256c595be5 100644 --- a/include/linux/platform_data/usb-exynos.h +++ b/include/linux/platform_data/usb-ohci-exynos.h diff --git a/include/linux/platform_data/video-vt8500lcdfb.h b/include/linux/platform_data/video-vt8500lcdfb.h deleted file mode 100644 index 7f399c370fe..00000000000 --- a/include/linux/platform_data/video-vt8500lcdfb.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - *  VT8500/WM8505 Frame Buffer platform data definitions - * - *  Copyright (C) 2010 Ed Spiridonov <edo.rus@gmail.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef _VT8500FB_H -#define _VT8500FB_H - -#include <linux/fb.h> - -struct vt8500fb_platform_data { -	struct fb_videomode	mode; -	u32			xres_virtual; -	u32			yres_virtual; -	u32			bpp; -	unsigned long		video_mem_phys; -	void			*video_mem_virt; -	unsigned long		video_mem_len; -}; - -#endif /* _VT8500FB_H */ diff --git a/include/linux/platform_data/video_s3c.h b/include/linux/platform_data/video_s3c.h new file mode 100644 index 00000000000..48883995f47 --- /dev/null +++ b/include/linux/platform_data/video_s3c.h @@ -0,0 +1,54 @@ +#ifndef __PLATFORM_DATA_VIDEO_S3C +#define __PLATFORM_DATA_VIDEO_S3C + +/* S3C_FB_MAX_WIN + * Set to the maximum number of windows that any of the supported hardware + * can use. Since the platform data uses this for an array size, having it + * set to the maximum of any version of the hardware can do is safe. + */ +#define S3C_FB_MAX_WIN	(5) + +/** + * struct s3c_fb_pd_win - per window setup data + * @xres     : The window X size. + * @yres     : The window Y size. + * @virtual_x: The virtual X size. + * @virtual_y: The virtual Y size. + */ +struct s3c_fb_pd_win { +	unsigned short		default_bpp; +	unsigned short		max_bpp; +	unsigned short		xres; +	unsigned short		yres; +	unsigned short		virtual_x; +	unsigned short		virtual_y; +}; + +/** + * struct s3c_fb_platdata -  S3C driver platform specific information + * @setup_gpio: Setup the external GPIO pins to the right state to transfer + *		the data from the display system to the connected display + *		device. + * @vidcon0: The base vidcon0 values to control the panel data format. + * @vidcon1: The base vidcon1 values to control the panel data output. + * @vtiming: Video timing when connected to a RGB type panel. + * @win: The setup data for each hardware window, or NULL for unused. + * @display_mode: The LCD output display mode. + * + * The platform data supplies the video driver with all the information + * it requires to work with the display(s) attached to the machine. It + * controls the initial mode, the number of display windows (0 is always + * the base framebuffer) that are initialised etc. + * + */ +struct s3c_fb_platdata { +	void	(*setup_gpio)(void); + +	struct s3c_fb_pd_win	*win[S3C_FB_MAX_WIN]; +	struct fb_videomode     *vtiming; + +	u32			 vidcon0; +	u32			 vidcon1; +}; + +#endif diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index c082c71f722..9abf1db6aea 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -20,12 +20,12 @@  struct mfd_cell;  struct platform_device { -	const char	* name; +	const char	*name;  	int		id;  	bool		id_auto;  	struct device	dev;  	u32		num_resources; -	struct resource	* resource; +	struct resource	*resource;  	const struct platform_device_id	*id_entry; @@ -47,9 +47,12 @@ extern struct bus_type platform_bus_type;  extern struct device platform_bus;  extern void arch_setup_pdev_archdata(struct platform_device *); -extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int); +extern struct resource *platform_get_resource(struct platform_device *, +					      unsigned int, unsigned int);  extern int platform_get_irq(struct platform_device *, unsigned int); -extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *); +extern struct resource *platform_get_resource_byname(struct platform_device *, +						     unsigned int, +						     const char *);  extern int platform_get_irq_byname(struct platform_device *, const char *);  extern int platform_add_devices(struct platform_device **, int); @@ -161,7 +164,8 @@ extern struct platform_device *platform_device_alloc(const char *name, int id);  extern int platform_device_add_resources(struct platform_device *pdev,  					 const struct resource *res,  					 unsigned int num); -extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size); +extern int platform_device_add_data(struct platform_device *pdev, +				    const void *data, size_t size);  extern int platform_device_add(struct platform_device *pdev);  extern void platform_device_del(struct platform_device *pdev);  extern void platform_device_put(struct platform_device *pdev); @@ -190,7 +194,8 @@ static inline void *platform_get_drvdata(const struct platform_device *pdev)  	return dev_get_drvdata(&pdev->dev);  } -static inline void platform_set_drvdata(struct platform_device *pdev, void *data) +static inline void platform_set_drvdata(struct platform_device *pdev, +					void *data)  {  	dev_set_drvdata(&pdev->dev, data);  } @@ -222,10 +227,10 @@ static void __exit __platform_driver##_exit(void) \  } \  module_exit(__platform_driver##_exit); -extern struct platform_device *platform_create_bundle(struct platform_driver *driver, -					int (*probe)(struct platform_device *), -					struct resource *res, unsigned int n_res, -					const void *data, size_t size); +extern struct platform_device *platform_create_bundle( +	struct platform_driver *driver, int (*probe)(struct platform_device *), +	struct resource *res, unsigned int n_res, +	const void *data, size_t size);  /* early platform driver interface */  struct early_platform_driver { diff --git a/include/linux/pm.h b/include/linux/pm.h index e5d7230332a..a224c7f5c37 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -34,6 +34,19 @@  extern void (*pm_power_off)(void);  extern void (*pm_power_off_prepare)(void); +struct device; /* we have a circular dep with device.h */ +#ifdef CONFIG_VT_CONSOLE_SLEEP +extern void pm_vt_switch_required(struct device *dev, bool required); +extern void pm_vt_switch_unregister(struct device *dev); +#else +static inline void pm_vt_switch_required(struct device *dev, bool required) +{ +} +static inline void pm_vt_switch_unregister(struct device *dev) +{ +} +#endif /* CONFIG_VT_CONSOLE_SLEEP */ +  /*   * Device power management   */ diff --git a/include/linux/pm2301_charger.h b/include/linux/pm2301_charger.h index fc3f026922a..85c16defe11 100644 --- a/include/linux/pm2301_charger.h +++ b/include/linux/pm2301_charger.h @@ -48,7 +48,7 @@ struct pm2xxx_charger_platform_data {  	size_t num_supplicants;  	int i2c_bus;  	const char *label; -	int irq_number; +	int gpio_irq_number;  	unsigned int lpn_gpio;  	int irq_type;  }; diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 042058fdb0a..60bac697a91 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -55,6 +55,7 @@ struct cpu_timer_list {  /* POSIX.1b interval timer structure. */  struct k_itimer {  	struct list_head list;		/* free/ allocate list */ +	struct hlist_node t_hash;  	spinlock_t it_lock;  	clockid_t it_clock;		/* which timer type */  	timer_t it_id;			/* timer id */ diff --git a/include/linux/power/ab8500.h b/include/linux/power/ab8500.h new file mode 100644 index 00000000000..cdbb6c2a8c5 --- /dev/null +++ b/include/linux/power/ab8500.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) ST-Ericsson 2013 + * Author: Hongbo Zhang <hongbo.zhang@linaro.com> + * License terms: GNU General Public License v2 + */ + +#ifndef PWR_AB8500_H +#define PWR_AB8500_H + +extern const struct abx500_res_to_temp ab8500_temp_tbl_a_thermistor[]; +extern const int ab8500_temp_tbl_a_size; + +extern const struct abx500_res_to_temp ab8500_temp_tbl_b_thermistor[]; +extern const int ab8500_temp_tbl_b_size; + +#endif /* PWR_AB8500_H */ diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 002a99f9633..3828cefb4f6 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -171,6 +171,12 @@ struct power_supply {  	char **supplied_to;  	size_t num_supplicants; +	char **supplied_from; +	size_t num_supplies; +#ifdef CONFIG_OF +	struct device_node *of_node; +#endif +  	int (*get_property)(struct power_supply *psy,  			    enum power_supply_property psp,  			    union power_supply_propval *val); diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 5a710b9c578..87a03c746f1 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -93,14 +93,20 @@ do { \  #else /* !CONFIG_PREEMPT_COUNT */ -#define preempt_disable()		do { } while (0) -#define sched_preempt_enable_no_resched()	do { } while (0) -#define preempt_enable_no_resched()	do { } while (0) -#define preempt_enable()		do { } while (0) +/* + * Even if we don't have any preemption, we need preempt disable/enable + * to be barriers, so that we don't have things like get_user/put_user + * that can cause faults and scheduling migrate into our preempt-protected + * region. + */ +#define preempt_disable()		barrier() +#define sched_preempt_enable_no_resched()	barrier() +#define preempt_enable_no_resched()	barrier() +#define preempt_enable()		barrier() -#define preempt_disable_notrace()		do { } while (0) -#define preempt_enable_no_resched_notrace()	do { } while (0) -#define preempt_enable_notrace()		do { } while (0) +#define preempt_disable_notrace()		barrier() +#define preempt_enable_no_resched_notrace()	barrier() +#define preempt_enable_notrace()		barrier()  #endif /* CONFIG_PREEMPT_COUNT */ diff --git a/include/linux/printk.h b/include/linux/printk.h index 1249a54d17e..6af944ab38f 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -1,6 +1,7 @@  #ifndef __KERNEL_PRINTK__  #define __KERNEL_PRINTK__ +#include <stdarg.h>  #include <linux/init.h>  #include <linux/kern_levels.h> @@ -95,8 +96,14 @@ int no_printk(const char *fmt, ...)  	return 0;  } +#ifdef CONFIG_EARLY_PRINTK  extern asmlinkage __printf(1, 2)  void early_printk(const char *fmt, ...); +void early_vprintk(const char *fmt, va_list ap); +#else +static inline __printf(1, 2) __cold +void early_printk(const char *s, ...) { } +#endif  #ifdef CONFIG_PRINTK  asmlinkage __printf(5, 0) @@ -134,8 +141,13 @@ extern int printk_delay_msec;  extern int dmesg_restrict;  extern int kptr_restrict; +extern void wake_up_klogd(void); +  void log_buf_kexec_setup(void);  void __init setup_log_buf(int early); +void dump_stack_set_arch_desc(const char *fmt, ...); +void dump_stack_print_info(const char *log_lvl); +void show_regs_print_info(const char *log_lvl);  #else  static inline __printf(1, 0)  int vprintk(const char *s, va_list args) @@ -162,6 +174,10 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies,  	return false;  } +static inline void wake_up_klogd(void) +{ +} +  static inline void log_buf_kexec_setup(void)  {  } @@ -169,6 +185,18 @@ static inline void log_buf_kexec_setup(void)  static inline void setup_log_buf(int early)  {  } + +static inline void dump_stack_set_arch_desc(const char *fmt, ...) +{ +} + +static inline void dump_stack_print_info(const char *log_lvl) +{ +} + +static inline void show_regs_print_info(const char *log_lvl) +{ +}  #endif  extern void dump_stack(void) __cold; diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 8307f2f94d8..608e60a74c3 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -1,316 +1,79 @@ -#ifndef _LINUX_PROC_FS_H -#define _LINUX_PROC_FS_H - -#include <linux/slab.h> -#include <linux/fs.h> -#include <linux/spinlock.h> -#include <linux/magic.h> -#include <linux/atomic.h> - -struct net; -struct completion; -struct mm_struct; -  /*   * The proc filesystem constants/structures   */ +#ifndef _LINUX_PROC_FS_H +#define _LINUX_PROC_FS_H -/* - * Offset of the first process in the /proc root directory.. - */ -#define FIRST_PROCESS_ENTRY 256 - -/* Worst case buffer size needed for holding an integer. */ -#define PROC_NUMBUF 13 - -/* - * We always define these enumerators - */ - -enum { -	PROC_ROOT_INO		= 1, -	PROC_IPC_INIT_INO	= 0xEFFFFFFFU, -	PROC_UTS_INIT_INO	= 0xEFFFFFFEU, -	PROC_USER_INIT_INO	= 0xEFFFFFFDU, -	PROC_PID_INIT_INO	= 0xEFFFFFFCU, -}; - -/* - * This is not completely implemented yet. The idea is to - * create an in-memory tree (like the actual /proc filesystem - * tree) of these proc_dir_entries, so that we can dynamically - * add new files to /proc. - * - * The "next" pointer creates a linked list of one /proc directory, - * while parent/subdir create the directory structure (every - * /proc file has a parent, but "subdir" is NULL for all - * non-directory entries). - */ - -typedef	int (read_proc_t)(char *page, char **start, off_t off, -			  int count, int *eof, void *data); -typedef	int (write_proc_t)(struct file *file, const char __user *buffer, -			   unsigned long count, void *data); - -struct proc_dir_entry { -	unsigned int low_ino; -	umode_t mode; -	nlink_t nlink; -	kuid_t uid; -	kgid_t gid; -	loff_t size; -	const struct inode_operations *proc_iops; -	/* -	 * NULL ->proc_fops means "PDE is going away RSN" or -	 * "PDE is just created". In either case, e.g. ->read_proc won't be -	 * called because it's too late or too early, respectively. -	 * -	 * If you're allocating ->proc_fops dynamically, save a pointer -	 * somewhere. -	 */ -	const struct file_operations *proc_fops; -	struct proc_dir_entry *next, *parent, *subdir; -	void *data; -	read_proc_t *read_proc; -	write_proc_t *write_proc; -	atomic_t count;		/* use count */ -	int pde_users;	/* number of callers into module in progress */ -	struct completion *pde_unload_completion; -	struct list_head pde_openers;	/* who did ->open, but not ->release */ -	spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ -	u8 namelen; -	char name[]; -}; - -enum kcore_type { -	KCORE_TEXT, -	KCORE_VMALLOC, -	KCORE_RAM, -	KCORE_VMEMMAP, -	KCORE_OTHER, -}; - -struct kcore_list { -	struct list_head list; -	unsigned long addr; -	size_t size; -	int type; -}; +#include <linux/types.h> +#include <linux/fs.h> -struct vmcore { -	struct list_head list; -	unsigned long long paddr; -	unsigned long long size; -	loff_t offset; -}; +struct proc_dir_entry;  #ifdef CONFIG_PROC_FS  extern void proc_root_init(void); - -void proc_flush_task(struct task_struct *task); - -extern struct proc_dir_entry *create_proc_entry(const char *name, umode_t mode, -						struct proc_dir_entry *parent); -struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, -				struct proc_dir_entry *parent, -				const struct file_operations *proc_fops, -				void *data); -extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent); - -struct pid_namespace; - -extern int pid_ns_prepare_proc(struct pid_namespace *ns); -extern void pid_ns_release_proc(struct pid_namespace *ns); - -/* - * proc_tty.c - */ -struct tty_driver; -#ifdef CONFIG_TTY -extern void proc_tty_init(void); -#else -static inline void proc_tty_init(void) -{ } -#endif -extern void proc_tty_register_driver(struct tty_driver *driver); -extern void proc_tty_unregister_driver(struct tty_driver *driver); - -/* - * proc_devtree.c - */ -#ifdef CONFIG_PROC_DEVICETREE -struct device_node; -struct property; -extern void proc_device_tree_init(void); -extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); -extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop); -extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde, -					 struct property *prop); -extern void proc_device_tree_update_prop(struct proc_dir_entry *pde, -					 struct property *newprop, -					 struct property *oldprop); -#endif /* CONFIG_PROC_DEVICETREE */ +extern void proc_flush_task(struct task_struct *);  extern struct proc_dir_entry *proc_symlink(const char *,  		struct proc_dir_entry *, const char *); -extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *); -extern struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode, -			struct proc_dir_entry *parent); +extern struct proc_dir_entry *proc_mkdir(const char *, struct proc_dir_entry *); +extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t, +					      struct proc_dir_entry *, void *); +extern struct proc_dir_entry *proc_mkdir_mode(const char *, umode_t, +					      struct proc_dir_entry *); +  +extern struct proc_dir_entry *proc_create_data(const char *, umode_t, +					       struct proc_dir_entry *, +					       const struct file_operations *, +					       void *); -static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode, -	struct proc_dir_entry *parent, const struct file_operations *proc_fops) +static inline struct proc_dir_entry *proc_create( +	const char *name, umode_t mode, struct proc_dir_entry *parent, +	const struct file_operations *proc_fops)  {  	return proc_create_data(name, mode, parent, proc_fops, NULL);  } -static inline struct proc_dir_entry *create_proc_read_entry(const char *name, -	umode_t mode, struct proc_dir_entry *base,  -	read_proc_t *read_proc, void * data) -{ -	struct proc_dir_entry *res=create_proc_entry(name,mode,base); -	if (res) { -		res->read_proc=read_proc; -		res->data=data; -	} -	return res; -} -  -extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name, -	struct proc_dir_entry *parent); - -extern struct file *proc_ns_fget(int fd); -extern bool proc_ns_inode(struct inode *inode); +extern void proc_set_size(struct proc_dir_entry *, loff_t); +extern void proc_set_user(struct proc_dir_entry *, kuid_t, kgid_t); +extern void *PDE_DATA(const struct inode *); +extern void *proc_get_parent_data(const struct inode *); +extern void proc_remove(struct proc_dir_entry *); +extern void remove_proc_entry(const char *, struct proc_dir_entry *); +extern int remove_proc_subtree(const char *, struct proc_dir_entry *); -extern int proc_alloc_inum(unsigned int *pino); -extern void proc_free_inum(unsigned int inum); -#else +#else /* CONFIG_PROC_FS */  static inline void proc_flush_task(struct task_struct *task)  {  } -static inline struct proc_dir_entry *create_proc_entry(const char *name, -	umode_t mode, struct proc_dir_entry *parent) { return NULL; } - -#define proc_create(name, mode, parent, fops)  ({ (void)(mode), NULL; }) - -static inline struct proc_dir_entry *proc_create_data(const char *name, -	umode_t mode, struct proc_dir_entry *parent, -	const struct file_operations *proc_fops, void *data) -{ -	return NULL; -} -#define remove_proc_entry(name, parent) do {} while (0) -  static inline struct proc_dir_entry *proc_symlink(const char *name, -		struct proc_dir_entry *parent,const char *dest) {return NULL;} +		struct proc_dir_entry *parent,const char *dest) { return NULL;}  static inline struct proc_dir_entry *proc_mkdir(const char *name,  	struct proc_dir_entry *parent) {return NULL;} +static inline struct proc_dir_entry *proc_mkdir_data(const char *name, +	umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; }  static inline struct proc_dir_entry *proc_mkdir_mode(const char *name,  	umode_t mode, struct proc_dir_entry *parent) { return NULL; } +#define proc_create(name, mode, parent, proc_fops) ({NULL;}) +#define proc_create_data(name, mode, parent, proc_fops, data) ({NULL;}) -static inline struct proc_dir_entry *create_proc_read_entry(const char *name, -	umode_t mode, struct proc_dir_entry *base,  -	read_proc_t *read_proc, void * data) { return NULL; } - -struct tty_driver; -static inline void proc_tty_register_driver(struct tty_driver *driver) {}; -static inline void proc_tty_unregister_driver(struct tty_driver *driver) {}; +static inline void proc_set_size(struct proc_dir_entry *de, loff_t size) {} +static inline void proc_set_user(struct proc_dir_entry *de, kuid_t uid, kgid_t gid) {} +static inline void *PDE_DATA(const struct inode *inode) {BUG(); return NULL;} +static inline void *proc_get_parent_data(const struct inode *inode) { BUG(); return NULL; } -static inline int pid_ns_prepare_proc(struct pid_namespace *ns) -{ -	return 0; -} - -static inline void pid_ns_release_proc(struct pid_namespace *ns) -{ -} - -static inline struct file *proc_ns_fget(int fd) -{ -	return ERR_PTR(-EINVAL); -} - -static inline bool proc_ns_inode(struct inode *inode) -{ -	return false; -} +static inline void proc_remove(struct proc_dir_entry *de) {} +#define remove_proc_entry(name, parent) do {} while (0) +static inline int remove_proc_subtree(const char *name, struct proc_dir_entry *parent) { return 0; } -static inline int proc_alloc_inum(unsigned int *inum) -{ -	*inum = 1; -	return 0; -} -static inline void proc_free_inum(unsigned int inum) -{ -}  #endif /* CONFIG_PROC_FS */ -#if !defined(CONFIG_PROC_KCORE) -static inline void -kclist_add(struct kcore_list *new, void *addr, size_t size, int type) +static inline struct proc_dir_entry *proc_net_mkdir( +	struct net *net, const char *name, struct proc_dir_entry *parent)  { +	return proc_mkdir_data(name, 0, parent, net);  } -#else -extern void kclist_add(struct kcore_list *, void *, size_t, int type); -#endif - -struct nsproxy; -struct proc_ns_operations { -	const char *name; -	int type; -	void *(*get)(struct task_struct *task); -	void (*put)(void *ns); -	int (*install)(struct nsproxy *nsproxy, void *ns); -	unsigned int (*inum)(void *ns); -}; -extern const struct proc_ns_operations netns_operations; -extern const struct proc_ns_operations utsns_operations; -extern const struct proc_ns_operations ipcns_operations; -extern const struct proc_ns_operations pidns_operations; -extern const struct proc_ns_operations userns_operations; -extern const struct proc_ns_operations mntns_operations; - -union proc_op { -	int (*proc_get_link)(struct dentry *, struct path *); -	int (*proc_read)(struct task_struct *task, char *page); -	int (*proc_show)(struct seq_file *m, -		struct pid_namespace *ns, struct pid *pid, -		struct task_struct *task); -}; - -struct ctl_table_header; -struct ctl_table; - -struct proc_inode { -	struct pid *pid; -	int fd; -	union proc_op op; -	struct proc_dir_entry *pde; -	struct ctl_table_header *sysctl; -	struct ctl_table *sysctl_entry; -	void *ns; -	const struct proc_ns_operations *ns_ops; -	struct inode vfs_inode; -}; - -static inline struct proc_inode *PROC_I(const struct inode *inode) -{ -	return container_of(inode, struct proc_inode, vfs_inode); -} - -static inline struct proc_dir_entry *PDE(const struct inode *inode) -{ -	return PROC_I(inode)->pde; -} - -static inline struct net *PDE_NET(struct proc_dir_entry *pde) -{ -	return pde->parent->data; -} - -#include <linux/signal.h> -void render_sigset_t(struct seq_file *m, const char *header, sigset_t *set);  #endif /* _LINUX_PROC_FS_H */ diff --git a/include/linux/proc_ns.h b/include/linux/proc_ns.h new file mode 100644 index 00000000000..34a1e105bef --- /dev/null +++ b/include/linux/proc_ns.h @@ -0,0 +1,74 @@ +/* + * procfs namespace bits + */ +#ifndef _LINUX_PROC_NS_H +#define _LINUX_PROC_NS_H + +struct pid_namespace; +struct nsproxy; + +struct proc_ns_operations { +	const char *name; +	int type; +	void *(*get)(struct task_struct *task); +	void (*put)(void *ns); +	int (*install)(struct nsproxy *nsproxy, void *ns); +	unsigned int (*inum)(void *ns); +}; + +struct proc_ns { +	void *ns; +	const struct proc_ns_operations *ns_ops; +}; + +extern const struct proc_ns_operations netns_operations; +extern const struct proc_ns_operations utsns_operations; +extern const struct proc_ns_operations ipcns_operations; +extern const struct proc_ns_operations pidns_operations; +extern const struct proc_ns_operations userns_operations; +extern const struct proc_ns_operations mntns_operations; + +/* + * We always define these enumerators + */ +enum { +	PROC_ROOT_INO		= 1, +	PROC_IPC_INIT_INO	= 0xEFFFFFFFU, +	PROC_UTS_INIT_INO	= 0xEFFFFFFEU, +	PROC_USER_INIT_INO	= 0xEFFFFFFDU, +	PROC_PID_INIT_INO	= 0xEFFFFFFCU, +}; + +#ifdef CONFIG_PROC_FS + +extern int pid_ns_prepare_proc(struct pid_namespace *ns); +extern void pid_ns_release_proc(struct pid_namespace *ns); +extern struct file *proc_ns_fget(int fd); +extern struct proc_ns *get_proc_ns(struct inode *); +extern int proc_alloc_inum(unsigned int *pino); +extern void proc_free_inum(unsigned int inum); +extern bool proc_ns_inode(struct inode *inode); + +#else /* CONFIG_PROC_FS */ + +static inline int pid_ns_prepare_proc(struct pid_namespace *ns) { return 0; } +static inline void pid_ns_release_proc(struct pid_namespace *ns) {} + +static inline struct file *proc_ns_fget(int fd) +{ +	return ERR_PTR(-EINVAL); +} + +static inline struct proc_ns *get_proc_ns(struct inode *inode) { return NULL; } + +static inline int proc_alloc_inum(unsigned int *inum) +{ +	*inum = 1; +	return 0; +} +static inline void proc_free_inum(unsigned int inum) {} +static inline bool proc_ns_inode(struct inode *inode) { return false; } + +#endif /* CONFIG_PROC_FS */ + +#endif /* _LINUX_PROC_NS_H */ diff --git a/include/linux/profile.h b/include/linux/profile.h index 21123902366..aaad3861beb 100644 --- a/include/linux/profile.h +++ b/include/linux/profile.h @@ -18,10 +18,10 @@ struct pt_regs;  struct notifier_block;  #if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS) -void create_prof_cpu_mask(struct proc_dir_entry *de); +void create_prof_cpu_mask(void);  int create_proc_profile(void);  #else -static inline void create_prof_cpu_mask(struct proc_dir_entry *de) +static inline void create_prof_cpu_mask(void)  {  } diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index cb6ab5feab6..9974975d40d 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -26,6 +26,13 @@  struct persistent_ram_buffer;  struct rs_control; +struct persistent_ram_ecc_info { +	int block_size; +	int ecc_size; +	int symsize; +	int poly; +}; +  struct persistent_ram_zone {  	phys_addr_t paddr;  	size_t size; @@ -39,15 +46,14 @@ struct persistent_ram_zone {  	struct rs_control *rs_decoder;  	int corrected_bytes;  	int bad_blocks; -	int ecc_block_size; -	int ecc_size; +	struct persistent_ram_ecc_info ecc_info;  	char *old_log;  	size_t old_log_size;  };  struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, -					       u32 sig, int ecc_size); +			u32 sig, struct persistent_ram_ecc_info *ecc_info);  void persistent_ram_free(struct persistent_ram_zone *prz);  void persistent_ram_zap(struct persistent_ram_zone *prz); @@ -74,7 +80,7 @@ struct ramoops_platform_data {  	unsigned long	console_size;  	unsigned long	ftrace_size;  	int		dump_oops; -	int		ecc_size; +	struct persistent_ram_ecc_info ecc_info;  };  #endif diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index 5bf5500db83..69e37c2d1ea 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h @@ -6,7 +6,13 @@ struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir,  extern struct dentry *ramfs_mount(struct file_system_type *fs_type,  	 int flags, const char *dev_name, void *data); -#ifndef CONFIG_MMU +#ifdef CONFIG_MMU +static inline int +ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize) +{ +	return 0; +} +#else  extern int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize);  extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file,  						   unsigned long addr, diff --git a/include/linux/rculist_bl.h b/include/linux/rculist_bl.h index cf1244fbf3b..4f216c59e7d 100644 --- a/include/linux/rculist_bl.h +++ b/include/linux/rculist_bl.h @@ -20,7 +20,7 @@ static inline void hlist_bl_set_first_rcu(struct hlist_bl_head *h,  static inline struct hlist_bl_node *hlist_bl_first_rcu(struct hlist_bl_head *h)  {  	return (struct hlist_bl_node *) -		((unsigned long)rcu_dereference(h->first) & ~LIST_BL_LOCKMASK); +		((unsigned long)rcu_dereference_check(h->first, hlist_bl_is_locked(h)) & ~LIST_BL_LOCKMASK);  }  /** diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index b758ce17b30..9ed2c9a4de4 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -80,6 +80,7 @@ extern void do_trace_rcu_torture_read(char *rcutorturename,  #define UINT_CMP_LT(a, b)	(UINT_MAX / 2 < (a) - (b))  #define ULONG_CMP_GE(a, b)	(ULONG_MAX / 2 >= (a) - (b))  #define ULONG_CMP_LT(a, b)	(ULONG_MAX / 2 < (a) - (b)) +#define ulong2long(a)		(*(long *)(&(a)))  /* Exported common interfaces */ diff --git a/include/linux/regmap.h b/include/linux/regmap.h index bf77dfdabef..02d84e24b7c 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -389,6 +389,7 @@ int regmap_update_bits_check(struct regmap *map, unsigned int reg,  			     bool *change);  int regmap_get_val_bytes(struct regmap *map);  int regmap_async_complete(struct regmap *map); +bool regmap_can_raw_write(struct regmap *map);  int regcache_sync(struct regmap *map);  int regcache_sync_region(struct regmap *map, unsigned int min, diff --git a/include/linux/regulator/ab8500.h b/include/linux/regulator/ab8500.h index 7bd73bbdfd1..7c5ff0c5577 100644 --- a/include/linux/regulator/ab8500.h +++ b/include/linux/regulator/ab8500.h @@ -5,11 +5,14 @@   *   * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson   *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson + *          Daniel Willerud <daniel.willerud@stericsson.com> for ST-Ericsson   */  #ifndef __LINUX_MFD_AB8500_REGULATOR_H  #define __LINUX_MFD_AB8500_REGULATOR_H +#include <linux/platform_device.h> +  /* AB8500 regulators */  enum ab8500_regulator_id {  	AB8500_LDO_AUX1, @@ -17,7 +20,6 @@ enum ab8500_regulator_id {  	AB8500_LDO_AUX3,  	AB8500_LDO_INTCORE,  	AB8500_LDO_TVOUT, -	AB8500_LDO_USB,  	AB8500_LDO_AUDIO,  	AB8500_LDO_ANAMIC1,  	AB8500_LDO_ANAMIC2, @@ -26,7 +28,28 @@ enum ab8500_regulator_id {  	AB8500_NUM_REGULATORS,  }; -/* AB9450 regulators */ +/* AB8505 regulators */ +enum ab8505_regulator_id { +	AB8505_LDO_AUX1, +	AB8505_LDO_AUX2, +	AB8505_LDO_AUX3, +	AB8505_LDO_AUX4, +	AB8505_LDO_AUX5, +	AB8505_LDO_AUX6, +	AB8505_LDO_INTCORE, +	AB8505_LDO_ADC, +	AB8505_LDO_USB, +	AB8505_LDO_AUDIO, +	AB8505_LDO_ANAMIC1, +	AB8505_LDO_ANAMIC2, +	AB8505_LDO_AUX8, +	AB8505_LDO_ANA, +	AB8505_SYSCLKREQ_2, +	AB8505_SYSCLKREQ_4, +	AB8505_NUM_REGULATORS, +}; + +/* AB9540 regulators */  enum ab9540_regulator_id {  	AB9540_LDO_AUX1,  	AB9540_LDO_AUX2, @@ -45,16 +68,39 @@ enum ab9540_regulator_id {  	AB9540_NUM_REGULATORS,  }; -/* AB8500 and AB9540 register initialization */ +/* AB8540 regulators */ +enum ab8540_regulator_id { +	AB8540_LDO_AUX1, +	AB8540_LDO_AUX2, +	AB8540_LDO_AUX3, +	AB8540_LDO_AUX4, +	AB8540_LDO_AUX5, +	AB8540_LDO_AUX6, +	AB8540_LDO_INTCORE, +	AB8540_LDO_TVOUT, +	AB8540_LDO_AUDIO, +	AB8540_LDO_ANAMIC1, +	AB8540_LDO_ANAMIC2, +	AB8540_LDO_DMIC, +	AB8540_LDO_ANA, +	AB8540_LDO_SDIO, +	AB8540_SYSCLKREQ_2, +	AB8540_SYSCLKREQ_4, +	AB8540_NUM_REGULATORS, +}; + +/* AB8500, AB8505, and AB9540 register initialization */  struct ab8500_regulator_reg_init {  	int id; +	u8 mask;  	u8 value;  }; -#define INIT_REGULATOR_REGISTER(_id, _value)	\ -	{					\ -		.id = _id,			\ -		.value = _value,		\ +#define INIT_REGULATOR_REGISTER(_id, _mask, _value)	\ +	{						\ +		.id = _id,				\ +		.mask = _mask,				\ +		.value = _value,			\  	}  /* AB8500 registers */ @@ -86,10 +132,58 @@ enum ab8500_regulator_reg {  	AB8500_REGUCTRL2SPARE,  	AB8500_REGUCTRLDISCH,  	AB8500_REGUCTRLDISCH2, -	AB8500_VSMPS1SEL1,  	AB8500_NUM_REGULATOR_REGISTERS,  }; +/* AB8505 registers */ +enum ab8505_regulator_reg { +	AB8505_REGUREQUESTCTRL1, +	AB8505_REGUREQUESTCTRL2, +	AB8505_REGUREQUESTCTRL3, +	AB8505_REGUREQUESTCTRL4, +	AB8505_REGUSYSCLKREQ1HPVALID1, +	AB8505_REGUSYSCLKREQ1HPVALID2, +	AB8505_REGUHWHPREQ1VALID1, +	AB8505_REGUHWHPREQ1VALID2, +	AB8505_REGUHWHPREQ2VALID1, +	AB8505_REGUHWHPREQ2VALID2, +	AB8505_REGUSWHPREQVALID1, +	AB8505_REGUSWHPREQVALID2, +	AB8505_REGUSYSCLKREQVALID1, +	AB8505_REGUSYSCLKREQVALID2, +	AB8505_REGUVAUX4REQVALID, +	AB8505_REGUMISC1, +	AB8505_VAUDIOSUPPLY, +	AB8505_REGUCTRL1VAMIC, +	AB8505_VSMPSAREGU, +	AB8505_VSMPSBREGU, +	AB8505_VSAFEREGU, /* NOTE! PRCMU register */ +	AB8505_VPLLVANAREGU, +	AB8505_EXTSUPPLYREGU, +	AB8505_VAUX12REGU, +	AB8505_VRF1VAUX3REGU, +	AB8505_VSMPSASEL1, +	AB8505_VSMPSASEL2, +	AB8505_VSMPSASEL3, +	AB8505_VSMPSBSEL1, +	AB8505_VSMPSBSEL2, +	AB8505_VSMPSBSEL3, +	AB8505_VSAFESEL1, /* NOTE! PRCMU register */ +	AB8505_VSAFESEL2, /* NOTE! PRCMU register */ +	AB8505_VSAFESEL3, /* NOTE! PRCMU register */ +	AB8505_VAUX1SEL, +	AB8505_VAUX2SEL, +	AB8505_VRF1VAUX3SEL, +	AB8505_VAUX4REQCTRL, +	AB8505_VAUX4REGU, +	AB8505_VAUX4SEL, +	AB8505_REGUCTRLDISCH, +	AB8505_REGUCTRLDISCH2, +	AB8505_REGUCTRLDISCH3, +	AB8505_CTRLVAUX5, +	AB8505_CTRLVAUX6, +	AB8505_NUM_REGULATOR_REGISTERS, +};  /* AB9540 registers */  enum ab9540_regulator_reg { @@ -139,4 +233,111 @@ enum ab9540_regulator_reg {  	AB9540_NUM_REGULATOR_REGISTERS,  }; +/* AB8540 registers */ +enum ab8540_regulator_reg { +	AB8540_REGUREQUESTCTRL1, +	AB8540_REGUREQUESTCTRL2, +	AB8540_REGUREQUESTCTRL3, +	AB8540_REGUREQUESTCTRL4, +	AB8540_REGUSYSCLKREQ1HPVALID1, +	AB8540_REGUSYSCLKREQ1HPVALID2, +	AB8540_REGUHWHPREQ1VALID1, +	AB8540_REGUHWHPREQ1VALID2, +	AB8540_REGUHWHPREQ2VALID1, +	AB8540_REGUHWHPREQ2VALID2, +	AB8540_REGUSWHPREQVALID1, +	AB8540_REGUSWHPREQVALID2, +	AB8540_REGUSYSCLKREQVALID1, +	AB8540_REGUSYSCLKREQVALID2, +	AB8540_REGUVAUX4REQVALID, +	AB8540_REGUVAUX5REQVALID, +	AB8540_REGUVAUX6REQVALID, +	AB8540_REGUVCLKBREQVALID, +	AB8540_REGUVRF1REQVALID, +	AB8540_REGUMISC1, +	AB8540_VAUDIOSUPPLY, +	AB8540_REGUCTRL1VAMIC, +	AB8540_VHSIC, +	AB8540_VSDIO, +	AB8540_VSMPS1REGU, +	AB8540_VSMPS2REGU, +	AB8540_VSMPS3REGU, +	AB8540_VPLLVANAREGU, +	AB8540_EXTSUPPLYREGU, +	AB8540_VAUX12REGU, +	AB8540_VRF1VAUX3REGU, +	AB8540_VSMPS1SEL1, +	AB8540_VSMPS1SEL2, +	AB8540_VSMPS1SEL3, +	AB8540_VSMPS2SEL1, +	AB8540_VSMPS2SEL2, +	AB8540_VSMPS2SEL3, +	AB8540_VSMPS3SEL1, +	AB8540_VSMPS3SEL2, +	AB8540_VAUX1SEL, +	AB8540_VAUX2SEL, +	AB8540_VRF1VAUX3SEL, +	AB8540_REGUCTRL2SPARE, +	AB8540_VAUX4REQCTRL, +	AB8540_VAUX4REGU, +	AB8540_VAUX4SEL, +	AB8540_VAUX5REQCTRL, +	AB8540_VAUX5REGU, +	AB8540_VAUX5SEL, +	AB8540_VAUX6REQCTRL, +	AB8540_VAUX6REGU, +	AB8540_VAUX6SEL, +	AB8540_VCLKBREQCTRL, +	AB8540_VCLKBREGU, +	AB8540_VCLKBSEL, +	AB8540_VRF1REQCTRL, +	AB8540_REGUCTRLDISCH, +	AB8540_REGUCTRLDISCH2, +	AB8540_REGUCTRLDISCH3, +	AB8540_REGUCTRLDISCH4, +	AB8540_VSIMSYSCLKCTRL, +	AB8540_VANAVPLLSEL, +	AB8540_NUM_REGULATOR_REGISTERS, +}; + +/* AB8500 external regulators */ +struct ab8500_ext_regulator_cfg { +	bool hwreq; /* requires hw mode or high power mode */ +}; + +enum ab8500_ext_regulator_id { +	AB8500_EXT_SUPPLY1, +	AB8500_EXT_SUPPLY2, +	AB8500_EXT_SUPPLY3, +	AB8500_NUM_EXT_REGULATORS, +}; + +/* AB8500 regulator platform data */ +struct ab8500_regulator_platform_data { +	int num_reg_init; +	struct ab8500_regulator_reg_init *reg_init; +	int num_regulator; +	struct regulator_init_data *regulator; +	int num_ext_regulator; +	struct regulator_init_data *ext_regulator; +}; + +#ifdef CONFIG_REGULATOR_AB8500_DEBUG +int ab8500_regulator_debug_init(struct platform_device *pdev); +int ab8500_regulator_debug_exit(struct platform_device *pdev); +#else +static inline int ab8500_regulator_debug_init(struct platform_device *pdev) +{ +	return 0; +} +static inline int ab8500_regulator_debug_exit(struct platform_device *pdev) +{ +	return 0; +} +#endif + +/* AB8500 external regulator functions. */ +int ab8500_ext_regulator_init(struct platform_device *pdev); +void ab8500_ext_regulator_exit(struct platform_device *pdev); +  #endif diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index 7bc732ce6e5..145022a8308 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -141,18 +141,18 @@ void regulator_put(struct regulator *regulator);  void devm_regulator_put(struct regulator *regulator);  /* regulator output control and status */ -int regulator_enable(struct regulator *regulator); +int __must_check regulator_enable(struct regulator *regulator);  int regulator_disable(struct regulator *regulator);  int regulator_force_disable(struct regulator *regulator);  int regulator_is_enabled(struct regulator *regulator);  int regulator_disable_deferred(struct regulator *regulator, int ms); -int regulator_bulk_get(struct device *dev, int num_consumers, -		       struct regulator_bulk_data *consumers); -int devm_regulator_bulk_get(struct device *dev, int num_consumers, -			    struct regulator_bulk_data *consumers); -int regulator_bulk_enable(int num_consumers, -			  struct regulator_bulk_data *consumers); +int __must_check regulator_bulk_get(struct device *dev, int num_consumers, +				    struct regulator_bulk_data *consumers); +int __must_check devm_regulator_bulk_get(struct device *dev, int num_consumers, +					 struct regulator_bulk_data *consumers); +int __must_check regulator_bulk_enable(int num_consumers, +				       struct regulator_bulk_data *consumers);  int regulator_bulk_disable(int num_consumers,  			   struct regulator_bulk_data *consumers);  int regulator_bulk_force_disable(int num_consumers, diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 7df93f52db0..6700cc94bdd 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -22,6 +22,7 @@  struct regmap;  struct regulator_dev;  struct regulator_init_data; +struct regulator_enable_gpio;  enum regulator_status {  	REGULATOR_STATUS_OFF, @@ -199,6 +200,8 @@ enum regulator_type {   *                output when using regulator_set_voltage_sel_regmap   * @enable_reg: Register for control when using regmap enable/disable ops   * @enable_mask: Mask for control when using regmap enable/disable ops + * @enable_is_inverted: A flag to indicate set enable_mask bits to disable + *                      when using regulator_enable_regmap and friends APIs.   * @bypass_reg: Register for control when using regmap set_bypass   * @bypass_mask: Mask for control when using regmap set_bypass   * @@ -228,6 +231,7 @@ struct regulator_desc {  	unsigned int apply_bit;  	unsigned int enable_reg;  	unsigned int enable_mask; +	bool enable_is_inverted;  	unsigned int bypass_reg;  	unsigned int bypass_mask; @@ -302,8 +306,7 @@ struct regulator_dev {  	struct dentry *debugfs; -	int ena_gpio; -	unsigned int ena_gpio_invert:1; +	struct regulator_enable_gpio *ena_pin;  	unsigned int ena_gpio_state:1;  }; @@ -329,6 +332,8 @@ int regulator_map_voltage_linear(struct regulator_dev *rdev,  				  int min_uV, int max_uV);  int regulator_map_voltage_iterate(struct regulator_dev *rdev,  				  int min_uV, int max_uV); +int regulator_map_voltage_ascend(struct regulator_dev *rdev, +				  int min_uV, int max_uV);  int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev);  int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel);  int regulator_is_enabled_regmap(struct regulator_dev *rdev); diff --git a/include/linux/regulator/max8952.h b/include/linux/regulator/max8952.h index 45e42855ad0..4dbb63a1d4a 100644 --- a/include/linux/regulator/max8952.h +++ b/include/linux/regulator/max8952.h @@ -122,13 +122,13 @@ struct max8952_platform_data {  	int gpio_vid1;  	int gpio_en; -	u8 default_mode; -	u8 dvs_mode[MAX8952_NUM_DVS_MODE]; /* MAX8952_DVS_MODEx_XXXXmV */ +	u32 default_mode; +	u32 dvs_mode[MAX8952_NUM_DVS_MODE]; /* MAX8952_DVS_MODEx_XXXXmV */ -	u8 sync_freq; -	u8 ramp_speed; +	u32 sync_freq; +	u32 ramp_speed; -	struct regulator_init_data reg_data; +	struct regulator_init_data *reg_data;  }; diff --git a/include/linux/relay.h b/include/linux/relay.h index 91cacc34c15..d7c8359693c 100644 --- a/include/linux/relay.h +++ b/include/linux/relay.h @@ -20,9 +20,6 @@  #include <linux/poll.h>  #include <linux/kref.h> -/* Needs a _much_ better name... */ -#define FIX_SIZE(x) ((((x) - 1) & PAGE_MASK) + PAGE_SIZE) -  /*   * Tracks changes to rchan/rchan_buf structs   */ diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h index c23099413ad..96a509b6be0 100644 --- a/include/linux/res_counter.h +++ b/include/linux/res_counter.h @@ -13,7 +13,7 @@   * info about what this counter is.   */ -#include <linux/cgroup.h> +#include <linux/spinlock.h>  #include <linux/errno.h>  /* diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 1342e69542f..d69cf637a15 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -4,6 +4,7 @@  #include <linux/kmemcheck.h>  #include <linux/mm.h>  #include <linux/seq_file.h> +#include <linux/poll.h>  struct ring_buffer;  struct ring_buffer_iter; @@ -96,6 +97,11 @@ __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *k  	__ring_buffer_alloc((size), (flags), &__key);	\  }) +void ring_buffer_wait(struct ring_buffer *buffer, int cpu); +int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu, +			  struct file *filp, poll_table *poll_table); + +  #define RING_BUFFER_ALL_CPUS -1  void ring_buffer_free(struct ring_buffer *buffer); diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 580b24c8b8c..c2c28975293 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -133,7 +133,13 @@ extern struct rtc_device *rtc_device_register(const char *name,  					struct device *dev,  					const struct rtc_class_ops *ops,  					struct module *owner); +extern struct rtc_device *devm_rtc_device_register(struct device *dev, +					const char *name, +					const struct rtc_class_ops *ops, +					struct module *owner);  extern void rtc_device_unregister(struct rtc_device *rtc); +extern void devm_rtc_device_unregister(struct device *dev, +					struct rtc_device *rtc);  extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm);  extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm); diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 489dd7bb28e..f28544b2f9a 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -69,6 +69,15 @@ extern int ndo_dflt_fdb_dump(struct sk_buff *skb,  			     struct netlink_callback *cb,  			     struct net_device *dev,  			     int idx); +extern int ndo_dflt_fdb_add(struct ndmsg *ndm, +			    struct nlattr *tb[], +			    struct net_device *dev, +			    const unsigned char *addr, +			     u16 flags); +extern int ndo_dflt_fdb_del(struct ndmsg *ndm, +			    struct nlattr *tb[], +			    struct net_device *dev, +			    const unsigned char *addr);  extern int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,  				   struct net_device *dev, u16 mode); diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 2d8bdaef961..5951e3f3887 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -172,6 +172,22 @@ static inline void sg_mark_end(struct scatterlist *sg)  }  /** + * sg_unmark_end - Undo setting the end of the scatterlist + * @sg:		 SG entryScatterlist + * + * Description: + *   Removes the termination marker from the given entry of the scatterlist. + * + **/ +static inline void sg_unmark_end(struct scatterlist *sg) +{ +#ifdef CONFIG_DEBUG_SG +	BUG_ON(sg->sg_magic != SG_MAGIC); +#endif +	sg->page_link &= ~0x02; +} + +/**   * sg_phys - Return physical address of an sg entry   * @sg:	     SG entry   * @@ -235,13 +251,13 @@ size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,   * sg page iterator   *   * Iterates over sg entries page-by-page.  On each successful iteration, - * @piter->page points to the current page, @piter->sg to the sg holding this - * page and @piter->sg_pgoffset to the page's page offset within the sg. The - * iteration will stop either when a maximum number of sg entries was reached - * or a terminating sg (sg_last(sg) == true) was reached. + * you can call sg_page_iter_page(@piter) and sg_page_iter_dma_address(@piter) + * to get the current page and its dma address. @piter->sg will point to the + * sg holding this page and @piter->sg_pgoffset to the page's page offset + * within the sg. The iteration will stop either when a maximum number of sg + * entries was reached or a terminating sg (sg_last(sg) == true) was reached.   */  struct sg_page_iter { -	struct page		*page;		/* current page */  	struct scatterlist	*sg;		/* sg holding the page */  	unsigned int		sg_pgoffset;	/* page offset within the sg */ @@ -255,6 +271,24 @@ bool __sg_page_iter_next(struct sg_page_iter *piter);  void __sg_page_iter_start(struct sg_page_iter *piter,  			  struct scatterlist *sglist, unsigned int nents,  			  unsigned long pgoffset); +/** + * sg_page_iter_page - get the current page held by the page iterator + * @piter:	page iterator holding the page + */ +static inline struct page *sg_page_iter_page(struct sg_page_iter *piter) +{ +	return nth_page(sg_page(piter->sg), piter->sg_pgoffset); +} + +/** + * sg_page_iter_dma_address - get the dma address of the current page held by + * the page iterator. + * @piter:	page iterator holding the page + */ +static inline dma_addr_t sg_page_iter_dma_address(struct sg_page_iter *piter) +{ +	return sg_dma_address(piter->sg) + (piter->sg_pgoffset << PAGE_SHIFT); +}  /**   * for_each_sg_page - iterate over the pages of the given sg list diff --git a/include/linux/sched.h b/include/linux/sched.h index d35d2b6ddbf..6f950048b6e 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -127,18 +127,6 @@ extern void proc_sched_show_task(struct task_struct *p, struct seq_file *m);  extern void proc_sched_set_task(struct task_struct *p);  extern void  print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq); -#else -static inline void -proc_sched_show_task(struct task_struct *p, struct seq_file *m) -{ -} -static inline void proc_sched_set_task(struct task_struct *p) -{ -} -static inline void -print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) -{ -}  #endif  /* @@ -163,9 +151,10 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)  #define TASK_DEAD		64  #define TASK_WAKEKILL		128  #define TASK_WAKING		256 -#define TASK_STATE_MAX		512 +#define TASK_PARKED		512 +#define TASK_STATE_MAX		1024 -#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW" +#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP"  extern char ___assert_task_state[1 - 2*!!(  		sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; @@ -320,7 +309,6 @@ extern signed long schedule_timeout_killable(signed long timeout);  extern signed long schedule_timeout_uninterruptible(signed long timeout);  asmlinkage void schedule(void);  extern void schedule_preempt_disabled(void); -extern int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner);  struct nsproxy;  struct user_namespace; @@ -526,7 +514,8 @@ struct signal_struct {  	unsigned int		has_child_subreaper:1;  	/* POSIX.1b Interval Timers */ -	struct list_head posix_timers; +	int			posix_timer_id; +	struct list_head	posix_timers;  	/* ITIMER_REAL timer for the process */  	struct hrtimer real_timer; @@ -570,7 +559,7 @@ struct signal_struct {  	cputime_t utime, stime, cutime, cstime;  	cputime_t gtime;  	cputime_t cgtime; -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	struct cputime prev_cputime;  #endif  	unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; @@ -637,6 +626,7 @@ struct signal_struct {  #define SIGNAL_STOP_STOPPED	0x00000001 /* job control stop in effect */  #define SIGNAL_STOP_CONTINUED	0x00000002 /* SIGCONT since WCONTINUED reap */  #define SIGNAL_GROUP_EXIT	0x00000004 /* group exit in progress */ +#define SIGNAL_GROUP_COREDUMP	0x00000008 /* coredump in progress */  /*   * Pending notifications to parent.   */ @@ -768,31 +758,6 @@ enum cpu_idle_type {  };  /* - * Increase resolution of nice-level calculations for 64-bit architectures. - * The extra resolution improves shares distribution and load balancing of - * low-weight task groups (eg. nice +19 on an autogroup), deeper taskgroup - * hierarchies, especially on larger systems. This is not a user-visible change - * and does not change the user-interface for setting shares/weights. - * - * We increase resolution only if we have enough bits to allow this increased - * resolution (i.e. BITS_PER_LONG > 32). The costs for increasing resolution - * when BITS_PER_LONG <= 32 are pretty high and the returns do not justify the - * increased costs. - */ -#if 0 /* BITS_PER_LONG > 32 -- currently broken: it increases power usage under light load  */ -# define SCHED_LOAD_RESOLUTION	10 -# define scale_load(w)		((w) << SCHED_LOAD_RESOLUTION) -# define scale_load_down(w)	((w) >> SCHED_LOAD_RESOLUTION) -#else -# define SCHED_LOAD_RESOLUTION	0 -# define scale_load(w)		(w) -# define scale_load_down(w)	(w) -#endif - -#define SCHED_LOAD_SHIFT	(10 + SCHED_LOAD_RESOLUTION) -#define SCHED_LOAD_SCALE	(1L << SCHED_LOAD_SHIFT) - -/*   * Increase resolution of cpu_power calculations   */  #define SCHED_POWER_SHIFT	10 @@ -817,62 +782,6 @@ enum cpu_idle_type {  extern int __weak arch_sd_sibiling_asym_packing(void); -struct sched_group_power { -	atomic_t ref; -	/* -	 * CPU power of this group, SCHED_LOAD_SCALE being max power for a -	 * single CPU. -	 */ -	unsigned int power, power_orig; -	unsigned long next_update; -	/* -	 * Number of busy cpus in this group. -	 */ -	atomic_t nr_busy_cpus; - -	unsigned long cpumask[0]; /* iteration mask */ -}; - -struct sched_group { -	struct sched_group *next;	/* Must be a circular list */ -	atomic_t ref; - -	unsigned int group_weight; -	struct sched_group_power *sgp; - -	/* -	 * The CPUs this group covers. -	 * -	 * NOTE: this field is variable length. (Allocated dynamically -	 * by attaching extra space to the end of the structure, -	 * depending on how many CPUs the kernel has booted up with) -	 */ -	unsigned long cpumask[0]; -}; - -static inline struct cpumask *sched_group_cpus(struct sched_group *sg) -{ -	return to_cpumask(sg->cpumask); -} - -/* - * cpumask masking which cpus in the group are allowed to iterate up the domain - * tree. - */ -static inline struct cpumask *sched_group_mask(struct sched_group *sg) -{ -	return to_cpumask(sg->sgp->cpumask); -} - -/** - * group_first_cpu - Returns the first cpu in the cpumask of a sched_group. - * @group: The group whose first cpu is to be returned. - */ -static inline unsigned int group_first_cpu(struct sched_group *group) -{ -	return cpumask_first(sched_group_cpus(group)); -} -  struct sched_domain_attr {  	int relax_domain_level;  }; @@ -883,6 +792,8 @@ struct sched_domain_attr {  extern int sched_domain_level_max; +struct sched_group; +  struct sched_domain {  	/* These fields must be setup */  	struct sched_domain *parent;	/* top domain must be null terminated */ @@ -899,6 +810,8 @@ struct sched_domain {  	unsigned int wake_idx;  	unsigned int forkexec_idx;  	unsigned int smt_gain; + +	int nohz_idle;			/* NOHZ IDLE status */  	int flags;			/* See SD_* */  	int level; @@ -971,18 +884,6 @@ extern void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],  cpumask_var_t *alloc_sched_domains(unsigned int ndoms);  void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms); -/* Test a flag in parent sched domain */ -static inline int test_sd_parent(struct sched_domain *sd, int flag) -{ -	if (sd->parent && (sd->parent->flags & flag)) -		return 1; - -	return 0; -} - -unsigned long default_scale_freq_power(struct sched_domain *sd, int cpu); -unsigned long default_scale_smt_power(struct sched_domain *sd, int cpu); -  bool cpus_share_cache(int this_cpu, int that_cpu);  #else /* CONFIG_SMP */ @@ -1017,72 +918,6 @@ struct mempolicy;  struct pipe_inode_info;  struct uts_namespace; -struct rq; -struct sched_domain; - -/* - * wake flags - */ -#define WF_SYNC		0x01		/* waker goes to sleep after wakup */ -#define WF_FORK		0x02		/* child wakeup after fork */ -#define WF_MIGRATED	0x04		/* internal use, task got migrated */ - -#define ENQUEUE_WAKEUP		1 -#define ENQUEUE_HEAD		2 -#ifdef CONFIG_SMP -#define ENQUEUE_WAKING		4	/* sched_class::task_waking was called */ -#else -#define ENQUEUE_WAKING		0 -#endif - -#define DEQUEUE_SLEEP		1 - -struct sched_class { -	const struct sched_class *next; - -	void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); -	void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags); -	void (*yield_task) (struct rq *rq); -	bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool preempt); - -	void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags); - -	struct task_struct * (*pick_next_task) (struct rq *rq); -	void (*put_prev_task) (struct rq *rq, struct task_struct *p); - -#ifdef CONFIG_SMP -	int  (*select_task_rq)(struct task_struct *p, int sd_flag, int flags); -	void (*migrate_task_rq)(struct task_struct *p, int next_cpu); - -	void (*pre_schedule) (struct rq *this_rq, struct task_struct *task); -	void (*post_schedule) (struct rq *this_rq); -	void (*task_waking) (struct task_struct *task); -	void (*task_woken) (struct rq *this_rq, struct task_struct *task); - -	void (*set_cpus_allowed)(struct task_struct *p, -				 const struct cpumask *newmask); - -	void (*rq_online)(struct rq *rq); -	void (*rq_offline)(struct rq *rq); -#endif - -	void (*set_curr_task) (struct rq *rq); -	void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); -	void (*task_fork) (struct task_struct *p); - -	void (*switched_from) (struct rq *this_rq, struct task_struct *task); -	void (*switched_to) (struct rq *this_rq, struct task_struct *task); -	void (*prio_changed) (struct rq *this_rq, struct task_struct *task, -			     int oldprio); - -	unsigned int (*get_rr_interval) (struct rq *rq, -					 struct task_struct *task); - -#ifdef CONFIG_FAIR_GROUP_SCHED -	void (*task_move_group) (struct task_struct *p, int on_rq); -#endif -}; -  struct load_weight {  	unsigned long weight, inv_weight;  }; @@ -1274,8 +1109,10 @@ struct task_struct {  	int exit_code, exit_signal;  	int pdeath_signal;  /*  The signal sent when the parent dies  */  	unsigned int jobctl;	/* JOBCTL_*, siglock protected */ -	/* ??? */ + +	/* Used for emulating ABI behavior of previous Linux versions */  	unsigned int personality; +  	unsigned did_exec:1;  	unsigned in_execve:1;	/* Tell the LSMs that the process is doing an  				 * execve */ @@ -1327,7 +1164,7 @@ struct task_struct {  	cputime_t utime, stime, utimescaled, stimescaled;  	cputime_t gtime; -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	struct cputime prev_cputime;  #endif  #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN @@ -1793,7 +1630,7 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,  #define PF_SWAPWRITE	0x00800000	/* Allowed to write to swap */  #define PF_SPREAD_PAGE	0x01000000	/* Spread page cache over cpuset */  #define PF_SPREAD_SLAB	0x02000000	/* Spread some slab caches over cpuset */ -#define PF_THREAD_BOUND	0x04000000	/* Thread bound to specific cpu */ +#define PF_NO_SETAFFINITY 0x04000000	/* Userland is not allowed to meddle with cpus_allowed */  #define PF_MCE_EARLY    0x08000000      /* Early kill for mce process policy */  #define PF_MEMPOLICY	0x10000000	/* Non-default NUMA mempolicy */  #define PF_MUTEX_TESTER	0x20000000	/* Thread belongs to the rt mutex tester */ @@ -2412,27 +2249,18 @@ static inline void threadgroup_change_end(struct task_struct *tsk)   *   * Lock the threadgroup @tsk belongs to.  No new task is allowed to enter   * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or - * perform exec.  This is useful for cases where the threadgroup needs to - * stay stable across blockable operations. + * change ->group_leader/pid.  This is useful for cases where the threadgroup + * needs to stay stable across blockable operations.   *   * fork and exit paths explicitly call threadgroup_change_{begin|end}() for   * synchronization.  While held, no new task will be added to threadgroup   * and no existing live task will have its PF_EXITING set.   * - * During exec, a task goes and puts its thread group through unusual - * changes.  After de-threading, exclusive access is assumed to resources - * which are usually shared by tasks in the same group - e.g. sighand may - * be replaced with a new one.  Also, the exec'ing task takes over group - * leader role including its pid.  Exclude these changes while locked by - * grabbing cred_guard_mutex which is used to synchronize exec path. + * de_thread() does threadgroup_change_{begin|end}() when a non-leader + * sub-thread becomes a new leader.   */  static inline void threadgroup_lock(struct task_struct *tsk)  { -	/* -	 * exec uses exit for de-threading nesting group_rwsem inside -	 * cred_guard_mutex. Grab cred_guard_mutex first. -	 */ -	mutex_lock(&tsk->signal->cred_guard_mutex);  	down_write(&tsk->signal->group_rwsem);  } @@ -2445,7 +2273,6 @@ static inline void threadgroup_lock(struct task_struct *tsk)  static inline void threadgroup_unlock(struct task_struct *tsk)  {  	up_write(&tsk->signal->group_rwsem); -	mutex_unlock(&tsk->signal->cred_guard_mutex);  }  #else  static inline void threadgroup_change_begin(struct task_struct *tsk) {} @@ -2622,6 +2449,47 @@ static inline int spin_needbreak(spinlock_t *lock)  }  /* + * Idle thread specific functions to determine the need_resched + * polling state. We have two versions, one based on TS_POLLING in + * thread_info.status and one based on TIF_POLLING_NRFLAG in + * thread_info.flags + */ +#ifdef TS_POLLING +static inline int tsk_is_polling(struct task_struct *p) +{ +	return task_thread_info(p)->status & TS_POLLING; +} +static inline void current_set_polling(void) +{ +	current_thread_info()->status |= TS_POLLING; +} + +static inline void current_clr_polling(void) +{ +	current_thread_info()->status &= ~TS_POLLING; +	smp_mb__after_clear_bit(); +} +#elif defined(TIF_POLLING_NRFLAG) +static inline int tsk_is_polling(struct task_struct *p) +{ +	return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); +} +static inline void current_set_polling(void) +{ +	set_thread_flag(TIF_POLLING_NRFLAG); +} + +static inline void current_clr_polling(void) +{ +	clear_thread_flag(TIF_POLLING_NRFLAG); +} +#else +static inline int tsk_is_polling(struct task_struct *p) { return 0; } +static inline void current_set_polling(void) { } +static inline void current_clr_polling(void) { } +#endif + +/*   * Thread group CPU time accounting.   */  void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times); @@ -2681,28 +2549,7 @@ extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask);  extern long sched_getaffinity(pid_t pid, struct cpumask *mask);  #ifdef CONFIG_CGROUP_SCHED -  extern struct task_group root_task_group; - -extern struct task_group *sched_create_group(struct task_group *parent); -extern void sched_online_group(struct task_group *tg, -			       struct task_group *parent); -extern void sched_destroy_group(struct task_group *tg); -extern void sched_offline_group(struct task_group *tg); -extern void sched_move_task(struct task_struct *tsk); -#ifdef CONFIG_FAIR_GROUP_SCHED -extern int sched_group_set_shares(struct task_group *tg, unsigned long shares); -extern unsigned long sched_group_shares(struct task_group *tg); -#endif -#ifdef CONFIG_RT_GROUP_SCHED -extern int sched_group_set_rt_runtime(struct task_group *tg, -				      long rt_runtime_us); -extern long sched_group_rt_runtime(struct task_group *tg); -extern int sched_group_set_rt_period(struct task_group *tg, -				      long rt_period_us); -extern long sched_group_rt_period(struct task_group *tg); -extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk); -#endif  #endif /* CONFIG_CGROUP_SCHED */  extern int task_can_switch_user(struct user_struct *up, diff --git a/include/linux/sctp.h b/include/linux/sctp.h index c11a28706fa..3bfe8d6ee24 100644 --- a/include/linux/sctp.h +++ b/include/linux/sctp.h @@ -53,7 +53,9 @@  #include <linux/in.h>		/* We need in_addr.  */  #include <linux/in6.h>		/* We need in6_addr.  */ +#include <linux/skbuff.h> +#include <uapi/linux/sctp.h>  /* Section 3.1.  SCTP Common Header Format */  typedef struct sctphdr { @@ -63,14 +65,10 @@ typedef struct sctphdr {  	__le32 checksum;  } __packed sctp_sctphdr_t; -#ifdef __KERNEL__ -#include <linux/skbuff.h> -  static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)  {  	return (struct sctphdr *)skb_transport_header(skb);  } -#endif  /* Section 3.2.  Chunk Field Descriptions. */  typedef struct sctp_chunkhdr { diff --git a/include/linux/security.h b/include/linux/security.h index eee7478cda7..4686491852a 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1012,6 +1012,10 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	This hook can be used by the module to update any security state   *	associated with the TUN device's security structure.   *	@security pointer to the TUN devices's security structure. + * @skb_owned_by: + *	This hook sets the packet's owning sock. + *	@skb is the packet. + *	@sk the sock which owns the packet.   *   * Security hooks for XFRM operations.   * @@ -1436,7 +1440,7 @@ struct security_operations {  			     struct path *new_path);  	int (*sb_set_mnt_opts) (struct super_block *sb,  				struct security_mnt_opts *opts); -	void (*sb_clone_mnt_opts) (const struct super_block *oldsb, +	int (*sb_clone_mnt_opts) (const struct super_block *oldsb,  				   struct super_block *newsb);  	int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts); @@ -1638,6 +1642,7 @@ struct security_operations {  	int (*tun_dev_attach_queue) (void *security);  	int (*tun_dev_attach) (struct sock *sk, void *security);  	int (*tun_dev_open) (void *security); +	void (*skb_owned_by) (struct sk_buff *skb, struct sock *sk);  #endif	/* CONFIG_SECURITY_NETWORK */  #ifdef CONFIG_SECURITY_NETWORK_XFRM @@ -1721,7 +1726,7 @@ int security_sb_mount(const char *dev_name, struct path *path,  int security_sb_umount(struct vfsmount *mnt, int flags);  int security_sb_pivotroot(struct path *old_path, struct path *new_path);  int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts); -void security_sb_clone_mnt_opts(const struct super_block *oldsb, +int security_sb_clone_mnt_opts(const struct super_block *oldsb,  				struct super_block *newsb);  int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); @@ -2011,9 +2016,11 @@ static inline int security_sb_set_mnt_opts(struct super_block *sb,  	return 0;  } -static inline void security_sb_clone_mnt_opts(const struct super_block *oldsb, +static inline int security_sb_clone_mnt_opts(const struct super_block *oldsb,  					      struct super_block *newsb) -{ } +{ +	return 0; +}  static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)  { @@ -2588,6 +2595,8 @@ int security_tun_dev_attach_queue(void *security);  int security_tun_dev_attach(struct sock *sk, void *security);  int security_tun_dev_open(void *security); +void security_skb_owned_by(struct sk_buff *skb, struct sock *sk); +  #else	/* CONFIG_SECURITY_NETWORK */  static inline int security_unix_stream_connect(struct sock *sock,  					       struct sock *other, @@ -2779,6 +2788,11 @@ static inline int security_tun_dev_open(void *security)  {  	return 0;  } + +static inline void security_skb_owned_by(struct sk_buff *skb, struct sock *sk) +{ +} +  #endif	/* CONFIG_SECURITY_NETWORK */  #ifdef CONFIG_SECURITY_NETWORK_XFRM diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 68a04a343ca..2da29ac178f 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -123,6 +123,7 @@ static inline int seq_nodemask_list(struct seq_file *m, nodemask_t *mask)  }  int single_open(struct file *, int (*)(struct seq_file *, void *), void *); +int single_open_size(struct file *, int (*)(struct seq_file *, void *), void *, size_t);  int single_release(struct inode *, struct file *);  void *__seq_open_private(struct file *, const struct seq_operations *, int);  int seq_open_private(struct file *, const struct seq_operations *, int); diff --git a/include/linux/serial_s3c.h b/include/linux/serial_s3c.h new file mode 100644 index 00000000000..907d9d1d56c --- /dev/null +++ b/include/linux/serial_s3c.h @@ -0,0 +1,260 @@ +/* + *  Internal header file for Samsung S3C2410 serial ports (UART0-2) + * + *  Copyright (C) 2002 Shane Nay (shane@minirl.com) + * + *  Additional defines, Copyright 2003 Simtec Electronics (linux@simtec.co.uk) + * + *  Adapted from: + * + *  Internal header file for MX1ADS serial ports (UART1 & 2) + * + *  Copyright (C) 2002 Shane Nay (shane@minirl.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA +*/ + +#ifndef __ASM_ARM_REGS_SERIAL_H +#define __ASM_ARM_REGS_SERIAL_H + +#define S3C2410_URXH	  (0x24) +#define S3C2410_UTXH	  (0x20) +#define S3C2410_ULCON	  (0x00) +#define S3C2410_UCON	  (0x04) +#define S3C2410_UFCON	  (0x08) +#define S3C2410_UMCON	  (0x0C) +#define S3C2410_UBRDIV	  (0x28) +#define S3C2410_UTRSTAT	  (0x10) +#define S3C2410_UERSTAT	  (0x14) +#define S3C2410_UFSTAT	  (0x18) +#define S3C2410_UMSTAT	  (0x1C) + +#define S3C2410_LCON_CFGMASK	  ((0xF<<3)|(0x3)) + +#define S3C2410_LCON_CS5	  (0x0) +#define S3C2410_LCON_CS6	  (0x1) +#define S3C2410_LCON_CS7	  (0x2) +#define S3C2410_LCON_CS8	  (0x3) +#define S3C2410_LCON_CSMASK	  (0x3) + +#define S3C2410_LCON_PNONE	  (0x0) +#define S3C2410_LCON_PEVEN	  (0x5 << 3) +#define S3C2410_LCON_PODD	  (0x4 << 3) +#define S3C2410_LCON_PMASK	  (0x7 << 3) + +#define S3C2410_LCON_STOPB	  (1<<2) +#define S3C2410_LCON_IRM          (1<<6) + +#define S3C2440_UCON_CLKMASK	  (3<<10) +#define S3C2440_UCON_CLKSHIFT	  (10) +#define S3C2440_UCON_PCLK	  (0<<10) +#define S3C2440_UCON_UCLK	  (1<<10) +#define S3C2440_UCON_PCLK2	  (2<<10) +#define S3C2440_UCON_FCLK	  (3<<10) +#define S3C2443_UCON_EPLL	  (3<<10) + +#define S3C6400_UCON_CLKMASK	(3<<10) +#define S3C6400_UCON_CLKSHIFT	(10) +#define S3C6400_UCON_PCLK	(0<<10) +#define S3C6400_UCON_PCLK2	(2<<10) +#define S3C6400_UCON_UCLK0	(1<<10) +#define S3C6400_UCON_UCLK1	(3<<10) + +#define S3C2440_UCON2_FCLK_EN	  (1<<15) +#define S3C2440_UCON0_DIVMASK	  (15 << 12) +#define S3C2440_UCON1_DIVMASK	  (15 << 12) +#define S3C2440_UCON2_DIVMASK	  (7 << 12) +#define S3C2440_UCON_DIVSHIFT	  (12) + +#define S3C2412_UCON_CLKMASK	(3<<10) +#define S3C2412_UCON_CLKSHIFT	(10) +#define S3C2412_UCON_UCLK	(1<<10) +#define S3C2412_UCON_USYSCLK	(3<<10) +#define S3C2412_UCON_PCLK	(0<<10) +#define S3C2412_UCON_PCLK2	(2<<10) + +#define S3C2410_UCON_CLKMASK	(1 << 10) +#define S3C2410_UCON_CLKSHIFT	(10) +#define S3C2410_UCON_UCLK	  (1<<10) +#define S3C2410_UCON_SBREAK	  (1<<4) + +#define S3C2410_UCON_TXILEVEL	  (1<<9) +#define S3C2410_UCON_RXILEVEL	  (1<<8) +#define S3C2410_UCON_TXIRQMODE	  (1<<2) +#define S3C2410_UCON_RXIRQMODE	  (1<<0) +#define S3C2410_UCON_RXFIFO_TOI	  (1<<7) +#define S3C2443_UCON_RXERR_IRQEN  (1<<6) +#define S3C2443_UCON_LOOPBACK	  (1<<5) + +#define S3C2410_UCON_DEFAULT	  (S3C2410_UCON_TXILEVEL  | \ +				   S3C2410_UCON_RXILEVEL  | \ +				   S3C2410_UCON_TXIRQMODE | \ +				   S3C2410_UCON_RXIRQMODE | \ +				   S3C2410_UCON_RXFIFO_TOI) + +#define S3C2410_UFCON_FIFOMODE	  (1<<0) +#define S3C2410_UFCON_TXTRIG0	  (0<<6) +#define S3C2410_UFCON_RXTRIG8	  (1<<4) +#define S3C2410_UFCON_RXTRIG12	  (2<<4) + +/* S3C2440 FIFO trigger levels */ +#define S3C2440_UFCON_RXTRIG1	  (0<<4) +#define S3C2440_UFCON_RXTRIG8	  (1<<4) +#define S3C2440_UFCON_RXTRIG16	  (2<<4) +#define S3C2440_UFCON_RXTRIG32	  (3<<4) + +#define S3C2440_UFCON_TXTRIG0	  (0<<6) +#define S3C2440_UFCON_TXTRIG16	  (1<<6) +#define S3C2440_UFCON_TXTRIG32	  (2<<6) +#define S3C2440_UFCON_TXTRIG48	  (3<<6) + +#define S3C2410_UFCON_RESETBOTH	  (3<<1) +#define S3C2410_UFCON_RESETTX	  (1<<2) +#define S3C2410_UFCON_RESETRX	  (1<<1) + +#define S3C2410_UFCON_DEFAULT	  (S3C2410_UFCON_FIFOMODE | \ +				   S3C2410_UFCON_TXTRIG0  | \ +				   S3C2410_UFCON_RXTRIG8 ) + +#define	S3C2410_UMCOM_AFC	  (1<<4) +#define	S3C2410_UMCOM_RTS_LOW	  (1<<0) + +#define S3C2412_UMCON_AFC_63	(0<<5)		/* same as s3c2443 */ +#define S3C2412_UMCON_AFC_56	(1<<5) +#define S3C2412_UMCON_AFC_48	(2<<5) +#define S3C2412_UMCON_AFC_40	(3<<5) +#define S3C2412_UMCON_AFC_32	(4<<5) +#define S3C2412_UMCON_AFC_24	(5<<5) +#define S3C2412_UMCON_AFC_16	(6<<5) +#define S3C2412_UMCON_AFC_8	(7<<5) + +#define S3C2410_UFSTAT_TXFULL	  (1<<9) +#define S3C2410_UFSTAT_RXFULL	  (1<<8) +#define S3C2410_UFSTAT_TXMASK	  (15<<4) +#define S3C2410_UFSTAT_TXSHIFT	  (4) +#define S3C2410_UFSTAT_RXMASK	  (15<<0) +#define S3C2410_UFSTAT_RXSHIFT	  (0) + +/* UFSTAT S3C2443 same as S3C2440 */ +#define S3C2440_UFSTAT_TXFULL	  (1<<14) +#define S3C2440_UFSTAT_RXFULL	  (1<<6) +#define S3C2440_UFSTAT_TXSHIFT	  (8) +#define S3C2440_UFSTAT_RXSHIFT	  (0) +#define S3C2440_UFSTAT_TXMASK	  (63<<8) +#define S3C2440_UFSTAT_RXMASK	  (63) + +#define S3C2410_UTRSTAT_TXE	  (1<<2) +#define S3C2410_UTRSTAT_TXFE	  (1<<1) +#define S3C2410_UTRSTAT_RXDR	  (1<<0) + +#define S3C2410_UERSTAT_OVERRUN	  (1<<0) +#define S3C2410_UERSTAT_FRAME	  (1<<2) +#define S3C2410_UERSTAT_BREAK	  (1<<3) +#define S3C2443_UERSTAT_PARITY	  (1<<1) + +#define S3C2410_UERSTAT_ANY	  (S3C2410_UERSTAT_OVERRUN | \ +				   S3C2410_UERSTAT_FRAME | \ +				   S3C2410_UERSTAT_BREAK) + +#define S3C2410_UMSTAT_CTS	  (1<<0) +#define S3C2410_UMSTAT_DeltaCTS	  (1<<2) + +#define S3C2443_DIVSLOT		  (0x2C) + +/* S3C64XX interrupt registers. */ +#define S3C64XX_UINTP		0x30 +#define S3C64XX_UINTSP		0x34 +#define S3C64XX_UINTM		0x38 + +#define S3C64XX_UINTM_RXD	(0) +#define S3C64XX_UINTM_TXD	(2) +#define S3C64XX_UINTM_RXD_MSK	(1 << S3C64XX_UINTM_RXD) +#define S3C64XX_UINTM_TXD_MSK	(1 << S3C64XX_UINTM_TXD) + +/* Following are specific to S5PV210 */ +#define S5PV210_UCON_CLKMASK	(1<<10) +#define S5PV210_UCON_CLKSHIFT	(10) +#define S5PV210_UCON_PCLK	(0<<10) +#define S5PV210_UCON_UCLK	(1<<10) + +#define S5PV210_UFCON_TXTRIG0	(0<<8) +#define S5PV210_UFCON_TXTRIG4	(1<<8) +#define S5PV210_UFCON_TXTRIG8	(2<<8) +#define S5PV210_UFCON_TXTRIG16	(3<<8) +#define S5PV210_UFCON_TXTRIG32	(4<<8) +#define S5PV210_UFCON_TXTRIG64	(5<<8) +#define S5PV210_UFCON_TXTRIG128 (6<<8) +#define S5PV210_UFCON_TXTRIG256 (7<<8) + +#define S5PV210_UFCON_RXTRIG1	(0<<4) +#define S5PV210_UFCON_RXTRIG4	(1<<4) +#define S5PV210_UFCON_RXTRIG8	(2<<4) +#define S5PV210_UFCON_RXTRIG16	(3<<4) +#define S5PV210_UFCON_RXTRIG32	(4<<4) +#define S5PV210_UFCON_RXTRIG64	(5<<4) +#define S5PV210_UFCON_RXTRIG128	(6<<4) +#define S5PV210_UFCON_RXTRIG256	(7<<4) + +#define S5PV210_UFSTAT_TXFULL	(1<<24) +#define S5PV210_UFSTAT_RXFULL	(1<<8) +#define S5PV210_UFSTAT_TXMASK	(255<<16) +#define S5PV210_UFSTAT_TXSHIFT	(16) +#define S5PV210_UFSTAT_RXMASK	(255<<0) +#define S5PV210_UFSTAT_RXSHIFT	(0) + +#define S3C2410_UCON_CLKSEL0	(1 << 0) +#define S3C2410_UCON_CLKSEL1	(1 << 1) +#define S3C2410_UCON_CLKSEL2	(1 << 2) +#define S3C2410_UCON_CLKSEL3	(1 << 3) + +/* Default values for s5pv210 UCON and UFCON uart registers */ +#define S5PV210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\ +				 S3C2410_UCON_RXILEVEL |	\ +				 S3C2410_UCON_TXIRQMODE |	\ +				 S3C2410_UCON_RXIRQMODE |	\ +				 S3C2410_UCON_RXFIFO_TOI |	\ +				 S3C2443_UCON_RXERR_IRQEN) + +#define S5PV210_UFCON_DEFAULT	(S3C2410_UFCON_FIFOMODE |	\ +				 S5PV210_UFCON_TXTRIG4 |	\ +				 S5PV210_UFCON_RXTRIG4) + +#ifndef __ASSEMBLY__ + +/* configuration structure for per-machine configurations for the + * serial port + * + * the pointer is setup by the machine specific initialisation from the + * arch/arm/mach-s3c2410/ directory. +*/ + +struct s3c2410_uartcfg { +	unsigned char	   hwport;	 /* hardware port number */ +	unsigned char	   unused; +	unsigned short	   flags; +	upf_t		   uart_flags;	 /* default uart flags */ +	unsigned int	   clk_sel; + +	unsigned int	   has_fracval; + +	unsigned long	   ucon;	 /* value of ucon for port */ +	unsigned long	   ulcon;	 /* value of ulcon for port */ +	unsigned long	   ufcon;	 /* value of ufcon for port */ +}; + +#endif /* __ASSEMBLY__ */ + +#endif /* __ASM_ARM_REGS_SERIAL_H */ + diff --git a/include/linux/sh_eth.h b/include/linux/sh_eth.h index b17d765ded8..fc305713fc6 100644 --- a/include/linux/sh_eth.h +++ b/include/linux/sh_eth.h @@ -6,6 +6,7 @@  enum {EDMAC_LITTLE_ENDIAN, EDMAC_BIG_ENDIAN};  enum {  	SH_ETH_REG_GIGABIT, +	SH_ETH_REG_FAST_RCAR,  	SH_ETH_REG_FAST_SH4,  	SH_ETH_REG_FAST_SH3_SH2  }; diff --git a/include/linux/signal.h b/include/linux/signal.h index a2dcb94ea49..d897484730c 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -250,11 +250,11 @@ extern int show_unhandled_signals;  extern int sigsuspend(sigset_t *);  struct sigaction { -#ifndef __ARCH_HAS_ODD_SIGACTION +#ifndef __ARCH_HAS_IRIX_SIGACTION  	__sighandler_t	sa_handler;  	unsigned long	sa_flags;  #else -	unsigned long	sa_flags; +	unsigned int	sa_flags;  	__sighandler_t	sa_handler;  #endif  #ifdef __ARCH_HAS_SA_RESTORER @@ -434,4 +434,9 @@ void signals_init(void);  int restore_altstack(const stack_t __user *);  int __save_altstack(stack_t __user *, unsigned long); +#ifdef CONFIG_PROC_FS +struct seq_file; +extern void render_sigset_t(struct seq_file *, const char *, sigset_t *); +#endif +  #endif /* _LINUX_SIGNAL_H */ diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 821c7f45d2a..2e0ced1af3b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -32,6 +32,7 @@  #include <linux/hrtimer.h>  #include <linux/dma-mapping.h>  #include <linux/netdev_features.h> +#include <net/flow_keys.h>  /* Don't change this without changing skb_csum_unnecessary! */  #define CHECKSUM_NONE 0 @@ -316,6 +317,8 @@ enum {  	SKB_GSO_FCOE = 1 << 5,  	SKB_GSO_GRE = 1 << 6, + +	SKB_GSO_UDP_TUNNEL = 1 << 7,  };  #if BITS_PER_LONG > 32 @@ -384,9 +387,11 @@ typedef unsigned char *sk_buff_data_t;   *	@secmark: security marking   *	@mark: Generic packet mark   *	@dropcount: total number of sk_receive_queue overflows + *	@vlan_proto: vlan encapsulation protocol   *	@vlan_tci: vlan tag control information   *	@inner_transport_header: Inner transport layer header (encapsulation)   *	@inner_network_header: Network layer header (encapsulation) + *	@inner_mac_header: Link layer header (encapsulation)   *	@transport_header: Transport layer header   *	@network_header: Network layer header   *	@mac_header: Link layer header @@ -461,6 +466,7 @@ struct sk_buff {  	__u32			rxhash; +	__be16			vlan_proto;  	__u16			vlan_tci;  #ifdef CONFIG_NET_SCHED @@ -500,11 +506,12 @@ struct sk_buff {  	union {  		__u32		mark;  		__u32		dropcount; -		__u32		avail_size; +		__u32		reserved_tailroom;  	};  	sk_buff_data_t		inner_transport_header;  	sk_buff_data_t		inner_network_header; +	sk_buff_data_t		inner_mac_header;  	sk_buff_data_t		transport_header;  	sk_buff_data_t		network_header;  	sk_buff_data_t		mac_header; @@ -570,7 +577,40 @@ static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst)  	skb->_skb_refdst = (unsigned long)dst;  } -extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst); +extern void __skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst, +				bool force); + +/** + * skb_dst_set_noref - sets skb dst, hopefully, without taking reference + * @skb: buffer + * @dst: dst entry + * + * Sets skb dst, assuming a reference was not taken on dst. + * If dst entry is cached, we do not take reference and dst_release + * will be avoided by refdst_drop. If dst entry is not cached, we take + * reference, so that last dst_release can destroy the dst immediately. + */ +static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) +{ +	__skb_dst_set_noref(skb, dst, false); +} + +/** + * skb_dst_set_noref_force - sets skb dst, without taking reference + * @skb: buffer + * @dst: dst entry + * + * Sets skb dst, assuming a reference was not taken on dst. + * No reference is taken and no dst_release will be called. While for + * cached dsts deferred reclaim is a basic feature, for entries that are + * not cached it is caller's job to guarantee that last dst_release for + * provided dst happens when nobody uses it, eg. after a RCU grace period. + */ +static inline void skb_dst_set_noref_force(struct sk_buff *skb, +					   struct dst_entry *dst) +{ +	__skb_dst_set_noref(skb, dst, true); +}  /**   * skb_dst_is_noref - Test if skb dst isn't refcounted @@ -611,6 +651,12 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size,  	return __alloc_skb(size, priority, SKB_ALLOC_FCLONE, NUMA_NO_NODE);  } +extern struct sk_buff *__alloc_skb_head(gfp_t priority, int node); +static inline struct sk_buff *alloc_skb_head(gfp_t priority) +{ +	return __alloc_skb_head(priority, -1); +} +  extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);  extern int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask);  extern struct sk_buff *skb_clone(struct sk_buff *skb, @@ -1288,11 +1334,13 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,  	 * do not lose pfmemalloc information as the pages would not be  	 * allocated using __GFP_MEMALLOC.  	 */ -	if (page->pfmemalloc && !page->mapping) -		skb->pfmemalloc	= true;  	frag->page.p		  = page;  	frag->page_offset	  = off;  	skb_frag_size_set(frag, size); + +	page = compound_head(page); +	if (page->pfmemalloc && !page->mapping) +		skb->pfmemalloc	= true;  }  /** @@ -1447,7 +1495,10 @@ static inline int skb_tailroom(const struct sk_buff *skb)   */  static inline int skb_availroom(const struct sk_buff *skb)  { -	return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len; +	if (skb_is_nonlinear(skb)) +		return 0; + +	return skb->end - skb->tail - skb->reserved_tailroom;  }  /** @@ -1466,6 +1517,7 @@ static inline void skb_reserve(struct sk_buff *skb, int len)  static inline void skb_reset_inner_headers(struct sk_buff *skb)  { +	skb->inner_mac_header = skb->mac_header;  	skb->inner_network_header = skb->network_header;  	skb->inner_transport_header = skb->transport_header;  } @@ -1511,6 +1563,22 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,  	skb->inner_network_header += offset;  } +static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb) +{ +	return skb->head + skb->inner_mac_header; +} + +static inline void skb_reset_inner_mac_header(struct sk_buff *skb) +{ +	skb->inner_mac_header = skb->data - skb->head; +} + +static inline void skb_set_inner_mac_header(struct sk_buff *skb, +					    const int offset) +{ +	skb_reset_inner_mac_header(skb); +	skb->inner_mac_header += offset; +}  static inline bool skb_transport_header_was_set(const struct sk_buff *skb)  {  	return skb->transport_header != ~0U; @@ -1604,6 +1672,21 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,  	skb->inner_network_header = skb->data + offset;  } +static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb) +{ +	return skb->inner_mac_header; +} + +static inline void skb_reset_inner_mac_header(struct sk_buff *skb) +{ +	skb->inner_mac_header = skb->data; +} + +static inline void skb_set_inner_mac_header(struct sk_buff *skb, +						const int offset) +{ +	skb->inner_mac_header = skb->data + offset; +}  static inline bool skb_transport_header_was_set(const struct sk_buff *skb)  {  	return skb->transport_header != NULL; @@ -1661,6 +1744,19 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)  }  #endif /* NET_SKBUFF_DATA_USES_OFFSET */ +static inline void skb_probe_transport_header(struct sk_buff *skb, +					      const int offset_hint) +{ +	struct flow_keys keys; + +	if (skb_transport_header_was_set(skb)) +		return; +	else if (skb_flow_dissect(skb, &keys)) +		skb_set_transport_header(skb, keys.thoff); +	else +		skb_set_transport_header(skb, offset_hint); +} +  static inline void skb_mac_header_rebuild(struct sk_buff *skb)  {  	if (skb_mac_header_was_set(skb)) { @@ -2638,6 +2734,13 @@ static inline void nf_reset(struct sk_buff *skb)  #endif  } +static inline void nf_reset_trace(struct sk_buff *skb) +{ +#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) +	skb->nf_trace = 0; +#endif +} +  /* Note: This doesn't put any conntrack and bridge info in dst. */  static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)  { @@ -2799,6 +2902,8 @@ static inline void skb_checksum_none_assert(const struct sk_buff *skb)  bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); +u32 __skb_get_poff(const struct sk_buff *skb); +  /**   * skb_head_is_locked - Determine if the skb->head is locked down   * @skb: skb to check diff --git a/include/linux/smp.h b/include/linux/smp.h index 3e07a7df647..e6564c1dc55 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -20,7 +20,6 @@ struct call_single_data {  	smp_call_func_t func;  	void *info;  	u16 flags; -	u16 priv;  };  /* total number of cpus in this system (may exceed NR_CPUS) */ diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h index e8d702e0fd8..54f91d35e5f 100644 --- a/include/linux/sock_diag.h +++ b/include/linux/sock_diag.h @@ -1,6 +1,7 @@  #ifndef __SOCK_DIAG_H__  #define __SOCK_DIAG_H__ +#include <linux/user_namespace.h>  #include <uapi/linux/sock_diag.h>  struct sk_buff; @@ -22,5 +23,7 @@ int sock_diag_check_cookie(void *sk, __u32 *cookie);  void sock_diag_save_cookie(void *sk, __u32 *cookie);  int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); +int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, +			     struct sk_buff *skb, int attrtype);  #endif diff --git a/include/linux/socket.h b/include/linux/socket.h index 2b9f74b0ffe..428c37a1f95 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -298,6 +298,7 @@ struct ucred {  #define SOL_IUCV	277  #define SOL_CAIF	278  #define SOL_ALG		279 +#define SOL_NFC		280  /* IPX options */  #define IPX_TYPE	1 diff --git a/include/linux/spi/at86rf230.h b/include/linux/spi/at86rf230.h index b2b1afbb320..aa327a8105a 100644 --- a/include/linux/spi/at86rf230.h +++ b/include/linux/spi/at86rf230.h @@ -26,6 +26,20 @@ struct at86rf230_platform_data {  	int rstn;  	int slp_tr;  	int dig2; + +	/* Setting the irq_type will configure the driver to request +	 * the platform irq trigger type according to the given value +	 * and configure the interrupt polarity of the device to the +	 * corresponding polarity. +	 * +	 * Allowed values are: IRQF_TRIGGER_RISING, IRQF_TRIGGER_FALLING, +	 *                     IRQF_TRIGGER_HIGH and IRQF_TRIGGER_LOW +	 * +	 * Setting it to 0, the driver does not touch the trigger type +	 * configuration of the interrupt and sets the interrupt polarity +	 * of the device to high active (the default value). +	 */ +	int irq_type;  };  #endif diff --git a/include/linux/spi/spi-tegra.h b/include/linux/spi/spi-tegra.h deleted file mode 100644 index 786932c62ed..00000000000 --- a/include/linux/spi/spi-tegra.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * spi-tegra.h: SPI interface for Nvidia Tegra20 SLINK controller. - * - * Copyright (C) 2011 NVIDIA Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. - */ - -#ifndef _LINUX_SPI_TEGRA_H -#define _LINUX_SPI_TEGRA_H - -struct tegra_spi_platform_data { -	int dma_req_sel; -	unsigned int spi_max_frequency; -}; - -/* - * Controller data from device to pass some info like - * hw based chip select can be used or not and if yes - * then CS hold and setup time. - */ -struct tegra_spi_device_controller_data { -	bool is_hw_based_cs; -	int cs_setup_clk_count; -	int cs_hold_clk_count; -}; - -#endif /* _LINUX_SPI_TEGRA_H */ diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 38c2b925923..733eb5ee31c 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -228,6 +228,11 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   *	every chipselect is connected to a slave.   * @dma_alignment: SPI controller constraint on DMA buffers alignment.   * @mode_bits: flags understood by this controller driver + * @bits_per_word_mask: A mask indicating which values of bits_per_word are + *	supported by the driver. Bit n indicates that a bits_per_word n+1 is + *	suported. If set, the SPI core will reject any transfer with an + *	unsupported bits_per_word. If not set, this value is simply ignored, + *	and it's up to the individual driver to perform any validation.   * @flags: other constraints relevant to this driver   * @bus_lock_spinlock: spinlock for SPI bus locking   * @bus_lock_mutex: mutex for SPI bus locking @@ -301,6 +306,9 @@ struct spi_master {  	/* spi_device.mode flags understood by this controller driver */  	u16			mode_bits; +	/* bitmask of supported bits_per_word for transfers */ +	u32			bits_per_word_mask; +  	/* other constraints relevant to this driver */  	u16			flags;  #define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */ diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h index a26e2fb604e..e2369c167db 100644 --- a/include/linux/spinlock_up.h +++ b/include/linux/spinlock_up.h @@ -16,7 +16,10 @@   * In the debug case, 1 means unlocked, 0 means locked. (the values   * are inverted, to catch initialization bugs)   * - * No atomicity anywhere, we are on UP. + * No atomicity anywhere, we are on UP. However, we still need + * the compiler barriers, because we do not want the compiler to + * move potentially faulting instructions (notably user accesses) + * into the locked sequence, resulting in non-atomic execution.   */  #ifdef CONFIG_DEBUG_SPINLOCK @@ -25,6 +28,7 @@  static inline void arch_spin_lock(arch_spinlock_t *lock)  {  	lock->slock = 0; +	barrier();  }  static inline void @@ -32,6 +36,7 @@ arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)  {  	local_irq_save(flags);  	lock->slock = 0; +	barrier();  }  static inline int arch_spin_trylock(arch_spinlock_t *lock) @@ -39,32 +44,34 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)  	char oldval = lock->slock;  	lock->slock = 0; +	barrier();  	return oldval > 0;  }  static inline void arch_spin_unlock(arch_spinlock_t *lock)  { +	barrier();  	lock->slock = 1;  }  /*   * Read-write spinlocks. No debug version.   */ -#define arch_read_lock(lock)		do { (void)(lock); } while (0) -#define arch_write_lock(lock)		do { (void)(lock); } while (0) -#define arch_read_trylock(lock)	({ (void)(lock); 1; }) -#define arch_write_trylock(lock)	({ (void)(lock); 1; }) -#define arch_read_unlock(lock)		do { (void)(lock); } while (0) -#define arch_write_unlock(lock)	do { (void)(lock); } while (0) +#define arch_read_lock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_write_lock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_read_trylock(lock)	({ barrier(); (void)(lock); 1; }) +#define arch_write_trylock(lock)	({ barrier(); (void)(lock); 1; }) +#define arch_read_unlock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_write_unlock(lock)	do { barrier(); (void)(lock); } while (0)  #else /* DEBUG_SPINLOCK */  #define arch_spin_is_locked(lock)	((void)(lock), 0)  /* for sched.c and kernel_lock.c: */ -# define arch_spin_lock(lock)		do { (void)(lock); } while (0) -# define arch_spin_lock_flags(lock, flags)	do { (void)(lock); } while (0) -# define arch_spin_unlock(lock)	do { (void)(lock); } while (0) -# define arch_spin_trylock(lock)	({ (void)(lock); 1; }) +# define arch_spin_lock(lock)		do { barrier(); (void)(lock); } while (0) +# define arch_spin_lock_flags(lock, flags)	do { barrier(); (void)(lock); } while (0) +# define arch_spin_unlock(lock)	do { barrier(); (void)(lock); } while (0) +# define arch_spin_trylock(lock)	({ barrier(); (void)(lock); 1; })  #endif /* DEBUG_SPINLOCK */  #define arch_spin_is_contended(lock)	(((void)(lock), 0)) diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index 22958d68ecf..c64999fd166 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -26,9 +26,9 @@ struct ssb_sprom_core_pwr_info {  struct ssb_sprom {  	u8 revision; -	u8 il0mac[6];		/* MAC address for 802.11b/g */ -	u8 et0mac[6];		/* MAC address for Ethernet */ -	u8 et1mac[6];		/* MAC address for 802.11a */ +	u8 il0mac[6] __aligned(sizeof(u16));	/* MAC address for 802.11b/g */ +	u8 et0mac[6] __aligned(sizeof(u16));	/* MAC address for Ethernet */ +	u8 et1mac[6] __aligned(sizeof(u16));	/* MAC address for 802.11a */  	u8 et0phyaddr;		/* MII address for enet0 */  	u8 et1phyaddr;		/* MII address for enet1 */  	u8 et0mdcport;		/* MDIO for enet0 */ @@ -340,13 +340,61 @@ enum ssb_bustype {  #define SSB_BOARDVENDOR_DELL	0x1028	/* Dell */  #define SSB_BOARDVENDOR_HP	0x0E11	/* HP */  /* board_type */ +#define SSB_BOARD_BCM94301CB	0x0406 +#define SSB_BOARD_BCM94301MP	0x0407 +#define SSB_BOARD_BU4309	0x040A +#define SSB_BOARD_BCM94309CB	0x040B +#define SSB_BOARD_BCM4309MP	0x040C +#define SSB_BOARD_BU4306	0x0416  #define SSB_BOARD_BCM94306MP	0x0418  #define SSB_BOARD_BCM4309G	0x0421  #define SSB_BOARD_BCM4306CB	0x0417 -#define SSB_BOARD_BCM4309MP	0x040C +#define SSB_BOARD_BCM94306PC	0x0425	/* pcmcia 3.3v 4306 card */ +#define SSB_BOARD_BCM94306CBSG	0x042B	/* with SiGe PA */ +#define SSB_BOARD_PCSG94306	0x042D	/* with SiGe PA */ +#define SSB_BOARD_BU4704SD	0x042E	/* with sdram */ +#define SSB_BOARD_BCM94704AGR	0x042F	/* dual 11a/11g Router */ +#define SSB_BOARD_BCM94308MP	0x0430	/* 11a-only minipci */ +#define SSB_BOARD_BU4318	0x0447 +#define SSB_BOARD_CB4318	0x0448 +#define SSB_BOARD_MPG4318	0x0449  #define SSB_BOARD_MP4318	0x044A -#define SSB_BOARD_BU4306	0x0416 -#define SSB_BOARD_BU4309	0x040A +#define SSB_BOARD_SD4318	0x044B +#define SSB_BOARD_BCM94306P	0x044C	/* with SiGe */ +#define SSB_BOARD_BCM94303MP	0x044E +#define SSB_BOARD_BCM94306MPM	0x0450 +#define SSB_BOARD_BCM94306MPL	0x0453 +#define SSB_BOARD_PC4303	0x0454	/* pcmcia */ +#define SSB_BOARD_BCM94306MPLNA	0x0457 +#define SSB_BOARD_BCM94306MPH	0x045B +#define SSB_BOARD_BCM94306PCIV	0x045C +#define SSB_BOARD_BCM94318MPGH	0x0463 +#define SSB_BOARD_BU4311	0x0464 +#define SSB_BOARD_BCM94311MC	0x0465 +#define SSB_BOARD_BCM94311MCAG	0x0466 +/* 4321 boards */ +#define SSB_BOARD_BU4321	0x046B +#define SSB_BOARD_BU4321E	0x047C +#define SSB_BOARD_MP4321	0x046C +#define SSB_BOARD_CB2_4321	0x046D +#define SSB_BOARD_CB2_4321_AG	0x0066 +#define SSB_BOARD_MC4321	0x046E +/* 4325 boards */ +#define SSB_BOARD_BCM94325DEVBU	0x0490 +#define SSB_BOARD_BCM94325BGABU	0x0491 +#define SSB_BOARD_BCM94325SDGWB	0x0492 +#define SSB_BOARD_BCM94325SDGMDL	0x04AA +#define SSB_BOARD_BCM94325SDGMDL2	0x04C6 +#define SSB_BOARD_BCM94325SDGMDL3	0x04C9 +#define SSB_BOARD_BCM94325SDABGWBA	0x04E1 +/* 4322 boards */ +#define SSB_BOARD_BCM94322MC	0x04A4 +#define SSB_BOARD_BCM94322USB	0x04A8	/* dualband */ +#define SSB_BOARD_BCM94322HM	0x04B0 +#define SSB_BOARD_BCM94322USB2D	0x04Bf	/* single band discrete front end */ +/* 4312 boards */ +#define SSB_BOARD_BU4312	0x048A +#define SSB_BOARD_BCM4312MCGSG	0x04B5  /* chip_package */  #define SSB_CHIPPACK_BCM4712S	1	/* Small 200pin 4712 */  #define SSB_CHIPPACK_BCM4712M	2	/* Medium 225pin 4712 */ diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index 9e492be5244..6fcfe99bd99 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h @@ -219,6 +219,7 @@  #define SSB_CHIPCO_PMU_CTL			0x0600 /* PMU control */  #define  SSB_CHIPCO_PMU_CTL_ILP_DIV		0xFFFF0000 /* ILP div mask */  #define  SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT	16 +#define  SSB_CHIPCO_PMU_CTL_PLL_UPD		0x00000400  #define  SSB_CHIPCO_PMU_CTL_NOILPONW		0x00000200 /* No ILP on wait */  #define  SSB_CHIPCO_PMU_CTL_HTREQEN		0x00000100 /* HT req enable */  #define  SSB_CHIPCO_PMU_CTL_ALPREQEN		0x00000080 /* ALP req enable */ @@ -667,5 +668,6 @@ enum ssb_pmu_ldo_volt_id {  void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc,  			     enum ssb_pmu_ldo_volt_id id, u32 voltage);  void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid);  #endif /* LINUX_SSB_CHIPCO_H_ */ diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index 6ecfa02ddba..3a7256955b1 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h @@ -289,11 +289,11 @@  #define  SSB_SPROM4_ETHPHY_ET1A_SHIFT	5  #define  SSB_SPROM4_ETHPHY_ET0M		(1<<14)	/* MDIO for enet0 */  #define  SSB_SPROM4_ETHPHY_ET1M		(1<<15)	/* MDIO for enet1 */ -#define SSB_SPROM4_ANTAVAIL		0x005D  /* Antenna available bitfields */ -#define  SSB_SPROM4_ANTAVAIL_A		0x00FF	/* A-PHY bitfield */ -#define  SSB_SPROM4_ANTAVAIL_A_SHIFT	0 -#define  SSB_SPROM4_ANTAVAIL_BG		0xFF00	/* B-PHY and G-PHY bitfield */ -#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT	8 +#define SSB_SPROM4_ANTAVAIL		0x005C  /* Antenna available bitfields */ +#define  SSB_SPROM4_ANTAVAIL_BG		0x00FF	/* B-PHY and G-PHY bitfield */ +#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT	0 +#define  SSB_SPROM4_ANTAVAIL_A		0xFF00	/* A-PHY bitfield */ +#define  SSB_SPROM4_ANTAVAIL_A_SHIFT	8  #define SSB_SPROM4_AGAIN01		0x005E	/* Antenna Gain (in dBm Q5.2) */  #define  SSB_SPROM4_AGAIN0		0x00FF	/* Antenna 0 */  #define  SSB_SPROM4_AGAIN0_SHIFT	0 diff --git a/include/linux/ssbi.h b/include/linux/ssbi.h new file mode 100644 index 00000000000..44ef5da2147 --- /dev/null +++ b/include/linux/ssbi.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2010 Google, Inc. + * Copyright (c) 2011, Code Aurora Forum. All rights reserved. + * Author: Dima Zavin <dima@android.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef _LINUX_SSBI_H +#define _LINUX_SSBI_H + +#include <linux/types.h> + +struct ssbi_slave_info { +	const char	*name; +	void		*platform_data; +}; + +enum ssbi_controller_type { +	MSM_SBI_CTRL_SSBI = 0, +	MSM_SBI_CTRL_SSBI2, +	MSM_SBI_CTRL_PMIC_ARBITER, +}; + +struct ssbi_platform_data { +	struct ssbi_slave_info	slave; +	enum ssbi_controller_type controller_type; +}; + +int ssbi_write(struct device *dev, u16 addr, u8 *buf, int len); +int ssbi_read(struct device *dev, u16 addr, u8 *buf, int len); +#endif diff --git a/include/linux/string_helpers.h b/include/linux/string_helpers.h index a3eb2f65b65..3eeee9672a4 100644 --- a/include/linux/string_helpers.h +++ b/include/linux/string_helpers.h @@ -13,4 +13,62 @@ enum string_size_units {  int string_get_size(u64 size, enum string_size_units units,  		    char *buf, int len); +#define UNESCAPE_SPACE		0x01 +#define UNESCAPE_OCTAL		0x02 +#define UNESCAPE_HEX		0x04 +#define UNESCAPE_SPECIAL	0x08 +#define UNESCAPE_ANY		\ +	(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL) + +/** + * string_unescape - unquote characters in the given string + * @src:	source buffer (escaped) + * @dst:	destination buffer (unescaped) + * @size:	size of the destination buffer (0 to unlimit) + * @flags:	combination of the flags (bitwise OR): + *	%UNESCAPE_SPACE: + *		'\f' - form feed + *		'\n' - new line + *		'\r' - carriage return + *		'\t' - horizontal tab + *		'\v' - vertical tab + *	%UNESCAPE_OCTAL: + *		'\NNN' - byte with octal value NNN (1 to 3 digits) + *	%UNESCAPE_HEX: + *		'\xHH' - byte with hexadecimal value HH (1 to 2 digits) + *	%UNESCAPE_SPECIAL: + *		'\"' - double quote + *		'\\' - backslash + *		'\a' - alert (BEL) + *		'\e' - escape + *	%UNESCAPE_ANY: + *		all previous together + * + * Returns amount of characters processed to the destination buffer excluding + * trailing '\0'. + * + * Because the size of the output will be the same as or less than the size of + * the input, the transformation may be performed in place. + * + * Caller must provide valid source and destination pointers. Be aware that + * destination buffer will always be NULL-terminated. Source string must be + * NULL-terminated as well. + */ +int string_unescape(char *src, char *dst, size_t size, unsigned int flags); + +static inline int string_unescape_inplace(char *buf, unsigned int flags) +{ +	return string_unescape(buf, buf, 0, flags); +} + +static inline int string_unescape_any(char *src, char *dst, size_t size) +{ +	return string_unescape(src, dst, size, UNESCAPE_ANY); +} + +static inline int string_unescape_any_inplace(char *buf) +{ +	return string_unescape_any(buf, buf, 0); +} +  #endif diff --git a/include/linux/swap.h b/include/linux/swap.h index 2818a123f3e..1701ce4be74 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -236,7 +236,7 @@ extern unsigned long nr_free_pagecache_pages(void);  extern void __lru_cache_add(struct page *, enum lru_list lru);  extern void lru_cache_add_lru(struct page *, enum lru_list lru);  extern void lru_add_page_tail(struct page *page, struct page *page_tail, -			      struct lruvec *lruvec); +			 struct lruvec *lruvec, struct list_head *head);  extern void activate_page(struct page *);  extern void mark_page_accessed(struct page *);  extern void lru_add_drain(void); @@ -330,6 +330,9 @@ static inline void mem_cgroup_uncharge_swap(swp_entry_t ent)  /* linux/mm/page_io.c */  extern int swap_readpage(struct page *);  extern int swap_writepage(struct page *page, struct writeback_control *wbc); +extern void end_swap_bio_write(struct bio *bio, int err); +extern int __swap_writepage(struct page *page, struct writeback_control *wbc, +	void (*end_write_func)(struct bio *, int));  extern int swap_set_page_dirty(struct page *page);  extern void end_swap_bio_read(struct bio *bio, int err); @@ -343,8 +346,9 @@ extern struct address_space swapper_spaces[];  #define swap_address_space(entry) (&swapper_spaces[swp_type(entry)])  extern unsigned long total_swapcache_pages(void);  extern void show_swap_cache_info(void); -extern int add_to_swap(struct page *); +extern int add_to_swap(struct page *, struct list_head *list);  extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); +extern int __add_to_swap_cache(struct page *page, swp_entry_t entry);  extern void __delete_from_swap_cache(struct page *);  extern void delete_from_swap_cache(struct page *);  extern void free_page_and_swap_cache(struct page *); @@ -461,7 +465,7 @@ static inline struct page *lookup_swap_cache(swp_entry_t swp)  	return NULL;  } -static inline int add_to_swap(struct page *page) +static inline int add_to_swap(struct page *page, struct list_head *list)  {  	return 0;  } diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 2de42f9401d..a5ffd32642f 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -25,6 +25,7 @@ extern int swiotlb_force;  extern void swiotlb_init(int verbose);  int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);  extern unsigned long swiotlb_nr_tbl(void); +unsigned long swiotlb_size_or_default(void);  extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);  /* diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 313a8e0a655..4147d700a29 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -78,49 +78,34 @@ struct sigaltstack;  #include <linux/key.h>  #include <trace/syscall.h> -#define __SC_DECL1(t1, a1)	t1 a1 -#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) -#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) -#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__) -#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__) -#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__) - -#define __SC_LONG1(t1, a1) 	long a1 -#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__) -#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__) -#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__) -#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__) -#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__) - -#define __SC_CAST1(t1, a1)	(t1) a1 -#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__) -#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__) -#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__) -#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__) -#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__) +/* + * __MAP - apply a macro to syscall arguments + * __MAP(n, m, t1, a1, t2, a2, ..., tn, an) will expand to + *    m(t1, a1), m(t2, a2), ..., m(tn, an) + * The first argument must be equal to the amount of type/name + * pairs given.  Note that this list of pairs (i.e. the arguments + * of __MAP starting at the third one) is in the same format as + * for SYSCALL_DEFINE<n>/COMPAT_SYSCALL_DEFINE<n> + */ +#define __MAP0(m,...) +#define __MAP1(m,t,a) m(t,a) +#define __MAP2(m,t,a,...) m(t,a), __MAP1(m,__VA_ARGS__) +#define __MAP3(m,t,a,...) m(t,a), __MAP2(m,__VA_ARGS__) +#define __MAP4(m,t,a,...) m(t,a), __MAP3(m,__VA_ARGS__) +#define __MAP5(m,t,a,...) m(t,a), __MAP4(m,__VA_ARGS__) +#define __MAP6(m,t,a,...) m(t,a), __MAP5(m,__VA_ARGS__) +#define __MAP(n,...) __MAP##n(__VA_ARGS__) -#define __SC_TEST(type)		BUILD_BUG_ON(sizeof(type) > sizeof(long)) -#define __SC_TEST1(t1, a1)	__SC_TEST(t1) -#define __SC_TEST2(t2, a2, ...)	__SC_TEST(t2); __SC_TEST1(__VA_ARGS__) -#define __SC_TEST3(t3, a3, ...)	__SC_TEST(t3); __SC_TEST2(__VA_ARGS__) -#define __SC_TEST4(t4, a4, ...)	__SC_TEST(t4); __SC_TEST3(__VA_ARGS__) -#define __SC_TEST5(t5, a5, ...)	__SC_TEST(t5); __SC_TEST4(__VA_ARGS__) -#define __SC_TEST6(t6, a6, ...)	__SC_TEST(t6); __SC_TEST5(__VA_ARGS__) +#define __SC_DECL(t, a)	t a +#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) +#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a +#define __SC_CAST(t, a)	(t) a +#define __SC_ARGS(t, a)	a +#define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))  #ifdef CONFIG_FTRACE_SYSCALLS -#define __SC_STR_ADECL1(t, a)		#a -#define __SC_STR_ADECL2(t, a, ...)	#a, __SC_STR_ADECL1(__VA_ARGS__) -#define __SC_STR_ADECL3(t, a, ...)	#a, __SC_STR_ADECL2(__VA_ARGS__) -#define __SC_STR_ADECL4(t, a, ...)	#a, __SC_STR_ADECL3(__VA_ARGS__) -#define __SC_STR_ADECL5(t, a, ...)	#a, __SC_STR_ADECL4(__VA_ARGS__) -#define __SC_STR_ADECL6(t, a, ...)	#a, __SC_STR_ADECL5(__VA_ARGS__) - -#define __SC_STR_TDECL1(t, a)		#t -#define __SC_STR_TDECL2(t, a, ...)	#t, __SC_STR_TDECL1(__VA_ARGS__) -#define __SC_STR_TDECL3(t, a, ...)	#t, __SC_STR_TDECL2(__VA_ARGS__) -#define __SC_STR_TDECL4(t, a, ...)	#t, __SC_STR_TDECL3(__VA_ARGS__) -#define __SC_STR_TDECL5(t, a, ...)	#t, __SC_STR_TDECL4(__VA_ARGS__) -#define __SC_STR_TDECL6(t, a, ...)	#t, __SC_STR_TDECL5(__VA_ARGS__) +#define __SC_STR_ADECL(t, a)	#a +#define __SC_STR_TDECL(t, a)	#t  extern struct ftrace_event_class event_class_syscall_enter;  extern struct ftrace_event_class event_class_syscall_exit; @@ -155,7 +140,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;  	  __attribute__((section("_ftrace_events")))			\  	*__event_exit_##sname = &event_exit_##sname; -#define SYSCALL_METADATA(sname, nb)				\ +#define SYSCALL_METADATA(sname, nb, ...)			\ +	static const char *types_##sname[] = {			\ +		__MAP(nb,__SC_STR_TDECL,__VA_ARGS__)		\ +	};							\ +	static const char *args_##sname[] = {			\ +		__MAP(nb,__SC_STR_ADECL,__VA_ARGS__)		\ +	};							\  	SYSCALL_TRACE_ENTER_EVENT(sname);			\  	SYSCALL_TRACE_EXIT_EVENT(sname);			\  	static struct syscall_metadata __used			\ @@ -163,8 +154,8 @@ extern struct trace_event_functions exit_syscall_print_funcs;  		.name 		= "sys"#sname,			\  		.syscall_nr	= -1,	/* Filled in at boot */	\  		.nb_args 	= nb,				\ -		.types		= types_##sname,		\ -		.args		= args_##sname,			\ +		.types		= nb ? types_##sname : NULL,	\ +		.args		= nb ? args_##sname : NULL,	\  		.enter_event	= &event_enter_##sname,		\  		.exit_event	= &event_exit_##sname,		\  		.enter_fields	= LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ @@ -172,26 +163,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;  	static struct syscall_metadata __used			\  	  __attribute__((section("__syscalls_metadata")))	\  	 *__p_syscall_meta_##sname = &__syscall_meta_##sname; +#else +#define SYSCALL_METADATA(sname, nb, ...) +#endif  #define SYSCALL_DEFINE0(sname)					\ -	SYSCALL_TRACE_ENTER_EVENT(_##sname);			\ -	SYSCALL_TRACE_EXIT_EVENT(_##sname);			\ -	static struct syscall_metadata __used			\ -	  __syscall_meta__##sname = {				\ -		.name 		= "sys_"#sname,			\ -		.syscall_nr	= -1,	/* Filled in at boot */	\ -		.nb_args 	= 0,				\ -		.enter_event	= &event_enter__##sname,	\ -		.exit_event	= &event_exit__##sname,		\ -		.enter_fields	= LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \ -	};							\ -	static struct syscall_metadata __used			\ -	  __attribute__((section("__syscalls_metadata")))	\ -	 *__p_syscall_meta_##sname = &__syscall_meta__##sname;	\ +	SYSCALL_METADATA(_##sname, 0);				\  	asmlinkage long sys_##sname(void) -#else -#define SYSCALL_DEFINE0(name)	   asmlinkage long sys_##name(void) -#endif  #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)  #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) @@ -200,57 +178,23 @@ extern struct trace_event_functions exit_syscall_print_funcs;  #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)  #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) -#ifdef CONFIG_PPC64 -#define SYSCALL_ALIAS(alias, name)					\ -	asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"	\ -	     "\t.globl ." #alias "\n\t.set ." #alias ", ." #name) -#else -#if defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) -#define SYSCALL_ALIAS(alias, name)					\ -	asm ( #alias " = " #name "\n\t.globl " #alias) -#else -#define SYSCALL_ALIAS(alias, name)					\ -	asm ("\t.globl " #alias "\n\t.set " #alias ", " #name) -#endif -#endif - -#ifdef CONFIG_FTRACE_SYSCALLS  #define SYSCALL_DEFINEx(x, sname, ...)				\ -	static const char *types_##sname[] = {			\ -		__SC_STR_TDECL##x(__VA_ARGS__)			\ -	};							\ -	static const char *args_##sname[] = {			\ -		__SC_STR_ADECL##x(__VA_ARGS__)			\ -	};							\ -	SYSCALL_METADATA(sname, x);				\ +	SYSCALL_METADATA(sname, x, __VA_ARGS__)			\  	__SYSCALL_DEFINEx(x, sname, __VA_ARGS__) -#else -#define SYSCALL_DEFINEx(x, sname, ...)				\ -	__SYSCALL_DEFINEx(x, sname, __VA_ARGS__) -#endif - -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS - -#define SYSCALL_DEFINE(name) static inline long SYSC_##name +#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)  #define __SYSCALL_DEFINEx(x, name, ...)					\ -	asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));		\ -	static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));	\ -	asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))		\ +	asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));	\ +	static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));	\ +	asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))	\  	{								\ -		__SC_TEST##x(__VA_ARGS__);				\ -		return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));	\ +		long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));	\ +		__MAP(x,__SC_TEST,__VA_ARGS__);				\ +		__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));	\ +		return ret;						\  	}								\  	SYSCALL_ALIAS(sys##name, SyS##name);				\ -	static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)) - -#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ - -#define SYSCALL_DEFINE(name) asmlinkage long sys_##name -#define __SYSCALL_DEFINEx(x, name, ...)					\ -	asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)) - -#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ +	static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))  asmlinkage long sys_time(time_t __user *tloc);  asmlinkage long sys_stime(time_t __user *tptr); @@ -694,7 +638,7 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);  asmlinkage long sys_semget(key_t key, int nsems, int semflg);  asmlinkage long sys_semop(int semid, struct sembuf __user *sops,  				unsigned nsops); -asmlinkage long sys_semctl(int semid, int semnum, int cmd, union semun arg); +asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);  asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,  				unsigned nsops,  				const struct timespec __user *timeout); diff --git a/include/linux/tcp.h b/include/linux/tcp.h index f28408c07dc..5adbc33d1ab 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -90,9 +90,6 @@ struct tcp_options_received {  		sack_ok : 4,	/* SACK seen on SYN packet		*/  		snd_wscale : 4,	/* Window scaling received from sender	*/  		rcv_wscale : 4;	/* Window scaling to send to receiver	*/ -	u8	cookie_plus:6,	/* bytes in authenticator/cookie option	*/ -		cookie_out_never:1, -		cookie_in_always:1;  	u8	num_sacks;	/* Number of SACK blocks		*/  	u16	user_mss;	/* mss requested by user in ioctl	*/  	u16	mss_clamp;	/* Maximal mss, negotiated at connection setup */ @@ -102,7 +99,6 @@ static inline void tcp_clear_options(struct tcp_options_received *rx_opt)  {  	rx_opt->tstamp_ok = rx_opt->sack_ok = 0;  	rx_opt->wscale_ok = rx_opt->snd_wscale = 0; -	rx_opt->cookie_plus = 0;  }  /* This is the max number of SACKS that we'll generate and process. It's safe @@ -191,20 +187,19 @@ struct tcp_sock {  	u32	window_clamp;	/* Maximal window to advertise		*/  	u32	rcv_ssthresh;	/* Current window clamp			*/ -	u32	frto_highmark;	/* snd_nxt when RTO occurred */  	u16	advmss;		/* Advertised MSS			*/ -	u8	frto_counter;	/* Number of new acks after RTO */ +	u8	unused;  	u8	nonagle     : 4,/* Disable Nagle algorithm?             */  		thin_lto    : 1,/* Use linear timeouts for thin streams */  		thin_dupack : 1,/* Fast retransmit on first dupack      */  		repair      : 1, -		unused      : 1; +		frto        : 1;/* F-RTO (RFC5682) activated in CA_Loss */  	u8	repair_queue;  	u8	do_early_retrans:1,/* Enable RFC5827 early-retransmit  */ -		early_retrans_delayed:1, /* Delayed ER timer installed */  		syn_data:1,	/* SYN includes data */  		syn_fastopen:1,	/* SYN includes Fast Open option */  		syn_data_acked:1;/* data in SYN is acked by SYN-ACK */ +	u32	tlp_high_seq;	/* snd_nxt at the time of TLP retransmit. */  /* RTT measurement */  	u32	srtt;		/* smoothed round trip time << 3	*/ @@ -320,12 +315,6 @@ struct tcp_sock {  	struct tcp_md5sig_info	__rcu *md5sig_info;  #endif -	/* When the cookie options are generated and exchanged, then this -	 * object holds a reference to them (cookie_values->kref).  Also -	 * contains related tcp_cookie_transactions fields. -	 */ -	struct tcp_cookie_values  *cookie_values; -  /* TCP fastopen related information */  	struct tcp_fastopen_request *fastopen_req;  	/* fastopen_rsk points to request_sock that resulted in this big @@ -361,10 +350,6 @@ struct tcp_timewait_sock {  #ifdef CONFIG_TCP_MD5SIG  	struct tcp_md5sig_key	  *tw_md5_key;  #endif -	/* Few sockets in timewait have cookies; in that case, then this -	 * object holds a reference to them (tw_cookie_values->kref). -	 */ -	struct tcp_cookie_values  *tw_cookie_values;  };  static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) diff --git a/include/linux/tegra-powergate.h b/include/linux/tegra-powergate.h new file mode 100644 index 00000000000..55c29a8d501 --- /dev/null +++ b/include/linux/tegra-powergate.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2010 Google, Inc + * + * Author: + *	Colin Cross <ccross@google.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef _MACH_TEGRA_POWERGATE_H_ +#define _MACH_TEGRA_POWERGATE_H_ + +struct clk; + +#define TEGRA_POWERGATE_CPU	0 +#define TEGRA_POWERGATE_3D	1 +#define TEGRA_POWERGATE_VENC	2 +#define TEGRA_POWERGATE_PCIE	3 +#define TEGRA_POWERGATE_VDEC	4 +#define TEGRA_POWERGATE_L2	5 +#define TEGRA_POWERGATE_MPE	6 +#define TEGRA_POWERGATE_HEG	7 +#define TEGRA_POWERGATE_SATA	8 +#define TEGRA_POWERGATE_CPU1	9 +#define TEGRA_POWERGATE_CPU2	10 +#define TEGRA_POWERGATE_CPU3	11 +#define TEGRA_POWERGATE_CELP	12 +#define TEGRA_POWERGATE_3D1	13 + +#define TEGRA_POWERGATE_CPU0	TEGRA_POWERGATE_CPU +#define TEGRA_POWERGATE_3D0	TEGRA_POWERGATE_3D + +int tegra_powergate_is_powered(int id); +int tegra_powergate_power_on(int id); +int tegra_powergate_power_off(int id); +int tegra_powergate_remove_clamping(int id); + +/* Must be called with clk disabled, and returns with clk enabled */ +int tegra_powergate_sequence_power_up(int id, struct clk *clk); + +#endif /* _MACH_TEGRA_POWERGATE_H_ */ diff --git a/include/linux/thermal.h b/include/linux/thermal.h index f0bd7f90a90..e3c0ae9bb1f 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -44,7 +44,7 @@  /* Adding event notification support elements */  #define THERMAL_GENL_FAMILY_NAME                "thermal_event"  #define THERMAL_GENL_VERSION                    0x01 -#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group" +#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_grp"  /* Default Thermal Governor */  #if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE) diff --git a/include/linux/time.h b/include/linux/time.h index d4835dfdf25..22d81b3c955 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -181,6 +181,9 @@ extern struct timespec timespec_trunc(struct timespec t, unsigned gran);  extern int timekeeping_valid_for_hres(void);  extern u64 timekeeping_max_deferment(void);  extern int timekeeping_inject_offset(struct timespec *ts); +extern s32 timekeeping_get_tai_offset(void); +extern void timekeeping_set_tai_offset(s32 tai_offset); +extern void timekeeping_clocktai(struct timespec *ts);  struct tms;  extern void do_sys_times(struct tms *); diff --git a/include/linux/timekeeper_internal.h b/include/linux/timekeeper_internal.h index e1d558e237e..c1825eb436e 100644 --- a/include/linux/timekeeper_internal.h +++ b/include/linux/timekeeper_internal.h @@ -20,6 +20,8 @@ struct timekeeper {  	u32			shift;  	/* Number of clock cycles in one NTP interval. */  	cycle_t			cycle_interval; +	/* Last cycle value (also stored in clock->cycle_last) */ +	cycle_t			cycle_last;  	/* Number of clock shifted nano seconds in one NTP interval. */  	u64			xtime_interval;  	/* shifted nano seconds left over when rounding cycle_interval */ @@ -62,8 +64,11 @@ struct timekeeper {  	ktime_t			offs_boot;  	/* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */  	struct timespec		raw_time; -	/* Seqlock for all timekeeper values */ -	seqlock_t		lock; +	/* The current UTC to TAI offset in seconds */ +	s32			tai_offset; +	/* Offset clock monotonic -> clock tai */ +	ktime_t			offs_tai; +  };  static inline struct timespec tk_xtime(struct timekeeper *tk) diff --git a/include/linux/timeriomem-rng.h b/include/linux/timeriomem-rng.h index 3e08a1c8683..46eb27ddbfa 100644 --- a/include/linux/timeriomem-rng.h +++ b/include/linux/timeriomem-rng.h @@ -8,12 +8,7 @@   * published by the Free Software Foundation.   */ -#include <linux/completion.h> -  struct timeriomem_rng_data { -	struct completion	completion; -	unsigned int		present:1; -  	void __iomem		*address;  	/* measures in usecs */ diff --git a/include/linux/timex.h b/include/linux/timex.h index 5ec87c60b97..b3726e61368 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -125,9 +125,6 @@  extern unsigned long tick_usec;		/* USER_HZ period (usec) */  extern unsigned long tick_nsec;		/* SHIFTED_HZ period (nsec) */ -extern void ntp_init(void); -extern void ntp_clear(void); -  /* Required to safely shift negative values */  #define shift_right(x, s) ({	\  	__typeof__(x) __x = (x);	\ @@ -140,10 +137,6 @@ extern void ntp_clear(void);  #define NTP_INTERVAL_FREQ  (HZ)  #define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ) -/* Returns how long ticks are at present, in ns / 2^NTP_SCALE_SHIFT. */ -extern u64 ntp_tick_length(void); - -extern int second_overflow(unsigned long secs);  extern int do_adjtimex(struct timex *);  extern void hardpps(const struct timespec *, const struct timespec *); diff --git a/include/linux/trace_clock.h b/include/linux/trace_clock.h index d563f37e1a1..1d7ca273927 100644 --- a/include/linux/trace_clock.h +++ b/include/linux/trace_clock.h @@ -16,6 +16,7 @@  extern u64 notrace trace_clock_local(void);  extern u64 notrace trace_clock(void); +extern u64 notrace trace_clock_jiffies(void);  extern u64 notrace trace_clock_global(void);  extern u64 notrace trace_clock_counter(void); diff --git a/include/linux/tty.h b/include/linux/tty.h index c75d886b030..7e92bd86a80 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -255,9 +255,9 @@ struct tty_struct {  	int count;  	struct winsize winsize;		/* termios mutex */  	unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; -	unsigned char warned:1;  	unsigned char ctrl_status;	/* ctrl_lock */  	unsigned int receive_room;	/* Bytes free for queue */ +	int flow_change;  	struct tty_struct *link;  	struct fasync_struct *fasync; @@ -315,9 +315,25 @@ struct tty_file_private {  #define TTY_NO_WRITE_SPLIT 	17	/* Preserve write boundaries to driver */  #define TTY_HUPPED 		18	/* Post driver->hangup() */  #define TTY_HUPPING 		21	/* ->hangup() in progress */ +#define TTY_LDISC_HALTED	22	/* Line discipline is halted */  #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) +/* Values for tty->flow_change */ +#define TTY_THROTTLE_SAFE 1 +#define TTY_UNTHROTTLE_SAFE 2 + +static inline void __tty_set_flow_change(struct tty_struct *tty, int val) +{ +	tty->flow_change = val; +} + +static inline void tty_set_flow_change(struct tty_struct *tty, int val) +{ +	tty->flow_change = val; +	smp_mb(); +} +  #ifdef CONFIG_TTY  extern void console_init(void);  extern void tty_kref_put(struct tty_struct *tty); @@ -400,6 +416,8 @@ extern int tty_write_room(struct tty_struct *tty);  extern void tty_driver_flush_buffer(struct tty_struct *tty);  extern void tty_throttle(struct tty_struct *tty);  extern void tty_unthrottle(struct tty_struct *tty); +extern int tty_throttle_safe(struct tty_struct *tty); +extern int tty_unthrottle_safe(struct tty_struct *tty);  extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);  extern void tty_driver_remove_tty(struct tty_driver *driver,  				  struct tty_struct *tty); @@ -419,13 +437,28 @@ extern void tty_flush_to_ldisc(struct tty_struct *tty);  extern void tty_buffer_free_all(struct tty_port *port);  extern void tty_buffer_flush(struct tty_struct *tty);  extern void tty_buffer_init(struct tty_port *port); -extern speed_t tty_get_baud_rate(struct tty_struct *tty);  extern speed_t tty_termios_baud_rate(struct ktermios *termios);  extern speed_t tty_termios_input_baud_rate(struct ktermios *termios);  extern void tty_termios_encode_baud_rate(struct ktermios *termios,  						speed_t ibaud, speed_t obaud);  extern void tty_encode_baud_rate(struct tty_struct *tty,  						speed_t ibaud, speed_t obaud); + +/** + *	tty_get_baud_rate	-	get tty bit rates + *	@tty: tty to query + * + *	Returns the baud rate as an integer for this terminal. The + *	termios lock must be held by the caller and the terminal bit + *	flags may be updated. + * + *	Locking: none + */ +static inline speed_t tty_get_baud_rate(struct tty_struct *tty) +{ +	return tty_termios_baud_rate(&tty->termios); +} +  extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);  extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b);  extern int tty_set_termios(struct tty_struct *tty, struct ktermios *kt); @@ -502,6 +535,8 @@ extern int tty_port_carrier_raised(struct tty_port *port);  extern void tty_port_raise_dtr_rts(struct tty_port *port);  extern void tty_port_lower_dtr_rts(struct tty_port *port);  extern void tty_port_hangup(struct tty_port *port); +extern void tty_port_tty_hangup(struct tty_port *port, bool check_clocal); +extern void tty_port_tty_wakeup(struct tty_port *port);  extern int tty_port_block_til_ready(struct tty_port *port,  				struct tty_struct *tty, struct file *filp);  extern int tty_port_close_start(struct tty_port *port, @@ -526,8 +561,6 @@ extern void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty);  extern void tty_ldisc_init(struct tty_struct *tty);  extern void tty_ldisc_deinit(struct tty_struct *tty);  extern void tty_ldisc_begin(void); -/* This last one is just for the tty layer internals and shouldn't be used elsewhere */ -extern void tty_ldisc_enable(struct tty_struct *tty);  /* n_tty.c */ @@ -658,5 +691,12 @@ do {									\  	finish_wait(&wq, &__wait);					\  } while (0) +#ifdef CONFIG_PROC_FS +extern void proc_tty_register_driver(struct tty_driver *); +extern void proc_tty_unregister_driver(struct tty_driver *); +#else +static inline void proc_tty_register_driver(struct tty_driver *d) {} +static inline void proc_tty_unregister_driver(struct tty_driver *d) {} +#endif  #endif diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h index 455a0d7bf22..58390c73df8 100644 --- a/include/linux/tty_ldisc.h +++ b/include/linux/tty_ldisc.h @@ -9,89 +9,89 @@   *   * int	(*open)(struct tty_struct *);   * - * 	This function is called when the line discipline is associated - * 	with the tty.  The line discipline can use this as an - * 	opportunity to initialize any state needed by the ldisc routines. - *  + *	This function is called when the line discipline is associated + *	with the tty.  The line discipline can use this as an + *	opportunity to initialize any state needed by the ldisc routines. + *   * void	(*close)(struct tty_struct *);   *   *	This function is called when the line discipline is being - * 	shutdown, either because the tty is being closed or because - * 	the tty is being changed to use a new line discipline - *  + *	shutdown, either because the tty is being closed or because + *	the tty is being changed to use a new line discipline + *   * void	(*flush_buffer)(struct tty_struct *tty);   * - * 	This function instructs the line discipline to clear its - * 	buffers of any input characters it may have queued to be - * 	delivered to the user mode process. - *  + *	This function instructs the line discipline to clear its + *	buffers of any input characters it may have queued to be + *	delivered to the user mode process. + *   * ssize_t (*chars_in_buffer)(struct tty_struct *tty);   * - * 	This function returns the number of input characters the line + *	This function returns the number of input characters the line   *	discipline may have queued up to be delivered to the user mode   *	process. - *  + *   * ssize_t (*read)(struct tty_struct * tty, struct file * file,   *		   unsigned char * buf, size_t nr);   * - * 	This function is called when the user requests to read from - * 	the tty.  The line discipline will return whatever characters - * 	it has buffered up for the user.  If this function is not - * 	defined, the user will receive an EIO error. - *  + *	This function is called when the user requests to read from + *	the tty.  The line discipline will return whatever characters + *	it has buffered up for the user.  If this function is not + *	defined, the user will receive an EIO error. + *   * ssize_t (*write)(struct tty_struct * tty, struct file * file, - * 		    const unsigned char * buf, size_t nr); + *		    const unsigned char * buf, size_t nr); + * + *	This function is called when the user requests to write to the + *	tty.  The line discipline will deliver the characters to the + *	low-level tty device for transmission, optionally performing + *	some processing on the characters first.  If this function is + *	not defined, the user will receive an EIO error.   * - * 	This function is called when the user requests to write to the - * 	tty.  The line discipline will deliver the characters to the - * 	low-level tty device for transmission, optionally performing - * 	some processing on the characters first.  If this function is - * 	not defined, the user will receive an EIO error. - *    * int	(*ioctl)(struct tty_struct * tty, struct file * file, - * 		 unsigned int cmd, unsigned long arg); + *		 unsigned int cmd, unsigned long arg);   *   *	This function is called when the user requests an ioctl which - * 	is not handled by the tty layer or the low-level tty driver. - * 	It is intended for ioctls which affect line discpline - * 	operation.  Note that the search order for ioctls is (1) tty - * 	layer, (2) tty low-level driver, (3) line discpline.  So a - * 	low-level driver can "grab" an ioctl request before the line - * 	discpline has a chance to see it. - *  + *	is not handled by the tty layer or the low-level tty driver. + *	It is intended for ioctls which affect line discpline + *	operation.  Note that the search order for ioctls is (1) tty + *	layer, (2) tty low-level driver, (3) line discpline.  So a + *	low-level driver can "grab" an ioctl request before the line + *	discpline has a chance to see it. + *   * long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, - * 		        unsigned int cmd, unsigned long arg); + *		        unsigned int cmd, unsigned long arg);   * - *      Process ioctl calls from 32-bit process on 64-bit system + *	Process ioctl calls from 32-bit process on 64-bit system   *   * void	(*set_termios)(struct tty_struct *tty, struct ktermios * old);   * - * 	This function notifies the line discpline that a change has - * 	been made to the termios structure. - *  + *	This function notifies the line discpline that a change has + *	been made to the termios structure. + *   * int	(*poll)(struct tty_struct * tty, struct file * file, - * 		  poll_table *wait); + *		  poll_table *wait);   * - * 	This function is called when a user attempts to select/poll on a - * 	tty device.  It is solely the responsibility of the line - * 	discipline to handle poll requests. + *	This function is called when a user attempts to select/poll on a + *	tty device.  It is solely the responsibility of the line + *	discipline to handle poll requests.   *   * void	(*receive_buf)(struct tty_struct *, const unsigned char *cp, - * 		       char *fp, int count); + *		       char *fp, int count); + * + *	This function is called by the low-level tty driver to send + *	characters received by the hardware to the line discpline for + *	processing.  <cp> is a pointer to the buffer of input + *	character received by the device.  <fp> is a pointer to a + *	pointer of flag bytes which indicate whether a character was + *	received with a parity error, etc.   * - * 	This function is called by the low-level tty driver to send - * 	characters received by the hardware to the line discpline for - * 	processing.  <cp> is a pointer to the buffer of input - * 	character received by the device.  <fp> is a pointer to a - * 	pointer of flag bytes which indicate whether a character was - * 	received with a parity error, etc. - *    * void	(*write_wakeup)(struct tty_struct *);   * - * 	This function is called by the low-level tty driver to signal - * 	that line discpline should try to send more characters to the - * 	low-level driver for transmission.  If the line discpline does - * 	not have any more data to send, it can just return. + *	This function is called by the low-level tty driver to signal + *	that line discpline should try to send more characters to the + *	low-level driver for transmission.  If the line discpline does + *	not have any more data to send, it can just return.   *   * int (*hangup)(struct tty_struct *)   * @@ -115,7 +115,7 @@ struct tty_ldisc_ops {  	char	*name;  	int	num;  	int	flags; -	 +  	/*  	 * The following routines are called from above.  	 */ @@ -123,19 +123,19 @@ struct tty_ldisc_ops {  	void	(*close)(struct tty_struct *);  	void	(*flush_buffer)(struct tty_struct *tty);  	ssize_t	(*chars_in_buffer)(struct tty_struct *tty); -	ssize_t	(*read)(struct tty_struct * tty, struct file * file, -			unsigned char __user * buf, size_t nr); -	ssize_t	(*write)(struct tty_struct * tty, struct file * file, -			 const unsigned char * buf, size_t nr);	 -	int	(*ioctl)(struct tty_struct * tty, struct file * file, +	ssize_t	(*read)(struct tty_struct *tty, struct file *file, +			unsigned char __user *buf, size_t nr); +	ssize_t	(*write)(struct tty_struct *tty, struct file *file, +			 const unsigned char *buf, size_t nr); +	int	(*ioctl)(struct tty_struct *tty, struct file *file,  			 unsigned int cmd, unsigned long arg); -	long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, +	long	(*compat_ioctl)(struct tty_struct *tty, struct file *file,  				unsigned int cmd, unsigned long arg); -	void	(*set_termios)(struct tty_struct *tty, struct ktermios * old); +	void	(*set_termios)(struct tty_struct *tty, struct ktermios *old);  	unsigned int (*poll)(struct tty_struct *, struct file *,  			     struct poll_table_struct *);  	int	(*hangup)(struct tty_struct *tty); -	 +  	/*  	 * The following routines are called from below.  	 */ @@ -145,7 +145,7 @@ struct tty_ldisc_ops {  	void	(*dcd_change)(struct tty_struct *, unsigned int);  	struct  module *owner; -	 +  	int refcount;  }; diff --git a/include/linux/ucs2_string.h b/include/linux/ucs2_string.h new file mode 100644 index 00000000000..cbb20afdbc0 --- /dev/null +++ b/include/linux/ucs2_string.h @@ -0,0 +1,14 @@ +#ifndef _LINUX_UCS2_STRING_H_ +#define _LINUX_UCS2_STRING_H_ + +#include <linux/types.h>	/* for size_t */ +#include <linux/stddef.h>	/* for NULL */ + +typedef u16 ucs2_char_t; + +unsigned long ucs2_strnlen(const ucs2_char_t *s, size_t maxlength); +unsigned long ucs2_strlen(const ucs2_char_t *s); +unsigned long ucs2_strsize(const ucs2_char_t *data, unsigned long maxlength); +int ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len); + +#endif /* _LINUX_UCS2_STRING_H_ */ diff --git a/include/linux/udp.h b/include/linux/udp.h index 9d81de123c9..42278bbf7a8 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h @@ -68,6 +68,7 @@ struct udp_sock {  	 * For encapsulation sockets.  	 */  	int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); +	void (*encap_destroy)(struct sock *sk);  };  static inline struct udp_sock *udp_sk(const struct sock *sk) diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index 02b83db8e2c..06f28beed7c 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -38,6 +38,8 @@ struct inode;  #define UPROBE_HANDLER_REMOVE		1  #define UPROBE_HANDLER_MASK		1 +#define MAX_URETPROBE_DEPTH		64 +  enum uprobe_filter_ctx {  	UPROBE_FILTER_REGISTER,  	UPROBE_FILTER_UNREGISTER, @@ -46,6 +48,9 @@ enum uprobe_filter_ctx {  struct uprobe_consumer {  	int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs); +	int (*ret_handler)(struct uprobe_consumer *self, +				unsigned long func, +				struct pt_regs *regs);  	bool (*filter)(struct uprobe_consumer *self,  				enum uprobe_filter_ctx ctx,  				struct mm_struct *mm); @@ -68,6 +73,8 @@ struct uprobe_task {  	enum uprobe_task_state		state;  	struct arch_uprobe_task		autask; +	struct return_instance		*return_instances; +	unsigned int			depth;  	struct uprobe			*active_uprobe;  	unsigned long			xol_vaddr; @@ -100,6 +107,7 @@ struct uprobes_state {  extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);  extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);  extern bool __weak is_swbp_insn(uprobe_opcode_t *insn); +extern bool __weak is_trap_insn(uprobe_opcode_t *insn);  extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);  extern int uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_consumer *uc, bool);  extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc); diff --git a/include/linux/usb.h b/include/linux/usb.h index 4d22d0f6167..a0bee5a28d1 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -469,14 +469,12 @@ struct usb3_lpm_parameters {   * @lpm_capable: device supports LPM   * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM   * @usb2_hw_lpm_enabled: USB2 hardware LPM enabled + * @usb3_lpm_enabled: USB3 hardware LPM enabled   * @string_langid: language ID for strings   * @product: iProduct string, if present (static)   * @manufacturer: iManufacturer string, if present (static)   * @serial: iSerialNumber string, if present (static)   * @filelist: usbfs files that are open to this device - * @usb_classdev: USB class device that was created for usbfs device - *	access from userspace - * @usbfs_dentry: usbfs dentry entry for the device   * @maxchild: number of ports if hub   * @quirks: quirks of the whole device   * @urbnum: number of URBs submitted for the whole device @@ -619,7 +617,7 @@ static inline bool usb_acpi_power_manageable(struct usb_device *hdev, int index)  #endif  /* USB autosuspend and autoresume */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  extern void usb_enable_autosuspend(struct usb_device *udev);  extern void usb_disable_autosuspend(struct usb_device *udev); @@ -978,7 +976,12 @@ struct usbdrv_wrap {   *	the "usbfs" filesystem.  This lets devices provide ways to   *	expose information to user space regardless of where they   *	do (or don't) show up otherwise in the filesystem. - * @suspend: Called when the device is going to be suspended by the system. + * @suspend: Called when the device is going to be suspended by the + *	system either from system sleep or runtime suspend context. The + *	return value will be ignored in system sleep context, so do NOT + *	try to continue using the device if suspend fails in this case. + *	Instead, let the resume or reset-resume routine recover from + *	the failure.   * @resume: Called when the device is being resumed by the system.   * @reset_resume: Called when the suspended device has been reset instead   *	of being resumed. diff --git a/include/linux/usb/audio-v2.h b/include/linux/usb/audio-v2.h index ed13053153f..c5f2158ab00 100644 --- a/include/linux/usb/audio-v2.h +++ b/include/linux/usb/audio-v2.h @@ -170,6 +170,8 @@ struct uac2_as_header_descriptor {  	__u8 iChannelNames;  } __attribute__((packed)); +#define UAC2_FORMAT_TYPE_I_RAW_DATA	(1 << 31) +  /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */  struct uac2_iso_endpoint_descriptor { diff --git a/include/linux/usb/cdc-wdm.h b/include/linux/usb/cdc-wdm.h index 719c332620f..0b3f4295c02 100644 --- a/include/linux/usb/cdc-wdm.h +++ b/include/linux/usb/cdc-wdm.h @@ -11,6 +11,8 @@  #ifndef __LINUX_USB_CDC_WDM_H  #define __LINUX_USB_CDC_WDM_H +#include <uapi/linux/usb/cdc-wdm.h> +  extern struct usb_driver *usb_cdc_wdm_register(struct usb_interface *intf,  					struct usb_endpoint_descriptor *ep,  					int bufsize, diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index 3b8f9d4fc3f..cc25b70af33 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h @@ -127,6 +127,7 @@ struct cdc_ncm_ctx {  	u16 connected;  }; +extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf);  extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting);  extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf);  extern struct sk_buff *cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign); diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 9c210f2283d..27603bcbb9b 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -43,4 +43,13 @@   */  extern const char *usb_speed_string(enum usb_device_speed speed); + +/** + * usb_state_string - Returns human readable name for the state. + * @state: The state to return a human-readable name for. If it's not + *	any of the states devices in usb_device_state_string enum, + *	the string UNKNOWN will be returned. + */ +extern const char *usb_state_string(enum usb_device_state state); +  #endif /* __LINUX_USB_CH9_H */ diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 8860594d636..5e61589fc16 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -39,6 +39,7 @@  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h>  #include <linux/log2.h> +#include <linux/configfs.h>  /*   * USB function drivers should return USB_GADGET_DELAYED_STATUS if they @@ -464,6 +465,8 @@ struct usb_function_driver {  };  struct usb_function_instance { +	struct config_group group; +	struct list_head cfs_list;  	struct usb_function_driver *fd;  	void (*free_func_inst)(struct usb_function_instance *inst);  }; diff --git a/include/linux/usb/dwc3-omap.h b/include/linux/usb/dwc3-omap.h index 51eae14477f..5615f4d8272 100644 --- a/include/linux/usb/dwc3-omap.h +++ b/include/linux/usb/dwc3-omap.h @@ -19,11 +19,11 @@ enum omap_dwc3_vbus_id_status {  };  #if (defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_DWC3_MODULE)) -extern void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status); +extern int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status);  #else -static inline void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status) +static inline int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)  { -	return; +	return -ENODEV;  }  #endif diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 2e297e80d59..c454a88abf2 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -482,6 +482,7 @@ struct usb_gadget_ops {   * @speed: Speed of current connection to USB host.   * @max_speed: Maximal speed the UDC can handle.  UDC must support this   *      and all slower speeds. + * @state: the state we are now (attached, suspended, configured, etc)   * @sg_supported: true if we can handle scatter-gather   * @is_otg: True if the USB device port uses a Mini-AB jack, so that the   *	gadget driver must provide a USB OTG descriptor. @@ -525,6 +526,7 @@ struct usb_gadget {  	struct list_head		ep_list;	/* of usb_ep */  	enum usb_device_speed		speed;  	enum usb_device_speed		max_speed; +	enum usb_device_state		state;  	unsigned			sg_supported:1;  	unsigned			is_otg:1;  	unsigned			is_a_peripheral:1; @@ -872,6 +874,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver);   */  int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); +extern int usb_add_gadget_udc_release(struct device *parent, +		struct usb_gadget *gadget, void (*release)(struct device *dev));  extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);  extern void usb_del_gadget_udc(struct usb_gadget *gadget);  extern int udc_attach_driver(const char *name, @@ -959,6 +963,13 @@ extern void usb_gadget_unmap_request(struct usb_gadget *gadget,  /*-------------------------------------------------------------------------*/ +/* utility to set gadget state properly */ + +extern void usb_gadget_set_state(struct usb_gadget *gadget, +		enum usb_device_state state); + +/*-------------------------------------------------------------------------*/ +  /* utility wrapping a simple endpoint selection policy */  extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, diff --git a/include/linux/usb/gadget_configfs.h b/include/linux/usb/gadget_configfs.h new file mode 100644 index 00000000000..d74c0ae989d --- /dev/null +++ b/include/linux/usb/gadget_configfs.h @@ -0,0 +1,110 @@ +#ifndef __GADGET_CONFIGFS__ +#define __GADGET_CONFIGFS__ + +#include <linux/configfs.h> + +int check_user_usb_string(const char *name, +		struct usb_gadget_strings *stringtab_dev); + +#define GS_STRINGS_W(__struct, __name)	\ +	static ssize_t __struct##_##__name##_store(struct __struct *gs, \ +		const char *page, size_t len)		\ +{							\ +	int ret;					\ +							\ +	ret = usb_string_copy(page, &gs->__name);	\ +	if (ret)					\ +		return ret;				\ +	return len;					\ +} + +#define GS_STRINGS_R(__struct, __name)	\ +	static ssize_t __struct##_##__name##_show(struct __struct *gs, \ +			char *page)	\ +{	\ +	return sprintf(page, "%s\n", gs->__name ?: "");	\ +} + +#define GS_STRING_ITEM_ATTR(struct_name, name)	\ +	static struct struct_name##_attribute struct_name##_##name = \ +		__CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,		\ +				struct_name##_##name##_show,		\ +				struct_name##_##name##_store) + +#define GS_STRINGS_RW(struct_name, _name)	\ +	GS_STRINGS_R(struct_name, _name)	\ +	GS_STRINGS_W(struct_name, _name)	\ +	GS_STRING_ITEM_ATTR(struct_name, _name) + +#define USB_CONFIG_STRING_RW_OPS(struct_in)				\ +	CONFIGFS_ATTR_OPS(struct_in);					\ +									\ +static struct configfs_item_operations struct_in##_langid_item_ops = {	\ +	.release                = struct_in##_attr_release,		\ +	.show_attribute         = struct_in##_attr_show,		\ +	.store_attribute        = struct_in##_attr_store,		\ +};									\ +									\ +static struct config_item_type struct_in##_langid_type = {		\ +	.ct_item_ops	= &struct_in##_langid_item_ops,			\ +	.ct_attrs	= struct_in##_langid_attrs,			\ +	.ct_owner	= THIS_MODULE,					\ +} + +#define USB_CONFIG_STRINGS_LANG(struct_in, struct_member)	\ +	static struct config_group *struct_in##_strings_make(		\ +			struct config_group *group,			\ +			const char *name)				\ +	{								\ +	struct struct_member *gi;					\ +	struct struct_in *gs;						\ +	struct struct_in *new;						\ +	int langs = 0;							\ +	int ret;							\ +									\ +	new = kzalloc(sizeof(*new), GFP_KERNEL);			\ +	if (!new)							\ +		return ERR_PTR(-ENOMEM);				\ +									\ +	ret = check_user_usb_string(name, &new->stringtab_dev);		\ +	if (ret)							\ +		goto err;						\ +	config_group_init_type_name(&new->group, name,			\ +			&struct_in##_langid_type);			\ +									\ +	gi = container_of(group, struct struct_member, strings_group);	\ +	ret = -EEXIST;							\ +	list_for_each_entry(gs, &gi->string_list, list) {		\ +		if (gs->stringtab_dev.language == new->stringtab_dev.language) \ +			goto err;					\ +		langs++;						\ +	}								\ +	ret = -EOVERFLOW;						\ +	if (langs >= MAX_USB_STRING_LANGS)				\ +		goto err;						\ +									\ +	list_add_tail(&new->list, &gi->string_list);			\ +	return &new->group;						\ +err:									\ +	kfree(new);							\ +	return ERR_PTR(ret);						\ +}									\ +									\ +static void struct_in##_strings_drop(					\ +		struct config_group *group,				\ +		struct config_item *item)				\ +{									\ +	config_item_put(item);						\ +}									\ +									\ +static struct configfs_group_operations struct_in##_strings_ops = {	\ +	.make_group     = &struct_in##_strings_make,			\ +	.drop_item      = &struct_in##_strings_drop,			\ +};									\ +									\ +static struct config_item_type struct_in##_strings_type = {		\ +	.ct_group_ops   = &struct_in##_strings_ops,			\ +	.ct_owner       = THIS_MODULE,					\ +} + +#endif diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 0a78df5f6cf..f5f5c7dfda9 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -84,7 +84,7 @@ struct usb_hcd {  	struct timer_list	rh_timer;	/* drives root-hub polling */  	struct urb		*status_urb;	/* the current status urb */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  	struct work_struct	wakeup_work;	/* for remote wakeup */  #endif @@ -357,6 +357,7 @@ struct hc_driver {  		 */  	int	(*disable_usb3_lpm_timeout)(struct usb_hcd *,  			struct usb_device *, enum usb3_link_state state); +	int	(*find_raw_port_number)(struct usb_hcd *, int);  };  extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); @@ -396,6 +397,7 @@ extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd);  extern int usb_add_hcd(struct usb_hcd *hcd,  		unsigned int irqnum, unsigned long irqflags);  extern void usb_remove_hcd(struct usb_hcd *hcd); +extern int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1);  struct platform_device;  extern void usb_hcd_platform_shutdown(struct platform_device *dev); @@ -591,14 +593,14 @@ extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg);  extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg);  #endif /* CONFIG_PM */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  extern void usb_hcd_resume_root_hub(struct usb_hcd *hcd);  #else  static inline void usb_hcd_resume_root_hub(struct usb_hcd *hcd)  {  	return;  } -#endif /* CONFIG_USB_SUSPEND */ +#endif /* CONFIG_PM_RUNTIME */  /*-------------------------------------------------------------------------*/ diff --git a/include/linux/irqchip/sunxi.h b/include/linux/usb/musb-ux500.h index 1fe2c2260e2..1e2c7130f6e 100644 --- a/include/linux/irqchip/sunxi.h +++ b/include/linux/usb/musb-ux500.h @@ -1,7 +1,5 @@  /* - * Copyright 2012 Maxime Ripard - * - * Maxime Ripard <maxime.ripard@free-electrons.com> + * Copyright (C) 2013 ST-Ericsson AB   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -14,14 +12,20 @@   * GNU General Public License for more details.   */ -#ifndef __LINUX_IRQCHIP_SUNXI_H -#define __LINUX_IRQCHIP_SUNXI_H - -#include <asm/exception.h> - -extern void sunxi_init_irq(void); +#ifndef __MUSB_UX500_H__ +#define __MUSB_UX500_H__ -extern asmlinkage void __exception_irq_entry sunxi_handle_irq( -	struct pt_regs *regs); +enum ux500_musb_vbus_id_status { +	UX500_MUSB_NONE = 0, +	UX500_MUSB_VBUS, +	UX500_MUSB_ID, +	UX500_MUSB_CHARGER, +	UX500_MUSB_ENUMERATED, +	UX500_MUSB_RIDA, +	UX500_MUSB_RIDB, +	UX500_MUSB_RIDC, +	UX500_MUSB_PREPARE, +	UX500_MUSB_CLEAN, +}; -#endif +#endif	/* __MUSB_UX500_H__ */ diff --git a/include/linux/usb/nop-usb-xceiv.h b/include/linux/usb/nop-usb-xceiv.h index 28884c71741..148d35171aa 100644 --- a/include/linux/usb/nop-usb-xceiv.h +++ b/include/linux/usb/nop-usb-xceiv.h @@ -5,6 +5,11 @@  struct nop_usb_xceiv_platform_data {  	enum usb_phy_type type; +	unsigned long clk_rate; + +	/* if set fails with -EPROBE_DEFER if can't get regulator */ +	unsigned int needs_vcc:1; +	unsigned int needs_reset:1;  };  #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index e8a5fe87c6b..291e01ba32e 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -36,14 +36,7 @@ struct usb_otg {  }; -#ifdef CONFIG_USB_OTG_UTILS -extern const char *otg_state_string(enum usb_otg_state state); -#else -static inline const char *otg_state_string(enum usb_otg_state state) -{ -	return NULL; -} -#endif +extern const char *usb_otg_state_string(enum usb_otg_state state);  /* Context: can sleep */  static inline int diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index 15847cbdb51..6b5978f5763 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -91,6 +91,9 @@ struct usb_phy {  	int	(*init)(struct usb_phy *x);  	void	(*shutdown)(struct usb_phy *x); +	/* enable/disable VBUS */ +	int	(*set_vbus)(struct usb_phy *x, int on); +  	/* effective for B devices, ignored for A-peripheral */  	int	(*set_power)(struct usb_phy *x,  				unsigned mA); @@ -160,8 +163,26 @@ usb_phy_shutdown(struct usb_phy *x)  		x->shutdown(x);  } +static inline int +usb_phy_vbus_on(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, true); +} + +static inline int +usb_phy_vbus_off(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, false); +} +  /* for usb host and peripheral controller drivers */ -#ifdef CONFIG_USB_OTG_UTILS +#if IS_ENABLED(CONFIG_USB_PHY)  extern struct usb_phy *usb_get_phy(enum usb_phy_type type);  extern struct usb_phy *devm_usb_get_phy(struct device *dev,  	enum usb_phy_type type); @@ -176,29 +197,29 @@ extern int usb_bind_phy(const char *dev_name, u8 index,  #else  static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy(struct device *dev,  	enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,  	const char *phandle, u8 index)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline void usb_put_phy(struct usb_phy *x) diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h index c5d36c65c33..e452ba6ec6b 100644 --- a/include/linux/usb/renesas_usbhs.h +++ b/include/linux/usb/renesas_usbhs.h @@ -62,14 +62,14 @@ struct renesas_usbhs_platform_callback {  	 * Hardware exit function for platform.  	 * it is called when driver was removed  	 */ -	void (*hardware_exit)(struct platform_device *pdev); +	int (*hardware_exit)(struct platform_device *pdev);  	/*  	 * option:  	 *  	 * for board specific clock control  	 */ -	void (*power_ctrl)(struct platform_device *pdev, +	int (*power_ctrl)(struct platform_device *pdev,  			   void __iomem *base, int enable);  	/* @@ -77,7 +77,7 @@ struct renesas_usbhs_platform_callback {  	 *  	 * Phy reset for platform  	 */ -	void (*phy_reset)(struct platform_device *pdev); +	int (*phy_reset)(struct platform_device *pdev);  	/*  	 * get USB ID function diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index ef9be7e1e19..b9b0f7b4e43 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -15,6 +15,7 @@  #include <linux/kref.h>  #include <linux/mutex.h> +#include <linux/serial.h>  #include <linux/sysrq.h>  #include <linux/kfifo.h> @@ -61,6 +62,7 @@   * @bulk_out_buffers: pointers to the bulk out buffers for this port   * @write_urbs: pointers to the bulk out urbs for this port   * @write_urbs_free: status bitmap the for bulk out urbs + * @icount: interrupt counters   * @tx_bytes: number of bytes currently in host stack queues   * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this   *	port. @@ -108,6 +110,7 @@ struct usb_serial_port {  	unsigned long		write_urbs_free;  	__u8			bulk_out_endpointAddress; +	struct async_icount	icount;  	int			tx_bytes;  	unsigned long		flags; @@ -270,6 +273,7 @@ struct usb_serial_driver {  	int  (*tiocmget)(struct tty_struct *tty);  	int  (*tiocmset)(struct tty_struct *tty,  			 unsigned int set, unsigned int clear); +	int  (*tiocmiwait)(struct tty_struct *tty, unsigned long arg);  	int  (*get_icount)(struct tty_struct *tty,  			struct serial_icounter_struct *icount);  	/* Called by the tty layer for port level work. There may or may not @@ -327,8 +331,10 @@ extern void usb_serial_generic_read_bulk_callback(struct urb *urb);  extern void usb_serial_generic_write_bulk_callback(struct urb *urb);  extern void usb_serial_generic_throttle(struct tty_struct *tty);  extern void usb_serial_generic_unthrottle(struct tty_struct *tty); -extern void usb_serial_generic_disconnect(struct usb_serial *serial); -extern void usb_serial_generic_release(struct usb_serial *serial); +extern int usb_serial_generic_tiocmiwait(struct tty_struct *tty, +							unsigned long arg); +extern int usb_serial_generic_get_icount(struct tty_struct *tty, +					struct serial_icounter_struct *icount);  extern int usb_serial_generic_register(void);  extern void usb_serial_generic_deregister(void);  extern int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port, diff --git a/include/linux/usb/tegra_usb_phy.h b/include/linux/usb/tegra_usb_phy.h index 9ebebe90692..1b7519a8c0b 100644 --- a/include/linux/usb/tegra_usb_phy.h +++ b/include/linux/usb/tegra_usb_phy.h @@ -61,10 +61,14 @@ struct tegra_usb_phy {  	struct device *dev;  	bool is_legacy_phy;  	bool is_ulpi_phy; +	void (*set_pts)(struct usb_phy *x, u8 pts_val); +	void (*set_phcd)(struct usb_phy *x, bool enable);  };  struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, -	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode); +	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode, +	void (*set_pts)(struct usb_phy *x, u8 pts_val), +	void (*set_phcd)(struct usb_phy *x, bool enable));  void tegra_usb_phy_preresume(struct usb_phy *phy); @@ -75,8 +79,4 @@ void tegra_ehci_phy_restore_start(struct usb_phy *phy,  void tegra_ehci_phy_restore_end(struct usb_phy *phy); -void tegra_ehci_set_pts(struct usb_phy *x, u8 pts_val); - -void tegra_ehci_set_phcd(struct usb_phy *x, bool enable); -  #endif /* __TEGRA_USB_PHY_H */ diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h index 6f033a415ec..5c295c26ad3 100644 --- a/include/linux/usb/ulpi.h +++ b/include/linux/usb/ulpi.h @@ -181,8 +181,16 @@  /*-------------------------------------------------------------------------*/ +#if IS_ENABLED(CONFIG_USB_ULPI)  struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,  					unsigned int flags); +#else +static inline struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops, +					      unsigned int flags) +{ +	return NULL; +} +#endif  #ifdef CONFIG_USB_ULPI_VIEWPORT  /* access ops for controllers with a viewport register */ diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 0e5ac93bab1..da46327fca1 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h @@ -72,6 +72,7 @@ struct usbnet {  #		define EVENT_DEVICE_REPORT_IDLE	8  #		define EVENT_NO_RUNTIME_PM	9  #		define EVENT_RX_KILL	10 +#		define EVENT_LINK_CHANGE	11  };  static inline struct usb_driver *driver_of(struct usb_interface *intf) @@ -245,5 +246,6 @@ extern void usbnet_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);  extern int usbnet_nway_reset(struct net_device *net);  extern int usbnet_manage_power(struct usbnet *, int); +extern void usbnet_link_change(struct usbnet *, bool, bool);  #endif /* __LINUX_USB_USBNET_H */ diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h index 4ce00932493..b6b215f13b4 100644 --- a/include/linux/user_namespace.h +++ b/include/linux/user_namespace.h @@ -26,6 +26,8 @@ struct user_namespace {  	kuid_t			owner;  	kgid_t			group;  	unsigned int		proc_inum; +	bool			may_mount_sysfs; +	bool			may_mount_proc;  };  extern struct user_namespace init_user_ns; @@ -82,4 +84,6 @@ static inline void put_user_ns(struct user_namespace *ns)  #endif +void update_mnt_policy(struct user_namespace *userns); +  #endif /* _LINUX_USER_H */ diff --git a/include/linux/vexpress.h b/include/linux/vexpress.h index 75818744ab5..ea7168a6808 100644 --- a/include/linux/vexpress.h +++ b/include/linux/vexpress.h @@ -115,9 +115,6 @@ unsigned __vexpress_get_site(struct device *dev, struct device_node *node);  void vexpress_sysreg_early_init(void __iomem *base);  void vexpress_sysreg_of_early_init(void); -void vexpress_power_off(void); -void vexpress_restart(char str, const char *cmd); -  /* Clocks */  struct clk *vexpress_osc_setup(struct device *dev); diff --git a/include/linux/vfio.h b/include/linux/vfio.h index ab9e86224c5..ac8d488e437 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -45,6 +45,9 @@ extern int vfio_add_group_dev(struct device *dev,  			      void *device_data);  extern void *vfio_del_group_dev(struct device *dev); +extern struct vfio_device *vfio_device_get_from_dev(struct device *dev); +extern void vfio_device_put(struct vfio_device *device); +extern void *vfio_device_data(struct vfio_device *device);  /**   * struct vfio_iommu_driver_ops - VFIO IOMMU driver callbacks diff --git a/include/linux/virtio.h b/include/linux/virtio.h index ff6714e6d0f..9ff8645b7e0 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -8,6 +8,7 @@  #include <linux/device.h>  #include <linux/mod_devicetable.h>  #include <linux/gfp.h> +#include <linux/vringh.h>  /**   * virtqueue - a queue to register buffers for sending or receiving. @@ -40,6 +41,23 @@ int virtqueue_add_buf(struct virtqueue *vq,  		      void *data,  		      gfp_t gfp); +int virtqueue_add_outbuf(struct virtqueue *vq, +			 struct scatterlist sg[], unsigned int num, +			 void *data, +			 gfp_t gfp); + +int virtqueue_add_inbuf(struct virtqueue *vq, +			struct scatterlist sg[], unsigned int num, +			void *data, +			gfp_t gfp); + +int virtqueue_add_sgs(struct virtqueue *vq, +		      struct scatterlist *sgs[], +		      unsigned int out_sgs, +		      unsigned int in_sgs, +		      void *data, +		      gfp_t gfp); +  void virtqueue_kick(struct virtqueue *vq);  bool virtqueue_kick_prepare(struct virtqueue *vq); @@ -58,18 +76,13 @@ void *virtqueue_detach_unused_buf(struct virtqueue *vq);  unsigned int virtqueue_get_vring_size(struct virtqueue *vq); -/* FIXME: Obsolete accessor, but required for virtio_net merge. */ -static inline unsigned int virtqueue_get_queue_index(struct virtqueue *vq) -{ -	return vq->index; -} -  /**   * virtio_device - representation of a device using virtio   * @index: unique position on the virtio bus   * @dev: underlying device.   * @id: the device type identification (used to match it with a driver).   * @config: the configuration ops for this device. + * @vringh_config: configuration ops for host vrings.   * @vqs: the list of virtqueues for this device.   * @features: the features supported by both driver and device.   * @priv: private pointer for the driver's use. @@ -79,6 +92,7 @@ struct virtio_device {  	struct device dev;  	struct virtio_device_id id;  	const struct virtio_config_ops *config; +	const struct vringh_config_ops *vringh_config;  	struct list_head vqs;  	/* Note that this is a Linux set_bit-style bitmap. */  	unsigned long features[1]; diff --git a/include/linux/virtio_caif.h b/include/linux/virtio_caif.h new file mode 100644 index 00000000000..5d2d3124ca3 --- /dev/null +++ b/include/linux/virtio_caif.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) ST-Ericsson AB 2012 + * Author: Sjur Brændeland <sjur.brandeland@stericsson.com> + * + * This header is BSD licensed so + * anyone can use the definitions to implement compatible remote processors + */ + +#ifndef VIRTIO_CAIF_H +#define VIRTIO_CAIF_H + +#include <linux/types.h> +struct virtio_caif_transf_config { +	u16 headroom; +	u16 tailroom; +	u32 mtu; +	u8 reserved[4]; +}; + +struct virtio_caif_config { +	struct virtio_caif_transf_config uplink, downlink; +	u8 reserved[8]; +}; +#endif diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 63c6ea19951..ca3ad41c2c8 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h @@ -4,6 +4,63 @@  #include <linux/irqreturn.h>  #include <uapi/linux/virtio_ring.h> +/* + * Barriers in virtio are tricky.  Non-SMP virtio guests can't assume + * they're not on an SMP host system, so they need to assume real + * barriers.  Non-SMP virtio hosts could skip the barriers, but does + * anyone care? + * + * For virtio_pci on SMP, we don't need to order with respect to MMIO + * accesses through relaxed memory I/O windows, so smp_mb() et al are + * sufficient. + * + * For using virtio to talk to real devices (eg. other heterogeneous + * CPUs) we do need real barriers.  In theory, we could be using both + * kinds of virtio, so it's a runtime decision, and the branch is + * actually quite cheap. + */ + +#ifdef CONFIG_SMP +static inline void virtio_mb(bool weak_barriers) +{ +	if (weak_barriers) +		smp_mb(); +	else +		mb(); +} + +static inline void virtio_rmb(bool weak_barriers) +{ +	if (weak_barriers) +		smp_rmb(); +	else +		rmb(); +} + +static inline void virtio_wmb(bool weak_barriers) +{ +	if (weak_barriers) +		smp_wmb(); +	else +		wmb(); +} +#else +static inline void virtio_mb(bool weak_barriers) +{ +	mb(); +} + +static inline void virtio_rmb(bool weak_barriers) +{ +	rmb(); +} + +static inline void virtio_wmb(bool weak_barriers) +{ +	wmb(); +} +#endif +  struct virtio_device;  struct virtqueue; diff --git a/include/linux/vm_sockets.h b/include/linux/vm_sockets.h new file mode 100644 index 00000000000..0805eecba8f --- /dev/null +++ b/include/linux/vm_sockets.h @@ -0,0 +1,23 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2007-2013 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + */ + +#ifndef _VM_SOCKETS_H +#define _VM_SOCKETS_H + +#include <uapi/linux/vm_sockets.h> + +int vm_sockets_get_local_cid(void); + +#endif /* _VM_SOCKETS_H */ diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 6071e911c7f..7d5773a99f2 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -3,7 +3,9 @@  #include <linux/spinlock.h>  #include <linux/init.h> +#include <linux/list.h>  #include <asm/page.h>		/* pgprot_t */ +#include <linux/rbtree.h>  struct vm_area_struct;		/* vma defining user mapping in mm_types.h */ @@ -35,6 +37,17 @@ struct vm_struct {  	const void		*caller;  }; +struct vmap_area { +	unsigned long va_start; +	unsigned long va_end; +	unsigned long flags; +	struct rb_node rb_node;         /* address sorted rbtree */ +	struct list_head list;          /* address sorted list */ +	struct list_head purge_list;    /* "lazy purge" list */ +	struct vm_struct *vm; +	struct rcu_head rcu_head; +}; +  /*   *	Highlevel APIs for driver use   */ @@ -130,8 +143,7 @@ extern long vwrite(char *buf, char *addr, unsigned long count);  /*   *	Internals.  Dont't use..   */ -extern rwlock_t vmlist_lock; -extern struct vm_struct *vmlist; +extern struct list_head vmap_area_list;  extern __init void vm_area_add_early(struct vm_struct *vm);  extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); @@ -158,4 +170,22 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)  # endif  #endif +struct vmalloc_info { +	unsigned long   used; +	unsigned long   largest_chunk; +}; + +#ifdef CONFIG_MMU +#define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) +extern void get_vmalloc_info(struct vmalloc_info *vmi); +#else + +#define VMALLOC_TOTAL 0UL +#define get_vmalloc_info(vmi)			\ +do {						\ +	(vmi)->used = 0;			\ +	(vmi)->largest_chunk = 0;		\ +} while (0) +#endif +  #endif /* _LINUX_VMALLOC_H */ diff --git a/include/linux/vmpressure.h b/include/linux/vmpressure.h new file mode 100644 index 00000000000..76be077340e --- /dev/null +++ b/include/linux/vmpressure.h @@ -0,0 +1,47 @@ +#ifndef __LINUX_VMPRESSURE_H +#define __LINUX_VMPRESSURE_H + +#include <linux/mutex.h> +#include <linux/list.h> +#include <linux/workqueue.h> +#include <linux/gfp.h> +#include <linux/types.h> +#include <linux/cgroup.h> + +struct vmpressure { +	unsigned long scanned; +	unsigned long reclaimed; +	/* The lock is used to keep the scanned/reclaimed above in sync. */ +	struct mutex sr_lock; + +	/* The list of vmpressure_event structs. */ +	struct list_head events; +	/* Have to grab the lock on events traversal or modifications. */ +	struct mutex events_lock; + +	struct work_struct work; +}; + +struct mem_cgroup; + +#ifdef CONFIG_MEMCG +extern void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, +		       unsigned long scanned, unsigned long reclaimed); +extern void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio); + +extern void vmpressure_init(struct vmpressure *vmpr); +extern struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg); +extern struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr); +extern struct vmpressure *css_to_vmpressure(struct cgroup_subsys_state *css); +extern int vmpressure_register_event(struct cgroup *cg, struct cftype *cft, +				     struct eventfd_ctx *eventfd, +				     const char *args); +extern void vmpressure_unregister_event(struct cgroup *cg, struct cftype *cft, +					struct eventfd_ctx *eventfd); +#else +static inline void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, +			      unsigned long scanned, unsigned long reclaimed) {} +static inline void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, +				   int prio) {} +#endif /* CONFIG_MEMCG */ +#endif /* __LINUX_VMPRESSURE_H */ diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 5fd71a7d0df..c586679b6fe 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -48,13 +48,8 @@ static inline void count_vm_events(enum vm_event_item item, long delta)  }  extern void all_vm_events(unsigned long *); -#ifdef CONFIG_HOTPLUG +  extern void vm_events_fold_cpu(int cpu); -#else -static inline void vm_events_fold_cpu(int cpu) -{ -} -#endif  #else diff --git a/include/linux/vringh.h b/include/linux/vringh.h new file mode 100644 index 00000000000..749cde28728 --- /dev/null +++ b/include/linux/vringh.h @@ -0,0 +1,225 @@ +/* + * Linux host-side vring helpers; for when the kernel needs to access + * someone else's vring. + * + * Copyright IBM Corporation, 2013. + * Parts taken from drivers/vhost/vhost.c Copyright 2009 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Written by: Rusty Russell <rusty@rustcorp.com.au> + */ +#ifndef _LINUX_VRINGH_H +#define _LINUX_VRINGH_H +#include <uapi/linux/virtio_ring.h> +#include <linux/uio.h> +#include <linux/slab.h> +#include <asm/barrier.h> + +/* virtio_ring with information needed for host access. */ +struct vringh { +	/* Guest publishes used event idx (note: we always do). */ +	bool event_indices; + +	/* Can we get away with weak barriers? */ +	bool weak_barriers; + +	/* Last available index we saw (ie. where we're up to). */ +	u16 last_avail_idx; + +	/* Last index we used. */ +	u16 last_used_idx; + +	/* How many descriptors we've completed since last need_notify(). */ +	u32 completed; + +	/* The vring (note: it may contain user pointers!) */ +	struct vring vring; + +	/* The function to call to notify the guest about added buffers */ +	void (*notify)(struct vringh *); +}; + +/** + * struct vringh_config_ops - ops for creating a host vring from a virtio driver + * @find_vrhs: find the host vrings and instantiate them + *	vdev: the virtio_device + *	nhvrs: the number of host vrings to find + *	hvrs: on success, includes new host vrings + *	callbacks: array of driver callbacks, for each host vring + *		include a NULL entry for vqs that do not need a callback + *	Returns 0 on success or error status + * @del_vrhs: free the host vrings found by find_vrhs(). + */ +struct virtio_device; +typedef void vrh_callback_t(struct virtio_device *, struct vringh *); +struct vringh_config_ops { +	int (*find_vrhs)(struct virtio_device *vdev, unsigned nhvrs, +			 struct vringh *vrhs[], vrh_callback_t *callbacks[]); +	void (*del_vrhs)(struct virtio_device *vdev); +}; + +/* The memory the vring can access, and what offset to apply. */ +struct vringh_range { +	u64 start, end_incl; +	u64 offset; +}; + +/** + * struct vringh_iov - iovec mangler. + * + * Mangles iovec in place, and restores it. + * Remaining data is iov + i, of used - i elements. + */ +struct vringh_iov { +	struct iovec *iov; +	size_t consumed; /* Within iov[i] */ +	unsigned i, used, max_num; +}; + +/** + * struct vringh_iov - kvec mangler. + * + * Mangles kvec in place, and restores it. + * Remaining data is iov + i, of used - i elements. + */ +struct vringh_kiov { +	struct kvec *iov; +	size_t consumed; /* Within iov[i] */ +	unsigned i, used, max_num; +}; + +/* Flag on max_num to indicate we're kmalloced. */ +#define VRINGH_IOV_ALLOCATED 0x8000000 + +/* Helpers for userspace vrings. */ +int vringh_init_user(struct vringh *vrh, u32 features, +		     unsigned int num, bool weak_barriers, +		     struct vring_desc __user *desc, +		     struct vring_avail __user *avail, +		     struct vring_used __user *used); + +static inline void vringh_iov_init(struct vringh_iov *iov, +				   struct iovec *iovec, unsigned num) +{ +	iov->used = iov->i = 0; +	iov->consumed = 0; +	iov->max_num = num; +	iov->iov = iovec; +} + +static inline void vringh_iov_reset(struct vringh_iov *iov) +{ +	iov->iov[iov->i].iov_len += iov->consumed; +	iov->iov[iov->i].iov_base -= iov->consumed; +	iov->consumed = 0; +	iov->i = 0; +} + +static inline void vringh_iov_cleanup(struct vringh_iov *iov) +{ +	if (iov->max_num & VRINGH_IOV_ALLOCATED) +		kfree(iov->iov); +	iov->max_num = iov->used = iov->i = iov->consumed = 0; +	iov->iov = NULL; +} + +/* Convert a descriptor into iovecs. */ +int vringh_getdesc_user(struct vringh *vrh, +			struct vringh_iov *riov, +			struct vringh_iov *wiov, +			bool (*getrange)(struct vringh *vrh, +					 u64 addr, struct vringh_range *r), +			u16 *head); + +/* Copy bytes from readable vsg, consuming it (and incrementing wiov->i). */ +ssize_t vringh_iov_pull_user(struct vringh_iov *riov, void *dst, size_t len); + +/* Copy bytes into writable vsg, consuming it (and incrementing wiov->i). */ +ssize_t vringh_iov_push_user(struct vringh_iov *wiov, +			     const void *src, size_t len); + +/* Mark a descriptor as used. */ +int vringh_complete_user(struct vringh *vrh, u16 head, u32 len); +int vringh_complete_multi_user(struct vringh *vrh, +			       const struct vring_used_elem used[], +			       unsigned num_used); + +/* Pretend we've never seen descriptor (for easy error handling). */ +void vringh_abandon_user(struct vringh *vrh, unsigned int num); + +/* Do we need to fire the eventfd to notify the other side? */ +int vringh_need_notify_user(struct vringh *vrh); + +bool vringh_notify_enable_user(struct vringh *vrh); +void vringh_notify_disable_user(struct vringh *vrh); + +/* Helpers for kernelspace vrings. */ +int vringh_init_kern(struct vringh *vrh, u32 features, +		     unsigned int num, bool weak_barriers, +		     struct vring_desc *desc, +		     struct vring_avail *avail, +		     struct vring_used *used); + +static inline void vringh_kiov_init(struct vringh_kiov *kiov, +				    struct kvec *kvec, unsigned num) +{ +	kiov->used = kiov->i = 0; +	kiov->consumed = 0; +	kiov->max_num = num; +	kiov->iov = kvec; +} + +static inline void vringh_kiov_reset(struct vringh_kiov *kiov) +{ +	kiov->iov[kiov->i].iov_len += kiov->consumed; +	kiov->iov[kiov->i].iov_base -= kiov->consumed; +	kiov->consumed = 0; +	kiov->i = 0; +} + +static inline void vringh_kiov_cleanup(struct vringh_kiov *kiov) +{ +	if (kiov->max_num & VRINGH_IOV_ALLOCATED) +		kfree(kiov->iov); +	kiov->max_num = kiov->used = kiov->i = kiov->consumed = 0; +	kiov->iov = NULL; +} + +int vringh_getdesc_kern(struct vringh *vrh, +			struct vringh_kiov *riov, +			struct vringh_kiov *wiov, +			u16 *head, +			gfp_t gfp); + +ssize_t vringh_iov_pull_kern(struct vringh_kiov *riov, void *dst, size_t len); +ssize_t vringh_iov_push_kern(struct vringh_kiov *wiov, +			     const void *src, size_t len); +void vringh_abandon_kern(struct vringh *vrh, unsigned int num); +int vringh_complete_kern(struct vringh *vrh, u16 head, u32 len); + +bool vringh_notify_enable_kern(struct vringh *vrh); +void vringh_notify_disable_kern(struct vringh *vrh); + +int vringh_need_notify_kern(struct vringh *vrh); + +/* Notify the guest about buffers added to the used ring */ +static inline void vringh_notify(struct vringh *vrh) +{ +	if (vrh->notify) +		vrh->notify(vrh); +} + +#endif /* _LINUX_VRINGH_H */ diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 8afab27cdbc..623488fdc1f 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -11,6 +11,7 @@  #include <linux/lockdep.h>  #include <linux/threads.h>  #include <linux/atomic.h> +#include <linux/cpumask.h>  struct workqueue_struct; @@ -68,7 +69,7 @@ enum {  				  WORK_STRUCT_COLOR_BITS,  	/* data contains off-queue information when !WORK_STRUCT_PWQ */ -	WORK_OFFQ_FLAG_BASE	= WORK_STRUCT_FLAG_BITS, +	WORK_OFFQ_FLAG_BASE	= WORK_STRUCT_COLOR_SHIFT,  	WORK_OFFQ_CANCELING	= (1 << WORK_OFFQ_FLAG_BASE), @@ -91,6 +92,9 @@ enum {  	/* bit mask for work_busy() return values */  	WORK_BUSY_PENDING	= 1 << 0,  	WORK_BUSY_RUNNING	= 1 << 1, + +	/* maximum string length for set_worker_desc() */ +	WORKER_DESC_LEN		= 24,  };  struct work_struct { @@ -115,6 +119,20 @@ struct delayed_work {  	int cpu;  }; +/* + * A struct for workqueue attributes.  This can be used to change + * attributes of an unbound workqueue. + * + * Unlike other fields, ->no_numa isn't a property of a worker_pool.  It + * only modifies how apply_workqueue_attrs() select pools and thus doesn't + * participate in pool hash calculations or equality comparisons. + */ +struct workqueue_attrs { +	int			nice;		/* nice level */ +	cpumask_var_t		cpumask;	/* allowed CPUs */ +	bool			no_numa;	/* disable NUMA affinity */ +}; +  static inline struct delayed_work *to_delayed_work(struct work_struct *work)  {  	return container_of(work, struct delayed_work, work); @@ -283,9 +301,10 @@ enum {  	WQ_MEM_RECLAIM		= 1 << 3, /* may be used for memory reclaim */  	WQ_HIGHPRI		= 1 << 4, /* high priority */  	WQ_CPU_INTENSIVE	= 1 << 5, /* cpu instensive workqueue */ +	WQ_SYSFS		= 1 << 6, /* visible in sysfs, see wq_sysfs_register() */ -	WQ_DRAINING		= 1 << 6, /* internal: workqueue is draining */ -	WQ_RESCUER		= 1 << 7, /* internal: workqueue has rescuer */ +	__WQ_DRAINING		= 1 << 16, /* internal: workqueue is draining */ +	__WQ_ORDERED		= 1 << 17, /* internal: workqueue is ordered */  	WQ_MAX_ACTIVE		= 512,	  /* I like 512, better ideas? */  	WQ_MAX_UNBOUND_PER_CPU	= 4,	  /* 4 * #cpus for unbound wq */ @@ -388,7 +407,7 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,   * Pointer to the allocated workqueue on success, %NULL on failure.   */  #define alloc_ordered_workqueue(fmt, flags, args...)			\ -	alloc_workqueue(fmt, WQ_UNBOUND | (flags), 1, ##args) +	alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args)  #define create_workqueue(name)						\  	alloc_workqueue((name), WQ_MEM_RECLAIM, 1) @@ -399,30 +418,23 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,  extern void destroy_workqueue(struct workqueue_struct *wq); +struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask); +void free_workqueue_attrs(struct workqueue_attrs *attrs); +int apply_workqueue_attrs(struct workqueue_struct *wq, +			  const struct workqueue_attrs *attrs); +  extern bool queue_work_on(int cpu, struct workqueue_struct *wq,  			struct work_struct *work); -extern bool queue_work(struct workqueue_struct *wq, struct work_struct *work);  extern bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,  			struct delayed_work *work, unsigned long delay); -extern bool queue_delayed_work(struct workqueue_struct *wq, -			struct delayed_work *work, unsigned long delay);  extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,  			struct delayed_work *dwork, unsigned long delay); -extern bool mod_delayed_work(struct workqueue_struct *wq, -			struct delayed_work *dwork, unsigned long delay);  extern void flush_workqueue(struct workqueue_struct *wq);  extern void drain_workqueue(struct workqueue_struct *wq);  extern void flush_scheduled_work(void); -extern bool schedule_work_on(int cpu, struct work_struct *work); -extern bool schedule_work(struct work_struct *work); -extern bool schedule_delayed_work_on(int cpu, struct delayed_work *work, -				     unsigned long delay); -extern bool schedule_delayed_work(struct delayed_work *work, -				  unsigned long delay);  extern int schedule_on_each_cpu(work_func_t func); -extern int keventd_up(void);  int execute_in_process_context(work_func_t fn, struct execute_work *); @@ -435,8 +447,122 @@ extern bool cancel_delayed_work_sync(struct delayed_work *dwork);  extern void workqueue_set_max_active(struct workqueue_struct *wq,  				     int max_active); -extern bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq); +extern bool current_is_workqueue_rescuer(void); +extern bool workqueue_congested(int cpu, struct workqueue_struct *wq);  extern unsigned int work_busy(struct work_struct *work); +extern __printf(1, 2) void set_worker_desc(const char *fmt, ...); +extern void print_worker_info(const char *log_lvl, struct task_struct *task); + +/** + * queue_work - queue work on a workqueue + * @wq: workqueue to use + * @work: work to queue + * + * Returns %false if @work was already on a queue, %true otherwise. + * + * We queue the work to the CPU on which it was submitted, but if the CPU dies + * it can be processed by another CPU. + */ +static inline bool queue_work(struct workqueue_struct *wq, +			      struct work_struct *work) +{ +	return queue_work_on(WORK_CPU_UNBOUND, wq, work); +} + +/** + * queue_delayed_work - queue work on a workqueue after delay + * @wq: workqueue to use + * @dwork: delayable work to queue + * @delay: number of jiffies to wait before queueing + * + * Equivalent to queue_delayed_work_on() but tries to use the local CPU. + */ +static inline bool queue_delayed_work(struct workqueue_struct *wq, +				      struct delayed_work *dwork, +				      unsigned long delay) +{ +	return queue_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay); +} + +/** + * mod_delayed_work - modify delay of or queue a delayed work + * @wq: workqueue to use + * @dwork: work to queue + * @delay: number of jiffies to wait before queueing + * + * mod_delayed_work_on() on local CPU. + */ +static inline bool mod_delayed_work(struct workqueue_struct *wq, +				    struct delayed_work *dwork, +				    unsigned long delay) +{ +	return mod_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay); +} + +/** + * schedule_work_on - put work task on a specific cpu + * @cpu: cpu to put the work task on + * @work: job to be done + * + * This puts a job on a specific cpu + */ +static inline bool schedule_work_on(int cpu, struct work_struct *work) +{ +	return queue_work_on(cpu, system_wq, work); +} + +/** + * schedule_work - put work task in global workqueue + * @work: job to be done + * + * Returns %false if @work was already on the kernel-global workqueue and + * %true otherwise. + * + * This puts a job in the kernel-global workqueue if it was not already + * queued and leaves it in the same position on the kernel-global + * workqueue otherwise. + */ +static inline bool schedule_work(struct work_struct *work) +{ +	return queue_work(system_wq, work); +} + +/** + * schedule_delayed_work_on - queue work in global workqueue on CPU after delay + * @cpu: cpu to use + * @dwork: job to be done + * @delay: number of jiffies to wait + * + * After waiting for a given time this puts a job in the kernel-global + * workqueue on the specified CPU. + */ +static inline bool schedule_delayed_work_on(int cpu, struct delayed_work *dwork, +					    unsigned long delay) +{ +	return queue_delayed_work_on(cpu, system_wq, dwork, delay); +} + +/** + * schedule_delayed_work - put work task in global workqueue after delay + * @dwork: job to be done + * @delay: number of jiffies to wait or 0 for immediate execution + * + * After waiting for a given time this puts a job in the kernel-global + * workqueue. + */ +static inline bool schedule_delayed_work(struct delayed_work *dwork, +					 unsigned long delay) +{ +	return queue_delayed_work(system_wq, dwork, delay); +} + +/** + * keventd_up - is workqueue initialized yet? + */ +static inline bool keventd_up(void) +{ +	return system_wq != NULL; +}  /*   * Like above, but uses del_timer() instead of del_timer_sync(). This means, @@ -466,12 +592,12 @@ static inline bool __deprecated flush_delayed_work_sync(struct delayed_work *dwo  }  #ifndef CONFIG_SMP -static inline long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) +static inline long work_on_cpu(int cpu, long (*fn)(void *), void *arg)  {  	return fn(arg);  }  #else -long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); +long work_on_cpu(int cpu, long (*fn)(void *), void *arg);  #endif /* CONFIG_SMP */  #ifdef CONFIG_FREEZER @@ -480,4 +606,11 @@ extern bool freeze_workqueues_busy(void);  extern void thaw_workqueues(void);  #endif /* CONFIG_FREEZER */ +#ifdef CONFIG_SYSFS +int workqueue_sysfs_register(struct workqueue_struct *wq); +#else	/* CONFIG_SYSFS */ +static inline int workqueue_sysfs_register(struct workqueue_struct *wq) +{ return 0; } +#endif	/* CONFIG_SYSFS */ +  #endif  |