Blame view
drivers/ata/sata_promise.c
34 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 |
/* * sata_promise.c - Promise SATA * * Maintained by: Jeff Garzik <jgarzik@pobox.com> |
5595ddf98 sata_promise: cle... |
5 |
* Mikael Pettersson <mikpe@it.uu.se> |
1da177e4c Linux-2.6.12-rc2 |
6 7 8 9 10 |
* Please ALWAYS copy linux-ide@vger.kernel.org * on emails. * * Copyright 2003-2004 Red Hat, Inc. * |
1da177e4c Linux-2.6.12-rc2 |
11 |
* |
af36d7f0d [libata] license ... |
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * * * libata documentation is available via 'make {ps|pdf}docs', * as Documentation/DocBook/libata.* * * Hardware information only available under NDA. |
1da177e4c Linux-2.6.12-rc2 |
31 32 33 34 35 |
* */ #include <linux/kernel.h> #include <linux/module.h> |
5a0e3ad6a include cleanup: ... |
36 |
#include <linux/gfp.h> |
1da177e4c Linux-2.6.12-rc2 |
37 38 39 40 41 |
#include <linux/pci.h> #include <linux/init.h> #include <linux/blkdev.h> #include <linux/delay.h> #include <linux/interrupt.h> |
a9524a76f [libata] use dev_... |
42 |
#include <linux/device.h> |
95006188c sata_promise: ATA... |
43 |
#include <scsi/scsi.h> |
1da177e4c Linux-2.6.12-rc2 |
44 |
#include <scsi/scsi_host.h> |
193515d51 [libata] eliminat... |
45 |
#include <scsi/scsi_cmnd.h> |
1da177e4c Linux-2.6.12-rc2 |
46 |
#include <linux/libata.h> |
1da177e4c Linux-2.6.12-rc2 |
47 48 49 |
#include "sata_promise.h" #define DRV_NAME "sata_promise" |
c07a9c499 sata_promise: fix... |
50 |
#define DRV_VERSION "2.12" |
1da177e4c Linux-2.6.12-rc2 |
51 52 |
enum { |
eca25dca1 libata: convert d... |
53 |
PDC_MAX_PORTS = 4, |
0d5ff5667 libata: convert t... |
54 |
PDC_MMIO_BAR = 3, |
b9ccd4a90 sata_promise: ASI... |
55 |
PDC_MAX_PRD = LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */ |
0d5ff5667 libata: convert t... |
56 |
|
821d22cdc sata_promise: mmi... |
57 58 59 |
/* host register offsets (from host->iomap[PDC_MMIO_BAR]) */ PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */ PDC_FLASH_CTL = 0x44, /* Flash control register */ |
ff7cddf59 sata_promise: upd... |
60 |
PDC_PCI_CTL = 0x48, /* PCI control/status reg */ |
821d22cdc sata_promise: mmi... |
61 62 63 64 65 66 |
PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */ PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */ PDC_TBG_MODE = 0x41C, /* TBG mode (not SATAII) */ PDC_SLEW_CTL = 0x470, /* slew rate control reg (not SATAII) */ /* per-port ATA register offsets (from ap->ioaddr.cmd_addr) */ |
95006188c sata_promise: ATA... |
67 68 69 70 71 72 73 |
PDC_FEATURE = 0x04, /* Feature/Error reg (per port) */ PDC_SECTOR_COUNT = 0x08, /* Sector count reg (per port) */ PDC_SECTOR_NUMBER = 0x0C, /* Sector number reg (per port) */ PDC_CYLINDER_LOW = 0x10, /* Cylinder low reg (per port) */ PDC_CYLINDER_HIGH = 0x14, /* Cylinder high reg (per port) */ PDC_DEVICE = 0x18, /* Device/Head reg (per port) */ PDC_COMMAND = 0x1C, /* Command/status reg (per port) */ |
73fd456b2 sata_promise: ATA... |
74 |
PDC_ALTSTATUS = 0x38, /* Alternate-status/device-control reg (per port) */ |
1da177e4c Linux-2.6.12-rc2 |
75 |
PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */ |
1da177e4c Linux-2.6.12-rc2 |
76 77 |
PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */ PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */ |
821d22cdc sata_promise: mmi... |
78 79 |
/* per-port SATA register offsets (from ap->ioaddr.scr_addr) */ |
ff7cddf59 sata_promise: upd... |
80 |
PDC_SATA_ERROR = 0x04, |
821d22cdc sata_promise: mmi... |
81 |
PDC_PHYMODE4 = 0x14, |
ff7cddf59 sata_promise: upd... |
82 83 84 85 86 87 88 89 90 |
PDC_LINK_LAYER_ERRORS = 0x6C, PDC_FPDMA_CTLSTAT = 0xD8, PDC_INTERNAL_DEBUG_1 = 0xF8, /* also used for PATA */ PDC_INTERNAL_DEBUG_2 = 0xFC, /* also used for PATA */ /* PDC_FPDMA_CTLSTAT bit definitions */ PDC_FPDMA_CTLSTAT_RESET = 1 << 3, PDC_FPDMA_CTLSTAT_DMASETUP_INT_FLAG = 1 << 10, PDC_FPDMA_CTLSTAT_SETDB_INT_FLAG = 1 << 11, |
1da177e4c Linux-2.6.12-rc2 |
91 |
|
176efb054 sata_promise: dec... |
92 93 94 95 96 97 98 99 100 101 102 103 104 |
/* PDC_GLOBAL_CTL bit definitions */ PDC_PH_ERR = (1 << 8), /* PCI error while loading packet */ PDC_SH_ERR = (1 << 9), /* PCI error while loading S/G table */ PDC_DH_ERR = (1 << 10), /* PCI error while loading data */ PDC2_HTO_ERR = (1 << 12), /* host bus timeout */ PDC2_ATA_HBA_ERR = (1 << 13), /* error during SATA DATA FIS transmission */ PDC2_ATA_DMA_CNT_ERR = (1 << 14), /* DMA DATA FIS size differs from S/G count */ PDC_OVERRUN_ERR = (1 << 19), /* S/G byte count larger than HD requires */ PDC_UNDERRUN_ERR = (1 << 20), /* S/G byte count less than HD requires */ PDC_DRIVE_ERR = (1 << 21), /* drive error */ PDC_PCI_SYS_ERR = (1 << 22), /* PCI system error */ PDC1_PCI_PARITY_ERR = (1 << 23), /* PCI parity error (from SATA150 driver) */ PDC1_ERR_MASK = PDC1_PCI_PARITY_ERR, |
5796d1c4c [libata] Address ... |
105 106 107 108 109 110 |
PDC2_ERR_MASK = PDC2_HTO_ERR | PDC2_ATA_HBA_ERR | PDC2_ATA_DMA_CNT_ERR, PDC_ERR_MASK = PDC_PH_ERR | PDC_SH_ERR | PDC_DH_ERR | PDC_OVERRUN_ERR | PDC_UNDERRUN_ERR | PDC_DRIVE_ERR | PDC_PCI_SYS_ERR | PDC1_ERR_MASK | PDC2_ERR_MASK, |
1da177e4c Linux-2.6.12-rc2 |
111 112 |
board_2037x = 0, /* FastTrak S150 TX2plus */ |
eca25dca1 libata: convert d... |
113 114 115 116 |
board_2037x_pata = 1, /* FastTrak S150 TX2plus PATA port */ board_20319 = 2, /* FastTrak S150 TX4 */ board_20619 = 3, /* FastTrak TX4000 */ board_2057x = 4, /* SATAII150 Tx2plus */ |
d0e580316 sata_promise: cle... |
117 |
board_2057x_pata = 5, /* SATAII150 Tx2plus PATA port */ |
eca25dca1 libata: convert d... |
118 |
board_40518 = 6, /* SATAII150 Tx4 */ |
1da177e4c Linux-2.6.12-rc2 |
119 |
|
6340f0196 [libata sata_prom... |
120 |
PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */ |
1da177e4c Linux-2.6.12-rc2 |
121 |
|
95006188c sata_promise: ATA... |
122 123 124 125 126 127 128 129 130 |
/* Sequence counter control registers bit definitions */ PDC_SEQCNTRL_INT_MASK = (1 << 5), /* Sequence Interrupt Mask */ /* Feature register values */ PDC_FEATURE_ATAPI_PIO = 0x00, /* ATAPI data xfer by PIO */ PDC_FEATURE_ATAPI_DMA = 0x01, /* ATAPI data xfer by DMA */ /* Device/Head register values */ PDC_DEVICE_SATA = 0xE0, /* Device/Head value for SATA devices */ |
25b93d81b [PATCH] sata_prom... |
131 132 133 |
/* PDC_CTLSTAT bit definitions */ PDC_DMA_ENABLE = (1 << 7), PDC_IRQ_DISABLE = (1 << 10), |
1da177e4c Linux-2.6.12-rc2 |
134 |
PDC_RESET = (1 << 11), /* HDMA reset */ |
50630195b [libata] mark cer... |
135 |
|
9cbe056f6 libata: remove AT... |
136 |
PDC_COMMON_FLAGS = ATA_FLAG_PIO_POLLING, |
b2d1eee1e [PATCH] sata_prom... |
137 |
|
eca25dca1 libata: convert d... |
138 139 140 141 |
/* ap->flags bits */ PDC_FLAG_GEN_II = (1 << 24), PDC_FLAG_SATA_PATA = (1 << 25), /* supports SATA + PATA */ PDC_FLAG_4_PORTS = (1 << 26), /* 4 ports */ |
1da177e4c Linux-2.6.12-rc2 |
142 |
}; |
1da177e4c Linux-2.6.12-rc2 |
143 144 145 146 |
struct pdc_port_priv { u8 *pkt; dma_addr_t pkt_dma; }; |
82ef04fb4 libata: make SCR ... |
147 148 |
static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); |
7715a6f9c sata_promise: oth... |
149 |
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
eca25dca1 libata: convert d... |
150 151 |
static int pdc_common_port_start(struct ata_port *ap); static int pdc_sata_port_start(struct ata_port *ap); |
1da177e4c Linux-2.6.12-rc2 |
152 |
static void pdc_qc_prep(struct ata_queued_cmd *qc); |
057ace5e7 libata: const-ifi... |
153 154 |
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf); static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf); |
95006188c sata_promise: ATA... |
155 |
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc); |
724114a57 sata_promise: sep... |
156 |
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc); |
1da177e4c Linux-2.6.12-rc2 |
157 |
static void pdc_irq_clear(struct ata_port *ap); |
9363c3825 libata: rename SF... |
158 |
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc); |
25b93d81b [PATCH] sata_prom... |
159 |
static void pdc_freeze(struct ata_port *ap); |
c07a9c499 sata_promise: fix... |
160 |
static void pdc_sata_freeze(struct ata_port *ap); |
25b93d81b [PATCH] sata_prom... |
161 |
static void pdc_thaw(struct ata_port *ap); |
c07a9c499 sata_promise: fix... |
162 |
static void pdc_sata_thaw(struct ata_port *ap); |
cadef677e sata_promise: add... |
163 164 165 166 |
static int pdc_pata_softreset(struct ata_link *link, unsigned int *class, unsigned long deadline); static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline); |
a1efdaba2 libata: make rese... |
167 |
static void pdc_error_handler(struct ata_port *ap); |
25b93d81b [PATCH] sata_prom... |
168 |
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc); |
724114a57 sata_promise: sep... |
169 170 |
static int pdc_pata_cable_detect(struct ata_port *ap); static int pdc_sata_cable_detect(struct ata_port *ap); |
374b18735 [libata] update s... |
171 |
|
193515d51 [libata] eliminat... |
172 |
static struct scsi_host_template pdc_ata_sht = { |
68d1d07b5 libata: implement... |
173 |
ATA_BASE_SHT(DRV_NAME), |
b9ccd4a90 sata_promise: ASI... |
174 |
.sg_tablesize = PDC_MAX_PRD, |
1da177e4c Linux-2.6.12-rc2 |
175 |
.dma_boundary = ATA_DMA_BOUNDARY, |
1da177e4c Linux-2.6.12-rc2 |
176 |
}; |
029cfd6b7 libata: implement... |
177 178 |
static const struct ata_port_operations pdc_common_ops = { .inherits = &ata_sff_port_ops, |
5682ed33a libata: rename SF... |
179 180 |
.sff_tf_load = pdc_tf_load_mmio, .sff_exec_command = pdc_exec_command_mmio, |
95006188c sata_promise: ATA... |
181 |
.check_atapi_dma = pdc_check_atapi_dma, |
95006188c sata_promise: ATA... |
182 |
.qc_prep = pdc_qc_prep, |
9363c3825 libata: rename SF... |
183 |
.qc_issue = pdc_qc_issue, |
c96f1732e [libata] Improve ... |
184 |
|
5682ed33a libata: rename SF... |
185 |
.sff_irq_clear = pdc_irq_clear, |
c96f1732e [libata] Improve ... |
186 |
.lost_interrupt = ATA_OP_NULL, |
95006188c sata_promise: ATA... |
187 |
|
029cfd6b7 libata: implement... |
188 |
.post_internal_cmd = pdc_post_internal_cmd, |
a1efdaba2 libata: make rese... |
189 |
.error_handler = pdc_error_handler, |
95006188c sata_promise: ATA... |
190 |
}; |
029cfd6b7 libata: implement... |
191 192 193 |
static struct ata_port_operations pdc_sata_ops = { .inherits = &pdc_common_ops, .cable_detect = pdc_sata_cable_detect, |
c07a9c499 sata_promise: fix... |
194 195 |
.freeze = pdc_sata_freeze, .thaw = pdc_sata_thaw, |
1da177e4c Linux-2.6.12-rc2 |
196 197 |
.scr_read = pdc_sata_scr_read, .scr_write = pdc_sata_scr_write, |
eca25dca1 libata: convert d... |
198 |
.port_start = pdc_sata_port_start, |
cadef677e sata_promise: add... |
199 |
.hardreset = pdc_sata_hardreset, |
1da177e4c Linux-2.6.12-rc2 |
200 |
}; |
0ae6654da sata_promise: dis... |
201 202 |
/* First-generation chips need a more restrictive ->check_atapi_dma op, and ->freeze/thaw that ignore the hotplug controls. */ |
029cfd6b7 libata: implement... |
203 204 |
static struct ata_port_operations pdc_old_sata_ops = { .inherits = &pdc_sata_ops, |
0ae6654da sata_promise: dis... |
205 206 |
.freeze = pdc_freeze, .thaw = pdc_thaw, |
029cfd6b7 libata: implement... |
207 208 |
.check_atapi_dma = pdc_old_sata_check_atapi_dma, }; |
2cba582a4 [libata sata_prom... |
209 |
|
029cfd6b7 libata: implement... |
210 211 212 |
static struct ata_port_operations pdc_pata_ops = { .inherits = &pdc_common_ops, .cable_detect = pdc_pata_cable_detect, |
5387373bf sata_promise: new... |
213 214 |
.freeze = pdc_freeze, .thaw = pdc_thaw, |
eca25dca1 libata: convert d... |
215 |
.port_start = pdc_common_port_start, |
cadef677e sata_promise: add... |
216 |
.softreset = pdc_pata_softreset, |
2cba582a4 [libata sata_prom... |
217 |
}; |
98ac62def [PATCH] mark seve... |
218 |
static const struct ata_port_info pdc_port_info[] = { |
5595ddf98 sata_promise: cle... |
219 |
[board_2037x] = |
1da177e4c Linux-2.6.12-rc2 |
220 |
{ |
eca25dca1 libata: convert d... |
221 222 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_SATA_PATA, |
14bdef982 [libata] convert ... |
223 224 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
225 |
.udma_mask = ATA_UDMA6, |
95006188c sata_promise: ATA... |
226 |
.port_ops = &pdc_old_sata_ops, |
1da177e4c Linux-2.6.12-rc2 |
227 |
}, |
5595ddf98 sata_promise: cle... |
228 |
[board_2037x_pata] = |
eca25dca1 libata: convert d... |
229 230 |
{ .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS, |
14bdef982 [libata] convert ... |
231 232 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
233 |
.udma_mask = ATA_UDMA6, |
eca25dca1 libata: convert d... |
234 235 |
.port_ops = &pdc_pata_ops, }, |
5595ddf98 sata_promise: cle... |
236 |
[board_20319] = |
1da177e4c Linux-2.6.12-rc2 |
237 |
{ |
eca25dca1 libata: convert d... |
238 239 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_4_PORTS, |
14bdef982 [libata] convert ... |
240 241 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
242 |
.udma_mask = ATA_UDMA6, |
95006188c sata_promise: ATA... |
243 |
.port_ops = &pdc_old_sata_ops, |
1da177e4c Linux-2.6.12-rc2 |
244 |
}, |
f497ba735 [libata sata_prom... |
245 |
|
5595ddf98 sata_promise: cle... |
246 |
[board_20619] = |
f497ba735 [libata sata_prom... |
247 |
{ |
eca25dca1 libata: convert d... |
248 249 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | PDC_FLAG_4_PORTS, |
14bdef982 [libata] convert ... |
250 251 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
252 |
.udma_mask = ATA_UDMA6, |
2cba582a4 [libata sata_prom... |
253 |
.port_ops = &pdc_pata_ops, |
f497ba735 [libata sata_prom... |
254 |
}, |
5a46fe89a [libata] sata_pro... |
255 |
|
5595ddf98 sata_promise: cle... |
256 |
[board_2057x] = |
6340f0196 [libata sata_prom... |
257 |
{ |
eca25dca1 libata: convert d... |
258 259 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA, |
14bdef982 [libata] convert ... |
260 261 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
262 |
.udma_mask = ATA_UDMA6, |
6340f0196 [libata sata_prom... |
263 264 |
.port_ops = &pdc_sata_ops, }, |
5595ddf98 sata_promise: cle... |
265 |
[board_2057x_pata] = |
eca25dca1 libata: convert d... |
266 |
{ |
bb3122359 [libata] sata_pro... |
267 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | |
eca25dca1 libata: convert d... |
268 |
PDC_FLAG_GEN_II, |
14bdef982 [libata] convert ... |
269 270 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
271 |
.udma_mask = ATA_UDMA6, |
eca25dca1 libata: convert d... |
272 273 |
.port_ops = &pdc_pata_ops, }, |
5595ddf98 sata_promise: cle... |
274 |
[board_40518] = |
6340f0196 [libata sata_prom... |
275 |
{ |
eca25dca1 libata: convert d... |
276 277 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS, |
14bdef982 [libata] convert ... |
278 279 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
469248abf [libata] Clean up... |
280 |
.udma_mask = ATA_UDMA6, |
6340f0196 [libata sata_prom... |
281 282 |
.port_ops = &pdc_sata_ops, }, |
1da177e4c Linux-2.6.12-rc2 |
283 |
}; |
3b7d697df [libata] constify... |
284 |
static const struct pci_device_id pdc_ata_pci_tbl[] = { |
54bb3a94b [libata] Use new ... |
285 |
{ PCI_VDEVICE(PROMISE, 0x3371), board_2037x }, |
54bb3a94b [libata] Use new ... |
286 287 288 |
{ PCI_VDEVICE(PROMISE, 0x3373), board_2037x }, { PCI_VDEVICE(PROMISE, 0x3375), board_2037x }, { PCI_VDEVICE(PROMISE, 0x3376), board_2037x }, |
b2d1eee1e [PATCH] sata_prom... |
289 290 |
{ PCI_VDEVICE(PROMISE, 0x3570), board_2057x }, { PCI_VDEVICE(PROMISE, 0x3571), board_2057x }, |
54bb3a94b [libata] Use new ... |
291 |
{ PCI_VDEVICE(PROMISE, 0x3574), board_2057x }, |
d324d4627 [PATCH] sata_prom... |
292 |
{ PCI_VDEVICE(PROMISE, 0x3577), board_2057x }, |
b2d1eee1e [PATCH] sata_prom... |
293 |
{ PCI_VDEVICE(PROMISE, 0x3d73), board_2057x }, |
54bb3a94b [libata] Use new ... |
294 |
{ PCI_VDEVICE(PROMISE, 0x3d75), board_2057x }, |
54bb3a94b [libata] Use new ... |
295 296 297 |
{ PCI_VDEVICE(PROMISE, 0x3318), board_20319 }, { PCI_VDEVICE(PROMISE, 0x3319), board_20319 }, |
7f9992a23 sata_promise: Fas... |
298 299 |
{ PCI_VDEVICE(PROMISE, 0x3515), board_40518 }, { PCI_VDEVICE(PROMISE, 0x3519), board_40518 }, |
b2d1eee1e [PATCH] sata_prom... |
300 |
{ PCI_VDEVICE(PROMISE, 0x3d17), board_40518 }, |
54bb3a94b [libata] Use new ... |
301 302 303 |
{ PCI_VDEVICE(PROMISE, 0x3d18), board_40518 }, { PCI_VDEVICE(PROMISE, 0x6629), board_20619 }, |
f497ba735 [libata sata_prom... |
304 |
|
1da177e4c Linux-2.6.12-rc2 |
305 306 |
{ } /* terminate list */ }; |
1da177e4c Linux-2.6.12-rc2 |
307 308 309 310 311 312 |
static struct pci_driver pdc_ata_pci_driver = { .name = DRV_NAME, .id_table = pdc_ata_pci_tbl, .probe = pdc_ata_init_one, .remove = ata_pci_remove_one, }; |
724114a57 sata_promise: sep... |
313 |
static int pdc_common_port_start(struct ata_port *ap) |
1da177e4c Linux-2.6.12-rc2 |
314 |
{ |
cca3974e4 libata: Grand ren... |
315 |
struct device *dev = ap->host->dev; |
1da177e4c Linux-2.6.12-rc2 |
316 317 |
struct pdc_port_priv *pp; int rc; |
c7087652e libata-sff: clean... |
318 319 |
/* we use the same prd table as bmdma, allocate it */ rc = ata_bmdma_port_start(ap); |
1da177e4c Linux-2.6.12-rc2 |
320 321 |
if (rc) return rc; |
24dc5f33e libata: update li... |
322 323 324 |
pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); if (!pp) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
325 |
|
24dc5f33e libata: update li... |
326 327 328 |
pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL); if (!pp->pkt) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
329 330 |
ap->private_data = pp; |
724114a57 sata_promise: sep... |
331 332 333 334 335 |
return 0; } static int pdc_sata_port_start(struct ata_port *ap) { |
724114a57 sata_promise: sep... |
336 337 338 339 340 |
int rc; rc = pdc_common_port_start(ap); if (rc) return rc; |
599b7202c [PATCH] sata_prom... |
341 |
/* fix up PHYMODE4 align timing */ |
eca25dca1 libata: convert d... |
342 |
if (ap->flags & PDC_FLAG_GEN_II) { |
821d22cdc sata_promise: mmi... |
343 |
void __iomem *sata_mmio = ap->ioaddr.scr_addr; |
599b7202c [PATCH] sata_prom... |
344 |
unsigned int tmp; |
821d22cdc sata_promise: mmi... |
345 |
tmp = readl(sata_mmio + PDC_PHYMODE4); |
599b7202c [PATCH] sata_prom... |
346 |
tmp = (tmp & ~3) | 1; /* set bits 1:0 = 0:1 */ |
821d22cdc sata_promise: mmi... |
347 |
writel(tmp, sata_mmio + PDC_PHYMODE4); |
599b7202c [PATCH] sata_prom... |
348 |
} |
1da177e4c Linux-2.6.12-rc2 |
349 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
350 |
} |
ff7cddf59 sata_promise: upd... |
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
static void pdc_fpdma_clear_interrupt_flag(struct ata_port *ap) { void __iomem *sata_mmio = ap->ioaddr.scr_addr; u32 tmp; tmp = readl(sata_mmio + PDC_FPDMA_CTLSTAT); tmp |= PDC_FPDMA_CTLSTAT_DMASETUP_INT_FLAG; tmp |= PDC_FPDMA_CTLSTAT_SETDB_INT_FLAG; /* It's not allowed to write to the entire FPDMA_CTLSTAT register when NCQ is running. So do a byte-sized write to bits 10 and 11. */ writeb(tmp >> 8, sata_mmio + PDC_FPDMA_CTLSTAT + 1); readb(sata_mmio + PDC_FPDMA_CTLSTAT + 1); /* flush */ } static void pdc_fpdma_reset(struct ata_port *ap) { void __iomem *sata_mmio = ap->ioaddr.scr_addr; u8 tmp; tmp = (u8)readl(sata_mmio + PDC_FPDMA_CTLSTAT); tmp &= 0x7F; tmp |= PDC_FPDMA_CTLSTAT_RESET; writeb(tmp, sata_mmio + PDC_FPDMA_CTLSTAT); readl(sata_mmio + PDC_FPDMA_CTLSTAT); /* flush */ udelay(100); tmp &= ~PDC_FPDMA_CTLSTAT_RESET; writeb(tmp, sata_mmio + PDC_FPDMA_CTLSTAT); readl(sata_mmio + PDC_FPDMA_CTLSTAT); /* flush */ pdc_fpdma_clear_interrupt_flag(ap); } static void pdc_not_at_command_packet_phase(struct ata_port *ap) { void __iomem *sata_mmio = ap->ioaddr.scr_addr; unsigned int i; u32 tmp; /* check not at ASIC packet command phase */ for (i = 0; i < 100; ++i) { writel(0, sata_mmio + PDC_INTERNAL_DEBUG_1); tmp = readl(sata_mmio + PDC_INTERNAL_DEBUG_2); if ((tmp & 0xF) != 1) break; udelay(100); } } static void pdc_clear_internal_debug_record_error_register(struct ata_port *ap) { void __iomem *sata_mmio = ap->ioaddr.scr_addr; writel(0xffffffff, sata_mmio + PDC_SATA_ERROR); writel(0xffff0000, sata_mmio + PDC_LINK_LAYER_ERRORS); } |
1da177e4c Linux-2.6.12-rc2 |
407 408 |
static void pdc_reset_port(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
409 |
void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT; |
1da177e4c Linux-2.6.12-rc2 |
410 411 |
unsigned int i; u32 tmp; |
ff7cddf59 sata_promise: upd... |
412 413 414 415 416 417 |
if (ap->flags & PDC_FLAG_GEN_II) pdc_not_at_command_packet_phase(ap); tmp = readl(ata_ctlstat_mmio); tmp |= PDC_RESET; writel(tmp, ata_ctlstat_mmio); |
1da177e4c Linux-2.6.12-rc2 |
418 |
for (i = 11; i > 0; i--) { |
821d22cdc sata_promise: mmi... |
419 |
tmp = readl(ata_ctlstat_mmio); |
1da177e4c Linux-2.6.12-rc2 |
420 421 422 423 424 425 |
if (tmp & PDC_RESET) break; udelay(100); tmp |= PDC_RESET; |
821d22cdc sata_promise: mmi... |
426 |
writel(tmp, ata_ctlstat_mmio); |
1da177e4c Linux-2.6.12-rc2 |
427 428 429 |
} tmp &= ~PDC_RESET; |
821d22cdc sata_promise: mmi... |
430 431 |
writel(tmp, ata_ctlstat_mmio); readl(ata_ctlstat_mmio); /* flush */ |
ff7cddf59 sata_promise: upd... |
432 433 434 435 436 |
if (sata_scr_valid(&ap->link) && (ap->flags & PDC_FLAG_GEN_II)) { pdc_fpdma_reset(ap); pdc_clear_internal_debug_record_error_register(ap); } |
1da177e4c Linux-2.6.12-rc2 |
437 |
} |
724114a57 sata_promise: sep... |
438 |
static int pdc_pata_cable_detect(struct ata_port *ap) |
2cba582a4 [libata sata_prom... |
439 |
{ |
d3fb4e8dd [libata sata_prom... |
440 |
u8 tmp; |
821d22cdc sata_promise: mmi... |
441 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
d3fb4e8dd [libata sata_prom... |
442 |
|
821d22cdc sata_promise: mmi... |
443 |
tmp = readb(ata_mmio + PDC_CTLSTAT + 3); |
724114a57 sata_promise: sep... |
444 445 446 447 448 449 450 |
if (tmp & 0x01) return ATA_CBL_PATA40; return ATA_CBL_PATA80; } static int pdc_sata_cable_detect(struct ata_port *ap) { |
e2a9752a2 sata_promise: Swi... |
451 |
return ATA_CBL_SATA; |
d3fb4e8dd [libata sata_prom... |
452 |
} |
2cba582a4 [libata sata_prom... |
453 |
|
82ef04fb4 libata: make SCR ... |
454 455 |
static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) |
1da177e4c Linux-2.6.12-rc2 |
456 |
{ |
724114a57 sata_promise: sep... |
457 |
if (sc_reg > SCR_CONTROL) |
da3dbb17a libata: make ->sc... |
458 |
return -EINVAL; |
82ef04fb4 libata: make SCR ... |
459 |
*val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); |
da3dbb17a libata: make ->sc... |
460 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
461 |
} |
82ef04fb4 libata: make SCR ... |
462 463 |
static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) |
1da177e4c Linux-2.6.12-rc2 |
464 |
{ |
724114a57 sata_promise: sep... |
465 |
if (sc_reg > SCR_CONTROL) |
da3dbb17a libata: make ->sc... |
466 |
return -EINVAL; |
82ef04fb4 libata: make SCR ... |
467 |
writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); |
da3dbb17a libata: make ->sc... |
468 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
469 |
} |
fba6edbd3 sata_promise: han... |
470 |
static void pdc_atapi_pkt(struct ata_queued_cmd *qc) |
95006188c sata_promise: ATA... |
471 |
{ |
4113bb6b6 sata_promise: iss... |
472 |
struct ata_port *ap = qc->ap; |
f60d70113 libata-sff: prd i... |
473 |
dma_addr_t sg_table = ap->bmdma_prd_dma; |
4113bb6b6 sata_promise: iss... |
474 475 476 477 |
unsigned int cdb_len = qc->dev->cdb_len; u8 *cdb = qc->cdb; struct pdc_port_priv *pp = ap->private_data; u8 *buf = pp->pkt; |
826cd156d libata annotations |
478 |
__le32 *buf32 = (__le32 *) buf; |
46a671430 sata_promise: mak... |
479 |
unsigned int dev_sel, feature; |
95006188c sata_promise: ATA... |
480 481 482 483 |
/* set control bits (byte 0), zero delay seq id (byte 3), * and seq id (byte 2) */ |
fba6edbd3 sata_promise: han... |
484 |
switch (qc->tf.protocol) { |
0dc36888d libata: rename AT... |
485 |
case ATAPI_PROT_DMA: |
fba6edbd3 sata_promise: han... |
486 487 488 489 490 |
if (!(qc->tf.flags & ATA_TFLAG_WRITE)) buf32[0] = cpu_to_le32(PDC_PKT_READ); else buf32[0] = 0; break; |
0dc36888d libata: rename AT... |
491 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
492 493 494 495 496 497 |
buf32[0] = cpu_to_le32(PDC_PKT_NODATA); break; default: BUG(); break; } |
95006188c sata_promise: ATA... |
498 499 |
buf32[1] = cpu_to_le32(sg_table); /* S/G table addr */ buf32[2] = 0; /* no next-packet */ |
4113bb6b6 sata_promise: iss... |
500 |
/* select drive */ |
46a671430 sata_promise: mak... |
501 |
if (sata_scr_valid(&ap->link)) |
4113bb6b6 sata_promise: iss... |
502 |
dev_sel = PDC_DEVICE_SATA; |
46a671430 sata_promise: mak... |
503 504 |
else dev_sel = qc->tf.device; |
4113bb6b6 sata_promise: iss... |
505 506 507 508 509 510 |
buf[12] = (1 << 5) | ATA_REG_DEVICE; buf[13] = dev_sel; buf[14] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_CLEAR_BSY; buf[15] = dev_sel; /* once more, waiting for BSY to clear */ buf[16] = (1 << 5) | ATA_REG_NSECT; |
46a671430 sata_promise: mak... |
511 |
buf[17] = qc->tf.nsect; |
4113bb6b6 sata_promise: iss... |
512 |
buf[18] = (1 << 5) | ATA_REG_LBAL; |
46a671430 sata_promise: mak... |
513 |
buf[19] = qc->tf.lbal; |
4113bb6b6 sata_promise: iss... |
514 515 |
/* set feature and byte counter registers */ |
0dc36888d libata: rename AT... |
516 |
if (qc->tf.protocol != ATAPI_PROT_DMA) |
4113bb6b6 sata_promise: iss... |
517 |
feature = PDC_FEATURE_ATAPI_PIO; |
46a671430 sata_promise: mak... |
518 |
else |
4113bb6b6 sata_promise: iss... |
519 |
feature = PDC_FEATURE_ATAPI_DMA; |
46a671430 sata_promise: mak... |
520 |
|
4113bb6b6 sata_promise: iss... |
521 522 523 |
buf[20] = (1 << 5) | ATA_REG_FEATURE; buf[21] = feature; buf[22] = (1 << 5) | ATA_REG_BYTEL; |
46a671430 sata_promise: mak... |
524 |
buf[23] = qc->tf.lbam; |
4113bb6b6 sata_promise: iss... |
525 |
buf[24] = (1 << 5) | ATA_REG_BYTEH; |
46a671430 sata_promise: mak... |
526 |
buf[25] = qc->tf.lbah; |
4113bb6b6 sata_promise: iss... |
527 528 529 |
/* send ATAPI packet command 0xA0 */ buf[26] = (1 << 5) | ATA_REG_CMD; |
46a671430 sata_promise: mak... |
530 |
buf[27] = qc->tf.command; |
4113bb6b6 sata_promise: iss... |
531 532 533 534 |
/* select drive and check DRQ */ buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY; buf[29] = dev_sel; |
95006188c sata_promise: ATA... |
535 536 |
/* we can represent cdb lengths 2/4/6/8/10/12/14/16 */ BUG_ON(cdb_len & ~0x1E); |
4113bb6b6 sata_promise: iss... |
537 538 539 |
/* append the CDB as the final part */ buf[30] = (((cdb_len >> 1) & 7) << 5) | ATA_REG_DATA | PDC_LAST_REG; memcpy(buf+31, cdb, cdb_len); |
95006188c sata_promise: ATA... |
540 |
} |
b9ccd4a90 sata_promise: ASI... |
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 |
/** * pdc_fill_sg - Fill PCI IDE PRD table * @qc: Metadata associated with taskfile to be transferred * * Fill PCI IDE PRD (scatter-gather) table with segments * associated with the current disk command. * Make sure hardware does not choke on it. * * LOCKING: * spin_lock_irqsave(host lock) * */ static void pdc_fill_sg(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; |
f60d70113 libata-sff: prd i... |
556 |
struct ata_bmdma_prd *prd = ap->bmdma_prd; |
b9ccd4a90 sata_promise: ASI... |
557 |
struct scatterlist *sg; |
b9ccd4a90 sata_promise: ASI... |
558 |
const u32 SG_COUNT_ASIC_BUG = 41*4; |
ff2aeb1eb libata: convert t... |
559 560 |
unsigned int si, idx; u32 len; |
b9ccd4a90 sata_promise: ASI... |
561 562 563 |
if (!(qc->flags & ATA_QCFLAG_DMAMAP)) return; |
b9ccd4a90 sata_promise: ASI... |
564 |
idx = 0; |
ff2aeb1eb libata: convert t... |
565 |
for_each_sg(qc->sg, sg, qc->n_elem, si) { |
b9ccd4a90 sata_promise: ASI... |
566 |
u32 addr, offset; |
6903c0f7e ata: fix sparse w... |
567 |
u32 sg_len; |
b9ccd4a90 sata_promise: ASI... |
568 569 570 571 572 573 574 575 576 577 578 579 580 |
/* determine if physical DMA addr spans 64K boundary. * Note h/w doesn't support 64-bit, so we unconditionally * truncate dma_addr_t to u32. */ addr = (u32) sg_dma_address(sg); sg_len = sg_dma_len(sg); while (sg_len) { offset = addr & 0xffff; len = sg_len; if ((offset + sg_len) > 0x10000) len = 0x10000 - offset; |
f60d70113 libata-sff: prd i... |
581 582 |
prd[idx].addr = cpu_to_le32(addr); prd[idx].flags_len = cpu_to_le32(len & 0xffff); |
b9ccd4a90 sata_promise: ASI... |
583 584 585 586 587 588 589 590 |
VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx, addr, len); idx++; sg_len -= len; addr += len; } } |
f60d70113 libata-sff: prd i... |
591 |
len = le32_to_cpu(prd[idx - 1].flags_len); |
b9ccd4a90 sata_promise: ASI... |
592 |
|
ff2aeb1eb libata: convert t... |
593 594 |
if (len > SG_COUNT_ASIC_BUG) { u32 addr; |
b9ccd4a90 sata_promise: ASI... |
595 |
|
ff2aeb1eb libata: convert t... |
596 597 |
VPRINTK("Splitting last PRD. "); |
b9ccd4a90 sata_promise: ASI... |
598 |
|
f60d70113 libata-sff: prd i... |
599 600 |
addr = le32_to_cpu(prd[idx - 1].addr); prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG); |
ff2aeb1eb libata: convert t... |
601 602 |
VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx - 1, addr, SG_COUNT_ASIC_BUG); |
b9ccd4a90 sata_promise: ASI... |
603 |
|
ff2aeb1eb libata: convert t... |
604 605 |
addr = addr + len - SG_COUNT_ASIC_BUG; len = SG_COUNT_ASIC_BUG; |
f60d70113 libata-sff: prd i... |
606 607 |
prd[idx].addr = cpu_to_le32(addr); prd[idx].flags_len = cpu_to_le32(len); |
ff2aeb1eb libata: convert t... |
608 609 |
VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx, addr, len); |
b9ccd4a90 sata_promise: ASI... |
610 |
|
ff2aeb1eb libata: convert t... |
611 |
idx++; |
b9ccd4a90 sata_promise: ASI... |
612 |
} |
ff2aeb1eb libata: convert t... |
613 |
|
f60d70113 libata-sff: prd i... |
614 |
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
b9ccd4a90 sata_promise: ASI... |
615 |
} |
1da177e4c Linux-2.6.12-rc2 |
616 617 618 619 620 621 622 623 624 625 |
static void pdc_qc_prep(struct ata_queued_cmd *qc) { struct pdc_port_priv *pp = qc->ap->private_data; unsigned int i; VPRINTK("ENTER "); switch (qc->tf.protocol) { case ATA_PROT_DMA: |
b9ccd4a90 sata_promise: ASI... |
626 |
pdc_fill_sg(qc); |
7715a6f9c sata_promise: oth... |
627 |
/*FALLTHROUGH*/ |
1da177e4c Linux-2.6.12-rc2 |
628 |
case ATA_PROT_NODATA: |
f60d70113 libata-sff: prd i... |
629 |
i = pdc_pkt_header(&qc->tf, qc->ap->bmdma_prd_dma, |
1da177e4c Linux-2.6.12-rc2 |
630 |
qc->dev->devno, pp->pkt); |
1da177e4c Linux-2.6.12-rc2 |
631 632 633 634 |
if (qc->tf.flags & ATA_TFLAG_LBA48) i = pdc_prep_lba48(&qc->tf, pp->pkt, i); else i = pdc_prep_lba28(&qc->tf, pp->pkt, i); |
1da177e4c Linux-2.6.12-rc2 |
635 636 |
pdc_pkt_footer(&qc->tf, pp->pkt, i); break; |
0dc36888d libata: rename AT... |
637 |
case ATAPI_PROT_PIO: |
b9ccd4a90 sata_promise: ASI... |
638 |
pdc_fill_sg(qc); |
95006188c sata_promise: ATA... |
639 |
break; |
0dc36888d libata: rename AT... |
640 |
case ATAPI_PROT_DMA: |
b9ccd4a90 sata_promise: ASI... |
641 |
pdc_fill_sg(qc); |
fba6edbd3 sata_promise: han... |
642 |
/*FALLTHROUGH*/ |
0dc36888d libata: rename AT... |
643 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
644 |
pdc_atapi_pkt(qc); |
95006188c sata_promise: ATA... |
645 |
break; |
1da177e4c Linux-2.6.12-rc2 |
646 647 648 649 |
default: break; } } |
c07a9c499 sata_promise: fix... |
650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 |
static int pdc_is_sataii_tx4(unsigned long flags) { const unsigned long mask = PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS; return (flags & mask) == mask; } static unsigned int pdc_port_no_to_ata_no(unsigned int port_no, int is_sataii_tx4) { static const unsigned char sataii_tx4_port_remap[4] = { 3, 1, 0, 2}; return is_sataii_tx4 ? sataii_tx4_port_remap[port_no] : port_no; } static unsigned int pdc_sata_nr_ports(const struct ata_port *ap) { return (ap->flags & PDC_FLAG_4_PORTS) ? 4 : 2; } static unsigned int pdc_sata_ata_port_to_ata_no(const struct ata_port *ap) { const struct ata_host *host = ap->host; unsigned int nr_ports = pdc_sata_nr_ports(ap); unsigned int i; |
7715a6f9c sata_promise: oth... |
673 |
for (i = 0; i < nr_ports && host->ports[i] != ap; ++i) |
c07a9c499 sata_promise: fix... |
674 675 676 677 |
; BUG_ON(i >= nr_ports); return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags)); } |
25b93d81b [PATCH] sata_prom... |
678 679 |
static void pdc_freeze(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
680 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
25b93d81b [PATCH] sata_prom... |
681 |
u32 tmp; |
821d22cdc sata_promise: mmi... |
682 |
tmp = readl(ata_mmio + PDC_CTLSTAT); |
25b93d81b [PATCH] sata_prom... |
683 684 |
tmp |= PDC_IRQ_DISABLE; tmp &= ~PDC_DMA_ENABLE; |
821d22cdc sata_promise: mmi... |
685 686 |
writel(tmp, ata_mmio + PDC_CTLSTAT); readl(ata_mmio + PDC_CTLSTAT); /* flush */ |
25b93d81b [PATCH] sata_prom... |
687 |
} |
c07a9c499 sata_promise: fix... |
688 689 690 691 |
static void pdc_sata_freeze(struct ata_port *ap) { struct ata_host *host = ap->host; void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; |
0ae6654da sata_promise: dis... |
692 |
unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR; |
c07a9c499 sata_promise: fix... |
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 |
unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap); u32 hotplug_status; /* Disable hotplug events on this port. * * Locking: * 1) hotplug register accesses must be serialised via host->lock * 2) ap->lock == &ap->host->lock * 3) ->freeze() and ->thaw() are called with ap->lock held */ hotplug_status = readl(host_mmio + hotplug_offset); hotplug_status |= 0x11 << (ata_no + 16); writel(hotplug_status, host_mmio + hotplug_offset); readl(host_mmio + hotplug_offset); /* flush */ pdc_freeze(ap); } |
25b93d81b [PATCH] sata_prom... |
710 711 |
static void pdc_thaw(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
712 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
25b93d81b [PATCH] sata_prom... |
713 714 715 |
u32 tmp; /* clear IRQ */ |
821d22cdc sata_promise: mmi... |
716 |
readl(ata_mmio + PDC_COMMAND); |
25b93d81b [PATCH] sata_prom... |
717 718 |
/* turn IRQ back on */ |
821d22cdc sata_promise: mmi... |
719 |
tmp = readl(ata_mmio + PDC_CTLSTAT); |
25b93d81b [PATCH] sata_prom... |
720 |
tmp &= ~PDC_IRQ_DISABLE; |
821d22cdc sata_promise: mmi... |
721 722 |
writel(tmp, ata_mmio + PDC_CTLSTAT); readl(ata_mmio + PDC_CTLSTAT); /* flush */ |
25b93d81b [PATCH] sata_prom... |
723 |
} |
c07a9c499 sata_promise: fix... |
724 725 726 727 |
static void pdc_sata_thaw(struct ata_port *ap) { struct ata_host *host = ap->host; void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; |
0ae6654da sata_promise: dis... |
728 |
unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR; |
c07a9c499 sata_promise: fix... |
729 730 731 732 733 734 735 736 737 738 739 740 741 742 |
unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap); u32 hotplug_status; pdc_thaw(ap); /* Enable hotplug events on this port. * Locking: see pdc_sata_freeze(). */ hotplug_status = readl(host_mmio + hotplug_offset); hotplug_status |= 0x11 << ata_no; hotplug_status &= ~(0x11 << (ata_no + 16)); writel(hotplug_status, host_mmio + hotplug_offset); readl(host_mmio + hotplug_offset); /* flush */ } |
cadef677e sata_promise: add... |
743 744 745 746 747 748 |
static int pdc_pata_softreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { pdc_reset_port(link->ap); return ata_sff_softreset(link, class, deadline); } |
ff7cddf59 sata_promise: upd... |
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 |
static unsigned int pdc_ata_port_to_ata_no(const struct ata_port *ap) { void __iomem *ata_mmio = ap->ioaddr.cmd_addr; void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; /* ata_mmio == host_mmio + 0x200 + ata_no * 0x80 */ return (ata_mmio - host_mmio - 0x200) / 0x80; } static void pdc_hard_reset_port(struct ata_port *ap) { void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; void __iomem *pcictl_b1_mmio = host_mmio + PDC_PCI_CTL + 1; unsigned int ata_no = pdc_ata_port_to_ata_no(ap); u8 tmp; spin_lock(&ap->host->lock); tmp = readb(pcictl_b1_mmio); tmp &= ~(0x10 << ata_no); writeb(tmp, pcictl_b1_mmio); readb(pcictl_b1_mmio); /* flush */ udelay(100); tmp |= (0x10 << ata_no); writeb(tmp, pcictl_b1_mmio); readb(pcictl_b1_mmio); /* flush */ spin_unlock(&ap->host->lock); } |
cadef677e sata_promise: add... |
778 779 780 |
static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { |
ff7cddf59 sata_promise: upd... |
781 782 783 784 |
if (link->ap->flags & PDC_FLAG_GEN_II) pdc_not_at_command_packet_phase(link->ap); /* hotplug IRQs should have been masked by pdc_sata_freeze() */ pdc_hard_reset_port(link->ap); |
cadef677e sata_promise: add... |
785 |
pdc_reset_port(link->ap); |
ff7cddf59 sata_promise: upd... |
786 787 788 789 790 791 |
/* sata_promise can't reliably acquire the first D2H Reg FIS * after hardreset. Do non-waiting hardreset and request * follow-up SRST. */ return sata_std_hardreset(link, class, deadline); |
cadef677e sata_promise: add... |
792 |
} |
a1efdaba2 libata: make rese... |
793 |
static void pdc_error_handler(struct ata_port *ap) |
25b93d81b [PATCH] sata_prom... |
794 |
{ |
25b93d81b [PATCH] sata_prom... |
795 796 |
if (!(ap->pflags & ATA_PFLAG_FROZEN)) pdc_reset_port(ap); |
fe06e5f9b libata-sff: separ... |
797 |
ata_sff_error_handler(ap); |
724114a57 sata_promise: sep... |
798 |
} |
25b93d81b [PATCH] sata_prom... |
799 800 801 |
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; |
25b93d81b [PATCH] sata_prom... |
802 |
/* make DMA engine forget about the failed command */ |
a51d644af libata: improve A... |
803 |
if (qc->flags & ATA_QCFLAG_FAILED) |
25b93d81b [PATCH] sata_prom... |
804 805 |
pdc_reset_port(ap); } |
176efb054 sata_promise: dec... |
806 807 808 |
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc, u32 port_status, u32 err_mask) { |
9af5c9c97 libata-link: intr... |
809 |
struct ata_eh_info *ehi = &ap->link.eh_info; |
176efb054 sata_promise: dec... |
810 811 812 813 814 815 816 817 818 |
unsigned int ac_err_mask = 0; ata_ehi_clear_desc(ehi); ata_ehi_push_desc(ehi, "port_status 0x%08x", port_status); port_status &= err_mask; if (port_status & PDC_DRIVE_ERR) ac_err_mask |= AC_ERR_DEV; if (port_status & (PDC_OVERRUN_ERR | PDC_UNDERRUN_ERR)) |
a2342f464 sata_promise: don... |
819 |
ac_err_mask |= AC_ERR_OTHER; |
176efb054 sata_promise: dec... |
820 821 822 823 824 |
if (port_status & (PDC2_ATA_HBA_ERR | PDC2_ATA_DMA_CNT_ERR)) ac_err_mask |= AC_ERR_ATA_BUS; if (port_status & (PDC_PH_ERR | PDC_SH_ERR | PDC_DH_ERR | PDC2_HTO_ERR | PDC_PCI_SYS_ERR | PDC1_PCI_PARITY_ERR)) ac_err_mask |= AC_ERR_HOST_BUS; |
936fd7328 libata-link: link... |
825 |
if (sata_scr_valid(&ap->link)) { |
da3dbb17a libata: make ->sc... |
826 |
u32 serror; |
82ef04fb4 libata: make SCR ... |
827 |
pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror); |
da3dbb17a libata: make ->sc... |
828 829 |
ehi->serror |= serror; } |
ce2d3abc2 sata_promise: fix... |
830 |
|
176efb054 sata_promise: dec... |
831 |
qc->err_mask |= ac_err_mask; |
ce2d3abc2 sata_promise: fix... |
832 833 |
pdc_reset_port(ap); |
8ffcfd9d0 sata_promise: fix... |
834 835 |
ata_port_abort(ap); |
176efb054 sata_promise: dec... |
836 |
} |
7715a6f9c sata_promise: oth... |
837 838 |
static unsigned int pdc_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
839 |
{ |
a22e2eb07 [PATCH] libata: m... |
840 |
unsigned int handled = 0; |
821d22cdc sata_promise: mmi... |
841 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
176efb054 sata_promise: dec... |
842 843 844 |
u32 port_status, err_mask; err_mask = PDC_ERR_MASK; |
eca25dca1 libata: convert d... |
845 |
if (ap->flags & PDC_FLAG_GEN_II) |
176efb054 sata_promise: dec... |
846 847 848 |
err_mask &= ~PDC1_ERR_MASK; else err_mask &= ~PDC2_ERR_MASK; |
821d22cdc sata_promise: mmi... |
849 |
port_status = readl(ata_mmio + PDC_GLOBAL_CTL); |
176efb054 sata_promise: dec... |
850 851 852 |
if (unlikely(port_status & err_mask)) { pdc_error_intr(ap, qc, port_status, err_mask); return 1; |
1da177e4c Linux-2.6.12-rc2 |
853 854 855 856 857 |
} switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: |
0dc36888d libata: rename AT... |
858 859 |
case ATAPI_PROT_DMA: case ATAPI_PROT_NODATA: |
a22e2eb07 [PATCH] libata: m... |
860 861 |
qc->err_mask |= ac_err_mask(ata_wait_idle(ap)); ata_qc_complete(qc); |
1da177e4c Linux-2.6.12-rc2 |
862 863 |
handled = 1; break; |
d0e580316 sata_promise: cle... |
864 |
default: |
ee500aabf [PATCH] libata: i... |
865 866 |
ap->stats.idle_irq++; break; |
d0e580316 sata_promise: cle... |
867 |
} |
1da177e4c Linux-2.6.12-rc2 |
868 |
|
ee500aabf [PATCH] libata: i... |
869 |
return handled; |
1da177e4c Linux-2.6.12-rc2 |
870 871 872 873 |
} static void pdc_irq_clear(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
874 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
1da177e4c Linux-2.6.12-rc2 |
875 |
|
821d22cdc sata_promise: mmi... |
876 |
readl(ata_mmio + PDC_COMMAND); |
1da177e4c Linux-2.6.12-rc2 |
877 |
} |
5796d1c4c [libata] Address ... |
878 |
static irqreturn_t pdc_interrupt(int irq, void *dev_instance) |
1da177e4c Linux-2.6.12-rc2 |
879 |
{ |
cca3974e4 libata: Grand ren... |
880 |
struct ata_host *host = dev_instance; |
1da177e4c Linux-2.6.12-rc2 |
881 882 883 884 |
struct ata_port *ap; u32 mask = 0; unsigned int i, tmp; unsigned int handled = 0; |
821d22cdc sata_promise: mmi... |
885 |
void __iomem *host_mmio; |
a77720ad0 sata_promise: SAT... |
886 887 888 |
unsigned int hotplug_offset, ata_no; u32 hotplug_status; int is_sataii_tx4; |
1da177e4c Linux-2.6.12-rc2 |
889 890 891 |
VPRINTK("ENTER "); |
0d5ff5667 libata: convert t... |
892 |
if (!host || !host->iomap[PDC_MMIO_BAR]) { |
1da177e4c Linux-2.6.12-rc2 |
893 894 895 896 |
VPRINTK("QUICK EXIT "); return IRQ_NONE; } |
821d22cdc sata_promise: mmi... |
897 |
host_mmio = host->iomap[PDC_MMIO_BAR]; |
1da177e4c Linux-2.6.12-rc2 |
898 |
|
c07a9c499 sata_promise: fix... |
899 |
spin_lock(&host->lock); |
a77720ad0 sata_promise: SAT... |
900 |
/* read and clear hotplug flags for all ports */ |
0ae6654da sata_promise: dis... |
901 |
if (host->ports[0]->flags & PDC_FLAG_GEN_II) { |
a77720ad0 sata_promise: SAT... |
902 |
hotplug_offset = PDC2_SATA_PLUG_CSR; |
0ae6654da sata_promise: dis... |
903 904 905 906 907 908 |
hotplug_status = readl(host_mmio + hotplug_offset); if (hotplug_status & 0xff) writel(hotplug_status | 0xff, host_mmio + hotplug_offset); hotplug_status &= 0xff; /* clear uninteresting bits */ } else hotplug_status = 0; |
a77720ad0 sata_promise: SAT... |
909 |
|
1da177e4c Linux-2.6.12-rc2 |
910 |
/* reading should also clear interrupts */ |
821d22cdc sata_promise: mmi... |
911 |
mask = readl(host_mmio + PDC_INT_SEQMASK); |
1da177e4c Linux-2.6.12-rc2 |
912 |
|
a77720ad0 sata_promise: SAT... |
913 |
if (mask == 0xffffffff && hotplug_status == 0) { |
1da177e4c Linux-2.6.12-rc2 |
914 915 |
VPRINTK("QUICK EXIT 2 "); |
c07a9c499 sata_promise: fix... |
916 |
goto done_irq; |
1da177e4c Linux-2.6.12-rc2 |
917 |
} |
6340f0196 [libata sata_prom... |
918 |
|
7715a6f9c sata_promise: oth... |
919 |
mask &= 0xffff; /* only 16 SEQIDs possible */ |
a77720ad0 sata_promise: SAT... |
920 |
if (mask == 0 && hotplug_status == 0) { |
1da177e4c Linux-2.6.12-rc2 |
921 922 |
VPRINTK("QUICK EXIT 3 "); |
6340f0196 [libata sata_prom... |
923 |
goto done_irq; |
1da177e4c Linux-2.6.12-rc2 |
924 |
} |
821d22cdc sata_promise: mmi... |
925 |
writel(mask, host_mmio + PDC_INT_SEQMASK); |
1da177e4c Linux-2.6.12-rc2 |
926 |
|
a77720ad0 sata_promise: SAT... |
927 |
is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags); |
cca3974e4 libata: Grand ren... |
928 |
for (i = 0; i < host->n_ports; i++) { |
1da177e4c Linux-2.6.12-rc2 |
929 930 |
VPRINTK("port %u ", i); |
cca3974e4 libata: Grand ren... |
931 |
ap = host->ports[i]; |
a77720ad0 sata_promise: SAT... |
932 933 934 935 |
/* check for a plug or unplug event */ ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4); tmp = hotplug_status & (0x11 << ata_no); |
3e4ec3443 libata: kill ATA_... |
936 |
if (tmp) { |
9af5c9c97 libata-link: intr... |
937 |
struct ata_eh_info *ehi = &ap->link.eh_info; |
a77720ad0 sata_promise: SAT... |
938 939 940 941 942 943 944 945 946 |
ata_ehi_clear_desc(ehi); ata_ehi_hotplugged(ehi); ata_ehi_push_desc(ehi, "hotplug_status %#x", tmp); ata_port_freeze(ap); ++handled; continue; } /* check for a packet interrupt */ |
1da177e4c Linux-2.6.12-rc2 |
947 |
tmp = mask & (1 << (i + 1)); |
3e4ec3443 libata: kill ATA_... |
948 |
if (tmp) { |
1da177e4c Linux-2.6.12-rc2 |
949 |
struct ata_queued_cmd *qc; |
9af5c9c97 libata-link: intr... |
950 |
qc = ata_qc_from_tag(ap, ap->link.active_tag); |
e50362ecc [PATCH] libata: i... |
951 |
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) |
1da177e4c Linux-2.6.12-rc2 |
952 953 954 |
handled += pdc_host_intr(ap, qc); } } |
1da177e4c Linux-2.6.12-rc2 |
955 956 |
VPRINTK("EXIT "); |
6340f0196 [libata sata_prom... |
957 |
done_irq: |
cca3974e4 libata: Grand ren... |
958 |
spin_unlock(&host->lock); |
1da177e4c Linux-2.6.12-rc2 |
959 960 |
return IRQ_RETVAL(handled); } |
7715a6f9c sata_promise: oth... |
961 |
static void pdc_packet_start(struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
962 963 964 |
{ struct ata_port *ap = qc->ap; struct pdc_port_priv *pp = ap->private_data; |
821d22cdc sata_promise: mmi... |
965 966 |
void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
1da177e4c Linux-2.6.12-rc2 |
967 968 969 970 971 |
unsigned int port_no = ap->port_no; u8 seq = (u8) (port_no + 1); VPRINTK("ENTER, ap %p ", ap); |
821d22cdc sata_promise: mmi... |
972 973 |
writel(0x00000001, host_mmio + (seq * 4)); readl(host_mmio + (seq * 4)); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
974 975 976 |
pp->pkt[2] = seq; wmb(); /* flush PRD, pkt writes */ |
821d22cdc sata_promise: mmi... |
977 978 |
writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT); readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
979 |
} |
9363c3825 libata: rename SF... |
980 |
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
981 982 |
{ switch (qc->tf.protocol) { |
0dc36888d libata: rename AT... |
983 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
984 985 986 |
if (qc->dev->flags & ATA_DFLAG_CDB_INTR) break; /*FALLTHROUGH*/ |
51b94d2a5 sata_promise: use... |
987 988 989 990 |
case ATA_PROT_NODATA: if (qc->tf.flags & ATA_TFLAG_POLLING) break; /*FALLTHROUGH*/ |
0dc36888d libata: rename AT... |
991 |
case ATAPI_PROT_DMA: |
1da177e4c Linux-2.6.12-rc2 |
992 |
case ATA_PROT_DMA: |
1da177e4c Linux-2.6.12-rc2 |
993 994 |
pdc_packet_start(qc); return 0; |
1da177e4c Linux-2.6.12-rc2 |
995 996 997 |
default: break; } |
9363c3825 libata: rename SF... |
998 |
return ata_sff_qc_issue(qc); |
1da177e4c Linux-2.6.12-rc2 |
999 |
} |
057ace5e7 libata: const-ifi... |
1000 |
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf) |
1da177e4c Linux-2.6.12-rc2 |
1001 |
{ |
0dc36888d libata: rename AT... |
1002 |
WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA); |
9363c3825 libata: rename SF... |
1003 |
ata_sff_tf_load(ap, tf); |
1da177e4c Linux-2.6.12-rc2 |
1004 |
} |
5796d1c4c [libata] Address ... |
1005 1006 |
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf) |
1da177e4c Linux-2.6.12-rc2 |
1007 |
{ |
0dc36888d libata: rename AT... |
1008 |
WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA); |
9363c3825 libata: rename SF... |
1009 |
ata_sff_exec_command(ap, tf); |
1da177e4c Linux-2.6.12-rc2 |
1010 |
} |
95006188c sata_promise: ATA... |
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 |
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc) { u8 *scsicmd = qc->scsicmd->cmnd; int pio = 1; /* atapi dma off by default */ /* Whitelist commands that may use DMA. */ switch (scsicmd[0]) { case WRITE_12: case WRITE_10: case WRITE_6: case READ_12: case READ_10: case READ_6: case 0xad: /* READ_DVD_STRUCTURE */ case 0xbe: /* READ_CD */ pio = 0; } /* -45150 (FFFF4FA2) to -1 (FFFFFFFF) shall use PIO mode */ if (scsicmd[0] == WRITE_10) { |
5796d1c4c [libata] Address ... |
1030 1031 1032 1033 1034 |
unsigned int lba = (scsicmd[2] << 24) | (scsicmd[3] << 16) | (scsicmd[4] << 8) | scsicmd[5]; |
95006188c sata_promise: ATA... |
1035 1036 1037 1038 1039 |
if (lba >= 0xFFFF4FA2) pio = 1; } return pio; } |
724114a57 sata_promise: sep... |
1040 |
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc) |
95006188c sata_promise: ATA... |
1041 |
{ |
95006188c sata_promise: ATA... |
1042 |
/* First generation chips cannot use ATAPI DMA on SATA ports */ |
724114a57 sata_promise: sep... |
1043 |
return 1; |
95006188c sata_promise: ATA... |
1044 |
} |
1da177e4c Linux-2.6.12-rc2 |
1045 |
|
eca25dca1 libata: convert d... |
1046 1047 |
static void pdc_ata_setup_port(struct ata_port *ap, void __iomem *base, void __iomem *scr_addr) |
1da177e4c Linux-2.6.12-rc2 |
1048 |
{ |
eca25dca1 libata: convert d... |
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 |
ap->ioaddr.cmd_addr = base; ap->ioaddr.data_addr = base; ap->ioaddr.feature_addr = ap->ioaddr.error_addr = base + 0x4; ap->ioaddr.nsect_addr = base + 0x8; ap->ioaddr.lbal_addr = base + 0xc; ap->ioaddr.lbam_addr = base + 0x10; ap->ioaddr.lbah_addr = base + 0x14; ap->ioaddr.device_addr = base + 0x18; ap->ioaddr.command_addr = ap->ioaddr.status_addr = base + 0x1c; ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr = base + 0x38; ap->ioaddr.scr_addr = scr_addr; |
1da177e4c Linux-2.6.12-rc2 |
1063 |
} |
eca25dca1 libata: convert d... |
1064 |
static void pdc_host_init(struct ata_host *host) |
1da177e4c Linux-2.6.12-rc2 |
1065 |
{ |
821d22cdc sata_promise: mmi... |
1066 |
void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; |
eca25dca1 libata: convert d... |
1067 |
int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II; |
d324d4627 [PATCH] sata_prom... |
1068 |
int hotplug_offset; |
1da177e4c Linux-2.6.12-rc2 |
1069 |
u32 tmp; |
eca25dca1 libata: convert d... |
1070 |
if (is_gen2) |
d324d4627 [PATCH] sata_prom... |
1071 1072 1073 |
hotplug_offset = PDC2_SATA_PLUG_CSR; else hotplug_offset = PDC_SATA_PLUG_CSR; |
1da177e4c Linux-2.6.12-rc2 |
1074 1075 1076 1077 1078 |
/* * Except for the hotplug stuff, this is voodoo from the * Promise driver. Label this entire section * "TODO: figure out why we do this" */ |
b2d1eee1e [PATCH] sata_prom... |
1079 |
/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */ |
821d22cdc sata_promise: mmi... |
1080 |
tmp = readl(host_mmio + PDC_FLASH_CTL); |
b2d1eee1e [PATCH] sata_prom... |
1081 |
tmp |= 0x02000; /* bit 13 (enable bmr burst) */ |
eca25dca1 libata: convert d... |
1082 |
if (!is_gen2) |
b2d1eee1e [PATCH] sata_prom... |
1083 |
tmp |= 0x10000; /* bit 16 (fifo threshold at 8 dw) */ |
821d22cdc sata_promise: mmi... |
1084 |
writel(tmp, host_mmio + PDC_FLASH_CTL); |
1da177e4c Linux-2.6.12-rc2 |
1085 1086 |
/* clear plug/unplug flags for all ports */ |
821d22cdc sata_promise: mmi... |
1087 1088 |
tmp = readl(host_mmio + hotplug_offset); writel(tmp | 0xff, host_mmio + hotplug_offset); |
1da177e4c Linux-2.6.12-rc2 |
1089 |
|
821d22cdc sata_promise: mmi... |
1090 |
tmp = readl(host_mmio + hotplug_offset); |
0ae6654da sata_promise: dis... |
1091 1092 1093 1094 |
if (is_gen2) /* unmask plug/unplug ints */ writel(tmp & ~0xff0000, host_mmio + hotplug_offset); else /* mask plug/unplug ints */ writel(tmp | 0xff0000, host_mmio + hotplug_offset); |
1da177e4c Linux-2.6.12-rc2 |
1095 |
|
b2d1eee1e [PATCH] sata_prom... |
1096 |
/* don't initialise TBG or SLEW on 2nd generation chips */ |
eca25dca1 libata: convert d... |
1097 |
if (is_gen2) |
b2d1eee1e [PATCH] sata_prom... |
1098 |
return; |
1da177e4c Linux-2.6.12-rc2 |
1099 |
/* reduce TBG clock to 133 Mhz. */ |
821d22cdc sata_promise: mmi... |
1100 |
tmp = readl(host_mmio + PDC_TBG_MODE); |
1da177e4c Linux-2.6.12-rc2 |
1101 1102 |
tmp &= ~0x30000; /* clear bit 17, 16*/ tmp |= 0x10000; /* set bit 17:16 = 0:1 */ |
821d22cdc sata_promise: mmi... |
1103 |
writel(tmp, host_mmio + PDC_TBG_MODE); |
1da177e4c Linux-2.6.12-rc2 |
1104 |
|
821d22cdc sata_promise: mmi... |
1105 |
readl(host_mmio + PDC_TBG_MODE); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
1106 1107 1108 |
msleep(10); /* adjust slew rate control register. */ |
821d22cdc sata_promise: mmi... |
1109 |
tmp = readl(host_mmio + PDC_SLEW_CTL); |
1da177e4c Linux-2.6.12-rc2 |
1110 1111 |
tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */ tmp |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */ |
821d22cdc sata_promise: mmi... |
1112 |
writel(tmp, host_mmio + PDC_SLEW_CTL); |
1da177e4c Linux-2.6.12-rc2 |
1113 |
} |
5796d1c4c [libata] Address ... |
1114 1115 |
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1da177e4c Linux-2.6.12-rc2 |
1116 1117 |
{ static int printed_version; |
eca25dca1 libata: convert d... |
1118 1119 1120 |
const struct ata_port_info *pi = &pdc_port_info[ent->driver_data]; const struct ata_port_info *ppi[PDC_MAX_PORTS]; struct ata_host *host; |
821d22cdc sata_promise: mmi... |
1121 |
void __iomem *host_mmio; |
eca25dca1 libata: convert d... |
1122 |
int n_ports, i, rc; |
5ac2fe575 sata_promise: SAT... |
1123 |
int is_sataii_tx4; |
1da177e4c Linux-2.6.12-rc2 |
1124 1125 |
if (!printed_version++) |
a9524a76f [libata] use dev_... |
1126 1127 |
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION " "); |
1da177e4c Linux-2.6.12-rc2 |
1128 |
|
eca25dca1 libata: convert d... |
1129 |
/* enable and acquire resources */ |
24dc5f33e libata: update li... |
1130 |
rc = pcim_enable_device(pdev); |
1da177e4c Linux-2.6.12-rc2 |
1131 1132 |
if (rc) return rc; |
0d5ff5667 libata: convert t... |
1133 1134 |
rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME); if (rc == -EBUSY) |
24dc5f33e libata: update li... |
1135 |
pcim_pin_device(pdev); |
0d5ff5667 libata: convert t... |
1136 |
if (rc) |
24dc5f33e libata: update li... |
1137 |
return rc; |
821d22cdc sata_promise: mmi... |
1138 |
host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR]; |
1da177e4c Linux-2.6.12-rc2 |
1139 |
|
eca25dca1 libata: convert d... |
1140 1141 1142 1143 1144 1145 |
/* determine port configuration and setup host */ n_ports = 2; if (pi->flags & PDC_FLAG_4_PORTS) n_ports = 4; for (i = 0; i < n_ports; i++) ppi[i] = pi; |
1da177e4c Linux-2.6.12-rc2 |
1146 |
|
eca25dca1 libata: convert d... |
1147 |
if (pi->flags & PDC_FLAG_SATA_PATA) { |
821d22cdc sata_promise: mmi... |
1148 |
u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1); |
d0e580316 sata_promise: cle... |
1149 |
if (!(tmp & 0x80)) |
eca25dca1 libata: convert d... |
1150 |
ppi[n_ports++] = pi + 1; |
eca25dca1 libata: convert d... |
1151 |
} |
1da177e4c Linux-2.6.12-rc2 |
1152 |
|
eca25dca1 libata: convert d... |
1153 1154 1155 1156 |
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); if (!host) { dev_printk(KERN_ERR, &pdev->dev, "failed to allocate host "); |
24dc5f33e libata: update li... |
1157 |
return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
1158 |
} |
eca25dca1 libata: convert d... |
1159 |
host->iomap = pcim_iomap_table(pdev); |
1da177e4c Linux-2.6.12-rc2 |
1160 |
|
d0e580316 sata_promise: cle... |
1161 |
is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags); |
5ac2fe575 sata_promise: SAT... |
1162 |
for (i = 0; i < host->n_ports; i++) { |
cbcdd8759 libata: implement... |
1163 |
struct ata_port *ap = host->ports[i]; |
d0e580316 sata_promise: cle... |
1164 |
unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4); |
821d22cdc sata_promise: mmi... |
1165 |
unsigned int ata_offset = 0x200 + ata_no * 0x80; |
cbcdd8759 libata: implement... |
1166 |
unsigned int scr_offset = 0x400 + ata_no * 0x100; |
821d22cdc sata_promise: mmi... |
1167 |
pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset); |
cbcdd8759 libata: implement... |
1168 1169 |
ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio"); |
821d22cdc sata_promise: mmi... |
1170 |
ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata"); |
5ac2fe575 sata_promise: SAT... |
1171 |
} |
1da177e4c Linux-2.6.12-rc2 |
1172 1173 |
/* initialize adapter */ |
eca25dca1 libata: convert d... |
1174 |
pdc_host_init(host); |
1da177e4c Linux-2.6.12-rc2 |
1175 |
|
eca25dca1 libata: convert d... |
1176 1177 1178 1179 1180 1181 |
rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); if (rc) return rc; rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK); if (rc) return rc; |
1da177e4c Linux-2.6.12-rc2 |
1182 |
|
eca25dca1 libata: convert d... |
1183 1184 1185 1186 |
/* start host, request IRQ and attach */ pci_set_master(pdev); return ata_host_activate(host, pdev->irq, pdc_interrupt, IRQF_SHARED, &pdc_ata_sht); |
1da177e4c Linux-2.6.12-rc2 |
1187 |
} |
1da177e4c Linux-2.6.12-rc2 |
1188 1189 |
static int __init pdc_ata_init(void) { |
b7887196e [PATCH] libata: r... |
1190 |
return pci_register_driver(&pdc_ata_pci_driver); |
1da177e4c Linux-2.6.12-rc2 |
1191 |
} |
1da177e4c Linux-2.6.12-rc2 |
1192 1193 1194 1195 |
static void __exit pdc_ata_exit(void) { pci_unregister_driver(&pdc_ata_pci_driver); } |
1da177e4c Linux-2.6.12-rc2 |
1196 |
MODULE_AUTHOR("Jeff Garzik"); |
f497ba735 [libata sata_prom... |
1197 |
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver"); |
1da177e4c Linux-2.6.12-rc2 |
1198 1199 1200 1201 1202 1203 |
MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl); MODULE_VERSION(DRV_VERSION); module_init(pdc_ata_init); module_exit(pdc_ata_exit); |