From: Randy Dunlap <[email protected]>
Save and free the correct acpi_object pointer.
Signed-off-by: Randy Dunlap <[email protected]>
---
drivers/scsi/libata-acpi.c | 14 +++++++++-----
drivers/scsi/libata.h | 6 ++++--
2 files changed, 13 insertions(+), 7 deletions(-)
--- linux-2615-mm4.orig/drivers/scsi/libata-acpi.c
+++ linux-2615-mm4/drivers/scsi/libata-acpi.c
@@ -302,7 +302,8 @@ EXPORT_SYMBOL_GPL(ata_acpi_push_id);
* function return value is 0.
*/
int do_drive_get_GTF(struct ata_port *ap, struct ata_device *atadev,
- unsigned int *gtf_length, unsigned long *gtf_address)
+ unsigned int *gtf_length, unsigned long *gtf_address,
+ unsigned long *obj_loc)
{
acpi_status status;
acpi_handle handle;
@@ -321,6 +322,7 @@ int do_drive_get_GTF(struct ata_port *ap
*gtf_length = 0;
*gtf_address = 0UL;
+ *obj_loc = 0UL;
if (noacpi)
return 0;
@@ -414,10 +416,11 @@ int do_drive_get_GTF(struct ata_port *ap
*gtf_length = out_obj->buffer.length;
*gtf_address = (unsigned long)out_obj->buffer.pointer;
+ *obj_loc = (unsigned long)out_obj;
if (ata_msg_probe(ap))
printk(KERN_DEBUG "%s: returning "
- "gtf_length=%d, gtf_address=0x%lx\n",
- __FUNCTION__, *gtf_length, *gtf_address);
+ "gtf_length=%d, gtf_address=0x%lx, obj_loc=0x%lx\n",
+ __FUNCTION__, *gtf_length, *gtf_address, *obj_loc);
err = 0;
out:
return err;
@@ -558,6 +561,7 @@ int ata_acpi_exec_tfs(struct ata_port *a
int ret;
unsigned int gtf_length;
unsigned long gtf_address;
+ unsigned long obj_loc;
if (ata_msg_probe(ap))
printk(KERN_DEBUG "%s: ENTER:\n", __FUNCTION__);
@@ -570,7 +574,7 @@ int ata_acpi_exec_tfs(struct ata_port *a
printk(KERN_DEBUG "%s: call get_GTF, ix=%d\n",
__FUNCTION__, ix);
ret = do_drive_get_GTF(ap, &ap->device[ix],
- >f_length, >f_address);
+ >f_length, >f_address, &obj_loc);
if (ret < 0) {
if (ata_msg_probe(ap))
printk(KERN_DEBUG "%s: get_GTF error (%d)\n",
@@ -583,7 +587,7 @@ int ata_acpi_exec_tfs(struct ata_port *a
__FUNCTION__, ix);
ret = do_drive_set_taskfiles(ap, &ap->device[ix],
gtf_length, gtf_address);
- acpi_os_free((void *)gtf_address);
+ acpi_os_free((void *)obj_loc);
if (ret < 0) {
if (ata_msg_probe(ap))
printk(KERN_DEBUG
--- linux-2615-mm4.orig/drivers/scsi/libata.h
+++ linux-2615-mm4/drivers/scsi/libata.h
@@ -64,7 +64,8 @@ extern unsigned int ata_exec_internal(st
#ifdef CONFIG_SCSI_SATA_ACPI
extern int ata_acpi_push_id(struct ata_port *ap, unsigned int ix);
extern int do_drive_get_GTF(struct ata_port *ap, struct ata_device *atadev,
- unsigned int *gtf_length, unsigned long *gtf_address);
+ unsigned int *gtf_length, unsigned long *gtf_address,
+ unsigned long *obj_loc);
extern int do_drive_set_taskfiles(struct ata_port *ap, struct ata_device *atadev,
unsigned int gtf_length, unsigned long gtf_address);
extern int ata_acpi_exec_tfs(struct ata_port *ap);
@@ -75,7 +76,8 @@ static inline int ata_acpi_push_id(struc
}
static inline int do_drive_get_GTF(struct ata_port *ap,
struct ata_device *atadev,
- unsigned int *gtf_length, unsigned long *gtf_address)
+ unsigned int *gtf_length, unsigned long *gtf_address,
+ unsigned long *obj_loc)
{
return 0;
}
---
~Randy [MPG MPAD MSAE SSA]