diff options
Diffstat (limited to 'include/linux')
353 files changed, 9956 insertions, 2856 deletions
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 619b5657af7..c94e71781b7 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild @@ -185,6 +185,7 @@ header-y += if_pppol2tp.h  header-y += if_pppox.h  header-y += if_slip.h  header-y += if_strip.h +header-y += if_team.h  header-y += if_tr.h  header-y += if_tun.h  header-y += if_tunnel.h @@ -194,7 +195,9 @@ header-y += igmp.h  header-y += in.h  header-y += in6.h  header-y += in_route.h +header-y += sock_diag.h  header-y += inet_diag.h +header-y += unix_diag.h  header-y += inotify.h  header-y += input.h  header-y += ioctl.h diff --git a/include/linux/acct.h b/include/linux/acct.h index 3e4737fa6cc..d537aa0ec41 100644 --- a/include/linux/acct.h +++ b/include/linux/acct.h @@ -146,6 +146,9 @@ extern void acct_exit_ns(struct pid_namespace *);   *   */ +#undef ACCT_VERSION +#undef AHZ +  #ifdef CONFIG_BSD_PROCESS_ACCT_V3  #define ACCT_VERSION	3  #define AHZ		100 diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 6001b4da39d..3f968665899 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -302,10 +302,19 @@ extern bool osc_sb_apei_support_acked;  				OSC_PCI_EXPRESS_PME_CONTROL |		\  				OSC_PCI_EXPRESS_AER_CONTROL |		\  				OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL) + +#define OSC_PCI_NATIVE_HOTPLUG	(OSC_PCI_EXPRESS_NATIVE_HP_CONTROL |	\ +				OSC_SHPC_NATIVE_HP_CONTROL) +  extern acpi_status acpi_pci_osc_control_set(acpi_handle handle,  					     u32 *mask, u32 req);  extern void acpi_early_init(void); +extern int acpi_nvs_register(__u64 start, __u64 size); + +extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *), +				    void *data); +  #else	/* !CONFIG_ACPI */  #define acpi_disabled 1 @@ -348,15 +357,18 @@ static inline int acpi_table_parse(char *id,  {  	return -1;  } -#endif	/* !CONFIG_ACPI */ -#ifdef CONFIG_ACPI_SLEEP -int suspend_nvs_register(unsigned long start, unsigned long size); -#else -static inline int suspend_nvs_register(unsigned long a, unsigned long b) +static inline int acpi_nvs_register(__u64 start, __u64 size)  {  	return 0;  } -#endif + +static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *), +					   void *data) +{ +	return 0; +} + +#endif	/* !CONFIG_ACPI */  #endif	/*_LINUX_ACPI_H*/ diff --git a/include/linux/acpi_io.h b/include/linux/acpi_io.h index 4afd7102459..b0ffa219993 100644 --- a/include/linux/acpi_io.h +++ b/include/linux/acpi_io.h @@ -12,4 +12,7 @@ static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,  void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size); +int acpi_os_map_generic_address(struct acpi_generic_address *addr); +void acpi_os_unmap_generic_address(struct acpi_generic_address *addr); +  #endif diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h index be3d9a77d6e..73a25005d88 100644 --- a/include/linux/ahci_platform.h +++ b/include/linux/ahci_platform.h @@ -23,6 +23,8 @@ struct ata_port_info;  struct ahci_platform_data {  	int (*init)(struct device *dev, void __iomem *addr);  	void (*exit)(struct device *dev); +	int (*suspend)(struct device *dev); +	int (*resume)(struct device *dev);  	const struct ata_port_info *ata_port_info;  	unsigned int force_port_map;  	unsigned int mask_port_map; diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index fcbbe71a3cc..724c69c40bb 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -16,6 +16,7 @@  #include <linux/clk.h>  #include <linux/device.h> +#include <linux/mod_devicetable.h>  #include <linux/err.h>  #include <linux/resource.h>  #include <linux/regulator/consumer.h> @@ -35,12 +36,6 @@ struct amba_device {  	unsigned int		irq[AMBA_NR_IRQS];  }; -struct amba_id { -	unsigned int		id; -	unsigned int		mask; -	void			*data; -}; -  struct amba_driver {  	struct device_driver	drv;  	int			(*probe)(struct amba_device *, const struct amba_id *); diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index 21114810c7c..0101e9c17fa 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h @@ -30,6 +30,7 @@ struct dma_chan;   * @cd_invert: true if the gpio_cd pin value is active low   * @capabilities: the capabilities of the block as implemented in   * this platform, signify anything MMC_CAP_* from mmc/host.h + * @capabilities2: more capabilities, MMC_CAP2_* from mmc/host.h   * @dma_filter: function used to select an appropriate RX and TX   * DMA channel to be used for DMA, if and only if you're deploying the   * generic DMA engine @@ -52,6 +53,7 @@ struct mmci_platform_data {  	int	gpio_cd;  	bool	cd_invert;  	unsigned long capabilities; +	unsigned long capabilities2;  	bool (*dma_filter)(struct dma_chan *chan, void *filter_param);  	void *dma_rx_param;  	void *dma_tx_param; diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index 4ce98f54186..572f637299c 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h @@ -238,6 +238,9 @@ struct dma_chan;   * @enable_dma: if true enables DMA driven transfers.   * @dma_rx_param: parameter to locate an RX DMA channel.   * @dma_tx_param: parameter to locate a TX DMA channel. + * @autosuspend_delay: delay in ms following transfer completion before the + *     runtime power management system suspends the device. A setting of 0 + *     indicates no delay and the device will be suspended immediately.   */  struct pl022_ssp_controller {  	u16 bus_id; @@ -246,6 +249,7 @@ struct pl022_ssp_controller {  	bool (*dma_filter)(struct dma_chan *chan, void *filter_param);  	void *dma_rx_param;  	void *dma_tx_param; +	int autosuspend_delay;  };  /** diff --git a/include/linux/amba/pl061.h b/include/linux/amba/pl061.h index 2412af944f1..fb83c045348 100644 --- a/include/linux/amba/pl061.h +++ b/include/linux/amba/pl061.h @@ -7,7 +7,7 @@ struct pl061_platform_data {  	unsigned	gpio_base;  	/* number of the first IRQ. -	 * If the IRQ functionality in not desired this must be set to NO_IRQ. +	 * If the IRQ functionality in not desired this must be set to 0.  	 */  	unsigned	irq_base; diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h index 9eabffbc4e5..033f6aa670d 100644 --- a/include/linux/amba/pl08x.h +++ b/include/linux/amba/pl08x.h @@ -134,7 +134,7 @@ struct pl08x_txd {  	struct dma_async_tx_descriptor tx;  	struct list_head node;  	struct list_head dsg_list; -	enum dma_data_direction	direction; +	enum dma_transfer_direction direction;  	dma_addr_t llis_bus;  	struct pl08x_lli *llis_va;  	/* Default cctl value for LLIs */ @@ -197,7 +197,7 @@ struct pl08x_dma_chan {  	dma_addr_t dst_addr;  	u32 src_cctl;  	u32 dst_cctl; -	enum dma_data_direction	runtime_direction; +	enum dma_transfer_direction runtime_direction;  	dma_cookie_t lc;  	struct list_head pend_list;  	struct pl08x_txd *at; diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h index d12f077a6da..12e023c19ac 100644 --- a/include/linux/amba/pl330.h +++ b/include/linux/amba/pl330.h @@ -12,17 +12,9 @@  #ifndef	__AMBA_PL330_H_  #define	__AMBA_PL330_H_ +#include <linux/dmaengine.h>  #include <asm/hardware/pl330.h> -struct dma_pl330_peri { -	/* -	 * Peri_Req i/f of the DMAC that is -	 * peripheral could be reached from. -	 */ -	u8 peri_id; /* specific dma id */ -	enum pl330_reqtype rqtype; -}; -  struct dma_pl330_platdata {  	/*  	 * Number of valid peripherals connected to DMAC. @@ -33,9 +25,12 @@ struct dma_pl330_platdata {  	 */  	u8 nr_valid_peri;  	/* Array of valid peripherals */ -	struct dma_pl330_peri *peri; +	u8 *peri_id; +	/* Operational capabilities */ +	dma_cap_mask_t cap_mask;  	/* Bytes to allocate for MC buffer */  	unsigned mcbuf_sz;  }; +extern bool pl330_filter(struct dma_chan *chan, void *param);  #endif	/* __AMBA_PL330_H_ */ diff --git a/include/linux/amd-iommu.h b/include/linux/amd-iommu.h index a6863a2dec1..ef00610837d 100644 --- a/include/linux/amd-iommu.h +++ b/include/linux/amd-iommu.h @@ -20,12 +20,148 @@  #ifndef _ASM_X86_AMD_IOMMU_H  #define _ASM_X86_AMD_IOMMU_H -#include <linux/irqreturn.h> +#include <linux/types.h>  #ifdef CONFIG_AMD_IOMMU +struct task_struct; +struct pci_dev; +  extern int amd_iommu_detect(void); + +/** + * amd_iommu_enable_device_erratum() - Enable erratum workaround for device + *				       in the IOMMUv2 driver + * @pdev: The PCI device the workaround is necessary for + * @erratum: The erratum workaround to enable + * + * The function needs to be called before amd_iommu_init_device(). + * Possible values for the erratum number are for now: + * - AMD_PRI_DEV_ERRATUM_ENABLE_RESET - Reset PRI capability when PRI + *					is enabled + * - AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE - Limit number of outstanding PRI + *					 requests to one + */ +#define AMD_PRI_DEV_ERRATUM_ENABLE_RESET		0 +#define AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE		1 + +extern void amd_iommu_enable_device_erratum(struct pci_dev *pdev, u32 erratum); + +/** + * amd_iommu_init_device() - Init device for use with IOMMUv2 driver + * @pdev: The PCI device to initialize + * @pasids: Number of PASIDs to support for this device + * + * This function does all setup for the device pdev so that it can be + * used with IOMMUv2. + * Returns 0 on success or negative value on error. + */ +extern int amd_iommu_init_device(struct pci_dev *pdev, int pasids); + +/** + * amd_iommu_free_device() - Free all IOMMUv2 related device resources + *			     and disable IOMMUv2 usage for this device + * @pdev: The PCI device to disable IOMMUv2 usage for' + */ +extern void amd_iommu_free_device(struct pci_dev *pdev); + +/** + * amd_iommu_bind_pasid() - Bind a given task to a PASID on a device + * @pdev: The PCI device to bind the task to + * @pasid: The PASID on the device the task should be bound to + * @task: the task to bind + * + * The function returns 0 on success or a negative value on error. + */ +extern int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid, +				struct task_struct *task); + +/** + * amd_iommu_unbind_pasid() - Unbind a PASID from its task on + *			      a device + * @pdev: The device of the PASID + * @pasid: The PASID to unbind + * + * When this function returns the device is no longer using the PASID + * and the PASID is no longer bound to its task. + */ +extern void amd_iommu_unbind_pasid(struct pci_dev *pdev, int pasid); + +/** + * amd_iommu_set_invalid_ppr_cb() - Register a call-back for failed + *				    PRI requests + * @pdev: The PCI device the call-back should be registered for + * @cb: The call-back function + * + * The IOMMUv2 driver invokes this call-back when it is unable to + * successfully handle a PRI request. The device driver can then decide + * which PRI response the device should see. Possible return values for + * the call-back are: + * + * - AMD_IOMMU_INV_PRI_RSP_SUCCESS - Send SUCCESS back to the device + * - AMD_IOMMU_INV_PRI_RSP_INVALID - Send INVALID back to the device + * - AMD_IOMMU_INV_PRI_RSP_FAIL    - Send Failure back to the device, + *				     the device is required to disable + *				     PRI when it receives this response + * + * The function returns 0 on success or negative value on error. + */ +#define AMD_IOMMU_INV_PRI_RSP_SUCCESS	0 +#define AMD_IOMMU_INV_PRI_RSP_INVALID	1 +#define AMD_IOMMU_INV_PRI_RSP_FAIL	2 + +typedef int (*amd_iommu_invalid_ppr_cb)(struct pci_dev *pdev, +					int pasid, +					unsigned long address, +					u16); + +extern int amd_iommu_set_invalid_ppr_cb(struct pci_dev *pdev, +					amd_iommu_invalid_ppr_cb cb); + +/** + * amd_iommu_device_info() - Get information about IOMMUv2 support of a + *			     PCI device + * @pdev: PCI device to query information from + * @info: A pointer to an amd_iommu_device_info structure which will contain + *	  the information about the PCI device + * + * Returns 0 on success, negative value on error + */ + +#define AMD_IOMMU_DEVICE_FLAG_ATS_SUP     0x1    /* ATS feature supported */ +#define AMD_IOMMU_DEVICE_FLAG_PRI_SUP     0x2    /* PRI feature supported */ +#define AMD_IOMMU_DEVICE_FLAG_PASID_SUP   0x4    /* PASID context supported */ +#define AMD_IOMMU_DEVICE_FLAG_EXEC_SUP    0x8    /* Device may request execution +						    on memory pages */ +#define AMD_IOMMU_DEVICE_FLAG_PRIV_SUP   0x10    /* Device may request +						    super-user privileges */ + +struct amd_iommu_device_info { +	int max_pasids; +	u32 flags; +}; + +extern int amd_iommu_device_info(struct pci_dev *pdev, +				 struct amd_iommu_device_info *info); + +/** + * amd_iommu_set_invalidate_ctx_cb() - Register a call-back for invalidating + *				       a pasid context. This call-back is + *				       invoked when the IOMMUv2 driver needs to + *				       invalidate a PASID context, for example + *				       because the task that is bound to that + *				       context is about to exit. + * + * @pdev: The PCI device the call-back should be registered for + * @cb: The call-back function + */ + +typedef void (*amd_iommu_invalidate_ctx)(struct pci_dev *pdev, int pasid); + +extern int amd_iommu_set_invalidate_ctx_cb(struct pci_dev *pdev, +					   amd_iommu_invalidate_ctx cb); +  #else  static inline int amd_iommu_detect(void) { return -ENODEV; } diff --git a/include/linux/ata_platform.h b/include/linux/ata_platform.h index 9a26c83a2c9..b856a2a590d 100644 --- a/include/linux/ata_platform.h +++ b/include/linux/ata_platform.h @@ -27,10 +27,7 @@ extern int __devexit __pata_platform_remove(struct device *dev);  /*   * Marvell SATA private data   */ -struct mbus_dram_target_info; -  struct mv_sata_platform_data { -	struct mbus_dram_target_info	*dram;  	int	n_ports; /* number of sata ports */  }; diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index 49a83ca900b..f4ff882cb2d 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h @@ -445,16 +445,6 @@ void vcc_insert_socket(struct sock *sk);  void atm_dev_release_vccs(struct atm_dev *dev); -/* - * This is approximately the algorithm used by alloc_skb. - * - */ - -static inline int atm_guess_pdu2truesize(int size) -{ -	return SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info); -} -  static inline void atm_force_charge(struct atm_vcc *vcc,int truesize)  { diff --git a/include/linux/audit.h b/include/linux/audit.h index 2f81c6f3b63..9ff7a2c48b5 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -26,6 +26,7 @@  #include <linux/types.h>  #include <linux/elf-em.h> +#include <linux/ptrace.h>  /* The netlink messages for the audit system is divided into blocks:   * 1000 - 1099 are for commanding the audit system @@ -181,6 +182,40 @@   * AUDIT_UNUSED_BITS is updated if need be. */  #define AUDIT_UNUSED_BITS	0x07FFFC00 +/* AUDIT_FIELD_COMPARE rule list */ +#define AUDIT_COMPARE_UID_TO_OBJ_UID	1 +#define AUDIT_COMPARE_GID_TO_OBJ_GID	2 +#define AUDIT_COMPARE_EUID_TO_OBJ_UID	3 +#define AUDIT_COMPARE_EGID_TO_OBJ_GID	4 +#define AUDIT_COMPARE_AUID_TO_OBJ_UID	5 +#define AUDIT_COMPARE_SUID_TO_OBJ_UID	6 +#define AUDIT_COMPARE_SGID_TO_OBJ_GID	7 +#define AUDIT_COMPARE_FSUID_TO_OBJ_UID	8 +#define AUDIT_COMPARE_FSGID_TO_OBJ_GID	9 + +#define AUDIT_COMPARE_UID_TO_AUID	10 +#define AUDIT_COMPARE_UID_TO_EUID	11 +#define AUDIT_COMPARE_UID_TO_FSUID	12 +#define AUDIT_COMPARE_UID_TO_SUID	13 + +#define AUDIT_COMPARE_AUID_TO_FSUID	14 +#define AUDIT_COMPARE_AUID_TO_SUID	15 +#define AUDIT_COMPARE_AUID_TO_EUID	16 + +#define AUDIT_COMPARE_EUID_TO_SUID	17 +#define AUDIT_COMPARE_EUID_TO_FSUID	18 + +#define AUDIT_COMPARE_SUID_TO_FSUID	19 + +#define AUDIT_COMPARE_GID_TO_EGID	20 +#define AUDIT_COMPARE_GID_TO_FSGID	21 +#define AUDIT_COMPARE_GID_TO_SGID	22 + +#define AUDIT_COMPARE_EGID_TO_FSGID	23 +#define AUDIT_COMPARE_EGID_TO_SGID	24 +#define AUDIT_COMPARE_SGID_TO_FSGID	25 + +#define AUDIT_MAX_FIELD_COMPARE		AUDIT_COMPARE_SGID_TO_FSGID  /* Rule fields */  				/* These are useful when checking the @@ -222,6 +257,9 @@  #define AUDIT_PERM	106  #define AUDIT_DIR	107  #define AUDIT_FILETYPE	108 +#define AUDIT_OBJ_UID	109 +#define AUDIT_OBJ_GID	110 +#define AUDIT_FIELD_COMPARE	111  #define AUDIT_ARG0      200  #define AUDIT_ARG1      (AUDIT_ARG0+1) @@ -408,28 +446,24 @@ struct audit_field {  	void				*lsm_rule;  }; -#define AUDITSC_INVALID 0 -#define AUDITSC_SUCCESS 1 -#define AUDITSC_FAILURE 2 -#define AUDITSC_RESULT(x) ( ((long)(x))<0?AUDITSC_FAILURE:AUDITSC_SUCCESS )  extern int __init audit_register_class(int class, unsigned *list);  extern int audit_classify_syscall(int abi, unsigned syscall);  extern int audit_classify_arch(int arch);  #ifdef CONFIG_AUDITSYSCALL  /* These are defined in auditsc.c */  				/* Public API */ -extern void audit_finish_fork(struct task_struct *child);  extern int  audit_alloc(struct task_struct *task); -extern void audit_free(struct task_struct *task); -extern void audit_syscall_entry(int arch, -				int major, unsigned long a0, unsigned long a1, -				unsigned long a2, unsigned long a3); -extern void audit_syscall_exit(int failed, long return_code); +extern void __audit_free(struct task_struct *task); +extern void __audit_syscall_entry(int arch, +				  int major, unsigned long a0, unsigned long a1, +				  unsigned long a2, unsigned long a3); +extern void __audit_syscall_exit(int ret_success, long ret_value);  extern void __audit_getname(const char *name);  extern void audit_putname(const char *name);  extern void __audit_inode(const char *name, const struct dentry *dentry);  extern void __audit_inode_child(const struct dentry *dentry,  				const struct inode *parent); +extern void __audit_seccomp(unsigned long syscall);  extern void __audit_ptrace(struct task_struct *t);  static inline int audit_dummy_context(void) @@ -437,6 +471,27 @@ static inline int audit_dummy_context(void)  	void *p = current->audit_context;  	return !p || *(int *)p;  } +static inline void audit_free(struct task_struct *task) +{ +	if (unlikely(task->audit_context)) +		__audit_free(task); +} +static inline void audit_syscall_entry(int arch, int major, unsigned long a0, +				       unsigned long a1, unsigned long a2, +				       unsigned long a3) +{ +	if (unlikely(!audit_dummy_context())) +		__audit_syscall_entry(arch, major, a0, a1, a2, a3); +} +static inline void audit_syscall_exit(void *pt_regs) +{ +	if (unlikely(current->audit_context)) { +		int success = is_syscall_success(pt_regs); +		int return_code = regs_return_value(pt_regs); + +		__audit_syscall_exit(success, return_code); +	} +}  static inline void audit_getname(const char *name)  {  	if (unlikely(!audit_dummy_context())) @@ -453,6 +508,12 @@ static inline void audit_inode_child(const struct dentry *dentry,  }  void audit_core_dumps(long signr); +static inline void audit_seccomp(unsigned long syscall) +{ +	if (unlikely(!audit_dummy_context())) +		__audit_seccomp(syscall); +} +  static inline void audit_ptrace(struct task_struct *t)  {  	if (unlikely(!audit_dummy_context())) @@ -463,18 +524,17 @@ static inline void audit_ptrace(struct task_struct *t)  extern unsigned int audit_serial(void);  extern int auditsc_get_stamp(struct audit_context *ctx,  			      struct timespec *t, unsigned int *serial); -extern int  audit_set_loginuid(struct task_struct *task, uid_t loginuid); +extern int  audit_set_loginuid(uid_t loginuid);  #define audit_get_loginuid(t) ((t)->loginuid)  #define audit_get_sessionid(t) ((t)->sessionid)  extern void audit_log_task_context(struct audit_buffer *ab);  extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp); -extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); -extern int audit_bprm(struct linux_binprm *bprm); -extern void audit_socketcall(int nargs, unsigned long *args); -extern int audit_sockaddr(int len, void *addr); +extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode); +extern int __audit_bprm(struct linux_binprm *bprm); +extern void __audit_socketcall(int nargs, unsigned long *args); +extern int __audit_sockaddr(int len, void *addr);  extern void __audit_fd_pair(int fd1, int fd2); -extern int audit_set_macxattr(const char *name); -extern void __audit_mq_open(int oflag, mode_t mode, struct mq_attr *attr); +extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr);  extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);  extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification);  extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); @@ -494,12 +554,29 @@ static inline void audit_fd_pair(int fd1, int fd2)  	if (unlikely(!audit_dummy_context()))  		__audit_fd_pair(fd1, fd2);  } -static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) +static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)  {  	if (unlikely(!audit_dummy_context()))  		__audit_ipc_set_perm(qbytes, uid, gid, mode);  } -static inline void audit_mq_open(int oflag, mode_t mode, struct mq_attr *attr) +static inline int audit_bprm(struct linux_binprm *bprm) +{ +	if (unlikely(!audit_dummy_context())) +		return __audit_bprm(bprm); +	return 0; +} +static inline void audit_socketcall(int nargs, unsigned long *args) +{ +	if (unlikely(!audit_dummy_context())) +		__audit_socketcall(nargs, args); +} +static inline int audit_sockaddr(int len, void *addr) +{ +	if (unlikely(!audit_dummy_context())) +		return __audit_sockaddr(len, addr); +	return 0; +} +static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)  {  	if (unlikely(!audit_dummy_context()))  		__audit_mq_open(oflag, mode, attr); @@ -544,12 +621,11 @@ static inline void audit_mmap_fd(int fd, int flags)  extern int audit_n_rules;  extern int audit_signals; -#else -#define audit_finish_fork(t) +#else /* CONFIG_AUDITSYSCALL */  #define audit_alloc(t) ({ 0; })  #define audit_free(t) do { ; } while (0)  #define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0) -#define audit_syscall_exit(f,r) do { ; } while (0) +#define audit_syscall_exit(r) do { ; } while (0)  #define audit_dummy_context() 1  #define audit_getname(n) do { ; } while (0)  #define audit_putname(n) do { ; } while (0) @@ -558,6 +634,7 @@ extern int audit_signals;  #define audit_inode(n,d) do { (void)(d); } while (0)  #define audit_inode_child(i,p) do { ; } while (0)  #define audit_core_dumps(i) do { ; } while (0) +#define audit_seccomp(i) do { ; } while (0)  #define auditsc_get_stamp(c,t,s) (0)  #define audit_get_loginuid(t) (-1)  #define audit_get_sessionid(t) (-1) @@ -568,7 +645,6 @@ extern int audit_signals;  #define audit_socketcall(n,a) ((void)0)  #define audit_fd_pair(n,a) ((void)0)  #define audit_sockaddr(len, addr) ({ 0; }) -#define audit_set_macxattr(n) do { ; } while (0)  #define audit_mq_open(o,m,a) ((void)0)  #define audit_mq_sendrecv(d,l,p,t) ((void)0)  #define audit_mq_notify(d,n) ((void)0) @@ -579,7 +655,7 @@ extern int audit_signals;  #define audit_ptrace(t) ((void)0)  #define audit_n_rules 0  #define audit_signals 0 -#endif +#endif /* CONFIG_AUDITSYSCALL */  #ifdef CONFIG_AUDIT  /* These are defined in audit.c */ diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index 4d4b59de946..83c209f3949 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -162,7 +162,7 @@ struct bcma_driver {  	int (*probe)(struct bcma_device *dev);  	void (*remove)(struct bcma_device *dev); -	int (*suspend)(struct bcma_device *dev, pm_message_t state); +	int (*suspend)(struct bcma_device *dev);  	int (*resume)(struct bcma_device *dev);  	void (*shutdown)(struct bcma_device *dev); @@ -205,61 +205,82 @@ struct bcma_bus {  	struct ssb_sprom sprom;  }; -extern inline u32 bcma_read8(struct bcma_device *core, u16 offset) +static inline u32 bcma_read8(struct bcma_device *core, u16 offset)  {  	return core->bus->ops->read8(core, offset);  } -extern inline u32 bcma_read16(struct bcma_device *core, u16 offset) +static inline u32 bcma_read16(struct bcma_device *core, u16 offset)  {  	return core->bus->ops->read16(core, offset);  } -extern inline u32 bcma_read32(struct bcma_device *core, u16 offset) +static inline u32 bcma_read32(struct bcma_device *core, u16 offset)  {  	return core->bus->ops->read32(core, offset);  } -extern inline +static inline  void bcma_write8(struct bcma_device *core, u16 offset, u32 value)  {  	core->bus->ops->write8(core, offset, value);  } -extern inline +static inline  void bcma_write16(struct bcma_device *core, u16 offset, u32 value)  {  	core->bus->ops->write16(core, offset, value);  } -extern inline +static inline  void bcma_write32(struct bcma_device *core, u16 offset, u32 value)  {  	core->bus->ops->write32(core, offset, value);  }  #ifdef CONFIG_BCMA_BLOCKIO -extern inline void bcma_block_read(struct bcma_device *core, void *buffer, +static inline void bcma_block_read(struct bcma_device *core, void *buffer,  				   size_t count, u16 offset, u8 reg_width)  {  	core->bus->ops->block_read(core, buffer, count, offset, reg_width);  } -extern inline void bcma_block_write(struct bcma_device *core, const void *buffer, -				    size_t count, u16 offset, u8 reg_width) +static inline void bcma_block_write(struct bcma_device *core, +				    const void *buffer, size_t count, +				    u16 offset, u8 reg_width)  {  	core->bus->ops->block_write(core, buffer, count, offset, reg_width);  }  #endif -extern inline u32 bcma_aread32(struct bcma_device *core, u16 offset) +static inline u32 bcma_aread32(struct bcma_device *core, u16 offset)  {  	return core->bus->ops->aread32(core, offset);  } -extern inline +static inline  void bcma_awrite32(struct bcma_device *core, u16 offset, u32 value)  {  	core->bus->ops->awrite32(core, offset, value);  } -#define bcma_mask32(cc, offset, mask) \ -	bcma_write32(cc, offset, bcma_read32(cc, offset) & (mask)) -#define bcma_set32(cc, offset, set) \ -	bcma_write32(cc, offset, bcma_read32(cc, offset) | (set)) -#define bcma_maskset32(cc, offset, mask, set) \ -	bcma_write32(cc, offset, (bcma_read32(cc, offset) & (mask)) | (set)) +static inline void bcma_mask32(struct bcma_device *cc, u16 offset, u32 mask) +{ +	bcma_write32(cc, offset, bcma_read32(cc, offset) & mask); +} +static inline void bcma_set32(struct bcma_device *cc, u16 offset, u32 set) +{ +	bcma_write32(cc, offset, bcma_read32(cc, offset) | set); +} +static inline void bcma_maskset32(struct bcma_device *cc, +				  u16 offset, u32 mask, u32 set) +{ +	bcma_write32(cc, offset, (bcma_read32(cc, offset) & mask) | set); +} +static inline void bcma_mask16(struct bcma_device *cc, u16 offset, u16 mask) +{ +	bcma_write16(cc, offset, bcma_read16(cc, offset) & mask); +} +static inline void bcma_set16(struct bcma_device *cc, u16 offset, u16 set) +{ +	bcma_write16(cc, offset, bcma_read16(cc, offset) | set); +} +static inline void bcma_maskset16(struct bcma_device *cc, +				  u16 offset, u16 mask, u16 set) +{ +	bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set); +}  extern bool bcma_core_is_enabled(struct bcma_device *core);  extern void bcma_core_disable(struct bcma_device *core, u32 flags); diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 1526d965ed0..a33086a7530 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h @@ -203,6 +203,7 @@  #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_PLL_UPD	0x00000400  #define  BCMA_CC_PMU_CTL_NOILPONW	0x00000200 /* No ILP on wait */  #define  BCMA_CC_PMU_CTL_HTREQEN	0x00000100 /* HT req enable */  #define  BCMA_CC_PMU_CTL_ALPREQEN	0x00000080 /* ALP req enable */ diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index fd88a3945aa..0092102db2d 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -18,7 +18,7 @@ struct pt_regs;  #define BINPRM_BUF_SIZE 128  #ifdef __KERNEL__ -#include <linux/list.h> +#include <linux/sched.h>  #define CORENAME_MAX_SIZE 128 @@ -58,6 +58,7 @@ struct linux_binprm {  	unsigned interp_flags;  	unsigned interp_data;  	unsigned long loader, exec; +	char tcomm[TASK_COMM_LEN];  };  #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0 diff --git a/include/linux/bio.h b/include/linux/bio.h index a3c071c9e18..129a9c09795 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -211,8 +211,8 @@ extern void bio_pair_release(struct bio_pair *dbio);  extern struct bio_set *bioset_create(unsigned int, unsigned int);  extern void bioset_free(struct bio_set *); -extern struct bio *bio_alloc(gfp_t, int); -extern struct bio *bio_kmalloc(gfp_t, int); +extern struct bio *bio_alloc(gfp_t, unsigned int); +extern struct bio *bio_kmalloc(gfp_t, unsigned int);  extern struct bio *bio_alloc_bioset(gfp_t, int, struct bio_set *);  extern void bio_put(struct bio *);  extern void bio_free(struct bio *, struct bio_set *); @@ -515,20 +515,64 @@ extern void bio_integrity_init(void);  #else /* CONFIG_BLK_DEV_INTEGRITY */ -#define bio_integrity(a)		(0) -#define bioset_integrity_create(a, b)	(0) -#define bio_integrity_prep(a)		(0) -#define bio_integrity_enabled(a)	(0) -#define bio_integrity_clone(a, b, c, d)	(0) -#define bioset_integrity_free(a)	do { } while (0) -#define bio_integrity_free(a, b)	do { } while (0) -#define bio_integrity_endio(a, b)	do { } while (0) -#define bio_integrity_advance(a, b)	do { } while (0) -#define bio_integrity_trim(a, b, c)	do { } while (0) -#define bio_integrity_split(a, b, c)	do { } while (0) -#define bio_integrity_set_tag(a, b, c)	do { } while (0) -#define bio_integrity_get_tag(a, b, c)	do { } while (0) -#define bio_integrity_init(a)		do { } while (0) +static inline int bio_integrity(struct bio *bio) +{ +	return 0; +} + +static inline int bio_integrity_enabled(struct bio *bio) +{ +	return 0; +} + +static inline int bioset_integrity_create(struct bio_set *bs, int pool_size) +{ +	return 0; +} + +static inline void bioset_integrity_free (struct bio_set *bs) +{ +	return; +} + +static inline int bio_integrity_prep(struct bio *bio) +{ +	return 0; +} + +static inline void bio_integrity_free(struct bio *bio, struct bio_set *bs) +{ +	return; +} + +static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src, +				      gfp_t gfp_mask, struct bio_set *bs) +{ +	return 0; +} + +static inline void bio_integrity_split(struct bio *bio, struct bio_pair *bp, +				       int sectors) +{ +	return; +} + +static inline void bio_integrity_advance(struct bio *bio, +					 unsigned int bytes_done) +{ +	return; +} + +static inline void bio_integrity_trim(struct bio *bio, unsigned int offset, +				      unsigned int sectors) +{ +	return; +} + +static inline void bio_integrity_init(void) +{ +	return; +}  #endif /* CONFIG_BLK_DEV_INTEGRITY */ diff --git a/include/linux/bitops.h b/include/linux/bitops.h index fc8a3ffce32..94300fe46cc 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -22,8 +22,14 @@ extern unsigned long __sw_hweight64(__u64 w);  #include <asm/bitops.h>  #define for_each_set_bit(bit, addr, size) \ -	for ((bit) = find_first_bit((addr), (size)); \ -	     (bit) < (size); \ +	for ((bit) = find_first_bit((addr), (size));		\ +	     (bit) < (size);					\ +	     (bit) = find_next_bit((addr), (size), (bit) + 1)) + +/* same as for_each_set_bit() but use bit as value to start with */ +#define for_each_set_bit_cont(bit, addr, size) \ +	for ((bit) = find_next_bit((addr), (size), (bit));	\ +	     (bit) < (size);					\  	     (bit) = find_next_bit((addr), (size), (bit) + 1))  static __inline__ int get_bitmask_order(unsigned int count) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index c7a6d3b5bc7..606cf339bb5 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -111,10 +111,14 @@ struct request {  	 * Three pointers are available for the IO schedulers, if they need  	 * more they have to dynamically allocate it.  Flush requests are  	 * never put on the IO scheduler. So let the flush fields share -	 * space with the three elevator_private pointers. +	 * space with the elevator data.  	 */  	union { -		void *elevator_private[3]; +		struct { +			struct io_cq		*icq; +			void			*priv[2]; +		} elv; +  		struct {  			unsigned int		seq;  			struct list_head	list; @@ -311,6 +315,12 @@ struct request_queue {  	unsigned long		queue_flags;  	/* +	 * ida allocated id for this queue.  Used to index queues from +	 * ioctx. +	 */ +	int			id; + +	/*  	 * queue needs bounce pages for pages above this limit  	 */  	gfp_t			bounce_gfp; @@ -351,6 +361,8 @@ struct request_queue {  	struct timer_list	timeout;  	struct list_head	timeout_list; +	struct list_head	icq_list; +  	struct queue_limits	limits;  	/* @@ -481,6 +493,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)  #define blk_queue_tagged(q)	test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)  #define blk_queue_stopped(q)	test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags) +#define blk_queue_dead(q)	test_bit(QUEUE_FLAG_DEAD, &(q)->queue_flags)  #define blk_queue_nomerges(q)	test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags)  #define blk_queue_noxmerges(q)	\  	test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags) @@ -660,7 +673,6 @@ extern void __blk_put_request(struct request_queue *, struct request *);  extern struct request *blk_get_request(struct request_queue *, int, gfp_t);  extern struct request *blk_make_request(struct request_queue *, struct bio *,  					gfp_t); -extern void blk_insert_request(struct request_queue *, struct request *, int, void *);  extern void blk_requeue_request(struct request_queue *, struct request *);  extern void blk_add_request_payload(struct request *rq, struct page *page,  		unsigned int len); @@ -675,6 +687,9 @@ extern int blk_insert_cloned_request(struct request_queue *q,  				     struct request *rq);  extern void blk_delay_queue(struct request_queue *, unsigned long);  extern void blk_recount_segments(struct request_queue *, struct bio *); +extern int scsi_verify_blk_ioctl(struct block_device *, unsigned int); +extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t, +			      unsigned int, void __user *);  extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,  			  unsigned int, void __user *);  extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, @@ -805,9 +820,6 @@ extern void blk_unprep_request(struct request *);   */  extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn,  					spinlock_t *lock, int node_id); -extern struct request_queue *blk_init_allocated_queue_node(struct request_queue *, -							   request_fn_proc *, -							   spinlock_t *, int node_id);  extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *);  extern struct request_queue *blk_init_allocated_queue(struct request_queue *,  						      request_fn_proc *, spinlock_t *); @@ -829,6 +841,7 @@ extern void blk_queue_io_min(struct request_queue *q, unsigned int min);  extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt);  extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);  extern void blk_set_default_limits(struct queue_limits *lim); +extern void blk_set_stacking_limits(struct queue_limits *lim);  extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,  			    sector_t offset);  extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev, @@ -859,7 +872,7 @@ extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatte  extern void blk_dump_rq_flags(struct request *, char *);  extern long nr_blockdev_pages(void); -int blk_get_queue(struct request_queue *); +bool __must_check blk_get_queue(struct request_queue *);  struct request_queue *blk_alloc_queue(gfp_t);  struct request_queue *blk_alloc_queue_node(gfp_t, int);  extern void blk_put_queue(struct request_queue *); @@ -1282,19 +1295,70 @@ queue_max_integrity_segments(struct request_queue *q)  #else /* CONFIG_BLK_DEV_INTEGRITY */ -#define blk_integrity_rq(rq)			(0) -#define blk_rq_count_integrity_sg(a, b)		(0) -#define blk_rq_map_integrity_sg(a, b, c)	(0) -#define bdev_get_integrity(a)			(0) -#define blk_get_integrity(a)			(0) -#define blk_integrity_compare(a, b)		(0) -#define blk_integrity_register(a, b)		(0) -#define blk_integrity_unregister(a)		do { } while (0) -#define blk_queue_max_integrity_segments(a, b)	do { } while (0) -#define queue_max_integrity_segments(a)		(0) -#define blk_integrity_merge_rq(a, b, c)		(0) -#define blk_integrity_merge_bio(a, b, c)	(0) -#define blk_integrity_is_initialized(a)		(0) +struct bio; +struct block_device; +struct gendisk; +struct blk_integrity; + +static inline int blk_integrity_rq(struct request *rq) +{ +	return 0; +} +static inline int blk_rq_count_integrity_sg(struct request_queue *q, +					    struct bio *b) +{ +	return 0; +} +static inline int blk_rq_map_integrity_sg(struct request_queue *q, +					  struct bio *b, +					  struct scatterlist *s) +{ +	return 0; +} +static inline struct blk_integrity *bdev_get_integrity(struct block_device *b) +{ +	return 0; +} +static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk) +{ +	return NULL; +} +static inline int blk_integrity_compare(struct gendisk *a, struct gendisk *b) +{ +	return 0; +} +static inline int blk_integrity_register(struct gendisk *d, +					 struct blk_integrity *b) +{ +	return 0; +} +static inline void blk_integrity_unregister(struct gendisk *d) +{ +} +static inline void blk_queue_max_integrity_segments(struct request_queue *q, +						    unsigned int segs) +{ +} +static inline unsigned short queue_max_integrity_segments(struct request_queue *q) +{ +	return 0; +} +static inline int blk_integrity_merge_rq(struct request_queue *rq, +					 struct request *r1, +					 struct request *r2) +{ +	return 0; +} +static inline int blk_integrity_merge_bio(struct request_queue *rq, +					  struct request *r, +					  struct bio *b) +{ +	return 0; +} +static inline bool blk_integrity_is_initialized(struct gendisk *g) +{ +	return 0; +}  #endif /* CONFIG_BLK_DEV_INTEGRITY */ diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index ab344a52110..66d3e954eb6 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h @@ -44,7 +44,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat,  				       unsigned long endpfn);  extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); -unsigned long free_all_memory_core_early(int nodeid); +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/can/platform/cc770.h b/include/linux/can/platform/cc770.h new file mode 100644 index 00000000000..7702641f87e --- /dev/null +++ b/include/linux/can/platform/cc770.h @@ -0,0 +1,33 @@ +#ifndef _CAN_PLATFORM_CC770_H_ +#define _CAN_PLATFORM_CC770_H_ + +/* CPU Interface Register (0x02) */ +#define CPUIF_CEN	0x01	/* Clock Out Enable */ +#define CPUIF_MUX	0x04	/* Multiplex */ +#define CPUIF_SLP	0x08	/* Sleep */ +#define CPUIF_PWD	0x10	/* Power Down Mode */ +#define CPUIF_DMC	0x20	/* Divide Memory Clock */ +#define CPUIF_DSC	0x40	/* Divide System Clock */ +#define CPUIF_RST	0x80	/* Hardware Reset Status */ + +/* Clock Out Register (0x1f) */ +#define CLKOUT_CD_MASK  0x0f	/* Clock Divider mask */ +#define CLKOUT_SL_MASK	0x30	/* Slew Rate mask */ +#define CLKOUT_SL_SHIFT	4 + +/* Bus Configuration Register (0x2f) */ +#define BUSCFG_DR0	0x01	/* Disconnect RX0 Input / Select RX input */ +#define BUSCFG_DR1	0x02	/* Disconnect RX1 Input / Silent mode */ +#define BUSCFG_DT1	0x08	/* Disconnect TX1 Output */ +#define BUSCFG_POL	0x20	/* Polarity dominant or recessive */ +#define BUSCFG_CBY	0x40	/* Input Comparator Bypass */ + +struct cc770_platform_data { +	u32 osc_freq;	/* CAN bus oscillator frequency in Hz */ + +	u8 cir;		/* CPU Interface Register */ +	u8 cor;		/* Clock Out Register */ +	u8 bcr;		/* Bus Configuration Register */ +}; + +#endif	/* !_CAN_PLATFORM_CC770_H_ */ diff --git a/include/linux/capability.h b/include/linux/capability.h index a63d13d84ad..12d52dedb22 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -380,7 +380,6 @@ struct user_namespace;  struct user_namespace *current_user_ns(void);  extern const kernel_cap_t __cap_empty_set; -extern const kernel_cap_t __cap_full_set;  extern const kernel_cap_t __cap_init_eff_set;  /* @@ -544,9 +543,10 @@ extern bool has_capability(struct task_struct *t, int cap);  extern bool has_ns_capability(struct task_struct *t,  			      struct user_namespace *ns, int cap);  extern bool has_capability_noaudit(struct task_struct *t, int cap); +extern bool has_ns_capability_noaudit(struct task_struct *t, +				      struct user_namespace *ns, int cap);  extern bool capable(int cap);  extern bool ns_capable(struct user_namespace *ns, int cap); -extern bool task_ns_capable(struct task_struct *t, int cap);  extern bool nsown_capable(int cap);  /* audit system wants to get cap info from files as well */ diff --git a/include/linux/cdrom.h b/include/linux/cdrom.h index 35eae4b6750..7c48029dffe 100644 --- a/include/linux/cdrom.h +++ b/include/linux/cdrom.h @@ -952,7 +952,8 @@ struct cdrom_device_info {      	char name[20];                  /* name of the device type */  /* per-device flags */          __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */ -        __u8 reserved		: 6;	/* not used yet */ +        __u8 keeplocked		: 1;	/* CDROM_LOCKDOOR status */ +        __u8 reserved		: 5;	/* not used yet */  	int cdda_method;		/* see flags */  	__u8 last_sense;  	__u8 media_written;		/* dirty flag, DVD+RW bookkeeping */ diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index f88eacb111d..7c05ac202d9 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h @@ -10,6 +10,12 @@  #include "osdmap.h"  #include "messenger.h" +/*  + * Maximum object name size  + * (must be at least as big as RBD_MAX_MD_NAME_LEN -- currently 100)  + */ +#define MAX_OBJ_NAME_SIZE 100 +  struct ceph_msg;  struct ceph_snap_context;  struct ceph_osd_request; @@ -75,7 +81,7 @@ struct ceph_osd_request {  	struct inode *r_inode;         	      /* for use by callbacks */  	void *r_priv;			      /* ditto */ -	char              r_oid[40];          /* object name */ +	char              r_oid[MAX_OBJ_NAME_SIZE];          /* object name */  	int               r_oid_len;  	unsigned long     r_stamp;            /* send OR check time */ diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 1b7f9d52501..e9b602151ca 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -319,7 +319,7 @@ struct cftype {  	 * If not 0, file mode is set to this value, otherwise it will  	 * be figured out automatically  	 */ -	mode_t mode; +	umode_t mode;  	/*  	 * If non-zero, defines the maximum length of string that can @@ -457,6 +457,28 @@ void cgroup_exclude_rmdir(struct cgroup_subsys_state *css);  void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css);  /* + * Control Group taskset, used to pass around set of tasks to cgroup_subsys + * methods. + */ +struct cgroup_taskset; +struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset); +struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset); +struct cgroup *cgroup_taskset_cur_cgroup(struct cgroup_taskset *tset); +int cgroup_taskset_size(struct cgroup_taskset *tset); + +/** + * cgroup_taskset_for_each - iterate cgroup_taskset + * @task: the loop cursor + * @skip_cgrp: skip if task's cgroup matches this, %NULL to iterate through all + * @tset: taskset to iterate + */ +#define cgroup_taskset_for_each(task, skip_cgrp, tset)			\ +	for ((task) = cgroup_taskset_first((tset)); (task);		\ +	     (task) = cgroup_taskset_next((tset)))			\ +		if (!(skip_cgrp) ||					\ +		    cgroup_taskset_cur_cgroup((tset)) != (skip_cgrp)) + +/*   * Control Group subsystem type.   * See Documentation/cgroups/cgroups.txt for details   */ @@ -467,14 +489,11 @@ struct cgroup_subsys {  	int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);  	void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);  	int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, -			  struct task_struct *tsk); -	int (*can_attach_task)(struct cgroup *cgrp, struct task_struct *tsk); +			  struct cgroup_taskset *tset);  	void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, -			      struct task_struct *tsk); -	void (*pre_attach)(struct cgroup *cgrp); -	void (*attach_task)(struct cgroup *cgrp, struct task_struct *tsk); +			      struct cgroup_taskset *tset);  	void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, -		       struct cgroup *old_cgrp, struct task_struct *tsk); +		       struct cgroup_taskset *tset);  	void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);  	void (*exit)(struct cgroup_subsys *ss, struct cgroup *cgrp,  			struct cgroup *old_cgrp, struct task_struct *task); diff --git a/include/linux/cgroup_subsys.h b/include/linux/cgroup_subsys.h index ac663c18776..0bd390ce98b 100644 --- a/include/linux/cgroup_subsys.h +++ b/include/linux/cgroup_subsys.h @@ -59,8 +59,16 @@ SUBSYS(net_cls)  SUBSYS(blkio)  #endif +/* */ +  #ifdef CONFIG_CGROUP_PERF  SUBSYS(perf)  #endif  /* */ + +#ifdef CONFIG_NETPRIO_CGROUP +SUBSYS(net_prio) +#endif + +/* */ diff --git a/include/linux/clk.h b/include/linux/clk.h index 7213b52b2c0..b9d46fa154b 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -107,6 +107,28 @@ static inline void clk_unprepare(struct clk *clk)  }  #endif +/* clk_prepare_enable helps cases using clk_enable in non-atomic context. */ +static inline int clk_prepare_enable(struct clk *clk) +{ +	int ret; + +	ret = clk_prepare(clk); +	if (ret) +		return ret; +	ret = clk_enable(clk); +	if (ret) +		clk_unprepare(clk); + +	return ret; +} + +/* clk_disable_unprepare helps cases using clk_disable in non-atomic context. */ +static inline void clk_disable_unprepare(struct clk *clk) +{ +	clk_disable(clk); +	clk_unprepare(clk); +} +  /**   * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.   *		  This is only valid once the clock source has been enabled. diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 139c4db55f1..081147da056 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -71,7 +71,7 @@ struct timecounter {  /**   * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds - * @tc:		Pointer to cycle counter. + * @cc:		Pointer to cycle counter.   * @cycles:	Cycles   *   * XXX - This could use some mult_lxl_ll() asm optimization. Same code @@ -114,7 +114,7 @@ extern u64 timecounter_read(struct timecounter *tc);   *                        time base as values returned by   *                        timecounter_read()   * @tc:		Pointer to time counter. - * @cycle:	a value returned by tc->cc->read() + * @cycle_tstamp:	a value returned by tc->cc->read()   *   * Cycle counts that are converted correctly as long as they   * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], @@ -156,10 +156,12 @@ extern u64 timecounter_cyc2time(struct timecounter *tc,   * @mult:		cycle to nanosecond multiplier   * @shift:		cycle to nanosecond divisor (power of two)   * @max_idle_ns:	max idle time permitted by the clocksource (nsecs) + * @maxadj:		maximum adjustment value to mult (~11%)   * @flags:		flags describing special properties   * @archdata:		arch-specific data   * @suspend:		suspend function for the clocksource, if necessary   * @resume:		resume function for the clocksource, if necessary + * @cycle_last:		most recent cycle counter value seen by ::read()   */  struct clocksource {  	/* @@ -172,7 +174,7 @@ struct clocksource {  	u32 mult;  	u32 shift;  	u64 max_idle_ns; - +	u32 maxadj;  #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA  	struct arch_clocksource_data archdata;  #endif @@ -186,6 +188,7 @@ struct clocksource {  	void (*suspend)(struct clocksource *cs);  	void (*resume)(struct clocksource *cs); +	/* private: */  #ifdef CONFIG_CLOCKSOURCE_WATCHDOG  	/* Watchdog related data, used by the framework */  	struct list_head wd_list; @@ -260,6 +263,9 @@ static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)  /**   * clocksource_cyc2ns - converts clocksource cycles to nanoseconds + * @cycles:	cycles + * @mult:	cycle to nanosecond multiplier + * @shift:	cycle to nanosecond divisor (power of two)   *   * Converts cycles to nanoseconds, using the given mult and shift.   * diff --git a/include/linux/compat.h b/include/linux/compat.h index 154bf568301..41c9f6515f4 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -422,9 +422,9 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,  asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,  				    unsigned int nr_segs, unsigned int flags);  asmlinkage long compat_sys_open(const char __user *filename, int flags, -				int mode); +				umode_t mode);  asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, -				  int flags, int mode); +				  int flags, umode_t mode);  asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,  					     struct file_handle __user *handle,  					     int flags); @@ -552,5 +552,14 @@ extern ssize_t compat_rw_copy_check_uvector(int type,  extern void __user *compat_alloc_user_space(unsigned long len); +asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid, +		const struct compat_iovec __user *lvec, +		unsigned long liovcnt, const struct compat_iovec __user *rvec, +		unsigned long riovcnt, unsigned long flags); +asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, +		const struct compat_iovec __user *lvec, +		unsigned long liovcnt, const struct compat_iovec __user *rvec, +		unsigned long riovcnt, unsigned long flags); +  #endif /* CONFIG_COMPAT */  #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 59e4028e833..3fd17c24922 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -50,6 +50,11 @@  # define inline		inline		__attribute__((always_inline))  # define __inline__	__inline__	__attribute__((always_inline))  # define __inline	__inline	__attribute__((always_inline)) +#else +/* A lot of inline functions can cause havoc with function tracing */ +# define inline		inline		notrace +# define __inline__	__inline__	notrace +# define __inline	__inline	notrace  #endif  #define __deprecated			__attribute__((deprecated)) diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index dfadc96e9d6..2f4079175af 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h @@ -29,6 +29,7 @@     the kernel context */  #define __cold			__attribute__((__cold__)) +#define __linktime_error(message) __attribute__((__error__(message)))  #if __GNUC_MINOR__ >= 5  /* diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 320d6c94ff8..4a243546d14 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -293,7 +293,9 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);  #ifndef __compiletime_error  # define __compiletime_error(message)  #endif - +#ifndef __linktime_error +# define __linktime_error(message) +#endif  /*   * Prevent the compiler from merging or refetching accesses.  The compiler   * is also forbidden from reordering successive instances of ACCESS_ONCE(), diff --git a/include/linux/configfs.h b/include/linux/configfs.h index 3081c58d696..34025df6182 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h @@ -124,7 +124,7 @@ extern struct config_item *config_group_find_item(struct config_group *,  struct configfs_attribute {  	const char		*ca_name;  	struct module 		*ca_owner; -	mode_t			ca_mode; +	umode_t			ca_mode;  };  /* diff --git a/include/linux/console.h b/include/linux/console.h index 7453cfd593c..7201ce4280c 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -152,7 +152,7 @@ extern int braille_register_console(struct console *, int index,  		char *console_options, char *braille_options);  extern int braille_unregister_console(struct console *);  extern void console_sysfs_notify(void); -extern int console_suspend_enabled; +extern bool console_suspend_enabled;  /* Suspend and resume console messages over PM events */  extern void suspend_console(void); diff --git a/include/linux/cordic.h b/include/linux/cordic.h index f932093e20c..cf68ca4a508 100644 --- a/include/linux/cordic.h +++ b/include/linux/cordic.h @@ -35,8 +35,8 @@ struct cordic_iq {   * @theta: angle in degrees for which i/q coordinate is to be calculated.   * @coord: function output parameter holding the i/q coordinate.   * - * The function calculates the i/q coordinate for a given angle using - * cordic algorithm. The coordinate consists of a real (i) and an + * The function calculates the i/q coordinate for a given angle using the + * CORDIC algorithm. The coordinate consists of a real (i) and an   * imaginary (q) part. The real part is essentially the cosine of the   * angle and the imaginary part is the sine of the angle. The returned   * values are scaled by 2^16 for precision. The range for theta is diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 6cb60fd2ea8..1f6587590a1 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -14,7 +14,7 @@  #ifndef _LINUX_CPU_H_  #define _LINUX_CPU_H_ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/node.h>  #include <linux/compiler.h>  #include <linux/cpumask.h> @@ -22,19 +22,20 @@  struct cpu {  	int node_id;		/* The node which contains the CPU */  	int hotpluggable;	/* creates sysfs control file if hotpluggable */ -	struct sys_device sysdev; +	struct device dev;  };  extern int register_cpu(struct cpu *cpu, int num); -extern struct sys_device *get_cpu_sysdev(unsigned cpu); +extern struct device *get_cpu_device(unsigned cpu); +extern bool cpu_is_hotpluggable(unsigned cpu); -extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr); -extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr); +extern int cpu_add_dev_attr(struct device_attribute *attr); +extern void cpu_remove_dev_attr(struct device_attribute *attr); -extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); -extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); +extern int cpu_add_dev_attr_group(struct attribute_group *attrs); +extern void cpu_remove_dev_attr_group(struct attribute_group *attrs); -extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); +extern int sched_create_sysfs_power_savings_entries(struct device *dev);  #ifdef CONFIG_HOTPLUG_CPU  extern void unregister_cpu(struct cpu *cpu); @@ -160,7 +161,7 @@ static inline void cpu_maps_update_done(void)  }  #endif /* CONFIG_SMP */ -extern struct sysdev_class cpu_sysdev_class; +extern struct bus_type cpu_subsys;  #ifdef CONFIG_HOTPLUG_CPU  /* Stop CPUs going up and down. */ diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 7408af843b8..712abcc205a 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -130,7 +130,6 @@ struct cpuidle_driver {  #ifdef CONFIG_CPU_IDLE  extern void disable_cpuidle(void);  extern int cpuidle_idle_call(void); -  extern int cpuidle_register_driver(struct cpuidle_driver *drv);  struct cpuidle_driver *cpuidle_get_driver(void);  extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); @@ -145,7 +144,6 @@ extern void cpuidle_disable_device(struct cpuidle_device *dev);  #else  static inline void disable_cpuidle(void) { }  static inline int cpuidle_idle_call(void) { return -ENODEV; } -  static inline int cpuidle_register_driver(struct cpuidle_driver *drv)  {return -ENODEV; }  static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } @@ -188,7 +186,14 @@ struct cpuidle_governor {  extern int cpuidle_register_governor(struct cpuidle_governor *gov);  extern void cpuidle_unregister_governor(struct cpuidle_governor *gov); +#ifdef CONFIG_INTEL_IDLE +extern int intel_idle_cpu_init(int cpu); +#else +static inline int intel_idle_cpu_init(int cpu) { return -1; } +#endif +  #else +static inline int intel_idle_cpu_init(int cpu) { return -1; }  static inline int cpuidle_register_governor(struct cpuidle_governor *gov)  {return 0;} diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index 5c4abce94ad..b936763f223 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h @@ -5,6 +5,7 @@  #include <linux/kexec.h>  #include <linux/device.h>  #include <linux/proc_fs.h> +#include <linux/elf.h>  #define ELFCORE_ADDR_MAX	(-1ULL)  #define ELFCORE_ADDR_ERR	(-2ULL) diff --git a/include/linux/cred.h b/include/linux/cred.h index 40308969ed0..adadf71a732 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h @@ -358,10 +358,12 @@ static inline void put_cred(const struct cred *_cred)  #define current_security()	(current_cred_xxx(security))  #ifdef CONFIG_USER_NS -#define current_user_ns() (current_cred_xxx(user_ns)) +#define current_user_ns()	(current_cred_xxx(user_ns)) +#define task_user_ns(task)	(task_cred_xxx((task), user_ns))  #else  extern struct user_namespace init_user_ns; -#define current_user_ns() (&init_user_ns) +#define current_user_ns()	(&init_user_ns) +#define task_user_ns(task)	(&init_user_ns)  #endif diff --git a/include/linux/cuda.h b/include/linux/cuda.h index 6a3e6385d3f..9f9865ff781 100644 --- a/include/linux/cuda.h +++ b/include/linux/cuda.h @@ -5,6 +5,9 @@   * Copyright (C) 1996 Paul Mackerras.   */ +#ifndef _LINUX_CUDA_H +#define _LINUX_CUDA_H +  /* CUDA commands (2nd byte) */  #define CUDA_WARM_START		0  #define CUDA_AUTOPOLL		1 @@ -34,3 +37,5 @@ extern int cuda_request(struct adb_request *req,  extern void cuda_poll(void);  #endif	/* __KERNEL */ + +#endif /* _LINUX_CUDA_H */ diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 4df92619936..d64a55b23af 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -203,6 +203,7 @@ struct dentry_operations {  #define DCACHE_CANT_MOUNT	0x0100  #define DCACHE_GENOCIDE		0x0200 +#define DCACHE_SHRINK_LIST	0x0400  #define DCACHE_NFSFS_RENAMED	0x1000       /* this dentry has been "silly renamed" and has to be deleted on the last @@ -241,6 +242,7 @@ extern struct dentry * d_alloc(struct dentry *, const struct qstr *);  extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);  extern struct dentry * d_splice_alias(struct inode *, struct dentry *);  extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); +extern struct dentry *d_find_any_alias(struct inode *inode);  extern struct dentry * d_obtain_alias(struct inode *);  extern void shrink_dcache_sb(struct super_block *);  extern void shrink_dcache_parent(struct dentry *); @@ -249,6 +251,7 @@ extern int d_invalidate(struct dentry *);  /* only used at mount-time */  extern struct dentry * d_alloc_root(struct inode *); +extern struct dentry * d_make_root(struct inode *);  /* <clickety>-<click> the ramfs-type tree */  extern void d_genocide(struct dentry *); @@ -339,7 +342,8 @@ extern int d_validate(struct dentry *, struct dentry *);   */  extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); -extern char *__d_path(const struct path *path, struct path *root, char *, int); +extern char *__d_path(const struct path *, const struct path *, char *, int); +extern char *d_absolute_path(const struct path *, char *, int);  extern char *d_path(const struct path *, char *, int);  extern char *d_path_with_unreachable(const struct path *, char *, int);  extern char *dentry_path_raw(struct dentry *, char *, int); diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index e7d9b20ddc5..6169c26fd8c 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h @@ -16,6 +16,7 @@  #define _DEBUGFS_H_  #include <linux/fs.h> +#include <linux/seq_file.h>  #include <linux/types.h> @@ -26,6 +27,17 @@ struct debugfs_blob_wrapper {  	unsigned long size;  }; +struct debugfs_reg32 { +	char *name; +	unsigned long offset; +}; + +struct debugfs_regset32 { +	struct debugfs_reg32 *regs; +	int nregs; +	void __iomem *base; +}; +  extern struct dentry *arch_debugfs_dir;  #if defined(CONFIG_DEBUG_FS) @@ -34,7 +46,7 @@ extern struct dentry *arch_debugfs_dir;  extern const struct file_operations debugfs_file_operations;  extern const struct inode_operations debugfs_link_operations; -struct dentry *debugfs_create_file(const char *name, mode_t mode, +struct dentry *debugfs_create_file(const char *name, umode_t mode,  				   struct dentry *parent, void *data,  				   const struct file_operations *fops); @@ -49,31 +61,38 @@ void debugfs_remove_recursive(struct dentry *dentry);  struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,                  struct dentry *new_dir, const char *new_name); -struct dentry *debugfs_create_u8(const char *name, mode_t mode, +struct dentry *debugfs_create_u8(const char *name, umode_t mode,  				 struct dentry *parent, u8 *value); -struct dentry *debugfs_create_u16(const char *name, mode_t mode, +struct dentry *debugfs_create_u16(const char *name, umode_t mode,  				  struct dentry *parent, u16 *value); -struct dentry *debugfs_create_u32(const char *name, mode_t mode, +struct dentry *debugfs_create_u32(const char *name, umode_t mode,  				  struct dentry *parent, u32 *value); -struct dentry *debugfs_create_u64(const char *name, mode_t mode, +struct dentry *debugfs_create_u64(const char *name, umode_t mode,  				  struct dentry *parent, u64 *value); -struct dentry *debugfs_create_x8(const char *name, mode_t mode, +struct dentry *debugfs_create_x8(const char *name, umode_t mode,  				 struct dentry *parent, u8 *value); -struct dentry *debugfs_create_x16(const char *name, mode_t mode, +struct dentry *debugfs_create_x16(const char *name, umode_t mode,  				  struct dentry *parent, u16 *value); -struct dentry *debugfs_create_x32(const char *name, mode_t mode, +struct dentry *debugfs_create_x32(const char *name, umode_t mode,  				  struct dentry *parent, u32 *value); -struct dentry *debugfs_create_x64(const char *name, mode_t mode, +struct dentry *debugfs_create_x64(const char *name, umode_t mode,  				  struct dentry *parent, u64 *value); -struct dentry *debugfs_create_size_t(const char *name, mode_t mode, +struct dentry *debugfs_create_size_t(const char *name, umode_t mode,  				     struct dentry *parent, size_t *value); -struct dentry *debugfs_create_bool(const char *name, mode_t mode, +struct dentry *debugfs_create_bool(const char *name, umode_t mode,  				  struct dentry *parent, u32 *value); -struct dentry *debugfs_create_blob(const char *name, mode_t mode, +struct dentry *debugfs_create_blob(const char *name, umode_t mode,  				  struct dentry *parent,  				  struct debugfs_blob_wrapper *blob); +struct dentry *debugfs_create_regset32(const char *name, mode_t mode, +				     struct dentry *parent, +				     struct debugfs_regset32 *regset); + +int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, +			 int nregs, void __iomem *base, char *prefix); +  bool debugfs_initialized(void);  #else @@ -86,7 +105,7 @@ bool debugfs_initialized(void);   * want to duplicate the design decision mistakes of procfs and devfs again.   */ -static inline struct dentry *debugfs_create_file(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_file(const char *name, umode_t mode,  					struct dentry *parent, void *data,  					const struct file_operations *fops)  { @@ -118,76 +137,83 @@ static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentr  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_u8(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_u8(const char *name, umode_t mode,  					       struct dentry *parent,  					       u8 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_u16(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_u16(const char *name, umode_t mode,  						struct dentry *parent,  						u16 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_u32(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_u32(const char *name, umode_t mode,  						struct dentry *parent,  						u32 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_u64(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_u64(const char *name, umode_t mode,  						struct dentry *parent,  						u64 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_x8(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_x8(const char *name, umode_t mode,  					       struct dentry *parent,  					       u8 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_x16(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_x16(const char *name, umode_t mode,  						struct dentry *parent,  						u16 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_x32(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_x32(const char *name, umode_t mode,  						struct dentry *parent,  						u32 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_size_t(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_size_t(const char *name, umode_t mode,  				     struct dentry *parent,  				     size_t *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_bool(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_bool(const char *name, umode_t mode,  						 struct dentry *parent,  						 u32 *value)  {  	return ERR_PTR(-ENODEV);  } -static inline struct dentry *debugfs_create_blob(const char *name, mode_t mode, +static inline struct dentry *debugfs_create_blob(const char *name, umode_t mode,  				  struct dentry *parent,  				  struct debugfs_blob_wrapper *blob)  {  	return ERR_PTR(-ENODEV);  } +static inline struct dentry *debugfs_create_regset32(const char *name, +				   mode_t mode, struct dentry *parent, +				   struct debugfs_regset32 *regset) +{ +	return ERR_PTR(-ENODEV); +} +  static inline bool debugfs_initialized(void)  {  	return false; diff --git a/include/linux/debugobjects.h b/include/linux/debugobjects.h index 65970b811e2..0e5f5785d9f 100644 --- a/include/linux/debugobjects.h +++ b/include/linux/debugobjects.h @@ -46,6 +46,8 @@ struct debug_obj {   *			fails   * @fixup_free:		fixup function, which is called when the free check   *			fails + * @fixup_assert_init:  fixup function, which is called when the assert_init + *			check fails   */  struct debug_obj_descr {  	const char		*name; @@ -54,6 +56,7 @@ struct debug_obj_descr {  	int (*fixup_activate)	(void *addr, enum debug_obj_state state);  	int (*fixup_destroy)	(void *addr, enum debug_obj_state state);  	int (*fixup_free)	(void *addr, enum debug_obj_state state); +	int (*fixup_assert_init)(void *addr, enum debug_obj_state state);  };  #ifdef CONFIG_DEBUG_OBJECTS @@ -64,6 +67,7 @@ extern void debug_object_activate  (void *addr, struct debug_obj_descr *descr);  extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr);  extern void debug_object_destroy   (void *addr, struct debug_obj_descr *descr);  extern void debug_object_free      (void *addr, struct debug_obj_descr *descr); +extern void debug_object_assert_init(void *addr, struct debug_obj_descr *descr);  /*   * Active state: @@ -89,6 +93,8 @@ static inline void  debug_object_destroy   (void *addr, struct debug_obj_descr *descr) { }  static inline void  debug_object_free      (void *addr, struct debug_obj_descr *descr) { } +static inline void +debug_object_assert_init(void *addr, struct debug_obj_descr *descr) { }  static inline void debug_objects_early_init(void) { }  static inline void debug_objects_mem_init(void) { } diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index afb94583960..98ce8124b1c 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -41,7 +41,7 @@ struct devfreq_dev_status {  	unsigned long total_time;  	unsigned long busy_time;  	unsigned long current_frequency; -	void *private_date; +	void *private_data;  };  /** diff --git a/include/linux/device.h b/include/linux/device.h index ffbcf95cd97..b63fb393aa5 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -53,6 +53,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   * struct bus_type - The bus type of the device   *   * @name:	The name of the bus. + * @dev_name:	Used for subsystems to enumerate devices like ("foo%u", dev->id). + * @dev_root:	Default device to use as the parent.   * @bus_attrs:	Default attributes of the bus.   * @dev_attrs:	Default attributes of the devices on the bus.   * @drv_attrs:	Default attributes of the device drivers on the bus. @@ -69,7 +71,7 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   * @resume:	Called to bring a device on this bus out of sleep mode.   * @pm:		Power management operations of this bus, callback the specific   *		device driver's pm-ops. - * @iommu_ops   IOMMU specific operations for this bus, used to attach IOMMU + * @iommu_ops:  IOMMU specific operations for this bus, used to attach IOMMU   *              driver implementations to a bus and allow the driver to do   *              bus-specific setup   * @p:		The private data of the driver core, only the driver core can @@ -86,6 +88,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   */  struct bus_type {  	const char		*name; +	const char		*dev_name; +	struct device		*dev_root;  	struct bus_attribute	*bus_attrs;  	struct device_attribute	*dev_attrs;  	struct driver_attribute	*drv_attrs; @@ -106,12 +110,30 @@ struct bus_type {  	struct subsys_private *p;  }; -extern int __must_check bus_register(struct bus_type *bus); +/* 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 void bus_unregister(struct bus_type *bus);  extern int __must_check bus_rescan_devices(struct bus_type *bus);  /* iterator helpers for buses */ +struct subsys_dev_iter { +	struct klist_iter		ki; +	const struct device_type	*type; +}; +void subsys_dev_iter_init(struct subsys_dev_iter *iter, +			 struct bus_type *subsys, +			 struct device *start, +			 const struct device_type *type); +struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); +void subsys_dev_iter_exit(struct subsys_dev_iter *iter);  int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data,  		     int (*fn)(struct device *dev, void *data)); @@ -121,10 +143,10 @@ struct device *bus_find_device(struct bus_type *bus, struct device *start,  struct device *bus_find_device_by_name(struct bus_type *bus,  				       struct device *start,  				       const char *name); - +struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, +					struct device *hint);  int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,  		     void *data, int (*fn)(struct device_driver *, void *)); -  void bus_sort_breadthfirst(struct bus_type *bus,  			   int (*compare)(const struct device *a,  					  const struct device *b)); @@ -256,6 +278,33 @@ struct device *driver_find_device(struct device_driver *drv,  				  int (*match)(struct device *dev, void *data));  /** + * struct subsys_interface - interfaces to device functions + * @name:       name of the device function + * @subsys:     subsytem of the devices to attach to + * @node:       the list of functions registered at the subsystem + * @add_dev:    device hookup to device function handler + * @remove_dev: device hookup to device function handler + * + * Simple interfaces attached to a subsystem. Multiple interfaces can + * attach to a subsystem and its devices. Unlike drivers, they do not + * exclusively claim or control devices. Interfaces usually represent + * a specific functionality of a subsystem/class of devices. + */ +struct subsys_interface { +	const char *name; +	struct bus_type *subsys; +	struct list_head node; +	int (*add_dev)(struct device *dev, struct subsys_interface *sif); +	int (*remove_dev)(struct device *dev, struct subsys_interface *sif); +}; + +int subsys_interface_register(struct subsys_interface *sif); +void subsys_interface_unregister(struct subsys_interface *sif); + +int subsys_system_register(struct bus_type *subsys, +			   const struct attribute_group **groups); + +/**   * struct class - device classes   * @name:	Name of the class.   * @owner:	The module owner. @@ -294,7 +343,7 @@ struct class {  	struct kobject			*dev_kobj;  	int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); -	char *(*devnode)(struct device *dev, mode_t *mode); +	char *(*devnode)(struct device *dev, umode_t *mode);  	void (*class_release)(struct class *class);  	void (*dev_release)(struct device *dev); @@ -423,7 +472,7 @@ 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, mode_t *mode); +	char *(*devnode)(struct device *dev, umode_t *mode);  	void (*release)(struct device *dev);  	const struct dev_pm_ops *pm; @@ -438,11 +487,31 @@ struct device_attribute {  			 const char *buf, size_t count);  }; +struct dev_ext_attribute { +	struct device_attribute attr; +	void *var; +}; + +ssize_t device_show_ulong(struct device *dev, struct device_attribute *attr, +			  char *buf); +ssize_t device_store_ulong(struct device *dev, struct device_attribute *attr, +			   const char *buf, size_t count); +ssize_t device_show_int(struct device *dev, struct device_attribute *attr, +			char *buf); +ssize_t device_store_int(struct device *dev, struct device_attribute *attr, +			 const char *buf, size_t count); +  #define DEVICE_ATTR(_name, _mode, _show, _store) \ -struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) +	struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) +#define DEVICE_ULONG_ATTR(_name, _mode, _var) \ +	struct dev_ext_attribute dev_attr_##_name = \ +		{ __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } +#define DEVICE_INT_ATTR(_name, _mode, _var) \ +	struct dev_ext_attribute dev_attr_##_name = \ +		{ __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } -extern int __must_check device_create_file(struct device *device, -					const struct device_attribute *entry); +extern int device_create_file(struct device *device, +			      const struct device_attribute *entry);  extern void device_remove_file(struct device *dev,  			       const struct device_attribute *attr);  extern int __must_check device_create_bin_file(struct device *dev, @@ -490,6 +559,9 @@ extern int devres_release_group(struct device *dev, void *id);  extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp);  extern void devm_kfree(struct device *dev, void *p); +void __iomem *devm_request_and_ioremap(struct device *dev, +			struct resource *res); +  struct device_dma_parameters {  	/*  	 * a low level driver may set these to teach IOMMU code about @@ -540,6 +612,7 @@ struct device_dma_parameters {   * @archdata:	For arch-specific additions.   * @of_node:	Associated device tree node.   * @devt:	For creating the sysfs "dev". + * @id:		device instance   * @devres_lock: Spinlock to protect the resource of the device.   * @devres_head: The resources list of the device.   * @knode_class: The node used to add the device to the class list. @@ -600,6 +673,7 @@ struct device {  	struct device_node	*of_node; /* associated device tree node */  	dev_t			devt;	/* dev_t, creates the sysfs "dev" */ +	u32			id;	/* device instance */  	spinlock_t		devres_lock;  	struct list_head	devres_head; @@ -682,6 +756,11 @@ static inline bool device_async_suspend_enabled(struct device *dev)  	return !!dev->power.async_suspend;  } +static inline void pm_suspend_ignore_children(struct device *dev, bool enable) +{ +	dev->power.ignore_children = enable; +} +  static inline void device_lock(struct device *dev)  {  	mutex_lock(&dev->mutex); @@ -715,7 +794,7 @@ 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, -				      mode_t *mode, const char **tmp); +				      umode_t *mode, const char **tmp);  extern void *dev_get_drvdata(const struct device *dev);  extern int dev_set_drvdata(struct device *dev, void *data); @@ -919,4 +998,29 @@ extern long sysfs_deprecated;  #define sysfs_deprecated 0  #endif +/** + * module_driver() - Helper macro for drivers that don't do anything + * special in module init/exit. This eliminates a lot of boilerplate. + * Each module may only use this macro once, and calling it replaces + * module_init() and module_exit(). + * + * @__driver: driver name + * @__register: register function for this driver type + * @__unregister: unregister function for this driver type + * + * Use this macro to construct bus specific macros for registering + * drivers, and do not use it on its own. + */ +#define module_driver(__driver, __register, __unregister) \ +static int __init __driver##_init(void) \ +{ \ +	return __register(&(__driver)); \ +} \ +module_init(__driver##_init); \ +static void __exit __driver##_exit(void) \ +{ \ +	__unregister(&(__driver)); \ +} \ +module_exit(__driver##_exit); +  #endif /* _DEVICE_H_ */ diff --git a/include/linux/digsig.h b/include/linux/digsig.h new file mode 100644 index 00000000000..b01558b1581 --- /dev/null +++ b/include/linux/digsig.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 Nokia Corporation + * Copyright (C) 2011 Intel Corporation + * + * Author: + * Dmitry Kasatkin <dmitry.kasatkin@nokia.com> + *                 <dmitry.kasatkin@intel.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, version 2 of the License. + * + */ + +#ifndef _DIGSIG_H +#define _DIGSIG_H + +#include <linux/key.h> + +enum pubkey_algo { +	PUBKEY_ALGO_RSA, +	PUBKEY_ALGO_MAX, +}; + +enum digest_algo { +	DIGEST_ALGO_SHA1, +	DIGEST_ALGO_SHA256, +	DIGEST_ALGO_MAX +}; + +struct pubkey_hdr { +	uint8_t		version;	/* key format version */ +	time_t		timestamp;	/* key made, always 0 for now */ +	uint8_t		algo; +	uint8_t		nmpi; +	char		mpi[0]; +} __packed; + +struct signature_hdr { +	uint8_t		version;	/* signature format version */ +	time_t		timestamp;	/* signature made */ +	uint8_t		algo; +	uint8_t		hash; +	uint8_t		keyid[8]; +	uint8_t		nmpi; +	char		mpi[0]; +} __packed; + +#if defined(CONFIG_SIGNATURE) || defined(CONFIG_SIGNATURE_MODULE) + +int digsig_verify(struct key *keyring, const char *sig, int siglen, +					const char *digest, int digestlen); + +#else + +static inline int digsig_verify(struct key *keyring, const char *sig, +				int siglen, const char *digest, int digestlen) +{ +	return -EOPNOTSUPP; +} + +#endif /* CONFIG_SIGNATURE */ + +#endif /* _DIGSIG_H */ diff --git a/include/linux/display.h b/include/linux/display.h deleted file mode 100644 index 3bf70d63972..00000000000 --- a/include/linux/display.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - *  Copyright (C) 2006 James Simmons <jsimmons@infradead.org> - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - *  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 _LINUX_DISPLAY_H -#define _LINUX_DISPLAY_H - -#include <linux/device.h> - -struct display_device; - -/* This structure defines all the properties of a Display. */ -struct display_driver { -	int  (*set_contrast)(struct display_device *, unsigned int); -	int  (*get_contrast)(struct display_device *); -	void (*suspend)(struct display_device *, pm_message_t state); -	void (*resume)(struct display_device *); -	int  (*probe)(struct display_device *, void *); -	int  (*remove)(struct display_device *); -	int  max_contrast; -}; - -struct display_device { -	struct module *owner;			/* Owner module */ -	struct display_driver *driver; -	struct device *parent;			/* This is the parent */ -	struct device *dev;			/* This is this display device */ -	struct mutex lock; -	void *priv_data; -	char type[16]; -	char *name; -	int idx; -}; - -extern struct display_device *display_device_register(struct display_driver *driver, -					struct device *dev, void *devdata); -extern void display_device_unregister(struct display_device *dev); - -extern int probe_edid(struct display_device *dev, void *devdata); - -#define to_display_device(obj) container_of(obj, struct display_device, class_dev) - -#endif diff --git a/include/linux/dlm.h b/include/linux/dlm.h index d4e02f5353a..6c7f6e9546c 100644 --- a/include/linux/dlm.h +++ b/include/linux/dlm.h @@ -2,7 +2,7 @@  *******************************************************************************  **  **  Copyright (C) Sistina Software, Inc.  1997-2003  All rights reserved. -**  Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved. +**  Copyright (C) 2004-2011 Red Hat, Inc.  All rights reserved.  **  **  This copyrighted material is made available to anyone wishing to use,  **  modify, copy, or redistribute it subject to the terms and conditions @@ -74,15 +74,76 @@ struct dlm_lksb {  #ifdef __KERNEL__ +struct dlm_slot { +	int nodeid; /* 1 to MAX_INT */ +	int slot;   /* 1 to MAX_INT */ +}; + +/* + * recover_prep: called before the dlm begins lock recovery. + *   Notfies lockspace user that locks from failed members will be granted. + * recover_slot: called after recover_prep and before recover_done. + *   Identifies a failed lockspace member. + * recover_done: called after the dlm completes lock recovery. + *   Identifies lockspace members and lockspace generation number. + */ + +struct dlm_lockspace_ops { +	void (*recover_prep) (void *ops_arg); +	void (*recover_slot) (void *ops_arg, struct dlm_slot *slot); +	void (*recover_done) (void *ops_arg, struct dlm_slot *slots, +			      int num_slots, int our_slot, uint32_t generation); +}; +  /*   * dlm_new_lockspace   * - * Starts a lockspace with the given name.  If the named lockspace exists in - * the cluster, the calling node joins it. + * Create/join a lockspace. + * + * name: lockspace name, null terminated, up to DLM_LOCKSPACE_LEN (not + *   including terminating null). + * + * cluster: cluster name, null terminated, up to DLM_LOCKSPACE_LEN (not + *   including terminating null).  Optional.  When cluster is null, it + *   is not used.  When set, dlm_new_lockspace() returns -EBADR if cluster + *   is not equal to the dlm cluster name. + * + * flags: + * DLM_LSFL_NODIR + *   The dlm should not use a resource directory, but statically assign + *   resource mastery to nodes based on the name hash that is otherwise + *   used to select the directory node.  Must be the same on all nodes. + * DLM_LSFL_TIMEWARN + *   The dlm should emit netlink messages if locks have been waiting + *   for a configurable amount of time.  (Unused.) + * DLM_LSFL_FS + *   The lockspace user is in the kernel (i.e. filesystem).  Enables + *   direct bast/cast callbacks. + * DLM_LSFL_NEWEXCL + *   dlm_new_lockspace() should return -EEXIST if the lockspace exists. + * + * lvblen: length of lvb in bytes.  Must be multiple of 8. + *   dlm_new_lockspace() returns an error if this does not match + *   what other nodes are using. + * + * ops: callbacks that indicate lockspace recovery points so the + *   caller can coordinate its recovery and know lockspace members. + *   This is only used by the initial dlm_new_lockspace() call. + *   Optional. + * + * ops_arg: arg for ops callbacks. + * + * ops_result: tells caller if the ops callbacks (if provided) will + *   be used or not.  0: will be used, -EXXX will not be used. + *   -EOPNOTSUPP: the dlm does not have recovery_callbacks enabled. + * + * lockspace: handle for dlm functions   */ -int dlm_new_lockspace(const char *name, int namelen, -		      dlm_lockspace_t **lockspace, uint32_t flags, int lvblen); +int dlm_new_lockspace(const char *name, const char *cluster, +		      uint32_t flags, int lvblen, +		      const struct dlm_lockspace_ops *ops, void *ops_arg, +		      int *ops_result, dlm_lockspace_t **lockspace);  /*   * dlm_release_lockspace diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h new file mode 100644 index 00000000000..f8ac076afa5 --- /dev/null +++ b/include/linux/dma-buf.h @@ -0,0 +1,176 @@ +/* + * Header file for dma buffer sharing framework. + * + * Copyright(C) 2011 Linaro Limited. All rights reserved. + * Author: Sumit Semwal <sumit.semwal@ti.com> + * + * Many thanks to linaro-mm-sig list, and specially + * Arnd Bergmann <arnd@arndb.de>, Rob Clark <rob@ti.com> and + * Daniel Vetter <daniel@ffwll.ch> for their support in creation and + * refining of this idea. + * + * 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 __DMA_BUF_H__ +#define __DMA_BUF_H__ + +#include <linux/file.h> +#include <linux/err.h> +#include <linux/device.h> +#include <linux/scatterlist.h> +#include <linux/list.h> +#include <linux/dma-mapping.h> + +struct dma_buf; +struct dma_buf_attachment; + +/** + * struct dma_buf_ops - operations possible on struct dma_buf + * @attach: [optional] allows different devices to 'attach' themselves to the + *	    given buffer. It might return -EBUSY to signal that backing storage + *	    is already allocated and incompatible with the requirements + *	    of requesting device. + * @detach: [optional] detach a given device from this buffer. + * @map_dma_buf: returns list of scatter pages allocated, increases usecount + *		 of the buffer. Requires atleast one attach to be called + *		 before. Returned sg list should already be mapped into + *		 _device_ address space. This call may sleep. May also return + *		 -EINTR. Should return -EINVAL if attach hasn't been called yet. + * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter + *		   pages. + * @release: release this buffer; to be called after the last dma_buf_put. + */ +struct dma_buf_ops { +	int (*attach)(struct dma_buf *, struct device *, +			struct dma_buf_attachment *); + +	void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + +	/* For {map,unmap}_dma_buf below, any specific buffer attributes +	 * required should get added to device_dma_parameters accessible +	 * via dev->dma_params. +	 */ +	struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, +						enum dma_data_direction); +	void (*unmap_dma_buf)(struct dma_buf_attachment *, +						struct sg_table *); +	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY +	 * if the call would block. +	 */ + +	/* after final dma_buf_put() */ +	void (*release)(struct dma_buf *); + +}; + +/** + * struct dma_buf - shared buffer object + * @size: size of the buffer + * @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. + * @priv: exporter specific private data for this buffer object. + */ +struct dma_buf { +	size_t size; +	struct file *file; +	struct list_head attachments; +	const struct dma_buf_ops *ops; +	/* mutex to serialize list manipulation and other ops */ +	struct mutex lock; +	void *priv; +}; + +/** + * struct dma_buf_attachment - holds device-buffer attachment data + * @dmabuf: buffer for this attachment. + * @dev: device attached to the buffer. + * @node: list of dma_buf_attachment. + * @priv: exporter specific attachment data. + * + * This structure holds the attachment information between the dma_buf buffer + * and its user device(s). The list contains one attachment struct per device + * attached to the buffer. + */ +struct dma_buf_attachment { +	struct dma_buf *dmabuf; +	struct device *dev; +	struct list_head node; +	void *priv; +}; + +#ifdef CONFIG_DMA_SHARED_BUFFER +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, struct dma_buf_ops *ops, +			size_t size, int flags); +int dma_buf_fd(struct dma_buf *dmabuf); +struct dma_buf *dma_buf_get(int fd); +void dma_buf_put(struct dma_buf *dmabuf); + +struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *, +					enum dma_data_direction); +void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *); +#else + +static inline struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf, +							struct device *dev) +{ +	return ERR_PTR(-ENODEV); +} + +static inline void dma_buf_detach(struct dma_buf *dmabuf, +				  struct dma_buf_attachment *dmabuf_attach) +{ +	return; +} + +static inline struct dma_buf *dma_buf_export(void *priv, +						struct dma_buf_ops *ops, +						size_t size, int flags) +{ +	return ERR_PTR(-ENODEV); +} + +static inline int dma_buf_fd(struct dma_buf *dmabuf) +{ +	return -ENODEV; +} + +static inline struct dma_buf *dma_buf_get(int fd) +{ +	return ERR_PTR(-ENODEV); +} + +static inline void dma_buf_put(struct dma_buf *dmabuf) +{ +	return; +} + +static inline struct sg_table *dma_buf_map_attachment( +	struct dma_buf_attachment *attach, enum dma_data_direction write) +{ +	return ERR_PTR(-ENODEV); +} + +static inline void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, +						struct sg_table *sg) +{ +	return; +} + +#endif /* CONFIG_DMA_SHARED_BUFFER */ + +#endif /* __DMA_BUF_H__ */ diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index ef90cbd8e17..57c9a8ae4f2 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h @@ -31,6 +31,7 @@ extern void free_dmar_iommu(struct intel_iommu *iommu);  extern int iommu_calculate_agaw(struct intel_iommu *iommu);  extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu);  extern int dmar_disabled; +extern int intel_iommu_enabled;  #else  static inline int iommu_calculate_agaw(struct intel_iommu *iommu)  { @@ -44,6 +45,7 @@ static inline void free_dmar_iommu(struct intel_iommu *iommu)  {  }  #define dmar_disabled	(1) +#define intel_iommu_enabled (0)  #endif diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 75f53f874b2..679b349d9b6 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -23,7 +23,6 @@  #include <linux/device.h>  #include <linux/uio.h> -#include <linux/dma-direction.h>  #include <linux/scatterlist.h>  #include <linux/bitmap.h>  #include <asm/page.h> @@ -72,11 +71,93 @@ enum dma_transaction_type {  	DMA_ASYNC_TX,  	DMA_SLAVE,  	DMA_CYCLIC, +	DMA_INTERLEAVE, +/* last transaction type for creation of the capabilities mask */ +	DMA_TX_TYPE_END,  }; -/* last transaction type for creation of the capabilities mask */ -#define DMA_TX_TYPE_END (DMA_CYCLIC + 1) +/** + * enum dma_transfer_direction - dma transfer mode and direction indicator + * @DMA_MEM_TO_MEM: Async/Memcpy mode + * @DMA_MEM_TO_DEV: Slave mode & From Memory to Device + * @DMA_DEV_TO_MEM: Slave mode & From Device to Memory + * @DMA_DEV_TO_DEV: Slave mode & From Device to Device + */ +enum dma_transfer_direction { +	DMA_MEM_TO_MEM, +	DMA_MEM_TO_DEV, +	DMA_DEV_TO_MEM, +	DMA_DEV_TO_DEV, +	DMA_TRANS_NONE, +}; + +/** + * Interleaved Transfer Request + * ---------------------------- + * A chunk is collection of contiguous bytes to be transfered. + * The gap(in bytes) between two chunks is called inter-chunk-gap(ICG). + * ICGs may or maynot change between chunks. + * A FRAME is the smallest series of contiguous {chunk,icg} pairs, + *  that when repeated an integral number of times, specifies the transfer. + * A transfer template is specification of a Frame, the number of times + *  it is to be repeated and other per-transfer attributes. + * + * Practically, a client driver would have ready a template for each + *  type of transfer it is going to need during its lifetime and + *  set only 'src_start' and 'dst_start' before submitting the requests. + * + * + *  |      Frame-1        |       Frame-2       | ~ |       Frame-'numf'  | + *  |====....==.===...=...|====....==.===...=...| ~ |====....==.===...=...| + * + *    ==  Chunk size + *    ... ICG + */ + +/** + * struct data_chunk - Element of scatter-gather list that makes a frame. + * @size: Number of bytes to read from source. + *	  size_dst := fn(op, size_src), so doesn't mean much for destination. + * @icg: Number of bytes to jump after last src/dst address of this + *	 chunk and before first src/dst address for next chunk. + *	 Ignored for dst(assumed 0), if dst_inc is true and dst_sgl is false. + *	 Ignored for src(assumed 0), if src_inc is true and src_sgl is false. + */ +struct data_chunk { +	size_t size; +	size_t icg; +}; +/** + * struct dma_interleaved_template - Template to convey DMAC the transfer pattern + *	 and attributes. + * @src_start: Bus address of source for the first chunk. + * @dst_start: Bus address of destination for the first chunk. + * @dir: Specifies the type of Source and Destination. + * @src_inc: If the source address increments after reading from it. + * @dst_inc: If the destination address increments after writing to it. + * @src_sgl: If the 'icg' of sgl[] applies to Source (scattered read). + *		Otherwise, source is read contiguously (icg ignored). + *		Ignored if src_inc is false. + * @dst_sgl: If the 'icg' of sgl[] applies to Destination (scattered write). + *		Otherwise, destination is filled contiguously (icg ignored). + *		Ignored if dst_inc is false. + * @numf: Number of frames in this template. + * @frame_size: Number of chunks in a frame i.e, size of sgl[]. + * @sgl: Array of {chunk,icg} pairs that make up a frame. + */ +struct dma_interleaved_template { +	dma_addr_t src_start; +	dma_addr_t dst_start; +	enum dma_transfer_direction dir; +	bool src_inc; +	bool dst_inc; +	bool src_sgl; +	bool dst_sgl; +	size_t numf; +	size_t frame_size; +	struct data_chunk sgl[0]; +};  /**   * enum dma_ctrl_flags - DMA flags to augment operation preparation, @@ -269,7 +350,7 @@ enum dma_slave_buswidth {   * struct, if applicable.   */  struct dma_slave_config { -	enum dma_data_direction direction; +	enum dma_transfer_direction direction;  	dma_addr_t src_addr;  	dma_addr_t dst_addr;  	enum dma_slave_buswidth src_addr_width; @@ -433,6 +514,7 @@ struct dma_tx_state {   * @device_prep_dma_cyclic: prepare a cyclic dma operation suitable for audio.   *	The function takes a buffer of size buf_len. The callback function will   *	be called after period_len bytes have been transferred. + * @device_prep_interleaved_dma: Transfer expression in a generic way.   * @device_control: manipulate all pending operations on a channel, returns   *	zero or error code   * @device_tx_status: poll for transaction completion, the optional @@ -492,11 +574,14 @@ struct dma_device {  	struct dma_async_tx_descriptor *(*device_prep_slave_sg)(  		struct dma_chan *chan, struct scatterlist *sgl, -		unsigned int sg_len, enum dma_data_direction direction, +		unsigned int sg_len, enum dma_transfer_direction direction,  		unsigned long flags);  	struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(  		struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, -		size_t period_len, enum dma_data_direction direction); +		size_t period_len, enum dma_transfer_direction direction); +	struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)( +		struct dma_chan *chan, struct dma_interleaved_template *xt, +		unsigned long flags);  	int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd,  		unsigned long arg); @@ -522,7 +607,7 @@ static inline int dmaengine_slave_config(struct dma_chan *chan,  static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(  	struct dma_chan *chan, void *buf, size_t len, -	enum dma_data_direction dir, unsigned long flags) +	enum dma_transfer_direction dir, unsigned long flags)  {  	struct scatterlist sg;  	sg_init_one(&sg, buf, len); diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index 1b1094c35e4..cb4428ab81e 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h @@ -72,7 +72,7 @@ typedef enum fe_caps {  struct dvb_frontend_info {  	char       name[128]; -	fe_type_t  type; +	fe_type_t  type;			/* DEPRECATED. Use DTV_ENUM_DELSYS instead */  	__u32      frequency_min;  	__u32      frequency_max;  	__u32      frequency_stepsize; @@ -181,6 +181,7 @@ typedef enum fe_transmit_mode {  	TRANSMISSION_MODE_32K,  } fe_transmit_mode_t; +#if defined(__DVB_CORE__) || !defined (__KERNEL__)  typedef enum fe_bandwidth {  	BANDWIDTH_8_MHZ,  	BANDWIDTH_7_MHZ, @@ -190,7 +191,7 @@ typedef enum fe_bandwidth {  	BANDWIDTH_10_MHZ,  	BANDWIDTH_1_712_MHZ,  } fe_bandwidth_t; - +#endif  typedef enum fe_guard_interval {  	GUARD_INTERVAL_1_32, @@ -213,6 +214,7 @@ typedef enum fe_hierarchy {  } fe_hierarchy_t; +#if defined(__DVB_CORE__) || !defined (__KERNEL__)  struct dvb_qpsk_parameters {  	__u32		symbol_rate;  /* symbol rate in Symbols per second */  	fe_code_rate_t	fec_inner;    /* forward error correction (see above) */ @@ -251,11 +253,11 @@ struct dvb_frontend_parameters {  	} u;  }; -  struct dvb_frontend_event {  	fe_status_t status;  	struct dvb_frontend_parameters parameters;  }; +#endif  /* S2API Commands */  #define DTV_UNDEFINED		0 @@ -316,7 +318,9 @@ struct dvb_frontend_event {  #define DTV_DVBT2_PLP_ID	43 -#define DTV_MAX_COMMAND				DTV_DVBT2_PLP_ID +#define DTV_ENUM_DELSYS		44 + +#define DTV_MAX_COMMAND				DTV_ENUM_DELSYS  typedef enum fe_pilot {  	PILOT_ON, @@ -333,7 +337,7 @@ typedef enum fe_rolloff {  typedef enum fe_delivery_system {  	SYS_UNDEFINED, -	SYS_DVBC_ANNEX_AC, +	SYS_DVBC_ANNEX_A,  	SYS_DVBC_ANNEX_B,  	SYS_DVBT,  	SYS_DSS, @@ -350,8 +354,13 @@ typedef enum fe_delivery_system {  	SYS_DAB,  	SYS_DVBT2,  	SYS_TURBO, +	SYS_DVBC_ANNEX_C,  } fe_delivery_system_t; + +#define SYS_DVBC_ANNEX_AC	SYS_DVBC_ANNEX_A + +  struct dtv_cmds_h {  	char	*name;		/* A display name for debugging purposes */ diff --git a/include/linux/dvb/version.h b/include/linux/dvb/version.h index 66594b1d5d7..0559e2bd38f 100644 --- a/include/linux/dvb/version.h +++ b/include/linux/dvb/version.h @@ -24,6 +24,6 @@  #define _DVBVERSION_H_  #define DVB_API_VERSION 5 -#define DVB_API_VERSION_MINOR 4 +#define DVB_API_VERSION_MINOR 5  #endif /*_DVBVERSION_H_*/ diff --git a/include/linux/dw_dmac.h b/include/linux/dw_dmac.h index 4bfe0a2f7d5..f2c64f92c4a 100644 --- a/include/linux/dw_dmac.h +++ b/include/linux/dw_dmac.h @@ -127,7 +127,7 @@ struct dw_cyclic_desc {  struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,  		dma_addr_t buf_addr, size_t buf_len, size_t period_len, -		enum dma_data_direction direction); +		enum dma_transfer_direction direction);  void dw_dma_cyclic_free(struct dma_chan *chan);  int dw_dma_cyclic_start(struct dma_chan *chan);  void dw_dma_cyclic_stop(struct dma_chan *chan); diff --git a/include/linux/dynamic_queue_limits.h b/include/linux/dynamic_queue_limits.h new file mode 100644 index 00000000000..5621547d631 --- /dev/null +++ b/include/linux/dynamic_queue_limits.h @@ -0,0 +1,97 @@ +/* + * Dynamic queue limits (dql) - Definitions + * + * Copyright (c) 2011, Tom Herbert <therbert@google.com> + * + * This header file contains the definitions for dynamic queue limits (dql). + * dql would be used in conjunction with a producer/consumer type queue + * (possibly a HW queue).  Such a queue would have these general properties: + * + *   1) Objects are queued up to some limit specified as number of objects. + *   2) Periodically a completion process executes which retires consumed + *      objects. + *   3) Starvation occurs when limit has been reached, all queued data has + *      actually been consumed, but completion processing has not yet run + *      so queuing new data is blocked. + *   4) Minimizing the amount of queued data is desirable. + * + * The goal of dql is to calculate the limit as the minimum number of objects + * needed to prevent starvation. + * + * The primary functions of dql are: + *    dql_queued - called when objects are enqueued to record number of objects + *    dql_avail - returns how many objects are available to be queued based + *      on the object limit and how many objects are already enqueued + *    dql_completed - called at completion time to indicate how many objects + *      were retired from the queue + * + * The dql implementation does not implement any locking for the dql data + * structures, the higher layer should provide this.  dql_queued should + * be serialized to prevent concurrent execution of the function; this + * is also true for  dql_completed.  However, dql_queued and dlq_completed  can + * be executed concurrently (i.e. they can be protected by different locks). + */ + +#ifndef _LINUX_DQL_H +#define _LINUX_DQL_H + +#ifdef __KERNEL__ + +struct dql { +	/* Fields accessed in enqueue path (dql_queued) */ +	unsigned int	num_queued;		/* Total ever queued */ +	unsigned int	adj_limit;		/* limit + num_completed */ +	unsigned int	last_obj_cnt;		/* Count at last queuing */ + +	/* Fields accessed only by completion path (dql_completed) */ + +	unsigned int	limit ____cacheline_aligned_in_smp; /* Current limit */ +	unsigned int	num_completed;		/* Total ever completed */ + +	unsigned int	prev_ovlimit;		/* Previous over limit */ +	unsigned int	prev_num_queued;	/* Previous queue total */ +	unsigned int	prev_last_obj_cnt;	/* Previous queuing cnt */ + +	unsigned int	lowest_slack;		/* Lowest slack found */ +	unsigned long	slack_start_time;	/* Time slacks seen */ + +	/* Configuration */ +	unsigned int	max_limit;		/* Max limit */ +	unsigned int	min_limit;		/* Minimum limit */ +	unsigned int	slack_hold_time;	/* Time to measure slack */ +}; + +/* Set some static maximums */ +#define DQL_MAX_OBJECT (UINT_MAX / 16) +#define DQL_MAX_LIMIT ((UINT_MAX / 2) - DQL_MAX_OBJECT) + +/* + * Record number of objects queued. Assumes that caller has already checked + * availability in the queue with dql_avail. + */ +static inline void dql_queued(struct dql *dql, unsigned int count) +{ +	BUG_ON(count > DQL_MAX_OBJECT); + +	dql->num_queued += count; +	dql->last_obj_cnt = count; +} + +/* Returns how many objects can be queued, < 0 indicates over limit. */ +static inline int dql_avail(const struct dql *dql) +{ +	return dql->adj_limit - dql->num_queued; +} + +/* Record number of completed objects and recalculate the limit. */ +void dql_completed(struct dql *dql, unsigned int count); + +/* Reset dql state */ +void dql_reset(struct dql *dql); + +/* Initialize dql state */ +int dql_init(struct dql *dql, unsigned hold_time); + +#endif /* _KERNEL_ */ + +#endif /* _LINUX_DQL_H */ diff --git a/include/linux/edac.h b/include/linux/edac.h index 055b248bdd5..1cd3947987e 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -13,7 +13,7 @@  #define _LINUX_EDAC_H_  #include <linux/atomic.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #define EDAC_OPSTATE_INVAL	-1  #define EDAC_OPSTATE_POLL	0 @@ -23,12 +23,12 @@  extern int edac_op_state;  extern int edac_err_assert;  extern atomic_t edac_handlers; -extern struct sysdev_class edac_class; +extern struct bus_type edac_subsys;  extern int edac_handler_set(void);  extern void edac_atomic_assert_error(void); -extern struct sysdev_class *edac_get_sysfs_class(void); -extern void edac_put_sysfs_class(void); +extern struct bus_type *edac_get_sysfs_subsys(void); +extern void edac_put_sysfs_subsys(void);  static inline void opstate_init(void)  { diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h index c4627cbdb8e..e50f98b0297 100644 --- a/include/linux/eeprom_93cx6.h +++ b/include/linux/eeprom_93cx6.h @@ -33,6 +33,7 @@  #define PCI_EEPROM_WIDTH_93C86	8  #define PCI_EEPROM_WIDTH_OPCODE	3  #define PCI_EEPROM_WRITE_OPCODE	0x05 +#define PCI_EEPROM_ERASE_OPCODE 0x07  #define PCI_EEPROM_READ_OPCODE	0x06  #define PCI_EEPROM_EWDS_OPCODE	0x10  #define PCI_EEPROM_EWEN_OPCODE	0x13 @@ -46,6 +47,7 @@   * @register_write(struct eeprom_93cx6 *eeprom): handler to   * write to the eeprom register by using all reg_* fields.   * @width: eeprom width, should be one of the PCI_EEPROM_WIDTH_* defines + * @drive_data: Set if we're driving the data line.   * @reg_data_in: register field to indicate data input   * @reg_data_out: register field to indicate data output   * @reg_data_clock: register field to set the data clock @@ -62,6 +64,7 @@ struct eeprom_93cx6 {  	int width; +	char drive_data;  	char reg_data_in;  	char reg_data_out;  	char reg_data_clock; @@ -72,3 +75,8 @@ extern void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom,  	const u8 word, u16 *data);  extern void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom,  	const u8 word, __le16 *data, const u16 words); + +extern void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable); + +extern void eeprom_93cx6_write(struct eeprom_93cx6 *eeprom, +			       u8 addr, u16 data); diff --git a/include/linux/efi.h b/include/linux/efi.h index 2362a0bc7f0..37c300712e0 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -109,6 +109,14 @@ typedef struct {  	u32 imagesize;  } efi_capsule_header_t; +/* + * Allocation types for calls to boottime->allocate_pages. + */ +#define EFI_ALLOCATE_ANY_PAGES		0 +#define EFI_ALLOCATE_MAX_ADDRESS	1 +#define EFI_ALLOCATE_ADDRESS		2 +#define EFI_MAX_ALLOCATE_TYPE		3 +  typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);  /* @@ -139,6 +147,57 @@ typedef struct {  } efi_time_cap_t;  /* + * EFI Boot Services table + */ +typedef struct { +	efi_table_hdr_t hdr; +	void *raise_tpl; +	void *restore_tpl; +	void *allocate_pages; +	void *free_pages; +	void *get_memory_map; +	void *allocate_pool; +	void *free_pool; +	void *create_event; +	void *set_timer; +	void *wait_for_event; +	void *signal_event; +	void *close_event; +	void *check_event; +	void *install_protocol_interface; +	void *reinstall_protocol_interface; +	void *uninstall_protocol_interface; +	void *handle_protocol; +	void *__reserved; +	void *register_protocol_notify; +	void *locate_handle; +	void *locate_device_path; +	void *install_configuration_table; +	void *load_image; +	void *start_image; +	void *exit; +	void *unload_image; +	void *exit_boot_services; +	void *get_next_monotonic_count; +	void *stall; +	void *set_watchdog_timer; +	void *connect_controller; +	void *disconnect_controller; +	void *open_protocol; +	void *close_protocol; +	void *open_protocol_information; +	void *protocols_per_handle; +	void *locate_handle_buffer; +	void *locate_protocol; +	void *install_multiple_protocol_interfaces; +	void *uninstall_multiple_protocol_interfaces; +	void *calculate_crc32; +	void *copy_mem; +	void *set_mem; +	void *create_event_ex; +} efi_boot_services_t; + +/*   * Types and defines for EFI ResetSystem   */  #define EFI_RESET_COLD 0 @@ -236,6 +295,24 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,  #define LINUX_EFI_CRASH_GUID \      EFI_GUID(  0xcfc8fc79, 0xbe2e, 0x4ddc, 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0 ) +#define LOADED_IMAGE_PROTOCOL_GUID \ +    EFI_GUID(  0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) + +#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ +    EFI_GUID(  0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a ) + +#define EFI_UGA_PROTOCOL_GUID \ +    EFI_GUID(  0x982c298b, 0xf4fa, 0x41cb, 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 ) + +#define EFI_PCI_IO_PROTOCOL_GUID \ +    EFI_GUID(  0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a ) + +#define EFI_FILE_INFO_ID \ +    EFI_GUID(  0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) + +#define EFI_FILE_SYSTEM_GUID \ +    EFI_GUID(  0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) +  typedef struct {  	efi_guid_t guid;  	unsigned long table; @@ -261,7 +338,7 @@ typedef struct {  	unsigned long stderr_handle;  	unsigned long stderr;  	efi_runtime_services_t *runtime; -	unsigned long boottime; +	efi_boot_services_t *boottime;  	unsigned long nr_tables;  	unsigned long tables;  } efi_system_table_t; @@ -275,6 +352,56 @@ struct efi_memory_map {  	unsigned long desc_size;  }; +typedef struct { +	u32 revision; +	void *parent_handle; +	efi_system_table_t *system_table; +	void *device_handle; +	void *file_path; +	void *reserved; +	u32 load_options_size; +	void *load_options; +	void *image_base; +	__aligned_u64 image_size; +	unsigned int image_code_type; +	unsigned int image_data_type; +	unsigned long unload; +} efi_loaded_image_t; + +typedef struct { +	u64 revision; +	void *open_volume; +} efi_file_io_interface_t; + +typedef struct { +	u64 size; +	u64 file_size; +	u64 phys_size; +	efi_time_t create_time; +	efi_time_t last_access_time; +	efi_time_t modification_time; +	__aligned_u64 attribute; +	efi_char16_t filename[1]; +} efi_file_info_t; + +typedef struct { +	u64 revision; +	void *open; +	void *close; +	void *delete; +	void *read; +	void *write; +	void *get_position; +	void *set_position; +	void *get_info; +	void *set_info; +	void *flush; +} efi_file_handle_t; + +#define EFI_FILE_MODE_READ	0x0000000000000001 +#define EFI_FILE_MODE_WRITE	0x0000000000000002 +#define EFI_FILE_MODE_CREATE	0x8000000000000000 +  #define EFI_INVALID_TABLE_ADDR		(~0UL)  /* @@ -385,6 +512,13 @@ extern int __init efi_setup_pcdp_console(char *);  #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004  /* + * The type of search to perform when calling boottime->locate_handle + */ +#define EFI_LOCATE_ALL_HANDLES			0 +#define EFI_LOCATE_BY_REGISTER_NOTIFY		1 +#define EFI_LOCATE_BY_PROTOCOL			2 + +/*   * EFI Device Path information   */  #define EFI_DEV_HW			0x01 diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 1d0f7a2ff73..7d4e0356f32 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -5,6 +5,8 @@  #ifdef CONFIG_BLOCK +struct io_cq; +  typedef int (elevator_merge_fn) (struct request_queue *, struct request **,  				 struct bio *); @@ -24,6 +26,8 @@ typedef struct request *(elevator_request_list_fn) (struct request_queue *, stru  typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *);  typedef int (elevator_may_queue_fn) (struct request_queue *, int); +typedef void (elevator_init_icq_fn) (struct io_cq *); +typedef void (elevator_exit_icq_fn) (struct io_cq *);  typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t);  typedef void (elevator_put_req_fn) (struct request *);  typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *); @@ -38,12 +42,6 @@ struct elevator_ops  	elevator_merged_fn *elevator_merged_fn;  	elevator_merge_req_fn *elevator_merge_req_fn;  	elevator_allow_merge_fn *elevator_allow_merge_fn; - -	/* -	 * Used for both plugged list and elevator merging and in the -	 * former case called without queue_lock.  Read comment on top of -	 * attempt_plug_merge() for details. -	 */  	elevator_bio_merged_fn *elevator_bio_merged_fn;  	elevator_dispatch_fn *elevator_dispatch_fn; @@ -56,6 +54,9 @@ struct elevator_ops  	elevator_request_list_fn *elevator_former_req_fn;  	elevator_request_list_fn *elevator_latter_req_fn; +	elevator_init_icq_fn *elevator_init_icq_fn;	/* see iocontext.h */ +	elevator_exit_icq_fn *elevator_exit_icq_fn;	/* ditto */ +  	elevator_set_req_fn *elevator_set_req_fn;  	elevator_put_req_fn *elevator_put_req_fn; @@ -63,7 +64,6 @@ struct elevator_ops  	elevator_init_fn *elevator_init_fn;  	elevator_exit_fn *elevator_exit_fn; -	void (*trim)(struct io_context *);  };  #define ELV_NAME_MAX	(16) @@ -79,11 +79,20 @@ struct elv_fs_entry {   */  struct elevator_type  { -	struct list_head list; +	/* managed by elevator core */ +	struct kmem_cache *icq_cache; + +	/* fields provided by elevator implementation */  	struct elevator_ops ops; +	size_t icq_size;	/* see iocontext.h */ +	size_t icq_align;	/* ditto */  	struct elv_fs_entry *elevator_attrs;  	char elevator_name[ELV_NAME_MAX];  	struct module *elevator_owner; + +	/* managed by elevator core */ +	char icq_cache_name[ELV_NAME_MAX + 5];	/* elvname + "_io_cq" */ +	struct list_head list;  };  /* @@ -91,10 +100,9 @@ struct elevator_type   */  struct elevator_queue  { -	struct elevator_ops *ops; +	struct elevator_type *type;  	void *elevator_data;  	struct kobject kobj; -	struct elevator_type *elevator_type;  	struct mutex sysfs_lock;  	struct hlist_head *hash;  	unsigned int registered:1; @@ -108,7 +116,6 @@ extern void elv_dispatch_add_tail(struct request_queue *, struct request *);  extern void elv_add_request(struct request_queue *, struct request *, int);  extern void __elv_add_request(struct request_queue *, struct request *, int);  extern int elv_merge(struct request_queue *, struct request **, struct bio *); -extern int elv_try_merge(struct request *, struct bio *);  extern void elv_merge_requests(struct request_queue *, struct request *,  			       struct request *);  extern void elv_merged_request(struct request_queue *, struct request *, int); @@ -129,7 +136,7 @@ extern void elv_drain_elevator(struct request_queue *);  /*   * io scheduler registration   */ -extern void elv_register(struct elevator_type *); +extern int elv_register(struct elevator_type *);  extern void elv_unregister(struct elevator_type *);  /* @@ -141,7 +148,7 @@ extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t);  extern int elevator_init(struct request_queue *, char *);  extern void elevator_exit(struct elevator_queue *);  extern int elevator_change(struct request_queue *, const char *); -extern int elv_rq_merge_ok(struct request *, struct bio *); +extern bool elv_rq_merge_ok(struct request *, struct bio *);  /*   * Helper functions. @@ -197,22 +204,5 @@ enum {  	INIT_LIST_HEAD(&(rq)->csd.list);	\  	} while (0) -/* - * io context count accounting - */ -#define elv_ioc_count_mod(name, __val) this_cpu_add(name, __val) -#define elv_ioc_count_inc(name)	this_cpu_inc(name) -#define elv_ioc_count_dec(name)	this_cpu_dec(name) - -#define elv_ioc_count_read(name)				\ -({								\ -	unsigned long __val = 0;				\ -	int __cpu;						\ -	smp_wmb();						\ -	for_each_possible_cpu(__cpu)				\ -		__val += per_cpu(name, __cpu);			\ -	__val;							\ -}) -  #endif /* CONFIG_BLOCK */  #endif diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h index 18bea78fe47..8e2b7bac437 100644 --- a/include/linux/elf-em.h +++ b/include/linux/elf-em.h @@ -33,6 +33,7 @@  #define EM_H8_300	46	/* Renesas H8/300,300H,H8S */  #define EM_MN10300	89	/* Panasonic/MEI MN10300, AM33 */  #define EM_BLACKFIN     106     /* ADI Blackfin Processor */ +#define EM_TI_C6000	140	/* TI C6X DSPs */  #define EM_FRV		0x5441	/* Fujitsu FR-V */  #define EM_AVR32	0x18ad	/* Atmel AVR32 */ diff --git a/include/linux/elf.h b/include/linux/elf.h index 31f0508d7da..999b4f52e8e 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -7,15 +7,6 @@  #include <asm/elf.h>  #endif -struct file; - -#ifndef elf_read_implies_exec -  /* Executables for which elf_read_implies_exec() returns TRUE will -     have the READ_IMPLIES_EXEC personality flag set automatically. -     Override in asm/elf.h as needed.  */ -# define elf_read_implies_exec(ex, have_pt_gnu_stack)	0 -#endif -  /* 32-bit ELF base types. */  typedef __u32	Elf32_Addr;  typedef __u16	Elf32_Half; @@ -414,6 +405,13 @@ typedef struct elf64_note {  } Elf64_Nhdr;  #ifdef __KERNEL__ +#ifndef elf_read_implies_exec +  /* Executables for which elf_read_implies_exec() returns TRUE will +     have the READ_IMPLIES_EXEC personality flag set automatically. +     Override in asm/elf.h as needed.  */ +# define elf_read_implies_exec(ex, have_pt_gnu_stack)	0 +#endif +  #if ELF_CLASS == ELFCLASS32  extern Elf32_Dyn _DYNAMIC []; @@ -437,6 +435,8 @@ extern Elf64_Dyn _DYNAMIC [];  #endif  /* Optional callbacks to write extra ELF notes. */ +struct file; +  #ifndef ARCH_HAVE_EXTRA_ELF_NOTES  static inline int elf_coredump_extra_notes_size(void) { return 0; }  static inline int elf_coredump_extra_notes_write(struct file *file, diff --git a/include/linux/errqueue.h b/include/linux/errqueue.h index 034072cea85..fd0628be45c 100644 --- a/include/linux/errqueue.h +++ b/include/linux/errqueue.h @@ -17,14 +17,15 @@ struct sock_extended_err {  #define SO_EE_ORIGIN_LOCAL	1  #define SO_EE_ORIGIN_ICMP	2  #define SO_EE_ORIGIN_ICMP6	3 -#define SO_EE_ORIGIN_TIMESTAMPING 4 +#define SO_EE_ORIGIN_TXSTATUS	4 +#define SO_EE_ORIGIN_TIMESTAMPING SO_EE_ORIGIN_TXSTATUS  #define SO_EE_OFFENDER(ee)	((struct sockaddr*)((ee)+1))  #ifdef __KERNEL__  #include <net/ip.h> -#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  #include <linux/ipv6.h>  #endif @@ -33,7 +34,7 @@ struct sock_extended_err {  struct sock_exterr_skb {  	union {  		struct inet_skb_parm	h4; -#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  		struct inet6_skb_parm	h6;  #endif  	} header; diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index de33de1e205..da5b2de99ae 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -489,7 +489,10 @@ struct ethtool_rx_flow_spec {   * on return.   *   * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined - * rules on return. + * rules on return.  If @data is non-zero on return then it is the + * size of the rule table, plus the flag %RX_CLS_LOC_SPECIAL if the + * driver supports any special location values.  If that flag is not + * set in @data then special location values should not be used.   *   * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the location of an   * existing rule on entry and @fs contains the rule on return. @@ -501,10 +504,23 @@ struct ethtool_rx_flow_spec {   * must use the second parameter to get_rxnfc() instead of @rule_locs.   *   * For %ETHTOOL_SRXCLSRLINS, @fs specifies the rule to add or update. - * @fs.@location specifies the location to use and must not be ignored. + * @fs.@location either specifies the location to use or is a special + * location value with %RX_CLS_LOC_SPECIAL flag set.  On return, + * @fs.@location is the actual rule location.   *   * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the location of an   * existing rule on entry. + * + * A driver supporting the special location values for + * %ETHTOOL_SRXCLSRLINS may add the rule at any suitable unused + * location, and may remove a rule at a later location (lower + * priority) that matches exactly the same set of flows.  The special + * values are: %RX_CLS_LOC_ANY, selecting any location; + * %RX_CLS_LOC_FIRST, selecting the first suitable location (maximum + * priority); and %RX_CLS_LOC_LAST, selecting the last suitable + * location (minimum priority).  Additional special values may be + * defined in future and drivers must return -%EINVAL for any + * unrecognised value.   */  struct ethtool_rxnfc {  	__u32				cmd; @@ -543,9 +559,15 @@ struct compat_ethtool_rxnfc {  /**   * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection   * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR - * @size: On entry, the array size of the user buffer.  On return from - *	%ETHTOOL_GRXFHINDIR, the array size of the hardware indirection table. + * @size: On entry, the array size of the user buffer, which may be zero. + *	On return from %ETHTOOL_GRXFHINDIR, the array size of the hardware + *	indirection table.   * @ring_index: RX ring/queue index for each hash value + * + * For %ETHTOOL_GRXFHINDIR, a @size of zero means that only the size + * should be returned.  For %ETHTOOL_SRXFHINDIR, a @size of zero means + * the table should be reset to default values.  This last feature + * is not supported by the original implementations.   */  struct ethtool_rxfh_indir {  	__u32	cmd; @@ -724,9 +746,6 @@ enum ethtool_sfeatures_retval_bits {  #include <linux/rculist.h> -/* needed by dev_disable_lro() */ -extern int __ethtool_set_flags(struct net_device *dev, u32 flags); -  extern int __ethtool_get_settings(struct net_device *dev,  				  struct ethtool_cmd *cmd); @@ -750,19 +769,18 @@ struct net_device;  /* Some generic methods drivers may use in their ethtool_ops */  u32 ethtool_op_get_link(struct net_device *dev); -u32 ethtool_op_get_tx_csum(struct net_device *dev); -int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); -int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data); -int ethtool_op_set_tx_ipv6_csum(struct net_device *dev, u32 data); -u32 ethtool_op_get_sg(struct net_device *dev); -int ethtool_op_set_sg(struct net_device *dev, u32 data); -u32 ethtool_op_get_tso(struct net_device *dev); -int ethtool_op_set_tso(struct net_device *dev, u32 data); -u32 ethtool_op_get_ufo(struct net_device *dev); -int ethtool_op_set_ufo(struct net_device *dev, u32 data); -u32 ethtool_op_get_flags(struct net_device *dev); -int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported); -bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported); + +/** + * ethtool_rxfh_indir_default - get default value for RX flow hash indirection + * @index: Index in RX flow hash indirection table + * @n_rx_rings: Number of RX rings to use + * + * This function provides the default policy for RX flow hash indirection. + */ +static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) +{ +	return index % n_rx_rings; +}  /**   * struct ethtool_ops - optional netdev operations @@ -807,22 +825,6 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);   * @get_pauseparam: Report pause parameters   * @set_pauseparam: Set pause parameters.  Returns a negative error code   *	or zero. - * @get_rx_csum: Deprecated in favour of the netdev feature %NETIF_F_RXCSUM. - *	Report whether receive checksums are turned on or off. - * @set_rx_csum: Deprecated in favour of generic netdev features.  Turn - *	receive checksum on or off.  Returns a negative error code or zero. - * @get_tx_csum: Deprecated as redundant. Report whether transmit checksums - *	are turned on or off. - * @set_tx_csum: Deprecated in favour of generic netdev features.  Turn - *	transmit checksums on or off.  Returns a negative error code or zero. - * @get_sg: Deprecated as redundant.  Report whether scatter-gather is - *	enabled.   - * @set_sg: Deprecated in favour of generic netdev features.  Turn - *	scatter-gather on or off. Returns a negative error code or zero. - * @get_tso: Deprecated as redundant.  Report whether TCP segmentation - *	offload is enabled. - * @set_tso: Deprecated in favour of generic netdev features.  Turn TCP - *	segmentation offload on or off.  Returns a negative error code or zero.   * @self_test: Run specified self-tests   * @get_strings: Return a set of strings that describe the requested objects   * @set_phys_id: Identify the physical devices, e.g. by flashing an LED @@ -844,15 +846,6 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);   *	negative error code or zero.   * @complete: Function to be called after any other operation except   *	@begin.  Will be called even if the other operation failed. - * @get_ufo: Deprecated as redundant.  Report whether UDP fragmentation - *	offload is enabled. - * @set_ufo: Deprecated in favour of generic netdev features.  Turn UDP - *	fragmentation offload on or off.  Returns a negative error code or zero. - * @get_flags: Deprecated as redundant.  Report features included in - *	&enum ethtool_flags that are enabled.   - * @set_flags: Deprecated in favour of generic netdev features.  Turn - *	features included in &enum ethtool_flags on or off.  Returns a - *	negative error code or zero.   * @get_priv_flags: Report driver-specific feature flags.   * @set_priv_flags: Set driver-specific feature flags.  Returns a negative   *	error code or zero. @@ -866,11 +859,13 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);   * @reset: Reset (part of) the device, as specified by a bitmask of   *	flags from &enum ethtool_reset_flags.  Returns a negative   *	error code or zero. - * @set_rx_ntuple: Set an RX n-tuple rule.  Returns a negative error code - *	or zero. + * @get_rxfh_indir_size: Get the size of the RX flow hash indirection table. + *	Returns zero if not supported for this specific device.   * @get_rxfh_indir: Get the contents of the RX flow hash indirection table. + *	Will not be called if @get_rxfh_indir_size returns zero.   *	Returns a negative error code or zero.   * @set_rxfh_indir: Set the contents of the RX flow hash indirection table. + *	Will not be called if @get_rxfh_indir_size returns zero.   *	Returns a negative error code or zero.   * @get_channels: Get number of channels.   * @set_channels: Set number of channels.  Returns a negative error code or @@ -917,14 +912,6 @@ struct ethtool_ops {  				  struct ethtool_pauseparam*);  	int	(*set_pauseparam)(struct net_device *,  				  struct ethtool_pauseparam*); -	u32	(*get_rx_csum)(struct net_device *); -	int	(*set_rx_csum)(struct net_device *, u32); -	u32	(*get_tx_csum)(struct net_device *); -	int	(*set_tx_csum)(struct net_device *, u32); -	u32	(*get_sg)(struct net_device *); -	int	(*set_sg)(struct net_device *, u32); -	u32	(*get_tso)(struct net_device *); -	int	(*set_tso)(struct net_device *, u32);  	void	(*self_test)(struct net_device *, struct ethtool_test *, u64 *);  	void	(*get_strings)(struct net_device *, u32 stringset, u8 *);  	int	(*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); @@ -932,10 +919,6 @@ struct ethtool_ops {  				     struct ethtool_stats *, u64 *);  	int	(*begin)(struct net_device *);  	void	(*complete)(struct net_device *); -	u32	(*get_ufo)(struct net_device *); -	int	(*set_ufo)(struct net_device *, u32); -	u32	(*get_flags)(struct net_device *); -	int	(*set_flags)(struct net_device *, u32);  	u32	(*get_priv_flags)(struct net_device *);  	int	(*set_priv_flags)(struct net_device *, u32);  	int	(*get_sset_count)(struct net_device *, int); @@ -944,12 +927,9 @@ struct ethtool_ops {  	int	(*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);  	int	(*flash_device)(struct net_device *, struct ethtool_flash *);  	int	(*reset)(struct net_device *, u32 *); -	int	(*set_rx_ntuple)(struct net_device *, -				 struct ethtool_rx_ntuple *); -	int	(*get_rxfh_indir)(struct net_device *, -				  struct ethtool_rxfh_indir *); -	int	(*set_rxfh_indir)(struct net_device *, -				  const struct ethtool_rxfh_indir *); +	u32	(*get_rxfh_indir_size)(struct net_device *); +	int	(*get_rxfh_indir)(struct net_device *, u32 *); +	int	(*set_rxfh_indir)(struct net_device *, const u32 *);  	void	(*get_channels)(struct net_device *, struct ethtool_channels *);  	int	(*set_channels)(struct net_device *, struct ethtool_channels *);  	int	(*get_dump_flag)(struct net_device *, struct ethtool_dump *); @@ -1173,6 +1153,12 @@ struct ethtool_ops {  #define	RX_CLS_FLOW_DISC	0xffffffffffffffffULL +/* Special RX classification rule insert location values */ +#define RX_CLS_LOC_SPECIAL	0x80000000	/* flag */ +#define RX_CLS_LOC_ANY		0xffffffff +#define RX_CLS_LOC_FIRST	0xfffffffe +#define RX_CLS_LOC_LAST		0xfffffffd +  /* Reset flags */  /* The reset() operation must clear the flags for the components which   * were actually reset.  On successful return, the flags indicate the diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h index f362733186a..657ab55beda 100644 --- a/include/linux/eventpoll.h +++ b/include/linux/eventpoll.h @@ -61,6 +61,7 @@ struct file;  static inline void eventpoll_init_file(struct file *file)  {  	INIT_LIST_HEAD(&file->f_ep_links); +	INIT_LIST_HEAD(&file->f_tfile_llink);  } diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index dec99116a0e..f957085d40e 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -884,7 +884,7 @@ extern int ext3fs_dirhash(const char *name, int len, struct  /* ialloc.c */  extern struct inode * ext3_new_inode (handle_t *, struct inode *, -				      const struct qstr *, int); +				      const struct qstr *, umode_t);  extern void ext3_free_inode (handle_t *, struct inode *);  extern struct inode * ext3_orphan_get (struct super_block *, unsigned long);  extern unsigned long ext3_count_free_inodes (struct super_block *); diff --git a/include/linux/fb.h b/include/linux/fb.h index 1d6836c498d..c18122f4054 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -45,6 +45,7 @@  #define FB_TYPE_INTERLEAVED_PLANES	2	/* Interleaved planes	*/  #define FB_TYPE_TEXT			3	/* Text/attributes	*/  #define FB_TYPE_VGA_PLANES		4	/* EGA/VGA planes	*/ +#define FB_TYPE_FOURCC			5	/* Type identified by a V4L2 FOURCC */  #define FB_AUX_TEXT_MDA		0	/* Monochrome text */  #define FB_AUX_TEXT_CGA		1	/* CGA/EGA/VGA Color text */ @@ -69,6 +70,7 @@  #define FB_VISUAL_PSEUDOCOLOR		3	/* Pseudo color (like atari) */  #define FB_VISUAL_DIRECTCOLOR		4	/* Direct color */  #define FB_VISUAL_STATIC_PSEUDOCOLOR	5	/* Pseudo color readonly */ +#define FB_VISUAL_FOURCC		6	/* Visual identified by a V4L2 FOURCC */  #define FB_ACCEL_NONE		0	/* no hardware accelerator	*/  #define FB_ACCEL_ATARIBLITT	1	/* Atari Blitter		*/ @@ -154,6 +156,8 @@  #define FB_ACCEL_PUV3_UNIGFX	0xa0	/* PKUnity-v3 Unigfx		*/ +#define FB_CAP_FOURCC		1	/* Device supports FOURCC-based formats */ +  struct fb_fix_screeninfo {  	char id[16];			/* identification string eg "TT Builtin" */  	unsigned long smem_start;	/* Start of frame buffer mem */ @@ -171,7 +175,8 @@ struct fb_fix_screeninfo {  	__u32 mmio_len;			/* Length of Memory Mapped I/O  */  	__u32 accel;			/* Indicate to driver which	*/  					/*  specific chip/card we have	*/ -	__u16 reserved[3];		/* Reserved for future compatibility */ +	__u16 capabilities;		/* see FB_CAP_*			*/ +	__u16 reserved[2];		/* Reserved for future compatibility */  };  /* Interpretation of offset for color fields: All offsets are from the right, @@ -246,8 +251,8 @@ struct fb_var_screeninfo {  	__u32 yoffset;			/* resolution			*/  	__u32 bits_per_pixel;		/* guess what			*/ -	__u32 grayscale;		/* != 0 Graylevels instead of colors */ - +	__u32 grayscale;		/* 0 = color, 1 = grayscale,	*/ +					/* >1 = FOURCC			*/  	struct fb_bitfield red;		/* bitfield in fb mem if true color, */  	struct fb_bitfield green;	/* else only length is significant */  	struct fb_bitfield blue; @@ -273,7 +278,8 @@ struct fb_var_screeninfo {  	__u32 sync;			/* see FB_SYNC_*		*/  	__u32 vmode;			/* see FB_VMODE_*		*/  	__u32 rotate;			/* angle we rotate counter clockwise */ -	__u32 reserved[5];		/* Reserved for future compatibility */ +	__u32 colorspace;		/* colorspace for FOURCC-based modes */ +	__u32 reserved[4];		/* Reserved for future compatibility */  };  struct fb_cmap { diff --git a/include/linux/freezer.h b/include/linux/freezer.h index a5386e3ee75..d09af4b67cf 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -5,71 +5,59 @@  #include <linux/sched.h>  #include <linux/wait.h> +#include <linux/atomic.h>  #ifdef CONFIG_FREEZER +extern atomic_t system_freezing_cnt;	/* nr of freezing conds in effect */ +extern bool pm_freezing;		/* PM freezing in effect */ +extern bool pm_nosig_freezing;		/* PM nosig freezing in effect */ +  /*   * Check if a process has been frozen   */ -static inline int frozen(struct task_struct *p) +static inline bool frozen(struct task_struct *p)  {  	return p->flags & PF_FROZEN;  } -/* - * Check if there is a request to freeze a process - */ -static inline int freezing(struct task_struct *p) -{ -	return test_tsk_thread_flag(p, TIF_FREEZE); -} - -/* - * Request that a process be frozen - */ -static inline void set_freeze_flag(struct task_struct *p) -{ -	set_tsk_thread_flag(p, TIF_FREEZE); -} +extern bool freezing_slow_path(struct task_struct *p);  /* - * Sometimes we may need to cancel the previous 'freeze' request + * Check if there is a request to freeze a process   */ -static inline void clear_freeze_flag(struct task_struct *p) -{ -	clear_tsk_thread_flag(p, TIF_FREEZE); -} - -static inline bool should_send_signal(struct task_struct *p) +static inline bool freezing(struct task_struct *p)  { -	return !(p->flags & PF_FREEZER_NOSIG); +	if (likely(!atomic_read(&system_freezing_cnt))) +		return false; +	return freezing_slow_path(p);  }  /* Takes and releases task alloc lock using task_lock() */ -extern int thaw_process(struct task_struct *p); +extern void __thaw_task(struct task_struct *t); -extern void refrigerator(void); +extern bool __refrigerator(bool check_kthr_stop);  extern int freeze_processes(void);  extern int freeze_kernel_threads(void);  extern void thaw_processes(void); +extern void thaw_kernel_threads(void); -static inline int try_to_freeze(void) +static inline bool try_to_freeze(void)  { -	if (freezing(current)) { -		refrigerator(); -		return 1; -	} else -		return 0; +	might_sleep(); +	if (likely(!freezing(current))) +		return false; +	return __refrigerator(false);  } -extern bool freeze_task(struct task_struct *p, bool sig_only); -extern void cancel_freezing(struct task_struct *p); +extern bool freeze_task(struct task_struct *p); +extern bool set_freezable(void);  #ifdef CONFIG_CGROUP_FREEZER -extern int cgroup_freezing_or_frozen(struct task_struct *task); +extern bool cgroup_freezing(struct task_struct *task);  #else /* !CONFIG_CGROUP_FREEZER */ -static inline int cgroup_freezing_or_frozen(struct task_struct *task) +static inline bool cgroup_freezing(struct task_struct *task)  { -	return 0; +	return false;  }  #endif /* !CONFIG_CGROUP_FREEZER */ @@ -80,33 +68,27 @@ static inline int cgroup_freezing_or_frozen(struct task_struct *task)   * appropriately in case the child has exited before the freezing of tasks is   * complete.  However, we don't want kernel threads to be frozen in unexpected   * places, so we allow them to block freeze_processes() instead or to set - * PF_NOFREEZE if needed and PF_FREEZER_SKIP is only set for userland vfork - * parents.  Fortunately, in the ____call_usermodehelper() case the parent won't - * really block freeze_processes(), since ____call_usermodehelper() (the child) - * does a little before exec/exit and it can't be frozen before waking up the - * parent. + * PF_NOFREEZE if needed. Fortunately, in the ____call_usermodehelper() case the + * parent won't really block freeze_processes(), since ____call_usermodehelper() + * (the child) does a little before exec/exit and it can't be frozen before + * waking up the parent.   */ -/* - * If the current task is a user space one, tell the freezer not to count it as - * freezable. - */ + +/* Tell the freezer not to count the current task as freezable. */  static inline void freezer_do_not_count(void)  { -	if (current->mm) -		current->flags |= PF_FREEZER_SKIP; +	current->flags |= PF_FREEZER_SKIP;  }  /* - * If the current task is a user space one, tell the freezer to count it as - * freezable again and try to freeze it. + * Tell the freezer to count the current task as freezable again and try to + * freeze it.   */  static inline void freezer_count(void)  { -	if (current->mm) { -		current->flags &= ~PF_FREEZER_SKIP; -		try_to_freeze(); -	} +	current->flags &= ~PF_FREEZER_SKIP; +	try_to_freeze();  }  /* @@ -118,21 +100,29 @@ static inline int freezer_should_skip(struct task_struct *p)  }  /* - * Tell the freezer that the current task should be frozen by it + * These macros are intended to be used whenever you want allow a task that's + * sleeping in TASK_UNINTERRUPTIBLE or TASK_KILLABLE state to be frozen. Note + * that neither return any clear indication of whether a freeze event happened + * while in this function.   */ -static inline void set_freezable(void) -{ -	current->flags &= ~PF_NOFREEZE; -} -/* - * Tell the freezer that the current task should be frozen by it and that it - * should send a fake signal to the task to freeze it. - */ -static inline void set_freezable_with_signal(void) -{ -	current->flags &= ~(PF_NOFREEZE | PF_FREEZER_NOSIG); -} +/* Like schedule(), but should not block the freezer. */ +#define freezable_schedule()						\ +({									\ +	freezer_do_not_count();						\ +	schedule();							\ +	freezer_count();						\ +}) + +/* Like schedule_timeout_killable(), but should not block the freezer. */ +#define freezable_schedule_timeout_killable(timeout)			\ +({									\ +	long __retval;							\ +	freezer_do_not_count();						\ +	__retval = schedule_timeout_killable(timeout);			\ +	freezer_count();						\ +	__retval;							\ +})  /*   * Freezer-friendly wrappers around wait_event_interruptible(), @@ -152,47 +142,52 @@ static inline void set_freezable_with_signal(void)  #define wait_event_freezable(wq, condition)				\  ({									\  	int __retval;							\ -	do {								\ +	for (;;) {							\  		__retval = wait_event_interruptible(wq, 		\  				(condition) || freezing(current));	\ -		if (__retval && !freezing(current))			\ +		if (__retval || (condition))				\  			break;						\ -		else if (!(condition))					\ -			__retval = -ERESTARTSYS;			\ -	} while (try_to_freeze());					\ +		try_to_freeze();					\ +	}								\  	__retval;							\  }) -  #define wait_event_freezable_timeout(wq, condition, timeout)		\  ({									\  	long __retval = timeout;					\ -	do {								\ +	for (;;) {							\  		__retval = wait_event_interruptible_timeout(wq,		\  				(condition) || freezing(current),	\  				__retval); 				\ -	} while (try_to_freeze());					\ +		if (__retval <= 0 || (condition))			\ +			break;						\ +		try_to_freeze();					\ +	}								\  	__retval;							\  }) +  #else /* !CONFIG_FREEZER */ -static inline int frozen(struct task_struct *p) { return 0; } -static inline int freezing(struct task_struct *p) { return 0; } -static inline void set_freeze_flag(struct task_struct *p) {} -static inline void clear_freeze_flag(struct task_struct *p) {} -static inline int thaw_process(struct task_struct *p) { return 1; } +static inline bool frozen(struct task_struct *p) { return false; } +static inline bool freezing(struct task_struct *p) { return false; } +static inline void __thaw_task(struct task_struct *t) {} -static inline void refrigerator(void) {} +static inline bool __refrigerator(bool check_kthr_stop) { return false; }  static inline int freeze_processes(void) { return -ENOSYS; }  static inline int freeze_kernel_threads(void) { return -ENOSYS; }  static inline void thaw_processes(void) {} +static inline void thaw_kernel_threads(void) {} -static inline int try_to_freeze(void) { return 0; } +static inline bool try_to_freeze(void) { return false; }  static inline void freezer_do_not_count(void) {}  static inline void freezer_count(void) {}  static inline int freezer_should_skip(struct task_struct *p) { return 0; }  static inline void set_freezable(void) {} -static inline void set_freezable_with_signal(void) {} + +#define freezable_schedule()  schedule() + +#define freezable_schedule_timeout_killable(timeout)			\ +	schedule_timeout_killable(timeout)  #define wait_event_freezable(wq, condition)				\  		wait_event_interruptible(wq, condition) diff --git a/include/linux/fs.h b/include/linux/fs.h index 0c4df261af7..386da09f229 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -319,6 +319,7 @@ struct inodes_stat_t {  #define BLKPBSZGET _IO(0x12,123)  #define BLKDISCARDZEROES _IO(0x12,124)  #define BLKSECDISCARD _IO(0x12,125) +#define BLKROTATIONAL _IO(0x12,126)  #define BMAP_IOCTL 1		/* obsolete - kept for compatibility */  #define FIBMAP	   _IO(0x00,1)	/* bmap access */ @@ -393,8 +394,9 @@ struct inodes_stat_t {  #include <linux/semaphore.h>  #include <linux/fiemap.h>  #include <linux/rculist_bl.h> -#include <linux/shrinker.h>  #include <linux/atomic.h> +#include <linux/shrinker.h> +#include <linux/migrate_mode.h>  #include <asm/byteorder.h> @@ -609,9 +611,12 @@ struct address_space_operations {  			loff_t offset, unsigned long nr_segs);  	int (*get_xip_mem)(struct address_space *, pgoff_t, int,  						void **, unsigned long *); -	/* migrate the contents of a page to the specified target */ +	/* +	 * migrate the contents of a page to the specified target. If sync +	 * is false, it must not block. +	 */  	int (*migratepage) (struct address_space *, -			struct page *, struct page *); +			struct page *, struct page *, enum migrate_mode);  	int (*launder_page) (struct page *);  	int (*is_partially_uptodate) (struct page *, read_descriptor_t *,  					unsigned long); @@ -656,6 +661,7 @@ struct address_space {  	 * must be enforced here for CRIS, to let the least significant bit  	 * of struct page's "mapping" pointer be used for PAGE_MAPPING_ANON.  	 */ +struct request_queue;  struct block_device {  	dev_t			bd_dev;  /* not a kdev_t - it's a search key */ @@ -678,6 +684,7 @@ struct block_device {  	unsigned		bd_part_count;  	int			bd_invalidated;  	struct gendisk *	bd_disk; +	struct request_queue *  bd_queue;  	struct list_head	bd_list;  	/*  	 * Private data.  You must have bd_claim'ed the block_device @@ -1001,6 +1008,7 @@ struct file {  #ifdef CONFIG_EPOLL  	/* Used by fs/eventpoll.c to link all the hooks to this file */  	struct list_head	f_ep_links; +	struct list_head	f_tfile_llink;  #endif /* #ifdef CONFIG_EPOLL */  	struct address_space	*f_mapping;  #ifdef CONFIG_DEBUG_WRITECOUNT @@ -1428,6 +1436,7 @@ struct super_block {  #else  	struct list_head	s_files;  #endif +	struct list_head	s_mounts;	/* list of mounts; _not_ for fs use */  	/* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */  	struct list_head	s_dentry_lru;	/* unused dentry lru */  	int			s_nr_dentry_unused;	/* # of dentry on lru */ @@ -1440,7 +1449,7 @@ struct super_block {  	struct block_device	*s_bdev;  	struct backing_dev_info *s_bdi;  	struct mtd_info		*s_mtd; -	struct list_head	s_instances; +	struct hlist_node	s_instances;  	struct quota_info	s_dquot;	/* Diskquota specific options */  	int			s_frozen; @@ -1481,6 +1490,12 @@ struct super_block {  	int cleancache_poolid;  	struct shrinker s_shrink;	/* per-sb shrinker handle */ + +	/* Number of inodes with nlink == 0 but still referenced */ +	atomic_long_t s_remove_count; + +	/* Being remounted read-only */ +	int s_readonly_remount;  };  /* superblock cache pruning functions */ @@ -1516,9 +1531,9 @@ extern void unlock_super(struct super_block *);  /*   * VFS helper functions..   */ -extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *); -extern int vfs_mkdir(struct inode *, struct dentry *, int); -extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t); +extern int vfs_create(struct inode *, struct dentry *, umode_t, struct nameidata *); +extern int vfs_mkdir(struct inode *, struct dentry *, umode_t); +extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);  extern int vfs_symlink(struct inode *, struct dentry *, const char *);  extern int vfs_link(struct dentry *, struct inode *, struct dentry *);  extern int vfs_rmdir(struct inode *, struct dentry *); @@ -1534,7 +1549,7 @@ extern void dentry_unhash(struct dentry *dentry);   * VFS file helper functions.   */  extern void inode_init_owner(struct inode *inode, const struct inode *dir, -			mode_t mode); +			umode_t mode);  /*   * VFS FS_IOC_FIEMAP helper definitions.   */ @@ -1619,13 +1634,13 @@ struct inode_operations {  	int (*readlink) (struct dentry *, char __user *,int);  	void (*put_link) (struct dentry *, struct nameidata *, void *); -	int (*create) (struct inode *,struct dentry *,int, struct nameidata *); +	int (*create) (struct inode *,struct dentry *,umode_t,struct nameidata *);  	int (*link) (struct dentry *,struct inode *,struct dentry *);  	int (*unlink) (struct inode *,struct dentry *);  	int (*symlink) (struct inode *,struct dentry *,const char *); -	int (*mkdir) (struct inode *,struct dentry *,int); +	int (*mkdir) (struct inode *,struct dentry *,umode_t);  	int (*rmdir) (struct inode *,struct dentry *); -	int (*mknod) (struct inode *,struct dentry *,int,dev_t); +	int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);  	int (*rename) (struct inode *, struct dentry *,  			struct inode *, struct dentry *);  	void (*truncate) (struct inode *); @@ -1672,10 +1687,10 @@ struct super_operations {  	int (*remount_fs) (struct super_block *, int *, char *);  	void (*umount_begin) (struct super_block *); -	int (*show_options)(struct seq_file *, struct vfsmount *); -	int (*show_devname)(struct seq_file *, struct vfsmount *); -	int (*show_path)(struct seq_file *, struct vfsmount *); -	int (*show_stats)(struct seq_file *, struct vfsmount *); +	int (*show_options)(struct seq_file *, struct dentry *); +	int (*show_devname)(struct seq_file *, struct dentry *); +	int (*show_path)(struct seq_file *, struct dentry *); +	int (*show_stats)(struct seq_file *, struct dentry *);  #ifdef CONFIG_QUOTA  	ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);  	ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); @@ -1764,31 +1779,10 @@ static inline void mark_inode_dirty_sync(struct inode *inode)  	__mark_inode_dirty(inode, I_DIRTY_SYNC);  } -/** - * set_nlink - directly set an inode's link count - * @inode: inode - * @nlink: new nlink (should be non-zero) - * - * This is a low-level filesystem helper to replace any - * direct filesystem manipulation of i_nlink. - */ -static inline void set_nlink(struct inode *inode, unsigned int nlink) -{ -	inode->__i_nlink = nlink; -} - -/** - * inc_nlink - directly increment an inode's link count - * @inode: inode - * - * This is a low-level filesystem helper to replace any - * direct filesystem manipulation of i_nlink.  Currently, - * it is only here for parity with dec_nlink(). - */ -static inline void inc_nlink(struct inode *inode) -{ -	inode->__i_nlink++; -} +extern void inc_nlink(struct inode *inode); +extern void drop_nlink(struct inode *inode); +extern void clear_nlink(struct inode *inode); +extern void set_nlink(struct inode *inode, unsigned int nlink);  static inline void inode_inc_link_count(struct inode *inode)  { @@ -1796,35 +1790,6 @@ static inline void inode_inc_link_count(struct inode *inode)  	mark_inode_dirty(inode);  } -/** - * drop_nlink - directly drop an inode's link count - * @inode: inode - * - * This is a low-level filesystem helper to replace any - * direct filesystem manipulation of i_nlink.  In cases - * where we are attempting to track writes to the - * filesystem, a decrement to zero means an imminent - * write when the file is truncated and actually unlinked - * on the filesystem. - */ -static inline void drop_nlink(struct inode *inode) -{ -	inode->__i_nlink--; -} - -/** - * clear_nlink - directly zero an inode's link count - * @inode: inode - * - * This is a low-level filesystem helper to replace any - * direct filesystem manipulation of i_nlink.  See - * drop_nlink() for why we care about i_nlink hitting zero. - */ -static inline void clear_nlink(struct inode *inode) -{ -	inode->__i_nlink = 0; -} -  static inline void inode_dec_link_count(struct inode *inode)  {  	drop_nlink(inode); @@ -1864,7 +1829,7 @@ struct file_system_type {  	void (*kill_sb) (struct super_block *);  	struct module *owner;  	struct file_system_type * next; -	struct list_head fs_supers; +	struct hlist_head fs_supers;  	struct lock_class_key s_lock_key;  	struct lock_class_key s_umount_key; @@ -1886,6 +1851,7 @@ extern struct dentry *mount_single(struct file_system_type *fs_type,  extern struct dentry *mount_nodev(struct file_system_type *fs_type,  	int flags, void *data,  	int (*fill_super)(struct super_block *, void *, int)); +extern struct dentry *mount_subtree(struct vfsmount *mnt, const char *path);  void generic_shutdown_super(struct super_block *sb);  void kill_block_super(struct super_block *sb);  void kill_anon_super(struct super_block *sb); @@ -1938,9 +1904,10 @@ extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,  extern int vfs_statfs(struct path *, struct kstatfs *);  extern int user_statfs(const char __user *, struct kstatfs *);  extern int fd_statfs(int, struct kstatfs *); -extern int statfs_by_dentry(struct dentry *, struct kstatfs *); +extern int vfs_ustat(dev_t, struct kstatfs *);  extern int freeze_super(struct super_block *super);  extern int thaw_super(struct super_block *super); +extern bool our_mnt(struct vfsmount *mnt);  extern int current_umask(void); @@ -2052,8 +2019,8 @@ extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,  extern int do_fallocate(struct file *file, int mode, loff_t offset,  			loff_t len);  extern long do_sys_open(int dfd, const char __user *filename, int flags, -			int mode); -extern struct file *filp_open(const char *, int, int); +			umode_t mode); +extern struct file *filp_open(const char *, int, umode_t);  extern struct file *file_open_root(struct dentry *, struct vfsmount *,  				   const char *, int);  extern struct file * dentry_open(struct dentry *, struct vfsmount *, int, @@ -2090,6 +2057,7 @@ extern void bd_forget(struct inode *inode);  extern void bdput(struct block_device *);  extern void invalidate_bdev(struct block_device *);  extern int sync_blockdev(struct block_device *bdev); +extern void kill_bdev(struct block_device *);  extern struct super_block *freeze_bdev(struct block_device *);  extern void emergency_thaw_all(void);  extern int thaw_bdev(struct block_device *bdev, struct super_block *sb); @@ -2097,6 +2065,7 @@ extern int fsync_bdev(struct block_device *);  #else  static inline void bd_forget(struct inode *inode) {}  static inline int sync_blockdev(struct block_device *bdev) { return 0; } +static inline void kill_bdev(struct block_device *bdev) {}  static inline void invalidate_bdev(struct block_device *bdev) {}  static inline struct super_block *freeze_bdev(struct block_device *sb) @@ -2189,8 +2158,6 @@ extern const struct file_operations read_pipefifo_fops;  extern const struct file_operations write_pipefifo_fops;  extern const struct file_operations rdwr_pipefifo_fops; -extern int fs_may_remount_ro(struct super_block *); -  #ifdef CONFIG_BLOCK  /*   * return READ, READA, or WRITE @@ -2413,6 +2380,7 @@ extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,  				unsigned long nr_segs, loff_t pos);  extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end,  			int datasync); +extern void block_sync_page(struct page *page);  /* fs/splice.c */  extern ssize_t generic_file_splice_read(struct file *, loff_t *, @@ -2529,7 +2497,6 @@ extern void put_filesystem(struct file_system_type *fs);  extern struct file_system_type *get_fs_type(const char *name);  extern struct super_block *get_super(struct block_device *);  extern struct super_block *get_active_super(struct block_device *bdev); -extern struct super_block *user_get_super(dev_t);  extern void drop_super(struct super_block *sb);  extern void iterate_supers(void (*)(struct super_block *, void *), void *);  extern void iterate_supers_type(struct file_system_type *, @@ -2577,7 +2544,8 @@ extern int generic_check_addressable(unsigned, u64);  #ifdef CONFIG_MIGRATION  extern int buffer_migrate_page(struct address_space *, -				struct page *, struct page *); +				struct page *, struct page *, +				enum migrate_mode);  #else  #define buffer_migrate_page NULL  #endif @@ -2588,7 +2556,7 @@ extern void setattr_copy(struct inode *inode, const struct iattr *attr);  extern void file_update_time(struct file *file); -extern int generic_show_options(struct seq_file *m, struct vfsmount *mnt); +extern int generic_show_options(struct seq_file *m, struct dentry *root);  extern void save_mount_options(struct super_block *sb, char *options);  extern void replace_mount_options(struct super_block *sb, char *options); @@ -2689,7 +2657,7 @@ int __init get_filesystem_list(char *buf);  #define OPEN_FMODE(flag) ((__force fmode_t)(((flag + 1) & O_ACCMODE) | \  					    (flag & __FMODE_NONOTIFY))) -static inline int is_sxid(mode_t mode) +static inline int is_sxid(umode_t mode)  {  	return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP));  } diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 26eafcef75b..028e26f0bf0 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -133,6 +133,8 @@ struct ftrace_func_command {  int ftrace_arch_code_modify_prepare(void);  int ftrace_arch_code_modify_post_process(void); +void ftrace_bug(int err, unsigned long ip); +  struct seq_file;  struct ftrace_probe_ops { @@ -161,7 +163,6 @@ extern int ftrace_text_reserved(void *start, void *end);  enum {  	FTRACE_FL_ENABLED	= (1 << 30), -	FTRACE_FL_FREE		= (1 << 31),  };  #define FTRACE_FL_MASK		(0x3UL << 30) @@ -172,10 +173,7 @@ struct dyn_ftrace {  		unsigned long		ip; /* address of mcount call-site */  		struct dyn_ftrace	*freelist;  	}; -	union { -		unsigned long		flags; -		struct dyn_ftrace	*newlist; -	}; +	unsigned long		flags;  	struct dyn_arch_ftrace		arch;  }; @@ -190,6 +188,56 @@ void ftrace_set_global_notrace(unsigned char *buf, int len, int reset);  int register_ftrace_command(struct ftrace_func_command *cmd);  int unregister_ftrace_command(struct ftrace_func_command *cmd); +enum { +	FTRACE_UPDATE_CALLS		= (1 << 0), +	FTRACE_DISABLE_CALLS		= (1 << 1), +	FTRACE_UPDATE_TRACE_FUNC	= (1 << 2), +	FTRACE_START_FUNC_RET		= (1 << 3), +	FTRACE_STOP_FUNC_RET		= (1 << 4), +}; + +enum { +	FTRACE_UPDATE_IGNORE, +	FTRACE_UPDATE_MAKE_CALL, +	FTRACE_UPDATE_MAKE_NOP, +}; + +enum { +	FTRACE_ITER_FILTER	= (1 << 0), +	FTRACE_ITER_NOTRACE	= (1 << 1), +	FTRACE_ITER_PRINTALL	= (1 << 2), +	FTRACE_ITER_DO_HASH	= (1 << 3), +	FTRACE_ITER_HASH	= (1 << 4), +	FTRACE_ITER_ENABLED	= (1 << 5), +}; + +void arch_ftrace_update_code(int command); + +struct ftrace_rec_iter; + +struct ftrace_rec_iter *ftrace_rec_iter_start(void); +struct ftrace_rec_iter *ftrace_rec_iter_next(struct ftrace_rec_iter *iter); +struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter); + +int ftrace_update_record(struct dyn_ftrace *rec, int enable); +int ftrace_test_record(struct dyn_ftrace *rec, int enable); +void ftrace_run_stop_machine(int command); +int ftrace_location(unsigned long ip); + +extern ftrace_func_t ftrace_trace_function; + +int ftrace_regex_open(struct ftrace_ops *ops, int flag, +		  struct inode *inode, struct file *file); +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 origin); +int ftrace_regex_release(struct inode *inode, struct file *file); + +void __init +ftrace_set_early_filter(struct ftrace_ops *ops, char *buf, int enable); +  /* defined in arch */  extern int ftrace_ip_converted(unsigned long ip);  extern int ftrace_dyn_arch_init(void *data); @@ -284,6 +332,25 @@ static inline int ftrace_text_reserved(void *start, void *end)  {  	return 0;  } + +/* + * Again users of functions that have ftrace_ops may not + * have them defined when ftrace is not enabled, but these + * functions may still be called. Use a macro instead of inline. + */ +#define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; }) +#define ftrace_set_early_filter(ops, buf, enable) do { } while (0) + +static inline ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf, +			    size_t cnt, loff_t *ppos) { return -ENODEV; } +static inline ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf, +			     size_t cnt, loff_t *ppos) { return -ENODEV; } +static inline loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin) +{ +	return -ENODEV; +} +static inline int +ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }  #endif /* CONFIG_DYNAMIC_FTRACE */  /* totally disable ftrace - can not re-enable after this */ diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 96efa6794ea..c3da42dd22b 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h @@ -172,6 +172,7 @@ enum {  	TRACE_EVENT_FL_FILTERED_BIT,  	TRACE_EVENT_FL_RECORDED_CMD_BIT,  	TRACE_EVENT_FL_CAP_ANY_BIT, +	TRACE_EVENT_FL_NO_SET_FILTER_BIT,  };  enum { @@ -179,6 +180,7 @@ enum {  	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),  };  struct ftrace_event_call { diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 464cff52686..8ba2c9460b2 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h @@ -50,6 +50,10 @@   *   * 7.17   *  - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK + * + * 7.18 + *  - add FUSE_IOCTL_DIR flag + *  - add FUSE_NOTIFY_DELETE   */  #ifndef _LINUX_FUSE_H @@ -81,7 +85,7 @@  #define FUSE_KERNEL_VERSION 7  /** Minor version number of this interface */ -#define FUSE_KERNEL_MINOR_VERSION 17 +#define FUSE_KERNEL_MINOR_VERSION 18  /** The node ID of the root inode */  #define FUSE_ROOT_ID 1 @@ -214,6 +218,7 @@ struct fuse_file_lock {   * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed   * FUSE_IOCTL_RETRY: retry with new iovecs   * FUSE_IOCTL_32BIT: 32bit ioctl + * FUSE_IOCTL_DIR: is a directory   *   * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs   */ @@ -221,6 +226,7 @@ struct fuse_file_lock {  #define FUSE_IOCTL_UNRESTRICTED	(1 << 1)  #define FUSE_IOCTL_RETRY	(1 << 2)  #define FUSE_IOCTL_32BIT	(1 << 3) +#define FUSE_IOCTL_DIR		(1 << 4)  #define FUSE_IOCTL_MAX_IOV	256 @@ -283,6 +289,7 @@ enum fuse_notify_code {  	FUSE_NOTIFY_INVAL_ENTRY = 3,  	FUSE_NOTIFY_STORE = 4,  	FUSE_NOTIFY_RETRIEVE = 5, +	FUSE_NOTIFY_DELETE = 6,  	FUSE_NOTIFY_CODE_MAX,  }; @@ -606,6 +613,13 @@ struct fuse_notify_inval_entry_out {  	__u32	padding;  }; +struct fuse_notify_delete_out { +	__u64	parent; +	__u64	child; +	__u32	namelen; +	__u32	padding; +}; +  struct fuse_notify_store_out {  	__u64	nodeid;  	__u64	offset; diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h index 61549b26ad6..73c28dea10a 100644 --- a/include/linux/genetlink.h +++ b/include/linux/genetlink.h @@ -85,6 +85,30 @@ enum {  /* All generic netlink requests are serialized by a global lock.  */  extern void genl_lock(void);  extern void genl_unlock(void); +#ifdef CONFIG_PROVE_LOCKING +extern int lockdep_genl_is_held(void); +#endif + +/** + * rcu_dereference_genl - rcu_dereference with debug checking + * @p: The pointer to read, prior to dereferencing + * + * Do an rcu_dereference(p), but check caller either holds rcu_read_lock() + * or genl mutex. Note : Please prefer genl_dereference() or rcu_dereference() + */ +#define rcu_dereference_genl(p)					\ +	rcu_dereference_check(p, lockdep_genl_is_held()) + +/** + * genl_dereference - fetch RCU pointer when updates are prevented by genl mutex + * @p: The pointer to read, prior to dereferencing + * + * Return the value of the specified RCU-protected pointer, but omit + * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because + * caller holds genl mutex. + */ +#define genl_dereference(p)					\ +	rcu_dereference_protected(p, lockdep_genl_is_held())  #endif /* __KERNEL__ */ diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 9de31bc98c8..fe23ee76858 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -21,8 +21,6 @@  #define dev_to_part(device)	container_of((device), struct hd_struct, __dev)  #define disk_to_dev(disk)	(&(disk)->part0.__dev)  #define part_to_dev(part)	(&((part)->__dev)) -#define alias_name(disk)	((disk)->alias ? (disk)->alias : \ -						 (disk)->disk_name)  extern struct device_type part_type;  extern struct kobject *block_depr; @@ -60,7 +58,6 @@ enum {  #define DISK_MAX_PARTS			256  #define DISK_NAME_LEN			32 -#define ALIAS_LEN			256  #include <linux/major.h>  #include <linux/device.h> @@ -166,8 +163,7 @@ struct gendisk {                                           * disks that can't be partitioned. */  	char disk_name[DISK_NAME_LEN];	/* name of major driver */ -	char *alias;			/* alias name of disk */ -	char *(*devnode)(struct gendisk *gd, mode_t *mode); +	char *(*devnode)(struct gendisk *gd, umode_t *mode);  	unsigned int events;		/* supported events */  	unsigned int async_events;	/* async events, subset of all */ diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 3a76faf6a3e..581e74b7df9 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -36,6 +36,7 @@ struct vm_area_struct;  #endif  #define ___GFP_NO_KSWAPD	0x400000u  #define ___GFP_OTHER_NODE	0x800000u +#define ___GFP_WRITE		0x1000000u  /*   * GFP bitmasks.. @@ -85,6 +86,7 @@ struct vm_area_struct;  #define __GFP_NO_KSWAPD	((__force gfp_t)___GFP_NO_KSWAPD)  #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */ +#define __GFP_WRITE	((__force gfp_t)___GFP_WRITE)	/* Allocator intends to dirty page */  /*   * This may seem redundant, but it's a way of annotating false positives vs. @@ -92,7 +94,7 @@ struct vm_area_struct;   */  #define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK) -#define __GFP_BITS_SHIFT 24	/* Room for N __GFP_FOO bits */ +#define __GFP_BITS_SHIFT 25	/* Room for N __GFP_FOO bits */  #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))  /* This equals 0, but use constants in case they ever change */ @@ -313,7 +315,7 @@ static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,  static inline struct page *alloc_pages_exact_node(int nid, gfp_t gfp_mask,  						unsigned int order)  { -	VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); +	VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES || !node_online(nid));  	return __alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));  } @@ -358,6 +360,7 @@ void *alloc_pages_exact_nid(int nid, size_t size, gfp_t gfp_mask);  extern void __free_pages(struct page *page, unsigned int order);  extern void free_pages(unsigned long addr, unsigned int order);  extern void free_hot_cold_page(struct page *page, int cold); +extern void free_hot_cold_page_list(struct list_head *list, int cold);  #define __free_page(page) __free_pages((page), 0)  #define free_page(addr) free_pages((addr), 0) @@ -367,9 +370,25 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp);  void drain_all_pages(void);  void drain_local_pages(void *dummy); +/* + * gfp_allowed_mask is set to GFP_BOOT_MASK during early boot to restrict what + * GFP flags are used before interrupts are enabled. Once interrupts are + * enabled, it is set to __GFP_BITS_MASK while the system is running. During + * hibernation, it is used by PM to avoid I/O during memory allocation while + * devices are suspended. + */  extern gfp_t gfp_allowed_mask;  extern void pm_restrict_gfp_mask(void);  extern void pm_restore_gfp_mask(void); +#ifdef CONFIG_PM_SLEEP +extern bool pm_suspended_storage(void); +#else +static inline bool pm_suspended_storage(void) +{ +	return false; +} +#endif /* CONFIG_PM_SLEEP */ +  #endif /* __LINUX_GFP_H */ diff --git a/include/linux/gfs2_ondisk.h b/include/linux/gfs2_ondisk.h index 4f4462974c1..b148087f49a 100644 --- a/include/linux/gfs2_ondisk.h +++ b/include/linux/gfs2_ondisk.h @@ -22,6 +22,8 @@  #define GFS2_LIVE_LOCK		1  #define GFS2_TRANS_LOCK		2  #define GFS2_RENAME_LOCK	3 +#define GFS2_CONTROL_LOCK	4 +#define GFS2_MOUNTED_LOCK	5  /* Format numbers for various metadata types */ diff --git a/include/linux/gpio-pxa.h b/include/linux/gpio-pxa.h new file mode 100644 index 00000000000..05071ee34c3 --- /dev/null +++ b/include/linux/gpio-pxa.h @@ -0,0 +1,16 @@ +#ifndef __GPIO_PXA_H +#define __GPIO_PXA_H + +#define GPIO_bit(x)	(1 << ((x) & 0x1f)) + +#define gpio_to_bank(gpio)	((gpio) >> 5) + +/* NOTE: some PXAs have fewer on-chip GPIOs (like PXA255, with 85). + * Those cases currently cause holes in the GPIO number space, the + * actual number of the last GPIO is recorded by 'pxa_last_gpio'. + */ +extern int pxa_last_gpio; + +extern int pxa_irq_to_gpio(int irq); + +#endif /* __GPIO_PXA_H */ diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index b5ca4b2c08e..004ff33ab38 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -1,6 +1,8 @@  #ifndef _GPIO_KEYS_H  #define _GPIO_KEYS_H +struct device; +  struct gpio_keys_button {  	/* Configuration parameters */  	unsigned int code;	/* input event code (KEY_*, SW_*) */ diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index f743883f769..bb7f3097185 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -139,20 +139,7 @@ static inline void account_system_vtime(struct task_struct *tsk)  extern void account_system_vtime(struct task_struct *tsk);  #endif -#if defined(CONFIG_NO_HZ)  #if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) -extern void rcu_enter_nohz(void); -extern void rcu_exit_nohz(void); - -static inline void rcu_irq_enter(void) -{ -	rcu_exit_nohz(); -} - -static inline void rcu_irq_exit(void) -{ -	rcu_enter_nohz(); -}  static inline void rcu_nmi_enter(void)  { @@ -163,17 +150,9 @@ static inline void rcu_nmi_exit(void)  }  #else -extern void rcu_irq_enter(void); -extern void rcu_irq_exit(void);  extern void rcu_nmi_enter(void);  extern void rcu_nmi_exit(void);  #endif -#else -# define rcu_irq_enter() do { } while (0) -# define rcu_irq_exit() do { } while (0) -# define rcu_nmi_enter() do { } while (0) -# define rcu_nmi_exit() do { } while (0) -#endif /* #if defined(CONFIG_NO_HZ) */  /*   * It is safe to do non-atomic ops on ->hardirq_context, diff --git a/include/linux/hid.h b/include/linux/hid.h index c235e4e8767..3a95da60fd3 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -72,6 +72,7 @@  #include <linux/workqueue.h>  #include <linux/input.h>  #include <linux/semaphore.h> +#include <linux/power_supply.h>  /*   * We parse each description item into this structure. Short items data @@ -190,6 +191,7 @@ struct hid_item {  #define HID_UP_UNDEFINED	0x00000000  #define HID_UP_GENDESK		0x00010000  #define HID_UP_SIMULATION	0x00020000 +#define HID_UP_GENDEVCTRLS	0x00060000  #define HID_UP_KEYBOARD		0x00070000  #define HID_UP_LED		0x00080000  #define HID_UP_BUTTON		0x00090000 @@ -239,6 +241,8 @@ struct hid_item {  #define HID_GD_RIGHT		0x00010092  #define HID_GD_LEFT		0x00010093 +#define HID_DC_BATTERYSTRENGTH	0x00060020 +  #define HID_DG_DIGITIZER	0x000d0001  #define HID_DG_PEN		0x000d0002  #define HID_DG_LIGHTPEN		0x000d0003 @@ -482,6 +486,19 @@ struct hid_device {							/* device report descriptor */  	struct hid_driver *driver;  	struct hid_ll_driver *ll_driver; +#ifdef CONFIG_HID_BATTERY_STRENGTH +	/* +	 * Power supply information for HID devices which report +	 * battery strength. power_supply is registered iff +	 * battery.name is non-NULL. +	 */ +	struct power_supply battery; +	__s32 battery_min; +	__s32 battery_max; +	__s32 battery_report_type; +	__s32 battery_report_id; +#endif +  	unsigned int status;						/* see STAT flags above */  	unsigned claimed;						/* Claimed by hidinput, hiddev? */  	unsigned quirks;						/* Various quirks the device can pull on us */ @@ -712,6 +729,8 @@ extern void hidinput_disconnect(struct hid_device *);  int hid_set_field(struct hid_field *, unsigned, __s32);  int hid_input_report(struct hid_device *, int type, u8 *, int, int);  int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field); +struct hid_field *hidinput_get_led_field(struct hid_device *hid); +unsigned int hidinput_count_leds(struct hid_device *hid);  void hid_output_report(struct hid_report *report, __u8 *data);  struct hid_device *hid_allocate_device(void);  struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); @@ -719,6 +738,8 @@ int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size);  int hid_check_keys_pressed(struct hid_device *hid);  int hid_connect(struct hid_device *hid, unsigned int connect_mask);  void hid_disconnect(struct hid_device *hid); +const struct hid_device_id *hid_match_id(struct hid_device *hdev, +					 const struct hid_device_id *id);  /**   * hid_map_usage - map usage input bits diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index a9ace9c3250..1b921299abc 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -18,7 +18,7 @@ extern struct page *follow_trans_huge_pmd(struct mm_struct *mm,  					  unsigned int flags);  extern int zap_huge_pmd(struct mmu_gather *tlb,  			struct vm_area_struct *vma, -			pmd_t *pmd); +			pmd_t *pmd, unsigned long addr);  extern int mincore_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,  			unsigned long addr, unsigned long end,  			unsigned char *vec); diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 19644e0016b..d9d6c868b86 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -110,11 +110,6 @@ static inline void copy_huge_page(struct page *dst, struct page *src)  #define hugetlb_change_protection(vma, address, end, newprot) -#ifndef HPAGE_MASK -#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */ -#define HPAGE_SIZE	PAGE_SIZE -#endif -  #endif /* !CONFIG_HUGETLB_PAGE */  #define HUGETLB_ANON_FILE "anon_hugepage" diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h index 08a2fee4065..aad6bd4b3ef 100644 --- a/include/linux/hwspinlock.h +++ b/include/linux/hwspinlock.h @@ -118,7 +118,6 @@ int __hwspin_trylock(struct hwspinlock *hwlock, int mode, unsigned long *flags)  static inline  void __hwspin_unlock(struct hwspinlock *hwlock, int mode, unsigned long *flags)  { -	return 0;  }  static inline int hwspin_lock_get_id(struct hwspinlock *hwlock) diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 12ec328481d..0ae065a5fcb 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -35,7 +35,7 @@  #include <linux/mod_devicetable.h> -#define MAX_PAGE_BUFFER_COUNT				16 +#define MAX_PAGE_BUFFER_COUNT				19  #define MAX_MULTIPAGE_BUFFER_COUNT			32 /* 128K */  #pragma pack(push, 1) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index a81bf6d23b3..8e25a9167f1 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -432,9 +432,6 @@ void i2c_unlock_adapter(struct i2c_adapter *);  /* Internal numbers to terminate lists */  #define I2C_CLIENT_END		0xfffeU -/* The numbers to use to set I2C bus address */ -#define ANY_I2C_BUS		0xffff -  /* Construct an I2C_CLIENT_END-terminated array of i2c addresses */  #define I2C_ADDRS(addr, addrs...) \  	((const unsigned short []){ addr, ## addrs, I2C_CLIENT_END }) @@ -485,6 +482,19 @@ static inline int i2c_adapter_id(struct i2c_adapter *adap)  {  	return adap->nr;  } + +/** + * module_i2c_driver() - Helper macro for registering a I2C driver + * @__i2c_driver: i2c_driver struct + * + * Helper macro for I2C drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_i2c_driver(__i2c_driver) \ +	module_driver(__i2c_driver, i2c_add_driver, \ +			i2c_del_driver) +  #endif /* I2C */  #endif /* __KERNEL__ */ diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 114c0f6fc63..78d3465251d 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -652,10 +652,12 @@ struct twl4030_power_data {  	unsigned num;  	struct twl4030_resconfig *resource_config;  #define TWL4030_RESCONFIG_UNDEF	((u8)-1) +	bool use_poweroff;	/* Board is wired for TWL poweroff */  };  extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts);  extern int twl4030_remove_script(u8 flags); +extern void twl4030_power_off(void);  struct twl4030_codec_data {  	unsigned int digimic_delay; /* in ms */ diff --git a/include/linux/ide.h b/include/linux/ide.h index 42557851b12..501370b61ee 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -920,7 +920,7 @@ __IDE_PROC_DEVSET(_name, _min, _max, NULL, NULL)  typedef struct {  	const char	*name; -	mode_t		mode; +	umode_t		mode;  	const struct file_operations *proc_fops;  } ide_proc_entry_t; diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 48363c3c40f..210e2c32553 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -128,6 +128,7 @@  #define IEEE80211_QOS_CTL_ACK_POLICY_NOACK	0x0020  #define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL	0x0040  #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK	0x0060 +#define IEEE80211_QOS_CTL_ACK_POLICY_MASK	0x0060  /* A-MSDU 802.11n */  #define IEEE80211_QOS_CTL_A_MSDU_PRESENT	0x0080  /* Mesh Control 802.11s */ @@ -543,6 +544,15 @@ static inline int ieee80211_is_qos_nullfunc(__le16 fc)  	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);  } +/** + * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set + * @seq_ctrl: frame sequence control bytes in little-endian byteorder + */ +static inline int ieee80211_is_first_frag(__le16 seq_ctrl) +{ +	return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0; +} +  struct ieee80211s_hdr {  	u8 flags;  	u8 ttl; @@ -770,6 +780,9 @@ struct ieee80211_mgmt {  	} u;  } __attribute__ ((packed)); +/* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */ +#define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127 +  /* mgmt header + 1 byte category code */  #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u) @@ -1552,6 +1565,8 @@ enum ieee80211_sa_query_action {  #define WLAN_CIPHER_SUITE_WEP104	0x000FAC05  #define WLAN_CIPHER_SUITE_AES_CMAC	0x000FAC06 +#define WLAN_CIPHER_SUITE_SMS4		0x00147201 +  /* AKM suite selectors */  #define WLAN_AKM_SUITE_8021X		0x000FAC01  #define WLAN_AKM_SUITE_PSK		0x000FAC02 @@ -1689,6 +1704,23 @@ static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)  }  /** + * ieee80211_is_public_action - check if frame is a public action frame + * @hdr: the frame + * @len: length of the frame + */ +static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr, +					      size_t len) +{ +	struct ieee80211_mgmt *mgmt = (void *)hdr; + +	if (len < IEEE80211_MIN_ACTION_SIZE) +		return false; +	if (!ieee80211_is_action(hdr->frame_control)) +		return false; +	return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC; +} + +/**   * ieee80211_fhss_chan_to_freq - get channel frequency   * @channel: the FHSS channel   * diff --git a/include/linux/if.h b/include/linux/if.h index db20bd4fd16..06b6ef60c82 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -79,6 +79,7 @@  #define IFF_TX_SKB_SHARING	0x10000	/* The interface supports sharing  					 * skbs on transmit */  #define IFF_UNICAST_FLT	0x20000		/* Supports unicast filtering	*/ +#define IFF_TEAM_PORT	0x40000		/* device used as team port */  #define IF_GET_IFACE	0x0001		/* for querying only */  #define IF_GET_PROTO	0x0002 diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index e473003e4bd..56d907a2c80 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h @@ -79,6 +79,7 @@  #define ETH_P_PAE	0x888E		/* Port Access Entity (IEEE 802.1X) */  #define ETH_P_AOE	0x88A2		/* ATA over Ethernet		*/  #define ETH_P_8021AD	0x88A8          /* 802.1ad Service VLAN		*/ +#define ETH_P_802_EX1	0x88B5		/* 802.1 Local Experimental 1.  */  #define ETH_P_TIPC	0x88CA		/* TIPC 			*/  #define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */  #define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */ diff --git a/include/linux/if_team.h b/include/linux/if_team.h new file mode 100644 index 00000000000..58404b0c501 --- /dev/null +++ b/include/linux/if_team.h @@ -0,0 +1,252 @@ +/* + * include/linux/if_team.h - Network team device driver header + * Copyright (c) 2011 Jiri Pirko <jpirko@redhat.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. + */ + +#ifndef _LINUX_IF_TEAM_H_ +#define _LINUX_IF_TEAM_H_ + +#ifdef __KERNEL__ + +struct team_pcpu_stats { +	u64			rx_packets; +	u64			rx_bytes; +	u64			rx_multicast; +	u64			tx_packets; +	u64			tx_bytes; +	struct u64_stats_sync	syncp; +	u32			rx_dropped; +	u32			tx_dropped; +}; + +struct team; + +struct team_port { +	struct net_device *dev; +	struct hlist_node hlist; /* node in hash list */ +	struct list_head list; /* node in ordinary list */ +	struct team *team; +	int index; + +	/* +	 * A place for storing original values of the device before it +	 * become a port. +	 */ +	struct { +		unsigned char dev_addr[MAX_ADDR_LEN]; +		unsigned int mtu; +	} orig; + +	bool linkup; +	u32 speed; +	u8 duplex; + +	/* Custom gennetlink interface related flags */ +	bool changed; +	bool removed; + +	struct rcu_head rcu; +}; + +struct team_mode_ops { +	int (*init)(struct team *team); +	void (*exit)(struct team *team); +	rx_handler_result_t (*receive)(struct team *team, +				       struct team_port *port, +				       struct sk_buff *skb); +	bool (*transmit)(struct team *team, struct sk_buff *skb); +	int (*port_enter)(struct team *team, struct team_port *port); +	void (*port_leave)(struct team *team, struct team_port *port); +	void (*port_change_mac)(struct team *team, struct team_port *port); +}; + +enum team_option_type { +	TEAM_OPTION_TYPE_U32, +	TEAM_OPTION_TYPE_STRING, +}; + +struct team_option { +	struct list_head list; +	const char *name; +	enum team_option_type type; +	int (*getter)(struct team *team, void *arg); +	int (*setter)(struct team *team, void *arg); + +	/* Custom gennetlink interface related flags */ +	bool changed; +	bool removed; +}; + +struct team_mode { +	struct list_head list; +	const char *kind; +	struct module *owner; +	size_t priv_size; +	const struct team_mode_ops *ops; +}; + +#define TEAM_PORT_HASHBITS 4 +#define TEAM_PORT_HASHENTRIES (1 << TEAM_PORT_HASHBITS) + +#define TEAM_MODE_PRIV_LONGS 4 +#define TEAM_MODE_PRIV_SIZE (sizeof(long) * TEAM_MODE_PRIV_LONGS) + +struct team { +	struct net_device *dev; /* associated netdevice */ +	struct team_pcpu_stats __percpu *pcpu_stats; + +	struct mutex lock; /* used for overall locking, e.g. port lists write */ + +	/* +	 * port lists with port count +	 */ +	int port_count; +	struct hlist_head port_hlist[TEAM_PORT_HASHENTRIES]; +	struct list_head port_list; + +	struct list_head option_list; + +	const struct team_mode *mode; +	struct team_mode_ops ops; +	long mode_priv[TEAM_MODE_PRIV_LONGS]; +}; + +static inline struct hlist_head *team_port_index_hash(struct team *team, +						      int port_index) +{ +	return &team->port_hlist[port_index & (TEAM_PORT_HASHENTRIES - 1)]; +} + +static inline struct team_port *team_get_port_by_index(struct team *team, +						       int port_index) +{ +	struct hlist_node *p; +	struct team_port *port; +	struct hlist_head *head = team_port_index_hash(team, port_index); + +	hlist_for_each_entry(port, p, head, hlist) +		if (port->index == port_index) +			return port; +	return NULL; +} +static inline struct team_port *team_get_port_by_index_rcu(struct team *team, +							   int port_index) +{ +	struct hlist_node *p; +	struct team_port *port; +	struct hlist_head *head = team_port_index_hash(team, port_index); + +	hlist_for_each_entry_rcu(port, p, head, hlist) +		if (port->index == port_index) +			return port; +	return NULL; +} + +extern int team_port_set_team_mac(struct team_port *port); +extern int team_options_register(struct team *team, +				 const struct team_option *option, +				 size_t option_count); +extern void team_options_unregister(struct team *team, +				    const struct team_option *option, +				    size_t option_count); +extern int team_mode_register(struct team_mode *mode); +extern int team_mode_unregister(struct team_mode *mode); + +#endif /* __KERNEL__ */ + +#define TEAM_STRING_MAX_LEN 32 + +/********************************** + * NETLINK_GENERIC netlink family. + **********************************/ + +enum { +	TEAM_CMD_NOOP, +	TEAM_CMD_OPTIONS_SET, +	TEAM_CMD_OPTIONS_GET, +	TEAM_CMD_PORT_LIST_GET, + +	__TEAM_CMD_MAX, +	TEAM_CMD_MAX = (__TEAM_CMD_MAX - 1), +}; + +enum { +	TEAM_ATTR_UNSPEC, +	TEAM_ATTR_TEAM_IFINDEX,		/* u32 */ +	TEAM_ATTR_LIST_OPTION,		/* nest */ +	TEAM_ATTR_LIST_PORT,		/* nest */ + +	__TEAM_ATTR_MAX, +	TEAM_ATTR_MAX = __TEAM_ATTR_MAX - 1, +}; + +/* Nested layout of get/set msg: + * + *	[TEAM_ATTR_LIST_OPTION] + *		[TEAM_ATTR_ITEM_OPTION] + *			[TEAM_ATTR_OPTION_*], ... + *		[TEAM_ATTR_ITEM_OPTION] + *			[TEAM_ATTR_OPTION_*], ... + *		... + *	[TEAM_ATTR_LIST_PORT] + *		[TEAM_ATTR_ITEM_PORT] + *			[TEAM_ATTR_PORT_*], ... + *		[TEAM_ATTR_ITEM_PORT] + *			[TEAM_ATTR_PORT_*], ... + *		... + */ + +enum { +	TEAM_ATTR_ITEM_OPTION_UNSPEC, +	TEAM_ATTR_ITEM_OPTION,		/* nest */ + +	__TEAM_ATTR_ITEM_OPTION_MAX, +	TEAM_ATTR_ITEM_OPTION_MAX = __TEAM_ATTR_ITEM_OPTION_MAX - 1, +}; + +enum { +	TEAM_ATTR_OPTION_UNSPEC, +	TEAM_ATTR_OPTION_NAME,		/* string */ +	TEAM_ATTR_OPTION_CHANGED,	/* flag */ +	TEAM_ATTR_OPTION_TYPE,		/* u8 */ +	TEAM_ATTR_OPTION_DATA,		/* dynamic */ +	TEAM_ATTR_OPTION_REMOVED,	/* flag */ + +	__TEAM_ATTR_OPTION_MAX, +	TEAM_ATTR_OPTION_MAX = __TEAM_ATTR_OPTION_MAX - 1, +}; + +enum { +	TEAM_ATTR_ITEM_PORT_UNSPEC, +	TEAM_ATTR_ITEM_PORT,		/* nest */ + +	__TEAM_ATTR_ITEM_PORT_MAX, +	TEAM_ATTR_ITEM_PORT_MAX = __TEAM_ATTR_ITEM_PORT_MAX - 1, +}; + +enum { +	TEAM_ATTR_PORT_UNSPEC, +	TEAM_ATTR_PORT_IFINDEX,		/* u32 */ +	TEAM_ATTR_PORT_CHANGED,		/* flag */ +	TEAM_ATTR_PORT_LINKUP,		/* flag */ +	TEAM_ATTR_PORT_SPEED,		/* u32 */ +	TEAM_ATTR_PORT_DUPLEX,		/* u8 */ +	TEAM_ATTR_PORT_REMOVED,		/* flag */ + +	__TEAM_ATTR_PORT_MAX, +	TEAM_ATTR_PORT_MAX = __TEAM_ATTR_PORT_MAX - 1, +}; + +/* + * NETLINK_GENERIC related info + */ +#define TEAM_GENL_NAME "team" +#define TEAM_GENL_VERSION 0x1 +#define TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME "change_event" + +#endif /* _LINUX_IF_TEAM_H_ */ diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 12d5543b14f..13aff1e2183 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -74,22 +74,7 @@ static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb)  /* found in socket.c */  extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); -/* if this changes, algorithm will have to be reworked because this - * depends on completely exhausting the VLAN identifier space.  Thus - * it gives constant time look-up, but in many cases it wastes memory. - */ -#define VLAN_GROUP_ARRAY_SPLIT_PARTS  8 -#define VLAN_GROUP_ARRAY_PART_LEN     (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS) - -struct vlan_group { -	struct net_device	*real_dev; /* The ethernet(like) device -					    * the vlan is attached to. -					    */ -	unsigned int		nr_vlans; -	struct hlist_node	hlist;	/* linked list */ -	struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS]; -	struct rcu_head		rcu; -}; +struct vlan_info;  static inline int is_vlan_dev(struct net_device *dev)  { @@ -109,6 +94,13 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);  extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler);  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_vids_add_by_dev(struct net_device *dev, +				const struct net_device *by_dev); +extern void vlan_vids_del_by_dev(struct net_device *dev, +				 const struct net_device *by_dev);  #else  static inline struct net_device *  __vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) @@ -139,6 +131,26 @@ 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) +{ +	return 0; +} + +static inline void vlan_vid_del(struct net_device *dev, unsigned short vid) +{ +} + +static inline int vlan_vids_add_by_dev(struct net_device *dev, +				       const struct net_device *by_dev) +{ +	return 0; +} + +static inline void vlan_vids_del_by_dev(struct net_device *dev, +					const struct net_device *by_dev) +{ +}  #endif  /** @@ -310,6 +322,40 @@ static inline __be16 vlan_get_protocol(const struct sk_buff *skb)  	return protocol;  } + +static inline void vlan_set_encap_proto(struct sk_buff *skb, +					struct vlan_hdr *vhdr) +{ +	__be16 proto; +	unsigned char *rawp; + +	/* +	 * Was a VLAN packet, grab the encapsulated protocol, which the layer +	 * three protocols care about. +	 */ + +	proto = vhdr->h_vlan_encapsulated_proto; +	if (ntohs(proto) >= 1536) { +		skb->protocol = proto; +		return; +	} + +	rawp = skb->data; +	if (*(unsigned short *) rawp == 0xFFFF) +		/* +		 * This is a magic hack to spot IPX packets. Older Novell +		 * breaks the protocol design and runs IPX over 802.3 without +		 * an 802.2 LLC layer. We look for FFFF which isn't a used +		 * 802.2 SSAP/DSAP. This won't work for fault tolerant netware +		 * but does for the rest. +		 */ +		skb->protocol = htons(ETH_P_802_3); +	else +		/* +		 * Real 802.2 LLC +		 */ +		skb->protocol = htons(ETH_P_802_2); +}  #endif /* __KERNEL__ */  /* VLAN IOCTLs are found in sockios.h */ @@ -352,7 +398,7 @@ struct vlan_ioctl_args {  		unsigned int skb_priority;  		unsigned int name_type;  		unsigned int bind_type; -		unsigned int flag; /* Matches vlan_dev_info flags */ +		unsigned int flag; /* Matches vlan_dev_priv flags */          } u;  	short vlan_qos;    diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h index 80b480c9753..f1362b5447f 100644 --- a/include/linux/inet_diag.h +++ b/include/linux/inet_diag.h @@ -34,6 +34,15 @@ struct inet_diag_req {  	__u32	idiag_dbs;		/* Tables to dump (NI) */  }; +struct inet_diag_req_v2 { +	__u8	sdiag_family; +	__u8	sdiag_protocol; +	__u8	idiag_ext; +	__u8	pad; +	__u32	idiag_states; +	struct inet_diag_sockid id; +}; +  enum {  	INET_DIAG_REQ_NONE,  	INET_DIAG_REQ_BYTECODE, @@ -98,9 +107,11 @@ enum {  	INET_DIAG_VEGASINFO,  	INET_DIAG_CONG,  	INET_DIAG_TOS, +	INET_DIAG_TCLASS, +	INET_DIAG_SKMEMINFO,  }; -#define INET_DIAG_MAX INET_DIAG_TOS +#define INET_DIAG_MAX INET_DIAG_SKMEMINFO  /* INET_DIAG_MEM */ @@ -124,16 +135,41 @@ struct tcpvegas_info {  #ifdef __KERNEL__  struct sock;  struct inet_hashinfo; +struct nlattr; +struct nlmsghdr; +struct sk_buff; +struct netlink_callback;  struct inet_diag_handler { -	struct inet_hashinfo    *idiag_hashinfo; +	void			(*dump)(struct sk_buff *skb, +					struct netlink_callback *cb, +					struct inet_diag_req_v2 *r, +					struct nlattr *bc); + +	int			(*dump_one)(struct sk_buff *in_skb, +					const struct nlmsghdr *nlh, +					struct inet_diag_req_v2 *req); +  	void			(*idiag_get_info)(struct sock *sk,  						  struct inet_diag_msg *r,  						  void *info); -	__u16                   idiag_info_size;  	__u16                   idiag_type;  }; +struct inet_connection_sock; +int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, +			      struct sk_buff *skb, struct inet_diag_req_v2 *req, +			      u32 pid, u32 seq, u16 nlmsg_flags, +			      const struct nlmsghdr *unlh); +void inet_diag_dump_icsk(struct inet_hashinfo *h, struct sk_buff *skb, +		struct netlink_callback *cb, struct inet_diag_req_v2 *r, +		struct nlattr *bc); +int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, +		struct sk_buff *in_skb, const struct nlmsghdr *nlh, +		struct inet_diag_req_v2 *req); + +int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk); +  extern int  inet_diag_register(const struct inet_diag_handler *handler);  extern void inet_diag_unregister(const struct inet_diag_handler *handler);  #endif /* __KERNEL__ */ diff --git a/include/linux/init.h b/include/linux/init.h index 9146f39cddd..6b951095a42 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -2,6 +2,7 @@  #define _LINUX_INIT_H  #include <linux/compiler.h> +#include <linux/types.h>  /* These macros are used to mark some functions or    * initialized data (doesn't apply to uninitialized data) @@ -156,7 +157,7 @@ void prepare_namespace(void);  extern void (*late_time_init)(void); -extern int initcall_debug; +extern bool initcall_debug;  #endif diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 08ffab01e76..9c66b1ada9d 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -23,11 +23,10 @@ extern struct files_struct init_files;  extern struct fs_struct init_fs;  #ifdef CONFIG_CGROUPS -#define INIT_THREADGROUP_FORK_LOCK(sig)					\ -	.threadgroup_fork_lock =					\ -		__RWSEM_INITIALIZER(sig.threadgroup_fork_lock), +#define INIT_GROUP_RWSEM(sig)						\ +	.group_rwsem = __RWSEM_INITIALIZER(sig.group_rwsem),  #else -#define INIT_THREADGROUP_FORK_LOCK(sig) +#define INIT_GROUP_RWSEM(sig)  #endif  #define INIT_SIGNALS(sig) {						\ @@ -46,7 +45,7 @@ extern struct fs_struct init_fs;  	},								\  	.cred_guard_mutex =						\  		 __MUTEX_INITIALIZER(sig.cred_guard_mutex),		\ -	INIT_THREADGROUP_FORK_LOCK(sig)					\ +	INIT_GROUP_RWSEM(sig)						\  }  extern struct nsproxy init_nsproxy; @@ -126,6 +125,8 @@ extern struct cred init_cred;  # define INIT_PERF_EVENTS(tsk)  #endif +#define INIT_TASK_COMM "swapper" +  /*   *  INIT_TASK is used to set up the first task table, touch at   * your own risk!. Base=0, limit=0x1fffff (=2MB) @@ -162,7 +163,7 @@ extern struct cred init_cred;  	.group_leader	= &tsk,						\  	RCU_INIT_POINTER(.real_cred, &init_cred),			\  	RCU_INIT_POINTER(.cred, &init_cred),				\ -	.comm		= "swapper",					\ +	.comm		= INIT_TASK_COMM,				\  	.thread		= INIT_THREAD,					\  	.fs		= &init_fs,					\  	.files		= &init_files,					\ @@ -184,7 +185,6 @@ extern struct cred init_cred;  		[PIDTYPE_SID]  = INIT_PID_LINK(PIDTYPE_SID),		\  	},								\  	.thread_group	= LIST_HEAD_INIT(tsk.thread_group),		\ -	.dirties = INIT_PROP_LOCAL_SINGLE(dirties),			\  	INIT_IDS							\  	INIT_PERF_EVENTS(tsk)						\  	INIT_TRACE_IRQFLAGS						\ diff --git a/include/linux/input/auo-pixcir-ts.h b/include/linux/input/auo-pixcir-ts.h new file mode 100644 index 00000000000..75d4be71771 --- /dev/null +++ b/include/linux/input/auo-pixcir-ts.h @@ -0,0 +1,56 @@ +/* + * Driver for AUO in-cell touchscreens + * + * Copyright (c) 2011 Heiko Stuebner <heiko@sntech.de> + * + * based on auo_touch.h from Dell Streak kernel + * + * Copyright (c) 2008 QUALCOMM Incorporated. + * Copyright (c) 2008 QUALCOMM USA, INC. + * + * + * 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 __AUO_PIXCIR_TS_H__ +#define __AUO_PIXCIR_TS_H__ + +/* + * Interrupt modes: + * periodical:		interrupt is asserted periodicaly + * compare coordinates:	interrupt is asserted when coordinates change + * indicate touch:	interrupt is asserted during touch + */ +#define AUO_PIXCIR_INT_PERIODICAL	0x00 +#define AUO_PIXCIR_INT_COMP_COORD	0x01 +#define AUO_PIXCIR_INT_TOUCH_IND	0x02 + +/* + * @gpio_int		interrupt gpio + * @int_setting		one of AUO_PIXCIR_INT_* + * @init_hw		hardwarespecific init + * @exit_hw		hardwarespecific shutdown + * @x_max		x-resolution + * @y_max		y-resolution + */ +struct auo_pixcir_ts_platdata { +	int gpio_int; + +	int int_setting; + +	void (*init_hw)(struct i2c_client *); +	void (*exit_hw)(struct i2c_client *); + +	unsigned int x_max; +	unsigned int y_max; +}; + +#endif diff --git a/include/linux/input/gp2ap002a00f.h b/include/linux/input/gp2ap002a00f.h new file mode 100644 index 00000000000..aad2fd44a61 --- /dev/null +++ b/include/linux/input/gp2ap002a00f.h @@ -0,0 +1,22 @@ +#ifndef _GP2AP002A00F_H_ +#define _GP2AP002A00F_H_ + +#include <linux/i2c.h> + +#define GP2A_I2C_NAME "gp2ap002a00f" + +/** + * struct gp2a_platform_data - Sharp gp2ap002a00f proximity platform data + * @vout_gpio: The gpio connected to the object detected pin (VOUT) + * @wakeup: Set to true if the proximity can wake the device from suspend + * @hw_setup: Callback for setting up hardware such as gpios and vregs + * @hw_shutdown: Callback for properly shutting down hardware + */ +struct gp2a_platform_data { +	int vout_gpio; +	bool wakeup; +	int (*hw_setup)(struct i2c_client *client); +	int (*hw_shutdown)(struct i2c_client *client); +}; + +#endif diff --git a/include/linux/input/gpio_tilt.h b/include/linux/input/gpio_tilt.h new file mode 100644 index 00000000000..c1cc52d380e --- /dev/null +++ b/include/linux/input/gpio_tilt.h @@ -0,0 +1,73 @@ +#ifndef _INPUT_GPIO_TILT_H +#define _INPUT_GPIO_TILT_H + +/** + * struct gpio_tilt_axis - Axis used by the tilt switch + * @axis:		Constant describing the axis, e.g. ABS_X + * @min:		minimum value for abs_param + * @max:		maximum value for abs_param + * @fuzz:		fuzz value for abs_param + * @flat:		flat value for abs_param + */ +struct gpio_tilt_axis { +	int axis; +	int min; +	int max; +	int fuzz; +	int flat; +}; + +/** + * struct gpio_tilt_state - state description + * @gpios:		bitfield of gpio target-states for the value + * @axes:		array containing the axes settings for the gpio state + *			The array indizes must correspond to the axes defined + *			in platform_data + * + * This structure describes a supported axis settings + * and the necessary gpio-state which represent it. + * + * The n-th bit in the bitfield describes the state of the n-th GPIO + * from the gpios-array defined in gpio_regulator_config below. + */ +struct gpio_tilt_state { +	int gpios; +	int *axes; +}; + +/** + * struct gpio_tilt_platform_data + * @gpios:		Array containing the gpios determining the tilt state + * @nr_gpios:		Number of gpios + * @axes:		Array of gpio_tilt_axis descriptions + * @nr_axes:		Number of axes + * @states:		Array of gpio_tilt_state entries describing + *			the gpio state for specific tilts + * @nr_states:		Number of states available + * @debounce_interval:	debounce ticks interval in msecs + * @poll_interval:	polling interval in msecs - for polling driver only + * @enable:		callback to enable the tilt switch + * @disable:		callback to disable the tilt switch + * + * This structure contains gpio-tilt-switch configuration + * information that must be passed by platform code to the + * gpio-tilt input driver. + */ +struct gpio_tilt_platform_data { +	struct gpio *gpios; +	int nr_gpios; + +	struct gpio_tilt_axis *axes; +	int nr_axes; + +	struct gpio_tilt_state *states; +	int nr_states; + +	int debounce_interval; + +	unsigned int poll_interval; +	int (*enable)(struct device *dev); +	void (*disable)(struct device *dev); +}; + +#endif diff --git a/include/linux/input/pixcir_ts.h b/include/linux/input/pixcir_ts.h new file mode 100644 index 00000000000..7163d91c037 --- /dev/null +++ b/include/linux/input/pixcir_ts.h @@ -0,0 +1,10 @@ +#ifndef	_PIXCIR_I2C_TS_H +#define	_PIXCIR_I2C_TS_H + +struct pixcir_ts_platform_data { +	int (*attb_read_val)(void); +	int x_max; +	int y_max; +}; + +#endif diff --git a/include/linux/input/samsung-keypad.h b/include/linux/input/samsung-keypad.h new file mode 100644 index 00000000000..f25619bfd8a --- /dev/null +++ b/include/linux/input/samsung-keypad.h @@ -0,0 +1,43 @@ +/* + * Samsung Keypad platform data definitions + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim <jy0922.shim@samsung.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. + */ + +#ifndef __SAMSUNG_KEYPAD_H +#define __SAMSUNG_KEYPAD_H + +#include <linux/input/matrix_keypad.h> + +#define SAMSUNG_MAX_ROWS	8 +#define SAMSUNG_MAX_COLS	8 + +/** + * struct samsung_keypad_platdata - Platform device data for Samsung Keypad. + * @keymap_data: pointer to &matrix_keymap_data. + * @rows: number of keypad row supported. + * @cols: number of keypad col supported. + * @no_autorepeat: disable key autorepeat. + * @wakeup: controls whether the device should be set up as wakeup source. + * @cfg_gpio: configure the GPIO. + * + * Initialisation data specific to either the machine or the platform + * for the device driver to use or call-back when configuring gpio. + */ +struct samsung_keypad_platdata { +	const struct matrix_keymap_data	*keymap_data; +	unsigned int rows; +	unsigned int cols; +	bool no_autorepeat; +	bool wakeup; + +	void (*cfg_gpio)(unsigned int rows, unsigned int cols); +}; + +#endif /* __SAMSUNG_KEYPAD_H */ diff --git a/include/linux/input/tca8418_keypad.h b/include/linux/input/tca8418_keypad.h new file mode 100644 index 00000000000..e71a85dc2cb --- /dev/null +++ b/include/linux/input/tca8418_keypad.h @@ -0,0 +1,44 @@ +/* + * TCA8418 keypad platform support + * + * Copyright (C) 2011 Fuel7, Inc.  All rights reserved. + * + * Author: Kyle Manna <kyle.manna@fuel7.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 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, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + * + * If you can't comply with GPLv2, alternative licensing terms may be + * arranged. Please contact Fuel7, Inc. (http://fuel7.com/) for proprietary + * alternative licensing inquiries. + */ + +#ifndef _TCA8418_KEYPAD_H +#define _TCA8418_KEYPAD_H + +#include <linux/types.h> +#include <linux/input/matrix_keypad.h> + +#define TCA8418_I2C_ADDR	0x34 +#define	TCA8418_NAME		"tca8418_keypad" + +struct tca8418_keypad_platform_data { +	const struct matrix_keymap_data *keymap_data; +	unsigned rows; +	unsigned cols; +	bool rep; +	bool irq_is_gpio; +}; + +#endif diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h index 5037a0ad231..119773eebe3 100644 --- a/include/linux/iocontext.h +++ b/include/linux/iocontext.h @@ -3,32 +3,92 @@  #include <linux/radix-tree.h>  #include <linux/rcupdate.h> +#include <linux/workqueue.h> -struct cfq_queue; -struct cfq_ttime { -	unsigned long last_end_request; - -	unsigned long ttime_total; -	unsigned long ttime_samples; -	unsigned long ttime_mean; +enum { +	ICQ_IOPRIO_CHANGED, +	ICQ_CGROUP_CHANGED,  }; -struct cfq_io_context { -	void *key; - -	struct cfq_queue *cfqq[2]; - -	struct io_context *ioc; - -	struct cfq_ttime ttime; - -	struct list_head queue_list; -	struct hlist_node cic_list; +/* + * An io_cq (icq) is association between an io_context (ioc) and a + * request_queue (q).  This is used by elevators which need to track + * information per ioc - q pair. + * + * Elevator can request use of icq by setting elevator_type->icq_size and + * ->icq_align.  Both size and align must be larger than that of struct + * io_cq and elevator can use the tail area for private information.  The + * recommended way to do this is defining a struct which contains io_cq as + * the first member followed by private members and using its size and + * align.  For example, + * + *	struct snail_io_cq { + *		struct io_cq	icq; + *		int		poke_snail; + *		int		feed_snail; + *	}; + * + *	struct elevator_type snail_elv_type { + *		.ops =		{ ... }, + *		.icq_size =	sizeof(struct snail_io_cq), + *		.icq_align =	__alignof__(struct snail_io_cq), + *		... + *	}; + * + * If icq_size is set, block core will manage icq's.  All requests will + * have its ->elv.icq field set before elevator_ops->elevator_set_req_fn() + * is called and be holding a reference to the associated io_context. + * + * Whenever a new icq is created, elevator_ops->elevator_init_icq_fn() is + * called and, on destruction, ->elevator_exit_icq_fn().  Both functions + * are called with both the associated io_context and queue locks held. + * + * Elevator is allowed to lookup icq using ioc_lookup_icq() while holding + * queue lock but the returned icq is valid only until the queue lock is + * released.  Elevators can not and should not try to create or destroy + * icq's. + * + * As icq's are linked from both ioc and q, the locking rules are a bit + * complex. + * + * - ioc lock nests inside q lock. + * + * - ioc->icq_list and icq->ioc_node are protected by ioc lock. + *   q->icq_list and icq->q_node by q lock. + * + * - ioc->icq_tree and ioc->icq_hint are protected by ioc lock, while icq + *   itself is protected by q lock.  However, both the indexes and icq + *   itself are also RCU managed and lookup can be performed holding only + *   the q lock. + * + * - icq's are not reference counted.  They are destroyed when either the + *   ioc or q goes away.  Each request with icq set holds an extra + *   reference to ioc to ensure it stays until the request is completed. + * + * - Linking and unlinking icq's are performed while holding both ioc and q + *   locks.  Due to the lock ordering, q exit is simple but ioc exit + *   requires reverse-order double lock dance. + */ +struct io_cq { +	struct request_queue	*q; +	struct io_context	*ioc; -	void (*dtor)(struct io_context *); /* destructor */ -	void (*exit)(struct io_context *); /* called on task exit */ +	/* +	 * q_node and ioc_node link io_cq through icq_list of q and ioc +	 * respectively.  Both fields are unused once ioc_exit_icq() is +	 * called and shared with __rcu_icq_cache and __rcu_head which are +	 * used for RCU free of io_cq. +	 */ +	union { +		struct list_head	q_node; +		struct kmem_cache	*__rcu_icq_cache; +	}; +	union { +		struct hlist_node	ioc_node; +		struct rcu_head		__rcu_head; +	}; -	struct rcu_head rcu_head; +	unsigned long		changed;  };  /* @@ -43,11 +103,6 @@ struct io_context {  	spinlock_t lock;  	unsigned short ioprio; -	unsigned short ioprio_changed; - -#if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE) -	unsigned short cgroup_changed; -#endif  	/*  	 * For request batching @@ -55,9 +110,11 @@ struct io_context {  	int nr_batch_requests;     /* Number of requests left in the batch */  	unsigned long last_waited; /* Time last woken after wait for request */ -	struct radix_tree_root radix_root; -	struct hlist_head cic_list; -	void __rcu *ioc_data; +	struct radix_tree_root	icq_tree; +	struct io_cq __rcu	*icq_hint; +	struct hlist_head	icq_list; + +	struct work_struct release_work;  };  static inline struct io_context *ioc_task_link(struct io_context *ioc) @@ -76,20 +133,16 @@ static inline struct io_context *ioc_task_link(struct io_context *ioc)  struct task_struct;  #ifdef CONFIG_BLOCK -int put_io_context(struct io_context *ioc); +void put_io_context(struct io_context *ioc);  void exit_io_context(struct task_struct *task); -struct io_context *get_io_context(gfp_t gfp_flags, int node); -struct io_context *alloc_io_context(gfp_t gfp_flags, int node); +struct io_context *get_task_io_context(struct task_struct *task, +				       gfp_t gfp_flags, int node); +void ioc_ioprio_changed(struct io_context *ioc, int ioprio); +void ioc_cgroup_changed(struct io_context *ioc);  #else -static inline void exit_io_context(struct task_struct *task) -{ -} -  struct io_context; -static inline int put_io_context(struct io_context *ioc) -{ -	return 1; -} +static inline void put_io_context(struct io_context *ioc) { } +static inline void exit_io_context(struct task_struct *task) { }  #endif  #endif diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 432acc4c054..d937580417b 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -48,19 +48,34 @@ struct iommu_domain {  #ifdef CONFIG_IOMMU_API +/** + * struct iommu_ops - iommu ops and capabilities + * @domain_init: init iommu domain + * @domain_destroy: destroy iommu domain + * @attach_dev: attach device to an iommu domain + * @detach_dev: detach device from an iommu domain + * @map: map a physically contiguous memory region to an iommu domain + * @unmap: unmap a physically contiguous memory region from an iommu domain + * @iova_to_phys: translate iova to physical address + * @domain_has_cap: domain capabilities query + * @commit: commit iommu domain + * @pgsize_bitmap: bitmap of supported page sizes + */  struct iommu_ops {  	int (*domain_init)(struct iommu_domain *domain);  	void (*domain_destroy)(struct iommu_domain *domain);  	int (*attach_dev)(struct iommu_domain *domain, struct device *dev);  	void (*detach_dev)(struct iommu_domain *domain, struct device *dev);  	int (*map)(struct iommu_domain *domain, unsigned long iova, -		   phys_addr_t paddr, int gfp_order, int prot); -	int (*unmap)(struct iommu_domain *domain, unsigned long iova, -		     int gfp_order); +		   phys_addr_t paddr, size_t size, int prot); +	size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, +		     size_t size);  	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,  				    unsigned long iova);  	int (*domain_has_cap)(struct iommu_domain *domain,  			      unsigned long cap); +	int (*device_group)(struct device *dev, unsigned int *groupid); +	unsigned long pgsize_bitmap;  };  extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); @@ -72,15 +87,16 @@ extern int iommu_attach_device(struct iommu_domain *domain,  extern void iommu_detach_device(struct iommu_domain *domain,  				struct device *dev);  extern int iommu_map(struct iommu_domain *domain, unsigned long iova, -		     phys_addr_t paddr, int gfp_order, int prot); -extern int iommu_unmap(struct iommu_domain *domain, unsigned long iova, -		       int gfp_order); +		     phys_addr_t paddr, size_t size, int prot); +extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, +		       size_t size);  extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,  				      unsigned long iova);  extern int iommu_domain_has_cap(struct iommu_domain *domain,  				unsigned long cap);  extern void iommu_set_fault_handler(struct iommu_domain *domain,  					iommu_fault_handler_t handler); +extern int iommu_device_group(struct device *dev, unsigned int *groupid);  /**   * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework @@ -179,6 +195,11 @@ static inline void iommu_set_fault_handler(struct iommu_domain *domain,  {  } +static inline int iommu_device_group(struct device *dev, unsigned int *groupid) +{ +	return -ENODEV; +} +  #endif /* CONFIG_IOMMU_API */  #endif /* __LINUX_IOMMU_H */ diff --git a/include/linux/ipc.h b/include/linux/ipc.h index 3b1594d662b..30e816148df 100644 --- a/include/linux/ipc.h +++ b/include/linux/ipc.h @@ -93,7 +93,7 @@ struct kern_ipc_perm  	gid_t		gid;  	uid_t		cuid;  	gid_t		cgid; -	mode_t		mode;  +	umode_t		mode;   	unsigned long	seq;  	void		*security;  }; diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 0c997767429..6318268dcaf 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -404,7 +404,7 @@ struct tcp6_sock {  extern int inet6_sk_rebuild_header(struct sock *sk); -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)  {  	return inet_sk(__sk)->pinet6; @@ -515,7 +515,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)  #define inet6_rcv_saddr(__sk)	NULL  #define tcp_twsk_ipv6only(__sk)		0  #define inet_v6_ipv6only(__sk)		0 -#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ +#endif /* IS_ENABLED(CONFIG_IPV6) */  #define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\  	(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)	&& \ diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 99834e581b9..bd4272b61a1 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h @@ -91,10 +91,11 @@ static inline unsigned int irq_domain_to_irq(struct irq_domain *d,  extern void irq_domain_add(struct irq_domain *domain);  extern void irq_domain_del(struct irq_domain *domain); + +extern struct irq_domain_ops irq_domain_simple_ops;  #endif /* CONFIG_IRQ_DOMAIN */  #if defined(CONFIG_IRQ_DOMAIN) && defined(CONFIG_OF_IRQ) -extern struct irq_domain_ops irq_domain_simple_ops;  extern void irq_domain_add_simple(struct device_node *controller, int irq_base);  extern void irq_domain_generate_simple(const struct of_device_id *match,  					u64 phys_base, unsigned int irq_start); diff --git a/include/linux/iscsi_boot_sysfs.h b/include/linux/iscsi_boot_sysfs.h index f0a2f8b0aa1..2a8b1659bf3 100644 --- a/include/linux/iscsi_boot_sysfs.h +++ b/include/linux/iscsi_boot_sysfs.h @@ -91,7 +91,7 @@ struct iscsi_boot_kobj {  	 * The enum of the type. This can be any value of the above  	 * properties.  	 */ -	mode_t (*is_visible) (void *data, int type); +	umode_t (*is_visible) (void *data, int type);  	/*  	 * Driver specific release function. @@ -110,20 +110,20 @@ struct iscsi_boot_kobj *  iscsi_boot_create_initiator(struct iscsi_boot_kset *boot_kset, int index,  			    void *data,  			    ssize_t (*show) (void *data, int type, char *buf), -			    mode_t (*is_visible) (void *data, int type), +			    umode_t (*is_visible) (void *data, int type),  			    void (*release) (void *data));  struct iscsi_boot_kobj *  iscsi_boot_create_ethernet(struct iscsi_boot_kset *boot_kset, int index,  			   void *data,  			   ssize_t (*show) (void *data, int type, char *buf), -			   mode_t (*is_visible) (void *data, int type), +			   umode_t (*is_visible) (void *data, int type),  			   void (*release) (void *data));  struct iscsi_boot_kobj *  iscsi_boot_create_target(struct iscsi_boot_kset *boot_kset, int index,  			 void *data,  			 ssize_t (*show) (void *data, int type, char *buf), -			 mode_t (*is_visible) (void *data, int type), +			 umode_t (*is_visible) (void *data, int type),  			 void (*release) (void *data));  struct iscsi_boot_kset *iscsi_boot_create_kset(const char *set_name); diff --git a/include/linux/isdn_divertif.h b/include/linux/isdn_divertif.h index 07821ca5955..a5a50f52380 100644 --- a/include/linux/isdn_divertif.h +++ b/include/linux/isdn_divertif.h @@ -10,6 +10,8 @@   *   */ +#ifndef _LINUX_ISDN_DIVERTIF_H +#define _LINUX_ISDN_DIVERTIF_H  /***********************************************************/  /* magic value is also used to control version information */ @@ -45,3 +47,5 @@ typedef struct  /*********************/  extern int DIVERT_REG_NAME(isdn_divert_if *);  #endif + +#endif /* _LINUX_ISDN_DIVERTIF_H */ diff --git a/include/linux/jbd.h b/include/linux/jbd.h index c7acdde3243..d211732b9e9 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -497,7 +497,6 @@ struct transaction_s   * @j_format_version: Version of the superblock format   * @j_state_lock: Protect the various scalars in the journal   * @j_barrier_count:  Number of processes waiting to create a barrier lock - * @j_barrier: The barrier lock itself   * @j_running_transaction: The current running transaction..   * @j_committing_transaction: the transaction we are pushing to disk   * @j_checkpoint_transactions: a linked circular list of all transactions @@ -580,9 +579,6 @@ struct journal_s  	 */  	int			j_barrier_count; -	/* The barrier lock itself */ -	struct mutex		j_barrier; -  	/*  	 * Transactions: The current running transaction...  	 * [j_state_lock] [caller holding open handle] @@ -913,6 +909,7 @@ extern int	journal_set_revoke(journal_t *, unsigned int, tid_t);  extern int	journal_test_revoke(journal_t *, unsigned int, tid_t);  extern void	journal_clear_revoke(journal_t *);  extern void	journal_switch_revoke_table(journal_t *journal); +extern void	journal_clear_buffer_revoked_flags(journal_t *journal);  /*   * The log thread user interface: diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 2092ea21e46..5557baefed6 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -1151,6 +1151,7 @@ extern int	jbd2_journal_set_revoke(journal_t *, unsigned long long, tid_t);  extern int	jbd2_journal_test_revoke(journal_t *, unsigned long long, tid_t);  extern void	jbd2_journal_clear_revoke(journal_t *);  extern void	jbd2_journal_switch_revoke_table(journal_t *journal); +extern void	jbd2_clear_buffer_revoked_flags(journal_t *journal);  /*   * The log thread user interface: diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 388b0d425b5..5ce8b140428 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -3,6 +3,7 @@  #include <linux/types.h>  #include <linux/compiler.h> +#include <linux/workqueue.h>  #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) @@ -14,6 +15,12 @@ struct jump_label_key {  #endif  }; +struct jump_label_key_deferred { +	struct jump_label_key key; +	unsigned long timeout; +	struct delayed_work work; +}; +  # include <asm/jump_label.h>  # define HAVE_JUMP_LABEL  #endif	/* CC_HAVE_ASM_GOTO && CONFIG_JUMP_LABEL */ @@ -51,8 +58,11 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry,  extern int jump_label_text_reserved(void *start, void *end);  extern void jump_label_inc(struct jump_label_key *key);  extern void jump_label_dec(struct jump_label_key *key); +extern void jump_label_dec_deferred(struct jump_label_key_deferred *key);  extern bool jump_label_enabled(struct jump_label_key *key);  extern void jump_label_apply_nops(struct module *mod); +extern void jump_label_rate_limit(struct jump_label_key_deferred *key, +		unsigned long rl);  #else  /* !HAVE_JUMP_LABEL */ @@ -68,6 +78,10 @@ static __always_inline void jump_label_init(void)  {  } +struct jump_label_key_deferred { +	struct jump_label_key  key; +}; +  static __always_inline bool static_branch(struct jump_label_key *key)  {  	if (unlikely(atomic_read(&key->enabled))) @@ -85,6 +99,11 @@ static inline void jump_label_dec(struct jump_label_key *key)  	atomic_dec(&key->enabled);  } +static inline void jump_label_dec_deferred(struct jump_label_key_deferred *key) +{ +	jump_label_dec(&key->key); +} +  static inline int jump_label_text_reserved(void *start, void *end)  {  	return 0; @@ -102,6 +121,14 @@ static inline int jump_label_apply_nops(struct module *mod)  {  	return 0;  } + +static inline void jump_label_rate_limit(struct jump_label_key_deferred *key, +		unsigned long rl) +{ +}  #endif	/* HAVE_JUMP_LABEL */ +#define jump_label_key_enabled	((struct jump_label_key){ .enabled = ATOMIC_INIT(1), }) +#define jump_label_key_disabled	((struct jump_label_key){ .enabled = ATOMIC_INIT(0), }) +  #endif	/* _LINUX_JUMP_LABEL_H */ diff --git a/include/linux/kernel.h b/include/linux/kernel.h index e8b1597b5cf..e8343422240 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -185,16 +185,17 @@ static inline void might_fault(void)  extern struct atomic_notifier_head panic_notifier_list;  extern long (*panic_blink)(int state); -NORET_TYPE void panic(const char * fmt, ...) -	__attribute__ ((NORET_AND format (printf, 1, 2))) __cold; +__printf(1, 2) +void panic(const char *fmt, ...) +	__noreturn __cold;  extern void oops_enter(void);  extern void oops_exit(void);  void print_oops_end_marker(void);  extern int oops_may_print(void); -NORET_TYPE void do_exit(long error_code) -	ATTRIB_NORET; -NORET_TYPE void complete_and_exit(struct completion *, long) -	ATTRIB_NORET; +void do_exit(long error_code) +	__noreturn; +void complete_and_exit(struct completion *, long) +	__noreturn;  /* Internal, do not use. */  int __must_check _kstrtoul(const char *s, unsigned int base, unsigned long *res); @@ -341,6 +342,7 @@ extern int panic_timeout;  extern int panic_on_oops;  extern int panic_on_unrecovered_nmi;  extern int panic_on_io_nmi; +extern int sysctl_panic_on_stackoverflow;  extern const char *print_tainted(void);  extern void add_taint(unsigned flag);  extern int test_taint(unsigned flag); @@ -665,6 +667,7 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  #define BUILD_BUG_ON_ZERO(e) (0)  #define BUILD_BUG_ON_NULL(e) ((void*)0)  #define BUILD_BUG_ON(condition) +#define BUILD_BUG() (0)  #else /* __CHECKER__ */  /* Force a compilation error if a constant expression is not a power of 2 */ @@ -703,6 +706,21 @@ extern int __build_bug_on_failed;  		if (condition) __build_bug_on_failed = 1;	\  	} while(0)  #endif + +/** + * BUILD_BUG - break compile if used. + * + * If you have some code that you expect the compiler to eliminate at + * build time, you should use BUILD_BUG to detect if it is + * unexpectedly used. + */ +#define BUILD_BUG()						\ +	do {							\ +		extern void __build_bug_failed(void)		\ +			__linktime_error("BUILD_BUG failed");	\ +		__build_bug_failed();				\ +	} while (0) +  #endif	/* __CHECKER__ */  /* Trap pasters of __FUNCTION__ at compile-time */ diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 0cce2db580c..2fbd9053c2d 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -6,6 +6,7 @@  #include <linux/percpu.h>  #include <linux/cpumask.h>  #include <linux/interrupt.h> +#include <linux/sched.h>  #include <asm/irq.h>  #include <asm/cputime.h> @@ -15,21 +16,25 @@   * used by rstatd/perfmeter   */ -struct cpu_usage_stat { -	cputime64_t user; -	cputime64_t nice; -	cputime64_t system; -	cputime64_t softirq; -	cputime64_t irq; -	cputime64_t idle; -	cputime64_t iowait; -	cputime64_t steal; -	cputime64_t guest; -	cputime64_t guest_nice; +enum cpu_usage_stat { +	CPUTIME_USER, +	CPUTIME_NICE, +	CPUTIME_SYSTEM, +	CPUTIME_SOFTIRQ, +	CPUTIME_IRQ, +	CPUTIME_IDLE, +	CPUTIME_IOWAIT, +	CPUTIME_STEAL, +	CPUTIME_GUEST, +	CPUTIME_GUEST_NICE, +	NR_STATS, +}; + +struct kernel_cpustat { +	u64 cpustat[NR_STATS];  };  struct kernel_stat { -	struct cpu_usage_stat	cpustat;  #ifndef CONFIG_GENERIC_HARDIRQS         unsigned int irqs[NR_IRQS];  #endif @@ -38,10 +43,13 @@ struct kernel_stat {  };  DECLARE_PER_CPU(struct kernel_stat, kstat); +DECLARE_PER_CPU(struct kernel_cpustat, kernel_cpustat); -#define kstat_cpu(cpu)	per_cpu(kstat, cpu)  /* Must have preemption disabled for this to be meaningful. */ -#define kstat_this_cpu	__get_cpu_var(kstat) +#define kstat_this_cpu (&__get_cpu_var(kstat)) +#define kcpustat_this_cpu (&__get_cpu_var(kernel_cpustat)) +#define kstat_cpu(cpu) per_cpu(kstat, cpu) +#define kcpustat_cpu(cpu) per_cpu(kernel_cpustat, cpu)  extern unsigned long long nr_context_switches(void); diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 2fa0901219d..0d7d6a1b172 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -50,9 +50,11 @@   * note header.  For kdump, the code in vmcore.c runs in the context   * of the second kernel to combine them into one note.   */ +#ifndef KEXEC_NOTE_BYTES  #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) +		\  			    KEXEC_CORE_NOTE_NAME_BYTES +		\  			    KEXEC_CORE_NOTE_DESC_BYTES ) +#endif  /*   * This structure is used to hold the arguments that are used when loading diff --git a/include/linux/key-type.h b/include/linux/key-type.h index 9efd081bb31..39e3c082c49 100644 --- a/include/linux/key-type.h +++ b/include/linux/key-type.h @@ -92,6 +92,7 @@ struct key_type {  	/* internal fields */  	struct list_head	link;		/* link in types list */ +	struct lock_class_key	lock_class;	/* key->sem lock class */  };  extern struct key_type key_type_keyring; diff --git a/include/linux/key.h b/include/linux/key.h index 183a6af7715..5253471cd2e 100644 --- a/include/linux/key.h +++ b/include/linux/key.h @@ -271,7 +271,7 @@ extern int keyring_add_key(struct key *keyring,  extern struct key *key_lookup(key_serial_t id); -static inline key_serial_t key_serial(struct key *key) +static inline key_serial_t key_serial(const struct key *key)  {  	return key ? key->serial : 0;  } @@ -293,6 +293,9 @@ static inline bool key_is_instantiated(const struct key *key)  	(rcu_dereference_protected((KEY)->payload.rcudata,		\  				   rwsem_is_locked(&((struct key *)(KEY))->sem))) +#define rcu_assign_keypointer(KEY, PAYLOAD)				\ +	(rcu_assign_pointer((KEY)->payload.rcudata, PAYLOAD)) +  #ifdef CONFIG_SYSCTL  extern ctl_table key_sysctls[];  #endif diff --git a/include/linux/kmemleak.h b/include/linux/kmemleak.h index 99d9a6766f7..2a5e5548a1d 100644 --- a/include/linux/kmemleak.h +++ b/include/linux/kmemleak.h @@ -26,8 +26,10 @@  extern void kmemleak_init(void) __ref;  extern void kmemleak_alloc(const void *ptr, size_t size, int min_count,  			   gfp_t gfp) __ref; +extern void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size) __ref;  extern void kmemleak_free(const void *ptr) __ref;  extern void kmemleak_free_part(const void *ptr, size_t size) __ref; +extern void kmemleak_free_percpu(const void __percpu *ptr) __ref;  extern void kmemleak_padding(const void *ptr, unsigned long offset,  			     size_t size) __ref;  extern void kmemleak_not_leak(const void *ptr) __ref; @@ -68,6 +70,9 @@ static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,  					    gfp_t gfp)  {  } +static inline void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size) +{ +}  static inline void kmemleak_free(const void *ptr)  {  } @@ -77,6 +82,9 @@ static inline void kmemleak_free_part(const void *ptr, size_t size)  static inline void kmemleak_free_recursive(const void *ptr, unsigned long flags)  {  } +static inline void kmemleak_free_percpu(const void __percpu *ptr) +{ +}  static inline void kmemleak_not_leak(const void *ptr)  {  } diff --git a/include/linux/kmod.h b/include/linux/kmod.h index b16f6539073..722f477c4ef 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -117,5 +117,7 @@ extern void usermodehelper_init(void);  extern int usermodehelper_disable(void);  extern void usermodehelper_enable(void);  extern bool usermodehelper_is_disabled(void); +extern void read_lock_usermodehelper(void); +extern void read_unlock_usermodehelper(void);  #endif /* __LINUX_KMOD_H__ */ diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index ee0c952188d..fee66317e07 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h @@ -18,7 +18,6 @@  enum kmsg_dump_reason {  	KMSG_DUMP_OOPS,  	KMSG_DUMP_PANIC, -	KMSG_DUMP_KEXEC,  	KMSG_DUMP_RESTART,  	KMSG_DUMP_HALT,  	KMSG_DUMP_POWEROFF, diff --git a/include/linux/kobject.h b/include/linux/kobject.h index ad81e1c5148..fc615a97e2d 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -191,8 +191,6 @@ static inline struct kobj_type *get_ktype(struct kobject *kobj)  }  extern struct kobject *kset_find_obj(struct kset *, const char *); -extern struct kobject *kset_find_obj_hinted(struct kset *, const char *, -						struct kobject *);  /* The global /sys/kernel/ kobject for people to chain off of */  extern struct kobject *kernel_kobj; diff --git a/include/linux/kref.h b/include/linux/kref.h index d4a62ab2ee5..9c07dcebded 100644 --- a/include/linux/kref.h +++ b/include/linux/kref.h @@ -15,16 +15,82 @@  #ifndef _KREF_H_  #define _KREF_H_ -#include <linux/types.h> +#include <linux/bug.h> +#include <linux/atomic.h> +#include <linux/kernel.h>  struct kref {  	atomic_t refcount;  }; -void kref_init(struct kref *kref); -void kref_get(struct kref *kref); -int kref_put(struct kref *kref, void (*release) (struct kref *kref)); -int kref_sub(struct kref *kref, unsigned int count, -	     void (*release) (struct kref *kref)); +/** + * kref_init - initialize object. + * @kref: object in question. + */ +static inline void kref_init(struct kref *kref) +{ +	atomic_set(&kref->refcount, 1); +} + +/** + * kref_get - increment refcount for object. + * @kref: object. + */ +static inline void kref_get(struct kref *kref) +{ +	WARN_ON(!atomic_read(&kref->refcount)); +	atomic_inc(&kref->refcount); +} +/** + * kref_sub - subtract a number of refcounts for object. + * @kref: object. + * @count: Number of recounts to subtract. + * @release: pointer to the function that will clean up the object when the + *	     last reference to the object is released. + *	     This pointer is required, and it is not acceptable to pass kfree + *	     in as this function.  If the caller does pass kfree to this + *	     function, you will be publicly mocked mercilessly by the kref + *	     maintainer, and anyone else who happens to notice it.  You have + *	     been warned. + * + * Subtract @count from the refcount, and if 0, call release(). + * Return 1 if the object was removed, otherwise return 0.  Beware, if this + * function returns 0, you still can not count on the kref from remaining in + * memory.  Only use the return value if you want to see if the kref is now + * gone, not present. + */ +static inline int kref_sub(struct kref *kref, unsigned int count, +	     void (*release)(struct kref *kref)) +{ +	WARN_ON(release == NULL); + +	if (atomic_sub_and_test((int) count, &kref->refcount)) { +		release(kref); +		return 1; +	} +	return 0; +} + +/** + * kref_put - decrement refcount for object. + * @kref: object. + * @release: pointer to the function that will clean up the object when the + *	     last reference to the object is released. + *	     This pointer is required, and it is not acceptable to pass kfree + *	     in as this function.  If the caller does pass kfree to this + *	     function, you will be publicly mocked mercilessly by the kref + *	     maintainer, and anyone else who happens to notice it.  You have + *	     been warned. + * + * Decrement the refcount, and if 0, call release(). + * Return 1 if the object was removed, otherwise return 0.  Beware, if this + * function returns 0, you still can not count on the kref from remaining in + * memory.  Only use the return value if you want to see if the kref is now + * gone, not present. + */ +static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) +{ +	return kref_sub(kref, 1, release); +}  #endif /* _KREF_H_ */ diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 5cac19b3a26..0714b24c0e4 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -35,6 +35,7 @@ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),  void kthread_bind(struct task_struct *k, unsigned int cpu);  int kthread_stop(struct task_struct *k);  int kthread_should_stop(void); +bool kthread_freezable_should_stop(bool *was_frozen);  void *kthread_data(struct task_struct *k);  int kthreadd(void *unused); diff --git a/include/linux/kvm.h b/include/linux/kvm.h index f47fcd30273..68e67e50d02 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -555,9 +555,9 @@ struct kvm_ppc_pvinfo {  #define KVM_CAP_PPC_SMT 64  #define KVM_CAP_PPC_RMA	65  #define KVM_CAP_MAX_VCPUS 66       /* returns max vcpus per vm */ -#define KVM_CAP_PPC_HIOR 67  #define KVM_CAP_PPC_PAPR 68  #define KVM_CAP_S390_GMAP 71 +#define KVM_CAP_TSC_DEADLINE_TIMER 72  #ifdef KVM_CAP_IRQ_ROUTING diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index d5262319997..900c76337e8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -14,6 +14,7 @@  #include <linux/signal.h>  #include <linux/sched.h>  #include <linux/mm.h> +#include <linux/mmu_notifier.h>  #include <linux/preempt.h>  #include <linux/msi.h>  #include <linux/slab.h> @@ -50,6 +51,9 @@  #define KVM_REQ_APF_HALT          12  #define KVM_REQ_STEAL_UPDATE      13  #define KVM_REQ_NMI               14 +#define KVM_REQ_IMMEDIATE_EXIT    15 +#define KVM_REQ_PMU               16 +#define KVM_REQ_PMI               17  #define KVM_USERSPACE_IRQ_SOURCE_ID	0 @@ -179,6 +183,7 @@ struct kvm_memory_slot {  	unsigned long *rmap;  	unsigned long *dirty_bitmap;  	unsigned long *dirty_bitmap_head; +	unsigned long nr_dirty_pages;  	struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1];  	unsigned long userspace_addr;  	int user_alloc; @@ -224,11 +229,20 @@ struct kvm_irq_routing_table {};  #endif +#ifndef KVM_MEM_SLOTS_NUM +#define KVM_MEM_SLOTS_NUM (KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS) +#endif + +/* + * Note: + * memslots are not sorted by id anymore, please use id_to_memslot() + * to get the memslot by its id. + */  struct kvm_memslots { -	int nmemslots;  	u64 generation; -	struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + -					KVM_PRIVATE_MEM_SLOTS]; +	struct kvm_memory_slot memslots[KVM_MEM_SLOTS_NUM]; +	/* The mapping table from slot id to the index in memslots[]. */ +	int id_to_index[KVM_MEM_SLOTS_NUM];  };  struct kvm { @@ -239,7 +253,6 @@ struct kvm {  	struct srcu_struct srcu;  #ifdef CONFIG_KVM_APIC_ARCHITECTURE  	u32 bsp_vcpu_id; -	struct kvm_vcpu *bsp_vcpu;  #endif  	struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];  	atomic_t online_vcpus; @@ -302,6 +315,11 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)  	     (vcpup = kvm_get_vcpu(kvm, idx)) != NULL; \  	     idx++) +#define kvm_for_each_memslot(memslot, slots)	\ +	for (memslot = &slots->memslots[0];	\ +	      memslot < slots->memslots + KVM_MEM_SLOTS_NUM && memslot->npages;\ +		memslot++) +  int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id);  void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); @@ -314,6 +332,7 @@ void kvm_exit(void);  void kvm_get_kvm(struct kvm *kvm);  void kvm_put_kvm(struct kvm *kvm); +void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new);  static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)  { @@ -322,6 +341,18 @@ static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)  			|| lockdep_is_held(&kvm->slots_lock));  } +static inline struct kvm_memory_slot * +id_to_memslot(struct kvm_memslots *slots, int id) +{ +	int index = slots->id_to_index[id]; +	struct kvm_memory_slot *slot; + +	slot = &slots->memslots[index]; + +	WARN_ON(slot->id != id); +	return slot; +} +  #define HPA_MSB ((sizeof(hpa_t) * 8) - 1)  #define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB)  static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; } diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h index 47a070b0520..ff476ddaf31 100644 --- a/include/linux/kvm_para.h +++ b/include/linux/kvm_para.h @@ -35,4 +35,3 @@ static inline int kvm_para_has_feature(unsigned int feature)  }  #endif /* __KERNEL__ */  #endif /* __LINUX_KVM_PARA_H */ - diff --git a/include/linux/latencytop.h b/include/linux/latencytop.h index b0e99898527..e23121f9d82 100644 --- a/include/linux/latencytop.h +++ b/include/linux/latencytop.h @@ -10,6 +10,8 @@  #define _INCLUDE_GUARD_LATENCYTOP_H_  #include <linux/compiler.h> +struct task_struct; +  #ifdef CONFIG_LATENCYTOP  #define LT_SAVECOUNT		32 @@ -23,7 +25,6 @@ struct latency_record {  }; -struct task_struct;  extern int latencytop_enabled;  void __account_scheduler_latency(struct task_struct *task, int usecs, int inter); diff --git a/include/linux/leds-tca6507.h b/include/linux/leds-tca6507.h new file mode 100644 index 00000000000..dcabf4fa2ae --- /dev/null +++ b/include/linux/leds-tca6507.h @@ -0,0 +1,34 @@ +/* + * TCA6507 LED chip driver. + * + * Copyright (C) 2011 Neil Brown <neil@brown.name> + * + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __LINUX_TCA6507_H +#define __LINUX_TCA6507_H +#include <linux/leds.h> + +struct tca6507_platform_data { +	struct led_platform_data leds; +#ifdef CONFIG_GPIOLIB +	int gpio_base; +	void (*setup)(unsigned gpio_base, unsigned ngpio); +#endif +}; + +#define	TCA6507_MAKE_GPIO 1 +#endif /* __LINUX_TCA6507_H*/ diff --git a/include/linux/lglock.h b/include/linux/lglock.h index f549056fb20..87f402ccec5 100644 --- a/include/linux/lglock.h +++ b/include/linux/lglock.h @@ -22,6 +22,7 @@  #include <linux/spinlock.h>  #include <linux/lockdep.h>  #include <linux/percpu.h> +#include <linux/cpu.h>  /* can make br locks by using local lock for read side, global lock for write */  #define br_lock_init(name)	name##_lock_init() @@ -72,9 +73,31 @@  #define DEFINE_LGLOCK(name)						\  									\ + DEFINE_SPINLOCK(name##_cpu_lock);					\ + cpumask_t name##_cpus __read_mostly;					\   DEFINE_PER_CPU(arch_spinlock_t, name##_lock);				\   DEFINE_LGLOCK_LOCKDEP(name);						\  									\ + static int								\ + name##_lg_cpu_callback(struct notifier_block *nb,			\ +				unsigned long action, void *hcpu)	\ + {									\ +	switch (action & ~CPU_TASKS_FROZEN) {				\ +	case CPU_UP_PREPARE:						\ +		spin_lock(&name##_cpu_lock);				\ +		cpu_set((unsigned long)hcpu, name##_cpus);		\ +		spin_unlock(&name##_cpu_lock);				\ +		break;							\ +	case CPU_UP_CANCELED: case CPU_DEAD:				\ +		spin_lock(&name##_cpu_lock);				\ +		cpu_clear((unsigned long)hcpu, name##_cpus);		\ +		spin_unlock(&name##_cpu_lock);				\ +	}								\ +	return NOTIFY_OK;						\ + }									\ + static struct notifier_block name##_lg_cpu_notifier = {		\ +	.notifier_call = name##_lg_cpu_callback,			\ + };									\   void name##_lock_init(void) {						\  	int i;								\  	LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ @@ -83,6 +106,11 @@  		lock = &per_cpu(name##_lock, i);			\  		*lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;	\  	}								\ +	register_hotcpu_notifier(&name##_lg_cpu_notifier);		\ +	get_online_cpus();						\ +	for_each_online_cpu(i)						\ +		cpu_set(i, name##_cpus);				\ +	put_online_cpus();						\   }									\   EXPORT_SYMBOL(name##_lock_init);					\  									\ @@ -124,9 +152,9 @@  									\   void name##_global_lock_online(void) {					\  	int i;								\ -	preempt_disable();						\ +	spin_lock(&name##_cpu_lock);					\  	rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_);		\ -	for_each_online_cpu(i) {					\ +	for_each_cpu(i, &name##_cpus) {					\  		arch_spinlock_t *lock;					\  		lock = &per_cpu(name##_lock, i);			\  		arch_spin_lock(lock);					\ @@ -137,12 +165,12 @@   void name##_global_unlock_online(void) {				\  	int i;								\  	rwlock_release(&name##_lock_dep_map, 1, _RET_IP_);		\ -	for_each_online_cpu(i) {					\ +	for_each_cpu(i, &name##_cpus) {					\  		arch_spinlock_t *lock;					\  		lock = &per_cpu(name##_lock, i);			\  		arch_spin_unlock(lock);					\  	}								\ -	preempt_enable();						\ +	spin_unlock(&name##_cpu_lock);					\   }									\   EXPORT_SYMBOL(name##_global_unlock_online);				\  									\ diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 3f46aedea42..807f1e53322 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -88,8 +88,4 @@  #endif -#define NORET_TYPE    /**/ -#define ATTRIB_NORET  __attribute__((noreturn)) -#define NORET_AND     noreturn, -  #endif diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index ff9abff55aa..88a114fce47 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -195,7 +195,7 @@ extern struct svc_procedure	nlmsvc_procedures4[];  #endif  extern int			nlmsvc_grace_period;  extern unsigned long		nlmsvc_timeout; -extern int			nsm_use_hostnames; +extern bool			nsm_use_hostnames;  extern u32			nsm_local_state;  /* @@ -301,7 +301,7 @@ static inline int __nlm_privileged_request4(const struct sockaddr *sap)  	return ipv4_is_loopback(sin->sin_addr.s_addr);  } -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  static inline int __nlm_privileged_request6(const struct sockaddr *sap)  {  	const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; @@ -314,12 +314,12 @@ static inline int __nlm_privileged_request6(const struct sockaddr *sap)  	return ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK;  } -#else	/* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ +#else	/* IS_ENABLED(CONFIG_IPV6) */  static inline int __nlm_privileged_request6(const struct sockaddr *sap)  {  	return 0;  } -#endif	/* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ +#endif	/* IS_ENABLED(CONFIG_IPV6) */  /*   * Ensure incoming requests are from local privileged callers. diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index b6a56e37284..d36619ead3b 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -343,6 +343,8 @@ extern void lockdep_trace_alloc(gfp_t mask);  #define lockdep_assert_held(l)	WARN_ON(debug_locks && !lockdep_is_held(l)) +#define lockdep_recursing(tsk)	((tsk)->lockdep_recursion) +  #else /* !LOCKDEP */  static inline void lockdep_off(void) @@ -392,6 +394,8 @@ struct lock_class_key { };  #define lockdep_assert_held(l)			do { } while (0) +#define lockdep_recursing(tsk)			(0) +  #endif /* !LOCKDEP */  #ifdef CONFIG_LOCK_STAT diff --git a/include/linux/log2.h b/include/linux/log2.h index 25b808631cd..fd7ff3d91e6 100644 --- a/include/linux/log2.h +++ b/include/linux/log2.h @@ -185,7 +185,6 @@ unsigned long __rounddown_pow_of_two(unsigned long n)  #define rounddown_pow_of_two(n)			\  (						\  	__builtin_constant_p(n) ? (		\ -		(n == 1) ? 0 :			\  		(1UL << ilog2(n))) :		\  	__rounddown_pow_of_two(n)		\   ) diff --git a/include/linux/lp8727.h b/include/linux/lp8727.h new file mode 100644 index 00000000000..d21fa2865bf --- /dev/null +++ b/include/linux/lp8727.h @@ -0,0 +1,51 @@ +/* + *			Copyright (C) 2011 National Semiconductor + * + * 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 _LP8727_H +#define _LP8727_H + +enum lp8727_eoc_level { +	EOC_5P, +	EOC_10P, +	EOC_16P, +	EOC_20P, +	EOC_25P, +	EOC_33P, +	EOC_50P, +}; + +enum lp8727_ichg { +	ICHG_90mA, +	ICHG_100mA, +	ICHG_400mA, +	ICHG_450mA, +	ICHG_500mA, +	ICHG_600mA, +	ICHG_700mA, +	ICHG_800mA, +	ICHG_900mA, +	ICHG_1000mA, +}; + +struct lp8727_chg_param { +	/* end of charge level setting */ +	enum lp8727_eoc_level eoc_level; +	/* charging current */ +	enum lp8727_ichg ichg; +}; + +struct lp8727_platform_data { +	u8 (*get_batt_present)(void); +	u16 (*get_batt_level)(void); +	u8 (*get_batt_capacity)(void); +	u8 (*get_batt_temp)(void); +	struct lp8727_chg_param ac; +	struct lp8727_chg_param usb; +}; + +#endif diff --git a/include/linux/mbus.h b/include/linux/mbus.h index c11ff293254..efa1a6d7aca 100644 --- a/include/linux/mbus.h +++ b/include/linux/mbus.h @@ -32,5 +32,16 @@ struct mbus_dram_target_info  	} cs[4];  }; - +/* + * The Marvell mbus is to be found only on SOCs from the Orion family + * at the moment.  Provide a dummy stub for other architectures. + */ +#ifdef CONFIG_PLAT_ORION +extern const struct mbus_dram_target_info *mv_mbus_dram_info(void); +#else +static inline const struct mbus_dram_target_info *mv_mbus_dram_info(void) +{ +	return NULL; +} +#endif  #endif diff --git a/include/linux/mdio-bitbang.h b/include/linux/mdio-bitbang.h index 0fe00cd4c93..76f52bbbb2f 100644 --- a/include/linux/mdio-bitbang.h +++ b/include/linux/mdio-bitbang.h @@ -32,6 +32,8 @@ struct mdiobb_ops {  struct mdiobb_ctrl {  	const struct mdiobb_ops *ops; +	/* reset callback */ +	int (*reset)(struct mii_bus *bus);  };  /* The returned bus is not yet registered with the phy layer. */ diff --git a/include/linux/mdio-gpio.h b/include/linux/mdio-gpio.h index e9d3fdfe41d..7c9fe3c2be7 100644 --- a/include/linux/mdio-gpio.h +++ b/include/linux/mdio-gpio.h @@ -20,6 +20,8 @@ struct mdio_gpio_platform_data {  	unsigned int phy_mask;  	int irqs[PHY_MAX_ADDR]; +	/* reset callback */ +	int (*reset)(struct mii_bus *bus);  };  #endif /* __LINUX_MDIO_GPIO_H */ diff --git a/include/linux/memblock.h b/include/linux/memblock.h index e6b843e16e8..a6bb1023514 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -2,8 +2,6 @@  #define _LINUX_MEMBLOCK_H  #ifdef __KERNEL__ -#define MEMBLOCK_ERROR	0 -  #ifdef CONFIG_HAVE_MEMBLOCK  /*   * Logical memory blocks. @@ -19,81 +17,161 @@  #include <linux/init.h>  #include <linux/mm.h> -#include <asm/memblock.h> -  #define INIT_MEMBLOCK_REGIONS	128  struct memblock_region {  	phys_addr_t base;  	phys_addr_t size; +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP +	int nid; +#endif  };  struct memblock_type {  	unsigned long cnt;	/* number of regions */  	unsigned long max;	/* size of the allocated array */ +	phys_addr_t total_size;	/* size of all regions */  	struct memblock_region *regions;  };  struct memblock {  	phys_addr_t current_limit; -	phys_addr_t memory_size;	/* Updated by memblock_analyze() */  	struct memblock_type memory;  	struct memblock_type reserved;  };  extern struct memblock memblock;  extern int memblock_debug; -extern int memblock_can_resize;  #define memblock_dbg(fmt, ...) \  	if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) -u64 memblock_find_in_range(u64 start, u64 end, u64 size, u64 align); +phys_addr_t memblock_find_in_range_node(phys_addr_t start, phys_addr_t end, +				phys_addr_t size, phys_addr_t align, int nid); +phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end, +				   phys_addr_t size, phys_addr_t align);  int memblock_free_reserved_regions(void);  int memblock_reserve_reserved_regions(void); -extern void memblock_init(void); -extern void memblock_analyze(void); -extern long memblock_add(phys_addr_t base, phys_addr_t size); -extern long memblock_remove(phys_addr_t base, phys_addr_t size); -extern long memblock_free(phys_addr_t base, phys_addr_t size); -extern long memblock_reserve(phys_addr_t base, phys_addr_t size); +void memblock_allow_resize(void); +int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid); +int memblock_add(phys_addr_t base, phys_addr_t size); +int memblock_remove(phys_addr_t base, phys_addr_t size); +int memblock_free(phys_addr_t base, phys_addr_t size); +int memblock_reserve(phys_addr_t base, phys_addr_t size); + +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP +void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn, +			  unsigned long *out_end_pfn, int *out_nid); + +/** + * for_each_mem_pfn_range - early memory pfn range iterator + * @i: an integer used as loop variable + * @nid: node selector, %MAX_NUMNODES for all nodes + * @p_start: ptr to ulong for start pfn of the range, can be %NULL + * @p_end: ptr to ulong for end pfn of the range, can be %NULL + * @p_nid: ptr to int for nid of the range, can be %NULL + * + * Walks over configured memory ranges.  Available after early_node_map is + * populated. + */ +#define for_each_mem_pfn_range(i, nid, p_start, p_end, p_nid)		\ +	for (i = -1, __next_mem_pfn_range(&i, nid, p_start, p_end, p_nid); \ +	     i >= 0; __next_mem_pfn_range(&i, nid, p_start, p_end, p_nid)) +#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ + +void __next_free_mem_range(u64 *idx, int nid, phys_addr_t *out_start, +			   phys_addr_t *out_end, int *out_nid); + +/** + * for_each_free_mem_range - iterate through free memblock areas + * @i: u64 used as loop variable + * @nid: node selector, %MAX_NUMNODES for all nodes + * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL + * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL + * @p_nid: ptr to int for nid of the range, can be %NULL + * + * Walks over free (memory && !reserved) areas of memblock.  Available as + * soon as memblock is initialized. + */ +#define for_each_free_mem_range(i, nid, p_start, p_end, p_nid)		\ +	for (i = 0,							\ +	     __next_free_mem_range(&i, nid, p_start, p_end, p_nid);	\ +	     i != (u64)ULLONG_MAX;					\ +	     __next_free_mem_range(&i, nid, p_start, p_end, p_nid)) + +void __next_free_mem_range_rev(u64 *idx, int nid, phys_addr_t *out_start, +			       phys_addr_t *out_end, int *out_nid); -/* The numa aware allocator is only available if - * CONFIG_ARCH_POPULATES_NODE_MAP is set +/** + * for_each_free_mem_range_reverse - rev-iterate through free memblock areas + * @i: u64 used as loop variable + * @nid: node selector, %MAX_NUMNODES for all nodes + * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL + * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL + * @p_nid: ptr to int for nid of the range, can be %NULL + * + * Walks over free (memory && !reserved) areas of memblock in reverse + * order.  Available as soon as memblock is initialized.   */ -extern phys_addr_t memblock_alloc_nid(phys_addr_t size, phys_addr_t align, -					int nid); -extern phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align, -					    int nid); +#define for_each_free_mem_range_reverse(i, nid, p_start, p_end, p_nid)	\ +	for (i = (u64)ULLONG_MAX,					\ +	     __next_free_mem_range_rev(&i, nid, p_start, p_end, p_nid);	\ +	     i != (u64)ULLONG_MAX;					\ +	     __next_free_mem_range_rev(&i, nid, p_start, p_end, p_nid)) -extern phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align); +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP +int memblock_set_node(phys_addr_t base, phys_addr_t size, int nid); + +static inline void memblock_set_region_node(struct memblock_region *r, int nid) +{ +	r->nid = nid; +} + +static inline int memblock_get_region_node(const struct memblock_region *r) +{ +	return r->nid; +} +#else +static inline void memblock_set_region_node(struct memblock_region *r, int nid) +{ +} + +static inline int memblock_get_region_node(const struct memblock_region *r) +{ +	return 0; +} +#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ + +phys_addr_t memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int nid); +phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid); + +phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align);  /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */  #define MEMBLOCK_ALLOC_ANYWHERE	(~(phys_addr_t)0)  #define MEMBLOCK_ALLOC_ACCESSIBLE	0 -extern phys_addr_t memblock_alloc_base(phys_addr_t size, -					 phys_addr_t align, -					 phys_addr_t max_addr); -extern phys_addr_t __memblock_alloc_base(phys_addr_t size, -					   phys_addr_t align, -					   phys_addr_t max_addr); -extern phys_addr_t memblock_phys_mem_size(void); -extern phys_addr_t memblock_start_of_DRAM(void); -extern phys_addr_t memblock_end_of_DRAM(void); -extern void memblock_enforce_memory_limit(phys_addr_t memory_limit); -extern int memblock_is_memory(phys_addr_t addr); -extern int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); -extern int memblock_is_reserved(phys_addr_t addr); -extern int memblock_is_region_reserved(phys_addr_t base, phys_addr_t size); +phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align, +				phys_addr_t max_addr); +phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, +				  phys_addr_t max_addr); +phys_addr_t memblock_phys_mem_size(void); +phys_addr_t memblock_start_of_DRAM(void); +phys_addr_t memblock_end_of_DRAM(void); +void memblock_enforce_memory_limit(phys_addr_t memory_limit); +int memblock_is_memory(phys_addr_t addr); +int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); +int memblock_is_reserved(phys_addr_t addr); +int memblock_is_region_reserved(phys_addr_t base, phys_addr_t size); -extern void memblock_dump_all(void); +extern void __memblock_dump_all(void); -/* Provided by the architecture */ -extern phys_addr_t memblock_nid_range(phys_addr_t start, phys_addr_t end, int *nid); -extern int memblock_memory_can_coalesce(phys_addr_t addr1, phys_addr_t size1, -				   phys_addr_t addr2, phys_addr_t size2); +static inline void memblock_dump_all(void) +{ +	if (memblock_debug) +		__memblock_dump_all(); +}  /**   * memblock_set_current_limit - Set the current allocation limit to allow @@ -101,7 +179,7 @@ extern int memblock_memory_can_coalesce(phys_addr_t addr1, phys_addr_t size1,   *                         accessible during boot   * @limit: New limit value (physical address)   */ -extern void memblock_set_current_limit(phys_addr_t limit); +void memblock_set_current_limit(phys_addr_t limit);  /* @@ -154,9 +232,9 @@ static inline unsigned long memblock_region_reserved_end_pfn(const struct memblo  	     region++) -#ifdef ARCH_DISCARD_MEMBLOCK -#define __init_memblock __init -#define __initdata_memblock __initdata +#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK +#define __init_memblock __meminit +#define __initdata_memblock __meminitdata  #else  #define __init_memblock  #define __initdata_memblock @@ -165,7 +243,7 @@ static inline unsigned long memblock_region_reserved_end_pfn(const struct memblo  #else  static inline phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align)  { -	return MEMBLOCK_ERROR; +	return 0;  }  #endif /* CONFIG_HAVE_MEMBLOCK */ diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index b87068a1a09..4d34356fe64 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -32,13 +32,11 @@ enum mem_cgroup_page_stat_item {  	MEMCG_NR_FILE_MAPPED, /* # of pages charged as file rss */  }; -extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, -					struct list_head *dst, -					unsigned long *scanned, int order, -					isolate_mode_t mode, -					struct zone *z, -					struct mem_cgroup *mem_cont, -					int active, int file); +struct mem_cgroup_reclaim_cookie { +	struct zone *zone; +	int priority; +	unsigned int generation; +};  #ifdef CONFIG_CGROUP_MEM_RES_CTLR  /* @@ -56,20 +54,21 @@ extern int mem_cgroup_newpage_charge(struct page *page, struct mm_struct *mm,  				gfp_t gfp_mask);  /* for swap handling */  extern int mem_cgroup_try_charge_swapin(struct mm_struct *mm, -		struct page *page, gfp_t mask, struct mem_cgroup **ptr); +		struct page *page, gfp_t mask, struct mem_cgroup **memcgp);  extern void mem_cgroup_commit_charge_swapin(struct page *page, -					struct mem_cgroup *ptr); -extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr); +					struct mem_cgroup *memcg); +extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg);  extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,  					gfp_t gfp_mask); -extern void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru); -extern void mem_cgroup_del_lru_list(struct page *page, enum lru_list lru); -extern void mem_cgroup_rotate_reclaimable_page(struct page *page); -extern void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru); -extern void mem_cgroup_del_lru(struct page *page); -extern void mem_cgroup_move_lists(struct page *page, -				  enum lru_list from, enum lru_list to); + +struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); +struct lruvec *mem_cgroup_lru_add_list(struct zone *, struct page *, +				       enum lru_list); +void mem_cgroup_lru_del_list(struct page *, enum lru_list); +void mem_cgroup_lru_del(struct page *); +struct lruvec *mem_cgroup_lru_move_lists(struct zone *, struct page *, +					 enum lru_list, enum lru_list);  /* For coalescing uncharge for reducing memcg' overhead*/  extern void mem_cgroup_uncharge_start(void); @@ -85,6 +84,9 @@ extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);  extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);  extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm); +extern struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg); +extern struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont); +  static inline  int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup)  { @@ -99,10 +101,15 @@ extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);  extern int  mem_cgroup_prepare_migration(struct page *page, -	struct page *newpage, struct mem_cgroup **ptr, gfp_t gfp_mask); +	struct page *newpage, struct mem_cgroup **memcgp, gfp_t gfp_mask);  extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,  	struct page *oldpage, struct page *newpage, bool migration_ok); +struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *, +				   struct mem_cgroup *, +				   struct mem_cgroup_reclaim_cookie *); +void mem_cgroup_iter_break(struct mem_cgroup *, struct mem_cgroup *); +  /*   * For memory reclaim.   */ @@ -119,7 +126,10 @@ struct zone_reclaim_stat*  mem_cgroup_get_reclaim_stat_from_page(struct page *page);  extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,  					struct task_struct *p); +extern void mem_cgroup_replace_page_cache(struct page *oldpage, +					struct page *newpage); +extern void mem_cgroup_reset_owner(struct page *page);  #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP  extern int do_swap_account;  #endif @@ -154,7 +164,7 @@ u64 mem_cgroup_get_limit(struct mem_cgroup *memcg);  void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);  #ifdef CONFIG_TRANSPARENT_HUGEPAGE -void mem_cgroup_split_huge_fixup(struct page *head, struct page *tail); +void mem_cgroup_split_huge_fixup(struct page *head);  #endif  #ifdef CONFIG_DEBUG_VM @@ -177,17 +187,17 @@ static inline int mem_cgroup_cache_charge(struct page *page,  }  static inline int mem_cgroup_try_charge_swapin(struct mm_struct *mm, -		struct page *page, gfp_t gfp_mask, struct mem_cgroup **ptr) +		struct page *page, gfp_t gfp_mask, struct mem_cgroup **memcgp)  {  	return 0;  }  static inline void mem_cgroup_commit_charge_swapin(struct page *page, -					  struct mem_cgroup *ptr) +					  struct mem_cgroup *memcg)  {  } -static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr) +static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)  {  } @@ -207,33 +217,33 @@ static inline void mem_cgroup_uncharge_cache_page(struct page *page)  {  } -static inline void mem_cgroup_add_lru_list(struct page *page, int lru) +static inline struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone, +						    struct mem_cgroup *memcg)  { +	return &zone->lruvec;  } -static inline void mem_cgroup_del_lru_list(struct page *page, int lru) +static inline struct lruvec *mem_cgroup_lru_add_list(struct zone *zone, +						     struct page *page, +						     enum lru_list lru)  { -	return ; +	return &zone->lruvec;  } -static inline void mem_cgroup_rotate_reclaimable_page(struct page *page) +static inline void mem_cgroup_lru_del_list(struct page *page, enum lru_list lru)  { -	return ;  } -static inline void mem_cgroup_rotate_lru_list(struct page *page, int lru) +static inline void mem_cgroup_lru_del(struct page *page)  { -	return ;  } -static inline void mem_cgroup_del_lru(struct page *page) -{ -	return ; -} - -static inline void -mem_cgroup_move_lists(struct page *page, enum lru_list from, enum lru_list to) +static inline struct lruvec *mem_cgroup_lru_move_lists(struct zone *zone, +						       struct page *page, +						       enum lru_list from, +						       enum lru_list to)  { +	return &zone->lruvec;  }  static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) @@ -266,7 +276,7 @@ static inline struct cgroup_subsys_state  static inline int  mem_cgroup_prepare_migration(struct page *page, struct page *newpage, -	struct mem_cgroup **ptr, gfp_t gfp_mask) +	struct mem_cgroup **memcgp, gfp_t gfp_mask)  {  	return 0;  } @@ -276,6 +286,19 @@ static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,  {  } +static inline struct mem_cgroup * +mem_cgroup_iter(struct mem_cgroup *root, +		struct mem_cgroup *prev, +		struct mem_cgroup_reclaim_cookie *reclaim) +{ +	return NULL; +} + +static inline void mem_cgroup_iter_break(struct mem_cgroup *root, +					 struct mem_cgroup *prev) +{ +} +  static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *memcg)  {  	return 0; @@ -357,8 +380,7 @@ u64 mem_cgroup_get_limit(struct mem_cgroup *memcg)  	return 0;  } -static inline void mem_cgroup_split_huge_fixup(struct page *head, -						struct page *tail) +static inline void mem_cgroup_split_huge_fixup(struct page *head)  {  } @@ -366,6 +388,14 @@ static inline  void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)  {  } +static inline void mem_cgroup_replace_page_cache(struct page *oldpage, +				struct page *newpage) +{ +} + +static inline void mem_cgroup_reset_owner(struct page *page) +{ +}  #endif /* CONFIG_CGROUP_MEM_CONT */  #if !defined(CONFIG_CGROUP_MEM_RES_CTLR) || !defined(CONFIG_DEBUG_VM) @@ -381,5 +411,23 @@ mem_cgroup_print_bad_page(struct page *page)  }  #endif +enum { +	UNDER_LIMIT, +	SOFT_LIMIT, +	OVER_LIMIT, +}; + +struct sock; +#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM +void sock_update_memcg(struct sock *sk); +void sock_release_memcg(struct sock *sk); +#else +static inline void sock_update_memcg(struct sock *sk) +{ +} +static inline void sock_release_memcg(struct sock *sk) +{ +} +#endif /* CONFIG_CGROUP_MEM_RES_CTLR_KMEM */  #endif /* _LINUX_MEMCONTROL_H */ diff --git a/include/linux/memory.h b/include/linux/memory.h index 935699b30b7..1ac7f6e405f 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -15,7 +15,6 @@  #ifndef _LINUX_MEMORY_H_  #define _LINUX_MEMORY_H_ -#include <linux/sysdev.h>  #include <linux/node.h>  #include <linux/compiler.h>  #include <linux/mutex.h> @@ -38,7 +37,7 @@ struct memory_block {  	int phys_device;		/* to which fru does this belong? */  	void *hw;			/* optional pointer to fw/hw data */  	int (*phys_callback)(struct memory_block *); -	struct sys_device sysdev; +	struct device dev;  };  int arch_get_memory_phys_device(unsigned long start_pfn); diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 7978eec1b7d..7c727a90d70 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h @@ -164,11 +164,11 @@ static inline void mpol_get(struct mempolicy *pol)  		atomic_inc(&pol->refcnt);  } -extern int __mpol_equal(struct mempolicy *a, struct mempolicy *b); -static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b) +extern bool __mpol_equal(struct mempolicy *a, struct mempolicy *b); +static inline bool mpol_equal(struct mempolicy *a, struct mempolicy *b)  {  	if (a == b) -		return 1; +		return true;  	return __mpol_equal(a, b);  } @@ -257,9 +257,9 @@ static inline int vma_migratable(struct vm_area_struct *vma)  struct mempolicy {}; -static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b) +static inline bool mpol_equal(struct mempolicy *a, struct mempolicy *b)  { -	return 1; +	return true;  }  static inline void mpol_put(struct mempolicy *p) diff --git a/include/linux/mfd/88pm860x.h b/include/linux/mfd/88pm860x.h index 63b4fb8e3b6..92be3476c9f 100644 --- a/include/linux/mfd/88pm860x.h +++ b/include/linux/mfd/88pm860x.h @@ -297,10 +297,11 @@ enum {  struct pm860x_chip {  	struct device		*dev; -	struct mutex		io_lock;  	struct mutex		irq_lock;  	struct i2c_client	*client;  	struct i2c_client	*companion;	/* companion chip client */ +	struct regmap           *regmap; +	struct regmap           *regmap_companion;  	int			buck3_double;	/* DVC ramp slope double */  	unsigned short		companion_addr; diff --git a/include/linux/mfd/ab5500/ab5500.h b/include/linux/mfd/abx500/ab5500.h index a720051ae93..a720051ae93 100644 --- a/include/linux/mfd/ab5500/ab5500.h +++ b/include/linux/mfd/abx500/ab5500.h diff --git a/include/linux/mfd/ab8500/gpadc.h b/include/linux/mfd/abx500/ab8500-gpadc.h index 252966769d9..252966769d9 100644 --- a/include/linux/mfd/ab8500/gpadc.h +++ b/include/linux/mfd/abx500/ab8500-gpadc.h diff --git a/include/linux/mfd/ab8500/gpio.h b/include/linux/mfd/abx500/ab8500-gpio.h index 488a8c920a2..488a8c920a2 100644 --- a/include/linux/mfd/ab8500/gpio.h +++ b/include/linux/mfd/abx500/ab8500-gpio.h diff --git a/include/linux/mfd/ab8500/sysctrl.h b/include/linux/mfd/abx500/ab8500-sysctrl.h index 10da0291f8f..10da0291f8f 100644 --- a/include/linux/mfd/ab8500/sysctrl.h +++ b/include/linux/mfd/abx500/ab8500-sysctrl.h diff --git a/include/linux/mfd/ab8500.h b/include/linux/mfd/abx500/ab8500.h index 838c6b487cc..838c6b487cc 100644 --- a/include/linux/mfd/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h diff --git a/include/linux/mfd/da9052/da9052.h b/include/linux/mfd/da9052/da9052.h new file mode 100644 index 00000000000..5702d1be13b --- /dev/null +++ b/include/linux/mfd/da9052/da9052.h @@ -0,0 +1,131 @@ +/* + * da9052 declarations for DA9052 PMICs. + * + * Copyright(c) 2011 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen <dchen@diasemi.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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __MFD_DA9052_DA9052_H +#define __MFD_DA9052_DA9052_H + +#include <linux/interrupt.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/completion.h> +#include <linux/list.h> +#include <linux/mfd/core.h> + +#include <linux/mfd/da9052/reg.h> + +#define DA9052_IRQ_DCIN	0 +#define DA9052_IRQ_VBUS	1 +#define DA9052_IRQ_DCINREM	2 +#define DA9052_IRQ_VBUSREM	3 +#define DA9052_IRQ_VDDLOW	4 +#define DA9052_IRQ_ALARM	5 +#define DA9052_IRQ_SEQRDY	6 +#define DA9052_IRQ_COMP1V2	7 +#define DA9052_IRQ_NONKEY	8 +#define DA9052_IRQ_IDFLOAT	9 +#define DA9052_IRQ_IDGND	10 +#define DA9052_IRQ_CHGEND	11 +#define DA9052_IRQ_TBAT	12 +#define DA9052_IRQ_ADC_EOM	13 +#define DA9052_IRQ_PENDOWN	14 +#define DA9052_IRQ_TSIREADY	15 +#define DA9052_IRQ_GPI0	16 +#define DA9052_IRQ_GPI1	17 +#define DA9052_IRQ_GPI2	18 +#define DA9052_IRQ_GPI3	19 +#define DA9052_IRQ_GPI4	20 +#define DA9052_IRQ_GPI5	21 +#define DA9052_IRQ_GPI6	22 +#define DA9052_IRQ_GPI7	23 +#define DA9052_IRQ_GPI8	24 +#define DA9052_IRQ_GPI9	25 +#define DA9052_IRQ_GPI10	26 +#define DA9052_IRQ_GPI11	27 +#define DA9052_IRQ_GPI12	28 +#define DA9052_IRQ_GPI13	29 +#define DA9052_IRQ_GPI14	30 +#define DA9052_IRQ_GPI15	31 + +enum da9052_chip_id { +	DA9052, +	DA9053_AA, +	DA9053_BA, +	DA9053_BB, +}; + +struct da9052_pdata; + +struct da9052 { +	struct mutex io_lock; + +	struct device *dev; +	struct regmap *regmap; + +	int irq_base; +	u8 chip_id; + +	int chip_irq; +}; + +/* Device I/O API */ +static inline int da9052_reg_read(struct da9052 *da9052, unsigned char reg) +{ +	int val, ret; + +	ret = regmap_read(da9052->regmap, reg, &val); +	if (ret < 0) +		return ret; +	return val; +} + +static inline int da9052_reg_write(struct da9052 *da9052, unsigned char reg, +				    unsigned char val) +{ +	return regmap_write(da9052->regmap, reg, val); +} + +static inline int da9052_group_read(struct da9052 *da9052, unsigned char reg, +				     unsigned reg_cnt, unsigned char *val) +{ +	return regmap_bulk_read(da9052->regmap, reg, val, reg_cnt); +} + +static inline int da9052_group_write(struct da9052 *da9052, unsigned char reg, +				      unsigned reg_cnt, unsigned char *val) +{ +	return regmap_raw_write(da9052->regmap, reg, val, reg_cnt); +} + +static inline int da9052_reg_update(struct da9052 *da9052, unsigned char reg, +				     unsigned char bit_mask, +				     unsigned char reg_val) +{ +	return regmap_update_bits(da9052->regmap, reg, bit_mask, reg_val); +} + +int da9052_device_init(struct da9052 *da9052, u8 chip_id); +void da9052_device_exit(struct da9052 *da9052); + +extern struct regmap_config da9052_regmap_config; + +#endif /* __MFD_DA9052_DA9052_H */ diff --git a/include/linux/mfd/da9052/pdata.h b/include/linux/mfd/da9052/pdata.h new file mode 100644 index 00000000000..62c5c3c2992 --- /dev/null +++ b/include/linux/mfd/da9052/pdata.h @@ -0,0 +1,40 @@ +/* + * Platform data declarations for DA9052 PMICs. + * + * Copyright(c) 2011 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen <dchen@diasemi.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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __MFD_DA9052_PDATA_H__ +#define __MFD_DA9052_PDATA_H__ + +#define DA9052_MAX_REGULATORS	14 + +struct da9052; + +struct da9052_pdata { +	struct led_platform_data *pled; +	int (*init) (struct da9052 *da9052); +	int irq_base; +	int gpio_base; +	int use_for_apm; +	struct regulator_init_data *regulators[DA9052_MAX_REGULATORS]; +}; + +#endif diff --git a/include/linux/mfd/da9052/reg.h b/include/linux/mfd/da9052/reg.h new file mode 100644 index 00000000000..b97f7309d7f --- /dev/null +++ b/include/linux/mfd/da9052/reg.h @@ -0,0 +1,749 @@ +/* + * Register declarations for DA9052 PMICs. + * + * Copyright(c) 2011 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen <dchen@diasemi.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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __LINUX_MFD_DA9052_REG_H +#define __LINUX_MFD_DA9052_REG_H + +/* PAGE REGISTERS */ +#define DA9052_PAGE0_CON_REG		0 +#define DA9052_PAGE1_CON_REG		128 + +/* STATUS REGISTERS */ +#define DA9052_STATUS_A_REG		1 +#define DA9052_STATUS_B_REG		2 +#define DA9052_STATUS_C_REG		3 +#define DA9052_STATUS_D_REG		4 + +/* EVENT REGISTERS */ +#define DA9052_EVENT_A_REG		5 +#define DA9052_EVENT_B_REG		6 +#define DA9052_EVENT_C_REG		7 +#define DA9052_EVENT_D_REG		8 +#define DA9052_FAULTLOG_REG		9 + +/* IRQ REGISTERS */ +#define DA9052_IRQ_MASK_A_REG		10 +#define DA9052_IRQ_MASK_B_REG		11 +#define DA9052_IRQ_MASK_C_REG		12 +#define DA9052_IRQ_MASK_D_REG		13 + +/* CONTROL REGISTERS */ +#define DA9052_CONTROL_A_REG		14 +#define DA9052_CONTROL_B_REG		15 +#define DA9052_CONTROL_C_REG		16 +#define DA9052_CONTROL_D_REG		17 + +#define DA9052_PDDIS_REG		18 +#define DA9052_INTERFACE_REG		19 +#define DA9052_RESET_REG		20 + +/* GPIO REGISTERS */ +#define DA9052_GPIO_0_1_REG		21 +#define DA9052_GPIO_2_3_REG		22 +#define DA9052_GPIO_4_5_REG		23 +#define DA9052_GPIO_6_7_REG		24 +#define DA9052_GPIO_14_15_REG		28 + +/* POWER SEQUENCER CONTROL REGISTERS */ +#define DA9052_ID_0_1_REG		29 +#define DA9052_ID_2_3_REG		30 +#define DA9052_ID_4_5_REG		31 +#define DA9052_ID_6_7_REG		32 +#define DA9052_ID_8_9_REG		33 +#define DA9052_ID_10_11_REG		34 +#define DA9052_ID_12_13_REG		35 +#define DA9052_ID_14_15_REG		36 +#define DA9052_ID_16_17_REG		37 +#define DA9052_ID_18_19_REG		38 +#define DA9052_ID_20_21_REG		39 +#define DA9052_SEQ_STATUS_REG		40 +#define DA9052_SEQ_A_REG		41 +#define DA9052_SEQ_B_REG		42 +#define DA9052_SEQ_TIMER_REG		43 + +/* LDO AND BUCK REGISTERS */ +#define DA9052_BUCKA_REG		44 +#define DA9052_BUCKB_REG		45 +#define DA9052_BUCKCORE_REG		46 +#define DA9052_BUCKPRO_REG		47 +#define DA9052_BUCKMEM_REG		48 +#define DA9052_BUCKPERI_REG		49 +#define DA9052_LDO1_REG		50 +#define DA9052_LDO2_REG		51 +#define DA9052_LDO3_REG		52 +#define DA9052_LDO4_REG		53 +#define DA9052_LDO5_REG		54 +#define DA9052_LDO6_REG		55 +#define DA9052_LDO7_REG		56 +#define DA9052_LDO8_REG		57 +#define DA9052_LDO9_REG		58 +#define DA9052_LDO10_REG		59 +#define DA9052_SUPPLY_REG		60 +#define DA9052_PULLDOWN_REG		61 +#define DA9052_CHGBUCK_REG		62 +#define DA9052_WAITCONT_REG		63 +#define DA9052_ISET_REG		64 +#define DA9052_BATCHG_REG		65 + +/* BATTERY CONTROL REGISTRS */ +#define DA9052_CHG_CONT_REG		66 +#define DA9052_INPUT_CONT_REG		67 +#define DA9052_CHG_TIME_REG		68 +#define DA9052_BBAT_CONT_REG		69 + +/* LED CONTROL REGISTERS */ +#define DA9052_BOOST_REG		70 +#define DA9052_LED_CONT_REG		71 +#define DA9052_LEDMIN123_REG		72 +#define DA9052_LED1_CONF_REG		73 +#define DA9052_LED2_CONF_REG		74 +#define DA9052_LED3_CONF_REG		75 +#define DA9052_LED1CONT_REG		76 +#define DA9052_LED2CONT_REG		77 +#define DA9052_LED3CONT_REG		78 +#define DA9052_LED_CONT_4_REG		79 +#define DA9052_LED_CONT_5_REG		80 + +/* ADC CONTROL REGISTERS */ +#define DA9052_ADC_MAN_REG		81 +#define DA9052_ADC_CONT_REG		82 +#define DA9052_ADC_RES_L_REG		83 +#define DA9052_ADC_RES_H_REG		84 +#define DA9052_VDD_RES_REG		85 +#define DA9052_VDD_MON_REG		86 + +#define DA9052_ICHG_AV_REG		87 +#define DA9052_ICHG_THD_REG		88 +#define DA9052_ICHG_END_REG		89 +#define DA9052_TBAT_RES_REG		90 +#define DA9052_TBAT_HIGHP_REG		91 +#define DA9052_TBAT_HIGHN_REG		92 +#define DA9052_TBAT_LOW_REG		93 +#define DA9052_T_OFFSET_REG		94 + +#define DA9052_ADCIN4_RES_REG		95 +#define DA9052_AUTO4_HIGH_REG		96 +#define DA9052_AUTO4_LOW_REG		97 +#define DA9052_ADCIN5_RES_REG		98 +#define DA9052_AUTO5_HIGH_REG		99 +#define DA9052_AUTO5_LOW_REG		100 +#define DA9052_ADCIN6_RES_REG		101 +#define DA9052_AUTO6_HIGH_REG		102 +#define DA9052_AUTO6_LOW_REG		103 + +#define DA9052_TJUNC_RES_REG		104 + +/* TSI CONTROL REGISTERS */ +#define DA9052_TSI_CONT_A_REG		105 +#define DA9052_TSI_CONT_B_REG		106 +#define DA9052_TSI_X_MSB_REG		107 +#define DA9052_TSI_Y_MSB_REG		108 +#define DA9052_TSI_LSB_REG		109 +#define DA9052_TSI_Z_MSB_REG		110 + +/* RTC COUNT REGISTERS */ +#define DA9052_COUNT_S_REG		111 +#define DA9052_COUNT_MI_REG		112 +#define DA9052_COUNT_H_REG		113 +#define DA9052_COUNT_D_REG		114 +#define DA9052_COUNT_MO_REG		115 +#define DA9052_COUNT_Y_REG		116 + +/* RTC CONTROL REGISTERS */ +#define DA9052_ALARM_MI_REG		117 +#define DA9052_ALARM_H_REG		118 +#define DA9052_ALARM_D_REG		119 +#define DA9052_ALARM_MO_REG		120 +#define DA9052_ALARM_Y_REG		121 +#define DA9052_SECOND_A_REG		122 +#define DA9052_SECOND_B_REG		123 +#define DA9052_SECOND_C_REG		124 +#define DA9052_SECOND_D_REG		125 + +/* PAGE CONFIGURATION BIT */ +#define DA9052_PAGE_CONF		0X80 + +/* STATUS REGISTER A BITS */ +#define DA9052_STATUSA_VDATDET		0X80 +#define DA9052_STATUSA_VBUSSEL		0X40 +#define DA9052_STATUSA_DCINSEL		0X20 +#define DA9052_STATUSA_VBUSDET		0X10 +#define DA9052_STATUSA_DCINDET		0X08 +#define DA9052_STATUSA_IDGND		0X04 +#define DA9052_STATUSA_IDFLOAT		0X02 +#define DA9052_STATUSA_NONKEY		0X01 + +/* STATUS REGISTER B BITS */ +#define DA9052_STATUSB_COMPDET		0X80 +#define DA9052_STATUSB_SEQUENCING	0X40 +#define DA9052_STATUSB_GPFB2		0X20 +#define DA9052_STATUSB_CHGTO		0X10 +#define DA9052_STATUSB_CHGEND		0X08 +#define DA9052_STATUSB_CHGLIM		0X04 +#define DA9052_STATUSB_CHGPRE		0X02 +#define DA9052_STATUSB_CHGATT		0X01 + +/* STATUS REGISTER C BITS */ +#define DA9052_STATUSC_GPI7		0X80 +#define DA9052_STATUSC_GPI6		0X40 +#define DA9052_STATUSC_GPI5		0X20 +#define DA9052_STATUSC_GPI4		0X10 +#define DA9052_STATUSC_GPI3		0X08 +#define DA9052_STATUSC_GPI2		0X04 +#define DA9052_STATUSC_GPI1		0X02 +#define DA9052_STATUSC_GPI0		0X01 + +/* STATUS REGISTER D BITS */ +#define DA9052_STATUSD_GPI15		0X80 +#define DA9052_STATUSD_GPI14		0X40 +#define DA9052_STATUSD_GPI13		0X20 +#define DA9052_STATUSD_GPI12		0X10 +#define DA9052_STATUSD_GPI11		0X08 +#define DA9052_STATUSD_GPI10		0X04 +#define DA9052_STATUSD_GPI9		0X02 +#define DA9052_STATUSD_GPI8		0X01 + +/* EVENT REGISTER A BITS */ +#define DA9052_EVENTA_ECOMP1V2		0X80 +#define DA9052_EVENTA_ESEQRDY		0X40 +#define DA9052_EVENTA_EALRAM		0X20 +#define DA9052_EVENTA_EVDDLOW		0X10 +#define DA9052_EVENTA_EVBUSREM		0X08 +#define DA9052_EVENTA_EDCINREM		0X04 +#define DA9052_EVENTA_EVBUSDET		0X02 +#define DA9052_EVENTA_EDCINDET		0X01 + +/* EVENT REGISTER B BITS */ +#define DA9052_EVENTB_ETSIREADY	0X80 +#define DA9052_EVENTB_EPENDOWN		0X40 +#define DA9052_EVENTB_EADCEOM		0X20 +#define DA9052_EVENTB_ETBAT		0X10 +#define DA9052_EVENTB_ECHGEND		0X08 +#define DA9052_EVENTB_EIDGND		0X04 +#define DA9052_EVENTB_EIDFLOAT		0X02 +#define DA9052_EVENTB_ENONKEY		0X01 + +/* EVENT REGISTER C BITS */ +#define DA9052_EVENTC_EGPI7		0X80 +#define DA9052_EVENTC_EGPI6		0X40 +#define DA9052_EVENTC_EGPI5		0X20 +#define DA9052_EVENTC_EGPI4		0X10 +#define DA9052_EVENTC_EGPI3		0X08 +#define DA9052_EVENTC_EGPI2		0X04 +#define DA9052_EVENTC_EGPI1		0X02 +#define DA9052_EVENTC_EGPI0		0X01 + +/* EVENT REGISTER D BITS */ +#define DA9052_EVENTD_EGPI15		0X80 +#define DA9052_EVENTD_EGPI14		0X40 +#define DA9052_EVENTD_EGPI13		0X20 +#define DA9052_EVENTD_EGPI12		0X10 +#define DA9052_EVENTD_EGPI11		0X08 +#define DA9052_EVENTD_EGPI10		0X04 +#define DA9052_EVENTD_EGPI9		0X02 +#define DA9052_EVENTD_EGPI8		0X01 + +/* IRQ MASK REGISTERS BITS */ +#define DA9052_M_NONKEY		0X0100 + +/* TSI EVENT REGISTERS BITS */ +#define DA9052_E_PEN_DOWN		0X4000 +#define DA9052_E_TSI_READY		0X8000 + +/* FAULT LOG REGISTER BITS */ +#define DA9052_FAULTLOG_WAITSET	0X80 +#define DA9052_FAULTLOG_NSDSET		0X40 +#define DA9052_FAULTLOG_KEYSHUT	0X20 +#define DA9052_FAULTLOG_TEMPOVER	0X08 +#define DA9052_FAULTLOG_VDDSTART	0X04 +#define DA9052_FAULTLOG_VDDFAULT	0X02 +#define DA9052_FAULTLOG_TWDERROR	0X01 + +/* CONTROL REGISTER A BITS */ +#define DA9052_CONTROLA_GPIV		0X80 +#define DA9052_CONTROLA_PMOTYPE	0X20 +#define DA9052_CONTROLA_PMOV		0X10 +#define DA9052_CONTROLA_PMIV		0X08 +#define DA9052_CONTROLA_PMIFV		0X08 +#define DA9052_CONTROLA_PWR1EN		0X04 +#define DA9052_CONTROLA_PWREN		0X02 +#define DA9052_CONTROLA_SYSEN		0X01 + +/* CONTROL REGISTER B BITS */ +#define DA9052_CONTROLB_SHUTDOWN	0X80 +#define DA9052_CONTROLB_DEEPSLEEP	0X40 +#define DA9052_CONTROL_B_WRITEMODE	0X20 +#define DA9052_CONTROLB_BBATEN		0X10 +#define DA9052_CONTROLB_OTPREADEN	0X08 +#define DA9052_CONTROLB_AUTOBOOT	0X04 +#define DA9052_CONTROLB_ACTDIODE	0X02 +#define DA9052_CONTROLB_BUCKMERGE	0X01 + +/* CONTROL REGISTER C BITS */ +#define DA9052_CONTROLC_BLINKDUR	0X80 +#define DA9052_CONTROLC_BLINKFRQ	0X60 +#define DA9052_CONTROLC_DEBOUNCING	0X1C +#define DA9052_CONTROLC_PMFB2PIN	0X02 +#define DA9052_CONTROLC_PMFB1PIN	0X01 + +/* CONTROL REGISTER D BITS */ +#define DA9052_CONTROLD_WATCHDOG	0X80 +#define DA9052_CONTROLD_ACCDETEN	0X40 +#define DA9052_CONTROLD_GPI1415SD	0X20 +#define DA9052_CONTROLD_NONKEYSD	0X10 +#define DA9052_CONTROLD_KEEPACTEN	0X08 +#define DA9052_CONTROLD_TWDSCALE	0X07 + +/* POWER DOWN DISABLE REGISTER BITS */ +#define DA9052_PDDIS_PMCONTPD		0X80 +#define DA9052_PDDIS_OUT32KPD		0X40 +#define DA9052_PDDIS_CHGBBATPD		0X20 +#define DA9052_PDDIS_CHGPD		0X10 +#define DA9052_PDDIS_HS2WIREPD		0X08 +#define DA9052_PDDIS_PMIFPD		0X04 +#define DA9052_PDDIS_GPADCPD		0X02 +#define DA9052_PDDIS_GPIOPD		0X01 + +/* CONTROL REGISTER D BITS */ +#define DA9052_INTERFACE_IFBASEADDR	0XE0 +#define DA9052_INTERFACE_NCSPOL	0X10 +#define DA9052_INTERFACE_RWPOL		0X08 +#define DA9052_INTERFACE_CPHA		0X04 +#define DA9052_INTERFACE_CPOL		0X02 +#define DA9052_INTERFACE_IFTYPE	0X01 + +/* CONTROL REGISTER D BITS */ +#define DA9052_RESET_RESETEVENT	0XC0 +#define DA9052_RESET_RESETTIMER	0X3F + +/* GPIO REGISTERS */ +/* GPIO CONTROL REGISTER BITS */ +#define DA9052_GPIO_EVEN_PORT_PIN	0X03 +#define DA9052_GPIO_EVEN_PORT_TYPE	0X04 +#define DA9052_GPIO_EVEN_PORT_MODE	0X08 + +#define DA9052_GPIO_ODD_PORT_PIN	0X30 +#define DA9052_GPIO_ODD_PORT_TYPE	0X40 +#define DA9052_GPIO_ODD_PORT_MODE	0X80 + +/*POWER SEQUENCER REGISTER BITS */ +/* SEQ CONTROL REGISTER BITS FOR ID 0 AND 1 */ +#define DA9052_ID01_LDO1STEP		0XF0 +#define DA9052_ID01_SYSPRE		0X04 +#define DA9052_ID01_DEFSUPPLY		0X02 +#define DA9052_ID01_NRESMODE		0X01 + +/* SEQ CONTROL REGISTER BITS FOR ID 2 AND 3 */ +#define DA9052_ID23_LDO3STEP		0XF0 +#define DA9052_ID23_LDO2STEP		0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 4 AND 5 */ +#define DA9052_ID45_LDO5STEP		0XF0 +#define DA9052_ID45_LDO4STEP		0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 6 AND 7 */ +#define DA9052_ID67_LDO7STEP		0XF0 +#define DA9052_ID67_LDO6STEP		0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 8 AND 9 */ +#define DA9052_ID89_LDO9STEP		0XF0 +#define DA9052_ID89_LDO8STEP		0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 10 AND 11 */ +#define DA9052_ID1011_PDDISSTEP	0XF0 +#define DA9052_ID1011_LDO10STEP	0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 12 AND 13 */ +#define DA9052_ID1213_VMEMSWSTEP	0XF0 +#define DA9052_ID1213_VPERISWSTEP	0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 14 AND 15 */ +#define DA9052_ID1415_BUCKPROSTEP	0XF0 +#define DA9052_ID1415_BUCKCORESTEP	0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 16 AND 17 */ +#define DA9052_ID1617_BUCKPERISTEP	0XF0 +#define DA9052_ID1617_BUCKMEMSTEP	0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 18 AND 19 */ +#define DA9052_ID1819_GPRISE2STEP	0XF0 +#define DA9052_ID1819_GPRISE1STEP	0X0F + +/* SEQ CONTROL REGISTER BITS FOR ID 20 AND 21 */ +#define DA9052_ID2021_GPFALL2STEP	0XF0 +#define DA9052_ID2021_GPFALL1STEP	0X0F + +/* POWER SEQ STATUS REGISTER BITS */ +#define DA9052_SEQSTATUS_SEQPOINTER	0XF0 +#define DA9052_SEQSTATUS_WAITSTEP	0X0F + +/* POWER SEQ A REGISTER BITS */ +#define DA9052_SEQA_POWEREND		0XF0 +#define DA9052_SEQA_SYSTEMEND		0X0F + +/* POWER SEQ B REGISTER BITS */ +#define DA9052_SEQB_PARTDOWN		0XF0 +#define DA9052_SEQB_MAXCOUNT		0X0F + +/* POWER SEQ TIMER REGISTER BITS */ +#define DA9052_SEQTIMER_SEQDUMMY	0XF0 +#define DA9052_SEQTIMER_SEQTIME	0X0F + +/*POWER SUPPLY CONTROL REGISTER BITS */ +/* BUCK REGISTER A BITS */ +#define DA9052_BUCKA_BPROILIM		0XC0 +#define DA9052_BUCKA_BPROMODE		0X30 +#define DA9052_BUCKA_BCOREILIM		0X0C +#define DA9052_BUCKA_BCOREMODE		0X03 + +/* BUCK REGISTER B BITS */ +#define DA9052_BUCKB_BERIILIM		0XC0 +#define DA9052_BUCKB_BPERIMODE		0X30 +#define DA9052_BUCKB_BMEMILIM		0X0C +#define DA9052_BUCKB_BMEMMODE		0X03 + +/* BUCKCORE REGISTER BITS */ +#define DA9052_BUCKCORE_BCORECONF	0X80 +#define DA9052_BUCKCORE_BCOREEN	0X40 +#define DA9052_BUCKCORE_VBCORE		0X3F + +/* BUCKPRO REGISTER BITS */ +#define DA9052_BUCKPRO_BPROCONF	0X80 +#define DA9052_BUCKPRO_BPROEN		0X40 +#define DA9052_BUCKPRO_VBPRO		0X3F + +/* BUCKMEM REGISTER BITS */ +#define DA9052_BUCKMEM_BMEMCONF	0X80 +#define DA9052_BUCKMEM_BMEMEN		0X40 +#define DA9052_BUCKMEM_VBMEM		0X3F + +/* BUCKPERI REGISTER BITS */ +#define DA9052_BUCKPERI_BPERICONF	0X80 +#define DA9052_BUCKPERI_BPERIEN	0X40 +#define DA9052_BUCKPERI_BPERIHS	0X20 +#define DA9052_BUCKPERI_VBPERI		0X1F + +/* LDO1 REGISTER BITS */ +#define DA9052_LDO1_LDO1CONF		0X80 +#define DA9052_LDO1_LDO1EN		0X40 +#define DA9052_LDO1_VLDO1		0X1F + +/* LDO2 REGISTER BITS */ +#define DA9052_LDO2_LDO2CONF		0X80 +#define DA9052_LDO2_LDO2EN		0X40 +#define DA9052_LDO2_VLDO2		0X3F + +/* LDO3 REGISTER BITS */ +#define DA9052_LDO3_LDO3CONF		0X80 +#define DA9052_LDO3_LDO3EN		0X40 +#define DA9052_LDO3_VLDO3		0X3F + +/* LDO4 REGISTER BITS */ +#define DA9052_LDO4_LDO4CONF		0X80 +#define DA9052_LDO4_LDO4EN		0X40 +#define DA9052_LDO4_VLDO4		0X3F + +/* LDO5 REGISTER BITS */ +#define DA9052_LDO5_LDO5CONF		0X80 +#define DA9052_LDO5_LDO5EN		0X40 +#define DA9052_LDO5_VLDO5		0X3F + +/* LDO6 REGISTER BITS */ +#define DA9052_LDO6_LDO6CONF		0X80 +#define DA9052_LDO6_LDO6EN		0X40 +#define DA9052_LDO6_VLDO6		0X3F + +/* LDO7 REGISTER BITS */ +#define DA9052_LDO7_LDO7CONF		0X80 +#define DA9052_LDO7_LDO7EN		0X40 +#define DA9052_LDO7_VLDO7		0X3F + +/* LDO8 REGISTER BITS */ +#define DA9052_LDO8_LDO8CONF		0X80 +#define DA9052_LDO8_LDO8EN		0X40 +#define DA9052_LDO8_VLDO8		0X3F + +/* LDO9 REGISTER BITS */ +#define DA9052_LDO9_LDO9CONF		0X80 +#define DA9052_LDO9_LDO9EN		0X40 +#define DA9052_LDO9_VLDO9		0X3F + +/* LDO10 REGISTER BITS */ +#define DA9052_LDO10_LDO10CONF		0X80 +#define DA9052_LDO10_LDO10EN		0X40 +#define DA9052_LDO10_VLDO10		0X3F + +/* SUPPLY REGISTER BITS */ +#define DA9052_SUPPLY_VLOCK		0X80 +#define DA9052_SUPPLY_VMEMSWEN		0X40 +#define DA9052_SUPPLY_VPERISWEN	0X20 +#define DA9052_SUPPLY_VLDO3GO		0X10 +#define DA9052_SUPPLY_VLDO2GO		0X08 +#define DA9052_SUPPLY_VBMEMGO		0X04 +#define DA9052_SUPPLY_VBPROGO		0X02 +#define DA9052_SUPPLY_VBCOREGO		0X01 + +/* PULLDOWN REGISTER BITS */ +#define DA9052_PULLDOWN_LDO5PDDIS	0X20 +#define DA9052_PULLDOWN_LDO2PDDIS	0X10 +#define DA9052_PULLDOWN_LDO1PDDIS	0X08 +#define DA9052_PULLDOWN_MEMPDDIS	0X04 +#define DA9052_PULLDOWN_PROPDDIS	0X02 +#define DA9052_PULLDOWN_COREPDDIS	0X01 + +/* BAT CHARGER REGISTER BITS */ +/* CHARGER BUCK REGISTER BITS */ +#define DA9052_CHGBUCK_CHGTEMP		0X80 +#define DA9052_CHGBUCK_CHGUSBILIM	0X40 +#define DA9052_CHGBUCK_CHGBUCKLP	0X20 +#define DA9052_CHGBUCK_CHGBUCKEN	0X10 +#define DA9052_CHGBUCK_ISETBUCK	0X0F + +/* WAIT COUNTER REGISTER BITS */ +#define DA9052_WAITCONT_WAITDIR	0X80 +#define DA9052_WAITCONT_RTCCLOCK	0X40 +#define DA9052_WAITCONT_WAITMODE	0X20 +#define DA9052_WAITCONT_EN32KOUT	0X10 +#define DA9052_WAITCONT_DELAYTIME	0X0F + +/* ISET CONTROL REGISTER BITS */ +#define DA9052_ISET_ISETDCIN		0XF0 +#define DA9052_ISET_ISETVBUS		0X0F + +/* BATTERY CHARGER CONTROL REGISTER BITS */ +#define DA9052_BATCHG_ICHGPRE		0XC0 +#define DA9052_BATCHG_ICHGBAT		0X3F + +/* CHARGER COUNTER REGISTER BITS */ +#define DA9052_CHG_CONT_VCHG_BAT	0XF8 +#define DA9052_CHG_CONT_TCTR		0X07 + +/* INPUT CONTROL REGISTER BITS */ +#define DA9052_INPUT_CONT_TCTR_MODE	0X80 +#define DA9052_INPUT_CONT_VBUS_SUSP	0X10 +#define DA9052_INPUT_CONT_DCIN_SUSP	0X08 + +/* CHARGING TIME REGISTER BITS */ +#define DA9052_CHGTIME_CHGTIME		0XFF + +/* BACKUP BATTERY CONTROL REGISTER BITS */ +#define DA9052_BBATCONT_BCHARGERISET	0XF0 +#define DA9052_BBATCONT_BCHARGERVSET	0X0F + +/* LED REGISTERS BITS */ +/* LED BOOST REGISTER BITS */ +#define DA9052_BOOST_EBFAULT		0X80 +#define DA9052_BOOST_MBFAULT		0X40 +#define DA9052_BOOST_BOOSTFRQ		0X20 +#define DA9052_BOOST_BOOSTILIM		0X10 +#define DA9052_BOOST_LED3INEN		0X08 +#define DA9052_BOOST_LED2INEN		0X04 +#define DA9052_BOOST_LED1INEN		0X02 +#define DA9052_BOOST_BOOSTEN		0X01 + +/* LED CONTROL REGISTER BITS */ +#define DA9052_LEDCONT_SELLEDMODE	0X80 +#define DA9052_LEDCONT_LED3ICONT	0X40 +#define DA9052_LEDCONT_LED3RAMP	0X20 +#define DA9052_LEDCONT_LED3EN		0X10 +#define DA9052_LEDCONT_LED2RAMP	0X08 +#define DA9052_LEDCONT_LED2EN		0X04 +#define DA9052_LEDCONT_LED1RAMP	0X02 +#define DA9052_LEDCONT_LED1EN		0X01 + +/* LEDMIN123 REGISTER BIT */ +#define DA9052_LEDMIN123_LEDMINCURRENT	0XFF + +/* LED1CONF REGISTER BIT */ +#define DA9052_LED1CONF_LED1CURRENT	0XFF + +/* LED2CONF REGISTER BIT */ +#define DA9052_LED2CONF_LED2CURRENT	0XFF + +/* LED3CONF REGISTER BIT */ +#define DA9052_LED3CONF_LED3CURRENT	0XFF + +/* LED COUNT REGISTER BIT */ +#define DA9052_LED_CONT_DIM		0X80 + +/* ADC MAN REGISTERS BITS */ +#define DA9052_ADC_MAN_MAN_CONV	0X10 +#define DA9052_ADC_MAN_MUXSEL_VDDOUT	0X00 +#define DA9052_ADC_MAN_MUXSEL_ICH	0X01 +#define DA9052_ADC_MAN_MUXSEL_TBAT	0X02 +#define DA9052_ADC_MAN_MUXSEL_VBAT	0X03 +#define DA9052_ADC_MAN_MUXSEL_AD4	0X04 +#define DA9052_ADC_MAN_MUXSEL_AD5	0X05 +#define DA9052_ADC_MAN_MUXSEL_AD6	0X06 +#define DA9052_ADC_MAN_MUXSEL_VBBAT	0X09 + +/* ADC CONTROL REGSISTERS BITS */ +#define DA9052_ADCCONT_COMP1V2EN	0X80 +#define DA9052_ADCCONT_ADCMODE		0X40 +#define DA9052_ADCCONT_TBATISRCEN	0X20 +#define DA9052_ADCCONT_AD4ISRCEN	0X10 +#define DA9052_ADCCONT_AUTOAD6EN	0X08 +#define DA9052_ADCCONT_AUTOAD5EN	0X04 +#define DA9052_ADCCONT_AUTOAD4EN	0X02 +#define DA9052_ADCCONT_AUTOVDDEN	0X01 + +/* ADC 10 BIT MANUAL CONVERSION RESULT LOW REGISTER */ +#define DA9052_ADC_RES_LSB		0X03 + +/* ADC 10 BIT MANUAL CONVERSION RESULT HIGH REGISTER */ +#define DA9052_ADCRESH_ADCRESMSB	0XFF + +/* VDD RES REGSISTER BIT*/ +#define DA9052_VDDRES_VDDOUTRES	0XFF + +/* VDD MON REGSISTER BIT */ +#define DA9052_VDDMON_VDDOUTMON	0XFF + +/* ICHG_AV REGSISTER BIT */ +#define DA9052_ICHGAV_ICHGAV		0XFF + +/* ICHG_THD REGSISTER BIT */ +#define DA9052_ICHGTHD_ICHGTHD		0XFF + +/* ICHG_END REGSISTER BIT */ +#define DA9052_ICHGEND_ICHGEND		0XFF + +/* TBAT_RES REGSISTER BIT */ +#define DA9052_TBATRES_TBATRES		0XFF + +/* TBAT_HIGHP REGSISTER BIT */ +#define DA9052_TBATHIGHP_TBATHIGHP	0XFF + +/* TBAT_HIGHN REGSISTER BIT */ +#define DA9052_TBATHIGHN_TBATHIGHN	0XFF + +/* TBAT_LOW REGSISTER BIT */ +#define DA9052_TBATLOW_TBATLOW		0XFF + +/* T_OFFSET REGSISTER BIT */ +#define DA9052_TOFFSET_TOFFSET		0XFF + +/* ADCIN4_RES REGSISTER BIT */ +#define DA9052_ADCIN4RES_ADCIN4RES	0XFF + +/* ADCIN4_HIGH REGSISTER BIT */ +#define DA9052_AUTO4HIGH_AUTO4HIGH	0XFF + +/* ADCIN4_LOW REGSISTER BIT */ +#define DA9052_AUTO4LOW_AUTO4LOW	0XFF + +/* ADCIN5_RES REGSISTER BIT */ +#define DA9052_ADCIN5RES_ADCIN5RES	0XFF + +/* ADCIN5_HIGH REGSISTER BIT */ +#define DA9052_AUTO5HIGH_AUTOHIGH	0XFF + +/* ADCIN5_LOW REGSISTER BIT */ +#define DA9052_AUTO5LOW_AUTO5LOW	0XFF + +/* ADCIN6_RES REGSISTER BIT */ +#define DA9052_ADCIN6RES_ADCIN6RES	0XFF + +/* ADCIN6_HIGH REGSISTER BIT */ +#define DA9052_AUTO6HIGH_AUTO6HIGH	0XFF + +/* ADCIN6_LOW REGSISTER BIT */ +#define DA9052_AUTO6LOW_AUTO6LOW	0XFF + +/* TJUNC_RES REGSISTER BIT*/ +#define DA9052_TJUNCRES_TJUNCRES	0XFF + +/* TSI REGISTER */ +/* TSI CONTROL REGISTER A BITS */ +#define DA9052_TSICONTA_TSIDELAY	0XC0 +#define DA9052_TSICONTA_TSISKIP	0X38 +#define DA9052_TSICONTA_TSIMODE	0X04 +#define DA9052_TSICONTA_PENDETEN	0X02 +#define DA9052_TSICONTA_AUTOTSIEN	0X01 + +/* TSI CONTROL REGISTER B BITS */ +#define DA9052_TSICONTB_ADCREF		0X80 +#define DA9052_TSICONTB_TSIMAN		0X40 +#define DA9052_TSICONTB_TSIMUX		0X30 +#define DA9052_TSICONTB_TSISEL3	0X08 +#define DA9052_TSICONTB_TSISEL2	0X04 +#define DA9052_TSICONTB_TSISEL1	0X02 +#define DA9052_TSICONTB_TSISEL0	0X01 + +/* TSI X CO-ORDINATE MSB RESULT REGISTER BITS */ +#define DA9052_TSIXMSB_TSIXM		0XFF + +/* TSI Y CO-ORDINATE MSB RESULT REGISTER BITS */ +#define DA9052_TSIYMSB_TSIYM		0XFF + +/* TSI CO-ORDINATE LSB RESULT REGISTER BITS */ +#define DA9052_TSILSB_PENDOWN		0X40 +#define DA9052_TSILSB_TSIZL		0X30 +#define DA9052_TSILSB_TSIYL		0X0C +#define DA9052_TSILSB_TSIXL		0X03 + +/* TSI Z MEASUREMENT MSB RESULT REGISTER BIT */ +#define DA9052_TSIZMSB_TSIZM		0XFF + +/* RTC REGISTER */ +/* RTC TIMER SECONDS REGISTER BITS */ +#define DA9052_COUNTS_MONITOR		0X40 +#define DA9052_RTC_SEC			0X3F + +/* RTC TIMER MINUTES REGISTER BIT */ +#define DA9052_RTC_MIN			0X3F + +/* RTC TIMER HOUR REGISTER BIT */ +#define DA9052_RTC_HOUR		0X1F + +/* RTC TIMER DAYS REGISTER BIT */ +#define DA9052_RTC_DAY			0X1F + +/* RTC TIMER MONTHS REGISTER BIT */ +#define DA9052_RTC_MONTH		0X0F + +/* RTC TIMER YEARS REGISTER BIT */ +#define DA9052_RTC_YEAR		0X3F + +/* RTC ALARM MINUTES REGISTER BITS */ +#define DA9052_ALARMM_I_TICK_TYPE	0X80 +#define DA9052_ALARMMI_ALARMTYPE	0X40 + +/* RTC ALARM YEARS REGISTER BITS */ +#define DA9052_ALARM_Y_TICK_ON		0X80 +#define DA9052_ALARM_Y_ALARM_ON	0X40 + +/* RTC SECONDS REGISTER A BITS */ +#define DA9052_SECONDA_SECONDSA	0XFF + +/* RTC SECONDS REGISTER B BITS */ +#define DA9052_SECONDB_SECONDSB	0XFF + +/* RTC SECONDS REGISTER C BITS */ +#define DA9052_SECONDC_SECONDSC	0XFF + +/* RTC SECONDS REGISTER D BITS */ +#define DA9052_SECONDD_SECONDSD	0XFF + +#endif +/* __LINUX_MFD_DA9052_REG_H */ diff --git a/include/linux/mfd/max8925.h b/include/linux/mfd/max8925.h index 5259dfe8c58..15b2392a56f 100644 --- a/include/linux/mfd/max8925.h +++ b/include/linux/mfd/max8925.h @@ -167,9 +167,6 @@ enum {  	MAX8925_IRQ_VCHG_DC_OVP,  	MAX8925_IRQ_VCHG_DC_F,  	MAX8925_IRQ_VCHG_DC_R, -	MAX8925_IRQ_VCHG_USB_OVP, -	MAX8925_IRQ_VCHG_USB_F, -	MAX8925_IRQ_VCHG_USB_R,  	MAX8925_IRQ_VCHG_THM_OK_R,  	MAX8925_IRQ_VCHG_THM_OK_F,  	MAX8925_IRQ_VCHG_SYSLOW_F, @@ -206,6 +203,8 @@ struct max8925_chip {  	int			irq_base;  	int			core_irq;  	int			tsc_irq; + +	unsigned int            wakeup_flag;  };  struct max8925_backlight_pdata { @@ -223,6 +222,10 @@ struct max8925_power_pdata {  	unsigned	batt_detect:1;  	unsigned	topoff_threshold:2;  	unsigned	fast_charge:3;	/* charge current */ +	unsigned	no_temp_support:1; /* set if no temperature detect */ +	unsigned	no_insert_detect:1; /* set if no ac insert detect */ +	char		**supplied_to; +	int		num_supplicants;  };  /* diff --git a/include/linux/mfd/max8997.h b/include/linux/mfd/max8997.h index 0bbd13dbe33..fff590521e5 100644 --- a/include/linux/mfd/max8997.h +++ b/include/linux/mfd/max8997.h @@ -77,6 +77,82 @@ struct max8997_regulator_data {  	struct regulator_init_data *initdata;  }; +enum max8997_muic_usb_type { +	MAX8997_USB_HOST, +	MAX8997_USB_DEVICE, +}; + +enum max8997_muic_charger_type { +	MAX8997_CHARGER_TYPE_NONE = 0, +	MAX8997_CHARGER_TYPE_USB, +	MAX8997_CHARGER_TYPE_DOWNSTREAM_PORT, +	MAX8997_CHARGER_TYPE_DEDICATED_CHG, +	MAX8997_CHARGER_TYPE_500MA, +	MAX8997_CHARGER_TYPE_1A, +	MAX8997_CHARGER_TYPE_DEAD_BATTERY = 7, +}; + +struct max8997_muic_reg_data { +	u8 addr; +	u8 data; +}; + +/** + * struct max8997_muic_platform_data + * @usb_callback: callback function for USB + *		  inform callee of USB type (HOST or DEVICE) + *		  and attached state(true or false) + * @charger_callback: callback function for charger + *		  inform callee of charger_type + *		  and attached state(true or false) + * @deskdock_callback: callback function for desk dock + *		  inform callee of attached state(true or false) + * @cardock_callback: callback function for car dock + *		  inform callee of attached state(true or false) + * @mhl_callback: callback function for MHL (Mobile High-definition Link) + *		  inform callee of attached state(true or false) + * @uart_callback: callback function for JIG UART + *		   inform callee of attached state(true or false) + * @init_data: array of max8997_muic_reg_data + *	       used for initializing registers of MAX8997 MUIC device + * @num_init_data: array size of init_data + */ +struct max8997_muic_platform_data { +	void (*usb_callback)(enum max8997_muic_usb_type usb_type, +		bool attached); +	void (*charger_callback)(bool attached, +		enum max8997_muic_charger_type charger_type); +	void (*deskdock_callback) (bool attached); +	void (*cardock_callback) (bool attached); +	void (*mhl_callback) (bool attached); +	void (*uart_callback) (bool attached); + +	struct max8997_muic_reg_data *init_data; +	int num_init_data; +}; + +enum max8997_led_mode { +	MAX8997_NONE, +	MAX8997_FLASH_MODE, +	MAX8997_MOVIE_MODE, +	MAX8997_FLASH_PIN_CONTROL_MODE, +	MAX8997_MOVIE_PIN_CONTROL_MODE, +}; + +/** + *  struct max8997_led_platform_data + *  The number of LED devices for MAX8997 is two + *  @mode: LED mode for each LED device + *  @brightness: initial brightness for each LED device + *	range: + *	[0 - 31]: MAX8997_FLASH_MODE and MAX8997_FLASH_PIN_CONTROL_MODE + *	[0 - 15]: MAX8997_MOVIE_MODE and MAX8997_MOVIE_PIN_CONTROL_MODE + */ +struct max8997_led_platform_data { +	enum max8997_led_mode mode[2]; +	u8 brightness[2]; +}; +  struct max8997_platform_data {  	/* IRQ */  	int irq_base; @@ -113,10 +189,13 @@ struct max8997_platform_data {  	/* charge Full Timeout */  	int timeout; /* 0 (no timeout), 5, 6, 7 hours */ -	/* MUIC: Not implemented */ +	/* ---- MUIC ---- */ +	struct max8997_muic_platform_data *muic_pdata; +  	/* HAPTIC: Not implemented */  	/* RTC: Not implemented */ -	/* Flash: Not implemented */ +	/* ---- LED ---- */ +	struct max8997_led_platform_data *led_pdata;  };  #endif /* __LINUX_MFD_MAX8998_H */ diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h index 3816c2fac0a..b86ee45c8b0 100644 --- a/include/linux/mfd/mc13xxx.h +++ b/include/linux/mfd/mc13xxx.h @@ -69,6 +69,7 @@ struct regulator_init_data;  struct mc13xxx_regulator_init_data {  	int id;  	struct regulator_init_data *init_data; +	struct device_node *node;  };  struct mc13xxx_regulator_platform_data { @@ -173,6 +174,9 @@ struct mc13xxx_platform_data {  #define MC13XXX_ADC_MODE_MULT_CHAN	3  #define MC13XXX_ADC0		43 +#define MC13XXX_ADC0_LICELLCON		(1 << 0) +#define MC13XXX_ADC0_CHRGICON		(1 << 1) +#define MC13XXX_ADC0_BATICON		(1 << 2)  #define MC13XXX_ADC0_ADREFEN		(1 << 10)  #define MC13XXX_ADC0_TSMOD0		(1 << 12)  #define MC13XXX_ADC0_TSMOD1		(1 << 13) @@ -184,4 +188,9 @@ struct mc13xxx_platform_data {  					MC13XXX_ADC0_TSMOD1 | \  					MC13XXX_ADC0_TSMOD2) +#define MC13XXX_ADC0_CONFIG_MASK	(MC13XXX_ADC0_TSMOD_MASK | \ +					MC13XXX_ADC0_LICELLCON | \ +					MC13XXX_ADC0_CHRGICON | \ +					MC13XXX_ADC0_BATICON) +  #endif /* ifndef __LINUX_MFD_MC13XXX_H */ diff --git a/include/linux/mfd/mcp.h b/include/linux/mfd/mcp.h index ee496708e38..f88c1cc0cb0 100644 --- a/include/linux/mfd/mcp.h +++ b/include/linux/mfd/mcp.h @@ -64,6 +64,9 @@ void mcp_driver_unregister(struct mcp_driver *);  #define mcp_get_drvdata(mcp)	dev_get_drvdata(&(mcp)->attached_device)  #define mcp_set_drvdata(mcp,d)	dev_set_drvdata(&(mcp)->attached_device, d) -#define mcp_priv(mcp)		((void *)((mcp)+1)) +static inline void *mcp_priv(struct mcp *mcp) +{ +	return mcp + 1; +}  #endif diff --git a/include/linux/mfd/s5m87xx/s5m-core.h b/include/linux/mfd/s5m87xx/s5m-core.h new file mode 100644 index 00000000000..a7480b57f92 --- /dev/null +++ b/include/linux/mfd/s5m87xx/s5m-core.h @@ -0,0 +1,373 @@ +/* + * s5m-core.h + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd + *              http://www.samsung.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. + * + */ + +#ifndef __LINUX_MFD_S5M_CORE_H +#define __LINUX_MFD_S5M_CORE_H + +#define NUM_IRQ_REGS	4 + +enum s5m_device_type { +	S5M8751X, +	S5M8763X, +	S5M8767X, +}; + +/* S5M8767 registers */ +enum s5m8767_reg { +	S5M8767_REG_ID, +	S5M8767_REG_INT1, +	S5M8767_REG_INT2, +	S5M8767_REG_INT3, +	S5M8767_REG_INT1M, +	S5M8767_REG_INT2M, +	S5M8767_REG_INT3M, +	S5M8767_REG_STATUS1, +	S5M8767_REG_STATUS2, +	S5M8767_REG_STATUS3, +	S5M8767_REG_CTRL1, +	S5M8767_REG_CTRL2, +	S5M8767_REG_LOWBAT1, +	S5M8767_REG_LOWBAT2, +	S5M8767_REG_BUCHG, +	S5M8767_REG_DVSRAMP, +	S5M8767_REG_DVSTIMER2 = 0x10, +	S5M8767_REG_DVSTIMER3, +	S5M8767_REG_DVSTIMER4, +	S5M8767_REG_LDO1, +	S5M8767_REG_LDO2, +	S5M8767_REG_LDO3, +	S5M8767_REG_LDO4, +	S5M8767_REG_LDO5, +	S5M8767_REG_LDO6, +	S5M8767_REG_LDO7, +	S5M8767_REG_LDO8, +	S5M8767_REG_LDO9, +	S5M8767_REG_LDO10, +	S5M8767_REG_LDO11, +	S5M8767_REG_LDO12, +	S5M8767_REG_LDO13, +	S5M8767_REG_LDO14 = 0x20, +	S5M8767_REG_LDO15, +	S5M8767_REG_LDO16, +	S5M8767_REG_LDO17, +	S5M8767_REG_LDO18, +	S5M8767_REG_LDO19, +	S5M8767_REG_LDO20, +	S5M8767_REG_LDO21, +	S5M8767_REG_LDO22, +	S5M8767_REG_LDO23, +	S5M8767_REG_LDO24, +	S5M8767_REG_LDO25, +	S5M8767_REG_LDO26, +	S5M8767_REG_LDO27, +	S5M8767_REG_LDO28, +	S5M8767_REG_UVLO = 0x31, +	S5M8767_REG_BUCK1CTRL1, +	S5M8767_REG_BUCK1CTRL2, +	S5M8767_REG_BUCK2CTRL, +	S5M8767_REG_BUCK2DVS1, +	S5M8767_REG_BUCK2DVS2, +	S5M8767_REG_BUCK2DVS3, +	S5M8767_REG_BUCK2DVS4, +	S5M8767_REG_BUCK2DVS5, +	S5M8767_REG_BUCK2DVS6, +	S5M8767_REG_BUCK2DVS7, +	S5M8767_REG_BUCK2DVS8, +	S5M8767_REG_BUCK3CTRL, +	S5M8767_REG_BUCK3DVS1, +	S5M8767_REG_BUCK3DVS2, +	S5M8767_REG_BUCK3DVS3, +	S5M8767_REG_BUCK3DVS4, +	S5M8767_REG_BUCK3DVS5, +	S5M8767_REG_BUCK3DVS6, +	S5M8767_REG_BUCK3DVS7, +	S5M8767_REG_BUCK3DVS8, +	S5M8767_REG_BUCK4CTRL, +	S5M8767_REG_BUCK4DVS1, +	S5M8767_REG_BUCK4DVS2, +	S5M8767_REG_BUCK4DVS3, +	S5M8767_REG_BUCK4DVS4, +	S5M8767_REG_BUCK4DVS5, +	S5M8767_REG_BUCK4DVS6, +	S5M8767_REG_BUCK4DVS7, +	S5M8767_REG_BUCK4DVS8, +	S5M8767_REG_BUCK5CTRL1, +	S5M8767_REG_BUCK5CTRL2, +	S5M8767_REG_BUCK5CTRL3, +	S5M8767_REG_BUCK5CTRL4, +	S5M8767_REG_BUCK5CTRL5, +	S5M8767_REG_BUCK6CTRL1, +	S5M8767_REG_BUCK6CTRL2, +	S5M8767_REG_BUCK7CTRL1, +	S5M8767_REG_BUCK7CTRL2, +	S5M8767_REG_BUCK8CTRL1, +	S5M8767_REG_BUCK8CTRL2, +	S5M8767_REG_BUCK9CTRL1, +	S5M8767_REG_BUCK9CTRL2, +	S5M8767_REG_LDO1CTRL, +	S5M8767_REG_LDO2_1CTRL, +	S5M8767_REG_LDO2_2CTRL, +	S5M8767_REG_LDO2_3CTRL, +	S5M8767_REG_LDO2_4CTRL, +	S5M8767_REG_LDO3CTRL, +	S5M8767_REG_LDO4CTRL, +	S5M8767_REG_LDO5CTRL, +	S5M8767_REG_LDO6CTRL, +	S5M8767_REG_LDO7CTRL, +	S5M8767_REG_LDO8CTRL, +	S5M8767_REG_LDO9CTRL, +	S5M8767_REG_LDO10CTRL, +	S5M8767_REG_LDO11CTRL, +	S5M8767_REG_LDO12CTRL, +	S5M8767_REG_LDO13CTRL, +	S5M8767_REG_LDO14CTRL, +	S5M8767_REG_LDO15CTRL, +	S5M8767_REG_LDO16CTRL, +	S5M8767_REG_LDO17CTRL, +	S5M8767_REG_LDO18CTRL, +	S5M8767_REG_LDO19CTRL, +	S5M8767_REG_LDO20CTRL, +	S5M8767_REG_LDO21CTRL, +	S5M8767_REG_LDO22CTRL, +	S5M8767_REG_LDO23CTRL, +	S5M8767_REG_LDO24CTRL, +	S5M8767_REG_LDO25CTRL, +	S5M8767_REG_LDO26CTRL, +	S5M8767_REG_LDO27CTRL, +	S5M8767_REG_LDO28CTRL, +}; + +/* S5M8763 registers */ +enum s5m8763_reg { +	S5M8763_REG_IRQ1, +	S5M8763_REG_IRQ2, +	S5M8763_REG_IRQ3, +	S5M8763_REG_IRQ4, +	S5M8763_REG_IRQM1, +	S5M8763_REG_IRQM2, +	S5M8763_REG_IRQM3, +	S5M8763_REG_IRQM4, +	S5M8763_REG_STATUS1, +	S5M8763_REG_STATUS2, +	S5M8763_REG_STATUSM1, +	S5M8763_REG_STATUSM2, +	S5M8763_REG_CHGR1, +	S5M8763_REG_CHGR2, +	S5M8763_REG_LDO_ACTIVE_DISCHARGE1, +	S5M8763_REG_LDO_ACTIVE_DISCHARGE2, +	S5M8763_REG_BUCK_ACTIVE_DISCHARGE3, +	S5M8763_REG_ONOFF1, +	S5M8763_REG_ONOFF2, +	S5M8763_REG_ONOFF3, +	S5M8763_REG_ONOFF4, +	S5M8763_REG_BUCK1_VOLTAGE1, +	S5M8763_REG_BUCK1_VOLTAGE2, +	S5M8763_REG_BUCK1_VOLTAGE3, +	S5M8763_REG_BUCK1_VOLTAGE4, +	S5M8763_REG_BUCK2_VOLTAGE1, +	S5M8763_REG_BUCK2_VOLTAGE2, +	S5M8763_REG_BUCK3, +	S5M8763_REG_BUCK4, +	S5M8763_REG_LDO1_LDO2, +	S5M8763_REG_LDO3, +	S5M8763_REG_LDO4, +	S5M8763_REG_LDO5, +	S5M8763_REG_LDO6, +	S5M8763_REG_LDO7, +	S5M8763_REG_LDO7_LDO8, +	S5M8763_REG_LDO9_LDO10, +	S5M8763_REG_LDO11, +	S5M8763_REG_LDO12, +	S5M8763_REG_LDO13, +	S5M8763_REG_LDO14, +	S5M8763_REG_LDO15, +	S5M8763_REG_LDO16, +	S5M8763_REG_BKCHR, +	S5M8763_REG_LBCNFG1, +	S5M8763_REG_LBCNFG2, +}; + +enum s5m8767_irq { +	S5M8767_IRQ_PWRR, +	S5M8767_IRQ_PWRF, +	S5M8767_IRQ_PWR1S, +	S5M8767_IRQ_JIGR, +	S5M8767_IRQ_JIGF, +	S5M8767_IRQ_LOWBAT2, +	S5M8767_IRQ_LOWBAT1, + +	S5M8767_IRQ_MRB, +	S5M8767_IRQ_DVSOK2, +	S5M8767_IRQ_DVSOK3, +	S5M8767_IRQ_DVSOK4, + +	S5M8767_IRQ_RTC60S, +	S5M8767_IRQ_RTCA1, +	S5M8767_IRQ_RTCA2, +	S5M8767_IRQ_SMPL, +	S5M8767_IRQ_RTC1S, +	S5M8767_IRQ_WTSR, + +	S5M8767_IRQ_NR, +}; + +#define S5M8767_IRQ_PWRR_MASK		(1 << 0) +#define S5M8767_IRQ_PWRF_MASK		(1 << 1) +#define S5M8767_IRQ_PWR1S_MASK		(1 << 3) +#define S5M8767_IRQ_JIGR_MASK		(1 << 4) +#define S5M8767_IRQ_JIGF_MASK		(1 << 5) +#define S5M8767_IRQ_LOWBAT2_MASK	(1 << 6) +#define S5M8767_IRQ_LOWBAT1_MASK	(1 << 7) + +#define S5M8767_IRQ_MRB_MASK		(1 << 2) +#define S5M8767_IRQ_DVSOK2_MASK		(1 << 3) +#define S5M8767_IRQ_DVSOK3_MASK		(1 << 4) +#define S5M8767_IRQ_DVSOK4_MASK		(1 << 5) + +#define S5M8767_IRQ_RTC60S_MASK		(1 << 0) +#define S5M8767_IRQ_RTCA1_MASK		(1 << 1) +#define S5M8767_IRQ_RTCA2_MASK		(1 << 2) +#define S5M8767_IRQ_SMPL_MASK		(1 << 3) +#define S5M8767_IRQ_RTC1S_MASK		(1 << 4) +#define S5M8767_IRQ_WTSR_MASK		(1 << 5) + +enum s5m8763_irq { +	S5M8763_IRQ_DCINF, +	S5M8763_IRQ_DCINR, +	S5M8763_IRQ_JIGF, +	S5M8763_IRQ_JIGR, +	S5M8763_IRQ_PWRONF, +	S5M8763_IRQ_PWRONR, + +	S5M8763_IRQ_WTSREVNT, +	S5M8763_IRQ_SMPLEVNT, +	S5M8763_IRQ_ALARM1, +	S5M8763_IRQ_ALARM0, + +	S5M8763_IRQ_ONKEY1S, +	S5M8763_IRQ_TOPOFFR, +	S5M8763_IRQ_DCINOVPR, +	S5M8763_IRQ_CHGRSTF, +	S5M8763_IRQ_DONER, +	S5M8763_IRQ_CHGFAULT, + +	S5M8763_IRQ_LOBAT1, +	S5M8763_IRQ_LOBAT2, + +	S5M8763_IRQ_NR, +}; + +#define S5M8763_IRQ_DCINF_MASK		(1 << 2) +#define S5M8763_IRQ_DCINR_MASK		(1 << 3) +#define S5M8763_IRQ_JIGF_MASK		(1 << 4) +#define S5M8763_IRQ_JIGR_MASK		(1 << 5) +#define S5M8763_IRQ_PWRONF_MASK		(1 << 6) +#define S5M8763_IRQ_PWRONR_MASK		(1 << 7) + +#define S5M8763_IRQ_WTSREVNT_MASK	(1 << 0) +#define S5M8763_IRQ_SMPLEVNT_MASK	(1 << 1) +#define S5M8763_IRQ_ALARM1_MASK		(1 << 2) +#define S5M8763_IRQ_ALARM0_MASK		(1 << 3) + +#define S5M8763_IRQ_ONKEY1S_MASK	(1 << 0) +#define S5M8763_IRQ_TOPOFFR_MASK	(1 << 2) +#define S5M8763_IRQ_DCINOVPR_MASK	(1 << 3) +#define S5M8763_IRQ_CHGRSTF_MASK	(1 << 4) +#define S5M8763_IRQ_DONER_MASK		(1 << 5) +#define S5M8763_IRQ_CHGFAULT_MASK	(1 << 7) + +#define S5M8763_IRQ_LOBAT1_MASK		(1 << 0) +#define S5M8763_IRQ_LOBAT2_MASK		(1 << 1) + +#define S5M8763_ENRAMP                  (1 << 4) + +/** + * struct s5m87xx_dev - s5m87xx master device for sub-drivers + * @dev: master device of the chip (can be used to access platform data) + * @i2c: i2c client private data for regulator + * @rtc: i2c client private data for rtc + * @iolock: mutex for serializing io access + * @irqlock: mutex for buslock + * @irq_base: base IRQ number for s5m87xx, required for IRQs + * @irq: generic IRQ number for s5m87xx + * @ono: power onoff IRQ number for s5m87xx + * @irq_masks_cur: currently active value + * @irq_masks_cache: cached hardware value + * @type: indicate which s5m87xx "variant" is used + */ +struct s5m87xx_dev { +	struct device *dev; +	struct regmap *regmap; +	struct i2c_client *i2c; +	struct i2c_client *rtc; +	struct mutex iolock; +	struct mutex irqlock; + +	int device_type; +	int irq_base; +	int irq; +	int ono; +	u8 irq_masks_cur[NUM_IRQ_REGS]; +	u8 irq_masks_cache[NUM_IRQ_REGS]; +	int type; +	bool wakeup; +}; + +int s5m_irq_init(struct s5m87xx_dev *s5m87xx); +void s5m_irq_exit(struct s5m87xx_dev *s5m87xx); +int s5m_irq_resume(struct s5m87xx_dev *s5m87xx); + +extern int s5m_reg_read(struct s5m87xx_dev *s5m87xx, u8 reg, void *dest); +extern int s5m_bulk_read(struct s5m87xx_dev *s5m87xx, u8 reg, int count, u8 *buf); +extern int s5m_reg_write(struct s5m87xx_dev *s5m87xx, u8 reg, u8 value); +extern int s5m_bulk_write(struct s5m87xx_dev *s5m87xx, u8 reg, int count, u8 *buf); +extern int s5m_reg_update(struct s5m87xx_dev *s5m87xx, u8 reg, u8 val, u8 mask); + +struct s5m_platform_data { +	struct s5m_regulator_data	*regulators; +	int				device_type; +	int				num_regulators; + +	int				irq_base; +	int 				(*cfg_pmic_irq)(void); + +	int				ono; +	bool				wakeup; +	bool				buck_voltage_lock; + +	int				buck_gpios[3]; +	int				buck2_voltage[8]; +	bool				buck2_gpiodvs; +	int				buck3_voltage[8]; +	bool				buck3_gpiodvs; +	int				buck4_voltage[8]; +	bool				buck4_gpiodvs; + +	int				buck_set1; +	int				buck_set2; +	int				buck_set3; +	int				buck2_enable; +	int				buck3_enable; +	int				buck4_enable; +	int				buck_default_idx; +	int				buck2_default_idx; +	int				buck3_default_idx; +	int				buck4_default_idx; + +	int                             buck_ramp_delay; +	bool                            buck2_ramp_enable; +	bool                            buck3_ramp_enable; +	bool                            buck4_ramp_enable; +}; + +#endif /*  __LINUX_MFD_S5M_CORE_H */ diff --git a/include/linux/mfd/s5m87xx/s5m-pmic.h b/include/linux/mfd/s5m87xx/s5m-pmic.h new file mode 100644 index 00000000000..a72a5d27e62 --- /dev/null +++ b/include/linux/mfd/s5m87xx/s5m-pmic.h @@ -0,0 +1,100 @@ +/* s5m87xx.h + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.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 __LINUX_MFD_S5M_PMIC_H +#define __LINUX_MFD_S5M_PMIC_H + +#include <linux/regulator/machine.h> + +/* S5M8767 regulator ids */ +enum s5m8767_regulators { +	S5M8767_LDO1, +	S5M8767_LDO2, +	S5M8767_LDO3, +	S5M8767_LDO4, +	S5M8767_LDO5, +	S5M8767_LDO6, +	S5M8767_LDO7, +	S5M8767_LDO8, +	S5M8767_LDO9, +	S5M8767_LDO10, +	S5M8767_LDO11, +	S5M8767_LDO12, +	S5M8767_LDO13, +	S5M8767_LDO14, +	S5M8767_LDO15, +	S5M8767_LDO16, +	S5M8767_LDO17, +	S5M8767_LDO18, +	S5M8767_LDO19, +	S5M8767_LDO20, +	S5M8767_LDO21, +	S5M8767_LDO22, +	S5M8767_LDO23, +	S5M8767_LDO24, +	S5M8767_LDO25, +	S5M8767_LDO26, +	S5M8767_LDO27, +	S5M8767_LDO28, +	S5M8767_BUCK1, +	S5M8767_BUCK2, +	S5M8767_BUCK3, +	S5M8767_BUCK4, +	S5M8767_BUCK5, +	S5M8767_BUCK6, +	S5M8767_BUCK7, +	S5M8767_BUCK8, +	S5M8767_BUCK9, +	S5M8767_AP_EN32KHZ, +	S5M8767_CP_EN32KHZ, + +	S5M8767_REG_MAX, +}; + +/* S5M8763 regulator ids */ +enum s5m8763_regulators { +	S5M8763_LDO1, +	S5M8763_LDO2, +	S5M8763_LDO3, +	S5M8763_LDO4, +	S5M8763_LDO5, +	S5M8763_LDO6, +	S5M8763_LDO7, +	S5M8763_LDO8, +	S5M8763_LDO9, +	S5M8763_LDO10, +	S5M8763_LDO11, +	S5M8763_LDO12, +	S5M8763_LDO13, +	S5M8763_LDO14, +	S5M8763_LDO15, +	S5M8763_LDO16, +	S5M8763_BUCK1, +	S5M8763_BUCK2, +	S5M8763_BUCK3, +	S5M8763_BUCK4, +	S5M8763_AP_EN32KHZ, +	S5M8763_CP_EN32KHZ, +	S5M8763_ENCHGVI, +	S5M8763_ESAFEUSB1, +	S5M8763_ESAFEUSB2, +}; + +/** + * s5m87xx_regulator_data - regulator data + * @id: regulator id + * @initdata: regulator init data (contraints, supplies, ...) + */ +struct s5m_regulator_data { +	int				id; +	struct regulator_init_data	*initdata; +}; + +#endif /*  __LINUX_MFD_S5M_PMIC_H */ diff --git a/include/linux/mfd/s5m87xx/s5m-rtc.h b/include/linux/mfd/s5m87xx/s5m-rtc.h new file mode 100644 index 00000000000..6ce8da264ce --- /dev/null +++ b/include/linux/mfd/s5m87xx/s5m-rtc.h @@ -0,0 +1,84 @@ +/* + * s5m-rtc.h + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd + *              http://www.samsung.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. + * + */ + +#ifndef __LINUX_MFD_S5M_RTC_H +#define __LINUX_MFD_S5M_RTC_H + +enum s5m87xx_rtc_reg { +	S5M87XX_RTC_SEC, +	S5M87XX_RTC_MIN, +	S5M87XX_RTC_HOUR, +	S5M87XX_RTC_WEEKDAY, +	S5M87XX_RTC_DATE, +	S5M87XX_RTC_MONTH, +	S5M87XX_RTC_YEAR1, +	S5M87XX_RTC_YEAR2, +	S5M87XX_ALARM0_SEC, +	S5M87XX_ALARM0_MIN, +	S5M87XX_ALARM0_HOUR, +	S5M87XX_ALARM0_WEEKDAY, +	S5M87XX_ALARM0_DATE, +	S5M87XX_ALARM0_MONTH, +	S5M87XX_ALARM0_YEAR1, +	S5M87XX_ALARM0_YEAR2, +	S5M87XX_ALARM1_SEC, +	S5M87XX_ALARM1_MIN, +	S5M87XX_ALARM1_HOUR, +	S5M87XX_ALARM1_WEEKDAY, +	S5M87XX_ALARM1_DATE, +	S5M87XX_ALARM1_MONTH, +	S5M87XX_ALARM1_YEAR1, +	S5M87XX_ALARM1_YEAR2, +	S5M87XX_ALARM0_CONF, +	S5M87XX_ALARM1_CONF, +	S5M87XX_RTC_STATUS, +	S5M87XX_WTSR_SMPL_CNTL, +	S5M87XX_RTC_UDR_CON, +}; + +#define RTC_I2C_ADDR		(0x0C >> 1) + +#define HOUR_12			(1 << 7) +#define HOUR_AMPM		(1 << 6) +#define HOUR_PM			(1 << 5) +#define ALARM0_STATUS		(1 << 1) +#define ALARM1_STATUS		(1 << 2) +#define UPDATE_AD		(1 << 0) + +/* RTC Control Register */ +#define BCD_EN_SHIFT		0 +#define BCD_EN_MASK		(1 << BCD_EN_SHIFT) +#define MODEL24_SHIFT		1 +#define MODEL24_MASK		(1 << MODEL24_SHIFT) +/* RTC Update Register1 */ +#define RTC_UDR_SHIFT		0 +#define RTC_UDR_MASK		(1 << RTC_UDR_SHIFT) +/* RTC Hour register */ +#define HOUR_PM_SHIFT		6 +#define HOUR_PM_MASK		(1 << HOUR_PM_SHIFT) +/* RTC Alarm Enable */ +#define ALARM_ENABLE_SHIFT	7 +#define ALARM_ENABLE_MASK	(1 << ALARM_ENABLE_SHIFT) + +enum { +	RTC_SEC = 0, +	RTC_MIN, +	RTC_HOUR, +	RTC_WEEKDAY, +	RTC_DATE, +	RTC_MONTH, +	RTC_YEAR1, +	RTC_YEAR2, +}; + +#endif /*  __LINUX_MFD_S5M_RTC_H */ diff --git a/include/linux/mfd/stmpe.h b/include/linux/mfd/stmpe.h index be1af7c42e5..ca1d7a34760 100644 --- a/include/linux/mfd/stmpe.h +++ b/include/linux/mfd/stmpe.h @@ -20,6 +20,8 @@ enum stmpe_block {  };  enum stmpe_partnum { +	STMPE610, +	STMPE801,  	STMPE811,  	STMPE1601,  	STMPE2401, @@ -50,17 +52,20 @@ enum {  struct stmpe_variant_info; +struct stmpe_client_info;  /**   * struct stmpe - STMPE MFD structure   * @lock: lock protecting I/O operations   * @irq_lock: IRQ bus lock   * @dev: device, mostly for dev_dbg() - * @i2c: i2c client + * @client: client - i2c or spi + * @ci: client specific information   * @partnum: part number   * @variant: the detected STMPE model number   * @regs: list of addresses of registers which are at different addresses on   *	  different variants.  Indexed by one of STMPE_IDX_*. + * @irq: irq number for stmpe   * @irq_base: starting IRQ number for internal IRQs   * @num_gpios: number of gpios, differs for variants   * @ier: cache of IER registers for bus_lock @@ -71,11 +76,13 @@ struct stmpe {  	struct mutex lock;  	struct mutex irq_lock;  	struct device *dev; -	struct i2c_client *i2c; +	void *client; +	struct stmpe_client_info *ci;  	enum stmpe_partnum partnum;  	struct stmpe_variant_info *variant;  	const u8 *regs; +	int irq;  	int irq_base;  	int num_gpios;  	u8 ier[2]; @@ -183,6 +190,9 @@ struct stmpe_ts_platform_data {   * @autosleep_timeout: inactivity timeout in milliseconds for autosleep   * @irq_base: base IRQ number.  %STMPE_NR_IRQS irqs will be used, or   *	      %STMPE_NR_INTERNAL_IRQS if the GPIO driver is not used. + * @irq_over_gpio: true if gpio is used to get irq + * @irq_gpio: gpio number over which irq will be requested (significant only if + *	      irq_over_gpio is true)   * @gpio: GPIO-specific platform data   * @keypad: keypad-specific platform data   * @ts: touchscreen-specific platform data @@ -194,6 +204,8 @@ struct stmpe_platform_data {  	unsigned int irq_trigger;  	bool irq_invert_polarity;  	bool autosleep; +	bool irq_over_gpio; +	int irq_gpio;  	int autosleep_timeout;  	struct stmpe_gpio_platform_data *gpio; diff --git a/include/linux/mfd/tps65910.h b/include/linux/mfd/tps65910.h index 82b4c8801a4..d0cb12eba40 100644 --- a/include/linux/mfd/tps65910.h +++ b/include/linux/mfd/tps65910.h @@ -243,7 +243,8 @@  /*Registers VDD1, VDD2 voltage values definitions */ -#define VDD1_2_NUM_VOLTS				73 +#define VDD1_2_NUM_VOLT_FINE				73 +#define VDD1_2_NUM_VOLT_COARSE				3  #define VDD1_2_MIN_VOLT					6000  #define VDD1_2_OFFSET					125 @@ -739,6 +740,34 @@  #define TPS65910_GPIO_STS				BIT(1)  #define TPS65910_GPIO_SET				BIT(0) +/* Regulator Index Definitions */ +#define TPS65910_REG_VRTC				0 +#define TPS65910_REG_VIO				1 +#define TPS65910_REG_VDD1				2 +#define TPS65910_REG_VDD2				3 +#define TPS65910_REG_VDD3				4 +#define TPS65910_REG_VDIG1				5 +#define TPS65910_REG_VDIG2				6 +#define TPS65910_REG_VPLL				7 +#define TPS65910_REG_VDAC				8 +#define TPS65910_REG_VAUX1				9 +#define TPS65910_REG_VAUX2				10 +#define TPS65910_REG_VAUX33				11 +#define TPS65910_REG_VMMC				12 + +#define TPS65911_REG_VDDCTRL				4 +#define TPS65911_REG_LDO1				5 +#define TPS65911_REG_LDO2				6 +#define TPS65911_REG_LDO3				7 +#define TPS65911_REG_LDO4				8 +#define TPS65911_REG_LDO5				9 +#define TPS65911_REG_LDO6				10 +#define TPS65911_REG_LDO7				11 +#define TPS65911_REG_LDO8				12 + +/* Max number of TPS65910/11 regulators */ +#define TPS65910_NUM_REGS				13 +  /**   * struct tps65910_board   * Board platform data may be used to initialize regulators. @@ -750,7 +779,7 @@ struct tps65910_board {  	int irq_base;  	int vmbch_threshold;  	int vmbch2_threshold; -	struct regulator_init_data *tps65910_pmic_init_data; +	struct regulator_init_data *tps65910_pmic_init_data[TPS65910_NUM_REGS];  };  /** diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 2463c261959..9bc9ac651da 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h @@ -187,8 +187,10 @@ struct twl6040 {  	int rev;  	u8 vibra_ctrl_cache[2]; +	/* PLL configuration */  	int pll;  	unsigned int sysclk; +	unsigned int mclk;  	unsigned int irq;  	unsigned int irq_base; diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h index f44bdb7273b..9eff2a351ec 100644 --- a/include/linux/mfd/wm8994/core.h +++ b/include/linux/mfd/wm8994/core.h @@ -15,6 +15,7 @@  #ifndef __MFD_WM8994_CORE_H__  #define __MFD_WM8994_CORE_H__ +#include <linux/mutex.h>  #include <linux/interrupt.h>  enum wm8994_type { @@ -55,6 +56,7 @@ struct wm8994 {  	struct mutex irq_lock;  	enum wm8994_type type; +	int revision;  	struct device *dev;  	struct regmap *regmap; @@ -65,13 +67,10 @@ struct wm8994 {  	int irq_base;  	int irq; -	u16 irq_masks_cur[WM8994_NUM_IRQ_REGS]; -	u16 irq_masks_cache[WM8994_NUM_IRQ_REGS]; +	struct regmap_irq_chip_data *irq_data;  	/* Used over suspend/resume */  	bool suspended; -	u16 ldo_regs[WM8994_NUM_LDO_REGS]; -	u16 gpio_regs[WM8994_NUM_GPIO_REGS];  	struct regulator_dev *dbvdd;  	int num_supplies; diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index ea32f306dca..3fb1f407d5e 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h @@ -23,7 +23,7 @@ struct wm8994_ldo_pdata {  	int enable;  	const char *supply; -	struct regulator_init_data *init_data; +	const struct regulator_init_data *init_data;  };  #define WM8994_CONFIGURE_GPIO 0x10000 @@ -113,6 +113,23 @@ struct wm8958_enh_eq_cfg {  	u16 regs[WM8958_ENH_EQ_REGS];  }; +/** + * Microphone detection rates, used to tune response rates and power + * consumption for WM8958/WM1811 microphone detection. + * + * @sysclk: System clock rate to use this configuration for. + * @idle: True if this configuration should use when no accessory is detected, + *        false otherwise. + * @start: Value for MICD_BIAS_START_TIME register field (not shifted). + * @rate: Value for MICD_RATE register field (not shifted). + */ +struct wm8958_micd_rate { +	int sysclk; +	bool idle; +	int start; +	int rate; +}; +  struct wm8994_pdata {  	int gpio_base; @@ -144,6 +161,9 @@ struct wm8994_pdata {  	int num_enh_eq_cfgs;  	struct wm8958_enh_eq_cfg *enh_eq_cfgs; +	int num_micd_rates; +	struct wm8958_micd_rate *micd_rates; +          /* LINEOUT can be differential or single ended */          unsigned int lineout1_diff:1;          unsigned int lineout2_diff:1; @@ -168,12 +188,21 @@ struct wm8994_pdata {  	/* WM8958 microphone bias configuration */  	int micbias[2]; +	/* WM8958 microphone detection ranges */ +	u16 micd_lvl_sel; +  	/* Disable the internal pull downs on the LDOs if they are  	 * always driven (eg, connected to an always on supply or  	 * GPIO that always drives an output.  If they float power  	 * consumption will rise.  	 */  	bool ldo_ena_always_driven; + +	/* +	 * SPKMODE must be pulled internally by the device on this +	 * system. +	 */ +	bool spkmode_pu;  };  #endif diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h index fae295048a8..86e6a032a07 100644 --- a/include/linux/mfd/wm8994/registers.h +++ b/include/linux/mfd/wm8994/registers.h @@ -95,11 +95,15 @@  #define WM8994_FLL1_CONTROL_3                   0x222  #define WM8994_FLL1_CONTROL_4                   0x223  #define WM8994_FLL1_CONTROL_5                   0x224 +#define WM8958_FLL1_EFS_1                       0x226 +#define WM8958_FLL1_EFS_2                       0x227  #define WM8994_FLL2_CONTROL_1                   0x240  #define WM8994_FLL2_CONTROL_2                   0x241  #define WM8994_FLL2_CONTROL_3                   0x242  #define WM8994_FLL2_CONTROL_4                   0x243  #define WM8994_FLL2_CONTROL_5                   0x244 +#define WM8958_FLL2_EFS_1                       0x246 +#define WM8958_FLL2_EFS_2                       0x247  #define WM8994_AIF1_CONTROL_1                   0x300  #define WM8994_AIF1_CONTROL_2                   0x301  #define WM8994_AIF1_MASTER_SLAVE                0x302 @@ -116,6 +120,7 @@  #define WM8994_AIF2DAC_LRCLK                    0x315  #define WM8994_AIF2DAC_DATA                     0x316  #define WM8994_AIF2ADC_DATA                     0x317 +#define WM1811_AIF2TX_CONTROL                   0x318  #define WM8958_AIF3_CONTROL_1                   0x320  #define WM8958_AIF3_CONTROL_2                   0x321  #define WM8958_AIF3DAC_DATA                     0x322 @@ -166,6 +171,7 @@  #define WM8994_AIF1_DAC1_EQ_BAND_5_A            0x491  #define WM8994_AIF1_DAC1_EQ_BAND_5_B            0x492  #define WM8994_AIF1_DAC1_EQ_BAND_5_PG           0x493 +#define WM8994_AIF1_DAC1_EQ_BAND_1_C            0x494  #define WM8994_AIF1_DAC2_EQ_GAINS_1             0x4A0  #define WM8994_AIF1_DAC2_EQ_GAINS_2             0x4A1  #define WM8994_AIF1_DAC2_EQ_BAND_1_A            0x4A2 @@ -186,6 +192,7 @@  #define WM8994_AIF1_DAC2_EQ_BAND_5_A            0x4B1  #define WM8994_AIF1_DAC2_EQ_BAND_5_B            0x4B2  #define WM8994_AIF1_DAC2_EQ_BAND_5_PG           0x4B3 +#define WM8994_AIF1_DAC2_EQ_BAND_1_C            0x4B4  #define WM8994_AIF2_ADC_LEFT_VOLUME             0x500  #define WM8994_AIF2_ADC_RIGHT_VOLUME            0x501  #define WM8994_AIF2_DAC_LEFT_VOLUME             0x502 @@ -219,6 +226,7 @@  #define WM8994_AIF2_EQ_BAND_5_A                 0x591  #define WM8994_AIF2_EQ_BAND_5_B                 0x592  #define WM8994_AIF2_EQ_BAND_5_PG                0x593 +#define WM8994_AIF2_EQ_BAND_1_C                 0x594  #define WM8994_DAC1_MIXER_VOLUMES               0x600  #define WM8994_DAC1_LEFT_MIXER_ROUTING          0x601  #define WM8994_DAC1_RIGHT_MIXER_ROUTING         0x602 @@ -242,6 +250,7 @@  #define WM8994_GPIO_4                           0x703  #define WM8994_GPIO_5                           0x704  #define WM8994_GPIO_6                           0x705 +#define WM1811_JACKDET_CTRL			0x705  #define WM8994_GPIO_7                           0x706  #define WM8994_GPIO_8                           0x707  #define WM8994_GPIO_9                           0x708 @@ -264,7 +273,43 @@  #define WM8958_DSP2_RELEASETIME                 0xA03  #define WM8958_DSP2_VERMAJMIN                   0xA04  #define WM8958_DSP2_VERBUILD                    0xA05 +#define WM8958_DSP2_TESTREG                     0xA06 +#define WM8958_DSP2_XORREG                      0xA07 +#define WM8958_DSP2_SHIFTMAXX                   0xA08 +#define WM8958_DSP2_SHIFTMAXY                   0xA09 +#define WM8958_DSP2_SHIFTMAXZ                   0xA0A +#define WM8958_DSP2_SHIFTMAXEXTLO               0xA0B +#define WM8958_DSP2_AESSELECT                   0xA0C  #define WM8958_DSP2_EXECCONTROL                 0xA0D +#define WM8958_DSP2_SAMPLEBREAK                 0xA0E +#define WM8958_DSP2_COUNTBREAK                  0xA0F +#define WM8958_DSP2_INTSTATUS                   0xA10 +#define WM8958_DSP2_EVENTSTATUS                 0xA11 +#define WM8958_DSP2_INTMASK                     0xA12 +#define WM8958_DSP2_CONFIGDWIDTH                0xA13 +#define WM8958_DSP2_CONFIGINSTR                 0xA14 +#define WM8958_DSP2_CONFIGDMEM                  0xA15 +#define WM8958_DSP2_CONFIGDELAYS                0xA16 +#define WM8958_DSP2_CONFIGNUMIO                 0xA17 +#define WM8958_DSP2_CONFIGEXTDEPTH              0xA18 +#define WM8958_DSP2_CONFIGMULTIPLIER            0xA19 +#define WM8958_DSP2_CONFIGCTRLDWIDTH            0xA1A +#define WM8958_DSP2_CONFIGPIPELINE              0xA1B +#define WM8958_DSP2_SHIFTMAXEXTHI               0xA1C +#define WM8958_DSP2_SWVERSIONREG                0xA1D +#define WM8958_DSP2_CONFIGXMEM                  0xA1E +#define WM8958_DSP2_CONFIGYMEM                  0xA1F +#define WM8958_DSP2_CONFIGZMEM                  0xA20 +#define WM8958_FW_BUILD_1                       0x2000 +#define WM8958_FW_BUILD_0                       0x2001 +#define WM8958_FW_ID_1                          0x2002 +#define WM8958_FW_ID_0                          0x2003 +#define WM8958_FW_MAJOR_1                       0x2004 +#define WM8958_FW_MAJOR_0                       0x2005 +#define WM8958_FW_MINOR_1                       0x2006 +#define WM8958_FW_MINOR_0                       0x2007 +#define WM8958_FW_PATCH_1                       0x2008 +#define WM8958_FW_PATCH_0                       0x2009  #define WM8958_MBC_BAND_2_LOWER_CUTOFF_C1_1     0x2200  #define WM8958_MBC_BAND_2_LOWER_CUTOFF_C1_2     0x2201  #define WM8958_MBC_BAND_2_LOWER_CUTOFF_C2_1     0x2202 @@ -333,6 +378,14 @@  #define WM8958_MBC_B2_PG2_2                     0x242D  #define WM8958_MBC_B1_PG2_1                     0x242E  #define WM8958_MBC_B1_PG2_2                     0x242F +#define WM8958_MBC_CROSSOVER_1                  0x2600 +#define WM8958_MBC_CROSSOVER_2                  0x2601 +#define WM8958_MBC_HPF_1                        0x2602 +#define WM8958_MBC_HPF_2                        0x2603 +#define WM8958_MBC_LPF_1                        0x2606 +#define WM8958_MBC_LPF_2                        0x2607 +#define WM8958_MBC_RMS_LIMIT_1                  0x260A +#define WM8958_MBC_RMS_LIMIT_2                  0x260B  #define WM8994_WRITE_SEQUENCER_0                0x3000  #define WM8994_WRITE_SEQUENCER_1                0x3001  #define WM8994_WRITE_SEQUENCER_2                0x3002 @@ -1852,6 +1905,9 @@  /*   * R57 (0x39) - AntiPOP (2)   */ +#define WM1811_JACKDET_MODE_MASK                0x0180  /* JACKDET_MODE - [8:7] */ +#define WM1811_JACKDET_MODE_SHIFT                    7  /* JACKDET_MODE - [8:7] */ +#define WM1811_JACKDET_MODE_WIDTH                    2  /* JACKDET_MODE - [8:7] */  #define WM8994_MICB2_DISCH                      0x0100  /* MICB2_DISCH */  #define WM8994_MICB2_DISCH_MASK                 0x0100  /* MICB2_DISCH */  #define WM8994_MICB2_DISCH_SHIFT                     8  /* MICB2_DISCH */ @@ -1963,6 +2019,21 @@  #define WM8958_MICB2_DISCH_WIDTH                     1  /* MICB2_DISCH */  /* + * R210 (0xD2) - Mic Detect 3 + */ +#define WM8958_MICD_LVL_MASK                    0x07FC  /* MICD_LVL - [10:2] */ +#define WM8958_MICD_LVL_SHIFT                        2  /* MICD_LVL - [10:2] */ +#define WM8958_MICD_LVL_WIDTH                        9  /* MICD_LVL - [10:2] */ +#define WM8958_MICD_VALID                       0x0002  /* MICD_VALID */ +#define WM8958_MICD_VALID_MASK                  0x0002  /* MICD_VALID */ +#define WM8958_MICD_VALID_SHIFT                      1  /* MICD_VALID */ +#define WM8958_MICD_VALID_WIDTH                      1  /* MICD_VALID */ +#define WM8958_MICD_STS                         0x0001  /* MICD_STS */ +#define WM8958_MICD_STS_MASK                    0x0001  /* MICD_STS */ +#define WM8958_MICD_STS_SHIFT                        0  /* MICD_STS */ +#define WM8958_MICD_STS_WIDTH                        1  /* MICD_STS */ + +/*   * R76 (0x4C) - Charge Pump (1)   */  #define WM8994_CP_ENA                           0x8000  /* CP_ENA */ @@ -2374,6 +2445,10 @@  /*   * R548 (0x224) - FLL1 Control (5)   */ +#define WM8958_FLL1_BYP                         0x8000  /* FLL1_BYP */ +#define WM8958_FLL1_BYP_MASK                    0x8000  /* FLL1_BYP */ +#define WM8958_FLL1_BYP_SHIFT                       15  /* FLL1_BYP */ +#define WM8958_FLL1_BYP_WIDTH                        1  /* FLL1_BYP */  #define WM8994_FLL1_FRC_NCO_VAL_MASK            0x1F80  /* FLL1_FRC_NCO_VAL - [12:7] */  #define WM8994_FLL1_FRC_NCO_VAL_SHIFT                7  /* FLL1_FRC_NCO_VAL - [12:7] */  #define WM8994_FLL1_FRC_NCO_VAL_WIDTH                6  /* FLL1_FRC_NCO_VAL - [12:7] */ @@ -2389,6 +2464,24 @@  #define WM8994_FLL1_REFCLK_SRC_WIDTH                 2  /* FLL1_REFCLK_SRC - [1:0] */  /* + * R550 (0x226) - FLL1 EFS 1 + */ +#define WM8958_FLL1_LAMBDA_MASK                 0xFFFF  /* FLL1_LAMBDA - [15:0] */ +#define WM8958_FLL1_LAMBDA_SHIFT                     0  /* FLL1_LAMBDA - [15:0] */ +#define WM8958_FLL1_LAMBDA_WIDTH                    16  /* FLL1_LAMBDA - [15:0] */ + +/* + * R551 (0x227) - FLL1 EFS 2 + */ +#define WM8958_FLL1_LFSR_SEL_MASK               0x0006  /* FLL1_LFSR_SEL - [2:1] */ +#define WM8958_FLL1_LFSR_SEL_SHIFT                   1  /* FLL1_LFSR_SEL - [2:1] */ +#define WM8958_FLL1_LFSR_SEL_WIDTH                   2  /* FLL1_LFSR_SEL - [2:1] */ +#define WM8958_FLL1_EFS_ENA                     0x0001  /* FLL1_EFS_ENA */ +#define WM8958_FLL1_EFS_ENA_MASK                0x0001  /* FLL1_EFS_ENA */ +#define WM8958_FLL1_EFS_ENA_SHIFT                    0  /* FLL1_EFS_ENA */ +#define WM8958_FLL1_EFS_ENA_WIDTH                    1  /* FLL1_EFS_ENA */ + +/*   * R576 (0x240) - FLL2 Control (1)   */  #define WM8994_FLL2_FRAC                        0x0004  /* FLL2_FRAC */ @@ -2437,6 +2530,10 @@  /*   * R580 (0x244) - FLL2 Control (5)   */ +#define WM8958_FLL2_BYP                         0x8000  /* FLL2_BYP */ +#define WM8958_FLL2_BYP_MASK                    0x8000  /* FLL2_BYP */ +#define WM8958_FLL2_BYP_SHIFT                       15  /* FLL2_BYP */ +#define WM8958_FLL2_BYP_WIDTH                        1  /* FLL2_BYP */  #define WM8994_FLL2_FRC_NCO_VAL_MASK            0x1F80  /* FLL2_FRC_NCO_VAL - [12:7] */  #define WM8994_FLL2_FRC_NCO_VAL_SHIFT                7  /* FLL2_FRC_NCO_VAL - [12:7] */  #define WM8994_FLL2_FRC_NCO_VAL_WIDTH                6  /* FLL2_FRC_NCO_VAL - [12:7] */ @@ -2452,6 +2549,24 @@  #define WM8994_FLL2_REFCLK_SRC_WIDTH                 2  /* FLL2_REFCLK_SRC - [1:0] */  /* + * R582 (0x246) - FLL2 EFS 1 + */ +#define WM8958_FLL2_LAMBDA_MASK                 0xFFFF  /* FLL2_LAMBDA - [15:0] */ +#define WM8958_FLL2_LAMBDA_SHIFT                     0  /* FLL2_LAMBDA - [15:0] */ +#define WM8958_FLL2_LAMBDA_WIDTH                    16  /* FLL2_LAMBDA - [15:0] */ + +/* + * R583 (0x247) - FLL2 EFS 2 + */ +#define WM8958_FLL2_LFSR_SEL_MASK               0x0006  /* FLL2_LFSR_SEL - [2:1] */ +#define WM8958_FLL2_LFSR_SEL_SHIFT                   1  /* FLL2_LFSR_SEL - [2:1] */ +#define WM8958_FLL2_LFSR_SEL_WIDTH                   2  /* FLL2_LFSR_SEL - [2:1] */ +#define WM8958_FLL2_EFS_ENA                     0x0001  /* FLL2_EFS_ENA */ +#define WM8958_FLL2_EFS_ENA_MASK                0x0001  /* FLL2_EFS_ENA */ +#define WM8958_FLL2_EFS_ENA_SHIFT                    0  /* FLL2_EFS_ENA */ +#define WM8958_FLL2_EFS_ENA_WIDTH                    1  /* FLL2_EFS_ENA */ + +/*   * R768 (0x300) - AIF1 Control (1)   */  #define WM8994_AIF1ADCL_SRC                     0x8000  /* AIF1ADCL_SRC */ @@ -4172,6 +4287,18 @@  #define WM8994_STL_SEL_WIDTH                         1  /* STL_SEL */  /* + * R1797 (0x705) - JACKDET Ctrl + */ +#define WM1811_JACKDET_DB                       0x0100  /* JACKDET_DB */ +#define WM1811_JACKDET_DB_MASK                  0x0100  /* JACKDET_DB */ +#define WM1811_JACKDET_DB_SHIFT                      8  /* JACKDET_DB */ +#define WM1811_JACKDET_DB_WIDTH                      1  /* JACKDET_DB */ +#define WM1811_JACKDET_LVL                      0x0040  /* JACKDET_LVL */ +#define WM1811_JACKDET_LVL_MASK                 0x0040  /* JACKDET_LVL */ +#define WM1811_JACKDET_LVL_SHIFT                     6  /* JACKDET_LVL */ +#define WM1811_JACKDET_LVL_WIDTH                     1  /* JACKDET_LVL */ + +/*   * R1824 (0x720) - Pull Control (1)   */  #define WM8994_DMICDAT2_PU                      0x0800  /* DMICDAT2_PU */ diff --git a/include/linux/migrate.h b/include/linux/migrate.h index e39aeecfe9a..05ed2828a55 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -3,6 +3,7 @@  #include <linux/mm.h>  #include <linux/mempolicy.h> +#include <linux/migrate_mode.h>  typedef struct page *new_page_t(struct page *, unsigned long private, int **); @@ -11,13 +12,13 @@ typedef struct page *new_page_t(struct page *, unsigned long private, int **);  extern void putback_lru_pages(struct list_head *l);  extern int migrate_page(struct address_space *, -			struct page *, struct page *); +			struct page *, struct page *, enum migrate_mode);  extern int migrate_pages(struct list_head *l, new_page_t x,  			unsigned long private, bool offlining, -			bool sync); +			enum migrate_mode mode);  extern int migrate_huge_pages(struct list_head *l, new_page_t x,  			unsigned long private, bool offlining, -			bool sync); +			enum migrate_mode mode);  extern int fail_migrate_page(struct address_space *,  			struct page *, struct page *); @@ -36,10 +37,10 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping,  static inline void putback_lru_pages(struct list_head *l) {}  static inline int migrate_pages(struct list_head *l, new_page_t x,  		unsigned long private, bool offlining, -		bool sync) { return -ENOSYS; } +		enum migrate_mode mode) { return -ENOSYS; }  static inline int migrate_huge_pages(struct list_head *l, new_page_t x,  		unsigned long private, bool offlining, -		bool sync) { return -ENOSYS; } +		enum migrate_mode mode) { return -ENOSYS; }  static inline int migrate_prep(void) { return -ENOSYS; }  static inline int migrate_prep_local(void) { return -ENOSYS; } diff --git a/include/linux/migrate_mode.h b/include/linux/migrate_mode.h new file mode 100644 index 00000000000..ebf3d89a391 --- /dev/null +++ b/include/linux/migrate_mode.h @@ -0,0 +1,16 @@ +#ifndef MIGRATE_MODE_H_INCLUDED +#define MIGRATE_MODE_H_INCLUDED +/* + * MIGRATE_ASYNC means never block + * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking + *	on most operations but not ->writepage as the potential stall time + *	is too significant + * MIGRATE_SYNC will block when migrating pages + */ +enum migrate_mode { +	MIGRATE_ASYNC, +	MIGRATE_SYNC_LIGHT, +	MIGRATE_SYNC, +}; + +#endif		/* MIGRATE_MODE_H_INCLUDED */ diff --git a/include/linux/mii.h b/include/linux/mii.h index 27748230aa6..2783eca629a 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h @@ -9,6 +9,7 @@  #define __LINUX_MII_H__  #include <linux/types.h> +#include <linux/ethtool.h>  /* Generic MII registers. */  #define MII_BMCR		0x00	/* Basic mode control register */ @@ -240,6 +241,205 @@ static inline unsigned int mii_duplex (unsigned int duplex_lock,  }  /** + * ethtool_adv_to_mii_adv_t + * @ethadv: the ethtool advertisement settings + * + * A small helper function that translates ethtool advertisement + * settings to phy autonegotiation advertisements for the + * MII_ADVERTISE register. + */ +static inline u32 ethtool_adv_to_mii_adv_t(u32 ethadv) +{ +	u32 result = 0; + +	if (ethadv & ADVERTISED_10baseT_Half) +		result |= ADVERTISE_10HALF; +	if (ethadv & ADVERTISED_10baseT_Full) +		result |= ADVERTISE_10FULL; +	if (ethadv & ADVERTISED_100baseT_Half) +		result |= ADVERTISE_100HALF; +	if (ethadv & ADVERTISED_100baseT_Full) +		result |= ADVERTISE_100FULL; +	if (ethadv & ADVERTISED_Pause) +		result |= ADVERTISE_PAUSE_CAP; +	if (ethadv & ADVERTISED_Asym_Pause) +		result |= ADVERTISE_PAUSE_ASYM; + +	return result; +} + +/** + * mii_adv_to_ethtool_adv_t + * @adv: value of the MII_ADVERTISE register + * + * A small helper function that translates MII_ADVERTISE bits + * to ethtool advertisement settings. + */ +static inline u32 mii_adv_to_ethtool_adv_t(u32 adv) +{ +	u32 result = 0; + +	if (adv & ADVERTISE_10HALF) +		result |= ADVERTISED_10baseT_Half; +	if (adv & ADVERTISE_10FULL) +		result |= ADVERTISED_10baseT_Full; +	if (adv & ADVERTISE_100HALF) +		result |= ADVERTISED_100baseT_Half; +	if (adv & ADVERTISE_100FULL) +		result |= ADVERTISED_100baseT_Full; +	if (adv & ADVERTISE_PAUSE_CAP) +		result |= ADVERTISED_Pause; +	if (adv & ADVERTISE_PAUSE_ASYM) +		result |= ADVERTISED_Asym_Pause; + +	return result; +} + +/** + * ethtool_adv_to_mii_ctrl1000_t + * @ethadv: the ethtool advertisement settings + * + * A small helper function that translates ethtool advertisement + * settings to phy autonegotiation advertisements for the + * MII_CTRL1000 register when in 1000T mode. + */ +static inline u32 ethtool_adv_to_mii_ctrl1000_t(u32 ethadv) +{ +	u32 result = 0; + +	if (ethadv & ADVERTISED_1000baseT_Half) +		result |= ADVERTISE_1000HALF; +	if (ethadv & ADVERTISED_1000baseT_Full) +		result |= ADVERTISE_1000FULL; + +	return result; +} + +/** + * mii_ctrl1000_to_ethtool_adv_t + * @adv: value of the MII_CTRL1000 register + * + * A small helper function that translates MII_CTRL1000 + * bits, when in 1000Base-T mode, to ethtool + * advertisement settings. + */ +static inline u32 mii_ctrl1000_to_ethtool_adv_t(u32 adv) +{ +	u32 result = 0; + +	if (adv & ADVERTISE_1000HALF) +		result |= ADVERTISED_1000baseT_Half; +	if (adv & ADVERTISE_1000FULL) +		result |= ADVERTISED_1000baseT_Full; + +	return result; +} + +/** + * mii_lpa_to_ethtool_lpa_t + * @adv: value of the MII_LPA register + * + * A small helper function that translates MII_LPA + * bits, when in 1000Base-T mode, to ethtool + * LP advertisement settings. + */ +static inline u32 mii_lpa_to_ethtool_lpa_t(u32 lpa) +{ +	u32 result = 0; + +	if (lpa & LPA_LPACK) +		result |= ADVERTISED_Autoneg; + +	return result | mii_adv_to_ethtool_adv_t(lpa); +} + +/** + * mii_stat1000_to_ethtool_lpa_t + * @adv: value of the MII_STAT1000 register + * + * A small helper function that translates MII_STAT1000 + * bits, when in 1000Base-T mode, to ethtool + * advertisement settings. + */ +static inline u32 mii_stat1000_to_ethtool_lpa_t(u32 lpa) +{ +	u32 result = 0; + +	if (lpa & LPA_1000HALF) +		result |= ADVERTISED_1000baseT_Half; +	if (lpa & LPA_1000FULL) +		result |= ADVERTISED_1000baseT_Full; + +	return result; +} + +/** + * ethtool_adv_to_mii_adv_x + * @ethadv: the ethtool advertisement settings + * + * A small helper function that translates ethtool advertisement + * settings to phy autonegotiation advertisements for the + * MII_CTRL1000 register when in 1000Base-X mode. + */ +static inline u32 ethtool_adv_to_mii_adv_x(u32 ethadv) +{ +	u32 result = 0; + +	if (ethadv & ADVERTISED_1000baseT_Half) +		result |= ADVERTISE_1000XHALF; +	if (ethadv & ADVERTISED_1000baseT_Full) +		result |= ADVERTISE_1000XFULL; +	if (ethadv & ADVERTISED_Pause) +		result |= ADVERTISE_1000XPAUSE; +	if (ethadv & ADVERTISED_Asym_Pause) +		result |= ADVERTISE_1000XPSE_ASYM; + +	return result; +} + +/** + * mii_adv_to_ethtool_adv_x + * @adv: value of the MII_CTRL1000 register + * + * A small helper function that translates MII_CTRL1000 + * bits, when in 1000Base-X mode, to ethtool + * advertisement settings. + */ +static inline u32 mii_adv_to_ethtool_adv_x(u32 adv) +{ +	u32 result = 0; + +	if (adv & ADVERTISE_1000XHALF) +		result |= ADVERTISED_1000baseT_Half; +	if (adv & ADVERTISE_1000XFULL) +		result |= ADVERTISED_1000baseT_Full; +	if (adv & ADVERTISE_1000XPAUSE) +		result |= ADVERTISED_Pause; +	if (adv & ADVERTISE_1000XPSE_ASYM) +		result |= ADVERTISED_Asym_Pause; + +	return result; +} + +/** + * mii_lpa_to_ethtool_lpa_x + * @adv: value of the MII_LPA register + * + * A small helper function that translates MII_LPA + * bits, when in 1000Base-X mode, to ethtool + * LP advertisement settings. + */ +static inline u32 mii_lpa_to_ethtool_lpa_x(u32 lpa) +{ +	u32 result = 0; + +	if (lpa & LPA_LPACK) +		result |= ADVERTISED_Autoneg; + +	return result | mii_adv_to_ethtool_adv_x(lpa); +} + +/**   * mii_advertise_flowctrl - get flow control advertisement flags   * @cap: Flow control capabilities (FLOW_CTRL_RX, FLOW_CTRL_TX or both)   */ diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index c41d7270c6c..0549d211550 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h @@ -42,6 +42,7 @@  #define AUTOFS_MINOR		235  #define MAPPER_CTRL_MINOR	236  #define LOOP_CTRL_MINOR		237 +#define VHOST_NET_MINOR		238  #define MISC_DYNAMIC_MINOR	255  struct device; @@ -54,7 +55,7 @@ struct miscdevice  {  	struct device *parent;  	struct device *this_device;  	const char *nodename; -	mode_t mode; +	umode_t mode;  };  extern int misc_register(struct miscdevice * misc); diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index b56e4587208..9958ff2cad3 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h @@ -59,12 +59,15 @@ enum {  	MLX4_CMD_HW_HEALTH_CHECK = 0x50,  	MLX4_CMD_SET_PORT	 = 0xc,  	MLX4_CMD_SET_NODE	 = 0x5a, +	MLX4_CMD_QUERY_FUNC	 = 0x56,  	MLX4_CMD_ACCESS_DDR	 = 0x2e,  	MLX4_CMD_MAP_ICM	 = 0xffa,  	MLX4_CMD_UNMAP_ICM	 = 0xff9,  	MLX4_CMD_MAP_ICM_AUX	 = 0xffc,  	MLX4_CMD_UNMAP_ICM_AUX	 = 0xffb,  	MLX4_CMD_SET_ICM_SIZE	 = 0xffd, +	/*master notify fw on finish for slave's flr*/ +	MLX4_CMD_INFORM_FLR_DONE = 0x5b,  	/* TPT commands */  	MLX4_CMD_SW2HW_MPT	 = 0xd, @@ -119,6 +122,26 @@ enum {  	/* miscellaneous commands */  	MLX4_CMD_DIAG_RPRT	 = 0x30,  	MLX4_CMD_NOP		 = 0x31, +	MLX4_CMD_ACCESS_MEM	 = 0x2e, +	MLX4_CMD_SET_VEP	 = 0x52, + +	/* Ethernet specific commands */ +	MLX4_CMD_SET_VLAN_FLTR	 = 0x47, +	MLX4_CMD_SET_MCAST_FLTR	 = 0x48, +	MLX4_CMD_DUMP_ETH_STATS	 = 0x49, + +	/* Communication channel commands */ +	MLX4_CMD_ARM_COMM_CHANNEL = 0x57, +	MLX4_CMD_GEN_EQE	 = 0x58, + +	/* virtual commands */ +	MLX4_CMD_ALLOC_RES	 = 0xf00, +	MLX4_CMD_FREE_RES	 = 0xf01, +	MLX4_CMD_MCAST_ATTACH	 = 0xf05, +	MLX4_CMD_UCAST_ATTACH	 = 0xf06, +	MLX4_CMD_PROMISC         = 0xf08, +	MLX4_CMD_QUERY_FUNC_CAP  = 0xf0a, +	MLX4_CMD_QP_ATTACH	 = 0xf0b,  	/* debug commands */  	MLX4_CMD_QUERY_DEBUG_MSG = 0x2a, @@ -126,6 +149,7 @@ enum {  	/* statistics commands */  	MLX4_CMD_QUERY_IF_STAT	 = 0X54, +	MLX4_CMD_SET_IF_STAT	 = 0X55,  };  enum { @@ -135,7 +159,8 @@ enum {  };  enum { -	MLX4_MAILBOX_SIZE	=  4096 +	MLX4_MAILBOX_SIZE	= 4096, +	MLX4_ACCESS_MEM_ALIGN	= 256,  };  enum { @@ -148,6 +173,11 @@ enum {  	MLX4_SET_PORT_GID_TABLE = 0x5,  }; +enum { +	MLX4_CMD_WRAPPED, +	MLX4_CMD_NATIVE +}; +  struct mlx4_dev;  struct mlx4_cmd_mailbox { @@ -157,23 +187,24 @@ struct mlx4_cmd_mailbox {  int __mlx4_cmd(struct mlx4_dev *dev, u64 in_param, u64 *out_param,  	       int out_is_imm, u32 in_modifier, u8 op_modifier, -	       u16 op, unsigned long timeout); +	       u16 op, unsigned long timeout, int native);  /* Invoke a command with no output parameter */  static inline int mlx4_cmd(struct mlx4_dev *dev, u64 in_param, u32 in_modifier, -			   u8 op_modifier, u16 op, unsigned long timeout) +			   u8 op_modifier, u16 op, unsigned long timeout, +			   int native)  {  	return __mlx4_cmd(dev, in_param, NULL, 0, in_modifier, -			  op_modifier, op, timeout); +			  op_modifier, op, timeout, native);  }  /* Invoke a command with an output mailbox */  static inline int mlx4_cmd_box(struct mlx4_dev *dev, u64 in_param, u64 out_param,  			       u32 in_modifier, u8 op_modifier, u16 op, -			       unsigned long timeout) +			       unsigned long timeout, int native)  {  	return __mlx4_cmd(dev, in_param, &out_param, 0, in_modifier, -			  op_modifier, op, timeout); +			  op_modifier, op, timeout, native);  }  /* @@ -183,13 +214,17 @@ static inline int mlx4_cmd_box(struct mlx4_dev *dev, u64 in_param, u64 out_param   */  static inline int mlx4_cmd_imm(struct mlx4_dev *dev, u64 in_param, u64 *out_param,  			       u32 in_modifier, u8 op_modifier, u16 op, -			       unsigned long timeout) +			       unsigned long timeout, int native)  {  	return __mlx4_cmd(dev, in_param, out_param, 1, in_modifier, -			  op_modifier, op, timeout); +			  op_modifier, op, timeout, native);  }  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); + +#define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8) +  #endif /* MLX4_CMD_H */ diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 84b0b1848f1..aea61905499 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -47,6 +47,9 @@  enum {  	MLX4_FLAG_MSI_X		= 1 << 0,  	MLX4_FLAG_OLD_PORT_CMDS	= 1 << 1, +	MLX4_FLAG_MASTER	= 1 << 2, +	MLX4_FLAG_SLAVE		= 1 << 3, +	MLX4_FLAG_SRIOV		= 1 << 4,  };  enum { @@ -58,6 +61,15 @@ enum {  };  enum { +	MLX4_MAX_NUM_PF		= 16, +	MLX4_MAX_NUM_VF		= 64, +	MLX4_MFUNC_MAX		= 80, +	MLX4_MFUNC_EQ_NUM	= 4, +	MLX4_MFUNC_MAX_EQES     = 8, +	MLX4_MFUNC_EQE_MASK     = (MLX4_MFUNC_MAX_EQES - 1) +}; + +enum {  	MLX4_DEV_CAP_FLAG_RC		= 1LL <<  0,  	MLX4_DEV_CAP_FLAG_UC		= 1LL <<  1,  	MLX4_DEV_CAP_FLAG_UD		= 1LL <<  2, @@ -77,11 +89,13 @@ enum {  	MLX4_DEV_CAP_FLAG_IBOE		= 1LL << 30,  	MLX4_DEV_CAP_FLAG_UC_LOOPBACK	= 1LL << 32,  	MLX4_DEV_CAP_FLAG_FCS_KEEP	= 1LL << 34, -	MLX4_DEV_CAP_FLAG_WOL		= 1LL << 38, +	MLX4_DEV_CAP_FLAG_WOL_PORT1	= 1LL << 37, +	MLX4_DEV_CAP_FLAG_WOL_PORT2	= 1LL << 38,  	MLX4_DEV_CAP_FLAG_UDP_RSS	= 1LL << 40,  	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_COUNTERS	= 1LL << 48, +	MLX4_DEV_CAP_FLAG_SENSE_SUPPORT	= 1LL << 55  };  #define MLX4_ATTR_EXTENDED_PORT_INFO	cpu_to_be16(0xff90) @@ -116,7 +130,11 @@ enum mlx4_event {  	MLX4_EVENT_TYPE_PORT_CHANGE	   = 0x09,  	MLX4_EVENT_TYPE_EQ_OVERFLOW	   = 0x0f,  	MLX4_EVENT_TYPE_ECC_DETECT	   = 0x0e, -	MLX4_EVENT_TYPE_CMD		   = 0x0a +	MLX4_EVENT_TYPE_CMD		   = 0x0a, +	MLX4_EVENT_TYPE_VEP_UPDATE	   = 0x19, +	MLX4_EVENT_TYPE_COMM_CHANNEL	   = 0x18, +	MLX4_EVENT_TYPE_FLR_EVENT	   = 0x1c, +	MLX4_EVENT_TYPE_NONE		   = 0xff,  };  enum { @@ -183,6 +201,7 @@ enum mlx4_qp_region {  };  enum mlx4_port_type { +	MLX4_PORT_TYPE_NONE	= 0,  	MLX4_PORT_TYPE_IB	= 1,  	MLX4_PORT_TYPE_ETH	= 2,  	MLX4_PORT_TYPE_AUTO	= 3 @@ -215,6 +234,7 @@ static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor)  struct mlx4_caps {  	u64			fw_ver; +	u32			function;  	int			num_ports;  	int			vl_cap[MLX4_MAX_PORTS + 1];  	int			ib_mtu_cap[MLX4_MAX_PORTS + 1]; @@ -229,6 +249,7 @@ struct mlx4_caps {  	u64			trans_code[MLX4_MAX_PORTS + 1];  	int			local_ca_ack_delay;  	int			num_uars; +	u32			uar_page_size;  	int			bf_reg_size;  	int			bf_regs_per_page;  	int			max_sq_sg; @@ -252,8 +273,7 @@ struct mlx4_caps {  	int			num_comp_vectors;  	int			comp_pool;  	int			num_mpts; -	int			num_mtt_segs; -	int			mtts_per_seg; +	int			num_mtts;  	int			fmr_reserved_mtts;  	int			reserved_mtts;  	int			reserved_mrws; @@ -283,7 +303,9 @@ struct mlx4_caps {  	int                     log_num_prios;  	enum mlx4_port_type	port_type[MLX4_MAX_PORTS + 1];  	u8			supported_type[MLX4_MAX_PORTS + 1]; -	u32			port_mask; +	u8                      suggested_type[MLX4_MAX_PORTS + 1]; +	u8                      default_sense[MLX4_MAX_PORTS + 1]; +	u32			port_mask[MLX4_MAX_PORTS + 1];  	enum mlx4_port_type	possible_type[MLX4_MAX_PORTS + 1];  	u32			max_counters;  	u8			ext_port_cap[MLX4_MAX_PORTS + 1]; @@ -303,7 +325,7 @@ struct mlx4_buf {  };  struct mlx4_mtt { -	u32			first_seg; +	u32			offset;  	int			order;  	int			page_shift;  }; @@ -465,10 +487,12 @@ struct mlx4_counter {  struct mlx4_dev {  	struct pci_dev	       *pdev;  	unsigned long		flags; +	unsigned long		num_slaves;  	struct mlx4_caps	caps;  	struct radix_tree_root	qp_table_tree;  	u8			rev_id;  	char			board_id[MLX4_BOARD_ID_LEN]; +	int			num_vfs;  };  struct mlx4_init_port_param { @@ -487,14 +511,32 @@ struct mlx4_init_port_param {  #define mlx4_foreach_port(port, dev, type)				\  	for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++)	\ -		if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \ -		     ~(dev)->caps.port_mask) & 1 << ((port) - 1)) +		if ((type) == (dev)->caps.port_mask[(port)]) -#define mlx4_foreach_ib_transport_port(port, dev)			\ -	for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++)	\ -		if (((dev)->caps.port_mask & 1 << ((port) - 1)) ||	\ -		    ((dev)->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) +#define mlx4_foreach_ib_transport_port(port, dev)                         \ +	for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++)	  \ +		if (((dev)->caps.port_mask[port] == MLX4_PORT_TYPE_IB) || \ +			((dev)->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) +static inline int mlx4_is_master(struct mlx4_dev *dev) +{ +	return dev->flags & MLX4_FLAG_MASTER; +} + +static inline int mlx4_is_qp_reserved(struct mlx4_dev *dev, u32 qpn) +{ +	return (qpn < dev->caps.sqp_start + 8); +} + +static inline int mlx4_is_mfunc(struct mlx4_dev *dev) +{ +	return dev->flags & (MLX4_FLAG_SLAVE | MLX4_FLAG_MASTER); +} + +static inline int mlx4_is_slave(struct mlx4_dev *dev) +{ +	return dev->flags & MLX4_FLAG_SLAVE; +}  int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct,  		   struct mlx4_buf *buf); @@ -560,6 +602,10 @@ int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_waterm  int mlx4_INIT_PORT(struct mlx4_dev *dev, int port);  int mlx4_CLOSE_PORT(struct mlx4_dev *dev, int port); +int mlx4_unicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], +			int block_mcast_loopback, enum mlx4_protocol prot); +int mlx4_unicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], +			enum mlx4_protocol prot);  int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],  			  int block_mcast_loopback, enum mlx4_protocol protocol);  int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], @@ -570,9 +616,12 @@ int mlx4_unicast_promisc_add(struct mlx4_dev *dev, u32 qpn, u8 port);  int mlx4_unicast_promisc_remove(struct mlx4_dev *dev, u32 qpn, u8 port);  int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode); -int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *qpn, u8 wrap); -void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int qpn); -int mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac, u8 wrap); +int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac); +void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac); +int mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac); +int mlx4_get_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int *qpn); +void mlx4_put_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int qpn); +void mlx4_set_stats_bitmap(struct mlx4_dev *dev, u64 *stats_bitmap);  int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx);  int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 48cc4cb9785..bee8fa23127 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h @@ -97,6 +97,33 @@ enum {  	MLX4_QP_BIT_RIC				= 1 <<	4,  }; +enum { +	MLX4_RSS_HASH_XOR			= 0, +	MLX4_RSS_HASH_TOP			= 1, + +	MLX4_RSS_UDP_IPV6			= 1 << 0, +	MLX4_RSS_UDP_IPV4			= 1 << 1, +	MLX4_RSS_TCP_IPV6			= 1 << 2, +	MLX4_RSS_IPV6				= 1 << 3, +	MLX4_RSS_TCP_IPV4			= 1 << 4, +	MLX4_RSS_IPV4				= 1 << 5, + +	/* offset of mlx4_rss_context within mlx4_qp_context.pri_path */ +	MLX4_RSS_OFFSET_IN_QPC_PRI_PATH		= 0x24, +	/* offset of being RSS indirection QP within mlx4_qp_context.flags */ +	MLX4_RSS_QPC_FLAG_OFFSET		= 13, +}; + +struct mlx4_rss_context { +	__be32			base_qpn; +	__be32			default_qpn; +	u16			reserved; +	u8			hash_fn; +	u8			flags; +	__be32			rss_key[10]; +	__be32			base_qpn_udp; +}; +  struct mlx4_qp_path {  	u8			fl;  	u8			reserved1[2]; @@ -183,6 +210,7 @@ struct mlx4_wqe_ctrl_seg {  	 * [4]   IP checksum  	 * [3:2] C (generate completion queue entry)  	 * [1]   SE (solicited event) +	 * [0]   FL (force loopback)  	 */  	__be32			srcrb_flags;  	/* diff --git a/include/linux/mm.h b/include/linux/mm.h index 3dc3a8c2c48..17b27cd269c 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -10,6 +10,7 @@  #include <linux/mmzone.h>  #include <linux/rbtree.h>  #include <linux/prio_tree.h> +#include <linux/atomic.h>  #include <linux/debug_locks.h>  #include <linux/mm_types.h>  #include <linux/range.h> @@ -1252,41 +1253,34 @@ static inline void pgtable_page_dtor(struct page *page)  extern void free_area_init(unsigned long * zones_size);  extern void free_area_init_node(int nid, unsigned long * zones_size,  		unsigned long zone_start_pfn, unsigned long *zholes_size); -#ifdef CONFIG_ARCH_POPULATES_NODE_MAP +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP  /* - * With CONFIG_ARCH_POPULATES_NODE_MAP set, an architecture may initialise its + * With CONFIG_HAVE_MEMBLOCK_NODE_MAP set, an architecture may initialise its   * zones, allocate the backing mem_map and account for memory holes in a more   * architecture independent manner. This is a substitute for creating the   * zone_sizes[] and zholes_size[] arrays and passing them to   * free_area_init_node()   *   * An architecture is expected to register range of page frames backed by - * physical memory with add_active_range() before calling + * physical memory with memblock_add[_node]() before calling   * free_area_init_nodes() passing in the PFN each zone ends at. At a basic   * usage, an architecture is expected to do something like   *   * unsigned long max_zone_pfns[MAX_NR_ZONES] = {max_dma, max_normal_pfn,   * 							 max_highmem_pfn};   * for_each_valid_physical_page_range() - * 	add_active_range(node_id, start_pfn, end_pfn) + * 	memblock_add_node(base, size, nid)   * free_area_init_nodes(max_zone_pfns);   * - * If the architecture guarantees that there are no holes in the ranges - * registered with add_active_range(), free_bootmem_active_regions() - * will call free_bootmem_node() for each registered physical page range. - * Similarly sparse_memory_present_with_active_regions() calls - * memory_present() for each range when SPARSEMEM is enabled. + * free_bootmem_with_active_regions() calls free_bootmem_node() for each + * registered physical page range.  Similarly + * sparse_memory_present_with_active_regions() calls memory_present() for + * each range when SPARSEMEM is enabled.   *   * See mm/page_alloc.c for more information on each function exposed by - * CONFIG_ARCH_POPULATES_NODE_MAP + * CONFIG_HAVE_MEMBLOCK_NODE_MAP.   */  extern void free_area_init_nodes(unsigned long *max_zone_pfn); -extern void add_active_range(unsigned int nid, unsigned long start_pfn, -					unsigned long end_pfn); -extern void remove_active_range(unsigned int nid, unsigned long start_pfn, -					unsigned long end_pfn); -extern void remove_all_active_ranges(void); -void sort_node_map(void);  unsigned long node_map_pfn_alignment(void);  unsigned long __absent_pages_in_range(int nid, unsigned long start_pfn,  						unsigned long end_pfn); @@ -1299,14 +1293,11 @@ extern void free_bootmem_with_active_regions(int nid,  						unsigned long max_low_pfn);  int add_from_early_node_map(struct range *range, int az,  				   int nr_range, int nid); -u64 __init find_memory_core_early(int nid, u64 size, u64 align, -					u64 goal, u64 limit); -typedef int (*work_fn_t)(unsigned long, unsigned long, void *); -extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);  extern void sparse_memory_present_with_active_regions(int nid); -#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ -#if !defined(CONFIG_ARCH_POPULATES_NODE_MAP) && \ +#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ + +#if !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) && \      !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)  static inline int __early_pfn_to_nid(unsigned long pfn)  { @@ -1491,6 +1482,18 @@ static inline unsigned long vma_pages(struct vm_area_struct *vma)  	return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;  } +/* Look up the first VMA which exactly match the interval vm_start ... vm_end */ +static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm, +				unsigned long vm_start, unsigned long vm_end) +{ +	struct vm_area_struct *vma = find_vma(mm, vm_start); + +	if (vma && (vma->vm_start != vm_start || vma->vm_end != vm_end)) +		vma = NULL; + +	return vma; +} +  #ifdef CONFIG_MMU  pgprot_t vm_get_page_prot(unsigned long vm_flags);  #else @@ -1537,23 +1540,13 @@ static inline void vm_stat_account(struct mm_struct *mm,  #endif /* CONFIG_PROC_FS */  #ifdef CONFIG_DEBUG_PAGEALLOC -extern int debug_pagealloc_enabled; -  extern void kernel_map_pages(struct page *page, int numpages, int enable); - -static inline void enable_debug_pagealloc(void) -{ -	debug_pagealloc_enabled = 1; -}  #ifdef CONFIG_HIBERNATION  extern bool kernel_page_present(struct page *page);  #endif /* CONFIG_HIBERNATION */  #else  static inline void  kernel_map_pages(struct page *page, int numpages, int enable) {} -static inline void enable_debug_pagealloc(void) -{ -}  #ifdef CONFIG_HIBERNATION  static inline bool kernel_page_present(struct page *page) { return true; }  #endif /* CONFIG_HIBERNATION */ @@ -1627,5 +1620,22 @@ extern void copy_user_huge_page(struct page *dst, struct page *src,  				unsigned int pages_per_huge_page);  #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */ +#ifdef CONFIG_DEBUG_PAGEALLOC +extern unsigned int _debug_guardpage_minorder; + +static inline unsigned int debug_guardpage_minorder(void) +{ +	return _debug_guardpage_minorder; +} + +static inline bool page_is_guard(struct page *page) +{ +	return test_bit(PAGE_DEBUG_FLAG_GUARD, &page->debug_flags); +} +#else +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 */ +  #endif /* __KERNEL__ */  #endif /* _LINUX_MM_H */ diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 8f7d24712dc..227fd3e9a9c 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -22,26 +22,21 @@ static inline int page_is_file_cache(struct page *page)  }  static inline void -__add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l, -		       struct list_head *head) +add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list lru)  { -	list_add(&page->lru, head); -	__mod_zone_page_state(zone, NR_LRU_BASE + l, hpage_nr_pages(page)); -	mem_cgroup_add_lru_list(page, l); -} +	struct lruvec *lruvec; -static inline void -add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l) -{ -	__add_page_to_lru_list(zone, page, l, &zone->lru[l].list); +	lruvec = mem_cgroup_lru_add_list(zone, page, lru); +	list_add(&page->lru, &lruvec->lists[lru]); +	__mod_zone_page_state(zone, NR_LRU_BASE + lru, hpage_nr_pages(page));  }  static inline void -del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l) +del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list lru)  { +	mem_cgroup_lru_del_list(page, lru);  	list_del(&page->lru); -	__mod_zone_page_state(zone, NR_LRU_BASE + l, -hpage_nr_pages(page)); -	mem_cgroup_del_lru_list(page, l); +	__mod_zone_page_state(zone, NR_LRU_BASE + lru, -hpage_nr_pages(page));  }  /** @@ -59,24 +54,28 @@ static inline enum lru_list page_lru_base_type(struct page *page)  	return LRU_INACTIVE_ANON;  } -static inline void -del_page_from_lru(struct zone *zone, struct page *page) +/** + * page_off_lru - which LRU list was page on? clearing its lru flags. + * @page: the page to test + * + * Returns the LRU list a page was on, as an index into the array of LRU + * lists; and clears its Unevictable or Active flags, ready for freeing. + */ +static inline enum lru_list page_off_lru(struct page *page)  { -	enum lru_list l; +	enum lru_list lru; -	list_del(&page->lru);  	if (PageUnevictable(page)) {  		__ClearPageUnevictable(page); -		l = LRU_UNEVICTABLE; +		lru = LRU_UNEVICTABLE;  	} else { -		l = page_lru_base_type(page); +		lru = page_lru_base_type(page);  		if (PageActive(page)) {  			__ClearPageActive(page); -			l += LRU_ACTIVE; +			lru += LRU_ACTIVE;  		}  	} -	__mod_zone_page_state(zone, NR_LRU_BASE + l, -hpage_nr_pages(page)); -	mem_cgroup_del_lru_list(page, l); +	return lru;  }  /** @@ -97,7 +96,6 @@ static inline enum lru_list page_lru(struct page *page)  		if (PageActive(page))  			lru += LRU_ACTIVE;  	} -  	return lru;  } diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 5b42f1b34eb..3cc3062b376 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -151,12 +151,11 @@ struct page {  #endif  }  /* - * If another subsystem starts using the double word pairing for atomic - * operations on struct page then it must change the #if to ensure - * proper alignment of the page struct. + * The struct page can be forced to be double word aligned so that atomic ops + * on double words work. The SLUB allocator can make use of such a feature.   */ -#if defined(CONFIG_SLUB) && defined(CONFIG_CMPXCHG_LOCAL) -	__attribute__((__aligned__(2*sizeof(unsigned long)))) +#ifdef CONFIG_HAVE_ALIGNED_STRUCT_PAGE +	__aligned(2 * sizeof(unsigned long))  #endif  ; diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 415f2db414e..19a41d1737a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -71,6 +71,8 @@ struct mmc_ext_csd {  	bool			hpi_en;			/* HPI enablebit */  	bool			hpi;			/* HPI support bit */  	unsigned int		hpi_cmd;		/* cmd used as HPI */ +	unsigned int		boot_ro_lock;		/* ro lock support */ +	bool			boot_ro_lockable;  	u8			raw_partition_support;	/* 160 */  	u8			raw_erased_mem_count;	/* 181 */  	u8			raw_ext_csd_structure;	/* 194 */ @@ -110,6 +112,7 @@ struct sd_ssr {  struct sd_switch_caps {  	unsigned int		hs_max_dtr;  	unsigned int		uhs_max_dtr; +#define HIGH_SPEED_MAX_DTR	50000000  #define UHS_SDR104_MAX_DTR	208000000  #define UHS_SDR50_MAX_DTR	100000000  #define UHS_DDR50_MAX_DTR	50000000 @@ -117,11 +120,13 @@ struct sd_switch_caps {  #define UHS_SDR12_MAX_DTR	25000000  	unsigned int		sd3_bus_mode;  #define UHS_SDR12_BUS_SPEED	0 +#define HIGH_SPEED_BUS_SPEED	1  #define UHS_SDR25_BUS_SPEED	1  #define UHS_SDR50_BUS_SPEED	2  #define UHS_SDR104_BUS_SPEED	3  #define UHS_DDR50_BUS_SPEED	4 +#define SD_MODE_HIGH_SPEED	(1 << HIGH_SPEED_BUS_SPEED)  #define SD_MODE_UHS_SDR12	(1 << UHS_SDR12_BUS_SPEED)  #define SD_MODE_UHS_SDR25	(1 << UHS_SDR25_BUS_SPEED)  #define SD_MODE_UHS_SDR50	(1 << UHS_SDR50_BUS_SPEED) @@ -184,6 +189,10 @@ struct mmc_part {  	unsigned int	part_cfg;	/* partition type */  	char	name[MAX_MMC_PART_NAME_LEN];  	bool	force_ro;	/* to make boot parts RO by default */ +	unsigned int	area_type; +#define MMC_BLK_DATA_AREA_MAIN	(1<<0) +#define MMC_BLK_DATA_AREA_BOOT	(1<<1) +#define MMC_BLK_DATA_AREA_GP	(1<<2)  };  /* @@ -206,6 +215,9 @@ struct mmc_card {  #define MMC_STATE_HIGHSPEED_DDR (1<<4)		/* card is in high speed mode */  #define MMC_STATE_ULTRAHIGHSPEED (1<<5)		/* card is in ultra high speed mode */  #define MMC_CARD_SDXC		(1<<6)		/* card is SDXC */ +#define MMC_CARD_REMOVED	(1<<7)		/* card has been removed */ +#define MMC_STATE_HIGHSPEED_200	(1<<8)		/* card is in HS200 mode */ +#define MMC_STATE_SLEEP		(1<<9)		/* card is in sleep state */  	unsigned int		quirks; 	/* card quirks */  #define MMC_QUIRK_LENIENT_FN0	(1<<0)		/* allow SDIO FN0 writes outside of the VS CCCR range */  #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)	/* use func->cur_blksize */ @@ -218,6 +230,7 @@ struct mmc_card {  #define MMC_QUIRK_INAND_CMD38	(1<<6)		/* iNAND devices have broken CMD38 */  #define MMC_QUIRK_BLK_NO_CMD23	(1<<7)		/* Avoid CMD23 for regular multiblock */  #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)	/* Avoid sending 512 bytes in */ +#define MMC_QUIRK_LONG_READ_TIME (1<<9)		/* Data read time > CSD says */  						/* byte mode */  	unsigned int    poweroff_notify_state;	/* eMMC4.5 notify feature */  #define MMC_NO_POWER_NOTIFICATION	0 @@ -260,12 +273,14 @@ struct mmc_card {   * This function fill contents in mmc_part.   */  static inline void mmc_part_add(struct mmc_card *card, unsigned int size, -			unsigned int part_cfg, char *name, int idx, bool ro) +			unsigned int part_cfg, char *name, int idx, bool ro, +			int area_type)  {  	card->part[card->nr_parts].size = size;  	card->part[card->nr_parts].part_cfg = part_cfg;  	sprintf(card->part[card->nr_parts].name, name, idx);  	card->part[card->nr_parts].force_ro = ro; +	card->part[card->nr_parts].area_type = area_type;  	card->nr_parts++;  } @@ -361,19 +376,28 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)  #define mmc_card_present(c)	((c)->state & MMC_STATE_PRESENT)  #define mmc_card_readonly(c)	((c)->state & MMC_STATE_READONLY)  #define mmc_card_highspeed(c)	((c)->state & MMC_STATE_HIGHSPEED) +#define mmc_card_hs200(c)	((c)->state & MMC_STATE_HIGHSPEED_200)  #define mmc_card_blockaddr(c)	((c)->state & MMC_STATE_BLOCKADDR)  #define mmc_card_ddr_mode(c)	((c)->state & MMC_STATE_HIGHSPEED_DDR) -#define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) +#define mmc_card_uhs(c)		((c)->state & MMC_STATE_ULTRAHIGHSPEED) +#define mmc_sd_card_uhs(c)	((c)->state & MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) +#define mmc_card_removed(c)	((c) && ((c)->state & MMC_CARD_REMOVED)) +#define mmc_card_is_sleep(c)	((c)->state & MMC_STATE_SLEEP)  #define mmc_card_set_present(c)	((c)->state |= MMC_STATE_PRESENT)  #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)  #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) +#define mmc_card_set_hs200(c)	((c)->state |= MMC_STATE_HIGHSPEED_200)  #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)  #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) +#define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)  #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) +#define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) +#define mmc_card_set_sleep(c)	((c)->state |= MMC_STATE_SLEEP) +#define mmc_card_clr_sleep(c)	((c)->state &= ~MMC_STATE_SLEEP)  /*   * Quirk add/remove for MMC products.   */ @@ -433,6 +457,11 @@ static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c)  	return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512;  } +static inline int mmc_card_long_read_time(const struct mmc_card *c) +{ +	return c->quirks & MMC_QUIRK_LONG_READ_TIME; +} +  #define mmc_card_name(c)	((c)->cid.prod_name)  #define mmc_card_id(c)		(dev_name(&(c)->dev)) diff --git a/include/linux/mmc/cd-gpio.h b/include/linux/mmc/cd-gpio.h new file mode 100644 index 00000000000..a8e46978331 --- /dev/null +++ b/include/linux/mmc/cd-gpio.h @@ -0,0 +1,19 @@ +/* + * Generic GPIO card-detect helper header + * + * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de> + * + * 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 MMC_CD_GPIO_H +#define MMC_CD_GPIO_H + +struct mmc_host; +int mmc_cd_gpio_request(struct mmc_host *host, unsigned int gpio, +			unsigned int irq, unsigned long flags); +void mmc_cd_gpio_free(struct mmc_host *host); + +#endif diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 174a844a5dd..87a976cc565 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -180,6 +180,8 @@ extern int mmc_try_claim_host(struct mmc_host *host);  extern int mmc_flush_cache(struct mmc_card *); +extern int mmc_detect_card_removed(struct mmc_host *host); +  /**   *	mmc_claim_host - exclusively claim a host   *	@host: mmc host to claim diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 6dc9b80568a..aae5d1f1bb3 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -14,6 +14,8 @@  #ifndef LINUX_MMC_DW_MMC_H  #define LINUX_MMC_DW_MMC_H +#include <linux/scatterlist.h> +  #define MAX_MCI_SLOTS	2  enum dw_mci_state { @@ -40,7 +42,7 @@ struct mmc_data;   * @lock: Spinlock protecting the queue and associated data.   * @regs: Pointer to MMIO registers.   * @sg: Scatterlist entry currently being processed by PIO code, if any. - * @pio_offset: Offset into the current scatterlist entry. + * @sg_miter: PIO mapping scatterlist iterator.   * @cur_slot: The slot which is currently using the controller.   * @mrq: The request currently being processed on @cur_slot,   *	or NULL if the controller is idle. @@ -115,7 +117,7 @@ struct dw_mci {  	void __iomem		*regs;  	struct scatterlist	*sg; -	unsigned int		pio_offset; +	struct sg_mapping_iter	sg_miter;  	struct dw_mci_slot	*cur_slot;  	struct mmc_request	*mrq; @@ -214,6 +216,7 @@ struct dw_mci_board {  	unsigned int bus_hz; /* Bus speed */  	unsigned int caps;	/* Capabilities */ +	unsigned int caps2;	/* More capabilities */  	/*  	 * Override fifo depth. If 0, autodetect it from the FIFOTH register,  	 * but note that this may not be reliable after a bootloader has used diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index a3ac9c48e5d..ee2b0363c04 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -56,10 +56,13 @@ struct mmc_ios {  #define MMC_TIMING_UHS_SDR50	3  #define MMC_TIMING_UHS_SDR104	4  #define MMC_TIMING_UHS_DDR50	5 +#define MMC_TIMING_MMC_HS200	6  #define MMC_SDR_MODE		0  #define MMC_1_2V_DDR_MODE	1  #define MMC_1_8V_DDR_MODE	2 +#define MMC_1_2V_SDR_MODE	3 +#define MMC_1_8V_SDR_MODE	4  	unsigned char	signal_voltage;		/* signalling voltage (1.8V or 3.3V) */ @@ -148,7 +151,9 @@ struct mmc_host_ops {  	void	(*init_card)(struct mmc_host *host, struct mmc_card *card);  	int	(*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios); -	int	(*execute_tuning)(struct mmc_host *host); + +	/* The tuning command opcode value is different for SD and eMMC cards */ +	int	(*execute_tuning)(struct mmc_host *host, u32 opcode);  	void	(*enable_preset_value)(struct mmc_host *host, bool enable);  	int	(*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);  	void	(*hw_reset)(struct mmc_host *host); @@ -167,6 +172,11 @@ struct mmc_async_req {  	int (*err_check) (struct mmc_card *, struct mmc_async_req *);  }; +struct mmc_hotplug { +	unsigned int irq; +	void *handler_priv; +}; +  struct mmc_host {  	struct device		*parent;  	struct device		class_dev; @@ -242,6 +252,12 @@ struct mmc_host {  #define MMC_CAP2_CACHE_CTRL	(1 << 1)	/* Allow cache control */  #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2)	/* Notify poweroff supported */  #define MMC_CAP2_NO_MULTI_READ	(1 << 3)	/* Multiblock reads don't work */ +#define MMC_CAP2_NO_SLEEP_CMD	(1 << 4)	/* Don't allow sleep command */ +#define MMC_CAP2_HS200_1_8V_SDR	(1 << 5)        /* can support */ +#define MMC_CAP2_HS200_1_2V_SDR	(1 << 6)        /* can support */ +#define MMC_CAP2_HS200		(MMC_CAP2_HS200_1_8V_SDR | \ +				 MMC_CAP2_HS200_1_2V_SDR) +#define MMC_CAP2_BROKEN_VOLTAGE	(1 << 7)	/* Use the broken voltage */  	mmc_pm_flag_t		pm_caps;	/* supported pm features */  	unsigned int        power_notify_type; @@ -253,10 +269,12 @@ struct mmc_host {  	int			clk_requests;	/* internal reference counter */  	unsigned int		clk_delay;	/* number of MCI clk hold cycles */  	bool			clk_gated;	/* clock gated */ -	struct work_struct	clk_gate_work; /* delayed clock gate */ +	struct delayed_work	clk_gate_work; /* delayed clock gate */  	unsigned int		clk_old;	/* old clock value cache */  	spinlock_t		clk_lock;	/* lock for clk fields */  	struct mutex		clk_gate_mutex;	/* mutex for clock gating */ +	struct device_attribute clkgate_delay_attr; +	unsigned long           clkgate_delay;  #endif  	/* host specific block data */ @@ -297,6 +315,8 @@ struct mmc_host {  	int			claim_cnt;	/* "claim" nesting count */  	struct delayed_work	detect; +	int			detect_change;	/* card detect flag */ +	struct mmc_hotplug	hotplug;  	const struct mmc_bus_ops *bus_ops;	/* current bus driver */  	unsigned int		bus_refs;	/* reference counter */ @@ -323,6 +343,8 @@ struct mmc_host {  	struct fault_attr	fail_mmc_request;  #endif +	unsigned int		actual_clock;	/* Actual HC clock rate */ +  	unsigned long		private[0] ____cacheline_aligned;  }; @@ -396,7 +418,7 @@ static inline void mmc_set_disable_delay(struct mmc_host *host,  }  /* Module parameter */ -extern int mmc_assume_removable; +extern bool mmc_assume_removable;  static inline int mmc_card_is_removable(struct mmc_host *host)  { @@ -423,4 +445,23 @@ static inline int mmc_boot_partition_access(struct mmc_host *host)  	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);  } +#ifdef CONFIG_MMC_CLKGATE +void mmc_host_clk_hold(struct mmc_host *host); +void mmc_host_clk_release(struct mmc_host *host); +unsigned int mmc_host_clk_rate(struct mmc_host *host); + +#else +static inline void mmc_host_clk_hold(struct mmc_host *host) +{ +} + +static inline void mmc_host_clk_release(struct mmc_host *host) +{ +} + +static inline unsigned int mmc_host_clk_rate(struct mmc_host *host) +{ +	return host->ios.clock; +} +#endif  #endif /* LINUX_MMC_HOST_H */ diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 0e7135697d1..fb9f6e116e1 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -51,6 +51,7 @@  #define MMC_READ_SINGLE_BLOCK    17   /* adtc [31:0] data addr   R1  */  #define MMC_READ_MULTIPLE_BLOCK  18   /* adtc [31:0] data addr   R1  */  #define MMC_SEND_TUNING_BLOCK    19   /* adtc                    R1  */ +#define MMC_SEND_TUNING_BLOCK_HS200	21	/* adtc R1  */    /* class 3 */  #define MMC_WRITE_DAT_UNTIL_STOP 20   /* adtc [31:0] data addr   R1  */ @@ -280,6 +281,7 @@ struct _mmc_csd {  #define EXT_CSD_RST_N_FUNCTION		162	/* R/W */  #define EXT_CSD_SANITIZE_START		165     /* W */  #define EXT_CSD_WR_REL_PARAM		166	/* RO */ +#define EXT_CSD_BOOT_WP			173	/* R/W */  #define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */  #define EXT_CSD_PART_CONFIG		179	/* R/W */  #define EXT_CSD_ERASED_MEM_CONT		181	/* RO */ @@ -321,6 +323,11 @@ struct _mmc_csd {  #define EXT_CSD_WR_REL_PARAM_EN		(1<<2) +#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS	(0x40) +#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS	(0x10) +#define EXT_CSD_BOOT_WP_B_PERM_WP_EN	(0x04) +#define EXT_CSD_BOOT_WP_B_PWR_WP_EN	(0x01) +  #define EXT_CSD_PART_CONFIG_ACC_MASK	(0x7)  #define EXT_CSD_PART_CONFIG_ACC_BOOT0	(0x1)  #define EXT_CSD_PART_CONFIG_ACC_GP0	(0x4) @@ -333,13 +340,76 @@ struct _mmc_csd {  #define EXT_CSD_CARD_TYPE_26	(1<<0)	/* Card can run at 26MHz */  #define EXT_CSD_CARD_TYPE_52	(1<<1)	/* Card can run at 52MHz */ -#define EXT_CSD_CARD_TYPE_MASK	0xF	/* Mask out reserved bits */ +#define EXT_CSD_CARD_TYPE_MASK	0x3F	/* Mask out reserved bits */  #define EXT_CSD_CARD_TYPE_DDR_1_8V  (1<<2)   /* Card can run at 52MHz */  					     /* DDR mode @1.8V or 3V I/O */  #define EXT_CSD_CARD_TYPE_DDR_1_2V  (1<<3)   /* Card can run at 52MHz */  					     /* DDR mode @1.2V I/O */  #define EXT_CSD_CARD_TYPE_DDR_52       (EXT_CSD_CARD_TYPE_DDR_1_8V  \  					| EXT_CSD_CARD_TYPE_DDR_1_2V) +#define EXT_CSD_CARD_TYPE_SDR_1_8V	(1<<4)	/* Card can run at 200MHz */ +#define EXT_CSD_CARD_TYPE_SDR_1_2V	(1<<5)	/* Card can run at 200MHz */ +						/* SDR mode @1.2V I/O */ + +#define EXT_CSD_CARD_TYPE_SDR_200	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +					 EXT_CSD_CARD_TYPE_SDR_1_2V) + +#define EXT_CSD_CARD_TYPE_SDR_ALL	(EXT_CSD_CARD_TYPE_SDR_200 | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define	EXT_CSD_CARD_TYPE_SDR_1_2V_ALL	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define	EXT_CSD_CARD_TYPE_SDR_1_8V_ALL	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26)  #define EXT_CSD_BUS_WIDTH_1	0	/* Card is in 1 bit mode */  #define EXT_CSD_BUS_WIDTH_4	1	/* Card is in 4 bit mode */ diff --git a/include/linux/mmc/sdhci-pci-data.h b/include/linux/mmc/sdhci-pci-data.h new file mode 100644 index 00000000000..8959604a13d --- /dev/null +++ b/include/linux/mmc/sdhci-pci-data.h @@ -0,0 +1,18 @@ +#ifndef LINUX_MMC_SDHCI_PCI_DATA_H +#define LINUX_MMC_SDHCI_PCI_DATA_H + +struct pci_dev; + +struct sdhci_pci_data { +	struct pci_dev	*pdev; +	int		slotno; +	int		rst_n_gpio; /* Set to -EINVAL if unused */ +	int		cd_gpio;    /* Set to -EINVAL if unused */ +	int		(*setup)(struct sdhci_pci_data *data); +	void		(*cleanup)(struct sdhci_pci_data *data); +}; + +extern struct sdhci_pci_data *(*sdhci_pci_get_data)(struct pci_dev *pdev, +				int slotno); + +#endif diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index e4b69353678..c750f85177d 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -90,8 +90,6 @@ struct sdhci_host {  	unsigned int quirks2;	/* More deviations from spec. */ -#define SDHCI_QUIRK2_OWN_CARD_DETECTION			(1<<0) -  	int irq;		/* Device IRQ */  	void __iomem *ioaddr;	/* Mapped address */ @@ -121,6 +119,7 @@ struct sdhci_host {  #define SDHCI_AUTO_CMD23	(1<<7)	/* Auto CMD23 support */  #define SDHCI_PV_ENABLED	(1<<8)	/* Preset value enabled */  #define SDHCI_SDIO_IRQ_ENABLED	(1<<9)	/* SDIO irq enabled */ +#define SDHCI_HS200_NEEDS_TUNING (1<<10)	/* HS200 needs tuning */  	unsigned int version;	/* SDHCI spec. version */ diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index e0b1123497b..c9fe66c58f8 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -38,6 +38,7 @@   *      [8:0] Byte/block count   */ +#define R4_18V_PRESENT (1<<24)  #define R4_MEMORY_PRESENT (1 << 27)  /* @@ -85,6 +86,7 @@  #define  SDIO_SD_REV_1_01	0	/* SD Physical Spec Version 1.01 */  #define  SDIO_SD_REV_1_10	1	/* SD Physical Spec Version 1.10 */  #define  SDIO_SD_REV_2_00	2	/* SD Physical Spec Version 2.00 */ +#define  SDIO_SD_REV_3_00	3	/* SD Physical Spev Version 3.00 */  #define SDIO_CCCR_IOEx		0x02  #define SDIO_CCCR_IORx		0x03 @@ -134,8 +136,31 @@  #define SDIO_CCCR_SPEED		0x13  #define  SDIO_SPEED_SHS		0x01	/* Supports High-Speed mode */ -#define  SDIO_SPEED_EHS		0x02	/* Enable High-Speed mode */ +#define  SDIO_SPEED_BSS_SHIFT	1 +#define  SDIO_SPEED_BSS_MASK	(7<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR12	(0<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR25	(1<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR50	(2<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR104	(3<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_DDR50	(4<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_EHS		SDIO_SPEED_SDR25	/* Enable High-Speed */ +#define SDIO_CCCR_UHS		0x14 +#define  SDIO_UHS_SDR50		0x01 +#define  SDIO_UHS_SDR104	0x02 +#define  SDIO_UHS_DDR50		0x04 + +#define SDIO_CCCR_DRIVE_STRENGTH 0x15 +#define  SDIO_SDTx_MASK		0x07 +#define  SDIO_DRIVE_SDTA	(1<<0) +#define  SDIO_DRIVE_SDTC	(1<<1) +#define  SDIO_DRIVE_SDTD	(1<<2) +#define  SDIO_DRIVE_DTSx_MASK	0x03 +#define  SDIO_DRIVE_DTSx_SHIFT	4 +#define  SDIO_DTSx_SET_TYPE_B	(0 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_A	(1 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_C	(2 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_D	(3 << SDIO_DRIVE_DTSx_SHIFT)  /*   * Function Basic Registers (FBR)   */ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 188cb2ffe8d..650ba2fb330 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -140,25 +140,29 @@ enum lru_list {  	NR_LRU_LISTS  }; -#define for_each_lru(l) for (l = 0; l < NR_LRU_LISTS; l++) +#define for_each_lru(lru) for (lru = 0; lru < NR_LRU_LISTS; lru++) -#define for_each_evictable_lru(l) for (l = 0; l <= LRU_ACTIVE_FILE; l++) +#define for_each_evictable_lru(lru) for (lru = 0; lru <= LRU_ACTIVE_FILE; lru++) -static inline int is_file_lru(enum lru_list l) +static inline int is_file_lru(enum lru_list lru)  { -	return (l == LRU_INACTIVE_FILE || l == LRU_ACTIVE_FILE); +	return (lru == LRU_INACTIVE_FILE || lru == LRU_ACTIVE_FILE);  } -static inline int is_active_lru(enum lru_list l) +static inline int is_active_lru(enum lru_list lru)  { -	return (l == LRU_ACTIVE_ANON || l == LRU_ACTIVE_FILE); +	return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE);  } -static inline int is_unevictable_lru(enum lru_list l) +static inline int is_unevictable_lru(enum lru_list lru)  { -	return (l == LRU_UNEVICTABLE); +	return (lru == LRU_UNEVICTABLE);  } +struct lruvec { +	struct list_head lists[NR_LRU_LISTS]; +}; +  /* Mask used at gathering information at once (see memcontrol.c) */  #define LRU_ALL_FILE (BIT(LRU_INACTIVE_FILE) | BIT(LRU_ACTIVE_FILE))  #define LRU_ALL_ANON (BIT(LRU_INACTIVE_ANON) | BIT(LRU_ACTIVE_ANON)) @@ -173,6 +177,8 @@ static inline int is_unevictable_lru(enum lru_list l)  #define ISOLATE_CLEAN		((__force isolate_mode_t)0x4)  /* Isolate unmapped file */  #define ISOLATE_UNMAPPED	((__force isolate_mode_t)0x8) +/* Isolate for asynchronous migration */ +#define ISOLATE_ASYNC_MIGRATE	((__force isolate_mode_t)0x10)  /* LRU Isolation modes. */  typedef unsigned __bitwise__ isolate_mode_t; @@ -317,6 +323,12 @@ struct zone {  	 */  	unsigned long		lowmem_reserve[MAX_NR_ZONES]; +	/* +	 * This is a per-zone reserve of pages that should not be +	 * considered dirtyable memory. +	 */ +	unsigned long		dirty_balance_reserve; +  #ifdef CONFIG_NUMA  	int node;  	/* @@ -358,10 +370,8 @@ struct zone {  	ZONE_PADDING(_pad1_)  	/* Fields commonly accessed by the page reclaim scanner */ -	spinlock_t		lru_lock;	 -	struct zone_lru { -		struct list_head list; -	} lru[NR_LRU_LISTS]; +	spinlock_t		lru_lock; +	struct lruvec		lruvec;  	struct zone_reclaim_stat reclaim_stat; @@ -598,13 +608,13 @@ struct zonelist {  #endif  }; -#ifdef CONFIG_ARCH_POPULATES_NODE_MAP +#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP  struct node_active_region {  	unsigned long start_pfn;  	unsigned long end_pfn;  	int nid;  }; -#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ +#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */  #ifndef CONFIG_DISCONTIGMEM  /* The array of struct pages - for discontigmem use pgdat->lmem_map */ @@ -720,7 +730,7 @@ extern int movable_zone;  static inline int zone_movable_is_highmem(void)  { -#if defined(CONFIG_HIGHMEM) && defined(CONFIG_ARCH_POPULATES_NODE_MAP) +#if defined(CONFIG_HIGHMEM) && defined(CONFIG_HAVE_MEMBLOCK_NODE)  	return movable_zone == ZONE_HIGHMEM;  #else  	return 0; @@ -938,7 +948,7 @@ static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,  #endif  #if !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) && \ -	!defined(CONFIG_ARCH_POPULATES_NODE_MAP) +	!defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)  static inline unsigned long early_pfn_to_nid(unsigned long pfn)  {  	return 0; diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h index 29304855652..5a8e3903d77 100644 --- a/include/linux/mnt_namespace.h +++ b/include/linux/mnt_namespace.h @@ -2,39 +2,16 @@  #define _NAMESPACE_H_  #ifdef __KERNEL__ -#include <linux/path.h> -#include <linux/seq_file.h> -#include <linux/wait.h> - -struct mnt_namespace { -	atomic_t		count; -	struct vfsmount *	root; -	struct list_head	list; -	wait_queue_head_t poll; -	int event; -}; - -struct proc_mounts { -	struct seq_file m; /* must be the first element */ -	struct mnt_namespace *ns; -	struct path root; -}; - +struct mnt_namespace;  struct fs_struct; -extern struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt);  extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *,  		struct fs_struct *);  extern void put_mnt_ns(struct mnt_namespace *ns); -static inline void get_mnt_ns(struct mnt_namespace *ns) -{ -	atomic_inc(&ns->count); -} -extern const struct seq_operations mounts_op; -extern const struct seq_operations mountinfo_op; -extern const struct seq_operations mountstats_op; -extern int mnt_had_events(struct proc_mounts *); +extern const struct file_operations proc_mounts_operations; +extern const struct file_operations proc_mountinfo_operations; +extern const struct file_operations proc_mountstats_operations;  #endif  #endif diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 468819cdde8..83ac0713ed0 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -542,4 +542,22 @@ struct isapnp_device_id {  	kernel_ulong_t driver_data;	/* data private to the driver */  }; +/** + * struct amba_id - identifies a device on an AMBA bus + * @id: The significant bits if the hardware device ID + * @mask: Bitmask specifying which bits of the id field are significant when + *	matching.  A driver binds to a device when ((hardware device ID) & mask) + *	== id. + * @data: Private data used by the driver. + */ +struct amba_id { +	unsigned int		id; +	unsigned int		mask; +#ifndef __KERNEL__ +	kernel_ulong_t		data; +#else +	void			*data; +#endif +}; +  #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/module.h b/include/linux/module.h index 3cb7839a60b..4598bf03e98 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -205,6 +205,20 @@ enum module_state  	MODULE_STATE_GOING,  }; +/** + * struct module_ref - per cpu module reference counts + * @incs: number of module get on this cpu + * @decs: number of module put on this cpu + * + * We force an alignment on 8 or 16 bytes, so that alloc_percpu() + * put @incs/@decs in same cache line, with no extra memory cost, + * since alloc_percpu() is fine grained. + */ +struct module_ref { +	unsigned long incs; +	unsigned long decs; +} __attribute((aligned(2 * sizeof(unsigned long)))); +  struct module  {  	enum module_state state; @@ -347,10 +361,7 @@ struct module  	/* Destruction function. */  	void (*exit)(void); -	struct module_ref { -		unsigned int incs; -		unsigned int decs; -	} __percpu *refptr; +	struct module_ref __percpu *refptr;  #endif  #ifdef CONFIG_CONSTRUCTORS @@ -434,7 +445,7 @@ extern void __module_put_and_exit(struct module *mod, long code)  #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);  #ifdef CONFIG_MODULE_UNLOAD -unsigned int module_refcount(struct module *mod); +unsigned long module_refcount(struct module *mod);  void __symbol_put(const char *symbol);  #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)  void symbol_put_addr(void *addr); diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 7939f636c8b..c47f4d60db0 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -350,23 +350,23 @@ extern int param_set_charp(const char *val, const struct kernel_param *kp);  extern int param_get_charp(char *buffer, const struct kernel_param *kp);  #define param_check_charp(name, p) __param_check(name, p, char *) -/* For historical reasons "bool" parameters can be (unsigned) "int". */ +/* We used to allow int as well as bool.  We're taking that away! */  extern struct kernel_param_ops param_ops_bool;  extern int param_set_bool(const char *val, const struct kernel_param *kp);  extern int param_get_bool(char *buffer, const struct kernel_param *kp); -#define param_check_bool(name, p)					\ -	static inline void __check_##name(void)				\ -	{								\ -		BUILD_BUG_ON(!__same_type((p), bool *) &&		\ -			     !__same_type((p), unsigned int *) &&	\ -			     !__same_type((p), int *));			\ -	} +#define param_check_bool(name, p) __param_check(name, p, bool)  extern struct kernel_param_ops param_ops_invbool;  extern int param_set_invbool(const char *val, const struct kernel_param *kp);  extern int param_get_invbool(char *buffer, const struct kernel_param *kp);  #define param_check_invbool(name, p) __param_check(name, p, bool) +/* An int, which can only be set like a bool (though it shows as an int). */ +extern struct kernel_param_ops param_ops_bint; +extern int param_set_bint(const char *val, const struct kernel_param *kp); +#define param_get_bint param_get_int +#define param_check_bint param_check_int +  /**   * module_param_array - a parameter which is an array of some type   * @name: the name of the array variable @@ -395,6 +395,7 @@ extern int param_get_invbool(char *buffer, const struct kernel_param *kp);   * module_param_named() for why this might be necessary.   */  #define module_param_array_named(name, array, type, nump, perm)		\ +	param_check_##type(name, &(array)[0]);				\  	static const struct kparam_array __param_arr_##name		\  	= { .max = ARRAY_SIZE(array), .num = nump,                      \  	    .ops = ¶m_ops_##type,					\ diff --git a/include/linux/mount.h b/include/linux/mount.h index 33fe53d7811..d7029f4a191 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -47,45 +47,10 @@ struct mnt_namespace;  #define MNT_INTERNAL	0x4000 -struct mnt_pcp { -	int mnt_count; -	int mnt_writers; -}; -  struct vfsmount { -	struct list_head mnt_hash; -	struct vfsmount *mnt_parent;	/* fs we are mounted on */ -	struct dentry *mnt_mountpoint;	/* dentry of mountpoint */  	struct dentry *mnt_root;	/* root of the mounted tree */  	struct super_block *mnt_sb;	/* pointer to superblock */ -#ifdef CONFIG_SMP -	struct mnt_pcp __percpu *mnt_pcp; -	atomic_t mnt_longterm;		/* how many of the refs are longterm */ -#else -	int mnt_count; -	int mnt_writers; -#endif -	struct list_head mnt_mounts;	/* list of children, anchored here */ -	struct list_head mnt_child;	/* and going through their mnt_child */  	int mnt_flags; -	/* 4 bytes hole on 64bits arches without fsnotify */ -#ifdef CONFIG_FSNOTIFY -	__u32 mnt_fsnotify_mask; -	struct hlist_head mnt_fsnotify_marks; -#endif -	const char *mnt_devname;	/* Name of device e.g. /dev/dsk/hda1 */ -	struct list_head mnt_list; -	struct list_head mnt_expire;	/* link in fs-specific expiry list */ -	struct list_head mnt_share;	/* circular list of shared mounts */ -	struct list_head mnt_slave_list;/* list of slave mounts */ -	struct list_head mnt_slave;	/* slave list entry */ -	struct vfsmount *mnt_master;	/* slave is on master->mnt_slave_list */ -	struct mnt_namespace *mnt_ns;	/* containing namespace */ -	int mnt_id;			/* mount identifier */ -	int mnt_group_id;		/* peer group identifier */ -	int mnt_expiry_mark;		/* true if marked for expiry */ -	int mnt_pinned; -	int mnt_ghosts;  };  struct file; /* forward dec */ @@ -94,15 +59,13 @@ extern int mnt_want_write(struct vfsmount *mnt);  extern int mnt_want_write_file(struct file *file);  extern int mnt_clone_write(struct vfsmount *mnt);  extern void mnt_drop_write(struct vfsmount *mnt); +extern void mnt_drop_write_file(struct file *file);  extern void mntput(struct vfsmount *mnt);  extern struct vfsmount *mntget(struct vfsmount *mnt);  extern void mnt_pin(struct vfsmount *mnt);  extern void mnt_unpin(struct vfsmount *mnt);  extern int __mnt_is_readonly(struct vfsmount *mnt); -extern struct vfsmount *do_kern_mount(const char *fstype, int flags, -				      const char *name, void *data); -  struct file_system_type;  extern struct vfsmount *vfs_kern_mount(struct file_system_type *type,  				      int flags, const char *name, diff --git a/include/linux/mpi.h b/include/linux/mpi.h new file mode 100644 index 00000000000..d02cca6cc8c --- /dev/null +++ b/include/linux/mpi.h @@ -0,0 +1,144 @@ +/* mpi.h  -  Multi Precision Integers + *	Copyright (C) 1994, 1996, 1998, 1999, + *                    2000, 2001 Free Software Foundation, Inc. + * + * This file is part of GNUPG. + * + * GNUPG 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. + * + * GNUPG 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 + * + * Note: This code is heavily based on the GNU MP Library. + *	 Actually it's the same code with only minor changes in the + *	 way the data is stored; this is to support the abstraction + *	 of an optional secure memory allocation which may be used + *	 to avoid revealing of sensitive data due to paging etc. + *	 The GNU MP Library itself is published under the LGPL; + *	 however I decided to publish this code under the plain GPL. + */ + +#ifndef G10_MPI_H +#define G10_MPI_H + +#include <linux/types.h> + +/* DSI defines */ + +#define SHA1_DIGEST_LENGTH   20 + +/*end of DSI defines */ + +#define BYTES_PER_MPI_LIMB	(BITS_PER_LONG / 8) +#define BITS_PER_MPI_LIMB	BITS_PER_LONG + +typedef unsigned long int mpi_limb_t; +typedef signed long int mpi_limb_signed_t; + +struct gcry_mpi { +	int alloced;		/* array size (# of allocated limbs) */ +	int nlimbs;		/* number of valid limbs */ +	int nbits;		/* the real number of valid bits (info only) */ +	int sign;		/* indicates a negative number */ +	unsigned flags;		/* bit 0: array must be allocated in secure memory space */ +	/* bit 1: not used */ +	/* bit 2: the limb is a pointer to some m_alloced data */ +	mpi_limb_t *d;		/* array with the limbs */ +}; + +typedef struct gcry_mpi *MPI; + +#define mpi_get_nlimbs(a)     ((a)->nlimbs) +#define mpi_is_neg(a)	      ((a)->sign) + +/*-- mpiutil.c --*/ +MPI mpi_alloc(unsigned nlimbs); +MPI mpi_alloc_secure(unsigned nlimbs); +MPI mpi_alloc_like(MPI a); +void mpi_free(MPI a); +int mpi_resize(MPI a, unsigned nlimbs); +int mpi_copy(MPI *copy, const MPI a); +void mpi_clear(MPI a); +int mpi_set(MPI w, MPI u); +int mpi_set_ui(MPI w, ulong u); +MPI mpi_alloc_set_ui(unsigned long u); +void mpi_m_check(MPI a); +void mpi_swap(MPI a, MPI b); + +/*-- mpicoder.c --*/ +MPI do_encode_md(const void *sha_buffer, unsigned nbits); +MPI mpi_read_from_buffer(const void *buffer, unsigned *ret_nread); +int mpi_fromstr(MPI val, const char *str); +u32 mpi_get_keyid(MPI a, u32 *keyid); +void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign); +void *mpi_get_secure_buffer(MPI a, unsigned *nbytes, int *sign); +int mpi_set_buffer(MPI a, const void *buffer, unsigned nbytes, int sign); + +#define log_mpidump g10_log_mpidump + +/*-- mpi-add.c --*/ +int mpi_add_ui(MPI w, MPI u, ulong v); +int mpi_add(MPI w, MPI u, MPI v); +int mpi_addm(MPI w, MPI u, MPI v, MPI m); +int mpi_sub_ui(MPI w, MPI u, ulong v); +int mpi_sub(MPI w, MPI u, MPI v); +int mpi_subm(MPI w, MPI u, MPI v, MPI m); + +/*-- mpi-mul.c --*/ +int mpi_mul_ui(MPI w, MPI u, ulong v); +int mpi_mul_2exp(MPI w, MPI u, ulong cnt); +int mpi_mul(MPI w, MPI u, MPI v); +int mpi_mulm(MPI w, MPI u, MPI v, MPI m); + +/*-- mpi-div.c --*/ +ulong mpi_fdiv_r_ui(MPI rem, MPI dividend, ulong divisor); +int mpi_fdiv_r(MPI rem, MPI dividend, MPI divisor); +int mpi_fdiv_q(MPI quot, MPI dividend, MPI divisor); +int mpi_fdiv_qr(MPI quot, MPI rem, MPI dividend, MPI divisor); +int mpi_tdiv_r(MPI rem, MPI num, MPI den); +int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den); +int mpi_tdiv_q_2exp(MPI w, MPI u, unsigned count); +int mpi_divisible_ui(const MPI dividend, ulong divisor); + +/*-- mpi-gcd.c --*/ +int mpi_gcd(MPI g, const MPI a, const MPI b); + +/*-- mpi-pow.c --*/ +int mpi_pow(MPI w, MPI u, MPI v); +int mpi_powm(MPI res, MPI base, MPI exp, MPI mod); + +/*-- mpi-mpow.c --*/ +int mpi_mulpowm(MPI res, MPI *basearray, MPI *exparray, MPI mod); + +/*-- mpi-cmp.c --*/ +int mpi_cmp_ui(MPI u, ulong v); +int mpi_cmp(MPI u, MPI v); + +/*-- mpi-scan.c --*/ +int mpi_getbyte(MPI a, unsigned idx); +void mpi_putbyte(MPI a, unsigned idx, int value); +unsigned mpi_trailing_zeros(MPI a); + +/*-- mpi-bit.c --*/ +void mpi_normalize(MPI a); +unsigned mpi_get_nbits(MPI a); +int mpi_test_bit(MPI a, unsigned n); +int mpi_set_bit(MPI a, unsigned n); +int mpi_set_highbit(MPI a, unsigned n); +void mpi_clear_highbit(MPI a, unsigned n); +void mpi_clear_bit(MPI a, unsigned n); +int mpi_rshift(MPI x, MPI a, unsigned n); + +/*-- mpi-inv.c --*/ +int mpi_invm(MPI x, MPI u, MPI v); + +#endif /*G10_MPI_H */ diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index a3759cb0ac1..6d8c7251eb8 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h @@ -43,9 +43,11 @@ typedef unsigned short mifi_t;  typedef	__u32		if_mask;  #define NIFBITS (sizeof(if_mask) * 8)        /* bits per mask */ -#if !defined(__KERNEL__) && !defined(DIV_ROUND_UP) +#if !defined(__KERNEL__) +#if !defined(DIV_ROUND_UP)  #define	DIV_ROUND_UP(x,y)	(((x) + ((y) - 1)) / (y))  #endif +#endif  typedef struct if_set {  	if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)]; diff --git a/include/linux/msi.h b/include/linux/msi.h index 05acced439a..ce93a341337 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -1,6 +1,7 @@  #ifndef LINUX_MSI_H  #define LINUX_MSI_H +#include <linux/kobject.h>  #include <linux/list.h>  struct msi_msg { @@ -44,6 +45,8 @@ struct msi_desc {  	/* Last set MSI message */  	struct msi_msg msg; + +	struct kobject kobj;  };  /* diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index d2492549297..d5d2ec6494b 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h @@ -354,10 +354,10 @@ static inline map_word cfi_build_cmd(u_long cmd, struct map_info *map, struct cf  		onecmd = cmd;  		break;  	case 2: -		onecmd = cpu_to_cfi16(cmd); +		onecmd = cpu_to_cfi16(map, cmd);  		break;  	case 4: -		onecmd = cpu_to_cfi32(cmd); +		onecmd = cpu_to_cfi32(map, cmd);  		break;  	} @@ -437,10 +437,10 @@ static inline unsigned long cfi_merge_status(map_word val, struct map_info *map,  	case 1:  		break;  	case 2: -		res = cfi16_to_cpu(res); +		res = cfi16_to_cpu(map, res);  		break;  	case 4: -		res = cfi32_to_cpu(res); +		res = cfi32_to_cpu(map, res);  		break;  	default: BUG();  	} @@ -480,12 +480,12 @@ static inline uint8_t cfi_read_query(struct map_info *map, uint32_t addr)  	if (map_bankwidth_is_1(map)) {  		return val.x[0];  	} else if (map_bankwidth_is_2(map)) { -		return cfi16_to_cpu(val.x[0]); +		return cfi16_to_cpu(map, val.x[0]);  	} else {  		/* No point in a 64-bit byteswap since that would just be  		   swapping the responses from different chips, and we are  		   only interested in one chip (a representative sample) */ -		return cfi32_to_cpu(val.x[0]); +		return cfi32_to_cpu(map, val.x[0]);  	}  } @@ -496,12 +496,12 @@ static inline uint16_t cfi_read_query16(struct map_info *map, uint32_t addr)  	if (map_bankwidth_is_1(map)) {  		return val.x[0] & 0xff;  	} else if (map_bankwidth_is_2(map)) { -		return cfi16_to_cpu(val.x[0]); +		return cfi16_to_cpu(map, val.x[0]);  	} else {  		/* No point in a 64-bit byteswap since that would just be  		   swapping the responses from different chips, and we are  		   only interested in one chip (a representative sample) */ -		return cfi32_to_cpu(val.x[0]); +		return cfi32_to_cpu(map, val.x[0]);  	}  } diff --git a/include/linux/mtd/cfi_endian.h b/include/linux/mtd/cfi_endian.h index 51cc3f5917a..b97a625071f 100644 --- a/include/linux/mtd/cfi_endian.h +++ b/include/linux/mtd/cfi_endian.h @@ -19,53 +19,35 @@  #include <asm/byteorder.h> -#ifndef CONFIG_MTD_CFI_ADV_OPTIONS - -#define CFI_HOST_ENDIAN +#define CFI_HOST_ENDIAN 1 +#define CFI_LITTLE_ENDIAN 2 +#define CFI_BIG_ENDIAN 3 +#if !defined(CONFIG_MTD_CFI_ADV_OPTIONS) || defined(CONFIG_MTD_CFI_NOSWAP) +#define CFI_DEFAULT_ENDIAN CFI_HOST_ENDIAN +#elif defined(CONFIG_MTD_CFI_LE_BYTE_SWAP) +#define CFI_DEFAULT_ENDIAN CFI_LITTLE_ENDIAN +#elif defined(CONFIG_MTD_CFI_BE_BYTE_SWAP) +#define CFI_DEFAULT_ENDIAN CFI_BIG_ENDIAN  #else - -#ifdef CONFIG_MTD_CFI_NOSWAP -#define CFI_HOST_ENDIAN -#endif - -#ifdef CONFIG_MTD_CFI_LE_BYTE_SWAP -#define CFI_LITTLE_ENDIAN +#error No CFI endianness defined  #endif -#ifdef CONFIG_MTD_CFI_BE_BYTE_SWAP -#define CFI_BIG_ENDIAN -#endif +#define cfi_default(s) ((s)?:CFI_DEFAULT_ENDIAN) +#define cfi_be(s) (cfi_default(s) == CFI_BIG_ENDIAN) +#define cfi_le(s) (cfi_default(s) == CFI_LITTLE_ENDIAN) +#define cfi_host(s) (cfi_default(s) == CFI_HOST_ENDIAN) -#endif +#define cpu_to_cfi8(map, x) (x) +#define cfi8_to_cpu(map, x) (x) +#define cpu_to_cfi16(map, x) _cpu_to_cfi(16, (map)->swap, (x)) +#define cpu_to_cfi32(map, x) _cpu_to_cfi(32, (map)->swap, (x)) +#define cpu_to_cfi64(map, x) _cpu_to_cfi(64, (map)->swap, (x)) +#define cfi16_to_cpu(map, x) _cfi_to_cpu(16, (map)->swap, (x)) +#define cfi32_to_cpu(map, x) _cfi_to_cpu(32, (map)->swap, (x)) +#define cfi64_to_cpu(map, x) _cfi_to_cpu(64, (map)->swap, (x)) -#if defined(CFI_LITTLE_ENDIAN) -#define cpu_to_cfi8(x) (x) -#define cfi8_to_cpu(x) (x) -#define cpu_to_cfi16(x) cpu_to_le16(x) -#define cpu_to_cfi32(x) cpu_to_le32(x) -#define cpu_to_cfi64(x) cpu_to_le64(x) -#define cfi16_to_cpu(x) le16_to_cpu(x) -#define cfi32_to_cpu(x) le32_to_cpu(x) -#define cfi64_to_cpu(x) le64_to_cpu(x) -#elif defined (CFI_BIG_ENDIAN) -#define cpu_to_cfi8(x) (x) -#define cfi8_to_cpu(x) (x) -#define cpu_to_cfi16(x) cpu_to_be16(x) -#define cpu_to_cfi32(x) cpu_to_be32(x) -#define cpu_to_cfi64(x) cpu_to_be64(x) -#define cfi16_to_cpu(x) be16_to_cpu(x) -#define cfi32_to_cpu(x) be32_to_cpu(x) -#define cfi64_to_cpu(x) be64_to_cpu(x) -#elif defined (CFI_HOST_ENDIAN) -#define cpu_to_cfi8(x) (x) -#define cfi8_to_cpu(x) (x) -#define cpu_to_cfi16(x) (x) -#define cpu_to_cfi32(x) (x) -#define cpu_to_cfi64(x) (x) -#define cfi16_to_cpu(x) (x) -#define cfi32_to_cpu(x) (x) -#define cfi64_to_cpu(x) (x) -#else -#error No CFI endianness defined -#endif +#define _cpu_to_cfi(w, s, x) (cfi_host(s)?(x):_swap_to_cfi(w, s, x)) +#define _cfi_to_cpu(w, s, x) (cfi_host(s)?(x):_swap_to_cpu(w, s, x)) +#define _swap_to_cfi(w, s, x) (cfi_be(s)?cpu_to_be##w(x):cpu_to_le##w(x)) +#define _swap_to_cpu(w, s, x) (cfi_be(s)?be##w##_to_cpu(x):le##w##_to_cpu(x)) diff --git a/include/linux/mtd/gpmi-nand.h b/include/linux/mtd/gpmi-nand.h new file mode 100644 index 00000000000..69b6dbf46b5 --- /dev/null +++ b/include/linux/mtd/gpmi-nand.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2011 Freescale Semiconductor, 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; 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 __MACH_MXS_GPMI_NAND_H__ +#define __MACH_MXS_GPMI_NAND_H__ + +/* The size of the resources is fixed. */ +#define GPMI_NAND_RES_SIZE	6 + +/* Resource names for the GPMI NAND driver. */ +#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME  "GPMI NAND GPMI Registers" +#define GPMI_NAND_GPMI_INTERRUPT_RES_NAME  "GPMI NAND GPMI Interrupt" +#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME   "GPMI NAND BCH Registers" +#define GPMI_NAND_BCH_INTERRUPT_RES_NAME   "GPMI NAND BCH Interrupt" +#define GPMI_NAND_DMA_CHANNELS_RES_NAME    "GPMI NAND DMA Channels" +#define GPMI_NAND_DMA_INTERRUPT_RES_NAME   "GPMI NAND DMA Interrupt" + +/** + * struct gpmi_nand_platform_data - GPMI NAND driver platform data. + * + * This structure communicates platform-specific information to the GPMI NAND + * driver that can't be expressed as resources. + * + * @platform_init:           A pointer to a function the driver will call to + *                           initialize the platform (e.g., set up the pin mux). + * @min_prop_delay_in_ns:    Minimum propagation delay of GPMI signals to and + *                           from the NAND Flash device, in nanoseconds. + * @max_prop_delay_in_ns:    Maximum propagation delay of GPMI signals to and + *                           from the NAND Flash device, in nanoseconds. + * @max_chip_count:          The maximum number of chips for which the driver + *                           should configure the hardware. This value most + *                           likely reflects the number of pins that are + *                           connected to a NAND Flash device. If this is + *                           greater than the SoC hardware can support, the + *                           driver will print a message and fail to initialize. + * @partitions:              An optional pointer to an array of partition + *                           descriptions. + * @partition_count:         The number of elements in the partitions array. + */ +struct gpmi_nand_platform_data { +	/* SoC hardware information. */ +	int		(*platform_init)(void); + +	/* NAND Flash information. */ +	unsigned int	min_prop_delay_in_ns; +	unsigned int	max_prop_delay_in_ns; +	unsigned int	max_chip_count; + +	/* Medium information. */ +	struct		mtd_partition *partitions; +	unsigned	partition_count; +}; +#endif diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index a9e6ba46865..94e924e2ecd 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h @@ -26,7 +26,7 @@  #include <linux/list.h>  #include <linux/string.h>  #include <linux/bug.h> - +#include <linux/kernel.h>  #include <asm/unaligned.h>  #include <asm/system.h> @@ -214,6 +214,7 @@ struct map_info {  	void __iomem *virt;  	void *cached; +	int swap; /* this mapping's byte-swapping requirement */  	int bankwidth; /* in octets. This isn't necessarily the width  		       of actual bus cycles -- it's the repeat interval  		      in bytes, before you are talking to the first chip again. diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 9f5b312af78..d43dc25af82 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -171,87 +171,60 @@ struct mtd_info {  	struct mtd_erase_region_info *eraseregions;  	/* -	 * Erase is an asynchronous operation.  Device drivers are supposed -	 * to call instr->callback() whenever the operation completes, even -	 * if it completes with a failure. -	 * Callers are supposed to pass a callback function and wait for it -	 * to be called before writing to the block. +	 * Do not call via these pointers, use corresponding mtd_*() +	 * wrappers instead.  	 */  	int (*erase) (struct mtd_info *mtd, struct erase_info *instr); - -	/* This stuff for eXecute-In-Place */ -	/* phys is optional and may be set to NULL */  	int (*point) (struct mtd_info *mtd, loff_t from, size_t len, -			size_t *retlen, void **virt, resource_size_t *phys); - -	/* We probably shouldn't allow XIP if the unpoint isn't a NULL */ +		      size_t *retlen, void **virt, resource_size_t *phys);  	void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len); - -	/* Allow NOMMU mmap() to directly map the device (if not NULL) -	 * - return the address to which the offset maps -	 * - return -ENOSYS to indicate refusal to do the mapping -	 */  	unsigned long (*get_unmapped_area) (struct mtd_info *mtd,  					    unsigned long len,  					    unsigned long offset,  					    unsigned long flags); - -	/* Backing device capabilities for this device -	 * - provides mmap capabilities -	 */ -	struct backing_dev_info *backing_dev_info; - - -	int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); -	int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); - -	/* In blackbox flight recorder like scenarios we want to make successful -	   writes in interrupt context. panic_write() is only intended to be -	   called when its known the kernel is about to panic and we need the -	   write to succeed. Since the kernel is not going to be running for much -	   longer, this function can break locks and delay to ensure the write -	   succeeds (but not sleep). */ - -	int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); - +	int (*read) (struct mtd_info *mtd, loff_t from, size_t len, +		     size_t *retlen, u_char *buf); +	int (*write) (struct mtd_info *mtd, loff_t to, size_t len, +		      size_t *retlen, const u_char *buf); +	int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, +			    size_t *retlen, const u_char *buf);  	int (*read_oob) (struct mtd_info *mtd, loff_t from,  			 struct mtd_oob_ops *ops);  	int (*write_oob) (struct mtd_info *mtd, loff_t to, -			 struct mtd_oob_ops *ops); - -	/* -	 * Methods to access the protection register area, present in some -	 * flash devices. The user data is one time programmable but the -	 * factory data is read only. -	 */ -	int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); -	int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); -	int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); -	int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); -	int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); -	int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len); - -	/* kvec-based read/write methods. -	   NB: The 'count' parameter is the number of _vectors_, each of -	   which contains an (ofs, len) tuple. -	*/ -	int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen); - -	/* Sync */ +			  struct mtd_oob_ops *ops); +	int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, +				   size_t len); +	int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, +				   size_t len, size_t *retlen, u_char *buf); +	int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, +				   size_t len); +	int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, +				   size_t len, size_t *retlen, u_char *buf); +	int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t to, size_t len, +				    size_t *retlen, u_char *buf); +	int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, +				   size_t len); +	int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, +			unsigned long count, loff_t to, size_t *retlen);  	void (*sync) (struct mtd_info *mtd); - -	/* Chip-supported device locking */  	int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);  	int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);  	int (*is_locked) (struct mtd_info *mtd, loff_t ofs, uint64_t len); - -	/* Power Management functions */ +	int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); +	int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);  	int (*suspend) (struct mtd_info *mtd);  	void (*resume) (struct mtd_info *mtd); +	/* +	 * If the driver is something smart, like UBI, it may need to maintain +	 * its own reference counting. The below functions are only for driver. +	 */ +	int (*get_device) (struct mtd_info *mtd); +	void (*put_device) (struct mtd_info *mtd); -	/* Bad block management functions */ -	int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); -	int (*block_markbad) (struct mtd_info *mtd, loff_t ofs); +	/* Backing device capabilities for this device +	 * - provides mmap capabilities +	 */ +	struct backing_dev_info *backing_dev_info;  	struct notifier_block reboot_notifier;  /* default mode before reboot */ @@ -265,18 +238,216 @@ struct mtd_info {  	struct module *owner;  	struct device dev;  	int usecount; - -	/* If the driver is something smart, like UBI, it may need to maintain -	 * its own reference counting. The below functions are only for driver. -	 * The driver may register its callbacks. These callbacks are not -	 * supposed to be called by MTD users */ -	int (*get_device) (struct mtd_info *mtd); -	void (*put_device) (struct mtd_info *mtd);  }; -static inline struct mtd_info *dev_to_mtd(struct device *dev) +/* + * Erase is an asynchronous operation.  Device drivers are supposed + * to call instr->callback() whenever the operation completes, even + * if it completes with a failure. + * Callers are supposed to pass a callback function and wait for it + * to be called before writing to the block. + */ +static inline int mtd_erase(struct mtd_info *mtd, struct erase_info *instr) +{ +	return mtd->erase(mtd, instr); +} + +/* + * This stuff for eXecute-In-Place. phys is optional and may be set to NULL. + */ +static inline int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, +			    size_t *retlen, void **virt, resource_size_t *phys)  { -	return dev ? dev_get_drvdata(dev) : NULL; +	*retlen = 0; +	if (!mtd->point) +		return -EOPNOTSUPP; +	return mtd->point(mtd, from, len, retlen, virt, phys); +} + +/* We probably shouldn't allow XIP if the unpoint isn't a NULL */ +static inline void mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len) +{ +	return mtd->unpoint(mtd, from, len); +} + +/* + * Allow NOMMU mmap() to directly map the device (if not NULL) + * - return the address to which the offset maps + * - return -ENOSYS to indicate refusal to do the mapping + */ +static inline unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, +						  unsigned long len, +						  unsigned long offset, +						  unsigned long flags) +{ +	if (!mtd->get_unmapped_area) +		return -EOPNOTSUPP; +	return mtd->get_unmapped_area(mtd, len, offset, flags); +} + +static inline int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, +			   size_t *retlen, u_char *buf) +{ +	return mtd->read(mtd, from, len, retlen, buf); +} + +static inline int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, +			    size_t *retlen, const u_char *buf) +{ +	*retlen = 0; +	if (!mtd->write) +		return -EROFS; +	return mtd->write(mtd, to, len, retlen, buf); +} + +/* + * In blackbox flight recorder like scenarios we want to make successful writes + * in interrupt context. panic_write() is only intended to be called when its + * known the kernel is about to panic and we need the write to succeed. Since + * the kernel is not going to be running for much longer, this function can + * break locks and delay to ensure the write succeeds (but not sleep). + */ +static inline int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, +				  size_t *retlen, const u_char *buf) +{ +	*retlen = 0; +	if (!mtd->panic_write) +		return -EOPNOTSUPP; +	return mtd->panic_write(mtd, to, len, retlen, buf); +} + +static inline int mtd_read_oob(struct mtd_info *mtd, loff_t from, +			       struct mtd_oob_ops *ops) +{ +	ops->retlen = ops->oobretlen = 0; +	if (!mtd->read_oob) +		return -EOPNOTSUPP; +	return mtd->read_oob(mtd, from, ops); +} + +static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to, +				struct mtd_oob_ops *ops) +{ +	ops->retlen = ops->oobretlen = 0; +	if (!mtd->write_oob) +		return -EOPNOTSUPP; +	return mtd->write_oob(mtd, to, ops); +} + +/* + * Method to access the protection register area, present in some flash + * devices. The user data is one time programmable but the factory data is read + * only. + */ +static inline int mtd_get_fact_prot_info(struct mtd_info *mtd, +					 struct otp_info *buf, size_t len) +{ +	if (!mtd->get_fact_prot_info) +		return -EOPNOTSUPP; +	return mtd->get_fact_prot_info(mtd, buf, len); +} + +static inline int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, +					 size_t len, size_t *retlen, +					 u_char *buf) +{ +	*retlen = 0; +	if (!mtd->read_fact_prot_reg) +		return -EOPNOTSUPP; +	return mtd->read_fact_prot_reg(mtd, from, len, retlen, buf); +} + +static inline int mtd_get_user_prot_info(struct mtd_info *mtd, +					 struct otp_info *buf, +					 size_t len) +{ +	if (!mtd->get_user_prot_info) +		return -EOPNOTSUPP; +	return mtd->get_user_prot_info(mtd, buf, len); +} + +static inline int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, +					 size_t len, size_t *retlen, +					 u_char *buf) +{ +	*retlen = 0; +	if (!mtd->read_user_prot_reg) +		return -EOPNOTSUPP; +	return mtd->read_user_prot_reg(mtd, from, len, retlen, buf); +} + +static inline int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, +					  size_t len, size_t *retlen, +					  u_char *buf) +{ +	*retlen = 0; +	if (!mtd->write_user_prot_reg) +		return -EOPNOTSUPP; +	return mtd->write_user_prot_reg(mtd, to, len, retlen, buf); +} + +static inline int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, +					 size_t len) +{ +	if (!mtd->lock_user_prot_reg) +		return -EOPNOTSUPP; +	return mtd->lock_user_prot_reg(mtd, from, len); +} + +int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, +	       unsigned long count, loff_t to, size_t *retlen); + +static inline void mtd_sync(struct mtd_info *mtd) +{ +	if (mtd->sync) +		mtd->sync(mtd); +} + +/* Chip-supported device locking */ +static inline int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) +{ +	if (!mtd->lock) +		return -EOPNOTSUPP; +	return mtd->lock(mtd, ofs, len); +} + +static inline int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) +{ +	if (!mtd->unlock) +		return -EOPNOTSUPP; +	return mtd->unlock(mtd, ofs, len); +} + +static inline int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) +{ +	if (!mtd->is_locked) +		return -EOPNOTSUPP; +	return mtd->is_locked(mtd, ofs, len); +} + +static inline int mtd_suspend(struct mtd_info *mtd) +{ +	return mtd->suspend ? mtd->suspend(mtd) : 0; +} + +static inline void mtd_resume(struct mtd_info *mtd) +{ +	if (mtd->resume) +		mtd->resume(mtd); +} + +static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) +{ +	if (!mtd->block_isbad) +		return 0; +	return mtd->block_isbad(mtd, ofs); +} + +static inline int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs) +{ +	if (!mtd->block_markbad) +		return -EOPNOTSUPP; +	return mtd->block_markbad(mtd, ofs);  }  static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd) @@ -309,6 +480,16 @@ static inline uint32_t mtd_mod_by_ws(uint64_t sz, struct mtd_info *mtd)  	return do_div(sz, mtd->writesize);  } +static inline int mtd_has_oob(const struct mtd_info *mtd) +{ +	return mtd->read_oob && mtd->write_oob; +} + +static inline int mtd_can_have_bb(const struct mtd_info *mtd) +{ +	return !!mtd->block_isbad; +} +  	/* Kernel-side ioctl definitions */  struct mtd_partition; @@ -338,13 +519,6 @@ struct mtd_notifier {  extern void register_mtd_user (struct mtd_notifier *new);  extern int unregister_mtd_user (struct mtd_notifier *old); - -int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, -		       unsigned long count, loff_t to, size_t *retlen); - -int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, -		      unsigned long count, loff_t from, size_t *retlen); -  void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);  void mtd_erase_callback(struct erase_info *instr); diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 904131bab50..63b5a8b6dfb 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -555,6 +555,7 @@ struct nand_chip {  #define NAND_MFR_HYNIX		0xad  #define NAND_MFR_MICRON		0x2c  #define NAND_MFR_AMD		0x01 +#define NAND_MFR_MACRONIX	0xc2  /**   * struct nand_flash_dev - NAND Flash Device ID Structure diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index 04e018160e2..d2887e76b7f 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h @@ -30,6 +30,7 @@ struct physmap_flash_data {  	unsigned int		pfow_base;  	char                    *probe_type;  	struct mtd_partition	*parts; +	const char		**part_probe_types;  };  #endif /* __LINUX_MTD_PHYSMAP__ */ diff --git a/include/linux/neighbour.h b/include/linux/neighbour.h index a7003b7a695..b188f68a08c 100644 --- a/include/linux/neighbour.h +++ b/include/linux/neighbour.h @@ -116,6 +116,7 @@ enum {  	NDTPA_PROXY_DELAY,		/* u64, msecs */  	NDTPA_PROXY_QLEN,		/* u32 */  	NDTPA_LOCKTIME,			/* u64, msecs */ +	NDTPA_QUEUE_LENBYTES,		/* u32 */  	__NDTPA_MAX  };  #define NDTPA_MAX (__NDTPA_MAX - 1) diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h new file mode 100644 index 00000000000..77f5202977c --- /dev/null +++ b/include/linux/netdev_features.h @@ -0,0 +1,146 @@ +/* + * Network device features. + * + * + * 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 _LINUX_NETDEV_FEATURES_H +#define _LINUX_NETDEV_FEATURES_H + +#include <linux/types.h> + +typedef u64 netdev_features_t; + +enum { +	NETIF_F_SG_BIT,			/* Scatter/gather IO. */ +	NETIF_F_IP_CSUM_BIT,		/* Can checksum TCP/UDP over IPv4. */ +	__UNUSED_NETIF_F_1, +	NETIF_F_HW_CSUM_BIT,		/* Can checksum all the packets. */ +	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_VLAN_CHALLENGED_BIT,	/* Device cannot handle VLAN packets */ +	NETIF_F_GSO_BIT,		/* Enable software GSO. */ +	NETIF_F_LLTX_BIT,		/* LockLess TX - deprecated. Please */ +					/* do not use LLTX in new drivers */ +	NETIF_F_NETNS_LOCAL_BIT,	/* Does not change network namespaces */ +	NETIF_F_GRO_BIT,		/* Generic receive offload */ +	NETIF_F_LRO_BIT,		/* large receive offload */ + +	/**/NETIF_F_GSO_SHIFT,		/* keep the order of SKB_GSO_* bits */ +	NETIF_F_TSO_BIT			/* ... TCPv4 segmentation */ +		= NETIF_F_GSO_SHIFT, +	NETIF_F_UFO_BIT,		/* ... UDPv4 fragmentation */ +	NETIF_F_GSO_ROBUST_BIT,		/* ... ->SKB_GSO_DODGY */ +	NETIF_F_TSO_ECN_BIT,		/* ... TCP ECN support */ +	NETIF_F_TSO6_BIT,		/* ... TCPv6 segmentation */ +	NETIF_F_FSO_BIT,		/* ... FCoE segmentation */ +	NETIF_F_GSO_RESERVED1,		/* ... free (fill GSO_MASK to 8 bits) */ +	/**/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_FCOE_CRC_BIT,		/* FCoE CRC32 */ +	NETIF_F_SCTP_CSUM_BIT,		/* SCTP checksum offload */ +	NETIF_F_FCOE_MTU_BIT,		/* Supports max FCoE MTU, 2158 bytes*/ +	NETIF_F_NTUPLE_BIT,		/* N-tuple filters supported */ +	NETIF_F_RXHASH_BIT,		/* Receive hashing offload */ +	NETIF_F_RXCSUM_BIT,		/* Receive checksumming offload */ +	NETIF_F_NOCACHE_COPY_BIT,	/* Use no-cache copyfromuser */ +	NETIF_F_LOOPBACK_BIT,		/* Enable loopback */ + +	/* +	 * Add your fresh new feature above and remember to update +	 * netdev_features_strings[] in net/core/ethtool.c and maybe +	 * some feature mask #defines below. Please also describe it +	 * in Documentation/networking/netdev-features.txt. +	 */ + +	/**/NETDEV_FEATURE_COUNT +}; + +/* copy'n'paste compression ;) */ +#define __NETIF_F_BIT(bit)	((netdev_features_t)1 << (bit)) +#define __NETIF_F(name)		__NETIF_F_BIT(NETIF_F_##name##_BIT) + +#define NETIF_F_FCOE_CRC	__NETIF_F(FCOE_CRC) +#define NETIF_F_FCOE_MTU	__NETIF_F(FCOE_MTU) +#define NETIF_F_FRAGLIST	__NETIF_F(FRAGLIST) +#define NETIF_F_FSO		__NETIF_F(FSO) +#define NETIF_F_GRO		__NETIF_F(GRO) +#define NETIF_F_GSO		__NETIF_F(GSO) +#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_IP_CSUM		__NETIF_F(IP_CSUM) +#define NETIF_F_IPV6_CSUM	__NETIF_F(IPV6_CSUM) +#define NETIF_F_LLTX		__NETIF_F(LLTX) +#define NETIF_F_LOOPBACK	__NETIF_F(LOOPBACK) +#define NETIF_F_LRO		__NETIF_F(LRO) +#define NETIF_F_NETNS_LOCAL	__NETIF_F(NETNS_LOCAL) +#define NETIF_F_NOCACHE_COPY	__NETIF_F(NOCACHE_COPY) +#define NETIF_F_NTUPLE		__NETIF_F(NTUPLE) +#define NETIF_F_RXCSUM		__NETIF_F(RXCSUM) +#define NETIF_F_RXHASH		__NETIF_F(RXHASH) +#define NETIF_F_SCTP_CSUM	__NETIF_F(SCTP_CSUM) +#define NETIF_F_SG		__NETIF_F(SG) +#define NETIF_F_TSO6		__NETIF_F(TSO6) +#define NETIF_F_TSO_ECN		__NETIF_F(TSO_ECN) +#define NETIF_F_TSO		__NETIF_F(TSO) +#define NETIF_F_UFO		__NETIF_F(UFO) +#define NETIF_F_VLAN_CHALLENGED	__NETIF_F(VLAN_CHALLENGED) + +/* Features valid for ethtool to change */ +/* = all defined minus driver/device-class-related */ +#define NETIF_F_NEVER_CHANGE	(NETIF_F_VLAN_CHALLENGED | \ +				 NETIF_F_LLTX | NETIF_F_NETNS_LOCAL) + +/* remember that ((t)1 << t_BITS) is undefined in C99 */ +#define NETIF_F_ETHTOOL_BITS	((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \ +		(__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) - 1)) & \ +		~NETIF_F_NEVER_CHANGE) + +/* Segmentation offload feature mask */ +#define NETIF_F_GSO_MASK	(__NETIF_F_BIT(NETIF_F_GSO_LAST + 1) - \ +		__NETIF_F_BIT(NETIF_F_GSO_SHIFT)) + +/* List of features with software fallbacks. */ +#define NETIF_F_GSO_SOFTWARE	(NETIF_F_TSO | NETIF_F_TSO_ECN | \ +				 NETIF_F_TSO6 | NETIF_F_UFO) + +#define NETIF_F_GEN_CSUM	NETIF_F_HW_CSUM +#define NETIF_F_V4_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM) +#define NETIF_F_V6_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) +#define NETIF_F_ALL_CSUM	(NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) + +#define NETIF_F_ALL_TSO 	(NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN) + +#define NETIF_F_ALL_FCOE	(NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \ +				 NETIF_F_FSO) + +/* + * If one device supports one of these features, then enable them + * for all in netdev_increment_features. + */ +#define NETIF_F_ONE_FOR_ALL	(NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ +				 NETIF_F_SG | NETIF_F_HIGHDMA |		\ +				 NETIF_F_FRAGLIST | NETIF_F_VLAN_CHALLENGED) +/* + * If one device doesn't support one of these features, then disable it + * for all in netdev_increment_features. + */ +#define NETIF_F_ALL_FOR_ALL	(NETIF_F_NOCACHE_COPY | NETIF_F_FSO) + +/* changeable features with no special hardware requirements */ +#define NETIF_F_SOFT_FEATURES	(NETIF_F_GSO | NETIF_F_GRO) + +#endif	/* _LINUX_NETDEV_FEATURES_H */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index cbeb5867cff..0eac07c9525 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -43,6 +43,7 @@  #include <linux/rculist.h>  #include <linux/dmaengine.h>  #include <linux/workqueue.h> +#include <linux/dynamic_queue_limits.h>  #include <linux/ethtool.h>  #include <net/net_namespace.h> @@ -50,8 +51,10 @@  #ifdef CONFIG_DCB  #include <net/dcbnl.h>  #endif +#include <net/netprio_cgroup.h> + +#include <linux/netdev_features.h> -struct vlan_group;  struct netpoll_info;  struct phy_device;  /* 802.11 specific */ @@ -141,22 +144,20 @@ static inline bool dev_xmit_complete(int rc)   *	used.   */ -#if defined(CONFIG_WLAN) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) +#if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)  # if defined(CONFIG_MAC80211_MESH)  #  define LL_MAX_HEADER 128  # else  #  define LL_MAX_HEADER 96  # endif -#elif defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) +#elif IS_ENABLED(CONFIG_TR)  # define LL_MAX_HEADER 48  #else  # define LL_MAX_HEADER 32  #endif -#if !defined(CONFIG_NET_IPIP) && !defined(CONFIG_NET_IPIP_MODULE) && \ -    !defined(CONFIG_NET_IPGRE) &&  !defined(CONFIG_NET_IPGRE_MODULE) && \ -    !defined(CONFIG_IPV6_SIT) && !defined(CONFIG_IPV6_SIT_MODULE) && \ -    !defined(CONFIG_IPV6_TUNNEL) && !defined(CONFIG_IPV6_TUNNEL_MODULE) +#if !IS_ENABLED(CONFIG_NET_IPIP) && !IS_ENABLED(CONFIG_NET_IPGRE) && \ +    !IS_ENABLED(CONFIG_IPV6_SIT) && !IS_ENABLED(CONFIG_IPV6_TUNNEL)  #define MAX_HEADER LL_MAX_HEADER  #else  #define MAX_HEADER (LL_MAX_HEADER + 48) @@ -212,6 +213,11 @@ enum {  #include <linux/cache.h>  #include <linux/skbuff.h> +#ifdef CONFIG_RPS +#include <linux/jump_label.h> +extern struct jump_label_key rps_needed; +#endif +  struct neighbour;  struct neigh_parms;  struct sk_buff; @@ -272,16 +278,11 @@ struct hh_cache {   *   * We could use other alignment values, but we must maintain the   * relationship HH alignment <= LL alignment. - * - * LL_ALLOCATED_SPACE also takes into account the tailroom the device - * may need.   */  #define LL_RESERVED_SPACE(dev) \  	((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)  #define LL_RESERVED_SPACE_EXTRA(dev,extra) \  	((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) -#define LL_ALLOCATED_SPACE(dev) \ -	((((dev)->hard_header_len+(dev)->needed_headroom+(dev)->needed_tailroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)  struct header_ops {  	int	(*create) (struct sk_buff *skb, struct net_device *dev, @@ -516,11 +517,23 @@ static inline void napi_synchronize(const struct napi_struct *n)  #endif  enum netdev_queue_state_t { -	__QUEUE_STATE_XOFF, +	__QUEUE_STATE_DRV_XOFF, +	__QUEUE_STATE_STACK_XOFF,  	__QUEUE_STATE_FROZEN, -#define QUEUE_STATE_XOFF_OR_FROZEN ((1 << __QUEUE_STATE_XOFF)		| \ -				    (1 << __QUEUE_STATE_FROZEN)) +#define QUEUE_STATE_ANY_XOFF ((1 << __QUEUE_STATE_DRV_XOFF)		| \ +			      (1 << __QUEUE_STATE_STACK_XOFF)) +#define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF		| \ +					(1 << __QUEUE_STATE_FROZEN))  }; +/* + * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue.  The + * netif_tx_* functions below are used to manipulate this flag.  The + * __QUEUE_STATE_STACK_XOFF flag is used by the stack to stop the transmit + * queue independently.  The netif_xmit_*stopped functions below are called + * to check if the queue has been stopped by the driver or stack (either + * of the XOFF bits are set in the state).  Drivers should not need to call + * netif_xmit*stopped functions, they should only be using netif_tx_*. + */  struct netdev_queue {  /* @@ -528,9 +541,8 @@ struct netdev_queue {   */  	struct net_device	*dev;  	struct Qdisc		*qdisc; -	unsigned long		state;  	struct Qdisc		*qdisc_sleeping; -#if defined(CONFIG_RPS) || defined(CONFIG_XPS) +#ifdef CONFIG_SYSFS  	struct kobject		kobj;  #endif  #if defined(CONFIG_XPS) && defined(CONFIG_NUMA) @@ -545,6 +557,18 @@ struct netdev_queue {  	 * please use this field instead of dev->trans_start  	 */  	unsigned long		trans_start; + +	/* +	 * Number of TX timeouts for this queue +	 * (/sys/class/net/DEV/Q/trans_timeout) +	 */ +	unsigned long		trans_timeout; + +	unsigned long		state; + +#ifdef CONFIG_BQL +	struct dql		dql; +#endif  } ____cacheline_aligned_in_smp;  static inline int netdev_queue_numa_node_read(const struct netdev_queue *q) @@ -573,7 +597,7 @@ struct rps_map {  	struct rcu_head rcu;  	u16 cpus[0];  }; -#define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) +#define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + ((_num) * sizeof(u16)))  /*   * The rps_dev_flow structure contains the mapping of a flow to a CPU, the @@ -597,7 +621,7 @@ struct rps_dev_flow_table {  	struct rps_dev_flow flows[0];  };  #define RPS_DEV_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_dev_flow_table) + \ -    (_num * sizeof(struct rps_dev_flow))) +    ((_num) * sizeof(struct rps_dev_flow)))  /*   * The rps_sock_flow_table contains mappings of flows to the last CPU @@ -608,7 +632,7 @@ struct rps_sock_flow_table {  	u16 ents[0];  };  #define	RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \ -    (_num * sizeof(u16))) +    ((_num) * sizeof(u16)))  #define RPS_NO_CPU 0xffff @@ -660,7 +684,7 @@ struct xps_map {  	struct rcu_head rcu;  	u16 queues[0];  }; -#define XPS_MAP_SIZE(_num) (sizeof(struct xps_map) + (_num * sizeof(u16))) +#define XPS_MAP_SIZE(_num) (sizeof(struct xps_map) + ((_num) * sizeof(u16)))  #define XPS_MIN_MAP_ALLOC ((L1_CACHE_BYTES - sizeof(struct xps_map))	\      / sizeof(u16)) @@ -683,6 +707,23 @@ struct netdev_tc_txq {  	u16 offset;  }; +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +/* + * This structure is to hold information about the device + * configured to run FCoE protocol stack. + */ +struct netdev_fcoe_hbainfo { +	char	manufacturer[64]; +	char	serial_number[64]; +	char	hardware_version[64]; +	char	driver_version[64]; +	char	optionrom_version[64]; +	char	firmware_version[64]; +	char	model[256]; +	char	model_description[256]; +}; +#endif +  /*   * This structure defines the management hooks for network devices.   * The following hooks can be defined; unless noted otherwise, they are @@ -767,11 +808,11 @@ struct netdev_tc_txq {   *	3. Update dev->stats asynchronously and atomically, and define   *	   neither operation.   * - * void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid); + * 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.   * - * void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); + * 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.   * @@ -823,6 +864,13 @@ struct netdev_tc_txq {   *	perform necessary setup and returns 1 to indicate the device is set up   *	successfully to perform DDP on this I/O, otherwise this returns 0.   * + * int (*ndo_fcoe_get_hbainfo)(struct net_device *dev, + *			       struct netdev_fcoe_hbainfo *hbainfo); + *	Called when the FCoE Protocol stack wants information on the underlying + *	device. This information is utilized by the FCoE protocol stack to + *	register attributes with Fiber Channel management service as per the + *	FC-GS Fabric Device Management Information(FDMI) specification. + *   * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type);   *	Called when the underlying device wants to override default World Wide   *	Name (WWN) generation mechanism in FCoE protocol stack to pass its own @@ -845,12 +893,13 @@ struct netdev_tc_txq {   *	Called to release previously enslaved netdev.   *   *      Feature/offload setting functions. - * u32 (*ndo_fix_features)(struct net_device *dev, u32 features); + * netdev_features_t (*ndo_fix_features)(struct net_device *dev, + *		netdev_features_t features);   *	Adjusts the requested feature flags according to device-specific   *	constraints, and returns the resulting flags. Must not modify   *	the device state.   * - * int (*ndo_set_features)(struct net_device *dev, u32 features); + * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features);   *	Called to update device configuration to new features. Passed   *	feature set might be less than what was returned by ndo_fix_features()).   *	Must return >0 or -errno if it changed dev->features itself. @@ -885,9 +934,9 @@ struct net_device_ops {  						     struct rtnl_link_stats64 *storage);  	struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); -	void			(*ndo_vlan_rx_add_vid)(struct net_device *dev, +	int			(*ndo_vlan_rx_add_vid)(struct net_device *dev,  						       unsigned short vid); -	void			(*ndo_vlan_rx_kill_vid)(struct net_device *dev, +	int			(*ndo_vlan_rx_kill_vid)(struct net_device *dev,  						        unsigned short vid);  #ifdef CONFIG_NET_POLL_CONTROLLER  	void                    (*ndo_poll_controller)(struct net_device *dev); @@ -912,7 +961,7 @@ struct net_device_ops {  	int			(*ndo_get_vf_port)(struct net_device *dev,  						   int vf, struct sk_buff *skb);  	int			(*ndo_setup_tc)(struct net_device *dev, u8 tc); -#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#if IS_ENABLED(CONFIG_FCOE)  	int			(*ndo_fcoe_enable)(struct net_device *dev);  	int			(*ndo_fcoe_disable)(struct net_device *dev);  	int			(*ndo_fcoe_ddp_setup)(struct net_device *dev, @@ -925,9 +974,11 @@ struct net_device_ops {  						       u16 xid,  						       struct scatterlist *sgl,  						       unsigned int sgc); +	int			(*ndo_fcoe_get_hbainfo)(struct net_device *dev, +							struct netdev_fcoe_hbainfo *hbainfo);  #endif -#if defined(CONFIG_LIBFCOE) || defined(CONFIG_LIBFCOE_MODULE) +#if IS_ENABLED(CONFIG_LIBFCOE)  #define NETDEV_FCOE_WWNN 0  #define NETDEV_FCOE_WWPN 1  	int			(*ndo_fcoe_get_wwn)(struct net_device *dev, @@ -944,10 +995,12 @@ struct net_device_ops {  						 struct net_device *slave_dev);  	int			(*ndo_del_slave)(struct net_device *dev,  						 struct net_device *slave_dev); -	u32			(*ndo_fix_features)(struct net_device *dev, -						    u32 features); +	netdev_features_t	(*ndo_fix_features)(struct net_device *dev, +						    netdev_features_t features);  	int			(*ndo_set_features)(struct net_device *dev, -						    u32 features); +						    netdev_features_t features); +	int			(*ndo_neigh_construct)(struct neighbour *n); +	void			(*ndo_neigh_destroy)(struct neighbour *n);  };  /* @@ -997,91 +1050,13 @@ struct net_device {  	struct list_head	unreg_list;  	/* currently active device features */ -	u32			features; +	netdev_features_t	features;  	/* user-changeable features */ -	u32			hw_features; +	netdev_features_t	hw_features;  	/* user-requested features */ -	u32			wanted_features; +	netdev_features_t	wanted_features;  	/* mask of features inheritable by VLAN devices */ -	u32			vlan_features; - -	/* Net device feature bits; if you change something, -	 * also update netdev_features_strings[] in ethtool.c */ - -#define NETIF_F_SG		1	/* Scatter/gather IO. */ -#define NETIF_F_IP_CSUM		2	/* Can checksum TCP/UDP over IPv4. */ -#define NETIF_F_NO_CSUM		4	/* Does not require checksum. F.e. loopack. */ -#define NETIF_F_HW_CSUM		8	/* Can checksum all the packets. */ -#define NETIF_F_IPV6_CSUM	16	/* Can checksum TCP/UDP over IPV6 */ -#define NETIF_F_HIGHDMA		32	/* Can DMA to high memory. */ -#define NETIF_F_FRAGLIST	64	/* Scatter/gather IO. */ -#define NETIF_F_HW_VLAN_TX	128	/* Transmit VLAN hw acceleration */ -#define NETIF_F_HW_VLAN_RX	256	/* Receive VLAN hw acceleration */ -#define NETIF_F_HW_VLAN_FILTER	512	/* Receive filtering on VLAN */ -#define NETIF_F_VLAN_CHALLENGED	1024	/* Device cannot handle VLAN packets */ -#define NETIF_F_GSO		2048	/* Enable software GSO. */ -#define NETIF_F_LLTX		4096	/* LockLess TX - deprecated. Please */ -					/* do not use LLTX in new drivers */ -#define NETIF_F_NETNS_LOCAL	8192	/* Does not change network namespaces */ -#define NETIF_F_GRO		16384	/* Generic receive offload */ -#define NETIF_F_LRO		32768	/* large receive offload */ - -/* the GSO_MASK reserves bits 16 through 23 */ -#define NETIF_F_FCOE_CRC	(1 << 24) /* FCoE CRC32 */ -#define NETIF_F_SCTP_CSUM	(1 << 25) /* SCTP checksum offload */ -#define NETIF_F_FCOE_MTU	(1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ -#define NETIF_F_NTUPLE		(1 << 27) /* N-tuple filters supported */ -#define NETIF_F_RXHASH		(1 << 28) /* Receive hashing offload */ -#define NETIF_F_RXCSUM		(1 << 29) /* Receive checksumming offload */ -#define NETIF_F_NOCACHE_COPY	(1 << 30) /* Use no-cache copyfromuser */ -#define NETIF_F_LOOPBACK	(1 << 31) /* Enable loopback */ - -	/* Segmentation offload features */ -#define NETIF_F_GSO_SHIFT	16 -#define NETIF_F_GSO_MASK	0x00ff0000 -#define NETIF_F_TSO		(SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) -#define NETIF_F_UFO		(SKB_GSO_UDP << NETIF_F_GSO_SHIFT) -#define NETIF_F_GSO_ROBUST	(SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) -#define NETIF_F_TSO_ECN		(SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) -#define NETIF_F_TSO6		(SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) -#define NETIF_F_FSO		(SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) - -	/* Features valid for ethtool to change */ -	/* = all defined minus driver/device-class-related */ -#define NETIF_F_NEVER_CHANGE	(NETIF_F_VLAN_CHALLENGED | \ -				  NETIF_F_LLTX | NETIF_F_NETNS_LOCAL) -#define NETIF_F_ETHTOOL_BITS	(0xff3fffff & ~NETIF_F_NEVER_CHANGE) - -	/* List of features with software fallbacks. */ -#define NETIF_F_GSO_SOFTWARE	(NETIF_F_TSO | NETIF_F_TSO_ECN | \ -				 NETIF_F_TSO6 | NETIF_F_UFO) - - -#define NETIF_F_GEN_CSUM	(NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) -#define NETIF_F_V4_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM) -#define NETIF_F_V6_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) -#define NETIF_F_ALL_CSUM	(NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) - -#define NETIF_F_ALL_TSO 	(NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN) - -#define NETIF_F_ALL_FCOE	(NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \ -				 NETIF_F_FSO) - -	/* -	 * If one device supports one of these features, then enable them -	 * for all in netdev_increment_features. -	 */ -#define NETIF_F_ONE_FOR_ALL	(NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ -				 NETIF_F_SG | NETIF_F_HIGHDMA |		\ -				 NETIF_F_FRAGLIST | NETIF_F_VLAN_CHALLENGED) -	/* -	 * If one device doesn't support one of these features, then disable it -	 * for all in netdev_increment_features. -	 */ -#define NETIF_F_ALL_FOR_ALL	(NETIF_F_NOCACHE_COPY | NETIF_F_FSO) - -	/* changeable features with no special hardware requirements */ -#define NETIF_F_SOFT_FEATURES	(NETIF_F_GSO | NETIF_F_GRO) +	netdev_features_t	vlan_features;  	/* Interface index. Unique device identifier	*/  	int			ifindex; @@ -1132,6 +1107,7 @@ struct net_device {  	unsigned char		perm_addr[MAX_ADDR_LEN]; /* permanent hw address */  	unsigned char		addr_assign_type; /* hw address assignment type */  	unsigned char		addr_len;	/* hardware address length	*/ +	unsigned char		neigh_priv_len;  	unsigned short          dev_id;		/* for shared network cards */  	spinlock_t		addr_list_lock; @@ -1144,11 +1120,11 @@ struct net_device {  	/* Protocol specific pointers */ -#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) -	struct vlan_group __rcu	*vlgrp;		/* VLAN group */ +#if IS_ENABLED(CONFIG_VLAN_8021Q) +	struct vlan_info __rcu	*vlan_info;	/* VLAN info */  #endif -#ifdef CONFIG_NET_DSA -	void			*dsa_ptr;	/* dsa specific data */ +#if IS_ENABLED(CONFIG_NET_DSA) +	struct dsa_switch_tree	*dsa_ptr;	/* dsa specific data */  #endif  	void 			*atalk_ptr;	/* AppleTalk link 	*/  	struct in_device __rcu	*ip_ptr;	/* IPv4 specific data	*/ @@ -1184,9 +1160,11 @@ struct net_device {  	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/ -#if defined(CONFIG_RPS) || defined(CONFIG_XPS) +#ifdef CONFIG_SYSFS  	struct kset		*queues_kset; +#endif +#ifdef CONFIG_RPS  	struct netdev_rx_queue	*_rx;  	/* Number of RX queues allocated at register_netdev() time */ @@ -1308,10 +1286,13 @@ struct net_device {  	struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];  	u8 prio_tc_map[TC_BITMASK + 1]; -#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#if IS_ENABLED(CONFIG_FCOE)  	/* max exchange id for FCoE LRO by ddp */  	unsigned int		fcoe_ddp_xid;  #endif +#if IS_ENABLED(CONFIG_NETPRIO_CGROUP) +	struct netprio_map __rcu *priomap; +#endif  	/* phy device may attach itself for hardware timestamping */  	struct phy_device *phydev; @@ -1515,7 +1496,7 @@ struct packet_type {  					 struct packet_type *,  					 struct net_device *);  	struct sk_buff		*(*gso_segment)(struct sk_buff *skb, -						u32 features); +						netdev_features_t features);  	int			(*gso_send_check)(struct sk_buff *skb);  	struct sk_buff		**(*gro_receive)(struct sk_buff **head,  					       struct sk_buff *skb); @@ -1783,7 +1764,7 @@ extern void __netif_schedule(struct Qdisc *q);  static inline void netif_schedule_queue(struct netdev_queue *txq)  { -	if (!test_bit(__QUEUE_STATE_XOFF, &txq->state)) +	if (!(txq->state & QUEUE_STATE_ANY_XOFF))  		__netif_schedule(txq->qdisc);  } @@ -1797,7 +1778,7 @@ static inline void netif_tx_schedule_all(struct net_device *dev)  static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)  { -	clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state); +	clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);  }  /** @@ -1829,7 +1810,7 @@ static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)  		return;  	}  #endif -	if (test_and_clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state)) +	if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state))  		__netif_schedule(dev_queue->qdisc);  } @@ -1861,7 +1842,7 @@ static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)  		pr_info("netif_stop_queue() cannot be called before register_netdev()\n");  		return;  	} -	set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); +	set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);  }  /** @@ -1888,7 +1869,7 @@ static inline void netif_tx_stop_all_queues(struct net_device *dev)  static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue)  { -	return test_bit(__QUEUE_STATE_XOFF, &dev_queue->state); +	return test_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);  }  /** @@ -1902,9 +1883,68 @@ static inline int netif_queue_stopped(const struct net_device *dev)  	return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0));  } -static inline int netif_tx_queue_frozen_or_stopped(const struct netdev_queue *dev_queue) +static inline int netif_xmit_stopped(const struct netdev_queue *dev_queue) +{ +	return dev_queue->state & QUEUE_STATE_ANY_XOFF; +} + +static inline int netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue)  { -	return dev_queue->state & QUEUE_STATE_XOFF_OR_FROZEN; +	return dev_queue->state & QUEUE_STATE_ANY_XOFF_OR_FROZEN; +} + +static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue, +					unsigned int bytes) +{ +#ifdef CONFIG_BQL +	dql_queued(&dev_queue->dql, bytes); +	if (unlikely(dql_avail(&dev_queue->dql) < 0)) { +		set_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state); +		if (unlikely(dql_avail(&dev_queue->dql) >= 0)) +			clear_bit(__QUEUE_STATE_STACK_XOFF, +			    &dev_queue->state); +	} +#endif +} + +static inline void netdev_sent_queue(struct net_device *dev, unsigned int bytes) +{ +	netdev_tx_sent_queue(netdev_get_tx_queue(dev, 0), bytes); +} + +static inline void netdev_tx_completed_queue(struct netdev_queue *dev_queue, +					     unsigned pkts, unsigned bytes) +{ +#ifdef CONFIG_BQL +	if (likely(bytes)) { +		dql_completed(&dev_queue->dql, bytes); +		if (unlikely(test_bit(__QUEUE_STATE_STACK_XOFF, +		    &dev_queue->state) && +		    dql_avail(&dev_queue->dql) >= 0)) { +			if (test_and_clear_bit(__QUEUE_STATE_STACK_XOFF, +			     &dev_queue->state)) +				netif_schedule_queue(dev_queue); +		} +	} +#endif +} + +static inline void netdev_completed_queue(struct net_device *dev, +					  unsigned pkts, unsigned bytes) +{ +	netdev_tx_completed_queue(netdev_get_tx_queue(dev, 0), pkts, bytes); +} + +static inline void netdev_tx_reset_queue(struct netdev_queue *q) +{ +#ifdef CONFIG_BQL +	dql_reset(&q->dql); +#endif +} + +static inline void netdev_reset_queue(struct net_device *dev_queue) +{ +	netdev_tx_reset_queue(netdev_get_tx_queue(dev_queue, 0));  }  /** @@ -1991,7 +2031,7 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)  	if (netpoll_trap())  		return;  #endif -	if (test_and_clear_bit(__QUEUE_STATE_XOFF, &txq->state)) +	if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &txq->state))  		__netif_schedule(txq->qdisc);  } @@ -2115,7 +2155,7 @@ extern void netdev_run_todo(void);   */  static inline void dev_put(struct net_device *dev)  { -	irqsafe_cpu_dec(*dev->pcpu_refcnt); +	this_cpu_dec(*dev->pcpu_refcnt);  }  /** @@ -2126,7 +2166,7 @@ static inline void dev_put(struct net_device *dev)   */  static inline void dev_hold(struct net_device *dev)  { -	irqsafe_cpu_inc(*dev->pcpu_refcnt); +	this_cpu_inc(*dev->pcpu_refcnt);  }  /* Carrier loss detection, dial on demand. The functions netif_carrier_on @@ -2410,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev)  	spin_lock(&dev->addr_list_lock);  } +static inline void netif_addr_lock_nested(struct net_device *dev) +{ +	spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING); +} +  static inline void netif_addr_lock_bh(struct net_device *dev)  {  	spin_lock_bh(&dev->addr_list_lock); @@ -2520,7 +2565,8 @@ extern int		netdev_set_master(struct net_device *dev, struct net_device *master)  extern int netdev_set_bond_master(struct net_device *dev,  				  struct net_device *master);  extern int skb_checksum_help(struct sk_buff *skb); -extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features); +extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, +	netdev_features_t features);  #ifdef CONFIG_BUG  extern void netdev_rx_csum_fault(struct net_device *dev);  #else @@ -2536,6 +2582,8 @@ extern void		net_disable_timestamp(void);  extern void *dev_seq_start(struct seq_file *seq, loff_t *pos);  extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos);  extern void dev_seq_stop(struct seq_file *seq, void *v); +extern int dev_seq_open_ops(struct inode *inode, struct file *file, +			    const struct seq_operations *ops);  #endif  extern int netdev_class_create_file(struct class_attribute *class_attr); @@ -2547,11 +2595,13 @@ extern const char *netdev_drivername(const struct net_device *dev);  extern void linkwatch_run_queue(void); -static inline u32 netdev_get_wanted_features(struct net_device *dev) +static inline netdev_features_t netdev_get_wanted_features( +	struct net_device *dev)  {  	return (dev->features & ~dev->hw_features) | dev->wanted_features;  } -u32 netdev_increment_features(u32 all, u32 one, u32 mask); +netdev_features_t netdev_increment_features(netdev_features_t all, +	netdev_features_t one, netdev_features_t mask);  int __netdev_update_features(struct net_device *dev);  void netdev_update_features(struct net_device *dev);  void netdev_change_features(struct net_device *dev); @@ -2559,21 +2609,31 @@ void netdev_change_features(struct net_device *dev);  void netif_stacked_transfer_operstate(const struct net_device *rootdev,  					struct net_device *dev); -u32 netif_skb_features(struct sk_buff *skb); +netdev_features_t netif_skb_features(struct sk_buff *skb); -static inline int net_gso_ok(u32 features, int gso_type) +static inline int net_gso_ok(netdev_features_t features, int gso_type)  { -	int feature = gso_type << NETIF_F_GSO_SHIFT; +	netdev_features_t feature = gso_type << NETIF_F_GSO_SHIFT; + +	/* check flags correspondence */ +	BUILD_BUG_ON(SKB_GSO_TCPV4   != (NETIF_F_TSO >> NETIF_F_GSO_SHIFT)); +	BUILD_BUG_ON(SKB_GSO_UDP     != (NETIF_F_UFO >> NETIF_F_GSO_SHIFT)); +	BUILD_BUG_ON(SKB_GSO_DODGY   != (NETIF_F_GSO_ROBUST >> NETIF_F_GSO_SHIFT)); +	BUILD_BUG_ON(SKB_GSO_TCP_ECN != (NETIF_F_TSO_ECN >> NETIF_F_GSO_SHIFT)); +	BUILD_BUG_ON(SKB_GSO_TCPV6   != (NETIF_F_TSO6 >> NETIF_F_GSO_SHIFT)); +	BUILD_BUG_ON(SKB_GSO_FCOE    != (NETIF_F_FSO >> NETIF_F_GSO_SHIFT)); +  	return (features & feature) == feature;  } -static inline int skb_gso_ok(struct sk_buff *skb, u32 features) +static inline int skb_gso_ok(struct sk_buff *skb, netdev_features_t features)  {  	return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&  	       (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));  } -static inline int netif_needs_gso(struct sk_buff *skb, int features) +static inline int netif_needs_gso(struct sk_buff *skb, +	netdev_features_t features)  {  	return skb_is_gso(skb) && (!skb_gso_ok(skb, features) ||  		unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); @@ -2592,22 +2652,6 @@ static inline int netif_is_bond_slave(struct net_device *dev)  extern struct pernet_operations __net_initdata loopback_net_ops; -static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev) -{ -	if (dev->features & NETIF_F_RXCSUM) -		return 1; -	if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum) -		return 0; -	return dev->ethtool_ops->get_rx_csum(dev); -} - -static inline u32 dev_ethtool_get_flags(struct net_device *dev) -{ -	if (!dev->ethtool_ops || !dev->ethtool_ops->get_flags) -		return 0; -	return dev->ethtool_ops->get_flags(dev); -} -  /* Logging, debugging and troubleshooting/diagnostic helpers. */  /* netdev_printk helpers, similar to dev_printk */ diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 857f5026ced..b809265607d 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -162,6 +162,24 @@ extern struct ctl_path nf_net_ipv4_netfilter_sysctl_path[];  extern struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; +#if defined(CONFIG_JUMP_LABEL) +#include <linux/jump_label.h> +extern struct jump_label_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; +static inline bool nf_hooks_active(u_int8_t pf, unsigned int hook) +{ +	if (__builtin_constant_p(pf) && +	    __builtin_constant_p(hook)) +		return static_branch(&nf_hooks_needed[pf][hook]); + +	return !list_empty(&nf_hooks[pf][hook]); +} +#else +static inline bool nf_hooks_active(u_int8_t pf, unsigned int hook) +{ +	return !list_empty(&nf_hooks[pf][hook]); +} +#endif +  int nf_hook_slow(u_int8_t pf, unsigned int hook, struct sk_buff *skb,  		 struct net_device *indev, struct net_device *outdev,  		 int (*okfn)(struct sk_buff *), int thresh); @@ -179,11 +197,9 @@ static inline int nf_hook_thresh(u_int8_t pf, unsigned int hook,  				 struct net_device *outdev,  				 int (*okfn)(struct sk_buff *), int thresh)  { -#ifndef CONFIG_NETFILTER_DEBUG -	if (list_empty(&nf_hooks[pf][hook])) -		return 1; -#endif -	return nf_hook_slow(pf, hook, skb, indev, outdev, okfn, thresh); +	if (nf_hooks_active(pf, hook)) +		return nf_hook_slow(pf, hook, skb, indev, outdev, okfn, thresh); +	return 1;  }  static inline int nf_hook(u_int8_t pf, unsigned int hook, struct sk_buff *skb, diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild index a1b410c76fc..e144f54185c 100644 --- a/include/linux/netfilter/Kbuild +++ b/include/linux/netfilter/Kbuild @@ -5,7 +5,9 @@ header-y += nf_conntrack_ftp.h  header-y += nf_conntrack_sctp.h  header-y += nf_conntrack_tcp.h  header-y += nf_conntrack_tuple_common.h +header-y += nf_nat.h  header-y += nfnetlink.h +header-y += nfnetlink_acct.h  header-y += nfnetlink_compat.h  header-y += nfnetlink_conntrack.h  header-y += nfnetlink_log.h @@ -21,6 +23,7 @@ header-y += xt_DSCP.h  header-y += xt_IDLETIMER.h  header-y += xt_LED.h  header-y += xt_MARK.h +header-y += xt_nfacct.h  header-y += xt_NFLOG.h  header-y += xt_NFQUEUE.h  header-y += xt_RATEEST.h @@ -40,6 +43,7 @@ header-y += xt_cpu.h  header-y += xt_dccp.h  header-y += xt_devgroup.h  header-y += xt_dscp.h +header-y += xt_ecn.h  header-y += xt_esp.h  header-y += xt_hashlimit.h  header-y += xt_helper.h diff --git a/include/linux/netfilter/nf_conntrack_tuple_common.h b/include/linux/netfilter/nf_conntrack_tuple_common.h index 2ea22b018a8..2f6bbc5b812 100644 --- a/include/linux/netfilter/nf_conntrack_tuple_common.h +++ b/include/linux/netfilter/nf_conntrack_tuple_common.h @@ -7,6 +7,33 @@ enum ip_conntrack_dir {  	IP_CT_DIR_MAX  }; +/* The protocol-specific manipulable parts of the tuple: always in + * network order + */ +union nf_conntrack_man_proto { +	/* Add other protocols here. */ +	__be16 all; + +	struct { +		__be16 port; +	} tcp; +	struct { +		__be16 port; +	} udp; +	struct { +		__be16 id; +	} icmp; +	struct { +		__be16 port; +	} dccp; +	struct { +		__be16 port; +	} sctp; +	struct { +		__be16 key;	/* GRE key is 32bit, PPtP only uses 16bit */ +	} gre; +}; +  #define CTINFO2DIR(ctinfo) ((ctinfo) >= IP_CT_IS_REPLY ? IP_CT_DIR_REPLY : IP_CT_DIR_ORIGINAL)  #endif /* _NF_CONNTRACK_TUPLE_COMMON_H */ diff --git a/include/linux/netfilter/nf_nat.h b/include/linux/netfilter/nf_nat.h new file mode 100644 index 00000000000..8df2d13730b --- /dev/null +++ b/include/linux/netfilter/nf_nat.h @@ -0,0 +1,25 @@ +#ifndef _NETFILTER_NF_NAT_H +#define _NETFILTER_NF_NAT_H + +#include <linux/netfilter.h> +#include <linux/netfilter/nf_conntrack_tuple_common.h> + +#define NF_NAT_RANGE_MAP_IPS		1 +#define NF_NAT_RANGE_PROTO_SPECIFIED	2 +#define NF_NAT_RANGE_PROTO_RANDOM	4 +#define NF_NAT_RANGE_PERSISTENT		8 + +struct nf_nat_ipv4_range { +	unsigned int			flags; +	__be32				min_ip; +	__be32				max_ip; +	union nf_conntrack_man_proto	min; +	union nf_conntrack_man_proto	max; +}; + +struct nf_nat_ipv4_multi_range_compat { +	unsigned int			rangesize; +	struct nf_nat_ipv4_range	range[1]; +}; + +#endif /* _NETFILTER_NF_NAT_H */ diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 74d33861473..b64454c2f79 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h @@ -48,7 +48,8 @@ struct nfgenmsg {  #define NFNL_SUBSYS_ULOG		4  #define NFNL_SUBSYS_OSF			5  #define NFNL_SUBSYS_IPSET		6 -#define NFNL_SUBSYS_COUNT		7 +#define NFNL_SUBSYS_ACCT		7 +#define NFNL_SUBSYS_COUNT		8  #ifdef __KERNEL__ diff --git a/include/linux/netfilter/nfnetlink_acct.h b/include/linux/netfilter/nfnetlink_acct.h new file mode 100644 index 00000000000..7c4279b4ae7 --- /dev/null +++ b/include/linux/netfilter/nfnetlink_acct.h @@ -0,0 +1,36 @@ +#ifndef _NFNL_ACCT_H_ +#define _NFNL_ACCT_H_ + +#ifndef NFACCT_NAME_MAX +#define NFACCT_NAME_MAX		32 +#endif + +enum nfnl_acct_msg_types { +	NFNL_MSG_ACCT_NEW, +	NFNL_MSG_ACCT_GET, +	NFNL_MSG_ACCT_GET_CTRZERO, +	NFNL_MSG_ACCT_DEL, +	NFNL_MSG_ACCT_MAX +}; + +enum nfnl_acct_type { +	NFACCT_UNSPEC, +	NFACCT_NAME, +	NFACCT_PKTS, +	NFACCT_BYTES, +	NFACCT_USE, +	__NFACCT_MAX +}; +#define NFACCT_MAX (__NFACCT_MAX - 1) + +#ifdef __KERNEL__ + +struct nf_acct; + +extern struct nf_acct *nfnl_acct_find_get(const char *filter_name); +extern void nfnl_acct_put(struct nf_acct *acct); +extern void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); + +#endif /* __KERNEL__ */ + +#endif /* _NFNL_ACCT_H */ diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 32cddf78b13..8d674a78674 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h @@ -471,7 +471,7 @@ DECLARE_PER_CPU(seqcount_t, xt_recseq);   *   * Begin packet processing : all readers must wait the end   * 1) Must be called with preemption disabled - * 2) softirqs must be disabled too (or we should use irqsafe_cpu_add()) + * 2) softirqs must be disabled too (or we should use this_cpu_add())   * Returns :   *  1 if no recursion on this cpu   *  0 if recursion detected @@ -503,7 +503,7 @@ static inline unsigned int xt_write_recseq_begin(void)   *   * End packet processing : all readers can proceed   * 1) Must be called with preemption disabled - * 2) softirqs must be disabled too (or we should use irqsafe_cpu_add()) + * 2) softirqs must be disabled too (or we should use this_cpu_add())   */  static inline void xt_write_recseq_end(unsigned int addend)  { diff --git a/include/linux/netfilter/xt_ecn.h b/include/linux/netfilter/xt_ecn.h new file mode 100644 index 00000000000..7158fca364f --- /dev/null +++ b/include/linux/netfilter/xt_ecn.h @@ -0,0 +1,35 @@ +/* iptables module for matching the ECN header in IPv4 and TCP header + * + * (C) 2002 Harald Welte <laforge@gnumonks.org> + * + * This software is distributed under GNU GPL v2, 1991 + *  + * ipt_ecn.h,v 1.4 2002/08/05 19:39:00 laforge Exp +*/ +#ifndef _XT_ECN_H +#define _XT_ECN_H + +#include <linux/types.h> +#include <linux/netfilter/xt_dscp.h> + +#define XT_ECN_IP_MASK	(~XT_DSCP_MASK) + +#define XT_ECN_OP_MATCH_IP	0x01 +#define XT_ECN_OP_MATCH_ECE	0x10 +#define XT_ECN_OP_MATCH_CWR	0x20 + +#define XT_ECN_OP_MATCH_MASK	0xce + +/* match info */ +struct xt_ecn_info { +	__u8 operation; +	__u8 invert; +	__u8 ip_ect; +	union { +		struct { +			__u8 ect; +		} tcp; +	} proto; +}; + +#endif /* _XT_ECN_H */ diff --git a/include/linux/netfilter/xt_nfacct.h b/include/linux/netfilter/xt_nfacct.h new file mode 100644 index 00000000000..3e19c8a8657 --- /dev/null +++ b/include/linux/netfilter/xt_nfacct.h @@ -0,0 +1,13 @@ +#ifndef _XT_NFACCT_MATCH_H +#define _XT_NFACCT_MATCH_H + +#include <linux/netfilter/nfnetlink_acct.h> + +struct nf_acct; + +struct xt_nfacct_match_info { +	char		name[NFACCT_NAME_MAX]; +	struct nf_acct	*nfacct; +}; + +#endif /* _XT_NFACCT_MATCH_H */ diff --git a/include/linux/netfilter/xt_rpfilter.h b/include/linux/netfilter/xt_rpfilter.h new file mode 100644 index 00000000000..8358d4f7195 --- /dev/null +++ b/include/linux/netfilter/xt_rpfilter.h @@ -0,0 +1,23 @@ +#ifndef _XT_RPATH_H +#define _XT_RPATH_H + +#include <linux/types.h> + +enum { +	XT_RPFILTER_LOOSE = 1 << 0, +	XT_RPFILTER_VALID_MARK = 1 << 1, +	XT_RPFILTER_ACCEPT_LOCAL = 1 << 2, +	XT_RPFILTER_INVERT = 1 << 3, +#ifdef __KERNEL__ +	XT_RPFILTER_OPTION_MASK = XT_RPFILTER_LOOSE | +				  XT_RPFILTER_VALID_MARK | +				  XT_RPFILTER_ACCEPT_LOCAL | +				  XT_RPFILTER_INVERT, +#endif +}; + +struct xt_rpfilter_info { +	__u8 flags; +}; + +#endif diff --git a/include/linux/netfilter_ipv4/Kbuild b/include/linux/netfilter_ipv4/Kbuild index c3b45480ecf..f9930c87fff 100644 --- a/include/linux/netfilter_ipv4/Kbuild +++ b/include/linux/netfilter_ipv4/Kbuild @@ -12,4 +12,3 @@ header-y += ipt_ah.h  header-y += ipt_ecn.h  header-y += ipt_realm.h  header-y += ipt_ttl.h -header-y += nf_nat.h diff --git a/include/linux/netfilter_ipv4/ipt_ecn.h b/include/linux/netfilter_ipv4/ipt_ecn.h index eabf95fb7d3..0e0c063dbf6 100644 --- a/include/linux/netfilter_ipv4/ipt_ecn.h +++ b/include/linux/netfilter_ipv4/ipt_ecn.h @@ -1,35 +1,15 @@ -/* iptables module for matching the ECN header in IPv4 and TCP header - * - * (C) 2002 Harald Welte <laforge@gnumonks.org> - * - * This software is distributed under GNU GPL v2, 1991 - *  - * ipt_ecn.h,v 1.4 2002/08/05 19:39:00 laforge Exp -*/  #ifndef _IPT_ECN_H  #define _IPT_ECN_H -#include <linux/types.h> -#include <linux/netfilter/xt_dscp.h> +#include <linux/netfilter/xt_ecn.h> +#define ipt_ecn_info xt_ecn_info -#define IPT_ECN_IP_MASK	(~XT_DSCP_MASK) - -#define IPT_ECN_OP_MATCH_IP	0x01 -#define IPT_ECN_OP_MATCH_ECE	0x10 -#define IPT_ECN_OP_MATCH_CWR	0x20 - -#define IPT_ECN_OP_MATCH_MASK	0xce - -/* match info */ -struct ipt_ecn_info { -	__u8 operation; -	__u8 invert; -	__u8 ip_ect; -	union { -		struct { -			__u8 ect; -		} tcp; -	} proto; +enum { +	IPT_ECN_IP_MASK       = XT_ECN_IP_MASK, +	IPT_ECN_OP_MATCH_IP   = XT_ECN_OP_MATCH_IP, +	IPT_ECN_OP_MATCH_ECE  = XT_ECN_OP_MATCH_ECE, +	IPT_ECN_OP_MATCH_CWR  = XT_ECN_OP_MATCH_CWR, +	IPT_ECN_OP_MATCH_MASK = XT_ECN_OP_MATCH_MASK,  }; -#endif /* _IPT_ECN_H */ +#endif /* IPT_ECN_H */ diff --git a/include/linux/netfilter_ipv4/nf_nat.h b/include/linux/netfilter_ipv4/nf_nat.h deleted file mode 100644 index 7a861d09fc8..00000000000 --- a/include/linux/netfilter_ipv4/nf_nat.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _LINUX_NF_NAT_H -#define _LINUX_NF_NAT_H - -#include <linux/types.h> - -#define IP_NAT_RANGE_MAP_IPS 1 -#define IP_NAT_RANGE_PROTO_SPECIFIED 2 -#define IP_NAT_RANGE_PROTO_RANDOM 4 -#define IP_NAT_RANGE_PERSISTENT 8 - -/* The protocol-specific manipulable parts of the tuple. */ -union nf_conntrack_man_proto { -	/* Add other protocols here. */ -	__be16 all; - -	struct { -		__be16 port; -	} tcp; -	struct { -		__be16 port; -	} udp; -	struct { -		__be16 id; -	} icmp; -	struct { -		__be16 port; -	} dccp; -	struct { -		__be16 port; -	} sctp; -	struct { -		__be16 key;	/* GRE key is 32bit, PPtP only uses 16bit */ -	} gre; -}; - -/* Single range specification. */ -struct nf_nat_range { -	/* Set to OR of flags above. */ -	unsigned int flags; - -	/* Inclusive: network order. */ -	__be32 min_ip, max_ip; - -	/* Inclusive: network order */ -	union nf_conntrack_man_proto min, max; -}; - -/* For backwards compat: don't use in modern code. */ -struct nf_nat_multi_range_compat { -	unsigned int rangesize; /* Must be 1. */ - -	/* hangs off end. */ -	struct nf_nat_range range[1]; -}; - -#define nf_nat_multi_range nf_nat_multi_range_compat - -#endif diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 8374d296736..52e48959cfa 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -8,7 +8,7 @@  #define NETLINK_UNUSED		1	/* Unused number				*/  #define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/  #define NETLINK_FIREWALL	3	/* Firewalling hook				*/ -#define NETLINK_INET_DIAG	4	/* INET socket monitoring			*/ +#define NETLINK_SOCK_DIAG	4	/* socket monitoring				*/  #define NETLINK_NFLOG		5	/* netfilter/iptables ULOG */  #define NETLINK_XFRM		6	/* ipsec */  #define NETLINK_SELINUX		7	/* SELinux event notifications */ @@ -27,6 +27,8 @@  #define NETLINK_RDMA		20  #define NETLINK_CRYPTO		21	/* Crypto layer */ +#define NETLINK_INET_DIAG	NETLINK_SOCK_DIAG +  #define MAX_LINKS 32		  struct sockaddr_nl { diff --git a/include/linux/nfc.h b/include/linux/nfc.h index 36cb955b05c..01d4e5d6032 100644 --- a/include/linux/nfc.h +++ b/include/linux/nfc.h @@ -62,6 +62,8 @@ enum nfc_commands {  	NFC_CMD_GET_DEVICE,  	NFC_CMD_DEV_UP,  	NFC_CMD_DEV_DOWN, +	NFC_CMD_DEP_LINK_UP, +	NFC_CMD_DEP_LINK_DOWN,  	NFC_CMD_START_POLL,  	NFC_CMD_STOP_POLL,  	NFC_CMD_GET_TARGET, @@ -86,6 +88,9 @@ enum nfc_commands {   * @NFC_ATTR_TARGET_SENS_RES: NFC-A targets extra information such as NFCID   * @NFC_ATTR_TARGET_SEL_RES: NFC-A targets extra information (useful if the   *	target is not NFC-Forum compliant) + * @NFC_ATTR_TARGET_NFCID1: NFC-A targets identifier, max 10 bytes + * @NFC_ATTR_COMM_MODE: Passive or active mode + * @NFC_ATTR_RF_MODE: Initiator or target   */  enum nfc_attrs {  	NFC_ATTR_UNSPEC, @@ -95,6 +100,9 @@ enum nfc_attrs {  	NFC_ATTR_TARGET_INDEX,  	NFC_ATTR_TARGET_SENS_RES,  	NFC_ATTR_TARGET_SEL_RES, +	NFC_ATTR_TARGET_NFCID1, +	NFC_ATTR_COMM_MODE, +	NFC_ATTR_RF_MODE,  /* private: internal use only */  	__NFC_ATTR_AFTER_LAST  }; @@ -111,6 +119,14 @@ enum nfc_attrs {  #define NFC_PROTO_MAX		6 +/* NFC communication modes */ +#define NFC_COMM_ACTIVE  0 +#define NFC_COMM_PASSIVE 1 + +/* NFC RF modes */ +#define NFC_RF_INITIATOR 0 +#define NFC_RF_TARGET    1 +  /* NFC protocols masks used in bitsets */  #define NFC_PROTO_JEWEL_MASK	(1 << NFC_PROTO_JEWEL)  #define NFC_PROTO_MIFARE_MASK	(1 << NFC_PROTO_MIFARE) @@ -125,9 +141,22 @@ struct sockaddr_nfc {  	__u32 nfc_protocol;  }; +#define NFC_LLCP_MAX_SERVICE_NAME 63 +struct sockaddr_nfc_llcp { +	sa_family_t sa_family; +	__u32 dev_idx; +	__u32 target_idx; +	__u32 nfc_protocol; +	__u8 dsap; /* Destination SAP, if known */ +	__u8 ssap; /* Source SAP to be bound to */ +	char service_name[NFC_LLCP_MAX_SERVICE_NAME]; /* Service name URI */; +	size_t service_name_len; +}; +  /* NFC socket protocols */  #define NFC_SOCKPROTO_RAW	0 -#define NFC_SOCKPROTO_MAX	1 +#define NFC_SOCKPROTO_LLCP	1 +#define NFC_SOCKPROTO_MAX	2  #define NFC_HEADER_SIZE 1 diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index ab2c6343361..8c29950d2fa 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -373,7 +373,7 @@ extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);  extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);  extern void put_nfs_open_context(struct nfs_open_context *ctx);  extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); -extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rpc_cred *cred, fmode_t f_mode); +extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode);  extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx);  extern struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx);  extern void nfs_put_lock_context(struct nfs_lock_context *l_ctx); @@ -410,6 +410,9 @@ extern const struct inode_operations nfs_file_inode_operations;  extern const struct inode_operations nfs3_file_inode_operations;  #endif /* CONFIG_NFS_V3 */  extern const struct file_operations nfs_file_operations; +#ifdef CONFIG_NFS_V4 +extern const struct file_operations nfs4_file_operations; +#endif /* CONFIG_NFS_V4 */  extern const struct address_space_operations nfs_file_aops;  extern const struct address_space_operations nfs_dir_aops; diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index b5479df8378..ba4d7656ecf 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -153,6 +153,7 @@ struct nfs_server {  	struct rb_root		openowner_id;  	struct rb_root		lockowner_id;  #endif +	struct list_head	state_owners_lru;  	struct list_head	layouts;  	struct list_head	delegations;  	void (*destroy)(struct nfs_server *); diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index ae7d6a380da..308c1887701 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h @@ -66,6 +66,8 @@ struct idmap_msg {  /* Forward declaration to make this header independent of others */  struct nfs_client;  struct nfs_server; +struct nfs_fattr; +struct nfs4_string;  #ifdef CONFIG_NFS_USE_NEW_IDMAPPER @@ -97,6 +99,12 @@ void nfs_idmap_delete(struct nfs_client *);  #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ +void nfs_fattr_init_names(struct nfs_fattr *fattr, +		struct nfs4_string *owner_name, +		struct nfs4_string *group_name); +void nfs_fattr_free_names(struct nfs_fattr *); +void nfs_fattr_map_and_free_names(struct nfs_server *, struct nfs_fattr *); +  int nfs_map_name_to_uid(const struct nfs_server *, const char *, size_t, __u32 *);  int nfs_map_group_to_gid(const struct nfs_server *, const char *, size_t, __u32 *);  int nfs_map_uid_to_name(const struct nfs_server *, __u32, char *, size_t); diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index c74595ba709..a764cef06b7 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -18,6 +18,11 @@  /* Forward declaration for NFS v3 */  struct nfs4_secinfo_flavors; +struct nfs4_string { +	unsigned int len; +	char *data; +}; +  struct nfs_fsid {  	uint64_t		major;  	uint64_t		minor; @@ -61,6 +66,8 @@ struct nfs_fattr {  	struct timespec		pre_ctime;	/* pre_op_attr.ctime	  */  	unsigned long		time_start;  	unsigned long		gencount; +	struct nfs4_string	*owner_name; +	struct nfs4_string	*group_name;  };  #define NFS_ATTR_FATTR_TYPE		(1U << 0) @@ -85,6 +92,8 @@ struct nfs_fattr {  #define NFS_ATTR_FATTR_V4_REFERRAL	(1U << 19)	/* NFSv4 referral */  #define NFS_ATTR_FATTR_MOUNTPOINT	(1U << 20)	/* Treat as mountpoint */  #define NFS_ATTR_FATTR_MOUNTED_ON_FILEID		(1U << 21) +#define NFS_ATTR_FATTR_OWNER_NAME	(1U << 22) +#define NFS_ATTR_FATTR_GROUP_NAME	(1U << 23)  #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \  		| NFS_ATTR_FATTR_MODE \ @@ -324,6 +333,7 @@ struct nfs_openargs {  	const struct qstr *	name;  	const struct nfs_server *server;	 /* Needed for ID mapping */  	const u32 *		bitmask; +	const u32 *		dir_bitmask;  	__u32			claim;  	struct nfs4_sequence_args	seq_args;  }; @@ -342,6 +352,8 @@ struct nfs_openres {  	__u32			do_recall;  	__u64			maxsize;  	__u32			attrset[NFS4_BITMAP_SIZE]; +	struct nfs4_string	*owner; +	struct nfs4_string	*group_owner;  	struct nfs4_sequence_res	seq_res;  }; @@ -602,11 +614,16 @@ struct nfs_getaclargs {  	size_t				acl_len;  	unsigned int			acl_pgbase;  	struct page **			acl_pages; +	struct page *			acl_scratch;  	struct nfs4_sequence_args 	seq_args;  }; +/* getxattr ACL interface flags */ +#define NFS4_ACL_LEN_REQUEST	0x0001	/* zero length getxattr buffer */  struct nfs_getaclres {  	size_t				acl_len; +	size_t				acl_data_offset; +	int				acl_flags;  	struct nfs4_sequence_res	seq_res;  }; @@ -773,11 +790,6 @@ struct nfs3_getaclres {  	struct posix_acl *	acl_default;  }; -struct nfs4_string { -	unsigned int len; -	char *data; -}; -  #ifdef CONFIG_NFS_V4  typedef u64 clientid4; @@ -1192,6 +1204,7 @@ struct nfs_rpc_ops {  	const struct dentry_operations *dentry_ops;  	const struct inode_operations *dir_inode_ops;  	const struct inode_operations *file_inode_ops; +	const struct file_operations *file_ops;  	int	(*getroot) (struct nfs_server *, struct nfs_fh *,  			    struct nfs_fsinfo *); diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 8049bf77d79..0f5ff373982 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -509,6 +509,38 @@   * @NL80211_CMD_TDLS_OPER: Perform a high-level TDLS command (e.g. link setup).   * @NL80211_CMD_TDLS_MGMT: Send a TDLS management frame.   * + * @NL80211_CMD_UNEXPECTED_FRAME: Used by an application controlling an AP + *	(or GO) interface (i.e. hostapd) to ask for unexpected frames to + *	implement sending deauth to stations that send unexpected class 3 + *	frames. Also used as the event sent by the kernel when such a frame + *	is received. + *	For the event, the %NL80211_ATTR_MAC attribute carries the TA and + *	other attributes like the interface index are present. + *	If used as the command it must have an interface index and you can + *	only unsubscribe from the event by closing the socket. Subscription + *	is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events. + * + * @NL80211_CMD_UNEXPECTED_4ADDR_FRAME: Sent as an event indicating that the + *	associated station identified by %NL80211_ATTR_MAC sent a 4addr frame + *	and wasn't already in a 4-addr VLAN. The event will be sent similarly + *	to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener. + * + * @NL80211_CMD_PROBE_CLIENT: Probe an associated station on an AP interface + *	by sending a null data frame to it and reporting when the frame is + *	acknowleged. This is used to allow timing out inactive clients. Uses + *	%NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a + *	direct reply with an %NL80211_ATTR_COOKIE that is later used to match + *	up the event with the request. The event includes the same data and + *	has %NL80211_ATTR_ACK set if the frame was ACKed. + * + * @NL80211_CMD_REGISTER_BEACONS: Register this socket to receive beacons from + *	other BSSes when any interfaces are in AP mode. This helps implement + *	OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME + *	messages. Note that per PHY only one application may register. + * + * @NL80211_CMD_SET_NOACK_MAP: sets a bitmap for the individual TIDs whether + *      No Acknowledgement Policy should be applied. + *   * @NL80211_CMD_MAX: highest used command number   * @__NL80211_CMD_AFTER_LAST: internal use   */ @@ -638,6 +670,16 @@ enum nl80211_commands {  	NL80211_CMD_TDLS_OPER,  	NL80211_CMD_TDLS_MGMT, +	NL80211_CMD_UNEXPECTED_FRAME, + +	NL80211_CMD_PROBE_CLIENT, + +	NL80211_CMD_REGISTER_BEACONS, + +	NL80211_CMD_UNEXPECTED_4ADDR_FRAME, + +	NL80211_CMD_SET_NOACK_MAP, +  	/* add new commands above here */  	/* used to define NL80211_CMD_MAX below */ @@ -658,6 +700,8 @@ enum nl80211_commands {  #define NL80211_CMD_DISASSOCIATE NL80211_CMD_DISASSOCIATE  #define NL80211_CMD_REG_BEACON_HINT NL80211_CMD_REG_BEACON_HINT +#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS +  /* source-level API compatibility */  #define NL80211_CMD_GET_MESH_PARAMS NL80211_CMD_GET_MESH_CONFIG  #define NL80211_CMD_SET_MESH_PARAMS NL80211_CMD_SET_MESH_CONFIG @@ -1109,6 +1153,46 @@ enum nl80211_commands {   *	%NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be   *	used for asking the driver to perform a TDLS operation.   * + * @NL80211_ATTR_DEVICE_AP_SME: This u32 attribute may be listed for devices + *	that have AP support to indicate that they have the AP SME integrated + *	with support for the features listed in this attribute, see + *	&enum nl80211_ap_sme_features. + * + * @NL80211_ATTR_DONT_WAIT_FOR_ACK: Used with %NL80211_CMD_FRAME, this tells + *	the driver to not wait for an acknowledgement. Note that due to this, + *	it will also not give a status callback nor return a cookie. This is + *	mostly useful for probe responses to save airtime. + * + * @NL80211_ATTR_FEATURE_FLAGS: This u32 attribute contains flags from + *	&enum nl80211_feature_flags and is advertised in wiphy information. + * @NL80211_ATTR_PROBE_RESP_OFFLOAD: Indicates that the HW responds to probe + * + *	requests while operating in AP-mode. + *	This attribute holds a bitmap of the supported protocols for + *	offloading (see &enum nl80211_probe_resp_offload_support_attr). + * + * @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire + *	probe-response frame. The DA field in the 802.11 header is zero-ed out, + *	to be filled by the FW. + * @NL80211_ATTR_DISABLE_HT:  Force HT capable interfaces to disable + *      this feature.  Currently, only supported in mac80211 drivers. + * @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the + *      ATTR_HT_CAPABILITY to which attention should be paid. + *      Currently, only mac80211 NICs support this feature. + *      The values that may be configured are: + *       MCS rates, MAX-AMSDU, HT-20-40 and HT_CAP_SGI_40 + *       AMPDU density and AMPDU factor. + *      All values are treated as suggestions and may be ignored + *      by the driver as required.  The actual values may be seen in + *      the station debugfs ht_caps file. + * + * @NL80211_ATTR_DFS_REGION: region for regulatory rules which this country + *    abides to when initiating radiation on DFS channels. A country maps + *    to one DFS region. + * + * @NL80211_ATTR_NOACK_MAP: This u16 bitmap contains the No Ack Policy of + *      up to 16 TIDs. + *   * @NL80211_ATTR_MAX: highest attribute number currently defined   * @__NL80211_ATTR_AFTER_LAST: internal use   */ @@ -1337,6 +1421,23 @@ enum nl80211_attrs {  	NL80211_ATTR_TDLS_SUPPORT,  	NL80211_ATTR_TDLS_EXTERNAL_SETUP, +	NL80211_ATTR_DEVICE_AP_SME, + +	NL80211_ATTR_DONT_WAIT_FOR_ACK, + +	NL80211_ATTR_FEATURE_FLAGS, + +	NL80211_ATTR_PROBE_RESP_OFFLOAD, + +	NL80211_ATTR_PROBE_RESP, + +	NL80211_ATTR_DFS_REGION, + +	NL80211_ATTR_DISABLE_HT, +	NL80211_ATTR_HT_CAPABILITY_MASK, + +	NL80211_ATTR_NOACK_MAP, +  	/* add attributes here, update the policy in nl80211.c */  	__NL80211_ATTR_AFTER_LAST, @@ -1371,6 +1472,7 @@ enum nl80211_attrs {  #define NL80211_ATTR_AKM_SUITES NL80211_ATTR_AKM_SUITES  #define NL80211_ATTR_KEY NL80211_ATTR_KEY  #define NL80211_ATTR_KEYS NL80211_ATTR_KEYS +#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS  #define NL80211_MAX_SUPP_RATES			32  #define NL80211_MAX_SUPP_REG_RULES		32 @@ -1434,7 +1536,11 @@ enum nl80211_iftype {   * @NL80211_STA_FLAG_WME: station is WME/QoS capable   * @NL80211_STA_FLAG_MFP: station uses management frame protection   * @NL80211_STA_FLAG_AUTHENTICATED: station is authenticated - * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer + * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer -- this flag should + *	only be used in managed mode (even in the flags mask). Note that the + *	flag can't be changed, it is only valid while adding a station, and + *	attempts to change it will silently be ignored (rather than rejected + *	as errors.)   * @NL80211_STA_FLAG_MAX: highest station flag number currently defined   * @__NL80211_STA_FLAG_AFTER_LAST: internal use   */ @@ -1549,6 +1655,7 @@ enum nl80211_sta_bss_param {   *     containing info as possible, see &enum nl80211_sta_bss_param   * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected   * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. + * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)   * @__NL80211_STA_INFO_AFTER_LAST: internal   * @NL80211_STA_INFO_MAX: highest possible station info attribute   */ @@ -1571,6 +1678,7 @@ enum nl80211_sta_info {  	NL80211_STA_INFO_BSS_PARAM,  	NL80211_STA_INFO_CONNECTED_TIME,  	NL80211_STA_INFO_STA_FLAGS, +	NL80211_STA_INFO_BEACON_LOSS,  	/* keep last */  	__NL80211_STA_INFO_AFTER_LAST, @@ -1845,6 +1953,21 @@ enum nl80211_reg_rule_flags {  };  /** + * enum nl80211_dfs_regions - regulatory DFS regions + * + * @NL80211_DFS_UNSET: Country has no DFS master region specified + * @NL80211_DFS_FCC_: Country follows DFS master rules from FCC + * @NL80211_DFS_FCC_: Country follows DFS master rules from ETSI + * @NL80211_DFS_JP_: Country follows DFS master rules from JP/MKK/Telec + */ +enum nl80211_dfs_regions { +	NL80211_DFS_UNSET	= 0, +	NL80211_DFS_FCC		= 1, +	NL80211_DFS_ETSI	= 2, +	NL80211_DFS_JP		= 3, +}; + +/**   * enum nl80211_survey_info - survey information   *   * These attribute types are used with %NL80211_ATTR_SURVEY_INFO @@ -1977,6 +2100,10 @@ enum nl80211_mntr_flags {   * access to a broader network beyond the MBSS.  This is done via Root   * Announcement frames.   * + * @NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL: The minimum interval of time (in + * TUs) during which a mesh STA can send only one Action frame containing a + * PERR element. + *   * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute   *   * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use @@ -2000,6 +2127,7 @@ enum nl80211_meshconf_params {  	NL80211_MESHCONF_ELEMENT_TTL,  	NL80211_MESHCONF_HWMP_RANN_INTERVAL,  	NL80211_MESHCONF_GATE_ANNOUNCEMENTS, +	NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,  	/* keep last */  	__NL80211_MESHCONF_ATTR_AFTER_LAST, @@ -2650,4 +2778,45 @@ enum nl80211_tdls_operation {  	NL80211_TDLS_DISABLE_LINK,  }; +/* + * enum nl80211_ap_sme_features - device-integrated AP features + * Reserved for future use, no bits are defined in + * NL80211_ATTR_DEVICE_AP_SME yet. +enum nl80211_ap_sme_features { +}; + */ + +/** + * enum nl80211_feature_flags - device/driver features + * @NL80211_FEATURE_SK_TX_STATUS: This driver supports reflecting back + *	TX status to the socket error queue when requested with the + *	socket option. + * @NL80211_FEATURE_HT_IBSS: This driver supports IBSS with HT datarates. + */ +enum nl80211_feature_flags { +	NL80211_FEATURE_SK_TX_STATUS	= 1 << 0, +	NL80211_FEATURE_HT_IBSS		= 1 << 1, +}; + +/** + * enum nl80211_probe_resp_offload_support_attr - optional supported + *	protocols for probe-response offloading by the driver/FW. + *	To be used with the %NL80211_ATTR_PROBE_RESP_OFFLOAD attribute. + *	Each enum value represents a bit in the bitmap of supported + *	protocols. Typically a subset of probe-requests belonging to a + *	supported protocol will be excluded from offload and uploaded + *	to the host. + * + * @NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS: Support for WPS ver. 1 + * @NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2: Support for WPS ver. 2 + * @NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P: Support for P2P + * @NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U: Support for 802.11u + */ +enum nl80211_probe_resp_offload_support_attr { +	NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS =	1<<0, +	NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 =	1<<1, +	NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P =	1<<2, +	NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U =	1<<3, +}; +  #endif /* __LINUX_NL80211_H */ diff --git a/include/linux/nls.h b/include/linux/nls.h index d47beef08df..5dc635f8d79 100644 --- a/include/linux/nls.h +++ b/include/linux/nls.h @@ -43,7 +43,7 @@ enum utf16_endian {  	UTF16_BIG_ENDIAN  }; -/* nls.c */ +/* nls_base.c */  extern int register_nls(struct nls_table *);  extern int unregister_nls(struct nls_table *);  extern struct nls_table *load_nls(char *); @@ -52,7 +52,8 @@ extern struct nls_table *load_nls_default(void);  extern int utf8_to_utf32(const u8 *s, int len, unicode_t *pu);  extern int utf32_to_utf8(unicode_t u, u8 *s, int maxlen); -extern int utf8s_to_utf16s(const u8 *s, int len, wchar_t *pwcs); +extern int utf8s_to_utf16s(const u8 *s, int len, +		enum utf16_endian endian, wchar_t *pwcs, int maxlen);  extern int utf16s_to_utf8s(const wchar_t *pwcs, int len,  		enum utf16_endian endian, u8 *s, int maxlen); diff --git a/include/linux/node.h b/include/linux/node.h index 92370e22343..624e53cecc0 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -14,12 +14,12 @@  #ifndef _LINUX_NODE_H_  #define _LINUX_NODE_H_ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpumask.h>  #include <linux/workqueue.h>  struct node { -	struct sys_device	sysdev; +	struct device	dev;  #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS)  	struct work_struct	node_work; @@ -80,6 +80,6 @@ static inline void register_hugetlbfs_with_node(node_registration_func_t reg,  }  #endif -#define to_node(sys_device) container_of(sys_device, struct node, sysdev) +#define to_node(device) container_of(device, struct node, dev)  #endif /* _LINUX_NODE_H_ */ diff --git a/include/linux/nvme.h b/include/linux/nvme.h new file mode 100644 index 00000000000..9490a00529f --- /dev/null +++ b/include/linux/nvme.h @@ -0,0 +1,434 @@ +/* + * Definitions for the NVM Express interface + * Copyright (c) 2011, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 St - Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _LINUX_NVME_H +#define _LINUX_NVME_H + +#include <linux/types.h> + +struct nvme_bar { +	__u64			cap;	/* Controller Capabilities */ +	__u32			vs;	/* Version */ +	__u32			intms;	/* Interrupt Mask Set */ +	__u32			intmc;	/* Interrupt Mask Clear */ +	__u32			cc;	/* Controller Configuration */ +	__u32			rsvd1;	/* Reserved */ +	__u32			csts;	/* Controller Status */ +	__u32			rsvd2;	/* Reserved */ +	__u32			aqa;	/* Admin Queue Attributes */ +	__u64			asq;	/* Admin SQ Base Address */ +	__u64			acq;	/* Admin CQ Base Address */ +}; + +#define NVME_CAP_TIMEOUT(cap)	(((cap) >> 24) & 0xff) +#define NVME_CAP_STRIDE(cap)	(((cap) >> 32) & 0xf) + +enum { +	NVME_CC_ENABLE		= 1 << 0, +	NVME_CC_CSS_NVM		= 0 << 4, +	NVME_CC_MPS_SHIFT	= 7, +	NVME_CC_ARB_RR		= 0 << 11, +	NVME_CC_ARB_WRRU	= 1 << 11, +	NVME_CC_ARB_VS		= 7 << 11, +	NVME_CC_SHN_NONE	= 0 << 14, +	NVME_CC_SHN_NORMAL	= 1 << 14, +	NVME_CC_SHN_ABRUPT	= 2 << 14, +	NVME_CC_IOSQES		= 6 << 16, +	NVME_CC_IOCQES		= 4 << 20, +	NVME_CSTS_RDY		= 1 << 0, +	NVME_CSTS_CFS		= 1 << 1, +	NVME_CSTS_SHST_NORMAL	= 0 << 2, +	NVME_CSTS_SHST_OCCUR	= 1 << 2, +	NVME_CSTS_SHST_CMPLT	= 2 << 2, +}; + +struct nvme_id_power_state { +	__le16			max_power;	/* centiwatts */ +	__u16			rsvd2; +	__le32			entry_lat;	/* microseconds */ +	__le32			exit_lat;	/* microseconds */ +	__u8			read_tput; +	__u8			read_lat; +	__u8			write_tput; +	__u8			write_lat; +	__u8			rsvd16[16]; +}; + +#define NVME_VS(major, minor)	(major << 16 | minor) + +struct nvme_id_ctrl { +	__le16			vid; +	__le16			ssvid; +	char			sn[20]; +	char			mn[40]; +	char			fr[8]; +	__u8			rab; +	__u8			ieee[3]; +	__u8			mic; +	__u8			mdts; +	__u8			rsvd78[178]; +	__le16			oacs; +	__u8			acl; +	__u8			aerl; +	__u8			frmw; +	__u8			lpa; +	__u8			elpe; +	__u8			npss; +	__u8			rsvd264[248]; +	__u8			sqes; +	__u8			cqes; +	__u8			rsvd514[2]; +	__le32			nn; +	__le16			oncs; +	__le16			fuses; +	__u8			fna; +	__u8			vwc; +	__le16			awun; +	__le16			awupf; +	__u8			rsvd530[1518]; +	struct nvme_id_power_state	psd[32]; +	__u8			vs[1024]; +}; + +struct nvme_lbaf { +	__le16			ms; +	__u8			ds; +	__u8			rp; +}; + +struct nvme_id_ns { +	__le64			nsze; +	__le64			ncap; +	__le64			nuse; +	__u8			nsfeat; +	__u8			nlbaf; +	__u8			flbas; +	__u8			mc; +	__u8			dpc; +	__u8			dps; +	__u8			rsvd30[98]; +	struct nvme_lbaf	lbaf[16]; +	__u8			rsvd192[192]; +	__u8			vs[3712]; +}; + +enum { +	NVME_NS_FEAT_THIN	= 1 << 0, +	NVME_LBAF_RP_BEST	= 0, +	NVME_LBAF_RP_BETTER	= 1, +	NVME_LBAF_RP_GOOD	= 2, +	NVME_LBAF_RP_DEGRADED	= 3, +}; + +struct nvme_lba_range_type { +	__u8			type; +	__u8			attributes; +	__u8			rsvd2[14]; +	__u64			slba; +	__u64			nlb; +	__u8			guid[16]; +	__u8			rsvd48[16]; +}; + +enum { +	NVME_LBART_TYPE_FS	= 0x01, +	NVME_LBART_TYPE_RAID	= 0x02, +	NVME_LBART_TYPE_CACHE	= 0x03, +	NVME_LBART_TYPE_SWAP	= 0x04, + +	NVME_LBART_ATTRIB_TEMP	= 1 << 0, +	NVME_LBART_ATTRIB_HIDE	= 1 << 1, +}; + +/* I/O commands */ + +enum nvme_opcode { +	nvme_cmd_flush		= 0x00, +	nvme_cmd_write		= 0x01, +	nvme_cmd_read		= 0x02, +	nvme_cmd_write_uncor	= 0x04, +	nvme_cmd_compare	= 0x05, +	nvme_cmd_dsm		= 0x09, +}; + +struct nvme_common_command { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__le32			nsid; +	__u32			cdw2[2]; +	__le64			metadata; +	__le64			prp1; +	__le64			prp2; +	__u32			cdw10[6]; +}; + +struct nvme_rw_command { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__le32			nsid; +	__u64			rsvd2; +	__le64			metadata; +	__le64			prp1; +	__le64			prp2; +	__le64			slba; +	__le16			length; +	__le16			control; +	__le32			dsmgmt; +	__le32			reftag; +	__le16			apptag; +	__le16			appmask; +}; + +enum { +	NVME_RW_LR			= 1 << 15, +	NVME_RW_FUA			= 1 << 14, +	NVME_RW_DSM_FREQ_UNSPEC		= 0, +	NVME_RW_DSM_FREQ_TYPICAL	= 1, +	NVME_RW_DSM_FREQ_RARE		= 2, +	NVME_RW_DSM_FREQ_READS		= 3, +	NVME_RW_DSM_FREQ_WRITES		= 4, +	NVME_RW_DSM_FREQ_RW		= 5, +	NVME_RW_DSM_FREQ_ONCE		= 6, +	NVME_RW_DSM_FREQ_PREFETCH	= 7, +	NVME_RW_DSM_FREQ_TEMP		= 8, +	NVME_RW_DSM_LATENCY_NONE	= 0 << 4, +	NVME_RW_DSM_LATENCY_IDLE	= 1 << 4, +	NVME_RW_DSM_LATENCY_NORM	= 2 << 4, +	NVME_RW_DSM_LATENCY_LOW		= 3 << 4, +	NVME_RW_DSM_SEQ_REQ		= 1 << 6, +	NVME_RW_DSM_COMPRESSED		= 1 << 7, +}; + +/* Admin commands */ + +enum nvme_admin_opcode { +	nvme_admin_delete_sq		= 0x00, +	nvme_admin_create_sq		= 0x01, +	nvme_admin_get_log_page		= 0x02, +	nvme_admin_delete_cq		= 0x04, +	nvme_admin_create_cq		= 0x05, +	nvme_admin_identify		= 0x06, +	nvme_admin_abort_cmd		= 0x08, +	nvme_admin_set_features		= 0x09, +	nvme_admin_get_features		= 0x0a, +	nvme_admin_async_event		= 0x0c, +	nvme_admin_activate_fw		= 0x10, +	nvme_admin_download_fw		= 0x11, +	nvme_admin_format_nvm		= 0x80, +	nvme_admin_security_send	= 0x81, +	nvme_admin_security_recv	= 0x82, +}; + +enum { +	NVME_QUEUE_PHYS_CONTIG	= (1 << 0), +	NVME_CQ_IRQ_ENABLED	= (1 << 1), +	NVME_SQ_PRIO_URGENT	= (0 << 1), +	NVME_SQ_PRIO_HIGH	= (1 << 1), +	NVME_SQ_PRIO_MEDIUM	= (2 << 1), +	NVME_SQ_PRIO_LOW	= (3 << 1), +	NVME_FEAT_ARBITRATION	= 0x01, +	NVME_FEAT_POWER_MGMT	= 0x02, +	NVME_FEAT_LBA_RANGE	= 0x03, +	NVME_FEAT_TEMP_THRESH	= 0x04, +	NVME_FEAT_ERR_RECOVERY	= 0x05, +	NVME_FEAT_VOLATILE_WC	= 0x06, +	NVME_FEAT_NUM_QUEUES	= 0x07, +	NVME_FEAT_IRQ_COALESCE	= 0x08, +	NVME_FEAT_IRQ_CONFIG	= 0x09, +	NVME_FEAT_WRITE_ATOMIC	= 0x0a, +	NVME_FEAT_ASYNC_EVENT	= 0x0b, +	NVME_FEAT_SW_PROGRESS	= 0x0c, +}; + +struct nvme_identify { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__le32			nsid; +	__u64			rsvd2[2]; +	__le64			prp1; +	__le64			prp2; +	__le32			cns; +	__u32			rsvd11[5]; +}; + +struct nvme_features { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__le32			nsid; +	__u64			rsvd2[2]; +	__le64			prp1; +	__le64			prp2; +	__le32			fid; +	__le32			dword11; +	__u32			rsvd12[4]; +}; + +struct nvme_create_cq { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__u32			rsvd1[5]; +	__le64			prp1; +	__u64			rsvd8; +	__le16			cqid; +	__le16			qsize; +	__le16			cq_flags; +	__le16			irq_vector; +	__u32			rsvd12[4]; +}; + +struct nvme_create_sq { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__u32			rsvd1[5]; +	__le64			prp1; +	__u64			rsvd8; +	__le16			sqid; +	__le16			qsize; +	__le16			sq_flags; +	__le16			cqid; +	__u32			rsvd12[4]; +}; + +struct nvme_delete_queue { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__u32			rsvd1[9]; +	__le16			qid; +	__u16			rsvd10; +	__u32			rsvd11[5]; +}; + +struct nvme_download_firmware { +	__u8			opcode; +	__u8			flags; +	__u16			command_id; +	__u32			rsvd1[5]; +	__le64			prp1; +	__le64			prp2; +	__le32			numd; +	__le32			offset; +	__u32			rsvd12[4]; +}; + +struct nvme_command { +	union { +		struct nvme_common_command common; +		struct nvme_rw_command rw; +		struct nvme_identify identify; +		struct nvme_features features; +		struct nvme_create_cq create_cq; +		struct nvme_create_sq create_sq; +		struct nvme_delete_queue delete_queue; +		struct nvme_download_firmware dlfw; +	}; +}; + +enum { +	NVME_SC_SUCCESS			= 0x0, +	NVME_SC_INVALID_OPCODE		= 0x1, +	NVME_SC_INVALID_FIELD		= 0x2, +	NVME_SC_CMDID_CONFLICT		= 0x3, +	NVME_SC_DATA_XFER_ERROR		= 0x4, +	NVME_SC_POWER_LOSS		= 0x5, +	NVME_SC_INTERNAL		= 0x6, +	NVME_SC_ABORT_REQ		= 0x7, +	NVME_SC_ABORT_QUEUE		= 0x8, +	NVME_SC_FUSED_FAIL		= 0x9, +	NVME_SC_FUSED_MISSING		= 0xa, +	NVME_SC_INVALID_NS		= 0xb, +	NVME_SC_LBA_RANGE		= 0x80, +	NVME_SC_CAP_EXCEEDED		= 0x81, +	NVME_SC_NS_NOT_READY		= 0x82, +	NVME_SC_CQ_INVALID		= 0x100, +	NVME_SC_QID_INVALID		= 0x101, +	NVME_SC_QUEUE_SIZE		= 0x102, +	NVME_SC_ABORT_LIMIT		= 0x103, +	NVME_SC_ABORT_MISSING		= 0x104, +	NVME_SC_ASYNC_LIMIT		= 0x105, +	NVME_SC_FIRMWARE_SLOT		= 0x106, +	NVME_SC_FIRMWARE_IMAGE		= 0x107, +	NVME_SC_INVALID_VECTOR		= 0x108, +	NVME_SC_INVALID_LOG_PAGE	= 0x109, +	NVME_SC_INVALID_FORMAT		= 0x10a, +	NVME_SC_BAD_ATTRIBUTES		= 0x180, +	NVME_SC_WRITE_FAULT		= 0x280, +	NVME_SC_READ_ERROR		= 0x281, +	NVME_SC_GUARD_CHECK		= 0x282, +	NVME_SC_APPTAG_CHECK		= 0x283, +	NVME_SC_REFTAG_CHECK		= 0x284, +	NVME_SC_COMPARE_FAILED		= 0x285, +	NVME_SC_ACCESS_DENIED		= 0x286, +}; + +struct nvme_completion { +	__le32	result;		/* Used by admin commands to return data */ +	__u32	rsvd; +	__le16	sq_head;	/* how much of this queue may be reclaimed */ +	__le16	sq_id;		/* submission queue that generated this entry */ +	__u16	command_id;	/* of the command which completed */ +	__le16	status;		/* did the command fail, and if so, why? */ +}; + +struct nvme_user_io { +	__u8	opcode; +	__u8	flags; +	__u16	control; +	__u16	nblocks; +	__u16	rsvd; +	__u64	metadata; +	__u64	addr; +	__u64	slba; +	__u32	dsmgmt; +	__u32	reftag; +	__u16	apptag; +	__u16	appmask; +}; + +struct nvme_admin_cmd { +	__u8	opcode; +	__u8	flags; +	__u16	rsvd1; +	__u32	nsid; +	__u32	cdw2; +	__u32	cdw3; +	__u64	metadata; +	__u64	addr; +	__u32	metadata_len; +	__u32	data_len; +	__u32	cdw10; +	__u32	cdw11; +	__u32	cdw12; +	__u32	cdw13; +	__u32	cdw14; +	__u32	cdw15; +	__u32	timeout_ms; +	__u32	result; +}; + +#define NVME_IOCTL_ID		_IO('N', 0x40) +#define NVME_IOCTL_ADMIN_CMD	_IOWR('N', 0x41, struct nvme_admin_cmd) +#define NVME_IOCTL_SUBMIT_IO	_IOW('N', 0x42, struct nvme_user_io) + +#endif /* _LINUX_NVME_H */ diff --git a/include/linux/of.h b/include/linux/of.h index 4948552d60f..a75a831e205 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -65,6 +65,27 @@ struct device_node {  #endif  }; +#define MAX_PHANDLE_ARGS 8 +struct of_phandle_args { +	struct device_node *np; +	int args_count; +	uint32_t args[MAX_PHANDLE_ARGS]; +}; + +#if defined(CONFIG_SPARC) || !defined(CONFIG_OF) +/* Dummy ref counting routines - to be implemented later */ +static inline struct device_node *of_node_get(struct device_node *node) +{ +	return node; +} +static inline void of_node_put(struct device_node *node) +{ +} +#else +extern struct device_node *of_node_get(struct device_node *node); +extern void of_node_put(struct device_node *node); +#endif +  #ifdef CONFIG_OF  /* Pointer for first entry in chain of all nodes. */ @@ -95,21 +116,6 @@ static inline void of_node_set_flag(struct device_node *n, unsigned long flag)  extern struct device_node *of_find_all_nodes(struct device_node *prev); -#if defined(CONFIG_SPARC) -/* Dummy ref counting routines - to be implemented later */ -static inline struct device_node *of_node_get(struct device_node *node) -{ -	return node; -} -static inline void of_node_put(struct device_node *node) -{ -} - -#else -extern struct device_node *of_node_get(struct device_node *node); -extern void of_node_put(struct device_node *node); -#endif -  /*   * OF address retrieval & translation   */ @@ -219,8 +225,8 @@ extern int of_device_is_available(const struct device_node *device);  extern const void *of_get_property(const struct device_node *node,  				const char *name,  				int *lenp); -#define for_each_property(pp, properties) \ -	for (pp = properties; pp != NULL; pp = pp->next) +#define for_each_property_of_node(dn, pp) \ +	for (pp = dn->properties; pp != NULL; pp = pp->next)  extern int of_n_addr_cells(struct device_node *np);  extern int of_n_size_cells(struct device_node *np); @@ -230,9 +236,9 @@ extern int of_modalias_node(struct device_node *node, char *modalias, int len);  extern struct device_node *of_parse_phandle(struct device_node *np,  					    const char *phandle_name,  					    int index); -extern int of_parse_phandles_with_args(struct device_node *np, +extern int of_parse_phandle_with_args(struct device_node *np,  	const char *list_name, const char *cells_name, int index, -	struct device_node **out_node, const void **out_args); +	struct of_phandle_args *out_args);  extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));  extern int of_alias_get_id(struct device_node *np, const char *stem); diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index c84d900fbbb..ed136ad698c 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -71,7 +71,7 @@ extern int of_fdt_is_compatible(struct boot_param_header *blob,  				unsigned long node,  				const char *compat);  extern int of_fdt_match(struct boot_param_header *blob, unsigned long node, -			const char **compat); +			const char *const *compat);  extern void of_fdt_unflatten_tree(unsigned long *blob,  			       struct device_node **mynodes); @@ -88,7 +88,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,  extern void *of_get_flat_dt_prop(unsigned long node, const char *name,  				 unsigned long *size);  extern int of_flat_dt_is_compatible(unsigned long node, const char *name); -extern int of_flat_dt_match(unsigned long node, const char **matches); +extern int of_flat_dt_match(unsigned long node, const char *const *matches);  extern unsigned long of_get_flat_dt_root(void);  extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h index 52280a2b5e6..b254052a49d 100644 --- a/include/linux/of_gpio.h +++ b/include/linux/of_gpio.h @@ -18,6 +18,7 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/gpio.h> +#include <linux/of.h>  struct device_node; @@ -57,8 +58,9 @@ extern int of_mm_gpiochip_add(struct device_node *np,  extern void of_gpiochip_add(struct gpio_chip *gc);  extern void of_gpiochip_remove(struct gpio_chip *gc);  extern struct gpio_chip *of_node_to_gpiochip(struct device_node *np); -extern int of_gpio_simple_xlate(struct gpio_chip *gc, struct device_node *np, -				const void *gpio_spec, u32 *flags); +extern int of_gpio_simple_xlate(struct gpio_chip *gc, +				const struct of_phandle_args *gpiospec, +				u32 *flags);  #else /* CONFIG_OF_GPIO */ @@ -75,8 +77,8 @@ static inline unsigned int of_gpio_count(struct device_node *np)  }  static inline int of_gpio_simple_xlate(struct gpio_chip *gc, -				       struct device_node *np, -				       const void *gpio_spec, u32 *flags) +				       const struct of_phandle_args *gpiospec, +				       u32 *flags)  {  	return -ENOSYS;  } diff --git a/include/linux/oom.h b/include/linux/oom.h index 6f9d04a8533..552fba9c7d5 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -43,7 +43,7 @@ enum oom_constraint {  extern void compare_swap_oom_score_adj(int old_val, int new_val);  extern int test_set_oom_score_adj(int new_val); -extern unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, +extern unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *memcg,  			const nodemask_t *nodemask, unsigned long totalpages);  extern int try_set_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);  extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags); diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h new file mode 100644 index 00000000000..eb1efa54fe8 --- /dev/null +++ b/include/linux/openvswitch.h @@ -0,0 +1,452 @@ +/* + * Copyright (c) 2007-2011 Nicira Networks. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + */ + +#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_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) + +#endif /* _LINUX_OPENVSWITCH_H */ diff --git a/include/linux/page-debug-flags.h b/include/linux/page-debug-flags.h index b0638fd91e9..22691f61404 100644 --- a/include/linux/page-debug-flags.h +++ b/include/linux/page-debug-flags.h @@ -13,6 +13,7 @@  enum page_debug_flags {  	PAGE_DEBUG_FLAG_POISON,		/* Page is poisoned */ +	PAGE_DEBUG_FLAG_GUARD,  };  /* @@ -21,7 +22,8 @@ enum page_debug_flags {   */  #ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS -#if !defined(CONFIG_PAGE_POISONING) \ +#if !defined(CONFIG_PAGE_POISONING) && \ +    !defined(CONFIG_PAGE_GUARD) \  /* && !defined(CONFIG_PAGE_DEBUG_SOMETHING_ELSE) && ... */  #error WANT_PAGE_DEBUG_FLAGS is turned on with no debug features!  #endif diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index 961ecc7d30b..a2d11771c84 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h @@ -10,8 +10,6 @@ enum {  	/* flags for mem_cgroup and file and I/O status */  	PCG_MOVE_LOCK, /* For race between move_account v.s. following bits */  	PCG_FILE_MAPPED, /* page is accounted as "mapped" */ -	/* No lock in page_cgroup */ -	PCG_ACCT_LRU, /* page has been accounted for (under lru_lock) */  	__NR_PCG_FLAGS,  }; @@ -31,7 +29,6 @@ enum {  struct page_cgroup {  	unsigned long flags;  	struct mem_cgroup *mem_cgroup; -	struct list_head lru;		/* per cgroup LRU list */  };  void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); @@ -76,12 +73,6 @@ TESTPCGFLAG(Used, USED)  CLEARPCGFLAG(Used, USED)  SETPCGFLAG(Used, USED) -SETPCGFLAG(AcctLRU, ACCT_LRU) -CLEARPCGFLAG(AcctLRU, ACCT_LRU) -TESTPCGFLAG(AcctLRU, ACCT_LRU) -TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU) - -  SETPCGFLAG(FileMapped, FILE_MAPPED)  CLEARPCGFLAG(FileMapped, FILE_MAPPED)  TESTPCGFLAG(FileMapped, FILE_MAPPED) @@ -122,39 +113,6 @@ static inline void move_unlock_page_cgroup(struct page_cgroup *pc,  	local_irq_restore(*flags);  } -#ifdef CONFIG_SPARSEMEM -#define PCG_ARRAYID_WIDTH	SECTIONS_SHIFT -#else -#define PCG_ARRAYID_WIDTH	NODES_SHIFT -#endif - -#if (PCG_ARRAYID_WIDTH > BITS_PER_LONG - NR_PCG_FLAGS) -#error Not enough space left in pc->flags to store page_cgroup array IDs -#endif - -/* pc->flags: ARRAY-ID | FLAGS */ - -#define PCG_ARRAYID_MASK	((1UL << PCG_ARRAYID_WIDTH) - 1) - -#define PCG_ARRAYID_OFFSET	(BITS_PER_LONG - PCG_ARRAYID_WIDTH) -/* - * Zero the shift count for non-existent fields, to prevent compiler - * warnings and ensure references are optimized away. - */ -#define PCG_ARRAYID_SHIFT	(PCG_ARRAYID_OFFSET * (PCG_ARRAYID_WIDTH != 0)) - -static inline void set_page_cgroup_array_id(struct page_cgroup *pc, -					    unsigned long id) -{ -	pc->flags &= ~(PCG_ARRAYID_MASK << PCG_ARRAYID_SHIFT); -	pc->flags |= (id & PCG_ARRAYID_MASK) << PCG_ARRAYID_SHIFT; -} - -static inline unsigned long page_cgroup_array_id(struct page_cgroup *pc) -{ -	return (pc->flags >> PCG_ARRAYID_SHIFT) & PCG_ARRAYID_MASK; -} -  #else /* CONFIG_CGROUP_MEM_RES_CTLR */  struct page_cgroup; @@ -183,7 +141,7 @@ static inline void __init page_cgroup_init_flatmem(void)  extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent,  					unsigned short old, unsigned short new);  extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id); -extern unsigned short lookup_swap_cgroup(swp_entry_t ent); +extern unsigned short lookup_swap_cgroup_id(swp_entry_t ent);  extern int swap_cgroup_swapon(int type, unsigned long max_pages);  extern void swap_cgroup_swapoff(int type);  #else @@ -195,7 +153,7 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id)  }  static inline -unsigned short lookup_swap_cgroup(swp_entry_t ent) +unsigned short lookup_swap_cgroup_id(swp_entry_t ent)  {  	return 0;  } diff --git a/include/linux/pagevec.h b/include/linux/pagevec.h index bab82f4c571..2aa12b8499c 100644 --- a/include/linux/pagevec.h +++ b/include/linux/pagevec.h @@ -21,9 +21,7 @@ struct pagevec {  };  void __pagevec_release(struct pagevec *pvec); -void __pagevec_free(struct pagevec *pvec); -void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru); -void pagevec_strip(struct pagevec *pvec); +void __pagevec_lru_add(struct pagevec *pvec, enum lru_list lru);  unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,  		pgoff_t start, unsigned nr_pages);  unsigned pagevec_lookup_tag(struct pagevec *pvec, @@ -60,37 +58,30 @@ static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page)  	return pagevec_space(pvec);  } -  static inline void pagevec_release(struct pagevec *pvec)  {  	if (pagevec_count(pvec))  		__pagevec_release(pvec);  } -static inline void pagevec_free(struct pagevec *pvec) -{ -	if (pagevec_count(pvec)) -		__pagevec_free(pvec); -} -  static inline void __pagevec_lru_add_anon(struct pagevec *pvec)  { -	____pagevec_lru_add(pvec, LRU_INACTIVE_ANON); +	__pagevec_lru_add(pvec, LRU_INACTIVE_ANON);  }  static inline void __pagevec_lru_add_active_anon(struct pagevec *pvec)  { -	____pagevec_lru_add(pvec, LRU_ACTIVE_ANON); +	__pagevec_lru_add(pvec, LRU_ACTIVE_ANON);  }  static inline void __pagevec_lru_add_file(struct pagevec *pvec)  { -	____pagevec_lru_add(pvec, LRU_INACTIVE_FILE); +	__pagevec_lru_add(pvec, LRU_INACTIVE_FILE);  }  static inline void __pagevec_lru_add_active_file(struct pagevec *pvec)  { -	____pagevec_lru_add(pvec, LRU_ACTIVE_FILE); +	__pagevec_lru_add(pvec, LRU_ACTIVE_FILE);  }  static inline void pagevec_lru_add_file(struct pagevec *pvec) diff --git a/include/linux/patchkey.h b/include/linux/patchkey.h index d974a6e9237..aefda0ec6e6 100644 --- a/include/linux/patchkey.h +++ b/include/linux/patchkey.h @@ -32,7 +32,8 @@  #  else  #    error "could not determine byte order"  #  endif -#elif defined(__BYTE_ORDER) +#else +#if defined(__BYTE_ORDER)  #  if __BYTE_ORDER == __BIG_ENDIAN  #    define _PATCHKEY(id) (0xfd00|id)  #  elif __BYTE_ORDER == __LITTLE_ENDIAN @@ -41,5 +42,6 @@  #    error "could not determine byte order"  #  endif  #endif +#endif  #endif /* _LINUX_PATCHKEY_H */ diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index 7cea7b6c141..c8320144fe7 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h @@ -29,7 +29,7 @@ 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(void); +extern void pcie_clear_aspm(struct pci_bus *bus);  extern void pcie_no_aspm(void);  #else  static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) @@ -47,7 +47,7 @@ static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev)  static inline void pci_disable_link_state(struct pci_dev *pdev, int state)  {  } -static inline void pcie_clear_aspm(void) +static inline void pcie_clear_aspm(struct pci_bus *bus)  {  }  static inline void pcie_no_aspm(void) diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index e3d0b389024..7ef68724f0f 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -12,7 +12,7 @@ struct pci_ats {  	unsigned int is_enabled:1;      /* Enable bit is set */  }; -#ifdef CONFIG_PCI_IOV +#ifdef CONFIG_PCI_ATS  extern int pci_enable_ats(struct pci_dev *dev, int ps);  extern void pci_disable_ats(struct pci_dev *dev); @@ -29,7 +29,7 @@ static inline int pci_ats_enabled(struct pci_dev *dev)  	return dev->ats && dev->ats->is_enabled;  } -#else /* CONFIG_PCI_IOV */ +#else /* CONFIG_PCI_ATS */  static inline int pci_enable_ats(struct pci_dev *dev, int ps)  { @@ -50,7 +50,7 @@ static inline int pci_ats_enabled(struct pci_dev *dev)  	return 0;  } -#endif /* CONFIG_PCI_IOV */ +#endif /* CONFIG_PCI_ATS */  #ifdef CONFIG_PCI_PRI diff --git a/include/linux/pci.h b/include/linux/pci.h index 337df0d5d5f..a16b1df3def 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -111,7 +111,7 @@ enum {  	PCI_NUM_RESOURCES,  	/* preserve this for compatibility */ -	DEVICE_COUNT_RESOURCE +	DEVICE_COUNT_RESOURCE = PCI_NUM_RESOURCES,  };  typedef int __bitwise pci_power_t; @@ -308,7 +308,7 @@ struct pci_dev {  	unsigned int	is_added:1;  	unsigned int	is_busmaster:1; /* device is busmaster */  	unsigned int	no_msi:1;	/* device may not use msi */ -	unsigned int	block_ucfg_access:1;	/* userspace config space access is blocked */ +	unsigned int	block_cfg_access:1;	/* config space access is blocked */  	unsigned int	broken_parity_status:1;	/* Device generates false positive parity */  	unsigned int	irq_reroute_variant:2;	/* device needs IRQ rerouting variant */  	unsigned int 	msi_enabled:1; @@ -336,9 +336,10 @@ struct pci_dev {  	struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */  #ifdef CONFIG_PCI_MSI  	struct list_head msi_list; +	struct kset *msi_kset;  #endif  	struct pci_vpd *vpd; -#ifdef CONFIG_PCI_IOV +#ifdef CONFIG_PCI_ATS  	union {  		struct pci_sriov *sriov;	/* SR-IOV capability related */  		struct pci_dev *physfn;	/* the PF this VF is associated with */ @@ -660,17 +661,13 @@ extern 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); -static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *ops, -					   void *sysdata) -{ -	struct pci_bus *root_bus; -	root_bus = pci_scan_bus_parented(NULL, bus, ops, sysdata); -	if (root_bus) -		pci_bus_add_devices(root_bus); -	return root_bus; -} -struct pci_bus *pci_create_bus(struct device *parent, int bus, -			       struct pci_ops *ops, void *sysdata); +struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata); +struct pci_bus *pci_create_root_bus(struct device *parent, int bus, +				    struct pci_ops *ops, void *sysdata, +				    struct list_head *resources); +struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus, +					     struct pci_ops *ops, void *sysdata, +					     struct list_head *resources);  struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,  				int busnr);  void pcie_update_link_speed(struct pci_bus *bus, u16 link_status); @@ -794,8 +791,11 @@ static inline int pci_is_managed(struct pci_dev *pdev)  }  void pci_disable_device(struct pci_dev *dev); + +extern unsigned int pcibios_max_latency;  void pci_set_master(struct pci_dev *dev);  void pci_clear_master(struct pci_dev *dev); +  int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);  int pci_set_cacheline_size(struct pci_dev *dev);  #define HAVE_PCI_SET_MWI @@ -803,6 +803,9 @@ int __must_check pci_set_mwi(struct pci_dev *dev);  int pci_try_set_mwi(struct pci_dev *dev);  void pci_clear_mwi(struct pci_dev *dev);  void pci_intx(struct pci_dev *dev, int enable); +bool pci_intx_mask_supported(struct pci_dev *dev); +bool pci_check_and_mask_intx(struct pci_dev *dev); +bool pci_check_and_unmask_intx(struct pci_dev *dev);  void pci_msi_off(struct pci_dev *dev);  int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);  int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask); @@ -910,6 +913,8 @@ int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);  void pci_release_selected_regions(struct pci_dev *, int);  /* drivers/pci/bus.c */ +void pci_add_resource(struct list_head *resources, struct resource *res); +void pci_free_resource_list(struct list_head *resources);  void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags);  struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n);  void pci_bus_remove_resources(struct pci_bus *bus); @@ -1084,8 +1089,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_block_user_cfg_access(struct pci_dev *dev); -extern void pci_unblock_user_cfg_access(struct pci_dev *dev); +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);  /*   * PCI domain support.  Sometimes called PCI segment (eg by ACPI), @@ -1282,10 +1288,13 @@ static inline void pci_release_regions(struct pci_dev *dev)  #define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0) -static inline void pci_block_user_cfg_access(struct pci_dev *dev) +static inline void pci_block_cfg_access(struct pci_dev *dev)  { } -static inline void pci_unblock_user_cfg_access(struct pci_dev *dev) +static inline int pci_block_cfg_access_in_atomic(struct pci_dev *dev) +{ return 0; } + +static inline void pci_unblock_cfg_access(struct pci_dev *dev)  { }  static inline struct pci_bus *pci_find_next_bus(const struct pci_bus *from) @@ -1423,10 +1432,10 @@ static inline void pci_fixup_device(enum pci_fixup_pass pass,  void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);  void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);  void __iomem * const *pcim_iomap_table(struct pci_dev *pdev); -int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name); -int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, +int pcim_iomap_regions(struct pci_dev *pdev, int mask, const char *name); +int pcim_iomap_regions_request_all(struct pci_dev *pdev, int mask,  				   const char *name); -void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask); +void pcim_iounmap_regions(struct pci_dev *pdev, int mask);  extern int pci_pci_problems;  #define PCIPCI_FAIL		1	/* No PCI PCI DMA */ @@ -1445,8 +1454,10 @@ extern u8 pci_cache_line_size;  extern unsigned long pci_hotplug_io_size;  extern unsigned long pci_hotplug_mem_size; +/* Architecture specific versions may override these (weak) */  int pcibios_add_platform_entries(struct pci_dev *dev);  void pcibios_disable_device(struct pci_dev *dev); +void pcibios_set_master(struct pci_dev *dev);  int pcibios_set_pcie_reset_state(struct pci_dev *dev,  				 enum pcie_reset_state state); diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 3fdf251389d..31d77af2ef4 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -517,8 +517,12 @@  #define PCI_DEVICE_ID_AMD_11H_NB_DRAM	0x1302  #define PCI_DEVICE_ID_AMD_11H_NB_MISC	0x1303  #define PCI_DEVICE_ID_AMD_11H_NB_LINK	0x1304 +#define PCI_DEVICE_ID_AMD_15H_NB_F0	0x1600 +#define PCI_DEVICE_ID_AMD_15H_NB_F1	0x1601 +#define PCI_DEVICE_ID_AMD_15H_NB_F2	0x1602  #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_CNB17H_F3	0x1703  #define PCI_DEVICE_ID_AMD_LANCE		0x2000  #define PCI_DEVICE_ID_AMD_LANCE_HOME	0x2001 @@ -772,6 +776,29 @@  #define PCI_DEVICE_ID_ELSA_QS3000	0x3000  #define PCI_VENDOR_ID_STMICRO		0x104A +#define PCI_DEVICE_ID_STMICRO_USB_HOST	0xCC00 +#define PCI_DEVICE_ID_STMICRO_USB_OHCI	0xCC01 +#define PCI_DEVICE_ID_STMICRO_USB_OTG	0xCC02 +#define PCI_DEVICE_ID_STMICRO_UART_HWFC 0xCC03 +#define PCI_DEVICE_ID_STMICRO_UART_NO_HWFC	0xCC04 +#define PCI_DEVICE_ID_STMICRO_SOC_DMA	0xCC05 +#define PCI_DEVICE_ID_STMICRO_SATA	0xCC06 +#define PCI_DEVICE_ID_STMICRO_I2C	0xCC07 +#define PCI_DEVICE_ID_STMICRO_SPI_HS	0xCC08 +#define PCI_DEVICE_ID_STMICRO_MAC	0xCC09 +#define PCI_DEVICE_ID_STMICRO_SDIO_EMMC 0xCC0A +#define PCI_DEVICE_ID_STMICRO_SDIO	0xCC0B +#define PCI_DEVICE_ID_STMICRO_GPIO	0xCC0C +#define PCI_DEVICE_ID_STMICRO_VIP	0xCC0D +#define PCI_DEVICE_ID_STMICRO_AUDIO_ROUTER_DMA	0xCC0E +#define PCI_DEVICE_ID_STMICRO_AUDIO_ROUTER_SRCS 0xCC0F +#define PCI_DEVICE_ID_STMICRO_AUDIO_ROUTER_MSPS 0xCC10 +#define PCI_DEVICE_ID_STMICRO_CAN	0xCC11 +#define PCI_DEVICE_ID_STMICRO_MLB	0xCC12 +#define PCI_DEVICE_ID_STMICRO_DBP	0xCC13 +#define PCI_DEVICE_ID_STMICRO_SATA_PHY	0xCC14 +#define PCI_DEVICE_ID_STMICRO_ESRAM	0xCC15 +#define PCI_DEVICE_ID_STMICRO_VIC	0xCC16  #define PCI_VENDOR_ID_BUSLOGIC		      0x104B  #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 @@ -2405,6 +2432,8 @@  #define PCI_VENDOR_ID_AZWAVE		0x1a3b +#define PCI_VENDOR_ID_ASMEDIA		0x1b21 +  #define PCI_VENDOR_ID_TEKRAM		0x1de1  #define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index b5d9657f310..e41a10f5ae8 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -392,7 +392,7 @@  #define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */  #define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */  #define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */ -#define  PCI_EXP_TYPE_RC_EC	0x10	/* Root Complex Event Collector */ +#define  PCI_EXP_TYPE_RC_EC	0xa	/* Root Complex Event Collector */  #define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */  #define PCI_EXP_FLAGS_IRQ	0x3e00	/* Interrupt message number */  #define PCI_EXP_DEVCAP		4	/* Device capabilities */ @@ -537,7 +537,9 @@  #define PCI_EXT_CAP_ID_ARI	14  #define PCI_EXT_CAP_ID_ATS	15  #define PCI_EXT_CAP_ID_SRIOV	16 +#define PCI_EXT_CAP_ID_PRI	19  #define PCI_EXT_CAP_ID_LTR	24 +#define PCI_EXT_CAP_ID_PASID	27  /* Advanced Error Reporting */  #define PCI_ERR_UNCOR_STATUS	4	/* Uncorrectable Error Status */ @@ -664,24 +666,24 @@  #define  PCI_ATS_MIN_STU	12	/* shift of minimum STU block */  /* Page Request Interface */ -#define PCI_PRI_CAP		0x13    /* PRI capability ID */ -#define PCI_PRI_CONTROL_OFF	0x04	/* Offset of control register */ -#define PCI_PRI_STATUS_OFF	0x06	/* Offset of status register */ -#define PCI_PRI_ENABLE		0x0001	/* Enable mask */ -#define PCI_PRI_RESET		0x0002	/* Reset bit mask */ -#define PCI_PRI_STATUS_RF	0x0001  /* Request Failure */ -#define PCI_PRI_STATUS_UPRGI	0x0002  /* Unexpected PRG index */ -#define PCI_PRI_STATUS_STOPPED	0x0100  /* PRI Stopped */ -#define PCI_PRI_MAX_REQ_OFF	0x08	/* Cap offset for max reqs supported */ -#define PCI_PRI_ALLOC_REQ_OFF	0x0c	/* Cap offset for max reqs allowed */ +#define PCI_PRI_CTRL		0x04	/* PRI control register */ +#define  PCI_PRI_CTRL_ENABLE	0x01	/* Enable */ +#define  PCI_PRI_CTRL_RESET	0x02	/* Reset */ +#define PCI_PRI_STATUS		0x06	/* PRI status register */ +#define  PCI_PRI_STATUS_RF	0x001	/* Response Failure */ +#define  PCI_PRI_STATUS_UPRGI	0x002	/* Unexpected PRG index */ +#define  PCI_PRI_STATUS_STOPPED	0x100	/* PRI Stopped */ +#define PCI_PRI_MAX_REQ		0x08	/* PRI max reqs supported */ +#define PCI_PRI_ALLOC_REQ	0x0c	/* PRI max reqs allowed */  /* PASID capability */ -#define PCI_PASID_CAP		0x1b    /* PASID capability ID */ -#define PCI_PASID_CAP_OFF	0x04    /* PASID feature register */ -#define PCI_PASID_CONTROL_OFF   0x06    /* PASID control register */ -#define PCI_PASID_ENABLE	0x01	/* Enable/Supported bit */ -#define PCI_PASID_EXEC		0x02	/* Exec permissions Enable/Supported */ -#define PCI_PASID_PRIV		0x04	/* Priviledge Mode Enable/Support */ +#define PCI_PASID_CAP		0x04    /* PASID feature register */ +#define  PCI_PASID_CAP_EXEC	0x02	/* Exec permissions Supported */ +#define  PCI_PASID_CAP_PRIV	0x04	/* Priviledge Mode Supported */ +#define PCI_PASID_CTRL		0x06    /* PASID control register */ +#define  PCI_PASID_CTRL_ENABLE	0x01	/* Enable bit */ +#define  PCI_PASID_CTRL_EXEC	0x02	/* Exec permissions Enable */ +#define  PCI_PASID_CTRL_PRIV	0x04	/* Priviledge Mode Enable */  /* Single Root I/O Virtualization */  #define PCI_SRIOV_CAP		0x04	/* SR-IOV Capabilities */ diff --git a/include/linux/pda_power.h b/include/linux/pda_power.h index c9e4d814ff7..2bb62bf296a 100644 --- a/include/linux/pda_power.h +++ b/include/linux/pda_power.h @@ -35,6 +35,8 @@ struct pda_power_pdata {  	unsigned int polling_interval; /* msecs, default is 2000 */  	unsigned long ac_max_uA; /* current to draw when on AC */ + +	bool use_otg_notifier;  };  #endif /* __PDA_POWER_H__ */ diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 9ca008f0c54..32cd1f67462 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h @@ -172,10 +172,10 @@ extern phys_addr_t per_cpu_ptr_to_phys(void *addr);   * equal char, int or long.  percpu_read() evaluates to a lvalue and   * all others to void.   * - * These operations are guaranteed to be atomic w.r.t. preemption. - * The generic versions use plain get/put_cpu_var().  Archs are + * These operations are guaranteed to be atomic. + * The generic versions disable interrupts.  Archs are   * encouraged to implement single-instruction alternatives which don't - * require preemption protection. + * require protection.   */  #ifndef percpu_read  # define percpu_read(var)						\ @@ -347,9 +347,10 @@ do {									\  #define _this_cpu_generic_to_op(pcp, val, op)				\  do {									\ -	preempt_disable();						\ +	unsigned long flags;						\ +	local_irq_save(flags);						\  	*__this_cpu_ptr(&(pcp)) op val;					\ -	preempt_enable();						\ +	local_irq_restore(flags);					\  } while (0)  #ifndef this_cpu_write @@ -447,10 +448,11 @@ do {									\  #define _this_cpu_generic_add_return(pcp, val)				\  ({									\  	typeof(pcp) ret__;						\ -	preempt_disable();						\ +	unsigned long flags;						\ +	local_irq_save(flags);						\  	__this_cpu_add(pcp, val);					\  	ret__ = __this_cpu_read(pcp);					\ -	preempt_enable();						\ +	local_irq_restore(flags);					\  	ret__;								\  }) @@ -476,10 +478,11 @@ do {									\  #define _this_cpu_generic_xchg(pcp, nval)				\  ({	typeof(pcp) ret__;						\ -	preempt_disable();						\ +	unsigned long flags;						\ +	local_irq_save(flags);						\  	ret__ = __this_cpu_read(pcp);					\  	__this_cpu_write(pcp, nval);					\ -	preempt_enable();						\ +	local_irq_restore(flags);					\  	ret__;								\  }) @@ -501,12 +504,14 @@ do {									\  #endif  #define _this_cpu_generic_cmpxchg(pcp, oval, nval)			\ -({	typeof(pcp) ret__;						\ -	preempt_disable();						\ +({									\ +	typeof(pcp) ret__;						\ +	unsigned long flags;						\ +	local_irq_save(flags);						\  	ret__ = __this_cpu_read(pcp);					\  	if (ret__ == (oval))						\  		__this_cpu_write(pcp, nval);				\ -	preempt_enable();						\ +	local_irq_restore(flags);					\  	ret__;								\  }) @@ -538,10 +543,11 @@ do {									\  #define _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)	\  ({									\  	int ret__;							\ -	preempt_disable();						\ +	unsigned long flags;						\ +	local_irq_save(flags);						\  	ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2,		\  			oval1, oval2, nval1, nval2);			\ -	preempt_enable();						\ +	local_irq_restore(flags);					\  	ret__;								\  }) @@ -567,9 +573,9 @@ do {									\  #endif  /* - * Generic percpu operations that do not require preemption handling. + * Generic percpu operations for context that are safe from preemption/interrupts.   * Either we do not care about races or the caller has the - * responsibility of handling preemptions issues. Arch code can still + * responsibility of handling preemption/interrupt issues. Arch code can still   * override these instructions since the arch per cpu code may be more   * efficient and may actually get race freeness for free (that is the   * case for x86 for example). @@ -802,156 +808,4 @@ do {									\  	__pcpu_double_call_return_bool(__this_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2))  #endif -/* - * IRQ safe versions of the per cpu RMW operations. Note that these operations - * are *not* safe against modification of the same variable from another - * processors (which one gets when using regular atomic operations) - * They are guaranteed to be atomic vs. local interrupts and - * preemption only. - */ -#define irqsafe_cpu_generic_to_op(pcp, val, op)				\ -do {									\ -	unsigned long flags;						\ -	local_irq_save(flags);						\ -	*__this_cpu_ptr(&(pcp)) op val;					\ -	local_irq_restore(flags);					\ -} while (0) - -#ifndef irqsafe_cpu_add -# ifndef irqsafe_cpu_add_1 -#  define irqsafe_cpu_add_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) -# endif -# ifndef irqsafe_cpu_add_2 -#  define irqsafe_cpu_add_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) -# endif -# ifndef irqsafe_cpu_add_4 -#  define irqsafe_cpu_add_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) -# endif -# ifndef irqsafe_cpu_add_8 -#  define irqsafe_cpu_add_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) -# endif -# define irqsafe_cpu_add(pcp, val) __pcpu_size_call(irqsafe_cpu_add_, (pcp), (val)) -#endif - -#ifndef irqsafe_cpu_sub -# define irqsafe_cpu_sub(pcp, val)	irqsafe_cpu_add((pcp), -(val)) -#endif - -#ifndef irqsafe_cpu_inc -# define irqsafe_cpu_inc(pcp)	irqsafe_cpu_add((pcp), 1) -#endif - -#ifndef irqsafe_cpu_dec -# define irqsafe_cpu_dec(pcp)	irqsafe_cpu_sub((pcp), 1) -#endif - -#ifndef irqsafe_cpu_and -# ifndef irqsafe_cpu_and_1 -#  define irqsafe_cpu_and_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) -# endif -# ifndef irqsafe_cpu_and_2 -#  define irqsafe_cpu_and_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) -# endif -# ifndef irqsafe_cpu_and_4 -#  define irqsafe_cpu_and_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) -# endif -# ifndef irqsafe_cpu_and_8 -#  define irqsafe_cpu_and_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) -# endif -# define irqsafe_cpu_and(pcp, val) __pcpu_size_call(irqsafe_cpu_and_, (val)) -#endif - -#ifndef irqsafe_cpu_or -# ifndef irqsafe_cpu_or_1 -#  define irqsafe_cpu_or_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) -# endif -# ifndef irqsafe_cpu_or_2 -#  define irqsafe_cpu_or_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) -# endif -# ifndef irqsafe_cpu_or_4 -#  define irqsafe_cpu_or_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) -# endif -# ifndef irqsafe_cpu_or_8 -#  define irqsafe_cpu_or_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) -# endif -# define irqsafe_cpu_or(pcp, val) __pcpu_size_call(irqsafe_cpu_or_, (val)) -#endif - -#ifndef irqsafe_cpu_xor -# ifndef irqsafe_cpu_xor_1 -#  define irqsafe_cpu_xor_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) -# endif -# ifndef irqsafe_cpu_xor_2 -#  define irqsafe_cpu_xor_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) -# endif -# ifndef irqsafe_cpu_xor_4 -#  define irqsafe_cpu_xor_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) -# endif -# ifndef irqsafe_cpu_xor_8 -#  define irqsafe_cpu_xor_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) -# endif -# define irqsafe_cpu_xor(pcp, val) __pcpu_size_call(irqsafe_cpu_xor_, (val)) -#endif - -#define irqsafe_cpu_generic_cmpxchg(pcp, oval, nval)			\ -({									\ -	typeof(pcp) ret__;						\ -	unsigned long flags;						\ -	local_irq_save(flags);						\ -	ret__ = __this_cpu_read(pcp);					\ -	if (ret__ == (oval))						\ -		__this_cpu_write(pcp, nval);				\ -	local_irq_restore(flags);					\ -	ret__;								\ -}) - -#ifndef irqsafe_cpu_cmpxchg -# ifndef irqsafe_cpu_cmpxchg_1 -#  define irqsafe_cpu_cmpxchg_1(pcp, oval, nval)	irqsafe_cpu_generic_cmpxchg(pcp, oval, nval) -# endif -# ifndef irqsafe_cpu_cmpxchg_2 -#  define irqsafe_cpu_cmpxchg_2(pcp, oval, nval)	irqsafe_cpu_generic_cmpxchg(pcp, oval, nval) -# endif -# ifndef irqsafe_cpu_cmpxchg_4 -#  define irqsafe_cpu_cmpxchg_4(pcp, oval, nval)	irqsafe_cpu_generic_cmpxchg(pcp, oval, nval) -# endif -# ifndef irqsafe_cpu_cmpxchg_8 -#  define irqsafe_cpu_cmpxchg_8(pcp, oval, nval)	irqsafe_cpu_generic_cmpxchg(pcp, oval, nval) -# endif -# define irqsafe_cpu_cmpxchg(pcp, oval, nval)		\ -	__pcpu_size_call_return2(irqsafe_cpu_cmpxchg_, (pcp), oval, nval) -#endif - -#define irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -({									\ -	int ret__;							\ -	unsigned long flags;						\ -	local_irq_save(flags);						\ -	ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2,		\ -			oval1, oval2, nval1, nval2);			\ -	local_irq_restore(flags);					\ -	ret__;								\ -}) - -#ifndef irqsafe_cpu_cmpxchg_double -# ifndef irqsafe_cpu_cmpxchg_double_1 -#  define irqsafe_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -	irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) -# endif -# ifndef irqsafe_cpu_cmpxchg_double_2 -#  define irqsafe_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -	irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) -# endif -# ifndef irqsafe_cpu_cmpxchg_double_4 -#  define irqsafe_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -	irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) -# endif -# ifndef irqsafe_cpu_cmpxchg_double_8 -#  define irqsafe_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -	irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) -# endif -# define irqsafe_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)	\ -	__pcpu_double_call_return_bool(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) -#endif -  #endif /* __LINUX_PERCPU_H */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 1e9ebe5e009..abb2776be1b 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -54,6 +54,7 @@ enum perf_hw_id {  	PERF_COUNT_HW_BUS_CYCLES		= 6,  	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND	= 7,  	PERF_COUNT_HW_STALLED_CYCLES_BACKEND	= 8, +	PERF_COUNT_HW_REF_CPU_CYCLES		= 9,  	PERF_COUNT_HW_MAX,			/* non-ABI */  }; @@ -586,6 +587,7 @@ struct hw_perf_event {  	u64				sample_period;  	u64				last_period;  	local64_t			period_left; +	u64                             interrupts_seq;  	u64				interrupts;  	u64				freq_time_stamp; @@ -822,6 +824,7 @@ struct perf_event {  	int				mmap_locked;  	struct user_struct		*mmap_user;  	struct ring_buffer		*rb; +	struct list_head		rb_entry;  	/* poll related */  	wait_queue_head_t		waitq; @@ -889,6 +892,7 @@ struct perf_event_context {  	int				nr_active;  	int				is_active;  	int				nr_stat; +	int				nr_freq;  	int				rotate_disable;  	atomic_t			refcount;  	struct task_struct		*task; @@ -1062,12 +1066,12 @@ perf_sw_event(u32 event_id, u64 nr, struct pt_regs *regs, u64 addr)  	}  } -extern struct jump_label_key perf_sched_events; +extern struct jump_label_key_deferred perf_sched_events;  static inline void perf_event_task_sched_in(struct task_struct *prev,  					    struct task_struct *task)  { -	if (static_branch(&perf_sched_events)) +	if (static_branch(&perf_sched_events.key))  		__perf_event_task_sched_in(prev, task);  } @@ -1076,7 +1080,7 @@ static inline void perf_event_task_sched_out(struct task_struct *prev,  {  	perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, NULL, 0); -	if (static_branch(&perf_sched_events)) +	if (static_branch(&perf_sched_events.key))  		__perf_event_task_sched_out(prev, next);  } diff --git a/include/linux/phonet.h b/include/linux/phonet.h index f53a4167c5f..f48bfc80cb4 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h @@ -38,6 +38,7 @@  #define PNPIPE_ENCAP		1  #define PNPIPE_IFINDEX		2  #define PNPIPE_HANDLE		3 +#define PNPIPE_INITSTATE	4  #define PNADDR_ANY		0  #define PNADDR_BROADCAST	0xFC @@ -49,6 +50,7 @@  /* ioctls */  #define SIOCPNGETOBJECT		(SIOCPROTOPRIVATE + 0) +#define SIOCPNENABLEPIPE	(SIOCPROTOPRIVATE + 13)  #define SIOCPNADDRESOURCE	(SIOCPROTOPRIVATE + 14)  #define SIOCPNDELRESOURCE	(SIOCPROTOPRIVATE + 15) diff --git a/include/linux/phy.h b/include/linux/phy.h index 79f337c4738..c599f7eca1e 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -129,7 +129,12 @@ struct mii_bus {  };  #define to_mii_bus(d) container_of(d, struct mii_bus, dev) -struct mii_bus *mdiobus_alloc(void); +struct mii_bus *mdiobus_alloc_size(size_t); +static inline struct mii_bus *mdiobus_alloc(void) +{ +	return mdiobus_alloc_size(0); +} +  int mdiobus_register(struct mii_bus *bus);  void mdiobus_unregister(struct mii_bus *bus);  void mdiobus_free(struct mii_bus *bus); diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h index 38d10326246..e7cf6669ac3 100644 --- a/include/linux/pid_namespace.h +++ b/include/linux/pid_namespace.h @@ -30,6 +30,8 @@ struct pid_namespace {  #ifdef CONFIG_BSD_PROCESS_ACCT  	struct bsd_acct_struct *bacct;  #endif +	gid_t pid_gid; +	int hide_pid;  };  extern struct pid_namespace init_pid_ns; diff --git a/include/linux/pinctrl/machine.h b/include/linux/pinctrl/machine.h index 88863531d86..d0aecb7f6fb 100644 --- a/include/linux/pinctrl/machine.h +++ b/include/linux/pinctrl/machine.h @@ -48,7 +48,7 @@ struct pinmux_map {  	const char *group;  	struct device *dev;  	const char *dev_name; -	const bool hog_on_boot; +	bool hog_on_boot;  };  /* @@ -66,30 +66,22 @@ struct pinmux_map {  	{ .name = a, .ctrl_dev_name = b, .function = c }  /* - * Convenience macro to map a function onto the primary device pinctrl device - * this is especially helpful on systems that have only one pin controller - * or need to set up a lot of mappings on the primary controller. - */ -#define PINMUX_MAP_PRIMARY(a, b, c) \ -	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b, \ -	  .dev_name = c } - -/* - * Convenience macro to map a system function onto the primary pinctrl device. - * System functions are not assigned to a particular device. + * Convenience macro to map a system function onto a certain pinctrl device, + * to be hogged by the pinmux core until the system shuts down.   */ -#define PINMUX_MAP_PRIMARY_SYS(a, b) \ -	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b } +#define PINMUX_MAP_SYS_HOG(a, b, c) \ +	{ .name = a, .ctrl_dev_name = b, .function = c, \ +	  .hog_on_boot = true }  /* - * Convenience macro to map a system function onto the primary pinctrl device, - * to be hogged by the pinmux core until the system shuts down. + * Convenience macro to map a system function onto a certain pinctrl device + * using a specified group, to be hogged by the pinmux core until the system + * shuts down.   */ -#define PINMUX_MAP_PRIMARY_SYS_HOG(a, b) \ -	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b, \ +#define PINMUX_MAP_SYS_HOG_GROUP(a, b, c, d)		\ +	{ .name = a, .ctrl_dev_name = b, .function = c, .group = d, \  	  .hog_on_boot = true } -  #ifdef CONFIG_PINMUX  extern int pinmux_register_mappings(struct pinmux_map const *map, diff --git a/include/linux/pinctrl/pinconf.h b/include/linux/pinctrl/pinconf.h new file mode 100644 index 00000000000..477922cf043 --- /dev/null +++ b/include/linux/pinctrl/pinconf.h @@ -0,0 +1,97 @@ +/* + * Interface the pinconfig portions of the pinctrl subsystem + * + * Copyright (C) 2011 ST-Ericsson SA + * Written on behalf of Linaro for ST-Ericsson + * This interface is used in the core to keep track of pins. + * + * Author: Linus Walleij <linus.walleij@linaro.org> + * + * License terms: GNU General Public License (GPL) version 2 + */ +#ifndef __LINUX_PINCTRL_PINCONF_H +#define __LINUX_PINCTRL_PINCONF_H + +#ifdef CONFIG_PINCONF + +struct pinctrl_dev; +struct seq_file; + +/** + * struct pinconf_ops - pin config operations, to be implemented by + * pin configuration capable drivers. + * @pin_config_get: get the config of a certain pin, if the requested config + *	is not available on this controller this should return -ENOTSUPP + *	and if it is available but disabled it should return -EINVAL + * @pin_config_get: get the config of a certain pin + * @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_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 + *	per-device info for a certain group in debugfs + */ +struct pinconf_ops { +	int (*pin_config_get) (struct pinctrl_dev *pctldev, +			       unsigned pin, +			       unsigned long *config); +	int (*pin_config_set) (struct pinctrl_dev *pctldev, +			       unsigned pin, +			       unsigned long config); +	int (*pin_config_group_get) (struct pinctrl_dev *pctldev, +				     unsigned selector, +				     unsigned long *config); +	int (*pin_config_group_set) (struct pinctrl_dev *pctldev, +				     unsigned selector, +				     unsigned long config); +	void (*pin_config_dbg_show) (struct pinctrl_dev *pctldev, +				     struct seq_file *s, +				     unsigned offset); +	void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev, +					   struct seq_file *s, +					   unsigned selector); +}; + +extern int pin_config_get(const char *dev_name, const char *name, +			  unsigned long *config); +extern int pin_config_set(const char *dev_name, const char *name, +			  unsigned long config); +extern int pin_config_group_get(const char *dev_name, +				const char *pin_group, +				unsigned long *config); +extern int pin_config_group_set(const char *dev_name, +				const char *pin_group, +				unsigned long config); + +#else + +static inline int pin_config_get(const char *dev_name, const char *name, +				 unsigned long *config) +{ +	return 0; +} + +static inline int pin_config_set(const char *dev_name, const char *name, +				 unsigned long config) +{ +	return 0; +} + +static inline int pin_config_group_get(const char *dev_name, +				       const char *pin_group, +				       unsigned long *config) +{ +	return 0; +} + +static inline int pin_config_group_set(const char *dev_name, +				       const char *pin_group, +				       unsigned long config) +{ +	return 0; +} + +#endif + +#endif /* __LINUX_PINCTRL_PINCONF_H */ diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 3605e947fa9..8bd22ee7aa0 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h @@ -21,6 +21,7 @@  struct pinctrl_dev;  struct pinmux_ops; +struct pinconf_ops;  struct gpio_chip;  /** @@ -45,6 +46,7 @@ struct pinctrl_pin_desc {   * @name: a name for the chip in this range   * @id: an ID number for the chip in this range   * @base: base offset of the GPIO range + * @pin_base: base pin number of the GPIO range   * @npins: number of pins in the GPIO range, including the base number   * @gc: an optional pointer to a gpio_chip   */ @@ -53,6 +55,7 @@ struct pinctrl_gpio_range {  	const char *name;  	unsigned int id;  	unsigned int base; +	unsigned int pin_base;  	unsigned int npins;  	struct gpio_chip *gc;  }; @@ -89,22 +92,20 @@ struct pinctrl_ops {   *	this pin controller   * @npins: number of descriptors in the array, usually just ARRAY_SIZE()   *	of the pins field above - * @maxpin: since pin spaces may be sparse, there can he "holes" in the - *	pin range, this attribute gives the maximum pin number in the - *	total range. This should not be lower than npins for example, - *	but may be equal to npins if you have no holes in the pin range.   * @pctlops: pin control operation vtable, to support global concepts like   *	grouping of pins, this is optional. - * @pmxops: pinmux operation vtable, if you support pinmuxing in your driver + * @pmxops: pinmux operations vtable, if you support pinmuxing in your driver + * @confops: pin config operations vtable, if you support pin configuration in + *	your driver   * @owner: module providing the pin controller, used for refcounting   */  struct pinctrl_desc {  	const char *name;  	struct pinctrl_pin_desc const *pins;  	unsigned int npins; -	unsigned int maxpin;  	struct pinctrl_ops *pctlops;  	struct pinmux_ops *pmxops; +	struct pinconf_ops *confops;  	struct module *owner;  }; @@ -121,8 +122,9 @@ extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev);  extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev);  #else +struct pinctrl_dev; -/* Sufficiently stupid default function when pinctrl is not in use */ +/* Sufficiently stupid default functions when pinctrl is not in use */  static inline bool pin_is_valid(struct pinctrl_dev *pctldev, int pin)  {  	return pin >= 0; diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h index 3c430e797ef..937b3e2fa36 100644 --- a/include/linux/pinctrl/pinmux.h +++ b/include/linux/pinctrl/pinmux.h @@ -52,9 +52,15 @@ struct pinctrl_dev;   * @disable: disable a certain muxing selector with a certain pin group   * @gpio_request_enable: requests and enables GPIO on a certain pin.   *	Implement this only if you can mux every pin individually as GPIO. The - *	affected GPIO range is passed along with an offset into that + *	affected GPIO range is passed along with an offset(pin number) into that   *	specific GPIO range - function selectors and pin groups are orthogonal - *	to this, the core will however make sure the pins do not collide + *	to this, the core will however make sure the pins do not collide. + * @gpio_disable_free: free up GPIO muxing on a certain pin, the reverse of + *	@gpio_request_enable + * @gpio_set_direction: Since controllers may need different configurations + *	depending on whether the GPIO is configured as input or output, + *	a direction selector function may be implemented as a backing + *	to the GPIO controllers that need pin muxing.   */  struct pinmux_ops {  	int (*request) (struct pinctrl_dev *pctldev, unsigned offset); @@ -73,11 +79,20 @@ struct pinmux_ops {  	int (*gpio_request_enable) (struct pinctrl_dev *pctldev,  				    struct pinctrl_gpio_range *range,  				    unsigned offset); +	void (*gpio_disable_free) (struct pinctrl_dev *pctldev, +				   struct pinctrl_gpio_range *range, +				   unsigned offset); +	int (*gpio_set_direction) (struct pinctrl_dev *pctldev, +				   struct pinctrl_gpio_range *range, +				   unsigned offset, +				   bool input);  };  /* External interface to pinmux */  extern int pinmux_request_gpio(unsigned gpio);  extern void pinmux_free_gpio(unsigned gpio); +extern int pinmux_gpio_direction_input(unsigned gpio); +extern int pinmux_gpio_direction_output(unsigned gpio);  extern struct pinmux * __must_check pinmux_get(struct device *dev, const char *name);  extern void pinmux_put(struct pinmux *pmx);  extern int pinmux_enable(struct pinmux *pmx); @@ -94,6 +109,16 @@ static inline void pinmux_free_gpio(unsigned gpio)  {  } +static inline int pinmux_gpio_direction_input(unsigned gpio) +{ +	return 0; +} + +static inline int pinmux_gpio_direction_output(unsigned gpio) +{ +	return 0; +} +  static inline struct pinmux * __must_check pinmux_get(struct device *dev, const char *name)  {  	return NULL; diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h index c5336705921..0d5b79365d0 100644 --- a/include/linux/pkt_sched.h +++ b/include/linux/pkt_sched.h @@ -30,7 +30,7 @@   */  struct tc_stats { -	__u64	bytes;			/* NUmber of enqueues bytes */ +	__u64	bytes;			/* Number of enqueued bytes */  	__u32	packets;		/* Number of enqueued packets	*/  	__u32	drops;			/* Packets dropped because of lack of resources */  	__u32	overlimits;		/* Number of throttle events when this @@ -162,25 +162,44 @@ struct tc_sfq_qopt {  	unsigned	flows;		/* Maximal number of flows  */  }; +struct tc_sfqred_stats { +	__u32           prob_drop;      /* Early drops, below max threshold */ +	__u32           forced_drop;	/* Early drops, after max threshold */ +	__u32           prob_mark;      /* Marked packets, below max threshold */ +	__u32           forced_mark;    /* Marked packets, after max threshold */ +	__u32           prob_mark_head; /* Marked packets, below max threshold */ +	__u32           forced_mark_head;/* Marked packets, after max threshold */ +}; + +struct tc_sfq_qopt_v1 { +	struct tc_sfq_qopt v0; +	unsigned int	depth;		/* max number of packets per flow */ +	unsigned int	headdrop; +/* SFQRED parameters */ +	__u32		limit;		/* HARD maximal flow queue length (bytes) */ +	__u32		qth_min;	/* Min average length threshold (bytes) */ +	__u32		qth_max;	/* Max average length threshold (bytes) */ +	unsigned char   Wlog;		/* log(W)		*/ +	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/ +	unsigned char   Scell_log;	/* cell size for idle damping */ +	unsigned char	flags; +	__u32		max_P;		/* probability, high resolution */ +/* SFQRED stats */ +	struct tc_sfqred_stats stats; +}; + +  struct tc_sfq_xstats {  	__s32		allot;  }; -/* - *  NOTE: limit, divisor and flows are hardwired to code at the moment. - * - *	limit=flows=128, divisor=1024; - * - *	The only reason for this is efficiency, it is possible - *	to change these parameters in compile time. - */ -  /* RED section */  enum {  	TCA_RED_UNSPEC,  	TCA_RED_PARMS,  	TCA_RED_STAB, +	TCA_RED_MAX_P,  	__TCA_RED_MAX,  }; @@ -194,8 +213,9 @@ struct tc_red_qopt {  	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/  	unsigned char   Scell_log;	/* cell size for idle damping */  	unsigned char	flags; -#define TC_RED_ECN	1 -#define TC_RED_HARDDROP	2 +#define TC_RED_ECN		1 +#define TC_RED_HARDDROP		2 +#define TC_RED_ADAPTATIVE	4  };  struct tc_red_xstats { @@ -214,6 +234,7 @@ enum {         TCA_GRED_PARMS,         TCA_GRED_STAB,         TCA_GRED_DPS, +       TCA_GRED_MAX_P,  	   __TCA_GRED_MAX,  }; @@ -253,6 +274,7 @@ enum {  	TCA_CHOKE_UNSPEC,  	TCA_CHOKE_PARMS,  	TCA_CHOKE_STAB, +	TCA_CHOKE_MAX_P,  	__TCA_CHOKE_MAX,  }; @@ -297,7 +319,7 @@ struct tc_htb_glob {  	__u32 debug;		/* debug flags */  	/* stats */ -	__u32 direct_pkts; /* count of non shapped packets */ +	__u32 direct_pkts; /* count of non shaped packets */  };  enum {  	TCA_HTB_UNSPEC, @@ -465,6 +487,7 @@ enum {  	TCA_NETEM_REORDER,  	TCA_NETEM_CORRUPT,  	TCA_NETEM_LOSS, +	TCA_NETEM_RATE,  	__TCA_NETEM_MAX,  }; @@ -495,6 +518,13 @@ struct tc_netem_corrupt {  	__u32	correlation;  }; +struct tc_netem_rate { +	__u32	rate;	/* byte/s */ +	__s32	packet_overhead; +	__u32	cell_size; +	__s32	cell_overhead; +}; +  enum {  	NETEM_LOSS_UNSPEC,  	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */ @@ -503,7 +533,7 @@ enum {  };  #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) -/* State transition probablities for 4 state model */ +/* State transition probabilities for 4 state model */  struct tc_netem_gimodel {  	__u32	p13;  	__u32	p31; diff --git a/include/linux/platform_data/macb.h b/include/linux/platform_data/macb.h new file mode 100644 index 00000000000..b081c7245ec --- /dev/null +++ b/include/linux/platform_data/macb.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2004-2006 Atmel Corporation + * + * 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 __MACB_PDATA_H__ +#define __MACB_PDATA_H__ + +struct macb_platform_data { +	u32		phy_mask; +	int		phy_irq_pin;	/* PHY IRQ */ +	u8		is_rmii;	/* using RMII interface? */ +}; + +#endif /* __MACB_PDATA_H__ */ diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h index e9d9149ddf3..d94804aca76 100644 --- a/include/linux/platform_data/mv_usb.h +++ b/include/linux/platform_data/mv_usb.h @@ -42,9 +42,23 @@ struct mv_usb_platform_data {  	/* only valid for HCD. OTG or Host only*/  	unsigned int		mode; -	int     (*phy_init)(unsigned int regbase); -	void    (*phy_deinit)(unsigned int regbase); +	/* This flag is used for that needs id pin checked by otg */ +	unsigned int    disable_otg_clock_gating:1; +	/* Force a_bus_req to be asserted */ +	 unsigned int    otg_force_a_bus_req:1; + +	int	(*phy_init)(void __iomem *regbase); +	void	(*phy_deinit)(void __iomem *regbase);  	int	(*set_vbus)(unsigned int vbus); +	int     (*private_init)(void __iomem *opregs, void __iomem *phyregs);  }; +#ifndef CONFIG_HAVE_CLK +/* Dummy stub for clk framework */ +#define clk_get(dev, id)       NULL +#define clk_put(clock)         do {} while (0) +#define clk_enable(clock)      do {} while (0) +#define clk_disable(clock)     do {} while (0) +#endif +  #endif diff --git a/include/linux/platform_data/s3c-hsudc.h b/include/linux/platform_data/s3c-hsudc.h new file mode 100644 index 00000000000..6fa109339bf --- /dev/null +++ b/include/linux/platform_data/s3c-hsudc.h @@ -0,0 +1,34 @@ +/* + * S3C24XX USB 2.0 High-speed USB controller gadget driver + * + * Copyright (c) 2010 Samsung Electronics Co., Ltd. + *		http://www.samsung.com/ + * + * The S3C24XX USB 2.0 high-speed USB controller supports upto 9 endpoints. + * Each endpoint can be configured as either in or out endpoint. Endpoints + * can be configured for Bulk or Interrupt transfer mode. + * + * 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_USB_S3C_HSUDC_H +#define __LINUX_USB_S3C_HSUDC_H + +/** + * s3c24xx_hsudc_platdata - Platform data for USB High-Speed gadget controller. + * @epnum: Number of endpoints to be instantiated by the controller driver. + * @gpio_init: Platform specific USB related GPIO initialization. + * @gpio_uninit: Platform specific USB releted GPIO uninitialzation. + * + * Representation of platform data for the S3C24XX USB 2.0 High Speed gadget + * controllers. + */ +struct s3c24xx_hsudc_platdata { +	unsigned int	epnum; +	void		(*gpio_init)(void); +	void		(*gpio_uninit)(void); +}; + +#endif	/* __LINUX_USB_S3C_HSUDC_H */ diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 2a23f7d1a82..60e9994ef40 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -63,7 +63,7 @@ struct platform_device_info {  		u64 dma_mask;  };  extern struct platform_device *platform_device_register_full( -		struct platform_device_info *pdevinfo); +		const struct platform_device_info *pdevinfo);  /**   * platform_device_register_resndata - add a platform-level device with @@ -196,16 +196,8 @@ static inline void platform_set_drvdata(struct platform_device *pdev, void *data   * calling it replaces module_init() and module_exit()   */  #define module_platform_driver(__platform_driver) \ -static int __init __platform_driver##_init(void) \ -{ \ -	return platform_driver_register(&(__platform_driver)); \ -} \ -module_init(__platform_driver##_init); \ -static void __exit __platform_driver##_exit(void) \ -{ \ -	platform_driver_unregister(&(__platform_driver)); \ -} \ -module_exit(__platform_driver##_exit); +	module_driver(__platform_driver, platform_driver_register, \ +			platform_driver_unregister)  extern struct platform_device *platform_create_bundle(struct platform_driver *driver,  					int (*probe)(struct platform_device *), @@ -264,62 +256,34 @@ static inline char *early_platform_driver_setup_func(void)		\  }  #endif /* MODULE */ -#ifdef CONFIG_PM_SLEEP -extern int platform_pm_prepare(struct device *dev); -extern void platform_pm_complete(struct device *dev); -#else -#define platform_pm_prepare	NULL -#define platform_pm_complete	NULL -#endif -  #ifdef CONFIG_SUSPEND  extern int platform_pm_suspend(struct device *dev); -extern int platform_pm_suspend_noirq(struct device *dev);  extern int platform_pm_resume(struct device *dev); -extern int platform_pm_resume_noirq(struct device *dev);  #else  #define platform_pm_suspend		NULL  #define platform_pm_resume		NULL -#define platform_pm_suspend_noirq	NULL -#define platform_pm_resume_noirq	NULL  #endif  #ifdef CONFIG_HIBERNATE_CALLBACKS  extern int platform_pm_freeze(struct device *dev); -extern int platform_pm_freeze_noirq(struct device *dev);  extern int platform_pm_thaw(struct device *dev); -extern int platform_pm_thaw_noirq(struct device *dev);  extern int platform_pm_poweroff(struct device *dev); -extern int platform_pm_poweroff_noirq(struct device *dev);  extern int platform_pm_restore(struct device *dev); -extern int platform_pm_restore_noirq(struct device *dev);  #else  #define platform_pm_freeze		NULL  #define platform_pm_thaw		NULL  #define platform_pm_poweroff		NULL  #define platform_pm_restore		NULL -#define platform_pm_freeze_noirq	NULL -#define platform_pm_thaw_noirq		NULL -#define platform_pm_poweroff_noirq	NULL -#define platform_pm_restore_noirq	NULL  #endif  #ifdef CONFIG_PM_SLEEP  #define USE_PLATFORM_PM_SLEEP_OPS \ -	.prepare = platform_pm_prepare, \ -	.complete = platform_pm_complete, \  	.suspend = platform_pm_suspend, \  	.resume = platform_pm_resume, \  	.freeze = platform_pm_freeze, \  	.thaw = platform_pm_thaw, \  	.poweroff = platform_pm_poweroff, \ -	.restore = platform_pm_restore, \ -	.suspend_noirq = platform_pm_suspend_noirq, \ -	.resume_noirq = platform_pm_resume_noirq, \ -	.freeze_noirq = platform_pm_freeze_noirq, \ -	.thaw_noirq = platform_pm_thaw_noirq, \ -	.poweroff_noirq = platform_pm_poweroff_noirq, \ -	.restore_noirq = platform_pm_restore_noirq, +	.restore = platform_pm_restore,  #else  #define USE_PLATFORM_PM_SLEEP_OPS  #endif diff --git a/include/linux/pm.h b/include/linux/pm.h index f15acb64681..e4982ac3fbb 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -54,118 +54,145 @@ typedef struct pm_message {  /**   * struct dev_pm_ops - device PM callbacks   * - * Several driver power state transitions are externally visible, affecting + * Several device power state transitions are externally visible, affecting   * the state of pending I/O queues and (for drivers that touch hardware)   * interrupts, wakeups, DMA, and other hardware state.  There may also be - * internal transitions to various low power modes, which are transparent + * internal transitions to various low-power modes which are transparent   * to the rest of the driver stack (such as a driver that's ON gating off   * clocks which are not in active use).   * - * The externally visible transitions are handled with the help of the following - * callbacks included in this structure: + * The externally visible transitions are handled with the help of callbacks + * included in this structure in such a way that two levels of callbacks are + * involved.  First, the PM core executes callbacks provided by PM domains, + * device types, classes and bus types.  They are the subsystem-level callbacks + * supposed to execute callbacks provided by device drivers, although they may + * choose not to do that.  If the driver callbacks are executed, they have to + * collaborate with the subsystem-level callbacks to achieve the goals + * appropriate for the given system transition, given transition phase and the + * subsystem the device belongs to.   * - * @prepare: Prepare the device for the upcoming transition, but do NOT change - *	its hardware state.  Prevent new children of the device from being - *	registered after @prepare() returns (the driver's subsystem and - *	generally the rest of the kernel is supposed to prevent new calls to the - *	probe method from being made too once @prepare() has succeeded).  If - *	@prepare() detects a situation it cannot handle (e.g. registration of a - *	child already in progress), it may return -EAGAIN, so that the PM core - *	can execute it once again (e.g. after the new child has been registered) - *	to recover from the race condition.  This method is executed for all - *	kinds of suspend transitions and is followed by one of the suspend - *	callbacks: @suspend(), @freeze(), or @poweroff(). - *	The PM core executes @prepare() for all devices before starting to - *	execute suspend callbacks for any of them, so drivers may assume all of - *	the other devices to be present and functional while @prepare() is being - *	executed.  In particular, it is safe to make GFP_KERNEL memory - *	allocations from within @prepare().  However, drivers may NOT assume - *	anything about the availability of the user space at that time and it - *	is not correct to request firmware from within @prepare() (it's too - *	late to do that).  [To work around this limitation, drivers may - *	register suspend and hibernation notifiers that are executed before the - *	freezing of tasks.] + * @prepare: The principal role of this callback is to prevent new children of + *	the device from being registered after it has returned (the driver's + *	subsystem and generally the rest of the kernel is supposed to prevent + *	new calls to the probe method from being made too once @prepare() has + *	succeeded).  If @prepare() detects a situation it cannot handle (e.g. + *	registration of a child already in progress), it may return -EAGAIN, so + *	that the PM core can execute it once again (e.g. after a new child has + *	been registered) to recover from the race condition. + *	This method is executed for all kinds of suspend transitions and is + *	followed by one of the suspend callbacks: @suspend(), @freeze(), or + *	@poweroff().  The PM core executes subsystem-level @prepare() for all + *	devices before starting to invoke suspend callbacks for any of them, so + *	generally devices may be assumed to be functional or to respond to + *	runtime resume requests while @prepare() is being executed.  However, + *	device drivers may NOT assume anything about the availability of user + *	space at that time and it is NOT valid to request firmware from within + *	@prepare() (it's too late to do that).  It also is NOT valid to allocate + *	substantial amounts of memory from @prepare() in the GFP_KERNEL mode. + *	[To work around these limitations, drivers may register suspend and + *	hibernation notifiers to be executed before the freezing of tasks.]   *   * @complete: Undo the changes made by @prepare().  This method is executed for   *	all kinds of resume transitions, following one of the resume callbacks:   *	@resume(), @thaw(), @restore().  Also called if the state transition - *	fails before the driver's suspend callback (@suspend(), @freeze(), - *	@poweroff()) can be executed (e.g. if the suspend callback fails for one + *	fails before the driver's suspend callback: @suspend(), @freeze() or + *	@poweroff(), can be executed (e.g. if the suspend callback fails for one   *	of the other devices that the PM core has unsuccessfully attempted to   *	suspend earlier). - *	The PM core executes @complete() after it has executed the appropriate - *	resume callback for all devices. + *	The PM core executes subsystem-level @complete() after it has executed + *	the appropriate resume callbacks for all devices.   *   * @suspend: Executed before putting the system into a sleep state in which the - *	contents of main memory are preserved.  Quiesce the device, put it into - *	a low power state appropriate for the upcoming system state (such as - *	PCI_D3hot), and enable wakeup events as appropriate. + *	contents of main memory are preserved.  The exact action to perform + *	depends on the device's subsystem (PM domain, device type, class or bus + *	type), but generally the device must be quiescent after subsystem-level + *	@suspend() has returned, so that it doesn't do any I/O or DMA. + *	Subsystem-level @suspend() is executed for all devices after invoking + *	subsystem-level @prepare() for all of them.   *   * @resume: Executed after waking the system up from a sleep state in which the - *	contents of main memory were preserved.  Put the device into the - *	appropriate state, according to the information saved in memory by the - *	preceding @suspend().  The driver starts working again, responding to - *	hardware events and software requests.  The hardware may have gone - *	through a power-off reset, or it may have maintained state from the - *	previous suspend() which the driver may rely on while resuming.  On most - *	platforms, there are no restrictions on availability of resources like - *	clocks during @resume(). + *	contents of main memory were preserved.  The exact action to perform + *	depends on the device's subsystem, but generally the driver is expected + *	to start working again, responding to hardware events and software + *	requests (the device itself may be left in a low-power state, waiting + *	for a runtime resume to occur).  The state of the device at the time its + *	driver's @resume() callback is run depends on the platform and subsystem + *	the device belongs to.  On most platforms, there are no restrictions on + *	availability of resources like clocks during @resume(). + *	Subsystem-level @resume() is executed for all devices after invoking + *	subsystem-level @resume_noirq() for all of them.   *   * @freeze: Hibernation-specific, executed before creating a hibernation image. - *	Quiesce operations so that a consistent image can be created, but do NOT - *	otherwise put the device into a low power device state and do NOT emit - *	system wakeup events.  Save in main memory the device settings to be - *	used by @restore() during the subsequent resume from hibernation or by - *	the subsequent @thaw(), if the creation of the image or the restoration - *	of main memory contents from it fails. + *	Analogous to @suspend(), but it should not enable the device to signal + *	wakeup events or change its power state.  The majority of subsystems + *	(with the notable exception of the PCI bus type) expect the driver-level + *	@freeze() to save the device settings in memory to be used by @restore() + *	during the subsequent resume from hibernation. + *	Subsystem-level @freeze() is executed for all devices after invoking + *	subsystem-level @prepare() for all of them.   *   * @thaw: Hibernation-specific, executed after creating a hibernation image OR - *	if the creation of the image fails.  Also executed after a failing + *	if the creation of an image has failed.  Also executed after a failing   *	attempt to restore the contents of main memory from such an image.   *	Undo the changes made by the preceding @freeze(), so the device can be   *	operated in the same way as immediately before the call to @freeze(). + *	Subsystem-level @thaw() is executed for all devices after invoking + *	subsystem-level @thaw_noirq() for all of them.  It also may be executed + *	directly after @freeze() in case of a transition error.   *   * @poweroff: Hibernation-specific, executed after saving a hibernation image. - *	Quiesce the device, put it into a low power state appropriate for the - *	upcoming system state (such as PCI_D3hot), and enable wakeup events as - *	appropriate. + *	Analogous to @suspend(), but it need not save the device's settings in + *	memory. + *	Subsystem-level @poweroff() is executed for all devices after invoking + *	subsystem-level @prepare() for all of them.   *   * @restore: Hibernation-specific, executed after restoring the contents of main - *	memory from a hibernation image.  Driver starts working again, - *	responding to hardware events and software requests.  Drivers may NOT - *	make ANY assumptions about the hardware state right prior to @restore(). - *	On most platforms, there are no restrictions on availability of - *	resources like clocks during @restore(). + *	memory from a hibernation image, analogous to @resume().   * - * @suspend_noirq: Complete the operations of ->suspend() by carrying out any - *	actions required for suspending the device that need interrupts to be - *	disabled + * @suspend_noirq: Complete the actions started by @suspend().  Carry out any + *	additional operations required for suspending the device that might be + *	racing with its driver's interrupt handler, which is guaranteed not to + *	run while @suspend_noirq() is being executed. + *	It generally is expected that the device will be in a low-power state + *	(appropriate for the target system sleep state) after subsystem-level + *	@suspend_noirq() has returned successfully.  If the device can generate + *	system wakeup signals and is enabled to wake up the system, it should be + *	configured to do so at that time.  However, depending on the platform + *	and device's subsystem, @suspend() may be allowed to put the device into + *	the low-power state and configure it to generate wakeup signals, in + *	which case it generally is not necessary to define @suspend_noirq().   * - * @resume_noirq: Prepare for the execution of ->resume() by carrying out any - *	actions required for resuming the device that need interrupts to be - *	disabled + * @resume_noirq: Prepare for the execution of @resume() by carrying out any + *	operations required for resuming the device that might be racing with + *	its driver's interrupt handler, which is guaranteed not to run while + *	@resume_noirq() is being executed.   * - * @freeze_noirq: Complete the operations of ->freeze() by carrying out any - *	actions required for freezing the device that need interrupts to be - *	disabled + * @freeze_noirq: Complete the actions started by @freeze().  Carry out any + *	additional operations required for freezing the device that might be + *	racing with its driver's interrupt handler, which is guaranteed not to + *	run while @freeze_noirq() is being executed. + *	The power state of the device should not be changed by either @freeze() + *	or @freeze_noirq() and it should not be configured to signal system + *	wakeup by any of these callbacks.   * - * @thaw_noirq: Prepare for the execution of ->thaw() by carrying out any - *	actions required for thawing the device that need interrupts to be - *	disabled + * @thaw_noirq: Prepare for the execution of @thaw() by carrying out any + *	operations required for thawing the device that might be racing with its + *	driver's interrupt handler, which is guaranteed not to run while + *	@thaw_noirq() is being executed.   * - * @poweroff_noirq: Complete the operations of ->poweroff() by carrying out any - *	actions required for handling the device that need interrupts to be - *	disabled + * @poweroff_noirq: Complete the actions started by @poweroff().  Analogous to + *	@suspend_noirq(), but it need not save the device's settings in memory.   * - * @restore_noirq: Prepare for the execution of ->restore() by carrying out any - *	actions required for restoring the operations of the device that need - *	interrupts to be disabled + * @restore_noirq: Prepare for the execution of @restore() by carrying out any + *	operations required for thawing the device that might be racing with its + *	driver's interrupt handler, which is guaranteed not to run while + *	@restore_noirq() is being executed.  Analogous to @resume_noirq().   *   * All of the above callbacks, except for @complete(), return error codes.   * However, the error codes returned by the resume operations, @resume(), - * @thaw(), @restore(), @resume_noirq(), @thaw_noirq(), and @restore_noirq() do + * @thaw(), @restore(), @resume_noirq(), @thaw_noirq(), and @restore_noirq(), do   * not cause the PM core to abort the resume transition during which they are - * returned.  The error codes returned in that cases are only printed by the PM + * returned.  The error codes returned in those cases are only printed by the PM   * core to the system logs for debugging purposes.  Still, it is recommended   * that drivers only return error codes from their resume methods in case of an   * unrecoverable failure (i.e. when the device being handled refuses to resume @@ -174,31 +201,43 @@ typedef struct pm_message {   * their children.   *   * It is allowed to unregister devices while the above callbacks are being - * executed.  However, it is not allowed to unregister a device from within any - * of its own callbacks. + * executed.  However, a callback routine must NOT try to unregister the device + * it was called for, although it may unregister children of that device (for + * example, if it detects that a child was unplugged while the system was + * asleep).   * - * There also are the following callbacks related to run-time power management - * of devices: + * Refer to Documentation/power/devices.txt for more information about the role + * of the above callbacks in the system suspend process. + * + * There also are callbacks related to runtime power management of devices. + * Again, these callbacks are executed by the PM core only for subsystems + * (PM domains, device types, classes and bus types) and the subsystem-level + * callbacks are supposed to invoke the driver callbacks.  Moreover, the exact + * actions to be performed by a device driver's callbacks generally depend on + * the platform and subsystem the device belongs to.   *   * @runtime_suspend: Prepare the device for a condition in which it won't be   *	able to communicate with the CPU(s) and RAM due to power management. - *	This need not mean that the device should be put into a low power state. + *	This need not mean that the device should be put into a low-power state.   *	For example, if the device is behind a link which is about to be turned   *	off, the device may remain at full power.  If the device does go to low - *	power and is capable of generating run-time wake-up events, remote - *	wake-up (i.e., a hardware mechanism allowing the device to request a - *	change of its power state via a wake-up event, such as PCI PME) should - *	be enabled for it. + *	power and is capable of generating runtime wakeup events, remote wakeup + *	(i.e., a hardware mechanism allowing the device to request a change of + *	its power state via an interrupt) should be enabled for it.   *   * @runtime_resume: Put the device into the fully active state in response to a - *	wake-up event generated by hardware or at the request of software.  If - *	necessary, put the device into the full power state and restore its + *	wakeup event generated by hardware or at the request of software.  If + *	necessary, put the device into the full-power state and restore its   *	registers, so that it is fully operational.   * - * @runtime_idle: Device appears to be inactive and it might be put into a low - *	power state if all of the necessary conditions are satisfied.  Check + * @runtime_idle: Device appears to be inactive and it might be put into a + *	low-power state if all of the necessary conditions are satisfied.  Check   *	these conditions and handle the device as appropriate, possibly queueing   *	a suspend request for it.  The return value is ignored by the PM core. + * + * Refer to Documentation/power/runtime_pm.txt for more information about the + * role of the above callbacks in device runtime power management. + *   */  struct dev_pm_ops { @@ -261,19 +300,6 @@ const struct dev_pm_ops name = { \  	SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \  } -/* - * Use this for subsystems (bus types, device types, device classes) that don't - * need any special suspend/resume handling in addition to invoking the PM - * callbacks provided by device drivers supporting both the system sleep PM and - * runtime PM, make the pm member point to generic_subsys_pm_ops. - */ -#ifdef CONFIG_PM -extern struct dev_pm_ops generic_subsys_pm_ops; -#define GENERIC_SUBSYS_PM_OPS	(&generic_subsys_pm_ops) -#else -#define GENERIC_SUBSYS_PM_OPS	NULL -#endif -  /**   * PM_EVENT_ messages   * @@ -447,6 +473,7 @@ struct dev_pm_info {  	unsigned int		async_suspend:1;  	bool			is_prepared:1;	/* Owned by the PM core */  	bool			is_suspended:1;	/* Ditto */ +	bool			ignore_children:1;  	spinlock_t		lock;  #ifdef CONFIG_PM_SLEEP  	struct list_head	entry; @@ -464,7 +491,6 @@ struct dev_pm_info {  	atomic_t		usage_count;  	atomic_t		child_count;  	unsigned int		disable_depth:3; -	unsigned int		ignore_children:1;  	unsigned int		idle_notification:1;  	unsigned int		request_pending:1;  	unsigned int		deferred_resume:1; @@ -482,6 +508,8 @@ struct dev_pm_info {  	unsigned long		active_jiffies;  	unsigned long		suspended_jiffies;  	unsigned long		accounting_timestamp; +	ktime_t			suspend_time; +	s64			max_time_suspended_ns;  #endif  	struct pm_subsys_data	*subsys_data;  /* Owned by the subsystem. */  	struct pm_qos_constraints *constraints; diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 65633e5a2bc..a03a0ad998b 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -10,6 +10,7 @@  #define _LINUX_PM_DOMAIN_H  #include <linux/device.h> +#include <linux/err.h>  enum gpd_status {  	GPD_STATE_ACTIVE = 0,	/* PM domain is active */ @@ -21,6 +22,23 @@ enum gpd_status {  struct dev_power_governor {  	bool (*power_down_ok)(struct dev_pm_domain *domain); +	bool (*stop_ok)(struct device *dev); +}; + +struct gpd_dev_ops { +	int (*start)(struct device *dev); +	int (*stop)(struct device *dev); +	int (*save_state)(struct device *dev); +	int (*restore_state)(struct device *dev); +	int (*suspend)(struct device *dev); +	int (*suspend_late)(struct device *dev); +	int (*resume_early)(struct device *dev); +	int (*resume)(struct device *dev); +	int (*freeze)(struct device *dev); +	int (*freeze_late)(struct device *dev); +	int (*thaw_early)(struct device *dev); +	int (*thaw)(struct device *dev); +	bool (*active_wakeup)(struct device *dev);  };  struct generic_pm_domain { @@ -32,6 +50,7 @@ struct generic_pm_domain {  	struct mutex lock;  	struct dev_power_governor *gov;  	struct work_struct power_off_work; +	char *name;  	unsigned int in_progress;	/* Number of devices being suspended now */  	atomic_t sd_count;	/* Number of subdomains with power "on" */  	enum gpd_status status;	/* Current state of the domain */ @@ -44,10 +63,13 @@ struct generic_pm_domain {  	bool suspend_power_off;	/* Power status before system suspend */  	bool dev_irq_safe;	/* Device callbacks are IRQ-safe */  	int (*power_off)(struct generic_pm_domain *domain); +	s64 power_off_latency_ns;  	int (*power_on)(struct generic_pm_domain *domain); -	int (*start_device)(struct device *dev); -	int (*stop_device)(struct device *dev); -	bool (*active_wakeup)(struct device *dev); +	s64 power_on_latency_ns; +	struct gpd_dev_ops dev_ops; +	s64 break_even_ns;	/* Power break even for the entire domain. */ +	s64 max_off_time_ns;	/* Maximum allowed "suspended" time. */ +	ktime_t power_off_time;  };  static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) @@ -62,8 +84,18 @@ struct gpd_link {  	struct list_head slave_node;  }; +struct gpd_timing_data { +	s64 stop_latency_ns; +	s64 start_latency_ns; +	s64 save_state_latency_ns; +	s64 restore_state_latency_ns; +	s64 break_even_ns; +}; +  struct generic_pm_domain_data {  	struct pm_domain_data base; +	struct gpd_dev_ops ops; +	struct gpd_timing_data td;  	bool need_restore;  }; @@ -73,18 +105,54 @@ static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *  }  #ifdef CONFIG_PM_GENERIC_DOMAINS -extern int pm_genpd_add_device(struct generic_pm_domain *genpd, -			       struct device *dev); +static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev) +{ +	return to_gpd_data(dev->power.subsys_data->domain_data); +} + +extern struct dev_power_governor simple_qos_governor; + +extern struct generic_pm_domain *dev_to_genpd(struct device *dev); +extern int __pm_genpd_add_device(struct generic_pm_domain *genpd, +				 struct device *dev, +				 struct gpd_timing_data *td); + +static inline int pm_genpd_add_device(struct generic_pm_domain *genpd, +				      struct device *dev) +{ +	return __pm_genpd_add_device(genpd, dev, NULL); +} +  extern int pm_genpd_remove_device(struct generic_pm_domain *genpd,  				  struct device *dev);  extern int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,  				  struct generic_pm_domain *new_subdomain);  extern int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,  				     struct generic_pm_domain *target); +extern int pm_genpd_add_callbacks(struct device *dev, +				  struct gpd_dev_ops *ops, +				  struct gpd_timing_data *td); +extern int __pm_genpd_remove_callbacks(struct device *dev, bool clear_td);  extern void pm_genpd_init(struct generic_pm_domain *genpd,  			  struct dev_power_governor *gov, bool is_off); +  extern int pm_genpd_poweron(struct generic_pm_domain *genpd); + +extern bool default_stop_ok(struct device *dev); + +extern struct dev_power_governor pm_domain_always_on_gov;  #else + +static inline struct generic_pm_domain *dev_to_genpd(struct device *dev) +{ +	return ERR_PTR(-ENOSYS); +} +static inline int __pm_genpd_add_device(struct generic_pm_domain *genpd, +					struct device *dev, +					struct gpd_timing_data *td) +{ +	return -ENOSYS; +}  static inline int pm_genpd_add_device(struct generic_pm_domain *genpd,  				      struct device *dev)  { @@ -105,14 +173,35 @@ static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,  {  	return -ENOSYS;  } -static inline void pm_genpd_init(struct generic_pm_domain *genpd, -				 struct dev_power_governor *gov, bool is_off) {} +static inline int pm_genpd_add_callbacks(struct device *dev, +					 struct gpd_dev_ops *ops, +					 struct gpd_timing_data *td) +{ +	return -ENOSYS; +} +static inline int __pm_genpd_remove_callbacks(struct device *dev, bool clear_td) +{ +	return -ENOSYS; +} +static inline void pm_genpd_init(struct generic_pm_domain *genpd, bool is_off) +{ +}  static inline int pm_genpd_poweron(struct generic_pm_domain *genpd)  {  	return -ENOSYS;  } +static inline bool default_stop_ok(struct device *dev) +{ +	return false; +} +#define pm_domain_always_on_gov NULL  #endif +static inline int pm_genpd_remove_callbacks(struct device *dev) +{ +	return __pm_genpd_remove_callbacks(dev, true); +} +  #ifdef CONFIG_PM_GENERIC_DOMAINS_RUNTIME  extern void genpd_queue_power_off_work(struct generic_pm_domain *genpd);  extern void pm_genpd_poweroff_unused(void); diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index 83b0ea302a8..4d99e4e6ef8 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h @@ -78,6 +78,7 @@ int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);  int pm_qos_request_active(struct pm_qos_request *req);  s32 pm_qos_read_value(struct pm_qos_constraints *c); +s32 __dev_pm_qos_read_value(struct device *dev);  s32 dev_pm_qos_read_value(struct device *dev);  int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,  			   s32 value); @@ -91,6 +92,8 @@ int dev_pm_qos_add_global_notifier(struct notifier_block *notifier);  int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier);  void dev_pm_qos_constraints_init(struct device *dev);  void dev_pm_qos_constraints_destroy(struct device *dev); +int dev_pm_qos_add_ancestor_request(struct device *dev, +				    struct dev_pm_qos_request *req, s32 value);  #else  static inline int pm_qos_update_target(struct pm_qos_constraints *c,  				       struct plist_node *node, @@ -107,7 +110,19 @@ static inline void pm_qos_remove_request(struct pm_qos_request *req)  			{ return; }  static inline int pm_qos_request(int pm_qos_class) -			{ return 0; } +{ +	switch (pm_qos_class) { +	case PM_QOS_CPU_DMA_LATENCY: +		return PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; +	case PM_QOS_NETWORK_LATENCY: +		return PM_QOS_NETWORK_LAT_DEFAULT_VALUE; +	case PM_QOS_NETWORK_THROUGHPUT: +		return PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE; +	default: +		return PM_QOS_DEFAULT_VALUE; +	} +} +  static inline int pm_qos_add_notifier(int pm_qos_class,  				      struct notifier_block *notifier)  			{ return 0; } @@ -119,6 +134,8 @@ static inline int pm_qos_request_active(struct pm_qos_request *req)  static inline s32 pm_qos_read_value(struct pm_qos_constraints *c)  			{ return 0; } +static inline s32 __dev_pm_qos_read_value(struct device *dev) +			{ return 0; }  static inline s32 dev_pm_qos_read_value(struct device *dev)  			{ return 0; }  static inline int dev_pm_qos_add_request(struct device *dev, @@ -150,6 +167,9 @@ static inline void dev_pm_qos_constraints_destroy(struct device *dev)  {  	dev->power.power_state = PMSG_INVALID;  } +static inline int dev_pm_qos_add_ancestor_request(struct device *dev, +				    struct dev_pm_qos_request *req, s32 value) +			{ return 0; }  #endif  #endif diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index d8d90361964..609daae7a01 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -45,6 +45,8 @@ extern void pm_runtime_irq_safe(struct device *dev);  extern void __pm_runtime_use_autosuspend(struct device *dev, bool use);  extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);  extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); +extern void pm_runtime_update_max_time_suspended(struct device *dev, +						 s64 delta_ns);  static inline bool pm_children_suspended(struct device *dev)  { @@ -52,11 +54,6 @@ static inline bool pm_children_suspended(struct device *dev)  		|| !atomic_read(&dev->power.child_count);  } -static inline void pm_suspend_ignore_children(struct device *dev, bool enable) -{ -	dev->power.ignore_children = enable; -} -  static inline void pm_runtime_get_noresume(struct device *dev)  {  	atomic_inc(&dev->power.usage_count); @@ -130,7 +127,6 @@ static inline void pm_runtime_allow(struct device *dev) {}  static inline void pm_runtime_forbid(struct device *dev) {}  static inline bool pm_children_suspended(struct device *dev) { return false; } -static inline void pm_suspend_ignore_children(struct device *dev, bool en) {}  static inline void pm_runtime_get_noresume(struct device *dev) {}  static inline void pm_runtime_put_noidle(struct device *dev) {}  static inline bool device_run_wake(struct device *dev) { return false; } @@ -154,6 +150,9 @@ static inline void pm_runtime_set_autosuspend_delay(struct device *dev,  static inline unsigned long pm_runtime_autosuspend_expiration(  				struct device *dev) { return 0; } +static inline void pm_runtime_update_max_time_suspended(struct device *dev, +							s64 delta_ns) {} +  #endif /* !CONFIG_PM_RUNTIME */  static inline int pm_runtime_idle(struct device *dev) diff --git a/include/linux/pmu.h b/include/linux/pmu.h index cafe98d9694..84e6a55a120 100644 --- a/include/linux/pmu.h +++ b/include/linux/pmu.h @@ -6,6 +6,8 @@   * Copyright (C) 1998 Paul Mackerras.   */ +#ifndef _LINUX_PMU_H +#define _LINUX_PMU_H  #define PMU_DRIVER_VERSION	2 @@ -207,3 +209,5 @@ extern int pmu_sys_suspended;  #endif  #endif	/* __KERNEL__ */ + +#endif /* _LINUX_PMU_H */ diff --git a/include/linux/poison.h b/include/linux/poison.h index 79159de0e34..2110a81c5e2 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h @@ -40,12 +40,6 @@  #define	RED_INACTIVE	0x09F911029D74E35BULL	/* when obj is inactive */  #define	RED_ACTIVE	0xD84156C5635688C0ULL	/* when obj is active */ -#ifdef CONFIG_PHYS_ADDR_T_64BIT -#define MEMBLOCK_INACTIVE	0x3a84fb0144c9e71bULL -#else -#define MEMBLOCK_INACTIVE	0x44c9e71bUL -#endif -  #define SLUB_RED_INACTIVE	0xbb  #define SLUB_RED_ACTIVE		0xcc diff --git a/include/linux/power/charger-manager.h b/include/linux/power/charger-manager.h new file mode 100644 index 00000000000..4f75e531c11 --- /dev/null +++ b/include/linux/power/charger-manager.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2011 Samsung Electronics Co., Ltd. + * MyungJoo.Ham <myungjoo.ham@samsung.com> + * + * Charger Manager. + * This framework enables to control and multiple chargers and to + * monitor charging even in the context of suspend-to-RAM with + * an interface combining the chargers. + * + * 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 _CHARGER_MANAGER_H +#define _CHARGER_MANAGER_H + +#include <linux/power_supply.h> + +enum data_source { +	CM_FUEL_GAUGE, +	CM_CHARGER_STAT, +}; + +enum polling_modes { +	CM_POLL_DISABLE = 0, +	CM_POLL_ALWAYS, +	CM_POLL_EXTERNAL_POWER_ONLY, +	CM_POLL_CHARGING_ONLY, +}; + +/** + * struct charger_global_desc + * @rtc_name: the name of RTC used to wake up the system from suspend. + * @rtc_only_wakeup: + *	If the system is woken up by waekup-sources other than the RTC or + *	callbacks, Charger Manager should recognize with + *	rtc_only_wakeup() returning false. + *	If the RTC given to CM is the only wakeup reason, + *	rtc_only_wakeup should return true. + */ +struct charger_global_desc { +	char *rtc_name; + +	bool (*rtc_only_wakeup)(void); +}; + +/** + * struct charger_desc + * @psy_name: the name of power-supply-class for charger manager + * @polling_mode: + *	Determine which polling mode will be used + * @fullbatt_uV: voltage in microvolt + *	If it is not being charged and VBATT >= fullbatt_uV, + *	it is assumed to be full. + * @polling_interval_ms: interval in millisecond at which + *	charger manager will monitor battery health + * @battery_present: + *	Specify where information for existance of battery can be obtained + * @psy_charger_stat: the names of power-supply for chargers + * @num_charger_regulator: the number of entries in charger_regulators + * @charger_regulators: array of regulator_bulk_data for chargers + * @psy_fuel_gauge: the name of power-supply for fuel gauge + * @temperature_out_of_range: + *	Determine whether the status is overheat or cold or normal. + *	return_value > 0: overheat + *	return_value == 0: normal + *	return_value < 0: cold + * @measure_battery_temp: + *	true: measure battery temperature + *	false: measure ambient temperature + */ +struct charger_desc { +	char *psy_name; + +	enum polling_modes polling_mode; +	unsigned int polling_interval_ms; + +	unsigned int fullbatt_uV; + +	enum data_source battery_present; + +	char **psy_charger_stat; + +	int num_charger_regulators; +	struct regulator_bulk_data *charger_regulators; + +	char *psy_fuel_gauge; + +	int (*temperature_out_of_range)(int *mC); +	bool measure_battery_temp; +}; + +#define PSY_NAME_MAX	30 + +/** + * struct charger_manager + * @entry: entry for list + * @dev: device pointer + * @desc: instance of charger_desc + * @fuel_gauge: power_supply for fuel gauge + * @charger_stat: array of power_supply for chargers + * @charger_enabled: the state of charger + * @emergency_stop: + *	When setting true, stop charging + * @last_temp_mC: the measured temperature in milli-Celsius + * @psy_name_buf: the name of power-supply-class for charger manager + * @charger_psy: power_supply for charger manager + * @status_save_ext_pwr_inserted: + *	saved status of external power before entering suspend-to-RAM + * @status_save_batt: + *	saved status of battery before entering suspend-to-RAM + */ +struct charger_manager { +	struct list_head entry; +	struct device *dev; +	struct charger_desc *desc; + +	struct power_supply *fuel_gauge; +	struct power_supply **charger_stat; + +	bool charger_enabled; + +	int emergency_stop; +	int last_temp_mC; + +	char psy_name_buf[PSY_NAME_MAX + 1]; +	struct power_supply charger_psy; + +	bool status_save_ext_pwr_inserted; +	bool status_save_batt; +}; + +#ifdef CONFIG_CHARGER_MANAGER +extern int setup_charger_manager(struct charger_global_desc *gd); +extern bool cm_suspend_again(void); +#else +static void __maybe_unused setup_charger_manager(struct charger_global_desc *gd) +{ } + +static bool __maybe_unused cm_suspend_again(void) +{ +	return false; +} +#endif + +#endif /* _CHARGER_MANAGER_H */ diff --git a/include/linux/power/bq20z75.h b/include/linux/power/sbs-battery.h index 1398eb004e8..2b0a9d9ff57 100644 --- a/include/linux/power/bq20z75.h +++ b/include/linux/power/sbs-battery.h @@ -1,5 +1,5 @@  /* - * Gas Gauge driver for TI's BQ20Z75 + * Gas Gauge driver for SBS Compliant Gas Gauges   *   * Copyright (c) 2010, NVIDIA Corporation.   * @@ -18,21 +18,21 @@   * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.   */ -#ifndef __LINUX_POWER_BQ20Z75_H_ -#define __LINUX_POWER_BQ20Z75_H_ +#ifndef __LINUX_POWER_SBS_BATTERY_H_ +#define __LINUX_POWER_SBS_BATTERY_H_  #include <linux/power_supply.h>  #include <linux/types.h>  /** - * struct bq20z75_platform_data - platform data for bq20z75 devices + * struct sbs_platform_data - platform data for sbs devices   * @battery_detect:		GPIO which is used to detect battery presence   * @battery_detect_present:	gpio state when battery is present (0 / 1)   * @i2c_retry_count:		# of times to retry on i2c IO failure   * @poll_retry_count:		# of times to retry looking for new status after   *				external change notification   */ -struct bq20z75_platform_data { +struct sbs_platform_data {  	int battery_detect;  	int battery_detect_present;  	int i2c_retry_count; diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 204c18dfdc9..fa9b962aec1 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -74,6 +74,12 @@ enum {  	POWER_SUPPLY_CAPACITY_LEVEL_FULL,  }; +enum { +	POWER_SUPPLY_SCOPE_UNKNOWN = 0, +	POWER_SUPPLY_SCOPE_SYSTEM, +	POWER_SUPPLY_SCOPE_DEVICE, +}; +  enum power_supply_property {  	/* Properties of type `int' */  	POWER_SUPPLY_PROP_STATUS = 0, @@ -116,6 +122,7 @@ enum power_supply_property {  	POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,  	POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,  	POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */ +	POWER_SUPPLY_PROP_SCOPE,  	/* Properties of type `const char *' */  	POWER_SUPPLY_PROP_MODEL_NAME,  	POWER_SUPPLY_PROP_MANUFACTURER, @@ -123,7 +130,8 @@ enum power_supply_property {  };  enum power_supply_type { -	POWER_SUPPLY_TYPE_BATTERY = 0, +	POWER_SUPPLY_TYPE_UNKNOWN = 0, +	POWER_SUPPLY_TYPE_BATTERY,  	POWER_SUPPLY_TYPE_UPS,  	POWER_SUPPLY_TYPE_MAINS,  	POWER_SUPPLY_TYPE_USB,		/* Standard Downstream Port */ @@ -211,6 +219,7 @@ static inline int power_supply_is_system_supplied(void) { return -ENOSYS; }  extern int power_supply_register(struct device *parent,  				 struct power_supply *psy);  extern void power_supply_unregister(struct power_supply *psy); +extern int power_supply_powers(struct power_supply *psy, struct device *dev);  /* For APM emulation, think legacy userspace. */  extern struct class *power_supply_class; diff --git a/include/linux/prctl.h b/include/linux/prctl.h index a3baeb2c216..7ddc7f1b480 100644 --- a/include/linux/prctl.h +++ b/include/linux/prctl.h @@ -102,4 +102,16 @@  #define PR_MCE_KILL_GET 34 +/* + * Tune up process memory map specifics. + */ +#define PR_SET_MM		35 +# define PR_SET_MM_START_CODE		1 +# define PR_SET_MM_END_CODE		2 +# define PR_SET_MM_START_DATA		3 +# define PR_SET_MM_END_DATA		4 +# define PR_SET_MM_START_STACK		5 +# define PR_SET_MM_START_BRK		6 +# define PR_SET_MM_BRK			7 +  #endif /* _LINUX_PRCTL_H */ diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 643b96c7a94..85c50730623 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -50,7 +50,7 @@ typedef	int (write_proc_t)(struct file *file, const char __user *buffer,  struct proc_dir_entry {  	unsigned int low_ino; -	mode_t mode; +	umode_t mode;  	nlink_t nlink;  	uid_t uid;  	gid_t gid; @@ -106,9 +106,9 @@ 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, mode_t mode, +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, mode_t mode, +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); @@ -146,17 +146,17 @@ extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,  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, mode_t mode, +extern struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,  			struct proc_dir_entry *parent); -static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode, +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, -	mode_t mode, struct proc_dir_entry *base,  +	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); @@ -168,7 +168,7 @@ static inline struct proc_dir_entry *create_proc_read_entry(const char *name,  }  extern struct proc_dir_entry *proc_net_fops_create(struct net *net, -	const char *name, mode_t mode, const struct file_operations *fops); +	const char *name, umode_t mode, const struct file_operations *fops);  extern void proc_net_remove(struct net *net, const char *name);  extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,  	struct proc_dir_entry *parent); @@ -185,15 +185,15 @@ static inline void proc_flush_task(struct task_struct *task)  }  static inline struct proc_dir_entry *create_proc_entry(const char *name, -	mode_t mode, struct proc_dir_entry *parent) { return NULL; } +	umode_t mode, struct proc_dir_entry *parent) { return NULL; }  static inline struct proc_dir_entry *proc_create(const char *name, -	mode_t mode, struct proc_dir_entry *parent, +	umode_t mode, struct proc_dir_entry *parent,  	const struct file_operations *proc_fops)  {  	return NULL;  }  static inline struct proc_dir_entry *proc_create_data(const char *name, -	mode_t mode, struct proc_dir_entry *parent, +	umode_t mode, struct proc_dir_entry *parent,  	const struct file_operations *proc_fops, void *data)  {  	return NULL; @@ -205,10 +205,10 @@ static inline struct proc_dir_entry *proc_symlink(const char *name,  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_mode(const char *name, -	mode_t mode, struct proc_dir_entry *parent) { return NULL; } +	umode_t mode, struct proc_dir_entry *parent) { return NULL; }  static inline struct proc_dir_entry *create_proc_read_entry(const char *name, -	mode_t mode, struct proc_dir_entry *base,  +	umode_t mode, struct proc_dir_entry *base,   	read_proc_t *read_proc, void * data) { return NULL; }  struct tty_driver; @@ -253,7 +253,7 @@ extern const struct proc_ns_operations utsns_operations;  extern const struct proc_ns_operations ipcns_operations;  union proc_op { -	int (*proc_get_link)(struct inode *, struct path *); +	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, diff --git a/include/linux/proportions.h b/include/linux/proportions.h index ef35bb73f69..26a8a4ed9b0 100644 --- a/include/linux/proportions.h +++ b/include/linux/proportions.h @@ -81,7 +81,11 @@ void prop_inc_percpu(struct prop_descriptor *pd, struct prop_local_percpu *pl)   * Limit the time part in order to ensure there are some bits left for the   * cycle counter and fraction multiply.   */ +#if BITS_PER_LONG == 32  #define PROP_MAX_SHIFT (3*BITS_PER_LONG/4) +#else +#define PROP_MAX_SHIFT (BITS_PER_LONG/2) +#endif  #define PROP_FRAC_SHIFT		(BITS_PER_LONG - PROP_MAX_SHIFT - 1)  #define PROP_FRAC_BASE		(1UL << PROP_FRAC_SHIFT) diff --git a/include/linux/pstore.h b/include/linux/pstore.h index ea567321ae3..e1461e143be 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h @@ -22,6 +22,9 @@  #ifndef _LINUX_PSTORE_H  #define _LINUX_PSTORE_H +#include <linux/time.h> +#include <linux/kmsg_dump.h> +  /* types */  enum pstore_type_id {  	PSTORE_TYPE_DMESG	= 0, @@ -35,11 +38,14 @@ struct pstore_info {  	spinlock_t	buf_lock;	/* serialize access to 'buf' */  	char		*buf;  	size_t		bufsize; +	struct mutex	read_mutex;	/* serialize open/read/close */  	int		(*open)(struct pstore_info *psi);  	int		(*close)(struct pstore_info *psi);  	ssize_t		(*read)(u64 *id, enum pstore_type_id *type, -			struct timespec *time, struct pstore_info *psi); -	int		(*write)(enum pstore_type_id type, u64 *id, +			struct timespec *time, char **buf, +			struct pstore_info *psi); +	int		(*write)(enum pstore_type_id type, +			enum kmsg_dump_reason reason, u64 *id,  			unsigned int part, size_t size, struct pstore_info *psi);  	int		(*erase)(enum pstore_type_id type, u64 id,  			struct pstore_info *psi); @@ -48,18 +54,12 @@ struct pstore_info {  #ifdef CONFIG_PSTORE  extern int pstore_register(struct pstore_info *); -extern int pstore_write(enum pstore_type_id type, char *buf, size_t size);  #else  static inline int  pstore_register(struct pstore_info *psi)  {  	return -ENODEV;  } -static inline int -pstore_write(enum pstore_type_id type, char *buf, size_t size) -{ -	return -ENODEV; -}  #endif  #endif /*_LINUX_PSTORE_H*/ diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 800f113bea6..c2f1f6a5fcb 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -112,6 +112,7 @@  #include <linux/compiler.h>		/* For unlikely.  */  #include <linux/sched.h>		/* For struct task_struct.  */ +#include <linux/err.h>			/* for IS_ERR_VALUE */  extern long arch_ptrace(struct task_struct *child, long request, @@ -127,8 +128,9 @@ extern void __ptrace_link(struct task_struct *child,  			  struct task_struct *new_parent);  extern void __ptrace_unlink(struct task_struct *child);  extern void exit_ptrace(struct task_struct *tracer); -#define PTRACE_MODE_READ   1 -#define PTRACE_MODE_ATTACH 2 +#define PTRACE_MODE_READ	0x01 +#define PTRACE_MODE_ATTACH	0x02 +#define PTRACE_MODE_NOAUDIT	0x04  /* Returns 0 on success, -errno on denial. */  extern int __ptrace_may_access(struct task_struct *task, unsigned int mode);  /* Returns true on success, false on denial. */ @@ -265,6 +267,15 @@ static inline void ptrace_release_task(struct task_struct *task)  #define force_successful_syscall_return() do { } while (0)  #endif +#ifndef is_syscall_success +/* + * On most systems we can tell if a syscall is a success based on if the retval + * is an error value.  On some systems like ia64 and powerpc they have different + * indicators of success/failure and must define their own. + */ +#define is_syscall_success(regs) (!IS_ERR_VALUE((unsigned long)(regs_return_value(regs)))) +#endif +  /*   * <asm/ptrace.h> should define the following things inside #ifdef __KERNEL__.   * diff --git a/include/linux/quota.h b/include/linux/quota.h index cb785569903..c09fa042b5e 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -230,7 +230,11 @@ struct mem_dqinfo {  struct super_block;  #define DQF_MASK 0xffff		/* Mask for format specific flags */ -#define DQF_INFO_DIRTY_B 16 +#define DQF_GETINFO_MASK 0x1ffff	/* Mask for flags passed to userspace */ +#define DQF_SETINFO_MASK 0xffff		/* Mask for flags modifiable from userspace */ +#define DQF_SYS_FILE_B		16 +#define DQF_SYS_FILE (1 << DQF_SYS_FILE_B)	/* Quota file stored as system file */ +#define DQF_INFO_DIRTY_B	31  #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B)	/* Is info dirty? */  extern void mark_info_dirty(struct super_block *sb, int type); diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index 9d4539c52e5..07e360b1b28 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h @@ -49,9 +49,6 @@  #define RADIX_TREE_EXCEPTIONAL_ENTRY	2  #define RADIX_TREE_EXCEPTIONAL_SHIFT	2 -#define radix_tree_indirect_to_ptr(ptr) \ -	radix_tree_indirect_to_ptr((void __force *)(ptr)) -  static inline int radix_tree_is_indirect_ptr(void *ptr)  {  	return (int)((unsigned long)ptr & RADIX_TREE_INDIRECT_PTR); diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h index 9e65d9e2066..6f6df86f1ae 100644 --- a/include/linux/raid/md_p.h +++ b/include/linux/raid/md_p.h @@ -277,7 +277,10 @@ struct mdp_superblock_1 {  					   */  #define	MD_FEATURE_RESHAPE_ACTIVE	4  #define	MD_FEATURE_BAD_BLOCKS		8 /* badblock list is not empty */ - -#define	MD_FEATURE_ALL			(1|2|4|8) +#define	MD_FEATURE_REPLACEMENT		16 /* This device is replacing an +					    * active device with same 'role'. +					    * 'recovery_offset' is also set. +					    */ +#define	MD_FEATURE_ALL			(1|2|4|8|16)  #endif  diff --git a/include/linux/raid/pq.h b/include/linux/raid/pq.h index 2b59cc82439..53272e9860a 100644 --- a/include/linux/raid/pq.h +++ b/include/linux/raid/pq.h @@ -132,7 +132,7 @@ void raid6_dual_recov(int disks, size_t bytes, int faila, int failb,  						     PROT_READ|PROT_WRITE,   \  						     MAP_PRIVATE|MAP_ANONYMOUS,\  						     0, 0)) -# define free_pages(x, y)	munmap((void *)(x), (y)*PAGE_SIZE) +# define free_pages(x, y)	munmap((void *)(x), PAGE_SIZE << (y))  static inline void cpu_relax(void)  { diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index 3a8f0c9b293..5bf5500db83 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h @@ -2,7 +2,7 @@  #define _LINUX_RAMFS_H  struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir, -	 int mode, dev_t dev); +	 umode_t mode, dev_t dev);  extern struct dentry *ramfs_mount(struct file_system_type *fs_type,  	 int flags, const char *dev_name, void *data); diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 2cf4226ade7..81c04f4348e 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -51,6 +51,8 @@ extern int rcutorture_runnable; /* for sysctl */  #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)  extern void rcutorture_record_test_transition(void);  extern void rcutorture_record_progress(unsigned long vernum); +extern void do_trace_rcu_torture_read(char *rcutorturename, +				      struct rcu_head *rhp);  #else  static inline void rcutorture_record_test_transition(void)  { @@ -58,6 +60,12 @@ static inline void rcutorture_record_test_transition(void)  static inline void rcutorture_record_progress(unsigned long vernum)  {  } +#ifdef CONFIG_RCU_TRACE +extern void do_trace_rcu_torture_read(char *rcutorturename, +				      struct rcu_head *rhp); +#else +#define do_trace_rcu_torture_read(rcutorturename, rhp) do { } while (0) +#endif  #endif  #define UINT_CMP_GE(a, b)	(UINT_MAX / 2 >= (a) - (b)) @@ -177,23 +185,10 @@ extern void rcu_sched_qs(int cpu);  extern void rcu_bh_qs(int cpu);  extern void rcu_check_callbacks(int cpu, int user);  struct notifier_block; - -#ifdef CONFIG_NO_HZ - -extern void rcu_enter_nohz(void); -extern void rcu_exit_nohz(void); - -#else /* #ifdef CONFIG_NO_HZ */ - -static inline void rcu_enter_nohz(void) -{ -} - -static inline void rcu_exit_nohz(void) -{ -} - -#endif /* #else #ifdef CONFIG_NO_HZ */ +extern void rcu_idle_enter(void); +extern void rcu_idle_exit(void); +extern void rcu_irq_enter(void); +extern void rcu_irq_exit(void);  /*   * Infrastructure to implement the synchronize_() primitives in @@ -233,22 +228,30 @@ static inline void destroy_rcu_head_on_stack(struct rcu_head *head)  #ifdef CONFIG_DEBUG_LOCK_ALLOC -extern struct lockdep_map rcu_lock_map; -# define rcu_read_acquire() \ -		lock_acquire(&rcu_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) -# define rcu_read_release()	lock_release(&rcu_lock_map, 1, _THIS_IP_) +#ifdef CONFIG_PROVE_RCU +extern int rcu_is_cpu_idle(void); +#else /* !CONFIG_PROVE_RCU */ +static inline int rcu_is_cpu_idle(void) +{ +	return 0; +} +#endif /* else !CONFIG_PROVE_RCU */ -extern struct lockdep_map rcu_bh_lock_map; -# define rcu_read_acquire_bh() \ -		lock_acquire(&rcu_bh_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) -# define rcu_read_release_bh()	lock_release(&rcu_bh_lock_map, 1, _THIS_IP_) +static inline void rcu_lock_acquire(struct lockdep_map *map) +{ +	WARN_ON_ONCE(rcu_is_cpu_idle()); +	lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_); +} -extern struct lockdep_map rcu_sched_lock_map; -# define rcu_read_acquire_sched() \ -		lock_acquire(&rcu_sched_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) -# define rcu_read_release_sched() \ -		lock_release(&rcu_sched_lock_map, 1, _THIS_IP_) +static inline void rcu_lock_release(struct lockdep_map *map) +{ +	WARN_ON_ONCE(rcu_is_cpu_idle()); +	lock_release(map, 1, _THIS_IP_); +} +extern struct lockdep_map rcu_lock_map; +extern struct lockdep_map rcu_bh_lock_map; +extern struct lockdep_map rcu_sched_lock_map;  extern int debug_lockdep_rcu_enabled(void);  /** @@ -262,11 +265,18 @@ extern int debug_lockdep_rcu_enabled(void);   *   * Checks debug_lockdep_rcu_enabled() to prevent false positives during boot   * and while lockdep is disabled. + * + * Note that rcu_read_lock() and the matching rcu_read_unlock() must + * occur in the same context, for example, it is illegal to invoke + * rcu_read_unlock() in process context if the matching rcu_read_lock() + * was invoked from within an irq handler.   */  static inline int rcu_read_lock_held(void)  {  	if (!debug_lockdep_rcu_enabled())  		return 1; +	if (rcu_is_cpu_idle()) +		return 0;  	return lock_is_held(&rcu_lock_map);  } @@ -290,6 +300,19 @@ extern int rcu_read_lock_bh_held(void);   *   * Check debug_lockdep_rcu_enabled() to prevent false positives during boot   * and while lockdep is disabled. + * + * Note that if the CPU is in the idle loop from an RCU point of + * view (ie: that we are in the section between rcu_idle_enter() and + * rcu_idle_exit()) then rcu_read_lock_held() returns false even if the CPU + * did an rcu_read_lock().  The reason for this is that RCU ignores CPUs + * that are in such a section, considering these as in extended quiescent + * state, so such a CPU is effectively never in an RCU read-side critical + * section regardless of what RCU primitives it invokes.  This state of + * affairs is required --- we need to keep an RCU-free window in idle + * where the CPU may possibly enter into low power mode. This way we can + * notice an extended quiescent state to other CPUs that started a grace + * period. Otherwise we would delay any grace period as long as we run in + * the idle task.   */  #ifdef CONFIG_PREEMPT_COUNT  static inline int rcu_read_lock_sched_held(void) @@ -298,6 +321,8 @@ static inline int rcu_read_lock_sched_held(void)  	if (!debug_lockdep_rcu_enabled())  		return 1; +	if (rcu_is_cpu_idle()) +		return 0;  	if (debug_locks)  		lockdep_opinion = lock_is_held(&rcu_sched_lock_map);  	return lockdep_opinion || preempt_count() != 0 || irqs_disabled(); @@ -311,12 +336,8 @@ static inline int rcu_read_lock_sched_held(void)  #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ -# define rcu_read_acquire()		do { } while (0) -# define rcu_read_release()		do { } while (0) -# define rcu_read_acquire_bh()		do { } while (0) -# define rcu_read_release_bh()		do { } while (0) -# define rcu_read_acquire_sched()	do { } while (0) -# define rcu_read_release_sched()	do { } while (0) +# define rcu_lock_acquire(a)		do { } while (0) +# define rcu_lock_release(a)		do { } while (0)  static inline int rcu_read_lock_held(void)  { @@ -637,7 +658,7 @@ static inline void rcu_read_lock(void)  {  	__rcu_read_lock();  	__acquire(RCU); -	rcu_read_acquire(); +	rcu_lock_acquire(&rcu_lock_map);  }  /* @@ -657,7 +678,7 @@ static inline void rcu_read_lock(void)   */  static inline void rcu_read_unlock(void)  { -	rcu_read_release(); +	rcu_lock_release(&rcu_lock_map);  	__release(RCU);  	__rcu_read_unlock();  } @@ -673,12 +694,17 @@ static inline void rcu_read_unlock(void)   * critical sections in interrupt context can use just rcu_read_lock(),   * though this should at least be commented to avoid confusing people   * reading the code. + * + * Note that rcu_read_lock_bh() and the matching rcu_read_unlock_bh() + * must occur in the same context, for example, it is illegal to invoke + * rcu_read_unlock_bh() from one task if the matching rcu_read_lock_bh() + * was invoked from some other task.   */  static inline void rcu_read_lock_bh(void)  {  	local_bh_disable();  	__acquire(RCU_BH); -	rcu_read_acquire_bh(); +	rcu_lock_acquire(&rcu_bh_lock_map);  }  /* @@ -688,7 +714,7 @@ static inline void rcu_read_lock_bh(void)   */  static inline void rcu_read_unlock_bh(void)  { -	rcu_read_release_bh(); +	rcu_lock_release(&rcu_bh_lock_map);  	__release(RCU_BH);  	local_bh_enable();  } @@ -700,12 +726,17 @@ static inline void rcu_read_unlock_bh(void)   * are being done using call_rcu_sched() or synchronize_rcu_sched().   * Read-side critical sections can also be introduced by anything that   * disables preemption, including local_irq_disable() and friends. + * + * Note that rcu_read_lock_sched() and the matching rcu_read_unlock_sched() + * must occur in the same context, for example, it is illegal to invoke + * rcu_read_unlock_sched() from process context if the matching + * rcu_read_lock_sched() was invoked from an NMI handler.   */  static inline void rcu_read_lock_sched(void)  {  	preempt_disable();  	__acquire(RCU_SCHED); -	rcu_read_acquire_sched(); +	rcu_lock_acquire(&rcu_sched_lock_map);  }  /* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */ @@ -722,7 +753,7 @@ static inline notrace void rcu_read_lock_sched_notrace(void)   */  static inline void rcu_read_unlock_sched(void)  { -	rcu_read_release_sched(); +	rcu_lock_release(&rcu_sched_lock_map);  	__release(RCU_SCHED);  	preempt_enable();  } diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 690276a642c..eb93921cdd3 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -23,9 +23,8 @@ struct spi_device;  /* An enum of all the supported cache types */  enum regcache_type {  	REGCACHE_NONE, -	REGCACHE_INDEXED,  	REGCACHE_RBTREE, -	REGCACHE_LZO +	REGCACHE_COMPRESSED  };  /** @@ -83,7 +82,7 @@ struct regmap_config {  	bool (*precious_reg)(struct device *dev, unsigned int reg);  	unsigned int max_register; -	struct reg_default *reg_defaults; +	const struct reg_default *reg_defaults;  	unsigned int num_reg_defaults;  	enum regcache_type cache_type;  	const void *reg_defaults_raw; @@ -129,6 +128,8 @@ struct regmap *regmap_init_spi(struct spi_device *dev,  			       const struct regmap_config *config);  void regmap_exit(struct regmap *map); +int regmap_reinit_cache(struct regmap *map, +			const struct regmap_config *config);  int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);  int regmap_raw_write(struct regmap *map, unsigned int reg,  		     const void *val, size_t val_len); @@ -139,9 +140,61 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,  		     size_t val_count);  int regmap_update_bits(struct regmap *map, unsigned int reg,  		       unsigned int mask, unsigned int val); +int regmap_update_bits_check(struct regmap *map, unsigned int reg, +			     unsigned int mask, unsigned int val, +			     bool *change);  int regcache_sync(struct regmap *map);  void regcache_cache_only(struct regmap *map, bool enable);  void regcache_cache_bypass(struct regmap *map, bool enable); +void regcache_mark_dirty(struct regmap *map); + +/** + * Description of an IRQ for the generic regmap irq_chip. + * + * @reg_offset: Offset of the status/mask register within the bank + * @mask:       Mask used to flag/control the register. + */ +struct regmap_irq { +	unsigned int reg_offset; +	unsigned int mask; +}; + +/** + * Description of a generic regmap irq_chip.  This is not intended to + * handle every possible interrupt controller, but it should handle a + * substantial proportion of those that are found in the wild. + * + * @name:        Descriptive name for IRQ controller. + * + * @status_base: Base status register address. + * @mask_base:   Base mask register address. + * @ack_base:    Base ack address.  If zero then the chip is clear on read. + * + * @num_regs:    Number of registers in each control bank. + * @irqs:        Descriptors for individual IRQs.  Interrupt numbers are + *               assigned based on the index in the array of the interrupt. + * @num_irqs:    Number of descriptors. + */ +struct regmap_irq_chip { +	const char *name; + +	unsigned int status_base; +	unsigned int mask_base; +	unsigned int ack_base; + +	int num_regs; + +	const struct regmap_irq *irqs; +	int num_irqs; +}; + +struct regmap_irq_chip_data; + +int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, +			int irq_base, struct regmap_irq_chip *chip, +			struct regmap_irq_chip_data **data); +void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data); +int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data);  #endif diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index f7756d146c6..f2698a0edfc 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -149,6 +149,8 @@ int 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, +			   struct regulator_bulk_data *consumers);  void regulator_bulk_free(int num_consumers,  			 struct regulator_bulk_data *consumers); @@ -212,6 +214,11 @@ static inline int regulator_disable(struct regulator *regulator)  	return 0;  } +static inline int regulator_force_disable(struct regulator *regulator) +{ +	return 0; +} +  static inline int regulator_disable_deferred(struct regulator *regulator,  					     int ms)  { @@ -242,6 +249,12 @@ static inline int regulator_bulk_disable(int num_consumers,  	return 0;  } +static inline int regulator_bulk_force_disable(int num_consumers, +					struct regulator_bulk_data *consumers) +{ +	return 0; +} +  static inline void regulator_bulk_free(int num_consumers,  				       struct regulator_bulk_data *consumers)  { diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 52c89ae32f6..4214b9a9d1c 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -154,6 +154,7 @@ enum regulator_type {   * this type.   *   * @name: Identifying name for the regulator. + * @supply_name: Identifying the regulator supply   * @id: Numerical identifier for the regulator.   * @n_voltages: Number of selectors available for ops.list_voltage().   * @ops: Regulator operations table. @@ -163,6 +164,7 @@ enum regulator_type {   */  struct regulator_desc {  	const char *name; +	const char *supply_name;  	int id;  	unsigned n_voltages;  	struct regulator_ops *ops; @@ -212,7 +214,7 @@ struct regulator_dev {  struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,  	struct device *dev, const struct regulator_init_data *init_data, -	void *driver_data); +	void *driver_data, struct device_node *of_node);  void regulator_unregister(struct regulator_dev *rdev);  int regulator_notifier_call_chain(struct regulator_dev *rdev, diff --git a/include/linux/regulator/of_regulator.h b/include/linux/regulator/of_regulator.h new file mode 100644 index 00000000000..769704f296e --- /dev/null +++ b/include/linux/regulator/of_regulator.h @@ -0,0 +1,22 @@ +/* + * OpenFirmware regulator support routines + * + */ + +#ifndef __LINUX_OF_REG_H +#define __LINUX_OF_REG_H + +#if defined(CONFIG_OF) +extern struct regulator_init_data +	*of_get_regulator_init_data(struct device *dev, +				    struct device_node *node); +#else +static inline struct regulator_init_data +	*of_get_regulator_init_data(struct device *dev, +				    struct device_node *node) +{ +	return NULL; +} +#endif /* CONFIG_OF */ + +#endif /* __LINUX_OF_REG_H */ diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 96d465f8d3e..2213ddcce20 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -1759,13 +1759,14 @@ struct reiserfs_journal_header {  					      REISERFS_QUOTA_TRANS_BLOCKS(sb)))  #ifdef CONFIG_QUOTA +#define REISERFS_QUOTA_OPTS ((1 << REISERFS_USRQUOTA) | (1 << REISERFS_GRPQUOTA))  /* We need to update data and inode (atime) */ -#define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? 2 : 0) +#define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? 2 : 0)  /* 1 balancing, 1 bitmap, 1 data per write + stat data update */ -#define REISERFS_QUOTA_INIT_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? \ +#define REISERFS_QUOTA_INIT_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? \  (DQUOT_INIT_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_INIT_REWRITE+1) : 0)  /* same as with INIT */ -#define REISERFS_QUOTA_DEL_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? \ +#define REISERFS_QUOTA_DEL_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? \  (DQUOT_DEL_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_DEL_REWRITE+1) : 0)  #else  #define REISERFS_QUOTA_TRANS_BLOCKS(s) 0 @@ -2056,7 +2057,7 @@ struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key);  struct reiserfs_security_handle;  int reiserfs_new_inode(struct reiserfs_transaction_handle *th, -		       struct inode *dir, int mode, +		       struct inode *dir, umode_t mode,  		       const char *symname, loff_t i_size,  		       struct dentry *dentry, struct inode *inode,  		       struct reiserfs_security_handle *security); diff --git a/include/linux/reiserfs_fs_sb.h b/include/linux/reiserfs_fs_sb.h index 52c83b6a758..8c9e85c64b4 100644 --- a/include/linux/reiserfs_fs_sb.h +++ b/include/linux/reiserfs_fs_sb.h @@ -417,6 +417,7 @@ struct reiserfs_sb_info {  	char *s_qf_names[MAXQUOTAS];  	int s_jquota_fmt;  #endif +	char *s_jdev;		/* Stored jdev for mount option showing */  #ifdef CONFIG_REISERFS_CHECK  	struct tree_balance *cur_tb;	/* @@ -482,7 +483,8 @@ enum reiserfs_mount_options {  	REISERFS_ERROR_RO,  	REISERFS_ERROR_CONTINUE, -	REISERFS_QUOTA,		/* Some quota option specified */ +	REISERFS_USRQUOTA,	/* User quota option specified */ +	REISERFS_GRPQUOTA,	/* Group quota option specified */  	REISERFS_TEST1,  	REISERFS_TEST2, diff --git a/include/linux/relay.h b/include/linux/relay.h index 14a86bc7102..a822fd71fd6 100644 --- a/include/linux/relay.h +++ b/include/linux/relay.h @@ -144,7 +144,7 @@ struct rchan_callbacks  	 */  	struct dentry *(*create_buf_file)(const char *filename,  					  struct dentry *parent, -					  int mode, +					  umode_t mode,  					  struct rchan_buf *buf,  					  int *is_global); diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h index c9d625ca659..da81af086ea 100644 --- a/include/linux/res_counter.h +++ b/include/linux/res_counter.h @@ -109,12 +109,18 @@ void res_counter_init(struct res_counter *counter, struct res_counter *parent);   *   * returns 0 on success and <0 if the counter->usage will exceed the   * counter->limit _locked call expects the counter->lock to be taken + * + * charge_nofail works the same, except that it charges the resource + * counter unconditionally, and returns < 0 if the after the current + * charge we are over limit.   */  int __must_check res_counter_charge_locked(struct res_counter *counter,  		unsigned long val);  int __must_check res_counter_charge(struct res_counter *counter,  		unsigned long val, struct res_counter **limit_fail_at); +int __must_check res_counter_charge_nofail(struct res_counter *counter, +		unsigned long val, struct res_counter **limit_fail_at);  /*   * uncharge - tell that some portion of the resource is released @@ -142,7 +148,10 @@ static inline unsigned long long res_counter_margin(struct res_counter *cnt)  	unsigned long flags;  	spin_lock_irqsave(&cnt->lock, flags); -	margin = cnt->limit - cnt->usage; +	if (cnt->limit > cnt->usage) +		margin = cnt->limit - cnt->usage; +	else +		margin = 0;  	spin_unlock_irqrestore(&cnt->lock, flags);  	return margin;  } diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 2148b122779..1cdd62a2788 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h @@ -120,6 +120,7 @@ void anon_vma_init(void);	/* create anon_vma_cachep */  int  anon_vma_prepare(struct vm_area_struct *);  void unlink_anon_vmas(struct vm_area_struct *);  int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); +void anon_vma_moveto_tail(struct vm_area_struct *);  int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);  void __anon_vma_link(struct vm_area_struct *); @@ -157,7 +158,7 @@ static inline void page_dup_rmap(struct page *page)   * Called from mm/vmscan.c to handle paging out   */  int page_referenced(struct page *, int is_locked, -			struct mem_cgroup *cnt, unsigned long *vm_flags); +			struct mem_cgroup *memcg, unsigned long *vm_flags);  int page_referenced_one(struct page *, struct vm_area_struct *,  	unsigned long address, unsigned int *mapcount, unsigned long *vm_flags); @@ -235,7 +236,7 @@ int rmap_walk(struct page *page, int (*rmap_one)(struct page *,  #define anon_vma_link(vma)	do {} while (0)  static inline int page_referenced(struct page *page, int is_locked, -				  struct mem_cgroup *cnt, +				  struct mem_cgroup *memcg,  				  unsigned long *vm_flags)  {  	*vm_flags = 0; diff --git a/include/linux/s3c_adc_battery.h b/include/linux/s3c_adc_battery.h index fbe58b7e63e..99dadbffdd4 100644 --- a/include/linux/s3c_adc_battery.h +++ b/include/linux/s3c_adc_battery.h @@ -25,6 +25,10 @@ struct s3c_adc_bat_pdata {  	const unsigned int current_channel;  	const unsigned int backup_volt_channel; +	const unsigned int volt_samples; +	const unsigned int current_samples; +	const unsigned int backup_volt_samples; +  	const unsigned int volt_mult;  	const unsigned int current_mult;  	const unsigned int backup_volt_mult; diff --git a/include/linux/sched.h b/include/linux/sched.h index 68daf4f27e2..7d379a6bfd8 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -220,7 +220,7 @@ extern char ___assert_task_state[1 - 2*!!(  			((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)  #define task_contributes_to_load(task)	\  				((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ -				 (task->flags & PF_FREEZING) == 0) +				 (task->flags & PF_FROZEN) == 0)  #define __set_task_state(tsk, state_value)		\  	do { (tsk)->state = (state_value); } while (0) @@ -273,9 +273,11 @@ extern int runqueue_is_locked(int cpu);  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)  extern void select_nohz_load_balancer(int stop_tick); +extern void set_cpu_sd_state_idle(void);  extern int get_nohz_timer_target(void);  #else  static inline void select_nohz_load_balancer(int stop_tick) { } +static inline void set_cpu_sd_state_idle(void) { }  #endif  /* @@ -483,8 +485,8 @@ struct task_cputime {  #define INIT_CPUTIME	\  	(struct task_cputime) {					\ -		.utime = cputime_zero,				\ -		.stime = cputime_zero,				\ +		.utime = 0,					\ +		.stime = 0,					\  		.sum_exec_runtime = 0,				\  	} @@ -635,13 +637,15 @@ struct signal_struct {  #endif  #ifdef CONFIG_CGROUPS  	/* -	 * The threadgroup_fork_lock prevents threads from forking with -	 * CLONE_THREAD while held for writing. Use this for fork-sensitive -	 * threadgroup-wide operations. It's taken for reading in fork.c in -	 * copy_process(). -	 * Currently only needed write-side by cgroups. +	 * group_rwsem prevents new tasks from entering the threadgroup and +	 * member tasks from exiting,a more specifically, setting of +	 * PF_EXITING.  fork and exit paths are protected with this rwsem +	 * using threadgroup_change_begin/end().  Users which require +	 * threadgroup to remain stable should use threadgroup_[un]lock() +	 * which also takes care of exec path.  Currently, cgroup is the +	 * only user.  	 */ -	struct rw_semaphore threadgroup_fork_lock; +	struct rw_semaphore group_rwsem;  #endif  	int oom_adj;		/* OOM kill score adjustment (bit shift) */ @@ -901,6 +905,10 @@ struct sched_group_power {  	 * single CPU.  	 */  	unsigned int power, power_orig; +	/* +	 * Number of busy cpus in this group. +	 */ +	atomic_t nr_busy_cpus;  };  struct sched_group { @@ -925,6 +933,15 @@ static inline struct cpumask *sched_group_cpus(struct sched_group *sg)  	return to_cpumask(sg->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;  }; @@ -1315,8 +1332,8 @@ struct task_struct {  	 * older sibling, respectively.  (p->father can be replaced with   	 * p->real_parent->pid)  	 */ -	struct task_struct *real_parent; /* real parent process */ -	struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */ +	struct task_struct __rcu *real_parent; /* real parent process */ +	struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */  	/*  	 * children/sibling forms the list of my natural children  	 */ @@ -1521,13 +1538,13 @@ struct task_struct {  #ifdef CONFIG_FAULT_INJECTION  	int make_it_fail;  #endif -	struct prop_local_single dirties;  	/*  	 * when (nr_dirtied >= nr_dirtied_pause), it's time to call  	 * balance_dirty_pages() for some dirty throttling pause  	 */  	int nr_dirtied;  	int nr_dirtied_pause; +	unsigned long dirty_paused_when; /* start of a write-and-pause period */  #ifdef CONFIG_LATENCYTOP  	int latency_record_count; @@ -1773,7 +1790,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *  #define PF_MEMALLOC	0x00000800	/* Allocating memory */  #define PF_NPROC_EXCEEDED 0x00001000	/* set_user noticed that RLIMIT_NPROC was exceeded */  #define PF_USED_MATH	0x00002000	/* if unset the fpu must be initialized before use */ -#define PF_FREEZING	0x00004000	/* freeze in progress. do not account to load */  #define PF_NOFREEZE	0x00008000	/* this thread should not be frozen */  #define PF_FROZEN	0x00010000	/* frozen for system suspend */  #define PF_FSTRANS	0x00020000	/* inside a filesystem transaction */ @@ -1789,7 +1805,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *  #define PF_MEMPOLICY	0x10000000	/* Non-default NUMA mempolicy */  #define PF_MUTEX_TESTER	0x20000000	/* Thread belongs to the rt mutex tester */  #define PF_FREEZER_SKIP	0x40000000	/* Freezer should not count it as freezable */ -#define PF_FREEZER_NOSIG 0x80000000	/* Freezer won't send signals to it */  /*   * Only the _current_ task can read/write to tsk->flags, but other @@ -2071,6 +2086,14 @@ extern int sched_setscheduler(struct task_struct *, int,  extern int sched_setscheduler_nocheck(struct task_struct *, int,  				      const struct sched_param *);  extern struct task_struct *idle_task(int cpu); +/** + * is_idle_task - is the specified task an idle task? + * @p: the task in question. + */ +static inline bool is_idle_task(const struct task_struct *p) +{ +	return p->pid == 0; +}  extern struct task_struct *curr_task(int cpu);  extern void set_curr_task(int cpu, struct task_struct *p); @@ -2236,6 +2259,12 @@ static inline void mmdrop(struct mm_struct * mm)  extern void mmput(struct mm_struct *);  /* Grab a reference to a task's mm, if it is not already going away */  extern struct mm_struct *get_task_mm(struct task_struct *task); +/* + * Grab a reference to a task's mm, if it is not already going away + * and ptrace_may_access with the mode parameter passed to it + * succeeds. + */ +extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode);  /* Remove the current tasks stale references to the old mm_struct */  extern void mm_release(struct task_struct *, struct mm_struct *);  /* Allocate a new mm structure and copy contents from tsk->mm */ @@ -2252,7 +2281,7 @@ extern void __cleanup_sighand(struct sighand_struct *);  extern void exit_itimers(struct signal_struct *);  extern void flush_itimer_signals(void); -extern NORET_TYPE void do_group_exit(int); +extern void do_group_exit(int);  extern void daemonize(const char *, ...);  extern int allow_signal(int); @@ -2374,29 +2403,62 @@ static inline void unlock_task_sighand(struct task_struct *tsk,  	spin_unlock_irqrestore(&tsk->sighand->siglock, *flags);  } -/* See the declaration of threadgroup_fork_lock in signal_struct. */  #ifdef CONFIG_CGROUPS -static inline void threadgroup_fork_read_lock(struct task_struct *tsk) +static inline void threadgroup_change_begin(struct task_struct *tsk)  { -	down_read(&tsk->signal->threadgroup_fork_lock); +	down_read(&tsk->signal->group_rwsem);  } -static inline void threadgroup_fork_read_unlock(struct task_struct *tsk) +static inline void threadgroup_change_end(struct task_struct *tsk)  { -	up_read(&tsk->signal->threadgroup_fork_lock); +	up_read(&tsk->signal->group_rwsem);  } -static inline void threadgroup_fork_write_lock(struct task_struct *tsk) + +/** + * threadgroup_lock - lock threadgroup + * @tsk: member task of the threadgroup to lock + * + * 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. + * + * 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. + */ +static inline void threadgroup_lock(struct task_struct *tsk)  { -	down_write(&tsk->signal->threadgroup_fork_lock); +	/* +	 * 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);  } -static inline void threadgroup_fork_write_unlock(struct task_struct *tsk) + +/** + * threadgroup_unlock - unlock threadgroup + * @tsk: member task of the threadgroup to unlock + * + * Reverse threadgroup_lock(). + */ +static inline void threadgroup_unlock(struct task_struct *tsk)  { -	up_write(&tsk->signal->threadgroup_fork_lock); +	up_write(&tsk->signal->group_rwsem); +	mutex_unlock(&tsk->signal->cred_guard_mutex);  }  #else -static inline void threadgroup_fork_read_lock(struct task_struct *tsk) {} -static inline void threadgroup_fork_read_unlock(struct task_struct *tsk) {} -static inline void threadgroup_fork_write_lock(struct task_struct *tsk) {} -static inline void threadgroup_fork_write_unlock(struct task_struct *tsk) {} +static inline void threadgroup_change_begin(struct task_struct *tsk) {} +static inline void threadgroup_change_end(struct task_struct *tsk) {} +static inline void threadgroup_lock(struct task_struct *tsk) {} +static inline void threadgroup_unlock(struct task_struct *tsk) {}  #endif  #ifndef __HAVE_THREAD_FUNCTIONS diff --git a/include/linux/security.h b/include/linux/security.h index 19d8e04e168..83c18e8c846 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -54,8 +54,8 @@ struct user_namespace;   * These functions are in security/capability.c and are used   * as the default capabilities functions   */ -extern int cap_capable(struct task_struct *tsk, const struct cred *cred, -		       struct user_namespace *ns, int cap, int audit); +extern int cap_capable(const struct cred *cred, struct user_namespace *ns, +		       int cap, int audit);  extern int cap_settime(const struct timespec *ts, const struct timezone *tz);  extern int cap_ptrace_access_check(struct task_struct *child, unsigned int mode);  extern int cap_ptrace_traceme(struct task_struct *parent); @@ -96,7 +96,6 @@ struct xfrm_user_sec_ctx;  struct seq_file;  extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); -extern int cap_netlink_recv(struct sk_buff *skb, int cap);  void reset_security_ops(void); @@ -186,7 +185,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   * Security module identifier.   *   * @name: - *	A string that acts as a unique identifeir for the LSM with max number + *	A string that acts as a unique identifier for the LSM with max number   *	of characters = SECURITY_NAME_MAX.   *   * Security hooks for program execution operations. @@ -275,7 +274,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@copy copied data which will be passed to the security module.   *	Returns 0 if the copy was successful.   * @sb_remount: - *	Extracts security system specifc mount options and verifys no changes + *	Extracts security system specific mount options and verifies no changes   *	are being made to those options.   *	@sb superblock being remounted   *	@data contains the filesystem-specific data. @@ -380,15 +379,15 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	Return 0 if permission is granted.   * @inode_mkdir:   *	Check permissions to create a new directory in the existing directory - *	associated with inode strcture @dir. - *	@dir containst the inode structure of parent of the directory to be created. + *	associated with inode structure @dir. + *	@dir contains the inode structure of parent of the directory to be created.   *	@dentry contains the dentry structure of new directory.   *	@mode contains the mode of new directory.   *	Return 0 if permission is granted.   * @path_mkdir:   *	Check permissions to create a new directory in the existing directory - *	associated with path strcture @path. - *	@dir containst the path structure of parent of the directory + *	associated with path structure @path. + *	@dir contains the path structure of parent of the directory   *	to be created.   *	@dentry contains the dentry structure of new directory.   *	@mode contains the mode of new directory. @@ -578,7 +577,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@file contains the file structure.   *	@cmd contains the operation to perform.   *	@arg contains the operational arguments. - *	Check permission for an ioctl operation on @file.  Note that @arg can + *	Check permission for an ioctl operation on @file.  Note that @arg   *	sometimes represents a user space pointer; in other cases, it may be a   *	simple integer value.  When @arg represents a user space pointer, it   *	should never be used by the security module. @@ -590,6 +589,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@reqprot contains the protection requested by the application.   *	@prot contains the protection that will be applied by the kernel.   *	@flags contains the operational flags. + *	@addr contains virtual address that will be used for the operation. + *	@addr_only contains a boolean: 0 if file-backed VMA, otherwise 1.   *	Return 0 if permission is granted.   * @file_mprotect:   *	Check permissions before changing memory access permissions. @@ -606,7 +607,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	Return 0 if permission is granted.   * @file_fcntl:   *	Check permission before allowing the file operation specified by @cmd - *	from being performed on the file @file.  Note that @arg can sometimes + *	from being performed on the file @file.  Note that @arg sometimes   *	represents a user space pointer; in other cases, it may be a simple   *	integer value.  When @arg represents a user space pointer, it should   *	never be used by the security module. @@ -793,16 +794,10 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	information can be saved using the eff_cap field of the   *	netlink_skb_parms structure.  Also may be used to provide fine   *	grained control over message transmission. - *	@sk associated sock of task sending the message., + *	@sk associated sock of task sending the message.   *	@skb contains the sk_buff structure for the netlink message.   *	Return 0 if the information was successfully saved and message   *	is allowed to be transmitted. - * @netlink_recv: - *	Check permission before processing the received netlink message in - *	@skb. - *	@skb contains the sk_buff structure for the netlink message. - *	@cap indicates the capability required - *	Return 0 if permission is granted.   *   * Security hooks for Unix domain networking.   * @@ -1080,9 +1075,9 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	should free it.   *	@key points to the key to be queried.   *	@_buffer points to a pointer that should be set to point to the - *	 resulting string (if no label or an error occurs). + *	resulting string (if no label or an error occurs).   *	Return the length of the string (including terminating NUL) or -ve if - *      an error. + *	an error.   *	May also return 0 (and a NULL buffer pointer) if there is no label.   *   * Security hooks affecting all System V IPC operations. @@ -1266,9 +1261,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   * @capable:   *	Check whether the @tsk process has the @cap capability in the indicated   *	credentials. - *	@tsk contains the task_struct for the process.   *	@cred contains the credentials to use. - *      @ns contains the user namespace we want the capability in + *	@ns contains the user namespace we want the capability in   *	@cap contains the capability <include/linux/capability.h>.   *	@audit: Whether to write an audit message or not   *	Return 0 if the capability is granted for @tsk. @@ -1370,7 +1364,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   * 	@ctxlen contains the length of @ctx.   *   * @inode_getsecctx: - * 	Returns a string containing all relavent security context information + *	Returns a string containing all relevant security context information   *   * 	@inode we wish to get the security context of.   *	@ctx is a pointer in which to place the allocated security context. @@ -1390,8 +1384,8 @@ struct security_operations {  		       const kernel_cap_t *effective,  		       const kernel_cap_t *inheritable,  		       const kernel_cap_t *permitted); -	int (*capable) (struct task_struct *tsk, const struct cred *cred, -			struct user_namespace *ns, int cap, int audit); +	int (*capable) (const struct cred *cred, struct user_namespace *ns, +			int cap, int audit);  	int (*quotactl) (int cmds, int type, int id, struct super_block *sb);  	int (*quota_on) (struct dentry *dentry);  	int (*syslog) (int type); @@ -1424,9 +1418,9 @@ struct security_operations {  #ifdef CONFIG_SECURITY_PATH  	int (*path_unlink) (struct path *dir, struct dentry *dentry); -	int (*path_mkdir) (struct path *dir, struct dentry *dentry, int mode); +	int (*path_mkdir) (struct path *dir, struct dentry *dentry, umode_t mode);  	int (*path_rmdir) (struct path *dir, struct dentry *dentry); -	int (*path_mknod) (struct path *dir, struct dentry *dentry, int mode, +	int (*path_mknod) (struct path *dir, struct dentry *dentry, umode_t mode,  			   unsigned int dev);  	int (*path_truncate) (struct path *path);  	int (*path_symlink) (struct path *dir, struct dentry *dentry, @@ -1435,8 +1429,7 @@ struct security_operations {  			  struct dentry *new_dentry);  	int (*path_rename) (struct path *old_dir, struct dentry *old_dentry,  			    struct path *new_dir, struct dentry *new_dentry); -	int (*path_chmod) (struct dentry *dentry, struct vfsmount *mnt, -			   mode_t mode); +	int (*path_chmod) (struct path *path, umode_t mode);  	int (*path_chown) (struct path *path, uid_t uid, gid_t gid);  	int (*path_chroot) (struct path *path);  #endif @@ -1447,16 +1440,16 @@ struct security_operations {  				    const struct qstr *qstr, char **name,  				    void **value, size_t *len);  	int (*inode_create) (struct inode *dir, -			     struct dentry *dentry, int mode); +			     struct dentry *dentry, umode_t mode);  	int (*inode_link) (struct dentry *old_dentry,  			   struct inode *dir, struct dentry *new_dentry);  	int (*inode_unlink) (struct inode *dir, struct dentry *dentry);  	int (*inode_symlink) (struct inode *dir,  			      struct dentry *dentry, const char *old_name); -	int (*inode_mkdir) (struct inode *dir, struct dentry *dentry, int mode); +	int (*inode_mkdir) (struct inode *dir, struct dentry *dentry, umode_t mode);  	int (*inode_rmdir) (struct inode *dir, struct dentry *dentry);  	int (*inode_mknod) (struct inode *dir, struct dentry *dentry, -			    int mode, dev_t dev); +			    umode_t mode, dev_t dev);  	int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry,  			     struct inode *new_dir, struct dentry *new_dentry);  	int (*inode_readlink) (struct dentry *dentry); @@ -1562,7 +1555,6 @@ struct security_operations {  			  struct sembuf *sops, unsigned nsops, int alter);  	int (*netlink_send) (struct sock *sk, struct sk_buff *skb); -	int (*netlink_recv) (struct sk_buff *skb, int cap);  	void (*d_instantiate) (struct dentry *dentry, struct inode *inode); @@ -1674,12 +1666,10 @@ int security_capset(struct cred *new, const struct cred *old,  		    const kernel_cap_t *effective,  		    const kernel_cap_t *inheritable,  		    const kernel_cap_t *permitted); -int security_capable(struct user_namespace *ns, const struct cred *cred, +int security_capable(const struct cred *cred, struct user_namespace *ns,  			int cap); -int security_real_capable(struct task_struct *tsk, struct user_namespace *ns, -			int cap); -int security_real_capable_noaudit(struct task_struct *tsk, -			struct user_namespace *ns, int cap); +int security_capable_noaudit(const struct cred *cred, struct user_namespace *ns, +			     int cap);  int security_quotactl(int cmds, int type, int id, struct super_block *sb);  int security_quota_on(struct dentry *dentry);  int security_syslog(int type); @@ -1716,15 +1706,15 @@ int security_inode_init_security(struct inode *inode, struct inode *dir,  int security_old_inode_init_security(struct inode *inode, struct inode *dir,  				     const struct qstr *qstr, char **name,  				     void **value, size_t *len); -int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); +int security_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode);  int security_inode_link(struct dentry *old_dentry, struct inode *dir,  			 struct dentry *new_dentry);  int security_inode_unlink(struct inode *dir, struct dentry *dentry);  int security_inode_symlink(struct inode *dir, struct dentry *dentry,  			   const char *old_name); -int security_inode_mkdir(struct inode *dir, struct dentry *dentry, int mode); +int security_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode);  int security_inode_rmdir(struct inode *dir, struct dentry *dentry); -int security_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev); +int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev);  int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,  			  struct inode *new_dir, struct dentry *new_dentry);  int security_inode_readlink(struct dentry *dentry); @@ -1816,7 +1806,6 @@ void security_d_instantiate(struct dentry *dentry, struct inode *inode);  int security_getprocattr(struct task_struct *p, char *name, char **value);  int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size);  int security_netlink_send(struct sock *sk, struct sk_buff *skb); -int security_netlink_recv(struct sk_buff *skb, int cap);  int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen);  int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid);  void security_release_secctx(char *secdata, u32 seclen); @@ -1874,32 +1863,15 @@ static inline int security_capset(struct cred *new,  	return cap_capset(new, old, effective, inheritable, permitted);  } -static inline int security_capable(struct user_namespace *ns, -				   const struct cred *cred, int cap) +static inline int security_capable(const struct cred *cred, +				   struct user_namespace *ns, int cap)  { -	return cap_capable(current, cred, ns, cap, SECURITY_CAP_AUDIT); -} - -static inline int security_real_capable(struct task_struct *tsk, struct user_namespace *ns, int cap) -{ -	int ret; - -	rcu_read_lock(); -	ret = cap_capable(tsk, __task_cred(tsk), ns, cap, SECURITY_CAP_AUDIT); -	rcu_read_unlock(); -	return ret; +	return cap_capable(cred, ns, cap, SECURITY_CAP_AUDIT);  } -static inline -int security_real_capable_noaudit(struct task_struct *tsk, struct user_namespace *ns, int cap) -{ -	int ret; - -	rcu_read_lock(); -	ret = cap_capable(tsk, __task_cred(tsk), ns, cap, -			       SECURITY_CAP_NOAUDIT); -	rcu_read_unlock(); -	return ret; +static inline int security_capable_noaudit(const struct cred *cred, +					   struct user_namespace *ns, int cap) { +	return cap_capable(cred, ns, cap, SECURITY_CAP_NOAUDIT);  }  static inline int security_quotactl(int cmds, int type, int id, @@ -2044,7 +2016,7 @@ static inline void security_inode_free(struct inode *inode)  static inline int security_inode_init_security(struct inode *inode,  						struct inode *dir,  						const struct qstr *qstr, -						initxattrs initxattrs, +						const initxattrs initxattrs,  						void *fs_data)  {  	return 0; @@ -2056,12 +2028,12 @@ static inline int security_old_inode_init_security(struct inode *inode,  						   char **name, void **value,  						   size_t *len)  { -	return 0; +	return -EOPNOTSUPP;  }  static inline int security_inode_create(struct inode *dir,  					 struct dentry *dentry, -					 int mode) +					 umode_t mode)  {  	return 0;  } @@ -2516,11 +2488,6 @@ static inline int security_netlink_send(struct sock *sk, struct sk_buff *skb)  	return cap_netlink_send(sk, skb);  } -static inline int security_netlink_recv(struct sk_buff *skb, int cap) -{ -	return cap_netlink_recv(skb, cap); -} -  static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)  {  	return -EOPNOTSUPP; @@ -2855,9 +2822,9 @@ static inline void security_skb_classify_flow(struct sk_buff *skb, struct flowi  #ifdef CONFIG_SECURITY_PATH  int security_path_unlink(struct path *dir, struct dentry *dentry); -int security_path_mkdir(struct path *dir, struct dentry *dentry, int mode); +int security_path_mkdir(struct path *dir, struct dentry *dentry, umode_t mode);  int security_path_rmdir(struct path *dir, struct dentry *dentry); -int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, +int security_path_mknod(struct path *dir, struct dentry *dentry, umode_t mode,  			unsigned int dev);  int security_path_truncate(struct path *path);  int security_path_symlink(struct path *dir, struct dentry *dentry, @@ -2866,8 +2833,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,  		       struct dentry *new_dentry);  int security_path_rename(struct path *old_dir, struct dentry *old_dentry,  			 struct path *new_dir, struct dentry *new_dentry); -int security_path_chmod(struct dentry *dentry, struct vfsmount *mnt, -			mode_t mode); +int security_path_chmod(struct path *path, umode_t mode);  int security_path_chown(struct path *path, uid_t uid, gid_t gid);  int security_path_chroot(struct path *path);  #else	/* CONFIG_SECURITY_PATH */ @@ -2877,7 +2843,7 @@ static inline int security_path_unlink(struct path *dir, struct dentry *dentry)  }  static inline int security_path_mkdir(struct path *dir, struct dentry *dentry, -				      int mode) +				      umode_t mode)  {  	return 0;  } @@ -2888,7 +2854,7 @@ static inline int security_path_rmdir(struct path *dir, struct dentry *dentry)  }  static inline int security_path_mknod(struct path *dir, struct dentry *dentry, -				      int mode, unsigned int dev) +				      umode_t mode, unsigned int dev)  {  	return 0;  } @@ -2919,9 +2885,7 @@ static inline int security_path_rename(struct path *old_dir,  	return 0;  } -static inline int security_path_chmod(struct dentry *dentry, -				      struct vfsmount *mnt, -				      mode_t mode) +static inline int security_path_chmod(struct path *path, umode_t mode)  {  	return 0;  } @@ -3010,7 +2974,7 @@ static inline void security_audit_rule_free(void *lsmrule)  #ifdef CONFIG_SECURITYFS -extern struct dentry *securityfs_create_file(const char *name, mode_t mode, +extern struct dentry *securityfs_create_file(const char *name, umode_t mode,  					     struct dentry *parent, void *data,  					     const struct file_operations *fops);  extern struct dentry *securityfs_create_dir(const char *name, struct dentry *parent); @@ -3025,7 +2989,7 @@ static inline struct dentry *securityfs_create_dir(const char *name,  }  static inline struct dentry *securityfs_create_file(const char *name, -						    mode_t mode, +						    umode_t mode,  						    struct dentry *parent,  						    void *data,  						    const struct file_operations *fops) diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 0b69a468421..44f1514b00b 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -74,7 +74,7 @@ static inline void seq_commit(struct seq_file *m, int num)  	}  } -char *mangle_path(char *s, char *p, char *esc); +char *mangle_path(char *s, const char *p, const char *esc);  int seq_open(struct file *, const struct seq_operations *);  ssize_t seq_read(struct file *, char __user *, size_t, loff_t *);  loff_t seq_lseek(struct file *, loff_t, int); @@ -86,10 +86,10 @@ int seq_write(struct seq_file *seq, const void *data, size_t len);  __printf(2, 3) int seq_printf(struct seq_file *, const char *, ...); -int seq_path(struct seq_file *, struct path *, char *); -int seq_dentry(struct seq_file *, struct dentry *, char *); -int seq_path_root(struct seq_file *m, struct path *path, struct path *root, -		  char *esc); +int seq_path(struct seq_file *, const struct path *, const char *); +int seq_dentry(struct seq_file *, struct dentry *, const char *); +int seq_path_root(struct seq_file *m, const struct path *path, +		  const struct path *root, const char *esc);  int seq_bitmap(struct seq_file *m, const unsigned long *bits,  				   unsigned int nr_bits);  static inline int seq_cpumask(struct seq_file *m, const struct cpumask *mask) diff --git a/include/linux/serial.h b/include/linux/serial.h index 97ff8e27a6c..3d86517fe7d 100644 --- a/include/linux/serial.h +++ b/include/linux/serial.h @@ -207,13 +207,15 @@ struct serial_icounter_struct {  struct serial_rs485 {  	__u32	flags;			/* RS485 feature flags */ -#define SER_RS485_ENABLED		(1 << 0) -#define SER_RS485_RTS_ON_SEND		(1 << 1) -#define SER_RS485_RTS_AFTER_SEND	(1 << 2) -#define SER_RS485_RTS_BEFORE_SEND	(1 << 3) +#define SER_RS485_ENABLED		(1 << 0)	/* If enabled */ +#define SER_RS485_RTS_ON_SEND		(1 << 1)	/* Logical level for +							   RTS pin when +							   sending */ +#define SER_RS485_RTS_AFTER_SEND	(1 << 2)	/* Logical level for +							   RTS pin after sent*/  #define SER_RS485_RX_DURING_TX		(1 << 4) -	__u32	delay_rts_before_send;	/* Milliseconds */ -	__u32	delay_rts_after_send;	/* Milliseconds */ +	__u32	delay_rts_before_send;	/* Delay before send (milliseconds) */ +	__u32	delay_rts_after_send;	/* Delay after send (milliseconds) */  	__u32	padding[5];		/* Memory is cheap, new structs  					   are a royal PITA .. */  }; diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 1f05bbeac01..8f012f8ac8e 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -66,6 +66,7 @@ enum {   * dependent on the 8250 driver.   */  struct uart_port; +struct uart_8250_port;  int serial8250_register_port(struct uart_port *);  void serial8250_unregister_port(int line); @@ -81,7 +82,11 @@ extern void serial8250_do_set_termios(struct uart_port *port,  		struct ktermios *termios, struct ktermios *old);  extern void serial8250_do_pm(struct uart_port *port, unsigned int state,  			     unsigned int oldstate); +extern int fsl8250_handle_irq(struct uart_port *port);  int serial8250_handle_irq(struct uart_port *port, unsigned int iir); +unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr); +void serial8250_tx_chars(struct uart_8250_port *up); +unsigned int serial8250_modem_status(struct uart_8250_port *up);  extern void serial8250_set_isa_configurator(void (*v)  					(int port, struct uart_port *up, diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index eadf33d0abb..c91ace70c21 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -207,6 +207,10 @@  /* Xilinx PSS UART */  #define PORT_XUARTPS	98 +/* Atheros AR933X SoC */ +#define PORT_AR933X	99 + +  #ifdef __KERNEL__  #include <linux/compiler.h> @@ -351,6 +355,7 @@ struct uart_port {  #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))  #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))  #define UPF_EXAR_EFR		((__force upf_t) (1 << 25)) +#define UPF_IIR_ONCE		((__force upf_t) (1 << 26))  /* The exact UART type is known and should not be probed.  */  #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))  #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28)) @@ -483,10 +488,19 @@ static inline int uart_tx_stopped(struct uart_port *port)  /*   * The following are helper functions for the low level drivers.   */ + +extern void uart_handle_dcd_change(struct uart_port *uport, +		unsigned int status); +extern void uart_handle_cts_change(struct uart_port *uport, +		unsigned int status); + +extern void uart_insert_char(struct uart_port *port, unsigned int status, +		 unsigned int overrun, unsigned int ch, unsigned int flag); + +#ifdef SUPPORT_SYSRQ  static inline int  uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)  { -#ifdef SUPPORT_SYSRQ  	if (port->sysrq) {  		if (ch && time_before(jiffies, port->sysrq)) {  			handle_sysrq(ch); @@ -495,11 +509,10 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)  		}  		port->sysrq = 0;  	} -#endif  	return 0;  } -#ifndef SUPPORT_SYSRQ -#define uart_handle_sysrq_char(port,ch) uart_handle_sysrq_char(port, 0) +#else +#define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; })  #endif  /* @@ -522,89 +535,6 @@ static inline int uart_handle_break(struct uart_port *port)  	return 0;  } -/** - *	uart_handle_dcd_change - handle a change of carrier detect state - *	@uport: uart_port structure for the open port - *	@status: new carrier detect status, nonzero if active - */ -static inline void -uart_handle_dcd_change(struct uart_port *uport, unsigned int status) -{ -	struct uart_state *state = uport->state; -	struct tty_port *port = &state->port; -	struct tty_ldisc *ld = tty_ldisc_ref(port->tty); -	struct pps_event_time ts; - -	if (ld && ld->ops->dcd_change) -		pps_get_ts(&ts); - -	uport->icount.dcd++; -#ifdef CONFIG_HARD_PPS -	if ((uport->flags & UPF_HARDPPS_CD) && status) -		hardpps(); -#endif - -	if (port->flags & ASYNC_CHECK_CD) { -		if (status) -			wake_up_interruptible(&port->open_wait); -		else if (port->tty) -			tty_hangup(port->tty); -	} - -	if (ld && ld->ops->dcd_change) -		ld->ops->dcd_change(port->tty, status, &ts); -	if (ld) -		tty_ldisc_deref(ld); -} - -/** - *	uart_handle_cts_change - handle a change of clear-to-send state - *	@uport: uart_port structure for the open port - *	@status: new clear to send status, nonzero if active - */ -static inline void -uart_handle_cts_change(struct uart_port *uport, unsigned int status) -{ -	struct tty_port *port = &uport->state->port; -	struct tty_struct *tty = port->tty; - -	uport->icount.cts++; - -	if (port->flags & ASYNC_CTS_FLOW) { -		if (tty->hw_stopped) { -			if (status) { -				tty->hw_stopped = 0; -				uport->ops->start_tx(uport); -				uart_write_wakeup(uport); -			} -		} else { -			if (!status) { -				tty->hw_stopped = 1; -				uport->ops->stop_tx(uport); -			} -		} -	} -} - -#include <linux/tty_flip.h> - -static inline void -uart_insert_char(struct uart_port *port, unsigned int status, -		 unsigned int overrun, unsigned int ch, unsigned int flag) -{ -	struct tty_struct *tty = port->state->port.tty; - -	if ((status & port->ignore_status_mask & ~overrun) == 0) -		tty_insert_flip_char(tty, ch, flag); - -	/* -	 * Overrun is special.  Since it's reported immediately, -	 * it doesn't affect the current character. -	 */ -	if (status & ~port->ignore_status_mask & overrun) -		tty_insert_flip_char(tty, 0, TTY_OVERRUN); -} -  /*   *	UART_ENABLE_MS - determine if port should enable modem status irqs   */ diff --git a/include/linux/serial_sci.h b/include/linux/serial_sci.h index 0efa1f10bc2..78779074f6e 100644 --- a/include/linux/serial_sci.h +++ b/include/linux/serial_sci.h @@ -49,6 +49,10 @@ enum {  #define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK) +/* SCSPTR, optional */ +#define SCSPTR_RTSIO	(1 << 7) +#define SCSPTR_CTSIO	(1 << 5) +  /* Offsets into the sci_port->irqs array */  enum {  	SCIx_ERI_IRQ, @@ -60,6 +64,17 @@ enum {  	SCIx_MUX_IRQ = SCIx_NR_IRQS,	/* special case */  }; +/* Offsets into the sci_port->gpios array */ +enum { +	SCIx_SCK, +	SCIx_RXD, +	SCIx_TXD, +	SCIx_CTS, +	SCIx_RTS, + +	SCIx_NR_FNS, +}; +  enum {  	SCIx_PROBE_REGTYPE, @@ -67,6 +82,7 @@ enum {  	SCIx_IRDA_REGTYPE,  	SCIx_SCIFA_REGTYPE,  	SCIx_SCIFB_REGTYPE, +	SCIx_SH2_SCIF_FIFODATA_REGTYPE,  	SCIx_SH3_SCIF_REGTYPE,  	SCIx_SH4_SCIF_REGTYPE,  	SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE, @@ -108,13 +124,20 @@ struct plat_sci_port_ops {  };  /* + * Port-specific capabilities + */ +#define SCIx_HAVE_RTSCTS	(1 << 0) + +/*   * Platform device specific platform_data struct   */  struct plat_sci_port {  	unsigned long	mapbase;		/* resource base */  	unsigned int	irqs[SCIx_NR_IRQS];	/* ERI, RXI, TXI, BRI */ +	unsigned int	gpios[SCIx_NR_FNS];	/* SCK, RXD, TXD, CTS, RTS */  	unsigned int	type;			/* SCI / SCIF / IRDA */  	upf_t		flags;			/* UPF_* flags */ +	unsigned long	capabilities;		/* Port features/capabilities */  	unsigned int	scbrr_algo_id;		/* SCBRR calculation algo */  	unsigned int	scscr;			/* SCSCR initialization */ diff --git a/include/linux/sh_clk.h b/include/linux/sh_clk.h index 3ccf18648d0..54341d81168 100644 --- a/include/linux/sh_clk.h +++ b/include/linux/sh_clk.h @@ -49,10 +49,10 @@ struct clk {  	void __iomem		*enable_reg;  	unsigned int		enable_bit; +	void __iomem		*mapped_reg;  	unsigned long		arch_flags;  	void			*priv; -	struct dentry		*dentry;  	struct clk_mapping	*mapping;  	struct cpufreq_frequency_table *freq_table;  	unsigned int		nr_freqs; @@ -94,6 +94,9 @@ int clk_rate_table_find(struct clk *clk,  long clk_rate_div_range_round(struct clk *clk, unsigned int div_min,  			      unsigned int div_max, unsigned long rate); +long clk_rate_mult_range_round(struct clk *clk, unsigned int mult_min, +			       unsigned int mult_max, unsigned long rate); +  long clk_round_parent(struct clk *clk, unsigned long target,  		      unsigned long *best_freq, unsigned long *parent_freq,  		      unsigned int div_min, unsigned int div_max); @@ -129,10 +132,9 @@ int sh_clk_div4_enable_register(struct clk *clks, int nr,  int sh_clk_div4_reparent_register(struct clk *clks, int nr,  			 struct clk_div4_table *table); -#define SH_CLK_DIV6_EXT(_parent, _reg, _flags, _parents,	\ +#define SH_CLK_DIV6_EXT(_reg, _flags, _parents,			\  			_num_parents, _src_shift, _src_width)	\  {								\ -	.parent = _parent,					\  	.enable_reg = (void __iomem *)_reg,			\  	.flags = _flags,					\  	.parent_table = _parents,				\ @@ -142,7 +144,11 @@ int sh_clk_div4_reparent_register(struct clk *clks, int nr,  }  #define SH_CLK_DIV6(_parent, _reg, _flags)			\ -	SH_CLK_DIV6_EXT(_parent, _reg, _flags, NULL, 0, 0, 0) +{								\ +	.parent		= _parent,				\ +	.enable_reg	= (void __iomem *)_reg,			\ +	.flags		= _flags,				\ +}  int sh_clk_div6_register(struct clk *clks, int nr);  int sh_clk_div6_reparent_register(struct clk *clks, int nr); diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h index cb2dd118cc0..425450b980b 100644 --- a/include/linux/sh_dma.h +++ b/include/linux/sh_dma.h @@ -30,7 +30,7 @@ struct sh_desc {  	struct sh_dmae_regs hw;  	struct list_head node;  	struct dma_async_tx_descriptor async_tx; -	enum dma_data_direction direction; +	enum dma_transfer_direction direction;  	dma_cookie_t cookie;  	size_t partial;  	int chunks; @@ -48,6 +48,7 @@ struct sh_dmae_channel {  	unsigned int	offset;  	unsigned int	dmars;  	unsigned int	dmars_bit; +	unsigned int	chclr_offset;  };  struct sh_dmae_pdata { @@ -68,6 +69,8 @@ struct sh_dmae_pdata {  	unsigned int dmaor_is_32bit:1;  	unsigned int needs_tend_set:1;  	unsigned int no_dmars:1; +	unsigned int chclr_present:1; +	unsigned int slave_only:1;  };  /* DMA register */ diff --git a/include/linux/sh_intc.h b/include/linux/sh_intc.h index 5812fefbced..b160645f559 100644 --- a/include/linux/sh_intc.h +++ b/include/linux/sh_intc.h @@ -95,6 +95,7 @@ struct intc_desc {  	unsigned int num_resources;  	intc_enum force_enable;  	intc_enum force_disable; +	bool skip_syscore_suspend;  	struct intc_hw_desc hw;  }; diff --git a/include/linux/sh_pfc.h b/include/linux/sh_pfc.h index bc8c9208f7e..5c15aed9c4b 100644 --- a/include/linux/sh_pfc.h +++ b/include/linux/sh_pfc.h @@ -45,16 +45,24 @@ struct pinmux_cfg_reg {  	unsigned long reg, reg_width, field_width;  	unsigned long *cnt;  	pinmux_enum_t *enum_ids; +	unsigned long *var_field_width;  };  #define PINMUX_CFG_REG(name, r, r_width, f_width) \  	.reg = r, .reg_width = r_width, .field_width = f_width,		\  	.cnt = (unsigned long [r_width / f_width]) {}, \ -	.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \ +	.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) + +#define PINMUX_CFG_REG_VAR(name, r, r_width, var_fw0, var_fwn...) \ +	.reg = r, .reg_width = r_width,	\ +	.cnt = (unsigned long [r_width]) {}, \ +	.var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \ +	.enum_ids = (pinmux_enum_t [])  struct pinmux_data_reg {  	unsigned long reg, reg_width, reg_shadow;  	pinmux_enum_t *enum_ids; +	void __iomem *mapped_reg;  };  #define PINMUX_DATA_REG(name, r, r_width) \ @@ -75,6 +83,12 @@ struct pinmux_range {  	pinmux_enum_t force;  }; +struct pfc_window { +	phys_addr_t phys; +	void __iomem *virt; +	unsigned long size; +}; +  struct pinmux_info {  	char *name;  	pinmux_enum_t reserved_id; @@ -98,10 +112,92 @@ struct pinmux_info {  	struct pinmux_irq *gpio_irq;  	unsigned int gpio_irq_size; +	struct resource *resource; +	unsigned int num_resources; +	struct pfc_window *window; + +	unsigned long unlock_reg; +  	struct gpio_chip chip;  };  int register_pinmux(struct pinmux_info *pip);  int unregister_pinmux(struct pinmux_info *pip); +/* helper macro for port */ +#define PORT_1(fn, pfx, sfx) fn(pfx, sfx) + +#define PORT_10(fn, pfx, sfx) \ +	PORT_1(fn, pfx##0, sfx), PORT_1(fn, pfx##1, sfx),	\ +	PORT_1(fn, pfx##2, sfx), PORT_1(fn, pfx##3, sfx),	\ +	PORT_1(fn, pfx##4, sfx), PORT_1(fn, pfx##5, sfx),	\ +	PORT_1(fn, pfx##6, sfx), PORT_1(fn, pfx##7, sfx),	\ +	PORT_1(fn, pfx##8, sfx), PORT_1(fn, pfx##9, sfx) + +#define PORT_90(fn, pfx, sfx) \ +	PORT_10(fn, pfx##1, sfx), PORT_10(fn, pfx##2, sfx),	\ +	PORT_10(fn, pfx##3, sfx), PORT_10(fn, pfx##4, sfx),	\ +	PORT_10(fn, pfx##5, sfx), PORT_10(fn, pfx##6, sfx),	\ +	PORT_10(fn, pfx##7, sfx), PORT_10(fn, pfx##8, sfx),	\ +	PORT_10(fn, pfx##9, sfx) + +#define _PORT_ALL(pfx, sfx) pfx##_##sfx +#define _GPIO_PORT(pfx, sfx) PINMUX_GPIO(GPIO_PORT##pfx, PORT##pfx##_DATA) +#define PORT_ALL(str)	CPU_ALL_PORT(_PORT_ALL, PORT, str) +#define GPIO_PORT_ALL()	CPU_ALL_PORT(_GPIO_PORT, , unused) +#define GPIO_FN(str) PINMUX_GPIO(GPIO_FN_##str, str##_MARK) + +/* helper macro for pinmux_enum_t */ +#define PORT_DATA_I(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_IN) + +#define PORT_DATA_I_PD(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,	\ +		    PORT##nr##_IN, PORT##nr##_IN_PD) + +#define PORT_DATA_I_PU(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,	\ +		    PORT##nr##_IN, PORT##nr##_IN_PU) + +#define PORT_DATA_I_PU_PD(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,			\ +		    PORT##nr##_IN, PORT##nr##_IN_PD, PORT##nr##_IN_PU) + +#define PORT_DATA_O(nr)		\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT) + +#define PORT_DATA_IO(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\ +		    PORT##nr##_IN) + +#define PORT_DATA_IO_PD(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\ +		    PORT##nr##_IN, PORT##nr##_IN_PD) + +#define PORT_DATA_IO_PU(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\ +		    PORT##nr##_IN, PORT##nr##_IN_PU) + +#define PORT_DATA_IO_PU_PD(nr)	\ +	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\ +		    PORT##nr##_IN, PORT##nr##_IN_PD, PORT##nr##_IN_PU) + +/* helper macro for top 4 bits in PORTnCR */ +#define _PCRH(in, in_pd, in_pu, out)	\ +	0, (out), (in), 0,		\ +	0, 0, 0, 0,			\ +	0, 0, (in_pd), 0,		\ +	0, 0, (in_pu), 0 + +#define PORTCR(nr, reg)							\ +	{								\ +		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ +			_PCRH(PORT##nr##_IN, PORT##nr##_IN_PD,		\ +			      PORT##nr##_IN_PU, PORT##nr##_OUT),	\ +				PORT##nr##_FN0, PORT##nr##_FN1,		\ +				PORT##nr##_FN2, PORT##nr##_FN3,		\ +				PORT##nr##_FN4, PORT##nr##_FN5,		\ +				PORT##nr##_FN6, PORT##nr##_FN7 }	\ +	} +  #endif /* __SH_PFC_H */ diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 9291ac3cc62..79ab2555b3b 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h @@ -30,7 +30,7 @@ struct shmem_sb_info {  	spinlock_t stat_lock;	    /* Serialize shmem_sb_info changes */  	uid_t uid;		    /* Mount uid for root directory */  	gid_t gid;		    /* Mount gid for root directory */ -	mode_t mode;		    /* Mount mode for root directory */ +	umode_t mode;		    /* Mount mode for root directory */  	struct mempolicy *mpol;     /* default memory policy for mappings */  }; @@ -48,6 +48,7 @@ extern struct file *shmem_file_setup(const char *name,  					loff_t size, unsigned long flags);  extern int shmem_zero_setup(struct vm_area_struct *);  extern int shmem_lock(struct file *file, int lock, struct user_struct *user); +extern void shmem_unlock_mapping(struct address_space *mapping);  extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,  					pgoff_t index, gfp_t gfp_mask);  extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h index a83833a1f7a..07ceb97d53f 100644 --- a/include/linux/shrinker.h +++ b/include/linux/shrinker.h @@ -35,7 +35,7 @@ struct shrinker {  	/* These are for internal use */  	struct list_head list; -	long nr;	/* objs pending delete */ +	atomic_long_t nr_in_batch; /* objs pending delete */  };  #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */  extern void register_shrinker(struct shrinker *); diff --git a/include/linux/sigma.h b/include/linux/sigma.h deleted file mode 100644 index e2accb3164d..00000000000 --- a/include/linux/sigma.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Load firmware files from Analog Devices SigmaStudio - * - * Copyright 2009-2011 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#ifndef __SIGMA_FIRMWARE_H__ -#define __SIGMA_FIRMWARE_H__ - -#include <linux/firmware.h> -#include <linux/types.h> - -struct i2c_client; - -#define SIGMA_MAGIC "ADISIGM" - -struct sigma_firmware { -	const struct firmware *fw; -	size_t pos; -}; - -struct sigma_firmware_header { -	unsigned char magic[7]; -	u8 version; -	u32 crc; -}; - -enum { -	SIGMA_ACTION_WRITEXBYTES = 0, -	SIGMA_ACTION_WRITESINGLE, -	SIGMA_ACTION_WRITESAFELOAD, -	SIGMA_ACTION_DELAY, -	SIGMA_ACTION_PLLWAIT, -	SIGMA_ACTION_NOOP, -	SIGMA_ACTION_END, -}; - -struct sigma_action { -	u8 instr; -	u8 len_hi; -	u16 len; -	u16 addr; -	unsigned char payload[]; -}; - -static inline u32 sigma_action_len(struct sigma_action *sa) -{ -	return (sa->len_hi << 16) | sa->len; -} - -static inline size_t sigma_action_size(struct sigma_action *sa, u32 payload_len) -{ -	return sizeof(*sa) + payload_len + (payload_len % 2); -} - -extern int process_sigma_firmware(struct i2c_client *client, const char *name); - -#endif diff --git a/include/linux/signal.h b/include/linux/signal.h index a822300a253..7987ce74874 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -254,6 +254,7 @@ extern void set_current_blocked(const sigset_t *);  extern int show_unhandled_signals;  extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); +extern void block_sigmask(struct k_sigaction *ka, int signr);  extern void exit_signals(struct task_struct *tsk);  extern struct kmem_cache *sighand_cachep; diff --git a/include/linux/sirfsoc_dma.h b/include/linux/sirfsoc_dma.h new file mode 100644 index 00000000000..29d959333d8 --- /dev/null +++ b/include/linux/sirfsoc_dma.h @@ -0,0 +1,6 @@ +#ifndef _SIRFSOC_DMA_H_ +#define _SIRFSOC_DMA_H_ + +bool sirfsoc_dma_filter_id(struct dma_chan *chan, void *chan_id); + +#endif diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index fe864885c1e..50db9b04a55 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -30,6 +30,7 @@  #include <linux/dmaengine.h>  #include <linux/hrtimer.h>  #include <linux/dma-mapping.h> +#include <linux/netdev_features.h>  /* Don't change this without changing skb_csum_unnecessary! */  #define CHECKSUM_NONE 0 @@ -87,7 +88,6 @@   *	at device setup time.   *	NETIF_F_HW_CSUM	- it is clever device, it is able to checksum   *			  everything. - *	NETIF_F_NO_CSUM - loopback or reliable single hop media.   *	NETIF_F_IP_CSUM - device is dumb. It is able to csum only   *			  TCP/UDP over IPv4. Sigh. Vendors like this   *			  way by an unknown reason. Though, see comment above @@ -128,13 +128,17 @@ struct sk_buff_head {  struct sk_buff; -/* To allow 64K frame to be packed as single skb without frag_list. Since - * GRO uses frags we allocate at least 16 regardless of page size. +/* To allow 64K frame to be packed as single skb without frag_list we + * require 64K/PAGE_SIZE pages plus 1 additional page to allow for + * buffers which do not start on a page boundary. + * + * Since GRO uses frags we allocate at least 16 regardless of page + * size.   */ -#if (65536/PAGE_SIZE + 2) < 16 +#if (65536/PAGE_SIZE + 1) < 16  #define MAX_SKB_FRAGS 16UL  #else -#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2) +#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)  #endif  typedef struct skb_frag_struct skb_frag_t; @@ -218,6 +222,9 @@ enum {  	/* device driver supports TX zero-copy buffers */  	SKBTX_DEV_ZEROCOPY = 1 << 4, + +	/* generate wifi status information (where possible) */ +	SKBTX_WIFI_STATUS = 1 << 5,  };  /* @@ -235,15 +242,15 @@ struct ubuf_info {   * the end of the header data, ie. at skb->end.   */  struct skb_shared_info { -	unsigned short	nr_frags; +	unsigned char	nr_frags; +	__u8		tx_flags;  	unsigned short	gso_size;  	/* Warning: this field is not always filled in (UFO)! */  	unsigned short	gso_segs;  	unsigned short  gso_type; -	__be32          ip6_frag_id; -	__u8		tx_flags;  	struct sk_buff	*frag_list;  	struct skb_shared_hwtstamps hwtstamps; +	__be32          ip6_frag_id;  	/*  	 * Warning : all fields before dataref are cleared in __alloc_skb() @@ -352,6 +359,8 @@ typedef unsigned char *sk_buff_data_t;   *	@ooo_okay: allow the mapping of a socket to a queue to be changed   *	@l4_rxhash: indicate rxhash is a canonical 4-tuple hash over transport   *		ports. + *	@wifi_acked_valid: wifi_acked was set + *	@wifi_acked: whether frame was acked on wifi or not   *	@dma_cookie: a cookie to one of several possible DMA operations   *		done by skb DMA functions   *	@secmark: security marking @@ -445,10 +454,11 @@ struct sk_buff {  #endif  	__u8			ooo_okay:1;  	__u8			l4_rxhash:1; +	__u8			wifi_acked_valid:1; +	__u8			wifi_acked:1; +	/* 10/12 bit hole (depending on ndisc_nodetype presence) */  	kmemcheck_bitfield_end(flags2); -	/* 0/13 bit hole */ -  #ifdef CONFIG_NET_DMA  	dma_cookie_t		dma_cookie;  #endif @@ -540,6 +550,7 @@ extern void consume_skb(struct sk_buff *skb);  extern void	       __kfree_skb(struct sk_buff *skb);  extern struct sk_buff *__alloc_skb(unsigned int size,  				   gfp_t priority, int fclone, int node); +extern struct sk_buff *build_skb(void *data);  static inline struct sk_buff *alloc_skb(unsigned int size,  					gfp_t priority)  { @@ -561,8 +572,9 @@ extern struct sk_buff *skb_clone(struct sk_buff *skb,  				 gfp_t priority);  extern struct sk_buff *skb_copy(const struct sk_buff *skb,  				gfp_t priority); -extern struct sk_buff *pskb_copy(struct sk_buff *skb, -				 gfp_t gfp_mask); +extern struct sk_buff *__pskb_copy(struct sk_buff *skb, +				 int headroom, gfp_t gfp_mask); +  extern int	       pskb_expand_head(struct sk_buff *skb,  					int nhead, int ntail,  					gfp_t gfp_mask); @@ -1662,38 +1674,6 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,  }  /** - *	__netdev_alloc_page - allocate a page for ps-rx on a specific device - *	@dev: network device to receive on - *	@gfp_mask: alloc_pages_node mask - * - * 	Allocate a new page. dev currently unused. - * - * 	%NULL is returned if there is no free memory. - */ -static inline struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask) -{ -	return alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0); -} - -/** - *	netdev_alloc_page - allocate a page for ps-rx on a specific device - *	@dev: network device to receive on - * - * 	Allocate a new page. dev currently unused. - * - * 	%NULL is returned if there is no free memory. - */ -static inline struct page *netdev_alloc_page(struct net_device *dev) -{ -	return __netdev_alloc_page(dev, GFP_ATOMIC); -} - -static inline void netdev_free_page(struct net_device *dev, struct page *page) -{ -	__free_page(page); -} - -/**   * skb_frag_page - retrieve the page refered to by a paged fragment   * @frag: the paged fragment   * @@ -1824,6 +1804,12 @@ static inline dma_addr_t skb_frag_dma_map(struct device *dev,  			    frag->page_offset + offset, size, dir);  } +static inline struct sk_buff *pskb_copy(struct sk_buff *skb, +					gfp_t gfp_mask) +{ +	return __pskb_copy(skb, skb_headroom(skb), gfp_mask); +} +  /**   *	skb_clone_writable - is the header of a clone writable   *	@skb: buffer to check @@ -2105,7 +2091,8 @@ extern void	       skb_split(struct sk_buff *skb,  extern int	       skb_shift(struct sk_buff *tgt, struct sk_buff *skb,  				 int shiftlen); -extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features); +extern struct sk_buff *skb_segment(struct sk_buff *skb, +				   netdev_features_t features);  static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,  				       int len, void *buffer) @@ -2263,6 +2250,15 @@ static inline void skb_tx_timestamp(struct sk_buff *skb)  	sw_tx_timestamp(skb);  } +/** + * skb_complete_wifi_ack - deliver skb with wifi status + * + * @skb: the original outgoing packet + * @acked: ack status + * + */ +void skb_complete_wifi_ack(struct sk_buff *skb, bool acked); +  extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);  extern __sum16 __skb_checksum_complete(struct sk_buff *skb); diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h index d00e0bacda9..fbd1117fdfd 100644 --- a/include/linux/slab_def.h +++ b/include/linux/slab_def.h @@ -15,8 +15,6 @@  #include <asm/cache.h>		/* kmalloc_sizes.h needs L1_CACHE_BYTES */  #include <linux/compiler.h> -#include <trace/events/kmem.h> -  /*   * struct kmem_cache   * diff --git a/include/linux/smscphy.h b/include/linux/smscphy.h new file mode 100644 index 00000000000..ce718cbce43 --- /dev/null +++ b/include/linux/smscphy.h @@ -0,0 +1,25 @@ +#ifndef __LINUX_SMSCPHY_H__ +#define __LINUX_SMSCPHY_H__ + +#define MII_LAN83C185_ISF 29 /* Interrupt Source Flags */ +#define MII_LAN83C185_IM  30 /* Interrupt Mask */ +#define MII_LAN83C185_CTRL_STATUS 17 /* Mode/Status Register */ + +#define MII_LAN83C185_ISF_INT1 (1<<1) /* Auto-Negotiation Page Received */ +#define MII_LAN83C185_ISF_INT2 (1<<2) /* Parallel Detection Fault */ +#define MII_LAN83C185_ISF_INT3 (1<<3) /* Auto-Negotiation LP Ack */ +#define MII_LAN83C185_ISF_INT4 (1<<4) /* Link Down */ +#define MII_LAN83C185_ISF_INT5 (1<<5) /* Remote Fault Detected */ +#define MII_LAN83C185_ISF_INT6 (1<<6) /* Auto-Negotiation complete */ +#define MII_LAN83C185_ISF_INT7 (1<<7) /* ENERGYON */ + +#define MII_LAN83C185_ISF_INT_ALL (0x0e) + +#define MII_LAN83C185_ISF_INT_PHYLIB_EVENTS \ +	(MII_LAN83C185_ISF_INT6 | MII_LAN83C185_ISF_INT4 | \ +	 MII_LAN83C185_ISF_INT7) + +#define MII_LAN83C185_EDPWRDOWN (1 << 13) /* EDPWRDOWN */ +#define MII_LAN83C185_ENERGYON  (1 << 1)  /* ENERGYON */ + +#endif /* __LINUX_SMSCPHY_H__ */ diff --git a/include/linux/snmp.h b/include/linux/snmp.h index e16557a357e..c1241c42817 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -192,7 +192,6 @@ enum  	LINUX_MIB_TCPPARTIALUNDO,		/* TCPPartialUndo */  	LINUX_MIB_TCPDSACKUNDO,			/* TCPDSACKUndo */  	LINUX_MIB_TCPLOSSUNDO,			/* TCPLossUndo */ -	LINUX_MIB_TCPLOSS,			/* TCPLoss */  	LINUX_MIB_TCPLOSTRETRANSMIT,		/* TCPLostRetransmit */  	LINUX_MIB_TCPRENOFAILURES,		/* TCPRenoFailures */  	LINUX_MIB_TCPSACKFAILURES,		/* TCPSackFailures */ diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h new file mode 100644 index 00000000000..251729a4788 --- /dev/null +++ b/include/linux/sock_diag.h @@ -0,0 +1,48 @@ +#ifndef __SOCK_DIAG_H__ +#define __SOCK_DIAG_H__ + +#include <linux/types.h> + +#define SOCK_DIAG_BY_FAMILY 20 + +struct sock_diag_req { +	__u8	sdiag_family; +	__u8	sdiag_protocol; +}; + +enum { +	SK_MEMINFO_RMEM_ALLOC, +	SK_MEMINFO_RCVBUF, +	SK_MEMINFO_WMEM_ALLOC, +	SK_MEMINFO_SNDBUF, +	SK_MEMINFO_FWD_ALLOC, +	SK_MEMINFO_WMEM_QUEUED, +	SK_MEMINFO_OPTMEM, + +	SK_MEMINFO_VARS, +}; + +#ifdef __KERNEL__ +struct sk_buff; +struct nlmsghdr; +struct sock; + +struct sock_diag_handler { +	__u8 family; +	int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh); +}; + +int sock_diag_register(struct sock_diag_handler *h); +void sock_diag_unregister(struct sock_diag_handler *h); + +void sock_diag_register_inet_compat(int (*fn)(struct sk_buff *skb, struct nlmsghdr *nlh)); +void sock_diag_unregister_inet_compat(int (*fn)(struct sk_buff *skb, struct nlmsghdr *nlh)); + +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); + +extern struct sock *sock_diag_nlsk; +#endif /* KERNEL */ +#endif diff --git a/include/linux/sound.h b/include/linux/sound.h index 44dcf057043..fae20ba01fb 100644 --- a/include/linux/sound.h +++ b/include/linux/sound.h @@ -1,3 +1,5 @@ +#ifndef _LINUX_SOUND_H +#define _LINUX_SOUND_H  /*   * Minor numbers for the sound driver. @@ -42,3 +44,5 @@ extern void unregister_sound_mixer(int unit);  extern void unregister_sound_midi(int unit);  extern void unregister_sound_dsp(int unit);  #endif /* __KERNEL__ */ + +#endif /* _LINUX_SOUND_H */ diff --git a/include/linux/soundcard.h b/include/linux/soundcard.h index fe204fe39f7..dfcf86f013a 100644 --- a/include/linux/soundcard.h +++ b/include/linux/soundcard.h @@ -198,7 +198,8 @@ typedef struct seq_event_rec {  #  else  #    error "could not determine byte order"  #  endif -#elif defined(__BYTE_ORDER) +#else +# if defined(__BYTE_ORDER)  #  if __BYTE_ORDER == __BIG_ENDIAN  #    define AFMT_S16_NE AFMT_S16_BE  #  elif __BYTE_ORDER == __LITTLE_ENDIAN @@ -206,6 +207,7 @@ typedef struct seq_event_rec {  #  else  #    error "could not determine byte order"  #  endif +# endif  #endif  /* diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index bb4f5fbbbd8..176fce9cc6b 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -200,6 +200,17 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)  		driver_unregister(&sdrv->driver);  } +/** + * module_spi_driver() - Helper macro for registering a SPI driver + * @__spi_driver: spi_driver struct + * + * Helper macro for SPI drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_spi_driver(__spi_driver) \ +	module_driver(__spi_driver, spi_register_driver, \ +			spi_unregister_driver)  /**   * struct spi_master - interface to SPI master controller diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 58971e891f4..e1b005918bb 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h @@ -28,6 +28,7 @@  #define _LINUX_SRCU_H  #include <linux/mutex.h> +#include <linux/rcupdate.h>  struct srcu_struct_array {  	int c[2]; @@ -60,18 +61,10 @@ int __init_srcu_struct(struct srcu_struct *sp, const char *name,  	__init_srcu_struct((sp), #sp, &__srcu_key); \  }) -# define srcu_read_acquire(sp) \ -		lock_acquire(&(sp)->dep_map, 0, 0, 2, 1, NULL, _THIS_IP_) -# define srcu_read_release(sp) \ -		lock_release(&(sp)->dep_map, 1, _THIS_IP_) -  #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */  int init_srcu_struct(struct srcu_struct *sp); -# define srcu_read_acquire(sp)  do { } while (0) -# define srcu_read_release(sp)  do { } while (0) -  #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */  void cleanup_srcu_struct(struct srcu_struct *sp); @@ -90,12 +83,32 @@ long srcu_batches_completed(struct srcu_struct *sp);   * read-side critical section.  In absence of CONFIG_DEBUG_LOCK_ALLOC,   * this assumes we are in an SRCU read-side critical section unless it can   * prove otherwise. + * + * Checks debug_lockdep_rcu_enabled() to prevent false positives during boot + * and while lockdep is disabled. + * + * Note that if the CPU is in the idle loop from an RCU point of view + * (ie: that we are in the section between rcu_idle_enter() and + * rcu_idle_exit()) then srcu_read_lock_held() returns false even if + * the CPU did an srcu_read_lock().  The reason for this is that RCU + * ignores CPUs that are in such a section, considering these as in + * extended quiescent state, so such a CPU is effectively never in an + * RCU read-side critical section regardless of what RCU primitives it + * invokes.  This state of affairs is required --- we need to keep an + * RCU-free window in idle where the CPU may possibly enter into low + * power mode. This way we can notice an extended quiescent state to + * other CPUs that started a grace period. Otherwise we would delay any + * grace period as long as we run in the idle task.   */  static inline int srcu_read_lock_held(struct srcu_struct *sp)  { -	if (debug_locks) -		return lock_is_held(&sp->dep_map); -	return 1; +	if (rcu_is_cpu_idle()) +		return 0; + +	if (!debug_lockdep_rcu_enabled()) +		return 1; + +	return lock_is_held(&sp->dep_map);  }  #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -145,12 +158,17 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp)   * one way to indirectly wait on an SRCU grace period is to acquire   * a mutex that is held elsewhere while calling synchronize_srcu() or   * synchronize_srcu_expedited(). + * + * Note that srcu_read_lock() and the matching srcu_read_unlock() must + * occur in the same context, for example, it is illegal to invoke + * srcu_read_unlock() in an irq handler if the matching srcu_read_lock() + * was invoked in process context.   */  static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp)  {  	int retval = __srcu_read_lock(sp); -	srcu_read_acquire(sp); +	rcu_lock_acquire(&(sp)->dep_map);  	return retval;  } @@ -164,8 +182,51 @@ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp)  static inline void srcu_read_unlock(struct srcu_struct *sp, int idx)  	__releases(sp)  { -	srcu_read_release(sp); +	rcu_lock_release(&(sp)->dep_map); +	__srcu_read_unlock(sp, idx); +} + +/** + * srcu_read_lock_raw - register a new reader for an SRCU-protected structure. + * @sp: srcu_struct in which to register the new reader. + * + * Enter an SRCU read-side critical section.  Similar to srcu_read_lock(), + * but avoids the RCU-lockdep checking.  This means that it is legal to + * use srcu_read_lock_raw() in one context, for example, in an exception + * handler, and then have the matching srcu_read_unlock_raw() in another + * context, for example in the task that took the exception. + * + * However, the entire SRCU read-side critical section must reside within a + * single task.  For example, beware of using srcu_read_lock_raw() in + * a device interrupt handler and srcu_read_unlock() in the interrupted + * task:  This will not work if interrupts are threaded. + */ +static inline int srcu_read_lock_raw(struct srcu_struct *sp) +{ +	unsigned long flags; +	int ret; + +	local_irq_save(flags); +	ret =  __srcu_read_lock(sp); +	local_irq_restore(flags); +	return ret; +} + +/** + * srcu_read_unlock_raw - unregister reader from an SRCU-protected structure. + * @sp: srcu_struct in which to unregister the old reader. + * @idx: return value from corresponding srcu_read_lock_raw(). + * + * Exit an SRCU read-side critical section without lockdep-RCU checking. + * See srcu_read_lock_raw() for more details. + */ +static inline void srcu_read_unlock_raw(struct srcu_struct *sp, int idx) +{ +	unsigned long flags; + +	local_irq_save(flags);  	__srcu_read_unlock(sp, idx); +	local_irq_restore(flags);  }  #endif diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index 061e560251b..dcf35b0f303 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -94,6 +94,15 @@ struct ssb_sprom {  		} ghz5;		/* 5GHz band */  	} antenna_gain; +	struct { +		struct { +			u8 tssipos, extpa_gain, pdet_range, tr_iso, antswlut; +		} ghz2; +		struct { +			u8 tssipos, extpa_gain, pdet_range, tr_iso, antswlut; +		} ghz5; +	} fem; +  	/* TODO - add any parameters needed from rev 2, 3, 4, 5 or 8 SPROMs */  }; diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index 98941203a27..c814ae6eeb2 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h @@ -432,6 +432,23 @@  #define  SSB_SPROM8_RXPO2G		0x00FF	/* 2GHz RX power offset */  #define  SSB_SPROM8_RXPO5G		0xFF00	/* 5GHz RX power offset */  #define  SSB_SPROM8_RXPO5G_SHIFT	8 +#define SSB_SPROM8_FEM2G		0x00AE +#define SSB_SPROM8_FEM5G		0x00B0 +#define  SSB_SROM8_FEM_TSSIPOS		0x0001 +#define  SSB_SROM8_FEM_TSSIPOS_SHIFT	0 +#define  SSB_SROM8_FEM_EXTPA_GAIN	0x0006 +#define  SSB_SROM8_FEM_EXTPA_GAIN_SHIFT	1 +#define  SSB_SROM8_FEM_PDET_RANGE	0x00F8 +#define  SSB_SROM8_FEM_PDET_RANGE_SHIFT	3 +#define  SSB_SROM8_FEM_TR_ISO		0x0700 +#define  SSB_SROM8_FEM_TR_ISO_SHIFT	8 +#define  SSB_SROM8_FEM_ANTSWLUT		0xF800 +#define  SSB_SROM8_FEM_ANTSWLUT_SHIFT	11 +#define SSB_SPROM8_THERMAL		0x00B2 +#define SSB_SPROM8_MPWR_RAWTS		0x00B4 +#define SSB_SPROM8_TS_SLP_OPT_CORRX	0x00B6 +#define SSB_SPROM8_FOC_HWIQ_IQSWP	0x00B8 +#define SSB_SPROM8_PHYCAL_TEMPDELTA	0x00BA  #define SSB_SPROM8_MAXP_BG		0x00C0  /* Max Power 2GHz in path 1 */  #define  SSB_SPROM8_MAXP_BG_MASK	0x00FF  /* Mask for Max Power 2GHz */  #define  SSB_SPROM8_ITSSI_BG		0xFF00	/* Mask for path 1 itssi_bg */ diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index febc4dbec2c..7874a8a5663 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h @@ -26,6 +26,7 @@ struct auth_cred {  	uid_t	uid;  	gid_t	gid;  	struct group_info *group_info; +	const char *principal;  	unsigned char machine_cred : 1;  }; @@ -127,7 +128,7 @@ void			rpc_destroy_generic_auth(void);  void 			rpc_destroy_authunix(void);  struct rpc_cred *	rpc_lookup_cred(void); -struct rpc_cred *	rpc_lookup_machine_cred(void); +struct rpc_cred *	rpc_lookup_machine_cred(const char *service_name);  int			rpcauth_register(const struct rpc_authops *);  int			rpcauth_unregister(const struct rpc_authops *);  struct rpc_auth *	rpcauth_create(rpc_authflavor_t, struct rpc_clnt *); diff --git a/include/linux/sunrpc/auth_gss.h b/include/linux/sunrpc/auth_gss.h index 8eee9dbbfe7..f1cfd4c85cd 100644 --- a/include/linux/sunrpc/auth_gss.h +++ b/include/linux/sunrpc/auth_gss.h @@ -82,8 +82,8 @@ struct gss_cred {  	enum rpc_gss_svc	gc_service;  	struct gss_cl_ctx __rcu	*gc_ctx;  	struct gss_upcall_msg	*gc_upcall; +	const char		*gc_principal;  	unsigned long		gc_upcall_timestamp; -	unsigned char		gc_machine_cred : 1;  };  #endif /* __KERNEL__ */ diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 5efd8cef389..57531f8e595 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -203,7 +203,7 @@ extern void cache_unregister(struct cache_detail *cd);  extern void cache_unregister_net(struct cache_detail *cd, struct net *net);  extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, -					mode_t, struct cache_detail *); +					umode_t, struct cache_detail *);  extern void sunrpc_cache_unregister_pipefs(struct cache_detail *);  extern void qword_add(char **bpp, int *lp, char *str); diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 3d8f9c44e27..2c5993a17c3 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -215,7 +215,7 @@ static inline bool __rpc_copy_addr4(struct sockaddr *dst,  	return true;  } -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,  				   const struct sockaddr *sap2)  { @@ -237,10 +237,10 @@ static inline bool __rpc_copy_addr6(struct sockaddr *dst,  	struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst;  	dsin6->sin6_family = ssin6->sin6_family; -	ipv6_addr_copy(&dsin6->sin6_addr, &ssin6->sin6_addr); +	dsin6->sin6_addr = ssin6->sin6_addr;  	return true;  } -#else	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ +#else	/* !(IS_ENABLED(CONFIG_IPV6) */  static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,  				   const struct sockaddr *sap2)  { @@ -252,7 +252,7 @@ static inline bool __rpc_copy_addr6(struct sockaddr *dst,  {  	return false;  } -#endif	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ +#endif	/* !(IS_ENABLED(CONFIG_IPV6) */  /**   * rpc_cmp_addr - compare the address portion of two sockaddrs. diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index e4ea43058d8..2bb03d77375 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -55,7 +55,7 @@ extern int rpc_remove_client_dir(struct dentry *);  struct cache_detail;  extern struct dentry *rpc_create_cache_dir(struct dentry *,  					   struct qstr *, -					   mode_t umode, +					   umode_t umode,  					   struct cache_detail *);  extern void rpc_remove_cache_dir(struct dentry *); diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 8620f79658d..dfa900948af 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -109,7 +109,7 @@ static inline int register_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u  int	svc_reg_xprt_class(struct svc_xprt_class *);  void	svc_unreg_xprt_class(struct svc_xprt_class *); -void	svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *, +void	svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *,  		      struct svc_serv *);  int	svc_create_xprt(struct svc_serv *, const char *, struct net *,  			const int, const unsigned short, int); @@ -118,7 +118,6 @@ void	svc_xprt_received(struct svc_xprt *);  void	svc_xprt_put(struct svc_xprt *xprt);  void	svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);  void	svc_close_xprt(struct svc_xprt *xprt); -void	svc_delete_xprt(struct svc_xprt *xprt);  int	svc_port_is_privileged(struct sockaddr *sin);  int	svc_print_xprts(char *buf, int maxlen);  struct	svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name, diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h index 85c50b40759..c84e9741cb2 100644 --- a/include/linux/sunrpc/svcsock.h +++ b/include/linux/sunrpc/svcsock.h @@ -34,7 +34,7 @@ struct svc_sock {  /*   * Function prototypes.   */ -void		svc_close_all(struct list_head *); +void		svc_close_all(struct svc_serv *);  int		svc_recv(struct svc_rqst *, long);  int		svc_send(struct svc_rqst *);  void		svc_drop(struct svc_rqst *); diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index a20970ef9e4..af70af33354 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -191,6 +191,8 @@ extern int xdr_decode_array2(struct xdr_buf *buf, unsigned int base,  			     struct xdr_array2_desc *desc);  extern int xdr_encode_array2(struct xdr_buf *buf, unsigned int base,  			     struct xdr_array2_desc *desc); +extern void _copy_from_pages(char *p, struct page **pages, size_t pgbase, +			     size_t len);  /*   * Provide some simple tools for XDR buffer overflow-checking etc. diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 57a692432f8..91784a4f860 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -6,6 +6,7 @@  #include <linux/init.h>  #include <linux/pm.h>  #include <linux/mm.h> +#include <linux/freezer.h>  #include <asm/errno.h>  #ifdef CONFIG_VT @@ -331,6 +332,8 @@ static inline bool system_entering_hibernation(void) { return false; }  #define PM_RESTORE_PREPARE	0x0005 /* Going to restore a saved image */  #define PM_POST_RESTORE		0x0006 /* Restore failed */ +extern struct mutex pm_mutex; +  #ifdef CONFIG_PM_SLEEP  void save_processor_state(void);  void restore_processor_state(void); @@ -351,6 +354,34 @@ extern bool events_check_enabled;  extern bool pm_wakeup_pending(void);  extern bool pm_get_wakeup_count(unsigned int *count);  extern bool pm_save_wakeup_count(unsigned int count); + +static inline void lock_system_sleep(void) +{ +	current->flags |= PF_FREEZER_SKIP; +	mutex_lock(&pm_mutex); +} + +static inline void unlock_system_sleep(void) +{ +	/* +	 * Don't use freezer_count() because we don't want the call to +	 * try_to_freeze() here. +	 * +	 * Reason: +	 * Fundamentally, we just don't need it, because freezing condition +	 * doesn't come into effect until we release the pm_mutex lock, +	 * since the freezer always works with pm_mutex held. +	 * +	 * More importantly, in the case of hibernation, +	 * unlock_system_sleep() gets called in snapshot_read() and +	 * snapshot_write() when the freezing condition is still in effect. +	 * Which means, if we use try_to_freeze() here, it would make them +	 * enter the refrigerator, thus causing hibernation to lockup. +	 */ +	current->flags &= ~PF_FREEZER_SKIP; +	mutex_unlock(&pm_mutex); +} +  #else /* !CONFIG_PM_SLEEP */  static inline int register_pm_notifier(struct notifier_block *nb) @@ -366,28 +397,11 @@ static inline int unregister_pm_notifier(struct notifier_block *nb)  #define pm_notifier(fn, pri)	do { (void)(fn); } while (0)  static inline bool pm_wakeup_pending(void) { return false; } -#endif /* !CONFIG_PM_SLEEP */ - -extern struct mutex pm_mutex; -#ifndef CONFIG_HIBERNATE_CALLBACKS  static inline void lock_system_sleep(void) {}  static inline void unlock_system_sleep(void) {} -#else - -/* Let some subsystems like memory hotadd exclude hibernation */ - -static inline void lock_system_sleep(void) -{ -	mutex_lock(&pm_mutex); -} - -static inline void unlock_system_sleep(void) -{ -	mutex_unlock(&pm_mutex); -} -#endif +#endif /* !CONFIG_PM_SLEEP */  #ifdef CONFIG_ARCH_SAVE_PAGE_KEYS  /* diff --git a/include/linux/swap.h b/include/linux/swap.h index 1e22e126d2a..3e60228e729 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -207,6 +207,7 @@ struct swap_list_t {  /* linux/mm/page_alloc.c */  extern unsigned long totalram_pages;  extern unsigned long totalreserve_pages; +extern unsigned long dirty_balance_reserve;  extern unsigned int nr_free_buffer_pages(void);  extern unsigned int nr_free_pagecache_pages(void); @@ -272,7 +273,7 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order)  #endif  extern int page_evictable(struct page *page, struct vm_area_struct *vma); -extern void scan_mapping_unevictable_pages(struct address_space *); +extern void check_move_unevictable_pages(struct page **, int nr_pages);  extern unsigned long scan_unevictable_pages;  extern int scan_unevictable_handler(struct ctl_table *, int, diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 445702c60d0..e872526fdc5 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -24,7 +24,7 @@ extern int swiotlb_force;  extern void swiotlb_init(int verbose);  extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); -extern unsigned long swioltb_nr_tbl(void); +extern unsigned long swiotlb_nr_tbl(void);  /*   * Enumeration for sync targets diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 86a24b1166d..515669fa3c1 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -475,7 +475,7 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,  asmlinkage long sys_pivot_root(const char __user *new_root,  				const char __user *put_old);  asmlinkage long sys_chroot(const char __user *filename); -asmlinkage long sys_mknod(const char __user *filename, int mode, +asmlinkage long sys_mknod(const char __user *filename, umode_t mode,  				unsigned dev);  asmlinkage long sys_link(const char __user *oldname,  				const char __user *newname); @@ -483,8 +483,8 @@ asmlinkage long sys_symlink(const char __user *old, const char __user *new);  asmlinkage long sys_unlink(const char __user *pathname);  asmlinkage long sys_rename(const char __user *oldname,  				const char __user *newname); -asmlinkage long sys_chmod(const char __user *filename, mode_t mode); -asmlinkage long sys_fchmod(unsigned int fd, mode_t mode); +asmlinkage long sys_chmod(const char __user *filename, umode_t mode); +asmlinkage long sys_fchmod(unsigned int fd, umode_t mode);  asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg);  #if BITS_PER_LONG == 32 @@ -517,9 +517,9 @@ asmlinkage long sys_sendfile64(int out_fd, int in_fd,  			       loff_t __user *offset, size_t count);  asmlinkage long sys_readlink(const char __user *path,  				char __user *buf, int bufsiz); -asmlinkage long sys_creat(const char __user *pathname, int mode); +asmlinkage long sys_creat(const char __user *pathname, umode_t mode);  asmlinkage long sys_open(const char __user *filename, -				int flags, int mode); +				int flags, umode_t mode);  asmlinkage long sys_close(unsigned int fd);  asmlinkage long sys_access(const char __user *filename, int mode);  asmlinkage long sys_vhangup(void); @@ -582,7 +582,7 @@ asmlinkage long sys_preadv(unsigned long fd, const struct iovec __user *vec,  asmlinkage long sys_pwritev(unsigned long fd, const struct iovec __user *vec,  			    unsigned long vlen, unsigned long pos_l, unsigned long pos_h);  asmlinkage long sys_getcwd(char __user *buf, unsigned long size); -asmlinkage long sys_mkdir(const char __user *pathname, int mode); +asmlinkage long sys_mkdir(const char __user *pathname, umode_t mode);  asmlinkage long sys_chdir(const char __user *filename);  asmlinkage long sys_fchdir(unsigned int fd);  asmlinkage long sys_rmdir(const char __user *pathname); @@ -679,7 +679,7 @@ asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);  asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second,  		unsigned long third, void __user *ptr, long fifth); -asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr); +asmlinkage long sys_mq_open(const char __user *name, int oflag, umode_t mode, struct mq_attr __user *attr);  asmlinkage long sys_mq_unlink(const char __user *name);  asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user *abs_timeout);  asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout); @@ -753,11 +753,11 @@ asmlinkage long sys_inotify_rm_watch(int fd, __s32 wd);  asmlinkage long sys_spu_run(int fd, __u32 __user *unpc,  				 __u32 __user *ustatus);  asmlinkage long sys_spu_create(const char __user *name, -		unsigned int flags, mode_t mode, int fd); +		unsigned int flags, umode_t mode, int fd); -asmlinkage long sys_mknodat(int dfd, const char __user * filename, int mode, +asmlinkage long sys_mknodat(int dfd, const char __user * filename, umode_t mode,  			    unsigned dev); -asmlinkage long sys_mkdirat(int dfd, const char __user * pathname, int mode); +asmlinkage long sys_mkdirat(int dfd, const char __user * pathname, umode_t mode);  asmlinkage long sys_unlinkat(int dfd, const char __user * pathname, int flag);  asmlinkage long sys_symlinkat(const char __user * oldname,  			      int newdfd, const char __user * newname); @@ -769,11 +769,11 @@ asmlinkage long sys_futimesat(int dfd, const char __user *filename,  			      struct timeval __user *utimes);  asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode);  asmlinkage long sys_fchmodat(int dfd, const char __user * filename, -			     mode_t mode); +			     umode_t mode);  asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,  			     gid_t group, int flag);  asmlinkage long sys_openat(int dfd, const char __user *filename, int flags, -			   int mode); +			   umode_t mode);  asmlinkage long sys_newfstatat(int dfd, const char __user *filename,  			       struct stat __user *statbuf, int flag);  asmlinkage long sys_fstatat64(int dfd, const char __user *filename, diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 703cfa33a3c..bb9127dd814 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -1038,7 +1038,7 @@ struct ctl_table  	const char *procname;		/* Text ID for /proc/sys, or zero */  	void *data;  	int maxlen; -	mode_t mode; +	umode_t mode;  	struct ctl_table *child;  	struct ctl_table *parent;	/* Automatically set */  	proc_handler *proc_handler;	/* Callback for text formatting */ diff --git a/include/linux/sysdev.h b/include/linux/sysdev.h deleted file mode 100644 index 20f63d3e614..00000000000 --- a/include/linux/sysdev.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * System devices follow a slightly different driver model.  - * They don't need to do dynammic driver binding, can't be probed,  - * and don't reside on any type of peripheral bus.  - * So, we represent and treat them a little differently. - *  - * We still have a notion of a driver for a system device, because we still - * want to perform basic operations on these devices.  - * - * We also support auxiliary drivers binding to devices of a certain class. - *  - * This allows configurable drivers to register themselves for devices of - * a certain type. And, it allows class definitions to reside in generic - * code while arch-specific code can register specific drivers. - * - * Auxiliary drivers registered with a NULL cls are registered as drivers - * for all system devices, and get notification calls for each device.  - */ - - -#ifndef _SYSDEV_H_ -#define _SYSDEV_H_ - -#include <linux/kobject.h> -#include <linux/pm.h> - - -struct sys_device; -struct sysdev_class_attribute; - -struct sysdev_class { -	const char *name; -	struct list_head	drivers; -	struct sysdev_class_attribute **attrs; -	struct kset		kset; -}; - -struct sysdev_class_attribute { -	struct attribute attr; -	ssize_t (*show)(struct sysdev_class *, struct sysdev_class_attribute *, -			char *); -	ssize_t (*store)(struct sysdev_class *, struct sysdev_class_attribute *, -			 const char *, size_t); -}; - -#define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) 		\ -{					 			\ -	.attr = {.name = __stringify(_name), .mode = _mode },	\ -	.show	= _show,					\ -	.store	= _store,					\ -} - -#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) 		\ -	struct sysdev_class_attribute attr_##_name = 		\ -		_SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) - - -extern int sysdev_class_register(struct sysdev_class *); -extern void sysdev_class_unregister(struct sysdev_class *); - -extern int sysdev_class_create_file(struct sysdev_class *, -	struct sysdev_class_attribute *); -extern void sysdev_class_remove_file(struct sysdev_class *, -	struct sysdev_class_attribute *); -/** - * Auxiliary system device drivers. - */ - -struct sysdev_driver { -	struct list_head	entry; -	int	(*add)(struct sys_device *); -	int	(*remove)(struct sys_device *); -}; - - -extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *); -extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *); - - -/** - * sys_devices can be simplified a lot from regular devices, because they're - * simply not as versatile.  - */ - -struct sys_device { -	u32		id; -	struct sysdev_class	* cls; -	struct kobject		kobj; -}; - -extern int sysdev_register(struct sys_device *); -extern void sysdev_unregister(struct sys_device *); - - -struct sysdev_attribute {  -	struct attribute	attr; -	ssize_t (*show)(struct sys_device *, struct sysdev_attribute *, char *); -	ssize_t (*store)(struct sys_device *, struct sysdev_attribute *, -			 const char *, size_t); -}; - - -#define _SYSDEV_ATTR(_name, _mode, _show, _store)		\ -{								\ -	.attr = { .name = __stringify(_name), .mode = _mode },	\ -	.show	= _show,					\ -	.store	= _store,					\ -} - -#define SYSDEV_ATTR(_name, _mode, _show, _store)		\ -	struct sysdev_attribute attr_##_name =			\ -		_SYSDEV_ATTR(_name, _mode, _show, _store); - -extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *); -extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *); - -/* Create/remove NULL terminated attribute list */ -static inline int -sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a) -{ -	return sysfs_create_files(&d->kobj, (const struct attribute **)a); -} - -static inline void -sysdev_remove_files(struct sys_device *d, struct sysdev_attribute **a) -{ -	return sysfs_remove_files(&d->kobj, (const struct attribute **)a); -} - -struct sysdev_ext_attribute { -	struct sysdev_attribute attr; -	void *var; -}; - -/* - * Support for simple variable sysdev attributes. - * The pointer to the variable is stored in a sysdev_ext_attribute - */ - -/* Add more types as needed */ - -extern ssize_t sysdev_show_ulong(struct sys_device *, struct sysdev_attribute *, -				char *); -extern ssize_t sysdev_store_ulong(struct sys_device *, -			struct sysdev_attribute *, const char *, size_t); -extern ssize_t sysdev_show_int(struct sys_device *, struct sysdev_attribute *, -				char *); -extern ssize_t sysdev_store_int(struct sys_device *, -			struct sysdev_attribute *, const char *, size_t); - -#define _SYSDEV_ULONG_ATTR(_name, _mode, _var)				\ -	{ _SYSDEV_ATTR(_name, _mode, sysdev_show_ulong, sysdev_store_ulong), \ -	  &(_var) } -#define SYSDEV_ULONG_ATTR(_name, _mode, _var)			\ -	struct sysdev_ext_attribute attr_##_name = 		\ -		_SYSDEV_ULONG_ATTR(_name, _mode, _var); -#define _SYSDEV_INT_ATTR(_name, _mode, _var)				\ -	{ _SYSDEV_ATTR(_name, _mode, sysdev_show_int, sysdev_store_int), \ -	  &(_var) } -#define SYSDEV_INT_ATTR(_name, _mode, _var)			\ -	struct sysdev_ext_attribute attr_##_name = 		\ -		_SYSDEV_INT_ATTR(_name, _mode, _var); - -#endif /* _SYSDEV_H_ */ diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index dac0859e644..0010009b2f0 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -25,7 +25,7 @@ enum kobj_ns_type;  struct attribute {  	const char		*name; -	mode_t			mode; +	umode_t			mode;  #ifdef CONFIG_DEBUG_LOCK_ALLOC  	struct lock_class_key	*key;  	struct lock_class_key	skey; @@ -55,7 +55,7 @@ do {							\  struct attribute_group {  	const char		*name; -	mode_t			(*is_visible)(struct kobject *, +	umode_t			(*is_visible)(struct kobject *,  					      struct attribute *, int);  	struct attribute	**attrs;  }; @@ -133,7 +133,7 @@ int __must_check sysfs_create_file(struct kobject *kobj,  int __must_check sysfs_create_files(struct kobject *kobj,  				   const struct attribute **attr);  int __must_check sysfs_chmod_file(struct kobject *kobj, -				  const struct attribute *attr, mode_t mode); +				  const struct attribute *attr, umode_t mode);  void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr);  void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); @@ -221,7 +221,7 @@ static inline int sysfs_create_files(struct kobject *kobj,  }  static inline int sysfs_chmod_file(struct kobject *kobj, -				   const struct attribute *attr, mode_t mode) +				   const struct attribute *attr, umode_t mode)  {  	return 0;  } diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 7f59ee94698..46a85c9e1f2 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -238,6 +238,11 @@ struct tcp_sack_block {  	u32	end_seq;  }; +/*These are used to set the sack_ok field in struct tcp_options_received */ +#define TCP_SACK_SEEN     (1 << 0)   /*1 = peer is SACK capable, */ +#define TCP_FACK_ENABLED  (1 << 1)   /*1 = FACK is enabled locally*/ +#define TCP_DSACK_SEEN    (1 << 2)   /*1 = DSACK was received from peer*/ +  struct tcp_options_received {  /*	PAWS/RTTM data	*/  	long	ts_recent_stamp;/* Time we stored ts_recent (for aging) */ diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 47b4a27e6e9..796f1ff0388 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -152,9 +152,9 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,  void thermal_cooling_device_unregister(struct thermal_cooling_device *);  #ifdef CONFIG_NET -extern int generate_netlink_event(u32 orig, enum events event); +extern int thermal_generate_netlink_event(u32 orig, enum events event);  #else -static inline int generate_netlink_event(u32 orig, enum events event) +static inline int thermal_generate_netlink_event(u32 orig, enum events event)  {  	return 0;  } diff --git a/include/linux/tick.h b/include/linux/tick.h index b232ccc0ee2..ab8be90b5cc 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -7,6 +7,7 @@  #define _LINUX_TICK_H  #include <linux/clockchips.h> +#include <linux/irqflags.h>  #ifdef CONFIG_GENERIC_CLOCKEVENTS @@ -121,14 +122,16 @@ static inline int tick_oneshot_mode_active(void) { return 0; }  #endif /* !CONFIG_GENERIC_CLOCKEVENTS */  # ifdef CONFIG_NO_HZ -extern void tick_nohz_stop_sched_tick(int inidle); -extern void tick_nohz_restart_sched_tick(void); +extern void tick_nohz_idle_enter(void); +extern void tick_nohz_idle_exit(void); +extern void tick_nohz_irq_exit(void);  extern ktime_t tick_nohz_get_sleep_length(void);  extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);  extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);  # else -static inline void tick_nohz_stop_sched_tick(int inidle) { } -static inline void tick_nohz_restart_sched_tick(void) { } +static inline void tick_nohz_idle_enter(void) { } +static inline void tick_nohz_idle_exit(void) { } +  static inline ktime_t tick_nohz_get_sleep_length(void)  {  	ktime_t len = { .tv64 = NSEC_PER_SEC/HZ }; diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index ecdaeb98b29..5cf685086dd 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h @@ -312,7 +312,6 @@ struct tty_driver {  	 */  	struct tty_struct **ttys;  	struct ktermios **termios; -	struct ktermios **termios_locked;  	void *driver_state;  	/* diff --git a/include/linux/types.h b/include/linux/types.h index 57a97234bec..e5fa5034551 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -24,6 +24,7 @@ typedef __kernel_fd_set		fd_set;  typedef __kernel_dev_t		dev_t;  typedef __kernel_ino_t		ino_t;  typedef __kernel_mode_t		mode_t; +typedef unsigned short		umode_t;  typedef __kernel_nlink_t	nlink_t;  typedef __kernel_off_t		off_t;  typedef __kernel_pid_t		pid_t; @@ -188,7 +189,7 @@ typedef __u32 __bitwise __wsum;   * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid   * common 32/64-bit compat problems.   * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other - * architectures) and to 8-byte boundaries on 64-bit architetures.  The new + * architectures) and to 8-byte boundaries on 64-bit architectures.  The new   * aligned_64 type enforces 8-byte alignment so that structs containing   * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.   * No conversions are necessary between 32-bit user-space and a 64-bit kernel. diff --git a/include/linux/ucb1400.h b/include/linux/ucb1400.h index 5c75153f944..d21b33c4c6c 100644 --- a/include/linux/ucb1400.h +++ b/include/linux/ucb1400.h @@ -96,13 +96,11 @@ struct ucb1400_gpio {  struct ucb1400_ts {  	struct input_dev	*ts_idev; -	struct task_struct	*ts_task;  	int			id; -	wait_queue_head_t	ts_wait; -	unsigned int		ts_restart:1;  	int			irq; -	unsigned int		irq_pending;	/* not bit field shared */  	struct snd_ac97		*ac97; +	wait_queue_head_t	ts_wait; +	bool			stopped;  };  struct ucb1400 { diff --git a/include/linux/unix_diag.h b/include/linux/unix_diag.h new file mode 100644 index 00000000000..b1d2bf16b33 --- /dev/null +++ b/include/linux/unix_diag.h @@ -0,0 +1,54 @@ +#ifndef __UNIX_DIAG_H__ +#define __UNIX_DIAG_H__ + +#include <linux/types.h> + +struct unix_diag_req { +	__u8	sdiag_family; +	__u8	sdiag_protocol; +	__u16	pad; +	__u32	udiag_states; +	__u32	udiag_ino; +	__u32	udiag_show; +	__u32	udiag_cookie[2]; +}; + +#define UDIAG_SHOW_NAME		0x00000001	/* show name (not path) */ +#define UDIAG_SHOW_VFS		0x00000002	/* show VFS inode info */ +#define UDIAG_SHOW_PEER		0x00000004	/* show peer socket info */ +#define UDIAG_SHOW_ICONS	0x00000008	/* show pending connections */ +#define UDIAG_SHOW_RQLEN	0x00000010	/* show skb receive queue len */ +#define UDIAG_SHOW_MEMINFO	0x00000020	/* show memory info of a socket */ + +struct unix_diag_msg { +	__u8	udiag_family; +	__u8	udiag_type; +	__u8	udiag_state; +	__u8	pad; + +	__u32	udiag_ino; +	__u32	udiag_cookie[2]; +}; + +enum { +	UNIX_DIAG_NAME, +	UNIX_DIAG_VFS, +	UNIX_DIAG_PEER, +	UNIX_DIAG_ICONS, +	UNIX_DIAG_RQLEN, +	UNIX_DIAG_MEMINFO, + +	UNIX_DIAG_MAX, +}; + +struct unix_diag_vfs { +	__u32	udiag_vfs_ino; +	__u32	udiag_vfs_dev; +}; + +struct unix_diag_rqlen { +	__u32	udiag_rqueue; +	__u32	udiag_wqueue; +}; + +#endif diff --git a/include/linux/usb.h b/include/linux/usb.h index d3d0c137433..69d845739bc 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -935,7 +935,7 @@ extern struct bus_type usb_bus_type;   */  struct usb_class_driver {  	char *name; -	char *(*devnode)(struct device *dev, mode_t *mode); +	char *(*devnode)(struct device *dev, umode_t *mode);  	const struct file_operations *fops;  	int minor_base;  }; @@ -953,6 +953,18 @@ extern int usb_register_driver(struct usb_driver *, struct module *,  extern void usb_deregister(struct usb_driver *); +/** + * module_usb_driver() - Helper macro for registering a USB driver + * @__usb_driver: usb_driver struct + * + * Helper macro for USB drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_usb_driver(__usb_driver) \ +	module_driver(__usb_driver, usb_register, \ +		       usb_deregister) +  extern int usb_register_device_driver(struct usb_device_driver *,  			struct module *);  extern void usb_deregister_device_driver(struct usb_device_driver *); @@ -1061,6 +1073,7 @@ typedef void (*usb_complete_t)(struct urb *);   *	which the host controller driver should use in preference to the   *	transfer_buffer.   * @sg: scatter gather buffer list + * @num_mapped_sgs: (internal) number of mapped sg entries   * @num_sgs: number of entries in the sg list   * @transfer_buffer_length: How big is transfer_buffer.  The transfer may   *	be broken up into chunks according to the current maximum packet @@ -1221,6 +1234,7 @@ struct urb {  	void *transfer_buffer;		/* (in) associated data buffer */  	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */  	struct scatterlist *sg;		/* (in) scatter gather buffer list */ +	int num_mapped_sgs;		/* (internal) mapped sg entries */  	int num_sgs;			/* (in) number of entries in the sg list */  	u32 transfer_buffer_length;	/* (in) data buffer length */  	u32 actual_length;		/* (return) actual transfer length */ @@ -1598,6 +1612,19 @@ usb_maxpacket(struct usb_device *udev, int pipe, int is_out)  /* ----------------------------------------------------------------------- */ +/* translate USB error codes to codes user space understands */ +static inline int usb_translate_errors(int error_code) +{ +	switch (error_code) { +	case 0: +	case -ENOMEM: +	case -ENODEV: +		return error_code; +	default: +		return -EIO; +	} +} +  /* Events from the usb core */  #define USB_DEVICE_ADD		0x0001  #define USB_DEVICE_REMOVE	0x0002 diff --git a/include/linux/usb/ch11.h b/include/linux/usb/ch11.h index 4ebaf082417..31fdb4c6ee3 100644 --- a/include/linux/usb/ch11.h +++ b/include/linux/usb/ch11.h @@ -26,7 +26,6 @@  #define HUB_RESET_TT		9  #define HUB_GET_TT_STATE	10  #define HUB_STOP_TT		11 -#define HUB_SET_DEPTH		12  /*   * Hub class additional requests defined by USB 3.0 spec @@ -165,11 +164,20 @@ struct usb_port_status {   * wHubCharacteristics (masks)   * See USB 2.0 spec Table 11-13, offset 3   */ -#define HUB_CHAR_LPSM		0x0003 /* D1 .. D0 */ -#define HUB_CHAR_COMPOUND	0x0004 /* D2       */ -#define HUB_CHAR_OCPM		0x0018 /* D4 .. D3 */ -#define HUB_CHAR_TTTT           0x0060 /* D6 .. D5 */ -#define HUB_CHAR_PORTIND        0x0080 /* D7       */ +#define HUB_CHAR_LPSM		0x0003 /* Logical Power Switching Mode mask */ +#define HUB_CHAR_COMMON_LPSM	0x0000 /* All ports power control at once */ +#define HUB_CHAR_INDV_PORT_LPSM	0x0001 /* per-port power control */ +#define HUB_CHAR_NO_LPSM	0x0002 /* no power switching */ + +#define HUB_CHAR_COMPOUND	0x0004 /* hub is part of a compound device */ + +#define HUB_CHAR_OCPM		0x0018 /* Over-Current Protection Mode mask */ +#define HUB_CHAR_COMMON_OCPM	0x0000 /* All ports Over-Current reporting */ +#define HUB_CHAR_INDV_PORT_OCPM	0x0008 /* per-port Over-current reporting */ +#define HUB_CHAR_NO_OCPM	0x0010 /* No Over-current Protection support */ + +#define HUB_CHAR_TTTT		0x0060 /* TT Think Time mask */ +#define HUB_CHAR_PORTIND	0x0080 /* per-port indicators (LEDs) */  struct usb_hub_status {  	__le16 wHubStatus; @@ -198,6 +206,17 @@ struct usb_hub_status {  #define USB_DT_HUB_NONVAR_SIZE		7  #define USB_DT_SS_HUB_SIZE              12 +/* + * Hub Device descriptor + * USB Hub class device protocols + */ + +#define USB_HUB_PR_FS		0 /* Full speed hub */ +#define USB_HUB_PR_HS_NO_TT	0 /* Hi-speed hub without TT */ +#define USB_HUB_PR_HS_SINGLE_TT	1 /* Hi-speed hub with single TT */ +#define USB_HUB_PR_HS_MULTI_TT	2 /* Hi-speed hub with multiple TT */ +#define USB_HUB_PR_SS		3 /* Super speed hub */ +  struct usb_hub_descriptor {  	__u8  bDescLength;  	__u8  bDescriptorType; diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index d5da6c68c25..3b6f628880f 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -589,7 +589,7 @@ static inline int usb_endpoint_is_isoc_out(   */  static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)  { -	return le16_to_cpu(epd->wMaxPacketSize); +	return __le16_to_cpu(epd->wMaxPacketSize);  }  /*-------------------------------------------------------------------------*/ @@ -605,8 +605,26 @@ struct usb_ss_ep_comp_descriptor {  } __attribute__ ((packed));  #define USB_DT_SS_EP_COMP_SIZE		6 +  /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ -#define USB_SS_MAX_STREAMS(p)		(1 << ((p) & 0x1f)) +static inline int +usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp) +{ +	int		max_streams; + +	if (!comp) +		return 0; + +	max_streams = comp->bmAttributes & 0x1f; + +	if (!max_streams) +		return 0; + +	max_streams = 1 << max_streams; + +	return max_streams; +} +  /* Bits 1:0 of bmAttributes if this is an isoc endpoint */  #define USB_SS_MULT(p)			(1 + ((p) & 0x3)) diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 1d3a67523ff..da653b5c713 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -20,6 +20,7 @@  #include <linux/init.h>  #include <linux/list.h>  #include <linux/slab.h> +#include <linux/scatterlist.h>  #include <linux/types.h>  #include <linux/usb/ch9.h> @@ -32,6 +33,9 @@ struct usb_ep;   * @dma: DMA address corresponding to 'buf'.  If you don't set this   *	field, and the usb controller needs one, it is responsible   *	for mapping and unmapping the buffer. + * @sg: a scatterlist for SG-capable controllers. + * @num_sgs: number of SG entries + * @num_mapped_sgs: number of SG entries mapped to DMA (internal)   * @length: Length of that data   * @stream_id: The stream id, when USB3.0 bulk streams are being used   * @no_interrupt: If true, hints that no completion irq is needed. @@ -88,6 +92,10 @@ struct usb_request {  	unsigned		length;  	dma_addr_t		dma; +	struct scatterlist	*sg; +	unsigned		num_sgs; +	unsigned		num_mapped_sgs; +  	unsigned		stream_id:16;  	unsigned		no_interrupt:1;  	unsigned		zero:1; @@ -164,7 +172,7 @@ struct usb_ep {  	unsigned		maxpacket:16;  	unsigned		max_streams:16;  	unsigned		mult:2; -	unsigned		maxburst:4; +	unsigned		maxburst:5;  	u8			address;  	const struct usb_endpoint_descriptor	*desc;  	const struct usb_ss_ep_comp_descriptor	*comp_desc; @@ -477,8 +485,9 @@ struct usb_gadget_ops {   *	driver setup() requests   * @ep_list: List of other endpoints supported by the device.   * @speed: Speed of current connection to USB host. - * @is_dualspeed: True if the controller supports both high and full speed - *	operation.  If it does, the gadget driver must also support both. + * @max_speed: Maximal speed the UDC can handle.  UDC must support this + *      and all slower speeds. + * @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.   * @is_a_peripheral: False unless is_otg, the "A" end of a USB cable @@ -518,7 +527,8 @@ struct usb_gadget {  	struct usb_ep			*ep0;  	struct list_head		ep_list;	/* of usb_ep */  	enum usb_device_speed		speed; -	unsigned			is_dualspeed:1; +	enum usb_device_speed		max_speed; +	unsigned			sg_supported:1;  	unsigned			is_otg:1;  	unsigned			is_a_peripheral:1;  	unsigned			b_hnp_enable:1; @@ -549,7 +559,7 @@ static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev)  static inline int gadget_is_dualspeed(struct usb_gadget *g)  {  #ifdef CONFIG_USB_GADGET_DUALSPEED -	/* runtime test would check "g->is_dualspeed" ... that might be +	/* runtime test would check "g->max_speed" ... that might be  	 * useful to work around hardware bugs, but is mostly pointless  	 */  	return 1; @@ -567,7 +577,7 @@ static inline int gadget_is_superspeed(struct usb_gadget *g)  {  #ifdef CONFIG_USB_GADGET_SUPERSPEED  	/* -	 * runtime test would check "g->is_superspeed" ... that might be +	 * runtime test would check "g->max_speed" ... that might be  	 * useful to work around hardware bugs, but is mostly pointless  	 */  	return 1; @@ -760,7 +770,7 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)  /**   * struct usb_gadget_driver - driver for usb 'slave' devices   * @function: String describing the gadget's function - * @speed: Highest speed the driver handles. + * @max_speed: Highest speed the driver handles.   * @setup: Invoked for ep0 control requests that aren't handled by   *	the hardware level driver. Most calls must be handled by   *	the gadget driver, including descriptor and configuration @@ -824,7 +834,7 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)   */  struct usb_gadget_driver {  	char			*function; -	enum usb_device_speed	speed; +	enum usb_device_speed	max_speed;  	void			(*unbind)(struct usb_gadget *);  	int			(*setup)(struct usb_gadget *,  					const struct usb_ctrlrequest *); diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 03354d557b7..b2f62f3a32a 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -99,7 +99,6 @@ struct usb_hcd {  	 */  	unsigned long		flags;  #define HCD_FLAG_HW_ACCESSIBLE		0	/* at full power */ -#define HCD_FLAG_SAW_IRQ		1  #define HCD_FLAG_POLL_RH		2	/* poll for rh status? */  #define HCD_FLAG_POLL_PENDING		3	/* status has changed? */  #define HCD_FLAG_WAKEUP_PENDING		4	/* root hub is resuming? */ @@ -110,7 +109,6 @@ struct usb_hcd {  	 * be slightly faster than test_bit().  	 */  #define HCD_HW_ACCESSIBLE(hcd)	((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE)) -#define HCD_SAW_IRQ(hcd)	((hcd)->flags & (1U << HCD_FLAG_SAW_IRQ))  #define HCD_POLL_RH(hcd)	((hcd)->flags & (1U << HCD_FLAG_POLL_RH))  #define HCD_POLL_PENDING(hcd)	((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))  #define HCD_WAKEUP_PENDING(hcd)	((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) diff --git a/include/linux/usb/langwell_otg.h b/include/linux/usb/langwell_otg.h deleted file mode 100644 index 51f17b16d31..00000000000 --- a/include/linux/usb/langwell_otg.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Intel Langwell USB OTG transceiver driver - * Copyright (C) 2008 - 2010, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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 St - Fifth Floor, Boston, MA 02110-1301 USA. - * - */ - -#ifndef __LANGWELL_OTG_H -#define __LANGWELL_OTG_H - -#include <linux/usb/intel_mid_otg.h> - -#define CI_USBCMD		0x30 -#	define USBCMD_RST		BIT(1) -#	define USBCMD_RS		BIT(0) -#define CI_USBSTS		0x34 -#	define USBSTS_SLI		BIT(8) -#	define USBSTS_URI		BIT(6) -#	define USBSTS_PCI		BIT(2) -#define CI_PORTSC1		0x74 -#	define PORTSC_PP		BIT(12) -#	define PORTSC_LS		(BIT(11) | BIT(10)) -#	define PORTSC_SUSP		BIT(7) -#	define PORTSC_CCS		BIT(0) -#define CI_HOSTPC1		0xb4 -#	define HOSTPC1_PHCD		BIT(22) -#define CI_OTGSC		0xf4 -#	define OTGSC_DPIE		BIT(30) -#	define OTGSC_1MSE		BIT(29) -#	define OTGSC_BSEIE		BIT(28) -#	define OTGSC_BSVIE		BIT(27) -#	define OTGSC_ASVIE		BIT(26) -#	define OTGSC_AVVIE		BIT(25) -#	define OTGSC_IDIE		BIT(24) -#	define OTGSC_DPIS		BIT(22) -#	define OTGSC_1MSS		BIT(21) -#	define OTGSC_BSEIS		BIT(20) -#	define OTGSC_BSVIS		BIT(19) -#	define OTGSC_ASVIS		BIT(18) -#	define OTGSC_AVVIS		BIT(17) -#	define OTGSC_IDIS		BIT(16) -#	define OTGSC_DPS		BIT(14) -#	define OTGSC_1MST		BIT(13) -#	define OTGSC_BSE		BIT(12) -#	define OTGSC_BSV		BIT(11) -#	define OTGSC_ASV		BIT(10) -#	define OTGSC_AVV		BIT(9) -#	define OTGSC_ID			BIT(8) -#	define OTGSC_HABA		BIT(7) -#	define OTGSC_HADP		BIT(6) -#	define OTGSC_IDPU		BIT(5) -#	define OTGSC_DP			BIT(4) -#	define OTGSC_OT			BIT(3) -#	define OTGSC_HAAR		BIT(2) -#	define OTGSC_VC			BIT(1) -#	define OTGSC_VD			BIT(0) -#	define OTGSC_INTEN_MASK		(0x7f << 24) -#	define OTGSC_INT_MASK		(0x5f << 24) -#	define OTGSC_INTSTS_MASK	(0x7f << 16) -#define CI_USBMODE		0xf8 -#	define USBMODE_CM		(BIT(1) | BIT(0)) -#	define USBMODE_IDLE		0 -#	define USBMODE_DEVICE		0x2 -#	define USBMODE_HOST		0x3 -#define USBCFG_ADDR			0xff10801c -#define USBCFG_LEN			4 -#	define USBCFG_VBUSVAL		BIT(14) -#	define USBCFG_AVALID		BIT(13) -#	define USBCFG_BVALID		BIT(12) -#	define USBCFG_SESEND		BIT(11) - -#define INTR_DUMMY_MASK (USBSTS_SLI | USBSTS_URI | USBSTS_PCI) - -enum langwell_otg_timer_type { -	TA_WAIT_VRISE_TMR, -	TA_WAIT_BCON_TMR, -	TA_AIDL_BDIS_TMR, -	TB_ASE0_BRST_TMR, -	TB_SE0_SRP_TMR, -	TB_SRP_INIT_TMR, -	TB_SRP_FAIL_TMR, -	TB_BUS_SUSPEND_TMR -}; - -#define TA_WAIT_VRISE	100 -#define TA_WAIT_BCON	30000 -#define TA_AIDL_BDIS	15000 -#define TB_ASE0_BRST	5000 -#define TB_SE0_SRP	2 -#define TB_SRP_INIT	100 -#define TB_SRP_FAIL	5500 -#define TB_BUS_SUSPEND	500 - -struct langwell_otg_timer { -	unsigned long expires;	/* Number of count increase to timeout */ -	unsigned long count;	/* Tick counter */ -	void (*function)(unsigned long);	/* Timeout function */ -	unsigned long data;	/* Data passed to function */ -	struct list_head list; -}; - -struct langwell_otg { -	struct intel_mid_otg_xceiv	iotg; -	struct device			*dev; - -	void __iomem			*usbcfg;	/* SCCBUSB config Reg */ - -	unsigned			region; -	unsigned			cfg_region; - -	struct work_struct		work; -	struct workqueue_struct		*qwork; -	struct timer_list		hsm_timer; - -	spinlock_t			lock; -	spinlock_t			wq_lock; - -	struct notifier_block		iotg_notifier; -}; - -static inline -struct langwell_otg *mid_xceiv_to_lnw(struct intel_mid_otg_xceiv *iotg) -{ -	return container_of(iotg, struct langwell_otg, iotg); -} - -#endif /* __LANGWELL_OTG_H__ */ diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h index e5a40c31854..0d3f9887925 100644 --- a/include/linux/usb/renesas_usbhs.h +++ b/include/linux/usb/renesas_usbhs.h @@ -67,6 +67,14 @@ struct renesas_usbhs_platform_callback {  	/*  	 * option:  	 * +	 * for board specific clock control +	 */ +	void (*power_ctrl)(struct platform_device *pdev, +			   void __iomem *base, int enable); + +	/* +	 * option: +	 *  	 * Phy reset for platform  	 */  	void (*phy_reset)(struct platform_device *pdev); @@ -118,7 +126,7 @@ struct renesas_usbhs_driver_param {  	 *  	 * delay time from notify_hotplug callback  	 */ -	int detection_delay; +	int detection_delay; /* msec */  	/*  	 * option: diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index b29f70b2eca..4267a9c717b 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -58,11 +58,13 @@ enum port_dev_state {   * @read_urb: pointer to the bulk in struct urb for this port.   * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this   *	port. + * @bulk_in_buffers: pointers to the bulk in buffers for this port + * @read_urbs: pointers to the bulk in urbs for this port + * @read_urbs_free: status bitmap the for bulk in urbs   * @bulk_out_buffer: pointer to the bulk out buffer for this port.   * @bulk_out_size: the size of the bulk_out_buffer, in bytes.   * @write_urb: pointer to the bulk out struct urb for this port.   * @write_fifo: kfifo used to buffer outgoing data - * @write_urb_busy: port`s writing status   * @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 @@ -99,11 +101,14 @@ struct usb_serial_port {  	struct urb		*read_urb;  	__u8			bulk_in_endpointAddress; +	unsigned char		*bulk_in_buffers[2]; +	struct urb		*read_urbs[2]; +	unsigned long		read_urbs_free; +  	unsigned char		*bulk_out_buffer;  	int			bulk_out_size;  	struct urb		*write_urb;  	struct kfifo		write_fifo; -	int			write_urb_busy;  	unsigned char		*bulk_out_buffers[2];  	struct urb		*write_urbs[2]; @@ -340,7 +345,7 @@ 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_register(int debug);  extern void usb_serial_generic_deregister(void); -extern int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, +extern int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,  						 gfp_t mem_flags);  extern void usb_serial_generic_process_read_urb(struct urb *urb);  extern int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port, diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 4b752d5ee80..5e11f8a1f86 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -343,6 +343,8 @@ struct v4l2_pix_format {  #define V4L2_PIX_FMT_NV21    v4l2_fourcc('N', 'V', '2', '1') /* 12  Y/CrCb 4:2:0  */  #define V4L2_PIX_FMT_NV16    v4l2_fourcc('N', 'V', '1', '6') /* 16  Y/CbCr 4:2:2  */  #define V4L2_PIX_FMT_NV61    v4l2_fourcc('N', 'V', '6', '1') /* 16  Y/CrCb 4:2:2  */ +#define V4L2_PIX_FMT_NV24    v4l2_fourcc('N', 'V', '2', '4') /* 24  Y/CbCr 4:4:4  */ +#define V4L2_PIX_FMT_NV42    v4l2_fourcc('N', 'V', '4', '2') /* 24  Y/CrCb 4:4:4  */  /* two non contiguous planes - one Y, one Cr + Cb interleaved  */  #define V4L2_PIX_FMT_NV12M   v4l2_fourcc('N', 'M', '1', '2') /* 12  Y/CbCr 4:2:0  */ @@ -401,6 +403,7 @@ struct v4l2_pix_format {  #define V4L2_PIX_FMT_SPCA561  v4l2_fourcc('S', '5', '6', '1') /* compressed GBRG bayer */  #define V4L2_PIX_FMT_PAC207   v4l2_fourcc('P', '2', '0', '7') /* compressed BGGR bayer */  #define V4L2_PIX_FMT_MR97310A v4l2_fourcc('M', '3', '1', '0') /* compressed BGGR bayer */ +#define V4L2_PIX_FMT_JL2005BCD v4l2_fourcc('J', 'L', '2', '0') /* compressed RGGB bayer */  #define V4L2_PIX_FMT_SN9C2028 v4l2_fourcc('S', 'O', 'N', 'X') /* compressed GBRG bayer */  #define V4L2_PIX_FMT_SQ905C   v4l2_fourcc('9', '0', '5', 'C') /* compressed RGGB bayer */  #define V4L2_PIX_FMT_PJPG     v4l2_fourcc('P', 'J', 'P', 'G') /* Pixart 73xx JPEG */ @@ -742,6 +745,48 @@ struct v4l2_crop {  	struct v4l2_rect        c;  }; +/* Hints for adjustments of selection rectangle */ +#define V4L2_SEL_FLAG_GE	0x00000001 +#define V4L2_SEL_FLAG_LE	0x00000002 + +/* Selection targets */ + +/* current cropping area */ +#define V4L2_SEL_TGT_CROP_ACTIVE	0 +/* default cropping area */ +#define V4L2_SEL_TGT_CROP_DEFAULT	1 +/* cropping bounds */ +#define V4L2_SEL_TGT_CROP_BOUNDS	2 +/* current composing area */ +#define V4L2_SEL_TGT_COMPOSE_ACTIVE	256 +/* default composing area */ +#define V4L2_SEL_TGT_COMPOSE_DEFAULT	257 +/* composing bounds */ +#define V4L2_SEL_TGT_COMPOSE_BOUNDS	258 +/* current composing area plus all padding pixels */ +#define V4L2_SEL_TGT_COMPOSE_PADDED	259 + +/** + * struct v4l2_selection - selection info + * @type:	buffer type (do not use *_MPLANE types) + * @target:	selection target, used to choose one of possible rectangles + * @flags:	constraints flags + * @r:		coordinates of selection window + * @reserved:	for future use, rounds structure size to 64 bytes, set to zero + * + * Hardware may use multiple helper window to process a video stream. + * The structure is used to exchange this selection areas between + * an application and a driver. + */ +struct v4l2_selection { +	__u32			type; +	__u32			target; +	__u32                   flags; +	struct v4l2_rect        r; +	__u32                   reserved[9]; +}; + +  /*   *      A N A L O G   V I D E O   S T A N D A R D   */ @@ -1131,6 +1176,7 @@ struct v4l2_querymenu {  #define V4L2_CTRL_FLAG_NEXT_CTRL	0x80000000  /*  User-class control IDs defined by V4L2 */ +#define V4L2_CID_MAX_CTRLS		1024  #define V4L2_CID_BASE			(V4L2_CTRL_CLASS_USER | 0x900)  #define V4L2_CID_USER_BASE 		V4L2_CID_BASE  /*  IDs reserved for driver specific controls */ @@ -1204,10 +1250,10 @@ enum v4l2_colorfx {  #define V4L2_CID_MIN_BUFFERS_FOR_CAPTURE	(V4L2_CID_BASE+39)  #define V4L2_CID_MIN_BUFFERS_FOR_OUTPUT		(V4L2_CID_BASE+40) -/* last CID + 1 */ -#define V4L2_CID_LASTP1                         (V4L2_CID_BASE+41) +#define V4L2_CID_ALPHA_COMPONENT		(V4L2_CID_BASE+41) -/* Minimum number of buffer neede by the device */ +/* last CID + 1 */ +#define V4L2_CID_LASTP1                         (V4L2_CID_BASE+42)  /*  MPEG-class control IDs defined by V4L2 */  #define V4L2_CID_MPEG_BASE 			(V4L2_CTRL_CLASS_MPEG | 0x900) @@ -1682,6 +1728,8 @@ enum v4l2_flash_strobe_source {  #define V4L2_FLASH_FAULT_TIMEOUT		(1 << 1)  #define V4L2_FLASH_FAULT_OVER_TEMPERATURE	(1 << 2)  #define V4L2_FLASH_FAULT_SHORT_CIRCUIT		(1 << 3) +#define V4L2_FLASH_FAULT_OVER_CURRENT		(1 << 4) +#define V4L2_FLASH_FAULT_INDICATOR		(1 << 5)  #define V4L2_CID_FLASH_CHARGE			(V4L2_CID_FLASH_CLASS_BASE + 11)  #define V4L2_CID_FLASH_READY			(V4L2_CID_FLASH_CLASS_BASE + 12) @@ -2255,6 +2303,10 @@ struct v4l2_create_buffers {  #define VIDIOC_CREATE_BUFS	_IOWR('V', 92, struct v4l2_create_buffers)  #define VIDIOC_PREPARE_BUF	_IOWR('V', 93, struct v4l2_buffer) +/* Experimental selection API */ +#define VIDIOC_G_SELECTION	_IOWR('V', 94, struct v4l2_selection) +#define VIDIOC_S_SELECTION	_IOWR('V', 95, struct v4l2_selection) +  /* Reminder: when adding new ioctls please add support for them to     drivers/media/video/v4l2-compat-ioctl32.c as well! */ diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 4c069d8bd74..d0018d27c28 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -25,70 +25,18 @@ struct virtqueue {  	void *priv;  }; -/** - * operations for virtqueue - * virtqueue_add_buf: expose buffer to other end - *	vq: the struct virtqueue we're talking about. - *	sg: the description of the buffer(s). - *	out_num: the number of sg readable by other side - *	in_num: the number of sg which are writable (after readable ones) - *	data: the token identifying the buffer. - *	gfp: how to do memory allocations (if necessary). - *      Returns remaining capacity of queue (sg segments) or a negative error. - * virtqueue_kick: update after add_buf - *	vq: the struct virtqueue - *	After one or more add_buf calls, invoke this to kick the other side. - * virtqueue_get_buf: get the next used buffer - *	vq: the struct virtqueue we're talking about. - *	len: the length written into the buffer - *	Returns NULL or the "data" token handed to add_buf. - * virtqueue_disable_cb: disable callbacks - *	vq: the struct virtqueue we're talking about. - *	Note that this is not necessarily synchronous, hence unreliable and only - *	useful as an optimization. - * virtqueue_enable_cb: restart callbacks after disable_cb. - *	vq: the struct virtqueue we're talking about. - *	This re-enables callbacks; it returns "false" if there are pending - *	buffers in the queue, to detect a possible race between the driver - *	checking for more work, and enabling callbacks. - * virtqueue_enable_cb_delayed: restart callbacks after disable_cb. - *	vq: the struct virtqueue we're talking about. - *	This re-enables callbacks but hints to the other side to delay - *	interrupts until most of the available buffers have been processed; - *	it returns "false" if there are many pending buffers in the queue, - *	to detect a possible race between the driver checking for more work, - *	and enabling callbacks. - * virtqueue_detach_unused_buf: detach first unused buffer - * 	vq: the struct virtqueue we're talking about. - * 	Returns NULL or the "data" token handed to add_buf - * virtqueue_get_vring_size: return the size of the virtqueue's vring - *	vq: the struct virtqueue containing the vring of interest. - *	Returns the size of the vring. - * - * Locking rules are straightforward: the driver is responsible for - * locking.  No two operations may be invoked simultaneously, with the exception - * of virtqueue_disable_cb. - * - * All operations can be called in any context. - */ +int virtqueue_add_buf(struct virtqueue *vq, +		      struct scatterlist sg[], +		      unsigned int out_num, +		      unsigned int in_num, +		      void *data, +		      gfp_t gfp); -int virtqueue_add_buf_gfp(struct virtqueue *vq, -			  struct scatterlist sg[], -			  unsigned int out_num, -			  unsigned int in_num, -			  void *data, -			  gfp_t gfp); +void virtqueue_kick(struct virtqueue *vq); -static inline int virtqueue_add_buf(struct virtqueue *vq, -				    struct scatterlist sg[], -				    unsigned int out_num, -				    unsigned int in_num, -				    void *data) -{ -	return virtqueue_add_buf_gfp(vq, sg, out_num, in_num, data, GFP_ATOMIC); -} +bool virtqueue_kick_prepare(struct virtqueue *vq); -void virtqueue_kick(struct virtqueue *vq); +void virtqueue_notify(struct virtqueue *vq);  void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len); @@ -146,6 +94,11 @@ struct virtio_driver {  	int (*probe)(struct virtio_device *dev);  	void (*remove)(struct virtio_device *dev);  	void (*config_changed)(struct virtio_device *dev); +#ifdef CONFIG_PM +	int (*freeze)(struct virtio_device *dev); +	int (*thaw)(struct virtio_device *dev); +	int (*restore)(struct virtio_device *dev); +#endif  };  int register_virtio_driver(struct virtio_driver *drv); diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index add4790b21f..5206d6541da 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -85,6 +85,8 @@   * @reset: reset the device   *	vdev: the virtio device   *	After this, status and feature negotiation must be done again + *	Device must not be reset from its vq/config callbacks, or in + *	parallel with being added/removed.   * @find_vqs: find virtqueues and instantiate them.   *	vdev: the virtio_device   *	nvqs: the number of virtqueues to find @@ -100,6 +102,10 @@   *	vdev: the virtio_device   *	This gives the final feature bits for the device: it can change   *	the dev->feature bits if it wants. + * @bus_name: return the bus name associated with the device + *	vdev: the virtio_device + *      This returns a pointer to the bus name a la pci_name from which + *      the caller can then copy.   */  typedef void vq_callback_t(struct virtqueue *);  struct virtio_config_ops { @@ -117,6 +123,7 @@ struct virtio_config_ops {  	void (*del_vqs)(struct virtio_device *);  	u32 (*get_features)(struct virtio_device *vdev);  	void (*finalize_features)(struct virtio_device *vdev); +	const char *(*bus_name)(struct virtio_device *vdev);  };  /* If driver didn't advertise the feature, it will never appear. */ @@ -182,5 +189,14 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,  		return ERR_PTR(err);  	return vq;  } + +static inline +const char *virtio_bus_name(struct virtio_device *vdev) +{ +	if (!vdev->config->bus_name) +		return "virtio"; +	return vdev->config->bus_name(vdev); +} +  #endif /* __KERNEL__ */  #endif /* _LINUX_VIRTIO_CONFIG_H */ diff --git a/include/linux/virtio_mmio.h b/include/linux/virtio_mmio.h index 27c7edefbc8..5c7b6f0daef 100644 --- a/include/linux/virtio_mmio.h +++ b/include/linux/virtio_mmio.h @@ -63,7 +63,7 @@  #define VIRTIO_MMIO_GUEST_FEATURES	0x020  /* Activated features set selector - Write Only */ -#define VIRTIO_MMIO_GUEST_FEATURES_SET	0x024 +#define VIRTIO_MMIO_GUEST_FEATURES_SEL	0x024  /* Guest's memory page size in bytes - Write Only */  #define VIRTIO_MMIO_GUEST_PAGE_SIZE	0x028 diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 36be0f6e18a..e338730c266 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h @@ -168,6 +168,7 @@ struct virtqueue;  struct virtqueue *vring_new_virtqueue(unsigned int num,  				      unsigned int vring_align,  				      struct virtio_device *vdev, +				      bool weak_barriers,  				      void *pages,  				      void (*notify)(struct virtqueue *vq),  				      void (*callback)(struct virtqueue *vq), diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 687fb11e201..dcdfc2bda92 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -119,7 +119,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size)  #endif  /* Allocate/destroy a 'vmalloc' VM area. */ -extern struct vm_struct *alloc_vm_area(size_t size); +extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);  extern void free_vm_area(struct vm_struct *area);  /* for /dev/kmem */ @@ -131,6 +131,7 @@ extern long vwrite(char *buf, char *addr, unsigned long count);   */  extern rwlock_t vmlist_lock;  extern struct vm_struct *vmlist; +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);  #ifdef CONFIG_SMP diff --git a/include/linux/wait.h b/include/linux/wait.h index 3efc9f3f43a..a9ce45e8501 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -77,13 +77,13 @@ struct task_struct;  #define __WAIT_BIT_KEY_INITIALIZER(word, bit)				\  	{ .flags = word, .bit_nr = bit, } -extern void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *); +extern void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct lock_class_key *);  #define init_waitqueue_head(q)				\  	do {						\  		static struct lock_class_key __key;	\  							\ -		__init_waitqueue_head((q), &__key);	\ +		__init_waitqueue_head((q), #q, &__key);	\  	} while (0)  #ifdef CONFIG_LOCKDEP diff --git a/include/linux/wanrouter.h b/include/linux/wanrouter.h index e0aa39612eb..3157cc1fada 100644 --- a/include/linux/wanrouter.h +++ b/include/linux/wanrouter.h @@ -309,7 +309,7 @@ typedef struct wandev_conf  #define WANOPT_EVEN	2  /* CHDLC Protocol Options */ -/* DF Commmented out for now. +/* DF Commented out for now.  #define WANOPT_CHDLC_NO_DCD		IGNORE_DCD_FOR_LINK_STAT  #define WANOPT_CHDLC_NO_CTS		IGNORE_CTS_FOR_LINK_STAT diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 111843f88b2..43ba5b3ce2a 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -53,11 +53,7 @@ struct watchdog_info {  #ifdef __KERNEL__ -#ifdef CONFIG_WATCHDOG_NOWAYOUT -#define WATCHDOG_NOWAYOUT	1 -#else -#define WATCHDOG_NOWAYOUT	0 -#endif +#include <linux/bitops.h>  struct watchdog_ops;  struct watchdog_device; @@ -122,6 +118,21 @@ struct watchdog_device {  #define WDOG_NO_WAY_OUT		3	/* Is 'nowayout' feature set ? */  }; +#ifdef CONFIG_WATCHDOG_NOWAYOUT +#define WATCHDOG_NOWAYOUT		1 +#define WATCHDOG_NOWAYOUT_INIT_STATUS	(1 << WDOG_NO_WAY_OUT) +#else +#define WATCHDOG_NOWAYOUT		0 +#define WATCHDOG_NOWAYOUT_INIT_STATUS	0 +#endif + +/* Use the following function to set the nowayout feature */ +static inline void watchdog_set_nowayout(struct watchdog_device *wdd, int nowayout) +{ +	if (nowayout) +		set_bit(WDOG_NO_WAY_OUT, &wdd->status); +} +  /* Use the following functions to manipulate watchdog driver specific data */  static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)  { diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h index 4b697395326..0d6373195d3 100644 --- a/include/linux/wl12xx.h +++ b/include/linux/wl12xx.h @@ -54,6 +54,9 @@ struct wl12xx_platform_data {  	int board_ref_clock;  	int board_tcxo_clock;  	unsigned long platform_quirks; +	bool pwr_in_suspend; + +	struct wl1271_if_operations *ops;  };  /* Platform does not support level trigger interrupts */ @@ -73,6 +76,6 @@ int wl12xx_set_platform_data(const struct wl12xx_platform_data *data)  #endif -const struct wl12xx_platform_data *wl12xx_get_platform_data(void); +struct wl12xx_platform_data *wl12xx_get_platform_data(void);  #endif diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 0d556deb497..eb8b9f15f2e 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -297,32 +297,50 @@ extern struct workqueue_struct *system_unbound_wq;  extern struct workqueue_struct *system_freezable_wq;  extern struct workqueue_struct * -__alloc_workqueue_key(const char *name, unsigned int flags, int max_active, -		      struct lock_class_key *key, const char *lock_name); +__alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, +	struct lock_class_key *key, const char *lock_name, ...) __printf(1, 6); +/** + * alloc_workqueue - allocate a workqueue + * @fmt: printf format for the name of the workqueue + * @flags: WQ_* flags + * @max_active: max in-flight work items, 0 for default + * @args: args for @fmt + * + * Allocate a workqueue with the specified parameters.  For detailed + * information on WQ_* flags, please refer to Documentation/workqueue.txt. + * + * The __lock_name macro dance is to guarantee that single lock_class_key + * doesn't end up with different namesm, which isn't allowed by lockdep. + * + * RETURNS: + * Pointer to the allocated workqueue on success, %NULL on failure. + */  #ifdef CONFIG_LOCKDEP -#define alloc_workqueue(name, flags, max_active)		\ +#define alloc_workqueue(fmt, flags, max_active, args...)	\  ({								\  	static struct lock_class_key __key;			\  	const char *__lock_name;				\  								\ -	if (__builtin_constant_p(name))				\ -		__lock_name = (name);				\ +	if (__builtin_constant_p(fmt))				\ +		__lock_name = (fmt);				\  	else							\ -		__lock_name = #name;				\ +		__lock_name = #fmt;				\  								\ -	__alloc_workqueue_key((name), (flags), (max_active),	\ -			      &__key, __lock_name);		\ +	__alloc_workqueue_key((fmt), (flags), (max_active),	\ +			      &__key, __lock_name, ##args);	\  })  #else -#define alloc_workqueue(name, flags, max_active)		\ -	__alloc_workqueue_key((name), (flags), (max_active), NULL, NULL) +#define alloc_workqueue(fmt, flags, max_active, args...)	\ +	__alloc_workqueue_key((fmt), (flags), (max_active),	\ +			      NULL, NULL, ##args)  #endif  /**   * alloc_ordered_workqueue - allocate an ordered workqueue - * @name: name of the workqueue + * @fmt: printf format for the name of the workqueue   * @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful) + * @args: args for @fmt   *   * Allocate an ordered workqueue.  An ordered workqueue executes at   * most one work item at any given time in the queued order.  They are @@ -331,11 +349,8 @@ __alloc_workqueue_key(const char *name, unsigned int flags, int max_active,   * RETURNS:   * Pointer to the allocated workqueue on success, %NULL on failure.   */ -static inline struct workqueue_struct * -alloc_ordered_workqueue(const char *name, unsigned int flags) -{ -	return alloc_workqueue(name, WQ_UNBOUND | flags, 1); -} +#define alloc_ordered_workqueue(fmt, flags, args...)		\ +	alloc_workqueue(fmt, WQ_UNBOUND | (flags), 1, ##args)  #define create_workqueue(name)					\  	alloc_workqueue((name), WQ_MEM_RECLAIM, 1) diff --git a/include/linux/writeback.h b/include/linux/writeback.h index a378c295851..995b8bf630a 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -7,6 +7,8 @@  #include <linux/sched.h>  #include <linux/fs.h> +DECLARE_PER_CPU(int, dirty_throttle_leaks); +  /*   * The 1/4 region under the global dirty thresh is for smooth dirty throttling:   * @@ -23,11 +25,6 @@  #define DIRTY_SCOPE		8  #define DIRTY_FULL_SCOPE	(DIRTY_SCOPE / 2) -/* - * 4MB minimal write chunk size - */ -#define MIN_WRITEBACK_PAGES	(4096UL >> (PAGE_CACHE_SHIFT - 10)) -  struct backing_dev_info;  /* @@ -124,6 +121,7 @@ void laptop_mode_timer_fn(unsigned long data);  static inline void laptop_sync_completion(void) { }  #endif  void throttle_vm_writeout(gfp_t gfp_mask); +bool zone_dirty_ok(struct zone *zone);  extern unsigned long global_dirty_limit; @@ -138,8 +136,6 @@ extern int vm_highmem_is_dirtyable;  extern int block_dump;  extern int laptop_mode; -extern unsigned long determine_dirtyable_memory(void); -  extern int dirty_background_ratio_handler(struct ctl_table *table, int write,  		void __user *buffer, size_t *lenp,  		loff_t *ppos); @@ -195,6 +191,8 @@ void writeback_set_ratelimit(void);  void tag_pages_for_writeback(struct address_space *mapping,  			     pgoff_t start, pgoff_t end); +void account_page_redirty(struct page *page); +  /* pdflush.c */  extern int nr_pdflush_threads;	/* Global so it can be exported to sysctl  				   read-only. */ diff --git a/include/linux/zorro_ids.h b/include/linux/zorro_ids.h index 7e749088910..74bc53bcfdc 100644 --- a/include/linux/zorro_ids.h +++ b/include/linux/zorro_ids.h @@ -360,8 +360,8 @@  #define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM	ZORRO_ID(VILLAGE_TRONIC, 0x0B, 0)  #define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG	ZORRO_ID(VILLAGE_TRONIC, 0x0C, 0)  #define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_SEGMENTED_MODE	ZORRO_ID(VILLAGE_TRONIC, 0x0D, 0) -#define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_MEM1		ZORRO_ID(VILLAGE_TRONIC, 0x15, 0) -#define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_MEM2		ZORRO_ID(VILLAGE_TRONIC, 0x16, 0) +#define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM1		ZORRO_ID(VILLAGE_TRONIC, 0x15, 0) +#define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM2		ZORRO_ID(VILLAGE_TRONIC, 0x16, 0)  #define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_REG		ZORRO_ID(VILLAGE_TRONIC, 0x17, 0)  #define  ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z3		ZORRO_ID(VILLAGE_TRONIC, 0x18, 0)  #define  ZORRO_PROD_VILLAGE_TRONIC_ARIADNE			ZORRO_ID(VILLAGE_TRONIC, 0xC9, 0)  |