public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] acpiphp: configure _PRT
@ 2006-03-02 13:58 MUNEDA Takahiro
  2006-03-02 23:34 ` Kristen Accardi
  2006-03-03  0:49 ` [Pcihpd-discuss] " MUNEDA Takahiro
  0 siblings, 2 replies; 4+ messages in thread
From: MUNEDA Takahiro @ 2006-03-02 13:58 UTC (permalink / raw)
  To: pcihpd-discuss, Greg KH, linux-acpi, len.brown
  Cc: muneda.takahiro, kristen.c.accardi

Hi,

Current acpiphp does not free acpi_device structs when the
PCI devices are removed. When the PCI device is added,
acpi_bus_add() fails because acpi_device struct has already
exists. So, _PRT method does not evaluate.

This patch fixes this issue.

This patch is against 2.6.16-rc5-mm1 plus following patches.

 o Kristen's latest patch set
 o Kenji's acpiphp: Scan slots under the nested P2P bridge

I tested this patch on my tiger4 box except for dock eject
case, because I don't have any pc which has _DCK method.

--

But, if the devices do not have the _STA method, this patch
makes strange conditions. If the PCI device is hotplugged
once, there is no acpi_device struct. But if the PCI device
is not hotplugged yet, there is acpi_device struct.

I want to know this strange conditions are allowed or not.
Any comments are welcomed.

Thanks,
MUNE

--
Current acpiphp does not free acpi_device structs when the
PCI devices are removed. When the PCI device is added,
acpi_bus_add() fails because acpi_device struct has already
exists. So, _PRT method does not evaluate.

This patch fixes this issue.

Signed-off-by: MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com>

 drivers/pci/hotplug/acpiphp_dock.c |    1 
 drivers/pci/hotplug/acpiphp_glue.c |   70 ++++++++++++++++---------------------
 2 files changed, 33 insertions(+), 38 deletions(-)

Index: linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_glue.c
===================================================================
--- linux-2.6.16-rc5-mm1.orig/drivers/pci/hotplug/acpiphp_glue.c
+++ linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_glue.c
@@ -841,36 +841,6 @@ static unsigned char acpiphp_max_busnr(s
 }
 
 
-
-/**
- *  get_func - get a pointer to acpiphp_func given a slot, device
- *  @slot: slot to search
- *  @dev:  pci_dev struct to match.
- *
- *  This function will increase the reference count of pci_dev,
- *  so callers should call pci_dev_put when complete.
- *
- */
-static struct acpiphp_func *
-get_func(struct acpiphp_slot *slot, struct pci_dev *dev)
-{
-	struct acpiphp_func *func = NULL;
-	struct pci_bus *bus = slot->bridge->pci_bus;
-	struct pci_dev *pdev;
-
-	list_for_each_entry(func, &slot->funcs, sibling) {
-		pdev = pci_get_slot(bus, PCI_DEVFN(slot->device,
-					func->function));
-		if (pdev) {
-			if (pdev == dev)
-				break;
-			pci_dev_put(pdev);
-		}
-	}
-	return func;
-}
-
-
 /**
  * acpiphp_bus_add - add a new bus to acpi subsystem
  * @func: acpiphp_func of the bridge
@@ -917,6 +887,28 @@ acpiphp_bus_add_out:
 }
 
 
+/**
+ * acpiphp_bus_trim - trim a bus from acpi subsystem
+ * @handle: handle to acpi namespace
+ *
+ */
+int acpiphp_bus_trim(acpi_handle handle)
+{
+	struct acpi_device *device;
+	int retval;
+
+	retval = acpi_bus_get_device(handle, &device);
+	if (retval) {
+		dbg("acpi_device not found\n");
+		return retval;
+	}
+
+	retval = acpi_bus_trim(device, 1);
+	if (retval)
+		err("cannot remove from acpi list\n");
+
+	return 0;
+}
 
 /**
  * enable_device - enable, configure a slot
@@ -963,19 +955,17 @@ static int enable_device(struct acpiphp_
 			if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
 			    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
 				max = pci_scan_bridge(bus, dev, max, pass);
-				if (pass && dev->subordinate) {
+				if (pass && dev->subordinate)
 					pci_bus_size_bridges(dev->subordinate);
-					func = get_func(slot, dev);
-					if (func) {
-						acpiphp_bus_add(func);
-						/* side effect of get_func */
-						pci_dev_put(dev);
-					}
-				}
 			}
 		}
 	}
 
+	list_for_each (l, &slot->funcs) {
+		func = list_entry(l, struct acpiphp_func, sibling);
+		acpiphp_bus_add(func);
+	}
+
 	pci_bus_assign_resources(bus);
 	acpiphp_sanitize_bus(bus);
 	pci_enable_bridges(bus);
