diff options
Diffstat (limited to 'drivers')
138 files changed, 893 insertions, 609 deletions
| diff --git a/drivers/acpi/acpica/acresrc.h b/drivers/acpi/acpica/acresrc.h index f691d0e4d9fa..ff97430455cb 100644 --- a/drivers/acpi/acpica/acresrc.h +++ b/drivers/acpi/acpica/acresrc.h @@ -184,7 +184,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,  			     struct acpi_buffer *output_buffer);  acpi_status -acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, +acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,  			     struct acpi_buffer *output_buffer);  acpi_status @@ -227,8 +227,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,  			u32 aml_buffer_length, acpi_size * size_needed);  acpi_status -acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer, -		       acpi_size * size_needed); +acpi_rs_get_aml_length(struct acpi_resource *resource_list, +		       acpi_size resource_list_size, acpi_size * size_needed);  acpi_status  acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c index 243737363fb8..fd1ff54cda19 100644 --- a/drivers/acpi/acpica/nsalloc.c +++ b/drivers/acpi/acpica/nsalloc.c @@ -106,6 +106,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name)  void acpi_ns_delete_node(struct acpi_namespace_node *node)  {  	union acpi_operand_object *obj_desc; +	union acpi_operand_object *next_desc;  	ACPI_FUNCTION_NAME(ns_delete_node); @@ -114,12 +115,13 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)  	acpi_ns_detach_object(node);  	/* -	 * Delete an attached data object if present (an object that was created -	 * and attached via acpi_attach_data). Note: After any normal object is -	 * detached above, the only possible remaining object is a data object. +	 * Delete an attached data object list if present (objects that were +	 * attached via acpi_attach_data). Note: After any normal object is +	 * detached above, the only possible remaining object(s) are data +	 * objects, in a linked list.  	 */  	obj_desc = node->object; -	if (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { +	while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {  		/* Invoke the attached data deletion handler if present */ @@ -127,7 +129,15 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)  			obj_desc->data.handler(node, obj_desc->data.pointer);  		} +		next_desc = obj_desc->common.next_object;  		acpi_ut_remove_reference(obj_desc); +		obj_desc = next_desc; +	} + +	/* Special case for the statically allocated root node */ + +	if (node == acpi_gbl_root_node) { +		return;  	}  	/* Now we can delete the node */ diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index cc2fea94c5f0..4a0665b6bcc1 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c @@ -593,24 +593,26 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle)  void acpi_ns_terminate(void)  { -	union acpi_operand_object *obj_desc; +	acpi_status status;  	ACPI_FUNCTION_TRACE(ns_terminate);  	/* -	 * 1) Free the entire namespace -- all nodes and objects -	 * -	 * Delete all object descriptors attached to namepsace nodes +	 * Free the entire namespace -- all nodes and all objects +	 * attached to the nodes  	 */  	acpi_ns_delete_namespace_subtree(acpi_gbl_root_node); -	/* Detach any objects attached to the root */ +	/* Delete any objects attached to the root node */ -	obj_desc = acpi_ns_get_attached_object(acpi_gbl_root_node); -	if (obj_desc) { -		acpi_ns_detach_object(acpi_gbl_root_node); +	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); +	if (ACPI_FAILURE(status)) { +		return_VOID;  	} +	acpi_ns_delete_node(acpi_gbl_root_node); +	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); +  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n"));  	return_VOID;  } diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index b62a0f4f4f9b..b60c9cf82862 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c @@ -174,6 +174,7 @@ acpi_rs_stream_option_length(u32 resource_length,   * FUNCTION:    acpi_rs_get_aml_length   *   * PARAMETERS:  resource            - Pointer to the resource linked list + *              resource_list_size  - Size of the resource linked list   *              size_needed         - Where the required size is returned   *   * RETURN:      Status @@ -185,16 +186,20 @@ acpi_rs_stream_option_length(u32 resource_length,   ******************************************************************************/  acpi_status -acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) +acpi_rs_get_aml_length(struct acpi_resource *resource, +		       acpi_size resource_list_size, acpi_size * size_needed)  {  	acpi_size aml_size_needed = 0; +	struct acpi_resource *resource_end;  	acpi_rs_length total_size;  	ACPI_FUNCTION_TRACE(rs_get_aml_length);  	/* Traverse entire list of internal resource descriptors */ -	while (resource) { +	resource_end = +	    ACPI_ADD_PTR(struct acpi_resource, resource, resource_list_size); +	while (resource < resource_end) {  		/* Validate the descriptor type */ diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index 65f3e1c5b598..3a2ace93e62c 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c @@ -418,22 +418,21 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,   *   * FUNCTION:    acpi_rs_create_aml_resources   * - * PARAMETERS:  linked_list_buffer      - Pointer to the resource linked list - *              output_buffer           - Pointer to the user's buffer + * PARAMETERS:  resource_list           - Pointer to the resource list buffer + *              output_buffer           - Where the AML buffer is returned   *   * RETURN:      Status  AE_OK if okay, else a valid acpi_status code.   *              If the output_buffer is too small, the error will be   *              AE_BUFFER_OVERFLOW and output_buffer->Length will point   *              to the size buffer needed.   * - * DESCRIPTION: Takes the linked list of device resources and - *              creates a bytestream to be used as input for the - *              _SRS control method. + * DESCRIPTION: Converts a list of device resources to an AML bytestream + *              to be used as input for the _SRS control method.   *   ******************************************************************************/  acpi_status -acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, +acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,  			     struct acpi_buffer *output_buffer)  {  	acpi_status status; @@ -441,16 +440,16 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,  	ACPI_FUNCTION_TRACE(rs_create_aml_resources); -	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "LinkedListBuffer = %p\n", -			  linked_list_buffer)); +	/* Params already validated, no need to re-validate here */ -	/* -	 * Params already validated, so we don't re-validate here -	 * -	 * Pass the linked_list_buffer into a module that calculates -	 * the buffer size needed for the byte stream. -	 */ -	status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed); +	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ResourceList Buffer = %p\n", +			  resource_list->pointer)); + +	/* Get the buffer size needed for the AML byte stream */ + +	status = acpi_rs_get_aml_length(resource_list->pointer, +					resource_list->length, +					&aml_size_needed);  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",  			  (u32)aml_size_needed, acpi_format_exception(status))); @@ -467,10 +466,9 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,  	/* Do the conversion */ -	status = -	    acpi_rs_convert_resources_to_aml(linked_list_buffer, -					     aml_size_needed, -					     output_buffer->pointer); +	status = acpi_rs_convert_resources_to_aml(resource_list->pointer, +						  aml_size_needed, +						  output_buffer->pointer);  	if (ACPI_FAILURE(status)) {  		return_ACPI_STATUS(status);  	} diff --git a/drivers/acpi/acpica/rsutils.c b/drivers/acpi/acpica/rsutils.c index aef303d56d86..14a7982c9961 100644 --- a/drivers/acpi/acpica/rsutils.c +++ b/drivers/acpi/acpica/rsutils.c @@ -753,7 +753,7 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,  	 * Convert the linked list into a byte stream  	 */  	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; -	status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer); +	status = acpi_rs_create_aml_resources(in_buffer, &buffer);  	if (ACPI_FAILURE(status)) {  		goto cleanup;  	} diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c index 1a67b3944b3b..03ae8affe48f 100644 --- a/drivers/acpi/acpica/utdebug.c +++ b/drivers/acpi/acpica/utdebug.c @@ -185,6 +185,7 @@ acpi_debug_print(u32 requested_debug_level,  		}  		acpi_gbl_prev_thread_id = thread_id; +		acpi_gbl_nesting_level = 0;  	}  	/* @@ -193,13 +194,21 @@ acpi_debug_print(u32 requested_debug_level,  	 */  	acpi_os_printf("%9s-%04ld ", module_name, line_number); +#ifdef ACPI_EXEC_APP +	/* +	 * For acpi_exec only, emit the thread ID and nesting level. +	 * Note: nesting level is really only useful during a single-thread +	 * execution. Otherwise, multiple threads will keep resetting the +	 * level. +	 */  	if (ACPI_LV_THREADS & acpi_dbg_level) {  		acpi_os_printf("[%u] ", (u32)thread_id);  	} -	acpi_os_printf("[%02ld] %-22.22s: ", -		       acpi_gbl_nesting_level, -		       acpi_ut_trim_function_name(function_name)); +	acpi_os_printf("[%02ld] ", acpi_gbl_nesting_level); +#endif + +	acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name));  	va_start(args, format);  	acpi_os_vprintf(format, args); @@ -420,7 +429,9 @@ acpi_ut_exit(u32 line_number,  				 component_id, "%s\n", acpi_gbl_fn_exit_str);  	} -	acpi_gbl_nesting_level--; +	if (acpi_gbl_nesting_level) { +		acpi_gbl_nesting_level--; +	}  }  ACPI_EXPORT_SYMBOL(acpi_ut_exit) @@ -467,7 +478,9 @@ acpi_ut_status_exit(u32 line_number,  		}  	} -	acpi_gbl_nesting_level--; +	if (acpi_gbl_nesting_level) { +		acpi_gbl_nesting_level--; +	}  }  ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) @@ -504,7 +517,9 @@ acpi_ut_value_exit(u32 line_number,  				 ACPI_FORMAT_UINT64(value));  	} -	acpi_gbl_nesting_level--; +	if (acpi_gbl_nesting_level) { +		acpi_gbl_nesting_level--; +	}  }  ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) @@ -540,7 +555,9 @@ acpi_ut_ptr_exit(u32 line_number,  				 ptr);  	} -	acpi_gbl_nesting_level--; +	if (acpi_gbl_nesting_level) { +		acpi_gbl_nesting_level--; +	}  }  #endif diff --git a/drivers/acpi/nvs.c b/drivers/acpi/nvs.c index 266bc58ce0ce..386a9fe497b4 100644 --- a/drivers/acpi/nvs.c +++ b/drivers/acpi/nvs.c @@ -13,7 +13,6 @@  #include <linux/slab.h>  #include <linux/acpi.h>  #include <linux/acpi_io.h> -#include <acpi/acpiosxf.h>  /* ACPI NVS regions, APEI may use it */ diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 0703bff5e60e..20360e480bd8 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -65,6 +65,9 @@ static struct acpi_scan_handler pci_root_handler = {  	.ids = root_device_ids,  	.attach = acpi_pci_root_add,  	.detach = acpi_pci_root_remove, +	.hotplug = { +		.ignore = true, +	},  };  static DEFINE_MUTEX(osc_lock); diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 15daa21fcd05..fd39459926b1 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -1772,7 +1772,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type)  	 */  	list_for_each_entry(hwid, &pnp.ids, list) {  		handler = acpi_scan_match_handler(hwid->id, NULL); -		if (handler) { +		if (handler && !handler->hotplug.ignore) {  			acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,  					acpi_hotplug_notify_cb, handler);  			break; diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 14df30580e15..721e949e606e 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c @@ -525,7 +525,7 @@ static int acpi_suspend_enter(suspend_state_t pm_state)  	 * generate wakeup events.  	 */  	if (ACPI_SUCCESS(status) && (acpi_state == ACPI_STATE_S3)) { -		acpi_event_status pwr_btn_status; +		acpi_event_status pwr_btn_status = ACPI_EVENT_FLAG_DISABLED;  		acpi_get_event_status(ACPI_EVENT_POWER_BUTTON, &pwr_btn_status); diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index db5293650f62..6dbc3ca45223 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c @@ -309,7 +309,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,  		sprintf(table_attr->name + ACPI_NAME_SIZE, "%d",  			table_attr->instance); -	table_attr->attr.size = 0; +	table_attr->attr.size = table_header->length;  	table_attr->attr.read = acpi_table_show;  	table_attr->attr.attr.name = table_attr->name;  	table_attr->attr.attr.mode = 0400; @@ -354,8 +354,9 @@ static int acpi_tables_sysfs_init(void)  {  	struct acpi_table_attr *table_attr;  	struct acpi_table_header *table_header = NULL; -	int table_index = 0; -	int result; +	int table_index; +	acpi_status status; +	int ret;  	tables_kobj = kobject_create_and_add("tables", acpi_kobj);  	if (!tables_kobj) @@ -365,33 +366,34 @@ static int acpi_tables_sysfs_init(void)  	if (!dynamic_tables_kobj)  		goto err_dynamic_tables; -	do { -		result = acpi_get_table_by_index(table_index, &table_header); -		if (!result) { -			table_index++; -			table_attr = NULL; -			table_attr = -			    kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL); -			if (!table_attr) -				return -ENOMEM; - -			acpi_table_attr_init(table_attr, table_header); -			result = -			    sysfs_create_bin_file(tables_kobj, -						  &table_attr->attr); -			if (result) { -				kfree(table_attr); -				return result; -			} else -				list_add_tail(&table_attr->node, -					      &acpi_table_attr_list); +	for (table_index = 0;; table_index++) { +		status = acpi_get_table_by_index(table_index, &table_header); + +		if (status == AE_BAD_PARAMETER) +			break; + +		if (ACPI_FAILURE(status)) +			continue; + +		table_attr = NULL; +		table_attr = kzalloc(sizeof(*table_attr), GFP_KERNEL); +		if (!table_attr) +			return -ENOMEM; + +		acpi_table_attr_init(table_attr, table_header); +		ret = sysfs_create_bin_file(tables_kobj, &table_attr->attr); +		if (ret) { +			kfree(table_attr); +			return ret;  		} -	} while (!result); +		list_add_tail(&table_attr->node, &acpi_table_attr_list); +	} +  	kobject_uevent(tables_kobj, KOBJ_ADD);  	kobject_uevent(dynamic_tables_kobj, KOBJ_ADD); -	result = acpi_install_table_handler(acpi_sysfs_table_handler, NULL); +	status = acpi_install_table_handler(acpi_sysfs_table_handler, NULL); -	return result == AE_OK ? 0 : -EINVAL; +	return ACPI_FAILURE(status) ? -EINVAL : 0;  err_dynamic_tables:  	kobject_put(tables_kobj);  err: diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index e2903d03180e..14f1e9506338 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -435,6 +435,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {  	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 on some Gigabyte */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),  	  .driver_data = board_ahci_yes_fbs }, +	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230), +	  .driver_data = board_ahci_yes_fbs },  	/* Promise */  	{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },	/* PDC42819 */ diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index f9554318504f..4b231baceb09 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c @@ -329,6 +329,7 @@ static SIMPLE_DEV_PM_OPS(ahci_pm_ops, ahci_suspend, ahci_resume);  static const struct of_device_id ahci_of_match[] = {  	{ .compatible = "snps,spear-ahci", },  	{ .compatible = "snps,exynos5440-ahci", }, +	{ .compatible = "ibm,476gtr-ahci", },  	{},  };  MODULE_DEVICE_TABLE(of, ahci_of_match); diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 81a94a3919db..75b93678bbcd 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -6304,10 +6304,9 @@ static void ata_port_detach(struct ata_port *ap)  		for (i = 0; i < SATA_PMP_MAX_PORTS; i++)  			ata_tlink_delete(&ap->pmp_link[i]);  	} -	ata_tport_delete(ap); -  	/* remove the associated SCSI host */  	scsi_remove_host(ap->scsi_host); +	ata_tport_delete(ap);  }  /** diff --git a/drivers/ata/libata-zpodd.c b/drivers/ata/libata-zpodd.c index 68f9e3293e9c..88949c6d55dd 100644 --- a/drivers/ata/libata-zpodd.c +++ b/drivers/ata/libata-zpodd.c @@ -88,15 +88,13 @@ static enum odd_mech_type zpodd_get_mech_type(struct ata_device *dev)  static bool odd_can_poweroff(struct ata_device *ata_dev)  {  	acpi_handle handle; -	acpi_status status;  	struct acpi_device *acpi_dev;  	handle = ata_dev_acpi_handle(ata_dev);  	if (!handle)  		return false; -	status = acpi_bus_get_device(handle, &acpi_dev); -	if (ACPI_FAILURE(status)) +	if (acpi_bus_get_device(handle, &acpi_dev))  		return false;  	return acpi_device_can_poweroff(acpi_dev); diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index e88690ebfd82..73492dd4a4bc 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c @@ -319,6 +319,7 @@ static int cf_init(struct arasan_cf_dev *acdev)  	ret = clk_set_rate(acdev->clk, 166000000);  	if (ret) {  		dev_warn(acdev->host->dev, "clock set rate failed"); +		clk_disable_unprepare(acdev->clk);  		return ret;  	} diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index bdb953e15d2a..5c07a56962db 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -87,6 +87,7 @@ config ARM_ARCH_TIMER  config ARM_ARCH_TIMER_EVTSTREAM  	bool "Support for ARM architected timer event stream generation"  	default y if ARM_ARCH_TIMER +	depends on ARM_ARCH_TIMER  	help  	  This option enables support for event stream generation based on  	  the ARM architected timer. It is used for waking up CPUs executing diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c index 4aac9ee0d0c0..3cf12834681e 100644 --- a/drivers/clocksource/sh_mtu2.c +++ b/drivers/clocksource/sh_mtu2.c @@ -313,8 +313,20 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev)  		goto err1;  	} -	return sh_mtu2_register(p, (char *)dev_name(&p->pdev->dev), -				cfg->clockevent_rating); +	ret = clk_prepare(p->clk); +	if (ret < 0) +		goto err2; + +	ret = sh_mtu2_register(p, (char *)dev_name(&p->pdev->dev), +			       cfg->clockevent_rating); +	if (ret < 0) +		goto err3; + +	return 0; + err3: +	clk_unprepare(p->clk); + err2: +	clk_put(p->clk);   err1:  	iounmap(p->mapbase);   err0: diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index 78b8dae49628..63557cda0a7d 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c @@ -472,12 +472,26 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev)  		ret = PTR_ERR(p->clk);  		goto err1;  	} + +	ret = clk_prepare(p->clk); +	if (ret < 0) +		goto err2; +  	p->cs_enabled = false;  	p->enable_count = 0; -	return sh_tmu_register(p, (char *)dev_name(&p->pdev->dev), -			       cfg->clockevent_rating, -			       cfg->clocksource_rating); +	ret = sh_tmu_register(p, (char *)dev_name(&p->pdev->dev), +			      cfg->clockevent_rating, +			      cfg->clocksource_rating); +	if (ret < 0) +		goto err3; + +	return 0; + + err3: +	clk_unprepare(p->clk); + err2: +	clk_put(p->clk);   err1:  	iounmap(p->mapbase);   err0: diff --git a/drivers/cpufreq/exynos4210-cpufreq.c b/drivers/cpufreq/exynos4210-cpufreq.c index f2c75065ce19..dfd1643b0b2f 100644 --- a/drivers/cpufreq/exynos4210-cpufreq.c +++ b/drivers/cpufreq/exynos4210-cpufreq.c @@ -157,4 +157,3 @@ err_moutcore:  	pr_debug("%s: failed initialization\n", __func__);  	return -EINVAL;  } -EXPORT_SYMBOL(exynos4210_cpufreq_init); diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c index 8683304ce62c..efad5e657f6f 100644 --- a/drivers/cpufreq/exynos4x12-cpufreq.c +++ b/drivers/cpufreq/exynos4x12-cpufreq.c @@ -211,4 +211,3 @@ err_moutcore:  	pr_debug("%s: failed initialization\n", __func__);  	return -EINVAL;  } -EXPORT_SYMBOL(exynos4x12_cpufreq_init); diff --git a/drivers/cpufreq/exynos5250-cpufreq.c b/drivers/cpufreq/exynos5250-cpufreq.c index 9fae466d7746..8feda86fe42c 100644 --- a/drivers/cpufreq/exynos5250-cpufreq.c +++ b/drivers/cpufreq/exynos5250-cpufreq.c @@ -236,4 +236,3 @@ err_moutcore:  	pr_err("%s: failed initialization\n", __func__);  	return -EINVAL;  } -EXPORT_SYMBOL(exynos5250_cpufreq_init); diff --git a/drivers/cpufreq/tegra-cpufreq.c b/drivers/cpufreq/tegra-cpufreq.c index f42df7ec03c5..b7309c37033d 100644 --- a/drivers/cpufreq/tegra-cpufreq.c +++ b/drivers/cpufreq/tegra-cpufreq.c @@ -142,10 +142,8 @@ static int tegra_target(struct cpufreq_policy *policy, unsigned int index)  	mutex_lock(&tegra_cpu_lock); -	if (is_suspended) { -		ret = -EBUSY; +	if (is_suspended)  		goto out; -	}  	freq = freq_table[index].frequency; diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index 4f44b71b9e24..4cf5dec826e1 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c @@ -818,7 +818,7 @@ static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err,  		       ivsize, 1);  	print_hex_dump(KERN_ERR, "dst    @"__stringify(__LINE__)": ",  		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->dst), -		       req->cryptlen, 1); +		       req->cryptlen - ctx->authsize, 1);  #endif  	if (err) { @@ -972,12 +972,9 @@ static void init_aead_job(u32 *sh_desc, dma_addr_t ptr,  				 (edesc->src_nents ? : 1);  		in_options = LDST_SGF;  	} -	if (encrypt) -		append_seq_in_ptr(desc, src_dma, req->assoclen + ivsize + -				  req->cryptlen - authsize, in_options); -	else -		append_seq_in_ptr(desc, src_dma, req->assoclen + ivsize + -				  req->cryptlen, in_options); + +	append_seq_in_ptr(desc, src_dma, req->assoclen + ivsize + req->cryptlen, +			  in_options);  	if (likely(req->src == req->dst)) {  		if (all_contig) { @@ -998,7 +995,8 @@ static void init_aead_job(u32 *sh_desc, dma_addr_t ptr,  		}  	}  	if (encrypt) -		append_seq_out_ptr(desc, dst_dma, req->cryptlen, out_options); +		append_seq_out_ptr(desc, dst_dma, req->cryptlen + authsize, +				   out_options);  	else  		append_seq_out_ptr(desc, dst_dma, req->cryptlen - authsize,  				   out_options); @@ -1048,8 +1046,8 @@ static void init_aead_giv_job(u32 *sh_desc, dma_addr_t ptr,  		sec4_sg_index += edesc->assoc_nents + 1 + edesc->src_nents;  		in_options = LDST_SGF;  	} -	append_seq_in_ptr(desc, src_dma, req->assoclen + ivsize + -			  req->cryptlen - authsize, in_options); +	append_seq_in_ptr(desc, src_dma, req->assoclen + ivsize + req->cryptlen, +			  in_options);  	if (contig & GIV_DST_CONTIG) {  		dst_dma = edesc->iv_dma; @@ -1066,7 +1064,8 @@ static void init_aead_giv_job(u32 *sh_desc, dma_addr_t ptr,  		}  	} -	append_seq_out_ptr(desc, dst_dma, ivsize + req->cryptlen, out_options); +	append_seq_out_ptr(desc, dst_dma, ivsize + req->cryptlen + authsize, +			   out_options);  }  /* @@ -1130,7 +1129,8 @@ static void init_ablkcipher_job(u32 *sh_desc, dma_addr_t ptr,   * allocate and map the aead extended descriptor   */  static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, -					   int desc_bytes, bool *all_contig_ptr) +					   int desc_bytes, bool *all_contig_ptr, +					   bool encrypt)  {  	struct crypto_aead *aead = crypto_aead_reqtfm(req);  	struct caam_ctx *ctx = crypto_aead_ctx(aead); @@ -1145,12 +1145,22 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,  	bool assoc_chained = false, src_chained = false, dst_chained = false;  	int ivsize = crypto_aead_ivsize(aead);  	int sec4_sg_index, sec4_sg_len = 0, sec4_sg_bytes; +	unsigned int authsize = ctx->authsize;  	assoc_nents = sg_count(req->assoc, req->assoclen, &assoc_chained); -	src_nents = sg_count(req->src, req->cryptlen, &src_chained); -	if (unlikely(req->dst != req->src)) -		dst_nents = sg_count(req->dst, req->cryptlen, &dst_chained); +	if (unlikely(req->dst != req->src)) { +		src_nents = sg_count(req->src, req->cryptlen, &src_chained); +		dst_nents = sg_count(req->dst, +				     req->cryptlen + +					(encrypt ? authsize : (-authsize)), +				     &dst_chained); +	} else { +		src_nents = sg_count(req->src, +				     req->cryptlen + +					(encrypt ? authsize : 0), +				     &src_chained); +	}  	sgc = dma_map_sg_chained(jrdev, req->assoc, assoc_nents ? : 1,  				 DMA_TO_DEVICE, assoc_chained); @@ -1234,11 +1244,9 @@ static int aead_encrypt(struct aead_request *req)  	u32 *desc;  	int ret = 0; -	req->cryptlen += ctx->authsize; -  	/* allocate extended descriptor */  	edesc = aead_edesc_alloc(req, DESC_JOB_IO_LEN * -				 CAAM_CMD_SZ, &all_contig); +				 CAAM_CMD_SZ, &all_contig, true);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1275,7 +1283,7 @@ static int aead_decrypt(struct aead_request *req)  	/* allocate extended descriptor */  	edesc = aead_edesc_alloc(req, DESC_JOB_IO_LEN * -				 CAAM_CMD_SZ, &all_contig); +				 CAAM_CMD_SZ, &all_contig, false);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1332,7 +1340,8 @@ static struct aead_edesc *aead_giv_edesc_alloc(struct aead_givcrypt_request  	src_nents = sg_count(req->src, req->cryptlen, &src_chained);  	if (unlikely(req->dst != req->src)) -		dst_nents = sg_count(req->dst, req->cryptlen, &dst_chained); +		dst_nents = sg_count(req->dst, req->cryptlen + ctx->authsize, +				     &dst_chained);  	sgc = dma_map_sg_chained(jrdev, req->assoc, assoc_nents ? : 1,  				 DMA_TO_DEVICE, assoc_chained); @@ -1426,8 +1435,6 @@ static int aead_givencrypt(struct aead_givcrypt_request *areq)  	u32 *desc;  	int ret = 0; -	req->cryptlen += ctx->authsize; -  	/* allocate extended descriptor */  	edesc = aead_giv_edesc_alloc(areq, DESC_JOB_IO_LEN *  				     CAAM_CMD_SZ, &contig); diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c index d23356d20e1c..1d80bd3636c5 100644 --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c @@ -6,6 +6,7 @@   */  #include <linux/of_irq.h> +#include <linux/of_address.h>  #include "compat.h"  #include "regs.h" diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index 905de4427e7c..b44f4ddc565c 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c @@ -790,7 +790,7 @@ static void ipsec_esp_unmap(struct device *dev,  	if (edesc->assoc_chained)  		talitos_unmap_sg_chain(dev, areq->assoc, DMA_TO_DEVICE); -	else +	else if (areq->assoclen)  		/* assoc_nents counts also for IV in non-contiguous cases */  		dma_unmap_sg(dev, areq->assoc,  			     edesc->assoc_nents ? edesc->assoc_nents - 1 : 1, @@ -973,7 +973,11 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,  		dma_sync_single_for_device(dev, edesc->dma_link_tbl,  					   edesc->dma_len, DMA_BIDIRECTIONAL);  	} else { -		to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->assoc)); +		if (areq->assoclen) +			to_talitos_ptr(&desc->ptr[1], +				       sg_dma_address(areq->assoc)); +		else +			to_talitos_ptr(&desc->ptr[1], edesc->iv_dma);  		desc->ptr[1].j_extent = 0;  	} @@ -1108,7 +1112,8 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,  						 unsigned int authsize,  						 unsigned int ivsize,  						 int icv_stashing, -						 u32 cryptoflags) +						 u32 cryptoflags, +						 bool encrypt)  {  	struct talitos_edesc *edesc;  	int assoc_nents = 0, src_nents, dst_nents, alloc_len, dma_len; @@ -1122,10 +1127,10 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,  		return ERR_PTR(-EINVAL);  	} -	if (iv) +	if (ivsize)  		iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE); -	if (assoc) { +	if (assoclen) {  		/*  		 * Currently it is assumed that iv is provided whenever assoc  		 * is. @@ -1141,19 +1146,17 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,  			assoc_nents = assoc_nents ? assoc_nents + 1 : 2;  	} -	src_nents = sg_count(src, cryptlen + authsize, &src_chained); -	src_nents = (src_nents == 1) ? 0 : src_nents; - -	if (!dst) { -		dst_nents = 0; -	} else { -		if (dst == src) { -			dst_nents = src_nents; -		} else { -			dst_nents = sg_count(dst, cryptlen + authsize, -					     &dst_chained); -			dst_nents = (dst_nents == 1) ? 0 : dst_nents; -		} +	if (!dst || dst == src) { +		src_nents = sg_count(src, cryptlen + authsize, &src_chained); +		src_nents = (src_nents == 1) ? 0 : src_nents; +		dst_nents = dst ? src_nents : 0; +	} else { /* dst && dst != src*/ +		src_nents = sg_count(src, cryptlen + (encrypt ? 0 : authsize), +				     &src_chained); +		src_nents = (src_nents == 1) ? 0 : src_nents; +		dst_nents = sg_count(dst, cryptlen + (encrypt ? authsize : 0), +				     &dst_chained); +		dst_nents = (dst_nents == 1) ? 0 : dst_nents;  	}  	/* @@ -1173,9 +1176,16 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,  	edesc = kmalloc(alloc_len, GFP_DMA | flags);  	if (!edesc) { -		talitos_unmap_sg_chain(dev, assoc, DMA_TO_DEVICE); +		if (assoc_chained) +			talitos_unmap_sg_chain(dev, assoc, DMA_TO_DEVICE); +		else if (assoclen) +			dma_unmap_sg(dev, assoc, +				     assoc_nents ? assoc_nents - 1 : 1, +				     DMA_TO_DEVICE); +  		if (iv_dma)  			dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE); +  		dev_err(dev, "could not allocate edescriptor\n");  		return ERR_PTR(-ENOMEM);  	} @@ -1197,7 +1207,7 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,  }  static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv, -					      int icv_stashing) +					      int icv_stashing, bool encrypt)  {  	struct crypto_aead *authenc = crypto_aead_reqtfm(areq);  	struct talitos_ctx *ctx = crypto_aead_ctx(authenc); @@ -1206,7 +1216,7 @@ static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,  	return talitos_edesc_alloc(ctx->dev, areq->assoc, areq->src, areq->dst,  				   iv, areq->assoclen, areq->cryptlen,  				   ctx->authsize, ivsize, icv_stashing, -				   areq->base.flags); +				   areq->base.flags, encrypt);  }  static int aead_encrypt(struct aead_request *req) @@ -1216,7 +1226,7 @@ static int aead_encrypt(struct aead_request *req)  	struct talitos_edesc *edesc;  	/* allocate extended descriptor */ -	edesc = aead_edesc_alloc(req, req->iv, 0); +	edesc = aead_edesc_alloc(req, req->iv, 0, true);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1239,7 +1249,7 @@ static int aead_decrypt(struct aead_request *req)  	req->cryptlen -= authsize;  	/* allocate extended descriptor */ -	edesc = aead_edesc_alloc(req, req->iv, 1); +	edesc = aead_edesc_alloc(req, req->iv, 1, false);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1285,7 +1295,7 @@ static int aead_givencrypt(struct aead_givcrypt_request *req)  	struct talitos_edesc *edesc;  	/* allocate extended descriptor */ -	edesc = aead_edesc_alloc(areq, req->giv, 0); +	edesc = aead_edesc_alloc(areq, req->giv, 0, true);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1441,7 +1451,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc,  }  static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request * -						    areq) +						    areq, bool encrypt)  {  	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);  	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); @@ -1449,7 +1459,7 @@ static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *  	return talitos_edesc_alloc(ctx->dev, NULL, areq->src, areq->dst,  				   areq->info, 0, areq->nbytes, 0, ivsize, 0, -				   areq->base.flags); +				   areq->base.flags, encrypt);  }  static int ablkcipher_encrypt(struct ablkcipher_request *areq) @@ -1459,7 +1469,7 @@ static int ablkcipher_encrypt(struct ablkcipher_request *areq)  	struct talitos_edesc *edesc;  	/* allocate extended descriptor */ -	edesc = ablkcipher_edesc_alloc(areq); +	edesc = ablkcipher_edesc_alloc(areq, true);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1476,7 +1486,7 @@ static int ablkcipher_decrypt(struct ablkcipher_request *areq)  	struct talitos_edesc *edesc;  	/* allocate extended descriptor */ -	edesc = ablkcipher_edesc_alloc(areq); +	edesc = ablkcipher_edesc_alloc(areq, false);  	if (IS_ERR(edesc))  		return PTR_ERR(edesc); @@ -1628,7 +1638,7 @@ static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,  	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);  	return talitos_edesc_alloc(ctx->dev, NULL, req_ctx->psrc, NULL, NULL, 0, -				   nbytes, 0, 0, 0, areq->base.flags); +				   nbytes, 0, 0, 0, areq->base.flags, false);  }  static int ahash_init(struct ahash_request *areq) diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c index 72c927dc3be1..54c18c220a60 100644 --- a/drivers/gpio/gpio-bcm-kona.c +++ b/drivers/gpio/gpio-bcm-kona.c @@ -158,7 +158,7 @@ static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)  	spin_unlock_irqrestore(&kona_gpio->lock, flags);  	/* return the specified bit status */ -	return !!(val & bit); +	return !!(val & BIT(bit));  }  static int bcm_kona_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c index 914e859e3eda..d7d6d72eba33 100644 --- a/drivers/gpio/gpio-mpc8xxx.c +++ b/drivers/gpio/gpio-mpc8xxx.c @@ -70,10 +70,14 @@ static int mpc8572_gpio_get(struct gpio_chip *gc, unsigned int gpio)  	u32 val;  	struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);  	struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm); +	u32 out_mask, out_shadow; -	val = in_be32(mm->regs + GPIO_DAT) & ~in_be32(mm->regs + GPIO_DIR); +	out_mask = in_be32(mm->regs + GPIO_DIR); -	return (val | mpc8xxx_gc->data) & mpc8xxx_gpio2mask(gpio); +	val = in_be32(mm->regs + GPIO_DAT) & ~out_mask; +	out_shadow = mpc8xxx_gc->data & out_mask; + +	return (val | out_shadow) & mpc8xxx_gpio2mask(gpio);  }  static int mpc8xxx_gpio_get(struct gpio_chip *gc, unsigned int gpio) diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c index f7a0cc4da950..7b37300973db 100644 --- a/drivers/gpio/gpio-msm-v2.c +++ b/drivers/gpio/gpio-msm-v2.c @@ -102,7 +102,7 @@ struct msm_gpio_dev {  	DECLARE_BITMAP(wake_irqs, MAX_NR_GPIO);  	DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);  	struct irq_domain *domain; -	unsigned int summary_irq; +	int summary_irq;  	void __iomem *msm_tlmm_base;  }; diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c index 3c3321f94053..db3129043e63 100644 --- a/drivers/gpio/gpio-mvebu.c +++ b/drivers/gpio/gpio-mvebu.c @@ -79,7 +79,7 @@ struct mvebu_gpio_chip {  	spinlock_t	   lock;  	void __iomem	  *membase;  	void __iomem	  *percpu_membase; -	unsigned int       irqbase; +	int		   irqbase;  	struct irq_domain *domain;  	int                soc_variant;  }; diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c index f22f7f3e2e53..b4d42112d02d 100644 --- a/drivers/gpio/gpio-pl061.c +++ b/drivers/gpio/gpio-pl061.c @@ -286,11 +286,6 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)  	if (!chip->base)  		return -ENOMEM; -	chip->domain = irq_domain_add_simple(adev->dev.of_node, PL061_GPIO_NR, -					     irq_base, &pl061_domain_ops, chip); -	if (!chip->domain) -		return -ENODEV; -  	spin_lock_init(&chip->lock);  	chip->gc.request = pl061_gpio_request; @@ -320,6 +315,11 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)  	irq_set_chained_handler(irq, pl061_irq_handler);  	irq_set_handler_data(irq, chip); +	chip->domain = irq_domain_add_simple(adev->dev.of_node, PL061_GPIO_NR, +					     irq_base, &pl061_domain_ops, chip); +	if (!chip->domain) +		return -ENODEV; +  	for (i = 0; i < PL061_GPIO_NR; i++) {  		if (pdata) {  			if (pdata->directions & (1 << i)) diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index d3f15ae93bd3..fe088a30567a 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c @@ -381,7 +381,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)  	if (!p->irq_domain) {  		ret = -ENXIO;  		dev_err(&pdev->dev, "cannot initialize irq domain\n"); -		goto err1; +		goto err0;  	}  	if (devm_request_irq(&pdev->dev, irq->start, diff --git a/drivers/gpio/gpio-tb10x.c b/drivers/gpio/gpio-tb10x.c index 0502b9a041a5..da071ddbad99 100644 --- a/drivers/gpio/gpio-tb10x.c +++ b/drivers/gpio/gpio-tb10x.c @@ -132,6 +132,7 @@ static int tb10x_gpio_direction_out(struct gpio_chip *chip,  	int mask = BIT(offset);  	int val = TB10X_GPIO_DIR_OUT << offset; +	tb10x_gpio_set(chip, offset, value);  	tb10x_set_bits(tb10x_gpio, OFFSET_TO_REG_DDR, mask, val);  	return 0; diff --git a/drivers/gpio/gpio-ucb1400.c b/drivers/gpio/gpio-ucb1400.c index 1a605f2a0f55..06fb5cf99ded 100644 --- a/drivers/gpio/gpio-ucb1400.c +++ b/drivers/gpio/gpio-ucb1400.c @@ -105,3 +105,4 @@ module_platform_driver(ucb1400_gpio_driver);  MODULE_DESCRIPTION("Philips UCB1400 GPIO driver");  MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ucb1400_gpio"); diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 4e10b10d3ddd..85f772c0b26a 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -14,6 +14,7 @@  #include <linux/idr.h>  #include <linux/slab.h>  #include <linux/acpi.h> +#include <linux/gpio/driver.h>  #define CREATE_TRACE_POINTS  #include <trace/events/gpio.h> @@ -1308,6 +1309,18 @@ struct gpio_chip *gpiochip_find(void *data,  }  EXPORT_SYMBOL_GPL(gpiochip_find); +static int gpiochip_match_name(struct gpio_chip *chip, void *data) +{ +	const char *name = data; + +	return !strcmp(chip->label, name); +} + +static struct gpio_chip *find_chip_by_name(const char *name) +{ +	return gpiochip_find((void *)name, gpiochip_match_name); +} +  #ifdef CONFIG_PINCTRL  /** @@ -1341,8 +1354,10 @@ int gpiochip_add_pingroup_range(struct gpio_chip *chip,  	ret = pinctrl_get_group_pins(pctldev, pin_group,  					&pin_range->range.pins,  					&pin_range->range.npins); -	if (ret < 0) +	if (ret < 0) { +		kfree(pin_range);  		return ret; +	}  	pinctrl_add_gpio_range(pctldev, &pin_range->range); @@ -2260,26 +2275,10 @@ void gpiod_add_table(struct gpiod_lookup *table, size_t size)  	mutex_unlock(&gpio_lookup_lock);  } -/* - * Caller must have a acquired gpio_lookup_lock - */ -static struct gpio_chip *find_chip_by_name(const char *name) -{ -	struct gpio_chip *chip = NULL; - -	list_for_each_entry(chip, &gpio_lookup_list, list) { -		if (chip->label == NULL) -			continue; -		if (!strcmp(chip->label, name)) -			break; -	} - -	return chip; -} -  #ifdef CONFIG_OF  static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, -				      unsigned int idx, unsigned long *flags) +				      unsigned int idx, +				      enum gpio_lookup_flags *flags)  {  	char prop_name[32]; /* 32 is max size of property name */  	enum of_gpio_flags of_flags; @@ -2297,20 +2296,22 @@ static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,  		return desc;  	if (of_flags & OF_GPIO_ACTIVE_LOW) -		*flags |= GPIOF_ACTIVE_LOW; +		*flags |= GPIO_ACTIVE_LOW;  	return desc;  }  #else  static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, -				      unsigned int idx, unsigned long *flags) +				      unsigned int idx, +				      enum gpio_lookup_flags *flags)  {  	return ERR_PTR(-ENODEV);  }  #endif  static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id, -					unsigned int idx, unsigned long *flags) +					unsigned int idx, +					enum gpio_lookup_flags *flags)  {  	struct acpi_gpio_info info;  	struct gpio_desc *desc; @@ -2320,13 +2321,14 @@ static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id,  		return desc;  	if (info.gpioint && info.active_low) -		*flags |= GPIOF_ACTIVE_LOW; +		*flags |= GPIO_ACTIVE_LOW;  	return desc;  }  static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, -				    unsigned int idx, unsigned long *flags) +				    unsigned int idx, +				    enum gpio_lookup_flags *flags)  {  	const char *dev_id = dev ? dev_name(dev) : NULL;  	struct gpio_desc *desc = ERR_PTR(-ENODEV); @@ -2366,7 +2368,7 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,  				continue;  			} -			if (chip->ngpio >= p->chip_hwnum) { +			if (chip->ngpio <= p->chip_hwnum) {  				dev_warn(dev, "GPIO chip %s has %d GPIOs\n",  					 chip->label, chip->ngpio);  				continue; @@ -2416,9 +2418,9 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,  					       const char *con_id,  					       unsigned int idx)  { -	struct gpio_desc *desc; +	struct gpio_desc *desc = NULL;  	int status; -	unsigned long flags = 0; +	enum gpio_lookup_flags flags = 0;  	dev_dbg(dev, "GPIO lookup for consumer %s\n", con_id); @@ -2429,13 +2431,23 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,  	} else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) {  		dev_dbg(dev, "using ACPI for GPIO lookup\n");  		desc = acpi_find_gpio(dev, con_id, idx, &flags); -	} else { +	} + +	/* +	 * Either we are not using DT or ACPI, or their lookup did not return +	 * a result. In that case, use platform lookup as a fallback. +	 */ +	if (!desc || IS_ERR(desc)) { +		struct gpio_desc *pdesc;  		dev_dbg(dev, "using lookup tables for GPIO lookup"); -		desc = gpiod_find(dev, con_id, idx, &flags); +		pdesc = gpiod_find(dev, con_id, idx, &flags); +		/* If used as fallback, do not replace the previous error */ +		if (!IS_ERR(pdesc) || !desc) +			desc = pdesc;  	}  	if (IS_ERR(desc)) { -		dev_warn(dev, "lookup for GPIO %s failed\n", con_id); +		dev_dbg(dev, "lookup for GPIO %s failed\n", con_id);  		return desc;  	} @@ -2444,8 +2456,12 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,  	if (status < 0)  		return ERR_PTR(status); -	if (flags & GPIOF_ACTIVE_LOW) +	if (flags & GPIO_ACTIVE_LOW)  		set_bit(FLAG_ACTIVE_LOW, &desc->flags); +	if (flags & GPIO_OPEN_DRAIN) +		set_bit(FLAG_OPEN_DRAIN, &desc->flags); +	if (flags & GPIO_OPEN_SOURCE) +		set_bit(FLAG_OPEN_SOURCE, &desc->flags);  	return desc;  } diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 329fbb9b5976..34e2d39d4ce8 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -460,6 +460,7 @@ config HID_MULTITOUCH  	  - Stantum multitouch panels  	  - Touch International Panels  	  - Unitec Panels +	  - Wistron optical touch panels  	  - XAT optical touch panels  	  - Xiroku optical touch panels  	  - Zytronic touch panels diff --git a/drivers/hid/hid-appleir.c b/drivers/hid/hid-appleir.c index a42e6a394c5e..0e6a42d37eb6 100644 --- a/drivers/hid/hid-appleir.c +++ b/drivers/hid/hid-appleir.c @@ -297,6 +297,9 @@ static int appleir_probe(struct hid_device *hid, const struct hid_device_id *id)  	appleir->hid = hid; +	/* force input as some remotes bypass the input registration */ +	hid->quirks |= HID_QUIRK_HIDINPUT_FORCE; +  	spin_lock_init(&appleir->lock);  	setup_timer(&appleir->key_up_timer,  		    key_up_tick, (unsigned long) appleir); diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 8c10f2742233..253fe23ef7fe 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1723,6 +1723,7 @@ static const struct hid_device_id hid_have_special_driver[] = {  	{ HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, +	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, @@ -1879,7 +1880,6 @@ static const struct hid_device_id hid_have_special_driver[] = {  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, -	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, USB_DEVICE_ID_NINTENDO_WIIMOTE) },  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) },  	{ }  }; diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 76559629568c..f9304cb37154 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -489,6 +489,7 @@  #define USB_VENDOR_ID_KYE		0x0458  #define USB_DEVICE_ID_KYE_ERGO_525V	0x0087  #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE	0x0138 +#define USB_DEVICE_ID_GENIUS_MANTICORE	0x0153  #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR	0x4018  #define USB_DEVICE_ID_KYE_GPEN_560	0x5003  #define USB_DEVICE_ID_KYE_EASYPEN_I405X	0x5010 @@ -640,7 +641,6 @@  #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN	0x0003  #define USB_VENDOR_ID_NINTENDO		0x057e -#define USB_VENDOR_ID_NINTENDO2		0x054c  #define USB_DEVICE_ID_NINTENDO_WIIMOTE	0x0306  #define USB_DEVICE_ID_NINTENDO_WIIMOTE2	0x0330 @@ -902,6 +902,9 @@  #define USB_DEVICE_ID_SUPER_DUAL_BOX_PRO 0x8802  #define USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO 0x8804 +#define USB_VENDOR_ID_WISTRON		0x0fb8 +#define USB_DEVICE_ID_WISTRON_OPTICAL_TOUCH		0x1109 +  #define USB_VENDOR_ID_X_TENSIONS               0x1ae7  #define USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE    0x9001 diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index 73845120295e..ecb5ca669e97 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -341,6 +341,9 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,  	case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:  		rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,  					"Genius Gx Imperator Keyboard"); +	case USB_DEVICE_ID_GENIUS_MANTICORE: +		rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, +					"Genius Manticore Keyboard");  		break;  	}  	return rdesc; @@ -418,6 +421,14 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)  			goto enabling_err;  		}  		break; +	case USB_DEVICE_ID_GENIUS_MANTICORE: +		/* +		 * The manticore keyboard needs to have all the interfaces +		 * opened at least once to be fully functional. +		 */ +		if (hid_hw_open(hdev)) +			hid_hw_close(hdev); +		break;  	}  	return 0; @@ -439,6 +450,8 @@ static const struct hid_device_id kye_devices[] = {  				USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },  	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE,  				USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, +	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, +				USB_DEVICE_ID_GENIUS_MANTICORE) },  	{ }  };  MODULE_DEVICE_TABLE(hid, kye_devices); diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index a2cedb8ae1c0..d83b1e8b505b 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -1335,6 +1335,12 @@ static const struct hid_device_id mt_devices[] = {  	{ .driver_data = MT_CLS_NSMU,  		MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,  			USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, + +	/* Wistron panels */ +	{ .driver_data = MT_CLS_NSMU, +		MT_USB_DEVICE(USB_VENDOR_ID_WISTRON, +			USB_DEVICE_ID_WISTRON_OPTICAL_TOUCH) }, +  	/* XAT */  	{ .driver_data = MT_CLS_NSMU,  		MT_USB_DEVICE(USB_VENDOR_ID_XAT, diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index da551d113762..098af2f84b8c 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -225,6 +225,13 @@ static const unsigned int buzz_keymap[] = {  struct sony_sc {  	unsigned long quirks; +#ifdef CONFIG_SONY_FF +	struct work_struct rumble_worker; +	struct hid_device *hdev; +	__u8 left; +	__u8 right; +#endif +  	void *extra;  }; @@ -615,9 +622,9 @@ static void buzz_remove(struct hid_device *hdev)  }  #ifdef CONFIG_SONY_FF -static int sony_play_effect(struct input_dev *dev, void *data, -			    struct ff_effect *effect) +static void sony_rumble_worker(struct work_struct *work)  { +	struct sony_sc *sc = container_of(work, struct sony_sc, rumble_worker);  	unsigned char buf[] = {  		0x01,  		0x00, 0xff, 0x00, 0xff, 0x00, @@ -628,21 +635,28 @@ static int sony_play_effect(struct input_dev *dev, void *data,  		0xff, 0x27, 0x10, 0x00, 0x32,  		0x00, 0x00, 0x00, 0x00, 0x00  	}; -	__u8 left; -	__u8 right; + +	buf[3] = sc->right; +	buf[5] = sc->left; + +	sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf), +					HID_OUTPUT_REPORT); +} + +static int sony_play_effect(struct input_dev *dev, void *data, +			    struct ff_effect *effect) +{  	struct hid_device *hid = input_get_drvdata(dev); +	struct sony_sc *sc = hid_get_drvdata(hid);  	if (effect->type != FF_RUMBLE)  		return 0; -	left = effect->u.rumble.strong_magnitude / 256; -	right = effect->u.rumble.weak_magnitude ? 1 : 0; - -	buf[3] = right; -	buf[5] = left; +	sc->left = effect->u.rumble.strong_magnitude / 256; +	sc->right = effect->u.rumble.weak_magnitude ? 1 : 0; -	return hid->hid_output_raw_report(hid, buf, sizeof(buf), -					  HID_OUTPUT_REPORT); +	schedule_work(&sc->rumble_worker); +	return 0;  }  static int sony_init_ff(struct hid_device *hdev) @@ -650,16 +664,31 @@ static int sony_init_ff(struct hid_device *hdev)  	struct hid_input *hidinput = list_entry(hdev->inputs.next,  						struct hid_input, list);  	struct input_dev *input_dev = hidinput->input; +	struct sony_sc *sc = hid_get_drvdata(hdev); + +	sc->hdev = hdev; +	INIT_WORK(&sc->rumble_worker, sony_rumble_worker);  	input_set_capability(input_dev, EV_FF, FF_RUMBLE);  	return input_ff_create_memless(input_dev, NULL, sony_play_effect);  } +static void sony_destroy_ff(struct hid_device *hdev) +{ +	struct sony_sc *sc = hid_get_drvdata(hdev); + +	cancel_work_sync(&sc->rumble_worker); +} +  #else  static int sony_init_ff(struct hid_device *hdev)  {  	return 0;  } + +static void sony_destroy_ff(struct hid_device *hdev) +{ +}  #endif  static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) @@ -728,6 +757,8 @@ static void sony_remove(struct hid_device *hdev)  	if (sc->quirks & BUZZ_CONTROLLER)  		buzz_remove(hdev); +	sony_destroy_ff(hdev); +  	hid_hw_stop(hdev);  } diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index 1446f526ee8b..abb20db2b443 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c @@ -834,8 +834,7 @@ static void wiimote_init_set_type(struct wiimote_data *wdata,  		goto done;  	} -	if (vendor == USB_VENDOR_ID_NINTENDO || -	    vendor == USB_VENDOR_ID_NINTENDO2) { +	if (vendor == USB_VENDOR_ID_NINTENDO) {  		if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE) {  			devtype = WIIMOTE_DEV_GEN10;  			goto done; @@ -1856,8 +1855,6 @@ static void wiimote_hid_remove(struct hid_device *hdev)  static const struct hid_device_id wiimote_hid_devices[] = {  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO,  				USB_DEVICE_ID_NINTENDO_WIIMOTE) }, -	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, -				USB_DEVICE_ID_NINTENDO_WIIMOTE) },  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO,  				USB_DEVICE_ID_NINTENDO_WIIMOTE2) },  	{ } diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index 93b00d76374c..cedc6da93c19 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c @@ -287,7 +287,7 @@ static int uhid_event_from_user(const char __user *buffer, size_t len,  			 */  			struct uhid_create_req_compat *compat; -			compat = kmalloc(sizeof(*compat), GFP_KERNEL); +			compat = kzalloc(sizeof(*compat), GFP_KERNEL);  			if (!compat)  				return -ENOMEM; diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c index 1d7ff46812c3..dafc63c6932d 100644 --- a/drivers/hwmon/asus_atk0110.c +++ b/drivers/hwmon/asus_atk0110.c @@ -18,7 +18,6 @@  #include <linux/err.h>  #include <acpi/acpi.h> -#include <acpi/acpixf.h>  #include <acpi/acpi_drivers.h>  #include <acpi/acpi_bus.h> diff --git a/drivers/i2c/busses/i2c-bcm-kona.c b/drivers/i2c/busses/i2c-bcm-kona.c index 036cf03aeb61..18a74a6751a9 100644 --- a/drivers/i2c/busses/i2c-bcm-kona.c +++ b/drivers/i2c/busses/i2c-bcm-kona.c @@ -20,7 +20,6 @@  #include <linux/platform_device.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/clk.h>  #include <linux/slab.h>  /* Hardware register offsets and field defintions */ @@ -891,7 +890,7 @@ static const struct of_device_id bcm_kona_i2c_of_match[] = {  	{.compatible = "brcm,kona-i2c",},  	{},  }; -MODULE_DEVICE_TABLE(of, kona_i2c_of_match); +MODULE_DEVICE_TABLE(of, bcm_kona_i2c_of_match);  static struct platform_driver bcm_kona_i2c_driver = {  	.driver = { diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c index d7e8600f31fb..77df97b932af 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -299,6 +299,7 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)  	strlcpy(adap->name, "bcm2835 I2C adapter", sizeof(adap->name));  	adap->algo = &bcm2835_i2c_algo;  	adap->dev.parent = &pdev->dev; +	adap->dev.of_node = pdev->dev.of_node;  	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index ff05d9fef4a8..af0b5830303d 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -125,12 +125,12 @@ static struct davinci_i2c_platform_data davinci_i2c_platform_data_default = {  static inline void davinci_i2c_write_reg(struct davinci_i2c_dev *i2c_dev,  					 int reg, u16 val)  { -	__raw_writew(val, i2c_dev->base + reg); +	writew_relaxed(val, i2c_dev->base + reg);  }  static inline u16 davinci_i2c_read_reg(struct davinci_i2c_dev *i2c_dev, int reg)  { -	return __raw_readw(i2c_dev->base + reg); +	return readw_relaxed(i2c_dev->base + reg);  }  /* Generate a pulse on the i2c clock pin. */ diff --git a/drivers/i2c/busses/i2c-diolan-u2c.c b/drivers/i2c/busses/i2c-diolan-u2c.c index dae3ddfe7619..721f7ebf9a3b 100644 --- a/drivers/i2c/busses/i2c-diolan-u2c.c +++ b/drivers/i2c/busses/i2c-diolan-u2c.c @@ -25,8 +25,6 @@  #define USB_VENDOR_ID_DIOLAN		0x0abf  #define USB_DEVICE_ID_DIOLAN_U2C	0x3370 -#define DIOLAN_OUT_EP		0x02 -#define DIOLAN_IN_EP		0x84  /* commands via USB, must match command ids in the firmware */  #define CMD_I2C_READ		0x01 @@ -84,6 +82,7 @@  struct i2c_diolan_u2c {  	u8 obuffer[DIOLAN_OUTBUF_LEN];	/* output buffer */  	u8 ibuffer[DIOLAN_INBUF_LEN];	/* input buffer */ +	int ep_in, ep_out;              /* Endpoints    */  	struct usb_device *usb_dev;	/* the usb device for this device */  	struct usb_interface *interface;/* the interface for this device */  	struct i2c_adapter adapter;	/* i2c related things */ @@ -109,7 +108,7 @@ static int diolan_usb_transfer(struct i2c_diolan_u2c *dev)  		return -EINVAL;  	ret = usb_bulk_msg(dev->usb_dev, -			   usb_sndbulkpipe(dev->usb_dev, DIOLAN_OUT_EP), +			   usb_sndbulkpipe(dev->usb_dev, dev->ep_out),  			   dev->obuffer, dev->olen, &actual,  			   DIOLAN_USB_TIMEOUT);  	if (!ret) { @@ -118,7 +117,7 @@ static int diolan_usb_transfer(struct i2c_diolan_u2c *dev)  			tmpret = usb_bulk_msg(dev->usb_dev,  					      usb_rcvbulkpipe(dev->usb_dev, -							      DIOLAN_IN_EP), +							      dev->ep_in),  					      dev->ibuffer,  					      sizeof(dev->ibuffer), &actual,  					      DIOLAN_USB_TIMEOUT); @@ -210,7 +209,7 @@ static void diolan_flush_input(struct i2c_diolan_u2c *dev)  		int ret;  		ret = usb_bulk_msg(dev->usb_dev, -				   usb_rcvbulkpipe(dev->usb_dev, DIOLAN_IN_EP), +				   usb_rcvbulkpipe(dev->usb_dev, dev->ep_in),  				   dev->ibuffer, sizeof(dev->ibuffer), &actual,  				   DIOLAN_USB_TIMEOUT);  		if (ret < 0 || actual == 0) @@ -445,9 +444,14 @@ static void diolan_u2c_free(struct i2c_diolan_u2c *dev)  static int diolan_u2c_probe(struct usb_interface *interface,  			    const struct usb_device_id *id)  { +	struct usb_host_interface *hostif = interface->cur_altsetting;  	struct i2c_diolan_u2c *dev;  	int ret; +	if (hostif->desc.bInterfaceNumber != 0 +	    || hostif->desc.bNumEndpoints < 2) +		return -ENODEV; +  	/* allocate memory for our device state and initialize it */  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);  	if (dev == NULL) { @@ -455,6 +459,8 @@ static int diolan_u2c_probe(struct usb_interface *interface,  		ret = -ENOMEM;  		goto error;  	} +	dev->ep_out = hostif->endpoint[0].desc.bEndpointAddress; +	dev->ep_in = hostif->endpoint[1].desc.bEndpointAddress;  	dev->usb_dev = usb_get_dev(interface_to_usbdev(interface));  	dev->interface = interface; diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index d76228d81d5f..90dcc2eaac5f 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -266,13 +266,13 @@ static const u8 reg_map_ip_v2[] = {  static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev,  				      int reg, u16 val)  { -	__raw_writew(val, i2c_dev->base + +	writew_relaxed(val, i2c_dev->base +  			(i2c_dev->regs[reg] << i2c_dev->reg_shift));  }  static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg)  { -	return __raw_readw(i2c_dev->base + +	return readw_relaxed(i2c_dev->base +  				(i2c_dev->regs[reg] << i2c_dev->reg_shift));  } @@ -1162,9 +1162,9 @@ omap_i2c_probe(struct platform_device *pdev)  	 * Read the Rev hi bit-[15:14] ie scheme this is 1 indicates ver2.  	 * On omap1/3/2 Offset 4 is IE Reg the bit [15:14] is 0 at reset.  	 * Also since the omap_i2c_read_reg uses reg_map_ip_* a -	 * raw_readw is done. +	 * readw_relaxed is done.  	 */ -	rev = __raw_readw(dev->base + 0x04); +	rev = readw_relaxed(dev->base + 0x04);  	dev->scheme = OMAP_I2C_SCHEME(rev);  	switch (dev->scheme) { diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c index dcda17395c4e..1cae4e920c9b 100644 --- a/drivers/iio/accel/hid-sensor-accel-3d.c +++ b/drivers/iio/accel/hid-sensor-accel-3d.c @@ -350,7 +350,7 @@ static int hid_accel_3d_probe(struct platform_device *pdev)  error_iio_unreg:  	iio_device_unregister(indio_dev);  error_remove_trigger: -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&accel_state->common_attributes);  error_unreg_buffer_funcs:  	iio_triggered_buffer_cleanup(indio_dev);  error_free_dev_mem: @@ -363,10 +363,11 @@ static int hid_accel_3d_remove(struct platform_device *pdev)  {  	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;  	struct iio_dev *indio_dev = platform_get_drvdata(pdev); +	struct accel_3d_state *accel_state = iio_priv(indio_dev);  	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ACCEL_3D);  	iio_device_unregister(indio_dev); -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&accel_state->common_attributes);  	iio_triggered_buffer_cleanup(indio_dev);  	kfree(indio_dev->channels); diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c index d72118d1189c..98ba761cbb9c 100644 --- a/drivers/iio/accel/kxsd9.c +++ b/drivers/iio/accel/kxsd9.c @@ -112,9 +112,10 @@ static int kxsd9_read(struct iio_dev *indio_dev, u8 address)  	mutex_lock(&st->buf_lock);  	st->tx[0] = KXSD9_READ(address);  	ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers)); -	if (ret) -		return ret; -	return (((u16)(st->rx[0])) << 8) | (st->rx[1] & 0xF0); +	if (!ret) +		ret = (((u16)(st->rx[0])) << 8) | (st->rx[1] & 0xF0); +	mutex_unlock(&st->buf_lock); +	return ret;  }  static IIO_CONST_ATTR(accel_scale_available, diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 17df74908db1..5b1aa027c034 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c @@ -1047,6 +1047,7 @@ static int at91_adc_probe(struct platform_device *pdev)  	} else {  		if (!st->caps->has_tsmr) {  			dev_err(&pdev->dev, "We don't support non-TSMR adc\n"); +			ret = -ENODEV;  			goto error_disable_adc_clk;  		} diff --git a/drivers/iio/adc/mcp3422.c b/drivers/iio/adc/mcp3422.c index 12948325431c..c8c1baaec6c1 100644 --- a/drivers/iio/adc/mcp3422.c +++ b/drivers/iio/adc/mcp3422.c @@ -88,10 +88,10 @@ static const int mcp3422_sample_rates[4] = {  /* sample rates to sign extension table */  static const int mcp3422_sign_extend[4] = { -	[MCP3422_SRATE_240] = 12, -	[MCP3422_SRATE_60] = 14, -	[MCP3422_SRATE_15] = 16, -	[MCP3422_SRATE_3] = 18 }; +	[MCP3422_SRATE_240] = 11, +	[MCP3422_SRATE_60] = 13, +	[MCP3422_SRATE_15] = 15, +	[MCP3422_SRATE_3] = 17 };  /* Client data (each client gets its own) */  struct mcp3422 { diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index 728411ec7642..d4d748214e4b 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -229,12 +229,15 @@ static int tiadc_iio_buffered_hardware_setup(struct iio_dev *indio_dev,  	unsigned long flags,  	const struct iio_buffer_setup_ops *setup_ops)  { +	struct iio_buffer *buffer;  	int ret; -	indio_dev->buffer = iio_kfifo_allocate(indio_dev); -	if (!indio_dev->buffer) +	buffer = iio_kfifo_allocate(indio_dev); +	if (!buffer)  		return -ENOMEM; +	iio_device_attach_buffer(indio_dev, buffer); +  	ret = request_threaded_irq(irq,	pollfunc_th, pollfunc_bh,  				flags, indio_dev->name, indio_dev);  	if (ret) diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index b6e77e0fc420..bbd6426c9726 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c @@ -55,11 +55,10 @@ static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig,  	return 0;  } -void hid_sensor_remove_trigger(struct iio_dev *indio_dev) +void hid_sensor_remove_trigger(struct hid_sensor_common *attrb)  { -	iio_trigger_unregister(indio_dev->trig); -	iio_trigger_free(indio_dev->trig); -	indio_dev->trig = NULL; +	iio_trigger_unregister(attrb->trigger); +	iio_trigger_free(attrb->trigger);  }  EXPORT_SYMBOL(hid_sensor_remove_trigger); @@ -90,7 +89,7 @@ int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,  		dev_err(&indio_dev->dev, "Trigger Register Failed\n");  		goto error_free_trig;  	} -	indio_dev->trig = trig; +	indio_dev->trig = attrb->trigger = trig;  	return ret; diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.h b/drivers/iio/common/hid-sensors/hid-sensor-trigger.h index 9a8731478eda..ca02f7811aa8 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.h +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.h @@ -21,6 +21,6 @@  int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,  				struct hid_sensor_common *attrb); -void hid_sensor_remove_trigger(struct iio_dev *indio_dev); +void hid_sensor_remove_trigger(struct hid_sensor_common *attrb);  #endif diff --git a/drivers/iio/gyro/hid-sensor-gyro-3d.c b/drivers/iio/gyro/hid-sensor-gyro-3d.c index ea01c6bcfb56..e54f0f4959d3 100644 --- a/drivers/iio/gyro/hid-sensor-gyro-3d.c +++ b/drivers/iio/gyro/hid-sensor-gyro-3d.c @@ -348,7 +348,7 @@ static int hid_gyro_3d_probe(struct platform_device *pdev)  error_iio_unreg:  	iio_device_unregister(indio_dev);  error_remove_trigger: -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&gyro_state->common_attributes);  error_unreg_buffer_funcs:  	iio_triggered_buffer_cleanup(indio_dev);  error_free_dev_mem: @@ -361,10 +361,11 @@ static int hid_gyro_3d_remove(struct platform_device *pdev)  {  	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;  	struct iio_dev *indio_dev = platform_get_drvdata(pdev); +	struct gyro_3d_state *gyro_state = iio_priv(indio_dev);  	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_GYRO_3D);  	iio_device_unregister(indio_dev); -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&gyro_state->common_attributes);  	iio_triggered_buffer_cleanup(indio_dev);  	kfree(indio_dev->channels); diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index f98c2b509254..b0d65df3ede2 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig @@ -81,6 +81,8 @@ config SENSORS_LM3533  config TCS3472  	tristate "TAOS TCS3472 color light-to-digital converter"  	depends on I2C +	select IIO_BUFFER +	select IIO_TRIGGERED_BUFFER  	help  	 If you say yes here you get support for the TAOS TCS3472  	 family of color light-to-digital converters with IR filter. diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index fa6ae8cf89ea..8e8b9d722853 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c @@ -314,7 +314,7 @@ static int hid_als_probe(struct platform_device *pdev)  error_iio_unreg:  	iio_device_unregister(indio_dev);  error_remove_trigger: -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&als_state->common_attributes);  error_unreg_buffer_funcs:  	iio_triggered_buffer_cleanup(indio_dev);  error_free_dev_mem: @@ -327,10 +327,11 @@ static int hid_als_remove(struct platform_device *pdev)  {  	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;  	struct iio_dev *indio_dev = platform_get_drvdata(pdev); +	struct als_state *als_state = iio_priv(indio_dev);  	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ALS);  	iio_device_unregister(indio_dev); -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&als_state->common_attributes);  	iio_triggered_buffer_cleanup(indio_dev);  	kfree(indio_dev->channels); diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig index 0cf09637b35b..d86d226dcd67 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig @@ -19,6 +19,8 @@ config AK8975  config MAG3110  	tristate "Freescale MAG3110 3-Axis Magnetometer"  	depends on I2C +	select IIO_BUFFER +	select IIO_TRIGGERED_BUFFER  	help  	  Say yes here to build support for the Freescale MAG3110 3-Axis  	  magnetometer. diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index 2634920562fb..b26e1028a0a0 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c @@ -351,7 +351,7 @@ static int hid_magn_3d_probe(struct platform_device *pdev)  error_iio_unreg:  	iio_device_unregister(indio_dev);  error_remove_trigger: -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&magn_state->common_attributes);  error_unreg_buffer_funcs:  	iio_triggered_buffer_cleanup(indio_dev);  error_free_dev_mem: @@ -364,10 +364,11 @@ static int hid_magn_3d_remove(struct platform_device *pdev)  {  	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;  	struct iio_dev *indio_dev = platform_get_drvdata(pdev); +	struct magn_3d_state *magn_state = iio_priv(indio_dev);  	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_COMPASS_3D);  	iio_device_unregister(indio_dev); -	hid_sensor_remove_trigger(indio_dev); +	hid_sensor_remove_trigger(&magn_state->common_attributes);  	iio_triggered_buffer_cleanup(indio_dev);  	kfree(indio_dev->channels); diff --git a/drivers/iio/magnetometer/mag3110.c b/drivers/iio/magnetometer/mag3110.c index 783c5b417356..becf54496967 100644 --- a/drivers/iio/magnetometer/mag3110.c +++ b/drivers/iio/magnetometer/mag3110.c @@ -250,7 +250,12 @@ done:  	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \  		BIT(IIO_CHAN_INFO_SCALE), \  	.scan_index = idx, \ -	.scan_type = IIO_ST('s', 16, 16, IIO_BE), \ +	.scan_type = { \ +		.sign = 's', \ +		.realbits = 16, \ +		.storagebits = 16, \ +		.endianness = IIO_BE, \ +	}, \  }  static const struct iio_chan_spec mag3110_channels[] = { diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 9031171c141b..341c6016812d 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -957,12 +957,13 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,  	if (WARN_ON(!gic->domain))  		return; +	if (gic_nr == 0) {  #ifdef CONFIG_SMP -	set_smp_cross_call(gic_raise_softirq); -	register_cpu_notifier(&gic_cpu_notifier); +		set_smp_cross_call(gic_raise_softirq); +		register_cpu_notifier(&gic_cpu_notifier);  #endif - -	set_handle_irq(gic_handle_irq); +		set_handle_irq(gic_handle_irq); +	}  	gic_chip.flags |= gic_arch_extn.flags;  	gic_dist_init(gic); diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index 2848171b8576..b31d8e99c419 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c @@ -82,22 +82,12 @@ static inline size_t sizeof_pwm_leds_priv(int num_leds)  		      (sizeof(struct led_pwm_data) * num_leds);  } -static struct led_pwm_priv *led_pwm_create_of(struct platform_device *pdev) +static int led_pwm_create_of(struct platform_device *pdev, +			     struct led_pwm_priv *priv)  {  	struct device_node *node = pdev->dev.of_node;  	struct device_node *child; -	struct led_pwm_priv *priv; -	int count, ret; - -	/* count LEDs in this device, so we know how much to allocate */ -	count = of_get_child_count(node); -	if (!count) -		return NULL; - -	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(count), -			    GFP_KERNEL); -	if (!priv) -		return NULL; +	int ret;  	for_each_child_of_node(node, child) {  		struct led_pwm_data *led_dat = &priv->leds[priv->num_leds]; @@ -109,6 +99,7 @@ static struct led_pwm_priv *led_pwm_create_of(struct platform_device *pdev)  		if (IS_ERR(led_dat->pwm)) {  			dev_err(&pdev->dev, "unable to request PWM for %s\n",  				led_dat->cdev.name); +			ret = PTR_ERR(led_dat->pwm);  			goto err;  		}  		/* Get the period from PWM core when n*/ @@ -137,28 +128,36 @@ static struct led_pwm_priv *led_pwm_create_of(struct platform_device *pdev)  		priv->num_leds++;  	} -	return priv; +	return 0;  err:  	while (priv->num_leds--)  		led_classdev_unregister(&priv->leds[priv->num_leds].cdev); -	return NULL; +	return ret;  }  static int led_pwm_probe(struct platform_device *pdev)  {  	struct led_pwm_platform_data *pdata = dev_get_platdata(&pdev->dev);  	struct led_pwm_priv *priv; -	int i, ret = 0; +	int count, i; +	int ret = 0; + +	if (pdata) +		count = pdata->num_leds; +	else +		count = of_get_child_count(pdev->dev.of_node); + +	if (!count) +		return -EINVAL; -	if (pdata && pdata->num_leds) { -		priv = devm_kzalloc(&pdev->dev, -				    sizeof_pwm_leds_priv(pdata->num_leds), -				    GFP_KERNEL); -		if (!priv) -			return -ENOMEM; +	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(count), +			    GFP_KERNEL); +	if (!priv) +		return -ENOMEM; -		for (i = 0; i < pdata->num_leds; i++) { +	if (pdata) { +		for (i = 0; i < count; i++) {  			struct led_pwm *cur_led = &pdata->leds[i];  			struct led_pwm_data *led_dat = &priv->leds[i]; @@ -188,11 +187,11 @@ static int led_pwm_probe(struct platform_device *pdev)  			if (ret < 0)  				goto err;  		} -		priv->num_leds = pdata->num_leds; +		priv->num_leds = count;  	} else { -		priv = led_pwm_create_of(pdev); -		if (!priv) -			return -ENODEV; +		ret = led_pwm_create_of(pdev, priv); +		if (ret) +			return ret;  	}  	platform_set_drvdata(pdev, priv); diff --git a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile index 6753b65f8ede..d2f0120bc878 100644 --- a/drivers/macintosh/Makefile +++ b/drivers/macintosh/Makefile @@ -40,6 +40,7 @@ obj-$(CONFIG_WINDFARM_RM31)     += windfarm_fcu_controls.o \  				   windfarm_ad7417_sensor.o \  				   windfarm_lm75_sensor.o \  				   windfarm_lm87_sensor.o \ +				   windfarm_max6690_sensor.o \  				   windfarm_pid.o \  				   windfarm_cpufreq_clamp.o \  				   windfarm_rm31.o diff --git a/drivers/md/md.c b/drivers/md/md.c index b6b7a2866c9e..e60cebf3f519 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7777,7 +7777,7 @@ void md_check_recovery(struct mddev *mddev)  	if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))  		return;  	if ( ! ( -		(mddev->flags & ~ (1<<MD_CHANGE_PENDING)) || +		(mddev->flags & MD_UPDATE_SB_FLAGS & ~ (1<<MD_CHANGE_PENDING)) ||  		test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||  		test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||  		(mddev->external == 0 && mddev->safemode == 1) || diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 47da0af6322b..cc055da02e2a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -678,26 +678,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector,  			} else  				init_stripe(sh, sector, previous);  		} else { +			spin_lock(&conf->device_lock);  			if (atomic_read(&sh->count)) {  				BUG_ON(!list_empty(&sh->lru)  				    && !test_bit(STRIPE_EXPANDING, &sh->state)  				    && !test_bit(STRIPE_ON_UNPLUG_LIST, &sh->state) -				    && !test_bit(STRIPE_ON_RELEASE_LIST, &sh->state)); +					);  			} else { -				spin_lock(&conf->device_lock);  				if (!test_bit(STRIPE_HANDLE, &sh->state))  					atomic_inc(&conf->active_stripes); -				if (list_empty(&sh->lru) && -				    !test_bit(STRIPE_ON_RELEASE_LIST, &sh->state) && -				    !test_bit(STRIPE_EXPANDING, &sh->state)) -					BUG(); +				BUG_ON(list_empty(&sh->lru));  				list_del_init(&sh->lru);  				if (sh->group) {  					sh->group->stripes_cnt--;  					sh->group = NULL;  				} -				spin_unlock(&conf->device_lock);  			} +			spin_unlock(&conf->device_lock);  		}  	} while (sh == NULL); @@ -5471,7 +5468,7 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt,  	for (i = 0; i < *group_cnt; i++) {  		struct r5worker_group *group; -		group = worker_groups[i]; +		group = &(*worker_groups)[i];  		INIT_LIST_HEAD(&group->handle_list);  		group->conf = conf;  		group->workers = workers + i * cnt; diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 0b10a9030f4e..98b6b6ef7e5c 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -22,6 +22,7 @@  #include <linux/delay.h>  #include <linux/spinlock.h>  #include <linux/timer.h> +#include <linux/of.h>  #include <linux/omap-dma.h>  #include <linux/mmc/host.h>  #include <linux/mmc/card.h> @@ -90,17 +91,6 @@  #define OMAP_MMC_CMDTYPE_AC	2  #define OMAP_MMC_CMDTYPE_ADTC	3 -#define OMAP_DMA_MMC_TX		21 -#define OMAP_DMA_MMC_RX		22 -#define OMAP_DMA_MMC2_TX	54 -#define OMAP_DMA_MMC2_RX	55 - -#define OMAP24XX_DMA_MMC2_TX	47 -#define OMAP24XX_DMA_MMC2_RX	48 -#define OMAP24XX_DMA_MMC1_TX	61 -#define OMAP24XX_DMA_MMC1_RX	62 - -  #define DRIVER_NAME "mmci-omap"  /* Specifies how often in millisecs to poll for card status changes @@ -1330,7 +1320,7 @@ static int mmc_omap_probe(struct platform_device *pdev)  	struct mmc_omap_host *host = NULL;  	struct resource *res;  	dma_cap_mask_t mask; -	unsigned sig; +	unsigned sig = 0;  	int i, ret = 0;  	int irq; @@ -1340,7 +1330,7 @@ static int mmc_omap_probe(struct platform_device *pdev)  	}  	if (pdata->nr_slots == 0) {  		dev_err(&pdev->dev, "no slots\n"); -		return -ENXIO; +		return -EPROBE_DEFER;  	}  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -1407,19 +1397,20 @@ static int mmc_omap_probe(struct platform_device *pdev)  	host->dma_tx_burst = -1;  	host->dma_rx_burst = -1; -	if (mmc_omap2()) -		sig = host->id == 0 ? OMAP24XX_DMA_MMC1_TX : OMAP24XX_DMA_MMC2_TX; -	else -		sig = host->id == 0 ? OMAP_DMA_MMC_TX : OMAP_DMA_MMC2_TX; -	host->dma_tx = dma_request_channel(mask, omap_dma_filter_fn, &sig); +	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); +	if (res) +		sig = res->start; +	host->dma_tx = dma_request_slave_channel_compat(mask, +				omap_dma_filter_fn, &sig, &pdev->dev, "tx");  	if (!host->dma_tx)  		dev_warn(host->dev, "unable to obtain TX DMA engine channel %u\n",  			sig); -	if (mmc_omap2()) -		sig = host->id == 0 ? OMAP24XX_DMA_MMC1_RX : OMAP24XX_DMA_MMC2_RX; -	else -		sig = host->id == 0 ? OMAP_DMA_MMC_RX : OMAP_DMA_MMC2_RX; -	host->dma_rx = dma_request_channel(mask, omap_dma_filter_fn, &sig); + +	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); +	if (res) +		sig = res->start; +	host->dma_rx = dma_request_slave_channel_compat(mask, +				omap_dma_filter_fn, &sig, &pdev->dev, "rx");  	if (!host->dma_rx)  		dev_warn(host->dev, "unable to obtain RX DMA engine channel %u\n",  			sig); @@ -1512,12 +1503,20 @@ static int mmc_omap_remove(struct platform_device *pdev)  	return 0;  } +#if IS_BUILTIN(CONFIG_OF) +static const struct of_device_id mmc_omap_match[] = { +	{ .compatible = "ti,omap2420-mmc", }, +	{ }, +}; +#endif +  static struct platform_driver mmc_omap_driver = {  	.probe		= mmc_omap_probe,  	.remove		= mmc_omap_remove,  	.driver		= {  		.name	= DRIVER_NAME,  		.owner	= THIS_MODULE, +		.of_match_table = of_match_ptr(mmc_omap_match),  	},  }; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4dd5ee2a34cc..36eab0c4fb33 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -4110,7 +4110,7 @@ static int bond_check_params(struct bond_params *params)  		if (!miimon) {  			pr_warning("Warning: miimon must be specified, otherwise bonding will not detect link failure, speed and duplex which are essential for 802.3ad operation\n");  			pr_warning("Forcing miimon to 100msec\n"); -			miimon = 100; +			miimon = BOND_DEFAULT_MIIMON;  		}  	} @@ -4147,7 +4147,7 @@ static int bond_check_params(struct bond_params *params)  		if (!miimon) {  			pr_warning("Warning: miimon must be specified, otherwise bonding will not detect link failure and link speed which are essential for TLB/ALB load balancing\n");  			pr_warning("Forcing miimon to 100msec\n"); -			miimon = 100; +			miimon = BOND_DEFAULT_MIIMON;  		}  	} diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c index 9a5223c7b4d1..ea6f640782b7 100644 --- a/drivers/net/bonding/bond_options.c +++ b/drivers/net/bonding/bond_options.c @@ -45,10 +45,15 @@ int bond_option_mode_set(struct bonding *bond, int mode)  		return -EPERM;  	} -	if (BOND_MODE_IS_LB(mode) && bond->params.arp_interval) { -		pr_err("%s: %s mode is incompatible with arp monitoring.\n", -		       bond->dev->name, bond_mode_tbl[mode].modename); -		return -EINVAL; +	if (BOND_NO_USES_ARP(mode) && bond->params.arp_interval) { +		pr_info("%s: %s mode is incompatible with arp monitoring, start mii monitoring\n", +			bond->dev->name, bond_mode_tbl[mode].modename); +		/* disable arp monitoring */ +		bond->params.arp_interval = 0; +		/* set miimon to default value */ +		bond->params.miimon = BOND_DEFAULT_MIIMON; +		pr_info("%s: Setting MII monitoring interval to %d.\n", +			bond->dev->name, bond->params.miimon);  	}  	/* don't cache arp_validate between modes */ diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 0ec2a7e8c8a9..abf5e106edc5 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -523,9 +523,7 @@ static ssize_t bonding_store_arp_interval(struct device *d,  		ret = -EINVAL;  		goto out;  	} -	if (bond->params.mode == BOND_MODE_ALB || -	    bond->params.mode == BOND_MODE_TLB || -	    bond->params.mode == BOND_MODE_8023AD) { +	if (BOND_NO_USES_ARP(bond->params.mode)) {  		pr_info("%s: ARP monitoring cannot be used with ALB/TLB/802.3ad. Only MII monitoring is supported on %s.\n",  			bond->dev->name, bond->dev->name);  		ret = -EINVAL; diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index ca31286aa028..a9f4f9f4d8ce 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h @@ -35,6 +35,8 @@  #define BOND_MAX_ARP_TARGETS	16 +#define BOND_DEFAULT_MIIMON	100 +  #define IS_UP(dev)					   \  	      ((((dev)->flags & IFF_UP) == IFF_UP)	&& \  	       netif_running(dev)			&& \ @@ -55,6 +57,11 @@  		 ((mode) == BOND_MODE_TLB)          ||	\  		 ((mode) == BOND_MODE_ALB)) +#define BOND_NO_USES_ARP(mode)				\ +		(((mode) == BOND_MODE_8023AD)	||	\ +		 ((mode) == BOND_MODE_TLB)	||	\ +		 ((mode) == BOND_MODE_ALB)) +  #define TX_QUEUE_OVERRIDE(mode)				\  			(((mode) == BOND_MODE_ACTIVEBACKUP) ||	\  			 ((mode) == BOND_MODE_ROUNDROBIN)) diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index e3fc07cf2f62..77061eebb034 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c @@ -712,22 +712,31 @@ static int c_can_set_mode(struct net_device *dev, enum can_mode mode)  	return 0;  } -static int c_can_get_berr_counter(const struct net_device *dev, -					struct can_berr_counter *bec) +static int __c_can_get_berr_counter(const struct net_device *dev, +				    struct can_berr_counter *bec)  {  	unsigned int reg_err_counter;  	struct c_can_priv *priv = netdev_priv(dev); -	c_can_pm_runtime_get_sync(priv); -  	reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);  	bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>  				ERR_CNT_REC_SHIFT;  	bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK; +	return 0; +} + +static int c_can_get_berr_counter(const struct net_device *dev, +				  struct can_berr_counter *bec) +{ +	struct c_can_priv *priv = netdev_priv(dev); +	int err; + +	c_can_pm_runtime_get_sync(priv); +	err = __c_can_get_berr_counter(dev, bec);  	c_can_pm_runtime_put_sync(priv); -	return 0; +	return err;  }  /* @@ -754,6 +763,7 @@ static void c_can_do_tx(struct net_device *dev)  		if (!(val & (1 << (msg_obj_no - 1)))) {  			can_get_echo_skb(dev,  					msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST); +			c_can_object_get(dev, 0, msg_obj_no, IF_COMM_ALL);  			stats->tx_bytes += priv->read_reg(priv,  					C_CAN_IFACE(MSGCTRL_REG, 0))  					& IF_MCONT_DLC_MASK; @@ -872,7 +882,7 @@ static int c_can_handle_state_change(struct net_device *dev,  	if (unlikely(!skb))  		return 0; -	c_can_get_berr_counter(dev, &bec); +	__c_can_get_berr_counter(dev, &bec);  	reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);  	rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >>  				ERR_CNT_RP_SHIFT; diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index ae08cf129ebb..aaed97bee471 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -1020,13 +1020,13 @@ static int flexcan_probe(struct platform_device *pdev)  			dev_err(&pdev->dev, "no ipg clock defined\n");  			return PTR_ERR(clk_ipg);  		} -		clock_freq = clk_get_rate(clk_ipg);  		clk_per = devm_clk_get(&pdev->dev, "per");  		if (IS_ERR(clk_per)) {  			dev_err(&pdev->dev, "no per clock defined\n");  			return PTR_ERR(clk_per);  		} +		clock_freq = clk_get_rate(clk_per);  	}  	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index 7164a999f50f..f17c3018b7c7 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c @@ -494,20 +494,20 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)  	uint8_t isrc, status;  	int n = 0; -	/* Shared interrupts and IRQ off? */ -	if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF) -		return IRQ_NONE; -  	if (priv->pre_irq)  		priv->pre_irq(priv); +	/* Shared interrupts and IRQ off? */ +	if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF) +		goto out; +  	while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&  	       (n < SJA1000_MAX_IRQ)) { -		n++; +  		status = priv->read_reg(priv, SJA1000_SR);  		/* check for absent controller due to hw unplug */  		if (status == 0xFF && sja1000_is_absent(priv)) -			return IRQ_NONE; +			goto out;  		if (isrc & IRQ_WUI)  			netdev_warn(dev, "wakeup interrupt\n"); @@ -535,7 +535,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)  				status = priv->read_reg(priv, SJA1000_SR);  				/* check for absent controller */  				if (status == 0xFF && sja1000_is_absent(priv)) -					return IRQ_NONE; +					goto out;  			}  		}  		if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { @@ -543,8 +543,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)  			if (sja1000_err(dev, isrc, status))  				break;  		} +		n++;  	} - +out:  	if (priv->post_irq)  		priv->post_irq(priv); diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index a9e068423ba0..369b736dde05 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -10629,10 +10629,8 @@ static void tg3_sd_scan_scratchpad(struct tg3 *tp, struct tg3_ocir *ocir)  static ssize_t tg3_show_temp(struct device *dev,  			     struct device_attribute *devattr, char *buf)  { -	struct pci_dev *pdev = to_pci_dev(dev); -	struct net_device *netdev = pci_get_drvdata(pdev); -	struct tg3 *tp = netdev_priv(netdev);  	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); +	struct tg3 *tp = dev_get_drvdata(dev);  	u32 temperature;  	spin_lock_bh(&tp->lock); @@ -10650,29 +10648,25 @@ static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, tg3_show_temp, NULL,  static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, tg3_show_temp, NULL,  			  TG3_TEMP_MAX_OFFSET); -static struct attribute *tg3_attributes[] = { +static struct attribute *tg3_attrs[] = {  	&sensor_dev_attr_temp1_input.dev_attr.attr,  	&sensor_dev_attr_temp1_crit.dev_attr.attr,  	&sensor_dev_attr_temp1_max.dev_attr.attr,  	NULL  }; - -static const struct attribute_group tg3_group = { -	.attrs = tg3_attributes, -}; +ATTRIBUTE_GROUPS(tg3);  static void tg3_hwmon_close(struct tg3 *tp)  {  	if (tp->hwmon_dev) {  		hwmon_device_unregister(tp->hwmon_dev);  		tp->hwmon_dev = NULL; -		sysfs_remove_group(&tp->pdev->dev.kobj, &tg3_group);  	}  }  static void tg3_hwmon_open(struct tg3 *tp)  { -	int i, err; +	int i;  	u32 size = 0;  	struct pci_dev *pdev = tp->pdev;  	struct tg3_ocir ocirs[TG3_SD_NUM_RECS]; @@ -10690,18 +10684,11 @@ static void tg3_hwmon_open(struct tg3 *tp)  	if (!size)  		return; -	/* Register hwmon sysfs hooks */ -	err = sysfs_create_group(&pdev->dev.kobj, &tg3_group); -	if (err) { -		dev_err(&pdev->dev, "Cannot create sysfs group, aborting\n"); -		return; -	} - -	tp->hwmon_dev = hwmon_device_register(&pdev->dev); +	tp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, "tg3", +							  tp, tg3_groups);  	if (IS_ERR(tp->hwmon_dev)) {  		tp->hwmon_dev = NULL;  		dev_err(&pdev->dev, "Cannot register hwmon device, aborting\n"); -		sysfs_remove_group(&pdev->dev.kobj, &tg3_group);  	}  } diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index f4825db5d179..5878df619b53 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h @@ -503,6 +503,7 @@ struct be_adapter {  };  #define be_physfn(adapter)		(!adapter->virtfn) +#define be_virtfn(adapter)		(adapter->virtfn)  #define	sriov_enabled(adapter)		(adapter->num_vfs > 0)  #define sriov_want(adapter)             (be_physfn(adapter) &&	\  					 (num_vfs || pci_num_vf(adapter->pdev))) diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index dbcd5262c016..e0e8bc1ef14c 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -1032,6 +1032,13 @@ int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,  	} else {  		req->hdr.version = 2;  		req->page_size = 1; /* 1 for 4K */ + +		/* coalesce-wm field in this cmd is not relevant to Lancer. +		 * Lancer uses COMMON_MODIFY_CQ to set this field +		 */ +		if (!lancer_chip(adapter)) +			AMAP_SET_BITS(struct amap_cq_context_v2, coalescwm, +				      ctxt, coalesce_wm);  		AMAP_SET_BITS(struct amap_cq_context_v2, nodelay, ctxt,  								no_delay);  		AMAP_SET_BITS(struct amap_cq_context_v2, count, ctxt, diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index abde97471636..fee64bf10446 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -2658,8 +2658,8 @@ static int be_close(struct net_device *netdev)  	be_roce_dev_close(adapter); -	for_all_evt_queues(adapter, eqo, i) { -		if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { +	if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { +		for_all_evt_queues(adapter, eqo, i) {  			napi_disable(&eqo->napi);  			be_disable_busy_poll(eqo);  		} @@ -3253,12 +3253,10 @@ static int be_mac_setup(struct be_adapter *adapter)  		memcpy(mac, adapter->netdev->dev_addr, ETH_ALEN);  	} -	/* On BE3 VFs this cmd may fail due to lack of privilege. -	 * Ignore the failure as in this case pmac_id is fetched -	 * in the IFACE_CREATE cmd. -	 */ -	be_cmd_pmac_add(adapter, mac, adapter->if_handle, -			&adapter->pmac_id[0], 0); +	/* For BE3-R VFs, the PF programs the initial MAC address */ +	if (!(BEx_chip(adapter) && be_virtfn(adapter))) +		be_cmd_pmac_add(adapter, mac, adapter->if_handle, +				&adapter->pmac_id[0], 0);  	return 0;  } @@ -4599,6 +4597,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)  	if (adapter->wol)  		be_setup_wol(adapter, true); +	be_intr_set(adapter, false);  	cancel_delayed_work_sync(&adapter->func_recovery_work);  	netif_device_detach(netdev); @@ -4634,6 +4633,7 @@ static int be_resume(struct pci_dev *pdev)  	if (status)  		return status; +	be_intr_set(adapter, true);  	/* tell fw we're ready to fire cmds */  	status = be_cmd_fw_init(adapter);  	if (status) diff --git a/drivers/net/ethernet/intel/e1000/e1000.h b/drivers/net/ethernet/intel/e1000/e1000.h index 58c147271a36..f9313b36c887 100644 --- a/drivers/net/ethernet/intel/e1000/e1000.h +++ b/drivers/net/ethernet/intel/e1000/e1000.h @@ -83,6 +83,11 @@ struct e1000_adapter;  #define E1000_MAX_INTR			10 +/* + * Count for polling __E1000_RESET condition every 10-20msec. + */ +#define E1000_CHECK_RESET_COUNT	50 +  /* TX/RX descriptor defines */  #define E1000_DEFAULT_TXD		256  #define E1000_MAX_TXD			256 @@ -312,8 +317,6 @@ struct e1000_adapter {  	struct delayed_work watchdog_task;  	struct delayed_work fifo_stall_task;  	struct delayed_work phy_info_task; - -	struct mutex mutex;  };  enum e1000_state_t { diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index e38622825fa7..46e6544ed1b7 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -494,13 +494,20 @@ static void e1000_down_and_stop(struct e1000_adapter *adapter)  {  	set_bit(__E1000_DOWN, &adapter->flags); -	/* Only kill reset task if adapter is not resetting */ -	if (!test_bit(__E1000_RESETTING, &adapter->flags)) -		cancel_work_sync(&adapter->reset_task); -  	cancel_delayed_work_sync(&adapter->watchdog_task); + +	/* +	 * Since the watchdog task can reschedule other tasks, we should cancel +	 * it first, otherwise we can run into the situation when a work is +	 * still running after the adapter has been turned down. +	 */ +  	cancel_delayed_work_sync(&adapter->phy_info_task);  	cancel_delayed_work_sync(&adapter->fifo_stall_task); + +	/* Only kill reset task if adapter is not resetting */ +	if (!test_bit(__E1000_RESETTING, &adapter->flags)) +		cancel_work_sync(&adapter->reset_task);  }  void e1000_down(struct e1000_adapter *adapter) @@ -544,21 +551,8 @@ void e1000_down(struct e1000_adapter *adapter)  	e1000_clean_all_rx_rings(adapter);  } -static void e1000_reinit_safe(struct e1000_adapter *adapter) -{ -	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) -		msleep(1); -	mutex_lock(&adapter->mutex); -	e1000_down(adapter); -	e1000_up(adapter); -	mutex_unlock(&adapter->mutex); -	clear_bit(__E1000_RESETTING, &adapter->flags); -} -  void e1000_reinit_locked(struct e1000_adapter *adapter)  { -	/* if rtnl_lock is not held the call path is bogus */ -	ASSERT_RTNL();  	WARN_ON(in_interrupt());  	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))  		msleep(1); @@ -1316,7 +1310,6 @@ static int e1000_sw_init(struct e1000_adapter *adapter)  	e1000_irq_disable(adapter);  	spin_lock_init(&adapter->stats_lock); -	mutex_init(&adapter->mutex);  	set_bit(__E1000_DOWN, &adapter->flags); @@ -1440,6 +1433,10 @@ static int e1000_close(struct net_device *netdev)  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; +	int count = E1000_CHECK_RESET_COUNT; + +	while (test_bit(__E1000_RESETTING, &adapter->flags) && count--) +		usleep_range(10000, 20000);  	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));  	e1000_down(adapter); @@ -2325,11 +2322,8 @@ static void e1000_update_phy_info_task(struct work_struct *work)  	struct e1000_adapter *adapter = container_of(work,  						     struct e1000_adapter,  						     phy_info_task.work); -	if (test_bit(__E1000_DOWN, &adapter->flags)) -		return; -	mutex_lock(&adapter->mutex); +  	e1000_phy_get_info(&adapter->hw, &adapter->phy_info); -	mutex_unlock(&adapter->mutex);  }  /** @@ -2345,9 +2339,6 @@ static void e1000_82547_tx_fifo_stall_task(struct work_struct *work)  	struct net_device *netdev = adapter->netdev;  	u32 tctl; -	if (test_bit(__E1000_DOWN, &adapter->flags)) -		return; -	mutex_lock(&adapter->mutex);  	if (atomic_read(&adapter->tx_fifo_stall)) {  		if ((er32(TDT) == er32(TDH)) &&  		   (er32(TDFT) == er32(TDFH)) && @@ -2368,7 +2359,6 @@ static void e1000_82547_tx_fifo_stall_task(struct work_struct *work)  			schedule_delayed_work(&adapter->fifo_stall_task, 1);  		}  	} -	mutex_unlock(&adapter->mutex);  }  bool e1000_has_link(struct e1000_adapter *adapter) @@ -2422,10 +2412,6 @@ static void e1000_watchdog(struct work_struct *work)  	struct e1000_tx_ring *txdr = adapter->tx_ring;  	u32 link, tctl; -	if (test_bit(__E1000_DOWN, &adapter->flags)) -		return; - -	mutex_lock(&adapter->mutex);  	link = e1000_has_link(adapter);  	if ((netif_carrier_ok(netdev)) && link)  		goto link_up; @@ -2516,7 +2502,7 @@ link_up:  			adapter->tx_timeout_count++;  			schedule_work(&adapter->reset_task);  			/* exit immediately since reset is imminent */ -			goto unlock; +			return;  		}  	} @@ -2544,9 +2530,6 @@ link_up:  	/* Reschedule the task */  	if (!test_bit(__E1000_DOWN, &adapter->flags))  		schedule_delayed_work(&adapter->watchdog_task, 2 * HZ); - -unlock: -	mutex_unlock(&adapter->mutex);  }  enum latency_range { @@ -3495,10 +3478,8 @@ static void e1000_reset_task(struct work_struct *work)  	struct e1000_adapter *adapter =  		container_of(work, struct e1000_adapter, reset_task); -	if (test_bit(__E1000_DOWN, &adapter->flags)) -		return;  	e_err(drv, "Reset adapter\n"); -	e1000_reinit_safe(adapter); +	e1000_reinit_locked(adapter);  }  /** @@ -4963,6 +4944,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)  	netif_device_detach(netdev);  	if (netif_running(netdev)) { +		int count = E1000_CHECK_RESET_COUNT; + +		while (test_bit(__E1000_RESETTING, &adapter->flags) && count--) +			usleep_range(10000, 20000); +  		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));  		e1000_down(adapter);  	} diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c index b0f3666b1d7f..c3143da497c8 100644 --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c @@ -2062,14 +2062,15 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)  {  	struct igb_adapter *adapter = netdev_priv(netdev); -	wol->supported = WAKE_UCAST | WAKE_MCAST | -			 WAKE_BCAST | WAKE_MAGIC | -			 WAKE_PHY;  	wol->wolopts = 0;  	if (!(adapter->flags & IGB_FLAG_WOL_SUPPORTED))  		return; +	wol->supported = WAKE_UCAST | WAKE_MCAST | +			 WAKE_BCAST | WAKE_MAGIC | +			 WAKE_PHY; +  	/* apply any specific unsupported masks here */  	switch (adapter->hw.device_id) {  	default: diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 0c55079ebee3..cc06854296a3 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -4251,8 +4251,8 @@ static void ixgbe_disable_fwd_ring(struct ixgbe_fwd_adapter *vadapter,  	rx_ring->l2_accel_priv = NULL;  } -int ixgbe_fwd_ring_down(struct net_device *vdev, -			struct ixgbe_fwd_adapter *accel) +static int ixgbe_fwd_ring_down(struct net_device *vdev, +			       struct ixgbe_fwd_adapter *accel)  {  	struct ixgbe_adapter *adapter = accel->real_adapter;  	unsigned int rxbase = accel->rx_base_queue; @@ -7986,10 +7986,9 @@ skip_sriov:  			   NETIF_F_TSO |  			   NETIF_F_TSO6 |  			   NETIF_F_RXHASH | -			   NETIF_F_RXCSUM | -			   NETIF_F_HW_L2FW_DOFFLOAD; +			   NETIF_F_RXCSUM; -	netdev->hw_features = netdev->features; +	netdev->hw_features = netdev->features | NETIF_F_HW_L2FW_DOFFLOAD;  	switch (adapter->hw.mac.type) {  	case ixgbe_mac_82599EB: diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index e4c676006be9..39217e5ff7dc 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c @@ -46,6 +46,7 @@ static bool ixgbe_get_i2c_data(u32 *i2cctl);  static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw);  static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id);  static s32 ixgbe_get_phy_id(struct ixgbe_hw *hw); +static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw);  /**   *  ixgbe_identify_phy_generic - Get physical layer module @@ -1164,7 +1165,7 @@ err_read_i2c_eeprom:   *   * Searches for and identifies the QSFP module and assigns appropriate PHY type   **/ -s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw) +static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)  {  	struct ixgbe_adapter *adapter = hw->back;  	s32 status = IXGBE_ERR_PHY_ADDR_INVALID; diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h index aae900a256da..fffcbdd2bf0e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h @@ -145,7 +145,6 @@ s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,  s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw);  s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw);  s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw); -s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw);  s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,                                          u16 *list_offset,                                          u16 *data_offset); diff --git a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c index 40626690e8a8..c11d063473e5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c @@ -140,7 +140,6 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf)  {  	struct mlx4_en_priv *priv = netdev_priv(dev);  	struct mlx4_en_dev *mdev = priv->mdev; -	struct mlx4_en_tx_ring *tx_ring;  	int i, carrier_ok;  	memset(buf, 0, sizeof(u64) * MLX4_EN_NUM_SELF_TEST); @@ -150,16 +149,10 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf)  		carrier_ok = netif_carrier_ok(dev);  		netif_carrier_off(dev); -retry_tx:  		/* Wait until all tx queues are empty.  		 * there should not be any additional incoming traffic  		 * since we turned the carrier off */  		msleep(200); -		for (i = 0; i < priv->tx_ring_num && carrier_ok; i++) { -			tx_ring = priv->tx_ring[i]; -			if (tx_ring->prod != (tx_ring->cons + tx_ring->last_nr_txbb)) -				goto retry_tx; -		}  		if (priv->mdev->dev->caps.flags &  					MLX4_DEV_CAP_FLAG_UC_LOOPBACK) { diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index f2a2128165dd..737c1a881f78 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c @@ -678,9 +678,6 @@ static void cp_tx (struct cp_private *cp)  				 le32_to_cpu(txd->opts1) & 0xffff,  				 PCI_DMA_TODEVICE); -		bytes_compl += skb->len; -		pkts_compl++; -  		if (status & LastFrag) {  			if (status & (TxError | TxFIFOUnder)) {  				netif_dbg(cp, tx_err, cp->dev, @@ -702,6 +699,8 @@ static void cp_tx (struct cp_private *cp)  				netif_dbg(cp, tx_done, cp->dev,  					  "tx done, slot %d\n", tx_tail);  			} +			bytes_compl += skb->len; +			pkts_compl++;  			dev_kfree_skb_irq(skb);  		} diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 799387570766..c737f0ea5de7 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -3465,6 +3465,11 @@ static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)  	rtl_writephy(tp, 0x14, 0x9065);  	rtl_writephy(tp, 0x14, 0x1065); +	/* Check ALDPS bit, disable it if enabled */ +	rtl_writephy(tp, 0x1f, 0x0a43); +	if (rtl_readphy(tp, 0x10) & 0x0004) +		rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0004); +  	rtl_writephy(tp, 0x1f, 0x0000);  } diff --git a/drivers/net/ethernet/sfc/mcdi.h b/drivers/net/ethernet/sfc/mcdi.h index 656a3277c2b2..15816cacb548 100644 --- a/drivers/net/ethernet/sfc/mcdi.h +++ b/drivers/net/ethernet/sfc/mcdi.h @@ -75,6 +75,8 @@ struct efx_mcdi_mon {  	unsigned long last_update;  	struct device *device;  	struct efx_mcdi_mon_attribute *attrs; +	struct attribute_group group; +	const struct attribute_group *groups[2];  	unsigned int n_attrs;  }; diff --git a/drivers/net/ethernet/sfc/mcdi_mon.c b/drivers/net/ethernet/sfc/mcdi_mon.c index 4cc5d95b2a5a..d72ad4fc3617 100644 --- a/drivers/net/ethernet/sfc/mcdi_mon.c +++ b/drivers/net/ethernet/sfc/mcdi_mon.c @@ -139,17 +139,10 @@ static int efx_mcdi_mon_update(struct efx_nic *efx)  	return rc;  } -static ssize_t efx_mcdi_mon_show_name(struct device *dev, -				      struct device_attribute *attr, -				      char *buf) -{ -	return sprintf(buf, "%s\n", KBUILD_MODNAME); -} -  static int efx_mcdi_mon_get_entry(struct device *dev, unsigned int index,  				  efx_dword_t *entry)  { -	struct efx_nic *efx = dev_get_drvdata(dev); +	struct efx_nic *efx = dev_get_drvdata(dev->parent);  	struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);  	int rc; @@ -263,7 +256,7 @@ static ssize_t efx_mcdi_mon_show_label(struct device *dev,  		       efx_mcdi_sensor_type[mon_attr->type].label);  } -static int +static void  efx_mcdi_mon_add_attr(struct efx_nic *efx, const char *name,  		      ssize_t (*reader)(struct device *,  					struct device_attribute *, char *), @@ -272,7 +265,6 @@ efx_mcdi_mon_add_attr(struct efx_nic *efx, const char *name,  {  	struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);  	struct efx_mcdi_mon_attribute *attr = &hwmon->attrs[hwmon->n_attrs]; -	int rc;  	strlcpy(attr->name, name, sizeof(attr->name));  	attr->index = index; @@ -286,10 +278,7 @@ efx_mcdi_mon_add_attr(struct efx_nic *efx, const char *name,  	attr->dev_attr.attr.name = attr->name;  	attr->dev_attr.attr.mode = S_IRUGO;  	attr->dev_attr.show = reader; -	rc = device_create_file(&efx->pci_dev->dev, &attr->dev_attr); -	if (rc == 0) -		++hwmon->n_attrs; -	return rc; +	hwmon->group.attrs[hwmon->n_attrs++] = &attr->dev_attr.attr;  }  int efx_mcdi_mon_probe(struct efx_nic *efx) @@ -338,26 +327,22 @@ int efx_mcdi_mon_probe(struct efx_nic *efx)  	efx_mcdi_mon_update(efx);  	/* Allocate space for the maximum possible number of -	 * attributes for this set of sensors: name of the driver plus +	 * attributes for this set of sensors:  	 * value, min, max, crit, alarm and label for each sensor.  	 */ -	n_attrs = 1 + 6 * n_sensors; +	n_attrs = 6 * n_sensors;  	hwmon->attrs = kcalloc(n_attrs, sizeof(*hwmon->attrs), GFP_KERNEL);  	if (!hwmon->attrs) {  		rc = -ENOMEM;  		goto fail;  	} - -	hwmon->device = hwmon_device_register(&efx->pci_dev->dev); -	if (IS_ERR(hwmon->device)) { -		rc = PTR_ERR(hwmon->device); +	hwmon->group.attrs = kcalloc(n_attrs + 1, sizeof(struct attribute *), +				     GFP_KERNEL); +	if (!hwmon->group.attrs) { +		rc = -ENOMEM;  		goto fail;  	} -	rc = efx_mcdi_mon_add_attr(efx, "name", efx_mcdi_mon_show_name, 0, 0, 0); -	if (rc) -		goto fail; -  	for (i = 0, j = -1, type = -1; ; i++) {  		enum efx_hwmon_type hwmon_type;  		const char *hwmon_prefix; @@ -372,7 +357,7 @@ int efx_mcdi_mon_probe(struct efx_nic *efx)  				page = type / 32;  				j = -1;  				if (page == n_pages) -					return 0; +					goto hwmon_register;  				MCDI_SET_DWORD(inbuf, SENSOR_INFO_EXT_IN_PAGE,  					       page); @@ -453,28 +438,22 @@ int efx_mcdi_mon_probe(struct efx_nic *efx)  		if (min1 != max1) {  			snprintf(name, sizeof(name), "%s%u_input",  				 hwmon_prefix, hwmon_index); -			rc = efx_mcdi_mon_add_attr( +			efx_mcdi_mon_add_attr(  				efx, name, efx_mcdi_mon_show_value, i, type, 0); -			if (rc) -				goto fail;  			if (hwmon_type != EFX_HWMON_POWER) {  				snprintf(name, sizeof(name), "%s%u_min",  					 hwmon_prefix, hwmon_index); -				rc = efx_mcdi_mon_add_attr( +				efx_mcdi_mon_add_attr(  					efx, name, efx_mcdi_mon_show_limit,  					i, type, min1); -				if (rc) -					goto fail;  			}  			snprintf(name, sizeof(name), "%s%u_max",  				 hwmon_prefix, hwmon_index); -			rc = efx_mcdi_mon_add_attr( +			efx_mcdi_mon_add_attr(  				efx, name, efx_mcdi_mon_show_limit,  				i, type, max1); -			if (rc) -				goto fail;  			if (min2 != max2) {  				/* Assume max2 is critical value. @@ -482,32 +461,38 @@ int efx_mcdi_mon_probe(struct efx_nic *efx)  				 */  				snprintf(name, sizeof(name), "%s%u_crit",  					 hwmon_prefix, hwmon_index); -				rc = efx_mcdi_mon_add_attr( +				efx_mcdi_mon_add_attr(  					efx, name, efx_mcdi_mon_show_limit,  					i, type, max2); -				if (rc) -					goto fail;  			}  		}  		snprintf(name, sizeof(name), "%s%u_alarm",  			 hwmon_prefix, hwmon_index); -		rc = efx_mcdi_mon_add_attr( +		efx_mcdi_mon_add_attr(  			efx, name, efx_mcdi_mon_show_alarm, i, type, 0); -		if (rc) -			goto fail;  		if (type < ARRAY_SIZE(efx_mcdi_sensor_type) &&  		    efx_mcdi_sensor_type[type].label) {  			snprintf(name, sizeof(name), "%s%u_label",  				 hwmon_prefix, hwmon_index); -			rc = efx_mcdi_mon_add_attr( +			efx_mcdi_mon_add_attr(  				efx, name, efx_mcdi_mon_show_label, i, type, 0); -			if (rc) -				goto fail;  		}  	} +hwmon_register: +	hwmon->groups[0] = &hwmon->group; +	hwmon->device = hwmon_device_register_with_groups(&efx->pci_dev->dev, +							  KBUILD_MODNAME, NULL, +							  hwmon->groups); +	if (IS_ERR(hwmon->device)) { +		rc = PTR_ERR(hwmon->device); +		goto fail; +	} + +	return 0; +  fail:  	efx_mcdi_mon_remove(efx);  	return rc; @@ -516,14 +501,11 @@ fail:  void efx_mcdi_mon_remove(struct efx_nic *efx)  {  	struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx); -	unsigned int i; -	for (i = 0; i < hwmon->n_attrs; i++) -		device_remove_file(&efx->pci_dev->dev, -				   &hwmon->attrs[i].dev_attr); -	kfree(hwmon->attrs);  	if (hwmon->device)  		hwmon_device_unregister(hwmon->device); +	kfree(hwmon->attrs); +	kfree(hwmon->group.attrs);  	efx_nic_free_buffer(efx, &hwmon->dma_buf);  } diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index c9d4c872e81d..749654b976bc 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -46,7 +46,8 @@      defined(CONFIG_MACH_LITTLETON) ||\      defined(CONFIG_MACH_ZYLONITE2) ||\      defined(CONFIG_ARCH_VIPER) ||\ -    defined(CONFIG_MACH_STARGATE2) +    defined(CONFIG_MACH_STARGATE2) ||\ +    defined(CONFIG_ARCH_VERSATILE)  #include <asm/mach-types.h> @@ -154,6 +155,8 @@ static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg)  #define SMC_outl(v, a, r)	writel(v, (a) + (r))  #define SMC_insl(a, r, p, l)	readsl((a) + (r), p, l)  #define SMC_outsl(a, r, p, l)	writesl((a) + (r), p, l) +#define SMC_insw(a, r, p, l)	readsw((a) + (r), p, l) +#define SMC_outsw(a, r, p, l)	writesw((a) + (r), p, l)  #define SMC_IRQ_FLAGS		(-1)	/* from resource */  /* We actually can't write halfwords properly if not word aligned */ @@ -206,23 +209,6 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)  #define RPC_LSA_DEFAULT		RPC_LED_TX_RX  #define RPC_LSB_DEFAULT		RPC_LED_100_10 -#elif	defined(CONFIG_ARCH_VERSATILE) - -#define SMC_CAN_USE_8BIT	1 -#define SMC_CAN_USE_16BIT	1 -#define SMC_CAN_USE_32BIT	1 -#define SMC_NOWAIT		1 - -#define SMC_inb(a, r)		readb((a) + (r)) -#define SMC_inw(a, r)		readw((a) + (r)) -#define SMC_inl(a, r)		readl((a) + (r)) -#define SMC_outb(v, a, r)	writeb(v, (a) + (r)) -#define SMC_outw(v, a, r)	writew(v, (a) + (r)) -#define SMC_outl(v, a, r)	writel(v, (a) + (r)) -#define SMC_insl(a, r, p, l)	readsl((a) + (r), p, l) -#define SMC_outsl(a, r, p, l)	writesl((a) + (r), p, l) -#define SMC_IRQ_FLAGS		(-1)	/* from resource */ -  #elif defined(CONFIG_MN10300)  /* diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c index d022bf936572..ad61d26a44f3 100644 --- a/drivers/net/ethernet/via/via-velocity.c +++ b/drivers/net/ethernet/via/via-velocity.c @@ -2172,16 +2172,13 @@ static int velocity_poll(struct napi_struct *napi, int budget)  	unsigned int rx_done;  	unsigned long flags; -	spin_lock_irqsave(&vptr->lock, flags);  	/*  	 * Do rx and tx twice for performance (taken from the VIA  	 * out-of-tree driver).  	 */ -	rx_done = velocity_rx_srv(vptr, budget / 2); -	velocity_tx_srv(vptr); -	rx_done += velocity_rx_srv(vptr, budget - rx_done); +	rx_done = velocity_rx_srv(vptr, budget); +	spin_lock_irqsave(&vptr->lock, flags);  	velocity_tx_srv(vptr); -  	/* If budget not fully consumed, exit the polling mode */  	if (rx_done < budget) {  		napi_complete(napi); @@ -2342,6 +2339,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)  		if (ret < 0)  			goto out_free_tmp_vptr_1; +		napi_disable(&vptr->napi); +  		spin_lock_irqsave(&vptr->lock, flags);  		netif_stop_queue(dev); @@ -2362,6 +2361,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)  		velocity_give_many_rx_descs(vptr); +		napi_enable(&vptr->napi); +  		mac_enable_int(vptr->mac_regs);  		netif_start_queue(dev); diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index dc76670c2f2a..9093004f9b63 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -744,7 +744,7 @@ err:  	rcu_read_lock();  	vlan = rcu_dereference(q->vlan);  	if (vlan) -		vlan->dev->stats.tx_dropped++; +		this_cpu_inc(vlan->pcpu_stats->tx_dropped);  	rcu_read_unlock();  	return err; @@ -767,7 +767,6 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,  				const struct sk_buff *skb,  				const struct iovec *iv, int len)  { -	struct macvlan_dev *vlan;  	int ret;  	int vnet_hdr_len = 0;  	int vlan_offset = 0; @@ -821,15 +820,6 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,  	copied += len;  done: -	rcu_read_lock(); -	vlan = rcu_dereference(q->vlan); -	if (vlan) { -		preempt_disable(); -		macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); -		preempt_enable(); -	} -	rcu_read_unlock(); -  	return ret ? ret : copied;  } diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c index 508e4359338b..14372c65a7e8 100644 --- a/drivers/net/phy/vitesse.c +++ b/drivers/net/phy/vitesse.c @@ -64,6 +64,7 @@  #define PHY_ID_VSC8234			0x000fc620  #define PHY_ID_VSC8244			0x000fc6c0 +#define PHY_ID_VSC8514			0x00070670  #define PHY_ID_VSC8574			0x000704a0  #define PHY_ID_VSC8662			0x00070660  #define PHY_ID_VSC8221			0x000fc550 @@ -131,6 +132,7 @@ static int vsc82xx_config_intr(struct phy_device *phydev)  		err = phy_write(phydev, MII_VSC8244_IMASK,  			(phydev->drv->phy_id == PHY_ID_VSC8234 ||  			 phydev->drv->phy_id == PHY_ID_VSC8244 || +			 phydev->drv->phy_id == PHY_ID_VSC8514 ||  			 phydev->drv->phy_id == PHY_ID_VSC8574) ?  				MII_VSC8244_IMASK_MASK :  				MII_VSC8221_IMASK_MASK); @@ -246,6 +248,18 @@ static struct phy_driver vsc82xx_driver[] = {  	.config_intr	= &vsc82xx_config_intr,  	.driver		= { .owner = THIS_MODULE,},  }, { +	.phy_id		= PHY_ID_VSC8514, +	.name		= "Vitesse VSC8514", +	.phy_id_mask	= 0x000ffff0, +	.features	= PHY_GBIT_FEATURES, +	.flags		= PHY_HAS_INTERRUPT, +	.config_init	= &vsc824x_config_init, +	.config_aneg	= &vsc82x4_config_aneg, +	.read_status	= &genphy_read_status, +	.ack_interrupt	= &vsc824x_ack_interrupt, +	.config_intr	= &vsc82xx_config_intr, +	.driver		= { .owner = THIS_MODULE,}, +}, {  	.phy_id         = PHY_ID_VSC8574,  	.name           = "Vitesse VSC8574",  	.phy_id_mask    = 0x000ffff0, @@ -315,6 +329,7 @@ module_exit(vsc82xx_exit);  static struct mdio_device_id __maybe_unused vitesse_tbl[] = {  	{ PHY_ID_VSC8234, 0x000ffff0 },  	{ PHY_ID_VSC8244, 0x000fffc0 }, +	{ PHY_ID_VSC8514, 0x000ffff0 },  	{ PHY_ID_VSC8574, 0x000ffff0 },  	{ PHY_ID_VSC8662, 0x000ffff0 },  	{ PHY_ID_VSC8221, 0x000ffff0 }, diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 34b0de09d881..736050d6b451 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -1366,6 +1366,8 @@ static int team_user_linkup_option_get(struct team *team,  	return 0;  } +static void __team_carrier_check(struct team *team); +  static int team_user_linkup_option_set(struct team *team,  				       struct team_gsetter_ctx *ctx)  { @@ -1373,6 +1375,7 @@ static int team_user_linkup_option_set(struct team *team,  	port->user.linkup = ctx->data.bool_val;  	team_refresh_port_linkup(port); +	__team_carrier_check(port->team);  	return 0;  } @@ -1392,6 +1395,7 @@ static int team_user_linkup_en_option_set(struct team *team,  	port->user.linkup_enabled = ctx->data.bool_val;  	team_refresh_port_linkup(port); +	__team_carrier_check(port->team);  	return 0;  } diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7bab4de658a9..916241d16c67 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -299,35 +299,76 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,  	return skb;  } -static int receive_mergeable(struct receive_queue *rq, struct sk_buff *head_skb) +static struct sk_buff *receive_small(void *buf, unsigned int len)  { -	struct skb_vnet_hdr *hdr = skb_vnet_hdr(head_skb); +	struct sk_buff * skb = buf; + +	len -= sizeof(struct virtio_net_hdr); +	skb_trim(skb, len); + +	return skb; +} + +static struct sk_buff *receive_big(struct net_device *dev, +				   struct receive_queue *rq, +				   void *buf, +				   unsigned int len) +{ +	struct page *page = buf; +	struct sk_buff *skb = page_to_skb(rq, page, 0, len, PAGE_SIZE); + +	if (unlikely(!skb)) +		goto err; + +	return skb; + +err: +	dev->stats.rx_dropped++; +	give_pages(rq, page); +	return NULL; +} + +static struct sk_buff *receive_mergeable(struct net_device *dev, +					 struct receive_queue *rq, +					 void *buf, +					 unsigned int len) +{ +	struct skb_vnet_hdr *hdr = buf; +	int num_buf = hdr->mhdr.num_buffers; +	struct page *page = virt_to_head_page(buf); +	int offset = buf - page_address(page); +	struct sk_buff *head_skb = page_to_skb(rq, page, offset, len, +					       MERGE_BUFFER_LEN);  	struct sk_buff *curr_skb = head_skb; -	char *buf; -	struct page *page; -	int num_buf, len, offset; -	num_buf = hdr->mhdr.num_buffers; +	if (unlikely(!curr_skb)) +		goto err_skb; +  	while (--num_buf) { -		int num_skb_frags = skb_shinfo(curr_skb)->nr_frags; +		int num_skb_frags; +  		buf = virtqueue_get_buf(rq->vq, &len);  		if (unlikely(!buf)) { -			pr_debug("%s: rx error: %d buffers missing\n", -				 head_skb->dev->name, hdr->mhdr.num_buffers); -			head_skb->dev->stats.rx_length_errors++; -			return -EINVAL; +			pr_debug("%s: rx error: %d buffers out of %d missing\n", +				 dev->name, num_buf, hdr->mhdr.num_buffers); +			dev->stats.rx_length_errors++; +			goto err_buf;  		}  		if (unlikely(len > MERGE_BUFFER_LEN)) {  			pr_debug("%s: rx error: merge buffer too long\n", -				 head_skb->dev->name); +				 dev->name);  			len = MERGE_BUFFER_LEN;  		} + +		page = virt_to_head_page(buf); +		--rq->num; + +		num_skb_frags = skb_shinfo(curr_skb)->nr_frags;  		if (unlikely(num_skb_frags == MAX_SKB_FRAGS)) {  			struct sk_buff *nskb = alloc_skb(0, GFP_ATOMIC); -			if (unlikely(!nskb)) { -				head_skb->dev->stats.rx_dropped++; -				return -ENOMEM; -			} + +			if (unlikely(!nskb)) +				goto err_skb;  			if (curr_skb == head_skb)  				skb_shinfo(curr_skb)->frag_list = nskb;  			else @@ -341,8 +382,7 @@ static int receive_mergeable(struct receive_queue *rq, struct sk_buff *head_skb)  			head_skb->len += len;  			head_skb->truesize += MERGE_BUFFER_LEN;  		} -		page = virt_to_head_page(buf); -		offset = buf - (char *)page_address(page); +		offset = buf - page_address(page);  		if (skb_can_coalesce(curr_skb, num_skb_frags, page, offset)) {  			put_page(page);  			skb_coalesce_rx_frag(curr_skb, num_skb_frags - 1, @@ -351,9 +391,28 @@ static int receive_mergeable(struct receive_queue *rq, struct sk_buff *head_skb)  			skb_add_rx_frag(curr_skb, num_skb_frags, page,  					offset, len, MERGE_BUFFER_LEN);  		} +	} + +	return head_skb; + +err_skb: +	put_page(page); +	while (--num_buf) { +		buf = virtqueue_get_buf(rq->vq, &len); +		if (unlikely(!buf)) { +			pr_debug("%s: rx error: %d buffers missing\n", +				 dev->name, num_buf); +			dev->stats.rx_length_errors++; +			break; +		} +		page = virt_to_head_page(buf); +		put_page(page);  		--rq->num;  	} -	return 0; +err_buf: +	dev->stats.rx_dropped++; +	dev_kfree_skb(head_skb); +	return NULL;  }  static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len) @@ -362,7 +421,6 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)  	struct net_device *dev = vi->dev;  	struct virtnet_stats *stats = this_cpu_ptr(vi->stats);  	struct sk_buff *skb; -	struct page *page;  	struct skb_vnet_hdr *hdr;  	if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) { @@ -377,33 +435,15 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)  		return;  	} -	if (!vi->mergeable_rx_bufs && !vi->big_packets) { -		skb = buf; -		len -= sizeof(struct virtio_net_hdr); -		skb_trim(skb, len); -	} else if (vi->mergeable_rx_bufs) { -		struct page *page = virt_to_head_page(buf); -		skb = page_to_skb(rq, page, -				  (char *)buf - (char *)page_address(page), -				  len, MERGE_BUFFER_LEN); -		if (unlikely(!skb)) { -			dev->stats.rx_dropped++; -			put_page(page); -			return; -		} -		if (receive_mergeable(rq, skb)) { -			dev_kfree_skb(skb); -			return; -		} -	} else { -		page = buf; -		skb = page_to_skb(rq, page, 0, len, PAGE_SIZE); -		if (unlikely(!skb)) { -			dev->stats.rx_dropped++; -			give_pages(rq, page); -			return; -		} -	} +	if (vi->mergeable_rx_bufs) +		skb = receive_mergeable(dev, rq, buf, len); +	else if (vi->big_packets) +		skb = receive_big(dev, rq, buf, len); +	else +		skb = receive_small(buf, len); + +	if (unlikely(!skb)) +		return;  	hdr = skb_vnet_hdr(skb); @@ -1084,7 +1124,7 @@ static void virtnet_set_rx_mode(struct net_device *dev)  	if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,  				  VIRTIO_NET_CTRL_MAC_TABLE_SET,  				  sg, NULL)) -		dev_warn(&dev->dev, "Failed to set MAC fitler table.\n"); +		dev_warn(&dev->dev, "Failed to set MAC filter table.\n");  	kfree(buf);  } diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 919b6509455c..64f0e0d18b81 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -39,6 +39,7 @@  #include <linux/udp.h>  #include <net/tcp.h> +#include <net/ip6_checksum.h>  #include <xen/xen.h>  #include <xen/events.h> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index b3b1b9aa8863..3a02717473ad 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -9,10 +9,6 @@   *   *  Init/reset quirks for USB host controllers should be in the   *  USB quirks file, where their drivers can access reuse it. - * - *  The bridge optimization stuff has been removed. If you really - *  have a silly BIOS which is unable to set your host bridge right, - *  use the PowerTweak utility (see http://powertweak.sourceforge.net).   */  #include <linux/types.h> diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index cee7e2708a1f..95e45782692f 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c @@ -3224,6 +3224,8 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,  	fcx_multitrack = private->features.feature[40] & 0x20;  	data_size = blk_rq_bytes(req); +	if (data_size % blksize) +		return ERR_PTR(-EINVAL);  	/* tpm write request add CBC data on each track boundary */  	if (rq_data_dir(req) == WRITE)  		data_size += (last_trk - first_trk) * 4; diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index bd6f743d87a7..892ea6161376 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c @@ -1404,11 +1404,22 @@ enum {  };  #define PMCRAID_AEN_CMD_MAX (__PMCRAID_AEN_CMD_MAX - 1) +static struct genl_multicast_group pmcraid_mcgrps[] = { +	{ .name = "events", /* not really used - see ID discussion below */ }, +}; +  static struct genl_family pmcraid_event_family = { -	.id = GENL_ID_GENERATE, +	/* +	 * Due to prior multicast group abuse (the code having assumed that +	 * the family ID can be used as a multicast group ID) we need to +	 * statically allocate a family (and thus group) ID. +	 */ +	.id = GENL_ID_PMCRAID,  	.name = "pmcraid",  	.version = 1, -	.maxattr = PMCRAID_AEN_ATTR_MAX +	.maxattr = PMCRAID_AEN_ATTR_MAX, +	.mcgrps = pmcraid_mcgrps, +	.n_mcgrps = ARRAY_SIZE(pmcraid_mcgrps),  };  /** @@ -1511,9 +1522,8 @@ static int pmcraid_notify_aen(  		return result;  	} -	result = -		genlmsg_multicast(&pmcraid_event_family, skb, 0, -				  pmcraid_event_family.id, GFP_ATOMIC); +	result = genlmsg_multicast(&pmcraid_event_family, skb, +				   0, 0, GFP_ATOMIC);  	/* If there are no listeners, genlmsg_multicast may return non-zero  	 * value. diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c index 3ed666fe840a..9025edd7dc45 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -377,7 +377,7 @@ out_master_put:  static int bcm2835_spi_remove(struct platform_device *pdev)  { -	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); +	struct spi_master *master = platform_get_drvdata(pdev);  	struct bcm2835_spi *bs = spi_master_get_devdata(master);  	free_irq(bs->irq, master); diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index 80d56b214eb5..469ecd876358 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c @@ -435,7 +435,7 @@ out:  static int bcm63xx_spi_remove(struct platform_device *pdev)  { -	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); +	struct spi_master *master = platform_get_drvdata(pdev);  	struct bcm63xx_spi *bs = spi_master_get_devdata(master);  	/* reset spi block */ diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c index 9602bbd8d7ea..87676587d783 100644 --- a/drivers/spi/spi-mpc512x-psc.c +++ b/drivers/spi/spi-mpc512x-psc.c @@ -557,7 +557,7 @@ free_master:  static int mpc512x_psc_spi_do_remove(struct device *dev)  { -	struct spi_master *master = spi_master_get(dev_get_drvdata(dev)); +	struct spi_master *master = dev_get_drvdata(dev);  	struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);  	clk_disable_unprepare(mps->clk_mclk); diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c index 73afb56c08cc..3adebfa22e3d 100644 --- a/drivers/spi/spi-mxs.c +++ b/drivers/spi/spi-mxs.c @@ -565,7 +565,7 @@ static int mxs_spi_remove(struct platform_device *pdev)  	struct mxs_spi *spi;  	struct mxs_ssp *ssp; -	master = spi_master_get(platform_get_drvdata(pdev)); +	master = platform_get_drvdata(pdev);  	spi = spi_master_get_devdata(master);  	ssp = &spi->ssp; diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index cb0e1f1137ad..7765b1999537 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -1073,6 +1073,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev)  static struct acpi_device_id pxa2xx_spi_acpi_match[] = {  	{ "INT33C0", 0 },  	{ "INT33C1", 0 }, +	{ "INT3430", 0 }, +	{ "INT3431", 0 },  	{ "80860F0E", 0 },  	{ },  }; @@ -1291,6 +1293,9 @@ static int pxa2xx_spi_resume(struct device *dev)  	/* Enable the SSP clock */  	clk_prepare_enable(ssp->clk); +	/* Restore LPSS private register bits */ +	lpss_ssp_setup(drv_data); +  	/* Start the queue running */  	status = spi_master_resume(drv_data->master);  	if (status != 0) { diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 58449ad4ad0d..9e829cee7357 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c @@ -885,14 +885,13 @@ static void rspi_release_dma(struct rspi_data *rspi)  static int rspi_remove(struct platform_device *pdev)  { -	struct rspi_data *rspi = spi_master_get(platform_get_drvdata(pdev)); +	struct rspi_data *rspi = platform_get_drvdata(pdev);  	spi_unregister_master(rspi->master);  	rspi_release_dma(rspi);  	free_irq(platform_get_irq(pdev, 0), rspi);  	clk_put(rspi->clk);  	iounmap(rspi->addr); -	spi_master_put(rspi->master);  	return 0;  } diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c index 0b71270fbf67..4396bd448540 100644 --- a/drivers/spi/spi-ti-qspi.c +++ b/drivers/spi/spi-ti-qspi.c @@ -161,7 +161,7 @@ static int ti_qspi_setup(struct spi_device *spi)  			qspi->spi_max_frequency, clk_div);  	ret = pm_runtime_get_sync(qspi->dev); -	if (ret) { +	if (ret < 0) {  		dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");  		return ret;  	} @@ -459,11 +459,10 @@ static int ti_qspi_probe(struct platform_device *pdev)  	if (!of_property_read_u32(np, "num-cs", &num_cs))  		master->num_chipselect = num_cs; -	platform_set_drvdata(pdev, master); -  	qspi = spi_master_get_devdata(master);  	qspi->master = master;  	qspi->dev = &pdev->dev; +	platform_set_drvdata(pdev, qspi);  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -517,10 +516,26 @@ free_master:  static int ti_qspi_remove(struct platform_device *pdev)  { -	struct	ti_qspi *qspi = platform_get_drvdata(pdev); +	struct spi_master *master; +	struct ti_qspi *qspi; +	int ret; + +	master = platform_get_drvdata(pdev); +	qspi = spi_master_get_devdata(master); + +	ret = pm_runtime_get_sync(qspi->dev); +	if (ret < 0) { +		dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); +		return ret; +	}  	ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); +	pm_runtime_put(qspi->dev); +	pm_runtime_disable(&pdev->dev); + +	spi_unregister_master(master); +  	return 0;  } diff --git a/drivers/spi/spi-txx9.c b/drivers/spi/spi-txx9.c index 637cce2b8bdd..18c9bb2b5f39 100644 --- a/drivers/spi/spi-txx9.c +++ b/drivers/spi/spi-txx9.c @@ -425,7 +425,7 @@ exit:  static int txx9spi_remove(struct platform_device *dev)  { -	struct spi_master *master = spi_master_get(platform_get_drvdata(dev)); +	struct spi_master *master = platform_get_drvdata(dev);  	struct txx9spi *c = spi_master_get_devdata(master);  	destroy_workqueue(c->workqueue); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 18cc625d887f..349ebba4b199 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1415,7 +1415,7 @@ int devm_spi_register_master(struct device *dev, struct spi_master *master)  		return -ENOMEM;  	ret = spi_register_master(master); -	if (ret != 0) { +	if (!ret) {  		*ptr = master;  		devres_add(dev, ptr);  	} else { diff --git a/drivers/staging/btmtk_usb/btmtk_usb.c b/drivers/staging/btmtk_usb/btmtk_usb.c index 7a9bf3b57810..9a5ebd6cc512 100644 --- a/drivers/staging/btmtk_usb/btmtk_usb.c +++ b/drivers/staging/btmtk_usb/btmtk_usb.c @@ -1284,9 +1284,8 @@ done:  	kfree_skb(skb);  } -static int btmtk_usb_send_frame(struct sk_buff *skb) +static int btmtk_usb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)  { -	struct hci_dev *hdev = (struct hci_dev *)skb->dev;  	struct btmtk_usb_data *data = hci_get_drvdata(hdev);  	struct usb_ctrlrequest *dr;  	struct urb *urb; diff --git a/drivers/staging/comedi/drivers/pcl730.c b/drivers/staging/comedi/drivers/pcl730.c index d041b714db29..2baaf1db6fbf 100644 --- a/drivers/staging/comedi/drivers/pcl730.c +++ b/drivers/staging/comedi/drivers/pcl730.c @@ -173,11 +173,11 @@ static int pcl730_do_insn_bits(struct comedi_device *dev,  	if (mask) {  		if (mask & 0x00ff)  			outb(s->state & 0xff, dev->iobase + reg); -		if ((mask & 0xff00) & (s->n_chan > 8)) +		if ((mask & 0xff00) && (s->n_chan > 8))  			outb((s->state >> 8) & 0xff, dev->iobase + reg + 1); -		if ((mask & 0xff0000) & (s->n_chan > 16)) +		if ((mask & 0xff0000) && (s->n_chan > 16))  			outb((s->state >> 16) & 0xff, dev->iobase + reg + 2); -		if ((mask & 0xff000000) & (s->n_chan > 24)) +		if ((mask & 0xff000000) && (s->n_chan > 24))  			outb((s->state >> 24) & 0xff, dev->iobase + reg + 3);  	} diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c index 6815cfe2664e..b486099b543d 100644 --- a/drivers/staging/comedi/drivers/s626.c +++ b/drivers/staging/comedi/drivers/s626.c @@ -494,7 +494,7 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val)   * Private helper function: Write setpoint to an application DAC channel.   */  static void s626_set_dac(struct comedi_device *dev, uint16_t chan, -			 unsigned short dacdata) +			 int16_t dacdata)  {  	struct s626_private *devpriv = dev->private;  	uint16_t signmask; diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c index 933b01a0f03d..0adf3cffddb0 100644 --- a/drivers/staging/comedi/drivers/vmk80xx.c +++ b/drivers/staging/comedi/drivers/vmk80xx.c @@ -465,7 +465,7 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev,  	unsigned char *rx_buf = devpriv->usb_rx_buf;  	unsigned char *tx_buf = devpriv->usb_tx_buf;  	int reg, cmd; -	int ret; +	int ret = 0;  	if (devpriv->model == VMK8061_MODEL) {  		reg = VMK8061_DO_REG; diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_download.c b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c index 68ded17c0f5c..12f333fa59b5 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_download.c +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c @@ -578,7 +578,7 @@ static int request_code_segment(struct ft1000_usb *ft1000dev, u16 **s_file,  		 u8 **c_file, const u8 *endpoint, bool boot_case)  {  	long word_length; -	int status; +	int status = 0;  	/*DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");i*/  	word_length = get_request_value(ft1000dev); @@ -1074,4 +1074,3 @@ int scram_dnldr(struct ft1000_usb *ft1000dev, void *pFileStart,  	return status;  } - diff --git a/drivers/staging/iio/magnetometer/Kconfig b/drivers/staging/iio/magnetometer/Kconfig index a3ea69e9d800..34634da1f9f7 100644 --- a/drivers/staging/iio/magnetometer/Kconfig +++ b/drivers/staging/iio/magnetometer/Kconfig @@ -6,6 +6,8 @@ menu "Magnetometer sensors"  config SENSORS_HMC5843  	tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer"  	depends on I2C +	select IIO_BUFFER +	select IIO_TRIGGERED_BUFFER  	help  	  Say Y here to add support for the Honeywell HMC5843, HMC5883 and  	  HMC5883L 3-Axis Magnetometer (digital compass). diff --git a/drivers/staging/imx-drm/Makefile b/drivers/staging/imx-drm/Makefile index 2c3a9e178fb5..8742432d7b01 100644 --- a/drivers/staging/imx-drm/Makefile +++ b/drivers/staging/imx-drm/Makefile @@ -8,4 +8,6 @@ obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o  obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o  obj-$(CONFIG_DRM_IMX_FB_HELPER) += imx-fbdev.o  obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += ipu-v3/ -obj-$(CONFIG_DRM_IMX_IPUV3)	+= ipuv3-crtc.o ipuv3-plane.o + +imx-ipuv3-crtc-objs  := ipuv3-crtc.o ipuv3-plane.o +obj-$(CONFIG_DRM_IMX_IPUV3)	+= imx-ipuv3-crtc.o diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 51aa9772f959..6bd015ac9d68 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c @@ -72,6 +72,7 @@ int imx_drm_crtc_id(struct imx_drm_crtc *crtc)  {  	return crtc->pipe;  } +EXPORT_SYMBOL_GPL(imx_drm_crtc_id);  static void imx_drm_driver_lastclose(struct drm_device *drm)  { diff --git a/drivers/staging/lustre/lustre/ptlrpc/pinger.c b/drivers/staging/lustre/lustre/ptlrpc/pinger.c index 5dec771d70ee..4d340f4a2198 100644 --- a/drivers/staging/lustre/lustre/ptlrpc/pinger.c +++ b/drivers/staging/lustre/lustre/ptlrpc/pinger.c @@ -409,8 +409,8 @@ int ptlrpc_stop_pinger(void)  	struct l_wait_info lwi = { 0 };  	int rc = 0; -	if (!thread_is_init(&pinger_thread) && -	    !thread_is_stopped(&pinger_thread)) +	if (thread_is_init(&pinger_thread) || +	    thread_is_stopped(&pinger_thread))  		return -EALREADY;  	ptlrpc_pinger_remove_timeouts(); diff --git a/drivers/staging/media/go7007/go7007-usb.c b/drivers/staging/media/go7007/go7007-usb.c index 58684da45e6c..b658c2316df3 100644 --- a/drivers/staging/media/go7007/go7007-usb.c +++ b/drivers/staging/media/go7007/go7007-usb.c @@ -15,6 +15,8 @@   * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -661,7 +663,7 @@ static int go7007_usb_interface_reset(struct go7007 *go)  	if (usb->board->flags & GO7007_USB_EZUSB) {  		/* Reset buffer in EZ-USB */ -		dev_dbg(go->dev, "resetting EZ-USB buffers\n"); +		pr_debug("resetting EZ-USB buffers\n");  		if (go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0 ||  		    go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0)  			return -1; @@ -689,7 +691,7 @@ static int go7007_usb_ezusb_write_interrupt(struct go7007 *go,  	u16 status_reg = 0;  	int timeout = 500; -	dev_dbg(go->dev, "WriteInterrupt: %04x %04x\n", addr, data); +	pr_debug("WriteInterrupt: %04x %04x\n", addr, data);  	for (i = 0; i < 100; ++i) {  		r = usb_control_msg(usb->usbdev, @@ -734,7 +736,7 @@ static int go7007_usb_onboard_write_interrupt(struct go7007 *go,  	int r;  	int timeout = 500; -	dev_dbg(go->dev, "WriteInterrupt: %04x %04x\n", addr, data); +	pr_debug("WriteInterrupt: %04x %04x\n", addr, data);  	go->usb_buf[0] = data & 0xff;  	go->usb_buf[1] = data >> 8; @@ -771,7 +773,7 @@ static void go7007_usb_readinterrupt_complete(struct urb *urb)  		go->interrupt_available = 1;  		go->interrupt_data = __le16_to_cpu(regs[0]);  		go->interrupt_value = __le16_to_cpu(regs[1]); -		dev_dbg(go->dev, "ReadInterrupt: %04x %04x\n", +		pr_debug("ReadInterrupt: %04x %04x\n",  				go->interrupt_value, go->interrupt_data);  	} @@ -891,7 +893,7 @@ static int go7007_usb_send_firmware(struct go7007 *go, u8 *data, int len)  	int transferred, pipe;  	int timeout = 500; -	dev_dbg(go->dev, "DownloadBuffer sending %d bytes\n", len); +	pr_debug("DownloadBuffer sending %d bytes\n", len);  	if (usb->board->flags & GO7007_USB_EZUSB)  		pipe = usb_sndbulkpipe(usb->usbdev, 2); @@ -977,7 +979,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,  				!(msgs[i].flags & I2C_M_RD) &&  				(msgs[i + 1].flags & I2C_M_RD)) {  #ifdef GO7007_I2C_DEBUG -			dev_dbg(go->dev, "i2c write/read %d/%d bytes on %02x\n", +			pr_debug("i2c write/read %d/%d bytes on %02x\n",  				msgs[i].len, msgs[i + 1].len, msgs[i].addr);  #endif  			buf[0] = 0x01; @@ -988,7 +990,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,  			buf[buf_len++] = msgs[++i].len;  		} else if (msgs[i].flags & I2C_M_RD) {  #ifdef GO7007_I2C_DEBUG -			dev_dbg(go->dev, "i2c read %d bytes on %02x\n", +			pr_debug("i2c read %d bytes on %02x\n",  					msgs[i].len, msgs[i].addr);  #endif  			buf[0] = 0x01; @@ -998,7 +1000,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,  			buf_len = 4;  		} else {  #ifdef GO7007_I2C_DEBUG -			dev_dbg(go->dev, "i2c write %d bytes on %02x\n", +			pr_debug("i2c write %d bytes on %02x\n",  					msgs[i].len, msgs[i].addr);  #endif  			buf[0] = 0x00; @@ -1057,7 +1059,7 @@ static int go7007_usb_probe(struct usb_interface *intf,  	char *name;  	int video_pipe, i, v_urb_len; -	dev_dbg(go->dev, "probing new GO7007 USB board\n"); +	pr_debug("probing new GO7007 USB board\n");  	switch (id->driver_info) {  	case GO7007_BOARDID_MATRIX_II: @@ -1097,13 +1099,13 @@ static int go7007_usb_probe(struct usb_interface *intf,  		board = &board_px_tv402u;  		break;  	case GO7007_BOARDID_LIFEVIEW_LR192: -		dev_err(go->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n"); +		dev_err(&intf->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n");  		return -ENODEV;  		name = "Lifeview TV Walker Ultra";  		board = &board_lifeview_lr192;  		break;  	case GO7007_BOARDID_SENSORAY_2250: -		dev_info(go->dev, "Sensoray 2250 found\n"); +		dev_info(&intf->dev, "Sensoray 2250 found\n");  		name = "Sensoray 2250/2251";  		board = &board_sensoray_2250;  		break; @@ -1112,7 +1114,7 @@ static int go7007_usb_probe(struct usb_interface *intf,  		board = &board_ads_usbav_709;  		break;  	default: -		dev_err(go->dev, "unknown board ID %d!\n", +		dev_err(&intf->dev, "unknown board ID %d!\n",  				(unsigned int)id->driver_info);  		return -ENODEV;  	} @@ -1247,7 +1249,7 @@ static int go7007_usb_probe(struct usb_interface *intf,  					sizeof(go->name));  			break;  		default: -			dev_dbg(go->dev, "unable to detect tuner type!\n"); +			pr_debug("unable to detect tuner type!\n");  			break;  		}  		/* Configure tuner mode selection inputs connected diff --git a/drivers/staging/nvec/nvec.c b/drivers/staging/nvec/nvec.c index 3066ee2e753b..49ea76b3435d 100644 --- a/drivers/staging/nvec/nvec.c +++ b/drivers/staging/nvec/nvec.c @@ -681,7 +681,8 @@ static irqreturn_t nvec_interrupt(int irq, void *dev)  			dev_err(nvec->dev,  				"RX buffer overflow on %p: "  				"Trying to write byte %u of %u\n", -				nvec->rx, nvec->rx->pos, NVEC_MSG_SIZE); +				nvec->rx, nvec->rx ? nvec->rx->pos : 0, +				NVEC_MSG_SIZE);  		break;  	default:  		nvec->state = 0; diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c index 2c678f409573..2f548ebada59 100644 --- a/drivers/staging/rtl8188eu/core/rtw_ap.c +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c @@ -1115,6 +1115,9 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf,  int len)  			return _FAIL;  	} +	/* fix bug of flush_cam_entry at STOP AP mode */ +	psta->state |= WIFI_AP_STATE; +	rtw_indicate_connect(padapter);  	pmlmepriv->cur_network.join_res = true;/* for check if already set beacon */  	return ret;  } diff --git a/drivers/staging/tidspbridge/Kconfig b/drivers/staging/tidspbridge/Kconfig index 165b918b8171..1b6d581c438b 100644 --- a/drivers/staging/tidspbridge/Kconfig +++ b/drivers/staging/tidspbridge/Kconfig @@ -4,7 +4,7 @@  menuconfig TIDSPBRIDGE  	tristate "DSP Bridge driver" -	depends on ARCH_OMAP3 && !ARCH_MULTIPLATFORM +	depends on ARCH_OMAP3 && !ARCH_MULTIPLATFORM && BROKEN  	select MAILBOX  	select OMAP2PLUS_MBOX  	help diff --git a/drivers/staging/vt6655/hostap.c b/drivers/staging/vt6655/hostap.c index aab0012bba92..ab8b2ba6eedd 100644 --- a/drivers/staging/vt6655/hostap.c +++ b/drivers/staging/vt6655/hostap.c @@ -143,7 +143,8 @@ static int hostap_disable_hostapd(PSDevice pDevice, int rtnl_locked)  		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",  			pDevice->dev->name, pDevice->apdev->name);  	} -	free_netdev(pDevice->apdev); +	if (pDevice->apdev) +		free_netdev(pDevice->apdev);  	pDevice->apdev = NULL;  	pDevice->bEnable8021x = false;  	pDevice->bEnableHostWEP = false; diff --git a/drivers/staging/vt6656/baseband.c b/drivers/staging/vt6656/baseband.c index 1e8b8412e67e..4aa5ef54b683 100644 --- a/drivers/staging/vt6656/baseband.c +++ b/drivers/staging/vt6656/baseband.c @@ -939,6 +939,7 @@ int BBbVT3184Init(struct vnt_private *pDevice)      u8 *                   pbyAgc;      u16                    wLengthAgc;      u8                    abyArray[256]; +	u8 data;      ntStatus = CONTROLnsRequestIn(pDevice,                                    MESSAGE_TYPE_READ, @@ -1104,6 +1105,16 @@ else {      ControlvWriteByte(pDevice,MESSAGE_REQUEST_BBREG,0x0D,0x01);      RFbRFTableDownload(pDevice); + +	/* Fix for TX USB resets from vendors driver */ +	CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_READ, USB_REG4, +		MESSAGE_REQUEST_MEM, sizeof(data), &data); + +	data |= 0x2; + +	CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, USB_REG4, +		MESSAGE_REQUEST_MEM, sizeof(data), &data); +      return true;//ntStatus;  } diff --git a/drivers/staging/vt6656/hostap.c b/drivers/staging/vt6656/hostap.c index ae1676d190c5..67ba48b9a8d9 100644 --- a/drivers/staging/vt6656/hostap.c +++ b/drivers/staging/vt6656/hostap.c @@ -133,7 +133,8 @@ static int hostap_disable_hostapd(struct vnt_private *pDevice, int rtnl_locked)              DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",  		       pDevice->dev->name, pDevice->apdev->name);  	} -	free_netdev(pDevice->apdev); +	if (pDevice->apdev) +		free_netdev(pDevice->apdev);  	pDevice->apdev = NULL;      pDevice->bEnable8021x = false;      pDevice->bEnableHostWEP = false; diff --git a/drivers/staging/vt6656/rndis.h b/drivers/staging/vt6656/rndis.h index 5e073062017a..5cf5e732a36f 100644 --- a/drivers/staging/vt6656/rndis.h +++ b/drivers/staging/vt6656/rndis.h @@ -66,6 +66,8 @@  #define VIAUSB20_PACKET_HEADER          0x04 +#define USB_REG4	0x604 +  typedef struct _CMD_MESSAGE  {      u8        byData[256]; diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 79ce363b2ea9..3277d9838f4e 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c @@ -652,21 +652,30 @@ static ssize_t reset_store(struct device *dev,  		return -ENOMEM;  	/* Do not reset an active device! */ -	if (bdev->bd_holders) -		return -EBUSY; +	if (bdev->bd_holders) { +		ret = -EBUSY; +		goto out; +	}  	ret = kstrtou16(buf, 10, &do_reset);  	if (ret) -		return ret; +		goto out; -	if (!do_reset) -		return -EINVAL; +	if (!do_reset) { +		ret = -EINVAL; +		goto out; +	}  	/* Make sure all pending I/O is finished */  	fsync_bdev(bdev); +	bdput(bdev);  	zram_reset_device(zram, true);  	return len; + +out: +	bdput(bdev); +	return ret;  }  static void __zram_make_request(struct zram *zram, struct bio *bio, int rw) diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c index 1a67537dbc56..3b950e5a918f 100644 --- a/drivers/staging/zsmalloc/zsmalloc-main.c +++ b/drivers/staging/zsmalloc/zsmalloc-main.c @@ -430,7 +430,12 @@ static struct page *get_next_page(struct page *page)  	return next;  } -/* Encode <page, obj_idx> as a single handle value */ +/* + * Encode <page, obj_idx> as a single handle value. + * On hardware platforms with physical memory starting at 0x0 the pfn + * could be 0 so we ensure that the handle will never be 0 by adjusting the + * encoded obj_idx value before encoding. + */  static void *obj_location_to_handle(struct page *page, unsigned long obj_idx)  {  	unsigned long handle; @@ -441,17 +446,21 @@ static void *obj_location_to_handle(struct page *page, unsigned long obj_idx)  	}  	handle = page_to_pfn(page) << OBJ_INDEX_BITS; -	handle |= (obj_idx & OBJ_INDEX_MASK); +	handle |= ((obj_idx + 1) & OBJ_INDEX_MASK);  	return (void *)handle;  } -/* Decode <page, obj_idx> pair from the given object handle */ +/* + * Decode <page, obj_idx> pair from the given object handle. We adjust the + * decoded obj_idx back to its original value since it was adjusted in + * obj_location_to_handle(). + */  static void obj_handle_to_location(unsigned long handle, struct page **page,  				unsigned long *obj_idx)  {  	*page = pfn_to_page(handle >> OBJ_INDEX_BITS); -	*obj_idx = handle & OBJ_INDEX_MASK; +	*obj_idx = (handle & OBJ_INDEX_MASK) - 1;  }  static unsigned long obj_idx_to_offset(struct page *page, diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c index 2b86f8e0fb58..71630a2af42c 100644 --- a/drivers/tty/amiserial.c +++ b/drivers/tty/amiserial.c @@ -1855,6 +1855,9 @@ static struct console sercons = {   */  static int __init amiserial_console_init(void)  { +	if (!MACH_IS_AMIGA) +		return -ENODEV; +  	register_console(&sercons);  	return 0;  } diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 7cdd1eb9406c..0f74945af624 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -768,7 +768,7 @@ static size_t __process_echoes(struct tty_struct *tty)  	 * data at the tail to prevent a subsequent overrun */  	while (ldata->echo_commit - tail >= ECHO_DISCARD_WATERMARK) {  		if (echo_buf(ldata, tail) == ECHO_OP_START) { -			if (echo_buf(ldata, tail) == ECHO_OP_ERASE_TAB) +			if (echo_buf(ldata, tail + 1) == ECHO_OP_ERASE_TAB)  				tail += 3;  			else  				tail += 2; @@ -1998,7 +1998,10 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,  		found = 1;  	size = N_TTY_BUF_SIZE - tail; -	n = (found + eol + size) & (N_TTY_BUF_SIZE - 1); +	n = eol - tail; +	if (n > 4096) +		n += 4096; +	n += found;  	c = n;  	if (found && read_buf(ldata, eol) == __DISABLED_CHAR) { @@ -2243,18 +2246,19 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,  		if (time)  			timeout = time;  	} -	mutex_unlock(&ldata->atomic_read_lock); -	remove_wait_queue(&tty->read_wait, &wait); +	n_tty_set_room(tty); +	up_read(&tty->termios_rwsem); +	remove_wait_queue(&tty->read_wait, &wait);  	if (!waitqueue_active(&tty->read_wait))  		ldata->minimum_to_wake = minimum; +	mutex_unlock(&ldata->atomic_read_lock); +  	__set_current_state(TASK_RUNNING);  	if (b - buf)  		retval = b - buf; -	n_tty_set_room(tty); -	up_read(&tty->termios_rwsem);  	return retval;  } diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig index f3b306efaa59..23329918f229 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig @@ -41,7 +41,7 @@ config SERIAL_8250_DEPRECATED_OPTIONS  	  accept kernel parameters in both forms like 8250_core.nr_uarts=4 and  	  8250.nr_uarts=4. We now renamed the module back to 8250, but if  	  anybody noticed in 3.7 and changed their userspace we still have to -	  keep the 8350_core.* options around until they revert the changes +	  keep the 8250_core.* options around until they revert the changes  	  they already did.  	  If 8250 is built as a module, this adds 8250_core alias instead.  diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c index 481b781b26e3..e9d420ff3931 100644 --- a/drivers/tty/serial/pmac_zilog.c +++ b/drivers/tty/serial/pmac_zilog.c @@ -2052,6 +2052,9 @@ static int __init pmz_console_init(void)  	/* Probe ports */  	pmz_probe(); +	if (pmz_ports_count == 0) +		return -ENODEV; +  	/* TODO: Autoprobe console based on OF */  	/* pmz_console.index = i; */  	register_console(&pmz_console); diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 3a1a01af9a80..c74a00ad7add 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -2086,6 +2086,7 @@ retry_open:  			filp->f_op = &tty_fops;  		goto retry_open;  	} +	clear_bit(TTY_HUPPED, &tty->flags);  	tty_unlock(tty); diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 67beb8444930..f7beb6eb40c7 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -653,6 +653,8 @@ static int uio_mmap_physical(struct vm_area_struct *vma)  		return -EINVAL;  	mem = idev->info->mem + mi; +	if (mem->addr & ~PAGE_MASK) +		return -ENODEV;  	if (vma->vm_end - vma->vm_start > mem->size)  		return -EINVAL; diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 62ccf5424ba8..028387192b60 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -930,9 +930,10 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,  		ret = m2p_add_override(mfn, pages[i], kmap_ops ?  				       &kmap_ops[i] : NULL);  		if (ret) -			return ret; +			goto out;  	} + out:  	if (lazy)  		arch_leave_lazy_mmu_mode(); @@ -969,9 +970,10 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,  		ret = m2p_remove_override(pages[i], kmap_ops ?  				       &kmap_ops[i] : NULL);  		if (ret) -			return ret; +			goto out;  	} + out:  	if (lazy)  		arch_leave_lazy_mmu_mode(); diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index a224bc74b6b9..1eac0731c349 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -555,6 +555,11 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,  				sg_dma_len(sgl) = 0;  				return 0;  			} +			xen_dma_map_page(hwdev, pfn_to_page(map >> PAGE_SHIFT), +						map & ~PAGE_MASK, +						sg->length, +						dir, +						attrs);  			sg->dma_address = xen_phys_to_bus(map);  		} else {  			/* we are not interested in the dma_addr returned by |