Root/target/linux/cns3xxx/patches-2.6.31/102-cns3xxx_ata_support.patch

1--- /dev/null
2+++ b/drivers/ata/cns3xxx_ahci.c
3@@ -0,0 +1,3281 @@
4+/*
5+ * ahci.c - AHCI SATA support
6+ *
7+ * Maintained by: Jeff Garzik <jgarzik@pobox.com>
8+ * Please ALWAYS copy linux-ide@vger.kernel.org
9+ * on emails.
10+ *
11+ * Copyright 2004-2005 Red Hat, Inc.
12+ *
13+ *
14+ * This program is free software; you can redistribute it and/or modify
15+ * it under the terms of the GNU General Public License as published by
16+ * the Free Software Foundation; either version 2, or (at your option)
17+ * any later version.
18+ *
19+ * This program is distributed in the hope that it will be useful,
20+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
21+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22+ * GNU General Public License for more details.
23+ *
24+ * You should have received a copy of the GNU General Public License
25+ * along with this program; see the file COPYING. If not, write to
26+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
27+ *
28+ *
29+ * libata documentation is available via 'make {ps|pdf}docs',
30+ * as Documentation/DocBook/libata.*
31+ *
32+ * AHCI hardware documentation:
33+ * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf
34+ * http://www.intel.com/technology/serialata/pdf/rev1_1.pdf
35+ *
36+ */
37+/*
38+ * Cavium CNS3XXX notice
39+ * This driver is copy from ahci, and this driver only modify memory access function.
40+ * Let the driver support non-PCI device
41+ */
42+#include <linux/kernel.h>
43+#include <linux/module.h>
44+#include <linux/pci.h>
45+#include <linux/init.h>
46+#include <linux/blkdev.h>
47+#include <linux/delay.h>
48+#include <linux/interrupt.h>
49+#include <linux/dma-mapping.h>
50+#include <linux/device.h>
51+#include <linux/dmi.h>
52+#include <scsi/scsi_host.h>
53+#include <scsi/scsi_cmnd.h>
54+#include <linux/libata.h>
55+#include <linux/platform_device.h>
56+#include <mach/pm.h>
57+#include <mach/misc.h>
58+
59+#define DRV_NAME "cns3xxx_ahci"
60+#define DRV_VERSION "3.0"
61+
62+#define MISC_REG_VALUE(offset) (*((volatile unsigned int *)(CNS3XXX_MISC_BASE_VIRT+offset)))
63+#define CNS3XXX_MISC_REGISTER MISC_REG_VALUE(0x514)
64+#define AHCI_REG_VALUE(offset) (*((volatile unsigned int *)(CNS3XXX_SATA2_BASE_VIRT+offset)))
65+#define CNS3XXX_AHCI_HOSTCTL_REG AHCI_REG_VALUE(0x04)
66+
67+/* Enclosure Management Control */
68+#define EM_CTRL_MSG_TYPE 0x000f0000
69+
70+/* Enclosure Management LED Message Type */
71+#define EM_MSG_LED_HBA_PORT 0x0000000f
72+#define EM_MSG_LED_PMP_SLOT 0x0000ff00
73+#define EM_MSG_LED_VALUE 0xffff0000
74+#define EM_MSG_LED_VALUE_ACTIVITY 0x00070000
75+#define EM_MSG_LED_VALUE_OFF 0xfff80000
76+#define EM_MSG_LED_VALUE_ON 0x00010000
77+
78+/* PHY Misc Define */
79+#define MISC_SATA_POWER_MODE MISC_MEM_MAP_VALUE(0x310)
80+#define MISC_SATA_CORE_ID MISC_MEM_MAP_VALUE(0x600)
81+#define MISC_SATA_PORT0_PHY_CFG MISC_MEM_MAP_VALUE(0x604)
82+#define MISC_SATA_PORT1_PHY_CFG MISC_MEM_MAP_VALUE(0x608)
83+#define MISC_SATA_PORT0_PHY_TST MISC_MEM_MAP_VALUE(0x60C)
84+#define MISC_SATA_PORT1_PHY_TST MISC_MEM_MAP_VALUE(0x610)
85+
86+
87+static int ahci_skip_host_reset;
88+static int ahci_ignore_sss;
89+
90+module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
91+MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
92+
93+module_param_named(ignore_sss, ahci_ignore_sss, int, 0444);
94+MODULE_PARM_DESC(ignore_sss, "Ignore staggered spinup flag (0=don't ignore, 1=ignore)");
95+
96+static int ahci_enable_alpm(struct ata_port *ap,
97+ enum link_pm policy);
98+static void ahci_disable_alpm(struct ata_port *ap);
99+static ssize_t ahci_led_show(struct ata_port *ap, char *buf);
100+static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
101+ size_t size);
102+static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
103+ ssize_t size);
104+
105+enum {
106+ AHCI_PCI_BAR = 5,
107+ AHCI_MAX_PORTS = 32,
108+ AHCI_MAX_SG = 168, /* hardware max is 64K */
109+ AHCI_DMA_BOUNDARY = 0xffffffff,
110+ AHCI_MAX_CMDS = 32,
111+ AHCI_CMD_SZ = 32,
112+ AHCI_CMD_SLOT_SZ = AHCI_MAX_CMDS * AHCI_CMD_SZ,
113+ AHCI_RX_FIS_SZ = 256,
114+ AHCI_CMD_TBL_CDB = 0x40,
115+ AHCI_CMD_TBL_HDR_SZ = 0x80,
116+ AHCI_CMD_TBL_SZ = AHCI_CMD_TBL_HDR_SZ + (AHCI_MAX_SG * 16),
117+ AHCI_CMD_TBL_AR_SZ = AHCI_CMD_TBL_SZ * AHCI_MAX_CMDS,
118+ AHCI_PORT_PRIV_DMA_SZ = AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_AR_SZ +
119+ AHCI_RX_FIS_SZ,
120+ AHCI_IRQ_ON_SG = (1 << 31),
121+ AHCI_CMD_ATAPI = (1 << 5),
122+ AHCI_CMD_WRITE = (1 << 6),
123+ AHCI_CMD_PREFETCH = (1 << 7),
124+ AHCI_CMD_RESET = (1 << 8),
125+ AHCI_CMD_CLR_BUSY = (1 << 10),
126+
127+ RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */
128+ RX_FIS_SDB = 0x58, /* offset of SDB FIS data */
129+ RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */
130+
131+ board_ahci = 0,
132+ board_ahci_vt8251 = 1,
133+ board_ahci_ign_iferr = 2,
134+ board_ahci_sb600 = 3,
135+ board_ahci_mv = 4,
136+ board_ahci_sb700 = 5, /* for SB700 and SB800 */
137+ board_ahci_mcp65 = 6,
138+ board_ahci_nopmp = 7,
139+ board_ahci_yesncq = 8,
140+
141+ /* global controller registers */
142+ HOST_CAP = 0x00, /* host capabilities */
143+ HOST_CTL = 0x04, /* global host control */
144+ HOST_IRQ_STAT = 0x08, /* interrupt status */
145+ HOST_PORTS_IMPL = 0x0c, /* bitmap of implemented ports */
146+ HOST_VERSION = 0x10, /* AHCI spec. version compliancy */
147+ HOST_EM_LOC = 0x1c, /* Enclosure Management location */
148+ HOST_EM_CTL = 0x20, /* Enclosure Management Control */
149+
150+ /* HOST_CTL bits */
151+ HOST_RESET = (1 << 0), /* reset controller; self-clear */
152+ HOST_IRQ_EN = (1 << 1), /* global IRQ enable */
153+ HOST_AHCI_EN = (1 << 31), /* AHCI enabled */
154+
155+ /* HOST_CAP bits */
156+ HOST_CAP_EMS = (1 << 6), /* Enclosure Management support */
157+ HOST_CAP_SSC = (1 << 14), /* Slumber capable */
158+ HOST_CAP_PMP = (1 << 17), /* Port Multiplier support */
159+ HOST_CAP_CLO = (1 << 24), /* Command List Override support */
160+ HOST_CAP_ALPM = (1 << 26), /* Aggressive Link PM support */
161+ HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */
162+ HOST_CAP_SNTF = (1 << 29), /* SNotification register */
163+ HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */
164+ HOST_CAP_64 = (1 << 31), /* PCI DAC (64-bit DMA) support */
165+
166+ /* registers for each SATA port */
167+ PORT_LST_ADDR = 0x00, /* command list DMA addr */
168+ PORT_LST_ADDR_HI = 0x04, /* command list DMA addr hi */
169+ PORT_FIS_ADDR = 0x08, /* FIS rx buf addr */
170+ PORT_FIS_ADDR_HI = 0x0c, /* FIS rx buf addr hi */
171+ PORT_IRQ_STAT = 0x10, /* interrupt status */
172+ PORT_IRQ_MASK = 0x14, /* interrupt enable/disable mask */
173+ PORT_CMD = 0x18, /* port command */
174+ PORT_TFDATA = 0x20, /* taskfile data */
175+ PORT_SIG = 0x24, /* device TF signature */
176+ PORT_CMD_ISSUE = 0x38, /* command issue */
177+ PORT_SCR_STAT = 0x28, /* SATA phy register: SStatus */
178+ PORT_SCR_CTL = 0x2c, /* SATA phy register: SControl */
179+ PORT_SCR_ERR = 0x30, /* SATA phy register: SError */
180+ PORT_SCR_ACT = 0x34, /* SATA phy register: SActive */
181+ PORT_SCR_NTF = 0x3c, /* SATA phy register: SNotification */
182+
183+ /* PORT_IRQ_{STAT,MASK} bits */
184+ PORT_IRQ_COLD_PRES = (1 << 31), /* cold presence detect */
185+ PORT_IRQ_TF_ERR = (1 << 30), /* task file error */
186+ PORT_IRQ_HBUS_ERR = (1 << 29), /* host bus fatal error */
187+ PORT_IRQ_HBUS_DATA_ERR = (1 << 28), /* host bus data error */
188+ PORT_IRQ_IF_ERR = (1 << 27), /* interface fatal error */
189+ PORT_IRQ_IF_NONFATAL = (1 << 26), /* interface non-fatal error */
190+ PORT_IRQ_OVERFLOW = (1 << 24), /* xfer exhausted available S/G */
191+ PORT_IRQ_BAD_PMP = (1 << 23), /* incorrect port multiplier */
192+
193+ PORT_IRQ_PHYRDY = (1 << 22), /* PhyRdy changed */
194+ PORT_IRQ_DEV_ILCK = (1 << 7), /* device interlock */
195+ PORT_IRQ_CONNECT = (1 << 6), /* port connect change status */
196+ PORT_IRQ_SG_DONE = (1 << 5), /* descriptor processed */
197+ PORT_IRQ_UNK_FIS = (1 << 4), /* unknown FIS rx'd */
198+ PORT_IRQ_SDB_FIS = (1 << 3), /* Set Device Bits FIS rx'd */
199+ PORT_IRQ_DMAS_FIS = (1 << 2), /* DMA Setup FIS rx'd */
200+ PORT_IRQ_PIOS_FIS = (1 << 1), /* PIO Setup FIS rx'd */
201+ PORT_IRQ_D2H_REG_FIS = (1 << 0), /* D2H Register FIS rx'd */
202+
203+ PORT_IRQ_FREEZE = PORT_IRQ_HBUS_ERR |
204+ PORT_IRQ_IF_ERR |
205+ PORT_IRQ_CONNECT |
206+ PORT_IRQ_PHYRDY |
207+ PORT_IRQ_UNK_FIS |
208+ PORT_IRQ_BAD_PMP,
209+ PORT_IRQ_ERROR = PORT_IRQ_FREEZE |
210+ PORT_IRQ_TF_ERR |
211+ PORT_IRQ_HBUS_DATA_ERR,
212+ DEF_PORT_IRQ = PORT_IRQ_ERROR | PORT_IRQ_SG_DONE |
213+ PORT_IRQ_SDB_FIS | PORT_IRQ_DMAS_FIS |
214+ PORT_IRQ_PIOS_FIS | PORT_IRQ_D2H_REG_FIS,
215+
216+ /* PORT_CMD bits */
217+ PORT_CMD_ASP = (1 << 27), /* Aggressive Slumber/Partial */
218+ PORT_CMD_ALPE = (1 << 26), /* Aggressive Link PM enable */
219+ PORT_CMD_ATAPI = (1 << 24), /* Device is ATAPI */
220+ PORT_CMD_PMP = (1 << 17), /* PMP attached */
221+ PORT_CMD_LIST_ON = (1 << 15), /* cmd list DMA engine running */
222+ PORT_CMD_FIS_ON = (1 << 14), /* FIS DMA engine running */
223+ PORT_CMD_FIS_RX = (1 << 4), /* Enable FIS receive DMA engine */
224+ PORT_CMD_CLO = (1 << 3), /* Command list override */
225+ PORT_CMD_POWER_ON = (1 << 2), /* Power up device */
226+ PORT_CMD_SPIN_UP = (1 << 1), /* Spin up device */
227+ PORT_CMD_START = (1 << 0), /* Enable port DMA engine */
228+
229+ PORT_CMD_ICC_MASK = (0xf << 28), /* i/f ICC state mask */
230+ PORT_CMD_ICC_ACTIVE = (0x1 << 28), /* Put i/f in active state */
231+ PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
232+ PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
233+
234+ /* hpriv->flags bits */
235+ AHCI_HFLAG_NO_NCQ = (1 << 0),
236+ AHCI_HFLAG_IGN_IRQ_IF_ERR = (1 << 1), /* ignore IRQ_IF_ERR */
237+ AHCI_HFLAG_IGN_SERR_INTERNAL = (1 << 2), /* ignore SERR_INTERNAL */
238+ AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */
239+ AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */
240+ AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */
241+ AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */
242+ AHCI_HFLAG_NO_HOTPLUG = (1 << 7), /* ignore PxSERR.DIAG.N */
243+ AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */
244+ AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */
245+ AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
246+ AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
247+ link offline */
248+
249+ /* ap->flags bits */
250+
251+ AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
252+ ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
253+ ATA_FLAG_ACPI_SATA | ATA_FLAG_AN |
254+ ATA_FLAG_IPM,
255+
256+ ICH_MAP = 0x90, /* ICH MAP register */
257+
258+ /* em constants */
259+ EM_MAX_SLOTS = 8,
260+ EM_MAX_RETRY = 5,
261+
262+ /* em_ctl bits */
263+ EM_CTL_RST = (1 << 9), /* Reset */
264+ EM_CTL_TM = (1 << 8), /* Transmit Message */
265+ EM_CTL_ALHD = (1 << 26), /* Activity LED */
266+
267+ /* CNS3XXX define */
268+ HOST_TIMER1MS = 0xe0, /* Timer 1ms register */
269+};
270+
271+struct ahci_cmd_hdr {
272+ __le32 opts;
273+ __le32 status;
274+ __le32 tbl_addr;
275+ __le32 tbl_addr_hi;
276+ __le32 reserved[4];
277+};
278+
279+struct ahci_sg {
280+ __le32 addr;
281+ __le32 addr_hi;
282+ __le32 reserved;
283+ __le32 flags_size;
284+};
285+
286+struct ahci_em_priv {
287+ enum sw_activity blink_policy;
288+ struct timer_list timer;
289+ unsigned long saved_activity;
290+ unsigned long activity;
291+ unsigned long led_state;
292+};
293+
294+struct ahci_host_priv {
295+ unsigned int flags; /* AHCI_HFLAG_* */
296+ u32 cap; /* cap to use */
297+ u32 port_map; /* port map to use */
298+ u32 saved_cap; /* saved initial cap */
299+ u32 saved_port_map; /* saved initial port_map */
300+ u32 em_loc; /* enclosure management location */
301+};
302+
303+struct ahci_port_priv {
304+ struct ata_link *active_link;
305+ struct ahci_cmd_hdr *cmd_slot;
306+ dma_addr_t cmd_slot_dma;
307+ void *cmd_tbl;
308+ dma_addr_t cmd_tbl_dma;
309+ void *rx_fis;
310+ dma_addr_t rx_fis_dma;
311+ /* for NCQ spurious interrupt analysis */
312+ unsigned int ncq_saw_d2h:1;
313+ unsigned int ncq_saw_dmas:1;
314+ unsigned int ncq_saw_sdb:1;
315+ u32 intr_mask; /* interrupts to enable */
316+ /* enclosure management info per PM slot */
317+ struct ahci_em_priv em_priv[EM_MAX_SLOTS];
318+};
319+
320+static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
321+static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
322+#if 0
323+static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
324+#else
325+static int ahci_probe(struct platform_device *pdev);
326+static int ahci_remove(struct platform_device *pdev);
327+#endif
328+static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc);
329+static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
330+static int ahci_port_start(struct ata_port *ap);
331+static void ahci_port_stop(struct ata_port *ap);
332+static void ahci_qc_prep(struct ata_queued_cmd *qc);
333+static void ahci_freeze(struct ata_port *ap);
334+static void ahci_thaw(struct ata_port *ap);
335+static void ahci_pmp_attach(struct ata_port *ap);
336+static void ahci_pmp_detach(struct ata_port *ap);
337+static int ahci_softreset(struct ata_link *link, unsigned int *class,
338+ unsigned long deadline);
339+static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class,
340+ unsigned long deadline);
341+static int ahci_hardreset(struct ata_link *link, unsigned int *class,
342+ unsigned long deadline);
343+static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
344+ unsigned long deadline);
345+#if 0
346+static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
347+ unsigned long deadline);
348+#endif
349+static void ahci_postreset(struct ata_link *link, unsigned int *class);
350+static void ahci_error_handler(struct ata_port *ap);
351+static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
352+static int ahci_port_resume(struct ata_port *ap);
353+static void ahci_dev_config(struct ata_device *dev);
354+static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
355+ u32 opts);
356+#ifdef CONFIG_PM
357+static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
358+static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
359+static int ahci_pci_device_resume(struct pci_dev *pdev);
360+#endif
361+static ssize_t ahci_activity_show(struct ata_device *dev, char *buf);
362+static ssize_t ahci_activity_store(struct ata_device *dev,
363+ enum sw_activity val);
364+static void ahci_init_sw_activity(struct ata_link *link);
365+
366+static struct device_attribute *ahci_shost_attrs[] = {
367+ &dev_attr_link_power_management_policy,
368+ &dev_attr_em_message_type,
369+ &dev_attr_em_message,
370+ NULL
371+};
372+
373+static struct device_attribute *ahci_sdev_attrs[] = {
374+ &dev_attr_sw_activity,
375+ &dev_attr_unload_heads,
376+ NULL
377+};
378+
379+static struct scsi_host_template ahci_sht = {
380+ ATA_NCQ_SHT(DRV_NAME),
381+ .can_queue = AHCI_MAX_CMDS - 1,
382+ .sg_tablesize = AHCI_MAX_SG,
383+ .dma_boundary = AHCI_DMA_BOUNDARY,
384+ .shost_attrs = ahci_shost_attrs,
385+ .sdev_attrs = ahci_sdev_attrs,
386+};
387+
388+static struct ata_port_operations ahci_ops = {
389+ .inherits = &sata_pmp_port_ops,
390+
391+ .qc_defer = sata_pmp_qc_defer_cmd_switch,
392+ .qc_prep = ahci_qc_prep,
393+ .qc_issue = ahci_qc_issue,
394+ .qc_fill_rtf = ahci_qc_fill_rtf,
395+
396+ .freeze = ahci_freeze,
397+ .thaw = ahci_thaw,
398+ .softreset = ahci_softreset,
399+ .hardreset = ahci_hardreset,
400+ .postreset = ahci_postreset,
401+ .pmp_softreset = ahci_softreset,
402+ .error_handler = ahci_error_handler,
403+ .post_internal_cmd = ahci_post_internal_cmd,
404+ .dev_config = ahci_dev_config,
405+
406+ .scr_read = ahci_scr_read,
407+ .scr_write = ahci_scr_write,
408+ .pmp_attach = ahci_pmp_attach,
409+ .pmp_detach = ahci_pmp_detach,
410+
411+ .enable_pm = ahci_enable_alpm,
412+ .disable_pm = ahci_disable_alpm,
413+ .em_show = ahci_led_show,
414+ .em_store = ahci_led_store,
415+ .sw_activity_show = ahci_activity_show,
416+ .sw_activity_store = ahci_activity_store,
417+#ifdef CONFIG_PM
418+ .port_suspend = ahci_port_suspend,
419+ .port_resume = ahci_port_resume,
420+#endif
421+ .port_start = ahci_port_start,
422+ .port_stop = ahci_port_stop,
423+};
424+
425+static struct ata_port_operations ahci_vt8251_ops = {
426+ .inherits = &ahci_ops,
427+ .hardreset = ahci_vt8251_hardreset,
428+};
429+
430+#if 0
431+static struct ata_port_operations ahci_p5wdh_ops = {
432+ .inherits = &ahci_ops,
433+ .hardreset = ahci_p5wdh_hardreset,
434+};
435+#endif
436+
437+static struct ata_port_operations ahci_sb600_ops = {
438+ .inherits = &ahci_ops,
439+ .softreset = ahci_sb600_softreset,
440+ .pmp_softreset = ahci_sb600_softreset,
441+};
442+
443+#define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
444+
445+static const struct ata_port_info ahci_port_info[] = {
446+ [board_ahci] =
447+ {
448+ .flags = AHCI_FLAG_COMMON,
449+ .pio_mask = ATA_PIO4,
450+ .udma_mask = ATA_UDMA6,
451+ .port_ops = &ahci_ops,
452+ },
453+ [board_ahci_vt8251] =
454+ {
455+ AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP),
456+ .flags = AHCI_FLAG_COMMON,
457+ .pio_mask = ATA_PIO4,
458+ .udma_mask = ATA_UDMA6,
459+ .port_ops = &ahci_vt8251_ops,
460+ },
461+ [board_ahci_ign_iferr] =
462+ {
463+ AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
464+ .flags = AHCI_FLAG_COMMON,
465+ .pio_mask = ATA_PIO4,
466+ .udma_mask = ATA_UDMA6,
467+ .port_ops = &ahci_ops,
468+ },
469+ [board_ahci_sb600] =
470+ {
471+ AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
472+ AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255),
473+ .flags = AHCI_FLAG_COMMON,
474+ .pio_mask = ATA_PIO4,
475+ .udma_mask = ATA_UDMA6,
476+ .port_ops = &ahci_sb600_ops,
477+ },
478+ [board_ahci_mv] =
479+ {
480+ AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
481+ AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
482+ .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
483+ ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
484+ .pio_mask = ATA_PIO4,
485+ .udma_mask = ATA_UDMA6,
486+ .port_ops = &ahci_ops,
487+ },
488+ [board_ahci_sb700] = /* for SB700 and SB800 */
489+ {
490+ AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL),
491+ .flags = AHCI_FLAG_COMMON,
492+ .pio_mask = ATA_PIO4,
493+ .udma_mask = ATA_UDMA6,
494+ .port_ops = &ahci_sb600_ops,
495+ },
496+ [board_ahci_mcp65] =
497+ {
498+ AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ),
499+ .flags = AHCI_FLAG_COMMON,
500+ .pio_mask = ATA_PIO4,
501+ .udma_mask = ATA_UDMA6,
502+ .port_ops = &ahci_ops,
503+ },
504+ [board_ahci_nopmp] =
505+ {
506+ AHCI_HFLAGS (AHCI_HFLAG_NO_PMP),
507+ .flags = AHCI_FLAG_COMMON,
508+ .pio_mask = ATA_PIO4,
509+ .udma_mask = ATA_UDMA6,
510+ .port_ops = &ahci_ops,
511+ },
512+ /* board_ahci_yesncq */
513+ {
514+ AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ),
515+ .flags = AHCI_FLAG_COMMON,
516+ .pio_mask = ATA_PIO4,
517+ .udma_mask = ATA_UDMA6,
518+ .port_ops = &ahci_ops,
519+ },
520+};
521+
522+static const struct pci_device_id ahci_pci_tbl[] = {
523+ /* Intel */
524+ { PCI_VDEVICE(INTEL, 0x2652), board_ahci }, /* ICH6 */
525+ { PCI_VDEVICE(INTEL, 0x2653), board_ahci }, /* ICH6M */
526+ { PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
527+ { PCI_VDEVICE(INTEL, 0x27c5), board_ahci }, /* ICH7M */
528+ { PCI_VDEVICE(INTEL, 0x27c3), board_ahci }, /* ICH7R */
529+ { PCI_VDEVICE(AL, 0x5288), board_ahci_ign_iferr }, /* ULi M5288 */
530+ { PCI_VDEVICE(INTEL, 0x2681), board_ahci }, /* ESB2 */
531+ { PCI_VDEVICE(INTEL, 0x2682), board_ahci }, /* ESB2 */
532+ { PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
533+ { PCI_VDEVICE(INTEL, 0x27c6), board_ahci }, /* ICH7-M DH */
534+ { PCI_VDEVICE(INTEL, 0x2821), board_ahci }, /* ICH8 */
535+ { PCI_VDEVICE(INTEL, 0x2822), board_ahci }, /* ICH8 */
536+ { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */
537+ { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */
538+ { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */
539+ { PCI_VDEVICE(INTEL, 0x2922), board_ahci }, /* ICH9 */
540+ { PCI_VDEVICE(INTEL, 0x2923), board_ahci }, /* ICH9 */
541+ { PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */
542+ { PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */
543+ { PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */
544+ { PCI_VDEVICE(INTEL, 0x2929), board_ahci }, /* ICH9M */
545+ { PCI_VDEVICE(INTEL, 0x292a), board_ahci }, /* ICH9M */
546+ { PCI_VDEVICE(INTEL, 0x292b), board_ahci }, /* ICH9M */
547+ { PCI_VDEVICE(INTEL, 0x292c), board_ahci }, /* ICH9M */
548+ { PCI_VDEVICE(INTEL, 0x292f), board_ahci }, /* ICH9M */
549+ { PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */
550+ { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */
551+ { PCI_VDEVICE(INTEL, 0x502a), board_ahci }, /* Tolapai */
552+ { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
553+ { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
554+ { PCI_VDEVICE(INTEL, 0x3a22), board_ahci }, /* ICH10 */
555+ { PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
556+ { PCI_VDEVICE(INTEL, 0x3b22), board_ahci }, /* PCH AHCI */
557+ { PCI_VDEVICE(INTEL, 0x3b23), board_ahci }, /* PCH AHCI */
558+ { PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
559+ { PCI_VDEVICE(INTEL, 0x3b25), board_ahci }, /* PCH RAID */
560+ { PCI_VDEVICE(INTEL, 0x3b29), board_ahci }, /* PCH AHCI */
561+ { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
562+ { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci }, /* PCH RAID */
563+ { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */
564+
565+ /* JMicron 360/1/3/5/6, match class to avoid IDE function */
566+ { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
567+ PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
568+
569+ /* ATI */
570+ { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
571+ { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 }, /* ATI SB700/800 */
572+ { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 }, /* ATI SB700/800 */
573+ { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 }, /* ATI SB700/800 */
574+ { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 }, /* ATI SB700/800 */
575+ { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */
576+ { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */
577+
578+ /* VIA */
579+ { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */
580+ { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 }, /* VIA VT8251 */
581+
582+ /* NVIDIA */
583+ { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci_mcp65 }, /* MCP65 */
584+ { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci_mcp65 }, /* MCP65 */
585+ { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci_mcp65 }, /* MCP65 */
586+ { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci_mcp65 }, /* MCP65 */
587+ { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci_mcp65 }, /* MCP65 */
588+ { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 }, /* MCP65 */
589+ { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 }, /* MCP65 */
590+ { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 }, /* MCP65 */
591+ { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci_yesncq }, /* MCP67 */
592+ { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci_yesncq }, /* MCP67 */
593+ { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci_yesncq }, /* MCP67 */
594+ { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci_yesncq }, /* MCP67 */
595+ { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci_yesncq }, /* MCP67 */
596+ { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci_yesncq }, /* MCP67 */
597+ { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci_yesncq }, /* MCP67 */
598+ { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci_yesncq }, /* MCP67 */
599+ { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci_yesncq }, /* MCP67 */
600+ { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_yesncq }, /* MCP67 */
601+ { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_yesncq }, /* MCP67 */
602+ { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_yesncq }, /* MCP67 */
603+ { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_yesncq }, /* MCP73 */
604+ { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_yesncq }, /* MCP73 */
605+ { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_yesncq }, /* MCP73 */
606+ { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci_yesncq }, /* MCP73 */
607+ { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci_yesncq }, /* MCP73 */
608+ { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci_yesncq }, /* MCP73 */
609+ { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci_yesncq }, /* MCP73 */
610+ { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci_yesncq }, /* MCP73 */
611+ { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci_yesncq }, /* MCP73 */
612+ { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci_yesncq }, /* MCP73 */
613+ { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci_yesncq }, /* MCP73 */
614+ { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci_yesncq }, /* MCP73 */
615+ { PCI_VDEVICE(NVIDIA, 0x0ad0), board_ahci }, /* MCP77 */
616+ { PCI_VDEVICE(NVIDIA, 0x0ad1), board_ahci }, /* MCP77 */
617+ { PCI_VDEVICE(NVIDIA, 0x0ad2), board_ahci }, /* MCP77 */
618+ { PCI_VDEVICE(NVIDIA, 0x0ad3), board_ahci }, /* MCP77 */
619+ { PCI_VDEVICE(NVIDIA, 0x0ad4), board_ahci }, /* MCP77 */
620+ { PCI_VDEVICE(NVIDIA, 0x0ad5), board_ahci }, /* MCP77 */
621+ { PCI_VDEVICE(NVIDIA, 0x0ad6), board_ahci }, /* MCP77 */
622+ { PCI_VDEVICE(NVIDIA, 0x0ad7), board_ahci }, /* MCP77 */
623+ { PCI_VDEVICE(NVIDIA, 0x0ad8), board_ahci }, /* MCP77 */
624+ { PCI_VDEVICE(NVIDIA, 0x0ad9), board_ahci }, /* MCP77 */
625+ { PCI_VDEVICE(NVIDIA, 0x0ada), board_ahci }, /* MCP77 */
626+ { PCI_VDEVICE(NVIDIA, 0x0adb), board_ahci }, /* MCP77 */
627+ { PCI_VDEVICE(NVIDIA, 0x0ab4), board_ahci }, /* MCP79 */
628+ { PCI_VDEVICE(NVIDIA, 0x0ab5), board_ahci }, /* MCP79 */
629+ { PCI_VDEVICE(NVIDIA, 0x0ab6), board_ahci }, /* MCP79 */
630+ { PCI_VDEVICE(NVIDIA, 0x0ab7), board_ahci }, /* MCP79 */
631+ { PCI_VDEVICE(NVIDIA, 0x0ab8), board_ahci }, /* MCP79 */
632+ { PCI_VDEVICE(NVIDIA, 0x0ab9), board_ahci }, /* MCP79 */
633+ { PCI_VDEVICE(NVIDIA, 0x0aba), board_ahci }, /* MCP79 */
634+ { PCI_VDEVICE(NVIDIA, 0x0abb), board_ahci }, /* MCP79 */
635+ { PCI_VDEVICE(NVIDIA, 0x0abc), board_ahci }, /* MCP79 */
636+ { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci }, /* MCP79 */
637+ { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci }, /* MCP79 */
638+ { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci }, /* MCP79 */
639+ { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci }, /* MCP89 */
640+ { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci }, /* MCP89 */
641+ { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci }, /* MCP89 */
642+ { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci }, /* MCP89 */
643+ { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci }, /* MCP89 */
644+ { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci }, /* MCP89 */
645+ { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci }, /* MCP89 */
646+ { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci }, /* MCP89 */
647+ { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci }, /* MCP89 */
648+ { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci }, /* MCP89 */
649+ { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci }, /* MCP89 */
650+ { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci }, /* MCP89 */
651+
652+ /* SiS */
653+ { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
654+ { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */
655+ { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
656+
657+ /* Marvell */
658+ { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
659+ { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
660+
661+ /* Promise */
662+ { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
663+
664+ /* Generic, PCI class code for AHCI */
665+ { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
666+ PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
667+
668+ { } /* terminate list */
669+};
670+
671+
672+#if 0
673+static struct pci_driver ahci_pci_driver = {
674+ .name = DRV_NAME,
675+ .id_table = ahci_pci_tbl,
676+ .probe = ahci_init_one,
677+ .remove = ata_pci_remove_one,
678+#ifdef CONFIG_PM
679+ .suspend = ahci_pci_device_suspend,
680+ .resume = ahci_pci_device_resume,
681+#endif
682+};
683+#else
684+static struct platform_driver ahci_driver = {
685+ .probe = ahci_probe,
686+ .remove = __devexit_p(ahci_remove),
687+ .driver = {
688+ .name = DRV_NAME,
689+ .owner = THIS_MODULE,
690+ },
691+};
692+#endif
693+
694+static int ahci_em_messages = 1;
695+module_param(ahci_em_messages, int, 0444);
696+/* add other LED protocol types when they become supported */
697+MODULE_PARM_DESC(ahci_em_messages,
698+ "Set AHCI Enclosure Management Message type (0 = disabled, 1 = LED");
699+
700+#if defined(CONFIG_PATA_MARVELL) || defined(CONFIG_PATA_MARVELL_MODULE)
701+static int marvell_enable;
702+#else
703+static int marvell_enable = 1;
704+#endif
705+module_param(marvell_enable, int, 0644);
706+MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
707+
708+
709+static inline int ahci_nr_ports(u32 cap)
710+{
711+ return (cap & 0x1f) + 1;
712+}
713+
714+static inline void __iomem *__ahci_port_base(struct ata_host *host,
715+ unsigned int port_no)
716+{
717+#if 0
718+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
719+#else
720+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
721+#endif
722+
723+ return mmio + 0x100 + (port_no * 0x80);
724+}
725+
726+static inline void __iomem *ahci_port_base(struct ata_port *ap)
727+{
728+ return __ahci_port_base(ap->host, ap->port_no);
729+}
730+
731+static void ahci_enable_ahci(void __iomem *mmio)
732+{
733+ int i;
734+ u32 tmp;
735+
736+ /* turn on AHCI_EN */
737+ tmp = readl(mmio + HOST_CTL);
738+ if (tmp & HOST_AHCI_EN)
739+ return;
740+
741+ /* Some controllers need AHCI_EN to be written multiple times.
742+ * Try a few times before giving up.
743+ */
744+ for (i = 0; i < 5; i++) {
745+ tmp |= HOST_AHCI_EN;
746+ writel(tmp, mmio + HOST_CTL);
747+ tmp = readl(mmio + HOST_CTL); /* flush && sanity check */
748+ if (tmp & HOST_AHCI_EN)
749+ return;
750+ msleep(10);
751+ }
752+
753+ WARN_ON(1);
754+}
755+
756+/**
757+ * ahci_save_initial_config - Save and fixup initial config values
758+ * @pdev: target PCI device
759+ * @hpriv: host private area to store config values
760+ *
761+ * Some registers containing configuration info might be setup by
762+ * BIOS and might be cleared on reset. This function saves the
763+ * initial values of those registers into @hpriv such that they
764+ * can be restored after controller reset.
765+ *
766+ * If inconsistent, config values are fixed up by this function.
767+ *
768+ * LOCKING:
769+ * None.
770+ */
771+#if 0
772+static void ahci_save_initial_config(struct pci_dev *pdev,
773+ struct ahci_host_priv *hpriv)
774+#else
775+static void ahci_save_initial_config(struct platform_device *pdev,
776+ struct ahci_host_priv *hpriv,
777+ u8 * base)
778+#endif
779+{
780+#if 0
781+ void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
782+#else
783+ void __iomem *mmio = (void __iomem *)base;
784+#endif
785+ u32 cap, port_map;
786+ int i;
787+#if 0
788+ int mv;
789+#endif
790+
791+ /* make sure AHCI mode is enabled before accessing CAP */
792+ ahci_enable_ahci(mmio);
793+
794+ /* Values prefixed with saved_ are written back to host after
795+ * reset. Values without are used for driver operation.
796+ */
797+ hpriv->saved_cap = cap = readl(mmio + HOST_CAP);
798+ hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
799+
800+ /* some chips have errata preventing 64bit use */
801+ if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) {
802+ dev_printk(KERN_INFO, &pdev->dev,
803+ "controller can't do 64bit DMA, forcing 32bit\n");
804+ cap &= ~HOST_CAP_64;
805+ }
806+
807+ if ((cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_NO_NCQ)) {
808+ dev_printk(KERN_INFO, &pdev->dev,
809+ "controller can't do NCQ, turning off CAP_NCQ\n");
810+ cap &= ~HOST_CAP_NCQ;
811+ }
812+
813+ if (!(cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_YES_NCQ)) {
814+ dev_printk(KERN_INFO, &pdev->dev,
815+ "controller can do NCQ, turning on CAP_NCQ\n");
816+ cap |= HOST_CAP_NCQ;
817+ }
818+
819+ if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) {
820+ dev_printk(KERN_INFO, &pdev->dev,
821+ "controller can't do PMP, turning off CAP_PMP\n");
822+ cap &= ~HOST_CAP_PMP;
823+ }
824+#if 0
825+ if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361 &&
826+ port_map != 1) {
827+ dev_printk(KERN_INFO, &pdev->dev,
828+ "JMB361 has only one port, port_map 0x%x -> 0x%x\n",
829+ port_map, 1);
830+ port_map = 1;
831+ }
832+
833+ /*
834+ * Temporary Marvell 6145 hack: PATA port presence
835+ * is asserted through the standard AHCI port
836+ * presence register, as bit 4 (counting from 0)
837+ */
838+ if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
839+ if (pdev->device == 0x6121)
840+ mv = 0x3;
841+ else
842+ mv = 0xf;
843+ dev_printk(KERN_ERR, &pdev->dev,
844+ "MV_AHCI HACK: port_map %x -> %x\n",
845+ port_map,
846+ port_map & mv);
847+ dev_printk(KERN_ERR, &pdev->dev,
848+ "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
849+
850+ port_map &= mv;
851+ }
852+#endif
853+
854+ /* cross check port_map and cap.n_ports */
855+ if (port_map) {
856+ int map_ports = 0;
857+
858+ for (i = 0; i < AHCI_MAX_PORTS; i++)
859+ if (port_map & (1 << i))
860+ map_ports++;
861+
862+ /* If PI has more ports than n_ports, whine, clear
863+ * port_map and let it be generated from n_ports.
864+ */
865+ if (map_ports > ahci_nr_ports(cap)) {
866+ dev_printk(KERN_WARNING, &pdev->dev,
867+ "implemented port map (0x%x) contains more "
868+ "ports than nr_ports (%u), using nr_ports\n",
869+ port_map, ahci_nr_ports(cap));
870+ port_map = 0;
871+ }
872+ }
873+
874+ /* fabricate port_map from cap.nr_ports */
875+ if (!port_map) {
876+ port_map = (1 << ahci_nr_ports(cap)) - 1;
877+ dev_printk(KERN_WARNING, &pdev->dev,
878+ "forcing PORTS_IMPL to 0x%x\n", port_map);
879+
880+ /* write the fixed up value to the PI register */
881+ hpriv->saved_port_map = port_map;
882+ }
883+
884+ /* record values to use during operation */
885+ hpriv->cap = cap;
886+ hpriv->port_map = port_map;
887+}
888+
889+/**
890+ * ahci_restore_initial_config - Restore initial config
891+ * @host: target ATA host
892+ *
893+ * Restore initial config stored by ahci_save_initial_config().
894+ *
895+ * LOCKING:
896+ * None.
897+ */
898+static void ahci_restore_initial_config(struct ata_host *host)
899+{
900+ struct ahci_host_priv *hpriv = host->private_data;
901+#if 0
902+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
903+#else
904+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
905+#endif
906+
907+ writel(hpriv->saved_cap, mmio + HOST_CAP);
908+ writel(hpriv->saved_port_map, mmio + HOST_PORTS_IMPL);
909+ (void) readl(mmio + HOST_PORTS_IMPL); /* flush */
910+}
911+
912+static unsigned ahci_scr_offset(struct ata_port *ap, unsigned int sc_reg)
913+{
914+ static const int offset[] = {
915+ [SCR_STATUS] = PORT_SCR_STAT,
916+ [SCR_CONTROL] = PORT_SCR_CTL,
917+ [SCR_ERROR] = PORT_SCR_ERR,
918+ [SCR_ACTIVE] = PORT_SCR_ACT,
919+ [SCR_NOTIFICATION] = PORT_SCR_NTF,
920+ };
921+ struct ahci_host_priv *hpriv = ap->host->private_data;
922+
923+ if (sc_reg < ARRAY_SIZE(offset) &&
924+ (sc_reg != SCR_NOTIFICATION || (hpriv->cap & HOST_CAP_SNTF)))
925+ return offset[sc_reg];
926+ return 0;
927+}
928+
929+static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val)
930+{
931+ void __iomem *port_mmio = ahci_port_base(link->ap);
932+ int offset = ahci_scr_offset(link->ap, sc_reg);
933+
934+ if (offset) {
935+ *val = readl(port_mmio + offset);
936+ return 0;
937+ }
938+ return -EINVAL;
939+}
940+
941+static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val)
942+{
943+ void __iomem *port_mmio = ahci_port_base(link->ap);
944+ int offset = ahci_scr_offset(link->ap, sc_reg);
945+
946+ if (offset) {
947+ writel(val, port_mmio + offset);
948+ return 0;
949+ }
950+ return -EINVAL;
951+}
952+
953+static void ahci_start_engine(struct ata_port *ap)
954+{
955+ void __iomem *port_mmio = ahci_port_base(ap);
956+ u32 tmp;
957+
958+ /* start DMA */
959+ tmp = readl(port_mmio + PORT_CMD);
960+ tmp |= PORT_CMD_START;
961+ writel(tmp, port_mmio + PORT_CMD);
962+ readl(port_mmio + PORT_CMD); /* flush */
963+}
964+
965+static int ahci_stop_engine(struct ata_port *ap)
966+{
967+ void __iomem *port_mmio = ahci_port_base(ap);
968+ u32 tmp;
969+
970+ tmp = readl(port_mmio + PORT_CMD);
971+
972+ /* check if the HBA is idle */
973+ if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0)
974+ return 0;
975+
976+ /* setting HBA to idle */
977+ tmp &= ~PORT_CMD_START;
978+ writel(tmp, port_mmio + PORT_CMD);
979+
980+ /* wait for engine to stop. This could be as long as 500 msec */
981+ tmp = ata_wait_register(port_mmio + PORT_CMD,
982+ PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500);
983+ if (tmp & PORT_CMD_LIST_ON)
984+ return -EIO;
985+
986+ return 0;
987+}
988+
989+static void ahci_start_fis_rx(struct ata_port *ap)
990+{
991+ void __iomem *port_mmio = ahci_port_base(ap);
992+ struct ahci_host_priv *hpriv = ap->host->private_data;
993+ struct ahci_port_priv *pp = ap->private_data;
994+ u32 tmp;
995+
996+ /* set FIS registers */
997+ if (hpriv->cap & HOST_CAP_64)
998+ writel((pp->cmd_slot_dma >> 16) >> 16,
999+ port_mmio + PORT_LST_ADDR_HI);
1000+ writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
1001+
1002+ if (hpriv->cap & HOST_CAP_64)
1003+ writel((pp->rx_fis_dma >> 16) >> 16,
1004+ port_mmio + PORT_FIS_ADDR_HI);
1005+ writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR);
1006+
1007+ /* enable FIS reception */
1008+ tmp = readl(port_mmio + PORT_CMD);
1009+ tmp |= PORT_CMD_FIS_RX;
1010+ writel(tmp, port_mmio + PORT_CMD);
1011+
1012+ /* flush */
1013+ readl(port_mmio + PORT_CMD);
1014+}
1015+
1016+static int ahci_stop_fis_rx(struct ata_port *ap)
1017+{
1018+ void __iomem *port_mmio = ahci_port_base(ap);
1019+ u32 tmp;
1020+
1021+ /* disable FIS reception */
1022+ tmp = readl(port_mmio + PORT_CMD);
1023+ tmp &= ~PORT_CMD_FIS_RX;
1024+ writel(tmp, port_mmio + PORT_CMD);
1025+
1026+ /* wait for completion, spec says 500ms, give it 1000 */
1027+ tmp = ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_FIS_ON,
1028+ PORT_CMD_FIS_ON, 10, 1000);
1029+ if (tmp & PORT_CMD_FIS_ON)
1030+ return -EBUSY;
1031+
1032+ return 0;
1033+}
1034+
1035+static void ahci_power_up(struct ata_port *ap)
1036+{
1037+ struct ahci_host_priv *hpriv = ap->host->private_data;
1038+ void __iomem *port_mmio = ahci_port_base(ap);
1039+ u32 cmd;
1040+
1041+ cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
1042+
1043+ /* spin up device */
1044+ if (hpriv->cap & HOST_CAP_SSS) {
1045+ cmd |= PORT_CMD_SPIN_UP;
1046+ writel(cmd, port_mmio + PORT_CMD);
1047+ }
1048+
1049+ /* wake up link */
1050+ writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD);
1051+}
1052+
1053+static void ahci_disable_alpm(struct ata_port *ap)
1054+{
1055+ struct ahci_host_priv *hpriv = ap->host->private_data;
1056+ void __iomem *port_mmio = ahci_port_base(ap);
1057+ u32 cmd;
1058+ struct ahci_port_priv *pp = ap->private_data;
1059+
1060+ /* IPM bits should be disabled by libata-core */
1061+ /* get the existing command bits */
1062+ cmd = readl(port_mmio + PORT_CMD);
1063+
1064+ /* disable ALPM and ASP */
1065+ cmd &= ~PORT_CMD_ASP;
1066+ cmd &= ~PORT_CMD_ALPE;
1067+
1068+ /* force the interface back to active */
1069+ cmd |= PORT_CMD_ICC_ACTIVE;
1070+
1071+ /* write out new cmd value */
1072+ writel(cmd, port_mmio + PORT_CMD);
1073+ cmd = readl(port_mmio + PORT_CMD);
1074+
1075+ /* wait 10ms to be sure we've come out of any low power state */
1076+ msleep(10);
1077+
1078+ /* clear out any PhyRdy stuff from interrupt status */
1079+ writel(PORT_IRQ_PHYRDY, port_mmio + PORT_IRQ_STAT);
1080+
1081+ /* go ahead and clean out PhyRdy Change from Serror too */
1082+ ahci_scr_write(&ap->link, SCR_ERROR, ((1 << 16) | (1 << 18)));
1083+
1084+ /*
1085+ * Clear flag to indicate that we should ignore all PhyRdy
1086+ * state changes
1087+ */
1088+ hpriv->flags &= ~AHCI_HFLAG_NO_HOTPLUG;
1089+
1090+ /*
1091+ * Enable interrupts on Phy Ready.
1092+ */
1093+ pp->intr_mask |= PORT_IRQ_PHYRDY;
1094+ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
1095+
1096+ /*
1097+ * don't change the link pm policy - we can be called
1098+ * just to turn of link pm temporarily
1099+ */
1100+}
1101+
1102+static int ahci_enable_alpm(struct ata_port *ap,
1103+ enum link_pm policy)
1104+{
1105+ struct ahci_host_priv *hpriv = ap->host->private_data;
1106+ void __iomem *port_mmio = ahci_port_base(ap);
1107+ u32 cmd;
1108+ struct ahci_port_priv *pp = ap->private_data;
1109+ u32 asp;
1110+
1111+ /* Make sure the host is capable of link power management */
1112+ if (!(hpriv->cap & HOST_CAP_ALPM))
1113+ return -EINVAL;
1114+
1115+ switch (policy) {
1116+ case MAX_PERFORMANCE:
1117+ case NOT_AVAILABLE:
1118+ /*
1119+ * if we came here with NOT_AVAILABLE,
1120+ * it just means this is the first time we
1121+ * have tried to enable - default to max performance,
1122+ * and let the user go to lower power modes on request.
1123+ */
1124+ ahci_disable_alpm(ap);
1125+ return 0;
1126+ case MIN_POWER:
1127+ /* configure HBA to enter SLUMBER */
1128+ asp = PORT_CMD_ASP;
1129+ break;
1130+ case MEDIUM_POWER:
1131+ /* configure HBA to enter PARTIAL */
1132+ asp = 0;
1133+ break;
1134+ default:
1135+ return -EINVAL;
1136+ }
1137+
1138+ /*
1139+ * Disable interrupts on Phy Ready. This keeps us from
1140+ * getting woken up due to spurious phy ready interrupts
1141+ * TBD - Hot plug should be done via polling now, is
1142+ * that even supported?
1143+ */
1144+ pp->intr_mask &= ~PORT_IRQ_PHYRDY;
1145+ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
1146+
1147+ /*
1148+ * Set a flag to indicate that we should ignore all PhyRdy
1149+ * state changes since these can happen now whenever we
1150+ * change link state
1151+ */
1152+ hpriv->flags |= AHCI_HFLAG_NO_HOTPLUG;
1153+
1154+ /* get the existing command bits */
1155+ cmd = readl(port_mmio + PORT_CMD);
1156+
1157+ /*
1158+ * Set ASP based on Policy
1159+ */
1160+ cmd |= asp;
1161+
1162+ /*
1163+ * Setting this bit will instruct the HBA to aggressively
1164+ * enter a lower power link state when it's appropriate and
1165+ * based on the value set above for ASP
1166+ */
1167+ cmd |= PORT_CMD_ALPE;
1168+
1169+ /* write out new cmd value */
1170+ writel(cmd, port_mmio + PORT_CMD);
1171+ cmd = readl(port_mmio + PORT_CMD);
1172+
1173+ /* IPM bits should be set by libata-core */
1174+ return 0;
1175+}
1176+
1177+#ifdef CONFIG_PM
1178+static void ahci_power_down(struct ata_port *ap)
1179+{
1180+ struct ahci_host_priv *hpriv = ap->host->private_data;
1181+ void __iomem *port_mmio = ahci_port_base(ap);
1182+ u32 cmd, scontrol;
1183+
1184+ if (!(hpriv->cap & HOST_CAP_SSS))
1185+ return;
1186+
1187+ /* put device into listen mode, first set PxSCTL.DET to 0 */
1188+ scontrol = readl(port_mmio + PORT_SCR_CTL);
1189+ scontrol &= ~0xf;
1190+ writel(scontrol, port_mmio + PORT_SCR_CTL);
1191+
1192+ /* then set PxCMD.SUD to 0 */
1193+ cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
1194+ cmd &= ~PORT_CMD_SPIN_UP;
1195+ writel(cmd, port_mmio + PORT_CMD);
1196+}
1197+#endif
1198+
1199+static void ahci_start_port(struct ata_port *ap)
1200+{
1201+ struct ahci_port_priv *pp = ap->private_data;
1202+ struct ata_link *link;
1203+ struct ahci_em_priv *emp;
1204+ ssize_t rc;
1205+ int i;
1206+
1207+ /* enable FIS reception */
1208+ ahci_start_fis_rx(ap);
1209+
1210+ /* enable DMA */
1211+ ahci_start_engine(ap);
1212+
1213+ /* turn on LEDs */
1214+ if (ap->flags & ATA_FLAG_EM) {
1215+ ata_for_each_link(link, ap, EDGE) {
1216+ emp = &pp->em_priv[link->pmp];
1217+
1218+ /* EM Transmit bit maybe busy during init */
1219+ for (i = 0; i < EM_MAX_RETRY; i++) {
1220+ rc = ahci_transmit_led_message(ap,
1221+ emp->led_state,
1222+ 4);
1223+ if (rc == -EBUSY)
1224+ msleep(1);
1225+ else
1226+ break;
1227+ }
1228+ }
1229+ }
1230+
1231+ if (ap->flags & ATA_FLAG_SW_ACTIVITY)
1232+ ata_for_each_link(link, ap, EDGE)
1233+ ahci_init_sw_activity(link);
1234+
1235+}
1236+
1237+static int ahci_deinit_port(struct ata_port *ap, const char **emsg)
1238+{
1239+ int rc;
1240+
1241+ /* disable DMA */
1242+ rc = ahci_stop_engine(ap);
1243+ if (rc) {
1244+ *emsg = "failed to stop engine";
1245+ return rc;
1246+ }
1247+
1248+ /* disable FIS reception */
1249+ rc = ahci_stop_fis_rx(ap);
1250+ if (rc) {
1251+ *emsg = "failed stop FIS RX";
1252+ return rc;
1253+ }
1254+
1255+ return 0;
1256+}
1257+
1258+static int ahci_reset_controller(struct ata_host *host)
1259+{
1260+#if 0
1261+ struct pci_dev *pdev = to_pci_dev(host->dev);
1262+ struct ahci_host_priv *hpriv = host->private_data;
1263+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
1264+#else
1265+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
1266+#endif
1267+ u32 tmp;
1268+
1269+ /* we must be in AHCI mode, before using anything
1270+ * AHCI-specific, such as HOST_RESET.
1271+ */
1272+ ahci_enable_ahci(mmio);
1273+
1274+ /* global controller reset */
1275+ if (!ahci_skip_host_reset) {
1276+ tmp = readl(mmio + HOST_CTL);
1277+ if ((tmp & HOST_RESET) == 0) {
1278+ writel(tmp | HOST_RESET, mmio + HOST_CTL);
1279+ readl(mmio + HOST_CTL); /* flush */
1280+ }
1281+
1282+ /*
1283+ * to perform host reset, OS should set HOST_RESET
1284+ * and poll until this bit is read to be "0".
1285+ * reset must complete within 1 second, or
1286+ * the hardware should be considered fried.
1287+ */
1288+ tmp = ata_wait_register(mmio + HOST_CTL, HOST_RESET,
1289+ HOST_RESET, 10, 1000);
1290+
1291+ if (tmp & HOST_RESET) {
1292+ dev_printk(KERN_ERR, host->dev,
1293+ "controller reset failed (0x%x)\n", tmp);
1294+ return -EIO;
1295+ }
1296+
1297+ /* turn on AHCI mode */
1298+ ahci_enable_ahci(mmio);
1299+
1300+ /* Some registers might be cleared on reset. Restore
1301+ * initial values.
1302+ */
1303+ ahci_restore_initial_config(host);
1304+ } else
1305+ dev_printk(KERN_INFO, host->dev,
1306+ "skipping global host reset\n");
1307+
1308+#if 0
1309+ if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
1310+ u16 tmp16;
1311+
1312+ /* configure PCS */
1313+ pci_read_config_word(pdev, 0x92, &tmp16);
1314+ if ((tmp16 & hpriv->port_map) != hpriv->port_map) {
1315+ tmp16 |= hpriv->port_map;
1316+ pci_write_config_word(pdev, 0x92, tmp16);
1317+ }
1318+ }
1319+#endif
1320+
1321+ return 0;
1322+}
1323+
1324+static void ahci_sw_activity(struct ata_link *link)
1325+{
1326+ struct ata_port *ap = link->ap;
1327+ struct ahci_port_priv *pp = ap->private_data;
1328+ struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
1329+
1330+ if (!(link->flags & ATA_LFLAG_SW_ACTIVITY))
1331+ return;
1332+
1333+ emp->activity++;
1334+ if (!timer_pending(&emp->timer))
1335+ mod_timer(&emp->timer, jiffies + msecs_to_jiffies(10));
1336+}
1337+
1338+static void ahci_sw_activity_blink(unsigned long arg)
1339+{
1340+ struct ata_link *link = (struct ata_link *)arg;
1341+ struct ata_port *ap = link->ap;
1342+ struct ahci_port_priv *pp = ap->private_data;
1343+ struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
1344+ unsigned long led_message = emp->led_state;
1345+ u32 activity_led_state;
1346+ unsigned long flags;
1347+
1348+ led_message &= EM_MSG_LED_VALUE;
1349+ led_message |= ap->port_no | (link->pmp << 8);
1350+
1351+ /* check to see if we've had activity. If so,
1352+ * toggle state of LED and reset timer. If not,
1353+ * turn LED to desired idle state.
1354+ */
1355+ spin_lock_irqsave(ap->lock, flags);
1356+ if (emp->saved_activity != emp->activity) {
1357+ emp->saved_activity = emp->activity;
1358+ /* get the current LED state */
1359+ activity_led_state = led_message & EM_MSG_LED_VALUE_ON;
1360+
1361+ if (activity_led_state)
1362+ activity_led_state = 0;
1363+ else
1364+ activity_led_state = 1;
1365+
1366+ /* clear old state */
1367+ led_message &= ~EM_MSG_LED_VALUE_ACTIVITY;
1368+
1369+ /* toggle state */
1370+ led_message |= (activity_led_state << 16);
1371+ mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100));
1372+ } else {
1373+ /* switch to idle */
1374+ led_message &= ~EM_MSG_LED_VALUE_ACTIVITY;
1375+ if (emp->blink_policy == BLINK_OFF)
1376+ led_message |= (1 << 16);
1377+ }
1378+ spin_unlock_irqrestore(ap->lock, flags);
1379+ ahci_transmit_led_message(ap, led_message, 4);
1380+}
1381+
1382+static void ahci_init_sw_activity(struct ata_link *link)
1383+{
1384+ struct ata_port *ap = link->ap;
1385+ struct ahci_port_priv *pp = ap->private_data;
1386+ struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
1387+
1388+ /* init activity stats, setup timer */
1389+ emp->saved_activity = emp->activity = 0;
1390+ setup_timer(&emp->timer, ahci_sw_activity_blink, (unsigned long)link);
1391+
1392+ /* check our blink policy and set flag for link if it's enabled */
1393+ if (emp->blink_policy)
1394+ link->flags |= ATA_LFLAG_SW_ACTIVITY;
1395+}
1396+
1397+static int ahci_reset_em(struct ata_host *host)
1398+{
1399+#if 0
1400+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
1401+#else
1402+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
1403+#endif
1404+ u32 em_ctl;
1405+
1406+ em_ctl = readl(mmio + HOST_EM_CTL);
1407+ if ((em_ctl & EM_CTL_TM) || (em_ctl & EM_CTL_RST))
1408+ return -EINVAL;
1409+
1410+ writel(em_ctl | EM_CTL_RST, mmio + HOST_EM_CTL);
1411+ return 0;
1412+}
1413+
1414+static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
1415+ ssize_t size)
1416+{
1417+ struct ahci_host_priv *hpriv = ap->host->private_data;
1418+ struct ahci_port_priv *pp = ap->private_data;
1419+#if 0
1420+ void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
1421+#else
1422+ void __iomem *mmio = (void __iomem *)ap->host->iomap;//[AHCI_BAR];
1423+#endif
1424+ u32 em_ctl;
1425+ u32 message[] = {0, 0};
1426+ unsigned long flags;
1427+ int pmp;
1428+ struct ahci_em_priv *emp;
1429+
1430+ /* get the slot number from the message */
1431+ pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
1432+ if (pmp < EM_MAX_SLOTS)
1433+ emp = &pp->em_priv[pmp];
1434+ else
1435+ return -EINVAL;
1436+
1437+ spin_lock_irqsave(ap->lock, flags);
1438+
1439+ /*
1440+ * if we are still busy transmitting a previous message,
1441+ * do not allow
1442+ */
1443+ em_ctl = readl(mmio + HOST_EM_CTL);
1444+ if (em_ctl & EM_CTL_TM) {
1445+ spin_unlock_irqrestore(ap->lock, flags);
1446+ return -EBUSY;
1447+ }
1448+
1449+ /*
1450+ * create message header - this is all zero except for
1451+ * the message size, which is 4 bytes.
1452+ */
1453+ message[0] |= (4 << 8);
1454+
1455+ /* ignore 0:4 of byte zero, fill in port info yourself */
1456+ message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no);
1457+
1458+ /* write message to EM_LOC */
1459+ writel(message[0], mmio + hpriv->em_loc);
1460+ writel(message[1], mmio + hpriv->em_loc+4);
1461+
1462+ /* save off new led state for port/slot */
1463+ emp->led_state = state;
1464+
1465+ /*
1466+ * tell hardware to transmit the message
1467+ */
1468+ writel(em_ctl | EM_CTL_TM, mmio + HOST_EM_CTL);
1469+
1470+ spin_unlock_irqrestore(ap->lock, flags);
1471+ return size;
1472+}
1473+
1474+static ssize_t ahci_led_show(struct ata_port *ap, char *buf)
1475+{
1476+ struct ahci_port_priv *pp = ap->private_data;
1477+ struct ata_link *link;
1478+ struct ahci_em_priv *emp;
1479+ int rc = 0;
1480+
1481+ ata_for_each_link(link, ap, EDGE) {
1482+ emp = &pp->em_priv[link->pmp];
1483+ rc += sprintf(buf, "%lx\n", emp->led_state);
1484+ }
1485+ return rc;
1486+}
1487+
1488+static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
1489+ size_t size)
1490+{
1491+ int state;
1492+ int pmp;
1493+ struct ahci_port_priv *pp = ap->private_data;
1494+ struct ahci_em_priv *emp;
1495+
1496+ state = simple_strtoul(buf, NULL, 0);
1497+
1498+ /* get the slot number from the message */
1499+ pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
1500+ if (pmp < EM_MAX_SLOTS)
1501+ emp = &pp->em_priv[pmp];
1502+ else
1503+ return -EINVAL;
1504+
1505+ /* mask off the activity bits if we are in sw_activity
1506+ * mode, user should turn off sw_activity before setting
1507+ * activity led through em_message
1508+ */
1509+ if (emp->blink_policy)
1510+ state &= ~EM_MSG_LED_VALUE_ACTIVITY;
1511+
1512+ return ahci_transmit_led_message(ap, state, size);
1513+}
1514+
1515+static ssize_t ahci_activity_store(struct ata_device *dev, enum sw_activity val)
1516+{
1517+ struct ata_link *link = dev->link;
1518+ struct ata_port *ap = link->ap;
1519+ struct ahci_port_priv *pp = ap->private_data;
1520+ struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
1521+ u32 port_led_state = emp->led_state;
1522+
1523+ /* save the desired Activity LED behavior */
1524+ if (val == OFF) {
1525+ /* clear LFLAG */
1526+ link->flags &= ~(ATA_LFLAG_SW_ACTIVITY);
1527+
1528+ /* set the LED to OFF */
1529+ port_led_state &= EM_MSG_LED_VALUE_OFF;
1530+ port_led_state |= (ap->port_no | (link->pmp << 8));
1531+ ahci_transmit_led_message(ap, port_led_state, 4);
1532+ } else {
1533+ link->flags |= ATA_LFLAG_SW_ACTIVITY;
1534+ if (val == BLINK_OFF) {
1535+ /* set LED to ON for idle */
1536+ port_led_state &= EM_MSG_LED_VALUE_OFF;
1537+ port_led_state |= (ap->port_no | (link->pmp << 8));
1538+ port_led_state |= EM_MSG_LED_VALUE_ON; /* check this */
1539+ ahci_transmit_led_message(ap, port_led_state, 4);
1540+ }
1541+ }
1542+ emp->blink_policy = val;
1543+ return 0;
1544+}
1545+
1546+static ssize_t ahci_activity_show(struct ata_device *dev, char *buf)
1547+{
1548+ struct ata_link *link = dev->link;
1549+ struct ata_port *ap = link->ap;
1550+ struct ahci_port_priv *pp = ap->private_data;
1551+ struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
1552+
1553+ /* display the saved value of activity behavior for this
1554+ * disk.
1555+ */
1556+ return sprintf(buf, "%d\n", emp->blink_policy);
1557+}
1558+
1559+#if 0
1560+static void ahci_port_init(struct pci_dev *pdev, struct ata_port *ap,
1561+ int port_no, void __iomem *mmio,
1562+ void __iomem *port_mmio)
1563+#else
1564+static void ahci_port_init(struct platform_device *pdev, struct ata_port *ap,
1565+ int port_no, void __iomem *mmio,
1566+ void __iomem *port_mmio)
1567+#endif
1568+{
1569+ const char *emsg = NULL;
1570+ int rc;
1571+ u32 tmp;
1572+
1573+ /* make sure port is not active */
1574+ rc = ahci_deinit_port(ap, &emsg);
1575+ if (rc)
1576+ dev_printk(KERN_WARNING, &pdev->dev,
1577+ "%s (%d)\n", emsg, rc);
1578+
1579+ /* clear SError */
1580+ tmp = readl(port_mmio + PORT_SCR_ERR);
1581+ VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
1582+ writel(tmp, port_mmio + PORT_SCR_ERR);
1583+
1584+ /* clear port IRQ */
1585+ tmp = readl(port_mmio + PORT_IRQ_STAT);
1586+ VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
1587+ if (tmp)
1588+ writel(tmp, port_mmio + PORT_IRQ_STAT);
1589+
1590+ writel(1 << port_no, mmio + HOST_IRQ_STAT);
1591+}
1592+
1593+static void ahci_init_controller(struct ata_host *host)
1594+{
1595+ struct ahci_host_priv *hpriv = host->private_data;
1596+#if 0
1597+ struct pci_dev *pdev = to_pci_dev(host->dev);
1598+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
1599+#else
1600+ struct platform_device *pdev = to_platform_device(host->dev);
1601+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
1602+#endif
1603+ int i;
1604+ void __iomem *port_mmio;
1605+ u32 tmp;
1606+ int mv;
1607+
1608+ if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
1609+#if 0
1610+ if (pdev->device == 0x6121)
1611+ mv = 2;
1612+ else
1613+ mv = 4;
1614+#else
1615+ mv = 0;
1616+#endif
1617+ port_mmio = __ahci_port_base(host, mv);
1618+
1619+ writel(0, port_mmio + PORT_IRQ_MASK);
1620+
1621+ /* clear port IRQ */
1622+ tmp = readl(port_mmio + PORT_IRQ_STAT);
1623+ VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
1624+ if (tmp)
1625+ writel(tmp, port_mmio + PORT_IRQ_STAT);
1626+ }
1627+
1628+ /* set Timer 1ms, hclk = 200Mhz */
1629+ /* FIXME: Add auto detect function */
1630+ printk("CPU clock : %d \n", cns3xxx_cpu_clock());
1631+ tmp = readl(mmio + HOST_TIMER1MS);
1632+ printk("*** Timer 1ms: %d(0x%x) ***\n",tmp,tmp);
1633+ writel(cns3xxx_cpu_clock()*500, mmio + HOST_TIMER1MS);
1634+ tmp = readl(mmio + HOST_TIMER1MS);
1635+ printk("*** Set to: %d(0x%x) ***\n",tmp, tmp);
1636+
1637+
1638+
1639+ for (i = 0; i < host->n_ports; i++) {
1640+ struct ata_port *ap = host->ports[i];
1641+
1642+ port_mmio = ahci_port_base(ap);
1643+ if (ata_port_is_dummy(ap))
1644+ continue;
1645+
1646+ ahci_port_init(pdev, ap, i, mmio, port_mmio);
1647+ }
1648+
1649+ tmp = readl(mmio + HOST_CTL);
1650+ VPRINTK("HOST_CTL 0x%x\n", tmp);
1651+ writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
1652+ tmp = readl(mmio + HOST_CTL);
1653+ VPRINTK("HOST_CTL 0x%x\n", tmp);
1654+}
1655+
1656+static void ahci_dev_config(struct ata_device *dev)
1657+{
1658+ struct ahci_host_priv *hpriv = dev->link->ap->host->private_data;
1659+
1660+ if (hpriv->flags & AHCI_HFLAG_SECT255) {
1661+ dev->max_sectors = 255;
1662+ ata_dev_printk(dev, KERN_INFO,
1663+ "SB600 AHCI: limiting to 255 sectors per cmd\n");
1664+ }
1665+}
1666+
1667+static unsigned int ahci_dev_classify(struct ata_port *ap)
1668+{
1669+ void __iomem *port_mmio = ahci_port_base(ap);
1670+ struct ata_taskfile tf;
1671+ u32 tmp;
1672+
1673+ tmp = readl(port_mmio + PORT_SIG);
1674+ tf.lbah = (tmp >> 24) & 0xff;
1675+ tf.lbam = (tmp >> 16) & 0xff;
1676+ tf.lbal = (tmp >> 8) & 0xff;
1677+ tf.nsect = (tmp) & 0xff;
1678+
1679+ return ata_dev_classify(&tf);
1680+}
1681+
1682+static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
1683+ u32 opts)
1684+{
1685+ dma_addr_t cmd_tbl_dma;
1686+
1687+ cmd_tbl_dma = pp->cmd_tbl_dma + tag * AHCI_CMD_TBL_SZ;
1688+
1689+#if 0
1690+ pp->cmd_slot[tag].opts = cpu_to_le32(opts);
1691+#else
1692+ pp->cmd_slot[tag].opts = opts;
1693+#endif
1694+ pp->cmd_slot[tag].status = 0;
1695+#if 0
1696+ pp->cmd_slot[tag].tbl_addr = cpu_to_le32(cmd_tbl_dma & 0xffffffff);
1697+ pp->cmd_slot[tag].tbl_addr_hi = cpu_to_le32((cmd_tbl_dma >> 16) >> 16);
1698+#else
1699+ pp->cmd_slot[tag].tbl_addr = cmd_tbl_dma & 0xffffffff;
1700+ pp->cmd_slot[tag].tbl_addr_hi = (cmd_tbl_dma >> 16) >> 16;
1701+#endif
1702+}
1703+
1704+static int ahci_kick_engine(struct ata_port *ap, int force_restart)
1705+{
1706+ void __iomem *port_mmio = ahci_port_base(ap);
1707+ struct ahci_host_priv *hpriv = ap->host->private_data;
1708+ u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF;
1709+ u32 tmp;
1710+ int busy, rc;
1711+
1712+ /* do we need to kick the port? */
1713+ busy = status & (ATA_BUSY | ATA_DRQ);
1714+ if (!busy && !force_restart)
1715+ return 0;
1716+
1717+ /* stop engine */
1718+ rc = ahci_stop_engine(ap);
1719+ if (rc)
1720+ goto out_restart;
1721+
1722+ /* need to do CLO? */
1723+ if (!busy) {
1724+ rc = 0;
1725+ goto out_restart;
1726+ }
1727+
1728+ if (!(hpriv->cap & HOST_CAP_CLO)) {
1729+ rc = -EOPNOTSUPP;
1730+ goto out_restart;
1731+ }
1732+
1733+ /* perform CLO */
1734+ tmp = readl(port_mmio + PORT_CMD);
1735+ tmp |= PORT_CMD_CLO;
1736+ writel(tmp, port_mmio + PORT_CMD);
1737+
1738+ rc = 0;
1739+ tmp = ata_wait_register(port_mmio + PORT_CMD,
1740+ PORT_CMD_CLO, PORT_CMD_CLO, 1, 500);
1741+ if (tmp & PORT_CMD_CLO)
1742+ rc = -EIO;
1743+
1744+ /* restart engine */
1745+ out_restart:
1746+ ahci_start_engine(ap);
1747+ return rc;
1748+}
1749+
1750+static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp,
1751+ struct ata_taskfile *tf, int is_cmd, u16 flags,
1752+ unsigned long timeout_msec)
1753+{
1754+ const u32 cmd_fis_len = 5; /* five dwords */
1755+ struct ahci_port_priv *pp = ap->private_data;
1756+ void __iomem *port_mmio = ahci_port_base(ap);
1757+ u8 *fis = pp->cmd_tbl;
1758+ u32 tmp;
1759+
1760+ /* prep the command */
1761+ ata_tf_to_fis(tf, pmp, is_cmd, fis);
1762+ ahci_fill_cmd_slot(pp, 0, cmd_fis_len | flags | (pmp << 12));
1763+
1764+ /* issue & wait */
1765+ writel(1, port_mmio + PORT_CMD_ISSUE);
1766+
1767+ if (timeout_msec) {
1768+ tmp = ata_wait_register(port_mmio + PORT_CMD_ISSUE, 0x1, 0x1,
1769+ 1, timeout_msec);
1770+ if (tmp & 0x1) {
1771+ ahci_kick_engine(ap, 1);
1772+ return -EBUSY;
1773+ }
1774+ } else
1775+ readl(port_mmio + PORT_CMD_ISSUE); /* flush */
1776+
1777+ return 0;
1778+}
1779+
1780+static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1781+ int pmp, unsigned long deadline,
1782+ int (*check_ready)(struct ata_link *link))
1783+{
1784+ struct ata_port *ap = link->ap;
1785+ struct ahci_host_priv *hpriv = ap->host->private_data;
1786+ const char *reason = NULL;
1787+ unsigned long now, msecs;
1788+ struct ata_taskfile tf;
1789+ int rc;
1790+
1791+ DPRINTK("ENTER\n");
1792+
1793+ /* prepare for SRST (AHCI-1.1 10.4.1) */
1794+ rc = ahci_kick_engine(ap, 1);
1795+ if (rc && rc != -EOPNOTSUPP)
1796+ ata_link_printk(link, KERN_WARNING,
1797+ "failed to reset engine (errno=%d)\n", rc);
1798+
1799+ ata_tf_init(link->device, &tf);
1800+
1801+ /* issue the first D2H Register FIS */
1802+ msecs = 0;
1803+ now = jiffies;
1804+ if (time_after(now, deadline))
1805+ msecs = jiffies_to_msecs(deadline - now);
1806+
1807+ tf.ctl |= ATA_SRST;
1808+ if (ahci_exec_polled_cmd(ap, pmp, &tf, 0,
1809+ AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY, msecs)) {
1810+ rc = -EIO;
1811+ reason = "1st FIS failed";
1812+ goto fail;
1813+ }
1814+
1815+ /* spec says at least 5us, but be generous and sleep for 1ms */
1816+ msleep(1);
1817+
1818+ /* issue the second D2H Register FIS */
1819+ tf.ctl &= ~ATA_SRST;
1820+ ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0);
1821+
1822+ /* wait for link to become ready */
1823+ rc = ata_wait_after_reset(link, deadline, check_ready);
1824+ if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) {
1825+ /*
1826+ * Workaround for cases where link online status can't
1827+ * be trusted. Treat device readiness timeout as link
1828+ * offline.
1829+ */
1830+ ata_link_printk(link, KERN_INFO,
1831+ "device not ready, treating as offline\n");
1832+ *class = ATA_DEV_NONE;
1833+ } else if (rc) {
1834+ /* link occupied, -ENODEV too is an error */
1835+ reason = "device not ready";
1836+ goto fail;
1837+ } else
1838+ *class = ahci_dev_classify(ap);
1839+
1840+ DPRINTK("EXIT, class=%u\n", *class);
1841+ return 0;
1842+
1843+ fail:
1844+ ata_link_printk(link, KERN_ERR, "softreset failed (%s)\n", reason);
1845+ return rc;
1846+}
1847+
1848+static int ahci_check_ready(struct ata_link *link)
1849+{
1850+ void __iomem *port_mmio = ahci_port_base(link->ap);
1851+ u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF;
1852+
1853+ return ata_check_ready(status);
1854+}
1855+
1856+static int ahci_softreset(struct ata_link *link, unsigned int *class,
1857+ unsigned long deadline)
1858+{
1859+ int pmp = sata_srst_pmp(link);
1860+
1861+ DPRINTK("ENTER\n");
1862+
1863+ return ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready);
1864+}
1865+
1866+static int ahci_sb600_check_ready(struct ata_link *link)
1867+{
1868+ void __iomem *port_mmio = ahci_port_base(link->ap);
1869+ u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF;
1870+ u32 irq_status = readl(port_mmio + PORT_IRQ_STAT);
1871+
1872+ /*
1873+ * There is no need to check TFDATA if BAD PMP is found due to HW bug,
1874+ * which can save timeout delay.
1875+ */
1876+ if (irq_status & PORT_IRQ_BAD_PMP)
1877+ return -EIO;
1878+
1879+ return ata_check_ready(status);
1880+}
1881+
1882+static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class,
1883+ unsigned long deadline)
1884+{
1885+ struct ata_port *ap = link->ap;
1886+ void __iomem *port_mmio = ahci_port_base(ap);
1887+ int pmp = sata_srst_pmp(link);
1888+ int rc;
1889+ u32 irq_sts;
1890+
1891+ DPRINTK("ENTER\n");
1892+
1893+ rc = ahci_do_softreset(link, class, pmp, deadline,
1894+ ahci_sb600_check_ready);
1895+
1896+ /*
1897+ * Soft reset fails on some ATI chips with IPMS set when PMP
1898+ * is enabled but SATA HDD/ODD is connected to SATA port,
1899+ * do soft reset again to port 0.
1900+ */
1901+ if (rc == -EIO) {
1902+ irq_sts = readl(port_mmio + PORT_IRQ_STAT);
1903+ if (irq_sts & PORT_IRQ_BAD_PMP) {
1904+ ata_link_printk(link, KERN_WARNING,
1905+ "applying SB600 PMP SRST workaround "
1906+ "and retrying\n");
1907+ rc = ahci_do_softreset(link, class, 0, deadline,
1908+ ahci_check_ready);
1909+ }
1910+ }
1911+
1912+ return rc;
1913+}
1914+
1915+static int ahci_hardreset(struct ata_link *link, unsigned int *class,
1916+ unsigned long deadline)
1917+{
1918+ const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
1919+ struct ata_port *ap = link->ap;
1920+ struct ahci_port_priv *pp = ap->private_data;
1921+ u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
1922+ struct ata_taskfile tf;
1923+ bool online;
1924+ int rc;
1925+
1926+ DPRINTK("ENTER\n");
1927+
1928+ ahci_stop_engine(ap);
1929+
1930+ /* clear D2H reception area to properly wait for D2H FIS */
1931+ ata_tf_init(link->device, &tf);
1932+ tf.command = 0x80;
1933+ ata_tf_to_fis(&tf, 0, 0, d2h_fis);
1934+
1935+ rc = sata_link_hardreset(link, timing, deadline, &online,
1936+ ahci_check_ready);
1937+
1938+ ahci_start_engine(ap);
1939+
1940+ if (online)
1941+ *class = ahci_dev_classify(ap);
1942+
1943+ DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
1944+ return rc;
1945+}
1946+
1947+static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
1948+ unsigned long deadline)
1949+{
1950+ struct ata_port *ap = link->ap;
1951+ bool online;
1952+ int rc;
1953+
1954+ DPRINTK("ENTER\n");
1955+
1956+ ahci_stop_engine(ap);
1957+
1958+ rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
1959+ deadline, &online, NULL);
1960+
1961+ ahci_start_engine(ap);
1962+
1963+ DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
1964+
1965+ /* vt8251 doesn't clear BSY on signature FIS reception,
1966+ * request follow-up softreset.
1967+ */
1968+ return online ? -EAGAIN : rc;
1969+}
1970+
1971+#if 0
1972+static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
1973+ unsigned long deadline)
1974+{
1975+ struct ata_port *ap = link->ap;
1976+ struct ahci_port_priv *pp = ap->private_data;
1977+ u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
1978+ struct ata_taskfile tf;
1979+ bool online;
1980+ int rc;
1981+
1982+ ahci_stop_engine(ap);
1983+
1984+ /* clear D2H reception area to properly wait for D2H FIS */
1985+ ata_tf_init(link->device, &tf);
1986+ tf.command = 0x80;
1987+ ata_tf_to_fis(&tf, 0, 0, d2h_fis);
1988+
1989+ rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
1990+ deadline, &online, NULL);
1991+
1992+ ahci_start_engine(ap);
1993+
1994+ /* The pseudo configuration device on SIMG4726 attached to
1995+ * ASUS P5W-DH Deluxe doesn't send signature FIS after
1996+ * hardreset if no device is attached to the first downstream
1997+ * port && the pseudo device locks up on SRST w/ PMP==0. To
1998+ * work around this, wait for !BSY only briefly. If BSY isn't
1999+ * cleared, perform CLO and proceed to IDENTIFY (achieved by
2000+ * ATA_LFLAG_NO_SRST and ATA_LFLAG_ASSUME_ATA).
2001+ *
2002+ * Wait for two seconds. Devices attached to downstream port
2003+ * which can't process the following IDENTIFY after this will
2004+ * have to be reset again. For most cases, this should
2005+ * suffice while making probing snappish enough.
2006+ */
2007+ if (online) {
2008+ rc = ata_wait_after_reset(link, jiffies + 2 * HZ,
2009+ ahci_check_ready);
2010+ if (rc)
2011+ ahci_kick_engine(ap, 0);
2012+ }
2013+ return rc;
2014+}
2015+#endif
2016+
2017+static void ahci_postreset(struct ata_link *link, unsigned int *class)
2018+{
2019+ struct ata_port *ap = link->ap;
2020+ void __iomem *port_mmio = ahci_port_base(ap);
2021+ u32 new_tmp, tmp;
2022+
2023+ ata_std_postreset(link, class);
2024+
2025+ /* Make sure port's ATAPI bit is set appropriately */
2026+ new_tmp = tmp = readl(port_mmio + PORT_CMD);
2027+ if (*class == ATA_DEV_ATAPI)
2028+ new_tmp |= PORT_CMD_ATAPI;
2029+ else
2030+ new_tmp &= ~PORT_CMD_ATAPI;
2031+ if (new_tmp != tmp) {
2032+ writel(new_tmp, port_mmio + PORT_CMD);
2033+ readl(port_mmio + PORT_CMD); /* flush */
2034+ }
2035+}
2036+
2037+static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
2038+{
2039+ struct scatterlist *sg;
2040+ struct ahci_sg *ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ;
2041+ unsigned int si;
2042+
2043+ VPRINTK("ENTER\n");
2044+
2045+ /*
2046+ * Next, the S/G list.
2047+ */
2048+ for_each_sg(qc->sg, sg, qc->n_elem, si) {
2049+ dma_addr_t addr = sg_dma_address(sg);
2050+ u32 sg_len = sg_dma_len(sg);
2051+
2052+#if 0
2053+ ahci_sg[si].addr = cpu_to_le32(addr & 0xffffffff);
2054+ ahci_sg[si].addr_hi = cpu_to_le32((addr >> 16) >> 16);
2055+ ahci_sg[si].flags_size = cpu_to_le32(sg_len - 1);
2056+#else
2057+ ahci_sg[si].addr = addr & 0xffffffff;
2058+ ahci_sg[si].addr_hi = (addr >> 16) >> 16;
2059+ ahci_sg[si].flags_size = sg_len - 1;
2060+#endif
2061+ }
2062+
2063+ return si;
2064+}
2065+
2066+static void ahci_qc_prep(struct ata_queued_cmd *qc)
2067+{
2068+ struct ata_port *ap = qc->ap;
2069+ struct ahci_port_priv *pp = ap->private_data;
2070+ int is_atapi = ata_is_atapi(qc->tf.protocol);
2071+ void *cmd_tbl;
2072+ u32 opts;
2073+ const u32 cmd_fis_len = 5; /* five dwords */
2074+ unsigned int n_elem;
2075+
2076+ /*
2077+ * Fill in command table information. First, the header,
2078+ * a SATA Register - Host to Device command FIS.
2079+ */
2080+ cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ;
2081+
2082+ ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl);
2083+ if (is_atapi) {
2084+ memset(cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32);
2085+ memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len);
2086+ }
2087+
2088+ n_elem = 0;
2089+ if (qc->flags & ATA_QCFLAG_DMAMAP)
2090+ n_elem = ahci_fill_sg(qc, cmd_tbl);
2091+
2092+ /*
2093+ * Fill in command slot information.
2094+ */
2095+ opts = cmd_fis_len | n_elem << 16 | (qc->dev->link->pmp << 12);
2096+ if (qc->tf.flags & ATA_TFLAG_WRITE)
2097+ opts |= AHCI_CMD_WRITE;
2098+ if (is_atapi)
2099+ opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
2100+
2101+ ahci_fill_cmd_slot(pp, qc->tag, opts);
2102+}
2103+
2104+static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
2105+{
2106+ struct ahci_host_priv *hpriv = ap->host->private_data;
2107+ struct ahci_port_priv *pp = ap->private_data;
2108+ struct ata_eh_info *host_ehi = &ap->link.eh_info;
2109+ struct ata_link *link = NULL;
2110+ struct ata_queued_cmd *active_qc;
2111+ struct ata_eh_info *active_ehi;
2112+ u32 serror;
2113+
2114+ /* determine active link */
2115+ ata_for_each_link(link, ap, EDGE)
2116+ if (ata_link_active(link))
2117+ break;
2118+ if (!link)
2119+ link = &ap->link;
2120+
2121+ active_qc = ata_qc_from_tag(ap, link->active_tag);
2122+ active_ehi = &link->eh_info;
2123+
2124+ /* record irq stat */
2125+ ata_ehi_clear_desc(host_ehi);
2126+ ata_ehi_push_desc(host_ehi, "irq_stat 0x%08x", irq_stat);
2127+
2128+ /* AHCI needs SError cleared; otherwise, it might lock up */
2129+ ahci_scr_read(&ap->link, SCR_ERROR, &serror);
2130+ ahci_scr_write(&ap->link, SCR_ERROR, serror);
2131+ host_ehi->serror |= serror;
2132+
2133+ /* some controllers set IRQ_IF_ERR on device errors, ignore it */
2134+ if (hpriv->flags & AHCI_HFLAG_IGN_IRQ_IF_ERR)
2135+ irq_stat &= ~PORT_IRQ_IF_ERR;
2136+
2137+ if (irq_stat & PORT_IRQ_TF_ERR) {
2138+ /* If qc is active, charge it; otherwise, the active
2139+ * link. There's no active qc on NCQ errors. It will
2140+ * be determined by EH by reading log page 10h.
2141+ */
2142+ if (active_qc)
2143+ active_qc->err_mask |= AC_ERR_DEV;
2144+ else
2145+ active_ehi->err_mask |= AC_ERR_DEV;
2146+
2147+ if (hpriv->flags & AHCI_HFLAG_IGN_SERR_INTERNAL)
2148+ host_ehi->serror &= ~SERR_INTERNAL;
2149+ }
2150+
2151+ if (irq_stat & PORT_IRQ_UNK_FIS) {
2152+ u32 *unk = (u32 *)(pp->rx_fis + RX_FIS_UNK);
2153+
2154+ active_ehi->err_mask |= AC_ERR_HSM;
2155+ active_ehi->action |= ATA_EH_RESET;
2156+ ata_ehi_push_desc(active_ehi,
2157+ "unknown FIS %08x %08x %08x %08x" ,
2158+ unk[0], unk[1], unk[2], unk[3]);
2159+ }
2160+
2161+ if (sata_pmp_attached(ap) && (irq_stat & PORT_IRQ_BAD_PMP)) {
2162+ active_ehi->err_mask |= AC_ERR_HSM;
2163+ active_ehi->action |= ATA_EH_RESET;
2164+ ata_ehi_push_desc(active_ehi, "incorrect PMP");
2165+ }
2166+
2167+ if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) {
2168+ host_ehi->err_mask |= AC_ERR_HOST_BUS;
2169+ host_ehi->action |= ATA_EH_RESET;
2170+ ata_ehi_push_desc(host_ehi, "host bus error");
2171+ }
2172+
2173+ if (irq_stat & PORT_IRQ_IF_ERR) {
2174+ host_ehi->err_mask |= AC_ERR_ATA_BUS;
2175+ host_ehi->action |= ATA_EH_RESET;
2176+ ata_ehi_push_desc(host_ehi, "interface fatal error");
2177+ }
2178+
2179+ if (irq_stat & (PORT_IRQ_CONNECT | PORT_IRQ_PHYRDY)) {
2180+ ata_ehi_hotplugged(host_ehi);
2181+ ata_ehi_push_desc(host_ehi, "%s",
2182+ irq_stat & PORT_IRQ_CONNECT ?
2183+ "connection status changed" : "PHY RDY changed");
2184+ }
2185+
2186+ /* okay, let's hand over to EH */
2187+
2188+ if (irq_stat & PORT_IRQ_FREEZE)
2189+ ata_port_freeze(ap);
2190+ else
2191+ ata_port_abort(ap);
2192+}
2193+
2194+static void ahci_port_intr(struct ata_port *ap)
2195+{
2196+ void __iomem *port_mmio = ahci_port_base(ap);
2197+ struct ata_eh_info *ehi = &ap->link.eh_info;
2198+ struct ahci_port_priv *pp = ap->private_data;
2199+ struct ahci_host_priv *hpriv = ap->host->private_data;
2200+ int resetting = !!(ap->pflags & ATA_PFLAG_RESETTING);
2201+ u32 status, qc_active;
2202+ int rc;
2203+
2204+ status = readl(port_mmio + PORT_IRQ_STAT);
2205+ writel(status, port_mmio + PORT_IRQ_STAT);
2206+
2207+ /* ignore BAD_PMP while resetting */
2208+ if (unlikely(resetting))
2209+ status &= ~PORT_IRQ_BAD_PMP;
2210+
2211+ /* If we are getting PhyRdy, this is
2212+ * just a power state change, we should
2213+ * clear out this, plus the PhyRdy/Comm
2214+ * Wake bits from Serror
2215+ */
2216+ if ((hpriv->flags & AHCI_HFLAG_NO_HOTPLUG) &&
2217+ (status & PORT_IRQ_PHYRDY)) {
2218+ status &= ~PORT_IRQ_PHYRDY;
2219+ ahci_scr_write(&ap->link, SCR_ERROR, ((1 << 16) | (1 << 18)));
2220+ }
2221+
2222+ if (unlikely(status & PORT_IRQ_ERROR)) {
2223+ ahci_error_intr(ap, status);
2224+ return;
2225+ }
2226+
2227+ if (status & PORT_IRQ_SDB_FIS) {
2228+ /* If SNotification is available, leave notification
2229+ * handling to sata_async_notification(). If not,
2230+ * emulate it by snooping SDB FIS RX area.
2231+ *
2232+ * Snooping FIS RX area is probably cheaper than
2233+ * poking SNotification but some constrollers which
2234+ * implement SNotification, ICH9 for example, don't
2235+ * store AN SDB FIS into receive area.
2236+ */
2237+ if (hpriv->cap & HOST_CAP_SNTF)
2238+ sata_async_notification(ap);
2239+ else {
2240+ /* If the 'N' bit in word 0 of the FIS is set,
2241+ * we just received asynchronous notification.
2242+ * Tell libata about it.
2243+ */
2244+ const __le32 *f = pp->rx_fis + RX_FIS_SDB;
2245+#if 0
2246+ u32 f0 = le32_to_cpu(f[0]);
2247+#else
2248+ u32 f0 = f[0];
2249+#endif
2250+
2251+ if (f0 & (1 << 15))
2252+ sata_async_notification(ap);
2253+ }
2254+ }
2255+
2256+ /* pp->active_link is valid iff any command is in flight */
2257+ if (ap->qc_active && pp->active_link->sactive)
2258+ qc_active = readl(port_mmio + PORT_SCR_ACT);
2259+ else
2260+ qc_active = readl(port_mmio + PORT_CMD_ISSUE);
2261+
2262+ rc = ata_qc_complete_multiple(ap, qc_active);
2263+
2264+ /* while resetting, invalid completions are expected */
2265+ if (unlikely(rc < 0 && !resetting)) {
2266+ ehi->err_mask |= AC_ERR_HSM;
2267+ ehi->action |= ATA_EH_RESET;
2268+ ata_port_freeze(ap);
2269+ }
2270+}
2271+
2272+static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
2273+{
2274+ struct ata_host *host = dev_instance;
2275+ struct ahci_host_priv *hpriv;
2276+ unsigned int i, handled = 0;
2277+ void __iomem *mmio;
2278+ u32 irq_stat, irq_masked;
2279+
2280+ VPRINTK("ENTER\n");
2281+
2282+ hpriv = host->private_data;
2283+#if 0
2284+ mmio = host->iomap[AHCI_PCI_BAR];
2285+#else
2286+ mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
2287+#endif
2288+
2289+ /* sigh. 0xffffffff is a valid return from h/w */
2290+ irq_stat = readl(mmio + HOST_IRQ_STAT);
2291+ if (!irq_stat)
2292+ return IRQ_NONE;
2293+
2294+ irq_masked = irq_stat & hpriv->port_map;
2295+
2296+ spin_lock(&host->lock);
2297+
2298+ for (i = 0; i < host->n_ports; i++) {
2299+ struct ata_port *ap;
2300+
2301+ if (!(irq_masked & (1 << i)))
2302+ continue;
2303+
2304+ ap = host->ports[i];
2305+ if (ap) {
2306+ ahci_port_intr(ap);
2307+ VPRINTK("port %u\n", i);
2308+ } else {
2309+ VPRINTK("port %u (no irq)\n", i);
2310+ if (ata_ratelimit())
2311+ dev_printk(KERN_WARNING, host->dev,
2312+ "interrupt on disabled port %u\n", i);
2313+ }
2314+
2315+ handled = 1;
2316+ }
2317+
2318+ /* HOST_IRQ_STAT behaves as level triggered latch meaning that
2319+ * it should be cleared after all the port events are cleared;
2320+ * otherwise, it will raise a spurious interrupt after each
2321+ * valid one. Please read section 10.6.2 of ahci 1.1 for more
2322+ * information.
2323+ *
2324+ * Also, use the unmasked value to clear interrupt as spurious
2325+ * pending event on a dummy port might cause screaming IRQ.
2326+ */
2327+ writel(irq_stat, mmio + HOST_IRQ_STAT);
2328+
2329+ spin_unlock(&host->lock);
2330+
2331+ VPRINTK("EXIT\n");
2332+
2333+ return IRQ_RETVAL(handled);
2334+}
2335+
2336+static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
2337+{
2338+ struct ata_port *ap = qc->ap;
2339+ void __iomem *port_mmio = ahci_port_base(ap);
2340+ struct ahci_port_priv *pp = ap->private_data;
2341+
2342+ /* Keep track of the currently active link. It will be used
2343+ * in completion path to determine whether NCQ phase is in
2344+ * progress.
2345+ */
2346+ pp->active_link = qc->dev->link;
2347+
2348+ if (qc->tf.protocol == ATA_PROT_NCQ)
2349+ writel(1 << qc->tag, port_mmio + PORT_SCR_ACT);
2350+ writel(1 << qc->tag, port_mmio + PORT_CMD_ISSUE);
2351+
2352+ ahci_sw_activity(qc->dev->link);
2353+
2354+ return 0;
2355+}
2356+
2357+static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
2358+{
2359+ struct ahci_port_priv *pp = qc->ap->private_data;
2360+ u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
2361+
2362+ ata_tf_from_fis(d2h_fis, &qc->result_tf);
2363+ return true;
2364+}
2365+
2366+static void ahci_freeze(struct ata_port *ap)
2367+{
2368+ void __iomem *port_mmio = ahci_port_base(ap);
2369+
2370+ /* turn IRQ off */
2371+ writel(0, port_mmio + PORT_IRQ_MASK);
2372+}
2373+
2374+static void ahci_thaw(struct ata_port *ap)
2375+{
2376+#if 0
2377+ void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
2378+#else
2379+ void __iomem *mmio = (void __iomem *)ap->host->iomap;//[AHCI_BAR];
2380+#endif
2381+ void __iomem *port_mmio = ahci_port_base(ap);
2382+ u32 tmp;
2383+ struct ahci_port_priv *pp = ap->private_data;
2384+
2385+ /* clear IRQ */
2386+ tmp = readl(port_mmio + PORT_IRQ_STAT);
2387+ writel(tmp, port_mmio + PORT_IRQ_STAT);
2388+ writel(1 << ap->port_no, mmio + HOST_IRQ_STAT);
2389+
2390+ /* turn IRQ back on */
2391+ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
2392+}
2393+
2394+static void ahci_error_handler(struct ata_port *ap)
2395+{
2396+ if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
2397+ /* restart engine */
2398+ ahci_stop_engine(ap);
2399+ ahci_start_engine(ap);
2400+ }
2401+
2402+ sata_pmp_error_handler(ap);
2403+}
2404+
2405+static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
2406+{
2407+ struct ata_port *ap = qc->ap;
2408+
2409+ /* make DMA engine forget about the failed command */
2410+ if (qc->flags & ATA_QCFLAG_FAILED)
2411+ ahci_kick_engine(ap, 1);
2412+}
2413+
2414+static void ahci_pmp_attach(struct ata_port *ap)
2415+{
2416+ void __iomem *port_mmio = ahci_port_base(ap);
2417+ struct ahci_port_priv *pp = ap->private_data;
2418+ u32 cmd;
2419+
2420+ cmd = readl(port_mmio + PORT_CMD);
2421+ cmd |= PORT_CMD_PMP;
2422+ writel(cmd, port_mmio + PORT_CMD);
2423+
2424+ pp->intr_mask |= PORT_IRQ_BAD_PMP;
2425+ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
2426+}
2427+
2428+static void ahci_pmp_detach(struct ata_port *ap)
2429+{
2430+ void __iomem *port_mmio = ahci_port_base(ap);
2431+ struct ahci_port_priv *pp = ap->private_data;
2432+ u32 cmd;
2433+
2434+ cmd = readl(port_mmio + PORT_CMD);
2435+ cmd &= ~PORT_CMD_PMP;
2436+ writel(cmd, port_mmio + PORT_CMD);
2437+
2438+ pp->intr_mask &= ~PORT_IRQ_BAD_PMP;
2439+ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
2440+}
2441+
2442+static int ahci_port_resume(struct ata_port *ap)
2443+{
2444+ ahci_power_up(ap);
2445+ ahci_start_port(ap);
2446+
2447+ if (sata_pmp_attached(ap))
2448+ ahci_pmp_attach(ap);
2449+ else
2450+ ahci_pmp_detach(ap);
2451+
2452+ return 0;
2453+}
2454+
2455+#ifdef CONFIG_PM
2456+static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
2457+{
2458+ const char *emsg = NULL;
2459+ int rc;
2460+
2461+ rc = ahci_deinit_port(ap, &emsg);
2462+ if (rc == 0)
2463+ ahci_power_down(ap);
2464+ else {
2465+ ata_port_printk(ap, KERN_ERR, "%s (%d)\n", emsg, rc);
2466+ ahci_start_port(ap);
2467+ }
2468+
2469+ return rc;
2470+}
2471+
2472+static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
2473+{
2474+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
2475+ struct ahci_host_priv *hpriv = host->private_data;
2476+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
2477+ u32 ctl;
2478+
2479+ if (mesg.event & PM_EVENT_SUSPEND &&
2480+ hpriv->flags & AHCI_HFLAG_NO_SUSPEND) {
2481+ dev_printk(KERN_ERR, &pdev->dev,
2482+ "BIOS update required for suspend/resume\n");
2483+ return -EIO;
2484+ }
2485+
2486+ if (mesg.event & PM_EVENT_SLEEP) {
2487+ /* AHCI spec rev1.1 section 8.3.3:
2488+ * Software must disable interrupts prior to requesting a
2489+ * transition of the HBA to D3 state.
2490+ */
2491+ ctl = readl(mmio + HOST_CTL);
2492+ ctl &= ~HOST_IRQ_EN;
2493+ writel(ctl, mmio + HOST_CTL);
2494+ readl(mmio + HOST_CTL); /* flush */
2495+ }
2496+
2497+ return ata_pci_device_suspend(pdev, mesg);
2498+}
2499+
2500+static int ahci_pci_device_resume(struct pci_dev *pdev)
2501+{
2502+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
2503+ int rc;
2504+
2505+ rc = ata_pci_device_do_resume(pdev);
2506+ if (rc)
2507+ return rc;
2508+
2509+ if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
2510+ rc = ahci_reset_controller(host);
2511+ if (rc)
2512+ return rc;
2513+
2514+ ahci_init_controller(host);
2515+ }
2516+
2517+ ata_host_resume(host);
2518+
2519+ return 0;
2520+}
2521+#endif
2522+
2523+static int ahci_port_start(struct ata_port *ap)
2524+{
2525+ struct device *dev = ap->host->dev;
2526+ struct ahci_port_priv *pp;
2527+ void *mem;
2528+ dma_addr_t mem_dma;
2529+
2530+ pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
2531+ if (!pp)
2532+ return -ENOMEM;
2533+
2534+ mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma,
2535+ GFP_KERNEL);
2536+ if (!mem)
2537+ return -ENOMEM;
2538+ memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
2539+
2540+ /*
2541+ * First item in chunk of DMA memory: 32-slot command table,
2542+ * 32 bytes each in size
2543+ */
2544+ pp->cmd_slot = mem;
2545+ pp->cmd_slot_dma = mem_dma;
2546+
2547+ mem += AHCI_CMD_SLOT_SZ;
2548+ mem_dma += AHCI_CMD_SLOT_SZ;
2549+
2550+ /*
2551+ * Second item: Received-FIS area
2552+ */
2553+ pp->rx_fis = mem;
2554+ pp->rx_fis_dma = mem_dma;
2555+
2556+ mem += AHCI_RX_FIS_SZ;
2557+ mem_dma += AHCI_RX_FIS_SZ;
2558+
2559+ /*
2560+ * Third item: data area for storing a single command
2561+ * and its scatter-gather table
2562+ */
2563+ pp->cmd_tbl = mem;
2564+ pp->cmd_tbl_dma = mem_dma;
2565+
2566+ /*
2567+ * Save off initial list of interrupts to be enabled.
2568+ * This could be changed later
2569+ */
2570+ pp->intr_mask = DEF_PORT_IRQ;
2571+
2572+ ap->private_data = pp;
2573+
2574+ /* engage engines, captain */
2575+ return ahci_port_resume(ap);
2576+}
2577+
2578+static void ahci_port_stop(struct ata_port *ap)
2579+{
2580+ const char *emsg = NULL;
2581+ int rc;
2582+
2583+ /* de-initialize port */
2584+ rc = ahci_deinit_port(ap, &emsg);
2585+ if (rc)
2586+ ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc);
2587+}
2588+
2589+#if 0
2590+static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
2591+{
2592+ int rc;
2593+
2594+ if (using_dac &&
2595+ !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
2596+ rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
2597+ if (rc) {
2598+ rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2599+ if (rc) {
2600+ dev_printk(KERN_ERR, &pdev->dev,
2601+ "64-bit DMA enable failed\n");
2602+ return rc;
2603+ }
2604+ }
2605+ } else {
2606+ rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2607+ if (rc) {
2608+ dev_printk(KERN_ERR, &pdev->dev,
2609+ "32-bit DMA enable failed\n");
2610+ return rc;
2611+ }
2612+ rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2613+ if (rc) {
2614+ dev_printk(KERN_ERR, &pdev->dev,
2615+ "32-bit consistent DMA enable failed\n");
2616+ return rc;
2617+ }
2618+ }
2619+ return 0;
2620+}
2621+#endif
2622+
2623+static void ahci_print_info(struct ata_host *host)
2624+{
2625+ struct ahci_host_priv *hpriv = host->private_data;
2626+#if 0
2627+ struct pci_dev *pdev = to_pci_dev(host->dev);
2628+ void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
2629+#else
2630+ struct platform_device *pdev = to_platform_device(host->dev);
2631+ void __iomem *mmio = (void __iomem *)host->iomap;//[AHCI_BAR];
2632+#endif
2633+ u32 vers, cap, impl, speed;
2634+ const char *speed_s;
2635+#if 0
2636+ u16 cc;
2637+#endif
2638+ const char *scc_s;
2639+
2640+ vers = readl(mmio + HOST_VERSION);
2641+ cap = hpriv->cap;
2642+ impl = hpriv->port_map;
2643+
2644+ speed = (cap >> 20) & 0xf;
2645+ if (speed == 1)
2646+ speed_s = "1.5";
2647+ else if (speed == 2)
2648+ speed_s = "3";
2649+ else if (speed == 3)
2650+ speed_s = "6";
2651+ else
2652+ speed_s = "?";
2653+
2654+#if 0
2655+ pci_read_config_word(pdev, 0x0a, &cc);
2656+ if (cc == PCI_CLASS_STORAGE_IDE)
2657+ scc_s = "IDE";
2658+ else if (cc == PCI_CLASS_STORAGE_SATA)
2659+ scc_s = "SATA";
2660+ else if (cc == PCI_CLASS_STORAGE_RAID)
2661+ scc_s = "RAID";
2662+ else
2663+ scc_s = "unknown";
2664+#else
2665+ scc_s = "SATA";
2666+#endif
2667+
2668+ dev_printk(KERN_INFO, &pdev->dev,
2669+ "AHCI %02x%02x.%02x%02x "
2670+ "%u slots %u ports %s Gbps 0x%x impl %s mode\n"
2671+ ,
2672+
2673+ (vers >> 24) & 0xff,
2674+ (vers >> 16) & 0xff,
2675+ (vers >> 8) & 0xff,
2676+ vers & 0xff,
2677+
2678+ ((cap >> 8) & 0x1f) + 1,
2679+ (cap & 0x1f) + 1,
2680+ speed_s,
2681+ impl,
2682+ scc_s);
2683+
2684+ dev_printk(KERN_INFO, &pdev->dev,
2685+ "flags: "
2686+ "%s%s%s%s%s%s%s"
2687+ "%s%s%s%s%s%s%s"
2688+ "%s\n"
2689+ ,
2690+
2691+ cap & (1 << 31) ? "64bit " : "",
2692+ cap & (1 << 30) ? "ncq " : "",
2693+ cap & (1 << 29) ? "sntf " : "",
2694+ cap & (1 << 28) ? "ilck " : "",
2695+ cap & (1 << 27) ? "stag " : "",
2696+ cap & (1 << 26) ? "pm " : "",
2697+ cap & (1 << 25) ? "led " : "",
2698+
2699+ cap & (1 << 24) ? "clo " : "",
2700+ cap & (1 << 19) ? "nz " : "",
2701+ cap & (1 << 18) ? "only " : "",
2702+ cap & (1 << 17) ? "pmp " : "",
2703+ cap & (1 << 15) ? "pio " : "",
2704+ cap & (1 << 14) ? "slum " : "",
2705+ cap & (1 << 13) ? "part " : "",
2706+ cap & (1 << 6) ? "ems ": ""
2707+ );
2708+}
2709+
2710+#if 0
2711+/* On ASUS P5W DH Deluxe, the second port of PCI device 00:1f.2 is
2712+ * hardwired to on-board SIMG 4726. The chipset is ICH8 and doesn't
2713+ * support PMP and the 4726 either directly exports the device
2714+ * attached to the first downstream port or acts as a hardware storage
2715+ * controller and emulate a single ATA device (can be RAID 0/1 or some
2716+ * other configuration).
2717+ *
2718+ * When there's no device attached to the first downstream port of the
2719+ * 4726, "Config Disk" appears, which is a pseudo ATA device to
2720+ * configure the 4726. However, ATA emulation of the device is very
2721+ * lame. It doesn't send signature D2H Reg FIS after the initial
2722+ * hardreset, pukes on SRST w/ PMP==0 and has bunch of other issues.
2723+ *
2724+ * The following function works around the problem by always using
2725+ * hardreset on the port and not depending on receiving signature FIS
2726+ * afterward. If signature FIS isn't received soon, ATA class is
2727+ * assumed without follow-up softreset.
2728+ */
2729+static void ahci_p5wdh_workaround(struct ata_host *host)
2730+{
2731+ static struct dmi_system_id sysids[] = {
2732+ {
2733+ .ident = "P5W DH Deluxe",
2734+ .matches = {
2735+ DMI_MATCH(DMI_SYS_VENDOR,
2736+ "ASUSTEK COMPUTER INC"),
2737+ DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"),
2738+ },
2739+ },
2740+ { }
2741+ };
2742+ struct pci_dev *pdev = to_pci_dev(host->dev);
2743+
2744+ if (pdev->bus->number == 0 && pdev->devfn == PCI_DEVFN(0x1f, 2) &&
2745+ dmi_check_system(sysids)) {
2746+ struct ata_port *ap = host->ports[1];
2747+
2748+ dev_printk(KERN_INFO, &pdev->dev, "enabling ASUS P5W DH "
2749+ "Deluxe on-board SIMG4726 workaround\n");
2750+
2751+ ap->ops = &ahci_p5wdh_ops;
2752+ ap->link.flags |= ATA_LFLAG_NO_SRST | ATA_LFLAG_ASSUME_ATA;
2753+ }
2754+}
2755+
2756+/*
2757+ * SB600 ahci controller on ASUS M2A-VM can't do 64bit DMA with older
2758+ * BIOS. The oldest version known to be broken is 0901 and working is
2759+ * 1501 which was released on 2007-10-26. Force 32bit DMA on anything
2760+ * older than 1501. Please read bko#9412 for more info.
2761+ */
2762+static bool ahci_asus_m2a_vm_32bit_only(struct pci_dev *pdev)
2763+{
2764+ static const struct dmi_system_id sysids[] = {
2765+ {
2766+ .ident = "ASUS M2A-VM",
2767+ .matches = {
2768+ DMI_MATCH(DMI_BOARD_VENDOR,
2769+ "ASUSTeK Computer INC."),
2770+ DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"),
2771+ },
2772+ },
2773+ { }
2774+ };
2775+ const char *cutoff_mmdd = "10/26";
2776+ const char *date;
2777+ int year;
2778+
2779+ if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) ||
2780+ !dmi_check_system(sysids))
2781+ return false;
2782+
2783+ /*
2784+ * Argh.... both version and date are free form strings.
2785+ * Let's hope they're using the same date format across
2786+ * different versions.
2787+ */
2788+ date = dmi_get_system_info(DMI_BIOS_DATE);
2789+ year = dmi_get_year(DMI_BIOS_DATE);
2790+ if (date && strlen(date) >= 10 && date[2] == '/' && date[5] == '/' &&
2791+ (year > 2007 ||
2792+ (year == 2007 && strncmp(date, cutoff_mmdd, 5) >= 0)))
2793+ return false;
2794+
2795+ dev_printk(KERN_WARNING, &pdev->dev, "ASUS M2A-VM: BIOS too old, "
2796+ "forcing 32bit DMA, update BIOS\n");
2797+
2798+ return true;
2799+}
2800+
2801+static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
2802+{
2803+ static const struct dmi_system_id broken_systems[] = {
2804+ {
2805+ .ident = "HP Compaq nx6310",
2806+ .matches = {
2807+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2808+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6310"),
2809+ },
2810+ /* PCI slot number of the controller */
2811+ .driver_data = (void *)0x1FUL,
2812+ },
2813+ {
2814+ .ident = "HP Compaq 6720s",
2815+ .matches = {
2816+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2817+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6720s"),
2818+ },
2819+ /* PCI slot number of the controller */
2820+ .driver_data = (void *)0x1FUL,
2821+ },
2822+
2823+ { } /* terminate list */
2824+ };
2825+ const struct dmi_system_id *dmi = dmi_first_match(broken_systems);
2826+
2827+ if (dmi) {
2828+ unsigned long slot = (unsigned long)dmi->driver_data;
2829+ /* apply the quirk only to on-board controllers */
2830+ return slot == PCI_SLOT(pdev->devfn);
2831+ }
2832+
2833+ return false;
2834+}
2835+
2836+static bool ahci_broken_suspend(struct pci_dev *pdev)
2837+{
2838+ static const struct dmi_system_id sysids[] = {
2839+ /*
2840+ * On HP dv[4-6] and HDX18 with earlier BIOSen, link
2841+ * to the harddisk doesn't become online after
2842+ * resuming from STR. Warn and fail suspend.
2843+ */
2844+ {
2845+ .ident = "dv4",
2846+ .matches = {
2847+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2848+ DMI_MATCH(DMI_PRODUCT_NAME,
2849+ "HP Pavilion dv4 Notebook PC"),
2850+ },
2851+ .driver_data = "F.30", /* cutoff BIOS version */
2852+ },
2853+ {
2854+ .ident = "dv5",
2855+ .matches = {
2856+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2857+ DMI_MATCH(DMI_PRODUCT_NAME,
2858+ "HP Pavilion dv5 Notebook PC"),
2859+ },
2860+ .driver_data = "F.16", /* cutoff BIOS version */
2861+ },
2862+ {
2863+ .ident = "dv6",
2864+ .matches = {
2865+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2866+ DMI_MATCH(DMI_PRODUCT_NAME,
2867+ "HP Pavilion dv6 Notebook PC"),
2868+ },
2869+ .driver_data = "F.21", /* cutoff BIOS version */
2870+ },
2871+ {
2872+ .ident = "HDX18",
2873+ .matches = {
2874+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
2875+ DMI_MATCH(DMI_PRODUCT_NAME,
2876+ "HP HDX18 Notebook PC"),
2877+ },
2878+ .driver_data = "F.23", /* cutoff BIOS version */
2879+ },
2880+ { } /* terminate list */
2881+ };
2882+ const struct dmi_system_id *dmi = dmi_first_match(sysids);
2883+ const char *ver;
2884+
2885+ if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2))
2886+ return false;
2887+
2888+ ver = dmi_get_system_info(DMI_BIOS_VERSION);
2889+
2890+ return !ver || strcmp(ver, dmi->driver_data) < 0;
2891+}
2892+
2893+static bool ahci_broken_online(struct pci_dev *pdev)
2894+{
2895+#define ENCODE_BUSDEVFN(bus, slot, func) \
2896+ (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func)))
2897+ static const struct dmi_system_id sysids[] = {
2898+ /*
2899+ * There are several gigabyte boards which use
2900+ * SIMG5723s configured as hardware RAID. Certain
2901+ * 5723 firmware revisions shipped there keep the link
2902+ * online but fail to answer properly to SRST or
2903+ * IDENTIFY when no device is attached downstream
2904+ * causing libata to retry quite a few times leading
2905+ * to excessive detection delay.
2906+ *
2907+ * As these firmwares respond to the second reset try
2908+ * with invalid device signature, considering unknown
2909+ * sig as offline works around the problem acceptably.
2910+ */
2911+ {
2912+ .ident = "EP45-DQ6",
2913+ .matches = {
2914+ DMI_MATCH(DMI_BOARD_VENDOR,
2915+ "Gigabyte Technology Co., Ltd."),
2916+ DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"),
2917+ },
2918+ .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0),
2919+ },
2920+ {
2921+ .ident = "EP45-DS5",
2922+ .matches = {
2923+ DMI_MATCH(DMI_BOARD_VENDOR,
2924+ "Gigabyte Technology Co., Ltd."),
2925+ DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"),
2926+ },
2927+ .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0),
2928+ },
2929+ { } /* terminate list */
2930+ };
2931+#undef ENCODE_BUSDEVFN
2932+ const struct dmi_system_id *dmi = dmi_first_match(sysids);
2933+ unsigned int val;
2934+
2935+ if (!dmi)
2936+ return false;
2937+
2938+ val = (unsigned long)dmi->driver_data;
2939+
2940+ return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff);
2941+}
2942+
2943+#endif
2944+static int ahci_remove(struct platform_device *pdev)
2945+{
2946+ struct device *dev = &pdev->dev;
2947+ struct ata_host *host = dev_get_drvdata(dev);
2948+
2949+ ata_host_detach(host);
2950+ return 0;
2951+}
2952+
2953+#if 0
2954+static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
2955+#else
2956+static int __init ahci_probe(struct platform_device *pdev)
2957+#endif
2958+{
2959+ static int printed_version;
2960+#if 0
2961+ unsigned int board_id = ent->driver_data;
2962+ struct ata_port_info pi = ahci_port_info[board_id];
2963+#else
2964+ struct ata_port_info pi = ahci_port_info[board_ahci];
2965+#endif
2966+ const struct ata_port_info *ppi[] = { &pi, NULL };
2967+ struct device *dev = &pdev->dev;
2968+ struct ahci_host_priv *hpriv;
2969+ struct ata_host *host;
2970+ int n_ports, i, rc;
2971+ struct resource *res;
2972+ u8 *base = NULL;
2973+
2974+ VPRINTK("ENTER\n");
2975+
2976+ WARN_ON(ATA_MAX_QUEUE > AHCI_MAX_CMDS);
2977+
2978+ if (!printed_version++)
2979+ dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
2980+
2981+#if 0
2982+ /* The AHCI driver can only drive the SATA ports, the PATA driver
2983+ can drive them all so if both drivers are selected make sure
2984+ AHCI stays out of the way */
2985+ if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
2986+ return -ENODEV;
2987+
2988+ /* acquire resources */
2989+ rc = pcim_enable_device(pdev);
2990+ if (rc)
2991+ return rc;
2992+
2993+ /* AHCI controllers often implement SFF compatible interface.
2994+ * Grab all PCI BARs just in case.
2995+ */
2996+ rc = pcim_iomap_regions_request_all(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
2997+ if (rc == -EBUSY)
2998+ pcim_pin_device(pdev);
2999+ if (rc)
3000+ return rc;
3001+
3002+ if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
3003+ (pdev->device == 0x2652 || pdev->device == 0x2653)) {
3004+ u8 map;
3005+
3006+ /* ICH6s share the same PCI ID for both piix and ahci
3007+ * modes. Enabling ahci mode while MAP indicates
3008+ * combined mode is a bad idea. Yield to ata_piix.
3009+ */
3010+ pci_read_config_byte(pdev, ICH_MAP, &map);
3011+ if (map & 0x3) {
3012+ dev_printk(KERN_INFO, &pdev->dev, "controller is in "
3013+ "combined mode, can't enable AHCI mode\n");
3014+ return -ENODEV;
3015+ }
3016+ }
3017+#endif
3018+
3019+ hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
3020+ if (!hpriv)
3021+ return -ENOMEM;
3022+ hpriv->flags |= (unsigned long)pi.private_data;
3023+
3024+#if 0
3025+ /* MCP65 revision A1 and A2 can't do MSI */
3026+ if (board_id == board_ahci_mcp65 &&
3027+ (pdev->revision == 0xa1 || pdev->revision == 0xa2))
3028+ hpriv->flags |= AHCI_HFLAG_NO_MSI;
3029+
3030+ /* SB800 does NOT need the workaround to ignore SERR_INTERNAL */
3031+ if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
3032+ hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
3033+
3034+ /* apply ASUS M2A_VM quirk */
3035+ if (ahci_asus_m2a_vm_32bit_only(pdev))
3036+ hpriv->flags |= AHCI_HFLAG_32BIT_ONLY;
3037+
3038+ if (!(hpriv->flags & AHCI_HFLAG_NO_MSI))
3039+ pci_enable_msi(pdev);
3040+#endif
3041+
3042+ /* Cavium CNS3XXX Initial */
3043+ /* Get SATA register base address */
3044+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3045+ if (!res) {
3046+ dev_err(&pdev->dev, "no reg addr\n");
3047+ return -ENODEV;
3048+ }
3049+
3050+ /* ioremap SATA registers */
3051+ base = devm_ioremap(&pdev->dev, res->start, res->end - res->start + 1);
3052+
3053+ if (!base) {
3054+ dev_err(&pdev->dev, "ioremap failed for 0x%x\n", res->start);
3055+ return -ENODEV;
3056+ }
3057+
3058+#if 0
3059+ /* reset PHY test chip */
3060+ printk("*** Reset PHY ***\n");
3061+ CNS3XXX_MISC_REGISTER |= 0xF;
3062+ mdelay(100);
3063+
3064+ printk("%s %d, base:0x%x\n",__FUNCTION__,__LINE__,(u32)base);
3065+
3066+ /* set PI first */
3067+ printk("*** Manually set PI ***\n");
3068+ writel(0x1, (void __iomem *)base + HOST_PORTS_IMPL);
3069+ printk("*** Now PI is: 0x%x ***\n",readl((void __iomem *)base + HOST_PORTS_IMPL));
3070+#endif
3071+
3072+
3073+
3074+
3075+ /* save initial config */
3076+#if 0
3077+ ahci_save_initial_config(pdev, hpriv);
3078+#else
3079+ ahci_save_initial_config(pdev, hpriv, base);
3080+#endif
3081+
3082+ /* prepare host */
3083+ if (hpriv->cap & HOST_CAP_NCQ)
3084+ pi.flags |= ATA_FLAG_NCQ;
3085+
3086+ if (hpriv->cap & HOST_CAP_PMP)
3087+ pi.flags |= ATA_FLAG_PMP;
3088+
3089+ if (ahci_em_messages && (hpriv->cap & HOST_CAP_EMS)) {
3090+ u8 messages;
3091+#if 0
3092+ void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
3093+#else
3094+ void __iomem *mmio = (void __iomem *)base;
3095+#endif
3096+ u32 em_loc = readl(mmio + HOST_EM_LOC);
3097+ u32 em_ctl = readl(mmio + HOST_EM_CTL);
3098+
3099+ messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16;
3100+
3101+ /* we only support LED message type right now */
3102+ if ((messages & 0x01) && (ahci_em_messages == 1)) {
3103+ /* store em_loc */
3104+ hpriv->em_loc = ((em_loc >> 16) * 4);
3105+ pi.flags |= ATA_FLAG_EM;
3106+ if (!(em_ctl & EM_CTL_ALHD))
3107+ pi.flags |= ATA_FLAG_SW_ACTIVITY;
3108+ }
3109+ }
3110+
3111+#if 0
3112+ if (ahci_broken_system_poweroff(pdev)) {
3113+ pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
3114+ dev_info(&pdev->dev,
3115+ "quirky BIOS, skipping spindown on poweroff\n");
3116+ }
3117+
3118+ if (ahci_broken_suspend(pdev)) {
3119+ hpriv->flags |= AHCI_HFLAG_NO_SUSPEND;
3120+ dev_printk(KERN_WARNING, &pdev->dev,
3121+ "BIOS update required for suspend/resume\n");
3122+ }
3123+
3124+ if (ahci_broken_online(pdev)) {
3125+ hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE;
3126+ dev_info(&pdev->dev,
3127+ "online status unreliable, applying workaround\n");
3128+ }
3129+#endif
3130+
3131+ /* CAP.NP sometimes indicate the index of the last enabled
3132+ * port, at other times, that of the last possible port, so
3133+ * determining the maximum port number requires looking at
3134+ * both CAP.NP and port_map.
3135+ */
3136+ n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
3137+
3138+ host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
3139+ if (!host)
3140+ return -ENOMEM;
3141+#if 0
3142+ host->iomap = pcim_iomap_table(pdev);
3143+#else
3144+ host->iomap = (void __iomem *)base;
3145+#endif
3146+ host->private_data = hpriv;
3147+
3148+ if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
3149+ host->flags |= ATA_HOST_PARALLEL_SCAN;
3150+ else
3151+ printk(KERN_INFO "ahci: SSS flag set, parallel bus scan disabled\n");
3152+
3153+ if (pi.flags & ATA_FLAG_EM)
3154+ ahci_reset_em(host);
3155+
3156+ for (i = 0; i < host->n_ports; i++) {
3157+ struct ata_port *ap = host->ports[i];
3158+
3159+#if 0
3160+ ata_port_pbar_desc(ap, AHCI_PCI_BAR, -1, "abar");
3161+ ata_port_pbar_desc(ap, AHCI_PCI_BAR,
3162+ 0x100 + ap->port_no * 0x80, "port");
3163+#else
3164+ ata_port_desc(ap, "%s %s%llu@0x%llx", "ahci bar", "m",
3165+ (long long)(res->end - res->start) + 1, (long long)res->start);
3166+ ata_port_desc(ap, "%s 0x%llx", "port",
3167+ (long long)res->start + 0x100 + ap->port_no * 0x80);
3168+#endif
3169+
3170+ /* set initial link pm policy */
3171+ ap->pm_policy = NOT_AVAILABLE;
3172+
3173+ /* set enclosure management message type */
3174+ if (ap->flags & ATA_FLAG_EM)
3175+ ap->em_message_type = ahci_em_messages;
3176+
3177+
3178+ /* disabled/not-implemented port */
3179+ if (!(hpriv->port_map & (1 << i)))
3180+ ap->ops = &ata_dummy_port_ops;
3181+ }
3182+
3183+#if 0
3184+ /* apply workaround for ASUS P5W DH Deluxe mainboard */
3185+ ahci_p5wdh_workaround(host);
3186+
3187+ /* initialize adapter */
3188+ rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
3189+ if (rc)
3190+ return rc;
3191+#endif
3192+
3193+ rc = ahci_reset_controller(host);
3194+ if (rc)
3195+ return rc;
3196+
3197+ ahci_init_controller(host);
3198+ ahci_print_info(host);
3199+
3200+#if 0
3201+ pci_set_master(pdev);
3202+#endif
3203+
3204+
3205+
3206+#if 0
3207+ return ata_host_activate(host, pdev->irq, ahci_interrupt, IRQF_SHARED,
3208+ &ahci_sht);
3209+#else
3210+ /* Get SATA port interrupt number */
3211+ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
3212+ if (!res) {
3213+ dev_err(&pdev->dev, "no SATA irq\n");
3214+ return -ENODEV;
3215+ }
3216+
3217+ return ata_host_activate(host, res->start, ahci_interrupt, IRQF_SHARED,
3218+ &ahci_sht);
3219+
3220+
3221+#endif
3222+}
3223+
3224+
3225+#if defined(CONFIG_CNS3XXX_SILICON) || defined(CONFIG_SILICON)
3226+static void ahci_phy_init(void){
3227+
3228+ u32 u32tmp;
3229+
3230+
3231+ u32tmp = MISC_SATA_POWER_MODE;
3232+ u32tmp |= 0x1<< 16; // Disable SATA PHY 0 from SLUMBER Mode
3233+ u32tmp |= 0x1<< 17; // Disable SATA PHY 1 from SLUMBER Mode
3234+ MISC_SATA_POWER_MODE = u32tmp;
3235+
3236+ /* Enable SATA PHY */
3237+ cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY0);
3238+ cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1);
3239+
3240+ /* Enable SATA Clock */
3241+ cns3xxx_pwr_clk_en(0x1 << PM_CLK_GATE_REG_OFFSET_SATA);
3242+
3243+ /* De-Asscer SATA Reset */
3244+ u32tmp = PM_SOFT_RST_REG;
3245+ u32tmp |= 0x1 << PM_SOFT_RST_REG_OFFST_SATA;
3246+ PM_SOFT_RST_REG = u32tmp;
3247+}
3248+#endif
3249+
3250+
3251+
3252+static int __init ahci_init(void)
3253+{
3254+#if 0
3255+ return pci_register_driver(&ahci_pci_driver);
3256+#else
3257+ printk("CNS3XXX AHCI SATA low-level driver\n");
3258+#if defined(CONFIG_CNS3XXX_SILICON) || defined(CONFIG_SILICON)
3259+ ahci_phy_init();
3260+#endif
3261+ return platform_driver_register(&ahci_driver);
3262+#endif
3263+}
3264+
3265+static void __exit ahci_exit(void)
3266+{
3267+#if 0
3268+ pci_unregister_driver(&ahci_pci_driver);
3269+#else
3270+ platform_driver_unregister(&ahci_driver);
3271+#endif
3272+}
3273+
3274+
3275+MODULE_AUTHOR("Jeff Garzik");
3276+MODULE_DESCRIPTION("AHCI SATA low-level driver");
3277+MODULE_LICENSE("GPL");
3278+#if 0
3279+MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
3280+#endif
3281+MODULE_VERSION(DRV_VERSION);
3282+
3283+module_init(ahci_init);
3284+module_exit(ahci_exit);
3285--- a/drivers/ata/Kconfig
3286+++ b/drivers/ata/Kconfig
3287@@ -47,6 +47,14 @@ config SATA_PMP
3288       This option adds support for SATA Port Multipliers
3289       (the SATA version of an ethernet hub, or SAS expander).
3290 
3291+config SATA_CNS3XXX_AHCI
3292+ tristate "Cavium CNS3XXX AHCI SATA support"
3293+ help
3294+ This option enables support for AHCI Serial ATA support for Cavium CNS3XXX.
3295+
3296+ If unsure, say N.
3297+
3298+
3299 config SATA_AHCI
3300     tristate "AHCI SATA support"
3301     depends on PCI
3302--- a/drivers/ata/libata-scsi.c
3303+++ b/drivers/ata/libata-scsi.c
3304@@ -3096,12 +3096,22 @@ int ata_scsi_queuecmd(struct scsi_cmnd *
3305     struct scsi_device *scsidev = cmd->device;
3306     struct Scsi_Host *shost = scsidev->host;
3307     int rc = 0;
3308-
3309+#ifdef CONFIG_SMP
3310+ u32 flags;
3311+ local_save_flags(flags);
3312+#endif
3313     ap = ata_shost_to_port(shost);
3314 
3315     spin_unlock(shost->host_lock);
3316+#ifndef CONFIG_SMP
3317     spin_lock(ap->lock);
3318-
3319+#else
3320+ while(!spin_trylock(ap->lock)){
3321+ if(!irqs_disabled()) continue;
3322+ local_irq_enable();
3323+ local_irq_restore(flags);
3324+ }
3325+#endif
3326     ata_scsi_dump_cdb(ap, cmd);
3327 
3328     dev = ata_scsi_find_dev(ap, scsidev);
3329--- a/drivers/ata/libata-sff.c
3330+++ b/drivers/ata/libata-sff.c
3331@@ -893,6 +893,9 @@ static void ata_pio_sector(struct ata_qu
3332                        do_write);
3333     }
3334 
3335+ if (!do_write)
3336+ flush_dcache_page(page);
3337+
3338     qc->curbytes += qc->sect_size;
3339     qc->cursg_ofs += qc->sect_size;
3340 
3341--- a/drivers/ata/Makefile
3342+++ b/drivers/ata/Makefile
3343@@ -1,6 +1,7 @@
3344 
3345 obj-$(CONFIG_ATA) += libata.o
3346 
3347+obj-$(CONFIG_SATA_CNS3XXX_AHCI) += cns3xxx_ahci.o
3348 obj-$(CONFIG_SATA_AHCI) += ahci.o
3349 obj-$(CONFIG_SATA_SVW) += sata_svw.o
3350 obj-$(CONFIG_ATA_PIIX) += ata_piix.o
3351

Archive Download this file



interactive