} 
acpi_pci_root_add (	struct acpi_device	*device){	int			result = 0;	struct acpi_pci_root	*root = NULL;	struct acpi_pci_root	*tmp;	acpi_status		status = AE_OK;	unsigned long		value = 0;	acpi_handle		handle = NULL;	ACPI_FUNCTION_TRACE("acpi_pci_root_add");	if (!device)		return_VALUE(-EINVAL);	root = kmalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);	if (!root)		return_VALUE(-ENOMEM);	memset(root, 0, sizeof(struct acpi_pci_root));	root->handle = device->handle;	strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);	strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);	acpi_driver_data(device) = root;	/*	 * TBD: Doesn't the bus driver automatically set this?	 */	device->ops.bind = acpi_pci_bind;	/* 	 * Segment	 * -------	 * Obtained via _SEG, if exists, otherwise assumed to be zero (0).	 */	status = acpi_evaluate_integer(root->handle, METHOD_NAME__SEG, NULL, 		&value);	switch (status) {	case AE_OK:		root->id.segment = (u16) value;		break;	case AE_NOT_FOUND:		ACPI_DEBUG_PRINT((ACPI_DB_INFO, 			"Assuming segment 0 (no _SEG)\n"));		root->id.segment = 0;		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SEG\n"));		result = -ENODEV;		goto end;	}	/* 	 * Bus	 * ---	 * Obtained via _BBN, if exists, otherwise assumed to be zero (0).	 */	status = acpi_evaluate_integer(root->handle, METHOD_NAME__BBN, NULL, 		&value);	switch (status) {	case AE_OK:		root->id.bus = (u16) value;		break;	case AE_NOT_FOUND:		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Assuming bus 0 (no _BBN)\n"));		root->id.bus = 0;		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _BBN\n"));		result = -ENODEV;		goto end;	}	/* Some systems have wrong _BBN */	list_for_each_entry(tmp, &acpi_pci_roots, node) {		if ((tmp->id.segment == root->id.segment)				&& (tmp->id.bus == root->id.bus)) {			int bus = 0;			acpi_status status;			ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 				"Wrong _BBN value, please reboot and using option 'pci=noacpi'\n"));			status = try_get_root_bridge_busnr(root->handle, &bus);			if (ACPI_FAILURE(status))				break;			if (bus != root->id.bus) {				printk(KERN_INFO PREFIX "PCI _CRS %d overrides _BBN 0\n", bus);				root->id.bus = bus;			}			break;		}	}	/*	 * Device & Function	 * -----------------	 * Obtained from _ADR (which has already been evaluated for us).	 */	root->id.device = device->pnp.bus_address >> 16;	root->id.function = device->pnp.bus_address & 0xFFFF;	/*	 * TBD: Need PCI interface for enumeration/configuration of roots.	 */ 	/* TBD: Locking */ 	list_add_tail(&root->node, &acpi_pci_roots);	printk(KERN_INFO PREFIX "%s [%s] (%04x:%02x)\n", 		acpi_device_name(device), acpi_device_bid(device),		root->id.segment, root->id.bus);	/*	 * Scan the Root Bridge	 * --------------------	 * Must do this prior to any attempt to bind the root device, as the	 * PCI namespace does not get created until this call is made (and 	 * thus the root bridge's pci_dev does not exist).	 */	root->bus = pci_acpi_scan_root(device, root->id.segment, root->id.bus);	if (!root->bus) {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 			"Bus %04x:%02x not present in PCI namespace\n", 			root->id.segment, root->id.bus));		result = -ENODEV;		goto end;	}	/*	 * Attach ACPI-PCI Context	 * -----------------------	 * Thus binding the ACPI and PCI devices.	 */	result = acpi_pci_bind_root(device, &root->id, root->bus);	if (result)		goto end;	/*	 * PCI Routing Table	 * -----------------	 * Evaluate and parse _PRT, if exists.	 */	status = acpi_get_handle(root->handle, METHOD_NAME__PRT, &handle);	if (ACPI_SUCCESS(status))		result = acpi_pci_irq_add_prt(root->handle, root->id.segment,			root->id.bus);end:	if (result)		kfree(root);	return_VALUE(result);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/c431ada45d65b305a6aab4557067e564b23ce5a5/pci_root.c/clean/drivers/acpi/pci_root.c