@@ -1012,6 +1002,10 @@ static int disable_device(struct acpiphp
 
 	list_for_each (l, &slot->funcs) {
 		func = list_entry(l, struct acpiphp_func, sibling);
+
+		if (acpiphp_bus_trim(func->handle))
+			continue;
+
 		if (!func->pci_dev)
 			continue;
 
Index: linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
===================================================================
--- linux-2.6.16-rc5-mm1.orig/drivers/pci/hotplug/acpiphp_dock.c
+++ linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
@@ -290,6 +290,7 @@ handle_hotplug_event_dock(acpi_handle ha
 			dbg("EJECT request\n");
 			if (!dock_in_progress() && dock_present()) {
 				hotplug_pci(type);
+				acpiphp_bus_trim(handle);
 				undock();
 				eject_dock();
 				if (dock_present())

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC][PATCH] acpiphp: configure _PRT
  2006-03-02 13:58 [RFC][PATCH] acpiphp: configure _PRT MUNEDA Takahiro
@ 2006-03-02 23:34 ` Kristen Accardi
  2006-03-02 23:56   ` MUNEDA Takahiro
  2006-03-03  0:49 ` [Pcihpd-discuss] " MUNEDA Takahiro
  1 sibling, 1 reply; 4+ messages in thread
From: Kristen Accardi @ 2006-03-02 23:34 UTC (permalink / raw)
  To: MUNEDA Takahiro; +Cc: pcihpd-discuss, Greg KH, linux-acpi, len.brown

On Thu, 2006-03-02 at 22:58 +0900, MUNEDA Takahiro wrote:
> Hi,
> 
> Current acpiphp does not free acpi_device structs when the
> PCI devices are removed. When the PCI device is added,
> acpi_bus_add() fails because acpi_device struct has already
> exists. So, _PRT method does not evaluate.
> 
> This patch fixes this issue.
> 
> This patch is against 2.6.16-rc5-mm1 plus following patches.
> 
>  o Kristen's latest patch set
>  o Kenji's acpiphp: Scan slots under the nested P2P bridge
> 
> I tested this patch on my tiger4 box except for dock eject
> case, because I don't have any pc which has _DCK method.
> 

I tested this on a couple laptops that have _DCK methods - It seems to
work fine, however, see comment below:
<snip>

> Index: linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
> ===================================================================
> --- linux-2.6.16-rc5-mm1.orig/drivers/pci/hotplug/acpiphp_dock.c
> +++ linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
> @@ -290,6 +290,7 @@ handle_hotplug_event_dock(acpi_handle ha
>  			dbg("EJECT request\n");
>  			if (!dock_in_progress() && dock_present()) {
>  				hotplug_pci(type);
> +				acpiphp_bus_trim(handle);

This is not necessary.  hotplug_pci() will pass the eject event down to
the acpiphp handle_hotplug_event_func() routine, which will call
disable_device() and remove the bus that way as part of your new patch.

>  				undock();
>  				eject_dock();
>  				if (dock_present())

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC][PATCH] acpiphp: configure _PRT
  2006-03-02 23:34 ` Kristen Accardi
@ 2006-03-02 23:56   ` MUNEDA Takahiro
  0 siblings, 0 replies; 4+ messages in thread
From: MUNEDA Takahiro @ 2006-03-02 23:56 UTC (permalink / raw)
  To: Kristen Accardi
  Cc: MUNEDA Takahiro, pcihpd-discuss, Greg KH, linux-acpi, len.brown

At Thu, 02 Mar 2006 15:34:09 -0800,
Kristen Accardi <kristen.c.accardi@intel.com> wrote:
> 
> I tested this on a couple laptops that have _DCK methods - It seems to
> work fine, however, see comment below:

Thanks for testing my patch and for feedback.

> <snip>
> 
> > Index: linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
> > ===================================================================
> > --- linux-2.6.16-rc5-mm1.orig/drivers/pci/hotplug/acpiphp_dock.c
> > +++ linux-2.6.16-rc5-mm1/drivers/pci/hotplug/acpiphp_dock.c
> > @@ -290,6 +290,7 @@ handle_hotplug_event_dock(acpi_handle ha
> >  			dbg("EJECT request\n");
> >  			if (!dock_in_progress() && dock_present()) {
> >  				hotplug_pci(type);
> > +				acpiphp_bus_trim(handle);
> 
> This is not necessary.  hotplug_pci() will pass the eject event down to
> the acpiphp handle_hotplug_event_func() routine, which will call
> disable_device() and remove the bus that way as part of your new patch.

OK, I mis-understood the dock eject routine.
I'll remove it.

> >  				undock();
> >  				eject_dock();
> >  				if (dock_present())

Thanks,
MUNE

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Pcihpd-discuss] [RFC][PATCH] acpiphp: configure _PRT
  2006-03-02 13:58 [RFC][PATCH] acpiphp: configure _PRT MUNEDA Takahiro
  2006-03-02 23:34 ` Kristen Accardi
@ 2006-03-03  0:49 ` MUNEDA Takahiro
  1 sibling, 0 replies; 4+ messages in thread
From: MUNEDA Takahiro @ 2006-03-03  0:49 UTC (permalink / raw)
  To: pcihpd-discuss, Greg KH, linux-acpi, len.brown
  Cc: kristen.c.accardi, MUNEDA Takahiro

At Thu, 02 Mar 2006 22:58:03 +0900,
MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> wrote:
> 
> But, if the devices do not have the _STA method, this patch
> makes strange conditions. If the PCI device is hotplugged
> once, there is no acpi_device struct. But if the PCI device
> is not hotplugged yet, there is acpi_device struct.
> 
> I want to know this strange conditions are allowed or not.
> Any comments are welcomed.

Hi,

I pondered about this idea after I got up. I think this idea
is strange and might be wrong. So, please ignore this patch.
I'll resend the patch later.

I'm sorry to confuse you.

Thanks,
MUNE

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-03-03  0:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-03-02 13:58 [RFC][PATCH] acpiphp: configure _PRT MUNEDA Takahiro
2006-03-02 23:34 ` Kristen Accardi
2006-03-02 23:56   ` MUNEDA Takahiro
2006-03-03  0:49 ` [Pcihpd-discuss] " MUNEDA Takahiro

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox