Linux 4.1.16
[linux/fpc-iii.git] / drivers / ata / ahci.c
blobe6ea912aee31ab6490bc77bd233d8e90ec7857bc
1 /*
2 * ahci.c - AHCI SATA support
4 * Maintained by: Tejun Heo <tj@kernel.org>
5 * Please ALWAYS copy linux-ide@vger.kernel.org
6 * on emails.
8 * Copyright 2004-2005 Red Hat, Inc.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2, or (at your option)
14 * any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; see the file COPYING. If not, write to
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 * libata documentation is available via 'make {ps|pdf}docs',
27 * as Documentation/DocBook/libata.*
29 * AHCI hardware documentation:
30 * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf
31 * http://www.intel.com/technology/serialata/pdf/rev1_1.pdf
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/pci.h>
38 #include <linux/blkdev.h>
39 #include <linux/delay.h>
40 #include <linux/interrupt.h>
41 #include <linux/dma-mapping.h>
42 #include <linux/device.h>
43 #include <linux/dmi.h>
44 #include <linux/gfp.h>
45 #include <scsi/scsi_host.h>
46 #include <scsi/scsi_cmnd.h>
47 #include <linux/libata.h>
48 #include "ahci.h"
50 #define DRV_NAME "ahci"
51 #define DRV_VERSION "3.0"
53 enum {
54 AHCI_PCI_BAR_STA2X11 = 0,
55 AHCI_PCI_BAR_ENMOTUS = 2,
56 AHCI_PCI_BAR_STANDARD = 5,
59 enum board_ids {
60 /* board IDs by feature in alphabetical order */
61 board_ahci,
62 board_ahci_ign_iferr,
63 board_ahci_nomsi,
64 board_ahci_noncq,
65 board_ahci_nosntf,
66 board_ahci_yes_fbs,
68 /* board IDs for specific chipsets in alphabetical order */
69 board_ahci_avn,
70 board_ahci_mcp65,
71 board_ahci_mcp77,
72 board_ahci_mcp89,
73 board_ahci_mv,
74 board_ahci_sb600,
75 board_ahci_sb700, /* for SB700 and SB800 */
76 board_ahci_vt8251,
78 /* aliases */
79 board_ahci_mcp_linux = board_ahci_mcp65,
80 board_ahci_mcp67 = board_ahci_mcp65,
81 board_ahci_mcp73 = board_ahci_mcp65,
82 board_ahci_mcp79 = board_ahci_mcp77,
85 static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
86 static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
87 unsigned long deadline);
88 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
89 unsigned long deadline);
90 static void ahci_mcp89_apple_enable(struct pci_dev *pdev);
91 static bool is_mcp89_apple(struct pci_dev *pdev);
92 static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
93 unsigned long deadline);
94 #ifdef CONFIG_PM
95 static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
96 static int ahci_pci_device_resume(struct pci_dev *pdev);
97 #endif
99 static struct scsi_host_template ahci_sht = {
100 AHCI_SHT("ahci"),
103 static struct ata_port_operations ahci_vt8251_ops = {
104 .inherits = &ahci_ops,
105 .hardreset = ahci_vt8251_hardreset,
108 static struct ata_port_operations ahci_p5wdh_ops = {
109 .inherits = &ahci_ops,
110 .hardreset = ahci_p5wdh_hardreset,
113 static struct ata_port_operations ahci_avn_ops = {
114 .inherits = &ahci_ops,
115 .hardreset = ahci_avn_hardreset,
118 static const struct ata_port_info ahci_port_info[] = {
119 /* by features */
120 [board_ahci] = {
121 .flags = AHCI_FLAG_COMMON,
122 .pio_mask = ATA_PIO4,
123 .udma_mask = ATA_UDMA6,
124 .port_ops = &ahci_ops,
126 [board_ahci_ign_iferr] = {
127 AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
128 .flags = AHCI_FLAG_COMMON,
129 .pio_mask = ATA_PIO4,
130 .udma_mask = ATA_UDMA6,
131 .port_ops = &ahci_ops,
133 [board_ahci_nomsi] = {
134 AHCI_HFLAGS (AHCI_HFLAG_NO_MSI),
135 .flags = AHCI_FLAG_COMMON,
136 .pio_mask = ATA_PIO4,
137 .udma_mask = ATA_UDMA6,
138 .port_ops = &ahci_ops,
140 [board_ahci_noncq] = {
141 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ),
142 .flags = AHCI_FLAG_COMMON,
143 .pio_mask = ATA_PIO4,
144 .udma_mask = ATA_UDMA6,
145 .port_ops = &ahci_ops,
147 [board_ahci_nosntf] = {
148 AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF),
149 .flags = AHCI_FLAG_COMMON,
150 .pio_mask = ATA_PIO4,
151 .udma_mask = ATA_UDMA6,
152 .port_ops = &ahci_ops,
154 [board_ahci_yes_fbs] = {
155 AHCI_HFLAGS (AHCI_HFLAG_YES_FBS),
156 .flags = AHCI_FLAG_COMMON,
157 .pio_mask = ATA_PIO4,
158 .udma_mask = ATA_UDMA6,
159 .port_ops = &ahci_ops,
161 /* by chipsets */
162 [board_ahci_avn] = {
163 .flags = AHCI_FLAG_COMMON,
164 .pio_mask = ATA_PIO4,
165 .udma_mask = ATA_UDMA6,
166 .port_ops = &ahci_avn_ops,
168 [board_ahci_mcp65] = {
169 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP |
170 AHCI_HFLAG_YES_NCQ),
171 .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
172 .pio_mask = ATA_PIO4,
173 .udma_mask = ATA_UDMA6,
174 .port_ops = &ahci_ops,
176 [board_ahci_mcp77] = {
177 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP),
178 .flags = AHCI_FLAG_COMMON,
179 .pio_mask = ATA_PIO4,
180 .udma_mask = ATA_UDMA6,
181 .port_ops = &ahci_ops,
183 [board_ahci_mcp89] = {
184 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA),
185 .flags = AHCI_FLAG_COMMON,
186 .pio_mask = ATA_PIO4,
187 .udma_mask = ATA_UDMA6,
188 .port_ops = &ahci_ops,
190 [board_ahci_mv] = {
191 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
192 AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
193 .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA,
194 .pio_mask = ATA_PIO4,
195 .udma_mask = ATA_UDMA6,
196 .port_ops = &ahci_ops,
198 [board_ahci_sb600] = {
199 AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
200 AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255 |
201 AHCI_HFLAG_32BIT_ONLY),
202 .flags = AHCI_FLAG_COMMON,
203 .pio_mask = ATA_PIO4,
204 .udma_mask = ATA_UDMA6,
205 .port_ops = &ahci_pmp_retry_srst_ops,
207 [board_ahci_sb700] = { /* for SB700 and SB800 */
208 AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL),
209 .flags = AHCI_FLAG_COMMON,
210 .pio_mask = ATA_PIO4,
211 .udma_mask = ATA_UDMA6,
212 .port_ops = &ahci_pmp_retry_srst_ops,
214 [board_ahci_vt8251] = {
215 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP),
216 .flags = AHCI_FLAG_COMMON,
217 .pio_mask = ATA_PIO4,
218 .udma_mask = ATA_UDMA6,
219 .port_ops = &ahci_vt8251_ops,
223 static const struct pci_device_id ahci_pci_tbl[] = {
224 /* Intel */
225 { PCI_VDEVICE(INTEL, 0x2652), board_ahci }, /* ICH6 */
226 { PCI_VDEVICE(INTEL, 0x2653), board_ahci }, /* ICH6M */
227 { PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
228 { PCI_VDEVICE(INTEL, 0x27c5), board_ahci }, /* ICH7M */
229 { PCI_VDEVICE(INTEL, 0x27c3), board_ahci }, /* ICH7R */
230 { PCI_VDEVICE(AL, 0x5288), board_ahci_ign_iferr }, /* ULi M5288 */
231 { PCI_VDEVICE(INTEL, 0x2681), board_ahci }, /* ESB2 */
232 { PCI_VDEVICE(INTEL, 0x2682), board_ahci }, /* ESB2 */
233 { PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
234 { PCI_VDEVICE(INTEL, 0x27c6), board_ahci }, /* ICH7-M DH */
235 { PCI_VDEVICE(INTEL, 0x2821), board_ahci }, /* ICH8 */
236 { PCI_VDEVICE(INTEL, 0x2822), board_ahci_nosntf }, /* ICH8 */
237 { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */
238 { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */
239 { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */
240 { PCI_VDEVICE(INTEL, 0x2922), board_ahci }, /* ICH9 */
241 { PCI_VDEVICE(INTEL, 0x2923), board_ahci }, /* ICH9 */
242 { PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */
243 { PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */
244 { PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */
245 { PCI_VDEVICE(INTEL, 0x2929), board_ahci }, /* ICH9M */
246 { PCI_VDEVICE(INTEL, 0x292a), board_ahci }, /* ICH9M */
247 { PCI_VDEVICE(INTEL, 0x292b), board_ahci }, /* ICH9M */
248 { PCI_VDEVICE(INTEL, 0x292c), board_ahci }, /* ICH9M */
249 { PCI_VDEVICE(INTEL, 0x292f), board_ahci }, /* ICH9M */
250 { PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */
251 { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */
252 { PCI_VDEVICE(INTEL, 0x502a), board_ahci }, /* Tolapai */
253 { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
254 { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
255 { PCI_VDEVICE(INTEL, 0x3a22), board_ahci }, /* ICH10 */
256 { PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
257 { PCI_VDEVICE(INTEL, 0x3b22), board_ahci }, /* PCH AHCI */
258 { PCI_VDEVICE(INTEL, 0x3b23), board_ahci }, /* PCH AHCI */
259 { PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
260 { PCI_VDEVICE(INTEL, 0x3b25), board_ahci }, /* PCH RAID */
261 { PCI_VDEVICE(INTEL, 0x3b29), board_ahci }, /* PCH AHCI */
262 { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
263 { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci }, /* PCH RAID */
264 { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */
265 { PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */
266 { PCI_VDEVICE(INTEL, 0x1c03), board_ahci }, /* CPT AHCI */
267 { PCI_VDEVICE(INTEL, 0x1c04), board_ahci }, /* CPT RAID */
268 { PCI_VDEVICE(INTEL, 0x1c05), board_ahci }, /* CPT RAID */
269 { PCI_VDEVICE(INTEL, 0x1c06), board_ahci }, /* CPT RAID */
270 { PCI_VDEVICE(INTEL, 0x1c07), board_ahci }, /* CPT RAID */
271 { PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
272 { PCI_VDEVICE(INTEL, 0x1d04), board_ahci }, /* PBG RAID */
273 { PCI_VDEVICE(INTEL, 0x1d06), board_ahci }, /* PBG RAID */
274 { PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* PBG RAID */
275 { PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
276 { PCI_VDEVICE(INTEL, 0x1e02), board_ahci }, /* Panther Point AHCI */
277 { PCI_VDEVICE(INTEL, 0x1e03), board_ahci }, /* Panther Point AHCI */
278 { PCI_VDEVICE(INTEL, 0x1e04), board_ahci }, /* Panther Point RAID */
279 { PCI_VDEVICE(INTEL, 0x1e05), board_ahci }, /* Panther Point RAID */
280 { PCI_VDEVICE(INTEL, 0x1e06), board_ahci }, /* Panther Point RAID */
281 { PCI_VDEVICE(INTEL, 0x1e07), board_ahci }, /* Panther Point RAID */
282 { PCI_VDEVICE(INTEL, 0x1e0e), board_ahci }, /* Panther Point RAID */
283 { PCI_VDEVICE(INTEL, 0x8c02), board_ahci }, /* Lynx Point AHCI */
284 { PCI_VDEVICE(INTEL, 0x8c03), board_ahci }, /* Lynx Point AHCI */
285 { PCI_VDEVICE(INTEL, 0x8c04), board_ahci }, /* Lynx Point RAID */
286 { PCI_VDEVICE(INTEL, 0x8c05), board_ahci }, /* Lynx Point RAID */
287 { PCI_VDEVICE(INTEL, 0x8c06), board_ahci }, /* Lynx Point RAID */
288 { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point RAID */
289 { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */
290 { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci }, /* Lynx Point RAID */
291 { PCI_VDEVICE(INTEL, 0x9c02), board_ahci }, /* Lynx Point-LP AHCI */
292 { PCI_VDEVICE(INTEL, 0x9c03), board_ahci }, /* Lynx Point-LP AHCI */
293 { PCI_VDEVICE(INTEL, 0x9c04), board_ahci }, /* Lynx Point-LP RAID */
294 { PCI_VDEVICE(INTEL, 0x9c05), board_ahci }, /* Lynx Point-LP RAID */
295 { PCI_VDEVICE(INTEL, 0x9c06), board_ahci }, /* Lynx Point-LP RAID */
296 { PCI_VDEVICE(INTEL, 0x9c07), board_ahci }, /* Lynx Point-LP RAID */
297 { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci }, /* Lynx Point-LP RAID */
298 { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci }, /* Lynx Point-LP RAID */
299 { PCI_VDEVICE(INTEL, 0x1f22), board_ahci }, /* Avoton AHCI */
300 { PCI_VDEVICE(INTEL, 0x1f23), board_ahci }, /* Avoton AHCI */
301 { PCI_VDEVICE(INTEL, 0x1f24), board_ahci }, /* Avoton RAID */
302 { PCI_VDEVICE(INTEL, 0x1f25), board_ahci }, /* Avoton RAID */
303 { PCI_VDEVICE(INTEL, 0x1f26), board_ahci }, /* Avoton RAID */
304 { PCI_VDEVICE(INTEL, 0x1f27), board_ahci }, /* Avoton RAID */
305 { PCI_VDEVICE(INTEL, 0x1f2e), board_ahci }, /* Avoton RAID */
306 { PCI_VDEVICE(INTEL, 0x1f2f), board_ahci }, /* Avoton RAID */
307 { PCI_VDEVICE(INTEL, 0x1f32), board_ahci_avn }, /* Avoton AHCI */
308 { PCI_VDEVICE(INTEL, 0x1f33), board_ahci_avn }, /* Avoton AHCI */
309 { PCI_VDEVICE(INTEL, 0x1f34), board_ahci_avn }, /* Avoton RAID */
310 { PCI_VDEVICE(INTEL, 0x1f35), board_ahci_avn }, /* Avoton RAID */
311 { PCI_VDEVICE(INTEL, 0x1f36), board_ahci_avn }, /* Avoton RAID */
312 { PCI_VDEVICE(INTEL, 0x1f37), board_ahci_avn }, /* Avoton RAID */
313 { PCI_VDEVICE(INTEL, 0x1f3e), board_ahci_avn }, /* Avoton RAID */
314 { PCI_VDEVICE(INTEL, 0x1f3f), board_ahci_avn }, /* Avoton RAID */
315 { PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Wellsburg RAID */
316 { PCI_VDEVICE(INTEL, 0x2827), board_ahci }, /* Wellsburg RAID */
317 { PCI_VDEVICE(INTEL, 0x8d02), board_ahci }, /* Wellsburg AHCI */
318 { PCI_VDEVICE(INTEL, 0x8d04), board_ahci }, /* Wellsburg RAID */
319 { PCI_VDEVICE(INTEL, 0x8d06), board_ahci }, /* Wellsburg RAID */
320 { PCI_VDEVICE(INTEL, 0x8d0e), board_ahci }, /* Wellsburg RAID */
321 { PCI_VDEVICE(INTEL, 0x8d62), board_ahci }, /* Wellsburg AHCI */
322 { PCI_VDEVICE(INTEL, 0x8d64), board_ahci }, /* Wellsburg RAID */
323 { PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */
324 { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */
325 { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */
326 { PCI_VDEVICE(INTEL, 0x9c83), board_ahci }, /* Wildcat Point-LP AHCI */
327 { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */
328 { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */
329 { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */
330 { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
331 { PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series AHCI */
332 { PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */
333 { PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series RAID */
334 { PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */
335 { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
336 { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
337 { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
338 { PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
339 { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
340 { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
341 { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */
342 { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
343 { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H RAID */
344 { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */
346 /* JMicron 360/1/3/5/6, match class to avoid IDE function */
347 { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
348 PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
349 /* JMicron 362B and 362C have an AHCI function with IDE class code */
350 { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
351 { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
352 /* May need to update quirk_jmicron_async_suspend() for additions */
354 /* ATI */
355 { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
356 { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 }, /* ATI SB700/800 */
357 { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 }, /* ATI SB700/800 */
358 { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 }, /* ATI SB700/800 */
359 { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 }, /* ATI SB700/800 */
360 { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */
361 { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */
363 /* AMD */
364 { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
365 { PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */
366 /* AMD is using RAID class only for ahci controllers */
367 { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
368 PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci },
370 /* VIA */
371 { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */
372 { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 }, /* VIA VT8251 */
374 /* NVIDIA */
375 { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci_mcp65 }, /* MCP65 */
376 { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci_mcp65 }, /* MCP65 */
377 { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci_mcp65 }, /* MCP65 */
378 { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci_mcp65 }, /* MCP65 */
379 { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci_mcp65 }, /* MCP65 */
380 { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 }, /* MCP65 */
381 { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 }, /* MCP65 */
382 { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 }, /* MCP65 */
383 { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci_mcp67 }, /* MCP67 */
384 { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci_mcp67 }, /* MCP67 */
385 { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci_mcp67 }, /* MCP67 */
386 { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci_mcp67 }, /* MCP67 */
387 { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci_mcp67 }, /* MCP67 */
388 { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci_mcp67 }, /* MCP67 */
389 { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci_mcp67 }, /* MCP67 */
390 { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci_mcp67 }, /* MCP67 */
391 { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci_mcp67 }, /* MCP67 */
392 { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_mcp67 }, /* MCP67 */
393 { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_mcp67 }, /* MCP67 */
394 { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_mcp67 }, /* MCP67 */
395 { PCI_VDEVICE(NVIDIA, 0x0580), board_ahci_mcp_linux }, /* Linux ID */
396 { PCI_VDEVICE(NVIDIA, 0x0581), board_ahci_mcp_linux }, /* Linux ID */
397 { PCI_VDEVICE(NVIDIA, 0x0582), board_ahci_mcp_linux }, /* Linux ID */
398 { PCI_VDEVICE(NVIDIA, 0x0583), board_ahci_mcp_linux }, /* Linux ID */
399 { PCI_VDEVICE(NVIDIA, 0x0584), board_ahci_mcp_linux }, /* Linux ID */
400 { PCI_VDEVICE(NVIDIA, 0x0585), board_ahci_mcp_linux }, /* Linux ID */
401 { PCI_VDEVICE(NVIDIA, 0x0586), board_ahci_mcp_linux }, /* Linux ID */
402 { PCI_VDEVICE(NVIDIA, 0x0587), board_ahci_mcp_linux }, /* Linux ID */
403 { PCI_VDEVICE(NVIDIA, 0x0588), board_ahci_mcp_linux }, /* Linux ID */
404 { PCI_VDEVICE(NVIDIA, 0x0589), board_ahci_mcp_linux }, /* Linux ID */
405 { PCI_VDEVICE(NVIDIA, 0x058a), board_ahci_mcp_linux }, /* Linux ID */
406 { PCI_VDEVICE(NVIDIA, 0x058b), board_ahci_mcp_linux }, /* Linux ID */
407 { PCI_VDEVICE(NVIDIA, 0x058c), board_ahci_mcp_linux }, /* Linux ID */
408 { PCI_VDEVICE(NVIDIA, 0x058d), board_ahci_mcp_linux }, /* Linux ID */
409 { PCI_VDEVICE(NVIDIA, 0x058e), board_ahci_mcp_linux }, /* Linux ID */
410 { PCI_VDEVICE(NVIDIA, 0x058f), board_ahci_mcp_linux }, /* Linux ID */
411 { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_mcp73 }, /* MCP73 */
412 { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_mcp73 }, /* MCP73 */
413 { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_mcp73 }, /* MCP73 */
414 { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci_mcp73 }, /* MCP73 */
415 { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci_mcp73 }, /* MCP73 */
416 { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci_mcp73 }, /* MCP73 */
417 { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci_mcp73 }, /* MCP73 */
418 { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci_mcp73 }, /* MCP73 */
419 { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci_mcp73 }, /* MCP73 */
420 { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci_mcp73 }, /* MCP73 */
421 { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci_mcp73 }, /* MCP73 */
422 { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci_mcp73 }, /* MCP73 */
423 { PCI_VDEVICE(NVIDIA, 0x0ad0), board_ahci_mcp77 }, /* MCP77 */
424 { PCI_VDEVICE(NVIDIA, 0x0ad1), board_ahci_mcp77 }, /* MCP77 */
425 { PCI_VDEVICE(NVIDIA, 0x0ad2), board_ahci_mcp77 }, /* MCP77 */
426 { PCI_VDEVICE(NVIDIA, 0x0ad3), board_ahci_mcp77 }, /* MCP77 */
427 { PCI_VDEVICE(NVIDIA, 0x0ad4), board_ahci_mcp77 }, /* MCP77 */
428 { PCI_VDEVICE(NVIDIA, 0x0ad5), board_ahci_mcp77 }, /* MCP77 */
429 { PCI_VDEVICE(NVIDIA, 0x0ad6), board_ahci_mcp77 }, /* MCP77 */
430 { PCI_VDEVICE(NVIDIA, 0x0ad7), board_ahci_mcp77 }, /* MCP77 */
431 { PCI_VDEVICE(NVIDIA, 0x0ad8), board_ahci_mcp77 }, /* MCP77 */
432 { PCI_VDEVICE(NVIDIA, 0x0ad9), board_ahci_mcp77 }, /* MCP77 */
433 { PCI_VDEVICE(NVIDIA, 0x0ada), board_ahci_mcp77 }, /* MCP77 */
434 { PCI_VDEVICE(NVIDIA, 0x0adb), board_ahci_mcp77 }, /* MCP77 */
435 { PCI_VDEVICE(NVIDIA, 0x0ab4), board_ahci_mcp79 }, /* MCP79 */
436 { PCI_VDEVICE(NVIDIA, 0x0ab5), board_ahci_mcp79 }, /* MCP79 */
437 { PCI_VDEVICE(NVIDIA, 0x0ab6), board_ahci_mcp79 }, /* MCP79 */
438 { PCI_VDEVICE(NVIDIA, 0x0ab7), board_ahci_mcp79 }, /* MCP79 */
439 { PCI_VDEVICE(NVIDIA, 0x0ab8), board_ahci_mcp79 }, /* MCP79 */
440 { PCI_VDEVICE(NVIDIA, 0x0ab9), board_ahci_mcp79 }, /* MCP79 */
441 { PCI_VDEVICE(NVIDIA, 0x0aba), board_ahci_mcp79 }, /* MCP79 */
442 { PCI_VDEVICE(NVIDIA, 0x0abb), board_ahci_mcp79 }, /* MCP79 */
443 { PCI_VDEVICE(NVIDIA, 0x0abc), board_ahci_mcp79 }, /* MCP79 */
444 { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci_mcp79 }, /* MCP79 */
445 { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci_mcp79 }, /* MCP79 */
446 { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci_mcp79 }, /* MCP79 */
447 { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci_mcp89 }, /* MCP89 */
448 { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci_mcp89 }, /* MCP89 */
449 { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci_mcp89 }, /* MCP89 */
450 { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci_mcp89 }, /* MCP89 */
451 { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci_mcp89 }, /* MCP89 */
452 { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci_mcp89 }, /* MCP89 */
453 { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci_mcp89 }, /* MCP89 */
454 { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci_mcp89 }, /* MCP89 */
455 { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci_mcp89 }, /* MCP89 */
456 { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci_mcp89 }, /* MCP89 */
457 { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci_mcp89 }, /* MCP89 */
458 { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci_mcp89 }, /* MCP89 */
460 /* SiS */
461 { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
462 { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */
463 { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
465 /* ST Microelectronics */
466 { PCI_VDEVICE(STMICRO, 0xCC06), board_ahci }, /* ST ConneXt */
468 /* Marvell */
469 { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
470 { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
471 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9123),
472 .class = PCI_CLASS_STORAGE_SATA_AHCI,
473 .class_mask = 0xffffff,
474 .driver_data = board_ahci_yes_fbs }, /* 88se9128 */
475 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
476 .driver_data = board_ahci_yes_fbs }, /* 88se9125 */
477 { PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
478 PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
479 .driver_data = board_ahci_yes_fbs }, /* 88se9170 */
480 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
481 .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
482 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
483 .driver_data = board_ahci_yes_fbs }, /* 88se9182 */
484 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
485 .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
486 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
487 .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
488 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0),
489 .driver_data = board_ahci_yes_fbs },
490 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
491 .driver_data = board_ahci_yes_fbs },
492 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
493 .driver_data = board_ahci_yes_fbs },
494 { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642),
495 .driver_data = board_ahci_yes_fbs },
497 /* Promise */
498 { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
499 { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
501 /* Asmedia */
502 { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */
503 { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci }, /* ASM1060 */
504 { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */
505 { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */
508 * Samsung SSDs found on some macbooks. NCQ times out if MSI is
509 * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
511 { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
512 { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
514 /* Enmotus */
515 { PCI_DEVICE(0x1c44, 0x8000), board_ahci },
517 /* Generic, PCI class code for AHCI */
518 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
519 PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
521 { } /* terminate list */
525 static struct pci_driver ahci_pci_driver = {
526 .name = DRV_NAME,
527 .id_table = ahci_pci_tbl,
528 .probe = ahci_init_one,
529 .remove = ata_pci_remove_one,
530 #ifdef CONFIG_PM
531 .suspend = ahci_pci_device_suspend,
532 .resume = ahci_pci_device_resume,
533 #endif
536 #if defined(CONFIG_PATA_MARVELL) || defined(CONFIG_PATA_MARVELL_MODULE)
537 static int marvell_enable;
538 #else
539 static int marvell_enable = 1;
540 #endif
541 module_param(marvell_enable, int, 0644);
542 MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
545 static void ahci_pci_save_initial_config(struct pci_dev *pdev,
546 struct ahci_host_priv *hpriv)
548 if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
549 dev_info(&pdev->dev, "JMB361 has only one port\n");
550 hpriv->force_port_map = 1;
554 * Temporary Marvell 6145 hack: PATA port presence
555 * is asserted through the standard AHCI port
556 * presence register, as bit 4 (counting from 0)
558 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
559 if (pdev->device == 0x6121)
560 hpriv->mask_port_map = 0x3;
561 else
562 hpriv->mask_port_map = 0xf;
563 dev_info(&pdev->dev,
564 "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
567 ahci_save_initial_config(&pdev->dev, hpriv);
570 static int ahci_pci_reset_controller(struct ata_host *host)
572 struct pci_dev *pdev = to_pci_dev(host->dev);
574 ahci_reset_controller(host);
576 if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
577 struct ahci_host_priv *hpriv = host->private_data;
578 u16 tmp16;
580 /* configure PCS */
581 pci_read_config_word(pdev, 0x92, &tmp16);
582 if ((tmp16 & hpriv->port_map) != hpriv->port_map) {
583 tmp16 |= hpriv->port_map;
584 pci_write_config_word(pdev, 0x92, tmp16);
588 return 0;
591 static void ahci_pci_init_controller(struct ata_host *host)
593 struct ahci_host_priv *hpriv = host->private_data;
594 struct pci_dev *pdev = to_pci_dev(host->dev);
595 void __iomem *port_mmio;
596 u32 tmp;
597 int mv;
599 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
600 if (pdev->device == 0x6121)
601 mv = 2;
602 else
603 mv = 4;
604 port_mmio = __ahci_port_base(host, mv);
606 writel(0, port_mmio + PORT_IRQ_MASK);
608 /* clear port IRQ */
609 tmp = readl(port_mmio + PORT_IRQ_STAT);
610 VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
611 if (tmp)
612 writel(tmp, port_mmio + PORT_IRQ_STAT);
615 ahci_init_controller(host);
618 static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
619 unsigned long deadline)
621 struct ata_port *ap = link->ap;
622 struct ahci_host_priv *hpriv = ap->host->private_data;
623 bool online;
624 int rc;
626 DPRINTK("ENTER\n");
628 ahci_stop_engine(ap);
630 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
631 deadline, &online, NULL);
633 hpriv->start_engine(ap);
635 DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
637 /* vt8251 doesn't clear BSY on signature FIS reception,
638 * request follow-up softreset.
640 return online ? -EAGAIN : rc;
643 static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
644 unsigned long deadline)
646 struct ata_port *ap = link->ap;
647 struct ahci_port_priv *pp = ap->private_data;
648 struct ahci_host_priv *hpriv = ap->host->private_data;
649 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
650 struct ata_taskfile tf;
651 bool online;
652 int rc;
654 ahci_stop_engine(ap);
656 /* clear D2H reception area to properly wait for D2H FIS */
657 ata_tf_init(link->device, &tf);
658 tf.command = ATA_BUSY;
659 ata_tf_to_fis(&tf, 0, 0, d2h_fis);
661 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
662 deadline, &online, NULL);
664 hpriv->start_engine(ap);
666 /* The pseudo configuration device on SIMG4726 attached to
667 * ASUS P5W-DH Deluxe doesn't send signature FIS after
668 * hardreset if no device is attached to the first downstream
669 * port && the pseudo device locks up on SRST w/ PMP==0. To
670 * work around this, wait for !BSY only briefly. If BSY isn't
671 * cleared, perform CLO and proceed to IDENTIFY (achieved by
672 * ATA_LFLAG_NO_SRST and ATA_LFLAG_ASSUME_ATA).
674 * Wait for two seconds. Devices attached to downstream port
675 * which can't process the following IDENTIFY after this will
676 * have to be reset again. For most cases, this should
677 * suffice while making probing snappish enough.
679 if (online) {
680 rc = ata_wait_after_reset(link, jiffies + 2 * HZ,
681 ahci_check_ready);
682 if (rc)
683 ahci_kick_engine(ap);
685 return rc;
689 * ahci_avn_hardreset - attempt more aggressive recovery of Avoton ports.
691 * It has been observed with some SSDs that the timing of events in the
692 * link synchronization phase can leave the port in a state that can not
693 * be recovered by a SATA-hard-reset alone. The failing signature is
694 * SStatus.DET stuck at 1 ("Device presence detected but Phy
695 * communication not established"). It was found that unloading and
696 * reloading the driver when this problem occurs allows the drive
697 * connection to be recovered (DET advanced to 0x3). The critical
698 * component of reloading the driver is that the port state machines are
699 * reset by bouncing "port enable" in the AHCI PCS configuration
700 * register. So, reproduce that effect by bouncing a port whenever we
701 * see DET==1 after a reset.
703 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
704 unsigned long deadline)
706 const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
707 struct ata_port *ap = link->ap;
708 struct ahci_port_priv *pp = ap->private_data;
709 struct ahci_host_priv *hpriv = ap->host->private_data;
710 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
711 unsigned long tmo = deadline - jiffies;
712 struct ata_taskfile tf;
713 bool online;
714 int rc, i;
716 DPRINTK("ENTER\n");
718 ahci_stop_engine(ap);
720 for (i = 0; i < 2; i++) {
721 u16 val;
722 u32 sstatus;
723 int port = ap->port_no;
724 struct ata_host *host = ap->host;
725 struct pci_dev *pdev = to_pci_dev(host->dev);
727 /* clear D2H reception area to properly wait for D2H FIS */
728 ata_tf_init(link->device, &tf);
729 tf.command = ATA_BUSY;
730 ata_tf_to_fis(&tf, 0, 0, d2h_fis);
732 rc = sata_link_hardreset(link, timing, deadline, &online,
733 ahci_check_ready);
735 if (sata_scr_read(link, SCR_STATUS, &sstatus) != 0 ||
736 (sstatus & 0xf) != 1)
737 break;
739 ata_link_printk(link, KERN_INFO, "avn bounce port%d\n",
740 port);
742 pci_read_config_word(pdev, 0x92, &val);
743 val &= ~(1 << port);
744 pci_write_config_word(pdev, 0x92, val);
745 ata_msleep(ap, 1000);
746 val |= 1 << port;
747 pci_write_config_word(pdev, 0x92, val);
748 deadline += tmo;
751 hpriv->start_engine(ap);
753 if (online)
754 *class = ahci_dev_classify(ap);
756 DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
757 return rc;
761 #ifdef CONFIG_PM
762 static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
764 struct ata_host *host = pci_get_drvdata(pdev);
765 struct ahci_host_priv *hpriv = host->private_data;
766 void __iomem *mmio = hpriv->mmio;
767 u32 ctl;
769 if (mesg.event & PM_EVENT_SUSPEND &&
770 hpriv->flags & AHCI_HFLAG_NO_SUSPEND) {
771 dev_err(&pdev->dev,
772 "BIOS update required for suspend/resume\n");
773 return -EIO;
776 if (mesg.event & PM_EVENT_SLEEP) {
777 /* AHCI spec rev1.1 section 8.3.3:
778 * Software must disable interrupts prior to requesting a
779 * transition of the HBA to D3 state.
781 ctl = readl(mmio + HOST_CTL);
782 ctl &= ~HOST_IRQ_EN;
783 writel(ctl, mmio + HOST_CTL);
784 readl(mmio + HOST_CTL); /* flush */
787 return ata_pci_device_suspend(pdev, mesg);
790 static int ahci_pci_device_resume(struct pci_dev *pdev)
792 struct ata_host *host = pci_get_drvdata(pdev);
793 int rc;
795 rc = ata_pci_device_do_resume(pdev);
796 if (rc)
797 return rc;
799 /* Apple BIOS helpfully mangles the registers on resume */
800 if (is_mcp89_apple(pdev))
801 ahci_mcp89_apple_enable(pdev);
803 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
804 rc = ahci_pci_reset_controller(host);
805 if (rc)
806 return rc;
808 ahci_pci_init_controller(host);
811 ata_host_resume(host);
813 return 0;
815 #endif
817 static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
819 int rc;
822 * If the device fixup already set the dma_mask to some non-standard
823 * value, don't extend it here. This happens on STA2X11, for example.
825 if (pdev->dma_mask && pdev->dma_mask < DMA_BIT_MASK(32))
826 return 0;
828 if (using_dac &&
829 !dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) {
830 rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
831 if (rc) {
832 rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
833 if (rc) {
834 dev_err(&pdev->dev,
835 "64-bit DMA enable failed\n");
836 return rc;
839 } else {
840 rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
841 if (rc) {
842 dev_err(&pdev->dev, "32-bit DMA enable failed\n");
843 return rc;
845 rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
846 if (rc) {
847 dev_err(&pdev->dev,
848 "32-bit consistent DMA enable failed\n");
849 return rc;
852 return 0;
855 static void ahci_pci_print_info(struct ata_host *host)
857 struct pci_dev *pdev = to_pci_dev(host->dev);
858 u16 cc;
859 const char *scc_s;
861 pci_read_config_word(pdev, 0x0a, &cc);
862 if (cc == PCI_CLASS_STORAGE_IDE)
863 scc_s = "IDE";
864 else if (cc == PCI_CLASS_STORAGE_SATA)
865 scc_s = "SATA";
866 else if (cc == PCI_CLASS_STORAGE_RAID)
867 scc_s = "RAID";
868 else
869 scc_s = "unknown";
871 ahci_print_info(host, scc_s);
874 /* On ASUS P5W DH Deluxe, the second port of PCI device 00:1f.2 is
875 * hardwired to on-board SIMG 4726. The chipset is ICH8 and doesn't
876 * support PMP and the 4726 either directly exports the device
877 * attached to the first downstream port or acts as a hardware storage
878 * controller and emulate a single ATA device (can be RAID 0/1 or some
879 * other configuration).
881 * When there's no device attached to the first downstream port of the
882 * 4726, "Config Disk" appears, which is a pseudo ATA device to
883 * configure the 4726. However, ATA emulation of the device is very
884 * lame. It doesn't send signature D2H Reg FIS after the initial
885 * hardreset, pukes on SRST w/ PMP==0 and has bunch of other issues.
887 * The following function works around the problem by always using
888 * hardreset on the port and not depending on receiving signature FIS
889 * afterward. If signature FIS isn't received soon, ATA class is
890 * assumed without follow-up softreset.
892 static void ahci_p5wdh_workaround(struct ata_host *host)
894 static const struct dmi_system_id sysids[] = {
896 .ident = "P5W DH Deluxe",
897 .matches = {
898 DMI_MATCH(DMI_SYS_VENDOR,
899 "ASUSTEK COMPUTER INC"),
900 DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"),
905 struct pci_dev *pdev = to_pci_dev(host->dev);
907 if (pdev->bus->number == 0 && pdev->devfn == PCI_DEVFN(0x1f, 2) &&
908 dmi_check_system(sysids)) {
909 struct ata_port *ap = host->ports[1];
911 dev_info(&pdev->dev,
912 "enabling ASUS P5W DH Deluxe on-board SIMG4726 workaround\n");
914 ap->ops = &ahci_p5wdh_ops;
915 ap->link.flags |= ATA_LFLAG_NO_SRST | ATA_LFLAG_ASSUME_ATA;
920 * Macbook7,1 firmware forcibly disables MCP89 AHCI and changes PCI ID when
921 * booting in BIOS compatibility mode. We restore the registers but not ID.
923 static void ahci_mcp89_apple_enable(struct pci_dev *pdev)
925 u32 val;
927 printk(KERN_INFO "ahci: enabling MCP89 AHCI mode\n");
929 pci_read_config_dword(pdev, 0xf8, &val);
930 val |= 1 << 0x1b;
931 /* the following changes the device ID, but appears not to affect function */
932 /* val = (val & ~0xf0000000) | 0x80000000; */
933 pci_write_config_dword(pdev, 0xf8, val);
935 pci_read_config_dword(pdev, 0x54c, &val);
936 val |= 1 << 0xc;
937 pci_write_config_dword(pdev, 0x54c, val);
939 pci_read_config_dword(pdev, 0x4a4, &val);
940 val &= 0xff;
941 val |= 0x01060100;
942 pci_write_config_dword(pdev, 0x4a4, val);
944 pci_read_config_dword(pdev, 0x54c, &val);
945 val &= ~(1 << 0xc);
946 pci_write_config_dword(pdev, 0x54c, val);
948 pci_read_config_dword(pdev, 0xf8, &val);
949 val &= ~(1 << 0x1b);
950 pci_write_config_dword(pdev, 0xf8, val);
953 static bool is_mcp89_apple(struct pci_dev *pdev)
955 return pdev->vendor == PCI_VENDOR_ID_NVIDIA &&
956 pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA &&
957 pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
958 pdev->subsystem_device == 0xcb89;
961 /* only some SB600 ahci controllers can do 64bit DMA */
962 static bool ahci_sb600_enable_64bit(struct pci_dev *pdev)
964 static const struct dmi_system_id sysids[] = {
966 * The oldest version known to be broken is 0901 and
967 * working is 1501 which was released on 2007-10-26.
968 * Enable 64bit DMA on 1501 and anything newer.
970 * Please read bko#9412 for more info.
973 .ident = "ASUS M2A-VM",
974 .matches = {
975 DMI_MATCH(DMI_BOARD_VENDOR,
976 "ASUSTeK Computer INC."),
977 DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"),
979 .driver_data = "20071026", /* yyyymmdd */
982 * All BIOS versions for the MSI K9A2 Platinum (MS-7376)
983 * support 64bit DMA.
985 * BIOS versions earlier than 1.5 had the Manufacturer DMI
986 * fields as "MICRO-STAR INTERANTIONAL CO.,LTD".
987 * This spelling mistake was fixed in BIOS version 1.5, so
988 * 1.5 and later have the Manufacturer as
989 * "MICRO-STAR INTERNATIONAL CO.,LTD".
990 * So try to match on DMI_BOARD_VENDOR of "MICRO-STAR INTER".
992 * BIOS versions earlier than 1.9 had a Board Product Name
993 * DMI field of "MS-7376". This was changed to be
994 * "K9A2 Platinum (MS-7376)" in version 1.9, but we can still
995 * match on DMI_BOARD_NAME of "MS-7376".
998 .ident = "MSI K9A2 Platinum",
999 .matches = {
1000 DMI_MATCH(DMI_BOARD_VENDOR,
1001 "MICRO-STAR INTER"),
1002 DMI_MATCH(DMI_BOARD_NAME, "MS-7376"),
1006 * All BIOS versions for the MSI K9AGM2 (MS-7327) support
1007 * 64bit DMA.
1009 * This board also had the typo mentioned above in the
1010 * Manufacturer DMI field (fixed in BIOS version 1.5), so
1011 * match on DMI_BOARD_VENDOR of "MICRO-STAR INTER" again.
1014 .ident = "MSI K9AGM2",
1015 .matches = {
1016 DMI_MATCH(DMI_BOARD_VENDOR,
1017 "MICRO-STAR INTER"),
1018 DMI_MATCH(DMI_BOARD_NAME, "MS-7327"),
1022 * All BIOS versions for the Asus M3A support 64bit DMA.
1023 * (all release versions from 0301 to 1206 were tested)
1026 .ident = "ASUS M3A",
1027 .matches = {
1028 DMI_MATCH(DMI_BOARD_VENDOR,
1029 "ASUSTeK Computer INC."),
1030 DMI_MATCH(DMI_BOARD_NAME, "M3A"),
1035 const struct dmi_system_id *match;
1036 int year, month, date;
1037 char buf[9];
1039 match = dmi_first_match(sysids);
1040 if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) ||
1041 !match)
1042 return false;
1044 if (!match->driver_data)
1045 goto enable_64bit;
1047 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
1048 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
1050 if (strcmp(buf, match->driver_data) >= 0)
1051 goto enable_64bit;
1052 else {
1053 dev_warn(&pdev->dev,
1054 "%s: BIOS too old, forcing 32bit DMA, update BIOS\n",
1055 match->ident);
1056 return false;
1059 enable_64bit:
1060 dev_warn(&pdev->dev, "%s: enabling 64bit DMA\n", match->ident);
1061 return true;
1064 static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
1066 static const struct dmi_system_id broken_systems[] = {
1068 .ident = "HP Compaq nx6310",
1069 .matches = {
1070 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1071 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6310"),
1073 /* PCI slot number of the controller */
1074 .driver_data = (void *)0x1FUL,
1077 .ident = "HP Compaq 6720s",
1078 .matches = {
1079 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1080 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6720s"),
1082 /* PCI slot number of the controller */
1083 .driver_data = (void *)0x1FUL,
1086 { } /* terminate list */
1088 const struct dmi_system_id *dmi = dmi_first_match(broken_systems);
1090 if (dmi) {
1091 unsigned long slot = (unsigned long)dmi->driver_data;
1092 /* apply the quirk only to on-board controllers */
1093 return slot == PCI_SLOT(pdev->devfn);
1096 return false;
1099 static bool ahci_broken_suspend(struct pci_dev *pdev)
1101 static const struct dmi_system_id sysids[] = {
1103 * On HP dv[4-6] and HDX18 with earlier BIOSen, link
1104 * to the harddisk doesn't become online after
1105 * resuming from STR. Warn and fail suspend.
1107 * http://bugzilla.kernel.org/show_bug.cgi?id=12276
1109 * Use dates instead of versions to match as HP is
1110 * apparently recycling both product and version
1111 * strings.
1113 * http://bugzilla.kernel.org/show_bug.cgi?id=15462
1116 .ident = "dv4",
1117 .matches = {
1118 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1119 DMI_MATCH(DMI_PRODUCT_NAME,
1120 "HP Pavilion dv4 Notebook PC"),
1122 .driver_data = "20090105", /* F.30 */
1125 .ident = "dv5",
1126 .matches = {
1127 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1128 DMI_MATCH(DMI_PRODUCT_NAME,
1129 "HP Pavilion dv5 Notebook PC"),
1131 .driver_data = "20090506", /* F.16 */
1134 .ident = "dv6",
1135 .matches = {
1136 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1137 DMI_MATCH(DMI_PRODUCT_NAME,
1138 "HP Pavilion dv6 Notebook PC"),
1140 .driver_data = "20090423", /* F.21 */
1143 .ident = "HDX18",
1144 .matches = {
1145 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1146 DMI_MATCH(DMI_PRODUCT_NAME,
1147 "HP HDX18 Notebook PC"),
1149 .driver_data = "20090430", /* F.23 */
1152 * Acer eMachines G725 has the same problem. BIOS
1153 * V1.03 is known to be broken. V3.04 is known to
1154 * work. Between, there are V1.06, V2.06 and V3.03
1155 * that we don't have much idea about. For now,
1156 * blacklist anything older than V3.04.
1158 * http://bugzilla.kernel.org/show_bug.cgi?id=15104
1161 .ident = "G725",
1162 .matches = {
1163 DMI_MATCH(DMI_SYS_VENDOR, "eMachines"),
1164 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"),
1166 .driver_data = "20091216", /* V3.04 */
1168 { } /* terminate list */
1170 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1171 int year, month, date;
1172 char buf[9];
1174 if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2))
1175 return false;
1177 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
1178 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
1180 return strcmp(buf, dmi->driver_data) < 0;
1183 static bool ahci_broken_online(struct pci_dev *pdev)
1185 #define ENCODE_BUSDEVFN(bus, slot, func) \
1186 (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func)))
1187 static const struct dmi_system_id sysids[] = {
1189 * There are several gigabyte boards which use
1190 * SIMG5723s configured as hardware RAID. Certain
1191 * 5723 firmware revisions shipped there keep the link
1192 * online but fail to answer properly to SRST or
1193 * IDENTIFY when no device is attached downstream
1194 * causing libata to retry quite a few times leading
1195 * to excessive detection delay.
1197 * As these firmwares respond to the second reset try
1198 * with invalid device signature, considering unknown
1199 * sig as offline works around the problem acceptably.
1202 .ident = "EP45-DQ6",
1203 .matches = {
1204 DMI_MATCH(DMI_BOARD_VENDOR,
1205 "Gigabyte Technology Co., Ltd."),
1206 DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"),
1208 .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0),
1211 .ident = "EP45-DS5",
1212 .matches = {
1213 DMI_MATCH(DMI_BOARD_VENDOR,
1214 "Gigabyte Technology Co., Ltd."),
1215 DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"),
1217 .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0),
1219 { } /* terminate list */
1221 #undef ENCODE_BUSDEVFN
1222 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1223 unsigned int val;
1225 if (!dmi)
1226 return false;
1228 val = (unsigned long)dmi->driver_data;
1230 return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff);
1233 static bool ahci_broken_devslp(struct pci_dev *pdev)
1235 /* device with broken DEVSLP but still showing SDS capability */
1236 static const struct pci_device_id ids[] = {
1237 { PCI_VDEVICE(INTEL, 0x0f23)}, /* Valleyview SoC */
1241 return pci_match_id(ids, pdev);
1244 #ifdef CONFIG_ATA_ACPI
1245 static void ahci_gtf_filter_workaround(struct ata_host *host)
1247 static const struct dmi_system_id sysids[] = {
1249 * Aspire 3810T issues a bunch of SATA enable commands
1250 * via _GTF including an invalid one and one which is
1251 * rejected by the device. Among the successful ones
1252 * is FPDMA non-zero offset enable which when enabled
1253 * only on the drive side leads to NCQ command
1254 * failures. Filter it out.
1257 .ident = "Aspire 3810T",
1258 .matches = {
1259 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1260 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3810T"),
1262 .driver_data = (void *)ATA_ACPI_FILTER_FPDMA_OFFSET,
1266 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1267 unsigned int filter;
1268 int i;
1270 if (!dmi)
1271 return;
1273 filter = (unsigned long)dmi->driver_data;
1274 dev_info(host->dev, "applying extra ACPI _GTF filter 0x%x for %s\n",
1275 filter, dmi->ident);
1277 for (i = 0; i < host->n_ports; i++) {
1278 struct ata_port *ap = host->ports[i];
1279 struct ata_link *link;
1280 struct ata_device *dev;
1282 ata_for_each_link(link, ap, EDGE)
1283 ata_for_each_dev(dev, link, ALL)
1284 dev->gtf_filter |= filter;
1287 #else
1288 static inline void ahci_gtf_filter_workaround(struct ata_host *host)
1290 #endif
1292 static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports,
1293 struct ahci_host_priv *hpriv)
1295 int rc, nvec;
1297 if (hpriv->flags & AHCI_HFLAG_NO_MSI)
1298 goto intx;
1300 nvec = pci_msi_vec_count(pdev);
1301 if (nvec < 0)
1302 goto intx;
1305 * If number of MSIs is less than number of ports then Sharing Last
1306 * Message mode could be enforced. In this case assume that advantage
1307 * of multipe MSIs is negated and use single MSI mode instead.
1309 if (nvec < n_ports)
1310 goto single_msi;
1312 rc = pci_enable_msi_exact(pdev, nvec);
1313 if (rc == -ENOSPC)
1314 goto single_msi;
1315 else if (rc < 0)
1316 goto intx;
1318 /* fallback to single MSI mode if the controller enforced MRSM mode */
1319 if (readl(hpriv->mmio + HOST_CTL) & HOST_MRSM) {
1320 pci_disable_msi(pdev);
1321 printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n");
1322 goto single_msi;
1325 if (nvec > 1)
1326 hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
1328 return nvec;
1330 single_msi:
1331 if (pci_enable_msi(pdev))
1332 goto intx;
1333 return 1;
1335 intx:
1336 pci_intx(pdev, 1);
1337 return 0;
1340 static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1342 unsigned int board_id = ent->driver_data;
1343 struct ata_port_info pi = ahci_port_info[board_id];
1344 const struct ata_port_info *ppi[] = { &pi, NULL };
1345 struct device *dev = &pdev->dev;
1346 struct ahci_host_priv *hpriv;
1347 struct ata_host *host;
1348 int n_ports, i, rc;
1349 int ahci_pci_bar = AHCI_PCI_BAR_STANDARD;
1351 VPRINTK("ENTER\n");
1353 WARN_ON((int)ATA_MAX_QUEUE > AHCI_MAX_CMDS);
1355 ata_print_version_once(&pdev->dev, DRV_VERSION);
1357 /* The AHCI driver can only drive the SATA ports, the PATA driver
1358 can drive them all so if both drivers are selected make sure
1359 AHCI stays out of the way */
1360 if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
1361 return -ENODEV;
1363 /* Apple BIOS on MCP89 prevents us using AHCI */
1364 if (is_mcp89_apple(pdev))
1365 ahci_mcp89_apple_enable(pdev);
1367 /* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode.
1368 * At the moment, we can only use the AHCI mode. Let the users know
1369 * that for SAS drives they're out of luck.
1371 if (pdev->vendor == PCI_VENDOR_ID_PROMISE)
1372 dev_info(&pdev->dev,
1373 "PDC42819 can only drive SATA devices with this driver\n");
1375 /* Both Connext and Enmotus devices use non-standard BARs */
1376 if (pdev->vendor == PCI_VENDOR_ID_STMICRO && pdev->device == 0xCC06)
1377 ahci_pci_bar = AHCI_PCI_BAR_STA2X11;
1378 else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
1379 ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
1381 /* acquire resources */
1382 rc = pcim_enable_device(pdev);
1383 if (rc)
1384 return rc;
1386 if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
1387 (pdev->device == 0x2652 || pdev->device == 0x2653)) {
1388 u8 map;
1390 /* ICH6s share the same PCI ID for both piix and ahci
1391 * modes. Enabling ahci mode while MAP indicates
1392 * combined mode is a bad idea. Yield to ata_piix.
1394 pci_read_config_byte(pdev, ICH_MAP, &map);
1395 if (map & 0x3) {
1396 dev_info(&pdev->dev,
1397 "controller is in combined mode, can't enable AHCI mode\n");
1398 return -ENODEV;
1402 /* AHCI controllers often implement SFF compatible interface.
1403 * Grab all PCI BARs just in case.
1405 rc = pcim_iomap_regions_request_all(pdev, 1 << ahci_pci_bar, DRV_NAME);
1406 if (rc == -EBUSY)
1407 pcim_pin_device(pdev);
1408 if (rc)
1409 return rc;
1411 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
1412 if (!hpriv)
1413 return -ENOMEM;
1414 hpriv->flags |= (unsigned long)pi.private_data;
1416 /* MCP65 revision A1 and A2 can't do MSI */
1417 if (board_id == board_ahci_mcp65 &&
1418 (pdev->revision == 0xa1 || pdev->revision == 0xa2))
1419 hpriv->flags |= AHCI_HFLAG_NO_MSI;
1421 /* SB800 does NOT need the workaround to ignore SERR_INTERNAL */
1422 if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
1423 hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
1425 /* only some SB600s can do 64bit DMA */
1426 if (ahci_sb600_enable_64bit(pdev))
1427 hpriv->flags &= ~AHCI_HFLAG_32BIT_ONLY;
1429 hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar];
1431 /* must set flag prior to save config in order to take effect */
1432 if (ahci_broken_devslp(pdev))
1433 hpriv->flags |= AHCI_HFLAG_NO_DEVSLP;
1435 /* save initial config */
1436 ahci_pci_save_initial_config(pdev, hpriv);
1438 /* prepare host */
1439 if (hpriv->cap & HOST_CAP_NCQ) {
1440 pi.flags |= ATA_FLAG_NCQ;
1442 * Auto-activate optimization is supposed to be
1443 * supported on all AHCI controllers indicating NCQ
1444 * capability, but it seems to be broken on some
1445 * chipsets including NVIDIAs.
1447 if (!(hpriv->flags & AHCI_HFLAG_NO_FPDMA_AA))
1448 pi.flags |= ATA_FLAG_FPDMA_AA;
1451 * All AHCI controllers should be forward-compatible
1452 * with the new auxiliary field. This code should be
1453 * conditionalized if any buggy AHCI controllers are
1454 * encountered.
1456 pi.flags |= ATA_FLAG_FPDMA_AUX;
1459 if (hpriv->cap & HOST_CAP_PMP)
1460 pi.flags |= ATA_FLAG_PMP;
1462 ahci_set_em_messages(hpriv, &pi);
1464 if (ahci_broken_system_poweroff(pdev)) {
1465 pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
1466 dev_info(&pdev->dev,
1467 "quirky BIOS, skipping spindown on poweroff\n");
1470 if (ahci_broken_suspend(pdev)) {
1471 hpriv->flags |= AHCI_HFLAG_NO_SUSPEND;
1472 dev_warn(&pdev->dev,
1473 "BIOS update required for suspend/resume\n");
1476 if (ahci_broken_online(pdev)) {
1477 hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE;
1478 dev_info(&pdev->dev,
1479 "online status unreliable, applying workaround\n");
1482 /* CAP.NP sometimes indicate the index of the last enabled
1483 * port, at other times, that of the last possible port, so
1484 * determining the maximum port number requires looking at
1485 * both CAP.NP and port_map.
1487 n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
1489 ahci_init_interrupts(pdev, n_ports, hpriv);
1491 host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
1492 if (!host)
1493 return -ENOMEM;
1494 host->private_data = hpriv;
1496 if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
1497 host->flags |= ATA_HOST_PARALLEL_SCAN;
1498 else
1499 dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n");
1501 if (pi.flags & ATA_FLAG_EM)
1502 ahci_reset_em(host);
1504 for (i = 0; i < host->n_ports; i++) {
1505 struct ata_port *ap = host->ports[i];
1507 ata_port_pbar_desc(ap, ahci_pci_bar, -1, "abar");
1508 ata_port_pbar_desc(ap, ahci_pci_bar,
1509 0x100 + ap->port_no * 0x80, "port");
1511 /* set enclosure management message type */
1512 if (ap->flags & ATA_FLAG_EM)
1513 ap->em_message_type = hpriv->em_msg_type;
1516 /* disabled/not-implemented port */
1517 if (!(hpriv->port_map & (1 << i)))
1518 ap->ops = &ata_dummy_port_ops;
1521 /* apply workaround for ASUS P5W DH Deluxe mainboard */
1522 ahci_p5wdh_workaround(host);
1524 /* apply gtf filter quirk */
1525 ahci_gtf_filter_workaround(host);
1527 /* initialize adapter */
1528 rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
1529 if (rc)
1530 return rc;
1532 rc = ahci_pci_reset_controller(host);
1533 if (rc)
1534 return rc;
1536 ahci_pci_init_controller(host);
1537 ahci_pci_print_info(host);
1539 pci_set_master(pdev);
1541 return ahci_host_activate(host, pdev->irq, &ahci_sht);
1544 module_pci_driver(ahci_pci_driver);
1546 MODULE_AUTHOR("Jeff Garzik");
1547 MODULE_DESCRIPTION("AHCI SATA low-level driver");
1548 MODULE_LICENSE("GPL");
1549 MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
1550 MODULE_VERSION(DRV_VERSION);