Blame view
drivers/ata/sata_promise.c
30.7 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 36 37 38 39 40 |
* */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/pci.h> #include <linux/init.h> #include <linux/blkdev.h> #include <linux/delay.h> #include <linux/interrupt.h> |
a9524a76f [libata] use dev_... |
41 |
#include <linux/device.h> |
95006188c sata_promise: ATA... |
42 |
#include <scsi/scsi.h> |
1da177e4c Linux-2.6.12-rc2 |
43 |
#include <scsi/scsi_host.h> |
193515d51 [libata] eliminat... |
44 |
#include <scsi/scsi_cmnd.h> |
1da177e4c Linux-2.6.12-rc2 |
45 |
#include <linux/libata.h> |
1da177e4c Linux-2.6.12-rc2 |
46 47 48 |
#include "sata_promise.h" #define DRV_NAME "sata_promise" |
c07a9c499 sata_promise: fix... |
49 |
#define DRV_VERSION "2.12" |
1da177e4c Linux-2.6.12-rc2 |
50 51 |
enum { |
eca25dca1 libata: convert d... |
52 |
PDC_MAX_PORTS = 4, |
0d5ff5667 libata: convert t... |
53 |
PDC_MMIO_BAR = 3, |
b9ccd4a90 sata_promise: ASI... |
54 |
PDC_MAX_PRD = LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */ |
0d5ff5667 libata: convert t... |
55 |
|
821d22cdc sata_promise: mmi... |
56 57 58 59 60 61 62 63 64 |
/* 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 */ 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... |
65 66 67 68 69 70 71 |
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... |
72 |
PDC_ALTSTATUS = 0x38, /* Alternate-status/device-control reg (per port) */ |
1da177e4c Linux-2.6.12-rc2 |
73 |
PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */ |
1da177e4c Linux-2.6.12-rc2 |
74 75 |
PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */ PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */ |
821d22cdc sata_promise: mmi... |
76 77 78 |
/* per-port SATA register offsets (from ap->ioaddr.scr_addr) */ PDC_PHYMODE4 = 0x14, |
1da177e4c Linux-2.6.12-rc2 |
79 |
|
176efb054 sata_promise: dec... |
80 81 82 83 84 85 86 87 88 89 90 91 92 |
/* 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 ... |
93 94 95 96 97 98 |
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 |
99 100 |
board_2037x = 0, /* FastTrak S150 TX2plus */ |
eca25dca1 libata: convert d... |
101 102 103 104 |
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... |
105 |
board_2057x_pata = 5, /* SATAII150 Tx2plus PATA port */ |
eca25dca1 libata: convert d... |
106 |
board_40518 = 6, /* SATAII150 Tx4 */ |
1da177e4c Linux-2.6.12-rc2 |
107 |
|
6340f0196 [libata sata_prom... |
108 |
PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */ |
1da177e4c Linux-2.6.12-rc2 |
109 |
|
95006188c sata_promise: ATA... |
110 111 112 113 114 115 116 117 118 |
/* 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... |
119 120 121 |
/* PDC_CTLSTAT bit definitions */ PDC_DMA_ENABLE = (1 << 7), PDC_IRQ_DISABLE = (1 << 10), |
1da177e4c Linux-2.6.12-rc2 |
122 |
PDC_RESET = (1 << 11), /* HDMA reset */ |
50630195b [libata] mark cer... |
123 |
|
25b93d81b [PATCH] sata_prom... |
124 |
PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | |
95006188c sata_promise: ATA... |
125 |
ATA_FLAG_MMIO | |
3d0a59c02 [libata sata_prom... |
126 |
ATA_FLAG_PIO_POLLING, |
b2d1eee1e [PATCH] sata_prom... |
127 |
|
eca25dca1 libata: convert d... |
128 129 130 131 |
/* 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 |
132 |
}; |
1da177e4c Linux-2.6.12-rc2 |
133 134 135 136 |
struct pdc_port_priv { u8 *pkt; dma_addr_t pkt_dma; }; |
82ef04fb4 libata: make SCR ... |
137 138 |
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... |
139 |
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
eca25dca1 libata: convert d... |
140 141 |
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 |
142 |
static void pdc_qc_prep(struct ata_queued_cmd *qc); |
057ace5e7 libata: const-ifi... |
143 144 |
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... |
145 |
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc); |
724114a57 sata_promise: sep... |
146 |
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc); |
1da177e4c Linux-2.6.12-rc2 |
147 |
static void pdc_irq_clear(struct ata_port *ap); |
9363c3825 libata: rename SF... |
148 |
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc); |
25b93d81b [PATCH] sata_prom... |
149 |
static void pdc_freeze(struct ata_port *ap); |
c07a9c499 sata_promise: fix... |
150 |
static void pdc_sata_freeze(struct ata_port *ap); |
25b93d81b [PATCH] sata_prom... |
151 |
static void pdc_thaw(struct ata_port *ap); |
c07a9c499 sata_promise: fix... |
152 |
static void pdc_sata_thaw(struct ata_port *ap); |
cadef677e sata_promise: add... |
153 154 155 156 |
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... |
157 |
static void pdc_error_handler(struct ata_port *ap); |
25b93d81b [PATCH] sata_prom... |
158 |
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc); |
724114a57 sata_promise: sep... |
159 160 |
static int pdc_pata_cable_detect(struct ata_port *ap); static int pdc_sata_cable_detect(struct ata_port *ap); |
374b18735 [libata] update s... |
161 |
|
193515d51 [libata] eliminat... |
162 |
static struct scsi_host_template pdc_ata_sht = { |
68d1d07b5 libata: implement... |
163 |
ATA_BASE_SHT(DRV_NAME), |
b9ccd4a90 sata_promise: ASI... |
164 |
.sg_tablesize = PDC_MAX_PRD, |
1da177e4c Linux-2.6.12-rc2 |
165 |
.dma_boundary = ATA_DMA_BOUNDARY, |
1da177e4c Linux-2.6.12-rc2 |
166 |
}; |
029cfd6b7 libata: implement... |
167 168 |
static const struct ata_port_operations pdc_common_ops = { .inherits = &ata_sff_port_ops, |
5682ed33a libata: rename SF... |
169 170 |
.sff_tf_load = pdc_tf_load_mmio, .sff_exec_command = pdc_exec_command_mmio, |
95006188c sata_promise: ATA... |
171 |
.check_atapi_dma = pdc_check_atapi_dma, |
95006188c sata_promise: ATA... |
172 |
.qc_prep = pdc_qc_prep, |
9363c3825 libata: rename SF... |
173 |
.qc_issue = pdc_qc_issue, |
5682ed33a libata: rename SF... |
174 |
.sff_irq_clear = pdc_irq_clear, |
95006188c sata_promise: ATA... |
175 |
|
029cfd6b7 libata: implement... |
176 |
.post_internal_cmd = pdc_post_internal_cmd, |
a1efdaba2 libata: make rese... |
177 |
.error_handler = pdc_error_handler, |
95006188c sata_promise: ATA... |
178 |
}; |
029cfd6b7 libata: implement... |
179 180 181 |
static struct ata_port_operations pdc_sata_ops = { .inherits = &pdc_common_ops, .cable_detect = pdc_sata_cable_detect, |
c07a9c499 sata_promise: fix... |
182 183 |
.freeze = pdc_sata_freeze, .thaw = pdc_sata_thaw, |
1da177e4c Linux-2.6.12-rc2 |
184 185 |
.scr_read = pdc_sata_scr_read, .scr_write = pdc_sata_scr_write, |
eca25dca1 libata: convert d... |
186 |
.port_start = pdc_sata_port_start, |
cadef677e sata_promise: add... |
187 |
.hardreset = pdc_sata_hardreset, |
1da177e4c Linux-2.6.12-rc2 |
188 |
}; |
029cfd6b7 libata: implement... |
189 190 191 192 193 |
/* First-generation chips need a more restrictive ->check_atapi_dma op */ static struct ata_port_operations pdc_old_sata_ops = { .inherits = &pdc_sata_ops, .check_atapi_dma = pdc_old_sata_check_atapi_dma, }; |
2cba582a4 [libata sata_prom... |
194 |
|
029cfd6b7 libata: implement... |
195 196 197 |
static struct ata_port_operations pdc_pata_ops = { .inherits = &pdc_common_ops, .cable_detect = pdc_pata_cable_detect, |
5387373bf sata_promise: new... |
198 199 |
.freeze = pdc_freeze, .thaw = pdc_thaw, |
eca25dca1 libata: convert d... |
200 |
.port_start = pdc_common_port_start, |
cadef677e sata_promise: add... |
201 |
.softreset = pdc_pata_softreset, |
2cba582a4 [libata sata_prom... |
202 |
}; |
98ac62def [PATCH] mark seve... |
203 |
static const struct ata_port_info pdc_port_info[] = { |
5595ddf98 sata_promise: cle... |
204 |
[board_2037x] = |
1da177e4c Linux-2.6.12-rc2 |
205 |
{ |
eca25dca1 libata: convert d... |
206 207 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_SATA_PATA, |
1da177e4c Linux-2.6.12-rc2 |
208 209 |
.pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
210 |
.udma_mask = ATA_UDMA6, |
95006188c sata_promise: ATA... |
211 |
.port_ops = &pdc_old_sata_ops, |
1da177e4c Linux-2.6.12-rc2 |
212 |
}, |
5595ddf98 sata_promise: cle... |
213 |
[board_2037x_pata] = |
eca25dca1 libata: convert d... |
214 215 216 217 |
{ .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
218 |
.udma_mask = ATA_UDMA6, |
eca25dca1 libata: convert d... |
219 220 |
.port_ops = &pdc_pata_ops, }, |
5595ddf98 sata_promise: cle... |
221 |
[board_20319] = |
1da177e4c Linux-2.6.12-rc2 |
222 |
{ |
eca25dca1 libata: convert d... |
223 224 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_4_PORTS, |
1da177e4c Linux-2.6.12-rc2 |
225 226 |
.pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
227 |
.udma_mask = ATA_UDMA6, |
95006188c sata_promise: ATA... |
228 |
.port_ops = &pdc_old_sata_ops, |
1da177e4c Linux-2.6.12-rc2 |
229 |
}, |
f497ba735 [libata sata_prom... |
230 |
|
5595ddf98 sata_promise: cle... |
231 |
[board_20619] = |
f497ba735 [libata sata_prom... |
232 |
{ |
eca25dca1 libata: convert d... |
233 234 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | PDC_FLAG_4_PORTS, |
f497ba735 [libata sata_prom... |
235 236 |
.pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
237 |
.udma_mask = ATA_UDMA6, |
2cba582a4 [libata sata_prom... |
238 |
.port_ops = &pdc_pata_ops, |
f497ba735 [libata sata_prom... |
239 |
}, |
5a46fe89a [libata] sata_pro... |
240 |
|
5595ddf98 sata_promise: cle... |
241 |
[board_2057x] = |
6340f0196 [libata sata_prom... |
242 |
{ |
eca25dca1 libata: convert d... |
243 244 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA, |
6340f0196 [libata sata_prom... |
245 246 |
.pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
247 |
.udma_mask = ATA_UDMA6, |
6340f0196 [libata sata_prom... |
248 249 |
.port_ops = &pdc_sata_ops, }, |
5595ddf98 sata_promise: cle... |
250 |
[board_2057x_pata] = |
eca25dca1 libata: convert d... |
251 |
{ |
bb3122359 [libata] sata_pro... |
252 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | |
eca25dca1 libata: convert d... |
253 254 255 |
PDC_FLAG_GEN_II, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
256 |
.udma_mask = ATA_UDMA6, |
eca25dca1 libata: convert d... |
257 258 |
.port_ops = &pdc_pata_ops, }, |
5595ddf98 sata_promise: cle... |
259 |
[board_40518] = |
6340f0196 [libata sata_prom... |
260 |
{ |
eca25dca1 libata: convert d... |
261 262 |
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS, |
6340f0196 [libata sata_prom... |
263 264 |
.pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ |
469248abf [libata] Clean up... |
265 |
.udma_mask = ATA_UDMA6, |
6340f0196 [libata sata_prom... |
266 267 |
.port_ops = &pdc_sata_ops, }, |
1da177e4c Linux-2.6.12-rc2 |
268 |
}; |
3b7d697df [libata] constify... |
269 |
static const struct pci_device_id pdc_ata_pci_tbl[] = { |
54bb3a94b [libata] Use new ... |
270 |
{ PCI_VDEVICE(PROMISE, 0x3371), board_2037x }, |
54bb3a94b [libata] Use new ... |
271 272 273 |
{ PCI_VDEVICE(PROMISE, 0x3373), board_2037x }, { PCI_VDEVICE(PROMISE, 0x3375), board_2037x }, { PCI_VDEVICE(PROMISE, 0x3376), board_2037x }, |
b2d1eee1e [PATCH] sata_prom... |
274 275 |
{ PCI_VDEVICE(PROMISE, 0x3570), board_2057x }, { PCI_VDEVICE(PROMISE, 0x3571), board_2057x }, |
54bb3a94b [libata] Use new ... |
276 |
{ PCI_VDEVICE(PROMISE, 0x3574), board_2057x }, |
d324d4627 [PATCH] sata_prom... |
277 |
{ PCI_VDEVICE(PROMISE, 0x3577), board_2057x }, |
b2d1eee1e [PATCH] sata_prom... |
278 |
{ PCI_VDEVICE(PROMISE, 0x3d73), board_2057x }, |
54bb3a94b [libata] Use new ... |
279 |
{ PCI_VDEVICE(PROMISE, 0x3d75), board_2057x }, |
54bb3a94b [libata] Use new ... |
280 281 282 |
{ PCI_VDEVICE(PROMISE, 0x3318), board_20319 }, { PCI_VDEVICE(PROMISE, 0x3319), board_20319 }, |
7f9992a23 sata_promise: Fas... |
283 284 |
{ PCI_VDEVICE(PROMISE, 0x3515), board_40518 }, { PCI_VDEVICE(PROMISE, 0x3519), board_40518 }, |
b2d1eee1e [PATCH] sata_prom... |
285 |
{ PCI_VDEVICE(PROMISE, 0x3d17), board_40518 }, |
54bb3a94b [libata] Use new ... |
286 287 288 |
{ PCI_VDEVICE(PROMISE, 0x3d18), board_40518 }, { PCI_VDEVICE(PROMISE, 0x6629), board_20619 }, |
f497ba735 [libata sata_prom... |
289 |
|
1da177e4c Linux-2.6.12-rc2 |
290 291 |
{ } /* terminate list */ }; |
1da177e4c Linux-2.6.12-rc2 |
292 293 294 295 296 297 |
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... |
298 |
static int pdc_common_port_start(struct ata_port *ap) |
1da177e4c Linux-2.6.12-rc2 |
299 |
{ |
cca3974e4 libata: Grand ren... |
300 |
struct device *dev = ap->host->dev; |
1da177e4c Linux-2.6.12-rc2 |
301 302 303 304 305 306 |
struct pdc_port_priv *pp; int rc; rc = ata_port_start(ap); if (rc) return rc; |
24dc5f33e libata: update li... |
307 308 309 |
pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); if (!pp) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
310 |
|
24dc5f33e libata: update li... |
311 312 313 |
pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL); if (!pp->pkt) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
314 315 |
ap->private_data = pp; |
724114a57 sata_promise: sep... |
316 317 318 319 320 |
return 0; } static int pdc_sata_port_start(struct ata_port *ap) { |
724114a57 sata_promise: sep... |
321 322 323 324 325 |
int rc; rc = pdc_common_port_start(ap); if (rc) return rc; |
599b7202c [PATCH] sata_prom... |
326 |
/* fix up PHYMODE4 align timing */ |
eca25dca1 libata: convert d... |
327 |
if (ap->flags & PDC_FLAG_GEN_II) { |
821d22cdc sata_promise: mmi... |
328 |
void __iomem *sata_mmio = ap->ioaddr.scr_addr; |
599b7202c [PATCH] sata_prom... |
329 |
unsigned int tmp; |
821d22cdc sata_promise: mmi... |
330 |
tmp = readl(sata_mmio + PDC_PHYMODE4); |
599b7202c [PATCH] sata_prom... |
331 |
tmp = (tmp & ~3) | 1; /* set bits 1:0 = 0:1 */ |
821d22cdc sata_promise: mmi... |
332 |
writel(tmp, sata_mmio + PDC_PHYMODE4); |
599b7202c [PATCH] sata_prom... |
333 |
} |
1da177e4c Linux-2.6.12-rc2 |
334 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
335 |
} |
1da177e4c Linux-2.6.12-rc2 |
336 337 |
static void pdc_reset_port(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
338 |
void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT; |
1da177e4c Linux-2.6.12-rc2 |
339 340 341 342 |
unsigned int i; u32 tmp; for (i = 11; i > 0; i--) { |
821d22cdc sata_promise: mmi... |
343 |
tmp = readl(ata_ctlstat_mmio); |
1da177e4c Linux-2.6.12-rc2 |
344 345 346 347 348 349 |
if (tmp & PDC_RESET) break; udelay(100); tmp |= PDC_RESET; |
821d22cdc sata_promise: mmi... |
350 |
writel(tmp, ata_ctlstat_mmio); |
1da177e4c Linux-2.6.12-rc2 |
351 352 353 |
} tmp &= ~PDC_RESET; |
821d22cdc sata_promise: mmi... |
354 355 |
writel(tmp, ata_ctlstat_mmio); readl(ata_ctlstat_mmio); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
356 |
} |
724114a57 sata_promise: sep... |
357 |
static int pdc_pata_cable_detect(struct ata_port *ap) |
2cba582a4 [libata sata_prom... |
358 |
{ |
d3fb4e8dd [libata sata_prom... |
359 |
u8 tmp; |
821d22cdc sata_promise: mmi... |
360 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
d3fb4e8dd [libata sata_prom... |
361 |
|
821d22cdc sata_promise: mmi... |
362 |
tmp = readb(ata_mmio + PDC_CTLSTAT + 3); |
724114a57 sata_promise: sep... |
363 364 365 366 367 368 369 |
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... |
370 |
return ATA_CBL_SATA; |
d3fb4e8dd [libata sata_prom... |
371 |
} |
2cba582a4 [libata sata_prom... |
372 |
|
82ef04fb4 libata: make SCR ... |
373 374 |
static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) |
1da177e4c Linux-2.6.12-rc2 |
375 |
{ |
724114a57 sata_promise: sep... |
376 |
if (sc_reg > SCR_CONTROL) |
da3dbb17a libata: make ->sc... |
377 |
return -EINVAL; |
82ef04fb4 libata: make SCR ... |
378 |
*val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); |
da3dbb17a libata: make ->sc... |
379 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
380 |
} |
82ef04fb4 libata: make SCR ... |
381 382 |
static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) |
1da177e4c Linux-2.6.12-rc2 |
383 |
{ |
724114a57 sata_promise: sep... |
384 |
if (sc_reg > SCR_CONTROL) |
da3dbb17a libata: make ->sc... |
385 |
return -EINVAL; |
82ef04fb4 libata: make SCR ... |
386 |
writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); |
da3dbb17a libata: make ->sc... |
387 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
388 |
} |
fba6edbd3 sata_promise: han... |
389 |
static void pdc_atapi_pkt(struct ata_queued_cmd *qc) |
95006188c sata_promise: ATA... |
390 |
{ |
4113bb6b6 sata_promise: iss... |
391 392 393 394 395 396 |
struct ata_port *ap = qc->ap; dma_addr_t sg_table = ap->prd_dma; 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 |
397 |
__le32 *buf32 = (__le32 *) buf; |
46a671430 sata_promise: mak... |
398 |
unsigned int dev_sel, feature; |
95006188c sata_promise: ATA... |
399 400 401 402 |
/* set control bits (byte 0), zero delay seq id (byte 3), * and seq id (byte 2) */ |
fba6edbd3 sata_promise: han... |
403 |
switch (qc->tf.protocol) { |
0dc36888d libata: rename AT... |
404 |
case ATAPI_PROT_DMA: |
fba6edbd3 sata_promise: han... |
405 406 407 408 409 |
if (!(qc->tf.flags & ATA_TFLAG_WRITE)) buf32[0] = cpu_to_le32(PDC_PKT_READ); else buf32[0] = 0; break; |
0dc36888d libata: rename AT... |
410 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
411 412 413 414 415 416 |
buf32[0] = cpu_to_le32(PDC_PKT_NODATA); break; default: BUG(); break; } |
95006188c sata_promise: ATA... |
417 418 |
buf32[1] = cpu_to_le32(sg_table); /* S/G table addr */ buf32[2] = 0; /* no next-packet */ |
4113bb6b6 sata_promise: iss... |
419 |
/* select drive */ |
46a671430 sata_promise: mak... |
420 |
if (sata_scr_valid(&ap->link)) |
4113bb6b6 sata_promise: iss... |
421 |
dev_sel = PDC_DEVICE_SATA; |
46a671430 sata_promise: mak... |
422 423 |
else dev_sel = qc->tf.device; |
4113bb6b6 sata_promise: iss... |
424 425 426 427 428 429 |
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... |
430 |
buf[17] = qc->tf.nsect; |
4113bb6b6 sata_promise: iss... |
431 |
buf[18] = (1 << 5) | ATA_REG_LBAL; |
46a671430 sata_promise: mak... |
432 |
buf[19] = qc->tf.lbal; |
4113bb6b6 sata_promise: iss... |
433 434 |
/* set feature and byte counter registers */ |
0dc36888d libata: rename AT... |
435 |
if (qc->tf.protocol != ATAPI_PROT_DMA) |
4113bb6b6 sata_promise: iss... |
436 |
feature = PDC_FEATURE_ATAPI_PIO; |
46a671430 sata_promise: mak... |
437 |
else |
4113bb6b6 sata_promise: iss... |
438 |
feature = PDC_FEATURE_ATAPI_DMA; |
46a671430 sata_promise: mak... |
439 |
|
4113bb6b6 sata_promise: iss... |
440 441 442 |
buf[20] = (1 << 5) | ATA_REG_FEATURE; buf[21] = feature; buf[22] = (1 << 5) | ATA_REG_BYTEL; |
46a671430 sata_promise: mak... |
443 |
buf[23] = qc->tf.lbam; |
4113bb6b6 sata_promise: iss... |
444 |
buf[24] = (1 << 5) | ATA_REG_BYTEH; |
46a671430 sata_promise: mak... |
445 |
buf[25] = qc->tf.lbah; |
4113bb6b6 sata_promise: iss... |
446 447 448 |
/* send ATAPI packet command 0xA0 */ buf[26] = (1 << 5) | ATA_REG_CMD; |
46a671430 sata_promise: mak... |
449 |
buf[27] = qc->tf.command; |
4113bb6b6 sata_promise: iss... |
450 451 452 453 |
/* select drive and check DRQ */ buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY; buf[29] = dev_sel; |
95006188c sata_promise: ATA... |
454 455 |
/* we can represent cdb lengths 2/4/6/8/10/12/14/16 */ BUG_ON(cdb_len & ~0x1E); |
4113bb6b6 sata_promise: iss... |
456 457 458 |
/* 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... |
459 |
} |
b9ccd4a90 sata_promise: ASI... |
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 |
/** * 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; struct scatterlist *sg; |
b9ccd4a90 sata_promise: ASI... |
476 |
const u32 SG_COUNT_ASIC_BUG = 41*4; |
ff2aeb1eb libata: convert t... |
477 478 |
unsigned int si, idx; u32 len; |
b9ccd4a90 sata_promise: ASI... |
479 480 481 |
if (!(qc->flags & ATA_QCFLAG_DMAMAP)) return; |
b9ccd4a90 sata_promise: ASI... |
482 |
idx = 0; |
ff2aeb1eb libata: convert t... |
483 |
for_each_sg(qc->sg, sg, qc->n_elem, si) { |
b9ccd4a90 sata_promise: ASI... |
484 |
u32 addr, offset; |
6903c0f7e ata: fix sparse w... |
485 |
u32 sg_len; |
b9ccd4a90 sata_promise: ASI... |
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
/* 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; ap->prd[idx].addr = cpu_to_le32(addr); ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff); VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx, addr, len); idx++; sg_len -= len; addr += len; } } |
ff2aeb1eb libata: convert t... |
510 |
len = le32_to_cpu(ap->prd[idx - 1].flags_len); |
b9ccd4a90 sata_promise: ASI... |
511 |
|
ff2aeb1eb libata: convert t... |
512 513 |
if (len > SG_COUNT_ASIC_BUG) { u32 addr; |
b9ccd4a90 sata_promise: ASI... |
514 |
|
ff2aeb1eb libata: convert t... |
515 516 |
VPRINTK("Splitting last PRD. "); |
b9ccd4a90 sata_promise: ASI... |
517 |
|
ff2aeb1eb libata: convert t... |
518 519 520 521 |
addr = le32_to_cpu(ap->prd[idx - 1].addr); ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG); VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx - 1, addr, SG_COUNT_ASIC_BUG); |
b9ccd4a90 sata_promise: ASI... |
522 |
|
ff2aeb1eb libata: convert t... |
523 524 525 526 527 528 |
addr = addr + len - SG_COUNT_ASIC_BUG; len = SG_COUNT_ASIC_BUG; ap->prd[idx].addr = cpu_to_le32(addr); ap->prd[idx].flags_len = cpu_to_le32(len); VPRINTK("PRD[%u] = (0x%X, 0x%X) ", idx, addr, len); |
b9ccd4a90 sata_promise: ASI... |
529 |
|
ff2aeb1eb libata: convert t... |
530 |
idx++; |
b9ccd4a90 sata_promise: ASI... |
531 |
} |
ff2aeb1eb libata: convert t... |
532 533 |
ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
b9ccd4a90 sata_promise: ASI... |
534 |
} |
1da177e4c Linux-2.6.12-rc2 |
535 536 537 538 539 540 541 542 543 544 |
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... |
545 |
pdc_fill_sg(qc); |
7715a6f9c sata_promise: oth... |
546 |
/*FALLTHROUGH*/ |
1da177e4c Linux-2.6.12-rc2 |
547 548 549 |
case ATA_PROT_NODATA: i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma, qc->dev->devno, pp->pkt); |
1da177e4c Linux-2.6.12-rc2 |
550 551 552 553 |
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 |
554 555 |
pdc_pkt_footer(&qc->tf, pp->pkt, i); break; |
0dc36888d libata: rename AT... |
556 |
case ATAPI_PROT_PIO: |
b9ccd4a90 sata_promise: ASI... |
557 |
pdc_fill_sg(qc); |
95006188c sata_promise: ATA... |
558 |
break; |
0dc36888d libata: rename AT... |
559 |
case ATAPI_PROT_DMA: |
b9ccd4a90 sata_promise: ASI... |
560 |
pdc_fill_sg(qc); |
fba6edbd3 sata_promise: han... |
561 |
/*FALLTHROUGH*/ |
0dc36888d libata: rename AT... |
562 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
563 |
pdc_atapi_pkt(qc); |
95006188c sata_promise: ATA... |
564 |
break; |
1da177e4c Linux-2.6.12-rc2 |
565 566 567 568 |
default: break; } } |
c07a9c499 sata_promise: fix... |
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 |
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... |
592 |
for (i = 0; i < nr_ports && host->ports[i] != ap; ++i) |
c07a9c499 sata_promise: fix... |
593 594 595 596 597 598 599 600 601 |
; BUG_ON(i >= nr_ports); return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags)); } static unsigned int pdc_sata_hotplug_offset(const struct ata_port *ap) { return (ap->flags & PDC_FLAG_GEN_II) ? PDC2_SATA_PLUG_CSR : PDC_SATA_PLUG_CSR; } |
25b93d81b [PATCH] sata_prom... |
602 603 |
static void pdc_freeze(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
604 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
25b93d81b [PATCH] sata_prom... |
605 |
u32 tmp; |
821d22cdc sata_promise: mmi... |
606 |
tmp = readl(ata_mmio + PDC_CTLSTAT); |
25b93d81b [PATCH] sata_prom... |
607 608 |
tmp |= PDC_IRQ_DISABLE; tmp &= ~PDC_DMA_ENABLE; |
821d22cdc sata_promise: mmi... |
609 610 |
writel(tmp, ata_mmio + PDC_CTLSTAT); readl(ata_mmio + PDC_CTLSTAT); /* flush */ |
25b93d81b [PATCH] sata_prom... |
611 |
} |
c07a9c499 sata_promise: fix... |
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 |
static void pdc_sata_freeze(struct ata_port *ap) { struct ata_host *host = ap->host; void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; unsigned int hotplug_offset = pdc_sata_hotplug_offset(ap); 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... |
634 635 |
static void pdc_thaw(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
636 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
25b93d81b [PATCH] sata_prom... |
637 638 639 |
u32 tmp; /* clear IRQ */ |
821d22cdc sata_promise: mmi... |
640 |
readl(ata_mmio + PDC_COMMAND); |
25b93d81b [PATCH] sata_prom... |
641 642 |
/* turn IRQ back on */ |
821d22cdc sata_promise: mmi... |
643 |
tmp = readl(ata_mmio + PDC_CTLSTAT); |
25b93d81b [PATCH] sata_prom... |
644 |
tmp &= ~PDC_IRQ_DISABLE; |
821d22cdc sata_promise: mmi... |
645 646 |
writel(tmp, ata_mmio + PDC_CTLSTAT); readl(ata_mmio + PDC_CTLSTAT); /* flush */ |
25b93d81b [PATCH] sata_prom... |
647 |
} |
c07a9c499 sata_promise: fix... |
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 |
static void pdc_sata_thaw(struct ata_port *ap) { struct ata_host *host = ap->host; void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; unsigned int hotplug_offset = pdc_sata_hotplug_offset(ap); 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... |
667 668 669 670 671 672 673 674 675 676 677 678 679 |
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); } static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { pdc_reset_port(link->ap); return sata_sff_hardreset(link, class, deadline); } |
a1efdaba2 libata: make rese... |
680 |
static void pdc_error_handler(struct ata_port *ap) |
25b93d81b [PATCH] sata_prom... |
681 |
{ |
25b93d81b [PATCH] sata_prom... |
682 683 |
if (!(ap->pflags & ATA_PFLAG_FROZEN)) pdc_reset_port(ap); |
a1efdaba2 libata: make rese... |
684 |
ata_std_error_handler(ap); |
724114a57 sata_promise: sep... |
685 |
} |
25b93d81b [PATCH] sata_prom... |
686 687 688 |
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; |
25b93d81b [PATCH] sata_prom... |
689 |
/* make DMA engine forget about the failed command */ |
a51d644af libata: improve A... |
690 |
if (qc->flags & ATA_QCFLAG_FAILED) |
25b93d81b [PATCH] sata_prom... |
691 692 |
pdc_reset_port(ap); } |
176efb054 sata_promise: dec... |
693 694 695 |
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc, u32 port_status, u32 err_mask) { |
9af5c9c97 libata-link: intr... |
696 |
struct ata_eh_info *ehi = &ap->link.eh_info; |
176efb054 sata_promise: dec... |
697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 |
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)) ac_err_mask |= AC_ERR_HSM; 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... |
712 |
if (sata_scr_valid(&ap->link)) { |
da3dbb17a libata: make ->sc... |
713 |
u32 serror; |
82ef04fb4 libata: make SCR ... |
714 |
pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror); |
da3dbb17a libata: make ->sc... |
715 716 |
ehi->serror |= serror; } |
ce2d3abc2 sata_promise: fix... |
717 |
|
176efb054 sata_promise: dec... |
718 |
qc->err_mask |= ac_err_mask; |
ce2d3abc2 sata_promise: fix... |
719 720 |
pdc_reset_port(ap); |
8ffcfd9d0 sata_promise: fix... |
721 722 |
ata_port_abort(ap); |
176efb054 sata_promise: dec... |
723 |
} |
7715a6f9c sata_promise: oth... |
724 725 |
static unsigned int pdc_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
726 |
{ |
a22e2eb07 [PATCH] libata: m... |
727 |
unsigned int handled = 0; |
821d22cdc sata_promise: mmi... |
728 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
176efb054 sata_promise: dec... |
729 730 731 |
u32 port_status, err_mask; err_mask = PDC_ERR_MASK; |
eca25dca1 libata: convert d... |
732 |
if (ap->flags & PDC_FLAG_GEN_II) |
176efb054 sata_promise: dec... |
733 734 735 |
err_mask &= ~PDC1_ERR_MASK; else err_mask &= ~PDC2_ERR_MASK; |
821d22cdc sata_promise: mmi... |
736 |
port_status = readl(ata_mmio + PDC_GLOBAL_CTL); |
176efb054 sata_promise: dec... |
737 738 739 |
if (unlikely(port_status & err_mask)) { pdc_error_intr(ap, qc, port_status, err_mask); return 1; |
1da177e4c Linux-2.6.12-rc2 |
740 741 742 743 744 |
} switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: |
0dc36888d libata: rename AT... |
745 746 |
case ATAPI_PROT_DMA: case ATAPI_PROT_NODATA: |
a22e2eb07 [PATCH] libata: m... |
747 748 |
qc->err_mask |= ac_err_mask(ata_wait_idle(ap)); ata_qc_complete(qc); |
1da177e4c Linux-2.6.12-rc2 |
749 750 |
handled = 1; break; |
d0e580316 sata_promise: cle... |
751 |
default: |
ee500aabf [PATCH] libata: i... |
752 753 |
ap->stats.idle_irq++; break; |
d0e580316 sata_promise: cle... |
754 |
} |
1da177e4c Linux-2.6.12-rc2 |
755 |
|
ee500aabf [PATCH] libata: i... |
756 |
return handled; |
1da177e4c Linux-2.6.12-rc2 |
757 758 759 760 |
} static void pdc_irq_clear(struct ata_port *ap) { |
821d22cdc sata_promise: mmi... |
761 |
void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
1da177e4c Linux-2.6.12-rc2 |
762 |
|
821d22cdc sata_promise: mmi... |
763 |
readl(ata_mmio + PDC_COMMAND); |
1da177e4c Linux-2.6.12-rc2 |
764 |
} |
5796d1c4c [libata] Address ... |
765 |
static irqreturn_t pdc_interrupt(int irq, void *dev_instance) |
1da177e4c Linux-2.6.12-rc2 |
766 |
{ |
cca3974e4 libata: Grand ren... |
767 |
struct ata_host *host = dev_instance; |
1da177e4c Linux-2.6.12-rc2 |
768 769 770 771 |
struct ata_port *ap; u32 mask = 0; unsigned int i, tmp; unsigned int handled = 0; |
821d22cdc sata_promise: mmi... |
772 |
void __iomem *host_mmio; |
a77720ad0 sata_promise: SAT... |
773 774 775 |
unsigned int hotplug_offset, ata_no; u32 hotplug_status; int is_sataii_tx4; |
1da177e4c Linux-2.6.12-rc2 |
776 777 778 |
VPRINTK("ENTER "); |
0d5ff5667 libata: convert t... |
779 |
if (!host || !host->iomap[PDC_MMIO_BAR]) { |
1da177e4c Linux-2.6.12-rc2 |
780 781 782 783 |
VPRINTK("QUICK EXIT "); return IRQ_NONE; } |
821d22cdc sata_promise: mmi... |
784 |
host_mmio = host->iomap[PDC_MMIO_BAR]; |
1da177e4c Linux-2.6.12-rc2 |
785 |
|
c07a9c499 sata_promise: fix... |
786 |
spin_lock(&host->lock); |
a77720ad0 sata_promise: SAT... |
787 788 789 790 791 |
/* read and clear hotplug flags for all ports */ if (host->ports[0]->flags & PDC_FLAG_GEN_II) hotplug_offset = PDC2_SATA_PLUG_CSR; else hotplug_offset = PDC_SATA_PLUG_CSR; |
821d22cdc sata_promise: mmi... |
792 |
hotplug_status = readl(host_mmio + hotplug_offset); |
a77720ad0 sata_promise: SAT... |
793 |
if (hotplug_status & 0xff) |
821d22cdc sata_promise: mmi... |
794 |
writel(hotplug_status | 0xff, host_mmio + hotplug_offset); |
a77720ad0 sata_promise: SAT... |
795 |
hotplug_status &= 0xff; /* clear uninteresting bits */ |
1da177e4c Linux-2.6.12-rc2 |
796 |
/* reading should also clear interrupts */ |
821d22cdc sata_promise: mmi... |
797 |
mask = readl(host_mmio + PDC_INT_SEQMASK); |
1da177e4c Linux-2.6.12-rc2 |
798 |
|
a77720ad0 sata_promise: SAT... |
799 |
if (mask == 0xffffffff && hotplug_status == 0) { |
1da177e4c Linux-2.6.12-rc2 |
800 801 |
VPRINTK("QUICK EXIT 2 "); |
c07a9c499 sata_promise: fix... |
802 |
goto done_irq; |
1da177e4c Linux-2.6.12-rc2 |
803 |
} |
6340f0196 [libata sata_prom... |
804 |
|
7715a6f9c sata_promise: oth... |
805 |
mask &= 0xffff; /* only 16 SEQIDs possible */ |
a77720ad0 sata_promise: SAT... |
806 |
if (mask == 0 && hotplug_status == 0) { |
1da177e4c Linux-2.6.12-rc2 |
807 808 |
VPRINTK("QUICK EXIT 3 "); |
6340f0196 [libata sata_prom... |
809 |
goto done_irq; |
1da177e4c Linux-2.6.12-rc2 |
810 |
} |
821d22cdc sata_promise: mmi... |
811 |
writel(mask, host_mmio + PDC_INT_SEQMASK); |
1da177e4c Linux-2.6.12-rc2 |
812 |
|
a77720ad0 sata_promise: SAT... |
813 |
is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags); |
cca3974e4 libata: Grand ren... |
814 |
for (i = 0; i < host->n_ports; i++) { |
1da177e4c Linux-2.6.12-rc2 |
815 816 |
VPRINTK("port %u ", i); |
cca3974e4 libata: Grand ren... |
817 |
ap = host->ports[i]; |
a77720ad0 sata_promise: SAT... |
818 819 820 821 822 823 |
/* 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); if (tmp && ap && !(ap->flags & ATA_FLAG_DISABLED)) { |
9af5c9c97 libata-link: intr... |
824 |
struct ata_eh_info *ehi = &ap->link.eh_info; |
a77720ad0 sata_promise: SAT... |
825 826 827 828 829 830 831 832 833 |
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 |
834 |
tmp = mask & (1 << (i + 1)); |
c13895037 [PATCH] fix atapi... |
835 |
if (tmp && ap && |
029f5468b Merge branch 'ups... |
836 |
!(ap->flags & ATA_FLAG_DISABLED)) { |
1da177e4c Linux-2.6.12-rc2 |
837 |
struct ata_queued_cmd *qc; |
9af5c9c97 libata-link: intr... |
838 |
qc = ata_qc_from_tag(ap, ap->link.active_tag); |
e50362ecc [PATCH] libata: i... |
839 |
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) |
1da177e4c Linux-2.6.12-rc2 |
840 841 842 |
handled += pdc_host_intr(ap, qc); } } |
1da177e4c Linux-2.6.12-rc2 |
843 844 |
VPRINTK("EXIT "); |
6340f0196 [libata sata_prom... |
845 |
done_irq: |
cca3974e4 libata: Grand ren... |
846 |
spin_unlock(&host->lock); |
1da177e4c Linux-2.6.12-rc2 |
847 848 |
return IRQ_RETVAL(handled); } |
7715a6f9c sata_promise: oth... |
849 |
static void pdc_packet_start(struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
850 851 852 |
{ struct ata_port *ap = qc->ap; struct pdc_port_priv *pp = ap->private_data; |
821d22cdc sata_promise: mmi... |
853 854 |
void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; void __iomem *ata_mmio = ap->ioaddr.cmd_addr; |
1da177e4c Linux-2.6.12-rc2 |
855 856 857 858 859 |
unsigned int port_no = ap->port_no; u8 seq = (u8) (port_no + 1); VPRINTK("ENTER, ap %p ", ap); |
821d22cdc sata_promise: mmi... |
860 861 |
writel(0x00000001, host_mmio + (seq * 4)); readl(host_mmio + (seq * 4)); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
862 863 864 |
pp->pkt[2] = seq; wmb(); /* flush PRD, pkt writes */ |
821d22cdc sata_promise: mmi... |
865 866 |
writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT); readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
867 |
} |
9363c3825 libata: rename SF... |
868 |
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc) |
1da177e4c Linux-2.6.12-rc2 |
869 870 |
{ switch (qc->tf.protocol) { |
0dc36888d libata: rename AT... |
871 |
case ATAPI_PROT_NODATA: |
fba6edbd3 sata_promise: han... |
872 873 874 |
if (qc->dev->flags & ATA_DFLAG_CDB_INTR) break; /*FALLTHROUGH*/ |
51b94d2a5 sata_promise: use... |
875 876 877 878 |
case ATA_PROT_NODATA: if (qc->tf.flags & ATA_TFLAG_POLLING) break; /*FALLTHROUGH*/ |
0dc36888d libata: rename AT... |
879 |
case ATAPI_PROT_DMA: |
1da177e4c Linux-2.6.12-rc2 |
880 |
case ATA_PROT_DMA: |
1da177e4c Linux-2.6.12-rc2 |
881 882 |
pdc_packet_start(qc); return 0; |
1da177e4c Linux-2.6.12-rc2 |
883 884 885 |
default: break; } |
9363c3825 libata: rename SF... |
886 |
return ata_sff_qc_issue(qc); |
1da177e4c Linux-2.6.12-rc2 |
887 |
} |
057ace5e7 libata: const-ifi... |
888 |
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf) |
1da177e4c Linux-2.6.12-rc2 |
889 |
{ |
0dc36888d libata: rename AT... |
890 |
WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA); |
9363c3825 libata: rename SF... |
891 |
ata_sff_tf_load(ap, tf); |
1da177e4c Linux-2.6.12-rc2 |
892 |
} |
5796d1c4c [libata] Address ... |
893 894 |
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf) |
1da177e4c Linux-2.6.12-rc2 |
895 |
{ |
0dc36888d libata: rename AT... |
896 |
WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA); |
9363c3825 libata: rename SF... |
897 |
ata_sff_exec_command(ap, tf); |
1da177e4c Linux-2.6.12-rc2 |
898 |
} |
95006188c sata_promise: ATA... |
899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 |
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 ... |
918 919 920 921 922 |
unsigned int lba = (scsicmd[2] << 24) | (scsicmd[3] << 16) | (scsicmd[4] << 8) | scsicmd[5]; |
95006188c sata_promise: ATA... |
923 924 925 926 927 |
if (lba >= 0xFFFF4FA2) pio = 1; } return pio; } |
724114a57 sata_promise: sep... |
928 |
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc) |
95006188c sata_promise: ATA... |
929 |
{ |
95006188c sata_promise: ATA... |
930 |
/* First generation chips cannot use ATAPI DMA on SATA ports */ |
724114a57 sata_promise: sep... |
931 |
return 1; |
95006188c sata_promise: ATA... |
932 |
} |
1da177e4c Linux-2.6.12-rc2 |
933 |
|
eca25dca1 libata: convert d... |
934 935 |
static void pdc_ata_setup_port(struct ata_port *ap, void __iomem *base, void __iomem *scr_addr) |
1da177e4c Linux-2.6.12-rc2 |
936 |
{ |
eca25dca1 libata: convert d... |
937 938 939 940 941 942 943 944 945 946 947 948 949 950 |
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 |
951 |
} |
eca25dca1 libata: convert d... |
952 |
static void pdc_host_init(struct ata_host *host) |
1da177e4c Linux-2.6.12-rc2 |
953 |
{ |
821d22cdc sata_promise: mmi... |
954 |
void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR]; |
eca25dca1 libata: convert d... |
955 |
int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II; |
d324d4627 [PATCH] sata_prom... |
956 |
int hotplug_offset; |
1da177e4c Linux-2.6.12-rc2 |
957 |
u32 tmp; |
eca25dca1 libata: convert d... |
958 |
if (is_gen2) |
d324d4627 [PATCH] sata_prom... |
959 960 961 |
hotplug_offset = PDC2_SATA_PLUG_CSR; else hotplug_offset = PDC_SATA_PLUG_CSR; |
1da177e4c Linux-2.6.12-rc2 |
962 963 964 965 966 |
/* * 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... |
967 |
/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */ |
821d22cdc sata_promise: mmi... |
968 |
tmp = readl(host_mmio + PDC_FLASH_CTL); |
b2d1eee1e [PATCH] sata_prom... |
969 |
tmp |= 0x02000; /* bit 13 (enable bmr burst) */ |
eca25dca1 libata: convert d... |
970 |
if (!is_gen2) |
b2d1eee1e [PATCH] sata_prom... |
971 |
tmp |= 0x10000; /* bit 16 (fifo threshold at 8 dw) */ |
821d22cdc sata_promise: mmi... |
972 |
writel(tmp, host_mmio + PDC_FLASH_CTL); |
1da177e4c Linux-2.6.12-rc2 |
973 974 |
/* clear plug/unplug flags for all ports */ |
821d22cdc sata_promise: mmi... |
975 976 |
tmp = readl(host_mmio + hotplug_offset); writel(tmp | 0xff, host_mmio + hotplug_offset); |
1da177e4c Linux-2.6.12-rc2 |
977 |
|
a77720ad0 sata_promise: SAT... |
978 |
/* unmask plug/unplug ints */ |
821d22cdc sata_promise: mmi... |
979 980 |
tmp = readl(host_mmio + hotplug_offset); writel(tmp & ~0xff0000, host_mmio + hotplug_offset); |
1da177e4c Linux-2.6.12-rc2 |
981 |
|
b2d1eee1e [PATCH] sata_prom... |
982 |
/* don't initialise TBG or SLEW on 2nd generation chips */ |
eca25dca1 libata: convert d... |
983 |
if (is_gen2) |
b2d1eee1e [PATCH] sata_prom... |
984 |
return; |
1da177e4c Linux-2.6.12-rc2 |
985 |
/* reduce TBG clock to 133 Mhz. */ |
821d22cdc sata_promise: mmi... |
986 |
tmp = readl(host_mmio + PDC_TBG_MODE); |
1da177e4c Linux-2.6.12-rc2 |
987 988 |
tmp &= ~0x30000; /* clear bit 17, 16*/ tmp |= 0x10000; /* set bit 17:16 = 0:1 */ |
821d22cdc sata_promise: mmi... |
989 |
writel(tmp, host_mmio + PDC_TBG_MODE); |
1da177e4c Linux-2.6.12-rc2 |
990 |
|
821d22cdc sata_promise: mmi... |
991 |
readl(host_mmio + PDC_TBG_MODE); /* flush */ |
1da177e4c Linux-2.6.12-rc2 |
992 993 994 |
msleep(10); /* adjust slew rate control register. */ |
821d22cdc sata_promise: mmi... |
995 |
tmp = readl(host_mmio + PDC_SLEW_CTL); |
1da177e4c Linux-2.6.12-rc2 |
996 997 |
tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */ tmp |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */ |
821d22cdc sata_promise: mmi... |
998 |
writel(tmp, host_mmio + PDC_SLEW_CTL); |
1da177e4c Linux-2.6.12-rc2 |
999 |
} |
5796d1c4c [libata] Address ... |
1000 1001 |
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1da177e4c Linux-2.6.12-rc2 |
1002 1003 |
{ static int printed_version; |
eca25dca1 libata: convert d... |
1004 1005 1006 |
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... |
1007 |
void __iomem *host_mmio; |
eca25dca1 libata: convert d... |
1008 |
int n_ports, i, rc; |
5ac2fe575 sata_promise: SAT... |
1009 |
int is_sataii_tx4; |
1da177e4c Linux-2.6.12-rc2 |
1010 1011 |
if (!printed_version++) |
a9524a76f [libata] use dev_... |
1012 1013 |
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION " "); |
1da177e4c Linux-2.6.12-rc2 |
1014 |
|
eca25dca1 libata: convert d... |
1015 |
/* enable and acquire resources */ |
24dc5f33e libata: update li... |
1016 |
rc = pcim_enable_device(pdev); |
1da177e4c Linux-2.6.12-rc2 |
1017 1018 |
if (rc) return rc; |
0d5ff5667 libata: convert t... |
1019 1020 |
rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME); if (rc == -EBUSY) |
24dc5f33e libata: update li... |
1021 |
pcim_pin_device(pdev); |
0d5ff5667 libata: convert t... |
1022 |
if (rc) |
24dc5f33e libata: update li... |
1023 |
return rc; |
821d22cdc sata_promise: mmi... |
1024 |
host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR]; |
1da177e4c Linux-2.6.12-rc2 |
1025 |
|
eca25dca1 libata: convert d... |
1026 1027 1028 1029 1030 1031 |
/* 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 |
1032 |
|
eca25dca1 libata: convert d... |
1033 |
if (pi->flags & PDC_FLAG_SATA_PATA) { |
821d22cdc sata_promise: mmi... |
1034 |
u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1); |
d0e580316 sata_promise: cle... |
1035 |
if (!(tmp & 0x80)) |
eca25dca1 libata: convert d... |
1036 |
ppi[n_ports++] = pi + 1; |
eca25dca1 libata: convert d... |
1037 |
} |
1da177e4c Linux-2.6.12-rc2 |
1038 |
|
eca25dca1 libata: convert d... |
1039 1040 1041 1042 |
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... |
1043 |
return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
1044 |
} |
eca25dca1 libata: convert d... |
1045 |
host->iomap = pcim_iomap_table(pdev); |
1da177e4c Linux-2.6.12-rc2 |
1046 |
|
d0e580316 sata_promise: cle... |
1047 |
is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags); |
5ac2fe575 sata_promise: SAT... |
1048 |
for (i = 0; i < host->n_ports; i++) { |
cbcdd8759 libata: implement... |
1049 |
struct ata_port *ap = host->ports[i]; |
d0e580316 sata_promise: cle... |
1050 |
unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4); |
821d22cdc sata_promise: mmi... |
1051 |
unsigned int ata_offset = 0x200 + ata_no * 0x80; |
cbcdd8759 libata: implement... |
1052 |
unsigned int scr_offset = 0x400 + ata_no * 0x100; |
821d22cdc sata_promise: mmi... |
1053 |
pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset); |
cbcdd8759 libata: implement... |
1054 1055 |
ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio"); |
821d22cdc sata_promise: mmi... |
1056 |
ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata"); |
5ac2fe575 sata_promise: SAT... |
1057 |
} |
1da177e4c Linux-2.6.12-rc2 |
1058 1059 |
/* initialize adapter */ |
eca25dca1 libata: convert d... |
1060 |
pdc_host_init(host); |
1da177e4c Linux-2.6.12-rc2 |
1061 |
|
eca25dca1 libata: convert d... |
1062 1063 1064 1065 1066 1067 |
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 |
1068 |
|
eca25dca1 libata: convert d... |
1069 1070 1071 1072 |
/* 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 |
1073 |
} |
1da177e4c Linux-2.6.12-rc2 |
1074 1075 |
static int __init pdc_ata_init(void) { |
b7887196e [PATCH] libata: r... |
1076 |
return pci_register_driver(&pdc_ata_pci_driver); |
1da177e4c Linux-2.6.12-rc2 |
1077 |
} |
1da177e4c Linux-2.6.12-rc2 |
1078 1079 1080 1081 |
static void __exit pdc_ata_exit(void) { pci_unregister_driver(&pdc_ata_pci_driver); } |
1da177e4c Linux-2.6.12-rc2 |
1082 |
MODULE_AUTHOR("Jeff Garzik"); |
f497ba735 [libata sata_prom... |
1083 |
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver"); |
1da177e4c Linux-2.6.12-rc2 |
1084 1085 1086 1087 1088 1089 |
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); |