diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pci/pci.c | 117 | 
1 files changed, 89 insertions, 28 deletions
| diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 848746f1e..3dccf8858 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -510,6 +510,71 @@ void pci_cfgfunc_do_nothing(struct pci_controller *hose,  extern int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev);  extern void pciauto_config_init(struct pci_controller *hose); +#if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI_SCAN_SHOW) +const char * pci_class_str(u8 class) +{ +	switch (class) { +	case PCI_CLASS_NOT_DEFINED: +		return "Build before PCI Rev2.0"; +		break; +	case PCI_BASE_CLASS_STORAGE: +		return "Mass storage controller"; +		break; +	case PCI_BASE_CLASS_NETWORK: +		return "Network controller"; +		break; +	case PCI_BASE_CLASS_DISPLAY: +		return "Display controller"; +		break; +	case PCI_BASE_CLASS_MULTIMEDIA: +		return "Multimedia device"; +		break; +	case PCI_BASE_CLASS_MEMORY: +		return "Memory controller"; +		break; +	case PCI_BASE_CLASS_BRIDGE: +		return "Bridge device"; +		break; +	case PCI_BASE_CLASS_COMMUNICATION: +		return "Simple comm. controller"; +		break; +	case PCI_BASE_CLASS_SYSTEM: +		return "Base system peripheral"; +		break; +	case PCI_BASE_CLASS_INPUT: +		return "Input device"; +		break; +	case PCI_BASE_CLASS_DOCKING: +		return "Docking station"; +		break; +	case PCI_BASE_CLASS_PROCESSOR: +		return "Processor"; +		break; +	case PCI_BASE_CLASS_SERIAL: +		return "Serial bus controller"; +		break; +	case PCI_BASE_CLASS_INTELLIGENT: +		return "Intelligent controller"; +		break; +	case PCI_BASE_CLASS_SATELLITE: +		return "Satellite controller"; +		break; +	case PCI_BASE_CLASS_CRYPT: +		return "Cryptographic device"; +		break; +	case PCI_BASE_CLASS_SIGNAL_PROCESSING: +		return "DSP"; +		break; +	case PCI_CLASS_OTHERS: +		return "Does not fit any class"; +		break; +	default: +	return  "???"; +		break; +	}; +} +#endif /* CONFIG_CMD_PCI || CONFIG_PCI_SCAN_SHOW */ +  int __pci_skip_dev(struct pci_controller *hose, pci_dev_t dev)  {  	/* @@ -568,44 +633,40 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)  		pci_hose_read_config_word(hose, dev, PCI_VENDOR_ID, &vendor); -		if (vendor != 0xffff && vendor != 0x0000) { +		if (vendor == 0xffff || vendor == 0x0000) +			continue; -			if (!PCI_FUNC(dev)) -				found_multi = header_type & 0x80; +		if (!PCI_FUNC(dev)) +			found_multi = header_type & 0x80; -			debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n", -				PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) ); +		debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n", +			PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) ); -			pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device); -			pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class); +		pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device); +		pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class); -			cfg = pci_find_config(hose, class, vendor, device, -					      PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev)); -			if (cfg) { -				cfg->config_device(hose, dev, cfg); -				sub_bus = max(sub_bus, hose->current_busno); +		cfg = pci_find_config(hose, class, vendor, device, +				      PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev)); +		if (cfg) { +			cfg->config_device(hose, dev, cfg); +			sub_bus = max(sub_bus, hose->current_busno);  #ifdef CONFIG_PCI_PNP -			} else { -				int n = pciauto_config_device(hose, dev); +		} else { +			int n = pciauto_config_device(hose, dev); -				sub_bus = max(sub_bus, n); +			sub_bus = max(sub_bus, n);  #endif -			} -			if (hose->fixup_irq) -				hose->fixup_irq(hose, dev); +		} +		if (hose->fixup_irq) +			hose->fixup_irq(hose, dev);  #ifdef CONFIG_PCI_SCAN_SHOW -			if (pci_print_dev(hose, dev)) { -				unsigned char int_line; - -				pci_hose_read_config_byte(hose, dev, PCI_INTERRUPT_LINE, -							  &int_line); -				printf("        %02x  %02x  %04x  %04x  %04x  %02x\n", -				       PCI_BUS(dev), PCI_DEV(dev), vendor, device, class, -				       int_line); -			} -#endif +		if (pci_print_dev(hose, dev)) { +			printf("        %02x:%02x.%x - %04x:%04x - %s\n", +			       PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev), +			       vendor, device, pci_class_str(class >> 8));  		} +#endif  	}  	return sub_bus; |