public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE related)
@ 2009-06-26 15:40 Etienne Basset
  2009-06-26 19:39 ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 8+ messages in thread
From: Etienne Basset @ 2009-06-26 15:40 UTC (permalink / raw)
  To: bzolnier, davem; +Cc: Linux Kernel Mailing List, Rafael J. Wysocki

hello,

kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR 
I tried also 2.6.31-rc1 doesn't work either
I bisected it to :

etienne@etienne-desktop:~/linux-2.6$ git bisect bad
2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
commit 2f0d0fd2a605666d38e290c5c0d2907484352dc4             
Author: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>      
Date:   Tue Mar 24 23:22:42 2009 +0100                      

    ide-acpi: cleanup do_drive_get_GTF()
                                        
    * ide_noacpi is already checked by ide_acpi_exec_tfs()
      which is the only user of do_drive_get_GTF().       
                                                          
    * ide_acpi_exec_tfs() prints sufficient debug info about the
      device so no need to have excessive data about port/host. 
                                                                
    * It is sufficient to check for drive->acpidata->obj_handle 
      as it will be NULL if dev == NULL or hwif->acpidata == NULL
      or device is not present.                                  
                                                                 
    Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>

If i revert this patch on top of 2.6.31-rc1, STR Works OK
(i think the only device handled by the legacy IDE subsystem on my computer is my CDROM drive)

thanks,
Etienne

etienne@etienne-desktop:~/linux-2.6$ lspci
00:00.0 Host bridge: Intel Corporation 82915G/P/GV/GL/PL/910GL Memory Controller Hub (rev 04)
00:01.0 PCI bridge: Intel Corporation 82915G/P/GV/GL/PL/910GL PCI Express Root Port (rev 04)
00:1c.0 PCI bridge: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 (rev 03)
00:1d.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 03)
00:1d.1 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 (rev 03)
00:1d.2 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 (rev 03)
00:1d.3 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 (rev 03)
00:1d.7 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller (rev 03)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev d3)
00:1f.0 ISA bridge: Intel Corporation 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge (rev 03)
00:1f.1 IDE interface: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller (rev 03)
00:1f.2 IDE interface: Intel Corporation 82801FB/FW (ICH6/ICH6W) SATA Controller (rev 03)
00:1f.3 SMBus: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller (rev 03)
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 5B60 [Radeon X300 (PCIE)]
01:00.1 Display controller: ATI Technologies Inc RV370 [Radeon X300SE]
03:00.0 Multimedia audio controller: Creative Labs SB Audigy (rev 04)
03:00.2 FireWire (IEEE 1394): Creative Labs SB Audigy FireWire Port (rev 04)
03:08.0 Ethernet controller: Intel Corporation 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller (rev 03)

etienne@etienne-desktop:~/linux-2.6$ cat .config|grep IDE
CONFIG_HAVE_IDE=y
CONFIG_IDE=y
# Please see Documentation/ide/ide.txt for help/info on IDE drives
CONFIG_IDE_XFER_MODE=y
CONFIG_IDE_ATAPI=y
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_IDE_GD is not set
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_IDEACPI=y
# CONFIG_IDE_TASK_IOCTL is not set
CONFIG_IDE_PROC_FS=y
# IDE chipset support/bugfixes
CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_IDEPNP is not set
CONFIG_BLK_DEV_IDEDMA_SFF=y
# PCI IDE chipsets support
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_PCIBUS_ORDER=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_BLK_DEV_IDEDMA=y




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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE related)
  2009-06-26 15:40 [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE related) Etienne Basset
@ 2009-06-26 19:39 ` Bartlomiej Zolnierkiewicz
  2009-06-27  9:04   ` Etienne Basset
  0 siblings, 1 reply; 8+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2009-06-26 19:39 UTC (permalink / raw)
  To: Etienne Basset; +Cc: davem, Linux Kernel Mailing List, Rafael J. Wysocki


Hi,

On Friday 26 June 2009 17:40:30 Etienne Basset wrote:
> hello,
> 
> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR 
> I tried also 2.6.31-rc1 doesn't work either
> I bisected it to :
> 
> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit

Does the following patch fix it?

---
 drivers/ide/ide-acpi.c |   37 +++++++------------------------------
 drivers/ide/ide-pm.c   |   30 ++++++++++++++++++------------
 include/linux/ide.h    |    2 ++
 3 files changed, 27 insertions(+), 42 deletions(-)

Index: b/drivers/ide/ide-acpi.c
===================================================================
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -92,6 +92,11 @@ int ide_acpi_init(void)
 	return 0;
 }
 
+bool ide_port_acpi(ide_hwif_t *hwif)
+{
+	return ide_noacpi == 0 && hwif->acpidata;
+}
+
 /**
  * ide_get_dev_handle - finds acpi_handle and PCI device.function
  * @dev: device to locate
@@ -352,9 +357,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive
 	unsigned long	gtf_address;
 	unsigned long	obj_loc;
 
-	if (ide_noacpi)
-		return 0;
-
 	DEBPRINT("call get_GTF, drive=%s port=%d\n", drive->name, drive->dn);
 
 	ret = do_drive_get_GTF(drive, &gtf_length, &gtf_address, &obj_loc);
@@ -389,16 +391,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwi
 	struct acpi_buffer	output;
 	union acpi_object 	*out_obj;
 
-	if (ide_noacpi)
-		return;
-
-	DEBPRINT("ENTER:\n");
-
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* Setting up output buffer for _GTM */
 	output.length = ACPI_ALLOCATE_BUFFER;
 	output.pointer = NULL;	/* ACPI-CA sets this; save/free it later */
@@ -479,16 +471,6 @@ void ide_acpi_push_timing(ide_hwif_t *hw
 	struct ide_acpi_drive_link	*master = &hwif->acpidata->master;
 	struct ide_acpi_drive_link	*slave = &hwif->acpidata->slave;
 
-	if (ide_noacpi)
-		return;
-
-	DEBPRINT("ENTER:\n");
-
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* Give the GTM buffer + drive Identify data to the channel via the
 	 * _STM method: */
 	/* setup input parameters buffer for _STM */
@@ -527,16 +509,11 @@ void ide_acpi_set_state(ide_hwif_t *hwif
 	ide_drive_t *drive;
 	int i;
 
-	if (ide_noacpi || ide_noacpi_psx)
+	if (ide_noacpi_psx)
 		return;
 
 	DEBPRINT("ENTER:\n");
 
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* channel first and then drives for power on and verse versa for power off */
 	if (on)
 		acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0);
@@ -616,7 +593,7 @@ void ide_acpi_port_init_devices(ide_hwif
 				 drive->name, err);
 	}
 
