forked from mirrors/linux
		
	usb: don't inherity DMA properties for USB devices
As the comment in usb_alloc_dev correctly states, drivers can't use the DMA API on usb device, and at least calling dma_set_mask on them is highly dangerous. Unlike what the comment states upper level drivers also can't really use the presence of a dma mask to check for DMA support, as the dma_mask is set by default for most busses. Setting the dma_mask comes from "[PATCH] usbcore dma updates (and doc)" in BitKeeper times, as it seems like it was primarily for setting the NETIF_F_HIGHDMA flag in USB drivers, something that has long been fixed up since. Setting the dma_pfn_offset comes from commitb44bbc46a8("usb: core: setup dma_pfn_offset for USB devices and, interfaces"), which worked around the fact that the scsi_calculate_bounce_limits functions wasn't going through the proper driver interface to query DMA information, but that function was removed in commit21e07dba9f("scsi: reduce use of block bounce buffers") years ago. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									cf141ae989
								
							
						
					
					
						commit
						6eb0233ec2
					
				
					 2 changed files with 0 additions and 18 deletions
				
			
		|  | @ -1954,12 +1954,6 @@ int usb_set_configuration(struct usb_device *dev, int configuration) | ||||||
| 		intf->dev.bus = &usb_bus_type; | 		intf->dev.bus = &usb_bus_type; | ||||||
| 		intf->dev.type = &usb_if_device_type; | 		intf->dev.type = &usb_if_device_type; | ||||||
| 		intf->dev.groups = usb_interface_groups; | 		intf->dev.groups = usb_interface_groups; | ||||||
| 		/*
 |  | ||||||
| 		 * Please refer to usb_alloc_dev() to see why we set |  | ||||||
| 		 * dma_mask and dma_pfn_offset. |  | ||||||
| 		 */ |  | ||||||
| 		intf->dev.dma_mask = dev->dev.dma_mask; |  | ||||||
| 		intf->dev.dma_pfn_offset = dev->dev.dma_pfn_offset; |  | ||||||
| 		INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); | 		INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); | ||||||
| 		intf->minor = -1; | 		intf->minor = -1; | ||||||
| 		device_initialize(&intf->dev); | 		device_initialize(&intf->dev); | ||||||
|  |  | ||||||
|  | @ -599,18 +599,6 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, | ||||||
| 	dev->dev.bus = &usb_bus_type; | 	dev->dev.bus = &usb_bus_type; | ||||||
| 	dev->dev.type = &usb_device_type; | 	dev->dev.type = &usb_device_type; | ||||||
| 	dev->dev.groups = usb_device_groups; | 	dev->dev.groups = usb_device_groups; | ||||||
| 	/*
 |  | ||||||
| 	 * Fake a dma_mask/offset for the USB device: |  | ||||||
| 	 * We cannot really use the dma-mapping API (dma_alloc_* and |  | ||||||
| 	 * dma_map_*) for USB devices but instead need to use |  | ||||||
| 	 * usb_alloc_coherent and pass data in 'urb's, but some subsystems |  | ||||||
| 	 * manually look into the mask/offset pair to determine whether |  | ||||||
| 	 * they need bounce buffers. |  | ||||||
| 	 * Note: calling dma_set_mask() on a USB device would set the |  | ||||||
| 	 * mask for the entire HCD, so don't do that. |  | ||||||
| 	 */ |  | ||||||
| 	dev->dev.dma_mask = bus->sysdev->dma_mask; |  | ||||||
| 	dev->dev.dma_pfn_offset = bus->sysdev->dma_pfn_offset; |  | ||||||
| 	set_dev_node(&dev->dev, dev_to_node(bus->sysdev)); | 	set_dev_node(&dev->dev, dev_to_node(bus->sysdev)); | ||||||
| 	dev->state = USB_STATE_ATTACHED; | 	dev->state = USB_STATE_ATTACHED; | ||||||
| 	dev->lpm_disable_count = 1; | 	dev->lpm_disable_count = 1; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Christoph Hellwig
						Christoph Hellwig