PCI: complain about devices that seem to be broken
If we can tell that a device isn't working correctly, we should tell the user to make debugging easier. Otherwise, it can take a lot of work to determine whether the problem is in the driver, PCMCIA, PCI, hardware, etc., as in http://bugzilla.kernel.org/show_bug.cgi?id=12006 Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
		
					parent
					
						
							
								e1944c6b0f
							
						
					
				
			
			
				commit
				
					
						c519a5a7da
					
				
			
		
					 1 changed files with 16 additions and 7 deletions
				
			
		|  | @ -174,14 +174,19 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | ||||||
| 	pci_read_config_dword(dev, pos, &sz); | 	pci_read_config_dword(dev, pos, &sz); | ||||||
| 	pci_write_config_dword(dev, pos, l); | 	pci_write_config_dword(dev, pos, l); | ||||||
| 
 | 
 | ||||||
|  | 	if (!sz) | ||||||
|  | 		goto fail;	/* BAR not implemented */ | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * All bits set in sz means the device isn't working properly. | 	 * All bits set in sz means the device isn't working properly. | ||||||
| 	 * If the BAR isn't implemented, all bits must be 0.  If it's a | 	 * If it's a memory BAR or a ROM, bit 0 must be clear; if it's | ||||||
| 	 * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit | 	 * an io BAR, bit 1 must be clear. | ||||||
| 	 * 1 must be clear. |  | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!sz || sz == 0xffffffff) | 	if (sz == 0xffffffff) { | ||||||
|  | 		dev_err(&dev->dev, "reg %x: invalid size %#x; broken device?\n", | ||||||
|  | 			pos, sz); | ||||||
| 		goto fail; | 		goto fail; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * I don't know how l can have all bits set.  Copied from old code. | 	 * I don't know how l can have all bits set.  Copied from old code. | ||||||
|  | @ -244,13 +249,17 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | ||||||
| 				   pos, res); | 				   pos, res); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		sz = pci_size(l, sz, mask); | 		u32 size = pci_size(l, sz, mask); | ||||||
| 
 | 
 | ||||||
| 		if (!sz) | 		if (!size) { | ||||||
|  | 			dev_err(&dev->dev, "reg %x: invalid size " | ||||||
|  | 			        "(l %#x sz %#x mask %#x); broken device?", | ||||||
|  | 				pos, l, sz, mask); | ||||||
| 			goto fail; | 			goto fail; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		res->start = l; | 		res->start = l; | ||||||
| 		res->end = l + sz; | 		res->end = l + size; | ||||||
| 
 | 
 | ||||||
| 		dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | 		dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Bjorn Helgaas
				Bjorn Helgaas