diff options
Diffstat (limited to 'drivers/ide')
32 files changed, 561 insertions, 550 deletions
diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index fc0949a8cfde..dbfeda42b940 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c | |||
| @@ -185,8 +185,7 @@ static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 185 | timing = ide_timing_find_mode(XFER_PIO_0 + pio); | 185 | timing = ide_timing_find_mode(XFER_PIO_0 + pio); |
| 186 | BUG_ON(!timing); | 186 | BUG_ON(!timing); |
| 187 | 187 | ||
| 188 | if ((pio > 2 || ata_id_has_iordy(drive->id)) && | 188 | if (ide_pio_need_iordy(drive, pio)) |
| 189 | !(ata_id_is_cfa(drive->id) && pio > 4)) | ||
| 190 | use_iordy = 1; | 189 | use_iordy = 1; |
| 191 | 190 | ||
| 192 | apply_timings(chipselect, pio, timing, use_iordy); | 191 | apply_timings(chipselect, pio, timing, use_iordy); |
diff --git a/drivers/ide/buddha.c b/drivers/ide/buddha.c index e3c6a5913305..ab4f169d0837 100644 --- a/drivers/ide/buddha.c +++ b/drivers/ide/buddha.c | |||
| @@ -99,7 +99,7 @@ static const char *buddha_board_name[] = { "Buddha", "Catweasel", "X-Surf" }; | |||
| 99 | * Check and acknowledge the interrupt status | 99 | * Check and acknowledge the interrupt status |
| 100 | */ | 100 | */ |
| 101 | 101 | ||
| 102 | static int buddha_ack_intr(ide_hwif_t *hwif) | 102 | static int buddha_test_irq(ide_hwif_t *hwif) |
| 103 | { | 103 | { |
| 104 | unsigned char ch; | 104 | unsigned char ch; |
| 105 | 105 | ||
| @@ -109,21 +109,16 @@ static int buddha_ack_intr(ide_hwif_t *hwif) | |||
| 109 | return 1; | 109 | return 1; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | static int xsurf_ack_intr(ide_hwif_t *hwif) | 112 | static void xsurf_clear_irq(ide_drive_t *drive) |
| 113 | { | 113 | { |
| 114 | unsigned char ch; | 114 | /* |
| 115 | 115 | * X-Surf needs 0 written to IRQ register to ensure ISA bit A11 stays at 0 | |
| 116 | ch = z_readb(hwif->io_ports.irq_addr); | 116 | */ |
| 117 | /* X-Surf needs a 0 written to IRQ register to ensure ISA bit A11 stays at 0 */ | 117 | z_writeb(0, drive->hwif->io_ports.irq_addr); |
| 118 | z_writeb(0, hwif->io_ports.irq_addr); | ||
| 119 | if (!(ch & 0x80)) | ||
| 120 | return 0; | ||
| 121 | return 1; | ||
| 122 | } | 118 | } |
| 123 | 119 | ||
| 124 | static void __init buddha_setup_ports(struct ide_hw *hw, unsigned long base, | 120 | static void __init buddha_setup_ports(struct ide_hw *hw, unsigned long base, |
| 125 | unsigned long ctl, unsigned long irq_port, | 121 | unsigned long ctl, unsigned long irq_port) |
| 126 | ide_ack_intr_t *ack_intr) | ||
| 127 | { | 122 | { |
| 128 | int i; | 123 | int i; |
| 129 | 124 | ||
| @@ -138,10 +133,19 @@ static void __init buddha_setup_ports(struct ide_hw *hw, unsigned long base, | |||
| 138 | hw->io_ports.irq_addr = irq_port; | 133 | hw->io_ports.irq_addr = irq_port; |
| 139 | 134 | ||
| 140 | hw->irq = IRQ_AMIGA_PORTS; | 135 | hw->irq = IRQ_AMIGA_PORTS; |
| 141 | hw->ack_intr = ack_intr; | ||
| 142 | } | 136 | } |
| 143 | 137 | ||
| 138 | static const struct ide_port_ops buddha_port_ops = { | ||
| 139 | .test_irq = buddha_test_irq, | ||
| 140 | }; | ||
| 141 | |||
| 142 | static const struct ide_port_ops xsurf_port_ops = { | ||
| 143 | .clear_irq = xsurf_clear_irq, | ||
| 144 | .test_irq = buddha_test_irq, | ||
| 145 | }; | ||
| 146 | |||
| 144 | static const struct ide_port_info buddha_port_info = { | 147 | static const struct ide_port_info buddha_port_info = { |
| 148 | .port_ops = &buddha_port_ops, | ||
| 145 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 149 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
| 146 | .irq_flags = IRQF_SHARED, | 150 | .irq_flags = IRQF_SHARED, |
| 147 | .chipset = ide_generic, | 151 | .chipset = ide_generic, |
| @@ -161,6 +165,7 @@ static int __init buddha_init(void) | |||
| 161 | while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { | 165 | while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { |
| 162 | unsigned long board; | 166 | unsigned long board; |
| 163 | struct ide_hw hw[MAX_NUM_HWIFS], *hws[MAX_NUM_HWIFS]; | 167 | struct ide_hw hw[MAX_NUM_HWIFS], *hws[MAX_NUM_HWIFS]; |
| 168 | struct ide_port_info d = buddha_port_info; | ||
| 164 | 169 | ||
| 165 | if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { | 170 | if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { |
| 166 | buddha_num_hwifs = BUDDHA_NUM_HWIFS; | 171 | buddha_num_hwifs = BUDDHA_NUM_HWIFS; |
| @@ -171,6 +176,7 @@ static int __init buddha_init(void) | |||
| 171 | } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF) { | 176 | } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF) { |
| 172 | buddha_num_hwifs = XSURF_NUM_HWIFS; | 177 | buddha_num_hwifs = XSURF_NUM_HWIFS; |
| 173 | type=BOARD_XSURF; | 178 | type=BOARD_XSURF; |
| 179 | d.port_ops = &xsurf_port_ops; | ||
| 174 | } else | 180 | } else |
| 175 | continue; | 181 | continue; |
| 176 | 182 | ||
| @@ -203,28 +209,24 @@ fail_base2: | |||
| 203 | 209 | ||
| 204 | for (i = 0; i < buddha_num_hwifs; i++) { | 210 | for (i = 0; i < buddha_num_hwifs; i++) { |
| 205 | unsigned long base, ctl, irq_port; | 211 | unsigned long base, ctl, irq_port; |
| 206 | ide_ack_intr_t *ack_intr; | ||
| 207 | 212 | ||
| 208 | if (type != BOARD_XSURF) { | 213 | if (type != BOARD_XSURF) { |
| 209 | base = buddha_board + buddha_bases[i]; | 214 | base = buddha_board + buddha_bases[i]; |
| 210 | ctl = base + BUDDHA_CONTROL; | 215 | ctl = base + BUDDHA_CONTROL; |
| 211 | irq_port = buddha_board + buddha_irqports[i]; | 216 | irq_port = buddha_board + buddha_irqports[i]; |
| 212 | ack_intr = buddha_ack_intr; | ||
| 213 | } else { | 217 | } else { |
| 214 | base = buddha_board + xsurf_bases[i]; | 218 | base = buddha_board + xsurf_bases[i]; |
| 215 | /* X-Surf has no CS1* (Control/AltStat) */ | 219 | /* X-Surf has no CS1* (Control/AltStat) */ |
| 216 | ctl = 0; | 220 | ctl = 0; |
| 217 | irq_port = buddha_board + xsurf_irqports[i]; | 221 | irq_port = buddha_board + xsurf_irqports[i]; |
| 218 | ack_intr = xsurf_ack_intr; | ||
| 219 | } | 222 | } |
| 220 | 223 | ||
| 221 | buddha_setup_ports(&hw[i], base, ctl, irq_port, | 224 | buddha_setup_ports(&hw[i], base, ctl, irq_port); |
| 222 | ack_intr); | ||
| 223 | 225 | ||
| 224 | hws[i] = &hw[i]; | 226 | hws[i] = &hw[i]; |
| 225 | } | 227 | } |
| 226 | 228 | ||
| 227 | ide_host_add(&buddha_port_info, hws, i, NULL); | 229 | ide_host_add(&d, hws, i, NULL); |
| 228 | } | 230 | } |
| 229 | 231 | ||
| 230 | return 0; | 232 | return 0; |
diff --git a/drivers/ide/cmd640.c b/drivers/ide/cmd640.c index 1683ed5c7329..1a32d62ed86b 100644 --- a/drivers/ide/cmd640.c +++ b/drivers/ide/cmd640.c | |||
| @@ -153,6 +153,7 @@ static int cmd640_vlb; | |||
| 153 | #define ARTTIM23 0x57 | 153 | #define ARTTIM23 0x57 |
| 154 | #define ARTTIM23_DIS_RA2 0x04 | 154 | #define ARTTIM23_DIS_RA2 0x04 |
| 155 | #define ARTTIM23_DIS_RA3 0x08 | 155 | #define ARTTIM23_DIS_RA3 0x08 |
| 156 | #define ARTTIM23_IDE23INTR 0x10 | ||
| 156 | #define DRWTIM23 0x58 | 157 | #define DRWTIM23 0x58 |
| 157 | #define BRST 0x59 | 158 | #define BRST 0x59 |
| 158 | 159 | ||
| @@ -629,12 +630,24 @@ static void cmd640_init_dev(ide_drive_t *drive) | |||
| 629 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | 630 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ |
| 630 | } | 631 | } |
| 631 | 632 | ||
| 633 | static int cmd640_test_irq(ide_hwif_t *hwif) | ||
| 634 | { | ||
| 635 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
| 636 | int irq_reg = hwif->channel ? ARTTIM23 : CFR; | ||
| 637 | u8 irq_stat, irq_mask = hwif->channel ? ARTTIM23_IDE23INTR : | ||
| 638 | CFR_IDE01INTR; | ||
| 639 | |||
| 640 | pci_read_config_byte(dev, irq_reg, &irq_stat); | ||
| 641 | |||
| 642 | return (irq_stat & irq_mask) ? 1 : 0; | ||
| 643 | } | ||
| 632 | 644 | ||
| 633 | static const struct ide_port_ops cmd640_port_ops = { | 645 | static const struct ide_port_ops cmd640_port_ops = { |
| 634 | .init_dev = cmd640_init_dev, | 646 | .init_dev = cmd640_init_dev, |
| 635 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | 647 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED |
| 636 | .set_pio_mode = cmd640_set_pio_mode, | 648 | .set_pio_mode = cmd640_set_pio_mode, |
| 637 | #endif | 649 | #endif |
| 650 | .test_irq = cmd640_test_irq, | ||
| 638 | }; | 651 | }; |
| 639 | 652 | ||
| 640 | static int pci_conf1(void) | 653 | static int pci_conf1(void) |
diff --git a/drivers/ide/cmd64x.c b/drivers/ide/cmd64x.c index 80b777e4247b..03c86209446f 100644 --- a/drivers/ide/cmd64x.c +++ b/drivers/ide/cmd64x.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * Copyright (C) 1998 David S. Miller (davem@redhat.com) | 7 | * Copyright (C) 1998 David S. Miller (davem@redhat.com) |
| 8 | * | 8 | * |
| 9 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> | 9 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> |
| 10 | * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> | 10 | * Copyright (C) 2007,2009 MontaVista Software, Inc. <source@mvista.com> |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| @@ -118,8 +118,9 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |||
| 118 | ide_hwif_t *hwif = drive->hwif; | 118 | ide_hwif_t *hwif = drive->hwif; |
| 119 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 119 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 120 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | 120 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); |
| 121 | unsigned long setup_count; | ||
| 121 | unsigned int cycle_time; | 122 | unsigned int cycle_time; |
| 122 | u8 setup_count, arttim = 0; | 123 | u8 arttim = 0; |
| 123 | 124 | ||
| 124 | static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0}; | 125 | static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0}; |
| 125 | static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23}; | 126 | static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23}; |
| @@ -140,10 +141,11 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |||
| 140 | if (hwif->channel) { | 141 | if (hwif->channel) { |
| 141 | ide_drive_t *pair = ide_get_pair_dev(drive); | 142 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 142 | 143 | ||
| 143 | drive->drive_data = setup_count; | 144 | ide_set_drivedata(drive, (void *)setup_count); |
| 144 | 145 | ||
| 145 | if (pair) | 146 | if (pair) |
| 146 | setup_count = max_t(u8, setup_count, pair->drive_data); | 147 | setup_count = max_t(u8, setup_count, |
| 148 | (unsigned long)ide_get_drivedata(pair)); | ||
| 147 | } | 149 | } |
| 148 | 150 | ||
| 149 | if (setup_count > 5) /* shouldn't actually happen... */ | 151 | if (setup_count > 5) /* shouldn't actually happen... */ |
| @@ -226,11 +228,11 @@ static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 226 | (void) pci_write_config_byte(dev, pciU, regU); | 228 | (void) pci_write_config_byte(dev, pciU, regU); |
| 227 | } | 229 | } |
| 228 | 230 | ||
| 229 | static int cmd648_dma_end(ide_drive_t *drive) | 231 | static void cmd648_clear_irq(ide_drive_t *drive) |
| 230 | { | 232 | { |
| 231 | ide_hwif_t *hwif = drive->hwif; | 233 | ide_hwif_t *hwif = drive->hwif; |
| 232 | unsigned long base = hwif->dma_base - (hwif->channel * 8); | 234 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 233 | int err = ide_dma_end(drive); | 235 | unsigned long base = pci_resource_start(dev, 4); |
| 234 | u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : | 236 | u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : |
| 235 | MRDMODE_INTR_CH0; | 237 | MRDMODE_INTR_CH0; |
| 236 | u8 mrdmode = inb(base + 1); | 238 | u8 mrdmode = inb(base + 1); |
| @@ -238,11 +240,9 @@ static int cmd648_dma_end(ide_drive_t *drive) | |||
| 238 | /* clear the interrupt bit */ | 240 | /* clear the interrupt bit */ |
| 239 | outb((mrdmode & ~(MRDMODE_INTR_CH0 | MRDMODE_INTR_CH1)) | irq_mask, | 241 | outb((mrdmode & ~(MRDMODE_INTR_CH0 | MRDMODE_INTR_CH1)) | irq_mask, |
| 240 | base + 1); | 242 | base + 1); |
| 241 | |||
| 242 | return err; | ||
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | static int cmd64x_dma_end(ide_drive_t *drive) | 245 | static void cmd64x_clear_irq(ide_drive_t *drive) |
| 246 | { | 246 | { |
| 247 | ide_hwif_t *hwif = drive->hwif; | 247 | ide_hwif_t *hwif = drive->hwif; |
| 248 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 248 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| @@ -250,62 +250,40 @@ static int cmd64x_dma_end(ide_drive_t *drive) | |||
| 250 | u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : | 250 | u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : |
| 251 | CFR_INTR_CH0; | 251 | CFR_INTR_CH0; |
| 252 | u8 irq_stat = 0; | 252 | u8 irq_stat = 0; |
| 253 | int err = ide_dma_end(drive); | ||
| 254 | 253 | ||
| 255 | (void) pci_read_config_byte(dev, irq_reg, &irq_stat); | 254 | (void) pci_read_config_byte(dev, irq_reg, &irq_stat); |
| 256 | /* clear the interrupt bit */ | 255 | /* clear the interrupt bit */ |
| 257 | (void) pci_write_config_byte(dev, irq_reg, irq_stat | irq_mask); | 256 | (void) pci_write_config_byte(dev, irq_reg, irq_stat | irq_mask); |
| 258 | |||
| 259 | return err; | ||
| 260 | } | 257 | } |
| 261 | 258 | ||
| 262 | static int cmd648_dma_test_irq(ide_drive_t *drive) | 259 | static int cmd648_test_irq(ide_hwif_t *hwif) |
| 263 | { | 260 | { |
| 264 | ide_hwif_t *hwif = drive->hwif; | 261 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 265 | unsigned long base = hwif->dma_base - (hwif->channel * 8); | 262 | unsigned long base = pci_resource_start(dev, 4); |
| 266 | u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : | 263 | u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : |
| 267 | MRDMODE_INTR_CH0; | 264 | MRDMODE_INTR_CH0; |
| 268 | u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS); | ||
| 269 | u8 mrdmode = inb(base + 1); | 265 | u8 mrdmode = inb(base + 1); |
| 270 | 266 | ||
| 271 | #ifdef DEBUG | 267 | pr_debug("%s: mrdmode: 0x%02x irq_mask: 0x%02x\n", |
| 272 | printk("%s: dma_stat: 0x%02x mrdmode: 0x%02x irq_mask: 0x%02x\n", | 268 | hwif->name, mrdmode, irq_mask); |
| 273 | drive->name, dma_stat, mrdmode, irq_mask); | ||
| 274 | #endif | ||
| 275 | if (!(mrdmode & irq_mask)) | ||
| 276 | return 0; | ||
| 277 | |||
| 278 | /* return 1 if INTR asserted */ | ||
| 279 | if (dma_stat & 4) | ||
| 280 | return 1; | ||
| 281 | 269 | ||
| 282 | return 0; | 270 | return (mrdmode & irq_mask) ? 1 : 0; |
| 283 | } | 271 | } |
| 284 | 272 | ||
| 285 | static int cmd64x_dma_test_irq(ide_drive_t *drive) | 273 | static int cmd64x_test_irq(ide_hwif_t *hwif) |
| 286 | { | 274 | { |
| 287 | ide_hwif_t *hwif = drive->hwif; | ||
| 288 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 275 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 289 | int irq_reg = hwif->channel ? ARTTIM23 : CFR; | 276 | int irq_reg = hwif->channel ? ARTTIM23 : CFR; |
| 290 | u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : | 277 | u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : |
| 291 | CFR_INTR_CH0; | 278 | CFR_INTR_CH0; |
| 292 | u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS); | ||
| 293 | u8 irq_stat = 0; | 279 | u8 irq_stat = 0; |
| 294 | 280 | ||
| 295 | (void) pci_read_config_byte(dev, irq_reg, &irq_stat); | 281 | (void) pci_read_config_byte(dev, irq_reg, &irq_stat); |
| 296 | 282 | ||
| 297 | #ifdef DEBUG | 283 | pr_debug("%s: irq_stat: 0x%02x irq_mask: 0x%02x\n", |
| 298 | printk("%s: dma_stat: 0x%02x irq_stat: 0x%02x irq_mask: 0x%02x\n", | 284 | hwif->name, irq_stat, irq_mask); |
| 299 | drive->name, dma_stat, irq_stat, irq_mask); | ||
| 300 | #endif | ||
| 301 | if (!(irq_stat & irq_mask)) | ||
| 302 | return 0; | ||
| 303 | |||
| 304 | /* return 1 if INTR asserted */ | ||
| 305 | if (dma_stat & 4) | ||
| 306 | return 1; | ||
| 307 | 285 | ||
| 308 | return 0; | 286 | return (irq_stat & irq_mask) ? 1 : 0; |
| 309 | } | 287 | } |
| 310 | 288 | ||
| 311 | /* | 289 | /* |
| @@ -370,18 +348,17 @@ static u8 cmd64x_cable_detect(ide_hwif_t *hwif) | |||
| 370 | static const struct ide_port_ops cmd64x_port_ops = { | 348 | static const struct ide_port_ops cmd64x_port_ops = { |
| 371 | .set_pio_mode = cmd64x_set_pio_mode, | 349 | .set_pio_mode = cmd64x_set_pio_mode, |
| 372 | .set_dma_mode = cmd64x_set_dma_mode, | 350 | .set_dma_mode = cmd64x_set_dma_mode, |
| 351 | .clear_irq = cmd64x_clear_irq, | ||
| 352 | .test_irq = cmd64x_test_irq, | ||
| 373 | .cable_detect = cmd64x_cable_detect, | 353 | .cable_detect = cmd64x_cable_detect, |
| 374 | }; | 354 | }; |
| 375 | 355 | ||
| 376 | static const struct ide_dma_ops cmd64x_dma_ops = { | 356 | static const struct ide_port_ops cmd648_port_ops = { |
| 377 | .dma_host_set = ide_dma_host_set, | 357 | .set_pio_mode = cmd64x_set_pio_mode, |
| 378 | .dma_setup = ide_dma_setup, | 358 | .set_dma_mode = cmd64x_set_dma_mode, |
| 379 | .dma_start = ide_dma_start, | 359 | .clear_irq = cmd648_clear_irq, |
| 380 | .dma_end = cmd64x_dma_end, | 360 | .test_irq = cmd648_test_irq, |
| 381 | .dma_test_irq = cmd64x_dma_test_irq, | 361 | .cable_detect = cmd64x_cable_detect, |
| 382 | .dma_lost_irq = ide_dma_lost_irq, | ||
| 383 | .dma_timer_expiry = ide_dma_sff_timer_expiry, | ||
| 384 | .dma_sff_read_status = ide_dma_sff_read_status, | ||
| 385 | }; | 362 | }; |
| 386 | 363 | ||
| 387 | static const struct ide_dma_ops cmd646_rev1_dma_ops = { | 364 | static const struct ide_dma_ops cmd646_rev1_dma_ops = { |
| @@ -395,24 +372,12 @@ static const struct ide_dma_ops cmd646_rev1_dma_ops = { | |||
| 395 | .dma_sff_read_status = ide_dma_sff_read_status, | 372 | .dma_sff_read_status = ide_dma_sff_read_status, |
| 396 | }; | 373 | }; |
| 397 | 374 | ||
| 398 | static const struct ide_dma_ops cmd648_dma_ops = { | ||
| 399 | .dma_host_set = ide_dma_host_set, | ||
| 400 | .dma_setup = ide_dma_setup, | ||
| 401 | .dma_start = ide_dma_start, | ||
| 402 | .dma_end = cmd648_dma_end, | ||
| 403 | .dma_test_irq = cmd648_dma_test_irq, | ||
| 404 | .dma_lost_irq = ide_dma_lost_irq, | ||
| 405 | .dma_timer_expiry = ide_dma_sff_timer_expiry, | ||
| 406 | .dma_sff_read_status = ide_dma_sff_read_status, | ||
| 407 | }; | ||
| 408 | |||
| 409 | static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | 375 | static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { |
| 410 | { /* 0: CMD643 */ | 376 | { /* 0: CMD643 */ |
| 411 | .name = DRV_NAME, | 377 | .name = DRV_NAME, |
| 412 | .init_chipset = init_chipset_cmd64x, | 378 | .init_chipset = init_chipset_cmd64x, |
| 413 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, | 379 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, |
| 414 | .port_ops = &cmd64x_port_ops, | 380 | .port_ops = &cmd64x_port_ops, |
| 415 | .dma_ops = &cmd64x_dma_ops, | ||
| 416 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | | 381 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | |
| 417 | IDE_HFLAG_ABUSE_PREFETCH, | 382 | IDE_HFLAG_ABUSE_PREFETCH, |
| 418 | .pio_mask = ATA_PIO5, | 383 | .pio_mask = ATA_PIO5, |
| @@ -423,8 +388,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
| 423 | .name = DRV_NAME, | 388 | .name = DRV_NAME, |
| 424 | .init_chipset = init_chipset_cmd64x, | 389 | .init_chipset = init_chipset_cmd64x, |
| 425 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 390 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
| 426 | .port_ops = &cmd64x_port_ops, | 391 | .port_ops = &cmd648_port_ops, |
| 427 | .dma_ops = &cmd648_dma_ops, | ||
| 428 | .host_flags = IDE_HFLAG_SERIALIZE | | 392 | .host_flags = IDE_HFLAG_SERIALIZE | |
| 429 | IDE_HFLAG_ABUSE_PREFETCH, | 393 | IDE_HFLAG_ABUSE_PREFETCH, |
| 430 | .pio_mask = ATA_PIO5, | 394 | .pio_mask = ATA_PIO5, |
| @@ -435,8 +399,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
| 435 | .name = DRV_NAME, | 399 | .name = DRV_NAME, |
| 436 | .init_chipset = init_chipset_cmd64x, | 400 | .init_chipset = init_chipset_cmd64x, |
| 437 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 401 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
| 438 | .port_ops = &cmd64x_port_ops, | 402 | .port_ops = &cmd648_port_ops, |
| 439 | .dma_ops = &cmd648_dma_ops, | ||
| 440 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 403 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, |
| 441 | .pio_mask = ATA_PIO5, | 404 | .pio_mask = ATA_PIO5, |
| 442 | .mwdma_mask = ATA_MWDMA2, | 405 | .mwdma_mask = ATA_MWDMA2, |
| @@ -446,8 +409,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
| 446 | .name = DRV_NAME, | 409 | .name = DRV_NAME, |
| 447 | .init_chipset = init_chipset_cmd64x, | 410 | .init_chipset = init_chipset_cmd64x, |
| 448 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 411 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
| 449 | .port_ops = &cmd64x_port_ops, | 412 | .port_ops = &cmd648_port_ops, |
| 450 | .dma_ops = &cmd648_dma_ops, | ||
| 451 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 413 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, |
| 452 | .pio_mask = ATA_PIO5, | 414 | .pio_mask = ATA_PIO5, |
| 453 | .mwdma_mask = ATA_MWDMA2, | 415 | .mwdma_mask = ATA_MWDMA2, |
| @@ -484,10 +446,9 @@ static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_devic | |||
| 484 | */ | 446 | */ |
| 485 | if (dev->revision < 3) { | 447 | if (dev->revision < 3) { |
| 486 | d.enablebits[0].reg = 0; | 448 | d.enablebits[0].reg = 0; |
| 449 | d.port_ops = &cmd64x_port_ops; | ||
| 487 | if (dev->revision == 1) | 450 | if (dev->revision == 1) |
| 488 | d.dma_ops = &cmd646_rev1_dma_ops; | 451 | d.dma_ops = &cmd646_rev1_dma_ops; |
| 489 | else | ||
| 490 | d.dma_ops = &cmd64x_dma_ops; | ||
| 491 | } | 452 | } |
| 492 | } | 453 | } |
| 493 | } | 454 | } |
diff --git a/drivers/ide/cs5536.c b/drivers/ide/cs5536.c index 0332a95eefd4..9623b852c616 100644 --- a/drivers/ide/cs5536.c +++ b/drivers/ide/cs5536.c | |||
| @@ -146,14 +146,16 @@ static void cs5536_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 146 | struct pci_dev *pdev = to_pci_dev(drive->hwif->dev); | 146 | struct pci_dev *pdev = to_pci_dev(drive->hwif->dev); |
| 147 | ide_drive_t *pair = ide_get_pair_dev(drive); | 147 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 148 | int cshift = (drive->dn & 1) ? IDE_CAST_D1_SHIFT : IDE_CAST_D0_SHIFT; | 148 | int cshift = (drive->dn & 1) ? IDE_CAST_D1_SHIFT : IDE_CAST_D0_SHIFT; |
| 149 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 149 | u32 cast; | 150 | u32 cast; |
| 150 | u8 cmd_pio = pio; | 151 | u8 cmd_pio = pio; |
| 151 | 152 | ||
| 152 | if (pair) | 153 | if (pair) |
| 153 | cmd_pio = min(pio, ide_get_best_pio_mode(pair, 255, 4)); | 154 | cmd_pio = min(pio, ide_get_best_pio_mode(pair, 255, 4)); |
| 154 | 155 | ||
| 155 | drive->drive_data &= (IDE_DRV_MASK << 8); | 156 | timings &= (IDE_DRV_MASK << 8); |
| 156 | drive->drive_data |= drv_timings[pio]; | 157 | timings |= drv_timings[pio]; |
| 158 | ide_set_drivedata(drive, (void *)timings); | ||
| 157 | 159 | ||
| 158 | cs5536_program_dtc(drive, drv_timings[pio]); | 160 | cs5536_program_dtc(drive, drv_timings[pio]); |
| 159 | 161 | ||
| @@ -186,6 +188,7 @@ static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode) | |||
| 186 | 188 | ||
| 187 | struct pci_dev *pdev = to_pci_dev(drive->hwif->dev); | 189 | struct pci_dev *pdev = to_pci_dev(drive->hwif->dev); |
| 188 | int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT; | 190 | int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT; |
| 191 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 189 | u32 etc; | 192 | u32 etc; |
| 190 | 193 | ||
| 191 | cs5536_read(pdev, ETC, &etc); | 194 | cs5536_read(pdev, ETC, &etc); |
| @@ -195,8 +198,9 @@ static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode) | |||
| 195 | etc |= udma_timings[mode - XFER_UDMA_0] << dshift; | 198 | etc |= udma_timings[mode - XFER_UDMA_0] << dshift; |
| 196 | } else { /* MWDMA */ | 199 | } else { /* MWDMA */ |
| 197 | etc &= ~(IDE_ETC_UDMA_MASK << dshift); | 200 | etc &= ~(IDE_ETC_UDMA_MASK << dshift); |
| 198 | drive->drive_data &= IDE_DRV_MASK; | 201 | timings &= IDE_DRV_MASK; |
| 199 | drive->drive_data |= mwdma_timings[mode - XFER_MW_DMA_0] << 8; | 202 | timings |= mwdma_timings[mode - XFER_MW_DMA_0] << 8; |
| 203 | ide_set_drivedata(drive, (void *)timings); | ||
| 200 | } | 204 | } |
| 201 | 205 | ||
| 202 | cs5536_write(pdev, ETC, etc); | 206 | cs5536_write(pdev, ETC, etc); |
| @@ -204,9 +208,11 @@ static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode) | |||
| 204 | 208 | ||
| 205 | static void cs5536_dma_start(ide_drive_t *drive) | 209 | static void cs5536_dma_start(ide_drive_t *drive) |
| 206 | { | 210 | { |
| 211 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 212 | |||
| 207 | if (drive->current_speed < XFER_UDMA_0 && | 213 | if (drive->current_speed < XFER_UDMA_0 && |
| 208 | (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK)) | 214 | (timings >> 8) != (timings & IDE_DRV_MASK)) |
| 209 | cs5536_program_dtc(drive, drive->drive_data >> 8); | 215 | cs5536_program_dtc(drive, timings >> 8); |
| 210 | 216 | ||
| 211 | ide_dma_start(drive); | 217 | ide_dma_start(drive); |
| 212 | } | 218 | } |
| @@ -214,10 +220,11 @@ static void cs5536_dma_start(ide_drive_t *drive) | |||
| 214 | static int cs5536_dma_end(ide_drive_t *drive) | 220 | static int cs5536_dma_end(ide_drive_t *drive) |
| 215 | { | 221 | { |
| 216 | int ret = ide_dma_end(drive); | 222 | int ret = ide_dma_end(drive); |
| 223 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 217 | 224 | ||
| 218 | if (drive->current_speed < XFER_UDMA_0 && | 225 | if (drive->current_speed < XFER_UDMA_0 && |
| 219 | (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK)) | 226 | (timings >> 8) != (timings & IDE_DRV_MASK)) |
| 220 | cs5536_program_dtc(drive, drive->drive_data & IDE_DRV_MASK); | 227 | cs5536_program_dtc(drive, timings & IDE_DRV_MASK); |
| 221 | 228 | ||
| 222 | return ret; | 229 | return ret; |
| 223 | } | 230 | } |
diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c index 22fa27389c3b..a5a07ccb81a7 100644 --- a/drivers/ide/falconide.c +++ b/drivers/ide/falconide.c | |||
| @@ -128,7 +128,6 @@ static void __init falconide_setup_ports(struct ide_hw *hw) | |||
| 128 | hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL; | 128 | hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL; |
| 129 | 129 | ||
| 130 | hw->irq = IRQ_MFP_IDE; | 130 | hw->irq = IRQ_MFP_IDE; |
| 131 | hw->ack_intr = NULL; | ||
| 132 | } | 131 | } |
| 133 | 132 | ||
| 134 | /* | 133 | /* |
diff --git a/drivers/ide/gayle.c b/drivers/ide/gayle.c index 4451a6a5dfe0..b9e517de6a82 100644 --- a/drivers/ide/gayle.c +++ b/drivers/ide/gayle.c | |||
| @@ -66,7 +66,7 @@ MODULE_PARM_DESC(doubler, "enable support for IDE doublers"); | |||
| 66 | * Check and acknowledge the interrupt status | 66 | * Check and acknowledge the interrupt status |
| 67 | */ | 67 | */ |
| 68 | 68 | ||
| 69 | static int gayle_ack_intr_a4000(ide_hwif_t *hwif) | 69 | static int gayle_test_irq(ide_hwif_t *hwif) |
| 70 | { | 70 | { |
| 71 | unsigned char ch; | 71 | unsigned char ch; |
| 72 | 72 | ||
| @@ -76,21 +76,16 @@ static int gayle_ack_intr_a4000(ide_hwif_t *hwif) | |||
| 76 | return 1; | 76 | return 1; |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | static int gayle_ack_intr_a1200(ide_hwif_t *hwif) | 79 | static void gayle_a1200_clear_irq(ide_drive_t *drive) |
| 80 | { | 80 | { |
| 81 | unsigned char ch; | 81 | ide_hwif_t *hwif = drive->hwif; |
| 82 | 82 | ||
| 83 | ch = z_readb(hwif->io_ports.irq_addr); | ||
| 84 | if (!(ch & GAYLE_IRQ_IDE)) | ||
| 85 | return 0; | ||
| 86 | (void)z_readb(hwif->io_ports.status_addr); | 83 | (void)z_readb(hwif->io_ports.status_addr); |
| 87 | z_writeb(0x7c, hwif->io_ports.irq_addr); | 84 | z_writeb(0x7c, hwif->io_ports.irq_addr); |
| 88 | return 1; | ||
| 89 | } | 85 | } |
| 90 | 86 | ||
| 91 | static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base, | 87 | static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base, |
| 92 | unsigned long ctl, unsigned long irq_port, | 88 | unsigned long ctl, unsigned long irq_port) |
| 93 | ide_ack_intr_t *ack_intr) | ||
| 94 | { | 89 | { |
| 95 | int i; | 90 | int i; |
| 96 | 91 | ||
| @@ -105,9 +100,17 @@ static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base, | |||
| 105 | hw->io_ports.irq_addr = irq_port; | 100 | hw->io_ports.irq_addr = irq_port; |
| 106 | 101 | ||
| 107 | hw->irq = IRQ_AMIGA_PORTS; | 102 | hw->irq = IRQ_AMIGA_PORTS; |
| 108 | hw->ack_intr = ack_intr; | ||
| 109 | } | 103 | } |
| 110 | 104 | ||
| 105 | static const struct ide_port_ops gayle_a4000_port_ops = { | ||
| 106 | .test_irq = gayle_test_irq, | ||
| 107 | }; | ||
| 108 | |||
| 109 | static const struct ide_port_ops gayle_a1200_port_ops = { | ||
| 110 | .clear_irq = gayle_a1200_clear_irq, | ||
| 111 | .test_irq = gayle_test_irq, | ||
| 112 | }; | ||
| 113 | |||
| 111 | static const struct ide_port_info gayle_port_info = { | 114 | static const struct ide_port_info gayle_port_info = { |
| 112 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | | 115 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | |
| 113 | IDE_HFLAG_NO_DMA, | 116 | IDE_HFLAG_NO_DMA, |
| @@ -123,9 +126,9 @@ static int __init gayle_init(void) | |||
| 123 | { | 126 | { |
| 124 | unsigned long phys_base, res_start, res_n; | 127 | unsigned long phys_base, res_start, res_n; |
| 125 | unsigned long base, ctrlport, irqport; | 128 | unsigned long base, ctrlport, irqport; |
| 126 | ide_ack_intr_t *ack_intr; | ||
| 127 | int a4000, i, rc; | 129 | int a4000, i, rc; |
| 128 | struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS]; | 130 | struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS]; |
| 131 | struct ide_port_info d = gayle_port_info; | ||
| 129 | 132 | ||
| 130 | if (!MACH_IS_AMIGA) | 133 | if (!MACH_IS_AMIGA) |
| 131 | return -ENODEV; | 134 | return -ENODEV; |
| @@ -148,11 +151,11 @@ found: | |||
| 148 | if (a4000) { | 151 | if (a4000) { |
| 149 | phys_base = GAYLE_BASE_4000; | 152 | phys_base = GAYLE_BASE_4000; |
| 150 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); | 153 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); |
| 151 | ack_intr = gayle_ack_intr_a4000; | 154 | d.port_ops = &gayle_a4000_port_ops; |
| 152 | } else { | 155 | } else { |
| 153 | phys_base = GAYLE_BASE_1200; | 156 | phys_base = GAYLE_BASE_1200; |
| 154 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_1200); | 157 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_1200); |
| 155 | ack_intr = gayle_ack_intr_a1200; | 158 | d.port_ops = &gayle_a1200_port_ops; |
| 156 | } | 159 | } |
| 157 | 160 | ||
| 158 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); | 161 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); |
| @@ -165,12 +168,12 @@ found: | |||
| 165 | base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT); | 168 | base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT); |
| 166 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; | 169 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; |
| 167 | 170 | ||
| 168 | gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr); | 171 | gayle_setup_ports(&hw[i], base, ctrlport, irqport); |
| 169 | 172 | ||
| 170 | hws[i] = &hw[i]; | 173 | hws[i] = &hw[i]; |
| 171 | } | 174 | } |
| 172 | 175 | ||
| 173 | rc = ide_host_add(&gayle_port_info, hws, i, NULL); | 176 | rc = ide_host_add(&d, hws, i, NULL); |
| 174 | if (rc) | 177 | if (rc) |
| 175 | release_mem_region(res_start, res_n); | 178 | release_mem_region(res_start, res_n); |
| 176 | 179 | ||
diff --git a/drivers/ide/ht6560b.c b/drivers/ide/ht6560b.c index 2fb0f2965009..aafed8060e17 100644 --- a/drivers/ide/ht6560b.c +++ b/drivers/ide/ht6560b.c | |||
| @@ -44,7 +44,12 @@ | |||
| 44 | * bit3 (0x08): "1" 3 cycle time, "0" 2 cycle time (?) | 44 | * bit3 (0x08): "1" 3 cycle time, "0" 2 cycle time (?) |
| 45 | */ | 45 | */ |
| 46 | #define HT_CONFIG_PORT 0x3e6 | 46 | #define HT_CONFIG_PORT 0x3e6 |
| 47 | #define HT_CONFIG(drivea) (u8)(((drivea)->drive_data & 0xff00) >> 8) | 47 | |
| 48 | static inline u8 HT_CONFIG(ide_drive_t *drive) | ||
| 49 | { | ||
| 50 | return ((unsigned long)ide_get_drivedata(drive) & 0xff00) >> 8; | ||
| 51 | } | ||
| 52 | |||
| 48 | /* | 53 | /* |
| 49 | * FIFO + PREFETCH (both a/b-model) | 54 | * FIFO + PREFETCH (both a/b-model) |
| 50 | */ | 55 | */ |
| @@ -90,7 +95,11 @@ | |||
| 90 | * Active Time for each drive. Smaller value gives higher speed. | 95 | * Active Time for each drive. Smaller value gives higher speed. |
| 91 | * In case of failures you should probably fall back to a higher value. | 96 | * In case of failures you should probably fall back to a higher value. |
| 92 | */ | 97 | */ |
| 93 | #define HT_TIMING(drivea) (u8)((drivea)->drive_data & 0x00ff) | 98 | static inline u8 HT_TIMING(ide_drive_t *drive) |
| 99 | { | ||
| 100 | return (unsigned long)ide_get_drivedata(drive) & 0x00ff; | ||
| 101 | } | ||
| 102 | |||
| 94 | #define HT_TIMING_DEFAULT 0xff | 103 | #define HT_TIMING_DEFAULT 0xff |
| 95 | 104 | ||
| 96 | /* | 105 | /* |
| @@ -242,23 +251,27 @@ static DEFINE_SPINLOCK(ht6560b_lock); | |||
| 242 | */ | 251 | */ |
| 243 | static void ht_set_prefetch(ide_drive_t *drive, u8 state) | 252 | static void ht_set_prefetch(ide_drive_t *drive, u8 state) |
| 244 | { | 253 | { |
| 245 | unsigned long flags; | 254 | unsigned long flags, config; |
| 246 | int t = HT_PREFETCH_MODE << 8; | 255 | int t = HT_PREFETCH_MODE << 8; |
| 247 | 256 | ||
| 248 | spin_lock_irqsave(&ht6560b_lock, flags); | 257 | spin_lock_irqsave(&ht6560b_lock, flags); |
| 249 | 258 | ||
| 259 | config = (unsigned long)ide_get_drivedata(drive); | ||
| 260 | |||
| 250 | /* | 261 | /* |
| 251 | * Prefetch mode and unmask irq seems to conflict | 262 | * Prefetch mode and unmask irq seems to conflict |
| 252 | */ | 263 | */ |
| 253 | if (state) { | 264 | if (state) { |
| 254 | drive->drive_data |= t; /* enable prefetch mode */ | 265 | config |= t; /* enable prefetch mode */ |
| 255 | drive->dev_flags |= IDE_DFLAG_NO_UNMASK; | 266 | drive->dev_flags |= IDE_DFLAG_NO_UNMASK; |
| 256 | drive->dev_flags &= ~IDE_DFLAG_UNMASK; | 267 | drive->dev_flags &= ~IDE_DFLAG_UNMASK; |
| 257 | } else { | 268 | } else { |
| 258 | drive->drive_data &= ~t; /* disable prefetch mode */ | 269 | config &= ~t; /* disable prefetch mode */ |
| 259 | drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK; | 270 | drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK; |
| 260 | } | 271 | } |
| 261 | 272 | ||
| 273 | ide_set_drivedata(drive, (void *)config); | ||
| 274 | |||
| 262 | spin_unlock_irqrestore(&ht6560b_lock, flags); | 275 | spin_unlock_irqrestore(&ht6560b_lock, flags); |
| 263 | 276 | ||
| 264 | #ifdef DEBUG | 277 | #ifdef DEBUG |
| @@ -268,7 +281,7 @@ static void ht_set_prefetch(ide_drive_t *drive, u8 state) | |||
| 268 | 281 | ||
| 269 | static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio) | 282 | static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio) |
| 270 | { | 283 | { |
| 271 | unsigned long flags; | 284 | unsigned long flags, config; |
| 272 | u8 timing; | 285 | u8 timing; |
| 273 | 286 | ||
| 274 | switch (pio) { | 287 | switch (pio) { |
| @@ -281,8 +294,10 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 281 | timing = ht_pio2timings(drive, pio); | 294 | timing = ht_pio2timings(drive, pio); |
| 282 | 295 | ||
| 283 | spin_lock_irqsave(&ht6560b_lock, flags); | 296 | spin_lock_irqsave(&ht6560b_lock, flags); |
| 284 | drive->drive_data &= 0xff00; | 297 | config = (unsigned long)ide_get_drivedata(drive); |
| 285 | drive->drive_data |= timing; | 298 | config &= 0xff00; |
| 299 | config |= timing; | ||
| 300 | ide_set_drivedata(drive, (void *)config); | ||
| 286 | spin_unlock_irqrestore(&ht6560b_lock, flags); | 301 | spin_unlock_irqrestore(&ht6560b_lock, flags); |
| 287 | 302 | ||
| 288 | #ifdef DEBUG | 303 | #ifdef DEBUG |
| @@ -299,7 +314,7 @@ static void __init ht6560b_init_dev(ide_drive_t *drive) | |||
| 299 | if (hwif->channel) | 314 | if (hwif->channel) |
| 300 | t |= (HT_SECONDARY_IF << 8); | 315 | t |= (HT_SECONDARY_IF << 8); |
| 301 | 316 | ||
| 302 | drive->drive_data = t; | 317 | ide_set_drivedata(drive, (void *)t); |
| 303 | } | 318 | } |
| 304 | 319 | ||
| 305 | static int probe_ht6560b; | 320 | static int probe_ht6560b; |
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index 5af3d0ffaf0a..0f67f1abbbd3 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c | |||
| @@ -187,7 +187,8 @@ static const expansioncard_ops_t icside_ops_arcin_v6 = { | |||
| 187 | */ | 187 | */ |
| 188 | static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode) | 188 | static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode) |
| 189 | { | 189 | { |
| 190 | int cycle_time, use_dma_info = 0; | 190 | unsigned long cycle_time; |
| 191 | int use_dma_info = 0; | ||
| 191 | 192 | ||
| 192 | switch (xfer_mode) { | 193 | switch (xfer_mode) { |
| 193 | case XFER_MW_DMA_2: | 194 | case XFER_MW_DMA_2: |
| @@ -218,10 +219,11 @@ static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode) | |||
| 218 | if (use_dma_info && drive->id[ATA_ID_EIDE_DMA_TIME] > cycle_time) | 219 | if (use_dma_info && drive->id[ATA_ID_EIDE_DMA_TIME] > cycle_time) |
| 219 | cycle_time = drive->id[ATA_ID_EIDE_DMA_TIME]; | 220 | cycle_time = drive->id[ATA_ID_EIDE_DMA_TIME]; |
| 220 | 221 | ||
| 221 | drive->drive_data = cycle_time; | 222 | ide_set_drivedata(drive, (void *)cycle_time); |
| 222 | 223 | ||
| 223 | printk("%s: %s selected (peak %dMB/s)\n", drive->name, | 224 | printk("%s: %s selected (peak %dMB/s)\n", drive->name, |
| 224 | ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data); | 225 | ide_xfer_verbose(xfer_mode), |
| 226 | 2000 / (unsigned long)ide_get_drivedata(drive)); | ||
| 225 | } | 227 | } |
| 226 | 228 | ||
| 227 | static const struct ide_port_ops icside_v6_port_ops = { | 229 | static const struct ide_port_ops icside_v6_port_ops = { |
| @@ -277,7 +279,7 @@ static int icside_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd) | |||
| 277 | /* | 279 | /* |
| 278 | * Select the correct timing for this drive. | 280 | * Select the correct timing for this drive. |
| 279 | */ | 281 | */ |
| 280 | set_dma_speed(ec->dma, drive->drive_data); | 282 | set_dma_speed(ec->dma, (unsigned long)ide_get_drivedata(drive)); |
| 281 | 283 | ||
| 282 | /* | 284 | /* |
| 283 | * Tell the DMA engine about the SG table and | 285 | * Tell the DMA engine about the SG table and |
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 702ef64a0f12..eb2181a6a11c 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
| @@ -10,6 +10,9 @@ | |||
| 10 | 10 | ||
| 11 | #include <scsi/scsi.h> | 11 | #include <scsi/scsi.h> |
| 12 | 12 | ||
| 13 | #define DRV_NAME "ide-atapi" | ||
| 14 | #define PFX DRV_NAME ": " | ||
| 15 | |||
| 13 | #ifdef DEBUG | 16 | #ifdef DEBUG |
| 14 | #define debug_log(fmt, args...) \ | 17 | #define debug_log(fmt, args...) \ |
| 15 | printk(KERN_INFO "ide: " fmt, ## args) | 18 | printk(KERN_INFO "ide: " fmt, ## args) |
| @@ -74,8 +77,6 @@ EXPORT_SYMBOL_GPL(ide_check_atapi_device); | |||
| 74 | void ide_init_pc(struct ide_atapi_pc *pc) | 77 | void ide_init_pc(struct ide_atapi_pc *pc) |
| 75 | { | 78 | { |
| 76 | memset(pc, 0, sizeof(*pc)); | 79 | memset(pc, 0, sizeof(*pc)); |
| 77 | pc->buf = pc->pc_buf; | ||
| 78 | pc->buf_size = IDE_PC_BUFFER_SIZE; | ||
| 79 | } | 80 | } |
| 80 | EXPORT_SYMBOL_GPL(ide_init_pc); | 81 | EXPORT_SYMBOL_GPL(ide_init_pc); |
| 81 | 82 | ||
| @@ -84,7 +85,7 @@ EXPORT_SYMBOL_GPL(ide_init_pc); | |||
| 84 | * and wait for it to be serviced. | 85 | * and wait for it to be serviced. |
| 85 | */ | 86 | */ |
| 86 | int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, | 87 | int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, |
| 87 | struct ide_atapi_pc *pc) | 88 | struct ide_atapi_pc *pc, void *buf, unsigned int bufflen) |
| 88 | { | 89 | { |
| 89 | struct request *rq; | 90 | struct request *rq; |
| 90 | int error; | 91 | int error; |
| @@ -93,8 +94,8 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, | |||
| 93 | rq->cmd_type = REQ_TYPE_SPECIAL; | 94 | rq->cmd_type = REQ_TYPE_SPECIAL; |
| 94 | rq->special = (char *)pc; | 95 | rq->special = (char *)pc; |
| 95 | 96 | ||
| 96 | if (pc->req_xfer) { | 97 | if (buf && bufflen) { |
| 97 | error = blk_rq_map_kern(drive->queue, rq, pc->buf, pc->req_xfer, | 98 | error = blk_rq_map_kern(drive->queue, rq, buf, bufflen, |
| 98 | GFP_NOIO); | 99 | GFP_NOIO); |
| 99 | if (error) | 100 | if (error) |
| 100 | goto put_req; | 101 | goto put_req; |
| @@ -117,7 +118,7 @@ int ide_do_test_unit_ready(ide_drive_t *drive, struct gendisk *disk) | |||
| 117 | ide_init_pc(&pc); | 118 | ide_init_pc(&pc); |
| 118 | pc.c[0] = TEST_UNIT_READY; | 119 | pc.c[0] = TEST_UNIT_READY; |
| 119 | 120 | ||
| 120 | return ide_queue_pc_tail(drive, disk, &pc); | 121 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 121 | } | 122 | } |
| 122 | EXPORT_SYMBOL_GPL(ide_do_test_unit_ready); | 123 | EXPORT_SYMBOL_GPL(ide_do_test_unit_ready); |
| 123 | 124 | ||
| @@ -132,7 +133,7 @@ int ide_do_start_stop(ide_drive_t *drive, struct gendisk *disk, int start) | |||
| 132 | if (drive->media == ide_tape) | 133 | if (drive->media == ide_tape) |
| 133 | pc.flags |= PC_FLAG_WAIT_FOR_DSC; | 134 | pc.flags |= PC_FLAG_WAIT_FOR_DSC; |
| 134 | 135 | ||
| 135 | return ide_queue_pc_tail(drive, disk, &pc); | 136 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 136 | } | 137 | } |
| 137 | EXPORT_SYMBOL_GPL(ide_do_start_stop); | 138 | EXPORT_SYMBOL_GPL(ide_do_start_stop); |
| 138 | 139 | ||
| @@ -147,7 +148,7 @@ int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on) | |||
| 147 | pc.c[0] = ALLOW_MEDIUM_REMOVAL; | 148 | pc.c[0] = ALLOW_MEDIUM_REMOVAL; |
| 148 | pc.c[4] = on; | 149 | pc.c[4] = on; |
| 149 | 150 | ||
| 150 | return ide_queue_pc_tail(drive, disk, &pc); | 151 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 151 | } | 152 | } |
| 152 | EXPORT_SYMBOL_GPL(ide_set_media_lock); | 153 | EXPORT_SYMBOL_GPL(ide_set_media_lock); |
| 153 | 154 | ||
| @@ -172,8 +173,6 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) | |||
| 172 | unsigned int cmd_len, sense_len; | 173 | unsigned int cmd_len, sense_len; |
| 173 | int err; | 174 | int err; |
| 174 | 175 | ||
| 175 | debug_log("%s: enter\n", __func__); | ||
| 176 | |||
| 177 | switch (drive->media) { | 176 | switch (drive->media) { |
| 178 | case ide_floppy: | 177 | case ide_floppy: |
| 179 | cmd_len = 255; | 178 | cmd_len = 255; |
| @@ -201,8 +200,8 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) | |||
| 201 | GFP_NOIO); | 200 | GFP_NOIO); |
| 202 | if (unlikely(err)) { | 201 | if (unlikely(err)) { |
| 203 | if (printk_ratelimit()) | 202 | if (printk_ratelimit()) |
| 204 | printk(KERN_WARNING "%s: failed to map sense buffer\n", | 203 | printk(KERN_WARNING PFX "%s: failed to map sense " |
| 205 | drive->name); | 204 | "buffer\n", drive->name); |
| 206 | return; | 205 | return; |
| 207 | } | 206 | } |
| 208 | 207 | ||
| @@ -223,7 +222,7 @@ int ide_queue_sense_rq(ide_drive_t *drive, void *special) | |||
| 223 | { | 222 | { |
| 224 | /* deferred failure from ide_prep_sense() */ | 223 | /* deferred failure from ide_prep_sense() */ |
| 225 | if (!drive->sense_rq_armed) { | 224 | if (!drive->sense_rq_armed) { |
| 226 | printk(KERN_WARNING "%s: failed queue sense request\n", | 225 | printk(KERN_WARNING PFX "%s: error queuing a sense request\n", |
| 227 | drive->name); | 226 | drive->name); |
| 228 | return -ENOMEM; | 227 | return -ENOMEM; |
| 229 | } | 228 | } |
| @@ -255,8 +254,6 @@ void ide_retry_pc(ide_drive_t *drive) | |||
| 255 | /* init pc from sense_rq */ | 254 | /* init pc from sense_rq */ |
| 256 | ide_init_pc(pc); | 255 | ide_init_pc(pc); |
| 257 | memcpy(pc->c, sense_rq->cmd, 12); | 256 | memcpy(pc->c, sense_rq->cmd, 12); |
| 258 | pc->buf = bio_data(sense_rq->bio); /* pointer to mapped address */ | ||
| 259 | pc->req_xfer = blk_rq_bytes(sense_rq); | ||
| 260 | 257 | ||
| 261 | if (drive->media == ide_tape) | 258 | if (drive->media == ide_tape) |
| 262 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; | 259 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
| @@ -298,7 +295,7 @@ int ide_cd_expiry(ide_drive_t *drive) | |||
| 298 | break; | 295 | break; |
| 299 | default: | 296 | default: |
| 300 | if (!(rq->cmd_flags & REQ_QUIET)) | 297 | if (!(rq->cmd_flags & REQ_QUIET)) |
| 301 | printk(KERN_INFO "cmd 0x%x timed out\n", | 298 | printk(KERN_INFO PFX "cmd 0x%x timed out\n", |
| 302 | rq->cmd[0]); | 299 | rq->cmd[0]); |
| 303 | wait = 0; | 300 | wait = 0; |
| 304 | break; | 301 | break; |
| @@ -332,6 +329,55 @@ void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) | |||
| 332 | EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); | 329 | EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); |
| 333 | 330 | ||
| 334 | /* | 331 | /* |
| 332 | * Check the contents of the interrupt reason register and attempt to recover if | ||
| 333 | * there are problems. | ||
| 334 | * | ||
| 335 | * Returns: | ||
| 336 | * - 0 if everything's ok | ||
| 337 | * - 1 if the request has to be terminated. | ||
| 338 | */ | ||
| 339 | int ide_check_ireason(ide_drive_t *drive, struct request *rq, int len, | ||
| 340 | int ireason, int rw) | ||
| 341 | { | ||
| 342 | ide_hwif_t *hwif = drive->hwif; | ||
| 343 | |||
| 344 | debug_log("ireason: 0x%x, rw: 0x%x\n", ireason, rw); | ||
| 345 | |||
| 346 | if (ireason == (!rw << 1)) | ||
| 347 | return 0; | ||
| 348 | else if (ireason == (rw << 1)) { | ||
| 349 | printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n", | ||
| 350 | drive->name, __func__); | ||
| 351 | |||
| 352 | if (dev_is_idecd(drive)) | ||
| 353 | ide_pad_transfer(drive, rw, len); | ||
| 354 | } else if (!rw && ireason == ATAPI_COD) { | ||
| 355 | if (dev_is_idecd(drive)) { | ||
| 356 | /* | ||
| 357 | * Some drives (ASUS) seem to tell us that status info | ||
| 358 | * is available. Just get it and ignore. | ||
| 359 | */ | ||
| 360 | (void)hwif->tp_ops->read_status(hwif); | ||
| 361 | return 0; | ||
| 362 | } | ||
| 363 | } else { | ||
| 364 | if (ireason & ATAPI_COD) | ||
| 365 | printk(KERN_ERR PFX "%s: CoD != 0 in %s\n", drive->name, | ||
| 366 | __func__); | ||
| 367 | |||
| 368 | /* drive wants a command packet, or invalid ireason... */ | ||
| 369 | printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n", | ||
| 370 | drive->name, __func__, ireason); | ||
| 371 | } | ||
| 372 | |||
| 373 | if (dev_is_idecd(drive) && rq->cmd_type == REQ_TYPE_ATA_PC) | ||
| 374 | rq->cmd_flags |= REQ_FAILED; | ||
| 375 | |||
| 376 | return 1; | ||
| 377 | } | ||
| 378 | EXPORT_SYMBOL_GPL(ide_check_ireason); | ||
| 379 | |||
| 380 | /* | ||
| 335 | * This is the usual interrupt handler which will be called during a packet | 381 | * This is the usual interrupt handler which will be called during a packet |
| 336 | * command. We will transfer some of the data (as requested by the drive) | 382 | * command. We will transfer some of the data (as requested by the drive) |
| 337 | * and will re-point interrupt handler to us. | 383 | * and will re-point interrupt handler to us. |
| @@ -365,12 +411,12 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 365 | 411 | ||
| 366 | if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) { | 412 | if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) { |
| 367 | if (drive->media == ide_floppy) | 413 | if (drive->media == ide_floppy) |
| 368 | printk(KERN_ERR "%s: DMA %s error\n", | 414 | printk(KERN_ERR PFX "%s: DMA %s error\n", |
| 369 | drive->name, rq_data_dir(pc->rq) | 415 | drive->name, rq_data_dir(pc->rq) |
| 370 | ? "write" : "read"); | 416 | ? "write" : "read"); |
| 371 | pc->flags |= PC_FLAG_DMA_ERROR; | 417 | pc->flags |= PC_FLAG_DMA_ERROR; |
| 372 | } else | 418 | } else |
| 373 | pc->xferred = pc->req_xfer; | 419 | rq->resid_len = 0; |
| 374 | debug_log("%s: DMA finished\n", drive->name); | 420 | debug_log("%s: DMA finished\n", drive->name); |
| 375 | } | 421 | } |
| 376 | 422 | ||
| @@ -379,7 +425,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 379 | int uptodate, error; | 425 | int uptodate, error; |
| 380 | 426 | ||
| 381 | debug_log("Packet command completed, %d bytes transferred\n", | 427 | debug_log("Packet command completed, %d bytes transferred\n", |
| 382 | pc->xferred); | 428 | blk_rq_bytes(rq)); |
| 383 | 429 | ||
| 384 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; | 430 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; |
| 385 | 431 | ||
| @@ -397,8 +443,8 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 397 | pc->rq->errors++; | 443 | pc->rq->errors++; |
| 398 | 444 | ||
| 399 | if (rq->cmd[0] == REQUEST_SENSE) { | 445 | if (rq->cmd[0] == REQUEST_SENSE) { |
| 400 | printk(KERN_ERR "%s: I/O error in request sense" | 446 | printk(KERN_ERR PFX "%s: I/O error in request " |
| 401 | " command\n", drive->name); | 447 | "sense command\n", drive->name); |
| 402 | return ide_do_reset(drive); | 448 | return ide_do_reset(drive); |
| 403 | } | 449 | } |
| 404 | 450 | ||
| @@ -446,8 +492,8 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 446 | 492 | ||
| 447 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { | 493 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { |
| 448 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; | 494 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; |
| 449 | printk(KERN_ERR "%s: The device wants to issue more interrupts " | 495 | printk(KERN_ERR PFX "%s: The device wants to issue more " |
| 450 | "in DMA mode\n", drive->name); | 496 | "interrupts in DMA mode\n", drive->name); |
| 451 | ide_dma_off(drive); | 497 | ide_dma_off(drive); |
| 452 | return ide_do_reset(drive); | 498 | return ide_do_reset(drive); |
| 453 | } | 499 | } |
| @@ -455,33 +501,22 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 455 | /* Get the number of bytes to transfer on this interrupt. */ | 501 | /* Get the number of bytes to transfer on this interrupt. */ |
| 456 | ide_read_bcount_and_ireason(drive, &bcount, &ireason); | 502 | ide_read_bcount_and_ireason(drive, &bcount, &ireason); |
| 457 | 503 | ||
| 458 | if (ireason & ATAPI_COD) { | 504 | if (ide_check_ireason(drive, rq, bcount, ireason, write)) |
| 459 | printk(KERN_ERR "%s: CoD != 0 in %s\n", drive->name, __func__); | ||
| 460 | return ide_do_reset(drive); | 505 | return ide_do_reset(drive); |
| 461 | } | ||
| 462 | |||
| 463 | if (((ireason & ATAPI_IO) == ATAPI_IO) == write) { | ||
| 464 | /* Hopefully, we will never get here */ | ||
| 465 | printk(KERN_ERR "%s: We wanted to %s, but the device wants us " | ||
| 466 | "to %s!\n", drive->name, | ||
| 467 | (ireason & ATAPI_IO) ? "Write" : "Read", | ||
| 468 | (ireason & ATAPI_IO) ? "Read" : "Write"); | ||
| 469 | return ide_do_reset(drive); | ||
| 470 | } | ||
| 471 | 506 | ||
| 472 | done = min_t(unsigned int, bcount, cmd->nleft); | 507 | done = min_t(unsigned int, bcount, cmd->nleft); |
| 473 | ide_pio_bytes(drive, cmd, write, done); | 508 | ide_pio_bytes(drive, cmd, write, done); |
| 474 | 509 | ||
| 475 | /* Update transferred byte count */ | 510 | /* Update transferred byte count */ |
| 476 | pc->xferred += done; | 511 | rq->resid_len -= done; |
| 477 | 512 | ||
| 478 | bcount -= done; | 513 | bcount -= done; |
| 479 | 514 | ||
| 480 | if (bcount) | 515 | if (bcount) |
| 481 | ide_pad_transfer(drive, write, bcount); | 516 | ide_pad_transfer(drive, write, bcount); |
| 482 | 517 | ||
| 483 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes\n", | 518 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n", |
| 484 | rq->cmd[0], done, bcount); | 519 | rq->cmd[0], done, bcount, rq->resid_len); |
| 485 | 520 | ||
| 486 | /* And set the interrupt handler again */ | 521 | /* And set the interrupt handler again */ |
| 487 | ide_set_handler(drive, ide_pc_intr, timeout); | 522 | ide_set_handler(drive, ide_pc_intr, timeout); |
| @@ -515,13 +550,13 @@ static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) | |||
| 515 | 550 | ||
| 516 | while (retries-- && ((ireason & ATAPI_COD) == 0 || | 551 | while (retries-- && ((ireason & ATAPI_COD) == 0 || |
| 517 | (ireason & ATAPI_IO))) { | 552 | (ireason & ATAPI_IO))) { |
| 518 | printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing " | 553 | printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing " |
| 519 | "a packet command, retrying\n", drive->name); | 554 | "a packet command, retrying\n", drive->name); |
| 520 | udelay(100); | 555 | udelay(100); |
| 521 | ireason = ide_read_ireason(drive); | 556 | ireason = ide_read_ireason(drive); |
| 522 | if (retries == 0) { | 557 | if (retries == 0) { |
| 523 | printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing " | 558 | printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing" |
| 524 | "a packet command, ignoring\n", | 559 | " a packet command, ignoring\n", |
| 525 | drive->name); | 560 | drive->name); |
| 526 | ireason |= ATAPI_COD; | 561 | ireason |= ATAPI_COD; |
| 527 | ireason &= ~ATAPI_IO; | 562 | ireason &= ~ATAPI_IO; |
| @@ -552,7 +587,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) | |||
| 552 | u8 ireason; | 587 | u8 ireason; |
| 553 | 588 | ||
| 554 | if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) { | 589 | if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) { |
| 555 | printk(KERN_ERR "%s: Strange, packet command initiated yet " | 590 | printk(KERN_ERR PFX "%s: Strange, packet command initiated yet " |
| 556 | "DRQ isn't asserted\n", drive->name); | 591 | "DRQ isn't asserted\n", drive->name); |
| 557 | return startstop; | 592 | return startstop; |
| 558 | } | 593 | } |
| @@ -594,8 +629,8 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) | |||
| 594 | ireason = ide_wait_ireason(drive, ireason); | 629 | ireason = ide_wait_ireason(drive, ireason); |
| 595 | 630 | ||
| 596 | if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) { | 631 | if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) { |
| 597 | printk(KERN_ERR "%s: (IO,CoD) != (0,1) while issuing " | 632 | printk(KERN_ERR PFX "%s: (IO,CoD) != (0,1) while " |
| 598 | "a packet command\n", drive->name); | 633 | "issuing a packet command\n", drive->name); |
| 599 | 634 | ||
| 600 | return ide_do_reset(drive); | 635 | return ide_do_reset(drive); |
| 601 | } | 636 | } |
| @@ -633,7 +668,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) | |||
| 633 | ide_hwif_t *hwif = drive->hwif; | 668 | ide_hwif_t *hwif = drive->hwif; |
| 634 | ide_expiry_t *expiry = NULL; | 669 | ide_expiry_t *expiry = NULL; |
| 635 | struct request *rq = hwif->rq; | 670 | struct request *rq = hwif->rq; |
| 636 | unsigned int timeout; | 671 | unsigned int timeout, bytes; |
| 637 | u16 bcount; | 672 | u16 bcount; |
| 638 | u8 valid_tf; | 673 | u8 valid_tf; |
| 639 | u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT); | 674 | u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT); |
| @@ -649,13 +684,14 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) | |||
| 649 | } else { | 684 | } else { |
| 650 | pc = drive->pc; | 685 | pc = drive->pc; |
| 651 | 686 | ||
| 652 | /* We haven't transferred any data yet */ | ||
| 653 | pc->xferred = 0; | ||
| 654 | |||
| 655 | valid_tf = IDE_VALID_DEVICE; | 687 | valid_tf = IDE_VALID_DEVICE; |
| 656 | bcount = ((drive->media == ide_tape) ? | 688 | bytes = blk_rq_bytes(rq); |
| 657 | pc->req_xfer : | 689 | bcount = ((drive->media == ide_tape) ? bytes |
| 658 | min(pc->req_xfer, 63 * 1024)); | 690 | : min_t(unsigned int, |
| 691 | bytes, 63 * 1024)); | ||
| 692 | |||
| 693 | /* We haven't transferred any data yet */ | ||
| 694 | rq->resid_len = bcount; | ||
| 659 | 695 | ||
| 660 | if (pc->flags & PC_FLAG_DMA_ERROR) { | 696 | if (pc->flags & PC_FLAG_DMA_ERROR) { |
| 661 | pc->flags &= ~PC_FLAG_DMA_ERROR; | 697 | pc->flags &= ~PC_FLAG_DMA_ERROR; |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 424140c6c400..4a19686fcfe9 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -92,16 +92,16 @@ static void cdrom_saw_media_change(ide_drive_t *drive) | |||
| 92 | drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID; | 92 | drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static int cdrom_log_sense(ide_drive_t *drive, struct request *rq, | 95 | static int cdrom_log_sense(ide_drive_t *drive, struct request *rq) |
| 96 | struct request_sense *sense) | ||
| 97 | { | 96 | { |
| 97 | struct request_sense *sense = &drive->sense_data; | ||
| 98 | int log = 0; | 98 | int log = 0; |
| 99 | 99 | ||
| 100 | ide_debug_log(IDE_DBG_SENSE, "sense_key: 0x%x", sense->sense_key); | ||
| 101 | |||
| 102 | if (!sense || !rq || (rq->cmd_flags & REQ_QUIET)) | 100 | if (!sense || !rq || (rq->cmd_flags & REQ_QUIET)) |
| 103 | return 0; | 101 | return 0; |
| 104 | 102 | ||
| 103 | ide_debug_log(IDE_DBG_SENSE, "sense_key: 0x%x", sense->sense_key); | ||
| 104 | |||
| 105 | switch (sense->sense_key) { | 105 | switch (sense->sense_key) { |
| 106 | case NO_SENSE: | 106 | case NO_SENSE: |
| 107 | case RECOVERED_ERROR: | 107 | case RECOVERED_ERROR: |
| @@ -140,12 +140,12 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq, | |||
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | static void cdrom_analyze_sense_data(ide_drive_t *drive, | 142 | static void cdrom_analyze_sense_data(ide_drive_t *drive, |
| 143 | struct request *failed_command, | 143 | struct request *failed_command) |
| 144 | struct request_sense *sense) | ||
| 145 | { | 144 | { |
| 145 | struct request_sense *sense = &drive->sense_data; | ||
| 146 | struct cdrom_info *info = drive->driver_data; | ||
| 146 | unsigned long sector; | 147 | unsigned long sector; |
| 147 | unsigned long bio_sectors; | 148 | unsigned long bio_sectors; |
| 148 | struct cdrom_info *info = drive->driver_data; | ||
| 149 | 149 | ||
| 150 | ide_debug_log(IDE_DBG_SENSE, "error_code: 0x%x, sense_key: 0x%x", | 150 | ide_debug_log(IDE_DBG_SENSE, "error_code: 0x%x, sense_key: 0x%x", |
| 151 | sense->error_code, sense->sense_key); | 151 | sense->error_code, sense->sense_key); |
| @@ -154,7 +154,7 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, | |||
| 154 | ide_debug_log(IDE_DBG_SENSE, "failed cmd: 0x%x", | 154 | ide_debug_log(IDE_DBG_SENSE, "failed cmd: 0x%x", |
| 155 | failed_command->cmd[0]); | 155 | failed_command->cmd[0]); |
| 156 | 156 | ||
| 157 | if (!cdrom_log_sense(drive, failed_command, sense)) | 157 | if (!cdrom_log_sense(drive, failed_command)) |
| 158 | return; | 158 | return; |
| 159 | 159 | ||
| 160 | /* | 160 | /* |
| @@ -225,15 +225,14 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) | |||
| 225 | * sense pointer set. | 225 | * sense pointer set. |
| 226 | */ | 226 | */ |
| 227 | memcpy(failed->sense, sense, 18); | 227 | memcpy(failed->sense, sense, 18); |
| 228 | sense = failed->sense; | ||
| 229 | failed->sense_len = rq->sense_len; | 228 | failed->sense_len = rq->sense_len; |
| 230 | } | 229 | } |
| 231 | cdrom_analyze_sense_data(drive, failed, sense); | 230 | cdrom_analyze_sense_data(drive, failed); |
| 232 | 231 | ||
| 233 | if (ide_end_rq(drive, failed, -EIO, blk_rq_bytes(failed))) | 232 | if (ide_end_rq(drive, failed, -EIO, blk_rq_bytes(failed))) |
| 234 | BUG(); | 233 | BUG(); |
| 235 | } else | 234 | } else |
| 236 | cdrom_analyze_sense_data(drive, NULL, sense); | 235 | cdrom_analyze_sense_data(drive, NULL); |
| 237 | } | 236 | } |
| 238 | 237 | ||
| 239 | 238 | ||
| @@ -410,50 +409,6 @@ end_request: | |||
| 410 | return 2; | 409 | return 2; |
| 411 | } | 410 | } |
| 412 | 411 | ||
| 413 | /* | ||
| 414 | * Check the contents of the interrupt reason register from the cdrom | ||
| 415 | * and attempt to recover if there are problems. Returns 0 if everything's | ||
| 416 | * ok; nonzero if the request has been terminated. | ||
| 417 | */ | ||
| 418 | static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | ||
| 419 | int len, int ireason, int rw) | ||
| 420 | { | ||
| 421 | ide_hwif_t *hwif = drive->hwif; | ||
| 422 | |||
| 423 | ide_debug_log(IDE_DBG_FUNC, "ireason: 0x%x, rw: 0x%x", ireason, rw); | ||
| 424 | |||
| 425 | /* | ||
| 426 | * ireason == 0: the drive wants to receive data from us | ||
| 427 | * ireason == 2: the drive is expecting to transfer data to us | ||
| 428 | */ | ||
| 429 | if (ireason == (!rw << 1)) | ||
| 430 | return 0; | ||
| 431 | else if (ireason == (rw << 1)) { | ||
| 432 | |||
| 433 | /* whoops... */ | ||
| 434 | printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n", | ||
| 435 | drive->name, __func__); | ||
| 436 | |||
| 437 | ide_pad_transfer(drive, rw, len); | ||
| 438 | } else if (rw == 0 && ireason == 1) { | ||
| 439 | /* | ||
| 440 | * Some drives (ASUS) seem to tell us that status info is | ||
| 441 | * available. Just get it and ignore. | ||
| 442 | */ | ||
| 443 | (void)hwif->tp_ops->read_status(hwif); | ||
| 444 | return 0; | ||
| 445 | } else { | ||
| 446 | /* drive wants a command packet, or invalid ireason... */ | ||
| 447 | printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n", | ||
| 448 | drive->name, __func__, ireason); | ||
| 449 | } | ||
| 450 | |||
| 451 | if (rq->cmd_type == REQ_TYPE_ATA_PC) | ||
| 452 | rq->cmd_flags |= REQ_FAILED; | ||
| 453 | |||
| 454 | return -1; | ||
| 455 | } | ||
| 456 | |||
| 457 | static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct ide_cmd *cmd) | 412 | static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct ide_cmd *cmd) |
| 458 | { | 413 | { |
| 459 | struct request *rq = cmd->rq; | 414 | struct request *rq = cmd->rq; |
| @@ -645,8 +600,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
| 645 | goto out_end; | 600 | goto out_end; |
| 646 | } | 601 | } |
| 647 | 602 | ||
| 648 | /* check which way to transfer data */ | 603 | rc = ide_check_ireason(drive, rq, len, ireason, write); |
| 649 | rc = ide_cd_check_ireason(drive, rq, len, ireason, write); | ||
| 650 | if (rc) | 604 | if (rc) |
| 651 | goto out_end; | 605 | goto out_end; |
| 652 | 606 | ||
| @@ -713,7 +667,7 @@ out_end: | |||
| 713 | rq->errors = -EIO; | 667 | rq->errors = -EIO; |
| 714 | } | 668 | } |
| 715 | 669 | ||
| 716 | if (uptodate == 0) | 670 | if (uptodate == 0 && rq->bio) |
| 717 | ide_cd_error_cmd(drive, cmd); | 671 | ide_cd_error_cmd(drive, cmd); |
| 718 | 672 | ||
| 719 | /* make sure it's fully ended */ | 673 | /* make sure it's fully ended */ |
| @@ -831,12 +785,8 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
| 831 | /* right now this can only be a reset... */ | 785 | /* right now this can only be a reset... */ |
| 832 | uptodate = 1; | 786 | uptodate = 1; |
| 833 | goto out_end; | 787 | goto out_end; |
| 834 | } else { | 788 | } else |
| 835 | blk_dump_rq_flags(rq, DRV_NAME " bad flags"); | 789 | BUG(); |
| 836 | if (rq->errors == 0) | ||
| 837 | rq->errors = -EIO; | ||
| 838 | goto out_end; | ||
| 839 | } | ||
| 840 | 790 | ||
| 841 | /* prepare sense request for this command */ | 791 | /* prepare sense request for this command */ |
| 842 | ide_prep_sense(drive, rq); | 792 | ide_prep_sense(drive, rq); |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 6a1de2169709..695181120cdb 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
| @@ -184,14 +184,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
| 184 | ide_hwif_t *hwif = drive->hwif; | 184 | ide_hwif_t *hwif = drive->hwif; |
| 185 | 185 | ||
| 186 | BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED); | 186 | BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED); |
| 187 | 187 | BUG_ON(!blk_fs_request(rq)); | |
| 188 | if (!blk_fs_request(rq)) { | ||
| 189 | blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command"); | ||
| 190 | if (rq->errors == 0) | ||
| 191 | rq->errors = -EIO; | ||
| 192 | ide_complete_rq(drive, -EIO, ide_rq_bytes(rq)); | ||
| 193 | return ide_stopped; | ||
| 194 | } | ||
| 195 | 188 | ||
| 196 | ledtrig_ide_activity(); | 189 | ledtrig_ide_activity(); |
| 197 | 190 | ||
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 650981758f15..8b3f204f7d73 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
| @@ -77,7 +77,8 @@ static int ide_floppy_callback(ide_drive_t *drive, int dsc) | |||
| 77 | (rq && blk_pc_request(rq))) | 77 | (rq && blk_pc_request(rq))) |
| 78 | uptodate = 1; /* FIXME */ | 78 | uptodate = 1; /* FIXME */ |
| 79 | else if (pc->c[0] == GPCMD_REQUEST_SENSE) { | 79 | else if (pc->c[0] == GPCMD_REQUEST_SENSE) { |
| 80 | u8 *buf = pc->buf; | 80 | |
| 81 | u8 *buf = bio_data(rq->bio); | ||
| 81 | 82 | ||
| 82 | if (!pc->error) { | 83 | if (!pc->error) { |
| 83 | floppy->sense_key = buf[2] & 0x0F; | 84 | floppy->sense_key = buf[2] & 0x0F; |
| @@ -209,8 +210,7 @@ static void idefloppy_create_rw_cmd(ide_drive_t *drive, | |||
| 209 | pc->rq = rq; | 210 | pc->rq = rq; |
| 210 | if (rq->cmd_flags & REQ_RW) | 211 | if (rq->cmd_flags & REQ_RW) |
| 211 | pc->flags |= PC_FLAG_WRITING; | 212 | pc->flags |= PC_FLAG_WRITING; |
| 212 | pc->buf = NULL; | 213 | |
| 213 | pc->req_xfer = pc->buf_size = blocks * floppy->block_size; | ||
| 214 | pc->flags |= PC_FLAG_DMA_OK; | 214 | pc->flags |= PC_FLAG_DMA_OK; |
| 215 | } | 215 | } |
| 216 | 216 | ||
| @@ -225,9 +225,6 @@ static void idefloppy_blockpc_cmd(struct ide_disk_obj *floppy, | |||
| 225 | if (rq_data_dir(rq) == WRITE) | 225 | if (rq_data_dir(rq) == WRITE) |
| 226 | pc->flags |= PC_FLAG_WRITING; | 226 | pc->flags |= PC_FLAG_WRITING; |
| 227 | } | 227 | } |
| 228 | /* pio will be performed by ide_pio_bytes() which handles sg fine */ | ||
| 229 | pc->buf = NULL; | ||
| 230 | pc->req_xfer = pc->buf_size = blk_rq_bytes(rq); | ||
| 231 | } | 228 | } |
| 232 | 229 | ||
| 233 | static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, | 230 | static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, |
| @@ -272,10 +269,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, | |||
| 272 | } else if (blk_pc_request(rq)) { | 269 | } else if (blk_pc_request(rq)) { |
| 273 | pc = &floppy->queued_pc; | 270 | pc = &floppy->queued_pc; |
| 274 | idefloppy_blockpc_cmd(floppy, pc, rq); | 271 | idefloppy_blockpc_cmd(floppy, pc, rq); |
| 275 | } else { | 272 | } else |
| 276 | blk_dump_rq_flags(rq, PFX "unsupported command in queue"); | 273 | BUG(); |
| 277 | goto out_end; | ||
| 278 | } | ||
| 279 | 274 | ||
| 280 | ide_prep_sense(drive, rq); | 275 | ide_prep_sense(drive, rq); |
| 281 | 276 | ||
| @@ -286,8 +281,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, | |||
| 286 | 281 | ||
| 287 | cmd.rq = rq; | 282 | cmd.rq = rq; |
| 288 | 283 | ||
| 289 | if (blk_fs_request(rq) || pc->req_xfer) { | 284 | if (blk_fs_request(rq) || blk_rq_bytes(rq)) { |
| 290 | ide_init_sg_cmd(&cmd, pc->req_xfer); | 285 | ide_init_sg_cmd(&cmd, blk_rq_bytes(rq)); |
| 291 | ide_map_sg(drive, &cmd); | 286 | ide_map_sg(drive, &cmd); |
| 292 | } | 287 | } |
| 293 | 288 | ||
| @@ -311,33 +306,33 @@ static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive, | |||
| 311 | { | 306 | { |
| 312 | struct ide_disk_obj *floppy = drive->driver_data; | 307 | struct ide_disk_obj *floppy = drive->driver_data; |
| 313 | struct gendisk *disk = floppy->disk; | 308 | struct gendisk *disk = floppy->disk; |
| 314 | u8 *page; | 309 | u8 *page, buf[40]; |
| 315 | int capacity, lba_capacity; | 310 | int capacity, lba_capacity; |
| 316 | u16 transfer_rate, sector_size, cyls, rpm; | 311 | u16 transfer_rate, sector_size, cyls, rpm; |
| 317 | u8 heads, sectors; | 312 | u8 heads, sectors; |
| 318 | 313 | ||
| 319 | ide_floppy_create_mode_sense_cmd(pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE); | 314 | ide_floppy_create_mode_sense_cmd(pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE); |
| 320 | 315 | ||
| 321 | if (ide_queue_pc_tail(drive, disk, pc)) { | 316 | if (ide_queue_pc_tail(drive, disk, pc, buf, pc->req_xfer)) { |
| 322 | printk(KERN_ERR PFX "Can't get flexible disk page params\n"); | 317 | printk(KERN_ERR PFX "Can't get flexible disk page params\n"); |
| 323 | return 1; | 318 | return 1; |
| 324 | } | 319 | } |
| 325 | 320 | ||
| 326 | if (pc->buf[3] & 0x80) | 321 | if (buf[3] & 0x80) |
| 327 | drive->dev_flags |= IDE_DFLAG_WP; | 322 | drive->dev_flags |= IDE_DFLAG_WP; |
| 328 | else | 323 | else |
| 329 | drive->dev_flags &= ~IDE_DFLAG_WP; | 324 | drive->dev_flags &= ~IDE_DFLAG_WP; |
| 330 | 325 | ||
| 331 | set_disk_ro(disk, !!(drive->dev_flags & IDE_DFLAG_WP)); | 326 | set_disk_ro(disk, !!(drive->dev_flags & IDE_DFLAG_WP)); |
| 332 | 327 | ||
| 333 | page = &pc->buf[8]; | 328 | page = &buf[8]; |
| 334 | 329 | ||
| 335 | transfer_rate = be16_to_cpup((__be16 *)&pc->buf[8 + 2]); | 330 | transfer_rate = be16_to_cpup((__be16 *)&buf[8 + 2]); |
| 336 | sector_size = be16_to_cpup((__be16 *)&pc->buf[8 + 6]); | 331 | sector_size = be16_to_cpup((__be16 *)&buf[8 + 6]); |
| 337 | cyls = be16_to_cpup((__be16 *)&pc->buf[8 + 8]); | 332 | cyls = be16_to_cpup((__be16 *)&buf[8 + 8]); |
| 338 | rpm = be16_to_cpup((__be16 *)&pc->buf[8 + 28]); | 333 | rpm = be16_to_cpup((__be16 *)&buf[8 + 28]); |
| 339 | heads = pc->buf[8 + 4]; | 334 | heads = buf[8 + 4]; |
| 340 | sectors = pc->buf[8 + 5]; | 335 | sectors = buf[8 + 5]; |
| 341 | 336 | ||
| 342 | capacity = cyls * heads * sectors * sector_size; | 337 | capacity = cyls * heads * sectors * sector_size; |
| 343 | 338 | ||
| @@ -387,22 +382,19 @@ static int ide_floppy_get_capacity(ide_drive_t *drive) | |||
| 387 | drive->capacity64 = 0; | 382 | drive->capacity64 = 0; |
| 388 | 383 | ||
| 389 | ide_floppy_create_read_capacity_cmd(&pc); | 384 | ide_floppy_create_read_capacity_cmd(&pc); |
| 390 | pc.buf = &pc_buf[0]; | 385 | if (ide_queue_pc_tail(drive, disk, &pc, pc_buf, pc.req_xfer)) { |
| 391 | pc.buf_size = sizeof(pc_buf); | ||
| 392 | |||
| 393 | if (ide_queue_pc_tail(drive, disk, &pc)) { | ||
| 394 | printk(KERN_ERR PFX "Can't get floppy parameters\n"); | 386 | printk(KERN_ERR PFX "Can't get floppy parameters\n"); |
| 395 | return 1; | 387 | return 1; |
| 396 | } | 388 | } |
| 397 | header_len = pc.buf[3]; | 389 | header_len = pc_buf[3]; |
| 398 | cap_desc = &pc.buf[4]; | 390 | cap_desc = &pc_buf[4]; |
| 399 | desc_cnt = header_len / 8; /* capacity descriptor of 8 bytes */ | 391 | desc_cnt = header_len / 8; /* capacity descriptor of 8 bytes */ |
| 400 | 392 | ||
| 401 | for (i = 0; i < desc_cnt; i++) { | 393 | for (i = 0; i < desc_cnt; i++) { |
| 402 | unsigned int desc_start = 4 + i*8; | 394 | unsigned int desc_start = 4 + i*8; |
| 403 | 395 | ||
| 404 | blocks = be32_to_cpup((__be32 *)&pc.buf[desc_start]); | 396 | blocks = be32_to_cpup((__be32 *)&pc_buf[desc_start]); |
| 405 | length = be16_to_cpup((__be16 *)&pc.buf[desc_start + 6]); | 397 | length = be16_to_cpup((__be16 *)&pc_buf[desc_start + 6]); |
| 406 | 398 | ||
| 407 | ide_debug_log(IDE_DBG_PROBE, "Descriptor %d: %dkB, %d blocks, " | 399 | ide_debug_log(IDE_DBG_PROBE, "Descriptor %d: %dkB, %d blocks, " |
| 408 | "%d sector size", | 400 | "%d sector size", |
| @@ -415,7 +407,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive) | |||
| 415 | * the code below is valid only for the 1st descriptor, ie i=0 | 407 | * the code below is valid only for the 1st descriptor, ie i=0 |
| 416 | */ | 408 | */ |
| 417 | 409 | ||
| 418 | switch (pc.buf[desc_start + 4] & 0x03) { | 410 | switch (pc_buf[desc_start + 4] & 0x03) { |
| 419 | /* Clik! drive returns this instead of CAPACITY_CURRENT */ | 411 | /* Clik! drive returns this instead of CAPACITY_CURRENT */ |
| 420 | case CAPACITY_UNFORMATTED: | 412 | case CAPACITY_UNFORMATTED: |
| 421 | if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) | 413 | if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) |
| @@ -464,7 +456,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive) | |||
| 464 | break; | 456 | break; |
| 465 | } | 457 | } |
| 466 | ide_debug_log(IDE_DBG_PROBE, "Descriptor 0 Code: %d", | 458 | ide_debug_log(IDE_DBG_PROBE, "Descriptor 0 Code: %d", |
| 467 | pc.buf[desc_start + 4] & 0x03); | 459 | pc_buf[desc_start + 4] & 0x03); |
| 468 | } | 460 | } |
| 469 | 461 | ||
| 470 | /* Clik! disk does not support get_flexible_disk_page */ | 462 | /* Clik! disk does not support get_flexible_disk_page */ |
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index cd8a42027ede..9c2288234dea 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c | |||
| @@ -47,15 +47,13 @@ static int ide_floppy_get_format_capacities(ide_drive_t *drive, | |||
| 47 | return -EINVAL; | 47 | return -EINVAL; |
| 48 | 48 | ||
| 49 | ide_floppy_create_read_capacity_cmd(pc); | 49 | ide_floppy_create_read_capacity_cmd(pc); |
| 50 | pc->buf = &pc_buf[0]; | ||
| 51 | pc->buf_size = sizeof(pc_buf); | ||
| 52 | 50 | ||
| 53 | if (ide_queue_pc_tail(drive, floppy->disk, pc)) { | 51 | if (ide_queue_pc_tail(drive, floppy->disk, pc, pc_buf, pc->req_xfer)) { |
| 54 | printk(KERN_ERR "ide-floppy: Can't get floppy parameters\n"); | 52 | printk(KERN_ERR "ide-floppy: Can't get floppy parameters\n"); |
| 55 | return -EIO; | 53 | return -EIO; |
| 56 | } | 54 | } |
| 57 | 55 | ||
| 58 | header_len = pc->buf[3]; | 56 | header_len = pc_buf[3]; |
| 59 | desc_cnt = header_len / 8; /* capacity descriptor of 8 bytes */ | 57 | desc_cnt = header_len / 8; /* capacity descriptor of 8 bytes */ |
| 60 | 58 | ||
| 61 | u_index = 0; | 59 | u_index = 0; |
| @@ -72,8 +70,8 @@ static int ide_floppy_get_format_capacities(ide_drive_t *drive, | |||
| 72 | if (u_index >= u_array_size) | 70 | if (u_index >= u_array_size) |
| 73 | break; /* User-supplied buffer too small */ | 71 | break; /* User-supplied buffer too small */ |
| 74 | 72 | ||
| 75 | blocks = be32_to_cpup((__be32 *)&pc->buf[desc_start]); | 73 | blocks = be32_to_cpup((__be32 *)&pc_buf[desc_start]); |
| 76 | length = be16_to_cpup((__be16 *)&pc->buf[desc_start + 6]); | 74 | length = be16_to_cpup((__be16 *)&pc_buf[desc_start + 6]); |
| 77 | 75 | ||
| 78 | if (put_user(blocks, argp)) | 76 | if (put_user(blocks, argp)) |
| 79 | return -EFAULT; | 77 | return -EFAULT; |
| @@ -94,40 +92,42 @@ static int ide_floppy_get_format_capacities(ide_drive_t *drive, | |||
| 94 | return 0; | 92 | return 0; |
| 95 | } | 93 | } |
| 96 | 94 | ||
| 97 | static void ide_floppy_create_format_unit_cmd(struct ide_atapi_pc *pc, int b, | 95 | static void ide_floppy_create_format_unit_cmd(struct ide_atapi_pc *pc, |
| 98 | int l, int flags) | 96 | u8 *buf, int b, int l, |
| 97 | int flags) | ||
| 99 | { | 98 | { |
| 100 | ide_init_pc(pc); | 99 | ide_init_pc(pc); |
| 101 | pc->c[0] = GPCMD_FORMAT_UNIT; | 100 | pc->c[0] = GPCMD_FORMAT_UNIT; |
| 102 | pc->c[1] = 0x17; | 101 | pc->c[1] = 0x17; |
| 103 | 102 | ||
| 104 | memset(pc->buf, 0, 12); | 103 | memset(buf, 0, 12); |
| 105 | pc->buf[1] = 0xA2; | 104 | buf[1] = 0xA2; |
| 106 | /* Default format list header, u8 1: FOV/DCRT/IMM bits set */ | 105 | /* Default format list header, u8 1: FOV/DCRT/IMM bits set */ |
| 107 | 106 | ||
| 108 | if (flags & 1) /* Verify bit on... */ | 107 | if (flags & 1) /* Verify bit on... */ |
| 109 | pc->buf[1] ^= 0x20; /* ... turn off DCRT bit */ | 108 | buf[1] ^= 0x20; /* ... turn off DCRT bit */ |
| 110 | pc->buf[3] = 8; | 109 | buf[3] = 8; |
| 111 | 110 | ||
| 112 | put_unaligned(cpu_to_be32(b), (unsigned int *)(&pc->buf[4])); | 111 | put_unaligned(cpu_to_be32(b), (unsigned int *)(&buf[4])); |
| 113 | put_unaligned(cpu_to_be32(l), (unsigned int *)(&pc->buf[8])); | 112 | put_unaligned(cpu_to_be32(l), (unsigned int *)(&buf[8])); |
| 114 | pc->buf_size = 12; | 113 | pc->req_xfer = 12; |
| 115 | pc->flags |= PC_FLAG_WRITING; | 114 | pc->flags |= PC_FLAG_WRITING; |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | static int ide_floppy_get_sfrp_bit(ide_drive_t *drive, struct ide_atapi_pc *pc) | 117 | static int ide_floppy_get_sfrp_bit(ide_drive_t *drive, struct ide_atapi_pc *pc) |
| 119 | { | 118 | { |
| 120 | struct ide_disk_obj *floppy = drive->driver_data; | 119 | struct ide_disk_obj *floppy = drive->driver_data; |
| 120 | u8 buf[20]; | ||
| 121 | 121 | ||
| 122 | drive->atapi_flags &= ~IDE_AFLAG_SRFP; | 122 | drive->atapi_flags &= ~IDE_AFLAG_SRFP; |
| 123 | 123 | ||
| 124 | ide_floppy_create_mode_sense_cmd(pc, IDEFLOPPY_CAPABILITIES_PAGE); | 124 | ide_floppy_create_mode_sense_cmd(pc, IDEFLOPPY_CAPABILITIES_PAGE); |
| 125 | pc->flags |= PC_FLAG_SUPPRESS_ERROR; | 125 | pc->flags |= PC_FLAG_SUPPRESS_ERROR; |
| 126 | 126 | ||
| 127 | if (ide_queue_pc_tail(drive, floppy->disk, pc)) | 127 | if (ide_queue_pc_tail(drive, floppy->disk, pc, buf, pc->req_xfer)) |
| 128 | return 1; | 128 | return 1; |
| 129 | 129 | ||
| 130 | if (pc->buf[8 + 2] & 0x40) | 130 | if (buf[8 + 2] & 0x40) |
| 131 | drive->atapi_flags |= IDE_AFLAG_SRFP; | 131 | drive->atapi_flags |= IDE_AFLAG_SRFP; |
| 132 | 132 | ||
| 133 | return 0; | 133 | return 0; |
| @@ -137,6 +137,7 @@ static int ide_floppy_format_unit(ide_drive_t *drive, struct ide_atapi_pc *pc, | |||
| 137 | int __user *arg) | 137 | int __user *arg) |
| 138 | { | 138 | { |
| 139 | struct ide_disk_obj *floppy = drive->driver_data; | 139 | struct ide_disk_obj *floppy = drive->driver_data; |
| 140 | u8 buf[12]; | ||
| 140 | int blocks, length, flags, err = 0; | 141 | int blocks, length, flags, err = 0; |
| 141 | 142 | ||
| 142 | if (floppy->openers > 1) { | 143 | if (floppy->openers > 1) { |
| @@ -170,9 +171,9 @@ static int ide_floppy_format_unit(ide_drive_t *drive, struct ide_atapi_pc *pc, | |||
| 170 | } | 171 | } |
| 171 | 172 | ||
| 172 | ide_floppy_get_sfrp_bit(drive, pc); | 173 | ide_floppy_get_sfrp_bit(drive, pc); |
| 173 | ide_floppy_create_format_unit_cmd(pc, blocks, length, flags); | 174 | ide_floppy_create_format_unit_cmd(pc, buf, blocks, length, flags); |
| 174 | 175 | ||
| 175 | if (ide_queue_pc_tail(drive, floppy->disk, pc)) | 176 | if (ide_queue_pc_tail(drive, floppy->disk, pc, buf, pc->req_xfer)) |
| 176 | err = -EIO; | 177 | err = -EIO; |
| 177 | 178 | ||
| 178 | out: | 179 | out: |
| @@ -196,11 +197,13 @@ static int ide_floppy_get_format_progress(ide_drive_t *drive, | |||
| 196 | int __user *arg) | 197 | int __user *arg) |
| 197 | { | 198 | { |
| 198 | struct ide_disk_obj *floppy = drive->driver_data; | 199 | struct ide_disk_obj *floppy = drive->driver_data; |
| 200 | u8 sense_buf[18]; | ||
| 199 | int progress_indication = 0x10000; | 201 | int progress_indication = 0x10000; |
| 200 | 202 | ||
| 201 | if (drive->atapi_flags & IDE_AFLAG_SRFP) { | 203 | if (drive->atapi_flags & IDE_AFLAG_SRFP) { |
| 202 | ide_create_request_sense_cmd(drive, pc); | 204 | ide_create_request_sense_cmd(drive, pc); |
| 203 | if (ide_queue_pc_tail(drive, floppy->disk, pc)) | 205 | if (ide_queue_pc_tail(drive, floppy->disk, pc, sense_buf, |
| 206 | pc->req_xfer)) | ||
| 204 | return -EIO; | 207 | return -EIO; |
| 205 | 208 | ||
| 206 | if (floppy->sense_key == 2 && | 209 | if (floppy->sense_key == 2 && |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 272cc38f6dbe..1059f809b809 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
| @@ -683,8 +683,9 @@ void ide_timer_expiry (unsigned long data) | |||
| 683 | } else if (drive_is_ready(drive)) { | 683 | } else if (drive_is_ready(drive)) { |
| 684 | if (drive->waiting_for_dma) | 684 | if (drive->waiting_for_dma) |
| 685 | hwif->dma_ops->dma_lost_irq(drive); | 685 | hwif->dma_ops->dma_lost_irq(drive); |
| 686 | if (hwif->ack_intr) | 686 | if (hwif->port_ops && hwif->port_ops->clear_irq) |
| 687 | hwif->ack_intr(hwif); | 687 | hwif->port_ops->clear_irq(drive); |
| 688 | |||
| 688 | printk(KERN_WARNING "%s: lost interrupt\n", | 689 | printk(KERN_WARNING "%s: lost interrupt\n", |
| 689 | drive->name); | 690 | drive->name); |
| 690 | startstop = handler(drive); | 691 | startstop = handler(drive); |
| @@ -803,7 +804,8 @@ irqreturn_t ide_intr (int irq, void *dev_id) | |||
| 803 | 804 | ||
| 804 | spin_lock_irqsave(&hwif->lock, flags); | 805 | spin_lock_irqsave(&hwif->lock, flags); |
| 805 | 806 | ||
| 806 | if (hwif->ack_intr && hwif->ack_intr(hwif) == 0) | 807 | if (hwif->port_ops && hwif->port_ops->test_irq && |
| 808 | hwif->port_ops->test_irq(hwif) == 0) | ||
| 807 | goto out; | 809 | goto out; |
| 808 | 810 | ||
| 809 | handler = hwif->handler; | 811 | handler = hwif->handler; |
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index 5991b23793f2..82f252c3ee6e 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c | |||
| @@ -118,7 +118,6 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) | |||
| 118 | u8 args[4], xfer_rate = 0; | 118 | u8 args[4], xfer_rate = 0; |
| 119 | struct ide_cmd cmd; | 119 | struct ide_cmd cmd; |
| 120 | struct ide_taskfile *tf = &cmd.tf; | 120 | struct ide_taskfile *tf = &cmd.tf; |
| 121 | u16 *id = drive->id; | ||
| 122 | 121 | ||
| 123 | if (NULL == (void *) arg) { | 122 | if (NULL == (void *) arg) { |
| 124 | struct request *rq; | 123 | struct request *rq; |
| @@ -161,14 +160,10 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) | |||
| 161 | 160 | ||
| 162 | if (tf->command == ATA_CMD_SET_FEATURES && | 161 | if (tf->command == ATA_CMD_SET_FEATURES && |
| 163 | tf->feature == SETFEATURES_XFER && | 162 | tf->feature == SETFEATURES_XFER && |
| 164 | tf->nsect >= XFER_SW_DMA_0 && | 163 | tf->nsect >= XFER_SW_DMA_0) { |
| 165 | (id[ATA_ID_UDMA_MODES] || | 164 | xfer_rate = ide_find_dma_mode(drive, XFER_UDMA_6); |
| 166 | id[ATA_ID_MWDMA_MODES] || | 165 | if (xfer_rate != tf->nsect) { |
| 167 | id[ATA_ID_SWDMA_MODES])) { | 166 | err = -EINVAL; |
| 168 | xfer_rate = args[1]; | ||
| 169 | if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) { | ||
| 170 | printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot " | ||
| 171 | "be set\n", drive->name); | ||
| 172 | goto abort; | 167 | goto abort; |
| 173 | } | 168 | } |
| 174 | } | 169 | } |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 79e0af3fd158..51af4eea0d36 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -1170,7 +1170,6 @@ static void ide_init_port_hw(ide_hwif_t *hwif, struct ide_hw *hw) | |||
| 1170 | hwif->irq = hw->irq; | 1170 | hwif->irq = hw->irq; |
| 1171 | hwif->dev = hw->dev; | 1171 | hwif->dev = hw->dev; |
| 1172 | hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; | 1172 | hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; |
| 1173 | hwif->ack_intr = hw->ack_intr; | ||
| 1174 | hwif->config_data = hw->config; | 1173 | hwif->config_data = hw->config; |
| 1175 | } | 1174 | } |
| 1176 | 1175 | ||
| @@ -1378,6 +1377,9 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
| 1378 | 1377 | ||
| 1379 | ide_init_port(hwif, i & 1, d); | 1378 | ide_init_port(hwif, i & 1, d); |
| 1380 | ide_port_cable_detect(hwif); | 1379 | ide_port_cable_detect(hwif); |
| 1380 | |||
| 1381 | hwif->port_flags |= IDE_PFLAG_PROBING; | ||
| 1382 | |||
| 1381 | ide_port_init_devices(hwif); | 1383 | ide_port_init_devices(hwif); |
| 1382 | } | 1384 | } |
| 1383 | 1385 | ||
| @@ -1388,6 +1390,8 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
| 1388 | if (ide_probe_port(hwif) == 0) | 1390 | if (ide_probe_port(hwif) == 0) |
| 1389 | hwif->present = 1; | 1391 | hwif->present = 1; |
| 1390 | 1392 | ||
| 1393 | hwif->port_flags &= ~IDE_PFLAG_PROBING; | ||
| 1394 | |||
| 1391 | if ((hwif->host_flags & IDE_HFLAG_4DRIVES) == 0 || | 1395 | if ((hwif->host_flags & IDE_HFLAG_4DRIVES) == 0 || |
| 1392 | hwif->mate == NULL || hwif->mate->present == 0) { | 1396 | hwif->mate == NULL || hwif->mate->present == 0) { |
| 1393 | if (ide_register_port(hwif)) { | 1397 | if (ide_register_port(hwif)) { |
| @@ -1569,11 +1573,20 @@ EXPORT_SYMBOL_GPL(ide_host_remove); | |||
| 1569 | 1573 | ||
| 1570 | void ide_port_scan(ide_hwif_t *hwif) | 1574 | void ide_port_scan(ide_hwif_t *hwif) |
| 1571 | { | 1575 | { |
| 1576 | int rc; | ||
| 1577 | |||
| 1572 | ide_port_apply_params(hwif); | 1578 | ide_port_apply_params(hwif); |
| 1573 | ide_port_cable_detect(hwif); | 1579 | ide_port_cable_detect(hwif); |
| 1580 | |||
| 1581 | hwif->port_flags |= IDE_PFLAG_PROBING; | ||
| 1582 | |||
| 1574 | ide_port_init_devices(hwif); | 1583 | ide_port_init_devices(hwif); |
| 1575 | 1584 | ||
| 1576 | if (ide_probe_port(hwif) < 0) | 1585 | rc = ide_probe_port(hwif); |
| 1586 | |||
| 1587 | hwif->port_flags &= ~IDE_PFLAG_PROBING; | ||
| 1588 | |||
| 1589 | if (rc < 0) | ||
| 1577 | return; | 1590 | return; |
| 1578 | 1591 | ||
| 1579 | hwif->present = 1; | 1592 | hwif->present = 1; |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 4b447a8a49d4..013dc595fab6 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -279,10 +279,12 @@ static void ide_tape_put(struct ide_tape_obj *tape) | |||
| 279 | * called on each failed packet command retry to analyze the request sense. We | 279 | * called on each failed packet command retry to analyze the request sense. We |
| 280 | * currently do not utilize this information. | 280 | * currently do not utilize this information. |
| 281 | */ | 281 | */ |
| 282 | static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | 282 | static void idetape_analyze_error(ide_drive_t *drive) |
| 283 | { | 283 | { |
| 284 | idetape_tape_t *tape = drive->driver_data; | 284 | idetape_tape_t *tape = drive->driver_data; |
| 285 | struct ide_atapi_pc *pc = drive->failed_pc; | 285 | struct ide_atapi_pc *pc = drive->failed_pc; |
| 286 | struct request *rq = drive->hwif->rq; | ||
| 287 | u8 *sense = bio_data(rq->bio); | ||
| 286 | 288 | ||
| 287 | tape->sense_key = sense[2] & 0xF; | 289 | tape->sense_key = sense[2] & 0xF; |
| 288 | tape->asc = sense[12]; | 290 | tape->asc = sense[12]; |
| @@ -291,11 +293,9 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
| 291 | debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n", | 293 | debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n", |
| 292 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); | 294 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); |
| 293 | 295 | ||
| 294 | /* Correct pc->xferred by asking the tape. */ | 296 | /* correct remaining bytes to transfer */ |
| 295 | if (pc->flags & PC_FLAG_DMA_ERROR) | 297 | if (pc->flags & PC_FLAG_DMA_ERROR) |
| 296 | pc->xferred = pc->req_xfer - | 298 | rq->resid_len = tape->blk_size * get_unaligned_be32(&sense[3]); |
| 297 | tape->blk_size * | ||
| 298 | get_unaligned_be32(&sense[3]); | ||
| 299 | 299 | ||
| 300 | /* | 300 | /* |
| 301 | * If error was the result of a zero-length read or write command, | 301 | * If error was the result of a zero-length read or write command, |
| @@ -329,7 +329,7 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
| 329 | pc->flags |= PC_FLAG_ABORT; | 329 | pc->flags |= PC_FLAG_ABORT; |
| 330 | } | 330 | } |
| 331 | if (!(pc->flags & PC_FLAG_ABORT) && | 331 | if (!(pc->flags & PC_FLAG_ABORT) && |
| 332 | pc->xferred) | 332 | (blk_rq_bytes(rq) - rq->resid_len)) |
| 333 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; | 333 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; |
| 334 | } | 334 | } |
| 335 | } | 335 | } |
| @@ -354,12 +354,13 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
| 354 | 354 | ||
| 355 | if (pc->c[0] == REQUEST_SENSE) { | 355 | if (pc->c[0] == REQUEST_SENSE) { |
| 356 | if (uptodate) | 356 | if (uptodate) |
| 357 | idetape_analyze_error(drive, pc->buf); | 357 | idetape_analyze_error(drive); |
| 358 | else | 358 | else |
| 359 | printk(KERN_ERR "ide-tape: Error in REQUEST SENSE " | 359 | printk(KERN_ERR "ide-tape: Error in REQUEST SENSE " |
| 360 | "itself - Aborting request!\n"); | 360 | "itself - Aborting request!\n"); |
| 361 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { | 361 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { |
| 362 | int blocks = pc->xferred / tape->blk_size; | 362 | unsigned int blocks = |
| 363 | (blk_rq_bytes(rq) - rq->resid_len) / tape->blk_size; | ||
| 363 | 364 | ||
| 364 | tape->avg_size += blocks * tape->blk_size; | 365 | tape->avg_size += blocks * tape->blk_size; |
| 365 | 366 | ||
| @@ -371,38 +372,12 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
| 371 | } | 372 | } |
| 372 | 373 | ||
| 373 | tape->first_frame += blocks; | 374 | tape->first_frame += blocks; |
| 374 | rq->resid_len -= blocks * tape->blk_size; | ||
| 375 | 375 | ||
| 376 | if (pc->error) { | 376 | if (pc->error) { |
| 377 | uptodate = 0; | 377 | uptodate = 0; |
| 378 | err = pc->error; | 378 | err = pc->error; |
| 379 | } | 379 | } |
| 380 | } else if (pc->c[0] == READ_POSITION && uptodate) { | ||
| 381 | u8 *readpos = pc->buf; | ||
| 382 | |||
| 383 | debug_log(DBG_SENSE, "BOP - %s\n", | ||
| 384 | (readpos[0] & 0x80) ? "Yes" : "No"); | ||
| 385 | debug_log(DBG_SENSE, "EOP - %s\n", | ||
| 386 | (readpos[0] & 0x40) ? "Yes" : "No"); | ||
| 387 | |||
| 388 | if (readpos[0] & 0x4) { | ||
| 389 | printk(KERN_INFO "ide-tape: Block location is unknown" | ||
| 390 | "to the tape\n"); | ||
| 391 | clear_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), | ||
| 392 | &drive->atapi_flags); | ||
| 393 | uptodate = 0; | ||
| 394 | err = IDE_DRV_ERROR_GENERAL; | ||
| 395 | } else { | ||
| 396 | debug_log(DBG_SENSE, "Block Location - %u\n", | ||
| 397 | be32_to_cpup((__be32 *)&readpos[4])); | ||
| 398 | |||
| 399 | tape->partition = readpos[1]; | ||
| 400 | tape->first_frame = be32_to_cpup((__be32 *)&readpos[4]); | ||
| 401 | set_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), | ||
| 402 | &drive->atapi_flags); | ||
| 403 | } | ||
| 404 | } | 380 | } |
| 405 | |||
| 406 | rq->errors = err; | 381 | rq->errors = err; |
| 407 | 382 | ||
| 408 | return uptodate; | 383 | return uptodate; |
| @@ -477,6 +452,7 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, | |||
| 477 | struct ide_atapi_pc *pc) | 452 | struct ide_atapi_pc *pc) |
| 478 | { | 453 | { |
| 479 | idetape_tape_t *tape = drive->driver_data; | 454 | idetape_tape_t *tape = drive->driver_data; |
| 455 | struct request *rq = drive->hwif->rq; | ||
| 480 | 456 | ||
| 481 | if (drive->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) | 457 | if (drive->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) |
| 482 | drive->failed_pc = pc; | 458 | drive->failed_pc = pc; |
| @@ -486,7 +462,6 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, | |||
| 486 | 462 | ||
| 487 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || | 463 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || |
| 488 | (pc->flags & PC_FLAG_ABORT)) { | 464 | (pc->flags & PC_FLAG_ABORT)) { |
| 489 | unsigned int done = blk_rq_bytes(drive->hwif->rq); | ||
| 490 | 465 | ||
| 491 | /* | 466 | /* |
| 492 | * We will "abort" retrying a packet command in case legitimate | 467 | * We will "abort" retrying a packet command in case legitimate |
| @@ -510,7 +485,7 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, | |||
| 510 | 485 | ||
| 511 | drive->failed_pc = NULL; | 486 | drive->failed_pc = NULL; |
| 512 | drive->pc_callback(drive, 0); | 487 | drive->pc_callback(drive, 0); |
| 513 | ide_complete_rq(drive, -EIO, done); | 488 | ide_complete_rq(drive, -EIO, blk_rq_bytes(rq)); |
| 514 | return ide_stopped; | 489 | return ide_stopped; |
| 515 | } | 490 | } |
| 516 | debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); | 491 | debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); |
| @@ -579,15 +554,13 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape, | |||
| 579 | struct ide_atapi_pc *pc, struct request *rq, | 554 | struct ide_atapi_pc *pc, struct request *rq, |
| 580 | u8 opcode) | 555 | u8 opcode) |
| 581 | { | 556 | { |
| 582 | unsigned int length = blk_rq_sectors(rq); | 557 | unsigned int length = blk_rq_sectors(rq) / (tape->blk_size >> 9); |
| 583 | 558 | ||
| 584 | ide_init_pc(pc); | 559 | ide_init_pc(pc); |
| 585 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); | 560 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); |
| 586 | pc->c[1] = 1; | 561 | pc->c[1] = 1; |
| 587 | pc->buf = NULL; | 562 | |
| 588 | pc->buf_size = length * tape->blk_size; | 563 | if (blk_rq_bytes(rq) == tape->buffer_size) |
| 589 | pc->req_xfer = pc->buf_size; | ||
| 590 | if (pc->req_xfer == tape->buffer_size) | ||
| 591 | pc->flags |= PC_FLAG_DMA_OK; | 564 | pc->flags |= PC_FLAG_DMA_OK; |
| 592 | 565 | ||
| 593 | if (opcode == READ_6) | 566 | if (opcode == READ_6) |
| @@ -613,15 +586,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
| 613 | debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %u\n" | 586 | debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %u\n" |
| 614 | (unsigned long long)blk_rq_pos(rq), blk_rq_sectors(rq)); | 587 | (unsigned long long)blk_rq_pos(rq), blk_rq_sectors(rq)); |
| 615 | 588 | ||
| 616 | if (!(blk_special_request(rq) || blk_sense_request(rq))) { | 589 | BUG_ON(!(blk_special_request(rq) || blk_sense_request(rq))); |
| 617 | /* We do not support buffer cache originated requests. */ | ||
| 618 | printk(KERN_NOTICE "ide-tape: %s: Unsupported request in " | ||
| 619 | "request queue (%d)\n", drive->name, rq->cmd_type); | ||
| 620 | if (blk_fs_request(rq) == 0 && rq->errors == 0) | ||
| 621 | rq->errors = -EIO; | ||
| 622 | ide_complete_rq(drive, -EIO, ide_rq_bytes(rq)); | ||
| 623 | return ide_stopped; | ||
| 624 | } | ||
| 625 | 590 | ||
| 626 | /* Retry a failed packet command */ | 591 | /* Retry a failed packet command */ |
| 627 | if (drive->failed_pc && drive->pc->c[0] == REQUEST_SENSE) { | 592 | if (drive->failed_pc && drive->pc->c[0] == REQUEST_SENSE) { |
| @@ -713,7 +678,7 @@ out: | |||
| 713 | 678 | ||
| 714 | cmd.rq = rq; | 679 | cmd.rq = rq; |
| 715 | 680 | ||
| 716 | ide_init_sg_cmd(&cmd, pc->req_xfer); | 681 | ide_init_sg_cmd(&cmd, blk_rq_bytes(rq)); |
| 717 | ide_map_sg(drive, &cmd); | 682 | ide_map_sg(drive, &cmd); |
| 718 | 683 | ||
| 719 | return ide_tape_issue_pc(drive, &cmd, pc); | 684 | return ide_tape_issue_pc(drive, &cmd, pc); |
| @@ -767,33 +732,53 @@ static int idetape_flush_tape_buffers(ide_drive_t *drive) | |||
| 767 | int rc; | 732 | int rc; |
| 768 | 733 | ||
| 769 | idetape_create_write_filemark_cmd(drive, &pc, 0); | 734 | idetape_create_write_filemark_cmd(drive, &pc, 0); |
| 770 | rc = ide_queue_pc_tail(drive, tape->disk, &pc); | 735 | rc = ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0); |
| 771 | if (rc) | 736 | if (rc) |
| 772 | return rc; | 737 | return rc; |
| 773 | idetape_wait_ready(drive, 60 * 5 * HZ); | 738 | idetape_wait_ready(drive, 60 * 5 * HZ); |
| 774 | return 0; | 739 | return 0; |
| 775 | } | 740 | } |
| 776 | 741 | ||
| 777 | static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc) | 742 | static int ide_tape_read_position(ide_drive_t *drive) |
| 778 | { | ||
| 779 | ide_init_pc(pc); | ||
| 780 | pc->c[0] = READ_POSITION; | ||
| 781 | pc->req_xfer = 20; | ||
| 782 | } | ||
| 783 | |||
| 784 | static int idetape_read_position(ide_drive_t *drive) | ||
| 785 | { | 743 | { |
| 786 | idetape_tape_t *tape = drive->driver_data; | 744 | idetape_tape_t *tape = drive->driver_data; |
| 787 | struct ide_atapi_pc pc; | 745 | struct ide_atapi_pc pc; |
| 788 | int position; | 746 | u8 buf[20]; |
| 789 | 747 | ||
| 790 | debug_log(DBG_PROCS, "Enter %s\n", __func__); | 748 | debug_log(DBG_PROCS, "Enter %s\n", __func__); |
| 791 | 749 | ||
| 792 | idetape_create_read_position_cmd(&pc); | 750 | /* prep cmd */ |
| 793 | if (ide_queue_pc_tail(drive, tape->disk, &pc)) | 751 | ide_init_pc(&pc); |
| 752 | pc.c[0] = READ_POSITION; | ||
| 753 | pc.req_xfer = 20; | ||
| 754 | |||
| 755 | if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) | ||
| 794 | return -1; | 756 | return -1; |
| 795 | position = tape->first_frame; | 757 | |
| 796 | return position; | 758 | if (!pc.error) { |
| 759 | debug_log(DBG_SENSE, "BOP - %s\n", | ||
| 760 | (buf[0] & 0x80) ? "Yes" : "No"); | ||
| 761 | debug_log(DBG_SENSE, "EOP - %s\n", | ||
| 762 | (buf[0] & 0x40) ? "Yes" : "No"); | ||
| 763 | |||
| 764 | if (buf[0] & 0x4) { | ||
| 765 | printk(KERN_INFO "ide-tape: Block location is unknown" | ||
| 766 | "to the tape\n"); | ||
| 767 | clear_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), | ||
| 768 | &drive->atapi_flags); | ||
| 769 | return -1; | ||
| 770 | } else { | ||
| 771 | debug_log(DBG_SENSE, "Block Location - %u\n", | ||
| 772 | be32_to_cpup((__be32 *)&buf[4])); | ||
| 773 | |||
| 774 | tape->partition = buf[1]; | ||
| 775 | tape->first_frame = be32_to_cpup((__be32 *)&buf[4]); | ||
| 776 | set_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), | ||
| 777 | &drive->atapi_flags); | ||
| 778 | } | ||
| 779 | } | ||
| 780 | |||
| 781 | return tape->first_frame; | ||
| 797 | } | 782 | } |
| 798 | 783 | ||
| 799 | static void idetape_create_locate_cmd(ide_drive_t *drive, | 784 | static void idetape_create_locate_cmd(ide_drive_t *drive, |
| @@ -836,19 +821,21 @@ static int idetape_position_tape(ide_drive_t *drive, unsigned int block, | |||
| 836 | { | 821 | { |
| 837 | idetape_tape_t *tape = drive->driver_data; | 822 | idetape_tape_t *tape = drive->driver_data; |
| 838 | struct gendisk *disk = tape->disk; | 823 | struct gendisk *disk = tape->disk; |
| 839 | int retval; | 824 | int ret; |
| 840 | struct ide_atapi_pc pc; | 825 | struct ide_atapi_pc pc; |
| 841 | 826 | ||
| 842 | if (tape->chrdev_dir == IDETAPE_DIR_READ) | 827 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
| 843 | __ide_tape_discard_merge_buffer(drive); | 828 | __ide_tape_discard_merge_buffer(drive); |
| 844 | idetape_wait_ready(drive, 60 * 5 * HZ); | 829 | idetape_wait_ready(drive, 60 * 5 * HZ); |
| 845 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); | 830 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); |
| 846 | retval = ide_queue_pc_tail(drive, disk, &pc); | 831 | ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 847 | if (retval) | 832 | if (ret) |
| 848 | return (retval); | 833 | return ret; |
| 849 | 834 | ||
| 850 | idetape_create_read_position_cmd(&pc); | 835 | ret = ide_tape_read_position(drive); |
| 851 | return ide_queue_pc_tail(drive, disk, &pc); | 836 | if (ret < 0) |
| 837 | return ret; | ||
| 838 | return 0; | ||
| 852 | } | 839 | } |
| 853 | 840 | ||
| 854 | static void ide_tape_discard_merge_buffer(ide_drive_t *drive, | 841 | static void ide_tape_discard_merge_buffer(ide_drive_t *drive, |
| @@ -859,7 +846,7 @@ static void ide_tape_discard_merge_buffer(ide_drive_t *drive, | |||
| 859 | 846 | ||
| 860 | __ide_tape_discard_merge_buffer(drive); | 847 | __ide_tape_discard_merge_buffer(drive); |
| 861 | if (restore_position) { | 848 | if (restore_position) { |
| 862 | position = idetape_read_position(drive); | 849 | position = ide_tape_read_position(drive); |
| 863 | seek = position > 0 ? position : 0; | 850 | seek = position > 0 ? position : 0; |
| 864 | if (idetape_position_tape(drive, seek, 0, 0)) { | 851 | if (idetape_position_tape(drive, seek, 0, 0)) { |
| 865 | printk(KERN_INFO "ide-tape: %s: position_tape failed in" | 852 | printk(KERN_INFO "ide-tape: %s: position_tape failed in" |
| @@ -1039,20 +1026,19 @@ static int idetape_rewind_tape(ide_drive_t *drive) | |||
| 1039 | { | 1026 | { |
| 1040 | struct ide_tape_obj *tape = drive->driver_data; | 1027 | struct ide_tape_obj *tape = drive->driver_data; |
| 1041 | struct gendisk *disk = tape->disk; | 1028 | struct gendisk *disk = tape->disk; |
| 1042 | int retval; | ||
| 1043 | struct ide_atapi_pc pc; | 1029 | struct ide_atapi_pc pc; |
| 1030 | int ret; | ||
| 1044 | 1031 | ||
| 1045 | debug_log(DBG_SENSE, "Enter %s\n", __func__); | 1032 | debug_log(DBG_SENSE, "Enter %s\n", __func__); |
| 1046 | 1033 | ||
| 1047 | idetape_create_rewind_cmd(drive, &pc); | 1034 | idetape_create_rewind_cmd(drive, &pc); |
| 1048 | retval = ide_queue_pc_tail(drive, disk, &pc); | 1035 | ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 1049 | if (retval) | 1036 | if (ret) |
| 1050 | return retval; | 1037 | return ret; |
| 1051 | 1038 | ||
| 1052 | idetape_create_read_position_cmd(&pc); | 1039 | ret = ide_tape_read_position(drive); |
| 1053 | retval = ide_queue_pc_tail(drive, disk, &pc); | 1040 | if (ret < 0) |
| 1054 | if (retval) | 1041 | return ret; |
| 1055 | return retval; | ||
| 1056 | return 0; | 1042 | return 0; |
| 1057 | } | 1043 | } |
| 1058 | 1044 | ||
| @@ -1119,7 +1105,7 @@ static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op, | |||
| 1119 | case MTBSF: | 1105 | case MTBSF: |
| 1120 | idetape_create_space_cmd(&pc, mt_count - count, | 1106 | idetape_create_space_cmd(&pc, mt_count - count, |
| 1121 | IDETAPE_SPACE_OVER_FILEMARK); | 1107 | IDETAPE_SPACE_OVER_FILEMARK); |
| 1122 | return ide_queue_pc_tail(drive, disk, &pc); | 1108 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 1123 | case MTFSFM: | 1109 | case MTFSFM: |
| 1124 | case MTBSFM: | 1110 | case MTBSFM: |
| 1125 | if (!sprev) | 1111 | if (!sprev) |
| @@ -1259,7 +1245,7 @@ static int idetape_write_filemark(ide_drive_t *drive) | |||
| 1259 | 1245 | ||
| 1260 | /* Write a filemark */ | 1246 | /* Write a filemark */ |
| 1261 | idetape_create_write_filemark_cmd(drive, &pc, 1); | 1247 | idetape_create_write_filemark_cmd(drive, &pc, 1); |
| 1262 | if (ide_queue_pc_tail(drive, tape->disk, &pc)) { | 1248 | if (ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0)) { |
| 1263 | printk(KERN_ERR "ide-tape: Couldn't write a filemark\n"); | 1249 | printk(KERN_ERR "ide-tape: Couldn't write a filemark\n"); |
| 1264 | return -EIO; | 1250 | return -EIO; |
| 1265 | } | 1251 | } |
| @@ -1345,11 +1331,11 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) | |||
| 1345 | IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK); | 1331 | IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK); |
| 1346 | case MTEOM: | 1332 | case MTEOM: |
| 1347 | idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD); | 1333 | idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD); |
| 1348 | return ide_queue_pc_tail(drive, disk, &pc); | 1334 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 1349 | case MTERASE: | 1335 | case MTERASE: |
| 1350 | (void)idetape_rewind_tape(drive); | 1336 | (void)idetape_rewind_tape(drive); |
| 1351 | idetape_create_erase_cmd(&pc); | 1337 | idetape_create_erase_cmd(&pc); |
| 1352 | return ide_queue_pc_tail(drive, disk, &pc); | 1338 | return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); |
| 1353 | case MTSETBLK: | 1339 | case MTSETBLK: |
| 1354 | if (mt_count) { | 1340 | if (mt_count) { |
| 1355 | if (mt_count < tape->blk_size || | 1341 | if (mt_count < tape->blk_size || |
| @@ -1415,7 +1401,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
| 1415 | if (cmd == MTIOCGET || cmd == MTIOCPOS) { | 1401 | if (cmd == MTIOCGET || cmd == MTIOCPOS) { |
| 1416 | block_offset = tape->valid / | 1402 | block_offset = tape->valid / |
| 1417 | (tape->blk_size * tape->user_bs_factor); | 1403 | (tape->blk_size * tape->user_bs_factor); |
| 1418 | position = idetape_read_position(drive); | 1404 | position = ide_tape_read_position(drive); |
| 1419 | if (position < 0) | 1405 | if (position < 0) |
| 1420 | return -EIO; | 1406 | return -EIO; |
| 1421 | } | 1407 | } |
| @@ -1458,9 +1444,10 @@ static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive) | |||
| 1458 | { | 1444 | { |
| 1459 | idetape_tape_t *tape = drive->driver_data; | 1445 | idetape_tape_t *tape = drive->driver_data; |
| 1460 | struct ide_atapi_pc pc; | 1446 | struct ide_atapi_pc pc; |
| 1447 | u8 buf[12]; | ||
| 1461 | 1448 | ||
| 1462 | idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR); | 1449 | idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR); |
| 1463 | if (ide_queue_pc_tail(drive, tape->disk, &pc)) { | 1450 | if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) { |
| 1464 | printk(KERN_ERR "ide-tape: Can't get block descriptor\n"); | 1451 | printk(KERN_ERR "ide-tape: Can't get block descriptor\n"); |
| 1465 | if (tape->blk_size == 0) { | 1452 | if (tape->blk_size == 0) { |
| 1466 | printk(KERN_WARNING "ide-tape: Cannot deal with zero " | 1453 | printk(KERN_WARNING "ide-tape: Cannot deal with zero " |
| @@ -1469,10 +1456,10 @@ static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive) | |||
| 1469 | } | 1456 | } |
| 1470 | return; | 1457 | return; |
| 1471 | } | 1458 | } |
| 1472 | tape->blk_size = (pc.buf[4 + 5] << 16) + | 1459 | tape->blk_size = (buf[4 + 5] << 16) + |
| 1473 | (pc.buf[4 + 6] << 8) + | 1460 | (buf[4 + 6] << 8) + |
| 1474 | pc.buf[4 + 7]; | 1461 | buf[4 + 7]; |
| 1475 | tape->drv_write_prot = (pc.buf[2] & 0x80) >> 7; | 1462 | tape->drv_write_prot = (buf[2] & 0x80) >> 7; |
| 1476 | } | 1463 | } |
| 1477 | 1464 | ||
| 1478 | static int idetape_chrdev_open(struct inode *inode, struct file *filp) | 1465 | static int idetape_chrdev_open(struct inode *inode, struct file *filp) |
| @@ -1517,7 +1504,7 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp) | |||
| 1517 | goto out_put_tape; | 1504 | goto out_put_tape; |
| 1518 | } | 1505 | } |
| 1519 | 1506 | ||
| 1520 | idetape_read_position(drive); | 1507 | ide_tape_read_position(drive); |
| 1521 | if (!test_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), &drive->atapi_flags)) | 1508 | if (!test_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), &drive->atapi_flags)) |
| 1522 | (void)idetape_rewind_tape(drive); | 1509 | (void)idetape_rewind_tape(drive); |
| 1523 | 1510 | ||
| @@ -1615,17 +1602,14 @@ static void idetape_get_inquiry_results(ide_drive_t *drive) | |||
| 1615 | char fw_rev[4], vendor_id[8], product_id[16]; | 1602 | char fw_rev[4], vendor_id[8], product_id[16]; |
| 1616 | 1603 | ||
| 1617 | idetape_create_inquiry_cmd(&pc); | 1604 | idetape_create_inquiry_cmd(&pc); |
| 1618 | pc.buf = &pc_buf[0]; | 1605 | if (ide_queue_pc_tail(drive, tape->disk, &pc, pc_buf, pc.req_xfer)) { |
| 1619 | pc.buf_size = sizeof(pc_buf); | ||
| 1620 | |||
| 1621 | if (ide_queue_pc_tail(drive, tape->disk, &pc)) { | ||
| 1622 | printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n", | 1606 | printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n", |
| 1623 | tape->name); | 1607 | tape->name); |
| 1624 | return; | 1608 | return; |
| 1625 | } | 1609 | } |
| 1626 | memcpy(vendor_id, &pc.buf[8], 8); | 1610 | memcpy(vendor_id, &pc_buf[8], 8); |
| 1627 | memcpy(product_id, &pc.buf[16], 16); | 1611 | memcpy(product_id, &pc_buf[16], 16); |
| 1628 | memcpy(fw_rev, &pc.buf[32], 4); | 1612 | memcpy(fw_rev, &pc_buf[32], 4); |
| 1629 | 1613 | ||
| 1630 | ide_fixstring(vendor_id, 8, 0); | 1614 | ide_fixstring(vendor_id, 8, 0); |
| 1631 | ide_fixstring(product_id, 16, 0); | 1615 | ide_fixstring(product_id, 16, 0); |
| @@ -1643,11 +1627,11 @@ static void idetape_get_mode_sense_results(ide_drive_t *drive) | |||
| 1643 | { | 1627 | { |
| 1644 | idetape_tape_t *tape = drive->driver_data; | 1628 | idetape_tape_t *tape = drive->driver_data; |
| 1645 | struct ide_atapi_pc pc; | 1629 | struct ide_atapi_pc pc; |
| 1646 | u8 *caps; | 1630 | u8 buf[24], *caps; |
| 1647 | u8 speed, max_speed; | 1631 | u8 speed, max_speed; |
| 1648 | 1632 | ||
| 1649 | idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE); | 1633 | idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE); |
| 1650 | if (ide_queue_pc_tail(drive, tape->disk, &pc)) { | 1634 | if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) { |
| 1651 | printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming" | 1635 | printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming" |
| 1652 | " some default values\n"); | 1636 | " some default values\n"); |
| 1653 | tape->blk_size = 512; | 1637 | tape->blk_size = 512; |
| @@ -1656,7 +1640,7 @@ static void idetape_get_mode_sense_results(ide_drive_t *drive) | |||
| 1656 | put_unaligned(6*52, (u16 *)&tape->caps[16]); | 1640 | put_unaligned(6*52, (u16 *)&tape->caps[16]); |
| 1657 | return; | 1641 | return; |
| 1658 | } | 1642 | } |
| 1659 | caps = pc.buf + 4 + pc.buf[3]; | 1643 | caps = buf + 4 + buf[3]; |
| 1660 | 1644 | ||
| 1661 | /* convert to host order and save for later use */ | 1645 | /* convert to host order and save for later use */ |
| 1662 | speed = be16_to_cpup((__be16 *)&caps[14]); | 1646 | speed = be16_to_cpup((__be16 *)&caps[14]); |
diff --git a/drivers/ide/ide-xfer-mode.c b/drivers/ide/ide-xfer-mode.c index af44be9d546c..46d203ce60cc 100644 --- a/drivers/ide/ide-xfer-mode.c +++ b/drivers/ide/ide-xfer-mode.c | |||
| @@ -107,6 +107,18 @@ u8 ide_get_best_pio_mode(ide_drive_t *drive, u8 mode_wanted, u8 max_mode) | |||
| 107 | } | 107 | } |
| 108 | EXPORT_SYMBOL_GPL(ide_get_best_pio_mode); | 108 | EXPORT_SYMBOL_GPL(ide_get_best_pio_mode); |
| 109 | 109 | ||
| 110 | int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio) | ||
| 111 | { | ||
| 112 | /* | ||
| 113 | * IORDY may lead to controller lock up on certain controllers | ||
| 114 | * if the port is not occupied. | ||
| 115 | */ | ||
| 116 | if (pio == 0 && (drive->hwif->port_flags & IDE_PFLAG_PROBING)) | ||
| 117 | return 0; | ||
| 118 | return ata_id_pio_need_iordy(drive->id, pio); | ||
| 119 | } | ||
| 120 | EXPORT_SYMBOL_GPL(ide_pio_need_iordy); | ||
| 121 | |||
| 110 | int ide_set_pio_mode(ide_drive_t *drive, const u8 mode) | 122 | int ide_set_pio_mode(ide_drive_t *drive, const u8 mode) |
| 111 | { | 123 | { |
| 112 | ide_hwif_t *hwif = drive->hwif; | 124 | ide_hwif_t *hwif = drive->hwif; |
diff --git a/drivers/ide/it8172.c b/drivers/ide/it8172.c index e021078cd06b..0d266a5b524d 100644 --- a/drivers/ide/it8172.c +++ b/drivers/ide/it8172.c | |||
| @@ -66,7 +66,7 @@ static void it8172_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 66 | if (drive->media == ide_disk) | 66 | if (drive->media == ide_disk) |
| 67 | /* enable prefetch */ | 67 | /* enable prefetch */ |
| 68 | drive_enables |= 0x0004 << (drive->dn * 4); | 68 | drive_enables |= 0x0004 << (drive->dn * 4); |
| 69 | if (ata_id_has_iordy(drive->id)) | 69 | if (ide_pio_need_iordy(drive, pio)) |
| 70 | /* enable IORDY sample-point */ | 70 | /* enable IORDY sample-point */ |
| 71 | drive_enables |= 0x0002 << (drive->dn * 4); | 71 | drive_enables |= 0x0002 << (drive->dn * 4); |
| 72 | 72 | ||
diff --git a/drivers/ide/it8213.c b/drivers/ide/it8213.c index d7969b6d139e..47976167796a 100644 --- a/drivers/ide/it8213.c +++ b/drivers/ide/it8213.c | |||
| @@ -50,7 +50,7 @@ static void it8213_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 50 | control |= 1; /* Programmable timing on */ | 50 | control |= 1; /* Programmable timing on */ |
| 51 | if (drive->media != ide_disk) | 51 | if (drive->media != ide_disk) |
| 52 | control |= 4; /* ATAPI */ | 52 | control |= 4; /* ATAPI */ |
| 53 | if (pio > 2) | 53 | if (ide_pio_need_iordy(drive, pio)) |
| 54 | control |= 2; /* IORDY */ | 54 | control |= 2; /* IORDY */ |
| 55 | if (is_slave) { | 55 | if (is_slave) { |
| 56 | master_data |= 0x4000; | 56 | master_data |= 0x4000; |
diff --git a/drivers/ide/macide.c b/drivers/ide/macide.c index 1447c8c90565..505ec43e5606 100644 --- a/drivers/ide/macide.c +++ b/drivers/ide/macide.c | |||
| @@ -53,17 +53,20 @@ | |||
| 53 | 53 | ||
| 54 | volatile unsigned char *ide_ifr = (unsigned char *) (IDE_BASE + IDE_IFR); | 54 | volatile unsigned char *ide_ifr = (unsigned char *) (IDE_BASE + IDE_IFR); |
| 55 | 55 | ||
| 56 | int macide_ack_intr(ide_hwif_t* hwif) | 56 | int macide_test_irq(ide_hwif_t *hwif) |
| 57 | { | 57 | { |
| 58 | if (*ide_ifr & 0x20) { | 58 | if (*ide_ifr & 0x20) |
| 59 | *ide_ifr &= ~0x20; | ||
| 60 | return 1; | 59 | return 1; |
| 61 | } | ||
| 62 | return 0; | 60 | return 0; |
| 63 | } | 61 | } |
| 64 | 62 | ||
| 63 | static void macide_clear_irq(ide_drive_t *drive) | ||
| 64 | { | ||
| 65 | *ide_ifr &= ~0x20; | ||
| 66 | } | ||
| 67 | |||
| 65 | static void __init macide_setup_ports(struct ide_hw *hw, unsigned long base, | 68 | static void __init macide_setup_ports(struct ide_hw *hw, unsigned long base, |
| 66 | int irq, ide_ack_intr_t *ack_intr) | 69 | int irq) |
| 67 | { | 70 | { |
| 68 | int i; | 71 | int i; |
| 69 | 72 | ||
| @@ -75,10 +78,15 @@ static void __init macide_setup_ports(struct ide_hw *hw, unsigned long base, | |||
| 75 | hw->io_ports.ctl_addr = base + IDE_CONTROL; | 78 | hw->io_ports.ctl_addr = base + IDE_CONTROL; |
| 76 | 79 | ||
| 77 | hw->irq = irq; | 80 | hw->irq = irq; |
| 78 | hw->ack_intr = ack_intr; | ||
| 79 | } | 81 | } |
| 80 | 82 | ||
| 83 | static const struct ide_port_ops macide_port_ops = { | ||
| 84 | .clear_irq = macide_clear_irq, | ||
| 85 | .test_irq = macide_test_irq, | ||
| 86 | }; | ||
| 87 | |||
| 81 | static const struct ide_port_info macide_port_info = { | 88 | static const struct ide_port_info macide_port_info = { |
| 89 | .port_ops = &macide_port_ops, | ||
| 82 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 90 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
| 83 | .irq_flags = IRQF_SHARED, | 91 | .irq_flags = IRQF_SHARED, |
| 84 | .chipset = ide_generic, | 92 | .chipset = ide_generic, |
| @@ -93,10 +101,10 @@ static const char *mac_ide_name[] = | |||
| 93 | 101 | ||
| 94 | static int __init macide_init(void) | 102 | static int __init macide_init(void) |
| 95 | { | 103 | { |
| 96 | ide_ack_intr_t *ack_intr; | ||
| 97 | unsigned long base; | 104 | unsigned long base; |
| 98 | int irq; | 105 | int irq; |
| 99 | struct ide_hw hw, *hws[] = { &hw }; | 106 | struct ide_hw hw, *hws[] = { &hw }; |
| 107 | struct ide_port_info d = macide_port_info; | ||
| 100 | 108 | ||
| 101 | if (!MACH_IS_MAC) | 109 | if (!MACH_IS_MAC) |
| 102 | return -ENODEV; | 110 | return -ENODEV; |
| @@ -104,17 +112,15 @@ static int __init macide_init(void) | |||
| 104 | switch (macintosh_config->ide_type) { | 112 | switch (macintosh_config->ide_type) { |
| 105 | case MAC_IDE_QUADRA: | 113 | case MAC_IDE_QUADRA: |
| 106 | base = IDE_BASE; | 114 | base = IDE_BASE; |
| 107 | ack_intr = macide_ack_intr; | ||
| 108 | irq = IRQ_NUBUS_F; | 115 | irq = IRQ_NUBUS_F; |
| 109 | break; | 116 | break; |
| 110 | case MAC_IDE_PB: | 117 | case MAC_IDE_PB: |
| 111 | base = IDE_BASE; | 118 | base = IDE_BASE; |
| 112 | ack_intr = macide_ack_intr; | ||
| 113 | irq = IRQ_NUBUS_C; | 119 | irq = IRQ_NUBUS_C; |
| 114 | break; | 120 | break; |
| 115 | case MAC_IDE_BABOON: | 121 | case MAC_IDE_BABOON: |
| 116 | base = BABOON_BASE; | 122 | base = BABOON_BASE; |
| 117 | ack_intr = NULL; | 123 | d.port_ops = NULL; |
| 118 | irq = IRQ_BABOON_1; | 124 | irq = IRQ_BABOON_1; |
| 119 | break; | 125 | break; |
| 120 | default: | 126 | default: |
| @@ -124,9 +130,9 @@ static int __init macide_init(void) | |||
| 124 | printk(KERN_INFO "ide: Macintosh %s IDE controller\n", | 130 | printk(KERN_INFO "ide: Macintosh %s IDE controller\n", |
| 125 | mac_ide_name[macintosh_config->ide_type - 1]); | 131 | mac_ide_name[macintosh_config->ide_type - 1]); |
| 126 | 132 | ||
| 127 | macide_setup_ports(&hw, base, irq, ack_intr); | 133 | macide_setup_ports(&hw, base, irq); |
| 128 | 134 | ||
| 129 | return ide_host_add(&macide_port_info, hws, 1, NULL); | 135 | return ide_host_add(&d, hws, 1, NULL); |
| 130 | } | 136 | } |
| 131 | 137 | ||
| 132 | module_init(macide_init); | 138 | module_init(macide_init); |
diff --git a/drivers/ide/opti621.c b/drivers/ide/opti621.c index 6048eda3cd61..f1d70d6630fe 100644 --- a/drivers/ide/opti621.c +++ b/drivers/ide/opti621.c | |||
| @@ -138,6 +138,7 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 138 | ide_hwif_t *hwif = drive->hwif; | 138 | ide_hwif_t *hwif = drive->hwif; |
| 139 | ide_drive_t *pair = ide_get_pair_dev(drive); | 139 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 140 | unsigned long flags; | 140 | unsigned long flags; |
| 141 | unsigned long mode = XFER_PIO_0 + pio, pair_mode; | ||
| 141 | u8 tim, misc, addr_pio = pio, clk; | 142 | u8 tim, misc, addr_pio = pio, clk; |
| 142 | 143 | ||
| 143 | /* DRDY is default 2 (by OPTi Databook) */ | 144 | /* DRDY is default 2 (by OPTi Databook) */ |
| @@ -150,11 +151,12 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 150 | { 0x48, 0x34, 0x21, 0x10, 0x10 } /* 25 MHz */ | 151 | { 0x48, 0x34, 0x21, 0x10, 0x10 } /* 25 MHz */ |
| 151 | }; | 152 | }; |
| 152 | 153 | ||
| 153 | drive->drive_data = XFER_PIO_0 + pio; | 154 | ide_set_drivedata(drive, (void *)mode); |
| 154 | 155 | ||
| 155 | if (pair) { | 156 | if (pair) { |
| 156 | if (pair->drive_data && pair->drive_data < drive->drive_data) | 157 | pair_mode = (unsigned long)ide_get_drivedata(pair); |
| 157 | addr_pio = pair->drive_data - XFER_PIO_0; | 158 | if (pair_mode && pair_mode < mode) |
| 159 | addr_pio = pair_mode - XFER_PIO_0; | ||
| 158 | } | 160 | } |
| 159 | 161 | ||
| 160 | spin_lock_irqsave(&opti621_lock, flags); | 162 | spin_lock_irqsave(&opti621_lock, flags); |
diff --git a/drivers/ide/pdc202xx_old.c b/drivers/ide/pdc202xx_old.c index b6abf7e52cac..cb812f3700e8 100644 --- a/drivers/ide/pdc202xx_old.c +++ b/drivers/ide/pdc202xx_old.c | |||
| @@ -73,7 +73,7 @@ static void pdc202xx_set_mode(ide_drive_t *drive, const u8 speed) | |||
| 73 | * Prefetch_EN / IORDY_EN / PA[3:0] bits of register A | 73 | * Prefetch_EN / IORDY_EN / PA[3:0] bits of register A |
| 74 | */ | 74 | */ |
| 75 | AP &= ~0x3f; | 75 | AP &= ~0x3f; |
| 76 | if (ata_id_iordy_disable(drive->id)) | 76 | if (ide_pio_need_iordy(drive, speed - XFER_PIO_0)) |
| 77 | AP |= 0x20; /* set IORDY_EN bit */ | 77 | AP |= 0x20; /* set IORDY_EN bit */ |
| 78 | if (drive->media == ide_disk) | 78 | if (drive->media == ide_disk) |
| 79 | AP |= 0x10; /* set Prefetch_EN bit */ | 79 | AP |= 0x10; /* set Prefetch_EN bit */ |
| @@ -104,6 +104,27 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 104 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); | 104 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | static int pdc202xx_test_irq(ide_hwif_t *hwif) | ||
| 108 | { | ||
| 109 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
| 110 | unsigned long high_16 = pci_resource_start(dev, 4); | ||
| 111 | u8 sc1d = inb(high_16 + 0x1d); | ||
| 112 | |||
| 113 | if (hwif->channel) { | ||
| 114 | /* | ||
| 115 | * bit 7: error, bit 6: interrupting, | ||
| 116 | * bit 5: FIFO full, bit 4: FIFO empty | ||
| 117 | */ | ||
| 118 | return ((sc1d & 0x50) == 0x40) ? 1 : 0; | ||
| 119 | } else { | ||
| 120 | /* | ||
| 121 | * bit 3: error, bit 2: interrupting, | ||
| 122 | * bit 1: FIFO full, bit 0: FIFO empty | ||
| 123 | */ | ||
| 124 | return ((sc1d & 0x05) == 0x04) ? 1 : 0; | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 107 | static u8 pdc2026x_cable_detect(ide_hwif_t *hwif) | 128 | static u8 pdc2026x_cable_detect(ide_hwif_t *hwif) |
| 108 | { | 129 | { |
| 109 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 130 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| @@ -231,6 +252,7 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, | |||
| 231 | static const struct ide_port_ops pdc20246_port_ops = { | 252 | static const struct ide_port_ops pdc20246_port_ops = { |
| 232 | .set_pio_mode = pdc202xx_set_pio_mode, | 253 | .set_pio_mode = pdc202xx_set_pio_mode, |
| 233 | .set_dma_mode = pdc202xx_set_mode, | 254 | .set_dma_mode = pdc202xx_set_mode, |
| 255 | .test_irq = pdc202xx_test_irq, | ||
| 234 | }; | 256 | }; |
| 235 | 257 | ||
| 236 | static const struct ide_port_ops pdc2026x_port_ops = { | 258 | static const struct ide_port_ops pdc2026x_port_ops = { |
diff --git a/drivers/ide/piix.c b/drivers/ide/piix.c index 69860dea3820..bf14f39bd3a7 100644 --- a/drivers/ide/piix.c +++ b/drivers/ide/piix.c | |||
| @@ -98,7 +98,7 @@ static void piix_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 98 | control |= 1; /* Programmable timing on */ | 98 | control |= 1; /* Programmable timing on */ |
| 99 | if (drive->media == ide_disk) | 99 | if (drive->media == ide_disk) |
| 100 | control |= 4; /* Prefetch, post write */ | 100 | control |= 4; /* Prefetch, post write */ |
| 101 | if (pio > 2) | 101 | if (ide_pio_need_iordy(drive, pio)) |
| 102 | control |= 2; /* IORDY */ | 102 | control |= 2; /* IORDY */ |
| 103 | if (is_slave) { | 103 | if (is_slave) { |
| 104 | master_data |= 0x4000; | 104 | master_data |= 0x4000; |
diff --git a/drivers/ide/q40ide.c b/drivers/ide/q40ide.c index ab49a97023d9..90786083b439 100644 --- a/drivers/ide/q40ide.c +++ b/drivers/ide/q40ide.c | |||
| @@ -51,9 +51,7 @@ static int q40ide_default_irq(unsigned long base) | |||
| 51 | /* | 51 | /* |
| 52 | * Addresses are pretranslated for Q40 ISA access. | 52 | * Addresses are pretranslated for Q40 ISA access. |
| 53 | */ | 53 | */ |
| 54 | static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, | 54 | static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, int irq) |
| 55 | ide_ack_intr_t *ack_intr, | ||
| 56 | int irq) | ||
| 57 | { | 55 | { |
| 58 | memset(hw, 0, sizeof(*hw)); | 56 | memset(hw, 0, sizeof(*hw)); |
| 59 | /* BIG FAT WARNING: | 57 | /* BIG FAT WARNING: |
| @@ -69,7 +67,6 @@ static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, | |||
| 69 | hw->io_ports.ctl_addr = Q40_ISA_IO_B(base + 0x206); | 67 | hw->io_ports.ctl_addr = Q40_ISA_IO_B(base + 0x206); |
| 70 | 68 | ||
| 71 | hw->irq = irq; | 69 | hw->irq = irq; |
| 72 | hw->ack_intr = ack_intr; | ||
| 73 | } | 70 | } |
| 74 | 71 | ||
| 75 | static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, | 72 | static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, |
| @@ -156,7 +153,7 @@ static int __init q40ide_init(void) | |||
| 156 | release_region(pcide_bases[i], 8); | 153 | release_region(pcide_bases[i], 8); |
| 157 | continue; | 154 | continue; |
| 158 | } | 155 | } |
| 159 | q40_ide_setup_ports(&hw[i], pcide_bases[i], NULL, | 156 | q40_ide_setup_ports(&hw[i], pcide_bases[i], |
| 160 | q40ide_default_irq(pcide_bases[i])); | 157 | q40ide_default_irq(pcide_bases[i])); |
| 161 | 158 | ||
| 162 | hws[i] = &hw[i]; | 159 | hws[i] = &hw[i]; |
diff --git a/drivers/ide/qd65xx.c b/drivers/ide/qd65xx.c index c9a134986891..74696edc8d1d 100644 --- a/drivers/ide/qd65xx.c +++ b/drivers/ide/qd65xx.c | |||
| @@ -180,8 +180,11 @@ static int qd_find_disk_type (ide_drive_t *drive, | |||
| 180 | 180 | ||
| 181 | static void qd_set_timing (ide_drive_t *drive, u8 timing) | 181 | static void qd_set_timing (ide_drive_t *drive, u8 timing) |
| 182 | { | 182 | { |
| 183 | drive->drive_data &= 0xff00; | 183 | unsigned long data = (unsigned long)ide_get_drivedata(drive); |
| 184 | drive->drive_data |= timing; | 184 | |
| 185 | data &= 0xff00; | ||
| 186 | data |= timing; | ||
| 187 | ide_set_drivedata(drive, (void *)data); | ||
| 185 | 188 | ||
| 186 | printk(KERN_DEBUG "%s: %#x\n", drive->name, timing); | 189 | printk(KERN_DEBUG "%s: %#x\n", drive->name, timing); |
| 187 | } | 190 | } |
| @@ -292,7 +295,7 @@ static void __init qd6500_init_dev(ide_drive_t *drive) | |||
| 292 | u8 base = (hwif->config_data & 0xff00) >> 8; | 295 | u8 base = (hwif->config_data & 0xff00) >> 8; |
| 293 | u8 config = QD_CONFIG(hwif); | 296 | u8 config = QD_CONFIG(hwif); |
| 294 | 297 | ||
| 295 | drive->drive_data = QD6500_DEF_DATA; | 298 | ide_set_drivedata(drive, (void *)QD6500_DEF_DATA); |
| 296 | } | 299 | } |
| 297 | 300 | ||
| 298 | static void __init qd6580_init_dev(ide_drive_t *drive) | 301 | static void __init qd6580_init_dev(ide_drive_t *drive) |
| @@ -308,7 +311,7 @@ static void __init qd6580_init_dev(ide_drive_t *drive) | |||
| 308 | } else | 311 | } else |
| 309 | t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA; | 312 | t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA; |
| 310 | 313 | ||
| 311 | drive->drive_data = (drive->dn & 1) ? t2 : t1; | 314 | ide_set_drivedata(drive, (void *)((drive->dn & 1) ? t2 : t1)); |
| 312 | } | 315 | } |
| 313 | 316 | ||
| 314 | static const struct ide_tp_ops qd65xx_tp_ops = { | 317 | static const struct ide_tp_ops qd65xx_tp_ops = { |
diff --git a/drivers/ide/qd65xx.h b/drivers/ide/qd65xx.h index d7e67a1a1dcc..1fba2a5f281c 100644 --- a/drivers/ide/qd65xx.h +++ b/drivers/ide/qd65xx.h | |||
| @@ -31,8 +31,15 @@ | |||
| 31 | 31 | ||
| 32 | #define QD_CONFIG(hwif) ((hwif)->config_data & 0x00ff) | 32 | #define QD_CONFIG(hwif) ((hwif)->config_data & 0x00ff) |
| 33 | 33 | ||
| 34 | #define QD_TIMING(drive) (u8)(((drive)->drive_data) & 0x00ff) | 34 | static inline u8 QD_TIMING(ide_drive_t *drive) |
| 35 | #define QD_TIMREG(drive) (u8)((((drive)->drive_data) & 0xff00) >> 8) | 35 | { |
| 36 | return (unsigned long)ide_get_drivedata(drive) & 0x00ff; | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline u8 QD_TIMREG(ide_drive_t *drive) | ||
| 40 | { | ||
| 41 | return ((unsigned long)ide_get_drivedata(drive) & 0xff00) >> 8; | ||
| 42 | } | ||
| 36 | 43 | ||
| 37 | #define QD6500_DEF_DATA ((QD_TIM1_PORT<<8) | (QD_ID3 ? 0x0c : 0x08)) | 44 | #define QD6500_DEF_DATA ((QD_TIM1_PORT<<8) | (QD_ID3 ? 0x0c : 0x08)) |
| 38 | #define QD6580_DEF_DATA ((QD_TIM1_PORT<<8) | (QD_ID3 ? 0x0a : 0x00)) | 45 | #define QD6580_DEF_DATA ((QD_TIM1_PORT<<8) | (QD_ID3 ? 0x0a : 0x00)) |
diff --git a/drivers/ide/sgiioc4.c b/drivers/ide/sgiioc4.c index 5f37f168f944..b7d61dc64096 100644 --- a/drivers/ide/sgiioc4.c +++ b/drivers/ide/sgiioc4.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. | 2 | * Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. |
| 3 | * Copyright (C) 2008 MontaVista Software, Inc. | 3 | * Copyright (C) 2008-2009 MontaVista Software, Inc. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or modify it |
| 6 | * under the terms of version 2 of the GNU General Public License | 6 | * under the terms of version 2 of the GNU General Public License |
| @@ -29,8 +29,7 @@ | |||
| 29 | #include <linux/blkdev.h> | 29 | #include <linux/blkdev.h> |
| 30 | #include <linux/scatterlist.h> | 30 | #include <linux/scatterlist.h> |
| 31 | #include <linux/ioc4.h> | 31 | #include <linux/ioc4.h> |
| 32 | #include <asm/io.h> | 32 | #include <linux/io.h> |
| 33 | |||
| 34 | #include <linux/ide.h> | 33 | #include <linux/ide.h> |
| 35 | 34 | ||
| 36 | #define DRV_NAME "SGIIOC4" | 35 | #define DRV_NAME "SGIIOC4" |
| @@ -72,7 +71,7 @@ | |||
| 72 | #define IOC4_CMD_CTL_BLK_SIZE 0x20 | 71 | #define IOC4_CMD_CTL_BLK_SIZE 0x20 |
| 73 | #define IOC4_SUPPORTED_FIRMWARE_REV 46 | 72 | #define IOC4_SUPPORTED_FIRMWARE_REV 46 |
| 74 | 73 | ||
| 75 | typedef struct { | 74 | struct ioc4_dma_regs { |
| 76 | u32 timing_reg0; | 75 | u32 timing_reg0; |
| 77 | u32 timing_reg1; | 76 | u32 timing_reg1; |
| 78 | u32 low_mem_ptr; | 77 | u32 low_mem_ptr; |
| @@ -82,17 +81,18 @@ typedef struct { | |||
| 82 | u32 dev_byte_count; | 81 | u32 dev_byte_count; |
| 83 | u32 mem_byte_count; | 82 | u32 mem_byte_count; |
| 84 | u32 status; | 83 | u32 status; |
| 85 | } ioc4_dma_regs_t; | 84 | }; |
| 86 | 85 | ||
| 87 | /* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */ | 86 | /* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */ |
| 88 | /* IOC4 has only 1 IDE channel */ | 87 | /* IOC4 has only 1 IDE channel */ |
| 89 | #define IOC4_PRD_BYTES 16 | 88 | #define IOC4_PRD_BYTES 16 |
| 90 | #define IOC4_PRD_ENTRIES (PAGE_SIZE /(4*IOC4_PRD_BYTES)) | 89 | #define IOC4_PRD_ENTRIES (PAGE_SIZE / (4 * IOC4_PRD_BYTES)) |
| 91 | 90 | ||
| 92 | 91 | ||
| 93 | static void | 92 | static void sgiioc4_init_hwif_ports(struct ide_hw *hw, |
| 94 | sgiioc4_init_hwif_ports(struct ide_hw *hw, unsigned long data_port, | 93 | unsigned long data_port, |
| 95 | unsigned long ctrl_port, unsigned long irq_port) | 94 | unsigned long ctrl_port, |
| 95 | unsigned long irq_port) | ||
| 96 | { | 96 | { |
| 97 | unsigned long reg = data_port; | 97 | unsigned long reg = data_port; |
| 98 | int i; | 98 | int i; |
| @@ -105,13 +105,11 @@ sgiioc4_init_hwif_ports(struct ide_hw *hw, unsigned long data_port, | |||
| 105 | hw->io_ports.irq_addr = irq_port; | 105 | hw->io_ports.irq_addr = irq_port; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | static int | 108 | static int sgiioc4_checkirq(ide_hwif_t *hwif) |
| 109 | sgiioc4_checkirq(ide_hwif_t * hwif) | ||
| 110 | { | 109 | { |
| 111 | unsigned long intr_addr = | 110 | unsigned long intr_addr = hwif->io_ports.irq_addr + IOC4_INTR_REG * 4; |
| 112 | hwif->io_ports.irq_addr + IOC4_INTR_REG * 4; | ||
| 113 | 111 | ||
| 114 | if ((u8)readl((void __iomem *)intr_addr) & 0x03) | 112 | if (readl((void __iomem *)intr_addr) & 0x03) |
| 115 | return 1; | 113 | return 1; |
| 116 | 114 | ||
| 117 | return 0; | 115 | return 0; |
| @@ -119,8 +117,7 @@ sgiioc4_checkirq(ide_hwif_t * hwif) | |||
| 119 | 117 | ||
| 120 | static u8 sgiioc4_read_status(ide_hwif_t *); | 118 | static u8 sgiioc4_read_status(ide_hwif_t *); |
| 121 | 119 | ||
| 122 | static int | 120 | static int sgiioc4_clearirq(ide_drive_t *drive) |
| 123 | sgiioc4_clearirq(ide_drive_t * drive) | ||
| 124 | { | 121 | { |
| 125 | u32 intr_reg; | 122 | u32 intr_reg; |
| 126 | ide_hwif_t *hwif = drive->hwif; | 123 | ide_hwif_t *hwif = drive->hwif; |
| @@ -158,12 +155,10 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
| 158 | readl((void __iomem *)(io_ports->irq_addr + 4)); | 155 | readl((void __iomem *)(io_ports->irq_addr + 4)); |
| 159 | pci_read_config_dword(dev, PCI_COMMAND, | 156 | pci_read_config_dword(dev, PCI_COMMAND, |
| 160 | &pci_stat_cmd_reg); | 157 | &pci_stat_cmd_reg); |
| 161 | printk(KERN_ERR | 158 | printk(KERN_ERR "%s(%s): PCI Bus Error when doing DMA: " |
| 162 | "%s(%s) : PCI Bus Error when doing DMA:" | 159 | "status-cmd reg is 0x%x\n", |
| 163 | " status-cmd reg is 0x%x\n", | ||
| 164 | __func__, drive->name, pci_stat_cmd_reg); | 160 | __func__, drive->name, pci_stat_cmd_reg); |
| 165 | printk(KERN_ERR | 161 | printk(KERN_ERR "%s(%s): PCI Error Address is 0x%x%x\n", |
| 166 | "%s(%s) : PCI Error Address is 0x%x%x\n", | ||
| 167 | __func__, drive->name, | 162 | __func__, drive->name, |
| 168 | pci_err_addr_high, pci_err_addr_low); | 163 | pci_err_addr_high, pci_err_addr_low); |
| 169 | /* Clear the PCI Error indicator */ | 164 | /* Clear the PCI Error indicator */ |
| @@ -189,8 +184,7 @@ static void sgiioc4_dma_start(ide_drive_t *drive) | |||
| 189 | writel(temp_reg, (void __iomem *)ioc4_dma_addr); | 184 | writel(temp_reg, (void __iomem *)ioc4_dma_addr); |
| 190 | } | 185 | } |
| 191 | 186 | ||
| 192 | static u32 | 187 | static u32 sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base) |
| 193 | sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base) | ||
| 194 | { | 188 | { |
| 195 | unsigned long ioc4_dma_addr = dma_base + IOC4_DMA_CTRL * 4; | 189 | unsigned long ioc4_dma_addr = dma_base + IOC4_DMA_CTRL * 4; |
| 196 | u32 ioc4_dma; | 190 | u32 ioc4_dma; |
| @@ -227,7 +221,7 @@ static int sgiioc4_dma_end(ide_drive_t *drive) | |||
| 227 | } | 221 | } |
| 228 | 222 | ||
| 229 | /* | 223 | /* |
| 230 | * The IOC4 will DMA 1's to the ending dma area to indicate that | 224 | * The IOC4 will DMA 1's to the ending DMA area to indicate that |
| 231 | * previous data DMA is complete. This is necessary because of relaxed | 225 | * previous data DMA is complete. This is necessary because of relaxed |
| 232 | * ordering between register reads and DMA writes on the Altix. | 226 | * ordering between register reads and DMA writes on the Altix. |
| 233 | */ | 227 | */ |
| @@ -265,7 +259,7 @@ static void sgiioc4_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 265 | { | 259 | { |
| 266 | } | 260 | } |
| 267 | 261 | ||
| 268 | /* returns 1 if dma irq issued, 0 otherwise */ | 262 | /* Returns 1 if DMA IRQ issued, 0 otherwise */ |
| 269 | static int sgiioc4_dma_test_irq(ide_drive_t *drive) | 263 | static int sgiioc4_dma_test_irq(ide_drive_t *drive) |
| 270 | { | 264 | { |
| 271 | return sgiioc4_checkirq(drive->hwif); | 265 | return sgiioc4_checkirq(drive->hwif); |
| @@ -286,8 +280,7 @@ static void sgiioc4_resetproc(ide_drive_t *drive) | |||
| 286 | sgiioc4_clearirq(drive); | 280 | sgiioc4_clearirq(drive); |
| 287 | } | 281 | } |
| 288 | 282 | ||
| 289 | static void | 283 | static void sgiioc4_dma_lost_irq(ide_drive_t *drive) |
| 290 | sgiioc4_dma_lost_irq(ide_drive_t * drive) | ||
| 291 | { | 284 | { |
| 292 | sgiioc4_resetproc(drive); | 285 | sgiioc4_resetproc(drive); |
| 293 | 286 | ||
| @@ -313,13 +306,13 @@ static u8 sgiioc4_read_status(ide_hwif_t *hwif) | |||
| 313 | return reg; | 306 | return reg; |
| 314 | } | 307 | } |
| 315 | 308 | ||
| 316 | /* Creates a dma map for the scatter-gather list entries */ | 309 | /* Creates a DMA map for the scatter-gather list entries */ |
| 317 | static int __devinit | 310 | static int __devinit ide_dma_sgiioc4(ide_hwif_t *hwif, |
| 318 | ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | 311 | const struct ide_port_info *d) |
| 319 | { | 312 | { |
| 320 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 313 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 321 | unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; | 314 | unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; |
| 322 | int num_ports = sizeof (ioc4_dma_regs_t); | 315 | int num_ports = sizeof(struct ioc4_dma_regs); |
| 323 | void *pad; | 316 | void *pad; |
| 324 | 317 | ||
| 325 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); | 318 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); |
| @@ -362,8 +355,7 @@ dma_pci_alloc_failure: | |||
| 362 | } | 355 | } |
| 363 | 356 | ||
| 364 | /* Initializes the IOC4 DMA Engine */ | 357 | /* Initializes the IOC4 DMA Engine */ |
| 365 | static void | 358 | static void sgiioc4_configure_for_dma(int dma_direction, ide_drive_t *drive) |
| 366 | sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | ||
| 367 | { | 359 | { |
| 368 | u32 ioc4_dma; | 360 | u32 ioc4_dma; |
| 369 | ide_hwif_t *hwif = drive->hwif; | 361 | ide_hwif_t *hwif = drive->hwif; |
| @@ -374,31 +366,27 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | |||
| 374 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); | 366 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
| 375 | 367 | ||
| 376 | if (ioc4_dma & IOC4_S_DMA_ACTIVE) { | 368 | if (ioc4_dma & IOC4_S_DMA_ACTIVE) { |
| 377 | printk(KERN_WARNING | 369 | printk(KERN_WARNING "%s(%s): Warning!! DMA from previous " |
| 378 | "%s(%s):Warning!! DMA from previous transfer was still active\n", | 370 | "transfer was still active\n", __func__, drive->name); |
| 379 | __func__, drive->name); | ||
| 380 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); | 371 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); |
| 381 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); | 372 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); |
| 382 | 373 | ||
| 383 | if (ioc4_dma & IOC4_S_DMA_STOP) | 374 | if (ioc4_dma & IOC4_S_DMA_STOP) |
| 384 | printk(KERN_ERR | 375 | printk(KERN_ERR "%s(%s): IOC4 DMA STOP bit is " |
| 385 | "%s(%s) : IOC4 Dma STOP bit is still 1\n", | 376 | "still 1\n", __func__, drive->name); |
| 386 | __func__, drive->name); | ||
| 387 | } | 377 | } |
| 388 | 378 | ||
| 389 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); | 379 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
| 390 | if (ioc4_dma & IOC4_S_DMA_ERROR) { | 380 | if (ioc4_dma & IOC4_S_DMA_ERROR) { |
| 391 | printk(KERN_WARNING | 381 | printk(KERN_WARNING "%s(%s): Warning!! DMA Error during " |
| 392 | "%s(%s) : Warning!! - DMA Error during Previous" | 382 | "previous transfer, status 0x%x\n", |
| 393 | " transfer | status 0x%x\n", | ||
| 394 | __func__, drive->name, ioc4_dma); | 383 | __func__, drive->name, ioc4_dma); |
| 395 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); | 384 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); |
| 396 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); | 385 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); |
| 397 | 386 | ||
| 398 | if (ioc4_dma & IOC4_S_DMA_STOP) | 387 | if (ioc4_dma & IOC4_S_DMA_STOP) |
| 399 | printk(KERN_ERR | 388 | printk(KERN_ERR "%s(%s): IOC4 DMA STOP bit is " |
| 400 | "%s(%s) : IOC4 DMA STOP bit is still 1\n", | 389 | "still 1\n", __func__, drive->name); |
| 401 | __func__, drive->name); | ||
| 402 | } | 390 | } |
| 403 | 391 | ||
| 404 | /* Address of the Scatter Gather List */ | 392 | /* Address of the Scatter Gather List */ |
| @@ -408,20 +396,22 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | |||
| 408 | /* Address of the Ending DMA */ | 396 | /* Address of the Ending DMA */ |
| 409 | memset(ide_get_hwifdata(hwif), 0, IOC4_IDE_CACHELINE_SIZE); | 397 | memset(ide_get_hwifdata(hwif), 0, IOC4_IDE_CACHELINE_SIZE); |
| 410 | ending_dma_addr = cpu_to_le32(hwif->extra_base); | 398 | ending_dma_addr = cpu_to_le32(hwif->extra_base); |
| 411 | writel(ending_dma_addr, (void __iomem *)(dma_base + IOC4_DMA_END_ADDR * 4)); | 399 | writel(ending_dma_addr, (void __iomem *)(dma_base + |
| 400 | IOC4_DMA_END_ADDR * 4)); | ||
| 412 | 401 | ||
| 413 | writel(dma_direction, (void __iomem *)ioc4_dma_addr); | 402 | writel(dma_direction, (void __iomem *)ioc4_dma_addr); |
| 414 | } | 403 | } |
| 415 | 404 | ||
| 416 | /* IOC4 Scatter Gather list Format */ | 405 | /* IOC4 Scatter Gather list Format */ |
| 417 | /* 128 Bit entries to support 64 bit addresses in the future */ | 406 | /* 128 Bit entries to support 64 bit addresses in the future */ |
| 418 | /* The Scatter Gather list Entry should be in the BIG-ENDIAN Format */ | 407 | /* The Scatter Gather list Entry should be in the BIG-ENDIAN Format */ |
| 419 | /* --------------------------------------------------------------------- */ | 408 | /* --------------------------------------------------------------------- */ |
| 420 | /* | Upper 32 bits - Zero | Lower 32 bits- address | */ | 409 | /* | Upper 32 bits - Zero | Lower 32 bits- address | */ |
| 421 | /* --------------------------------------------------------------------- */ | 410 | /* --------------------------------------------------------------------- */ |
| 422 | /* | Upper 32 bits - Zero |EOL| 15 unused | 16 Bit Length| */ | 411 | /* | Upper 32 bits - Zero |EOL| 15 unused | 16 Bit Length| */ |
| 423 | /* --------------------------------------------------------------------- */ | 412 | /* --------------------------------------------------------------------- */ |
| 424 | /* Creates the scatter gather list, DMA Table */ | 413 | /* Creates the scatter gather list, DMA Table */ |
| 414 | |||
| 425 | static int sgiioc4_build_dmatable(ide_drive_t *drive, struct ide_cmd *cmd) | 415 | static int sgiioc4_build_dmatable(ide_drive_t *drive, struct ide_cmd *cmd) |
| 426 | { | 416 | { |
| 427 | ide_hwif_t *hwif = drive->hwif; | 417 | ide_hwif_t *hwif = drive->hwif; |
| @@ -448,8 +438,10 @@ static int sgiioc4_build_dmatable(ide_drive_t *drive, struct ide_cmd *cmd) | |||
| 448 | if (bcount > cur_len) | 438 | if (bcount > cur_len) |
| 449 | bcount = cur_len; | 439 | bcount = cur_len; |
| 450 | 440 | ||
| 451 | /* put the addr, length in | 441 | /* |
| 452 | * the IOC4 dma-table format */ | 442 | * Put the address, length in |
| 443 | * the IOC4 dma-table format | ||
| 444 | */ | ||
| 453 | *table = 0x0; | 445 | *table = 0x0; |
| 454 | table++; | 446 | table++; |
| 455 | *table = cpu_to_be32(cur_addr); | 447 | *table = cpu_to_be32(cur_addr); |
| @@ -540,8 +532,7 @@ static const struct ide_port_info sgiioc4_port_info __devinitconst = { | |||
| 540 | .mwdma_mask = ATA_MWDMA2_ONLY, | 532 | .mwdma_mask = ATA_MWDMA2_ONLY, |
| 541 | }; | 533 | }; |
| 542 | 534 | ||
| 543 | static int __devinit | 535 | static int __devinit sgiioc4_ide_setup_pci_device(struct pci_dev *dev) |
| 544 | sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | ||
| 545 | { | 536 | { |
| 546 | unsigned long cmd_base, irqport; | 537 | unsigned long cmd_base, irqport; |
| 547 | unsigned long bar0, cmd_phys_base, ctl; | 538 | unsigned long bar0, cmd_phys_base, ctl; |
| @@ -549,7 +540,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
| 549 | struct ide_hw hw, *hws[] = { &hw }; | 540 | struct ide_hw hw, *hws[] = { &hw }; |
| 550 | int rc; | 541 | int rc; |
| 551 | 542 | ||
| 552 | /* Get the CmdBlk and CtrlBlk Base Registers */ | 543 | /* Get the CmdBlk and CtrlBlk base registers */ |
| 553 | bar0 = pci_resource_start(dev, 0); | 544 | bar0 = pci_resource_start(dev, 0); |
| 554 | virt_base = pci_ioremap_bar(dev, 0); | 545 | virt_base = pci_ioremap_bar(dev, 0); |
| 555 | if (virt_base == NULL) { | 546 | if (virt_base == NULL) { |
| @@ -557,9 +548,9 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
| 557 | DRV_NAME, bar0); | 548 | DRV_NAME, bar0); |
| 558 | return -ENOMEM; | 549 | return -ENOMEM; |
| 559 | } | 550 | } |
| 560 | cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET; | 551 | cmd_base = (unsigned long)virt_base + IOC4_CMD_OFFSET; |
| 561 | ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET; | 552 | ctl = (unsigned long)virt_base + IOC4_CTRL_OFFSET; |
| 562 | irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET; | 553 | irqport = (unsigned long)virt_base + IOC4_INTR_OFFSET; |
| 563 | 554 | ||
| 564 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; | 555 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; |
| 565 | if (request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | 556 | if (request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, |
| @@ -577,7 +568,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
| 577 | hw.irq = dev->irq; | 568 | hw.irq = dev->irq; |
| 578 | hw.dev = &dev->dev; | 569 | hw.dev = &dev->dev; |
| 579 | 570 | ||
| 580 | /* Initializing chipset IRQ Registers */ | 571 | /* Initialize chipset IRQ registers */ |
| 581 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); | 572 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); |
| 582 | 573 | ||
| 583 | rc = ide_host_add(&sgiioc4_port_info, hws, 1, NULL); | 574 | rc = ide_host_add(&sgiioc4_port_info, hws, 1, NULL); |
| @@ -590,8 +581,7 @@ req_mem_rgn_err: | |||
| 590 | return rc; | 581 | return rc; |
| 591 | } | 582 | } |
| 592 | 583 | ||
| 593 | static unsigned int __devinit | 584 | static unsigned int __devinit pci_init_sgiioc4(struct pci_dev *dev) |
| 594 | pci_init_sgiioc4(struct pci_dev *dev) | ||
| 595 | { | 585 | { |
| 596 | int ret; | 586 | int ret; |
| 597 | 587 | ||
| @@ -611,10 +601,10 @@ out: | |||
| 611 | return ret; | 601 | return ret; |
| 612 | } | 602 | } |
| 613 | 603 | ||
| 614 | int __devinit | 604 | int __devinit ioc4_ide_attach_one(struct ioc4_driver_data *idd) |
| 615 | ioc4_ide_attach_one(struct ioc4_driver_data *idd) | ||
| 616 | { | 605 | { |
| 617 | /* PCI-RT does not bring out IDE connection. | 606 | /* |
| 607 | * PCI-RT does not bring out IDE connection. | ||
| 618 | * Do not attach to this particular IOC4. | 608 | * Do not attach to this particular IOC4. |
| 619 | */ | 609 | */ |
| 620 | if (idd->idd_variant == IOC4_VARIANT_PCI_RT) | 610 | if (idd->idd_variant == IOC4_VARIANT_PCI_RT) |
| @@ -627,7 +617,6 @@ static struct ioc4_submodule __devinitdata ioc4_ide_submodule = { | |||
| 627 | .is_name = "IOC4_ide", | 617 | .is_name = "IOC4_ide", |
| 628 | .is_owner = THIS_MODULE, | 618 | .is_owner = THIS_MODULE, |
| 629 | .is_probe = ioc4_ide_attach_one, | 619 | .is_probe = ioc4_ide_attach_one, |
| 630 | /* .is_remove = ioc4_ide_remove_one, */ | ||
| 631 | }; | 620 | }; |
| 632 | 621 | ||
| 633 | static int __init ioc4_ide_init(void) | 622 | static int __init ioc4_ide_init(void) |
diff --git a/drivers/ide/siimage.c b/drivers/ide/siimage.c index bd82d228608c..d95df528562f 100644 --- a/drivers/ide/siimage.c +++ b/drivers/ide/siimage.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | * smarter code in libata. | 32 | * smarter code in libata. |
| 33 | * | 33 | * |
| 34 | * TODO: | 34 | * TODO: |
| 35 | * - IORDY fixes | ||
| 36 | * - VDMA support | 35 | * - VDMA support |
| 37 | */ | 36 | */ |
| 38 | 37 | ||
| @@ -234,8 +233,7 @@ static u8 sil_sata_udma_filter(ide_drive_t *drive) | |||
| 234 | * @pio: PIO mode number | 233 | * @pio: PIO mode number |
| 235 | * | 234 | * |
| 236 | * Load the timing settings for this device mode into the | 235 | * Load the timing settings for this device mode into the |
| 237 | * controller. If we are in PIO mode 3 or 4 turn on IORDY | 236 | * controller. |
| 238 | * monitoring (bit 9). The TF timing is bits 31:16 | ||
| 239 | */ | 237 | */ |
| 240 | 238 | ||
| 241 | static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) | 239 | static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) |
| @@ -276,13 +274,16 @@ static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) | |||
| 276 | /* now set up IORDY */ | 274 | /* now set up IORDY */ |
| 277 | speedp = sil_ioread16(dev, tfaddr - 2); | 275 | speedp = sil_ioread16(dev, tfaddr - 2); |
| 278 | speedp &= ~0x200; | 276 | speedp &= ~0x200; |
| 279 | if (pio > 2) | ||
| 280 | speedp |= 0x200; | ||
| 281 | sil_iowrite16(dev, speedp, tfaddr - 2); | ||
| 282 | 277 | ||
| 283 | mode = sil_ioread8(dev, base + addr_mask); | 278 | mode = sil_ioread8(dev, base + addr_mask); |
| 284 | mode &= ~(unit ? 0x30 : 0x03); | 279 | mode &= ~(unit ? 0x30 : 0x03); |
| 285 | mode |= unit ? 0x10 : 0x01; | 280 | |
| 281 | if (ide_pio_need_iordy(drive, pio)) { | ||
| 282 | speedp |= 0x200; | ||
| 283 | mode |= unit ? 0x10 : 0x01; | ||
| 284 | } | ||
| 285 | |||
| 286 | sil_iowrite16(dev, speedp, tfaddr - 2); | ||
| 286 | sil_iowrite8(dev, mode, base + addr_mask); | 287 | sil_iowrite8(dev, mode, base + addr_mask); |
| 287 | } | 288 | } |
| 288 | 289 | ||
| @@ -337,24 +338,14 @@ static void sil_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 337 | sil_iowrite16(dev, ultra, ua); | 338 | sil_iowrite16(dev, ultra, ua); |
| 338 | } | 339 | } |
| 339 | 340 | ||
| 340 | /* returns 1 if dma irq issued, 0 otherwise */ | 341 | static int sil_test_irq(ide_hwif_t *hwif) |
| 341 | static int siimage_io_dma_test_irq(ide_drive_t *drive) | ||
| 342 | { | 342 | { |
| 343 | ide_hwif_t *hwif = drive->hwif; | ||
| 344 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 343 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 345 | u8 dma_altstat = 0; | ||
| 346 | unsigned long addr = siimage_selreg(hwif, 1); | 344 | unsigned long addr = siimage_selreg(hwif, 1); |
| 345 | u8 val = sil_ioread8(dev, addr); | ||
| 347 | 346 | ||
| 348 | /* return 1 if INTR asserted */ | 347 | /* Return 1 if INTRQ asserted */ |
| 349 | if (inb(hwif->dma_base + ATA_DMA_STATUS) & 4) | 348 | return (val & 8) ? 1 : 0; |
| 350 | return 1; | ||
| 351 | |||
| 352 | /* return 1 if Device INTR asserted */ | ||
| 353 | pci_read_config_byte(dev, addr, &dma_altstat); | ||
| 354 | if (dma_altstat & 8) | ||
| 355 | return 0; /* return 1; */ | ||
| 356 | |||
| 357 | return 0; | ||
| 358 | } | 349 | } |
| 359 | 350 | ||
| 360 | /** | 351 | /** |
| @@ -368,7 +359,6 @@ static int siimage_io_dma_test_irq(ide_drive_t *drive) | |||
| 368 | static int siimage_mmio_dma_test_irq(ide_drive_t *drive) | 359 | static int siimage_mmio_dma_test_irq(ide_drive_t *drive) |
| 369 | { | 360 | { |
| 370 | ide_hwif_t *hwif = drive->hwif; | 361 | ide_hwif_t *hwif = drive->hwif; |
| 371 | unsigned long addr = siimage_selreg(hwif, 0x1); | ||
| 372 | void __iomem *sata_error_addr | 362 | void __iomem *sata_error_addr |
| 373 | = (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET]; | 363 | = (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET]; |
| 374 | 364 | ||
| @@ -397,10 +387,6 @@ static int siimage_mmio_dma_test_irq(ide_drive_t *drive) | |||
| 397 | if (readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)) & 4) | 387 | if (readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)) & 4) |
| 398 | return 1; | 388 | return 1; |
| 399 | 389 | ||
| 400 | /* return 1 if Device INTR asserted */ | ||
| 401 | if (readb((void __iomem *)addr) & 8) | ||
| 402 | return 0; /* return 1; */ | ||
| 403 | |||
| 404 | return 0; | 390 | return 0; |
| 405 | } | 391 | } |
| 406 | 392 | ||
| @@ -409,7 +395,7 @@ static int siimage_dma_test_irq(ide_drive_t *drive) | |||
| 409 | if (drive->hwif->host_flags & IDE_HFLAG_MMIO) | 395 | if (drive->hwif->host_flags & IDE_HFLAG_MMIO) |
| 410 | return siimage_mmio_dma_test_irq(drive); | 396 | return siimage_mmio_dma_test_irq(drive); |
| 411 | else | 397 | else |
| 412 | return siimage_io_dma_test_irq(drive); | 398 | return ide_dma_test_irq(drive); |
| 413 | } | 399 | } |
| 414 | 400 | ||
| 415 | /** | 401 | /** |
| @@ -694,6 +680,7 @@ static const struct ide_port_ops sil_pata_port_ops = { | |||
| 694 | .set_pio_mode = sil_set_pio_mode, | 680 | .set_pio_mode = sil_set_pio_mode, |
| 695 | .set_dma_mode = sil_set_dma_mode, | 681 | .set_dma_mode = sil_set_dma_mode, |
| 696 | .quirkproc = sil_quirkproc, | 682 | .quirkproc = sil_quirkproc, |
| 683 | .test_irq = sil_test_irq, | ||
| 697 | .udma_filter = sil_pata_udma_filter, | 684 | .udma_filter = sil_pata_udma_filter, |
| 698 | .cable_detect = sil_cable_detect, | 685 | .cable_detect = sil_cable_detect, |
| 699 | }; | 686 | }; |
| @@ -704,6 +691,7 @@ static const struct ide_port_ops sil_sata_port_ops = { | |||
| 704 | .reset_poll = sil_sata_reset_poll, | 691 | .reset_poll = sil_sata_reset_poll, |
| 705 | .pre_reset = sil_sata_pre_reset, | 692 | .pre_reset = sil_sata_pre_reset, |
| 706 | .quirkproc = sil_quirkproc, | 693 | .quirkproc = sil_quirkproc, |
| 694 | .test_irq = sil_test_irq, | ||
| 707 | .udma_filter = sil_sata_udma_filter, | 695 | .udma_filter = sil_sata_udma_filter, |
| 708 | .cable_detect = sil_cable_detect, | 696 | .cable_detect = sil_cable_detect, |
| 709 | }; | 697 | }; |
diff --git a/drivers/ide/sl82c105.c b/drivers/ide/sl82c105.c index 0924abff52ff..d698da470d6f 100644 --- a/drivers/ide/sl82c105.c +++ b/drivers/ide/sl82c105.c | |||
| @@ -61,8 +61,7 @@ static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio) | |||
| 61 | if (cmd_off == 0) | 61 | if (cmd_off == 0) |
| 62 | cmd_off = 1; | 62 | cmd_off = 1; |
| 63 | 63 | ||
| 64 | if ((pio > 2 || ata_id_has_iordy(drive->id)) && | 64 | if (ide_pio_need_iordy(drive, pio)) |
| 65 | !(pio > 4 && ata_id_is_cfa(drive->id))) | ||
| 66 | iordy = 0x40; | 65 | iordy = 0x40; |
| 67 | 66 | ||
| 68 | return (cmd_on - 1) << 8 | (cmd_off - 1) | iordy; | 67 | return (cmd_on - 1) << 8 | (cmd_off - 1) | iordy; |
| @@ -74,6 +73,7 @@ static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio) | |||
| 74 | static void sl82c105_set_pio_mode(ide_drive_t *drive, const u8 pio) | 73 | static void sl82c105_set_pio_mode(ide_drive_t *drive, const u8 pio) |
| 75 | { | 74 | { |
| 76 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); | 75 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); |
| 76 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 77 | int reg = 0x44 + drive->dn * 4; | 77 | int reg = 0x44 + drive->dn * 4; |
| 78 | u16 drv_ctrl; | 78 | u16 drv_ctrl; |
| 79 | 79 | ||
| @@ -83,8 +83,9 @@ static void sl82c105_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 83 | * Store the PIO timings so that we can restore them | 83 | * Store the PIO timings so that we can restore them |
| 84 | * in case DMA will be turned off... | 84 | * in case DMA will be turned off... |
| 85 | */ | 85 | */ |
| 86 | drive->drive_data &= 0xffff0000; | 86 | timings &= 0xffff0000; |
| 87 | drive->drive_data |= drv_ctrl; | 87 | timings |= drv_ctrl; |
| 88 | ide_set_drivedata(drive, (void *)timings); | ||
| 88 | 89 | ||
| 89 | pci_write_config_word(dev, reg, drv_ctrl); | 90 | pci_write_config_word(dev, reg, drv_ctrl); |
| 90 | pci_read_config_word (dev, reg, &drv_ctrl); | 91 | pci_read_config_word (dev, reg, &drv_ctrl); |
| @@ -100,6 +101,7 @@ static void sl82c105_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 100 | static void sl82c105_set_dma_mode(ide_drive_t *drive, const u8 speed) | 101 | static void sl82c105_set_dma_mode(ide_drive_t *drive, const u8 speed) |
| 101 | { | 102 | { |
| 102 | static u16 mwdma_timings[] = {0x0707, 0x0201, 0x0200}; | 103 | static u16 mwdma_timings[] = {0x0707, 0x0201, 0x0200}; |
| 104 | unsigned long timings = (unsigned long)ide_get_drivedata(drive); | ||
| 103 | u16 drv_ctrl; | 105 | u16 drv_ctrl; |
| 104 | 106 | ||
| 105 | DBG(("sl82c105_tune_chipset(drive:%s, speed:%s)\n", | 107 | DBG(("sl82c105_tune_chipset(drive:%s, speed:%s)\n", |
| @@ -111,8 +113,19 @@ static void sl82c105_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 111 | * Store the DMA timings so that we can actually program | 113 | * Store the DMA timings so that we can actually program |
| 112 | * them when DMA will be turned on... | 114 | * them when DMA will be turned on... |
| 113 | */ | 115 | */ |
| 114 | drive->drive_data &= 0x0000ffff; | 116 | timings &= 0x0000ffff; |
| 115 | drive->drive_data |= (unsigned long)drv_ctrl << 16; | 117 | timings |= (unsigned long)drv_ctrl << 16; |
| 118 | ide_set_drivedata(drive, (void *)timings); | ||
| 119 | } | ||
| 120 | |||
| 121 | static int sl82c105_test_irq(ide_hwif_t *hwif) | ||
| 122 | { | ||
| 123 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
| 124 | u32 val, mask = hwif->channel ? CTRL_IDE_IRQB : CTRL_IDE_IRQA; | ||
| 125 | |||
| 126 | pci_read_config_dword(dev, 0x40, &val); | ||
| 127 | |||
| 128 | return (val & mask) ? 1 : 0; | ||
| 116 | } | 129 | } |
| 117 | 130 | ||
| 118 | /* | 131 | /* |
| @@ -185,7 +198,8 @@ static void sl82c105_dma_start(ide_drive_t *drive) | |||
| 185 | 198 | ||
| 186 | DBG(("%s(drive:%s)\n", __func__, drive->name)); | 199 | DBG(("%s(drive:%s)\n", __func__, drive->name)); |
| 187 | 200 | ||
| 188 | pci_write_config_word(dev, reg, drive->drive_data >> 16); | 201 | pci_write_config_word(dev, reg, |
| 202 | (unsigned long)ide_get_drivedata(drive) >> 16); | ||
| 189 | 203 | ||
| 190 | sl82c105_reset_host(dev); | 204 | sl82c105_reset_host(dev); |
| 191 | ide_dma_start(drive); | 205 | ide_dma_start(drive); |
| @@ -210,7 +224,8 @@ static int sl82c105_dma_end(ide_drive_t *drive) | |||
| 210 | 224 | ||
| 211 | ret = ide_dma_end(drive); | 225 | ret = ide_dma_end(drive); |
| 212 | 226 | ||
| 213 | pci_write_config_word(dev, reg, drive->drive_data); | 227 | pci_write_config_word(dev, reg, |
| 228 | (unsigned long)ide_get_drivedata(drive)); | ||
| 214 | 229 | ||
| 215 | return ret; | 230 | return ret; |
| 216 | } | 231 | } |
| @@ -289,6 +304,7 @@ static const struct ide_port_ops sl82c105_port_ops = { | |||
| 289 | .set_pio_mode = sl82c105_set_pio_mode, | 304 | .set_pio_mode = sl82c105_set_pio_mode, |
| 290 | .set_dma_mode = sl82c105_set_dma_mode, | 305 | .set_dma_mode = sl82c105_set_dma_mode, |
| 291 | .resetproc = sl82c105_resetproc, | 306 | .resetproc = sl82c105_resetproc, |
| 307 | .test_irq = sl82c105_test_irq, | ||
| 292 | }; | 308 | }; |
| 293 | 309 | ||
| 294 | static const struct ide_dma_ops sl82c105_dma_ops = { | 310 | static const struct ide_dma_ops sl82c105_dma_ops = { |
diff --git a/drivers/ide/slc90e66.c b/drivers/ide/slc90e66.c index f55d7d6313e8..9aec78d3bcff 100644 --- a/drivers/ide/slc90e66.c +++ b/drivers/ide/slc90e66.c | |||
| @@ -44,7 +44,7 @@ static void slc90e66_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 44 | control |= 1; /* Programmable timing on */ | 44 | control |= 1; /* Programmable timing on */ |
| 45 | if (drive->media == ide_disk) | 45 | if (drive->media == ide_disk) |
| 46 | control |= 4; /* Prefetch, post write */ | 46 | control |= 4; /* Prefetch, post write */ |
| 47 | if (pio > 2) | 47 | if (ide_pio_need_iordy(drive, pio)) |
| 48 | control |= 2; /* IORDY */ | 48 | control |= 2; /* IORDY */ |
| 49 | if (is_slave) { | 49 | if (is_slave) { |
| 50 | master_data |= 0x4000; | 50 | master_data |= 0x4000; |
