diff options
Diffstat (limited to 'include')
637 files changed, 16354 insertions, 5533 deletions
diff --git a/include/acpi/acbuffer.h b/include/acpi/acbuffer.h index a1e45cdd729..c927a0b1de7 100644 --- a/include/acpi/acbuffer.h +++ b/include/acpi/acbuffer.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h index 0943457e0fa..14ceff788c4 100644 --- a/include/acpi/acconfig.h +++ b/include/acpi/acconfig.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -138,7 +138,7 @@  /* Maximum sleep allowed via Sleep() operator */ -#define ACPI_MAX_SLEEP                  2000	/* Two seconds */ +#define ACPI_MAX_SLEEP                  2000	/* 2000 millisec == two seconds */  /* Address Range lists are per-space_id (Memory and I/O only) */ @@ -150,11 +150,6 @@   *   *****************************************************************************/ -/* Number of distinct GPE register blocks and register width */ - -#define ACPI_MAX_GPE_BLOCKS             2 -#define ACPI_GPE_REGISTER_WIDTH         8 -  /* Method info (in WALK_STATE), containing local variables and argumetns */  #define ACPI_METHOD_NUM_LOCALS          8 @@ -163,12 +158,6 @@  #define ACPI_METHOD_NUM_ARGS            7  #define ACPI_METHOD_MAX_ARG             6 -/* Length of _HID, _UID, _CID, and UUID values */ - -#define ACPI_DEVICE_ID_LENGTH           0x09 -#define ACPI_MAX_CID_LENGTH             48 -#define ACPI_UUID_LENGTH                16 -  /*   * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG   */ @@ -186,17 +175,6 @@   */  #define ACPI_RESULTS_OBJ_NUM_MAX        255 -/* Names within the namespace are 4 bytes long */ - -#define ACPI_NAME_SIZE                  4 -#define ACPI_PATH_SEGMENT_LENGTH        5	/* 4 chars for name + 1 char for separator */ -#define ACPI_PATH_SEPARATOR             '.' - -/* Sizes for ACPI table headers */ - -#define ACPI_OEM_ID_SIZE                6 -#define ACPI_OEM_TABLE_ID_SIZE          8 -  /* Constants used in searching for the RSDP in low memory */  #define ACPI_EBDA_PTR_LOCATION          0x0000040E	/* Physical Address */ @@ -213,6 +191,7 @@  /* Maximum space_ids for Operation Regions */  #define ACPI_MAX_ADDRESS_SPACE          255 +#define ACPI_NUM_DEFAULT_SPACES         4  /* Array sizes.  Used for range checking also */ diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 6c3890e0214..9bf59d0e8aa 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h index 7665df66328..ce08ef7d969 100644 --- a/include/acpi/acnames.h +++ b/include/acpi/acnames.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index 2457ac84965..9885276178e 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -72,6 +72,7 @@  #define ACPI_EXAMPLE                0x00004000  #define ACPI_DRIVER                 0x00008000  #define DT_COMPILER                 0x00010000 +#define ASL_PREPROCESSOR            0x00020000  #define ACPI_ALL_COMPONENTS         0x0001FFFF  #define ACPI_COMPONENT_DEFAULT      (ACPI_ALL_COMPONENTS) @@ -262,18 +263,140 @@   * Common parameters used for debug output functions:   * line number, function name, module(file) name, component ID   */ -#define ACPI_DEBUG_PARAMETERS           __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT +#define ACPI_DEBUG_PARAMETERS \ +	__LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT + +/* Check if debug output is currently dynamically enabled */ + +#define ACPI_IS_DEBUG_ENABLED(level, component) \ +	((level & acpi_dbg_level) && (component & acpi_dbg_layer))  /*   * Master debug print macros   * Print message if and only if:   *    1) Debug print for the current component is enabled   *    2) Debug error level or trace level for the print statement is enabled + * + * November 2012: Moved the runtime check for whether to actually emit the + * debug message outside of the print function itself. This improves overall + * performance at a relatively small code cost. Implementation involves the + * use of variadic macros supported by C99. + * + * Note: the ACPI_DO_WHILE0 macro is used to prevent some compilers from + * complaining about these constructs. On other compilers the do...while + * adds some extra code, so this feature is optional.   */ -#define ACPI_DEBUG_PRINT(plist)         acpi_debug_print plist -#define ACPI_DEBUG_PRINT_RAW(plist)     acpi_debug_print_raw plist - +#ifdef ACPI_USE_DO_WHILE_0 +#define ACPI_DO_WHILE0(a)               do a while(0)  #else +#define ACPI_DO_WHILE0(a)               a +#endif + +/* DEBUG_PRINT functions */ + +#define ACPI_DEBUG_PRINT(plist)         ACPI_ACTUAL_DEBUG plist +#define ACPI_DEBUG_PRINT_RAW(plist)     ACPI_ACTUAL_DEBUG_RAW plist + +/* Helper macros for DEBUG_PRINT */ + +#define ACPI_DO_DEBUG_PRINT(function, level, line, filename, modulename, component, ...) \ +	ACPI_DO_WHILE0 ({ \ +		if (ACPI_IS_DEBUG_ENABLED (level, component)) \ +		{ \ +			function (level, line, filename, modulename, component, __VA_ARGS__); \ +		} \ +	}) + +#define ACPI_ACTUAL_DEBUG(level, line, filename, modulename, component, ...) \ +	ACPI_DO_DEBUG_PRINT (acpi_debug_print, level, line, \ +		filename, modulename, component, __VA_ARGS__) + +#define ACPI_ACTUAL_DEBUG_RAW(level, line, filename, modulename, component, ...) \ +	ACPI_DO_DEBUG_PRINT (acpi_debug_print_raw, level, line, \ +		filename, modulename, component, __VA_ARGS__) + +/* + * Function entry tracing + * + * The name of the function is emitted as a local variable that is + * intended to be used by both the entry trace and the exit trace. + */ + +/* Helper macro */ + +#define ACPI_TRACE_ENTRY(name, function, cast, param) \ +	ACPI_FUNCTION_NAME (name) \ +	function (ACPI_DEBUG_PARAMETERS, cast (param)) + +/* The actual entry trace macros */ + +#define ACPI_FUNCTION_TRACE(name) \ +	ACPI_FUNCTION_NAME(name) \ +	acpi_ut_trace (ACPI_DEBUG_PARAMETERS) + +#define ACPI_FUNCTION_TRACE_PTR(name, pointer) \ +	ACPI_TRACE_ENTRY (name, acpi_ut_trace_ptr, (void *), pointer) + +#define ACPI_FUNCTION_TRACE_U32(name, value) \ +	ACPI_TRACE_ENTRY (name, acpi_ut_trace_u32, (u32), value) + +#define ACPI_FUNCTION_TRACE_STR(name, string) \ +	ACPI_TRACE_ENTRY (name, acpi_ut_trace_str, (char *), string) + +#define ACPI_FUNCTION_ENTRY() \ +	acpi_ut_track_stack_ptr() + +/* + * Function exit tracing + * + * These macros include a return statement. This is usually considered + * bad form, but having a separate exit macro before the actual return + * is very ugly and difficult to maintain. + * + * One of the FUNCTION_TRACE macros above must be used in conjunction + * with these macros so that "_AcpiFunctionName" is defined. + */ + +/* Exit trace helper macro */ + +#define ACPI_TRACE_EXIT(function, cast, param) \ +	ACPI_DO_WHILE0 ({ \ +		function (ACPI_DEBUG_PARAMETERS, cast (param)); \ +		return ((param)); \ +	}) + +/* The actual exit macros */ + +#define return_VOID \ +	ACPI_DO_WHILE0 ({ \ +		acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \ +		return; \ +	}) + +#define return_ACPI_STATUS(status) \ +	ACPI_TRACE_EXIT (acpi_ut_status_exit, (acpi_status), status) + +#define return_PTR(pointer) \ +	ACPI_TRACE_EXIT (acpi_ut_ptr_exit, (u8 *), pointer) + +#define return_VALUE(value) \ +	ACPI_TRACE_EXIT (acpi_ut_value_exit, (u64), value) + +/* Conditional execution */ + +#define ACPI_DEBUG_EXEC(a)              a +#define ACPI_DEBUG_ONLY_MEMBERS(a)      a; +#define _VERBOSE_STRUCTURES + +/* Various object display routines for debug */ + +#define ACPI_DUMP_STACK_ENTRY(a)        acpi_ex_dump_operand((a), 0) +#define ACPI_DUMP_OPERANDS(a, b ,c)     acpi_ex_dump_operands(a, b, c) +#define ACPI_DUMP_ENTRY(a, b)           acpi_ns_dump_entry (a, b) +#define ACPI_DUMP_PATHNAME(a, b, c, d)  acpi_ns_dump_pathname(a, b, c, d) +#define ACPI_DUMP_BUFFER(a, b)          acpi_ut_debug_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT) + +#else				/* ACPI_DEBUG_OUTPUT */  /*   * This is the non-debug case -- make everything go away,   * leaving no executable debug code! @@ -281,6 +404,32 @@  #define ACPI_FUNCTION_NAME(a)  #define ACPI_DEBUG_PRINT(pl)  #define ACPI_DEBUG_PRINT_RAW(pl) +#define ACPI_DEBUG_EXEC(a) +#define ACPI_DEBUG_ONLY_MEMBERS(a) +#define ACPI_FUNCTION_TRACE(a) +#define ACPI_FUNCTION_TRACE_PTR(a, b) +#define ACPI_FUNCTION_TRACE_U32(a, b) +#define ACPI_FUNCTION_TRACE_STR(a, b) +#define ACPI_FUNCTION_EXIT +#define ACPI_FUNCTION_STATUS_EXIT(s) +#define ACPI_FUNCTION_VALUE_EXIT(s) +#define ACPI_FUNCTION_ENTRY() +#define ACPI_DUMP_STACK_ENTRY(a) +#define ACPI_DUMP_OPERANDS(a, b, c) +#define ACPI_DUMP_ENTRY(a, b) +#define ACPI_DUMP_TABLES(a, b) +#define ACPI_DUMP_PATHNAME(a, b, c, d) +#define ACPI_DUMP_BUFFER(a, b) +#define ACPI_DEBUG_PRINT(pl) +#define ACPI_DEBUG_PRINT_RAW(pl) +#define ACPI_IS_DEBUG_ENABLED(level, component) 0 + +/* Return macros must have a return statement at the minimum */ + +#define return_VOID                     return +#define return_ACPI_STATUS(s)           return(s) +#define return_VALUE(s)                 return(s) +#define return_PTR(s)                   return(s)  #endif				/* ACPI_DEBUG_OUTPUT */ diff --git a/include/acpi/acpi.h b/include/acpi/acpi.h index c1ea8436961..618787715d5 100644 --- a/include/acpi/acpi.h +++ b/include/acpi/acpi.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 7ced5dc20dd..22ba56e834e 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -84,28 +84,29 @@ struct acpi_driver;  struct acpi_device;  /* + * ACPI Scan Handler + * ----------------- + */ + +struct acpi_scan_handler { +	const struct acpi_device_id *ids; +	struct list_head list_node; +	int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id); +	void (*detach)(struct acpi_device *dev); +}; + +/*   * ACPI Driver   * -----------   */  typedef int (*acpi_op_add) (struct acpi_device * device); -typedef int (*acpi_op_remove) (struct acpi_device * device, int type); -typedef int (*acpi_op_start) (struct acpi_device * device); -typedef int (*acpi_op_bind) (struct acpi_device * device); -typedef int (*acpi_op_unbind) (struct acpi_device * device); +typedef int (*acpi_op_remove) (struct acpi_device * device);  typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event); -struct acpi_bus_ops { -	u32 acpi_op_add:1; -	u32 acpi_op_start:1; -}; -  struct acpi_device_ops {  	acpi_op_add add;  	acpi_op_remove remove; -	acpi_op_start start; -	acpi_op_bind bind; -	acpi_op_unbind unbind;  	acpi_op_notify notify;  }; @@ -148,7 +149,8 @@ struct acpi_device_flags {  	u32 power_manageable:1;  	u32 performance_manageable:1;  	u32 eject_pending:1; -	u32 reserved:24; +	u32 match_driver:1; +	u32 reserved:23;  };  /* File System */ @@ -207,7 +209,7 @@ struct acpi_device_power_state {  	} flags;  	int power;		/* % Power (compared to D0) */  	int latency;		/* Dx->D0 time (microseconds) */ -	struct acpi_handle_list resources;	/* Power resources referenced */ +	struct list_head resources;	/* Power resources referenced */  };  struct acpi_device_power { @@ -250,7 +252,7 @@ struct acpi_device_wakeup {  	acpi_handle gpe_device;  	u64 gpe_number;  	u64 sleep_state; -	struct acpi_handle_list resources; +	struct list_head resources;  	struct acpi_device_wakeup_flags flags;  	int prepare_count;  }; @@ -279,16 +281,17 @@ struct acpi_device {  	struct acpi_device_wakeup wakeup;  	struct acpi_device_perf performance;  	struct acpi_device_dir dir; -	struct acpi_device_ops ops; +	struct acpi_scan_handler *handler;  	struct acpi_driver *driver;  	void *driver_data;  	struct device dev; -	struct acpi_bus_ops bus_ops;	/* workaround for different code path for hotplug */  	enum acpi_bus_removal_type removal_type;	/* indicate for different removal type */  	u8 physical_node_count;  	struct list_head physical_node_list;  	struct mutex physical_node_lock;  	DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE); +	struct list_head power_dependent; +	void (*remove)(struct acpi_device *);  };  static inline void *acpi_driver_data(struct acpi_device *d) @@ -316,10 +319,19 @@ struct acpi_bus_event {  };  struct acpi_eject_event { -	acpi_handle	handle; +	struct acpi_device	*device;  	u32		event;  }; +struct acpi_hp_work { +	struct work_struct work; +	acpi_handle handle; +	u32 type; +	void *context; +}; +void alloc_acpi_hp_work(acpi_handle handle, u32 type, void *context, +			void (*func)(struct work_struct *work)); +  extern struct kobject *acpi_kobj;  extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);  void acpi_bus_private_data_handler(acpi_handle, void *); @@ -339,13 +351,51 @@ void acpi_bus_data_handler(acpi_handle handle, void *context);  acpi_status acpi_bus_get_status_handle(acpi_handle handle,  				       unsigned long long *sta);  int acpi_bus_get_status(struct acpi_device *device); + +#ifdef CONFIG_PM  int acpi_bus_set_power(acpi_handle handle, int state); +const char *acpi_power_state_string(int state); +int acpi_device_get_power(struct acpi_device *device, int *state);  int acpi_device_set_power(struct acpi_device *device, int state); +int acpi_bus_init_power(struct acpi_device *device);  int acpi_bus_update_power(acpi_handle handle, int *state_p);  bool acpi_bus_power_manageable(acpi_handle handle);  bool acpi_bus_can_wakeup(acpi_handle handle); -int acpi_power_resource_register_device(struct device *dev, acpi_handle handle); -void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle); +#else /* !CONFIG_PM */ +static inline int acpi_bus_set_power(acpi_handle handle, int state) +{ +	return 0; +} +static inline const char *acpi_power_state_string(int state) +{ +	return "D0"; +} +static inline int acpi_device_get_power(struct acpi_device *device, int *state) +{ +	return 0; +} +static inline int acpi_device_set_power(struct acpi_device *device, int state) +{ +	return 0; +} +static inline int acpi_bus_init_power(struct acpi_device *device) +{ +	return 0; +} +static inline int acpi_bus_update_power(acpi_handle handle, int *state_p) +{ +	return 0; +} +static inline bool acpi_bus_power_manageable(acpi_handle handle) +{ +	return false; +} +static inline bool acpi_bus_can_wakeup(acpi_handle handle) +{ +	return false; +} +#endif /* !CONFIG_PM */ +  #ifdef CONFIG_ACPI_PROC_EVENT  int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);  int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data); @@ -354,13 +404,15 @@ int acpi_bus_receive_event(struct acpi_bus_event *event);  static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)  	{ return 0; }  #endif + +void acpi_scan_lock_acquire(void); +void acpi_scan_lock_release(void); +int acpi_scan_add_handler(struct acpi_scan_handler *handler);  int acpi_bus_register_driver(struct acpi_driver *driver);  void acpi_bus_unregister_driver(struct acpi_driver *driver); -int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent, -		 acpi_handle handle, int type); +int acpi_bus_scan(acpi_handle handle);  void acpi_bus_hot_remove_device(void *context); -int acpi_bus_trim(struct acpi_device *start, int rmdevice); -int acpi_bus_start(struct acpi_device *device); +void acpi_bus_trim(struct acpi_device *start);  acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);  int acpi_match_device_ids(struct acpi_device *device,  			  const struct acpi_device_id *ids); @@ -385,11 +437,11 @@ void acpi_remove_dir(struct acpi_device *);   */  struct acpi_bus_type {  	struct list_head list; -	struct bus_type *bus; -	/* For general devices under the bus */ +	const char *name; +	bool (*match)(struct device *dev);  	int (*find_device) (struct device *, acpi_handle *); -	/* For bridges, such as PCI root bridge, IDE controller */ -	int (*find_bridge) (struct device *, acpi_handle *); +	void (*setup)(struct device *); +	void (*cleanup)(struct device *);  };  int register_acpi_bus_type(struct acpi_bus_type *);  int unregister_acpi_bus_type(struct acpi_bus_type *); @@ -397,7 +449,6 @@ int unregister_acpi_bus_type(struct acpi_bus_type *);  struct acpi_pci_root {  	struct list_head node;  	struct acpi_device * device; -	struct acpi_pci_id id;  	struct pci_bus *bus;  	u16 segment;  	struct resource secondary;	/* downstream bus range */ @@ -410,7 +461,6 @@ struct acpi_pci_root {  /* helper */  acpi_handle acpi_get_child(acpi_handle, u64);  int acpi_is_root_bridge(acpi_handle); -acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);  struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);  #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev)) @@ -425,6 +475,8 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,  int acpi_device_power_state(struct device *dev, struct acpi_device *adev,  			    u32 target_state, int d_max_in, int *d_min_p);  int acpi_pm_device_sleep_state(struct device *, int *, int); +void acpi_dev_pm_add_dependent(acpi_handle handle, struct device *depdev); +void acpi_dev_pm_remove_dependent(acpi_handle handle, struct device *depdev);  #else  static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev,  					       acpi_notify_handler handler, @@ -454,6 +506,10 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)  {  	return __acpi_device_power_state(m, p);  } +static inline void acpi_dev_pm_add_dependent(acpi_handle handle, +					     struct device *depdev) {} +static inline void acpi_dev_pm_remove_dependent(acpi_handle handle, +						struct device *depdev) {}  #endif  #ifdef CONFIG_PM_RUNTIME diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index 8b1d7a6a969..627749af0ba 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h @@ -90,11 +90,6 @@ int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,  			       int *polarity, char **name);  int acpi_pci_link_free_irq(acpi_handle handle); -/* ACPI PCI Interrupt Routing (pci_irq.c) */ - -int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus); -void acpi_pci_irq_del_prt(int segment, int bus); -  /* ACPI PCI Device Binding (pci_bind.c) */  struct pci_bus; diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 43152742b46..5b3d2bd4813 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -7,7 +7,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -102,10 +102,8 @@ acpi_os_physical_table_override(struct acpi_table_header *existing_table,  /*   * Spinlock primitives   */ -  #ifndef acpi_os_create_lock -acpi_status -acpi_os_create_lock(acpi_spinlock *out_handle); +acpi_status acpi_os_create_lock(acpi_spinlock * out_handle);  #endif  void acpi_os_delete_lock(acpi_spinlock handle); @@ -148,6 +146,8 @@ void acpi_os_release_mutex(acpi_mutex handle);   */  void *acpi_os_allocate(acpi_size size); +void acpi_os_free(void *memory); +  void __iomem *acpi_os_map_memory(acpi_physical_address where,  				acpi_size length); @@ -180,12 +180,13 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object);   * Interrupt handlers   */  acpi_status -acpi_os_install_interrupt_handler(u32 gsi, +acpi_os_install_interrupt_handler(u32 interrupt_number,  				  acpi_osd_handler service_routine,  				  void *context);  acpi_status -acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler service_routine); +acpi_os_remove_interrupt_handler(u32 interrupt_number, +				 acpi_osd_handler service_routine);  void acpi_os_gpe_count(u32 gpe_number);  void acpi_os_fixed_event_count(u32 fixed_event_number); @@ -193,8 +194,6 @@ void acpi_os_fixed_event_count(u32 fixed_event_number);  /*   * Threads and Scheduling   */ -extern struct workqueue_struct *kacpi_hotplug_wq; -  acpi_thread_id acpi_os_get_thread_id(void);  acpi_status diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 3d88395d4d6..03322dddd88 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@  /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION                 0x20121018 +#define ACPI_CA_VERSION                 0x20130117  #include <acpi/acconfig.h>  #include <acpi/actypes.h> @@ -56,11 +56,20 @@  extern u8 acpi_gbl_permanent_mmap;  /* - * Globals that are publicly available, allowing for - * run time configuration + * Globals that are publically available   */ +extern u32 acpi_current_gpe_count; +extern struct acpi_table_fadt acpi_gbl_FADT; +extern u8 acpi_gbl_system_awake_and_running; +extern u8 acpi_gbl_reduced_hardware;	/* ACPI 5.0 */ + +/* Runtime configuration of debug print levels */ +  extern u32 acpi_dbg_level;  extern u32 acpi_dbg_layer; + +/* ACPICA runtime options */ +  extern u8 acpi_gbl_enable_interpreter_slack;  extern u8 acpi_gbl_all_methods_serialized;  extern u8 acpi_gbl_create_osi_method; @@ -99,14 +108,9 @@ extern u8 acpi_gbl_disable_auto_repair;  #endif				/* !ACPI_REDUCED_HARDWARE */ -extern u32 acpi_current_gpe_count; -extern struct acpi_table_fadt acpi_gbl_FADT; -extern u8 acpi_gbl_system_awake_and_running; -extern u8 acpi_gbl_reduced_hardware;	/* ACPI 5.0 */ -  extern u32 acpi_rsdt_forced;  /* - * Global interfaces + * Initialization   */  acpi_status  acpi_initialize_tables(struct acpi_table_desc *initial_storage, @@ -120,13 +124,15 @@ acpi_status acpi_initialize_objects(u32 flags);  acpi_status acpi_terminate(void); +/* + * Miscellaneous global interfaces + */ +ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void)) +ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void))  #ifdef ACPI_FUTURE_USAGE  acpi_status acpi_subsystem_status(void);  #endif -ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void)) -ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void)) -  #ifdef ACPI_FUTURE_USAGE  acpi_status acpi_get_system_info(struct acpi_buffer *ret_buffer);  #endif @@ -191,9 +197,9 @@ acpi_status  acpi_get_table_by_index(u32 table_index, struct acpi_table_header **out_table);  acpi_status -acpi_install_table_handler(acpi_tbl_handler handler, void *context); +acpi_install_table_handler(acpi_table_handler handler, void *context); -acpi_status acpi_remove_table_handler(acpi_tbl_handler handler); +acpi_status acpi_remove_table_handler(acpi_table_handler handler);  /*   * Namespace and name interfaces @@ -438,6 +444,11 @@ acpi_get_event_resources(acpi_handle device_handle,  			 struct acpi_buffer *ret_buffer);  acpi_status +acpi_walk_resource_buffer(struct acpi_buffer *buffer, +			  acpi_walk_resource_callback user_function, +			  void *context); + +acpi_status  acpi_walk_resources(acpi_handle device,  		    char *name,  		    acpi_walk_resource_callback user_function, void *context); @@ -462,6 +473,10 @@ acpi_buffer_to_resource(u8 *aml_buffer,   */  acpi_status acpi_reset(void); +acpi_status acpi_read(u64 *value, struct acpi_generic_address *reg); + +acpi_status acpi_write(u64 value, struct acpi_generic_address *reg); +  ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status  				acpi_read_bit_register(u32 register_id,  						       u32 *return_value)) @@ -470,20 +485,6 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status  				acpi_write_bit_register(u32 register_id,  							u32 value)) -ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status -				acpi_set_firmware_waking_vector(u32 -								physical_address)) - -#if ACPI_MACHINE_WIDTH == 64 -ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status -				acpi_set_firmware_waking_vector64(u64 -								  physical_address)) -#endif - -acpi_status acpi_read(u64 *value, struct acpi_generic_address *reg); - -acpi_status acpi_write(u64 value, struct acpi_generic_address *reg); -  /*   * Sleep/Wake interfaces   */ @@ -500,6 +501,15 @@ acpi_status acpi_leave_sleep_state_prep(u8 sleep_state);  acpi_status acpi_leave_sleep_state(u8 sleep_state); +ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status +				acpi_set_firmware_waking_vector(u32 +								physical_address)) + +#if ACPI_MACHINE_WIDTH == 64 +ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status +				acpi_set_firmware_waking_vector64(u64 +								  physical_address)) +#endif  /*   * ACPI Timer interfaces   */ diff --git a/include/acpi/acrestyp.h b/include/acpi/acrestyp.h index 40349ae6546..cbf4bf977f7 100644 --- a/include/acpi/acrestyp.h +++ b/include/acpi/acrestyp.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -102,8 +102,11 @@ typedef u32 acpi_rsdesc_size;	/* Max Resource Descriptor size is (Length+3) = (6  #define ACPI_EXCLUSIVE                  (u8) 0x00  #define ACPI_SHARED                     (u8) 0x01 -#define ACPI_EXCLUSIVE_AND_WAKE         (u8) 0x02 -#define ACPI_SHARED_AND_WAKE            (u8) 0x03 + +/* Wake */ + +#define ACPI_NOT_WAKE_CAPABLE           (u8) 0x00 +#define ACPI_WAKE_CAPABLE               (u8) 0x01  /*   * DMA Attributes @@ -171,6 +174,7 @@ struct acpi_resource_irq {  	u8 triggering;  	u8 polarity;  	u8 sharable; +	u8 wake_capable;  	u8 interrupt_count;  	u8 interrupts[1];  }; @@ -346,6 +350,7 @@ struct acpi_resource_extended_irq {  	u8 triggering;  	u8 polarity;  	u8 sharable; +	u8 wake_capable;  	u8 interrupt_count;  	struct acpi_resource_source resource_source;  	u32 interrupts[1]; @@ -365,6 +370,7 @@ struct acpi_resource_gpio {  	u8 producer_consumer;	/* For values, see Producer/Consumer above */  	u8 pin_config;  	u8 sharable;		/* For values, see Interrupt Attributes above */ +	u8 wake_capable;	/* For values, see Interrupt Attributes above */  	u8 io_restriction;  	u8 triggering;		/* For values, see Interrupt Attributes above */  	u8 polarity;		/* For values, see Interrupt Attributes above */ @@ -591,7 +597,10 @@ struct acpi_resource {  #define ACPI_RS_SIZE_MIN                    (u32) ACPI_ROUND_UP_TO_NATIVE_WORD (12)  #define ACPI_RS_SIZE(type)                  (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type)) -#define ACPI_NEXT_RESOURCE(res)             (struct acpi_resource *)((u8 *) res + res->length) +/* Macro for walking resource templates with multiple descriptors */ + +#define ACPI_NEXT_RESOURCE(res) \ +	ACPI_ADD_PTR (struct acpi_resource, (res), (res)->length)  struct acpi_pci_routing_table {  	u32 length; diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index 4f94b1d812d..9b58a8f4377 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -326,8 +326,6 @@ enum acpi_preferred_pm_profiles {  #pragma pack() -#define ACPI_FADT_OFFSET(f)             (u16) ACPI_OFFSET (struct acpi_table_fadt, f) -  /*   * Internal table-related structures   */ @@ -359,11 +357,14 @@ struct acpi_table_desc {  /*   * Get the remaining ACPI tables   */ -  #include <acpi/actbl1.h>  #include <acpi/actbl2.h>  #include <acpi/actbl3.h> +/* Macros used to generate offsets to specific table fields */ + +#define ACPI_FADT_OFFSET(f)             (u16) ACPI_OFFSET (struct acpi_table_fadt, f) +  /*   * Sizes of the various flavors of FADT. We need to look closely   * at the FADT length because the version number essentially tells diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h index 280fc45b59d..0bd750ebeb4 100644 --- a/include/acpi/actbl1.h +++ b/include/acpi/actbl1.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -768,7 +768,7 @@ struct acpi_madt_interrupt_source {  struct acpi_madt_local_x2apic {  	struct acpi_subtable_header header; -	u16 reserved;		/* Reserved - must be zero */ +	u16 reserved;		/* reserved - must be zero */  	u32 local_apic_id;	/* Processor x2APIC ID  */  	u32 lapic_flags;  	u32 uid;		/* ACPI processor UID */ @@ -781,14 +781,14 @@ struct acpi_madt_local_x2apic_nmi {  	u16 inti_flags;  	u32 uid;		/* ACPI processor UID */  	u8 lint;		/* LINTn to which NMI is connected */ -	u8 reserved[3]; +	u8 reserved[3];		/* reserved - must be zero */  };  /* 11: Generic Interrupt (ACPI 5.0) */  struct acpi_madt_generic_interrupt {  	struct acpi_subtable_header header; -	u16 reserved;		/* Reserved - must be zero */ +	u16 reserved;		/* reserved - must be zero */  	u32 gic_id;  	u32 uid;  	u32 flags; diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h index 1b2b356486d..77dc7a4099a 100644 --- a/include/acpi/actbl2.h +++ b/include/acpi/actbl2.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -261,9 +261,28 @@ struct acpi_csrt_group {  	u16 subdevice_id;  	u16 revision;  	u16 reserved; -	u32 info_length; +	u32 shared_info_length; -	/* Shared data (length = info_length) immediately follows */ +	/* Shared data immediately follows (Length = shared_info_length) */ +}; + +/* Shared Info subtable */ + +struct acpi_csrt_shared_info { +	u16 major_version; +	u16 minor_version; +	u32 mmio_base_low; +	u32 mmio_base_high; +	u32 gsi_interrupt; +	u8 interrupt_polarity; +	u8 interrupt_mode; +	u8 num_channels; +	u8 dma_address_width; +	u16 base_request_line; +	u16 num_handshake_signals; +	u32 max_block_size; + +	/* Resource descriptors immediately follow (Length = Group length - shared_info_length) */  };  /* Resource Descriptor subtable */ diff --git a/include/acpi/actbl3.h b/include/acpi/actbl3.h index 6585141e4b9..332b17e3bec 100644 --- a/include/acpi/actbl3.h +++ b/include/acpi/actbl3.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -68,13 +68,13 @@  #define ACPI_SIG_PCCT           "PCCT"	/* Platform Communications Channel Table */  #define ACPI_SIG_PMTT           "PMTT"	/* Platform Memory Topology Table */  #define ACPI_SIG_RASF           "RASF"	/* RAS Feature table */ +#define ACPI_SIG_TPM2           "TPM2"	/* Trusted Platform Module 2.0 H/W interface table */  #define ACPI_SIG_S3PT           "S3PT"	/* S3 Performance (sub)Table */  #define ACPI_SIG_PCCS           "PCC"	/* PCC Shared Memory Region */  /* Reserved table signatures */ -#define ACPI_SIG_CSRT           "CSRT"	/* Core System Resources Table */  #define ACPI_SIG_MATR           "MATR"	/* Memory Address Translation Table */  #define ACPI_SIG_MSDM           "MSDM"	/* Microsoft Data Management Table */  #define ACPI_SIG_WPBT           "WPBT"	/* Windows Platform Binary Table */ @@ -550,6 +550,36 @@ enum acpi_rasf_status {  #define ACPI_RASF_ERROR                 (1<<2)  #define ACPI_RASF_STATUS                (0x1F<<3) +/******************************************************************************* + * + * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table + *        Version 3 + * + * Conforms to "TPM 2.0 Hardware Interface Table (TPM2)" 29 November 2011 + * + ******************************************************************************/ + +struct acpi_table_tpm2 { +	struct acpi_table_header header;	/* Common ACPI table header */ +	u32 flags; +	u64 control_address; +	u32 start_method; +}; + +/* Control area structure (not part of table, pointed to by control_address) */ + +struct acpi_tpm2_control { +	u32 reserved; +	u32 error; +	u32 cancel; +	u32 start; +	u64 interrupt_control; +	u32 command_size; +	u64 command_address; +	u32 response_size; +	u64 response_address; +}; +  /* Reset to default packing */  #pragma pack() diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 4f43f1fba13..845e75f1ffd 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -341,7 +341,7 @@ typedef u32 acpi_physical_address;  /* PM Timer ticks per second (HZ) */ -#define PM_TIMER_FREQUENCY              3579545 +#define ACPI_PM_TIMER_FREQUENCY         3579545  /*******************************************************************************   * @@ -373,6 +373,21 @@ typedef u32 acpi_name;		/* 4-byte ACPI name */  typedef char *acpi_string;	/* Null terminated ASCII string */  typedef void *acpi_handle;	/* Actually a ptr to a NS Node */ +/* Time constants for timer calculations */ + +#define ACPI_MSEC_PER_SEC               1000L + +#define ACPI_USEC_PER_MSEC              1000L +#define ACPI_USEC_PER_SEC               1000000L + +#define ACPI_100NSEC_PER_USEC           10L +#define ACPI_100NSEC_PER_MSEC           10000L +#define ACPI_100NSEC_PER_SEC            10000000L + +#define ACPI_NSEC_PER_USEC              1000L +#define ACPI_NSEC_PER_MSEC              1000000L +#define ACPI_NSEC_PER_SEC               1000000000L +  /* Owner IDs are used to track namespace nodes for selective deletion */  typedef u8 acpi_owner_id; @@ -390,10 +405,6 @@ typedef u8 acpi_owner_id;  #define ACPI_MAX16_DECIMAL_DIGITS        5  #define ACPI_MAX8_DECIMAL_DIGITS         3 -/* PM Timer ticks per second (HZ) */ - -#define PM_TIMER_FREQUENCY  3579545 -  /*   * Constants with special meanings   */ @@ -474,6 +485,7 @@ typedef u64 acpi_integer;   */  #define ACPI_FULL_INITIALIZATION        0x00  #define ACPI_NO_ADDRESS_SPACE_INIT      0x01 +#define ACPI_NO_HARDWARE_INIT           0x02  #define ACPI_NO_EVENT_INIT              0x04  #define ACPI_NO_HANDLER_INIT            0x08  #define ACPI_NO_ACPI_ENABLE             0x10 @@ -595,7 +607,7 @@ typedef u32 acpi_object_type;  /*   * These are special object types that never appear in - * a Namespace node, only in a union acpi_operand_object + * a Namespace node, only in an object of union acpi_operand_object   */  #define ACPI_TYPE_LOCAL_EXTRA           0x1C  #define ACPI_TYPE_LOCAL_DATA            0x1D @@ -662,7 +674,7 @@ typedef u32 acpi_event_status;  #define ACPI_GPE_MAX                    0xFF  #define ACPI_NUM_GPE                    256 -/* Actions for acpi_set_gpe_wake_mask, acpi_hw_low_set_gpe */ +/* Actions for acpi_set_gpe, acpi_gpe_wakeup, acpi_hw_low_set_gpe */  #define ACPI_GPE_ENABLE                 0  #define ACPI_GPE_DISABLE                1 @@ -880,6 +892,10 @@ struct acpi_buffer {  	void *pointer;		/* pointer to buffer */  }; +/* Free a buffer created in an struct acpi_buffer via ACPI_ALLOCATE_LOCAL_BUFFER */ + +#define ACPI_FREE_BUFFER(b)         ACPI_FREE(b.pointer) +  /*   * name_type for acpi_get_name   */ @@ -968,7 +984,11 @@ acpi_status(*acpi_exception_handler) (acpi_status aml_status,  /* Table Event handler (Load, load_table, etc.) and types */  typedef -acpi_status(*acpi_tbl_handler) (u32 event, void *table, void *context); +acpi_status(*acpi_table_handler) (u32 event, void *table, void *context); + +#define ACPI_TABLE_LOAD             0x0 +#define ACPI_TABLE_UNLOAD           0x1 +#define ACPI_NUM_TABLE_EVENTS       2  /* Address Spaces (For Operation Regions) */ diff --git a/include/acpi/container.h b/include/acpi/container.h deleted file mode 100644 index a703f14e049..00000000000 --- a/include/acpi/container.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __ACPI_CONTAINER_H -#define __ACPI_CONTAINER_H - -#include <linux/kernel.h> - -struct acpi_container { -	acpi_handle handle; -	unsigned long sun; -	int state; -}; - -#endif				/* __ACPI_CONTAINER_H */ diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h new file mode 100644 index 00000000000..720446cb243 --- /dev/null +++ b/include/acpi/ghes.h @@ -0,0 +1,72 @@ +#include <acpi/apei.h> +#include <acpi/hed.h> + +/* + * One struct ghes is created for each generic hardware error source. + * It provides the context for APEI hardware error timer/IRQ/SCI/NMI + * handler. + * + * estatus: memory buffer for error status block, allocated during + * HEST parsing. + */ +#define GHES_TO_CLEAR		0x0001 +#define GHES_EXITING		0x0002 + +struct ghes { +	struct acpi_hest_generic *generic; +	struct acpi_hest_generic_status *estatus; +	u64 buffer_paddr; +	unsigned long flags; +	union { +		struct list_head list; +		struct timer_list timer; +		unsigned int irq; +	}; +}; + +struct ghes_estatus_node { +	struct llist_node llnode; +	struct acpi_hest_generic *generic; +	struct ghes *ghes; +}; + +struct ghes_estatus_cache { +	u32 estatus_len; +	atomic_t count; +	struct acpi_hest_generic *generic; +	unsigned long long time_in; +	struct rcu_head rcu; +}; + +enum { +	GHES_SEV_NO = 0x0, +	GHES_SEV_CORRECTED = 0x1, +	GHES_SEV_RECOVERABLE = 0x2, +	GHES_SEV_PANIC = 0x3, +}; + +/* From drivers/edac/ghes_edac.c */ + +#ifdef CONFIG_EDAC_GHES +void ghes_edac_report_mem_error(struct ghes *ghes, int sev, +				struct cper_sec_mem_err *mem_err); + +int ghes_edac_register(struct ghes *ghes, struct device *dev); + +void ghes_edac_unregister(struct ghes *ghes); + +#else +static inline void ghes_edac_report_mem_error(struct ghes *ghes, int sev, +				       struct cper_sec_mem_err *mem_err) +{ +} + +static inline int ghes_edac_register(struct ghes *ghes, struct device *dev) +{ +	return 0; +} + +static inline void ghes_edac_unregister(struct ghes *ghes) +{ +} +#endif diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index 89cee88dd2a..ef04b36ca6e 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h @@ -1,11 +1,11 @@  /******************************************************************************   * - * Name: acenv.h - Generation environment specific items + * Name: acenv.h - Host and compiler configuration   *   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -44,6 +44,12 @@  #ifndef __ACENV_H__  #define __ACENV_H__ +/* + * Environment configuration. The purpose of this file is to interface ACPICA + * to the local environment. This includes compiler-specific, OS-specific, + * and machine-specific configuration. + */ +  /* Types for ACPI_MUTEX_TYPE */  #define ACPI_BINARY_SEMAPHORE       0 @@ -60,139 +66,170 @@   *   *****************************************************************************/ -#ifdef ACPI_LIBRARY -/* - * Note: The non-debug version of the acpi_library does not contain any - * debug support, for minimal size. The debug version uses ACPI_FULL_DEBUG - */ -#define ACPI_USE_LOCAL_CACHE -#endif +/* iASL configuration */  #ifdef ACPI_ASL_COMPILER -#define ACPI_DEBUG_OUTPUT  #define ACPI_APPLICATION  #define ACPI_DISASSEMBLER +#define ACPI_DEBUG_OUTPUT  #define ACPI_CONSTANT_EVAL_ONLY  #define ACPI_LARGE_NAMESPACE_NODE  #define ACPI_DATA_TABLE_DISASSEMBLY +#define ACPI_SINGLE_THREADED  #endif +/* acpi_exec configuration. Multithreaded with full AML debugger */ +  #ifdef ACPI_EXEC_APP -#undef DEBUGGER_THREADING -#define DEBUGGER_THREADING      DEBUGGER_SINGLE_THREADED -#define ACPI_FULL_DEBUG  #define ACPI_APPLICATION -#define ACPI_DEBUGGER +#define ACPI_FULL_DEBUG  #define ACPI_MUTEX_DEBUG  #define ACPI_DBG_TRACK_ALLOCATIONS  #endif +/* acpi_names configuration. Single threaded with debugger output enabled. */ + +#ifdef ACPI_NAMES_APP +#define ACPI_DEBUGGER +#define ACPI_APPLICATION +#define ACPI_SINGLE_THREADED +#endif + +/* + * acpi_bin/acpi_help/acpi_src configuration. All single threaded, with + * no debug output. + */ +#if (defined ACPI_BIN_APP)   || \ +	(defined ACPI_SRC_APP)   || \ +	(defined ACPI_XTRACT_APP) +#define ACPI_APPLICATION +#define ACPI_SINGLE_THREADED +#endif + +#ifdef ACPI_HELP_APP +#define ACPI_APPLICATION +#define ACPI_SINGLE_THREADED +#define ACPI_NO_ERROR_MESSAGES +#endif + +/* Linkable ACPICA library */ + +#ifdef ACPI_LIBRARY +#define ACPI_USE_LOCAL_CACHE +#define ACPI_FUTURE_USAGE +#endif + +/* Common for all ACPICA applications */ +  #ifdef ACPI_APPLICATION  #define ACPI_USE_SYSTEM_CLIBRARY  #define ACPI_USE_LOCAL_CACHE  #endif +/* Common debug support */ +  #ifdef ACPI_FULL_DEBUG  #define ACPI_DEBUGGER  #define ACPI_DEBUG_OUTPUT  #define ACPI_DISASSEMBLER  #endif -/* - * Environment configuration.  The purpose of this file is to interface to the - * local generation environment. - * - * 1) ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library. - *      Otherwise, local versions of string/memory functions will be used. - * 2) ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and - *      the standard header files may be used. - * - * The ACPI subsystem only uses low level C library functions that do not call - * operating system services and may therefore be inlined in the code. - * - * It may be necessary to tailor these include files to the target - * generation environment. - * - * - * Functions and constants used from each header: - * - * string.h:    memcpy - *              memset - *              strcat - *              strcmp - *              strcpy - *              strlen - *              strncmp - *              strncat - *              strncpy - * - * stdlib.h:    strtoul - * - * stdarg.h:    va_list - *              va_arg - *              va_start - *              va_end - * - */  /*! [Begin] no source code translation */ +/****************************************************************************** + * + * Host configuration files. The compiler configuration files are included + * by the host files. + * + *****************************************************************************/ +  #if defined(_LINUX) || defined(__linux__)  #include <acpi/platform/aclinux.h> -#elif defined(_AED_EFI) -#include "acefi.h" - -#elif defined(WIN32) -#include "acwin.h" - -#elif defined(WIN64) -#include "acwin64.h" - -#elif defined(MSDOS)		/* Must appear after WIN32 and WIN64 check */ -#include "acdos16.h" -  #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)  #include "acfreebsd.h"  #elif defined(__NetBSD__)  #include "acnetbsd.h" +#elif defined(__sun) +#include "acsolaris.h" +  #elif defined(MODESTO)  #include "acmodesto.h"  #elif defined(NETWARE)  #include "acnetware.h" -#elif defined(__sun) -#include "acsolaris.h" +#elif defined(_CYGWIN) +#include "accygwin.h" -#else +#elif defined(WIN32) +#include "acwin.h" + +#elif defined(WIN64) +#include "acwin64.h" -/* All other environments */ +#elif defined(_WRS_LIB_BUILD) +#include "acvxworks.h" -#define ACPI_USE_STANDARD_HEADERS +#elif defined(__OS2__) +#include "acos2.h" -#define COMPILER_DEPENDENT_INT64   long long -#define COMPILER_DEPENDENT_UINT64  unsigned long long +#elif defined(_AED_EFI) +#include "acefi.h" + +#elif defined(__HAIKU__) +#include "achaiku.h" +#else + +/* Unknown environment */ + +#error Unknown target environment  #endif  /*! [End] no source code translation !*/  /******************************************************************************   * - * Miscellaneous configuration + * Setup defaults for the required symbols that were not defined in one of + * the host/compiler files above.   *   *****************************************************************************/ -/* - * Are mutexes supported by the host? default is no, use binary semaphores. - */ +/* 64-bit data types */ + +#ifndef COMPILER_DEPENDENT_INT64 +#define COMPILER_DEPENDENT_INT64   long long +#endif + +#ifndef COMPILER_DEPENDENT_UINT64 +#define COMPILER_DEPENDENT_UINT64  unsigned long long +#endif + +/* Type of mutex supported by host. Default is binary semaphores. */  #ifndef ACPI_MUTEX_TYPE  #define ACPI_MUTEX_TYPE             ACPI_BINARY_SEMAPHORE  #endif +/* Global Lock acquire/release */ + +#ifndef ACPI_ACQUIRE_GLOBAL_LOCK +#define ACPI_ACQUIRE_GLOBAL_LOCK(Glptr, acquired) acquired = 1 +#endif + +#ifndef ACPI_RELEASE_GLOBAL_LOCK +#define ACPI_RELEASE_GLOBAL_LOCK(Glptr, pending) pending = 0 +#endif + +/* Flush CPU cache - used when going to sleep. Wbinvd or similar. */ + +#ifndef ACPI_FLUSH_CPU_CACHE +#define ACPI_FLUSH_CPU_CACHE() +#endif +  /* "inline" keywords - configurable since inline is not standardized */  #ifndef ACPI_INLINE @@ -200,6 +237,30 @@  #endif  /* + * Configurable calling conventions: + * + * ACPI_SYSTEM_XFACE        - Interfaces to host OS (handlers, threads) + * ACPI_EXTERNAL_XFACE      - External ACPI interfaces + * ACPI_INTERNAL_XFACE      - Internal ACPI interfaces + * ACPI_INTERNAL_VAR_XFACE  - Internal variable-parameter list interfaces + */ +#ifndef ACPI_SYSTEM_XFACE +#define ACPI_SYSTEM_XFACE +#endif + +#ifndef ACPI_EXTERNAL_XFACE +#define ACPI_EXTERNAL_XFACE +#endif + +#ifndef ACPI_INTERNAL_XFACE +#define ACPI_INTERNAL_XFACE +#endif + +#ifndef ACPI_INTERNAL_VAR_XFACE +#define ACPI_INTERNAL_VAR_XFACE +#endif + +/*   * Debugger threading model   * Use single threaded if the entire subsystem is contained in an application   * Use multiple threaded when the subsystem is running in the kernel. @@ -222,17 +283,26 @@   *   *****************************************************************************/ -#define ACPI_IS_ASCII(c)  ((c) < 0x80) - -#ifdef ACPI_USE_SYSTEM_CLIBRARY  /* - * Use the standard C library headers. - * We want to keep these to a minimum. + * ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library. + *      Otherwise, local versions of string/memory functions will be used. + * ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and + *      the standard header files may be used. + * + * The ACPICA subsystem only uses low level C library functions that do not call + * operating system services and may therefore be inlined in the code. + * + * It may be necessary to tailor these include files to the target + * generation environment.   */ +#ifdef ACPI_USE_SYSTEM_CLIBRARY + +/* Use the standard C library headers. We want to keep these to a minimum. */ +  #ifdef ACPI_USE_STANDARD_HEADERS -/* - * Use the standard headers from the standard locations - */ + +/* Use the standard headers from the standard locations */ +  #include <stdarg.h>  #include <stdlib.h>  #include <string.h> @@ -240,9 +310,8 @@  #endif				/* ACPI_USE_STANDARD_HEADERS */ -/* - * We will be linking to the standard Clib functions - */ +/* We will be linking to the standard Clib functions */ +  #define ACPI_STRSTR(s1,s2)      strstr((s1), (s2))  #define ACPI_STRCHR(s1,c)       strchr((s1), (c))  #define ACPI_STRLEN(s)          (acpi_size) strlen((s)) @@ -274,13 +343,12 @@   *   *****************************************************************************/ - /* -  * Use local definitions of C library macros and functions -  * NOTE: The function implementations may not be as efficient -  * as an inline or assembly code implementation provided by a -  * native C library. -  */ - +/* + * Use local definitions of C library macros and functions. These function + * implementations may not be as efficient as an inline or assembly code + * implementation provided by a native C library, but they are functionally + * equivalent. + */  #ifndef va_arg  #ifndef _VALIST @@ -288,22 +356,22 @@  typedef char *va_list;  #endif				/* _VALIST */ -/* - * Storage alignment properties - */ +/* Storage alignment properties */ +  #define  _AUPBND                (sizeof (acpi_native_int) - 1)  #define  _ADNBND                (sizeof (acpi_native_int) - 1) -/* - * Variable argument list macro definitions - */ +/* Variable argument list macro definitions */ +  #define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))  #define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND)))) -#define va_end(ap)              (void) 0 +#define va_end(ap)              (ap = (va_list) NULL)  #define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))  #endif				/* va_arg */ +/* Use the local (ACPICA) definitions of the clib functions */ +  #define ACPI_STRSTR(s1,s2)      acpi_ut_strstr ((s1), (s2))  #define ACPI_STRCHR(s1,c)       acpi_ut_strchr ((s1), (c))  #define ACPI_STRLEN(s)          (acpi_size) acpi_ut_strlen ((s)) @@ -322,59 +390,4 @@ typedef char *va_list;  #endif				/* ACPI_USE_SYSTEM_CLIBRARY */ -/****************************************************************************** - * - * Assembly code macros - * - *****************************************************************************/ - -/* - * Handle platform- and compiler-specific assembly language differences. - * These should already have been defined by the platform includes above. - * - * Notes: - * 1) Interrupt 3 is used to break into a debugger - * 2) Interrupts are turned off during ACPI register setup - */ - -/* Unrecognized compiler, use defaults */ - -#ifndef ACPI_ASM_MACROS - -/* - * Calling conventions: - * - * ACPI_SYSTEM_XFACE        - Interfaces to host OS (handlers, threads) - * ACPI_EXTERNAL_XFACE      - External ACPI interfaces - * ACPI_INTERNAL_XFACE      - Internal ACPI interfaces - * ACPI_INTERNAL_VAR_XFACE  - Internal variable-parameter list interfaces - */ -#define ACPI_SYSTEM_XFACE -#define ACPI_EXTERNAL_XFACE -#define ACPI_INTERNAL_XFACE -#define ACPI_INTERNAL_VAR_XFACE - -#define ACPI_ASM_MACROS -#define BREAKPOINT3 -#define ACPI_DISABLE_IRQS() -#define ACPI_ENABLE_IRQS() -#define ACPI_ACQUIRE_GLOBAL_LOCK(Glptr, acq) -#define ACPI_RELEASE_GLOBAL_LOCK(Glptr, acq) - -#endif				/* ACPI_ASM_MACROS */ - -#ifdef ACPI_APPLICATION - -/* Don't want software interrupts within a ring3 application */ - -#undef BREAKPOINT3 -#define BREAKPOINT3 -#endif - -/****************************************************************************** - * - * Compiler-specific information is contained in the compiler-specific - * headers. - * - *****************************************************************************/  #endif				/* __ACENV_H__ */ diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h index 72553b0c9f3..e077ce6c38c 100644 --- a/include/acpi/platform/acgcc.h +++ b/include/acpi/platform/acgcc.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -64,8 +64,4 @@   */  #define ACPI_UNUSED_VAR __attribute__ ((unused)) -#ifdef _ANSI -#define inline -#endif -  #endif				/* __ACGCC_H__ */ diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 85d5d8f3845..68534ef86ec 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2012, Intel Corp. + * Copyright (C) 2000 - 2013, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -108,7 +108,6 @@  #include <acpi/platform/acgcc.h> -  #ifdef __KERNEL__  #include <acpi/actypes.h>  /* diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 555d0337ad9..b327b5a9296 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h @@ -235,6 +235,9 @@ extern void acpi_processor_unregister_performance(struct           if a _PPC object exists, rmmod is disallowed then */  int acpi_processor_notify_smm(struct module *calling_module); +/* parsing the _P* objects. */ +extern int acpi_processor_get_performance_info(struct acpi_processor *pr); +  /* for communication between multiple parts of the processor kernel module */  DECLARE_PER_CPU(struct acpi_processor *, processors);  extern struct acpi_processor_errata errata; diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index 1ced6413ea0..33bd2de3bc1 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h @@ -136,12 +136,6 @@ static inline void atomic_dec(atomic_t *v)  #define atomic_xchg(ptr, v)		(xchg(&(ptr)->counter, (v)))  #define atomic_cmpxchg(v, old, new)	(cmpxchg(&((v)->counter), (old), (new))) -#define cmpxchg_local(ptr, o, n)				  	       \ -	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ -			(unsigned long)(n), sizeof(*(ptr)))) - -#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) -  static inline int __atomic_add_unless(atomic_t *v, int a, int u)  {    int c, old; diff --git a/include/asm-generic/checksum.h b/include/asm-generic/checksum.h index c084767c88b..59811df58c5 100644 --- a/include/asm-generic/checksum.h +++ b/include/asm-generic/checksum.h @@ -38,12 +38,15 @@ extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,  	csum_partial_copy((src), (dst), (len), (sum))  #endif +#ifndef ip_fast_csum  /*   * This is a version of ip_compute_csum() optimized for IP headers,   * which always checksum on 4 octet boundaries.   */  extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); +#endif +#ifndef csum_fold  /*   * Fold a partial checksum   */ @@ -54,6 +57,7 @@ static inline __sum16 csum_fold(__wsum csum)  	sum = (sum & 0xffff) + (sum >> 16);  	return (__force __sum16)~sum;  } +#endif  #ifndef csum_tcpudp_nofold  /* diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h index 2533fddd34a..d8d4c898c1b 100644 --- a/include/asm-generic/cmpxchg-local.h +++ b/include/asm-generic/cmpxchg-local.h @@ -21,7 +21,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr,  	if (size == 8 && sizeof(unsigned long) != 8)  		wrong_size_cmpxchg(ptr); -	local_irq_save(flags); +	raw_local_irq_save(flags);  	switch (size) {  	case 1: prev = *(u8 *)ptr;  		if (prev == old) @@ -42,7 +42,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr,  	default:  		wrong_size_cmpxchg(ptr);  	} -	local_irq_restore(flags); +	raw_local_irq_restore(flags);  	return prev;  } @@ -55,11 +55,11 @@ static inline u64 __cmpxchg64_local_generic(volatile void *ptr,  	u64 prev;  	unsigned long flags; -	local_irq_save(flags); +	raw_local_irq_save(flags);  	prev = *(u64 *)ptr;  	if (prev == old)  		*(u64 *)ptr = new; -	local_irq_restore(flags); +	raw_local_irq_restore(flags);  	return prev;  } diff --git a/include/asm-generic/cmpxchg.h b/include/asm-generic/cmpxchg.h index 14883026015..811fb1e9b06 100644 --- a/include/asm-generic/cmpxchg.h +++ b/include/asm-generic/cmpxchg.h @@ -92,6 +92,16 @@ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)   */  #include <asm-generic/cmpxchg-local.h> +#ifndef cmpxchg_local +#define cmpxchg_local(ptr, o, n)				  	       \ +	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ +			(unsigned long)(n), sizeof(*(ptr)))) +#endif + +#ifndef cmpxchg64_local +#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) +#endif +  #define cmpxchg(ptr, o, n)	cmpxchg_local((ptr), (o), (n))  #define cmpxchg64(ptr, o, n)	cmpxchg64_local((ptr), (o), (n)) diff --git a/include/asm-generic/cputime_nsecs.h b/include/asm-generic/cputime_nsecs.h index b6485cafb7b..a8ece9a33ae 100644 --- a/include/asm-generic/cputime_nsecs.h +++ b/include/asm-generic/cputime_nsecs.h @@ -76,7 +76,7 @@ static inline void cputime_to_timespec(const cputime_t ct, struct timespec *val)  /*   * Convert cputime <-> timeval (msec)   */ -static inline cputime_t timeval_to_cputime(struct timeval *val) +static inline cputime_t timeval_to_cputime(const struct timeval *val)  {  	u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_usec * NSEC_PER_USEC;  	return (__force cputime_t) ret; diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 20ca7663975..bde646995d1 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -47,12 +47,14 @@ struct gpio;  struct seq_file;  struct module;  struct device_node; +struct gpio_desc;  /**   * struct gpio_chip - abstract a GPIO controller   * @label: for diagnostics   * @dev: optional device providing the GPIOs   * @owner: helps prevent removal of modules exporting active GPIOs + * @list: links gpio_chips together for traversal   * @request: optional hook for chip-specific activation, such as   *	enabling module power and clock; may sleep   * @free: optional hook for chip-specific deactivation, such as @@ -75,6 +77,7 @@ struct device_node;   *	negative during registration, requests dynamic ID allocation.   * @ngpio: the number of GPIOs handled by this controller; the last GPIO   *	handled is (base + ngpio - 1). + * @desc: array of ngpio descriptors. Private.   * @can_sleep: flag must be set iff get()/set() methods sleep, as they   *	must while accessing GPIO expander chips over I2C or SPI   * @names: if set, must be an array of strings to use as alternative @@ -98,6 +101,7 @@ struct gpio_chip {  	const char		*label;  	struct device		*dev;  	struct module		*owner; +	struct list_head        list;  	int			(*request)(struct gpio_chip *chip,  						unsigned offset); @@ -124,6 +128,7 @@ struct gpio_chip {  						struct gpio_chip *chip);  	int			base;  	u16			ngpio; +	struct gpio_desc	*desc;  	const char		*const *names;  	unsigned		can_sleep:1;  	unsigned		exported:1; @@ -152,7 +157,6 @@ struct gpio_chip {  extern const char *gpiochip_is_requested(struct gpio_chip *chip,  			unsigned offset);  extern struct gpio_chip *gpio_to_chip(unsigned gpio); -extern int __must_check gpiochip_reserve(int start, int ngpio);  /* add/remove chips */  extern int gpiochip_add(struct gpio_chip *chip); @@ -192,12 +196,6 @@ extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *labe  extern int gpio_request_array(const struct gpio *array, size_t num);  extern void gpio_free_array(const struct gpio *array, size_t num); -/* bindings for managed devices that want to request gpios */ -int devm_gpio_request(struct device *dev, unsigned gpio, const char *label); -int devm_gpio_request_one(struct device *dev, unsigned gpio, -			  unsigned long flags, const char *label); -void devm_gpio_free(struct device *dev, unsigned int gpio); -  #ifdef CONFIG_GPIO_SYSFS  /* @@ -212,6 +210,43 @@ extern void gpio_unexport(unsigned gpio);  #endif	/* CONFIG_GPIO_SYSFS */ +#ifdef CONFIG_PINCTRL + +/** + * struct gpio_pin_range - pin range controlled by a gpio chip + * @head: list for maintaining set of pin ranges, used internally + * @pctldev: pinctrl device which handles corresponding pins + * @range: actual range of pins controlled by a gpio controller + */ + +struct gpio_pin_range { +	struct list_head node; +	struct pinctrl_dev *pctldev; +	struct pinctrl_gpio_range range; +}; + +int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, +			   unsigned int gpio_offset, unsigned int pin_offset, +			   unsigned int npins); +void gpiochip_remove_pin_ranges(struct gpio_chip *chip); + +#else + +static inline int +gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, +		       unsigned int gpio_offset, unsigned int pin_offset, +		       unsigned int npins) +{ +	return 0; +} + +static inline void +gpiochip_remove_pin_ranges(struct gpio_chip *chip) +{ +} + +#endif /* CONFIG_PINCTRL */ +  #else	/* !CONFIG_GPIOLIB */  static inline bool gpio_is_valid(int number) @@ -270,41 +305,4 @@ static inline void gpio_unexport(unsigned gpio)  }  #endif	/* CONFIG_GPIO_SYSFS */ -#ifdef CONFIG_PINCTRL - -/** - * struct gpio_pin_range - pin range controlled by a gpio chip - * @head: list for maintaining set of pin ranges, used internally - * @pctldev: pinctrl device which handles corresponding pins - * @range: actual range of pins controlled by a gpio controller - */ - -struct gpio_pin_range { -	struct list_head node; -	struct pinctrl_dev *pctldev; -	struct pinctrl_gpio_range range; -}; - -int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, -			   unsigned int gpio_offset, unsigned int pin_offset, -			   unsigned int npins); -void gpiochip_remove_pin_ranges(struct gpio_chip *chip); - -#else - -static inline int -gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, -		       unsigned int gpio_offset, unsigned int pin_offset, -		       unsigned int npins) -{ -	return 0; -} - -static inline void -gpiochip_remove_pin_ranges(struct gpio_chip *chip) -{ -} - -#endif /* CONFIG_PINCTRL */ -  #endif /* _ASM_GENERIC_GPIO_H */ diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 33bbbae4ddc..ac9da00e9f2 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -53,8 +53,18 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)  #endif  #define readb __raw_readb -#define readw(addr) __le16_to_cpu(__raw_readw(addr)) -#define readl(addr) __le32_to_cpu(__raw_readl(addr)) + +#define readw readw +static inline u16 readw(const volatile void __iomem *addr) +{ +	return __le16_to_cpu(__raw_readw(addr)); +} + +#define readl readl +static inline u32 readl(const volatile void __iomem *addr) +{ +	return __le32_to_cpu(__raw_readl(addr)); +}  #ifndef __raw_writeb  static inline void __raw_writeb(u8 b, volatile void __iomem *addr) @@ -89,7 +99,11 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)  }  #endif -#define readq(addr) __le64_to_cpu(__raw_readq(addr)) +#define readq readq +static inline u64 readq(const volatile void __iomem *addr) +{ +	return __le64_to_cpu(__raw_readq(addr)); +}  #ifndef __raw_writeq  static inline void __raw_writeq(u64 b, volatile void __iomem *addr) @@ -225,15 +239,15 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)  #ifndef CONFIG_GENERIC_IOMAP  #define ioread8(addr)		readb(addr)  #define ioread16(addr)		readw(addr) -#define ioread16be(addr)	be16_to_cpu(ioread16(addr)) +#define ioread16be(addr)	__be16_to_cpu(__raw_readw(addr))  #define ioread32(addr)		readl(addr) -#define ioread32be(addr)	be32_to_cpu(ioread32(addr)) +#define ioread32be(addr)	__be32_to_cpu(__raw_readl(addr))  #define iowrite8(v, addr)	writeb((v), (addr))  #define iowrite16(v, addr)	writew((v), (addr)) -#define iowrite16be(v, addr)	iowrite16(be16_to_cpu(v), (addr)) +#define iowrite16be(v, addr)	__raw_writew(__cpu_to_be16(v), addr)  #define iowrite32(v, addr)	writel((v), (addr)) -#define iowrite32be(v, addr)	iowrite32(be32_to_cpu(v), (addr)) +#define iowrite32be(v, addr)	__raw_writel(__cpu_to_be32(v), addr)  #define ioread8_rep(p, dst, count) \  	insb((unsigned long) (p), (dst), (count)) @@ -332,6 +346,7 @@ extern void ioport_unmap(void __iomem *p);  #define xlate_dev_kmem_ptr(p)	p  #define xlate_dev_mem_ptr(p)	__va(p) +#ifdef CONFIG_VIRT_TO_BUS  #ifndef virt_to_bus  static inline unsigned long virt_to_bus(volatile void *address)  { @@ -343,6 +358,7 @@ static inline void *bus_to_virt(unsigned long address)  	return (void *) address;  }  #endif +#endif  #ifndef memset_io  #define memset_io(a, b, c)	memset(__io_virt(a), (b), (c)) diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 5cf680a98f9..bfd87685fc1 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -197,16 +197,6 @@ static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */  #endif -#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY -#define page_test_and_clear_dirty(pfn, mapped)	(0) -#endif - -#ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY -#define pte_maybe_dirty(pte)		pte_dirty(pte) -#else -#define pte_maybe_dirty(pte)		(1) -#endif -  #ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG  #define page_test_and_clear_young(pfn) (0)  #endif diff --git a/include/asm-generic/syscalls.h b/include/asm-generic/syscalls.h index 1db51b8524e..1f74be5113b 100644 --- a/include/asm-generic/syscalls.h +++ b/include/asm-generic/syscalls.h @@ -21,24 +21,8 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  			unsigned long fd, off_t pgoff);  #endif -#ifndef CONFIG_GENERIC_SIGALTSTACK -#ifndef sys_sigaltstack -asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *, -			struct pt_regs *); -#endif -#endif -  #ifndef sys_rt_sigreturn  asmlinkage long sys_rt_sigreturn(struct pt_regs *regs);  #endif -#ifndef sys_rt_sigsuspend -asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize); -#endif - -#ifndef sys_rt_sigaction -asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user *act, -			 struct sigaction __user *oact, size_t sigsetsize); -#endif -  #endif /* __ASM_GENERIC_SYSCALLS_H */ diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 25f01d0bc14..b1b1fa6ffff 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -99,7 +99,12 @@ struct mmu_gather {  	unsigned int		need_flush : 1,	/* Did free PTEs */  				fast_mode  : 1; /* No batching   */ -	unsigned int		fullmm; +	/* we are in the middle of an operation to clear +	 * a full mm and can make some optimizations */ +	unsigned int		fullmm : 1, +	/* we have performed an operation which +	 * requires a complete flush of the tlb */ +				need_flush_all : 1;  	struct mmu_gather_batch *active;  	struct mmu_gather_batch	local; diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h index 9788568f797..c184aa8ec8c 100644 --- a/include/asm-generic/uaccess.h +++ b/include/asm-generic/uaccess.h @@ -7,7 +7,6 @@   * address space, e.g. all NOMMU machines.   */  #include <linux/sched.h> -#include <linux/mm.h>  #include <linux/string.h>  #include <asm/segment.h> @@ -32,7 +31,9 @@ static inline void set_fs(mm_segment_t fs)  }  #endif +#ifndef segment_eq  #define segment_eq(a, b) ((a).seg == (b).seg) +#endif  #define VERIFY_READ	0  #define VERIFY_WRITE	1 @@ -168,12 +169,18 @@ static inline __must_check long __copy_to_user(void __user *to,  		-EFAULT;					\  }) +#ifndef __put_user_fn +  static inline int __put_user_fn(size_t size, void __user *ptr, void *x)  {  	size = __copy_to_user(ptr, x, size);  	return size ? -EFAULT : size;  } +#define __put_user_fn(sz, u, k)	__put_user_fn(sz, u, k) + +#endif +  extern int __put_user_bad(void) __attribute__((noreturn));  #define __get_user(x, ptr)					\ @@ -224,12 +231,17 @@ extern int __put_user_bad(void) __attribute__((noreturn));  		-EFAULT;					\  }) +#ifndef __get_user_fn  static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)  {  	size = __copy_from_user(x, ptr, size);  	return size ? -EFAULT : size;  } +#define __get_user_fn(sz, u, k)	__get_user_fn(sz, u, k) + +#endif +  extern int __get_user_bad(void) __attribute__((noreturn));  #ifndef __copy_from_user_inatomic diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h index a36991ab334..4077b5d9ff8 100644 --- a/include/asm-generic/unistd.h +++ b/include/asm-generic/unistd.h @@ -9,9 +9,6 @@  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_LLSEEK  #endif -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND -#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND  /*   * "Conditional" syscalls @@ -20,5 +17,12 @@   * but it doesn't work on all toolchains, so we just do it by hand   */  #ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#ifdef CONFIG_SYMBOL_PREFIX +#define __SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX +#else +#define __SYMBOL_PREFIX +#endif +#define cond_syscall(x) asm(".weak\t" __SYMBOL_PREFIX #x "\n\t" \ +			    ".set\t" __SYMBOL_PREFIX #x "," \ +			    __SYMBOL_PREFIX "sys_ni_syscall")  #endif diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index d1ea7ce0b4c..afa12c7a025 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -149,6 +149,33 @@  #define TRACE_SYSCALLS()  #endif +#ifdef CONFIG_CLKSRC_OF +#define CLKSRC_OF_TABLES() . = ALIGN(8);				\ +			   VMLINUX_SYMBOL(__clksrc_of_table) = .;	\ +			   *(__clksrc_of_table)				\ +			   *(__clksrc_of_table_end) +#else +#define CLKSRC_OF_TABLES() +#endif + +#ifdef CONFIG_IRQCHIP +#define IRQCHIP_OF_MATCH_TABLE()					\ +	. = ALIGN(8);							\ +	VMLINUX_SYMBOL(__irqchip_begin) = .;				\ +	*(__irqchip_of_table)		  				\ +	*(__irqchip_of_end) +#else +#define IRQCHIP_OF_MATCH_TABLE() +#endif + +#ifdef CONFIG_COMMON_CLK +#define CLK_OF_TABLES() . = ALIGN(8);				\ +			VMLINUX_SYMBOL(__clk_of_table) = .;	\ +			*(__clk_of_table)			\ +			*(__clk_of_table_end) +#else +#define CLK_OF_TABLES() +#endif  #define KERNEL_DTB()							\  	STRUCT_ALIGN();							\ @@ -493,7 +520,10 @@  	DEV_DISCARD(init.rodata)					\  	CPU_DISCARD(init.rodata)					\  	MEM_DISCARD(init.rodata)					\ -	KERNEL_DTB() +	CLK_OF_TABLES()							\ +	CLKSRC_OF_TABLES()						\ +	KERNEL_DTB()							\ +	IRQCHIP_OF_MATCH_TABLE()  #define INIT_TEXT							\  	*(.init.text)							\ diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h new file mode 100644 index 00000000000..2603267b1a2 --- /dev/null +++ b/include/clocksource/arm_arch_timer.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2012 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef __CLKSOURCE_ARM_ARCH_TIMER_H +#define __CLKSOURCE_ARM_ARCH_TIMER_H + +#include <linux/clocksource.h> +#include <linux/types.h> + +#define ARCH_TIMER_CTRL_ENABLE		(1 << 0) +#define ARCH_TIMER_CTRL_IT_MASK		(1 << 1) +#define ARCH_TIMER_CTRL_IT_STAT		(1 << 2) + +#define ARCH_TIMER_REG_CTRL		0 +#define ARCH_TIMER_REG_TVAL		1 + +#define ARCH_TIMER_PHYS_ACCESS		0 +#define ARCH_TIMER_VIRT_ACCESS		1 + +#ifdef CONFIG_ARM_ARCH_TIMER + +extern int arch_timer_init(void); +extern u32 arch_timer_get_rate(void); +extern u64 (*arch_timer_read_counter)(void); +extern struct timecounter *arch_timer_get_timecounter(void); + +#else + +static inline int arch_timer_init(void) +{ +	return -ENXIO; +} + +static inline u32 arch_timer_get_rate(void) +{ +	return 0; +} + +static inline u64 arch_timer_read_counter(void) +{ +	return 0; +} + +static inline struct timecounter *arch_timer_get_timecounter(void) +{ +	return NULL; +} + +#endif + +#endif diff --git a/include/clocksource/arm_generic.h b/include/clocksource/metag_generic.h index 5b41b0d27f0..ac17e7d06cf 100644 --- a/include/clocksource/arm_generic.h +++ b/include/clocksource/metag_generic.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2013 Imaginaton Technologies Ltd.   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -13,9 +13,9 @@   * 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 __CLKSOURCE_ARM_GENERIC_H -#define __CLKSOURCE_ARM_GENERIC_H +#ifndef __CLKSOURCE_METAG_GENERIC_H +#define __CLKSOURCE_METAG_GENERIC_H -extern int arm_generic_timer_init(void); +extern int metag_generic_timer_init(void); -#endif +#endif /* __CLKSOURCE_METAG_GENERIC_H */ diff --git a/include/drm/drmP.h b/include/drm/drmP.h index fad21c927a3..2d94d7413d7 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -85,6 +85,9 @@ struct module;  struct drm_file;  struct drm_device; +struct device_node; +struct videomode; +  #include <drm/drm_os_linux.h>  #include <drm/drm_hashtab.h>  #include <drm/drm_mm.h> @@ -446,7 +449,15 @@ struct drm_file {  	int is_master; /* this file private is a master for a minor */  	struct drm_master *master; /* master this node is currently associated with  				      N.B. not always minor->master */ + +	/** +	 * fbs - List of framebuffers associated with this file. +	 * +	 * Protected by fbs_lock. Note that the fbs list holds a reference on +	 * the fb object to prevent it from untimely disappearing. +	 */  	struct list_head fbs; +	struct mutex fbs_lock;  	wait_queue_head_t event_wait;  	struct list_head event_list; @@ -919,6 +930,14 @@ struct drm_driver {  	/* import dmabuf -> GEM */  	struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,  				struct dma_buf *dma_buf); +	/* low-level interface used by drm_gem_prime_{import,export} */ +	int (*gem_prime_pin)(struct drm_gem_object *obj); +	struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj); +	struct drm_gem_object *(*gem_prime_import_sg_table)( +				struct drm_device *dev, size_t size, +				struct sg_table *sgt); +	void *(*gem_prime_vmap)(struct drm_gem_object *obj); +	void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);  	/* vga arb irq handler */  	void (*vgaarb_irq)(struct drm_device *dev, bool state); @@ -1276,6 +1295,11 @@ static inline int drm_device_is_unplugged(struct drm_device *dev)  	return ret;  } +static inline bool drm_modeset_is_locked(struct drm_device *dev) +{ +	return mutex_is_locked(&dev->mode_config.mutex); +} +  /******************************************************************/  /** \name Internal function definitions */  /*@{*/ @@ -1456,6 +1480,12 @@ extern struct drm_display_mode *  drm_mode_create_from_cmdline_mode(struct drm_device *dev,  				  struct drm_cmdline_mode *cmd); +extern int drm_display_mode_from_videomode(const struct videomode *vm, +					   struct drm_display_mode *dmode); +extern int of_get_drm_display_mode(struct device_node *np, +				   struct drm_display_mode *dmode, +				   int index); +  /* Modesetting support */  extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);  extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); @@ -1540,9 +1570,13 @@ extern int drm_clients_info(struct seq_file *m, void* data);  extern int drm_gem_name_info(struct seq_file *m, void *data); +extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev, +		struct drm_gem_object *obj, int flags);  extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,  		struct drm_file *file_priv, uint32_t handle, uint32_t flags,  		int *prime_fd); +extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, +		struct dma_buf *dma_buf);  extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,  		struct drm_file *file_priv, int prime_fd, uint32_t *handle); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 00d78b5161c..e3e0d651c6c 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -38,7 +38,8 @@ struct drm_device;  struct drm_mode_set;  struct drm_framebuffer;  struct drm_object_properties; - +struct drm_file; +struct drm_clip_rect;  #define DRM_MODE_OBJECT_CRTC 0xcccccccc  #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 @@ -254,6 +255,10 @@ struct drm_framebuffer {  	 * userspace perspective.  	 */  	struct kref refcount; +	/* +	 * Place on the dev->mode_config.fb_list, access protected by +	 * dev->mode_config.fb_lock. +	 */  	struct list_head head;  	struct drm_mode_object base;  	const struct drm_framebuffer_funcs *funcs; @@ -390,6 +395,15 @@ struct drm_crtc {  	struct drm_device *dev;  	struct list_head head; +	/** +	 * crtc mutex +	 * +	 * This provides a read lock for the overall crtc state (mode, dpms +	 * state, ...) and a write lock for everything which can be update +	 * without a full modeset (fb, cursor data, ...) +	 */ +	struct mutex mutex; +  	struct drm_mode_object base;  	/* framebuffer the connector is currently bound to */ @@ -429,12 +443,12 @@ struct drm_crtc {   * @dpms: set power state (see drm_crtc_funcs above)   * @save: save connector state   * @restore: restore connector state - * @reset: reset connector after state has been invalidate (e.g. resume) + * @reset: reset connector after state has been invalidated (e.g. resume)   * @detect: is this connector active?   * @fill_modes: fill mode list for this connector - * @set_property: property for this connector may need update + * @set_property: property for this connector may need an update   * @destroy: make object go away - * @force: notify the driver the connector is forced on + * @force: notify the driver that the connector is forced on   *   * Each CRTC may have one or more connectors attached to it.  The functions   * below allow the core DRM code to control connectors, enumerate available modes, @@ -771,8 +785,18 @@ struct drm_mode_config {  	struct mutex idr_mutex; /* for IDR management */  	struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */  	/* this is limited to one for now */ + + +	/** +	 * fb_lock - mutex to protect fb state +	 * +	 * Besides the global fb list his also protects the fbs list in the +	 * file_priv +	 */ +	struct mutex fb_lock;  	int num_fb;  	struct list_head fb_list; +  	int num_connector;  	struct list_head connector_list;  	int num_encoder; @@ -842,6 +866,10 @@ struct drm_prop_enum_list {  	char *name;  }; +extern void drm_modeset_lock_all(struct drm_device *dev); +extern void drm_modeset_unlock_all(struct drm_device *dev); +extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev); +  extern int drm_crtc_init(struct drm_device *dev,  			 struct drm_crtc *crtc,  			 const struct drm_crtc_funcs *funcs); @@ -932,10 +960,13 @@ extern void drm_framebuffer_set_object(struct drm_device *dev,  extern int drm_framebuffer_init(struct drm_device *dev,  				struct drm_framebuffer *fb,  				const struct drm_framebuffer_funcs *funcs); +extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev, +						      uint32_t id);  extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);  extern void drm_framebuffer_reference(struct drm_framebuffer *fb);  extern void drm_framebuffer_remove(struct drm_framebuffer *fb);  extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); +extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);  extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc);  extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);  extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY); @@ -985,6 +1016,7 @@ extern int drm_mode_getcrtc(struct drm_device *dev,  			    void *data, struct drm_file *file_priv);  extern int drm_mode_getconnector(struct drm_device *dev,  			      void *data, struct drm_file *file_priv); +extern int drm_mode_set_config_internal(struct drm_mode_set *set);  extern int drm_mode_setcrtc(struct drm_device *dev,  			    void *data, struct drm_file *file_priv);  extern int drm_mode_getplane(struct drm_device *dev, @@ -1030,9 +1062,10 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,  extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,  				    void *data, struct drm_file *file_priv);  extern u8 *drm_find_cea_extension(struct edid *edid); -extern u8 drm_match_cea_mode(struct drm_display_mode *to_match); +extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);  extern bool drm_detect_hdmi_monitor(struct edid *edid);  extern bool drm_detect_monitor_audio(struct edid *edid); +extern bool drm_rgb_quant_range_selectable(struct edid *edid);  extern int drm_mode_page_flip_ioctl(struct drm_device *dev,  				    void *data, struct drm_file *file_priv);  extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, @@ -1047,7 +1080,6 @@ extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,  				int GTF_2C, int GTF_K, int GTF_2J);  extern int drm_add_modes_noedid(struct drm_connector *connector,  				int hdisplay, int vdisplay); -extern uint8_t drm_mode_cea_vic(const struct drm_display_mode *mode);  extern int drm_edid_header_is_valid(const u8 *raw_edid);  extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid); diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index 0cac551c534..5da1b4ae7d8 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -247,6 +247,8 @@ struct edid {  struct drm_encoder;  struct drm_connector;  struct drm_display_mode; +struct hdmi_avi_infoframe; +  void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);  int drm_av_sync_delay(struct drm_connector *connector,  		      struct drm_display_mode *mode); @@ -254,4 +256,8 @@ struct drm_connector *drm_select_eld(struct drm_encoder *encoder,  				     struct drm_display_mode *mode);  int drm_load_edid_firmware(struct drm_connector *connector); +int +drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, +					 const struct drm_display_mode *mode); +  #endif /* __DRM_EDID_H__ */ diff --git a/include/drm/drm_encoder_slave.h b/include/drm/drm_encoder_slave.h index b0c11a7809b..8b9cc367185 100644 --- a/include/drm/drm_encoder_slave.h +++ b/include/drm/drm_encoder_slave.h @@ -159,4 +159,24 @@ static inline void drm_i2c_encoder_unregister(struct drm_i2c_encoder_driver *dri  void drm_i2c_encoder_destroy(struct drm_encoder *encoder); + +/* + * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs: + */ + +void drm_i2c_encoder_dpms(struct drm_encoder *encoder, int mode); +bool drm_i2c_encoder_mode_fixup(struct drm_encoder *encoder, +		const struct drm_display_mode *mode, +		struct drm_display_mode *adjusted_mode); +void drm_i2c_encoder_prepare(struct drm_encoder *encoder); +void drm_i2c_encoder_commit(struct drm_encoder *encoder); +void drm_i2c_encoder_mode_set(struct drm_encoder *encoder, +		struct drm_display_mode *mode, +		struct drm_display_mode *adjusted_mode); +enum drm_connector_status drm_i2c_encoder_detect(struct drm_encoder *encoder, +	    struct drm_connector *connector); +void drm_i2c_encoder_save(struct drm_encoder *encoder); +void drm_i2c_encoder_restore(struct drm_encoder *encoder); + +  #endif diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h index 76c70983754..4a3fc244301 100644 --- a/include/drm/drm_fb_cma_helper.h +++ b/include/drm/drm_fb_cma_helper.h @@ -23,5 +23,10 @@ struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,  struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,  	unsigned int plane); +#ifdef CONFIG_DEBUG_FS +void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m); +int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg); +#endif +  #endif diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index 5120b01c2ee..c09511625a1 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -48,6 +48,18 @@ struct drm_fb_helper_surface_size {  	u32 surface_depth;  }; +/** + * struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library + * @gamma_set: - Set the given gamma lut register on the given crtc. + * @gamma_get: - Read the given gamma lut register on the given crtc, used to + * 		 save the current lut when force-restoring the fbdev for e.g. + * 		 kdbg. + * @fb_probe: - Driver callback to allocate and initialize the fbdev info + * 		structure. Futhermore it also needs to allocate the drm + * 		framebuffer used to back the fbdev. + * + * Driver callbacks used by the fbdev emulation helper library. + */  struct drm_fb_helper_funcs {  	void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,  			  u16 blue, int regno); @@ -65,9 +77,7 @@ struct drm_fb_helper_connector {  struct drm_fb_helper {  	struct drm_framebuffer *fb; -	struct drm_framebuffer *saved_fb;  	struct drm_device *dev; -	struct drm_display_mode *mode;  	int crtc_count;  	struct drm_fb_helper_crtc *crtc_info;  	int connector_count; @@ -82,9 +92,6 @@ struct drm_fb_helper {  	bool delayed_hotplug;  }; -int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper, -				  int preferred_bpp); -  int drm_fb_helper_init(struct drm_device *dev,  		       struct drm_fb_helper *helper, int crtc_count,  		       int max_conn); @@ -103,7 +110,6 @@ int drm_fb_helper_setcolreg(unsigned regno,  			    struct fb_info *info);  bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); -void drm_fb_helper_restore(void);  void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,  			    uint32_t fb_width, uint32_t fb_height);  void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h index f0f6b1af25a..63397ced925 100644 --- a/include/drm/drm_gem_cma_helper.h +++ b/include/drm/drm_gem_cma_helper.h @@ -41,4 +41,8 @@ struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,  extern const struct vm_operations_struct drm_gem_cma_vm_ops; +#ifdef CONFIG_DEBUG_FS +void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m); +#endif +  #endif /* __DRM_GEM_CMA_HELPER_H__ */ diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 3527fb3f75b..88591ef8fa2 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -89,6 +89,29 @@ static inline bool drm_mm_initialized(struct drm_mm *mm)  {  	return mm->hole_stack.next;  } + +static inline unsigned long __drm_mm_hole_node_start(struct drm_mm_node *hole_node) +{ +	return hole_node->start + hole_node->size; +} + +static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) +{ +	BUG_ON(!hole_node->hole_follows); +	return __drm_mm_hole_node_start(hole_node); +} + +static inline unsigned long __drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ +	return list_entry(hole_node->node_list.next, +			  struct drm_mm_node, node_list)->start; +} + +static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ +	return __drm_mm_hole_node_end(hole_node); +} +  #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \  						&(mm)->head_node.node_list, \  						node_list) @@ -99,9 +122,26 @@ static inline bool drm_mm_initialized(struct drm_mm *mm)  	     entry != NULL; entry = next, \  		next = entry ? list_entry(entry->node_list.next, \  			struct drm_mm_node, node_list) : NULL) \ + +/* Note that we need to unroll list_for_each_entry in order to inline + * setting hole_start and hole_end on each iteration and keep the + * macro sane. + */ +#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ +	for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ +	     &entry->hole_stack != &(mm)->hole_stack ? \ +	     hole_start = drm_mm_hole_node_start(entry), \ +	     hole_end = drm_mm_hole_node_end(entry), \ +	     1 : 0; \ +	     entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack)) +  /*   * Basic range manager support (drm_mm.c)   */ +extern struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm, +					       unsigned long start, +					       unsigned long size, +					       bool atomic);  extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node,  						    unsigned long size,  						    unsigned alignment, diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index c5c35e62942..918e8fe2f5e 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h @@ -139,6 +139,19 @@  	{0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ @@ -568,7 +581,11 @@  	{0x1002, 0x9908, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9909, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x990A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ -	{0x1002, 0x990F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9910, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9913, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9917, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ @@ -579,6 +596,13 @@  	{0x1002, 0x9992, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9993, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9994, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9995, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9996, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9997, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9998, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9999, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x99A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x99A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x99A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h index 6eb76a1f11a..b08bdade600 100644 --- a/include/drm/intel-gtt.h +++ b/include/drm/intel-gtt.h @@ -3,26 +3,8 @@  #ifndef _DRM_INTEL_GTT_H  #define	_DRM_INTEL_GTT_H -struct intel_gtt { -	/* Size of memory reserved for graphics by the BIOS */ -	unsigned int stolen_size; -	/* Total number of gtt entries. */ -	unsigned int gtt_total_entries; -	/* Part of the gtt that is mappable by the cpu, for those chips where -	 * this is not the full gtt. */ -	unsigned int gtt_mappable_entries; -	/* Whether i915 needs to use the dmar apis or not. */ -	unsigned int needs_dmar : 1; -	/* Whether we idle the gpu before mapping/unmapping */ -	unsigned int do_idle_maps : 1; -	/* Share the scratch page dma with ppgtts. */ -	dma_addr_t scratch_page_dma; -	struct page *scratch_page; -	/* for ppgtt PDE access */ -	u32 __iomem *gtt; -	/* needed for ioremap in drm/i915 */ -	phys_addr_t gma_bus_addr; -} *intel_gtt_get(void); +void intel_gtt_get(size_t *gtt_total, size_t *stolen_size, +		   phys_addr_t *mappable_base, unsigned long *mappable_end);  int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,  		     struct agp_bridge_data *bridge); diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index e3a43a47d78..0fbd046e7c9 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -790,16 +790,7 @@ extern void ttm_mem_io_unlock(struct ttm_mem_type_manager *man);   * to make room for a buffer already reserved. (Buffers are reserved before   * they are evicted). The following algorithm prevents such deadlocks from   * occurring: - * 1) Buffers are reserved with the lru spinlock held. Upon successful - * reservation they are removed from the lru list. This stops a reserved buffer - * from being evicted. However the lru spinlock is released between the time - * a buffer is selected for eviction and the time it is reserved. - * Therefore a check is made when a buffer is reserved for eviction, that it - * is still the first buffer in the lru list, before it is removed from the - * list. @check_lru == 1 forces this check. If it fails, the function returns - * -EINVAL, and the caller should then choose a new buffer to evict and repeat - * the procedure. - * 2) Processes attempting to reserve multiple buffers other than for eviction, + * Processes attempting to reserve multiple buffers other than for eviction,   * (typically execbuf), should first obtain a unique 32-bit   * validation sequence number,   * and call this function with @use_sequence == 1 and @sequence == the unique @@ -830,9 +821,39 @@ extern int ttm_bo_reserve(struct ttm_buffer_object *bo,  			  bool interruptible,  			  bool no_wait, bool use_sequence, uint32_t sequence); +/** + * ttm_bo_reserve_slowpath_nolru: + * @bo: A pointer to a struct ttm_buffer_object. + * @interruptible: Sleep interruptible if waiting. + * @sequence: Set (@bo)->sequence to this value after lock + * + * This is called after ttm_bo_reserve returns -EAGAIN and we backed off + * from all our other reservations. Because there are no other reservations + * held by us, this function cannot deadlock any more. + * + * Will not remove reserved buffers from the lru lists. + * Otherwise identical to ttm_bo_reserve_slowpath. + */ +extern int ttm_bo_reserve_slowpath_nolru(struct ttm_buffer_object *bo, +					 bool interruptible, +					 uint32_t sequence); +  /** - * ttm_bo_reserve_locked: + * ttm_bo_reserve_slowpath: + * @bo: A pointer to a struct ttm_buffer_object. + * @interruptible: Sleep interruptible if waiting. + * @sequence: Set (@bo)->sequence to this value after lock + * + * This is called after ttm_bo_reserve returns -EAGAIN and we backed off + * from all our other reservations. Because there are no other reservations + * held by us, this function cannot deadlock any more. + */ +extern int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo, +				   bool interruptible, uint32_t sequence); + +/** + * ttm_bo_reserve_nolru:   *   * @bo: A pointer to a struct ttm_buffer_object.   * @interruptible: Sleep interruptible if waiting. @@ -840,9 +861,7 @@ extern int ttm_bo_reserve(struct ttm_buffer_object *bo,   * @use_sequence: If @bo is already reserved, Only sleep waiting for   * it to become unreserved if @sequence < (@bo)->sequence.   * - * Must be called with struct ttm_bo_global::lru_lock held, - * and will not remove reserved buffers from the lru lists. - * The function may release the LRU spinlock if it needs to sleep. + * Will not remove reserved buffers from the lru lists.   * Otherwise identical to ttm_bo_reserve.   *   * Returns: @@ -855,7 +874,7 @@ extern int ttm_bo_reserve(struct ttm_buffer_object *bo,   * -EDEADLK: Bo already reserved using @sequence. This error code will only   * be returned if @use_sequence is set to true.   */ -extern int ttm_bo_reserve_locked(struct ttm_buffer_object *bo, +extern int ttm_bo_reserve_nolru(struct ttm_buffer_object *bo,  				 bool interruptible,  				 bool no_wait, bool use_sequence,  				 uint32_t sequence); @@ -879,18 +898,6 @@ extern void ttm_bo_unreserve(struct ttm_buffer_object *bo);   */  extern void ttm_bo_unreserve_locked(struct ttm_buffer_object *bo); -/** - * ttm_bo_wait_unreserved - * - * @bo: A pointer to a struct ttm_buffer_object. - * - * Wait for a struct ttm_buffer_object to become unreserved. - * This is typically used in the execbuf code to relax cpu-usage when - * a potential deadlock condition backoff. - */ -extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, -				  bool interruptible); -  /*   * ttm_bo_util.c   */ diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 3994d7790b2..03053aca5b3 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -74,9 +74,10 @@ enum acpi_address_range_id {  /* Table Handlers */ -typedef int (*acpi_table_handler) (struct acpi_table_header *table); +typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table); -typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end); +typedef int (*acpi_tbl_entry_handler)(struct acpi_subtable_header *header, +				      const unsigned long end);  #ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE  void acpi_initrd_override(void *data, size_t size); @@ -95,10 +96,14 @@ int acpi_mps_check (void);  int acpi_numa_init (void);  int acpi_table_init (void); -int acpi_table_parse (char *id, acpi_table_handler handler); +int acpi_table_parse(char *id, acpi_tbl_table_handler handler);  int __init acpi_table_parse_entries(char *id, unsigned long table_size, -	int entry_id, acpi_table_entry_handler handler, unsigned int max_entries); -int acpi_table_parse_madt (enum acpi_madt_type id, acpi_table_entry_handler handler, unsigned int max_entries); +				    int entry_id, +				    acpi_tbl_entry_handler handler, +				    unsigned int max_entries); +int acpi_table_parse_madt(enum acpi_madt_type id, +			  acpi_tbl_entry_handler handler, +			  unsigned int max_entries);  int acpi_parse_mcfg (struct acpi_table_header *header);  void acpi_table_print_madt_entry (struct acpi_subtable_header *madt); @@ -147,15 +152,6 @@ void acpi_penalize_isa_irq(int irq, int active);  void acpi_pci_irq_disable (struct pci_dev *dev); -struct acpi_pci_driver { -	struct list_head node; -	int (*add)(struct acpi_pci_root *root); -	void (*remove)(struct acpi_pci_root *root); -}; - -int acpi_pci_register_driver(struct acpi_pci_driver *driver); -void acpi_pci_unregister_driver(struct acpi_pci_driver *driver); -  extern int ec_read(u8 addr, u8 *val);  extern int ec_write(u8 addr, u8 val);  extern int ec_transaction(u8 command, @@ -358,8 +354,7 @@ extern acpi_status acpi_pci_osc_control_set(acpi_handle handle,  #if defined(CONFIG_ACPI_HOTPLUG_CPU) &&			\  	(defined(CONFIG_ACPI_HOTPLUG_MEMORY) ||		\  	 defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)) &&	\ -	(defined(CONFIG_ACPI_CONTAINER) ||		\ -	 defined(CONFIG_ACPI_CONTAINER_MODULE)) +	defined(CONFIG_ACPI_CONTAINER)  #define ACPI_HOTPLUG_OST  #endif @@ -511,7 +506,7 @@ static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }  static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }  #endif -#ifdef CONFIG_ACPI_SLEEP +#if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)  int acpi_dev_suspend_late(struct device *dev);  int acpi_dev_resume_early(struct device *dev);  int acpi_subsys_prepare(struct device *dev); @@ -526,9 +521,14 @@ static inline int acpi_subsys_resume_early(struct device *dev) { return 0; }  #endif  #if defined(CONFIG_ACPI) && defined(CONFIG_PM) +struct acpi_device *acpi_dev_pm_get_node(struct device *dev);  int acpi_dev_pm_attach(struct device *dev, bool power_on);  void acpi_dev_pm_detach(struct device *dev, bool power_off);  #else +static inline struct acpi_device *acpi_dev_pm_get_node(struct device *dev) +{ +	return NULL; +}  static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)  {  	return -ENODEV; diff --git a/include/linux/acpi_gpio.h b/include/linux/acpi_gpio.h index 91615a389b6..b76ebd08ff8 100644 --- a/include/linux/acpi_gpio.h +++ b/include/linux/acpi_gpio.h @@ -2,10 +2,12 @@  #define _LINUX_ACPI_GPIO_H_  #include <linux/errno.h> +#include <linux/gpio.h>  #ifdef CONFIG_GPIO_ACPI  int acpi_get_gpio(char *path, int pin); +void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);  #else /* CONFIG_GPIO_ACPI */ @@ -14,6 +16,8 @@ static inline int acpi_get_gpio(char *path, int pin)  	return -ENODEV;  } +static inline void acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { } +  #endif /* CONFIG_GPIO_ACPI */  #endif /* _LINUX_ACPI_GPIO_H_ */ diff --git a/include/linux/amba/pl080.h b/include/linux/amba/pl080.h new file mode 100644 index 00000000000..3e7b62fbefb --- /dev/null +++ b/include/linux/amba/pl080.h @@ -0,0 +1,146 @@ +/* include/linux/amba/pl080.h + * + * Copyright 2008 Openmoko, Inc. + * Copyright 2008 Simtec Electronics + *      http://armlinux.simtec.co.uk/ + *      Ben Dooks <ben@simtec.co.uk> + * + * ARM PrimeCell PL080 DMA controller + * + * 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. +*/ + +/* Note, there are some Samsung updates to this controller block which + * make it not entierly compatible with the PL080 specification from + * ARM. When in doubt, check the Samsung documentation first. + * + * The Samsung defines are PL080S, and add an extra control register, + * the ability to move more than 2^11 counts of data and some extra + * OneNAND features. +*/ + +#ifndef ASM_PL080_H +#define ASM_PL080_H + +#define PL080_INT_STATUS			(0x00) +#define PL080_TC_STATUS				(0x04) +#define PL080_TC_CLEAR				(0x08) +#define PL080_ERR_STATUS			(0x0C) +#define PL080_ERR_CLEAR				(0x10) +#define PL080_RAW_TC_STATUS			(0x14) +#define PL080_RAW_ERR_STATUS			(0x18) +#define PL080_EN_CHAN				(0x1c) +#define PL080_SOFT_BREQ				(0x20) +#define PL080_SOFT_SREQ				(0x24) +#define PL080_SOFT_LBREQ			(0x28) +#define PL080_SOFT_LSREQ			(0x2C) + +#define PL080_CONFIG				(0x30) +#define PL080_CONFIG_M2_BE			(1 << 2) +#define PL080_CONFIG_M1_BE			(1 << 1) +#define PL080_CONFIG_ENABLE			(1 << 0) + +#define PL080_SYNC				(0x34) + +/* Per channel configuration registers */ + +#define PL080_Cx_STRIDE				(0x20) +#define PL080_Cx_BASE(x)			((0x100 + (x * 0x20))) +#define PL080_Cx_SRC_ADDR(x)			((0x100 + (x * 0x20))) +#define PL080_Cx_DST_ADDR(x)			((0x104 + (x * 0x20))) +#define PL080_Cx_LLI(x)				((0x108 + (x * 0x20))) +#define PL080_Cx_CONTROL(x)			((0x10C + (x * 0x20))) +#define PL080_Cx_CONFIG(x)			((0x110 + (x * 0x20))) +#define PL080S_Cx_CONTROL2(x)			((0x110 + (x * 0x20))) +#define PL080S_Cx_CONFIG(x)			((0x114 + (x * 0x20))) + +#define PL080_CH_SRC_ADDR			(0x00) +#define PL080_CH_DST_ADDR			(0x04) +#define PL080_CH_LLI				(0x08) +#define PL080_CH_CONTROL			(0x0C) +#define PL080_CH_CONFIG				(0x10) +#define PL080S_CH_CONTROL2			(0x10) +#define PL080S_CH_CONFIG			(0x14) + +#define PL080_LLI_ADDR_MASK			(0x3fffffff << 2) +#define PL080_LLI_ADDR_SHIFT			(2) +#define PL080_LLI_LM_AHB2			(1 << 0) + +#define PL080_CONTROL_TC_IRQ_EN			(1 << 31) +#define PL080_CONTROL_PROT_MASK			(0x7 << 28) +#define PL080_CONTROL_PROT_SHIFT		(28) +#define PL080_CONTROL_PROT_CACHE		(1 << 30) +#define PL080_CONTROL_PROT_BUFF			(1 << 29) +#define PL080_CONTROL_PROT_SYS			(1 << 28) +#define PL080_CONTROL_DST_INCR			(1 << 27) +#define PL080_CONTROL_SRC_INCR			(1 << 26) +#define PL080_CONTROL_DST_AHB2			(1 << 25) +#define PL080_CONTROL_SRC_AHB2			(1 << 24) +#define PL080_CONTROL_DWIDTH_MASK		(0x7 << 21) +#define PL080_CONTROL_DWIDTH_SHIFT		(21) +#define PL080_CONTROL_SWIDTH_MASK		(0x7 << 18) +#define PL080_CONTROL_SWIDTH_SHIFT		(18) +#define PL080_CONTROL_DB_SIZE_MASK		(0x7 << 15) +#define PL080_CONTROL_DB_SIZE_SHIFT		(15) +#define PL080_CONTROL_SB_SIZE_MASK		(0x7 << 12) +#define PL080_CONTROL_SB_SIZE_SHIFT		(12) +#define PL080_CONTROL_TRANSFER_SIZE_MASK	(0xfff << 0) +#define PL080_CONTROL_TRANSFER_SIZE_SHIFT	(0) + +#define PL080_BSIZE_1				(0x0) +#define PL080_BSIZE_4				(0x1) +#define PL080_BSIZE_8				(0x2) +#define PL080_BSIZE_16				(0x3) +#define PL080_BSIZE_32				(0x4) +#define PL080_BSIZE_64				(0x5) +#define PL080_BSIZE_128				(0x6) +#define PL080_BSIZE_256				(0x7) + +#define PL080_WIDTH_8BIT			(0x0) +#define PL080_WIDTH_16BIT			(0x1) +#define PL080_WIDTH_32BIT			(0x2) + +#define PL080N_CONFIG_ITPROT			(1 << 20) +#define PL080N_CONFIG_SECPROT			(1 << 19) +#define PL080_CONFIG_HALT			(1 << 18) +#define PL080_CONFIG_ACTIVE			(1 << 17)  /* RO */ +#define PL080_CONFIG_LOCK			(1 << 16) +#define PL080_CONFIG_TC_IRQ_MASK		(1 << 15) +#define PL080_CONFIG_ERR_IRQ_MASK		(1 << 14) +#define PL080_CONFIG_FLOW_CONTROL_MASK		(0x7 << 11) +#define PL080_CONFIG_FLOW_CONTROL_SHIFT		(11) +#define PL080_CONFIG_DST_SEL_MASK		(0xf << 6) +#define PL080_CONFIG_DST_SEL_SHIFT		(6) +#define PL080_CONFIG_SRC_SEL_MASK		(0xf << 1) +#define PL080_CONFIG_SRC_SEL_SHIFT		(1) +#define PL080_CONFIG_ENABLE			(1 << 0) + +#define PL080_FLOW_MEM2MEM			(0x0) +#define PL080_FLOW_MEM2PER			(0x1) +#define PL080_FLOW_PER2MEM			(0x2) +#define PL080_FLOW_SRC2DST			(0x3) +#define PL080_FLOW_SRC2DST_DST			(0x4) +#define PL080_FLOW_MEM2PER_PER			(0x5) +#define PL080_FLOW_PER2MEM_PER			(0x6) +#define PL080_FLOW_SRC2DST_SRC			(0x7) + +/* DMA linked list chain structure */ + +struct pl080_lli { +	u32	src_addr; +	u32	dst_addr; +	u32	next_lli; +	u32	control0; +}; + +struct pl080s_lli { +	u32	src_addr; +	u32	dst_addr; +	u32	next_lli; +	u32	control0; +	u32	control1; +}; + +#endif /* ASM_PL080_H */ diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index f612c783170..62d9303c283 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h @@ -203,6 +203,9 @@ struct amba_pl011_data {  	bool (*dma_filter)(struct dma_chan *chan, void *filter_param);  	void *dma_rx_param;  	void *dma_tx_param; +	bool dma_rx_poll_enable; +	unsigned int dma_rx_poll_rate; +	unsigned int dma_rx_poll_timeout;          void (*init) (void);  	void (*exit) (void);  }; diff --git a/include/linux/amba/sp810.h b/include/linux/amba/sp810.h new file mode 100644 index 00000000000..6636430dd0e --- /dev/null +++ b/include/linux/amba/sp810.h @@ -0,0 +1,64 @@ +/* + * arch/arm/include/asm/hardware/sp810.h + * + * ARM PrimeXsys System Controller SP810 header file + * + * Copyright (C) 2009 ST Microelectronics + * Viresh Kumar <viresh.linux@gmail.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef __ASM_ARM_SP810_H +#define __ASM_ARM_SP810_H + +#include <linux/io.h> + +/* sysctl registers offset */ +#define SCCTRL			0x000 +#define SCSYSSTAT		0x004 +#define SCIMCTRL		0x008 +#define SCIMSTAT		0x00C +#define SCXTALCTRL		0x010 +#define SCPLLCTRL		0x014 +#define SCPLLFCTRL		0x018 +#define SCPERCTRL0		0x01C +#define SCPERCTRL1		0x020 +#define SCPEREN			0x024 +#define SCPERDIS		0x028 +#define SCPERCLKEN		0x02C +#define SCPERSTAT		0x030 +#define SCSYSID0		0xEE0 +#define SCSYSID1		0xEE4 +#define SCSYSID2		0xEE8 +#define SCSYSID3		0xEEC +#define SCITCR			0xF00 +#define SCITIR0			0xF04 +#define SCITIR1			0xF08 +#define SCITOR			0xF0C +#define SCCNTCTRL		0xF10 +#define SCCNTDATA		0xF14 +#define SCCNTSTEP		0xF18 +#define SCPERIPHID0		0xFE0 +#define SCPERIPHID1		0xFE4 +#define SCPERIPHID2		0xFE8 +#define SCPERIPHID3		0xFEC +#define SCPCELLID0		0xFF0 +#define SCPCELLID1		0xFF4 +#define SCPCELLID2		0xFF8 +#define SCPCELLID3		0xFFC + +#define SCCTRL_TIMERENnSEL_SHIFT(n)	(15 + ((n) * 2)) + +static inline void sysctl_soft_reset(void __iomem *base) +{ +	/* switch to slow mode */ +	writel(0x2, base + SCCTRL); + +	/* writing any value to SCSYSSTAT reg will reset system */ +	writel(0, base + SCSYSSTAT); +} + +#endif	/* __ASM_ARM_SP810_H */ diff --git a/include/linux/ata.h b/include/linux/ata.h index 8f7a3d68371..ee0bd952405 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -954,7 +954,7 @@ static inline int atapi_cdb_len(const u16 *dev_id)  	}  } -static inline bool atapi_command_packet_set(const u16 *dev_id) +static inline int atapi_command_packet_set(const u16 *dev_id)  {  	return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;  } diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 12731a19ef0..350459910fe 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -254,6 +254,7 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);  #define BDI_CAP_EXEC_MAP	0x00000040  #define BDI_CAP_NO_ACCT_WB	0x00000080  #define BDI_CAP_SWAP_BACKED	0x00000100 +#define BDI_CAP_STABLE_WRITES	0x00000200  #define BDI_CAP_VMFLAGS \  	(BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP) @@ -308,6 +309,11 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout);  int pdflush_proc_obsolete(struct ctl_table *table, int write,  		void __user *buffer, size_t *lenp, loff_t *ppos); +static inline bool bdi_cap_stable_pages_required(struct backing_dev_info *bdi) +{ +	return bdi->capabilities & BDI_CAP_STABLE_WRITES; +} +  static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi)  {  	return !(bdi->capabilities & BDI_CAP_NO_WRITEBACK); diff --git a/include/linux/bcm47xx_wdt.h b/include/linux/bcm47xx_wdt.h index e5dfc256485..b708786d4cb 100644 --- a/include/linux/bcm47xx_wdt.h +++ b/include/linux/bcm47xx_wdt.h @@ -1,7 +1,10 @@  #ifndef LINUX_BCM47XX_WDT_H_  #define LINUX_BCM47XX_WDT_H_ +#include <linux/notifier.h> +#include <linux/timer.h>  #include <linux/types.h> +#include <linux/watchdog.h>  struct bcm47xx_wdt { @@ -10,6 +13,12 @@ struct bcm47xx_wdt {  	u32 max_timer_ms;  	void *driver_data; + +	struct watchdog_device wdd; +	struct notifier_block notifier; + +	struct timer_list soft_timer; +	atomic_t soft_ticks;  };  static inline void *bcm47xx_wdt_get_drvdata(struct bcm47xx_wdt *wdt) diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 9a0e3fa3ca9..8390c474f69 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h @@ -27,7 +27,7 @@  #define   BCMA_CC_FLASHT_NONE		0x00000000	/* No flash */  #define   BCMA_CC_FLASHT_STSER		0x00000100	/* ST serial flash */  #define   BCMA_CC_FLASHT_ATSER		0x00000200	/* Atmel serial flash */ -#define   BCMA_CC_FLASHT_NFLASH		0x00000200	/* NAND flash */ +#define   BCMA_CC_FLASHT_NAND		0x00000300	/* NAND flash */  #define	  BCMA_CC_FLASHT_PARA		0x00000700	/* Parallel flash */  #define  BCMA_CC_CAP_PLLT		0x00038000	/* PLL Type */  #define   BCMA_PLLTYPE_NONE		0x00000000 @@ -528,6 +528,7 @@ struct bcma_sflash {  	u32 size;  	struct mtd_info *mtd; +	void *priv;  };  #endif @@ -634,4 +635,6 @@ extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc,  				       u32 offset, u32 mask, u32 set);  extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid); +extern u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc); +  #endif /* LINUX_BCMA_DRIVER_CC_H_ */ diff --git a/include/linux/bcma/bcma_driver_mips.h b/include/linux/bcma/bcma_driver_mips.h index 0baf8a56b79..fb61f3fb4dd 100644 --- a/include/linux/bcma/bcma_driver_mips.h +++ b/include/linux/bcma/bcma_driver_mips.h @@ -28,6 +28,7 @@  #define BCMA_MIPS_MIPS74K_GPIOEN	0x0048  #define BCMA_MIPS_MIPS74K_CLKCTLST	0x01E0 +#define BCMA_MIPS_OOBSELINA74		0x004  #define BCMA_MIPS_OOBSELOUTA30		0x100  struct bcma_device; @@ -36,19 +37,23 @@ struct bcma_drv_mips {  	struct bcma_device *core;  	u8 setup_done:1;  	u8 early_setup_done:1; -	unsigned int assigned_irqs;  };  #ifdef CONFIG_BCMA_DRIVER_MIPS  extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);  extern void bcma_core_mips_early_init(struct bcma_drv_mips *mcore); + +extern unsigned int bcma_core_irq(struct bcma_device *core);  #else  static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }  static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) { } + +static inline unsigned int bcma_core_irq(struct bcma_device *core) +{ +	return 0; +}  #endif  extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore); -extern unsigned int bcma_core_mips_irq(struct bcma_device *dev); -  #endif /* LINUX_BCMA_DRIVER_MIPS_H_ */ diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h index c48d98d27b7..424760f01b9 100644 --- a/include/linux/bcma/bcma_driver_pci.h +++ b/include/linux/bcma/bcma_driver_pci.h @@ -179,6 +179,8 @@ struct pci_dev;  #define BCMA_CORE_PCI_CFG_FUN_MASK		7	/* Function mask */  #define BCMA_CORE_PCI_CFG_OFF_MASK		0xfff	/* Register mask */ +#define BCMA_CORE_PCI_CFG_DEVCTRL		0xd8 +  /* PCIE Root Capability Register bits (Host mode only) */  #define BCMA_CORE_PCI_RC_CRS_VISIBILITY		0x0001 diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 0530b986035..c3a09149f79 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -111,7 +111,6 @@ extern int suid_dumpable;  extern int setup_arg_pages(struct linux_binprm * bprm,  			   unsigned long stack_top,  			   int executable_stack); -extern int bprm_mm_init(struct linux_binprm *bprm);  extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);  extern int copy_strings_kernel(int argc, const char *const *argv,  			       struct linux_binprm *bprm); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f94bc83011e..78feda9bbae 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -19,6 +19,7 @@  #include <linux/gfp.h>  #include <linux/bsg.h>  #include <linux/smp.h> +#include <linux/rcupdate.h>  #include <asm/scatterlist.h> @@ -437,6 +438,7 @@ struct request_queue {  	/* Throttle data */  	struct throtl_data *td;  #endif +	struct rcu_head		rcu_head;  };  #define QUEUE_FLAG_QUEUED	1	/* uses generic tag queueing */ @@ -974,7 +976,6 @@ struct blk_plug {  	unsigned long magic; /* detect uninitialized use-cases */  	struct list_head list; /* requests */  	struct list_head cb_list; /* md requires an unplug callback */ -	unsigned int should_sort; /* list to be sorted before flushing? */  };  #define BLK_MAX_REQUEST_COUNT 16 diff --git a/include/linux/bma150.h b/include/linux/bma150.h index 7911fda23bb..97ade7cdc87 100644 --- a/include/linux/bma150.h +++ b/include/linux/bma150.h @@ -22,6 +22,18 @@  #define BMA150_DRIVER		"bma150" +#define BMA150_RANGE_2G		0 +#define BMA150_RANGE_4G		1 +#define BMA150_RANGE_8G		2 + +#define BMA150_BW_25HZ		0 +#define BMA150_BW_50HZ		1 +#define BMA150_BW_100HZ		2 +#define BMA150_BW_190HZ		3 +#define BMA150_BW_375HZ		4 +#define BMA150_BW_750HZ		5 +#define BMA150_BW_1500HZ	6 +  struct bma150_cfg {  	bool any_motion_int;		/* Set to enable any-motion interrupt */  	bool hg_int;			/* Set to enable high-G interrupt */ @@ -34,8 +46,8 @@ struct bma150_cfg {  	unsigned char lg_hyst;		/* Low-G hysterisis */  	unsigned char lg_dur;		/* Low-G duration */  	unsigned char lg_thres;		/* Low-G threshold */ -	unsigned char range;		/* BMA0150_RANGE_xxx (in G) */ -	unsigned char bandwidth;	/* BMA0150_BW_xxx (in Hz) */ +	unsigned char range;		/* one of BMA0150_RANGE_xxx */ +	unsigned char bandwidth;	/* one of BMA0150_BW_xxx */  };  struct bma150_platform_data { diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index 3f778c27f82..cdc3bab0183 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h @@ -53,6 +53,7 @@ extern void free_bootmem_node(pg_data_t *pgdat,  			      unsigned long size);  extern void free_bootmem(unsigned long physaddr, unsigned long size);  extern void free_bootmem_late(unsigned long physaddr, unsigned long size); +extern void __free_pages_bootmem(struct page *page, unsigned int order);  /*   * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, @@ -99,6 +100,9 @@ void *___alloc_bootmem_node_nopanic(pg_data_t *pgdat,  extern void *__alloc_bootmem_low(unsigned long size,  				 unsigned long align,  				 unsigned long goal); +void *__alloc_bootmem_low_nopanic(unsigned long size, +				 unsigned long align, +				 unsigned long goal);  extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,  				      unsigned long size,  				      unsigned long align, @@ -132,6 +136,8 @@ extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,  #define alloc_bootmem_low(x) \  	__alloc_bootmem_low(x, SMP_CACHE_BYTES, 0) +#define alloc_bootmem_low_pages_nopanic(x) \ +	__alloc_bootmem_low_nopanic(x, PAGE_SIZE, 0)  #define alloc_bootmem_low_pages(x) \  	__alloc_bootmem_low(x, PAGE_SIZE, 0)  #define alloc_bootmem_low_pages_node(pgdat, x) \ diff --git a/include/linux/btrfs.h b/include/linux/btrfs.h new file mode 100644 index 00000000000..22d799147db --- /dev/null +++ b/include/linux/btrfs.h @@ -0,0 +1,6 @@ +#ifndef _LINUX_BTRFS_H +#define _LINUX_BTRFS_H + +#include <uapi/linux/btrfs.h> + +#endif /* _LINUX_BTRFS_H */ diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 458f497738a..5afc4f94d11 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -126,7 +126,6 @@ BUFFER_FNS(Write_EIO, write_io_error)  BUFFER_FNS(Unwritten, unwritten)  #define bh_offset(bh)		((unsigned long)(bh)->b_data & ~PAGE_MASK) -#define touch_buffer(bh)	mark_page_accessed(bh->b_page)  /* If we *know* page->private refers to buffer_heads */  #define page_buffers(page)					\ @@ -142,6 +141,7 @@ BUFFER_FNS(Unwritten, unwritten)  void mark_buffer_dirty(struct buffer_head *bh);  void init_buffer(struct buffer_head *, bh_end_io_t *, void *); +void touch_buffer(struct buffer_head *bh);  void set_bh_page(struct buffer_head *bh,  		struct page *page, unsigned long offset);  int try_to_free_buffers(struct page *); diff --git a/include/linux/bug.h b/include/linux/bug.h index b1cf40de847..7f4818673c4 100644 --- a/include/linux/bug.h +++ b/include/linux/bug.h @@ -2,6 +2,7 @@  #define _LINUX_BUG_H  #include <asm/bug.h> +#include <linux/compiler.h>  enum bug_trap_type {  	BUG_TRAP_TYPE_NONE = 0, @@ -12,11 +13,12 @@ enum bug_trap_type {  struct pt_regs;  #ifdef __CHECKER__ -#define BUILD_BUG_ON_NOT_POWER_OF_2(n) +#define BUILD_BUG_ON_NOT_POWER_OF_2(n) (0)  #define BUILD_BUG_ON_ZERO(e) (0)  #define BUILD_BUG_ON_NULL(e) ((void*)0)  #define BUILD_BUG_ON_INVALID(e) (0) -#define BUILD_BUG_ON(condition) +#define BUILD_BUG_ON_MSG(cond, msg) (0) +#define BUILD_BUG_ON(condition) (0)  #define BUILD_BUG() (0)  #else /* __CHECKER__ */ @@ -39,29 +41,37 @@ struct pt_regs;  #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))  /** + * BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied + *		      error message. + * @condition: the condition which the compiler should know is false. + * + * See BUILD_BUG_ON for description. + */ +#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) + +/**   * BUILD_BUG_ON - break compile if a condition is true.   * @condition: the condition which the compiler should know is false.   *   * If you have some code which relies on certain constants being equal, or - * other compile-time-evaluated condition, you should use BUILD_BUG_ON to + * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to   * detect if someone changes it.   * - * The implementation uses gcc's reluctance to create a negative array, but - * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments - * to inline functions).  So as a fallback we use the optimizer; if it can't - * prove the condition is false, it will cause a link error on the undefined - * "__build_bug_on_failed".  This error message can be harder to track down - * though, hence the two different methods. + * The implementation uses gcc's reluctance to create a negative array, but gcc + * (as of 4.4) only emits that error for obvious cases (e.g. not arguments to + * inline functions).  Luckily, in 4.3 they added the "error" function + * attribute just for this type of case.  Thus, we use a negative sized array + * (should always create an error on gcc versions older than 4.4) and then call + * an undefined function with the error attribute (should always create an + * error on gcc 4.3 and later).  If for some reason, neither creates a + * compile-time error, we'll still have a link-time error, which is harder to + * track down.   */  #ifndef __OPTIMIZE__  #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))  #else -extern int __build_bug_on_failed; -#define BUILD_BUG_ON(condition)					\ -	do {							\ -		((void)sizeof(char[1 - 2*!!(condition)]));	\ -		if (condition) __build_bug_on_failed = 1;	\ -	} while(0) +#define BUILD_BUG_ON(condition) \ +	BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)  #endif  /** @@ -71,12 +81,7 @@ extern int __build_bug_on_failed;   * 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) +#define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")  #endif	/* __CHECKER__ */ diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 2b2fc345afc..fb0ab651a04 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -16,6 +16,7 @@  #include <linux/can.h>  #include <linux/can/netlink.h>  #include <linux/can/error.h> +#include <linux/can/led.h>  /*   * CAN mode @@ -52,6 +53,13 @@ struct can_priv {  	unsigned int echo_skb_max;  	struct sk_buff **echo_skb; + +#ifdef CONFIG_CAN_LEDS +	struct led_trigger *tx_led_trig; +	char tx_led_trig_name[CAN_LED_NAME_SZ]; +	struct led_trigger *rx_led_trig; +	char rx_led_trig_name[CAN_LED_NAME_SZ]; +#endif  };  /* @@ -98,6 +106,9 @@ u8 can_len2dlc(u8 len);  struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max);  void free_candev(struct net_device *dev); +/* a candev safe wrapper around netdev_priv */ +struct can_priv *safe_candev_priv(struct net_device *dev); +  int open_candev(struct net_device *dev);  void close_candev(struct net_device *dev); diff --git a/include/linux/can/led.h b/include/linux/can/led.h new file mode 100644 index 00000000000..9c1167baf27 --- /dev/null +++ b/include/linux/can/led.h @@ -0,0 +1,51 @@ +/* + * Copyright 2012, Fabio Baltieri <fabio.baltieri@gmail.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 CAN_LED_H +#define CAN_LED_H + +#include <linux/if.h> +#include <linux/leds.h> + +enum can_led_event { +	CAN_LED_EVENT_OPEN, +	CAN_LED_EVENT_STOP, +	CAN_LED_EVENT_TX, +	CAN_LED_EVENT_RX, +}; + +#ifdef CONFIG_CAN_LEDS + +/* keep space for interface name + "-tx"/"-rx" suffix and null terminator */ +#define CAN_LED_NAME_SZ (IFNAMSIZ + 4) + +void can_led_event(struct net_device *netdev, enum can_led_event event); +void devm_can_led_init(struct net_device *netdev); +int __init can_led_notifier_init(void); +void __exit can_led_notifier_exit(void); + +#else + +static inline void can_led_event(struct net_device *netdev, +				 enum can_led_event event) +{ +} +static inline void devm_can_led_init(struct net_device *netdev) +{ +} +static inline int can_led_notifier_init(void) +{ +	return 0; +} +static inline void can_led_notifier_exit(void) +{ +} + +#endif + +#endif diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h new file mode 100644 index 00000000000..2f0543f7510 --- /dev/null +++ b/include/linux/can/skb.h @@ -0,0 +1,45 @@ +/* + * linux/can/skb.h + * + * Definitions for the CAN network socket buffer + * + * Copyright (C) 2012 Oliver Hartkopp <socketcan@hartkopp.net> + * + */ + +#ifndef CAN_SKB_H +#define CAN_SKB_H + +#include <linux/types.h> +#include <linux/can.h> + +/* + * The struct can_skb_priv is used to transport additional information along + * with the stored struct can(fd)_frame that can not be contained in existing + * struct sk_buff elements. + * N.B. that this information must not be modified in cloned CAN sk_buffs. + * To modify the CAN frame content or the struct can_skb_priv content + * skb_copy() needs to be used instead of skb_clone(). + */ + +/** + * struct can_skb_priv - private additional data inside CAN sk_buffs + * @ifindex:	ifindex of the first interface the CAN frame appeared on + * @cf:		align to the following CAN frame at skb->data + */ +struct can_skb_priv { +	int ifindex; +	struct can_frame cf[0]; +}; + +static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb) +{ +	return (struct can_skb_priv *)(skb->head); +} + +static inline void can_skb_reserve(struct sk_buff *skb) +{ +	skb_reserve(skb, sizeof(struct can_skb_priv)); +} + +#endif /* CAN_SKB_H */ diff --git a/include/linux/capability.h b/include/linux/capability.h index 98503b79236..d9a4f7f40f3 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -35,6 +35,7 @@ struct cpu_vfs_cap_data {  #define _KERNEL_CAP_T_SIZE     (sizeof(kernel_cap_t)) +struct file;  struct inode;  struct dentry;  struct user_namespace; @@ -211,6 +212,7 @@ extern bool capable(int cap);  extern bool ns_capable(struct user_namespace *ns, int cap);  extern bool nsown_capable(int cap);  extern bool inode_capable(const struct inode *inode, int cap); +extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);  /* audit system wants to get cap info from files as well */  extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps); diff --git a/include/linux/ceph/ceph_features.h b/include/linux/ceph/ceph_features.h index dad579b0c0e..76554cecaab 100644 --- a/include/linux/ceph/ceph_features.h +++ b/include/linux/ceph/ceph_features.h @@ -12,16 +12,46 @@  #define CEPH_FEATURE_MONNAMES       (1<<5)  #define CEPH_FEATURE_RECONNECT_SEQ  (1<<6)  #define CEPH_FEATURE_DIRLAYOUTHASH  (1<<7) -/* bits 8-17 defined by user-space; not supported yet here */ +#define CEPH_FEATURE_OBJECTLOCATOR  (1<<8) +#define CEPH_FEATURE_PGID64         (1<<9) +#define CEPH_FEATURE_INCSUBOSDMAP   (1<<10) +#define CEPH_FEATURE_PGPOOL3        (1<<11) +#define CEPH_FEATURE_OSDREPLYMUX    (1<<12) +#define CEPH_FEATURE_OSDENC         (1<<13) +#define CEPH_FEATURE_OMAP           (1<<14) +#define CEPH_FEATURE_MONENC         (1<<15) +#define CEPH_FEATURE_QUERY_T        (1<<16) +#define CEPH_FEATURE_INDEP_PG_MAP   (1<<17)  #define CEPH_FEATURE_CRUSH_TUNABLES (1<<18) +#define CEPH_FEATURE_CHUNKY_SCRUB   (1<<19) +#define CEPH_FEATURE_MON_NULLROUTE  (1<<20) +#define CEPH_FEATURE_MON_GV         (1<<21) +#define CEPH_FEATURE_BACKFILL_RESERVATION (1<<22) +#define CEPH_FEATURE_MSG_AUTH	    (1<<23) +#define CEPH_FEATURE_RECOVERY_RESERVATION (1<<24) +#define CEPH_FEATURE_CRUSH_TUNABLES2 (1<<25) +#define CEPH_FEATURE_CREATEPOOLID   (1<<26) +#define CEPH_FEATURE_REPLY_CREATE_INODE   (1<<27) +#define CEPH_FEATURE_OSD_HBMSGS     (1<<28) +#define CEPH_FEATURE_MDSENC         (1<<29) +#define CEPH_FEATURE_OSDHASHPSPOOL  (1<<30)  /*   * Features supported.   */  #define CEPH_FEATURES_SUPPORTED_DEFAULT  \ -	(CEPH_FEATURE_NOSRCADDR |	 \ -	 CEPH_FEATURE_CRUSH_TUNABLES) +	(CEPH_FEATURE_NOSRCADDR |		\ +	 CEPH_FEATURE_PGID64 |			\ +	 CEPH_FEATURE_PGPOOL3 |			\ +	 CEPH_FEATURE_OSDENC |			\ +	 CEPH_FEATURE_CRUSH_TUNABLES |		\ +	 CEPH_FEATURE_CRUSH_TUNABLES2 |		\ +	 CEPH_FEATURE_REPLY_CREATE_INODE |	\ +	 CEPH_FEATURE_OSDHASHPSPOOL)  #define CEPH_FEATURES_REQUIRED_DEFAULT   \ -	(CEPH_FEATURE_NOSRCADDR) +	(CEPH_FEATURE_NOSRCADDR |	 \ +	 CEPH_FEATURE_PGID64 |		 \ +	 CEPH_FEATURE_PGPOOL3 |		 \ +	 CEPH_FEATURE_OSDENC)  #endif diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h index cf6f4d998a7..2ad7b860f06 100644 --- a/include/linux/ceph/ceph_fs.h +++ b/include/linux/ceph/ceph_fs.h @@ -21,16 +21,14 @@   * internal cluster protocols separately from the public,   * client-facing protocol.   */ -#define CEPH_OSD_PROTOCOL     8 /* cluster internal */ -#define CEPH_MDS_PROTOCOL    12 /* cluster internal */ -#define CEPH_MON_PROTOCOL     5 /* cluster internal */  #define CEPH_OSDC_PROTOCOL   24 /* server/client */  #define CEPH_MDSC_PROTOCOL   32 /* server/client */  #define CEPH_MONC_PROTOCOL   15 /* server/client */ -#define CEPH_INO_ROOT  1 -#define CEPH_INO_CEPH  2        /* hidden .ceph dir */ +#define CEPH_INO_ROOT   1 +#define CEPH_INO_CEPH   2       /* hidden .ceph dir */ +#define CEPH_INO_DOTDOT 3	/* used by ceph fuse for parent (..) */  /* arbitrary limit on max # of monitors (cluster of 3 is typical) */  #define CEPH_MAX_MON   31 @@ -51,7 +49,7 @@ struct ceph_file_layout {  	__le32 fl_object_stripe_unit;  /* UNUSED.  for per-object parity, if any */  	/* object -> pg layout */ -	__le32 fl_unused;       /* unused; used to be preferred primary (-1) */ +	__le32 fl_unused;       /* unused; used to be preferred primary for pg (-1 for none) */  	__le32 fl_pg_pool;      /* namespace, crush ruleset, rep level */  } __attribute__ ((packed)); @@ -101,6 +99,8 @@ struct ceph_dir_layout {  #define CEPH_MSG_MON_SUBSCRIBE_ACK      16  #define CEPH_MSG_AUTH			17  #define CEPH_MSG_AUTH_REPLY		18 +#define CEPH_MSG_MON_GET_VERSION        19 +#define CEPH_MSG_MON_GET_VERSION_REPLY  20  /* client <-> mds */  #define CEPH_MSG_MDS_MAP                21 @@ -221,6 +221,11 @@ struct ceph_mon_subscribe_ack {  } __attribute__ ((packed));  /* + * mdsmap flags + */ +#define CEPH_MDSMAP_DOWN    (1<<0)  /* cluster deliberately down */ + +/*   * mds states   *   > 0 -> in   *  <= 0 -> out @@ -233,6 +238,7 @@ struct ceph_mon_subscribe_ack {  #define CEPH_MDS_STATE_CREATING    -6  /* up, creating MDS instance. */  #define CEPH_MDS_STATE_STARTING    -7  /* up, starting previously stopped mds */  #define CEPH_MDS_STATE_STANDBY_REPLAY -8 /* up, tailing active node's journal */ +#define CEPH_MDS_STATE_REPLAYONCE   -9 /* up, replaying an active node's journal */  #define CEPH_MDS_STATE_REPLAY       8  /* up, replaying journal. */  #define CEPH_MDS_STATE_RESOLVE      9  /* up, disambiguating distributed @@ -264,6 +270,7 @@ extern const char *ceph_mds_state_name(int s);  #define CEPH_LOCK_IXATTR      2048  #define CEPH_LOCK_IFLOCK      4096  /* advisory file locks */  #define CEPH_LOCK_INO         8192  /* immutable inode bits; not a lock */ +#define CEPH_LOCK_IPOLICY     16384 /* policy lock on dirs. MDS internal */  /* client_session ops */  enum { @@ -338,6 +345,12 @@ extern const char *ceph_mds_op_name(int op);  #define CEPH_SETATTR_SIZE  32  #define CEPH_SETATTR_CTIME 64 +/* + * Ceph setxattr request flags. + */ +#define CEPH_XATTR_CREATE  1 +#define CEPH_XATTR_REPLACE 2 +  union ceph_mds_request_args {  	struct {  		__le32 mask;                 /* CEPH_CAP_* */ @@ -522,14 +535,17 @@ int ceph_flags_to_mode(int flags);  #define CEPH_CAP_GWREXTEND  64  /* (file) client can extend EOF */  #define CEPH_CAP_GLAZYIO   128  /* (file) client can perform lazy io */ +#define CEPH_CAP_SIMPLE_BITS  2 +#define CEPH_CAP_FILE_BITS    8 +  /* per-lock shift */  #define CEPH_CAP_SAUTH      2  #define CEPH_CAP_SLINK      4  #define CEPH_CAP_SXATTR     6  #define CEPH_CAP_SFILE      8 -#define CEPH_CAP_SFLOCK    20  +#define CEPH_CAP_SFLOCK    20 -#define CEPH_CAP_BITS       22 +#define CEPH_CAP_BITS      22  /* composed values */  #define CEPH_CAP_AUTH_SHARED  (CEPH_CAP_GSHARED  << CEPH_CAP_SAUTH) diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h index 63d092822ba..360d9d08ca9 100644 --- a/include/linux/ceph/decode.h +++ b/include/linux/ceph/decode.h @@ -52,10 +52,10 @@ static inline int ceph_has_room(void **p, void *end, size_t n)  	return end >= *p && n <= end - *p;  } -#define ceph_decode_need(p, end, n, bad)		\ -	do {						\ -		if (!likely(ceph_has_room(p, end, n)))	\ -			goto bad;			\ +#define ceph_decode_need(p, end, n, bad)			\ +	do {							\ +		if (!likely(ceph_has_room(p, end, n)))		\ +			goto bad;				\  	} while (0)  #define ceph_decode_64_safe(p, end, v, bad)			\ @@ -99,8 +99,8 @@ static inline int ceph_has_room(void **p, void *end, size_t n)   *   * There are two possible failures:   *   - converting the string would require accessing memory at or - *     beyond the "end" pointer provided (-E - *   - memory could not be allocated for the result + *     beyond the "end" pointer provided (-ERANGE) + *   - memory could not be allocated for the result (-ENOMEM)   */  static inline char *ceph_extract_encoded_string(void **p, void *end,  						size_t *lenp, gfp_t gfp) @@ -217,10 +217,10 @@ static inline void ceph_encode_string(void **p, void *end,  	*p += len;  } -#define ceph_encode_need(p, end, n, bad)		\ -	do {						\ -		if (!likely(ceph_has_room(p, end, n)))	\ -			goto bad;			\ +#define ceph_encode_need(p, end, n, bad)			\ +	do {							\ +		if (!likely(ceph_has_room(p, end, n)))		\ +			goto bad;				\  	} while (0)  #define ceph_encode_64_safe(p, end, v, bad)			\ @@ -231,12 +231,17 @@ static inline void ceph_encode_string(void **p, void *end,  #define ceph_encode_32_safe(p, end, v, bad)			\  	do {							\  		ceph_encode_need(p, end, sizeof(u32), bad);	\ -		ceph_encode_32(p, v);			\ +		ceph_encode_32(p, v);				\  	} while (0)  #define ceph_encode_16_safe(p, end, v, bad)			\  	do {							\  		ceph_encode_need(p, end, sizeof(u16), bad);	\ -		ceph_encode_16(p, v);			\ +		ceph_encode_16(p, v);				\ +	} while (0) +#define ceph_encode_8_safe(p, end, v, bad)			\ +	do {							\ +		ceph_encode_need(p, end, sizeof(u8), bad);	\ +		ceph_encode_8(p, v);				\  	} while (0)  #define ceph_encode_copy_safe(p, end, pv, n, bad)		\ diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index 084d3c622b1..29818fc3fa4 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h @@ -193,6 +193,8 @@ static inline int calc_pages_for(u64 off, u64 len)  }  /* ceph_common.c */ +extern bool libceph_compatible(void *data); +  extern const char *ceph_msg_type_name(int type);  extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid);  extern struct kmem_cache *ceph_inode_cachep; @@ -220,7 +222,7 @@ extern int ceph_open_session(struct ceph_client *client);  /* pagevec.c */  extern void ceph_release_page_vector(struct page **pages, int num_pages); -extern struct page **ceph_get_direct_page_vector(const char __user *data, +extern struct page **ceph_get_direct_page_vector(const void __user *data,  						 int num_pages,  						 bool write_page);  extern void ceph_put_page_vector(struct page **pages, int num_pages, @@ -228,15 +230,15 @@ extern void ceph_put_page_vector(struct page **pages, int num_pages,  extern void ceph_release_page_vector(struct page **pages, int num_pages);  extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);  extern int ceph_copy_user_to_page_vector(struct page **pages, -					 const char __user *data, +					 const void __user *data,  					 loff_t off, size_t len); -extern int ceph_copy_to_page_vector(struct page **pages, -				    const char *data, +extern void ceph_copy_to_page_vector(struct page **pages, +				    const void *data,  				    loff_t off, size_t len); -extern int ceph_copy_from_page_vector(struct page **pages, -				    char *data, +extern void ceph_copy_from_page_vector(struct page **pages, +				    void *data,  				    loff_t off, size_t len); -extern int ceph_copy_page_vector_to_user(struct page **pages, char __user *data, +extern int ceph_copy_page_vector_to_user(struct page **pages, void __user *data,  				    loff_t off, size_t len);  extern void ceph_zero_page_vector_range(int off, int len, struct page **pages); diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h index cb15b5d867c..87ed09f5480 100644 --- a/include/linux/ceph/mdsmap.h +++ b/include/linux/ceph/mdsmap.h @@ -29,8 +29,8 @@ struct ceph_mdsmap {  	/* which object pools file data can be stored in */  	int m_num_data_pg_pools; -	u32 *m_data_pg_pools; -	u32 m_cas_pg_pool; +	u64 *m_data_pg_pools; +	u64 m_cas_pg_pool;  };  static inline struct ceph_entity_addr * diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index 14ba5ee738a..60903e0f665 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h @@ -83,9 +83,11 @@ struct ceph_msg {  	struct list_head list_head;  	struct kref kref; +#ifdef CONFIG_BLOCK  	struct bio  *bio;		/* instead of pages/pagelist */  	struct bio  *bio_iter;		/* bio iterator */  	int bio_seg;			/* current bio segment */ +#endif /* CONFIG_BLOCK */  	struct ceph_pagelist *trail;	/* the trailing part of the data */  	bool front_is_vmalloc;  	bool more_to_follow; diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index d9b880e977e..1dd5d466b6f 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h @@ -10,6 +10,7 @@  #include <linux/ceph/osdmap.h>  #include <linux/ceph/messenger.h>  #include <linux/ceph/auth.h> +#include <linux/ceph/pagelist.h>  /*    * Maximum object name size  @@ -22,7 +23,6 @@ struct ceph_snap_context;  struct ceph_osd_request;  struct ceph_osd_client;  struct ceph_authorizer; -struct ceph_pagelist;  /*   * completion callback for async writepages @@ -47,6 +47,9 @@ struct ceph_osd {  	struct list_head o_keepalive_item;  }; + +#define CEPH_OSD_MAX_OP 10 +  /* an in-flight request */  struct ceph_osd_request {  	u64             r_tid;              /* unique for this client */ @@ -63,9 +66,23 @@ struct ceph_osd_request {  	struct ceph_connection *r_con_filling_msg;  	struct ceph_msg  *r_request, *r_reply; -	int               r_result;  	int               r_flags;     /* any additional flags for the osd */  	u32               r_sent;      /* >0 if r_request is sending/sent */ +	int               r_num_ops; + +	/* encoded message content */ +	struct ceph_osd_op *r_request_ops; +	/* these are updated on each send */ +	__le32           *r_request_osdmap_epoch; +	__le32           *r_request_flags; +	__le64           *r_request_pool; +	void             *r_request_pgid; +	__le32           *r_request_attempts; +	struct ceph_eversion *r_request_reassert_version; + +	int               r_result; +	int               r_reply_op_len[CEPH_OSD_MAX_OP]; +	s32               r_reply_op_result[CEPH_OSD_MAX_OP];  	int               r_got_reply;  	int		  r_linger; @@ -82,6 +99,7 @@ struct ceph_osd_request {  	char              r_oid[MAX_OBJ_NAME_SIZE];          /* object name */  	int               r_oid_len; +	u64               r_snapid;  	unsigned long     r_stamp;            /* send OR check time */  	struct ceph_file_layout r_file_layout; @@ -95,7 +113,7 @@ struct ceph_osd_request {  	struct bio       *r_bio;	      /* instead of pages */  #endif -	struct ceph_pagelist *r_trail;	      /* trailing part of the data */ +	struct ceph_pagelist r_trail;	      /* trailing part of the data */  };  struct ceph_osd_event { @@ -107,7 +125,6 @@ struct ceph_osd_event {  	struct rb_node node;  	struct list_head osd_node;  	struct kref kref; -	struct completion completion;  };  struct ceph_osd_event_work { @@ -157,7 +174,7 @@ struct ceph_osd_client {  struct ceph_osd_req_op {  	u16 op;           /* CEPH_OSD_OP_* */ -	u32 flags;        /* CEPH_OSD_FLAG_* */ +	u32 payload_len;  	union {  		struct {  			u64 offset, length; @@ -166,23 +183,24 @@ struct ceph_osd_req_op {  		} extent;  		struct {  			const char *name; -			u32 name_len;  			const char  *val; +			u32 name_len;  			u32 value_len;  			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */  			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */  		} xattr;  		struct {  			const char *class_name; -			__u8 class_len;  			const char *method_name; -			__u8 method_len; -			__u8 argc;  			const char *indata;  			u32 indata_len; +			__u8 class_len; +			__u8 method_len; +			__u8 argc;  		} cls;  		struct { -			u64 cookie, count; +			u64 cookie; +			u64 count;  		} pgls;  	        struct {  		        u64 snapid; @@ -190,12 +208,11 @@ struct ceph_osd_req_op {  		struct {  			u64 cookie;  			u64 ver; -			__u8 flag;  			u32 prot_ver;  			u32 timeout; +			__u8 flag;  		} watch;  	}; -	u32 payload_len;  };  extern int ceph_osdc_init(struct ceph_osd_client *osdc, @@ -207,29 +224,19 @@ extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,  extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,  				 struct ceph_msg *msg); -extern int ceph_calc_raw_layout(struct ceph_osd_client *osdc, -			struct ceph_file_layout *layout, -			u64 snapid, -			u64 off, u64 *plen, u64 *bno, -			struct ceph_osd_request *req, -			struct ceph_osd_req_op *op); -  extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, -					       int flags,  					       struct ceph_snap_context *snapc, -					       struct ceph_osd_req_op *ops, +					       unsigned int num_op,  					       bool use_mempool, -					       gfp_t gfp_flags, -					       struct page **pages, -					       struct bio *bio); +					       gfp_t gfp_flags);  extern void ceph_osdc_build_request(struct ceph_osd_request *req, -				    u64 off, u64 *plen, +				    u64 off, u64 len, +				    unsigned int num_op,  				    struct ceph_osd_req_op *src_ops,  				    struct ceph_snap_context *snapc, -				    struct timespec *mtime, -				    const char *oid, -				    int oid_len); +				    u64 snap_id, +				    struct timespec *mtime);  extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,  				      struct ceph_file_layout *layout, @@ -239,8 +246,7 @@ extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,  				      int do_sync, u32 truncate_seq,  				      u64 truncate_size,  				      struct timespec *mtime, -				      bool use_mempool, int num_reply, -				      int page_align); +				      bool use_mempool, int page_align);  extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,  					 struct ceph_osd_request *req); @@ -279,17 +285,13 @@ extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,  				u64 off, u64 len,  				u32 truncate_seq, u64 truncate_size,  				struct timespec *mtime, -				struct page **pages, int nr_pages, -				int flags, int do_sync, bool nofail); +				struct page **pages, int nr_pages);  /* watch/notify events */  extern int ceph_osdc_create_event(struct ceph_osd_client *osdc,  				  void (*event_cb)(u64, u64, u8, void *), -				  int one_shot, void *data, -				  struct ceph_osd_event **pevent); +				  void *data, struct ceph_osd_event **pevent);  extern void ceph_osdc_cancel_event(struct ceph_osd_event *event); -extern int ceph_osdc_wait_event(struct ceph_osd_event *event, -				unsigned long timeout);  extern void ceph_osdc_put_event(struct ceph_osd_event *event);  #endif diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h index 10a417f9f76..c819190d164 100644 --- a/include/linux/ceph/osdmap.h +++ b/include/linux/ceph/osdmap.h @@ -18,14 +18,31 @@   * The map can be updated either via an incremental map (diff) describing   * the change between two successive epochs, or as a fully encoded map.   */ +struct ceph_pg { +	uint64_t pool; +	uint32_t seed; +}; + +#define CEPH_POOL_FLAG_HASHPSPOOL  1 +  struct ceph_pg_pool_info {  	struct rb_node node; -	int id; -	struct ceph_pg_pool v; -	int pg_num_mask, pgp_num_mask, lpg_num_mask, lpgp_num_mask; +	s64 id; +	u8 type; +	u8 size; +	u8 crush_ruleset; +	u8 object_hash; +	u32 pg_num, pgp_num; +	int pg_num_mask, pgp_num_mask; +	u64 flags;  	char *name;  }; +struct ceph_object_locator { +	uint64_t pool; +	char *key; +}; +  struct ceph_pg_mapping {  	struct rb_node node;  	struct ceph_pg pgid; @@ -110,15 +127,16 @@ extern void ceph_osdmap_destroy(struct ceph_osdmap *map);  /* calculate mapping of a file extent to an object */  extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout, -					 u64 off, u64 *plen, +					 u64 off, u64 len,  					 u64 *bno, u64 *oxoff, u64 *oxlen);  /* calculate mapping of object to a placement group */ -extern int ceph_calc_object_layout(struct ceph_object_layout *ol, +extern int ceph_calc_object_layout(struct ceph_pg *pg,  				   const char *oid,  				   struct ceph_file_layout *fl,  				   struct ceph_osdmap *osdmap); -extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, +extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, +			       struct ceph_pg pgid,  			       int *acting);  extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap,  				struct ceph_pg pgid); diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h index 2c04afeead1..68c96a508ac 100644 --- a/include/linux/ceph/rados.h +++ b/include/linux/ceph/rados.h @@ -9,14 +9,6 @@  #include <linux/ceph/msgr.h>  /* - * osdmap encoding versions - */ -#define CEPH_OSDMAP_INC_VERSION     5 -#define CEPH_OSDMAP_INC_VERSION_EXT 6 -#define CEPH_OSDMAP_VERSION         5 -#define CEPH_OSDMAP_VERSION_EXT     6 - -/*   * fs id   */  struct ceph_fsid { @@ -64,7 +56,7 @@ struct ceph_timespec {   * placement group.   * we encode this into one __le64.   */ -struct ceph_pg { +struct ceph_pg_v1 {  	__le16 preferred; /* preferred primary osd */  	__le16 ps;        /* placement seed */  	__le32 pool;      /* object pool */ @@ -91,21 +83,6 @@ struct ceph_pg {  #define CEPH_PG_TYPE_REP     1  #define CEPH_PG_TYPE_RAID4   2 -#define CEPH_PG_POOL_VERSION 2 -struct ceph_pg_pool { -	__u8 type;                /* CEPH_PG_TYPE_* */ -	__u8 size;                /* number of osds in each pg */ -	__u8 crush_ruleset;       /* crush placement rule */ -	__u8 object_hash;         /* hash mapping object name to ps */ -	__le32 pg_num, pgp_num;   /* number of pg's */ -	__le32 lpg_num, lpgp_num; /* number of localized pg's */ -	__le32 last_change;       /* most recent epoch changed */ -	__le64 snap_seq;          /* seq for per-pool snapshot */ -	__le32 snap_epoch;        /* epoch of last snap */ -	__le32 num_snaps; -	__le32 num_removed_snap_intervals; /* if non-empty, NO per-pool snaps */ -	__le64 auid;               /* who owns the pg */ -} __attribute__ ((packed));  /*   * stable_mod func is used to control number of placement groups. @@ -128,7 +105,7 @@ static inline int ceph_stable_mod(int x, int b, int bmask)   * object layout - how a given object should be stored.   */  struct ceph_object_layout { -	struct ceph_pg ol_pgid;   /* raw pg, with _full_ ps precision. */ +	struct ceph_pg_v1 ol_pgid;   /* raw pg, with _full_ ps precision. */  	__le32 ol_stripe_unit;    /* for per-object parity, if any */  } __attribute__ ((packed)); @@ -145,8 +122,12 @@ struct ceph_eversion {   */  /* status bits */ -#define CEPH_OSD_EXISTS 1 -#define CEPH_OSD_UP     2 +#define CEPH_OSD_EXISTS  (1<<0) +#define CEPH_OSD_UP      (1<<1) +#define CEPH_OSD_AUTOOUT (1<<2)  /* osd was automatically marked out */ +#define CEPH_OSD_NEW     (1<<3)  /* osd is new, never marked in */ + +extern const char *ceph_osd_state_name(int s);  /* osd weights.  fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */  #define CEPH_OSD_IN  0x10000 @@ -161,9 +142,25 @@ struct ceph_eversion {  #define CEPH_OSDMAP_PAUSERD  (1<<2)  /* pause all reads */  #define CEPH_OSDMAP_PAUSEWR  (1<<3)  /* pause all writes */  #define CEPH_OSDMAP_PAUSEREC (1<<4)  /* pause recovery */ +#define CEPH_OSDMAP_NOUP     (1<<5)  /* block osd boot */ +#define CEPH_OSDMAP_NODOWN   (1<<6)  /* block osd mark-down/failure */ +#define CEPH_OSDMAP_NOOUT    (1<<7)  /* block osd auto mark-out */ +#define CEPH_OSDMAP_NOIN     (1<<8)  /* block osd auto mark-in */ +#define CEPH_OSDMAP_NOBACKFILL (1<<9) /* block osd backfill */ +#define CEPH_OSDMAP_NORECOVER (1<<10) /* block osd recovery and backfill */ + +/* + * The error code to return when an OSD can't handle a write + * because it is too large. + */ +#define OSD_WRITETOOBIG EMSGSIZE  /*   * osd ops + * + * WARNING: do not use these op codes directly.  Use the helpers + * defined below instead.  In certain cases, op code behavior was + * redefined, resulting in special-cases in the helpers.   */  #define CEPH_OSD_OP_MODE       0xf000  #define CEPH_OSD_OP_MODE_RD    0x1000 @@ -177,6 +174,7 @@ struct ceph_eversion {  #define CEPH_OSD_OP_TYPE_ATTR  0x0300  #define CEPH_OSD_OP_TYPE_EXEC  0x0400  #define CEPH_OSD_OP_TYPE_PG    0x0500 +#define CEPH_OSD_OP_TYPE_MULTI 0x0600 /* multiobject */  enum {  	/** data **/ @@ -217,6 +215,23 @@ enum {  	CEPH_OSD_OP_WATCH   = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 15, +	/* omap */ +	CEPH_OSD_OP_OMAPGETKEYS   = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 17, +	CEPH_OSD_OP_OMAPGETVALS   = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 18, +	CEPH_OSD_OP_OMAPGETHEADER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 19, +	CEPH_OSD_OP_OMAPGETVALSBYKEYS  = +	  CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 20, +	CEPH_OSD_OP_OMAPSETVALS   = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 21, +	CEPH_OSD_OP_OMAPSETHEADER = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 22, +	CEPH_OSD_OP_OMAPCLEAR     = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 23, +	CEPH_OSD_OP_OMAPRMKEYS    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 24, +	CEPH_OSD_OP_OMAP_CMP      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 25, + +	/** multi **/ +	CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1, +	CEPH_OSD_OP_ASSERT_SRC_VERSION = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 2, +	CEPH_OSD_OP_SRC_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 3, +  	/** attrs **/  	/* read */  	CEPH_OSD_OP_GETXATTR  = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1, @@ -238,6 +253,7 @@ enum {  	CEPH_OSD_OP_SCRUB_RESERVE   = CEPH_OSD_OP_MODE_SUB | 6,  	CEPH_OSD_OP_SCRUB_UNRESERVE = CEPH_OSD_OP_MODE_SUB | 7,  	CEPH_OSD_OP_SCRUB_STOP      = CEPH_OSD_OP_MODE_SUB | 8, +	CEPH_OSD_OP_SCRUB_MAP     = CEPH_OSD_OP_MODE_SUB | 9,  	/** lock **/  	CEPH_OSD_OP_WRLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1, @@ -248,10 +264,12 @@ enum {  	CEPH_OSD_OP_DNLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6,  	/** exec **/ +	/* note: the RD bit here is wrong; see special-case below in helper */  	CEPH_OSD_OP_CALL    = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1,  	/** pg **/  	CEPH_OSD_OP_PGLS      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1, +	CEPH_OSD_OP_PGLS_FILTER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 2,  };  static inline int ceph_osd_op_type_lock(int op) @@ -274,6 +292,10 @@ static inline int ceph_osd_op_type_pg(int op)  {  	return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_PG;  } +static inline int ceph_osd_op_type_multi(int op) +{ +	return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_MULTI; +}  static inline int ceph_osd_op_mode_subop(int op)  { @@ -281,11 +303,12 @@ static inline int ceph_osd_op_mode_subop(int op)  }  static inline int ceph_osd_op_mode_read(int op)  { -	return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_RD; +	return (op & CEPH_OSD_OP_MODE_RD) && +		op != CEPH_OSD_OP_CALL;  }  static inline int ceph_osd_op_mode_modify(int op)  { -	return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_WR; +	return op & CEPH_OSD_OP_MODE_WR;  }  /* @@ -294,34 +317,38 @@ static inline int ceph_osd_op_mode_modify(int op)   */  #define CEPH_OSD_TMAP_HDR 'h'  #define CEPH_OSD_TMAP_SET 's' +#define CEPH_OSD_TMAP_CREATE 'c' /* create key */  #define CEPH_OSD_TMAP_RM  'r' +#define CEPH_OSD_TMAP_RMSLOPPY 'R'  extern const char *ceph_osd_op_name(int op); -  /*   * osd op flags   *   * An op may be READ, WRITE, or READ|WRITE.   */  enum { -	CEPH_OSD_FLAG_ACK = 1,          /* want (or is) "ack" ack */ -	CEPH_OSD_FLAG_ONNVRAM = 2,      /* want (or is) "onnvram" ack */ -	CEPH_OSD_FLAG_ONDISK = 4,       /* want (or is) "ondisk" ack */ -	CEPH_OSD_FLAG_RETRY = 8,        /* resend attempt */ -	CEPH_OSD_FLAG_READ = 16,        /* op may read */ -	CEPH_OSD_FLAG_WRITE = 32,       /* op may write */ -	CEPH_OSD_FLAG_ORDERSNAP = 64,   /* EOLDSNAP if snapc is out of order */ -	CEPH_OSD_FLAG_PEERSTAT = 128,   /* msg includes osd_peer_stat */ -	CEPH_OSD_FLAG_BALANCE_READS = 256, -	CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */ -	CEPH_OSD_FLAG_PGOP = 1024,      /* pg op, no object */ -	CEPH_OSD_FLAG_EXEC = 2048,      /* op may exec */ -	CEPH_OSD_FLAG_EXEC_PUBLIC = 4096, /* op may exec (public) */ +	CEPH_OSD_FLAG_ACK =            0x0001,  /* want (or is) "ack" ack */ +	CEPH_OSD_FLAG_ONNVRAM =        0x0002,  /* want (or is) "onnvram" ack */ +	CEPH_OSD_FLAG_ONDISK =         0x0004,  /* want (or is) "ondisk" ack */ +	CEPH_OSD_FLAG_RETRY =          0x0008,  /* resend attempt */ +	CEPH_OSD_FLAG_READ =           0x0010,  /* op may read */ +	CEPH_OSD_FLAG_WRITE =          0x0020,  /* op may write */ +	CEPH_OSD_FLAG_ORDERSNAP =      0x0040,  /* EOLDSNAP if snapc is out of order */ +	CEPH_OSD_FLAG_PEERSTAT_OLD =   0x0080,  /* DEPRECATED msg includes osd_peer_stat */ +	CEPH_OSD_FLAG_BALANCE_READS =  0x0100, +	CEPH_OSD_FLAG_PARALLELEXEC =   0x0200,  /* execute op in parallel */ +	CEPH_OSD_FLAG_PGOP =           0x0400,  /* pg op, no object */ +	CEPH_OSD_FLAG_EXEC =           0x0800,  /* op may exec */ +	CEPH_OSD_FLAG_EXEC_PUBLIC =    0x1000,  /* DEPRECATED op may exec (public) */ +	CEPH_OSD_FLAG_LOCALIZE_READS = 0x2000,  /* read from nearby replica, if any */ +	CEPH_OSD_FLAG_RWORDERED =      0x4000,  /* order wrt concurrent reads */  };  enum {  	CEPH_OSD_OP_FLAG_EXCL = 1,      /* EXCL object create */ +	CEPH_OSD_OP_FLAG_FAILOK = 2,    /* continue despite failure */  };  #define EOLDSNAPC    ERESTART  /* ORDERSNAP flag set; writer has old snapc*/ @@ -381,48 +408,13 @@ struct ceph_osd_op {  			__le64 ver;  			__u8 flag;	/* 0 = unwatch, 1 = watch */  		} __attribute__ ((packed)) watch; -}; +		struct { +			__le64 offset, length; +			__le64 src_offset; +		} __attribute__ ((packed)) clonerange; +	};  	__le32 payload_len;  } __attribute__ ((packed)); -/* - * osd request message header.  each request may include multiple - * ceph_osd_op object operations. - */ -struct ceph_osd_request_head { -	__le32 client_inc;                 /* client incarnation */ -	struct ceph_object_layout layout;  /* pgid */ -	__le32 osdmap_epoch;               /* client's osdmap epoch */ - -	__le32 flags; - -	struct ceph_timespec mtime;        /* for mutations only */ -	struct ceph_eversion reassert_version; /* if we are replaying op */ - -	__le32 object_len;     /* length of object name */ - -	__le64 snapid;         /* snapid to read */ -	__le64 snap_seq;       /* writer's snap context */ -	__le32 num_snaps; - -	__le16 num_ops; -	struct ceph_osd_op ops[];  /* followed by ops[], obj, ticket, snaps */ -} __attribute__ ((packed)); - -struct ceph_osd_reply_head { -	__le32 client_inc;                /* client incarnation */ -	__le32 flags; -	struct ceph_object_layout layout; -	__le32 osdmap_epoch; -	struct ceph_eversion reassert_version; /* for replaying uncommitted */ - -	__le32 result;                    /* result code */ - -	__le32 object_len;                /* length of object name */ -	__le32 num_ops; -	struct ceph_osd_op ops[0];  /* ops[], object */ -} __attribute__ ((packed)); - -  #endif diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 7d73905dcba..900af5964f5 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -203,6 +203,7 @@ struct cgroup {  	/* For RCU-protected deletion */  	struct rcu_head rcu_head; +	struct work_struct free_work;  	/* List of events which userspace want to receive */  	struct list_head event_list; @@ -558,6 +559,7 @@ static inline struct cgroup* task_cgroup(struct task_struct *task,  struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,  					  struct cgroup *cgroup); +struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos);  /**   * cgroup_for_each_descendant_pre - pre-order walk of a cgroup's descendants @@ -706,7 +708,6 @@ struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id);  static inline int cgroup_init_early(void) { return 0; }  static inline int cgroup_init(void) { return 0; }  static inline void cgroup_fork(struct task_struct *p) {} -static inline void cgroup_fork_callbacks(struct task_struct *p) {}  static inline void cgroup_post_fork(struct task_struct *p) {}  static inline void cgroup_exit(struct task_struct *p, int callbacks) {} diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 4989b8a7bed..7f197d7addb 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -379,7 +379,13 @@ struct clk_onecell_data {  };  struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data);  const char *of_clk_get_parent_name(struct device_node *np, int index); +  void of_clk_init(const struct of_device_id *matches); +#define CLK_OF_DECLARE(name, compat, fn)			\ +	static const struct of_device_id __clk_of_table_##name	\ +		__used __section(__clk_of_table)		\ +		= { .compatible = compat, .data = fn }; +  #endif /* CONFIG_COMMON_CLK */  #endif /* CLK_PROVIDER_H */ diff --git a/include/linux/clk/sunxi.h b/include/linux/clk/sunxi.h deleted file mode 100644 index e074fdd5a23..00000000000 --- a/include/linux/clk/sunxi.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2012 Maxime Ripard - * - * Maxime Ripard <maxime.ripard@free-electrons.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. - */ - -#ifndef __LINUX_CLK_SUNXI_H_ -#define __LINUX_CLK_SUNXI_H_ - -void __init sunxi_init_clocks(void); - -#endif diff --git a/include/linux/clk/tegra.h b/include/linux/clk/tegra.h new file mode 100644 index 00000000000..404d6f94087 --- /dev/null +++ b/include/linux/clk/tegra.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved. + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __LINUX_CLK_TEGRA_H_ +#define __LINUX_CLK_TEGRA_H_ + +#include <linux/clk.h> + +/* + * Tegra CPU clock and reset control ops + * + * wait_for_reset: + *	keep waiting until the CPU in reset state + * put_in_reset: + *	put the CPU in reset state + * out_of_reset: + *	release the CPU from reset state + * enable_clock: + *	CPU clock un-gate + * disable_clock: + *	CPU clock gate + * rail_off_ready: + *	CPU is ready for rail off + * suspend: + *	save the clock settings when CPU go into low-power state + * resume: + *	restore the clock settings when CPU exit low-power state + */ +struct tegra_cpu_car_ops { +	void (*wait_for_reset)(u32 cpu); +	void (*put_in_reset)(u32 cpu); +	void (*out_of_reset)(u32 cpu); +	void (*enable_clock)(u32 cpu); +	void (*disable_clock)(u32 cpu); +#ifdef CONFIG_PM_SLEEP +	bool (*rail_off_ready)(void); +	void (*suspend)(void); +	void (*resume)(void); +#endif +}; + +extern struct tegra_cpu_car_ops *tegra_cpu_car_ops; + +static inline void tegra_wait_cpu_in_reset(u32 cpu) +{ +	if (WARN_ON(!tegra_cpu_car_ops->wait_for_reset)) +		return; + +	tegra_cpu_car_ops->wait_for_reset(cpu); +} + +static inline void tegra_put_cpu_in_reset(u32 cpu) +{ +	if (WARN_ON(!tegra_cpu_car_ops->put_in_reset)) +		return; + +	tegra_cpu_car_ops->put_in_reset(cpu); +} + +static inline void tegra_cpu_out_of_reset(u32 cpu) +{ +	if (WARN_ON(!tegra_cpu_car_ops->out_of_reset)) +		return; + +	tegra_cpu_car_ops->out_of_reset(cpu); +} + +static inline void tegra_enable_cpu_clock(u32 cpu) +{ +	if (WARN_ON(!tegra_cpu_car_ops->enable_clock)) +		return; + +	tegra_cpu_car_ops->enable_clock(cpu); +} + +static inline void tegra_disable_cpu_clock(u32 cpu) +{ +	if (WARN_ON(!tegra_cpu_car_ops->disable_clock)) +		return; + +	tegra_cpu_car_ops->disable_clock(cpu); +} + +#ifdef CONFIG_PM_SLEEP +static inline bool tegra_cpu_rail_off_ready(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->rail_off_ready)) +		return false; + +	return tegra_cpu_car_ops->rail_off_ready(); +} + +static inline void tegra_cpu_clock_suspend(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->suspend)) +		return; + +	tegra_cpu_car_ops->suspend(); +} + +static inline void tegra_cpu_clock_resume(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->resume)) +		return; + +	tegra_cpu_car_ops->resume(); +} +#endif + +void tegra_periph_reset_deassert(struct clk *c); +void tegra_periph_reset_assert(struct clk *c); +void tegra_clocks_init(void); + +#endif /* __LINUX_CLK_TEGRA_H_ */ diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 4dceaf8ae15..27cfda427dd 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -332,4 +332,15 @@ extern int clocksource_mmio_init(void __iomem *, const char *,  extern int clocksource_i8253_init(void); +#ifdef CONFIG_CLKSRC_OF +extern void clocksource_of_init(void); + +#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)			\ +	static const struct of_device_id __clksrc_of_table_##name	\ +		__used __section(__clksrc_of_table)			\ +		 = { .compatible = compat, .data = fn }; +#else +#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) +#endif +  #endif /* _LINUX_CLOCKSOURCE_H */ diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 8031d6eef10..5b8721efa94 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h @@ -34,7 +34,7 @@ int venus_lookup(struct super_block *sb, struct CodaFid *fid,  		 const char *name, int length, int *type,   		 struct CodaFid *resfid);  int venus_close(struct super_block *sb, struct CodaFid *fid, int flags, -		vuid_t uid); +		kuid_t uid);  int venus_open(struct super_block *sb, struct CodaFid *fid, int flags,  	       struct file **f);  int venus_mkdir(struct super_block *sb, struct CodaFid *dirfid,  diff --git a/include/linux/compaction.h b/include/linux/compaction.h index cc7bddeaf55..091d72e70d8 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h @@ -23,7 +23,7 @@ extern int fragmentation_index(struct zone *zone, unsigned int order);  extern unsigned long try_to_compact_pages(struct zonelist *zonelist,  			int order, gfp_t gfp_mask, nodemask_t *mask,  			bool sync, bool *contended); -extern int compact_pgdat(pg_data_t *pgdat, int order); +extern void compact_pgdat(pg_data_t *pgdat, int order);  extern void reset_isolation_suitable(pg_data_t *pgdat);  extern unsigned long compaction_suitable(struct zone *zone, int order); @@ -80,9 +80,8 @@ static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,  	return COMPACT_CONTINUE;  } -static inline int compact_pgdat(pg_data_t *pgdat, int order) +static inline void compact_pgdat(pg_data_t *pgdat, int order)  { -	return COMPACT_CONTINUE;  }  static inline void reset_isolation_suitable(pg_data_t *pgdat) diff --git a/include/linux/compat.h b/include/linux/compat.h index dec7e2d1887..377cd8c3395 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -68,7 +68,6 @@  #ifndef compat_user_stack_pointer  #define compat_user_stack_pointer() current_user_stack_pointer()  #endif -#ifdef CONFIG_GENERIC_SIGALTSTACK  #ifndef compat_sigaltstack	/* we'll need that for MIPS */  typedef struct compat_sigaltstack {  	compat_uptr_t			ss_sp; @@ -76,7 +75,6 @@ typedef struct compat_sigaltstack {  	compat_size_t			ss_size;  } compat_stack_t;  #endif -#endif  #define compat_jiffies_to_clock_t(x)	\  		(((unsigned long)(x) * COMPAT_USER_HZ) / HZ) @@ -142,6 +140,20 @@ typedef struct {  	compat_sigset_word	sig[_COMPAT_NSIG_WORDS];  } compat_sigset_t; +struct compat_sigaction { +#ifndef __ARCH_HAS_IRIX_SIGACTION +	compat_uptr_t			sa_handler; +	compat_ulong_t			sa_flags; +#else +	compat_uint_t			sa_flags; +	compat_uptr_t			sa_handler; +#endif +#ifdef __ARCH_HAS_SA_RESTORER +	compat_uptr_t			sa_restorer; +#endif +	compat_sigset_t			sa_mask __packed; +}; +  /*   * These functions operate strictly on struct compat_time*   */ @@ -283,6 +295,15 @@ struct compat_robust_list_head {  	compat_uptr_t			list_op_pending;  }; +#ifdef CONFIG_COMPAT_OLD_SIGACTION +struct compat_old_sigaction { +	compat_uptr_t			sa_handler; +	compat_old_sigset_t		sa_mask; +	compat_ulong_t			sa_flags; +	compat_uptr_t			sa_restorer; +}; +#endif +  struct compat_statfs;  struct compat_statfs64;  struct compat_old_linux_dirent; @@ -338,6 +359,7 @@ asmlinkage ssize_t compat_sys_preadv(unsigned long fd,  asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,  		const struct compat_iovec __user *vec,  		unsigned long vlen, u32 pos_low, u32 pos_high); +asmlinkage long comat_sys_lseek(unsigned int, compat_off_t, unsigned int);  asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,  		     const compat_uptr_t __user *envp); @@ -367,6 +389,11 @@ int get_compat_sigevent(struct sigevent *event,  		const struct compat_sigevent __user *u_event);  long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,  				  struct compat_siginfo __user *uinfo); +#ifdef CONFIG_COMPAT_OLD_SIGACTION +asmlinkage long compat_sys_sigaction(int sig, +                                   const struct compat_old_sigaction __user *act, +                                   struct compat_old_sigaction __user *oact); +#endif  static inline int compat_timeval_compare(struct compat_timeval *lhs,  					struct compat_timeval *rhs) @@ -401,7 +428,8 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,  asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);  extern int compat_printk(const char *fmt, ...); -extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); +extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); +extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set);  asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,  		compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, @@ -503,11 +531,13 @@ 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,  				umode_t mode); -asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, +asmlinkage long compat_sys_openat(int dfd, const char __user *filename,  				  int flags, umode_t mode);  asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,  					     struct file_handle __user *handle,  					     int flags); +asmlinkage long compat_sys_truncate(const char __user *, compat_off_t); +asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);  asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,  				    compat_ulong_t __user *outp,  				    compat_ulong_t __user *exp, @@ -592,6 +622,19 @@ asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,  		struct compat_timespec __user *uts, compat_size_t sigsetsize);  asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,  					 compat_size_t sigsetsize); +asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set, +					  compat_sigset_t __user *oset, +					  compat_size_t sigsetsize); +asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset, +					 compat_size_t sigsetsize); +#ifndef CONFIG_ODD_RT_SIGACTION +asmlinkage long compat_sys_rt_sigaction(int, +				 const struct compat_sigaction __user *, +				 struct compat_sigaction __user *, +				 compat_size_t); +#endif +asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig, +				struct compat_siginfo __user *uinfo);  asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);  asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,  				 unsigned long arg); @@ -642,13 +685,11 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,  asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,  				    compat_off_t __user *offset, compat_size_t count); -#ifdef CONFIG_GENERIC_SIGALTSTACK  asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,  				       compat_stack_t __user *uoss_ptr);  int compat_restore_altstack(const compat_stack_t __user *uss);  int __compat_save_altstack(compat_stack_t __user *, unsigned long); -#endif  asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,  						 struct compat_timespec __user *interval); diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 6a6d7aefe12..24545cd90a2 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -5,6 +5,9 @@  /*   * Common definitions for all gcc versions go here.   */ +#define GCC_VERSION (__GNUC__ * 10000 \ +		   + __GNUC_MINOR__ * 100 \ +		   + __GNUC_PATCHLEVEL__)  /* Optimization barrier */ diff --git a/include/linux/compiler-gcc3.h b/include/linux/compiler-gcc3.h index 37d412436d0..7d89febe4d7 100644 --- a/include/linux/compiler-gcc3.h +++ b/include/linux/compiler-gcc3.h @@ -2,22 +2,22 @@  #error "Please don't include <linux/compiler-gcc3.h> directly, include <linux/compiler.h> instead."  #endif -#if __GNUC_MINOR__ < 2 +#if GCC_VERSION < 30200  # error Sorry, your compiler is too old - please upgrade it.  #endif -#if __GNUC_MINOR__ >= 3 +#if GCC_VERSION >= 30300  # define __used			__attribute__((__used__))  #else  # define __used			__attribute__((__unused__))  #endif -#if __GNUC_MINOR__ >= 4 +#if GCC_VERSION >= 30400  #define __must_check		__attribute__((warn_unused_result))  #endif  #ifdef CONFIG_GCOV_KERNEL -# if __GNUC_MINOR__ < 4 +# if GCC_VERSION < 30400  #   error "GCOV profiling support for gcc versions below 3.4 not included"  # endif /* __GNUC_MINOR__ */  #endif /* CONFIG_GCOV_KERNEL */ diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 662fd1b4c42..68b162d9225 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h @@ -4,7 +4,7 @@  /* GCC 4.1.[01] miscompiles __weak */  #ifdef __KERNEL__ -# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1 +# if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101  #  error Your version of gcc miscompiles the __weak directive  # endif  #endif @@ -13,7 +13,11 @@  #define __must_check 		__attribute__((warn_unused_result))  #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) -#if __GNUC_MINOR__ >= 3 +#if GCC_VERSION >= 40100 +# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) +#endif + +#if GCC_VERSION >= 40300  /* Mark functions as cold. gcc will assume any path leading to a call     to them will be unlikely.  This means a lot of manual unlikely()s     are unnecessary now for any paths leading to the usual suspects @@ -29,11 +33,15 @@     the kernel context */  #define __cold			__attribute__((__cold__)) -#define __linktime_error(message) __attribute__((__error__(message))) -  #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) -#if __GNUC_MINOR__ >= 5 +#ifndef __CHECKER__ +# define __compiletime_warning(message) __attribute__((warning(message))) +# define __compiletime_error(message) __attribute__((error(message))) +#endif /* __CHECKER__ */ +#endif /* GCC_VERSION >= 40300 */ + +#if GCC_VERSION >= 40500  /*   * Mark a position in code as unreachable.  This can be used to   * suppress control flow warnings after asm blocks that transfer @@ -48,30 +56,22 @@  /* Mark a function definition as prohibited from being cloned. */  #define __noclone	__attribute__((__noclone__)) -#endif -#endif +#endif /* GCC_VERSION >= 40500 */ -#if __GNUC_MINOR__ >= 6 +#if GCC_VERSION >= 40600  /*   * Tell the optimizer that something else uses this function or variable.   */  #define __visible __attribute__((externally_visible))  #endif -#if __GNUC_MINOR__ > 0 -#define __compiletime_object_size(obj) __builtin_object_size(obj, 0) -#endif -#if __GNUC_MINOR__ >= 3 && !defined(__CHECKER__) -#define __compiletime_warning(message) __attribute__((warning(message))) -#define __compiletime_error(message) __attribute__((error(message))) -#endif  #ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP -#if __GNUC_MINOR__ >= 4 +#if GCC_VERSION >= 40400  #define __HAVE_BUILTIN_BSWAP32__  #define __HAVE_BUILTIN_BSWAP64__  #endif -#if __GNUC_MINOR__ >= 8 || (defined(__powerpc__) && __GNUC_MINOR__ >= 6) +#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)  #define __HAVE_BUILTIN_BSWAP16__  #endif -#endif +#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ diff --git a/include/linux/compiler.h b/include/linux/compiler.h index dd852b73b28..10b8f23fab0 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -307,10 +307,36 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);  #endif  #ifndef __compiletime_error  # define __compiletime_error(message) +# define __compiletime_error_fallback(condition) \ +	do { ((void)sizeof(char[1 - 2 * condition])); } while (0) +#else +# define __compiletime_error_fallback(condition) do { } while (0)  #endif -#ifndef __linktime_error -# define __linktime_error(message) -#endif + +#define __compiletime_assert(condition, msg, prefix, suffix)		\ +	do {								\ +		bool __cond = !(condition);				\ +		extern void prefix ## suffix(void) __compiletime_error(msg); \ +		if (__cond)						\ +			prefix ## suffix();				\ +		__compiletime_error_fallback(__cond);			\ +	} while (0) + +#define _compiletime_assert(condition, msg, prefix, suffix) \ +	__compiletime_assert(condition, msg, prefix, suffix) + +/** + * compiletime_assert - break build and emit msg if condition is false + * @condition: a compile-time constant condition to check + * @msg:       a message to emit if condition is false + * + * In tradition of POSIX assert, this macro will break the build if the + * supplied condition is *false*, emitting the supplied error message if the + * compiler has support to do so. + */ +#define compiletime_assert(condition, msg) \ +	_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) +  /*   * 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/completion.h b/include/linux/completion.h index 51494e6b554..33f0280fd53 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h @@ -77,10 +77,13 @@ static inline void init_completion(struct completion *x)  }  extern void wait_for_completion(struct completion *); +extern void wait_for_completion_io(struct completion *);  extern int wait_for_completion_interruptible(struct completion *x);  extern int wait_for_completion_killable(struct completion *x);  extern unsigned long wait_for_completion_timeout(struct completion *x,  						   unsigned long timeout); +extern unsigned long wait_for_completion_io_timeout(struct completion *x, +						    unsigned long timeout);  extern long wait_for_completion_interruptible_timeout(  	struct completion *x, unsigned long timeout);  extern long wait_for_completion_killable_timeout( diff --git a/include/linux/console.h b/include/linux/console.h index dedb082fe50..29680a8cda9 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -77,7 +77,9 @@ extern const struct consw prom_con;	/* SPARC PROM console */  int con_is_bound(const struct consw *csw);  int register_con_driver(const struct consw *csw, int first, int last);  int unregister_con_driver(const struct consw *csw); +int do_unregister_con_driver(const struct consw *csw);  int take_over_console(const struct consw *sw, int first, int last, int deflt); +int do_take_over_console(const struct consw *sw, int first, int last, int deflt);  void give_up_console(const struct consw *sw);  #ifdef CONFIG_HW_CONSOLE  int con_debug_enter(struct vc_data *vc); @@ -157,7 +159,12 @@ extern int is_console_locked(void);  extern int braille_register_console(struct console *, int index,  		char *console_options, char *braille_options);  extern int braille_unregister_console(struct console *); +#ifdef CONFIG_TTY  extern void console_sysfs_notify(void); +#else +static inline void console_sysfs_notify(void) +{ } +#endif  extern bool console_suspend_enabled;  /* Suspend and resume console messages over PM events */ diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index a55b88eaf96..a22944ca052 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -89,11 +89,15 @@ struct cpufreq_real_policy {  };  struct cpufreq_policy { -	cpumask_var_t		cpus;	/* CPUs requiring sw coordination */ -	cpumask_var_t		related_cpus; /* CPUs with any coordination */ -	unsigned int		shared_type; /* ANY or ALL affected CPUs +	/* CPUs sharing clock, require sw coordination */ +	cpumask_var_t		cpus;	/* Online CPUs only */ +	cpumask_var_t		related_cpus; /* Online + Offline CPUs */ + +	unsigned int		shared_type; /* ACPI: ANY or ALL affected CPUs  						should set cpufreq */ -	unsigned int		cpu;    /* cpu nr of registered CPU */ +	unsigned int		cpu;    /* cpu nr of CPU managing this policy */ +	unsigned int		last_cpu; /* cpu nr of previous CPU that managed +					   * this policy */  	struct cpufreq_cpuinfo	cpuinfo;/* see above */  	unsigned int		min;    /* in kHz */ @@ -112,16 +116,23 @@ struct cpufreq_policy {  	struct completion	kobj_unregister;  }; -#define CPUFREQ_ADJUST		(0) -#define CPUFREQ_INCOMPATIBLE	(1) -#define CPUFREQ_NOTIFY		(2) -#define CPUFREQ_START		(3) +#define CPUFREQ_ADJUST			(0) +#define CPUFREQ_INCOMPATIBLE		(1) +#define CPUFREQ_NOTIFY			(2) +#define CPUFREQ_START			(3) +#define CPUFREQ_UPDATE_POLICY_CPU	(4) +/* Only for ACPI */  #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */  #define CPUFREQ_SHARED_TYPE_HW	 (1) /* HW does needed coordination */  #define CPUFREQ_SHARED_TYPE_ALL	 (2) /* All dependent CPUs should set freq */  #define CPUFREQ_SHARED_TYPE_ANY	 (3) /* Freq can be set from any dependent CPU*/ +static inline bool policy_is_shared(struct cpufreq_policy *policy) +{ +	return cpumask_weight(policy->cpus) > 1; +} +  /******************** cpufreq transition notifiers *******************/  #define CPUFREQ_PRECHANGE	(0) @@ -173,6 +184,7 @@ static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mu  struct cpufreq_governor {  	char	name[CPUFREQ_NAME_LEN]; +	int	initialized;  	int	(*governor)	(struct cpufreq_policy *policy,  				 unsigned int event);  	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy, @@ -308,6 +320,9 @@ __ATTR(_name, 0444, show_##_name, NULL)  static struct global_attr _name =		\  __ATTR(_name, 0644, show_##_name, store_##_name) +struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu); +void cpufreq_cpu_put(struct cpufreq_policy *data); +const char *cpufreq_get_current_driver(void);  /*********************************************************************   *                        CPUFREQ 2.6. INTERFACE                     * @@ -397,14 +412,13 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,  /* the following 3 funtions are for cpufreq core use only */  struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu); -struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu); -void   cpufreq_cpu_put(struct cpufreq_policy *data);  /* the following are really really optional */  extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;  void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,  				      unsigned int cpu); +void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);  void cpufreq_frequency_table_put_attr(unsigned int cpu);  #endif /* _LINUX_CPUFREQ_H */ diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 24cd1037b6d..480c14dc1dd 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -32,8 +32,6 @@ struct cpuidle_driver;   ****************************/  struct cpuidle_state_usage { -	void		*driver_data; -  	unsigned long long	disable;  	unsigned long long	usage;  	unsigned long long	time; /* in US */ @@ -62,26 +60,6 @@ struct cpuidle_state {  #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) -/** - * cpuidle_get_statedata - retrieves private driver state data - * @st_usage: the state usage statistics - */ -static inline void *cpuidle_get_statedata(struct cpuidle_state_usage *st_usage) -{ -	return st_usage->driver_data; -} - -/** - * cpuidle_set_statedata - stores private driver state data - * @st_usage: the state usage statistics - * @data: the private data - */ -static inline void -cpuidle_set_statedata(struct cpuidle_state_usage *st_usage, void *data) -{ -	st_usage->driver_data = data; -} -  struct cpuidle_device {  	unsigned int		registered:1;  	unsigned int		enabled:1; diff --git a/include/linux/crush/crush.h b/include/linux/crush/crush.h index 25baa287cff..6a1101f24cf 100644 --- a/include/linux/crush/crush.h +++ b/include/linux/crush/crush.h @@ -162,6 +162,8 @@ struct crush_map {  	__u32 choose_local_fallback_tries;  	/* choose attempts before giving up */   	__u32 choose_total_tries; +	/* attempt chooseleaf inner descent once; on failure retry outer descent */ +	__u32 chooseleaf_descend_once;  }; diff --git a/include/linux/cyclomx.h b/include/linux/cyclomx.h deleted file mode 100644 index b88f7f428e5..00000000000 --- a/include/linux/cyclomx.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef	_CYCLOMX_H -#define	_CYCLOMX_H -/* -* cyclomx.h	Cyclom 2X WAN Link Driver. -*		User-level API definitions. -* -* Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br> -* -* Copyright:	(c) 1998-2003 Arnaldo Carvalho de Melo -* -* Based on wanpipe.h by Gene Kozin <genek@compuserve.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. -* ============================================================================ -* 2000/07/13    acme		remove crap #if KERNEL_VERSION > blah -* 2000/01/21    acme            rename cyclomx_open to cyclomx_mod_inc_use_count -*                               and cyclomx_close to cyclomx_mod_dec_use_count -* 1999/05/19	acme		wait_queue_head_t wait_stats(support for 2.3.*) -* 1999/01/03	acme		judicious use of data types -* 1998/12/27	acme		cleanup: PACKED not needed -* 1998/08/08	acme		Version 0.0.1 -*/ - -#include <linux/wanrouter.h> -#include <linux/spinlock.h> - -#ifdef	__KERNEL__ -/* Kernel Interface */ - -#include <linux/cycx_drv.h>	/* Cyclom 2X support module API definitions */ -#include <linux/cycx_cfm.h>	/* Cyclom 2X firmware module definitions */ -#ifdef CONFIG_CYCLOMX_X25 -#include <linux/cycx_x25.h> -#endif - -/* Adapter Data Space. - * This structure is needed because we handle multiple cards, otherwise - * static data would do it. - */ -struct cycx_device { -	char devname[WAN_DRVNAME_SZ + 1];/* card name */ -	struct cycx_hw hw;		/* hardware configuration */ -	struct wan_device wandev;	/* WAN device data space */ -	u32 state_tick;			/* link state timestamp */ -	spinlock_t lock; -	char in_isr;			/* interrupt-in-service flag */ -	char buff_int_mode_unbusy;      /* flag for carrying out dev_tint */ -	wait_queue_head_t wait_stats;  /* to wait for the STATS indication */ -	void __iomem *mbox;			/* -> mailbox */ -	void (*isr)(struct cycx_device* card);	/* interrupt service routine */ -	int (*exec)(struct cycx_device* card, void* u_cmd, void* u_data); -	union { -#ifdef CONFIG_CYCLOMX_X25 -		struct { /* X.25 specific data */ -			u32 lo_pvc; -			u32 hi_pvc; -			u32 lo_svc; -			u32 hi_svc; -			struct cycx_x25_stats stats; -			spinlock_t lock; -			u32 connection_keys; -		} x; -#endif -	} u; -}; - -/* Public Functions */ -void cycx_set_state(struct cycx_device *card, int state); - -#ifdef CONFIG_CYCLOMX_X25 -int cycx_x25_wan_init(struct cycx_device *card, wandev_conf_t *conf); -#endif -#endif	/* __KERNEL__ */ -#endif	/* _CYCLOMX_H */ diff --git a/include/linux/cycx_drv.h b/include/linux/cycx_drv.h deleted file mode 100644 index 12fe6b0bfcf..00000000000 --- a/include/linux/cycx_drv.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -* cycx_drv.h	CYCX Support Module.  Kernel API Definitions. -* -* Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br> -* -* Copyright:	(c) 1998-2003 Arnaldo Carvalho de Melo -* -* Based on sdladrv.h by Gene Kozin <genek@compuserve.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. -* ============================================================================ -* 1999/10/23	acme		cycxhw_t cleanup -* 1999/01/03	acme		more judicious use of data types... -*				uclong, ucchar, etc deleted, the u8, u16, u32 -*				types are the portable way to go. -* 1999/01/03	acme		judicious use of data types... u16, u32, etc -* 1998/12/26	acme	 	FIXED_BUFFERS, CONF_OFFSET, -*                               removal of cy_read{bwl} -* 1998/08/08	acme	 	Initial version. -*/ -#ifndef	_CYCX_DRV_H -#define	_CYCX_DRV_H - -#define	CYCX_WINDOWSIZE	0x4000	/* default dual-port memory window size */ -#define	GEN_CYCX_INTR	0x02 -#define	RST_ENABLE	0x04 -#define	START_CPU	0x06 -#define	RST_DISABLE	0x08 -#define	FIXED_BUFFERS	0x08 -#define	TEST_PATTERN	0xaa55 -#define	CMD_OFFSET	0x20 -#define CONF_OFFSET     0x0380 -#define	RESET_OFFSET	0x3c00	/* For reset file load */ -#define	DATA_OFFSET	0x0100	/* For code and data files load */ -#define	START_OFFSET	0x3ff0	/* 80186 starts here */ - -/** - *	struct cycx_hw - Adapter hardware configuration - *	@fwid - firmware ID - *	@irq - interrupt request level - *	@dpmbase - dual-port memory base - *	@dpmsize - dual-port memory size - *	@reserved - reserved for future use - */ -struct cycx_hw { -	u32 fwid; -	int irq; -	void __iomem *dpmbase; -	u32 dpmsize; -	u32 reserved[5]; -}; - -/* Function Prototypes */ -extern int cycx_setup(struct cycx_hw *hw, void *sfm, u32 len, unsigned long base); -extern int cycx_down(struct cycx_hw *hw); -extern int cycx_peek(struct cycx_hw *hw, u32 addr, void *buf, u32 len); -extern int cycx_poke(struct cycx_hw *hw, u32 addr, void *buf, u32 len); -extern int cycx_exec(void __iomem *addr); - -extern void cycx_intr(struct cycx_hw *hw); -#endif	/* _CYCX_DRV_H */ diff --git a/include/linux/dcache.h b/include/linux/dcache.h index c1754b59ddd..1a6bb81f0fe 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -145,6 +145,7 @@ enum dentry_d_lock_class  struct dentry_operations {  	int (*d_revalidate)(struct dentry *, unsigned int); +	int (*d_weak_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, @@ -192,6 +193,8 @@ struct dentry_operations {  #define DCACHE_GENOCIDE		0x0200  #define DCACHE_SHRINK_LIST	0x0400 +#define DCACHE_OP_WEAK_REVALIDATE	0x0800 +  #define DCACHE_NFSFS_RENAMED	0x1000       /* this dentry has been "silly renamed" and has to be deleted on the last        * dput() */ @@ -293,9 +296,9 @@ extern void d_move(struct dentry *, struct dentry *);  extern struct dentry *d_ancestor(struct dentry *, struct dentry *);  /* appendix may either be NULL or be used for transname suffixes */ -extern struct dentry *d_lookup(struct dentry *, struct qstr *); +extern struct dentry *d_lookup(const struct dentry *, const struct qstr *);  extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *); -extern struct dentry *__d_lookup(struct dentry *, struct qstr *); +extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);  extern struct dentry *__d_lookup_rcu(const struct dentry *parent,  				const struct qstr *name,  				unsigned *seq, struct inode *inode); @@ -333,7 +336,6 @@ extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);  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);  extern char *dentry_path(struct dentry *, char *, int); diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index 66c434f5dd1..63f2465807d 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h @@ -33,7 +33,7 @@ struct debugfs_reg32 {  };  struct debugfs_regset32 { -	struct debugfs_reg32 *regs; +	const struct debugfs_reg32 *regs;  	int nregs;  	void __iomem *base;  }; diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index e83ef39b3be..fe8c4476f7e 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -213,7 +213,7 @@ struct devfreq_simple_ondemand_data {  #endif  #else /* !CONFIG_PM_DEVFREQ */ -static struct devfreq *devfreq_add_device(struct device *dev, +static inline struct devfreq *devfreq_add_device(struct device *dev,  					  struct devfreq_dev_profile *profile,  					  const char *governor_name,  					  void *data) @@ -221,34 +221,34 @@ static struct devfreq *devfreq_add_device(struct device *dev,  	return NULL;  } -static int devfreq_remove_device(struct devfreq *devfreq) +static inline int devfreq_remove_device(struct devfreq *devfreq)  {  	return 0;  } -static int devfreq_suspend_device(struct devfreq *devfreq) +static inline int devfreq_suspend_device(struct devfreq *devfreq)  {  	return 0;  } -static int devfreq_resume_device(struct devfreq *devfreq) +static inline int devfreq_resume_device(struct devfreq *devfreq)  {  	return 0;  } -static struct opp *devfreq_recommended_opp(struct device *dev, +static inline struct opp *devfreq_recommended_opp(struct device *dev,  					   unsigned long *freq, u32 flags)  { -	return -EINVAL; +	return ERR_PTR(-EINVAL);  } -static int devfreq_register_opp_notifier(struct device *dev, +static inline int devfreq_register_opp_notifier(struct device *dev,  					 struct devfreq *devfreq)  {  	return -EINVAL;  } -static int devfreq_unregister_opp_notifier(struct device *dev, +static inline int devfreq_unregister_opp_notifier(struct device *dev,  					   struct devfreq *devfreq)  {  	return -EINVAL; diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index bf6afa2fc43..1e483fa7afb 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -68,8 +68,8 @@ typedef void (*dm_postsuspend_fn) (struct dm_target *ti);  typedef int (*dm_preresume_fn) (struct dm_target *ti);  typedef void (*dm_resume_fn) (struct dm_target *ti); -typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, -			     unsigned status_flags, char *result, unsigned maxlen); +typedef void (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, +			      unsigned status_flags, char *result, unsigned maxlen);  typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); @@ -175,6 +175,14 @@ struct target_type {  #define DM_TARGET_IMMUTABLE		0x00000004  #define dm_target_is_immutable(type)	((type)->features & DM_TARGET_IMMUTABLE) +/* + * Some targets need to be sent the same WRITE bio severals times so + * that they can send copies of it to different devices.  This function + * examines any supplied bio and returns the number of copies of it the + * target requires. + */ +typedef unsigned (*dm_num_write_bios_fn) (struct dm_target *ti, struct bio *bio); +  struct dm_target {  	struct dm_table *table;  	struct target_type *type; @@ -187,26 +195,26 @@ struct dm_target {  	uint32_t max_io_len;  	/* -	 * A number of zero-length barrier requests that will be submitted +	 * A number of zero-length barrier bios that will be submitted  	 * to the target for the purpose of flushing cache.  	 * -	 * The request number can be accessed with dm_bio_get_target_request_nr. -	 * It is a responsibility of the target driver to remap these requests +	 * The bio number can be accessed with dm_bio_get_target_bio_nr. +	 * It is a responsibility of the target driver to remap these bios  	 * to the real underlying devices.  	 */ -	unsigned num_flush_requests; +	unsigned num_flush_bios;  	/* -	 * The number of discard requests that will be submitted to the target. -	 * The request number can be accessed with dm_bio_get_target_request_nr. +	 * The number of discard bios that will be submitted to the target. +	 * The bio number can be accessed with dm_bio_get_target_bio_nr.  	 */ -	unsigned num_discard_requests; +	unsigned num_discard_bios;  	/* -	 * The number of WRITE SAME requests that will be submitted to the target. -	 * The request number can be accessed with dm_bio_get_target_request_nr. +	 * The number of WRITE SAME bios that will be submitted to the target. +	 * The bio number can be accessed with dm_bio_get_target_bio_nr.  	 */ -	unsigned num_write_same_requests; +	unsigned num_write_same_bios;  	/*  	 * The minimum number of extra bytes allocated in each bio for the @@ -214,6 +222,13 @@ struct dm_target {  	 */  	unsigned per_bio_data_size; +	/* +	 * If defined, this function is called to find out how many +	 * duplicate bios should be sent to the target when writing +	 * data. +	 */ +	dm_num_write_bios_fn num_write_bios; +  	/* target specific data */  	void *private; @@ -233,10 +248,10 @@ struct dm_target {  	bool discards_supported:1;  	/* -	 * Set if the target required discard request to be split +	 * Set if the target required discard bios to be split  	 * on max_io_len boundary.  	 */ -	bool split_discard_requests:1; +	bool split_discard_bios:1;  	/*  	 * Set if this target does not return zeroes on discarded blocks. @@ -261,7 +276,7 @@ struct dm_target_io {  	struct dm_io *io;  	struct dm_target *ti;  	union map_info info; -	unsigned target_request_nr; +	unsigned target_bio_nr;  	struct bio clone;  }; @@ -275,9 +290,9 @@ static inline struct bio *dm_bio_from_per_bio_data(void *data, size_t data_size)  	return (struct bio *)((char *)data + data_size + offsetof(struct dm_target_io, clone));  } -static inline unsigned dm_bio_get_target_request_nr(const struct bio *bio) +static inline unsigned dm_bio_get_target_bio_nr(const struct bio *bio)  { -	return container_of(bio, struct dm_target_io, clone)->target_request_nr; +	return container_of(bio, struct dm_target_io, clone)->target_bio_nr;  }  int dm_register_target(struct target_type *t); diff --git a/include/linux/device.h b/include/linux/device.h index 43dcda937dd..88615ccaf23 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -21,9 +21,11 @@  #include <linux/compiler.h>  #include <linux/types.h>  #include <linux/mutex.h> +#include <linux/pinctrl/devinfo.h>  #include <linux/pm.h>  #include <linux/atomic.h>  #include <linux/ratelimit.h> +#include <linux/uidgid.h>  #include <asm/device.h>  struct device; @@ -110,17 +112,11 @@ struct bus_type {  	struct iommu_ops *iommu_ops;  	struct subsys_private *p; +	struct lock_class_key lock_key;  }; -/* This is a #define to keep the compiler from merging different - * instances of the __key variable */ -#define bus_register(subsys)			\ -({						\ -	static struct lock_class_key __key;	\ -	__bus_register(subsys, &__key);	\ -}) -extern int __must_check __bus_register(struct bus_type *bus, -				       struct lock_class_key *key); +extern int __must_check bus_register(struct bus_type *bus); +  extern void bus_unregister(struct bus_type *bus);  extern int __must_check bus_rescan_devices(struct bus_type *bus); @@ -395,8 +391,8 @@ extern int class_for_each_device(struct class *class, struct device *start,  				 void *data,  				 int (*fn)(struct device *dev, void *data));  extern struct device *class_find_device(struct class *class, -					struct device *start, void *data, -					int (*match)(struct device *, void *)); +					struct device *start, const void *data, +					int (*match)(struct device *, const void *));  struct class_attribute {  	struct attribute attr; @@ -470,7 +466,8 @@ struct device_type {  	const char *name;  	const struct attribute_group **groups;  	int (*uevent)(struct device *dev, struct kobj_uevent_env *env); -	char *(*devnode)(struct device *dev, umode_t *mode); +	char *(*devnode)(struct device *dev, umode_t *mode, +			 kuid_t *uid, kgid_t *gid);  	void (*release)(struct device *dev);  	const struct dev_pm_ops *pm; @@ -573,6 +570,7 @@ 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_ioremap_resource(struct device *dev, struct resource *res);  void __iomem *devm_request_and_ioremap(struct device *dev,  			struct resource *res); @@ -620,6 +618,8 @@ struct acpi_dev_node {   * @pm_domain:	Provide callbacks that are executed during system suspend,   * 		hibernation, system resume and during runtime PM transitions   * 		along with subsystem-level and driver-level callbacks. + * @pins:	For device pin management. + *		See Documentation/pinctrl.txt for details.   * @numa_node:	NUMA node this device is close to.   * @dma_mask:	Dma mask (if dma'ble device).   * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all @@ -672,6 +672,10 @@ struct device {  	struct dev_pm_info	power;  	struct dev_pm_domain	*pm_domain; +#ifdef CONFIG_PINCTRL +	struct dev_pin_info	*pins; +#endif +  #ifdef CONFIG_NUMA  	int		numa_node;	/* NUMA node this device is close to */  #endif @@ -841,7 +845,8 @@ extern int device_rename(struct device *dev, const char *new_name);  extern int device_move(struct device *dev, struct device *new_parent,  		       enum dpm_order dpm_order);  extern const char *device_get_devnode(struct device *dev, -				      umode_t *mode, const char **tmp); +				      umode_t *mode, kuid_t *uid, kgid_t *gid, +				      const char **tmp);  extern void *dev_get_drvdata(const struct device *dev);  extern int dev_set_drvdata(struct device *dev, void *data); diff --git a/include/linux/dm-kcopyd.h b/include/linux/dm-kcopyd.h index 47d9d376e4e..f486d636b82 100644 --- a/include/linux/dm-kcopyd.h +++ b/include/linux/dm-kcopyd.h @@ -21,11 +21,34 @@  #define DM_KCOPYD_IGNORE_ERROR 1 +struct dm_kcopyd_throttle { +	unsigned throttle; +	unsigned num_io_jobs; +	unsigned io_period; +	unsigned total_period; +	unsigned last_jiffies; +}; + +/* + * kcopyd clients that want to support throttling must pass an initialised + * dm_kcopyd_throttle struct into dm_kcopyd_client_create(). + * Two or more clients may share the same instance of this struct between + * them if they wish to be throttled as a group. + * + * This macro also creates a corresponding module parameter to configure + * the amount of throttling. + */ +#define DECLARE_DM_KCOPYD_THROTTLE_WITH_MODULE_PARM(name, description)	\ +static struct dm_kcopyd_throttle dm_kcopyd_throttle = { 100, 0, 0, 0, 0 }; \ +module_param_named(name, dm_kcopyd_throttle.throttle, uint, 0644); \ +MODULE_PARM_DESC(name, description) +  /*   * To use kcopyd you must first create a dm_kcopyd_client object. + * throttle can be NULL if you don't want any throttling.   */  struct dm_kcopyd_client; -struct dm_kcopyd_client *dm_kcopyd_client_create(void); +struct dm_kcopyd_client *dm_kcopyd_client_create(struct dm_kcopyd_throttle *throttle);  void dm_kcopyd_client_destroy(struct dm_kcopyd_client *kc);  /* diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index bd2e52ccc4f..9978b614a1a 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -53,7 +53,7 @@ struct dma_buf_attachment;   * @begin_cpu_access: [optional] called before cpu access to invalidate cpu   * 		      caches and allocate backing storage (if not yet done)   * 		      respectively pin the objet into memory. - * @end_cpu_access: [optional] called after cpu access to flush cashes. + * @end_cpu_access: [optional] called after cpu access to flush caches.   * @kmap_atomic: maps a page from the buffer into kernel address   * 		 space, users may not block until the subsequent unmap call.   * 		 This callback must not sleep. @@ -119,8 +119,10 @@ struct dma_buf {  	struct file *file;  	struct list_head attachments;  	const struct dma_buf_ops *ops; -	/* mutex to serialize list manipulation and attach/detach */ +	/* mutex to serialize list manipulation, attach/detach and vmap/unmap */  	struct mutex lock; +	unsigned vmapping_counter; +	void *vmap_ptr;  	void *priv;  }; diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index d3201e438d1..91ac8da2502 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -608,7 +608,10 @@ static inline int dmaengine_device_control(struct dma_chan *chan,  					   enum dma_ctrl_cmd cmd,  					   unsigned long arg)  { -	return chan->device->device_control(chan, cmd, arg); +	if (chan->device->device_control) +		return chan->device->device_control(chan, cmd, arg); + +	return -ENOSYS;  }  static inline int dmaengine_slave_config(struct dma_chan *chan, @@ -618,6 +621,11 @@ static inline int dmaengine_slave_config(struct dma_chan *chan,  			(unsigned long)config);  } +static inline bool is_slave_direction(enum dma_transfer_direction direction) +{ +	return (direction == DMA_MEM_TO_DEV) || (direction == DMA_DEV_TO_MEM); +} +  static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(  	struct dma_chan *chan, dma_addr_t buf, size_t len,  	enum dma_transfer_direction dir, unsigned long flags) @@ -660,6 +668,13 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(  						period_len, dir, flags, NULL);  } +static inline struct dma_async_tx_descriptor *dmaengine_prep_interleaved_dma( +		struct dma_chan *chan, struct dma_interleaved_template *xt, +		unsigned long flags) +{ +	return chan->device->device_prep_interleaved_dma(chan, xt, flags); +} +  static inline int dmaengine_terminate_all(struct dma_chan *chan)  {  	return dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); @@ -849,20 +864,6 @@ static inline bool async_tx_test_ack(struct dma_async_tx_descriptor *tx)  	return (tx->flags & DMA_CTRL_ACK) == DMA_CTRL_ACK;  } -#define first_dma_cap(mask) __first_dma_cap(&(mask)) -static inline int __first_dma_cap(const dma_cap_mask_t *srcp) -{ -	return min_t(int, DMA_TX_TYPE_END, -		find_first_bit(srcp->bits, DMA_TX_TYPE_END)); -} - -#define next_dma_cap(n, mask) __next_dma_cap((n), &(mask)) -static inline int __next_dma_cap(int n, const dma_cap_mask_t *srcp) -{ -	return min_t(int, DMA_TX_TYPE_END, -		find_next_bit(srcp->bits, DMA_TX_TYPE_END, n+1)); -} -  #define dma_cap_set(tx, mask) __dma_cap_set((tx), &(mask))  static inline void  __dma_cap_set(enum dma_transaction_type tx_type, dma_cap_mask_t *dstp) @@ -891,9 +892,7 @@ __dma_has_cap(enum dma_transaction_type tx_type, dma_cap_mask_t *srcp)  }  #define for_each_dma_cap_mask(cap, mask) \ -	for ((cap) = first_dma_cap(mask);	\ -		(cap) < DMA_TX_TYPE_END;	\ -		(cap) = next_dma_cap((cap), (mask))) +	for_each_set_bit(cap, mask.bits, DMA_TX_TYPE_END)  /**   * dma_async_issue_pending - flush pending transactions to HW @@ -907,8 +906,6 @@ static inline void dma_async_issue_pending(struct dma_chan *chan)  	chan->device->device_issue_pending(chan);  } -#define dma_async_memcpy_issue_pending(chan) dma_async_issue_pending(chan) -  /**   * dma_async_is_tx_complete - poll for transaction completion   * @chan: DMA channel @@ -934,16 +931,13 @@ static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,  	return status;  } -#define dma_async_memcpy_complete(chan, cookie, last, used)\ -	dma_async_is_tx_complete(chan, cookie, last, used) -  /**   * dma_async_is_complete - test a cookie against chan state   * @cookie: transaction identifier to test status of   * @last_complete: last know completed transaction   * @last_used: last cookie value handed out   * - * dma_async_is_complete() is used in dma_async_memcpy_complete() + * dma_async_is_complete() is used in dma_async_is_tx_complete()   * the test logic is separated for lightweight testing of multiple cookies   */  static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie, @@ -974,6 +968,7 @@ enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie);  enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx);  void dma_issue_pending_all(void);  struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param); +struct dma_chan *dma_request_slave_channel(struct device *dev, char *name);  void dma_release_channel(struct dma_chan *chan);  #else  static inline enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx) @@ -988,6 +983,11 @@ static inline struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask,  {  	return NULL;  } +static inline struct dma_chan *dma_request_slave_channel(struct device *dev, +							 char *name) +{ +	return NULL; +}  static inline void dma_release_channel(struct dma_chan *chan)  {  } @@ -1001,6 +1001,22 @@ void dma_run_dependencies(struct dma_async_tx_descriptor *tx);  struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type);  struct dma_chan *net_dma_find_channel(void);  #define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y) +#define dma_request_slave_channel_compat(mask, x, y, dev, name) \ +	__dma_request_slave_channel_compat(&(mask), x, y, dev, name) + +static inline struct dma_chan +*__dma_request_slave_channel_compat(dma_cap_mask_t *mask, dma_filter_fn fn, +				  void *fn_param, struct device *dev, +				  char *name) +{ +	struct dma_chan *chan; + +	chan = dma_request_slave_channel(dev, name); +	if (chan) +		return chan; + +	return __dma_request_channel(mask, fn, fn_param); +}  /* --- Helper iov-locking functions --- */ diff --git a/include/linux/dw_apb_timer.h b/include/linux/dw_apb_timer.h index 1148575fd13..dd755ce2a5e 100644 --- a/include/linux/dw_apb_timer.h +++ b/include/linux/dw_apb_timer.h @@ -53,5 +53,5 @@ void dw_apb_clocksource_start(struct dw_apb_clocksource *dw_cs);  cycle_t dw_apb_clocksource_read(struct dw_apb_clocksource *dw_cs);  void dw_apb_clocksource_unregister(struct dw_apb_clocksource *dw_cs); -extern struct sys_timer dw_apb_timer; +extern void dw_apb_timer_init(void);  #endif /* __DW_APB_TIMER_H__ */ diff --git a/include/linux/dw_dmac.h b/include/linux/dw_dmac.h index e1c8c9e919a..481ab2345d6 100644 --- a/include/linux/dw_dmac.h +++ b/include/linux/dw_dmac.h @@ -15,14 +15,37 @@  #include <linux/dmaengine.h>  /** + * struct dw_dma_slave - Controller-specific information about a slave + * + * @dma_dev: required DMA master device. Depricated. + * @bus_id: name of this device channel, not just a device name since + *          devices may have more than one channel e.g. "foo_tx" + * @cfg_hi: Platform-specific initializer for the CFG_HI register + * @cfg_lo: Platform-specific initializer for the CFG_LO register + * @src_master: src master for transfers on allocated channel. + * @dst_master: dest master for transfers on allocated channel. + */ +struct dw_dma_slave { +	struct device		*dma_dev; +	u32			cfg_hi; +	u32			cfg_lo; +	u8			src_master; +	u8			dst_master; +}; + +/**   * struct dw_dma_platform_data - Controller configuration parameters   * @nr_channels: Number of channels supported by hardware (max 8)   * @is_private: The device channels should be marked as private and not for   *	by the general purpose DMA channel allocator. + * @chan_allocation_order: Allocate channels starting from 0 or 7 + * @chan_priority: Set channel priority increasing from 0 to 7 or 7 to 0.   * @block_size: Maximum block size supported by the controller   * @nr_masters: Number of AHB masters supported by the controller   * @data_width: Maximum data width supported by hardware per AHB master   *		(0 - 8bits, 1 - 16bits, ..., 5 - 256bits) + * @sd: slave specific data. Used for configuring channels + * @sd_count: count of slave data structures passed.   */  struct dw_dma_platform_data {  	unsigned int	nr_channels; @@ -50,23 +73,6 @@ enum dw_dma_msize {  	DW_DMA_MSIZE_256,  }; -/** - * struct dw_dma_slave - Controller-specific information about a slave - * - * @dma_dev: required DMA master device - * @cfg_hi: Platform-specific initializer for the CFG_HI register - * @cfg_lo: Platform-specific initializer for the CFG_LO register - * @src_master: src master for transfers on allocated channel. - * @dst_master: dest master for transfers on allocated channel. - */ -struct dw_dma_slave { -	struct device		*dma_dev; -	u32			cfg_hi; -	u32			cfg_lo; -	u8			src_master; -	u8			dst_master; -}; -  /* Platform-configurable bits in CFG_HI */  #define DWC_CFGH_FCMODE		(1 << 0)  #define DWC_CFGH_FIFO_MODE	(1 << 1) diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 6dd4787a798..2fe93b26b42 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -95,6 +95,17 @@ do {								\  				     ##__VA_ARGS__);		\  } while (0) +#define dynamic_hex_dump(prefix_str, prefix_type, rowsize,	\ +			 groupsize, buf, len, ascii)		\ +do {								\ +	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor,		\ +		__builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\ +	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))	\ +		print_hex_dump(KERN_DEBUG, prefix_str,		\ +			       prefix_type, rowsize, groupsize,	\ +			       buf, len, ascii);		\ +} while (0) +  #else  #include <linux/string.h> diff --git a/include/linux/ecryptfs.h b/include/linux/ecryptfs.h index 2224a8c0cb6..8d5ab998a22 100644 --- a/include/linux/ecryptfs.h +++ b/include/linux/ecryptfs.h @@ -6,9 +6,8 @@  #define ECRYPTFS_VERSION_MINOR 0x04  #define ECRYPTFS_SUPPORTED_FILE_VERSION 0x03  /* These flags indicate which features are supported by the kernel - * module; userspace tools such as the mount helper read - * ECRYPTFS_VERSIONING_MASK from a sysfs handle in order to determine - * how to behave. */ + * module; userspace tools such as the mount helper read the feature + * bits from a sysfs handle in order to determine how to behave. */  #define ECRYPTFS_VERSIONING_PASSPHRASE            0x00000001  #define ECRYPTFS_VERSIONING_PUBKEY                0x00000002  #define ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH 0x00000004 @@ -19,13 +18,6 @@  #define ECRYPTFS_VERSIONING_HMAC                  0x00000080  #define ECRYPTFS_VERSIONING_FILENAME_ENCRYPTION   0x00000100  #define ECRYPTFS_VERSIONING_GCM                   0x00000200 -#define ECRYPTFS_VERSIONING_MASK (ECRYPTFS_VERSIONING_PASSPHRASE \ -				  | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH \ -				  | ECRYPTFS_VERSIONING_PUBKEY \ -				  | ECRYPTFS_VERSIONING_XATTR \ -				  | ECRYPTFS_VERSIONING_MULTKEY \ -				  | ECRYPTFS_VERSIONING_DEVMISC \ -				  | ECRYPTFS_VERSIONING_FILENAME_ENCRYPTION)  #define ECRYPTFS_MAX_PASSWORD_LENGTH 64  #define ECRYPTFS_MAX_PASSPHRASE_BYTES ECRYPTFS_MAX_PASSWORD_LENGTH  #define ECRYPTFS_SALT_SIZE 8 diff --git a/include/linux/edac.h b/include/linux/edac.h index 1b8c02b36f7..0b763276f61 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -14,7 +14,6 @@  #include <linux/atomic.h>  #include <linux/device.h> -#include <linux/kobject.h>  #include <linux/completion.h>  #include <linux/workqueue.h>  #include <linux/debugfs.h> @@ -48,8 +47,17 @@ static inline void opstate_init(void)  	return;  } +/* Max length of a DIMM label*/  #define EDAC_MC_LABEL_LEN	31 -#define MC_PROC_NAME_MAX_LEN	7 + +/* Maximum size of the location string */ +#define LOCATION_SIZE 80 + +/* Defines the maximum number of labels that can be reported */ +#define EDAC_MAX_LABELS		8 + +/* String used to join two or more labels */ +#define OTHER_LABEL " or "  /**   * enum dev_type - describe the type of memory DRAM chips used at the stick @@ -101,8 +109,24 @@ enum hw_event_mc_err_type {  	HW_EVENT_ERR_CORRECTED,  	HW_EVENT_ERR_UNCORRECTED,  	HW_EVENT_ERR_FATAL, +	HW_EVENT_ERR_INFO,  }; +static inline char *mc_event_error_type(const unsigned int err_type) +{ +	switch (err_type) { +	case HW_EVENT_ERR_CORRECTED: +		return "Corrected"; +	case HW_EVENT_ERR_UNCORRECTED: +		return "Uncorrected"; +	case HW_EVENT_ERR_FATAL: +		return "Fatal"; +	default: +	case HW_EVENT_ERR_INFO: +		return "Info"; +	} +} +  /**   * enum mem_type - memory types. For a more detailed reference, please see   *			http://en.wikipedia.org/wiki/DRAM @@ -376,6 +400,9 @@ enum scrub_type {   * @EDAC_MC_LAYER_CHANNEL:	memory layer is named "channel"   * @EDAC_MC_LAYER_SLOT:		memory layer is named "slot"   * @EDAC_MC_LAYER_CHIP_SELECT:	memory layer is named "chip select" + * @EDAC_MC_LAYER_ALL_MEM:	memory layout is unknown. All memory is mapped + *				as a single memory area. This is used when + *				retrieving errors from a firmware driven driver.   *   * This enum is used by the drivers to tell edac_mc_sysfs what name should   * be used when describing a memory stick location. @@ -385,6 +412,7 @@ enum edac_mc_layer_type {  	EDAC_MC_LAYER_CHANNEL,  	EDAC_MC_LAYER_SLOT,  	EDAC_MC_LAYER_CHIP_SELECT, +	EDAC_MC_LAYER_ALL_MEM,  };  /** @@ -533,7 +561,6 @@ struct csrow_info {  	u32 ue_count;		/* Uncorrectable Errors for this csrow */  	u32 ce_count;		/* Correctable Errors for this csrow */ -	u32 nr_pages;		/* combined pages count of all channels */  	struct mem_ctl_info *mci;	/* the parent */ @@ -551,6 +578,46 @@ struct errcount_attribute_data {  	int layer0, layer1, layer2;  }; +/** + * edac_raw_error_desc - Raw error report structure + * @grain:			minimum granularity for an error report, in bytes + * @error_count:		number of errors of the same type + * @top_layer:			top layer of the error (layer[0]) + * @mid_layer:			middle layer of the error (layer[1]) + * @low_layer:			low layer of the error (layer[2]) + * @page_frame_number:		page where the error happened + * @offset_in_page:		page offset + * @syndrome:			syndrome of the error (or 0 if unknown or if + * 				the syndrome is not applicable) + * @msg:			error message + * @location:			location of the error + * @label:			label of the affected DIMM(s) + * @other_detail:		other driver-specific detail about the error + * @enable_per_layer_report:	if false, the error affects all layers + *				(typically, a memory controller error) + */ +struct edac_raw_error_desc { +	/* +	 * NOTE: everything before grain won't be cleaned by +	 * edac_raw_error_desc_clean() +	 */ +	char location[LOCATION_SIZE]; +	char label[(EDAC_MC_LABEL_LEN + 1 + sizeof(OTHER_LABEL)) * EDAC_MAX_LABELS]; +	long grain; + +	/* the vars below and grain will be cleaned on every new error report */ +	u16 error_count; +	int top_layer; +	int mid_layer; +	int low_layer; +	unsigned long page_frame_number; +	unsigned long offset_in_page; +	unsigned long syndrome; +	const char *msg; +	const char *other_detail; +	bool enable_per_layer_report; +}; +  /* MEMORY controller information structure   */  struct mem_ctl_info { @@ -608,11 +675,11 @@ struct mem_ctl_info {  	 * sees memory sticks ("dimms"), and the ones that sees memory ranks.  	 * All old memory controllers enumerate memories per rank, but most  	 * of the recent drivers enumerate memories per DIMM, instead. -	 * When the memory controller is per rank, mem_is_per_rank is true. +	 * When the memory controller is per rank, csbased is true.  	 */  	unsigned n_layers;  	struct edac_mc_layer *layers; -	bool mem_is_per_rank; +	bool csbased;  	/*  	 * DIMM info. Will eventually remove the entire csrows_info some day @@ -630,7 +697,6 @@ struct mem_ctl_info {  	const char *mod_ver;  	const char *ctl_name;  	const char *dev_name; -	char proc_name[MC_PROC_NAME_MAX_LEN + 1];  	void *pvt_info;  	unsigned long start_time;	/* mci load start time (in jiffies) */ @@ -659,6 +725,12 @@ struct mem_ctl_info {  	/* work struct for this MC */  	struct delayed_work work; +	/* +	 * Used to report an error - by being at the global struct +	 * makes the memory allocated by the EDAC core +	 */ +	struct edac_raw_error_desc error_desc; +  	/* the internal state of this controller instance */  	int op_state; @@ -668,8 +740,6 @@ struct mem_ctl_info {  	u32 fake_inject_ue;  	u16 fake_inject_count;  #endif -	__u8 csbased : 1,	/* csrow-based memory controller */ -	     __resv  : 7;  };  #endif diff --git a/include/linux/efi.h b/include/linux/efi.h index 7a9498ab3c2..3d7df3d32c6 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -333,6 +333,7 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,  					      unsigned long count,  					      u64 *max_size,  					      int *reset_type); +typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long size);  /*   *  EFI Configuration Table and GUID definitions @@ -575,9 +576,15 @@ extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if pos  #ifdef CONFIG_X86  extern void efi_late_init(void);  extern void efi_free_boot_services(void); +extern efi_status_t efi_query_variable_store(u32 attributes, unsigned long size);  #else  static inline void efi_late_init(void) {}  static inline void efi_free_boot_services(void) {} + +static inline efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) +{ +	return EFI_SUCCESS; +}  #endif  extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);  extern u64 efi_get_iobase (void); @@ -731,7 +738,7 @@ struct efivar_operations {  	efi_get_variable_t *get_variable;  	efi_get_next_variable_t *get_next_variable;  	efi_set_variable_t *set_variable; -	efi_query_variable_info_t *query_variable_info; +	efi_query_variable_store_t *query_variable_store;  };  struct efivars { @@ -740,7 +747,8 @@ struct efivars {  	 * 1) ->list - adds, removals, reads, writes  	 * 2) ops.[gs]et_variable() calls.  	 * It must not be held when creating sysfs entries or calling kmalloc. -	 * ops.get_next_variable() is only called from register_efivars(), +	 * ops.get_next_variable() is only called from register_efivars() +	 * or efivar_update_sysfs_entries(),  	 * which is protected by the BKL, so that path is safe.  	 */  	spinlock_t lock; diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 18662063175..acd0312d46f 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -2,6 +2,7 @@  #define _LINUX_ELEVATOR_H  #include <linux/percpu.h> +#include <linux/hashtable.h>  #ifdef CONFIG_BLOCK @@ -96,6 +97,8 @@ struct elevator_type  	struct list_head list;  }; +#define ELV_HASH_BITS 6 +  /*   * each queue has an elevator_queue associated with it   */ @@ -105,8 +108,8 @@ struct elevator_queue  	void *elevator_data;  	struct kobject kobj;  	struct mutex sysfs_lock; -	struct hlist_head *hash;  	unsigned int registered:1; +	DECLARE_HASHTABLE(hash, ELV_HASH_BITS);  };  /* diff --git a/include/linux/elf.h b/include/linux/elf.h index 8c9048e3346..40a3c0e01b2 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -10,6 +10,10 @@       Override in asm/elf.h as needed.  */  # define elf_read_implies_exec(ex, have_pt_gnu_stack)	0  #endif +#ifndef SET_PERSONALITY +#define SET_PERSONALITY(ex) \ +	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) +#endif  #if ELF_CLASS == ELFCLASS32 diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 243eea1e33d..c623861964e 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h @@ -40,6 +40,8 @@ extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh,  extern void eth_header_cache_update(struct hh_cache *hh,  				    const struct net_device *dev,  				    const unsigned char *haddr); +extern int eth_prepare_mac_addr_change(struct net_device *dev, void *p); +extern void eth_commit_mac_addr_change(struct net_device *dev, void *p);  extern int eth_mac_addr(struct net_device *dev, void *p);  extern int eth_change_mtu(struct net_device *dev, int new_mtu);  extern int eth_validate_addr(struct net_device *dev); @@ -192,7 +194,7 @@ static inline void eth_zero_addr(u8 *addr)   */  static inline void eth_hw_addr_random(struct net_device *dev)  { -	dev->addr_assign_type |= NET_ADDR_RANDOM; +	dev->addr_assign_type = NET_ADDR_RANDOM;  	eth_random_addr(dev->dev_addr);  } diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h index 3c3ef19a625..cf5d2af61b8 100644 --- a/include/linux/eventfd.h +++ b/include/linux/eventfd.h @@ -13,7 +13,7 @@  #include <linux/wait.h>  /* - * CAREFUL: Check include/asm-generic/fcntl.h when defining + * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining   * new flags, since they might collide with O_* ones. We want   * to re-use O_* flags that couldn't possibly have a meaning   * from eventfd, in order to leave a free define-space for diff --git a/include/linux/extcon/extcon_gpio.h b/include/linux/extcon/extcon-gpio.h index 2d8307f7d67..2d8307f7d67 100644 --- a/include/linux/extcon/extcon_gpio.h +++ b/include/linux/extcon/extcon-gpio.h diff --git a/include/linux/fb.h b/include/linux/fb.h index c7a95714b1f..58b98606ac2 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -19,6 +19,8 @@ struct vm_area_struct;  struct fb_info;  struct device;  struct file; +struct videomode; +struct device_node;  /* Definitions below are used in the parsed monitor specs */  #define FB_DPMS_ACTIVE_OFF	1 @@ -714,6 +716,12 @@ extern void fb_destroy_modedb(struct fb_videomode *modedb);  extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb);  extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter); +extern int of_get_fb_videomode(struct device_node *np, +			       struct fb_videomode *fb, +			       int index); +extern int fb_videomode_from_videomode(const struct videomode *vm, +				       struct fb_videomode *fbmode); +  /* drivers/video/modedb.c */  #define VESA_MODEDB_SIZE 34  extern void fb_var_to_videomode(struct fb_videomode *mode, diff --git a/include/linux/firmware-map.h b/include/linux/firmware-map.h index 43fe52fcef0..71d4fa721db 100644 --- a/include/linux/firmware-map.h +++ b/include/linux/firmware-map.h @@ -25,6 +25,7 @@  int firmware_map_add_early(u64 start, u64 end, const char *type);  int firmware_map_add_hotplug(u64 start, u64 end, const char *type); +int firmware_map_remove(u64 start, u64 end, const char *type);  #else /* CONFIG_FIRMWARE_MEMMAP */ @@ -38,6 +39,11 @@ static inline int firmware_map_add_hotplug(u64 start, u64 end, const char *type)  	return 0;  } +static inline int firmware_map_remove(u64 start, u64 end, const char *type) +{ +	return 0; +} +  #endif /* CONFIG_FIRMWARE_MEMMAP */  #endif /* _LINUX_FIRMWARE_MAP_H */ diff --git a/include/linux/freezer.h b/include/linux/freezer.h index e4238ceaa4d..e70df40d84f 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -13,6 +13,11 @@ extern bool pm_freezing;		/* PM freezing in effect */  extern bool pm_nosig_freezing;		/* PM nosig freezing in effect */  /* + * Timeout for stopping processes + */ +extern unsigned int freeze_timeout_msecs; + +/*   * Check if a process has been frozen   */  static inline bool frozen(struct task_struct *p) diff --git a/include/linux/fs.h b/include/linux/fs.h index 7617ee04f06..2c28271ab9d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -301,7 +301,7 @@ size_t iov_iter_copy_from_user(struct page *page,  		struct iov_iter *i, unsigned long offset, size_t bytes);  void iov_iter_advance(struct iov_iter *i, size_t bytes);  int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); -size_t iov_iter_single_seg_count(struct iov_iter *i); +size_t iov_iter_single_seg_count(const struct iov_iter *i);  static inline void iov_iter_init(struct iov_iter *i,  			const struct iovec *iov, unsigned long nr_segs, @@ -769,7 +769,7 @@ struct file {  	} f_u;  	struct path		f_path;  #define f_dentry	f_path.dentry -#define f_vfsmnt	f_path.mnt +	struct inode		*f_inode;	/* cached value */  	const struct file_operations	*f_op;  	/* @@ -1807,7 +1807,6 @@ struct file_system_type {  #define FS_HAS_SUBTYPE		4  #define FS_USERNS_MOUNT		8	/* Can be mounted by userns root */  #define FS_USERNS_DEV_MOUNT	16 /* A userns mount does not imply MNT_NODEV */ -#define FS_REVAL_DOT		16384	/* Check the paths ".", ".." for staleness */  #define FS_RENAME_DOES_D_MOVE	32768	/* FS will handle d_move() during rename() internally. */  	struct dentry *(*mount) (struct file_system_type *, int,  		       const char *, void *); @@ -1826,6 +1825,8 @@ struct file_system_type {  	struct lock_class_key i_mutex_dir_key;  }; +#define MODULE_ALIAS_FS(NAME) MODULE_ALIAS("fs-" NAME) +  extern struct dentry *mount_ns(struct file_system_type *fs_type, int flags,  	void *data, int (*fill_super)(struct super_block *, void *, int));  extern struct dentry *mount_bdev(struct file_system_type *fs_type, @@ -2217,6 +2218,11 @@ static inline bool execute_ok(struct inode *inode)  	return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);  } +static inline struct inode *file_inode(struct file *f) +{ +	return f->f_inode; +} +  /*   * get_write_access() gets write permission for a file.   * put_write_access() releases this write permission. @@ -2239,7 +2245,7 @@ static inline int get_write_access(struct inode *inode)  }  static inline int deny_write_access(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	return atomic_dec_unless_positive(&inode->i_writecount) ? 0 : -ETXTBSY;  }  static inline void put_write_access(struct inode * inode) @@ -2249,7 +2255,7 @@ static inline void put_write_access(struct inode * inode)  static inline void allow_write_access(struct file *file)  {  	if (file) -		atomic_inc(&file->f_path.dentry->d_inode->i_writecount); +		atomic_inc(&file_inode(file)->i_writecount);  }  #ifdef CONFIG_IMA  static inline void i_readcount_dec(struct inode *inode) @@ -2274,6 +2280,7 @@ static inline void i_readcount_inc(struct inode *inode)  extern int do_pipe_flags(int *, int);  extern int kernel_read(struct file *, loff_t, char *, unsigned long); +extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t);  extern struct file * open_exec(const char *);  /* fs/dcache.c -- generic fs support functions */ @@ -2463,7 +2470,7 @@ extern int page_symlink(struct inode *inode, const char *symname, int len);  extern const struct inode_operations page_symlink_inode_operations;  extern int generic_readlink(struct dentry *, char __user *, int);  extern void generic_fillattr(struct inode *, struct kstat *); -extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); +extern int vfs_getattr(struct path *, struct kstat *);  void __inode_add_bytes(struct inode *inode, loff_t bytes);  void inode_add_bytes(struct inode *inode, loff_t bytes);  void inode_sub_bytes(struct inode *inode, loff_t bytes); diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index d0ae3a84bcf..2b93a9a5a1e 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h @@ -17,8 +17,8 @@ struct fs_struct {  extern struct kmem_cache *fs_cachep;  extern void exit_fs(struct task_struct *); -extern void set_fs_root(struct fs_struct *, struct path *); -extern void set_fs_pwd(struct fs_struct *, struct path *); +extern void set_fs_root(struct fs_struct *, const struct path *); +extern void set_fs_pwd(struct fs_struct *, const struct path *);  extern struct fs_struct *copy_fs_struct(struct fs_struct *);  extern void free_fs_struct(struct fs_struct *);  extern int unshare_fs_struct(void); @@ -50,4 +50,6 @@ static inline void get_fs_root_and_pwd(struct fs_struct *fs, struct path *root,  	spin_unlock(&fs->lock);  } +extern bool current_chrooted(void); +  #endif /* _LINUX_FS_STRUCT_H */ diff --git a/include/linux/fsl/bestcomm/ata.h b/include/linux/fsl/bestcomm/ata.h new file mode 100644 index 00000000000..0b237181133 --- /dev/null +++ b/include/linux/fsl/bestcomm/ata.h @@ -0,0 +1,30 @@ +/* + * Header for Bestcomm ATA task driver + * + * + * Copyright (C) 2006 Freescale - John Rigby + * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com> + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#ifndef __BESTCOMM_ATA_H__ +#define __BESTCOMM_ATA_H__ + + +struct bcom_ata_bd { +	u32	status; +	u32	src_pa; +	u32	dst_pa; +}; + +extern struct bcom_task * bcom_ata_init(int queue_len, int maxbufsize); +extern void bcom_ata_rx_prepare(struct bcom_task *tsk); +extern void bcom_ata_tx_prepare(struct bcom_task *tsk); +extern void bcom_ata_reset_bd(struct bcom_task *tsk); +extern void bcom_ata_release(struct bcom_task *tsk); + +#endif /* __BESTCOMM_ATA_H__ */ + diff --git a/include/linux/fsl/bestcomm/bestcomm.h b/include/linux/fsl/bestcomm/bestcomm.h new file mode 100644 index 00000000000..a0e2e6b19b5 --- /dev/null +++ b/include/linux/fsl/bestcomm/bestcomm.h @@ -0,0 +1,213 @@ +/* + * Public header for the MPC52xx processor BestComm driver + * + * + * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com> + * Copyright (C) 2005      Varma Electronics Oy, + *                         ( by Andrey Volkov <avolkov@varma-el.com> ) + * Copyright (C) 2003-2004 MontaVista, Software, Inc. + *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> ) + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#ifndef __BESTCOMM_H__ +#define __BESTCOMM_H__ + +/** + * struct bcom_bd - Structure describing a generic BestComm buffer descriptor + * @status: The current status of this buffer. Exact meaning depends on the + *          task type + * @data: An array of u32 extra data.  Size of array is task dependent. + * + * Note: Don't dereference a bcom_bd pointer as an array.  The size of the + *       bcom_bd is variable.  Use bcom_get_bd() instead. + */ +struct bcom_bd { +	u32	status; +	u32	data[0];	/* variable payload size */ +}; + +/* ======================================================================== */ +/* Generic task management                                                   */ +/* ======================================================================== */ + +/** + * struct bcom_task - Structure describing a loaded BestComm task + * + * This structure is never built by the driver it self. It's built and + * filled the intermediate layer of the BestComm API, the task dependent + * support code. + * + * Most likely you don't need to poke around inside this structure. The + * fields are exposed in the header just for the sake of inline functions + */ +struct bcom_task { +	unsigned int	tasknum; +	unsigned int	flags; +	int		irq; + +	struct bcom_bd	*bd; +	phys_addr_t	bd_pa; +	void		**cookie; +	unsigned short	index; +	unsigned short	outdex; +	unsigned int	num_bd; +	unsigned int	bd_size; + +	void*		priv; +}; + +#define BCOM_FLAGS_NONE         0x00000000ul +#define BCOM_FLAGS_ENABLE_TASK  (1ul <<  0) + +/** + * bcom_enable - Enable a BestComm task + * @tsk: The BestComm task structure + * + * This function makes sure the given task is enabled and can be run + * by the BestComm engine as needed + */ +extern void bcom_enable(struct bcom_task *tsk); + +/** + * bcom_disable - Disable a BestComm task + * @tsk: The BestComm task structure + * + * This function disable a given task, making sure it's not executed + * by the BestComm engine. + */ +extern void bcom_disable(struct bcom_task *tsk); + + +/** + * bcom_get_task_irq - Returns the irq number of a BestComm task + * @tsk: The BestComm task structure + */ +static inline int +bcom_get_task_irq(struct bcom_task *tsk) { +	return tsk->irq; +} + +/* ======================================================================== */ +/* BD based tasks helpers                                                   */ +/* ======================================================================== */ + +#define BCOM_BD_READY	0x40000000ul + +/** _bcom_next_index - Get next input index. + * @tsk: pointer to task structure + * + * Support function; Device drivers should not call this + */ +static inline int +_bcom_next_index(struct bcom_task *tsk) +{ +	return ((tsk->index + 1) == tsk->num_bd) ? 0 : tsk->index + 1; +} + +/** _bcom_next_outdex - Get next output index. + * @tsk: pointer to task structure + * + * Support function; Device drivers should not call this + */ +static inline int +_bcom_next_outdex(struct bcom_task *tsk) +{ +	return ((tsk->outdex + 1) == tsk->num_bd) ? 0 : tsk->outdex + 1; +} + +/** + * bcom_queue_empty - Checks if a BestComm task BD queue is empty + * @tsk: The BestComm task structure + */ +static inline int +bcom_queue_empty(struct bcom_task *tsk) +{ +	return tsk->index == tsk->outdex; +} + +/** + * bcom_queue_full - Checks if a BestComm task BD queue is full + * @tsk: The BestComm task structure + */ +static inline int +bcom_queue_full(struct bcom_task *tsk) +{ +	return tsk->outdex == _bcom_next_index(tsk); +} + +/** + * bcom_get_bd - Get a BD from the queue + * @tsk: The BestComm task structure + * index: Index of the BD to fetch + */ +static inline struct bcom_bd +*bcom_get_bd(struct bcom_task *tsk, unsigned int index) +{ +	/* A cast to (void*) so the address can be incremented by the +	 * real size instead of by sizeof(struct bcom_bd) */ +	return ((void *)tsk->bd) + (index * tsk->bd_size); +} + +/** + * bcom_buffer_done - Checks if a BestComm  + * @tsk: The BestComm task structure + */ +static inline int +bcom_buffer_done(struct bcom_task *tsk) +{ +	struct bcom_bd *bd; +	if (bcom_queue_empty(tsk)) +		return 0; + +	bd = bcom_get_bd(tsk, tsk->outdex); +	return !(bd->status & BCOM_BD_READY); +} + +/** + * bcom_prepare_next_buffer - clear status of next available buffer. + * @tsk: The BestComm task structure + * + * Returns pointer to next buffer descriptor + */ +static inline struct bcom_bd * +bcom_prepare_next_buffer(struct bcom_task *tsk) +{ +	struct bcom_bd *bd; + +	bd = bcom_get_bd(tsk, tsk->index); +	bd->status = 0;	/* cleanup last status */ +	return bd; +} + +static inline void +bcom_submit_next_buffer(struct bcom_task *tsk, void *cookie) +{ +	struct bcom_bd *bd = bcom_get_bd(tsk, tsk->index); + +	tsk->cookie[tsk->index] = cookie; +	mb();	/* ensure the bd is really up-to-date */ +	bd->status |= BCOM_BD_READY; +	tsk->index = _bcom_next_index(tsk); +	if (tsk->flags & BCOM_FLAGS_ENABLE_TASK) +		bcom_enable(tsk); +} + +static inline void * +bcom_retrieve_buffer(struct bcom_task *tsk, u32 *p_status, struct bcom_bd **p_bd) +{ +	void *cookie = tsk->cookie[tsk->outdex]; +	struct bcom_bd *bd = bcom_get_bd(tsk, tsk->outdex); + +	if (p_status) +		*p_status = bd->status; +	if (p_bd) +		*p_bd = bd; +	tsk->outdex = _bcom_next_outdex(tsk); +	return cookie; +} + +#endif /* __BESTCOMM_H__ */ diff --git a/include/linux/fsl/bestcomm/bestcomm_priv.h b/include/linux/fsl/bestcomm/bestcomm_priv.h new file mode 100644 index 00000000000..3b52f3ffbdf --- /dev/null +++ b/include/linux/fsl/bestcomm/bestcomm_priv.h @@ -0,0 +1,350 @@ +/* + * Private header for the MPC52xx processor BestComm driver + * + * By private, we mean that driver should not use it directly. It's meant + * to be used by the BestComm engine driver itself and by the intermediate + * layer between the core and the drivers. + * + * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com> + * Copyright (C) 2005      Varma Electronics Oy, + *                         ( by Andrey Volkov <avolkov@varma-el.com> ) + * Copyright (C) 2003-2004 MontaVista, Software, Inc. + *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> ) + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#ifndef __BESTCOMM_PRIV_H__ +#define __BESTCOMM_PRIV_H__ + +#include <linux/spinlock.h> +#include <linux/of.h> +#include <asm/io.h> +#include <asm/mpc52xx.h> + +#include "sram.h" + + +/* ======================================================================== */ +/* Engine related stuff                                                     */ +/* ======================================================================== */ + +/* Zones sizes and needed alignments */ +#define BCOM_MAX_TASKS		16 +#define BCOM_MAX_VAR		24 +#define BCOM_MAX_INC		8 +#define BCOM_MAX_FDT		64 +#define BCOM_MAX_CTX		20 +#define BCOM_CTX_SIZE		(BCOM_MAX_CTX * sizeof(u32)) +#define BCOM_CTX_ALIGN		0x100 +#define BCOM_VAR_SIZE		(BCOM_MAX_VAR * sizeof(u32)) +#define BCOM_INC_SIZE		(BCOM_MAX_INC * sizeof(u32)) +#define BCOM_VAR_ALIGN		0x80 +#define BCOM_FDT_SIZE		(BCOM_MAX_FDT * sizeof(u32)) +#define BCOM_FDT_ALIGN		0x100 + +/** + * struct bcom_tdt - Task Descriptor Table Entry + * + */ +struct bcom_tdt { +	u32 start; +	u32 stop; +	u32 var; +	u32 fdt; +	u32 exec_status;	/* used internally by BestComm engine */ +	u32 mvtp;		/* used internally by BestComm engine */ +	u32 context; +	u32 litbase; +}; + +/** + * struct bcom_engine + * + * This holds all info needed globaly to handle the engine + */ +struct bcom_engine { +	struct device_node		*ofnode; +	struct mpc52xx_sdma __iomem     *regs; +	phys_addr_t                      regs_base; + +	struct bcom_tdt			*tdt; +	u32				*ctx; +	u32				*var; +	u32				*fdt; + +	spinlock_t			lock; +}; + +extern struct bcom_engine *bcom_eng; + + +/* ======================================================================== */ +/* Tasks related stuff                                                      */ +/* ======================================================================== */ + +/* Tasks image header */ +#define BCOM_TASK_MAGIC		0x4243544B	/* 'BCTK' */ + +struct bcom_task_header { +	u32	magic; +	u8	desc_size;	/* the size fields     */ +	u8	var_size;	/* are given in number */ +	u8	inc_size;	/* of 32-bits words    */ +	u8	first_var; +	u8	reserved[8]; +}; + +/* Descriptors structure & co */ +#define BCOM_DESC_NOP		0x000001f8 +#define BCOM_LCD_MASK		0x80000000 +#define BCOM_DRD_EXTENDED	0x40000000 +#define BCOM_DRD_INITIATOR_SHIFT	21 + +/* Tasks pragma */ +#define BCOM_PRAGMA_BIT_RSV		7	/* reserved pragma bit */ +#define BCOM_PRAGMA_BIT_PRECISE_INC	6	/* increment 0=when possible, */ +						/*           1=iter end */ +#define BCOM_PRAGMA_BIT_RST_ERROR_NO	5	/* don't reset errors on */ +						/* task enable */ +#define BCOM_PRAGMA_BIT_PACK		4	/* pack data enable */ +#define BCOM_PRAGMA_BIT_INTEGER		3	/* data alignment */ +						/* 0=frac(msb), 1=int(lsb) */ +#define BCOM_PRAGMA_BIT_SPECREAD	2	/* XLB speculative read */ +#define BCOM_PRAGMA_BIT_CW		1	/* write line buffer enable */ +#define BCOM_PRAGMA_BIT_RL		0	/* read line buffer enable */ + +	/* Looks like XLB speculative read generates XLB errors when a buffer +	 * is at the end of the physical memory. i.e. when accessing the +	 * lasts words, the engine tries to prefetch the next but there is no +	 * next ... +	 */ +#define BCOM_STD_PRAGMA		((0 << BCOM_PRAGMA_BIT_RSV)		| \ +				 (0 << BCOM_PRAGMA_BIT_PRECISE_INC)	| \ +				 (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)	| \ +				 (0 << BCOM_PRAGMA_BIT_PACK)		| \ +				 (0 << BCOM_PRAGMA_BIT_INTEGER)		| \ +				 (0 << BCOM_PRAGMA_BIT_SPECREAD)	| \ +				 (1 << BCOM_PRAGMA_BIT_CW)		| \ +				 (1 << BCOM_PRAGMA_BIT_RL)) + +#define BCOM_PCI_PRAGMA		((0 << BCOM_PRAGMA_BIT_RSV)		| \ +				 (0 << BCOM_PRAGMA_BIT_PRECISE_INC)	| \ +				 (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)	| \ +				 (0 << BCOM_PRAGMA_BIT_PACK)		| \ +				 (1 << BCOM_PRAGMA_BIT_INTEGER)		| \ +				 (0 << BCOM_PRAGMA_BIT_SPECREAD)	| \ +				 (1 << BCOM_PRAGMA_BIT_CW)		| \ +				 (1 << BCOM_PRAGMA_BIT_RL)) + +#define BCOM_ATA_PRAGMA		BCOM_STD_PRAGMA +#define BCOM_CRC16_DP_0_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_CRC16_DP_1_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_FEC_RX_BD_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_FEC_TX_BD_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_0_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_1_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_2_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_3_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_BD_0_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_DP_BD_1_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_RX_BD_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_TX_BD_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_GEN_LPC_PRAGMA	BCOM_STD_PRAGMA +#define BCOM_PCI_RX_PRAGMA	BCOM_PCI_PRAGMA +#define BCOM_PCI_TX_PRAGMA	BCOM_PCI_PRAGMA + +/* Initiators number */ +#define BCOM_INITIATOR_ALWAYS	 0 +#define BCOM_INITIATOR_SCTMR_0	 1 +#define BCOM_INITIATOR_SCTMR_1	 2 +#define BCOM_INITIATOR_FEC_RX	 3 +#define BCOM_INITIATOR_FEC_TX	 4 +#define BCOM_INITIATOR_ATA_RX	 5 +#define BCOM_INITIATOR_ATA_TX	 6 +#define BCOM_INITIATOR_SCPCI_RX	 7 +#define BCOM_INITIATOR_SCPCI_TX	 8 +#define BCOM_INITIATOR_PSC3_RX	 9 +#define BCOM_INITIATOR_PSC3_TX	10 +#define BCOM_INITIATOR_PSC2_RX	11 +#define BCOM_INITIATOR_PSC2_TX	12 +#define BCOM_INITIATOR_PSC1_RX	13 +#define BCOM_INITIATOR_PSC1_TX	14 +#define BCOM_INITIATOR_SCTMR_2	15 +#define BCOM_INITIATOR_SCLPC	16 +#define BCOM_INITIATOR_PSC5_RX	17 +#define BCOM_INITIATOR_PSC5_TX	18 +#define BCOM_INITIATOR_PSC4_RX	19 +#define BCOM_INITIATOR_PSC4_TX	20 +#define BCOM_INITIATOR_I2C2_RX	21 +#define BCOM_INITIATOR_I2C2_TX	22 +#define BCOM_INITIATOR_I2C1_RX	23 +#define BCOM_INITIATOR_I2C1_TX	24 +#define BCOM_INITIATOR_PSC6_RX	25 +#define BCOM_INITIATOR_PSC6_TX	26 +#define BCOM_INITIATOR_IRDA_RX	25 +#define BCOM_INITIATOR_IRDA_TX	26 +#define BCOM_INITIATOR_SCTMR_3	27 +#define BCOM_INITIATOR_SCTMR_4	28 +#define BCOM_INITIATOR_SCTMR_5	29 +#define BCOM_INITIATOR_SCTMR_6	30 +#define BCOM_INITIATOR_SCTMR_7	31 + +/* Initiators priorities */ +#define BCOM_IPR_ALWAYS		7 +#define BCOM_IPR_SCTMR_0	2 +#define BCOM_IPR_SCTMR_1	2 +#define BCOM_IPR_FEC_RX		6 +#define BCOM_IPR_FEC_TX		5 +#define BCOM_IPR_ATA_RX		7 +#define BCOM_IPR_ATA_TX		7 +#define BCOM_IPR_SCPCI_RX	2 +#define BCOM_IPR_SCPCI_TX	2 +#define BCOM_IPR_PSC3_RX	2 +#define BCOM_IPR_PSC3_TX	2 +#define BCOM_IPR_PSC2_RX	2 +#define BCOM_IPR_PSC2_TX	2 +#define BCOM_IPR_PSC1_RX	2 +#define BCOM_IPR_PSC1_TX	2 +#define BCOM_IPR_SCTMR_2	2 +#define BCOM_IPR_SCLPC		2 +#define BCOM_IPR_PSC5_RX	2 +#define BCOM_IPR_PSC5_TX	2 +#define BCOM_IPR_PSC4_RX	2 +#define BCOM_IPR_PSC4_TX	2 +#define BCOM_IPR_I2C2_RX	2 +#define BCOM_IPR_I2C2_TX	2 +#define BCOM_IPR_I2C1_RX	2 +#define BCOM_IPR_I2C1_TX	2 +#define BCOM_IPR_PSC6_RX	2 +#define BCOM_IPR_PSC6_TX	2 +#define BCOM_IPR_IRDA_RX	2 +#define BCOM_IPR_IRDA_TX	2 +#define BCOM_IPR_SCTMR_3	2 +#define BCOM_IPR_SCTMR_4	2 +#define BCOM_IPR_SCTMR_5	2 +#define BCOM_IPR_SCTMR_6	2 +#define BCOM_IPR_SCTMR_7	2 + + +/* ======================================================================== */ +/* API                                                                      */ +/* ======================================================================== */ + +extern struct bcom_task *bcom_task_alloc(int bd_count, int bd_size, int priv_size); +extern void bcom_task_free(struct bcom_task *tsk); +extern int bcom_load_image(int task, u32 *task_image); +extern void bcom_set_initiator(int task, int initiator); + + +#define TASK_ENABLE             0x8000 + +/** + * bcom_disable_prefetch - Hook to disable bus prefetching + * + * ATA DMA and the original MPC5200 need this due to silicon bugs.  At the + * moment disabling prefetch is a one-way street.  There is no mechanism + * in place to turn prefetch back on after it has been disabled.  There is + * no reason it couldn't be done, it would just be more complex to implement. + */ +static inline void bcom_disable_prefetch(void) +{ +	u16 regval; + +	regval = in_be16(&bcom_eng->regs->PtdCntrl); +	out_be16(&bcom_eng->regs->PtdCntrl, regval | 1); +}; + +static inline void +bcom_enable_task(int task) +{ +        u16 reg; +        reg = in_be16(&bcom_eng->regs->tcr[task]); +        out_be16(&bcom_eng->regs->tcr[task],  reg | TASK_ENABLE); +} + +static inline void +bcom_disable_task(int task) +{ +        u16 reg = in_be16(&bcom_eng->regs->tcr[task]); +        out_be16(&bcom_eng->regs->tcr[task], reg & ~TASK_ENABLE); +} + + +static inline u32 * +bcom_task_desc(int task) +{ +	return bcom_sram_pa2va(bcom_eng->tdt[task].start); +} + +static inline int +bcom_task_num_descs(int task) +{ +	return (bcom_eng->tdt[task].stop - bcom_eng->tdt[task].start)/sizeof(u32) + 1; +} + +static inline u32 * +bcom_task_var(int task) +{ +	return bcom_sram_pa2va(bcom_eng->tdt[task].var); +} + +static inline u32 * +bcom_task_inc(int task) +{ +	return &bcom_task_var(task)[BCOM_MAX_VAR]; +} + + +static inline int +bcom_drd_is_extended(u32 desc) +{ +	return (desc) & BCOM_DRD_EXTENDED; +} + +static inline int +bcom_desc_is_drd(u32 desc) +{ +	return !(desc & BCOM_LCD_MASK) && desc != BCOM_DESC_NOP; +} + +static inline int +bcom_desc_initiator(u32 desc) +{ +	return (desc >> BCOM_DRD_INITIATOR_SHIFT) & 0x1f; +} + +static inline void +bcom_set_desc_initiator(u32 *desc, int initiator) +{ +	*desc = (*desc & ~(0x1f << BCOM_DRD_INITIATOR_SHIFT)) | +			((initiator & 0x1f) << BCOM_DRD_INITIATOR_SHIFT); +} + + +static inline void +bcom_set_task_pragma(int task, int pragma) +{ +	u32 *fdt = &bcom_eng->tdt[task].fdt; +	*fdt = (*fdt & ~0xff) | pragma; +} + +static inline void +bcom_set_task_auto_start(int task, int next_task) +{ +	u16 __iomem *tcr = &bcom_eng->regs->tcr[task]; +	out_be16(tcr, (in_be16(tcr) & ~0xff) | 0x00c0 | next_task); +} + +static inline void +bcom_set_tcr_initiator(int task, int initiator) +{ +	u16 __iomem *tcr = &bcom_eng->regs->tcr[task]; +	out_be16(tcr, (in_be16(tcr) & ~0x1f00) | ((initiator & 0x1f) << 8)); +} + + +#endif /* __BESTCOMM_PRIV_H__ */ + diff --git a/include/linux/fsl/bestcomm/fec.h b/include/linux/fsl/bestcomm/fec.h new file mode 100644 index 00000000000..ee565d94d50 --- /dev/null +++ b/include/linux/fsl/bestcomm/fec.h @@ -0,0 +1,61 @@ +/* + * Header for Bestcomm FEC tasks driver + * + * + * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com> + * Copyright (C) 2003-2004 MontaVista, Software, Inc. + *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> ) + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#ifndef __BESTCOMM_FEC_H__ +#define __BESTCOMM_FEC_H__ + + +struct bcom_fec_bd { +	u32	status; +	u32	skb_pa; +}; + +#define BCOM_FEC_TX_BD_TFD	0x08000000ul	/* transmit frame done */ +#define BCOM_FEC_TX_BD_TC	0x04000000ul	/* transmit CRC */ +#define BCOM_FEC_TX_BD_ABC	0x02000000ul	/* append bad CRC */ + +#define BCOM_FEC_RX_BD_L	0x08000000ul	/* buffer is last in frame */ +#define BCOM_FEC_RX_BD_BC	0x00800000ul	/* DA is broadcast */ +#define BCOM_FEC_RX_BD_MC	0x00400000ul	/* DA is multicast and not broadcast */ +#define BCOM_FEC_RX_BD_LG	0x00200000ul	/* Rx frame length violation */ +#define BCOM_FEC_RX_BD_NO	0x00100000ul	/* Rx non-octet aligned frame */ +#define BCOM_FEC_RX_BD_CR	0x00040000ul	/* Rx CRC error */ +#define BCOM_FEC_RX_BD_OV	0x00020000ul	/* overrun */ +#define BCOM_FEC_RX_BD_TR	0x00010000ul	/* Rx frame truncated */ +#define BCOM_FEC_RX_BD_LEN_MASK	0x000007fful	/* mask for length of received frame */ +#define BCOM_FEC_RX_BD_ERRORS	(BCOM_FEC_RX_BD_LG | BCOM_FEC_RX_BD_NO | \ +		BCOM_FEC_RX_BD_CR | BCOM_FEC_RX_BD_OV | BCOM_FEC_RX_BD_TR) + + +extern struct bcom_task * +bcom_fec_rx_init(int queue_len, phys_addr_t fifo, int maxbufsize); + +extern int +bcom_fec_rx_reset(struct bcom_task *tsk); + +extern void +bcom_fec_rx_release(struct bcom_task *tsk); + + +extern struct bcom_task * +bcom_fec_tx_init(int queue_len, phys_addr_t fifo); + +extern int +bcom_fec_tx_reset(struct bcom_task *tsk); + +extern void +bcom_fec_tx_release(struct bcom_task *tsk); + + +#endif /* __BESTCOMM_FEC_H__ */ + diff --git a/include/linux/fsl/bestcomm/gen_bd.h b/include/linux/fsl/bestcomm/gen_bd.h new file mode 100644 index 00000000000..de47260e69d --- /dev/null +++ b/include/linux/fsl/bestcomm/gen_bd.h @@ -0,0 +1,53 @@ +/* + * Header for Bestcomm General Buffer Descriptor tasks driver + * + * + * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com> + * Copyright (C) 2006 AppSpec Computer Technologies Corp. + *                    Jeff Gibbons <jeff.gibbons@appspec.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 __BESTCOMM_GEN_BD_H__ +#define __BESTCOMM_GEN_BD_H__ + +struct bcom_gen_bd { +	u32	status; +	u32	buf_pa; +}; + + +extern struct bcom_task * +bcom_gen_bd_rx_init(int queue_len, phys_addr_t fifo, +			int initiator, int ipr, int maxbufsize); + +extern int +bcom_gen_bd_rx_reset(struct bcom_task *tsk); + +extern void +bcom_gen_bd_rx_release(struct bcom_task *tsk); + + +extern struct bcom_task * +bcom_gen_bd_tx_init(int queue_len, phys_addr_t fifo, +			int initiator, int ipr); + +extern int +bcom_gen_bd_tx_reset(struct bcom_task *tsk); + +extern void +bcom_gen_bd_tx_release(struct bcom_task *tsk); + + +/* PSC support utility wrappers */ +struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len, +					   phys_addr_t fifo, int maxbufsize); +struct bcom_task * bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len, +					   phys_addr_t fifo); +#endif  /* __BESTCOMM_GEN_BD_H__ */ + diff --git a/include/linux/fsl/bestcomm/sram.h b/include/linux/fsl/bestcomm/sram.h new file mode 100644 index 00000000000..b6d668963cc --- /dev/null +++ b/include/linux/fsl/bestcomm/sram.h @@ -0,0 +1,54 @@ +/* + * Handling of a sram zone for bestcomm + * + * + * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com> + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#ifndef __BESTCOMM_SRAM_H__ +#define __BESTCOMM_SRAM_H__ + +#include <asm/rheap.h> +#include <asm/mmu.h> +#include <linux/spinlock.h> + + +/* Structure used internally */ +	/* The internals are here for the inline functions +	 * sake, certainly not for the user to mess with ! +	 */ +struct bcom_sram { +	phys_addr_t		 base_phys; +	void 			*base_virt; +	unsigned int		 size; +	rh_info_t		*rh; +	spinlock_t		 lock; +}; + +extern struct bcom_sram *bcom_sram; + + +/* Public API */ +extern int  bcom_sram_init(struct device_node *sram_node, char *owner); +extern void bcom_sram_cleanup(void); + +extern void* bcom_sram_alloc(int size, int align, phys_addr_t *phys); +extern void  bcom_sram_free(void *ptr); + +static inline phys_addr_t bcom_sram_va2pa(void *va) { +	return bcom_sram->base_phys + +		(unsigned long)(va - bcom_sram->base_virt); +} + +static inline void *bcom_sram_pa2va(phys_addr_t pa) { +	return bcom_sram->base_virt + +		(unsigned long)(pa - bcom_sram->base_phys); +} + + +#endif  /* __BESTCOMM_SRAM_H__ */ + diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 0fbfb4646d1..a78680a92db 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -244,7 +244,7 @@ static inline void fsnotify_open(struct file *file)  static inline void fsnotify_close(struct file *file)  {  	struct path *path = &file->f_path; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	fmode_t mode = file->f_mode;  	__u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 832422d706f..f83e17a40e8 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -89,6 +89,7 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,   *            that the call back has its own recursion protection. If it does   *            not set this, then the ftrace infrastructure will add recursion   *            protection for the caller. + * STUB   - The ftrace_ops is just a place holder.   */  enum {  	FTRACE_OPS_FL_ENABLED			= 1 << 0, @@ -98,6 +99,7 @@ enum {  	FTRACE_OPS_FL_SAVE_REGS			= 1 << 4,  	FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED	= 1 << 5,  	FTRACE_OPS_FL_RECURSION_SAFE		= 1 << 6, +	FTRACE_OPS_FL_STUB			= 1 << 7,  };  struct ftrace_ops { @@ -396,7 +398,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,  			    size_t cnt, loff_t *ppos);  ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,  			     size_t cnt, loff_t *ppos); -loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int whence);  int ftrace_regex_release(struct inode *inode, struct file *file);  void __init @@ -569,6 +570,8 @@ static inline int  ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }  #endif /* CONFIG_DYNAMIC_FTRACE */ +loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); +  /* totally disable ftrace - can not re-enable after this */  void ftrace_kill(void); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 79b8bba1936..9f3c275e053 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -231,6 +231,12 @@ static inline void part_pack_uuid(const u8 *uuid_str, u8 *to)  	}  } +static inline int blk_part_pack_uuid(const u8 *uuid_str, u8 *to) +{ +	part_pack_uuid(uuid_str, to); +	return 0; +} +  static inline int disk_max_parts(struct gendisk *disk)  {  	if (disk->flags & GENHD_FL_EXT_DEVT) @@ -718,6 +724,10 @@ static inline dev_t blk_lookup_devt(const char *name, int partno)  	return devt;  } +static inline int blk_part_pack_uuid(const u8 *uuid_str, u8 *to) +{ +	return -EINVAL; +}  #endif /* CONFIG_BLOCK */  #endif /* _LINUX_GENHD_H */ diff --git a/include/linux/gpio.h b/include/linux/gpio.h index bfe66562153..f6c7ae3e223 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h @@ -94,24 +94,12 @@ static inline int gpio_request(unsigned gpio, const char *label)  	return -ENOSYS;  } -static inline int devm_gpio_request(struct device *dev, unsigned gpio, -				    const char *label) -{ -	return -ENOSYS; -} -  static inline int gpio_request_one(unsigned gpio,  					unsigned long flags, const char *label)  {  	return -ENOSYS;  } -static inline int devm_gpio_request_one(struct device *dev, unsigned gpio, -					unsigned long flags, const char *label) -{ -	return -ENOSYS; -} -  static inline int gpio_request_array(const struct gpio *array, size_t num)  {  	return -ENOSYS; @@ -125,14 +113,6 @@ static inline void gpio_free(unsigned gpio)  	WARN_ON(1);  } -static inline void devm_gpio_free(struct device *dev, unsigned gpio) -{ -	might_sleep(); - -	/* GPIO can never have been requested */ -	WARN_ON(1); -} -  static inline void gpio_free_array(const struct gpio *array, size_t num)  {  	might_sleep(); @@ -248,4 +228,12 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)  #endif /* ! CONFIG_GENERIC_GPIO */ +struct device; + +/* bindings for managed devices that want to request gpios */ +int devm_gpio_request(struct device *dev, unsigned gpio, const char *label); +int devm_gpio_request_one(struct device *dev, unsigned gpio, +			  unsigned long flags, const char *label); +void devm_gpio_free(struct device *dev, unsigned int gpio); +  #endif /* __LINUX_GPIO_H */ diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 29eb805ea4a..c1d6555d256 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -118,10 +118,8 @@  #ifdef CONFIG_PREEMPT_COUNT  # define preemptible()	(preempt_count() == 0 && !irqs_disabled()) -# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)  #else  # define preemptible()	0 -# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET  #endif  #if defined(CONFIG_SMP) || defined(CONFIG_GENERIC_HARDIRQS) diff --git a/include/linux/hash.h b/include/linux/hash.h index 61c97ae22e0..f09a0ae4d85 100644 --- a/include/linux/hash.h +++ b/include/linux/hash.h @@ -15,6 +15,7 @@   */  #include <asm/types.h> +#include <linux/compiler.h>  /* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */  #define GOLDEN_RATIO_PRIME_32 0x9e370001UL @@ -31,7 +32,7 @@  #error Wordsize not 32 or 64  #endif -static inline u64 hash_64(u64 val, unsigned int bits) +static __always_inline u64 hash_64(u64 val, unsigned int bits)  {  	u64 hash = val; diff --git a/include/linux/hashtable.h b/include/linux/hashtable.h index 227c62424f3..a9df51f5d54 100644 --- a/include/linux/hashtable.h +++ b/include/linux/hashtable.h @@ -115,51 +115,50 @@ static inline void hash_del_rcu(struct hlist_node *node)   * hash_for_each - iterate over a hashtable   * @name: hashtable to iterate   * @bkt: integer to use as bucket loop cursor - * @node: the &struct list_head to use as a loop cursor for each entry   * @obj: the type * to use as a loop cursor for each entry   * @member: the name of the hlist_node within the struct   */ -#define hash_for_each(name, bkt, node, obj, member)				\ -	for ((bkt) = 0, node = NULL; node == NULL && (bkt) < HASH_SIZE(name); (bkt)++)\ -		hlist_for_each_entry(obj, node, &name[bkt], member) +#define hash_for_each(name, bkt, obj, member)				\ +	for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ +			(bkt)++)\ +		hlist_for_each_entry(obj, &name[bkt], member)  /**   * hash_for_each_rcu - iterate over a rcu enabled hashtable   * @name: hashtable to iterate   * @bkt: integer to use as bucket loop cursor - * @node: the &struct list_head to use as a loop cursor for each entry   * @obj: the type * to use as a loop cursor for each entry   * @member: the name of the hlist_node within the struct   */ -#define hash_for_each_rcu(name, bkt, node, obj, member)				\ -	for ((bkt) = 0, node = NULL; node == NULL && (bkt) < HASH_SIZE(name); (bkt)++)\ -		hlist_for_each_entry_rcu(obj, node, &name[bkt], member) +#define hash_for_each_rcu(name, bkt, obj, member)			\ +	for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ +			(bkt)++)\ +		hlist_for_each_entry_rcu(obj, &name[bkt], member)  /**   * hash_for_each_safe - iterate over a hashtable safe against removal of   * hash entry   * @name: hashtable to iterate   * @bkt: integer to use as bucket loop cursor - * @node: the &struct list_head to use as a loop cursor for each entry   * @tmp: a &struct used for temporary storage   * @obj: the type * to use as a loop cursor for each entry   * @member: the name of the hlist_node within the struct   */ -#define hash_for_each_safe(name, bkt, node, tmp, obj, member)			\ -	for ((bkt) = 0, node = NULL; node == NULL && (bkt) < HASH_SIZE(name); (bkt)++)\ -		hlist_for_each_entry_safe(obj, node, tmp, &name[bkt], member) +#define hash_for_each_safe(name, bkt, tmp, obj, member)			\ +	for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ +			(bkt)++)\ +		hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)  /**   * hash_for_each_possible - iterate over all possible objects hashing to the   * same bucket   * @name: hashtable to iterate   * @obj: the type * to use as a loop cursor for each entry - * @node: the &struct list_head to use as a loop cursor for each entry   * @member: the name of the hlist_node within the struct   * @key: the key of the objects to iterate over   */ -#define hash_for_each_possible(name, obj, node, member, key)			\ -	hlist_for_each_entry(obj, node,	&name[hash_min(key, HASH_BITS(name))], member) +#define hash_for_each_possible(name, obj, member, key)			\ +	hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member)  /**   * hash_for_each_possible_rcu - iterate over all possible objects hashing to the @@ -167,25 +166,24 @@ static inline void hash_del_rcu(struct hlist_node *node)   * in a rcu enabled hashtable   * @name: hashtable to iterate   * @obj: the type * to use as a loop cursor for each entry - * @node: the &struct list_head to use as a loop cursor for each entry   * @member: the name of the hlist_node within the struct   * @key: the key of the objects to iterate over   */ -#define hash_for_each_possible_rcu(name, obj, node, member, key)		\ -	hlist_for_each_entry_rcu(obj, node, &name[hash_min(key, HASH_BITS(name))], member) +#define hash_for_each_possible_rcu(name, obj, member, key)		\ +	hlist_for_each_entry_rcu(obj, &name[hash_min(key, HASH_BITS(name))],\ +		member)  /**   * hash_for_each_possible_safe - iterate over all possible objects hashing to the   * same bucket safe against removals   * @name: hashtable to iterate   * @obj: the type * to use as a loop cursor for each entry - * @node: the &struct list_head to use as a loop cursor for each entry   * @tmp: a &struct used for temporary storage   * @member: the name of the hlist_node within the struct   * @key: the key of the objects to iterate over   */ -#define hash_for_each_possible_safe(name, obj, node, tmp, member, key)		\ -	hlist_for_each_entry_safe(obj, node, tmp,				\ +#define hash_for_each_possible_safe(name, obj, tmp, member, key)	\ +	hlist_for_each_entry_safe(obj, tmp,\  		&name[hash_min(key, HASH_BITS(name))], member) diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h new file mode 100644 index 00000000000..3b589440ecf --- /dev/null +++ b/include/linux/hdmi.h @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2012 Avionic Design GmbH + * + * 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_HDMI_H_ +#define __LINUX_HDMI_H_ + +#include <linux/types.h> + +enum hdmi_infoframe_type { +	HDMI_INFOFRAME_TYPE_VENDOR = 0x81, +	HDMI_INFOFRAME_TYPE_AVI = 0x82, +	HDMI_INFOFRAME_TYPE_SPD = 0x83, +	HDMI_INFOFRAME_TYPE_AUDIO = 0x84, +}; + +#define HDMI_INFOFRAME_HEADER_SIZE  4 +#define HDMI_AVI_INFOFRAME_SIZE    13 +#define HDMI_SPD_INFOFRAME_SIZE    25 +#define HDMI_AUDIO_INFOFRAME_SIZE  10 + +enum hdmi_colorspace { +	HDMI_COLORSPACE_RGB, +	HDMI_COLORSPACE_YUV422, +	HDMI_COLORSPACE_YUV444, +}; + +enum hdmi_scan_mode { +	HDMI_SCAN_MODE_NONE, +	HDMI_SCAN_MODE_OVERSCAN, +	HDMI_SCAN_MODE_UNDERSCAN, +}; + +enum hdmi_colorimetry { +	HDMI_COLORIMETRY_NONE, +	HDMI_COLORIMETRY_ITU_601, +	HDMI_COLORIMETRY_ITU_709, +	HDMI_COLORIMETRY_EXTENDED, +}; + +enum hdmi_picture_aspect { +	HDMI_PICTURE_ASPECT_NONE, +	HDMI_PICTURE_ASPECT_4_3, +	HDMI_PICTURE_ASPECT_16_9, +}; + +enum hdmi_active_aspect { +	HDMI_ACTIVE_ASPECT_16_9_TOP = 2, +	HDMI_ACTIVE_ASPECT_14_9_TOP = 3, +	HDMI_ACTIVE_ASPECT_16_9_CENTER = 4, +	HDMI_ACTIVE_ASPECT_PICTURE = 8, +	HDMI_ACTIVE_ASPECT_4_3 = 9, +	HDMI_ACTIVE_ASPECT_16_9 = 10, +	HDMI_ACTIVE_ASPECT_14_9 = 11, +	HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13, +	HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14, +	HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15, +}; + +enum hdmi_extended_colorimetry { +	HDMI_EXTENDED_COLORIMETRY_XV_YCC_601, +	HDMI_EXTENDED_COLORIMETRY_XV_YCC_709, +	HDMI_EXTENDED_COLORIMETRY_S_YCC_601, +	HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601, +	HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB, +}; + +enum hdmi_quantization_range { +	HDMI_QUANTIZATION_RANGE_DEFAULT, +	HDMI_QUANTIZATION_RANGE_LIMITED, +	HDMI_QUANTIZATION_RANGE_FULL, +}; + +/* non-uniform picture scaling */ +enum hdmi_nups { +	HDMI_NUPS_UNKNOWN, +	HDMI_NUPS_HORIZONTAL, +	HDMI_NUPS_VERTICAL, +	HDMI_NUPS_BOTH, +}; + +enum hdmi_ycc_quantization_range { +	HDMI_YCC_QUANTIZATION_RANGE_LIMITED, +	HDMI_YCC_QUANTIZATION_RANGE_FULL, +}; + +enum hdmi_content_type { +	HDMI_CONTENT_TYPE_NONE, +	HDMI_CONTENT_TYPE_PHOTO, +	HDMI_CONTENT_TYPE_CINEMA, +	HDMI_CONTENT_TYPE_GAME, +}; + +struct hdmi_avi_infoframe { +	enum hdmi_infoframe_type type; +	unsigned char version; +	unsigned char length; +	enum hdmi_colorspace colorspace; +	bool active_info_valid; +	bool horizontal_bar_valid; +	bool vertical_bar_valid; +	enum hdmi_scan_mode scan_mode; +	enum hdmi_colorimetry colorimetry; +	enum hdmi_picture_aspect picture_aspect; +	enum hdmi_active_aspect active_aspect; +	bool itc; +	enum hdmi_extended_colorimetry extended_colorimetry; +	enum hdmi_quantization_range quantization_range; +	enum hdmi_nups nups; +	unsigned char video_code; +	enum hdmi_ycc_quantization_range ycc_quantization_range; +	enum hdmi_content_type content_type; +	unsigned char pixel_repeat; +	unsigned short top_bar; +	unsigned short bottom_bar; +	unsigned short left_bar; +	unsigned short right_bar; +}; + +int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame); +ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer, +				size_t size); + +enum hdmi_spd_sdi { +	HDMI_SPD_SDI_UNKNOWN, +	HDMI_SPD_SDI_DSTB, +	HDMI_SPD_SDI_DVDP, +	HDMI_SPD_SDI_DVHS, +	HDMI_SPD_SDI_HDDVR, +	HDMI_SPD_SDI_DVC, +	HDMI_SPD_SDI_DSC, +	HDMI_SPD_SDI_VCD, +	HDMI_SPD_SDI_GAME, +	HDMI_SPD_SDI_PC, +	HDMI_SPD_SDI_BD, +	HDMI_SPD_SDI_SACD, +	HDMI_SPD_SDI_HDDVD, +	HDMI_SPD_SDI_PMP, +}; + +struct hdmi_spd_infoframe { +	enum hdmi_infoframe_type type; +	unsigned char version; +	unsigned char length; +	char vendor[8]; +	char product[16]; +	enum hdmi_spd_sdi sdi; +}; + +int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame, +			    const char *vendor, const char *product); +ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer, +				size_t size); + +enum hdmi_audio_coding_type { +	HDMI_AUDIO_CODING_TYPE_STREAM, +	HDMI_AUDIO_CODING_TYPE_PCM, +	HDMI_AUDIO_CODING_TYPE_AC3, +	HDMI_AUDIO_CODING_TYPE_MPEG1, +	HDMI_AUDIO_CODING_TYPE_MP3, +	HDMI_AUDIO_CODING_TYPE_MPEG2, +	HDMI_AUDIO_CODING_TYPE_AAC_LC, +	HDMI_AUDIO_CODING_TYPE_DTS, +	HDMI_AUDIO_CODING_TYPE_ATRAC, +	HDMI_AUDIO_CODING_TYPE_DSD, +	HDMI_AUDIO_CODING_TYPE_EAC3, +	HDMI_AUDIO_CODING_TYPE_DTS_HD, +	HDMI_AUDIO_CODING_TYPE_MLP, +	HDMI_AUDIO_CODING_TYPE_DST, +	HDMI_AUDIO_CODING_TYPE_WMA_PRO, +}; + +enum hdmi_audio_sample_size { +	HDMI_AUDIO_SAMPLE_SIZE_STREAM, +	HDMI_AUDIO_SAMPLE_SIZE_16, +	HDMI_AUDIO_SAMPLE_SIZE_20, +	HDMI_AUDIO_SAMPLE_SIZE_24, +}; + +enum hdmi_audio_sample_frequency { +	HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM, +	HDMI_AUDIO_SAMPLE_FREQUENCY_32000, +	HDMI_AUDIO_SAMPLE_FREQUENCY_44100, +	HDMI_AUDIO_SAMPLE_FREQUENCY_48000, +	HDMI_AUDIO_SAMPLE_FREQUENCY_88200, +	HDMI_AUDIO_SAMPLE_FREQUENCY_96000, +	HDMI_AUDIO_SAMPLE_FREQUENCY_176400, +	HDMI_AUDIO_SAMPLE_FREQUENCY_192000, +}; + +enum hdmi_audio_coding_type_ext { +	HDMI_AUDIO_CODING_TYPE_EXT_STREAM, +	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC, +	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2, +	HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND, +}; + +struct hdmi_audio_infoframe { +	enum hdmi_infoframe_type type; +	unsigned char version; +	unsigned char length; +	unsigned char channels; +	enum hdmi_audio_coding_type coding_type; +	enum hdmi_audio_sample_size sample_size; +	enum hdmi_audio_sample_frequency sample_frequency; +	enum hdmi_audio_coding_type_ext coding_type_ext; +	unsigned char channel_allocation; +	unsigned char level_shift_value; +	bool downmix_inhibit; + +}; + +int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame); +ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame, +				  void *buffer, size_t size); + +struct hdmi_vendor_infoframe { +	enum hdmi_infoframe_type type; +	unsigned char version; +	unsigned char length; +	u8 data[27]; +}; + +ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame, +				   void *buffer, size_t size); + +#endif /* _DRM_HDMI_H */ diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 0aa5f4c42ae..ecefb7311dd 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h @@ -157,4 +157,42 @@ int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,  */  int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,  			u32 field_index, s32 *value); + +/* hid-sensor-attributes */ + +/* Common hid sensor iio structure */ +struct hid_sensor_common { +	struct hid_sensor_hub_device *hsdev; +	struct platform_device *pdev; +	unsigned usage_id; +	bool data_ready; +	struct hid_sensor_hub_attribute_info poll; +	struct hid_sensor_hub_attribute_info report_state; +	struct hid_sensor_hub_attribute_info power_state; +	struct hid_sensor_hub_attribute_info sensitivity; +}; + +/*Convert from hid unit expo to regular exponent*/ +static inline int hid_sensor_convert_exponent(int unit_expo) +{ +	if (unit_expo < 0x08) +		return unit_expo; +	else if (unit_expo <= 0x0f) +		return -(0x0f-unit_expo+1); +	else +		return 0; +} + +int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, +					u32 usage_id, +					struct hid_sensor_common *st); +int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, +					int val1, int val2); +int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st, +					int *val1, int *val2); +int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st, +					int val1, int val2); +int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st, +					int *val1, int *val2); +  #endif diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h index 55f277372fe..6f24446e766 100644 --- a/include/linux/hid-sensor-ids.h +++ b/include/linux/hid-sensor-ids.h @@ -66,6 +66,15 @@  #define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Y_AXIS		0x200486  #define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Z_AXIS		0x200487 +/* Time (2000a0) */ +#define HID_USAGE_SENSOR_TIME					0x2000a0 +#define HID_USAGE_SENSOR_TIME_YEAR				0x200521 +#define HID_USAGE_SENSOR_TIME_MONTH				0x200522 +#define HID_USAGE_SENSOR_TIME_DAY				0x200523 +#define HID_USAGE_SENSOR_TIME_HOUR				0x200525 +#define HID_USAGE_SENSOR_TIME_MINUTE				0x200526 +#define HID_USAGE_SENSOR_TIME_SECOND				0x200527 +  /* Units */  #define HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED			0x00  #define HID_USAGE_SENSOR_UNITS_LUX				0x01 diff --git a/include/linux/hid.h b/include/linux/hid.h index 7330a0fef0c..e14b465b114 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -589,6 +589,7 @@ struct hid_usage_id {   * @raw_event: if report in report_table, this hook is called (NULL means nop)   * @usage_table: on which events to call event (NULL means all)   * @event: if usage in usage_table, this hook is called (NULL means nop) + * @report: this hook is called after parsing a report (NULL means nop)   * @report_fixup: called before report descriptor parsing (NULL means nop)   * @input_mapping: invoked on input registering before mapping an usage   * @input_mapped: invoked on input registering after mapping an usage @@ -627,6 +628,7 @@ struct hid_driver {  	const struct hid_usage_id *usage_table;  	int (*event)(struct hid_device *hdev, struct hid_field *field,  			struct hid_usage *usage, __s32 value); +	void (*report)(struct hid_device *hdev, struct hid_report *report);  	__u8 *(*report_fixup)(struct hid_device *hdev, __u8 *buf,  			unsigned int *size); @@ -700,6 +702,18 @@ extern int __must_check __hid_register_driver(struct hid_driver *,  extern void hid_unregister_driver(struct hid_driver *); +/** + * module_hid_driver() - Helper macro for registering a HID driver + * @__hid_driver: hid_driver struct + * + * Helper macro for HID 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_hid_driver(__hid_driver) \ +	module_driver(__hid_driver, hid_register_driver, \ +		      hid_unregister_driver) +  extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);  extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report);  extern int hidinput_connect(struct hid_device *hid, unsigned int force); @@ -872,9 +886,6 @@ static inline int hid_hw_power(struct hid_device *hdev, int level)  int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,  		int interrupt); -extern int hid_generic_init(void); -extern void hid_generic_exit(void); -  /* HID quirks API */  u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct);  int usbhid_quirks_init(char **quirks_param); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index ef788b5b4a3..7fb31da45d0 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -219,12 +219,6 @@ static inline void zero_user(struct page *page,  	zero_user_segments(page, start, start + size, 0, 0);  } -static inline void __deprecated memclear_highpage_flush(struct page *page, -			unsigned int offset, unsigned int size) -{ -	zero_user(page, offset, size); -} -  #ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE  static inline void copy_user_highpage(struct page *to, struct page *from, diff --git a/include/linux/hsi/hsi.h b/include/linux/hsi/hsi.h index 56fae865e27..0dca785288c 100644 --- a/include/linux/hsi/hsi.h +++ b/include/linux/hsi/hsi.h @@ -121,9 +121,9 @@ static inline int hsi_register_board_info(struct hsi_board_info const *info,   * @device: Driver model representation of the device   * @tx_cfg: HSI TX configuration   * @rx_cfg: HSI RX configuration - * @e_handler: Callback for handling port events (RX Wake High/Low) - * @pclaimed: Keeps tracks if the clients claimed its associated HSI port - * @nb: Notifier block for port events + * e_handler: Callback for handling port events (RX Wake High/Low) + * pclaimed: Keeps tracks if the clients claimed its associated HSI port + * nb: Notifier block for port events   */  struct hsi_client {  	struct device		device; diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 1d76f8ca90f..ee1c244a62a 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -113,7 +113,7 @@ extern void __split_huge_page_pmd(struct vm_area_struct *vma,  	do {								\  		pmd_t *____pmd = (__pmd);				\  		anon_vma_lock_write(__anon_vma);			\ -		anon_vma_unlock(__anon_vma);				\ +		anon_vma_unlock_write(__anon_vma);			\  		BUG_ON(pmd_trans_splitting(*____pmd) ||			\  		       pmd_trans_huge(*____pmd));			\  	} while (0) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 0c80d3f57a5..16e4e9a643f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -43,9 +43,9 @@ int hugetlb_mempolicy_sysctl_handler(struct ctl_table *, int,  #endif  int copy_hugetlb_page_range(struct mm_struct *, struct mm_struct *, struct vm_area_struct *); -int follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, -			struct page **, struct vm_area_struct **, -			unsigned long *, int *, int, unsigned int flags); +long follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, +			 struct page **, struct vm_area_struct **, +			 unsigned long *, unsigned long *, long, unsigned int);  void unmap_hugepage_range(struct vm_area_struct *,  			  unsigned long, unsigned long, struct page *);  void __unmap_hugepage_range_final(struct mmu_gather *tlb, @@ -281,7 +281,7 @@ static inline struct hstate *hstate_inode(struct inode *i)  static inline struct hstate *hstate_file(struct file *f)  { -	return hstate_inode(f->f_dentry->d_inode); +	return hstate_inode(file_inode(f));  }  static inline struct hstate *hstate_vma(struct vm_area_struct *vma) diff --git a/include/linux/hwmon.h b/include/linux/hwmon.h index 82b29ae6ebb..b2514f70d59 100644 --- a/include/linux/hwmon.h +++ b/include/linux/hwmon.h @@ -20,16 +20,4 @@ struct device *hwmon_device_register(struct device *dev);  void hwmon_device_unregister(struct device *dev); -/* Scale user input to sensible values */ -static inline int SENSORS_LIMIT(long value, long low, long high) -{ -	if (value < low) -		return low; -	else if (value > high) -		return high; -	else -		return value; -} -  #endif - diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index e73b852156b..95d0850584d 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -27,6 +27,63 @@  #include <linux/types.h> + +/* + * Implementation of host controlled snapshot of the guest. + */ + +#define VSS_OP_REGISTER 128 + +enum hv_vss_op { +	VSS_OP_CREATE = 0, +	VSS_OP_DELETE, +	VSS_OP_HOT_BACKUP, +	VSS_OP_GET_DM_INFO, +	VSS_OP_BU_COMPLETE, +	/* +	 * Following operations are only supported with IC version >= 5.0 +	 */ +	VSS_OP_FREEZE, /* Freeze the file systems in the VM */ +	VSS_OP_THAW, /* Unfreeze the file systems */ +	VSS_OP_AUTO_RECOVER, +	VSS_OP_COUNT /* Number of operations, must be last */ +}; + + +/* + * Header for all VSS messages. + */ +struct hv_vss_hdr { +	__u8 operation; +	__u8 reserved[7]; +} __attribute__((packed)); + + +/* + * Flag values for the hv_vss_check_feature. Linux supports only + * one value. + */ +#define VSS_HBU_NO_AUTO_RECOVERY	0x00000005 + +struct hv_vss_check_feature { +	__u32 flags; +} __attribute__((packed)); + +struct hv_vss_check_dm_info { +	__u32 flags; +} __attribute__((packed)); + +struct hv_vss_msg { +	union { +		struct hv_vss_hdr vss_hdr; +		int error; +	}; +	union { +		struct hv_vss_check_feature vss_cf; +		struct hv_vss_check_dm_info dm_info; +	}; +} __attribute__((packed)); +  /*   * An implementation of HyperV key value pair (KVP) functionality for Linux.   * @@ -325,14 +382,28 @@ struct hv_ring_buffer {  	u32 interrupt_mask; -	/* Pad it to PAGE_SIZE so that data starts on page boundary */ -	u8	reserved[4084]; - -	/* NOTE: -	 * The interrupt_mask field is used only for channels but since our -	 * vmbus connection also uses this data structure and its data starts -	 * here, we commented out this field. +	/* +	 * Win8 uses some of the reserved bits to implement +	 * interrupt driven flow management. On the send side +	 * we can request that the receiver interrupt the sender +	 * when the ring transitions from being full to being able +	 * to handle a message of size "pending_send_sz". +	 * +	 * Add necessary state for this enhancement.  	 */ +	u32 pending_send_sz; + +	u32 reserved1[12]; + +	union { +		struct { +			u32 feat_pending_send_sz:1; +		}; +		u32 value; +	} feature_bits; + +	/* Pad it to PAGE_SIZE so that data starts on page boundary */ +	u8	reserved2[4028];  	/*  	 * Ring data starts here + RingDataStartOffset @@ -405,12 +476,22 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,   */  #define HV_DRV_VERSION           "3.1" -  /* - * A revision number of vmbus that is used for ensuring both ends on a - * partition are using compatible versions. + * VMBUS version is 32 bit entity broken up into + * two 16 bit quantities: major_number. minor_number. + * + * 0 . 13 (Windows Server 2008) + * 1 . 1  (Windows 7) + * 2 . 4  (Windows 8)   */ -#define VMBUS_REVISION_NUMBER		13 + +#define VERSION_WS2008  ((0 << 16) | (13)) +#define VERSION_WIN7    ((1 << 16) | (1)) +#define VERSION_WIN8    ((2 << 16) | (4)) + +#define VERSION_INVAL -1 + +#define VERSION_CURRENT VERSION_WIN8  /* Make maximum size of pipe payload of 16K */  #define MAX_PIPE_DATA_PAYLOAD		(sizeof(u8) * 16384) @@ -432,9 +513,13 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,  struct vmbus_channel_offer {  	uuid_le if_type;  	uuid_le if_instance; -	u64 int_latency; /* in 100ns units */ -	u32 if_revision; -	u32 server_ctx_size;	/* in bytes */ + +	/* +	 * These two fields are not currently used. +	 */ +	u64 reserved1; +	u64 reserved2; +  	u16 chn_flags;  	u16 mmio_megabytes;		/* in bytes * 1024 * 1024 */ @@ -456,7 +541,11 @@ struct vmbus_channel_offer {  			unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES];  		} pipe;  	} u; -	u32 padding; +	/* +	 * The sub_channel_index is defined in win8. +	 */ +	u16 sub_channel_index; +	u16 reserved3;  } __packed;  /* Server Flags */ @@ -652,7 +741,25 @@ struct vmbus_channel_offer_channel {  	struct vmbus_channel_offer offer;  	u32 child_relid;  	u8 monitorid; -	u8 monitor_allocated; +	/* +	 * win7 and beyond splits this field into a bit field. +	 */ +	u8 monitor_allocated:1; +	u8 reserved:7; +	/* +	 * These are new fields added in win7 and later. +	 * Do not access these fields without checking the +	 * negotiated protocol. +	 * +	 * If "is_dedicated_interrupt" is set, we must not set the +	 * associated bit in the channel bitmap while sending the +	 * interrupt to the host. +	 * +	 * connection_id is to be used in signaling the host. +	 */ +	u16 is_dedicated_interrupt:1; +	u16 reserved1:15; +	u32 connection_id;  } __packed;  /* Rescind Offer parameters */ @@ -683,8 +790,15 @@ struct vmbus_channel_open_channel {  	/* GPADL for the channel's ring buffer. */  	u32 ringbuffer_gpadlhandle; -	/* GPADL for the channel's server context save area. */ -	u32 server_contextarea_gpadlhandle; +	/* +	 * Starting with win8, this field will be used to specify +	 * the target virtual processor on which to deliver the interrupt for +	 * the host to guest communication. +	 * Prior to win8, incoming channel interrupts would only +	 * be delivered on cpu 0. Setting this value to 0 would +	 * preserve the earlier behavior. +	 */ +	u32 target_vp;  	/*  	* The upstream ring buffer begins at offset zero in the memory @@ -848,6 +962,27 @@ struct vmbus_close_msg {  	struct vmbus_channel_close_channel msg;  }; +/* Define connection identifier type. */ +union hv_connection_id { +	u32 asu32; +	struct { +		u32 id:24; +		u32 reserved:8; +	} u; +}; + +/* Definition of the hv_signal_event hypercall input structure. */ +struct hv_input_signal_event { +	union hv_connection_id connectionid; +	u16 flag_number; +	u16 rsvdz; +}; + +struct hv_input_signal_event_buffer { +	u64 align8; +	struct hv_input_signal_event event; +}; +  struct vmbus_channel {  	struct list_head listentry; @@ -882,8 +1017,42 @@ struct vmbus_channel {  	void (*onchannel_callback)(void *context);  	void *channel_callback_context; + +	/* +	 * A channel can be marked for efficient (batched) +	 * reading: +	 * If batched_reading is set to "true", we read until the +	 * channel is empty and hold off interrupts from the host +	 * during the entire read process. +	 * If batched_reading is set to "false", the client is not +	 * going to perform batched reading. +	 * +	 * By default we will enable batched reading; specific +	 * drivers that don't want this behavior can turn it off. +	 */ + +	bool batched_reading; + +	bool is_dedicated_interrupt; +	struct hv_input_signal_event_buffer sig_buf; +	struct hv_input_signal_event *sig_event; + +	/* +	 * Starting with win8, this field will be used to specify +	 * the target virtual processor on which to deliver the interrupt for +	 * the host to guest communication. +	 * Prior to win8, incoming channel interrupts would only +	 * be delivered on cpu 0. Setting this value to 0 would +	 * preserve the earlier behavior. +	 */ +	u32 target_vp;  }; +static inline void set_channel_read_state(struct vmbus_channel *c, bool state) +{ +	c->batched_reading = state; +} +  void vmbus_onmessage(void *context);  int vmbus_request_offers(void); @@ -1047,6 +1216,108 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver);  		  g8, g9, ga, gb, gc, gd, ge, gf },  /* + * GUID definitions of various offer types - services offered to the guest. + */ + +/* + * Network GUID + * {f8615163-df3e-46c5-913f-f2d2f965ed0e} + */ +#define HV_NIC_GUID \ +	.guid = { \ +			0x63, 0x51, 0x61, 0xf8, 0x3e, 0xdf, 0xc5, 0x46, \ +			0x91, 0x3f, 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0x0e \ +		} + +/* + * IDE GUID + * {32412632-86cb-44a2-9b5c-50d1417354f5} + */ +#define HV_IDE_GUID \ +	.guid = { \ +			0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \ +			0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 \ +		} + +/* + * SCSI GUID + * {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} + */ +#define HV_SCSI_GUID \ +	.guid = { \ +			0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \ +			0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f \ +		} + +/* + * Shutdown GUID + * {0e0b6031-5213-4934-818b-38d90ced39db} + */ +#define HV_SHUTDOWN_GUID \ +	.guid = { \ +			0x31, 0x60, 0x0b, 0x0e, 0x13, 0x52, 0x34, 0x49, \ +			0x81, 0x8b, 0x38, 0xd9, 0x0c, 0xed, 0x39, 0xdb \ +		} + +/* + * Time Synch GUID + * {9527E630-D0AE-497b-ADCE-E80AB0175CAF} + */ +#define HV_TS_GUID \ +	.guid = { \ +			0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, \ +			0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf \ +		} + +/* + * Heartbeat GUID + * {57164f39-9115-4e78-ab55-382f3bd5422d} + */ +#define HV_HEART_BEAT_GUID \ +	.guid = { \ +			0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, \ +			0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d \ +		} + +/* + * KVP GUID + * {a9a0f4e7-5a45-4d96-b827-8a841e8c03e6} + */ +#define HV_KVP_GUID \ +	.guid = { \ +			0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, \ +			0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3,  0xe6 \ +		} + +/* + * Dynamic memory GUID + * {525074dc-8985-46e2-8057-a307dc18a502} + */ +#define HV_DM_GUID \ +	.guid = { \ +			0xdc, 0x74, 0x50, 0X52, 0x85, 0x89, 0xe2, 0x46, \ +			0x80, 0x57, 0xa3, 0x07, 0xdc, 0x18, 0xa5, 0x02 \ +		} + +/* + * Mouse GUID + * {cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a} + */ +#define HV_MOUSE_GUID \ +	.guid = { \ +			0x9e, 0xb6, 0xa8, 0xcf, 0x4a, 0x5b, 0xc0, 0x4c, \ +			0xb9, 0x8b, 0x8b, 0xa1, 0xa1, 0xf3, 0xf9, 0x5a \ +		} + +/* + * VSS (Backup/Restore) GUID + */ +#define HV_VSS_GUID \ +	.guid = { \ +			0x29, 0x2e, 0xfa, 0x35, 0x23, 0xea, 0x36, 0x42, \ +			0x96, 0xae, 0x3a, 0x6e, 0xba, 0xcb, 0xa4,  0x40 \ +		} +/*   * Common header for Hyper-V ICs   */ @@ -1150,5 +1421,15 @@ int hv_kvp_init(struct hv_util_service *);  void hv_kvp_deinit(void);  void hv_kvp_onchannelcallback(void *); +int hv_vss_init(struct hv_util_service *); +void hv_vss_deinit(void); +void hv_vss_onchannelcallback(void *); + +/* + * Negotiated version with the Host. + */ + +extern __u32 vmbus_proto_version; +  #endif /* __KERNEL__ */  #endif /* _HYPERV_H */ diff --git a/include/linux/i2c/atmel_mxt_ts.h b/include/linux/i2c/atmel_mxt_ts.h index f027f7a6351..99e379b7439 100644 --- a/include/linux/i2c/atmel_mxt_ts.h +++ b/include/linux/i2c/atmel_mxt_ts.h @@ -15,6 +15,9 @@  #include <linux/types.h> +/* For key_map array */ +#define MXT_NUM_GPIO		4 +  /* Orient */  #define MXT_NORMAL		0x0  #define MXT_DIAGONAL		0x1 @@ -39,6 +42,8 @@ struct mxt_platform_data {  	unsigned int voltage;  	unsigned char orient;  	unsigned long irqflags; +	bool is_tp; +	const unsigned int key_map[MXT_NUM_GPIO];  };  #endif /* __LINUX_ATMEL_MXT_TS_H */ diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 1ff54b114ef..488debbef89 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -39,51 +39,55 @@   * address each module uses within a given i2c slave.   */ +/* Module IDs for similar functionalities found in twl4030/twl6030 */ +enum twl_module_ids { +	TWL_MODULE_USB, +	TWL_MODULE_PIH, +	TWL_MODULE_MAIN_CHARGE, +	TWL_MODULE_PM_MASTER, +	TWL_MODULE_PM_RECEIVER, + +	TWL_MODULE_RTC, +	TWL_MODULE_PWM, +	TWL_MODULE_LED, +	TWL_MODULE_SECURED_REG, + +	TWL_MODULE_LAST, +}; + +/* Modules only available in twl4030 series */  enum twl4030_module_ids { -	TWL4030_MODULE_USB = 0,		/* Slave 0 (i2c address 0x48) */ -	TWL4030_MODULE_AUDIO_VOICE,	/* Slave 1 (i2c address 0x49) */ +	TWL4030_MODULE_AUDIO_VOICE = TWL_MODULE_LAST,  	TWL4030_MODULE_GPIO,  	TWL4030_MODULE_INTBR, -	TWL4030_MODULE_PIH, -  	TWL4030_MODULE_TEST, -	TWL4030_MODULE_KEYPAD,		/* Slave 2 (i2c address 0x4a) */ +	TWL4030_MODULE_KEYPAD, +  	TWL4030_MODULE_MADC,  	TWL4030_MODULE_INTERRUPTS, -	TWL4030_MODULE_LED, - -	TWL4030_MODULE_MAIN_CHARGE,  	TWL4030_MODULE_PRECHARGE, -	TWL4030_MODULE_PWM0, -	TWL4030_MODULE_PWM1, -	TWL4030_MODULE_PWMA, +	TWL4030_MODULE_BACKUP, +	TWL4030_MODULE_INT, -	TWL4030_MODULE_PWMB,  	TWL5031_MODULE_ACCESSORY,  	TWL5031_MODULE_INTERRUPTS, -	TWL4030_MODULE_BACKUP,		/* Slave 3 (i2c address 0x4b) */ -	TWL4030_MODULE_INT, -	TWL4030_MODULE_PM_MASTER, -	TWL4030_MODULE_PM_RECEIVER, -	TWL4030_MODULE_RTC, -	TWL4030_MODULE_SECURED_REG,  	TWL4030_MODULE_LAST,  }; -/* Similar functionalities implemented in TWL4030/6030 */ -#define TWL_MODULE_USB		TWL4030_MODULE_USB -#define TWL_MODULE_PIH		TWL4030_MODULE_PIH -#define TWL_MODULE_MAIN_CHARGE	TWL4030_MODULE_MAIN_CHARGE -#define TWL_MODULE_PM_MASTER	TWL4030_MODULE_PM_MASTER -#define TWL_MODULE_PM_RECEIVER	TWL4030_MODULE_PM_RECEIVER -#define TWL_MODULE_RTC		TWL4030_MODULE_RTC -#define TWL_MODULE_PWM		TWL4030_MODULE_PWM0 -#define TWL_MODULE_LED		TWL4030_MODULE_LED +/* Modules only available in twl6030 series */ +enum twl6030_module_ids { +	TWL6030_MODULE_ID0 = TWL_MODULE_LAST, +	TWL6030_MODULE_ID1, +	TWL6030_MODULE_ID2, +	TWL6030_MODULE_GPADC, +	TWL6030_MODULE_GASGAUGE, -#define TWL6030_MODULE_ID0	13 -#define TWL6030_MODULE_ID1	14 -#define TWL6030_MODULE_ID2	15 +	TWL6030_MODULE_LAST, +}; + +/* Until the clients has been converted to use TWL_MODULE_LED */ +#define TWL4030_MODULE_LED	TWL_MODULE_LED  #define GPIO_INTR_OFFSET	0  #define KEYPAD_INTR_OFFSET	1 @@ -171,20 +175,22 @@ TWL_CLASS_IS(4030, TWL4030_CLASS_ID)  TWL_CLASS_IS(6030, TWL6030_CLASS_ID)  /* - * Read and write single 8-bit registers - */ -int twl_i2c_write_u8(u8 mod_no, u8 val, u8 reg); -int twl_i2c_read_u8(u8 mod_no, u8 *val, u8 reg); - -/*   * Read and write several 8-bit registers at once. - * - * IMPORTANT:  For twl_i2c_write(), allocate num_bytes + 1 - * for the value, and populate your data starting at offset 1.   */  int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes);  int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); +/* + * Read and write single 8-bit registers + */ +static inline int twl_i2c_write_u8(u8 mod_no, u8 val, u8 reg) { +	return twl_i2c_write(mod_no, &val, reg, 1); +} + +static inline int twl_i2c_read_u8(u8 mod_no, u8 *val, u8 reg) { +	return twl_i2c_read(mod_no, val, reg, 1); +} +  int twl_get_type(void);  int twl_get_version(void);  int twl_get_hfclk_rate(void); diff --git a/include/linux/idr.h b/include/linux/idr.h index de7e190f1af..2640c7e99e5 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h @@ -17,69 +17,40 @@  #include <linux/init.h>  #include <linux/rcupdate.h> -#if BITS_PER_LONG == 32 -# define IDR_BITS 5 -# define IDR_FULL 0xfffffffful -/* We can only use two of the bits in the top level because there is -   only one possible bit in the top level (5 bits * 7 levels = 35 -   bits, but you only use 31 bits in the id). */ -# define TOP_LEVEL_FULL (IDR_FULL >> 30) -#elif BITS_PER_LONG == 64 -# define IDR_BITS 6 -# define IDR_FULL 0xfffffffffffffffful -/* We can only use two of the bits in the top level because there is -   only one possible bit in the top level (6 bits * 6 levels = 36 -   bits, but you only use 31 bits in the id). */ -# define TOP_LEVEL_FULL (IDR_FULL >> 62) -#else -# error "BITS_PER_LONG is not 32 or 64" -#endif - +/* + * We want shallower trees and thus more bits covered at each layer.  8 + * bits gives us large enough first layer for most use cases and maximum + * tree depth of 4.  Each idr_layer is slightly larger than 2k on 64bit and + * 1k on 32bit. + */ +#define IDR_BITS 8  #define IDR_SIZE (1 << IDR_BITS)  #define IDR_MASK ((1 << IDR_BITS)-1) -#define MAX_IDR_SHIFT (sizeof(int)*8 - 1) -#define MAX_IDR_BIT (1U << MAX_IDR_SHIFT) -#define MAX_IDR_MASK (MAX_IDR_BIT - 1) - -/* Leave the possibility of an incomplete final layer */ -#define MAX_IDR_LEVEL ((MAX_IDR_SHIFT + IDR_BITS - 1) / IDR_BITS) - -/* Number of id_layer structs to leave in free list */ -#define MAX_IDR_FREE (MAX_IDR_LEVEL * 2) -  struct idr_layer { -	unsigned long		 bitmap; /* A zero bit means "space here" */ +	int			prefix;	/* the ID prefix of this idr_layer */ +	DECLARE_BITMAP(bitmap, IDR_SIZE); /* A zero bit means "space here" */  	struct idr_layer __rcu	*ary[1<<IDR_BITS]; -	int			 count;	 /* When zero, we can release it */ -	int			 layer;	 /* distance from leaf */ -	struct rcu_head		 rcu_head; +	int			count;	/* When zero, we can release it */ +	int			layer;	/* distance from leaf */ +	struct rcu_head		rcu_head;  };  struct idr { -	struct idr_layer __rcu *top; -	struct idr_layer *id_free; -	int		  layers; /* only valid without concurrent changes */ -	int		  id_free_cnt; -	spinlock_t	  lock; +	struct idr_layer __rcu	*hint;	/* the last layer allocated from */ +	struct idr_layer __rcu	*top; +	struct idr_layer	*id_free; +	int			layers;	/* only valid w/o concurrent changes */ +	int			id_free_cnt; +	spinlock_t		lock;  }; -#define IDR_INIT(name)						\ -{								\ -	.top		= NULL,					\ -	.id_free	= NULL,					\ -	.layers 	= 0,					\ -	.id_free_cnt	= 0,					\ -	.lock		= __SPIN_LOCK_UNLOCKED(name.lock),	\ +#define IDR_INIT(name)							\ +{									\ +	.lock			= __SPIN_LOCK_UNLOCKED(name.lock),	\  }  #define DEFINE_IDR(name)	struct idr name = IDR_INIT(name) -/* Actions to be taken after a call to _idr_sub_alloc */ -#define IDR_NEED_TO_GROW -2 -#define IDR_NOMORE_SPACE -3 - -#define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) -  /**   * DOC: idr sync   * idr synchronization (stolen from radix-tree.h) @@ -101,19 +72,124 @@ struct idr {   * This is what we export.   */ -void *idr_find(struct idr *idp, int id); -int idr_pre_get(struct idr *idp, gfp_t gfp_mask); -int idr_get_new(struct idr *idp, void *ptr, int *id); -int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id); +void *idr_find_slowpath(struct idr *idp, int id); +void idr_preload(gfp_t gfp_mask); +int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask);  int idr_for_each(struct idr *idp,  		 int (*fn)(int id, void *p, void *data), void *data);  void *idr_get_next(struct idr *idp, int *nextid);  void *idr_replace(struct idr *idp, void *ptr, int id);  void idr_remove(struct idr *idp, int id); -void idr_remove_all(struct idr *idp); +void idr_free(struct idr *idp, int id);  void idr_destroy(struct idr *idp);  void idr_init(struct idr *idp); +/** + * idr_preload_end - end preload section started with idr_preload() + * + * Each idr_preload() should be matched with an invocation of this + * function.  See idr_preload() for details. + */ +static inline void idr_preload_end(void) +{ +	preempt_enable(); +} + +/** + * idr_find - return pointer for given id + * @idr: idr handle + * @id: lookup key + * + * Return the pointer given the id it has been registered with.  A %NULL + * return indicates that @id is not valid or you passed %NULL in + * idr_get_new(). + * + * This function can be called under rcu_read_lock(), given that the leaf + * pointers lifetimes are correctly managed. + */ +static inline void *idr_find(struct idr *idr, int id) +{ +	struct idr_layer *hint = rcu_dereference_raw(idr->hint); + +	if (hint && (id & ~IDR_MASK) == hint->prefix) +		return rcu_dereference_raw(hint->ary[id & IDR_MASK]); + +	return idr_find_slowpath(idr, id); +} + +/** + * idr_for_each_entry - iterate over an idr's elements of a given type + * @idp:     idr handle + * @entry:   the type * to use as cursor + * @id:      id entry's key + */ +#define idr_for_each_entry(idp, entry, id)				\ +	for (id = 0, entry = (typeof(entry))idr_get_next((idp), &(id)); \ +	     entry != NULL;                                             \ +	     ++id, entry = (typeof(entry))idr_get_next((idp), &(id))) + +/* + * Don't use the following functions.  These exist only to suppress + * deprecated warnings on EXPORT_SYMBOL()s. + */ +int __idr_pre_get(struct idr *idp, gfp_t gfp_mask); +int __idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id); +void __idr_remove_all(struct idr *idp); + +/** + * idr_pre_get - reserve resources for idr allocation + * @idp:	idr handle + * @gfp_mask:	memory allocation flags + * + * Part of old alloc interface.  This is going away.  Use + * idr_preload[_end]() and idr_alloc() instead. + */ +static inline int __deprecated idr_pre_get(struct idr *idp, gfp_t gfp_mask) +{ +	return __idr_pre_get(idp, gfp_mask); +} + +/** + * idr_get_new_above - allocate new idr entry above or equal to a start id + * @idp: idr handle + * @ptr: pointer you want associated with the id + * @starting_id: id to start search at + * @id: pointer to the allocated handle + * + * Part of old alloc interface.  This is going away.  Use + * idr_preload[_end]() and idr_alloc() instead. + */ +static inline int __deprecated idr_get_new_above(struct idr *idp, void *ptr, +						 int starting_id, int *id) +{ +	return __idr_get_new_above(idp, ptr, starting_id, id); +} + +/** + * idr_get_new - allocate new idr entry + * @idp: idr handle + * @ptr: pointer you want associated with the id + * @id: pointer to the allocated handle + * + * Part of old alloc interface.  This is going away.  Use + * idr_preload[_end]() and idr_alloc() instead. + */ +static inline int __deprecated idr_get_new(struct idr *idp, void *ptr, int *id) +{ +	return __idr_get_new_above(idp, ptr, 0, id); +} + +/** + * idr_remove_all - remove all ids from the given idr tree + * @idp: idr handle + * + * If you're trying to destroy @idp, calling idr_destroy() is enough. + * This is going away.  Don't use. + */ +static inline void __deprecated idr_remove_all(struct idr *idp) +{ +	__idr_remove_all(idp); +}  /*   * IDA - IDR based id allocator, use when translation from id to @@ -136,12 +212,11 @@ struct ida {  	struct ida_bitmap	*free_bitmap;  }; -#define IDA_INIT(name)		{ .idr = IDR_INIT(name), .free_bitmap = NULL, } +#define IDA_INIT(name)		{ .idr = IDR_INIT((name).idr), .free_bitmap = NULL, }  #define DEFINE_IDA(name)	struct ida name = IDA_INIT(name)  int ida_pre_get(struct ida *ida, gfp_t gfp_mask);  int ida_get_new_above(struct ida *ida, int starting_id, int *p_id); -int ida_get_new(struct ida *ida, int *p_id);  void ida_remove(struct ida *ida, int id);  void ida_destroy(struct ida *ida);  void ida_init(struct ida *ida); @@ -150,17 +225,18 @@ int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end,  		   gfp_t gfp_mask);  void ida_simple_remove(struct ida *ida, unsigned int id); -void __init idr_init_cache(void); -  /** - * idr_for_each_entry - iterate over an idr's elements of a given type - * @idp:     idr handle - * @entry:   the type * to use as cursor - * @id:      id entry's key + * ida_get_new - allocate new ID + * @ida:	idr handle + * @p_id:	pointer to the allocated handle + * + * Simple wrapper around ida_get_new_above() w/ @starting_id of zero.   */ -#define idr_for_each_entry(idp, entry, id)				\ -	for (id = 0, entry = (typeof(entry))idr_get_next((idp), &(id)); \ -	     entry != NULL;                                             \ -	     ++id, entry = (typeof(entry))idr_get_next((idp), &(id))) +static inline int ida_get_new(struct ida *ida, int *p_id) +{ +	return ida_get_new_above(ida, 0, p_id); +} + +void __init idr_init_cache(void);  #endif /* __IDR_H__ */ diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index f0859cc7386..7e24fe0cfbc 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -151,6 +151,11 @@  /* Mesh Control 802.11s */  #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100 +/* Mesh Power Save Level */ +#define IEEE80211_QOS_CTL_MESH_PS_LEVEL		0x0200 +/* Mesh Receiver Service Period Initiated */ +#define IEEE80211_QOS_CTL_RSPI			0x0400 +  /* U-APSD queue for WMM IEs sent by AP */  #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7)  #define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK	0x0f @@ -180,7 +185,7 @@ struct ieee80211_hdr {  	u8 addr3[6];  	__le16 seq_ctrl;  	u8 addr4[6]; -} __attribute__ ((packed)); +} __packed;  struct ieee80211_hdr_3addr {  	__le16 frame_control; @@ -189,7 +194,7 @@ struct ieee80211_hdr_3addr {  	u8 addr2[6];  	u8 addr3[6];  	__le16 seq_ctrl; -} __attribute__ ((packed)); +} __packed;  struct ieee80211_qos_hdr {  	__le16 frame_control; @@ -199,7 +204,7 @@ struct ieee80211_qos_hdr {  	u8 addr3[6];  	__le16 seq_ctrl;  	__le16 qos_ctrl; -} __attribute__ ((packed)); +} __packed;  /**   * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set @@ -576,7 +581,7 @@ struct ieee80211s_hdr {  	__le32 seqnum;  	u8 eaddr1[6];  	u8 eaddr2[6]; -} __attribute__ ((packed)); +} __packed;  /* Mesh flags */  #define MESH_FLAGS_AE_A4 	0x1 @@ -614,7 +619,7 @@ struct ieee80211_quiet_ie {  	u8 period;  	__le16 duration;  	__le16 offset; -} __attribute__ ((packed)); +} __packed;  /**   * struct ieee80211_msrment_ie @@ -626,7 +631,7 @@ struct ieee80211_msrment_ie {  	u8 mode;  	u8 type;  	u8 request[0]; -} __attribute__ ((packed)); +} __packed;  /**   * struct ieee80211_channel_sw_ie @@ -637,7 +642,7 @@ struct ieee80211_channel_sw_ie {  	u8 mode;  	u8 new_ch_num;  	u8 count; -} __attribute__ ((packed)); +} __packed;  /**   * struct ieee80211_tim @@ -650,7 +655,7 @@ struct ieee80211_tim_ie {  	u8 bitmap_ctrl;  	/* variable size: 1 - 251 bytes */  	u8 virtual_map[1]; -} __attribute__ ((packed)); +} __packed;  /**   * struct ieee80211_meshconf_ie @@ -665,7 +670,7 @@ struct ieee80211_meshconf_ie {  	u8 meshconf_auth;  	u8 meshconf_form;  	u8 meshconf_cap; -} __attribute__ ((packed)); +} __packed;  /**   * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags @@ -675,11 +680,14 @@ struct ieee80211_meshconf_ie {   * @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs   * @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure   *	is ongoing + * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL: STA is in deep sleep mode or has + *	neighbors in deep sleep mode   */  enum mesh_config_capab_flags {  	IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS		= 0x01,  	IEEE80211_MESHCONF_CAPAB_FORWARDING		= 0x08,  	IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING		= 0x20, +	IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL	= 0x40,  };  /** @@ -695,12 +703,41 @@ struct ieee80211_rann_ie {  	__le32 rann_seq;  	__le32 rann_interval;  	__le32 rann_metric; -} __attribute__ ((packed)); +} __packed;  enum ieee80211_rann_flags {  	RANN_FLAG_IS_GATE = 1 << 0,  }; +enum ieee80211_ht_chanwidth_values { +	IEEE80211_HT_CHANWIDTH_20MHZ = 0, +	IEEE80211_HT_CHANWIDTH_ANY = 1, +}; + +/** + * enum ieee80211_opmode_bits - VHT operating mode field bits + * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask + * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width + * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width + * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width + * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel width + * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask + *	(the NSS value is the value of this field + 1) + * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift + * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU + *	using a beamforming steering matrix + */ +enum ieee80211_vht_opmode_bits { +	IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK	= 3, +	IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ	= 0, +	IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ	= 1, +	IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ	= 2, +	IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ	= 3, +	IEEE80211_OPMODE_NOTIF_RX_NSS_MASK	= 0x70, +	IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT	= 4, +	IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF	= 0x80, +}; +  #define WLAN_SA_QUERY_TR_ID_LEN 2  struct ieee80211_mgmt { @@ -717,33 +754,33 @@ struct ieee80211_mgmt {  			__le16 status_code;  			/* possibly followed by Challenge text */  			u8 variable[0]; -		} __attribute__ ((packed)) auth; +		} __packed auth;  		struct {  			__le16 reason_code; -		} __attribute__ ((packed)) deauth; +		} __packed deauth;  		struct {  			__le16 capab_info;  			__le16 listen_interval;  			/* followed by SSID and Supported rates */  			u8 variable[0]; -		} __attribute__ ((packed)) assoc_req; +		} __packed assoc_req;  		struct {  			__le16 capab_info;  			__le16 status_code;  			__le16 aid;  			/* followed by Supported rates */  			u8 variable[0]; -		} __attribute__ ((packed)) assoc_resp, reassoc_resp; +		} __packed assoc_resp, reassoc_resp;  		struct {  			__le16 capab_info;  			__le16 listen_interval;  			u8 current_ap[6];  			/* followed by SSID and Supported rates */  			u8 variable[0]; -		} __attribute__ ((packed)) reassoc_req; +		} __packed reassoc_req;  		struct {  			__le16 reason_code; -		} __attribute__ ((packed)) disassoc; +		} __packed disassoc;  		struct {  			__le64 timestamp;  			__le16 beacon_int; @@ -751,11 +788,11 @@ struct ieee80211_mgmt {  			/* followed by some of SSID, Supported rates,  			 * FH Params, DS Params, CF Params, IBSS Params, TIM */  			u8 variable[0]; -		} __attribute__ ((packed)) beacon; +		} __packed beacon;  		struct {  			/* only variable items: SSID, Supported rates */  			u8 variable[0]; -		} __attribute__ ((packed)) probe_req; +		} __packed probe_req;  		struct {  			__le64 timestamp;  			__le16 beacon_int; @@ -763,7 +800,7 @@ struct ieee80211_mgmt {  			/* followed by some of SSID, Supported rates,  			 * FH Params, DS Params, CF Params, IBSS Params */  			u8 variable[0]; -		} __attribute__ ((packed)) probe_resp; +		} __packed probe_resp;  		struct {  			u8 category;  			union { @@ -772,65 +809,73 @@ struct ieee80211_mgmt {  					u8 dialog_token;  					u8 status_code;  					u8 variable[0]; -				} __attribute__ ((packed)) wme_action; +				} __packed wme_action;  				struct{  					u8 action_code;  					u8 element_id;  					u8 length;  					struct ieee80211_channel_sw_ie sw_elem; -				} __attribute__((packed)) chan_switch; +				} __packed chan_switch;  				struct{  					u8 action_code;  					u8 dialog_token;  					u8 element_id;  					u8 length;  					struct ieee80211_msrment_ie msr_elem; -				} __attribute__((packed)) measurement; +				} __packed measurement;  				struct{  					u8 action_code;  					u8 dialog_token;  					__le16 capab;  					__le16 timeout;  					__le16 start_seq_num; -				} __attribute__((packed)) addba_req; +				} __packed addba_req;  				struct{  					u8 action_code;  					u8 dialog_token;  					__le16 status;  					__le16 capab;  					__le16 timeout; -				} __attribute__((packed)) addba_resp; +				} __packed addba_resp;  				struct{  					u8 action_code;  					__le16 params;  					__le16 reason_code; -				} __attribute__((packed)) delba; +				} __packed delba;  				struct {  					u8 action_code;  					u8 variable[0]; -				} __attribute__((packed)) self_prot; +				} __packed self_prot;  				struct{  					u8 action_code;  					u8 variable[0]; -				} __attribute__((packed)) mesh_action; +				} __packed mesh_action;  				struct {  					u8 action;  					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN]; -				} __attribute__ ((packed)) sa_query; +				} __packed sa_query;  				struct {  					u8 action;  					u8 smps_control; -				} __attribute__ ((packed)) ht_smps; +				} __packed ht_smps; +				struct { +					u8 action_code; +					u8 chanwidth; +				} __packed ht_notify_cw;  				struct {  					u8 action_code;  					u8 dialog_token;  					__le16 capability;  					u8 variable[0];  				} __packed tdls_discover_resp; +				struct { +					u8 action_code; +					u8 operating_mode; +				} __packed vht_opmode_notif;  			} u; -		} __attribute__ ((packed)) action; +		} __packed action;  	} u; -} __attribute__ ((packed)); +} __packed;  /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */  #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127 @@ -846,7 +891,7 @@ struct ieee80211_mmie {  	__le16 key_id;  	u8 sequence_number[6];  	u8 mic[8]; -} __attribute__ ((packed)); +} __packed;  struct ieee80211_vendor_ie {  	u8 element_id; @@ -861,20 +906,20 @@ struct ieee80211_rts {  	__le16 duration;  	u8 ra[6];  	u8 ta[6]; -} __attribute__ ((packed)); +} __packed;  struct ieee80211_cts {  	__le16 frame_control;  	__le16 duration;  	u8 ra[6]; -} __attribute__ ((packed)); +} __packed;  struct ieee80211_pspoll {  	__le16 frame_control;  	__le16 aid;  	u8 bssid[6];  	u8 ta[6]; -} __attribute__ ((packed)); +} __packed;  /* TDLS */ @@ -967,7 +1012,7 @@ struct ieee80211_bar {  	__u8 ta[6];  	__le16 control;  	__le16 start_seq_num; -} __attribute__((packed)); +} __packed;  /* 802.11 BAR control masks */  #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000 @@ -992,7 +1037,7 @@ struct ieee80211_mcs_info {  	__le16 rx_highest;  	u8 tx_params;  	u8 reserved[3]; -} __attribute__((packed)); +} __packed;  /* 802.11n HT capability MSC set */  #define IEEE80211_HT_MCS_RX_HIGHEST_MASK	0x3ff @@ -1031,7 +1076,7 @@ struct ieee80211_ht_cap {  	__le16 extended_ht_cap_info;  	__le32 tx_BF_cap_info;  	u8 antenna_selection_info; -} __attribute__ ((packed)); +} __packed;  /* 802.11n HT capabilities masks (for cap_info) */  #define IEEE80211_HT_CAP_LDPC_CODING		0x0001 @@ -1102,7 +1147,7 @@ struct ieee80211_ht_operation {  	__le16 operation_mode;  	__le16 stbc_param;  	u8 basic_set[16]; -} __attribute__ ((packed)); +} __packed;  /* for ht_param */  #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET		0x03 @@ -1256,6 +1301,7 @@ struct ieee80211_vht_operation {  #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454			0x00000002  #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ		0x00000004  #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ	0x00000008 +#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK			0x0000000C  #define IEEE80211_VHT_CAP_RXLDPC				0x00000010  #define IEEE80211_VHT_CAP_SHORT_GI_80				0x00000020  #define IEEE80211_VHT_CAP_SHORT_GI_160				0x00000040 @@ -1311,16 +1357,21 @@ struct ieee80211_vht_operation {  #define WLAN_CAPABILITY_SPECTRUM_MGMT	(1<<8)  #define WLAN_CAPABILITY_QOS		(1<<9)  #define WLAN_CAPABILITY_SHORT_SLOT_TIME	(1<<10) +#define WLAN_CAPABILITY_APSD		(1<<11) +#define WLAN_CAPABILITY_RADIO_MEASURE	(1<<12)  #define WLAN_CAPABILITY_DSSS_OFDM	(1<<13) +#define WLAN_CAPABILITY_DEL_BACK	(1<<14) +#define WLAN_CAPABILITY_IMM_BACK	(1<<15)  /* DMG (60gHz) 802.11ad */  /* type - bits 0..1 */ +#define WLAN_CAPABILITY_DMG_TYPE_MASK		(3<<0)  #define WLAN_CAPABILITY_DMG_TYPE_IBSS		(1<<0) /* Tx by: STA */  #define WLAN_CAPABILITY_DMG_TYPE_PBSS		(2<<0) /* Tx by: PCP */  #define WLAN_CAPABILITY_DMG_TYPE_AP		(3<<0) /* Tx by: AP */  #define WLAN_CAPABILITY_DMG_CBAP_ONLY		(1<<2) -#define WLAN_CAPABILITY_DMG_CBAP_SOURCE	(1<<3) +#define WLAN_CAPABILITY_DMG_CBAP_SOURCE		(1<<3)  #define WLAN_CAPABILITY_DMG_PRIVACY		(1<<4)  #define WLAN_CAPABILITY_DMG_ECPAC		(1<<5) @@ -1576,6 +1627,7 @@ enum ieee80211_eid {  	WLAN_EID_VHT_CAPABILITY = 191,  	WLAN_EID_VHT_OPERATION = 192, +	WLAN_EID_OPMODE_NOTIF = 199,  	/* 802.11ad */  	WLAN_EID_NON_TX_BSSID_CAP =  83, @@ -1630,6 +1682,7 @@ enum ieee80211_category {  	WLAN_CATEGORY_WMM = 17,  	WLAN_CATEGORY_FST = 18,  	WLAN_CATEGORY_UNPROT_DMG = 20, +	WLAN_CATEGORY_VHT = 21,  	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,  	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,  }; @@ -1655,6 +1708,13 @@ enum ieee80211_ht_actioncode {  	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,  }; +/* VHT action codes */ +enum ieee80211_vht_actioncode { +	WLAN_VHT_ACTION_COMPRESSED_BF = 0, +	WLAN_VHT_ACTION_GROUPID_MGMT = 1, +	WLAN_VHT_ACTION_OPMODE_NOTIF = 2, +}; +  /* Self Protected Action codes */  enum ieee80211_self_protected_actioncode {  	WLAN_SP_RESERVED = 0, @@ -1716,6 +1776,8 @@ enum ieee80211_tdls_actioncode {  #define WLAN_EXT_CAPA5_TDLS_ENABLED	BIT(5)  #define WLAN_EXT_CAPA5_TDLS_PROHIBITED	BIT(6) +#define WLAN_EXT_CAPA8_OPMODE_NOTIF	BIT(6) +  /* TDLS specific payload type in the LLC/SNAP header */  #define WLAN_TDLS_SNAP_RFTYPE	0x2 @@ -1834,14 +1896,14 @@ struct ieee80211_country_ie_triplet {  			u8 first_channel;  			u8 num_channels;  			s8 max_power; -		} __attribute__ ((packed)) chans; +		} __packed chans;  		struct {  			u8 reg_extension_id;  			u8 reg_class;  			u8 coverage_class; -		} __attribute__ ((packed)) ext; +		} __packed ext;  	}; -} __attribute__ ((packed)); +} __packed;  enum ieee80211_timeout_interval_type {  	WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */, @@ -1884,7 +1946,10 @@ enum ieee80211_sa_query_action {  /* AKM suite selectors */  #define WLAN_AKM_SUITE_8021X		0x000FAC01  #define WLAN_AKM_SUITE_PSK		0x000FAC02 -#define WLAN_AKM_SUITE_SAE			0x000FAC08 +#define WLAN_AKM_SUITE_8021X_SHA256	0x000FAC05 +#define WLAN_AKM_SUITE_PSK_SHA256	0x000FAC06 +#define WLAN_AKM_SUITE_TDLS		0x000FAC07 +#define WLAN_AKM_SUITE_SAE		0x000FAC08  #define WLAN_AKM_SUITE_FT_OVER_SAE	0x000FAC09  #define WLAN_MAX_KEY_LEN		32 @@ -2089,7 +2154,7 @@ static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)   * @tim_len: length of the TIM IE   * @aid: the AID to look for   */ -static inline bool ieee80211_check_tim(struct ieee80211_tim_ie *tim, +static inline bool ieee80211_check_tim(const struct ieee80211_tim_ie *tim,  				       u8 tim_len, u16 aid)  {  	u8 mask; diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index f65e8d250f7..84dde1dd1da 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h @@ -52,6 +52,9 @@ struct macvlan_pcpu_stats {   */  #define MAX_MACVTAP_QUEUES	(NR_CPUS < 16 ? NR_CPUS : 16) +#define MACVLAN_MC_FILTER_BITS	8 +#define MACVLAN_MC_FILTER_SZ	(1 << MACVLAN_MC_FILTER_BITS) +  struct macvlan_dev {  	struct net_device	*dev;  	struct list_head	list; @@ -59,6 +62,9 @@ struct macvlan_dev {  	struct macvlan_port	*port;  	struct net_device	*lowerdev;  	struct macvlan_pcpu_stats __percpu *pcpu_stats; + +	DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ); +  	enum macvlan_mode	mode;  	u16			flags;  	int (*receive)(struct sk_buff *skb); diff --git a/include/linux/if_team.h b/include/linux/if_team.h index 0245def2aa9..cfd21e3d550 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h @@ -186,6 +186,7 @@ struct team {  	const struct team_mode *mode;  	struct team_mode_ops ops; +	bool user_carrier_enabled;  	bool queue_override_enabled;  	struct list_head *qom_lists; /* array of queue override mapping lists */  	long mode_priv[TEAM_MODE_PRIV_LONGS]; @@ -215,11 +216,10 @@ static inline struct hlist_head *team_port_index_hash(struct team *team,  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) +	hlist_for_each_entry(port, head, hlist)  		if (port->index == port_index)  			return port;  	return NULL; @@ -227,11 +227,10 @@ static inline struct team_port *team_get_port_by_index(struct team *team,  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) +	hlist_for_each_entry_rcu(port, head, hlist)  		if (port->index == port_index)  			return port;  	return NULL; diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index d06cc5c8f58..218a3b686d9 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -331,7 +331,7 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb,  					struct vlan_hdr *vhdr)  {  	__be16 proto; -	unsigned char *rawp; +	unsigned short *rawp;  	/*  	 * Was a VLAN packet, grab the encapsulated protocol, which the layer @@ -344,8 +344,8 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb,  		return;  	} -	rawp = skb->data; -	if (*(unsigned short *) rawp == 0xFFFF) +	rawp = (unsigned short *)(vhdr + 1); +	if (*rawp == 0xFFFF)  		/*  		 * This is a magic hack to spot IPX packets. Older Novell  		 * breaks the protocol design and runs IPX over 802.3 without diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h index 2e4eab9868a..e7fdec4db9d 100644 --- a/include/linux/iio/adc/ad_sigma_delta.h +++ b/include/linux/iio/adc/ad_sigma_delta.h @@ -133,9 +133,9 @@ int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig);  		.channel2 = (_channel2), \  		.address = (_address), \  		.extend_name = (_extend_name), \ -		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -			IIO_CHAN_INFO_SCALE_SHARED_BIT | \ -			IIO_CHAN_INFO_OFFSET_SEPARATE_BIT, \ +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +			BIT(IIO_CHAN_INFO_OFFSET), \ +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \  		.scan_index = (_si), \  		.scan_type = { \  			.sign = 'u', \ diff --git a/include/linux/iio/buffer.h b/include/linux/iio/buffer.h index f3eea18fdf4..2bac0eb8948 100644 --- a/include/linux/iio/buffer.h +++ b/include/linux/iio/buffer.h @@ -103,19 +103,6 @@ int iio_update_buffers(struct iio_dev *indio_dev,   **/  void iio_buffer_init(struct iio_buffer *buffer); -/** - * __iio_update_buffer() - update common elements of buffers - * @buffer:		buffer that is the event source - * @bytes_per_datum:	size of individual datum including timestamp - * @length:		number of datums in buffer - **/ -static inline void __iio_update_buffer(struct iio_buffer *buffer, -				       int bytes_per_datum, int length) -{ -	buffer->bytes_per_datum = bytes_per_datum; -	buffer->length = length; -} -  int iio_scan_mask_query(struct iio_dev *indio_dev,  			struct iio_buffer *buffer, int bit); diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h new file mode 100644 index 00000000000..172c5b23cb8 --- /dev/null +++ b/include/linux/iio/common/st_sensors.h @@ -0,0 +1,284 @@ +/* + * STMicroelectronics sensors library driver + * + * Copyright 2012-2013 STMicroelectronics Inc. + * + * Denis Ciocca <denis.ciocca@st.com> + * + * Licensed under the GPL-2. + */ + +#ifndef ST_SENSORS_H +#define ST_SENSORS_H + +#include <linux/i2c.h> +#include <linux/spi/spi.h> +#include <linux/irqreturn.h> +#include <linux/iio/trigger.h> +#include <linux/bitops.h> + +#define ST_SENSORS_TX_MAX_LENGTH		2 +#define ST_SENSORS_RX_MAX_LENGTH		6 + +#define ST_SENSORS_ODR_LIST_MAX			10 +#define ST_SENSORS_FULLSCALE_AVL_MAX		10 + +#define ST_SENSORS_NUMBER_ALL_CHANNELS		4 +#define ST_SENSORS_NUMBER_DATA_CHANNELS		3 +#define ST_SENSORS_ENABLE_ALL_AXIS		0x07 +#define ST_SENSORS_BYTE_FOR_CHANNEL		2 +#define ST_SENSORS_SCAN_X			0 +#define ST_SENSORS_SCAN_Y			1 +#define ST_SENSORS_SCAN_Z			2 +#define ST_SENSORS_DEFAULT_12_REALBITS		12 +#define ST_SENSORS_DEFAULT_16_REALBITS		16 +#define ST_SENSORS_DEFAULT_POWER_ON_VALUE	0x01 +#define ST_SENSORS_DEFAULT_POWER_OFF_VALUE	0x00 +#define ST_SENSORS_DEFAULT_WAI_ADDRESS		0x0f +#define ST_SENSORS_DEFAULT_AXIS_ADDR		0x20 +#define ST_SENSORS_DEFAULT_AXIS_MASK		0x07 +#define ST_SENSORS_DEFAULT_AXIS_N_BIT		3 + +#define ST_SENSORS_MAX_NAME			17 +#define ST_SENSORS_MAX_4WAI			7 + +#define ST_SENSORS_LSM_CHANNELS(device_type, index, mod, endian, bits, addr) \ +{ \ +	.type = device_type, \ +	.modified = 1, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +			BIT(IIO_CHAN_INFO_SCALE), \ +	.scan_index = index, \ +	.channel2 = mod, \ +	.address = addr, \ +	.scan_type = { \ +		.sign = 's', \ +		.realbits = bits, \ +		.shift = 16 - bits, \ +		.storagebits = 16, \ +		.endianness = endian, \ +	}, \ +} + +#define ST_SENSOR_DEV_ATTR_SAMP_FREQ() \ +		IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \ +			st_sensors_sysfs_get_sampling_frequency, \ +			st_sensors_sysfs_set_sampling_frequency) + +#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL() \ +		IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ +			st_sensors_sysfs_sampling_frequency_avail) + +#define ST_SENSORS_DEV_ATTR_SCALE_AVAIL(name) \ +		IIO_DEVICE_ATTR(name, S_IRUGO, \ +			st_sensors_sysfs_scale_avail, NULL , 0); + +struct st_sensor_odr_avl { +	unsigned int hz; +	u8 value; +}; + +struct st_sensor_odr { +	u8 addr; +	u8 mask; +	struct st_sensor_odr_avl odr_avl[ST_SENSORS_ODR_LIST_MAX]; +}; + +struct st_sensor_power { +	u8 addr; +	u8 mask; +	u8 value_off; +	u8 value_on; +}; + +struct st_sensor_axis { +	u8 addr; +	u8 mask; +}; + +struct st_sensor_fullscale_avl { +	unsigned int num; +	u8 value; +	unsigned int gain; +	unsigned int gain2; +}; + +struct st_sensor_fullscale { +	u8 addr; +	u8 mask; +	struct st_sensor_fullscale_avl fs_avl[ST_SENSORS_FULLSCALE_AVL_MAX]; +}; + +/** + * struct st_sensor_bdu - ST sensor device block data update + * @addr: address of the register. + * @mask: mask to write the block data update flag. + */ +struct st_sensor_bdu { +	u8 addr; +	u8 mask; +}; + +/** + * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt + * @addr: address of the register. + * @mask: mask to write the on/off value. + * struct ig1 - represents the Interrupt Generator 1 of sensors. + * @en_addr: address of the enable ig1 register. + * @en_mask: mask to write the on/off value for enable. + */ +struct st_sensor_data_ready_irq { +	u8 addr; +	u8 mask; +	struct { +		u8 en_addr; +		u8 en_mask; +	} ig1; +}; + +/** + * struct st_sensor_transfer_buffer - ST sensor device I/O buffer + * @buf_lock: Mutex to protect rx and tx buffers. + * @tx_buf: Buffer used by SPI transfer function to send data to the sensors. + *	This buffer is used to avoid DMA not-aligned issue. + * @rx_buf: Buffer used by SPI transfer to receive data from sensors. + *	This buffer is used to avoid DMA not-aligned issue. + */ +struct st_sensor_transfer_buffer { +	struct mutex buf_lock; +	u8 rx_buf[ST_SENSORS_RX_MAX_LENGTH]; +	u8 tx_buf[ST_SENSORS_TX_MAX_LENGTH] ____cacheline_aligned; +}; + +/** + * struct st_sensor_transfer_function - ST sensor device I/O function + * @read_byte: Function used to read one byte. + * @write_byte: Function used to write one byte. + * @read_multiple_byte: Function used to read multiple byte. + */ +struct st_sensor_transfer_function { +	int (*read_byte) (struct st_sensor_transfer_buffer *tb, +				struct device *dev, u8 reg_addr, u8 *res_byte); +	int (*write_byte) (struct st_sensor_transfer_buffer *tb, +				struct device *dev, u8 reg_addr, u8 data); +	int (*read_multiple_byte) (struct st_sensor_transfer_buffer *tb, +		struct device *dev, u8 reg_addr, int len, u8 *data, +							bool multiread_bit); +}; + +/** + * struct st_sensors - ST sensors list + * @wai: Contents of WhoAmI register. + * @sensors_supported: List of supported sensors by struct itself. + * @ch: IIO channels for the sensor. + * @odr: Output data rate register and ODR list available. + * @pw: Power register of the sensor. + * @enable_axis: Enable one or more axis of the sensor. + * @fs: Full scale register and full scale list available. + * @bdu: Block data update register. + * @drdy_irq: Data ready register of the sensor. + * @multi_read_bit: Use or not particular bit for [I2C/SPI] multi-read. + * @bootime: samples to discard when sensor passing from power-down to power-up. + */ +struct st_sensors { +	u8 wai; +	char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME]; +	struct iio_chan_spec *ch; +	struct st_sensor_odr odr; +	struct st_sensor_power pw; +	struct st_sensor_axis enable_axis; +	struct st_sensor_fullscale fs; +	struct st_sensor_bdu bdu; +	struct st_sensor_data_ready_irq drdy_irq; +	bool multi_read_bit; +	unsigned int bootime; +}; + +/** + * struct st_sensor_data - ST sensor device status + * @dev: Pointer to instance of struct device (I2C or SPI). + * @trig: The trigger in use by the core driver. + * @sensor: Pointer to the current sensor struct in use. + * @current_fullscale: Maximum range of measure by the sensor. + * @enabled: Status of the sensor (false->off, true->on). + * @multiread_bit: Use or not particular bit for [I2C/SPI] multiread. + * @buffer_data: Data used by buffer part. + * @odr: Output data rate of the sensor [Hz]. + * @get_irq_data_ready: Function to get the IRQ used for data ready signal. + * @tf: Transfer function structure used by I/O operations. + * @tb: Transfer buffers and mutex used by I/O operations. + */ +struct st_sensor_data { +	struct device *dev; +	struct iio_trigger *trig; +	struct st_sensors *sensor; +	struct st_sensor_fullscale_avl *current_fullscale; + +	bool enabled; +	bool multiread_bit; + +	char *buffer_data; + +	unsigned int odr; + +	unsigned int (*get_irq_data_ready) (struct iio_dev *indio_dev); + +	const struct st_sensor_transfer_function *tf; +	struct st_sensor_transfer_buffer tb; +}; + +#ifdef CONFIG_IIO_BUFFER +irqreturn_t st_sensors_trigger_handler(int irq, void *p); + +int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf); +#endif + +#ifdef CONFIG_IIO_TRIGGER +int st_sensors_allocate_trigger(struct iio_dev *indio_dev, +				const struct iio_trigger_ops *trigger_ops); + +void st_sensors_deallocate_trigger(struct iio_dev *indio_dev); + +#else +static inline int st_sensors_allocate_trigger(struct iio_dev *indio_dev, +				const struct iio_trigger_ops *trigger_ops) +{ +	return 0; +} +static inline void st_sensors_deallocate_trigger(struct iio_dev *indio_dev) +{ +	return; +} +#endif + +int st_sensors_init_sensor(struct iio_dev *indio_dev); + +int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable); + +int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable); + +int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr); + +int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable); + +int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale); + +int st_sensors_read_info_raw(struct iio_dev *indio_dev, +				struct iio_chan_spec const *ch, int *val); + +int st_sensors_check_device_support(struct iio_dev *indio_dev, +			int num_sensors_list, const struct st_sensors *sensors); + +ssize_t st_sensors_sysfs_get_sampling_frequency(struct device *dev, +				struct device_attribute *attr, char *buf); + +ssize_t st_sensors_sysfs_set_sampling_frequency(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t size); + +ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, +				struct device_attribute *attr, char *buf); + +ssize_t st_sensors_sysfs_scale_avail(struct device *dev, +				struct device_attribute *attr, char *buf); + +#endif /* ST_SENSORS_H */ diff --git a/include/linux/iio/common/st_sensors_i2c.h b/include/linux/iio/common/st_sensors_i2c.h new file mode 100644 index 00000000000..67d845385ae --- /dev/null +++ b/include/linux/iio/common/st_sensors_i2c.h @@ -0,0 +1,20 @@ +/* + * STMicroelectronics sensors i2c library driver + * + * Copyright 2012-2013 STMicroelectronics Inc. + * + * Denis Ciocca <denis.ciocca@st.com> + * + * Licensed under the GPL-2. + */ + +#ifndef ST_SENSORS_I2C_H +#define ST_SENSORS_I2C_H + +#include <linux/i2c.h> +#include <linux/iio/common/st_sensors.h> + +void st_sensors_i2c_configure(struct iio_dev *indio_dev, +		struct i2c_client *client, struct st_sensor_data *sdata); + +#endif /* ST_SENSORS_I2C_H */ diff --git a/include/linux/iio/common/st_sensors_spi.h b/include/linux/iio/common/st_sensors_spi.h new file mode 100644 index 00000000000..d964a3563dc --- /dev/null +++ b/include/linux/iio/common/st_sensors_spi.h @@ -0,0 +1,20 @@ +/* + * STMicroelectronics sensors spi library driver + * + * Copyright 2012-2013 STMicroelectronics Inc. + * + * Denis Ciocca <denis.ciocca@st.com> + * + * Licensed under the GPL-2. + */ + +#ifndef ST_SENSORS_SPI_H +#define ST_SENSORS_SPI_H + +#include <linux/spi/spi.h> +#include <linux/iio/common/st_sensors.h> + +void st_sensors_spi_configure(struct iio_dev *indio_dev, +			struct spi_device *spi, struct st_sensor_data *sdata); + +#endif /* ST_SENSORS_SPI_H */ diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h index 16c35ac045b..833926c91aa 100644 --- a/include/linux/iio/consumer.h +++ b/include/linux/iio/consumer.h @@ -15,6 +15,7 @@  struct iio_dev;  struct iio_chan_spec; +struct device;  /**   * struct iio_channel - everything needed for a consumer to use a channel @@ -30,14 +31,15 @@ struct iio_channel {  /**   * iio_channel_get() - get description of all that is needed to access channel. - * @name:		Unique name of the device as provided in the iio_map + * @dev:		Pointer to consumer device. Device name must match + *			the name of the device as provided in the iio_map   *			with which the desired provider to consumer mapping   *			was registered.   * @consumer_channel:	Unique name to identify the channel on the consumer   *			side. This typically describes the channels use within   *			the consumer. E.g. 'battery_voltage'   */ -struct iio_channel *iio_channel_get(const char *name, +struct iio_channel *iio_channel_get(struct device *dev,  				    const char *consumer_channel);  /** @@ -48,14 +50,14 @@ void iio_channel_release(struct iio_channel *chan);  /**   * iio_channel_get_all() - get all channels associated with a client - * @name:		name of consumer device. + * @dev:		Pointer to consumer device.   *   * Returns an array of iio_channel structures terminated with one with   * null iio_dev pointer.   * This function is used by fairly generic consumers to get all the   * channels registered as having this consumer.   */ -struct iio_channel *iio_channel_get_all(const char *name); +struct iio_channel *iio_channel_get_all(struct device *dev);  /**   * iio_channel_release_all() - reverse iio_channel_get_all @@ -66,7 +68,7 @@ void iio_channel_release_all(struct iio_channel *chan);  struct iio_cb_buffer;  /**   * iio_channel_get_all_cb() - register callback for triggered capture - * @name:		Name of client device. + * @dev:		Pointer to client device.   * @cb:			Callback function.   * @private:		Private data passed to callback.   * @@ -74,7 +76,7 @@ struct iio_cb_buffer;   * So if the channels requested come from different devices this will   * fail.   */ -struct iio_cb_buffer *iio_channel_get_all_cb(const char *name, +struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,  					     int (*cb)(u8 *data,  						       void *private),  					     void *private); diff --git a/include/linux/iio/driver.h b/include/linux/iio/driver.h index a4f8b2e05af..7dfb10ee266 100644 --- a/include/linux/iio/driver.h +++ b/include/linux/iio/driver.h @@ -22,13 +22,10 @@ int iio_map_array_register(struct iio_dev *indio_dev,  			   struct iio_map *map);  /** - * iio_map_array_unregister() - tell the core to remove consumer mappings + * iio_map_array_unregister() - tell the core to remove consumer mappings for + *				the given provider device   * @indio_dev:	provider device - * @map:	array of mappings to remove. Note these must have same memory - *		addresses as those originally added not just equal parameter - *		values.   */ -int iio_map_array_unregister(struct iio_dev *indio_dev, -			     struct iio_map *map); +int iio_map_array_unregister(struct iio_dev *indio_dev);  #endif diff --git a/include/linux/iio/gyro/itg3200.h b/include/linux/iio/gyro/itg3200.h new file mode 100644 index 00000000000..c53f16914b7 --- /dev/null +++ b/include/linux/iio/gyro/itg3200.h @@ -0,0 +1,154 @@ +/* + * itg3200.h -- support InvenSense ITG3200 + *              Digital 3-Axis Gyroscope driver + * + * Copyright (c) 2011 Christian Strobel <christian.strobel@iis.fraunhofer.de> + * Copyright (c) 2011 Manuel Stahl <manuel.stahl@iis.fraunhofer.de> + * Copyright (c) 2012 Thorsten Nowak <thorsten.nowak@iis.fraunhofer.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 I2C_ITG3200_H_ +#define I2C_ITG3200_H_ + +#include <linux/iio/iio.h> + +/* Register with I2C address (34h) */ +#define ITG3200_REG_ADDRESS		0x00 + +/* Sample rate divider + * Range: 0 to 255 + * Default value: 0x00 */ +#define ITG3200_REG_SAMPLE_RATE_DIV	0x15 + +/* Digital low pass filter settings */ +#define ITG3200_REG_DLPF		0x16 +/* DLPF full scale range */ +#define ITG3200_DLPF_FS_SEL_2000	0x18 +/* Bandwidth (Hz) and internal sample rate + * (kHz) of DLPF */ +#define ITG3200_DLPF_256_8		0x00 +#define ITG3200_DLPF_188_1		0x01 +#define ITG3200_DLPF_98_1		0x02 +#define ITG3200_DLPF_42_1		0x03 +#define ITG3200_DLPF_20_1		0x04 +#define ITG3200_DLPF_10_1		0x05 +#define ITG3200_DLPF_5_1		0x06 + +#define ITG3200_DLPF_CFG_MASK		0x07 + +/* Configuration for interrupt operations */ +#define ITG3200_REG_IRQ_CONFIG		0x17 +/* Logic level */ +#define ITG3200_IRQ_ACTIVE_LOW		0x80 +#define ITG3200_IRQ_ACTIVE_HIGH		0x00 +/* Drive type */ +#define ITG3200_IRQ_OPEN_DRAIN		0x40 +#define ITG3200_IRQ_PUSH_PULL		0x00 +/* Latch mode */ +#define ITG3200_IRQ_LATCH_UNTIL_CLEARED	0x20 +#define ITG3200_IRQ_LATCH_50US_PULSE	0x00 +/* Latch clear method */ +#define ITG3200_IRQ_LATCH_CLEAR_ANY	0x10 +#define ITG3200_IRQ_LATCH_CLEAR_STATUS	0x00 +/* Enable interrupt when device is ready */ +#define ITG3200_IRQ_DEVICE_RDY_ENABLE	0x04 +/* Enable interrupt when data is available */ +#define ITG3200_IRQ_DATA_RDY_ENABLE	0x01 + +/* Determine the status of ITG-3200 interrupts */ +#define ITG3200_REG_IRQ_STATUS		0x1A +/* Status of 'device is ready'-interrupt */ +#define ITG3200_IRQ_DEVICE_RDY_STATUS	0x04 +/* Status of 'data is available'-interrupt */ +#define ITG3200_IRQ_DATA_RDY_STATUS	0x01 + +/* Sensor registers */ +#define ITG3200_REG_TEMP_OUT_H		0x1B +#define ITG3200_REG_TEMP_OUT_L		0x1C +#define ITG3200_REG_GYRO_XOUT_H		0x1D +#define ITG3200_REG_GYRO_XOUT_L		0x1E +#define ITG3200_REG_GYRO_YOUT_H		0x1F +#define ITG3200_REG_GYRO_YOUT_L		0x20 +#define ITG3200_REG_GYRO_ZOUT_H		0x21 +#define ITG3200_REG_GYRO_ZOUT_L		0x22 + +/* Power management */ +#define ITG3200_REG_POWER_MANAGEMENT	0x3E +/* Reset device and internal registers to the + * power-up-default settings */ +#define ITG3200_RESET			0x80 +/* Enable low power sleep mode */ +#define ITG3200_SLEEP			0x40 +/* Put according gyroscope in standby mode */ +#define ITG3200_STANDBY_GYRO_X		0x20 +#define ITG3200_STANDBY_GYRO_Y		0x10 +#define ITG3200_STANDBY_GYRO_Z		0x08 +/* Determine the device clock source */ +#define ITG3200_CLK_INTERNAL		0x00 +#define ITG3200_CLK_GYRO_X		0x01 +#define ITG3200_CLK_GYRO_Y		0x02 +#define ITG3200_CLK_GYRO_Z		0x03 +#define ITG3200_CLK_EXT_32K		0x04 +#define ITG3200_CLK_EXT_19M		0x05 + + +/** + * struct itg3200 - device instance specific data + * @i2c:    actual i2c_client + * @trig:   data ready trigger from itg3200 pin + **/ +struct itg3200 { +	struct i2c_client	*i2c; +	struct iio_trigger	*trig; +}; + +enum ITG3200_SCAN_INDEX { +	ITG3200_SCAN_TEMP, +	ITG3200_SCAN_GYRO_X, +	ITG3200_SCAN_GYRO_Y, +	ITG3200_SCAN_GYRO_Z, +	ITG3200_SCAN_ELEMENTS, +}; + +int itg3200_write_reg_8(struct iio_dev *indio_dev, +		u8 reg_address, u8 val); + +int itg3200_read_reg_8(struct iio_dev *indio_dev, +		u8 reg_address, u8 *val); + + +#ifdef CONFIG_IIO_BUFFER + +void itg3200_remove_trigger(struct iio_dev *indio_dev); +int itg3200_probe_trigger(struct iio_dev *indio_dev); + +int itg3200_buffer_configure(struct iio_dev *indio_dev); +void itg3200_buffer_unconfigure(struct iio_dev *indio_dev); + +#else /* CONFIG_IIO_BUFFER */ + +static inline void itg3200_remove_trigger(struct iio_dev *indio_dev) +{ +} + +static inline int itg3200_probe_trigger(struct iio_dev *indio_dev) +{ +	return 0; +} + +static inline int itg3200_buffer_configure(struct iio_dev *indio_dev) +{ +	return 0; +} + +static inline void itg3200_buffer_unconfigure(struct iio_dev *indio_dev) +{ +} + +#endif  /* CONFIG_IIO_RING_BUFFER */ + +#endif /* ITG3200_H_ */ diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index da8c776ba0b..8d171f42763 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -38,76 +38,6 @@ enum iio_chan_info_enum {  	IIO_CHAN_INFO_HYSTERESIS,  }; -#define IIO_CHAN_INFO_SHARED_BIT(type) BIT(type*2) -#define IIO_CHAN_INFO_SEPARATE_BIT(type) BIT(type*2 + 1) -#define IIO_CHAN_INFO_BITS(type) (IIO_CHAN_INFO_SHARED_BIT(type) | \ -				    IIO_CHAN_INFO_SEPARATE_BIT(type)) - -#define IIO_CHAN_INFO_RAW_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_RAW) -#define IIO_CHAN_INFO_PROCESSED_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PROCESSED) -#define IIO_CHAN_INFO_SCALE_SEPARATE_BIT		\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SCALE) -#define IIO_CHAN_INFO_SCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SCALE) -#define IIO_CHAN_INFO_OFFSET_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_OFFSET) -#define IIO_CHAN_INFO_OFFSET_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_OFFSET) -#define IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBSCALE) -#define IIO_CHAN_INFO_CALIBSCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBSCALE) -#define IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBBIAS) -#define IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBBIAS) -#define IIO_CHAN_INFO_PEAK_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAK) -#define IIO_CHAN_INFO_PEAK_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAK) -#define IIO_CHAN_INFO_PEAKSCALE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAKSCALE) -#define IIO_CHAN_INFO_PEAKSCALE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAKSCALE) -#define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE_BIT	\ -	IIO_CHAN_INFO_SEPARATE_BIT(				\ -		IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) -#define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SHARED_BIT	\ -	IIO_CHAN_INFO_SHARED_BIT(				\ -		IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) -#define IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_AVERAGE_RAW) -#define IIO_CHAN_INFO_AVERAGE_RAW_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_AVERAGE_RAW) -#define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT \ -	IIO_CHAN_INFO_SHARED_BIT(			       \ -		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) -#define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SEPARATE_BIT \ -	IIO_CHAN_INFO_SEPARATE_BIT(			       \ -		IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) -#define IIO_CHAN_INFO_SAMP_FREQ_SEPARATE_BIT		\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SAMP_FREQ) -#define IIO_CHAN_INFO_SAMP_FREQ_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SAMP_FREQ) -#define IIO_CHAN_INFO_FREQUENCY_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_FREQUENCY) -#define IIO_CHAN_INFO_FREQUENCY_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_FREQUENCY) -#define IIO_CHAN_INFO_PHASE_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PHASE) -#define IIO_CHAN_INFO_PHASE_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PHASE) -#define IIO_CHAN_INFO_HARDWAREGAIN_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HARDWAREGAIN) -#define IIO_CHAN_INFO_HARDWAREGAIN_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HARDWAREGAIN) -#define IIO_CHAN_INFO_HYSTERESIS_SEPARATE_BIT			\ -	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HYSTERESIS) -#define IIO_CHAN_INFO_HYSTERESIS_SHARED_BIT			\ -	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HYSTERESIS) -  enum iio_endian {  	IIO_CPU,  	IIO_BE, @@ -218,6 +148,10 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,   *			endianness:	little or big endian   * @info_mask:		What information is to be exported about this channel.   *			This includes calibbias, scale etc. + * @info_mask_separate: What information is to be exported that is specific to + *			this channel. + * @info_mask_shared_by_type: What information is to be exported that is shared +*			by all channels of the same type.   * @event_mask:		What events can this channel produce.   * @ext_info:		Array of extended info attributes for this channel.   *			The array is NULL terminated, the last element should @@ -253,6 +187,8 @@ struct iio_chan_spec {  		enum iio_endian endianness;  	} scan_type;  	long			info_mask; +	long			info_mask_separate; +	long			info_mask_shared_by_type;  	long			event_mask;  	const struct iio_chan_spec_ext_info *ext_info;  	const char		*extend_name; @@ -275,7 +211,8 @@ struct iio_chan_spec {  static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,  	enum iio_chan_info_enum type)  { -	return chan->info_mask & IIO_CHAN_INFO_BITS(type); +	return (chan->info_mask_separate & type) | +	       (chan->info_mask_shared_by_type & type);  }  #define IIO_ST(si, rb, sb, sh)						\ diff --git a/include/linux/iio/imu/adis.h b/include/linux/iio/imu/adis.h index ff781dca2e9..b665dc7f017 100644 --- a/include/linux/iio/imu/adis.h +++ b/include/linux/iio/imu/adis.h @@ -162,8 +162,8 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	.indexed = 1, \  	.channel = (chan), \  	.extend_name = name, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		BIT(IIO_CHAN_INFO_SCALE), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -184,9 +184,9 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	.type = IIO_TEMP, \  	.indexed = 1, \  	.channel = 0, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		IIO_CHAN_INFO_SCALE_SEPARATE_BIT | \ -		IIO_CHAN_INFO_OFFSET_SEPARATE_BIT, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		BIT(IIO_CHAN_INFO_SCALE) | \ +		BIT(IIO_CHAN_INFO_OFFSET), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -197,13 +197,13 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	}, \  } -#define ADIS_MOD_CHAN(_type, mod, addr, si, info, bits) { \ +#define ADIS_MOD_CHAN(_type, mod, addr, si, info_sep, bits) { \  	.type = (_type), \  	.modified = 1, \  	.channel2 = IIO_MOD_ ## mod, \ -	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ -		 IIO_CHAN_INFO_SCALE_SHARED_BIT | \ -		 info, \ +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ +		 info_sep, \ +	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \  	.address = (addr), \  	.scan_index = (si), \  	.scan_type = { \ @@ -214,17 +214,17 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	}, \  } -#define ADIS_ACCEL_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info, bits) +#define ADIS_ACCEL_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, bits) -#define ADIS_GYRO_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info, bits) +#define ADIS_GYRO_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, bits) -#define ADIS_INCLI_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info, bits) +#define ADIS_INCLI_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, bits) -#define ADIS_ROT_CHAN(mod, addr, si, info, bits) \ -	ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info, bits) +#define ADIS_ROT_CHAN(mod, addr, si, info_sep, bits) \ +	ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, bits)  #ifdef CONFIG_IIO_ADIS_LIB_BUFFER diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h index 20239da1d0f..3869c525b05 100644 --- a/include/linux/iio/trigger.h +++ b/include/linux/iio/trigger.h @@ -12,6 +12,7 @@  #ifndef _IIO_TRIGGER_H_  #define _IIO_TRIGGER_H_ +#ifdef CONFIG_IIO_TRIGGER  struct iio_subirq {  	bool enabled;  }; @@ -43,7 +44,6 @@ struct iio_trigger_ops {   * @id:			[INTERN] unique id number   * @name:		[DRIVER] unique name   * @dev:		[DRIVER] associated device (if relevant) - * @private_data:	[DRIVER] device specific data   * @list:		[INTERN] used in maintenance of global trigger list   * @alloc_list:		[DRIVER] used for driver specific trigger list   * @use_count:		use count for the trigger @@ -59,7 +59,6 @@ struct iio_trigger {  	const char			*name;  	struct device			dev; -	void				*private_data;  	struct list_head		list;  	struct list_head		alloc_list;  	int use_count; @@ -91,6 +90,30 @@ static inline void iio_trigger_get(struct iio_trigger *trig)  }  /** + * iio_device_set_drvdata() - Set trigger driver data + * @trig: IIO trigger structure + * @data: Driver specific data + * + * Allows to attach an arbitrary pointer to an IIO trigger, which can later be + * retrieved by iio_trigger_get_drvdata(). + */ +static inline void iio_trigger_set_drvdata(struct iio_trigger *trig, void *data) +{ +	dev_set_drvdata(&trig->dev, data); +} + +/** + * iio_trigger_get_drvdata() - Get trigger driver data + * @trig: IIO trigger structure + * + * Returns the data previously set with iio_trigger_set_drvdata() + */ +static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig) +{ +	return dev_get_drvdata(&trig->dev); +} + +/**   * iio_trigger_register() - register a trigger with the IIO core   * @trig_info:	trigger to be registered   **/ @@ -117,4 +140,8 @@ irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private);  __printf(1, 2) struct iio_trigger *iio_trigger_alloc(const char *fmt, ...);  void iio_trigger_free(struct iio_trigger *trig); +#else +struct iio_trigger; +struct iio_trigger_ops; +#endif  #endif /* _IIO_TRIGGER_H_ */ diff --git a/include/linux/in6.h b/include/linux/in6.h index 9e2ae26fb59..34edf1f6c9a 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h @@ -22,6 +22,10 @@  #include <uapi/linux/in6.h> +/* IPv6 Wildcard Address (::) and Loopback Address (::1) defined in RFC2553 + * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined + * in network byte order, not in host byte order as are the IPv4 equivalents + */  extern const struct in6_addr in6addr_any;  #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }  extern const struct in6_addr in6addr_loopback; @@ -32,4 +36,13 @@ extern const struct in6_addr in6addr_linklocal_allnodes;  extern const struct in6_addr in6addr_linklocal_allrouters;  #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \  		{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } } +extern const struct in6_addr in6addr_interfacelocal_allnodes; +#define IN6ADDR_INTERFACELOCAL_ALLNODES_INIT \ +		{ { { 0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } +extern const struct in6_addr in6addr_interfacelocal_allrouters; +#define IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT \ +		{ { { 0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } } +extern const struct in6_addr in6addr_sitelocal_allrouters; +#define IN6ADDR_SITELOCAL_ALLROUTERS_INIT \ +		{ { { 0xff,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }  #endif diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index a9d828976a7..ea1e3b86389 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h @@ -166,6 +166,12 @@ struct in_ifaddr {  	unsigned char		ifa_flags;  	unsigned char		ifa_prefixlen;  	char			ifa_label[IFNAMSIZ]; + +	/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */ +	__u32			ifa_valid_lft; +	__u32			ifa_preferred_lft; +	unsigned long		ifa_cstamp; /* created timestamp */ +	unsigned long		ifa_tstamp; /* updated timestamp */  };  extern int register_inetaddr_notifier(struct notifier_block *nb); diff --git a/include/linux/input/adxl34x.h b/include/linux/input/adxl34x.h index 57e01a7cb00..010d98175ef 100644 --- a/include/linux/input/adxl34x.h +++ b/include/linux/input/adxl34x.h @@ -13,6 +13,8 @@  #ifndef __LINUX_INPUT_ADXL34X_H__  #define __LINUX_INPUT_ADXL34X_H__ +#include <linux/input.h> +  struct adxl34x_platform_data {  	/* diff --git a/include/linux/input/tegra_kbc.h b/include/linux/input/tegra_kbc.h deleted file mode 100644 index a1302561293..00000000000 --- a/include/linux/input/tegra_kbc.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Platform definitions for tegra-kbc keyboard input driver - * - * Copyright (c) 2010-2011, NVIDIA Corporation. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. - */ - -#ifndef ASMARM_ARCH_TEGRA_KBC_H -#define ASMARM_ARCH_TEGRA_KBC_H - -#include <linux/types.h> -#include <linux/input/matrix_keypad.h> - -#define KBC_MAX_GPIO	24 -#define KBC_MAX_KPENT	8 - -#define KBC_MAX_ROW	16 -#define KBC_MAX_COL	8 -#define KBC_MAX_KEY	(KBC_MAX_ROW * KBC_MAX_COL) - -enum tegra_pin_type { -	PIN_CFG_IGNORE, -	PIN_CFG_COL, -	PIN_CFG_ROW, -}; - -struct tegra_kbc_pin_cfg { -	enum tegra_pin_type type; -	unsigned char num; -}; - -struct tegra_kbc_wake_key { -	u8 row:4; -	u8 col:4; -}; - -struct tegra_kbc_platform_data { -	unsigned int debounce_cnt; -	unsigned int repeat_cnt; - -	struct tegra_kbc_pin_cfg pin_cfg[KBC_MAX_GPIO]; -	const struct matrix_keymap_data *keymap_data; - -	u32 wakeup_key; -	bool wakeup; -	bool use_fn_map; -	bool use_ghost_filter; -}; -#endif diff --git a/include/linux/iommu.h b/include/linux/iommu.h index f3b99e1c104..ba3b8a98a04 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -58,8 +58,10 @@ struct iommu_domain {  #define IOMMU_CAP_INTR_REMAP		0x2	/* isolates device intrs */  enum iommu_attr { -	DOMAIN_ATTR_MAX,  	DOMAIN_ATTR_GEOMETRY, +	DOMAIN_ATTR_PAGING, +	DOMAIN_ATTR_WINDOWS, +	DOMAIN_ATTR_MAX,  };  #ifdef CONFIG_IOMMU_API @@ -100,6 +102,16 @@ struct iommu_ops {  			       enum iommu_attr attr, void *data);  	int (*domain_set_attr)(struct iommu_domain *domain,  			       enum iommu_attr attr, void *data); + +	/* Window handling functions */ +	int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr, +				    phys_addr_t paddr, u64 size); +	void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr); +	/* Set the numer of window per domain */ +	int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count); +	/* Get the numer of window per domain */ +	u32 (*domain_get_windows)(struct iommu_domain *domain); +  	unsigned long pgsize_bitmap;  }; @@ -157,6 +169,10 @@ extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,  extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,  				 void *data); +/* Window handling function prototypes */ +extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, +				      phys_addr_t offset, u64 size); +extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr);  /**   * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework   * @domain: the iommu domain where the fault has happened @@ -239,6 +255,18 @@ static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,  	return -ENODEV;  } +static inline int iommu_domain_window_enable(struct iommu_domain *domain, +					     u32 wnd_nr, phys_addr_t paddr, +					     u64 size) +{ +	return -ENODEV; +} + +static inline void iommu_domain_window_disable(struct iommu_domain *domain, +					       u32 wnd_nr) +{ +} +  static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,  					     unsigned long iova)  { diff --git a/include/linux/ipack.h b/include/linux/ipack.h index fea12cbb2ae..1888e06ddf6 100644 --- a/include/linux/ipack.h +++ b/include/linux/ipack.h @@ -207,19 +207,41 @@ int ipack_driver_register(struct ipack_driver *edrv, struct module *owner,  void ipack_driver_unregister(struct ipack_driver *edrv);  /** - *	ipack_device_register -- register an IPack device with the kernel - *	@dev: the new device to register. + *	ipack_device_init -- initialize an IPack device + * @dev: the new device to initialize.   * - *	Register a new IPack device ("module" in IndustryPack jargon). The call - *	is done by the carrier driver.  The carrier should populate the fields - *	bus and slot as well as the region array of @dev prior to calling this - *	function.  The rest of the fields will be allocated and populated - *	during registration. + * Initialize a new IPack device ("module" in IndustryPack jargon). The call + * is done by the carrier driver.  The carrier should populate the fields + * bus and slot as well as the region array of @dev prior to calling this + * function.  The rest of the fields will be allocated and populated + * during initalization.   * - *	Return zero on success or error code on failure. + * Return zero on success or error code on failure. + * + * NOTE: _Never_ directly free @dev after calling this function, even + * if it returned an error! Always use ipack_put_device() to give up the + * reference initialized in this function instead. + */ +int ipack_device_init(struct ipack_device *dev); + +/** + *	ipack_device_add -- Add an IPack device + * @dev: the new device to add. + * + * Add a new IPack device. The call is done by the carrier driver + * after calling ipack_device_init(). + * + * Return zero on success or error code on failure. + * + * NOTE: _Never_ directly free @dev after calling this function, even + * if it returned an error! Always use ipack_put_device() to give up the + * reference initialized in this function instead.   */ -int ipack_device_register(struct ipack_device *dev); -void ipack_device_unregister(struct ipack_device *dev); +int ipack_device_add(struct ipack_device *dev); +void ipack_device_del(struct ipack_device *dev); + +void ipack_get_device(struct ipack_device *dev); +void ipack_put_device(struct ipack_device *dev);  /**   * DEFINE_IPACK_DEVICE_TABLE - macro used to describe a IndustryPack table diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h index 1487e7906bb..1f9f56e2885 100644 --- a/include/linux/ipmi.h +++ b/include/linux/ipmi.h @@ -35,10 +35,6 @@  #include <uapi/linux/ipmi.h> - -/* - * The in-kernel interface. - */  #include <linux/list.h>  #include <linux/proc_fs.h> diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index faed1e357dd..850e95bc766 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -77,11 +77,6 @@ static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)  	return (struct ipv6hdr *)skb_transport_header(skb);  } -static inline __u8 ipv6_tclass(const struct ipv6hdr *iph) -{ -	return (ntohl(*(__be32 *)iph) >> 20) & 0xff; -} -  /*      This structure contains results of exthdrs parsing     as offsets from skb->nh. @@ -89,7 +84,7 @@ static inline __u8 ipv6_tclass(const struct ipv6hdr *iph)  struct inet6_skb_parm {  	int			iif; -	__u16			ra; +	__be16			ra;  	__u16			hop;  	__u16			dst0;  	__u16			srcrt; @@ -105,6 +100,7 @@ struct inet6_skb_parm {  #define IP6SKB_XFRM_TRANSFORMED	1  #define IP6SKB_FORWARDED	2  #define IP6SKB_REROUTED		4 +#define IP6SKB_ROUTERALERT	8  };  #define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb)) @@ -218,7 +214,7 @@ struct ipv6_pinfo {  	struct ipv6_mc_socklist	__rcu *ipv6_mc_list;  	struct ipv6_ac_socklist	*ipv6_ac_list; -	struct ipv6_fl_socklist *ipv6_fl_list; +	struct ipv6_fl_socklist __rcu *ipv6_fl_list;  	struct ipv6_txoptions	*opt;  	struct sk_buff		*pktoptions; diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index f5dbce50466..66017028dcb 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -37,7 +37,7 @@ void irq_work_sync(struct irq_work *work);  #ifdef CONFIG_IRQ_WORK  bool irq_work_needs_cpu(void);  #else -static bool irq_work_needs_cpu(void) { return false; } +static inline bool irq_work_needs_cpu(void) { return false; }  #endif  #endif /* _LINUX_IRQ_WORK_H */ diff --git a/include/linux/irqchip.h b/include/linux/irqchip.h new file mode 100644 index 00000000000..e0006f1d35a --- /dev/null +++ b/include/linux/irqchip.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Thomas Petazzoni + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef _LINUX_IRQCHIP_H +#define _LINUX_IRQCHIP_H + +void irqchip_init(void); + +#endif diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h new file mode 100644 index 00000000000..3fd8e4290a1 --- /dev/null +++ b/include/linux/irqchip/arm-gic.h @@ -0,0 +1,79 @@ +/* + *  include/linux/irqchip/arm-gic.h + * + *  Copyright (C) 2002 ARM Limited, 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 version 2 as + * published by the Free Software Foundation. + */ +#ifndef __LINUX_IRQCHIP_ARM_GIC_H +#define __LINUX_IRQCHIP_ARM_GIC_H + +#define GIC_CPU_CTRL			0x00 +#define GIC_CPU_PRIMASK			0x04 +#define GIC_CPU_BINPOINT		0x08 +#define GIC_CPU_INTACK			0x0c +#define GIC_CPU_EOI			0x10 +#define GIC_CPU_RUNNINGPRI		0x14 +#define GIC_CPU_HIGHPRI			0x18 + +#define GIC_DIST_CTRL			0x000 +#define GIC_DIST_CTR			0x004 +#define GIC_DIST_IGROUP			0x080 +#define GIC_DIST_ENABLE_SET		0x100 +#define GIC_DIST_ENABLE_CLEAR		0x180 +#define GIC_DIST_PENDING_SET		0x200 +#define GIC_DIST_PENDING_CLEAR		0x280 +#define GIC_DIST_ACTIVE_SET		0x300 +#define GIC_DIST_ACTIVE_CLEAR		0x380 +#define GIC_DIST_PRI			0x400 +#define GIC_DIST_TARGET			0x800 +#define GIC_DIST_CONFIG			0xc00 +#define GIC_DIST_SOFTINT		0xf00 + +#define GICH_HCR			0x0 +#define GICH_VTR			0x4 +#define GICH_VMCR			0x8 +#define GICH_MISR			0x10 +#define GICH_EISR0 			0x20 +#define GICH_EISR1 			0x24 +#define GICH_ELRSR0 			0x30 +#define GICH_ELRSR1 			0x34 +#define GICH_APR			0xf0 +#define GICH_LR0			0x100 + +#define GICH_HCR_EN			(1 << 0) +#define GICH_HCR_UIE			(1 << 1) + +#define GICH_LR_VIRTUALID		(0x3ff << 0) +#define GICH_LR_PHYSID_CPUID_SHIFT	(10) +#define GICH_LR_PHYSID_CPUID		(7 << GICH_LR_PHYSID_CPUID_SHIFT) +#define GICH_LR_STATE			(3 << 28) +#define GICH_LR_PENDING_BIT		(1 << 28) +#define GICH_LR_ACTIVE_BIT		(1 << 29) +#define GICH_LR_EOI			(1 << 19) + +#define GICH_MISR_EOI			(1 << 0) +#define GICH_MISR_U			(1 << 1) + +#ifndef __ASSEMBLY__ + +struct device_node; + +extern struct irq_chip gic_arch_extn; + +void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, +		    u32 offset, struct device_node *); +void gic_secondary_init(unsigned int); +void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); + +static inline void gic_init(unsigned int nr, int start, +			    void __iomem *dist , void __iomem *cpu) +{ +	gic_init_bases(nr, start, dist, cpu, 0, NULL); +} + +#endif /* __ASSEMBLY */ + +#endif diff --git a/include/linux/irqchip/arm-vic.h b/include/linux/irqchip/arm-vic.h new file mode 100644 index 00000000000..e3c82dc9575 --- /dev/null +++ b/include/linux/irqchip/arm-vic.h @@ -0,0 +1,36 @@ +/* + *  arch/arm/include/asm/hardware/vic.h + * + *  Copyright (c) ARM Limited 2003.  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ +#ifndef __ASM_ARM_HARDWARE_VIC_H +#define __ASM_ARM_HARDWARE_VIC_H + +#include <linux/types.h> + +#define VIC_RAW_STATUS			0x08 +#define VIC_INT_ENABLE			0x10	/* 1 = enable, 0 = disable */ +#define VIC_INT_ENABLE_CLEAR		0x14 + +struct device_node; +struct pt_regs; + +void __vic_init(void __iomem *base, int irq_start, u32 vic_sources, +		u32 resume_sources, struct device_node *node); +void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); + +#endif diff --git a/include/linux/irqchip/metag-ext.h b/include/linux/irqchip/metag-ext.h new file mode 100644 index 00000000000..697af0fe7c5 --- /dev/null +++ b/include/linux/irqchip/metag-ext.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 Imagination Technologies + */ + +#ifndef _LINUX_IRQCHIP_METAG_EXT_H_ +#define _LINUX_IRQCHIP_METAG_EXT_H_ + +struct irq_data; +struct platform_device; + +/* called from core irq code at init */ +int init_external_IRQ(void); + +/* + * called from SoC init_irq() callback to dynamically indicate the lack of + * HWMASKEXT registers. + */ +void meta_intc_no_mask(void); + +/* + * These allow SoCs to specialise the interrupt controller from their init_irq + * callbacks. + */ + +extern struct irq_chip meta_intc_edge_chip; +extern struct irq_chip meta_intc_level_chip; + +/* this should be called in the mask callback */ +void meta_intc_mask_irq_simple(struct irq_data *data); +/* this should be called in the unmask callback */ +void meta_intc_unmask_irq_simple(struct irq_data *data); + +#endif /* _LINUX_IRQCHIP_METAG_EXT_H_ */ diff --git a/include/linux/irqchip/metag.h b/include/linux/irqchip/metag.h new file mode 100644 index 00000000000..4ebdfb3101a --- /dev/null +++ b/include/linux/irqchip/metag.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2011 Imagination Technologies + */ + +#ifndef _LINUX_IRQCHIP_METAG_H_ +#define _LINUX_IRQCHIP_METAG_H_ + +#include <linux/errno.h> + +#ifdef CONFIG_METAG_PERFCOUNTER_IRQS +extern int init_internal_IRQ(void); +extern int internal_irq_map(unsigned int hw); +#else +static inline int init_internal_IRQ(void) +{ +	return 0; +} +static inline int internal_irq_map(unsigned int hw) +{ +	return -EINVAL; +} +#endif + +#endif /* _LINUX_IRQCHIP_METAG_H_ */ diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index e30b6634694..50e5a5e6a71 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -20,7 +20,6 @@  #ifndef __KERNEL__  #include "jfs_compat.h"  #define JBD2_DEBUG -#define jfs_debug jbd_debug  #else  #include <linux/types.h> @@ -57,7 +56,7 @@   * CONFIG_JBD2_DEBUG is on.   */  #define JBD2_EXPENSIVE_CHECKING -extern u8 jbd2_journal_enable_debug; +extern ushort jbd2_journal_enable_debug;  #define jbd_debug(n, f, a...)						\  	do {								\ @@ -397,35 +396,18 @@ struct jbd2_journal_handle  	int			h_err;  	/* Flags [no locking] */ -	unsigned int	h_sync:1;	/* sync-on-close */ -	unsigned int	h_jdata:1;	/* force data journaling */ -	unsigned int	h_aborted:1;	/* fatal error on handle */ -	unsigned int	h_cowing:1;	/* COWing block to snapshot */ - -	/* Number of buffers requested by user: -	 * (before adding the COW credits factor) */ -	unsigned int	h_base_credits:14; - -	/* Number of buffers the user is allowed to dirty: -	 * (counts only buffers dirtied when !h_cowing) */ -	unsigned int	h_user_credits:14; +	unsigned int	h_sync:		1;	/* sync-on-close */ +	unsigned int	h_jdata:	1;	/* force data journaling */ +	unsigned int	h_aborted:	1;	/* fatal error on handle */ +	unsigned int	h_type:		8;	/* for handle statistics */ +	unsigned int	h_line_no:	16;	/* for handle statistics */ +	unsigned long		h_start_jiffies; +	unsigned int		h_requested_credits;  #ifdef CONFIG_DEBUG_LOCK_ALLOC  	struct lockdep_map	h_lockdep_map;  #endif - -#ifdef CONFIG_JBD2_DEBUG -	/* COW debugging counters: */ -	unsigned int h_cow_moved; /* blocks moved to snapshot */ -	unsigned int h_cow_copied; /* blocks copied to snapshot */ -	unsigned int h_cow_ok_jh; /* blocks already COWed during current -				     transaction */ -	unsigned int h_cow_ok_bitmap; /* blocks not set in COW bitmap */ -	unsigned int h_cow_ok_mapped;/* blocks already mapped in snapshot */ -	unsigned int h_cow_bitmaps; /* COW bitmaps created */ -	unsigned int h_cow_excluded; /* blocks set in exclude bitmap */ -#endif  }; @@ -581,6 +563,11 @@ struct transaction_s  	unsigned long		t_start;  	/* +	 * When commit was requested +	 */ +	unsigned long		t_requested; + +	/*  	 * Checkpointing stats [j_checkpoint_sem]  	 */  	struct transaction_chp_stats_s t_chp_stats; @@ -637,6 +624,7 @@ struct transaction_s  struct transaction_run_stats_s {  	unsigned long		rs_wait; +	unsigned long		rs_request_delay;  	unsigned long		rs_running;  	unsigned long		rs_locked;  	unsigned long		rs_flushing; @@ -649,6 +637,7 @@ struct transaction_run_stats_s {  struct transaction_stats_s {  	unsigned long		ts_tid; +	unsigned long		ts_requested;  	struct transaction_run_stats_s run;  }; @@ -1086,7 +1075,8 @@ static inline handle_t *journal_current_handle(void)   */  extern handle_t *jbd2_journal_start(journal_t *, int nblocks); -extern handle_t *jbd2__journal_start(journal_t *, int nblocks, gfp_t gfp_mask); +extern handle_t *jbd2__journal_start(journal_t *, int nblocks, gfp_t gfp_mask, +				     unsigned int type, unsigned int line_no);  extern int	 jbd2_journal_restart(handle_t *, int nblocks);  extern int	 jbd2__journal_restart(handle_t *, int nblocks, gfp_t gfp_mask);  extern int	 jbd2_journal_extend (handle_t *, int nblocks); diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 239dbb9627c..2dac79c3919 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -390,7 +390,6 @@ extern struct pid *session_of_pgrp(struct pid *pgrp);  unsigned long int_sqrt(unsigned long);  extern void bust_spinlocks(int yes); -extern void wake_up_klogd(void);  extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */  extern int panic_timeout;  extern int panic_on_oops; @@ -398,7 +397,11 @@ 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); +enum lockdep_ok { +	LOCKDEP_STILL_OK, +	LOCKDEP_NOW_UNRELIABLE +}; +extern void add_taint(unsigned flag, enum lockdep_ok);  extern int test_taint(unsigned flag);  extern unsigned long get_taint(void);  extern int root_mountflags; diff --git a/include/linux/kexec.h b/include/linux/kexec.h index d0b8458a703..d78d28a733b 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -191,6 +191,7 @@ extern struct kimage *kexec_crash_image;  /* Location of a reserved region to hold the crash kernel.   */  extern struct resource crashk_res; +extern struct resource crashk_low_res;  typedef u32 note_buf_t[KEXEC_NOTE_BYTES/4];  extern note_buf_t __percpu *crash_notes;  extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; @@ -199,6 +200,10 @@ extern size_t vmcoreinfo_max_size;  int __init parse_crashkernel(char *cmdline, unsigned long long system_ram,  		unsigned long long *crash_size, unsigned long long *crash_base); +int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, +		unsigned long long *crash_size, unsigned long long *crash_base); +int parse_crashkernel_low(char *cmdline, unsigned long long system_ram, +		unsigned long long *crash_size, unsigned long long *crash_base);  int crash_shrink_memory(unsigned long new_size);  size_t crash_get_memory_size(void);  void crash_free_reserved_phys_range(unsigned long begin, unsigned long end); diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 4dff0c6ed58..c6e091bf39a 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -13,7 +13,6 @@  #ifndef _KGDB_H_  #define _KGDB_H_ -#include <linux/serial_8250.h>  #include <linux/linkage.h>  #include <linux/init.h>  #include <linux/atomic.h> diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 3319a696762..45c9b6a17bc 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h @@ -16,9 +16,6 @@  struct stable_node;  struct mem_cgroup; -struct page *ksm_does_need_to_copy(struct page *page, -			struct vm_area_struct *vma, unsigned long address); -  #ifdef CONFIG_KSM  int ksm_madvise(struct vm_area_struct *vma, unsigned long start,  		unsigned long end, int advice, unsigned long *vm_flags); @@ -73,15 +70,8 @@ static inline void set_page_stable_node(struct page *page,   * We'd like to make this conditional on vma->vm_flags & VM_MERGEABLE,   * but what if the vma was unmerged while the page was swapped out?   */ -static inline int ksm_might_need_to_copy(struct page *page, -			struct vm_area_struct *vma, unsigned long address) -{ -	struct anon_vma *anon_vma = page_anon_vma(page); - -	return anon_vma && -		(anon_vma->root != vma->anon_vma->root || -		 page->index != linear_page_index(vma, address)); -} +struct page *ksm_might_need_to_copy(struct page *page, +			struct vm_area_struct *vma, unsigned long address);  int page_referenced_ksm(struct page *page,  			struct mem_cgroup *memcg, unsigned long *vm_flags); @@ -113,10 +103,10 @@ static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start,  	return 0;  } -static inline int ksm_might_need_to_copy(struct page *page, +static inline struct page *ksm_might_need_to_copy(struct page *page,  			struct vm_area_struct *vma, unsigned long address)  { -	return 0; +	return page;  }  static inline int page_referenced_ksm(struct page *page, diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b7996a768eb..c1395825192 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -123,6 +123,8 @@ static inline bool is_error_page(struct page *page)  #define KVM_REQ_WATCHDOG          18  #define KVM_REQ_MASTERCLOCK_UPDATE 19  #define KVM_REQ_MCLOCK_INPROGRESS 20 +#define KVM_REQ_EPR_EXIT          21 +#define KVM_REQ_EOIBITMAP         22  #define KVM_USERSPACE_IRQ_SOURCE_ID		0  #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID	1 @@ -267,12 +269,11 @@ static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)  struct kvm_memory_slot {  	gfn_t base_gfn;  	unsigned long npages; -	unsigned long flags;  	unsigned long *dirty_bitmap;  	struct kvm_arch_memory_slot arch;  	unsigned long userspace_addr; -	int user_alloc; -	int id; +	u32 flags; +	short id;  };  static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) @@ -314,8 +315,12 @@ struct kvm_irq_routing_table {};  #endif +#ifndef KVM_PRIVATE_MEM_SLOTS +#define KVM_PRIVATE_MEM_SLOTS 0 +#endif +  #ifndef KVM_MEM_SLOTS_NUM -#define KVM_MEM_SLOTS_NUM (KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS) +#define KVM_MEM_SLOTS_NUM (KVM_USER_MEM_SLOTS + KVM_PRIVATE_MEM_SLOTS)  #endif  /* @@ -327,7 +332,7 @@ struct kvm_memslots {  	u64 generation;  	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]; +	short id_to_index[KVM_MEM_SLOTS_NUM];  };  struct kvm { @@ -425,7 +430,8 @@ 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); +void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new, +		     u64 last_generation);  static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)  { @@ -448,10 +454,10 @@ id_to_memslot(struct kvm_memslots *slots, int id)  int kvm_set_memory_region(struct kvm *kvm,  			  struct kvm_userspace_memory_region *mem, -			  int user_alloc); +			  bool user_alloc);  int __kvm_set_memory_region(struct kvm *kvm,  			    struct kvm_userspace_memory_region *mem, -			    int user_alloc); +			    bool user_alloc);  void kvm_arch_free_memslot(struct kvm_memory_slot *free,  			   struct kvm_memory_slot *dont);  int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages); @@ -459,11 +465,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,  				struct kvm_memory_slot *memslot,  				struct kvm_memory_slot old,  				struct kvm_userspace_memory_region *mem, -				int user_alloc); +				bool user_alloc);  void kvm_arch_commit_memory_region(struct kvm *kvm,  				struct kvm_userspace_memory_region *mem,  				struct kvm_memory_slot old, -				int user_alloc); +				bool user_alloc);  bool kvm_largepages_enabled(void);  void kvm_disable_largepages(void);  /* flush all memory translations */ @@ -512,7 +518,7 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,  int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,  			   void *data, unsigned long len);  int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, -			      gpa_t gpa); +			      gpa_t gpa, unsigned long len);  int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);  int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);  struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); @@ -533,6 +539,7 @@ void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);  void kvm_flush_remote_tlbs(struct kvm *kvm);  void kvm_reload_remote_mmus(struct kvm *kvm);  void kvm_make_mclock_inprogress_request(struct kvm *kvm); +void kvm_make_update_eoibitmap_request(struct kvm *kvm);  long kvm_arch_dev_ioctl(struct file *filp,  			unsigned int ioctl, unsigned long arg); @@ -550,7 +557,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,  int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,  				   struct  				   kvm_userspace_memory_region *mem, -				   int user_alloc); +				   bool user_alloc);  int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level);  long kvm_arch_vm_ioctl(struct file *filp,  		       unsigned int ioctl, unsigned long arg); @@ -686,6 +693,7 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level);  int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level);  int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm,  		int irq_source_id, int level); +bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin);  void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin);  void kvm_register_irq_ack_notifier(struct kvm *kvm,  				   struct kvm_irq_ack_notifier *kian); diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h index fa7cc7244cb..b0bcce0ddc9 100644 --- a/include/linux/kvm_types.h +++ b/include/linux/kvm_types.h @@ -71,6 +71,7 @@ struct gfn_to_hva_cache {  	u64 generation;  	gpa_t gpa;  	unsigned long hva; +	unsigned long len;  	struct kvm_memory_slot *memslot;  }; diff --git a/include/linux/leds-lp5521.h b/include/linux/leds-lp5521.h deleted file mode 100644 index 3f071ec019b..00000000000 --- a/include/linux/leds-lp5521.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * LP5521 LED chip driver. - * - * Copyright (C) 2010 Nokia Corporation - * - * Contact: Samu Onkalo <samu.p.onkalo@nokia.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. - * - * 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_LP5521_H -#define __LINUX_LP5521_H - -/* See Documentation/leds/leds-lp5521.txt */ - -struct lp5521_led_config { -	char		*name; -	u8		chan_nr; -	u8		led_current; /* mA x10, 0 if led is not connected */ -	u8		max_current; -}; - -struct lp5521_led_pattern { -	u8 *r; -	u8 *g; -	u8 *b; -	u8 size_r; -	u8 size_g; -	u8 size_b; -}; - -#define LP5521_CLOCK_AUTO	0 -#define LP5521_CLOCK_INT	1 -#define LP5521_CLOCK_EXT	2 - -/* Bits in CONFIG register */ -#define LP5521_PWM_HF			0x40	/* PWM: 0 = 256Hz, 1 = 558Hz */ -#define LP5521_PWRSAVE_EN		0x20	/* 1 = Power save mode */ -#define LP5521_CP_MODE_OFF		0	/* Charge pump (CP) off */ -#define LP5521_CP_MODE_BYPASS		8	/* CP forced to bypass mode */ -#define LP5521_CP_MODE_1X5		0x10	/* CP forced to 1.5x mode */ -#define LP5521_CP_MODE_AUTO		0x18	/* Automatic mode selection */ -#define LP5521_R_TO_BATT		4	/* R out: 0 = CP, 1 = Vbat */ -#define LP5521_CLK_SRC_EXT		0	/* Ext-clk source (CLK_32K) */ -#define LP5521_CLK_INT			1	/* Internal clock */ -#define LP5521_CLK_AUTO			2	/* Automatic clock selection */ - -struct lp5521_platform_data { -	struct lp5521_led_config *led_config; -	u8	num_channels; -	u8	clock_mode; -	int	(*setup_resources)(void); -	void	(*release_resources)(void); -	void	(*enable)(bool state); -	const char *label; -	u8	update_config; -	struct lp5521_led_pattern *patterns; -	int num_patterns; -}; - -#endif /* __LINUX_LP5521_H */ diff --git a/include/linux/leds-lp5523.h b/include/linux/leds-lp5523.h deleted file mode 100644 index 727877fb406..00000000000 --- a/include/linux/leds-lp5523.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * LP5523 LED Driver - * - * Copyright (C) 2010 Nokia Corporation - * - * Contact: Samu Onkalo <samu.p.onkalo@nokia.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. - * - * 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_LP5523_H -#define __LINUX_LP5523_H - -/* See Documentation/leds/leds-lp5523.txt */ - -struct lp5523_led_config { -	const char	*name; -	u8		chan_nr; -	u8		led_current; /* mA x10, 0 if led is not connected */ -	u8		max_current; -}; - -#define LP5523_CLOCK_AUTO	0 -#define LP5523_CLOCK_INT	1 -#define LP5523_CLOCK_EXT	2 - -struct lp5523_platform_data { -	struct lp5523_led_config *led_config; -	u8	num_channels; -	u8	clock_mode; -	int	(*setup_resources)(void); -	void	(*release_resources)(void); -	void	(*enable)(bool state); -	const	char *label; -}; - -#endif /* __LINUX_LP5523_H */ diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h index 33a07116748..a65e9646e4b 100644 --- a/include/linux/leds_pwm.h +++ b/include/linux/leds_pwm.h @@ -7,7 +7,7 @@  struct led_pwm {  	const char	*name;  	const char	*default_trigger; -	unsigned	pwm_id; +	unsigned	pwm_id __deprecated;  	u8 		active_low;  	unsigned 	max_brightness;  	unsigned	pwm_period_ns; diff --git a/include/linux/libata.h b/include/linux/libata.h index 649e5f86b5f..eae7a053dc5 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -398,6 +398,7 @@ enum {  	ATA_HORKAGE_NOSETXFER	= (1 << 14),	/* skip SETXFER, SATA only */  	ATA_HORKAGE_BROKEN_FPDMA_AA	= (1 << 15),	/* skip AA */  	ATA_HORKAGE_DUMP_ID	= (1 << 16),	/* dump IDENTIFY data */ +	ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17),	/* Set max sects to 65535 */  	 /* DMA mask for user DMA control: User visible values; DO NOT  	    renumber */ @@ -620,6 +621,9 @@ struct ata_device {  	union acpi_object	*gtf_cache;  	unsigned int		gtf_filter;  #endif +#ifdef CONFIG_SATA_ZPODD +	void			*zpodd; +#endif  	struct device		tdev;  	/* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */  	u64			n_sectors;	/* size of device, if ATA */ diff --git a/include/linux/libps2.h b/include/linux/libps2.h index 79603a6c356..4ad06e824f7 100644 --- a/include/linux/libps2.h +++ b/include/linux/libps2.h @@ -36,7 +36,7 @@ struct ps2dev {  	wait_queue_head_t wait;  	unsigned long flags; -	unsigned char cmdbuf[6]; +	unsigned char cmdbuf[8];  	unsigned char cmdcnt;  	unsigned char nak;  }; diff --git a/include/linux/list.h b/include/linux/list.h index cc6d2aa6b41..6a1f8df9144 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -666,54 +666,51 @@ static inline void hlist_move_list(struct hlist_head *old,  	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \  	     pos = n) +#define hlist_entry_safe(ptr, type, member) \ +	({ typeof(ptr) ____ptr = (ptr); \ +	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ +	}) +  /**   * hlist_for_each_entry	- iterate over list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry(tpos, pos, head, member)			 \ -	for (pos = (head)->first;					 \ -	     pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry(pos, head, member)				\ +	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ +	     pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue(tpos, pos, member)		 \ -	for (pos = (pos)->next;						 \ -	     pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry_continue(pos, member)			\ +	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ +	     pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_from - iterate over a hlist continuing from current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_from(tpos, pos, member)			 \ -	for (; pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry_from(pos, member)				\ +	for (; pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @n:		another &struct hlist_node to use as temporary storage   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_safe(tpos, pos, n, head, member) 		 \ -	for (pos = (head)->first;					 \ -	     pos && ({ n = pos->next; 1; }) && 				 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = n) +#define hlist_for_each_entry_safe(pos, n, head, member) 		\ +	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ +	     pos && ({ n = pos->member.next; 1; });			\ +	     pos = hlist_entry_safe(n, typeof(*pos), member))  #endif diff --git a/include/linux/llist.h b/include/linux/llist.h index d0ab98f73d3..a5199f6d0e8 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h @@ -125,31 +125,6 @@ static inline void init_llist_head(struct llist_head *list)  	     (pos) = llist_entry((pos)->member.next, typeof(*(pos)), member))  /** - * llist_for_each_entry_safe - iterate safely against remove over some entries - * of lock-less list of given type. - * @pos:	the type * to use as a loop cursor. - * @n:		another type * to use as a temporary storage. - * @node:	the fist entry of deleted list entries. - * @member:	the name of the llist_node with the struct. - * - * In general, some entries of the lock-less list can be traversed - * safely only after being removed from list, so start with an entry - * instead of list head. This variant allows removal of entries - * as we iterate. - * - * If being used on entries deleted from lock-less list directly, the - * traverse order is from the newest to the oldest added entry.  If - * you want to traverse from the oldest to the newest, you must - * reverse the order by yourself before traversing. - */ -#define llist_for_each_entry_safe(pos, n, node, member)		\ -	for ((pos) = llist_entry((node), typeof(*(pos)), member),	\ -	     (n) = (pos)->member.next;					\ -	     &(pos)->member != NULL;					\ -	     (pos) = llist_entry(n, typeof(*(pos)), member),		\ -	     (n) = (&(pos)->member != NULL) ? (pos)->member.next : NULL) - -/**   * llist_empty - tests whether a lock-less list is empty   * @head:	the list to test   * diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index f5a051a7927..dcaad79f54e 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -212,7 +212,8 @@ int		  nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout)  __be32		  nlmclnt_grant(const struct sockaddr *addr,  				const struct nlm_lock *lock);  void		  nlmclnt_recovery(struct nlm_host *); -int		  nlmclnt_reclaim(struct nlm_host *, struct file_lock *); +int		  nlmclnt_reclaim(struct nlm_host *, struct file_lock *, +				  struct nlm_rqst *);  void		  nlmclnt_next_cookie(struct nlm_cookie *);  /* @@ -291,7 +292,7 @@ int           nlmsvc_unlock_all_by_ip(struct sockaddr *server_addr);  static inline struct inode *nlmsvc_file_inode(struct nlm_file *file)  { -	return file->f_file->f_path.dentry->d_inode; +	return file_inode(file->f_file);  }  static inline int __nlm_privileged_request4(const struct sockaddr *sap) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 2bca44b0893..f1e877b79ed 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -359,7 +359,9 @@ extern void lockdep_trace_alloc(gfp_t mask);  #define lockdep_depth(tsk)	(debug_locks ? (tsk)->lockdep_depth : 0) -#define lockdep_assert_held(l)	WARN_ON(debug_locks && !lockdep_is_held(l)) +#define lockdep_assert_held(l)	do {				\ +		WARN_ON(debug_locks && !lockdep_is_held(l));	\ +	} while (0)  #define lockdep_recursing(tsk)	((tsk)->lockdep_recursion) @@ -410,7 +412,7 @@ struct lock_class_key { };  #define lockdep_depth(tsk)	(0) -#define lockdep_assert_held(l)			do { } while (0) +#define lockdep_assert_held(l)			do { (void)(l); } while (0)  #define lockdep_recursing(tsk)			(0) diff --git a/include/linux/lzo.h b/include/linux/lzo.h index d793497ec1c..a0848d9377e 100644 --- a/include/linux/lzo.h +++ b/include/linux/lzo.h @@ -4,28 +4,28 @@   *  LZO Public Kernel Interface   *  A mini subset of the LZO real-time data compression library   * - *  Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <markus@oberhumer.com> + *  Copyright (C) 1996-2012 Markus F.X.J. Oberhumer <markus@oberhumer.com>   *   *  The full LZO package can be found at:   *  http://www.oberhumer.com/opensource/lzo/   * - *  Changed for kernel use by: + *  Changed for Linux kernel use by:   *  Nitin Gupta <nitingupta910@gmail.com>   *  Richard Purdie <rpurdie@openedhand.com>   */ -#define LZO1X_MEM_COMPRESS	(16384 * sizeof(unsigned char *)) -#define LZO1X_1_MEM_COMPRESS	LZO1X_MEM_COMPRESS +#define LZO1X_1_MEM_COMPRESS	(8192 * sizeof(unsigned short)) +#define LZO1X_MEM_COMPRESS	LZO1X_1_MEM_COMPRESS  #define lzo1x_worst_compress(x) ((x) + ((x) / 16) + 64 + 3) -/* This requires 'workmem' of size LZO1X_1_MEM_COMPRESS */ +/* This requires 'wrkmem' of size LZO1X_1_MEM_COMPRESS */  int lzo1x_1_compress(const unsigned char *src, size_t src_len, -			unsigned char *dst, size_t *dst_len, void *wrkmem); +		     unsigned char *dst, size_t *dst_len, void *wrkmem);  /* safe decompression with overrun testing */  int lzo1x_decompress_safe(const unsigned char *src, size_t src_len, -			unsigned char *dst, size_t *dst_len); +			  unsigned char *dst, size_t *dst_len);  /*   * Return values (< 0 = Error) @@ -40,5 +40,6 @@ int lzo1x_decompress_safe(const unsigned char *src, size_t src_len,  #define LZO_E_EOF_NOT_FOUND		(-7)  #define LZO_E_INPUT_NOT_CONSUMED	(-8)  #define LZO_E_NOT_YET_IMPLEMENTED	(-9) +#define LZO_E_INVALID_ARGUMENT		(-10)  #endif diff --git a/include/linux/mailbox.h b/include/linux/mailbox.h new file mode 100644 index 00000000000..5161f63ec1c --- /dev/null +++ b/include/linux/mailbox.h @@ -0,0 +1,17 @@ +/* + * 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, see <http://www.gnu.org/licenses/>. + */ + +int pl320_ipc_transmit(u32 *data); +int pl320_ipc_register_notifier(struct notifier_block *nb); +int pl320_ipc_unregister_notifier(struct notifier_block *nb); diff --git a/include/linux/mei_cl_bus.h b/include/linux/mei_cl_bus.h new file mode 100644 index 00000000000..d14af7b722e --- /dev/null +++ b/include/linux/mei_cl_bus.h @@ -0,0 +1,44 @@ +#ifndef _LINUX_MEI_CL_BUS_H +#define _LINUX_MEI_CL_BUS_H + +#include <linux/device.h> +#include <linux/uuid.h> + +struct mei_cl_device; + +struct mei_cl_driver { +	struct device_driver driver; +	const char *name; + +	const struct mei_cl_device_id *id_table; + +	int (*probe)(struct mei_cl_device *dev, +		     const struct mei_cl_device_id *id); +	int (*remove)(struct mei_cl_device *dev); +}; + +int __mei_cl_driver_register(struct mei_cl_driver *driver, +				struct module *owner); +#define mei_cl_driver_register(driver)             \ +	__mei_cl_driver_register(driver, THIS_MODULE) + +void mei_cl_driver_unregister(struct mei_cl_driver *driver); + +int mei_cl_send(struct mei_cl_device *device, u8 *buf, size_t length); +int mei_cl_recv(struct mei_cl_device *device, u8 *buf, size_t length); + +typedef void (*mei_cl_event_cb_t)(struct mei_cl_device *device, +			       u32 events, void *context); +int mei_cl_register_event_cb(struct mei_cl_device *device, +			  mei_cl_event_cb_t read_cb, void *context); + +#define MEI_CL_EVENT_RX 0 +#define MEI_CL_EVENT_TX 1 + +void *mei_cl_get_drvdata(const struct mei_cl_device *device); +void mei_cl_set_drvdata(struct mei_cl_device *device, void *data); + +int mei_cl_enable_device(struct mei_cl_device *device); +int mei_cl_disable_device(struct mei_cl_device *device); + +#endif /* _LINUX_MEI_CL_BUS_H */ diff --git a/include/linux/memblock.h b/include/linux/memblock.h index d452ee19106..f388203db7e 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -155,6 +155,7 @@ phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align,  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_mem_size(unsigned long limit_pfn);  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); diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 28bd5fa2ff2..d6183f06d8c 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -116,7 +116,6 @@ void mem_cgroup_iter_break(struct mem_cgroup *, struct mem_cgroup *);   * For memory reclaim.   */  int mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec); -int mem_cgroup_inactive_file_is_low(struct lruvec *lruvec);  int mem_cgroup_select_victim_node(struct mem_cgroup *memcg);  unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list);  void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); @@ -321,12 +320,6 @@ mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec)  	return 1;  } -static inline int -mem_cgroup_inactive_file_is_low(struct lruvec *lruvec) -{ -	return 1; -} -  static inline unsigned long  mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list lru)  { diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 4a45c4e5002..b6a3be7d47b 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -96,6 +96,7 @@ extern void __online_page_free(struct page *page);  #ifdef CONFIG_MEMORY_HOTREMOVE  extern bool is_pageblock_removable_nolock(struct page *page); +extern int arch_remove_memory(u64 start, u64 size);  #endif /* CONFIG_MEMORY_HOTREMOVE */  /* reasonably generic interface to expand the physical pages in a zone  */ @@ -173,17 +174,16 @@ static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat)  #endif /* CONFIG_NUMA */  #endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ -#ifdef CONFIG_SPARSEMEM_VMEMMAP +#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE +extern void register_page_bootmem_info_node(struct pglist_data *pgdat); +#else  static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)  {  } -static inline void put_page_bootmem(struct page *page) -{ -} -#else -extern void register_page_bootmem_info_node(struct pglist_data *pgdat); -extern void put_page_bootmem(struct page *page);  #endif +extern void put_page_bootmem(struct page *page); +extern void get_page_bootmem(unsigned long ingo, struct page *page, +			     unsigned long type);  /*   * Lock for memory hotplug guarantees 1) all callbacks for memory hotplug @@ -233,6 +233,7 @@ static inline void unlock_memory_hotplug(void) {}  #ifdef CONFIG_MEMORY_HOTREMOVE  extern int is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); +extern void try_offline_node(int nid);  #else  static inline int is_mem_section_removable(unsigned long pfn, @@ -240,6 +241,8 @@ static inline int is_mem_section_removable(unsigned long pfn,  {  	return 0;  } + +static inline void try_offline_node(int nid) {}  #endif /* CONFIG_MEMORY_HOTREMOVE */  extern int mem_online_node(int nid); @@ -247,7 +250,8 @@ extern int add_memory(int nid, u64 start, u64 size);  extern int arch_add_memory(int nid, u64 start, u64 size);  extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);  extern int offline_memory_block(struct memory_block *mem); -extern int remove_memory(u64 start, u64 size); +extern bool is_memblock_offlined(struct memory_block *mem); +extern int remove_memory(int nid, u64 start, u64 size);  extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,  								int nr_pages);  extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms); diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h index 478672ed0c3..e94537befab 100644 --- a/include/linux/mfd/88pm80x.h +++ b/include/linux/mfd/88pm80x.h @@ -365,5 +365,5 @@ static inline int pm80x_dev_resume(struct device *dev)  extern int pm80x_init(struct i2c_client *client,  		      const struct i2c_device_id *id); -extern int pm80x_deinit(struct i2c_client *client); +extern int pm80x_deinit(void);  #endif /* __LINUX_MFD_88PM80X_H */ diff --git a/include/linux/mfd/abx500.h b/include/linux/mfd/abx500.h index e53dcfeaee6..9ead60bc66b 100644 --- a/include/linux/mfd/abx500.h +++ b/include/linux/mfd/abx500.h @@ -131,7 +131,7 @@ struct abx500_maxim_parameters {   * @nominal_voltage:		Nominal voltage of the battery in mV   * @termination_vol:		max voltage upto which battery can be charged   * @termination_curr		battery charging termination current in mA - * @recharge_vol		battery voltage limit that will trigger a new + * @recharge_cap		battery capacity limit that will trigger a new   *				full charging cycle in the case where maintenan-   *				-ce charging has been disabled   * @normal_cur_lvl:		charger current in normal state in mA @@ -160,7 +160,7 @@ struct abx500_battery_type {  	int nominal_voltage;  	int termination_vol;  	int termination_curr; -	int recharge_vol; +	int recharge_cap;  	int normal_cur_lvl;  	int normal_vol_lvl;  	int maint_a_cur_lvl; @@ -224,6 +224,7 @@ struct abx500_bm_charger_parameters {   * @bkup_bat_v		voltage which we charge the backup battery with   * @bkup_bat_i		current which we charge the backup battery with   * @no_maintenance	indicates that maintenance charging is disabled + * @capacity_scaling    indicates whether capacity scaling is to be used   * @abx500_adc_therm	placement of thermistor, batctrl or battemp adc   * @chg_unknown_bat	flag to enable charging of unknown batteries   * @enable_overshoot	flag to enable VBAT overshoot control @@ -253,7 +254,11 @@ struct abx500_bm_data {  	int usb_safety_tmr_h;  	int bkup_bat_v;  	int bkup_bat_i; +	bool autopower_cfg; +	bool ac_enabled; +	bool usb_enabled;  	bool no_maintenance; +	bool capacity_scaling;  	bool chg_unknown_bat;  	bool enable_overshoot;  	bool auto_trig; @@ -277,9 +282,9 @@ enum {  	NTC_INTERNAL,  }; -int bmdevs_of_probe(struct device *dev, -		struct device_node *np, -		struct abx500_bm_data **battery); +int ab8500_bm_of_probe(struct device *dev, +		       struct device_node *np, +		       struct abx500_bm_data *bm);  int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg,  	u8 value); @@ -306,6 +311,7 @@ int abx500_mask_and_set_register_interruptible(struct device *dev, u8 bank,  int abx500_get_chip_id(struct device *dev);  int abx500_event_registers_startup_state_get(struct device *dev, u8 *event);  int abx500_startup_irq_enabled(struct device *dev, unsigned int irq); +void abx500_dump_all_banks(void);  struct abx500_ops {  	int (*get_chip_id) (struct device *); @@ -316,6 +322,7 @@ struct abx500_ops {  	int (*mask_and_set_register) (struct device *, u8, u8, u8, u8);  	int (*event_registers_startup_state_get) (struct device *, u8 *);  	int (*startup_irq_enabled) (struct device *, unsigned int); +	void (*dump_all_banks) (struct device *);  };  int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops); diff --git a/include/linux/mfd/abx500/ab8500-bm.h b/include/linux/mfd/abx500/ab8500-bm.h index 9bd037df97d..8d35bfe164c 100644 --- a/include/linux/mfd/abx500/ab8500-bm.h +++ b/include/linux/mfd/abx500/ab8500-bm.h @@ -23,6 +23,7 @@   * Bank : 0x5   */  #define AB8500_USB_LINE_STAT_REG	0x80 +#define AB8500_USB_LINK1_STAT_REG	0x94  /*   * Charger / status register offfsets @@ -225,6 +226,8 @@  /* BatCtrl Current Source Constants */  #define BAT_CTRL_7U_ENA			0x01  #define BAT_CTRL_20U_ENA		0x02 +#define BAT_CTRL_18U_ENA		0x01 +#define BAT_CTRL_16U_ENA		0x02  #define BAT_CTRL_CMP_ENA		0x04  #define FORCE_BAT_CTRL_CMP_HIGH		0x08  #define BAT_CTRL_PULL_UP_ENA		0x10 @@ -355,6 +358,7 @@ struct ab8500_bm_charger_parameters {   * @bkup_bat_v		voltage which we charge the backup battery with   * @bkup_bat_i		current which we charge the backup battery with   * @no_maintenance	indicates that maintenance charging is disabled + * @capacity_scaling    indicates whether capacity scaling is to be used   * @adc_therm		placement of thermistor, batctrl or battemp adc   * @chg_unknown_bat	flag to enable charging of unknown batteries   * @enable_overshoot	flag to enable VBAT overshoot control @@ -383,6 +387,7 @@ struct ab8500_bm_data {  	int bkup_bat_v;  	int bkup_bat_i;  	bool no_maintenance; +	bool capacity_scaling;  	bool chg_unknown_bat;  	bool enable_overshoot;  	enum abx500_adc_therm adc_therm; @@ -399,26 +404,6 @@ struct ab8500_bm_data {  	const struct ab8500_fg_parameters *fg_params;  }; -struct ab8500_charger_platform_data { -	char **supplied_to; -	size_t num_supplicants; -	bool autopower_cfg; -}; - -struct ab8500_btemp_platform_data { -	char **supplied_to; -	size_t num_supplicants; -}; - -struct ab8500_fg_platform_data { -	char **supplied_to; -	size_t num_supplicants; -}; - -struct ab8500_chargalg_platform_data { -	char **supplied_to; -	size_t num_supplicants; -};  struct ab8500_btemp;  struct ab8500_gpadc;  struct ab8500_fg; @@ -434,20 +419,10 @@ struct ab8500_fg *ab8500_fg_get(void);  int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev);  int ab8500_fg_inst_curr_start(struct ab8500_fg *di);  int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res); +int ab8500_fg_inst_curr_started(struct ab8500_fg *di);  int ab8500_fg_inst_curr_done(struct ab8500_fg *di);  #else  static struct abx500_bm_data ab8500_bm_data; - -static inline int ab8500_fg_inst_curr_start(struct ab8500_fg *di) -{ -	return -ENODEV; -} - -static inline int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res) -{ -	return -ENODEV; -} -  #endif  #endif /* _AB8500_BM_H */ diff --git a/include/linux/mfd/abx500/ab8500-gpio.h b/include/linux/mfd/abx500/ab8500-gpio.h index 2387c207ea8..172b2f201ae 100644 --- a/include/linux/mfd/abx500/ab8500-gpio.h +++ b/include/linux/mfd/abx500/ab8500-gpio.h @@ -14,10 +14,20 @@   * registers.   */ -struct ab8500_gpio_platform_data { +struct abx500_gpio_platform_data {  	int gpio_base; -	u32 irq_base; -	u8  config_reg[8]; +}; + +enum abx500_gpio_pull_updown { +	ABX500_GPIO_PULL_DOWN = 0x0, +	ABX500_GPIO_PULL_NONE = 0x1, +	ABX500_GPIO_PULL_UP = 0x3, +}; + +enum abx500_gpio_vinsel { +	ABX500_GPIO_VINSEL_VBAT = 0x0, +	ABX500_GPIO_VINSEL_VIN_1V8 = 0x1, +	ABX500_GPIO_VINSEL_VDD_BIF = 0x2,  };  #endif /* _AB8500_GPIO_H */ diff --git a/include/linux/mfd/abx500/ab8500-sysctrl.h b/include/linux/mfd/abx500/ab8500-sysctrl.h index 10eb50973c3..ebf12e793db 100644 --- a/include/linux/mfd/abx500/ab8500-sysctrl.h +++ b/include/linux/mfd/abx500/ab8500-sysctrl.h @@ -37,6 +37,11 @@ static inline int ab8500_sysctrl_clear(u16 reg, u8 bits)  	return ab8500_sysctrl_write(reg, bits, 0);  } +/* Configuration data for SysClkReq1RfClkBuf - SysClkReq8RfClkBuf */ +struct ab8500_sysctrl_platform_data { +	u8 initial_req_buf_config[8]; +}; +  /* Registers */  #define AB8500_TURNONSTATUS		0x100  #define AB8500_RESETSTATUS		0x101 diff --git a/include/linux/mfd/abx500/ab8500.h b/include/linux/mfd/abx500/ab8500.h index 1cb5698b4d7..9db0bda446a 100644 --- a/include/linux/mfd/abx500/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h @@ -24,7 +24,7 @@ enum ab8500_version {  	AB8500_VERSION_AB8500 = 0x0,  	AB8500_VERSION_AB8505 = 0x1,  	AB8500_VERSION_AB9540 = 0x2, -	AB8500_VERSION_AB8540 = 0x3, +	AB8500_VERSION_AB8540 = 0x4,  	AB8500_VERSION_UNDEFINED,  }; @@ -32,6 +32,7 @@ enum ab8500_version {  #define AB8500_CUTEARLY	0x00  #define AB8500_CUT1P0	0x10  #define AB8500_CUT1P1	0x11 +#define AB8500_CUT1P2	0x12 /* Only valid for AB8540 */  #define AB8500_CUT2P0	0x20  #define AB8500_CUT3P0	0x30  #define AB8500_CUT3P3	0x33 @@ -39,6 +40,7 @@ enum ab8500_version {  /*   * AB8500 bank addresses   */ +#define AB8500_M_FSM_RANK	0x0  #define AB8500_SYS_CTRL1_BLOCK	0x1  #define AB8500_SYS_CTRL2_BLOCK	0x2  #define AB8500_REGU_CTRL1	0x3 @@ -58,6 +60,7 @@ enum ab8500_version {  #define AB8500_DEVELOPMENT	0x11  #define AB8500_DEBUG		0x12  #define AB8500_PROD_TEST	0x13 +#define AB8500_STE_TEST		0x14  #define AB8500_OTP_EMUL		0x15  /* @@ -65,11 +68,11 @@ enum ab8500_version {   * Values used to index into array ab8500_irq_regoffset[] defined in   * drivers/mdf/ab8500-core.c   */ -/* Definitions for AB8500 and AB9540 */ +/* Definitions for AB8500, AB9540 and AB8540 */  /* ab8500_irq_regoffset[0] -> IT[Source|Latch|Mask]1 */  #define AB8500_INT_MAIN_EXT_CH_NOT_OK	0 /* not 8505/9540 */ -#define AB8500_INT_UN_PLUG_TV_DET	1 /* not 8505/9540 */ -#define AB8500_INT_PLUG_TV_DET		2 /* not 8505/9540 */ +#define AB8500_INT_UN_PLUG_TV_DET	1 /* not 8505/9540/8540 */ +#define AB8500_INT_PLUG_TV_DET		2 /* not 8505/9540/8540 */  #define AB8500_INT_TEMP_WARM		3  #define AB8500_INT_PON_KEY2DB_F		4  #define AB8500_INT_PON_KEY2DB_R		5 @@ -77,18 +80,19 @@ enum ab8500_version {  #define AB8500_INT_PON_KEY1DB_R		7  /* ab8500_irq_regoffset[1] -> IT[Source|Latch|Mask]2 */  #define AB8500_INT_BATT_OVV		8 -#define AB8500_INT_MAIN_CH_UNPLUG_DET	10 /* not 8505 */ -#define AB8500_INT_MAIN_CH_PLUG_DET	11 /* not 8505 */ +#define AB8500_INT_MAIN_CH_UNPLUG_DET	10 /* not 8505/8540 */ +#define AB8500_INT_MAIN_CH_PLUG_DET	11 /* not 8505/8540 */  #define AB8500_INT_VBUS_DET_F		14  #define AB8500_INT_VBUS_DET_R		15  /* ab8500_irq_regoffset[2] -> IT[Source|Latch|Mask]3 */  #define AB8500_INT_VBUS_CH_DROP_END	16  #define AB8500_INT_RTC_60S		17  #define AB8500_INT_RTC_ALARM		18 +#define AB8540_INT_BIF_INT		19  #define AB8500_INT_BAT_CTRL_INDB	20  #define AB8500_INT_CH_WD_EXP		21  #define AB8500_INT_VBUS_OVV		22 -#define AB8500_INT_MAIN_CH_DROP_END	23 /* not 8505/9540 */ +#define AB8500_INT_MAIN_CH_DROP_END	23 /* not 8505/9540/8540 */  /* ab8500_irq_regoffset[3] -> IT[Source|Latch|Mask]4 */  #define AB8500_INT_CCN_CONV_ACC		24  #define AB8500_INT_INT_AUD		25 @@ -99,7 +103,7 @@ enum ab8500_version {  #define AB8500_INT_BUP_CHG_NOT_OK	30  #define AB8500_INT_BUP_CHG_OK		31  /* ab8500_irq_regoffset[4] -> IT[Source|Latch|Mask]5 */ -#define AB8500_INT_GP_HW_ADC_CONV_END	32 /* not 8505 */ +#define AB8500_INT_GP_HW_ADC_CONV_END	32 /* not 8505/8540 */  #define AB8500_INT_ACC_DETECT_1DB_F	33  #define AB8500_INT_ACC_DETECT_1DB_R	34  #define AB8500_INT_ACC_DETECT_22DB_F	35 @@ -108,23 +112,23 @@ enum ab8500_version {  #define AB8500_INT_ACC_DETECT_21DB_R	38  #define AB8500_INT_GP_SW_ADC_CONV_END	39  /* ab8500_irq_regoffset[5] -> IT[Source|Latch|Mask]7 */ -#define AB8500_INT_GPIO6R		40 /* not 8505/9540 */ -#define AB8500_INT_GPIO7R		41 /* not 8505/9540 */ -#define AB8500_INT_GPIO8R		42 /* not 8505/9540 */ -#define AB8500_INT_GPIO9R		43 /* not 8505/9540 */ -#define AB8500_INT_GPIO10R		44 -#define AB8500_INT_GPIO11R		45 -#define AB8500_INT_GPIO12R		46 /* not 8505 */ -#define AB8500_INT_GPIO13R		47 +#define AB8500_INT_GPIO6R		40 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO7R		41 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO8R		42 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO9R		43 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO10R		44 /* not 8540 */ +#define AB8500_INT_GPIO11R		45 /* not 8540 */ +#define AB8500_INT_GPIO12R		46 /* not 8505/8540 */ +#define AB8500_INT_GPIO13R		47 /* not 8540 */  /* ab8500_irq_regoffset[6] -> IT[Source|Latch|Mask]8 */ -#define AB8500_INT_GPIO24R		48 /* not 8505 */ -#define AB8500_INT_GPIO25R		49 /* not 8505 */ -#define AB8500_INT_GPIO36R		50 /* not 8505/9540 */ -#define AB8500_INT_GPIO37R		51 /* not 8505/9540 */ -#define AB8500_INT_GPIO38R		52 /* not 8505/9540 */ -#define AB8500_INT_GPIO39R		53 /* not 8505/9540 */ -#define AB8500_INT_GPIO40R		54 -#define AB8500_INT_GPIO41R		55 +#define AB8500_INT_GPIO24R		48 /* not 8505/8540 */ +#define AB8500_INT_GPIO25R		49 /* not 8505/8540 */ +#define AB8500_INT_GPIO36R		50 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO37R		51 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO38R		52 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO39R		53 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO40R		54 /* not 8540 */ +#define AB8500_INT_GPIO41R		55 /* not 8540 */  /* ab8500_irq_regoffset[7] -> IT[Source|Latch|Mask]9 */  #define AB8500_INT_GPIO6F		56 /* not 8505/9540 */  #define AB8500_INT_GPIO7F		57 /* not 8505/9540 */ @@ -135,14 +139,14 @@ enum ab8500_version {  #define AB8500_INT_GPIO12F		62 /* not 8505 */  #define AB8500_INT_GPIO13F		63  /* ab8500_irq_regoffset[8] -> IT[Source|Latch|Mask]10 */ -#define AB8500_INT_GPIO24F		64 /* not 8505 */ -#define AB8500_INT_GPIO25F		65 /* not 8505 */ -#define AB8500_INT_GPIO36F		66 /* not 8505/9540 */ -#define AB8500_INT_GPIO37F		67 /* not 8505/9540 */ -#define AB8500_INT_GPIO38F		68 /* not 8505/9540 */ -#define AB8500_INT_GPIO39F		69 /* not 8505/9540 */ -#define AB8500_INT_GPIO40F		70 -#define AB8500_INT_GPIO41F		71 +#define AB8500_INT_GPIO24F		64 /* not 8505/8540 */ +#define AB8500_INT_GPIO25F		65 /* not 8505/8540 */ +#define AB8500_INT_GPIO36F		66 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO37F		67 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO38F		68 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO39F		69 /* not 8505/9540/8540 */ +#define AB8500_INT_GPIO40F		70 /* not 8540 */ +#define AB8500_INT_GPIO41F		71 /* not 8540 */  /* ab8500_irq_regoffset[9] -> IT[Source|Latch|Mask]12 */  #define AB8500_INT_ADP_SOURCE_ERROR	72  #define AB8500_INT_ADP_SINK_ERROR	73 @@ -160,42 +164,44 @@ enum ab8500_version {  #define AB8500_INT_SRP_DETECT		88  #define AB8500_INT_USB_CHARGER_NOT_OKR	89  #define AB8500_INT_ID_WAKEUP_R		90 +#define AB8500_INT_ID_DET_PLUGR         91 /* 8505/9540 cut2.0 */  #define AB8500_INT_ID_DET_R1R		92  #define AB8500_INT_ID_DET_R2R		93  #define AB8500_INT_ID_DET_R3R		94  #define AB8500_INT_ID_DET_R4R		95  /* ab8500_irq_regoffset[12] -> IT[Source|Latch|Mask]21 */ -#define AB8500_INT_ID_WAKEUP_F		96 -#define AB8500_INT_ID_DET_R1F		98 -#define AB8500_INT_ID_DET_R2F		99 -#define AB8500_INT_ID_DET_R3F		100 -#define AB8500_INT_ID_DET_R4F		101 -#define AB8500_INT_CHAUTORESTARTAFTSEC  102 +#define AB8500_INT_ID_WAKEUP_F		96 /* not 8505/9540 */ +#define AB8500_INT_ID_DET_PLUGF		97 /* 8505/9540 cut2.0 */ +#define AB8500_INT_ID_DET_R1F		98 /* not 8505/9540 */ +#define AB8500_INT_ID_DET_R2F		99 /* not 8505/9540 */ +#define AB8500_INT_ID_DET_R3F		100 /* not 8505/9540 */ +#define AB8500_INT_ID_DET_R4F		101 /* not 8505/9540 */ +#define AB8500_INT_CHAUTORESTARTAFTSEC	102 /* not 8505/9540 */  #define AB8500_INT_CHSTOPBYSEC		103  /* ab8500_irq_regoffset[13] -> IT[Source|Latch|Mask]22 */  #define AB8500_INT_USB_CH_TH_PROT_F	104 -#define AB8500_INT_USB_CH_TH_PROT_R    105 +#define AB8500_INT_USB_CH_TH_PROT_R	105  #define AB8500_INT_MAIN_CH_TH_PROT_F	106 /* not 8505/9540 */  #define AB8500_INT_MAIN_CH_TH_PROT_R	107 /* not 8505/9540 */  #define AB8500_INT_CHCURLIMNOHSCHIRP	109  #define AB8500_INT_CHCURLIMHSCHIRP	110  #define AB8500_INT_XTAL32K_KO		111 -/* Definitions for AB9540 */ +/* Definitions for AB9540 / AB8505 */  /* ab8500_irq_regoffset[14] -> IT[Source|Latch|Mask]13 */ -#define AB9540_INT_GPIO50R		113 -#define AB9540_INT_GPIO51R		114 /* not 8505 */ -#define AB9540_INT_GPIO52R		115 -#define AB9540_INT_GPIO53R		116 -#define AB9540_INT_GPIO54R		117 /* not 8505 */ +#define AB9540_INT_GPIO50R		113 /* not 8540 */ +#define AB9540_INT_GPIO51R		114 /* not 8505/8540 */ +#define AB9540_INT_GPIO52R		115 /* not 8540 */ +#define AB9540_INT_GPIO53R		116 /* not 8540 */ +#define AB9540_INT_GPIO54R		117 /* not 8505/8540 */  #define AB9540_INT_IEXT_CH_RF_BFN_R	118 -#define AB9540_INT_IEXT_CH_RF_BFN_F	119  /* ab8500_irq_regoffset[15] -> IT[Source|Latch|Mask]14 */ -#define AB9540_INT_GPIO50F		121 -#define AB9540_INT_GPIO51F		122 /* not 8505 */ -#define AB9540_INT_GPIO52F		123 -#define AB9540_INT_GPIO53F		124 -#define AB9540_INT_GPIO54F		125 /* not 8505 */ +#define AB9540_INT_GPIO50F		121 /* not 8540 */ +#define AB9540_INT_GPIO51F		122 /* not 8505/8540 */ +#define AB9540_INT_GPIO52F		123 /* not 8540 */ +#define AB9540_INT_GPIO53F		124 /* not 8540 */ +#define AB9540_INT_GPIO54F		125 /* not 8505/8540 */ +#define AB9540_INT_IEXT_CH_RF_BFN_F	126  /* ab8500_irq_regoffset[16] -> IT[Source|Latch|Mask]25 */  #define AB8505_INT_KEYSTUCK		128  #define AB8505_INT_IKR			129 @@ -204,6 +210,87 @@ enum ab8500_version {  #define AB8505_INT_KEYDEGLITCH		132  #define AB8505_INT_MODPWRSTATUSF	134  #define AB8505_INT_MODPWRSTATUSR	135 +/* ab8500_irq_regoffset[17] -> IT[Source|Latch|Mask]6 */ +#define AB8500_INT_HOOK_DET_NEG_F	138 +#define AB8500_INT_HOOK_DET_NEG_R	139 +#define AB8500_INT_HOOK_DET_POS_F	140 +#define AB8500_INT_HOOK_DET_POS_R	141 +#define AB8500_INT_PLUG_DET_COMP_F	142 +#define AB8500_INT_PLUG_DET_COMP_R	143 +/* ab8500_irq_regoffset[18] -> IT[Source|Latch|Mask]23 */ +#define AB8505_INT_COLL			144 +#define AB8505_INT_RESERR		145 +#define AB8505_INT_FRAERR		146 +#define AB8505_INT_COMERR		147 +#define AB8505_INT_SPDSET		148 +#define AB8505_INT_DSENT		149 +#define AB8505_INT_DREC			150 +#define AB8505_INT_ACC_INT		151 +/* ab8500_irq_regoffset[19] -> IT[Source|Latch|Mask]24 */ +#define AB8505_INT_NOPINT		152 +/* ab8540_irq_regoffset[20] -> IT[Source|Latch|Mask]26 */ +#define AB8540_INT_IDPLUGDETCOMPF	160 +#define AB8540_INT_IDPLUGDETCOMPR	161 +#define AB8540_INT_FMDETCOMPLOF		162 +#define AB8540_INT_FMDETCOMPLOR		163 +#define AB8540_INT_FMDETCOMPHIF		164 +#define AB8540_INT_FMDETCOMPHIR		165 +#define AB8540_INT_ID5VDETCOMPF		166 +#define AB8540_INT_ID5VDETCOMPR		167 +/* ab8540_irq_regoffset[21] -> IT[Source|Latch|Mask]27 */ +#define AB8540_INT_GPIO43F		168 +#define AB8540_INT_GPIO43R		169 +#define AB8540_INT_GPIO44F		170 +#define AB8540_INT_GPIO44R		171 +#define AB8540_INT_KEYPOSDETCOMPF	172 +#define AB8540_INT_KEYPOSDETCOMPR	173 +#define AB8540_INT_KEYNEGDETCOMPF	174 +#define AB8540_INT_KEYNEGDETCOMPR	175 +/* ab8540_irq_regoffset[22] -> IT[Source|Latch|Mask]28 */ +#define AB8540_INT_GPIO1VBATF		176 +#define AB8540_INT_GPIO1VBATR		177 +#define AB8540_INT_GPIO2VBATF		178 +#define AB8540_INT_GPIO2VBATR		179 +#define AB8540_INT_GPIO3VBATF		180 +#define AB8540_INT_GPIO3VBATR		181 +#define AB8540_INT_GPIO4VBATF		182 +#define AB8540_INT_GPIO4VBATR		183 +/* ab8540_irq_regoffset[23] -> IT[Source|Latch|Mask]29 */ +#define AB8540_INT_SYSCLKREQ2F		184 +#define AB8540_INT_SYSCLKREQ2R		185 +#define AB8540_INT_SYSCLKREQ3F		186 +#define AB8540_INT_SYSCLKREQ3R		187 +#define AB8540_INT_SYSCLKREQ4F		188 +#define AB8540_INT_SYSCLKREQ4R		189 +#define AB8540_INT_SYSCLKREQ5F		190 +#define AB8540_INT_SYSCLKREQ5R		191 +/* ab8540_irq_regoffset[24] -> IT[Source|Latch|Mask]30 */ +#define AB8540_INT_PWMOUT1F		192 +#define AB8540_INT_PWMOUT1R		193 +#define AB8540_INT_PWMCTRL0F		194 +#define AB8540_INT_PWMCTRL0R		195 +#define AB8540_INT_PWMCTRL1F		196 +#define AB8540_INT_PWMCTRL1R		197 +#define AB8540_INT_SYSCLKREQ6F		198 +#define AB8540_INT_SYSCLKREQ6R		199 +/* ab8540_irq_regoffset[25] -> IT[Source|Latch|Mask]31 */ +#define AB8540_INT_PWMEXTVIBRA1F	200 +#define AB8540_INT_PWMEXTVIBRA1R	201 +#define AB8540_INT_PWMEXTVIBRA2F	202 +#define AB8540_INT_PWMEXTVIBRA2R	203 +#define AB8540_INT_PWMOUT2F		204 +#define AB8540_INT_PWMOUT2R		205 +#define AB8540_INT_PWMOUT3F		206 +#define AB8540_INT_PWMOUT3R		207 +/* ab8540_irq_regoffset[26] -> IT[Source|Latch|Mask]32 */ +#define AB8540_INT_ADDATA2F		208 +#define AB8540_INT_ADDATA2R		209 +#define AB8540_INT_DADATA2F		210 +#define AB8540_INT_DADATA2R		211 +#define AB8540_INT_FSYNC2F		212 +#define AB8540_INT_FSYNC2R		213 +#define AB8540_INT_BITCLK2F		214 +#define AB8540_INT_BITCLK2R		215  /*   * AB8500_AB9540_NR_IRQS is used when configuring the IRQ numbers for the @@ -213,13 +300,24 @@ enum ab8500_version {   * which is larger.   */  #define AB8500_NR_IRQS			112 -#define AB8505_NR_IRQS			136 -#define AB9540_NR_IRQS			136 +#define AB8505_NR_IRQS			153 +#define AB9540_NR_IRQS			153 +#define AB8540_NR_IRQS			216  /* This is set to the roof of any AB8500 chip variant IRQ counts */ -#define AB8500_MAX_NR_IRQS		AB9540_NR_IRQS +#define AB8500_MAX_NR_IRQS		AB8540_NR_IRQS  #define AB8500_NUM_IRQ_REGS		14 -#define AB9540_NUM_IRQ_REGS		17 +#define AB9540_NUM_IRQ_REGS		20 +#define AB8540_NUM_IRQ_REGS		27 + +/* Turn On Status Event */ +#define AB8500_POR_ON_VBAT		0x01 +#define AB8500_POW_KEY_1_ON		0x02 +#define AB8500_POW_KEY_2_ON		0x04 +#define AB8500_RTC_ALARM		0x08 +#define AB8500_MAIN_CH_DET		0x10 +#define AB8500_VBUS_DET			0x20 +#define AB8500_USB_ID_DET		0x40  /**   * struct ab8500 - ab8500 internal structure @@ -270,10 +368,12 @@ struct regulator_reg_init;  struct regulator_init_data;  struct ab8500_gpio_platform_data;  struct ab8500_codec_platform_data; +struct ab8500_sysctrl_platform_data;  /**   * struct ab8500_platform_data - AB8500 platform data   * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used + * @pm_power_off: Should machine pm power off hook be registered or not   * @init: board-specific initialization after detection of ab8500   * @num_regulator_reg_init: number of regulator init registers   * @regulator_reg_init: regulator init registers @@ -282,13 +382,15 @@ struct ab8500_codec_platform_data;   */  struct ab8500_platform_data {  	int irq_base; +	bool pm_power_off;  	void (*init) (struct ab8500 *);  	int num_regulator_reg_init;  	struct ab8500_regulator_reg_init *regulator_reg_init;  	int num_regulator;  	struct regulator_init_data *regulator; -	struct ab8500_gpio_platform_data *gpio; +	struct abx500_gpio_platform_data *gpio;  	struct ab8500_codec_platform_data *codec; +	struct ab8500_sysctrl_platform_data *sysctrl;  };  extern int ab8500_init(struct ab8500 *ab8500, @@ -335,10 +437,87 @@ static inline int is_ab8500_2p0_or_earlier(struct ab8500 *ab)  	return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT2P0));  } +static inline int is_ab8500_3p3_or_earlier(struct ab8500 *ab) +{ +	return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT3P3)); +} +  /* exclude also ab8505, ab9540... */  static inline int is_ab8500_2p0(struct ab8500 *ab)  {  	return (is_ab8500(ab) && (ab->chip_id == AB8500_CUT2P0));  } +static inline int is_ab8505_1p0_or_earlier(struct ab8500 *ab) +{ +	return (is_ab8505(ab) && (ab->chip_id <= AB8500_CUT1P0)); +} + +static inline int is_ab8505_2p0(struct ab8500 *ab) +{ +	return (is_ab8505(ab) && (ab->chip_id == AB8500_CUT2P0)); +} + +static inline int is_ab9540_1p0_or_earlier(struct ab8500 *ab) +{ +	return (is_ab9540(ab) && (ab->chip_id <= AB8500_CUT1P0)); +} + +static inline int is_ab9540_2p0(struct ab8500 *ab) +{ +	return (is_ab9540(ab) && (ab->chip_id == AB8500_CUT2P0)); +} + +/* + * Be careful, the marketing name for this chip is 2.1 + * but the value read from the chip is 3.0 (0x30) + */ +static inline int is_ab9540_3p0(struct ab8500 *ab) +{ +	return (is_ab9540(ab) && (ab->chip_id == AB8500_CUT3P0)); +} + +static inline int is_ab8540_1p0_or_earlier(struct ab8500 *ab) +{ +	return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P0); +} + +static inline int is_ab8540_1p1_or_earlier(struct ab8500 *ab) +{ +	return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P1); +} + +static inline int is_ab8540_1p2_or_earlier(struct ab8500 *ab) +{ +	return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT1P2); +} + +static inline int is_ab8540_2p0_or_earlier(struct ab8500 *ab) +{ +	return is_ab8540(ab) && (ab->chip_id <= AB8500_CUT2P0); +} + +static inline int is_ab8540_2p0(struct ab8500 *ab) +{ +	return is_ab8540(ab) && (ab->chip_id == AB8500_CUT2P0); +} + +static inline int is_ab8505_2p0_earlier(struct ab8500 *ab) +{ +	return (is_ab8505(ab) && (ab->chip_id < AB8500_CUT2P0)); +} + +static inline int is_ab9540_2p0_or_earlier(struct ab8500 *ab) +{ +	return (is_ab9540(ab) && (ab->chip_id < AB8500_CUT2P0)); +} + +#ifdef CONFIG_AB8500_DEBUG +void ab8500_dump_all_banks(struct device *dev); +void ab8500_debug_register_interrupt(int line); +#else +static inline void ab8500_dump_all_banks(struct device *dev) {} +static inline void ab8500_debug_register_interrupt(int line) {} +#endif +  #endif /* MFD_AB8500_H */ diff --git a/include/linux/mfd/abx500/ux500_chargalg.h b/include/linux/mfd/abx500/ux500_chargalg.h index 9b07725750c..d43ac0f3552 100644 --- a/include/linux/mfd/abx500/ux500_chargalg.h +++ b/include/linux/mfd/abx500/ux500_chargalg.h @@ -27,12 +27,17 @@ struct ux500_charger_ops {   * @ops			ux500 charger operations   * @max_out_volt	maximum output charger voltage in mV   * @max_out_curr	maximum output charger current in mA + * @enabled		indicates if this charger is used or not + * @external		external charger unit (pm2xxx)   */  struct ux500_charger {  	struct power_supply psy;  	struct ux500_charger_ops ops;  	int max_out_volt;  	int max_out_curr; +	int wdt_refresh; +	bool enabled; +	bool external;  };  #endif diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h index a580363a7d2..cc281368dc5 100644 --- a/include/linux/mfd/arizona/core.h +++ b/include/linux/mfd/arizona/core.h @@ -75,8 +75,10 @@ enum arizona_type {  #define ARIZONA_IRQ_DCS_HP_DONE           47  #define ARIZONA_IRQ_FLL2_CLOCK_OK         48  #define ARIZONA_IRQ_FLL1_CLOCK_OK         49 +#define ARIZONA_IRQ_MICD_CLAMP_RISE	  50 +#define ARIZONA_IRQ_MICD_CLAMP_FALL	  51 -#define ARIZONA_NUM_IRQ                   50 +#define ARIZONA_NUM_IRQ                   52  struct snd_soc_dapm_context; @@ -98,6 +100,9 @@ struct arizona {  	struct regmap_irq_chip_data *aod_irq_chip;  	struct regmap_irq_chip_data *irq_chip; +	bool hpdet_magic; +	unsigned int hp_ena; +  	struct mutex clk_lock;  	int clk32k_ref; diff --git a/include/linux/mfd/arizona/pdata.h b/include/linux/mfd/arizona/pdata.h index 8b1d1daaae1..a0f940987a3 100644 --- a/include/linux/mfd/arizona/pdata.h +++ b/include/linux/mfd/arizona/pdata.h @@ -56,12 +56,16 @@  #define ARIZONA_DMIC_MICBIAS2 2  #define ARIZONA_DMIC_MICBIAS3 3 +#define ARIZONA_MAX_MICBIAS 3 +  #define ARIZONA_INMODE_DIFF 0  #define ARIZONA_INMODE_SE   1  #define ARIZONA_INMODE_DMIC 2  #define ARIZONA_MAX_OUTPUT 6 +#define ARIZONA_MAX_AIF 3 +  #define ARIZONA_HAP_ACT_ERM 0  #define ARIZONA_HAP_ACT_LRA 2 @@ -69,12 +73,24 @@  struct regulator_init_data; +struct arizona_micbias { +	int mV;                    /** Regulated voltage */ +	unsigned int ext_cap:1;    /** External capacitor fitted */ +	unsigned int discharge:1;  /** Actively discharge */ +	unsigned int fast_start:1; /** Enable aggressive startup ramp rate */ +}; +  struct arizona_micd_config {  	unsigned int src;  	unsigned int bias;  	bool gpio;  }; +struct arizona_micd_range { +	int max;  /** Ohms */ +	int key;  /** Key to report to input layer */ +}; +  struct arizona_pdata {  	int reset;      /** GPIO controlling /RESET, if any */  	int ldoena;     /** GPIO controlling LODENA, if any */ @@ -96,9 +112,53 @@ struct arizona_pdata {  	/** Pin state for GPIO pins */  	int gpio_defaults[ARIZONA_MAX_GPIO]; +	/** +	 * Maximum number of channels clocks will be generated for, +	 * useful for systems where and I2S bus with multiple data +	 * lines is mastered. +	 */ +	int max_channels_clocked[ARIZONA_MAX_AIF]; + +	/** GPIO5 is used for jack detection */ +	bool jd_gpio5; + +	/** Internal pull on GPIO5 is disabled when used for jack detection */ +	bool jd_gpio5_nopull; + +	/** Use the headphone detect circuit to identify the accessory */ +	bool hpdet_acc_id; + +	/** Check for line output with HPDET method */ +	bool hpdet_acc_id_line; + +	/** GPIO used for mic isolation with HPDET */ +	int hpdet_id_gpio; + +	/** Extra debounce timeout used during initial mic detection (ms) */ +	int micd_detect_debounce; +  	/** GPIO for mic detection polarity */  	int micd_pol_gpio; +	/** Mic detect ramp rate */ +	int micd_bias_start_time; + +	/** Mic detect sample rate */ +	int micd_rate; + +	/** Mic detect debounce level */ +	int micd_dbtime; + +	/** Mic detect timeout (ms) */ +	int micd_timeout; + +	/** Force MICBIAS on for mic detect */ +	bool micd_force_micbias; + +	/** Mic detect level parameters */ +	const struct arizona_micd_range *micd_ranges; +	int num_micd_ranges; +  	/** Headset polarity configurations */  	struct arizona_micd_config *micd_configs;  	int num_micd_configs; @@ -106,6 +166,9 @@ struct arizona_pdata {  	/** Reference voltage for DMIC inputs */  	int dmic_ref[ARIZONA_MAX_INPUT]; +	/** MICBIAS configurations */ +	struct arizona_micbias micbias[ARIZONA_MAX_MICBIAS]; +  	/** Mode of input structures */  	int inmode[ARIZONA_MAX_INPUT]; diff --git a/include/linux/mfd/arizona/registers.h b/include/linux/mfd/arizona/registers.h index 1f6fe31a4d5..f43aa7c8d04 100644 --- a/include/linux/mfd/arizona/registers.h +++ b/include/linux/mfd/arizona/registers.h @@ -119,9 +119,15 @@  #define ARIZONA_ACCESSORY_DETECT_MODE_1          0x293  #define ARIZONA_HEADPHONE_DETECT_1               0x29B  #define ARIZONA_HEADPHONE_DETECT_2               0x29C +#define ARIZONA_HP_DACVAL			 0x29F +#define ARIZONA_MICD_CLAMP_CONTROL               0x2A2  #define ARIZONA_MIC_DETECT_1                     0x2A3  #define ARIZONA_MIC_DETECT_2                     0x2A4  #define ARIZONA_MIC_DETECT_3                     0x2A5 +#define ARIZONA_MIC_DETECT_LEVEL_1		 0x2A6 +#define ARIZONA_MIC_DETECT_LEVEL_2		 0x2A7 +#define ARIZONA_MIC_DETECT_LEVEL_3		 0x2A8 +#define ARIZONA_MIC_DETECT_LEVEL_4		 0x2A9  #define ARIZONA_MIC_NOISE_MIX_CONTROL_1          0x2C3  #define ARIZONA_ISOLATION_CONTROL                0x2CB  #define ARIZONA_JACK_DETECT_ANALOGUE             0x2D3 @@ -982,18 +988,34 @@  #define ARIZONA_DSP1_STATUS_1                    0x1104  #define ARIZONA_DSP1_STATUS_2                    0x1105  #define ARIZONA_DSP1_STATUS_3                    0x1106 +#define ARIZONA_DSP1_SCRATCH_0                   0x1140 +#define ARIZONA_DSP1_SCRATCH_1                   0x1141 +#define ARIZONA_DSP1_SCRATCH_2                   0x1142 +#define ARIZONA_DSP1_SCRATCH_3                   0x1143  #define ARIZONA_DSP2_CONTROL_1                   0x1200  #define ARIZONA_DSP2_CLOCKING_1                  0x1201  #define ARIZONA_DSP2_STATUS_1                    0x1204  #define ARIZONA_DSP2_STATUS_2                    0x1205 +#define ARIZONA_DSP2_SCRATCH_0                   0x1240 +#define ARIZONA_DSP2_SCRATCH_1                   0x1241 +#define ARIZONA_DSP2_SCRATCH_2                   0x1242 +#define ARIZONA_DSP2_SCRATCH_3                   0x1243  #define ARIZONA_DSP3_CONTROL_1                   0x1300  #define ARIZONA_DSP3_CLOCKING_1                  0x1301  #define ARIZONA_DSP3_STATUS_1                    0x1304  #define ARIZONA_DSP3_STATUS_2                    0x1305 +#define ARIZONA_DSP3_SCRATCH_0                   0x1340 +#define ARIZONA_DSP3_SCRATCH_1                   0x1341 +#define ARIZONA_DSP3_SCRATCH_2                   0x1342 +#define ARIZONA_DSP3_SCRATCH_3                   0x1343  #define ARIZONA_DSP4_CONTROL_1                   0x1400  #define ARIZONA_DSP4_CLOCKING_1                  0x1401  #define ARIZONA_DSP4_STATUS_1                    0x1404  #define ARIZONA_DSP4_STATUS_2                    0x1405 +#define ARIZONA_DSP4_SCRATCH_0                   0x1440 +#define ARIZONA_DSP4_SCRATCH_1                   0x1441 +#define ARIZONA_DSP4_SCRATCH_2                   0x1442 +#define ARIZONA_DSP4_SCRATCH_3                   0x1443  /*   * Field Definitions. @@ -1194,6 +1216,14 @@  /*   * R64 (0x40) - Wake control   */ +#define ARIZONA_WKUP_MICD_CLAMP_FALL             0x0080  /* WKUP_MICD_CLAMP_FALL */ +#define ARIZONA_WKUP_MICD_CLAMP_FALL_MASK        0x0080  /* WKUP_MICD_CLAMP_FALL */ +#define ARIZONA_WKUP_MICD_CLAMP_FALL_SHIFT            7  /* WKUP_MICD_CLAMP_FALL */ +#define ARIZONA_WKUP_MICD_CLAMP_FALL_WIDTH            1  /* WKUP_MICD_CLAMP_FALL */ +#define ARIZONA_WKUP_MICD_CLAMP_RISE             0x0040  /* WKUP_MICD_CLAMP_RISE */ +#define ARIZONA_WKUP_MICD_CLAMP_RISE_MASK        0x0040  /* WKUP_MICD_CLAMP_RISE */ +#define ARIZONA_WKUP_MICD_CLAMP_RISE_SHIFT            6  /* WKUP_MICD_CLAMP_RISE */ +#define ARIZONA_WKUP_MICD_CLAMP_RISE_WIDTH            1  /* WKUP_MICD_CLAMP_RISE */  #define ARIZONA_WKUP_GP5_FALL                    0x0020  /* WKUP_GP5_FALL */  #define ARIZONA_WKUP_GP5_FALL_MASK               0x0020  /* WKUP_GP5_FALL */  #define ARIZONA_WKUP_GP5_FALL_SHIFT                   5  /* WKUP_GP5_FALL */ @@ -2035,6 +2065,9 @@  /*   * R667 (0x29B) - Headphone Detect 1   */ +#define ARIZONA_HP_IMPEDANCE_RANGE_MASK          0x0600  /* HP_IMPEDANCE_RANGE - [10:9] */ +#define ARIZONA_HP_IMPEDANCE_RANGE_SHIFT              9  /* HP_IMPEDANCE_RANGE - [10:9] */ +#define ARIZONA_HP_IMPEDANCE_RANGE_WIDTH              2  /* HP_IMPEDANCE_RANGE - [10:9] */  #define ARIZONA_HP_STEP_SIZE                     0x0100  /* HP_STEP_SIZE */  #define ARIZONA_HP_STEP_SIZE_MASK                0x0100  /* HP_STEP_SIZE */  #define ARIZONA_HP_STEP_SIZE_SHIFT                    8  /* HP_STEP_SIZE */ @@ -2069,6 +2102,21 @@  #define ARIZONA_HP_LVL_SHIFT                          0  /* HP_LVL - [6:0] */  #define ARIZONA_HP_LVL_WIDTH                          7  /* HP_LVL - [6:0] */ +#define ARIZONA_HP_DONE_B                        0x8000  /* HP_DONE */ +#define ARIZONA_HP_DONE_B_MASK                   0x8000  /* HP_DONE */ +#define ARIZONA_HP_DONE_B_SHIFT                      15  /* HP_DONE */ +#define ARIZONA_HP_DONE_B_WIDTH                       1  /* HP_DONE */ +#define ARIZONA_HP_LVL_B_MASK                    0x7FFF  /* HP_LVL - [14:0] */ +#define ARIZONA_HP_LVL_B_SHIFT                        0  /* HP_LVL - [14:0] */ +#define ARIZONA_HP_LVL_B_WIDTH                       15  /* HP_LVL - [14:0] */ + +/* + * R674 (0x2A2) - MICD clamp control + */ +#define ARIZONA_MICD_CLAMP_MODE_MASK             0x000F  /* MICD_CLAMP_MODE - [3:0] */ +#define ARIZONA_MICD_CLAMP_MODE_SHIFT                 0  /* MICD_CLAMP_MODE - [3:0] */ +#define ARIZONA_MICD_CLAMP_MODE_WIDTH                 4  /* MICD_CLAMP_MODE - [3:0] */ +  /*   * R675 (0x2A3) - Mic Detect 1   */ @@ -5239,6 +5287,14 @@  /*   * R3408 (0xD50) - AOD wkup and trig   */ +#define ARIZONA_MICD_CLAMP_FALL_TRIG_STS         0x0080  /* MICD_CLAMP_FALL_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_FALL_TRIG_STS_MASK    0x0080  /* MICD_CLAMP_FALL_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_FALL_TRIG_STS_SHIFT        7  /* MICD_CLAMP_FALL_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_FALL_TRIG_STS_WIDTH        1  /* MICD_CLAMP_FALL_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_RISE_TRIG_STS         0x0040  /* MICD_CLAMP_RISE_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_RISE_TRIG_STS_MASK    0x0040  /* MICD_CLAMP_RISE_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_RISE_TRIG_STS_SHIFT        6  /* MICD_CLAMP_RISE_TRIG_STS */ +#define ARIZONA_MICD_CLAMP_RISE_TRIG_STS_WIDTH        1  /* MICD_CLAMP_RISE_TRIG_STS */  #define ARIZONA_GP5_FALL_TRIG_STS                0x0020  /* GP5_FALL_TRIG_STS */  #define ARIZONA_GP5_FALL_TRIG_STS_MASK           0x0020  /* GP5_FALL_TRIG_STS */  #define ARIZONA_GP5_FALL_TRIG_STS_SHIFT               5  /* GP5_FALL_TRIG_STS */ @@ -5267,6 +5323,12 @@  /*   * R3409 (0xD51) - AOD IRQ1   */ +#define ARIZONA_MICD_CLAMP_FALL_EINT1            0x0080  /* MICD_CLAMP_FALL_EINT1 */ +#define ARIZONA_MICD_CLAMP_FALL_EINT1_MASK       0x0080  /* MICD_CLAMP_FALL_EINT1 */ +#define ARIZONA_MICD_CLAMP_FALL_EINT1_SHIFT           7  /* MICD_CLAMP_FALL_EINT1 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT1            0x0040  /* MICD_CLAMP_RISE_EINT1 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT1_MASK       0x0040  /* MICD_CLAMP_RISE_EINT1 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT1_SHIFT           6  /* MICD_CLAMP_RISE_EINT1 */  #define ARIZONA_GP5_FALL_EINT1                   0x0020  /* GP5_FALL_EINT1 */  #define ARIZONA_GP5_FALL_EINT1_MASK              0x0020  /* GP5_FALL_EINT1 */  #define ARIZONA_GP5_FALL_EINT1_SHIFT                  5  /* GP5_FALL_EINT1 */ @@ -5295,6 +5357,12 @@  /*   * R3410 (0xD52) - AOD IRQ2   */ +#define ARIZONA_MICD_CLAMP_FALL_EINT2            0x0080  /* MICD_CLAMP_FALL_EINT2 */ +#define ARIZONA_MICD_CLAMP_FALL_EINT2_MASK       0x0080  /* MICD_CLAMP_FALL_EINT2 */ +#define ARIZONA_MICD_CLAMP_FALL_EINT2_SHIFT           7  /* MICD_CLAMP_FALL_EINT2 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT2            0x0040  /* MICD_CLAMP_RISE_EINT2 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT2_MASK       0x0040  /* MICD_CLAMP_RISE_EINT2 */ +#define ARIZONA_MICD_CLAMP_RISE_EINT2_SHIFT           6  /* MICD_CLAMP_RISE_EINT2 */  #define ARIZONA_GP5_FALL_EINT2                   0x0020  /* GP5_FALL_EINT2 */  #define ARIZONA_GP5_FALL_EINT2_MASK              0x0020  /* GP5_FALL_EINT2 */  #define ARIZONA_GP5_FALL_EINT2_SHIFT                  5  /* GP5_FALL_EINT2 */ @@ -5379,6 +5447,10 @@  /*   * R3413 (0xD55) - AOD IRQ Raw Status   */ +#define ARIZONA_MICD_CLAMP_STS                   0x0008  /* MICD_CLAMP_STS */ +#define ARIZONA_MICD_CLAMP_STS_MASK              0x0008  /* MICD_CLAMP_STS */ +#define ARIZONA_MICD_CLAMP_STS_SHIFT                  3  /* MICD_CLAMP_STS */ +#define ARIZONA_MICD_CLAMP_STS_WIDTH                  1  /* MICD_CLAMP_STS */  #define ARIZONA_GP5_STS                          0x0004  /* GP5_STS */  #define ARIZONA_GP5_STS_MASK                     0x0004  /* GP5_STS */  #define ARIZONA_GP5_STS_SHIFT                         2  /* GP5_STS */ @@ -5395,6 +5467,10 @@  /*   * R3414 (0xD56) - Jack detect debounce   */ +#define ARIZONA_MICD_CLAMP_DB                    0x0008  /* MICD_CLAMP_DB */ +#define ARIZONA_MICD_CLAMP_DB_MASK               0x0008  /* MICD_CLAMP_DB */ +#define ARIZONA_MICD_CLAMP_DB_SHIFT                   3  /* MICD_CLAMP_DB */ +#define ARIZONA_MICD_CLAMP_DB_WIDTH                   1  /* MICD_CLAMP_DB */  #define ARIZONA_JD2_DB                           0x0002  /* JD2_DB */  #define ARIZONA_JD2_DB_MASK                      0x0002  /* JD2_DB */  #define ARIZONA_JD2_DB_SHIFT                          1  /* JD2_DB */ diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index 6ee4247df11..77a46ae2fc1 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h @@ -16,12 +16,6 @@  /*   * Registers   */ -#define DB8500_PRCM_GPIOCR 0x138 -#define DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0	BIT(0) -#define DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD	BIT(9) -#define DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1	BIT(11) -#define DB8500_PRCM_GPIOCR_SPI2_SELECT		BIT(23) -  #define DB8500_PRCM_LINE_VALUE 0x170  #define DB8500_PRCM_LINE_VALUE_HSI_CAWAKE0	BIT(3) @@ -493,20 +487,6 @@ struct prcmu_auto_pm_config {  	u8 sva_policy;  }; -#define PRCMU_FW_PROJECT_U8500		2 -#define PRCMU_FW_PROJECT_U9500		4 -#define PRCMU_FW_PROJECT_U8500_C2	7 -#define PRCMU_FW_PROJECT_U9500_C2	11 -#define PRCMU_FW_PROJECT_U8520		13 -#define PRCMU_FW_PROJECT_U8420		14 - -struct prcmu_fw_version { -	u8 project; -	u8 api_version; -	u8 func_version; -	u8 errata; -}; -  #ifdef CONFIG_MFD_DB8500_PRCMU  void db8500_prcmu_early_init(void); diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index c202d6c4d87..3abcca91eec 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -12,6 +12,10 @@  #include <linux/notifier.h>  #include <linux/err.h> +/* Offset for the firmware version within the TCPM */ +#define DB8500_PRCMU_FW_VERSION_OFFSET 0xA4 +#define DBX540_PRCMU_FW_VERSION_OFFSET 0xA8 +  /* PRCMU Wakeup defines */  enum prcmu_wakeup_index {  	PRCMU_WAKEUP_INDEX_RTC, @@ -147,6 +151,18 @@ enum prcmu_clock {  };  /** + * enum prcmu_wdog_id - PRCMU watchdog IDs + * @PRCMU_WDOG_ALL: use all timers + * @PRCMU_WDOG_CPU1: use first CPU timer only + * @PRCMU_WDOG_CPU2: use second CPU timer conly + */ +enum prcmu_wdog_id { +	PRCMU_WDOG_ALL = 0x00, +	PRCMU_WDOG_CPU1 = 0x01, +	PRCMU_WDOG_CPU2 = 0x02, +}; + +/**   * enum ape_opp - APE OPP states definition   * @APE_OPP_INIT:   * @APE_NO_CHANGE: The APE operating point is unchanged @@ -214,12 +230,52 @@ enum ddr_pwrst {  	DDR_PWR_STATE_OFFHIGHLAT    = 0x03  }; +#define DB8500_PRCMU_LEGACY_OFFSET		0xDD4 + +struct prcmu_pdata +{ +	bool enable_set_ddr_opp; +	bool enable_ape_opp_100_voltage; +	struct ab8500_platform_data *ab_platdata; +	u32 version_offset; +	u32 legacy_offset; +	u32 adt_offset; +}; + +#define PRCMU_FW_PROJECT_U8500		2 +#define PRCMU_FW_PROJECT_U8400		3 +#define PRCMU_FW_PROJECT_U9500		4 /* Customer specific */ +#define PRCMU_FW_PROJECT_U8500_MBB	5 +#define PRCMU_FW_PROJECT_U8500_C1	6 +#define PRCMU_FW_PROJECT_U8500_C2	7 +#define PRCMU_FW_PROJECT_U8500_C3	8 +#define PRCMU_FW_PROJECT_U8500_C4	9 +#define PRCMU_FW_PROJECT_U9500_MBL	10 +#define PRCMU_FW_PROJECT_U8500_MBL	11 /* Customer specific */ +#define PRCMU_FW_PROJECT_U8500_MBL2	12 /* Customer specific */ +#define PRCMU_FW_PROJECT_U8520		13 +#define PRCMU_FW_PROJECT_U8420		14 +#define PRCMU_FW_PROJECT_A9420		20 +/* [32..63] 9540 and derivatives */ +#define PRCMU_FW_PROJECT_U9540		32 +/* [64..95] 8540 and derivatives */ +#define PRCMU_FW_PROJECT_L8540		64 +/* [96..126] 8580 and derivatives */ +#define PRCMU_FW_PROJECT_L8580		96 + +#define PRCMU_FW_PROJECT_NAME_LEN	20 +struct prcmu_fw_version { +	u32 project; /* Notice, project shifted with 8 on ux540 */ +	u8 api_version; +	u8 func_version; +	u8 errata; +	char project_name[PRCMU_FW_PROJECT_NAME_LEN]; +}; +  #include <linux/mfd/db8500-prcmu.h>  #if defined(CONFIG_UX500_SOC_DB8500) -#include <mach/id.h> -  static inline void __init prcmu_early_init(void)  {  	return db8500_prcmu_early_init(); @@ -626,85 +682,6 @@ static inline void prcmu_clear(unsigned int reg, u32 bits)  	prcmu_write_masked(reg, bits, 0);  } -#if defined(CONFIG_UX500_SOC_DB8500) - -/** - * prcmu_enable_spi2 - Enables pin muxing for SPI2 on OtherAlternateC1. - */ -static inline void prcmu_enable_spi2(void) -{ -	if (cpu_is_u8500()) -		prcmu_set(DB8500_PRCM_GPIOCR, DB8500_PRCM_GPIOCR_SPI2_SELECT); -} - -/** - * prcmu_disable_spi2 - Disables pin muxing for SPI2 on OtherAlternateC1. - */ -static inline void prcmu_disable_spi2(void) -{ -	if (cpu_is_u8500()) -		prcmu_clear(DB8500_PRCM_GPIOCR, DB8500_PRCM_GPIOCR_SPI2_SELECT); -} - -/** - * prcmu_enable_stm_mod_uart - Enables pin muxing for STMMOD - * and UARTMOD on OtherAlternateC3. - */ -static inline void prcmu_enable_stm_mod_uart(void) -{ -	if (cpu_is_u8500()) { -		prcmu_set(DB8500_PRCM_GPIOCR, -			(DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1 | -			 DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0)); -	} -} - -/** - * prcmu_disable_stm_mod_uart - Disables pin muxing for STMMOD - * and UARTMOD on OtherAlternateC3. - */ -static inline void prcmu_disable_stm_mod_uart(void) -{ -	if (cpu_is_u8500()) { -		prcmu_clear(DB8500_PRCM_GPIOCR, -			(DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1 | -			 DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0)); -	} -} - -/** - * prcmu_enable_stm_ape - Enables pin muxing for STM APE on OtherAlternateC1. - */ -static inline void prcmu_enable_stm_ape(void) -{ -	if (cpu_is_u8500()) { -		prcmu_set(DB8500_PRCM_GPIOCR, -			DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD); -	} -} - -/** - * prcmu_disable_stm_ape - Disables pin muxing for STM APE on OtherAlternateC1. - */ -static inline void prcmu_disable_stm_ape(void) -{ -	if (cpu_is_u8500()) { -		prcmu_clear(DB8500_PRCM_GPIOCR, -			DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD); -	} -} - -#else - -static inline void prcmu_enable_spi2(void) {} -static inline void prcmu_disable_spi2(void) {} -static inline void prcmu_enable_stm_mod_uart(void) {} -static inline void prcmu_disable_stm_mod_uart(void) {} -static inline void prcmu_enable_stm_ape(void) {} -static inline void prcmu_disable_stm_ape(void) {} - -#endif -  /* PRCMU QoS APE OPP class */  #define PRCMU_QOS_APE_OPP 1  #define PRCMU_QOS_DDR_OPP 2 diff --git a/include/linux/mfd/lp8788.h b/include/linux/mfd/lp8788.h index 2a32b16f79c..786bf6679a2 100644 --- a/include/linux/mfd/lp8788.h +++ b/include/linux/mfd/lp8788.h @@ -16,6 +16,7 @@  #include <linux/gpio.h>  #include <linux/irqdomain.h> +#include <linux/pwm.h>  #include <linux/regmap.h>  #define LP8788_DEV_BUCK		"lp8788-buck" @@ -124,11 +125,6 @@ enum lp8788_bl_ramp_step {  	LP8788_RAMP_65538us,  }; -enum lp8788_bl_pwm_polarity { -	LP8788_PWM_ACTIVE_HIGH, -	LP8788_PWM_ACTIVE_LOW, -}; -  enum lp8788_isink_scale {  	LP8788_ISINK_SCALE_100mA,  	LP8788_ISINK_SCALE_120mA, @@ -229,16 +225,6 @@ struct lp8788_charger_platform_data {  };  /* - * struct lp8788_bl_pwm_data - * @pwm_set_intensity     : set duty of pwm - * @pwm_get_intensity     : get current duty of pwm - */ -struct lp8788_bl_pwm_data { -	void (*pwm_set_intensity) (int brightness, int max_brightness); -	int (*pwm_get_intensity) (int max_brightness); -}; - -/*   * struct lp8788_backlight_platform_data   * @name                  : backlight driver name. (default: "lcd-backlight")   * @initial_brightness    : initial value of backlight brightness @@ -248,8 +234,8 @@ struct lp8788_bl_pwm_data {   * @rise_time             : brightness ramp up step time   * @fall_time             : brightness ramp down step time   * @pwm_pol               : pwm polarity setting when bl_mode is pwm based - * @pwm_data              : platform specific pwm generation functions - *                          only valid when bl_mode is pwm based + * @period_ns             : platform specific pwm period value. unit is nano. +			    Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED   */  struct lp8788_backlight_platform_data {  	char *name; @@ -259,8 +245,8 @@ struct lp8788_backlight_platform_data {  	enum lp8788_bl_full_scale_current full_scale;  	enum lp8788_bl_ramp_step rise_time;  	enum lp8788_bl_ramp_step fall_time; -	enum lp8788_bl_pwm_polarity pwm_pol; -	struct lp8788_bl_pwm_data pwm_data; +	enum pwm_polarity pwm_pol; +	unsigned int period_ns;  };  /* diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h index 1eeae5c0791..1aa4f13cdfa 100644 --- a/include/linux/mfd/max77693-private.h +++ b/include/linux/mfd/max77693-private.h @@ -106,6 +106,115 @@ enum max77693_muic_reg {  	MAX77693_MUIC_REG_END,  }; +/* MAX77693 INTMASK1~2 Register */ +#define INTMASK1_ADC1K_SHIFT		3 +#define INTMASK1_ADCERR_SHIFT		2 +#define INTMASK1_ADCLOW_SHIFT		1 +#define INTMASK1_ADC_SHIFT		0 +#define INTMASK1_ADC1K_MASK		(1 << INTMASK1_ADC1K_SHIFT) +#define INTMASK1_ADCERR_MASK		(1 << INTMASK1_ADCERR_SHIFT) +#define INTMASK1_ADCLOW_MASK		(1 << INTMASK1_ADCLOW_SHIFT) +#define INTMASK1_ADC_MASK		(1 << INTMASK1_ADC_SHIFT) + +#define INTMASK2_VIDRM_SHIFT		5 +#define INTMASK2_VBVOLT_SHIFT		4 +#define INTMASK2_DXOVP_SHIFT		3 +#define INTMASK2_DCDTMR_SHIFT		2 +#define INTMASK2_CHGDETRUN_SHIFT	1 +#define INTMASK2_CHGTYP_SHIFT		0 +#define INTMASK2_VIDRM_MASK		(1 << INTMASK2_VIDRM_SHIFT) +#define INTMASK2_VBVOLT_MASK		(1 << INTMASK2_VBVOLT_SHIFT) +#define INTMASK2_DXOVP_MASK		(1 << INTMASK2_DXOVP_SHIFT) +#define INTMASK2_DCDTMR_MASK		(1 << INTMASK2_DCDTMR_SHIFT) +#define INTMASK2_CHGDETRUN_MASK		(1 << INTMASK2_CHGDETRUN_SHIFT) +#define INTMASK2_CHGTYP_MASK		(1 << INTMASK2_CHGTYP_SHIFT) + +/* MAX77693 MUIC - STATUS1~3 Register */ +#define STATUS1_ADC_SHIFT		(0) +#define STATUS1_ADCLOW_SHIFT		(5) +#define STATUS1_ADCERR_SHIFT		(6) +#define STATUS1_ADC1K_SHIFT		(7) +#define STATUS1_ADC_MASK		(0x1f << STATUS1_ADC_SHIFT) +#define STATUS1_ADCLOW_MASK		(0x1 << STATUS1_ADCLOW_SHIFT) +#define STATUS1_ADCERR_MASK		(0x1 << STATUS1_ADCERR_SHIFT) +#define STATUS1_ADC1K_MASK		(0x1 << STATUS1_ADC1K_SHIFT) + +#define STATUS2_CHGTYP_SHIFT		(0) +#define STATUS2_CHGDETRUN_SHIFT		(3) +#define STATUS2_DCDTMR_SHIFT		(4) +#define STATUS2_DXOVP_SHIFT		(5) +#define STATUS2_VBVOLT_SHIFT		(6) +#define STATUS2_VIDRM_SHIFT		(7) +#define STATUS2_CHGTYP_MASK		(0x7 << STATUS2_CHGTYP_SHIFT) +#define STATUS2_CHGDETRUN_MASK		(0x1 << STATUS2_CHGDETRUN_SHIFT) +#define STATUS2_DCDTMR_MASK		(0x1 << STATUS2_DCDTMR_SHIFT) +#define STATUS2_DXOVP_MASK		(0x1 << STATUS2_DXOVP_SHIFT) +#define STATUS2_VBVOLT_MASK		(0x1 << STATUS2_VBVOLT_SHIFT) +#define STATUS2_VIDRM_MASK		(0x1 << STATUS2_VIDRM_SHIFT) + +#define STATUS3_OVP_SHIFT		(2) +#define STATUS3_OVP_MASK		(0x1 << STATUS3_OVP_SHIFT) + +/* MAX77693 CDETCTRL1~2 register */ +#define CDETCTRL1_CHGDETEN_SHIFT	(0) +#define CDETCTRL1_CHGTYPMAN_SHIFT	(1) +#define CDETCTRL1_DCDEN_SHIFT		(2) +#define CDETCTRL1_DCD2SCT_SHIFT		(3) +#define CDETCTRL1_CDDELAY_SHIFT		(4) +#define CDETCTRL1_DCDCPL_SHIFT		(5) +#define CDETCTRL1_CDPDET_SHIFT		(7) +#define CDETCTRL1_CHGDETEN_MASK		(0x1 << CDETCTRL1_CHGDETEN_SHIFT) +#define CDETCTRL1_CHGTYPMAN_MASK	(0x1 << CDETCTRL1_CHGTYPMAN_SHIFT) +#define CDETCTRL1_DCDEN_MASK		(0x1 << CDETCTRL1_DCDEN_SHIFT) +#define CDETCTRL1_DCD2SCT_MASK		(0x1 << CDETCTRL1_DCD2SCT_SHIFT) +#define CDETCTRL1_CDDELAY_MASK		(0x1 << CDETCTRL1_CDDELAY_SHIFT) +#define CDETCTRL1_DCDCPL_MASK		(0x1 << CDETCTRL1_DCDCPL_SHIFT) +#define CDETCTRL1_CDPDET_MASK		(0x1 << CDETCTRL1_CDPDET_SHIFT) + +#define CDETCTRL2_VIDRMEN_SHIFT		(1) +#define CDETCTRL2_DXOVPEN_SHIFT		(3) +#define CDETCTRL2_VIDRMEN_MASK		(0x1 << CDETCTRL2_VIDRMEN_SHIFT) +#define CDETCTRL2_DXOVPEN_MASK		(0x1 << CDETCTRL2_DXOVPEN_SHIFT) + +/* MAX77693 MUIC - CONTROL1~3 register */ +#define COMN1SW_SHIFT			(0) +#define COMP2SW_SHIFT			(3) +#define COMN1SW_MASK			(0x7 << COMN1SW_SHIFT) +#define COMP2SW_MASK			(0x7 << COMP2SW_SHIFT) +#define COMP_SW_MASK			(COMP2SW_MASK | COMN1SW_MASK) +#define CONTROL1_SW_USB			((1 << COMP2SW_SHIFT) \ +						| (1 << COMN1SW_SHIFT)) +#define CONTROL1_SW_AUDIO		((2 << COMP2SW_SHIFT) \ +						| (2 << COMN1SW_SHIFT)) +#define CONTROL1_SW_UART		((3 << COMP2SW_SHIFT) \ +						| (3 << COMN1SW_SHIFT)) +#define CONTROL1_SW_OPEN		((0 << COMP2SW_SHIFT) \ +						| (0 << COMN1SW_SHIFT)) + +#define CONTROL2_LOWPWR_SHIFT		(0) +#define CONTROL2_ADCEN_SHIFT		(1) +#define CONTROL2_CPEN_SHIFT		(2) +#define CONTROL2_SFOUTASRT_SHIFT	(3) +#define CONTROL2_SFOUTORD_SHIFT		(4) +#define CONTROL2_ACCDET_SHIFT		(5) +#define CONTROL2_USBCPINT_SHIFT		(6) +#define CONTROL2_RCPS_SHIFT		(7) +#define CONTROL2_LOWPWR_MASK		(0x1 << CONTROL2_LOWPWR_SHIFT) +#define CONTROL2_ADCEN_MASK		(0x1 << CONTROL2_ADCEN_SHIFT) +#define CONTROL2_CPEN_MASK		(0x1 << CONTROL2_CPEN_SHIFT) +#define CONTROL2_SFOUTASRT_MASK		(0x1 << CONTROL2_SFOUTASRT_SHIFT) +#define CONTROL2_SFOUTORD_MASK		(0x1 << CONTROL2_SFOUTORD_SHIFT) +#define CONTROL2_ACCDET_MASK		(0x1 << CONTROL2_ACCDET_SHIFT) +#define CONTROL2_USBCPINT_MASK		(0x1 << CONTROL2_USBCPINT_SHIFT) +#define CONTROL2_RCPS_MASK		(0x1 << CONTROL2_RCPS_SHIFT) + +#define CONTROL3_JIGSET_SHIFT		(0) +#define CONTROL3_BTLDSET_SHIFT		(2) +#define CONTROL3_ADCDBSET_SHIFT		(4) +#define CONTROL3_JIGSET_MASK		(0x3 << CONTROL3_JIGSET_SHIFT) +#define CONTROL3_BTLDSET_MASK		(0x3 << CONTROL3_BTLDSET_SHIFT) +#define CONTROL3_ADCDBSET_MASK		(0x3 << CONTROL3_ADCDBSET_SHIFT) +  /* Slave addr = 0x90: Haptic */  enum max77693_haptic_reg {  	MAX77693_HAPTIC_REG_STATUS		= 0x00, diff --git a/include/linux/mfd/max77693.h b/include/linux/mfd/max77693.h index fe03b2d35d4..3109a6c5c94 100644 --- a/include/linux/mfd/max77693.h +++ b/include/linux/mfd/max77693.h @@ -38,6 +38,15 @@ struct max77693_reg_data {  struct max77693_muic_platform_data {  	struct max77693_reg_data *init_data;  	int num_init_data; + +	int detcable_delay_ms; + +	/* +	 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB +	 * h/w path of COMP2/COMN1 on CONTROL1 register. +	 */ +	int path_usb; +	int path_uart;  };  struct max77693_platform_data { diff --git a/include/linux/mfd/max8925.h b/include/linux/mfd/max8925.h index 74d8e296963..ce8502e9e7d 100644 --- a/include/linux/mfd/max8925.h +++ b/include/linux/mfd/max8925.h @@ -190,6 +190,8 @@ enum {  	MAX8925_NR_IRQS,  }; + +  struct max8925_chip {  	struct device		*dev;  	struct i2c_client	*i2c; @@ -201,7 +203,6 @@ struct max8925_chip {  	int			irq_base;  	int			core_irq;  	int			tsc_irq; -  	unsigned int            wakeup_flag;  }; diff --git a/include/linux/mfd/max8997-private.h b/include/linux/mfd/max8997-private.h index 6ae21bf47d6..fb465dfbb59 100644 --- a/include/linux/mfd/max8997-private.h +++ b/include/linux/mfd/max8997-private.h @@ -194,6 +194,70 @@ enum max8997_muic_reg {  	MAX8997_MUIC_REG_END		= 0xf,  }; +/* MAX8997-MUIC STATUS1 register */ +#define STATUS1_ADC_SHIFT		0 +#define STATUS1_ADCLOW_SHIFT		5 +#define STATUS1_ADCERR_SHIFT		6 +#define STATUS1_ADC_MASK		(0x1f << STATUS1_ADC_SHIFT) +#define STATUS1_ADCLOW_MASK		(0x1 << STATUS1_ADCLOW_SHIFT) +#define STATUS1_ADCERR_MASK		(0x1 << STATUS1_ADCERR_SHIFT) + +/* MAX8997-MUIC STATUS2 register */ +#define STATUS2_CHGTYP_SHIFT		0 +#define STATUS2_CHGDETRUN_SHIFT		3 +#define STATUS2_DCDTMR_SHIFT		4 +#define STATUS2_DBCHG_SHIFT		5 +#define STATUS2_VBVOLT_SHIFT		6 +#define STATUS2_CHGTYP_MASK		(0x7 << STATUS2_CHGTYP_SHIFT) +#define STATUS2_CHGDETRUN_MASK		(0x1 << STATUS2_CHGDETRUN_SHIFT) +#define STATUS2_DCDTMR_MASK		(0x1 << STATUS2_DCDTMR_SHIFT) +#define STATUS2_DBCHG_MASK		(0x1 << STATUS2_DBCHG_SHIFT) +#define STATUS2_VBVOLT_MASK		(0x1 << STATUS2_VBVOLT_SHIFT) + +/* MAX8997-MUIC STATUS3 register */ +#define STATUS3_OVP_SHIFT		2 +#define STATUS3_OVP_MASK		(0x1 << STATUS3_OVP_SHIFT) + +/* MAX8997-MUIC CONTROL1 register */ +#define COMN1SW_SHIFT			0 +#define COMP2SW_SHIFT			3 +#define COMN1SW_MASK			(0x7 << COMN1SW_SHIFT) +#define COMP2SW_MASK			(0x7 << COMP2SW_SHIFT) +#define COMP_SW_MASK		(COMP2SW_MASK | COMN1SW_MASK) + +#define CONTROL1_SW_USB			((1 << COMP2SW_SHIFT) \ +						| (1 << COMN1SW_SHIFT)) +#define CONTROL1_SW_AUDIO		((2 << COMP2SW_SHIFT) \ +						| (2 << COMN1SW_SHIFT)) +#define CONTROL1_SW_UART		((3 << COMP2SW_SHIFT) \ +						| (3 << COMN1SW_SHIFT)) +#define CONTROL1_SW_OPEN		((0 << COMP2SW_SHIFT) \ +						| (0 << COMN1SW_SHIFT)) + +#define CONTROL2_LOWPWR_SHIFT		(0) +#define CONTROL2_ADCEN_SHIFT		(1) +#define CONTROL2_CPEN_SHIFT		(2) +#define CONTROL2_SFOUTASRT_SHIFT	(3) +#define CONTROL2_SFOUTORD_SHIFT		(4) +#define CONTROL2_ACCDET_SHIFT		(5) +#define CONTROL2_USBCPINT_SHIFT		(6) +#define CONTROL2_RCPS_SHIFT		(7) +#define CONTROL2_LOWPWR_MASK		(0x1 << CONTROL2_LOWPWR_SHIFT) +#define CONTROL2_ADCEN_MASK		(0x1 << CONTROL2_ADCEN_SHIFT) +#define CONTROL2_CPEN_MASK		(0x1 << CONTROL2_CPEN_SHIFT) +#define CONTROL2_SFOUTASRT_MASK		(0x1 << CONTROL2_SFOUTASRT_SHIFT) +#define CONTROL2_SFOUTORD_MASK		(0x1 << CONTROL2_SFOUTORD_SHIFT) +#define CONTROL2_ACCDET_MASK		(0x1 << CONTROL2_ACCDET_SHIFT) +#define CONTROL2_USBCPINT_MASK		(0x1 << CONTROL2_USBCPINT_SHIFT) +#define CONTROL2_RCPS_MASK		(0x1 << CONTROL2_RCPS_SHIFT) + +#define CONTROL3_JIGSET_SHIFT		(0) +#define CONTROL3_BTLDSET_SHIFT		(2) +#define CONTROL3_ADCDBSET_SHIFT		(4) +#define CONTROL3_JIGSET_MASK		(0x3 << CONTROL3_JIGSET_SHIFT) +#define CONTROL3_BTLDSET_MASK		(0x3 << CONTROL3_BTLDSET_SHIFT) +#define CONTROL3_ADCDBSET_MASK		(0x3 << CONTROL3_ADCDBSET_SHIFT) +  enum max8997_haptic_reg {  	MAX8997_HAPTIC_REG_GENERAL	= 0x00,  	MAX8997_HAPTIC_REG_CONF1	= 0x01, diff --git a/include/linux/mfd/max8997.h b/include/linux/mfd/max8997.h index 1d4a4fe6ac3..cf815577bd6 100644 --- a/include/linux/mfd/max8997.h +++ b/include/linux/mfd/max8997.h @@ -78,21 +78,6 @@ struct max8997_regulator_data {  	struct device_node *reg_node;  }; -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; @@ -107,6 +92,16 @@ struct max8997_muic_reg_data {  struct max8997_muic_platform_data {  	struct max8997_muic_reg_data *init_data;  	int num_init_data; + +	/* Check cable state after certain delay */ +	int detcable_delay_ms; + +	/* +	 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB +	 * h/w path of COMP2/COMN1 on CONTROL1 register. +	 */ +	int path_usb; +	int path_uart;  };  enum max8997_haptic_motor_type { diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h index 29f6616e12f..3bbda22721e 100644 --- a/include/linux/mfd/palmas.h +++ b/include/linux/mfd/palmas.h @@ -221,6 +221,7 @@ struct palmas_clk_platform_data {  };  struct palmas_platform_data { +	int irq_flags;  	int gpio_base;  	/* bit value to be loaded to the POWER_CTRL register */ @@ -2789,4 +2790,56 @@ enum usb_irq_events {  #define PALMAS_GPADC_TRIM15					0xE  #define PALMAS_GPADC_TRIM16					0xF +static inline int palmas_read(struct palmas *palmas, unsigned int base, +		unsigned int reg, unsigned int *val) +{ +	unsigned int addr =  PALMAS_BASE_TO_REG(base, reg); +	int slave_id = PALMAS_BASE_TO_SLAVE(base); + +	return regmap_read(palmas->regmap[slave_id], addr, val); +} + +static inline int palmas_write(struct palmas *palmas, unsigned int base, +		unsigned int reg, unsigned int value) +{ +	unsigned int addr = PALMAS_BASE_TO_REG(base, reg); +	int slave_id = PALMAS_BASE_TO_SLAVE(base); + +	return regmap_write(palmas->regmap[slave_id], addr, value); +} + +static inline int palmas_bulk_write(struct palmas *palmas, unsigned int base, +	unsigned int reg, const void *val, size_t val_count) +{ +	unsigned int addr = PALMAS_BASE_TO_REG(base, reg); +	int slave_id = PALMAS_BASE_TO_SLAVE(base); + +	return regmap_bulk_write(palmas->regmap[slave_id], addr, +			val, val_count); +} + +static inline int palmas_bulk_read(struct palmas *palmas, unsigned int base, +		unsigned int reg, void *val, size_t val_count) +{ +	unsigned int addr = PALMAS_BASE_TO_REG(base, reg); +	int slave_id = PALMAS_BASE_TO_SLAVE(base); + +	return regmap_bulk_read(palmas->regmap[slave_id], addr, +		val, val_count); +} + +static inline int palmas_update_bits(struct palmas *palmas, unsigned int base, +	unsigned int reg, unsigned int mask, unsigned int val) +{ +	unsigned int addr = PALMAS_BASE_TO_REG(base, reg); +	int slave_id = PALMAS_BASE_TO_SLAVE(base); + +	return regmap_update_bits(palmas->regmap[slave_id], addr, mask, val); +} + +static inline int palmas_irq_get_virq(struct palmas *palmas, int irq) +{ +	return regmap_irq_get_virq(palmas->irq_data, irq); +} +  #endif /*  __LINUX_MFD_PALMAS_H */ diff --git a/include/linux/mfd/rtsx_pci.h b/include/linux/mfd/rtsx_pci.h index 4b117a3f54d..26ea7f1b7ca 100644 --- a/include/linux/mfd/rtsx_pci.h +++ b/include/linux/mfd/rtsx_pci.h @@ -465,7 +465,7 @@  #define	SD_RSP_TYPE_R6			0x01  #define	SD_RSP_TYPE_R7			0x01 -/* SD_CONFIURE3 */ +/* SD_CONFIGURE3 */  #define	SD_RSP_80CLK_TIMEOUT_EN		0x01  /* Card Transfer Reset Register */ @@ -581,8 +581,11 @@  #define CARD_GPIO_DIR			0xFD57  #define CARD_GPIO			0xFD58  #define CARD_DATA_SOURCE		0xFD5B +#define SD30_CLK_DRIVE_SEL		0xFD5A  #define CARD_SELECT			0xFD5C  #define SD30_DRIVE_SEL			0xFD5E +#define SD30_CMD_DRIVE_SEL		0xFD5E +#define SD30_DAT_DRIVE_SEL		0xFD5F  #define CARD_CLK_EN			0xFD69  #define SDIO_CTRL			0xFD6B  #define CD_PAD_CTL			0xFD73 @@ -655,6 +658,8 @@  #define MSGTXDATA3			0xFE47  #define MSGTXCTL			0xFE48  #define PETXCFG				0xFE49 +#define LTR_CTL				0xFE4A +#define OBFF_CFG			0xFE4C  #define CDRESUMECTL			0xFE52  #define WAKE_SEL_CTL			0xFE54 @@ -735,6 +740,7 @@ struct rtsx_pcr {  	unsigned int			card_inserted;  	unsigned int			card_removed; +	unsigned int			card_exist;  	struct delayed_work		carddet_work;  	struct delayed_work		idle_work; @@ -799,6 +805,7 @@ int rtsx_pci_switch_clock(struct rtsx_pcr *pcr, unsigned int card_clock,  		u8 ssc_depth, bool initial_mode, bool double_clk, bool vpclk);  int rtsx_pci_card_power_on(struct rtsx_pcr *pcr, int card);  int rtsx_pci_card_power_off(struct rtsx_pcr *pcr, int card); +int rtsx_pci_card_exclusive_check(struct rtsx_pcr *pcr, int card);  int rtsx_pci_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage);  unsigned int rtsx_pci_card_exist(struct rtsx_pcr *pcr);  void rtsx_pci_complete_unfinished_transfer(struct rtsx_pcr *pcr); diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h index b50c38f8bc4..f0f4de3b4cc 100644 --- a/include/linux/mfd/samsung/core.h +++ b/include/linux/mfd/samsung/core.h @@ -26,6 +26,7 @@ enum sec_device_type {  /**   * struct sec_pmic_dev - s5m87xx master device for sub-drivers   * @dev: master device of the chip (can be used to access platform data) + * @pdata: pointer to private data used to pass platform data to child   * @i2c: i2c client private data for regulator   * @rtc: i2c client private data for rtc   * @iolock: mutex for serializing io access @@ -39,6 +40,7 @@ enum sec_device_type {   */  struct sec_pmic_dev {  	struct device *dev; +	struct sec_platform_data *pdata;  	struct regmap *regmap;  	struct i2c_client *i2c;  	struct i2c_client *rtc; @@ -82,11 +84,11 @@ struct sec_platform_data {  	int				buck_gpios[3];  	int				buck_ds[3]; -	int				buck2_voltage[8]; +	unsigned int			buck2_voltage[8];  	bool				buck2_gpiodvs; -	int				buck3_voltage[8]; +	unsigned int			buck3_voltage[8];  	bool				buck3_gpiodvs; -	int				buck4_voltage[8]; +	unsigned int			buck4_voltage[8];  	bool				buck4_gpiodvs;  	int				buck_set1; @@ -127,6 +129,7 @@ struct sec_platform_data {  struct sec_regulator_data {  	int				id;  	struct regulator_init_data	*initdata; +	struct device_node *reg_node;  };  /* @@ -136,7 +139,7 @@ struct sec_regulator_data {   */  struct sec_opmode_data {  	int id; -	int mode; +	unsigned int mode;  };  /* diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h index d83af39815a..99bf3e66599 100644 --- a/include/linux/mfd/tmio.h +++ b/include/linux/mfd/tmio.h @@ -65,12 +65,6 @@   */  #define TMIO_MMC_SDIO_IRQ		(1 << 2)  /* - * Some platforms can detect card insertion events with controller powered - * down, using a GPIO IRQ, in which case they have to fill in cd_irq, cd_gpio, - * and cd_flags fields of struct tmio_mmc_data. - */ -#define TMIO_MMC_HAS_COLD_CD		(1 << 3) -/*   * Some controllers require waiting for the SD bus to become   * idle before writing to some registers.   */ @@ -117,18 +111,6 @@ struct tmio_mmc_data {  };  /* - * This function is deprecated and will be removed soon. Please, convert your - * platform to use drivers/mmc/core/cd-gpio.c - */ -#include <linux/mmc/host.h> -static inline void tmio_mmc_cd_wakeup(struct tmio_mmc_data *pdata) -{ -	if (pdata) -		mmc_detect_change(dev_get_drvdata(pdata->dev), -				  msecs_to_jiffies(100)); -} - -/*   * data for the NAND controller   */  struct tmio_nand_data { diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h index aaceab402ec..6d309032dc0 100644 --- a/include/linux/mfd/tps65912.h +++ b/include/linux/mfd/tps65912.h @@ -323,5 +323,6 @@ int tps65912_device_init(struct tps65912 *tps65912);  void tps65912_device_exit(struct tps65912 *tps65912);  int tps65912_irq_init(struct tps65912 *tps65912, int irq,  			struct tps65912_platform_data *pdata); +int tps65912_irq_exit(struct tps65912 *tps65912);  #endif /*  __LINUX_MFD_TPS65912_H */ diff --git a/include/linux/mfd/wm831x/auxadc.h b/include/linux/mfd/wm831x/auxadc.h index b132067e9e9..867aa23f937 100644 --- a/include/linux/mfd/wm831x/auxadc.h +++ b/include/linux/mfd/wm831x/auxadc.h @@ -15,6 +15,8 @@  #ifndef __MFD_WM831X_AUXADC_H__  #define __MFD_WM831X_AUXADC_H__ +struct wm831x; +  /*   * R16429 (0x402D) - AuxADC Data   */ diff --git a/include/linux/mfd/wm831x/core.h b/include/linux/mfd/wm831x/core.h index 4a3b83a7761..76c22648436 100644 --- a/include/linux/mfd/wm831x/core.h +++ b/include/linux/mfd/wm831x/core.h @@ -20,6 +20,7 @@  #include <linux/irqdomain.h>  #include <linux/list.h>  #include <linux/regmap.h> +#include <linux/mfd/wm831x/auxadc.h>  /*   * Register values. @@ -355,7 +356,6 @@ enum wm831x_parent {  };  struct wm831x; -enum wm831x_auxadc;  typedef int (*wm831x_auxadc_read_fn)(struct wm831x *wm831x,  				     enum wm831x_auxadc input); diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h index adfe8c058f2..9dbb41a4e25 100644 --- a/include/linux/micrel_phy.h +++ b/include/linux/micrel_phy.h @@ -21,8 +21,15 @@  #define PHY_ID_KSZ8021		0x00221555  #define PHY_ID_KSZ8041		0x00221510  #define PHY_ID_KSZ8051		0x00221550 -/* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */ +/* same id: ks8001 Rev. A/B, and ks8721 Rev 3. */  #define PHY_ID_KSZ8001		0x0022161A +/* same id: KS8081, KS8091 */ +#define PHY_ID_KSZ8081		0x00221560 +#define PHY_ID_KSZ8061		0x00221570 +#define PHY_ID_KSZ9031		0x00221620 + +#define PHY_ID_KSZ886X		0x00221430 +#define PHY_ID_KSZ8863		0x00221435  /* struct phy_device dev_flags definitions */  #define MICREL_PHY_50MHZ_CLK	0x00000001 diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 1e9f627967a..a405d3dc0f6 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -40,11 +40,9 @@ extern void putback_movable_pages(struct list_head *l);  extern int migrate_page(struct address_space *,  			struct page *, struct page *, enum migrate_mode);  extern int migrate_pages(struct list_head *l, new_page_t x, -			unsigned long private, bool offlining, -			enum migrate_mode mode, int reason); +		unsigned long private, enum migrate_mode mode, int reason);  extern int migrate_huge_page(struct page *, new_page_t x, -			unsigned long private, bool offlining, -			enum migrate_mode mode); +		unsigned long private, enum migrate_mode mode);  extern int fail_migrate_page(struct address_space *,  			struct page *, struct page *); @@ -62,11 +60,11 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping,  static inline void putback_lru_pages(struct list_head *l) {}  static inline void putback_movable_pages(struct list_head *l) {}  static inline int migrate_pages(struct list_head *l, new_page_t x, -		unsigned long private, bool offlining, -		enum migrate_mode mode, int reason) { return -ENOSYS; } +		unsigned long private, enum migrate_mode mode, int reason) +	{ return -ENOSYS; }  static inline int migrate_huge_page(struct page *page, new_page_t x, -		unsigned long private, bool offlining, -		enum migrate_mode mode) { return -ENOSYS; } +		unsigned long private, 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/mlx4/device.h b/include/linux/mlx4/device.h index 20ea939c22a..811f91cf5e8 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -150,7 +150,8 @@ enum {  	MLX4_DEV_CAP_FLAG2_RSS			= 1LL <<  0,  	MLX4_DEV_CAP_FLAG2_RSS_TOP		= 1LL <<  1,  	MLX4_DEV_CAP_FLAG2_RSS_XOR		= 1LL <<  2, -	MLX4_DEV_CAP_FLAG2_FS_EN		= 1LL <<  3 +	MLX4_DEV_CAP_FLAG2_FS_EN		= 1LL <<  3, +	MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN	= 1LL <<  4  };  enum { @@ -170,6 +171,7 @@ enum {  #define MLX4_ATTR_EXTENDED_PORT_INFO	cpu_to_be16(0xff90)  enum { +	MLX4_BMME_FLAG_WIN_TYPE_2B	= 1 <<  1,  	MLX4_BMME_FLAG_LOCAL_INV	= 1 <<  6,  	MLX4_BMME_FLAG_REMOTE_INV	= 1 <<  7,  	MLX4_BMME_FLAG_TYPE_2_WIN	= 1 <<  9, @@ -237,7 +239,8 @@ enum {  	MLX4_PERM_LOCAL_WRITE	= 1 << 11,  	MLX4_PERM_REMOTE_READ	= 1 << 12,  	MLX4_PERM_REMOTE_WRITE	= 1 << 13, -	MLX4_PERM_ATOMIC	= 1 << 14 +	MLX4_PERM_ATOMIC	= 1 << 14, +	MLX4_PERM_BIND_MW	= 1 << 15,  };  enum { @@ -503,6 +506,18 @@ struct mlx4_mr {  	int			enabled;  }; +enum mlx4_mw_type { +	MLX4_MW_TYPE_1 = 1, +	MLX4_MW_TYPE_2 = 2, +}; + +struct mlx4_mw { +	u32			key; +	u32			pd; +	enum mlx4_mw_type	type; +	int			enabled; +}; +  struct mlx4_fmr {  	struct mlx4_mr		mr;  	struct mlx4_mpt_entry  *mpt; @@ -801,8 +816,12 @@ u64 mlx4_mtt_addr(struct mlx4_dev *dev, struct mlx4_mtt *mtt);  int mlx4_mr_alloc(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access,  		  int npages, int page_shift, struct mlx4_mr *mr); -void mlx4_mr_free(struct mlx4_dev *dev, struct mlx4_mr *mr); +int mlx4_mr_free(struct mlx4_dev *dev, struct mlx4_mr *mr);  int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr); +int mlx4_mw_alloc(struct mlx4_dev *dev, u32 pd, enum mlx4_mw_type type, +		  struct mlx4_mw *mw); +void mlx4_mw_free(struct mlx4_dev *dev, struct mlx4_mw *mw); +int mlx4_mw_enable(struct mlx4_dev *dev, struct mlx4_mw *mw);  int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,  		   int start_index, int npages, u64 *page_list);  int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, @@ -955,9 +974,8 @@ int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mo  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); +int mlx4_get_base_qpn(struct mlx4_dev *dev, u8 port); +int __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac);  void mlx4_set_stats_bitmap(struct mlx4_dev *dev, u64 *stats_bitmap);  int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu,  			  u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx); diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 4b4ad6ffef9..67f46ad6920 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h @@ -265,6 +265,11 @@ struct mlx4_wqe_lso_seg {  	__be32			header[0];  }; +enum mlx4_wqe_bind_seg_flags2 { +	MLX4_WQE_BIND_ZERO_BASED = (1 << 30), +	MLX4_WQE_BIND_TYPE_2     = (1 << 31), +}; +  struct mlx4_wqe_bind_seg {  	__be32			flags1;  	__be32			flags2; @@ -277,9 +282,9 @@ struct mlx4_wqe_bind_seg {  enum {  	MLX4_WQE_FMR_PERM_LOCAL_READ	= 1 << 27,  	MLX4_WQE_FMR_PERM_LOCAL_WRITE	= 1 << 28, -	MLX4_WQE_FMR_PERM_REMOTE_READ	= 1 << 29, -	MLX4_WQE_FMR_PERM_REMOTE_WRITE	= 1 << 30, -	MLX4_WQE_FMR_PERM_ATOMIC	= 1 << 31 +	MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_READ	= 1 << 29, +	MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_WRITE	= 1 << 30, +	MLX4_WQE_FMR_AND_BIND_PERM_ATOMIC	= 1 << 31  };  struct mlx4_wqe_fmr_seg { @@ -304,12 +309,10 @@ struct mlx4_wqe_fmr_ext_seg {  };  struct mlx4_wqe_local_inval_seg { -	__be32			flags; -	u32			reserved1; +	u64			reserved1;  	__be32			mem_key; -	u32			reserved2[2]; -	__be32			guest_id; -	__be64			pa; +	u32			reserved2; +	u64			reserved3[2];  };  struct mlx4_wqe_raddr_seg { diff --git a/include/linux/mm.h b/include/linux/mm.h index 66e2f7c61e5..e2091b88d24 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -114,6 +114,8 @@ extern unsigned int kobjsize(const void *objp);  # define VM_SAO		VM_ARCH_1	/* Strong Access Ordering (powerpc) */  #elif defined(CONFIG_PARISC)  # define VM_GROWSUP	VM_ARCH_1 +#elif defined(CONFIG_METAG) +# define VM_GROWSUP	VM_ARCH_1  #elif defined(CONFIG_IA64)  # define VM_GROWSUP	VM_ARCH_1  #elif !defined(CONFIG_MMU) @@ -366,7 +368,7 @@ static inline struct page *compound_head(struct page *page)   * both from it and to it can be tracked, using atomic_inc_and_test   * and atomic_add_negative(-1).   */ -static inline void reset_page_mapcount(struct page *page) +static inline void page_mapcount_reset(struct page *page)  {  	atomic_set(&(page)->_mapcount, -1);  } @@ -580,50 +582,11 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)   * sets it, so none of the operations on it need to be atomic.   */ - -/* - * page->flags layout: - * - * There are three possibilities for how page->flags get - * laid out.  The first is for the normal case, without - * sparsemem.  The second is for sparsemem when there is - * plenty of space for node and section.  The last is when - * we have run out of space and have to fall back to an - * alternate (slower) way of determining the node. - * - * No sparsemem or sparsemem vmemmap: |       NODE     | ZONE | ... | FLAGS | - * classic sparse with space for node:| SECTION | NODE | ZONE | ... | FLAGS | - * classic sparse no space for node:  | SECTION |     ZONE    | ... | FLAGS | - */ -#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) -#define SECTIONS_WIDTH		SECTIONS_SHIFT -#else -#define SECTIONS_WIDTH		0 -#endif - -#define ZONES_WIDTH		ZONES_SHIFT - -#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS -#define NODES_WIDTH		NODES_SHIFT -#else -#ifdef CONFIG_SPARSEMEM_VMEMMAP -#error "Vmemmap: No space for nodes field in page flags" -#endif -#define NODES_WIDTH		0 -#endif - -/* Page flags: | [SECTION] | [NODE] | ZONE | ... | FLAGS | */ +/* Page flags: | [SECTION] | [NODE] | ZONE | [LAST_NID] | ... | FLAGS | */  #define SECTIONS_PGOFF		((sizeof(unsigned long)*8) - SECTIONS_WIDTH)  #define NODES_PGOFF		(SECTIONS_PGOFF - NODES_WIDTH)  #define ZONES_PGOFF		(NODES_PGOFF - ZONES_WIDTH) - -/* - * We are going to use the flags for the page to node mapping if its in - * there.  This includes the case where there is no node, so it is implicit. - */ -#if !(NODES_WIDTH > 0 || NODES_SHIFT == 0) -#define NODE_NOT_IN_PAGE_FLAGS -#endif +#define LAST_NID_PGOFF		(ZONES_PGOFF - LAST_NID_WIDTH)  /*   * Define the bit shifts to access each section.  For non-existent @@ -633,6 +596,7 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)  #define SECTIONS_PGSHIFT	(SECTIONS_PGOFF * (SECTIONS_WIDTH != 0))  #define NODES_PGSHIFT		(NODES_PGOFF * (NODES_WIDTH != 0))  #define ZONES_PGSHIFT		(ZONES_PGOFF * (ZONES_WIDTH != 0)) +#define LAST_NID_PGSHIFT	(LAST_NID_PGOFF * (LAST_NID_WIDTH != 0))  /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */  #ifdef NODE_NOT_IN_PAGE_FLAGS @@ -654,6 +618,7 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)  #define ZONES_MASK		((1UL << ZONES_WIDTH) - 1)  #define NODES_MASK		((1UL << NODES_WIDTH) - 1)  #define SECTIONS_MASK		((1UL << SECTIONS_WIDTH) - 1) +#define LAST_NID_MASK		((1UL << LAST_NID_WIDTH) - 1)  #define ZONEID_MASK		((1UL << ZONEID_SHIFT) - 1)  static inline enum zone_type page_zonenum(const struct page *page) @@ -661,6 +626,10 @@ static inline enum zone_type page_zonenum(const struct page *page)  	return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK;  } +#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) +#define SECTION_IN_PAGE_FLAGS +#endif +  /*   * The identification function is only used by the buddy allocator for   * determining if two pages could be buddies. We are not really @@ -693,31 +662,48 @@ static inline int page_to_nid(const struct page *page)  #endif  #ifdef CONFIG_NUMA_BALANCING -static inline int page_xchg_last_nid(struct page *page, int nid) +#ifdef LAST_NID_NOT_IN_PAGE_FLAGS +static inline int page_nid_xchg_last(struct page *page, int nid)  {  	return xchg(&page->_last_nid, nid);  } -static inline int page_last_nid(struct page *page) +static inline int page_nid_last(struct page *page)  {  	return page->_last_nid;  } -static inline void reset_page_last_nid(struct page *page) +static inline void page_nid_reset_last(struct page *page)  {  	page->_last_nid = -1;  }  #else -static inline int page_xchg_last_nid(struct page *page, int nid) +static inline int page_nid_last(struct page *page) +{ +	return (page->flags >> LAST_NID_PGSHIFT) & LAST_NID_MASK; +} + +extern int page_nid_xchg_last(struct page *page, int nid); + +static inline void page_nid_reset_last(struct page *page) +{ +	int nid = (1 << LAST_NID_SHIFT) - 1; + +	page->flags &= ~(LAST_NID_MASK << LAST_NID_PGSHIFT); +	page->flags |= (nid & LAST_NID_MASK) << LAST_NID_PGSHIFT; +} +#endif /* LAST_NID_NOT_IN_PAGE_FLAGS */ +#else +static inline int page_nid_xchg_last(struct page *page, int nid)  {  	return page_to_nid(page);  } -static inline int page_last_nid(struct page *page) +static inline int page_nid_last(struct page *page)  {  	return page_to_nid(page);  } -static inline void reset_page_last_nid(struct page *page) +static inline void page_nid_reset_last(struct page *page)  {  }  #endif @@ -727,7 +713,7 @@ static inline struct zone *page_zone(const struct page *page)  	return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];  } -#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) +#ifdef SECTION_IN_PAGE_FLAGS  static inline void set_page_section(struct page *page, unsigned long section)  {  	page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT); @@ -757,7 +743,7 @@ static inline void set_page_links(struct page *page, enum zone_type zone,  {  	set_page_zone(page, zone);  	set_page_node(page, node); -#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) +#ifdef SECTION_IN_PAGE_FLAGS  	set_page_section(page, pfn_to_section_nr(pfn));  #endif  } @@ -817,18 +803,7 @@ void page_address_init(void);  #define PAGE_MAPPING_KSM	2  #define PAGE_MAPPING_FLAGS	(PAGE_MAPPING_ANON | PAGE_MAPPING_KSM) -extern struct address_space swapper_space; -static inline struct address_space *page_mapping(struct page *page) -{ -	struct address_space *mapping = page->mapping; - -	VM_BUG_ON(PageSlab(page)); -	if (unlikely(PageSwapCache(page))) -		mapping = &swapper_space; -	else if ((unsigned long)mapping & PAGE_MAPPING_ANON) -		mapping = NULL; -	return mapping; -} +extern struct address_space *page_mapping(struct page *page);  /* Neutral page->mapping pointer to address_space or anon_vma or other */  static inline void *page_rmapping(struct page *page) @@ -1035,18 +1010,18 @@ static inline int fixup_user_fault(struct task_struct *tsk,  }  #endif -extern int make_pages_present(unsigned long addr, unsigned long end);  extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);  extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,  		void *buf, int len, int write); -int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, -		     unsigned long start, int len, unsigned int foll_flags, -		     struct page **pages, struct vm_area_struct **vmas, -		     int *nonblocking); -int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, -			unsigned long start, int nr_pages, int write, int force, -			struct page **pages, struct vm_area_struct **vmas); +long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, +		      unsigned long start, unsigned long nr_pages, +		      unsigned int foll_flags, struct page **pages, +		      struct vm_area_struct **vmas, int *nonblocking); +long get_user_pages(struct task_struct *tsk, struct mm_struct *mm, +		    unsigned long start, unsigned long nr_pages, +		    int write, int force, struct page **pages, +		    struct vm_area_struct **vmas);  int get_user_pages_fast(unsigned long start, int nr_pages, int write,  			struct page **pages);  struct kvec; @@ -1386,7 +1361,6 @@ extern void __init mmap_init(void);  extern void show_mem(unsigned int flags);  extern void si_meminfo(struct sysinfo * val);  extern void si_meminfo_node(struct sysinfo *val, int nid); -extern int after_bootmem;  extern __printf(3, 4)  void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...); @@ -1396,6 +1370,9 @@ extern void setup_per_cpu_pageset(void);  extern void zone_pcp_update(struct zone *zone);  extern void zone_pcp_reset(struct zone *zone); +/* page_alloc.c */ +extern int min_free_kbytes; +  /* nommu.c */  extern atomic_long_t mmap_pages_allocated;  extern int nommu_shrink_inode_mappings(struct inode *, size_t, size_t); @@ -1473,13 +1450,24 @@ extern int install_special_mapping(struct mm_struct *mm,  extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);  extern unsigned long mmap_region(struct file *file, unsigned long addr, -	unsigned long len, unsigned long flags, -	vm_flags_t vm_flags, unsigned long pgoff); -extern unsigned long do_mmap_pgoff(struct file *, unsigned long, -        unsigned long, unsigned long, -        unsigned long, unsigned long); +	unsigned long len, vm_flags_t vm_flags, unsigned long pgoff); +extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, +	unsigned long len, unsigned long prot, unsigned long flags, +	unsigned long pgoff, unsigned long *populate);  extern int do_munmap(struct mm_struct *, unsigned long, size_t); +#ifdef CONFIG_MMU +extern int __mm_populate(unsigned long addr, unsigned long len, +			 int ignore_errors); +static inline void mm_populate(unsigned long addr, unsigned long len) +{ +	/* Ignore errors */ +	(void) __mm_populate(addr, len, 1); +} +#else +static inline void mm_populate(unsigned long addr, unsigned long len) {} +#endif +  /* These take the mm semaphore themselves */  extern unsigned long vm_brk(unsigned long, unsigned long);  extern int vm_munmap(unsigned long, size_t); @@ -1623,9 +1611,20 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,  			unsigned long pfn);  int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,  			unsigned long pfn); +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len); + + +struct page *follow_page_mask(struct vm_area_struct *vma, +			      unsigned long address, unsigned int foll_flags, +			      unsigned int *page_mask); + +static inline struct page *follow_page(struct vm_area_struct *vma, +		unsigned long address, unsigned int foll_flags) +{ +	unsigned int unused_page_mask; +	return follow_page_mask(vma, address, foll_flags, &unused_page_mask); +} -struct page *follow_page(struct vm_area_struct *, unsigned long address, -			unsigned int foll_flags);  #define FOLL_WRITE	0x01	/* check pte is writable */  #define FOLL_TOUCH	0x02	/* mark page accessed */  #define FOLL_GET	0x04	/* do get_page on page */ @@ -1637,6 +1636,7 @@ struct page *follow_page(struct vm_area_struct *, unsigned long address,  #define FOLL_SPLIT	0x80	/* don't return transhuge pages, split them */  #define FOLL_HWPOISON	0x100	/* check page is hwpoisoned */  #define FOLL_NUMA	0x200	/* force NUMA hinting page fault */ +#define FOLL_MIGRATION	0x400	/* wait for page to replace migration entry */  typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr,  			void *data); @@ -1708,7 +1708,11 @@ int vmemmap_populate_basepages(struct page *start_page,  						unsigned long pages, int node);  int vmemmap_populate(struct page *start_page, unsigned long pages, int node);  void vmemmap_populate_print_last(void); - +#ifdef CONFIG_MEMORY_HOTPLUG +void vmemmap_free(struct page *memmap, unsigned long nr_pages); +#endif +void register_page_bootmem_memmap(unsigned long section_nr, struct page *map, +				  unsigned long size);  enum mf_flags {  	MF_COUNT_INCREASED = 1 << 0, @@ -1721,7 +1725,7 @@ extern int unpoison_memory(unsigned long pfn);  extern int sysctl_memory_failure_early_kill;  extern int sysctl_memory_failure_recovery;  extern void shake_page(struct page *p, int access); -extern atomic_long_t mce_bad_pages; +extern atomic_long_t num_poisoned_pages;  extern int soft_offline_page(struct page *page, int flags);  extern void dump_page(struct page *page); diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index f8f5162a357..ace9a5f01c6 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -12,6 +12,7 @@  #include <linux/cpumask.h>  #include <linux/page-debug-flags.h>  #include <linux/uprobes.h> +#include <linux/page-flags-layout.h>  #include <asm/page.h>  #include <asm/mmu.h> @@ -173,7 +174,7 @@ struct page {  	void *shadow;  #endif -#ifdef CONFIG_NUMA_BALANCING +#ifdef LAST_NID_NOT_IN_PAGE_FLAGS  	int _last_nid;  #endif  } @@ -414,9 +415,9 @@ struct mm_struct {  #endif  #ifdef CONFIG_NUMA_BALANCING  	/* -	 * numa_next_scan is the next time when the PTEs will me marked -	 * pte_numa to gather statistics and migrate pages to new nodes -	 * if necessary +	 * numa_next_scan is the next time that the PTEs will be marked +	 * pte_numa. NUMA hinting faults will gather statistics and migrate +	 * pages to new nodes if necessary.  	 */  	unsigned long numa_next_scan; diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 5c69315d60c..61b2c30c903 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -53,6 +53,9 @@ struct mmc_ext_csd {  	u8			part_config;  	u8			cache_ctrl;  	u8			rst_n_function; +	u8			max_packed_writes; +	u8			max_packed_reads; +	u8			packed_event_en;  	unsigned int		part_time;		/* Units: ms */  	unsigned int		sa_timeout;		/* Units: 100ns */  	unsigned int		generic_cmd6_time;	/* Units: 10ms */ @@ -83,7 +86,7 @@ struct mmc_ext_csd {  	unsigned int            data_tag_unit_size;     /* DATA TAG UNIT size */  	unsigned int		boot_ro_lock;		/* ro lock support */  	bool			boot_ro_lockable; -	u8			raw_exception_status;	/* 53 */ +	u8			raw_exception_status;	/* 54 */  	u8			raw_partition_support;	/* 160 */  	u8			raw_rpmb_size_mult;	/* 168 */  	u8			raw_erased_mem_count;	/* 181 */ @@ -187,6 +190,18 @@ struct sdio_func_tuple;  #define SDIO_MAX_FUNCS		7 +enum mmc_blk_status { +	MMC_BLK_SUCCESS = 0, +	MMC_BLK_PARTIAL, +	MMC_BLK_CMD_ERR, +	MMC_BLK_RETRY, +	MMC_BLK_ABORT, +	MMC_BLK_DATA_ERR, +	MMC_BLK_ECC_ERR, +	MMC_BLK_NOMEDIUM, +	MMC_BLK_NEW_REQUEST, +}; +  /* The number of MMC physical partitions.  These consist of:   * boot partitions (2), general purpose partitions (4) in MMC v4.4.   */ @@ -295,6 +310,11 @@ static inline void mmc_part_add(struct mmc_card *card, unsigned int size,  	card->nr_parts++;  } +static inline bool mmc_large_sector(struct mmc_card *card) +{ +	return card->ext_csd.data_sector_size == 4096; +} +  /*   *  The world is not perfect and supplies us with broken mmc/sdio devices.   *  For at least some of these bugs we need a work-around. diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 5bf7c2274fc..39613b9a6fc 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -18,6 +18,9 @@ struct mmc_request;  struct mmc_command {  	u32			opcode;  	u32			arg; +#define MMC_CMD23_ARG_REL_WR	(1 << 31) +#define MMC_CMD23_ARG_PACKED	((0 << 31) | (1 << 30)) +#define MMC_CMD23_ARG_TAG_REQ	(1 << 29)  	u32			resp[4];  	unsigned int		flags;		/* expected response type */  #define MMC_RSP_PRESENT	(1 << 0) @@ -120,6 +123,7 @@ struct mmc_data {  	s32			host_cookie;	/* host private data */  }; +struct mmc_host;  struct mmc_request {  	struct mmc_command	*sbc;		/* SET_BLOCK_COUNT for multiblock */  	struct mmc_command	*cmd; @@ -128,9 +132,9 @@ struct mmc_request {  	struct completion	completion;  	void			(*done)(struct mmc_request *);/* completion function */ +	struct mmc_host		*host;  }; -struct mmc_host;  struct mmc_card;  struct mmc_async_req; @@ -147,6 +151,7 @@ extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,  extern void mmc_start_bkops(struct mmc_card *card, bool from_exception);  extern int __mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int, bool);  extern int mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int); +extern int mmc_send_ext_csd(struct mmc_card *card, u8 *ext_csd);  #define MMC_ERASE_ARG		0x00000000  #define MMC_SECURE_ERASE_ARG	0x80000000 diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 34be4f47293..198f0fa44e9 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -209,8 +209,10 @@ struct dw_mci_dma_ops {  #define DW_MCI_QUIRK_HIGHSPEED			BIT(2)  /* Unreliable card detection */  #define DW_MCI_QUIRK_BROKEN_CARD_DETECTION	BIT(3) -/* Write Protect detection not available */ -#define DW_MCI_QUIRK_NO_WRITE_PROTECT		BIT(4) + +/* Slot level quirks */ +/* This slot has no write protect */ +#define DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT	BIT(0)  struct dma_pdata; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 61a10c17aab..d6f20cc6415 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -131,9 +131,11 @@ struct mmc_host_ops {  	int	(*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios); +	/* Check if the card is pulling dat[0:3] low */ +	int	(*card_busy)(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);  	void	(*card_event)(struct mmc_host *host); @@ -170,6 +172,22 @@ struct mmc_slot {  	void *handler_priv;  }; +/** + * mmc_context_info - synchronization details for mmc context + * @is_done_rcv		wake up reason was done request + * @is_new_req		wake up reason was new request + * @is_waiting_last_req	mmc context waiting for single running request + * @wait		wait queue + * @lock		lock to protect data fields + */ +struct mmc_context_info { +	bool			is_done_rcv; +	bool			is_new_req; +	bool			is_waiting_last_req; +	wait_queue_head_t	wait; +	spinlock_t		lock; +}; +  struct regulator;  struct mmc_supply { @@ -258,6 +276,10 @@ struct mmc_host {  #define MMC_CAP2_HC_ERASE_SZ	(1 << 9)	/* High-capacity erase size */  #define MMC_CAP2_CD_ACTIVE_HIGH	(1 << 10)	/* Card-detect signal active high */  #define MMC_CAP2_RO_ACTIVE_HIGH	(1 << 11)	/* Write-protect signal active high */ +#define MMC_CAP2_PACKED_RD	(1 << 12)	/* Allow packed read */ +#define MMC_CAP2_PACKED_WR	(1 << 13)	/* Allow packed write */ +#define MMC_CAP2_PACKED_CMD	(MMC_CAP2_PACKED_RD | \ +				 MMC_CAP2_PACKED_WR)  	mmc_pm_flag_t		pm_caps;	/* supported pm features */ @@ -331,6 +353,7 @@ struct mmc_host {  	struct dentry		*debugfs_root;  	struct mmc_async_req	*areq;		/* active async req */ +	struct mmc_context_info	context_info;	/* async synchronization info */  #ifdef CONFIG_FAIL_MMC_REQUEST  	struct fault_attr	fail_mmc_request; @@ -341,10 +364,11 @@ struct mmc_host {  	unsigned long		private[0] ____cacheline_aligned;  }; -extern struct mmc_host *mmc_alloc_host(int extra, struct device *); -extern int mmc_add_host(struct mmc_host *); -extern void mmc_remove_host(struct mmc_host *); -extern void mmc_free_host(struct mmc_host *); +struct mmc_host *mmc_alloc_host(int extra, struct device *); +int mmc_add_host(struct mmc_host *); +void mmc_remove_host(struct mmc_host *); +void mmc_free_host(struct mmc_host *); +void mmc_of_parse(struct mmc_host *host);  static inline void *mmc_priv(struct mmc_host *host)  { @@ -357,16 +381,16 @@ static inline void *mmc_priv(struct mmc_host *host)  #define mmc_classdev(x)	(&(x)->class_dev)  #define mmc_hostname(x)	(dev_name(&(x)->class_dev)) -extern int mmc_suspend_host(struct mmc_host *); -extern int mmc_resume_host(struct mmc_host *); +int mmc_suspend_host(struct mmc_host *); +int mmc_resume_host(struct mmc_host *); -extern int mmc_power_save_host(struct mmc_host *host); -extern int mmc_power_restore_host(struct mmc_host *host); +int mmc_power_save_host(struct mmc_host *host); +int mmc_power_restore_host(struct mmc_host *host); -extern void mmc_detect_change(struct mmc_host *, unsigned long delay); -extern void mmc_request_done(struct mmc_host *, struct mmc_request *); +void mmc_detect_change(struct mmc_host *, unsigned long delay); +void mmc_request_done(struct mmc_host *, struct mmc_request *); -extern int mmc_cache_ctrl(struct mmc_host *, u8); +int mmc_cache_ctrl(struct mmc_host *, u8);  static inline void mmc_signal_sdio_irq(struct mmc_host *host)  { @@ -434,6 +458,19 @@ static inline int mmc_boot_partition_access(struct mmc_host *host)  	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);  } +static inline int mmc_host_uhs(struct mmc_host *host) +{ +	return host->caps & +		(MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | +		 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | +		 MMC_CAP_UHS_DDR50); +} + +static inline int mmc_host_packed_wr(struct mmc_host *host) +{ +	return host->caps2 & MMC_CAP2_PACKED_WR; +} +  #ifdef CONFIG_MMC_CLKGATE  void mmc_host_clk_hold(struct mmc_host *host);  void mmc_host_clk_release(struct mmc_host *host); diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 94d532e41c6..50bcde3677c 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -139,7 +139,7 @@ static inline bool mmc_op_multi(u32 opcode)  #define R1_CURRENT_STATE(x)	((x & 0x00001E00) >> 9)	/* sx, b (4 bits) */  #define R1_READY_FOR_DATA	(1 << 8)	/* sx, a */  #define R1_SWITCH_ERROR		(1 << 7)	/* sx, c */ -#define R1_EXCEPTION_EVENT	(1 << 6)	/* sx, a */ +#define R1_EXCEPTION_EVENT	(1 << 6)	/* sr, a */  #define R1_APP_CMD		(1 << 5)	/* sr, c */  #define R1_STATE_IDLE	0 @@ -275,7 +275,10 @@ struct _mmc_csd {  #define EXT_CSD_FLUSH_CACHE		32      /* W */  #define EXT_CSD_CACHE_CTRL		33      /* R/W */  #define EXT_CSD_POWER_OFF_NOTIFICATION	34	/* R/W */ -#define EXT_CSD_EXP_EVENTS_STATUS	54	/* RO */ +#define EXT_CSD_PACKED_FAILURE_INDEX	35	/* RO */ +#define EXT_CSD_PACKED_CMD_STATUS	36	/* RO */ +#define EXT_CSD_EXP_EVENTS_STATUS	54	/* RO, 2 bytes */ +#define EXT_CSD_EXP_EVENTS_CTRL		56	/* R/W, 2 bytes */  #define EXT_CSD_DATA_SECTOR_SIZE	61	/* R */  #define EXT_CSD_GP_SIZE_MULT		143	/* R/W */  #define EXT_CSD_PARTITION_ATTRIBUTE	156	/* R/W */ @@ -324,6 +327,8 @@ struct _mmc_csd {  #define EXT_CSD_CACHE_SIZE		249	/* RO, 4 bytes */  #define EXT_CSD_TAG_UNIT_SIZE		498	/* RO */  #define EXT_CSD_DATA_TAG_SUPPORT	499	/* RO */ +#define EXT_CSD_MAX_PACKED_WRITES	500	/* RO */ +#define EXT_CSD_MAX_PACKED_READS	501	/* RO */  #define EXT_CSD_BKOPS_SUPPORT		502	/* RO */  #define EXT_CSD_HPI_FEATURES		503	/* RO */ @@ -385,6 +390,9 @@ struct _mmc_csd {  #define EXT_CSD_PWR_CL_4BIT_MASK	0x0F	/* 8 bit PWR CLS */  #define EXT_CSD_PWR_CL_8BIT_SHIFT	4  #define EXT_CSD_PWR_CL_4BIT_SHIFT	0 + +#define EXT_CSD_PACKED_EVENT_EN	BIT(3) +  /*   * EXCEPTION_EVENT_STATUS field   */ @@ -393,6 +401,9 @@ struct _mmc_csd {  #define EXT_CSD_SYSPOOL_EXHAUSTED	BIT(2)  #define EXT_CSD_PACKED_FAILURE		BIT(3) +#define EXT_CSD_PACKED_GENERIC_ERROR	BIT(0) +#define EXT_CSD_PACKED_INDEXED_ERROR	BIT(1) +  /*   * BKOPS status level   */ diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 4bbc3301fbb..b838ffc49e4 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -94,6 +94,7 @@ struct sdhci_host {  #define SDHCI_QUIRK2_HOST_NO_CMD23			(1<<1)  /* The system physically doesn't support 1.8v, even if the host does */  #define SDHCI_QUIRK2_NO_1_8_V				(1<<2) +#define SDHCI_QUIRK2_PRESET_VALUE_BROKEN		(1<<3)  	int irq;		/* Device IRQ */  	void __iomem *ioaddr;	/* Mapped address */ diff --git a/include/linux/mmc/sh_mobile_sdhi.h b/include/linux/mmc/sh_mobile_sdhi.h index b65679ffa88..b76bcf0621f 100644 --- a/include/linux/mmc/sh_mobile_sdhi.h +++ b/include/linux/mmc/sh_mobile_sdhi.h @@ -4,7 +4,6 @@  #include <linux/types.h>  struct platform_device; -struct tmio_mmc_data;  #define SH_MOBILE_SDHI_IRQ_CARD_DETECT	"card_detect"  #define SH_MOBILE_SDHI_IRQ_SDCARD	"sdcard" @@ -26,7 +25,6 @@ struct sh_mobile_sdhi_info {  	unsigned long tmio_caps2;  	u32 tmio_ocr_mask;	/* available MMC voltages */  	unsigned int cd_gpio; -	struct tmio_mmc_data *pdata;  	void (*set_pwr)(struct platform_device *pdev, int state);  	int (*get_cd)(struct platform_device *pdev); diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 73b64a38b98..c74092eebf5 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -15,7 +15,7 @@  #include <linux/seqlock.h>  #include <linux/nodemask.h>  #include <linux/pageblock-flags.h> -#include <generated/bounds.h> +#include <linux/page-flags-layout.h>  #include <linux/atomic.h>  #include <asm/page.h> @@ -57,7 +57,9 @@ enum {  	 */  	MIGRATE_CMA,  #endif +#ifdef CONFIG_MEMORY_ISOLATION  	MIGRATE_ISOLATE,	/* can't allocate from here */ +#endif  	MIGRATE_TYPES  }; @@ -308,24 +310,6 @@ enum zone_type {  #ifndef __GENERATING_BOUNDS_H -/* - * When a memory allocation must conform to specific limitations (such - * as being suitable for DMA) the caller will pass in hints to the - * allocator in the gfp_mask, in the zone modifier bits.  These bits - * are used to select a priority ordered list of memory zones which - * match the requested limits. See gfp_zone() in include/linux/gfp.h - */ - -#if MAX_NR_ZONES < 2 -#define ZONES_SHIFT 0 -#elif MAX_NR_ZONES <= 2 -#define ZONES_SHIFT 1 -#elif MAX_NR_ZONES <= 4 -#define ZONES_SHIFT 2 -#else -#error ZONES_SHIFT -- too many zones configured adjust calculation -#endif -  struct zone {  	/* Fields commonly accessed by the page allocator */ @@ -543,6 +527,26 @@ static inline int zone_is_oom_locked(const struct zone *zone)  	return test_bit(ZONE_OOM_LOCKED, &zone->flags);  } +static inline unsigned long zone_end_pfn(const struct zone *zone) +{ +	return zone->zone_start_pfn + zone->spanned_pages; +} + +static inline bool zone_spans_pfn(const struct zone *zone, unsigned long pfn) +{ +	return zone->zone_start_pfn <= pfn && pfn < zone_end_pfn(zone); +} + +static inline bool zone_is_initialized(struct zone *zone) +{ +	return !!zone->wait_table; +} + +static inline bool zone_is_empty(struct zone *zone) +{ +	return zone->spanned_pages == 0; +} +  /*   * The "priority" of VM scanning is how much of the queues we will scan in one   * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the @@ -752,11 +756,17 @@ typedef struct pglist_data {  #define nid_page_nr(nid, pagenr) 	pgdat_page_nr(NODE_DATA(nid),(pagenr))  #define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) +#define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid)) -#define node_end_pfn(nid) ({\ -	pg_data_t *__pgdat = NODE_DATA(nid);\ -	__pgdat->node_start_pfn + __pgdat->node_spanned_pages;\ -}) +static inline unsigned long pgdat_end_pfn(pg_data_t *pgdat) +{ +	return pgdat->node_start_pfn + pgdat->node_spanned_pages; +} + +static inline bool pgdat_is_empty(pg_data_t *pgdat) +{ +	return !pgdat->node_start_pfn && !pgdat->node_spanned_pages; +}  #include <linux/memory_hotplug.h> @@ -1053,8 +1063,6 @@ static inline unsigned long early_pfn_to_nid(unsigned long pfn)   * PA_SECTION_SHIFT		physical address to/from section number   * PFN_SECTION_SHIFT		pfn to/from section number   */ -#define SECTIONS_SHIFT		(MAX_PHYSMEM_BITS - SECTION_SIZE_BITS) -  #define PA_SECTION_SHIFT	(SECTION_SIZE_BITS)  #define PFN_SECTION_SHIFT	(SECTION_SIZE_BITS - PAGE_SHIFT) diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index fed3def6281..b508016fb76 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -9,6 +9,7 @@  #ifdef __KERNEL__  #include <linux/types.h> +#include <linux/uuid.h>  typedef unsigned long kernel_ulong_t;  #endif @@ -33,8 +34,7 @@ struct ieee1394_device_id {  	__u32 model_id;  	__u32 specifier_id;  	__u32 version; -	kernel_ulong_t driver_data -		__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;  }; @@ -148,8 +148,7 @@ struct hid_device_id {  	__u16 group;  	__u32 vendor;  	__u32 product; -	kernel_ulong_t driver_data -		__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;  };  /* s390 CCW devices */ @@ -173,8 +172,6 @@ struct ccw_device_id {  struct ap_device_id {  	__u16 match_flags;	/* which fields to match against */  	__u8 dev_type;		/* device type */ -	__u8 pad1; -	__u32 pad2;  	kernel_ulong_t driver_info;  }; @@ -184,13 +181,10 @@ struct ap_device_id {  struct css_device_id {  	__u8 match_flags;  	__u8 type; /* subchannel type */ -	__u16 pad2; -	__u32 pad3;  	kernel_ulong_t driver_data;  }; -#define ACPI_ID_LEN	16 /* only 9 bytes needed here, 16 bytes are used */ -			   /* to workaround crosscompile issues */ +#define ACPI_ID_LEN	9  struct acpi_device_id {  	__u8 id[ACPI_ID_LEN]; @@ -231,11 +225,7 @@ struct of_device_id  	char	name[32];  	char	type[32];  	char	compatible[128]; -#ifdef __KERNEL__  	const void *data; -#else -	kernel_ulong_t data; -#endif  };  /* VIO */ @@ -260,24 +250,14 @@ struct pcmcia_device_id {  	/* for pseudo multi-function devices */  	__u8  		device_no; -	__u32 		prod_id_hash[4] -		__attribute__((aligned(sizeof(__u32)))); +	__u32 		prod_id_hash[4];  	/* not matched against in kernelspace*/ -#ifdef __KERNEL__  	const char *	prod_id[4]; -#else -	kernel_ulong_t	prod_id[4] -		__attribute__((aligned(sizeof(kernel_ulong_t)))); -#endif  	/* not matched against */  	kernel_ulong_t	driver_info; -#ifdef __KERNEL__  	char *		cisfile; -#else -	kernel_ulong_t	cisfile; -#endif  };  #define PCMCIA_DEV_ID_MATCH_MANF_ID	0x0001 @@ -373,8 +353,7 @@ struct sdio_device_id {  	__u8	class;			/* Standard interface or SDIO_ANY_ID */  	__u16	vendor;			/* Vendor or SDIO_ANY_ID */  	__u16	device;			/* Device ID or SDIO_ANY_ID */ -	kernel_ulong_t driver_data	/* Data private to the driver */ -		__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;	/* Data private to the driver */  };  /* SSB core, see drivers/ssb/ */ @@ -420,8 +399,7 @@ struct virtio_device_id {   */  struct hv_vmbus_device_id {  	__u8 guid[16]; -	kernel_ulong_t driver_data	/* Data private to the driver */ -			__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;	/* Data private to the driver */  };  /* rpmsg */ @@ -440,8 +418,7 @@ struct rpmsg_device_id {  struct i2c_device_id {  	char name[I2C_NAME_SIZE]; -	kernel_ulong_t driver_data	/* Data private to the driver */ -			__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;	/* Data private to the driver */  };  /* spi */ @@ -451,8 +428,7 @@ struct i2c_device_id {  struct spi_device_id {  	char name[SPI_NAME_SIZE]; -	kernel_ulong_t driver_data	/* Data private to the driver */ -			__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;	/* Data private to the driver */  };  /* dmi */ @@ -484,15 +460,6 @@ struct dmi_strmatch {  	char substr[79];  }; -#ifndef __KERNEL__ -struct dmi_system_id { -	kernel_ulong_t callback; -	kernel_ulong_t ident; -	struct dmi_strmatch matches[4]; -	kernel_ulong_t driver_data -			__attribute__((aligned(sizeof(kernel_ulong_t)))); -}; -#else  struct dmi_system_id {  	int (*callback)(const struct dmi_system_id *);  	const char *ident; @@ -506,7 +473,6 @@ struct dmi_system_id {   *	error: storage size of '__mod_dmi_device_table' isn't known   */  #define dmi_device_id dmi_system_id -#endif  #define DMI_MATCH(a, b)	{ a, b } @@ -515,8 +481,7 @@ struct dmi_system_id {  struct platform_device_id {  	char name[PLATFORM_NAME_SIZE]; -	kernel_ulong_t driver_data -			__attribute__((aligned(sizeof(kernel_ulong_t)))); +	kernel_ulong_t driver_data;  };  #define MDIO_MODULE_PREFIX	"mdio:" @@ -572,11 +537,7 @@ struct isapnp_device_id {  struct amba_id {  	unsigned int		id;  	unsigned int		mask; -#ifndef __KERNEL__ -	kernel_ulong_t		data; -#else  	void			*data; -#endif  };  /* @@ -608,4 +569,12 @@ struct ipack_device_id {  	__u32 device;			/* Device ID or IPACK_ANY_ID */  }; +#define MEI_CL_MODULE_PREFIX "mei:" +#define MEI_CL_NAME_SIZE 32 + +struct mei_cl_device_id { +	char name[MEI_CL_NAME_SIZE]; +	kernel_ulong_t driver_info; +}; +  #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/module.h b/include/linux/module.h index 1375ee3f03a..ead1b5719a1 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -396,13 +396,13 @@ bool is_module_address(unsigned long addr);  bool is_module_percpu_address(unsigned long addr);  bool is_module_text_address(unsigned long addr); -static inline int within_module_core(unsigned long addr, struct module *mod) +static inline int within_module_core(unsigned long addr, const struct module *mod)  {  	return (unsigned long)mod->module_core <= addr &&  	       addr < (unsigned long)mod->module_core + mod->core_size;  } -static inline int within_module_init(unsigned long addr, struct module *mod) +static inline int within_module_init(unsigned long addr, const struct module *mod)  {  	return (unsigned long)mod->module_init <= addr &&  	       addr < (unsigned long)mod->module_init + mod->init_size; diff --git a/include/linux/mount.h b/include/linux/mount.h index d7029f4a191..73005f9957e 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -47,6 +47,8 @@ struct mnt_namespace;  #define MNT_INTERNAL	0x4000 +#define MNT_LOCK_READONLY	0x400000 +  struct vfsmount {  	struct dentry *mnt_root;	/* root of the mounted tree */  	struct super_block *mnt_sb;	/* pointer to superblock */ diff --git a/include/linux/mroute.h b/include/linux/mroute.h index ea00d9162ee..79aaa9fc1a1 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h @@ -9,7 +9,7 @@  #ifdef CONFIG_IP_MROUTE  static inline int ip_mroute_opt(int opt)  { -	return (opt >= MRT_BASE) && (opt <= MRT_BASE + 10); +	return (opt >= MRT_BASE) && (opt <= MRT_MAX);  }  #else  static inline int ip_mroute_opt(int opt) diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index a223561ba12..66982e76405 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h @@ -10,7 +10,7 @@  #ifdef CONFIG_IPV6_MROUTE  static inline int ip6_mroute_opt(int opt)  { -	return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10); +	return (opt >= MRT6_BASE) && (opt <= MRT6_MAX);  }  #else  static inline int ip6_mroute_opt(int opt) diff --git a/include/linux/msi.h b/include/linux/msi.h index ce93a341337..20c2d6dd5d2 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -13,14 +13,14 @@ struct msi_msg {  /* Helper functions */  struct irq_data;  struct msi_desc; -extern void mask_msi_irq(struct irq_data *data); -extern void unmask_msi_irq(struct irq_data *data); -extern void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); -extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); -extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); -extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); +void mask_msi_irq(struct irq_data *data); +void unmask_msi_irq(struct irq_data *data); +void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); +void read_msi_msg(unsigned int irq, struct msi_msg *msg); +void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); +void write_msi_msg(unsigned int irq, struct msi_msg *msg);  struct msi_desc {  	struct { @@ -54,9 +54,8 @@ struct msi_desc {   */  int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);  void arch_teardown_msi_irq(unsigned int irq); -extern int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); -extern void arch_teardown_msi_irqs(struct pci_dev *dev); -extern int arch_msi_check_device(struct pci_dev* dev, int nvec, int type); - +int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); +void arch_teardown_msi_irqs(struct pci_dev *dev); +int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);  #endif /* LINUX_MSI_H */ diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index f6eb4332ac9..4b02512e421 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h @@ -245,6 +245,7 @@ struct map_info {  	unsigned long pfow_base;  	unsigned long map_priv_1;  	unsigned long map_priv_2; +	struct device_node *device_node;  	void *fldrv_priv;  	struct mtd_chip_driver *fldrv;  }; @@ -328,7 +329,7 @@ static inline int map_word_bitsset(struct map_info *map, map_word val1, map_word  static inline map_word map_word_load(struct map_info *map, const void *ptr)  { -	map_word r = {{0} }; +	map_word r;  	if (map_bankwidth_is_1(map))  		r.x[0] = *(unsigned char *)ptr; @@ -342,6 +343,8 @@ static inline map_word map_word_load(struct map_info *map, const void *ptr)  #endif  	else if (map_bankwidth_is_large(map))  		memcpy(r.x, ptr, map->bankwidth); +	else +		BUG();  	return r;  } @@ -391,7 +394,7 @@ static inline map_word map_word_ff(struct map_info *map)  static inline map_word inline_map_read(struct map_info *map, unsigned long ofs)  { -	map_word uninitialized_var(r); +	map_word r;  	if (map_bankwidth_is_1(map))  		r.x[0] = __raw_readb(map->virt + ofs); @@ -425,6 +428,8 @@ static inline void inline_map_write(struct map_info *map, const map_word datum,  #endif  	else if (map_bankwidth_is_large(map))  		memcpy_toio(map->virt+ofs, datum.x, map->bankwidth); +	else +		BUG();  	mb();  } diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 7ccb3c59ed6..ef52d9c9145 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -187,6 +187,13 @@ typedef enum {   * This happens with the Renesas AG-AND chips, possibly others.   */  #define BBT_AUTO_REFRESH	0x00000080 +/* + * Chip requires ready check on read (for auto-incremented sequential read). + * True only for small page devices; large page devices do not support + * autoincrement. + */ +#define NAND_NEED_READRDY	0x00000100 +  /* Chip does not allow subpage writes */  #define NAND_NO_SUBPAGE_WRITE	0x00000200 diff --git a/include/linux/mutex.h b/include/linux/mutex.h index 9121595a8eb..433da8a1a42 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -53,6 +53,9 @@ struct mutex {  #if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP)  	struct task_struct	*owner;  #endif +#ifdef CONFIG_MUTEX_SPIN_ON_OWNER +	void			*spin_mlock;	/* Spinner MCS lock */ +#endif  #ifdef CONFIG_DEBUG_MUTEXES  	const char 		*name;  	void			*magic; diff --git a/include/linux/mxsfb.h b/include/linux/mxsfb.h index f14943d5531..f80af867434 100644 --- a/include/linux/mxsfb.h +++ b/include/linux/mxsfb.h @@ -24,8 +24,8 @@  #define STMLCDIF_18BIT 2 /** pixel data bus to the display is of 18 bit width */  #define STMLCDIF_24BIT 3 /** pixel data bus to the display is of 24 bit width */ -#define FB_SYNC_DATA_ENABLE_HIGH_ACT	(1 << 6) -#define FB_SYNC_DOTCLK_FAILING_ACT	(1 << 7) /* failing/negtive edge sampling */ +#define MXSFB_SYNC_DATA_ENABLE_HIGH_ACT	(1 << 6) +#define MXSFB_SYNC_DOTCLK_FAILING_ACT	(1 << 7) /* failing/negtive edge sampling */  struct mxsfb_platform_data {  	struct fb_videomode *mode_list; @@ -44,6 +44,9 @@ struct mxsfb_platform_data {  				 * allocated. If specified,fb_size must also be specified.  				 * fb_phys must be unused by Linux.  				 */ +	u32 sync;		/* sync mask, contains MXSFB specifics not +				 * carried in fb_info->var.sync +				 */  };  #endif /* __LINUX_MXSFB_H */ diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index 5ac32123035..3dd39340430 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h @@ -41,7 +41,7 @@ enum {  	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_GRE_BIT,		/* ... GRE with TSO */  	/**/NETIF_F_GSO_LAST,		/* [can't be last bit, see GSO_MASK] */  	NETIF_F_GSO_RESERVED2		/* ... free (fill GSO_MASK to 8 bits) */  		= NETIF_F_GSO_LAST, @@ -102,6 +102,7 @@ enum {  #define NETIF_F_VLAN_CHALLENGED	__NETIF_F(VLAN_CHALLENGED)  #define NETIF_F_RXFCS		__NETIF_F(RXFCS)  #define NETIF_F_RXALL		__NETIF_F(RXALL) +#define NETIF_F_GRE_GSO		__NETIF_F(GSO_GRE)  /* Features valid for ethtool to change */  /* = all defined minus driver/device-class-related */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9ef07d0868b..6151e903eef 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -67,6 +67,8 @@ extern void netdev_set_default_ethtool_ops(struct net_device *dev,  #define NET_ADDR_PERM		0	/* address is permanent (default) */  #define NET_ADDR_RANDOM		1	/* address is generated randomly */  #define NET_ADDR_STOLEN		2	/* address is stolen from other device */ +#define NET_ADDR_SET		3	/* address is set using +					 * dev_set_mac_address() */  /* Backlog congestion levels */  #define NET_RX_SUCCESS		0	/* keep 'em coming, baby */ @@ -208,9 +210,9 @@ struct netdev_hw_addr {  #define NETDEV_HW_ADDR_T_SLAVE		3  #define NETDEV_HW_ADDR_T_UNICAST	4  #define NETDEV_HW_ADDR_T_MULTICAST	5 -	bool			synced;  	bool			global_use;  	int			refcount; +	int			synced;  	struct rcu_head		rcu_head;  }; @@ -859,8 +861,7 @@ struct netdev_fcoe_hbainfo {   *	flow_id is a flow ID to be passed to rps_may_expire_flow() later.   *	Return the filter ID on success, or a negative error code.   * - *	Slave management functions (for bridge, bonding, etc). User should - *	call netdev_set_master() to set dev->master properly. + *	Slave management functions (for bridge, bonding, etc).   * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev);   *	Called to make another netdev an underling.   * @@ -883,7 +884,8 @@ struct netdev_fcoe_hbainfo {   *		      struct net_device *dev,   *		      const unsigned char *addr, u16 flags)   *	Adds an FDB entry to dev for addr. - * int (*ndo_fdb_del)(struct ndmsg *ndm, struct net_device *dev, + * int (*ndo_fdb_del)(struct ndmsg *ndm, struct nlattr *tb[], + *		      struct net_device *dev,   *		      const unsigned char *addr)   *	Deletes the FDB entry from dev coresponding to addr.   * int (*ndo_fdb_dump)(struct sk_buff *skb, struct netlink_callback *cb, @@ -893,7 +895,15 @@ struct netdev_fcoe_hbainfo {   *   * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh)   * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq, - *			     struct net_device *dev) + *			     struct net_device *dev, u32 filter_mask) + * + * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier); + *	Called to change device carrier. Soft-devices (like dummy, team, etc) + *	which do not represent real hardware may define this to allow their + *	userspace components to manage their virtual carrier state. Devices + *	that determine carrier state from physical hardware properties (eg + *	network cables) or protocol-dependent mechanisms (eg + *	USB_CDC_NOTIFY_NETWORK_CONNECTION) should NOT implement this function.   */  struct net_device_ops {  	int			(*ndo_init)(struct net_device *dev); @@ -999,6 +1009,7 @@ struct net_device_ops {  					       const unsigned char *addr,  					       u16 flags);  	int			(*ndo_fdb_del)(struct ndmsg *ndm, +					       struct nlattr *tb[],  					       struct net_device *dev,  					       const unsigned char *addr);  	int			(*ndo_fdb_dump)(struct sk_buff *skb, @@ -1010,7 +1021,12 @@ struct net_device_ops {  						      struct nlmsghdr *nlh);  	int			(*ndo_bridge_getlink)(struct sk_buff *skb,  						      u32 pid, u32 seq, -						      struct net_device *dev); +						      struct net_device *dev, +						      u32 filter_mask); +	int			(*ndo_bridge_dellink)(struct net_device *dev, +						      struct nlmsghdr *nlh); +	int			(*ndo_change_carrier)(struct net_device *dev, +						      bool new_carrier);  };  /* @@ -1161,9 +1177,7 @@ struct net_device {  						 * avoid dirtying this cache line.  						 */ -	struct net_device	*master; /* Pointer to master device of a group, -					  * which this device is member of. -					  */ +	struct list_head	upper_dev_list; /* List of upper devices */  	/* Interface address info used in eth_type_trans() */  	unsigned char		*dev_addr;	/* hw address, (before bcast @@ -1263,7 +1277,7 @@ struct net_device {  	void (*destructor)(struct net_device *dev);  #ifdef CONFIG_NETPOLL -	struct netpoll_info	*npinfo; +	struct netpoll_info __rcu	*npinfo;  #endif  #ifdef CONFIG_NET_NS @@ -1277,9 +1291,12 @@ struct net_device {  		struct pcpu_lstats __percpu	*lstats; /* loopback stats */  		struct pcpu_tstats __percpu	*tstats; /* tunnel stats */  		struct pcpu_dstats __percpu	*dstats; /* dummy stats */ +		struct pcpu_vstats __percpu	*vstats; /* veth stats */  	};  	/* GARP */  	struct garp_port __rcu	*garp_port; +	/* MRP */ +	struct mrp_port __rcu	*mrp_port;  	/* class/net/name entry */  	struct device		dev; @@ -1396,6 +1413,7 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev,  extern struct netdev_queue *netdev_pick_tx(struct net_device *dev,  					   struct sk_buff *skb); +extern u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb);  /*   * Net namespace inlines @@ -2095,6 +2113,18 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)  		__netif_schedule(txq->qdisc);  } +#ifdef CONFIG_XPS +extern int netif_set_xps_queue(struct net_device *dev, struct cpumask *mask, +			       u16 index); +#else +static inline int netif_set_xps_queue(struct net_device *dev, +				      struct cpumask *mask, +				      u16 index) +{ +	return 0; +} +#endif +  /*   * Returns a Tx hash for the given packet when dev->real_num_tx_queues is used   * as a distribution range limit for the returned value. @@ -2197,6 +2227,8 @@ extern int		dev_set_mtu(struct net_device *, int);  extern void		dev_set_group(struct net_device *, int);  extern int		dev_set_mac_address(struct net_device *,  					    struct sockaddr *); +extern int		dev_change_carrier(struct net_device *, +					   bool new_carrier);  extern int		dev_hard_start_xmit(struct sk_buff *skb,  					    struct net_device *dev,  					    struct netdev_queue *txq); @@ -2614,7 +2646,6 @@ extern void		netdev_notify_peers(struct net_device *dev);  extern void		netdev_features_change(struct net_device *dev);  /* Load a device via the kmod */  extern void		dev_load(struct net *net, const char *name); -extern void		dev_mcast_init(void);  extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,  					       struct rtnl_link_stats64 *storage);  extern void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64, @@ -2624,12 +2655,30 @@ extern int		netdev_max_backlog;  extern int		netdev_tstamp_prequeue;  extern int		weight_p;  extern int		bpf_jit_enable; -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 bool netdev_has_upper_dev(struct net_device *dev, +				 struct net_device *upper_dev); +extern bool netdev_has_any_upper_dev(struct net_device *dev); +extern struct net_device *netdev_master_upper_dev_get(struct net_device *dev); +extern struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); +extern int netdev_upper_dev_link(struct net_device *dev, +				 struct net_device *upper_dev); +extern int netdev_master_upper_dev_link(struct net_device *dev, +					struct net_device *upper_dev); +extern void netdev_upper_dev_unlink(struct net_device *dev, +				    struct net_device *upper_dev);  extern int skb_checksum_help(struct sk_buff *skb); -extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, -	netdev_features_t features); +extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb, +	netdev_features_t features, bool tx_path); +extern struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, +					  netdev_features_t features); + +static inline +struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) +{ +	return __skb_gso_segment(skb, features, true); +} +  #ifdef CONFIG_BUG  extern void netdev_rx_csum_fault(struct net_device *dev);  #else @@ -2642,9 +2691,9 @@ extern void		net_enable_timestamp(void);  extern void		net_disable_timestamp(void);  #ifdef CONFIG_PROC_FS -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 __init dev_proc_init(void); +#else +#define dev_proc_init() 0  #endif  extern int netdev_class_create_file(struct class_attribute *class_attr); @@ -2846,4 +2895,34 @@ do {								\  })  #endif +/* + *	The list of packet types we will receive (as opposed to discard) + *	and the routines to invoke. + * + *	Why 16. Because with 16 the only overlap we get on a hash of the + *	low nibble of the protocol value is RARP/SNAP/X.25. + * + *      NOTE:  That is no longer true with the addition of VLAN tags.  Not + *             sure which should go first, but I bet it won't make much + *             difference if we are running VLANs.  The good news is that + *             this protocol won't be in the list unless compiled in, so + *             the average user (w/out VLANs) will not be adversely affected. + *             --BLG + * + *		0800	IP + *		8100    802.1Q VLAN + *		0001	802.3 + *		0002	AX.25 + *		0004	802.2 + *		8035	RARP + *		0005	SNAP + *		0805	X.25 + *		0806	ARP + *		8137	IPX + *		0009	Localtalk + *		86DD	IPv6 + */ +#define PTYPE_HASH_SIZE	(16) +#define PTYPE_HASH_MASK	(PTYPE_HASH_SIZE - 1) +  #endif	/* _LINUX_NETDEVICE_H */ diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h index ef9acd3c845..0214c4c146f 100644 --- a/include/linux/netfilter/ipset/ip_set_ahash.h +++ b/include/linux/netfilter/ipset/ip_set_ahash.h @@ -291,6 +291,7 @@ ip_set_hash_destroy(struct ip_set *set)  #define type_pf_data_tlist	TOKEN(TYPE, PF, _data_tlist)  #define type_pf_data_next	TOKEN(TYPE, PF, _data_next)  #define type_pf_data_flags	TOKEN(TYPE, PF, _data_flags) +#define type_pf_data_reset_flags TOKEN(TYPE, PF, _data_reset_flags)  #ifdef IP_SET_HASH_WITH_NETS  #define type_pf_data_match	TOKEN(TYPE, PF, _data_match)  #else @@ -385,9 +386,9 @@ type_pf_resize(struct ip_set *set, bool retried)  	struct ip_set_hash *h = set->data;  	struct htable *t, *orig = h->table;  	u8 htable_bits = orig->htable_bits; -	const struct type_pf_elem *data; +	struct type_pf_elem *data;  	struct hbucket *n, *m; -	u32 i, j; +	u32 i, j, flags = 0;  	int ret;  retry: @@ -412,9 +413,16 @@ retry:  		n = hbucket(orig, i);  		for (j = 0; j < n->pos; j++) {  			data = ahash_data(n, j); +#ifdef IP_SET_HASH_WITH_NETS +			flags = 0; +			type_pf_data_reset_flags(data, &flags); +#endif  			m = hbucket(t, HKEY(data, h->initval, htable_bits)); -			ret = type_pf_elem_add(m, data, AHASH_MAX(h), 0); +			ret = type_pf_elem_add(m, data, AHASH_MAX(h), flags);  			if (ret < 0) { +#ifdef IP_SET_HASH_WITH_NETS +				type_pf_data_flags(data, flags); +#endif  				read_unlock_bh(&set->lock);  				ahash_destroy(t);  				if (ret == -EAGAIN) @@ -836,9 +844,9 @@ type_pf_tresize(struct ip_set *set, bool retried)  	struct ip_set_hash *h = set->data;  	struct htable *t, *orig = h->table;  	u8 htable_bits = orig->htable_bits; -	const struct type_pf_elem *data; +	struct type_pf_elem *data;  	struct hbucket *n, *m; -	u32 i, j; +	u32 i, j, flags = 0;  	int ret;  	/* Try to cleanup once */ @@ -854,6 +862,8 @@ type_pf_tresize(struct ip_set *set, bool retried)  retry:  	ret = 0;  	htable_bits++; +	pr_debug("attempt to resize set %s from %u to %u, t %p\n", +		 set->name, orig->htable_bits, htable_bits, orig);  	if (!htable_bits) {  		/* In case we have plenty of memory :-) */  		pr_warning("Cannot increase the hashsize of set %s further\n", @@ -871,10 +881,17 @@ retry:  		n = hbucket(orig, i);  		for (j = 0; j < n->pos; j++) {  			data = ahash_tdata(n, j); +#ifdef IP_SET_HASH_WITH_NETS +			flags = 0; +			type_pf_data_reset_flags(data, &flags); +#endif  			m = hbucket(t, HKEY(data, h->initval, htable_bits)); -			ret = type_pf_elem_tadd(m, data, AHASH_MAX(h), 0, -						type_pf_data_timeout(data)); +			ret = type_pf_elem_tadd(m, data, AHASH_MAX(h), flags, +				ip_set_timeout_get(type_pf_data_timeout(data)));  			if (ret < 0) { +#ifdef IP_SET_HASH_WITH_NETS +				type_pf_data_flags(data, flags); +#endif  				read_unlock_bh(&set->lock);  				ahash_destroy(t);  				if (ret == -EAGAIN) @@ -1185,6 +1202,7 @@ type_pf_gc_init(struct ip_set *set)  #undef type_pf_data_tlist  #undef type_pf_data_next  #undef type_pf_data_flags +#undef type_pf_data_reset_flags  #undef type_pf_data_match  #undef type_pf_elem diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h index 387bdd02945..ba7f571a2b1 100644 --- a/include/linux/netfilter/nf_conntrack_sip.h +++ b/include/linux/netfilter/nf_conntrack_sip.h @@ -4,12 +4,15 @@  #include <net/netfilter/nf_conntrack_expect.h> +#include <linux/types.h> +  #define SIP_PORT	5060  #define SIP_TIMEOUT	3600  struct nf_ct_sip_master {  	unsigned int	register_cseq;  	unsigned int	invite_cseq; +	__be16		forced_dport;  };  enum sip_expectation_classes { diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 4966ddec039..ecbb8e49591 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h @@ -34,8 +34,8 @@ extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigne  extern int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error);  extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u_int32_t pid, int flags); -extern void nfnl_lock(void); -extern void nfnl_unlock(void); +extern void nfnl_lock(__u8 subsys_id); +extern void nfnl_unlock(__u8 subsys_id);  #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \  	MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 66d5379c305..9d7d8c64f7c 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -12,28 +12,38 @@  #include <linux/rcupdate.h>  #include <linux/list.h> +union inet_addr { +	__u32		all[4]; +	__be32		ip; +	__be32		ip6[4]; +	struct in_addr	in; +	struct in6_addr	in6; +}; +  struct netpoll {  	struct net_device *dev;  	char dev_name[IFNAMSIZ];  	const char *name;  	void (*rx_hook)(struct netpoll *, int, char *, int); -	__be32 local_ip, remote_ip; +	union inet_addr local_ip, remote_ip; +	bool ipv6;  	u16 local_port, remote_port;  	u8 remote_mac[ETH_ALEN];  	struct list_head rx; /* rx_np list element */ -	struct rcu_head rcu; +	struct work_struct cleanup_work;  };  struct netpoll_info {  	atomic_t refcnt; -	int rx_flags; +	unsigned long rx_flags;  	spinlock_t rx_lock; +	struct mutex dev_lock;  	struct list_head rx_np; /* netpolls that registered an rx_hook */ -	struct sk_buff_head arp_tx; /* list of arp requests to reply to */ +	struct sk_buff_head neigh_tx; /* list of neigh requests to reply to */  	struct sk_buff_head txq;  	struct delayed_work tx_work; @@ -42,6 +52,14 @@ struct netpoll_info {  	struct rcu_head rcu;  }; +#ifdef CONFIG_NETPOLL +extern int netpoll_rx_disable(struct net_device *dev); +extern void netpoll_rx_enable(struct net_device *dev); +#else +static inline int netpoll_rx_disable(struct net_device *dev) { return 0; } +static inline void netpoll_rx_enable(struct net_device *dev) { return; } +#endif +  void netpoll_send_udp(struct netpoll *np, const char *msg, int len);  void netpoll_print_options(struct netpoll *np);  int netpoll_parse_options(struct netpoll *np, char *opt); @@ -50,7 +68,7 @@ int netpoll_setup(struct netpoll *np);  int netpoll_trap(void);  void netpoll_set_trap(int trap);  void __netpoll_cleanup(struct netpoll *np); -void __netpoll_free_rcu(struct netpoll *np); +void __netpoll_free_async(struct netpoll *np);  void netpoll_cleanup(struct netpoll *np);  int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo);  void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index e111fa419a4..7b8fc73810a 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -13,6 +13,7 @@  #define _LINUX_NFS4_H  #include <linux/list.h> +#include <linux/uidgid.h>  #include <uapi/linux/nfs4.h>  struct nfs4_ace { @@ -20,7 +21,10 @@ struct nfs4_ace {  	uint32_t	flag;  	uint32_t	access_mask;  	int		whotype; -	uid_t		who; +	union { +		kuid_t	who_uid; +		kgid_t	who_gid; +	};  };  struct nfs4_acl { diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index 2dcef3ab58b..0f4b79da658 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h @@ -36,6 +36,7 @@  #ifndef NFS_IDMAP_H  #define NFS_IDMAP_H +#include <linux/uidgid.h>  #include <uapi/linux/nfs_idmap.h> @@ -67,10 +68,10 @@ void nfs_fattr_init_names(struct nfs_fattr *fattr,  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); -int nfs_map_gid_to_group(const struct nfs_server *, __u32, char *, size_t); +int nfs_map_name_to_uid(const struct nfs_server *, const char *, size_t, kuid_t *); +int nfs_map_group_to_gid(const struct nfs_server *, const char *, size_t, kgid_t *); +int nfs_map_uid_to_name(const struct nfs_server *, kuid_t, char *, size_t); +int nfs_map_gid_to_group(const struct nfs_server *, kgid_t, char *, size_t);  extern unsigned int nfs_idmap_cache_timeout;  #endif /* NFS_IDMAP_H */ diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 29adb12c7ec..4b993d358da 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -48,8 +48,8 @@ struct nfs_fattr {  	unsigned int		valid;		/* which fields are valid */  	umode_t			mode;  	__u32			nlink; -	__u32			uid; -	__u32			gid; +	kuid_t			uid; +	kgid_t			gid;  	dev_t			rdev;  	__u64			size;  	union { @@ -233,6 +233,7 @@ struct nfs4_layoutget_args {  	struct inode *inode;  	struct nfs_open_context *ctx;  	nfs4_stateid stateid; +	unsigned long timestamp;  	struct nfs4_layoutdriver_data layout;  }; diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index 24c139288db..7898c997dfe 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h @@ -49,8 +49,8 @@ struct svc_export {  	struct auth_domain *	ex_client;  	int			ex_flags;  	struct path		ex_path; -	uid_t			ex_anon_uid; -	gid_t			ex_anon_gid; +	kuid_t			ex_anon_uid; +	kgid_t			ex_anon_gid;  	int			ex_fsid;  	unsigned char *		ex_uuid; /* 16 byte fsid */  	struct nfsd4_fs_locations ex_fslocs; diff --git a/include/linux/ntb.h b/include/linux/ntb.h new file mode 100644 index 00000000000..f6a15205853 --- /dev/null +++ b/include/linux/ntb.h @@ -0,0 +1,83 @@ +/* + * This file is provided under a dual BSD/GPLv2 license.  When using or + *   redistributing this file, you may do so under either license. + * + *   GPL LICENSE SUMMARY + * + *   Copyright(c) 2012 Intel Corporation. All rights reserved. + * + *   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. + * + *   BSD LICENSE + * + *   Copyright(c) 2012 Intel Corporation. All rights reserved. + * + *   Redistribution and use in source and binary forms, with or without + *   modification, are permitted provided that the following conditions + *   are met: + * + *     * Redistributions of source code must retain the above copyright + *       notice, this list of conditions and the following disclaimer. + *     * Redistributions in binary form must reproduce the above copy + *       notice, this list of conditions and the following disclaimer in + *       the documentation and/or other materials provided with the + *       distribution. + *     * Neither the name of Intel Corporation nor the names of its + *       contributors may be used to endorse or promote products derived + *       from this software without specific prior written permission. + * + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Intel PCIe NTB Linux driver + * + * Contact Information: + * Jon Mason <jon.mason@intel.com> + */ + +struct ntb_transport_qp; + +struct ntb_client { +	struct device_driver driver; +	int (*probe) (struct pci_dev *pdev); +	void (*remove) (struct pci_dev *pdev); +}; + +int ntb_register_client(struct ntb_client *drvr); +void ntb_unregister_client(struct ntb_client *drvr); +int ntb_register_client_dev(char *device_name); +void ntb_unregister_client_dev(char *device_name); + +struct ntb_queue_handlers { +	void (*rx_handler) (struct ntb_transport_qp *qp, void *qp_data, +			    void *data, int len); +	void (*tx_handler) (struct ntb_transport_qp *qp, void *qp_data, +			    void *data, int len); +	void (*event_handler) (void *data, int status); +}; + +unsigned char ntb_transport_qp_num(struct ntb_transport_qp *qp); +unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp); +struct ntb_transport_qp * +ntb_transport_create_queue(void *data, struct pci_dev *pdev, +			   const struct ntb_queue_handlers *handlers); +void ntb_transport_free_queue(struct ntb_transport_qp *qp); +int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data, +			     unsigned int len); +int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data, +			     unsigned int len); +void *ntb_transport_rx_remove(struct ntb_transport_qp *qp, unsigned int *len); +void ntb_transport_link_up(struct ntb_transport_qp *qp); +void ntb_transport_link_down(struct ntb_transport_qp *qp); +bool ntb_transport_link_query(struct ntb_transport_qp *qp); diff --git a/include/linux/nvme.h b/include/linux/nvme.h index c25cccaa555..4fa3b0b9b07 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -137,6 +137,34 @@ enum {  	NVME_LBAF_RP_DEGRADED	= 3,  }; +struct nvme_smart_log { +	__u8			critical_warning; +	__u8			temperature[2]; +	__u8			avail_spare; +	__u8			spare_thresh; +	__u8			percent_used; +	__u8			rsvd6[26]; +	__u8			data_units_read[16]; +	__u8			data_units_written[16]; +	__u8			host_reads[16]; +	__u8			host_writes[16]; +	__u8			ctrl_busy_time[16]; +	__u8			power_cycles[16]; +	__u8			power_on_hours[16]; +	__u8			unsafe_shutdowns[16]; +	__u8			media_errors[16]; +	__u8			num_err_log_entries[16]; +	__u8			rsvd192[320]; +}; + +enum { +	NVME_SMART_CRIT_SPARE		= 1 << 0, +	NVME_SMART_CRIT_TEMPERATURE	= 1 << 1, +	NVME_SMART_CRIT_RELIABILITY	= 1 << 2, +	NVME_SMART_CRIT_MEDIA		= 1 << 3, +	NVME_SMART_CRIT_VOLATILE_MEMORY	= 1 << 4, +}; +  struct nvme_lba_range_type {  	__u8			type;  	__u8			attributes; diff --git a/include/linux/of.h b/include/linux/of.h index 5ebcc5c8e42..a0f12928494 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -92,7 +92,7 @@ static inline void of_node_put(struct device_node *node) { }  extern struct device_node *of_allnodes;  extern struct device_node *of_chosen;  extern struct device_node *of_aliases; -extern rwlock_t devtree_lock; +extern raw_spinlock_t devtree_lock;  static inline bool of_have_populated_dt(void)  { @@ -160,7 +160,7 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)  #define OF_BAD_ADDR	((u64)-1) -static inline const char* of_node_full_name(struct device_node *np) +static inline const char *of_node_full_name(const struct device_node *np)  {  	return np ? np->full_name : "<no-node>";  } @@ -277,6 +277,8 @@ extern struct device_node *of_parse_phandle(const struct device_node *np,  extern int of_parse_phandle_with_args(const struct device_node *np,  	const char *list_name, const char *cells_name, int index,  	struct of_phandle_args *out_args); +extern int of_count_phandle_with_args(const struct device_node *np, +	const char *list_name, const char *cells_name);  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); @@ -467,6 +469,13 @@ static inline int of_parse_phandle_with_args(struct device_node *np,  	return -ENOSYS;  } +static inline int of_count_phandle_with_args(struct device_node *np, +					     const char *list_name, +					     const char *cells_name) +{ +	return -ENOSYS; +} +  static inline int of_alias_get_id(struct device_node *np, const char *stem)  {  	return -ENOSYS; diff --git a/include/linux/of_dma.h b/include/linux/of_dma.h new file mode 100644 index 00000000000..d15073e080d --- /dev/null +++ b/include/linux/of_dma.h @@ -0,0 +1,74 @@ +/* + * OF helpers for DMA request / controller + * + * Based on of_gpio.h + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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_OF_DMA_H +#define __LINUX_OF_DMA_H + +#include <linux/of.h> +#include <linux/dmaengine.h> + +struct device_node; + +struct of_dma { +	struct list_head	of_dma_controllers; +	struct device_node	*of_node; +	int			of_dma_nbcells; +	struct dma_chan		*(*of_dma_xlate) +				(struct of_phandle_args *, struct of_dma *); +	void			*of_dma_data; +	int			use_count; +}; + +struct of_dma_filter_info { +	dma_cap_mask_t	dma_cap; +	dma_filter_fn	filter_fn; +}; + +#ifdef CONFIG_OF +extern int of_dma_controller_register(struct device_node *np, +		struct dma_chan *(*of_dma_xlate) +		(struct of_phandle_args *, struct of_dma *), +		void *data); +extern int of_dma_controller_free(struct device_node *np); +extern struct dma_chan *of_dma_request_slave_channel(struct device_node *np, +						     char *name); +extern struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec, +		struct of_dma *ofdma); +#else +static inline int of_dma_controller_register(struct device_node *np, +		struct dma_chan *(*of_dma_xlate) +		(struct of_phandle_args *, struct of_dma *), +		void *data) +{ +	return -ENODEV; +} + +static inline int of_dma_controller_free(struct device_node *np) +{ +	return -ENODEV; +} + +static inline struct dma_chan *of_dma_request_slave_channel(struct device_node *np, +						     char *name) +{ +	return NULL; +} + +static inline struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec, +		struct of_dma *ofdma) +{ +	return NULL; +} + +#endif + +#endif /* __LINUX_OF_DMA_H */ diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h index c454f579674..a83dc6f5008 100644 --- a/include/linux/of_gpio.h +++ b/include/linux/of_gpio.h @@ -50,9 +50,6 @@ static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)  extern int of_get_named_gpio_flags(struct device_node *np,  		const char *list_name, int index, enum of_gpio_flags *flags); -extern unsigned int of_gpio_named_count(struct device_node *np, -					const char* propname); -  extern int of_mm_gpiochip_add(struct device_node *np,  			      struct of_mm_gpio_chip *mm_gc); @@ -71,12 +68,6 @@ static inline int of_get_named_gpio_flags(struct device_node *np,  	return -ENOSYS;  } -static inline unsigned int of_gpio_named_count(struct device_node *np, -					const char* propname) -{ -	return 0; -} -  static inline int of_gpio_simple_xlate(struct gpio_chip *gc,  				       const struct of_phandle_args *gpiospec,  				       u32 *flags) @@ -90,22 +81,37 @@ static inline void of_gpiochip_remove(struct gpio_chip *gc) { }  #endif /* CONFIG_OF_GPIO */  /** - * of_gpio_count - Count GPIOs for a device + * of_gpio_named_count() - Count GPIOs for a device   * @np:		device node to count GPIOs for + * @propname:	property name containing gpio specifier(s)   *   * The function returns the count of GPIOs specified for a node. + * Note that the empty GPIO specifiers count too. Returns either + *   Number of gpios defined in property, + *   -EINVAL for an incorrectly formed gpios property, or + *   -ENOENT for a missing gpios property   * - * Note that the empty GPIO specifiers counts too. For example, - * + * Example:   * gpios = <0 - *          &pio1 1 2 + *          &gpio1 1 2   *          0 - *          &pio2 3 4>; + *          &gpio2 3 4>; + * + * The above example defines four GPIOs, two of which are not specified. + * This function will return '4' + */ +static inline int of_gpio_named_count(struct device_node *np, const char* propname) +{ +	return of_count_phandle_with_args(np, propname, "#gpio-cells"); +} + +/** + * of_gpio_count() - Count GPIOs for a device + * @np:		device node to count GPIOs for   * - * defines four GPIOs (so this function will return 4), two of which - * are not specified. + * Same as of_gpio_named_count, but hard coded to use the 'gpios' property   */ -static inline unsigned int of_gpio_count(struct device_node *np) +static inline int of_gpio_count(struct device_node *np)  {  	return of_gpio_named_count(np, "gpios");  } diff --git a/include/linux/of_serial.h b/include/linux/of_serial.h deleted file mode 100644 index 4a73ed80b4c..00000000000 --- a/include/linux/of_serial.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __LINUX_OF_SERIAL_H -#define __LINUX_OF_SERIAL_H - -/* - * FIXME remove this file when tegra finishes conversion to open firmware, - * expectation is that all quirks will then be self-contained in - * drivers/tty/serial/of_serial.c. - */ -#ifdef CONFIG_ARCH_TEGRA -extern void tegra_serial_handle_break(struct uart_port *port); -#else -static inline void tegra_serial_handle_break(struct uart_port *port) -{ -} -#endif - -#endif /* __LINUX_OF_SERIAL */ diff --git a/include/linux/opp.h b/include/linux/opp.h index 214e0ebcb84..3aca2b8def3 100644 --- a/include/linux/opp.h +++ b/include/linux/opp.h @@ -47,15 +47,6 @@ int opp_enable(struct device *dev, unsigned long freq);  int opp_disable(struct device *dev, unsigned long freq);  struct srcu_notifier_head *opp_get_notifier(struct device *dev); - -#ifdef CONFIG_OF -int of_init_opp_table(struct device *dev); -#else -static inline int of_init_opp_table(struct device *dev) -{ -	return -EINVAL; -} -#endif /* CONFIG_OF */  #else  static inline unsigned long opp_get_voltage(struct opp *opp)  { @@ -112,6 +103,15 @@ static inline struct srcu_notifier_head *opp_get_notifier(struct device *dev)  }  #endif		/* CONFIG_PM_OPP */ +#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF) +int of_init_opp_table(struct device *dev); +#else +static inline int of_init_opp_table(struct device *dev) +{ +	return -EINVAL; +} +#endif +  #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)  int opp_init_cpufreq_table(struct device *dev,  			    struct cpufreq_frequency_table **table); diff --git a/include/linux/page-flags-layout.h b/include/linux/page-flags-layout.h new file mode 100644 index 00000000000..93506a11403 --- /dev/null +++ b/include/linux/page-flags-layout.h @@ -0,0 +1,88 @@ +#ifndef PAGE_FLAGS_LAYOUT_H +#define PAGE_FLAGS_LAYOUT_H + +#include <linux/numa.h> +#include <generated/bounds.h> + +/* + * When a memory allocation must conform to specific limitations (such + * as being suitable for DMA) the caller will pass in hints to the + * allocator in the gfp_mask, in the zone modifier bits.  These bits + * are used to select a priority ordered list of memory zones which + * match the requested limits. See gfp_zone() in include/linux/gfp.h + */ +#if MAX_NR_ZONES < 2 +#define ZONES_SHIFT 0 +#elif MAX_NR_ZONES <= 2 +#define ZONES_SHIFT 1 +#elif MAX_NR_ZONES <= 4 +#define ZONES_SHIFT 2 +#else +#error ZONES_SHIFT -- too many zones configured adjust calculation +#endif + +#ifdef CONFIG_SPARSEMEM +#include <asm/sparsemem.h> + +/* SECTION_SHIFT	#bits space required to store a section # */ +#define SECTIONS_SHIFT	(MAX_PHYSMEM_BITS - SECTION_SIZE_BITS) + +#endif /* CONFIG_SPARSEMEM */ + +/* + * page->flags layout: + * + * There are five possibilities for how page->flags get laid out.  The first + * pair is for the normal case without sparsemem. The second pair is for + * sparsemem when there is plenty of space for node and section information. + * The last is when there is insufficient space in page->flags and a separate + * lookup is necessary. + * + * No sparsemem or sparsemem vmemmap: |       NODE     | ZONE |          ... | FLAGS | + *         " plus space for last_nid: |       NODE     | ZONE | LAST_NID ... | FLAGS | + * classic sparse with space for node:| SECTION | NODE | ZONE |          ... | FLAGS | + *         " plus space for last_nid: | SECTION | NODE | ZONE | LAST_NID ... | FLAGS | + * classic sparse no space for node:  | SECTION |     ZONE    | ... | FLAGS | + */ +#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) +#define SECTIONS_WIDTH		SECTIONS_SHIFT +#else +#define SECTIONS_WIDTH		0 +#endif + +#define ZONES_WIDTH		ZONES_SHIFT + +#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS +#define NODES_WIDTH		NODES_SHIFT +#else +#ifdef CONFIG_SPARSEMEM_VMEMMAP +#error "Vmemmap: No space for nodes field in page flags" +#endif +#define NODES_WIDTH		0 +#endif + +#ifdef CONFIG_NUMA_BALANCING +#define LAST_NID_SHIFT NODES_SHIFT +#else +#define LAST_NID_SHIFT 0 +#endif + +#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT+LAST_NID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS +#define LAST_NID_WIDTH LAST_NID_SHIFT +#else +#define LAST_NID_WIDTH 0 +#endif + +/* + * We are going to use the flags for the page to node mapping if its in + * there.  This includes the case where there is no node, so it is implicit. + */ +#if !(NODES_WIDTH > 0 || NODES_SHIFT == 0) +#define NODE_NOT_IN_PAGE_FLAGS +#endif + +#if defined(CONFIG_NUMA_BALANCING) && LAST_NID_WIDTH == 0 +#define LAST_NID_NOT_IN_PAGE_FLAGS +#endif + +#endif /* _LINUX_PAGE_FLAGS_LAYOUT */ diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 70473da47b3..6d53675c2b5 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -303,21 +303,13 @@ static inline void __SetPageUptodate(struct page *page)  static inline void SetPageUptodate(struct page *page)  { -#ifdef CONFIG_S390 -	if (!test_and_set_bit(PG_uptodate, &page->flags)) -		page_set_storage_key(page_to_phys(page), PAGE_DEFAULT_KEY, 0); -#else  	/*  	 * Memory barrier must be issued before setting the PG_uptodate bit,  	 * so that all previous stores issued in order to bring the page  	 * uptodate are actually visible before PageUptodate becomes true. -	 * -	 * s390 doesn't need an explicit smp_wmb here because the test and -	 * set bit already provides full barriers.  	 */  	smp_wmb();  	set_bit(PG_uptodate, &(page)->flags); -#endif  }  CLEARPAGEFLAG(Uptodate, uptodate) diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h index a92061e08d4..3fff8e77406 100644 --- a/include/linux/page-isolation.h +++ b/include/linux/page-isolation.h @@ -1,6 +1,25 @@  #ifndef __LINUX_PAGEISOLATION_H  #define __LINUX_PAGEISOLATION_H +#ifdef CONFIG_MEMORY_ISOLATION +static inline bool is_migrate_isolate_page(struct page *page) +{ +	return get_pageblock_migratetype(page) == MIGRATE_ISOLATE; +} +static inline bool is_migrate_isolate(int migratetype) +{ +	return migratetype == MIGRATE_ISOLATE; +} +#else +static inline bool is_migrate_isolate_page(struct page *page) +{ +	return false; +} +static inline bool is_migrate_isolate(int migratetype) +{ +	return false; +} +#endif  bool has_unmovable_pages(struct zone *zone, struct page *page, int count,  			 bool skip_hwpoisoned_pages); diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 6da609d14c1..0e38e13eb24 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -414,6 +414,7 @@ static inline void wait_on_page_writeback(struct page *page)  }  extern void end_page_writeback(struct page *page); +void wait_for_stable_page(struct page *page);  /*   * Add an arbitrary waiter to a page's wait queue diff --git a/include/linux/path.h b/include/linux/path.h index edc98dec626..d1372186f43 100644 --- a/include/linux/path.h +++ b/include/linux/path.h @@ -9,8 +9,8 @@ struct path {  	struct dentry *dentry;  }; -extern void path_get(struct path *); -extern void path_put(struct path *); +extern void path_get(const struct path *); +extern void path_put(const struct path *);  static inline int path_equal(const struct path *path1, const struct path *path2)  { diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 9a22b5efb38..81b31613eb2 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -41,8 +41,37 @@ static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)  	return DEVICE_ACPI_HANDLE(dev);  } + +void acpi_pci_add_bus(struct pci_bus *bus); +void acpi_pci_remove_bus(struct pci_bus *bus); + +#ifdef	CONFIG_ACPI_PCI_SLOT +void acpi_pci_slot_init(void); +void acpi_pci_slot_enumerate(struct pci_bus *bus, acpi_handle handle); +void acpi_pci_slot_remove(struct pci_bus *bus); +#else +static inline void acpi_pci_slot_init(void) { } +static inline void acpi_pci_slot_enumerate(struct pci_bus *bus, +					   acpi_handle handle) { } +static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }  #endif +#ifdef	CONFIG_HOTPLUG_PCI_ACPI +void acpiphp_init(void); +void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle); +void acpiphp_remove_slots(struct pci_bus *bus); +#else +static inline void acpiphp_init(void) { } +static inline void acpiphp_enumerate_slots(struct pci_bus *bus, +					   acpi_handle handle) { } +static inline void acpiphp_remove_slots(struct pci_bus *bus) { } +#endif + +#else	/* CONFIG_ACPI */ +static inline void acpi_pci_add_bus(struct pci_bus *bus) { } +static inline void acpi_pci_remove_bus(struct pci_bus *bus) { } +#endif	/* CONFIG_ACPI */ +  #ifdef CONFIG_ACPI_APEI  extern bool aer_acpi_firmware_first(void);  #else diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index c8320144fe7..8af4610c2e4 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h @@ -23,14 +23,14 @@  #define PCIE_LINK_STATE_CLKPM	4  #ifdef CONFIG_PCIEASPM -extern void pcie_aspm_init_link_state(struct pci_dev *pdev); -extern void pcie_aspm_exit_link_state(struct pci_dev *pdev); -extern void pcie_aspm_pm_state_change(struct pci_dev *pdev); -extern void pcie_aspm_powersave_config_link(struct pci_dev *pdev); -extern void pci_disable_link_state(struct pci_dev *pdev, int state); -extern void pci_disable_link_state_locked(struct pci_dev *pdev, int state); -extern void pcie_clear_aspm(struct pci_bus *bus); -extern void pcie_no_aspm(void); +void pcie_aspm_init_link_state(struct pci_dev *pdev); +void pcie_aspm_exit_link_state(struct pci_dev *pdev); +void pcie_aspm_pm_state_change(struct pci_dev *pdev); +void pcie_aspm_powersave_config_link(struct pci_dev *pdev); +void pci_disable_link_state(struct pci_dev *pdev, int state); +void pci_disable_link_state_locked(struct pci_dev *pdev, int state); +void pcie_clear_aspm(struct pci_bus *bus); +void pcie_no_aspm(void);  #else  static inline void pcie_aspm_init_link_state(struct pci_dev *pdev)  { @@ -56,8 +56,8 @@ static inline void pcie_no_aspm(void)  #endif  #ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */ -extern void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); -extern void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev); +void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); +void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev);  #else  static inline void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)  { diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index 7ef68724f0f..68bcefd7fca 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -14,9 +14,9 @@ struct pci_ats {  #ifdef CONFIG_PCI_ATS -extern int pci_enable_ats(struct pci_dev *dev, int ps); -extern void pci_disable_ats(struct pci_dev *dev); -extern int pci_ats_queue_depth(struct pci_dev *dev); +int pci_enable_ats(struct pci_dev *dev, int ps); +void pci_disable_ats(struct pci_dev *dev); +int pci_ats_queue_depth(struct pci_dev *dev);  /**   * pci_ats_enabled - query the ATS status @@ -54,12 +54,12 @@ static inline int pci_ats_enabled(struct pci_dev *dev)  #ifdef CONFIG_PCI_PRI -extern int  pci_enable_pri(struct pci_dev *pdev, u32 reqs); -extern void pci_disable_pri(struct pci_dev *pdev); -extern bool pci_pri_enabled(struct pci_dev *pdev); -extern int  pci_reset_pri(struct pci_dev *pdev); -extern bool pci_pri_stopped(struct pci_dev *pdev); -extern int  pci_pri_status(struct pci_dev *pdev); +int pci_enable_pri(struct pci_dev *pdev, u32 reqs); +void pci_disable_pri(struct pci_dev *pdev); +bool pci_pri_enabled(struct pci_dev *pdev); +int pci_reset_pri(struct pci_dev *pdev); +bool pci_pri_stopped(struct pci_dev *pdev); +int pci_pri_status(struct pci_dev *pdev);  #else /* CONFIG_PCI_PRI */ @@ -95,10 +95,10 @@ static inline int pci_pri_status(struct pci_dev *pdev)  #ifdef CONFIG_PCI_PASID -extern int pci_enable_pasid(struct pci_dev *pdev, int features); -extern void pci_disable_pasid(struct pci_dev *pdev); -extern int pci_pasid_features(struct pci_dev *pdev); -extern int pci_max_pasids(struct pci_dev *pdev); +int pci_enable_pasid(struct pci_dev *pdev, int features); +void pci_disable_pasid(struct pci_dev *pdev); +int pci_pasid_features(struct pci_dev *pdev); +int pci_max_pasids(struct pci_dev *pdev);  #else  /* CONFIG_PCI_PASID */ diff --git a/include/linux/pci.h b/include/linux/pci.h index 6fa4dd2a3b9..e73dfa308b8 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -35,6 +35,21 @@  /* Include the ID list */  #include <linux/pci_ids.h> +/* + * The PCI interface treats multi-function devices as independent + * devices.  The slot/function address of each device is encoded + * in a single byte as follows: + * + *	7:3 = slot + *	2:0 = function + * PCI_DEVFN(), PCI_SLOT(), and PCI_FUNC() are defined uapi/linux/pci.h + * In the interest of not exposing interfaces to user-space unnecessarily, + * the following kernel only defines are being added here. + */ +#define PCI_DEVID(bus, devfn)  ((((u16)bus) << 8) | devfn) +/* return bus from PCI devid = ((u16)bus_number) << 8) | devfn */ +#define PCI_BUS_NUM(x) (((x) >> 8) & 0xff) +  /* pci_slot represents a physical slot */  struct pci_slot {  	struct pci_bus *bus;		/* The bus this slot is on */ @@ -232,6 +247,8 @@ struct pci_dev {  	u8		revision;	/* PCI revision, low byte of class word */  	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */  	u8		pcie_cap;	/* PCI-E capability offset */ +	u8		msi_cap;	/* MSI capability offset */ +	u8		msix_cap;	/* MSI-X capability offset */  	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */  	u8		rom_base_reg;	/* which config register controls the ROM */  	u8		pin;  		/* which interrupt pin this device uses */ @@ -249,8 +266,7 @@ struct pci_dev {  	pci_power_t     current_state;  /* Current operating state. In ACPI-speak,  					   this is D0-D3, D0 being fully functional,  					   and D3 being off. */ -	int		pm_cap;		/* PM capability offset in the -					   configuration space */ +	u8		pm_cap;		/* PM capability offset */  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#  					   can be generated */  	unsigned int	pme_interrupt:1; @@ -286,6 +302,7 @@ struct pci_dev {  	unsigned int	irq;  	struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */ +	bool match_driver;		/* Skip attaching driver */  	/* These fields are used by common fixups */  	unsigned int	transparent:1;	/* Transparent PCI bridge */  	unsigned int	multifunction:1;/* Part of multi-function device */ @@ -347,7 +364,7 @@ static inline struct pci_dev *pci_physfn(struct pci_dev *dev)  	return dev;  } -extern struct pci_dev *alloc_pci_dev(void); +struct pci_dev *alloc_pci_dev(void);  #define	to_pci_dev(n) container_of(n, struct pci_dev, dev)  #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) @@ -378,6 +395,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,  		     void (*release_fn)(struct pci_host_bridge *),  		     void *release_data); +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge); +  /*   * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond   * to P2P or CardBus bridge windows) go in a table.  Additional ones (for @@ -501,10 +520,10 @@ struct pci_ops {   * ACPI needs to be able to access PCI config space before we've done a   * PCI bus scan and created pci_bus structures.   */ -extern int raw_pci_read(unsigned int domain, unsigned int bus, -			unsigned int devfn, int reg, int len, u32 *val); -extern int raw_pci_write(unsigned int domain, unsigned int bus, -			unsigned int devfn, int reg, int len, u32 val); +int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, +		 int reg, int len, u32 *val); +int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, +		  int reg, int len, u32 val);  struct pci_bus_region {  	resource_size_t start; @@ -655,7 +674,7 @@ struct pci_driver {  /* these external functions are only available when PCI support is enabled */  #ifdef CONFIG_PCI -extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); +void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss);  enum pcie_bus_config_types {  	PCIE_BUS_TUNE_OFF, @@ -672,8 +691,11 @@ extern struct bus_type pci_bus_type;   * code, or pci core code. */  extern struct list_head pci_root_buses;	/* list of all known PCI buses */  /* Some device drivers need know if pci is initiated */ -extern int no_pci_devices(void); +int no_pci_devices(void); +void pcibios_resource_survey_bus(struct pci_bus *bus); +void pcibios_add_bus(struct pci_bus *bus); +void pcibios_remove_bus(struct pci_bus *bus);  void pcibios_fixup_bus(struct pci_bus *);  int __must_check pcibios_enable_device(struct pci_dev *, int mask);  /* Architecture specific versions may override this (weak) */ @@ -695,7 +717,7 @@ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,  void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,  			     struct pci_bus_region *region);  void pcibios_scan_specific_bus(int busn); -extern struct pci_bus *pci_find_bus(int domain, int busnr); +struct pci_bus *pci_find_bus(int domain, int busnr);  void pci_bus_add_devices(const struct pci_bus *bus);  struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,  				      struct pci_ops *ops, void *sysdata); @@ -728,14 +750,14 @@ struct resource *pci_find_parent_resource(const struct pci_dev *dev,  u8 pci_swizzle_interrupt_pin(const struct pci_dev *dev, u8 pin);  int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);  u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp); -extern struct pci_dev *pci_dev_get(struct pci_dev *dev); -extern void pci_dev_put(struct pci_dev *dev); -extern void pci_remove_bus(struct pci_bus *b); -extern void pci_stop_and_remove_bus_device(struct pci_dev *dev); +struct pci_dev *pci_dev_get(struct pci_dev *dev); +void pci_dev_put(struct pci_dev *dev); +void pci_remove_bus(struct pci_bus *b); +void pci_stop_and_remove_bus_device(struct pci_dev *dev);  void pci_stop_root_bus(struct pci_bus *bus);  void pci_remove_root_bus(struct pci_bus *bus);  void pci_setup_cardbus(struct pci_bus *bus); -extern void pci_sort_breadthfirst(void); +void pci_sort_breadthfirst(void);  #define dev_is_pci(d) ((d)->bus == &pci_bus_type)  #define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false))  #define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0)) @@ -912,6 +934,7 @@ void pci_disable_rom(struct pci_dev *pdev);  void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);  void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);  size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size); +void __iomem __must_check *pci_platform_rom(struct pci_dev *pdev, size_t *size);  /* Power management related routines */  int pci_save_state(struct pci_dev *dev); @@ -1137,18 +1160,17 @@ static inline int pci_msi_enabled(void)  	return 0;  }  #else -extern int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec); -extern int pci_enable_msi_block_auto(struct pci_dev *dev, unsigned int *maxvec); -extern void pci_msi_shutdown(struct pci_dev *dev); -extern void pci_disable_msi(struct pci_dev *dev); -extern int pci_msix_table_size(struct pci_dev *dev); -extern int pci_enable_msix(struct pci_dev *dev, -	struct msix_entry *entries, int nvec); -extern void pci_msix_shutdown(struct pci_dev *dev); -extern void pci_disable_msix(struct pci_dev *dev); -extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); -extern void pci_restore_msi_state(struct pci_dev *dev); -extern int pci_msi_enabled(void); +int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec); +int pci_enable_msi_block_auto(struct pci_dev *dev, unsigned int *maxvec); +void pci_msi_shutdown(struct pci_dev *dev); +void pci_disable_msi(struct pci_dev *dev); +int pci_msix_table_size(struct pci_dev *dev); +int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec); +void pci_msix_shutdown(struct pci_dev *dev); +void pci_disable_msix(struct pci_dev *dev); +void msi_remove_pci_irq_vectors(struct pci_dev *dev); +void pci_restore_msi_state(struct pci_dev *dev); +int pci_msi_enabled(void);  #endif  #ifdef CONFIG_PCIEPORTBUS @@ -1163,8 +1185,8 @@ extern bool pcie_ports_auto;  static inline int pcie_aspm_enabled(void) { return 0; }  static inline bool pcie_aspm_support_enabled(void) { return false; }  #else -extern int pcie_aspm_enabled(void); -extern bool pcie_aspm_support_enabled(void); +int pcie_aspm_enabled(void); +bool pcie_aspm_support_enabled(void);  #endif  #ifdef CONFIG_PCIEAER @@ -1182,8 +1204,8 @@ static inline void pcie_set_ecrc_checking(struct pci_dev *dev)  }  static inline void pcie_ecrc_get_policy(char *str) {};  #else -extern void pcie_set_ecrc_checking(struct pci_dev *dev); -extern void pcie_ecrc_get_policy(char *str); +void pcie_set_ecrc_checking(struct pci_dev *dev); +void pcie_ecrc_get_policy(char *str);  #endif  #define pci_enable_msi(pdev)	pci_enable_msi_block(pdev, 1) @@ -1194,9 +1216,9 @@ int  ht_create_irq(struct pci_dev *dev, int idx);  void ht_destroy_irq(unsigned int irq);  #endif /* CONFIG_HT_IRQ */ -extern void pci_cfg_access_lock(struct pci_dev *dev); -extern bool pci_cfg_access_trylock(struct pci_dev *dev); -extern void pci_cfg_access_unlock(struct pci_dev *dev); +void pci_cfg_access_lock(struct pci_dev *dev); +bool pci_cfg_access_trylock(struct pci_dev *dev); +void pci_cfg_access_unlock(struct pci_dev *dev);  /*   * PCI domain support.  Sometimes called PCI segment (eg by ACPI), @@ -1221,7 +1243,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)  /* some architectures require additional setup to direct VGA traffic */  typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,  		      unsigned int command_bits, u32 flags); -extern void pci_register_set_vga_state(arch_set_vga_state_t func); +void pci_register_set_vga_state(arch_set_vga_state_t func);  #else /* CONFIG_PCI is not enabled */ @@ -1623,8 +1645,8 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,  int pcibios_add_device(struct pci_dev *dev);  #ifdef CONFIG_PCI_MMCONFIG -extern void __init pci_mmcfg_early_init(void); -extern void __init pci_mmcfg_late_init(void); +void __init pci_mmcfg_early_init(void); +void __init pci_mmcfg_late_init(void);  #else  static inline void pci_mmcfg_early_init(void) { }  static inline void pci_mmcfg_late_init(void) { } @@ -1635,12 +1657,12 @@ int pci_ext_cfg_avail(void);  void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);  #ifdef CONFIG_PCI_IOV -extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); -extern void pci_disable_sriov(struct pci_dev *dev); -extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); -extern int pci_num_vf(struct pci_dev *dev); -extern int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); -extern int pci_sriov_get_totalvfs(struct pci_dev *dev); +int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); +void pci_disable_sriov(struct pci_dev *dev); +irqreturn_t pci_sriov_migration(struct pci_dev *dev); +int pci_num_vf(struct pci_dev *dev); +int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); +int pci_sriov_get_totalvfs(struct pci_dev *dev);  #else  static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)  { @@ -1668,8 +1690,8 @@ static inline int pci_sriov_get_totalvfs(struct pci_dev *dev)  #endif  #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) -extern void pci_hp_create_module_link(struct pci_slot *pci_slot); -extern void pci_hp_remove_module_link(struct pci_slot *pci_slot); +void pci_hp_create_module_link(struct pci_slot *pci_slot); +void pci_hp_remove_module_link(struct pci_slot *pci_slot);  #endif  /** @@ -1700,12 +1722,21 @@ static inline bool pci_is_pcie(struct pci_dev *dev)  }  /** + * pcie_caps_reg - get the PCIe Capabilities Register + * @dev: PCI device + */ +static inline u16 pcie_caps_reg(const struct pci_dev *dev) +{ +	return dev->pcie_flags_reg; +} + +/**   * pci_pcie_type - get the PCIe device/port type   * @dev: PCI device   */  static inline int pci_pcie_type(const struct pci_dev *dev)  { -	return (dev->pcie_flags_reg & PCI_EXP_FLAGS_TYPE) >> 4; +	return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4;  }  void pci_request_acs(void); @@ -1804,13 +1835,13 @@ int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,  /* PCI <-> OF binding helpers */  #ifdef CONFIG_OF  struct device_node; -extern void pci_set_of_node(struct pci_dev *dev); -extern void pci_release_of_node(struct pci_dev *dev); -extern void pci_set_bus_of_node(struct pci_bus *bus); -extern void pci_release_bus_of_node(struct pci_bus *bus); +void pci_set_of_node(struct pci_dev *dev); +void pci_release_of_node(struct pci_dev *dev); +void pci_set_bus_of_node(struct pci_bus *bus); +void pci_release_bus_of_node(struct pci_bus *bus);  /* Arch may override this (weak) */ -extern struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus); +struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);  static inline struct device_node *  pci_device_to_OF_node(const struct pci_dev *pdev) diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h index 45fc162cbdc..8db71dcd633 100644 --- a/include/linux/pci_hotplug.h +++ b/include/linux/pci_hotplug.h @@ -125,12 +125,12 @@ static inline const char *hotplug_slot_name(const struct hotplug_slot *slot)  	return pci_slot_name(slot->pci_slot);  } -extern int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, -			     int nr, const char *name, -			     struct module *owner, const char *mod_name); -extern int pci_hp_deregister(struct hotplug_slot *slot); -extern int __must_check pci_hp_change_slot_info	(struct hotplug_slot *slot, -						 struct hotplug_slot_info *info); +int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, int nr, +		      const char *name, struct module *owner, +		      const char *mod_name); +int pci_hp_deregister(struct hotplug_slot *slot); +int __must_check pci_hp_change_slot_info(struct hotplug_slot *slot, +					 struct hotplug_slot_info *info);  /* use a define to avoid include chaining to get THIS_MODULE & friends */  #define pci_hp_register(slot, pbus, devnr, name) \ diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 0eb65796bcb..a80f9e6ce9e 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -1604,6 +1604,7 @@  #define PCI_SUBDEVICE_ID_KEYSPAN_SX2	0x5334  #define PCI_VENDOR_ID_MARVELL		0x11ab +#define PCI_VENDOR_ID_MARVELL_EXT	0x1b4b  #define PCI_DEVICE_ID_MARVELL_GT64111	0x4146  #define PCI_DEVICE_ID_MARVELL_GT64260	0x6430  #define PCI_DEVICE_ID_MARVELL_MV64360	0x6460 @@ -1807,6 +1808,8 @@  #define PCI_VENDOR_ID_ESDGMBH		0x12fe  #define PCI_DEVICE_ID_ESDGMBH_CPCIASIO4 0x0111 +#define PCI_VENDOR_ID_CB		0x1307	/* Measurement Computing */ +  #define PCI_VENDOR_ID_SIIG		0x131f  #define PCI_SUBVENDOR_ID_SIIG		0x131f  #define PCI_DEVICE_ID_SIIG_1S_10x_550	0x1000 @@ -1868,8 +1871,23 @@  #define PCI_VENDOR_ID_QUATECH		0x135C  #define PCI_DEVICE_ID_QUATECH_QSC100	0x0010  #define PCI_DEVICE_ID_QUATECH_DSC100	0x0020 +#define PCI_DEVICE_ID_QUATECH_DSC200	0x0030 +#define PCI_DEVICE_ID_QUATECH_QSC200	0x0040  #define PCI_DEVICE_ID_QUATECH_ESC100D	0x0050  #define PCI_DEVICE_ID_QUATECH_ESC100M	0x0060 +#define PCI_DEVICE_ID_QUATECH_QSCP100	0x0120 +#define PCI_DEVICE_ID_QUATECH_DSCP100	0x0130 +#define PCI_DEVICE_ID_QUATECH_QSCP200	0x0140 +#define PCI_DEVICE_ID_QUATECH_DSCP200	0x0150 +#define PCI_DEVICE_ID_QUATECH_QSCLP100	0x0170 +#define PCI_DEVICE_ID_QUATECH_DSCLP100	0x0180 +#define PCI_DEVICE_ID_QUATECH_DSC100E	0x0181 +#define PCI_DEVICE_ID_QUATECH_SSCLP100	0x0190 +#define PCI_DEVICE_ID_QUATECH_QSCLP200	0x01A0 +#define PCI_DEVICE_ID_QUATECH_DSCLP200	0x01B0 +#define PCI_DEVICE_ID_QUATECH_DSC200E	0x01B1 +#define PCI_DEVICE_ID_QUATECH_SSCLP200	0x01C0 +#define PCI_DEVICE_ID_QUATECH_ESCLP100	0x01E0  #define PCI_DEVICE_ID_QUATECH_SPPXP_100 0x0278  #define PCI_VENDOR_ID_SEALEVEL		0x135e @@ -2013,6 +2031,10 @@  #define PCI_DEVICE_ID_CMEDIA_CM8738	0x0111  #define PCI_DEVICE_ID_CMEDIA_CM8738B	0x0112 +#define PCI_VENDOR_ID_ADVANTECH		0x13fe + +#define PCI_VENDOR_ID_MEILHAUS		0x1402 +  #define PCI_VENDOR_ID_LAVA		0x1407  #define PCI_DEVICE_ID_LAVA_DSERIAL	0x0100 /* 2x 16550 */  #define PCI_DEVICE_ID_LAVA_QUATRO_A	0x0101 /* 2x 16550, half of 4 port */ @@ -2058,6 +2080,8 @@  #define PCI_VENDOR_ID_CHELSIO		0x1425 +#define PCI_VENDOR_ID_ADLINK		0x144a +  #define PCI_VENDOR_ID_SAMSUNG		0x144d  #define PCI_VENDOR_ID_GIGABYTE		0x1458 @@ -2091,6 +2115,8 @@  #define PCI_DEVICE_ID_AFAVLAB_P030	0x2182  #define PCI_SUBDEVICE_ID_AFAVLAB_P061		0x2150 +#define PCI_VENDOR_ID_AMPLICON		0x14dc +  #define PCI_VENDOR_ID_BCM_GVC          0x14a4  #define PCI_VENDOR_ID_BROADCOM		0x14e4  #define PCI_DEVICE_ID_TIGON3_5752	0x1600 @@ -2127,6 +2153,7 @@  #define PCI_DEVICE_ID_TIGON3_5754M	0x1672  #define PCI_DEVICE_ID_TIGON3_5755M	0x1673  #define PCI_DEVICE_ID_TIGON3_5756	0x1674 +#define PCI_DEVICE_ID_TIGON3_5750	0x1676  #define PCI_DEVICE_ID_TIGON3_5751	0x1677  #define PCI_DEVICE_ID_TIGON3_5715	0x1678  #define PCI_DEVICE_ID_TIGON3_5715S	0x1679 @@ -2776,6 +2803,7 @@  #define PCI_DEVICE_ID_INTEL_JAKETOWN_UBOX	0x3ce0  #define PCI_DEVICE_ID_INTEL_IOAT_SNB	0x402f  #define PCI_DEVICE_ID_INTEL_5100_16	0x65f0 +#define PCI_DEVICE_ID_INTEL_5100_19	0x65f3  #define PCI_DEVICE_ID_INTEL_5100_21	0x65f5  #define PCI_DEVICE_ID_INTEL_5100_22	0x65f6  #define PCI_DEVICE_ID_INTEL_5400_ERR	0x4030 diff --git a/include/linux/pcieport_if.h b/include/linux/pcieport_if.h index e6f91b1406d..9572669eea9 100644 --- a/include/linux/pcieport_if.h +++ b/include/linux/pcieport_if.h @@ -62,7 +62,7 @@ struct pcie_port_service_driver {  #define to_service_driver(d) \  	container_of(d, struct pcie_port_service_driver, driver) -extern int pcie_port_service_register(struct pcie_port_service_driver *new); -extern void pcie_port_service_unregister(struct pcie_port_service_driver *new); +int pcie_port_service_register(struct pcie_port_service_driver *new); +void pcie_port_service_unregister(struct pcie_port_service_driver *new);  #endif /* _PCIEPORT_IF_H_ */ diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index b9df9ed1adc..d5dd4657c8d 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -83,7 +83,7 @@ static inline int percpu_counter_initialized(struct percpu_counter *fbc)  	return (fbc->counters != NULL);  } -#else +#else /* !CONFIG_SMP */  struct percpu_counter {  	s64 count; diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index e47ee462c2f..1d795df6f4c 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -799,6 +799,12 @@ static inline int __perf_event_disable(void *info)			{ return -1; }  static inline void perf_event_task_tick(void)				{ }  #endif +#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL) +extern void perf_restore_debug_store(void); +#else +static inline void perf_restore_debug_store(void)			{ } +#endif +  #define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof(x))  /* diff --git a/include/linux/phy.h b/include/linux/phy.h index 93b3cf77f56..33999adbf8c 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -506,13 +506,13 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);  int phy_device_register(struct phy_device *phy);  int phy_init_hw(struct phy_device *phydev);  struct phy_device * phy_attach(struct net_device *dev, -		const char *bus_id, u32 flags, phy_interface_t interface); +		const char *bus_id, phy_interface_t interface);  struct phy_device *phy_find_first(struct mii_bus *bus);  int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, -		void (*handler)(struct net_device *), u32 flags, +		void (*handler)(struct net_device *),  		phy_interface_t interface);  struct phy_device * phy_connect(struct net_device *dev, const char *bus_id, -		void (*handler)(struct net_device *), u32 flags, +		void (*handler)(struct net_device *),  		phy_interface_t interface);  void phy_disconnect(struct phy_device *phydev);  void phy_detach(struct phy_device *phydev); diff --git a/include/linux/pid.h b/include/linux/pid.h index 2381c973d89..a089a3c447f 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h @@ -176,9 +176,8 @@ pid_t pid_vnr(struct pid *pid);  #define do_each_pid_task(pid, type, task)				\  	do {								\ -		struct hlist_node *pos___;				\  		if ((pid) != NULL)					\ -			hlist_for_each_entry_rcu((task), pos___,	\ +			hlist_for_each_entry_rcu((task),		\  				&(pid)->tasks[type], pids[type].node) {  			/* diff --git a/include/linux/pinctrl/devinfo.h b/include/linux/pinctrl/devinfo.h new file mode 100644 index 00000000000..6e5f8a985ea --- /dev/null +++ b/include/linux/pinctrl/devinfo.h @@ -0,0 +1,45 @@ +/* + * Per-device information from the pin control system. + * This is the stuff that get included into the device + * core. + * + * Copyright (C) 2012 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 PINCTRL_DEVINFO_H +#define PINCTRL_DEVINFO_H + +#ifdef CONFIG_PINCTRL + +/* The device core acts as a consumer toward pinctrl */ +#include <linux/pinctrl/consumer.h> + +/** + * struct dev_pin_info - pin state container for devices + * @p: pinctrl handle for the containing device + * @default_state: the default state for the handle, if found + */ +struct dev_pin_info { +	struct pinctrl *p; +	struct pinctrl_state *default_state; +}; + +extern int pinctrl_bind_pins(struct device *dev); + +#else + +/* Stubs if we're not using pinctrl */ + +static inline int pinctrl_bind_pins(struct device *dev) +{ +	return 0; +} + +#endif /* CONFIG_PINCTRL */ +#endif /* PINCTRL_DEVINFO_H */ diff --git a/include/linux/pinctrl/pinconf-generic.h b/include/linux/pinctrl/pinconf-generic.h index 47a1bdd8887..72474e18f1e 100644 --- a/include/linux/pinctrl/pinconf-generic.h +++ b/include/linux/pinctrl/pinconf-generic.h @@ -46,7 +46,11 @@   * @PIN_CONFIG_DRIVE_OPEN_SOURCE: the pin will be driven with open source   *	(open emitter). Sending this config will enabale open drain mode, the   *	argument is ignored. - * @PIN_CONFIG_INPUT_SCHMITT_DISABLE: disable schmitt-trigger mode on the pin. + * @PIN_CONFIG_DRIVE_STRENGTH: the pin will output the current passed as + * 	argument. The argument is in mA. + * @PIN_CONFIG_INPUT_SCHMITT_ENABLE: control schmitt-trigger mode on the pin. + *      If the argument != 0, schmitt-trigger mode is enabled. If it's 0, + *      schmitt-trigger mode is disabled.   * @PIN_CONFIG_INPUT_SCHMITT: this will configure an input pin to run in   *	schmitt-trigger mode. If the schmitt-trigger has adjustable hysteresis,   *	the threshold value is given on a custom format as argument when @@ -58,10 +62,15 @@   * @PIN_CONFIG_POWER_SOURCE: if the pin can select between different power   *	supplies, the argument to this parameter (on a custom format) tells   *	the driver which alternative power source to use. + * @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to + * 	this parameter (on a custom format) tells the driver which alternative + * 	slew rate to use.   * @PIN_CONFIG_LOW_POWER_MODE: this will configure the pin for low power   *	operation, if several modes of operation are supported these can be   *	passed in the argument on a custom form, else just use argument 1   *	to indicate low power mode, argument 0 turns low power mode off. + * @PIN_CONFIG_OUTPUT: this will configure the pin in output, use argument + *	1 to indicate high level, argument 0 to indicate low level.   * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if   *	you need to pass in custom configurations to the pin controller, use   *	PIN_CONFIG_END+1 as the base offset. @@ -74,11 +83,14 @@ enum pin_config_param {  	PIN_CONFIG_DRIVE_PUSH_PULL,  	PIN_CONFIG_DRIVE_OPEN_DRAIN,  	PIN_CONFIG_DRIVE_OPEN_SOURCE, -	PIN_CONFIG_INPUT_SCHMITT_DISABLE, +	PIN_CONFIG_DRIVE_STRENGTH, +	PIN_CONFIG_INPUT_SCHMITT_ENABLE,  	PIN_CONFIG_INPUT_SCHMITT,  	PIN_CONFIG_INPUT_DEBOUNCE,  	PIN_CONFIG_POWER_SOURCE, +	PIN_CONFIG_SLEW_RATE,  	PIN_CONFIG_LOW_POWER_MODE, +	PIN_CONFIG_OUTPUT,  	PIN_CONFIG_END = 0x7FFF,  }; diff --git a/include/linux/pinctrl/pinconf.h b/include/linux/pinctrl/pinconf.h index e7a720104a4..1ad4f31ef6b 100644 --- a/include/linux/pinctrl/pinconf.h +++ b/include/linux/pinctrl/pinconf.h @@ -14,6 +14,8 @@  #ifdef CONFIG_PINCONF +#include <linux/pinctrl/machine.h> +  struct pinctrl_dev;  struct seq_file; @@ -28,6 +30,7 @@ struct seq_file;   * @pin_config_set: configure an individual pin   * @pin_config_group_get: get configurations for an entire pin group   * @pin_config_group_set: configure all pins in a group + * @pin_config_group_dbg_set: optional debugfs to modify a pin configuration   * @pin_config_dbg_show: optional debugfs display hook that will provide   *	per-device info for a certain pin in debugfs   * @pin_config_group_dbg_show: optional debugfs display hook that will provide @@ -51,6 +54,9 @@ struct pinconf_ops {  	int (*pin_config_group_set) (struct pinctrl_dev *pctldev,  				     unsigned selector,  				     unsigned long config); +	int (*pin_config_dbg_parse_modify) (struct pinctrl_dev *pctldev, +					   const char *arg, +					   unsigned long *config);  	void (*pin_config_dbg_show) (struct pinctrl_dev *pctldev,  				     struct seq_file *s,  				     unsigned offset); diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 04d6700d99a..2c2a9e8d857 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h @@ -118,9 +118,9 @@ struct pinctrl_desc {  	const char *name;  	struct pinctrl_pin_desc const *pins;  	unsigned int npins; -	struct pinctrl_ops *pctlops; -	struct pinmux_ops *pmxops; -	struct pinconf_ops *confops; +	const struct pinctrl_ops *pctlops; +	const struct pinmux_ops *pmxops; +	const struct pinconf_ops *confops;  	struct module *owner;  }; @@ -154,6 +154,7 @@ struct pinctrl_dev *of_pinctrl_get(struct device_node *np)  #endif /* CONFIG_OF */  extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev); +extern const char *pinctrl_dev_get_devname(struct pinctrl_dev *pctldev);  extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev);  #else diff --git a/include/linux/platform_data/cpsw.h b/include/linux/platform_data/cpsw.h index 24368a2e8b8..798fb80b024 100644 --- a/include/linux/platform_data/cpsw.h +++ b/include/linux/platform_data/cpsw.h @@ -21,6 +21,8 @@ struct cpsw_slave_data {  	char		phy_id[MII_BUS_ID_SIZE];  	int		phy_if;  	u8		mac_addr[ETH_ALEN]; +	u16		dual_emac_res_vlan;	/* Reserved VLAN for DualEMAC */ +  };  struct cpsw_platform_data { @@ -35,6 +37,8 @@ struct cpsw_platform_data {  	u32	bd_ram_size;  /*buffer descriptor ram size */  	u32	rx_descs;	/* Number of Rx Descriptios */  	u32	mac_control;	/* Mac control register */ +	u16	default_vlan;	/* Def VLAN for ALE lookup in VLAN aware mode*/ +	bool	dual_emac;	/* Enable Dual EMAC mode */  };  #endif /* __CPSW_H__ */ diff --git a/include/linux/platform_data/dma-coh901318.h b/include/linux/platform_data/dma-coh901318.h new file mode 100644 index 00000000000..c4cb9590d11 --- /dev/null +++ b/include/linux/platform_data/dma-coh901318.h @@ -0,0 +1,72 @@ +/* + * Platform data for the COH901318 DMA controller + * Copyright (C) 2007-2013 ST-Ericsson + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef PLAT_COH901318_H +#define PLAT_COH901318_H + +#ifdef CONFIG_COH901318 + +/* We only support the U300 DMA channels */ +#define U300_DMA_MSL_TX_0		0 +#define U300_DMA_MSL_TX_1		1 +#define U300_DMA_MSL_TX_2		2 +#define U300_DMA_MSL_TX_3		3 +#define U300_DMA_MSL_TX_4		4 +#define U300_DMA_MSL_TX_5		5 +#define U300_DMA_MSL_TX_6		6 +#define U300_DMA_MSL_RX_0		7 +#define U300_DMA_MSL_RX_1		8 +#define U300_DMA_MSL_RX_2		9 +#define U300_DMA_MSL_RX_3		10 +#define U300_DMA_MSL_RX_4		11 +#define U300_DMA_MSL_RX_5		12 +#define U300_DMA_MSL_RX_6		13 +#define U300_DMA_MMCSD_RX_TX		14 +#define U300_DMA_MSPRO_TX		15 +#define U300_DMA_MSPRO_RX		16 +#define U300_DMA_UART0_TX		17 +#define U300_DMA_UART0_RX		18 +#define U300_DMA_APEX_TX		19 +#define U300_DMA_APEX_RX		20 +#define U300_DMA_PCM_I2S0_TX		21 +#define U300_DMA_PCM_I2S0_RX		22 +#define U300_DMA_PCM_I2S1_TX		23 +#define U300_DMA_PCM_I2S1_RX		24 +#define U300_DMA_XGAM_CDI		25 +#define U300_DMA_XGAM_PDI		26 +#define U300_DMA_SPI_TX			27 +#define U300_DMA_SPI_RX			28 +#define U300_DMA_GENERAL_PURPOSE_0	29 +#define U300_DMA_GENERAL_PURPOSE_1	30 +#define U300_DMA_GENERAL_PURPOSE_2	31 +#define U300_DMA_GENERAL_PURPOSE_3	32 +#define U300_DMA_GENERAL_PURPOSE_4	33 +#define U300_DMA_GENERAL_PURPOSE_5	34 +#define U300_DMA_GENERAL_PURPOSE_6	35 +#define U300_DMA_GENERAL_PURPOSE_7	36 +#define U300_DMA_GENERAL_PURPOSE_8	37 +#define U300_DMA_UART1_TX		38 +#define U300_DMA_UART1_RX		39 + +#define U300_DMA_DEVICE_CHANNELS	32 +#define U300_DMA_CHANNELS		40 + +/** + * coh901318_filter_id() - DMA channel filter function + * @chan: dma channel handle + * @chan_id: id of dma channel to be filter out + * + * In dma_request_channel() it specifies what channel id to be requested + */ +bool coh901318_filter_id(struct dma_chan *chan, void *chan_id); +#else +static inline bool coh901318_filter_id(struct dma_chan *chan, void *chan_id) +{ +	return false; +} +#endif + +#endif /* PLAT_COH901318_H */ diff --git a/include/linux/platform_data/dma-ste-dma40.h b/include/linux/platform_data/dma-ste-dma40.h index 9ff93b06568..4b781014b0a 100644 --- a/include/linux/platform_data/dma-ste-dma40.h +++ b/include/linux/platform_data/dma-ste-dma40.h @@ -147,6 +147,16 @@ struct stedma40_chan_cfg {   * @memcpy_conf_log: default configuration of logical channel memcpy   * @disabled_channels: A vector, ending with -1, that marks physical channels   * that are for different reasons not available for the driver. + * @soft_lli_chans: A vector, that marks physical channels will use LLI by SW + * which avoids HW bug that exists in some versions of the controller. + * SoftLLI introduces relink overhead that could impact performace for + * certain use cases. + * @num_of_soft_lli_chans: The number of channels that needs to be configured + * to use SoftLLI. + * @use_esram_lcla: flag for mapping the lcla into esram region + * @num_of_phy_chans: The number of physical channels implemented in HW. + * 0 means reading the number of channels from DMA HW but this is only valid + * for 'multiple of 4' channels, like 8.   */  struct stedma40_platform_data {  	u32				 dev_len; @@ -157,7 +167,10 @@ struct stedma40_platform_data {  	struct stedma40_chan_cfg	*memcpy_conf_phy;  	struct stedma40_chan_cfg	*memcpy_conf_log;  	int				 disabled_channels[STEDMA40_MAX_PHYS]; +	int				*soft_lli_chans; +	int				 num_of_soft_lli_chans;  	bool				 use_esram_lcla; +	int				 num_of_phy_chans;  };  #ifdef CONFIG_STE_DMA40 diff --git a/include/linux/platform_data/dwc3-omap.h b/include/linux/platform_data/dwc3-omap.h index ada401244e0..1d36ca874cc 100644 --- a/include/linux/platform_data/dwc3-omap.h +++ b/include/linux/platform_data/dwc3-omap.h @@ -41,7 +41,3 @@ enum dwc3_omap_utmi_mode {  	DWC3_OMAP_UTMI_MODE_HW,  	DWC3_OMAP_UTMI_MODE_SW,  }; - -struct dwc3_omap_data { -	enum dwc3_omap_utmi_mode	utmi_mode; -}; diff --git a/include/linux/platform_data/elm.h b/include/linux/platform_data/elm.h new file mode 100644 index 00000000000..1bd5244d1dc --- /dev/null +++ b/include/linux/platform_data/elm.h @@ -0,0 +1,54 @@ +/* + * BCH Error Location Module + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + * + */ + +#ifndef __ELM_H +#define __ELM_H + +enum bch_ecc { +	BCH4_ECC = 0, +	BCH8_ECC, +}; + +/* ELM support 8 error syndrome process */ +#define ERROR_VECTOR_MAX		8 + +#define BCH8_ECC_OOB_BYTES		13 +#define BCH4_ECC_OOB_BYTES		7 +/* RBL requires 14 byte even though BCH8 uses only 13 byte */ +#define BCH8_SIZE			(BCH8_ECC_OOB_BYTES + 1) +/* Uses 1 extra byte to handle erased pages */ +#define BCH4_SIZE			(BCH4_ECC_OOB_BYTES + 1) + +/** + * struct elm_errorvec - error vector for elm + * @error_reported:		set true for vectors error is reported + * @error_uncorrectable:	number of uncorrectable errors + * @error_count:		number of correctable errors in the sector + * @error_loc:			buffer for error location + * + */ +struct elm_errorvec { +	bool error_reported; +	bool error_uncorrectable; +	int error_count; +	int error_loc[ERROR_VECTOR_MAX]; +}; + +void elm_decode_bch_error_page(struct device *dev, u8 *ecc_calc, +		struct elm_errorvec *err_vec); +void elm_config(struct device *dev, enum bch_ecc bch_type); +#endif /* __ELM_H */ diff --git a/include/linux/platform_data/emif_plat.h b/include/linux/platform_data/emif_plat.h index 03378ca8406..5c19a2a647c 100644 --- a/include/linux/platform_data/emif_plat.h +++ b/include/linux/platform_data/emif_plat.h @@ -40,6 +40,7 @@  /* Custom config requests */  #define EMIF_CUSTOM_CONFIG_LPMODE			0x00000001  #define EMIF_CUSTOM_CONFIG_TEMP_ALERT_POLL_INTERVAL	0x00000002 +#define EMIF_CUSTOM_CONFIG_EXTENDED_TEMP_PART		0x00000004  #ifndef __ASSEMBLY__  /** diff --git a/include/linux/platform_data/exynos_thermal.h b/include/linux/platform_data/exynos_thermal.h index a7bdb2f63b7..da7e6274b17 100644 --- a/include/linux/platform_data/exynos_thermal.h +++ b/include/linux/platform_data/exynos_thermal.h @@ -53,6 +53,8 @@ struct freq_clip_table {   * struct exynos_tmu_platform_data   * @threshold: basic temperature for generating interrupt   *	       25 <= threshold <= 125 [unit: degree Celsius] + * @threshold_falling: differntial value for setting threshold + *		       of temperature falling interrupt.   * @trigger_levels: array for each interrupt levels   *	[unit: degree Celsius]   *	0: temperature for trigger_level0 interrupt @@ -97,6 +99,7 @@ struct freq_clip_table {   */  struct exynos_tmu_platform_data {  	u8 threshold; +	u8 threshold_falling;  	u8 trigger_levels[4];  	bool trigger_level0_en;  	bool trigger_level1_en; diff --git a/include/linux/platform_data/i2c-s3c2410.h b/include/linux/platform_data/i2c-s3c2410.h index 51d52e767a1..2a50048c1c4 100644 --- a/include/linux/platform_data/i2c-s3c2410.h +++ b/include/linux/platform_data/i2c-s3c2410.h @@ -15,6 +15,8 @@  #define S3C_IICFLG_FILTER	(1<<0)	/* enable s3c2440 filter */ +struct platform_device; +  /**   *	struct s3c2410_platform_i2c - Platform data for s3c I2C.   *	@bus_num: The bus number to use (if possible). diff --git a/include/linux/platform_data/invensense_mpu6050.h b/include/linux/platform_data/invensense_mpu6050.h new file mode 100644 index 00000000000..ad3aa7b95f3 --- /dev/null +++ b/include/linux/platform_data/invensense_mpu6050.h @@ -0,0 +1,31 @@ +/* +* Copyright (C) 2012 Invensense, 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 __INV_MPU6050_PLATFORM_H_ +#define __INV_MPU6050_PLATFORM_H_ + +/** + * struct inv_mpu6050_platform_data - Platform data for the mpu driver + * @orientation:	Orientation matrix of the chip + * + * Contains platform specific information on how to configure the MPU6050 to + * work on this platform.  The orientation matricies are 3x3 rotation matricies + * that are applied to the data to rotate from the mounting orientation to the + * platform orientation.  The values must be one of 0, 1, or -1 and each row and + * column should have exactly 1 non-zero value. + */ +struct inv_mpu6050_platform_data { +	__s8 orientation[9]; +}; + +#endif diff --git a/include/linux/platform_data/leds-lp55xx.h b/include/linux/platform_data/leds-lp55xx.h new file mode 100644 index 00000000000..1509570d5a3 --- /dev/null +++ b/include/linux/platform_data/leds-lp55xx.h @@ -0,0 +1,87 @@ +/* + * LP55XX Platform Data Header + * + * Copyright (C) 2012 Texas Instruments + * + * Author: Milo(Woogyom) Kim <milo.kim@ti.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. + * + * Derived from leds-lp5521.h, leds-lp5523.h + */ + +#ifndef _LEDS_LP55XX_H +#define _LEDS_LP55XX_H + +/* Clock configuration */ +#define LP55XX_CLOCK_AUTO	0 +#define LP55XX_CLOCK_INT	1 +#define LP55XX_CLOCK_EXT	2 + +/* Bits in LP5521 CONFIG register. 'update_config' in lp55xx_platform_data */ +#define LP5521_PWM_HF			0x40	/* PWM: 0 = 256Hz, 1 = 558Hz */ +#define LP5521_PWRSAVE_EN		0x20	/* 1 = Power save mode */ +#define LP5521_CP_MODE_OFF		0	/* Charge pump (CP) off */ +#define LP5521_CP_MODE_BYPASS		8	/* CP forced to bypass mode */ +#define LP5521_CP_MODE_1X5		0x10	/* CP forced to 1.5x mode */ +#define LP5521_CP_MODE_AUTO		0x18	/* Automatic mode selection */ +#define LP5521_R_TO_BATT		4	/* R out: 0 = CP, 1 = Vbat */ +#define LP5521_CLK_SRC_EXT		0	/* Ext-clk source (CLK_32K) */ +#define LP5521_CLK_INT			1	/* Internal clock */ +#define LP5521_CLK_AUTO			2	/* Automatic clock selection */ + +struct lp55xx_led_config { +	const char *name; +	u8 chan_nr; +	u8 led_current; /* mA x10, 0 if led is not connected */ +	u8 max_current; +}; + +struct lp55xx_predef_pattern { +	u8 *r; +	u8 *g; +	u8 *b; +	u8 size_r; +	u8 size_g; +	u8 size_b; +}; + +/* + * struct lp55xx_platform_data + * @led_config        : Configurable led class device + * @num_channels      : Number of LED channels + * @label             : Used for naming LEDs + * @clock_mode        : Input clock mode. LP55XX_CLOCK_AUTO or _INT or _EXT + * @setup_resources   : Platform specific function before enabling the chip + * @release_resources : Platform specific function after  disabling the chip + * @enable            : EN pin control by platform side + * @patterns          : Predefined pattern data for RGB channels + * @num_patterns      : Number of patterns + * @update_config     : Value of CONFIG register + */ +struct lp55xx_platform_data { + +	/* LED channel configuration */ +	struct lp55xx_led_config *led_config; +	u8 num_channels; +	const char *label; + +	/* Clock configuration */ +	u8 clock_mode; + +	/* Platform specific functions */ +	int (*setup_resources)(void); +	void (*release_resources)(void); +	void (*enable)(bool state); + +	/* Predefined pattern data */ +	struct lp55xx_predef_pattern *patterns; +	unsigned int num_patterns; + +	/* _CONFIG register */ +	u8 update_config; +}; + +#endif /* _LEDS_LP55XX_H */ diff --git a/include/linux/platform_data/lp855x.h b/include/linux/platform_data/lp855x.h index e81f62d24ee..20ee8b221db 100644 --- a/include/linux/platform_data/lp855x.h +++ b/include/linux/platform_data/lp855x.h @@ -49,12 +49,24 @@  #define LP8556_FAST_CONFIG	BIT(7) /* use it if EPROMs should be maintained  					  when exiting the low power mode */ +/* CONFIG register - LP8557 */ +#define LP8557_PWM_STANDBY	BIT(7) +#define LP8557_PWM_FILTER	BIT(6) +#define LP8557_RELOAD_EPROM	BIT(3)	/* use it if EPROMs should be reset +					   when the backlight turns on */ +#define LP8557_OFF_OPENLEDS	BIT(2) +#define LP8557_PWM_CONFIG	LP8557_PWM_ONLY +#define LP8557_I2C_CONFIG	LP8557_I2C_ONLY +#define LP8557_COMB1_CONFIG	LP8557_COMBINED1 +#define LP8557_COMB2_CONFIG	LP8557_COMBINED2 +  enum lp855x_chip_id {  	LP8550,  	LP8551,  	LP8552,  	LP8553,  	LP8556, +	LP8557,  };  enum lp855x_brightness_ctrl_mode { @@ -89,6 +101,13 @@ enum lp8556_brightness_source {  	LP8556_COMBINED2,	/* pwm + i2c after the shaper block */  }; +enum lp8557_brightness_source { +	LP8557_PWM_ONLY, +	LP8557_I2C_ONLY, +	LP8557_COMBINED1,	/* pwm + i2c after the shaper block */ +	LP8557_COMBINED2,	/* pwm + i2c before the shaper block */ +}; +  struct lp855x_rom_data {  	u8 addr;  	u8 val; diff --git a/include/linux/platform_data/lp8755.h b/include/linux/platform_data/lp8755.h new file mode 100644 index 00000000000..a7fd0776c9b --- /dev/null +++ b/include/linux/platform_data/lp8755.h @@ -0,0 +1,71 @@ +/* + * LP8755 High Performance Power Management Unit Driver:System Interface Driver + * + *			Copyright (C) 2012 Texas Instruments + * + * Author: Daniel(Geon Si) Jeong <daniel.jeong@ti.com> + *             G.Shark Jeong <gshark.jeong@gmail.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 _LP8755_H +#define _LP8755_H + +#include <linux/regulator/consumer.h> + +#define LP8755_NAME "lp8755-regulator" +/* + *PWR FAULT : power fault detected + *OCP : over current protect activated + *OVP : over voltage protect activated + *TEMP_WARN : thermal warning + *TEMP_SHDN : thermal shutdonw detected + *I_LOAD : current measured + */ +#define LP8755_EVENT_PWR_FAULT REGULATOR_EVENT_FAIL +#define LP8755_EVENT_OCP REGULATOR_EVENT_OVER_CURRENT +#define LP8755_EVENT_OVP 0x10000 +#define LP8755_EVENT_TEMP_WARN 0x2000 +#define LP8755_EVENT_TEMP_SHDN REGULATOR_EVENT_OVER_TEMP +#define LP8755_EVENT_I_LOAD	0x40000 + +enum lp8755_bucks { +	LP8755_BUCK0 = 0, +	LP8755_BUCK1, +	LP8755_BUCK2, +	LP8755_BUCK3, +	LP8755_BUCK4, +	LP8755_BUCK5, +	LP8755_BUCK_MAX, +}; + +/** + * multiphase configuration options + */ +enum lp8755_mphase_config { +	MPHASE_CONF0, +	MPHASE_CONF1, +	MPHASE_CONF2, +	MPHASE_CONF3, +	MPHASE_CONF4, +	MPHASE_CONF5, +	MPHASE_CONF6, +	MPHASE_CONF7, +	MPHASE_CONF8, +	MPHASE_CONF_MAX +}; + +/** + * struct lp8755_platform_data + * @mphase_type : Multiphase Switcher Configurations. + * @buck_data   : buck0~6 init voltage in uV + */ +struct lp8755_platform_data { +	int mphase; +	struct regulator_init_data *buck_data[LP8755_BUCK_MAX]; +}; +#endif diff --git a/include/linux/platform_data/max6697.h b/include/linux/platform_data/max6697.h new file mode 100644 index 00000000000..ed9d3b3daf0 --- /dev/null +++ b/include/linux/platform_data/max6697.h @@ -0,0 +1,36 @@ +/* + * max6697.h + *     Copyright (c) 2012 Guenter Roeck <linux@roeck-us.net> + * + * 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 MAX6697_H +#define MAX6697_H + +#include <linux/types.h> + +/* + * For all bit masks: + * bit 0:    local temperature + * bit 1..7: remote temperatures + */ +struct max6697_platform_data { +	bool smbus_timeout_disable;	/* set to disable SMBus timeouts */ +	bool extended_range_enable;	/* set to enable extended temp range */ +	bool beta_compensation;		/* set to enable beta compensation */ +	u8 alert_mask;			/* set bit to 1 to disable alert */ +	u8 over_temperature_mask;	/* set bit to 1 to disable */ +	u8 resistance_cancellation;	/* set bit to 0 to disable +					 * bit mask for MAX6581, +					 * boolean for other chips +					 */ +	u8 ideality_mask;		/* set bit to 0 to disable */ +	u8 ideality_value;		/* transistor ideality as per +					 * MAX6581 datasheet +					 */ +}; + +#endif /* MAX6697_H */ diff --git a/include/linux/platform_data/microread.h b/include/linux/platform_data/microread.h new file mode 100644 index 00000000000..cfda59b226e --- /dev/null +++ b/include/linux/platform_data/microread.h @@ -0,0 +1,35 @@ +/* + * Driver include for the PN544 NFC chip. + * + * Copyright (C) 2011 Tieto Poland + * Copyright (C) 2012 Intel Corporation. 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 + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _MICROREAD_H +#define _MICROREAD_H + +#include <linux/i2c.h> + +#define MICROREAD_DRIVER_NAME	"microread" + +/* board config platform data for microread */ +struct microread_nfc_platform_data { +	unsigned int rst_gpio; +	unsigned int irq_gpio; +	unsigned int ioh_gpio; +}; + +#endif /* _MICROREAD_H */ diff --git a/include/linux/platform_data/mmc-esdhc-imx.h b/include/linux/platform_data/mmc-esdhc-imx.h index aaf97481f41..b4a0521ce41 100644 --- a/include/linux/platform_data/mmc-esdhc-imx.h +++ b/include/linux/platform_data/mmc-esdhc-imx.h @@ -39,5 +39,6 @@ struct esdhc_platform_data {  	unsigned int cd_gpio;  	enum wp_types wp_type;  	enum cd_types cd_type; +	int max_bus_width;  };  #endif /* __ASM_ARCH_IMX_ESDHC_H */ diff --git a/include/linux/platform_data/mmc-sdhci-tegra.h b/include/linux/platform_data/mmc-sdhci-tegra.h deleted file mode 100644 index 8f843069768..00000000000 --- a/include/linux/platform_data/mmc-sdhci-tegra.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2009 Palm, Inc. - * Author: Yvonne Yip <y@palm.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ -#ifndef __PLATFORM_DATA_TEGRA_SDHCI_H -#define __PLATFORM_DATA_TEGRA_SDHCI_H - -#include <linux/mmc/host.h> - -struct tegra_sdhci_platform_data { -	int cd_gpio; -	int wp_gpio; -	int power_gpio; -	int is_8bit; -	int pm_flags; -}; - -#endif diff --git a/include/linux/platform_data/mtd-nand-omap2.h b/include/linux/platform_data/mtd-nand-omap2.h index 24d32ca34be..6bf9ef43ddb 100644 --- a/include/linux/platform_data/mtd-nand-omap2.h +++ b/include/linux/platform_data/mtd-nand-omap2.h @@ -60,6 +60,8 @@ struct omap_nand_platform_data {  	int			devsize;  	enum omap_ecc           ecc_opt;  	struct gpmc_nand_regs	reg; -}; +	/* for passing the partitions */ +	struct device_node	*of_node; +};  #endif diff --git a/include/linux/platform_data/mtd-onenand-omap2.h b/include/linux/platform_data/mtd-onenand-omap2.h index 685af7e8b12..e9a9fb188f9 100644 --- a/include/linux/platform_data/mtd-onenand-omap2.h +++ b/include/linux/platform_data/mtd-onenand-omap2.h @@ -29,5 +29,8 @@ struct omap_onenand_platform_data {  	u8			flags;  	u8			regulator_can_sleep;  	u8			skip_initial_unlocking; + +	/* for passing the partitions */ +	struct device_node	*of_node;  };  #endif diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h index 944b01dd103..98b7925f1a2 100644 --- a/include/linux/platform_data/mv_usb.h +++ b/include/linux/platform_data/mv_usb.h @@ -34,8 +34,6 @@ struct mv_usb_addon_irq {  };  struct mv_usb_platform_data { -	unsigned int		clknum; -	char			**clkname;  	struct mv_usb_addon_irq	*id;	/* Only valid for OTG. ID pin change*/  	struct mv_usb_addon_irq	*vbus;	/* valid for OTG/UDC. VBUS change*/ diff --git a/include/linux/platform_data/ntc_thermistor.h b/include/linux/platform_data/ntc_thermistor.h index 88734e871e3..c7285b57546 100644 --- a/include/linux/platform_data/ntc_thermistor.h +++ b/include/linux/platform_data/ntc_thermistor.h @@ -21,6 +21,8 @@  #ifndef _LINUX_NTC_H  #define _LINUX_NTC_H +struct iio_channel; +  enum ntc_thermistor_type {  	TYPE_NCPXXWB473,  	TYPE_NCPXXWL333, @@ -39,13 +41,17 @@ struct ntc_thermistor_platform_data {  	 * described at Documentation/hwmon/ntc_thermistor  	 *  	 * pullup/down_ohm: 0 for infinite / not-connected +	 * +	 * chan: iio_channel pointer to communicate with the ADC which the +	 * thermistor is using for conversion of the analog values.  	 */ -	int (*read_uV)(void); -	unsigned int pullup_uV; +	int (*read_uv)(struct ntc_thermistor_platform_data *); +	unsigned int pullup_uv;  	unsigned int pullup_ohm;  	unsigned int pulldown_ohm;  	enum { NTC_CONNECTED_POSITIVE, NTC_CONNECTED_GROUND } connect; +	struct iio_channel *chan;  	int (*read_ohm)(void);  }; diff --git a/include/linux/platform_data/s3c-hsotg.h b/include/linux/platform_data/s3c-hsotg.h index 8b79e0967f9..3f1cbf95ec3 100644 --- a/include/linux/platform_data/s3c-hsotg.h +++ b/include/linux/platform_data/s3c-hsotg.h @@ -15,6 +15,8 @@  #ifndef __LINUX_USB_S3C_HSOTG_H  #define __LINUX_USB_S3C_HSOTG_H +struct platform_device; +  enum s3c_hsotg_dmamode {  	S3C_HSOTG_DMA_NONE,	/* do not use DMA at-all */  	S3C_HSOTG_DMA_ONLY,	/* always use DMA */ diff --git a/include/linux/platform_data/samsung-usbphy.h b/include/linux/platform_data/samsung-usbphy.h new file mode 100644 index 00000000000..1bd24cba982 --- /dev/null +++ b/include/linux/platform_data/samsung-usbphy.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co.Ltd + *		http://www.samsung.com/ + * Author: Praveen Paneri <p.paneri@samsung.com> + * + * Defines platform data for samsung usb phy driver. + * + * 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_USBPHY_PLATFORM_H +#define __SAMSUNG_USBPHY_PLATFORM_H + +/** + * samsung_usbphy_data - Platform data for USB PHY driver. + * @pmu_isolation: Function to control usb phy isolation in PMU. + */ +struct samsung_usbphy_data { +	void (*pmu_isolation)(int on); +}; + +extern void samsung_usbphy_set_pdata(struct samsung_usbphy_data *pd); + +#endif /* __SAMSUNG_USBPHY_PLATFORM_H */ diff --git a/include/linux/platform_data/sccnxp.h b/include/linux/platform_data/serial-sccnxp.h index 7311ccd3217..bdc510d0324 100644 --- a/include/linux/platform_data/sccnxp.h +++ b/include/linux/platform_data/serial-sccnxp.h @@ -11,8 +11,8 @@   *  (at your option) any later version.   */ -#ifndef __SCCNXP_H -#define __SCCNXP_H +#ifndef _PLATFORM_DATA_SERIAL_SCCNXP_H_ +#define _PLATFORM_DATA_SERIAL_SCCNXP_H_  #define SCCNXP_MAX_UARTS	2 @@ -84,10 +84,8 @@ struct sccnxp_pdata {  	const u8		reg_shift;  	/* Modem control lines configuration */  	const u32		mctrl_cfg[SCCNXP_MAX_UARTS]; -	/* Called during startup */ -	void (*init)(void); -	/* Called before finish */ -	void (*exit)(void); +	/* Timer value for polling mode (usecs) */ +	const unsigned int	poll_time_us;  };  #endif diff --git a/include/linux/platform_data/sh_ipmmu.h b/include/linux/platform_data/sh_ipmmu.h new file mode 100644 index 00000000000..39f7405cdac --- /dev/null +++ b/include/linux/platform_data/sh_ipmmu.h @@ -0,0 +1,18 @@ +/* sh_ipmmu.h + * + * Copyright (C) 2012  Hideki EIRAKU + * + * 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 __SH_IPMMU_H__ +#define __SH_IPMMU_H__ + +struct shmobile_ipmmu_platform_data { +	const char * const *dev_names; +	unsigned int num_dev_names; +}; + +#endif /* __SH_IPMMU_H__ */ diff --git a/include/linux/platform_data/spi-omap2-mcspi.h b/include/linux/platform_data/spi-omap2-mcspi.h index a65572d5321..c100456eab1 100644 --- a/include/linux/platform_data/spi-omap2-mcspi.h +++ b/include/linux/platform_data/spi-omap2-mcspi.h @@ -22,6 +22,9 @@ struct omap2_mcspi_dev_attr {  struct omap2_mcspi_device_config {  	unsigned turbo_mode:1; + +	/* toggle chip select after every word */ +	unsigned cs_per_word:1;  };  #endif diff --git a/include/linux/platform_data/tsl2563.h b/include/linux/platform_data/tsl2563.h new file mode 100644 index 00000000000..c90d7a09dda --- /dev/null +++ b/include/linux/platform_data/tsl2563.h @@ -0,0 +1,8 @@ +#ifndef __LINUX_TSL2563_H +#define __LINUX_TSL2563_H + +struct tsl2563_platform_data { +	int cover_comp_gain; +}; + +#endif /* __LINUX_TSL2563_H */ diff --git a/include/linux/platform_data/usb-omap.h b/include/linux/platform_data/usb-omap.h index ef65b67c56c..fa579b4c666 100644 --- a/include/linux/platform_data/usb-omap.h +++ b/include/linux/platform_data/usb-omap.h @@ -55,13 +55,18 @@ struct ohci_hcd_omap_platform_data {  };  struct usbhs_omap_platform_data { -	enum usbhs_omap_port_mode		port_mode[OMAP3_HS_USB_PORTS]; +	int				nports; +	enum usbhs_omap_port_mode	port_mode[OMAP3_HS_USB_PORTS]; +	int				reset_gpio_port[OMAP3_HS_USB_PORTS]; +	struct regulator		*regulator[OMAP3_HS_USB_PORTS];  	struct ehci_hcd_omap_platform_data	*ehci_data;  	struct ohci_hcd_omap_platform_data	*ohci_data;  	/* OMAP3 <= ES2.1 have a single ulpi bypass control bit */ -	unsigned				single_ulpi_bypass:1; +	unsigned single_ulpi_bypass:1; +	unsigned es2_compatibility:1; +	unsigned phy_reset:1;  };  /*-------------------------------------------------------------------------*/ diff --git a/include/linux/platform_data/usb3503.h b/include/linux/platform_data/usb3503.h new file mode 100644 index 00000000000..85dcc709f7e --- /dev/null +++ b/include/linux/platform_data/usb3503.h @@ -0,0 +1,19 @@ +#ifndef __USB3503_H__ +#define __USB3503_H__ + +#define USB3503_I2C_NAME	"usb3503" + +enum usb3503_mode { +	USB3503_MODE_UNKNOWN, +	USB3503_MODE_HUB, +	USB3503_MODE_STANDBY, +}; + +struct usb3503_platform_data { +	enum usb3503_mode	initial_mode; +	int	gpio_intn; +	int	gpio_connect; +	int	gpio_reset; +}; + +#endif diff --git a/include/linux/platform_data/ux500_wdt.h b/include/linux/platform_data/ux500_wdt.h new file mode 100644 index 00000000000..1689ff4c3bf --- /dev/null +++ b/include/linux/platform_data/ux500_wdt.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) ST Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + * + * STE Ux500 Watchdog platform data + */ +#ifndef __UX500_WDT_H +#define __UX500_WDT_H + +/** + * struct ux500_wdt_data + */ +struct ux500_wdt_data { +	unsigned int timeout; +	bool has_28_bits_resolution; +}; + +#endif /* __UX500_WDT_H */ diff --git a/include/linux/platform_data/video-vt8500lcdfb.h b/include/linux/platform_data/video-vt8500lcdfb.h deleted file mode 100644 index 7f399c370fe..00000000000 --- a/include/linux/platform_data/video-vt8500lcdfb.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - *  VT8500/WM8505 Frame Buffer platform data definitions - * - *  Copyright (C) 2010 Ed Spiridonov <edo.rus@gmail.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef _VT8500FB_H -#define _VT8500FB_H - -#include <linux/fb.h> - -struct vt8500fb_platform_data { -	struct fb_videomode	mode; -	u32			xres_virtual; -	u32			yres_virtual; -	u32			bpp; -	unsigned long		video_mem_phys; -	void			*video_mem_virt; -	unsigned long		video_mem_len; -}; - -#endif /* _VT8500FB_H */ diff --git a/include/linux/platform_data/video_s3c.h b/include/linux/platform_data/video_s3c.h new file mode 100644 index 00000000000..48883995f47 --- /dev/null +++ b/include/linux/platform_data/video_s3c.h @@ -0,0 +1,54 @@ +#ifndef __PLATFORM_DATA_VIDEO_S3C +#define __PLATFORM_DATA_VIDEO_S3C + +/* S3C_FB_MAX_WIN + * Set to the maximum number of windows that any of the supported hardware + * can use. Since the platform data uses this for an array size, having it + * set to the maximum of any version of the hardware can do is safe. + */ +#define S3C_FB_MAX_WIN	(5) + +/** + * struct s3c_fb_pd_win - per window setup data + * @xres     : The window X size. + * @yres     : The window Y size. + * @virtual_x: The virtual X size. + * @virtual_y: The virtual Y size. + */ +struct s3c_fb_pd_win { +	unsigned short		default_bpp; +	unsigned short		max_bpp; +	unsigned short		xres; +	unsigned short		yres; +	unsigned short		virtual_x; +	unsigned short		virtual_y; +}; + +/** + * struct s3c_fb_platdata -  S3C driver platform specific information + * @setup_gpio: Setup the external GPIO pins to the right state to transfer + *		the data from the display system to the connected display + *		device. + * @vidcon0: The base vidcon0 values to control the panel data format. + * @vidcon1: The base vidcon1 values to control the panel data output. + * @vtiming: Video timing when connected to a RGB type panel. + * @win: The setup data for each hardware window, or NULL for unused. + * @display_mode: The LCD output display mode. + * + * The platform data supplies the video driver with all the information + * it requires to work with the display(s) attached to the machine. It + * controls the initial mode, the number of display windows (0 is always + * the base framebuffer) that are initialised etc. + * + */ +struct s3c_fb_platdata { +	void	(*setup_gpio)(void); + +	struct s3c_fb_pd_win	*win[S3C_FB_MAX_WIN]; +	struct fb_videomode     *vtiming; + +	u32			 vidcon0; +	u32			 vidcon1; +}; + +#endif diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index a9ded9a3c17..9abf1db6aea 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -20,12 +20,12 @@  struct mfd_cell;  struct platform_device { -	const char	* name; +	const char	*name;  	int		id;  	bool		id_auto;  	struct device	dev;  	u32		num_resources; -	struct resource	* resource; +	struct resource	*resource;  	const struct platform_device_id	*id_entry; @@ -47,9 +47,12 @@ extern struct bus_type platform_bus_type;  extern struct device platform_bus;  extern void arch_setup_pdev_archdata(struct platform_device *); -extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int); +extern struct resource *platform_get_resource(struct platform_device *, +					      unsigned int, unsigned int);  extern int platform_get_irq(struct platform_device *, unsigned int); -extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *); +extern struct resource *platform_get_resource_byname(struct platform_device *, +						     unsigned int, +						     const char *);  extern int platform_get_irq_byname(struct platform_device *, const char *);  extern int platform_add_devices(struct platform_device **, int); @@ -161,7 +164,8 @@ extern struct platform_device *platform_device_alloc(const char *name, int id);  extern int platform_device_add_resources(struct platform_device *pdev,  					 const struct resource *res,  					 unsigned int num); -extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size); +extern int platform_device_add_data(struct platform_device *pdev, +				    const void *data, size_t size);  extern int platform_device_add(struct platform_device *pdev);  extern void platform_device_del(struct platform_device *pdev);  extern void platform_device_put(struct platform_device *pdev); @@ -190,7 +194,8 @@ static inline void *platform_get_drvdata(const struct platform_device *pdev)  	return dev_get_drvdata(&pdev->dev);  } -static inline void platform_set_drvdata(struct platform_device *pdev, void *data) +static inline void platform_set_drvdata(struct platform_device *pdev, +					void *data)  {  	dev_set_drvdata(&pdev->dev, data);  } @@ -204,10 +209,28 @@ static inline void platform_set_drvdata(struct platform_device *pdev, void *data  	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 *), -					struct resource *res, unsigned int n_res, -					const void *data, size_t size); +/* module_platform_driver_probe() - 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() + */ +#define module_platform_driver_probe(__platform_driver, __platform_probe) \ +static int __init __platform_driver##_init(void) \ +{ \ +	return platform_driver_probe(&(__platform_driver), \ +				     __platform_probe);    \ +} \ +module_init(__platform_driver##_init); \ +static void __exit __platform_driver##_exit(void) \ +{ \ +	platform_driver_unregister(&(__platform_driver)); \ +} \ +module_exit(__platform_driver##_exit); + +extern struct platform_device *platform_create_bundle( +	struct platform_driver *driver, int (*probe)(struct platform_device *), +	struct resource *res, unsigned int n_res, +	const void *data, size_t size);  /* early platform driver interface */  struct early_platform_driver { diff --git a/include/linux/pm.h b/include/linux/pm.h index 03d7bb14531..e5d7230332a 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -31,7 +31,6 @@  /*   * Callbacks for platform drivers to implement.   */ -extern void (*pm_idle)(void);  extern void (*pm_power_off)(void);  extern void (*pm_power_off_prepare)(void); @@ -538,6 +537,7 @@ struct dev_pm_info {  	unsigned int		irq_safe:1;  	unsigned int		use_autosuspend:1;  	unsigned int		timer_autosuspends:1; +	unsigned int		memalloc_noio:1;  	enum rpm_request	request;  	enum rpm_status		runtime_status;  	int			runtime_error; diff --git a/include/linux/pm2301_charger.h b/include/linux/pm2301_charger.h new file mode 100644 index 00000000000..fc3f026922a --- /dev/null +++ b/include/linux/pm2301_charger.h @@ -0,0 +1,61 @@ +/* + * PM2301 charger driver. + * + * Copyright (C) 2012 ST Ericsson Corporation + * + * Contact: Olivier LAUNAY (olivier.launay@stericsson.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. + * + * 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_PM2301_H +#define __LINUX_PM2301_H + +/** + * struct pm2xxx_bm_charger_parameters - Charger specific parameters + * @ac_volt_max:	maximum allowed AC charger voltage in mV + * @ac_curr_max:	maximum allowed AC charger current in mA + */ +struct pm2xxx_bm_charger_parameters { +	int ac_volt_max; +	int ac_curr_max; +}; + +/** + * struct pm2xxx_bm_data - pm2xxx battery management data + * @enable_overshoot    flag to enable VBAT overshoot control + * @chg_params	  charger parameters + */ +struct pm2xxx_bm_data { +	bool enable_overshoot; +	const struct pm2xxx_bm_charger_parameters *chg_params; +}; + +struct pm2xxx_charger_platform_data { +	char **supplied_to; +	size_t num_supplicants; +	int i2c_bus; +	const char *label; +	int irq_number; +	unsigned int lpn_gpio; +	int irq_type; +}; + +struct pm2xxx_platform_data { +	struct pm2xxx_charger_platform_data *wall_charger; +	struct pm2xxx_bm_data *battery; +}; + +#endif /* __LINUX_PM2301_H */ diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index f271860c78d..7d7e09efff9 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -47,6 +47,7 @@ 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); +extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);  static inline bool pm_children_suspended(struct device *dev)  { @@ -80,6 +81,12 @@ static inline bool pm_runtime_suspended(struct device *dev)  		&& !dev->power.disable_depth;  } +static inline bool pm_runtime_active(struct device *dev) +{ +	return dev->power.runtime_status == RPM_ACTIVE +		|| dev->power.disable_depth; +} +  static inline bool pm_runtime_status_suspended(struct device *dev)  {  	return dev->power.runtime_status == RPM_SUSPENDED; @@ -132,6 +139,7 @@ static inline void pm_runtime_put_noidle(struct device *dev) {}  static inline bool device_run_wake(struct device *dev) { return false; }  static inline void device_set_run_wake(struct device *dev, bool enable) {}  static inline bool pm_runtime_suspended(struct device *dev) { return false; } +static inline bool pm_runtime_active(struct device *dev) { return true; }  static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }  static inline bool pm_runtime_enabled(struct device *dev) { return false; } @@ -149,6 +157,8 @@ static inline void pm_runtime_set_autosuspend_delay(struct device *dev,  						int delay) {}  static inline unsigned long pm_runtime_autosuspend_expiration(  				struct device *dev) { return 0; } +static inline void pm_runtime_set_memalloc_noio(struct device *dev, +						bool enable){}  #endif /* !CONFIG_PM_RUNTIME */ diff --git a/include/linux/power/bq2415x_charger.h b/include/linux/power/bq2415x_charger.h index 97a1665eaea..8dcc0f46fc0 100644 --- a/include/linux/power/bq2415x_charger.h +++ b/include/linux/power/bq2415x_charger.h @@ -75,7 +75,8 @@  /* Supported modes with maximal current limit */  enum bq2415x_mode { -	BQ2415X_MODE_NONE,		/* unknown or no charger (100mA) */ +	BQ2415X_MODE_OFF,		/* offline mode (charger disabled) */ +	BQ2415X_MODE_NONE,		/* unknown charger (100mA) */  	BQ2415X_MODE_HOST_CHARGER,	/* usb host/hub charger (500mA) */  	BQ2415X_MODE_DEDICATED_CHARGER, /* dedicated charger (unlimited) */  	BQ2415X_MODE_BOOST,		/* boost mode (charging disabled) */ diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 1f0ab90aff0..002a99f9633 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -54,6 +54,8 @@ enum {  	POWER_SUPPLY_HEALTH_OVERVOLTAGE,  	POWER_SUPPLY_HEALTH_UNSPEC_FAILURE,  	POWER_SUPPLY_HEALTH_COLD, +	POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE, +	POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE,  };  enum { @@ -224,7 +226,7 @@ struct power_supply_info {  	int use_for_apm;  }; -extern struct power_supply *power_supply_get_by_name(char *name); +extern struct power_supply *power_supply_get_by_name(const char *name);  extern void power_supply_changed(struct power_supply *psy);  extern int power_supply_am_i_supplied(struct power_supply *psy);  extern int power_supply_set_battery_charged(struct power_supply *psy); diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h index 0cc45ae1afd..7db3eb93a07 100644 --- a/include/linux/pps_kernel.h +++ b/include/linux/pps_kernel.h @@ -43,7 +43,7 @@ struct pps_source_info {  			int event, void *data);	/* PPS echo function */  	struct module *owner; -	struct device *dev; +	struct device *dev;		/* Parent device for device_create */  };  struct pps_event_time { @@ -69,6 +69,7 @@ struct pps_device {  	wait_queue_head_t queue;		/* PPS event queue */  	unsigned int id;			/* PPS source unique ID */ +	void const *lookup_cookie;		/* pps_lookup_dev only */  	struct cdev cdev;  	struct device *dev;  	struct fasync_struct *async_queue;	/* fasync method */ @@ -82,16 +83,26 @@ struct pps_device {  extern struct device_attribute pps_attrs[];  /* + * Internal functions. + * + * These are not actually part of the exported API, but this is a + * convenient header file to put them in. + */ + +extern int pps_register_cdev(struct pps_device *pps); +extern void pps_unregister_cdev(struct pps_device *pps); + +/*   * Exported functions   */  extern struct pps_device *pps_register_source(  		struct pps_source_info *info, int default_params);  extern void pps_unregister_source(struct pps_device *pps); -extern int pps_register_cdev(struct pps_device *pps); -extern void pps_unregister_cdev(struct pps_device *pps);  extern void pps_event(struct pps_device *pps,  		struct pps_event_time *ts, int event, void *data); +/* Look up a pps device by magic cookie */ +struct pps_device *pps_lookup_dev(void const *cookie);  static inline void timespec_to_pps_ktime(struct pps_ktime *kt,  		struct timespec ts) diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 5a710b9c578..87a03c746f1 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -93,14 +93,20 @@ do { \  #else /* !CONFIG_PREEMPT_COUNT */ -#define preempt_disable()		do { } while (0) -#define sched_preempt_enable_no_resched()	do { } while (0) -#define preempt_enable_no_resched()	do { } while (0) -#define preempt_enable()		do { } while (0) +/* + * Even if we don't have any preemption, we need preempt disable/enable + * to be barriers, so that we don't have things like get_user/put_user + * that can cause faults and scheduling migrate into our preempt-protected + * region. + */ +#define preempt_disable()		barrier() +#define sched_preempt_enable_no_resched()	barrier() +#define preempt_enable_no_resched()	barrier() +#define preempt_enable()		barrier() -#define preempt_disable_notrace()		do { } while (0) -#define preempt_enable_no_resched_notrace()	do { } while (0) -#define preempt_enable_notrace()		do { } while (0) +#define preempt_disable_notrace()		barrier() +#define preempt_enable_no_resched_notrace()	barrier() +#define preempt_enable_notrace()		barrier()  #endif /* CONFIG_PREEMPT_COUNT */ diff --git a/include/linux/printk.h b/include/linux/printk.h index 86c4b629471..822171fcb1c 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -134,6 +134,8 @@ extern int printk_delay_msec;  extern int dmesg_restrict;  extern int kptr_restrict; +extern void wake_up_klogd(void); +  void log_buf_kexec_setup(void);  void __init setup_log_buf(int early);  #else @@ -162,6 +164,10 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies,  	return false;  } +static inline void wake_up_klogd(void) +{ +} +  static inline void log_buf_kexec_setup(void)  {  } @@ -252,6 +258,15 @@ extern void dump_stack(void) __cold;  	printk_once(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)  #define pr_cont_once(fmt, ...)					\  	printk_once(KERN_CONT pr_fmt(fmt), ##__VA_ARGS__) + +#if defined(DEBUG) +#define pr_devel_once(fmt, ...)					\ +	printk_once(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#else +#define pr_devel_once(fmt, ...)					\ +	no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#endif +  /* If you are writing a driver, please use dev_dbg instead */  #if defined(DEBUG)  #define pr_debug_once(fmt, ...)					\ @@ -295,6 +310,15 @@ extern void dump_stack(void) __cold;  #define pr_info_ratelimited(fmt, ...)					\  	printk_ratelimited(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)  /* no pr_cont_ratelimited, don't do that... */ + +#if defined(DEBUG) +#define pr_devel_ratelimited(fmt, ...)					\ +	printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#else +#define pr_devel_ratelimited(fmt, ...)					\ +	no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#endif +  /* If you are writing a driver, please use dev_dbg instead */  #if defined(DEBUG)  #define pr_debug_ratelimited(fmt, ...)					\ @@ -318,8 +342,13 @@ extern void hex_dump_to_buffer(const void *buf, size_t len,  extern void print_hex_dump(const char *level, const char *prefix_str,  			   int prefix_type, int rowsize, int groupsize,  			   const void *buf, size_t len, bool ascii); +#if defined(CONFIG_DYNAMIC_DEBUG) +#define print_hex_dump_bytes(prefix_str, prefix_type, buf, len)	\ +	dynamic_hex_dump(prefix_str, prefix_type, 16, 1, buf, len, true) +#else  extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type,  				 const void *buf, size_t len); +#endif /* defined(CONFIG_DYNAMIC_DEBUG) */  #else  static inline void print_hex_dump(const char *level, const char *prefix_str,  				  int prefix_type, int rowsize, int groupsize, @@ -333,4 +362,16 @@ static inline void print_hex_dump_bytes(const char *prefix_str, int prefix_type,  #endif +#if defined(CONFIG_DYNAMIC_DEBUG) +#define print_hex_dump_debug(prefix_str, prefix_type, rowsize,	\ +			     groupsize, buf, len, ascii)	\ +	dynamic_hex_dump(prefix_str, prefix_type, rowsize,	\ +			 groupsize, buf, len, ascii) +#else +#define print_hex_dump_debug(prefix_str, prefix_type, rowsize,		\ +			     groupsize, buf, len, ascii)		\ +	print_hex_dump(KERN_DEBUG, prefix_str, prefix_type, rowsize,	\ +		       groupsize, buf, len, ascii) +#endif /* defined(CONFIG_DYNAMIC_DEBUG) */ +  #endif diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 32676b35d2f..94dfb2aa553 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -117,6 +117,7 @@ struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,  				const struct file_operations *proc_fops,  				void *data);  extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent); +extern int remove_proc_subtree(const char *name, struct proc_dir_entry *parent);  struct pid_namespace; @@ -127,7 +128,12 @@ extern void pid_ns_release_proc(struct pid_namespace *ns);   * proc_tty.c   */  struct tty_driver; +#ifdef CONFIG_TTY  extern void proc_tty_init(void); +#else +static inline void proc_tty_init(void) +{ } +#endif  extern void proc_tty_register_driver(struct tty_driver *driver);  extern void proc_tty_unregister_driver(struct tty_driver *driver); @@ -171,9 +177,6 @@ static inline struct proc_dir_entry *create_proc_read_entry(const char *name,  	return res;  } -extern struct proc_dir_entry *proc_net_fops_create(struct net *net, -	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); @@ -184,21 +187,15 @@ extern int proc_alloc_inum(unsigned int *pino);  extern void proc_free_inum(unsigned int inum);  #else -#define proc_net_fops_create(net, name, mode, fops)  ({ (void)(mode), NULL; }) -static inline void proc_net_remove(struct net *net, const char *name) {} -  static inline void proc_flush_task(struct task_struct *task)  {  }  static inline struct proc_dir_entry *create_proc_entry(const char *name,  	umode_t mode, struct proc_dir_entry *parent) { return NULL; } -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 NULL; -} + +#define proc_create(name, mode, parent, fops)  ({ (void)(mode), NULL; }) +  static inline struct proc_dir_entry *proc_create_data(const char *name,  	umode_t mode, struct proc_dir_entry *parent,  	const struct file_operations *proc_fops, void *data) @@ -206,6 +203,7 @@ static inline struct proc_dir_entry *proc_create_data(const char *name,  	return NULL;  }  #define remove_proc_entry(name, parent) do {} while (0) +#define remove_proc_subtree(name, parent) do {} while (0)  static inline struct proc_dir_entry *proc_symlink(const char *name,  		struct proc_dir_entry *parent,const char *dest) {return NULL;} diff --git a/include/linux/pstore.h b/include/linux/pstore.h index 1788909d9a9..75d01760c91 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h @@ -68,12 +68,18 @@ struct pstore_info {  #ifdef CONFIG_PSTORE  extern int pstore_register(struct pstore_info *); +extern bool pstore_cannot_block_path(enum kmsg_dump_reason reason);  #else  static inline int  pstore_register(struct pstore_info *psi)  {  	return -ENODEV;  } +static inline bool +pstore_cannot_block_path(enum kmsg_dump_reason reason) +{ +	return false; +}  #endif  #endif /*_LINUX_PSTORE_H*/ diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 6d661f32e0e..a4df2042b79 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -146,6 +146,8 @@ struct pwm_ops {   * @base: number of first PWM controlled by this chip   * @npwm: number of PWMs controlled by this chip   * @pwms: array of PWM devices allocated by the framework + * @can_sleep: must be true if the .config(), .enable() or .disable() + *             operations may sleep   */  struct pwm_chip {  	struct device		*dev; @@ -159,6 +161,7 @@ struct pwm_chip {  	struct pwm_device *	(*of_xlate)(struct pwm_chip *pc,  					    const struct of_phandle_args *args);  	unsigned int		of_pwm_n_cells; +	bool			can_sleep;  };  #if IS_ENABLED(CONFIG_PWM) @@ -174,11 +177,16 @@ struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,  struct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc,  		const struct of_phandle_args *args); -struct pwm_device *pwm_get(struct device *dev, const char *consumer); +struct pwm_device *pwm_get(struct device *dev, const char *con_id); +struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id);  void pwm_put(struct pwm_device *pwm); -struct pwm_device *devm_pwm_get(struct device *dev, const char *consumer); +struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); +struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, +				   const char *con_id);  void devm_pwm_put(struct device *dev, struct pwm_device *pwm); + +bool pwm_can_sleep(struct pwm_device *pwm);  #else  static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data)  { @@ -213,6 +221,12 @@ static inline struct pwm_device *pwm_get(struct device *dev,  	return ERR_PTR(-ENODEV);  } +static inline struct pwm_device *of_pwm_get(struct device_node *np, +					    const char *con_id) +{ +	return ERR_PTR(-ENODEV); +} +  static inline void pwm_put(struct pwm_device *pwm)  {  } @@ -223,9 +237,21 @@ static inline struct pwm_device *devm_pwm_get(struct device *dev,  	return ERR_PTR(-ENODEV);  } +static inline struct pwm_device *devm_of_pwm_get(struct device *dev, +						 struct device_node *np, +						 const char *con_id) +{ +	return ERR_PTR(-ENODEV); +} +  static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm)  {  } + +static inline bool pwm_can_sleep(struct pwm_device *pwm) +{ +	return false; +}  #endif  struct pwm_lookup { diff --git a/include/linux/pxa2xx_ssp.h b/include/linux/pxa2xx_ssp.h index f36632061c6..467cc6307b6 100644 --- a/include/linux/pxa2xx_ssp.h +++ b/include/linux/pxa2xx_ssp.h @@ -155,6 +155,14 @@  #define SSACD_ACDS(x)		((x) << 0)	/* Audio clock divider select */  #define SSACD_SCDX8		(1 << 7)	/* SYSCLK division ratio select */ +/* LPSS SSP */ +#define SSITF			0x44		/* TX FIFO trigger level */ +#define SSITF_TxLoThresh(x)	(((x) - 1) << 8) +#define SSITF_TxHiThresh(x)	((x) - 1) + +#define SSIRF			0x48		/* RX FIFO trigger level */ +#define SSIRF_RxThresh(x)	((x) - 1) +  enum pxa_ssp_type {  	SSP_UNDEFINED = 0,  	PXA25x_SSP,  /* pxa 210, 250, 255, 26x */ @@ -164,6 +172,7 @@ enum pxa_ssp_type {  	PXA168_SSP,  	PXA910_SSP,  	CE4100_SSP, +	LPSS_SSP,  };  struct ssp_device { @@ -206,6 +215,15 @@ static inline u32 pxa_ssp_read_reg(struct ssp_device *dev, u32 reg)  	return __raw_readl(dev->mmio_base + reg);  } +#ifdef CONFIG_ARCH_PXA  struct ssp_device *pxa_ssp_request(int port, const char *label);  void pxa_ssp_free(struct ssp_device *); +#else +static inline struct ssp_device *pxa_ssp_request(int port, const char *label) +{ +	return NULL; +} +static inline void pxa_ssp_free(struct ssp_device *ssp) {} +#endif +  #endif diff --git a/include/linux/quota.h b/include/linux/quota.h index 58fdef12525..d13371134c5 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -405,6 +405,7 @@ struct quota_module_name {  #define INIT_QUOTA_MODULE_NAMES {\  	{QFMT_VFS_OLD, "quota_v1"},\  	{QFMT_VFS_V0, "quota_v2"},\ +	{QFMT_VFS_V1, "quota_v2"},\  	{0, NULL}}  #endif /* _QUOTA_ */ diff --git a/include/linux/random.h b/include/linux/random.h index d9846088c2c..347ce553a30 100644 --- a/include/linux/random.h +++ b/include/linux/random.h @@ -74,4 +74,10 @@ static inline int arch_get_random_int(unsigned int *v)  }  #endif +/* Pseudo random number generator from numerical recipes. */ +static inline u32 next_pseudo_random32(u32 seed) +{ +	return seed * 1664525 + 1013904223; +} +  #endif /* _LINUX_RANDOM_H */ diff --git a/include/linux/rculist.h b/include/linux/rculist.h index c92dd28eaa6..8089e35d47a 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -445,8 +445,7 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,  /**   * hlist_for_each_entry_rcu - iterate over rcu list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   * @@ -454,16 +453,16 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,   * the _rcu list-mutation primitives such as hlist_add_head_rcu()   * as long as the traversal is guarded by rcu_read_lock().   */ -#define hlist_for_each_entry_rcu(tpos, pos, head, member)		\ -	for (pos = rcu_dereference_raw(hlist_first_rcu(head));		\ -		pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference_raw(hlist_next_rcu(pos))) +#define hlist_for_each_entry_rcu(pos, head, member)			\ +	for (pos = hlist_entry_safe (rcu_dereference_raw(hlist_first_rcu(head)),\ +			typeof(*(pos)), member);			\ +		pos;							\ +		pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(\ +			&(pos)->member)), typeof(*(pos)), member))  /**   * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   * @@ -471,35 +470,36 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,   * the _rcu list-mutation primitives such as hlist_add_head_rcu()   * as long as the traversal is guarded by rcu_read_lock().   */ -#define hlist_for_each_entry_rcu_bh(tpos, pos, head, member)		 \ -	for (pos = rcu_dereference_bh((head)->first);			 \ -		pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference_bh(pos->next)) +#define hlist_for_each_entry_rcu_bh(pos, head, member)			\ +	for (pos = hlist_entry_safe(rcu_dereference_bh(hlist_first_rcu(head)),\ +			typeof(*(pos)), member);			\ +		pos;							\ +		pos = hlist_entry_safe(rcu_dereference_bh(hlist_next_rcu(\ +			&(pos)->member)), typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue_rcu - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue_rcu(tpos, pos, member)		\ -	for (pos = rcu_dereference((pos)->next);			\ -	     pos &&							\ -	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ -	     pos = rcu_dereference(pos->next)) +#define hlist_for_each_entry_continue_rcu(pos, member)			\ +	for (pos = hlist_entry_safe(rcu_dereference((pos)->member.next),\ +			typeof(*(pos)), member);			\ +	     pos;							\ +	     pos = hlist_entry_safe(rcu_dereference((pos)->member.next),\ +			typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue_rcu_bh - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue_rcu_bh(tpos, pos, member)		\ -	for (pos = rcu_dereference_bh((pos)->next);			\ -	     pos &&							\ -	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ -	     pos = rcu_dereference_bh(pos->next)) +#define hlist_for_each_entry_continue_rcu_bh(pos, member)		\ +	for (pos = hlist_entry_safe(rcu_dereference_bh((pos)->member.next),\ +			typeof(*(pos)), member);			\ +	     pos;							\ +	     pos = hlist_entry_safe(rcu_dereference_bh((pos)->member.next),\ +			typeof(*(pos)), member))  #endif	/* __KERNEL__ */ diff --git a/include/linux/regmap.h b/include/linux/regmap.h index b7e95bf942c..bf77dfdabef 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -28,7 +28,8 @@ struct regmap_range_cfg;  enum regcache_type {  	REGCACHE_NONE,  	REGCACHE_RBTREE, -	REGCACHE_COMPRESSED +	REGCACHE_COMPRESSED, +	REGCACHE_FLAT,  };  /** @@ -127,7 +128,18 @@ typedef void (*regmap_unlock)(void *);   * @lock_arg:	  this field is passed as the only argument of lock/unlock   *		  functions (ignored in case regular lock/unlock functions   *		  are not overridden). - * + * @reg_read:	  Optional callback that if filled will be used to perform + *           	  all the reads from the registers. Should only be provided for + *		  devices whos read operation cannot be represented as a simple read + *		  operation on a bus such as SPI, I2C, etc. Most of the devices do + * 		  not need this. + * @reg_write:	  Same as above for writing. + * @fast_io:	  Register IO is fast. Use a spinlock instead of a mutex + *	     	  to perform locking. This field is ignored if custom lock/unlock + *	     	  functions are used (see fields lock/unlock of struct regmap_config). + *		  This field is a duplicate of a similar file in + *		  'struct regmap_bus' and serves exact same purpose. + *		   Use it only for "no-bus" cases.   * @max_register: Optional, specifies the maximum valid register index.   * @wr_table:     Optional, points to a struct regmap_access_table specifying   *                valid ranges for write access. @@ -177,6 +189,11 @@ struct regmap_config {  	regmap_unlock unlock;  	void *lock_arg; +	int (*reg_read)(void *context, unsigned int reg, unsigned int *val); +	int (*reg_write)(void *context, unsigned int reg, unsigned int val); + +	bool fast_io; +  	unsigned int max_register;  	const struct regmap_access_table *wr_table;  	const struct regmap_access_table *rd_table; @@ -235,14 +252,21 @@ struct regmap_range_cfg {  	unsigned int window_len;  }; +struct regmap_async; +  typedef int (*regmap_hw_write)(void *context, const void *data,  			       size_t count);  typedef int (*regmap_hw_gather_write)(void *context,  				      const void *reg, size_t reg_len,  				      const void *val, size_t val_len); +typedef int (*regmap_hw_async_write)(void *context, +				     const void *reg, size_t reg_len, +				     const void *val, size_t val_len, +				     struct regmap_async *async);  typedef int (*regmap_hw_read)(void *context,  			      const void *reg_buf, size_t reg_size,  			      void *val_buf, size_t val_size); +typedef struct regmap_async *(*regmap_hw_async_alloc)(void);  typedef void (*regmap_hw_free_context)(void *context);  /** @@ -255,8 +279,11 @@ typedef void (*regmap_hw_free_context)(void *context);   * @write: Write operation.   * @gather_write: Write operation with split register/value, return -ENOTSUPP   *                if not implemented  on a given device. + * @async_write: Write operation which completes asynchronously, optional and + *               must serialise with respect to non-async I/O.   * @read: Read operation.  Data is returned in the buffer used to transmit   *         data. + * @async_alloc: Allocate a regmap_async() structure.   * @read_flag_mask: Mask to be set in the top byte of the register when doing   *                  a read.   * @reg_format_endian_default: Default endianness for formatted register @@ -265,13 +292,16 @@ typedef void (*regmap_hw_free_context)(void *context);   * @val_format_endian_default: Default endianness for formatted register   *     values. Used when the regmap_config specifies DEFAULT. If this is   *     DEFAULT, BIG is assumed. + * @async_size: Size of struct used for async work.   */  struct regmap_bus {  	bool fast_io;  	regmap_hw_write write;  	regmap_hw_gather_write gather_write; +	regmap_hw_async_write async_write;  	regmap_hw_read read;  	regmap_hw_free_context free_context; +	regmap_hw_async_alloc async_alloc;  	u8 read_flag_mask;  	enum regmap_endian reg_format_endian_default;  	enum regmap_endian val_format_endian_default; @@ -285,9 +315,9 @@ struct regmap *regmap_init_i2c(struct i2c_client *i2c,  			       const struct regmap_config *config);  struct regmap *regmap_init_spi(struct spi_device *dev,  			       const struct regmap_config *config); -struct regmap *regmap_init_mmio(struct device *dev, -				void __iomem *regs, -				const struct regmap_config *config); +struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id, +				    void __iomem *regs, +				    const struct regmap_config *config);  struct regmap *devm_regmap_init(struct device *dev,  				const struct regmap_bus *bus, @@ -297,9 +327,44 @@ struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,  				    const struct regmap_config *config);  struct regmap *devm_regmap_init_spi(struct spi_device *dev,  				    const struct regmap_config *config); -struct regmap *devm_regmap_init_mmio(struct device *dev, -				     void __iomem *regs, -				     const struct regmap_config *config); +struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id, +					 void __iomem *regs, +					 const struct regmap_config *config); + +/** + * regmap_init_mmio(): Initialise register map + * + * @dev: Device that will be interacted with + * @regs: Pointer to memory-mapped IO region + * @config: Configuration for register map + * + * The return value will be an ERR_PTR() on error or a valid pointer to + * a struct regmap. + */ +static inline struct regmap *regmap_init_mmio(struct device *dev, +					void __iomem *regs, +					const struct regmap_config *config) +{ +	return regmap_init_mmio_clk(dev, NULL, regs, config); +} + +/** + * devm_regmap_init_mmio(): Initialise managed register map + * + * @dev: Device that will be interacted with + * @regs: Pointer to memory-mapped IO region + * @config: Configuration for register map + * + * The return value will be an ERR_PTR() on error or a valid pointer + * to a struct regmap.  The regmap will be automatically freed by the + * device management code. + */ +static inline struct regmap *devm_regmap_init_mmio(struct device *dev, +					void __iomem *regs, +					const struct regmap_config *config) +{ +	return devm_regmap_init_mmio_clk(dev, NULL, regs, config); +}  void regmap_exit(struct regmap *map);  int regmap_reinit_cache(struct regmap *map, @@ -310,6 +375,8 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,  		     const void *val, size_t val_len);  int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,  			size_t val_count); +int regmap_raw_write_async(struct regmap *map, unsigned int reg, +			   const void *val, size_t val_len);  int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);  int regmap_raw_read(struct regmap *map, unsigned int reg,  		    void *val, size_t val_len); @@ -321,6 +388,7 @@ int regmap_update_bits_check(struct regmap *map, unsigned int reg,  			     unsigned int mask, unsigned int val,  			     bool *change);  int regmap_get_val_bytes(struct regmap *map); +int regmap_async_complete(struct regmap *map);  int regcache_sync(struct regmap *map);  int regcache_sync_region(struct regmap *map, unsigned int min, @@ -381,6 +449,7 @@ struct regmap_irq_chip {  	unsigned int wake_base;  	unsigned int irq_reg_stride;  	unsigned int mask_invert; +	unsigned int wake_invert;  	bool runtime_pm;  	int num_regs; @@ -422,6 +491,13 @@ static inline int regmap_raw_write(struct regmap *map, unsigned int reg,  	return -EINVAL;  } +static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg, +					 const void *val, size_t val_len) +{ +	WARN_ONCE(1, "regmap API is disabled"); +	return -EINVAL; +} +  static inline int regmap_bulk_write(struct regmap *map, unsigned int reg,  				    const void *val, size_t val_count)  { @@ -500,6 +576,11 @@ static inline void regcache_mark_dirty(struct regmap *map)  	WARN_ONCE(1, "regmap API is disabled");  } +static inline void regmap_async_complete(struct regmap *map) +{ +	WARN_ONCE(1, "regmap API is disabled"); +} +  static inline int regmap_register_patch(struct regmap *map,  					const struct reg_default *regs,  					int num_regs) diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index d10bb0f39c5..7df93f52db0 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -193,8 +193,14 @@ enum regulator_type {   *   * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_   * @vsel_mask: Mask for register bitfield used for selector + * @apply_reg: Register for initiate voltage change on the output when + *                using regulator_set_voltage_sel_regmap + * @apply_bit: Register bitfield used for initiate voltage change on the + *                output when using regulator_set_voltage_sel_regmap   * @enable_reg: Register for control when using regmap enable/disable ops   * @enable_mask: Mask for control when using regmap enable/disable ops + * @bypass_reg: Register for control when using regmap set_bypass + * @bypass_mask: Mask for control when using regmap set_bypass   *   * @enable_time: Time taken for initial enable of regulator (in uS).   */ @@ -218,6 +224,8 @@ struct regulator_desc {  	unsigned int vsel_reg;  	unsigned int vsel_mask; +	unsigned int apply_reg; +	unsigned int apply_bit;  	unsigned int enable_reg;  	unsigned int enable_mask;  	unsigned int bypass_reg; diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h index 5ae8456d967..c23099413ad 100644 --- a/include/linux/res_counter.h +++ b/include/linux/res_counter.h @@ -14,6 +14,7 @@   */  #include <linux/cgroup.h> +#include <linux/errno.h>  /*   * The core object. the cgroup that wishes to account for some diff --git a/include/linux/rmap.h b/include/linux/rmap.h index c20635c527a..6dacb93a6d9 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h @@ -123,7 +123,7 @@ static inline void anon_vma_lock_write(struct anon_vma *anon_vma)  	down_write(&anon_vma->root->rwsem);  } -static inline void anon_vma_unlock(struct anon_vma *anon_vma) +static inline void anon_vma_unlock_write(struct anon_vma *anon_vma)  {  	up_write(&anon_vma->root->rwsem);  } diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 11d05f9fe8b..580b24c8b8c 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -149,7 +149,7 @@ extern int rtc_initialize_alarm(struct rtc_device *rtc,  extern void rtc_update_irq(struct rtc_device *rtc,  			unsigned long num, unsigned long events); -extern struct rtc_device *rtc_class_open(char *name); +extern struct rtc_device *rtc_class_open(const char *name);  extern void rtc_class_close(struct rtc_device *rtc);  extern int rtc_irq_register(struct rtc_device *rtc, diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 4bd6c06eb28..2d8bdaef961 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -231,6 +231,41 @@ size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,   */  #define SG_MAX_SINGLE_ALLOC		(PAGE_SIZE / sizeof(struct scatterlist)) +/* + * sg page iterator + * + * Iterates over sg entries page-by-page.  On each successful iteration, + * @piter->page points to the current page, @piter->sg to the sg holding this + * page and @piter->sg_pgoffset to the page's page offset within the sg. The + * iteration will stop either when a maximum number of sg entries was reached + * or a terminating sg (sg_last(sg) == true) was reached. + */ +struct sg_page_iter { +	struct page		*page;		/* current page */ +	struct scatterlist	*sg;		/* sg holding the page */ +	unsigned int		sg_pgoffset;	/* page offset within the sg */ + +	/* these are internal states, keep away */ +	unsigned int		__nents;	/* remaining sg entries */ +	int			__pg_advance;	/* nr pages to advance at the +						 * next step */ +}; + +bool __sg_page_iter_next(struct sg_page_iter *piter); +void __sg_page_iter_start(struct sg_page_iter *piter, +			  struct scatterlist *sglist, unsigned int nents, +			  unsigned long pgoffset); + +/** + * for_each_sg_page - iterate over the pages of the given sg list + * @sglist:	sglist to iterate over + * @piter:	page iterator to hold current page, sg, sg_pgoffset + * @nents:	maximum number of sg entries to iterate over + * @pgoffset:	starting page offset + */ +#define for_each_sg_page(sglist, piter, nents, pgoffset)		   \ +	for (__sg_page_iter_start((piter), (sglist), (nents), (pgoffset)); \ +	     __sg_page_iter_next(piter);)  /*   * Mapping sg iterator @@ -258,11 +293,11 @@ struct sg_mapping_iter {  	void			*addr;		/* pointer to the mapped area */  	size_t			length;		/* length of the mapped area */  	size_t			consumed;	/* number of consumed bytes */ +	struct sg_page_iter	piter;		/* page iterator */  	/* these are internal states, keep away */ -	struct scatterlist	*__sg;		/* current entry */ -	unsigned int		__nents;	/* nr of remaining entries */ -	unsigned int		__offset;	/* offset within sg */ +	unsigned int		__offset;	/* offset within page */ +	unsigned int		__remaining;	/* remaining bytes on page */  	unsigned int		__flags;  }; diff --git a/include/linux/sched.h b/include/linux/sched.h index 33cc4213037..2d02c76a01b 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -51,6 +51,7 @@ struct sched_param {  #include <linux/cred.h>  #include <linux/llist.h>  #include <linux/uidgid.h> +#include <linux/gfp.h>  #include <asm/processor.h> @@ -98,7 +99,6 @@ extern int nr_threads;  DECLARE_PER_CPU(unsigned long, process_counts);  extern int nr_processes(void);  extern unsigned long nr_running(void); -extern unsigned long nr_uninterruptible(void);  extern unsigned long nr_iowait(void);  extern unsigned long nr_iowait_cpu(int cpu);  extern unsigned long this_cpu_load(void); @@ -163,9 +163,10 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)  #define TASK_DEAD		64  #define TASK_WAKEKILL		128  #define TASK_WAKING		256 -#define TASK_STATE_MAX		512 +#define TASK_PARKED		512 +#define TASK_STATE_MAX		1024 -#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW" +#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP"  extern char ___assert_task_state[1 - 2*!!(  		sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; @@ -320,7 +321,6 @@ extern signed long schedule_timeout_killable(signed long timeout);  extern signed long schedule_timeout_uninterruptible(signed long timeout);  asmlinkage void schedule(void);  extern void schedule_preempt_disabled(void); -extern int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner);  struct nsproxy;  struct user_namespace; @@ -346,11 +346,6 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) {}  extern void set_dumpable(struct mm_struct *mm, int value);  extern int get_dumpable(struct mm_struct *mm); -/* get/set_dumpable() values */ -#define SUID_DUMPABLE_DISABLED	0 -#define SUID_DUMPABLE_ENABLED	1 -#define SUID_DUMPABLE_SAFE	2 -  /* mm flags */  /* dumpable bits */  #define MMF_DUMPABLE      0  /* core dump is permitted */ @@ -1791,6 +1786,7 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,  #define PF_FROZEN	0x00010000	/* frozen for system suspend */  #define PF_FSTRANS	0x00020000	/* inside a filesystem transaction */  #define PF_KSWAPD	0x00040000	/* I am kswapd */ +#define PF_MEMALLOC_NOIO 0x00080000	/* Allocating memory without IO involved */  #define PF_LESS_THROTTLE 0x00100000	/* Throttle me less: I clean memory */  #define PF_KTHREAD	0x00200000	/* I am a kernel thread */  #define PF_RANDOMIZE	0x00400000	/* randomize virtual address space */ @@ -1828,6 +1824,26 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,  #define tsk_used_math(p) ((p)->flags & PF_USED_MATH)  #define used_math() tsk_used_math(current) +/* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags */ +static inline gfp_t memalloc_noio_flags(gfp_t flags) +{ +	if (unlikely(current->flags & PF_MEMALLOC_NOIO)) +		flags &= ~__GFP_IO; +	return flags; +} + +static inline unsigned int memalloc_noio_save(void) +{ +	unsigned int flags = current->flags & PF_MEMALLOC_NOIO; +	current->flags |= PF_MEMALLOC_NOIO; +	return flags; +} + +static inline void memalloc_noio_restore(unsigned int flags) +{ +	current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; +} +  /*   * task->jobctl flags   */ @@ -2160,7 +2176,6 @@ extern struct sigqueue *sigqueue_alloc(void);  extern void sigqueue_free(struct sigqueue *);  extern int send_sigqueue(struct sigqueue *,  struct task_struct *, int group);  extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); -extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long);  static inline void restore_saved_sigmask(void)  { @@ -2206,6 +2221,17 @@ static inline int sas_ss_flags(unsigned long sp)  		: on_sig_stack(sp) ? SS_ONSTACK : 0);  } +static inline unsigned long sigsp(unsigned long sp, struct ksignal *ksig) +{ +	if (unlikely((ksig->ka.sa.sa_flags & SA_ONSTACK)) && ! sas_ss_flags(sp)) +#ifdef CONFIG_STACK_GROWSUP +		return current->sas_ss_sp; +#else +		return current->sas_ss_sp + current->sas_ss_size; +#endif +	return sp; +} +  /*   * Routines for handling mm_structs   */ @@ -2659,7 +2685,10 @@ extern long sched_getaffinity(pid_t pid, struct cpumask *mask);  extern struct task_group root_task_group;  extern struct task_group *sched_create_group(struct task_group *parent); +extern void sched_online_group(struct task_group *tg, +			       struct task_group *parent);  extern void sched_destroy_group(struct task_group *tg); +extern void sched_offline_group(struct task_group *tg);  extern void sched_move_task(struct task_struct *tsk);  #ifdef CONFIG_FAIR_GROUP_SCHED  extern int sched_group_set_shares(struct task_group *tg, unsigned long shares); diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h index 94e19ea28fc..440434df362 100644 --- a/include/linux/sched/rt.h +++ b/include/linux/sched/rt.h @@ -55,4 +55,10 @@ static inline bool tsk_is_pi_blocked(struct task_struct *tsk)  extern void normalize_rt_tasks(void); +/* + * default timeslice is 100 msecs (used only for SCHED_RR tasks). + * Timeslices get refilled after they expire. + */ +#define RR_TIMESLICE		(100 * HZ / 1000) +  #endif /* _SCHED_RT_H */ diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index d2bb0ae979d..bf8086b2506 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -91,12 +91,6 @@ extern unsigned int sysctl_sched_cfs_bandwidth_slice;  extern unsigned int sysctl_sched_autogroup_enabled;  #endif -/* - * default timeslice is 100 msecs (used only for SCHED_RR tasks). - * Timeslices get refilled after they expire. - */ -#define RR_TIMESLICE		(100 * HZ / 1000) -  extern int sched_rr_timeslice;  extern int sched_rr_handler(struct ctl_table *table, int write, diff --git a/include/linux/security.h b/include/linux/security.h index eee7478cda7..032c366ef1c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1012,6 +1012,10 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	This hook can be used by the module to update any security state   *	associated with the TUN device's security structure.   *	@security pointer to the TUN devices's security structure. + * @skb_owned_by: + *	This hook sets the packet's owning sock. + *	@skb is the packet. + *	@sk the sock which owns the packet.   *   * Security hooks for XFRM operations.   * @@ -1638,6 +1642,7 @@ struct security_operations {  	int (*tun_dev_attach_queue) (void *security);  	int (*tun_dev_attach) (struct sock *sk, void *security);  	int (*tun_dev_open) (void *security); +	void (*skb_owned_by) (struct sk_buff *skb, struct sock *sk);  #endif	/* CONFIG_SECURITY_NETWORK */  #ifdef CONFIG_SECURITY_NETWORK_XFRM @@ -2588,6 +2593,8 @@ int security_tun_dev_attach_queue(void *security);  int security_tun_dev_attach(struct sock *sk, void *security);  int security_tun_dev_open(void *security); +void security_skb_owned_by(struct sk_buff *skb, struct sock *sk); +  #else	/* CONFIG_SECURITY_NETWORK */  static inline int security_unix_stream_connect(struct sock *sock,  					       struct sock *other, @@ -2779,6 +2786,11 @@ static inline int security_tun_dev_open(void *security)  {  	return 0;  } + +static inline void security_skb_owned_by(struct sk_buff *skb, struct sock *sk) +{ +} +  #endif	/* CONFIG_SECURITY_NETWORK */  #ifdef CONFIG_SECURITY_NETWORK_XFRM diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index 600060e25ec..18299057402 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h @@ -30,92 +30,12 @@  #include <linux/preempt.h>  #include <asm/processor.h> -typedef struct { -	unsigned sequence; -	spinlock_t lock; -} seqlock_t; - -/* - * These macros triggered gcc-3.x compile-time problems.  We think these are - * OK now.  Be cautious. - */ -#define __SEQLOCK_UNLOCKED(lockname) \ -		 { 0, __SPIN_LOCK_UNLOCKED(lockname) } - -#define seqlock_init(x)					\ -	do {						\ -		(x)->sequence = 0;			\ -		spin_lock_init(&(x)->lock);		\ -	} while (0) - -#define DEFINE_SEQLOCK(x) \ -		seqlock_t x = __SEQLOCK_UNLOCKED(x) - -/* Lock out other writers and update the count. - * Acts like a normal spin_lock/unlock. - * Don't need preempt_disable() because that is in the spin_lock already. - */ -static inline void write_seqlock(seqlock_t *sl) -{ -	spin_lock(&sl->lock); -	++sl->sequence; -	smp_wmb(); -} - -static inline void write_sequnlock(seqlock_t *sl) -{ -	smp_wmb(); -	sl->sequence++; -	spin_unlock(&sl->lock); -} - -static inline int write_tryseqlock(seqlock_t *sl) -{ -	int ret = spin_trylock(&sl->lock); - -	if (ret) { -		++sl->sequence; -		smp_wmb(); -	} -	return ret; -} - -/* Start of read calculation -- fetch last complete writer token */ -static __always_inline unsigned read_seqbegin(const seqlock_t *sl) -{ -	unsigned ret; - -repeat: -	ret = ACCESS_ONCE(sl->sequence); -	if (unlikely(ret & 1)) { -		cpu_relax(); -		goto repeat; -	} -	smp_rmb(); - -	return ret; -} - -/* - * Test if reader processed invalid data. - * - * If sequence value changed then writer changed data while in section. - */ -static __always_inline int read_seqretry(const seqlock_t *sl, unsigned start) -{ -	smp_rmb(); - -	return unlikely(sl->sequence != start); -} - -  /*   * Version using sequence counter only.   * This can be used when code has its own mutex protecting the   * updating starting before the write_seqcountbeqin() and ending   * after the write_seqcount_end().   */ -  typedef struct seqcount {  	unsigned sequence;  } seqcount_t; @@ -218,7 +138,6 @@ static inline int __read_seqcount_retry(const seqcount_t *s, unsigned start)  static inline int read_seqcount_retry(const seqcount_t *s, unsigned start)  {  	smp_rmb(); -  	return __read_seqcount_retry(s, start);  } @@ -252,31 +171,101 @@ static inline void write_seqcount_barrier(seqcount_t *s)  	s->sequence+=2;  } +typedef struct { +	struct seqcount seqcount; +	spinlock_t lock; +} seqlock_t; +  /* - * Possible sw/hw IRQ protected versions of the interfaces. + * These macros triggered gcc-3.x compile-time problems.  We think these are + * OK now.  Be cautious.   */ -#define write_seqlock_irqsave(lock, flags)				\ -	do { local_irq_save(flags); write_seqlock(lock); } while (0) -#define write_seqlock_irq(lock)						\ -	do { local_irq_disable();   write_seqlock(lock); } while (0) -#define write_seqlock_bh(lock)						\ -        do { local_bh_disable();    write_seqlock(lock); } while (0) +#define __SEQLOCK_UNLOCKED(lockname)			\ +	{						\ +		.seqcount = SEQCNT_ZERO,		\ +		.lock =	__SPIN_LOCK_UNLOCKED(lockname)	\ +	} + +#define seqlock_init(x)					\ +	do {						\ +		seqcount_init(&(x)->seqcount);		\ +		spin_lock_init(&(x)->lock);		\ +	} while (0) -#define write_sequnlock_irqrestore(lock, flags)				\ -	do { write_sequnlock(lock); local_irq_restore(flags); } while(0) -#define write_sequnlock_irq(lock)					\ -	do { write_sequnlock(lock); local_irq_enable(); } while(0) -#define write_sequnlock_bh(lock)					\ -	do { write_sequnlock(lock); local_bh_enable(); } while(0) +#define DEFINE_SEQLOCK(x) \ +		seqlock_t x = __SEQLOCK_UNLOCKED(x) -#define read_seqbegin_irqsave(lock, flags)				\ -	({ local_irq_save(flags);   read_seqbegin(lock); }) +/* + * Read side functions for starting and finalizing a read side section. + */ +static inline unsigned read_seqbegin(const seqlock_t *sl) +{ +	return read_seqcount_begin(&sl->seqcount); +} -#define read_seqretry_irqrestore(lock, iv, flags)			\ -	({								\ -		int ret = read_seqretry(lock, iv);			\ -		local_irq_restore(flags);				\ -		ret;							\ -	}) +static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) +{ +	return read_seqcount_retry(&sl->seqcount, start); +} + +/* + * Lock out other writers and update the count. + * Acts like a normal spin_lock/unlock. + * Don't need preempt_disable() because that is in the spin_lock already. + */ +static inline void write_seqlock(seqlock_t *sl) +{ +	spin_lock(&sl->lock); +	write_seqcount_begin(&sl->seqcount); +} + +static inline void write_sequnlock(seqlock_t *sl) +{ +	write_seqcount_end(&sl->seqcount); +	spin_unlock(&sl->lock); +} + +static inline void write_seqlock_bh(seqlock_t *sl) +{ +	spin_lock_bh(&sl->lock); +	write_seqcount_begin(&sl->seqcount); +} + +static inline void write_sequnlock_bh(seqlock_t *sl) +{ +	write_seqcount_end(&sl->seqcount); +	spin_unlock_bh(&sl->lock); +} + +static inline void write_seqlock_irq(seqlock_t *sl) +{ +	spin_lock_irq(&sl->lock); +	write_seqcount_begin(&sl->seqcount); +} + +static inline void write_sequnlock_irq(seqlock_t *sl) +{ +	write_seqcount_end(&sl->seqcount); +	spin_unlock_irq(&sl->lock); +} + +static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) +{ +	unsigned long flags; + +	spin_lock_irqsave(&sl->lock, flags); +	write_seqcount_begin(&sl->seqcount); +	return flags; +} + +#define write_seqlock_irqsave(lock, flags)				\ +	do { flags = __write_seqlock_irqsave(lock); } while (0) + +static inline void +write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) +{ +	write_seqcount_end(&sl->seqcount); +	spin_unlock_irqrestore(&sl->lock, flags); +}  #endif /* __LINUX_SEQLOCK_H */ diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index c490d20b3fb..af47a8af602 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -59,6 +59,8 @@ enum {  	PLAT8250_DEV_SM501,  }; +struct uart_8250_dma; +  /*   * This should be used by drivers which want to register   * their own 8250 ports without registering their own @@ -91,6 +93,8 @@ struct uart_8250_port {  #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA  	unsigned char		msr_saved_flags; +	struct uart_8250_dma	*dma; +  	/* 8250 specific callbacks */  	int			(*dl_read)(struct uart_8250_port *);  	void			(*dl_write)(struct uart_8250_port *, int); diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index c6690a2a27f..87d4bbc773f 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -29,7 +29,6 @@  #include <linux/tty.h>  #include <linux/mutex.h>  #include <linux/sysrq.h> -#include <linux/pps_kernel.h>  #include <uapi/linux/serial_core.h>  struct uart_port; @@ -37,8 +36,8 @@ struct serial_struct;  struct device;  /* - * This structure describes all the operations that can be - * done on the physical hardware. + * This structure describes all the operations that can be done on the + * physical hardware.  See Documentation/serial/driver for details.   */  struct uart_ops {  	unsigned int	(*tx_empty)(struct uart_port *); @@ -65,7 +64,7 @@ struct uart_ops {  	/*  	 * Return a string describing the type of the port  	 */ -	const char *(*type)(struct uart_port *); +	const char	*(*type)(struct uart_port *);  	/*  	 * Release IO and memory resources used by the port. @@ -83,7 +82,7 @@ struct uart_ops {  	int		(*ioctl)(struct uart_port *, unsigned int, unsigned long);  #ifdef CONFIG_CONSOLE_POLL  	int		(*poll_init)(struct uart_port *); -	void	(*poll_put_char)(struct uart_port *, unsigned char); +	void		(*poll_put_char)(struct uart_port *, unsigned char);  	int		(*poll_get_char)(struct uart_port *);  #endif  }; @@ -134,9 +133,8 @@ struct uart_port {  #define UPIO_HUB6		(1)  #define UPIO_MEM		(2)  #define UPIO_MEM32		(3) -#define UPIO_AU			(4)			/* Au1x00 type IO */ +#define UPIO_AU			(4)			/* Au1x00 and RT288x type IO */  #define UPIO_TSI		(5)			/* Tsi108/109 type IO */ -#define UPIO_RM9000		(6)			/* RM9000 type IO */  	unsigned int		read_status_mask;	/* driver specific */  	unsigned int		ignore_status_mask;	/* driver specific */ @@ -208,13 +206,25 @@ static inline void serial_port_out(struct uart_port *up, int offset, int value)  	up->serial_out(up, offset, value);  } +/** + * enum uart_pm_state - power states for UARTs + * @UART_PM_STATE_ON: UART is powered, up and operational + * @UART_PM_STATE_OFF: UART is powered off + * @UART_PM_STATE_UNDEFINED: sentinel + */ +enum uart_pm_state { +	UART_PM_STATE_ON = 0, +	UART_PM_STATE_OFF = 3, /* number taken from ACPI */ +	UART_PM_STATE_UNDEFINED, +}; +  /*   * This is the state information which is persistent across opens.   */  struct uart_state {  	struct tty_port		port; -	int			pm_state; +	enum uart_pm_state	pm_state;  	struct circ_buf		xmit;  	struct uart_port	*uart_port; diff --git a/include/linux/serial_s3c.h b/include/linux/serial_s3c.h new file mode 100644 index 00000000000..907d9d1d56c --- /dev/null +++ b/include/linux/serial_s3c.h @@ -0,0 +1,260 @@ +/* + *  Internal header file for Samsung S3C2410 serial ports (UART0-2) + * + *  Copyright (C) 2002 Shane Nay (shane@minirl.com) + * + *  Additional defines, Copyright 2003 Simtec Electronics (linux@simtec.co.uk) + * + *  Adapted from: + * + *  Internal header file for MX1ADS serial ports (UART1 & 2) + * + *  Copyright (C) 2002 Shane Nay (shane@minirl.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA +*/ + +#ifndef __ASM_ARM_REGS_SERIAL_H +#define __ASM_ARM_REGS_SERIAL_H + +#define S3C2410_URXH	  (0x24) +#define S3C2410_UTXH	  (0x20) +#define S3C2410_ULCON	  (0x00) +#define S3C2410_UCON	  (0x04) +#define S3C2410_UFCON	  (0x08) +#define S3C2410_UMCON	  (0x0C) +#define S3C2410_UBRDIV	  (0x28) +#define S3C2410_UTRSTAT	  (0x10) +#define S3C2410_UERSTAT	  (0x14) +#define S3C2410_UFSTAT	  (0x18) +#define S3C2410_UMSTAT	  (0x1C) + +#define S3C2410_LCON_CFGMASK	  ((0xF<<3)|(0x3)) + +#define S3C2410_LCON_CS5	  (0x0) +#define S3C2410_LCON_CS6	  (0x1) +#define S3C2410_LCON_CS7	  (0x2) +#define S3C2410_LCON_CS8	  (0x3) +#define S3C2410_LCON_CSMASK	  (0x3) + +#define S3C2410_LCON_PNONE	  (0x0) +#define S3C2410_LCON_PEVEN	  (0x5 << 3) +#define S3C2410_LCON_PODD	  (0x4 << 3) +#define S3C2410_LCON_PMASK	  (0x7 << 3) + +#define S3C2410_LCON_STOPB	  (1<<2) +#define S3C2410_LCON_IRM          (1<<6) + +#define S3C2440_UCON_CLKMASK	  (3<<10) +#define S3C2440_UCON_CLKSHIFT	  (10) +#define S3C2440_UCON_PCLK	  (0<<10) +#define S3C2440_UCON_UCLK	  (1<<10) +#define S3C2440_UCON_PCLK2	  (2<<10) +#define S3C2440_UCON_FCLK	  (3<<10) +#define S3C2443_UCON_EPLL	  (3<<10) + +#define S3C6400_UCON_CLKMASK	(3<<10) +#define S3C6400_UCON_CLKSHIFT	(10) +#define S3C6400_UCON_PCLK	(0<<10) +#define S3C6400_UCON_PCLK2	(2<<10) +#define S3C6400_UCON_UCLK0	(1<<10) +#define S3C6400_UCON_UCLK1	(3<<10) + +#define S3C2440_UCON2_FCLK_EN	  (1<<15) +#define S3C2440_UCON0_DIVMASK	  (15 << 12) +#define S3C2440_UCON1_DIVMASK	  (15 << 12) +#define S3C2440_UCON2_DIVMASK	  (7 << 12) +#define S3C2440_UCON_DIVSHIFT	  (12) + +#define S3C2412_UCON_CLKMASK	(3<<10) +#define S3C2412_UCON_CLKSHIFT	(10) +#define S3C2412_UCON_UCLK	(1<<10) +#define S3C2412_UCON_USYSCLK	(3<<10) +#define S3C2412_UCON_PCLK	(0<<10) +#define S3C2412_UCON_PCLK2	(2<<10) + +#define S3C2410_UCON_CLKMASK	(1 << 10) +#define S3C2410_UCON_CLKSHIFT	(10) +#define S3C2410_UCON_UCLK	  (1<<10) +#define S3C2410_UCON_SBREAK	  (1<<4) + +#define S3C2410_UCON_TXILEVEL	  (1<<9) +#define S3C2410_UCON_RXILEVEL	  (1<<8) +#define S3C2410_UCON_TXIRQMODE	  (1<<2) +#define S3C2410_UCON_RXIRQMODE	  (1<<0) +#define S3C2410_UCON_RXFIFO_TOI	  (1<<7) +#define S3C2443_UCON_RXERR_IRQEN  (1<<6) +#define S3C2443_UCON_LOOPBACK	  (1<<5) + +#define S3C2410_UCON_DEFAULT	  (S3C2410_UCON_TXILEVEL  | \ +				   S3C2410_UCON_RXILEVEL  | \ +				   S3C2410_UCON_TXIRQMODE | \ +				   S3C2410_UCON_RXIRQMODE | \ +				   S3C2410_UCON_RXFIFO_TOI) + +#define S3C2410_UFCON_FIFOMODE	  (1<<0) +#define S3C2410_UFCON_TXTRIG0	  (0<<6) +#define S3C2410_UFCON_RXTRIG8	  (1<<4) +#define S3C2410_UFCON_RXTRIG12	  (2<<4) + +/* S3C2440 FIFO trigger levels */ +#define S3C2440_UFCON_RXTRIG1	  (0<<4) +#define S3C2440_UFCON_RXTRIG8	  (1<<4) +#define S3C2440_UFCON_RXTRIG16	  (2<<4) +#define S3C2440_UFCON_RXTRIG32	  (3<<4) + +#define S3C2440_UFCON_TXTRIG0	  (0<<6) +#define S3C2440_UFCON_TXTRIG16	  (1<<6) +#define S3C2440_UFCON_TXTRIG32	  (2<<6) +#define S3C2440_UFCON_TXTRIG48	  (3<<6) + +#define S3C2410_UFCON_RESETBOTH	  (3<<1) +#define S3C2410_UFCON_RESETTX	  (1<<2) +#define S3C2410_UFCON_RESETRX	  (1<<1) + +#define S3C2410_UFCON_DEFAULT	  (S3C2410_UFCON_FIFOMODE | \ +				   S3C2410_UFCON_TXTRIG0  | \ +				   S3C2410_UFCON_RXTRIG8 ) + +#define	S3C2410_UMCOM_AFC	  (1<<4) +#define	S3C2410_UMCOM_RTS_LOW	  (1<<0) + +#define S3C2412_UMCON_AFC_63	(0<<5)		/* same as s3c2443 */ +#define S3C2412_UMCON_AFC_56	(1<<5) +#define S3C2412_UMCON_AFC_48	(2<<5) +#define S3C2412_UMCON_AFC_40	(3<<5) +#define S3C2412_UMCON_AFC_32	(4<<5) +#define S3C2412_UMCON_AFC_24	(5<<5) +#define S3C2412_UMCON_AFC_16	(6<<5) +#define S3C2412_UMCON_AFC_8	(7<<5) + +#define S3C2410_UFSTAT_TXFULL	  (1<<9) +#define S3C2410_UFSTAT_RXFULL	  (1<<8) +#define S3C2410_UFSTAT_TXMASK	  (15<<4) +#define S3C2410_UFSTAT_TXSHIFT	  (4) +#define S3C2410_UFSTAT_RXMASK	  (15<<0) +#define S3C2410_UFSTAT_RXSHIFT	  (0) + +/* UFSTAT S3C2443 same as S3C2440 */ +#define S3C2440_UFSTAT_TXFULL	  (1<<14) +#define S3C2440_UFSTAT_RXFULL	  (1<<6) +#define S3C2440_UFSTAT_TXSHIFT	  (8) +#define S3C2440_UFSTAT_RXSHIFT	  (0) +#define S3C2440_UFSTAT_TXMASK	  (63<<8) +#define S3C2440_UFSTAT_RXMASK	  (63) + +#define S3C2410_UTRSTAT_TXE	  (1<<2) +#define S3C2410_UTRSTAT_TXFE	  (1<<1) +#define S3C2410_UTRSTAT_RXDR	  (1<<0) + +#define S3C2410_UERSTAT_OVERRUN	  (1<<0) +#define S3C2410_UERSTAT_FRAME	  (1<<2) +#define S3C2410_UERSTAT_BREAK	  (1<<3) +#define S3C2443_UERSTAT_PARITY	  (1<<1) + +#define S3C2410_UERSTAT_ANY	  (S3C2410_UERSTAT_OVERRUN | \ +				   S3C2410_UERSTAT_FRAME | \ +				   S3C2410_UERSTAT_BREAK) + +#define S3C2410_UMSTAT_CTS	  (1<<0) +#define S3C2410_UMSTAT_DeltaCTS	  (1<<2) + +#define S3C2443_DIVSLOT		  (0x2C) + +/* S3C64XX interrupt registers. */ +#define S3C64XX_UINTP		0x30 +#define S3C64XX_UINTSP		0x34 +#define S3C64XX_UINTM		0x38 + +#define S3C64XX_UINTM_RXD	(0) +#define S3C64XX_UINTM_TXD	(2) +#define S3C64XX_UINTM_RXD_MSK	(1 << S3C64XX_UINTM_RXD) +#define S3C64XX_UINTM_TXD_MSK	(1 << S3C64XX_UINTM_TXD) + +/* Following are specific to S5PV210 */ +#define S5PV210_UCON_CLKMASK	(1<<10) +#define S5PV210_UCON_CLKSHIFT	(10) +#define S5PV210_UCON_PCLK	(0<<10) +#define S5PV210_UCON_UCLK	(1<<10) + +#define S5PV210_UFCON_TXTRIG0	(0<<8) +#define S5PV210_UFCON_TXTRIG4	(1<<8) +#define S5PV210_UFCON_TXTRIG8	(2<<8) +#define S5PV210_UFCON_TXTRIG16	(3<<8) +#define S5PV210_UFCON_TXTRIG32	(4<<8) +#define S5PV210_UFCON_TXTRIG64	(5<<8) +#define S5PV210_UFCON_TXTRIG128 (6<<8) +#define S5PV210_UFCON_TXTRIG256 (7<<8) + +#define S5PV210_UFCON_RXTRIG1	(0<<4) +#define S5PV210_UFCON_RXTRIG4	(1<<4) +#define S5PV210_UFCON_RXTRIG8	(2<<4) +#define S5PV210_UFCON_RXTRIG16	(3<<4) +#define S5PV210_UFCON_RXTRIG32	(4<<4) +#define S5PV210_UFCON_RXTRIG64	(5<<4) +#define S5PV210_UFCON_RXTRIG128	(6<<4) +#define S5PV210_UFCON_RXTRIG256	(7<<4) + +#define S5PV210_UFSTAT_TXFULL	(1<<24) +#define S5PV210_UFSTAT_RXFULL	(1<<8) +#define S5PV210_UFSTAT_TXMASK	(255<<16) +#define S5PV210_UFSTAT_TXSHIFT	(16) +#define S5PV210_UFSTAT_RXMASK	(255<<0) +#define S5PV210_UFSTAT_RXSHIFT	(0) + +#define S3C2410_UCON_CLKSEL0	(1 << 0) +#define S3C2410_UCON_CLKSEL1	(1 << 1) +#define S3C2410_UCON_CLKSEL2	(1 << 2) +#define S3C2410_UCON_CLKSEL3	(1 << 3) + +/* Default values for s5pv210 UCON and UFCON uart registers */ +#define S5PV210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\ +				 S3C2410_UCON_RXILEVEL |	\ +				 S3C2410_UCON_TXIRQMODE |	\ +				 S3C2410_UCON_RXIRQMODE |	\ +				 S3C2410_UCON_RXFIFO_TOI |	\ +				 S3C2443_UCON_RXERR_IRQEN) + +#define S5PV210_UFCON_DEFAULT	(S3C2410_UFCON_FIFOMODE |	\ +				 S5PV210_UFCON_TXTRIG4 |	\ +				 S5PV210_UFCON_RXTRIG4) + +#ifndef __ASSEMBLY__ + +/* configuration structure for per-machine configurations for the + * serial port + * + * the pointer is setup by the machine specific initialisation from the + * arch/arm/mach-s3c2410/ directory. +*/ + +struct s3c2410_uartcfg { +	unsigned char	   hwport;	 /* hardware port number */ +	unsigned char	   unused; +	unsigned short	   flags; +	upf_t		   uart_flags;	 /* default uart flags */ +	unsigned int	   clk_sel; + +	unsigned int	   has_fracval; + +	unsigned long	   ucon;	 /* value of ucon for port */ +	unsigned long	   ulcon;	 /* value of ulcon for port */ +	unsigned long	   ufcon;	 /* value of ufcon for port */ +}; + +#endif /* __ASSEMBLY__ */ + +#endif /* __ASM_ARM_REGS_SERIAL_H */ + diff --git a/include/linux/sh_pfc.h b/include/linux/sh_pfc.h deleted file mode 100644 index c19a0925829..00000000000 --- a/include/linux/sh_pfc.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * SuperH Pin Function Controller Support - * - * Copyright (c) 2008 Magnus Damm - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef __SH_PFC_H -#define __SH_PFC_H - -#include <linux/stringify.h> -#include <asm-generic/gpio.h> - -typedef unsigned short pinmux_enum_t; -typedef unsigned short pinmux_flag_t; - -enum { -	PINMUX_TYPE_NONE, - -	PINMUX_TYPE_FUNCTION, -	PINMUX_TYPE_GPIO, -	PINMUX_TYPE_OUTPUT, -	PINMUX_TYPE_INPUT, -	PINMUX_TYPE_INPUT_PULLUP, -	PINMUX_TYPE_INPUT_PULLDOWN, - -	PINMUX_FLAG_TYPE,	/* must be last */ -}; - -#define PINMUX_FLAG_DBIT_SHIFT      5 -#define PINMUX_FLAG_DBIT            (0x1f << PINMUX_FLAG_DBIT_SHIFT) -#define PINMUX_FLAG_DREG_SHIFT      10 -#define PINMUX_FLAG_DREG            (0x3f << PINMUX_FLAG_DREG_SHIFT) - -struct pinmux_gpio { -	pinmux_enum_t enum_id; -	pinmux_flag_t flags; -	const char *name; -}; - -#define PINMUX_GPIO(gpio, data_or_mark) \ -	[gpio] = { .name = __stringify(gpio), .enum_id = data_or_mark, .flags = PINMUX_TYPE_NONE } - -#define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0 - -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)]) - -#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) \ -	.reg = r, .reg_width = r_width,	\ -	.enum_ids = (pinmux_enum_t [r_width]) \ - -struct pinmux_irq { -	int irq; -	pinmux_enum_t *enum_ids; -}; - -#define PINMUX_IRQ(irq_nr, ids...)			   \ -	{ .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } }	\ - -struct pinmux_range { -	pinmux_enum_t begin; -	pinmux_enum_t end; -	pinmux_enum_t force; -}; - -struct pfc_window { -	phys_addr_t phys; -	void __iomem *virt; -	unsigned long size; -}; - -struct sh_pfc { -	char *name; -	pinmux_enum_t reserved_id; -	struct pinmux_range data; -	struct pinmux_range input; -	struct pinmux_range input_pd; -	struct pinmux_range input_pu; -	struct pinmux_range output; -	struct pinmux_range mark; -	struct pinmux_range function; - -	unsigned first_gpio, last_gpio; - -	struct pinmux_gpio *gpios; -	struct pinmux_cfg_reg *cfg_regs; -	struct pinmux_data_reg *data_regs; - -	pinmux_enum_t *gpio_data; -	unsigned int gpio_data_size; - -	struct pinmux_irq *gpio_irq; -	unsigned int gpio_irq_size; - -	spinlock_t lock; - -	struct resource *resource; -	unsigned int num_resources; -	struct pfc_window *window; - -	unsigned long unlock_reg; -}; - -/* XXX compat for now */ -#define pinmux_info sh_pfc - -/* drivers/sh/pfc/gpio.c */ -int sh_pfc_register_gpiochip(struct sh_pfc *pfc); - -/* drivers/sh/pfc/pinctrl.c */ -int sh_pfc_register_pinctrl(struct sh_pfc *pfc); - -/* drivers/sh/pfc/core.c */ -int register_sh_pfc(struct sh_pfc *pfc); - -int sh_pfc_read_bit(struct pinmux_data_reg *dr, unsigned long in_pos); -void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos, -		      unsigned long value); -int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio, -			struct pinmux_data_reg **drp, int *bitp); -int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos, -			pinmux_enum_t *enum_idp); -int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type, -		       int cfg_mode); - -/* xxx */ -static inline int register_pinmux(struct pinmux_info *pip) -{ -	struct sh_pfc *pfc = pip; -	return register_sh_pfc(pfc); -} - -enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE }; - -/* 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/signal.h b/include/linux/signal.h index 0a89ffc4846..9475c5cb28b 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -241,9 +241,6 @@ extern int do_send_sig_info(int sig, struct siginfo *info,  				struct task_struct *p, bool group);  extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p);  extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *); -extern long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, -				 siginfo_t *info); -extern long do_sigpending(void __user *, unsigned long);  extern int do_sigtimedwait(const sigset_t *, siginfo_t *,  				const struct timespec *);  extern int sigprocmask(int, sigset_t *, sigset_t *); @@ -252,10 +249,59 @@ extern void __set_current_blocked(const sigset_t *);  extern int show_unhandled_signals;  extern int sigsuspend(sigset_t *); +struct sigaction { +#ifndef __ARCH_HAS_IRIX_SIGACTION +	__sighandler_t	sa_handler; +	unsigned long	sa_flags; +#else +	unsigned int	sa_flags; +	__sighandler_t	sa_handler; +#endif +#ifdef __ARCH_HAS_SA_RESTORER +	__sigrestore_t sa_restorer; +#endif +	sigset_t	sa_mask;	/* mask last for extensibility */ +}; + +struct k_sigaction { +	struct sigaction sa; +#ifdef __ARCH_HAS_KA_RESTORER +	__sigrestore_t ka_restorer; +#endif +}; +  +#ifdef CONFIG_OLD_SIGACTION +struct old_sigaction { +	__sighandler_t sa_handler; +	old_sigset_t sa_mask; +	unsigned long sa_flags; +	__sigrestore_t sa_restorer; +}; +#endif + +struct ksignal { +	struct k_sigaction ka; +	siginfo_t info; +	int sig; +}; +  extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); +extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);  extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping);  extern void exit_signals(struct task_struct *tsk); +/* + * Eventually that'll replace get_signal_to_deliver(); macro for now, + * to avoid nastiness with include order. + */ +#define get_signal(ksig)					\ +({								\ +	struct ksignal *p = (ksig);				\ +	p->sig = get_signal_to_deliver(&p->info, &p->ka,	\ +					signal_pt_regs(), NULL);\ +	p->sig > 0;						\ +}) +  extern struct kmem_cache *sighand_cachep;  int unhandled_signal(struct task_struct *tsk, int sig); diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 320e976d5ab..b8292d8cc9f 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -230,6 +230,13 @@ enum {  	/* generate wifi status information (where possible) */  	SKBTX_WIFI_STATUS = 1 << 4, + +	/* This indicates at least one fragment might be overwritten +	 * (as in vmsplice(), sendfile() ...) +	 * If we need to compute a TX checksum, we'll need to copy +	 * all frags to avoid possible bad checksum +	 */ +	SKBTX_SHARED_FRAG = 1 << 5,  };  /* @@ -307,6 +314,8 @@ enum {  	SKB_GSO_TCPV6 = 1 << 4,  	SKB_GSO_FCOE = 1 << 5, + +	SKB_GSO_GRE = 1 << 6,  };  #if BITS_PER_LONG > 32 @@ -491,7 +500,7 @@ struct sk_buff {  	union {  		__u32		mark;  		__u32		dropcount; -		__u32		avail_size; +		__u32		reserved_tailroom;  	};  	sk_buff_data_t		inner_transport_header; @@ -797,6 +806,16 @@ static inline int skb_cloned(const struct sk_buff *skb)  	       (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;  } +static inline int skb_unclone(struct sk_buff *skb, gfp_t pri) +{ +	might_sleep_if(pri & __GFP_WAIT); + +	if (skb_cloned(skb)) +		return pskb_expand_head(skb, 0, 0, pri); + +	return 0; +} +  /**   *	skb_header_cloned - is the header a clone   *	@skb: buffer to check @@ -1269,11 +1288,13 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,  	 * do not lose pfmemalloc information as the pages would not be  	 * allocated using __GFP_MEMALLOC.  	 */ -	if (page->pfmemalloc && !page->mapping) -		skb->pfmemalloc	= true;  	frag->page.p		  = page;  	frag->page_offset	  = off;  	skb_frag_size_set(frag, size); + +	page = compound_head(page); +	if (page->pfmemalloc && !page->mapping) +		skb->pfmemalloc	= true;  }  /** @@ -1428,7 +1449,10 @@ static inline int skb_tailroom(const struct sk_buff *skb)   */  static inline int skb_availroom(const struct sk_buff *skb)  { -	return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len; +	if (skb_is_nonlinear(skb)) +		return 0; + +	return skb->end - skb->tail - skb->reserved_tailroom;  }  /** @@ -1492,6 +1516,11 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,  	skb->inner_network_header += offset;  } +static inline bool skb_transport_header_was_set(const struct sk_buff *skb) +{ +	return skb->transport_header != ~0U; +} +  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)  {  	return skb->head + skb->transport_header; @@ -1580,6 +1609,11 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,  	skb->inner_network_header = skb->data + offset;  } +static inline bool skb_transport_header_was_set(const struct sk_buff *skb) +{ +	return skb->transport_header != NULL; +} +  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)  {  	return skb->transport_header; @@ -1815,6 +1849,10 @@ static inline void __skb_queue_purge(struct sk_buff_head *list)  		kfree_skb(skb);  } +#define NETDEV_FRAG_PAGE_MAX_ORDER get_order(32768) +#define NETDEV_FRAG_PAGE_MAX_SIZE  (PAGE_SIZE << NETDEV_FRAG_PAGE_MAX_ORDER) +#define NETDEV_PAGECNT_MAX_BIAS	   NETDEV_FRAG_PAGE_MAX_SIZE +  extern void *netdev_alloc_frag(unsigned int fragsz);  extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, @@ -2191,6 +2229,19 @@ static inline int skb_linearize(struct sk_buff *skb)  }  /** + * skb_has_shared_frag - can any frag be overwritten + * @skb: buffer to test + * + * Return true if the skb has at least one frag that might be modified + * by an external entity (as in vmsplice()/sendfile()) + */ +static inline bool skb_has_shared_frag(const struct sk_buff *skb) +{ +	return skb_is_nonlinear(skb) && +	       skb_shinfo(skb)->tx_flags & SKBTX_SHARED_FRAG; +} + +/**   *	skb_linearize_cow - make sure skb is linear and writable   *	@skb: buffer to process   * @@ -2592,6 +2643,13 @@ static inline void nf_reset(struct sk_buff *skb)  #endif  } +static inline void nf_reset_trace(struct sk_buff *skb) +{ +#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) +	skb->nf_trace = 0; +#endif +} +  /* Note: This doesn't put any conntrack and bridge info in dst. */  static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)  { @@ -2688,6 +2746,21 @@ static inline struct sec_path *skb_sec_path(struct sk_buff *skb)  }  #endif +/* Keeps track of mac header offset relative to skb->head. + * It is useful for TSO of Tunneling protocol. e.g. GRE. + * For non-tunnel skb it points to skb_mac_header() and for + * tunnel skb it points to outer mac header. */ +struct skb_gso_cb { +	int mac_offset; +}; +#define SKB_GSO_CB(skb) ((struct skb_gso_cb *)(skb)->cb) + +static inline int skb_tnl_header_len(const struct sk_buff *inner_skb) +{ +	return (skb_mac_header(inner_skb) - inner_skb->head) - +		SKB_GSO_CB(inner_skb)->mac_offset; +} +  static inline bool skb_is_gso(const struct sk_buff *skb)  {  	return skb_shinfo(skb)->gso_size; diff --git a/include/linux/smp.h b/include/linux/smp.h index dd6f06be3c9..3e07a7df647 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -89,7 +89,8 @@ void kick_all_cpus_sync(void);  #ifdef CONFIG_USE_GENERIC_SMP_HELPERS  void __init call_function_init(void);  void generic_smp_call_function_single_interrupt(void); -void generic_smp_call_function_interrupt(void); +#define generic_smp_call_function_interrupt \ +	generic_smp_call_function_single_interrupt  #else  static inline void call_function_init(void) { }  #endif diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h index c65dee05991..13e92967955 100644 --- a/include/linux/smpboot.h +++ b/include/linux/smpboot.h @@ -24,6 +24,9 @@ struct smpboot_thread_data;   *			parked (cpu offline)   * @unpark:		Optional unpark function, called when the thread is   *			unparked (cpu online) + * @pre_unpark:		Optional unpark function, called before the thread is + *			unparked (cpu online). This is not guaranteed to be + *			called on the target cpu of the thread. Careful!   * @selfparking:	Thread is not parked by the park function.   * @thread_comm:	The base name of the thread   */ @@ -37,6 +40,7 @@ struct smp_hotplug_thread {  	void				(*cleanup)(unsigned int cpu, bool online);  	void				(*park)(unsigned int cpu);  	void				(*unpark)(unsigned int cpu); +	void				(*pre_unpark)(unsigned int cpu);  	bool				selfparking;  	const char			*thread_comm;  }; diff --git a/include/linux/socket.h b/include/linux/socket.h index 9a546ff853d..2b9f74b0ffe 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -178,7 +178,8 @@ struct ucred {  #define AF_CAIF		37	/* CAIF sockets			*/  #define AF_ALG		38	/* Algorithm sockets		*/  #define AF_NFC		39	/* NFC sockets			*/ -#define AF_MAX		40	/* For now.. */ +#define AF_VSOCK	40	/* vSockets			*/ +#define AF_MAX		41	/* For now.. */  /* Protocol families, same as address families. */  #define PF_UNSPEC	AF_UNSPEC @@ -221,6 +222,7 @@ struct ucred {  #define PF_CAIF		AF_CAIF  #define PF_ALG		AF_ALG  #define PF_NFC		AF_NFC +#define PF_VSOCK	AF_VSOCK  #define PF_MAX		AF_MAX  /* Maximum queue length specifiable by listen.  */ diff --git a/include/linux/spi/pxa2xx_spi.h b/include/linux/spi/pxa2xx_spi.h index c73d1445c77..82d5111cd0c 100644 --- a/include/linux/spi/pxa2xx_spi.h +++ b/include/linux/spi/pxa2xx_spi.h @@ -28,6 +28,15 @@ struct pxa2xx_spi_master {  	u32 clock_enable;  	u16 num_chipselect;  	u8 enable_dma; + +	/* DMA engine specific config */ +	int rx_chan_id; +	int tx_chan_id; +	int rx_slave_id; +	int tx_slave_id; + +	/* For non-PXA arches */ +	struct ssp_device ssp;  };  /* spi_board_info.controller_data for SPI slave devices, @@ -35,6 +44,7 @@ struct pxa2xx_spi_master {   */  struct pxa2xx_spi_chip {  	u8 tx_threshold; +	u8 tx_hi_threshold;  	u8 rx_threshold;  	u8 dma_burst_size;  	u32 timeout; @@ -50,103 +60,5 @@ struct pxa2xx_spi_chip {  extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info); -#else -/* - * This is the implemtation for CE4100 on x86. ARM defines them in mach/ or - * plat/ include path. - * The CE4100 does not provide DMA support. This bits are here to let the driver - * compile and will never be used. Maybe we get DMA support at a later point in - * time. - */ - -#define DCSR(n)         (n) -#define DSADR(n)        (n) -#define DTADR(n)        (n) -#define DCMD(n)         (n) -#define DRCMR(n)        (n) - -#define DCSR_RUN	(1 << 31)	/* Run Bit */ -#define DCSR_NODESC	(1 << 30)	/* No-Descriptor Fetch */ -#define DCSR_STOPIRQEN	(1 << 29)	/* Stop Interrupt Enable */ -#define DCSR_REQPEND	(1 << 8)	/* Request Pending (read-only) */ -#define DCSR_STOPSTATE	(1 << 3)	/* Stop State (read-only) */ -#define DCSR_ENDINTR	(1 << 2)	/* End Interrupt */ -#define DCSR_STARTINTR	(1 << 1)	/* Start Interrupt */ -#define DCSR_BUSERR	(1 << 0)	/* Bus Error Interrupt */ - -#define DCSR_EORIRQEN	(1 << 28)	/* End of Receive Interrupt Enable */ -#define DCSR_EORJMPEN	(1 << 27)	/* Jump to next descriptor on EOR */ -#define DCSR_EORSTOPEN	(1 << 26)	/* STOP on an EOR */ -#define DCSR_SETCMPST	(1 << 25)	/* Set Descriptor Compare Status */ -#define DCSR_CLRCMPST	(1 << 24)	/* Clear Descriptor Compare Status */ -#define DCSR_CMPST	(1 << 10)	/* The Descriptor Compare Status */ -#define DCSR_EORINTR	(1 << 9)	/* The end of Receive */ - -#define DRCMR_MAPVLD	(1 << 7)	/* Map Valid */ -#define DRCMR_CHLNUM	0x1f		/* mask for Channel Number */ - -#define DDADR_DESCADDR	0xfffffff0	/* Address of next descriptor */ -#define DDADR_STOP	(1 << 0)	/* Stop */ - -#define DCMD_INCSRCADDR	(1 << 31)	/* Source Address Increment Setting. */ -#define DCMD_INCTRGADDR	(1 << 30)	/* Target Address Increment Setting. */ -#define DCMD_FLOWSRC	(1 << 29)	/* Flow Control by the source. */ -#define DCMD_FLOWTRG	(1 << 28)	/* Flow Control by the target. */ -#define DCMD_STARTIRQEN	(1 << 22)	/* Start Interrupt Enable */ -#define DCMD_ENDIRQEN	(1 << 21)	/* End Interrupt Enable */ -#define DCMD_ENDIAN	(1 << 18)	/* Device Endian-ness. */ -#define DCMD_BURST8	(1 << 16)	/* 8 byte burst */ -#define DCMD_BURST16	(2 << 16)	/* 16 byte burst */ -#define DCMD_BURST32	(3 << 16)	/* 32 byte burst */ -#define DCMD_WIDTH1	(1 << 14)	/* 1 byte width */ -#define DCMD_WIDTH2	(2 << 14)	/* 2 byte width (HalfWord) */ -#define DCMD_WIDTH4	(3 << 14)	/* 4 byte width (Word) */ -#define DCMD_LENGTH	0x01fff		/* length mask (max = 8K - 1) */ - -/* - * Descriptor structure for PXA's DMA engine - * Note: this structure must always be aligned to a 16-byte boundary. - */ - -typedef enum { -	DMA_PRIO_HIGH = 0, -	DMA_PRIO_MEDIUM = 1, -	DMA_PRIO_LOW = 2 -} pxa_dma_prio; - -/* - * DMA registration - */ - -static inline int pxa_request_dma(char *name, -		pxa_dma_prio prio, -		void (*irq_handler)(int, void *), -		void *data) -{ -	return -ENODEV; -} - -static inline void pxa_free_dma(int dma_ch) -{ -} - -/* - * The CE4100 does not have the clk framework implemented and SPI clock can - * not be switched on/off or the divider changed. - */ -static inline void clk_disable(struct clk *clk) -{ -} - -static inline int clk_enable(struct clk *clk) -{ -	return 0; -} - -static inline unsigned long clk_get_rate(struct clk *clk) -{ -	return 3686400; -} -  #endif  #endif diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index f62918946d8..38c2b925923 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -57,6 +57,8 @@ extern struct bus_type spi_bus_type;   * @modalias: Name of the driver to use with this device, or an alias   *	for that name.  This appears in the sysfs "modalias" attribute   *	for driver coldplugging, and in uevents used for hotplugging + * @cs_gpio: gpio number of the chipselect line (optional, -EINVAL when + *	when not using a GPIO line)   *   * A @spi_device is used to interchange data between an SPI slave   * (usually a discrete chip) and CPU memory. @@ -258,6 +260,9 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   * @unprepare_transfer_hardware: there are currently no more messages on the   *	queue so the subsystem notifies the driver that it may relax the   *	hardware by issuing this call + * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS + *	number. Any individual value may be -EINVAL for CS lines that + *	are not GPIOs (driven by the SPI controller itself).   *   * Each SPI master controller can communicate with one or more @spi_device   * children.  These make a small bus, sharing MOSI, MISO and SCK signals @@ -591,6 +596,26 @@ spi_transfer_del(struct spi_transfer *t)  	list_del(&t->transfer_list);  } +/** + * spi_message_init_with_transfers - Initialize spi_message and append transfers + * @m: spi_message to be initialized + * @xfers: An array of spi transfers + * @num_xfers: Number of items in the xfer array + * + * This function initializes the given spi_message and adds each spi_transfer in + * the given array to the message. + */ +static inline void +spi_message_init_with_transfers(struct spi_message *m, +struct spi_transfer *xfers, unsigned int num_xfers) +{ +	unsigned int i; + +	spi_message_init(m); +	for (i = 0; i < num_xfers; ++i) +		spi_message_add_tail(&xfers[i], m); +} +  /* It's fine to embed message and transaction structures in other data   * structures so long as you don't free them while they're in use.   */ @@ -683,6 +708,30 @@ spi_read(struct spi_device *spi, void *buf, size_t len)  	return spi_sync(spi, &m);  } +/** + * spi_sync_transfer - synchronous SPI data transfer + * @spi: device with which data will be exchanged + * @xfers: An array of spi_transfers + * @num_xfers: Number of items in the xfer array + * Context: can sleep + * + * Does a synchronous SPI data transfer of the given spi_transfer array. + * + * For more specific semantics see spi_sync(). + * + * It returns zero on success, else a negative error code. + */ +static inline int +spi_sync_transfer(struct spi_device *spi, struct spi_transfer *xfers, +	unsigned int num_xfers) +{ +	struct spi_message msg; + +	spi_message_init_with_transfers(&msg, xfers, num_xfers); + +	return spi_sync(spi, &msg); +} +  /* this copies txbuf and rxbuf data; for small transfers only! */  extern int spi_write_then_read(struct spi_device *spi,  		const void *txbuf, unsigned n_tx, diff --git a/include/linux/spi/spi_gpio.h b/include/linux/spi/spi_gpio.h index 369b3d7d5b9..1634ce31c06 100644 --- a/include/linux/spi/spi_gpio.h +++ b/include/linux/spi/spi_gpio.h @@ -62,8 +62,8 @@   */  struct spi_gpio_platform_data {  	unsigned	sck; -	unsigned	mosi; -	unsigned	miso; +	unsigned long	mosi; +	unsigned long	miso;  	u16		num_chipselect;  }; diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h index a26e2fb604e..e2369c167db 100644 --- a/include/linux/spinlock_up.h +++ b/include/linux/spinlock_up.h @@ -16,7 +16,10 @@   * In the debug case, 1 means unlocked, 0 means locked. (the values   * are inverted, to catch initialization bugs)   * - * No atomicity anywhere, we are on UP. + * No atomicity anywhere, we are on UP. However, we still need + * the compiler barriers, because we do not want the compiler to + * move potentially faulting instructions (notably user accesses) + * into the locked sequence, resulting in non-atomic execution.   */  #ifdef CONFIG_DEBUG_SPINLOCK @@ -25,6 +28,7 @@  static inline void arch_spin_lock(arch_spinlock_t *lock)  {  	lock->slock = 0; +	barrier();  }  static inline void @@ -32,6 +36,7 @@ arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)  {  	local_irq_save(flags);  	lock->slock = 0; +	barrier();  }  static inline int arch_spin_trylock(arch_spinlock_t *lock) @@ -39,32 +44,34 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)  	char oldval = lock->slock;  	lock->slock = 0; +	barrier();  	return oldval > 0;  }  static inline void arch_spin_unlock(arch_spinlock_t *lock)  { +	barrier();  	lock->slock = 1;  }  /*   * Read-write spinlocks. No debug version.   */ -#define arch_read_lock(lock)		do { (void)(lock); } while (0) -#define arch_write_lock(lock)		do { (void)(lock); } while (0) -#define arch_read_trylock(lock)	({ (void)(lock); 1; }) -#define arch_write_trylock(lock)	({ (void)(lock); 1; }) -#define arch_read_unlock(lock)		do { (void)(lock); } while (0) -#define arch_write_unlock(lock)	do { (void)(lock); } while (0) +#define arch_read_lock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_write_lock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_read_trylock(lock)	({ barrier(); (void)(lock); 1; }) +#define arch_write_trylock(lock)	({ barrier(); (void)(lock); 1; }) +#define arch_read_unlock(lock)		do { barrier(); (void)(lock); } while (0) +#define arch_write_unlock(lock)	do { barrier(); (void)(lock); } while (0)  #else /* DEBUG_SPINLOCK */  #define arch_spin_is_locked(lock)	((void)(lock), 0)  /* for sched.c and kernel_lock.c: */ -# define arch_spin_lock(lock)		do { (void)(lock); } while (0) -# define arch_spin_lock_flags(lock, flags)	do { (void)(lock); } while (0) -# define arch_spin_unlock(lock)	do { (void)(lock); } while (0) -# define arch_spin_trylock(lock)	({ (void)(lock); 1; }) +# define arch_spin_lock(lock)		do { barrier(); (void)(lock); } while (0) +# define arch_spin_lock_flags(lock, flags)	do { barrier(); (void)(lock); } while (0) +# define arch_spin_unlock(lock)	do { barrier(); (void)(lock); } while (0) +# define arch_spin_trylock(lock)	({ barrier(); (void)(lock); 1; })  #endif /* DEBUG_SPINLOCK */  #define arch_spin_is_contended(lock)	(((void)(lock), 0)) diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index 9e492be5244..6fcfe99bd99 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h @@ -219,6 +219,7 @@  #define SSB_CHIPCO_PMU_CTL			0x0600 /* PMU control */  #define  SSB_CHIPCO_PMU_CTL_ILP_DIV		0xFFFF0000 /* ILP div mask */  #define  SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT	16 +#define  SSB_CHIPCO_PMU_CTL_PLL_UPD		0x00000400  #define  SSB_CHIPCO_PMU_CTL_NOILPONW		0x00000200 /* No ILP on wait */  #define  SSB_CHIPCO_PMU_CTL_HTREQEN		0x00000100 /* HT req enable */  #define  SSB_CHIPCO_PMU_CTL_ALPREQEN		0x00000080 /* ALP req enable */ @@ -667,5 +668,6 @@ enum ssb_pmu_ldo_volt_id {  void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc,  			     enum ssb_pmu_ldo_volt_id id, u32 voltage);  void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid);  #endif /* LINUX_SSB_CHIPCO_H_ */ diff --git a/include/linux/ssb/ssb_driver_gige.h b/include/linux/ssb/ssb_driver_gige.h index 6b05dcd927f..86a12b0cb23 100644 --- a/include/linux/ssb/ssb_driver_gige.h +++ b/include/linux/ssb/ssb_driver_gige.h @@ -97,21 +97,16 @@ static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)  	return 0;  } -#ifdef CONFIG_BCM47XX -#include <asm/mach-bcm47xx/nvram.h>  /* Get the device MAC address */ -static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) -{ -	char buf[20]; -	if (nvram_getenv("et0macaddr", buf, sizeof(buf)) < 0) -		return; -	nvram_parse_macaddr(buf, macaddr); -} -#else -static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) +static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr)  { +	struct ssb_gige *dev = pdev_to_ssb_gige(pdev); +	if (!dev) +		return -ENODEV; + +	memcpy(macaddr, dev->dev->bus->sprom.et0mac, 6); +	return 0;  } -#endif  extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,  					  struct pci_dev *pdev); @@ -175,6 +170,10 @@ static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)  {  	return 0;  } +static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) +{ +	return -ENODEV; +}  #endif /* CONFIG_SSB_DRIVER_GIGE */  #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ diff --git a/include/linux/ssb/ssb_driver_mips.h b/include/linux/ssb/ssb_driver_mips.h index 07a9c7a2e08..afe79d40a99 100644 --- a/include/linux/ssb/ssb_driver_mips.h +++ b/include/linux/ssb/ssb_driver_mips.h @@ -45,6 +45,11 @@ void ssb_mipscore_init(struct ssb_mipscore *mcore)  {  } +static inline unsigned int ssb_mips_irq(struct ssb_device *dev) +{ +	return 0; +} +  #endif /* CONFIG_SSB_DRIVER_MIPS */  #endif /* LINUX_SSB_MIPSCORE_H_ */ diff --git a/include/linux/ssbi.h b/include/linux/ssbi.h new file mode 100644 index 00000000000..44ef5da2147 --- /dev/null +++ b/include/linux/ssbi.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2010 Google, Inc. + * Copyright (c) 2011, Code Aurora Forum. All rights reserved. + * Author: Dima Zavin <dima@android.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef _LINUX_SSBI_H +#define _LINUX_SSBI_H + +#include <linux/types.h> + +struct ssbi_slave_info { +	const char	*name; +	void		*platform_data; +}; + +enum ssbi_controller_type { +	MSM_SBI_CTRL_SSBI = 0, +	MSM_SBI_CTRL_SSBI2, +	MSM_SBI_CTRL_PMIC_ARBITER, +}; + +struct ssbi_platform_data { +	struct ssbi_slave_info	slave; +	enum ssbi_controller_type controller_type; +}; + +int ssbi_write(struct device *dev, u16 addr, u8 *buf, int len); +int ssbi_read(struct device *dev, u16 addr, u8 *buf, int len); +#endif diff --git a/include/linux/stmp3xxx_rtc_wdt.h b/include/linux/stmp3xxx_rtc_wdt.h new file mode 100644 index 00000000000..1dd12c96231 --- /dev/null +++ b/include/linux/stmp3xxx_rtc_wdt.h @@ -0,0 +1,15 @@ +/* + * stmp3xxx_rtc_wdt.h + * + * Copyright (C) 2011 Wolfram Sang, Pengutronix e.K. + * + * This file is released under the GPLv2. + */ +#ifndef __LINUX_STMP3XXX_RTC_WDT_H +#define __LINUX_STMP3XXX_RTC_WDT_H + +struct stmp3xxx_wdt_pdata { +	void (*wdt_set_timeout)(struct device *dev, u32 timeout); +}; + +#endif /* __LINUX_STMP3XXX_RTC_WDT_H */ diff --git a/include/linux/sunrpc/addr.h b/include/linux/sunrpc/addr.h new file mode 100644 index 00000000000..07d8e53bedf --- /dev/null +++ b/include/linux/sunrpc/addr.h @@ -0,0 +1,170 @@ +/* + * linux/include/linux/sunrpc/addr.h + * + * Various routines for copying and comparing sockaddrs and for + * converting them to and from presentation format. + */ +#ifndef _LINUX_SUNRPC_ADDR_H +#define _LINUX_SUNRPC_ADDR_H + +#include <linux/socket.h> +#include <linux/in.h> +#include <linux/in6.h> +#include <net/ipv6.h> + +size_t		rpc_ntop(const struct sockaddr *, char *, const size_t); +size_t		rpc_pton(struct net *, const char *, const size_t, +			 struct sockaddr *, const size_t); +char *		rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t); +size_t		rpc_uaddr2sockaddr(struct net *, const char *, const size_t, +				   struct sockaddr *, const size_t); + +static inline unsigned short rpc_get_port(const struct sockaddr *sap) +{ +	switch (sap->sa_family) { +	case AF_INET: +		return ntohs(((struct sockaddr_in *)sap)->sin_port); +	case AF_INET6: +		return ntohs(((struct sockaddr_in6 *)sap)->sin6_port); +	} +	return 0; +} + +static inline void rpc_set_port(struct sockaddr *sap, +				const unsigned short port) +{ +	switch (sap->sa_family) { +	case AF_INET: +		((struct sockaddr_in *)sap)->sin_port = htons(port); +		break; +	case AF_INET6: +		((struct sockaddr_in6 *)sap)->sin6_port = htons(port); +		break; +	} +} + +#define IPV6_SCOPE_DELIMITER		'%' +#define IPV6_SCOPE_ID_LEN		sizeof("%nnnnnnnnnn") + +static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, +				   const struct sockaddr *sap2) +{ +	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; +	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; + +	return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; +} + +static inline bool __rpc_copy_addr4(struct sockaddr *dst, +				    const struct sockaddr *src) +{ +	const struct sockaddr_in *ssin = (struct sockaddr_in *) src; +	struct sockaddr_in *dsin = (struct sockaddr_in *) dst; + +	dsin->sin_family = ssin->sin_family; +	dsin->sin_addr.s_addr = ssin->sin_addr.s_addr; +	return true; +} + +#if IS_ENABLED(CONFIG_IPV6) +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, +				   const struct sockaddr *sap2) +{ +	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; +	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; + +	if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) +		return false; +	else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) +		return sin1->sin6_scope_id == sin2->sin6_scope_id; + +	return true; +} + +static inline bool __rpc_copy_addr6(struct sockaddr *dst, +				    const struct sockaddr *src) +{ +	const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src; +	struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst; + +	dsin6->sin6_family = ssin6->sin6_family; +	dsin6->sin6_addr = ssin6->sin6_addr; +	dsin6->sin6_scope_id = ssin6->sin6_scope_id; +	return true; +} +#else	/* !(IS_ENABLED(CONFIG_IPV6) */ +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, +				   const struct sockaddr *sap2) +{ +	return false; +} + +static inline bool __rpc_copy_addr6(struct sockaddr *dst, +				    const struct sockaddr *src) +{ +	return false; +} +#endif	/* !(IS_ENABLED(CONFIG_IPV6) */ + +/** + * rpc_cmp_addr - compare the address portion of two sockaddrs. + * @sap1: first sockaddr + * @sap2: second sockaddr + * + * Just compares the family and address portion. Ignores port, but + * compares the scope if it's a link-local address. + * + * Returns true if the addrs are equal, false if they aren't. + */ +static inline bool rpc_cmp_addr(const struct sockaddr *sap1, +				const struct sockaddr *sap2) +{ +	if (sap1->sa_family == sap2->sa_family) { +		switch (sap1->sa_family) { +		case AF_INET: +			return __rpc_cmp_addr4(sap1, sap2); +		case AF_INET6: +			return __rpc_cmp_addr6(sap1, sap2); +		} +	} +	return false; +} + +/** + * rpc_copy_addr - copy the address portion of one sockaddr to another + * @dst: destination sockaddr + * @src: source sockaddr + * + * Just copies the address portion and family. Ignores port, scope, etc. + * Caller is responsible for making certain that dst is large enough to hold + * the address in src. Returns true if address family is supported. Returns + * false otherwise. + */ +static inline bool rpc_copy_addr(struct sockaddr *dst, +				 const struct sockaddr *src) +{ +	switch (src->sa_family) { +	case AF_INET: +		return __rpc_copy_addr4(dst, src); +	case AF_INET6: +		return __rpc_copy_addr6(dst, src); +	} +	return false; +} + +/** + * rpc_get_scope_id - return scopeid for a given sockaddr + * @sa: sockaddr to get scopeid from + * + * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if + * not an AF_INET6 address. + */ +static inline u32 rpc_get_scope_id(const struct sockaddr *sa) +{ +	if (sa->sa_family != AF_INET6) +		return 0; + +	return ((struct sockaddr_in6 *) sa)->sin6_scope_id; +} + +#endif /* _LINUX_SUNRPC_ADDR_H */ diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index f25ba922baa..58fda1c3c78 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h @@ -17,14 +17,15 @@  #include <linux/atomic.h>  #include <linux/rcupdate.h> +#include <linux/uidgid.h>  /* size of the nodename buffer */  #define UNX_MAXNODENAME	32  /* Work around the lack of a VFS credential */  struct auth_cred { -	uid_t	uid; -	gid_t	gid; +	kuid_t	uid; +	kgid_t	gid;  	struct group_info *group_info;  	const char *principal;  	unsigned char machine_cred : 1; @@ -48,7 +49,7 @@ struct rpc_cred {  	unsigned long		cr_flags;	/* various flags */  	atomic_t		cr_count;	/* ref count */ -	uid_t			cr_uid; +	kuid_t			cr_uid;  	/* per-flavor data */  }; diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 5dc9ee4d616..303399b1ba5 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -83,6 +83,10 @@ struct cache_detail {  	int			(*cache_upcall)(struct cache_detail *,  						struct cache_head *); +	void			(*cache_request)(struct cache_detail *cd, +						 struct cache_head *ch, +						 char **bpp, int *blen); +  	int			(*cache_parse)(struct cache_detail *,  					       char *buf, int len); @@ -157,11 +161,7 @@ sunrpc_cache_update(struct cache_detail *detail,  		    struct cache_head *new, struct cache_head *old, int hash);  extern int -sunrpc_cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h, -		void (*cache_request)(struct cache_detail *, -				      struct cache_head *, -				      char **, -				      int *)); +sunrpc_cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h);  extern void cache_clean_deferred(void *owner); diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 34206b84d8d..2cf4ffaa3cd 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -160,162 +160,11 @@ void		rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);  int		rpc_protocol(struct rpc_clnt *);  struct net *	rpc_net_ns(struct rpc_clnt *);  size_t		rpc_max_payload(struct rpc_clnt *); +unsigned long	rpc_get_timeout(struct rpc_clnt *clnt);  void		rpc_force_rebind(struct rpc_clnt *);  size_t		rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);  const char	*rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);  int		rpc_localaddr(struct rpc_clnt *, struct sockaddr *, size_t); -size_t		rpc_ntop(const struct sockaddr *, char *, const size_t); -size_t		rpc_pton(struct net *, const char *, const size_t, -			 struct sockaddr *, const size_t); -char *		rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t); -size_t		rpc_uaddr2sockaddr(struct net *, const char *, const size_t, -				   struct sockaddr *, const size_t); - -static inline unsigned short rpc_get_port(const struct sockaddr *sap) -{ -	switch (sap->sa_family) { -	case AF_INET: -		return ntohs(((struct sockaddr_in *)sap)->sin_port); -	case AF_INET6: -		return ntohs(((struct sockaddr_in6 *)sap)->sin6_port); -	} -	return 0; -} - -static inline void rpc_set_port(struct sockaddr *sap, -				const unsigned short port) -{ -	switch (sap->sa_family) { -	case AF_INET: -		((struct sockaddr_in *)sap)->sin_port = htons(port); -		break; -	case AF_INET6: -		((struct sockaddr_in6 *)sap)->sin6_port = htons(port); -		break; -	} -} - -#define IPV6_SCOPE_DELIMITER		'%' -#define IPV6_SCOPE_ID_LEN		sizeof("%nnnnnnnnnn") - -static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, -				   const struct sockaddr *sap2) -{ -	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; -	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; - -	return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; -} - -static inline bool __rpc_copy_addr4(struct sockaddr *dst, -				    const struct sockaddr *src) -{ -	const struct sockaddr_in *ssin = (struct sockaddr_in *) src; -	struct sockaddr_in *dsin = (struct sockaddr_in *) dst; - -	dsin->sin_family = ssin->sin_family; -	dsin->sin_addr.s_addr = ssin->sin_addr.s_addr; -	return true; -} - -#if IS_ENABLED(CONFIG_IPV6) -static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, -				   const struct sockaddr *sap2) -{ -	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; -	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; - -	if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) -		return false; -	else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) -		return sin1->sin6_scope_id == sin2->sin6_scope_id; - -	return true; -} - -static inline bool __rpc_copy_addr6(struct sockaddr *dst, -				    const struct sockaddr *src) -{ -	const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src; -	struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst; - -	dsin6->sin6_family = ssin6->sin6_family; -	dsin6->sin6_addr = ssin6->sin6_addr; -	return true; -} -#else	/* !(IS_ENABLED(CONFIG_IPV6) */ -static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, -				   const struct sockaddr *sap2) -{ -	return false; -} - -static inline bool __rpc_copy_addr6(struct sockaddr *dst, -				    const struct sockaddr *src) -{ -	return false; -} -#endif	/* !(IS_ENABLED(CONFIG_IPV6) */ - -/** - * rpc_cmp_addr - compare the address portion of two sockaddrs. - * @sap1: first sockaddr - * @sap2: second sockaddr - * - * Just compares the family and address portion. Ignores port, scope, etc. - * Returns true if the addrs are equal, false if they aren't. - */ -static inline bool rpc_cmp_addr(const struct sockaddr *sap1, -				const struct sockaddr *sap2) -{ -	if (sap1->sa_family == sap2->sa_family) { -		switch (sap1->sa_family) { -		case AF_INET: -			return __rpc_cmp_addr4(sap1, sap2); -		case AF_INET6: -			return __rpc_cmp_addr6(sap1, sap2); -		} -	} -	return false; -} - -/** - * rpc_copy_addr - copy the address portion of one sockaddr to another - * @dst: destination sockaddr - * @src: source sockaddr - * - * Just copies the address portion and family. Ignores port, scope, etc. - * Caller is responsible for making certain that dst is large enough to hold - * the address in src. Returns true if address family is supported. Returns - * false otherwise. - */ -static inline bool rpc_copy_addr(struct sockaddr *dst, -				 const struct sockaddr *src) -{ -	switch (src->sa_family) { -	case AF_INET: -		return __rpc_copy_addr4(dst, src); -	case AF_INET6: -		return __rpc_copy_addr6(dst, src); -	} -	return false; -} - -/** - * rpc_get_scope_id - return scopeid for a given sockaddr - * @sa: sockaddr to get scopeid from - * - * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if - * not an AF_INET6 address. - */ -static inline u32 rpc_get_scope_id(const struct sockaddr *sa) -{ -	if (sa->sa_family != AF_INET6) -		return 0; - -	return ((struct sockaddr_in6 *) sa)->sin6_scope_id; -} -  #endif /* __KERNEL__ */  #endif /* _LINUX_SUNRPC_CLNT_H */ diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index b64f8eb0b97..84ca436b76c 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -87,7 +87,6 @@ struct rpc_task {  				tk_cred_retry : 2,  				tk_rebind_retry : 2;  }; -#define tk_xprt			tk_client->cl_xprt  /* support walking a list of tasks on a wait queue */  #define	task_for_each(task, pos, head) \ diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 676ddf53b3e..1f0216b9a6c 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -50,6 +50,7 @@ struct svc_pool {  	unsigned int		sp_nrthreads;	/* # of threads in pool */  	struct list_head	sp_all_threads;	/* all server threads */  	struct svc_pool_stats	sp_stats;	/* statistics on pool operation */ +	int			sp_task_pending;/* has pending task */  } ____cacheline_aligned_in_smp;  /* diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h index dd74084a979..ff374ab3083 100644 --- a/include/linux/sunrpc/svcauth.h +++ b/include/linux/sunrpc/svcauth.h @@ -18,8 +18,8 @@  #include <linux/cred.h>  struct svc_cred { -	uid_t			cr_uid; -	gid_t			cr_gid; +	kuid_t			cr_uid; +	kgid_t			cr_gid;  	struct group_info	*cr_group_info;  	u32			cr_flavor; /* pseudoflavor */  	char			*cr_principal; /* for gss */ diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 63988990bd3..15f9204ee70 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -56,7 +56,7 @@ struct xdr_buf {  	struct kvec	head[1],	/* RPC header + non-page data */  			tail[1];	/* Appended after page data */ -	struct page **	pages;		/* Array of contiguous pages */ +	struct page **	pages;		/* Array of pages */  	unsigned int	page_base,	/* Start of page data */  			page_len,	/* Length of page data */  			flags;		/* Flags for data disposition */ @@ -152,6 +152,7 @@ xdr_adjust_iovec(struct kvec *iov, __be32 *p)  extern void xdr_shift_buf(struct xdr_buf *, size_t);  extern void xdr_buf_from_iov(struct kvec *, struct xdr_buf *);  extern int xdr_buf_subsegment(struct xdr_buf *, struct xdr_buf *, unsigned int, unsigned int); +extern void xdr_buf_trim(struct xdr_buf *, unsigned int);  extern int xdr_buf_read_netobj(struct xdr_buf *, struct xdr_netobj *, unsigned int);  extern int read_bytes_from_xdr_buf(struct xdr_buf *, unsigned int, void *, unsigned int);  extern int write_bytes_to_xdr_buf(struct xdr_buf *, unsigned int, void *, unsigned int); diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 951cb9b7d02..30834be0301 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -117,12 +117,12 @@ struct rpc_xprt_ops {  	void		(*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);  	void		(*rpcbind)(struct rpc_task *task);  	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port); -	void		(*connect)(struct rpc_task *task); +	void		(*connect)(struct rpc_xprt *xprt, struct rpc_task *task);  	void *		(*buf_alloc)(struct rpc_task *task, size_t size);  	void		(*buf_free)(void *buffer);  	int		(*send_request)(struct rpc_task *task);  	void		(*set_retrans_timeout)(struct rpc_task *task); -	void		(*timer)(struct rpc_task *task); +	void		(*timer)(struct rpc_xprt *xprt, struct rpc_task *task);  	void		(*release_request)(struct rpc_task *task);  	void		(*close)(struct rpc_xprt *xprt);  	void		(*destroy)(struct rpc_xprt *xprt); @@ -313,7 +313,7 @@ void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);  void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);  void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);  void			xprt_write_space(struct rpc_xprt *xprt); -void			xprt_adjust_cwnd(struct rpc_task *task, int result); +void			xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result);  struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);  void			xprt_complete_rqst(struct rpc_task *task, int copied);  void			xprt_release_rqst_cong(struct rpc_task *task); diff --git a/include/linux/sunserialcore.h b/include/linux/sunserialcore.h index 68e7430bb0f..dbe4d7fca1b 100644 --- a/include/linux/sunserialcore.h +++ b/include/linux/sunserialcore.h @@ -13,6 +13,10 @@  #ifndef _SERIAL_SUN_H  #define _SERIAL_SUN_H +#include <linux/device.h> +#include <linux/serial_core.h> +#include <linux/console.h> +  /* Serial keyboard defines for L1-A processing... */  #define SUNKBD_RESET		0xff  #define SUNKBD_L1		0x01 diff --git a/include/linux/sunxi_timer.h b/include/linux/sunxi_timer.h index b9165bba6e6..18081787e5f 100644 --- a/include/linux/sunxi_timer.h +++ b/include/linux/sunxi_timer.h @@ -19,6 +19,6 @@  #include <asm/mach/time.h> -extern struct sys_timer sunxi_timer; +void sunxi_timer_init(void);  #endif diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 0c808d7fa57..d4e3f16d5e8 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -34,8 +34,10 @@ static inline void pm_restore_console(void)  typedef int __bitwise suspend_state_t;  #define PM_SUSPEND_ON		((__force suspend_state_t) 0) -#define PM_SUSPEND_STANDBY	((__force suspend_state_t) 1) +#define PM_SUSPEND_FREEZE	((__force suspend_state_t) 1) +#define PM_SUSPEND_STANDBY	((__force suspend_state_t) 2)  #define PM_SUSPEND_MEM		((__force suspend_state_t) 3) +#define PM_SUSPEND_MIN		PM_SUSPEND_FREEZE  #define PM_SUSPEND_MAX		((__force suspend_state_t) 4)  enum suspend_stat_step { @@ -192,6 +194,7 @@ struct platform_suspend_ops {   */  extern void suspend_set_ops(const struct platform_suspend_ops *ops);  extern int suspend_valid_only_mem(suspend_state_t state); +extern void freeze_wake(void);  /**   * arch_suspend_disable_irqs - disable IRQs for suspend @@ -217,6 +220,7 @@ extern int pm_suspend(suspend_state_t state);  static inline void suspend_set_ops(const struct platform_suspend_ops *ops) {}  static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; } +static inline void freeze_wake(void) {}  #endif /* !CONFIG_SUSPEND */  /* struct pbe is used for creating lists of pages that should be restored diff --git a/include/linux/swap.h b/include/linux/swap.h index 68df9c17fbb..2818a123f3e 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -8,7 +8,7 @@  #include <linux/memcontrol.h>  #include <linux/sched.h>  #include <linux/node.h> - +#include <linux/fs.h>  #include <linux/atomic.h>  #include <asm/page.h> @@ -156,7 +156,7 @@ enum {  	SWP_SCANNING	= (1 << 8),	/* refcount in scan_swap_map */  }; -#define SWAP_CLUSTER_MAX 32 +#define SWAP_CLUSTER_MAX 32UL  #define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX  /* @@ -202,6 +202,18 @@ struct swap_info_struct {  	unsigned long *frontswap_map;	/* frontswap in-use, one bit per page */  	atomic_t frontswap_pages;	/* frontswap pages in-use counter */  #endif +	spinlock_t lock;		/* +					 * protect map scan related fields like +					 * swap_map, lowest_bit, highest_bit, +					 * inuse_pages, cluster_next, +					 * cluster_nr, lowest_alloc and +					 * highest_alloc. other fields are only +					 * changed at swapon/swapoff, so are +					 * protected by swap_lock. changing +					 * flags need hold this lock and +					 * swap_lock. If both locks need hold, +					 * hold swap_lock first. +					 */  };  struct swap_list_t { @@ -209,15 +221,12 @@ struct swap_list_t {  	int next;	/* swapfile to be used next */  }; -/* Swap 50% full? Release swapcache more aggressively.. */ -#define vm_swap_full() (nr_swap_pages*2 < total_swap_pages) -  /* 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); +extern unsigned long nr_free_buffer_pages(void); +extern unsigned long nr_free_pagecache_pages(void);  /* Definition of global_page_state not available yet */  #define nr_free_pages() global_page_state(NR_FREE_PAGES) @@ -266,7 +275,7 @@ extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,  extern unsigned long shrink_all_memory(unsigned long nr_pages);  extern int vm_swappiness;  extern int remove_mapping(struct address_space *mapping, struct page *page); -extern long vm_total_pages; +extern unsigned long vm_total_pages;  #ifdef CONFIG_NUMA  extern int zone_reclaim_mode; @@ -330,8 +339,9 @@ int generic_swapfile_activate(struct swap_info_struct *, struct file *,  		sector_t *);  /* linux/mm/swap_state.c */ -extern struct address_space swapper_space; -#define total_swapcache_pages  swapper_space.nrpages +extern struct address_space swapper_spaces[]; +#define swap_address_space(entry) (&swapper_spaces[swp_type(entry)]) +extern unsigned long total_swapcache_pages(void);  extern void show_swap_cache_info(void);  extern int add_to_swap(struct page *);  extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); @@ -346,8 +356,20 @@ extern struct page *swapin_readahead(swp_entry_t, gfp_t,  			struct vm_area_struct *vma, unsigned long addr);  /* linux/mm/swapfile.c */ -extern long nr_swap_pages; +extern atomic_long_t nr_swap_pages;  extern long total_swap_pages; + +/* Swap 50% full? Release swapcache more aggressively.. */ +static inline bool vm_swap_full(void) +{ +	return atomic_long_read(&nr_swap_pages) * 2 < total_swap_pages; +} + +static inline long get_nr_swap_pages(void) +{ +	return atomic_long_read(&nr_swap_pages); +} +  extern void si_swapinfo(struct sysinfo *);  extern swp_entry_t get_swap_page(void);  extern swp_entry_t get_swap_page_of_type(int); @@ -380,9 +402,10 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout)  #else /* CONFIG_SWAP */ -#define nr_swap_pages				0L +#define get_nr_swap_pages()			0L  #define total_swap_pages			0L -#define total_swapcache_pages			0UL +#define total_swapcache_pages()			0UL +#define vm_swap_full()				0  #define si_swapinfo(val) \  	do { (val)->freeswap = (val)->totalswap = 0; } while (0) diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 071d62c214a..a5ffd32642f 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -23,8 +23,9 @@ extern int swiotlb_force;  #define IO_TLB_SHIFT 11  extern void swiotlb_init(int verbose); -extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); +int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);  extern unsigned long swiotlb_nr_tbl(void); +unsigned long swiotlb_size_or_default(void);  extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);  /* diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 45e2db27025..313a8e0a655 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -68,11 +68,11 @@ struct sigaltstack;  #include <linux/types.h>  #include <linux/aio_abi.h>  #include <linux/capability.h> +#include <linux/signal.h>  #include <linux/list.h>  #include <linux/bug.h>  #include <linux/sem.h>  #include <asm/siginfo.h> -#include <asm/signal.h>  #include <linux/unistd.h>  #include <linux/quota.h>  #include <linux/key.h> @@ -300,10 +300,8 @@ asmlinkage long sys_personality(unsigned int personality);  asmlinkage long sys_sigpending(old_sigset_t __user *set);  asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set,  				old_sigset_t __user *oset); -#ifdef CONFIG_GENERIC_SIGALTSTACK  asmlinkage long sys_sigaltstack(const struct sigaltstack __user *uss,  				struct sigaltstack __user *uoss); -#endif  asmlinkage long sys_getitimer(int which, struct itimerval __user *value);  asmlinkage long sys_setitimer(int which, @@ -377,6 +375,27 @@ asmlinkage long sys_init_module(void __user *umod, unsigned long len,  asmlinkage long sys_delete_module(const char __user *name_user,  				unsigned int flags); +#ifdef CONFIG_OLD_SIGSUSPEND +asmlinkage long sys_sigsuspend(old_sigset_t mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +asmlinkage long sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); +#endif + +asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize); + +#ifdef CONFIG_OLD_SIGACTION +asmlinkage long sys_sigaction(int, const struct old_sigaction __user *, +				struct old_sigaction __user *); +#endif + +#ifndef CONFIG_ODD_RT_SIGACTION +asmlinkage long sys_rt_sigaction(int, +				 const struct sigaction __user *, +				 struct sigaction __user *, +				 size_t); +#endif  asmlinkage long sys_rt_sigprocmask(int how, sigset_t __user *set,  				sigset_t __user *oset, size_t sigsetsize);  asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize); diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 381f06db2fe..e2cee22f578 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -181,6 +181,10 @@ int sysfs_merge_group(struct kobject *kobj,  		       const struct attribute_group *grp);  void sysfs_unmerge_group(struct kobject *kobj,  		       const struct attribute_group *grp); +int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name, +			    struct kobject *target, const char *link_name); +void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name, +				  const char *link_name);  void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);  void sysfs_notify_dirent(struct sysfs_dirent *sd); @@ -326,6 +330,18 @@ static inline void sysfs_unmerge_group(struct kobject *kobj,  {  } +static inline int sysfs_add_link_to_group(struct kobject *kobj, +		const char *group_name, struct kobject *target, +		const char *link_name) +{ +	return 0; +} + +static inline void sysfs_remove_link_from_group(struct kobject *kobj, +		const char *group_name, const char *link_name) +{ +} +  static inline void sysfs_notify(struct kobject *kobj, const char *dir,  				const char *attr)  { diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 4e1d2283e3c..f28408c07dc 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -162,6 +162,8 @@ struct tcp_sock {  	u32	rcv_tstamp;	/* timestamp of last received ACK (for keepalives) */  	u32	lsndtime;	/* timestamp of last sent data packet (for restart window) */ +	u32	tsoffset;	/* timestamp offset */ +  	struct list_head tsq_node; /* anchor in tsq_tasklet.head list */  	unsigned long	tsq_flags; @@ -246,7 +248,6 @@ struct tcp_sock {  	u32	sacked_out;	/* SACK'd packets			*/  	u32	fackets_out;	/* FACK'd packets			*/  	u32	tso_deferred; -	u32	bytes_acked;	/* Appropriate Byte Counting - RFC3465 */  	/* from STCP, retrans queue hinting */  	struct sk_buff* lost_skb_hint; @@ -354,6 +355,7 @@ struct tcp_timewait_sock {  	u32			  tw_rcv_nxt;  	u32			  tw_snd_nxt;  	u32			  tw_rcv_wnd; +	u32			  tw_ts_offset;  	u32			  tw_ts_recent;  	long			  tw_ts_recent_stamp;  #ifdef CONFIG_TCP_MD5SIG diff --git a/include/linux/tegra-soc.h b/include/linux/tegra-soc.h new file mode 100644 index 00000000000..95f611d78f3 --- /dev/null +++ b/include/linux/tegra-soc.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved. + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __LINUX_TEGRA_SOC_H_ +#define __LINUX_TEGRA_SOC_H_ + +u32 tegra_read_chipid(void); + +#endif /* __LINUX_TEGRA_SOC_H_ */ diff --git a/include/linux/thermal.h b/include/linux/thermal.h index fe82022478e..e3c0ae9bb1f 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -44,7 +44,7 @@  /* Adding event notification support elements */  #define THERMAL_GENL_FAMILY_NAME                "thermal_event"  #define THERMAL_GENL_VERSION                    0x01 -#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group" +#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_grp"  /* Default Thermal Governor */  #if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE) @@ -74,6 +74,8 @@ enum thermal_trend {  	THERMAL_TREND_STABLE, /* temperature is stable */  	THERMAL_TREND_RAISING, /* temperature is raising */  	THERMAL_TREND_DROPPING, /* temperature is dropping */ +	THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */ +	THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */  };  /* Events supported by Thermal Netlink */ @@ -121,6 +123,7 @@ struct thermal_zone_device_ops {  	int (*set_trip_hyst) (struct thermal_zone_device *, int,  			      unsigned long);  	int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); +	int (*set_emul_temp) (struct thermal_zone_device *, unsigned long);  	int (*get_trend) (struct thermal_zone_device *, int,  			  enum thermal_trend *);  	int (*notify) (struct thermal_zone_device *, int, @@ -163,6 +166,7 @@ struct thermal_zone_device {  	int polling_delay;  	int temperature;  	int last_temperature; +	int emul_temperature;  	int passive;  	unsigned int forced_passive;  	const struct thermal_zone_device_ops *ops; @@ -244,9 +248,11 @@ int thermal_register_governor(struct thermal_governor *);  void thermal_unregister_governor(struct thermal_governor *);  #ifdef CONFIG_NET -extern int thermal_generate_netlink_event(u32 orig, enum events event); +extern int thermal_generate_netlink_event(struct thermal_zone_device *tz, +						enum events event);  #else -static inline int thermal_generate_netlink_event(u32 orig, enum events event) +static int thermal_generate_netlink_event(struct thermal_zone_device *tz, +						enum events event)  {  	return 0;  } diff --git a/include/linux/time.h b/include/linux/time.h index a3ab6a814a9..d4835dfdf25 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -154,9 +154,7 @@ void timekeeping_inject_sleeptime(struct timespec *delta);   * finer then tick granular time.   */  #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET -extern u32 arch_gettimeoffset(void); -#else -static inline u32 arch_gettimeoffset(void) { return 0; } +extern u32 (*arch_gettimeoffset)(void);  #endif  extern void do_gettimeofday(struct timeval *tv); diff --git a/include/linux/tty.h b/include/linux/tty.h index 8db1b569c37..367a9dfc4ea 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -202,7 +202,8 @@ struct tty_port {  	unsigned long		iflags;		/* TTYP_ internal flags */  #define TTYP_FLUSHING			1  /* Flushing to ldisc in progress */  #define TTYP_FLUSHPENDING		2  /* Queued buffer flush pending */ -	unsigned char		console:1;	/* port is a console */ +	unsigned char		console:1,	/* port is a console */ +				low_latency:1;	/* direct buffer flush */  	struct mutex		mutex;		/* Locking */  	struct mutex		buf_mutex;	/* Buffer alloc lock */  	unsigned char		*xmit_buf;	/* Optional buffer */ @@ -254,9 +255,9 @@ struct tty_struct {  	int count;  	struct winsize winsize;		/* termios mutex */  	unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; -	unsigned char low_latency:1, warned:1;  	unsigned char ctrl_status;	/* ctrl_lock */  	unsigned int receive_room;	/* Bytes free for queue */ +	int flow_change;  	struct tty_struct *link;  	struct fasync_struct *fasync; @@ -314,14 +315,62 @@ struct tty_file_private {  #define TTY_NO_WRITE_SPLIT 	17	/* Preserve write boundaries to driver */  #define TTY_HUPPED 		18	/* Post driver->hangup() */  #define TTY_HUPPING 		21	/* ->hangup() in progress */ +#define TTY_LDISC_HALTED	22	/* Line discipline is halted */  #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) +/* Values for tty->flow_change */ +#define TTY_THROTTLE_SAFE 1 +#define TTY_UNTHROTTLE_SAFE 2 + +static inline void __tty_set_flow_change(struct tty_struct *tty, int val) +{ +	tty->flow_change = val; +} + +static inline void tty_set_flow_change(struct tty_struct *tty, int val) +{ +	tty->flow_change = val; +	smp_mb(); +} + +#ifdef CONFIG_TTY +extern void console_init(void); +extern void tty_kref_put(struct tty_struct *tty); +extern struct pid *tty_get_pgrp(struct tty_struct *tty); +extern void tty_vhangup_self(void); +extern void disassociate_ctty(int priv); +extern dev_t tty_devnum(struct tty_struct *tty); +extern void proc_clear_tty(struct task_struct *p); +extern struct tty_struct *get_current_tty(void); +/* tty_io.c */ +extern int __init tty_init(void); +#else +static inline void console_init(void) +{ } +static inline void tty_kref_put(struct tty_struct *tty) +{ } +static inline struct pid *tty_get_pgrp(struct tty_struct *tty) +{ return NULL; } +static inline void tty_vhangup_self(void) +{ } +static inline void disassociate_ctty(int priv) +{ } +static inline dev_t tty_devnum(struct tty_struct *tty) +{ return 0; } +static inline void proc_clear_tty(struct task_struct *p) +{ } +static inline struct tty_struct *get_current_tty(void) +{ return NULL; } +/* tty_io.c */ +static inline int __init tty_init(void) +{ return 0; } +#endif +  extern void tty_write_flush(struct tty_struct *);  extern struct ktermios tty_std_termios; -extern void console_init(void);  extern int vcs_init(void);  extern struct class *tty_class; @@ -341,7 +390,6 @@ static inline struct tty_struct *tty_kref_get(struct tty_struct *tty)  		kref_get(&tty->kref);  	return tty;  } -extern void tty_kref_put(struct tty_struct *tty);  extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,  			      const char *routine); @@ -368,36 +416,49 @@ extern int tty_write_room(struct tty_struct *tty);  extern void tty_driver_flush_buffer(struct tty_struct *tty);  extern void tty_throttle(struct tty_struct *tty);  extern void tty_unthrottle(struct tty_struct *tty); +extern int tty_throttle_safe(struct tty_struct *tty); +extern int tty_unthrottle_safe(struct tty_struct *tty);  extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);  extern void tty_driver_remove_tty(struct tty_driver *driver,  				  struct tty_struct *tty);  extern void tty_free_termios(struct tty_struct *tty);  extern int is_current_pgrp_orphaned(void); -extern struct pid *tty_get_pgrp(struct tty_struct *tty);  extern int is_ignored(int sig);  extern int tty_signal(int sig, struct tty_struct *tty);  extern void tty_hangup(struct tty_struct *tty);  extern void tty_vhangup(struct tty_struct *tty);  extern void tty_vhangup_locked(struct tty_struct *tty); -extern void tty_vhangup_self(void);  extern void tty_unhangup(struct file *filp);  extern int tty_hung_up_p(struct file *filp);  extern void do_SAK(struct tty_struct *tty);  extern void __do_SAK(struct tty_struct *tty); -extern void disassociate_ctty(int priv);  extern void no_tty(void); -extern void tty_flip_buffer_push(struct tty_struct *tty);  extern void tty_flush_to_ldisc(struct tty_struct *tty);  extern void tty_buffer_free_all(struct tty_port *port);  extern void tty_buffer_flush(struct tty_struct *tty);  extern void tty_buffer_init(struct tty_port *port); -extern speed_t tty_get_baud_rate(struct tty_struct *tty);  extern speed_t tty_termios_baud_rate(struct ktermios *termios);  extern speed_t tty_termios_input_baud_rate(struct ktermios *termios);  extern void tty_termios_encode_baud_rate(struct ktermios *termios,  						speed_t ibaud, speed_t obaud);  extern void tty_encode_baud_rate(struct tty_struct *tty,  						speed_t ibaud, speed_t obaud); + +/** + *	tty_get_baud_rate	-	get tty bit rates + *	@tty: tty to query + * + *	Returns the baud rate as an integer for this terminal. The + *	termios lock must be held by the caller and the terminal bit + *	flags may be updated. + * + *	Locking: none + */ +static inline speed_t tty_get_baud_rate(struct tty_struct *tty) +{ +	return tty_termios_baud_rate(&tty->termios); +} +  extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);  extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b);  extern int tty_set_termios(struct tty_struct *tty, struct ktermios *kt); @@ -415,9 +476,6 @@ extern long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);  extern int tty_mode_ioctl(struct tty_struct *tty, struct file *file,  			unsigned int cmd, unsigned long arg);  extern int tty_perform_flush(struct tty_struct *tty, unsigned long arg); -extern dev_t tty_devnum(struct tty_struct *tty); -extern void proc_clear_tty(struct task_struct *p); -extern struct tty_struct *get_current_tty(void);  extern void tty_default_fops(struct file_operations *fops);  extern struct tty_struct *alloc_tty_struct(void);  extern int tty_alloc_file(struct file *file); @@ -477,6 +535,8 @@ extern int tty_port_carrier_raised(struct tty_port *port);  extern void tty_port_raise_dtr_rts(struct tty_port *port);  extern void tty_port_lower_dtr_rts(struct tty_port *port);  extern void tty_port_hangup(struct tty_port *port); +extern void tty_port_tty_hangup(struct tty_port *port, bool check_clocal); +extern void tty_port_tty_wakeup(struct tty_port *port);  extern int tty_port_block_til_ready(struct tty_port *port,  				struct tty_struct *tty, struct file *filp);  extern int tty_port_close_start(struct tty_port *port, @@ -501,8 +561,6 @@ extern void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty);  extern void tty_ldisc_init(struct tty_struct *tty);  extern void tty_ldisc_deinit(struct tty_struct *tty);  extern void tty_ldisc_begin(void); -/* This last one is just for the tty layer internals and shouldn't be used elsewhere */ -extern void tty_ldisc_enable(struct tty_struct *tty);  /* n_tty.c */ @@ -543,9 +601,6 @@ static inline int tty_audit_push_task(struct task_struct *tsk,  }  #endif -/* tty_io.c */ -extern int __init tty_init(void); -  /* tty_ioctl.c */  extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,  		       unsigned int cmd, unsigned long arg); diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index dd976cfb613..756a6098929 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h @@ -40,6 +40,7 @@   * void (*close)(struct tty_struct * tty, struct file * filp);   *   * 	This routine is called when a particular tty device is closed. + *	Note: called even if the corresponding open() failed.   *   *	Required method.   * diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index 2002344ed36..e0f252633b4 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h @@ -1,28 +1,34 @@  #ifndef _LINUX_TTY_FLIP_H  #define _LINUX_TTY_FLIP_H -extern int tty_buffer_request_room(struct tty_struct *tty, size_t size); -extern int tty_insert_flip_string_flags(struct tty_struct *tty, const unsigned char *chars, const char *flags, size_t size); -extern int tty_insert_flip_string_fixed_flag(struct tty_struct *tty, const unsigned char *chars, char flag, size_t size); -extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size); -extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size); -void tty_schedule_flip(struct tty_struct *tty); +extern int tty_buffer_request_room(struct tty_port *port, size_t size); +extern int tty_insert_flip_string_flags(struct tty_port *port, +		const unsigned char *chars, const char *flags, size_t size); +extern int tty_insert_flip_string_fixed_flag(struct tty_port *port, +		const unsigned char *chars, char flag, size_t size); +extern int tty_prepare_flip_string(struct tty_port *port, +		unsigned char **chars, size_t size); +extern int tty_prepare_flip_string_flags(struct tty_port *port, +		unsigned char **chars, char **flags, size_t size); +extern void tty_flip_buffer_push(struct tty_port *port); +void tty_schedule_flip(struct tty_port *port); -static inline int tty_insert_flip_char(struct tty_struct *tty, +static inline int tty_insert_flip_char(struct tty_port *port,  					unsigned char ch, char flag)  { -	struct tty_buffer *tb = tty->port->buf.tail; +	struct tty_buffer *tb = port->buf.tail;  	if (tb && tb->used < tb->size) {  		tb->flag_buf_ptr[tb->used] = flag;  		tb->char_buf_ptr[tb->used++] = ch;  		return 1;  	} -	return tty_insert_flip_string_flags(tty, &ch, &flag, 1); +	return tty_insert_flip_string_flags(port, &ch, &flag, 1);  } -static inline int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, size_t size) +static inline int tty_insert_flip_string(struct tty_port *port, +		const unsigned char *chars, size_t size)  { -	return tty_insert_flip_string_fixed_flag(tty, chars, TTY_NORMAL, size); +	return tty_insert_flip_string_fixed_flag(port, chars, TTY_NORMAL, size);  }  #endif /* _LINUX_TTY_FLIP_H */ diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h index fb79dd8d153..58390c73df8 100644 --- a/include/linux/tty_ldisc.h +++ b/include/linux/tty_ldisc.h @@ -9,89 +9,89 @@   *   * int	(*open)(struct tty_struct *);   * - * 	This function is called when the line discipline is associated - * 	with the tty.  The line discipline can use this as an - * 	opportunity to initialize any state needed by the ldisc routines. - *  + *	This function is called when the line discipline is associated + *	with the tty.  The line discipline can use this as an + *	opportunity to initialize any state needed by the ldisc routines. + *   * void	(*close)(struct tty_struct *);   *   *	This function is called when the line discipline is being - * 	shutdown, either because the tty is being closed or because - * 	the tty is being changed to use a new line discipline - *  + *	shutdown, either because the tty is being closed or because + *	the tty is being changed to use a new line discipline + *   * void	(*flush_buffer)(struct tty_struct *tty);   * - * 	This function instructs the line discipline to clear its - * 	buffers of any input characters it may have queued to be - * 	delivered to the user mode process. - *  + *	This function instructs the line discipline to clear its + *	buffers of any input characters it may have queued to be + *	delivered to the user mode process. + *   * ssize_t (*chars_in_buffer)(struct tty_struct *tty);   * - * 	This function returns the number of input characters the line + *	This function returns the number of input characters the line   *	discipline may have queued up to be delivered to the user mode   *	process. - *  + *   * ssize_t (*read)(struct tty_struct * tty, struct file * file,   *		   unsigned char * buf, size_t nr);   * - * 	This function is called when the user requests to read from - * 	the tty.  The line discipline will return whatever characters - * 	it has buffered up for the user.  If this function is not - * 	defined, the user will receive an EIO error. - *  + *	This function is called when the user requests to read from + *	the tty.  The line discipline will return whatever characters + *	it has buffered up for the user.  If this function is not + *	defined, the user will receive an EIO error. + *   * ssize_t (*write)(struct tty_struct * tty, struct file * file, - * 		    const unsigned char * buf, size_t nr); + *		    const unsigned char * buf, size_t nr); + * + *	This function is called when the user requests to write to the + *	tty.  The line discipline will deliver the characters to the + *	low-level tty device for transmission, optionally performing + *	some processing on the characters first.  If this function is + *	not defined, the user will receive an EIO error.   * - * 	This function is called when the user requests to write to the - * 	tty.  The line discipline will deliver the characters to the - * 	low-level tty device for transmission, optionally performing - * 	some processing on the characters first.  If this function is - * 	not defined, the user will receive an EIO error. - *    * int	(*ioctl)(struct tty_struct * tty, struct file * file, - * 		 unsigned int cmd, unsigned long arg); + *		 unsigned int cmd, unsigned long arg);   *   *	This function is called when the user requests an ioctl which - * 	is not handled by the tty layer or the low-level tty driver. - * 	It is intended for ioctls which affect line discpline - * 	operation.  Note that the search order for ioctls is (1) tty - * 	layer, (2) tty low-level driver, (3) line discpline.  So a - * 	low-level driver can "grab" an ioctl request before the line - * 	discpline has a chance to see it. - *  + *	is not handled by the tty layer or the low-level tty driver. + *	It is intended for ioctls which affect line discpline + *	operation.  Note that the search order for ioctls is (1) tty + *	layer, (2) tty low-level driver, (3) line discpline.  So a + *	low-level driver can "grab" an ioctl request before the line + *	discpline has a chance to see it. + *   * long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, - * 		        unsigned int cmd, unsigned long arg); + *		        unsigned int cmd, unsigned long arg);   * - *      Process ioctl calls from 32-bit process on 64-bit system + *	Process ioctl calls from 32-bit process on 64-bit system   *   * void	(*set_termios)(struct tty_struct *tty, struct ktermios * old);   * - * 	This function notifies the line discpline that a change has - * 	been made to the termios structure. - *  + *	This function notifies the line discpline that a change has + *	been made to the termios structure. + *   * int	(*poll)(struct tty_struct * tty, struct file * file, - * 		  poll_table *wait); + *		  poll_table *wait);   * - * 	This function is called when a user attempts to select/poll on a - * 	tty device.  It is solely the responsibility of the line - * 	discipline to handle poll requests. + *	This function is called when a user attempts to select/poll on a + *	tty device.  It is solely the responsibility of the line + *	discipline to handle poll requests.   *   * void	(*receive_buf)(struct tty_struct *, const unsigned char *cp, - * 		       char *fp, int count); + *		       char *fp, int count); + * + *	This function is called by the low-level tty driver to send + *	characters received by the hardware to the line discpline for + *	processing.  <cp> is a pointer to the buffer of input + *	character received by the device.  <fp> is a pointer to a + *	pointer of flag bytes which indicate whether a character was + *	received with a parity error, etc.   * - * 	This function is called by the low-level tty driver to send - * 	characters received by the hardware to the line discpline for - * 	processing.  <cp> is a pointer to the buffer of input - * 	character received by the device.  <fp> is a pointer to a - * 	pointer of flag bytes which indicate whether a character was - * 	received with a parity error, etc. - *    * void	(*write_wakeup)(struct tty_struct *);   * - * 	This function is called by the low-level tty driver to signal - * 	that line discpline should try to send more characters to the - * 	low-level driver for transmission.  If the line discpline does - * 	not have any more data to send, it can just return. + *	This function is called by the low-level tty driver to signal + *	that line discpline should try to send more characters to the + *	low-level driver for transmission.  If the line discpline does + *	not have any more data to send, it can just return.   *   * int (*hangup)(struct tty_struct *)   * @@ -100,16 +100,14 @@   *	seek to perform this action quickly but should wait until   *	any pending driver I/O is completed.   * - * void (*dcd_change)(struct tty_struct *tty, unsigned int status, - *			struct pps_event_time *ts) + * void (*dcd_change)(struct tty_struct *tty, unsigned int status)   * - *	Tells the discipline that the DCD pin has changed its status and - *	the relative timestamp. Pointer ts cannot be NULL. + *	Tells the discipline that the DCD pin has changed its status. + *	Used exclusively by the N_PPS (Pulse-Per-Second) line discipline.   */  #include <linux/fs.h>  #include <linux/wait.h> -#include <linux/pps_kernel.h>  #include <linux/wait.h>  struct tty_ldisc_ops { @@ -117,7 +115,7 @@ struct tty_ldisc_ops {  	char	*name;  	int	num;  	int	flags; -	 +  	/*  	 * The following routines are called from above.  	 */ @@ -125,30 +123,29 @@ struct tty_ldisc_ops {  	void	(*close)(struct tty_struct *);  	void	(*flush_buffer)(struct tty_struct *tty);  	ssize_t	(*chars_in_buffer)(struct tty_struct *tty); -	ssize_t	(*read)(struct tty_struct * tty, struct file * file, -			unsigned char __user * buf, size_t nr); -	ssize_t	(*write)(struct tty_struct * tty, struct file * file, -			 const unsigned char * buf, size_t nr);	 -	int	(*ioctl)(struct tty_struct * tty, struct file * file, +	ssize_t	(*read)(struct tty_struct *tty, struct file *file, +			unsigned char __user *buf, size_t nr); +	ssize_t	(*write)(struct tty_struct *tty, struct file *file, +			 const unsigned char *buf, size_t nr); +	int	(*ioctl)(struct tty_struct *tty, struct file *file,  			 unsigned int cmd, unsigned long arg); -	long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, +	long	(*compat_ioctl)(struct tty_struct *tty, struct file *file,  				unsigned int cmd, unsigned long arg); -	void	(*set_termios)(struct tty_struct *tty, struct ktermios * old); +	void	(*set_termios)(struct tty_struct *tty, struct ktermios *old);  	unsigned int (*poll)(struct tty_struct *, struct file *,  			     struct poll_table_struct *);  	int	(*hangup)(struct tty_struct *tty); -	 +  	/*  	 * The following routines are called from below.  	 */  	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,  			       char *fp, int count);  	void	(*write_wakeup)(struct tty_struct *); -	void	(*dcd_change)(struct tty_struct *, unsigned int, -				struct pps_event_time *); +	void	(*dcd_change)(struct tty_struct *, unsigned int);  	struct  module *owner; -	 +  	int refcount;  }; diff --git a/include/linux/ucs2_string.h b/include/linux/ucs2_string.h new file mode 100644 index 00000000000..cbb20afdbc0 --- /dev/null +++ b/include/linux/ucs2_string.h @@ -0,0 +1,14 @@ +#ifndef _LINUX_UCS2_STRING_H_ +#define _LINUX_UCS2_STRING_H_ + +#include <linux/types.h>	/* for size_t */ +#include <linux/stddef.h>	/* for NULL */ + +typedef u16 ucs2_char_t; + +unsigned long ucs2_strnlen(const ucs2_char_t *s, size_t maxlength); +unsigned long ucs2_strlen(const ucs2_char_t *s); +unsigned long ucs2_strsize(const ucs2_char_t *data, unsigned long maxlength); +int ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len); + +#endif /* _LINUX_UCS2_STRING_H_ */ diff --git a/include/linux/udp.h b/include/linux/udp.h index 9d81de123c9..42278bbf7a8 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h @@ -68,6 +68,7 @@ struct udp_sock {  	 * For encapsulation sockets.  	 */  	int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); +	void (*encap_destroy)(struct sock *sk);  };  static inline struct udp_sock *udp_sk(const struct sock *sk) diff --git a/include/linux/usb.h b/include/linux/usb.h index 4d22d0f6167..a0bee5a28d1 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -469,14 +469,12 @@ struct usb3_lpm_parameters {   * @lpm_capable: device supports LPM   * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM   * @usb2_hw_lpm_enabled: USB2 hardware LPM enabled + * @usb3_lpm_enabled: USB3 hardware LPM enabled   * @string_langid: language ID for strings   * @product: iProduct string, if present (static)   * @manufacturer: iManufacturer string, if present (static)   * @serial: iSerialNumber string, if present (static)   * @filelist: usbfs files that are open to this device - * @usb_classdev: USB class device that was created for usbfs device - *	access from userspace - * @usbfs_dentry: usbfs dentry entry for the device   * @maxchild: number of ports if hub   * @quirks: quirks of the whole device   * @urbnum: number of URBs submitted for the whole device @@ -619,7 +617,7 @@ static inline bool usb_acpi_power_manageable(struct usb_device *hdev, int index)  #endif  /* USB autosuspend and autoresume */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  extern void usb_enable_autosuspend(struct usb_device *udev);  extern void usb_disable_autosuspend(struct usb_device *udev); @@ -978,7 +976,12 @@ struct usbdrv_wrap {   *	the "usbfs" filesystem.  This lets devices provide ways to   *	expose information to user space regardless of where they   *	do (or don't) show up otherwise in the filesystem. - * @suspend: Called when the device is going to be suspended by the system. + * @suspend: Called when the device is going to be suspended by the + *	system either from system sleep or runtime suspend context. The + *	return value will be ignored in system sleep context, so do NOT + *	try to continue using the device if suspend fails in this case. + *	Instead, let the resume or reset-resume routine recover from + *	the failure.   * @resume: Called when the device is being resumed by the system.   * @reset_resume: Called when the suspended device has been reset instead   *	of being resumed. diff --git a/include/linux/usb/cdc-wdm.h b/include/linux/usb/cdc-wdm.h index 719c332620f..0b3f4295c02 100644 --- a/include/linux/usb/cdc-wdm.h +++ b/include/linux/usb/cdc-wdm.h @@ -11,6 +11,8 @@  #ifndef __LINUX_USB_CDC_WDM_H  #define __LINUX_USB_CDC_WDM_H +#include <uapi/linux/usb/cdc-wdm.h> +  extern struct usb_driver *usb_cdc_wdm_register(struct usb_interface *intf,  					struct usb_endpoint_descriptor *ep,  					int bufsize, diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index 3b8f9d4fc3f..cc25b70af33 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h @@ -127,6 +127,7 @@ struct cdc_ncm_ctx {  	u16 connected;  }; +extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf);  extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting);  extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf);  extern struct sk_buff *cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign); diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 9c210f2283d..27603bcbb9b 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -43,4 +43,13 @@   */  extern const char *usb_speed_string(enum usb_device_speed speed); + +/** + * usb_state_string - Returns human readable name for the state. + * @state: The state to return a human-readable name for. If it's not + *	any of the states devices in usb_device_state_string enum, + *	the string UNKNOWN will be returned. + */ +extern const char *usb_state_string(enum usb_device_state state); +  #endif /* __LINUX_USB_CH9_H */ diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index b09c37e04a9..5e61589fc16 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -39,6 +39,7 @@  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h>  #include <linux/log2.h> +#include <linux/configfs.h>  /*   * USB function drivers should return USB_GADGET_DELAYED_STATUS if they @@ -60,7 +61,7 @@ struct usb_configuration;   * @name: For diagnostics, identifies the function.   * @strings: tables of strings, keyed by identifiers assigned during bind()   *	and by language IDs provided in control requests - * @descriptors: Table of full (or low) speed descriptors, using interface and + * @fs_descriptors: Table of full (or low) speed descriptors, using interface and   *	string identifiers assigned during @bind().  If this pointer is null,   *	the function will not be available at full speed (or at low speed).   * @hs_descriptors: Table of high speed descriptors, using interface and @@ -77,6 +78,8 @@ struct usb_configuration;   *	in interface or class descriptors; endpoints; I/O buffers; and so on.   * @unbind: Reverses @bind; called as a side effect of unregistering the   *	driver which added this function. + * @free_func: free the struct usb_function. + * @mod: (internal) points to the module that created this structure.   * @set_alt: (REQUIRED) Reconfigures altsettings; function drivers may   *	initialize usb_ep.driver data at this time (when it is used).   *	Note that setting an interface to its current altsetting resets @@ -116,6 +119,7 @@ struct usb_configuration;   * two or more distinct instances within the same configuration, providing   * several independent logical data links to a USB host.   */ +  struct usb_function {  	const char			*name;  	struct usb_gadget_strings	**strings; @@ -136,6 +140,8 @@ struct usb_function {  					struct usb_function *);  	void			(*unbind)(struct usb_configuration *,  					struct usb_function *); +	void			(*free_func)(struct usb_function *f); +	struct module		*mod;  	/* runtime state management */  	int			(*set_alt)(struct usb_function *, @@ -156,6 +162,7 @@ struct usb_function {  	/* internals */  	struct list_head		list;  	DECLARE_BITMAP(endpoints, 32); +	const struct usb_function_instance *fi;  };  int usb_add_function(struct usb_configuration *, struct usb_function *); @@ -184,7 +191,8 @@ int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f,   * @bConfigurationValue: Copied into configuration descriptor.   * @iConfiguration: Copied into configuration descriptor.   * @bmAttributes: Copied into configuration descriptor. - * @bMaxPower: Copied into configuration descriptor. + * @MaxPower: Power consumtion in mA. Used to compute bMaxPower in the + *	configuration descriptor after considering the bus speed.   * @cdev: assigned by @usb_add_config() before calling @bind(); this is   *	the device associated with this configuration.   * @@ -230,7 +238,7 @@ struct usb_configuration {  	u8			bConfigurationValue;  	u8			iConfiguration;  	u8			bmAttributes; -	u8			bMaxPower; +	u16			MaxPower;  	struct usb_composite_dev	*cdev; @@ -283,6 +291,7 @@ enum {   *	after function notifications   * @resume: Notifies configuration when the host restarts USB traffic,   *	before function notifications + * @gadget_driver: Gadget driver controlling this driver   *   * Devices default to reporting self powered operation.  Devices which rely   * on bus powered operation should report this in their @bind method. @@ -316,7 +325,15 @@ struct usb_composite_driver {  extern int usb_composite_probe(struct usb_composite_driver *driver);  extern void usb_composite_unregister(struct usb_composite_driver *driver);  extern void usb_composite_setup_continue(struct usb_composite_dev *cdev); +extern int composite_dev_prepare(struct usb_composite_driver *composite, +		struct usb_composite_dev *cdev); +void composite_dev_cleanup(struct usb_composite_dev *cdev); +static inline struct usb_composite_driver *to_cdriver( +		struct usb_gadget_driver *gdrv) +{ +	return container_of(gdrv, struct usb_composite_driver, gadget_driver); +}  /**   * struct usb_composite_device - represents one composite usb gadget @@ -360,6 +377,7 @@ struct usb_composite_dev {  	unsigned int			suspended:1;  	struct usb_device_descriptor	desc;  	struct list_head		configs; +	struct list_head		gstrings;  	struct usb_composite_driver	*driver;  	u8				next_string_id;  	char				*def_manufacturer; @@ -381,8 +399,15 @@ struct usb_composite_dev {  extern int usb_string_id(struct usb_composite_dev *c);  extern int usb_string_ids_tab(struct usb_composite_dev *c,  			      struct usb_string *str); +extern struct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev, +		struct usb_gadget_strings **sp, unsigned n_strings); +  extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n); +extern void composite_disconnect(struct usb_gadget *gadget); +extern int composite_setup(struct usb_gadget *gadget, +		const struct usb_ctrlrequest *ctrl); +  /*   * Some systems will need runtime overrides for the  product identifiers   * published in the device descriptor, either numbers or strings or both. @@ -431,6 +456,56 @@ static inline u16 get_default_bcdDevice(void)  	return bcdDevice;  } +struct usb_function_driver { +	const char *name; +	struct module *mod; +	struct list_head list; +	struct usb_function_instance *(*alloc_inst)(void); +	struct usb_function *(*alloc_func)(struct usb_function_instance *inst); +}; + +struct usb_function_instance { +	struct config_group group; +	struct list_head cfs_list; +	struct usb_function_driver *fd; +	void (*free_func_inst)(struct usb_function_instance *inst); +}; + +void usb_function_unregister(struct usb_function_driver *f); +int usb_function_register(struct usb_function_driver *newf); +void usb_put_function_instance(struct usb_function_instance *fi); +void usb_put_function(struct usb_function *f); +struct usb_function_instance *usb_get_function_instance(const char *name); +struct usb_function *usb_get_function(struct usb_function_instance *fi); + +struct usb_configuration *usb_get_config(struct usb_composite_dev *cdev, +		int val); +int usb_add_config_only(struct usb_composite_dev *cdev, +		struct usb_configuration *config); +void usb_remove_function(struct usb_configuration *c, struct usb_function *f); + +#define DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc)		\ +	static struct usb_function_driver _name ## usb_func = {		\ +		.name = __stringify(_name),				\ +		.mod  = THIS_MODULE,					\ +		.alloc_inst = _inst_alloc,				\ +		.alloc_func = _func_alloc,				\ +	};								\ +	MODULE_ALIAS("usbfunc:"__stringify(_name)); + +#define DECLARE_USB_FUNCTION_INIT(_name, _inst_alloc, _func_alloc)	\ +	DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc)		\ +	static int __init _name ## mod_init(void)			\ +	{								\ +		return usb_function_register(&_name ## usb_func);	\ +	}								\ +	static void __exit _name ## mod_exit(void)			\ +	{								\ +		usb_function_unregister(&_name ## usb_func);		\ +	}								\ +	module_init(_name ## mod_init);					\ +	module_exit(_name ## mod_exit) +  /* messaging utils */  #define DBG(d, fmt, args...) \  	dev_dbg(&(d)->gadget->dev , fmt , ## args) diff --git a/include/linux/usb/dwc3-omap.h b/include/linux/usb/dwc3-omap.h new file mode 100644 index 00000000000..5615f4d8272 --- /dev/null +++ b/include/linux/usb/dwc3-omap.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2013 by Texas Instruments + * + * The Inventra Controller Driver for Linux 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 __DWC3_OMAP_H__ +#define __DWC3_OMAP_H__ + +enum omap_dwc3_vbus_id_status { +	OMAP_DWC3_UNKNOWN = 0, +	OMAP_DWC3_ID_GROUND, +	OMAP_DWC3_ID_FLOAT, +	OMAP_DWC3_VBUS_VALID, +	OMAP_DWC3_VBUS_OFF, +}; + +#if (defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_DWC3_MODULE)) +extern int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status); +#else +static inline int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status) +{ +	return -ENODEV; +} +#endif + +#endif	/* __DWC3_OMAP_H__ */ diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 0af6569b8cc..c454a88abf2 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -471,12 +471,6 @@ struct usb_gadget_ops {  			struct usb_gadget_driver *);  	int	(*udc_stop)(struct usb_gadget *,  			struct usb_gadget_driver *); - -	/* Those two are deprecated */ -	int	(*start)(struct usb_gadget_driver *, -			int (*bind)(struct usb_gadget *, -				struct usb_gadget_driver *driver)); -	int	(*stop)(struct usb_gadget_driver *);  };  /** @@ -488,6 +482,7 @@ struct usb_gadget_ops {   * @speed: Speed of current connection to USB host.   * @max_speed: Maximal speed the UDC can handle.  UDC must support this   *      and all slower speeds. + * @state: the state we are now (attached, suspended, configured, etc)   * @sg_supported: true if we can handle scatter-gather   * @is_otg: True if the USB device port uses a Mini-AB jack, so that the   *	gadget driver must provide a USB OTG descriptor. @@ -531,6 +526,7 @@ struct usb_gadget {  	struct list_head		ep_list;	/* of usb_ep */  	enum usb_device_speed		speed;  	enum usb_device_speed		max_speed; +	enum usb_device_state		state;  	unsigned			sg_supported:1;  	unsigned			is_otg:1;  	unsigned			is_a_peripheral:1; @@ -878,8 +874,12 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver);   */  int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); +extern int usb_add_gadget_udc_release(struct device *parent, +		struct usb_gadget *gadget, void (*release)(struct device *dev));  extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);  extern void usb_del_gadget_udc(struct usb_gadget *gadget); +extern int udc_attach_driver(const char *name, +		struct usb_gadget_driver *driver);  /*-------------------------------------------------------------------------*/ @@ -911,6 +911,11 @@ struct usb_gadget_strings {  	struct usb_string	*strings;  }; +struct usb_gadget_string_container { +	struct list_head        list; +	u8                      *stash[0]; +}; +  /* put descriptor for string with that id into buf (buflen >= 256) */  int usb_gadget_get_string(struct usb_gadget_strings *table, int id, u8 *buf); @@ -958,6 +963,13 @@ extern void usb_gadget_unmap_request(struct usb_gadget *gadget,  /*-------------------------------------------------------------------------*/ +/* utility to set gadget state properly */ + +extern void usb_gadget_set_state(struct usb_gadget *gadget, +		enum usb_device_state state); + +/*-------------------------------------------------------------------------*/ +  /* utility wrapping a simple endpoint selection policy */  extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, diff --git a/include/linux/usb/gadget_configfs.h b/include/linux/usb/gadget_configfs.h new file mode 100644 index 00000000000..d74c0ae989d --- /dev/null +++ b/include/linux/usb/gadget_configfs.h @@ -0,0 +1,110 @@ +#ifndef __GADGET_CONFIGFS__ +#define __GADGET_CONFIGFS__ + +#include <linux/configfs.h> + +int check_user_usb_string(const char *name, +		struct usb_gadget_strings *stringtab_dev); + +#define GS_STRINGS_W(__struct, __name)	\ +	static ssize_t __struct##_##__name##_store(struct __struct *gs, \ +		const char *page, size_t len)		\ +{							\ +	int ret;					\ +							\ +	ret = usb_string_copy(page, &gs->__name);	\ +	if (ret)					\ +		return ret;				\ +	return len;					\ +} + +#define GS_STRINGS_R(__struct, __name)	\ +	static ssize_t __struct##_##__name##_show(struct __struct *gs, \ +			char *page)	\ +{	\ +	return sprintf(page, "%s\n", gs->__name ?: "");	\ +} + +#define GS_STRING_ITEM_ATTR(struct_name, name)	\ +	static struct struct_name##_attribute struct_name##_##name = \ +		__CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,		\ +				struct_name##_##name##_show,		\ +				struct_name##_##name##_store) + +#define GS_STRINGS_RW(struct_name, _name)	\ +	GS_STRINGS_R(struct_name, _name)	\ +	GS_STRINGS_W(struct_name, _name)	\ +	GS_STRING_ITEM_ATTR(struct_name, _name) + +#define USB_CONFIG_STRING_RW_OPS(struct_in)				\ +	CONFIGFS_ATTR_OPS(struct_in);					\ +									\ +static struct configfs_item_operations struct_in##_langid_item_ops = {	\ +	.release                = struct_in##_attr_release,		\ +	.show_attribute         = struct_in##_attr_show,		\ +	.store_attribute        = struct_in##_attr_store,		\ +};									\ +									\ +static struct config_item_type struct_in##_langid_type = {		\ +	.ct_item_ops	= &struct_in##_langid_item_ops,			\ +	.ct_attrs	= struct_in##_langid_attrs,			\ +	.ct_owner	= THIS_MODULE,					\ +} + +#define USB_CONFIG_STRINGS_LANG(struct_in, struct_member)	\ +	static struct config_group *struct_in##_strings_make(		\ +			struct config_group *group,			\ +			const char *name)				\ +	{								\ +	struct struct_member *gi;					\ +	struct struct_in *gs;						\ +	struct struct_in *new;						\ +	int langs = 0;							\ +	int ret;							\ +									\ +	new = kzalloc(sizeof(*new), GFP_KERNEL);			\ +	if (!new)							\ +		return ERR_PTR(-ENOMEM);				\ +									\ +	ret = check_user_usb_string(name, &new->stringtab_dev);		\ +	if (ret)							\ +		goto err;						\ +	config_group_init_type_name(&new->group, name,			\ +			&struct_in##_langid_type);			\ +									\ +	gi = container_of(group, struct struct_member, strings_group);	\ +	ret = -EEXIST;							\ +	list_for_each_entry(gs, &gi->string_list, list) {		\ +		if (gs->stringtab_dev.language == new->stringtab_dev.language) \ +			goto err;					\ +		langs++;						\ +	}								\ +	ret = -EOVERFLOW;						\ +	if (langs >= MAX_USB_STRING_LANGS)				\ +		goto err;						\ +									\ +	list_add_tail(&new->list, &gi->string_list);			\ +	return &new->group;						\ +err:									\ +	kfree(new);							\ +	return ERR_PTR(ret);						\ +}									\ +									\ +static void struct_in##_strings_drop(					\ +		struct config_group *group,				\ +		struct config_item *item)				\ +{									\ +	config_item_put(item);						\ +}									\ +									\ +static struct configfs_group_operations struct_in##_strings_ops = {	\ +	.make_group     = &struct_in##_strings_make,			\ +	.drop_item      = &struct_in##_strings_drop,			\ +};									\ +									\ +static struct config_item_type struct_in##_strings_type = {		\ +	.ct_group_ops   = &struct_in##_strings_ops,			\ +	.ct_owner       = THIS_MODULE,					\ +} + +#endif diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 0a78df5f6cf..f5f5c7dfda9 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -84,7 +84,7 @@ struct usb_hcd {  	struct timer_list	rh_timer;	/* drives root-hub polling */  	struct urb		*status_urb;	/* the current status urb */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  	struct work_struct	wakeup_work;	/* for remote wakeup */  #endif @@ -357,6 +357,7 @@ struct hc_driver {  		 */  	int	(*disable_usb3_lpm_timeout)(struct usb_hcd *,  			struct usb_device *, enum usb3_link_state state); +	int	(*find_raw_port_number)(struct usb_hcd *, int);  };  extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); @@ -396,6 +397,7 @@ extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd);  extern int usb_add_hcd(struct usb_hcd *hcd,  		unsigned int irqnum, unsigned long irqflags);  extern void usb_remove_hcd(struct usb_hcd *hcd); +extern int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1);  struct platform_device;  extern void usb_hcd_platform_shutdown(struct platform_device *dev); @@ -591,14 +593,14 @@ extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg);  extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg);  #endif /* CONFIG_PM */ -#ifdef CONFIG_USB_SUSPEND +#ifdef CONFIG_PM_RUNTIME  extern void usb_hcd_resume_root_hub(struct usb_hcd *hcd);  #else  static inline void usb_hcd_resume_root_hub(struct usb_hcd *hcd)  {  	return;  } -#endif /* CONFIG_USB_SUSPEND */ +#endif /* CONFIG_PM_RUNTIME */  /*-------------------------------------------------------------------------*/ diff --git a/include/linux/bcm2835_timer.h b/include/linux/usb/musb-ux500.h index 25680fe0903..1e2c7130f6e 100644 --- a/include/linux/bcm2835_timer.h +++ b/include/linux/usb/musb-ux500.h @@ -1,5 +1,5 @@  /* - * Copyright 2012 Simon Arlott + * Copyright (C) 2013 ST-Ericsson AB   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -12,11 +12,20 @@   * GNU General Public License for more details.   */ -#ifndef __BCM2835_TIMER_H -#define __BCM2835_TIMER_H +#ifndef __MUSB_UX500_H__ +#define __MUSB_UX500_H__ -#include <asm/mach/time.h> +enum ux500_musb_vbus_id_status { +	UX500_MUSB_NONE = 0, +	UX500_MUSB_VBUS, +	UX500_MUSB_ID, +	UX500_MUSB_CHARGER, +	UX500_MUSB_ENUMERATED, +	UX500_MUSB_RIDA, +	UX500_MUSB_RIDB, +	UX500_MUSB_RIDC, +	UX500_MUSB_PREPARE, +	UX500_MUSB_CLEAN, +}; -extern struct sys_timer bcm2835_timer; - -#endif +#endif	/* __MUSB_UX500_H__ */ diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index eb505250940..053c26841cc 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h @@ -99,6 +99,8 @@ struct musb_hdrc_platform_data {  	/* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */  	u8		mode; +	u8		has_mailbox:1; +  	/* for clk_get() */  	const char	*clock; diff --git a/include/linux/usb/nop-usb-xceiv.h b/include/linux/usb/nop-usb-xceiv.h index 28884c71741..148d35171aa 100644 --- a/include/linux/usb/nop-usb-xceiv.h +++ b/include/linux/usb/nop-usb-xceiv.h @@ -5,6 +5,11 @@  struct nop_usb_xceiv_platform_data {  	enum usb_phy_type type; +	unsigned long clk_rate; + +	/* if set fails with -EPROBE_DEFER if can't get regulator */ +	unsigned int needs_vcc:1; +	unsigned int needs_reset:1;  };  #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) diff --git a/include/linux/usb/omap_control_usb.h b/include/linux/usb/omap_control_usb.h new file mode 100644 index 00000000000..27b5b8c931b --- /dev/null +++ b/include/linux/usb/omap_control_usb.h @@ -0,0 +1,92 @@ +/* + * omap_control_usb.h - Header file for the USB part of control module. + * + * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.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. + * + * Author: Kishon Vijay Abraham I <kishon@ti.com> + * + * 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 __OMAP_CONTROL_USB_H__ +#define __OMAP_CONTROL_USB_H__ + +struct omap_control_usb { +	struct device *dev; + +	u32 __iomem *dev_conf; +	u32 __iomem *otghs_control; +	u32 __iomem *phy_power; + +	struct clk *sys_clk; + +	u32 type; +}; + +struct omap_control_usb_platform_data { +	u8 type; +}; + +enum omap_control_usb_mode { +	USB_MODE_UNDEFINED = 0, +	USB_MODE_HOST, +	USB_MODE_DEVICE, +	USB_MODE_DISCONNECT, +}; + +/* To differentiate ctrl module IP having either mailbox or USB3 PHY power */ +#define	OMAP_CTRL_DEV_TYPE1		0x1 +#define	OMAP_CTRL_DEV_TYPE2		0x2 + +#define	OMAP_CTRL_DEV_PHY_PD		BIT(0) + +#define	OMAP_CTRL_DEV_AVALID		BIT(0) +#define	OMAP_CTRL_DEV_BVALID		BIT(1) +#define	OMAP_CTRL_DEV_VBUSVALID		BIT(2) +#define	OMAP_CTRL_DEV_SESSEND		BIT(3) +#define	OMAP_CTRL_DEV_IDDIG		BIT(4) + +#define	OMAP_CTRL_USB_PWRCTL_CLK_CMD_MASK	0x003FC000 +#define	OMAP_CTRL_USB_PWRCTL_CLK_CMD_SHIFT	0xE + +#define	OMAP_CTRL_USB_PWRCTL_CLK_FREQ_MASK	0xFFC00000 +#define	OMAP_CTRL_USB_PWRCTL_CLK_FREQ_SHIFT	0x16 + +#define	OMAP_CTRL_USB3_PHY_TX_RX_POWERON	0x3 +#define	OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF	0x0 + +#if IS_ENABLED(CONFIG_OMAP_CONTROL_USB) +extern struct device *omap_get_control_dev(void); +extern void omap_control_usb_phy_power(struct device *dev, int on); +extern void omap_control_usb3_phy_power(struct device *dev, bool on); +extern void omap_control_usb_set_mode(struct device *dev, +	enum omap_control_usb_mode mode); +#else +static inline struct device *omap_get_control_dev(void) +{ +	return ERR_PTR(-ENODEV); +} + +static inline void omap_control_usb_phy_power(struct device *dev, int on) +{ +} + +static inline void omap_control_usb3_phy_power(struct device *dev, int on) +{ +} + +static inline void omap_control_usb_set_mode(struct device *dev, +	enum omap_control_usb_mode mode) +{ +} +#endif + +#endif	/* __OMAP_CONTROL_USB_H__ */ diff --git a/include/linux/usb/omap_usb.h b/include/linux/usb/omap_usb.h index 0ea17f8ae82..6ae29360e1d 100644 --- a/include/linux/usb/omap_usb.h +++ b/include/linux/usb/omap_usb.h @@ -19,19 +19,29 @@  #ifndef __DRIVERS_OMAP_USB2_H  #define __DRIVERS_OMAP_USB2_H +#include <linux/io.h>  #include <linux/usb/otg.h> +struct usb_dpll_params { +	u16	m; +	u8	n; +	u8	freq:3; +	u8	sd; +	u32	mf; +}; +  struct omap_usb {  	struct usb_phy		phy;  	struct phy_companion	*comparator; +	void __iomem		*pll_ctrl_base;  	struct device		*dev; -	u32 __iomem		*control_dev; +	struct device		*control_dev;  	struct clk		*wkupclk; +	struct clk		*sys_clk; +	struct clk		*optclk;  	u8			is_suspended:1;  }; -#define	PHY_PD	0x1 -  #define	phy_to_omapusb(x)	container_of((x), struct omap_usb, phy)  #if defined(CONFIG_OMAP_USB2) || defined(CONFIG_OMAP_USB2_MODULE) @@ -43,4 +53,15 @@ static inline int omap_usb2_set_comparator(struct phy_companion *comparator)  }  #endif +static inline u32 omap_usb_readl(void __iomem *addr, unsigned offset) +{ +	return __raw_readl(addr + offset); +} + +static inline void omap_usb_writel(void __iomem *addr, unsigned offset, +	u32 data) +{ +	__raw_writel(data, addr + offset); +} +  #endif /* __DRIVERS_OMAP_USB_H */ diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index e8a5fe87c6b..291e01ba32e 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -36,14 +36,7 @@ struct usb_otg {  }; -#ifdef CONFIG_USB_OTG_UTILS -extern const char *otg_state_string(enum usb_otg_state state); -#else -static inline const char *otg_state_string(enum usb_otg_state state) -{ -	return NULL; -} -#endif +extern const char *usb_otg_state_string(enum usb_otg_state state);  /* Context: can sleep */  static inline int diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index a29ae1eb934..6b5978f5763 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -91,6 +91,9 @@ struct usb_phy {  	int	(*init)(struct usb_phy *x);  	void	(*shutdown)(struct usb_phy *x); +	/* enable/disable VBUS */ +	int	(*set_vbus)(struct usb_phy *x, int on); +  	/* effective for B devices, ignored for A-peripheral */  	int	(*set_power)(struct usb_phy *x,  				unsigned mA); @@ -106,9 +109,25 @@ struct usb_phy {  			enum usb_device_speed speed);  }; +/** + * struct usb_phy_bind - represent the binding for the phy + * @dev_name: the device name of the device that will bind to the phy + * @phy_dev_name: the device name of the phy + * @index: used if a single controller uses multiple phys + * @phy: reference to the phy + * @list: to maintain a linked list of the binding information + */ +struct usb_phy_bind { +	const char	*dev_name; +	const char	*phy_dev_name; +	u8		index; +	struct usb_phy	*phy; +	struct list_head list; +};  /* for board-specific init logic */  extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type); +extern int usb_add_phy_dev(struct usb_phy *);  extern void usb_remove_phy(struct usb_phy *);  /* helpers for direct access thru low-level io interface */ @@ -144,23 +163,63 @@ usb_phy_shutdown(struct usb_phy *x)  		x->shutdown(x);  } +static inline int +usb_phy_vbus_on(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, true); +} + +static inline int +usb_phy_vbus_off(struct usb_phy *x) +{ +	if (!x->set_vbus) +		return 0; + +	return x->set_vbus(x, false); +} +  /* for usb host and peripheral controller drivers */ -#ifdef CONFIG_USB_OTG_UTILS +#if IS_ENABLED(CONFIG_USB_PHY)  extern struct usb_phy *usb_get_phy(enum usb_phy_type type);  extern struct usb_phy *devm_usb_get_phy(struct device *dev,  	enum usb_phy_type type); +extern struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index); +extern struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index); +extern struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, +	const char *phandle, u8 index);  extern void usb_put_phy(struct usb_phy *);  extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x); +extern int usb_bind_phy(const char *dev_name, u8 index, +				const char *phy_dev_name);  #else  static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO);  }  static inline struct usb_phy *devm_usb_get_phy(struct device *dev,  	enum usb_phy_type type)  { -	return NULL; +	return ERR_PTR(-ENXIO); +} + +static inline struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index) +{ +	return ERR_PTR(-ENXIO); +} + +static inline struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index) +{ +	return ERR_PTR(-ENXIO); +} + +static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, +	const char *phandle, u8 index) +{ +	return ERR_PTR(-ENXIO);  }  static inline void usb_put_phy(struct usb_phy *x) @@ -171,6 +230,11 @@ static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)  {  } +static inline int usb_bind_phy(const char *dev_name, u8 index, +				const char *phy_dev_name) +{ +	return -EOPNOTSUPP; +}  #endif  static inline int diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h index c5d36c65c33..e452ba6ec6b 100644 --- a/include/linux/usb/renesas_usbhs.h +++ b/include/linux/usb/renesas_usbhs.h @@ -62,14 +62,14 @@ struct renesas_usbhs_platform_callback {  	 * Hardware exit function for platform.  	 * it is called when driver was removed  	 */ -	void (*hardware_exit)(struct platform_device *pdev); +	int (*hardware_exit)(struct platform_device *pdev);  	/*  	 * option:  	 *  	 * for board specific clock control  	 */ -	void (*power_ctrl)(struct platform_device *pdev, +	int (*power_ctrl)(struct platform_device *pdev,  			   void __iomem *base, int enable);  	/* @@ -77,7 +77,7 @@ struct renesas_usbhs_platform_callback {  	 *  	 * Phy reset for platform  	 */ -	void (*phy_reset)(struct platform_device *pdev); +	int (*phy_reset)(struct platform_device *pdev);  	/*  	 * get USB ID function diff --git a/include/linux/usb/samsung_usb_phy.h b/include/linux/usb/samsung_usb_phy.h new file mode 100644 index 00000000000..916782699f1 --- /dev/null +++ b/include/linux/usb/samsung_usb_phy.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co.Ltd + *		http://www.samsung.com/ + * + * Defines phy types for samsung usb phy controllers - HOST or DEIVCE. + * + * 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. + */ + +enum samsung_usb_phy_type { +	USB_PHY_TYPE_DEVICE, +	USB_PHY_TYPE_HOST, +}; diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index ef9be7e1e19..b9b0f7b4e43 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -15,6 +15,7 @@  #include <linux/kref.h>  #include <linux/mutex.h> +#include <linux/serial.h>  #include <linux/sysrq.h>  #include <linux/kfifo.h> @@ -61,6 +62,7 @@   * @bulk_out_buffers: pointers to the bulk out buffers for this port   * @write_urbs: pointers to the bulk out urbs for this port   * @write_urbs_free: status bitmap the for bulk out urbs + * @icount: interrupt counters   * @tx_bytes: number of bytes currently in host stack queues   * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this   *	port. @@ -108,6 +110,7 @@ struct usb_serial_port {  	unsigned long		write_urbs_free;  	__u8			bulk_out_endpointAddress; +	struct async_icount	icount;  	int			tx_bytes;  	unsigned long		flags; @@ -270,6 +273,7 @@ struct usb_serial_driver {  	int  (*tiocmget)(struct tty_struct *tty);  	int  (*tiocmset)(struct tty_struct *tty,  			 unsigned int set, unsigned int clear); +	int  (*tiocmiwait)(struct tty_struct *tty, unsigned long arg);  	int  (*get_icount)(struct tty_struct *tty,  			struct serial_icounter_struct *icount);  	/* Called by the tty layer for port level work. There may or may not @@ -327,8 +331,10 @@ extern void usb_serial_generic_read_bulk_callback(struct urb *urb);  extern void usb_serial_generic_write_bulk_callback(struct urb *urb);  extern void usb_serial_generic_throttle(struct tty_struct *tty);  extern void usb_serial_generic_unthrottle(struct tty_struct *tty); -extern void usb_serial_generic_disconnect(struct usb_serial *serial); -extern void usb_serial_generic_release(struct usb_serial *serial); +extern int usb_serial_generic_tiocmiwait(struct tty_struct *tty, +							unsigned long arg); +extern int usb_serial_generic_get_icount(struct tty_struct *tty, +					struct serial_icounter_struct *icount);  extern int usb_serial_generic_register(void);  extern void usb_serial_generic_deregister(void);  extern int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port, diff --git a/include/linux/usb/tegra_usb_phy.h b/include/linux/usb/tegra_usb_phy.h index 176b1ca06ae..1b7519a8c0b 100644 --- a/include/linux/usb/tegra_usb_phy.h +++ b/include/linux/usb/tegra_usb_phy.h @@ -59,22 +59,24 @@ struct tegra_usb_phy {  	struct usb_phy *ulpi;  	struct usb_phy u_phy;  	struct device *dev; +	bool is_legacy_phy; +	bool is_ulpi_phy; +	void (*set_pts)(struct usb_phy *x, u8 pts_val); +	void (*set_phcd)(struct usb_phy *x, bool enable);  };  struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, -	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode); +	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode, +	void (*set_pts)(struct usb_phy *x, u8 pts_val), +	void (*set_phcd)(struct usb_phy *x, bool enable)); -void tegra_usb_phy_clk_disable(struct tegra_usb_phy *phy); +void tegra_usb_phy_preresume(struct usb_phy *phy); -void tegra_usb_phy_clk_enable(struct tegra_usb_phy *phy); +void tegra_usb_phy_postresume(struct usb_phy *phy); -void tegra_usb_phy_preresume(struct tegra_usb_phy *phy); - -void tegra_usb_phy_postresume(struct tegra_usb_phy *phy); - -void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy, +void tegra_ehci_phy_restore_start(struct usb_phy *phy,  				 enum tegra_usb_phy_port_speed port_speed); -void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy); +void tegra_ehci_phy_restore_end(struct usb_phy *phy);  #endif /* __TEGRA_USB_PHY_H */ diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h index 6f033a415ec..5c295c26ad3 100644 --- a/include/linux/usb/ulpi.h +++ b/include/linux/usb/ulpi.h @@ -181,8 +181,16 @@  /*-------------------------------------------------------------------------*/ +#if IS_ENABLED(CONFIG_USB_ULPI)  struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,  					unsigned int flags); +#else +static inline struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops, +					      unsigned int flags) +{ +	return NULL; +} +#endif  #ifdef CONFIG_USB_ULPI_VIEWPORT  /* access ops for controllers with a viewport register */ diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h index b9bd2e6c73c..b6b215f13b4 100644 --- a/include/linux/user_namespace.h +++ b/include/linux/user_namespace.h @@ -21,11 +21,13 @@ struct user_namespace {  	struct uid_gid_map	uid_map;  	struct uid_gid_map	gid_map;  	struct uid_gid_map	projid_map; -	struct kref		kref; +	atomic_t		count;  	struct user_namespace	*parent;  	kuid_t			owner;  	kgid_t			group;  	unsigned int		proc_inum; +	bool			may_mount_sysfs; +	bool			may_mount_proc;  };  extern struct user_namespace init_user_ns; @@ -35,18 +37,18 @@ extern struct user_namespace init_user_ns;  static inline struct user_namespace *get_user_ns(struct user_namespace *ns)  {  	if (ns) -		kref_get(&ns->kref); +		atomic_inc(&ns->count);  	return ns;  }  extern int create_user_ns(struct cred *new);  extern int unshare_userns(unsigned long unshare_flags, struct cred **new_cred); -extern void free_user_ns(struct kref *kref); +extern void free_user_ns(struct user_namespace *ns);  static inline void put_user_ns(struct user_namespace *ns)  { -	if (ns) -		kref_put(&ns->kref, free_user_ns); +	if (ns && atomic_dec_and_test(&ns->count)) +		free_user_ns(ns);  }  struct seq_operations; @@ -82,4 +84,6 @@ static inline void put_user_ns(struct user_namespace *ns)  #endif +void update_mnt_policy(struct user_namespace *userns); +  #endif /* _LINUX_USER_H */ diff --git a/include/linux/vexpress.h b/include/linux/vexpress.h index c52215ff424..75818744ab5 100644 --- a/include/linux/vexpress.h +++ b/include/linux/vexpress.h @@ -27,6 +27,14 @@  #define VEXPRESS_GPIO_MMC_CARDIN	0  #define VEXPRESS_GPIO_MMC_WPROT		1  #define VEXPRESS_GPIO_FLASH_WPn		2 +#define VEXPRESS_GPIO_LED0		3 +#define VEXPRESS_GPIO_LED1		4 +#define VEXPRESS_GPIO_LED2		5 +#define VEXPRESS_GPIO_LED3		6 +#define VEXPRESS_GPIO_LED4		7 +#define VEXPRESS_GPIO_LED5		8 +#define VEXPRESS_GPIO_LED6		9 +#define VEXPRESS_GPIO_LED7		10  #define VEXPRESS_RES_FUNC(_site, _func)	\  {					\ diff --git a/include/linux/virtio.h b/include/linux/virtio.h index cf8adb1f5b2..ff6714e6d0f 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -78,7 +78,7 @@ struct virtio_device {  	int index;  	struct device dev;  	struct virtio_device_id id; -	struct virtio_config_ops *config; +	const struct virtio_config_ops *config;  	struct list_head vqs;  	/* Note that this is a Linux set_bit-style bitmap. */  	unsigned long features[1]; @@ -126,4 +126,13 @@ static inline struct virtio_driver *drv_to_virtio(struct device_driver *drv)  int register_virtio_driver(struct virtio_driver *drv);  void unregister_virtio_driver(struct virtio_driver *drv); + +/* module_virtio_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() + */ +#define module_virtio_driver(__virtio_driver) \ +	module_driver(__virtio_driver, register_virtio_driver, \ +			unregister_virtio_driver)  #endif /* _LINUX_VIRTIO_H */ diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index fce0a2799d4..bd6cf61142b 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -36,7 +36,6 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,  #endif  		PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL,  		KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY, -		KSWAPD_SKIP_CONGESTION_WAIT,  		PAGEOUTRUN, ALLOCSTALL, PGROTATED,  #ifdef CONFIG_NUMA_BALANCING  		NUMA_PTE_UPDATES, diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index a13291f7da8..5fd71a7d0df 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -85,7 +85,7 @@ static inline void vm_events_fold_cpu(int cpu)  #define count_vm_numa_events(x, y) count_vm_events(x, y)  #else  #define count_vm_numa_event(x) do {} while (0) -#define count_vm_numa_events(x, y) do {} while (0) +#define count_vm_numa_events(x, y) do { (void)(y); } while (0)  #endif /* CONFIG_NUMA_BALANCING */  #define __count_zone_vm_events(item, zone, delta) \ diff --git a/include/linux/vmw_vmci_api.h b/include/linux/vmw_vmci_api.h new file mode 100644 index 00000000000..023430e265f --- /dev/null +++ b/include/linux/vmw_vmci_api.h @@ -0,0 +1,82 @@ +/* + * VMware VMCI Driver + * + * Copyright (C) 2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License + * for more details. + */ + +#ifndef __VMW_VMCI_API_H__ +#define __VMW_VMCI_API_H__ + +#include <linux/uidgid.h> +#include <linux/vmw_vmci_defs.h> + +#undef  VMCI_KERNEL_API_VERSION +#define VMCI_KERNEL_API_VERSION_1 1 +#define VMCI_KERNEL_API_VERSION_2 2 +#define VMCI_KERNEL_API_VERSION   VMCI_KERNEL_API_VERSION_2 + +typedef void (vmci_device_shutdown_fn) (void *device_registration, +					void *user_data); + +int vmci_datagram_create_handle(u32 resource_id, u32 flags, +				vmci_datagram_recv_cb recv_cb, +				void *client_data, +				struct vmci_handle *out_handle); +int vmci_datagram_create_handle_priv(u32 resource_id, u32 flags, u32 priv_flags, +				     vmci_datagram_recv_cb recv_cb, +				     void *client_data, +				     struct vmci_handle *out_handle); +int vmci_datagram_destroy_handle(struct vmci_handle handle); +int vmci_datagram_send(struct vmci_datagram *msg); +int vmci_doorbell_create(struct vmci_handle *handle, u32 flags, +			 u32 priv_flags, +			 vmci_callback notify_cb, void *client_data); +int vmci_doorbell_destroy(struct vmci_handle handle); +int vmci_doorbell_notify(struct vmci_handle handle, u32 priv_flags); +u32 vmci_get_context_id(void); +bool vmci_is_context_owner(u32 context_id, kuid_t uid); + +int vmci_event_subscribe(u32 event, +			 vmci_event_cb callback, void *callback_data, +			 u32 *subid); +int vmci_event_unsubscribe(u32 subid); +u32 vmci_context_get_priv_flags(u32 context_id); +int vmci_qpair_alloc(struct vmci_qp **qpair, +		     struct vmci_handle *handle, +		     u64 produce_qsize, +		     u64 consume_qsize, +		     u32 peer, u32 flags, u32 priv_flags); +int vmci_qpair_detach(struct vmci_qp **qpair); +int vmci_qpair_get_produce_indexes(const struct vmci_qp *qpair, +				   u64 *producer_tail, +				   u64 *consumer_head); +int vmci_qpair_get_consume_indexes(const struct vmci_qp *qpair, +				   u64 *consumer_tail, +				   u64 *producer_head); +s64 vmci_qpair_produce_free_space(const struct vmci_qp *qpair); +s64 vmci_qpair_produce_buf_ready(const struct vmci_qp *qpair); +s64 vmci_qpair_consume_free_space(const struct vmci_qp *qpair); +s64 vmci_qpair_consume_buf_ready(const struct vmci_qp *qpair); +ssize_t vmci_qpair_enqueue(struct vmci_qp *qpair, +			   const void *buf, size_t buf_size, int mode); +ssize_t vmci_qpair_dequeue(struct vmci_qp *qpair, +			   void *buf, size_t buf_size, int mode); +ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size, +			int mode); +ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, +			  void *iov, size_t iov_size, int mode); +ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, +			  void *iov, size_t iov_size, int mode); +ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, void *iov, size_t iov_size, +			 int mode); + +#endif /* !__VMW_VMCI_API_H__ */ diff --git a/include/linux/vmw_vmci_defs.h b/include/linux/vmw_vmci_defs.h new file mode 100644 index 00000000000..65ac54c61c1 --- /dev/null +++ b/include/linux/vmw_vmci_defs.h @@ -0,0 +1,880 @@ +/* + * VMware VMCI Driver + * + * Copyright (C) 2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License + * for more details. + */ + +#ifndef _VMW_VMCI_DEF_H_ +#define _VMW_VMCI_DEF_H_ + +#include <linux/atomic.h> + +/* Register offsets. */ +#define VMCI_STATUS_ADDR      0x00 +#define VMCI_CONTROL_ADDR     0x04 +#define VMCI_ICR_ADDR	      0x08 +#define VMCI_IMR_ADDR         0x0c +#define VMCI_DATA_OUT_ADDR    0x10 +#define VMCI_DATA_IN_ADDR     0x14 +#define VMCI_CAPS_ADDR        0x18 +#define VMCI_RESULT_LOW_ADDR  0x1c +#define VMCI_RESULT_HIGH_ADDR 0x20 + +/* Max number of devices. */ +#define VMCI_MAX_DEVICES 1 + +/* Status register bits. */ +#define VMCI_STATUS_INT_ON     0x1 + +/* Control register bits. */ +#define VMCI_CONTROL_RESET        0x1 +#define VMCI_CONTROL_INT_ENABLE   0x2 +#define VMCI_CONTROL_INT_DISABLE  0x4 + +/* Capabilities register bits. */ +#define VMCI_CAPS_HYPERCALL     0x1 +#define VMCI_CAPS_GUESTCALL     0x2 +#define VMCI_CAPS_DATAGRAM      0x4 +#define VMCI_CAPS_NOTIFICATIONS 0x8 + +/* Interrupt Cause register bits. */ +#define VMCI_ICR_DATAGRAM      0x1 +#define VMCI_ICR_NOTIFICATION  0x2 + +/* Interrupt Mask register bits. */ +#define VMCI_IMR_DATAGRAM      0x1 +#define VMCI_IMR_NOTIFICATION  0x2 + +/* Interrupt type. */ +enum { +	VMCI_INTR_TYPE_INTX = 0, +	VMCI_INTR_TYPE_MSI = 1, +	VMCI_INTR_TYPE_MSIX = 2, +}; + +/* Maximum MSI/MSI-X interrupt vectors in the device. */ +#define VMCI_MAX_INTRS 2 + +/* + * Supported interrupt vectors.  There is one for each ICR value above, + * but here they indicate the position in the vector array/message ID. + */ +enum { +	VMCI_INTR_DATAGRAM = 0, +	VMCI_INTR_NOTIFICATION = 1, +}; + +/* + * A single VMCI device has an upper limit of 128MB on the amount of + * memory that can be used for queue pairs. + */ +#define VMCI_MAX_GUEST_QP_MEMORY (128 * 1024 * 1024) + +/* + * Queues with pre-mapped data pages must be small, so that we don't pin + * too much kernel memory (especially on vmkernel).  We limit a queuepair to + * 32 KB, or 16 KB per queue for symmetrical pairs. + */ +#define VMCI_MAX_PINNED_QP_MEMORY (32 * 1024) + +/* + * We have a fixed set of resource IDs available in the VMX. + * This allows us to have a very simple implementation since we statically + * know how many will create datagram handles. If a new caller arrives and + * we have run out of slots we can manually increment the maximum size of + * available resource IDs. + * + * VMCI reserved hypervisor datagram resource IDs. + */ +enum { +	VMCI_RESOURCES_QUERY = 0, +	VMCI_GET_CONTEXT_ID = 1, +	VMCI_SET_NOTIFY_BITMAP = 2, +	VMCI_DOORBELL_LINK = 3, +	VMCI_DOORBELL_UNLINK = 4, +	VMCI_DOORBELL_NOTIFY = 5, +	/* +	 * VMCI_DATAGRAM_REQUEST_MAP and VMCI_DATAGRAM_REMOVE_MAP are +	 * obsoleted by the removal of VM to VM communication. +	 */ +	VMCI_DATAGRAM_REQUEST_MAP = 6, +	VMCI_DATAGRAM_REMOVE_MAP = 7, +	VMCI_EVENT_SUBSCRIBE = 8, +	VMCI_EVENT_UNSUBSCRIBE = 9, +	VMCI_QUEUEPAIR_ALLOC = 10, +	VMCI_QUEUEPAIR_DETACH = 11, + +	/* +	 * VMCI_VSOCK_VMX_LOOKUP was assigned to 12 for Fusion 3.0/3.1, +	 * WS 7.0/7.1 and ESX 4.1 +	 */ +	VMCI_HGFS_TRANSPORT = 13, +	VMCI_UNITY_PBRPC_REGISTER = 14, +	VMCI_RPC_PRIVILEGED = 15, +	VMCI_RPC_UNPRIVILEGED = 16, +	VMCI_RESOURCE_MAX = 17, +}; + +/* + * struct vmci_handle - Ownership information structure + * @context:    The VMX context ID. + * @resource:   The resource ID (used for locating in resource hash). + * + * The vmci_handle structure is used to track resources used within + * vmw_vmci. + */ +struct vmci_handle { +	u32 context; +	u32 resource; +}; + +#define vmci_make_handle(_cid, _rid) \ +	(struct vmci_handle){ .context = _cid, .resource = _rid } + +static inline bool vmci_handle_is_equal(struct vmci_handle h1, +					struct vmci_handle h2) +{ +	return h1.context == h2.context && h1.resource == h2.resource; +} + +#define VMCI_INVALID_ID ~0 +static const struct vmci_handle VMCI_INVALID_HANDLE = { +	.context = VMCI_INVALID_ID, +	.resource = VMCI_INVALID_ID +}; + +static inline bool vmci_handle_is_invalid(struct vmci_handle h) +{ +	return vmci_handle_is_equal(h, VMCI_INVALID_HANDLE); +} + +/* + * The below defines can be used to send anonymous requests. + * This also indicates that no response is expected. + */ +#define VMCI_ANON_SRC_CONTEXT_ID   VMCI_INVALID_ID +#define VMCI_ANON_SRC_RESOURCE_ID  VMCI_INVALID_ID +static const struct vmci_handle VMCI_ANON_SRC_HANDLE = { +	.context = VMCI_ANON_SRC_CONTEXT_ID, +	.resource = VMCI_ANON_SRC_RESOURCE_ID +}; + +/* The lowest 16 context ids are reserved for internal use. */ +#define VMCI_RESERVED_CID_LIMIT ((u32) 16) + +/* + * Hypervisor context id, used for calling into hypervisor + * supplied services from the VM. + */ +#define VMCI_HYPERVISOR_CONTEXT_ID 0 + +/* + * Well-known context id, a logical context that contains a set of + * well-known services. This context ID is now obsolete. + */ +#define VMCI_WELL_KNOWN_CONTEXT_ID 1 + +/* + * Context ID used by host endpoints. + */ +#define VMCI_HOST_CONTEXT_ID  2 + +#define VMCI_CONTEXT_IS_VM(_cid) (VMCI_INVALID_ID != (_cid) &&		\ +				  (_cid) > VMCI_HOST_CONTEXT_ID) + +/* + * The VMCI_CONTEXT_RESOURCE_ID is used together with vmci_make_handle to make + * handles that refer to a specific context. + */ +#define VMCI_CONTEXT_RESOURCE_ID 0 + +/* + * VMCI error codes. + */ +enum { +	VMCI_SUCCESS_QUEUEPAIR_ATTACH	= 5, +	VMCI_SUCCESS_QUEUEPAIR_CREATE	= 4, +	VMCI_SUCCESS_LAST_DETACH	= 3, +	VMCI_SUCCESS_ACCESS_GRANTED	= 2, +	VMCI_SUCCESS_ENTRY_DEAD		= 1, +	VMCI_SUCCESS			 = 0, +	VMCI_ERROR_INVALID_RESOURCE	 = (-1), +	VMCI_ERROR_INVALID_ARGS		 = (-2), +	VMCI_ERROR_NO_MEM		 = (-3), +	VMCI_ERROR_DATAGRAM_FAILED	 = (-4), +	VMCI_ERROR_MORE_DATA		 = (-5), +	VMCI_ERROR_NO_MORE_DATAGRAMS	 = (-6), +	VMCI_ERROR_NO_ACCESS		 = (-7), +	VMCI_ERROR_NO_HANDLE		 = (-8), +	VMCI_ERROR_DUPLICATE_ENTRY	 = (-9), +	VMCI_ERROR_DST_UNREACHABLE	 = (-10), +	VMCI_ERROR_PAYLOAD_TOO_LARGE	 = (-11), +	VMCI_ERROR_INVALID_PRIV		 = (-12), +	VMCI_ERROR_GENERIC		 = (-13), +	VMCI_ERROR_PAGE_ALREADY_SHARED	 = (-14), +	VMCI_ERROR_CANNOT_SHARE_PAGE	 = (-15), +	VMCI_ERROR_CANNOT_UNSHARE_PAGE	 = (-16), +	VMCI_ERROR_NO_PROCESS		 = (-17), +	VMCI_ERROR_NO_DATAGRAM		 = (-18), +	VMCI_ERROR_NO_RESOURCES		 = (-19), +	VMCI_ERROR_UNAVAILABLE		 = (-20), +	VMCI_ERROR_NOT_FOUND		 = (-21), +	VMCI_ERROR_ALREADY_EXISTS	 = (-22), +	VMCI_ERROR_NOT_PAGE_ALIGNED	 = (-23), +	VMCI_ERROR_INVALID_SIZE		 = (-24), +	VMCI_ERROR_REGION_ALREADY_SHARED = (-25), +	VMCI_ERROR_TIMEOUT		 = (-26), +	VMCI_ERROR_DATAGRAM_INCOMPLETE	 = (-27), +	VMCI_ERROR_INCORRECT_IRQL	 = (-28), +	VMCI_ERROR_EVENT_UNKNOWN	 = (-29), +	VMCI_ERROR_OBSOLETE		 = (-30), +	VMCI_ERROR_QUEUEPAIR_MISMATCH	 = (-31), +	VMCI_ERROR_QUEUEPAIR_NOTSET	 = (-32), +	VMCI_ERROR_QUEUEPAIR_NOTOWNER	 = (-33), +	VMCI_ERROR_QUEUEPAIR_NOTATTACHED = (-34), +	VMCI_ERROR_QUEUEPAIR_NOSPACE	 = (-35), +	VMCI_ERROR_QUEUEPAIR_NODATA	 = (-36), +	VMCI_ERROR_BUSMEM_INVALIDATION	 = (-37), +	VMCI_ERROR_MODULE_NOT_LOADED	 = (-38), +	VMCI_ERROR_DEVICE_NOT_FOUND	 = (-39), +	VMCI_ERROR_QUEUEPAIR_NOT_READY	 = (-40), +	VMCI_ERROR_WOULD_BLOCK		 = (-41), + +	/* VMCI clients should return error code within this range */ +	VMCI_ERROR_CLIENT_MIN		 = (-500), +	VMCI_ERROR_CLIENT_MAX		 = (-550), + +	/* Internal error codes. */ +	VMCI_SHAREDMEM_ERROR_BAD_CONTEXT = (-1000), +}; + +/* VMCI reserved events. */ +enum { +	/* Only applicable to guest endpoints */ +	VMCI_EVENT_CTX_ID_UPDATE  = 0, + +	/* Applicable to guest and host */ +	VMCI_EVENT_CTX_REMOVED	  = 1, + +	/* Only applicable to guest endpoints */ +	VMCI_EVENT_QP_RESUMED	  = 2, + +	/* Applicable to guest and host */ +	VMCI_EVENT_QP_PEER_ATTACH = 3, + +	/* Applicable to guest and host */ +	VMCI_EVENT_QP_PEER_DETACH = 4, + +	/* +	 * Applicable to VMX and vmk.  On vmk, +	 * this event has the Context payload type. +	 */ +	VMCI_EVENT_MEM_ACCESS_ON  = 5, + +	/* +	 * Applicable to VMX and vmk.  Same as +	 * above for the payload type. +	 */ +	VMCI_EVENT_MEM_ACCESS_OFF = 6, +	VMCI_EVENT_MAX		  = 7, +}; + +/* + * Of the above events, a few are reserved for use in the VMX, and + * other endpoints (guest and host kernel) should not use them. For + * the rest of the events, we allow both host and guest endpoints to + * subscribe to them, to maintain the same API for host and guest + * endpoints. + */ +#define VMCI_EVENT_VALID_VMX(_event) ((_event) == VMCI_EVENT_MEM_ACCESS_ON || \ +				      (_event) == VMCI_EVENT_MEM_ACCESS_OFF) + +#define VMCI_EVENT_VALID(_event) ((_event) < VMCI_EVENT_MAX &&		\ +				  !VMCI_EVENT_VALID_VMX(_event)) + +/* Reserved guest datagram resource ids. */ +#define VMCI_EVENT_HANDLER 0 + +/* + * VMCI coarse-grained privileges (per context or host + * process/endpoint. An entity with the restricted flag is only + * allowed to interact with the hypervisor and trusted entities. + */ +enum { +	VMCI_NO_PRIVILEGE_FLAGS = 0, +	VMCI_PRIVILEGE_FLAG_RESTRICTED = 1, +	VMCI_PRIVILEGE_FLAG_TRUSTED = 2, +	VMCI_PRIVILEGE_ALL_FLAGS = (VMCI_PRIVILEGE_FLAG_RESTRICTED | +				    VMCI_PRIVILEGE_FLAG_TRUSTED), +	VMCI_DEFAULT_PROC_PRIVILEGE_FLAGS = VMCI_NO_PRIVILEGE_FLAGS, +	VMCI_LEAST_PRIVILEGE_FLAGS = VMCI_PRIVILEGE_FLAG_RESTRICTED, +	VMCI_MAX_PRIVILEGE_FLAGS = VMCI_PRIVILEGE_FLAG_TRUSTED, +}; + +/* 0 through VMCI_RESERVED_RESOURCE_ID_MAX are reserved. */ +#define VMCI_RESERVED_RESOURCE_ID_MAX 1023 + +/* + * Driver version. + * + * Increment major version when you make an incompatible change. + * Compatibility goes both ways (old driver with new executable + * as well as new driver with old executable). + */ + +/* Never change VMCI_VERSION_SHIFT_WIDTH */ +#define VMCI_VERSION_SHIFT_WIDTH 16 +#define VMCI_MAKE_VERSION(_major, _minor)			\ +	((_major) << VMCI_VERSION_SHIFT_WIDTH | (u16) (_minor)) + +#define VMCI_VERSION_MAJOR(v)  ((u32) (v) >> VMCI_VERSION_SHIFT_WIDTH) +#define VMCI_VERSION_MINOR(v)  ((u16) (v)) + +/* + * VMCI_VERSION is always the current version.  Subsequently listed + * versions are ways of detecting previous versions of the connecting + * application (i.e., VMX). + * + * VMCI_VERSION_NOVMVM: This version removed support for VM to VM + * communication. + * + * VMCI_VERSION_NOTIFY: This version introduced doorbell notification + * support. + * + * VMCI_VERSION_HOSTQP: This version introduced host end point support + * for hosted products. + * + * VMCI_VERSION_PREHOSTQP: This is the version prior to the adoption of + * support for host end-points. + * + * VMCI_VERSION_PREVERS2: This fictional version number is intended to + * represent the version of a VMX which doesn't call into the driver + * with ioctl VERSION2 and thus doesn't establish its version with the + * driver. + */ + +#define VMCI_VERSION                VMCI_VERSION_NOVMVM +#define VMCI_VERSION_NOVMVM         VMCI_MAKE_VERSION(11, 0) +#define VMCI_VERSION_NOTIFY         VMCI_MAKE_VERSION(10, 0) +#define VMCI_VERSION_HOSTQP         VMCI_MAKE_VERSION(9, 0) +#define VMCI_VERSION_PREHOSTQP      VMCI_MAKE_VERSION(8, 0) +#define VMCI_VERSION_PREVERS2       VMCI_MAKE_VERSION(1, 0) + +#define VMCI_SOCKETS_MAKE_VERSION(_p)					\ +	((((_p)[0] & 0xFF) << 24) | (((_p)[1] & 0xFF) << 16) | ((_p)[2])) + +/* + * The VMCI IOCTLs.  We use identity code 7, as noted in ioctl-number.h, and + * we start at sequence 9f.  This gives us the same values that our shipping + * products use, starting at 1951, provided we leave out the direction and + * structure size.  Note that VMMon occupies the block following us, starting + * at 2001. + */ +#define IOCTL_VMCI_VERSION			_IO(7, 0x9f)	/* 1951 */ +#define IOCTL_VMCI_INIT_CONTEXT			_IO(7, 0xa0) +#define IOCTL_VMCI_QUEUEPAIR_SETVA		_IO(7, 0xa4) +#define IOCTL_VMCI_NOTIFY_RESOURCE		_IO(7, 0xa5) +#define IOCTL_VMCI_NOTIFICATIONS_RECEIVE	_IO(7, 0xa6) +#define IOCTL_VMCI_VERSION2			_IO(7, 0xa7) +#define IOCTL_VMCI_QUEUEPAIR_ALLOC		_IO(7, 0xa8) +#define IOCTL_VMCI_QUEUEPAIR_SETPAGEFILE	_IO(7, 0xa9) +#define IOCTL_VMCI_QUEUEPAIR_DETACH		_IO(7, 0xaa) +#define IOCTL_VMCI_DATAGRAM_SEND		_IO(7, 0xab) +#define IOCTL_VMCI_DATAGRAM_RECEIVE		_IO(7, 0xac) +#define IOCTL_VMCI_CTX_ADD_NOTIFICATION		_IO(7, 0xaf) +#define IOCTL_VMCI_CTX_REMOVE_NOTIFICATION	_IO(7, 0xb0) +#define IOCTL_VMCI_CTX_GET_CPT_STATE		_IO(7, 0xb1) +#define IOCTL_VMCI_CTX_SET_CPT_STATE		_IO(7, 0xb2) +#define IOCTL_VMCI_GET_CONTEXT_ID		_IO(7, 0xb3) +#define IOCTL_VMCI_SOCKETS_VERSION		_IO(7, 0xb4) +#define IOCTL_VMCI_SOCKETS_GET_AF_VALUE		_IO(7, 0xb8) +#define IOCTL_VMCI_SOCKETS_GET_LOCAL_CID	_IO(7, 0xb9) +#define IOCTL_VMCI_SET_NOTIFY			_IO(7, 0xcb)	/* 1995 */ +/*IOCTL_VMMON_START				_IO(7, 0xd1)*/	/* 2001 */ + +/* + * struct vmci_queue_header - VMCI Queue Header information. + * + * A Queue cannot stand by itself as designed.  Each Queue's header + * contains a pointer into itself (the producer_tail) and into its peer + * (consumer_head).  The reason for the separation is one of + * accessibility: Each end-point can modify two things: where the next + * location to enqueue is within its produce_q (producer_tail); and + * where the next dequeue location is in its consume_q (consumer_head). + * + * An end-point cannot modify the pointers of its peer (guest to + * guest; NOTE that in the host both queue headers are mapped r/w). + * But, each end-point needs read access to both Queue header + * structures in order to determine how much space is used (or left) + * in the Queue.  This is because for an end-point to know how full + * its produce_q is, it needs to use the consumer_head that points into + * the produce_q but -that- consumer_head is in the Queue header for + * that end-points consume_q. + * + * Thoroughly confused?  Sorry. + * + * producer_tail: the point to enqueue new entrants.  When you approach + * a line in a store, for example, you walk up to the tail. + * + * consumer_head: the point in the queue from which the next element is + * dequeued.  In other words, who is next in line is he who is at the + * head of the line. + * + * Also, producer_tail points to an empty byte in the Queue, whereas + * consumer_head points to a valid byte of data (unless producer_tail == + * consumer_head in which case consumer_head does not point to a valid + * byte of data). + * + * For a queue of buffer 'size' bytes, the tail and head pointers will be in + * the range [0, size-1]. + * + * If produce_q_header->producer_tail == consume_q_header->consumer_head + * then the produce_q is empty. + */ +struct vmci_queue_header { +	/* All fields are 64bit and aligned. */ +	struct vmci_handle handle;	/* Identifier. */ +	atomic64_t producer_tail;	/* Offset in this queue. */ +	atomic64_t consumer_head;	/* Offset in peer queue. */ +}; + +/* + * struct vmci_datagram - Base struct for vmci datagrams. + * @dst:        A vmci_handle that tracks the destination of the datagram. + * @src:        A vmci_handle that tracks the source of the datagram. + * @payload_size:       The size of the payload. + * + * vmci_datagram structs are used when sending vmci datagrams.  They include + * the necessary source and destination information to properly route + * the information along with the size of the package. + */ +struct vmci_datagram { +	struct vmci_handle dst; +	struct vmci_handle src; +	u64 payload_size; +}; + +/* + * Second flag is for creating a well-known handle instead of a per context + * handle.  Next flag is for deferring datagram delivery, so that the + * datagram callback is invoked in a delayed context (not interrupt context). + */ +#define VMCI_FLAG_DG_NONE          0 +#define VMCI_FLAG_WELLKNOWN_DG_HND 0x1 +#define VMCI_FLAG_ANYCID_DG_HND    0x2 +#define VMCI_FLAG_DG_DELAYED_CB    0x4 + +/* + * Maximum supported size of a VMCI datagram for routable datagrams. + * Datagrams going to the hypervisor are allowed to be larger. + */ +#define VMCI_MAX_DG_SIZE (17 * 4096) +#define VMCI_MAX_DG_PAYLOAD_SIZE (VMCI_MAX_DG_SIZE - \ +				  sizeof(struct vmci_datagram)) +#define VMCI_DG_PAYLOAD(_dg) (void *)((char *)(_dg) +			\ +				      sizeof(struct vmci_datagram)) +#define VMCI_DG_HEADERSIZE sizeof(struct vmci_datagram) +#define VMCI_DG_SIZE(_dg) (VMCI_DG_HEADERSIZE + (size_t)(_dg)->payload_size) +#define VMCI_DG_SIZE_ALIGNED(_dg) ((VMCI_DG_SIZE(_dg) + 7) & (~((size_t) 0x7))) +#define VMCI_MAX_DATAGRAM_QUEUE_SIZE (VMCI_MAX_DG_SIZE * 2) + +struct vmci_event_payload_qp { +	struct vmci_handle handle;  /* queue_pair handle. */ +	u32 peer_id;		    /* Context id of attaching/detaching VM. */ +	u32 _pad; +}; + +/* Flags for VMCI queue_pair API. */ +enum { +	/* Fail alloc if QP not created by peer. */ +	VMCI_QPFLAG_ATTACH_ONLY = 1 << 0, + +	/* Only allow attaches from local context. */ +	VMCI_QPFLAG_LOCAL = 1 << 1, + +	/* Host won't block when guest is quiesced. */ +	VMCI_QPFLAG_NONBLOCK = 1 << 2, + +	/* Pin data pages in ESX.  Used with NONBLOCK */ +	VMCI_QPFLAG_PINNED = 1 << 3, + +	/* Update the following flag when adding new flags. */ +	VMCI_QP_ALL_FLAGS = (VMCI_QPFLAG_ATTACH_ONLY | VMCI_QPFLAG_LOCAL | +			     VMCI_QPFLAG_NONBLOCK | VMCI_QPFLAG_PINNED), + +	/* Convenience flags */ +	VMCI_QP_ASYMM = (VMCI_QPFLAG_NONBLOCK | VMCI_QPFLAG_PINNED), +	VMCI_QP_ASYMM_PEER = (VMCI_QPFLAG_ATTACH_ONLY | VMCI_QP_ASYMM), +}; + +/* + * We allow at least 1024 more event datagrams from the hypervisor past the + * normally allowed datagrams pending for a given context.  We define this + * limit on event datagrams from the hypervisor to guard against DoS attack + * from a malicious VM which could repeatedly attach to and detach from a queue + * pair, causing events to be queued at the destination VM.  However, the rate + * at which such events can be generated is small since it requires a VM exit + * and handling of queue pair attach/detach call at the hypervisor.  Event + * datagrams may be queued up at the destination VM if it has interrupts + * disabled or if it is not draining events for some other reason.  1024 + * datagrams is a grossly conservative estimate of the time for which + * interrupts may be disabled in the destination VM, but at the same time does + * not exacerbate the memory pressure problem on the host by much (size of each + * event datagram is small). + */ +#define VMCI_MAX_DATAGRAM_AND_EVENT_QUEUE_SIZE				\ +	(VMCI_MAX_DATAGRAM_QUEUE_SIZE +					\ +	 1024 * (sizeof(struct vmci_datagram) +				\ +		 sizeof(struct vmci_event_data_max))) + +/* + * Struct used for querying, via VMCI_RESOURCES_QUERY, the availability of + * hypervisor resources.  Struct size is 16 bytes. All fields in struct are + * aligned to their natural alignment. + */ +struct vmci_resource_query_hdr { +	struct vmci_datagram hdr; +	u32 num_resources; +	u32 _padding; +}; + +/* + * Convenience struct for negotiating vectors. Must match layout of + * VMCIResourceQueryHdr minus the struct vmci_datagram header. + */ +struct vmci_resource_query_msg { +	u32 num_resources; +	u32 _padding; +	u32 resources[1]; +}; + +/* + * The maximum number of resources that can be queried using + * VMCI_RESOURCE_QUERY is 31, as the result is encoded in the lower 31 + * bits of a positive return value. Negative values are reserved for + * errors. + */ +#define VMCI_RESOURCE_QUERY_MAX_NUM 31 + +/* Maximum size for the VMCI_RESOURCE_QUERY request. */ +#define VMCI_RESOURCE_QUERY_MAX_SIZE				\ +	(sizeof(struct vmci_resource_query_hdr) +		\ +	 sizeof(u32) * VMCI_RESOURCE_QUERY_MAX_NUM) + +/* + * Struct used for setting the notification bitmap.  All fields in + * struct are aligned to their natural alignment. + */ +struct vmci_notify_bm_set_msg { +	struct vmci_datagram hdr; +	u32 bitmap_ppn; +	u32 _pad; +}; + +/* + * Struct used for linking a doorbell handle with an index in the + * notify bitmap. All fields in struct are aligned to their natural + * alignment. + */ +struct vmci_doorbell_link_msg { +	struct vmci_datagram hdr; +	struct vmci_handle handle; +	u64 notify_idx; +}; + +/* + * Struct used for unlinking a doorbell handle from an index in the + * notify bitmap. All fields in struct are aligned to their natural + * alignment. + */ +struct vmci_doorbell_unlink_msg { +	struct vmci_datagram hdr; +	struct vmci_handle handle; +}; + +/* + * Struct used for generating a notification on a doorbell handle. All + * fields in struct are aligned to their natural alignment. + */ +struct vmci_doorbell_notify_msg { +	struct vmci_datagram hdr; +	struct vmci_handle handle; +}; + +/* + * This struct is used to contain data for events.  Size of this struct is a + * multiple of 8 bytes, and all fields are aligned to their natural alignment. + */ +struct vmci_event_data { +	u32 event;		/* 4 bytes. */ +	u32 _pad; +	/* Event payload is put here. */ +}; + +/* + * Define the different VMCI_EVENT payload data types here.  All structs must + * be a multiple of 8 bytes, and fields must be aligned to their natural + * alignment. + */ +struct vmci_event_payld_ctx { +	u32 context_id;	/* 4 bytes. */ +	u32 _pad; +}; + +struct vmci_event_payld_qp { +	struct vmci_handle handle;  /* queue_pair handle. */ +	u32 peer_id;	    /* Context id of attaching/detaching VM. */ +	u32 _pad; +}; + +/* + * We define the following struct to get the size of the maximum event + * data the hypervisor may send to the guest.  If adding a new event + * payload type above, add it to the following struct too (inside the + * union). + */ +struct vmci_event_data_max { +	struct vmci_event_data event_data; +	union { +		struct vmci_event_payld_ctx context_payload; +		struct vmci_event_payld_qp qp_payload; +	} ev_data_payload; +}; + +/* + * Struct used for VMCI_EVENT_SUBSCRIBE/UNSUBSCRIBE and + * VMCI_EVENT_HANDLER messages.  Struct size is 32 bytes.  All fields + * in struct are aligned to their natural alignment. + */ +struct vmci_event_msg { +	struct vmci_datagram hdr; + +	/* Has event type and payload. */ +	struct vmci_event_data event_data; + +	/* Payload gets put here. */ +}; + +/* Event with context payload. */ +struct vmci_event_ctx { +	struct vmci_event_msg msg; +	struct vmci_event_payld_ctx payload; +}; + +/* Event with QP payload. */ +struct vmci_event_qp { +	struct vmci_event_msg msg; +	struct vmci_event_payld_qp payload; +}; + +/* + * Structs used for queue_pair alloc and detach messages.  We align fields of + * these structs to 64bit boundaries. + */ +struct vmci_qp_alloc_msg { +	struct vmci_datagram hdr; +	struct vmci_handle handle; +	u32 peer; +	u32 flags; +	u64 produce_size; +	u64 consume_size; +	u64 num_ppns; + +	/* List of PPNs placed here. */ +}; + +struct vmci_qp_detach_msg { +	struct vmci_datagram hdr; +	struct vmci_handle handle; +}; + +/* VMCI Doorbell API. */ +#define VMCI_FLAG_DELAYED_CB 0x01 + +typedef void (*vmci_callback) (void *client_data); + +/* + * struct vmci_qp - A vmw_vmci queue pair handle. + * + * This structure is used as a handle to a queue pair created by + * VMCI.  It is intentionally left opaque to clients. + */ +struct vmci_qp; + +/* Callback needed for correctly waiting on events. */ +typedef int (*vmci_datagram_recv_cb) (void *client_data, +				      struct vmci_datagram *msg); + +/* VMCI Event API. */ +typedef void (*vmci_event_cb) (u32 sub_id, const struct vmci_event_data *ed, +			       void *client_data); + +/* + * We use the following inline function to access the payload data + * associated with an event data. + */ +static inline const void * +vmci_event_data_const_payload(const struct vmci_event_data *ev_data) +{ +	return (const char *)ev_data + sizeof(*ev_data); +} + +static inline void *vmci_event_data_payload(struct vmci_event_data *ev_data) +{ +	return (void *)vmci_event_data_const_payload(ev_data); +} + +/* + * Helper to add a given offset to a head or tail pointer. Wraps the + * value of the pointer around the max size of the queue. + */ +static inline void vmci_qp_add_pointer(atomic64_t *var, +				       size_t add, +				       u64 size) +{ +	u64 new_val = atomic64_read(var); + +	if (new_val >= size - add) +		new_val -= size; + +	new_val += add; + +	atomic64_set(var, new_val); +} + +/* + * Helper routine to get the Producer Tail from the supplied queue. + */ +static inline u64 +vmci_q_header_producer_tail(const struct vmci_queue_header *q_header) +{ +	struct vmci_queue_header *qh = (struct vmci_queue_header *)q_header; +	return atomic64_read(&qh->producer_tail); +} + +/* + * Helper routine to get the Consumer Head from the supplied queue. + */ +static inline u64 +vmci_q_header_consumer_head(const struct vmci_queue_header *q_header) +{ +	struct vmci_queue_header *qh = (struct vmci_queue_header *)q_header; +	return atomic64_read(&qh->consumer_head); +} + +/* + * Helper routine to increment the Producer Tail.  Fundamentally, + * vmci_qp_add_pointer() is used to manipulate the tail itself. + */ +static inline void +vmci_q_header_add_producer_tail(struct vmci_queue_header *q_header, +				size_t add, +				u64 queue_size) +{ +	vmci_qp_add_pointer(&q_header->producer_tail, add, queue_size); +} + +/* + * Helper routine to increment the Consumer Head.  Fundamentally, + * vmci_qp_add_pointer() is used to manipulate the head itself. + */ +static inline void +vmci_q_header_add_consumer_head(struct vmci_queue_header *q_header, +				size_t add, +				u64 queue_size) +{ +	vmci_qp_add_pointer(&q_header->consumer_head, add, queue_size); +} + +/* + * Helper routine for getting the head and the tail pointer for a queue. + * Both the VMCIQueues are needed to get both the pointers for one queue. + */ +static inline void +vmci_q_header_get_pointers(const struct vmci_queue_header *produce_q_header, +			   const struct vmci_queue_header *consume_q_header, +			   u64 *producer_tail, +			   u64 *consumer_head) +{ +	if (producer_tail) +		*producer_tail = vmci_q_header_producer_tail(produce_q_header); + +	if (consumer_head) +		*consumer_head = vmci_q_header_consumer_head(consume_q_header); +} + +static inline void vmci_q_header_init(struct vmci_queue_header *q_header, +				      const struct vmci_handle handle) +{ +	q_header->handle = handle; +	atomic64_set(&q_header->producer_tail, 0); +	atomic64_set(&q_header->consumer_head, 0); +} + +/* + * Finds available free space in a produce queue to enqueue more + * data or reports an error if queue pair corruption is detected. + */ +static s64 +vmci_q_header_free_space(const struct vmci_queue_header *produce_q_header, +			 const struct vmci_queue_header *consume_q_header, +			 const u64 produce_q_size) +{ +	u64 tail; +	u64 head; +	u64 free_space; + +	tail = vmci_q_header_producer_tail(produce_q_header); +	head = vmci_q_header_consumer_head(consume_q_header); + +	if (tail >= produce_q_size || head >= produce_q_size) +		return VMCI_ERROR_INVALID_SIZE; + +	/* +	 * Deduct 1 to avoid tail becoming equal to head which causes +	 * ambiguity. If head and tail are equal it means that the +	 * queue is empty. +	 */ +	if (tail >= head) +		free_space = produce_q_size - (tail - head) - 1; +	else +		free_space = head - tail - 1; + +	return free_space; +} + +/* + * vmci_q_header_free_space() does all the heavy lifting of + * determing the number of free bytes in a Queue.  This routine, + * then subtracts that size from the full size of the Queue so + * the caller knows how many bytes are ready to be dequeued. + * Results: + * On success, available data size in bytes (up to MAX_INT64). + * On failure, appropriate error code. + */ +static inline s64 +vmci_q_header_buf_ready(const struct vmci_queue_header *consume_q_header, +			const struct vmci_queue_header *produce_q_header, +			const u64 consume_q_size) +{ +	s64 free_space; + +	free_space = vmci_q_header_free_space(consume_q_header, +					      produce_q_header, consume_q_size); +	if (free_space < VMCI_SUCCESS) +		return free_space; + +	return consume_q_size - free_space - 1; +} + + +#endif /* _VMW_VMCI_DEF_H_ */ diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 50ae7d0c279..e8d65718560 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h @@ -47,6 +47,7 @@ int con_set_cmap(unsigned char __user *cmap);  int con_get_cmap(unsigned char __user *cmap);  void scrollback(struct vc_data *vc, int lines);  void scrollfront(struct vc_data *vc, int lines); +void clear_buffer_attributes(struct vc_data *vc);  void update_region(struct vc_data *vc, unsigned long start, int count);  void redraw_screen(struct vc_data *vc, int is_switch);  #define update_screen(x) redraw_screen(x, 0) @@ -130,6 +131,8 @@ void vt_event_post(unsigned int event, unsigned int old, unsigned int new);  int vt_waitactive(int n);  void change_console(struct vc_data *new_vc);  void reset_vc(struct vc_data *vc); +extern int do_unbind_con_driver(const struct consw *csw, int first, int last, +			     int deflt);  extern int unbind_con_driver(const struct consw *csw, int first, int last,  			     int deflt);  int vty_init(const struct file_operations *console_fops); diff --git a/include/linux/wanrouter.h b/include/linux/wanrouter.h index cec4b415976..8198a63cf45 100644 --- a/include/linux/wanrouter.h +++ b/include/linux/wanrouter.h @@ -1,129 +1,10 @@ -/***************************************************************************** -* wanrouter.h	Definitions for the WAN Multiprotocol Router Module. -*		This module provides API and common services for WAN Link -*		Drivers and is completely hardware-independent. -* -* Author: 	Nenad Corbic <ncorbic@sangoma.com> -*		Gideon Hack 	 -* Additions:	Arnaldo Melo -* -* Copyright:	(c) 1995-2000 Sangoma Technologies Inc. -* -*		This program is free software; you can redistribute it and/or -*		modify it under the terms of the GNU General Public License -*		as published by the Free Software Foundation; either version -*		2 of the License, or (at your option) any later version. -* ============================================================================ -* Jul 21, 2000  Nenad Corbic	Added WAN_FT1_READY State -* Feb 24, 2000  Nenad Corbic    Added support for socket based x25api -* Jan 28, 2000  Nenad Corbic    Added support for the ASYNC protocol. -* Oct 04, 1999  Nenad Corbic 	Updated for 2.1.0 release -* Jun 02, 1999  Gideon Hack	Added support for the S514 adapter. -* May 23, 1999	Arnaldo Melo	Added local_addr to wanif_conf_t -*				WAN_DISCONNECTING state added -* Jul 20, 1998	David Fong	Added Inverse ARP options to 'wanif_conf_t' -* Jun 12, 1998	David Fong	Added Cisco HDLC support. -* Dec 16, 1997	Jaspreet Singh	Moved 'enable_IPX' and 'network_number' to -*				'wanif_conf_t' -* Dec 05, 1997	Jaspreet Singh	Added 'pap', 'chap' to 'wanif_conf_t' -*				Added 'authenticator' to 'wan_ppp_conf_t' -* Nov 06, 1997	Jaspreet Singh	Changed Router Driver version to 1.1 from 1.0 -* Oct 20, 1997	Jaspreet Singh	Added 'cir','bc','be' and 'mc' to 'wanif_conf_t' -*				Added 'enable_IPX' and 'network_number' to  -*				'wan_device_t'.  Also added defines for -*				UDP PACKET TYPE, Interrupt test, critical values -*				for RACE conditions. -* Oct 05, 1997	Jaspreet Singh	Added 'dlci_num' and 'dlci[100]' to  -*				'wan_fr_conf_t' to configure a list of dlci(s) -*				for a NODE  -* Jul 07, 1997	Jaspreet Singh	Added 'ttl' to 'wandev_conf_t' & 'wan_device_t' -* May 29, 1997 	Jaspreet Singh	Added 'tx_int_enabled' to 'wan_device_t' -* May 21, 1997	Jaspreet Singh	Added 'udp_port' to 'wan_device_t' -* Apr 25, 1997  Farhan Thawar   Added 'udp_port' to 'wandev_conf_t' -* Jan 16, 1997	Gene Kozin	router_devlist made public -* Jan 02, 1997	Gene Kozin	Initial version (based on wanpipe.h). -*****************************************************************************/ +/* + * wanrouter.h	Legacy declarations kept around until X25 is removed + */ +  #ifndef	_ROUTER_H  #define	_ROUTER_H  #include <uapi/linux/wanrouter.h> -/****** Kernel Interface ****************************************************/ - -#include <linux/fs.h>		/* support for device drivers */ -#include <linux/proc_fs.h>	/* proc filesystem pragmatics */ -#include <linux/netdevice.h>	/* support for network drivers */ -#include <linux/spinlock.h>     /* Support for SMP Locking */ - -/*---------------------------------------------------------------------------- - * WAN device data space. - */ -struct wan_device { -	unsigned magic;			/* magic number */ -	char* name;			/* -> WAN device name (ASCIIZ) */ -	void* private;			/* -> driver private data */ -	unsigned config_id;		/* Configuration ID */ -					/****** hardware configuration ******/ -	unsigned ioport;		/* adapter I/O port base #1 */ -	char S514_cpu_no[1];		/* PCI CPU Number */ -	unsigned char S514_slot_no;	/* PCI Slot Number */ -	unsigned long maddr;		/* dual-port memory address */ -	unsigned msize;			/* dual-port memory size */ -	int irq;			/* interrupt request level */ -	int dma;			/* DMA request level */ -	unsigned bps;			/* data transfer rate */ -	unsigned mtu;			/* max physical transmit unit size */ -	unsigned udp_port;              /* UDP port for management */ -        unsigned char ttl;		/* Time To Live for UDP security */ -	unsigned enable_tx_int; 	/* Transmit Interrupt enabled or not */ -	char interface;			/* RS-232/V.35, etc. */ -	char clocking;			/* external/internal */ -	char line_coding;		/* NRZ/NRZI/FM0/FM1, etc. */ -	char station;			/* DTE/DCE, primary/secondary, etc. */ -	char connection;		/* permanent/switched/on-demand */ -	char signalling;		/* Signalling RS232 or V35 */ -	char read_mode;			/* read mode: Polling or interrupt */ -	char new_if_cnt;                /* Number of interfaces per wanpipe */  -	char del_if_cnt;		/* Number of times del_if() gets called */ -	unsigned char piggyback;        /* Piggibacking a port */ -	unsigned hw_opt[4];		/* other hardware options */ -					/****** status and statistics *******/ -	char state;			/* device state */ -	char api_status;		/* device api status */ -	struct net_device_stats stats; 	/* interface statistics */ -	unsigned reserved[16];		/* reserved for future use */ -	unsigned long critical;		/* critical section flag */ -	spinlock_t lock;                /* Support for SMP Locking */ - -					/****** device management methods ***/ -	int (*setup) (struct wan_device *wandev, wandev_conf_t *conf); -	int (*shutdown) (struct wan_device *wandev); -	int (*update) (struct wan_device *wandev); -	int (*ioctl) (struct wan_device *wandev, unsigned cmd, -		unsigned long arg); -	int (*new_if)(struct wan_device *wandev, struct net_device *dev, -		      wanif_conf_t *conf); -	int (*del_if)(struct wan_device *wandev, struct net_device *dev); -					/****** maintained by the router ****/ -	struct wan_device* next;	/* -> next device */ -	struct net_device* dev;		/* list of network interfaces */ -	unsigned ndev;			/* number of interfaces */ -	struct proc_dir_entry *dent;	/* proc filesystem entry */ -}; - -/* Public functions available for device drivers */ -extern int register_wan_device(struct wan_device *wandev); -extern int unregister_wan_device(char *name); - -/* Proc interface functions. These must not be called by the drivers! */ -extern int wanrouter_proc_init(void); -extern void wanrouter_proc_cleanup(void); -extern int wanrouter_proc_add(struct wan_device *wandev); -extern int wanrouter_proc_delete(struct wan_device *wandev); -extern long wanrouter_ioctl(struct file *file, unsigned int cmd, unsigned long arg); - -/* Public Data */ -/* list of registered devices */ -extern struct wan_device *wanrouter_router_devlist; -  #endif	/* _ROUTER_H */ diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 3a9df2f43be..2a3038ee17a 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -118,6 +118,13 @@ static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool noway  		set_bit(WDOG_NO_WAY_OUT, &wdd->status);  } +/* Use the following function to check if a timeout value is invalid */ +static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t) +{ +	return ((wdd->max_timeout != 0) && +		(t < wdd->min_timeout || t > wdd->max_timeout)); +} +  /* Use the following functions to manipulate watchdog driver specific data */  static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)  { @@ -130,6 +137,8 @@ static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)  }  /* drivers/watchdog/watchdog_core.c */ +extern int watchdog_init_timeout(struct watchdog_device *wdd, +				  unsigned int timeout_parm, struct device *dev);  extern int watchdog_register_device(struct watchdog_device *);  extern void watchdog_unregister_device(struct watchdog_device *); diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h index 0d6373195d3..a54fe82e704 100644 --- a/include/linux/wl12xx.h +++ b/include/linux/wl12xx.h @@ -24,6 +24,8 @@  #ifndef _LINUX_WL12XX_H  #define _LINUX_WL12XX_H +#include <linux/err.h> +  /* Reference clock values */  enum {  	WL12XX_REFCLOCK_19	= 0, /* 19.2 MHz */ @@ -55,17 +57,17 @@ struct wl12xx_platform_data {  	int board_tcxo_clock;  	unsigned long platform_quirks;  	bool pwr_in_suspend; - -	struct wl1271_if_operations *ops;  };  /* Platform does not support level trigger interrupts */  #define WL12XX_PLATFORM_QUIRK_EDGE_IRQ	BIT(0) -#ifdef CONFIG_WL12XX_PLATFORM_DATA +#ifdef CONFIG_WILINK_PLATFORM_DATA  int wl12xx_set_platform_data(const struct wl12xx_platform_data *data); +struct wl12xx_platform_data *wl12xx_get_platform_data(void); +  #else  static inline @@ -74,8 +76,12 @@ int wl12xx_set_platform_data(const struct wl12xx_platform_data *data)  	return -ENOSYS;  } -#endif +static inline +struct wl12xx_platform_data *wl12xx_get_platform_data(void) +{ +	return ERR_PTR(-ENODATA); +} -struct wl12xx_platform_data *wl12xx_get_platform_data(void); +#endif  #endif diff --git a/include/linux/writeback.h b/include/linux/writeback.h index b82a83aba31..9a9367c0c07 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -87,9 +87,9 @@ int inode_wait(void *);  void writeback_inodes_sb(struct super_block *, enum wb_reason reason);  void writeback_inodes_sb_nr(struct super_block *, unsigned long nr,  							enum wb_reason reason); -int writeback_inodes_sb_if_idle(struct super_block *, enum wb_reason reason); -int writeback_inodes_sb_nr_if_idle(struct super_block *, unsigned long nr, -							enum wb_reason reason); +int try_to_writeback_inodes_sb(struct super_block *, enum wb_reason reason); +int try_to_writeback_inodes_sb_nr(struct super_block *, unsigned long nr, +				  enum wb_reason reason);  void sync_inodes_sb(struct super_block *);  long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages,  				enum wb_reason reason); diff --git a/include/media/adv7343.h b/include/media/adv7343.h index d6f8a4e1a1f..944757be49b 100644 --- a/include/media/adv7343.h +++ b/include/media/adv7343.h @@ -20,4 +20,56 @@  #define ADV7343_COMPONENT_ID	(1)  #define ADV7343_SVIDEO_ID	(2) +/** + * adv7343_power_mode - power mode configuration. + * @sleep_mode: on enable the current consumption is reduced to micro ampere + *		level. All DACs and the internal PLL circuit are disabled. + *		Registers can be read from and written in sleep mode. + * @pll_control: PLL and oversampling control. This control allows internal + *		 PLL 1 circuit to be powered down and the oversampling to be + *		 switched off. + * @dac_1: power on/off DAC 1. + * @dac_2: power on/off DAC 2. + * @dac_3: power on/off DAC 3. + * @dac_4: power on/off DAC 4. + * @dac_5: power on/off DAC 5. + * @dac_6: power on/off DAC 6. + * + * Power mode register (Register 0x0), for more info refer REGISTER MAP ACCESS + * section of datasheet[1], table 17 page no 30. + * + * [1] http://www.analog.com/static/imported-files/data_sheets/ADV7342_7343.pdf + */ +struct adv7343_power_mode { +	bool sleep_mode; +	bool pll_control; +	bool dac_1; +	bool dac_2; +	bool dac_3; +	bool dac_4; +	bool dac_5; +	bool dac_6; +}; + +/** + * struct adv7343_sd_config - SD Only Output Configuration. + * @sd_dac_out1: Configure SD DAC Output 1. + * @sd_dac_out2: Configure SD DAC Output 2. + */ +struct adv7343_sd_config { +	/* SD only Output Configuration */ +	bool sd_dac_out1; +	bool sd_dac_out2; +}; + +/** + * struct adv7343_platform_data - Platform data values and access functions. + * @mode_config: Configuration for power mode. + * @sd_config: SD Only Configuration. + */ +struct adv7343_platform_data { +	struct adv7343_power_mode mode_config; +	struct adv7343_sd_config sd_config; +}; +  #endif				/* End of #ifndef ADV7343_H */ diff --git a/include/media/blackfin/bfin_capture.h b/include/media/blackfin/bfin_capture.h index 2038a8a3f8a..56b9ce4472f 100644 --- a/include/media/blackfin/bfin_capture.h +++ b/include/media/blackfin/bfin_capture.h @@ -9,6 +9,7 @@ struct ppi_info;  struct bcap_route {  	u32 input;  	u32 output; +	u32 ppi_control;  };  struct bfin_capture_config { @@ -30,8 +31,8 @@ struct bfin_capture_config {  	unsigned long ppi_control;  	/* ppi interrupt mask */  	u32 int_mask; -	/* horizontal blanking clocks */ -	int blank_clocks; +	/* horizontal blanking pixels */ +	int blank_pixels;  };  #endif diff --git a/include/media/blackfin/ppi.h b/include/media/blackfin/ppi.h index 8f72f8a0b3d..d0697f4edf8 100644 --- a/include/media/blackfin/ppi.h +++ b/include/media/blackfin/ppi.h @@ -21,22 +21,42 @@  #define _PPI_H_  #include <linux/interrupt.h> +#include <asm/blackfin.h> +#include <asm/bfin_ppi.h> +/* EPPI */  #ifdef EPPI_EN  #define PORT_EN EPPI_EN +#define PORT_DIR EPPI_DIR  #define DMA32 0  #define PACK_EN PACKEN  #endif +/* EPPI3 */ +#ifdef EPPI0_CTL2 +#define PORT_EN EPPI_CTL_EN +#define PORT_DIR EPPI_CTL_DIR +#define PACK_EN EPPI_CTL_PACKEN +#define DMA32 0 +#define DLEN_8 EPPI_CTL_DLEN08 +#define DLEN_16 EPPI_CTL_DLEN16 +#endif +  struct ppi_if;  struct ppi_params { -	int width; -	int height; -	int bpp; -	unsigned long ppi_control; -	u32 int_mask; -	int blank_clocks; +	u32 width;              /* width in pixels */ +	u32 height;             /* height in lines */ +	u32 hdelay;             /* delay after the HSYNC in pixels */ +	u32 vdelay;             /* delay after the VSYNC in lines */ +	u32 line;               /* total pixels per line */ +	u32 frame;              /* total lines per frame */ +	u32 hsync;              /* HSYNC length in pixels */ +	u32 vsync;              /* VSYNC length in lines */ +	int bpp;                /* bits per pixel */ +	int dlen;               /* data length for ppi in bits */ +	u32 ppi_control;        /* ppi configuration */ +	u32 int_mask;           /* interrupt mask */  };  struct ppi_ops { @@ -51,6 +71,7 @@ struct ppi_ops {  enum ppi_type {  	PPI_TYPE_PPI,  	PPI_TYPE_EPPI, +	PPI_TYPE_EPPI3,  };  struct ppi_info { @@ -65,7 +86,8 @@ struct ppi_if {  	unsigned long ppi_control;  	const struct ppi_ops *ops;  	const struct ppi_info *info; -	bool err_int; +	bool err_int; /* if we need request error interrupt */ +	bool err; /* if ppi has fifo error */  	void *priv;  }; diff --git a/include/media/davinci/vpbe_osd.h b/include/media/davinci/vpbe_osd.h index 5ab0d8d41f6..42628fcfe1b 100644 --- a/include/media/davinci/vpbe_osd.h +++ b/include/media/davinci/vpbe_osd.h @@ -26,7 +26,9 @@  #include <media/davinci/vpbe_types.h> -#define VPBE_OSD_SUBDEV_NAME "vpbe-osd" +#define DM644X_VPBE_OSD_SUBDEV_NAME	"dm644x,vpbe-osd" +#define DM365_VPBE_OSD_SUBDEV_NAME	"dm365,vpbe-osd" +#define DM355_VPBE_OSD_SUBDEV_NAME	"dm355,vpbe-osd"  /**   * enum osd_layer @@ -387,7 +389,6 @@ struct osd_state {  };  struct osd_platform_data { -	enum vpbe_version vpbe_type;  	int  field_inv_wa_enable;  }; diff --git a/include/media/davinci/vpbe_venc.h b/include/media/davinci/vpbe_venc.h index cc78c2eb16d..476fafc2f52 100644 --- a/include/media/davinci/vpbe_venc.h +++ b/include/media/davinci/vpbe_venc.h @@ -20,7 +20,9 @@  #include <media/v4l2-subdev.h>  #include <media/davinci/vpbe_types.h> -#define VPBE_VENC_SUBDEV_NAME "vpbe-venc" +#define DM644X_VPBE_VENC_SUBDEV_NAME	"dm644x,vpbe-venc" +#define DM365_VPBE_VENC_SUBDEV_NAME	"dm365,vpbe-venc" +#define DM355_VPBE_VENC_SUBDEV_NAME	"dm355,vpbe-venc"  /* venc events */  #define VENC_END_OF_FRAME	BIT(0) @@ -28,7 +30,6 @@  #define VENC_SECOND_FIELD	BIT(2)  struct venc_platform_data { -	enum vpbe_version venc_type;  	int (*setup_pinmux)(enum v4l2_mbus_pixelcode if_type,  			    int field);  	int (*setup_clock)(enum vpbe_enc_timings_type type, diff --git a/include/media/davinci/vpss.h b/include/media/davinci/vpss.h index b586495bcd5..153473daaa3 100644 --- a/include/media/davinci/vpss.h +++ b/include/media/davinci/vpss.h @@ -105,4 +105,20 @@ enum vpss_wbl_sel {  };  /* clear wbl overflow flag for DM6446 */  int vpss_clear_wbl_overflow(enum vpss_wbl_sel wbl_sel); + +/* set sync polarity*/ +void vpss_set_sync_pol(struct vpss_sync_pol sync); +/* set the PG_FRAME_SIZE register */ +void vpss_set_pg_frame_size(struct vpss_pg_frame_size frame_size); +/* + * vpss_check_and_clear_interrupt - check and clear interrupt + * @irq - common enumerator for IRQ + * + * Following return values used:- + * 0 - interrupt occurred and cleared + * 1 - interrupt not occurred + * 2 - interrupt status not available + */ +int vpss_dma_complete_interrupt(void); +  #endif diff --git a/include/media/ov7670.h b/include/media/ov7670.h index b133bc12303..1913d512307 100644 --- a/include/media/ov7670.h +++ b/include/media/ov7670.h @@ -15,6 +15,8 @@ struct ov7670_config {  	int min_height;			/* Filter out smaller sizes */  	int clock_speed;		/* External clock speed (MHz) */  	bool use_smbus;			/* Use smbus I/O instead of I2C */ +	bool pll_bypass;		/* Choose whether to bypass the PLL */ +	bool pclk_hb_disable;		/* Disable toggling pixclk during horizontal blanking */  };  #endif diff --git a/include/media/ov9650.h b/include/media/ov9650.h new file mode 100644 index 00000000000..d630cf9e028 --- /dev/null +++ b/include/media/ov9650.h @@ -0,0 +1,27 @@ +/* + * OV9650/OV9652 camera sensors driver + * + * Copyright (C) 2013 Sylwester Nawrocki <sylvester.nawrocki@gmail.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 OV9650_H_ +#define OV9650_H_ + +/** + * struct ov9650_platform_data - ov9650 driver platform data + * @mclk_frequency: the sensor's master clock frequency in Hz + * @gpio_pwdn:	    number of a GPIO connected to OV965X PWDN pin + * @gpio_reset:     number of a GPIO connected to OV965X RESET pin + * + * If any of @gpio_pwdn or @gpio_reset are unused then they should be + * set to a negative value. @mclk_frequency must always be specified. + */ +struct ov9650_platform_data { +	unsigned long mclk_frequency; +	int gpio_pwdn; +	int gpio_reset; +}; +#endif /* OV9650_H_ */ diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 74f55a3f14e..f74ee6f8971 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -182,6 +182,7 @@ void rc_map_init(void);  #define RC_MAP_TEVII_NEC                 "rc-tevii-nec"  #define RC_MAP_TIVO                      "rc-tivo"  #define RC_MAP_TOTAL_MEDIA_IN_HAND       "rc-total-media-in-hand" +#define RC_MAP_TOTAL_MEDIA_IN_HAND_02    "rc-total-media-in-hand-02"  #define RC_MAP_TREKSTOR                  "rc-trekstor"  #define RC_MAP_TT_1500                   "rc-tt-1500"  #define RC_MAP_TWINHAN_VP1027_DVBS       "rc-twinhan1027" diff --git a/include/media/s5c73m3.h b/include/media/s5c73m3.h new file mode 100644 index 00000000000..ccb9e544876 --- /dev/null +++ b/include/media/s5c73m3.h @@ -0,0 +1,55 @@ +/* + * Samsung LSI S5C73M3 8M pixel camera driver + * + * Copyright (C) 2012, Samsung Electronics, Co., Ltd. + * Sylwester Nawrocki <s.nawrocki@samsung.com> + * Andrzej Hajda <a.hajda@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. + * + * 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 MEDIA_S5C73M3__ +#define MEDIA_S5C73M3__ + +#include <linux/videodev2.h> +#include <media/v4l2-mediabus.h> + +/** + * struct s5c73m3_gpio - data structure describing a GPIO + * @gpio:  GPIO number + * @level: indicates active state of the @gpio + */ +struct s5c73m3_gpio { +	int gpio; +	int level; +}; + +/** + * struct s5c73m3_platform_data - s5c73m3 driver platform data + * @mclk_frequency: sensor's master clock frequency in Hz + * @gpio_reset:  GPIO driving RESET pin + * @gpio_stby:   GPIO driving STBY pin + * @nlanes:      maximum number of MIPI-CSI lanes used + * @horiz_flip:  default horizontal image flip value, non zero to enable + * @vert_flip:   default vertical image flip value, non zero to enable + */ + +struct s5c73m3_platform_data { +	unsigned long mclk_frequency; + +	struct s5c73m3_gpio gpio_reset; +	struct s5c73m3_gpio gpio_stby; + +	enum v4l2_mbus_type bus_type; +	u8 nlanes; +	u8 horiz_flip; +	u8 vert_flip; +}; + +#endif /* MEDIA_S5C73M3__ */ diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h index eaea62a382f..28f3590aa03 100644 --- a/include/media/s5p_fimc.h +++ b/include/media/s5p_fimc.h @@ -1,8 +1,8 @@  /* - * Samsung S5P SoC camera interface driver header + * Samsung S5P/Exynos4 SoC series camera interface driver header   * - * Copyright (c) 2010 Samsung Electronics Co., Ltd - * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com> + * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd. + * Sylwester Nawrocki <s.nawrocki@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 @@ -14,45 +14,58 @@  #include <media/media-entity.h> -enum cam_bus_type { -	FIMC_ITU_601 = 1, -	FIMC_ITU_656, -	FIMC_MIPI_CSI2, -	FIMC_LCD_WB, /* FIFO link from LCD mixer */ +/* + * Enumeration of the FIMC data bus types. + */ +enum fimc_bus_type { +	/* Camera parallel bus */ +	FIMC_BUS_TYPE_ITU_601 = 1, +	/* Camera parallel bus with embedded synchronization */ +	FIMC_BUS_TYPE_ITU_656, +	/* Camera MIPI-CSI2 serial bus */ +	FIMC_BUS_TYPE_MIPI_CSI2, +	/* FIFO link from LCD controller (WriteBack A) */ +	FIMC_BUS_TYPE_LCD_WRITEBACK_A, +	/* FIFO link from LCD controller (WriteBack B) */ +	FIMC_BUS_TYPE_LCD_WRITEBACK_B, +	/* FIFO link from FIMC-IS */ +	FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B,  };  struct i2c_board_info;  /** - * struct s5p_fimc_isp_info - image sensor information required for host - *			      interace configuration. + * struct fimc_source_info - video source description required for the host + *			     interface configuration   *   * @board_info: pointer to I2C subdevice's board info   * @clk_frequency: frequency of the clock the host interface provides to sensor - * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc. + * @fimc_bus_type: FIMC camera input type + * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc. + * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*)   * @i2c_bus_num: i2c control bus id the sensor is attached to   * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU)   * @clk_id: index of the SoC peripheral clock for sensors - * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*)   */ -struct s5p_fimc_isp_info { +struct fimc_source_info {  	struct i2c_board_info *board_info;  	unsigned long clk_frequency; -	enum cam_bus_type bus_type; +	enum fimc_bus_type fimc_bus_type; +	enum fimc_bus_type sensor_bus_type; +	u16 flags;  	u16 i2c_bus_num;  	u16 mux_id; -	u16 flags;  	u8 clk_id;  };  /**   * struct s5p_platform_fimc - camera host interface platform data   * - * @isp_info: properties of camera sensor required for host interface setup - * @num_clients: the number of attached image sensors + * @source_info: properties of an image source for the host interface setup + * @num_clients: the number of attached image sources   */  struct s5p_platform_fimc { -	struct s5p_fimc_isp_info *isp_info; +	struct fimc_source_info *source_info;  	int num_clients;  }; diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index 6442edc2a15..2cc70cf318b 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h @@ -23,11 +23,11 @@  #include <media/v4l2-device.h>  struct file; -struct soc_camera_link; +struct soc_camera_desc;  struct soc_camera_device {  	struct list_head list;		/* list of all registered devices */ -	struct soc_camera_link *link; +	struct soc_camera_desc *sdesc;  	struct device *pdev;		/* Platform device */  	struct device *parent;		/* Camera host device */  	struct device *control;		/* E.g., the i2c client */ @@ -46,9 +46,8 @@ struct soc_camera_device {  	int num_user_formats;  	enum v4l2_field field;		/* Preserve field over close() */  	void *host_priv;		/* Per-device host private data */ -	/* soc_camera.c private count. Only accessed with .video_lock held */ +	/* soc_camera.c private count. Only accessed with .host_lock held */  	int use_count; -	struct mutex video_lock;	/* Protects device data */  	struct file *streamer;		/* stream owner */  	union {  		struct videobuf_queue vb_vidq; @@ -62,7 +61,7 @@ struct soc_camera_device {  struct soc_camera_host {  	struct v4l2_device v4l2_dev;  	struct list_head list; -	struct mutex host_lock;		/* Protect during probing */ +	struct mutex host_lock;		/* Protect pipeline modifications */  	unsigned char nr;		/* Host number */  	u32 capabilities;  	void *priv; @@ -117,26 +116,72 @@ struct soc_camera_host_ops {  struct i2c_board_info;  struct regulator_bulk_data; -struct soc_camera_link { -	/* Camera bus id, used to match a camera and a bus */ -	int bus_id; +struct soc_camera_subdev_desc {  	/* Per camera SOCAM_SENSOR_* bus flags */  	unsigned long flags; -	int i2c_adapter_id; -	struct i2c_board_info *board_info; -	const char *module_name; -	void *priv; + +	/* sensor driver private platform data */ +	void *drv_priv;  	/* Optional regulators that have to be managed on power on/off events */  	struct regulator_bulk_data *regulators;  	int num_regulators; +	/* Optional callbacks to power on or off and reset the sensor */ +	int (*power)(struct device *, int); +	int (*reset)(struct device *); + +	/* +	 * some platforms may support different data widths than the sensors +	 * native ones due to different data line routing. Let the board code +	 * overwrite the width flags. +	 */ +	int (*set_bus_param)(struct soc_camera_subdev_desc *, unsigned long flags); +	unsigned long (*query_bus_param)(struct soc_camera_subdev_desc *); +	void (*free_bus)(struct soc_camera_subdev_desc *); +}; + +struct soc_camera_host_desc { +	/* Camera bus id, used to match a camera and a bus */ +	int bus_id; +	int i2c_adapter_id; +	struct i2c_board_info *board_info; +	const char *module_name; +  	/*  	 * For non-I2C devices platform has to provide methods to add a device  	 * to the system and to remove it  	 */  	int (*add_device)(struct soc_camera_device *);  	void (*del_device)(struct soc_camera_device *); +}; + +/* + * This MUST be kept binary-identical to struct soc_camera_link below, until + * it is completely replaced by this one, after which we can split it into its + * two components. + */ +struct soc_camera_desc { +	struct soc_camera_subdev_desc subdev_desc; +	struct soc_camera_host_desc host_desc; +}; + +/* Prepare to replace this struct: don't change its layout any more! */ +struct soc_camera_link { +	/* +	 * Subdevice part - keep at top and compatible to +	 * struct soc_camera_subdev_desc +	 */ + +	/* Per camera SOCAM_SENSOR_* bus flags */ +	unsigned long flags; + +	void *priv; + +	/* Optional regulators that have to be managed on power on/off events */ +	struct regulator_bulk_data *regulators; +	int num_regulators; +  	/* Optional callbacks to power on or off and reset the sensor */  	int (*power)(struct device *, int);  	int (*reset)(struct device *); @@ -148,6 +193,24 @@ struct soc_camera_link {  	int (*set_bus_param)(struct soc_camera_link *, unsigned long flags);  	unsigned long (*query_bus_param)(struct soc_camera_link *);  	void (*free_bus)(struct soc_camera_link *); + +	/* +	 * Host part - keep at bottom and compatible to +	 * struct soc_camera_host_desc +	 */ + +	/* Camera bus id, used to match a camera and a bus */ +	int bus_id; +	int i2c_adapter_id; +	struct i2c_board_info *board_info; +	const char *module_name; + +	/* +	 * For non-I2C devices platform has to provide methods to add a device +	 * to the system and to remove it +	 */ +	int (*add_device)(struct soc_camera_device *); +	void (*del_device)(struct soc_camera_device *);  };  static inline struct soc_camera_host *to_soc_camera_host( @@ -158,10 +221,10 @@ static inline struct soc_camera_host *to_soc_camera_host(  	return container_of(v4l2_dev, struct soc_camera_host, v4l2_dev);  } -static inline struct soc_camera_link *to_soc_camera_link( +static inline struct soc_camera_desc *to_soc_camera_desc(  	const struct soc_camera_device *icd)  { -	return icd->link; +	return icd->sdesc;  }  static inline struct device *to_soc_camera_control( @@ -251,19 +314,17 @@ static inline void soc_camera_limit_side(int *start, int *length,  		*start = start_min + length_max - *length;  } -unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl, -					    unsigned long flags); -unsigned long soc_camera_apply_board_flags(struct soc_camera_link *icl, +unsigned long soc_camera_apply_board_flags(struct soc_camera_subdev_desc *ssdd,  					   const struct v4l2_mbus_config *cfg); -int soc_camera_power_on(struct device *dev, struct soc_camera_link *icl); -int soc_camera_power_off(struct device *dev, struct soc_camera_link *icl); +int soc_camera_power_on(struct device *dev, struct soc_camera_subdev_desc *ssdd); +int soc_camera_power_off(struct device *dev, struct soc_camera_subdev_desc *ssdd);  static inline int soc_camera_set_power(struct device *dev, -				       struct soc_camera_link *icl, bool on) +				struct soc_camera_subdev_desc *ssdd, bool on)  { -	return on ? soc_camera_power_on(dev, icl) -		  : soc_camera_power_off(dev, icl); +	return on ? soc_camera_power_on(dev, ssdd) +		  : soc_camera_power_off(dev, ssdd);  }  /* This is only temporary here - until v4l2-subdev begins to link to video_device */ @@ -275,7 +336,7 @@ static inline struct video_device *soc_camera_i2c_to_vdev(const struct i2c_clien  	return icd ? icd->vdev : NULL;  } -static inline struct soc_camera_link *soc_camera_i2c_to_link(const struct i2c_client *client) +static inline struct soc_camera_subdev_desc *soc_camera_i2c_to_desc(const struct i2c_client *client)  {  	return client->dev.platform_data;  } diff --git a/include/media/soc_camera_platform.h b/include/media/soc_camera_platform.h index 8aa4200a0b1..1e5065dab43 100644 --- a/include/media/soc_camera_platform.h +++ b/include/media/soc_camera_platform.h @@ -38,10 +38,12 @@ static inline int soc_camera_platform_add(struct soc_camera_device *icd,  					  void (*release)(struct device *dev),  					  int id)  { -	struct soc_camera_platform_info *info = plink->priv; +	struct soc_camera_subdev_desc *ssdd = +		(struct soc_camera_subdev_desc *)plink; +	struct soc_camera_platform_info *info = ssdd->drv_priv;  	int ret; -	if (icd->link != plink) +	if (&icd->sdesc->subdev_desc != ssdd)  		return -ENODEV;  	if (*pdev) @@ -70,7 +72,9 @@ static inline void soc_camera_platform_del(const struct soc_camera_device *icd,  					   struct platform_device *pdev,  					   const struct soc_camera_link *plink)  { -	if (icd->link != plink || !pdev) +	const struct soc_camera_subdev_desc *ssdd = +		(const struct soc_camera_subdev_desc *)plink; +	if (&icd->sdesc->subdev_desc != ssdd || !pdev)  		return;  	platform_device_unregister(pdev); diff --git a/include/media/tvp514x.h b/include/media/tvp514x.h index 74387e83f5b..86ed7e80683 100644 --- a/include/media/tvp514x.h +++ b/include/media/tvp514x.h @@ -96,12 +96,9 @@ enum tvp514x_output {  /**   * struct tvp514x_platform_data - Platform data values and access functions. - * @power_set: Power state access function, zero is off, non-zero is on. - * @ifparm: Interface parameters access function. - * @priv_data_set: Device private data (pointer) access function.   * @clk_polarity: Clock polarity of the current interface. - * @ hs_polarity: HSYNC Polarity configuration for current interface. - * @ vs_polarity: VSYNC Polarity configuration for current interface. + * @hs_polarity: HSYNC Polarity configuration for current interface. + * @vs_polarity: VSYNC Polarity configuration for current interface.   */  struct tvp514x_platform_data {  	/* Interface control params */ diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 1a0b2db4c5d..ec7c9c00b25 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -225,4 +225,6 @@ bool v4l2_detect_gtf(unsigned frame_height, unsigned hfreq, unsigned vsync,  struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait); +void v4l2_get_timestamp(struct timeval *tv); +  #endif /* V4L2_COMMON_H_ */ diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index 96509119f28..f00d42bc01a 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -53,6 +53,8 @@ struct v4l2_ctrl_ops {  	int (*s_ctrl)(struct v4l2_ctrl *ctrl);  }; +typedef void (*v4l2_ctrl_notify_fnc)(struct v4l2_ctrl *ctrl, void *priv); +  /** struct v4l2_ctrl - The control structure.    * @node:	The list node.    * @ev_subs:	The list of control event subscriptions. @@ -72,6 +74,8 @@ struct v4l2_ctrl_ops {    *		set this flag directly.    * @has_volatiles: If set, then one or more members of the cluster are volatile.    *		Drivers should never touch this flag. +  * @call_notify: If set, then call the handler's notify function whenever the +  *		control's value changes.    * @manual_mode_value: If the is_auto flag is set, then this is the value    *		of the auto control that determines if that control is in    *		manual mode. So if the value of the auto control equals this @@ -119,6 +123,7 @@ struct v4l2_ctrl {  	unsigned int is_private:1;  	unsigned int is_auto:1;  	unsigned int has_volatiles:1; +	unsigned int call_notify:1;  	unsigned int manual_mode_value:8;  	const struct v4l2_ctrl_ops *ops; @@ -177,6 +182,10 @@ struct v4l2_ctrl_ref {    *		control is needed multiple times, so this is a simple    *		optimization.    * @buckets:	Buckets for the hashing. Allows for quick control lookup. +  * @notify:	A notify callback that is called whenever the control changes value. +  *		Note that the handler's lock is held when the notify function +  *		is called! +  * @notify_priv: Passed as argument to the v4l2_ctrl notify callback.    * @nr_of_buckets: Total number of buckets in the array.    * @error:	The error code of the first failed control addition.    */ @@ -187,6 +196,8 @@ struct v4l2_ctrl_handler {  	struct list_head ctrl_refs;  	struct v4l2_ctrl_ref *cached;  	struct v4l2_ctrl_ref **buckets; +	v4l2_ctrl_notify_fnc notify; +	void *notify_priv;  	u16 nr_of_buckets;  	int error;  }; @@ -507,6 +518,26 @@ void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);    */  void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed); +/** v4l2_ctrl_modify_range() - Update the range of a control. +  * @ctrl:	The control to update. +  * @min:	The control's minimum value. +  * @max:	The control's maximum value. +  * @step:	The control's step value +  * @def:	The control's default value. +  * +  * Update the range of a control on the fly. This works for control types +  * INTEGER, BOOLEAN, MENU, INTEGER MENU and BITMASK. For menu controls the +  * @step value is interpreted as a menu_skip_mask. +  * +  * An error is returned if one of the range arguments is invalid for this +  * control type. +  * +  * This function assumes that the control handler is not locked and will +  * take the lock itself. +  */ +int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, +			s32 min, s32 max, u32 step, s32 def); +  /** v4l2_ctrl_lock() - Helper function to lock the handler    * associated with the control.    * @ctrl:	The control to lock. @@ -525,6 +556,20 @@ static inline void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)  	mutex_unlock(ctrl->handler->lock);  } +/** v4l2_ctrl_notify() - Function to set a notify callback for a control. +  * @ctrl:	The control. +  * @notify:	The callback function. +  * @priv:	The callback private handle, passed as argument to the callback. +  * +  * This function sets a callback function for the control. If @ctrl is NULL, +  * then it will do nothing. If @notify is NULL, then the notify callback will +  * be removed. +  * +  * There can be only one notify. If another already exists, then a WARN_ON +  * will be issued and the function will do nothing. +  */ +void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv); +  /** v4l2_ctrl_g_ctrl() - Helper function to get the control's value from within a driver.    * @ctrl:	The control.    * @@ -609,4 +654,12 @@ int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs  int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);  int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl); +/* Can be used as a subscribe_event function that just subscribes control +   events. */ +int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, +				     struct v4l2_event_subscription *sub); + +/* Log all controls owned by subdev's control handler. */ +int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd); +  #endif diff --git a/include/media/v4l2-event.h b/include/media/v4l2-event.h index eff85f934b2..be05d019de2 100644 --- a/include/media/v4l2-event.h +++ b/include/media/v4l2-event.h @@ -64,6 +64,7 @@   */  struct v4l2_fh; +struct v4l2_subdev;  struct v4l2_subscribed_event;  struct video_device; @@ -129,5 +130,6 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,  int v4l2_event_unsubscribe(struct v4l2_fh *fh,  			   const struct v4l2_event_subscription *sub);  void v4l2_event_unsubscribe_all(struct v4l2_fh *fh); - +int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh, +				  struct v4l2_event_subscription *sub);  #endif /* V4L2_EVENT_H */ diff --git a/include/media/v4l2-image-sizes.h b/include/media/v4l2-image-sizes.h new file mode 100644 index 00000000000..10daf92ff1a --- /dev/null +++ b/include/media/v4l2-image-sizes.h @@ -0,0 +1,34 @@ +/* + * Standard image size definitions + * + * Copyright (C) 2013, Sylwester Nawrocki <sylvester.nawrocki@gmail.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 _IMAGE_SIZES_H +#define _IMAGE_SIZES_H + +#define CIF_WIDTH	352 +#define CIF_HEIGHT	288 + +#define QCIF_WIDTH	176 +#define QCIF_HEIGHT	144 + +#define QQCIF_WIDTH	88 +#define QQCIF_HEIGHT	72 + +#define QQVGA_WIDTH	160 +#define QQVGA_HEIGHT	120 + +#define QVGA_WIDTH	320 +#define QVGA_HEIGHT	240 + +#define SXGA_WIDTH	1280 +#define SXGA_HEIGHT	1024 + +#define VGA_WIDTH	640 +#define VGA_HEIGHT	480 + +#endif /* _IMAGE_SIZES_H */ diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h index 7e82d2b193d..d3eef01da64 100644 --- a/include/media/v4l2-mem2mem.h +++ b/include/media/v4l2-mem2mem.h @@ -125,7 +125,7 @@ unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,  int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,  		  struct vm_area_struct *vma); -struct v4l2_m2m_dev *v4l2_m2m_init(struct v4l2_m2m_ops *m2m_ops); +struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops);  void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev);  struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev, diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h index 7184853ca36..27dfe85772b 100644 --- a/include/net/9p/9p.h +++ b/include/net/9p/9p.h @@ -407,17 +407,17 @@ struct p9_wstat {  	char *gid;  	char *muid;  	char *extension;	/* 9p2000.u extensions */ -	u32 n_uid;		/* 9p2000.u extensions */ -	u32 n_gid;		/* 9p2000.u extensions */ -	u32 n_muid;		/* 9p2000.u extensions */ +	kuid_t n_uid;		/* 9p2000.u extensions */ +	kgid_t n_gid;		/* 9p2000.u extensions */ +	kuid_t n_muid;		/* 9p2000.u extensions */  };  struct p9_stat_dotl {  	u64 st_result_mask;  	struct p9_qid qid;  	u32 st_mode; -	u32 st_uid; -	u32 st_gid; +	kuid_t st_uid; +	kgid_t st_gid;  	u64 st_nlink;  	u64 st_rdev;  	u64 st_size; @@ -471,8 +471,8 @@ struct p9_stat_dotl {  struct p9_iattr_dotl {  	u32 valid;  	u32 mode; -	u32 uid; -	u32 gid; +	kuid_t uid; +	kgid_t gid;  	u64 size;  	u64 atime_sec;  	u64 atime_nsec; diff --git a/include/net/9p/client.h b/include/net/9p/client.h index fc9b90b0c05..4c7c01a7391 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h @@ -187,12 +187,12 @@ struct p9_fid {  	int mode;  	struct p9_qid qid;  	u32 iounit; -	uid_t uid; +	kuid_t uid;  	void *rdir;  	struct list_head flist; -	struct list_head dlist;	/* list of all fids attached to a dentry */ +	struct hlist_node dlist;	/* list of all fids attached to a dentry */  };  /** @@ -220,17 +220,17 @@ void p9_client_destroy(struct p9_client *clnt);  void p9_client_disconnect(struct p9_client *clnt);  void p9_client_begin_disconnect(struct p9_client *clnt);  struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, -					char *uname, u32 n_uname, char *aname); +				char *uname, kuid_t n_uname, char *aname);  struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,  		char **wnames, int clone);  int p9_client_open(struct p9_fid *fid, int mode);  int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode,  							char *extension);  int p9_client_link(struct p9_fid *fid, struct p9_fid *oldfid, char *newname); -int p9_client_symlink(struct p9_fid *fid, char *name, char *symname, gid_t gid, +int p9_client_symlink(struct p9_fid *fid, char *name, char *symname, kgid_t gid,  							struct p9_qid *qid);  int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode, -		gid_t gid, struct p9_qid *qid); +		kgid_t gid, struct p9_qid *qid);  int p9_client_clunk(struct p9_fid *fid);  int p9_client_fsync(struct p9_fid *fid, int datasync);  int p9_client_remove(struct p9_fid *fid); @@ -250,9 +250,9 @@ struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid,  							u64 request_mask);  int p9_client_mknod_dotl(struct p9_fid *oldfid, char *name, int mode, -			dev_t rdev, gid_t gid, struct p9_qid *); +			dev_t rdev, kgid_t gid, struct p9_qid *);  int p9_client_mkdir_dotl(struct p9_fid *fid, char *name, int mode, -				gid_t gid, struct p9_qid *); +				kgid_t gid, struct p9_qid *);  int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status);  int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *fl);  struct p9_req_t *p9_tag_lookup(struct p9_client *, u16); diff --git a/include/net/act_api.h b/include/net/act_api.h index c739531e156..06ef7e926a6 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h @@ -35,21 +35,6 @@ struct tcf_common {  #define tcf_lock	common.tcfc_lock  #define tcf_rcu		common.tcfc_rcu -struct tcf_police { -	struct tcf_common	common; -	int			tcfp_result; -	u32			tcfp_ewma_rate; -	u32			tcfp_burst; -	u32			tcfp_mtu; -	u32			tcfp_toks; -	u32			tcfp_ptoks; -	psched_time_t		tcfp_t_c; -	struct qdisc_rate_table	*tcfp_R_tab; -	struct qdisc_rate_table	*tcfp_P_tab; -}; -#define to_police(pc)	\ -	container_of(pc, struct tcf_police, common) -  struct tcf_hashinfo {  	struct tcf_common	**htab;  	unsigned int		hmask; @@ -91,7 +76,9 @@ struct tc_action_ops {  	int     (*dump)(struct sk_buff *, struct tc_action *, int, int);  	int     (*cleanup)(struct tc_action *, int bind);  	int     (*lookup)(struct tc_action *, u32); -	int     (*init)(struct nlattr *, struct nlattr *, struct tc_action *, int , int); +	int     (*init)(struct net *net, struct nlattr *nla, +			struct nlattr *est, struct tc_action *act, int ovr, +			int bind);  	int     (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *);  }; @@ -116,8 +103,12 @@ extern int tcf_register_action(struct tc_action_ops *a);  extern int tcf_unregister_action(struct tc_action_ops *a);  extern void tcf_action_destroy(struct tc_action *a, int bind);  extern int tcf_action_exec(struct sk_buff *skb, const struct tc_action *a, struct tcf_result *res); -extern struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind); -extern struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind); +extern struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla, +					 struct nlattr *est, char *n, int ovr, +					 int bind); +extern struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla, +					   struct nlattr *est, char *n, int ovr, +					   int bind);  extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int);  extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);  extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); diff --git a/include/net/addrconf.h b/include/net/addrconf.h index df4ef945338..84a6440f1f1 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -15,6 +15,10 @@  #define IPV6_MAX_ADDRESSES		16 +#define ADDRCONF_TIMER_FUZZ_MINUS	(HZ > 50 ? HZ / 50 : 1) +#define ADDRCONF_TIMER_FUZZ		(HZ / 4) +#define ADDRCONF_TIMER_FUZZ_MAX		(HZ) +  #include <linux/in.h>  #include <linux/in6.h> @@ -150,7 +154,31 @@ extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);  extern bool ipv6_chk_mcast_addr(struct net_device *dev,  				const struct in6_addr *group,  				const struct in6_addr *src_addr); -extern bool ipv6_is_mld(struct sk_buff *skb, int nexthdr); + +/* + * identify MLD packets for MLD filter exceptions + */ +static inline bool ipv6_is_mld(struct sk_buff *skb, int nexthdr, int offset) +{ +	struct icmp6hdr *hdr; + +	if (nexthdr != IPPROTO_ICMPV6 || +	    !pskb_network_may_pull(skb, offset + sizeof(struct icmp6hdr))) +		return false; + +	hdr = (struct icmp6hdr *)(skb_network_header(skb) + offset); + +	switch (hdr->icmp6_type) { +	case ICMPV6_MGM_QUERY: +	case ICMPV6_MGM_REPORT: +	case ICMPV6_MGM_REDUCTION: +	case ICMPV6_MLD2_REPORT: +		return true; +	default: +		break; +	} +	return false; +}  extern void addrconf_prefix_rcv(struct net_device *dev,  				u8 *opt, int len, bool sllao); @@ -171,6 +199,7 @@ extern bool ipv6_chk_acast_addr(struct net *net, struct net_device *dev,  /* Device notifier */  extern int register_inet6addr_notifier(struct notifier_block *nb);  extern int unregister_inet6addr_notifier(struct notifier_block *nb); +extern int inet6addr_notifier_call_chain(unsigned long val, void *v);  extern void inet6_netconf_notify_devconf(struct net *net, int type, int ifindex,  					 struct ipv6_devconf *devconf); @@ -257,30 +286,55 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,  		      htonl(0xFF000000) | addr->s6_addr32[3]);  } -static inline int ipv6_addr_is_multicast(const struct in6_addr *addr) +static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)  {  	return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);  } -static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) +static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)  { +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +	__u64 *p = (__u64 *)addr; +	return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(1))) == 0UL; +#else  	return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |  		addr->s6_addr32[1] | addr->s6_addr32[2] |  		(addr->s6_addr32[3] ^ htonl(0x00000001))) == 0; +#endif  } -static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) +static inline bool ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)  { +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +	__u64 *p = (__u64 *)addr; +	return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(2))) == 0UL; +#else  	return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |  		addr->s6_addr32[1] | addr->s6_addr32[2] |  		(addr->s6_addr32[3] ^ htonl(0x00000002))) == 0; +#endif  } -static inline int ipv6_addr_is_isatap(const struct in6_addr *addr) +static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)  {  	return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);  } +static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +	__u64 *p = (__u64 *)addr; +	return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | +		((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) & +		 cpu_to_be64(0xffffffffff000000UL))) == 0UL; +#else +	return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | +		addr->s6_addr32[1] | +		(addr->s6_addr32[2] ^ htonl(0x00000001)) | +		(addr->s6_addr[12] ^ 0xff)) == 0; +#endif +} +  #ifdef CONFIG_PROC_FS  extern int if6_proc_init(void);  extern void if6_proc_exit(void); diff --git a/include/net/ax25.h b/include/net/ax25.h index 53539acbd81..89ed9ac5701 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h @@ -161,8 +161,8 @@ typedef struct ax25_uid_assoc {  	ax25_address		call;  } ax25_uid_assoc; -#define ax25_uid_for_each(__ax25, node, list) \ -	hlist_for_each_entry(__ax25, node, list, uid_node) +#define ax25_uid_for_each(__ax25, list) \ +	hlist_for_each_entry(__ax25, list, uid_node)  #define ax25_uid_hold(ax25) \  	atomic_inc(&((ax25)->refcount)) @@ -247,8 +247,8 @@ typedef struct ax25_cb {  #define ax25_sk(__sk) ((ax25_cb *)(__sk)->sk_protinfo) -#define ax25_for_each(__ax25, node, list) \ -	hlist_for_each_entry(__ax25, node, list, ax25_node) +#define ax25_for_each(__ax25, list) \ +	hlist_for_each_entry(__ax25, list, ax25_node)  #define ax25_cb_hold(__ax25) \  	atomic_inc(&((__ax25)->refcount)) diff --git a/include/net/bluetooth/a2mp.h b/include/net/bluetooth/a2mp.h index 42f21766c53..487b54c1308 100644 --- a/include/net/bluetooth/a2mp.h +++ b/include/net/bluetooth/a2mp.h @@ -23,6 +23,7 @@ enum amp_mgr_state {  	READ_LOC_AMP_INFO,  	READ_LOC_AMP_ASSOC,  	READ_LOC_AMP_ASSOC_FINAL, +	WRITE_REMOTE_AMP_ASSOC,  };  struct amp_mgr { @@ -33,7 +34,7 @@ struct amp_mgr {  	struct kref		kref;  	__u8			ident;  	__u8			handle; -	enum amp_mgr_state	state; +	unsigned long		state;  	unsigned long		flags;  	struct list_head	amp_ctrls; @@ -144,5 +145,6 @@ void a2mp_discover_amp(struct l2cap_chan *chan);  void a2mp_send_getinfo_rsp(struct hci_dev *hdev);  void a2mp_send_getampassoc_rsp(struct hci_dev *hdev, u8 status);  void a2mp_send_create_phy_link_req(struct hci_dev *hdev, u8 status); +void a2mp_send_create_phy_link_rsp(struct hci_dev *hdev, u8 status);  #endif /* __A2MP_H */ diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 2554b3f5222..9531beee09b 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -166,6 +166,29 @@ typedef struct {  #define BDADDR_LE_PUBLIC	0x01  #define BDADDR_LE_RANDOM	0x02 +static inline bool bdaddr_type_is_valid(__u8 type) +{ +	switch (type) { +	case BDADDR_BREDR: +	case BDADDR_LE_PUBLIC: +	case BDADDR_LE_RANDOM: +		return true; +	} + +	return false; +} + +static inline bool bdaddr_type_is_le(__u8 type) +{ +	switch (type) { +	case BDADDR_LE_PUBLIC: +	case BDADDR_LE_RANDOM: +		return true; +	} + +	return false; +} +  #define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0} })  #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} }) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 45eee08157b..7f12c25f1fc 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -943,6 +943,12 @@ struct hci_rp_le_read_buffer_size {  	__u8     le_max_pkt;  } __packed; +#define HCI_OP_LE_READ_LOCAL_FEATURES	0x2003 +struct hci_rp_le_read_local_features { +	__u8     status; +	__u8     features[8]; +} __packed; +  #define HCI_OP_LE_READ_ADV_TX_POWER	0x2007  struct hci_rp_le_read_adv_tx_power {  	__u8	status; @@ -995,6 +1001,12 @@ struct hci_cp_le_create_conn {  #define HCI_OP_LE_CREATE_CONN_CANCEL	0x200e +#define HCI_OP_LE_READ_WHITE_LIST_SIZE	0x200f +struct hci_rp_le_read_white_list_size { +	__u8	status; +	__u8	size; +} __packed; +  #define HCI_OP_LE_CONN_UPDATE		0x2013  struct hci_cp_le_conn_update {  	__le16   handle; @@ -1033,6 +1045,12 @@ struct hci_rp_le_ltk_neg_reply {  	__le16	handle;  } __packed; +#define HCI_OP_LE_READ_SUPPORTED_STATES	0x201c +struct hci_rp_le_read_supported_states { +	__u8	status; +	__u8	le_states[8]; +} __packed; +  /* ---- HCI Events ---- */  #define HCI_EV_INQUIRY_COMPLETE		0x01 diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 014a2eaa538..90cf75afcb0 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -86,6 +86,7 @@ struct bdaddr_list {  struct bt_uuid {  	struct list_head list;  	u8 uuid[16]; +	u8 size;  	u8 svc_hint;  }; @@ -152,6 +153,9 @@ struct hci_dev {  	__u8		minor_class;  	__u8		features[8];  	__u8		host_features[8]; +	__u8		le_features[8]; +	__u8		le_white_list_size; +	__u8		le_states[8];  	__u8		commands[64];  	__u8		hci_ver;  	__u16		hci_rev; @@ -216,6 +220,7 @@ struct hci_dev {  	unsigned long	le_last_tx;  	struct workqueue_struct	*workqueue; +	struct workqueue_struct	*req_workqueue;  	struct work_struct	power_on;  	struct delayed_work	power_off; diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 7588ef44eba..cdd33021f83 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -496,7 +496,6 @@ struct l2cap_chan {  	__u16		frames_sent;  	__u16		unacked_frames;  	__u8		retry_count; -	__u16		srej_queue_next;  	__u16		sdu_len;  	struct sk_buff	*sdu;  	struct sk_buff	*sdu_last_frag; diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 8e6a6b73b9c..d581c6de5d6 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -19,6 +19,7 @@  #include <linux/nl80211.h>  #include <linux/if_ether.h>  #include <linux/ieee80211.h> +#include <linux/net.h>  #include <net/regulatory.h>  /** @@ -99,6 +100,16 @@ enum ieee80211_band {   * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel   * 	is not permitted.   * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel. + * @IEEE80211_CHAN_NO_80MHZ: If the driver supports 80 MHz on the band, + *	this flag indicates that an 80 MHz channel cannot use this + *	channel as the control or any of the secondary channels. + *	This may be due to the driver or due to regulatory bandwidth + *	restrictions. + * @IEEE80211_CHAN_NO_160MHZ: If the driver supports 160 MHz on the band, + *	this flag indicates that an 160 MHz channel cannot use this + *	channel as the control or any of the secondary channels. + *	This may be due to the driver or due to regulatory bandwidth + *	restrictions.   */  enum ieee80211_channel_flags {  	IEEE80211_CHAN_DISABLED		= 1<<0, @@ -108,11 +119,16 @@ enum ieee80211_channel_flags {  	IEEE80211_CHAN_NO_HT40PLUS	= 1<<4,  	IEEE80211_CHAN_NO_HT40MINUS	= 1<<5,  	IEEE80211_CHAN_NO_OFDM		= 1<<6, +	IEEE80211_CHAN_NO_80MHZ		= 1<<7, +	IEEE80211_CHAN_NO_160MHZ	= 1<<8,  };  #define IEEE80211_CHAN_NO_HT40 \  	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) +#define IEEE80211_DFS_MIN_CAC_TIME_MS		60000 +#define IEEE80211_DFS_MIN_NOP_TIME_MS		(30 * 60 * 1000) +  /**   * struct ieee80211_channel - channel definition   * @@ -133,6 +149,9 @@ enum ieee80211_channel_flags {   *	to enable this, this is useful only on 5 GHz band.   * @orig_mag: internal use   * @orig_mpwr: internal use + * @dfs_state: current state of this channel. Only relevant if radar is required + *	on this channel. + * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.   */  struct ieee80211_channel {  	enum ieee80211_band band; @@ -145,6 +164,8 @@ struct ieee80211_channel {  	bool beacon_found;  	u32 orig_flags;  	int orig_mag, orig_mpwr; +	enum nl80211_dfs_state dfs_state; +	unsigned long dfs_state_entered;  };  /** @@ -281,9 +302,13 @@ struct ieee80211_supported_band {  /**   * struct vif_params - describes virtual interface parameters   * @use_4addr: use 4-address frames + * @macaddr: address to use for this virtual interface. This will only + * 	be used for non-netdevice interfaces. If this parameter is set + * 	to zero address the driver may determine the address as needed.   */  struct vif_params {         int use_4addr; +       u8 macaddr[ETH_ALEN];  };  /** @@ -326,7 +351,7 @@ struct cfg80211_chan_def {   * cfg80211_get_chandef_type - return old channel type from chandef   * @chandef: the channel definition   * - * Returns the old channel type (NOHT, HT20, HT40+/-) from a given + * Return: The old channel type (NOHT, HT20, HT40+/-) from a given   * chandef, which must have a bandwidth allowing this conversion.   */  static inline enum nl80211_channel_type @@ -364,7 +389,7 @@ void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,   * @chandef1: first channel definition   * @chandef2: second channel definition   * - * Returns %true if the channels defined by the channel definitions are + * Return: %true if the channels defined by the channel definitions are   * identical, %false otherwise.   */  static inline bool @@ -382,7 +407,7 @@ cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1,   * @chandef1: first channel definition   * @chandef2: second channel definition   * - * Returns %NULL if the given channel definitions are incompatible, + * Return: %NULL if the given channel definitions are incompatible,   * chandef1 or chandef2 otherwise.   */  const struct cfg80211_chan_def * @@ -392,6 +417,7 @@ cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1,  /**   * cfg80211_chandef_valid - check if a channel definition is valid   * @chandef: the channel definition to check + * Return: %true if the channel definition is valid. %false otherwise.   */  bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef); @@ -399,7 +425,8 @@ bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef);   * cfg80211_chandef_usable - check if secondary channels can be used   * @wiphy: the wiphy to validate against   * @chandef: the channel definition to check - * @prohibited_flags: the regulatory chanenl flags that must not be set + * @prohibited_flags: the regulatory channel flags that must not be set + * Return: %true if secondary channels are usable. %false otherwise.   */  bool cfg80211_chandef_usable(struct wiphy *wiphy,  			     const struct cfg80211_chan_def *chandef, @@ -521,6 +548,26 @@ struct cfg80211_beacon_data {  	size_t probe_resp_len;  }; +struct mac_address { +	u8 addr[ETH_ALEN]; +}; + +/** + * struct cfg80211_acl_data - Access control list data + * + * @acl_policy: ACL policy to be applied on the station's + *	entry specified by mac_addr + * @n_acl_entries: Number of MAC address entries passed + * @mac_addrs: List of MAC addresses of stations to be used for ACL + */ +struct cfg80211_acl_data { +	enum nl80211_acl_policy acl_policy; +	int n_acl_entries; + +	/* Keep it last */ +	struct mac_address mac_addrs[]; +}; +  /**   * struct cfg80211_ap_settings - AP configuration   * @@ -540,6 +587,9 @@ struct cfg80211_beacon_data {   * @inactivity_timeout: time in seconds to determine station's inactivity.   * @p2p_ctwindow: P2P CT Window   * @p2p_opp_ps: P2P opportunistic PS + * @acl: ACL configuration used by the drivers which has support for + *	MAC address based access control + * @radar_required: set if radar detection is required   */  struct cfg80211_ap_settings {  	struct cfg80211_chan_def chandef; @@ -556,6 +606,8 @@ struct cfg80211_ap_settings {  	int inactivity_timeout;  	u8 p2p_ctwindow;  	bool p2p_opp_ps; +	const struct cfg80211_acl_data *acl; +	bool radar_required;  };  /** @@ -574,12 +626,14 @@ enum plink_actions {  /**   * enum station_parameters_apply_mask - station parameter values to apply   * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp) + * @STATION_PARAM_APPLY_CAPABILITY: apply new capability   *   * Not all station parameters have in-band "no change" signalling,   * for those that don't these flags will are used.   */  enum station_parameters_apply_mask {  	STATION_PARAM_APPLY_UAPSD = BIT(0), +	STATION_PARAM_APPLY_CAPABILITY = BIT(1),  };  /** @@ -608,6 +662,11 @@ enum station_parameters_apply_mask {   * @sta_modify_mask: bitmap indicating which parameters changed   *	(for those that don't have a natural "no change" value),   *	see &enum station_parameters_apply_mask + * @local_pm: local link-specific mesh power save mode (no change when set + *	to unknown) + * @capability: station capability + * @ext_capab: extended capabilities of the station + * @ext_capab_len: number of extended capabilities   */  struct station_parameters {  	u8 *supported_rates; @@ -623,6 +682,10 @@ struct station_parameters {  	struct ieee80211_vht_cap *vht_capa;  	u8 uapsd_queues;  	u8 max_sp; +	enum nl80211_mesh_power_mode local_pm; +	u16 capability; +	u8 *ext_capab; +	u8 ext_capab_len;  };  /** @@ -634,14 +697,16 @@ struct station_parameters {   * @STATION_INFO_INACTIVE_TIME: @inactive_time filled   * @STATION_INFO_RX_BYTES: @rx_bytes filled   * @STATION_INFO_TX_BYTES: @tx_bytes filled + * @STATION_INFO_RX_BYTES64: @rx_bytes filled with 64-bit value + * @STATION_INFO_TX_BYTES64: @tx_bytes filled with 64-bit value   * @STATION_INFO_LLID: @llid filled   * @STATION_INFO_PLID: @plid filled   * @STATION_INFO_PLINK_STATE: @plink_state filled   * @STATION_INFO_SIGNAL: @signal filled   * @STATION_INFO_TX_BITRATE: @txrate fields are filled   *  (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) - * @STATION_INFO_RX_PACKETS: @rx_packets filled - * @STATION_INFO_TX_PACKETS: @tx_packets filled + * @STATION_INFO_RX_PACKETS: @rx_packets filled with 32-bit value + * @STATION_INFO_TX_PACKETS: @tx_packets filled with 32-bit value   * @STATION_INFO_TX_RETRIES: @tx_retries filled   * @STATION_INFO_TX_FAILED: @tx_failed filled   * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled @@ -653,6 +718,9 @@ struct station_parameters {   * @STATION_INFO_STA_FLAGS: @sta_flags filled   * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled   * @STATION_INFO_T_OFFSET: @t_offset filled + * @STATION_INFO_LOCAL_PM: @local_pm filled + * @STATION_INFO_PEER_PM: @peer_pm filled + * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled   */  enum station_info_flags {  	STATION_INFO_INACTIVE_TIME	= 1<<0, @@ -676,6 +744,11 @@ enum station_info_flags {  	STATION_INFO_STA_FLAGS		= 1<<18,  	STATION_INFO_BEACON_LOSS_COUNT	= 1<<19,  	STATION_INFO_T_OFFSET		= 1<<20, +	STATION_INFO_LOCAL_PM		= 1<<21, +	STATION_INFO_PEER_PM		= 1<<22, +	STATION_INFO_NONPEER_PM		= 1<<23, +	STATION_INFO_RX_BYTES64		= 1<<24, +	STATION_INFO_TX_BYTES64		= 1<<25,  };  /** @@ -789,13 +862,16 @@ struct sta_bss_parameters {   * @sta_flags: station flags mask & values   * @beacon_loss_count: Number of times beacon loss event has triggered.   * @t_offset: Time offset of the station relative to this host. + * @local_pm: local mesh STA power save mode + * @peer_pm: peer mesh STA power save mode + * @nonpeer_pm: non-peer mesh STA power save mode   */  struct station_info {  	u32 filled;  	u32 connected_time;  	u32 inactive_time; -	u32 rx_bytes; -	u32 tx_bytes; +	u64 rx_bytes; +	u64 tx_bytes;  	u16 llid;  	u16 plid;  	u8 plink_state; @@ -818,6 +894,9 @@ struct station_info {  	u32 beacon_loss_count;  	s64 t_offset; +	enum nl80211_mesh_power_mode local_pm; +	enum nl80211_mesh_power_mode peer_pm; +	enum nl80211_mesh_power_mode nonpeer_pm;  	/*  	 * Note: Add a new enum station_info_flags value for each new field and @@ -993,6 +1072,10 @@ struct bss_parameters {   * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs)   *	during which a mesh STA can send only one Action frame containing   *	a PREQ element for root path confirmation. + * @power_mode: The default mesh power save mode which will be the initial + *	setting for new peer links. + * @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake + *	after transmitting its beacon.   */  struct mesh_config {  	u16 dot11MeshRetryTimeout; @@ -1020,6 +1103,8 @@ struct mesh_config {  	u32 dot11MeshHWMPactivePathToRootTimeout;  	u16 dot11MeshHWMProotInterval;  	u16 dot11MeshHWMPconfirmationInterval; +	enum nl80211_mesh_power_mode power_mode; +	u16 dot11MeshAwakeWindowDuration;  };  /** @@ -1034,6 +1119,8 @@ struct mesh_config {   * @ie_len: length of vendor information elements   * @is_authenticated: this mesh requires authentication   * @is_secure: this mesh uses security + * @dtim_period: DTIM period to use + * @beacon_interval: beacon interval to use   * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]   *   * These parameters are fixed when the mesh is created. @@ -1049,6 +1136,8 @@ struct mesh_setup {  	u8 ie_len;  	bool is_authenticated;  	bool is_secure; +	u8 dtim_period; +	u16 beacon_interval;  	int mcast_rate[IEEE80211_NUM_BANDS];  }; @@ -1168,6 +1257,7 @@ struct cfg80211_match_set {   * @n_match_sets: number of match sets   * @wiphy: the wiphy this was for   * @dev: the interface + * @scan_start: start time of the scheduled scan   * @channels: channels to scan   * @rssi_thold: don't report scan results below this threshold (in s32 dBm)   */ @@ -1207,11 +1297,13 @@ enum cfg80211_signal_type {  /**   * struct cfg80211_bss_ie_data - BSS entry IE data + * @tsf: TSF contained in the frame that carried these IEs   * @rcu_head: internal use, for freeing   * @len: length of the IEs   * @data: IE data   */  struct cfg80211_bss_ies { +	u64 tsf;  	struct rcu_head rcu_head;  	int len;  	u8 data[]; @@ -1225,29 +1317,32 @@ struct cfg80211_bss_ies {   *   * @channel: channel this BSS is on   * @bssid: BSSID of the BSS - * @tsf: timestamp of last received update   * @beacon_interval: the beacon interval as from the frame   * @capability: the capability field in host byte order - * @ies: the information elements (Note that there - *	is no guarantee that these are well-formed!); this is a pointer to - *	either the beacon_ies or proberesp_ies depending on whether Probe - *	Response frame has been received + * @ies: the information elements (Note that there is no guarantee that these + *	are well-formed!); this is a pointer to either the beacon_ies or + *	proberesp_ies depending on whether Probe Response frame has been + *	received. It is always non-%NULL.   * @beacon_ies: the information elements from the last Beacon frame + *	(implementation note: if @hidden_beacon_bss is set this struct doesn't + *	own the beacon_ies, but they're just pointers to the ones from the + *	@hidden_beacon_bss struct)   * @proberesp_ies: the information elements from the last Probe Response frame + * @hidden_beacon_bss: in case this BSS struct represents a probe response from + *	a BSS that hides the SSID in its beacon, this points to the BSS struct + *	that holds the beacon data. @beacon_ies is still valid, of course, and + *	points to the same data as hidden_beacon_bss->beacon_ies in that case.   * @signal: signal strength value (type depends on the wiphy's signal_type) - * @free_priv: function pointer to free private data   * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes   */  struct cfg80211_bss { -	u64 tsf; -  	struct ieee80211_channel *channel;  	const struct cfg80211_bss_ies __rcu *ies;  	const struct cfg80211_bss_ies __rcu *beacon_ies;  	const struct cfg80211_bss_ies __rcu *proberesp_ies; -	void (*free_priv)(struct cfg80211_bss *bss); +	struct cfg80211_bss *hidden_beacon_bss;  	s32 signal; @@ -1256,7 +1351,7 @@ struct cfg80211_bss {  	u8 bssid[ETH_ALEN]; -	u8 priv[0] __attribute__((__aligned__(sizeof(void *)))); +	u8 priv[0] __aligned(sizeof(void *));  };  /** @@ -1266,7 +1361,7 @@ struct cfg80211_bss {   *   * Note that the return value is an RCU-protected pointer, so   * rcu_read_lock() must be held when calling this function. - * Returns %NULL if not found. + * Return: %NULL if not found.   */  const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie); @@ -1349,6 +1444,8 @@ struct cfg80211_assoc_request {   * @ie: Extra IEs to add to Deauthentication frame or %NULL   * @ie_len: Length of ie buffer in octets   * @reason_code: The reason code for the deauthentication + * @local_state_change: if set, change local state only and + *	do not set a deauth frame   */  struct cfg80211_deauth_request {  	const u8 *bssid; @@ -1434,6 +1531,7 @@ struct cfg80211_ibss_params {   * @ie: IEs for association request   * @ie_len: Length of assoc_ie in octets   * @privacy: indicates whether privacy-enabled APs should be used + * @mfp: indicate whether management frame protection is used   * @crypto: crypto settings   * @key_len: length of WEP key for shared key authentication   * @key_idx: index of WEP key for shared key authentication @@ -1454,6 +1552,7 @@ struct cfg80211_connect_params {  	u8 *ie;  	size_t ie_len;  	bool privacy; +	enum nl80211_mfp mfp;  	struct cfg80211_crypto_settings crypto;  	const u8 *key;  	u8 key_len, key_idx; @@ -1508,6 +1607,7 @@ struct cfg80211_pmksa {   *	one bit per byte, in same format as nl80211   * @pattern: bytes to match where bitmask is 1   * @pattern_len: length of pattern (in bytes) + * @pkt_offset: packet offset (in bytes)   *   * Internal note: @mask and @pattern are allocated in one chunk of   * memory, free @mask only! @@ -1515,6 +1615,42 @@ struct cfg80211_pmksa {  struct cfg80211_wowlan_trig_pkt_pattern {  	u8 *mask, *pattern;  	int pattern_len; +	int pkt_offset; +}; + +/** + * struct cfg80211_wowlan_tcp - TCP connection parameters + * + * @sock: (internal) socket for source port allocation + * @src: source IP address + * @dst: destination IP address + * @dst_mac: destination MAC address + * @src_port: source port + * @dst_port: destination port + * @payload_len: data payload length + * @payload: data payload buffer + * @payload_seq: payload sequence stamping configuration + * @data_interval: interval at which to send data packets + * @wake_len: wakeup payload match length + * @wake_data: wakeup payload match data + * @wake_mask: wakeup payload match mask + * @tokens_size: length of the tokens buffer + * @payload_tok: payload token usage configuration + */ +struct cfg80211_wowlan_tcp { +	struct socket *sock; +	__be32 src, dst; +	u16 src_port, dst_port; +	u8 dst_mac[ETH_ALEN]; +	int payload_len; +	const u8 *payload; +	struct nl80211_wowlan_tcp_data_seq payload_seq; +	u32 data_interval; +	u32 wake_len; +	const u8 *wake_data, *wake_mask; +	u32 tokens_size; +	/* must be last, variable member */ +	struct nl80211_wowlan_tcp_data_token payload_tok;  };  /** @@ -1531,16 +1667,49 @@ struct cfg80211_wowlan_trig_pkt_pattern {   * @eap_identity_req: wake up on EAP identity request packet   * @four_way_handshake: wake up on 4-way handshake   * @rfkill_release: wake up when rfkill is released + * @tcp: TCP connection establishment/wakeup parameters, see nl80211.h. + *	NULL if not configured.   */  struct cfg80211_wowlan {  	bool any, disconnect, magic_pkt, gtk_rekey_failure,  	     eap_identity_req, four_way_handshake,  	     rfkill_release;  	struct cfg80211_wowlan_trig_pkt_pattern *patterns; +	struct cfg80211_wowlan_tcp *tcp;  	int n_patterns;  };  /** + * struct cfg80211_wowlan_wakeup - wakeup report + * @disconnect: woke up by getting disconnected + * @magic_pkt: woke up by receiving magic packet + * @gtk_rekey_failure: woke up by GTK rekey failure + * @eap_identity_req: woke up by EAP identity request packet + * @four_way_handshake: woke up by 4-way handshake + * @rfkill_release: woke up by rfkill being released + * @pattern_idx: pattern that caused wakeup, -1 if not due to pattern + * @packet_present_len: copied wakeup packet data + * @packet_len: original wakeup packet length + * @packet: The packet causing the wakeup, if any. + * @packet_80211:  For pattern match, magic packet and other data + *	frame triggers an 802.3 frame should be reported, for + *	disconnect due to deauth 802.11 frame. This indicates which + *	it is. + * @tcp_match: TCP wakeup packet received + * @tcp_connlost: TCP connection lost or failed to establish + * @tcp_nomoretokens: TCP data ran out of tokens + */ +struct cfg80211_wowlan_wakeup { +	bool disconnect, magic_pkt, gtk_rekey_failure, +	     eap_identity_req, four_way_handshake, +	     rfkill_release, packet_80211, +	     tcp_match, tcp_connlost, tcp_nomoretokens; +	s32 pattern_idx; +	u32 packet_present_len, packet_len; +	const void *packet; +}; + +/**   * struct cfg80211_gtk_rekey_data - rekey data   * @kek: key encryption key   * @kck: key confirmation key @@ -1763,6 +1932,15 @@ struct cfg80211_gtk_rekey_data {   *   * @start_p2p_device: Start the given P2P device.   * @stop_p2p_device: Stop the given P2P device. + * + * @set_mac_acl: Sets MAC address control list in AP and P2P GO mode. + *	Parameters include ACL policy, an array of MAC address of stations + *	and the number of MAC addresses. If there is already a list in driver + *	this new list replaces the existing one. Driver has to clear its ACL + *	when number of MAC addresses entries is passed as 0. Drivers which + *	advertise the support for MAC based ACL have to implement this callback. + * + * @start_radar_detection: Start radar detection in the driver.   */  struct cfg80211_ops {  	int	(*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); @@ -1983,6 +2161,13 @@ struct cfg80211_ops {  				    struct wireless_dev *wdev);  	void	(*stop_p2p_device)(struct wiphy *wiphy,  				   struct wireless_dev *wdev); + +	int	(*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev, +			       const struct cfg80211_acl_data *params); + +	int	(*start_radar_detection)(struct wiphy *wiphy, +					 struct net_device *dev, +					 struct cfg80211_chan_def *chandef);  };  /* @@ -2092,6 +2277,7 @@ struct ieee80211_iface_limit {   * @beacon_int_infra_match: In this combination, the beacon intervals   *	between infrastructure and AP types must match. This is required   *	only in special cases. + * @radar_detect_widths: bitmap of channel widths supported for radar detection   *   * These examples can be expressed as follows:   * @@ -2144,10 +2330,7 @@ struct ieee80211_iface_combination {  	u16 max_interfaces;  	u8 n_limits;  	bool beacon_int_infra_match; -}; - -struct mac_address { -	u8 addr[ETH_ALEN]; +	u8 radar_detect_widths;  };  struct ieee80211_txrx_stypes { @@ -2181,6 +2364,14 @@ enum wiphy_wowlan_support_flags {  	WIPHY_WOWLAN_RFKILL_RELEASE	= BIT(7),  }; +struct wiphy_wowlan_tcp_support { +	const struct nl80211_wowlan_tcp_data_token_feature *tok; +	u32 data_payload_max; +	u32 data_interval_max; +	u32 wake_payload_max; +	bool seq; +}; +  /**   * struct wiphy_wowlan_support - WoWLAN support data   * @flags: see &enum wiphy_wowlan_support_flags @@ -2188,12 +2379,16 @@ enum wiphy_wowlan_support_flags {   *	(see nl80211.h for the pattern definition)   * @pattern_max_len: maximum length of each pattern   * @pattern_min_len: minimum length of each pattern + * @max_pkt_offset: maximum Rx packet offset + * @tcp: TCP wakeup support information   */  struct wiphy_wowlan_support {  	u32 flags;  	int n_patterns;  	int pattern_max_len;  	int pattern_min_len; +	int max_pkt_offset; +	const struct wiphy_wowlan_tcp_support *tcp;  };  /** @@ -2290,6 +2485,17 @@ struct wiphy_wowlan_support {   * @ap_sme_capa: AP SME capabilities, flags from &enum nl80211_ap_sme_features.   * @ht_capa_mod_mask:  Specify what ht_cap values can be over-ridden.   *	If null, then none can be over-ridden. + * + * @max_acl_mac_addrs: Maximum number of MAC addresses that the device + *	supports for ACL. + * + * @extended_capabilities: extended capabilities supported by the driver, + *	additional capabilities might be supported by userspace; these are + *	the 802.11 extended capabilities ("Extended Capabilities element") + *	and are in the same format as in the information element. See + *	802.11-2012 8.4.2.29 for the defined fields. + * @extended_capabilities_mask: mask of the valid values + * @extended_capabilities_len: length of the extended capabilities   */  struct wiphy {  	/* assign these fields before you register the wiphy */ @@ -2311,6 +2517,8 @@ struct wiphy {  	/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */  	u16 interface_modes; +	u16 max_acl_mac_addrs; +  	u32 flags, features;  	u32 ap_sme_capa; @@ -2333,7 +2541,7 @@ struct wiphy {  	u32 rts_threshold;  	u8 coverage_class; -	char fw_version[ETHTOOL_BUSINFO_LEN]; +	char fw_version[ETHTOOL_FWVERS_LEN];  	u32 hw_version;  #ifdef CONFIG_PM @@ -2354,6 +2562,9 @@ struct wiphy {  	 */  	u32 probe_resp_offload; +	const u8 *extended_capabilities, *extended_capabilities_mask; +	u8 extended_capabilities_len; +  	/* If multiple wiphys are registered and you're handed e.g.  	 * a regular netdev with assigned ieee80211_ptr, you won't  	 * know whether it points to a wiphy your driver has registered @@ -2364,12 +2575,12 @@ struct wiphy {  	struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];  	/* Lets us get back the wiphy on the callback */ -	int (*reg_notifier)(struct wiphy *wiphy, -			    struct regulatory_request *request); +	void (*reg_notifier)(struct wiphy *wiphy, +			     struct regulatory_request *request);  	/* fields below are read-only, assigned by cfg80211 */ -	const struct ieee80211_regdomain *regd; +	const struct ieee80211_regdomain __rcu *regd;  	/* the item in /sys/class/ieee80211/ points to this,  	 * you need use set_wiphy_dev() (see below) */ @@ -2392,7 +2603,7 @@ struct wiphy {  	const struct iw_handler_def *wext;  #endif -	char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); +	char priv[0] __aligned(NETDEV_ALIGN);  };  static inline struct net *wiphy_net(struct wiphy *wiphy) @@ -2409,6 +2620,7 @@ static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net)   * wiphy_priv - return priv from wiphy   *   * @wiphy: the wiphy whose priv pointer to return + * Return: The priv of @wiphy.   */  static inline void *wiphy_priv(struct wiphy *wiphy)  { @@ -2420,6 +2632,7 @@ static inline void *wiphy_priv(struct wiphy *wiphy)   * priv_to_wiphy - return the wiphy containing the priv   *   * @priv: a pointer previously returned by wiphy_priv + * Return: The wiphy of @priv.   */  static inline struct wiphy *priv_to_wiphy(void *priv)  { @@ -2442,6 +2655,7 @@ static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev)   * wiphy_dev - get wiphy dev pointer   *   * @wiphy: The wiphy whose device struct to look up + * Return: The dev of @wiphy.   */  static inline struct device *wiphy_dev(struct wiphy *wiphy)  { @@ -2452,6 +2666,7 @@ static inline struct device *wiphy_dev(struct wiphy *wiphy)   * wiphy_name - get wiphy name   *   * @wiphy: The wiphy whose name to return + * Return: The name of @wiphy.   */  static inline const char *wiphy_name(const struct wiphy *wiphy)  { @@ -2467,8 +2682,8 @@ static inline const char *wiphy_name(const struct wiphy *wiphy)   * Create a new wiphy and associate the given operations with it.   * @sizeof_priv bytes are allocated for private use.   * - * The returned pointer must be assigned to each netdev's - * ieee80211_ptr for proper operation. + * Return: A pointer to the new wiphy. This pointer must be + * assigned to each netdev's ieee80211_ptr for proper operation.   */  struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv); @@ -2477,7 +2692,7 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv);   *   * @wiphy: The wiphy to register.   * - * Returns a non-negative wiphy index or a negative error code. + * Return: A non-negative wiphy index or a negative error code.   */  extern int wiphy_register(struct wiphy *wiphy); @@ -2529,7 +2744,6 @@ struct cfg80211_cached_keys;   *	the user-set AP, monitor and WDS channel   * @preset_chan: (private) Used by the internal configuration code to   *	track the channel to be used for AP later - * @preset_chantype: (private) the corresponding channel type   * @bssid: (private) Used by the internal configuration code   * @ssid: (private) Used by the internal configuration code   * @ssid_len: (private) Used by the internal configuration code @@ -2548,6 +2762,8 @@ struct cfg80211_cached_keys;   *	beacons, 0 when not valid   * @address: The address for this device, valid only if @netdev is %NULL   * @p2p_started: true if this is a P2P Device that has been started + * @cac_started: true if DFS channel availability check has been started + * @cac_start_time: timestamp (jiffies) when the dfs state was entered.   */  struct wireless_dev {  	struct wiphy *wiphy; @@ -2599,6 +2815,9 @@ struct wireless_dev {  	u32 ap_unexpected_nlportid; +	bool cac_started; +	unsigned long cac_start_time; +  #ifdef CONFIG_CFG80211_WEXT  	/* wext data */  	struct { @@ -2626,6 +2845,7 @@ static inline u8 *wdev_address(struct wireless_dev *wdev)   * wdev_priv - return wiphy priv from wireless_dev   *   * @wdev: The wireless device whose wiphy's priv pointer to return + * Return: The wiphy priv of @wdev.   */  static inline void *wdev_priv(struct wireless_dev *wdev)  { @@ -2643,12 +2863,14 @@ static inline void *wdev_priv(struct wireless_dev *wdev)   * ieee80211_channel_to_frequency - convert channel number to frequency   * @chan: channel number   * @band: band, necessary due to channel number overlap + * Return: The corresponding frequency (in MHz), or 0 if the conversion failed.   */  extern int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band);  /**   * ieee80211_frequency_to_channel - convert frequency to channel number   * @freq: center frequency + * Return: The corresponding channel, or 0 if the conversion failed.   */  extern int ieee80211_frequency_to_channel(int freq); @@ -2665,6 +2887,7 @@ extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,   * ieee80211_get_channel - get channel struct from wiphy for specified frequency   * @wiphy: the struct wiphy to get the channel for   * @freq: the center frequency of the channel + * Return: The channel struct from @wiphy at @freq.   */  static inline struct ieee80211_channel *  ieee80211_get_channel(struct wiphy *wiphy, int freq) @@ -2679,10 +2902,10 @@ ieee80211_get_channel(struct wiphy *wiphy, int freq)   * @basic_rates: bitmap of basic rates   * @bitrate: the bitrate for which to find the basic rate   * - * This function returns the basic rate corresponding to a given - * bitrate, that is the next lower bitrate contained in the basic - * rate map, which is, for this function, given as a bitmap of - * indices of rates in the band's bitrate table. + * Return: The basic rate corresponding to a given bitrate, that + * is the next lower bitrate contained in the basic rate map, + * which is, for this function, given as a bitmap of indices of + * rates in the band's bitrate table.   */  struct ieee80211_rate *  ieee80211_get_response_rate(struct ieee80211_supported_band *sband, @@ -2775,18 +2998,21 @@ extern const unsigned char bridge_tunnel_header[6];  /**   * ieee80211_get_hdrlen_from_skb - get header length from data   * + * @skb: the frame + *   * Given an skb with a raw 802.11 header at the data pointer this function - * returns the 802.11 header length in bytes (not including encryption - * headers). If the data in the sk_buff is too short to contain a valid 802.11 - * header the function returns 0. + * returns the 802.11 header length.   * - * @skb: the frame + * Return: The 802.11 header length in bytes (not including encryption + * headers). Or 0 if the data in the sk_buff is too short to contain a valid + * 802.11 header.   */  unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);  /**   * ieee80211_hdrlen - get header length in bytes from frame control   * @fc: frame control field in little-endian format + * Return: The header length in bytes.   */  unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc); @@ -2794,7 +3020,7 @@ unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc);   * ieee80211_get_mesh_hdrlen - get mesh extension header length   * @meshhdr: the mesh extension header, only the flags field   *	(first byte) will be accessed - * Returns the length of the extension header, which is always at + * Return: The length of the extension header, which is always at   * least 6 bytes and at most 18 if address 5 and 6 are present.   */  unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr); @@ -2812,6 +3038,7 @@ unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr);   * @skb: the 802.11 data frame   * @addr: the device MAC address   * @iftype: the virtual interface type + * Return: 0 on success. Non-zero on error.   */  int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,  			   enum nl80211_iftype iftype); @@ -2823,6 +3050,7 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,   * @iftype: the virtual interface type   * @bssid: the network bssid (used only for iftype STATION and ADHOC)   * @qos: build 802.11 QoS data frame + * Return: 0 on success, or a negative error code.   */  int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr,  			     enum nl80211_iftype iftype, u8 *bssid, bool qos); @@ -2850,6 +3078,7 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,  /**   * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame   * @skb: the data frame + * Return: The 802.1p/1d tag.   */  unsigned int cfg80211_classify8021d(struct sk_buff *skb); @@ -2860,12 +3089,13 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb);   * @ies: data consisting of IEs   * @len: length of data   * - * This function will return %NULL if the element ID could - * not be found or if the element is invalid (claims to be - * longer than the given data), or a pointer to the first byte - * of the requested element, that is the byte containing the - * element ID. There are no checks on the element length - * other than having to fit into the given data. + * Return: %NULL if the element ID could not be found or if + * the element is invalid (claims to be longer than the given + * data), or a pointer to the first byte of the requested + * element, that is the byte containing the element ID. + * + * Note: There are no checks on the element length other than + * having to fit into the given data.   */  const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len); @@ -2877,12 +3107,13 @@ const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len);   * @ies: data consisting of IEs   * @len: length of data   * - * This function will return %NULL if the vendor specific element ID - * could not be found or if the element is invalid (claims to be - * longer than the given data), or a pointer to the first byte - * of the requested element, that is the byte containing the - * element ID. There are no checks on the element length - * other than having to fit into the given data. + * Return: %NULL if the vendor specific element ID could not be found or if the + * element is invalid (claims to be longer than the given data), or a pointer to + * the first byte of the requested element, that is the byte containing the + * element ID. + * + * Note: There are no checks on the element length other than having to fit into + * the given data.   */  const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,  				  const u8 *ies, int len); @@ -2915,6 +3146,8 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,   *   * Drivers should check the return value, its possible you can get   * an -ENOMEM. + * + * Return: 0 on success. -ENOMEM.   */  extern int regulatory_hint(struct wiphy *wiphy, const char *alpha2); @@ -2938,28 +3171,22 @@ extern void wiphy_apply_custom_regulatory(   * freq_reg_info - get regulatory information for the given frequency   * @wiphy: the wiphy for which we want to process this rule for   * @center_freq: Frequency in KHz for which we want regulatory information for - * @desired_bw_khz: the desired max bandwidth you want to use per - *	channel. Note that this is still 20 MHz if you want to use HT40 - *	as HT40 makes use of two channels for its 40 MHz width bandwidth. - *	If set to 0 we'll assume you want the standard 20 MHz. - * @reg_rule: the regulatory rule which we have for this frequency   *   * Use this function to get the regulatory rule for a specific frequency on   * a given wireless device. If the device has a specific regulatory domain   * it wants to follow we respect that unless a country IE has been received   * and processed already.   * - * Returns 0 if it was able to find a valid regulatory rule which does - * apply to the given center_freq otherwise it returns non-zero. It will - * also return -ERANGE if we determine the given center_freq does not even have - * a regulatory rule for a frequency range in the center_freq's band. See - * freq_in_rule_band() for our current definition of a band -- this is purely - * subjective and right now its 802.11 specific. + * Return: A valid pointer, or, when an error occurs, for example if no rule + * can be found, the return value is encoded using ERR_PTR(). Use IS_ERR() to + * check and PTR_ERR() to obtain the numeric return value. The numeric return + * value will be -ERANGE if we determine the given center_freq does not even + * have a regulatory rule for a frequency range in the center_freq's band. + * See freq_in_rule_band() for our current definition of a band -- this is + * purely subjective and right now it's 802.11 specific.   */ -extern int freq_reg_info(struct wiphy *wiphy, -			 u32 center_freq, -			 u32 desired_bw_khz, -			 const struct ieee80211_reg_rule **reg_rule); +const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy, +					       u32 center_freq);  /*   * callbacks for asynchronous cfg80211 methods, notification @@ -3006,7 +3233,8 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy);   * This informs cfg80211 that BSS information was found and   * the BSS should be updated/added.   * - * NOTE: Returns a referenced struct, must be released with cfg80211_put_bss()! + * Return: A referenced struct, must be released with cfg80211_put_bss()! + * Or %NULL on error.   */  struct cfg80211_bss * __must_check  cfg80211_inform_bss_frame(struct wiphy *wiphy, @@ -3031,7 +3259,8 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,   * This informs cfg80211 that BSS information was found and   * the BSS should be updated/added.   * - * NOTE: Returns a referenced struct, must be released with cfg80211_put_bss()! + * Return: A referenced struct, must be released with cfg80211_put_bss()! + * Or %NULL on error.   */  struct cfg80211_bss * __must_check  cfg80211_inform_bss(struct wiphy *wiphy, @@ -3054,25 +3283,23 @@ cfg80211_get_ibss(struct wiphy *wiphy,  				WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);  } -struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy, -				       struct ieee80211_channel *channel, -				       const u8 *meshid, size_t meshidlen, -				       const u8 *meshcfg);  /**   * cfg80211_ref_bss - reference BSS struct + * @wiphy: the wiphy this BSS struct belongs to   * @bss: the BSS struct to reference   *   * Increments the refcount of the given BSS struct.   */ -void cfg80211_ref_bss(struct cfg80211_bss *bss); +void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);  /**   * cfg80211_put_bss - unref BSS struct + * @wiphy: the wiphy this BSS struct belongs to   * @bss: the BSS struct   *   * Decrements the refcount of the given BSS struct.   */ -void cfg80211_put_bss(struct cfg80211_bss *bss); +void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);  /**   * cfg80211_unlink_bss - unlink BSS from internal data structures @@ -3308,16 +3535,18 @@ void wiphy_rfkill_stop_polling(struct wiphy *wiphy);   * the testmode command. Since it is intended for a reply, calling   * it outside of the @testmode_cmd operation is invalid.   * - * The returned skb (or %NULL if any errors happen) is pre-filled - * with the wiphy index and set up in a way that any data that is - * put into the skb (with skb_put(), nla_put() or similar) will end - * up being within the %NL80211_ATTR_TESTDATA attribute, so all that - * needs to be done with the skb is adding data for the corresponding - * userspace tool which can then read that data out of the testdata - * attribute. You must not modify the skb in any other way. + * The returned skb is pre-filled with the wiphy index and set up in + * a way that any data that is put into the skb (with skb_put(), + * nla_put() or similar) will end up being within the + * %NL80211_ATTR_TESTDATA attribute, so all that needs to be done + * with the skb is adding data for the corresponding userspace tool + * which can then read that data out of the testdata attribute. You + * must not modify the skb in any other way.   *   * When done, call cfg80211_testmode_reply() with the skb and return   * its error code as the result of the @testmode_cmd operation. + * + * Return: An allocated and pre-filled skb. %NULL if any errors happen.   */  struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy,  						  int approxlen); @@ -3327,11 +3556,12 @@ struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy,   * @skb: The skb, must have been allocated with   *	cfg80211_testmode_alloc_reply_skb()   * - * Returns an error code or 0 on success, since calling this - * function will usually be the last thing before returning - * from the @testmode_cmd you should return the error code. - * Note that this function consumes the skb regardless of the - * return value. + * Since calling this function will usually be the last thing + * before returning from the @testmode_cmd you should return + * the error code.  Note that this function consumes the skb + * regardless of the return value. + * + * Return: An error code or 0 on success.   */  int cfg80211_testmode_reply(struct sk_buff *skb); @@ -3345,14 +3575,16 @@ int cfg80211_testmode_reply(struct sk_buff *skb);   * This function allocates and pre-fills an skb for an event on the   * testmode multicast group.   * - * The returned skb (or %NULL if any errors happen) is set up in the - * same way as with cfg80211_testmode_alloc_reply_skb() but prepared - * for an event. As there, you should simply add data to it that will - * then end up in the %NL80211_ATTR_TESTDATA attribute. Again, you must - * not modify the skb in any other way. + * The returned skb is set up in the same way as with + * cfg80211_testmode_alloc_reply_skb() but prepared for an event. As + * there, you should simply add data to it that will then end up in the + * %NL80211_ATTR_TESTDATA attribute. Again, you must not modify the skb + * in any other way.   *   * When done filling the skb, call cfg80211_testmode_event() with the   * skb to send the event. + * + * Return: An allocated and pre-filled skb. %NULL if any errors happen.   */  struct sk_buff *cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy,  						  int approxlen, gfp_t gfp); @@ -3533,13 +3765,13 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,   * @len: length of the frame data   * @gfp: context flags   * - * Returns %true if a user space application has registered for this frame. + * This function is called whenever an Action frame is received for a station + * mode interface, but is not processed in kernel. + * + * Return: %true if a user space application has registered for this frame.   * For action frames, that makes it responsible for rejecting unrecognized   * action frames; %false otherwise, in which case for action frames the   * driver is responsible for rejecting the frame. - * - * This function is called whenever an Action frame is received for a station - * mode interface, but is not processed in kernel.   */  bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,  		      const u8 *buf, size_t len, gfp_t gfp); @@ -3575,6 +3807,31 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,  			      gfp_t gfp);  /** + * cfg80211_radar_event - radar detection event + * @wiphy: the wiphy + * @chandef: chandef for the current channel + * @gfp: context flags + * + * This function is called when a radar is detected on the current chanenl. + */ +void cfg80211_radar_event(struct wiphy *wiphy, +			  struct cfg80211_chan_def *chandef, gfp_t gfp); + +/** + * cfg80211_cac_event - Channel availability check (CAC) event + * @netdev: network device + * @event: type of event + * @gfp: context flags + * + * This function is called when a Channel availability check (CAC) is finished + * or aborted. This must be called to notify the completion of a CAC process, + * also by full-MAC drivers. + */ +void cfg80211_cac_event(struct net_device *netdev, +			enum nl80211_radar_event event, gfp_t gfp); + + +/**   * cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer   * @dev: network device   * @peer: peer's MAC address @@ -3631,7 +3888,7 @@ void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,   * This function is used in AP mode (only!) to inform userspace that   * a spurious class 3 frame was received, to be able to deauth the   * sender. - * Returns %true if the frame was passed to userspace (or this failed + * Return: %true if the frame was passed to userspace (or this failed   * for a reason other than not having a subscription.)   */  bool cfg80211_rx_spurious_frame(struct net_device *dev, @@ -3647,7 +3904,7 @@ bool cfg80211_rx_spurious_frame(struct net_device *dev,   * an associated station sent a 4addr frame but that wasn't expected.   * It is allowed and desirable to send this event only once for each   * station to avoid event flooding. - * Returns %true if the frame was passed to userspace (or this failed + * Return: %true if the frame was passed to userspace (or this failed   * for a reason other than not having a subscription.)   */  bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, @@ -3685,8 +3942,8 @@ void cfg80211_report_obss_beacon(struct wiphy *wiphy,   * @wiphy: the wiphy   * @chandef: the channel definition   * - * This function returns true if there is no secondary channel or the secondary - * channel(s) can be used for beaconing (i.e. is not a radar channel etc.) + * Return: %true if there is no secondary channel or the secondary channel(s) + * can be used for beaconing (i.e. is not a radar channel etc.)   */  bool cfg80211_reg_can_beacon(struct wiphy *wiphy,  			     struct cfg80211_chan_def *chandef); @@ -3756,14 +4013,29 @@ void cfg80211_unregister_wdev(struct wireless_dev *wdev);   * The function finds a given P2P attribute in the (vendor) IEs and   * copies its contents to the given buffer.   * - * The return value is a negative error code (-%EILSEQ or -%ENOENT) if - * the data is malformed or the attribute can't be found (respectively), - * or the length of the found attribute (which can be zero). + * Return: A negative error code (-%EILSEQ or -%ENOENT) if the data is + * malformed or the attribute can't be found (respectively), or the + * length of the found attribute (which can be zero).   */  int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,  			  enum ieee80211_p2p_attr_id attr,  			  u8 *buf, unsigned int bufsize); +/** + * cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN + * @wdev: the wireless device reporting the wakeup + * @wakeup: the wakeup report + * @gfp: allocation flags + * + * This function reports that the given device woke up. If it + * caused the wakeup, report the reason(s), otherwise you may + * pass %NULL as the @wakeup parameter to advertise that something + * else caused the wakeup. + */ +void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, +				   struct cfg80211_wowlan_wakeup *wakeup, +				   gfp_t gfp); +  /* Logging, debugging and troubleshooting/diagnostic helpers. */  /* wiphy_printk helpers, similar to dev_printk */ diff --git a/include/net/dn_route.h b/include/net/dn_route.h index 4f7d6a18238..2e9d317c82d 100644 --- a/include/net/dn_route.h +++ b/include/net/dn_route.h @@ -16,7 +16,7 @@  *******************************************************************************/  extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri); -extern int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *, struct sock *sk, int flags); +extern int dn_route_output_sock(struct dst_entry __rcu **pprt, struct flowidn *, struct sock *sk, int flags);  extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb);  extern void dn_rt_cache_flush(int delay); diff --git a/include/net/dsfield.h b/include/net/dsfield.h index 8a8d4e06900..e1ad903a8d6 100644 --- a/include/net/dsfield.h +++ b/include/net/dsfield.h @@ -43,11 +43,9 @@ static inline void ipv4_change_dsfield(struct iphdr *iph,__u8 mask,  static inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask,      __u8 value)  { -        __u16 tmp; +	__be16 *p = (__force __be16 *)ipv6h; -	tmp = ntohs(*(__be16 *) ipv6h); -	tmp = (tmp & ((mask << 4) | 0xf00f)) | (value << 4); -	*(__be16 *) ipv6h = htons(tmp); +	*p = (*p & htons((((u16)mask << 4) | 0xf00f))) | htons((u16)value << 4);  } diff --git a/include/net/dst.h b/include/net/dst.h index 9a7881066fb..1f8fd109e22 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -36,13 +36,9 @@ struct dst_entry {  	struct net_device       *dev;  	struct  dst_ops	        *ops;  	unsigned long		_metrics; -	union { -		unsigned long           expires; -		/* point to where the dst_entry copied from */ -		struct dst_entry        *from; -	}; +	unsigned long           expires;  	struct dst_entry	*path; -	void			*__pad0; +	struct dst_entry	*from;  #ifdef CONFIG_XFRM  	struct xfrm_state	*xfrm;  #else @@ -61,6 +57,7 @@ struct dst_entry {  #define DST_NOPEER		0x0040  #define DST_FAKE_RTABLE		0x0080  #define DST_XFRM_TUNNEL		0x0100 +#define DST_XFRM_QUEUE		0x0200  	unsigned short		pending_confirm; @@ -416,13 +413,15 @@ static inline int dst_neigh_output(struct dst_entry *dst, struct neighbour *n,  static inline struct neighbour *dst_neigh_lookup(const struct dst_entry *dst, const void *daddr)  { -	return dst->ops->neigh_lookup(dst, NULL, daddr); +	struct neighbour *n = dst->ops->neigh_lookup(dst, NULL, daddr); +	return IS_ERR(n) ? NULL : n;  }  static inline struct neighbour *dst_neigh_lookup_skb(const struct dst_entry *dst,  						     struct sk_buff *skb)  { -	return dst->ops->neigh_lookup(dst, skb, NULL); +	struct neighbour *n =  dst->ops->neigh_lookup(dst, skb, NULL); +	return IS_ERR(n) ? NULL : n;  }  static inline void dst_link_failure(struct sk_buff *skb) diff --git a/include/net/flow_keys.h b/include/net/flow_keys.h index 80461c1ae9e..bb8271d487b 100644 --- a/include/net/flow_keys.h +++ b/include/net/flow_keys.h @@ -9,6 +9,7 @@ struct flow_keys {  		__be32 ports;  		__be16 port16[2];  	}; +	u16 thoff;  	u8 ip_proto;  }; diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h index e5062c955ea..734d9b5f577 100644 --- a/include/net/gro_cells.h +++ b/include/net/gro_cells.h @@ -73,8 +73,8 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de  	int i;  	gcells->gro_cells_mask = roundup_pow_of_two(netif_get_num_default_rss_queues()) - 1; -	gcells->cells = kcalloc(sizeof(struct gro_cell), -				gcells->gro_cells_mask + 1, +	gcells->cells = kcalloc(gcells->gro_cells_mask + 1, +				sizeof(struct gro_cell),  				GFP_KERNEL);  	if (!gcells->cells)  		return -ENOMEM; diff --git a/include/net/icmp.h b/include/net/icmp.h index 9ac2524d140..081439fd070 100644 --- a/include/net/icmp.h +++ b/include/net/icmp.h @@ -41,6 +41,7 @@ struct net;  extern void	icmp_send(struct sk_buff *skb_in,  int type, int code, __be32 info);  extern int	icmp_rcv(struct sk_buff *skb); +extern void	icmp_err(struct sk_buff *, u32 info);  extern int	icmp_init(void);  extern void	icmp_out_count(struct net *net, unsigned char type); diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index 9e34c877a77..fd4ee016ba5 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h @@ -28,16 +28,16 @@  struct inet_hashinfo; -/* I have no idea if this is a good hash for v6 or not. -DaveM */  static inline unsigned int inet6_ehashfn(struct net *net,  				const struct in6_addr *laddr, const u16 lport,  				const struct in6_addr *faddr, const __be16 fport)  { -	u32 ports = (lport ^ (__force u16)fport); +	u32 ports = (((u32)lport) << 16) | (__force u32)fport;  	return jhash_3words((__force u32)laddr->s6_addr32[3], -			    (__force u32)faddr->s6_addr32[3], -			    ports, inet_ehash_secret + net_hash_mix(net)); +			    ipv6_addr_jhash(faddr), +			    ports, +			    inet_ehash_secret + net_hash_mix(net));  }  static inline int inet6_sk_ehashfn(const struct sock *sk) @@ -71,6 +71,8 @@ extern struct sock *__inet6_lookup_established(struct net *net,  extern struct sock *inet6_lookup_listener(struct net *net,  					  struct inet_hashinfo *hashinfo, +					  const struct in6_addr *saddr, +					  const __be16 sport,  					  const struct in6_addr *daddr,  					  const unsigned short hnum,  					  const int dif); @@ -88,7 +90,8 @@ static inline struct sock *__inet6_lookup(struct net *net,  	if (sk)  		return sk; -	return inet6_lookup_listener(net, hashinfo, daddr, hnum, dif); +	return inet6_lookup_listener(net, hashinfo, saddr, sport, +				     daddr, hnum, dif);  }  static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 32786a04471..0a1dcc2fa2f 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h @@ -1,10 +1,17 @@  #ifndef __NET_FRAG_H__  #define __NET_FRAG_H__ +#include <linux/percpu_counter.h> +  struct netns_frags {  	int			nqueues; -	atomic_t		mem;  	struct list_head	lru_list; +	spinlock_t		lru_lock; + +	/* The percpu_counter "mem" need to be cacheline aligned. +	 *  mem.count must not share cacheline with other writers +	 */ +	struct percpu_counter   mem ____cacheline_aligned_in_smp;  	/* sysctls */  	int			timeout; @@ -13,12 +20,11 @@ struct netns_frags {  };  struct inet_frag_queue { -	struct hlist_node	list; -	struct netns_frags	*net; -	struct list_head	lru_list;   /* lru list member */  	spinlock_t		lock; -	atomic_t		refcnt;  	struct timer_list	timer;      /* when will this queue expire? */ +	struct list_head	lru_list;   /* lru list member */ +	struct hlist_node	list; +	atomic_t		refcnt;  	struct sk_buff		*fragments; /* list of received fragments */  	struct sk_buff		*fragments_tail;  	ktime_t			stamp; @@ -31,24 +37,36 @@ struct inet_frag_queue {  #define INET_FRAG_LAST_IN	1  	u16			max_size; + +	struct netns_frags	*net;  };  #define INETFRAGS_HASHSZ		64 +/* averaged: + * max_depth = default ipfrag_high_thresh / INETFRAGS_HASHSZ / + *	       rounded up (SKB_TRUELEN(0) + sizeof(struct ipq or + *	       struct frag_queue)) + */ +#define INETFRAGS_MAXDEPTH		128 +  struct inet_frags {  	struct hlist_head	hash[INETFRAGS_HASHSZ]; -	rwlock_t		lock; -	u32			rnd; -	int			qsize; +	/* This rwlock is a global lock (seperate per IPv4, IPv6 and +	 * netfilter). Important to keep this on a seperate cacheline. +	 */ +	rwlock_t		lock ____cacheline_aligned_in_smp;  	int			secret_interval;  	struct timer_list	secret_timer; +	u32			rnd; +	int			qsize;  	unsigned int		(*hashfn)(struct inet_frag_queue *); +	bool			(*match)(struct inet_frag_queue *q, void *arg);  	void			(*constructor)(struct inet_frag_queue *q,  						void *arg);  	void			(*destructor)(struct inet_frag_queue *);  	void			(*skb_free)(struct sk_buff *); -	bool			(*match)(struct inet_frag_queue *q, void *arg);  	void			(*frag_expire)(unsigned long data);  }; @@ -65,6 +83,8 @@ int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f, bool force);  struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,  		struct inet_frags *f, void *key, unsigned int hash)  	__releases(&f->lock); +void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q, +				   const char *prefix);  static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f)  { @@ -72,4 +92,65 @@ static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f  		inet_frag_destroy(q, f, NULL);  } +/* Memory Tracking Functions. */ + +/* The default percpu_counter batch size is not big enough to scale to + * fragmentation mem acct sizes. + * The mem size of a 64K fragment is approx: + *  (44 fragments * 2944 truesize) + frag_queue struct(200) = 129736 bytes + */ +static unsigned int frag_percpu_counter_batch = 130000; + +static inline int frag_mem_limit(struct netns_frags *nf) +{ +	return percpu_counter_read(&nf->mem); +} + +static inline void sub_frag_mem_limit(struct inet_frag_queue *q, int i) +{ +	__percpu_counter_add(&q->net->mem, -i, frag_percpu_counter_batch); +} + +static inline void add_frag_mem_limit(struct inet_frag_queue *q, int i) +{ +	__percpu_counter_add(&q->net->mem, i, frag_percpu_counter_batch); +} + +static inline void init_frag_mem_limit(struct netns_frags *nf) +{ +	percpu_counter_init(&nf->mem, 0); +} + +static inline int sum_frag_mem_limit(struct netns_frags *nf) +{ +	int res; + +	local_bh_disable(); +	res = percpu_counter_sum_positive(&nf->mem); +	local_bh_enable(); + +	return res; +} + +static inline void inet_frag_lru_move(struct inet_frag_queue *q) +{ +	spin_lock(&q->net->lru_lock); +	list_move_tail(&q->lru_list, &q->net->lru_list); +	spin_unlock(&q->net->lru_lock); +} + +static inline void inet_frag_lru_del(struct inet_frag_queue *q) +{ +	spin_lock(&q->net->lru_lock); +	list_del(&q->lru_list); +	spin_unlock(&q->net->lru_lock); +} + +static inline void inet_frag_lru_add(struct netns_frags *nf, +				     struct inet_frag_queue *q) +{ +	spin_lock(&nf->lru_lock); +	list_add_tail(&q->lru_list, &nf->lru_list); +	spin_unlock(&nf->lru_lock); +}  #endif diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 67a8fa098e3..ef83d9e844b 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h @@ -81,7 +81,9 @@ struct inet_bind_bucket {  	struct net		*ib_net;  #endif  	unsigned short		port; -	signed short		fastreuse; +	signed char		fastreuse; +	signed char		fastreuseport; +	kuid_t			fastuid;  	int			num_owners;  	struct hlist_node	node;  	struct hlist_head	owners; @@ -92,8 +94,8 @@ static inline struct net *ib_net(struct inet_bind_bucket *ib)  	return read_pnet(&ib->ib_net);  } -#define inet_bind_bucket_for_each(tb, pos, head) \ -	hlist_for_each_entry(tb, pos, head, node) +#define inet_bind_bucket_for_each(tb, head) \ +	hlist_for_each_entry(tb, head, node)  struct inet_bind_hashbucket {  	spinlock_t		lock; @@ -257,15 +259,19 @@ extern void inet_unhash(struct sock *sk);  extern struct sock *__inet_lookup_listener(struct net *net,  					   struct inet_hashinfo *hashinfo, +					   const __be32 saddr, +					   const __be16 sport,  					   const __be32 daddr,  					   const unsigned short hnum,  					   const int dif);  static inline struct sock *inet_lookup_listener(struct net *net,  		struct inet_hashinfo *hashinfo, +		__be32 saddr, __be16 sport,  		__be32 daddr, __be16 dport, int dif)  { -	return __inet_lookup_listener(net, hashinfo, daddr, ntohs(dport), dif); +	return __inet_lookup_listener(net, hashinfo, saddr, sport, +				      daddr, ntohs(dport), dif);  }  /* Socket demux engine toys. */ @@ -358,7 +364,8 @@ static inline struct sock *__inet_lookup(struct net *net,  	struct sock *sk = __inet_lookup_established(net, hashinfo,  				saddr, sport, daddr, hnum, dif); -	return sk ? : __inet_lookup_listener(net, hashinfo, daddr, hnum, dif); +	return sk ? : __inet_lookup_listener(net, hashinfo, saddr, sport, +					     daddr, hnum, dif);  }  static inline struct sock *inet_lookup(struct net *net, diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index a4196cbc84e..7235ae73a1e 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -203,6 +203,7 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,  extern int inet_sk_rebuild_header(struct sock *sk);  extern u32 inet_ehash_secret; +extern u32 ipv6_hash_secret;  extern void build_ehash_secret(void);  static inline unsigned int inet_ehashfn(struct net *net, diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index 7d658d57736..f908dfc0650 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h @@ -178,11 +178,11 @@ static inline int inet_twsk_del_dead_node(struct inet_timewait_sock *tw)  #define inet_twsk_for_each(tw, node, head) \  	hlist_nulls_for_each_entry(tw, node, head, tw_node) -#define inet_twsk_for_each_inmate(tw, node, jail) \ -	hlist_for_each_entry(tw, node, jail, tw_death_node) +#define inet_twsk_for_each_inmate(tw, jail) \ +	hlist_for_each_entry(tw, jail, tw_death_node) -#define inet_twsk_for_each_inmate_safe(tw, node, safe, jail) \ -	hlist_for_each_entry_safe(tw, node, safe, jail, tw_death_node) +#define inet_twsk_for_each_inmate_safe(tw, safe, jail) \ +	hlist_for_each_entry_safe(tw, safe, jail, tw_death_node)  static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk)  { diff --git a/include/net/ip6_checksum.h b/include/net/ip6_checksum.h index 652d3d30935..7686e3f5033 100644 --- a/include/net/ip6_checksum.h +++ b/include/net/ip6_checksum.h @@ -35,63 +35,10 @@  #include <linux/ipv6.h>  #ifndef _HAVE_ARCH_IPV6_CSUM - -static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, -					  const struct in6_addr *daddr, -					  __u32 len, unsigned short proto, -					  __wsum csum) -{ - -	int carry; -	__u32 ulen; -	__u32 uproto; -	__u32 sum = (__force u32)csum; - -	sum += (__force u32)saddr->s6_addr32[0]; -	carry = (sum < (__force u32)saddr->s6_addr32[0]); -	sum += carry; - -	sum += (__force u32)saddr->s6_addr32[1]; -	carry = (sum < (__force u32)saddr->s6_addr32[1]); -	sum += carry; - -	sum += (__force u32)saddr->s6_addr32[2]; -	carry = (sum < (__force u32)saddr->s6_addr32[2]); -	sum += carry; - -	sum += (__force u32)saddr->s6_addr32[3]; -	carry = (sum < (__force u32)saddr->s6_addr32[3]); -	sum += carry; - -	sum += (__force u32)daddr->s6_addr32[0]; -	carry = (sum < (__force u32)daddr->s6_addr32[0]); -	sum += carry; - -	sum += (__force u32)daddr->s6_addr32[1]; -	carry = (sum < (__force u32)daddr->s6_addr32[1]); -	sum += carry; - -	sum += (__force u32)daddr->s6_addr32[2]; -	carry = (sum < (__force u32)daddr->s6_addr32[2]); -	sum += carry; - -	sum += (__force u32)daddr->s6_addr32[3]; -	carry = (sum < (__force u32)daddr->s6_addr32[3]); -	sum += carry; - -	ulen = (__force u32)htonl((__u32) len); -	sum += ulen; -	carry = (sum < ulen); -	sum += carry; - -	uproto = (__force u32)htonl(proto); -	sum += uproto; -	carry = (sum < uproto); -	sum += carry; - -	return csum_fold((__force __wsum)sum); -} - +__sum16 csum_ipv6_magic(const struct in6_addr *saddr, +			const struct in6_addr *daddr, +			__u32 len, unsigned short proto, +			__wsum csum);  #endif  static __inline__ __sum16 tcp_v6_check(int len, @@ -126,4 +73,5 @@ static inline void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)  	__tcp_v6_send_check(skb, &np->saddr, &np->daddr);  } +int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto);  #endif diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index fdc48a94a06..2a601e7da1b 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -89,8 +89,6 @@ struct fib6_table;  struct rt6_info {  	struct dst_entry		dst; -	struct neighbour		*n; -  	/*  	 * Tail elements of dst_entry (__refcnt etc.)  	 * and these elements (rarely used in hot path) are in @@ -166,50 +164,35 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)  static inline void rt6_clean_expires(struct rt6_info *rt)  { -	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) -		dst_release(rt->dst.from); -  	rt->rt6i_flags &= ~RTF_EXPIRES; -	rt->dst.from = NULL;  }  static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)  { -	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) -		dst_release(rt->dst.from); - -	rt->rt6i_flags |= RTF_EXPIRES;  	rt->dst.expires = expires; +	rt->rt6i_flags |= RTF_EXPIRES;  } -static inline void rt6_update_expires(struct rt6_info *rt, int timeout) +static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)  { -	if (!(rt->rt6i_flags & RTF_EXPIRES)) { -		if (rt->dst.from) -			dst_release(rt->dst.from); -		/* dst_set_expires relies on expires == 0  -		 * if it has not been set previously. -		 */ -		rt->dst.expires = 0; -	} +	struct rt6_info *rt; -	dst_set_expires(&rt->dst, timeout); -	rt->rt6i_flags |= RTF_EXPIRES; +	for (rt = rt0; rt && !(rt->rt6i_flags & RTF_EXPIRES); +	     rt = (struct rt6_info *)rt->dst.from); +	if (rt && rt != rt0) +		rt0->dst.expires = rt->dst.expires; + +	dst_set_expires(&rt0->dst, timeout); +	rt0->rt6i_flags |= RTF_EXPIRES;  }  static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from)  {  	struct dst_entry *new = (struct dst_entry *) from; -	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) { -		if (new == rt->dst.from) -			return; -		dst_release(rt->dst.from); -	} -  	rt->rt6i_flags &= ~RTF_EXPIRES; -	rt->dst.from = new;  	dst_hold(new); +	rt->dst.from = new;  }  static inline void ip6_rt_put(struct rt6_info *rt) diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 27d83183e61..260f83f16bc 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -23,6 +23,7 @@ struct route_info {  #include <net/sock.h>  #include <linux/ip.h>  #include <linux/ipv6.h> +#include <linux/route.h>  #define RT6_LOOKUP_F_IFACE		0x00000001  #define RT6_LOOKUP_F_REACHABLE		0x00000002 @@ -102,7 +103,6 @@ extern struct rt6_info		*rt6_lookup(struct net *net,  					    int oif, int flags);  extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev, -					 struct neighbour *neigh,  					 struct flowi6 *fl6);  extern int icmp6_dst_gc(void); @@ -194,4 +194,11 @@ static inline int ip6_skb_dst_mtu(struct sk_buff *skb)  	       skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));  } +static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, struct in6_addr *dest) +{ +	if (rt->rt6i_flags & RTF_GATEWAY) +		return &rt->rt6i_gateway; +	return dest; +} +  #endif diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 9497be1ad4c..e49db91593a 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -152,18 +152,16 @@ struct fib_result_nl {  };  #ifdef CONFIG_IP_ROUTE_MULTIPATH -  #define FIB_RES_NH(res)		((res).fi->fib_nh[(res).nh_sel]) - -#define FIB_TABLE_HASHSZ 2 -  #else /* CONFIG_IP_ROUTE_MULTIPATH */ -  #define FIB_RES_NH(res)		((res).fi->fib_nh[0]) +#endif /* CONFIG_IP_ROUTE_MULTIPATH */ +#ifdef CONFIG_IP_MULTIPLE_TABLES  #define FIB_TABLE_HASHSZ 256 - -#endif /* CONFIG_IP_ROUTE_MULTIPATH */ +#else +#define FIB_TABLE_HASHSZ 2 +#endif  extern __be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh); diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 68c69d54d39..fce8e6b66d5 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h @@ -976,6 +976,7 @@ struct netns_ipvs {  	int			sysctl_sync_retries;  	int			sysctl_nat_icmp_send;  	int			sysctl_pmtu_disc; +	int			sysctl_backup_only;  	/* ip_vs_lblc */  	int			sysctl_lblc_expiration; @@ -1067,6 +1068,12 @@ static inline int sysctl_pmtu_disc(struct netns_ipvs *ipvs)  	return ipvs->sysctl_pmtu_disc;  } +static inline int sysctl_backup_only(struct netns_ipvs *ipvs) +{ +	return ipvs->sync_state & IP_VS_STATE_BACKUP && +	       ipvs->sysctl_backup_only; +} +  #else  static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs) @@ -1114,6 +1121,11 @@ static inline int sysctl_pmtu_disc(struct netns_ipvs *ipvs)  	return 1;  } +static inline int sysctl_backup_only(struct netns_ipvs *ipvs) +{ +	return 0; +} +  #endif  /* diff --git a/include/net/ipip.h b/include/net/ipip.h index 21947cf4fa4..982141c1520 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h @@ -71,4 +71,17 @@ static inline void iptunnel_xmit(struct sk_buff *skb, struct net_device *dev)  	}  } +static inline void tunnel_ip_select_ident(struct sk_buff *skb, +					  const struct iphdr  *old_iph, +					  struct dst_entry *dst) +{ +	struct iphdr *iph = ip_hdr(skb); + +	/* Use inner packet iph-id if possible. */ +	if (skb->protocol == htons(ETH_P_IP) && old_iph->id) +		iph->id	= old_iph->id; +	else +		__ip_select_ident(iph, dst, +				  (skb_shinfo(skb)->gso_segs ?: 1) - 1); +}  #endif diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 5af66b26ebd..64d12e77719 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -15,6 +15,7 @@  #include <linux/ipv6.h>  #include <linux/hardirq.h> +#include <linux/jhash.h>  #include <net/if_inet6.h>  #include <net/ndisc.h>  #include <net/flow.h> @@ -222,6 +223,7 @@ struct ip6_flowlabel {  	struct in6_addr		dst;  	struct ipv6_txoptions	*opt;  	unsigned long		linger; +	struct rcu_head		rcu;  	u8			share;  	union {  		struct pid *pid; @@ -238,6 +240,7 @@ struct ip6_flowlabel {  struct ipv6_fl_socklist {  	struct ipv6_fl_socklist	*next;  	struct ip6_flowlabel	*fl; +	struct rcu_head		rcu;  };  extern struct ip6_flowlabel	*fl6_sock_lookup(struct sock *sk, __be32 label); @@ -288,12 +291,12 @@ static inline int ip6_frag_nqueues(struct net *net)  static inline int ip6_frag_mem(struct net *net)  { -	return atomic_read(&net->ipv6.frags.mem); +	return sum_frag_mem_limit(&net->ipv6.frags);  }  #endif -#define IPV6_FRAG_HIGH_THRESH	(256 * 1024)	/* 262144 */ -#define IPV6_FRAG_LOW_THRESH	(192 * 1024)	/* 196608 */ +#define IPV6_FRAG_HIGH_THRESH	(4 * 1024*1024)	/* 4194304 */ +#define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */  #define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */  extern int __ipv6_addr_type(const struct in6_addr *addr); @@ -355,14 +358,32 @@ static inline void ipv6_addr_prefix(struct in6_addr *pfx,  		pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);  } +static inline void __ipv6_addr_set_half(__be32 *addr, +					__be32 wh, __be32 wl) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +#if defined(__BIG_ENDIAN) +	if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) { +		*(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl)); +		return; +	} +#elif defined(__LITTLE_ENDIAN) +	if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) { +		*(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh)); +		return; +	} +#endif +#endif +	addr[0] = wh; +	addr[1] = wl; +} +  static inline void ipv6_addr_set(struct in6_addr *addr,   				     __be32 w1, __be32 w2,  				     __be32 w3, __be32 w4)  { -	addr->s6_addr32[0] = w1; -	addr->s6_addr32[1] = w2; -	addr->s6_addr32[2] = w3; -	addr->s6_addr32[3] = w4; +	__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2); +	__ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);  }  static inline bool ipv6_addr_equal(const struct in6_addr *a1, @@ -381,9 +402,37 @@ static inline bool ipv6_addr_equal(const struct in6_addr *a1,  #endif  } -static inline bool __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2, -				       unsigned int prefixlen) +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +static inline bool __ipv6_prefix_equal64_half(const __be64 *a1, +					      const __be64 *a2, +					      unsigned int len) +{ +	if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len)))) +		return false; +	return true; +} + +static inline bool ipv6_prefix_equal(const struct in6_addr *addr1, +				     const struct in6_addr *addr2, +				     unsigned int prefixlen) +{ +	const __be64 *a1 = (const __be64 *)addr1; +	const __be64 *a2 = (const __be64 *)addr2; + +	if (prefixlen >= 64) { +		if (a1[0] ^ a2[0]) +			return false; +		return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64); +	} +	return __ipv6_prefix_equal64_half(a1, a2, prefixlen); +} +#else +static inline bool ipv6_prefix_equal(const struct in6_addr *addr1, +				     const struct in6_addr *addr2, +				     unsigned int prefixlen)  { +	const __be32 *a1 = addr1->s6_addr32; +	const __be32 *a2 = addr2->s6_addr32;  	unsigned int pdw, pbi;  	/* check complete u32 in prefix */ @@ -398,14 +447,7 @@ static inline bool __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,  	return true;  } - -static inline bool ipv6_prefix_equal(const struct in6_addr *a1, -				     const struct in6_addr *a2, -				     unsigned int prefixlen) -{ -	return __ipv6_prefix_equal(a1->s6_addr32, a2->s6_addr32, -				   prefixlen); -} +#endif  struct inet_frag_queue; @@ -473,16 +515,38 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a)  #endif  } +/* more secured version of ipv6_addr_hash() */ +static inline u32 ipv6_addr_jhash(const struct in6_addr *a) +{ +	u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1]; + +	return jhash_3words(v, +			    (__force u32)a->s6_addr32[2], +			    (__force u32)a->s6_addr32[3], +			    ipv6_hash_secret); +} +  static inline bool ipv6_addr_loopback(const struct in6_addr *a)  { +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +	const unsigned long *ul = (const unsigned long *)a; + +	return (ul[0] | (ul[1] ^ cpu_to_be64(1))) == 0UL; +#else  	return (a->s6_addr32[0] | a->s6_addr32[1] |  		a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0; +#endif  }  static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)  { -	return (a->s6_addr32[0] | a->s6_addr32[1] | -		 (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0; +	return ( +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +		*(__be64 *)a | +#else +		(a->s6_addr32[0] | a->s6_addr32[1]) | +#endif +		(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;  }  /* @@ -507,7 +571,7 @@ static inline void ipv6_addr_set_v4mapped(const __be32 addr,   * find the first different bit between two addresses   * length of address must be a multiple of 32bits   */ -static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) +static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)  {  	const __be32 *a1 = token1, *a2 = token2;  	int i; @@ -539,6 +603,33 @@ static inline int __ipv6_addr_diff(const void *token1, const void *token2, int a  	return addrlen << 5;  } +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen) +{ +	const __be64 *a1 = token1, *a2 = token2; +	int i; + +	addrlen >>= 3; + +	for (i = 0; i < addrlen; i++) { +		__be64 xb = a1[i] ^ a2[i]; +		if (xb) +			return i * 64 + 63 - __fls(be64_to_cpu(xb)); +	} + +	return addrlen << 6; +} +#endif + +static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 +	if (__builtin_constant_p(addrlen) && !(addrlen & 7)) +		return __ipv6_addr_diff64(token1, token2, addrlen); +#endif +	return __ipv6_addr_diff32(token1, token2, addrlen); +} +  static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)  {  	return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); @@ -547,6 +638,20 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add  extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);  /* + *	Header manipulation + */ +static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass, +				__be32 flowlabel) +{ +	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel; +} + +static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr) +{ +	return *(__be32 *)hdr & IPV6_FLOWINFO_MASK; +} + +/*   *	Prototypes exported by ipv6   */ @@ -570,13 +675,6 @@ extern int			ip6_xmit(struct sock *sk,  					 struct ipv6_txoptions *opt,  					 int tclass); -extern int			ip6_nd_hdr(struct sock *sk, -					   struct sk_buff *skb, -					   struct net_device *dev, -					   const struct in6_addr *saddr, -					   const struct in6_addr *daddr, -					   int proto, int len); -  extern int			ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);  extern int			ip6_append_data(struct sock *sk, diff --git a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h index 591f78631f1..f132924cc9d 100644 --- a/include/net/irda/irlmp.h +++ b/include/net/irda/irlmp.h @@ -256,7 +256,8 @@ static inline __u32 irlmp_get_daddr(const struct lsap_cb *self)  	return (self && self->lap) ? self->lap->daddr : 0;  } -extern const char *irlmp_reasons[]; +const char *irlmp_reason_str(LM_REASON reason); +  extern int sysctl_discovery_timeout;  extern int sysctl_discovery_slots;  extern int sysctl_discovery; @@ -278,7 +279,7 @@ static inline int irlmp_lap_tx_queue_full(struct lsap_cb *self)  }  /* After doing a irlmp_dup(), this get one of the two socket back into - * a state where it's waiting incomming connections. + * a state where it's waiting incoming connections.   * Note : this can be used *only* if the socket is not yet connected   * (i.e. NO irlmp_connect_response() done on this socket).   * - Jean II */ diff --git a/include/net/irda/irttp.h b/include/net/irda/irttp.h index af4b87721d1..98682d4bae8 100644 --- a/include/net/irda/irttp.h +++ b/include/net/irda/irttp.h @@ -185,7 +185,7 @@ static inline __u32 irttp_get_max_seg_size(struct tsap_cb *self)  }  /* After doing a irttp_dup(), this get one of the two socket back into - * a state where it's waiting incomming connections. + * a state where it's waiting incoming connections.   * Note : this can be used *only* if the socket is not yet connected   * (i.e. NO irttp_connect_response() done on this socket).   * - Jean II */ diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h index cc7c1973238..714cc9a54a4 100644 --- a/include/net/iucv/af_iucv.h +++ b/include/net/iucv/af_iucv.h @@ -130,6 +130,14 @@ struct iucv_sock {  					       enum iucv_tx_notify n);  }; +struct iucv_skb_cb { +	u32	class;		/* target class of message */ +	u32	tag;		/* tag associated with message */ +	u32	offset;		/* offset for skb receival */ +}; + +#define IUCV_SKB_CB(__skb)	((struct iucv_skb_cb *)&((__skb)->cb[0])) +  /* iucv socket options (SOL_IUCV) */  #define SO_IPRMDATA_MSG	0x0080		/* send/recv IPRM_DATA msgs */  #define SO_MSGLIMIT	0x1000		/* get/set IUCV MSGLIMIT */ diff --git a/include/net/mac80211.h b/include/net/mac80211.h index ee50c5eba50..f7eba1300d8 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -147,10 +147,12 @@ struct ieee80211_low_level_stats {   * enum ieee80211_chanctx_change - change flag for channel context   * @IEEE80211_CHANCTX_CHANGE_WIDTH: The channel width changed   * @IEEE80211_CHANCTX_CHANGE_RX_CHAINS: The number of RX chains changed + * @IEEE80211_CHANCTX_CHANGE_RADAR: radar detection flag changed   */  enum ieee80211_chanctx_change {  	IEEE80211_CHANCTX_CHANGE_WIDTH		= BIT(0),  	IEEE80211_CHANCTX_CHANGE_RX_CHAINS	= BIT(1), +	IEEE80211_CHANCTX_CHANGE_RADAR		= BIT(2),  };  /** @@ -165,6 +167,7 @@ enum ieee80211_chanctx_change {   * @rx_chains_dynamic: The number of RX chains that must be enabled   *	after RTS/CTS handshake to receive SMPS MIMO transmissions;   *	this will always be >= @rx_chains_static. + * @radar_enabled: whether radar detection is enabled on this channel.   * @drv_priv: data area for driver use, will always be aligned to   *	sizeof(void *), size is determined in hw information.   */ @@ -173,7 +176,9 @@ struct ieee80211_chanctx_conf {  	u8 rx_chains_static, rx_chains_dynamic; -	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); +	bool radar_enabled; + +	u8 drv_priv[0] __aligned(sizeof(void *));  };  /** @@ -208,6 +213,11 @@ struct ieee80211_chanctx_conf {   * @BSS_CHANGED_TXPOWER: TX power setting changed for this interface   * @BSS_CHANGED_P2P_PS: P2P powersave settings (CTWindow, opportunistic PS)   *	changed (currently only in P2P client mode, GO mode will be later) + * @BSS_CHANGED_DTIM_PERIOD: the DTIM period value was changed (set when + *	it becomes valid, managed mode only) + * @BSS_CHANGED_BANDWIDTH: The bandwidth used by this interface changed, + *	note that this is only called when it changes after the channel + *	context had been assigned.   */  enum ieee80211_bss_change {  	BSS_CHANGED_ASSOC		= 1<<0, @@ -230,6 +240,8 @@ enum ieee80211_bss_change {  	BSS_CHANGED_PS			= 1<<17,  	BSS_CHANGED_TXPOWER		= 1<<18,  	BSS_CHANGED_P2P_PS		= 1<<19, +	BSS_CHANGED_DTIM_PERIOD		= 1<<20, +	BSS_CHANGED_BANDWIDTH		= 1<<21,  	/* when adding here, make sure to change ieee80211_reconfig */  }; @@ -271,13 +283,19 @@ enum ieee80211_rssi_event {   *	if the hardware cannot handle this it must set the   *	IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE hardware flag   * @dtim_period: num of beacons before the next DTIM, for beaconing, - *	valid in station mode only while @assoc is true and if also - *	requested by %IEEE80211_HW_NEED_DTIM_PERIOD (cf. also hw conf - *	@ps_dtim_period) + *	valid in station mode only if after the driver was notified + *	with the %BSS_CHANGED_DTIM_PERIOD flag, will be non-zero then.   * @sync_tsf: last beacon's/probe response's TSF timestamp (could be old - *	as it may have been received during scanning long ago) + *	as it may have been received during scanning long ago). If the + *	HW flag %IEEE80211_HW_TIMING_BEACON_ONLY is set, then this can + *	only come from a beacon, but might not become valid until after + *	association when a beacon is received (which is notified with the + *	%BSS_CHANGED_DTIM flag.)   * @sync_device_ts: the device timestamp corresponding to the sync_tsf,   *	the driver/device can use this to calculate synchronisation + *	(see @sync_tsf) + * @sync_dtim_count: Only valid when %IEEE80211_HW_TIMING_BEACON_ONLY + *	is requested, see @sync_tsf/@sync_device_ts.   * @beacon_int: beacon interval   * @assoc_capability: capabilities taken from assoc resp   * @basic_rates: bitmap of basic rates, each bit stands for an @@ -297,11 +315,9 @@ enum ieee80211_rssi_event {   *	may filter ARP queries targeted for other addresses than listed here.   *	The driver must allow ARP queries targeted for all address listed here   *	to pass through. An empty list implies no ARP queries need to pass. - * @arp_addr_cnt: Number of addresses currently on the list. - * @arp_filter_enabled: Enable ARP filtering - if enabled, the hardware may - *	filter ARP queries based on the @arp_addr_list, if disabled, the - *	hardware must not perform any ARP filtering. Note, that the filter will - *	be enabled also in promiscuous mode. + * @arp_addr_cnt: Number of addresses currently on the list. Note that this + *	may be larger than %IEEE80211_BSS_ARP_ADDR_LIST_LEN (the arp_addr_list + *	array size), it's up to the driver what to do in that case.   * @qos: This is a QoS-enabled BSS.   * @idle: This interface is idle. There's also a global idle flag in the   *	hardware config which may be more appropriate depending on what @@ -331,6 +347,7 @@ struct ieee80211_bss_conf {  	u16 assoc_capability;  	u64 sync_tsf;  	u32 sync_device_ts; +	u8 sync_dtim_count;  	u32 basic_rates;  	int mcast_rate[IEEE80211_NUM_BANDS];  	u16 ht_operation_mode; @@ -338,8 +355,7 @@ struct ieee80211_bss_conf {  	u32 cqm_rssi_hyst;  	struct cfg80211_chan_def chandef;  	__be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; -	u8 arp_addr_cnt; -	bool arp_filter_enabled; +	int arp_addr_cnt;  	bool qos;  	bool idle;  	bool ps; @@ -392,6 +408,9 @@ struct ieee80211_bss_conf {   * @IEEE80211_TX_CTL_RATE_CTRL_PROBE: internal to mac80211, can be   *	set by rate control algorithms to indicate probe rate, will   *	be cleared for fragmented frames (except on the last fragment) + * @IEEE80211_TX_INTFL_OFFCHAN_TX_OK: Internal to mac80211. Used to indicate + *	that a frame can be transmitted while the queues are stopped for + *	off-channel operation.   * @IEEE80211_TX_INTFL_NEED_TXPROCESSING: completely internal to mac80211,   *	used to indicate that a pending frame requires TX processing before   *	it can be sent out. @@ -409,6 +428,9 @@ struct ieee80211_bss_conf {   * @IEEE80211_TX_INTFL_RETRANSMISSION: This frame is being retransmitted   *	after TX status because the destination was asleep, it must not   *	be modified again (no seqno assignment, crypto, etc.) + * @IEEE80211_TX_INTFL_MLME_CONN_TX: This frame was transmitted by the MLME + *	code for connection establishment, this indicates that its status + *	should kick the MLME state machine.   * @IEEE80211_TX_INTFL_NL80211_FRAME_TX: Frame was requested through nl80211   *	MLME command (internal to mac80211 to figure out whether to send TX   *	status to user space) @@ -454,13 +476,14 @@ enum mac80211_tx_control_flags {  	IEEE80211_TX_STAT_AMPDU			= BIT(10),  	IEEE80211_TX_STAT_AMPDU_NO_BACK		= BIT(11),  	IEEE80211_TX_CTL_RATE_CTRL_PROBE	= BIT(12), +	IEEE80211_TX_INTFL_OFFCHAN_TX_OK	= BIT(13),  	IEEE80211_TX_INTFL_NEED_TXPROCESSING	= BIT(14),  	IEEE80211_TX_INTFL_RETRIED		= BIT(15),  	IEEE80211_TX_INTFL_DONT_ENCRYPT		= BIT(16),  	IEEE80211_TX_CTL_NO_PS_BUFFER		= BIT(17),  	IEEE80211_TX_CTL_MORE_FRAMES		= BIT(18),  	IEEE80211_TX_INTFL_RETRANSMISSION	= BIT(19), -	/* hole at 20, use later */ +	IEEE80211_TX_INTFL_MLME_CONN_TX		= BIT(20),  	IEEE80211_TX_INTFL_NL80211_FRAME_TX	= BIT(21),  	IEEE80211_TX_CTL_LDPC			= BIT(22),  	IEEE80211_TX_CTL_STBC			= BIT(23) | BIT(24), @@ -953,6 +976,7 @@ enum ieee80211_smps_mode {   *   * @channel: the channel to tune to   * @channel_type: the channel (HT) type + * @radar_enabled: whether radar detection is enabled   *   * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame   *    (a frame not RTS protected), called "dot11LongRetryLimit" in 802.11, @@ -979,6 +1003,7 @@ struct ieee80211_conf {  	struct ieee80211_channel *channel;  	enum nl80211_channel_type channel_type; +	bool radar_enabled;  	enum ieee80211_smps_mode smps_mode;  }; @@ -1059,7 +1084,7 @@ struct ieee80211_vif {  	u32 driver_flags;  	/* must be last */ -	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); +	u8 drv_priv[0] __aligned(sizeof(void *));  };  static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif) @@ -1176,6 +1201,24 @@ enum ieee80211_sta_state {  };  /** + * enum ieee80211_sta_rx_bandwidth - station RX bandwidth + * @IEEE80211_STA_RX_BW_20: station can only receive 20 MHz + * @IEEE80211_STA_RX_BW_40: station can receive up to 40 MHz + * @IEEE80211_STA_RX_BW_80: station can receive up to 80 MHz + * @IEEE80211_STA_RX_BW_160: station can receive up to 160 MHz + *	(including 80+80 MHz) + * + * Implementation note: 20 must be zero to be initialized + *	correctly, the values must be sorted. + */ +enum ieee80211_sta_rx_bandwidth { +	IEEE80211_STA_RX_BW_20 = 0, +	IEEE80211_STA_RX_BW_40, +	IEEE80211_STA_RX_BW_80, +	IEEE80211_STA_RX_BW_160, +}; + +/**   * struct ieee80211_sta - station table entry   *   * A station table entry represents a station we are possibly @@ -1197,6 +1240,12 @@ enum ieee80211_sta_state {   * @uapsd_queues: bitmap of queues configured for uapsd. Only valid   *	if wme is supported.   * @max_sp: max Service Period. Only valid if wme is supported. + * @bandwidth: current bandwidth the station can receive with + * @rx_nss: in HT/VHT, the maximum number of spatial streams the + *	station can receive at the moment, changed by operating mode + *	notifications and capabilities. The value is only valid after + *	the station moves to associated state. + * @smps_mode: current SMPS mode (off, static or dynamic)   */  struct ieee80211_sta {  	u32 supp_rates[IEEE80211_NUM_BANDS]; @@ -1207,9 +1256,12 @@ struct ieee80211_sta {  	bool wme;  	u8 uapsd_queues;  	u8 max_sp; +	u8 rx_nss; +	enum ieee80211_sta_rx_bandwidth bandwidth; +	enum ieee80211_smps_mode smps_mode;  	/* must be last */ -	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); +	u8 drv_priv[0] __aligned(sizeof(void *));  };  /** @@ -1331,9 +1383,9 @@ struct ieee80211_tx_control {   *      When this flag is set, signaling beacon-loss will cause an immediate   *      change to disassociated state.   * - * @IEEE80211_HW_NEED_DTIM_PERIOD: - *	This device needs to know the DTIM period for the BSS before - *	associating. + * @IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC: + *	This device needs to get data from beacon before association (i.e. + *	dtim_period).   *   * @IEEE80211_HW_SUPPORTS_PER_STA_GTK: The device's crypto engine supports   *	per-station GTKs as used by IBSS RSN or during fast transition. If @@ -1353,10 +1405,6 @@ struct ieee80211_tx_control {   *	setup strictly in HW. mac80211 should not attempt to do this in   *	software.   * - * @IEEE80211_HW_SCAN_WHILE_IDLE: The device can do hw scan while - *	being idle (i.e. mac80211 doesn't have to go idle-off during the - *	the scan). - *   * @IEEE80211_HW_WANT_MONITOR_VIF: The driver would like to be informed of   *	a virtual monitor interface when monitor interfaces are the only   *	active interfaces. @@ -1370,9 +1418,8 @@ struct ieee80211_tx_control {   *	P2P Interface. This will be honoured even if more than one interface   *	is supported.   * - * @IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL: On this hardware TX BA session - *	should be tear down once BAR frame will not be acked. - * + * @IEEE80211_HW_TIMING_BEACON_ONLY: Use sync timing from beacon frames + *	only, to allow getting TBTT of a DTIM beacon.   */  enum ieee80211_hw_flags {  	IEEE80211_HW_HAS_RATE_CONTROL			= 1<<0, @@ -1382,7 +1429,7 @@ enum ieee80211_hw_flags {  	IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE	= 1<<4,  	IEEE80211_HW_SIGNAL_UNSPEC			= 1<<5,  	IEEE80211_HW_SIGNAL_DBM				= 1<<6, -	IEEE80211_HW_NEED_DTIM_PERIOD			= 1<<7, +	IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC		= 1<<7,  	IEEE80211_HW_SPECTRUM_MGMT			= 1<<8,  	IEEE80211_HW_AMPDU_AGGREGATION			= 1<<9,  	IEEE80211_HW_SUPPORTS_PS			= 1<<10, @@ -1399,9 +1446,8 @@ enum ieee80211_hw_flags {  	IEEE80211_HW_SUPPORTS_PER_STA_GTK		= 1<<21,  	IEEE80211_HW_AP_LINK_PS				= 1<<22,  	IEEE80211_HW_TX_AMPDU_SETUP_IN_HW		= 1<<23, -	IEEE80211_HW_SCAN_WHILE_IDLE			= 1<<24,  	IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF		= 1<<25, -	IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL		= 1<<26, +	IEEE80211_HW_TIMING_BEACON_ONLY			= 1<<26,  };  /** @@ -1522,6 +1568,8 @@ struct ieee80211_hw {   * structure can then access it via hw->priv. Note that mac802111 drivers should   * not use wiphy_priv() to try to get their private driver structure as this   * is already used internally by mac80211. + * + * Return: The mac80211 driver hw struct of @wiphy.   */  struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy); @@ -1628,6 +1676,10 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   * rekeying), it will not include a valid phase 1 key. The valid phase 1 key is   * provided by update_tkip_key only. The trigger that makes mac80211 call this   * handler is software decryption with wrap around of iv16. + * + * The set_default_unicast_key() call updates the default WEP key index + * configured to the hardware for WEP encryption type. This is required + * for devices that support offload of data packets (e.g. ARP responses).   */  /** @@ -1680,15 +1732,6 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   * dynamic PS feature in stack and will just keep %IEEE80211_CONF_PS   * enabled whenever user has enabled powersave.   * - * Some hardware need to toggle a single shared antenna between WLAN and - * Bluetooth to facilitate co-existence. These types of hardware set - * limitations on the use of host controlled dynamic powersave whenever there - * is simultaneous WLAN and Bluetooth traffic. For these types of hardware, the - * driver may request temporarily going into full power save, in order to - * enable toggling the antenna between BT and WLAN. If the driver requests - * disabling dynamic powersave, the @dynamic_ps_timeout value will be - * temporarily set to zero until the driver re-enables dynamic powersave. - *   * Driver informs U-APSD client support by enabling   * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the   * uapsd paramater in conf_tx() operation. Hardware needs to send the QoS @@ -2033,17 +2076,29 @@ enum ieee80211_filter_flags {   * calling ieee80211_start_tx_ba_cb_irqsafe, because the peer   * might receive the addBA frame and send a delBA right away!   * - * @IEEE80211_AMPDU_RX_START: start Rx aggregation - * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation - * @IEEE80211_AMPDU_TX_START: start Tx aggregation - * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation + * @IEEE80211_AMPDU_RX_START: start RX aggregation + * @IEEE80211_AMPDU_RX_STOP: stop RX aggregation + * @IEEE80211_AMPDU_TX_START: start TX aggregation   * @IEEE80211_AMPDU_TX_OPERATIONAL: TX aggregation has become operational + * @IEEE80211_AMPDU_TX_STOP_CONT: stop TX aggregation but continue transmitting + *	queued packets, now unaggregated. After all packets are transmitted the + *	driver has to call ieee80211_stop_tx_ba_cb_irqsafe(). + * @IEEE80211_AMPDU_TX_STOP_FLUSH: stop TX aggregation and flush all packets, + *	called when the station is removed. There's no need or reason to call + *	ieee80211_stop_tx_ba_cb_irqsafe() in this case as mac80211 assumes the + *	session is gone and removes the station. + * @IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: called when TX aggregation is stopped + *	but the driver hasn't called ieee80211_stop_tx_ba_cb_irqsafe() yet and + *	now the connection is dropped and the station will be removed. Drivers + *	should clean up and drop remaining packets when this is called.   */  enum ieee80211_ampdu_mlme_action {  	IEEE80211_AMPDU_RX_START,  	IEEE80211_AMPDU_RX_STOP,  	IEEE80211_AMPDU_TX_START, -	IEEE80211_AMPDU_TX_STOP, +	IEEE80211_AMPDU_TX_STOP_CONT, +	IEEE80211_AMPDU_TX_STOP_FLUSH, +	IEEE80211_AMPDU_TX_STOP_FLUSH_CONT,  	IEEE80211_AMPDU_TX_OPERATIONAL,  }; @@ -2062,16 +2117,21 @@ enum ieee80211_frame_release_type {   * enum ieee80211_rate_control_changed - flags to indicate what changed   *   * @IEEE80211_RC_BW_CHANGED: The bandwidth that can be used to transmit - *	to this station changed. + *	to this station changed. The actual bandwidth is in the station + *	information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 + *	flag changes, for HT and VHT the bandwidth field changes.   * @IEEE80211_RC_SMPS_CHANGED: The SMPS state of the station changed.   * @IEEE80211_RC_SUPP_RATES_CHANGED: The supported rate set of this peer   *	changed (in IBSS mode) due to discovering more information about   *	the peer. + * @IEEE80211_RC_NSS_CHANGED: N_SS (number of spatial streams) was changed + *	by the peer   */  enum ieee80211_rate_control_changed {  	IEEE80211_RC_BW_CHANGED		= BIT(0),  	IEEE80211_RC_SMPS_CHANGED	= BIT(1),  	IEEE80211_RC_SUPP_RATES_CHANGED	= BIT(2), +	IEEE80211_RC_NSS_CHANGED	= BIT(3),  };  /** @@ -2152,6 +2212,18 @@ enum ieee80211_rate_control_changed {   *	MAC address of the device going away.   *	Hence, this callback must be implemented. It can sleep.   * + * @add_interface_debugfs: Drivers can use this callback to add debugfs files + *	when a vif is added to mac80211. This callback and + *	@remove_interface_debugfs should be within a CONFIG_MAC80211_DEBUGFS + *	conditional. @remove_interface_debugfs must be provided for cleanup. + *	This callback can sleep. + * + * @remove_interface_debugfs: Remove the debugfs files which were added using + *	@add_interface_debugfs. This callback must remove all debugfs entries + *	that were added because mac80211 only removes interface debugfs when the + *	interface is destroyed, not when it is removed from the driver. + *	This callback can sleep. + *   * @config: Handler for configuration requests. IEEE 802.11 code calls this   *	function to change hardware configuration, e.g., channel.   *	This function should never fail but returns a negative error code @@ -2194,6 +2266,10 @@ enum ieee80211_rate_control_changed {   *	After rekeying was done it should (for example during resume) notify   *	userspace of the new replay counter using ieee80211_gtk_rekey_notify().   * + * @set_default_unicast_key: Set the default (unicast) key index, useful for + *	WEP when the device sends data packets autonomously, e.g. for ARP + *	offloading. The index can be 0-3, or -1 for unsetting it. + *   * @hw_scan: Ask the hardware to service the scan request, no need to start   *	the scan state machine in stack. The scan must honour the channel   *	configuration done by the regulatory agent in the wiphy's @@ -2474,7 +2550,13 @@ enum ieee80211_rate_control_changed {   *   * @restart_complete: Called after a call to ieee80211_restart_hw(), when the   *	reconfiguration has completed. This can help the driver implement the - *	reconfiguration step. This callback may sleep. + *	reconfiguration step. Also called when reconfiguring because the + *	driver's resume function returned 1, as this is just like an "inline" + *	hardware restart. This callback may sleep. + * + * @ipv6_addr_change: IPv6 address assignment on the given interface changed. + *	Currently, this is only called for managed or P2P client interfaces. + *	This callback is optional; it must not sleep.   */  struct ieee80211_ops {  	void (*tx)(struct ieee80211_hw *hw, @@ -2522,6 +2604,8 @@ struct ieee80211_ops {  	void (*set_rekey_data)(struct ieee80211_hw *hw,  			       struct ieee80211_vif *vif,  			       struct cfg80211_gtk_rekey_data *data); +	void (*set_default_unicast_key)(struct ieee80211_hw *hw, +					struct ieee80211_vif *vif, int idx);  	int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  		       struct cfg80211_scan_request *req);  	void (*cancel_hw_scan)(struct ieee80211_hw *hw, @@ -2553,6 +2637,12 @@ struct ieee80211_ops {  				   struct ieee80211_vif *vif,  				   struct ieee80211_sta *sta,  				   struct dentry *dir); +	void (*add_interface_debugfs)(struct ieee80211_hw *hw, +				      struct ieee80211_vif *vif, +				      struct dentry *dir); +	void (*remove_interface_debugfs)(struct ieee80211_hw *hw, +					 struct ieee80211_vif *vif, +					 struct dentry *dir);  #endif  	void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  			enum sta_notify_cmd, struct ieee80211_sta *sta); @@ -2606,6 +2696,7 @@ struct ieee80211_ops {  	int (*set_bitrate_mask)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  				const struct cfg80211_bitrate_mask *mask);  	void (*rssi_callback)(struct ieee80211_hw *hw, +			      struct ieee80211_vif *vif,  			      enum ieee80211_rssi_event rssi_event);  	void (*allow_buffered_frames)(struct ieee80211_hw *hw, @@ -2648,6 +2739,12 @@ struct ieee80211_ops {  				     struct ieee80211_chanctx_conf *ctx);  	void (*restart_complete)(struct ieee80211_hw *hw); + +#if IS_ENABLED(CONFIG_IPV6) +	void (*ipv6_addr_change)(struct ieee80211_hw *hw, +				 struct ieee80211_vif *vif, +				 struct inet6_dev *idev); +#endif  };  /** @@ -2661,6 +2758,8 @@ struct ieee80211_ops {   *   * @priv_data_len: length of private data   * @ops: callbacks for this device + * + * Return: A pointer to the new hardware device, or %NULL on error.   */  struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,  					const struct ieee80211_ops *ops); @@ -2673,6 +2772,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,   * need to fill the contained wiphy's information.   *   * @hw: the device to register as returned by ieee80211_alloc_hw() + * + * Return: 0 on success. An error code otherwise.   */  int ieee80211_register_hw(struct ieee80211_hw *hw); @@ -2719,6 +2820,8 @@ extern char *__ieee80211_create_tpt_led_trigger(   * of the trigger so you can automatically link the LED device.   *   * @hw: the hardware to get the LED trigger name for + * + * Return: The name of the LED trigger. %NULL if not configured for LEDs.   */  static inline char *ieee80211_get_tx_led_name(struct ieee80211_hw *hw)  { @@ -2738,6 +2841,8 @@ static inline char *ieee80211_get_tx_led_name(struct ieee80211_hw *hw)   * of the trigger so you can automatically link the LED device.   *   * @hw: the hardware to get the LED trigger name for + * + * Return: The name of the LED trigger. %NULL if not configured for LEDs.   */  static inline char *ieee80211_get_rx_led_name(struct ieee80211_hw *hw)  { @@ -2757,6 +2862,8 @@ static inline char *ieee80211_get_rx_led_name(struct ieee80211_hw *hw)   * of the trigger so you can automatically link the LED device.   *   * @hw: the hardware to get the LED trigger name for + * + * Return: The name of the LED trigger. %NULL if not configured for LEDs.   */  static inline char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)  { @@ -2776,6 +2883,8 @@ static inline char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)   * of the trigger so you can automatically link the LED device.   *   * @hw: the hardware to get the LED trigger name for + * + * Return: The name of the LED trigger. %NULL if not configured for LEDs.   */  static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)  { @@ -2793,9 +2902,10 @@ static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)   * @blink_table: the blink table -- needs to be ordered by throughput   * @blink_table_len: size of the blink table   * - * This function returns %NULL (in case of error, or if no LED - * triggers are configured) or the name of the new trigger. - * This function must be called before ieee80211_register_hw(). + * Return: %NULL (in case of error, or if no LED triggers are + * configured) or the name of the new trigger. + * + * Note: This function must be called before ieee80211_register_hw().   */  static inline char *  ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, unsigned int flags, @@ -2928,10 +3038,10 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,   * Calls to this function for a single hardware must be synchronized against   * each other.   * - * The function returns -EINVAL when the requested PS mode is already set. - *   * @sta: currently connected sta   * @start: start or stop PS + * + * Return: 0 on success. -EINVAL when the requested PS mode is already set.   */  int ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start); @@ -2945,6 +3055,8 @@ int ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start);   *   * @sta: currently connected sta   * @start: start or stop PS + * + * Return: Like ieee80211_sta_ps_transition().   */  static inline int ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta,  						  bool start) @@ -3082,6 +3194,8 @@ void ieee80211_report_low_ack(struct ieee80211_sta *sta, u32 num_packets);   * according to the current DTIM parameters/TIM bitmap.   *   * The driver is responsible for freeing the returned skb. + * + * Return: The beacon template. %NULL on error.   */  struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,  					 struct ieee80211_vif *vif, @@ -3093,6 +3207,8 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   *   * See ieee80211_beacon_get_tim(). + * + * Return: See ieee80211_beacon_get_tim().   */  static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,  						   struct ieee80211_vif *vif) @@ -3109,6 +3225,8 @@ static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,   * hardware. The destination address should be set by the caller.   *   * Can only be called in AP mode. + * + * Return: The Probe Response template. %NULL on error.   */  struct sk_buff *ieee80211_proberesp_get(struct ieee80211_hw *hw,  					struct ieee80211_vif *vif); @@ -3124,6 +3242,8 @@ struct sk_buff *ieee80211_proberesp_get(struct ieee80211_hw *hw,   *   * Note: Caller (or hardware) is responsible for setting the   * &IEEE80211_FCTL_PM bit. + * + * Return: The PS Poll template. %NULL on error.   */  struct sk_buff *ieee80211_pspoll_get(struct ieee80211_hw *hw,  				     struct ieee80211_vif *vif); @@ -3139,6 +3259,8 @@ struct sk_buff *ieee80211_pspoll_get(struct ieee80211_hw *hw,   *   * Note: Caller (or hardware) is responsible for setting the   * &IEEE80211_FCTL_PM bit as well as Duration and Sequence Control fields. + * + * Return: The nullfunc template. %NULL on error.   */  struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw,  				       struct ieee80211_vif *vif); @@ -3153,6 +3275,8 @@ struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw,   *   * Creates a Probe Request template which can, for example, be uploaded to   * hardware. + * + * Return: The Probe Request template. %NULL on error.   */  struct sk_buff *ieee80211_probereq_get(struct ieee80211_hw *hw,  				       struct ieee80211_vif *vif, @@ -3188,6 +3312,8 @@ void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,   * If the RTS is generated in firmware, but the host system must provide   * the duration field, the low-level driver uses this function to receive   * the duration field value in little-endian byteorder. + * + * Return: The duration.   */  __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,  			      struct ieee80211_vif *vif, size_t frame_len, @@ -3223,6 +3349,8 @@ void ieee80211_ctstoself_get(struct ieee80211_hw *hw,   * If the CTS-to-self is generated in firmware, but the host system must provide   * the duration field, the low-level driver uses this function to receive   * the duration field value in little-endian byteorder. + * + * Return: The duration.   */  __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,  				    struct ieee80211_vif *vif, @@ -3239,6 +3367,8 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,   *   * Calculate the duration field of some generic frame, given its   * length and transmission rate (in 100kbps). + * + * Return: The duration.   */  __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,  					struct ieee80211_vif *vif, @@ -3255,9 +3385,10 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,   * hardware/firmware does not implement buffering of broadcast/multicast   * frames when power saving is used, 802.11 code buffers them in the host   * memory. The low-level driver uses this function to fetch next buffered - * frame. In most cases, this is used when generating beacon frame. This - * function returns a pointer to the next buffered skb or NULL if no more - * buffered frames are available. + * frame. In most cases, this is used when generating beacon frame. + * + * Return: A pointer to the next buffered skb or NULL if no more buffered + * frames are available.   *   * Note: buffered frames are returned only after DTIM beacon frame was   * generated with ieee80211_beacon_get() and the low-level driver must thus @@ -3437,6 +3568,8 @@ void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);   * @queue: queue number (counted from zero).   *   * Drivers should use this function instead of netif_stop_queue. + * + * Return: %true if the queue is stopped. %false otherwise.   */  int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue); @@ -3634,7 +3767,9 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra,   * @vif: virtual interface to look for station on   * @addr: station's address   * - * This function must be called under RCU lock and the + * Return: The station, if found. %NULL otherwise. + * + * Note: This function must be called under RCU lock and the   * resulting pointer is only valid under RCU lock as well.   */  struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif, @@ -3647,7 +3782,9 @@ struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif,   * @addr: remote station's address   * @localaddr: local address (vif->sdata->vif.addr). Use NULL for 'any'.   * - * This function must be called under RCU lock and the + * Return: The station, if found. %NULL otherwise. + * + * Note: This function must be called under RCU lock and the   * resulting pointer is only valid under RCU lock as well.   *   * NOTE: You may pass NULL for localaddr, but then you will just get @@ -3754,6 +3891,11 @@ void ieee80211_iter_keys(struct ieee80211_hw *hw,   * The iterator will not find a context that's being added (during   * the driver callback to add it) but will find it while it's being   * removed. + * + * Note that during hardware restart, all contexts that existed + * before the restart are considered already present so will be + * found while iterating, whether they've been re-added already + * or not.   */  void ieee80211_iter_chan_contexts_atomic(  	struct ieee80211_hw *hw, @@ -3772,7 +3914,9 @@ void ieee80211_iter_chan_contexts_atomic(   * information. This function must only be called from within the   * .bss_info_changed callback function and only in managed mode. The function   * is only useful when the interface is associated, otherwise it will return - * NULL. + * %NULL. + * + * Return: The Probe Request template. %NULL on error.   */  struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,  					  struct ieee80211_vif *vif); @@ -3796,6 +3940,8 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif);   * When beacon filtering is enabled with %IEEE80211_VIF_BEACON_FILTER, and   * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver   * needs to inform if the connection to the AP has been lost. + * The function may also be called if the connection needs to be terminated + * for some other reason, even if %IEEE80211_HW_CONNECTION_MONITOR isn't set.   *   * This function will cause immediate change to disassociated state,   * without connection recovery attempts. @@ -3826,36 +3972,6 @@ void ieee80211_connection_loss(struct ieee80211_vif *vif);  void ieee80211_resume_disconnect(struct ieee80211_vif *vif);  /** - * ieee80211_disable_dyn_ps - force mac80211 to temporarily disable dynamic psm - * - * @vif: &struct ieee80211_vif pointer from the add_interface callback. - * - * Some hardware require full power save to manage simultaneous BT traffic - * on the WLAN frequency. Full PSM is required periodically, whenever there are - * burst of BT traffic. The hardware gets information of BT traffic via - * hardware co-existence lines, and consequentially requests mac80211 to - * (temporarily) enter full psm. - * This function will only temporarily disable dynamic PS, not enable PSM if - * it was not already enabled. - * The driver must make sure to re-enable dynamic PS using - * ieee80211_enable_dyn_ps() if the driver has disabled it. - * - */ -void ieee80211_disable_dyn_ps(struct ieee80211_vif *vif); - -/** - * ieee80211_enable_dyn_ps - restore dynamic psm after being disabled - * - * @vif: &struct ieee80211_vif pointer from the add_interface callback. - * - * This function restores dynamic PS after being temporarily disabled via - * ieee80211_disable_dyn_ps(). Each ieee80211_disable_dyn_ps() call must - * be coupled with an eventual call to this function. - * - */ -void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif); - -/**   * ieee80211_cqm_rssi_notify - inform a configured connection quality monitoring   *	rssi threshold triggered   * @@ -3872,6 +3988,13 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,  			       gfp_t gfp);  /** + * ieee80211_radar_detected - inform that a radar was detected + * + * @hw: pointer as obtained from ieee80211_alloc_hw() + */ +void ieee80211_radar_detected(struct ieee80211_hw *hw); + +/**   * ieee80211_chswitch_done - Complete channel switch process   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   * @success: make the channel switch successful or not @@ -4119,13 +4242,27 @@ void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,  void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif);  /** - * ieee80211_ave_rssi - report the average rssi for the specified interface + * ieee80211_ave_rssi - report the average RSSI for the specified interface   *   * @vif: the specified virtual interface   * - * This function return the average rssi value for the requested interface. - * It assumes that the given vif is valid. + * Note: This function assumes that the given vif is valid. + * + * Return: The average RSSI value for the requested interface, or 0 if not + * applicable.   */  int ieee80211_ave_rssi(struct ieee80211_vif *vif); +/** + * ieee80211_report_wowlan_wakeup - report WoWLAN wakeup + * @vif: virtual interface + * @wakeup: wakeup reason(s) + * @gfp: allocation flags + * + * See cfg80211_report_wowlan_wakeup(). + */ +void ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif, +				    struct cfg80211_wowlan_wakeup *wakeup, +				    gfp_t gfp); +  #endif /* MAC80211_H */ diff --git a/include/net/mrp.h b/include/net/mrp.h new file mode 100644 index 00000000000..4fbf02aa2ec --- /dev/null +++ b/include/net/mrp.h @@ -0,0 +1,143 @@ +#ifndef _NET_MRP_H +#define _NET_MRP_H + +#define MRP_END_MARK		0x0 + +struct mrp_pdu_hdr { +	u8	version; +}; + +struct mrp_msg_hdr { +	u8	attrtype; +	u8	attrlen; +}; + +struct mrp_vecattr_hdr { +	__be16	lenflags; +	unsigned char	firstattrvalue[]; +#define MRP_VECATTR_HDR_LEN_MASK cpu_to_be16(0x1FFF) +#define MRP_VECATTR_HDR_FLAG_LA cpu_to_be16(0x2000) +}; + +enum mrp_vecattr_event { +	MRP_VECATTR_EVENT_NEW, +	MRP_VECATTR_EVENT_JOIN_IN, +	MRP_VECATTR_EVENT_IN, +	MRP_VECATTR_EVENT_JOIN_MT, +	MRP_VECATTR_EVENT_MT, +	MRP_VECATTR_EVENT_LV, +	__MRP_VECATTR_EVENT_MAX +}; + +struct mrp_skb_cb { +	struct mrp_msg_hdr	*mh; +	struct mrp_vecattr_hdr	*vah; +	unsigned char		attrvalue[]; +}; + +static inline struct mrp_skb_cb *mrp_cb(struct sk_buff *skb) +{ +	BUILD_BUG_ON(sizeof(struct mrp_skb_cb) > +		     FIELD_SIZEOF(struct sk_buff, cb)); +	return (struct mrp_skb_cb *)skb->cb; +} + +enum mrp_applicant_state { +	MRP_APPLICANT_INVALID, +	MRP_APPLICANT_VO, +	MRP_APPLICANT_VP, +	MRP_APPLICANT_VN, +	MRP_APPLICANT_AN, +	MRP_APPLICANT_AA, +	MRP_APPLICANT_QA, +	MRP_APPLICANT_LA, +	MRP_APPLICANT_AO, +	MRP_APPLICANT_QO, +	MRP_APPLICANT_AP, +	MRP_APPLICANT_QP, +	__MRP_APPLICANT_MAX +}; +#define MRP_APPLICANT_MAX	(__MRP_APPLICANT_MAX - 1) + +enum mrp_event { +	MRP_EVENT_NEW, +	MRP_EVENT_JOIN, +	MRP_EVENT_LV, +	MRP_EVENT_TX, +	MRP_EVENT_R_NEW, +	MRP_EVENT_R_JOIN_IN, +	MRP_EVENT_R_IN, +	MRP_EVENT_R_JOIN_MT, +	MRP_EVENT_R_MT, +	MRP_EVENT_R_LV, +	MRP_EVENT_R_LA, +	MRP_EVENT_REDECLARE, +	MRP_EVENT_PERIODIC, +	__MRP_EVENT_MAX +}; +#define MRP_EVENT_MAX		(__MRP_EVENT_MAX - 1) + +enum mrp_tx_action { +	MRP_TX_ACTION_NONE, +	MRP_TX_ACTION_S_NEW, +	MRP_TX_ACTION_S_JOIN_IN, +	MRP_TX_ACTION_S_JOIN_IN_OPTIONAL, +	MRP_TX_ACTION_S_IN_OPTIONAL, +	MRP_TX_ACTION_S_LV, +}; + +struct mrp_attr { +	struct rb_node			node; +	enum mrp_applicant_state	state; +	u8				type; +	u8				len; +	unsigned char			value[]; +}; + +enum mrp_applications { +	MRP_APPLICATION_MVRP, +	__MRP_APPLICATION_MAX +}; +#define MRP_APPLICATION_MAX	(__MRP_APPLICATION_MAX - 1) + +struct mrp_application { +	enum mrp_applications	type; +	unsigned int		maxattr; +	struct packet_type	pkttype; +	unsigned char		group_address[ETH_ALEN]; +	u8			version; +}; + +struct mrp_applicant { +	struct mrp_application	*app; +	struct net_device	*dev; +	struct timer_list	join_timer; + +	spinlock_t		lock; +	struct sk_buff_head	queue; +	struct sk_buff		*pdu; +	struct rb_root		mad; +	struct rcu_head		rcu; +}; + +struct mrp_port { +	struct mrp_applicant __rcu	*applicants[MRP_APPLICATION_MAX + 1]; +	struct rcu_head			rcu; +}; + +extern int	mrp_register_application(struct mrp_application *app); +extern void	mrp_unregister_application(struct mrp_application *app); + +extern int	mrp_init_applicant(struct net_device *dev, +				    struct mrp_application *app); +extern void	mrp_uninit_applicant(struct net_device *dev, +				      struct mrp_application *app); + +extern int	mrp_request_join(const struct net_device *dev, +				  const struct mrp_application *app, +				  const void *value, u8 len, u8 type); +extern void	mrp_request_leave(const struct net_device *dev, +				   const struct mrp_application *app, +				   const void *value, u8 len, u8 type); + +#endif /* _NET_MRP_H */ diff --git a/include/net/ndisc.h b/include/net/ndisc.h index 23b3a7c5878..745bf741e02 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -127,13 +127,19 @@ static int ndisc_addr_option_pad(unsigned short type)  	}  } +static inline int ndisc_opt_addr_space(struct net_device *dev) +{ +	return NDISC_OPT_SPACE(dev->addr_len + +			       ndisc_addr_option_pad(dev->type)); +} +  static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p,  				      struct net_device *dev)  {  	u8 *lladdr = (u8 *)(p + 1);  	int lladdrlen = p->nd_opt_len << 3;  	int prepad = ndisc_addr_option_pad(dev->type); -	if (lladdrlen != NDISC_OPT_SPACE(dev->addr_len + prepad)) +	if (lladdrlen != ndisc_opt_addr_space(dev))  		return NULL;  	return lladdr + prepad;  } @@ -148,15 +154,14 @@ static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, _  		(p32[3] * hash_rnd[3]));  } -static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, const void *pkey) +static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey)  {  	struct neigh_hash_table *nht;  	const u32 *p32 = pkey;  	struct neighbour *n;  	u32 hash_val; -	rcu_read_lock_bh(); -	nht = rcu_dereference_bh(tbl->nht); +	nht = rcu_dereference_bh(nd_tbl.nht);  	hash_val = ndisc_hashfn(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);  	for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);  	     n != NULL; @@ -164,12 +169,21 @@ static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, str  		u32 *n32 = (u32 *) n->primary_key;  		if (n->dev == dev &&  		    ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) | -		     (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) { -			if (!atomic_inc_not_zero(&n->refcnt)) -				n = NULL; -			break; -		} +		     (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) +			return n;  	} + +	return NULL; +} + +static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, const void *pkey) +{ +	struct neighbour *n; + +	rcu_read_lock_bh(); +	n = __ipv6_neigh_lookup_noref(dev, pkey); +	if (n && !atomic_inc_not_zero(&n->refcnt)) +		n = NULL;  	rcu_read_unlock_bh();  	return n; diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 0dab173e27d..7e748ad8b50 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -181,10 +181,11 @@ struct neigh_table {  };  #define NEIGH_PRIV_ALIGN	sizeof(long long) +#define NEIGH_ENTRY_SIZE(size)	ALIGN((size), NEIGH_PRIV_ALIGN)  static inline void *neighbour_priv(const struct neighbour *n)  { -	return (char *)n + ALIGN(sizeof(*n) + n->tbl->key_len, NEIGH_PRIV_ALIGN); +	return (char *)n + n->tbl->entry_size;  }  /* flags for neigh_update() */ diff --git a/include/net/netevent.h b/include/net/netevent.h index 3ce4988c9c0..fe630dde35c 100644 --- a/include/net/netevent.h +++ b/include/net/netevent.h @@ -16,9 +16,8 @@ struct neighbour;  struct netevent_redirect {  	struct dst_entry *old; -	struct neighbour *old_neigh;  	struct dst_entry *new; -	struct neighbour *new_neigh; +	struct neighbour *neigh;  	const void *daddr;  }; diff --git a/include/net/netfilter/nf_conntrack_acct.h b/include/net/netfilter/nf_conntrack_acct.h index 463ae8e1669..2bdb7a15fe0 100644 --- a/include/net/netfilter/nf_conntrack_acct.h +++ b/include/net/netfilter/nf_conntrack_acct.h @@ -57,7 +57,9 @@ static inline void nf_ct_set_acct(struct net *net, bool enable)  	net->ct.sysctl_acct = enable;  } -extern int nf_conntrack_acct_init(struct net *net); -extern void nf_conntrack_acct_fini(struct net *net); +extern int nf_conntrack_acct_pernet_init(struct net *net); +extern void nf_conntrack_acct_pernet_fini(struct net *net); +extern int nf_conntrack_acct_init(void); +extern void nf_conntrack_acct_fini(void);  #endif /* _NF_CONNTRACK_ACCT_H */ diff --git a/include/net/netfilter/nf_conntrack_core.h b/include/net/netfilter/nf_conntrack_core.h index e98aeb3da03..930275fa2ea 100644 --- a/include/net/netfilter/nf_conntrack_core.h +++ b/include/net/netfilter/nf_conntrack_core.h @@ -25,12 +25,19 @@ extern unsigned int nf_conntrack_in(struct net *net,  				    unsigned int hooknum,  				    struct sk_buff *skb); -extern int nf_conntrack_init(struct net *net); -extern void nf_conntrack_cleanup(struct net *net); +extern int nf_conntrack_init_net(struct net *net); +extern void nf_conntrack_cleanup_net(struct net *net); -extern int nf_conntrack_proto_init(struct net *net); -extern void nf_conntrack_proto_fini(struct net *net); +extern int nf_conntrack_proto_pernet_init(struct net *net); +extern void nf_conntrack_proto_pernet_fini(struct net *net); +extern int nf_conntrack_proto_init(void); +extern void nf_conntrack_proto_fini(void); + +extern int nf_conntrack_init_start(void); +extern void nf_conntrack_cleanup_start(void); + +extern void nf_conntrack_init_end(void);  extern void nf_conntrack_cleanup_end(void);  extern bool diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h index 5654d292efd..092dc651689 100644 --- a/include/net/netfilter/nf_conntrack_ecache.h +++ b/include/net/netfilter/nf_conntrack_ecache.h @@ -207,9 +207,11 @@ nf_ct_expect_event(enum ip_conntrack_expect_events event,  	nf_ct_expect_event_report(event, exp, 0, 0);  } -extern int nf_conntrack_ecache_init(struct net *net); -extern void nf_conntrack_ecache_fini(struct net *net); +extern int nf_conntrack_ecache_pernet_init(struct net *net); +extern void nf_conntrack_ecache_pernet_fini(struct net *net); +extern int nf_conntrack_ecache_init(void); +extern void nf_conntrack_ecache_fini(void);  #else /* CONFIG_NF_CONNTRACK_EVENTS */  static inline void nf_conntrack_event_cache(enum ip_conntrack_events event, @@ -232,12 +234,21 @@ static inline void nf_ct_expect_event_report(enum ip_conntrack_expect_events e,   					     u32 portid,   					     int report) {} -static inline int nf_conntrack_ecache_init(struct net *net) +static inline int nf_conntrack_ecache_pernet_init(struct net *net)  {  	return 0;  } -static inline void nf_conntrack_ecache_fini(struct net *net) +static inline void nf_conntrack_ecache_pernet_fini(struct net *net) +{ +} + +static inline int nf_conntrack_ecache_init(void) +{ +	return 0; +} + +static inline void nf_conntrack_ecache_fini(void)  {  }  #endif /* CONFIG_NF_CONNTRACK_EVENTS */ diff --git a/include/net/netfilter/nf_conntrack_expect.h b/include/net/netfilter/nf_conntrack_expect.h index cc13f377a70..cbbae7621e2 100644 --- a/include/net/netfilter/nf_conntrack_expect.h +++ b/include/net/netfilter/nf_conntrack_expect.h @@ -69,8 +69,11 @@ struct nf_conntrack_expect_policy {  #define NF_CT_EXPECT_CLASS_DEFAULT	0 -int nf_conntrack_expect_init(struct net *net); -void nf_conntrack_expect_fini(struct net *net); +int nf_conntrack_expect_pernet_init(struct net *net); +void nf_conntrack_expect_pernet_fini(struct net *net); + +int nf_conntrack_expect_init(void); +void nf_conntrack_expect_fini(void);  struct nf_conntrack_expect *  __nf_ct_expect_find(struct net *net, u16 zone, diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h index 8b4d1fc2909..977bc8a4644 100644 --- a/include/net/netfilter/nf_conntrack_extend.h +++ b/include/net/netfilter/nf_conntrack_extend.h @@ -23,6 +23,9 @@ enum nf_ct_ext_id {  #ifdef CONFIG_NF_CONNTRACK_TIMEOUT  	NF_CT_EXT_TIMEOUT,  #endif +#ifdef CONFIG_NF_CONNTRACK_LABELS +	NF_CT_EXT_LABELS, +#endif  	NF_CT_EXT_NUM,  }; @@ -33,6 +36,7 @@ enum nf_ct_ext_id {  #define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone  #define NF_CT_EXT_TSTAMP_TYPE struct nf_conn_tstamp  #define NF_CT_EXT_TIMEOUT_TYPE struct nf_conn_timeout +#define NF_CT_EXT_LABELS_TYPE struct nf_conn_labels  /* Extensions: optional stuff which isn't permanently in struct. */  struct nf_ct_ext { diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h index 9aad956d100..26c4ae5bfbb 100644 --- a/include/net/netfilter/nf_conntrack_helper.h +++ b/include/net/netfilter/nf_conntrack_helper.h @@ -82,8 +82,11 @@ static inline void *nfct_help_data(const struct nf_conn *ct)  	return (void *)help->data;  } -extern int nf_conntrack_helper_init(struct net *net); -extern void nf_conntrack_helper_fini(struct net *net); +extern int nf_conntrack_helper_pernet_init(struct net *net); +extern void nf_conntrack_helper_pernet_fini(struct net *net); + +extern int nf_conntrack_helper_init(void); +extern void nf_conntrack_helper_fini(void);  extern int nf_conntrack_broadcast_help(struct sk_buff *skb,  				       unsigned int protoff, @@ -97,6 +100,10 @@ struct nf_ct_helper_expectfn {  	void (*expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);  }; +__printf(3,4) +void nf_ct_helper_log(struct sk_buff *skb, const struct nf_conn *ct, +		      const char *fmt, ...); +  void nf_ct_helper_expectfn_register(struct nf_ct_helper_expectfn *n);  void nf_ct_helper_expectfn_unregister(struct nf_ct_helper_expectfn *n);  struct nf_ct_helper_expectfn * diff --git a/include/net/netfilter/nf_conntrack_l3proto.h b/include/net/netfilter/nf_conntrack_l3proto.h index 6f7c13f4ac0..3bb89eac3fa 100644 --- a/include/net/netfilter/nf_conntrack_l3proto.h +++ b/include/net/netfilter/nf_conntrack_l3proto.h @@ -76,11 +76,16 @@ struct nf_conntrack_l3proto {  extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[AF_MAX]; -/* Protocol registration. */ -extern int nf_conntrack_l3proto_register(struct net *net, +/* Protocol pernet registration. */ +extern int nf_ct_l3proto_pernet_register(struct net *net,  					 struct nf_conntrack_l3proto *proto); -extern void nf_conntrack_l3proto_unregister(struct net *net, +extern void nf_ct_l3proto_pernet_unregister(struct net *net,  					    struct nf_conntrack_l3proto *proto); + +/* Protocol global registration. */ +extern int nf_ct_l3proto_register(struct nf_conntrack_l3proto *proto); +extern void nf_ct_l3proto_unregister(struct nf_conntrack_l3proto *proto); +  extern struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);  extern void nf_ct_l3proto_put(struct nf_conntrack_l3proto *p); diff --git a/include/net/netfilter/nf_conntrack_l4proto.h b/include/net/netfilter/nf_conntrack_l4proto.h index c3be4aef6bf..914d8d90079 100644 --- a/include/net/netfilter/nf_conntrack_l4proto.h +++ b/include/net/netfilter/nf_conntrack_l4proto.h @@ -121,12 +121,16 @@ extern struct nf_conntrack_l4proto *  nf_ct_l4proto_find_get(u_int16_t l3proto, u_int8_t l4proto);  extern void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p); -/* Protocol registration. */ -extern int nf_conntrack_l4proto_register(struct net *net, +/* Protocol pernet registration. */ +extern int nf_ct_l4proto_pernet_register(struct net *net,  					 struct nf_conntrack_l4proto *proto); -extern void nf_conntrack_l4proto_unregister(struct net *net, +extern void nf_ct_l4proto_pernet_unregister(struct net *net,  					    struct nf_conntrack_l4proto *proto); +/* Protocol global registration. */ +extern int nf_ct_l4proto_register(struct nf_conntrack_l4proto *proto); +extern void nf_ct_l4proto_unregister(struct nf_conntrack_l4proto *proto); +  static inline void nf_ct_kfree_compat_sysctl_table(struct nf_proto_net *pn)  {  #if defined(CONFIG_SYSCTL) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT) diff --git a/include/net/netfilter/nf_conntrack_labels.h b/include/net/netfilter/nf_conntrack_labels.h new file mode 100644 index 00000000000..c985695283b --- /dev/null +++ b/include/net/netfilter/nf_conntrack_labels.h @@ -0,0 +1,58 @@ +#include <linux/types.h> +#include <net/net_namespace.h> +#include <linux/netfilter/nf_conntrack_common.h> +#include <linux/netfilter/nf_conntrack_tuple_common.h> +#include <net/netfilter/nf_conntrack.h> +#include <net/netfilter/nf_conntrack_extend.h> + +#include <uapi/linux/netfilter/xt_connlabel.h> + +struct nf_conn_labels { +	u8 words; +	unsigned long bits[]; +}; + +static inline struct nf_conn_labels *nf_ct_labels_find(const struct nf_conn *ct) +{ +#ifdef CONFIG_NF_CONNTRACK_LABELS +	return nf_ct_ext_find(ct, NF_CT_EXT_LABELS); +#else +	return NULL; +#endif +} + +static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct) +{ +#ifdef CONFIG_NF_CONNTRACK_LABELS +	struct nf_conn_labels *cl_ext; +	struct net *net = nf_ct_net(ct); +	u8 words; + +	words = ACCESS_ONCE(net->ct.label_words); +	if (words == 0 || WARN_ON_ONCE(words > 8)) +		return NULL; + +	cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS, +				      words * sizeof(long), GFP_ATOMIC); +	if (cl_ext != NULL) +		cl_ext->words = words; + +	return cl_ext; +#else +	return NULL; +#endif +} + +bool nf_connlabel_match(const struct nf_conn *ct, u16 bit); +int nf_connlabel_set(struct nf_conn *ct, u16 bit); + +int nf_connlabels_replace(struct nf_conn *ct, +			  const u32 *data, const u32 *mask, unsigned int words); + +#ifdef CONFIG_NF_CONNTRACK_LABELS +int nf_conntrack_labels_init(void); +void nf_conntrack_labels_fini(void); +#else +static inline int nf_conntrack_labels_init(void) { return 0; } +static inline void nf_conntrack_labels_fini(void) {} +#endif diff --git a/include/net/netfilter/nf_conntrack_timeout.h b/include/net/netfilter/nf_conntrack_timeout.h index e41e472d08f..d23aceb16d9 100644 --- a/include/net/netfilter/nf_conntrack_timeout.h +++ b/include/net/netfilter/nf_conntrack_timeout.h @@ -76,15 +76,15 @@ nf_ct_timeout_lookup(struct net *net, struct nf_conn *ct,  }  #ifdef CONFIG_NF_CONNTRACK_TIMEOUT -extern int nf_conntrack_timeout_init(struct net *net); -extern void nf_conntrack_timeout_fini(struct net *net); +extern int nf_conntrack_timeout_init(void); +extern void nf_conntrack_timeout_fini(void);  #else -static inline int nf_conntrack_timeout_init(struct net *net) +static inline int nf_conntrack_timeout_init(void)  {          return 0;  } -static inline void nf_conntrack_timeout_fini(struct net *net) +static inline void nf_conntrack_timeout_fini(void)  {          return;  } diff --git a/include/net/netfilter/nf_conntrack_timestamp.h b/include/net/netfilter/nf_conntrack_timestamp.h index fc9c82b1f06..b00461413ef 100644 --- a/include/net/netfilter/nf_conntrack_timestamp.h +++ b/include/net/netfilter/nf_conntrack_timestamp.h @@ -48,15 +48,28 @@ static inline void nf_ct_set_tstamp(struct net *net, bool enable)  }  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP -extern int nf_conntrack_tstamp_init(struct net *net); -extern void nf_conntrack_tstamp_fini(struct net *net); +extern int nf_conntrack_tstamp_pernet_init(struct net *net); +extern void nf_conntrack_tstamp_pernet_fini(struct net *net); + +extern int nf_conntrack_tstamp_init(void); +extern void nf_conntrack_tstamp_fini(void);  #else -static inline int nf_conntrack_tstamp_init(struct net *net) +static inline int nf_conntrack_tstamp_pernet_init(struct net *net) +{ +	return 0; +} + +static inline void nf_conntrack_tstamp_pernet_fini(struct net *net) +{ +	return; +} + +static inline int nf_conntrack_tstamp_init(void)  {  	return 0;  } -static inline void nf_conntrack_tstamp_fini(struct net *net) +static inline void nf_conntrack_tstamp_fini(void)  {  	return;  } diff --git a/include/net/netfilter/nf_tproxy_core.h b/include/net/netfilter/nf_tproxy_core.h index 75ca9291cf2..36d9379d4c4 100644 --- a/include/net/netfilter/nf_tproxy_core.h +++ b/include/net/netfilter/nf_tproxy_core.h @@ -82,6 +82,7 @@ nf_tproxy_get_sock_v4(struct net *net, const u8 protocol,  			break;  		case NFT_LOOKUP_LISTENER:  			sk = inet_lookup_listener(net, &tcp_hashinfo, +						    saddr, sport,  						    daddr, dport,  						    in->ifindex); @@ -151,6 +152,7 @@ nf_tproxy_get_sock_v6(struct net *net, const u8 protocol,  			break;  		case NFT_LOOKUP_LISTENER:  			sk = inet6_lookup_listener(net, &tcp_hashinfo, +						   saddr, sport,  						   daddr, ntohs(dport),  						   in->ifindex); diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h index 923cb20051e..c9c0c538b68 100644 --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h @@ -84,6 +84,10 @@ struct netns_ct {  	int			sysctl_auto_assign_helper;  	bool			auto_assign_helper_warned;  	struct nf_ip_net	nf_ct_proto; +#if defined(CONFIG_NF_CONNTRACK_LABELS) +	unsigned int		labels_used; +	u8			label_words; +#endif  #ifdef CONFIG_NF_NAT_NEEDED  	struct hlist_head	*nat_bysource;  	unsigned int		nat_htable_size; diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 2ae2b8372cf..2ba9de89e8e 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -22,6 +22,7 @@ struct netns_ipv4 {  	struct ctl_table_header	*frags_hdr;  	struct ctl_table_header	*ipv4_hdr;  	struct ctl_table_header *route_hdr; +	struct ctl_table_header *xfrm4_hdr;  #endif  	struct ipv4_devconf	*devconf_all;  	struct ipv4_devconf	*devconf_dflt; @@ -61,6 +62,8 @@ struct netns_ipv4 {  	int sysctl_icmp_ratemask;  	int sysctl_icmp_errors_use_inbound_ifaddr; +	int sysctl_tcp_ecn; +  	kgid_t sysctl_ping_group_range[2];  	long sysctl_tcp_mem[3]; diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h index 214cb0a5335..1242f371718 100644 --- a/include/net/netns/ipv6.h +++ b/include/net/netns/ipv6.h @@ -16,6 +16,7 @@ struct netns_sysctl_ipv6 {  	struct ctl_table_header *route_hdr;  	struct ctl_table_header *icmp_hdr;  	struct ctl_table_header *frags_hdr; +	struct ctl_table_header *xfrm6_hdr;  #endif  	int bindv6only;  	int flush_delay; diff --git a/include/net/netrom.h b/include/net/netrom.h index f0793c1cb5f..121dcf854db 100644 --- a/include/net/netrom.h +++ b/include/net/netrom.h @@ -154,17 +154,17 @@ static __inline__ void nr_node_unlock(struct nr_node *nr_node)  	nr_node_put(nr_node);  } -#define nr_neigh_for_each(__nr_neigh, node, list) \ -	hlist_for_each_entry(__nr_neigh, node, list, neigh_node) +#define nr_neigh_for_each(__nr_neigh, list) \ +	hlist_for_each_entry(__nr_neigh, list, neigh_node) -#define nr_neigh_for_each_safe(__nr_neigh, node, node2, list) \ -	hlist_for_each_entry_safe(__nr_neigh, node, node2, list, neigh_node) +#define nr_neigh_for_each_safe(__nr_neigh, node2, list) \ +	hlist_for_each_entry_safe(__nr_neigh, node2, list, neigh_node) -#define nr_node_for_each(__nr_node, node, list) \ -	hlist_for_each_entry(__nr_node, node, list, node_node) +#define nr_node_for_each(__nr_node, list) \ +	hlist_for_each_entry(__nr_node, list, node_node) -#define nr_node_for_each_safe(__nr_node, node, node2, list) \ -	hlist_for_each_entry_safe(__nr_node, node, node2, list, node_node) +#define nr_node_for_each_safe(__nr_node, node2, list) \ +	hlist_for_each_entry_safe(__nr_node, node2, list, node_node)  /*********************************************************************/ diff --git a/include/net/nfc/hci.h b/include/net/nfc/hci.h index 671953e1157..b87a1692b08 100644 --- a/include/net/nfc/hci.h +++ b/include/net/nfc/hci.h @@ -57,8 +57,10 @@ struct nfc_hci_ops {  	int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb);  	int (*check_presence)(struct nfc_hci_dev *hdev,  			      struct nfc_target *target); -	void (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, -				struct sk_buff *skb); +	int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, +			      struct sk_buff *skb); +	int (*enable_se)(struct nfc_dev *dev, u32 secure_element); +	int (*disable_se)(struct nfc_dev *dev, u32 secure_element);  };  /* Pipes */ @@ -82,11 +84,23 @@ typedef int (*xmit) (struct sk_buff *skb, void *cb_data);  #define NFC_HCI_MAX_GATES		256 +/* + * These values can be specified by a driver to indicate it requires some + * adaptation of the HCI standard. + * + * NFC_HCI_QUIRK_SHORT_CLEAR - send HCI_ADM_CLEAR_ALL_PIPE cmd with no params + */ +enum { +	NFC_HCI_QUIRK_SHORT_CLEAR	= 0, +}; +  struct nfc_hci_dev {  	struct nfc_dev *ndev;  	u32 max_data_link_payload; +	bool shutting_down; +  	struct mutex msg_tx_mutex;  	struct list_head msg_tx_queue; @@ -129,12 +143,16 @@ struct nfc_hci_dev {  	u8 *gb;  	size_t gb_len; + +	unsigned long quirks;  };  /* hci device allocation */  struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,  					    struct nfc_hci_init_data *init_data, +					    unsigned long quirks,  					    u32 protocols, +					    u32 supported_se,  					    const char *llc_name,  					    int tx_headroom,  					    int tx_tailroom, diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h index d705d867494..5bc0c460edc 100644 --- a/include/net/nfc/nci_core.h +++ b/include/net/nfc/nci_core.h @@ -147,6 +147,7 @@ struct nci_dev {  /* ----- NCI Devices ----- */  struct nci_dev *nci_allocate_device(struct nci_ops *ops,  				    __u32 supported_protocols, +				    __u32 supported_se,  				    int tx_headroom,  				    int tx_tailroom);  void nci_free_device(struct nci_dev *ndev); diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index fce80b2f9be..87a6417fc93 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h @@ -68,6 +68,8 @@ struct nfc_ops {  			     void *cb_context);  	int (*tm_send)(struct nfc_dev *dev, struct sk_buff *skb);  	int (*check_presence)(struct nfc_dev *dev, struct nfc_target *target); +	int (*enable_se)(struct nfc_dev *dev, u32 secure_element); +	int (*disable_se)(struct nfc_dev *dev, u32 secure_element);  };  #define NFC_TARGET_IDX_ANY -1 @@ -109,12 +111,17 @@ struct nfc_dev {  	struct nfc_genl_data genl_data;  	u32 supported_protocols; +	u32 supported_se; +	u32 active_se; +  	int tx_headroom;  	int tx_tailroom;  	struct timer_list check_pres_timer;  	struct work_struct check_pres_work; +	bool shutting_down; +  	struct nfc_ops *ops;  };  #define to_nfc_dev(_dev) container_of(_dev, struct nfc_dev, dev) @@ -123,6 +130,7 @@ extern struct class nfc_class;  struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,  				    u32 supported_protocols, +				    u32 supported_se,  				    int tx_headroom,  				    int tx_tailroom); diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 9fcc680ab6b..13174509cdf 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -126,9 +126,10 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,  	return 0;  } -extern int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb, -	                     struct nlattr *rate_tlv, struct tcf_exts *exts, -	                     const struct tcf_ext_map *map); +extern int tcf_exts_validate(struct net *net, struct tcf_proto *tp, +			     struct nlattr **tb, struct nlattr *rate_tlv, +			     struct tcf_exts *exts, +			     const struct tcf_ext_map *map);  extern void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts);  extern void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,  	                     struct tcf_exts *src); diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 66f5ac370f9..388bf8b6d06 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -65,8 +65,14 @@ struct qdisc_watchdog {  };  extern void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc); -extern void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, -				    psched_time_t expires); +extern void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd, u64 expires); + +static inline void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, +					   psched_time_t expires) +{ +	qdisc_watchdog_schedule_ns(wd, PSCHED_TICKS2NS(expires)); +} +  extern void qdisc_watchdog_cancel(struct qdisc_watchdog *wd);  extern struct Qdisc_ops pfifo_qdisc_ops; diff --git a/include/net/regulatory.h b/include/net/regulatory.h index 7dcaa2794fd..f17ed590d64 100644 --- a/include/net/regulatory.h +++ b/include/net/regulatory.h @@ -18,6 +18,7 @@   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   */ +#include <linux/rcupdate.h>  /**   * enum environment_cap - Environment parsed from country IE @@ -35,6 +36,7 @@ enum environment_cap {  /**   * struct regulatory_request - used to keep track of regulatory requests   * + * @rcu_head: RCU head struct used to free the request   * @wiphy_idx: this is set if this request's initiator is   * 	%REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This   * 	can be used by the wireless core to deal with conflicts @@ -72,6 +74,7 @@ enum environment_cap {   * @list: used to insert into the reg_requests_list linked list   */  struct regulatory_request { +	struct rcu_head rcu_head;  	int wiphy_idx;  	enum nl80211_reg_initiator initiator;  	enum nl80211_user_reg_hint_type user_reg_hint_type; @@ -101,6 +104,7 @@ struct ieee80211_reg_rule {  };  struct ieee80211_regdomain { +	struct rcu_head rcu_head;  	u32 n_reg_rules;  	char alpha2[2];  	u8 dfs_region; diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 1540f9c2fcf..f10818fc880 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -195,7 +195,7 @@ struct tcf_proto_ops {  	unsigned long		(*get)(struct tcf_proto*, u32 handle);  	void			(*put)(struct tcf_proto*, unsigned long); -	int			(*change)(struct sk_buff *, +	int			(*change)(struct net *net, struct sk_buff *,  					struct tcf_proto*, unsigned long,  					u32 handle, struct nlattr **,  					unsigned long *); @@ -339,11 +339,10 @@ static inline struct Qdisc_class_common *  qdisc_class_find(const struct Qdisc_class_hash *hash, u32 id)  {  	struct Qdisc_class_common *cl; -	struct hlist_node *n;  	unsigned int h;  	h = qdisc_class_hash(id, hash->hashmask); -	hlist_for_each_entry(cl, n, &hash->hash[h], hnode) { +	hlist_for_each_entry(cl, &hash->hash[h], hnode) {  		if (cl->classid == id)  			return cl;  	} @@ -679,4 +678,23 @@ static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask,  }  #endif +struct psched_ratecfg { +	u64 rate_bps; +	u32 mult; +	u32 shift; +}; + +static inline u64 psched_l2t_ns(const struct psched_ratecfg *r, +				unsigned int len) +{ +	return ((u64)len * r->mult) >> r->shift; +} + +extern void psched_ratecfg_precompute(struct psched_ratecfg *r, u32 rate); + +static inline u32 psched_ratecfg_getrate(const struct psched_ratecfg *r) +{ +	return r->rate_bps >> 3; +} +  #endif diff --git a/include/net/scm.h b/include/net/scm.h index 975cca01048..b1170810568 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -56,8 +56,8 @@ static __inline__ void scm_set_cred(struct scm_cookie *scm,  	scm->pid  = get_pid(pid);  	scm->cred = cred ? get_cred(cred) : NULL;  	scm->creds.pid = pid_vnr(pid); -	scm->creds.uid = cred ? cred->euid : INVALID_UID; -	scm->creds.gid = cred ? cred->egid : INVALID_GID; +	scm->creds.uid = cred ? cred->uid : INVALID_UID; +	scm->creds.gid = cred ? cred->gid : INVALID_GID;  }  static __inline__ void scm_destroy_cred(struct scm_cookie *scm) diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h index c29707d654c..a7dd5c50df7 100644 --- a/include/net/sctp/constants.h +++ b/include/net/sctp/constants.h @@ -303,7 +303,7 @@ enum { SCTP_MAX_GABS = 16 };                                           * to which we will raise the P-MTU.  					 */  #define SCTP_DEFAULT_MINSEGMENT 512	/* MTU size ... if no mtu disc */ -#define SCTP_HOW_MANY_SECRETS 2		/* How many secrets I keep */ +  #define SCTP_SECRET_SIZE 32		/* Number of octets in a 256 bits. */  #define SCTP_SIGNATURE_SIZE 20	        /* size of a SLA-1 signature */ diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 7fdf298a47e..df85a0c0f2d 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -675,8 +675,8 @@ static inline int sctp_vtag_hashfn(__u16 lport, __u16 rport, __u32 vtag)  	return h & (sctp_assoc_hashsize - 1);  } -#define sctp_for_each_hentry(epb, node, head) \ -	hlist_for_each_entry(epb, node, head, node) +#define sctp_for_each_hentry(epb, head) \ +	hlist_for_each_entry(epb, head, node)  /* Is a socket of this style? */  #define sctp_style(sk, style) __sctp_style((sk), (SCTP_SOCKET_##style)) diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index fdeb85a970f..0e0f9d2322e 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -1236,10 +1236,7 @@ struct sctp_endpoint {  	 *	      Discussion in [RFC1750] can be helpful in  	 *	      selection of the key.  	 */ -	__u8 secret_key[SCTP_HOW_MANY_SECRETS][SCTP_SECRET_SIZE]; -	int current_key; -	int last_key; -	int key_changed_at; +	__u8 secret_key[SCTP_SECRET_SIZE];   	/* digest:  This is a digest of the sctp cookie.  This field is   	 * 	    only used on the receive path when we try to validate diff --git a/include/net/sock.h b/include/net/sock.h index 182ca99405a..14f6e9d19dc 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -140,6 +140,7 @@ typedef __u64 __bitwise __addrpair;   *	@skc_family: network address family   *	@skc_state: Connection state   *	@skc_reuse: %SO_REUSEADDR setting + *	@skc_reuseport: %SO_REUSEPORT setting   *	@skc_bound_dev_if: bound device index if != 0   *	@skc_bind_node: bind hash linkage for various protocol lookup tables   *	@skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol @@ -179,7 +180,8 @@ struct sock_common {  	unsigned short		skc_family;  	volatile unsigned char	skc_state; -	unsigned char		skc_reuse; +	unsigned char		skc_reuse:4; +	unsigned char		skc_reuseport:4;  	int			skc_bound_dev_if;  	union {  		struct hlist_node	skc_bind_node; @@ -297,6 +299,7 @@ struct sock {  #define sk_family		__sk_common.skc_family  #define sk_state		__sk_common.skc_state  #define sk_reuse		__sk_common.skc_reuse +#define sk_reuseport		__sk_common.skc_reuseport  #define sk_bound_dev_if		__sk_common.skc_bound_dev_if  #define sk_bind_node		__sk_common.skc_bind_node  #define sk_prot			__sk_common.skc_prot @@ -337,7 +340,7 @@ struct sock {  #endif  	unsigned long 		sk_flags;  	struct dst_entry	*sk_rx_dst; -	struct dst_entry	*sk_dst_cache; +	struct dst_entry __rcu	*sk_dst_cache;  	spinlock_t		sk_dst_lock;  	atomic_t		sk_wmem_alloc;  	atomic_t		sk_omem_alloc; @@ -603,24 +606,23 @@ static inline void sk_add_bind_node(struct sock *sk,  	hlist_add_head(&sk->sk_bind_node, list);  } -#define sk_for_each(__sk, node, list) \ -	hlist_for_each_entry(__sk, node, list, sk_node) -#define sk_for_each_rcu(__sk, node, list) \ -	hlist_for_each_entry_rcu(__sk, node, list, sk_node) +#define sk_for_each(__sk, list) \ +	hlist_for_each_entry(__sk, list, sk_node) +#define sk_for_each_rcu(__sk, list) \ +	hlist_for_each_entry_rcu(__sk, list, sk_node)  #define sk_nulls_for_each(__sk, node, list) \  	hlist_nulls_for_each_entry(__sk, node, list, sk_nulls_node)  #define sk_nulls_for_each_rcu(__sk, node, list) \  	hlist_nulls_for_each_entry_rcu(__sk, node, list, sk_nulls_node) -#define sk_for_each_from(__sk, node) \ -	if (__sk && ({ node = &(__sk)->sk_node; 1; })) \ -		hlist_for_each_entry_from(__sk, node, sk_node) +#define sk_for_each_from(__sk) \ +	hlist_for_each_entry_from(__sk, sk_node)  #define sk_nulls_for_each_from(__sk, node) \  	if (__sk && ({ node = &(__sk)->sk_nulls_node; 1; })) \  		hlist_nulls_for_each_entry_from(__sk, node, sk_nulls_node) -#define sk_for_each_safe(__sk, node, tmp, list) \ -	hlist_for_each_entry_safe(__sk, node, tmp, list, sk_node) -#define sk_for_each_bound(__sk, node, list) \ -	hlist_for_each_entry(__sk, node, list, sk_bind_node) +#define sk_for_each_safe(__sk, tmp, list) \ +	hlist_for_each_entry_safe(__sk, tmp, list, sk_node) +#define sk_for_each_bound(__sk, list) \ +	hlist_for_each_entry(__sk, list, sk_bind_node)  static inline struct user_namespace *sk_user_ns(struct sock *sk)  { @@ -664,6 +666,7 @@ enum sock_flags {  		     * Will use last 4 bytes of packet sent from  		     * user-space instead.  		     */ +	SOCK_FILTER_LOCKED, /* Filter cannot be changed anymore */  };  static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) @@ -1037,7 +1040,7 @@ static inline void sk_refcnt_debug_dec(struct sock *sk)  	       sk->sk_prot->name, sk, atomic_read(&sk->sk_prot->socks));  } -inline void sk_refcnt_debug_release(const struct sock *sk) +static inline void sk_refcnt_debug_release(const struct sock *sk)  {  	if (atomic_read(&sk->sk_refcnt) != 1)  		printk(KERN_DEBUG "Destruction of the %s socket %p delayed, refcnt=%d\n", diff --git a/include/net/tcp.h b/include/net/tcp.h index aed42c78515..cf0694d4ad6 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -266,7 +266,6 @@ extern int sysctl_tcp_abort_on_overflow;  extern int sysctl_tcp_max_orphans;  extern int sysctl_tcp_fack;  extern int sysctl_tcp_reordering; -extern int sysctl_tcp_ecn;  extern int sysctl_tcp_dsack;  extern int sysctl_tcp_wmem[3];  extern int sysctl_tcp_rmem[3]; @@ -280,7 +279,6 @@ extern int sysctl_tcp_dma_copybreak;  extern int sysctl_tcp_nometrics_save;  extern int sysctl_tcp_moderate_rcvbuf;  extern int sysctl_tcp_tso_win_divisor; -extern int sysctl_tcp_abc;  extern int sysctl_tcp_mtu_probing;  extern int sysctl_tcp_base_mss;  extern int sysctl_tcp_workaround_signed_windows; @@ -504,7 +502,8 @@ static inline __u32 cookie_v4_init_sequence(struct sock *sk,  #endif  extern __u32 cookie_init_timestamp(struct request_sock *req); -extern bool cookie_check_timestamp(struct tcp_options_received *opt, bool *); +extern bool cookie_check_timestamp(struct tcp_options_received *opt, +				struct net *net, bool *ecn_ok);  /* From net/ipv6/syncookies.c */  extern struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb); @@ -728,11 +727,12 @@ struct tcp_skb_cb {   * notifications, we disable TCP ECN negociation.   */  static inline void -TCP_ECN_create_request(struct request_sock *req, const struct sk_buff *skb) +TCP_ECN_create_request(struct request_sock *req, const struct sk_buff *skb, +		struct net *net)  {  	const struct tcphdr *th = tcp_hdr(skb); -	if (sysctl_tcp_ecn && th->ece && th->cwr && +	if (net->ipv4.sysctl_tcp_ecn && th->ece && th->cwr &&  	    INET_ECN_is_not_ect(TCP_SKB_CB(skb)->ip_dsfield))  		inet_rsk(req)->ecn_ok = 1;  } @@ -1045,6 +1045,10 @@ static inline bool tcp_prequeue(struct sock *sk, struct sk_buff *skb)  	if (sysctl_tcp_low_latency || !tp->ucopy.task)  		return false; +	if (skb->len <= tcp_hdrlen(skb) && +	    skb_queue_len(&tp->ucopy.prequeue) == 0) +		return false; +  	__skb_queue_tail(&tp->ucopy.prequeue, skb);  	tp->ucopy.memory += skb->truesize;  	if (tp->ucopy.memory > sk->sk_rcvbuf) { diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 63445ede48b..24c8886fd96 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -501,6 +501,12 @@ struct xfrm_policy_walk {  	u32 seq;  }; +struct xfrm_policy_queue { +	struct sk_buff_head	hold_queue; +	struct timer_list	hold_timer; +	unsigned long		timeout; +}; +  struct xfrm_policy {  #ifdef CONFIG_NET_NS  	struct net		*xp_net; @@ -522,6 +528,7 @@ struct xfrm_policy {  	struct xfrm_lifetime_cfg lft;  	struct xfrm_lifetime_cur curlft;  	struct xfrm_policy_walk_entry walk; +	struct xfrm_policy_queue polq;  	u8			type;  	u8			action;  	u8			flags; @@ -557,10 +564,6 @@ struct xfrm_migrate {  };  #define XFRM_KM_TIMEOUT                30 -/* which seqno */ -#define XFRM_REPLAY_SEQ		1 -#define XFRM_REPLAY_OSEQ	2 -#define XFRM_REPLAY_SEQ_MASK	3  /* what happened */  #define XFRM_REPLAY_UPDATE	XFRM_AE_CR  #define XFRM_REPLAY_TIMEOUT	XFRM_AE_CE @@ -1036,7 +1039,7 @@ static inline int  __xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)  {  	return	(!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && -		 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); +		 !ipv6_addr_equal((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));  }  static inline int @@ -1247,8 +1250,8 @@ static __inline__ int  __xfrm6_state_addr_check(const struct xfrm_state *x,  			 const xfrm_address_t *daddr, const xfrm_address_t *saddr)  { -	if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && -	    (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)||  +	if (ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && +	    (ipv6_addr_equal((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr) ||  	     ipv6_addr_any((struct in6_addr *)saddr) ||   	     ipv6_addr_any((struct in6_addr *)&x->props.saddr)))  		return 1; @@ -1324,6 +1327,7 @@ struct xfrm_algo_desc {  	char *name;  	char *compat;  	u8 available:1; +	u8 pfkey_supported:1;  	union {  		struct xfrm_algo_aead_info aead;  		struct xfrm_algo_auth_info auth; @@ -1565,8 +1569,8 @@ extern void xfrm_input_init(void);  extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);  extern void xfrm_probe_algs(void); -extern int xfrm_count_auth_supported(void); -extern int xfrm_count_enc_supported(void); +extern int xfrm_count_pfkey_auth_supported(void); +extern int xfrm_count_pfkey_enc_supported(void);  extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);  extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);  extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); @@ -1578,17 +1582,23 @@ extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);  extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,  						   int probe); -static inline int xfrm_addr_cmp(const xfrm_address_t *a, -				const xfrm_address_t *b, -				int family) +static inline bool xfrm6_addr_equal(const xfrm_address_t *a, +				    const xfrm_address_t *b) +{ +	return ipv6_addr_equal((const struct in6_addr *)a, +			       (const struct in6_addr *)b); +} + +static inline bool xfrm_addr_equal(const xfrm_address_t *a, +				   const xfrm_address_t *b, +				   sa_family_t family)  {  	switch (family) {  	default:  	case AF_INET: -		return (__force u32)a->a4 - (__force u32)b->a4; +		return ((__force u32)a->a4 ^ (__force u32)b->a4) == 0;  	case AF_INET6: -		return ipv6_addr_cmp((const struct in6_addr *)a, -				     (const struct in6_addr *)b); +		return xfrm6_addr_equal(a, b);  	}  } diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h index 3bbbd78e143..2d56e428506 100644 --- a/include/pcmcia/ds.h +++ b/include/pcmcia/ds.h @@ -65,6 +65,18 @@ struct pcmcia_driver {  int pcmcia_register_driver(struct pcmcia_driver *driver);  void pcmcia_unregister_driver(struct pcmcia_driver *driver); +/** + * module_pcmcia_driver() - Helper macro for registering a pcmcia driver + * @__pcmcia_driver: pcmcia_driver struct + * + * Helper macro for pcmcia 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_pcmcia_driver(__pcmcia_driver) \ +	module_driver(__pcmcia_driver, pcmcia_register_driver, \ +			pcmcia_unregister_driver) +  /* for struct resource * array embedded in struct pcmcia_device */  enum {  	PCMCIA_IOPORT_0, diff --git a/include/ras/ras_event.h b/include/ras/ras_event.h index 260470e7248..21cdb0b7b0f 100644 --- a/include/ras/ras_event.h +++ b/include/ras/ras_event.h @@ -78,9 +78,7 @@ TRACE_EVENT(mc_event,  	TP_printk("%d %s error%s:%s%s on %s (mc:%d location:%d:%d:%d address:0x%08lx grain:%d syndrome:0x%08lx%s%s)",  		  __entry->error_count, -		  (__entry->error_type == HW_EVENT_ERR_CORRECTED) ? "Corrected" : -			((__entry->error_type == HW_EVENT_ERR_FATAL) ? -			"Fatal" : "Uncorrected"), +		  mc_event_error_type(__entry->error_type),  		  __entry->error_count > 1 ? "s" : "",  		  ((char *)__get_str(msg))[0] ? " " : "",  		  __get_str(msg), diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 46bc045bbe1..98cc4b29fc5 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -115,6 +115,8 @@ enum ib_device_cap_flags {  	IB_DEVICE_XRC			= (1<<20),  	IB_DEVICE_MEM_MGT_EXTENSIONS	= (1<<21),  	IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22), +	IB_DEVICE_MEM_WINDOW_TYPE_2A	= (1<<23), +	IB_DEVICE_MEM_WINDOW_TYPE_2B	= (1<<24)  };  enum ib_atomic_cap { @@ -715,6 +717,11 @@ enum ib_mig_state {  	IB_MIG_ARMED  }; +enum ib_mw_type { +	IB_MW_TYPE_1 = 1, +	IB_MW_TYPE_2 = 2 +}; +  struct ib_qp_attr {  	enum ib_qp_state	qp_state;  	enum ib_qp_state	cur_qp_state; @@ -758,6 +765,7 @@ enum ib_wr_opcode {  	IB_WR_FAST_REG_MR,  	IB_WR_MASKED_ATOMIC_CMP_AND_SWP,  	IB_WR_MASKED_ATOMIC_FETCH_AND_ADD, +	IB_WR_BIND_MW,  };  enum ib_send_flags { @@ -780,6 +788,23 @@ struct ib_fast_reg_page_list {  	unsigned int		max_page_list_len;  }; +/** + * struct ib_mw_bind_info - Parameters for a memory window bind operation. + * @mr: A memory region to bind the memory window to. + * @addr: The address where the memory window should begin. + * @length: The length of the memory window, in bytes. + * @mw_access_flags: Access flags from enum ib_access_flags for the window. + * + * This struct contains the shared parameters for type 1 and type 2 + * memory window bind operations. + */ +struct ib_mw_bind_info { +	struct ib_mr   *mr; +	u64		addr; +	u64		length; +	int		mw_access_flags; +}; +  struct ib_send_wr {  	struct ib_send_wr      *next;  	u64			wr_id; @@ -823,6 +848,12 @@ struct ib_send_wr {  			int				access_flags;  			u32				rkey;  		} fast_reg; +		struct { +			struct ib_mw            *mw; +			/* The new rkey for the memory window. */ +			u32                      rkey; +			struct ib_mw_bind_info   bind_info; +		} bind_mw;  	} wr;  	u32			xrc_remote_srq_num;	/* XRC TGT QPs only */  }; @@ -839,7 +870,8 @@ enum ib_access_flags {  	IB_ACCESS_REMOTE_WRITE	= (1<<1),  	IB_ACCESS_REMOTE_READ	= (1<<2),  	IB_ACCESS_REMOTE_ATOMIC	= (1<<3), -	IB_ACCESS_MW_BIND	= (1<<4) +	IB_ACCESS_MW_BIND	= (1<<4), +	IB_ZERO_BASED		= (1<<5)  };  struct ib_phys_buf { @@ -862,13 +894,16 @@ enum ib_mr_rereg_flags {  	IB_MR_REREG_ACCESS	= (1<<2)  }; +/** + * struct ib_mw_bind - Parameters for a type 1 memory window bind operation. + * @wr_id:      Work request id. + * @send_flags: Flags from ib_send_flags enum. + * @bind_info:  More parameters of the bind operation. + */  struct ib_mw_bind { -	struct ib_mr   *mr; -	u64		wr_id; -	u64		addr; -	u32		length; -	int		send_flags; -	int		mw_access_flags; +	u64                    wr_id; +	int                    send_flags; +	struct ib_mw_bind_info bind_info;  };  struct ib_fmr_attr { @@ -991,6 +1026,7 @@ struct ib_mw {  	struct ib_pd		*pd;  	struct ib_uobject	*uobject;  	u32			rkey; +	enum ib_mw_type         type;  };  struct ib_fmr { @@ -1202,7 +1238,8 @@ struct ib_device {  						    int num_phys_buf,  						    int mr_access_flags,  						    u64 *iova_start); -	struct ib_mw *             (*alloc_mw)(struct ib_pd *pd); +	struct ib_mw *             (*alloc_mw)(struct ib_pd *pd, +					       enum ib_mw_type type);  	int                        (*bind_mw)(struct ib_qp *qp,  					      struct ib_mw *mw,  					      struct ib_mw_bind *mw_bind); @@ -2019,6 +2056,8 @@ int ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr);   * ib_dereg_mr - Deregisters a memory region and removes it from the   *   HCA translation table.   * @mr: The memory region to deregister. + * + * This function can fail, if the memory region has memory windows bound to it.   */  int ib_dereg_mr(struct ib_mr *mr); @@ -2071,10 +2110,22 @@ static inline void ib_update_fast_reg_key(struct ib_mr *mr, u8 newkey)  }  /** + * ib_inc_rkey - increments the key portion of the given rkey. Can be used + * for calculating a new rkey for type 2 memory windows. + * @rkey - the rkey to increment. + */ +static inline u32 ib_inc_rkey(u32 rkey) +{ +	const u32 mask = 0x000000ff; +	return ((rkey + 1) & mask) | (rkey & ~mask); +} + +/**   * ib_alloc_mw - Allocates a memory window.   * @pd: The protection domain associated with the memory window. + * @type: The type of the memory window (1 or 2).   */ -struct ib_mw *ib_alloc_mw(struct ib_pd *pd); +struct ib_mw *ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type);  /**   * ib_bind_mw - Posts a work request to the send queue of the specified @@ -2084,6 +2135,10 @@ struct ib_mw *ib_alloc_mw(struct ib_pd *pd);   * @mw: The memory window to bind.   * @mw_bind: Specifies information about the memory window, including   *   its address range, remote access rights, and associated memory region. + * + * If there is no immediate error, the function will update the rkey member + * of the mw parameter to its new value. The bind operation can still fail + * asynchronously.   */  static inline int ib_bind_mw(struct ib_qp *qp,  			     struct ib_mw *mw, diff --git a/include/scsi/Kbuild b/include/scsi/Kbuild index f2b94918994..562ff9d591b 100644 --- a/include/scsi/Kbuild +++ b/include/scsi/Kbuild @@ -1,4 +1 @@ -header-y += scsi_netlink.h -header-y += scsi_netlink_fc.h -header-y += scsi_bsg_fc.h  header-y += fc/ diff --git a/include/scsi/fc/Kbuild b/include/scsi/fc/Kbuild index 56603813c6c..e69de29bb2d 100644 --- a/include/scsi/fc/Kbuild +++ b/include/scsi/fc/Kbuild @@ -1,4 +0,0 @@ -header-y += fc_els.h -header-y += fc_fs.h -header-y += fc_gs.h -header-y += fc_ns.h diff --git a/include/scsi/fcoe_sysfs.h b/include/scsi/fcoe_sysfs.h index 604cb9bb3e7..7e231487034 100644 --- a/include/scsi/fcoe_sysfs.h +++ b/include/scsi/fcoe_sysfs.h @@ -34,7 +34,8 @@ struct fcoe_sysfs_function_template {  	void (*get_fcoe_ctlr_symb_err)(struct fcoe_ctlr_device *);  	void (*get_fcoe_ctlr_err_block)(struct fcoe_ctlr_device *);  	void (*get_fcoe_ctlr_fcs_error)(struct fcoe_ctlr_device *); -	void (*get_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); +	void (*set_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); +	int  (*set_fcoe_ctlr_enabled)(struct fcoe_ctlr_device *);  	void (*get_fcoe_fcf_selected)(struct fcoe_fcf_device *);  	void (*get_fcoe_fcf_vlan_id)(struct fcoe_fcf_device *);  }; @@ -48,6 +49,12 @@ enum fip_conn_type {  	FIP_CONN_TYPE_VN2VN,  }; +enum ctlr_enabled_state { +	FCOE_CTLR_ENABLED, +	FCOE_CTLR_DISABLED, +	FCOE_CTLR_UNUSED, +}; +  struct fcoe_ctlr_device {  	u32				id; @@ -64,6 +71,8 @@ struct fcoe_ctlr_device {  	int                             fcf_dev_loss_tmo;  	enum fip_conn_type              mode; +	enum ctlr_enabled_state         enabled; +  	/* expected in host order for displaying */  	struct fcoe_fc_els_lesb         lesb;  }; diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 399162b50a8..e1379b4e8fa 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h @@ -1074,7 +1074,8 @@ void fc_rport_terminate_io(struct fc_rport *);  /*   * DISCOVERY LAYER   *****************************/ -int fc_disc_init(struct fc_lport *); +void fc_disc_init(struct fc_lport *); +void fc_disc_config(struct fc_lport *, void *);  static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc)  { diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index 8742d853a3b..4427393115e 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h @@ -260,6 +260,9 @@ void __fcoe_get_lesb(struct fc_lport *lport, struct fc_els_lesb *fc_lesb,  		     struct net_device *netdev);  void fcoe_wwn_to_str(u64 wwn, char *buf, int len);  int fcoe_validate_vport_create(struct fc_vport *vport); +int fcoe_link_speed_update(struct fc_lport *); +void fcoe_get_lesb(struct fc_lport *, struct fc_els_lesb *); +void fcoe_ctlr_get_lesb(struct fcoe_ctlr_device *ctlr_dev);  /**   * is_fip_mode() - returns true if FIP mode selected. @@ -289,8 +292,11 @@ static inline bool is_fip_mode(struct fcoe_ctlr *fip)   * @attached:	whether this transport is already attached   * @list:	list linkage to all attached transports   * @match:	handler to allow the transport driver to match up a given netdev + * @alloc:      handler to allocate per-instance FCoE structures + *		(no discovery or login)   * @create:	handler to sysfs entry of create for FCoE instances - * @destroy:	handler to sysfs entry of destroy for FCoE instances + * @destroy:    handler to delete per-instance FCoE structures + *		(frees all memory)   * @enable:	handler to sysfs entry of enable for FCoE instances   * @disable:	handler to sysfs entry of disable for FCoE instances   */ @@ -299,6 +305,7 @@ struct fcoe_transport {  	bool attached;  	struct list_head list;  	bool (*match) (struct net_device *device); +	int (*alloc) (struct net_device *device);  	int (*create) (struct net_device *device, enum fip_state fip_mode);  	int (*destroy) (struct net_device *device);  	int (*enable) (struct net_device *device); @@ -347,7 +354,20 @@ struct fcoe_port {  	struct timer_list     timer;  	struct work_struct    destroy_work;  	u8		      data_src_addr[ETH_ALEN]; +	struct net_device * (*get_netdev)(const struct fc_lport *lport);  }; + +/** + * fcoe_get_netdev() - Return the net device associated with a local port + * @lport: The local port to get the net device from + */ +static inline struct net_device *fcoe_get_netdev(const struct fc_lport *lport) +{ +	struct fcoe_port *port = ((struct fcoe_port *)lport_priv(lport)); + +	return (port->get_netdev) ? port->get_netdev(lport) : NULL; +} +  void fcoe_clean_pending_queue(struct fc_lport *);  void fcoe_check_wait_queue(struct fc_lport *lport, struct sk_buff *skb);  void fcoe_queue_timer(ulong lport); @@ -356,7 +376,7 @@ int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen,  /* FCoE Sysfs helpers */  void fcoe_fcf_get_selected(struct fcoe_fcf_device *); -void fcoe_ctlr_get_fip_mode(struct fcoe_ctlr_device *); +void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *);  /**   * struct netdev_list @@ -372,4 +392,12 @@ struct fcoe_netdev_mapping {  int fcoe_transport_attach(struct fcoe_transport *ft);  int fcoe_transport_detach(struct fcoe_transport *ft); +/* sysfs store handler for ctrl_control interface */ +ssize_t fcoe_ctlr_create_store(struct bus_type *bus, +			       const char *buf, size_t count); +ssize_t fcoe_ctlr_destroy_store(struct bus_type *bus, +				const char *buf, size_t count); +  #endif /* _LIBFCOE_H */ + + diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index e65c62e82c5..a7f9cba275e 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -157,10 +157,11 @@ struct scsi_device {  	unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */  	unsigned try_rc_10_first:1;	/* Try READ_CAPACACITY_10 first */  	unsigned is_visible:1;	/* is the device visible in sysfs */ -	unsigned can_power_off:1; /* Device supports runtime power off */  	unsigned wce_default_on:1;	/* Cache is ON by default */  	unsigned no_dif:1;	/* T10 PI (DIF) should be disabled */ +	atomic_t disk_events_disable_depth; /* disable depth for disk events */ +  	DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */  	struct list_head event_list;	/* asserted events */  	struct work_struct event_work; @@ -397,6 +398,8 @@ extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,  			    int data_direction, void *buffer, unsigned bufflen,  			    struct scsi_sense_hdr *, int timeout, int retries,  			    int *resid); +extern void sdev_disable_disk_events(struct scsi_device *sdev); +extern void sdev_enable_disk_events(struct scsi_device *sdev);  #ifdef CONFIG_PM_RUNTIME  extern int scsi_autopm_get_device(struct scsi_device *); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 49084807eb6..2b6956e9853 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -873,7 +873,7 @@ static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsign  				       SHOST_DIF_TYPE2_PROTECTION,  				       SHOST_DIF_TYPE3_PROTECTION }; -	if (target_type > SHOST_DIF_TYPE3_PROTECTION) +	if (target_type >= ARRAY_SIZE(cap))  		return 0;  	return shost->prot_capabilities & cap[target_type] ? target_type : 0; @@ -887,7 +887,7 @@ static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsign  				       SHOST_DIX_TYPE2_PROTECTION,  				       SHOST_DIX_TYPE3_PROTECTION }; -	if (target_type > SHOST_DIX_TYPE3_PROTECTION) +	if (target_type >= ARRAY_SIZE(cap))  		return 0;  	return shost->prot_capabilities & cap[target_type]; diff --git a/include/sound/aess.h b/include/sound/aess.h new file mode 100644 index 00000000000..cee0d09fadb --- /dev/null +++ b/include/sound/aess.h @@ -0,0 +1,53 @@ +/* + * AESS IP block reset + * + * Copyright (C) 2012 Texas Instruments, Inc. + * Paul Walmsley + * + * 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. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; 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 __SOUND_AESS_H__ +#define __SOUND_AESS_H__ + +#include <linux/kernel.h> +#include <linux/io.h> + +/* + * AESS_AUTO_GATING_ENABLE_OFFSET: offset in bytes of the AESS IP + *     block's AESS_AUTO_GATING_ENABLE__1 register from the IP block's + *     base address + */ +#define AESS_AUTO_GATING_ENABLE_OFFSET			0x07c + +/* Register bitfields in the AESS_AUTO_GATING_ENABLE__1 register */ +#define AESS_AUTO_GATING_ENABLE_SHIFT			0 + +/** + * aess_enable_autogating - enable AESS internal autogating + * @oh: struct omap_hwmod * + * + * Enable internal autogating on the AESS.  This allows the AESS to + * indicate that it is idle to the OMAP PRCM.  Returns 0. + */ +static inline void aess_enable_autogating(void __iomem *base) +{ +	u32 v; + +	/* Set AESS_AUTO_GATING_ENABLE__1.ENABLE to allow idle entry */ +	v = 1 << AESS_AUTO_GATING_ENABLE_SHIFT; +	writel(v, base + AESS_AUTO_GATING_ENABLE_OFFSET); +} + +#endif /* __SOUND_AESS_H__ */ diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h index f2912abacdf..ff6c74153fa 100644 --- a/include/sound/compress_driver.h +++ b/include/sound/compress_driver.h @@ -71,6 +71,8 @@ struct snd_compr_runtime {   * @runtime: pointer to runtime structure   * @device: device pointer   * @direction: stream direction, playback/recording + * @metadata_set: metadata set flag, true when set + * @next_track: has userspace signall next track transistion, true when set   * @private_data: pointer to DSP private data   */  struct snd_compr_stream { @@ -79,6 +81,8 @@ struct snd_compr_stream {  	struct snd_compr_runtime *runtime;  	struct snd_compr *device;  	enum snd_compr_direction direction; +	bool metadata_set; +	bool next_track;  	void *private_data;  }; @@ -110,6 +114,10 @@ struct snd_compr_ops {  			struct snd_compr_params *params);  	int (*get_params)(struct snd_compr_stream *stream,  			struct snd_codec *params); +	int (*set_metadata)(struct snd_compr_stream *stream, +			struct snd_compr_metadata *metadata); +	int (*get_metadata)(struct snd_compr_stream *stream, +			struct snd_compr_metadata *metadata);  	int (*trigger)(struct snd_compr_stream *stream, int cmd);  	int (*pointer)(struct snd_compr_stream *stream,  			struct snd_compr_tstamp *tstamp); diff --git a/include/sound/core.h b/include/sound/core.h index 93896ad1fcd..7cede2d6aa8 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -394,8 +394,11 @@ void __snd_printk(unsigned int level, const char *file, int line,  #else /* !CONFIG_SND_DEBUG */ -#define snd_printd(fmt, args...)	do { } while (0) -#define _snd_printd(level, fmt, args...) do { } while (0) +__printf(1, 2) +static inline void snd_printd(const char *format, ...) {} +__printf(2, 3) +static inline void _snd_printd(int level, const char *format, ...) {} +  #define snd_BUG()			do { } while (0)  static inline int __snd_bug_on(int cond)  { @@ -416,7 +419,8 @@ static inline int __snd_bug_on(int cond)  #define snd_printdd(format, args...) \  	__snd_printk(2, __FILE__, __LINE__, format, ##args)  #else -#define snd_printdd(format, args...)	do { } while (0) +__printf(1, 2) +static inline void snd_printdd(const char *format, ...) {}  #endif @@ -454,6 +458,7 @@ struct snd_pci_quirk {  #define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\  	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev),			\  			.value = (val), .name = (xname)} +#define snd_pci_quirk_name(q)	((q)->name)  #else  #define SND_PCI_QUIRK(vend,dev,xname,val) \  	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)} @@ -461,6 +466,7 @@ struct snd_pci_quirk {  	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev), .value = (val)}  #define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\  	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val)} +#define snd_pci_quirk_name(q)	""  #endif  const struct snd_pci_quirk * diff --git a/include/sound/cs4271.h b/include/sound/cs4271.h index dd8c48d14ed..70f45355aca 100644 --- a/include/sound/cs4271.h +++ b/include/sound/cs4271.h @@ -20,6 +20,21 @@  struct cs4271_platform_data {  	int gpio_nreset;	/* GPIO driving Reset pin, if any */  	bool amutec_eq_bmutec;	/* flag to enable AMUTEC=BMUTEC */ + +	/* +	 * The CS4271 requires its LRCLK and MCLK to be stable before its RESET +	 * line is de-asserted. That also means that clocks cannot be changed +	 * without putting the chip back into hardware reset, which also requires +	 * a complete re-initialization of all registers. +	 * +	 * One (undocumented) workaround is to assert and de-assert the PDN bit +	 * in the MODE2 register. This workaround can be enabled with the +	 * following flag. +	 * +	 * Note that this is not needed in case the clocks are stable +	 * throughout the entire runtime of the codec. +	 */ +	bool enable_soft_reset;  };  #endif /* __CS4271_H */ diff --git a/include/sound/da7213.h b/include/sound/da7213.h new file mode 100644 index 00000000000..673f5c39cbf --- /dev/null +++ b/include/sound/da7213.h @@ -0,0 +1,52 @@ +/* + * da7213.h - DA7213 ASoC Codec Driver Platform Data + * + * Copyright (c) 2013 Dialog Semiconductor + * + * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.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 _DA7213_PDATA_H +#define _DA7213_PDATA_H + +enum da7213_micbias_voltage { +	DA7213_MICBIAS_1_6V = 0, +	DA7213_MICBIAS_2_2V = 1, +	DA7213_MICBIAS_2_5V = 2, +	DA7213_MICBIAS_3_0V = 3, +}; + +enum da7213_dmic_data_sel { +	DA7213_DMIC_DATA_LRISE_RFALL = 0, +	DA7213_DMIC_DATA_LFALL_RRISE = 1, +}; + +enum da7213_dmic_samplephase { +	DA7213_DMIC_SAMPLE_ON_CLKEDGE = 0, +	DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE = 1, +}; + +enum da7213_dmic_clk_rate { +	DA7213_DMIC_CLK_3_0MHZ = 0, +	DA7213_DMIC_CLK_1_5MHZ = 1, +}; + +struct da7213_platform_data { +	/* Mic Bias voltage */ +	enum da7213_micbias_voltage micbias1_lvl; +	enum da7213_micbias_voltage micbias2_lvl; + +	/* DMIC config */ +	enum da7213_dmic_data_sel dmic_data_sel; +	enum da7213_dmic_samplephase dmic_samplephase; +	enum da7213_dmic_clk_rate dmic_clk_rate; + +	/* MCLK squaring config */ +	bool mclk_squaring; +}; + +#endif /* _DA7213_PDATA_H */ diff --git a/include/sound/max98090.h b/include/sound/max98090.h new file mode 100644 index 00000000000..95efb13f847 --- /dev/null +++ b/include/sound/max98090.h @@ -0,0 +1,29 @@ +/* + * Platform data for MAX98090 + * + * Copyright 2011-2012 Maxim Integrated Products + * + *  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 __SOUND_MAX98090_PDATA_H__ +#define __SOUND_MAX98090_PDATA_H__ + +/* codec platform data */ +struct max98090_pdata { + +	/* Analog/digital microphone configuration: +	 * 0 = analog microphone input (normal setting) +	 * 1 = digital microphone input +	 */ +	unsigned int digmic_left_mode:1; +	unsigned int digmic_right_mode:1; +	unsigned int digmic_3_mode:1; +	unsigned int digmic_4_mode:1; +}; + +#endif diff --git a/include/sound/memalloc.h b/include/sound/memalloc.h index 844af65af62..cf15b8213df 100644 --- a/include/sound/memalloc.h +++ b/include/sound/memalloc.h @@ -37,7 +37,7 @@ struct snd_dma_device {  #ifndef snd_dma_pci_data  #define snd_dma_pci_data(pci)	(&(pci)->dev)  #define snd_dma_isa_data()	NULL -#define snd_dma_continuous_data(x)	((struct device *)(unsigned long)(x)) +#define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))  #endif diff --git a/include/sound/saif.h b/include/sound/saif.h deleted file mode 100644 index f22f3e16edf..00000000000 --- a/include/sound/saif.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 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 version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __SOUND_SAIF_H__ -#define __SOUND_SAIF_H__ - -struct mxs_saif_platform_data { -	bool master_mode;	/* if true use master mode */ -	int master_id;		/* id of the master if in slave mode */ -}; -#endif diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index cc1c919c643..7a9710b4b79 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h @@ -11,82 +11,20 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - -#define FSI_PORT_A	0 -#define FSI_PORT_B	1 -  #include <linux/clk.h>  #include <sound/soc.h>  /* - * flags format - * - * 0x00000CBA - * - * A:  inversion - * B:  format mode - * C:  chip specific - * D:  clock selecter if master mode + * flags   */ - -/* A: clock inversion */ -#define SH_FSI_INVERSION_MASK	0x0000000F -#define SH_FSI_LRM_INV		(1 << 0) -#define SH_FSI_BRM_INV		(1 << 1) -#define SH_FSI_LRS_INV		(1 << 2) -#define SH_FSI_BRS_INV		(1 << 3) - -/* B: format mode */ -#define SH_FSI_FMT_MASK		0x000000F0 -#define SH_FSI_FMT_DAI		(0 << 4) -#define SH_FSI_FMT_SPDIF	(1 << 4) - -/* C: chip specific */ -#define SH_FSI_OPTION_MASK	0x00000F00 -#define SH_FSI_ENABLE_STREAM_MODE	(1 << 8) /* for 16bit data */ - -/* D:  clock selecter if master mode */ -#define SH_FSI_CLK_MASK		0x0000F000 -#define SH_FSI_CLK_EXTERNAL	(0 << 12) -#define SH_FSI_CLK_CPG		(1 << 12) /* FSIxCK + FSI-DIV */ - -/* - * set_rate return value - * - * see ACKMD/BPFMD on - *     ACK_MD (FSI2) - *     CKG1   (FSI) - * - * err		: return value <  0 - * no change	: return value == 0 - * change xMD	: return value >  0 - * - * 0x-00000AB - * - * A:  ACKMD value - * B:  BPFMD value - */ - -#define SH_FSI_ACKMD_MASK	(0xF << 0) -#define SH_FSI_ACKMD_512	(1 << 0) -#define SH_FSI_ACKMD_256	(2 << 0) -#define SH_FSI_ACKMD_128	(3 << 0) -#define SH_FSI_ACKMD_64		(4 << 0) -#define SH_FSI_ACKMD_32		(5 << 0) - -#define SH_FSI_BPFMD_MASK	(0xF << 4) -#define SH_FSI_BPFMD_512	(1 << 4) -#define SH_FSI_BPFMD_256	(2 << 4) -#define SH_FSI_BPFMD_128	(3 << 4) -#define SH_FSI_BPFMD_64		(4 << 4) -#define SH_FSI_BPFMD_32		(5 << 4) -#define SH_FSI_BPFMD_16		(6 << 4) +#define SH_FSI_FMT_SPDIF		(1 << 0) /* spdif for HDMI */ +#define SH_FSI_ENABLE_STREAM_MODE	(1 << 1) /* for 16bit data */ +#define SH_FSI_CLK_CPG			(1 << 2) /* FSIxCK + FSI-DIV */  struct sh_fsi_port_info {  	unsigned long flags;  	int tx_id;  	int rx_id; -	int (*set_rate)(struct device *dev, int rate, int enable);  };  struct sh_fsi_platform_info { diff --git a/include/sound/simple_card.h b/include/sound/simple_card.h index 4b62b8dc6a4..6c74527d492 100644 --- a/include/sound/simple_card.h +++ b/include/sound/simple_card.h @@ -14,21 +14,21 @@  #include <sound/soc.h> -struct asoc_simple_dai_init_info { +struct asoc_simple_dai { +	const char *name;  	unsigned int fmt; -	unsigned int cpu_daifmt; -	unsigned int codec_daifmt;  	unsigned int sysclk;  };  struct asoc_simple_card_info {  	const char *name;  	const char *card; -	const char *cpu_dai;  	const char *codec;  	const char *platform; -	const char *codec_dai; -	struct asoc_simple_dai_init_info *init; /* for snd_link.init */ + +	unsigned int daifmt; +	struct asoc_simple_dai cpu_dai; +	struct asoc_simple_dai codec_dai;  	/* used in simple-card.c */  	struct snd_soc_dai_link snd_link; diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 3953cea0ecf..3d84808952b 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -45,7 +45,7 @@ struct snd_compr_stream;   * sending or receiving PCM data in a frame. This can be used to save power.   */  #define SND_SOC_DAIFMT_CONT		(1 << 4) /* continuous clock */ -#define SND_SOC_DAIFMT_GATED		(2 << 4) /* clock is gated */ +#define SND_SOC_DAIFMT_GATED		(0 << 4) /* clock is gated */  /*   * DAI hardware signal inversions. @@ -53,7 +53,7 @@ struct snd_compr_stream;   * Specifies whether the DAI can also support inverted clocks for the specified   * format.   */ -#define SND_SOC_DAIFMT_NB_NF		(1 << 8) /* normal bit clock + frame */ +#define SND_SOC_DAIFMT_NB_NF		(0 << 8) /* normal bit clock + frame */  #define SND_SOC_DAIFMT_NB_IF		(2 << 8) /* normal BCLK + inv FRM */  #define SND_SOC_DAIFMT_IB_NF		(3 << 8) /* invert BCLK + nor FRM */  #define SND_SOC_DAIFMT_IB_IF		(4 << 8) /* invert BCLK + FRM */ @@ -126,7 +126,8 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,  int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);  /* Digital Audio Interface mute */ -int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute); +int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute, +			     int direction);  struct snd_soc_dai_ops {  	/* @@ -157,6 +158,7 @@ struct snd_soc_dai_ops {  	 * Called by soc-core to minimise any pops.  	 */  	int (*digital_mute)(struct snd_soc_dai *dai, int mute); +	int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);  	/*  	 * ALSA PCM audio operations - all optional. diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index e1ef63d4a5c..44a30b10868 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -488,6 +488,7 @@ struct snd_soc_dapm_path {  	/* status */  	u32 connect:1;	/* source and sink widgets are connected */  	u32 walked:1;	/* path has been walked */ +	u32 walking:1;  /* path is in the process of being walked */  	u32 weak:1;	/* path ignored for power management */  	int (*connected)(struct snd_soc_dapm_widget *source, diff --git a/include/sound/soc.h b/include/sound/soc.h index bc56738cb10..a6a059ca387 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -906,8 +906,8 @@ struct snd_soc_dai_link {  			struct snd_pcm_hw_params *params);  	/* machine stream operations */ -	struct snd_soc_ops *ops; -	struct snd_soc_compr_ops *compr_ops; +	const struct snd_soc_ops *ops; +	const struct snd_soc_compr_ops *compr_ops;  };  struct snd_soc_codec_conf { @@ -1171,6 +1171,8 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card,  			       const char *propname);  int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,  				   const char *propname); +unsigned int snd_soc_of_parse_daifmt(struct device_node *np, +				     const char *prefix);  #include <sound/soc-dai.h> diff --git a/include/sound/tlv320aic3x.h b/include/sound/tlv320aic3x.h index ffd9bc79310..9407fd00363 100644 --- a/include/sound/tlv320aic3x.h +++ b/include/sound/tlv320aic3x.h @@ -46,6 +46,13 @@ enum {  	AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ	= 15  }; +enum aic3x_micbias_voltage { +	AIC3X_MICBIAS_OFF = 0, +	AIC3X_MICBIAS_2_0V = 1, +	AIC3X_MICBIAS_2_5V = 2, +	AIC3X_MICBIAS_AVDDV = 3, +}; +  struct aic3x_setup_data {  	unsigned int gpio_func[2];  }; @@ -53,6 +60,9 @@ struct aic3x_setup_data {  struct aic3x_pdata {  	int gpio_reset; /* < 0 if not used */  	struct aic3x_setup_data *setup; + +	/* Selects the micbias voltage */ +	enum aic3x_micbias_voltage micbias_vg;  };  #endif diff --git a/include/sound/wm2000.h b/include/sound/wm2000.h index aa388ca9ec6..4de81f41c90 100644 --- a/include/sound/wm2000.h +++ b/include/sound/wm2000.h @@ -15,9 +15,6 @@ struct wm2000_platform_data {  	/** Filename for system-specific image to download to device. */  	const char *download_file; -	/** Divide MCLK by 2 for system clock? */ -	unsigned int mclkdiv2:1; -  	/** Disable speech clarity enhancement, for use when an  	 * external algorithm is used. */  	unsigned int speech_enh_disable:1; diff --git a/include/sound/wm2200.h b/include/sound/wm2200.h index 79bf55be7ff..bc7ab1a4b48 100644 --- a/include/sound/wm2200.h +++ b/include/sound/wm2200.h @@ -12,6 +12,7 @@  #define __LINUX_SND_WM2200_H  #define WM2200_GPIO_SET 0x10000 +#define WM2200_MAX_MICBIAS 2  enum wm2200_in_mode {  	WM2200_IN_SE = 0, @@ -25,6 +26,24 @@ enum wm2200_dmic_sup {  	WM2200_DMIC_SUP_MICBIAS2 = 2,  }; +enum wm2200_mbias_lvl { +	WM2200_MBIAS_LVL_1V5 = 1, +	WM2200_MBIAS_LVL_1V8 = 2, +	WM2200_MBIAS_LVL_1V9 = 3, +	WM2200_MBIAS_LVL_2V0 = 4, +	WM2200_MBIAS_LVL_2V2 = 5, +	WM2200_MBIAS_LVL_2V4 = 6, +	WM2200_MBIAS_LVL_2V5 = 7, +	WM2200_MBIAS_LVL_2V6 = 8, +}; + +struct wm2200_micbias { +	enum wm2200_mbias_lvl mb_lvl;      /** Regulated voltage */ +	unsigned int discharge:1;          /** Actively discharge */ +	unsigned int fast_start:1;         /** Enable aggressive startup ramp rate */ +	unsigned int bypass:1;             /** Use bypass mode */ +}; +  struct wm2200_pdata {  	int reset;      /** GPIO controlling /RESET, if any */  	int ldo_ena;    /** GPIO controlling LODENA, if any */ @@ -35,7 +54,8 @@ struct wm2200_pdata {  	enum wm2200_in_mode in_mode[3];  	enum wm2200_dmic_sup dmic_sup[3]; -	int micbias_cfg[2];  /** Register value to configure MICBIAS */ +	/** MICBIAS configurations */ +	struct wm2200_micbias micbias[WM2200_MAX_MICBIAS];  };  #endif diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 507910992c5..b128c20770b 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h @@ -35,6 +35,7 @@ struct se_subsystem_api {  	u32 (*get_device_type)(struct se_device *);  	sector_t (*get_blocks)(struct se_device *);  	unsigned char *(*get_sense_buffer)(struct se_cmd *); +	bool (*get_write_cache)(struct se_device *);  };  struct sbc_ops { @@ -52,11 +53,13 @@ void	target_complete_cmd(struct se_cmd *, u8);  sense_reason_t	spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);  sense_reason_t	spc_emulate_report_luns(struct se_cmd *cmd); -sector_t	spc_get_write_same_sectors(struct se_cmd *cmd); +sense_reason_t	spc_emulate_inquiry_std(struct se_cmd *, unsigned char *); +sense_reason_t	spc_emulate_evpd_83(struct se_cmd *, unsigned char *);  sense_reason_t	sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops);  u32	sbc_get_device_rev(struct se_device *dev);  u32	sbc_get_device_type(struct se_device *dev); +sector_t	sbc_get_write_same_sectors(struct se_cmd *cmd);  void	transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);  int	transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 663e34a5383..c4af592f705 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -44,7 +44,7 @@  /* Used by core_alua_store_tg_pt_gp_info() and target_core_alua_tg_pt_gp_show_attr_members() */  #define TG_PT_GROUP_NAME_BUF			256  /* Used to parse VPD into struct t10_vpd */ -#define VPD_TMP_BUF_SIZE			128 +#define VPD_TMP_BUF_SIZE			254  /* Used by transport_generic_cmd_sequencer() */  #define READ_BLOCK_LEN          		6  #define READ_CAP_LEN            		8 @@ -75,6 +75,8 @@  #define DA_MAX_WRITE_SAME_LEN			0  /* Default max transfer length */  #define DA_FABRIC_MAX_SECTORS			8192 +/* Use a model alias based on the configfs backend device name */ +#define DA_EMULATE_MODEL_ALIAS			0  /* Emulation for Direct Page Out */  #define DA_EMULATE_DPO				0  /* Emulation for Forced Unit Access WRITEs */ @@ -193,6 +195,7 @@ enum tcm_sense_reason_table {  	TCM_RESERVATION_CONFLICT		= R(0x10),  	TCM_ADDRESS_OUT_OF_RANGE		= R(0x11),  	TCM_OUT_OF_RESOURCES			= R(0x12), +	TCM_PARAMETER_LIST_LENGTH_ERROR		= R(0x13),  #undef R  }; @@ -211,7 +214,6 @@ enum tcm_tmreq_table {  	TMR_LUN_RESET		= 5,  	TMR_TARGET_WARM_RESET	= 6,  	TMR_TARGET_COLD_RESET	= 7, -	TMR_FABRIC_TMR		= 255,  };  /* fabric independent task management response values */ @@ -592,6 +594,7 @@ struct se_dev_entry {  };  struct se_dev_attrib { +	int		emulate_model_alias;  	int		emulate_dpo;  	int		emulate_fua_write;  	int		emulate_fua_read; diff --git a/include/trace/events/block.h b/include/trace/events/block.h index 05c5e61f0a7..9c1467357b0 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -6,10 +6,61 @@  #include <linux/blktrace_api.h>  #include <linux/blkdev.h> +#include <linux/buffer_head.h>  #include <linux/tracepoint.h>  #define RWBS_LEN	8 +DECLARE_EVENT_CLASS(block_buffer, + +	TP_PROTO(struct buffer_head *bh), + +	TP_ARGS(bh), + +	TP_STRUCT__entry ( +		__field(  dev_t,	dev			) +		__field(  sector_t,	sector			) +		__field(  size_t,	size			) +	), + +	TP_fast_assign( +		__entry->dev		= bh->b_bdev->bd_dev; +		__entry->sector		= bh->b_blocknr; +		__entry->size		= bh->b_size; +	), + +	TP_printk("%d,%d sector=%llu size=%zu", +		MAJOR(__entry->dev), MINOR(__entry->dev), +		(unsigned long long)__entry->sector, __entry->size +	) +); + +/** + * block_touch_buffer - mark a buffer accessed + * @bh: buffer_head being touched + * + * Called from touch_buffer(). + */ +DEFINE_EVENT(block_buffer, block_touch_buffer, + +	TP_PROTO(struct buffer_head *bh), + +	TP_ARGS(bh) +); + +/** + * block_dirty_buffer - mark a buffer dirty + * @bh: buffer_head being dirtied + * + * Called from mark_buffer_dirty(). + */ +DEFINE_EVENT(block_buffer, block_dirty_buffer, + +	TP_PROTO(struct buffer_head *bh), + +	TP_ARGS(bh) +); +  DECLARE_EVENT_CLASS(block_rq_with_error,  	TP_PROTO(struct request_queue *q, struct request *rq), @@ -241,11 +292,11 @@ TRACE_EVENT(block_bio_complete,  		  __entry->nr_sector, __entry->error)  ); -DECLARE_EVENT_CLASS(block_bio, +DECLARE_EVENT_CLASS(block_bio_merge, -	TP_PROTO(struct request_queue *q, struct bio *bio), +	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), -	TP_ARGS(q, bio), +	TP_ARGS(q, rq, bio),  	TP_STRUCT__entry(  		__field( dev_t,		dev			) @@ -272,31 +323,33 @@ DECLARE_EVENT_CLASS(block_bio,  /**   * block_bio_backmerge - merging block operation to the end of an existing operation   * @q: queue holding operation + * @rq: request bio is being merged into   * @bio: new block operation to merge   *   * Merging block request @bio to the end of an existing block request   * in queue @q.   */ -DEFINE_EVENT(block_bio, block_bio_backmerge, +DEFINE_EVENT(block_bio_merge, block_bio_backmerge, -	TP_PROTO(struct request_queue *q, struct bio *bio), +	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), -	TP_ARGS(q, bio) +	TP_ARGS(q, rq, bio)  );  /**   * block_bio_frontmerge - merging block operation to the beginning of an existing operation   * @q: queue holding operation + * @rq: request bio is being merged into   * @bio: new block operation to merge   *   * Merging block IO operation @bio to the beginning of an existing block   * operation in queue @q.   */ -DEFINE_EVENT(block_bio, block_bio_frontmerge, +DEFINE_EVENT(block_bio_merge, block_bio_frontmerge, -	TP_PROTO(struct request_queue *q, struct bio *bio), +	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), -	TP_ARGS(q, bio) +	TP_ARGS(q, rq, bio)  );  /** @@ -306,11 +359,32 @@ DEFINE_EVENT(block_bio, block_bio_frontmerge,   *   * About to place the block IO operation @bio into queue @q.   */ -DEFINE_EVENT(block_bio, block_bio_queue, +TRACE_EVENT(block_bio_queue,  	TP_PROTO(struct request_queue *q, struct bio *bio), -	TP_ARGS(q, bio) +	TP_ARGS(q, bio), + +	TP_STRUCT__entry( +		__field( dev_t,		dev			) +		__field( sector_t,	sector			) +		__field( unsigned int,	nr_sector		) +		__array( char,		rwbs,	RWBS_LEN	) +		__array( char,		comm,	TASK_COMM_LEN	) +	), + +	TP_fast_assign( +		__entry->dev		= bio->bi_bdev->bd_dev; +		__entry->sector		= bio->bi_sector; +		__entry->nr_sector	= bio->bi_size >> 9; +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		memcpy(__entry->comm, current->comm, TASK_COMM_LEN); +	), + +	TP_printk("%d,%d %s %llu + %u [%s]", +		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, +		  (unsigned long long)__entry->sector, +		  __entry->nr_sector, __entry->comm)  );  DECLARE_EVENT_CLASS(block_get_rq, diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 7e8c36bc708..4ee47100385 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -1324,6 +1324,31 @@ TRACE_EVENT(ext4_fallocate_exit,  		  __entry->ret)  ); +TRACE_EVENT(ext4_punch_hole, +	TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + +	TP_ARGS(inode, offset, len), + +	TP_STRUCT__entry( +		__field(	dev_t,	dev			) +		__field(	ino_t,	ino			) +		__field(	loff_t,	offset			) +		__field(	loff_t, len			) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->offset	= offset; +		__entry->len	= len; +	), + +	TP_printk("dev %d,%d ino %lu offset %lld len %lld", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  (unsigned long) __entry->ino, +		  __entry->offset, __entry->len) +); +  TRACE_EVENT(ext4_unlink_enter,  	TP_PROTO(struct inode *parent, struct dentry *dentry), @@ -2068,103 +2093,210 @@ TRACE_EVENT(ext4_ext_remove_space_done,  );  TRACE_EVENT(ext4_es_insert_extent, -	TP_PROTO(struct inode *inode, ext4_lblk_t start, ext4_lblk_t len), +	TP_PROTO(struct inode *inode, struct extent_status *es), -	TP_ARGS(inode, start, len), +	TP_ARGS(inode, es),  	TP_STRUCT__entry( -		__field(	dev_t,	dev			) -		__field(	ino_t,	ino			) -		__field(	loff_t,	start			) -		__field(	loff_t, len			) +		__field(	dev_t,		dev		) +		__field(	ino_t,		ino		) +		__field(	ext4_lblk_t,	lblk		) +		__field(	ext4_lblk_t,	len		) +		__field(	ext4_fsblk_t,	pblk		) +		__field(	unsigned long long, status	)  	),  	TP_fast_assign(  		__entry->dev	= inode->i_sb->s_dev;  		__entry->ino	= inode->i_ino; -		__entry->start	= start; -		__entry->len	= len; +		__entry->lblk	= es->es_lblk; +		__entry->len	= es->es_len; +		__entry->pblk	= ext4_es_pblock(es); +		__entry->status	= ext4_es_status(es);  	), -	TP_printk("dev %d,%d ino %lu es [%lld/%lld)", +	TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %llx",  		  MAJOR(__entry->dev), MINOR(__entry->dev),  		  (unsigned long) __entry->ino, -		  __entry->start, __entry->len) +		  __entry->lblk, __entry->len, +		  __entry->pblk, __entry->status)  );  TRACE_EVENT(ext4_es_remove_extent, -	TP_PROTO(struct inode *inode, ext4_lblk_t start, ext4_lblk_t len), +	TP_PROTO(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len), -	TP_ARGS(inode, start, len), +	TP_ARGS(inode, lblk, len),  	TP_STRUCT__entry(  		__field(	dev_t,	dev			)  		__field(	ino_t,	ino			) -		__field(	loff_t,	start			) +		__field(	loff_t,	lblk			)  		__field(	loff_t,	len			)  	),  	TP_fast_assign(  		__entry->dev	= inode->i_sb->s_dev;  		__entry->ino	= inode->i_ino; -		__entry->start	= start; +		__entry->lblk	= lblk;  		__entry->len	= len;  	),  	TP_printk("dev %d,%d ino %lu es [%lld/%lld)",  		  MAJOR(__entry->dev), MINOR(__entry->dev),  		  (unsigned long) __entry->ino, -		  __entry->start, __entry->len) +		  __entry->lblk, __entry->len)  ); -TRACE_EVENT(ext4_es_find_extent_enter, -	TP_PROTO(struct inode *inode, ext4_lblk_t start), +TRACE_EVENT(ext4_es_find_delayed_extent_enter, +	TP_PROTO(struct inode *inode, ext4_lblk_t lblk), -	TP_ARGS(inode, start), +	TP_ARGS(inode, lblk),  	TP_STRUCT__entry(  		__field(	dev_t,		dev		)  		__field(	ino_t,		ino		) -		__field(	ext4_lblk_t,	start		) +		__field(	ext4_lblk_t,	lblk		)  	),  	TP_fast_assign(  		__entry->dev	= inode->i_sb->s_dev;  		__entry->ino	= inode->i_ino; -		__entry->start	= start; +		__entry->lblk	= lblk;  	), -	TP_printk("dev %d,%d ino %lu start %u", +	TP_printk("dev %d,%d ino %lu lblk %u",  		  MAJOR(__entry->dev), MINOR(__entry->dev), -		  (unsigned long) __entry->ino, __entry->start) +		  (unsigned long) __entry->ino, __entry->lblk)  ); -TRACE_EVENT(ext4_es_find_extent_exit, -	TP_PROTO(struct inode *inode, struct extent_status *es, -		 ext4_lblk_t ret), +TRACE_EVENT(ext4_es_find_delayed_extent_exit, +	TP_PROTO(struct inode *inode, struct extent_status *es), -	TP_ARGS(inode, es, ret), +	TP_ARGS(inode, es),  	TP_STRUCT__entry(  		__field(	dev_t,		dev		)  		__field(	ino_t,		ino		) -		__field(	ext4_lblk_t,	start		) +		__field(	ext4_lblk_t,	lblk		)  		__field(	ext4_lblk_t,	len		) -		__field(	ext4_lblk_t,	ret		) +		__field(	ext4_fsblk_t,	pblk		) +		__field(	unsigned long long, status	)  	),  	TP_fast_assign(  		__entry->dev	= inode->i_sb->s_dev;  		__entry->ino	= inode->i_ino; -		__entry->start	= es->start; -		__entry->len	= es->len; -		__entry->ret	= ret; +		__entry->lblk	= es->es_lblk; +		__entry->len	= es->es_len; +		__entry->pblk	= ext4_es_pblock(es); +		__entry->status	= ext4_es_status(es);  	), -	TP_printk("dev %d,%d ino %lu es [%u/%u) ret %u", +	TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %llx",  		  MAJOR(__entry->dev), MINOR(__entry->dev),  		  (unsigned long) __entry->ino, -		  __entry->start, __entry->len, __entry->ret) +		  __entry->lblk, __entry->len, +		  __entry->pblk, __entry->status) +); + +TRACE_EVENT(ext4_es_lookup_extent_enter, +	TP_PROTO(struct inode *inode, ext4_lblk_t lblk), + +	TP_ARGS(inode, lblk), + +	TP_STRUCT__entry( +		__field(	dev_t,		dev		) +		__field(	ino_t,		ino		) +		__field(	ext4_lblk_t,	lblk		) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->lblk	= lblk; +	), + +	TP_printk("dev %d,%d ino %lu lblk %u", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  (unsigned long) __entry->ino, __entry->lblk) +); + +TRACE_EVENT(ext4_es_lookup_extent_exit, +	TP_PROTO(struct inode *inode, struct extent_status *es, +		 int found), + +	TP_ARGS(inode, es, found), + +	TP_STRUCT__entry( +		__field(	dev_t,		dev		) +		__field(	ino_t,		ino		) +		__field(	ext4_lblk_t,	lblk		) +		__field(	ext4_lblk_t,	len		) +		__field(	ext4_fsblk_t,	pblk		) +		__field(	unsigned long long,	status	) +		__field(	int,		found		) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->lblk	= es->es_lblk; +		__entry->len	= es->es_len; +		__entry->pblk	= ext4_es_pblock(es); +		__entry->status	= ext4_es_status(es); +		__entry->found	= found; +	), + +	TP_printk("dev %d,%d ino %lu found %d [%u/%u) %llu %llx", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  (unsigned long) __entry->ino, __entry->found, +		  __entry->lblk, __entry->len, +		  __entry->found ? __entry->pblk : 0, +		  __entry->found ? __entry->status : 0) +); + +TRACE_EVENT(ext4_es_shrink_enter, +	TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), + +	TP_ARGS(sb, nr_to_scan, cache_cnt), + +	TP_STRUCT__entry( +		__field(	dev_t,	dev			) +		__field(	int,	nr_to_scan		) +		__field(	int,	cache_cnt		) +	), + +	TP_fast_assign( +		__entry->dev		= sb->s_dev; +		__entry->nr_to_scan	= nr_to_scan; +		__entry->cache_cnt	= cache_cnt; +	), + +	TP_printk("dev %d,%d nr_to_scan %d cache_cnt %d", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  __entry->nr_to_scan, __entry->cache_cnt) +); + +TRACE_EVENT(ext4_es_shrink_exit, +	TP_PROTO(struct super_block *sb, int shrunk_nr, int cache_cnt), + +	TP_ARGS(sb, shrunk_nr, cache_cnt), + +	TP_STRUCT__entry( +		__field(	dev_t,	dev			) +		__field(	int,	shrunk_nr		) +		__field(	int,	cache_cnt		) +	), + +	TP_fast_assign( +		__entry->dev		= sb->s_dev; +		__entry->shrunk_nr	= shrunk_nr; +		__entry->cache_cnt	= cache_cnt; +	), + +	TP_printk("dev %d,%d shrunk_nr %d cache_cnt %d", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  __entry->shrunk_nr, __entry->cache_cnt)  );  #endif /* _TRACE_EXT4_H */ diff --git a/include/trace/events/jbd2.h b/include/trace/events/jbd2.h index 127993dbf32..070df49e4a1 100644 --- a/include/trace/events/jbd2.h +++ b/include/trace/events/jbd2.h @@ -132,6 +132,104 @@ TRACE_EVENT(jbd2_submit_inode_data,  		  (unsigned long) __entry->ino)  ); +TRACE_EVENT(jbd2_handle_start, +	TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, +		 unsigned int line_no, int requested_blocks), + +	TP_ARGS(dev, tid, type, line_no, requested_blocks), + +	TP_STRUCT__entry( +		__field(		dev_t,	dev		) +		__field(	unsigned long,	tid		) +		__field(	 unsigned int,	type		) +		__field(	 unsigned int,	line_no		) +		__field(		  int,	requested_blocks) +	), + +	TP_fast_assign( +		__entry->dev		  = dev; +		__entry->tid		  = tid; +		__entry->type		  = type; +		__entry->line_no	  = line_no; +		__entry->requested_blocks = requested_blocks; +	), + +	TP_printk("dev %d,%d tid %lu type %u line_no %u " +		  "requested_blocks %d", +		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, +		  __entry->type, __entry->line_no, __entry->requested_blocks) +); + +TRACE_EVENT(jbd2_handle_extend, +	TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, +		 unsigned int line_no, int buffer_credits, +		 int requested_blocks), + +	TP_ARGS(dev, tid, type, line_no, buffer_credits, requested_blocks), + +	TP_STRUCT__entry( +		__field(		dev_t,	dev		) +		__field(	unsigned long,	tid		) +		__field(	 unsigned int,	type		) +		__field(	 unsigned int,	line_no		) +		__field(		  int,	buffer_credits  ) +		__field(		  int,	requested_blocks) +	), + +	TP_fast_assign( +		__entry->dev		  = dev; +		__entry->tid		  = tid; +		__entry->type		  = type; +		__entry->line_no	  = line_no; +		__entry->buffer_credits   = buffer_credits; +		__entry->requested_blocks = requested_blocks; +	), + +	TP_printk("dev %d,%d tid %lu type %u line_no %u " +		  "buffer_credits %d requested_blocks %d", +		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, +		  __entry->type, __entry->line_no, __entry->buffer_credits, +		  __entry->requested_blocks) +); + +TRACE_EVENT(jbd2_handle_stats, +	TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, +		 unsigned int line_no, int interval, int sync, +		 int requested_blocks, int dirtied_blocks), + +	TP_ARGS(dev, tid, type, line_no, interval, sync, +		requested_blocks, dirtied_blocks), + +	TP_STRUCT__entry( +		__field(		dev_t,	dev		) +		__field(	unsigned long,	tid		) +		__field(	 unsigned int,	type		) +		__field(	 unsigned int,	line_no		) +		__field(		  int,	interval	) +		__field(		  int,	sync		) +		__field(		  int,	requested_blocks) +		__field(		  int,	dirtied_blocks	) +	), + +	TP_fast_assign( +		__entry->dev		  = dev; +		__entry->tid		  = tid; +		__entry->type		  = type; +		__entry->line_no	  = line_no; +		__entry->interval	  = interval; +		__entry->sync		  = sync; +		__entry->requested_blocks = requested_blocks; +		__entry->dirtied_blocks	  = dirtied_blocks; +	), + +	TP_printk("dev %d,%d tid %lu type %u line_no %u interval %d " +		  "sync %d requested_blocks %d dirtied_blocks %d", +		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, +		  __entry->type, __entry->line_no, __entry->interval, +		  __entry->sync, __entry->requested_blocks, +		  __entry->dirtied_blocks) +); +  TRACE_EVENT(jbd2_run_stats,  	TP_PROTO(dev_t dev, unsigned long tid,  		 struct transaction_run_stats_s *stats), @@ -142,6 +240,7 @@ TRACE_EVENT(jbd2_run_stats,  		__field(		dev_t,	dev		)  		__field(	unsigned long,	tid		)  		__field(	unsigned long,	wait		) +		__field(	unsigned long,	request_delay	)  		__field(	unsigned long,	running		)  		__field(	unsigned long,	locked		)  		__field(	unsigned long,	flushing	) @@ -155,6 +254,7 @@ TRACE_EVENT(jbd2_run_stats,  		__entry->dev		= dev;  		__entry->tid		= tid;  		__entry->wait		= stats->rs_wait; +		__entry->request_delay	= stats->rs_request_delay;  		__entry->running	= stats->rs_running;  		__entry->locked		= stats->rs_locked;  		__entry->flushing	= stats->rs_flushing; @@ -164,10 +264,12 @@ TRACE_EVENT(jbd2_run_stats,  		__entry->blocks_logged	= stats->rs_blocks_logged;  	), -	TP_printk("dev %d,%d tid %lu wait %u running %u locked %u flushing %u " -		  "logging %u handle_count %u blocks %u blocks_logged %u", +	TP_printk("dev %d,%d tid %lu wait %u request_delay %u running %u " +		  "locked %u flushing %u logging %u handle_count %u " +		  "blocks %u blocks_logged %u",  		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid,  		  jiffies_to_msecs(__entry->wait), +		  jiffies_to_msecs(__entry->request_delay),  		  jiffies_to_msecs(__entry->running),  		  jiffies_to_msecs(__entry->locked),  		  jiffies_to_msecs(__entry->flushing), diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 7ef9e759f49..19911dddaeb 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -14,7 +14,7 @@  	ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR),	\  	ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\  	ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL),	\ -	ERSN(S390_UCONTROL) +	ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH)  TRACE_EVENT(kvm_userspace_exit,  	    TP_PROTO(__u32 reason, int errno), diff --git a/include/trace/events/power.h b/include/trace/events/power.h index 0c9783841a3..427acab5d69 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h @@ -99,98 +99,6 @@ DEFINE_EVENT(wakeup_source, wakeup_source_deactivate,  	TP_ARGS(name, state)  ); -#ifdef CONFIG_EVENT_POWER_TRACING_DEPRECATED - -/* - * The power events are used for cpuidle & suspend (power_start, power_end) - *  and for cpufreq (power_frequency) - */ -DECLARE_EVENT_CLASS(power, - -	TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id), - -	TP_ARGS(type, state, cpu_id), - -	TP_STRUCT__entry( -		__field(	u64,		type		) -		__field(	u64,		state		) -		__field(	u64,		cpu_id		) -	), - -	TP_fast_assign( -		__entry->type = type; -		__entry->state = state; -		__entry->cpu_id = cpu_id; -	), - -	TP_printk("type=%lu state=%lu cpu_id=%lu", (unsigned long)__entry->type, -		(unsigned long)__entry->state, (unsigned long)__entry->cpu_id) -); - -DEFINE_EVENT(power, power_start, - -	TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id), - -	TP_ARGS(type, state, cpu_id) -); - -DEFINE_EVENT(power, power_frequency, - -	TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id), - -	TP_ARGS(type, state, cpu_id) -); - -TRACE_EVENT(power_end, - -	TP_PROTO(unsigned int cpu_id), - -	TP_ARGS(cpu_id), - -	TP_STRUCT__entry( -		__field(	u64,		cpu_id		) -	), - -	TP_fast_assign( -		__entry->cpu_id = cpu_id; -	), - -	TP_printk("cpu_id=%lu", (unsigned long)__entry->cpu_id) - -); - -/* Deprecated dummy functions must be protected against multi-declartion */ -#ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED -#define _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED - -enum { -	POWER_NONE = 0, -	POWER_CSTATE = 1, -	POWER_PSTATE = 2, -}; -#endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */ - -#else /* CONFIG_EVENT_POWER_TRACING_DEPRECATED */ - -#ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED -#define _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED -enum { -       POWER_NONE = 0, -       POWER_CSTATE = 1, -       POWER_PSTATE = 2, -}; - -/* These dummy declaration have to be ripped out when the deprecated -   events get removed */ -static inline void trace_power_start(u64 type, u64 state, u64 cpuid) {}; -static inline void trace_power_end(u64 cpuid) {}; -static inline void trace_power_start_rcuidle(u64 type, u64 state, u64 cpuid) {}; -static inline void trace_power_end_rcuidle(u64 cpuid) {}; -static inline void trace_power_frequency(u64 type, u64 state, u64 cpuid) {}; -#endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */ - -#endif /* CONFIG_EVENT_POWER_TRACING_DEPRECATED */ -  /*   * The clock events are used for clock enable/disable and for   *  clock rate change diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 5a8671e8a67..e5586caff67 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -147,7 +147,7 @@ TRACE_EVENT(sched_switch,  		  __print_flags(__entry->prev_state & (TASK_STATE_MAX-1), "|",  				{ 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" },  				{ 16, "Z" }, { 32, "X" }, { 64, "x" }, -				{ 128, "W" }) : "R", +				{ 128, "K" }, { 256, "W" }, { 512, "P" }) : "R",  		__entry->prev_state & TASK_STATE_MAX ? "+" : "",  		__entry->next_comm, __entry->next_pid, __entry->next_prio)  ); diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index b453d92c225..6a16fd2e70e 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -32,6 +32,115 @@  struct wb_writeback_work; +TRACE_EVENT(writeback_dirty_page, + +	TP_PROTO(struct page *page, struct address_space *mapping), + +	TP_ARGS(page, mapping), + +	TP_STRUCT__entry ( +		__array(char, name, 32) +		__field(unsigned long, ino) +		__field(pgoff_t, index) +	), + +	TP_fast_assign( +		strncpy(__entry->name, +			mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32); +		__entry->ino = mapping ? mapping->host->i_ino : 0; +		__entry->index = page->index; +	), + +	TP_printk("bdi %s: ino=%lu index=%lu", +		__entry->name, +		__entry->ino, +		__entry->index +	) +); + +DECLARE_EVENT_CLASS(writeback_dirty_inode_template, + +	TP_PROTO(struct inode *inode, int flags), + +	TP_ARGS(inode, flags), + +	TP_STRUCT__entry ( +		__array(char, name, 32) +		__field(unsigned long, ino) +		__field(unsigned long, flags) +	), + +	TP_fast_assign( +		struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info; + +		/* may be called for files on pseudo FSes w/ unregistered bdi */ +		strncpy(__entry->name, +			bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); +		__entry->ino		= inode->i_ino; +		__entry->flags		= flags; +	), + +	TP_printk("bdi %s: ino=%lu flags=%s", +		__entry->name, +		__entry->ino, +		show_inode_state(__entry->flags) +	) +); + +DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, + +	TP_PROTO(struct inode *inode, int flags), + +	TP_ARGS(inode, flags) +); + +DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, + +	TP_PROTO(struct inode *inode, int flags), + +	TP_ARGS(inode, flags) +); + +DECLARE_EVENT_CLASS(writeback_write_inode_template, + +	TP_PROTO(struct inode *inode, struct writeback_control *wbc), + +	TP_ARGS(inode, wbc), + +	TP_STRUCT__entry ( +		__array(char, name, 32) +		__field(unsigned long, ino) +		__field(int, sync_mode) +	), + +	TP_fast_assign( +		strncpy(__entry->name, +			dev_name(inode->i_mapping->backing_dev_info->dev), 32); +		__entry->ino		= inode->i_ino; +		__entry->sync_mode	= wbc->sync_mode; +	), + +	TP_printk("bdi %s: ino=%lu sync_mode=%d", +		__entry->name, +		__entry->ino, +		__entry->sync_mode +	) +); + +DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, + +	TP_PROTO(struct inode *inode, struct writeback_control *wbc), + +	TP_ARGS(inode, wbc) +); + +DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, + +	TP_PROTO(struct inode *inode, struct writeback_control *wbc), + +	TP_ARGS(inode, wbc) +); +  DECLARE_EVENT_CLASS(writeback_work_class,  	TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work),  	TP_ARGS(bdi, work), @@ -479,6 +588,13 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template,  	)  ); +DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, +	TP_PROTO(struct inode *inode, +		 struct writeback_control *wbc, +		 unsigned long nr_to_write), +	TP_ARGS(inode, wbc, nr_to_write) +); +  DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode,  	TP_PROTO(struct inode *inode,  		 struct writeback_control *wbc, diff --git a/include/uapi/asm-generic/signal.h b/include/uapi/asm-generic/signal.h index 6fae30fd16a..9df61f1edb0 100644 --- a/include/uapi/asm-generic/signal.h +++ b/include/uapi/asm-generic/signal.h @@ -93,6 +93,11 @@ typedef unsigned long old_sigset_t;  #include <asm-generic/signal-defs.h> +#ifdef SA_RESTORER +#define __ARCH_HAS_SA_RESTORER +#endif + +#ifndef __KERNEL__  struct sigaction {  	__sighandler_t sa_handler;  	unsigned long sa_flags; @@ -101,10 +106,7 @@ struct sigaction {  #endif  	sigset_t sa_mask;		/* mask last for extensibility */  }; - -struct k_sigaction { -	struct sigaction sa; -}; +#endif  typedef struct sigaltstack {  	void __user *ss_sp; diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index 2d32d073a6f..4ef3acbba5d 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h @@ -22,8 +22,7 @@  #define SO_PRIORITY	12  #define SO_LINGER	13  #define SO_BSDCOMPAT	14 -/* To add :#define SO_REUSEPORT 15 */ - +#define SO_REUSEPORT	15  #ifndef SO_PASSCRED /* powerpc only differs in these */  #define SO_PASSCRED	16  #define SO_PEERCRED	17 @@ -73,4 +72,6 @@  /* Instruct lower device to use last 4-bytes of skb data as FCS */  #define SO_NOFCS		43 +#define SO_LOCK_FILTER		44 +  #endif /* __ASM_GENERIC_SOCKET_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 2c531f47841..0cc74c4403e 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -402,9 +402,9 @@ __SC_COMP(__NR_rt_sigsuspend, sys_rt_sigsuspend, compat_sys_rt_sigsuspend)  #define __NR_rt_sigaction 134  __SC_COMP(__NR_rt_sigaction, sys_rt_sigaction, compat_sys_rt_sigaction)  #define __NR_rt_sigprocmask 135 -__SYSCALL(__NR_rt_sigprocmask, sys_rt_sigprocmask) +__SC_COMP(__NR_rt_sigprocmask, sys_rt_sigprocmask, compat_sys_rt_sigprocmask)  #define __NR_rt_sigpending 136 -__SYSCALL(__NR_rt_sigpending, sys_rt_sigpending) +__SC_COMP(__NR_rt_sigpending, sys_rt_sigpending, compat_sys_rt_sigpending)  #define __NR_rt_sigtimedwait 137  __SC_COMP(__NR_rt_sigtimedwait, sys_rt_sigtimedwait, \  	  compat_sys_rt_sigtimedwait) diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index c4d2e9c7400..07d59419fe6 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -308,6 +308,8 @@ typedef struct drm_i915_irq_wait {  #define I915_PARAM_RSVD_FOR_FUTURE_USE	 22  #define I915_PARAM_HAS_SECURE_BATCHES	 23  #define I915_PARAM_HAS_PINNED_BATCHES	 24 +#define I915_PARAM_HAS_EXEC_NO_RELOC	 25 +#define I915_PARAM_HAS_EXEC_HANDLE_LUT   26  typedef struct drm_i915_getparam {  	int param; @@ -628,7 +630,11 @@ struct drm_i915_gem_exec_object2 {  	__u64 offset;  #define EXEC_OBJECT_NEEDS_FENCE (1<<0) +#define EXEC_OBJECT_NEEDS_GTT	(1<<1) +#define EXEC_OBJECT_WRITE	(1<<2) +#define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_WRITE<<1)  	__u64 flags; +  	__u64 rsvd1;  	__u64 rsvd2;  }; @@ -687,6 +693,20 @@ struct drm_i915_gem_execbuffer2 {   */  #define I915_EXEC_IS_PINNED		(1<<10) +/** Provide a hint to the kernel that the command stream and auxilliary + * state buffers already holds the correct presumed addresses and so the + * relocation process may be skipped if no buffers need to be moved in + * preparation for the execbuffer. + */ +#define I915_EXEC_NO_RELOC		(1<<11) + +/** Use the reloc.handle as an index into the exec object array rather + * than as the per-file handle. + */ +#define I915_EXEC_HANDLE_LUT		(1<<12) + +#define __I915_EXEC_UNKNOWN_FLAGS -(I915_EXEC_HANDLE_LUT<<1) +  #define I915_EXEC_CONTEXT_ID_MASK	(0xffffffff)  #define i915_execbuffer2_set_context_id(eb2, context) \  	(eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK diff --git a/include/uapi/drm/omap_drm.h b/include/uapi/drm/omap_drm.h new file mode 100644 index 00000000000..1d0b1172664 --- /dev/null +++ b/include/uapi/drm/omap_drm.h @@ -0,0 +1,123 @@ +/* + * include/uapi/drm/omap_drm.h + * + * Copyright (C) 2011 Texas Instruments + * Author: Rob Clark <rob@ti.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. + * + * 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 __OMAP_DRM_H__ +#define __OMAP_DRM_H__ + +#include <drm/drm.h> + +/* Please note that modifications to all structs defined here are + * subject to backwards-compatibility constraints. + */ + +#define OMAP_PARAM_CHIPSET_ID	1	/* ie. 0x3430, 0x4430, etc */ + +struct drm_omap_param { +	uint64_t param;			/* in */ +	uint64_t value;			/* in (set_param), out (get_param) */ +}; + +#define OMAP_BO_SCANOUT		0x00000001	/* scanout capable (phys contiguous) */ +#define OMAP_BO_CACHE_MASK	0x00000006	/* cache type mask, see cache modes */ +#define OMAP_BO_TILED_MASK	0x00000f00	/* tiled mapping mask, see tiled modes */ + +/* cache modes */ +#define OMAP_BO_CACHED		0x00000000	/* default */ +#define OMAP_BO_WC		0x00000002	/* write-combine */ +#define OMAP_BO_UNCACHED	0x00000004	/* strongly-ordered (uncached) */ + +/* tiled modes */ +#define OMAP_BO_TILED_8		0x00000100 +#define OMAP_BO_TILED_16	0x00000200 +#define OMAP_BO_TILED_32	0x00000300 +#define OMAP_BO_TILED		(OMAP_BO_TILED_8 | OMAP_BO_TILED_16 | OMAP_BO_TILED_32) + +union omap_gem_size { +	uint32_t bytes;		/* (for non-tiled formats) */ +	struct { +		uint16_t width; +		uint16_t height; +	} tiled;		/* (for tiled formats) */ +}; + +struct drm_omap_gem_new { +	union omap_gem_size size;	/* in */ +	uint32_t flags;			/* in */ +	uint32_t handle;		/* out */ +	uint32_t __pad; +}; + +/* mask of operations: */ +enum omap_gem_op { +	OMAP_GEM_READ = 0x01, +	OMAP_GEM_WRITE = 0x02, +}; + +struct drm_omap_gem_cpu_prep { +	uint32_t handle;		/* buffer handle (in) */ +	uint32_t op;			/* mask of omap_gem_op (in) */ +}; + +struct drm_omap_gem_cpu_fini { +	uint32_t handle;		/* buffer handle (in) */ +	uint32_t op;			/* mask of omap_gem_op (in) */ +	/* TODO maybe here we pass down info about what regions are touched +	 * by sw so we can be clever about cache ops?  For now a placeholder, +	 * set to zero and we just do full buffer flush.. +	 */ +	uint32_t nregions; +	uint32_t __pad; +}; + +struct drm_omap_gem_info { +	uint32_t handle;		/* buffer handle (in) */ +	uint32_t pad; +	uint64_t offset;		/* mmap offset (out) */ +	/* note: in case of tiled buffers, the user virtual size can be +	 * different from the physical size (ie. how many pages are needed +	 * to back the object) which is returned in DRM_IOCTL_GEM_OPEN.. +	 * This size here is the one that should be used if you want to +	 * mmap() the buffer: +	 */ +	uint32_t size;			/* virtual size for mmap'ing (out) */ +	uint32_t __pad; +}; + +#define DRM_OMAP_GET_PARAM		0x00 +#define DRM_OMAP_SET_PARAM		0x01 +/* placeholder for plugin-api +#define DRM_OMAP_GET_BASE		0x02 +*/ +#define DRM_OMAP_GEM_NEW		0x03 +#define DRM_OMAP_GEM_CPU_PREP		0x04 +#define DRM_OMAP_GEM_CPU_FINI		0x05 +#define DRM_OMAP_GEM_INFO		0x06 +#define DRM_OMAP_NUM_IOCTLS		0x07 + +#define DRM_IOCTL_OMAP_GET_PARAM	DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GET_PARAM, struct drm_omap_param) +#define DRM_IOCTL_OMAP_SET_PARAM	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_SET_PARAM, struct drm_omap_param) +/* placeholder for plugin-api +#define DRM_IOCTL_OMAP_GET_BASE		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GET_BASE, struct drm_omap_get_base) +*/ +#define DRM_IOCTL_OMAP_GEM_NEW		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GEM_NEW, struct drm_omap_gem_new) +#define DRM_IOCTL_OMAP_GEM_CPU_PREP	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_GEM_CPU_PREP, struct drm_omap_gem_cpu_prep) +#define DRM_IOCTL_OMAP_GEM_CPU_FINI	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_GEM_CPU_FINI, struct drm_omap_gem_cpu_fini) +#define DRM_IOCTL_OMAP_GEM_INFO		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GEM_INFO, struct drm_omap_gem_info) + +#endif /* __OMAP_DRM_H__ */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 4e67194fd2c..5c8a1d25e21 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -68,6 +68,7 @@ header-y += blkpg.h  header-y += blktrace_api.h  header-y += bpqether.h  header-y += bsg.h +header-y += btrfs.h  header-y += can.h  header-y += capability.h  header-y += capi.h diff --git a/include/uapi/linux/acct.h b/include/uapi/linux/acct.h index 11b6ca3e087..df2f9a0bba6 100644 --- a/include/uapi/linux/acct.h +++ b/include/uapi/linux/acct.h @@ -107,10 +107,12 @@ struct acct_v3  #define ACORE		0x08	/* ... dumped core */  #define AXSIG		0x10	/* ... was killed by a signal */ -#ifdef __BIG_ENDIAN +#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN)  #define ACCT_BYTEORDER	0x80	/* accounting file is big endian */ -#else +#elif defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN)  #define ACCT_BYTEORDER	0x00	/* accounting file is little endian */ +#else +#error unspecified endianness  #endif  #ifndef __KERNEL__ diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h index 86fa7a71336..bb2554f7fbd 100644 --- a/include/uapi/linux/aio_abi.h +++ b/include/uapi/linux/aio_abi.h @@ -62,9 +62,9 @@ struct io_event {  	__s64		res2;		/* secondary result */  }; -#if defined(__LITTLE_ENDIAN) +#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN)  #define PADDED(x,y)	x, y -#elif defined(__BIG_ENDIAN) +#elif defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN)  #define PADDED(x,y)	y, x  #else  #error edit for your odd byteorder. diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h new file mode 100644 index 00000000000..fa3a5f9338f --- /dev/null +++ b/include/uapi/linux/btrfs.h @@ -0,0 +1,514 @@ +/* + * Copyright (C) 2007 Oracle.  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 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. + */ + +#ifndef _UAPI_LINUX_BTRFS_H +#define _UAPI_LINUX_BTRFS_H +#include <linux/types.h> +#include <linux/ioctl.h> + +#define BTRFS_IOCTL_MAGIC 0x94 +#define BTRFS_VOL_NAME_MAX 255 + +/* this should be 4k */ +#define BTRFS_PATH_NAME_MAX 4087 +struct btrfs_ioctl_vol_args { +	__s64 fd; +	char name[BTRFS_PATH_NAME_MAX + 1]; +}; + +#define BTRFS_DEVICE_PATH_NAME_MAX 1024 + +#define BTRFS_SUBVOL_CREATE_ASYNC	(1ULL << 0) +#define BTRFS_SUBVOL_RDONLY		(1ULL << 1) +#define BTRFS_SUBVOL_QGROUP_INHERIT	(1ULL << 2) +#define BTRFS_FSID_SIZE 16 +#define BTRFS_UUID_SIZE 16 + +#define BTRFS_QGROUP_INHERIT_SET_LIMITS	(1ULL << 0) + +struct btrfs_qgroup_limit { +	__u64	flags; +	__u64	max_rfer; +	__u64	max_excl; +	__u64	rsv_rfer; +	__u64	rsv_excl; +}; + +struct btrfs_qgroup_inherit { +	__u64	flags; +	__u64	num_qgroups; +	__u64	num_ref_copies; +	__u64	num_excl_copies; +	struct btrfs_qgroup_limit lim; +	__u64	qgroups[0]; +}; + +struct btrfs_ioctl_qgroup_limit_args { +	__u64	qgroupid; +	struct btrfs_qgroup_limit lim; +}; + +#define BTRFS_SUBVOL_NAME_MAX 4039 +struct btrfs_ioctl_vol_args_v2 { +	__s64 fd; +	__u64 transid; +	__u64 flags; +	union { +		struct { +			__u64 size; +			struct btrfs_qgroup_inherit __user *qgroup_inherit; +		}; +		__u64 unused[4]; +	}; +	char name[BTRFS_SUBVOL_NAME_MAX + 1]; +}; + +/* + * structure to report errors and progress to userspace, either as a + * result of a finished scrub, a canceled scrub or a progress inquiry + */ +struct btrfs_scrub_progress { +	__u64 data_extents_scrubbed;	/* # of data extents scrubbed */ +	__u64 tree_extents_scrubbed;	/* # of tree extents scrubbed */ +	__u64 data_bytes_scrubbed;	/* # of data bytes scrubbed */ +	__u64 tree_bytes_scrubbed;	/* # of tree bytes scrubbed */ +	__u64 read_errors;		/* # of read errors encountered (EIO) */ +	__u64 csum_errors;		/* # of failed csum checks */ +	__u64 verify_errors;		/* # of occurences, where the metadata +					 * of a tree block did not match the +					 * expected values, like generation or +					 * logical */ +	__u64 no_csum;			/* # of 4k data block for which no csum +					 * is present, probably the result of +					 * data written with nodatasum */ +	__u64 csum_discards;		/* # of csum for which no data was found +					 * in the extent tree. */ +	__u64 super_errors;		/* # of bad super blocks encountered */ +	__u64 malloc_errors;		/* # of internal kmalloc errors. These +					 * will likely cause an incomplete +					 * scrub */ +	__u64 uncorrectable_errors;	/* # of errors where either no intact +					 * copy was found or the writeback +					 * failed */ +	__u64 corrected_errors;		/* # of errors corrected */ +	__u64 last_physical;		/* last physical address scrubbed. In +					 * case a scrub was aborted, this can +					 * be used to restart the scrub */ +	__u64 unverified_errors;	/* # of occurences where a read for a +					 * full (64k) bio failed, but the re- +					 * check succeeded for each 4k piece. +					 * Intermittent error. */ +}; + +#define BTRFS_SCRUB_READONLY	1 +struct btrfs_ioctl_scrub_args { +	__u64 devid;				/* in */ +	__u64 start;				/* in */ +	__u64 end;				/* in */ +	__u64 flags;				/* in */ +	struct btrfs_scrub_progress progress;	/* out */ +	/* pad to 1k */ +	__u64 unused[(1024-32-sizeof(struct btrfs_scrub_progress))/8]; +}; + +#define BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_ALWAYS	0 +#define BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID	1 +struct btrfs_ioctl_dev_replace_start_params { +	__u64 srcdevid;	/* in, if 0, use srcdev_name instead */ +	__u64 cont_reading_from_srcdev_mode;	/* in, see #define +						 * above */ +	__u8 srcdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1];	/* in */ +	__u8 tgtdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1];	/* in */ +}; + +#define BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED	0 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED		1 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED		2 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED		3 +#define BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED		4 +struct btrfs_ioctl_dev_replace_status_params { +	__u64 replace_state;	/* out, see #define above */ +	__u64 progress_1000;	/* out, 0 <= x <= 1000 */ +	__u64 time_started;	/* out, seconds since 1-Jan-1970 */ +	__u64 time_stopped;	/* out, seconds since 1-Jan-1970 */ +	__u64 num_write_errors;	/* out */ +	__u64 num_uncorrectable_read_errors;	/* out */ +}; + +#define BTRFS_IOCTL_DEV_REPLACE_CMD_START			0 +#define BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS			1 +#define BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL			2 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR			0 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED		1 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED		2 +struct btrfs_ioctl_dev_replace_args { +	__u64 cmd;	/* in */ +	__u64 result;	/* out */ + +	union { +		struct btrfs_ioctl_dev_replace_start_params start; +		struct btrfs_ioctl_dev_replace_status_params status; +	};	/* in/out */ + +	__u64 spare[64]; +}; + +struct btrfs_ioctl_dev_info_args { +	__u64 devid;				/* in/out */ +	__u8 uuid[BTRFS_UUID_SIZE];		/* in/out */ +	__u64 bytes_used;			/* out */ +	__u64 total_bytes;			/* out */ +	__u64 unused[379];			/* pad to 4k */ +	__u8 path[BTRFS_DEVICE_PATH_NAME_MAX];	/* out */ +}; + +struct btrfs_ioctl_fs_info_args { +	__u64 max_id;				/* out */ +	__u64 num_devices;			/* out */ +	__u8 fsid[BTRFS_FSID_SIZE];		/* out */ +	__u64 reserved[124];			/* pad to 1k */ +}; + +/* balance control ioctl modes */ +#define BTRFS_BALANCE_CTL_PAUSE		1 +#define BTRFS_BALANCE_CTL_CANCEL	2 + +/* + * this is packed, because it should be exactly the same as its disk + * byte order counterpart (struct btrfs_disk_balance_args) + */ +struct btrfs_balance_args { +	__u64 profiles; +	__u64 usage; +	__u64 devid; +	__u64 pstart; +	__u64 pend; +	__u64 vstart; +	__u64 vend; + +	__u64 target; + +	__u64 flags; + +	__u64 unused[8]; +} __attribute__ ((__packed__)); + +/* report balance progress to userspace */ +struct btrfs_balance_progress { +	__u64 expected;		/* estimated # of chunks that will be +				 * relocated to fulfill the request */ +	__u64 considered;	/* # of chunks we have considered so far */ +	__u64 completed;	/* # of chunks relocated so far */ +}; + +#define BTRFS_BALANCE_STATE_RUNNING	(1ULL << 0) +#define BTRFS_BALANCE_STATE_PAUSE_REQ	(1ULL << 1) +#define BTRFS_BALANCE_STATE_CANCEL_REQ	(1ULL << 2) + +struct btrfs_ioctl_balance_args { +	__u64 flags;				/* in/out */ +	__u64 state;				/* out */ + +	struct btrfs_balance_args data;		/* in/out */ +	struct btrfs_balance_args meta;		/* in/out */ +	struct btrfs_balance_args sys;		/* in/out */ + +	struct btrfs_balance_progress stat;	/* out */ + +	__u64 unused[72];			/* pad to 1k */ +}; + +#define BTRFS_INO_LOOKUP_PATH_MAX 4080 +struct btrfs_ioctl_ino_lookup_args { +	__u64 treeid; +	__u64 objectid; +	char name[BTRFS_INO_LOOKUP_PATH_MAX]; +}; + +struct btrfs_ioctl_search_key { +	/* which root are we searching.  0 is the tree of tree roots */ +	__u64 tree_id; + +	/* keys returned will be >= min and <= max */ +	__u64 min_objectid; +	__u64 max_objectid; + +	/* keys returned will be >= min and <= max */ +	__u64 min_offset; +	__u64 max_offset; + +	/* max and min transids to search for */ +	__u64 min_transid; +	__u64 max_transid; + +	/* keys returned will be >= min and <= max */ +	__u32 min_type; +	__u32 max_type; + +	/* +	 * how many items did userland ask for, and how many are we +	 * returning +	 */ +	__u32 nr_items; + +	/* align to 64 bits */ +	__u32 unused; + +	/* some extra for later */ +	__u64 unused1; +	__u64 unused2; +	__u64 unused3; +	__u64 unused4; +}; + +struct btrfs_ioctl_search_header { +	__u64 transid; +	__u64 objectid; +	__u64 offset; +	__u32 type; +	__u32 len; +}; + +#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key)) +/* + * the buf is an array of search headers where + * each header is followed by the actual item + * the type field is expanded to 32 bits for alignment + */ +struct btrfs_ioctl_search_args { +	struct btrfs_ioctl_search_key key; +	char buf[BTRFS_SEARCH_ARGS_BUFSIZE]; +}; + +struct btrfs_ioctl_clone_range_args { +  __s64 src_fd; +  __u64 src_offset, src_length; +  __u64 dest_offset; +}; + +/* flags for the defrag range ioctl */ +#define BTRFS_DEFRAG_RANGE_COMPRESS 1 +#define BTRFS_DEFRAG_RANGE_START_IO 2 + +struct btrfs_ioctl_space_info { +	__u64 flags; +	__u64 total_bytes; +	__u64 used_bytes; +}; + +struct btrfs_ioctl_space_args { +	__u64 space_slots; +	__u64 total_spaces; +	struct btrfs_ioctl_space_info spaces[0]; +}; + +struct btrfs_data_container { +	__u32	bytes_left;	/* out -- bytes not needed to deliver output */ +	__u32	bytes_missing;	/* out -- additional bytes needed for result */ +	__u32	elem_cnt;	/* out */ +	__u32	elem_missed;	/* out */ +	__u64	val[0];		/* out */ +}; + +struct btrfs_ioctl_ino_path_args { +	__u64				inum;		/* in */ +	__u64				size;		/* in */ +	__u64				reserved[4]; +	/* struct btrfs_data_container	*fspath;	   out */ +	__u64				fspath;		/* out */ +}; + +struct btrfs_ioctl_logical_ino_args { +	__u64				logical;	/* in */ +	__u64				size;		/* in */ +	__u64				reserved[4]; +	/* struct btrfs_data_container	*inodes;	out   */ +	__u64				inodes; +}; + +enum btrfs_dev_stat_values { +	/* disk I/O failure stats */ +	BTRFS_DEV_STAT_WRITE_ERRS, /* EIO or EREMOTEIO from lower layers */ +	BTRFS_DEV_STAT_READ_ERRS, /* EIO or EREMOTEIO from lower layers */ +	BTRFS_DEV_STAT_FLUSH_ERRS, /* EIO or EREMOTEIO from lower layers */ + +	/* stats for indirect indications for I/O failures */ +	BTRFS_DEV_STAT_CORRUPTION_ERRS, /* checksum error, bytenr error or +					 * contents is illegal: this is an +					 * indication that the block was damaged +					 * during read or write, or written to +					 * wrong location or read from wrong +					 * location */ +	BTRFS_DEV_STAT_GENERATION_ERRS, /* an indication that blocks have not +					 * been written */ + +	BTRFS_DEV_STAT_VALUES_MAX +}; + +/* Reset statistics after reading; needs SYS_ADMIN capability */ +#define	BTRFS_DEV_STATS_RESET		(1ULL << 0) + +struct btrfs_ioctl_get_dev_stats { +	__u64 devid;				/* in */ +	__u64 nr_items;				/* in/out */ +	__u64 flags;				/* in/out */ + +	/* out values: */ +	__u64 values[BTRFS_DEV_STAT_VALUES_MAX]; + +	__u64 unused[128 - 2 - BTRFS_DEV_STAT_VALUES_MAX]; /* pad to 1k */ +}; + +#define BTRFS_QUOTA_CTL_ENABLE	1 +#define BTRFS_QUOTA_CTL_DISABLE	2 +#define BTRFS_QUOTA_CTL_RESCAN	3 +struct btrfs_ioctl_quota_ctl_args { +	__u64 cmd; +	__u64 status; +}; + +struct btrfs_ioctl_qgroup_assign_args { +	__u64 assign; +	__u64 src; +	__u64 dst; +}; + +struct btrfs_ioctl_qgroup_create_args { +	__u64 create; +	__u64 qgroupid; +}; +struct btrfs_ioctl_timespec { +	__u64 sec; +	__u32 nsec; +}; + +struct btrfs_ioctl_received_subvol_args { +	char	uuid[BTRFS_UUID_SIZE];	/* in */ +	__u64	stransid;		/* in */ +	__u64	rtransid;		/* out */ +	struct btrfs_ioctl_timespec stime; /* in */ +	struct btrfs_ioctl_timespec rtime; /* out */ +	__u64	flags;			/* in */ +	__u64	reserved[16];		/* in */ +}; + +/* + * Caller doesn't want file data in the send stream, even if the + * search of clone sources doesn't find an extent. UPDATE_EXTENT + * commands will be sent instead of WRITE commands. + */ +#define BTRFS_SEND_FLAG_NO_FILE_DATA     0x1 + +struct btrfs_ioctl_send_args { +	__s64 send_fd;			/* in */ +	__u64 clone_sources_count;	/* in */ +	__u64 __user *clone_sources;	/* in */ +	__u64 parent_root;		/* in */ +	__u64 flags;			/* in */ +	__u64 reserved[4];		/* in */ +}; + +#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \ +				   struct btrfs_ioctl_vol_args) +/* trans start and trans end are dangerous, and only for + * use by applications that know how to avoid the + * resulting deadlocks + */ +#define BTRFS_IOC_TRANS_START  _IO(BTRFS_IOCTL_MAGIC, 6) +#define BTRFS_IOC_TRANS_END    _IO(BTRFS_IOCTL_MAGIC, 7) +#define BTRFS_IOC_SYNC         _IO(BTRFS_IOCTL_MAGIC, 8) + +#define BTRFS_IOC_CLONE        _IOW(BTRFS_IOCTL_MAGIC, 9, int) +#define BTRFS_IOC_ADD_DEV _IOW(BTRFS_IOCTL_MAGIC, 10, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_RM_DEV _IOW(BTRFS_IOCTL_MAGIC, 11, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \ +				   struct btrfs_ioctl_vol_args) + +#define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \ +				  struct btrfs_ioctl_clone_range_args) + +#define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, \ +				   struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, \ +				struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_DEFRAG_RANGE _IOW(BTRFS_IOCTL_MAGIC, 16, \ +				struct btrfs_ioctl_defrag_range_args) +#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \ +				   struct btrfs_ioctl_search_args) +#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \ +				   struct btrfs_ioctl_ino_lookup_args) +#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) +#define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ +				    struct btrfs_ioctl_space_args) +#define BTRFS_IOC_START_SYNC _IOR(BTRFS_IOCTL_MAGIC, 24, __u64) +#define BTRFS_IOC_WAIT_SYNC  _IOW(BTRFS_IOCTL_MAGIC, 22, __u64) +#define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \ +				   struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_SUBVOL_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 24, \ +				   struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_SUBVOL_GETFLAGS _IOR(BTRFS_IOCTL_MAGIC, 25, __u64) +#define BTRFS_IOC_SUBVOL_SETFLAGS _IOW(BTRFS_IOCTL_MAGIC, 26, __u64) +#define BTRFS_IOC_SCRUB _IOWR(BTRFS_IOCTL_MAGIC, 27, \ +			      struct btrfs_ioctl_scrub_args) +#define BTRFS_IOC_SCRUB_CANCEL _IO(BTRFS_IOCTL_MAGIC, 28) +#define BTRFS_IOC_SCRUB_PROGRESS _IOWR(BTRFS_IOCTL_MAGIC, 29, \ +				       struct btrfs_ioctl_scrub_args) +#define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \ +				 struct btrfs_ioctl_dev_info_args) +#define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \ +			       struct btrfs_ioctl_fs_info_args) +#define BTRFS_IOC_BALANCE_V2 _IOWR(BTRFS_IOCTL_MAGIC, 32, \ +				   struct btrfs_ioctl_balance_args) +#define BTRFS_IOC_BALANCE_CTL _IOW(BTRFS_IOCTL_MAGIC, 33, int) +#define BTRFS_IOC_BALANCE_PROGRESS _IOR(BTRFS_IOCTL_MAGIC, 34, \ +					struct btrfs_ioctl_balance_args) +#define BTRFS_IOC_INO_PATHS _IOWR(BTRFS_IOCTL_MAGIC, 35, \ +					struct btrfs_ioctl_ino_path_args) +#define BTRFS_IOC_LOGICAL_INO _IOWR(BTRFS_IOCTL_MAGIC, 36, \ +					struct btrfs_ioctl_ino_path_args) +#define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, \ +				struct btrfs_ioctl_received_subvol_args) +#define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args) +#define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \ +				     struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, \ +			       struct btrfs_ioctl_quota_ctl_args) +#define BTRFS_IOC_QGROUP_ASSIGN _IOW(BTRFS_IOCTL_MAGIC, 41, \ +			       struct btrfs_ioctl_qgroup_assign_args) +#define BTRFS_IOC_QGROUP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 42, \ +			       struct btrfs_ioctl_qgroup_create_args) +#define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, \ +			       struct btrfs_ioctl_qgroup_limit_args) +#define BTRFS_IOC_GET_FSLABEL _IOR(BTRFS_IOCTL_MAGIC, 49, \ +				   char[BTRFS_LABEL_SIZE]) +#define BTRFS_IOC_SET_FSLABEL _IOW(BTRFS_IOCTL_MAGIC, 50, \ +				   char[BTRFS_LABEL_SIZE]) +#define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ +				      struct btrfs_ioctl_get_dev_stats) +#define BTRFS_IOC_DEV_REPLACE _IOWR(BTRFS_IOCTL_MAGIC, 53, \ +				    struct btrfs_ioctl_dev_replace_args) + +#endif /* _UAPI_LINUX_BTRFS_H */ diff --git a/include/uapi/linux/can/gw.h b/include/uapi/linux/can/gw.h index 8e1db18c3cb..ae07bec74f4 100644 --- a/include/uapi/linux/can/gw.h +++ b/include/uapi/linux/can/gw.h @@ -44,6 +44,7 @@ enum {  	CGW_SRC_IF,	/* ifindex of source network interface */  	CGW_DST_IF,	/* ifindex of destination network interface */  	CGW_FILTER,	/* specify struct can_filter on source CAN device */ +	CGW_DELETED,	/* number of deleted CAN frames (see max_hops param) */  	__CGW_MAX  }; @@ -51,6 +52,7 @@ enum {  #define CGW_FLAGS_CAN_ECHO 0x01  #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 +#define CGW_FLAGS_CAN_IIF_TX_OK 0x04  #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ diff --git a/include/uapi/linux/cdrom.h b/include/uapi/linux/cdrom.h index 898b866b300..bd17ad5aa06 100644 --- a/include/uapi/linux/cdrom.h +++ b/include/uapi/linux/cdrom.h @@ -908,5 +908,39 @@ struct mode_page_header {  	__be16 desc_length;  }; +/* removable medium feature descriptor */ +struct rm_feature_desc { +	__be16 feature_code; +#if defined(__BIG_ENDIAN_BITFIELD) +	__u8 reserved1:2; +	__u8 feature_version:4; +	__u8 persistent:1; +	__u8 curr:1; +#elif defined(__LITTLE_ENDIAN_BITFIELD) +	__u8 curr:1; +	__u8 persistent:1; +	__u8 feature_version:4; +	__u8 reserved1:2; +#endif +	__u8 add_len; +#if defined(__BIG_ENDIAN_BITFIELD) +	__u8 mech_type:3; +	__u8 load:1; +	__u8 eject:1; +	__u8 pvnt_jmpr:1; +	__u8 dbml:1; +	__u8 lock:1; +#elif defined(__LITTLE_ENDIAN_BITFIELD) +	__u8 lock:1; +	__u8 dbml:1; +	__u8 pvnt_jmpr:1; +	__u8 eject:1; +	__u8 load:1; +	__u8 mech_type:3; +#endif +	__u8 reserved2; +	__u8 reserved3; +	__u8 reserved4; +};  #endif /* _UAPI_LINUX_CDROM_H */ diff --git a/include/uapi/linux/connector.h b/include/uapi/linux/connector.h index 8761a0349c7..4cb283505e4 100644 --- a/include/uapi/linux/connector.h +++ b/include/uapi/linux/connector.h @@ -44,8 +44,11 @@  #define CN_VAL_DRBD			0x1  #define CN_KVP_IDX			0x9	/* HyperV KVP */  #define CN_KVP_VAL			0x1	/* queries from the kernel */ +#define CN_VSS_IDX			0xA     /* HyperV VSS */ +#define CN_VSS_VAL			0x1     /* queries from the kernel */ -#define CN_NETLINK_USERS		10	/* Highest index + 1 */ + +#define CN_NETLINK_USERS		11	/* Highest index + 1 */  /*   * Maximum connector's message size. diff --git a/include/uapi/linux/dm-ioctl.h b/include/uapi/linux/dm-ioctl.h index 539b179b349..7e75b6fd8d4 100644 --- a/include/uapi/linux/dm-ioctl.h +++ b/include/uapi/linux/dm-ioctl.h @@ -267,9 +267,9 @@ enum {  #define DM_DEV_SET_GEOMETRY	_IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)  #define DM_VERSION_MAJOR	4 -#define DM_VERSION_MINOR	23 -#define DM_VERSION_PATCHLEVEL	1 -#define DM_VERSION_EXTRA	"-ioctl (2012-12-18)" +#define DM_VERSION_MINOR	24 +#define DM_VERSION_PATCHLEVEL	0 +#define DM_VERSION_EXTRA	"-ioctl (2013-01-15)"  /* Status bits */  #define DM_READONLY_FLAG	(1 << 0) /* In/Out */ @@ -336,4 +336,9 @@ enum {   */  #define DM_SECURE_DATA_FLAG		(1 << 15) /* In */ +/* + * If set, a message generated output data. + */ +#define DM_DATA_OUT_FLAG		(1 << 16) /* Out */ +  #endif				/* _LINUX_DM_IOCTL_H */ diff --git a/include/uapi/linux/dvb/frontend.h b/include/uapi/linux/dvb/frontend.h index c12d452cb40..c56d77c496a 100644 --- a/include/uapi/linux/dvb/frontend.h +++ b/include/uapi/linux/dvb/frontend.h @@ -365,7 +365,17 @@ struct dvb_frontend_event {  #define DTV_INTERLEAVING			60  #define DTV_LNA					61 -#define DTV_MAX_COMMAND				DTV_LNA +/* Quality parameters */ +#define DTV_STAT_SIGNAL_STRENGTH	62 +#define DTV_STAT_CNR			63 +#define DTV_STAT_PRE_ERROR_BIT_COUNT	64 +#define DTV_STAT_PRE_TOTAL_BIT_COUNT	65 +#define DTV_STAT_POST_ERROR_BIT_COUNT	66 +#define DTV_STAT_POST_TOTAL_BIT_COUNT	67 +#define DTV_STAT_ERROR_BLOCK_COUNT	68 +#define DTV_STAT_TOTAL_BLOCK_COUNT	69 + +#define DTV_MAX_COMMAND		DTV_STAT_TOTAL_BLOCK_COUNT  typedef enum fe_pilot {  	PILOT_ON, @@ -452,11 +462,78 @@ struct dtv_cmds_h {  	__u32	reserved:30;	/* Align */  }; +/** + * Scale types for the quality parameters. + * @FE_SCALE_NOT_AVAILABLE: That QoS measure is not available. That + *			    could indicate a temporary or a permanent + *			    condition. + * @FE_SCALE_DECIBEL: The scale is measured in 0.0001 dB steps, typically + *		  used on signal measures. + * @FE_SCALE_RELATIVE: The scale is a relative percentual measure, + *			ranging from 0 (0%) to 0xffff (100%). + * @FE_SCALE_COUNTER: The scale counts the occurrence of an event, like + *			bit error, block error, lapsed time. + */ +enum fecap_scale_params { +	FE_SCALE_NOT_AVAILABLE = 0, +	FE_SCALE_DECIBEL, +	FE_SCALE_RELATIVE, +	FE_SCALE_COUNTER +}; + +/** + * struct dtv_stats - Used for reading a DTV status property + * + * @value:	value of the measure. Should range from 0 to 0xffff; + * @scale:	Filled with enum fecap_scale_params - the scale + *		in usage for that parameter + * + * For most delivery systems, this will return a single value for each + * parameter. + * It should be noticed, however, that new OFDM delivery systems like + * ISDB can use different modulation types for each group of carriers. + * On such standards, up to 8 groups of statistics can be provided, one + * for each carrier group (called "layer" on ISDB). + * In order to be consistent with other delivery systems, the first + * value refers to the entire set of carriers ("global"). + * dtv_status:scale should use the value FE_SCALE_NOT_AVAILABLE when + * the value for the entire group of carriers or from one specific layer + * is not provided by the hardware. + * st.len should be filled with the latest filled status + 1. + * + * In other words, for ISDB, those values should be filled like: + *	u.st.stat.svalue[0] = global statistics; + *	u.st.stat.scale[0] = FE_SCALE_DECIBELS; + *	u.st.stat.value[1] = layer A statistics; + *	u.st.stat.scale[1] = FE_SCALE_NOT_AVAILABLE (if not available); + *	u.st.stat.svalue[2] = layer B statistics; + *	u.st.stat.scale[2] = FE_SCALE_DECIBELS; + *	u.st.stat.svalue[3] = layer C statistics; + *	u.st.stat.scale[3] = FE_SCALE_DECIBELS; + *	u.st.len = 4; + */ +struct dtv_stats { +	__u8 scale;	/* enum fecap_scale_params type */ +	union { +		__u64 uvalue;	/* for counters and relative scales */ +		__s64 svalue;	/* for 0.0001 dB measures */ +	}; +} __attribute__ ((packed)); + + +#define MAX_DTV_STATS   4 + +struct dtv_fe_stats { +	__u8 len; +	struct dtv_stats stat[MAX_DTV_STATS]; +} __attribute__ ((packed)); +  struct dtv_property {  	__u32 cmd;  	__u32 reserved[3];  	union {  		__u32 data; +		struct dtv_fe_stats st;  		struct {  			__u8 data[32];  			__u32 len; diff --git a/include/uapi/linux/dvb/version.h b/include/uapi/linux/dvb/version.h index 827cce7e33e..e53e2ad4444 100644 --- a/include/uapi/linux/dvb/version.h +++ b/include/uapi/linux/dvb/version.h @@ -24,6 +24,6 @@  #define _DVBVERSION_H_  #define DVB_API_VERSION 5 -#define DVB_API_VERSION_MINOR 9 +#define DVB_API_VERSION_MINOR 10  #endif /*_DVBVERSION_H_*/ diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h index 126a8175e3e..8072d352b98 100644 --- a/include/uapi/linux/elf.h +++ b/include/uapi/linux/elf.h @@ -49,14 +49,14 @@ typedef __s64	Elf64_Sxword;   *   * Specifications are available in:   * - * - Sun microsystems: Linker and Libraries. - *   Part No: 817-1984-17, September 2008. - *   URL: http://docs.sun.com/app/docs/doc/817-1984 + * - Oracle: Linker and Libraries. + *   Part No: 817–1984–19, August 2011. + *   http://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf   *   * - System V ABI AMD64 Architecture Processor Supplement - *   Draft Version 0.99., - *   May 11, 2009. - *   URL: http://www.x86-64.org/ + *   Draft Version 0.99.4, + *   January 13, 2010. + *   http://www.cs.washington.edu/education/courses/cse351/12wi/supp-docs/abi.pdf   */  #define PN_XNUM 0xffff @@ -395,6 +395,8 @@ typedef struct elf64_shdr {  #define NT_ARM_TLS	0x401		/* ARM TLS register */  #define NT_ARM_HW_BREAK	0x402		/* ARM hardware breakpoint registers */  #define NT_ARM_HW_WATCH	0x403		/* ARM hardware watchpoint registers */ +#define NT_METAG_CBUF	0x500		/* Metag catch buffer registers */ +#define NT_METAG_RPIPE	0x501		/* Metag read pipeline state */  /* Note header in a PT_NOTE section */ diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 780d4c6093e..c7fc1e6517c 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -86,6 +86,9 @@ struct inodes_stat_t {  #define MS_KERNMOUNT	(1<<22) /* this is a kern_mount call */  #define MS_I_VERSION	(1<<23) /* Update inode I_version field */  #define MS_STRICTATIME	(1<<24) /* Always perform atime updates */ + +/* These sb flags are internal to the kernel */ +#define MS_SNAP_STABLE	(1<<27) /* Snapshot pages during writeback, if needed */  #define MS_NOSEC	(1<<28)  #define MS_BORN		(1<<29)  #define MS_ACTIVE	(1<<30) diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h index d8c713e148e..706d035fa74 100644 --- a/include/uapi/linux/fuse.h +++ b/include/uapi/linux/fuse.h @@ -1,9 +1,35 @@  /* -    FUSE: Filesystem in Userspace +    This file defines the kernel interface of FUSE      Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>      This program can be distributed under the terms of the GNU GPL.      See the file COPYING. + +    This -- and only this -- header file may also be distributed under +    the terms of the BSD Licence as follows: + +    Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. + +    Redistribution and use in source and binary forms, with or without +    modification, are permitted provided that the following conditions +    are met: +    1. Redistributions of source code must retain the above copyright +       notice, this list of conditions and the following disclaimer. +    2. Redistributions in binary form must reproduce the above copyright +       notice, this list of conditions and the following disclaimer in the +       documentation and/or other materials provided with the distribution. + +    THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +    ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +    SUCH DAMAGE.  */  /* @@ -60,12 +86,20 @@   *   * 7.20   *  - add FUSE_AUTO_INVAL_DATA + * + * 7.21 + *  - add FUSE_READDIRPLUS + *  - send the requested events in POLL request   */  #ifndef _LINUX_FUSE_H  #define _LINUX_FUSE_H +#ifdef __KERNEL__  #include <linux/types.h> +#else +#include <stdint.h> +#endif  /*   * Version negotiation: @@ -91,7 +125,7 @@  #define FUSE_KERNEL_VERSION 7  /** Minor version number of this interface */ -#define FUSE_KERNEL_MINOR_VERSION 20 +#define FUSE_KERNEL_MINOR_VERSION 21  /** The node ID of the root inode */  #define FUSE_ROOT_ID 1 @@ -100,42 +134,42 @@     userspace works under 64bit kernels */  struct fuse_attr { -	__u64	ino; -	__u64	size; -	__u64	blocks; -	__u64	atime; -	__u64	mtime; -	__u64	ctime; -	__u32	atimensec; -	__u32	mtimensec; -	__u32	ctimensec; -	__u32	mode; -	__u32	nlink; -	__u32	uid; -	__u32	gid; -	__u32	rdev; -	__u32	blksize; -	__u32	padding; +	uint64_t	ino; +	uint64_t	size; +	uint64_t	blocks; +	uint64_t	atime; +	uint64_t	mtime; +	uint64_t	ctime; +	uint32_t	atimensec; +	uint32_t	mtimensec; +	uint32_t	ctimensec; +	uint32_t	mode; +	uint32_t	nlink; +	uint32_t	uid; +	uint32_t	gid; +	uint32_t	rdev; +	uint32_t	blksize; +	uint32_t	padding;  };  struct fuse_kstatfs { -	__u64	blocks; -	__u64	bfree; -	__u64	bavail; -	__u64	files; -	__u64	ffree; -	__u32	bsize; -	__u32	namelen; -	__u32	frsize; -	__u32	padding; -	__u32	spare[6]; +	uint64_t	blocks; +	uint64_t	bfree; +	uint64_t	bavail; +	uint64_t	files; +	uint64_t	ffree; +	uint32_t	bsize; +	uint32_t	namelen; +	uint32_t	frsize; +	uint32_t	padding; +	uint32_t	spare[6];  };  struct fuse_file_lock { -	__u64	start; -	__u64	end; -	__u32	type; -	__u32	pid; /* tgid */ +	uint64_t	start; +	uint64_t	end; +	uint32_t	type; +	uint32_t	pid; /* tgid */  };  /** @@ -179,6 +213,8 @@ struct fuse_file_lock {   * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks   * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories   * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages + * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one) + * FUSE_READDIRPLUS_AUTO: adaptive readdirplus   */  #define FUSE_ASYNC_READ		(1 << 0)  #define FUSE_POSIX_LOCKS	(1 << 1) @@ -193,6 +229,8 @@ struct fuse_file_lock {  #define FUSE_FLOCK_LOCKS	(1 << 10)  #define FUSE_HAS_IOCTL_DIR	(1 << 11)  #define FUSE_AUTO_INVAL_DATA	(1 << 12) +#define FUSE_DO_READDIRPLUS	(1 << 13) +#define FUSE_READDIRPLUS_AUTO	(1 << 14)  /**   * CUSE INIT request/reply flags @@ -299,6 +337,7 @@ enum fuse_opcode {  	FUSE_NOTIFY_REPLY  = 41,  	FUSE_BATCH_FORGET  = 42,  	FUSE_FALLOCATE     = 43, +	FUSE_READDIRPLUS   = 44,  	/* CUSE specific operations */  	CUSE_INIT          = 4096, @@ -320,143 +359,143 @@ enum fuse_notify_code {  #define FUSE_COMPAT_ENTRY_OUT_SIZE 120  struct fuse_entry_out { -	__u64	nodeid;		/* Inode ID */ -	__u64	generation;	/* Inode generation: nodeid:gen must -				   be unique for the fs's lifetime */ -	__u64	entry_valid;	/* Cache timeout for the name */ -	__u64	attr_valid;	/* Cache timeout for the attributes */ -	__u32	entry_valid_nsec; -	__u32	attr_valid_nsec; +	uint64_t	nodeid;		/* Inode ID */ +	uint64_t	generation;	/* Inode generation: nodeid:gen must +					   be unique for the fs's lifetime */ +	uint64_t	entry_valid;	/* Cache timeout for the name */ +	uint64_t	attr_valid;	/* Cache timeout for the attributes */ +	uint32_t	entry_valid_nsec; +	uint32_t	attr_valid_nsec;  	struct fuse_attr attr;  };  struct fuse_forget_in { -	__u64	nlookup; +	uint64_t	nlookup;  };  struct fuse_forget_one { -	__u64	nodeid; -	__u64	nlookup; +	uint64_t	nodeid; +	uint64_t	nlookup;  };  struct fuse_batch_forget_in { -	__u32	count; -	__u32	dummy; +	uint32_t	count; +	uint32_t	dummy;  };  struct fuse_getattr_in { -	__u32	getattr_flags; -	__u32	dummy; -	__u64	fh; +	uint32_t	getattr_flags; +	uint32_t	dummy; +	uint64_t	fh;  };  #define FUSE_COMPAT_ATTR_OUT_SIZE 96  struct fuse_attr_out { -	__u64	attr_valid;	/* Cache timeout for the attributes */ -	__u32	attr_valid_nsec; -	__u32	dummy; +	uint64_t	attr_valid;	/* Cache timeout for the attributes */ +	uint32_t	attr_valid_nsec; +	uint32_t	dummy;  	struct fuse_attr attr;  };  #define FUSE_COMPAT_MKNOD_IN_SIZE 8  struct fuse_mknod_in { -	__u32	mode; -	__u32	rdev; -	__u32	umask; -	__u32	padding; +	uint32_t	mode; +	uint32_t	rdev; +	uint32_t	umask; +	uint32_t	padding;  };  struct fuse_mkdir_in { -	__u32	mode; -	__u32	umask; +	uint32_t	mode; +	uint32_t	umask;  };  struct fuse_rename_in { -	__u64	newdir; +	uint64_t	newdir;  };  struct fuse_link_in { -	__u64	oldnodeid; +	uint64_t	oldnodeid;  };  struct fuse_setattr_in { -	__u32	valid; -	__u32	padding; -	__u64	fh; -	__u64	size; -	__u64	lock_owner; -	__u64	atime; -	__u64	mtime; -	__u64	unused2; -	__u32	atimensec; -	__u32	mtimensec; -	__u32	unused3; -	__u32	mode; -	__u32	unused4; -	__u32	uid; -	__u32	gid; -	__u32	unused5; +	uint32_t	valid; +	uint32_t	padding; +	uint64_t	fh; +	uint64_t	size; +	uint64_t	lock_owner; +	uint64_t	atime; +	uint64_t	mtime; +	uint64_t	unused2; +	uint32_t	atimensec; +	uint32_t	mtimensec; +	uint32_t	unused3; +	uint32_t	mode; +	uint32_t	unused4; +	uint32_t	uid; +	uint32_t	gid; +	uint32_t	unused5;  };  struct fuse_open_in { -	__u32	flags; -	__u32	unused; +	uint32_t	flags; +	uint32_t	unused;  };  struct fuse_create_in { -	__u32	flags; -	__u32	mode; -	__u32	umask; -	__u32	padding; +	uint32_t	flags; +	uint32_t	mode; +	uint32_t	umask; +	uint32_t	padding;  };  struct fuse_open_out { -	__u64	fh; -	__u32	open_flags; -	__u32	padding; +	uint64_t	fh; +	uint32_t	open_flags; +	uint32_t	padding;  };  struct fuse_release_in { -	__u64	fh; -	__u32	flags; -	__u32	release_flags; -	__u64	lock_owner; +	uint64_t	fh; +	uint32_t	flags; +	uint32_t	release_flags; +	uint64_t	lock_owner;  };  struct fuse_flush_in { -	__u64	fh; -	__u32	unused; -	__u32	padding; -	__u64	lock_owner; +	uint64_t	fh; +	uint32_t	unused; +	uint32_t	padding; +	uint64_t	lock_owner;  };  struct fuse_read_in { -	__u64	fh; -	__u64	offset; -	__u32	size; -	__u32	read_flags; -	__u64	lock_owner; -	__u32	flags; -	__u32	padding; +	uint64_t	fh; +	uint64_t	offset; +	uint32_t	size; +	uint32_t	read_flags; +	uint64_t	lock_owner; +	uint32_t	flags; +	uint32_t	padding;  };  #define FUSE_COMPAT_WRITE_IN_SIZE 24  struct fuse_write_in { -	__u64	fh; -	__u64	offset; -	__u32	size; -	__u32	write_flags; -	__u64	lock_owner; -	__u32	flags; -	__u32	padding; +	uint64_t	fh; +	uint64_t	offset; +	uint32_t	size; +	uint32_t	write_flags; +	uint64_t	lock_owner; +	uint32_t	flags; +	uint32_t	padding;  };  struct fuse_write_out { -	__u32	size; -	__u32	padding; +	uint32_t	size; +	uint32_t	padding;  };  #define FUSE_COMPAT_STATFS_SIZE 48 @@ -466,32 +505,32 @@ struct fuse_statfs_out {  };  struct fuse_fsync_in { -	__u64	fh; -	__u32	fsync_flags; -	__u32	padding; +	uint64_t	fh; +	uint32_t	fsync_flags; +	uint32_t	padding;  };  struct fuse_setxattr_in { -	__u32	size; -	__u32	flags; +	uint32_t	size; +	uint32_t	flags;  };  struct fuse_getxattr_in { -	__u32	size; -	__u32	padding; +	uint32_t	size; +	uint32_t	padding;  };  struct fuse_getxattr_out { -	__u32	size; -	__u32	padding; +	uint32_t	size; +	uint32_t	padding;  };  struct fuse_lk_in { -	__u64	fh; -	__u64	owner; +	uint64_t	fh; +	uint64_t	owner;  	struct fuse_file_lock lk; -	__u32	lk_flags; -	__u32	padding; +	uint32_t	lk_flags; +	uint32_t	padding;  };  struct fuse_lk_out { @@ -499,179 +538,190 @@ struct fuse_lk_out {  };  struct fuse_access_in { -	__u32	mask; -	__u32	padding; +	uint32_t	mask; +	uint32_t	padding;  };  struct fuse_init_in { -	__u32	major; -	__u32	minor; -	__u32	max_readahead; -	__u32	flags; +	uint32_t	major; +	uint32_t	minor; +	uint32_t	max_readahead; +	uint32_t	flags;  };  struct fuse_init_out { -	__u32	major; -	__u32	minor; -	__u32	max_readahead; -	__u32	flags; -	__u16   max_background; -	__u16   congestion_threshold; -	__u32	max_write; +	uint32_t	major; +	uint32_t	minor; +	uint32_t	max_readahead; +	uint32_t	flags; +	uint16_t	max_background; +	uint16_t	congestion_threshold; +	uint32_t	max_write;  };  #define CUSE_INIT_INFO_MAX 4096  struct cuse_init_in { -	__u32	major; -	__u32	minor; -	__u32	unused; -	__u32	flags; +	uint32_t	major; +	uint32_t	minor; +	uint32_t	unused; +	uint32_t	flags;  };  struct cuse_init_out { -	__u32	major; -	__u32	minor; -	__u32	unused; -	__u32	flags; -	__u32	max_read; -	__u32	max_write; -	__u32	dev_major;		/* chardev major */ -	__u32	dev_minor;		/* chardev minor */ -	__u32	spare[10]; +	uint32_t	major; +	uint32_t	minor; +	uint32_t	unused; +	uint32_t	flags; +	uint32_t	max_read; +	uint32_t	max_write; +	uint32_t	dev_major;		/* chardev major */ +	uint32_t	dev_minor;		/* chardev minor */ +	uint32_t	spare[10];  };  struct fuse_interrupt_in { -	__u64	unique; +	uint64_t	unique;  };  struct fuse_bmap_in { -	__u64	block; -	__u32	blocksize; -	__u32	padding; +	uint64_t	block; +	uint32_t	blocksize; +	uint32_t	padding;  };  struct fuse_bmap_out { -	__u64	block; +	uint64_t	block;  };  struct fuse_ioctl_in { -	__u64	fh; -	__u32	flags; -	__u32	cmd; -	__u64	arg; -	__u32	in_size; -	__u32	out_size; +	uint64_t	fh; +	uint32_t	flags; +	uint32_t	cmd; +	uint64_t	arg; +	uint32_t	in_size; +	uint32_t	out_size;  };  struct fuse_ioctl_iovec { -	__u64	base; -	__u64	len; +	uint64_t	base; +	uint64_t	len;  };  struct fuse_ioctl_out { -	__s32	result; -	__u32	flags; -	__u32	in_iovs; -	__u32	out_iovs; +	int32_t		result; +	uint32_t	flags; +	uint32_t	in_iovs; +	uint32_t	out_iovs;  };  struct fuse_poll_in { -	__u64	fh; -	__u64	kh; -	__u32	flags; -	__u32   padding; +	uint64_t	fh; +	uint64_t	kh; +	uint32_t	flags; +	uint32_t	events;  };  struct fuse_poll_out { -	__u32	revents; -	__u32	padding; +	uint32_t	revents; +	uint32_t	padding;  };  struct fuse_notify_poll_wakeup_out { -	__u64	kh; +	uint64_t	kh;  };  struct fuse_fallocate_in { -	__u64	fh; -	__u64	offset; -	__u64	length; -	__u32	mode; -	__u32	padding; +	uint64_t	fh; +	uint64_t	offset; +	uint64_t	length; +	uint32_t	mode; +	uint32_t	padding;  };  struct fuse_in_header { -	__u32	len; -	__u32	opcode; -	__u64	unique; -	__u64	nodeid; -	__u32	uid; -	__u32	gid; -	__u32	pid; -	__u32	padding; +	uint32_t	len; +	uint32_t	opcode; +	uint64_t	unique; +	uint64_t	nodeid; +	uint32_t	uid; +	uint32_t	gid; +	uint32_t	pid; +	uint32_t	padding;  };  struct fuse_out_header { -	__u32	len; -	__s32	error; -	__u64	unique; +	uint32_t	len; +	int32_t		error; +	uint64_t	unique;  };  struct fuse_dirent { -	__u64	ino; -	__u64	off; -	__u32	namelen; -	__u32	type; +	uint64_t	ino; +	uint64_t	off; +	uint32_t	namelen; +	uint32_t	type;  	char name[];  };  #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) -#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) +#define FUSE_DIRENT_ALIGN(x) \ +	(((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))  #define FUSE_DIRENT_SIZE(d) \  	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) +struct fuse_direntplus { +	struct fuse_entry_out entry_out; +	struct fuse_dirent dirent; +}; + +#define FUSE_NAME_OFFSET_DIRENTPLUS \ +	offsetof(struct fuse_direntplus, dirent.name) +#define FUSE_DIRENTPLUS_SIZE(d) \ +	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen) +  struct fuse_notify_inval_inode_out { -	__u64	ino; -	__s64	off; -	__s64	len; +	uint64_t	ino; +	int64_t		off; +	int64_t		len;  };  struct fuse_notify_inval_entry_out { -	__u64	parent; -	__u32	namelen; -	__u32	padding; +	uint64_t	parent; +	uint32_t	namelen; +	uint32_t	padding;  };  struct fuse_notify_delete_out { -	__u64	parent; -	__u64	child; -	__u32	namelen; -	__u32	padding; +	uint64_t	parent; +	uint64_t	child; +	uint32_t	namelen; +	uint32_t	padding;  };  struct fuse_notify_store_out { -	__u64	nodeid; -	__u64	offset; -	__u32	size; -	__u32	padding; +	uint64_t	nodeid; +	uint64_t	offset; +	uint32_t	size; +	uint32_t	padding;  };  struct fuse_notify_retrieve_out { -	__u64	notify_unique; -	__u64	nodeid; -	__u64	offset; -	__u32	size; -	__u32	padding; +	uint64_t	notify_unique; +	uint64_t	nodeid; +	uint64_t	offset; +	uint32_t	size; +	uint32_t	padding;  };  /* Matches the size of fuse_write_in */  struct fuse_notify_retrieve_in { -	__u64	dummy1; -	__u64	offset; -	__u32	size; -	__u32	dummy2; -	__u64	dummy3; -	__u64	dummy4; +	uint64_t	dummy1; +	uint64_t	offset; +	uint32_t	size; +	uint32_t	dummy2; +	uint64_t	dummy3; +	uint64_t	dummy4;  };  #endif /* _LINUX_FUSE_H */ diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h index 5db297514ae..2d70d79ce2f 100644 --- a/include/uapi/linux/if_bridge.h +++ b/include/uapi/linux/if_bridge.h @@ -108,15 +108,26 @@ struct __fdb_entry {   * [IFLA_AF_SPEC] = {   *     [IFLA_BRIDGE_FLAGS]   *     [IFLA_BRIDGE_MODE] + *     [IFLA_BRIDGE_VLAN_INFO]   * }   */  enum {  	IFLA_BRIDGE_FLAGS,  	IFLA_BRIDGE_MODE, +	IFLA_BRIDGE_VLAN_INFO,  	__IFLA_BRIDGE_MAX,  };  #define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) +#define BRIDGE_VLAN_INFO_MASTER	(1<<0)	/* Operate on Bridge device as well */ +#define BRIDGE_VLAN_INFO_PVID	(1<<1)	/* VLAN is PVID, ingress untagged */ +#define BRIDGE_VLAN_INFO_UNTAGGED	(1<<2)	/* VLAN egresses untagged */ + +struct bridge_vlan_info { +	__u16 flags; +	__u16 vid; +}; +  /* Bridge multicast database attributes   * [MDBA_MDB] = {   *     [MDBA_MDB_ENTRY] = { diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h index 67fb87ca109..798032d0111 100644 --- a/include/uapi/linux/if_ether.h +++ b/include/uapi/linux/if_ether.h @@ -83,6 +83,7 @@  #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_MVRP	0x88F5          /* 802.1Q MVRP                  */  #define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */  #define ETH_P_FCOE	0x8906		/* Fibre Channel over Ethernet  */  #define ETH_P_TDLS	0x890D          /* TDLS */ diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index 60f3b6b9060..c4edfe11f1f 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -142,6 +142,7 @@ enum {  #define IFLA_PROMISCUITY IFLA_PROMISCUITY  	IFLA_NUM_TX_QUEUES,  	IFLA_NUM_RX_QUEUES, +	IFLA_CARRIER,  	__IFLA_MAX  }; diff --git a/include/uapi/linux/if_vlan.h b/include/uapi/linux/if_vlan.h index 0744f8e65d1..7e5e6b39733 100644 --- a/include/uapi/linux/if_vlan.h +++ b/include/uapi/linux/if_vlan.h @@ -34,6 +34,7 @@ enum vlan_flags {  	VLAN_FLAG_REORDER_HDR	= 0x1,  	VLAN_FLAG_GVRP		= 0x2,  	VLAN_FLAG_LOOSE_BINDING	= 0x4, +	VLAN_FLAG_MVRP		= 0x8,  };  enum vlan_name_types { diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h index f79c3721da6..53b1d56a6e7 100644 --- a/include/uapi/linux/in6.h +++ b/include/uapi/linux/in6.h @@ -38,11 +38,6 @@ struct in6_addr {  #define s6_addr32		in6_u.u6_addr32  }; -/* IPv6 Wildcard Address (::) and Loopback Address (::1) defined in RFC2553 - * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined - * in network byte order, not in host byte order as are the IPv4 equivalents - */ -  struct sockaddr_in6 {  	unsigned short int	sin6_family;    /* AF_INET6 */  	__be16			sin6_port;      /* Transport layer port # */ @@ -264,17 +259,10 @@ struct in6_flowlabel_req {  /*   * Multicast Routing: - * see include/linux/mroute6.h. + * see include/uapi/linux/mroute6.h.   * - * MRT6_INIT			200 - * MRT6_DONE			201 - * MRT6_ADD_MIF			202 - * MRT6_DEL_MIF			203 - * MRT6_ADD_MFC			204 - * MRT6_DEL_MFC			205 - * MRT6_VERSION			206 - * MRT6_ASSERT			207 - * MRT6_PIM			208 - * (reserved)			209 + * MRT6_BASE			200 + * ... + * MRT6_MAX   */  #endif /* _UAPI_LINUX_IN6_H */ diff --git a/include/uapi/linux/ipmi.h b/include/uapi/linux/ipmi.h index 33fbc99b381..7b26a62e570 100644 --- a/include/uapi/linux/ipmi.h +++ b/include/uapi/linux/ipmi.h @@ -59,15 +59,7 @@   * if it becomes full and it is queried once a second to see if   * anything is in it.  Incoming commands to the driver will get   * delivered as commands. - * - * This driver provides two main interfaces: one for in-kernel - * applications and another for userland applications.  The - * capabilities are basically the same for both interface, although - * the interfaces are somewhat different.  The stuff in the - * #ifdef __KERNEL__ below is the in-kernel interface.  The userland - * interface is defined later in the file.  */ - - + */  /*   * This is an overlay for all the address types, so it's easy to diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index 5a2991cf025..4bda4cf5b0f 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h @@ -63,6 +63,8 @@ struct ipv6_opt_hdr {  #define ipv6_destopt_hdr ipv6_opt_hdr  #define ipv6_hopopt_hdr  ipv6_opt_hdr +/* Router Alert option values (RFC2711) */ +#define IPV6_OPT_ROUTERALERT_MLD	0x0000	/* MLD(RFC2710) */  /*   *	routing header type 0 (used in cmsghdr struct) diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index e6e5d4b1370..3c56ba3d80c 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -115,6 +115,7 @@ struct kvm_irq_level {  	 * ACPI gsi notion of irq.  	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47..  	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23.. +	 * For ARM: See Documentation/virtual/kvm/api.txt  	 */  	union {  		__u32 irq; @@ -168,6 +169,8 @@ struct kvm_pit_config {  #define KVM_EXIT_PAPR_HCALL	  19  #define KVM_EXIT_S390_UCONTROL	  20  #define KVM_EXIT_WATCHDOG         21 +#define KVM_EXIT_S390_TSCH        22 +#define KVM_EXIT_EPR              23  /* For KVM_EXIT_INTERNAL_ERROR */  /* Emulate instruction failed. */ @@ -285,6 +288,19 @@ struct kvm_run {  			__u64 ret;  			__u64 args[9];  		} papr_hcall; +		/* KVM_EXIT_S390_TSCH */ +		struct { +			__u16 subchannel_id; +			__u16 subchannel_nr; +			__u32 io_int_parm; +			__u32 io_int_word; +			__u32 ipb; +			__u8 dequeued; +		} s390_tsch; +		/* KVM_EXIT_EPR */ +		struct { +			__u32 epr; +		} epr;  		/* Fix the size of the union. */  		char padding[256];  	}; @@ -397,10 +413,20 @@ struct kvm_s390_psw {  #define KVM_S390_PROGRAM_INT		0xfffe0001u  #define KVM_S390_SIGP_SET_PREFIX	0xfffe0002u  #define KVM_S390_RESTART		0xfffe0003u +#define KVM_S390_MCHK			0xfffe1000u  #define KVM_S390_INT_VIRTIO		0xffff2603u  #define KVM_S390_INT_SERVICE		0xffff2401u  #define KVM_S390_INT_EMERGENCY		0xffff1201u  #define KVM_S390_INT_EXTERNAL_CALL	0xffff1202u +/* Anything below 0xfffe0000u is taken by INT_IO */ +#define KVM_S390_INT_IO(ai,cssid,ssid,schid)   \ +	(((schid)) |			       \ +	 ((ssid) << 16) |		       \ +	 ((cssid) << 18) |		       \ +	 ((ai) << 26)) +#define KVM_S390_INT_IO_MIN		0x00000000u +#define KVM_S390_INT_IO_MAX		0xfffdffffu +  struct kvm_s390_interrupt {  	__u32 type; @@ -635,6 +661,10 @@ struct kvm_ppc_smmu_info {  #define KVM_CAP_IRQFD_RESAMPLE 82  #define KVM_CAP_PPC_BOOKE_WATCHDOG 83  #define KVM_CAP_PPC_HTAB_FD 84 +#define KVM_CAP_S390_CSS_SUPPORT 85 +#define KVM_CAP_PPC_EPR 86 +#define KVM_CAP_ARM_PSCI 87 +#define KVM_CAP_ARM_SET_DEVICE_ADDR 88  #ifdef KVM_CAP_IRQ_ROUTING @@ -764,6 +794,11 @@ struct kvm_dirty_tlb {  #define KVM_REG_SIZE_U512	0x0060000000000000ULL  #define KVM_REG_SIZE_U1024	0x0070000000000000ULL +struct kvm_reg_list { +	__u64 n; /* number of regs */ +	__u64 reg[0]; +}; +  struct kvm_one_reg {  	__u64 id;  	__u64 addr; @@ -777,6 +812,11 @@ struct kvm_msi {  	__u8  pad[16];  }; +struct kvm_arm_device_addr { +	__u64 id; +	__u64 addr; +}; +  /*   * ioctls for VM fds   */ @@ -862,6 +902,8 @@ struct kvm_s390_ucas_mapping {  #define KVM_ALLOCATE_RMA	  _IOR(KVMIO,  0xa9, struct kvm_allocate_rma)  /* Available with KVM_CAP_PPC_HTAB_FD */  #define KVM_PPC_GET_HTAB_FD	  _IOW(KVMIO,  0xaa, struct kvm_get_htab_fd) +/* Available with KVM_CAP_ARM_SET_DEVICE_ADDR */ +#define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)  /*   * ioctls for vcpu fds @@ -932,6 +974,8 @@ struct kvm_s390_ucas_mapping {  #define KVM_SET_ONE_REG		  _IOW(KVMIO,  0xac, struct kvm_one_reg)  /* VM is being stopped by host */  #define KVM_KVMCLOCK_CTRL	  _IO(KVMIO,   0xad) +#define KVM_ARM_VCPU_INIT	  _IOW(KVMIO,  0xae, struct kvm_vcpu_init) +#define KVM_GET_REG_LIST	  _IOWR(KVMIO, 0xb0, struct kvm_reg_list)  #define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0)  #define KVM_DEV_ASSIGN_PCI_2_3		(1 << 1) diff --git a/include/uapi/linux/meye.h b/include/uapi/linux/meye.h index 0dd49954f74..8ff50fe9e48 100644 --- a/include/uapi/linux/meye.h +++ b/include/uapi/linux/meye.h @@ -57,10 +57,8 @@ struct meye_params {  #define MEYEIOC_STILLJCAPT	_IOR ('v', BASE_VIDIOC_PRIVATE+5, int)  /* V4L2 private controls */ -#define V4L2_CID_AGC		V4L2_CID_PRIVATE_BASE -#define V4L2_CID_MEYE_SHARPNESS	(V4L2_CID_PRIVATE_BASE + 1) -#define V4L2_CID_PICTURE	(V4L2_CID_PRIVATE_BASE + 2) -#define V4L2_CID_JPEGQUAL	(V4L2_CID_PRIVATE_BASE + 3) -#define V4L2_CID_FRAMERATE	(V4L2_CID_PRIVATE_BASE + 4) +#define V4L2_CID_MEYE_AGC		(V4L2_CID_USER_MEYE_BASE + 0) +#define V4L2_CID_MEYE_PICTURE		(V4L2_CID_USER_MEYE_BASE + 1) +#define V4L2_CID_MEYE_FRAMERATE		(V4L2_CID_USER_MEYE_BASE + 2)  #endif diff --git a/include/uapi/linux/mroute.h b/include/uapi/linux/mroute.h index 16929993acc..a382d2c04a4 100644 --- a/include/uapi/linux/mroute.h +++ b/include/uapi/linux/mroute.h @@ -26,6 +26,9 @@  #define MRT_ASSERT	(MRT_BASE+7)	/* Activate PIM assert mode		*/  #define MRT_PIM		(MRT_BASE+8)	/* enable PIM code			*/  #define MRT_TABLE	(MRT_BASE+9)	/* Specify mroute table ID		*/ +#define MRT_ADD_MFC_PROXY	(MRT_BASE+10)	/* Add a (*,*|G) mfc entry	*/ +#define MRT_DEL_MFC_PROXY	(MRT_BASE+11)	/* Del a (*,*|G) mfc entry	*/ +#define MRT_MAX		(MRT_BASE+11)  #define SIOCGETVIFCNT	SIOCPROTOPRIVATE	/* IP protocol privates */  #define SIOCGETSGCNT	(SIOCPROTOPRIVATE+1) diff --git a/include/uapi/linux/mroute6.h b/include/uapi/linux/mroute6.h index 3e89b5e7f9e..ce91215cf7e 100644 --- a/include/uapi/linux/mroute6.h +++ b/include/uapi/linux/mroute6.h @@ -26,6 +26,9 @@  #define MRT6_ASSERT	(MRT6_BASE+7)	/* Activate PIM assert mode		*/  #define MRT6_PIM	(MRT6_BASE+8)	/* enable PIM code			*/  #define MRT6_TABLE	(MRT6_BASE+9)	/* Specify mroute table ID		*/ +#define MRT6_ADD_MFC_PROXY	(MRT6_BASE+10)	/* Add a (*,*|G) mfc entry	*/ +#define MRT6_DEL_MFC_PROXY	(MRT6_BASE+11)	/* Del a (*,*|G) mfc entry	*/ +#define MRT6_MAX	(MRT6_BASE+11)  #define SIOCGETMIFCNT_IN6	SIOCPROTOPRIVATE	/* IP protocol privates */  #define SIOCGETSGCNT_IN6	(SIOCPROTOPRIVATE+1) diff --git a/include/uapi/linux/msdos_fs.h b/include/uapi/linux/msdos_fs.h index 996719f82e2..f055e58b314 100644 --- a/include/uapi/linux/msdos_fs.h +++ b/include/uapi/linux/msdos_fs.h @@ -87,6 +87,8 @@  #define IS_FSINFO(x)	(le32_to_cpu((x)->signature1) == FAT_FSINFO_SIG1 \  			 && le32_to_cpu((x)->signature2) == FAT_FSINFO_SIG2) +#define FAT_STATE_DIRTY 0x01 +  struct __fat_dirent {  	long		d_ino;  	__kernel_off_t	d_off; @@ -120,14 +122,34 @@ struct fat_boot_sector {  	__le32	hidden;		/* hidden sectors (unused) */  	__le32	total_sect;	/* number of sectors (if sectors == 0) */ -	/* The following fields are only used by FAT32 */ -	__le32	fat32_length;	/* sectors/FAT */ -	__le16	flags;		/* bit 8: fat mirroring, low 4: active fat */ -	__u8	version[2];	/* major, minor filesystem version */ -	__le32	root_cluster;	/* first cluster in root directory */ -	__le16	info_sector;	/* filesystem info sector */ -	__le16	backup_boot;	/* backup boot sector */ -	__le16	reserved2[6];	/* Unused */ +	union { +		struct { +			/*  Extended BPB Fields for FAT16 */ +			__u8	drive_number;	/* Physical drive number */ +			__u8	state;		/* undocumented, but used +						   for mount state. */ +			/* other fiealds are not added here */ +		} fat16; + +		struct { +			/* only used by FAT32 */ +			__le32	length;		/* sectors/FAT */ +			__le16	flags;		/* bit 8: fat mirroring, +						   low 4: active fat */ +			__u8	version[2];	/* major, minor filesystem +						   version */ +			__le32	root_cluster;	/* first cluster in +						   root directory */ +			__le16	info_sector;	/* filesystem info sector */ +			__le16	backup_boot;	/* backup boot sector */ +			__le16	reserved2[6];	/* Unused */ +			/* Extended BPB Fields for FAT32 */ +			__u8	drive_number;   /* Physical drive number */ +			__u8    state;       	/* undocumented, but used +						   for mount state. */ +			/* other fiealds are not added here */ +		} fat32; +	};  };  struct fat_boot_fsinfo { diff --git a/include/uapi/linux/nbd.h b/include/uapi/linux/nbd.h index dfb514472cb..4f52549b23f 100644 --- a/include/uapi/linux/nbd.h +++ b/include/uapi/linux/nbd.h @@ -33,13 +33,14 @@ enum {  	NBD_CMD_READ = 0,  	NBD_CMD_WRITE = 1,  	NBD_CMD_DISC = 2, -	/* there is a gap here to match userspace */ +	NBD_CMD_FLUSH = 3,  	NBD_CMD_TRIM = 4  };  /* values for flags field */  #define NBD_FLAG_HAS_FLAGS    (1 << 0) /* nbd-server supports flags */  #define NBD_FLAG_READ_ONLY    (1 << 1) /* device is read-only */ +#define NBD_FLAG_SEND_FLUSH   (1 << 2) /* can flush writeback cache */  /* there is a gap here to match userspace */  #define NBD_FLAG_SEND_TRIM    (1 << 5) /* send trim/discard */ diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h index 275e5d65dcb..adb068c53c4 100644 --- a/include/uapi/linux/neighbour.h +++ b/include/uapi/linux/neighbour.h @@ -20,6 +20,7 @@ enum {  	NDA_LLADDR,  	NDA_CACHEINFO,  	NDA_PROBES, +	NDA_VLAN,  	__NDA_MAX  }; diff --git a/include/uapi/linux/netfilter/Kbuild b/include/uapi/linux/netfilter/Kbuild index 08f555fef13..41115776d76 100644 --- a/include/uapi/linux/netfilter/Kbuild +++ b/include/uapi/linux/netfilter/Kbuild @@ -35,9 +35,11 @@ header-y += xt_TCPOPTSTRIP.h  header-y += xt_TEE.h  header-y += xt_TPROXY.h  header-y += xt_addrtype.h +header-y += xt_bpf.h  header-y += xt_cluster.h  header-y += xt_comment.h  header-y += xt_connbytes.h +header-y += xt_connlabel.h  header-y += xt_connlimit.h  header-y += xt_connmark.h  header-y += xt_conntrack.h diff --git a/include/uapi/linux/netfilter/nf_conntrack_common.h b/include/uapi/linux/netfilter/nf_conntrack_common.h index 1644cdd8be9..d69483fb382 100644 --- a/include/uapi/linux/netfilter/nf_conntrack_common.h +++ b/include/uapi/linux/netfilter/nf_conntrack_common.h @@ -101,6 +101,7 @@ enum ip_conntrack_events {  	IPCT_MARK,		/* new mark has been set */  	IPCT_NATSEQADJ,		/* NAT is doing sequence adjustment */  	IPCT_SECMARK,		/* new security mark has been set */ +	IPCT_LABEL,		/* new connlabel has been set */  };  enum ip_conntrack_expect_events { diff --git a/include/uapi/linux/netfilter/nfnetlink_conntrack.h b/include/uapi/linux/netfilter/nfnetlink_conntrack.h index 86e930cf3df..08fabc6c93f 100644 --- a/include/uapi/linux/netfilter/nfnetlink_conntrack.h +++ b/include/uapi/linux/netfilter/nfnetlink_conntrack.h @@ -49,6 +49,8 @@ enum ctattr_type {  	CTA_SECCTX,  	CTA_TIMESTAMP,  	CTA_MARK_MASK, +	CTA_LABELS, +	CTA_LABELS_MASK,  	__CTA_MAX  };  #define CTA_MAX (__CTA_MAX - 1) diff --git a/include/uapi/linux/netfilter/xt_CT.h b/include/uapi/linux/netfilter/xt_CT.h index a064b8af360..5a688c1ca4d 100644 --- a/include/uapi/linux/netfilter/xt_CT.h +++ b/include/uapi/linux/netfilter/xt_CT.h @@ -3,7 +3,11 @@  #include <linux/types.h> -#define XT_CT_NOTRACK	0x1 +enum { +	XT_CT_NOTRACK		= 1 << 0, +	XT_CT_NOTRACK_ALIAS	= 1 << 1, +	XT_CT_MASK		= XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS, +};  struct xt_ct_target_info {  	__u16 flags; diff --git a/include/uapi/linux/netfilter/xt_bpf.h b/include/uapi/linux/netfilter/xt_bpf.h new file mode 100644 index 00000000000..5dda450eb55 --- /dev/null +++ b/include/uapi/linux/netfilter/xt_bpf.h @@ -0,0 +1,17 @@ +#ifndef _XT_BPF_H +#define _XT_BPF_H + +#include <linux/filter.h> +#include <linux/types.h> + +#define XT_BPF_MAX_NUM_INSTR	64 + +struct xt_bpf_info { +	__u16 bpf_program_num_elem; +	struct sock_filter bpf_program[XT_BPF_MAX_NUM_INSTR]; + +	/* only used in the kernel */ +	struct sk_filter *filter __attribute__((aligned(8))); +}; + +#endif /*_XT_BPF_H */ diff --git a/include/uapi/linux/netfilter/xt_connlabel.h b/include/uapi/linux/netfilter/xt_connlabel.h new file mode 100644 index 00000000000..c4bc9ee9b33 --- /dev/null +++ b/include/uapi/linux/netfilter/xt_connlabel.h @@ -0,0 +1,12 @@ +#include <linux/types.h> + +#define XT_CONNLABEL_MAXBIT 127 +enum xt_connlabel_mtopts { +	XT_CONNLABEL_OP_INVERT = 1 << 0, +	XT_CONNLABEL_OP_SET    = 1 << 1, +}; + +struct xt_connlabel_mtinfo { +	__u16 bit; +	__u16 options; +}; diff --git a/include/uapi/linux/netfilter/xt_conntrack.h b/include/uapi/linux/netfilter/xt_conntrack.h index e3c041d5402..e5bd3083a84 100644 --- a/include/uapi/linux/netfilter/xt_conntrack.h +++ b/include/uapi/linux/netfilter/xt_conntrack.h @@ -31,6 +31,7 @@ enum {  	XT_CONNTRACK_REPLSRC_PORT = 1 << 10,  	XT_CONNTRACK_REPLDST_PORT = 1 << 11,  	XT_CONNTRACK_DIRECTION    = 1 << 12, +	XT_CONNTRACK_STATE_ALIAS  = 1 << 13,  };  struct xt_conntrack_mtinfo1 { diff --git a/include/uapi/linux/nfc.h b/include/uapi/linux/nfc.h index 0e63cee8d81..7969f46f1bb 100644 --- a/include/uapi/linux/nfc.h +++ b/include/uapi/linux/nfc.h @@ -5,20 +5,17 @@   *    Lauro Ramos Venancio <lauro.venancio@openbossa.org>   *    Aloisio Almeida Jr <aloisio.almeida@openbossa.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. + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies.   * - * 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. + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   */  #ifndef __LINUX_NFC_H @@ -67,6 +64,11 @@   *	subsequent CONNECT and CC messages.   *	If one of the passed parameters is wrong none is set and -EINVAL is   *	returned. + * @NFC_CMD_ENABLE_SE: Enable the physical link to a specific secure element. + *	Once enabled a secure element will handle card emulation mode, i.e. + *	starting a poll from a device which has a secure element enabled means + *	we want to do SE based card emulation. + * @NFC_CMD_DISABLE_SE: Disable the physical link to a specific secure element.   */  enum nfc_commands {  	NFC_CMD_UNSPEC, @@ -86,6 +88,8 @@ enum nfc_commands {  	NFC_EVENT_TM_DEACTIVATED,  	NFC_CMD_LLC_GET_PARAMS,  	NFC_CMD_LLC_SET_PARAMS, +	NFC_CMD_ENABLE_SE, +	NFC_CMD_DISABLE_SE,  /* private: internal use only */  	__NFC_CMD_AFTER_LAST  }; @@ -114,6 +118,7 @@ enum nfc_commands {   * @NFC_ATTR_LLC_PARAM_LTO: Link TimeOut parameter   * @NFC_ATTR_LLC_PARAM_RW: Receive Window size parameter   * @NFC_ATTR_LLC_PARAM_MIUX: MIU eXtension parameter + * @NFC_ATTR_SE: Available Secure Elements   */  enum nfc_attrs {  	NFC_ATTR_UNSPEC, @@ -134,6 +139,7 @@ enum nfc_attrs {  	NFC_ATTR_LLC_PARAM_LTO,  	NFC_ATTR_LLC_PARAM_RW,  	NFC_ATTR_LLC_PARAM_MIUX, +	NFC_ATTR_SE,  /* private: internal use only */  	__NFC_ATTR_AFTER_LAST  }; @@ -172,6 +178,11 @@ enum nfc_attrs {  #define NFC_PROTO_NFC_DEP_MASK	  (1 << NFC_PROTO_NFC_DEP)  #define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B) +/* NFC Secure Elements */ +#define NFC_SE_NONE     0x0 +#define NFC_SE_UICC     0x1 +#define NFC_SE_EMBEDDED 0x2 +  struct sockaddr_nfc {  	sa_family_t sa_family;  	__u32 dev_idx; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index e3e19f8b16f..c46bb016f4e 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -170,7 +170,8 @@   *	%NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE,   *	%NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS,   *	%NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, - *	%NL80211_ATTR_AUTH_TYPE and %NL80211_ATTR_INACTIVITY_TIMEOUT. + *	%NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, + *	%NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS.   *	The channel to use can be set on the interface or be given using the   *	%NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width.   * @NL80211_CMD_NEW_BEACON: old alias for %NL80211_CMD_START_AP @@ -374,8 +375,8 @@   *	requests to connect to a specified network but without separating   *	auth and assoc steps. For this, you need to specify the SSID in a   *	%NL80211_ATTR_SSID attribute, and can optionally specify the association - *	IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC, - *	%NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, + *	IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, + *	%NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT,   *	%NL80211_ATTR_CONTROL_PORT_ETHERTYPE and   *	%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT.   *	Background scan period can optionally be @@ -512,6 +513,12 @@   *	command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For   *	more background information, see   *	http://wireless.kernel.org/en/users/Documentation/WoWLAN. + *	The @NL80211_CMD_SET_WOWLAN command can also be used as a notification + *	from the driver reporting the wakeup reason. In this case, the + *	@NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason + *	for the wakeup, if it was caused by wireless. If it is not present + *	in the wakeup notification, the wireless device didn't cause the + *	wakeup but reports that it was woken up.   *   * @NL80211_CMD_SET_REKEY_OFFLOAD: This command is used give the driver   *	the necessary information for supporting GTK rekey offload. This @@ -586,6 +593,24 @@   * @NL80211_CMD_SET_MCAST_RATE: Change the rate used to send multicast frames   *	for IBSS or MESH vif.   * + * @NL80211_CMD_SET_MAC_ACL: sets ACL for MAC address based access control. + *	This is to be used with the drivers advertising the support of MAC + *	address based access control. List of MAC addresses is passed in + *	%NL80211_ATTR_MAC_ADDRS and ACL policy is passed in + *	%NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it + *	is not already done. The new list will replace any existing list. Driver + *	will clear its ACL when the list of MAC addresses passed is empty. This + *	command is used in AP/P2P GO mode. Driver has to make sure to clear its + *	ACL list during %NL80211_CMD_STOP_AP. + * + * @NL80211_CMD_RADAR_DETECT: Start a Channel availability check (CAC). Once + *	a radar is detected or the channel availability scan (CAC) has finished + *	or was aborted, or a radar was detected, usermode will be notified with + *	this event. This command is also used to notify userspace about radars + *	while operating on this channel. + *	%NL80211_ATTR_RADAR_EVENT is used to inform about the type of the + *	event. + *   * @NL80211_CMD_MAX: highest used command number   * @__NL80211_CMD_AFTER_LAST: internal use   */ @@ -736,6 +761,10 @@ enum nl80211_commands {  	NL80211_CMD_SET_MCAST_RATE, +	NL80211_CMD_SET_MAC_ACL, + +	NL80211_CMD_RADAR_DETECT, +  	/* add new commands above here */  	/* used to define NL80211_CMD_MAX below */ @@ -958,7 +987,7 @@ enum nl80211_commands {   * @NL80211_ATTR_USE_MFP: Whether management frame protection (IEEE 802.11w) is   *	used for the association (&enum nl80211_mfp, represented as a u32);   *	this attribute can be used - *	with %NL80211_CMD_ASSOCIATE request + *	with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests   *   * @NL80211_ATTR_STA_FLAGS2: Attribute containing a   *	&struct nl80211_sta_flag_update. @@ -1310,6 +1339,35 @@ enum nl80211_commands {   *	if not given in START_AP 0 is assumed, if not given in SET_BSS   *	no change is made.   * + * @NL80211_ATTR_LOCAL_MESH_POWER_MODE: local mesh STA link-specific power mode + *	defined in &enum nl80211_mesh_power_mode. + * + * @NL80211_ATTR_ACL_POLICY: ACL policy, see &enum nl80211_acl_policy, + *	carried in a u32 attribute + * + * @NL80211_ATTR_MAC_ADDRS: Array of nested MAC addresses, used for + *	MAC ACL. + * + * @NL80211_ATTR_MAC_ACL_MAX: u32 attribute to advertise the maximum + *	number of MAC addresses that a device can support for MAC + *	ACL. + * + * @NL80211_ATTR_RADAR_EVENT: Type of radar event for notification to userspace, + *	contains a value of enum nl80211_radar_event (u32). + * + * @NL80211_ATTR_EXT_CAPA: 802.11 extended capabilities that the kernel driver + *	has and handles. The format is the same as the IE contents. See + *	802.11-2012 8.4.2.29 for more information. + * @NL80211_ATTR_EXT_CAPA_MASK: Extended capabilities that the kernel driver + *	has set in the %NL80211_ATTR_EXT_CAPA value, for multibit fields. + * + * @NL80211_ATTR_STA_CAPABILITY: Station capabilities (u16) are advertised to + *	the driver, e.g., to enable TDLS power save (PU-APSD). + * + * @NL80211_ATTR_STA_EXT_CAPABILITY: Station extended capabilities are + *	advertised to the driver, e.g., to enable TDLS off channel operations + *	and PU-APSD. + *   * @NL80211_ATTR_MAX: highest attribute number currently defined   * @__NL80211_ATTR_AFTER_LAST: internal use   */ @@ -1580,6 +1638,22 @@ enum nl80211_attrs {  	NL80211_ATTR_P2P_CTWINDOW,  	NL80211_ATTR_P2P_OPPPS, +	NL80211_ATTR_LOCAL_MESH_POWER_MODE, + +	NL80211_ATTR_ACL_POLICY, + +	NL80211_ATTR_MAC_ADDRS, + +	NL80211_ATTR_MAC_ACL_MAX, + +	NL80211_ATTR_RADAR_EVENT, + +	NL80211_ATTR_EXT_CAPA, +	NL80211_ATTR_EXT_CAPA_MASK, + +	NL80211_ATTR_STA_CAPABILITY, +	NL80211_ATTR_STA_EXT_CAPABILITY, +  	/* add attributes here, update the policy in nl80211.c */  	__NL80211_ATTR_AFTER_LAST, @@ -1697,6 +1771,9 @@ enum nl80211_iftype {   *	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_ASSOCIATED: station is associated; used with drivers + *	that support %NL80211_FEATURE_FULL_AP_CLIENT_STATE to transition a + *	previously added station into associated state   * @NL80211_STA_FLAG_MAX: highest station flag number currently defined   * @__NL80211_STA_FLAG_AFTER_LAST: internal use   */ @@ -1708,6 +1785,7 @@ enum nl80211_sta_flags {  	NL80211_STA_FLAG_MFP,  	NL80211_STA_FLAG_AUTHENTICATED,  	NL80211_STA_FLAG_TDLS_PEER, +	NL80211_STA_FLAG_ASSOCIATED,  	/* keep last */  	__NL80211_STA_FLAG_AFTER_LAST, @@ -1813,6 +1891,8 @@ enum nl80211_sta_bss_param {   * @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs)   * @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station)   * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station) + * @NL80211_STA_INFO_RX_BYTES64: total received bytes (u64, from this station) + * @NL80211_STA_INFO_TX_BYTES64: total transmitted bytes (u64, to this station)   * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm)   * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute   * 	containing info as possible, see &enum nl80211_rate_info @@ -1834,6 +1914,10 @@ enum nl80211_sta_bss_param {   * @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_T_OFFSET: timing offset with respect to this STA (s64) + * @NL80211_STA_INFO_LOCAL_PM: local mesh STA link-specific power mode + * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode + * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards + *	non-peer STA   * @__NL80211_STA_INFO_AFTER_LAST: internal   * @NL80211_STA_INFO_MAX: highest possible station info attribute   */ @@ -1858,6 +1942,11 @@ enum nl80211_sta_info {  	NL80211_STA_INFO_STA_FLAGS,  	NL80211_STA_INFO_BEACON_LOSS,  	NL80211_STA_INFO_T_OFFSET, +	NL80211_STA_INFO_LOCAL_PM, +	NL80211_STA_INFO_PEER_PM, +	NL80211_STA_INFO_NONPEER_PM, +	NL80211_STA_INFO_RX_BYTES64, +	NL80211_STA_INFO_TX_BYTES64,  	/* keep last */  	__NL80211_STA_INFO_AFTER_LAST, @@ -1967,6 +2056,20 @@ enum nl80211_band_attr {   *	on this channel in current regulatory domain.   * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm   *	(100 * dBm). + * @NL80211_FREQUENCY_ATTR_DFS_STATE: current state for DFS + *	(enum nl80211_dfs_state) + * @NL80211_FREQUENCY_ATTR_DFS_TIME: time in miliseconds for how long + *	this channel is in this DFS state. + * @NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: HT40- isn't possible with this + *	channel as the control channel + * @NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: HT40+ isn't possible with this + *	channel as the control channel + * @NL80211_FREQUENCY_ATTR_NO_80MHZ: any 80 MHz channel using this channel + *	as the primary or any of the secondary channels isn't possible, + *	this includes 80+80 channels + * @NL80211_FREQUENCY_ATTR_NO_160MHZ: any 160 MHz (but not 80+80) channel + *	using this channel as the primary or any of the secondary channels + *	isn't possible   * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number   *	currently defined   * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use @@ -1979,6 +2082,12 @@ enum nl80211_frequency_attr {  	NL80211_FREQUENCY_ATTR_NO_IBSS,  	NL80211_FREQUENCY_ATTR_RADAR,  	NL80211_FREQUENCY_ATTR_MAX_TX_POWER, +	NL80211_FREQUENCY_ATTR_DFS_STATE, +	NL80211_FREQUENCY_ATTR_DFS_TIME, +	NL80211_FREQUENCY_ATTR_NO_HT40_MINUS, +	NL80211_FREQUENCY_ATTR_NO_HT40_PLUS, +	NL80211_FREQUENCY_ATTR_NO_80MHZ, +	NL80211_FREQUENCY_ATTR_NO_160MHZ,  	/* keep last */  	__NL80211_FREQUENCY_ATTR_AFTER_LAST, @@ -2249,6 +2358,34 @@ enum nl80211_mntr_flags {  };  /** + * enum nl80211_mesh_power_mode - mesh power save modes + * + * @NL80211_MESH_POWER_UNKNOWN: The mesh power mode of the mesh STA is + *	not known or has not been set yet. + * @NL80211_MESH_POWER_ACTIVE: Active mesh power mode. The mesh STA is + *	in Awake state all the time. + * @NL80211_MESH_POWER_LIGHT_SLEEP: Light sleep mode. The mesh STA will + *	alternate between Active and Doze states, but will wake up for + *	neighbor's beacons. + * @NL80211_MESH_POWER_DEEP_SLEEP: Deep sleep mode. The mesh STA will + *	alternate between Active and Doze states, but may not wake up + *	for neighbor's beacons. + * + * @__NL80211_MESH_POWER_AFTER_LAST - internal use + * @NL80211_MESH_POWER_MAX - highest possible power save level + */ + +enum nl80211_mesh_power_mode { +	NL80211_MESH_POWER_UNKNOWN, +	NL80211_MESH_POWER_ACTIVE, +	NL80211_MESH_POWER_LIGHT_SLEEP, +	NL80211_MESH_POWER_DEEP_SLEEP, + +	__NL80211_MESH_POWER_AFTER_LAST, +	NL80211_MESH_POWER_MAX = __NL80211_MESH_POWER_AFTER_LAST - 1 +}; + +/**   * enum nl80211_meshconf_params - mesh configuration parameters   *   * Mesh configuration parameters. These can be changed while the mesh is @@ -2342,6 +2479,11 @@ enum nl80211_mntr_flags {   *	(in TUs) during which a mesh STA can send only one Action frame   *	containing a PREQ element for root path confirmation.   * + * @NL80211_MESHCONF_POWER_MODE: Default mesh power mode for new peer links. + *	type &enum nl80211_mesh_power_mode (u32) + * + * @NL80211_MESHCONF_AWAKE_WINDOW: awake window duration (in TUs) + *   * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use   */  enum nl80211_meshconf_params { @@ -2371,6 +2513,8 @@ enum nl80211_meshconf_params {  	NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,  	NL80211_MESHCONF_HWMP_ROOT_INTERVAL,  	NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, +	NL80211_MESHCONF_POWER_MODE, +	NL80211_MESHCONF_AWAKE_WINDOW,  	/* keep last */  	__NL80211_MESHCONF_ATTR_AFTER_LAST, @@ -2816,10 +2960,12 @@ enum nl80211_tx_power_setting {   *	corresponds to the lowest-order bit in the second byte of the mask.   *	For example: The match 00:xx:00:00:xx:00:00:00:00:xx:xx:xx (where   *	xx indicates "don't care") would be represented by a pattern of - *	twelve zero bytes, and a mask of "0xed,0x07". + *	twelve zero bytes, and a mask of "0xed,0x01".   *	Note that the pattern matching is done as though frames were not   *	802.11 frames but 802.3 frames, i.e. the frame is fully unpacked   *	first (including SNAP header unpacking) and then matched. + * @NL80211_WOWLAN_PKTPAT_OFFSET: packet offset, pattern is matched after + *	these fixed number of bytes of received packet   * @NUM_NL80211_WOWLAN_PKTPAT: number of attributes   * @MAX_NL80211_WOWLAN_PKTPAT: max attribute number   */ @@ -2827,6 +2973,7 @@ enum nl80211_wowlan_packet_pattern_attr {  	__NL80211_WOWLAN_PKTPAT_INVALID,  	NL80211_WOWLAN_PKTPAT_MASK,  	NL80211_WOWLAN_PKTPAT_PATTERN, +	NL80211_WOWLAN_PKTPAT_OFFSET,  	NUM_NL80211_WOWLAN_PKTPAT,  	MAX_NL80211_WOWLAN_PKTPAT = NUM_NL80211_WOWLAN_PKTPAT - 1, @@ -2837,6 +2984,7 @@ enum nl80211_wowlan_packet_pattern_attr {   * @max_patterns: maximum number of patterns supported   * @min_pattern_len: minimum length of each pattern   * @max_pattern_len: maximum length of each pattern + * @max_pkt_offset: maximum Rx packet offset   *   * This struct is carried in %NL80211_WOWLAN_TRIG_PKT_PATTERN when   * that is part of %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED in the @@ -2846,6 +2994,7 @@ struct nl80211_wowlan_pattern_support {  	__u32 max_patterns;  	__u32 min_pattern_len;  	__u32 max_pattern_len; +	__u32 max_pkt_offset;  } __attribute__((packed));  /** @@ -2861,12 +3010,17 @@ struct nl80211_wowlan_pattern_support {   * @NL80211_WOWLAN_TRIG_PKT_PATTERN: wake up on the specified packet patterns   *	which are passed in an array of nested attributes, each nested attribute   *	defining a with attributes from &struct nl80211_wowlan_trig_pkt_pattern. - *	Each pattern defines a wakeup packet. The matching is done on the MSDU, - *	i.e. as though the packet was an 802.3 packet, so the pattern matching - *	is done after the packet is converted to the MSDU. + *	Each pattern defines a wakeup packet. Packet offset is associated with + *	each pattern which is used while matching the pattern. The matching is + *	done on the MSDU, i.e. as though the packet was an 802.3 packet, so the + *	pattern matching is done after the packet is converted to the MSDU.   *   *	In %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, it is a binary attribute   *	carrying a &struct nl80211_wowlan_pattern_support. + * + *	When reporting wakeup. it is a u32 attribute containing the 0-based + *	index of the pattern that caused the wakeup, in the patterns passed + *	to the kernel when configuring.   * @NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED: Not a real trigger, and cannot be   *	used when setting, used only to indicate that GTK rekeying is supported   *	by the device (flag) @@ -2877,8 +3031,36 @@ struct nl80211_wowlan_pattern_support {   * @NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE: wake up on 4-way handshake (flag)   * @NL80211_WOWLAN_TRIG_RFKILL_RELEASE: wake up when rfkill is released   *	(on devices that have rfkill in the device) (flag) + * @NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211: For wakeup reporting only, contains + *	the 802.11 packet that caused the wakeup, e.g. a deauth frame. The frame + *	may be truncated, the @NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN + *	attribute contains the original length. + * @NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN: Original length of the 802.11 + *	packet, may be bigger than the @NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211 + *	attribute if the packet was truncated somewhere. + * @NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023: For wakeup reporting only, contains the + *	802.11 packet that caused the wakeup, e.g. a magic packet. The frame may + *	be truncated, the @NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN attribute + *	contains the original length. + * @NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN: Original length of the 802.3 + *	packet, may be bigger than the @NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023 + *	attribute if the packet was truncated somewhere. + * @NL80211_WOWLAN_TRIG_TCP_CONNECTION: TCP connection wake, see DOC section + *	"TCP connection wakeup" for more details. This is a nested attribute + *	containing the exact information for establishing and keeping alive + *	the TCP connection. + * @NL80211_WOWLAN_TRIG_TCP_WAKEUP_MATCH: For wakeup reporting only, the + *	wakeup packet was received on the TCP connection + * @NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST: For wakeup reporting only, the + *	TCP connection was lost or failed to be established + * @NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS: For wakeup reporting only, + *	the TCP connection ran out of tokens to use for data to send to the + *	service   * @NUM_NL80211_WOWLAN_TRIG: number of wake on wireless triggers   * @MAX_NL80211_WOWLAN_TRIG: highest wowlan trigger attribute number + * + * These nested attributes are used to configure the wakeup triggers and + * to report the wakeup reason(s).   */  enum nl80211_wowlan_triggers {  	__NL80211_WOWLAN_TRIG_INVALID, @@ -2891,6 +3073,14 @@ enum nl80211_wowlan_triggers {  	NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST,  	NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE,  	NL80211_WOWLAN_TRIG_RFKILL_RELEASE, +	NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211, +	NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN, +	NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023, +	NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN, +	NL80211_WOWLAN_TRIG_TCP_CONNECTION, +	NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH, +	NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST, +	NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS,  	/* keep last */  	NUM_NL80211_WOWLAN_TRIG, @@ -2898,6 +3088,116 @@ enum nl80211_wowlan_triggers {  };  /** + * DOC: TCP connection wakeup + * + * Some devices can establish a TCP connection in order to be woken up by a + * packet coming in from outside their network segment, or behind NAT. If + * configured, the device will establish a TCP connection to the given + * service, and periodically send data to that service. The first data + * packet is usually transmitted after SYN/ACK, also ACKing the SYN/ACK. + * The data packets can optionally include a (little endian) sequence + * number (in the TCP payload!) that is generated by the device, and, also + * optionally, a token from a list of tokens. This serves as a keep-alive + * with the service, and for NATed connections, etc. + * + * During this keep-alive period, the server doesn't send any data to the + * client. When receiving data, it is compared against the wakeup pattern + * (and mask) and if it matches, the host is woken up. Similarly, if the + * connection breaks or cannot be established to start with, the host is + * also woken up. + * + * Developer's note: ARP offload is required for this, otherwise TCP + * response packets might not go through correctly. + */ + +/** + * struct nl80211_wowlan_tcp_data_seq - WoWLAN TCP data sequence + * @start: starting value + * @offset: offset of sequence number in packet + * @len: length of the sequence value to write, 1 through 4 + * + * Note: don't confuse with the TCP sequence number(s), this is for the + * keepalive packet payload. The actual value is written into the packet + * in little endian. + */ +struct nl80211_wowlan_tcp_data_seq { +	__u32 start, offset, len; +}; + +/** + * struct nl80211_wowlan_tcp_data_token - WoWLAN TCP data token config + * @offset: offset of token in packet + * @len: length of each token + * @token_stream: stream of data to be used for the tokens, the length must + *	be a multiple of @len for this to make sense + */ +struct nl80211_wowlan_tcp_data_token { +	__u32 offset, len; +	__u8 token_stream[]; +}; + +/** + * struct nl80211_wowlan_tcp_data_token_feature - data token features + * @min_len: minimum token length + * @max_len: maximum token length + * @bufsize: total available token buffer size (max size of @token_stream) + */ +struct nl80211_wowlan_tcp_data_token_feature { +	__u32 min_len, max_len, bufsize; +}; + +/** + * enum nl80211_wowlan_tcp_attrs - WoWLAN TCP connection parameters + * @__NL80211_WOWLAN_TCP_INVALID: invalid number for nested attributes + * @NL80211_WOWLAN_TCP_SRC_IPV4: source IPv4 address (in network byte order) + * @NL80211_WOWLAN_TCP_DST_IPV4: destination IPv4 address + *	(in network byte order) + * @NL80211_WOWLAN_TCP_DST_MAC: destination MAC address, this is given because + *	route lookup when configured might be invalid by the time we suspend, + *	and doing a route lookup when suspending is no longer possible as it + *	might require ARP querying. + * @NL80211_WOWLAN_TCP_SRC_PORT: source port (u16); optional, if not given a + *	socket and port will be allocated + * @NL80211_WOWLAN_TCP_DST_PORT: destination port (u16) + * @NL80211_WOWLAN_TCP_DATA_PAYLOAD: data packet payload, at least one byte. + *	For feature advertising, a u32 attribute holding the maximum length + *	of the data payload. + * @NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ: data packet sequence configuration + *	(if desired), a &struct nl80211_wowlan_tcp_data_seq. For feature + *	advertising it is just a flag + * @NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN: data packet token configuration, + *	see &struct nl80211_wowlan_tcp_data_token and for advertising see + *	&struct nl80211_wowlan_tcp_data_token_feature. + * @NL80211_WOWLAN_TCP_DATA_INTERVAL: data interval in seconds, maximum + *	interval in feature advertising (u32) + * @NL80211_WOWLAN_TCP_WAKE_PAYLOAD: wake packet payload, for advertising a + *	u32 attribute holding the maximum length + * @NL80211_WOWLAN_TCP_WAKE_MASK: Wake packet payload mask, not used for + *	feature advertising. The mask works like @NL80211_WOWLAN_PKTPAT_MASK + *	but on the TCP payload only. + * @NUM_NL80211_WOWLAN_TCP: number of TCP attributes + * @MAX_NL80211_WOWLAN_TCP: highest attribute number + */ +enum nl80211_wowlan_tcp_attrs { +	__NL80211_WOWLAN_TCP_INVALID, +	NL80211_WOWLAN_TCP_SRC_IPV4, +	NL80211_WOWLAN_TCP_DST_IPV4, +	NL80211_WOWLAN_TCP_DST_MAC, +	NL80211_WOWLAN_TCP_SRC_PORT, +	NL80211_WOWLAN_TCP_DST_PORT, +	NL80211_WOWLAN_TCP_DATA_PAYLOAD, +	NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, +	NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, +	NL80211_WOWLAN_TCP_DATA_INTERVAL, +	NL80211_WOWLAN_TCP_WAKE_PAYLOAD, +	NL80211_WOWLAN_TCP_WAKE_MASK, + +	/* keep last */ +	NUM_NL80211_WOWLAN_TCP, +	MAX_NL80211_WOWLAN_TCP = NUM_NL80211_WOWLAN_TCP - 1 +}; + +/**   * enum nl80211_iface_limit_attrs - limit attributes   * @NL80211_IFACE_LIMIT_UNSPEC: (reserved)   * @NL80211_IFACE_LIMIT_MAX: maximum number of interfaces that @@ -2933,6 +3233,8 @@ enum nl80211_iface_limit_attrs {   *	the infrastructure network's beacon interval.   * @NL80211_IFACE_COMB_NUM_CHANNELS: u32 attribute specifying how many   *	different channels may be used within this group. + * @NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS: u32 attribute containing the bitmap + *	of supported channel widths for radar detection.   * @NUM_NL80211_IFACE_COMB: number of attributes   * @MAX_NL80211_IFACE_COMB: highest attribute number   * @@ -2965,6 +3267,7 @@ enum nl80211_if_combination_attrs {  	NL80211_IFACE_COMB_MAXNUM,  	NL80211_IFACE_COMB_STA_AP_BI_MATCH,  	NL80211_IFACE_COMB_NUM_CHANNELS, +	NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,  	/* keep last */  	NUM_NL80211_IFACE_COMB, @@ -3140,6 +3443,19 @@ enum nl80211_ap_sme_features {   *	setting   * @NL80211_FEATURE_P2P_GO_OPPPS: P2P GO implementation supports opportunistic   *	powersave + * @NL80211_FEATURE_FULL_AP_CLIENT_STATE: The driver supports full state + *	transitions for AP clients. Without this flag (and if the driver + *	doesn't have the AP SME in the device) the driver supports adding + *	stations only when they're associated and adds them in associated + *	state (to later be transitioned into authorized), with this flag + *	they should be added before even sending the authentication reply + *	and then transitioned into authenticated, associated and authorized + *	states using station flags. + *	Note that even for drivers that support this, the default is to add + *	stations in authenticated/associated state, so to add unauthenticated + *	stations the authenticated/associated bits have to be set in the mask. + * @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits + *	(HT40, VHT 80/160 MHz) if this flag is set   */  enum nl80211_feature_flags {  	NL80211_FEATURE_SK_TX_STATUS			= 1 << 0, @@ -3155,6 +3471,9 @@ enum nl80211_feature_flags {  	NL80211_FEATURE_NEED_OBSS_SCAN			= 1 << 10,  	NL80211_FEATURE_P2P_GO_CTWIN			= 1 << 11,  	NL80211_FEATURE_P2P_GO_OPPPS			= 1 << 12, +	/* bit 13 is reserved */ +	NL80211_FEATURE_ADVERTISE_CHAN_LIMITS		= 1 << 14, +	NL80211_FEATURE_FULL_AP_CLIENT_STATE		= 1 << 15,  };  /** @@ -3182,7 +3501,7 @@ enum nl80211_probe_resp_offload_support_attr {   * enum nl80211_connect_failed_reason - connection request failed reasons   * @NL80211_CONN_FAIL_MAX_CLIENTS: Maximum number of clients that can be   *	handled by the AP is reached. - * @NL80211_CONN_FAIL_BLOCKED_CLIENT: Client's MAC is in the AP's blocklist. + * @NL80211_CONN_FAIL_BLOCKED_CLIENT: Connection request is rejected due to ACL.   */  enum nl80211_connect_failed_reason {  	NL80211_CONN_FAIL_MAX_CLIENTS, @@ -3210,4 +3529,62 @@ enum nl80211_scan_flags {  	NL80211_SCAN_FLAG_AP				= 1<<2,  }; +/** + * enum nl80211_acl_policy - access control policy + * + * Access control policy is applied on a MAC list set by + * %NL80211_CMD_START_AP and %NL80211_CMD_SET_MAC_ACL, to + * be used with %NL80211_ATTR_ACL_POLICY. + * + * @NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED: Deny stations which are + *	listed in ACL, i.e. allow all the stations which are not listed + *	in ACL to authenticate. + * @NL80211_ACL_POLICY_DENY_UNLESS_LISTED: Allow the stations which are listed + *	in ACL, i.e. deny all the stations which are not listed in ACL. + */ +enum nl80211_acl_policy { +	NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED, +	NL80211_ACL_POLICY_DENY_UNLESS_LISTED, +}; + +/** + * enum nl80211_radar_event - type of radar event for DFS operation + * + * Type of event to be used with NL80211_ATTR_RADAR_EVENT to inform userspace + * about detected radars or success of the channel available check (CAC) + * + * @NL80211_RADAR_DETECTED: A radar pattern has been detected. The channel is + *	now unusable. + * @NL80211_RADAR_CAC_FINISHED: Channel Availability Check has been finished, + *	the channel is now available. + * @NL80211_RADAR_CAC_ABORTED: Channel Availability Check has been aborted, no + *	change to the channel status. + * @NL80211_RADAR_NOP_FINISHED: The Non-Occupancy Period for this channel is + *	over, channel becomes usable. + */ +enum nl80211_radar_event { +	NL80211_RADAR_DETECTED, +	NL80211_RADAR_CAC_FINISHED, +	NL80211_RADAR_CAC_ABORTED, +	NL80211_RADAR_NOP_FINISHED, +}; + +/** + * enum nl80211_dfs_state - DFS states for channels + * + * Channel states used by the DFS code. + * + * @IEEE80211_DFS_USABLE: The channel can be used, but channel availability + *	check (CAC) must be performed before using it for AP or IBSS. + * @IEEE80211_DFS_UNAVAILABLE: A radar has been detected on this channel, it + *	is therefore marked as not available. + * @IEEE80211_DFS_AVAILABLE: The channel has been CAC checked and is available. + */ + +enum nl80211_dfs_state { +	NL80211_DFS_USABLE, +	NL80211_DFS_UNAVAILABLE, +	NL80211_DFS_AVAILABLE, +}; +  #endif /* __LINUX_NL80211_H */ diff --git a/include/uapi/linux/packet_diag.h b/include/uapi/linux/packet_diag.h index 93f5fa94a43..afafd703ad9 100644 --- a/include/uapi/linux/packet_diag.h +++ b/include/uapi/linux/packet_diag.h @@ -33,9 +33,11 @@ enum {  	PACKET_DIAG_TX_RING,  	PACKET_DIAG_FANOUT, -	PACKET_DIAG_MAX, +	__PACKET_DIAG_MAX,  }; +#define PACKET_DIAG_MAX (__PACKET_DIAG_MAX - 1) +  struct packet_diag_info {  	__u32	pdi_index;  	__u32	pdi_version; diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h index ebfadc56d1b..864e324da80 100644 --- a/include/uapi/linux/pci_regs.h +++ b/include/uapi/linux/pci_regs.h @@ -292,12 +292,12 @@  /* Message Signalled Interrupts registers */ -#define PCI_MSI_FLAGS		2	/* Various flags */ -#define  PCI_MSI_FLAGS_64BIT	0x80	/* 64-bit addresses allowed */ -#define  PCI_MSI_FLAGS_QSIZE	0x70	/* Message queue size configured */ -#define  PCI_MSI_FLAGS_QMASK	0x0e	/* Maximum queue size available */ -#define  PCI_MSI_FLAGS_ENABLE	0x01	/* MSI feature enabled */ -#define  PCI_MSI_FLAGS_MASKBIT	0x100	/* 64-bit mask bits allowed */ +#define PCI_MSI_FLAGS		2	/* Message Control */ +#define  PCI_MSI_FLAGS_ENABLE	0x0001	/* MSI feature enabled */ +#define  PCI_MSI_FLAGS_QMASK	0x000e	/* Maximum queue size available */ +#define  PCI_MSI_FLAGS_QSIZE	0x0070	/* Message queue size configured */ +#define  PCI_MSI_FLAGS_64BIT	0x0080	/* 64-bit addresses allowed */ +#define  PCI_MSI_FLAGS_MASKBIT	0x0100	/* Per-vector masking capable */  #define PCI_MSI_RFU		3	/* Rest of capability flags */  #define PCI_MSI_ADDRESS_LO	4	/* Lower 32 bits */  #define PCI_MSI_ADDRESS_HI	8	/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ @@ -309,13 +309,17 @@  #define PCI_MSI_PENDING_64	20	/* Pending intrs for 64-bit devices */  /* MSI-X registers */ -#define PCI_MSIX_FLAGS		2 -#define  PCI_MSIX_FLAGS_QSIZE	0x7FF -#define  PCI_MSIX_FLAGS_ENABLE	(1 << 15) -#define  PCI_MSIX_FLAGS_MASKALL	(1 << 14) -#define PCI_MSIX_TABLE		4 -#define PCI_MSIX_PBA		8 -#define  PCI_MSIX_FLAGS_BIRMASK	(7 << 0) +#define PCI_MSIX_FLAGS		2	/* Message Control */ +#define  PCI_MSIX_FLAGS_QSIZE	0x07FF	/* Table size */ +#define  PCI_MSIX_FLAGS_MASKALL	0x4000	/* Mask all vectors for this function */ +#define  PCI_MSIX_FLAGS_ENABLE	0x8000	/* MSI-X enable */ +#define PCI_MSIX_TABLE		4	/* Table offset */ +#define  PCI_MSIX_TABLE_BIR	0x00000007 /* BAR index */ +#define  PCI_MSIX_TABLE_OFFSET	0xfffffff8 /* Offset into specified BAR */ +#define PCI_MSIX_PBA		8	/* Pending Bit Array offset */ +#define  PCI_MSIX_PBA_BIR	0x00000007 /* BAR index */ +#define  PCI_MSIX_PBA_OFFSET	0xfffffff8 /* Offset into specified BAR */ +#define  PCI_MSIX_FLAGS_BIRMASK	(7 << 0)   /* deprecated */  #define PCI_CAP_MSIX_SIZEOF	12	/* size of MSIX registers */  /* MSI-X entry's format */ diff --git a/include/uapi/linux/raid/md_p.h b/include/uapi/linux/raid/md_p.h index ee753536ab7..fe1a5406d4d 100644 --- a/include/uapi/linux/raid/md_p.h +++ b/include/uapi/linux/raid/md_p.h @@ -145,16 +145,18 @@ typedef struct mdp_superblock_s {  	__u32 failed_disks;	/*  4 Number of failed disks		      */  	__u32 spare_disks;	/*  5 Number of spare disks		      */  	__u32 sb_csum;		/*  6 checksum of the whole superblock        */ -#ifdef __BIG_ENDIAN +#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN)  	__u32 events_hi;	/*  7 high-order of superblock update count   */  	__u32 events_lo;	/*  8 low-order of superblock update count    */  	__u32 cp_events_hi;	/*  9 high-order of checkpoint update count   */  	__u32 cp_events_lo;	/* 10 low-order of checkpoint update count    */ -#else +#elif defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN)  	__u32 events_lo;	/*  7 low-order of superblock update count    */  	__u32 events_hi;	/*  8 high-order of superblock update count   */  	__u32 cp_events_lo;	/*  9 low-order of checkpoint update count    */  	__u32 cp_events_hi;	/* 10 high-order of checkpoint update count   */ +#else +#error unspecified endianness  #endif  	__u32 recovery_cp;	/* 11 recovery checkpoint sector count	      */  	/* There are only valid for minor_version > 90 */ diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 7a5eb196ade..7a2144e1afa 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h @@ -630,6 +630,7 @@ struct tcamsg {  /* New extended info filters for IFLA_EXT_MASK */  #define RTEXT_FILTER_VF		(1 << 0) +#define RTEXT_FILTER_BRVLAN	(1 << 1)  /* End of information exported to user level */ diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h index 2c6c85f18ea..74c2bf7211f 100644 --- a/include/uapi/linux/serial_core.h +++ b/include/uapi/linux/serial_core.h @@ -50,8 +50,11 @@  #define PORT_LPC3220	22	/* NXP LPC32xx SoC "Standard" UART */  #define PORT_8250_CIR	23	/* CIR infrared port, has its own driver */  #define PORT_XR17V35X	24	/* Exar XR17V35x UARTs */ -#define PORT_BRCM_TRUMANAGE	24 -#define PORT_MAX_8250	25	/* max port ID */ +#define PORT_BRCM_TRUMANAGE	25 +#define PORT_ALTR_16550_F32 26	/* Altera 16550 UART with 32 FIFOs */ +#define PORT_ALTR_16550_F64 27	/* Altera 16550 UART with 64 FIFOs */ +#define PORT_ALTR_16550_F128 28 /* Altera 16550 UART with 128 FIFOs */ +#define PORT_MAX_8250	28	/* max port ID */  /*   * ARM specific type numbers.  These are not currently guaranteed @@ -220,4 +223,7 @@  /* ARC (Synopsys) on-chip UART */  #define PORT_ARC       101 +/* Rocketport EXPRESS/INFINITY */ +#define PORT_RP2	102 +  #endif /* _UAPILINUX_SERIAL_CORE_H */ diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h index fdfba235f9f..b49eab89c9f 100644 --- a/include/uapi/linux/snmp.h +++ b/include/uapi/linux/snmp.h @@ -278,6 +278,7 @@ enum  	LINUX_MIB_XFRMOUTPOLDEAD,		/* XfrmOutPolDead */  	LINUX_MIB_XFRMOUTPOLERROR,		/* XfrmOutPolError */  	LINUX_MIB_XFRMFWDHDRERROR,		/* XfrmFwdHdrError*/ +	LINUX_MIB_XFRMOUTSTATEINVALID,		/* XfrmOutStateInvalid */  	__LINUX_MIB_XFRMMAX  }; diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h index e962faa5ab0..6b1ead0b0c9 100644 --- a/include/uapi/linux/tcp.h +++ b/include/uapi/linux/tcp.h @@ -111,6 +111,7 @@ enum {  #define TCP_QUEUE_SEQ		21  #define TCP_REPAIR_OPTIONS	22  #define TCP_FASTOPEN		23	/* Enable FastOpen on listeners */ +#define TCP_TIMESTAMP		24  struct tcp_repair_opt {  	__u32	opt_code; diff --git a/include/uapi/linux/uhid.h b/include/uapi/linux/uhid.h index 9c6974f1696..e9ed951e2b0 100644 --- a/include/uapi/linux/uhid.h +++ b/include/uapi/linux/uhid.h @@ -86,7 +86,7 @@ struct uhid_feature_answer_req {  	__u16 err;  	__u16 size;  	__u8 data[UHID_DATA_MAX]; -}; +} __attribute__((__packed__));  struct uhid_event {  	__u32 type; diff --git a/include/uapi/linux/unix_diag.h b/include/uapi/linux/unix_diag.h index b8a24941db2..b9e2a6a7446 100644 --- a/include/uapi/linux/unix_diag.h +++ b/include/uapi/linux/unix_diag.h @@ -39,9 +39,11 @@ enum {  	UNIX_DIAG_MEMINFO,  	UNIX_DIAG_SHUTDOWN, -	UNIX_DIAG_MAX, +	__UNIX_DIAG_MAX,  }; +#define UNIX_DIAG_MAX (__UNIX_DIAG_MAX - 1) +  struct unix_diag_vfs {  	__u32	udiag_vfs_ino;  	__u32	udiag_vfs_dev; diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h index ac90037894d..d2314be4f0c 100644 --- a/include/uapi/linux/usb/audio.h +++ b/include/uapi/linux/usb/audio.h @@ -384,14 +384,16 @@ static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_de  						   int protocol)  {  	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol); -	return desc->baSourceID[desc->bNrInPins + control_size]; +	return *(uac_processing_unit_bmControls(desc, protocol) +			+ control_size);  }  static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,  						 int protocol)  {  	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol); -	return &desc->baSourceID[desc->bNrInPins + control_size + 1]; +	return uac_processing_unit_bmControls(desc, protocol) +			+ control_size + 1;  }  /* 4.5.2 Class-Specific AS Interface Descriptor */ diff --git a/include/uapi/linux/usb/cdc-wdm.h b/include/uapi/linux/usb/cdc-wdm.h new file mode 100644 index 00000000000..f03134feebd --- /dev/null +++ b/include/uapi/linux/usb/cdc-wdm.h @@ -0,0 +1,21 @@ +/* + * USB CDC Device Management userspace API definitions + * + * 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 _UAPI__LINUX_USB_CDC_WDM_H +#define _UAPI__LINUX_USB_CDC_WDM_H + +/* + * This IOCTL is used to retrieve the wMaxCommand for the device, + * defining the message limit for both reading and writing. + * + * For CDC WDM functions this will be the wMaxCommand field of the + * Device Management Functional Descriptor. + */ +#define IOCTL_WDM_MAX_COMMAND _IOR('H', 0xA0, __u16) + +#endif /* _UAPI__LINUX_USB_CDC_WDM_H */ diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h index f738e25377f..aa33fd1b2d4 100644 --- a/include/uapi/linux/usb/ch9.h +++ b/include/uapi/linux/usb/ch9.h @@ -138,7 +138,7 @@  /*   * New Feature Selectors as added by USB 3.0 - * See USB 3.0 spec Table 9-6 + * See USB 3.0 spec Table 9-7   */  #define USB_DEVICE_U1_ENABLE	48	/* dev may initiate U1 transition */  #define USB_DEVICE_U2_ENABLE	49	/* dev may initiate U2 transition */ @@ -147,7 +147,7 @@  #define USB_INTR_FUNC_SUSPEND_OPT_MASK	0xFF00  /* - * Suspend Options, Table 9-7 USB 3.0 spec + * Suspend Options, Table 9-8 USB 3.0 spec   */  #define USB_INTRF_FUNC_SUSPEND_LP	(1 << (8 + 0))  #define USB_INTRF_FUNC_SUSPEND_RW	(1 << (8 + 1)) diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index f56c945cecd..dcd63745e83 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -88,10 +88,6 @@  #define V4L2_CID_HFLIP			(V4L2_CID_BASE+20)  #define V4L2_CID_VFLIP			(V4L2_CID_BASE+21) -/* Deprecated; use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET */ -#define V4L2_CID_HCENTER		(V4L2_CID_BASE+22) -#define V4L2_CID_VCENTER		(V4L2_CID_BASE+23) -  #define V4L2_CID_POWER_LINE_FREQUENCY	(V4L2_CID_BASE+24)  enum v4l2_power_line_frequency {  	V4L2_CID_POWER_LINE_FREQUENCY_DISABLED	= 0, @@ -144,6 +140,11 @@ enum v4l2_colorfx {  /* last CID + 1 */  #define V4L2_CID_LASTP1                         (V4L2_CID_BASE+43) +/* USER-class private control IDs */ + +/* The base for the meye driver controls. See linux/meye.h for the list + * of controls. We reserve 16 controls for this driver. */ +#define V4L2_CID_USER_MEYE_BASE			(V4L2_CID_USER_BASE + 0x1000)  /* MPEG-class control IDs */ @@ -782,6 +783,7 @@ enum v4l2_jpeg_chroma_subsampling {  #define	V4L2_JPEG_ACTIVE_MARKER_DQT		(1 << 17)  #define	V4L2_JPEG_ACTIVE_MARKER_DHT		(1 << 18) +  /* Image source controls */  #define V4L2_CID_IMAGE_SOURCE_CLASS_BASE	(V4L2_CTRL_CLASS_IMAGE_SOURCE | 0x900)  #define V4L2_CID_IMAGE_SOURCE_CLASS		(V4L2_CTRL_CLASS_IMAGE_SOURCE | 1) @@ -800,4 +802,27 @@ enum v4l2_jpeg_chroma_subsampling {  #define V4L2_CID_PIXEL_RATE			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 2)  #define V4L2_CID_TEST_PATTERN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 3) + +/*  DV-class control IDs defined by V4L2 */ +#define V4L2_CID_DV_CLASS_BASE			(V4L2_CTRL_CLASS_DV | 0x900) +#define V4L2_CID_DV_CLASS			(V4L2_CTRL_CLASS_DV | 1) + +#define	V4L2_CID_DV_TX_HOTPLUG			(V4L2_CID_DV_CLASS_BASE + 1) +#define	V4L2_CID_DV_TX_RXSENSE			(V4L2_CID_DV_CLASS_BASE + 2) +#define	V4L2_CID_DV_TX_EDID_PRESENT		(V4L2_CID_DV_CLASS_BASE + 3) +#define	V4L2_CID_DV_TX_MODE			(V4L2_CID_DV_CLASS_BASE + 4) +enum v4l2_dv_tx_mode { +	V4L2_DV_TX_MODE_DVI_D	= 0, +	V4L2_DV_TX_MODE_HDMI	= 1, +}; +#define V4L2_CID_DV_TX_RGB_RANGE		(V4L2_CID_DV_CLASS_BASE + 5) +enum v4l2_dv_rgb_range { +	V4L2_DV_RGB_RANGE_AUTO	  = 0, +	V4L2_DV_RGB_RANGE_LIMITED = 1, +	V4L2_DV_RGB_RANGE_FULL	  = 2, +}; + +#define	V4L2_CID_DV_RX_POWER_PRESENT		(V4L2_CID_DV_CLASS_BASE + 100) +#define V4L2_CID_DV_RX_RGB_RANGE		(V4L2_CID_DV_CLASS_BASE + 101) +  #endif diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/linux/v4l2-mediabus.h index 7d64e0e1a18..b9b7bea0453 100644 --- a/include/uapi/linux/v4l2-mediabus.h +++ b/include/uapi/linux/v4l2-mediabus.h @@ -47,8 +47,9 @@ enum v4l2_mbus_pixelcode {  	V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,  	V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008, -	/* YUV (including grey) - next is 0x2014 */ +	/* YUV (including grey) - next is 0x2017 */  	V4L2_MBUS_FMT_Y8_1X8 = 0x2001, +	V4L2_MBUS_FMT_UV8_1X8 = 0x2015,  	V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002,  	V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003,  	V4L2_MBUS_FMT_YUYV8_1_5X8 = 0x2004, @@ -65,14 +66,20 @@ enum v4l2_mbus_pixelcode {  	V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010,  	V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011,  	V4L2_MBUS_FMT_YVYU8_1X16 = 0x2012, +	V4L2_MBUS_FMT_YDYUYDYV8_1X16 = 0x2014,  	V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d,  	V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e, +	V4L2_MBUS_FMT_YUV10_1X30 = 0x2016, -	/* Bayer - next is 0x3015 */ +	/* Bayer - next is 0x3019 */  	V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001,  	V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013,  	V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002,  	V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014, +	V4L2_MBUS_FMT_SBGGR10_ALAW8_1X8 = 0x3015, +	V4L2_MBUS_FMT_SGBRG10_ALAW8_1X8 = 0x3016, +	V4L2_MBUS_FMT_SGRBG10_ALAW8_1X8 = 0x3017, +	V4L2_MBUS_FMT_SRGGB10_ALAW8_1X8 = 0x3018,  	V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b,  	V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c,  	V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009, diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 4758d1bfcf4..4f41f309911 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -303,6 +303,15 @@ enum {  	VFIO_PCI_BAR5_REGION_INDEX,  	VFIO_PCI_ROM_REGION_INDEX,  	VFIO_PCI_CONFIG_REGION_INDEX, +	/* +	 * Expose VGA regions defined for PCI base class 03, subclass 00. +	 * This includes I/O port ranges 0x3b0 to 0x3bb and 0x3c0 to 0x3df +	 * as well as the MMIO range 0xa0000 to 0xbffff.  Each implemented +	 * range is found at it's identity mapped offset from the region +	 * offset, for example 0x3b0 is region_info.offset + 0x3b0.  Areas +	 * between described ranges are unimplemented. +	 */ +	VFIO_PCI_VGA_REGION_INDEX,  	VFIO_PCI_NUM_REGIONS  }; diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index 3cf3e946e33..234d1d87091 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -334,6 +334,9 @@ struct v4l2_pix_format {  /* Palette formats */  #define V4L2_PIX_FMT_PAL8    v4l2_fourcc('P', 'A', 'L', '8') /*  8  8-bit palette */ +/* Chrominance formats */ +#define V4L2_PIX_FMT_UV8     v4l2_fourcc('U', 'V', '8', ' ') /*  8  UV 4:4 */ +  /* Luminance+Chrominance formats */  #define V4L2_PIX_FMT_YVU410  v4l2_fourcc('Y', 'V', 'U', '9') /*  9  YVU 4:1:0     */  #define V4L2_PIX_FMT_YVU420  v4l2_fourcc('Y', 'V', '1', '2') /* 12  YVU 4:2:0     */ @@ -386,6 +389,11 @@ struct v4l2_pix_format {  #define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2') /* 12  GBGB.. RGRG.. */  #define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2') /* 12  GRGR.. BGBG.. */  #define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2') /* 12  RGRG.. GBGB.. */ +	/* 10bit raw bayer a-law compressed to 8 bits */ +#define V4L2_PIX_FMT_SBGGR10ALAW8 v4l2_fourcc('a', 'B', 'A', '8') +#define V4L2_PIX_FMT_SGBRG10ALAW8 v4l2_fourcc('a', 'G', 'A', '8') +#define V4L2_PIX_FMT_SGRBG10ALAW8 v4l2_fourcc('a', 'g', 'A', '8') +#define V4L2_PIX_FMT_SRGGB10ALAW8 v4l2_fourcc('a', 'R', 'A', '8')  	/* 10bit raw bayer DPCM compressed to 8 bits */  #define V4L2_PIX_FMT_SBGGR10DPCM8 v4l2_fourcc('b', 'B', 'A', '8')  #define V4L2_PIX_FMT_SGBRG10DPCM8 v4l2_fourcc('b', 'G', 'A', '8') @@ -693,6 +701,10 @@ struct v4l2_buffer {  /* Cache handling flags */  #define V4L2_BUF_FLAG_NO_CACHE_INVALIDATE	0x0800  #define V4L2_BUF_FLAG_NO_CACHE_CLEAN		0x1000 +/* Timestamp type */ +#define V4L2_BUF_FLAG_TIMESTAMP_MASK		0xe000 +#define V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN		0x0000 +#define V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC	0x2000  /**   * struct v4l2_exportbuffer - export of video buffer as DMABUF file descriptor @@ -1342,28 +1354,6 @@ struct v4l2_querymenu {  #define V4L2_CID_PRIVATE_BASE		0x08000000 -/*  DV-class control IDs defined by V4L2 */ -#define V4L2_CID_DV_CLASS_BASE			(V4L2_CTRL_CLASS_DV | 0x900) -#define V4L2_CID_DV_CLASS			(V4L2_CTRL_CLASS_DV | 1) - -#define	V4L2_CID_DV_TX_HOTPLUG			(V4L2_CID_DV_CLASS_BASE + 1) -#define	V4L2_CID_DV_TX_RXSENSE			(V4L2_CID_DV_CLASS_BASE + 2) -#define	V4L2_CID_DV_TX_EDID_PRESENT		(V4L2_CID_DV_CLASS_BASE + 3) -#define	V4L2_CID_DV_TX_MODE			(V4L2_CID_DV_CLASS_BASE + 4) -enum v4l2_dv_tx_mode { -	V4L2_DV_TX_MODE_DVI_D	= 0, -	V4L2_DV_TX_MODE_HDMI	= 1, -}; -#define V4L2_CID_DV_TX_RGB_RANGE		(V4L2_CID_DV_CLASS_BASE + 5) -enum v4l2_dv_rgb_range { -	V4L2_DV_RGB_RANGE_AUTO	  = 0, -	V4L2_DV_RGB_RANGE_LIMITED = 1, -	V4L2_DV_RGB_RANGE_FULL	  = 2, -}; - -#define	V4L2_CID_DV_RX_POWER_PRESENT		(V4L2_CID_DV_CLASS_BASE + 100) -#define V4L2_CID_DV_RX_RGB_RANGE		(V4L2_CID_DV_CLASS_BASE + 101) -  /*   *	T U N I N G   */ @@ -1810,6 +1800,7 @@ struct v4l2_event_vsync {  /* Payload for V4L2_EVENT_CTRL */  #define V4L2_EVENT_CTRL_CH_VALUE		(1 << 0)  #define V4L2_EVENT_CTRL_CH_FLAGS		(1 << 1) +#define V4L2_EVENT_CTRL_CH_RANGE		(1 << 2)  struct v4l2_event_ctrl {  	__u32 changes; diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h index 848e3584d7c..a5a8c88753b 100644 --- a/include/uapi/linux/virtio_net.h +++ b/include/uapi/linux/virtio_net.h @@ -53,6 +53,7 @@  					 * network */  #define VIRTIO_NET_F_MQ	22	/* Device supports Receive Flow  					 * Steering */ +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23	/* Set MAC address */  #define VIRTIO_NET_S_LINK_UP	1	/* Link is up */  #define VIRTIO_NET_S_ANNOUNCE	2	/* Announcement is needed */ @@ -127,7 +128,7 @@ typedef __u8 virtio_net_ctrl_ack;   #define VIRTIO_NET_CTRL_RX_NOBCAST      5  /* - * Control the MAC filter table. + * Control the MAC   *   * The MAC filter table is managed by the hypervisor, the guest should   * assume the size is infinite.  Filtering should be considered @@ -140,6 +141,10 @@ typedef __u8 virtio_net_ctrl_ack;   * first sg list contains unicast addresses, the second is for multicast.   * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature   * is available. + * + * The ADDR_SET command requests one out scatterlist, it contains a + * 6 bytes MAC address. This functionality is present if the + * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.   */  struct virtio_net_ctrl_mac {  	__u32 entries; @@ -148,6 +153,7 @@ struct virtio_net_ctrl_mac {  #define VIRTIO_NET_CTRL_MAC    1   #define VIRTIO_NET_CTRL_MAC_TABLE_SET        0 + #define VIRTIO_NET_CTRL_MAC_ADDR_SET         1  /*   * Control VLAN filtering diff --git a/include/uapi/linux/vm_sockets.h b/include/uapi/linux/vm_sockets.h new file mode 100644 index 00000000000..df91301847e --- /dev/null +++ b/include/uapi/linux/vm_sockets.h @@ -0,0 +1,163 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2007-2013 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + */ + +#ifndef _VM_SOCKETS_H_ +#define _VM_SOCKETS_H_ + +#if !defined(__KERNEL__) +#include <sys/socket.h> +#endif + +/* Option name for STREAM socket buffer size.  Use as the option name in + * setsockopt(3) or getsockopt(3) to set or get an unsigned long long that + * specifies the size of the buffer underlying a vSockets STREAM socket. + * Value is clamped to the MIN and MAX. + */ + +#define SO_VM_SOCKETS_BUFFER_SIZE 0 + +/* Option name for STREAM socket minimum buffer size.  Use as the option name + * in setsockopt(3) or getsockopt(3) to set or get an unsigned long long that + * specifies the minimum size allowed for the buffer underlying a vSockets + * STREAM socket. + */ + +#define SO_VM_SOCKETS_BUFFER_MIN_SIZE 1 + +/* Option name for STREAM socket maximum buffer size.  Use as the option name + * in setsockopt(3) or getsockopt(3) to set or get an unsigned long long + * that specifies the maximum size allowed for the buffer underlying a + * vSockets STREAM socket. + */ + +#define SO_VM_SOCKETS_BUFFER_MAX_SIZE 2 + +/* Option name for socket peer's host-specific VM ID.  Use as the option name + * in getsockopt(3) to get a host-specific identifier for the peer endpoint's + * VM.  The identifier is a signed integer. + * Only available for hypervisor endpoints. + */ + +#define SO_VM_SOCKETS_PEER_HOST_VM_ID 3 + +/* Option name for determining if a socket is trusted.  Use as the option name + * in getsockopt(3) to determine if a socket is trusted.  The value is a + * signed integer. + */ + +#define SO_VM_SOCKETS_TRUSTED 5 + +/* Option name for STREAM socket connection timeout.  Use as the option name + * in setsockopt(3) or getsockopt(3) to set or get the connection + * timeout for a STREAM socket. + */ + +#define SO_VM_SOCKETS_CONNECT_TIMEOUT 6 + +/* Option name for using non-blocking send/receive.  Use as the option name + * for setsockopt(3) or getsockopt(3) to set or get the non-blocking + * transmit/receive flag for a STREAM socket.  This flag determines whether + * send() and recv() can be called in non-blocking contexts for the given + * socket.  The value is a signed integer. + * + * This option is only relevant to kernel endpoints, where descheduling the + * thread of execution is not allowed, for example, while holding a spinlock. + * It is not to be confused with conventional non-blocking socket operations. + * + * Only available for hypervisor endpoints. + */ + +#define SO_VM_SOCKETS_NONBLOCK_TXRX 7 + +/* The vSocket equivalent of INADDR_ANY.  This works for the svm_cid field of + * sockaddr_vm and indicates the context ID of the current endpoint. + */ + +#define VMADDR_CID_ANY -1U + +/* Bind to any available port.  Works for the svm_port field of + * sockaddr_vm. + */ + +#define VMADDR_PORT_ANY -1U + +/* Use this as the destination CID in an address when referring to the + * hypervisor.  VMCI relies on it being 0, but this would be useful for other + * transports too. + */ + +#define VMADDR_CID_HYPERVISOR 0 + +/* This CID is specific to VMCI and can be considered reserved (even VMCI + * doesn't use it anymore, it's a legacy value from an older release). + */ + +#define VMADDR_CID_RESERVED 1 + +/* Use this as the destination CID in an address when referring to the host + * (any process other than the hypervisor).  VMCI relies on it being 2, but + * this would be useful for other transports too. + */ + +#define VMADDR_CID_HOST 2 + +/* Invalid vSockets version. */ + +#define VM_SOCKETS_INVALID_VERSION -1U + +/* The epoch (first) component of the vSockets version.  A single byte + * representing the epoch component of the vSockets version. + */ + +#define VM_SOCKETS_VERSION_EPOCH(_v) (((_v) & 0xFF000000) >> 24) + +/* The major (second) component of the vSockets version.   A single byte + * representing the major component of the vSockets version.  Typically + * changes for every major release of a product. + */ + +#define VM_SOCKETS_VERSION_MAJOR(_v) (((_v) & 0x00FF0000) >> 16) + +/* The minor (third) component of the vSockets version.  Two bytes representing + * the minor component of the vSockets version. + */ + +#define VM_SOCKETS_VERSION_MINOR(_v) (((_v) & 0x0000FFFF)) + +/* Address structure for vSockets.   The address family should be set to + * whatever vmci_sock_get_af_value_fd() returns.  The structure members should + * all align on their natural boundaries without resorting to compiler packing + * directives.  The total size of this structure should be exactly the same as + * that of struct sockaddr. + */ + +struct sockaddr_vm { +	sa_family_t svm_family; +	unsigned short svm_reserved1; +	unsigned int svm_port; +	unsigned int svm_cid; +	unsigned char svm_zero[sizeof(struct sockaddr) - +			       sizeof(sa_family_t) - +			       sizeof(unsigned short) - +			       sizeof(unsigned int) - sizeof(unsigned int)]; +}; + +#define IOCTL_VM_SOCKETS_GET_LOCAL_CID		_IO(7, 0xb9) + +#if defined(__KERNEL__) +int vm_sockets_get_local_cid(void); +#endif + +#endif diff --git a/include/uapi/linux/wanrouter.h b/include/uapi/linux/wanrouter.h index 7617df2833d..498d6c12c66 100644 --- a/include/uapi/linux/wanrouter.h +++ b/include/uapi/linux/wanrouter.h @@ -1,363 +1,9 @@ -/***************************************************************************** -* wanrouter.h	Definitions for the WAN Multiprotocol Router Module. -*		This module provides API and common services for WAN Link -*		Drivers and is completely hardware-independent. -* -* Author: 	Nenad Corbic <ncorbic@sangoma.com> -*		Gideon Hack 	 -* Additions:	Arnaldo Melo -* -* Copyright:	(c) 1995-2000 Sangoma Technologies Inc. -* -*		This program is free software; you can redistribute it and/or -*		modify it under the terms of the GNU General Public License -*		as published by the Free Software Foundation; either version -*		2 of the License, or (at your option) any later version. -* ============================================================================ -* Jul 21, 2000  Nenad Corbic	Added WAN_FT1_READY State -* Feb 24, 2000  Nenad Corbic    Added support for socket based x25api -* Jan 28, 2000  Nenad Corbic    Added support for the ASYNC protocol. -* Oct 04, 1999  Nenad Corbic 	Updated for 2.1.0 release -* Jun 02, 1999  Gideon Hack	Added support for the S514 adapter. -* May 23, 1999	Arnaldo Melo	Added local_addr to wanif_conf_t -*				WAN_DISCONNECTING state added -* Jul 20, 1998	David Fong	Added Inverse ARP options to 'wanif_conf_t' -* Jun 12, 1998	David Fong	Added Cisco HDLC support. -* Dec 16, 1997	Jaspreet Singh	Moved 'enable_IPX' and 'network_number' to -*				'wanif_conf_t' -* Dec 05, 1997	Jaspreet Singh	Added 'pap', 'chap' to 'wanif_conf_t' -*				Added 'authenticator' to 'wan_ppp_conf_t' -* Nov 06, 1997	Jaspreet Singh	Changed Router Driver version to 1.1 from 1.0 -* Oct 20, 1997	Jaspreet Singh	Added 'cir','bc','be' and 'mc' to 'wanif_conf_t' -*				Added 'enable_IPX' and 'network_number' to  -*				'wan_device_t'.  Also added defines for -*				UDP PACKET TYPE, Interrupt test, critical values -*				for RACE conditions. -* Oct 05, 1997	Jaspreet Singh	Added 'dlci_num' and 'dlci[100]' to  -*				'wan_fr_conf_t' to configure a list of dlci(s) -*				for a NODE  -* Jul 07, 1997	Jaspreet Singh	Added 'ttl' to 'wandev_conf_t' & 'wan_device_t' -* May 29, 1997 	Jaspreet Singh	Added 'tx_int_enabled' to 'wan_device_t' -* May 21, 1997	Jaspreet Singh	Added 'udp_port' to 'wan_device_t' -* Apr 25, 1997  Farhan Thawar   Added 'udp_port' to 'wandev_conf_t' -* Jan 16, 1997	Gene Kozin	router_devlist made public -* Jan 02, 1997	Gene Kozin	Initial version (based on wanpipe.h). -*****************************************************************************/ - -#ifndef _UAPI_ROUTER_H -#define _UAPI_ROUTER_H - -#define	ROUTER_NAME	"wanrouter"	/* in case we ever change it */ -#define	ROUTER_VERSION	1		/* version number */ -#define	ROUTER_RELEASE	1		/* release (minor version) number */ -#define	ROUTER_IOCTL	'W'		/* for IOCTL calls */ -#define	ROUTER_MAGIC	0x524D4157L	/* signature: 'WANR' reversed */ - -/* IOCTL codes for /proc/router/<device> entries (up to 255) */ -enum router_ioctls -{ -	ROUTER_SETUP	= ROUTER_IOCTL<<8,	/* configure device */ -	ROUTER_DOWN,				/* shut down device */ -	ROUTER_STAT,				/* get device status */ -	ROUTER_IFNEW,				/* add interface */ -	ROUTER_IFDEL,				/* delete interface */ -	ROUTER_IFSTAT,				/* get interface status */ -	ROUTER_USER	= (ROUTER_IOCTL<<8)+16,	/* driver-specific calls */ -	ROUTER_USER_MAX	= (ROUTER_IOCTL<<8)+31 -}; - -/* identifiers for displaying proc file data for dual port adapters */ -#define PROC_DATA_PORT_0 0x8000	/* the data is for port 0 */ -#define PROC_DATA_PORT_1 0x8001	/* the data is for port 1 */ - -/* NLPID for packet encapsulation (ISO/IEC TR 9577) */ -#define	NLPID_IP	0xCC	/* Internet Protocol Datagram */ -#define	NLPID_SNAP	0x80	/* IEEE Subnetwork Access Protocol */ -#define	NLPID_CLNP	0x81	/* ISO/IEC 8473 */ -#define	NLPID_ESIS	0x82	/* ISO/IEC 9542 */ -#define	NLPID_ISIS	0x83	/* ISO/IEC ISIS */ -#define	NLPID_Q933	0x08	/* CCITT Q.933 */ - -/* Miscellaneous */ -#define	WAN_IFNAME_SZ	15	/* max length of the interface name */ -#define	WAN_DRVNAME_SZ	15	/* max length of the link driver name */ -#define	WAN_ADDRESS_SZ	31	/* max length of the WAN media address */ -#define USED_BY_FIELD	8	/* max length of the used by field */ - -/* Defines for UDP PACKET TYPE */ -#define UDP_PTPIPE_TYPE 	0x01 -#define UDP_FPIPE_TYPE		0x02 -#define UDP_CPIPE_TYPE		0x03 -#define UDP_DRVSTATS_TYPE 	0x04 -#define UDP_INVALID_TYPE  	0x05 - -/* Command return code */ -#define CMD_OK		0		/* normal firmware return code */ -#define CMD_TIMEOUT	0xFF		/* firmware command timed out */ - -/* UDP Packet Management */ -#define UDP_PKT_FRM_STACK	0x00 -#define UDP_PKT_FRM_NETWORK	0x01 - -/* Maximum interrupt test counter */ -#define MAX_INTR_TEST_COUNTER	100 - -/* Critical Values for RACE conditions*/ -#define CRITICAL_IN_ISR		0xA1 -#define CRITICAL_INTR_HANDLED	0xB1 - -/****** Data Types **********************************************************/ - -/*---------------------------------------------------------------------------- - * X.25-specific link-level configuration. - */ -typedef struct wan_x25_conf -{ -	unsigned lo_pvc;	/* lowest permanent circuit number */ -	unsigned hi_pvc;	/* highest permanent circuit number */ -	unsigned lo_svc;	/* lowest switched circuit number */ -	unsigned hi_svc;	/* highest switched circuit number */ -	unsigned hdlc_window;	/* HDLC window size (1..7) */ -	unsigned pkt_window;	/* X.25 packet window size (1..7) */ -	unsigned t1;		/* HDLC timer T1, sec (1..30) */ -	unsigned t2;		/* HDLC timer T2, sec (0..29) */ -	unsigned t4;		/* HDLC supervisory frame timer = T4 * T1 */ -	unsigned n2;		/* HDLC retransmission limit (1..30) */ -	unsigned t10_t20;	/* X.25 RESTART timeout, sec (1..255) */ -	unsigned t11_t21;	/* X.25 CALL timeout, sec (1..255) */ -	unsigned t12_t22;	/* X.25 RESET timeout, sec (1..255) */ -	unsigned t13_t23;	/* X.25 CLEAR timeout, sec (1..255) */ -	unsigned t16_t26;	/* X.25 INTERRUPT timeout, sec (1..255) */ -	unsigned t28;		/* X.25 REGISTRATION timeout, sec (1..255) */ -	unsigned r10_r20;	/* RESTART retransmission limit (0..250) */ -	unsigned r12_r22;	/* RESET retransmission limit (0..250) */ -	unsigned r13_r23;	/* CLEAR retransmission limit (0..250) */ -	unsigned ccitt_compat;	/* compatibility mode: 1988/1984/1980 */ -	unsigned x25_conf_opt;   /* User defined x25 config optoins */ -	unsigned char LAPB_hdlc_only; /* Run in HDLC only mode */ -	unsigned char logging;   /* Control connection logging */   -	unsigned char oob_on_modem; /* Whether to send modem status to the user app */ -} wan_x25_conf_t; - -/*---------------------------------------------------------------------------- - * Frame relay specific link-level configuration. - */ -typedef struct wan_fr_conf -{ -	unsigned signalling;	/* local in-channel signalling type */ -	unsigned t391;		/* link integrity verification timer */ -	unsigned t392;		/* polling verification timer */ -	unsigned n391;		/* full status polling cycle counter */ -	unsigned n392;		/* error threshold counter */ -	unsigned n393;		/* monitored events counter */ -	unsigned dlci_num;	/* number of DLCs (access node) */ -	unsigned  dlci[100];    /* List of all DLCIs */ -} wan_fr_conf_t; - -/*---------------------------------------------------------------------------- - * PPP-specific link-level configuration. - */ -typedef struct wan_ppp_conf -{ -	unsigned restart_tmr;	/* restart timer */ -	unsigned auth_rsrt_tmr;	/* authentication timer */ -	unsigned auth_wait_tmr;	/* authentication timer */ -	unsigned mdm_fail_tmr;	/* modem failure timer */ -	unsigned dtr_drop_tmr;	/* DTR drop timer */ -	unsigned connect_tmout;	/* connection timeout */ -	unsigned conf_retry;	/* max. retry */ -	unsigned term_retry;	/* max. retry */ -	unsigned fail_retry;	/* max. retry */ -	unsigned auth_retry;	/* max. retry */ -	unsigned auth_options;	/* authentication opt. */ -	unsigned ip_options;	/* IP options */ -	char	authenticator;	/* AUTHENTICATOR or not */ -	char	ip_mode;	/* Static/Host/Peer */ -} wan_ppp_conf_t; - -/*---------------------------------------------------------------------------- - * CHDLC-specific link-level configuration. - */ -typedef struct wan_chdlc_conf -{ -	unsigned char ignore_dcd;	/* Protocol options:		*/ -	unsigned char ignore_cts;	/*  Ignore these to determine	*/ -	unsigned char ignore_keepalive;	/*  link status (Yes or No)	*/ -	unsigned char hdlc_streaming;	/*  hdlc_streaming mode (Y/N) */ -	unsigned char receive_only;	/*  no transmit buffering (Y/N) */ -	unsigned keepalive_tx_tmr;	/* transmit keepalive timer */ -	unsigned keepalive_rx_tmr;	/* receive  keepalive timer */ -	unsigned keepalive_err_margin;	/* keepalive_error_tolerance */ -	unsigned slarp_timer;		/* SLARP request timer */ -} wan_chdlc_conf_t; - - -/*---------------------------------------------------------------------------- - * WAN device configuration. Passed to ROUTER_SETUP IOCTL. - */ -typedef struct wandev_conf -{ -	unsigned magic;		/* magic number (for verification) */ -	unsigned config_id;	/* configuration structure identifier */ -				/****** hardware configuration ******/ -	unsigned ioport;	/* adapter I/O port base */ -	unsigned long maddr;	/* dual-port memory address */ -	unsigned msize;		/* dual-port memory size */ -	int irq;		/* interrupt request level */ -	int dma;		/* DMA request level */ -        char S514_CPU_no[1];	/* S514 PCI adapter CPU number ('A' or 'B') */ -        unsigned PCI_slot_no;	/* S514 PCI adapter slot number */ -	char auto_pci_cfg;	/* S515 PCI automatic slot detection */ -	char comm_port;		/* Communication Port (PRI=0, SEC=1) */  -	unsigned bps;		/* data transfer rate */ -	unsigned mtu;		/* maximum transmit unit size */ -        unsigned udp_port;      /* UDP port for management */ -	unsigned char ttl;	/* Time To Live for UDP security */ -	unsigned char ft1;	/* FT1 Configurator Option */ -        char interface;		/* RS-232/V.35, etc. */ -	char clocking;		/* external/internal */ -	char line_coding;	/* NRZ/NRZI/FM0/FM1, etc. */ -	char station;		/* DTE/DCE, primary/secondary, etc. */ -	char connection;	/* permanent/switched/on-demand */ -	char read_mode;		/* read mode: Polling or interrupt */ -	char receive_only;	/* disable tx buffers */ -	char tty;		/* Create a fake tty device */ -	unsigned tty_major;	/* Major number for wanpipe tty device */ -	unsigned tty_minor; 	/* Minor number for wanpipe tty device */ -	unsigned tty_mode;	/* TTY operation mode SYNC or ASYNC */ -	char backup;		/* Backup Mode */ -	unsigned hw_opt[4];	/* other hardware options */ -	unsigned reserved[4]; -				/****** arbitrary data ***************/ -	unsigned data_size;	/* data buffer size */ -	void* data;		/* data buffer, e.g. firmware */ -	union			/****** protocol-specific ************/ -	{ -		wan_x25_conf_t x25;	/* X.25 configuration */ -		wan_ppp_conf_t ppp;	/* PPP configuration */ -		wan_fr_conf_t fr;	/* frame relay configuration */ -		wan_chdlc_conf_t chdlc;	/* Cisco HDLC configuration */ -	} u; -} wandev_conf_t; - -/* 'config_id' definitions */ -#define	WANCONFIG_X25	101	/* X.25 link */ -#define	WANCONFIG_FR	102	/* frame relay link */ -#define	WANCONFIG_PPP	103	/* synchronous PPP link */ -#define WANCONFIG_CHDLC	104	/* Cisco HDLC Link */ -#define WANCONFIG_BSC	105	/* BiSync Streaming */ -#define WANCONFIG_HDLC	106	/* HDLC Support */ -#define WANCONFIG_MPPP  107	/* Multi Port PPP over RAW CHDLC */ -  /* - * Configuration options defines. + * wanrouter.h	Legacy declarations kept around until X25 is removed   */ -/* general options */ -#define	WANOPT_OFF	0 -#define	WANOPT_ON	1 -#define	WANOPT_NO	0 -#define	WANOPT_YES	1 - -/* intercace options */ -#define	WANOPT_RS232	0 -#define	WANOPT_V35	1 - -/* data encoding options */ -#define	WANOPT_NRZ	0 -#define	WANOPT_NRZI	1 -#define	WANOPT_FM0	2 -#define	WANOPT_FM1	3 - -/* link type options */ -#define	WANOPT_POINTTOPOINT	0	/* RTS always active */ -#define	WANOPT_MULTIDROP	1	/* RTS is active when transmitting */ - -/* clocking options */ -#define	WANOPT_EXTERNAL	0 -#define	WANOPT_INTERNAL	1 - -/* station options */ -#define	WANOPT_DTE		0 -#define	WANOPT_DCE		1 -#define	WANOPT_CPE		0 -#define	WANOPT_NODE		1 -#define	WANOPT_SECONDARY	0 -#define	WANOPT_PRIMARY		1 - -/* connection options */ -#define	WANOPT_PERMANENT	0	/* DTR always active */ -#define	WANOPT_SWITCHED		1	/* use DTR to setup link (dial-up) */ -#define	WANOPT_ONDEMAND		2	/* activate DTR only before sending */ - -/* frame relay in-channel signalling */ -#define	WANOPT_FR_ANSI		1	/* ANSI T1.617 Annex D */ -#define	WANOPT_FR_Q933		2	/* ITU Q.933A */ -#define	WANOPT_FR_LMI		3	/* LMI */ - -/* PPP IP Mode Options */ -#define	WANOPT_PPP_STATIC	0 -#define	WANOPT_PPP_HOST		1 -#define	WANOPT_PPP_PEER		2 - -/* ASY Mode Options */ -#define WANOPT_ONE 		1 -#define WANOPT_TWO		2 -#define WANOPT_ONE_AND_HALF	3 - -#define WANOPT_NONE	0 -#define WANOPT_ODD      1 -#define WANOPT_EVEN	2 - -/* CHDLC Protocol Options */ -/* 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 -#define WANOPT_CHDLC_NO_KEEPALIVE	IGNORE_KPALV_FOR_LINK_STAT -*/ - -/* Port options */ -#define WANOPT_PRI 0 -#define WANOPT_SEC 1 -/* read mode */ -#define	WANOPT_INTR	0 -#define WANOPT_POLL	1 - -#define WANOPT_TTY_SYNC  0 -#define WANOPT_TTY_ASYNC 1 -/*---------------------------------------------------------------------------- - * WAN Link Status Info (for ROUTER_STAT IOCTL). - */ -typedef struct wandev_stat -{ -	unsigned state;		/* link state */ -	unsigned ndev;		/* number of configured interfaces */ - -	/* link/interface configuration */ -	unsigned connection;	/* permanent/switched/on-demand */ -	unsigned media_type;	/* Frame relay/PPP/X.25/SDLC, etc. */ -	unsigned mtu;		/* max. transmit unit for this device */ - -	/* physical level statistics */ -	unsigned modem_status;	/* modem status */ -	unsigned rx_frames;	/* received frames count */ -	unsigned rx_overruns;	/* receiver overrun error count */ -	unsigned rx_crc_err;	/* receive CRC error count */ -	unsigned rx_aborts;	/* received aborted frames count */ -	unsigned rx_bad_length;	/* unexpetedly long/short frames count */ -	unsigned rx_dropped;	/* frames discarded at device level */ -	unsigned tx_frames;	/* transmitted frames count */ -	unsigned tx_underruns;	/* aborted transmissions (underruns) count */ -	unsigned tx_timeouts;	/* transmission timeouts */ -	unsigned tx_rejects;	/* other transmit errors */ - -	/* media level statistics */ -	unsigned rx_bad_format;	/* frames with invalid format */ -	unsigned rx_bad_addr;	/* frames with invalid media address */ -	unsigned tx_retries;	/* frames re-transmitted */ -	unsigned reserved[16];	/* reserved for future use */ -} wandev_stat_t; +#ifndef _UAPI_ROUTER_H +#define _UAPI_ROUTER_H  /* 'state' defines */  enum wan_states @@ -365,88 +11,7 @@ enum wan_states  	WAN_UNCONFIGURED,	/* link/channel is not configured */  	WAN_DISCONNECTED,	/* link/channel is disconnected */  	WAN_CONNECTING,		/* connection is in progress */ -	WAN_CONNECTED,		/* link/channel is operational */ -	WAN_LIMIT,		/* for verification only */ -	WAN_DUALPORT,		/* for Dual Port cards */ -	WAN_DISCONNECTING, -	WAN_FT1_READY		/* FT1 Configurator Ready */ +	WAN_CONNECTED		/* link/channel is operational */  }; -enum { -	WAN_LOCAL_IP, -	WAN_POINTOPOINT_IP, -	WAN_NETMASK_IP, -	WAN_BROADCAST_IP -}; - -/* 'modem_status' masks */ -#define	WAN_MODEM_CTS	0x0001	/* CTS line active */ -#define	WAN_MODEM_DCD	0x0002	/* DCD line active */ -#define	WAN_MODEM_DTR	0x0010	/* DTR line active */ -#define	WAN_MODEM_RTS	0x0020	/* RTS line active */ - -/*---------------------------------------------------------------------------- - * WAN interface (logical channel) configuration (for ROUTER_IFNEW IOCTL). - */ -typedef struct wanif_conf -{ -	unsigned magic;			/* magic number */ -	unsigned config_id;		/* configuration identifier */ -	char name[WAN_IFNAME_SZ+1];	/* interface name, ASCIIZ */ -	char addr[WAN_ADDRESS_SZ+1];	/* media address, ASCIIZ */ -	char usedby[USED_BY_FIELD];	/* used by API or WANPIPE */ -	unsigned idle_timeout;		/* sec, before disconnecting */ -	unsigned hold_timeout;		/* sec, before re-connecting */ -	unsigned cir;			/* Committed Information Rate fwd,bwd*/ -	unsigned bc;			/* Committed Burst Size fwd, bwd */ -	unsigned be;			/* Excess Burst Size fwd, bwd */  -	unsigned char enable_IPX;	/* Enable or Disable IPX */ -	unsigned char inarp;		/* Send Inverse ARP requests Y/N */ -	unsigned inarp_interval;	/* sec, between InARP requests */ -	unsigned long network_number;	/* Network Number for IPX */ -	char mc;			/* Multicast on or off */ -	char local_addr[WAN_ADDRESS_SZ+1];/* local media address, ASCIIZ */ -	unsigned char port;		/* board port */ -	unsigned char protocol;		/* prococol used in this channel (TCPOX25 or X25) */ -	char pap;			/* PAP enabled or disabled */ -	char chap;			/* CHAP enabled or disabled */ -	unsigned char userid[511];	/* List of User Id */ -	unsigned char passwd[511];	/* List of passwords */ -	unsigned char sysname[31];	/* Name of the system */ -	unsigned char ignore_dcd;	/* Protocol options: */ -	unsigned char ignore_cts;	/*  Ignore these to determine */ -	unsigned char ignore_keepalive;	/*  link status (Yes or No) */ -	unsigned char hdlc_streaming;	/*  Hdlc streaming mode (Y/N) */ -	unsigned keepalive_tx_tmr;	/* transmit keepalive timer */ -	unsigned keepalive_rx_tmr;	/* receive  keepalive timer */ -	unsigned keepalive_err_margin;	/* keepalive_error_tolerance */ -	unsigned slarp_timer;		/* SLARP request timer */ -	unsigned char ttl;		/* Time To Live for UDP security */ -	char interface;			/* RS-232/V.35, etc. */ -	char clocking;			/* external/internal */ -	unsigned bps;			/* data transfer rate */ -	unsigned mtu;			/* maximum transmit unit size */ -	unsigned char if_down;		/* brind down interface when disconnected */ -	unsigned char gateway;		/* Is this interface a gateway */ -	unsigned char true_if_encoding;	/* Set the dev->type to true board protocol */ - -	unsigned char asy_data_trans;     /* async API options */ -        unsigned char rts_hs_for_receive; /* async Protocol options */ -        unsigned char xon_xoff_hs_for_receive; -	unsigned char xon_xoff_hs_for_transmit; -	unsigned char dcd_hs_for_transmit; -	unsigned char cts_hs_for_transmit; -	unsigned char async_mode; -	unsigned tx_bits_per_char; -	unsigned rx_bits_per_char; -	unsigned stop_bits;   -	unsigned char parity; - 	unsigned break_timer; -        unsigned inter_char_timer; -	unsigned rx_complete_length; -	unsigned xon_char; -	unsigned xoff_char; -	unsigned char receive_only;	/*  no transmit buffering (Y/N) */ -} wanif_conf_t; -  #endif /* _UAPI_ROUTER_H */ diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h index 26607bd965f..e4629b93bdd 100644 --- a/include/uapi/linux/xattr.h +++ b/include/uapi/linux/xattr.h @@ -15,19 +15,22 @@  /* Namespaces */  #define XATTR_OS2_PREFIX "os2." -#define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1) +#define XATTR_OS2_PREFIX_LEN (sizeof(XATTR_OS2_PREFIX) - 1) + +#define XATTR_MAC_OSX_PREFIX "osx." +#define XATTR_MAC_OSX_PREFIX_LEN (sizeof(XATTR_MAC_OSX_PREFIX) - 1)  #define XATTR_SECURITY_PREFIX	"security." -#define XATTR_SECURITY_PREFIX_LEN (sizeof (XATTR_SECURITY_PREFIX) - 1) +#define XATTR_SECURITY_PREFIX_LEN (sizeof(XATTR_SECURITY_PREFIX) - 1)  #define XATTR_SYSTEM_PREFIX "system." -#define XATTR_SYSTEM_PREFIX_LEN (sizeof (XATTR_SYSTEM_PREFIX) - 1) +#define XATTR_SYSTEM_PREFIX_LEN (sizeof(XATTR_SYSTEM_PREFIX) - 1)  #define XATTR_TRUSTED_PREFIX "trusted." -#define XATTR_TRUSTED_PREFIX_LEN (sizeof (XATTR_TRUSTED_PREFIX) - 1) +#define XATTR_TRUSTED_PREFIX_LEN (sizeof(XATTR_TRUSTED_PREFIX) - 1)  #define XATTR_USER_PREFIX "user." -#define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) +#define XATTR_USER_PREFIX_LEN (sizeof(XATTR_USER_PREFIX) - 1)  /* Security namespace */  #define XATTR_EVM_SUFFIX "evm" diff --git a/include/uapi/rdma/ib_user_verbs.h b/include/uapi/rdma/ib_user_verbs.h index 81aba3a73aa..805711ea200 100644 --- a/include/uapi/rdma/ib_user_verbs.h +++ b/include/uapi/rdma/ib_user_verbs.h @@ -261,6 +261,22 @@ struct ib_uverbs_dereg_mr {  	__u32 mr_handle;  }; +struct ib_uverbs_alloc_mw { +	__u64 response; +	__u32 pd_handle; +	__u8  mw_type; +	__u8  reserved[3]; +}; + +struct ib_uverbs_alloc_mw_resp { +	__u32 mw_handle; +	__u32 rkey; +}; + +struct ib_uverbs_dealloc_mw { +	__u32 mw_handle; +}; +  struct ib_uverbs_create_comp_channel {  	__u64 response;  }; diff --git a/include/uapi/scsi/Kbuild b/include/uapi/scsi/Kbuild index 29a87dd26cf..75746d52f20 100644 --- a/include/uapi/scsi/Kbuild +++ b/include/uapi/scsi/Kbuild @@ -1,2 +1,5 @@  # UAPI Header export list  header-y += fc/ +header-y += scsi_bsg_fc.h +header-y += scsi_netlink.h +header-y += scsi_netlink_fc.h diff --git a/include/uapi/scsi/fc/Kbuild b/include/uapi/scsi/fc/Kbuild index aafaa5aa54d..5ead9fac265 100644 --- a/include/uapi/scsi/fc/Kbuild +++ b/include/uapi/scsi/fc/Kbuild @@ -1 +1,5 @@  # UAPI Header export list +header-y += fc_els.h +header-y += fc_fs.h +header-y += fc_gs.h +header-y += fc_ns.h diff --git a/include/scsi/fc/fc_els.h b/include/uapi/scsi/fc/fc_els.h index 481abbd48e3..481abbd48e3 100644 --- a/include/scsi/fc/fc_els.h +++ b/include/uapi/scsi/fc/fc_els.h diff --git a/include/scsi/fc/fc_fs.h b/include/uapi/scsi/fc/fc_fs.h index 50f28b14345..50f28b14345 100644 --- a/include/scsi/fc/fc_fs.h +++ b/include/uapi/scsi/fc/fc_fs.h diff --git a/include/scsi/fc/fc_gs.h b/include/uapi/scsi/fc/fc_gs.h index a37346d47eb..a37346d47eb 100644 --- a/include/scsi/fc/fc_gs.h +++ b/include/uapi/scsi/fc/fc_gs.h diff --git a/include/scsi/fc/fc_ns.h b/include/uapi/scsi/fc/fc_ns.h index f7751d53f1d..f7751d53f1d 100644 --- a/include/scsi/fc/fc_ns.h +++ b/include/uapi/scsi/fc/fc_ns.h diff --git a/include/scsi/scsi_bsg_fc.h b/include/uapi/scsi/scsi_bsg_fc.h index 3031b900b08..3031b900b08 100644 --- a/include/scsi/scsi_bsg_fc.h +++ b/include/uapi/scsi/scsi_bsg_fc.h diff --git a/include/scsi/scsi_netlink.h b/include/uapi/scsi/scsi_netlink.h index 62b4edab15d..62b4edab15d 100644 --- a/include/scsi/scsi_netlink.h +++ b/include/uapi/scsi/scsi_netlink.h diff --git a/include/scsi/scsi_netlink_fc.h b/include/uapi/scsi/scsi_netlink_fc.h index cbf76e47976..cbf76e47976 100644 --- a/include/scsi/scsi_netlink_fc.h +++ b/include/uapi/scsi/scsi_netlink_fc.h diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h index 05341a43fed..d630163b9a2 100644 --- a/include/uapi/sound/compress_offload.h +++ b/include/uapi/sound/compress_offload.h @@ -30,7 +30,7 @@  #include <sound/compress_params.h> -#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 0) +#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 1)  /**   * struct snd_compressed_buffer: compressed buffer   * @fragment_size: size of buffer fragment in bytes @@ -122,6 +122,27 @@ struct snd_compr_codec_caps {  };  /** + * @SNDRV_COMPRESS_ENCODER_PADDING: no of samples appended by the encoder at the + * end of the track + * @SNDRV_COMPRESS_ENCODER_DELAY: no of samples inserted by the encoder at the + * beginning of the track + */ +enum { +	SNDRV_COMPRESS_ENCODER_PADDING = 1, +	SNDRV_COMPRESS_ENCODER_DELAY = 2, +}; + +/** + * struct snd_compr_metadata: compressed stream metadata + * @key: key id + * @value: key value + */ +struct snd_compr_metadata { +	 __u32 key; +	 __u32 value[8]; +}; + +/**   * compress path ioctl definitions   * SNDRV_COMPRESS_GET_CAPS: Query capability of DSP   * SNDRV_COMPRESS_GET_CODEC_CAPS: Query capability of a codec @@ -145,6 +166,10 @@ struct snd_compr_codec_caps {  						struct snd_compr_codec_caps)  #define SNDRV_COMPRESS_SET_PARAMS	_IOW('C', 0x12, struct snd_compr_params)  #define SNDRV_COMPRESS_GET_PARAMS	_IOR('C', 0x13, struct snd_codec) +#define SNDRV_COMPRESS_SET_METADATA	_IOW('C', 0x14,\ +						 struct snd_compr_metadata) +#define SNDRV_COMPRESS_GET_METADATA	_IOWR('C', 0x15,\ +						 struct snd_compr_metadata)  #define SNDRV_COMPRESS_TSTAMP		_IOR('C', 0x20, struct snd_compr_tstamp)  #define SNDRV_COMPRESS_AVAIL		_IOR('C', 0x21, struct snd_compr_avail)  #define SNDRV_COMPRESS_PAUSE		_IO('C', 0x30) @@ -152,10 +177,14 @@ struct snd_compr_codec_caps {  #define SNDRV_COMPRESS_START		_IO('C', 0x32)  #define SNDRV_COMPRESS_STOP		_IO('C', 0x33)  #define SNDRV_COMPRESS_DRAIN		_IO('C', 0x34) +#define SNDRV_COMPRESS_NEXT_TRACK	_IO('C', 0x35) +#define SNDRV_COMPRESS_PARTIAL_DRAIN	_IO('C', 0x36)  /*   * TODO   * 1. add mmap support   *   */  #define SND_COMPR_TRIGGER_DRAIN 7 /*FIXME move this to pcm.h */ +#define SND_COMPR_TRIGGER_NEXT_TRACK 8 +#define SND_COMPR_TRIGGER_PARTIAL_DRAIN 9  #endif diff --git a/include/uapi/video/Kbuild b/include/uapi/video/Kbuild index aafaa5aa54d..ac7203bb32c 100644 --- a/include/uapi/video/Kbuild +++ b/include/uapi/video/Kbuild @@ -1 +1,4 @@  # UAPI Header export list +header-y += edid.h +header-y += sisfb.h +header-y += uvesafb.h diff --git a/include/uapi/video/edid.h b/include/uapi/video/edid.h new file mode 100644 index 00000000000..8c0f032014c --- /dev/null +++ b/include/uapi/video/edid.h @@ -0,0 +1,9 @@ +#ifndef _UAPI__linux_video_edid_h__ +#define _UAPI__linux_video_edid_h__ + +struct edid_info { +	unsigned char dummy[128]; +}; + + +#endif /* _UAPI__linux_video_edid_h__ */ diff --git a/include/uapi/video/sisfb.h b/include/uapi/video/sisfb.h new file mode 100644 index 00000000000..9250b22b10f --- /dev/null +++ b/include/uapi/video/sisfb.h @@ -0,0 +1,209 @@ +/* + * sisfb.h - definitions for the SiS framebuffer driver + * + * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria. + * + * 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 named License, + * or 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 _UAPI_LINUX_SISFB_H_ +#define _UAPI_LINUX_SISFB_H_ + +#include <linux/types.h> +#include <asm/ioctl.h> + +/**********************************************/ +/*                   PUBLIC                   */ +/**********************************************/ + +/* vbflags, public (others in sis.h) */ +#define CRT2_DEFAULT		0x00000001 +#define CRT2_LCD		0x00000002 +#define CRT2_TV			0x00000004 +#define CRT2_VGA		0x00000008 +#define TV_NTSC			0x00000010 +#define TV_PAL			0x00000020 +#define TV_HIVISION		0x00000040 +#define TV_YPBPR		0x00000080 +#define TV_AVIDEO		0x00000100 +#define TV_SVIDEO		0x00000200 +#define TV_SCART		0x00000400 +#define TV_PALM			0x00001000 +#define TV_PALN			0x00002000 +#define TV_NTSCJ		0x00001000 +#define TV_CHSCART		0x00008000 +#define TV_CHYPBPR525I		0x00010000 +#define CRT1_VGA		0x00000000 +#define CRT1_LCDA		0x00020000 +#define VGA2_CONNECTED          0x00040000 +#define VB_DISPTYPE_CRT1	0x00080000	/* CRT1 connected and used */ +#define VB_SINGLE_MODE		0x20000000	/* CRT1 or CRT2; determined by DISPTYPE_CRTx */ +#define VB_MIRROR_MODE		0x40000000	/* CRT1 + CRT2 identical (mirror mode) */ +#define VB_DUALVIEW_MODE	0x80000000	/* CRT1 + CRT2 independent (dual head mode) */ + +/* Aliases: */ +#define CRT2_ENABLE		(CRT2_LCD | CRT2_TV | CRT2_VGA) +#define TV_STANDARD		(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ) +#define TV_INTERFACE		(TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR|TV_CHSCART|TV_CHYPBPR525I) + +/* Only if TV_YPBPR is set: */ +#define TV_YPBPR525I		TV_NTSC +#define TV_YPBPR525P		TV_PAL +#define TV_YPBPR750P		TV_PALM +#define TV_YPBPR1080I		TV_PALN +#define TV_YPBPRALL 		(TV_YPBPR525I | TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I) + +#define VB_DISPTYPE_DISP2	CRT2_ENABLE +#define VB_DISPTYPE_CRT2	CRT2_ENABLE +#define VB_DISPTYPE_DISP1	VB_DISPTYPE_CRT1 +#define VB_DISPMODE_SINGLE	VB_SINGLE_MODE +#define VB_DISPMODE_MIRROR	VB_MIRROR_MODE +#define VB_DISPMODE_DUAL	VB_DUALVIEW_MODE +#define VB_DISPLAY_MODE		(SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) + +/* Structure argument for SISFB_GET_INFO ioctl  */ +struct sisfb_info { +	__u32	sisfb_id;		/* for identifying sisfb */ +#ifndef SISFB_ID +#define SISFB_ID	  0x53495346    /* Identify myself with 'SISF' */ +#endif +	__u32   chip_id;		/* PCI-ID of detected chip */ +	__u32   memory;			/* total video memory in KB */ +	__u32   heapstart;		/* heap start offset in KB */ +	__u8    fbvidmode;		/* current sisfb mode */ + +	__u8	sisfb_version; +	__u8	sisfb_revision; +	__u8	sisfb_patchlevel; + +	__u8	sisfb_caps;		/* sisfb capabilities */ + +	__u32	sisfb_tqlen;		/* turbo queue length (in KB) */ + +	__u32	sisfb_pcibus;		/* The card's PCI ID */ +	__u32	sisfb_pcislot; +	__u32	sisfb_pcifunc; + +	__u8	sisfb_lcdpdc;		/* PanelDelayCompensation */ + +	__u8	sisfb_lcda;		/* Detected status of LCDA for low res/text modes */ + +	__u32	sisfb_vbflags; +	__u32	sisfb_currentvbflags; + +	__u32	sisfb_scalelcd; +	__u32	sisfb_specialtiming; + +	__u8	sisfb_haveemi; +	__u8	sisfb_emi30,sisfb_emi31,sisfb_emi32,sisfb_emi33; +	__u8	sisfb_haveemilcd; + +	__u8	sisfb_lcdpdca;		/* PanelDelayCompensation for LCD-via-CRT1 */ + +	__u16	sisfb_tvxpos, sisfb_tvypos;	/* Warning: Values + 32 ! */ + +	__u32	sisfb_heapsize;		/* heap size (in KB) */ +	__u32	sisfb_videooffset;	/* Offset of viewport in video memory (in bytes) */ + +	__u32	sisfb_curfstn;		/* currently running FSTN/DSTN mode */ +	__u32	sisfb_curdstn; + +	__u16	sisfb_pci_vendor;	/* PCI vendor (SiS or XGI) */ + +	__u32	sisfb_vbflags2;		/* ivideo->vbflags2 */ + +	__u8	sisfb_can_post;		/* sisfb can POST this card */ +	__u8	sisfb_card_posted;	/* card is POSTED */ +	__u8	sisfb_was_boot_device;	/* This card was the boot video device (ie is primary) */ + +	__u8	reserved[183];		/* for future use */ +}; + +#define SISFB_CMD_GETVBFLAGS	0x55AA0001	/* no arg; result[1] = vbflags */ +#define SISFB_CMD_SWITCHCRT1	0x55AA0010	/* arg[0]: 99 = query, 0 = off, 1 = on */ +/* more to come */ + +#define SISFB_CMD_ERR_OK	0x80000000	/* command succeeded */ +#define SISFB_CMD_ERR_LOCKED	0x80000001	/* sisfb is locked */ +#define SISFB_CMD_ERR_EARLY	0x80000002	/* request before sisfb took over gfx system */ +#define SISFB_CMD_ERR_NOVB	0x80000003	/* No video bridge */ +#define SISFB_CMD_ERR_NOCRT2	0x80000004	/* can't change CRT1 status, CRT2 disabled */ +/* more to come */ +#define SISFB_CMD_ERR_UNKNOWN   0x8000ffff	/* Unknown command */ +#define SISFB_CMD_ERR_OTHER	0x80010000	/* Other error */ + +/* Argument for SISFB_CMD ioctl */ +struct sisfb_cmd { +	__u32  sisfb_cmd; +	__u32  sisfb_arg[16]; +	__u32  sisfb_result[4]; +}; + +/* Additional IOCTLs for communication sisfb <> X driver                */ +/* If changing this, vgatypes.h must also be changed (for X driver)    */ + +/* ioctl for identifying and giving some info (esp. memory heap start) */ +#define SISFB_GET_INFO_SIZE	_IOR(0xF3,0x00,__u32) +#define SISFB_GET_INFO		_IOR(0xF3,0x01,struct sisfb_info) + +/* ioctrl to get current vertical retrace status */ +#define SISFB_GET_VBRSTATUS	_IOR(0xF3,0x02,__u32) + +/* ioctl to enable/disable panning auto-maximize (like nomax parameter) */ +#define SISFB_GET_AUTOMAXIMIZE	_IOR(0xF3,0x03,__u32) +#define SISFB_SET_AUTOMAXIMIZE	_IOW(0xF3,0x03,__u32) + +/* ioctls to relocate TV output (x=D[31:16], y=D[15:0], + 32)*/ +#define SISFB_GET_TVPOSOFFSET	_IOR(0xF3,0x04,__u32) +#define SISFB_SET_TVPOSOFFSET	_IOW(0xF3,0x04,__u32) + +/* ioctl for internal sisfb commands (sisfbctrl) */ +#define SISFB_COMMAND		_IOWR(0xF3,0x05,struct sisfb_cmd) + +/* ioctl for locking sisfb (no register access during lock) */ +/* As of now, only used to avoid register access during + * the ioctls listed above. + */ +#define SISFB_SET_LOCK		_IOW(0xF3,0x06,__u32) + +/* ioctls 0xF3 up to 0x3F reserved for sisfb */ + +/****************************************************************/ +/* The following are deprecated and should not be used anymore: */ +/****************************************************************/ +/* ioctl for identifying and giving some info (esp. memory heap start) */ +#define SISFB_GET_INFO_OLD	   _IOR('n',0xF8,__u32) +/* ioctrl to get current vertical retrace status */ +#define SISFB_GET_VBRSTATUS_OLD	   _IOR('n',0xF9,__u32) +/* ioctl to enable/disable panning auto-maximize (like nomax parameter) */ +#define SISFB_GET_AUTOMAXIMIZE_OLD _IOR('n',0xFA,__u32) +#define SISFB_SET_AUTOMAXIMIZE_OLD _IOW('n',0xFA,__u32) +/****************************************************************/ +/*               End of deprecated ioctl numbers                */ +/****************************************************************/ + +/* For fb memory manager (FBIO_ALLOC, FBIO_FREE) */ +struct sis_memreq { +	__u32	offset; +	__u32	size; +}; + +/**********************************************/ +/*                  PRIVATE                   */ +/*         (for IN-KERNEL usage only)         */ +/**********************************************/ + + +#endif /* _UAPI_LINUX_SISFB_H_ */ diff --git a/include/uapi/video/uvesafb.h b/include/uapi/video/uvesafb.h new file mode 100644 index 00000000000..cee063d723a --- /dev/null +++ b/include/uapi/video/uvesafb.h @@ -0,0 +1,60 @@ +#ifndef _UAPI_UVESAFB_H +#define _UAPI_UVESAFB_H + +#include <linux/types.h> + +struct v86_regs { +	__u32 ebx; +	__u32 ecx; +	__u32 edx; +	__u32 esi; +	__u32 edi; +	__u32 ebp; +	__u32 eax; +	__u32 eip; +	__u32 eflags; +	__u32 esp; +	__u16 cs; +	__u16 ss; +	__u16 es; +	__u16 ds; +	__u16 fs; +	__u16 gs; +}; + +/* Task flags */ +#define TF_VBEIB	0x01 +#define TF_BUF_ESDI	0x02 +#define TF_BUF_ESBX	0x04 +#define TF_BUF_RET	0x08 +#define TF_EXIT		0x10 + +struct uvesafb_task { +	__u8 flags; +	int buf_len; +	struct v86_regs regs; +}; + +/* Constants for the capabilities field + * in vbe_ib */ +#define VBE_CAP_CAN_SWITCH_DAC	0x01 +#define VBE_CAP_VGACOMPAT	0x02 + +/* The VBE Info Block */ +struct vbe_ib { +	char  vbe_signature[4]; +	__u16 vbe_version; +	__u32 oem_string_ptr; +	__u32 capabilities; +	__u32 mode_list_ptr; +	__u16 total_memory; +	__u16 oem_software_rev; +	__u32 oem_vendor_name_ptr; +	__u32 oem_product_name_ptr; +	__u32 oem_product_rev_ptr; +	__u8  reserved[222]; +	char  oem_data[256]; +	char  misc_data[512]; +} __attribute__ ((packed)); + +#endif /* _UAPI_UVESAFB_H */ diff --git a/include/video/Kbuild b/include/video/Kbuild index ad3e622c533..e69de29bb2d 100644 --- a/include/video/Kbuild +++ b/include/video/Kbuild @@ -1,3 +0,0 @@ -header-y += edid.h -header-y += sisfb.h -header-y += uvesafb.h diff --git a/include/video/atmel_lcdc.h b/include/video/atmel_lcdc.h index 28447f1594f..8deb22672ad 100644 --- a/include/video/atmel_lcdc.h +++ b/include/video/atmel_lcdc.h @@ -30,7 +30,6 @@   */  #define ATMEL_LCDC_WIRING_BGR	0  #define ATMEL_LCDC_WIRING_RGB	1 -#define ATMEL_LCDC_WIRING_RGB555	2   /* LCD Controller info data structure, stored in device platform_data */ @@ -62,6 +61,7 @@ struct atmel_lcdfb_info {  	void (*atmel_lcdfb_power_control)(int on);  	struct fb_monspecs	*default_monspecs;  	u32			pseudo_palette[16]; +	bool			have_intensity_bit;  };  #define ATMEL_LCDC_DMABADDR1	0x00 diff --git a/include/video/auo_k190xfb.h b/include/video/auo_k190xfb.h index 609efe8c686..ac329ee1d75 100644 --- a/include/video/auo_k190xfb.h +++ b/include/video/auo_k190xfb.h @@ -22,6 +22,8 @@   */  #define AUOK190X_RESOLUTION_800_600		0  #define AUOK190X_RESOLUTION_1024_768		1 +#define AUOK190X_RESOLUTION_600_800		4 +#define AUOK190X_RESOLUTION_768_1024		5  /*   * struct used by auok190x. board specific stuff comes from *board @@ -98,7 +100,6 @@ struct auok190x_board {  	int gpio_nbusy;  	int resolution; -	int rotation;  	int quirks;  	int fps;  }; diff --git a/include/video/display_timing.h b/include/video/display_timing.h new file mode 100644 index 00000000000..5d0259b08e0 --- /dev/null +++ b/include/video/display_timing.h @@ -0,0 +1,101 @@ +/* + * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> + * + * description of display timings + * + * This file is released under the GPLv2 + */ + +#ifndef __LINUX_DISPLAY_TIMING_H +#define __LINUX_DISPLAY_TIMING_H + +#include <linux/bitops.h> +#include <linux/types.h> + +enum display_flags { +	DISPLAY_FLAGS_HSYNC_LOW		= BIT(0), +	DISPLAY_FLAGS_HSYNC_HIGH	= BIT(1), +	DISPLAY_FLAGS_VSYNC_LOW		= BIT(2), +	DISPLAY_FLAGS_VSYNC_HIGH	= BIT(3), + +	/* data enable flag */ +	DISPLAY_FLAGS_DE_LOW		= BIT(4), +	DISPLAY_FLAGS_DE_HIGH		= BIT(5), +	/* drive data on pos. edge */ +	DISPLAY_FLAGS_PIXDATA_POSEDGE	= BIT(6), +	/* drive data on neg. edge */ +	DISPLAY_FLAGS_PIXDATA_NEGEDGE	= BIT(7), +	DISPLAY_FLAGS_INTERLACED	= BIT(8), +	DISPLAY_FLAGS_DOUBLESCAN	= BIT(9), +}; + +/* + * A single signal can be specified via a range of minimal and maximal values + * with a typical value, that lies somewhere inbetween. + */ +struct timing_entry { +	u32 min; +	u32 typ; +	u32 max; +}; + +/* + * Single "mode" entry. This describes one set of signal timings a display can + * have in one setting. This struct can later be converted to struct videomode + * (see include/video/videomode.h). As each timing_entry can be defined as a + * range, one struct display_timing may become multiple struct videomodes. + * + * Example: hsync active high, vsync active low + * + *				    Active Video + * Video  ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________ + *	  |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync.. + *	  |	     |	 porch  |		     |	 porch	 | + * + * HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯ + * + * VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________ + */ +struct display_timing { +	struct timing_entry pixelclock; + +	struct timing_entry hactive;		/* hor. active video */ +	struct timing_entry hfront_porch;	/* hor. front porch */ +	struct timing_entry hback_porch;	/* hor. back porch */ +	struct timing_entry hsync_len;		/* hor. sync len */ + +	struct timing_entry vactive;		/* ver. active video */ +	struct timing_entry vfront_porch;	/* ver. front porch */ +	struct timing_entry vback_porch;	/* ver. back porch */ +	struct timing_entry vsync_len;		/* ver. sync len */ + +	enum display_flags flags;		/* display flags */ +}; + +/* + * This describes all timing settings a display provides. + * The native_mode is the default setting for this display. + * Drivers that can handle multiple videomodes should work with this struct and + * convert each entry to the desired end result. + */ +struct display_timings { +	unsigned int num_timings; +	unsigned int native_mode; + +	struct display_timing **timings; +}; + +/* get one entry from struct display_timings */ +static inline struct display_timing *display_timings_get(const struct +							 display_timings *disp, +							 unsigned int index) +{ +	if (disp->num_timings > index) +		return disp->timings[index]; +	else +		return NULL; +} + +void display_timings_release(struct display_timings *disp); + +#endif diff --git a/include/video/edid.h b/include/video/edid.h index c5f19870491..0cb8b2a92b7 100644 --- a/include/video/edid.h +++ b/include/video/edid.h @@ -1,14 +1,9 @@  #ifndef __linux_video_edid_h__  #define __linux_video_edid_h__ -struct edid_info { -	unsigned char dummy[128]; -}; +#include <uapi/video/edid.h> -#ifdef __KERNEL__  #ifdef CONFIG_X86  extern struct edid_info edid_info;  #endif -#endif -  #endif /* __linux_video_edid_h__ */ diff --git a/include/video/exynos_mipi_dsim.h b/include/video/exynos_mipi_dsim.h index 83ce5e667d4..89dc88a171a 100644 --- a/include/video/exynos_mipi_dsim.h +++ b/include/video/exynos_mipi_dsim.h @@ -220,7 +220,6 @@ struct mipi_dsim_config {  struct mipi_dsim_device {  	struct device			*dev;  	int				id; -	struct resource			*res;  	struct clk			*clock;  	unsigned int			irq;  	void __iomem			*reg_base; diff --git a/include/video/mmp_disp.h b/include/video/mmp_disp.h new file mode 100644 index 00000000000..b9dd1fbb008 --- /dev/null +++ b/include/video/mmp_disp.h @@ -0,0 +1,352 @@ +/* + * linux/include/video/mmp_disp.h + * Header file for Marvell MMP Display Controller + * + * Copyright (C) 2012 Marvell Technology Group Ltd. + * Authors: Zhou Zhu <zzhu3@marvell.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, see <http://www.gnu.org/licenses/>. + * + */ + +#ifndef _MMP_DISP_H_ +#define _MMP_DISP_H_ +#include <linux/kthread.h> + +enum { +	PIXFMT_UYVY = 0, +	PIXFMT_VYUY, +	PIXFMT_YUYV, +	PIXFMT_YUV422P, +	PIXFMT_YVU422P, +	PIXFMT_YUV420P, +	PIXFMT_YVU420P, +	PIXFMT_RGB565 = 0x100, +	PIXFMT_BGR565, +	PIXFMT_RGB1555, +	PIXFMT_BGR1555, +	PIXFMT_RGB888PACK, +	PIXFMT_BGR888PACK, +	PIXFMT_RGB888UNPACK, +	PIXFMT_BGR888UNPACK, +	PIXFMT_RGBA888, +	PIXFMT_BGRA888, +	PIXFMT_RGB666, /* for output usage */ +	PIXFMT_PSEUDOCOLOR = 0x200, +}; + +static inline int pixfmt_to_stride(int pix_fmt) +{ +	switch (pix_fmt) { +	case PIXFMT_RGB565: +	case PIXFMT_BGR565: +	case PIXFMT_RGB1555: +	case PIXFMT_BGR1555: +	case PIXFMT_UYVY: +	case PIXFMT_VYUY: +	case PIXFMT_YUYV: +		return 2; +	case PIXFMT_RGB888UNPACK: +	case PIXFMT_BGR888UNPACK: +	case PIXFMT_RGBA888: +	case PIXFMT_BGRA888: +		return 4; +	case PIXFMT_RGB888PACK: +	case PIXFMT_BGR888PACK: +		return 3; +	case PIXFMT_YUV422P: +	case PIXFMT_YVU422P: +	case PIXFMT_YUV420P: +	case PIXFMT_YVU420P: +	case PIXFMT_PSEUDOCOLOR: +		return 1; +	default: +		return 0; +	} +} + +/* parameters used by path/overlay */ +/* overlay related para: win/addr */ +struct mmp_win { +	/* position/size of window */ +	u16	xsrc; +	u16	ysrc; +	u16	xdst; +	u16	ydst; +	u16	xpos; +	u16	ypos; +	u16	left_crop; +	u16	right_crop; +	u16	up_crop; +	u16	bottom_crop; +	int	pix_fmt; +}; + +struct mmp_addr { +	/* phys address */ +	u32	phys[6]; +}; + +/* path related para: mode */ +struct mmp_mode { +	const char *name; +	u32 refresh; +	u32 xres; +	u32 yres; +	u32 left_margin; +	u32 right_margin; +	u32 upper_margin; +	u32 lower_margin; +	u32 hsync_len; +	u32 vsync_len; +	u32 hsync_invert; +	u32 vsync_invert; +	u32 invert_pixclock; +	u32 pixclock_freq; +	int pix_fmt_out; +}; + +/* main structures */ +struct mmp_path; +struct mmp_overlay; +struct mmp_panel; + +/* status types */ +enum { +	MMP_OFF = 0, +	MMP_ON, +}; + +static inline const char *stat_name(int stat) +{ +	switch (stat) { +	case MMP_OFF: +		return "OFF"; +	case MMP_ON: +		return "ON"; +	default: +		return "UNKNOWNSTAT"; +	} +} + +struct mmp_overlay_ops { +	/* should be provided by driver */ +	void (*set_fetch)(struct mmp_overlay *overlay, int fetch_id); +	void (*set_onoff)(struct mmp_overlay *overlay, int status); +	void (*set_win)(struct mmp_overlay *overlay, struct mmp_win *win); +	int (*set_addr)(struct mmp_overlay *overlay, struct mmp_addr *addr); +}; + +/* overlay describes a z-order indexed slot in each path. */ +struct mmp_overlay { +	int id; +	const char *name; +	struct mmp_path *path; + +	/* overlay info: private data */ +	int dmafetch_id; +	struct mmp_addr addr; +	struct mmp_win win; + +	/* state */ +	int open_count; +	int status; +	struct mutex access_ok; + +	struct mmp_overlay_ops *ops; +}; + +/* panel type */ +enum { +	PANELTYPE_ACTIVE = 0, +	PANELTYPE_SMART, +	PANELTYPE_TV, +	PANELTYPE_DSI_CMD, +	PANELTYPE_DSI_VIDEO, +}; + +struct mmp_panel { +	/* use node to register to list */ +	struct list_head node; +	const char *name; +	/* path name used to connect to proper path configed */ +	const char *plat_path_name; +	struct device *dev; +	int panel_type; +	void *plat_data; +	int (*get_modelist)(struct mmp_panel *panel, +			struct mmp_mode **modelist); +	void (*set_mode)(struct mmp_panel *panel, +			struct mmp_mode *mode); +	void (*set_onoff)(struct mmp_panel *panel, +			int status); +}; + +struct mmp_path_ops { +	int (*check_status)(struct mmp_path *path); +	struct mmp_overlay *(*get_overlay)(struct mmp_path *path, +			int overlay_id); +	int (*get_modelist)(struct mmp_path *path, +			struct mmp_mode **modelist); + +	/* follow ops should be provided by driver */ +	void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); +	void (*set_onoff)(struct mmp_path *path, int status); +	/* todo: add query */ +}; + +/* path output types */ +enum { +	PATH_OUT_PARALLEL, +	PATH_OUT_DSI, +	PATH_OUT_HDMI, +}; + +/* path is main part of mmp-disp */ +struct mmp_path { +	/* use node to register to list */ +	struct list_head node; + +	/* init data */ +	struct device *dev; + +	int id; +	const char *name; +	int output_type; +	struct mmp_panel *panel; +	void *plat_data; + +	/* dynamic use */ +	struct mmp_mode mode; + +	/* state */ +	int open_count; +	int status; +	struct mutex access_ok; + +	struct mmp_path_ops ops; + +	/* layers */ +	int overlay_num; +	struct mmp_overlay overlays[0]; +}; + +extern struct mmp_path *mmp_get_path(const char *name); +static inline void mmp_path_set_mode(struct mmp_path *path, +		struct mmp_mode *mode) +{ +	if (path) +		path->ops.set_mode(path, mode); +} +static inline void mmp_path_set_onoff(struct mmp_path *path, int status) +{ +	if (path) +		path->ops.set_onoff(path, status); +} +static inline int mmp_path_get_modelist(struct mmp_path *path, +		struct mmp_mode **modelist) +{ +	if (path) +		return path->ops.get_modelist(path, modelist); +	return 0; +} +static inline struct mmp_overlay *mmp_path_get_overlay( +		struct mmp_path *path, int overlay_id) +{ +	if (path) +		return path->ops.get_overlay(path, overlay_id); +	return NULL; +} +static inline void mmp_overlay_set_fetch(struct mmp_overlay *overlay, +		int fetch_id) +{ +	if (overlay) +		overlay->ops->set_fetch(overlay, fetch_id); +} +static inline void mmp_overlay_set_onoff(struct mmp_overlay *overlay, +		int status) +{ +	if (overlay) +		overlay->ops->set_onoff(overlay, status); +} +static inline void mmp_overlay_set_win(struct mmp_overlay *overlay, +		struct mmp_win *win) +{ +	if (overlay) +		overlay->ops->set_win(overlay, win); +} +static inline int mmp_overlay_set_addr(struct mmp_overlay *overlay, +		struct mmp_addr *addr) +{ +	if (overlay) +		return overlay->ops->set_addr(overlay, addr); +	return 0; +} + +/* + * driver data is set from each detailed ctrl driver for path usage + * it defined a common interface that plat driver need to implement + */ +struct mmp_path_info { +	/* driver data, set when registed*/ +	const char *name; +	struct device *dev; +	int id; +	int output_type; +	int overlay_num; +	void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); +	void (*set_onoff)(struct mmp_path *path, int status); +	struct mmp_overlay_ops *overlay_ops; +	void *plat_data; +}; + +extern struct mmp_path *mmp_register_path( +		struct mmp_path_info *info); +extern void mmp_unregister_path(struct mmp_path *path); +extern void mmp_register_panel(struct mmp_panel *panel); +extern void mmp_unregister_panel(struct mmp_panel *panel); + +/* defintions for platform data */ +/* interface for buffer driver */ +struct mmp_buffer_driver_mach_info { +	const char	*name; +	const char	*path_name; +	int	overlay_id; +	int	dmafetch_id; +	int	default_pixfmt; +}; + +/* interface for controllers driver */ +struct mmp_mach_path_config { +	const char *name; +	int overlay_num; +	int output_type; +	u32 path_config; +	u32 link_config; +}; + +struct mmp_mach_plat_info { +	const char *name; +	const char *clk_name; +	int path_num; +	struct mmp_mach_path_config *paths; +}; + +/* interface for panel drivers */ +struct mmp_mach_panel_info { +	const char *name; +	void (*plat_set_onoff)(int status); +	const char *plat_path_name; +}; +#endif	/* _MMP_DISP_H_ */ diff --git a/include/video/of_display_timing.h b/include/video/of_display_timing.h new file mode 100644 index 00000000000..8016eb727cf --- /dev/null +++ b/include/video/of_display_timing.h @@ -0,0 +1,20 @@ +/* + * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> + * + * display timings of helpers + * + * This file is released under the GPLv2 + */ + +#ifndef __LINUX_OF_DISPLAY_TIMING_H +#define __LINUX_OF_DISPLAY_TIMING_H + +struct device_node; +struct display_timings; + +#define OF_USE_NATIVE_MODE -1 + +struct display_timings *of_get_display_timings(struct device_node *np); +int of_display_timings_exist(struct device_node *np); + +#endif diff --git a/include/video/of_videomode.h b/include/video/of_videomode.h new file mode 100644 index 00000000000..a07efcc5142 --- /dev/null +++ b/include/video/of_videomode.h @@ -0,0 +1,18 @@ +/* + * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> + * + * videomode of-helpers + * + * This file is released under the GPLv2 + */ + +#ifndef __LINUX_OF_VIDEOMODE_H +#define __LINUX_OF_VIDEOMODE_H + +struct device_node; +struct videomode; + +int of_get_videomode(struct device_node *np, struct videomode *vm, +		     int index); + +#endif /* __LINUX_OF_VIDEOMODE_H */ diff --git a/include/video/samsung_fimd.h b/include/video/samsung_fimd.h index e7554486a2b..b0393209679 100644 --- a/include/video/samsung_fimd.h +++ b/include/video/samsung_fimd.h @@ -8,12 +8,8 @@   * S3C Platform - new-style fimd and framebuffer register definitions   *   * This is the register set for the fimd and new style framebuffer interface - * found from the S3C2443 onwards into the S3C2416, S3C2450 and the - * S3C64XX series such as the S3C6400 and S3C6410. - * - * The file does not contain the cpu specific items which are based on - * whichever architecture is selected, it only contains the core of the - * register set. See <mach/regs-fb.h> to get the specifics. + * found from the S3C2443 onwards into the S3C2416, S3C2450, the + * S3C64XX series such as the S3C6400 and S3C6410, and EXYNOS series.   *   * 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 @@ -22,10 +18,10 @@  /* VIDCON0 */ -#define VIDCON0					(0x00) +#define VIDCON0					0x00  #define VIDCON0_INTERLACE			(1 << 29)  #define VIDCON0_VIDOUT_MASK			(0x7 << 26) -#define VIDCON0_VIDOUT_SHIFT			(26) +#define VIDCON0_VIDOUT_SHIFT			26  #define VIDCON0_VIDOUT_RGB			(0x0 << 26)  #define VIDCON0_VIDOUT_TV			(0x1 << 26)  #define VIDCON0_VIDOUT_I80_LDI0			(0x2 << 26) @@ -35,7 +31,7 @@  #define VIDCON0_VIDOUT_WB_I80_LDI1		(0x7 << 26)  #define VIDCON0_L1_DATA_MASK			(0x7 << 23) -#define VIDCON0_L1_DATA_SHIFT			(23) +#define VIDCON0_L1_DATA_SHIFT			23  #define VIDCON0_L1_DATA_16BPP			(0x0 << 23)  #define VIDCON0_L1_DATA_18BPP16			(0x1 << 23)  #define VIDCON0_L1_DATA_18BPP9			(0x2 << 23) @@ -44,7 +40,7 @@  #define VIDCON0_L1_DATA_16BPP8			(0x5 << 23)  #define VIDCON0_L0_DATA_MASK			(0x7 << 20) -#define VIDCON0_L0_DATA_SHIFT			(20) +#define VIDCON0_L0_DATA_SHIFT			20  #define VIDCON0_L0_DATA_16BPP			(0x0 << 20)  #define VIDCON0_L0_DATA_18BPP16			(0x1 << 20)  #define VIDCON0_L0_DATA_18BPP9			(0x2 << 20) @@ -53,7 +49,7 @@  #define VIDCON0_L0_DATA_16BPP8			(0x5 << 20)  #define VIDCON0_PNRMODE_MASK			(0x3 << 17) -#define VIDCON0_PNRMODE_SHIFT			(17) +#define VIDCON0_PNRMODE_SHIFT			17  #define VIDCON0_PNRMODE_RGB			(0x0 << 17)  #define VIDCON0_PNRMODE_BGR			(0x1 << 17)  #define VIDCON0_PNRMODE_SERIAL_RGB		(0x2 << 17) @@ -61,14 +57,14 @@  #define VIDCON0_CLKVALUP			(1 << 16)  #define VIDCON0_CLKVAL_F_MASK			(0xff << 6) -#define VIDCON0_CLKVAL_F_SHIFT			(6) -#define VIDCON0_CLKVAL_F_LIMIT			(0xff) +#define VIDCON0_CLKVAL_F_SHIFT			6 +#define VIDCON0_CLKVAL_F_LIMIT			0xff  #define VIDCON0_CLKVAL_F(_x)			((_x) << 6)  #define VIDCON0_VLCKFREE			(1 << 5)  #define VIDCON0_CLKDIR				(1 << 4)  #define VIDCON0_CLKSEL_MASK			(0x3 << 2) -#define VIDCON0_CLKSEL_SHIFT			(2) +#define VIDCON0_CLKSEL_SHIFT			2  #define VIDCON0_CLKSEL_HCLK			(0x0 << 2)  #define VIDCON0_CLKSEL_LCD			(0x1 << 2)  #define VIDCON0_CLKSEL_27M			(0x3 << 2) @@ -76,17 +72,17 @@  #define VIDCON0_ENVID				(1 << 1)  #define VIDCON0_ENVID_F				(1 << 0) -#define VIDCON1					(0x04) +#define VIDCON1					0x04  #define VIDCON1_LINECNT_MASK			(0x7ff << 16) -#define VIDCON1_LINECNT_SHIFT			(16) +#define VIDCON1_LINECNT_SHIFT			16  #define VIDCON1_LINECNT_GET(_v)			(((_v) >> 16) & 0x7ff)  #define VIDCON1_FSTATUS_EVEN			(1 << 15)  #define VIDCON1_VSTATUS_MASK			(0x3 << 13) -#define VIDCON1_VSTATUS_SHIFT			(13) +#define VIDCON1_VSTATUS_SHIFT			13  #define VIDCON1_VSTATUS_VSYNC			(0x0 << 13)  #define VIDCON1_VSTATUS_BACKPORCH		(0x1 << 13)  #define VIDCON1_VSTATUS_ACTIVE			(0x2 << 13) -#define VIDCON1_VSTATUS_FRONTPORCH		(0x0 << 13) +#define VIDCON1_VSTATUS_FRONTPORCH		(0x3 << 13)  #define VIDCON1_VCLK_MASK			(0x3 << 9)  #define VIDCON1_VCLK_HOLD			(0x0 << 9)  #define VIDCON1_VCLK_RUN			(0x1 << 9) @@ -98,12 +94,12 @@  /* VIDCON2 */ -#define VIDCON2					(0x08) +#define VIDCON2					0x08  #define VIDCON2_EN601				(1 << 23)  #define VIDCON2_TVFMTSEL_SW			(1 << 14)  #define VIDCON2_TVFMTSEL1_MASK			(0x3 << 12) -#define VIDCON2_TVFMTSEL1_SHIFT			(12) +#define VIDCON2_TVFMTSEL1_SHIFT			12  #define VIDCON2_TVFMTSEL1_RGB			(0x0 << 12)  #define VIDCON2_TVFMTSEL1_YUV422		(0x1 << 12)  #define VIDCON2_TVFMTSEL1_YUV444		(0x2 << 12) @@ -115,74 +111,75 @@   * Might not be present in the S3C6410 documentation,   * but tests prove it's there almost for sure; shouldn't hurt in any case.   */ -#define PRTCON					(0x0c) +#define PRTCON					0x0c  #define PRTCON_PROTECT				(1 << 11)  /* VIDTCON0 */ -#define VIDTCON0				(0x10) +#define VIDTCON0				0x10  #define VIDTCON0_VBPDE_MASK			(0xff << 24) -#define VIDTCON0_VBPDE_SHIFT			(24) -#define VIDTCON0_VBPDE_LIMIT			(0xff) +#define VIDTCON0_VBPDE_SHIFT			24 +#define VIDTCON0_VBPDE_LIMIT			0xff  #define VIDTCON0_VBPDE(_x)			((_x) << 24)  #define VIDTCON0_VBPD_MASK			(0xff << 16) -#define VIDTCON0_VBPD_SHIFT			(16) -#define VIDTCON0_VBPD_LIMIT			(0xff) +#define VIDTCON0_VBPD_SHIFT			16 +#define VIDTCON0_VBPD_LIMIT			0xff  #define VIDTCON0_VBPD(_x)			((_x) << 16)  #define VIDTCON0_VFPD_MASK			(0xff << 8) -#define VIDTCON0_VFPD_SHIFT			(8) -#define VIDTCON0_VFPD_LIMIT			(0xff) +#define VIDTCON0_VFPD_SHIFT			8 +#define VIDTCON0_VFPD_LIMIT			0xff  #define VIDTCON0_VFPD(_x)			((_x) << 8)  #define VIDTCON0_VSPW_MASK			(0xff << 0) -#define VIDTCON0_VSPW_SHIFT			(0) -#define VIDTCON0_VSPW_LIMIT			(0xff) +#define VIDTCON0_VSPW_SHIFT			0 +#define VIDTCON0_VSPW_LIMIT			0xff  #define VIDTCON0_VSPW(_x)			((_x) << 0)  /* VIDTCON1 */ -#define VIDTCON1				(0x14) +#define VIDTCON1				0x14  #define VIDTCON1_VFPDE_MASK			(0xff << 24) -#define VIDTCON1_VFPDE_SHIFT			(24) -#define VIDTCON1_VFPDE_LIMIT			(0xff) +#define VIDTCON1_VFPDE_SHIFT			24 +#define VIDTCON1_VFPDE_LIMIT			0xff  #define VIDTCON1_VFPDE(_x)			((_x) << 24)  #define VIDTCON1_HBPD_MASK			(0xff << 16) -#define VIDTCON1_HBPD_SHIFT			(16) -#define VIDTCON1_HBPD_LIMIT			(0xff) +#define VIDTCON1_HBPD_SHIFT			16 +#define VIDTCON1_HBPD_LIMIT			0xff  #define VIDTCON1_HBPD(_x)			((_x) << 16)  #define VIDTCON1_HFPD_MASK			(0xff << 8) -#define VIDTCON1_HFPD_SHIFT			(8) -#define VIDTCON1_HFPD_LIMIT			(0xff) +#define VIDTCON1_HFPD_SHIFT			8 +#define VIDTCON1_HFPD_LIMIT			0xff  #define VIDTCON1_HFPD(_x)			((_x) << 8)  #define VIDTCON1_HSPW_MASK			(0xff << 0) -#define VIDTCON1_HSPW_SHIFT			(0) -#define VIDTCON1_HSPW_LIMIT			(0xff) +#define VIDTCON1_HSPW_SHIFT			0 +#define VIDTCON1_HSPW_LIMIT			0xff  #define VIDTCON1_HSPW(_x)			((_x) << 0) -#define VIDTCON2				(0x18) -#define VIDTCON2				(0x18) +#define VIDTCON2				0x18  #define VIDTCON2_LINEVAL_E(_x)			((((_x) & 0x800) >> 11) << 23)  #define VIDTCON2_LINEVAL_MASK			(0x7ff << 11) -#define VIDTCON2_LINEVAL_SHIFT			(11) -#define VIDTCON2_LINEVAL_LIMIT			(0x7ff) +#define VIDTCON2_LINEVAL_SHIFT			11 +#define VIDTCON2_LINEVAL_LIMIT			0x7ff  #define VIDTCON2_LINEVAL(_x)			(((_x) & 0x7ff) << 11)  #define VIDTCON2_HOZVAL_E(_x)			((((_x) & 0x800) >> 11) << 22)  #define VIDTCON2_HOZVAL_MASK			(0x7ff << 0) -#define VIDTCON2_HOZVAL_SHIFT			(0) -#define VIDTCON2_HOZVAL_LIMIT			(0x7ff) +#define VIDTCON2_HOZVAL_SHIFT			0 +#define VIDTCON2_HOZVAL_LIMIT			0x7ff  #define VIDTCON2_HOZVAL(_x)			(((_x) & 0x7ff) << 0)  /* WINCONx */  #define WINCON(_win)				(0x20 + ((_win) * 4)) +#define WINCONx_CSCCON_EQ601			(0x0 << 28) +#define WINCONx_CSCCON_EQ709			(0x1 << 28)  #define WINCONx_CSCWIDTH_MASK			(0x3 << 26) -#define WINCONx_CSCWIDTH_SHIFT			(26) +#define WINCONx_CSCWIDTH_SHIFT			26  #define WINCONx_CSCWIDTH_WIDE			(0x0 << 26)  #define WINCONx_CSCWIDTH_NARROW			(0x3 << 26)  #define WINCONx_ENLOCAL				(1 << 22) @@ -195,14 +192,14 @@  #define WINCONx_WSWP				(1 << 15)  #define WINCONx_YCbCr				(1 << 13)  #define WINCONx_BURSTLEN_MASK			(0x3 << 9) -#define WINCONx_BURSTLEN_SHIFT			(9) +#define WINCONx_BURSTLEN_SHIFT			9  #define WINCONx_BURSTLEN_16WORD			(0x0 << 9)  #define WINCONx_BURSTLEN_8WORD			(0x1 << 9)  #define WINCONx_BURSTLEN_4WORD			(0x2 << 9)  #define WINCONx_ENWIN				(1 << 0)  #define WINCON0_BPPMODE_MASK			(0xf << 2) -#define WINCON0_BPPMODE_SHIFT			(2) +#define WINCON0_BPPMODE_SHIFT			2  #define WINCON0_BPPMODE_1BPP			(0x0 << 2)  #define WINCON0_BPPMODE_2BPP			(0x1 << 2)  #define WINCON0_BPPMODE_4BPP			(0x2 << 2) @@ -215,7 +212,7 @@  #define WINCON1_LOCALSEL_CAMIF			(1 << 23)  #define WINCON1_BLD_PIX				(1 << 6)  #define WINCON1_BPPMODE_MASK			(0xf << 2) -#define WINCON1_BPPMODE_SHIFT			(2) +#define WINCON1_BPPMODE_SHIFT			2  #define WINCON1_BPPMODE_1BPP			(0x0 << 2)  #define WINCON1_BPPMODE_2BPP			(0x1 << 2)  #define WINCON1_BPPMODE_4BPP			(0x2 << 2) @@ -234,7 +231,7 @@  #define WINCON1_ALPHA_SEL			(1 << 1)  /* S5PV210 */ -#define SHADOWCON				(0x34) +#define SHADOWCON				0x34  #define SHADOWCON_WINx_PROTECT(_win)		(1 << (10 + (_win)))  /* DMA channels (all windows) */  #define SHADOWCON_CHx_ENABLE(_win)		(1 << (_win)) @@ -243,52 +240,52 @@  /* VIDOSDx */ -#define VIDOSD_BASE				(0x40) +#define VIDOSD_BASE				0x40  #define VIDOSDxA_TOPLEFT_X_E(_x)		((((_x) & 0x800) >> 11) << 23)  #define VIDOSDxA_TOPLEFT_X_MASK			(0x7ff << 11) -#define VIDOSDxA_TOPLEFT_X_SHIFT		(11) -#define VIDOSDxA_TOPLEFT_X_LIMIT		(0x7ff) +#define VIDOSDxA_TOPLEFT_X_SHIFT		11 +#define VIDOSDxA_TOPLEFT_X_LIMIT		0x7ff  #define VIDOSDxA_TOPLEFT_X(_x)			(((_x) & 0x7ff) << 11)  #define VIDOSDxA_TOPLEFT_Y_E(_x)		((((_x) & 0x800) >> 11) << 22)  #define VIDOSDxA_TOPLEFT_Y_MASK			(0x7ff << 0) -#define VIDOSDxA_TOPLEFT_Y_SHIFT		(0) -#define VIDOSDxA_TOPLEFT_Y_LIMIT		(0x7ff) +#define VIDOSDxA_TOPLEFT_Y_SHIFT		0 +#define VIDOSDxA_TOPLEFT_Y_LIMIT		0x7ff  #define VIDOSDxA_TOPLEFT_Y(_x)			(((_x) & 0x7ff) << 0)  #define VIDOSDxB_BOTRIGHT_X_E(_x)		((((_x) & 0x800) >> 11) << 23)  #define VIDOSDxB_BOTRIGHT_X_MASK		(0x7ff << 11) -#define VIDOSDxB_BOTRIGHT_X_SHIFT		(11) -#define VIDOSDxB_BOTRIGHT_X_LIMIT		(0x7ff) +#define VIDOSDxB_BOTRIGHT_X_SHIFT		11 +#define VIDOSDxB_BOTRIGHT_X_LIMIT		0x7ff  #define VIDOSDxB_BOTRIGHT_X(_x)			(((_x) & 0x7ff) << 11)  #define VIDOSDxB_BOTRIGHT_Y_E(_x)		((((_x) & 0x800) >> 11) << 22)  #define VIDOSDxB_BOTRIGHT_Y_MASK		(0x7ff << 0) -#define VIDOSDxB_BOTRIGHT_Y_SHIFT		(0) -#define VIDOSDxB_BOTRIGHT_Y_LIMIT		(0x7ff) +#define VIDOSDxB_BOTRIGHT_Y_SHIFT		0 +#define VIDOSDxB_BOTRIGHT_Y_LIMIT		0x7ff  #define VIDOSDxB_BOTRIGHT_Y(_x)			(((_x) & 0x7ff) << 0)  /* For VIDOSD[1..4]C */  #define VIDISD14C_ALPHA0_R(_x)			((_x) << 20)  #define VIDISD14C_ALPHA0_G_MASK			(0xf << 16) -#define VIDISD14C_ALPHA0_G_SHIFT		(16) -#define VIDISD14C_ALPHA0_G_LIMIT		(0xf) +#define VIDISD14C_ALPHA0_G_SHIFT		16 +#define VIDISD14C_ALPHA0_G_LIMIT		0xf  #define VIDISD14C_ALPHA0_G(_x)			((_x) << 16)  #define VIDISD14C_ALPHA0_B_MASK			(0xf << 12) -#define VIDISD14C_ALPHA0_B_SHIFT		(12) -#define VIDISD14C_ALPHA0_B_LIMIT		(0xf) +#define VIDISD14C_ALPHA0_B_SHIFT		12 +#define VIDISD14C_ALPHA0_B_LIMIT		0xf  #define VIDISD14C_ALPHA0_B(_x)			((_x) << 12)  #define VIDISD14C_ALPHA1_R_MASK			(0xf << 8) -#define VIDISD14C_ALPHA1_R_SHIFT		(8) -#define VIDISD14C_ALPHA1_R_LIMIT		(0xf) +#define VIDISD14C_ALPHA1_R_SHIFT		8 +#define VIDISD14C_ALPHA1_R_LIMIT		0xf  #define VIDISD14C_ALPHA1_R(_x)			((_x) << 8)  #define VIDISD14C_ALPHA1_G_MASK			(0xf << 4) -#define VIDISD14C_ALPHA1_G_SHIFT		(4) -#define VIDISD14C_ALPHA1_G_LIMIT		(0xf) +#define VIDISD14C_ALPHA1_G_SHIFT		4 +#define VIDISD14C_ALPHA1_G_LIMIT		0xf  #define VIDISD14C_ALPHA1_G(_x)			((_x) << 4)  #define VIDISD14C_ALPHA1_B_MASK			(0xf << 0) -#define VIDISD14C_ALPHA1_B_SHIFT		(0) -#define VIDISD14C_ALPHA1_B_LIMIT		(0xf) +#define VIDISD14C_ALPHA1_B_SHIFT		0 +#define VIDISD14C_ALPHA1_B_LIMIT		0xf  #define VIDISD14C_ALPHA1_B(_x)			((_x) << 0)  /* Video buffer addresses */ @@ -300,22 +297,22 @@  #define VIDW_BUF_SIZE_OFFSET_E(_x)		((((_x) & 0x2000) >> 13) << 27)  #define VIDW_BUF_SIZE_OFFSET_MASK		(0x1fff << 13) -#define VIDW_BUF_SIZE_OFFSET_SHIFT		(13) -#define VIDW_BUF_SIZE_OFFSET_LIMIT		(0x1fff) +#define VIDW_BUF_SIZE_OFFSET_SHIFT		13 +#define VIDW_BUF_SIZE_OFFSET_LIMIT		0x1fff  #define VIDW_BUF_SIZE_OFFSET(_x)		(((_x) & 0x1fff) << 13)  #define VIDW_BUF_SIZE_PAGEWIDTH_E(_x)		((((_x) & 0x2000) >> 13) << 26)  #define VIDW_BUF_SIZE_PAGEWIDTH_MASK		(0x1fff << 0) -#define VIDW_BUF_SIZE_PAGEWIDTH_SHIFT		(0) -#define VIDW_BUF_SIZE_PAGEWIDTH_LIMIT		(0x1fff) +#define VIDW_BUF_SIZE_PAGEWIDTH_SHIFT		0 +#define VIDW_BUF_SIZE_PAGEWIDTH_LIMIT		0x1fff  #define VIDW_BUF_SIZE_PAGEWIDTH(_x)		(((_x) & 0x1fff) << 0)  /* Interrupt controls and status */ -#define VIDINTCON0				(0x130) +#define VIDINTCON0				0x130  #define VIDINTCON0_FIFOINTERVAL_MASK		(0x3f << 20) -#define VIDINTCON0_FIFOINTERVAL_SHIFT		(20) -#define VIDINTCON0_FIFOINTERVAL_LIMIT		(0x3f) +#define VIDINTCON0_FIFOINTERVAL_SHIFT		20 +#define VIDINTCON0_FIFOINTERVAL_LIMIT		0x3f  #define VIDINTCON0_FIFOINTERVAL(_x)		((_x) << 20)  #define VIDINTCON0_INT_SYSMAINCON		(1 << 19) @@ -323,7 +320,7 @@  #define VIDINTCON0_INT_I80IFDONE		(1 << 17)  #define VIDINTCON0_FRAMESEL0_MASK		(0x3 << 15) -#define VIDINTCON0_FRAMESEL0_SHIFT		(15) +#define VIDINTCON0_FRAMESEL0_SHIFT		15  #define VIDINTCON0_FRAMESEL0_BACKPORCH		(0x0 << 15)  #define VIDINTCON0_FRAMESEL0_VSYNC		(0x1 << 15)  #define VIDINTCON0_FRAMESEL0_ACTIVE		(0x2 << 15) @@ -338,7 +335,7 @@  #define VIDINTCON0_INT_FRAME			(1 << 12)  #define VIDINTCON0_FIFIOSEL_MASK		(0x7f << 5) -#define VIDINTCON0_FIFIOSEL_SHIFT		(5) +#define VIDINTCON0_FIFIOSEL_SHIFT		5  #define VIDINTCON0_FIFIOSEL_WINDOW0		(0x1 << 5)  #define VIDINTCON0_FIFIOSEL_WINDOW1		(0x2 << 5)  #define VIDINTCON0_FIFIOSEL_WINDOW2		(0x10 << 5) @@ -346,7 +343,7 @@  #define VIDINTCON0_FIFIOSEL_WINDOW4		(0x40 << 5)  #define VIDINTCON0_FIFOLEVEL_MASK		(0x7 << 2) -#define VIDINTCON0_FIFOLEVEL_SHIFT		(2) +#define VIDINTCON0_FIFOLEVEL_SHIFT		2  #define VIDINTCON0_FIFOLEVEL_TO25PC		(0x0 << 2)  #define VIDINTCON0_FIFOLEVEL_TO50PC		(0x1 << 2)  #define VIDINTCON0_FIFOLEVEL_TO75PC		(0x2 << 2) @@ -354,46 +351,46 @@  #define VIDINTCON0_FIFOLEVEL_FULL		(0x4 << 2)  #define VIDINTCON0_INT_FIFO_MASK		(0x3 << 0) -#define VIDINTCON0_INT_FIFO_SHIFT		(0) +#define VIDINTCON0_INT_FIFO_SHIFT		0  #define VIDINTCON0_INT_ENABLE			(1 << 0) -#define VIDINTCON1				(0x134) +#define VIDINTCON1				0x134  #define VIDINTCON1_INT_I180			(1 << 2)  #define VIDINTCON1_INT_FRAME			(1 << 1)  #define VIDINTCON1_INT_FIFO			(1 << 0)  /* Window colour-key control registers */ -#define WKEYCON					(0x140)	/* 6410,V210 */ +#define WKEYCON					0x140 -#define WKEYCON0				(0x00) -#define WKEYCON1				(0x04) +#define WKEYCON0				0x00 +#define WKEYCON1				0x04  #define WxKEYCON0_KEYBL_EN			(1 << 26)  #define WxKEYCON0_KEYEN_F			(1 << 25)  #define WxKEYCON0_DIRCON			(1 << 24)  #define WxKEYCON0_COMPKEY_MASK			(0xffffff << 0) -#define WxKEYCON0_COMPKEY_SHIFT			(0) -#define WxKEYCON0_COMPKEY_LIMIT			(0xffffff) +#define WxKEYCON0_COMPKEY_SHIFT			0 +#define WxKEYCON0_COMPKEY_LIMIT			0xffffff  #define WxKEYCON0_COMPKEY(_x)			((_x) << 0)  #define WxKEYCON1_COLVAL_MASK			(0xffffff << 0) -#define WxKEYCON1_COLVAL_SHIFT			(0) -#define WxKEYCON1_COLVAL_LIMIT			(0xffffff) +#define WxKEYCON1_COLVAL_SHIFT			0 +#define WxKEYCON1_COLVAL_LIMIT			0xffffff  #define WxKEYCON1_COLVAL(_x)			((_x) << 0)  /* Dithering control */ -#define DITHMODE				(0x170) +#define DITHMODE				0x170  #define DITHMODE_R_POS_MASK			(0x3 << 5) -#define DITHMODE_R_POS_SHIFT			(5) +#define DITHMODE_R_POS_SHIFT			5  #define DITHMODE_R_POS_8BIT			(0x0 << 5)  #define DITHMODE_R_POS_6BIT			(0x1 << 5)  #define DITHMODE_R_POS_5BIT			(0x2 << 5)  #define DITHMODE_G_POS_MASK			(0x3 << 3) -#define DITHMODE_G_POS_SHIFT			(3) +#define DITHMODE_G_POS_SHIFT			3  #define DITHMODE_G_POS_8BIT			(0x0 << 3)  #define DITHMODE_G_POS_6BIT			(0x1 << 3)  #define DITHMODE_G_POS_5BIT			(0x2 << 3)  #define DITHMODE_B_POS_MASK			(0x3 << 1) -#define DITHMODE_B_POS_SHIFT			(1) +#define DITHMODE_B_POS_SHIFT			1  #define DITHMODE_B_POS_8BIT			(0x0 << 1)  #define DITHMODE_B_POS_6BIT			(0x1 << 1)  #define DITHMODE_B_POS_5BIT			(0x2 << 1) @@ -403,18 +400,18 @@  #define WINxMAP(_win)				(0x180 + ((_win) * 4))  #define WINxMAP_MAP				(1 << 24)  #define WINxMAP_MAP_COLOUR_MASK			(0xffffff << 0) -#define WINxMAP_MAP_COLOUR_SHIFT		(0) -#define WINxMAP_MAP_COLOUR_LIMIT		(0xffffff) +#define WINxMAP_MAP_COLOUR_SHIFT		0 +#define WINxMAP_MAP_COLOUR_LIMIT		0xffffff  #define WINxMAP_MAP_COLOUR(_x)			((_x) << 0)  /* Winodw palette control */ -#define WPALCON					(0x1A0) +#define WPALCON					0x1A0  #define WPALCON_PAL_UPDATE			(1 << 9)  #define WPALCON_W4PAL_16BPP_A555		(1 << 8)  #define WPALCON_W3PAL_16BPP_A555		(1 << 7)  #define WPALCON_W2PAL_16BPP_A555		(1 << 6)  #define WPALCON_W1PAL_MASK			(0x7 << 3) -#define WPALCON_W1PAL_SHIFT			(3) +#define WPALCON_W1PAL_SHIFT			3  #define WPALCON_W1PAL_25BPP_A888		(0x0 << 3)  #define WPALCON_W1PAL_24BPP			(0x1 << 3)  #define WPALCON_W1PAL_19BPP_A666		(0x2 << 3) @@ -423,7 +420,7 @@  #define WPALCON_W1PAL_16BPP_A555		(0x5 << 3)  #define WPALCON_W1PAL_16BPP_565			(0x6 << 3)  #define WPALCON_W0PAL_MASK			(0x7 << 0) -#define WPALCON_W0PAL_SHIFT			(0) +#define WPALCON_W0PAL_SHIFT			0  #define WPALCON_W0PAL_25BPP_A888		(0x0 << 0)  #define WPALCON_W0PAL_24BPP			(0x1 << 0)  #define WPALCON_W0PAL_19BPP_A666		(0x2 << 0) @@ -433,13 +430,11 @@  #define WPALCON_W0PAL_16BPP_565			(0x6 << 0)  /* Blending equation control */ -#define BLENDCON				(0x260) +#define BLENDCON				0x260  #define BLENDCON_NEW_MASK			(1 << 0)  #define BLENDCON_NEW_8BIT_ALPHA_VALUE		(1 << 0)  #define BLENDCON_NEW_4BIT_ALPHA_VALUE		(0 << 0) -#define S3C_FB_MAX_WIN (5)  /* number of hardware windows available. */ -  /* Notes on per-window bpp settings   *   * Value	Win0	 Win1	  Win2	   Win3	    Win 4 @@ -462,8 +457,8 @@  */  /* FIMD Version 8 register offset definitions */ -#define FIMD_V8_VIDTCON0	(0x20010) -#define FIMD_V8_VIDTCON1	(0x20014) -#define FIMD_V8_VIDTCON2	(0x20018) -#define FIMD_V8_VIDTCON3	(0x2001C) -#define FIMD_V8_VIDCON1		(0x20004) +#define FIMD_V8_VIDTCON0	0x20010 +#define FIMD_V8_VIDTCON1	0x20014 +#define FIMD_V8_VIDTCON2	0x20018 +#define FIMD_V8_VIDTCON3	0x2001C +#define FIMD_V8_VIDCON1		0x20004 diff --git a/include/video/sisfb.h b/include/video/sisfb.h index 6dc5df9e43f..6ddff93108f 100644 --- a/include/video/sisfb.h +++ b/include/video/sisfb.h @@ -17,197 +17,12 @@   * 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_SISFB_H_  #define _LINUX_SISFB_H_ -#include <linux/types.h> -#include <asm/ioctl.h> - -/**********************************************/ -/*                   PUBLIC                   */ -/**********************************************/ - -/* vbflags, public (others in sis.h) */ -#define CRT2_DEFAULT		0x00000001 -#define CRT2_LCD		0x00000002 -#define CRT2_TV			0x00000004 -#define CRT2_VGA		0x00000008 -#define TV_NTSC			0x00000010 -#define TV_PAL			0x00000020 -#define TV_HIVISION		0x00000040 -#define TV_YPBPR		0x00000080 -#define TV_AVIDEO		0x00000100 -#define TV_SVIDEO		0x00000200 -#define TV_SCART		0x00000400 -#define TV_PALM			0x00001000 -#define TV_PALN			0x00002000 -#define TV_NTSCJ		0x00001000 -#define TV_CHSCART		0x00008000 -#define TV_CHYPBPR525I		0x00010000 -#define CRT1_VGA		0x00000000 -#define CRT1_LCDA		0x00020000 -#define VGA2_CONNECTED          0x00040000 -#define VB_DISPTYPE_CRT1	0x00080000	/* CRT1 connected and used */ -#define VB_SINGLE_MODE		0x20000000	/* CRT1 or CRT2; determined by DISPTYPE_CRTx */ -#define VB_MIRROR_MODE		0x40000000	/* CRT1 + CRT2 identical (mirror mode) */ -#define VB_DUALVIEW_MODE	0x80000000	/* CRT1 + CRT2 independent (dual head mode) */ - -/* Aliases: */ -#define CRT2_ENABLE		(CRT2_LCD | CRT2_TV | CRT2_VGA) -#define TV_STANDARD		(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ) -#define TV_INTERFACE		(TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR|TV_CHSCART|TV_CHYPBPR525I) - -/* Only if TV_YPBPR is set: */ -#define TV_YPBPR525I		TV_NTSC -#define TV_YPBPR525P		TV_PAL -#define TV_YPBPR750P		TV_PALM -#define TV_YPBPR1080I		TV_PALN -#define TV_YPBPRALL 		(TV_YPBPR525I | TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I) - -#define VB_DISPTYPE_DISP2	CRT2_ENABLE -#define VB_DISPTYPE_CRT2	CRT2_ENABLE -#define VB_DISPTYPE_DISP1	VB_DISPTYPE_CRT1 -#define VB_DISPMODE_SINGLE	VB_SINGLE_MODE -#define VB_DISPMODE_MIRROR	VB_MIRROR_MODE -#define VB_DISPMODE_DUAL	VB_DUALVIEW_MODE -#define VB_DISPLAY_MODE		(SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) - -/* Structure argument for SISFB_GET_INFO ioctl  */ -struct sisfb_info { -	__u32	sisfb_id;		/* for identifying sisfb */ -#ifndef SISFB_ID -#define SISFB_ID	  0x53495346    /* Identify myself with 'SISF' */ -#endif -	__u32   chip_id;		/* PCI-ID of detected chip */ -	__u32   memory;			/* total video memory in KB */ -	__u32   heapstart;		/* heap start offset in KB */ -	__u8    fbvidmode;		/* current sisfb mode */ - -	__u8	sisfb_version; -	__u8	sisfb_revision; -	__u8	sisfb_patchlevel; - -	__u8	sisfb_caps;		/* sisfb capabilities */ - -	__u32	sisfb_tqlen;		/* turbo queue length (in KB) */ - -	__u32	sisfb_pcibus;		/* The card's PCI ID */ -	__u32	sisfb_pcislot; -	__u32	sisfb_pcifunc; - -	__u8	sisfb_lcdpdc;		/* PanelDelayCompensation */ - -	__u8	sisfb_lcda;		/* Detected status of LCDA for low res/text modes */ - -	__u32	sisfb_vbflags; -	__u32	sisfb_currentvbflags; - -	__u32	sisfb_scalelcd; -	__u32	sisfb_specialtiming; - -	__u8	sisfb_haveemi; -	__u8	sisfb_emi30,sisfb_emi31,sisfb_emi32,sisfb_emi33; -	__u8	sisfb_haveemilcd; - -	__u8	sisfb_lcdpdca;		/* PanelDelayCompensation for LCD-via-CRT1 */ - -	__u16	sisfb_tvxpos, sisfb_tvypos;	/* Warning: Values + 32 ! */ - -	__u32	sisfb_heapsize;		/* heap size (in KB) */ -	__u32	sisfb_videooffset;	/* Offset of viewport in video memory (in bytes) */ - -	__u32	sisfb_curfstn;		/* currently running FSTN/DSTN mode */ -	__u32	sisfb_curdstn; - -	__u16	sisfb_pci_vendor;	/* PCI vendor (SiS or XGI) */ - -	__u32	sisfb_vbflags2;		/* ivideo->vbflags2 */ - -	__u8	sisfb_can_post;		/* sisfb can POST this card */ -	__u8	sisfb_card_posted;	/* card is POSTED */ -	__u8	sisfb_was_boot_device;	/* This card was the boot video device (ie is primary) */ - -	__u8	reserved[183];		/* for future use */ -}; - -#define SISFB_CMD_GETVBFLAGS	0x55AA0001	/* no arg; result[1] = vbflags */ -#define SISFB_CMD_SWITCHCRT1	0x55AA0010	/* arg[0]: 99 = query, 0 = off, 1 = on */ -/* more to come */ - -#define SISFB_CMD_ERR_OK	0x80000000	/* command succeeded */ -#define SISFB_CMD_ERR_LOCKED	0x80000001	/* sisfb is locked */ -#define SISFB_CMD_ERR_EARLY	0x80000002	/* request before sisfb took over gfx system */ -#define SISFB_CMD_ERR_NOVB	0x80000003	/* No video bridge */ -#define SISFB_CMD_ERR_NOCRT2	0x80000004	/* can't change CRT1 status, CRT2 disabled */ -/* more to come */ -#define SISFB_CMD_ERR_UNKNOWN   0x8000ffff	/* Unknown command */ -#define SISFB_CMD_ERR_OTHER	0x80010000	/* Other error */ - -/* Argument for SISFB_CMD ioctl */ -struct sisfb_cmd { -	__u32  sisfb_cmd; -	__u32  sisfb_arg[16]; -	__u32  sisfb_result[4]; -}; - -/* Additional IOCTLs for communication sisfb <> X driver                */ -/* If changing this, vgatypes.h must also be changed (for X driver)    */ - -/* ioctl for identifying and giving some info (esp. memory heap start) */ -#define SISFB_GET_INFO_SIZE	_IOR(0xF3,0x00,__u32) -#define SISFB_GET_INFO		_IOR(0xF3,0x01,struct sisfb_info) - -/* ioctrl to get current vertical retrace status */ -#define SISFB_GET_VBRSTATUS	_IOR(0xF3,0x02,__u32) - -/* ioctl to enable/disable panning auto-maximize (like nomax parameter) */ -#define SISFB_GET_AUTOMAXIMIZE	_IOR(0xF3,0x03,__u32) -#define SISFB_SET_AUTOMAXIMIZE	_IOW(0xF3,0x03,__u32) - -/* ioctls to relocate TV output (x=D[31:16], y=D[15:0], + 32)*/ -#define SISFB_GET_TVPOSOFFSET	_IOR(0xF3,0x04,__u32) -#define SISFB_SET_TVPOSOFFSET	_IOW(0xF3,0x04,__u32) - -/* ioctl for internal sisfb commands (sisfbctrl) */ -#define SISFB_COMMAND		_IOWR(0xF3,0x05,struct sisfb_cmd) - -/* ioctl for locking sisfb (no register access during lock) */ -/* As of now, only used to avoid register access during - * the ioctls listed above. - */ -#define SISFB_SET_LOCK		_IOW(0xF3,0x06,__u32) - -/* ioctls 0xF3 up to 0x3F reserved for sisfb */ - -/****************************************************************/ -/* The following are deprecated and should not be used anymore: */ -/****************************************************************/ -/* ioctl for identifying and giving some info (esp. memory heap start) */ -#define SISFB_GET_INFO_OLD	   _IOR('n',0xF8,__u32) -/* ioctrl to get current vertical retrace status */ -#define SISFB_GET_VBRSTATUS_OLD	   _IOR('n',0xF9,__u32) -/* ioctl to enable/disable panning auto-maximize (like nomax parameter) */ -#define SISFB_GET_AUTOMAXIMIZE_OLD _IOR('n',0xFA,__u32) -#define SISFB_SET_AUTOMAXIMIZE_OLD _IOW('n',0xFA,__u32) -/****************************************************************/ -/*               End of deprecated ioctl numbers                */ -/****************************************************************/ - -/* For fb memory manager (FBIO_ALLOC, FBIO_FREE) */ -struct sis_memreq { -	__u32	offset; -	__u32	size; -}; - -/**********************************************/ -/*                  PRIVATE                   */ -/*         (for IN-KERNEL usage only)         */ -/**********************************************/ - -#ifdef __KERNEL__  #include <linux/pci.h> +#include <uapi/video/sisfb.h>  #define	UNKNOWN_VGA  0  #define	SIS_300_VGA  1 @@ -220,5 +35,3 @@ extern void sis_malloc_new(struct pci_dev *pdev, struct sis_memreq *req);  extern void sis_free(u32 base);  extern void sis_free_new(struct pci_dev *pdev, u32 base);  #endif - -#endif diff --git a/include/video/uvesafb.h b/include/video/uvesafb.h index 0993a220a3e..1a91850cb96 100644 --- a/include/video/uvesafb.h +++ b/include/video/uvesafb.h @@ -1,63 +1,8 @@  #ifndef _UVESAFB_H  #define _UVESAFB_H -#include <linux/types.h> +#include <uapi/video/uvesafb.h> -struct v86_regs { -	__u32 ebx; -	__u32 ecx; -	__u32 edx; -	__u32 esi; -	__u32 edi; -	__u32 ebp; -	__u32 eax; -	__u32 eip; -	__u32 eflags; -	__u32 esp; -	__u16 cs; -	__u16 ss; -	__u16 es; -	__u16 ds; -	__u16 fs; -	__u16 gs; -}; - -/* Task flags */ -#define TF_VBEIB	0x01 -#define TF_BUF_ESDI	0x02 -#define TF_BUF_ESBX	0x04 -#define TF_BUF_RET	0x08 -#define TF_EXIT		0x10 - -struct uvesafb_task { -	__u8 flags; -	int buf_len; -	struct v86_regs regs; -}; - -/* Constants for the capabilities field - * in vbe_ib */ -#define VBE_CAP_CAN_SWITCH_DAC	0x01 -#define VBE_CAP_VGACOMPAT	0x02 - -/* The VBE Info Block */ -struct vbe_ib { -	char  vbe_signature[4]; -	__u16 vbe_version; -	__u32 oem_string_ptr; -	__u32 capabilities; -	__u32 mode_list_ptr; -	__u16 total_memory; -	__u16 oem_software_rev; -	__u32 oem_vendor_name_ptr; -	__u32 oem_product_name_ptr; -	__u32 oem_product_rev_ptr; -	__u8  reserved[222]; -	char  oem_data[256]; -	char  misc_data[512]; -} __attribute__ ((packed)); - -#ifdef __KERNEL__  /* VBE CRTC Info Block */  struct vbe_crtc_ib { @@ -191,5 +136,4 @@ struct uvesafb_par {  	struct vbe_crtc_ib crtc;  }; -#endif /* __KERNEL__ */  #endif /* _UVESAFB_H */ diff --git a/include/video/videomode.h b/include/video/videomode.h new file mode 100644 index 00000000000..3f1049d870d --- /dev/null +++ b/include/video/videomode.h @@ -0,0 +1,58 @@ +/* + * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> + * + * generic videomode description + * + * This file is released under the GPLv2 + */ + +#ifndef __LINUX_VIDEOMODE_H +#define __LINUX_VIDEOMODE_H + +#include <linux/types.h> +#include <video/display_timing.h> + +/* + * Subsystem independent description of a videomode. + * Can be generated from struct display_timing. + */ +struct videomode { +	unsigned long pixelclock;	/* pixelclock in Hz */ + +	u32 hactive; +	u32 hfront_porch; +	u32 hback_porch; +	u32 hsync_len; + +	u32 vactive; +	u32 vfront_porch; +	u32 vback_porch; +	u32 vsync_len; + +	enum display_flags flags; /* display flags */ +}; + +/** + * videomode_from_timing - convert display timing to videomode + * @dt: display_timing structure + * @vm: return value + * + * DESCRIPTION: + * This function converts a struct display_timing to a struct videomode. + */ +void videomode_from_timing(const struct display_timing *dt, +			  struct videomode *vm); + +/** + * videomode_from_timings - convert one display timings entry to videomode + * @disp: structure with all possible timing entries + * @vm: return value + * @index: index into the list of display timings in devicetree + * + * DESCRIPTION: + * This function converts one struct display_timing entry to a struct videomode. + */ +int videomode_from_timings(const struct display_timings *disp, +			  struct videomode *vm, unsigned int index); + +#endif diff --git a/include/xen/acpi.h b/include/xen/acpi.h index 48a9c0171b6..68d73d09b77 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -40,6 +40,41 @@  #include <xen/xen.h>  #include <linux/acpi.h> +#define ACPI_MEMORY_DEVICE_CLASS        "memory" +#define ACPI_MEMORY_DEVICE_HID          "PNP0C80" +#define ACPI_MEMORY_DEVICE_NAME         "Hotplug Mem Device" + +int xen_stub_memory_device_init(void); +void xen_stub_memory_device_exit(void); + +#define ACPI_PROCESSOR_CLASS            "processor" +#define ACPI_PROCESSOR_DEVICE_HID       "ACPI0007" +#define ACPI_PROCESSOR_DEVICE_NAME      "Processor" + +int xen_stub_processor_init(void); +void xen_stub_processor_exit(void); + +void xen_pcpu_hotplug_sync(void); +int xen_pcpu_id(uint32_t acpi_id); + +static inline int xen_acpi_get_pxm(acpi_handle h) +{ +	unsigned long long pxm; +	acpi_status status; +	acpi_handle handle; +	acpi_handle phandle = h; + +	do { +		handle = phandle; +		status = acpi_evaluate_integer(handle, "_PXM", NULL, &pxm); +		if (ACPI_SUCCESS(status)) +			return pxm; +		status = acpi_get_parent(handle, &phandle); +	} while (ACPI_SUCCESS(status)); + +	return -ENXIO; +} +  int xen_acpi_notify_hypervisor_state(u8 sleep_state,  				     u32 pm1a_cnt, u32 pm1b_cnd); diff --git a/include/xen/events.h b/include/xen/events.h index c6bfe01acf6..b2b27c6a0f7 100644 --- a/include/xen/events.h +++ b/include/xen/events.h @@ -90,8 +90,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,  int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc);  /* Bind an PSI pirq to an irq. */  int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, -			     int pirq, int vector, const char *name, -			     domid_t domid); +			     int pirq, const char *name, domid_t domid);  #endif  /* De-allocates the above mentioned physical interrupt. */ diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h index 01c3d62436e..ffd4652de91 100644 --- a/include/xen/interface/io/blkif.h +++ b/include/xen/interface/io/blkif.h @@ -138,11 +138,21 @@ struct blkif_request_discard {  	uint8_t        _pad3;  } __attribute__((__packed__)); +struct blkif_request_other { +	uint8_t      _pad1; +	blkif_vdev_t _pad2;        /* only for read/write requests         */ +#ifdef CONFIG_X86_64 +	uint32_t     _pad3;        /* offsetof(blkif_req..,u.other.id)==8*/ +#endif +	uint64_t     id;           /* private guest value, echoed in resp  */ +} __attribute__((__packed__)); +  struct blkif_request {  	uint8_t        operation;    /* BLKIF_OP_???                         */  	union {  		struct blkif_request_rw rw;  		struct blkif_request_discard discard; +		struct blkif_request_other other;  	} u;  } __attribute__((__packed__)); diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index b40a4315cb8..2ecfe4f700d 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -190,6 +190,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap);  #define XENMEM_add_to_physmap_range 23  struct xen_add_to_physmap_range { +    /* IN */      /* Which domain to change the mapping for. */      domid_t domid;      uint16_t space; /* => enum phys_map_space */ @@ -203,6 +204,11 @@ struct xen_add_to_physmap_range {      /* GPFN in domid where the source mapping page should appear. */      GUEST_HANDLE(xen_pfn_t) gpfns; + +    /* OUT */ + +    /* Per index error code. */ +    GUEST_HANDLE(int) errs;  };  DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap_range); diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index 1844d31f455..7000bb1f6e9 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h @@ -251,6 +251,12 @@ struct physdev_pci_device_add {  #define PHYSDEVOP_pci_device_remove     26  #define PHYSDEVOP_restore_msi_ext       27 +/* + * Dom0 should use these two to announce MMIO resources assigned to + * MSI-X capable devices won't (prepare) or may (release) change. + */ +#define PHYSDEVOP_prepare_msix          30 +#define PHYSDEVOP_release_msix          31  struct physdev_pci_device {      /* IN */      uint16_t seg; diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index 5e36932ab40..c57d5f67f70 100644 --- a/include/xen/interface/platform.h +++ b/include/xen/interface/platform.h @@ -324,10 +324,21 @@ struct xenpf_cpu_ol {  };  DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); -/* - * CMD 58 and 59 are reserved for cpu hotadd and memory hotadd, - * which are already occupied at Xen hypervisor side. - */ +#define XENPF_cpu_hotadd	58 +struct xenpf_cpu_hotadd { +	uint32_t apic_id; +	uint32_t acpi_id; +	uint32_t pxm; +}; + +#define XENPF_mem_hotadd	59 +struct xenpf_mem_hotadd { +	uint64_t spfn; +	uint64_t epfn; +	uint32_t pxm; +	uint32_t flags; +}; +  #define XENPF_core_parking     60  struct xenpf_core_parking {  	/* IN variables */ @@ -357,6 +368,8 @@ struct xen_platform_op {  		struct xenpf_set_processor_pminfo set_pminfo;  		struct xenpf_pcpuinfo          pcpu_info;  		struct xenpf_cpu_ol            cpu_ol; +		struct xenpf_cpu_hotadd        cpu_add; +		struct xenpf_mem_hotadd        mem_add;  		struct xenpf_core_parking      core_parking;  		uint8_t                        pad[128];  	} u; diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h index 886a5d80a18..53ec4167bd0 100644 --- a/include/xen/interface/xen.h +++ b/include/xen/interface/xen.h @@ -285,7 +285,7 @@ DEFINE_GUEST_HANDLE_STRUCT(multicall_entry);   * Event channel endpoints per domain:   *  1024 if a long is 32 bits; 4096 if a long is 64 bits.   */ -#define NR_EVENT_CHANNELS (sizeof(unsigned long) * sizeof(unsigned long) * 64) +#define NR_EVENT_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64)  struct vcpu_time_info {  	/* @@ -341,7 +341,7 @@ struct vcpu_info {  	 */  	uint8_t evtchn_upcall_pending;  	uint8_t evtchn_upcall_mask; -	unsigned long evtchn_pending_sel; +	xen_ulong_t evtchn_pending_sel;  	struct arch_vcpu_info arch;  	struct pvclock_vcpu_time_info time;  }; /* 64 bytes (x86) */ @@ -384,8 +384,8 @@ struct shared_info {  	 * per-vcpu selector word to be set. Each bit in the selector covers a  	 * 'C long' in the PENDING bitfield array.  	 */ -	unsigned long evtchn_pending[sizeof(unsigned long) * 8]; -	unsigned long evtchn_mask[sizeof(unsigned long) * 8]; +	xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; +	xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8];  	/*  	 * Wallclock time: updated only by control software. Guests should base  |