diff options
-rw-r--r-- | drivers/ata/libata-acpi.c | 369 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 3 | ||||
-rw-r--r-- | drivers/ata/libata.h | 2 | ||||
-rw-r--r-- | include/linux/libata.h | 13 |
4 files changed, 63 insertions, 324 deletions
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 02236739b40f..eda4263b4017 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -24,10 +24,8 @@ | |||
24 | #include <acpi/acmacros.h> | 24 | #include <acpi/acmacros.h> |
25 | #include <acpi/actypes.h> | 25 | #include <acpi/actypes.h> |
26 | 26 | ||
27 | #define SATA_ROOT_PORT(x) (((x) >> 16) & 0xffff) | ||
28 | #define SATA_PORT_NUMBER(x) ((x) & 0xffff) /* or NO_PORT_MULT */ | ||
29 | #define NO_PORT_MULT 0xffff | 27 | #define NO_PORT_MULT 0xffff |
30 | #define SATA_ADR_RSVD 0xffffffff | 28 | #define SATA_ADR(root,pmp) (((root) << 16) | (pmp)) |
31 | 29 | ||
32 | #define REGS_PER_GTF 7 | 30 | #define REGS_PER_GTF 7 |
33 | struct taskfile_array { | 31 | struct taskfile_array { |
@@ -42,230 +40,64 @@ static int is_pci_dev(struct device *dev) | |||
42 | return (dev->bus == &pci_bus_type); | 40 | return (dev->bus == &pci_bus_type); |
43 | } | 41 | } |
44 | 42 | ||
45 | /** | 43 | static void ata_acpi_associate_sata_port(struct ata_port *ap) |
46 | * sata_get_dev_handle - finds acpi_handle and PCI device.function | ||
47 | * @dev: device to locate | ||
48 | * @handle: returned acpi_handle for @dev | ||
49 | * @pcidevfn: return PCI device.func for @dev | ||
50 | * | ||
51 | * This function is somewhat SATA-specific. Or at least the | ||
52 | * PATA & SATA versions of this function are different, | ||
53 | * so it's not entirely generic code. | ||
54 | * | ||
55 | * Returns 0 on success, <0 on error. | ||
56 | */ | ||
57 | static int sata_get_dev_handle(struct device *dev, acpi_handle *handle, | ||
58 | acpi_integer *pcidevfn) | ||
59 | { | 44 | { |
60 | struct pci_dev *pci_dev; | 45 | acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); |
61 | acpi_integer addr; | 46 | |
62 | 47 | ap->device->acpi_handle = acpi_get_child(ap->host->acpi_handle, adr); | |
63 | if (!is_pci_dev(dev)) | ||
64 | return -ENODEV; | ||
65 | |||
66 | pci_dev = to_pci_dev(dev); /* NOTE: PCI-specific */ | ||
67 | /* Please refer to the ACPI spec for the syntax of _ADR. */ | ||
68 | addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); | ||
69 | *pcidevfn = addr; | ||
70 | *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); | ||
71 | if (!*handle) | ||
72 | return -ENODEV; | ||
73 | return 0; | ||
74 | } | 48 | } |
75 | 49 | ||
76 | /** | 50 | static void ata_acpi_associate_ide_port(struct ata_port *ap) |
77 | * pata_get_dev_handle - finds acpi_handle and PCI device.function | ||
78 | * @dev: device to locate | ||
79 | * @handle: returned acpi_handle for @dev | ||
80 | * @pcidevfn: return PCI device.func for @dev | ||
81 | * | ||
82 | * The PATA and SATA versions of this function are different. | ||
83 | * | ||
84 | * Returns 0 on success, <0 on error. | ||
85 | */ | ||
86 | static int pata_get_dev_handle(struct device *dev, acpi_handle *handle, | ||
87 | acpi_integer *pcidevfn) | ||
88 | { | 51 | { |
89 | unsigned int bus, devnum, func; | 52 | int max_devices, i; |
90 | acpi_integer addr; | ||
91 | acpi_handle dev_handle, parent_handle; | ||
92 | struct acpi_buffer buffer = {.length = ACPI_ALLOCATE_BUFFER, | ||
93 | .pointer = NULL}; | ||
94 | acpi_status status; | ||
95 | struct acpi_device_info *dinfo = NULL; | ||
96 | int ret = -ENODEV; | ||
97 | struct pci_dev *pdev; | ||
98 | |||
99 | if (!is_pci_dev(dev)) | ||
100 | return -ENODEV; | ||
101 | |||
102 | pdev = to_pci_dev(dev); | ||
103 | |||
104 | bus = pdev->bus->number; | ||
105 | devnum = PCI_SLOT(pdev->devfn); | ||
106 | func = PCI_FUNC(pdev->devfn); | ||
107 | |||
108 | dev_handle = DEVICE_ACPI_HANDLE(dev); | ||
109 | parent_handle = DEVICE_ACPI_HANDLE(dev->parent); | ||
110 | |||
111 | status = acpi_get_object_info(parent_handle, &buffer); | ||
112 | if (ACPI_FAILURE(status)) | ||
113 | goto err; | ||
114 | |||
115 | dinfo = buffer.pointer; | ||
116 | if (dinfo && (dinfo->valid & ACPI_VALID_ADR) && | ||
117 | dinfo->address == bus) { | ||
118 | /* ACPI spec for _ADR for PCI bus: */ | ||
119 | addr = (acpi_integer)(devnum << 16 | func); | ||
120 | *pcidevfn = addr; | ||
121 | *handle = dev_handle; | ||
122 | } else { | ||
123 | goto err; | ||
124 | } | ||
125 | 53 | ||
126 | if (!*handle) | 54 | ap->acpi_handle = acpi_get_child(ap->host->acpi_handle, ap->port_no); |
127 | goto err; | 55 | if (!ap->acpi_handle) |
128 | ret = 0; | 56 | return; |
129 | err: | ||
130 | kfree(dinfo); | ||
131 | return ret; | ||
132 | } | ||
133 | |||
134 | struct walk_info { /* can be trimmed some */ | ||
135 | struct device *dev; | ||
136 | struct acpi_device *adev; | ||
137 | acpi_handle handle; | ||
138 | acpi_integer pcidevfn; | ||
139 | unsigned int drivenum; | ||
140 | acpi_handle obj_handle; | ||
141 | struct ata_port *ataport; | ||
142 | struct ata_device *atadev; | ||
143 | u32 sata_adr; | ||
144 | int status; | ||
145 | char basepath[ACPI_PATHNAME_MAX]; | ||
146 | int basepath_len; | ||
147 | }; | ||
148 | 57 | ||
149 | static acpi_status get_devices(acpi_handle handle, | 58 | max_devices = 1; |
150 | u32 level, void *context, void **return_value) | 59 | if (ap->flags & ATA_FLAG_SLAVE_POSS) |
151 | { | 60 | max_devices++; |
152 | acpi_status status; | ||
153 | struct walk_info *winfo = context; | ||
154 | struct acpi_buffer namebuf = {ACPI_ALLOCATE_BUFFER, NULL}; | ||
155 | char *pathname; | ||
156 | struct acpi_buffer buffer; | ||
157 | struct acpi_device_info *dinfo; | ||
158 | |||
159 | status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &namebuf); | ||
160 | if (status) | ||
161 | goto ret; | ||
162 | pathname = namebuf.pointer; | ||
163 | |||
164 | buffer.length = ACPI_ALLOCATE_BUFFER; | ||
165 | buffer.pointer = NULL; | ||
166 | status = acpi_get_object_info(handle, &buffer); | ||
167 | if (ACPI_FAILURE(status)) | ||
168 | goto out2; | ||
169 | |||
170 | dinfo = buffer.pointer; | ||
171 | |||
172 | /* find full device path name for pcidevfn */ | ||
173 | if (dinfo && (dinfo->valid & ACPI_VALID_ADR) && | ||
174 | dinfo->address == winfo->pcidevfn) { | ||
175 | if (ata_msg_probe(winfo->ataport)) | ||
176 | ata_dev_printk(winfo->atadev, KERN_DEBUG, | ||
177 | ":%s: matches pcidevfn (0x%llx)\n", | ||
178 | pathname, winfo->pcidevfn); | ||
179 | strlcpy(winfo->basepath, pathname, | ||
180 | sizeof(winfo->basepath)); | ||
181 | winfo->basepath_len = strlen(pathname); | ||
182 | goto out; | ||
183 | } | ||
184 | 61 | ||
185 | /* if basepath is not yet known, ignore this object */ | 62 | for (i = 0; i < max_devices; i++) { |
186 | if (!winfo->basepath_len) | 63 | struct ata_device *dev = &ap->device[i]; |
187 | goto out; | ||
188 | 64 | ||
189 | /* if this object is in scope of basepath, maybe use it */ | 65 | dev->acpi_handle = acpi_get_child(ap->acpi_handle, i); |
190 | if (strncmp(pathname, winfo->basepath, | ||
191 | winfo->basepath_len) == 0) { | ||
192 | if (!(dinfo->valid & ACPI_VALID_ADR)) | ||
193 | goto out; | ||
194 | if (ata_msg_probe(winfo->ataport)) | ||
195 | ata_dev_printk(winfo->atadev, KERN_DEBUG, | ||
196 | "GOT ONE: (%s) root_port = 0x%llx," | ||
197 | " port_num = 0x%llx\n", pathname, | ||
198 | SATA_ROOT_PORT(dinfo->address), | ||
199 | SATA_PORT_NUMBER(dinfo->address)); | ||
200 | /* heuristics: */ | ||
201 | if (SATA_PORT_NUMBER(dinfo->address) != NO_PORT_MULT) | ||
202 | if (ata_msg_probe(winfo->ataport)) | ||
203 | ata_dev_printk(winfo->atadev, | ||
204 | KERN_DEBUG, "warning: don't" | ||
205 | " know how to handle SATA port" | ||
206 | " multiplier\n"); | ||
207 | if (SATA_ROOT_PORT(dinfo->address) == | ||
208 | winfo->ataport->port_no && | ||
209 | SATA_PORT_NUMBER(dinfo->address) == NO_PORT_MULT) { | ||
210 | if (ata_msg_probe(winfo->ataport)) | ||
211 | ata_dev_printk(winfo->atadev, | ||
212 | KERN_DEBUG, | ||
213 | "THIS ^^^^^ is the requested" | ||
214 | " SATA drive (handle = 0x%p)\n", | ||
215 | handle); | ||
216 | winfo->sata_adr = dinfo->address; | ||
217 | winfo->obj_handle = handle; | ||
218 | } | ||
219 | } | 66 | } |
220 | out: | ||
221 | kfree(dinfo); | ||
222 | out2: | ||
223 | kfree(pathname); | ||
224 | |||
225 | ret: | ||
226 | return status; | ||
227 | } | 67 | } |
228 | 68 | ||
229 | /* Get the SATA drive _ADR object. */ | 69 | /** |
230 | static int get_sata_adr(struct device *dev, acpi_handle handle, | 70 | * ata_acpi_associate - associate ATA host with ACPI objects |
231 | acpi_integer pcidevfn, unsigned int drive, | 71 | * @host: target ATA host |
232 | struct ata_port *ap, | 72 | * |
233 | struct ata_device *atadev, u32 *dev_adr) | 73 | * Look up ACPI objects associated with @host and initialize |
74 | * acpi_handle fields of @host, its ports and devices accordingly. | ||
75 | * | ||
76 | * LOCKING: | ||
77 | * EH context. | ||
78 | * | ||
79 | * RETURNS: | ||
80 | * 0 on success, -errno on failure. | ||
81 | */ | ||
82 | void ata_acpi_associate(struct ata_host *host) | ||
234 | { | 83 | { |
235 | acpi_status status; | 84 | int i; |
236 | struct walk_info *winfo; | ||
237 | int err = -ENOMEM; | ||
238 | 85 | ||
239 | winfo = kzalloc(sizeof(struct walk_info), GFP_KERNEL); | 86 | if (!is_pci_dev(host->dev) || libata_noacpi) |
240 | if (!winfo) | 87 | return; |
241 | goto out; | ||
242 | 88 | ||
243 | winfo->dev = dev; | 89 | host->acpi_handle = DEVICE_ACPI_HANDLE(host->dev); |
244 | winfo->atadev = atadev; | 90 | if (!host->acpi_handle) |
245 | winfo->ataport = ap; | 91 | return; |
246 | if (acpi_bus_get_device(handle, &winfo->adev) < 0) | ||
247 | if (ata_msg_probe(ap)) | ||
248 | ata_dev_printk(winfo->atadev, KERN_DEBUG, | ||
249 | "acpi_bus_get_device failed\n"); | ||
250 | winfo->handle = handle; | ||
251 | winfo->pcidevfn = pcidevfn; | ||
252 | winfo->drivenum = drive; | ||
253 | 92 | ||
254 | status = acpi_get_devices(NULL, get_devices, winfo, NULL); | 93 | for (i = 0; i < host->n_ports; i++) { |
255 | if (ACPI_FAILURE(status)) { | 94 | struct ata_port *ap = host->ports[i]; |
256 | if (ata_msg_probe(ap)) | 95 | |
257 | ata_dev_printk(winfo->atadev, KERN_DEBUG, | 96 | if (host->ports[0]->flags & ATA_FLAG_ACPI_SATA) |
258 | "%s: acpi_get_devices failed\n", | 97 | ata_acpi_associate_sata_port(ap); |
259 | __FUNCTION__); | 98 | else |
260 | err = -ENODEV; | 99 | ata_acpi_associate_ide_port(ap); |
261 | } else { | ||
262 | *dev_adr = winfo->sata_adr; | ||
263 | atadev->obj_handle = winfo->obj_handle; | ||
264 | err = 0; | ||
265 | } | 100 | } |
266 | kfree(winfo); | ||
267 | out: | ||
268 | return err; | ||
269 | } | 101 | } |
270 | 102 | ||
271 | /** | 103 | /** |
@@ -290,20 +122,15 @@ static int do_drive_get_GTF(struct ata_device *dev, unsigned int *gtf_length, | |||
290 | { | 122 | { |
291 | struct ata_port *ap = dev->ap; | 123 | struct ata_port *ap = dev->ap; |
292 | acpi_status status; | 124 | acpi_status status; |
293 | acpi_handle dev_handle = NULL; | ||
294 | acpi_handle chan_handle, drive_handle; | ||
295 | acpi_integer pcidevfn = 0; | ||
296 | u32 dev_adr; | ||
297 | struct acpi_buffer output; | 125 | struct acpi_buffer output; |
298 | union acpi_object *out_obj; | 126 | union acpi_object *out_obj; |
299 | struct device *gdev = ap->host->dev; | ||
300 | int err = -ENODEV; | 127 | int err = -ENODEV; |
301 | 128 | ||
302 | *gtf_length = 0; | 129 | *gtf_length = 0; |
303 | *gtf_address = 0UL; | 130 | *gtf_address = 0UL; |
304 | *obj_loc = 0UL; | 131 | *obj_loc = 0UL; |
305 | 132 | ||
306 | if (libata_noacpi) | 133 | if (!dev->acpi_handle) |
307 | return 0; | 134 | return 0; |
308 | 135 | ||
309 | if (ata_msg_probe(ap)) | 136 | if (ata_msg_probe(ap)) |
@@ -319,78 +146,14 @@ static int do_drive_get_GTF(struct ata_device *dev, unsigned int *gtf_length, | |||
319 | goto out; | 146 | goto out; |
320 | } | 147 | } |
321 | 148 | ||
322 | /* Don't continue if device has no _ADR method. | ||
323 | * _GTF is intended for known motherboard devices. */ | ||
324 | if (!(ap->flags & ATA_FLAG_ACPI_SATA)) { | ||
325 | err = pata_get_dev_handle(gdev, &dev_handle, &pcidevfn); | ||
326 | if (err < 0) { | ||
327 | if (ata_msg_probe(ap)) | ||
328 | ata_dev_printk(dev, KERN_DEBUG, | ||
329 | "%s: pata_get_dev_handle failed (%d)\n", | ||
330 | __FUNCTION__, err); | ||
331 | goto out; | ||
332 | } | ||
333 | } else { | ||
334 | err = sata_get_dev_handle(gdev, &dev_handle, &pcidevfn); | ||
335 | if (err < 0) { | ||
336 | if (ata_msg_probe(ap)) | ||
337 | ata_dev_printk(dev, KERN_DEBUG, | ||
338 | "%s: sata_get_dev_handle failed (%d\n", | ||
339 | __FUNCTION__, err); | ||
340 | goto out; | ||
341 | } | ||
342 | } | ||
343 | |||
344 | /* Get this drive's _ADR info. if not already known. */ | ||
345 | if (!dev->obj_handle) { | ||
346 | if (!(ap->flags & ATA_FLAG_ACPI_SATA)) { | ||
347 | /* get child objects of dev_handle == channel objects, | ||
348 | * + _their_ children == drive objects */ | ||
349 | /* channel is ap->port_no */ | ||
350 | chan_handle = acpi_get_child(dev_handle, | ||
351 | ap->port_no); | ||
352 | if (ata_msg_probe(ap)) | ||
353 | ata_dev_printk(dev, KERN_DEBUG, | ||
354 | "%s: chan adr=%d: chan_handle=0x%p\n", | ||
355 | __FUNCTION__, ap->port_no, | ||
356 | chan_handle); | ||
357 | if (!chan_handle) { | ||
358 | err = -ENODEV; | ||
359 | goto out; | ||
360 | } | ||
361 | /* TBD: could also check ACPI object VALID bits */ | ||
362 | drive_handle = acpi_get_child(chan_handle, dev->devno); | ||
363 | if (!drive_handle) { | ||
364 | err = -ENODEV; | ||
365 | goto out; | ||
366 | } | ||
367 | dev_adr = dev->devno; | ||
368 | dev->obj_handle = drive_handle; | ||
369 | } else { /* for SATA mode */ | ||
370 | dev_adr = SATA_ADR_RSVD; | ||
371 | err = get_sata_adr(gdev, dev_handle, pcidevfn, 0, | ||
372 | ap, dev, &dev_adr); | ||
373 | } | ||
374 | if (err < 0 || dev_adr == SATA_ADR_RSVD || | ||
375 | !dev->obj_handle) { | ||
376 | if (ata_msg_probe(ap)) | ||
377 | ata_dev_printk(dev, KERN_DEBUG, | ||
378 | "%s: get_sata/pata_adr failed: " | ||
379 | "err=%d, dev_adr=%u, obj_handle=0x%p\n", | ||
380 | __FUNCTION__, err, dev_adr, | ||
381 | dev->obj_handle); | ||
382 | goto out; | ||
383 | } | ||
384 | } | ||
385 | |||
386 | /* Setting up output buffer */ | 149 | /* Setting up output buffer */ |
387 | output.length = ACPI_ALLOCATE_BUFFER; | 150 | output.length = ACPI_ALLOCATE_BUFFER; |
388 | output.pointer = NULL; /* ACPI-CA sets this; save/free it later */ | 151 | output.pointer = NULL; /* ACPI-CA sets this; save/free it later */ |
389 | 152 | ||
390 | /* _GTF has no input parameters */ | 153 | /* _GTF has no input parameters */ |
391 | err = -EIO; | 154 | err = -EIO; |
392 | status = acpi_evaluate_object(dev->obj_handle, "_GTF", | 155 | status = acpi_evaluate_object(dev->acpi_handle, "_GTF", |
393 | NULL, &output); | 156 | NULL, &output); |
394 | if (ACPI_FAILURE(status)) { | 157 | if (ACPI_FAILURE(status)) { |
395 | if (ata_msg_probe(ap)) | 158 | if (ata_msg_probe(ap)) |
396 | ata_dev_printk(dev, KERN_DEBUG, | 159 | ata_dev_printk(dev, KERN_DEBUG, |
@@ -528,7 +291,7 @@ static int do_drive_set_taskfiles(struct ata_device *dev, | |||
528 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER: port#: %d\n", | 291 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER: port#: %d\n", |
529 | __FUNCTION__, ap->port_no); | 292 | __FUNCTION__, ap->port_no); |
530 | 293 | ||
531 | if (libata_noacpi || !(ap->flags & ATA_FLAG_ACPI_SATA)) | 294 | if (!(ap->flags & ATA_FLAG_ACPI_SATA)) |
532 | return 0; | 295 | return 0; |
533 | 296 | ||
534 | if (!ata_dev_enabled(dev) || (ap->flags & ATA_FLAG_DISABLED)) | 297 | if (!ata_dev_enabled(dev) || (ap->flags & ATA_FLAG_DISABLED)) |
@@ -571,8 +334,6 @@ int ata_acpi_exec_tfs(struct ata_port *ap) | |||
571 | unsigned long gtf_address; | 334 | unsigned long gtf_address; |
572 | unsigned long obj_loc; | 335 | unsigned long obj_loc; |
573 | 336 | ||
574 | if (libata_noacpi) | ||
575 | return 0; | ||
576 | /* | 337 | /* |
577 | * TBD - implement PATA support. For now, | 338 | * TBD - implement PATA support. For now, |
578 | * we should not run GTF on PATA devices since some | 339 | * we should not run GTF on PATA devices since some |
@@ -624,16 +385,12 @@ int ata_acpi_exec_tfs(struct ata_port *ap) | |||
624 | int ata_acpi_push_id(struct ata_device *dev) | 385 | int ata_acpi_push_id(struct ata_device *dev) |
625 | { | 386 | { |
626 | struct ata_port *ap = dev->ap; | 387 | struct ata_port *ap = dev->ap; |
627 | acpi_handle handle; | ||
628 | acpi_integer pcidevfn; | ||
629 | int err; | 388 | int err; |
630 | struct device *gdev = ap->host->dev; | ||
631 | u32 dev_adr; | ||
632 | acpi_status status; | 389 | acpi_status status; |
633 | struct acpi_object_list input; | 390 | struct acpi_object_list input; |
634 | union acpi_object in_params[1]; | 391 | union acpi_object in_params[1]; |
635 | 392 | ||
636 | if (libata_noacpi) | 393 | if (!dev->acpi_handle) |
637 | return 0; | 394 | return 0; |
638 | 395 | ||
639 | if (ata_msg_probe(ap)) | 396 | if (ata_msg_probe(ap)) |
@@ -648,34 +405,6 @@ int ata_acpi_push_id(struct ata_device *dev) | |||
648 | goto out; | 405 | goto out; |
649 | } | 406 | } |
650 | 407 | ||
651 | /* Don't continue if device has no _ADR method. | ||
652 | * _SDD is intended for known motherboard devices. */ | ||
653 | err = sata_get_dev_handle(gdev, &handle, &pcidevfn); | ||
654 | if (err < 0) { | ||
655 | if (ata_msg_probe(ap)) | ||
656 | ata_dev_printk(dev, KERN_DEBUG, | ||
657 | "%s: sata_get_dev_handle failed (%d\n", | ||
658 | __FUNCTION__, err); | ||
659 | goto out; | ||
660 | } | ||
661 | |||
662 | /* Get this drive's _ADR info, if not already known */ | ||
663 | if (!dev->obj_handle) { | ||
664 | dev_adr = SATA_ADR_RSVD; | ||
665 | err = get_sata_adr(gdev, handle, pcidevfn, dev->devno, ap, dev, | ||
666 | &dev_adr); | ||
667 | if (err < 0 || dev_adr == SATA_ADR_RSVD || | ||
668 | !dev->obj_handle) { | ||
669 | if (ata_msg_probe(ap)) | ||
670 | ata_dev_printk(dev, KERN_DEBUG, | ||
671 | "%s: get_sata_adr failed: " | ||
672 | "err=%d, dev_adr=%u, obj_handle=0x%p\n", | ||
673 | __FUNCTION__, err, dev_adr, | ||
674 | dev->obj_handle); | ||
675 | goto out; | ||
676 | } | ||
677 | } | ||
678 | |||
679 | /* Give the drive Identify data to the drive via the _SDD method */ | 408 | /* Give the drive Identify data to the drive via the _SDD method */ |
680 | /* _SDD: set up input parameters */ | 409 | /* _SDD: set up input parameters */ |
681 | input.count = 1; | 410 | input.count = 1; |
@@ -687,7 +416,7 @@ int ata_acpi_push_id(struct ata_device *dev) | |||
687 | 416 | ||
688 | /* It's OK for _SDD to be missing too. */ | 417 | /* It's OK for _SDD to be missing too. */ |
689 | swap_buf_le16(dev->id, ATA_ID_WORDS); | 418 | swap_buf_le16(dev->id, ATA_ID_WORDS); |
690 | status = acpi_evaluate_object(dev->obj_handle, "_SDD", &input, NULL); | 419 | status = acpi_evaluate_object(dev->acpi_handle, "_SDD", &input, NULL); |
691 | swap_buf_le16(dev->id, ATA_ID_WORDS); | 420 | swap_buf_le16(dev->id, ATA_ID_WORDS); |
692 | 421 | ||
693 | err = ACPI_FAILURE(status) ? -EIO : 0; | 422 | err = ACPI_FAILURE(status) ? -EIO : 0; |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 981b397cb46b..5a46cdebc588 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -6293,6 +6293,9 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) | |||
6293 | if (rc) | 6293 | if (rc) |
6294 | return rc; | 6294 | return rc; |
6295 | 6295 | ||
6296 | /* associate with ACPI nodes */ | ||
6297 | ata_acpi_associate(host); | ||
6298 | |||
6296 | /* set cable, sata_spd_limit and report */ | 6299 | /* set cable, sata_spd_limit and report */ |
6297 | for (i = 0; i < host->n_ports; i++) { | 6300 | for (i = 0; i < host->n_ports; i++) { |
6298 | struct ata_port *ap = host->ports[i]; | 6301 | struct ata_port *ap = host->ports[i]; |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index 5e2466658420..29037cd7c651 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -98,9 +98,11 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host); | |||
98 | 98 | ||
99 | /* libata-acpi.c */ | 99 | /* libata-acpi.c */ |
100 | #ifdef CONFIG_ATA_ACPI | 100 | #ifdef CONFIG_ATA_ACPI |
101 | extern void ata_acpi_associate(struct ata_host *host); | ||
101 | extern int ata_acpi_exec_tfs(struct ata_port *ap); | 102 | extern int ata_acpi_exec_tfs(struct ata_port *ap); |
102 | extern int ata_acpi_push_id(struct ata_device *dev); | 103 | extern int ata_acpi_push_id(struct ata_device *dev); |
103 | #else | 104 | #else |
105 | static inline void ata_acpi_associate(struct ata_host *host) { } | ||
104 | static inline int ata_acpi_exec_tfs(struct ata_port *ap) | 106 | static inline int ata_acpi_exec_tfs(struct ata_port *ap) |
105 | { | 107 | { |
106 | return 0; | 108 | return 0; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 620da7be07b7..d758168ee45d 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -363,6 +363,9 @@ struct ata_host { | |||
363 | void *private_data; | 363 | void *private_data; |
364 | const struct ata_port_operations *ops; | 364 | const struct ata_port_operations *ops; |
365 | unsigned long flags; | 365 | unsigned long flags; |
366 | #ifdef CONFIG_ATA_ACPI | ||
367 | acpi_handle acpi_handle; | ||
368 | #endif | ||
366 | struct ata_port *simplex_claimed; /* channel owning the DMA */ | 369 | struct ata_port *simplex_claimed; /* channel owning the DMA */ |
367 | struct ata_port *ports[0]; | 370 | struct ata_port *ports[0]; |
368 | }; | 371 | }; |
@@ -429,6 +432,9 @@ struct ata_device { | |||
429 | unsigned int devno; /* 0 or 1 */ | 432 | unsigned int devno; /* 0 or 1 */ |
430 | unsigned long flags; /* ATA_DFLAG_xxx */ | 433 | unsigned long flags; /* ATA_DFLAG_xxx */ |
431 | struct scsi_device *sdev; /* attached SCSI device */ | 434 | struct scsi_device *sdev; /* attached SCSI device */ |
435 | #ifdef CONFIG_ATA_ACPI | ||
436 | acpi_handle acpi_handle; | ||
437 | #endif | ||
432 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ | 438 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ |
433 | u64 n_sectors; /* size of device, if ATA */ | 439 | u64 n_sectors; /* size of device, if ATA */ |
434 | unsigned int class; /* ATA_DEV_xxx */ | 440 | unsigned int class; /* ATA_DEV_xxx */ |
@@ -457,10 +463,6 @@ struct ata_device { | |||
457 | struct ata_ering ering; | 463 | struct ata_ering ering; |
458 | int spdn_cnt; | 464 | int spdn_cnt; |
459 | unsigned int horkage; /* List of broken features */ | 465 | unsigned int horkage; /* List of broken features */ |
460 | #ifdef CONFIG_ATA_ACPI | ||
461 | /* ACPI objects info */ | ||
462 | acpi_handle obj_handle; | ||
463 | #endif | ||
464 | }; | 466 | }; |
465 | 467 | ||
466 | /* Offset into struct ata_device. Fields above it are maintained | 468 | /* Offset into struct ata_device. Fields above it are maintained |
@@ -549,6 +551,9 @@ struct ata_port { | |||
549 | 551 | ||
550 | void *private_data; | 552 | void *private_data; |
551 | 553 | ||
554 | #ifdef CONFIG_ATA_ACPI | ||
555 | acpi_handle acpi_handle; | ||
556 | #endif | ||
552 | u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ | 557 | u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ |
553 | }; | 558 | }; |
554 | 559 | ||