Re: [PATCH] ACPI : Load device driver according to the status of acpi device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2008-07-09 at 10:48 -0600, Bjorn Helgaas wrote:
> On Tuesday 08 July 2008 01:04:52 am Zhao Yakui wrote:
> > >From : Zhao Yakui <yakui.zhao@xxxxxxxxx>
> > 
> > According to ACPI spec when the status of some device is not present 
> > but functional, the device is valid and the children of this device 
> > should be enumerated. It means that the device should be added to 
> > linux acpi device tree.
> > But the device driver for this device should not be loaded. 
> 
> This is an obscure detail; can you add a specific spec reference
> to your commit log?  I think the relevant section is 6.3.7 of
> the 3.0b spec.
Thanks for pointing this. 
   The detail info is listed in the section 6.3.7 of ACPI spec.

> _STA may return bit 0 clear (not present) with bit 3 set (device is 
> functional). This case is used to indicate
>a valid device for which no device driver should be loaded (for
>example, a bridge device.). Children of this
>device may be present and valid. And OS should continue enumeration
below >a device whose _STA returns this bit combination.


I will add this to the commit log.
> 
> > http://bugzilla.kernel.org/show_bug.cgi?id=3358
> > 
> > Signed-off-by: Zhao Yakui <yakui.zhao@xxxxxxxxx>
> > Signed-off-by: Li Shaohua <shaohua.li@xxxxxxxxx>
> > Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> > ---
> >  drivers/acpi/bus.c         |   16 ++++++++--------
> >  drivers/acpi/scan.c        |   35 +++++++++++++++++++++++++----------
> >  drivers/pnp/pnpacpi/core.c |    6 +++++-
> >  3 files changed, 38 insertions(+), 19 deletions(-)
> > 
> > Index: linux-2.6/drivers/acpi/bus.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/acpi/bus.c
> > +++ linux-2.6/drivers/acpi/bus.c
> > @@ -95,21 +95,21 @@ int acpi_bus_get_status(struct acpi_devi
> >  	}
> >  
> >  	/*
> > -	 * Otherwise we assume the status of our parent (unless we don't
> > -	 * have one, in which case status is implied).
> > +	 * According to ACPI spec some device can be present and functional
> > +	 * even if the parent is not present but functional.
> > +	 * In such conditions the child device should not inherit the status
> > +	 * from the parent.
> >  	 */
> > -	else if (device->parent)
> > -		device->status = device->parent->status;
> >  	else
> >  		STRUCT_TO_INT(device->status) =
> >  		    ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
> >  		    ACPI_STA_DEVICE_UI      | ACPI_STA_DEVICE_FUNCTIONING;
> >  
> >  	if (device->status.functional && !device->status.present) {
> > -		printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: "
> > -		       "functional but not present; setting present\n",
> > -		       device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status));
> > -		device->status.present = 1;
> > +		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
> > +		       "functional but not present;\n",
> > +			device->pnp.bus_id,
> > +			(u32) STRUCT_TO_INT(device->status)));
> >  	}
> >  
> >  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
> > Index: linux-2.6/drivers/acpi/scan.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/acpi/scan.c
> > +++ linux-2.6/drivers/acpi/scan.c
> > @@ -264,6 +264,13 @@ int acpi_match_device_ids(struct acpi_de
> >  {
> >  	const struct acpi_device_id *id;
> >  
> > +	/*
> > +	 * If the device is not present, it is unnecessary to load device
> > +	 * driver for it.
> > +	 */
> > +	if (!device->status.present)
> > +		return -ENODEV;
> > +
> >  	if (device->flags.hardware_id) {
> >  		for (id = ids; id->id[0]; id++) {
> >  			if (!strcmp((char*)id->id, device->pnp.hardware_id))
> > @@ -1239,15 +1246,18 @@ acpi_add_single_object(struct acpi_devic
> >  			result = -ENODEV;
> >  			goto end;
> >  		}
> > -		if (!device->status.present) {
> > -			/* Bay and dock should be handled even if absent */
> > -			if (!ACPI_SUCCESS(
> > -			     acpi_is_child_device(device, acpi_bay_match)) &&
> > -			    !ACPI_SUCCESS(
> > -			     acpi_is_child_device(device, acpi_dock_match))) {
> > -					result = -ENODEV;
> > -					goto end;
> > -			}
> > +		/*
> > +		 * When the device is neither present nor functional, the
> > +		 * device should not be added to Linux ACPI device tree.
> > +		 * When the status of the device is not present but functinal,
> > +		 * it should be added to Linux ACPI tree. For example : bay
> > +		 * device , dock device.
> > +		 * In such conditions it is unncessary to check whether it is
> > +		 * bay device or dock device.
> > +		 */
> > +		if (!device->status.present && !device->status.functional) {
> > +			result = -ENODEV;
> > +			goto end;
> >  		}
> >  		break;
> >  	default:
> > @@ -1420,7 +1430,12 @@ static int acpi_bus_scan(struct acpi_dev
> >  		 * TBD: Need notifications and other detection mechanisms
> >  		 *      in place before we can fully implement this.
> >  		 */
> > -		if (child->status.present) {
> > +		 /*
> > +		 * When the device is not present but functional, it is also
> > +		 * necessary to scan the children of this device.
> > +		 */
> > +		if (child->status.present || (!child->status.present &&
> > +					child->status.functional)) {
> >  			status = acpi_get_next_object(ACPI_TYPE_ANY, chandle,
> >  						      NULL, NULL);
> >  			if (ACPI_SUCCESS(status)) {
> > Index: linux-2.6/drivers/pnp/pnpacpi/core.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/pnp/pnpacpi/core.c
> > +++ linux-2.6/drivers/pnp/pnpacpi/core.c
> > @@ -150,9 +150,13 @@ static int __init pnpacpi_add_device(str
> >  	acpi_status status;
> >  	struct pnp_dev *dev;
> >  
> > +	/*
> > +	 * If a PnPacpi device is not present , the device
> > +	 * driver should not be loaded.
> > +	 */
> >  	status = acpi_get_handle(device->handle, "_CRS", &temp);
> >  	if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
> > -	    is_exclusive_device(device))
> > +	    is_exclusive_device(device) || (!device->status.present))
> >  		return 0;
> >  
> >  	dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device));
> > 
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux