1 |
62 |
marcus.erl |
/*
|
2 |
|
|
* sata_nv.c - NVIDIA nForce SATA
|
3 |
|
|
*
|
4 |
|
|
* Copyright 2004 NVIDIA Corp. All rights reserved.
|
5 |
|
|
* Copyright 2004 Andrew Chew
|
6 |
|
|
*
|
7 |
|
|
*
|
8 |
|
|
* This program is free software; you can redistribute it and/or modify
|
9 |
|
|
* it under the terms of the GNU General Public License as published by
|
10 |
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
11 |
|
|
* any later version.
|
12 |
|
|
*
|
13 |
|
|
* This program is distributed in the hope that it will be useful,
|
14 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16 |
|
|
* GNU General Public License for more details.
|
17 |
|
|
*
|
18 |
|
|
* You should have received a copy of the GNU General Public License
|
19 |
|
|
* along with this program; see the file COPYING. If not, write to
|
20 |
|
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
21 |
|
|
*
|
22 |
|
|
*
|
23 |
|
|
* libata documentation is available via 'make {ps|pdf}docs',
|
24 |
|
|
* as Documentation/DocBook/libata.*
|
25 |
|
|
*
|
26 |
|
|
* No hardware documentation available outside of NVIDIA.
|
27 |
|
|
* This driver programs the NVIDIA SATA controller in a similar
|
28 |
|
|
* fashion as with other PCI IDE BMDMA controllers, with a few
|
29 |
|
|
* NV-specific details such as register offsets, SATA phy location,
|
30 |
|
|
* hotplug info, etc.
|
31 |
|
|
*
|
32 |
|
|
* CK804/MCP04 controllers support an alternate programming interface
|
33 |
|
|
* similar to the ADMA specification (with some modifications).
|
34 |
|
|
* This allows the use of NCQ. Non-DMA-mapped ATA commands are still
|
35 |
|
|
* sent through the legacy interface.
|
36 |
|
|
*
|
37 |
|
|
*/
|
38 |
|
|
|
39 |
|
|
#include <linux/kernel.h>
|
40 |
|
|
#include <linux/module.h>
|
41 |
|
|
#include <linux/pci.h>
|
42 |
|
|
#include <linux/init.h>
|
43 |
|
|
#include <linux/blkdev.h>
|
44 |
|
|
#include <linux/delay.h>
|
45 |
|
|
#include <linux/interrupt.h>
|
46 |
|
|
#include <linux/device.h>
|
47 |
|
|
#include <scsi/scsi_host.h>
|
48 |
|
|
#include <scsi/scsi_device.h>
|
49 |
|
|
#include <linux/libata.h>
|
50 |
|
|
|
51 |
|
|
#define DRV_NAME "sata_nv"
|
52 |
|
|
#define DRV_VERSION "3.5"
|
53 |
|
|
|
54 |
|
|
#define NV_ADMA_DMA_BOUNDARY 0xffffffffUL
|
55 |
|
|
|
56 |
|
|
enum {
|
57 |
|
|
NV_MMIO_BAR = 5,
|
58 |
|
|
|
59 |
|
|
NV_PORTS = 2,
|
60 |
|
|
NV_PIO_MASK = 0x1f,
|
61 |
|
|
NV_MWDMA_MASK = 0x07,
|
62 |
|
|
NV_UDMA_MASK = 0x7f,
|
63 |
|
|
NV_PORT0_SCR_REG_OFFSET = 0x00,
|
64 |
|
|
NV_PORT1_SCR_REG_OFFSET = 0x40,
|
65 |
|
|
|
66 |
|
|
/* INT_STATUS/ENABLE */
|
67 |
|
|
NV_INT_STATUS = 0x10,
|
68 |
|
|
NV_INT_ENABLE = 0x11,
|
69 |
|
|
NV_INT_STATUS_CK804 = 0x440,
|
70 |
|
|
NV_INT_ENABLE_CK804 = 0x441,
|
71 |
|
|
|
72 |
|
|
/* INT_STATUS/ENABLE bits */
|
73 |
|
|
NV_INT_DEV = 0x01,
|
74 |
|
|
NV_INT_PM = 0x02,
|
75 |
|
|
NV_INT_ADDED = 0x04,
|
76 |
|
|
NV_INT_REMOVED = 0x08,
|
77 |
|
|
|
78 |
|
|
NV_INT_PORT_SHIFT = 4, /* each port occupies 4 bits */
|
79 |
|
|
|
80 |
|
|
NV_INT_ALL = 0x0f,
|
81 |
|
|
NV_INT_MASK = NV_INT_DEV |
|
82 |
|
|
NV_INT_ADDED | NV_INT_REMOVED,
|
83 |
|
|
|
84 |
|
|
/* INT_CONFIG */
|
85 |
|
|
NV_INT_CONFIG = 0x12,
|
86 |
|
|
NV_INT_CONFIG_METHD = 0x01, // 0 = INT, 1 = SMI
|
87 |
|
|
|
88 |
|
|
// For PCI config register 20
|
89 |
|
|
NV_MCP_SATA_CFG_20 = 0x50,
|
90 |
|
|
NV_MCP_SATA_CFG_20_SATA_SPACE_EN = 0x04,
|
91 |
|
|
NV_MCP_SATA_CFG_20_PORT0_EN = (1 << 17),
|
92 |
|
|
NV_MCP_SATA_CFG_20_PORT1_EN = (1 << 16),
|
93 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN = (1 << 14),
|
94 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN = (1 << 12),
|
95 |
|
|
|
96 |
|
|
NV_ADMA_MAX_CPBS = 32,
|
97 |
|
|
NV_ADMA_CPB_SZ = 128,
|
98 |
|
|
NV_ADMA_APRD_SZ = 16,
|
99 |
|
|
NV_ADMA_SGTBL_LEN = (1024 - NV_ADMA_CPB_SZ) /
|
100 |
|
|
NV_ADMA_APRD_SZ,
|
101 |
|
|
NV_ADMA_SGTBL_TOTAL_LEN = NV_ADMA_SGTBL_LEN + 5,
|
102 |
|
|
NV_ADMA_SGTBL_SZ = NV_ADMA_SGTBL_LEN * NV_ADMA_APRD_SZ,
|
103 |
|
|
NV_ADMA_PORT_PRIV_DMA_SZ = NV_ADMA_MAX_CPBS *
|
104 |
|
|
(NV_ADMA_CPB_SZ + NV_ADMA_SGTBL_SZ),
|
105 |
|
|
|
106 |
|
|
/* BAR5 offset to ADMA general registers */
|
107 |
|
|
NV_ADMA_GEN = 0x400,
|
108 |
|
|
NV_ADMA_GEN_CTL = 0x00,
|
109 |
|
|
NV_ADMA_NOTIFIER_CLEAR = 0x30,
|
110 |
|
|
|
111 |
|
|
/* BAR5 offset to ADMA ports */
|
112 |
|
|
NV_ADMA_PORT = 0x480,
|
113 |
|
|
|
114 |
|
|
/* size of ADMA port register space */
|
115 |
|
|
NV_ADMA_PORT_SIZE = 0x100,
|
116 |
|
|
|
117 |
|
|
/* ADMA port registers */
|
118 |
|
|
NV_ADMA_CTL = 0x40,
|
119 |
|
|
NV_ADMA_CPB_COUNT = 0x42,
|
120 |
|
|
NV_ADMA_NEXT_CPB_IDX = 0x43,
|
121 |
|
|
NV_ADMA_STAT = 0x44,
|
122 |
|
|
NV_ADMA_CPB_BASE_LOW = 0x48,
|
123 |
|
|
NV_ADMA_CPB_BASE_HIGH = 0x4C,
|
124 |
|
|
NV_ADMA_APPEND = 0x50,
|
125 |
|
|
NV_ADMA_NOTIFIER = 0x68,
|
126 |
|
|
NV_ADMA_NOTIFIER_ERROR = 0x6C,
|
127 |
|
|
|
128 |
|
|
/* NV_ADMA_CTL register bits */
|
129 |
|
|
NV_ADMA_CTL_HOTPLUG_IEN = (1 << 0),
|
130 |
|
|
NV_ADMA_CTL_CHANNEL_RESET = (1 << 5),
|
131 |
|
|
NV_ADMA_CTL_GO = (1 << 7),
|
132 |
|
|
NV_ADMA_CTL_AIEN = (1 << 8),
|
133 |
|
|
NV_ADMA_CTL_READ_NON_COHERENT = (1 << 11),
|
134 |
|
|
NV_ADMA_CTL_WRITE_NON_COHERENT = (1 << 12),
|
135 |
|
|
|
136 |
|
|
/* CPB response flag bits */
|
137 |
|
|
NV_CPB_RESP_DONE = (1 << 0),
|
138 |
|
|
NV_CPB_RESP_ATA_ERR = (1 << 3),
|
139 |
|
|
NV_CPB_RESP_CMD_ERR = (1 << 4),
|
140 |
|
|
NV_CPB_RESP_CPB_ERR = (1 << 7),
|
141 |
|
|
|
142 |
|
|
/* CPB control flag bits */
|
143 |
|
|
NV_CPB_CTL_CPB_VALID = (1 << 0),
|
144 |
|
|
NV_CPB_CTL_QUEUE = (1 << 1),
|
145 |
|
|
NV_CPB_CTL_APRD_VALID = (1 << 2),
|
146 |
|
|
NV_CPB_CTL_IEN = (1 << 3),
|
147 |
|
|
NV_CPB_CTL_FPDMA = (1 << 4),
|
148 |
|
|
|
149 |
|
|
/* APRD flags */
|
150 |
|
|
NV_APRD_WRITE = (1 << 1),
|
151 |
|
|
NV_APRD_END = (1 << 2),
|
152 |
|
|
NV_APRD_CONT = (1 << 3),
|
153 |
|
|
|
154 |
|
|
/* NV_ADMA_STAT flags */
|
155 |
|
|
NV_ADMA_STAT_TIMEOUT = (1 << 0),
|
156 |
|
|
NV_ADMA_STAT_HOTUNPLUG = (1 << 1),
|
157 |
|
|
NV_ADMA_STAT_HOTPLUG = (1 << 2),
|
158 |
|
|
NV_ADMA_STAT_CPBERR = (1 << 4),
|
159 |
|
|
NV_ADMA_STAT_SERROR = (1 << 5),
|
160 |
|
|
NV_ADMA_STAT_CMD_COMPLETE = (1 << 6),
|
161 |
|
|
NV_ADMA_STAT_IDLE = (1 << 8),
|
162 |
|
|
NV_ADMA_STAT_LEGACY = (1 << 9),
|
163 |
|
|
NV_ADMA_STAT_STOPPED = (1 << 10),
|
164 |
|
|
NV_ADMA_STAT_DONE = (1 << 12),
|
165 |
|
|
NV_ADMA_STAT_ERR = NV_ADMA_STAT_CPBERR |
|
166 |
|
|
NV_ADMA_STAT_TIMEOUT,
|
167 |
|
|
|
168 |
|
|
/* port flags */
|
169 |
|
|
NV_ADMA_PORT_REGISTER_MODE = (1 << 0),
|
170 |
|
|
NV_ADMA_ATAPI_SETUP_COMPLETE = (1 << 1),
|
171 |
|
|
|
172 |
|
|
/* MCP55 reg offset */
|
173 |
|
|
NV_CTL_MCP55 = 0x400,
|
174 |
|
|
NV_INT_STATUS_MCP55 = 0x440,
|
175 |
|
|
NV_INT_ENABLE_MCP55 = 0x444,
|
176 |
|
|
NV_NCQ_REG_MCP55 = 0x448,
|
177 |
|
|
|
178 |
|
|
/* MCP55 */
|
179 |
|
|
NV_INT_ALL_MCP55 = 0xffff,
|
180 |
|
|
NV_INT_PORT_SHIFT_MCP55 = 16, /* each port occupies 16 bits */
|
181 |
|
|
NV_INT_MASK_MCP55 = NV_INT_ALL_MCP55 & 0xfffd,
|
182 |
|
|
|
183 |
|
|
/* SWNCQ ENABLE BITS*/
|
184 |
|
|
NV_CTL_PRI_SWNCQ = 0x02,
|
185 |
|
|
NV_CTL_SEC_SWNCQ = 0x04,
|
186 |
|
|
|
187 |
|
|
/* SW NCQ status bits*/
|
188 |
|
|
NV_SWNCQ_IRQ_DEV = (1 << 0),
|
189 |
|
|
NV_SWNCQ_IRQ_PM = (1 << 1),
|
190 |
|
|
NV_SWNCQ_IRQ_ADDED = (1 << 2),
|
191 |
|
|
NV_SWNCQ_IRQ_REMOVED = (1 << 3),
|
192 |
|
|
|
193 |
|
|
NV_SWNCQ_IRQ_BACKOUT = (1 << 4),
|
194 |
|
|
NV_SWNCQ_IRQ_SDBFIS = (1 << 5),
|
195 |
|
|
NV_SWNCQ_IRQ_DHREGFIS = (1 << 6),
|
196 |
|
|
NV_SWNCQ_IRQ_DMASETUP = (1 << 7),
|
197 |
|
|
|
198 |
|
|
NV_SWNCQ_IRQ_HOTPLUG = NV_SWNCQ_IRQ_ADDED |
|
199 |
|
|
NV_SWNCQ_IRQ_REMOVED,
|
200 |
|
|
|
201 |
|
|
};
|
202 |
|
|
|
203 |
|
|
/* ADMA Physical Region Descriptor - one SG segment */
|
204 |
|
|
struct nv_adma_prd {
|
205 |
|
|
__le64 addr;
|
206 |
|
|
__le32 len;
|
207 |
|
|
u8 flags;
|
208 |
|
|
u8 packet_len;
|
209 |
|
|
__le16 reserved;
|
210 |
|
|
};
|
211 |
|
|
|
212 |
|
|
enum nv_adma_regbits {
|
213 |
|
|
CMDEND = (1 << 15), /* end of command list */
|
214 |
|
|
WNB = (1 << 14), /* wait-not-BSY */
|
215 |
|
|
IGN = (1 << 13), /* ignore this entry */
|
216 |
|
|
CS1n = (1 << (4 + 8)), /* std. PATA signals follow... */
|
217 |
|
|
DA2 = (1 << (2 + 8)),
|
218 |
|
|
DA1 = (1 << (1 + 8)),
|
219 |
|
|
DA0 = (1 << (0 + 8)),
|
220 |
|
|
};
|
221 |
|
|
|
222 |
|
|
/* ADMA Command Parameter Block
|
223 |
|
|
The first 5 SG segments are stored inside the Command Parameter Block itself.
|
224 |
|
|
If there are more than 5 segments the remainder are stored in a separate
|
225 |
|
|
memory area indicated by next_aprd. */
|
226 |
|
|
struct nv_adma_cpb {
|
227 |
|
|
u8 resp_flags; /* 0 */
|
228 |
|
|
u8 reserved1; /* 1 */
|
229 |
|
|
u8 ctl_flags; /* 2 */
|
230 |
|
|
/* len is length of taskfile in 64 bit words */
|
231 |
|
|
u8 len; /* 3 */
|
232 |
|
|
u8 tag; /* 4 */
|
233 |
|
|
u8 next_cpb_idx; /* 5 */
|
234 |
|
|
__le16 reserved2; /* 6-7 */
|
235 |
|
|
__le16 tf[12]; /* 8-31 */
|
236 |
|
|
struct nv_adma_prd aprd[5]; /* 32-111 */
|
237 |
|
|
__le64 next_aprd; /* 112-119 */
|
238 |
|
|
__le64 reserved3; /* 120-127 */
|
239 |
|
|
};
|
240 |
|
|
|
241 |
|
|
|
242 |
|
|
struct nv_adma_port_priv {
|
243 |
|
|
struct nv_adma_cpb *cpb;
|
244 |
|
|
dma_addr_t cpb_dma;
|
245 |
|
|
struct nv_adma_prd *aprd;
|
246 |
|
|
dma_addr_t aprd_dma;
|
247 |
|
|
void __iomem *ctl_block;
|
248 |
|
|
void __iomem *gen_block;
|
249 |
|
|
void __iomem *notifier_clear_block;
|
250 |
|
|
u8 flags;
|
251 |
|
|
int last_issue_ncq;
|
252 |
|
|
};
|
253 |
|
|
|
254 |
|
|
struct nv_host_priv {
|
255 |
|
|
unsigned long type;
|
256 |
|
|
};
|
257 |
|
|
|
258 |
|
|
struct defer_queue {
|
259 |
|
|
u32 defer_bits;
|
260 |
|
|
unsigned int head;
|
261 |
|
|
unsigned int tail;
|
262 |
|
|
unsigned int tag[ATA_MAX_QUEUE];
|
263 |
|
|
};
|
264 |
|
|
|
265 |
|
|
enum ncq_saw_flag_list {
|
266 |
|
|
ncq_saw_d2h = (1U << 0),
|
267 |
|
|
ncq_saw_dmas = (1U << 1),
|
268 |
|
|
ncq_saw_sdb = (1U << 2),
|
269 |
|
|
ncq_saw_backout = (1U << 3),
|
270 |
|
|
};
|
271 |
|
|
|
272 |
|
|
struct nv_swncq_port_priv {
|
273 |
|
|
struct ata_prd *prd; /* our SG list */
|
274 |
|
|
dma_addr_t prd_dma; /* and its DMA mapping */
|
275 |
|
|
void __iomem *sactive_block;
|
276 |
|
|
void __iomem *irq_block;
|
277 |
|
|
void __iomem *tag_block;
|
278 |
|
|
u32 qc_active;
|
279 |
|
|
|
280 |
|
|
unsigned int last_issue_tag;
|
281 |
|
|
|
282 |
|
|
/* fifo circular queue to store deferral command */
|
283 |
|
|
struct defer_queue defer_queue;
|
284 |
|
|
|
285 |
|
|
/* for NCQ interrupt analysis */
|
286 |
|
|
u32 dhfis_bits;
|
287 |
|
|
u32 dmafis_bits;
|
288 |
|
|
u32 sdbfis_bits;
|
289 |
|
|
|
290 |
|
|
unsigned int ncq_flags;
|
291 |
|
|
};
|
292 |
|
|
|
293 |
|
|
|
294 |
|
|
#define NV_ADMA_CHECK_INTR(GCTL, PORT) ((GCTL) & (1 << (19 + (12 * (PORT)))))
|
295 |
|
|
|
296 |
|
|
static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
297 |
|
|
#ifdef CONFIG_PM
|
298 |
|
|
static int nv_pci_device_resume(struct pci_dev *pdev);
|
299 |
|
|
#endif
|
300 |
|
|
static void nv_ck804_host_stop(struct ata_host *host);
|
301 |
|
|
static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance);
|
302 |
|
|
static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance);
|
303 |
|
|
static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance);
|
304 |
|
|
static int nv_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
|
305 |
|
|
static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
|
306 |
|
|
|
307 |
|
|
static void nv_nf2_freeze(struct ata_port *ap);
|
308 |
|
|
static void nv_nf2_thaw(struct ata_port *ap);
|
309 |
|
|
static void nv_ck804_freeze(struct ata_port *ap);
|
310 |
|
|
static void nv_ck804_thaw(struct ata_port *ap);
|
311 |
|
|
static void nv_error_handler(struct ata_port *ap);
|
312 |
|
|
static int nv_adma_slave_config(struct scsi_device *sdev);
|
313 |
|
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
314 |
|
|
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
315 |
|
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
316 |
|
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
317 |
|
|
static void nv_adma_irq_clear(struct ata_port *ap);
|
318 |
|
|
static int nv_adma_port_start(struct ata_port *ap);
|
319 |
|
|
static void nv_adma_port_stop(struct ata_port *ap);
|
320 |
|
|
#ifdef CONFIG_PM
|
321 |
|
|
static int nv_adma_port_suspend(struct ata_port *ap, pm_message_t mesg);
|
322 |
|
|
static int nv_adma_port_resume(struct ata_port *ap);
|
323 |
|
|
#endif
|
324 |
|
|
static void nv_adma_freeze(struct ata_port *ap);
|
325 |
|
|
static void nv_adma_thaw(struct ata_port *ap);
|
326 |
|
|
static void nv_adma_error_handler(struct ata_port *ap);
|
327 |
|
|
static void nv_adma_host_stop(struct ata_host *host);
|
328 |
|
|
static void nv_adma_post_internal_cmd(struct ata_queued_cmd *qc);
|
329 |
|
|
static void nv_adma_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
330 |
|
|
|
331 |
|
|
static void nv_mcp55_thaw(struct ata_port *ap);
|
332 |
|
|
static void nv_mcp55_freeze(struct ata_port *ap);
|
333 |
|
|
static void nv_swncq_error_handler(struct ata_port *ap);
|
334 |
|
|
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
335 |
|
|
static int nv_swncq_port_start(struct ata_port *ap);
|
336 |
|
|
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
337 |
|
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
338 |
|
|
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
339 |
|
|
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
340 |
|
|
static irqreturn_t nv_swncq_interrupt(int irq, void *dev_instance);
|
341 |
|
|
#ifdef CONFIG_PM
|
342 |
|
|
static int nv_swncq_port_suspend(struct ata_port *ap, pm_message_t mesg);
|
343 |
|
|
static int nv_swncq_port_resume(struct ata_port *ap);
|
344 |
|
|
#endif
|
345 |
|
|
|
346 |
|
|
enum nv_host_type
|
347 |
|
|
{
|
348 |
|
|
GENERIC,
|
349 |
|
|
NFORCE2,
|
350 |
|
|
NFORCE3 = NFORCE2, /* NF2 == NF3 as far as sata_nv is concerned */
|
351 |
|
|
CK804,
|
352 |
|
|
ADMA,
|
353 |
|
|
SWNCQ,
|
354 |
|
|
};
|
355 |
|
|
|
356 |
|
|
static const struct pci_device_id nv_pci_tbl[] = {
|
357 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA), NFORCE2 },
|
358 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA), NFORCE3 },
|
359 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2), NFORCE3 },
|
360 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA), CK804 },
|
361 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2), CK804 },
|
362 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA), CK804 },
|
363 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2), CK804 },
|
364 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA), SWNCQ },
|
365 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2), SWNCQ },
|
366 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA), SWNCQ },
|
367 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2), SWNCQ },
|
368 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA), GENERIC },
|
369 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2), GENERIC },
|
370 |
|
|
{ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3), GENERIC },
|
371 |
|
|
|
372 |
|
|
{ } /* terminate list */
|
373 |
|
|
};
|
374 |
|
|
|
375 |
|
|
static struct pci_driver nv_pci_driver = {
|
376 |
|
|
.name = DRV_NAME,
|
377 |
|
|
.id_table = nv_pci_tbl,
|
378 |
|
|
.probe = nv_init_one,
|
379 |
|
|
#ifdef CONFIG_PM
|
380 |
|
|
.suspend = ata_pci_device_suspend,
|
381 |
|
|
.resume = nv_pci_device_resume,
|
382 |
|
|
#endif
|
383 |
|
|
.remove = ata_pci_remove_one,
|
384 |
|
|
};
|
385 |
|
|
|
386 |
|
|
static struct scsi_host_template nv_sht = {
|
387 |
|
|
.module = THIS_MODULE,
|
388 |
|
|
.name = DRV_NAME,
|
389 |
|
|
.ioctl = ata_scsi_ioctl,
|
390 |
|
|
.queuecommand = ata_scsi_queuecmd,
|
391 |
|
|
.can_queue = ATA_DEF_QUEUE,
|
392 |
|
|
.this_id = ATA_SHT_THIS_ID,
|
393 |
|
|
.sg_tablesize = LIBATA_MAX_PRD,
|
394 |
|
|
.cmd_per_lun = ATA_SHT_CMD_PER_LUN,
|
395 |
|
|
.emulated = ATA_SHT_EMULATED,
|
396 |
|
|
.use_clustering = ATA_SHT_USE_CLUSTERING,
|
397 |
|
|
.proc_name = DRV_NAME,
|
398 |
|
|
.dma_boundary = ATA_DMA_BOUNDARY,
|
399 |
|
|
.slave_configure = ata_scsi_slave_config,
|
400 |
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
401 |
|
|
.bios_param = ata_std_bios_param,
|
402 |
|
|
};
|
403 |
|
|
|
404 |
|
|
static struct scsi_host_template nv_adma_sht = {
|
405 |
|
|
.module = THIS_MODULE,
|
406 |
|
|
.name = DRV_NAME,
|
407 |
|
|
.ioctl = ata_scsi_ioctl,
|
408 |
|
|
.queuecommand = ata_scsi_queuecmd,
|
409 |
|
|
.change_queue_depth = ata_scsi_change_queue_depth,
|
410 |
|
|
.can_queue = NV_ADMA_MAX_CPBS,
|
411 |
|
|
.this_id = ATA_SHT_THIS_ID,
|
412 |
|
|
.sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN,
|
413 |
|
|
.cmd_per_lun = ATA_SHT_CMD_PER_LUN,
|
414 |
|
|
.emulated = ATA_SHT_EMULATED,
|
415 |
|
|
.use_clustering = ATA_SHT_USE_CLUSTERING,
|
416 |
|
|
.proc_name = DRV_NAME,
|
417 |
|
|
.dma_boundary = NV_ADMA_DMA_BOUNDARY,
|
418 |
|
|
.slave_configure = nv_adma_slave_config,
|
419 |
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
420 |
|
|
.bios_param = ata_std_bios_param,
|
421 |
|
|
};
|
422 |
|
|
|
423 |
|
|
static struct scsi_host_template nv_swncq_sht = {
|
424 |
|
|
.module = THIS_MODULE,
|
425 |
|
|
.name = DRV_NAME,
|
426 |
|
|
.ioctl = ata_scsi_ioctl,
|
427 |
|
|
.queuecommand = ata_scsi_queuecmd,
|
428 |
|
|
.change_queue_depth = ata_scsi_change_queue_depth,
|
429 |
|
|
.can_queue = ATA_MAX_QUEUE,
|
430 |
|
|
.this_id = ATA_SHT_THIS_ID,
|
431 |
|
|
.sg_tablesize = LIBATA_MAX_PRD,
|
432 |
|
|
.cmd_per_lun = ATA_SHT_CMD_PER_LUN,
|
433 |
|
|
.emulated = ATA_SHT_EMULATED,
|
434 |
|
|
.use_clustering = ATA_SHT_USE_CLUSTERING,
|
435 |
|
|
.proc_name = DRV_NAME,
|
436 |
|
|
.dma_boundary = ATA_DMA_BOUNDARY,
|
437 |
|
|
.slave_configure = nv_swncq_slave_config,
|
438 |
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
439 |
|
|
.bios_param = ata_std_bios_param,
|
440 |
|
|
};
|
441 |
|
|
|
442 |
|
|
static const struct ata_port_operations nv_generic_ops = {
|
443 |
|
|
.tf_load = ata_tf_load,
|
444 |
|
|
.tf_read = ata_tf_read,
|
445 |
|
|
.exec_command = ata_exec_command,
|
446 |
|
|
.check_status = ata_check_status,
|
447 |
|
|
.dev_select = ata_std_dev_select,
|
448 |
|
|
.bmdma_setup = ata_bmdma_setup,
|
449 |
|
|
.bmdma_start = ata_bmdma_start,
|
450 |
|
|
.bmdma_stop = ata_bmdma_stop,
|
451 |
|
|
.bmdma_status = ata_bmdma_status,
|
452 |
|
|
.qc_prep = ata_qc_prep,
|
453 |
|
|
.qc_issue = ata_qc_issue_prot,
|
454 |
|
|
.freeze = ata_bmdma_freeze,
|
455 |
|
|
.thaw = ata_bmdma_thaw,
|
456 |
|
|
.error_handler = nv_error_handler,
|
457 |
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
458 |
|
|
.data_xfer = ata_data_xfer,
|
459 |
|
|
.irq_clear = ata_bmdma_irq_clear,
|
460 |
|
|
.irq_on = ata_irq_on,
|
461 |
|
|
.scr_read = nv_scr_read,
|
462 |
|
|
.scr_write = nv_scr_write,
|
463 |
|
|
.port_start = ata_port_start,
|
464 |
|
|
};
|
465 |
|
|
|
466 |
|
|
static const struct ata_port_operations nv_nf2_ops = {
|
467 |
|
|
.tf_load = ata_tf_load,
|
468 |
|
|
.tf_read = ata_tf_read,
|
469 |
|
|
.exec_command = ata_exec_command,
|
470 |
|
|
.check_status = ata_check_status,
|
471 |
|
|
.dev_select = ata_std_dev_select,
|
472 |
|
|
.bmdma_setup = ata_bmdma_setup,
|
473 |
|
|
.bmdma_start = ata_bmdma_start,
|
474 |
|
|
.bmdma_stop = ata_bmdma_stop,
|
475 |
|
|
.bmdma_status = ata_bmdma_status,
|
476 |
|
|
.qc_prep = ata_qc_prep,
|
477 |
|
|
.qc_issue = ata_qc_issue_prot,
|
478 |
|
|
.freeze = nv_nf2_freeze,
|
479 |
|
|
.thaw = nv_nf2_thaw,
|
480 |
|
|
.error_handler = nv_error_handler,
|
481 |
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
482 |
|
|
.data_xfer = ata_data_xfer,
|
483 |
|
|
.irq_clear = ata_bmdma_irq_clear,
|
484 |
|
|
.irq_on = ata_irq_on,
|
485 |
|
|
.scr_read = nv_scr_read,
|
486 |
|
|
.scr_write = nv_scr_write,
|
487 |
|
|
.port_start = ata_port_start,
|
488 |
|
|
};
|
489 |
|
|
|
490 |
|
|
static const struct ata_port_operations nv_ck804_ops = {
|
491 |
|
|
.tf_load = ata_tf_load,
|
492 |
|
|
.tf_read = ata_tf_read,
|
493 |
|
|
.exec_command = ata_exec_command,
|
494 |
|
|
.check_status = ata_check_status,
|
495 |
|
|
.dev_select = ata_std_dev_select,
|
496 |
|
|
.bmdma_setup = ata_bmdma_setup,
|
497 |
|
|
.bmdma_start = ata_bmdma_start,
|
498 |
|
|
.bmdma_stop = ata_bmdma_stop,
|
499 |
|
|
.bmdma_status = ata_bmdma_status,
|
500 |
|
|
.qc_prep = ata_qc_prep,
|
501 |
|
|
.qc_issue = ata_qc_issue_prot,
|
502 |
|
|
.freeze = nv_ck804_freeze,
|
503 |
|
|
.thaw = nv_ck804_thaw,
|
504 |
|
|
.error_handler = nv_error_handler,
|
505 |
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
506 |
|
|
.data_xfer = ata_data_xfer,
|
507 |
|
|
.irq_clear = ata_bmdma_irq_clear,
|
508 |
|
|
.irq_on = ata_irq_on,
|
509 |
|
|
.scr_read = nv_scr_read,
|
510 |
|
|
.scr_write = nv_scr_write,
|
511 |
|
|
.port_start = ata_port_start,
|
512 |
|
|
.host_stop = nv_ck804_host_stop,
|
513 |
|
|
};
|
514 |
|
|
|
515 |
|
|
static const struct ata_port_operations nv_adma_ops = {
|
516 |
|
|
.tf_load = ata_tf_load,
|
517 |
|
|
.tf_read = nv_adma_tf_read,
|
518 |
|
|
.check_atapi_dma = nv_adma_check_atapi_dma,
|
519 |
|
|
.exec_command = ata_exec_command,
|
520 |
|
|
.check_status = ata_check_status,
|
521 |
|
|
.dev_select = ata_std_dev_select,
|
522 |
|
|
.bmdma_setup = ata_bmdma_setup,
|
523 |
|
|
.bmdma_start = ata_bmdma_start,
|
524 |
|
|
.bmdma_stop = ata_bmdma_stop,
|
525 |
|
|
.bmdma_status = ata_bmdma_status,
|
526 |
|
|
.qc_defer = ata_std_qc_defer,
|
527 |
|
|
.qc_prep = nv_adma_qc_prep,
|
528 |
|
|
.qc_issue = nv_adma_qc_issue,
|
529 |
|
|
.freeze = nv_adma_freeze,
|
530 |
|
|
.thaw = nv_adma_thaw,
|
531 |
|
|
.error_handler = nv_adma_error_handler,
|
532 |
|
|
.post_internal_cmd = nv_adma_post_internal_cmd,
|
533 |
|
|
.data_xfer = ata_data_xfer,
|
534 |
|
|
.irq_clear = nv_adma_irq_clear,
|
535 |
|
|
.irq_on = ata_irq_on,
|
536 |
|
|
.scr_read = nv_scr_read,
|
537 |
|
|
.scr_write = nv_scr_write,
|
538 |
|
|
.port_start = nv_adma_port_start,
|
539 |
|
|
.port_stop = nv_adma_port_stop,
|
540 |
|
|
#ifdef CONFIG_PM
|
541 |
|
|
.port_suspend = nv_adma_port_suspend,
|
542 |
|
|
.port_resume = nv_adma_port_resume,
|
543 |
|
|
#endif
|
544 |
|
|
.host_stop = nv_adma_host_stop,
|
545 |
|
|
};
|
546 |
|
|
|
547 |
|
|
static const struct ata_port_operations nv_swncq_ops = {
|
548 |
|
|
.tf_load = ata_tf_load,
|
549 |
|
|
.tf_read = ata_tf_read,
|
550 |
|
|
.exec_command = ata_exec_command,
|
551 |
|
|
.check_status = ata_check_status,
|
552 |
|
|
.dev_select = ata_std_dev_select,
|
553 |
|
|
.bmdma_setup = ata_bmdma_setup,
|
554 |
|
|
.bmdma_start = ata_bmdma_start,
|
555 |
|
|
.bmdma_stop = ata_bmdma_stop,
|
556 |
|
|
.bmdma_status = ata_bmdma_status,
|
557 |
|
|
.qc_defer = ata_std_qc_defer,
|
558 |
|
|
.qc_prep = nv_swncq_qc_prep,
|
559 |
|
|
.qc_issue = nv_swncq_qc_issue,
|
560 |
|
|
.freeze = nv_mcp55_freeze,
|
561 |
|
|
.thaw = nv_mcp55_thaw,
|
562 |
|
|
.error_handler = nv_swncq_error_handler,
|
563 |
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
564 |
|
|
.data_xfer = ata_data_xfer,
|
565 |
|
|
.irq_clear = ata_bmdma_irq_clear,
|
566 |
|
|
.irq_on = ata_irq_on,
|
567 |
|
|
.scr_read = nv_scr_read,
|
568 |
|
|
.scr_write = nv_scr_write,
|
569 |
|
|
#ifdef CONFIG_PM
|
570 |
|
|
.port_suspend = nv_swncq_port_suspend,
|
571 |
|
|
.port_resume = nv_swncq_port_resume,
|
572 |
|
|
#endif
|
573 |
|
|
.port_start = nv_swncq_port_start,
|
574 |
|
|
};
|
575 |
|
|
|
576 |
|
|
static const struct ata_port_info nv_port_info[] = {
|
577 |
|
|
/* generic */
|
578 |
|
|
{
|
579 |
|
|
.sht = &nv_sht,
|
580 |
|
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
|
581 |
|
|
.link_flags = ATA_LFLAG_HRST_TO_RESUME,
|
582 |
|
|
.pio_mask = NV_PIO_MASK,
|
583 |
|
|
.mwdma_mask = NV_MWDMA_MASK,
|
584 |
|
|
.udma_mask = NV_UDMA_MASK,
|
585 |
|
|
.port_ops = &nv_generic_ops,
|
586 |
|
|
.irq_handler = nv_generic_interrupt,
|
587 |
|
|
},
|
588 |
|
|
/* nforce2/3 */
|
589 |
|
|
{
|
590 |
|
|
.sht = &nv_sht,
|
591 |
|
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
|
592 |
|
|
.link_flags = ATA_LFLAG_HRST_TO_RESUME,
|
593 |
|
|
.pio_mask = NV_PIO_MASK,
|
594 |
|
|
.mwdma_mask = NV_MWDMA_MASK,
|
595 |
|
|
.udma_mask = NV_UDMA_MASK,
|
596 |
|
|
.port_ops = &nv_nf2_ops,
|
597 |
|
|
.irq_handler = nv_nf2_interrupt,
|
598 |
|
|
},
|
599 |
|
|
/* ck804 */
|
600 |
|
|
{
|
601 |
|
|
.sht = &nv_sht,
|
602 |
|
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
|
603 |
|
|
.link_flags = ATA_LFLAG_HRST_TO_RESUME,
|
604 |
|
|
.pio_mask = NV_PIO_MASK,
|
605 |
|
|
.mwdma_mask = NV_MWDMA_MASK,
|
606 |
|
|
.udma_mask = NV_UDMA_MASK,
|
607 |
|
|
.port_ops = &nv_ck804_ops,
|
608 |
|
|
.irq_handler = nv_ck804_interrupt,
|
609 |
|
|
},
|
610 |
|
|
/* ADMA */
|
611 |
|
|
{
|
612 |
|
|
.sht = &nv_adma_sht,
|
613 |
|
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
614 |
|
|
ATA_FLAG_MMIO | ATA_FLAG_NCQ,
|
615 |
|
|
.link_flags = ATA_LFLAG_HRST_TO_RESUME,
|
616 |
|
|
.pio_mask = NV_PIO_MASK,
|
617 |
|
|
.mwdma_mask = NV_MWDMA_MASK,
|
618 |
|
|
.udma_mask = NV_UDMA_MASK,
|
619 |
|
|
.port_ops = &nv_adma_ops,
|
620 |
|
|
.irq_handler = nv_adma_interrupt,
|
621 |
|
|
},
|
622 |
|
|
/* SWNCQ */
|
623 |
|
|
{
|
624 |
|
|
.sht = &nv_swncq_sht,
|
625 |
|
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
626 |
|
|
ATA_FLAG_NCQ,
|
627 |
|
|
.link_flags = ATA_LFLAG_HRST_TO_RESUME,
|
628 |
|
|
.pio_mask = NV_PIO_MASK,
|
629 |
|
|
.mwdma_mask = NV_MWDMA_MASK,
|
630 |
|
|
.udma_mask = NV_UDMA_MASK,
|
631 |
|
|
.port_ops = &nv_swncq_ops,
|
632 |
|
|
.irq_handler = nv_swncq_interrupt,
|
633 |
|
|
},
|
634 |
|
|
};
|
635 |
|
|
|
636 |
|
|
MODULE_AUTHOR("NVIDIA");
|
637 |
|
|
MODULE_DESCRIPTION("low-level driver for NVIDIA nForce SATA controller");
|
638 |
|
|
MODULE_LICENSE("GPL");
|
639 |
|
|
MODULE_DEVICE_TABLE(pci, nv_pci_tbl);
|
640 |
|
|
MODULE_VERSION(DRV_VERSION);
|
641 |
|
|
|
642 |
|
|
static int adma_enabled = 1;
|
643 |
|
|
static int swncq_enabled;
|
644 |
|
|
|
645 |
|
|
static void nv_adma_register_mode(struct ata_port *ap)
|
646 |
|
|
{
|
647 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
648 |
|
|
void __iomem *mmio = pp->ctl_block;
|
649 |
|
|
u16 tmp, status;
|
650 |
|
|
int count = 0;
|
651 |
|
|
|
652 |
|
|
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE)
|
653 |
|
|
return;
|
654 |
|
|
|
655 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
656 |
|
|
while (!(status & NV_ADMA_STAT_IDLE) && count < 20) {
|
657 |
|
|
ndelay(50);
|
658 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
659 |
|
|
count++;
|
660 |
|
|
}
|
661 |
|
|
if (count == 20)
|
662 |
|
|
ata_port_printk(ap, KERN_WARNING,
|
663 |
|
|
"timeout waiting for ADMA IDLE, stat=0x%hx\n",
|
664 |
|
|
status);
|
665 |
|
|
|
666 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
667 |
|
|
writew(tmp & ~NV_ADMA_CTL_GO, mmio + NV_ADMA_CTL);
|
668 |
|
|
|
669 |
|
|
count = 0;
|
670 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
671 |
|
|
while (!(status & NV_ADMA_STAT_LEGACY) && count < 20) {
|
672 |
|
|
ndelay(50);
|
673 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
674 |
|
|
count++;
|
675 |
|
|
}
|
676 |
|
|
if (count == 20)
|
677 |
|
|
ata_port_printk(ap, KERN_WARNING,
|
678 |
|
|
"timeout waiting for ADMA LEGACY, stat=0x%hx\n",
|
679 |
|
|
status);
|
680 |
|
|
|
681 |
|
|
pp->flags |= NV_ADMA_PORT_REGISTER_MODE;
|
682 |
|
|
}
|
683 |
|
|
|
684 |
|
|
static void nv_adma_mode(struct ata_port *ap)
|
685 |
|
|
{
|
686 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
687 |
|
|
void __iomem *mmio = pp->ctl_block;
|
688 |
|
|
u16 tmp, status;
|
689 |
|
|
int count = 0;
|
690 |
|
|
|
691 |
|
|
if (!(pp->flags & NV_ADMA_PORT_REGISTER_MODE))
|
692 |
|
|
return;
|
693 |
|
|
|
694 |
|
|
WARN_ON(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE);
|
695 |
|
|
|
696 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
697 |
|
|
writew(tmp | NV_ADMA_CTL_GO, mmio + NV_ADMA_CTL);
|
698 |
|
|
|
699 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
700 |
|
|
while (((status & NV_ADMA_STAT_LEGACY) ||
|
701 |
|
|
!(status & NV_ADMA_STAT_IDLE)) && count < 20) {
|
702 |
|
|
ndelay(50);
|
703 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
704 |
|
|
count++;
|
705 |
|
|
}
|
706 |
|
|
if (count == 20)
|
707 |
|
|
ata_port_printk(ap, KERN_WARNING,
|
708 |
|
|
"timeout waiting for ADMA LEGACY clear and IDLE, stat=0x%hx\n",
|
709 |
|
|
status);
|
710 |
|
|
|
711 |
|
|
pp->flags &= ~NV_ADMA_PORT_REGISTER_MODE;
|
712 |
|
|
}
|
713 |
|
|
|
714 |
|
|
static int nv_adma_slave_config(struct scsi_device *sdev)
|
715 |
|
|
{
|
716 |
|
|
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
717 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
718 |
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
719 |
|
|
u64 bounce_limit;
|
720 |
|
|
unsigned long segment_boundary;
|
721 |
|
|
unsigned short sg_tablesize;
|
722 |
|
|
int rc;
|
723 |
|
|
int adma_enable;
|
724 |
|
|
u32 current_reg, new_reg, config_mask;
|
725 |
|
|
|
726 |
|
|
rc = ata_scsi_slave_config(sdev);
|
727 |
|
|
|
728 |
|
|
if (sdev->id >= ATA_MAX_DEVICES || sdev->channel || sdev->lun)
|
729 |
|
|
/* Not a proper libata device, ignore */
|
730 |
|
|
return rc;
|
731 |
|
|
|
732 |
|
|
if (ap->link.device[sdev->id].class == ATA_DEV_ATAPI) {
|
733 |
|
|
/*
|
734 |
|
|
* NVIDIA reports that ADMA mode does not support ATAPI commands.
|
735 |
|
|
* Therefore ATAPI commands are sent through the legacy interface.
|
736 |
|
|
* However, the legacy interface only supports 32-bit DMA.
|
737 |
|
|
* Restrict DMA parameters as required by the legacy interface
|
738 |
|
|
* when an ATAPI device is connected.
|
739 |
|
|
*/
|
740 |
|
|
bounce_limit = ATA_DMA_MASK;
|
741 |
|
|
segment_boundary = ATA_DMA_BOUNDARY;
|
742 |
|
|
/* Subtract 1 since an extra entry may be needed for padding, see
|
743 |
|
|
libata-scsi.c */
|
744 |
|
|
sg_tablesize = LIBATA_MAX_PRD - 1;
|
745 |
|
|
|
746 |
|
|
/* Since the legacy DMA engine is in use, we need to disable ADMA
|
747 |
|
|
on the port. */
|
748 |
|
|
adma_enable = 0;
|
749 |
|
|
nv_adma_register_mode(ap);
|
750 |
|
|
} else {
|
751 |
|
|
bounce_limit = *ap->dev->dma_mask;
|
752 |
|
|
segment_boundary = NV_ADMA_DMA_BOUNDARY;
|
753 |
|
|
sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN;
|
754 |
|
|
adma_enable = 1;
|
755 |
|
|
}
|
756 |
|
|
|
757 |
|
|
pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, ¤t_reg);
|
758 |
|
|
|
759 |
|
|
if (ap->port_no == 1)
|
760 |
|
|
config_mask = NV_MCP_SATA_CFG_20_PORT1_EN |
|
761 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN;
|
762 |
|
|
else
|
763 |
|
|
config_mask = NV_MCP_SATA_CFG_20_PORT0_EN |
|
764 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN;
|
765 |
|
|
|
766 |
|
|
if (adma_enable) {
|
767 |
|
|
new_reg = current_reg | config_mask;
|
768 |
|
|
pp->flags &= ~NV_ADMA_ATAPI_SETUP_COMPLETE;
|
769 |
|
|
} else {
|
770 |
|
|
new_reg = current_reg & ~config_mask;
|
771 |
|
|
pp->flags |= NV_ADMA_ATAPI_SETUP_COMPLETE;
|
772 |
|
|
}
|
773 |
|
|
|
774 |
|
|
if (current_reg != new_reg)
|
775 |
|
|
pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, new_reg);
|
776 |
|
|
|
777 |
|
|
blk_queue_bounce_limit(sdev->request_queue, bounce_limit);
|
778 |
|
|
blk_queue_segment_boundary(sdev->request_queue, segment_boundary);
|
779 |
|
|
blk_queue_max_hw_segments(sdev->request_queue, sg_tablesize);
|
780 |
|
|
ata_port_printk(ap, KERN_INFO,
|
781 |
|
|
"bounce limit 0x%llX, segment boundary 0x%lX, hw segs %hu\n",
|
782 |
|
|
(unsigned long long)bounce_limit, segment_boundary, sg_tablesize);
|
783 |
|
|
return rc;
|
784 |
|
|
}
|
785 |
|
|
|
786 |
|
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc)
|
787 |
|
|
{
|
788 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
789 |
|
|
return !(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE);
|
790 |
|
|
}
|
791 |
|
|
|
792 |
|
|
static void nv_adma_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
|
793 |
|
|
{
|
794 |
|
|
/* Other than when internal or pass-through commands are executed,
|
795 |
|
|
the only time this function will be called in ADMA mode will be
|
796 |
|
|
if a command fails. In the failure case we don't care about going
|
797 |
|
|
into register mode with ADMA commands pending, as the commands will
|
798 |
|
|
all shortly be aborted anyway. We assume that NCQ commands are not
|
799 |
|
|
issued via passthrough, which is the only way that switching into
|
800 |
|
|
ADMA mode could abort outstanding commands. */
|
801 |
|
|
nv_adma_register_mode(ap);
|
802 |
|
|
|
803 |
|
|
ata_tf_read(ap, tf);
|
804 |
|
|
}
|
805 |
|
|
|
806 |
|
|
static unsigned int nv_adma_tf_to_cpb(struct ata_taskfile *tf, __le16 *cpb)
|
807 |
|
|
{
|
808 |
|
|
unsigned int idx = 0;
|
809 |
|
|
|
810 |
|
|
if (tf->flags & ATA_TFLAG_ISADDR) {
|
811 |
|
|
if (tf->flags & ATA_TFLAG_LBA48) {
|
812 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_ERR << 8) | tf->hob_feature | WNB);
|
813 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_NSECT << 8) | tf->hob_nsect);
|
814 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAL << 8) | tf->hob_lbal);
|
815 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAM << 8) | tf->hob_lbam);
|
816 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAH << 8) | tf->hob_lbah);
|
817 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_ERR << 8) | tf->feature);
|
818 |
|
|
} else
|
819 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_ERR << 8) | tf->feature | WNB);
|
820 |
|
|
|
821 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_NSECT << 8) | tf->nsect);
|
822 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAL << 8) | tf->lbal);
|
823 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAM << 8) | tf->lbam);
|
824 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_LBAH << 8) | tf->lbah);
|
825 |
|
|
}
|
826 |
|
|
|
827 |
|
|
if (tf->flags & ATA_TFLAG_DEVICE)
|
828 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_DEVICE << 8) | tf->device);
|
829 |
|
|
|
830 |
|
|
cpb[idx++] = cpu_to_le16((ATA_REG_CMD << 8) | tf->command | CMDEND);
|
831 |
|
|
|
832 |
|
|
while (idx < 12)
|
833 |
|
|
cpb[idx++] = cpu_to_le16(IGN);
|
834 |
|
|
|
835 |
|
|
return idx;
|
836 |
|
|
}
|
837 |
|
|
|
838 |
|
|
static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
|
839 |
|
|
{
|
840 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
841 |
|
|
u8 flags = pp->cpb[cpb_num].resp_flags;
|
842 |
|
|
|
843 |
|
|
VPRINTK("CPB %d, flags=0x%x\n", cpb_num, flags);
|
844 |
|
|
|
845 |
|
|
if (unlikely((force_err ||
|
846 |
|
|
flags & (NV_CPB_RESP_ATA_ERR |
|
847 |
|
|
NV_CPB_RESP_CMD_ERR |
|
848 |
|
|
NV_CPB_RESP_CPB_ERR)))) {
|
849 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
850 |
|
|
int freeze = 0;
|
851 |
|
|
|
852 |
|
|
ata_ehi_clear_desc(ehi);
|
853 |
|
|
__ata_ehi_push_desc(ehi, "CPB resp_flags 0x%x: ", flags);
|
854 |
|
|
if (flags & NV_CPB_RESP_ATA_ERR) {
|
855 |
|
|
ata_ehi_push_desc(ehi, "ATA error");
|
856 |
|
|
ehi->err_mask |= AC_ERR_DEV;
|
857 |
|
|
} else if (flags & NV_CPB_RESP_CMD_ERR) {
|
858 |
|
|
ata_ehi_push_desc(ehi, "CMD error");
|
859 |
|
|
ehi->err_mask |= AC_ERR_DEV;
|
860 |
|
|
} else if (flags & NV_CPB_RESP_CPB_ERR) {
|
861 |
|
|
ata_ehi_push_desc(ehi, "CPB error");
|
862 |
|
|
ehi->err_mask |= AC_ERR_SYSTEM;
|
863 |
|
|
freeze = 1;
|
864 |
|
|
} else {
|
865 |
|
|
/* notifier error, but no error in CPB flags? */
|
866 |
|
|
ata_ehi_push_desc(ehi, "unknown");
|
867 |
|
|
ehi->err_mask |= AC_ERR_OTHER;
|
868 |
|
|
freeze = 1;
|
869 |
|
|
}
|
870 |
|
|
/* Kill all commands. EH will determine what actually failed. */
|
871 |
|
|
if (freeze)
|
872 |
|
|
ata_port_freeze(ap);
|
873 |
|
|
else
|
874 |
|
|
ata_port_abort(ap);
|
875 |
|
|
return 1;
|
876 |
|
|
}
|
877 |
|
|
|
878 |
|
|
if (likely(flags & NV_CPB_RESP_DONE)) {
|
879 |
|
|
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, cpb_num);
|
880 |
|
|
VPRINTK("CPB flags done, flags=0x%x\n", flags);
|
881 |
|
|
if (likely(qc)) {
|
882 |
|
|
DPRINTK("Completing qc from tag %d\n", cpb_num);
|
883 |
|
|
ata_qc_complete(qc);
|
884 |
|
|
} else {
|
885 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
886 |
|
|
/* Notifier bits set without a command may indicate the drive
|
887 |
|
|
is misbehaving. Raise host state machine violation on this
|
888 |
|
|
condition. */
|
889 |
|
|
ata_port_printk(ap, KERN_ERR,
|
890 |
|
|
"notifier for tag %d with no cmd?\n",
|
891 |
|
|
cpb_num);
|
892 |
|
|
ehi->err_mask |= AC_ERR_HSM;
|
893 |
|
|
ehi->action |= ATA_EH_SOFTRESET;
|
894 |
|
|
ata_port_freeze(ap);
|
895 |
|
|
return 1;
|
896 |
|
|
}
|
897 |
|
|
}
|
898 |
|
|
return 0;
|
899 |
|
|
}
|
900 |
|
|
|
901 |
|
|
static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
|
902 |
|
|
{
|
903 |
|
|
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag);
|
904 |
|
|
|
905 |
|
|
/* freeze if hotplugged */
|
906 |
|
|
if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) {
|
907 |
|
|
ata_port_freeze(ap);
|
908 |
|
|
return 1;
|
909 |
|
|
}
|
910 |
|
|
|
911 |
|
|
/* bail out if not our interrupt */
|
912 |
|
|
if (!(irq_stat & NV_INT_DEV))
|
913 |
|
|
return 0;
|
914 |
|
|
|
915 |
|
|
/* DEV interrupt w/ no active qc? */
|
916 |
|
|
if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) {
|
917 |
|
|
ata_check_status(ap);
|
918 |
|
|
return 1;
|
919 |
|
|
}
|
920 |
|
|
|
921 |
|
|
/* handle interrupt */
|
922 |
|
|
return ata_host_intr(ap, qc);
|
923 |
|
|
}
|
924 |
|
|
|
925 |
|
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
926 |
|
|
{
|
927 |
|
|
struct ata_host *host = dev_instance;
|
928 |
|
|
int i, handled = 0;
|
929 |
|
|
u32 notifier_clears[2];
|
930 |
|
|
|
931 |
|
|
spin_lock(&host->lock);
|
932 |
|
|
|
933 |
|
|
for (i = 0; i < host->n_ports; i++) {
|
934 |
|
|
struct ata_port *ap = host->ports[i];
|
935 |
|
|
notifier_clears[i] = 0;
|
936 |
|
|
|
937 |
|
|
if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
|
938 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
939 |
|
|
void __iomem *mmio = pp->ctl_block;
|
940 |
|
|
u16 status;
|
941 |
|
|
u32 gen_ctl;
|
942 |
|
|
u32 notifier, notifier_error;
|
943 |
|
|
|
944 |
|
|
/* if ADMA is disabled, use standard ata interrupt handler */
|
945 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) {
|
946 |
|
|
u8 irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804)
|
947 |
|
|
>> (NV_INT_PORT_SHIFT * i);
|
948 |
|
|
handled += nv_host_intr(ap, irq_stat);
|
949 |
|
|
continue;
|
950 |
|
|
}
|
951 |
|
|
|
952 |
|
|
/* if in ATA register mode, check for standard interrupts */
|
953 |
|
|
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) {
|
954 |
|
|
u8 irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804)
|
955 |
|
|
>> (NV_INT_PORT_SHIFT * i);
|
956 |
|
|
if (ata_tag_valid(ap->link.active_tag))
|
957 |
|
|
/** NV_INT_DEV indication seems unreliable at times
|
958 |
|
|
at least in ADMA mode. Force it on always when a
|
959 |
|
|
command is active, to prevent losing interrupts. */
|
960 |
|
|
irq_stat |= NV_INT_DEV;
|
961 |
|
|
handled += nv_host_intr(ap, irq_stat);
|
962 |
|
|
}
|
963 |
|
|
|
964 |
|
|
notifier = readl(mmio + NV_ADMA_NOTIFIER);
|
965 |
|
|
notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
|
966 |
|
|
notifier_clears[i] = notifier | notifier_error;
|
967 |
|
|
|
968 |
|
|
gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL);
|
969 |
|
|
|
970 |
|
|
if (!NV_ADMA_CHECK_INTR(gen_ctl, ap->port_no) && !notifier &&
|
971 |
|
|
!notifier_error)
|
972 |
|
|
/* Nothing to do */
|
973 |
|
|
continue;
|
974 |
|
|
|
975 |
|
|
status = readw(mmio + NV_ADMA_STAT);
|
976 |
|
|
|
977 |
|
|
/* Clear status. Ensure the controller sees the clearing before we start
|
978 |
|
|
looking at any of the CPB statuses, so that any CPB completions after
|
979 |
|
|
this point in the handler will raise another interrupt. */
|
980 |
|
|
writew(status, mmio + NV_ADMA_STAT);
|
981 |
|
|
readw(mmio + NV_ADMA_STAT); /* flush posted write */
|
982 |
|
|
rmb();
|
983 |
|
|
|
984 |
|
|
handled++; /* irq handled if we got here */
|
985 |
|
|
|
986 |
|
|
/* freeze if hotplugged or controller error */
|
987 |
|
|
if (unlikely(status & (NV_ADMA_STAT_HOTPLUG |
|
988 |
|
|
NV_ADMA_STAT_HOTUNPLUG |
|
989 |
|
|
NV_ADMA_STAT_TIMEOUT |
|
990 |
|
|
NV_ADMA_STAT_SERROR))) {
|
991 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
992 |
|
|
|
993 |
|
|
ata_ehi_clear_desc(ehi);
|
994 |
|
|
__ata_ehi_push_desc(ehi, "ADMA status 0x%08x: ", status);
|
995 |
|
|
if (status & NV_ADMA_STAT_TIMEOUT) {
|
996 |
|
|
ehi->err_mask |= AC_ERR_SYSTEM;
|
997 |
|
|
ata_ehi_push_desc(ehi, "timeout");
|
998 |
|
|
} else if (status & NV_ADMA_STAT_HOTPLUG) {
|
999 |
|
|
ata_ehi_hotplugged(ehi);
|
1000 |
|
|
ata_ehi_push_desc(ehi, "hotplug");
|
1001 |
|
|
} else if (status & NV_ADMA_STAT_HOTUNPLUG) {
|
1002 |
|
|
ata_ehi_hotplugged(ehi);
|
1003 |
|
|
ata_ehi_push_desc(ehi, "hot unplug");
|
1004 |
|
|
} else if (status & NV_ADMA_STAT_SERROR) {
|
1005 |
|
|
/* let libata analyze SError and figure out the cause */
|
1006 |
|
|
ata_ehi_push_desc(ehi, "SError");
|
1007 |
|
|
} else
|
1008 |
|
|
ata_ehi_push_desc(ehi, "unknown");
|
1009 |
|
|
ata_port_freeze(ap);
|
1010 |
|
|
continue;
|
1011 |
|
|
}
|
1012 |
|
|
|
1013 |
|
|
if (status & (NV_ADMA_STAT_DONE |
|
1014 |
|
|
NV_ADMA_STAT_CPBERR)) {
|
1015 |
|
|
u32 check_commands;
|
1016 |
|
|
int pos, error = 0;
|
1017 |
|
|
|
1018 |
|
|
if (ata_tag_valid(ap->link.active_tag))
|
1019 |
|
|
check_commands = 1 << ap->link.active_tag;
|
1020 |
|
|
else
|
1021 |
|
|
check_commands = ap->link.sactive;
|
1022 |
|
|
|
1023 |
|
|
/** Check CPBs for completed commands */
|
1024 |
|
|
while ((pos = ffs(check_commands)) && !error) {
|
1025 |
|
|
pos--;
|
1026 |
|
|
error = nv_adma_check_cpb(ap, pos,
|
1027 |
|
|
notifier_error & (1 << pos));
|
1028 |
|
|
check_commands &= ~(1 << pos);
|
1029 |
|
|
}
|
1030 |
|
|
}
|
1031 |
|
|
}
|
1032 |
|
|
}
|
1033 |
|
|
|
1034 |
|
|
if (notifier_clears[0] || notifier_clears[1]) {
|
1035 |
|
|
/* Note: Both notifier clear registers must be written
|
1036 |
|
|
if either is set, even if one is zero, according to NVIDIA. */
|
1037 |
|
|
struct nv_adma_port_priv *pp = host->ports[0]->private_data;
|
1038 |
|
|
writel(notifier_clears[0], pp->notifier_clear_block);
|
1039 |
|
|
pp = host->ports[1]->private_data;
|
1040 |
|
|
writel(notifier_clears[1], pp->notifier_clear_block);
|
1041 |
|
|
}
|
1042 |
|
|
|
1043 |
|
|
spin_unlock(&host->lock);
|
1044 |
|
|
|
1045 |
|
|
return IRQ_RETVAL(handled);
|
1046 |
|
|
}
|
1047 |
|
|
|
1048 |
|
|
static void nv_adma_freeze(struct ata_port *ap)
|
1049 |
|
|
{
|
1050 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1051 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1052 |
|
|
u16 tmp;
|
1053 |
|
|
|
1054 |
|
|
nv_ck804_freeze(ap);
|
1055 |
|
|
|
1056 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
|
1057 |
|
|
return;
|
1058 |
|
|
|
1059 |
|
|
/* clear any outstanding CK804 notifications */
|
1060 |
|
|
writeb(NV_INT_ALL << (ap->port_no * NV_INT_PORT_SHIFT),
|
1061 |
|
|
ap->host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804);
|
1062 |
|
|
|
1063 |
|
|
/* Disable interrupt */
|
1064 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1065 |
|
|
writew(tmp & ~(NV_ADMA_CTL_AIEN | NV_ADMA_CTL_HOTPLUG_IEN),
|
1066 |
|
|
mmio + NV_ADMA_CTL);
|
1067 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1068 |
|
|
}
|
1069 |
|
|
|
1070 |
|
|
static void nv_adma_thaw(struct ata_port *ap)
|
1071 |
|
|
{
|
1072 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1073 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1074 |
|
|
u16 tmp;
|
1075 |
|
|
|
1076 |
|
|
nv_ck804_thaw(ap);
|
1077 |
|
|
|
1078 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
|
1079 |
|
|
return;
|
1080 |
|
|
|
1081 |
|
|
/* Enable interrupt */
|
1082 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1083 |
|
|
writew(tmp | (NV_ADMA_CTL_AIEN | NV_ADMA_CTL_HOTPLUG_IEN),
|
1084 |
|
|
mmio + NV_ADMA_CTL);
|
1085 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1086 |
|
|
}
|
1087 |
|
|
|
1088 |
|
|
static void nv_adma_irq_clear(struct ata_port *ap)
|
1089 |
|
|
{
|
1090 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1091 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1092 |
|
|
u32 notifier_clears[2];
|
1093 |
|
|
|
1094 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) {
|
1095 |
|
|
ata_bmdma_irq_clear(ap);
|
1096 |
|
|
return;
|
1097 |
|
|
}
|
1098 |
|
|
|
1099 |
|
|
/* clear any outstanding CK804 notifications */
|
1100 |
|
|
writeb(NV_INT_ALL << (ap->port_no * NV_INT_PORT_SHIFT),
|
1101 |
|
|
ap->host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804);
|
1102 |
|
|
|
1103 |
|
|
/* clear ADMA status */
|
1104 |
|
|
writew(0xffff, mmio + NV_ADMA_STAT);
|
1105 |
|
|
|
1106 |
|
|
/* clear notifiers - note both ports need to be written with
|
1107 |
|
|
something even though we are only clearing on one */
|
1108 |
|
|
if (ap->port_no == 0) {
|
1109 |
|
|
notifier_clears[0] = 0xFFFFFFFF;
|
1110 |
|
|
notifier_clears[1] = 0;
|
1111 |
|
|
} else {
|
1112 |
|
|
notifier_clears[0] = 0;
|
1113 |
|
|
notifier_clears[1] = 0xFFFFFFFF;
|
1114 |
|
|
}
|
1115 |
|
|
pp = ap->host->ports[0]->private_data;
|
1116 |
|
|
writel(notifier_clears[0], pp->notifier_clear_block);
|
1117 |
|
|
pp = ap->host->ports[1]->private_data;
|
1118 |
|
|
writel(notifier_clears[1], pp->notifier_clear_block);
|
1119 |
|
|
}
|
1120 |
|
|
|
1121 |
|
|
static void nv_adma_post_internal_cmd(struct ata_queued_cmd *qc)
|
1122 |
|
|
{
|
1123 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
1124 |
|
|
|
1125 |
|
|
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE)
|
1126 |
|
|
ata_bmdma_post_internal_cmd(qc);
|
1127 |
|
|
}
|
1128 |
|
|
|
1129 |
|
|
static int nv_adma_port_start(struct ata_port *ap)
|
1130 |
|
|
{
|
1131 |
|
|
struct device *dev = ap->host->dev;
|
1132 |
|
|
struct nv_adma_port_priv *pp;
|
1133 |
|
|
int rc;
|
1134 |
|
|
void *mem;
|
1135 |
|
|
dma_addr_t mem_dma;
|
1136 |
|
|
void __iomem *mmio;
|
1137 |
|
|
u16 tmp;
|
1138 |
|
|
|
1139 |
|
|
VPRINTK("ENTER\n");
|
1140 |
|
|
|
1141 |
|
|
rc = ata_port_start(ap);
|
1142 |
|
|
if (rc)
|
1143 |
|
|
return rc;
|
1144 |
|
|
|
1145 |
|
|
pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
|
1146 |
|
|
if (!pp)
|
1147 |
|
|
return -ENOMEM;
|
1148 |
|
|
|
1149 |
|
|
mmio = ap->host->iomap[NV_MMIO_BAR] + NV_ADMA_PORT +
|
1150 |
|
|
ap->port_no * NV_ADMA_PORT_SIZE;
|
1151 |
|
|
pp->ctl_block = mmio;
|
1152 |
|
|
pp->gen_block = ap->host->iomap[NV_MMIO_BAR] + NV_ADMA_GEN;
|
1153 |
|
|
pp->notifier_clear_block = pp->gen_block +
|
1154 |
|
|
NV_ADMA_NOTIFIER_CLEAR + (4 * ap->port_no);
|
1155 |
|
|
|
1156 |
|
|
mem = dmam_alloc_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ,
|
1157 |
|
|
&mem_dma, GFP_KERNEL);
|
1158 |
|
|
if (!mem)
|
1159 |
|
|
return -ENOMEM;
|
1160 |
|
|
memset(mem, 0, NV_ADMA_PORT_PRIV_DMA_SZ);
|
1161 |
|
|
|
1162 |
|
|
/*
|
1163 |
|
|
* First item in chunk of DMA memory:
|
1164 |
|
|
* 128-byte command parameter block (CPB)
|
1165 |
|
|
* one for each command tag
|
1166 |
|
|
*/
|
1167 |
|
|
pp->cpb = mem;
|
1168 |
|
|
pp->cpb_dma = mem_dma;
|
1169 |
|
|
|
1170 |
|
|
writel(mem_dma & 0xFFFFFFFF, mmio + NV_ADMA_CPB_BASE_LOW);
|
1171 |
|
|
writel((mem_dma >> 16) >> 16, mmio + NV_ADMA_CPB_BASE_HIGH);
|
1172 |
|
|
|
1173 |
|
|
mem += NV_ADMA_MAX_CPBS * NV_ADMA_CPB_SZ;
|
1174 |
|
|
mem_dma += NV_ADMA_MAX_CPBS * NV_ADMA_CPB_SZ;
|
1175 |
|
|
|
1176 |
|
|
/*
|
1177 |
|
|
* Second item: block of ADMA_SGTBL_LEN s/g entries
|
1178 |
|
|
*/
|
1179 |
|
|
pp->aprd = mem;
|
1180 |
|
|
pp->aprd_dma = mem_dma;
|
1181 |
|
|
|
1182 |
|
|
ap->private_data = pp;
|
1183 |
|
|
|
1184 |
|
|
/* clear any outstanding interrupt conditions */
|
1185 |
|
|
writew(0xffff, mmio + NV_ADMA_STAT);
|
1186 |
|
|
|
1187 |
|
|
/* initialize port variables */
|
1188 |
|
|
pp->flags = NV_ADMA_PORT_REGISTER_MODE;
|
1189 |
|
|
|
1190 |
|
|
/* clear CPB fetch count */
|
1191 |
|
|
writew(0, mmio + NV_ADMA_CPB_COUNT);
|
1192 |
|
|
|
1193 |
|
|
/* clear GO for register mode, enable interrupt */
|
1194 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1195 |
|
|
writew((tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN |
|
1196 |
|
|
NV_ADMA_CTL_HOTPLUG_IEN, mmio + NV_ADMA_CTL);
|
1197 |
|
|
|
1198 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1199 |
|
|
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1200 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1201 |
|
|
udelay(1);
|
1202 |
|
|
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1203 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1204 |
|
|
|
1205 |
|
|
return 0;
|
1206 |
|
|
}
|
1207 |
|
|
|
1208 |
|
|
static void nv_adma_port_stop(struct ata_port *ap)
|
1209 |
|
|
{
|
1210 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1211 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1212 |
|
|
|
1213 |
|
|
VPRINTK("ENTER\n");
|
1214 |
|
|
writew(0, mmio + NV_ADMA_CTL);
|
1215 |
|
|
}
|
1216 |
|
|
|
1217 |
|
|
#ifdef CONFIG_PM
|
1218 |
|
|
static int nv_adma_port_suspend(struct ata_port *ap, pm_message_t mesg)
|
1219 |
|
|
{
|
1220 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1221 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1222 |
|
|
|
1223 |
|
|
/* Go to register mode - clears GO */
|
1224 |
|
|
nv_adma_register_mode(ap);
|
1225 |
|
|
|
1226 |
|
|
/* clear CPB fetch count */
|
1227 |
|
|
writew(0, mmio + NV_ADMA_CPB_COUNT);
|
1228 |
|
|
|
1229 |
|
|
/* disable interrupt, shut down port */
|
1230 |
|
|
writew(0, mmio + NV_ADMA_CTL);
|
1231 |
|
|
|
1232 |
|
|
return 0;
|
1233 |
|
|
}
|
1234 |
|
|
|
1235 |
|
|
static int nv_adma_port_resume(struct ata_port *ap)
|
1236 |
|
|
{
|
1237 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1238 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1239 |
|
|
u16 tmp;
|
1240 |
|
|
|
1241 |
|
|
/* set CPB block location */
|
1242 |
|
|
writel(pp->cpb_dma & 0xFFFFFFFF, mmio + NV_ADMA_CPB_BASE_LOW);
|
1243 |
|
|
writel((pp->cpb_dma >> 16) >> 16, mmio + NV_ADMA_CPB_BASE_HIGH);
|
1244 |
|
|
|
1245 |
|
|
/* clear any outstanding interrupt conditions */
|
1246 |
|
|
writew(0xffff, mmio + NV_ADMA_STAT);
|
1247 |
|
|
|
1248 |
|
|
/* initialize port variables */
|
1249 |
|
|
pp->flags |= NV_ADMA_PORT_REGISTER_MODE;
|
1250 |
|
|
|
1251 |
|
|
/* clear CPB fetch count */
|
1252 |
|
|
writew(0, mmio + NV_ADMA_CPB_COUNT);
|
1253 |
|
|
|
1254 |
|
|
/* clear GO for register mode, enable interrupt */
|
1255 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1256 |
|
|
writew((tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN |
|
1257 |
|
|
NV_ADMA_CTL_HOTPLUG_IEN, mmio + NV_ADMA_CTL);
|
1258 |
|
|
|
1259 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1260 |
|
|
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1261 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1262 |
|
|
udelay(1);
|
1263 |
|
|
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1264 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1265 |
|
|
|
1266 |
|
|
return 0;
|
1267 |
|
|
}
|
1268 |
|
|
#endif
|
1269 |
|
|
|
1270 |
|
|
static void nv_adma_setup_port(struct ata_port *ap)
|
1271 |
|
|
{
|
1272 |
|
|
void __iomem *mmio = ap->host->iomap[NV_MMIO_BAR];
|
1273 |
|
|
struct ata_ioports *ioport = &ap->ioaddr;
|
1274 |
|
|
|
1275 |
|
|
VPRINTK("ENTER\n");
|
1276 |
|
|
|
1277 |
|
|
mmio += NV_ADMA_PORT + ap->port_no * NV_ADMA_PORT_SIZE;
|
1278 |
|
|
|
1279 |
|
|
ioport->cmd_addr = mmio;
|
1280 |
|
|
ioport->data_addr = mmio + (ATA_REG_DATA * 4);
|
1281 |
|
|
ioport->error_addr =
|
1282 |
|
|
ioport->feature_addr = mmio + (ATA_REG_ERR * 4);
|
1283 |
|
|
ioport->nsect_addr = mmio + (ATA_REG_NSECT * 4);
|
1284 |
|
|
ioport->lbal_addr = mmio + (ATA_REG_LBAL * 4);
|
1285 |
|
|
ioport->lbam_addr = mmio + (ATA_REG_LBAM * 4);
|
1286 |
|
|
ioport->lbah_addr = mmio + (ATA_REG_LBAH * 4);
|
1287 |
|
|
ioport->device_addr = mmio + (ATA_REG_DEVICE * 4);
|
1288 |
|
|
ioport->status_addr =
|
1289 |
|
|
ioport->command_addr = mmio + (ATA_REG_STATUS * 4);
|
1290 |
|
|
ioport->altstatus_addr =
|
1291 |
|
|
ioport->ctl_addr = mmio + 0x20;
|
1292 |
|
|
}
|
1293 |
|
|
|
1294 |
|
|
static int nv_adma_host_init(struct ata_host *host)
|
1295 |
|
|
{
|
1296 |
|
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
1297 |
|
|
unsigned int i;
|
1298 |
|
|
u32 tmp32;
|
1299 |
|
|
|
1300 |
|
|
VPRINTK("ENTER\n");
|
1301 |
|
|
|
1302 |
|
|
/* enable ADMA on the ports */
|
1303 |
|
|
pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &tmp32);
|
1304 |
|
|
tmp32 |= NV_MCP_SATA_CFG_20_PORT0_EN |
|
1305 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN |
|
1306 |
|
|
NV_MCP_SATA_CFG_20_PORT1_EN |
|
1307 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN;
|
1308 |
|
|
|
1309 |
|
|
pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, tmp32);
|
1310 |
|
|
|
1311 |
|
|
for (i = 0; i < host->n_ports; i++)
|
1312 |
|
|
nv_adma_setup_port(host->ports[i]);
|
1313 |
|
|
|
1314 |
|
|
return 0;
|
1315 |
|
|
}
|
1316 |
|
|
|
1317 |
|
|
static void nv_adma_fill_aprd(struct ata_queued_cmd *qc,
|
1318 |
|
|
struct scatterlist *sg,
|
1319 |
|
|
int idx,
|
1320 |
|
|
struct nv_adma_prd *aprd)
|
1321 |
|
|
{
|
1322 |
|
|
u8 flags = 0;
|
1323 |
|
|
if (qc->tf.flags & ATA_TFLAG_WRITE)
|
1324 |
|
|
flags |= NV_APRD_WRITE;
|
1325 |
|
|
if (idx == qc->n_elem - 1)
|
1326 |
|
|
flags |= NV_APRD_END;
|
1327 |
|
|
else if (idx != 4)
|
1328 |
|
|
flags |= NV_APRD_CONT;
|
1329 |
|
|
|
1330 |
|
|
aprd->addr = cpu_to_le64(((u64)sg_dma_address(sg)));
|
1331 |
|
|
aprd->len = cpu_to_le32(((u32)sg_dma_len(sg))); /* len in bytes */
|
1332 |
|
|
aprd->flags = flags;
|
1333 |
|
|
aprd->packet_len = 0;
|
1334 |
|
|
}
|
1335 |
|
|
|
1336 |
|
|
static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb)
|
1337 |
|
|
{
|
1338 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
1339 |
|
|
unsigned int idx;
|
1340 |
|
|
struct nv_adma_prd *aprd;
|
1341 |
|
|
struct scatterlist *sg;
|
1342 |
|
|
|
1343 |
|
|
VPRINTK("ENTER\n");
|
1344 |
|
|
|
1345 |
|
|
idx = 0;
|
1346 |
|
|
|
1347 |
|
|
ata_for_each_sg(sg, qc) {
|
1348 |
|
|
aprd = (idx < 5) ? &cpb->aprd[idx] :
|
1349 |
|
|
&pp->aprd[NV_ADMA_SGTBL_LEN * qc->tag + (idx-5)];
|
1350 |
|
|
nv_adma_fill_aprd(qc, sg, idx, aprd);
|
1351 |
|
|
idx++;
|
1352 |
|
|
}
|
1353 |
|
|
if (idx > 5)
|
1354 |
|
|
cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag)));
|
1355 |
|
|
else
|
1356 |
|
|
cpb->next_aprd = cpu_to_le64(0);
|
1357 |
|
|
}
|
1358 |
|
|
|
1359 |
|
|
static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
|
1360 |
|
|
{
|
1361 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
1362 |
|
|
|
1363 |
|
|
/* ADMA engine can only be used for non-ATAPI DMA commands,
|
1364 |
|
|
or interrupt-driven no-data commands. */
|
1365 |
|
|
if ((pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) ||
|
1366 |
|
|
(qc->tf.flags & ATA_TFLAG_POLLING))
|
1367 |
|
|
return 1;
|
1368 |
|
|
|
1369 |
|
|
if ((qc->flags & ATA_QCFLAG_DMAMAP) ||
|
1370 |
|
|
(qc->tf.protocol == ATA_PROT_NODATA))
|
1371 |
|
|
return 0;
|
1372 |
|
|
|
1373 |
|
|
return 1;
|
1374 |
|
|
}
|
1375 |
|
|
|
1376 |
|
|
static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
1377 |
|
|
{
|
1378 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
1379 |
|
|
struct nv_adma_cpb *cpb = &pp->cpb[qc->tag];
|
1380 |
|
|
u8 ctl_flags = NV_CPB_CTL_CPB_VALID |
|
1381 |
|
|
NV_CPB_CTL_IEN;
|
1382 |
|
|
|
1383 |
|
|
if (nv_adma_use_reg_mode(qc)) {
|
1384 |
|
|
BUG_ON(!(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) &&
|
1385 |
|
|
(qc->flags & ATA_QCFLAG_DMAMAP));
|
1386 |
|
|
nv_adma_register_mode(qc->ap);
|
1387 |
|
|
ata_qc_prep(qc);
|
1388 |
|
|
return;
|
1389 |
|
|
}
|
1390 |
|
|
|
1391 |
|
|
cpb->resp_flags = NV_CPB_RESP_DONE;
|
1392 |
|
|
wmb();
|
1393 |
|
|
cpb->ctl_flags = 0;
|
1394 |
|
|
wmb();
|
1395 |
|
|
|
1396 |
|
|
cpb->len = 3;
|
1397 |
|
|
cpb->tag = qc->tag;
|
1398 |
|
|
cpb->next_cpb_idx = 0;
|
1399 |
|
|
|
1400 |
|
|
/* turn on NCQ flags for NCQ commands */
|
1401 |
|
|
if (qc->tf.protocol == ATA_PROT_NCQ)
|
1402 |
|
|
ctl_flags |= NV_CPB_CTL_QUEUE | NV_CPB_CTL_FPDMA;
|
1403 |
|
|
|
1404 |
|
|
VPRINTK("qc->flags = 0x%lx\n", qc->flags);
|
1405 |
|
|
|
1406 |
|
|
nv_adma_tf_to_cpb(&qc->tf, cpb->tf);
|
1407 |
|
|
|
1408 |
|
|
if (qc->flags & ATA_QCFLAG_DMAMAP) {
|
1409 |
|
|
nv_adma_fill_sg(qc, cpb);
|
1410 |
|
|
ctl_flags |= NV_CPB_CTL_APRD_VALID;
|
1411 |
|
|
} else
|
1412 |
|
|
memset(&cpb->aprd[0], 0, sizeof(struct nv_adma_prd) * 5);
|
1413 |
|
|
|
1414 |
|
|
/* Be paranoid and don't let the device see NV_CPB_CTL_CPB_VALID
|
1415 |
|
|
until we are finished filling in all of the contents */
|
1416 |
|
|
wmb();
|
1417 |
|
|
cpb->ctl_flags = ctl_flags;
|
1418 |
|
|
wmb();
|
1419 |
|
|
cpb->resp_flags = 0;
|
1420 |
|
|
}
|
1421 |
|
|
|
1422 |
|
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
1423 |
|
|
{
|
1424 |
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
1425 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1426 |
|
|
int curr_ncq = (qc->tf.protocol == ATA_PROT_NCQ);
|
1427 |
|
|
|
1428 |
|
|
VPRINTK("ENTER\n");
|
1429 |
|
|
|
1430 |
|
|
/* We can't handle result taskfile with NCQ commands, since
|
1431 |
|
|
retrieving the taskfile switches us out of ADMA mode and would abort
|
1432 |
|
|
existing commands. */
|
1433 |
|
|
if (unlikely(qc->tf.protocol == ATA_PROT_NCQ &&
|
1434 |
|
|
(qc->flags & ATA_QCFLAG_RESULT_TF))) {
|
1435 |
|
|
ata_dev_printk(qc->dev, KERN_ERR,
|
1436 |
|
|
"NCQ w/ RESULT_TF not allowed\n");
|
1437 |
|
|
return AC_ERR_SYSTEM;
|
1438 |
|
|
}
|
1439 |
|
|
|
1440 |
|
|
if (nv_adma_use_reg_mode(qc)) {
|
1441 |
|
|
/* use ATA register mode */
|
1442 |
|
|
VPRINTK("using ATA register mode: 0x%lx\n", qc->flags);
|
1443 |
|
|
BUG_ON(!(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) &&
|
1444 |
|
|
(qc->flags & ATA_QCFLAG_DMAMAP));
|
1445 |
|
|
nv_adma_register_mode(qc->ap);
|
1446 |
|
|
return ata_qc_issue_prot(qc);
|
1447 |
|
|
} else
|
1448 |
|
|
nv_adma_mode(qc->ap);
|
1449 |
|
|
|
1450 |
|
|
/* write append register, command tag in lower 8 bits
|
1451 |
|
|
and (number of cpbs to append -1) in top 8 bits */
|
1452 |
|
|
wmb();
|
1453 |
|
|
|
1454 |
|
|
if (curr_ncq != pp->last_issue_ncq) {
|
1455 |
|
|
/* Seems to need some delay before switching between NCQ and
|
1456 |
|
|
non-NCQ commands, else we get command timeouts and such. */
|
1457 |
|
|
udelay(20);
|
1458 |
|
|
pp->last_issue_ncq = curr_ncq;
|
1459 |
|
|
}
|
1460 |
|
|
|
1461 |
|
|
writew(qc->tag, mmio + NV_ADMA_APPEND);
|
1462 |
|
|
|
1463 |
|
|
DPRINTK("Issued tag %u\n", qc->tag);
|
1464 |
|
|
|
1465 |
|
|
return 0;
|
1466 |
|
|
}
|
1467 |
|
|
|
1468 |
|
|
static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance)
|
1469 |
|
|
{
|
1470 |
|
|
struct ata_host *host = dev_instance;
|
1471 |
|
|
unsigned int i;
|
1472 |
|
|
unsigned int handled = 0;
|
1473 |
|
|
unsigned long flags;
|
1474 |
|
|
|
1475 |
|
|
spin_lock_irqsave(&host->lock, flags);
|
1476 |
|
|
|
1477 |
|
|
for (i = 0; i < host->n_ports; i++) {
|
1478 |
|
|
struct ata_port *ap;
|
1479 |
|
|
|
1480 |
|
|
ap = host->ports[i];
|
1481 |
|
|
if (ap &&
|
1482 |
|
|
!(ap->flags & ATA_FLAG_DISABLED)) {
|
1483 |
|
|
struct ata_queued_cmd *qc;
|
1484 |
|
|
|
1485 |
|
|
qc = ata_qc_from_tag(ap, ap->link.active_tag);
|
1486 |
|
|
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
|
1487 |
|
|
handled += ata_host_intr(ap, qc);
|
1488 |
|
|
else
|
1489 |
|
|
// No request pending? Clear interrupt status
|
1490 |
|
|
// anyway, in case there's one pending.
|
1491 |
|
|
ap->ops->check_status(ap);
|
1492 |
|
|
}
|
1493 |
|
|
|
1494 |
|
|
}
|
1495 |
|
|
|
1496 |
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
1497 |
|
|
|
1498 |
|
|
return IRQ_RETVAL(handled);
|
1499 |
|
|
}
|
1500 |
|
|
|
1501 |
|
|
static irqreturn_t nv_do_interrupt(struct ata_host *host, u8 irq_stat)
|
1502 |
|
|
{
|
1503 |
|
|
int i, handled = 0;
|
1504 |
|
|
|
1505 |
|
|
for (i = 0; i < host->n_ports; i++) {
|
1506 |
|
|
struct ata_port *ap = host->ports[i];
|
1507 |
|
|
|
1508 |
|
|
if (ap && !(ap->flags & ATA_FLAG_DISABLED))
|
1509 |
|
|
handled += nv_host_intr(ap, irq_stat);
|
1510 |
|
|
|
1511 |
|
|
irq_stat >>= NV_INT_PORT_SHIFT;
|
1512 |
|
|
}
|
1513 |
|
|
|
1514 |
|
|
return IRQ_RETVAL(handled);
|
1515 |
|
|
}
|
1516 |
|
|
|
1517 |
|
|
static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance)
|
1518 |
|
|
{
|
1519 |
|
|
struct ata_host *host = dev_instance;
|
1520 |
|
|
u8 irq_stat;
|
1521 |
|
|
irqreturn_t ret;
|
1522 |
|
|
|
1523 |
|
|
spin_lock(&host->lock);
|
1524 |
|
|
irq_stat = ioread8(host->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
|
1525 |
|
|
ret = nv_do_interrupt(host, irq_stat);
|
1526 |
|
|
spin_unlock(&host->lock);
|
1527 |
|
|
|
1528 |
|
|
return ret;
|
1529 |
|
|
}
|
1530 |
|
|
|
1531 |
|
|
static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance)
|
1532 |
|
|
{
|
1533 |
|
|
struct ata_host *host = dev_instance;
|
1534 |
|
|
u8 irq_stat;
|
1535 |
|
|
irqreturn_t ret;
|
1536 |
|
|
|
1537 |
|
|
spin_lock(&host->lock);
|
1538 |
|
|
irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804);
|
1539 |
|
|
ret = nv_do_interrupt(host, irq_stat);
|
1540 |
|
|
spin_unlock(&host->lock);
|
1541 |
|
|
|
1542 |
|
|
return ret;
|
1543 |
|
|
}
|
1544 |
|
|
|
1545 |
|
|
static int nv_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
|
1546 |
|
|
{
|
1547 |
|
|
if (sc_reg > SCR_CONTROL)
|
1548 |
|
|
return -EINVAL;
|
1549 |
|
|
|
1550 |
|
|
*val = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4));
|
1551 |
|
|
return 0;
|
1552 |
|
|
}
|
1553 |
|
|
|
1554 |
|
|
static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
|
1555 |
|
|
{
|
1556 |
|
|
if (sc_reg > SCR_CONTROL)
|
1557 |
|
|
return -EINVAL;
|
1558 |
|
|
|
1559 |
|
|
iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4));
|
1560 |
|
|
return 0;
|
1561 |
|
|
}
|
1562 |
|
|
|
1563 |
|
|
static void nv_nf2_freeze(struct ata_port *ap)
|
1564 |
|
|
{
|
1565 |
|
|
void __iomem *scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
|
1566 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT;
|
1567 |
|
|
u8 mask;
|
1568 |
|
|
|
1569 |
|
|
mask = ioread8(scr_addr + NV_INT_ENABLE);
|
1570 |
|
|
mask &= ~(NV_INT_ALL << shift);
|
1571 |
|
|
iowrite8(mask, scr_addr + NV_INT_ENABLE);
|
1572 |
|
|
}
|
1573 |
|
|
|
1574 |
|
|
static void nv_nf2_thaw(struct ata_port *ap)
|
1575 |
|
|
{
|
1576 |
|
|
void __iomem *scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
|
1577 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT;
|
1578 |
|
|
u8 mask;
|
1579 |
|
|
|
1580 |
|
|
iowrite8(NV_INT_ALL << shift, scr_addr + NV_INT_STATUS);
|
1581 |
|
|
|
1582 |
|
|
mask = ioread8(scr_addr + NV_INT_ENABLE);
|
1583 |
|
|
mask |= (NV_INT_MASK << shift);
|
1584 |
|
|
iowrite8(mask, scr_addr + NV_INT_ENABLE);
|
1585 |
|
|
}
|
1586 |
|
|
|
1587 |
|
|
static void nv_ck804_freeze(struct ata_port *ap)
|
1588 |
|
|
{
|
1589 |
|
|
void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
|
1590 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT;
|
1591 |
|
|
u8 mask;
|
1592 |
|
|
|
1593 |
|
|
mask = readb(mmio_base + NV_INT_ENABLE_CK804);
|
1594 |
|
|
mask &= ~(NV_INT_ALL << shift);
|
1595 |
|
|
writeb(mask, mmio_base + NV_INT_ENABLE_CK804);
|
1596 |
|
|
}
|
1597 |
|
|
|
1598 |
|
|
static void nv_ck804_thaw(struct ata_port *ap)
|
1599 |
|
|
{
|
1600 |
|
|
void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
|
1601 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT;
|
1602 |
|
|
u8 mask;
|
1603 |
|
|
|
1604 |
|
|
writeb(NV_INT_ALL << shift, mmio_base + NV_INT_STATUS_CK804);
|
1605 |
|
|
|
1606 |
|
|
mask = readb(mmio_base + NV_INT_ENABLE_CK804);
|
1607 |
|
|
mask |= (NV_INT_MASK << shift);
|
1608 |
|
|
writeb(mask, mmio_base + NV_INT_ENABLE_CK804);
|
1609 |
|
|
}
|
1610 |
|
|
|
1611 |
|
|
static void nv_mcp55_freeze(struct ata_port *ap)
|
1612 |
|
|
{
|
1613 |
|
|
void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
|
1614 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT_MCP55;
|
1615 |
|
|
u32 mask;
|
1616 |
|
|
|
1617 |
|
|
writel(NV_INT_ALL_MCP55 << shift, mmio_base + NV_INT_STATUS_MCP55);
|
1618 |
|
|
|
1619 |
|
|
mask = readl(mmio_base + NV_INT_ENABLE_MCP55);
|
1620 |
|
|
mask &= ~(NV_INT_ALL_MCP55 << shift);
|
1621 |
|
|
writel(mask, mmio_base + NV_INT_ENABLE_MCP55);
|
1622 |
|
|
ata_bmdma_freeze(ap);
|
1623 |
|
|
}
|
1624 |
|
|
|
1625 |
|
|
static void nv_mcp55_thaw(struct ata_port *ap)
|
1626 |
|
|
{
|
1627 |
|
|
void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
|
1628 |
|
|
int shift = ap->port_no * NV_INT_PORT_SHIFT_MCP55;
|
1629 |
|
|
u32 mask;
|
1630 |
|
|
|
1631 |
|
|
writel(NV_INT_ALL_MCP55 << shift, mmio_base + NV_INT_STATUS_MCP55);
|
1632 |
|
|
|
1633 |
|
|
mask = readl(mmio_base + NV_INT_ENABLE_MCP55);
|
1634 |
|
|
mask |= (NV_INT_MASK_MCP55 << shift);
|
1635 |
|
|
writel(mask, mmio_base + NV_INT_ENABLE_MCP55);
|
1636 |
|
|
ata_bmdma_thaw(ap);
|
1637 |
|
|
}
|
1638 |
|
|
|
1639 |
|
|
static int nv_hardreset(struct ata_link *link, unsigned int *class,
|
1640 |
|
|
unsigned long deadline)
|
1641 |
|
|
{
|
1642 |
|
|
unsigned int dummy;
|
1643 |
|
|
|
1644 |
|
|
/* SATA hardreset fails to retrieve proper device signature on
|
1645 |
|
|
* some controllers. Don't classify on hardreset. For more
|
1646 |
|
|
* info, see http://bugzilla.kernel.org/show_bug.cgi?id=3352
|
1647 |
|
|
*/
|
1648 |
|
|
return sata_std_hardreset(link, &dummy, deadline);
|
1649 |
|
|
}
|
1650 |
|
|
|
1651 |
|
|
static void nv_error_handler(struct ata_port *ap)
|
1652 |
|
|
{
|
1653 |
|
|
ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset,
|
1654 |
|
|
nv_hardreset, ata_std_postreset);
|
1655 |
|
|
}
|
1656 |
|
|
|
1657 |
|
|
static void nv_adma_error_handler(struct ata_port *ap)
|
1658 |
|
|
{
|
1659 |
|
|
struct nv_adma_port_priv *pp = ap->private_data;
|
1660 |
|
|
if (!(pp->flags & NV_ADMA_PORT_REGISTER_MODE)) {
|
1661 |
|
|
void __iomem *mmio = pp->ctl_block;
|
1662 |
|
|
int i;
|
1663 |
|
|
u16 tmp;
|
1664 |
|
|
|
1665 |
|
|
if (ata_tag_valid(ap->link.active_tag) || ap->link.sactive) {
|
1666 |
|
|
u32 notifier = readl(mmio + NV_ADMA_NOTIFIER);
|
1667 |
|
|
u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
|
1668 |
|
|
u32 gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL);
|
1669 |
|
|
u32 status = readw(mmio + NV_ADMA_STAT);
|
1670 |
|
|
u8 cpb_count = readb(mmio + NV_ADMA_CPB_COUNT);
|
1671 |
|
|
u8 next_cpb_idx = readb(mmio + NV_ADMA_NEXT_CPB_IDX);
|
1672 |
|
|
|
1673 |
|
|
ata_port_printk(ap, KERN_ERR,
|
1674 |
|
|
"EH in ADMA mode, notifier 0x%X "
|
1675 |
|
|
"notifier_error 0x%X gen_ctl 0x%X status 0x%X "
|
1676 |
|
|
"next cpb count 0x%X next cpb idx 0x%x\n",
|
1677 |
|
|
notifier, notifier_error, gen_ctl, status,
|
1678 |
|
|
cpb_count, next_cpb_idx);
|
1679 |
|
|
|
1680 |
|
|
for (i = 0; i < NV_ADMA_MAX_CPBS; i++) {
|
1681 |
|
|
struct nv_adma_cpb *cpb = &pp->cpb[i];
|
1682 |
|
|
if ((ata_tag_valid(ap->link.active_tag) && i == ap->link.active_tag) ||
|
1683 |
|
|
ap->link.sactive & (1 << i))
|
1684 |
|
|
ata_port_printk(ap, KERN_ERR,
|
1685 |
|
|
"CPB %d: ctl_flags 0x%x, resp_flags 0x%x\n",
|
1686 |
|
|
i, cpb->ctl_flags, cpb->resp_flags);
|
1687 |
|
|
}
|
1688 |
|
|
}
|
1689 |
|
|
|
1690 |
|
|
/* Push us back into port register mode for error handling. */
|
1691 |
|
|
nv_adma_register_mode(ap);
|
1692 |
|
|
|
1693 |
|
|
/* Mark all of the CPBs as invalid to prevent them from
|
1694 |
|
|
being executed */
|
1695 |
|
|
for (i = 0; i < NV_ADMA_MAX_CPBS; i++)
|
1696 |
|
|
pp->cpb[i].ctl_flags &= ~NV_CPB_CTL_CPB_VALID;
|
1697 |
|
|
|
1698 |
|
|
/* clear CPB fetch count */
|
1699 |
|
|
writew(0, mmio + NV_ADMA_CPB_COUNT);
|
1700 |
|
|
|
1701 |
|
|
/* Reset channel */
|
1702 |
|
|
tmp = readw(mmio + NV_ADMA_CTL);
|
1703 |
|
|
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1704 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1705 |
|
|
udelay(1);
|
1706 |
|
|
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
|
1707 |
|
|
readw(mmio + NV_ADMA_CTL); /* flush posted write */
|
1708 |
|
|
}
|
1709 |
|
|
|
1710 |
|
|
ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset,
|
1711 |
|
|
nv_hardreset, ata_std_postreset);
|
1712 |
|
|
}
|
1713 |
|
|
|
1714 |
|
|
static void nv_swncq_qc_to_dq(struct ata_port *ap, struct ata_queued_cmd *qc)
|
1715 |
|
|
{
|
1716 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1717 |
|
|
struct defer_queue *dq = &pp->defer_queue;
|
1718 |
|
|
|
1719 |
|
|
/* queue is full */
|
1720 |
|
|
WARN_ON(dq->tail - dq->head == ATA_MAX_QUEUE);
|
1721 |
|
|
dq->defer_bits |= (1 << qc->tag);
|
1722 |
|
|
dq->tag[dq->tail++ & (ATA_MAX_QUEUE - 1)] = qc->tag;
|
1723 |
|
|
}
|
1724 |
|
|
|
1725 |
|
|
static struct ata_queued_cmd *nv_swncq_qc_from_dq(struct ata_port *ap)
|
1726 |
|
|
{
|
1727 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1728 |
|
|
struct defer_queue *dq = &pp->defer_queue;
|
1729 |
|
|
unsigned int tag;
|
1730 |
|
|
|
1731 |
|
|
if (dq->head == dq->tail) /* null queue */
|
1732 |
|
|
return NULL;
|
1733 |
|
|
|
1734 |
|
|
tag = dq->tag[dq->head & (ATA_MAX_QUEUE - 1)];
|
1735 |
|
|
dq->tag[dq->head++ & (ATA_MAX_QUEUE - 1)] = ATA_TAG_POISON;
|
1736 |
|
|
WARN_ON(!(dq->defer_bits & (1 << tag)));
|
1737 |
|
|
dq->defer_bits &= ~(1 << tag);
|
1738 |
|
|
|
1739 |
|
|
return ata_qc_from_tag(ap, tag);
|
1740 |
|
|
}
|
1741 |
|
|
|
1742 |
|
|
static void nv_swncq_fis_reinit(struct ata_port *ap)
|
1743 |
|
|
{
|
1744 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1745 |
|
|
|
1746 |
|
|
pp->dhfis_bits = 0;
|
1747 |
|
|
pp->dmafis_bits = 0;
|
1748 |
|
|
pp->sdbfis_bits = 0;
|
1749 |
|
|
pp->ncq_flags = 0;
|
1750 |
|
|
}
|
1751 |
|
|
|
1752 |
|
|
static void nv_swncq_pp_reinit(struct ata_port *ap)
|
1753 |
|
|
{
|
1754 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1755 |
|
|
struct defer_queue *dq = &pp->defer_queue;
|
1756 |
|
|
|
1757 |
|
|
dq->head = 0;
|
1758 |
|
|
dq->tail = 0;
|
1759 |
|
|
dq->defer_bits = 0;
|
1760 |
|
|
pp->qc_active = 0;
|
1761 |
|
|
pp->last_issue_tag = ATA_TAG_POISON;
|
1762 |
|
|
nv_swncq_fis_reinit(ap);
|
1763 |
|
|
}
|
1764 |
|
|
|
1765 |
|
|
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis)
|
1766 |
|
|
{
|
1767 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1768 |
|
|
|
1769 |
|
|
writew(fis, pp->irq_block);
|
1770 |
|
|
}
|
1771 |
|
|
|
1772 |
|
|
static void __ata_bmdma_stop(struct ata_port *ap)
|
1773 |
|
|
{
|
1774 |
|
|
struct ata_queued_cmd qc;
|
1775 |
|
|
|
1776 |
|
|
qc.ap = ap;
|
1777 |
|
|
ata_bmdma_stop(&qc);
|
1778 |
|
|
}
|
1779 |
|
|
|
1780 |
|
|
static void nv_swncq_ncq_stop(struct ata_port *ap)
|
1781 |
|
|
{
|
1782 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
1783 |
|
|
unsigned int i;
|
1784 |
|
|
u32 sactive;
|
1785 |
|
|
u32 done_mask;
|
1786 |
|
|
|
1787 |
|
|
ata_port_printk(ap, KERN_ERR,
|
1788 |
|
|
"EH in SWNCQ mode,QC:qc_active 0x%X sactive 0x%X\n",
|
1789 |
|
|
ap->qc_active, ap->link.sactive);
|
1790 |
|
|
ata_port_printk(ap, KERN_ERR,
|
1791 |
|
|
"SWNCQ:qc_active 0x%X defer_bits 0x%X last_issue_tag 0x%x\n "
|
1792 |
|
|
"dhfis 0x%X dmafis 0x%X sdbfis 0x%X\n",
|
1793 |
|
|
pp->qc_active, pp->defer_queue.defer_bits, pp->last_issue_tag,
|
1794 |
|
|
pp->dhfis_bits, pp->dmafis_bits, pp->sdbfis_bits);
|
1795 |
|
|
|
1796 |
|
|
ata_port_printk(ap, KERN_ERR, "ATA_REG 0x%X ERR_REG 0x%X\n",
|
1797 |
|
|
ap->ops->check_status(ap),
|
1798 |
|
|
ioread8(ap->ioaddr.error_addr));
|
1799 |
|
|
|
1800 |
|
|
sactive = readl(pp->sactive_block);
|
1801 |
|
|
done_mask = pp->qc_active ^ sactive;
|
1802 |
|
|
|
1803 |
|
|
ata_port_printk(ap, KERN_ERR, "tag : dhfis dmafis sdbfis sacitve\n");
|
1804 |
|
|
for (i = 0; i < ATA_MAX_QUEUE; i++) {
|
1805 |
|
|
u8 err = 0;
|
1806 |
|
|
if (pp->qc_active & (1 << i))
|
1807 |
|
|
err = 0;
|
1808 |
|
|
else if (done_mask & (1 << i))
|
1809 |
|
|
err = 1;
|
1810 |
|
|
else
|
1811 |
|
|
continue;
|
1812 |
|
|
|
1813 |
|
|
ata_port_printk(ap, KERN_ERR,
|
1814 |
|
|
"tag 0x%x: %01x %01x %01x %01x %s\n", i,
|
1815 |
|
|
(pp->dhfis_bits >> i) & 0x1,
|
1816 |
|
|
(pp->dmafis_bits >> i) & 0x1,
|
1817 |
|
|
(pp->sdbfis_bits >> i) & 0x1,
|
1818 |
|
|
(sactive >> i) & 0x1,
|
1819 |
|
|
(err ? "error! tag doesn't exit" : " "));
|
1820 |
|
|
}
|
1821 |
|
|
|
1822 |
|
|
nv_swncq_pp_reinit(ap);
|
1823 |
|
|
ap->ops->irq_clear(ap);
|
1824 |
|
|
__ata_bmdma_stop(ap);
|
1825 |
|
|
nv_swncq_irq_clear(ap, 0xffff);
|
1826 |
|
|
}
|
1827 |
|
|
|
1828 |
|
|
static void nv_swncq_error_handler(struct ata_port *ap)
|
1829 |
|
|
{
|
1830 |
|
|
struct ata_eh_context *ehc = &ap->link.eh_context;
|
1831 |
|
|
|
1832 |
|
|
if (ap->link.sactive) {
|
1833 |
|
|
nv_swncq_ncq_stop(ap);
|
1834 |
|
|
ehc->i.action |= ATA_EH_HARDRESET;
|
1835 |
|
|
}
|
1836 |
|
|
|
1837 |
|
|
ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset,
|
1838 |
|
|
nv_hardreset, ata_std_postreset);
|
1839 |
|
|
}
|
1840 |
|
|
|
1841 |
|
|
#ifdef CONFIG_PM
|
1842 |
|
|
static int nv_swncq_port_suspend(struct ata_port *ap, pm_message_t mesg)
|
1843 |
|
|
{
|
1844 |
|
|
void __iomem *mmio = ap->host->iomap[NV_MMIO_BAR];
|
1845 |
|
|
u32 tmp;
|
1846 |
|
|
|
1847 |
|
|
/* clear irq */
|
1848 |
|
|
writel(~0, mmio + NV_INT_STATUS_MCP55);
|
1849 |
|
|
|
1850 |
|
|
/* disable irq */
|
1851 |
|
|
writel(0, mmio + NV_INT_ENABLE_MCP55);
|
1852 |
|
|
|
1853 |
|
|
/* disable swncq */
|
1854 |
|
|
tmp = readl(mmio + NV_CTL_MCP55);
|
1855 |
|
|
tmp &= ~(NV_CTL_PRI_SWNCQ | NV_CTL_SEC_SWNCQ);
|
1856 |
|
|
writel(tmp, mmio + NV_CTL_MCP55);
|
1857 |
|
|
|
1858 |
|
|
return 0;
|
1859 |
|
|
}
|
1860 |
|
|
|
1861 |
|
|
static int nv_swncq_port_resume(struct ata_port *ap)
|
1862 |
|
|
{
|
1863 |
|
|
void __iomem *mmio = ap->host->iomap[NV_MMIO_BAR];
|
1864 |
|
|
u32 tmp;
|
1865 |
|
|
|
1866 |
|
|
/* clear irq */
|
1867 |
|
|
writel(~0, mmio + NV_INT_STATUS_MCP55);
|
1868 |
|
|
|
1869 |
|
|
/* enable irq */
|
1870 |
|
|
writel(0x00fd00fd, mmio + NV_INT_ENABLE_MCP55);
|
1871 |
|
|
|
1872 |
|
|
/* enable swncq */
|
1873 |
|
|
tmp = readl(mmio + NV_CTL_MCP55);
|
1874 |
|
|
writel(tmp | NV_CTL_PRI_SWNCQ | NV_CTL_SEC_SWNCQ, mmio + NV_CTL_MCP55);
|
1875 |
|
|
|
1876 |
|
|
return 0;
|
1877 |
|
|
}
|
1878 |
|
|
#endif
|
1879 |
|
|
|
1880 |
|
|
static void nv_swncq_host_init(struct ata_host *host)
|
1881 |
|
|
{
|
1882 |
|
|
u32 tmp;
|
1883 |
|
|
void __iomem *mmio = host->iomap[NV_MMIO_BAR];
|
1884 |
|
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
1885 |
|
|
u8 regval;
|
1886 |
|
|
|
1887 |
|
|
/* disable ECO 398 */
|
1888 |
|
|
pci_read_config_byte(pdev, 0x7f, ®val);
|
1889 |
|
|
regval &= ~(1 << 7);
|
1890 |
|
|
pci_write_config_byte(pdev, 0x7f, regval);
|
1891 |
|
|
|
1892 |
|
|
/* enable swncq */
|
1893 |
|
|
tmp = readl(mmio + NV_CTL_MCP55);
|
1894 |
|
|
VPRINTK("HOST_CTL:0x%X\n", tmp);
|
1895 |
|
|
writel(tmp | NV_CTL_PRI_SWNCQ | NV_CTL_SEC_SWNCQ, mmio + NV_CTL_MCP55);
|
1896 |
|
|
|
1897 |
|
|
/* enable irq intr */
|
1898 |
|
|
tmp = readl(mmio + NV_INT_ENABLE_MCP55);
|
1899 |
|
|
VPRINTK("HOST_ENABLE:0x%X\n", tmp);
|
1900 |
|
|
writel(tmp | 0x00fd00fd, mmio + NV_INT_ENABLE_MCP55);
|
1901 |
|
|
|
1902 |
|
|
/* clear port irq */
|
1903 |
|
|
writel(~0x0, mmio + NV_INT_STATUS_MCP55);
|
1904 |
|
|
}
|
1905 |
|
|
|
1906 |
|
|
static int nv_swncq_slave_config(struct scsi_device *sdev)
|
1907 |
|
|
{
|
1908 |
|
|
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
1909 |
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
1910 |
|
|
struct ata_device *dev;
|
1911 |
|
|
int rc;
|
1912 |
|
|
u8 rev;
|
1913 |
|
|
u8 check_maxtor = 0;
|
1914 |
|
|
unsigned char model_num[ATA_ID_PROD_LEN + 1];
|
1915 |
|
|
|
1916 |
|
|
rc = ata_scsi_slave_config(sdev);
|
1917 |
|
|
if (sdev->id >= ATA_MAX_DEVICES || sdev->channel || sdev->lun)
|
1918 |
|
|
/* Not a proper libata device, ignore */
|
1919 |
|
|
return rc;
|
1920 |
|
|
|
1921 |
|
|
dev = &ap->link.device[sdev->id];
|
1922 |
|
|
if (!(ap->flags & ATA_FLAG_NCQ) || dev->class == ATA_DEV_ATAPI)
|
1923 |
|
|
return rc;
|
1924 |
|
|
|
1925 |
|
|
/* if MCP51 and Maxtor, then disable ncq */
|
1926 |
|
|
if (pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA ||
|
1927 |
|
|
pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2)
|
1928 |
|
|
check_maxtor = 1;
|
1929 |
|
|
|
1930 |
|
|
/* if MCP55 and rev <= a2 and Maxtor, then disable ncq */
|
1931 |
|
|
if (pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA ||
|
1932 |
|
|
pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2) {
|
1933 |
|
|
pci_read_config_byte(pdev, 0x8, &rev);
|
1934 |
|
|
if (rev <= 0xa2)
|
1935 |
|
|
check_maxtor = 1;
|
1936 |
|
|
}
|
1937 |
|
|
|
1938 |
|
|
if (!check_maxtor)
|
1939 |
|
|
return rc;
|
1940 |
|
|
|
1941 |
|
|
ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
|
1942 |
|
|
|
1943 |
|
|
if (strncmp(model_num, "Maxtor", 6) == 0) {
|
1944 |
|
|
ata_scsi_change_queue_depth(sdev, 1);
|
1945 |
|
|
ata_dev_printk(dev, KERN_NOTICE,
|
1946 |
|
|
"Disabling SWNCQ mode (depth %x)\n", sdev->queue_depth);
|
1947 |
|
|
}
|
1948 |
|
|
|
1949 |
|
|
return rc;
|
1950 |
|
|
}
|
1951 |
|
|
|
1952 |
|
|
static int nv_swncq_port_start(struct ata_port *ap)
|
1953 |
|
|
{
|
1954 |
|
|
struct device *dev = ap->host->dev;
|
1955 |
|
|
void __iomem *mmio = ap->host->iomap[NV_MMIO_BAR];
|
1956 |
|
|
struct nv_swncq_port_priv *pp;
|
1957 |
|
|
int rc;
|
1958 |
|
|
|
1959 |
|
|
rc = ata_port_start(ap);
|
1960 |
|
|
if (rc)
|
1961 |
|
|
return rc;
|
1962 |
|
|
|
1963 |
|
|
pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
|
1964 |
|
|
if (!pp)
|
1965 |
|
|
return -ENOMEM;
|
1966 |
|
|
|
1967 |
|
|
pp->prd = dmam_alloc_coherent(dev, ATA_PRD_TBL_SZ * ATA_MAX_QUEUE,
|
1968 |
|
|
&pp->prd_dma, GFP_KERNEL);
|
1969 |
|
|
if (!pp->prd)
|
1970 |
|
|
return -ENOMEM;
|
1971 |
|
|
memset(pp->prd, 0, ATA_PRD_TBL_SZ * ATA_MAX_QUEUE);
|
1972 |
|
|
|
1973 |
|
|
ap->private_data = pp;
|
1974 |
|
|
pp->sactive_block = ap->ioaddr.scr_addr + 4 * SCR_ACTIVE;
|
1975 |
|
|
pp->irq_block = mmio + NV_INT_STATUS_MCP55 + ap->port_no * 2;
|
1976 |
|
|
pp->tag_block = mmio + NV_NCQ_REG_MCP55 + ap->port_no * 2;
|
1977 |
|
|
|
1978 |
|
|
return 0;
|
1979 |
|
|
}
|
1980 |
|
|
|
1981 |
|
|
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
1982 |
|
|
{
|
1983 |
|
|
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
1984 |
|
|
ata_qc_prep(qc);
|
1985 |
|
|
return;
|
1986 |
|
|
}
|
1987 |
|
|
|
1988 |
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
1989 |
|
|
return;
|
1990 |
|
|
|
1991 |
|
|
nv_swncq_fill_sg(qc);
|
1992 |
|
|
}
|
1993 |
|
|
|
1994 |
|
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
1995 |
|
|
{
|
1996 |
|
|
struct ata_port *ap = qc->ap;
|
1997 |
|
|
struct scatterlist *sg;
|
1998 |
|
|
unsigned int idx;
|
1999 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2000 |
|
|
struct ata_prd *prd;
|
2001 |
|
|
|
2002 |
|
|
WARN_ON(qc->__sg == NULL);
|
2003 |
|
|
WARN_ON(qc->n_elem == 0 && qc->pad_len == 0);
|
2004 |
|
|
|
2005 |
|
|
prd = pp->prd + ATA_MAX_PRD * qc->tag;
|
2006 |
|
|
|
2007 |
|
|
idx = 0;
|
2008 |
|
|
ata_for_each_sg(sg, qc) {
|
2009 |
|
|
u32 addr, offset;
|
2010 |
|
|
u32 sg_len, len;
|
2011 |
|
|
|
2012 |
|
|
addr = (u32)sg_dma_address(sg);
|
2013 |
|
|
sg_len = sg_dma_len(sg);
|
2014 |
|
|
|
2015 |
|
|
while (sg_len) {
|
2016 |
|
|
offset = addr & 0xffff;
|
2017 |
|
|
len = sg_len;
|
2018 |
|
|
if ((offset + sg_len) > 0x10000)
|
2019 |
|
|
len = 0x10000 - offset;
|
2020 |
|
|
|
2021 |
|
|
prd[idx].addr = cpu_to_le32(addr);
|
2022 |
|
|
prd[idx].flags_len = cpu_to_le32(len & 0xffff);
|
2023 |
|
|
|
2024 |
|
|
idx++;
|
2025 |
|
|
sg_len -= len;
|
2026 |
|
|
addr += len;
|
2027 |
|
|
}
|
2028 |
|
|
}
|
2029 |
|
|
|
2030 |
|
|
if (idx)
|
2031 |
|
|
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
2032 |
|
|
}
|
2033 |
|
|
|
2034 |
|
|
static unsigned int nv_swncq_issue_atacmd(struct ata_port *ap,
|
2035 |
|
|
struct ata_queued_cmd *qc)
|
2036 |
|
|
{
|
2037 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2038 |
|
|
|
2039 |
|
|
if (qc == NULL)
|
2040 |
|
|
return 0;
|
2041 |
|
|
|
2042 |
|
|
DPRINTK("Enter\n");
|
2043 |
|
|
|
2044 |
|
|
writel((1 << qc->tag), pp->sactive_block);
|
2045 |
|
|
pp->last_issue_tag = qc->tag;
|
2046 |
|
|
pp->dhfis_bits &= ~(1 << qc->tag);
|
2047 |
|
|
pp->dmafis_bits &= ~(1 << qc->tag);
|
2048 |
|
|
pp->qc_active |= (0x1 << qc->tag);
|
2049 |
|
|
|
2050 |
|
|
ap->ops->tf_load(ap, &qc->tf); /* load tf registers */
|
2051 |
|
|
ap->ops->exec_command(ap, &qc->tf);
|
2052 |
|
|
|
2053 |
|
|
DPRINTK("Issued tag %u\n", qc->tag);
|
2054 |
|
|
|
2055 |
|
|
return 0;
|
2056 |
|
|
}
|
2057 |
|
|
|
2058 |
|
|
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc)
|
2059 |
|
|
{
|
2060 |
|
|
struct ata_port *ap = qc->ap;
|
2061 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2062 |
|
|
|
2063 |
|
|
if (qc->tf.protocol != ATA_PROT_NCQ)
|
2064 |
|
|
return ata_qc_issue_prot(qc);
|
2065 |
|
|
|
2066 |
|
|
DPRINTK("Enter\n");
|
2067 |
|
|
|
2068 |
|
|
if (!pp->qc_active)
|
2069 |
|
|
nv_swncq_issue_atacmd(ap, qc);
|
2070 |
|
|
else
|
2071 |
|
|
nv_swncq_qc_to_dq(ap, qc); /* add qc to defer queue */
|
2072 |
|
|
|
2073 |
|
|
return 0;
|
2074 |
|
|
}
|
2075 |
|
|
|
2076 |
|
|
static void nv_swncq_hotplug(struct ata_port *ap, u32 fis)
|
2077 |
|
|
{
|
2078 |
|
|
u32 serror;
|
2079 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
2080 |
|
|
|
2081 |
|
|
ata_ehi_clear_desc(ehi);
|
2082 |
|
|
|
2083 |
|
|
/* AHCI needs SError cleared; otherwise, it might lock up */
|
2084 |
|
|
sata_scr_read(&ap->link, SCR_ERROR, &serror);
|
2085 |
|
|
sata_scr_write(&ap->link, SCR_ERROR, serror);
|
2086 |
|
|
|
2087 |
|
|
/* analyze @irq_stat */
|
2088 |
|
|
if (fis & NV_SWNCQ_IRQ_ADDED)
|
2089 |
|
|
ata_ehi_push_desc(ehi, "hot plug");
|
2090 |
|
|
else if (fis & NV_SWNCQ_IRQ_REMOVED)
|
2091 |
|
|
ata_ehi_push_desc(ehi, "hot unplug");
|
2092 |
|
|
|
2093 |
|
|
ata_ehi_hotplugged(ehi);
|
2094 |
|
|
|
2095 |
|
|
/* okay, let's hand over to EH */
|
2096 |
|
|
ehi->serror |= serror;
|
2097 |
|
|
|
2098 |
|
|
ata_port_freeze(ap);
|
2099 |
|
|
}
|
2100 |
|
|
|
2101 |
|
|
static int nv_swncq_sdbfis(struct ata_port *ap)
|
2102 |
|
|
{
|
2103 |
|
|
struct ata_queued_cmd *qc;
|
2104 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2105 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
2106 |
|
|
u32 sactive;
|
2107 |
|
|
int nr_done = 0;
|
2108 |
|
|
u32 done_mask;
|
2109 |
|
|
int i;
|
2110 |
|
|
u8 host_stat;
|
2111 |
|
|
u8 lack_dhfis = 0;
|
2112 |
|
|
|
2113 |
|
|
host_stat = ap->ops->bmdma_status(ap);
|
2114 |
|
|
if (unlikely(host_stat & ATA_DMA_ERR)) {
|
2115 |
|
|
/* error when transfering data to/from memory */
|
2116 |
|
|
ata_ehi_clear_desc(ehi);
|
2117 |
|
|
ata_ehi_push_desc(ehi, "BMDMA stat 0x%x", host_stat);
|
2118 |
|
|
ehi->err_mask |= AC_ERR_HOST_BUS;
|
2119 |
|
|
ehi->action |= ATA_EH_SOFTRESET;
|
2120 |
|
|
return -EINVAL;
|
2121 |
|
|
}
|
2122 |
|
|
|
2123 |
|
|
ap->ops->irq_clear(ap);
|
2124 |
|
|
__ata_bmdma_stop(ap);
|
2125 |
|
|
|
2126 |
|
|
sactive = readl(pp->sactive_block);
|
2127 |
|
|
done_mask = pp->qc_active ^ sactive;
|
2128 |
|
|
|
2129 |
|
|
if (unlikely(done_mask & sactive)) {
|
2130 |
|
|
ata_ehi_clear_desc(ehi);
|
2131 |
|
|
ata_ehi_push_desc(ehi, "illegal SWNCQ:qc_active transition"
|
2132 |
|
|
"(%08x->%08x)", pp->qc_active, sactive);
|
2133 |
|
|
ehi->err_mask |= AC_ERR_HSM;
|
2134 |
|
|
ehi->action |= ATA_EH_HARDRESET;
|
2135 |
|
|
return -EINVAL;
|
2136 |
|
|
}
|
2137 |
|
|
for (i = 0; i < ATA_MAX_QUEUE; i++) {
|
2138 |
|
|
if (!(done_mask & (1 << i)))
|
2139 |
|
|
continue;
|
2140 |
|
|
|
2141 |
|
|
qc = ata_qc_from_tag(ap, i);
|
2142 |
|
|
if (qc) {
|
2143 |
|
|
ata_qc_complete(qc);
|
2144 |
|
|
pp->qc_active &= ~(1 << i);
|
2145 |
|
|
pp->dhfis_bits &= ~(1 << i);
|
2146 |
|
|
pp->dmafis_bits &= ~(1 << i);
|
2147 |
|
|
pp->sdbfis_bits |= (1 << i);
|
2148 |
|
|
nr_done++;
|
2149 |
|
|
}
|
2150 |
|
|
}
|
2151 |
|
|
|
2152 |
|
|
if (!ap->qc_active) {
|
2153 |
|
|
DPRINTK("over\n");
|
2154 |
|
|
nv_swncq_pp_reinit(ap);
|
2155 |
|
|
return nr_done;
|
2156 |
|
|
}
|
2157 |
|
|
|
2158 |
|
|
if (pp->qc_active & pp->dhfis_bits)
|
2159 |
|
|
return nr_done;
|
2160 |
|
|
|
2161 |
|
|
if ((pp->ncq_flags & ncq_saw_backout) ||
|
2162 |
|
|
(pp->qc_active ^ pp->dhfis_bits))
|
2163 |
|
|
/* if the controller cann't get a device to host register FIS,
|
2164 |
|
|
* The driver needs to reissue the new command.
|
2165 |
|
|
*/
|
2166 |
|
|
lack_dhfis = 1;
|
2167 |
|
|
|
2168 |
|
|
DPRINTK("id 0x%x QC: qc_active 0x%x,"
|
2169 |
|
|
"SWNCQ:qc_active 0x%X defer_bits %X "
|
2170 |
|
|
"dhfis 0x%X dmafis 0x%X last_issue_tag %x\n",
|
2171 |
|
|
ap->print_id, ap->qc_active, pp->qc_active,
|
2172 |
|
|
pp->defer_queue.defer_bits, pp->dhfis_bits,
|
2173 |
|
|
pp->dmafis_bits, pp->last_issue_tag);
|
2174 |
|
|
|
2175 |
|
|
nv_swncq_fis_reinit(ap);
|
2176 |
|
|
|
2177 |
|
|
if (lack_dhfis) {
|
2178 |
|
|
qc = ata_qc_from_tag(ap, pp->last_issue_tag);
|
2179 |
|
|
nv_swncq_issue_atacmd(ap, qc);
|
2180 |
|
|
return nr_done;
|
2181 |
|
|
}
|
2182 |
|
|
|
2183 |
|
|
if (pp->defer_queue.defer_bits) {
|
2184 |
|
|
/* send deferral queue command */
|
2185 |
|
|
qc = nv_swncq_qc_from_dq(ap);
|
2186 |
|
|
WARN_ON(qc == NULL);
|
2187 |
|
|
nv_swncq_issue_atacmd(ap, qc);
|
2188 |
|
|
}
|
2189 |
|
|
|
2190 |
|
|
return nr_done;
|
2191 |
|
|
}
|
2192 |
|
|
|
2193 |
|
|
static inline u32 nv_swncq_tag(struct ata_port *ap)
|
2194 |
|
|
{
|
2195 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2196 |
|
|
u32 tag;
|
2197 |
|
|
|
2198 |
|
|
tag = readb(pp->tag_block) >> 2;
|
2199 |
|
|
return (tag & 0x1f);
|
2200 |
|
|
}
|
2201 |
|
|
|
2202 |
|
|
static int nv_swncq_dmafis(struct ata_port *ap)
|
2203 |
|
|
{
|
2204 |
|
|
struct ata_queued_cmd *qc;
|
2205 |
|
|
unsigned int rw;
|
2206 |
|
|
u8 dmactl;
|
2207 |
|
|
u32 tag;
|
2208 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2209 |
|
|
|
2210 |
|
|
__ata_bmdma_stop(ap);
|
2211 |
|
|
tag = nv_swncq_tag(ap);
|
2212 |
|
|
|
2213 |
|
|
DPRINTK("dma setup tag 0x%x\n", tag);
|
2214 |
|
|
qc = ata_qc_from_tag(ap, tag);
|
2215 |
|
|
|
2216 |
|
|
if (unlikely(!qc))
|
2217 |
|
|
return 0;
|
2218 |
|
|
|
2219 |
|
|
rw = qc->tf.flags & ATA_TFLAG_WRITE;
|
2220 |
|
|
|
2221 |
|
|
/* load PRD table addr. */
|
2222 |
|
|
iowrite32(pp->prd_dma + ATA_PRD_TBL_SZ * qc->tag,
|
2223 |
|
|
ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS);
|
2224 |
|
|
|
2225 |
|
|
/* specify data direction, triple-check start bit is clear */
|
2226 |
|
|
dmactl = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
|
2227 |
|
|
dmactl &= ~ATA_DMA_WR;
|
2228 |
|
|
if (!rw)
|
2229 |
|
|
dmactl |= ATA_DMA_WR;
|
2230 |
|
|
|
2231 |
|
|
iowrite8(dmactl | ATA_DMA_START, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
|
2232 |
|
|
|
2233 |
|
|
return 1;
|
2234 |
|
|
}
|
2235 |
|
|
|
2236 |
|
|
static void nv_swncq_host_interrupt(struct ata_port *ap, u16 fis)
|
2237 |
|
|
{
|
2238 |
|
|
struct nv_swncq_port_priv *pp = ap->private_data;
|
2239 |
|
|
struct ata_queued_cmd *qc;
|
2240 |
|
|
struct ata_eh_info *ehi = &ap->link.eh_info;
|
2241 |
|
|
u32 serror;
|
2242 |
|
|
u8 ata_stat;
|
2243 |
|
|
int rc = 0;
|
2244 |
|
|
|
2245 |
|
|
ata_stat = ap->ops->check_status(ap);
|
2246 |
|
|
nv_swncq_irq_clear(ap, fis);
|
2247 |
|
|
if (!fis)
|
2248 |
|
|
return;
|
2249 |
|
|
|
2250 |
|
|
if (ap->pflags & ATA_PFLAG_FROZEN)
|
2251 |
|
|
return;
|
2252 |
|
|
|
2253 |
|
|
if (fis & NV_SWNCQ_IRQ_HOTPLUG) {
|
2254 |
|
|
nv_swncq_hotplug(ap, fis);
|
2255 |
|
|
return;
|
2256 |
|
|
}
|
2257 |
|
|
|
2258 |
|
|
if (!pp->qc_active)
|
2259 |
|
|
return;
|
2260 |
|
|
|
2261 |
|
|
if (ap->ops->scr_read(ap, SCR_ERROR, &serror))
|
2262 |
|
|
return;
|
2263 |
|
|
ap->ops->scr_write(ap, SCR_ERROR, serror);
|
2264 |
|
|
|
2265 |
|
|
if (ata_stat & ATA_ERR) {
|
2266 |
|
|
ata_ehi_clear_desc(ehi);
|
2267 |
|
|
ata_ehi_push_desc(ehi, "Ata error. fis:0x%X", fis);
|
2268 |
|
|
ehi->err_mask |= AC_ERR_DEV;
|
2269 |
|
|
ehi->serror |= serror;
|
2270 |
|
|
ehi->action |= ATA_EH_SOFTRESET;
|
2271 |
|
|
ata_port_freeze(ap);
|
2272 |
|
|
return;
|
2273 |
|
|
}
|
2274 |
|
|
|
2275 |
|
|
if (fis & NV_SWNCQ_IRQ_BACKOUT) {
|
2276 |
|
|
/* If the IRQ is backout, driver must issue
|
2277 |
|
|
* the new command again some time later.
|
2278 |
|
|
*/
|
2279 |
|
|
pp->ncq_flags |= ncq_saw_backout;
|
2280 |
|
|
}
|
2281 |
|
|
|
2282 |
|
|
if (fis & NV_SWNCQ_IRQ_SDBFIS) {
|
2283 |
|
|
pp->ncq_flags |= ncq_saw_sdb;
|
2284 |
|
|
DPRINTK("id 0x%x SWNCQ: qc_active 0x%X "
|
2285 |
|
|
"dhfis 0x%X dmafis 0x%X sactive 0x%X\n",
|
2286 |
|
|
ap->print_id, pp->qc_active, pp->dhfis_bits,
|
2287 |
|
|
pp->dmafis_bits, readl(pp->sactive_block));
|
2288 |
|
|
rc = nv_swncq_sdbfis(ap);
|
2289 |
|
|
if (rc < 0)
|
2290 |
|
|
goto irq_error;
|
2291 |
|
|
}
|
2292 |
|
|
|
2293 |
|
|
if (fis & NV_SWNCQ_IRQ_DHREGFIS) {
|
2294 |
|
|
/* The interrupt indicates the new command
|
2295 |
|
|
* was transmitted correctly to the drive.
|
2296 |
|
|
*/
|
2297 |
|
|
pp->dhfis_bits |= (0x1 << pp->last_issue_tag);
|
2298 |
|
|
pp->ncq_flags |= ncq_saw_d2h;
|
2299 |
|
|
if (pp->ncq_flags & (ncq_saw_sdb | ncq_saw_backout)) {
|
2300 |
|
|
ata_ehi_push_desc(ehi, "illegal fis transaction");
|
2301 |
|
|
ehi->err_mask |= AC_ERR_HSM;
|
2302 |
|
|
ehi->action |= ATA_EH_HARDRESET;
|
2303 |
|
|
goto irq_error;
|
2304 |
|
|
}
|
2305 |
|
|
|
2306 |
|
|
if (!(fis & NV_SWNCQ_IRQ_DMASETUP) &&
|
2307 |
|
|
!(pp->ncq_flags & ncq_saw_dmas)) {
|
2308 |
|
|
ata_stat = ap->ops->check_status(ap);
|
2309 |
|
|
if (ata_stat & ATA_BUSY)
|
2310 |
|
|
goto irq_exit;
|
2311 |
|
|
|
2312 |
|
|
if (pp->defer_queue.defer_bits) {
|
2313 |
|
|
DPRINTK("send next command\n");
|
2314 |
|
|
qc = nv_swncq_qc_from_dq(ap);
|
2315 |
|
|
nv_swncq_issue_atacmd(ap, qc);
|
2316 |
|
|
}
|
2317 |
|
|
}
|
2318 |
|
|
}
|
2319 |
|
|
|
2320 |
|
|
if (fis & NV_SWNCQ_IRQ_DMASETUP) {
|
2321 |
|
|
/* program the dma controller with appropriate PRD buffers
|
2322 |
|
|
* and start the DMA transfer for requested command.
|
2323 |
|
|
*/
|
2324 |
|
|
pp->dmafis_bits |= (0x1 << nv_swncq_tag(ap));
|
2325 |
|
|
pp->ncq_flags |= ncq_saw_dmas;
|
2326 |
|
|
rc = nv_swncq_dmafis(ap);
|
2327 |
|
|
}
|
2328 |
|
|
|
2329 |
|
|
irq_exit:
|
2330 |
|
|
return;
|
2331 |
|
|
irq_error:
|
2332 |
|
|
ata_ehi_push_desc(ehi, "fis:0x%x", fis);
|
2333 |
|
|
ata_port_freeze(ap);
|
2334 |
|
|
return;
|
2335 |
|
|
}
|
2336 |
|
|
|
2337 |
|
|
static irqreturn_t nv_swncq_interrupt(int irq, void *dev_instance)
|
2338 |
|
|
{
|
2339 |
|
|
struct ata_host *host = dev_instance;
|
2340 |
|
|
unsigned int i;
|
2341 |
|
|
unsigned int handled = 0;
|
2342 |
|
|
unsigned long flags;
|
2343 |
|
|
u32 irq_stat;
|
2344 |
|
|
|
2345 |
|
|
spin_lock_irqsave(&host->lock, flags);
|
2346 |
|
|
|
2347 |
|
|
irq_stat = readl(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_MCP55);
|
2348 |
|
|
|
2349 |
|
|
for (i = 0; i < host->n_ports; i++) {
|
2350 |
|
|
struct ata_port *ap = host->ports[i];
|
2351 |
|
|
|
2352 |
|
|
if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
|
2353 |
|
|
if (ap->link.sactive) {
|
2354 |
|
|
nv_swncq_host_interrupt(ap, (u16)irq_stat);
|
2355 |
|
|
handled = 1;
|
2356 |
|
|
} else {
|
2357 |
|
|
if (irq_stat) /* reserve Hotplug */
|
2358 |
|
|
nv_swncq_irq_clear(ap, 0xfff0);
|
2359 |
|
|
|
2360 |
|
|
handled += nv_host_intr(ap, (u8)irq_stat);
|
2361 |
|
|
}
|
2362 |
|
|
}
|
2363 |
|
|
irq_stat >>= NV_INT_PORT_SHIFT_MCP55;
|
2364 |
|
|
}
|
2365 |
|
|
|
2366 |
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
2367 |
|
|
|
2368 |
|
|
return IRQ_RETVAL(handled);
|
2369 |
|
|
}
|
2370 |
|
|
|
2371 |
|
|
static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
2372 |
|
|
{
|
2373 |
|
|
static int printed_version;
|
2374 |
|
|
const struct ata_port_info *ppi[] = { NULL, NULL };
|
2375 |
|
|
struct ata_host *host;
|
2376 |
|
|
struct nv_host_priv *hpriv;
|
2377 |
|
|
int rc;
|
2378 |
|
|
u32 bar;
|
2379 |
|
|
void __iomem *base;
|
2380 |
|
|
unsigned long type = ent->driver_data;
|
2381 |
|
|
|
2382 |
|
|
// Make sure this is a SATA controller by counting the number of bars
|
2383 |
|
|
// (NVIDIA SATA controllers will always have six bars). Otherwise,
|
2384 |
|
|
// it's an IDE controller and we ignore it.
|
2385 |
|
|
for (bar = 0; bar < 6; bar++)
|
2386 |
|
|
if (pci_resource_start(pdev, bar) == 0)
|
2387 |
|
|
return -ENODEV;
|
2388 |
|
|
|
2389 |
|
|
if (!printed_version++)
|
2390 |
|
|
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
|
2391 |
|
|
|
2392 |
|
|
rc = pcim_enable_device(pdev);
|
2393 |
|
|
if (rc)
|
2394 |
|
|
return rc;
|
2395 |
|
|
|
2396 |
|
|
/* determine type and allocate host */
|
2397 |
|
|
if (type == CK804 && adma_enabled) {
|
2398 |
|
|
dev_printk(KERN_NOTICE, &pdev->dev, "Using ADMA mode\n");
|
2399 |
|
|
type = ADMA;
|
2400 |
|
|
}
|
2401 |
|
|
|
2402 |
|
|
if (type == SWNCQ) {
|
2403 |
|
|
if (swncq_enabled)
|
2404 |
|
|
dev_printk(KERN_NOTICE, &pdev->dev,
|
2405 |
|
|
"Using SWNCQ mode\n");
|
2406 |
|
|
else
|
2407 |
|
|
type = GENERIC;
|
2408 |
|
|
}
|
2409 |
|
|
|
2410 |
|
|
ppi[0] = &nv_port_info[type];
|
2411 |
|
|
rc = ata_pci_prepare_sff_host(pdev, ppi, &host);
|
2412 |
|
|
if (rc)
|
2413 |
|
|
return rc;
|
2414 |
|
|
|
2415 |
|
|
hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
|
2416 |
|
|
if (!hpriv)
|
2417 |
|
|
return -ENOMEM;
|
2418 |
|
|
hpriv->type = type;
|
2419 |
|
|
host->private_data = hpriv;
|
2420 |
|
|
|
2421 |
|
|
/* set 64bit dma masks, may fail */
|
2422 |
|
|
if (type == ADMA) {
|
2423 |
|
|
if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0)
|
2424 |
|
|
pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
|
2425 |
|
|
}
|
2426 |
|
|
|
2427 |
|
|
/* request and iomap NV_MMIO_BAR */
|
2428 |
|
|
rc = pcim_iomap_regions(pdev, 1 << NV_MMIO_BAR, DRV_NAME);
|
2429 |
|
|
if (rc)
|
2430 |
|
|
return rc;
|
2431 |
|
|
|
2432 |
|
|
/* configure SCR access */
|
2433 |
|
|
base = host->iomap[NV_MMIO_BAR];
|
2434 |
|
|
host->ports[0]->ioaddr.scr_addr = base + NV_PORT0_SCR_REG_OFFSET;
|
2435 |
|
|
host->ports[1]->ioaddr.scr_addr = base + NV_PORT1_SCR_REG_OFFSET;
|
2436 |
|
|
|
2437 |
|
|
/* enable SATA space for CK804 */
|
2438 |
|
|
if (type >= CK804) {
|
2439 |
|
|
u8 regval;
|
2440 |
|
|
|
2441 |
|
|
pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val);
|
2442 |
|
|
regval |= NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
|
2443 |
|
|
pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
|
2444 |
|
|
}
|
2445 |
|
|
|
2446 |
|
|
/* init ADMA */
|
2447 |
|
|
if (type == ADMA) {
|
2448 |
|
|
rc = nv_adma_host_init(host);
|
2449 |
|
|
if (rc)
|
2450 |
|
|
return rc;
|
2451 |
|
|
} else if (type == SWNCQ)
|
2452 |
|
|
nv_swncq_host_init(host);
|
2453 |
|
|
|
2454 |
|
|
pci_set_master(pdev);
|
2455 |
|
|
return ata_host_activate(host, pdev->irq, ppi[0]->irq_handler,
|
2456 |
|
|
IRQF_SHARED, ppi[0]->sht);
|
2457 |
|
|
}
|
2458 |
|
|
|
2459 |
|
|
#ifdef CONFIG_PM
|
2460 |
|
|
static int nv_pci_device_resume(struct pci_dev *pdev)
|
2461 |
|
|
{
|
2462 |
|
|
struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
2463 |
|
|
struct nv_host_priv *hpriv = host->private_data;
|
2464 |
|
|
int rc;
|
2465 |
|
|
|
2466 |
|
|
rc = ata_pci_device_do_resume(pdev);
|
2467 |
|
|
if (rc)
|
2468 |
|
|
return rc;
|
2469 |
|
|
|
2470 |
|
|
if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
|
2471 |
|
|
if (hpriv->type >= CK804) {
|
2472 |
|
|
u8 regval;
|
2473 |
|
|
|
2474 |
|
|
pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val);
|
2475 |
|
|
regval |= NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
|
2476 |
|
|
pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
|
2477 |
|
|
}
|
2478 |
|
|
if (hpriv->type == ADMA) {
|
2479 |
|
|
u32 tmp32;
|
2480 |
|
|
struct nv_adma_port_priv *pp;
|
2481 |
|
|
/* enable/disable ADMA on the ports appropriately */
|
2482 |
|
|
pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &tmp32);
|
2483 |
|
|
|
2484 |
|
|
pp = host->ports[0]->private_data;
|
2485 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
|
2486 |
|
|
tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT0_EN |
|
2487 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN);
|
2488 |
|
|
else
|
2489 |
|
|
tmp32 |= (NV_MCP_SATA_CFG_20_PORT0_EN |
|
2490 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN);
|
2491 |
|
|
pp = host->ports[1]->private_data;
|
2492 |
|
|
if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
|
2493 |
|
|
tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT1_EN |
|
2494 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN);
|
2495 |
|
|
else
|
2496 |
|
|
tmp32 |= (NV_MCP_SATA_CFG_20_PORT1_EN |
|
2497 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN);
|
2498 |
|
|
|
2499 |
|
|
pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, tmp32);
|
2500 |
|
|
}
|
2501 |
|
|
}
|
2502 |
|
|
|
2503 |
|
|
ata_host_resume(host);
|
2504 |
|
|
|
2505 |
|
|
return 0;
|
2506 |
|
|
}
|
2507 |
|
|
#endif
|
2508 |
|
|
|
2509 |
|
|
static void nv_ck804_host_stop(struct ata_host *host)
|
2510 |
|
|
{
|
2511 |
|
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
2512 |
|
|
u8 regval;
|
2513 |
|
|
|
2514 |
|
|
/* disable SATA space for CK804 */
|
2515 |
|
|
pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val);
|
2516 |
|
|
regval &= ~NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
|
2517 |
|
|
pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
|
2518 |
|
|
}
|
2519 |
|
|
|
2520 |
|
|
static void nv_adma_host_stop(struct ata_host *host)
|
2521 |
|
|
{
|
2522 |
|
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
2523 |
|
|
u32 tmp32;
|
2524 |
|
|
|
2525 |
|
|
/* disable ADMA on the ports */
|
2526 |
|
|
pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &tmp32);
|
2527 |
|
|
tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT0_EN |
|
2528 |
|
|
NV_MCP_SATA_CFG_20_PORT0_PWB_EN |
|
2529 |
|
|
NV_MCP_SATA_CFG_20_PORT1_EN |
|
2530 |
|
|
NV_MCP_SATA_CFG_20_PORT1_PWB_EN);
|
2531 |
|
|
|
2532 |
|
|
pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, tmp32);
|
2533 |
|
|
|
2534 |
|
|
nv_ck804_host_stop(host);
|
2535 |
|
|
}
|
2536 |
|
|
|
2537 |
|
|
static int __init nv_init(void)
|
2538 |
|
|
{
|
2539 |
|
|
return pci_register_driver(&nv_pci_driver);
|
2540 |
|
|
}
|
2541 |
|
|
|
2542 |
|
|
static void __exit nv_exit(void)
|
2543 |
|
|
{
|
2544 |
|
|
pci_unregister_driver(&nv_pci_driver);
|
2545 |
|
|
}
|
2546 |
|
|
|
2547 |
|
|
module_init(nv_init);
|
2548 |
|
|
module_exit(nv_exit);
|
2549 |
|
|
module_param_named(adma, adma_enabled, bool, 0444);
|
2550 |
|
|
MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: true)");
|
2551 |
|
|
module_param_named(swncq, swncq_enabled, bool, 0444);
|
2552 |
|
|
MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: false)");
|
2553 |
|
|
|