-	if (!ide_acpionboot) {
+	if (ide_noacpi || ide_acpionboot == 0) {
 		DEBPRINT("ACPI methods disabled on boot\n");
 		return;
 	}
Index: b/drivers/ide/ide-pm.c
===================================================================
--- a/drivers/ide/ide-pm.c
+++ b/drivers/ide/ide-pm.c
@@ -10,9 +10,11 @@ int generic_ide_suspend(struct device *d
 	struct request_pm_state rqpm;
 	int ret;
 
-	/* call ACPI _GTM only once */
-	if ((drive->dn & 1) == 0 || pair == NULL)
-		ide_acpi_get_timing(hwif);
+	if (ide_port_acpi(hwif)) {
+		/* call ACPI _GTM only once */
+		if ((drive->dn & 1) == 0 || pair == NULL)
+			ide_acpi_get_timing(hwif);
+	}
 
 	memset(&rqpm, 0, sizeof(rqpm));
 	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
@@ -26,9 +28,11 @@ int generic_ide_suspend(struct device *d
 	ret = blk_execute_rq(drive->queue, NULL, rq, 0);
 	blk_put_request(rq);
 
-	/* call ACPI _PS3 only after both devices are suspended */
-	if (ret == 0 && ((drive->dn & 1) || pair == NULL))
-		ide_acpi_set_state(hwif, 0);
+	if (ret == 0 && ide_port_acpi(hwif)) {
+		/* call ACPI _PS3 only after both devices are suspended */
+		if ((drive->dn & 1) || pair == NULL)
+			ide_acpi_set_state(hwif, 0);
+	}
 
 	return ret;
 }
@@ -42,13 +46,15 @@ int generic_ide_resume(struct device *de
 	struct request_pm_state rqpm;
 	int err;
 
-	/* call ACPI _PS0 / _STM only once */
-	if ((drive->dn & 1) == 0 || pair == NULL) {
-		ide_acpi_set_state(hwif, 1);
-		ide_acpi_push_timing(hwif);
-	}
+	if (ide_port_acpi(hwif)) {
+		/* call ACPI _PS0 / _STM only once */
+		if ((drive->dn & 1) == 0 || pair == NULL) {
+			ide_acpi_set_state(hwif, 1);
+			ide_acpi_push_timing(hwif);
+		}
 
-	ide_acpi_exec_tfs(drive);
+		ide_acpi_exec_tfs(drive);
+	}
 
 	memset(&rqpm, 0, sizeof(rqpm));
 	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -1420,6 +1420,7 @@ static inline void ide_dma_unmap_sg(ide_
 
 #ifdef CONFIG_BLK_DEV_IDEACPI
 int ide_acpi_init(void);
+bool ide_port_acpi(ide_hwif_t *hwif);
 extern int ide_acpi_exec_tfs(ide_drive_t *drive);
 extern void ide_acpi_get_timing(ide_hwif_t *hwif);
 extern void ide_acpi_push_timing(ide_hwif_t *hwif);
@@ -1428,6 +1429,7 @@ void ide_acpi_port_init_devices(ide_hwif
 extern void ide_acpi_set_state(ide_hwif_t *hwif, int on);
 #else
 static inline int ide_acpi_init(void) { return 0; }
+static inline bool ide_port_acpi(ide_hwif_t *hwif) { return 0; }
 static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; }
 static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; }
 static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; }

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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE related)
  2009-06-26 19:39 ` Bartlomiej Zolnierkiewicz
@ 2009-06-27  9:04   ` Etienne Basset
  2009-06-27 18:09     ` Jeff Chua
  0 siblings, 1 reply; 8+ messages in thread
From: Etienne Basset @ 2009-06-27  9:04 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: davem, Linux Kernel Mailing List, Rafael J. Wysocki

Hi,

Bartlomiej Zolnierkiewicz wrote:
> Hi,
> 
> On Friday 26 June 2009 17:40:30 Etienne Basset wrote:
>> hello,
>>
>> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR 
>> I tried also 2.6.31-rc1 doesn't work either
>> I bisected it to :
>>
>> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
>> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
> 
> Does the following patch fix it?
> 
Yes, it works now
thanks!
Etienne



> ---
>  drivers/ide/ide-acpi.c |   37 +++++++------------------------------
>  drivers/ide/ide-pm.c   |   30 ++++++++++++++++++------------
>  include/linux/ide.h    |    2 ++
>  3 files changed, 27 insertions(+), 42 deletions(-)
> 
> Index: b/drivers/ide/ide-acpi.c
> ===================================================================
> --- a/drivers/ide/ide-acpi.c
> +++ b/drivers/ide/ide-acpi.c
> @@ -92,6 +92,11 @@ int ide_acpi_init(void)
>  	return 0;
>  }
>  
> +bool ide_port_acpi(ide_hwif_t *hwif)
> +{
> +	return ide_noacpi == 0 && hwif->acpidata;
> +}
> +
>  /**
>   * ide_get_dev_handle - finds acpi_handle and PCI device.function
>   * @dev: device to locate
> @@ -352,9 +357,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive
>  	unsigned long	gtf_address;
>  	unsigned long	obj_loc;
>  
> -	if (ide_noacpi)
> -		return 0;
> -
>  	DEBPRINT("call get_GTF, drive=%s port=%d\n", drive->name, drive->dn);
>  
>  	ret = do_drive_get_GTF(drive, &gtf_length, &gtf_address, &obj_loc);
> @@ -389,16 +391,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwi
>  	struct acpi_buffer	output;
>  	union acpi_object 	*out_obj;
>  
> -	if (ide_noacpi)
> -		return;
> -
> -	DEBPRINT("ENTER:\n");
> -
> -	if (!hwif->acpidata) {
> -		DEBPRINT("no ACPI data for %s\n", hwif->name);
> -		return;
> -	}
> -
>  	/* Setting up output buffer for _GTM */
>  	output.length = ACPI_ALLOCATE_BUFFER;
>  	output.pointer = NULL;	/* ACPI-CA sets this; save/free it later */
> @@ -479,16 +471,6 @@ void ide_acpi_push_timing(ide_hwif_t *hw
>  	struct ide_acpi_drive_link	*master = &hwif->acpidata->master;
>  	struct ide_acpi_drive_link	*slave = &hwif->acpidata->slave;
>  
> -	if (ide_noacpi)
> -		return;
> -
> -	DEBPRINT("ENTER:\n");
> -
> -	if (!hwif->acpidata) {
> -		DEBPRINT("no ACPI data for %s\n", hwif->name);
> -		return;
> -	}
> -
>  	/* Give the GTM buffer + drive Identify data to the channel via the
>  	 * _STM method: */
>  	/* setup input parameters buffer for _STM */
> @@ -527,16 +509,11 @@ void ide_acpi_set_state(ide_hwif_t *hwif
>  	ide_drive_t *drive;
>  	int i;
>  
> -	if (ide_noacpi || ide_noacpi_psx)
> +	if (ide_noacpi_psx)
>  		return;
>  
>  	DEBPRINT("ENTER:\n");
>  
> -	if (!hwif->acpidata) {
> -		DEBPRINT("no ACPI data for %s\n", hwif->name);
> -		return;
> -	}
> -
>  	/* channel first and then drives for power on and verse versa for power off */
>  	if (on)
>  		acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0);
> @@ -616,7 +593,7 @@ void ide_acpi_port_init_devices(ide_hwif
>  				 drive->name, err);
>  	}
>  
> -	if (!ide_acpionboot) {
> +	if (ide_noacpi || ide_acpionboot == 0) {
>  		DEBPRINT("ACPI methods disabled on boot\n");
>  		return;
>  	}
> Index: b/drivers/ide/ide-pm.c
> ===================================================================
> --- a/drivers/ide/ide-pm.c
> +++ b/drivers/ide/ide-pm.c
> @@ -10,9 +10,11 @@ int generic_ide_suspend(struct device *d
>  	struct request_pm_state rqpm;
>  	int ret;
>  
> -	/* call ACPI _GTM only once */
> -	if ((drive->dn & 1) == 0 || pair == NULL)
> -		ide_acpi_get_timing(hwif);
> +	if (ide_port_acpi(hwif)) {
> +		/* call ACPI _GTM only once */
> +		if ((drive->dn & 1) == 0 || pair == NULL)
> +			ide_acpi_get_timing(hwif);
> +	}
>  
>  	memset(&rqpm, 0, sizeof(rqpm));
>  	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
> @@ -26,9 +28,11 @@ int generic_ide_suspend(struct device *d
>  	ret = blk_execute_rq(drive->queue, NULL, rq, 0);
>  	blk_put_request(rq);
>  
> -	/* call ACPI _PS3 only after both devices are suspended */
> -	if (ret == 0 && ((drive->dn & 1) || pair == NULL))
> -		ide_acpi_set_state(hwif, 0);
> +	if (ret == 0 && ide_port_acpi(hwif)) {
> +		/* call ACPI _PS3 only after both devices are suspended */
> +		if ((drive->dn & 1) || pair == NULL)
> +			ide_acpi_set_state(hwif, 0);
> +	}
>  
>  	return ret;
>  }
> @@ -42,13 +46,15 @@ int generic_ide_resume(struct device *de
>  	struct request_pm_state rqpm;
>  	int err;
>  
> -	/* call ACPI _PS0 / _STM only once */
> -	if ((drive->dn & 1) == 0 || pair == NULL) {
> -		ide_acpi_set_state(hwif, 1);
> -		ide_acpi_push_timing(hwif);
> -	}
> +	if (ide_port_acpi(hwif)) {
> +		/* call ACPI _PS0 / _STM only once */
> +		if ((drive->dn & 1) == 0 || pair == NULL) {
> +			ide_acpi_set_state(hwif, 1);
> +			ide_acpi_push_timing(hwif);
> +		}
>  
> -	ide_acpi_exec_tfs(drive);
> +		ide_acpi_exec_tfs(drive);
> +	}
>  
>  	memset(&rqpm, 0, sizeof(rqpm));
>  	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
> Index: b/include/linux/ide.h
> ===================================================================
> --- a/include/linux/ide.h
> +++ b/include/linux/ide.h
> @@ -1420,6 +1420,7 @@ static inline void ide_dma_unmap_sg(ide_
>  
>  #ifdef CONFIG_BLK_DEV_IDEACPI
>  int ide_acpi_init(void);
> +bool ide_port_acpi(ide_hwif_t *hwif);
>  extern int ide_acpi_exec_tfs(ide_drive_t *drive);
>  extern void ide_acpi_get_timing(ide_hwif_t *hwif);
>  extern void ide_acpi_push_timing(ide_hwif_t *hwif);
> @@ -1428,6 +1429,7 @@ void ide_acpi_port_init_devices(ide_hwif
>  extern void ide_acpi_set_state(ide_hwif_t *hwif, int on);
>  #else
>  static inline int ide_acpi_init(void) { return 0; }
> +static inline bool ide_port_acpi(ide_hwif_t *hwif) { return 0; }
>  static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; }
>  static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; }
>  static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; }
> 


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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE  related)
  2009-06-27  9:04   ` Etienne Basset
@ 2009-06-27 18:09     ` Jeff Chua
  2009-06-27 19:12       ` Jeff Chua
  0 siblings, 1 reply; 8+ messages in thread
From: Jeff Chua @ 2009-06-27 18:09 UTC (permalink / raw)
  To: Etienne Basset
  Cc: Bartlomiej Zolnierkiewicz, davem, Linux Kernel Mailing List,
	Rafael J. Wysocki

On Sat, Jun 27, 2009 at 5:04 PM, Etienne
Basset<etienne.basset@numericable.fr> wrote:
>>> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR

Same problem on Thinkpad X61. STD STR suspended ok. Upon resume,
everything "seems" fine for about 100 seconds. Then mouse, keyboard
frozen.

>>> I tried also 2.6.31-rc1 doesn't work either
>>> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
>>> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
>>
>> Does the following patch fix it?
> Yes, it works now

Works for me too with the patch.

Thanks,
Jeff.


>> ---
>>  drivers/ide/ide-acpi.c |   37 +++++++------------------------------
>>  drivers/ide/ide-pm.c   |   30 ++++++++++++++++++------------
>>  include/linux/ide.h    |    2 ++
>>  3 files changed, 27 insertions(+), 42 deletions(-)
>>
>> Index: b/drivers/ide/ide-acpi.c
>> ===================================================================
>> --- a/drivers/ide/ide-acpi.ch
>> +++ b/drivers/ide/ide-acpi.c
>> @@ -92,6 +92,11 @@ int ide_acpi_init(void)
>>       return 0;
>>  }
>>
>> +bool ide_port_acpi(ide_hwif_t *hwif)
>> +{
>> +     return ide_noacpi == 0 && hwif->acpidata;
>> +}
>> +
>>  /**
>>   * ide_get_dev_handle - finds acpi_handle and PCI device.function
>>   * @dev: device to locate
>> @@ -352,9 +357,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive
>>       unsigned long   gtf_address;
>>       unsigned long   obj_loc;
>>
>> -     if (ide_noacpi)
>> -             return 0;
>> -
>>       DEBPRINT("call get_GTF, drive=%s port=%d\n", drive->name, drive->dn);
>>
>>       ret = do_drive_get_GTF(drive, &gtf_length, &gtf_address, &obj_loc);
>> @@ -389,16 +391,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwi
>>       struct acpi_buffer      output;
>>       union acpi_object       *out_obj;
>>
>> -     if (ide_noacpi)
>> -             return;
>> -
>> -     DEBPRINT("ENTER:\n");
>> -
>> -     if (!hwif->acpidata) {
>> -             DEBPRINT("no ACPI data for %s\n", hwif->name);
>> -             return;
>> -     }
>> -
>>       /* Setting up output buffer for _GTM */
>>       output.length = ACPI_ALLOCATE_BUFFER;
>>       output.pointer = NULL;  /* ACPI-CA sets this; save/free it later */
>> @@ -479,16 +471,6 @@ void ide_acpi_push_timing(ide_hwif_t *hw
>>       struct ide_acpi_drive_link      *master = &hwif->acpidata->master;
>>       struct ide_acpi_drive_link      *slave = &hwif->acpidata->slave;
>>
>> -     if (ide_noacpi)
>> -             return;
>> -
>> -     DEBPRINT("ENTER:\n");
>> -
>> -     if (!hwif->acpidata) {
>> -             DEBPRINT("no ACPI data for %s\n", hwif->name);
>> -             return;
>> -     }
>> -
>>       /* Give the GTM buffer + drive Identify data to the channel via the
>>        * _STM method: */
>>       /* setup input parameters buffer for _STM */
>> @@ -527,16 +509,11 @@ void ide_acpi_set_state(ide_hwif_t *hwif
>>       ide_drive_t *drive;
>>       int i;
>>
>> -     if (ide_noacpi || ide_noacpi_psx)
>> +     if (ide_noacpi_psx)
>>               return;
>>
>>       DEBPRINT("ENTER:\n");
>>
>> -     if (!hwif->acpidata) {
>> -             DEBPRINT("no ACPI data for %s\n", hwif->name);
>> -             return;
>> -     }
>> -
>>       /* channel first and then drives for power on and verse versa for power off */
>>       if (on)
>>               acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0);
>> @@ -616,7 +593,7 @@ void ide_acpi_port_init_devices(ide_hwif
>>                                drive->name, err);
>>       }
>>
>> -     if (!ide_acpionboot) {
>> +     if (ide_noacpi || ide_acpionboot == 0) {
>>               DEBPRINT("ACPI methods disabled on boot\n");
>>               return;
>>       }
>> Index: b/drivers/ide/ide-pm.c
>> ===================================================================
>> --- a/drivers/ide/ide-pm.c
>> +++ b/drivers/ide/ide-pm.c
>> @@ -10,9 +10,11 @@ int generic_ide_suspend(struct device *d
>>       struct request_pm_state rqpm;
>>       int ret;
>>
>> -     /* call ACPI _GTM only once */
>> -     if ((drive->dn & 1) == 0 || pair == NULL)
>> -             ide_acpi_get_timing(hwif);
>> +     if (ide_port_acpi(hwif)) {
>> +             /* call ACPI _GTM only once */
>> +             if ((drive->dn & 1) == 0 || pair == NULL)
>> +                     ide_acpi_get_timing(hwif);
>> +     }
>>
>>       memset(&rqpm, 0, sizeof(rqpm));
>>       rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
>> @@ -26,9 +28,11 @@ int generic_ide_suspend(struct device *d
>>       ret = blk_execute_rq(drive->queue, NULL, rq, 0);
>>       blk_put_request(rq);
>>
>> -     /* call ACPI _PS3 only after both devices are suspended */
>> -     if (ret == 0 && ((drive->dn & 1) || pair == NULL))
>> -             ide_acpi_set_state(hwif, 0);
>> +     if (ret == 0 && ide_port_acpi(hwif)) {
>> +             /* call ACPI _PS3 only after both devices are suspended */
>> +             if ((drive->dn & 1) || pair == NULL)
>> +                     ide_acpi_set_state(hwif, 0);
>> +     }
>>
>>       return ret;
>>  }
>> @@ -42,13 +46,15 @@ int generic_ide_resume(struct device *de
>>       struct request_pm_state rqpm;
>>       int err;
>>
>> -     /* call ACPI _PS0 / _STM only once */
>> -     if ((drive->dn & 1) == 0 || pair == NULL) {
>> -             ide_acpi_set_state(hwif, 1);
>> -             ide_acpi_push_timing(hwif);
>> -     }
>> +     if (ide_port_acpi(hwif)) {
>> +             /* call ACPI _PS0 / _STM only once */
>> +             if ((drive->dn & 1) == 0 || pair == NULL) {
>> +                     ide_acpi_set_state(hwif, 1);
>> +                     ide_acpi_push_timing(hwif);
>> +             }
>>
>> -     ide_acpi_exec_tfs(drive);
>> +             ide_acpi_exec_tfs(drive);
>> +     }
>>
>>       memset(&rqpm, 0, sizeof(rqpm));
>>       rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
>> Index: b/include/linux/ide.h
>> ===================================================================
>> --- a/include/linux/ide.h
>> +++ b/include/linux/ide.h
>> @@ -1420,6 +1420,7 @@ static inline void ide_dma_unmap_sg(ide_
>>
>>  #ifdef CONFIG_BLK_DEV_IDEACPI
>>  int ide_acpi_init(void);
>> +bool ide_port_acpi(ide_hwif_t *hwif);
>>  extern int ide_acpi_exec_tfs(ide_drive_t *drive);
>>  extern void ide_acpi_get_timing(ide_hwif_t *hwif);
>>  extern void ide_acpi_push_timing(ide_hwif_t *hwif);
>> @@ -1428,6 +1429,7 @@ void ide_acpi_port_init_devices(ide_hwif
>>  extern void ide_acpi_set_state(ide_hwif_t *hwif, int on);
>>  #else
>>  static inline int ide_acpi_init(void) { return 0; }
>> +static inline bool ide_port_acpi(ide_hwif_t *hwif) { return 0; }
>>  static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; }
>>  static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; }
>>  static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; }

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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE  related)
  2009-06-27 18:09     ` Jeff Chua
@ 2009-06-27 19:12       ` Jeff Chua
  2009-06-28  8:06         ` Etienne Basset
  0 siblings, 1 reply; 8+ messages in thread
From: Jeff Chua @ 2009-06-27 19:12 UTC (permalink / raw)
  To: Etienne Basset
  Cc: Bartlomiej Zolnierkiewicz, davem, Linux Kernel Mailing List,
	Rafael J. Wysocki

On Sun, Jun 28, 2009 at 2:09 AM, Jeff Chua<jeff.chua.linux@gmail.com> wrote:
> On Sat, Jun 27, 2009 at 5:04 PM, Etienne
> Basset<etienne.basset@numericable.fr> wrote:
>>>> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR
>
> Same problem on Thinkpad X61. STD STR suspended ok. Upon resume,
> everything "seems" fine for about 100 seconds. Then mouse, keyboard
> frozen.
>
>>>> I tried also 2.6.31-rc1 doesn't work either
>>>> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
>>>> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
>>>
>>> Does the following patch fix it?
>> Yes, it works now
>
> Works for me too with the patch.

UPDATE ...

STR able to resume and works after >100 seconds

STD able to resume but failed after 100 seconds (could be 300 seconds)
but eventually failed. Everything seems ok, but mouse and keyboard
just freezed suddenly. Just haven't really time it enough.

Jeff.

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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE  related)
  2009-06-27 19:12       ` Jeff Chua
@ 2009-06-28  8:06         ` Etienne Basset
  2009-06-28  9:35           ` Jeff Chua
  2009-06-28 13:24           ` Bartlomiej Zolnierkiewicz
  0 siblings, 2 replies; 8+ messages in thread
From: Etienne Basset @ 2009-06-28  8:06 UTC (permalink / raw)
  To: Jeff Chua
  Cc: Bartlomiej Zolnierkiewicz, davem, Linux Kernel Mailing List,
	Rafael J. Wysocki

Jeff Chua wrote:
> On Sun, Jun 28, 2009 at 2:09 AM, Jeff Chua<jeff.chua.linux@gmail.com> wrote:
>> On Sat, Jun 27, 2009 at 5:04 PM, Etienne
>> Basset<etienne.basset@numericable.fr> wrote:
>>>>> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR
>> Same problem on Thinkpad X61. STD STR suspended ok. Upon resume,
>> everything "seems" fine for about 100 seconds. Then mouse, keyboard
>> frozen.
>>
>>>>> I tried also 2.6.31-rc1 doesn't work either
>>>>> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
>>>>> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
>>>> Does the following patch fix it?
>>> Yes, it works now
>> Works for me too with the patch.
> 
> UPDATE ...
> 
> STR able to resume and works after >100 seconds
> 
> STD able to resume but failed after 100 seconds (could be 300 seconds)
> but eventually failed. Everything seems ok, but mouse and keyboard
> just freezed suddenly. Just haven't really time it enough.
> 
> Jeff.
> 
Hello,

same here ; after resume, computer hangs after 2minutes (cannot ping from outside)
and STR/resume doesn't work if I try from console not from X
there must be at least one another bug lurking
If someone hasn't a better idea I'll try another bisection, applying bart's patch at each step

Etienne



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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE  related)
  2009-06-28  8:06         ` Etienne Basset
@ 2009-06-28  9:35           ` Jeff Chua
  2009-06-28 13:24           ` Bartlomiej Zolnierkiewicz
  1 sibling, 0 replies; 8+ messages in thread
From: Jeff Chua @ 2009-06-28  9:35 UTC (permalink / raw)
  To: Etienne Basset
  Cc: Bartlomiej Zolnierkiewicz, davem, Linux Kernel Mailing List,
	Rafael J. Wysocki

On Sun, Jun 28, 2009 at 4:06 PM, Etienne
Basset<etienne.basset@numericable.fr> wrote:
> same here ; after resume, computer hangs after 2minutes (cannot ping from outside)
> and STR/resume doesn't work if I try from console not from X
> there must be at least one another bug lurking
> If someone hasn't a better idea I'll try another bisection, applying bart's patch at each step

The patch seems to help, but I got a few hangs from STR still.

Jeff.

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

* Re: [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE   related)
  2009-06-28  8:06         ` Etienne Basset
  2009-06-28  9:35           ` Jeff Chua
@ 2009-06-28 13:24           ` Bartlomiej Zolnierkiewicz
  1 sibling, 0 replies; 8+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2009-06-28 13:24 UTC (permalink / raw)
  To: Etienne Basset
  Cc: Jeff Chua, davem, Linux Kernel Mailing List, Rafael J. Wysocki

On Sunday 28 June 2009 10:06:02 Etienne Basset wrote:
> Jeff Chua wrote:
> > On Sun, Jun 28, 2009 at 2:09 AM, Jeff Chua<jeff.chua.linux@gmail.com> wrote:
> >> On Sat, Jun 27, 2009 at 5:04 PM, Etienne
> >> Basset<etienne.basset@numericable.fr> wrote:
> >>>>> kernel v2.6.29 suspends to RAM reliably on my computer; v2.6.30 doesn't resume after STR
> >> Same problem on Thinkpad X61. STD STR suspended ok. Upon resume,
> >> everything "seems" fine for about 100 seconds. Then mouse, keyboard
> >> frozen.
> >>
> >>>>> I tried also 2.6.31-rc1 doesn't work either
> >>>>> etienne@etienne-desktop:~/linux-2.6$ git bisect bad
> >>>>> 2f0d0fd2a605666d38e290c5c0d2907484352dc4 is first bad commit
> >>>> Does the following patch fix it?
> >>> Yes, it works now
> >> Works for me too with the patch.

Thanks for testing (also sorry for the problem, hopefully the fix will
prevent any similar issues in the future).

> > UPDATE ...
> > 
> > STR able to resume and works after >100 seconds
> > 
> > STD able to resume but failed after 100 seconds (could be 300 seconds)
> > but eventually failed. Everything seems ok, but mouse and keyboard
> > just freezed suddenly. Just haven't really time it enough.
> > 
> > Jeff.
> > 
> Hello,
> 
> same here ; after resume, computer hangs after 2minutes (cannot ping from outside)
> and STR/resume doesn't work if I try from console not from X
> there must be at least one another bug lurking
> If someone hasn't a better idea I'll try another bisection, applying bart's patch at each step

I think that you're right.  It seems that the underlying issue could be
a non-working/broken ACPI support (please note that the IDE ACPI bug won't
be triggered otherwise).

David, please apply:

From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Subject: [PATCH] ide: fix resume for CONFIG_BLK_DEV_IDEACPI=y

commit 2f0d0fd2a605666d38e290c5c0d2907484352dc4 ("ide-acpi: cleanup
do_drive_get_GTF()") didn't account for the lack of hwif->acpidata
check in generic_ide_suspend() [ indirect user of do_drive_get_GTF()
through ide_acpi_exec_tfs() ] resulting in broken resume when ACPI
support is enabled but ACPI data is unavailable.

Fix it by adding ide_port_acpi() helper for checking if port needs
ACPI handling and cleaning generic_ide_{suspend,resume}() to use it
instead of hiding hwif->acpidata and ide_noacpi checks in IDE ACPI
helpers (this should help in preventing similar bugs in the future).

While at it:
- kill superfluous debugging printks in ide_acpi_{get,push}_timing()

Reported-and-tested-by: Etienne Basset <etienne.basset@numericable.fr>
Also-reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: stable@kernel.org
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
---
Added patch description, the patch itself remains unchanged.

 drivers/ide/ide-acpi.c |   37 +++++++------------------------------
 drivers/ide/ide-pm.c   |   30 ++++++++++++++++++------------
 include/linux/ide.h    |    2 ++
 3 files changed, 27 insertions(+), 42 deletions(-)

Index: b/drivers/ide/ide-acpi.c
===================================================================
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -92,6 +92,11 @@ int ide_acpi_init(void)
 	return 0;
 }
 
+bool ide_port_acpi(ide_hwif_t *hwif)
+{
+	return ide_noacpi == 0 && hwif->acpidata;
+}
+
 /**
  * ide_get_dev_handle - finds acpi_handle and PCI device.function
  * @dev: device to locate
@@ -352,9 +357,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive
 	unsigned long	gtf_address;
 	unsigned long	obj_loc;
 
-	if (ide_noacpi)
-		return 0;
-
 	DEBPRINT("call get_GTF, drive=%s port=%d\n", drive->name, drive->dn);
 
 	ret = do_drive_get_GTF(drive, &gtf_length, &gtf_address, &obj_loc);
@@ -389,16 +391,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwi
 	struct acpi_buffer	output;
 	union acpi_object 	*out_obj;
 
-	if (ide_noacpi)
-		return;
-
-	DEBPRINT("ENTER:\n");
-
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* Setting up output buffer for _GTM */
 	output.length = ACPI_ALLOCATE_BUFFER;
 	output.pointer = NULL;	/* ACPI-CA sets this; save/free it later */
@@ -479,16 +471,6 @@ void ide_acpi_push_timing(ide_hwif_t *hw
 	struct ide_acpi_drive_link	*master = &hwif->acpidata->master;
 	struct ide_acpi_drive_link	*slave = &hwif->acpidata->slave;
 
-	if (ide_noacpi)
-		return;
-
-	DEBPRINT("ENTER:\n");
-
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* Give the GTM buffer + drive Identify data to the channel via the
 	 * _STM method: */
 	/* setup input parameters buffer for _STM */
@@ -527,16 +509,11 @@ void ide_acpi_set_state(ide_hwif_t *hwif
 	ide_drive_t *drive;
 	int i;
 
-	if (ide_noacpi || ide_noacpi_psx)
+	if (ide_noacpi_psx)
 		return;
 
 	DEBPRINT("ENTER:\n");
 
-	if (!hwif->acpidata) {
-		DEBPRINT("no ACPI data for %s\n", hwif->name);
-		return;
-	}
-
 	/* channel first and then drives for power on and verse versa for power off */
 	if (on)
 		acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0);
@@ -616,7 +593,7 @@ void ide_acpi_port_init_devices(ide_hwif
 				 drive->name, err);
 	}
 
-	if (!ide_acpionboot) {
+	if (ide_noacpi || ide_acpionboot == 0) {
 		DEBPRINT("ACPI methods disabled on boot\n");
 		return;
 	}
Index: b/drivers/ide/ide-pm.c
===================================================================
--- a/drivers/ide/ide-pm.c
+++ b/drivers/ide/ide-pm.c
@@ -10,9 +10,11 @@ int generic_ide_suspend(struct device *d
 	struct request_pm_state rqpm;
 	int ret;
 
-	/* call ACPI _GTM only once */
-	if ((drive->dn & 1) == 0 || pair == NULL)
-		ide_acpi_get_timing(hwif);
+	if (ide_port_acpi(hwif)) {
+		/* call ACPI _GTM only once */
+		if ((drive->dn & 1) == 0 || pair == NULL)
+			ide_acpi_get_timing(hwif);
+	}
 
 	memset(&rqpm, 0, sizeof(rqpm));
 	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
@@ -26,9 +28,11 @@ int generic_ide_suspend(struct device *d
 	ret = blk_execute_rq(drive->queue, NULL, rq, 0);
 	blk_put_request(rq);
 
-	/* call ACPI _PS3 only after both devices are suspended */
-	if (ret == 0 && ((drive->dn & 1) || pair == NULL))
-		ide_acpi_set_state(hwif, 0);
+	if (ret == 0 && ide_port_acpi(hwif)) {
+		/* call ACPI _PS3 only after both devices are suspended */
+		if ((drive->dn & 1) || pair == NULL)
+			ide_acpi_set_state(hwif, 0);
+	}
 
 	return ret;
 }
@@ -42,13 +46,15 @@ int generic_ide_resume(struct device *de
 	struct request_pm_state rqpm;
 	int err;
 
-	/* call ACPI _PS0 / _STM only once */
-	if ((drive->dn & 1) == 0 || pair == NULL) {
-		ide_acpi_set_state(hwif, 1);
-		ide_acpi_push_timing(hwif);
-	}
+	if (ide_port_acpi(hwif)) {
+		/* call ACPI _PS0 / _STM only once */
+		if ((drive->dn & 1) == 0 || pair == NULL) {
+			ide_acpi_set_state(hwif, 1);
+			ide_acpi_push_timing(hwif);
+		}
 
-	ide_acpi_exec_tfs(drive);
+		ide_acpi_exec_tfs(drive);
+	}
 
 	memset(&rqpm, 0, sizeof(rqpm));
 	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -1420,6 +1420,7 @@ static inline void ide_dma_unmap_sg(ide_
 
 #ifdef CONFIG_BLK_DEV_IDEACPI
 int ide_acpi_init(void);
+bool ide_port_acpi(ide_hwif_t *hwif);
 extern int ide_acpi_exec_tfs(ide_drive_t *drive);
 extern void ide_acpi_get_timing(ide_hwif_t *hwif);
 extern void ide_acpi_push_timing(ide_hwif_t *hwif);
@@ -1428,6 +1429,7 @@ void ide_acpi_port_init_devices(ide_hwif
 extern void ide_acpi_set_state(ide_hwif_t *hwif, int on);
 #else
 static inline int ide_acpi_init(void) { return 0; }
+static inline bool ide_port_acpi(ide_hwif_t *hwif) { return 0; }
 static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; }
 static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; }
 static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; }

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

end of thread, other threads:[~2009-06-28 13:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-26 15:40 [REGRESSION] 2.6.29=>2.6.30 suspend to ram regression (IDE related) Etienne Basset
2009-06-26 19:39 ` Bartlomiej Zolnierkiewicz
2009-06-27  9:04   ` Etienne Basset
2009-06-27 18:09     ` Jeff Chua
2009-06-27 19:12       ` Jeff Chua
2009-06-28  8:06         ` Etienne Basset
2009-06-28  9:35           ` Jeff Chua
2009-06-28 13:24           ` Bartlomiej Zolnierkiewicz

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