aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-10-13 15:39:36 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-10-13 15:39:36 -0400
commit97100fc816badbbc162644cfde7ad39ae9211fb4 (patch)
tree904faf5453c2dea32fa3fde5fda230118f3effda
parentbe3c096ebdbe3c828aacb5473751a22840753eff (diff)
ide: add device flags
Add 'unsigned long dev_flags' to ide_drive_t and convert bitfields to IDE_DFLAG_* flags. While at it: - IDE_DFLAG_ADDRESSING -> IDE_DFLAG_LBA48 - fixup some comments - remove needless g->flags zeroing from ide*_probe() There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r--drivers/ide/ide-acpi.c12
-rw-r--r--drivers/ide/ide-atapi.c21
-rw-r--r--drivers/ide/ide-cd.c17
-rw-r--r--drivers/ide/ide-disk.c94
-rw-r--r--drivers/ide/ide-dma.c7
-rw-r--r--drivers/ide/ide-floppy.c9
-rw-r--r--drivers/ide/ide-io.c55
-rw-r--r--drivers/ide/ide-ioctls.c21
-rw-r--r--drivers/ide/ide-iops.c24
-rw-r--r--drivers/ide/ide-lib.c2
-rw-r--r--drivers/ide/ide-probe.c104
-rw-r--r--drivers/ide/ide-proc.c6
-rw-r--r--drivers/ide/ide-tape.c30
-rw-r--r--drivers/ide/ide-taskfile.c14
-rw-r--r--drivers/ide/ide.c35
-rw-r--r--drivers/ide/legacy/ht6560b.c9
-rw-r--r--drivers/ide/pci/amd74xx.c2
-rw-r--r--drivers/ide/pci/cmd640.c14
-rw-r--r--drivers/ide/pci/it821x.c2
-rw-r--r--drivers/ide/pci/ns87415.c11
-rw-r--r--drivers/ide/pci/pdc202xx_old.c4
-rw-r--r--drivers/ide/pci/sc1200.c3
-rw-r--r--drivers/ide/pci/trm290.c4
-rw-r--r--drivers/ide/ppc/pmac.c4
-rw-r--r--drivers/scsi/ide-scsi.c9
-rw-r--r--include/linux/ide.h100
26 files changed, 370 insertions, 243 deletions
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
index 2427c380b3dc..244a8a052ce8 100644
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -290,7 +290,7 @@ static int do_drive_get_GTF(ide_drive_t *drive,
290 DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n", 290 DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
291 hwif->name, dev->bus_id, port, hwif->channel); 291 hwif->name, dev->bus_id, port, hwif->channel);
292 292
293 if (!drive->present) { 293 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) {
294 DEBPRINT("%s drive %d:%d not present\n", 294 DEBPRINT("%s drive %d:%d not present\n",
295 hwif->name, hwif->channel, port); 295 hwif->name, hwif->channel, port);
296 goto out; 296 goto out;
@@ -420,8 +420,9 @@ static int do_drive_set_taskfiles(ide_drive_t *drive,
420 420
421 DEBPRINT("ENTER: %s, hard_port#: %d\n", drive->name, drive->dn); 421 DEBPRINT("ENTER: %s, hard_port#: %d\n", drive->name, drive->dn);
422 422
423 if (!drive->present) 423 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
424 goto out; 424 goto out;
425
425 if (!gtf_count) /* shouldn't be here */ 426 if (!gtf_count) /* shouldn't be here */
426 goto out; 427 goto out;
427 428
@@ -660,7 +661,8 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on)
660 if (!drive->acpidata->obj_handle) 661 if (!drive->acpidata->obj_handle)
661 drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive); 662 drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive);
662 663
663 if (drive->acpidata->obj_handle && drive->present) { 664 if (drive->acpidata->obj_handle &&
665 (drive->dev_flags & IDE_DFLAG_PRESENT)) {
664 acpi_bus_set_power(drive->acpidata->obj_handle, 666 acpi_bus_set_power(drive->acpidata->obj_handle,
665 on? ACPI_STATE_D0: ACPI_STATE_D3); 667 on? ACPI_STATE_D0: ACPI_STATE_D3);
666 } 668 }
@@ -720,7 +722,7 @@ void ide_acpi_port_init_devices(ide_hwif_t *hwif)
720 722
721 memset(drive->acpidata, 0, sizeof(*drive->acpidata)); 723 memset(drive->acpidata, 0, sizeof(*drive->acpidata));
722 724
723 if (!drive->present) 725 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
724 continue; 726 continue;
725 727
726 err = taskfile_lib_get_identify(drive, drive->acpidata->idbuff); 728 err = taskfile_lib_get_identify(drive, drive->acpidata->idbuff);
@@ -745,7 +747,7 @@ void ide_acpi_port_init_devices(ide_hwif_t *hwif)
745 for (i = 0; i < MAX_DRIVES; i++) { 747 for (i = 0; i < MAX_DRIVES; i++) {
746 drive = &hwif->drives[i]; 748 drive = &hwif->drives[i];
747 749
748 if (drive->present) 750 if (drive->dev_flags & IDE_DFLAG_PRESENT)
749 /* Execute ACPI startup code */ 751 /* Execute ACPI startup code */
750 ide_acpi_exec_tfs(drive); 752 ide_acpi_exec_tfs(drive);
751 } 753 }
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c
index 2521677e1f48..a1d8c3557a42 100644
--- a/drivers/ide/ide-atapi.c
+++ b/drivers/ide/ide-atapi.c
@@ -261,7 +261,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
261 ide_expiry_t *expiry; 261 ide_expiry_t *expiry;
262 unsigned int timeout, temp; 262 unsigned int timeout, temp;
263 u16 bcount; 263 u16 bcount;
264 u8 stat, ireason, scsi = drive->scsi, dsc = 0; 264 u8 stat, ireason, scsi = !!(drive->dev_flags & IDE_DFLAG_SCSI), dsc = 0;
265 265
266 debug_log("Enter %s - interrupt handler\n", __func__); 266 debug_log("Enter %s - interrupt handler\n", __func__);
267 267
@@ -494,7 +494,8 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
494 } 494 }
495 495
496 ireason = ide_read_ireason(drive); 496 ireason = ide_read_ireason(drive);
497 if (drive->media == ide_tape && !drive->scsi) 497 if (drive->media == ide_tape &&
498 (drive->dev_flags & IDE_DFLAG_SCSI) == 0)
498 ireason = ide_wait_ireason(drive, ireason); 499 ireason = ide_wait_ireason(drive, ireason);
499 500
500 if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) { 501 if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) {
@@ -512,7 +513,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
512 timeout = drive->pc_delay; 513 timeout = drive->pc_delay;
513 expiry = &ide_delayed_transfer_pc; 514 expiry = &ide_delayed_transfer_pc;
514 } else { 515 } else {
515 if (drive->scsi) { 516 if (drive->dev_flags & IDE_DFLAG_SCSI) {
516 timeout = ide_scsi_get_timeout(pc); 517 timeout = ide_scsi_get_timeout(pc);
517 expiry = ide_scsi_expiry; 518 expiry = ide_scsi_expiry;
518 } else { 519 } else {
@@ -544,14 +545,14 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout,
544 struct ide_atapi_pc *pc = drive->pc; 545 struct ide_atapi_pc *pc = drive->pc;
545 ide_hwif_t *hwif = drive->hwif; 546 ide_hwif_t *hwif = drive->hwif;
546 u16 bcount; 547 u16 bcount;
547 u8 dma = 0; 548 u8 dma = 0, scsi = !!(drive->dev_flags & IDE_DFLAG_SCSI);
548 549
549 /* We haven't transferred any data yet */ 550 /* We haven't transferred any data yet */
550 pc->xferred = 0; 551 pc->xferred = 0;
551 pc->cur_pos = pc->buf; 552 pc->cur_pos = pc->buf;
552 553
553 /* Request to transfer the entire buffer at once */ 554 /* Request to transfer the entire buffer at once */
554 if (drive->media == ide_tape && !drive->scsi) 555 if (drive->media == ide_tape && scsi == 0)
555 bcount = pc->req_xfer; 556 bcount = pc->req_xfer;
556 else 557 else
557 bcount = min(pc->req_xfer, 63 * 1024); 558 bcount = min(pc->req_xfer, 63 * 1024);
@@ -561,19 +562,19 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout,
561 ide_dma_off(drive); 562 ide_dma_off(drive);
562 } 563 }
563 564
564 if ((pc->flags & PC_FLAG_DMA_OK) && drive->using_dma) { 565 if ((pc->flags & PC_FLAG_DMA_OK) &&
565 if (drive->scsi) 566 (drive->dev_flags & IDE_DFLAG_USING_DMA)) {
567 if (scsi)
566 hwif->sg_mapped = 1; 568 hwif->sg_mapped = 1;
567 dma = !hwif->dma_ops->dma_setup(drive); 569 dma = !hwif->dma_ops->dma_setup(drive);
568 if (drive->scsi) 570 if (scsi)
569 hwif->sg_mapped = 0; 571 hwif->sg_mapped = 0;
570 } 572 }
571 573
572 if (!dma) 574 if (!dma)
573 pc->flags &= ~PC_FLAG_DMA_OK; 575 pc->flags &= ~PC_FLAG_DMA_OK;
574 576
575 ide_pktcmd_tf_load(drive, drive->scsi ? 0 : IDE_TFLAG_OUT_DEVICE, 577 ide_pktcmd_tf_load(drive, scsi ? 0 : IDE_TFLAG_OUT_DEVICE, bcount, dma);
576 bcount, dma);
577 578
578 /* Issue the packet command */ 579 /* Issue the packet command */
579 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) { 580 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 8650ad43b324..ea7cd4e0b157 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -741,7 +741,7 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive)
741 741
742 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) { 742 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
743 if (--retry == 0) 743 if (--retry == 0)
744 drive->dsc_overlap = 0; 744 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
745 } 745 }
746 return ide_stopped; 746 return ide_stopped;
747} 747}
@@ -1129,7 +1129,7 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)
1129 } 1129 }
1130 cd->dma = 0; 1130 cd->dma = 0;
1131 } else 1131 } else
1132 cd->dma = drive->using_dma; 1132 cd->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
1133 1133
1134 if (write) 1134 if (write)
1135 cd->devinfo.media_written = 1; 1135 cd->devinfo.media_written = 1;
@@ -1166,7 +1166,7 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1166 else 1166 else
1167 buf = rq->data; 1167 buf = rq->data;
1168 1168
1169 info->dma = drive->using_dma; 1169 info->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
1170 1170
1171 /* 1171 /*
1172 * check if dma is safe 1172 * check if dma is safe
@@ -1211,7 +1211,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
1211 if (rq_data_dir(rq) == READ && 1211 if (rq_data_dir(rq) == READ &&
1212 IDE_LARGE_SEEK(info->last_block, block, 1212 IDE_LARGE_SEEK(info->last_block, block,
1213 IDECD_SEEK_THRESHOLD) && 1213 IDECD_SEEK_THRESHOLD) &&
1214 drive->dsc_overlap) { 1214 (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP)) {
1215 xferlen = 0; 1215 xferlen = 0;
1216 fn = cdrom_start_seek_continuation; 1216 fn = cdrom_start_seek_continuation;
1217 1217
@@ -1804,7 +1804,7 @@ static ide_proc_entry_t idecd_proc[] = {
1804 { NULL, 0, NULL, NULL } 1804 { NULL, 0, NULL, NULL }
1805}; 1805};
1806 1806
1807ide_devset_rw_field(dsc_overlap, dsc_overlap); 1807ide_devset_rw_flag(dsc_overlap, IDE_DFLAG_DSC_OVERLAP);
1808 1808
1809static const struct ide_proc_devset idecd_settings[] = { 1809static const struct ide_proc_devset idecd_settings[] = {
1810 IDE_PROC_DEVSET(dsc_overlap, 0, 1), 1810 IDE_PROC_DEVSET(dsc_overlap, 0, 1),
@@ -1910,7 +1910,10 @@ static int ide_cdrom_setup(ide_drive_t *drive)
1910 /* set correct block size */ 1910 /* set correct block size */
1911 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE); 1911 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
1912 1912
1913 drive->dsc_overlap = (drive->next != drive); 1913 if (drive->next != drive)
1914 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
1915 else
1916 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1914 1917
1915 if (ide_cdrom_register(drive, nslots)) { 1918 if (ide_cdrom_register(drive, nslots)) {
1916 printk(KERN_ERR "%s: %s failed to register device with the" 1919 printk(KERN_ERR "%s: %s failed to register device with the"
@@ -1944,7 +1947,7 @@ static void ide_cd_release(struct kref *kref)
1944 kfree(info->toc); 1947 kfree(info->toc);
1945 if (devinfo->handle == drive) 1948 if (devinfo->handle == drive)
1946 unregister_cdrom(devinfo); 1949 unregister_cdrom(devinfo);
1947 drive->dsc_overlap = 0; 1950 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1948 drive->driver_data = NULL; 1951 drive->driver_data = NULL;
1949 blk_queue_prep_rq(drive->queue, NULL); 1952 blk_queue_prep_rq(drive->queue, NULL);
1950 g->private_data = NULL; 1953 g->private_data = NULL;
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 7ea075299bd9..7ee2c9d2e5c2 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -140,9 +140,9 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
140 sector_t block) 140 sector_t block)
141{ 141{
142 ide_hwif_t *hwif = HWIF(drive); 142 ide_hwif_t *hwif = HWIF(drive);
143 unsigned int dma = drive->using_dma;
144 u16 nsectors = (u16)rq->nr_sectors; 143 u16 nsectors = (u16)rq->nr_sectors;
145 u8 lba48 = (drive->addressing == 1) ? 1 : 0; 144 u8 lba48 = !!(drive->dev_flags & IDE_DFLAG_LBA48);
145 u8 dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
146 ide_task_t task; 146 ide_task_t task;
147 struct ide_taskfile *tf = &task.tf; 147 struct ide_taskfile *tf = &task.tf;
148 ide_startstop_t rc; 148 ide_startstop_t rc;
@@ -237,7 +237,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
237{ 237{
238 ide_hwif_t *hwif = HWIF(drive); 238 ide_hwif_t *hwif = HWIF(drive);
239 239
240 BUG_ON(drive->blocked); 240 BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED);
241 241
242 if (!blk_fs_request(rq)) { 242 if (!blk_fs_request(rq)) {
243 blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command"); 243 blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command");
@@ -452,7 +452,7 @@ static int proc_idedisk_read_cache
452 char *out = page; 452 char *out = page;
453 int len; 453 int len;
454 454
455 if (drive->id_read) 455 if (drive->dev_flags & IDE_DFLAG_ID_READ)
456 len = sprintf(out, "%i\n", drive->id[ATA_ID_BUF_SIZE] / 2); 456 len = sprintf(out, "%i\n", drive->id[ATA_ID_BUF_SIZE] / 2);
457 else 457 else
458 len = sprintf(out, "(none)\n"); 458 len = sprintf(out, "(none)\n");
@@ -568,15 +568,20 @@ static int set_multcount(ide_drive_t *drive, int arg)
568 return (drive->mult_count == arg) ? 0 : -EIO; 568 return (drive->mult_count == arg) ? 0 : -EIO;
569} 569}
570 570
571ide_devset_get(nowerr, nowerr); 571ide_devset_get_flag(nowerr, IDE_DFLAG_NOWERR);
572 572
573static int set_nowerr(ide_drive_t *drive, int arg) 573static int set_nowerr(ide_drive_t *drive, int arg)
574{ 574{
575 if (arg < 0 || arg > 1) 575 if (arg < 0 || arg > 1)
576 return -EINVAL; 576 return -EINVAL;
577 577
578 drive->nowerr = arg; 578 if (arg)
579 drive->dev_flags |= IDE_DFLAG_NOWERR;
580 else
581 drive->dev_flags &= ~IDE_DFLAG_NOWERR;
582
579 drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT; 583 drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
584
580 return 0; 585 return 0;
581} 586}
582 587
@@ -599,7 +604,7 @@ static void update_ordered(ide_drive_t *drive)
599 unsigned ordered = QUEUE_ORDERED_NONE; 604 unsigned ordered = QUEUE_ORDERED_NONE;
600 prepare_flush_fn *prep_fn = NULL; 605 prepare_flush_fn *prep_fn = NULL;
601 606
602 if (drive->wcache) { 607 if (drive->dev_flags & IDE_DFLAG_WCACHE) {
603 unsigned long long capacity; 608 unsigned long long capacity;
604 int barrier; 609 int barrier;
605 /* 610 /*
@@ -611,8 +616,10 @@ static void update_ordered(ide_drive_t *drive)
611 * not available so we don't need to recheck that. 616 * not available so we don't need to recheck that.
612 */ 617 */
613 capacity = idedisk_capacity(drive); 618 capacity = idedisk_capacity(drive);
614 barrier = ata_id_flush_enabled(id) && !drive->noflush && 619 barrier = ata_id_flush_enabled(id) &&
615 (drive->addressing == 0 || capacity <= (1ULL << 28) || 620 (drive->dev_flags & IDE_DFLAG_NOFLUSH) == 0 &&
621 ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 ||
622 capacity <= (1ULL << 28) ||
616 ata_id_flush_ext_enabled(id)); 623 ata_id_flush_ext_enabled(id));
617 624
618 printk(KERN_INFO "%s: cache flushes %ssupported\n", 625 printk(KERN_INFO "%s: cache flushes %ssupported\n",
@@ -628,7 +635,7 @@ static void update_ordered(ide_drive_t *drive)
628 blk_queue_ordered(drive->queue, ordered, prep_fn); 635 blk_queue_ordered(drive->queue, ordered, prep_fn);
629} 636}
630 637
631ide_devset_get(wcache, wcache); 638ide_devset_get_flag(wcache, IDE_DFLAG_WCACHE);
632 639
633static int set_wcache(ide_drive_t *drive, int arg) 640static int set_wcache(ide_drive_t *drive, int arg)
634{ 641{
@@ -640,8 +647,12 @@ static int set_wcache(ide_drive_t *drive, int arg)
640 if (ata_id_flush_enabled(drive->id)) { 647 if (ata_id_flush_enabled(drive->id)) {
641 err = ide_do_setfeature(drive, 648 err = ide_do_setfeature(drive,
642 arg ? SETFEATURES_WC_ON : SETFEATURES_WC_OFF, 0); 649 arg ? SETFEATURES_WC_ON : SETFEATURES_WC_OFF, 0);
643 if (err == 0) 650 if (err == 0) {
644 drive->wcache = arg; 651 if (arg)
652 drive->dev_flags |= IDE_DFLAG_WCACHE;
653 else
654 drive->dev_flags &= ~IDE_DFLAG_WCACHE;
655 }
645 } 656 }
646 657
647 update_ordered(drive); 658 update_ordered(drive);
@@ -677,7 +688,7 @@ static int set_acoustic(ide_drive_t *drive, int arg)
677 return 0; 688 return 0;
678} 689}
679 690
680ide_devset_get(addressing, addressing); 691ide_devset_get_flag(addressing, IDE_DFLAG_LBA48);
681 692
682/* 693/*
683 * drive->addressing: 694 * drive->addressing:
@@ -697,7 +708,10 @@ static int set_addressing(ide_drive_t *drive, int arg)
697 if (arg == 2) 708 if (arg == 2)
698 arg = 0; 709 arg = 0;
699 710
700 drive->addressing = arg; 711 if (arg)
712 drive->dev_flags |= IDE_DFLAG_LBA48;
713 else
714 drive->dev_flags &= ~IDE_DFLAG_LBA48;
701 715
702 return 0; 716 return 0;
703} 717}
@@ -743,20 +757,20 @@ static void idedisk_setup(ide_drive_t *drive)
743 757
744 ide_proc_register_driver(drive, idkp->driver); 758 ide_proc_register_driver(drive, idkp->driver);
745 759
746 if (drive->id_read == 0) 760 if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0)
747 return; 761 return;
748 762
749 if (drive->removable) { 763 if (drive->dev_flags & IDE_DFLAG_REMOVABLE) {
750 /* 764 /*
751 * Removable disks (eg. SYQUEST); ignore 'WD' drives 765 * Removable disks (eg. SYQUEST); ignore 'WD' drives
752 */ 766 */
753 if (m[0] != 'W' || m[1] != 'D') 767 if (m[0] != 'W' || m[1] != 'D')
754 drive->doorlocking = 1; 768 drive->dev_flags |= IDE_DFLAG_DOORLOCKING;
755 } 769 }
756 770
757 (void)set_addressing(drive, 1); 771 (void)set_addressing(drive, 1);
758 772
759 if (drive->addressing == 1) { 773 if (drive->dev_flags & IDE_DFLAG_LBA48) {
760 int max_s = 2048; 774 int max_s = 2048;
761 775
762 if (max_s > hwif->rqsize) 776 if (max_s > hwif->rqsize)
@@ -772,7 +786,8 @@ static void idedisk_setup(ide_drive_t *drive)
772 init_idedisk_capacity(drive); 786 init_idedisk_capacity(drive);
773 787
774 /* limit drive capacity to 137GB if LBA48 cannot be used */ 788 /* limit drive capacity to 137GB if LBA48 cannot be used */
775 if (drive->addressing == 0 && drive->capacity64 > 1ULL << 28) { 789 if ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 &&
790 drive->capacity64 > 1ULL << 28) {
776 printk(KERN_WARNING "%s: cannot use LBA48 - full capacity " 791 printk(KERN_WARNING "%s: cannot use LBA48 - full capacity "
777 "%llu sectors (%llu MB)\n", 792 "%llu sectors (%llu MB)\n",
778 drive->name, (unsigned long long)drive->capacity64, 793 drive->name, (unsigned long long)drive->capacity64,
@@ -780,13 +795,14 @@ static void idedisk_setup(ide_drive_t *drive)
780 drive->capacity64 = 1ULL << 28; 795 drive->capacity64 = 1ULL << 28;
781 } 796 }
782 797
783 if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && drive->addressing) { 798 if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) &&
799 (drive->dev_flags & IDE_DFLAG_LBA48)) {
784 if (drive->capacity64 > 1ULL << 28) { 800 if (drive->capacity64 > 1ULL << 28) {
785 printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode" 801 printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode"
786 " will be used for accessing sectors " 802 " will be used for accessing sectors "
787 "> %u\n", drive->name, 1 << 28); 803 "> %u\n", drive->name, 1 << 28);
788 } else 804 } else
789 drive->addressing = 0; 805 drive->dev_flags &= ~IDE_DFLAG_LBA48;
790 } 806 }
791 807
792 /* 808 /*
@@ -795,7 +811,7 @@ static void idedisk_setup(ide_drive_t *drive)
795 */ 811 */
796 capacity = idedisk_capacity(drive); 812 capacity = idedisk_capacity(drive);
797 813
798 if (!drive->forced_geom) { 814 if ((drive->dev_flags & IDE_DFLAG_FORCED_GEOM) == 0) {
799 if (ata_id_lba48_enabled(drive->id)) { 815 if (ata_id_lba48_enabled(drive->id)) {
800 /* compatibility */ 816 /* compatibility */
801 drive->bios_sect = 63; 817 drive->bios_sect = 63;
@@ -830,14 +846,15 @@ static void idedisk_setup(ide_drive_t *drive)
830 846
831 /* write cache enabled? */ 847 /* write cache enabled? */
832 if ((id[ATA_ID_CSFO] & 1) || ata_id_wcache_enabled(id)) 848 if ((id[ATA_ID_CSFO] & 1) || ata_id_wcache_enabled(id))
833 drive->wcache = 1; 849 drive->dev_flags |= IDE_DFLAG_WCACHE;
834 850
835 set_wcache(drive, 1); 851 set_wcache(drive, 1);
836} 852}
837 853
838static void ide_cacheflush_p(ide_drive_t *drive) 854static void ide_cacheflush_p(ide_drive_t *drive)
839{ 855{
840 if (!drive->wcache || ata_id_flush_enabled(drive->id) == 0) 856 if (ata_id_flush_enabled(drive->id) == 0 ||
857 (drive->dev_flags & IDE_DFLAG_WCACHE) == 0)
841 return; 858 return;
842 859
843 if (do_idedisk_flushcache(drive)) 860 if (do_idedisk_flushcache(drive))
@@ -956,15 +973,16 @@ static int idedisk_open(struct inode *inode, struct file *filp)
956 973
957 idkp->openers++; 974 idkp->openers++;
958 975
959 if (drive->removable && idkp->openers == 1) { 976 if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
960 check_disk_change(inode->i_bdev); 977 check_disk_change(inode->i_bdev);
961 /* 978 /*
962 * Ignore the return code from door_lock, 979 * Ignore the return code from door_lock,
963 * since the open() has already succeeded, 980 * since the open() has already succeeded,
964 * and the door_lock is irrelevant at this point. 981 * and the door_lock is irrelevant at this point.
965 */ 982 */
966 if (drive->doorlocking && idedisk_set_doorlock(drive, 1)) 983 if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) &&
967 drive->doorlocking = 0; 984 idedisk_set_doorlock(drive, 1))
985 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
968 } 986 }
969 return 0; 987 return 0;
970} 988}
@@ -978,9 +996,10 @@ static int idedisk_release(struct inode *inode, struct file *filp)
978 if (idkp->openers == 1) 996 if (idkp->openers == 1)
979 ide_cacheflush_p(drive); 997 ide_cacheflush_p(drive);
980 998
981 if (drive->removable && idkp->openers == 1) { 999 if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
982 if (drive->doorlocking && idedisk_set_doorlock(drive, 0)) 1000 if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) &&
983 drive->doorlocking = 0; 1001 idedisk_set_doorlock(drive, 0))
1002 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
984 } 1003 }
985 1004
986 idkp->openers--; 1005 idkp->openers--;
@@ -1031,12 +1050,13 @@ static int idedisk_media_changed(struct gendisk *disk)
1031 ide_drive_t *drive = idkp->drive; 1050 ide_drive_t *drive = idkp->drive;
1032 1051
1033 /* do not scan partitions twice if this is a removable device */ 1052 /* do not scan partitions twice if this is a removable device */
1034 if (drive->attach) { 1053 if (drive->dev_flags & IDE_DFLAG_ATTACH) {
1035 drive->attach = 0; 1054 drive->dev_flags &= ~IDE_DFLAG_ATTACH;
1036 return 0; 1055 return 0;
1037 } 1056 }
1057
1038 /* if removable, always assume it was changed */ 1058 /* if removable, always assume it was changed */
1039 return drive->removable; 1059 return !!(drive->dev_flags & IDE_DFLAG_REMOVABLE);
1040} 1060}
1041 1061
1042static int idedisk_revalidate_disk(struct gendisk *disk) 1062static int idedisk_revalidate_disk(struct gendisk *disk)
@@ -1094,15 +1114,15 @@ static int ide_disk_probe(ide_drive_t *drive)
1094 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) { 1114 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
1095 printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", 1115 printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
1096 drive->name, drive->head); 1116 drive->name, drive->head);
1097 drive->attach = 0; 1117 drive->dev_flags &= ~IDE_DFLAG_ATTACH;
1098 } else 1118 } else
1099 drive->attach = 1; 1119 drive->dev_flags |= IDE_DFLAG_ATTACH;
1100 1120
1101 g->minors = IDE_DISK_MINORS; 1121 g->minors = IDE_DISK_MINORS;
1102 g->driverfs_dev = &drive->gendev; 1122 g->driverfs_dev = &drive->gendev;
1103 g->flags |= GENHD_FL_EXT_DEVT; 1123 g->flags |= GENHD_FL_EXT_DEVT;
1104 if (drive->removable) 1124 if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
1105 g->flags |= GENHD_FL_REMOVABLE; 1125 g->flags = GENHD_FL_REMOVABLE;
1106 set_capacity(g, idedisk_capacity(drive)); 1126 set_capacity(g, idedisk_capacity(drive));
1107 g->fops = &idedisk_ops; 1127 g->fops = &idedisk_ops;
1108 add_disk(g); 1128 add_disk(g);
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index ef2f1504c0d5..2dacd802c72c 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -397,7 +397,7 @@ EXPORT_SYMBOL_GPL(ide_dma_host_set);
397 397
398void ide_dma_off_quietly(ide_drive_t *drive) 398void ide_dma_off_quietly(ide_drive_t *drive)
399{ 399{
400 drive->using_dma = 0; 400 drive->dev_flags &= ~IDE_DFLAG_USING_DMA;
401 ide_toggle_bounce(drive, 0); 401 ide_toggle_bounce(drive, 0);
402 402
403 drive->hwif->dma_ops->dma_host_set(drive, 0); 403 drive->hwif->dma_ops->dma_host_set(drive, 0);
@@ -430,7 +430,7 @@ EXPORT_SYMBOL(ide_dma_off);
430 430
431void ide_dma_on(ide_drive_t *drive) 431void ide_dma_on(ide_drive_t *drive)
432{ 432{
433 drive->using_dma = 1; 433 drive->dev_flags |= IDE_DFLAG_USING_DMA;
434 ide_toggle_bounce(drive, 1); 434 ide_toggle_bounce(drive, 1);
435 435
436 drive->hwif->dma_ops->dma_host_set(drive, 1); 436 drive->hwif->dma_ops->dma_host_set(drive, 1);
@@ -727,7 +727,8 @@ static int ide_tune_dma(ide_drive_t *drive)
727 ide_hwif_t *hwif = drive->hwif; 727 ide_hwif_t *hwif = drive->hwif;
728 u8 speed; 728 u8 speed;
729 729
730 if (drive->nodma || ata_id_has_dma(drive->id) == 0) 730 if (ata_id_has_dma(drive->id) == 0 ||
731 (drive->dev_flags & IDE_DFLAG_NODMA))
731 return 0; 732 return 0;
732 733
733 /* consult the list of known "bad" drives */ 734 /* consult the list of known "bad" drives */
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index a11ec86925a3..cdfadb01d07f 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -828,8 +828,8 @@ static int idefloppy_media_changed(struct gendisk *disk)
828 int ret; 828 int ret;
829 829
830 /* do not scan partitions twice if this is a removable device */ 830 /* do not scan partitions twice if this is a removable device */
831 if (drive->attach) { 831 if (drive->dev_flags & IDE_DFLAG_ATTACH) {
832 drive->attach = 0; 832 drive->dev_flags &= ~IDE_DFLAG_ATTACH;
833 return 0; 833 return 0;
834 } 834 }
835 ret = !!(drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED); 835 ret = !!(drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED);
@@ -896,12 +896,13 @@ static int ide_floppy_probe(ide_drive_t *drive)
896 drive->debug_mask = debug_mask; 896 drive->debug_mask = debug_mask;
897 897
898 idefloppy_setup(drive, floppy); 898 idefloppy_setup(drive, floppy);
899 drive->dev_flags |= IDE_DFLAG_ATTACH;
899 900
900 g->minors = 1 << PARTN_BITS; 901 g->minors = 1 << PARTN_BITS;
901 g->driverfs_dev = &drive->gendev; 902 g->driverfs_dev = &drive->gendev;
902 g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; 903 if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
904 g->flags = GENHD_FL_REMOVABLE;
903 g->fops = &idefloppy_ops; 905 g->fops = &idefloppy_ops;
904 drive->attach = 1;
905 add_disk(g); 906 add_disk(g);
906 return 0; 907 return 0;
907 908
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 1c51949833be..5f0ed59bac6b 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -184,7 +184,8 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
184 if (drive->media != ide_disk) 184 if (drive->media != ide_disk)
185 break; 185 break;
186 /* Not supported? Switch to next step now. */ 186 /* Not supported? Switch to next step now. */
187 if (!drive->wcache || ata_id_flush_enabled(drive->id) == 0) { 187 if (ata_id_flush_enabled(drive->id) == 0 ||
188 (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) {
188 ide_complete_power_step(drive, rq, 0, 0); 189 ide_complete_power_step(drive, rq, 0, 0);
189 return ide_stopped; 190 return ide_stopped;
190 } 191 }
@@ -222,7 +223,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
222 if (drive->hwif->dma_ops == NULL) 223 if (drive->hwif->dma_ops == NULL)
223 break; 224 break;
224 /* 225 /*
225 * TODO: respect ->using_dma setting 226 * TODO: respect IDE_DFLAG_USING_DMA
226 */ 227 */
227 ide_set_dma(drive); 228 ide_set_dma(drive);
228 break; 229 break;
@@ -287,7 +288,7 @@ static void ide_complete_pm_request (ide_drive_t *drive, struct request *rq)
287 if (blk_pm_suspend_request(rq)) { 288 if (blk_pm_suspend_request(rq)) {
288 blk_stop_queue(drive->queue); 289 blk_stop_queue(drive->queue);
289 } else { 290 } else {
290 drive->blocked = 0; 291 drive->dev_flags &= ~IDE_DFLAG_BLOCKED;
291 blk_start_queue(drive->queue); 292 blk_start_queue(drive->queue);
292 } 293 }
293 HWGROUP(drive)->rq = NULL; 294 HWGROUP(drive)->rq = NULL;
@@ -374,7 +375,8 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
374{ 375{
375 ide_hwif_t *hwif = drive->hwif; 376 ide_hwif_t *hwif = drive->hwif;
376 377
377 if ((stat & ATA_BUSY) || ((stat & ATA_DF) && !drive->nowerr)) { 378 if ((stat & ATA_BUSY) ||
379 ((stat & ATA_DF) && (drive->dev_flags & IDE_DFLAG_NOWERR) == 0)) {
378 /* other bits are useless when BUSY */ 380 /* other bits are useless when BUSY */
379 rq->errors |= ERROR_RESET; 381 rq->errors |= ERROR_RESET;
380 } else if (stat & ATA_ERR) { 382 } else if (stat & ATA_ERR) {
@@ -428,7 +430,8 @@ static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u
428{ 430{
429 ide_hwif_t *hwif = drive->hwif; 431 ide_hwif_t *hwif = drive->hwif;
430 432
431 if ((stat & ATA_BUSY) || ((stat & ATA_DF) && !drive->nowerr)) { 433 if ((stat & ATA_BUSY) ||
434 ((stat & ATA_DF) && (drive->dev_flags & IDE_DFLAG_NOWERR) == 0)) {
432 /* other bits are useless when BUSY */ 435 /* other bits are useless when BUSY */
433 rq->errors |= ERROR_RESET; 436 rq->errors |= ERROR_RESET;
434 } else { 437 } else {
@@ -607,7 +610,7 @@ static ide_startstop_t do_special (ide_drive_t *drive)
607 610
608 if (set_pio_mode_abuse(drive->hwif, req_pio)) { 611 if (set_pio_mode_abuse(drive->hwif, req_pio)) {
609 /* 612 /*
610 * take ide_lock for drive->[no_]unmask/[no_]io_32bit 613 * take ide_lock for IDE_DFLAG_[NO_]UNMASK/[NO_]IO_32BIT
611 */ 614 */
612 if (req_pio == 8 || req_pio == 9) { 615 if (req_pio == 8 || req_pio == 9) {
613 unsigned long flags; 616 unsigned long flags;
@@ -618,7 +621,8 @@ static ide_startstop_t do_special (ide_drive_t *drive)
618 } else 621 } else
619 port_ops->set_pio_mode(drive, req_pio); 622 port_ops->set_pio_mode(drive, req_pio);
620 } else { 623 } else {
621 int keep_dma = drive->using_dma; 624 int keep_dma =
625 !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
622 626
623 ide_set_pio(drive, req_pio); 627 ide_set_pio(drive, req_pio);
624 628
@@ -775,7 +779,7 @@ static void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
775 if (blk_pm_suspend_request(rq) && 779 if (blk_pm_suspend_request(rq) &&
776 pm->pm_step == ide_pm_state_start_suspend) 780 pm->pm_step == ide_pm_state_start_suspend)
777 /* Mark drive blocked when starting the suspend sequence. */ 781 /* Mark drive blocked when starting the suspend sequence. */
778 drive->blocked = 1; 782 drive->dev_flags |= IDE_DFLAG_BLOCKED;
779 else if (blk_pm_resume_request(rq) && 783 else if (blk_pm_resume_request(rq) &&
780 pm->pm_step == ide_pm_state_start_resume) { 784 pm->pm_step == ide_pm_state_start_resume) {
781 /* 785 /*
@@ -895,7 +899,7 @@ void ide_stall_queue (ide_drive_t *drive, unsigned long timeout)
895 if (timeout > WAIT_WORSTCASE) 899 if (timeout > WAIT_WORSTCASE)
896 timeout = WAIT_WORSTCASE; 900 timeout = WAIT_WORSTCASE;
897 drive->sleep = timeout + jiffies; 901 drive->sleep = timeout + jiffies;
898 drive->sleeping = 1; 902 drive->dev_flags |= IDE_DFLAG_SLEEPING;
899} 903}
900 904
901EXPORT_SYMBOL(ide_stall_queue); 905EXPORT_SYMBOL(ide_stall_queue);
@@ -935,18 +939,23 @@ repeat:
935 } 939 }
936 940
937 do { 941 do {
938 if ((!drive->sleeping || time_after_eq(jiffies, drive->sleep)) 942 u8 dev_s = !!(drive->dev_flags & IDE_DFLAG_SLEEPING);
939 && !elv_queue_empty(drive->queue)) { 943 u8 best_s = (best && !!(best->dev_flags & IDE_DFLAG_SLEEPING));
940 if (!best 944
941 || (drive->sleeping && (!best->sleeping || time_before(drive->sleep, best->sleep))) 945 if ((dev_s == 0 || time_after_eq(jiffies, drive->sleep)) &&
942 || (!best->sleeping && time_before(WAKEUP(drive), WAKEUP(best)))) 946 !elv_queue_empty(drive->queue)) {
943 { 947 if (best == NULL ||
948 (dev_s && (best_s == 0 || time_before(drive->sleep, best->sleep))) ||
949 (best_s == 0 && time_before(WAKEUP(drive), WAKEUP(best)))) {
944 if (!blk_queue_plugged(drive->queue)) 950 if (!blk_queue_plugged(drive->queue))
945 best = drive; 951 best = drive;
946 } 952 }
947 } 953 }
948 } while ((drive = drive->next) != hwgroup->drive); 954 } while ((drive = drive->next) != hwgroup->drive);
949 if (best && best->nice1 && !best->sleeping && best != hwgroup->drive && best->service_time > WAIT_MIN_SLEEP) { 955
956 if (best && (best->dev_flags & IDE_DFLAG_NICE1) &&
957 (best->dev_flags & IDE_DFLAG_SLEEPING) == 0 &&
958 best != hwgroup->drive && best->service_time > WAIT_MIN_SLEEP) {
950 long t = (signed long)(WAKEUP(best) - jiffies); 959 long t = (signed long)(WAKEUP(best) - jiffies);
951 if (t >= WAIT_MIN_SLEEP) { 960 if (t >= WAIT_MIN_SLEEP) {
952 /* 961 /*
@@ -955,7 +964,7 @@ repeat:
955 */ 964 */
956 drive = best->next; 965 drive = best->next;
957 do { 966 do {
958 if (!drive->sleeping 967 if ((drive->dev_flags & IDE_DFLAG_SLEEPING) == 0
959 && time_before(jiffies - best->service_time, WAKEUP(drive)) 968 && time_before(jiffies - best->service_time, WAKEUP(drive))
960 && time_before(WAKEUP(drive), jiffies + t)) 969 && time_before(WAKEUP(drive), jiffies + t))
961 { 970 {
@@ -1026,7 +1035,9 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
1026 hwgroup->rq = NULL; 1035 hwgroup->rq = NULL;
1027 drive = hwgroup->drive; 1036 drive = hwgroup->drive;
1028 do { 1037 do {
1029 if (drive->sleeping && (!sleeping || time_before(drive->sleep, sleep))) { 1038 if ((drive->dev_flags & IDE_DFLAG_SLEEPING) &&
1039 (sleeping == 0 ||
1040 time_before(drive->sleep, sleep))) {
1030 sleeping = 1; 1041 sleeping = 1;
1031 sleep = drive->sleep; 1042 sleep = drive->sleep;
1032 } 1043 }
@@ -1075,7 +1086,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
1075 } 1086 }
1076 hwgroup->hwif = hwif; 1087 hwgroup->hwif = hwif;
1077 hwgroup->drive = drive; 1088 hwgroup->drive = drive;
1078 drive->sleeping = 0; 1089 drive->dev_flags &= ~IDE_DFLAG_SLEEPING;
1079 drive->service_start = jiffies; 1090 drive->service_start = jiffies;
1080 1091
1081 if (blk_queue_plugged(drive->queue)) { 1092 if (blk_queue_plugged(drive->queue)) {
@@ -1109,7 +1120,9 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
1109 * We count how many times we loop here to make sure we service 1120 * We count how many times we loop here to make sure we service
1110 * all drives in the hwgroup without looping for ever 1121 * all drives in the hwgroup without looping for ever
1111 */ 1122 */
1112 if (drive->blocked && !blk_pm_request(rq) && !(rq->cmd_flags & REQ_PREEMPT)) { 1123 if ((drive->dev_flags & IDE_DFLAG_BLOCKED) &&
1124 blk_pm_request(rq) == 0 &&
1125 (rq->cmd_flags & REQ_PREEMPT) == 0) {
1113 drive = drive->next ? drive->next : hwgroup->drive; 1126 drive = drive->next ? drive->next : hwgroup->drive;
1114 if (loops++ < 4 && !blk_queue_plugged(drive->queue)) 1127 if (loops++ < 4 && !blk_queue_plugged(drive->queue))
1115 goto again; 1128 goto again;
@@ -1491,7 +1504,7 @@ irqreturn_t ide_intr (int irq, void *dev_id)
1491 */ 1504 */
1492 hwif->ide_dma_clear_irq(drive); 1505 hwif->ide_dma_clear_irq(drive);
1493 1506
1494 if (drive->unmask) 1507 if (drive->dev_flags & IDE_DFLAG_UNMASK)
1495 local_irq_enable_in_hardirq(); 1508 local_irq_enable_in_hardirq();
1496 /* service this interrupt, may set handler for next interrupt */ 1509 /* service this interrupt, may set handler for next interrupt */
1497 startstop = handler(drive); 1510 startstop = handler(drive);
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c
index cf01564901af..a90945f49792 100644
--- a/drivers/ide/ide-ioctls.c
+++ b/drivers/ide/ide-ioctls.c
@@ -62,7 +62,7 @@ static int ide_get_identity_ioctl(ide_drive_t *drive, unsigned int cmd,
62 int size = (cmd == HDIO_GET_IDENTITY) ? (ATA_ID_WORDS * 2) : 142; 62 int size = (cmd == HDIO_GET_IDENTITY) ? (ATA_ID_WORDS * 2) : 142;
63 int rc = 0; 63 int rc = 0;
64 64
65 if (drive->id_read == 0) { 65 if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
66 rc = -ENOMSG; 66 rc = -ENOMSG;
67 goto out; 67 goto out;
68 } 68 }
@@ -86,8 +86,10 @@ out:
86 86
87static int ide_get_nice_ioctl(ide_drive_t *drive, unsigned long arg) 87static int ide_get_nice_ioctl(ide_drive_t *drive, unsigned long arg)
88{ 88{
89 return put_user((drive->dsc_overlap << IDE_NICE_DSC_OVERLAP) | 89 return put_user((!!(drive->dev_flags & IDE_DFLAG_DSC_OVERLAP)
90 (drive->nice1 << IDE_NICE_1), (long __user *)arg); 90 << IDE_NICE_DSC_OVERLAP) |
91 (!!(drive->dev_flags & IDE_DFLAG_NICE1)
92 << IDE_NICE_1), (long __user *)arg);
91} 93}
92 94
93static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg) 95static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg)
@@ -97,11 +99,18 @@ static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg)
97 99
98 if (((arg >> IDE_NICE_DSC_OVERLAP) & 1) && 100 if (((arg >> IDE_NICE_DSC_OVERLAP) & 1) &&
99 (drive->media == ide_disk || drive->media == ide_floppy || 101 (drive->media == ide_disk || drive->media == ide_floppy ||
100 drive->scsi)) 102 (drive->dev_flags & IDE_DFLAG_SCSI)))
101 return -EPERM; 103 return -EPERM;
102 104
103 drive->dsc_overlap = (arg >> IDE_NICE_DSC_OVERLAP) & 1; 105 if ((arg >> IDE_NICE_DSC_OVERLAP) & 1)
104 drive->nice1 = (arg >> IDE_NICE_1) & 1; 106 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
107 else
108 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
109
110 if ((arg >> IDE_NICE_1) & 1)
111 drive->dev_flags |= IDE_DFLAG_NICE1;
112 else
113 drive->dev_flags &= ~IDE_DFLAG_NICE1;
105 114
106 return 0; 115 return 0;
107} 116}
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index 0a2fd3b37ac4..cec744cbbde0 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -647,7 +647,7 @@ u8 eighty_ninty_three (ide_drive_t *drive)
647 return 1; 647 return 1;
648 648
649no_80w: 649no_80w:
650 if (drive->udma33_warned == 1) 650 if (drive->dev_flags & IDE_DFLAG_UDMA33_WARNED)
651 return 0; 651 return 0;
652 652
653 printk(KERN_WARNING "%s: %s side 80-wire cable detection failed, " 653 printk(KERN_WARNING "%s: %s side 80-wire cable detection failed, "
@@ -655,7 +655,7 @@ no_80w:
655 drive->name, 655 drive->name,
656 hwif->cbl == ATA_CBL_PATA80 ? "drive" : "host"); 656 hwif->cbl == ATA_CBL_PATA80 ? "drive" : "host");
657 657
658 drive->udma33_warned = 1; 658 drive->dev_flags |= IDE_DFLAG_UDMA33_WARNED;
659 659
660 return 0; 660 return 0;
661} 661}
@@ -711,7 +711,7 @@ int ide_driveid_update(ide_drive_t *drive)
711 711
712 kfree(id); 712 kfree(id);
713 713
714 if (drive->using_dma && ide_id_dma_bug(drive)) 714 if ((drive->dev_flags & IDE_DFLAG_USING_DMA) && ide_id_dma_bug(drive))
715 ide_dma_off(drive); 715 ide_dma_off(drive);
716 716
717 return 1; 717 return 1;
@@ -790,7 +790,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
790 790
791 skip: 791 skip:
792#ifdef CONFIG_BLK_DEV_IDEDMA 792#ifdef CONFIG_BLK_DEV_IDEDMA
793 if (speed >= XFER_SW_DMA_0 && drive->using_dma) 793 if (speed >= XFER_SW_DMA_0 && (drive->dev_flags & IDE_DFLAG_USING_DMA))
794 hwif->dma_ops->dma_host_set(drive, 1); 794 hwif->dma_ops->dma_host_set(drive, 1);
795 else if (hwif->dma_ops) /* check if host supports DMA */ 795 else if (hwif->dma_ops) /* check if host supports DMA */
796 ide_dma_off_quietly(drive); 796 ide_dma_off_quietly(drive);
@@ -1016,9 +1016,13 @@ static void ide_disk_pre_reset(ide_drive_t *drive)
1016 drive->special.all = 0; 1016 drive->special.all = 0;
1017 drive->special.b.set_geometry = legacy; 1017 drive->special.b.set_geometry = legacy;
1018 drive->special.b.recalibrate = legacy; 1018 drive->special.b.recalibrate = legacy;
1019
1019 drive->mult_count = 0; 1020 drive->mult_count = 0;
1020 if (!drive->keep_settings && !drive->using_dma) 1021
1022 if ((drive->dev_flags & IDE_DFLAG_KEEP_SETTINGS) == 0 &&
1023 (drive->dev_flags & IDE_DFLAG_USING_DMA) == 0)
1021 drive->mult_req = 0; 1024 drive->mult_req = 0;
1025
1022 if (drive->mult_req != drive->mult_count) 1026 if (drive->mult_req != drive->mult_count)
1023 drive->special.b.set_multmode = 1; 1027 drive->special.b.set_multmode = 1;
1024} 1028}
@@ -1030,18 +1034,18 @@ static void pre_reset(ide_drive_t *drive)
1030 if (drive->media == ide_disk) 1034 if (drive->media == ide_disk)
1031 ide_disk_pre_reset(drive); 1035 ide_disk_pre_reset(drive);
1032 else 1036 else
1033 drive->post_reset = 1; 1037 drive->dev_flags |= IDE_DFLAG_POST_RESET;
1034 1038
1035 if (drive->using_dma) { 1039 if (drive->dev_flags & IDE_DFLAG_USING_DMA) {
1036 if (drive->crc_count) 1040 if (drive->crc_count)
1037 ide_check_dma_crc(drive); 1041 ide_check_dma_crc(drive);
1038 else 1042 else
1039 ide_dma_off(drive); 1043 ide_dma_off(drive);
1040 } 1044 }
1041 1045
1042 if (!drive->keep_settings) { 1046 if ((drive->dev_flags & IDE_DFLAG_KEEP_SETTINGS) == 0) {
1043 if (!drive->using_dma) { 1047 if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0) {
1044 drive->unmask = 0; 1048 drive->dev_flags &= ~IDE_DFLAG_UNMASK;
1045 drive->io_32bit = 0; 1049 drive->io_32bit = 0;
1046 } 1050 }
1047 return; 1051 return;
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c
index ed426dd0fdd8..9fc4cfb2a272 100644
--- a/drivers/ide/ide-lib.c
+++ b/drivers/ide/ide-lib.c
@@ -317,7 +317,7 @@ static void ide_dump_sector(ide_drive_t *drive)
317{ 317{
318 ide_task_t task; 318 ide_task_t task;
319 struct ide_taskfile *tf = &task.tf; 319 struct ide_taskfile *tf = &task.tf;
320 int lba48 = (drive->addressing == 1) ? 1 : 0; 320 u8 lba48 = !!(drive->dev_flags & IDE_DFLAG_LBA48);
321 321
322 memset(&task, 0, sizeof(task)); 322 memset(&task, 0, sizeof(task));
323 if (lba48) 323 if (lba48)
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 237b9871f80a..57c741876536 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -121,7 +121,8 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
121 /* read 512 bytes of id info */ 121 /* read 512 bytes of id info */
122 hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE); 122 hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
123 123
124 drive->id_read = 1; 124 drive->dev_flags |= IDE_DFLAG_ID_READ;
125
125 local_irq_enable(); 126 local_irq_enable();
126#ifdef DEBUG 127#ifdef DEBUG
127 printk(KERN_INFO "%s: dumping identify data\n", drive->name); 128 printk(KERN_INFO "%s: dumping identify data\n", drive->name);
@@ -153,8 +154,8 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
153 154
154 printk(KERN_INFO "%s: %s, ", drive->name, m); 155 printk(KERN_INFO "%s: %s, ", drive->name, m);
155 156
156 drive->present = 1; 157 drive->dev_flags |= IDE_DFLAG_PRESENT;
157 drive->dead = 0; 158 drive->dev_flags &= ~IDE_DFLAG_DEAD;
158 159
159 /* 160 /*
160 * Check for an ATAPI device 161 * Check for an ATAPI device
@@ -172,14 +173,14 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
172 printk(KERN_CONT "cdrom or floppy?, assuming "); 173 printk(KERN_CONT "cdrom or floppy?, assuming ");
173 if (drive->media != ide_cdrom) { 174 if (drive->media != ide_cdrom) {
174 printk(KERN_CONT "FLOPPY"); 175 printk(KERN_CONT "FLOPPY");
175 drive->removable = 1; 176 drive->dev_flags |= IDE_DFLAG_REMOVABLE;
176 break; 177 break;
177 } 178 }
178 } 179 }
179 /* Early cdrom models used zero */ 180 /* Early cdrom models used zero */
180 type = ide_cdrom; 181 type = ide_cdrom;
181 case ide_cdrom: 182 case ide_cdrom:
182 drive->removable = 1; 183 drive->dev_flags |= IDE_DFLAG_REMOVABLE;
183#ifdef CONFIG_PPC 184#ifdef CONFIG_PPC
184 /* kludge for Apple PowerBook internal zip */ 185 /* kludge for Apple PowerBook internal zip */
185 if (!strstr(m, "CD-ROM") && strstr(m, "ZIP")) { 186 if (!strstr(m, "CD-ROM") && strstr(m, "ZIP")) {
@@ -195,7 +196,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
195 break; 196 break;
196 case ide_optical: 197 case ide_optical:
197 printk(KERN_CONT "OPTICAL"); 198 printk(KERN_CONT "OPTICAL");
198 drive->removable = 1; 199 drive->dev_flags |= IDE_DFLAG_REMOVABLE;
199 break; 200 break;
200 default: 201 default:
201 printk(KERN_CONT "UNKNOWN (type %d)", type); 202 printk(KERN_CONT "UNKNOWN (type %d)", type);
@@ -216,7 +217,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
216 217
217 /* CF devices are *not* removable in Linux definition of the term */ 218 /* CF devices are *not* removable in Linux definition of the term */
218 if (is_cfa == 0 && (id[ATA_ID_CONFIG] & (1 << 7))) 219 if (is_cfa == 0 && (id[ATA_ID_CONFIG] & (1 << 7)))
219 drive->removable = 1; 220 drive->dev_flags |= IDE_DFLAG_REMOVABLE;
220 221
221 drive->media = ide_disk; 222 drive->media = ide_disk;
222 223
@@ -226,7 +227,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
226 227
227err_misc: 228err_misc:
228 kfree(id); 229 kfree(id);
229 drive->present = 0; 230 drive->dev_flags &= ~IDE_DFLAG_PRESENT;
230 return; 231 return;
231} 232}
232 233
@@ -426,16 +427,15 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
426 ide_hwif_t *hwif = HWIF(drive); 427 ide_hwif_t *hwif = HWIF(drive);
427 const struct ide_tp_ops *tp_ops = hwif->tp_ops; 428 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
428 int rc; 429 int rc;
429 u8 stat; 430 u8 present = !!(drive->dev_flags & IDE_DFLAG_PRESENT), stat;
431
432 /* avoid waiting for inappropriate probes */
433 if (present && drive->media != ide_disk && cmd == ATA_CMD_ID_ATA)
434 return 4;
430 435
431 if (drive->present) {
432 /* avoid waiting for inappropriate probes */
433 if (drive->media != ide_disk && cmd == ATA_CMD_ID_ATA)
434 return 4;
435 }
436#ifdef DEBUG 436#ifdef DEBUG
437 printk(KERN_INFO "probing for %s: present=%d, media=%d, probetype=%s\n", 437 printk(KERN_INFO "probing for %s: present=%d, media=%d, probetype=%s\n",
438 drive->name, drive->present, drive->media, 438 drive->name, present, drive->media,
439 (cmd == ATA_CMD_ID_ATA) ? "ATA" : "ATAPI"); 439 (cmd == ATA_CMD_ID_ATA) ? "ATA" : "ATAPI");
440#endif 440#endif
441 441
@@ -446,7 +446,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
446 SELECT_DRIVE(drive); 446 SELECT_DRIVE(drive);
447 msleep(50); 447 msleep(50);
448 448
449 if (ide_read_device(drive) != drive->select.all && !drive->present) { 449 if (ide_read_device(drive) != drive->select.all && present == 0) {
450 if (drive->select.b.unit != 0) { 450 if (drive->select.b.unit != 0) {
451 /* exit with drive0 selected */ 451 /* exit with drive0 selected */
452 SELECT_DRIVE(&hwif->drives[0]); 452 SELECT_DRIVE(&hwif->drives[0]);
@@ -460,7 +460,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
460 stat = tp_ops->read_status(hwif); 460 stat = tp_ops->read_status(hwif);
461 461
462 if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) || 462 if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) ||
463 drive->present || cmd == ATA_CMD_ID_ATAPI) { 463 present || cmd == ATA_CMD_ID_ATAPI) {
464 /* send cmd and wait */ 464 /* send cmd and wait */
465 if ((rc = try_to_identify(drive, cmd))) { 465 if ((rc = try_to_identify(drive, cmd))) {
466 /* failed: try again */ 466 /* failed: try again */
@@ -542,8 +542,8 @@ static void enable_nest (ide_drive_t *drive)
542 * and presents things to the user as needed. 542 * and presents things to the user as needed.
543 * 543 *
544 * Returns: 0 no device was found 544 * Returns: 0 no device was found
545 * 1 device was found (note: drive->present might 545 * 1 device was found
546 * still be 0) 546 * (note: IDE_DFLAG_PRESENT might still be not set)
547 */ 547 */
548 548
549static inline u8 probe_for_drive (ide_drive_t *drive) 549static inline u8 probe_for_drive (ide_drive_t *drive)
@@ -559,10 +559,10 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
559 * Also note that 0 everywhere means "can't do X" 559 * Also note that 0 everywhere means "can't do X"
560 */ 560 */
561 561
562 drive->dev_flags &= ~IDE_DFLAG_ID_READ;
563
562 drive->id = kzalloc(SECTOR_SIZE, GFP_KERNEL); 564 drive->id = kzalloc(SECTOR_SIZE, GFP_KERNEL);
563 drive->id_read = 0; 565 if (drive->id == NULL) {
564 if(drive->id == NULL)
565 {
566 printk(KERN_ERR "ide: out of memory for id data.\n"); 566 printk(KERN_ERR "ide: out of memory for id data.\n");
567 return 0; 567 return 0;
568 } 568 }
@@ -571,14 +571,14 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
571 strcpy(m, "UNKNOWN"); 571 strcpy(m, "UNKNOWN");
572 572
573 /* skip probing? */ 573 /* skip probing? */
574 if (!drive->noprobe) { 574 if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0) {
575retry: 575retry:
576 /* if !(success||timed-out) */ 576 /* if !(success||timed-out) */
577 if (do_probe(drive, ATA_CMD_ID_ATA) >= 2) 577 if (do_probe(drive, ATA_CMD_ID_ATA) >= 2)
578 /* look for ATAPI device */ 578 /* look for ATAPI device */
579 (void)do_probe(drive, ATA_CMD_ID_ATAPI); 579 (void)do_probe(drive, ATA_CMD_ID_ATAPI);
580 580
581 if (!drive->present) 581 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
582 /* drive not found */ 582 /* drive not found */
583 return 0; 583 return 0;
584 584
@@ -588,7 +588,7 @@ retry:
588 } 588 }
589 589
590 /* identification failed? */ 590 /* identification failed? */
591 if (!drive->id_read) { 591 if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
592 if (drive->media == ide_disk) { 592 if (drive->media == ide_disk) {
593 printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n", 593 printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n",
594 drive->name, drive->cyl, 594 drive->name, drive->cyl,
@@ -598,15 +598,17 @@ retry:
598 } else { 598 } else {
599 /* nuke it */ 599 /* nuke it */
600 printk(KERN_WARNING "%s: Unknown device on bus refused identification. Ignoring.\n", drive->name); 600 printk(KERN_WARNING "%s: Unknown device on bus refused identification. Ignoring.\n", drive->name);
601 drive->present = 0; 601 drive->dev_flags &= ~IDE_DFLAG_PRESENT;
602 } 602 }
603 } 603 }
604 /* drive was found */ 604 /* drive was found */
605 } 605 }
606 if(!drive->present) 606
607 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
607 return 0; 608 return 0;
609
608 /* The drive wasn't being helpful. Add generic info only */ 610 /* The drive wasn't being helpful. Add generic info only */
609 if (drive->id_read == 0) { 611 if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
610 generic_id(drive); 612 generic_id(drive);
611 return 1; 613 return 1;
612 } 614 }
@@ -616,7 +618,7 @@ retry:
616 ide_disk_init_mult_count(drive); 618 ide_disk_init_mult_count(drive);
617 } 619 }
618 620
619 return drive->present; 621 return !!(drive->dev_flags & IDE_DFLAG_PRESENT);
620} 622}
621 623
622static void hwif_release_dev(struct device *dev) 624static void hwif_release_dev(struct device *dev)
@@ -707,7 +709,8 @@ static int ide_port_wait_ready(ide_hwif_t *hwif)
707 ide_drive_t *drive = &hwif->drives[unit]; 709 ide_drive_t *drive = &hwif->drives[unit];
708 710
709 /* Ignore disks that we will not probe for later. */ 711 /* Ignore disks that we will not probe for later. */
710 if (!drive->noprobe || drive->present) { 712 if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0 ||
713 (drive->dev_flags & IDE_DFLAG_PRESENT)) {
711 SELECT_DRIVE(drive); 714 SELECT_DRIVE(drive);
712 hwif->tp_ops->set_irq(hwif, 1); 715 hwif->tp_ops->set_irq(hwif, 1);
713 mdelay(2); 716 mdelay(2);
@@ -739,7 +742,7 @@ void ide_undecoded_slave(ide_drive_t *dev1)
739{ 742{
740 ide_drive_t *dev0 = &dev1->hwif->drives[0]; 743 ide_drive_t *dev0 = &dev1->hwif->drives[0];
741 744
742 if ((dev1->dn & 1) == 0 || dev0->present == 0) 745 if ((dev1->dn & 1) == 0 || (dev0->dev_flags & IDE_DFLAG_PRESENT) == 0)
743 return; 746 return;
744 747
745 /* If the models don't match they are not the same product */ 748 /* If the models don't match they are not the same product */
@@ -759,7 +762,7 @@ void ide_undecoded_slave(ide_drive_t *dev1)
759 /* Appears to be an IDE flash adapter with decode bugs */ 762 /* Appears to be an IDE flash adapter with decode bugs */
760 printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n"); 763 printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n");
761 764
762 dev1->present = 0; 765 dev1->dev_flags &= ~IDE_DFLAG_PRESENT;
763} 766}
764 767
765EXPORT_SYMBOL_GPL(ide_undecoded_slave); 768EXPORT_SYMBOL_GPL(ide_undecoded_slave);
@@ -772,7 +775,8 @@ static int ide_probe_port(ide_hwif_t *hwif)
772 775
773 BUG_ON(hwif->present); 776 BUG_ON(hwif->present);
774 777
775 if (hwif->drives[0].noprobe && hwif->drives[1].noprobe) 778 if ((hwif->drives[0].dev_flags & IDE_DFLAG_NOPROBE) &&
779 (hwif->drives[1].dev_flags & IDE_DFLAG_NOPROBE))
776 return -EACCES; 780 return -EACCES;
777 781
778 /* 782 /*
@@ -796,7 +800,7 @@ static int ide_probe_port(ide_hwif_t *hwif)
796 ide_drive_t *drive = &hwif->drives[unit]; 800 ide_drive_t *drive = &hwif->drives[unit];
797 drive->dn = (hwif->channel ? 2 : 0) + unit; 801 drive->dn = (hwif->channel ? 2 : 0) + unit;
798 (void) probe_for_drive(drive); 802 (void) probe_for_drive(drive);
799 if (drive->present) 803 if (drive->dev_flags & IDE_DFLAG_PRESENT)
800 rc = 0; 804 rc = 0;
801 } 805 }
802 806
@@ -820,17 +824,19 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
820 for (unit = 0; unit < MAX_DRIVES; unit++) { 824 for (unit = 0; unit < MAX_DRIVES; unit++) {
821 ide_drive_t *drive = &hwif->drives[unit]; 825 ide_drive_t *drive = &hwif->drives[unit];
822 826
823 if (drive->present && port_ops && port_ops->quirkproc) 827 if (drive->dev_flags & IDE_DFLAG_PRESENT) {
824 port_ops->quirkproc(drive); 828 if (port_ops && port_ops->quirkproc)
829 port_ops->quirkproc(drive);
830 }
825 } 831 }
826 832
827 for (unit = 0; unit < MAX_DRIVES; ++unit) { 833 for (unit = 0; unit < MAX_DRIVES; ++unit) {
828 ide_drive_t *drive = &hwif->drives[unit]; 834 ide_drive_t *drive = &hwif->drives[unit];
829 835
830 if (drive->present) { 836 if (drive->dev_flags & IDE_DFLAG_PRESENT) {
831 ide_set_max_pio(drive); 837 ide_set_max_pio(drive);
832 838
833 drive->nice1 = 1; 839 drive->dev_flags |= IDE_DFLAG_NICE1;
834 840
835 if (hwif->dma_ops) 841 if (hwif->dma_ops)
836 ide_set_dma(drive); 842 ide_set_dma(drive);
@@ -840,10 +846,11 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
840 for (unit = 0; unit < MAX_DRIVES; ++unit) { 846 for (unit = 0; unit < MAX_DRIVES; ++unit) {
841 ide_drive_t *drive = &hwif->drives[unit]; 847 ide_drive_t *drive = &hwif->drives[unit];
842 848
843 if (hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) 849 if ((hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) ||
844 drive->no_io_32bit = 1; 850 drive->id[ATA_ID_DWORD_IO])
851 drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT;
845 else 852 else
846 drive->no_io_32bit = drive->id[ATA_ID_DWORD_IO] ? 1 : 0; 853 drive->dev_flags &= ~IDE_DFLAG_NO_IO_32BIT;
847 } 854 }
848} 855}
849 856
@@ -957,7 +964,7 @@ static void ide_port_setup_devices(ide_hwif_t *hwif)
957 for (i = 0; i < MAX_DRIVES; i++) { 964 for (i = 0; i < MAX_DRIVES; i++) {
958 ide_drive_t *drive = &hwif->drives[i]; 965 ide_drive_t *drive = &hwif->drives[i];
959 966
960 if (!drive->present) 967 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
961 continue; 968 continue;
962 969
963 if (ide_init_queue(drive)) { 970 if (ide_init_queue(drive)) {
@@ -1151,12 +1158,13 @@ static struct kobject *ata_probe(dev_t dev, int *part, void *data)
1151 ide_hwif_t *hwif = data; 1158 ide_hwif_t *hwif = data;
1152 int unit = *part >> PARTN_BITS; 1159 int unit = *part >> PARTN_BITS;
1153 ide_drive_t *drive = &hwif->drives[unit]; 1160 ide_drive_t *drive = &hwif->drives[unit];
1154 if (!drive->present) 1161
1162 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
1155 return NULL; 1163 return NULL;
1156 1164
1157 if (drive->media == ide_disk) 1165 if (drive->media == ide_disk)
1158 request_module("ide-disk"); 1166 request_module("ide-disk");
1159 if (drive->scsi) 1167 if (drive->dev_flags & IDE_DFLAG_SCSI)
1160 request_module("ide-scsi"); 1168 request_module("ide-scsi");
1161 if (drive->media == ide_cdrom || drive->media == ide_optical) 1169 if (drive->media == ide_cdrom || drive->media == ide_optical)
1162 request_module("ide-cd"); 1170 request_module("ide-cd");
@@ -1246,7 +1254,7 @@ static void drive_release_dev (struct device *dev)
1246 ide_remove_drive_from_hwgroup(drive); 1254 ide_remove_drive_from_hwgroup(drive);
1247 kfree(drive->id); 1255 kfree(drive->id);
1248 drive->id = NULL; 1256 drive->id = NULL;
1249 drive->present = 0; 1257 drive->dev_flags &= ~IDE_DFLAG_PRESENT;
1250 /* Messed up locking ... */ 1258 /* Messed up locking ... */
1251 spin_unlock_irq(&ide_lock); 1259 spin_unlock_irq(&ide_lock);
1252 blk_cleanup_queue(drive->queue); 1260 blk_cleanup_queue(drive->queue);
@@ -1325,7 +1333,7 @@ static void hwif_register_devices(ide_hwif_t *hwif)
1325 struct device *dev = &drive->gendev; 1333 struct device *dev = &drive->gendev;
1326 int ret; 1334 int ret;
1327 1335
1328 if (!drive->present) 1336 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
1329 continue; 1337 continue;
1330 1338
1331 snprintf(dev->bus_id, BUS_ID_SIZE, "%u.%u", hwif->index, i); 1339 snprintf(dev->bus_id, BUS_ID_SIZE, "%u.%u", hwif->index, i);
@@ -1352,9 +1360,9 @@ static void ide_port_init_devices(ide_hwif_t *hwif)
1352 if (hwif->host_flags & IDE_HFLAG_IO_32BIT) 1360 if (hwif->host_flags & IDE_HFLAG_IO_32BIT)
1353 drive->io_32bit = 1; 1361 drive->io_32bit = 1;
1354 if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS) 1362 if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS)
1355 drive->unmask = 1; 1363 drive->dev_flags |= IDE_DFLAG_UNMASK;
1356 if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) 1364 if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS)
1357 drive->no_unmask = 1; 1365 drive->dev_flags |= IDE_DFLAG_NO_UNMASK;
1358 1366
1359 if (port_ops && port_ops->init_dev) 1367 if (port_ops && port_ops->init_dev)
1360 port_ops->init_dev(drive); 1368 port_ops->init_dev(drive);
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
index e7030a491463..b26926487cc0 100644
--- a/drivers/ide/ide-proc.c
+++ b/drivers/ide/ide-proc.c
@@ -227,7 +227,7 @@ static int set_xfer_rate (ide_drive_t *drive, int arg)
227 227
228ide_devset_rw(current_speed, xfer_rate); 228ide_devset_rw(current_speed, xfer_rate);
229ide_devset_rw_field(init_speed, init_speed); 229ide_devset_rw_field(init_speed, init_speed);
230ide_devset_rw_field(nice1, nice1); 230ide_devset_rw_flag(nice1, IDE_DFLAG_NICE1);
231ide_devset_rw_field(number, dn); 231ide_devset_rw_field(number, dn);
232 232
233static const struct ide_proc_devset ide_generic_settings[] = { 233static const struct ide_proc_devset ide_generic_settings[] = {
@@ -622,9 +622,7 @@ void ide_proc_port_register_devices(ide_hwif_t *hwif)
622 for (d = 0; d < MAX_DRIVES; d++) { 622 for (d = 0; d < MAX_DRIVES; d++) {
623 ide_drive_t *drive = &hwif->drives[d]; 623 ide_drive_t *drive = &hwif->drives[d];
624 624
625 if (!drive->present) 625 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0 || drive->proc)
626 continue;
627 if (drive->proc)
628 continue; 626 continue;
629 627
630 drive->proc = proc_mkdir(drive->name, parent); 628 drive->proc = proc_mkdir(drive->name, parent);
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index 2c235401aad1..103f9f161716 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -826,12 +826,13 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
826 */ 826 */
827 stat = hwif->tp_ops->read_status(hwif); 827 stat = hwif->tp_ops->read_status(hwif);
828 828
829 if (!drive->dsc_overlap && !(rq->cmd[13] & REQ_IDETAPE_PC2)) 829 if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 &&
830 (rq->cmd[13] & REQ_IDETAPE_PC2) == 0)
830 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); 831 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
831 832
832 if (drive->post_reset == 1) { 833 if (drive->dev_flags & IDE_DFLAG_POST_RESET) {
833 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); 834 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
834 drive->post_reset = 0; 835 drive->dev_flags &= ~IDE_DFLAG_POST_RESET;
835 } 836 }
836 837
837 if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) && 838 if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) &&
@@ -1354,7 +1355,7 @@ static int idetape_init_read(ide_drive_t *drive)
1354 * No point in issuing this if DSC overlap isn't supported, some 1355 * No point in issuing this if DSC overlap isn't supported, some
1355 * drives (Seagate STT3401A) will return an error. 1356 * drives (Seagate STT3401A) will return an error.
1356 */ 1357 */
1357 if (drive->dsc_overlap) { 1358 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) {
1358 bytes_read = idetape_queue_rw_tail(drive, 1359 bytes_read = idetape_queue_rw_tail(drive,
1359 REQ_IDETAPE_READ, 0, 1360 REQ_IDETAPE_READ, 0,
1360 tape->merge_bh); 1361 tape->merge_bh);
@@ -1630,7 +1631,7 @@ static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
1630 * point in issuing this if DSC overlap isn't supported, some 1631 * point in issuing this if DSC overlap isn't supported, some
1631 * drives (Seagate STT3401A) will return an error. 1632 * drives (Seagate STT3401A) will return an error.
1632 */ 1633 */
1633 if (drive->dsc_overlap) { 1634 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) {
1634 ssize_t retval = idetape_queue_rw_tail(drive, 1635 ssize_t retval = idetape_queue_rw_tail(drive,
1635 REQ_IDETAPE_WRITE, 0, 1636 REQ_IDETAPE_WRITE, 0,
1636 tape->merge_bh); 1637 tape->merge_bh);
@@ -2145,7 +2146,7 @@ static int divf_tdsc(ide_drive_t *drive) { return HZ; }
2145static int divf_buffer(ide_drive_t *drive) { return 2; } 2146static int divf_buffer(ide_drive_t *drive) { return 2; }
2146static int divf_buffer_size(ide_drive_t *drive) { return 1024; } 2147static int divf_buffer_size(ide_drive_t *drive) { return 1024; }
2147 2148
2148ide_devset_rw_field(dsc_overlap, dsc_overlap); 2149ide_devset_rw_flag(dsc_overlap, IDE_DFLAG_DSC_OVERLAP);
2149 2150
2150ide_tape_devset_rw_field(debug_mask, debug_mask); 2151ide_tape_devset_rw_field(debug_mask, debug_mask);
2151ide_tape_devset_rw_field(tdsc, best_dsc_rw_freq); 2152ide_tape_devset_rw_field(tdsc, best_dsc_rw_freq);
@@ -2192,15 +2193,19 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
2192 drive->pc_io_buffers = ide_tape_io_buffers; 2193 drive->pc_io_buffers = ide_tape_io_buffers;
2193 2194
2194 spin_lock_init(&tape->lock); 2195 spin_lock_init(&tape->lock);
2195 drive->dsc_overlap = 1; 2196
2197 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
2198
2196 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) { 2199 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) {
2197 printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n", 2200 printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n",
2198 tape->name); 2201 tape->name);
2199 drive->dsc_overlap = 0; 2202 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
2200 } 2203 }
2204
2201 /* Seagate Travan drives do not support DSC overlap. */ 2205 /* Seagate Travan drives do not support DSC overlap. */
2202 if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401")) 2206 if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401"))
2203 drive->dsc_overlap = 0; 2207 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
2208
2204 tape->minor = minor; 2209 tape->minor = minor;
2205 tape->name[0] = 'h'; 2210 tape->name[0] = 'h';
2206 tape->name[1] = 't'; 2211 tape->name[1] = 't';
@@ -2247,7 +2252,7 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
2247 (*(u16 *)&tape->caps[16] * 512) / tape->buffer_size, 2252 (*(u16 *)&tape->caps[16] * 512) / tape->buffer_size,
2248 tape->buffer_size / 1024, 2253 tape->buffer_size / 1024,
2249 tape->best_dsc_rw_freq * 1000 / HZ, 2254 tape->best_dsc_rw_freq * 1000 / HZ,
2250 drive->using_dma ? ", DMA":""); 2255 (drive->dev_flags & IDE_DFLAG_USING_DMA) ? ", DMA" : "");
2251 2256
2252 ide_proc_register_driver(drive, tape->driver); 2257 ide_proc_register_driver(drive, tape->driver);
2253} 2258}
@@ -2271,7 +2276,7 @@ static void ide_tape_release(struct kref *kref)
2271 2276
2272 BUG_ON(tape->merge_bh_size); 2277 BUG_ON(tape->merge_bh_size);
2273 2278
2274 drive->dsc_overlap = 0; 2279 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
2275 drive->driver_data = NULL; 2280 drive->driver_data = NULL;
2276 device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor)); 2281 device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
2277 device_destroy(idetape_sysfs_class, 2282 device_destroy(idetape_sysfs_class,
@@ -2386,7 +2391,8 @@ static int ide_tape_probe(ide_drive_t *drive)
2386 if (drive->media != ide_tape) 2391 if (drive->media != ide_tape)
2387 goto failed; 2392 goto failed;
2388 2393
2389 if (drive->id_read == 1 && !ide_check_atapi_device(drive, DRV_NAME)) { 2394 if ((drive->dev_flags & IDE_DFLAG_ID_READ) &&
2395 ide_check_atapi_device(drive, DRV_NAME) == 0) {
2390 printk(KERN_ERR "ide-tape: %s: not supported by this version of" 2396 printk(KERN_ERR "ide-tape: %s: not supported by this version of"
2391 " the driver\n", drive->name); 2397 " the driver\n", drive->name);
2392 goto failed; 2398 goto failed;
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 487b18b3ebae..8da8d26db7ed 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -116,7 +116,8 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
116 WAIT_WORSTCASE, NULL); 116 WAIT_WORSTCASE, NULL);
117 return ide_started; 117 return ide_started;
118 default: 118 default:
119 if (drive->using_dma == 0 || dma_ops->dma_setup(drive)) 119 if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0 ||
120 dma_ops->dma_setup(drive))
120 return ide_stopped; 121 return ide_stopped;
121 dma_ops->dma_exec_cmd(drive, tf->command); 122 dma_ops->dma_exec_cmd(drive, tf->command);
122 dma_ops->dma_start(drive); 123 dma_ops->dma_start(drive);
@@ -469,13 +470,12 @@ static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, struct request *rq)
469 if (ide_wait_stat(&startstop, drive, ATA_DRQ, 470 if (ide_wait_stat(&startstop, drive, ATA_DRQ,
470 drive->bad_wstat, WAIT_DRQ)) { 471 drive->bad_wstat, WAIT_DRQ)) {
471 printk(KERN_ERR "%s: no DRQ after issuing %sWRITE%s\n", 472 printk(KERN_ERR "%s: no DRQ after issuing %sWRITE%s\n",
472 drive->name, 473 drive->name, drive->hwif->data_phase ? "MULT" : "",
473 drive->hwif->data_phase ? "MULT" : "", 474 (drive->dev_flags & IDE_DFLAG_LBA48) ? "_EXT" : "");
474 drive->addressing ? "_EXT" : "");
475 return startstop; 475 return startstop;
476 } 476 }
477 477
478 if (!drive->unmask) 478 if ((drive->dev_flags & IDE_DFLAG_UNMASK) == 0)
479 local_irq_disable(); 479 local_irq_disable();
480 480
481 ide_set_handler(drive, &task_out_intr, WAIT_WORSTCASE, NULL); 481 ide_set_handler(drive, &task_out_intr, WAIT_WORSTCASE, NULL);
@@ -591,7 +591,7 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
591 591
592 args.tf_flags = IDE_TFLAG_IO_16BIT | IDE_TFLAG_DEVICE | 592 args.tf_flags = IDE_TFLAG_IO_16BIT | IDE_TFLAG_DEVICE |
593 IDE_TFLAG_IN_TF; 593 IDE_TFLAG_IN_TF;
594 if (drive->addressing == 1) 594 if (drive->dev_flags & IDE_DFLAG_LBA48)
595 args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_IN_HOB); 595 args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_IN_HOB);
596 596
597 if (req_task->out_flags.all) { 597 if (req_task->out_flags.all) {
@@ -694,7 +694,7 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
694 if ((args.tf_flags & IDE_TFLAG_FLAGGED_SET_IN_FLAGS) && 694 if ((args.tf_flags & IDE_TFLAG_FLAGGED_SET_IN_FLAGS) &&
695 req_task->in_flags.all == 0) { 695 req_task->in_flags.all == 0) {
696 req_task->in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; 696 req_task->in_flags.all = IDE_TASKFILE_STD_IN_FLAGS;
697 if (drive->addressing == 1) 697 if (drive->dev_flags & IDE_DFLAG_LBA48)
698 req_task->in_flags.all |= (IDE_HOB_STD_IN_FLAGS << 8); 698 req_task->in_flags.all |= (IDE_HOB_STD_IN_FLAGS << 8);
699 } 699 }
700 700
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 64997873b6d7..78776bbb537e 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -138,7 +138,7 @@ static void __ide_port_unregister_devices(ide_hwif_t *hwif)
138 for (i = 0; i < MAX_DRIVES; i++) { 138 for (i = 0; i < MAX_DRIVES; i++) {
139 ide_drive_t *drive = &hwif->drives[i]; 139 ide_drive_t *drive = &hwif->drives[i];
140 140
141 if (drive->present) { 141 if (drive->dev_flags & IDE_DFLAG_PRESENT) {
142 spin_unlock_irq(&ide_lock); 142 spin_unlock_irq(&ide_lock);
143 device_unregister(&drive->gendev); 143 device_unregister(&drive->gendev);
144 wait_for_completion(&drive->gendev_rel_comp); 144 wait_for_completion(&drive->gendev_rel_comp);
@@ -254,7 +254,7 @@ ide_devset_get(io_32bit, io_32bit);
254 254
255static int set_io_32bit(ide_drive_t *drive, int arg) 255static int set_io_32bit(ide_drive_t *drive, int arg)
256{ 256{
257 if (drive->no_io_32bit) 257 if (drive->dev_flags & IDE_DFLAG_NO_IO_32BIT)
258 return -EPERM; 258 return -EPERM;
259 259
260 if (arg < 0 || arg > 1 + (SUPPORT_VLB_SYNC << 1)) 260 if (arg < 0 || arg > 1 + (SUPPORT_VLB_SYNC << 1))
@@ -265,19 +265,22 @@ static int set_io_32bit(ide_drive_t *drive, int arg)
265 return 0; 265 return 0;
266} 266}
267 267
268ide_devset_get(ksettings, keep_settings); 268ide_devset_get_flag(ksettings, IDE_DFLAG_KEEP_SETTINGS);
269 269
270static int set_ksettings(ide_drive_t *drive, int arg) 270static int set_ksettings(ide_drive_t *drive, int arg)
271{ 271{
272 if (arg < 0 || arg > 1) 272 if (arg < 0 || arg > 1)
273 return -EINVAL; 273 return -EINVAL;
274 274
275 drive->keep_settings = arg; 275 if (arg)
276 drive->dev_flags |= IDE_DFLAG_KEEP_SETTINGS;
277 else
278 drive->dev_flags &= ~IDE_DFLAG_KEEP_SETTINGS;
276 279
277 return 0; 280 return 0;
278} 281}
279 282
280ide_devset_get(using_dma, using_dma); 283ide_devset_get_flag(using_dma, IDE_DFLAG_USING_DMA);
281 284
282static int set_using_dma(ide_drive_t *drive, int arg) 285static int set_using_dma(ide_drive_t *drive, int arg)
283{ 286{
@@ -339,17 +342,20 @@ static int set_pio_mode(ide_drive_t *drive, int arg)
339 return 0; 342 return 0;
340} 343}
341 344
342ide_devset_get(unmaskirq, unmask); 345ide_devset_get_flag(unmaskirq, IDE_DFLAG_UNMASK);
343 346
344static int set_unmaskirq(ide_drive_t *drive, int arg) 347static int set_unmaskirq(ide_drive_t *drive, int arg)
345{ 348{
346 if (drive->no_unmask) 349 if (drive->dev_flags & IDE_DFLAG_NO_UNMASK)
347 return -EPERM; 350 return -EPERM;
348 351
349 if (arg < 0 || arg > 1) 352 if (arg < 0 || arg > 1)
350 return -EINVAL; 353 return -EINVAL;
351 354
352 drive->unmask = arg; 355 if (arg)
356 drive->dev_flags |= IDE_DFLAG_UNMASK;
357 else
358 drive->dev_flags &= ~IDE_DFLAG_UNMASK;
353 359
354 return 0; 360 return 0;
355} 361}
@@ -713,16 +719,16 @@ static void ide_dev_apply_params(ide_drive_t *drive)
713 719
714 if (ide_nodma & (1 << i)) { 720 if (ide_nodma & (1 << i)) {
715 printk(KERN_INFO "ide: disallowing DMA for %s\n", drive->name); 721 printk(KERN_INFO "ide: disallowing DMA for %s\n", drive->name);
716 drive->nodma = 1; 722 drive->dev_flags |= IDE_DFLAG_NODMA;
717 } 723 }
718 if (ide_noflush & (1 << i)) { 724 if (ide_noflush & (1 << i)) {
719 printk(KERN_INFO "ide: disabling flush requests for %s\n", 725 printk(KERN_INFO "ide: disabling flush requests for %s\n",
720 drive->name); 726 drive->name);
721 drive->noflush = 1; 727 drive->dev_flags |= IDE_DFLAG_NOFLUSH;
722 } 728 }
723 if (ide_noprobe & (1 << i)) { 729 if (ide_noprobe & (1 << i)) {
724 printk(KERN_INFO "ide: skipping probe for %s\n", drive->name); 730 printk(KERN_INFO "ide: skipping probe for %s\n", drive->name);
725 drive->noprobe = 1; 731 drive->dev_flags |= IDE_DFLAG_NOPROBE;
726 } 732 }
727 if (ide_nowerr & (1 << i)) { 733 if (ide_nowerr & (1 << i)) {
728 printk(KERN_INFO "ide: ignoring the ATA_DF bit for %s\n", 734 printk(KERN_INFO "ide: ignoring the ATA_DF bit for %s\n",
@@ -731,7 +737,7 @@ static void ide_dev_apply_params(ide_drive_t *drive)
731 } 737 }
732 if (ide_cdroms & (1 << i)) { 738 if (ide_cdroms & (1 << i)) {
733 printk(KERN_INFO "ide: forcing %s as a CD-ROM\n", drive->name); 739 printk(KERN_INFO "ide: forcing %s as a CD-ROM\n", drive->name);
734 drive->present = 1; 740 drive->dev_flags |= IDE_DFLAG_PRESENT;
735 drive->media = ide_cdrom; 741 drive->media = ide_cdrom;
736 /* an ATAPI device ignores DRDY */ 742 /* an ATAPI device ignores DRDY */
737 drive->ready_stat = 0; 743 drive->ready_stat = 0;
@@ -740,11 +746,12 @@ static void ide_dev_apply_params(ide_drive_t *drive)
740 drive->cyl = drive->bios_cyl = ide_disks_chs[i].cyl; 746 drive->cyl = drive->bios_cyl = ide_disks_chs[i].cyl;
741 drive->head = drive->bios_head = ide_disks_chs[i].head; 747 drive->head = drive->bios_head = ide_disks_chs[i].head;
742 drive->sect = drive->bios_sect = ide_disks_chs[i].sect; 748 drive->sect = drive->bios_sect = ide_disks_chs[i].sect;
743 drive->forced_geom = 1; 749
744 printk(KERN_INFO "ide: forcing %s as a disk (%d/%d/%d)\n", 750 printk(KERN_INFO "ide: forcing %s as a disk (%d/%d/%d)\n",
745 drive->name, 751 drive->name,
746 drive->cyl, drive->head, drive->sect); 752 drive->cyl, drive->head, drive->sect);
747 drive->present = 1; 753
754 drive->dev_flags |= IDE_DFLAG_FORCED_GEOM | IDE_DFLAG_PRESENT;
748 drive->media = ide_disk; 755 drive->media = ide_disk;
749 drive->ready_stat = ATA_DRDY; 756 drive->ready_stat = ATA_DRDY;
750 } 757 }
diff --git a/drivers/ide/legacy/ht6560b.c b/drivers/ide/legacy/ht6560b.c
index 5123ea291d07..c7e5c2246b79 100644
--- a/drivers/ide/legacy/ht6560b.c
+++ b/drivers/ide/legacy/ht6560b.c
@@ -120,7 +120,8 @@ static void ht6560b_selectproc (ide_drive_t *drive)
120 * Need to enforce prefetch sometimes because otherwise 120 * Need to enforce prefetch sometimes because otherwise
121 * it'll hang (hard). 121 * it'll hang (hard).
122 */ 122 */
123 if (drive->media != ide_disk || !drive->present) 123 if (drive->media != ide_disk ||
124 (drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
124 select |= HT_PREFETCH_MODE; 125 select |= HT_PREFETCH_MODE;
125 126
126 if (select != current_select || timing != current_timing) { 127 if (select != current_select || timing != current_timing) {
@@ -249,11 +250,11 @@ static void ht_set_prefetch(ide_drive_t *drive, u8 state)
249 */ 250 */
250 if (state) { 251 if (state) {
251 drive->drive_data |= t; /* enable prefetch mode */ 252 drive->drive_data |= t; /* enable prefetch mode */
252 drive->no_unmask = 1; 253 drive->dev_flags |= IDE_DFLAG_NO_UNMASK;
253 drive->unmask = 0; 254 drive->dev_flags &= ~IDE_DFLAG_UNMASK;
254 } else { 255 } else {
255 drive->drive_data &= ~t; /* disable prefetch mode */ 256 drive->drive_data &= ~t; /* disable prefetch mode */
256 drive->no_unmask = 0; 257 drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK;
257 } 258 }
258 259
259 spin_unlock_irqrestore(&ht6560b_lock, flags); 260 spin_unlock_irqrestore(&ht6560b_lock, flags);
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
index 824471f91bf5..7dbc692c84c3 100644
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -92,7 +92,7 @@ static void amd_set_drive(ide_drive_t *drive, const u8 speed)
92 92
93 ide_timing_compute(drive, speed, &t, T, UT); 93 ide_timing_compute(drive, speed, &t, T, UT);
94 94
95 if (peer->present) { 95 if (peer->dev_flags & IDE_DFLAG_PRESENT) {
96 ide_timing_compute(peer, peer->current_speed, &p, T, UT); 96 ide_timing_compute(peer, peer->current_speed, &p, T, UT);
97 ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); 97 ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT);
98 } 98 }
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c
index 7f39cdb41410..d3afdffcb07a 100644
--- a/drivers/ide/pci/cmd640.c
+++ b/drivers/ide/pci/cmd640.c
@@ -378,13 +378,13 @@ static void __set_prefetch_mode(ide_drive_t *drive, int mode)
378{ 378{
379 if (mode) { /* want prefetch on? */ 379 if (mode) { /* want prefetch on? */
380#if CMD640_PREFETCH_MASKS 380#if CMD640_PREFETCH_MASKS
381 drive->no_unmask = 1; 381 drive->dev_flags |= IDE_DFLAG_NO_UNMASK;
382 drive->unmask = 0; 382 drive->dev_flags &= ~IDE_DFLAG_UNMASK;
383#endif 383#endif
384 drive->no_io_32bit = 0; 384 drive->dev_flags &= ~IDE_DFLAG_NO_IO_32BIT;
385 } else { 385 } else {
386 drive->no_unmask = 0; 386 drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK;
387 drive->no_io_32bit = 1; 387 drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT;
388 drive->io_32bit = 0; 388 drive->io_32bit = 0;
389 } 389 }
390} 390}
@@ -471,7 +471,7 @@ static void program_drive_counts(ide_drive_t *drive, unsigned int index)
471 ide_drive_t *peer = &hwif->drives[!drive->select.b.unit]; 471 ide_drive_t *peer = &hwif->drives[!drive->select.b.unit];
472 unsigned int mate = index ^ 1; 472 unsigned int mate = index ^ 1;
473 473
474 if (peer->present) { 474 if (peer->dev_flags & IDE_DFLAG_PRESENT) {
475 if (setup_count < setup_counts[mate]) 475 if (setup_count < setup_counts[mate])
476 setup_count = setup_counts[mate]; 476 setup_count = setup_counts[mate];
477 if (active_count < active_counts[mate]) 477 if (active_count < active_counts[mate])
@@ -626,7 +626,7 @@ static void cmd640_init_dev(ide_drive_t *drive)
626 */ 626 */
627 check_prefetch(drive, i); 627 check_prefetch(drive, i);
628 printk(KERN_INFO DRV_NAME ": drive%d timings/prefetch(%s) preserved\n", 628 printk(KERN_INFO DRV_NAME ": drive%d timings/prefetch(%s) preserved\n",
629 i, drive->no_io_32bit ? "off" : "on"); 629 i, (drive->dev_flags & IDE_DFLAG_NO_IO_32BIT) ? "off" : "on");
630#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ 630#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
631} 631}
632 632
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
index 46edd083b348..b761015ee190 100644
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -454,7 +454,7 @@ static void it821x_quirkproc(ide_drive_t *drive)
454 * IRQ mask as we may well be in PIO (eg rev 0x10) 454 * IRQ mask as we may well be in PIO (eg rev 0x10)
455 * for now and we know unmasking is safe on this chipset. 455 * for now and we know unmasking is safe on this chipset.
456 */ 456 */
457 drive->unmask = 1; 457 drive->dev_flags |= IDE_DFLAG_UNMASK;
458 } else { 458 } else {
459 /* 459 /*
460 * Perform fixups on smart mode. We need to "lose" some 460 * Perform fixups on smart mode. We need to "lose" some
diff --git a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c
index 53bd645736d9..99e98e5e271c 100644
--- a/drivers/ide/pci/ns87415.c
+++ b/drivers/ide/pci/ns87415.c
@@ -137,7 +137,7 @@ static void __devinit superio_init_iops(struct hwif_s *hwif)
137static unsigned int ns87415_count = 0, ns87415_control[MAX_HWIFS] = { 0 }; 137static unsigned int ns87415_count = 0, ns87415_control[MAX_HWIFS] = { 0 };
138 138
139/* 139/*
140 * This routine either enables/disables (according to drive->present) 140 * This routine either enables/disables (according to IDE_DFLAG_PRESENT)
141 * the IRQ associated with the port (HWIF(drive)), 141 * the IRQ associated with the port (HWIF(drive)),
142 * and selects either PIO or DMA handshaking for the next I/O operation. 142 * and selects either PIO or DMA handshaking for the next I/O operation.
143 */ 143 */
@@ -153,7 +153,11 @@ static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
153 153
154 /* Adjust IRQ enable bit */ 154 /* Adjust IRQ enable bit */
155 bit = 1 << (8 + hwif->channel); 155 bit = 1 << (8 + hwif->channel);
156 new = drive->present ? (new & ~bit) : (new | bit); 156
157 if (drive->dev_flags & IDE_DFLAG_PRESENT)
158 new &= ~bit;
159 else
160 new |= bit;
157 161
158 /* Select PIO or DMA, DMA may only be selected for one drive/channel. */ 162 /* Select PIO or DMA, DMA may only be selected for one drive/channel. */
159 bit = 1 << (20 + drive->select.b.unit + (hwif->channel << 1)); 163 bit = 1 << (20 + drive->select.b.unit + (hwif->channel << 1));
@@ -187,7 +191,8 @@ static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
187 191
188static void ns87415_selectproc (ide_drive_t *drive) 192static void ns87415_selectproc (ide_drive_t *drive)
189{ 193{
190 ns87415_prepare_drive (drive, drive->using_dma); 194 ns87415_prepare_drive(drive,
195 !!(drive->dev_flags & IDE_DFLAG_USING_DMA));
191} 196}
192 197
193static int ns87415_dma_end(ide_drive_t *drive) 198static int ns87415_dma_end(ide_drive_t *drive)
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c
index cb6d2a00c514..6d9240a9dcfa 100644
--- a/drivers/ide/pci/pdc202xx_old.c
+++ b/drivers/ide/pci/pdc202xx_old.c
@@ -168,7 +168,7 @@ static void pdc202xx_dma_start(ide_drive_t *drive)
168{ 168{
169 if (drive->current_speed > XFER_UDMA_2) 169 if (drive->current_speed > XFER_UDMA_2)
170 pdc_old_enable_66MHz_clock(drive->hwif); 170 pdc_old_enable_66MHz_clock(drive->hwif);
171 if (drive->media != ide_disk || drive->addressing == 1) { 171 if (drive->media != ide_disk || (drive->dev_flags & IDE_DFLAG_LBA48)) {
172 struct request *rq = HWGROUP(drive)->rq; 172 struct request *rq = HWGROUP(drive)->rq;
173 ide_hwif_t *hwif = HWIF(drive); 173 ide_hwif_t *hwif = HWIF(drive);
174 unsigned long high_16 = hwif->extra_base - 16; 174 unsigned long high_16 = hwif->extra_base - 16;
@@ -188,7 +188,7 @@ static void pdc202xx_dma_start(ide_drive_t *drive)
188 188
189static int pdc202xx_dma_end(ide_drive_t *drive) 189static int pdc202xx_dma_end(ide_drive_t *drive)
190{ 190{
191 if (drive->media != ide_disk || drive->addressing == 1) { 191 if (drive->media != ide_disk || (drive->dev_flags & IDE_DFLAG_LBA48)) {
192 ide_hwif_t *hwif = HWIF(drive); 192 ide_hwif_t *hwif = HWIF(drive);
193 unsigned long high_16 = hwif->extra_base - 16; 193 unsigned long high_16 = hwif->extra_base - 16;
194 unsigned long atapi_reg = high_16 + (hwif->channel ? 0x24 : 0x20); 194 unsigned long atapi_reg = high_16 + (hwif->channel ? 0x24 : 0x20);
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c
index bdc1fed41260..50405ed6f0cb 100644
--- a/drivers/ide/pci/sc1200.c
+++ b/drivers/ide/pci/sc1200.c
@@ -216,7 +216,8 @@ static void sc1200_set_pio_mode(ide_drive_t *drive, const u8 pio)
216 if (mode != -1) { 216 if (mode != -1) {
217 printk("SC1200: %s: changing (U)DMA mode\n", drive->name); 217 printk("SC1200: %s: changing (U)DMA mode\n", drive->name);
218 ide_dma_off_quietly(drive); 218 ide_dma_off_quietly(drive);
219 if (ide_set_dma_mode(drive, mode) == 0 && drive->using_dma) 219 if (ide_set_dma_mode(drive, mode) == 0 &&
220 (drive->dev_flags & IDE_DFLAG_USING_DMA))
220 hwif->dma_ops->dma_host_set(drive, 1); 221 hwif->dma_ops->dma_host_set(drive, 1);
221 return; 222 return;
222 } 223 }
diff --git a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c
index 4dfbc6a68b5b..c12ffbb28748 100644
--- a/drivers/ide/pci/trm290.c
+++ b/drivers/ide/pci/trm290.c
@@ -161,7 +161,7 @@ static void trm290_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
161 } 161 }
162 162
163 /* enable IRQ if not probing */ 163 /* enable IRQ if not probing */
164 if (drive->present) { 164 if (drive->dev_flags & IDE_DFLAG_PRESENT) {
165 reg = inw(hwif->config_data + 3); 165 reg = inw(hwif->config_data + 3);
166 reg &= 0x13; 166 reg &= 0x13;
167 reg &= ~(1 << hwif->channel); 167 reg &= ~(1 << hwif->channel);
@@ -173,7 +173,7 @@ static void trm290_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
173 173
174static void trm290_selectproc (ide_drive_t *drive) 174static void trm290_selectproc (ide_drive_t *drive)
175{ 175{
176 trm290_prepare_drive(drive, drive->using_dma); 176 trm290_prepare_drive(drive, !!(drive->dev_flags & IDE_DFLAG_USING_DMA));
177} 177}
178 178
179static void trm290_dma_exec_cmd(ide_drive_t *drive, u8 command) 179static void trm290_dma_exec_cmd(ide_drive_t *drive, u8 command)
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c
index c3432da78d52..0a6d40cebe47 100644
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -966,11 +966,11 @@ static void pmac_ide_init_dev(ide_drive_t *drive)
966 if (pmif->mediabay) { 966 if (pmif->mediabay) {
967#ifdef CONFIG_PMAC_MEDIABAY 967#ifdef CONFIG_PMAC_MEDIABAY
968 if (check_media_bay_by_base(pmif->regbase, MB_CD) == 0) { 968 if (check_media_bay_by_base(pmif->regbase, MB_CD) == 0) {
969 drive->noprobe = 0; 969 drive->dev_flags &= ~IDE_DFLAG_NOPROBE;
970 return; 970 return;
971 } 971 }
972#endif 972#endif
973 drive->noprobe = 1; 973 drive->dev_flags |= IDE_DFLAG_NOPROBE;
974 } 974 }
975} 975}
976 976
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 7d3d03f98914..67e9ed95f669 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -331,7 +331,8 @@ static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *r
331 if (blk_sense_request(rq) || blk_special_request(rq)) { 331 if (blk_sense_request(rq) || blk_special_request(rq)) {
332 struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special; 332 struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special;
333 333
334 if (drive->using_dma && !idescsi_map_sg(drive, pc)) 334 if ((drive->dev_flags & IDE_DFLAG_USING_DMA) &&
335 idescsi_map_sg(drive, pc) == 0)
335 pc->flags |= PC_FLAG_DMA_OK; 336 pc->flags |= PC_FLAG_DMA_OK;
336 337
337 return idescsi_issue_pc(drive, pc); 338 return idescsi_issue_pc(drive, pc);
@@ -415,7 +416,7 @@ static void ide_scsi_remove(ide_drive_t *drive)
415 416
416 ide_scsi_put(scsi); 417 ide_scsi_put(scsi);
417 418
418 drive->scsi = 0; 419 drive->dev_flags &= ~IDE_DFLAG_SCSI;
419} 420}
420 421
421static int ide_scsi_probe(ide_drive_t *); 422static int ide_scsi_probe(ide_drive_t *);
@@ -767,7 +768,7 @@ static int ide_scsi_probe(ide_drive_t *drive)
767 !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t)))) 768 !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t))))
768 return -ENODEV; 769 return -ENODEV;
769 770
770 drive->scsi = 1; 771 drive->dev_flags |= IDE_DFLAG_SCSI;
771 772
772 g = alloc_disk(1 << PARTN_BITS); 773 g = alloc_disk(1 << PARTN_BITS);
773 if (!g) 774 if (!g)
@@ -808,7 +809,7 @@ static int ide_scsi_probe(ide_drive_t *drive)
808 809
809 put_disk(g); 810 put_disk(g);
810out_host_put: 811out_host_put:
811 drive->scsi = 0; 812 drive->dev_flags &= ~IDE_DFLAG_SCSI;
812 scsi_host_put(host); 813 scsi_host_put(host);
813 return err; 814 return err;
814} 815}
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 90d53c99fe92..b538d2e6dcbb 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -459,6 +459,55 @@ enum {
459 IDE_AFLAG_NO_AUTOCLOSE = (1 << 29), 459 IDE_AFLAG_NO_AUTOCLOSE = (1 << 29),
460}; 460};
461 461
462/* device flags */
463enum {
464 /* restore settings after device reset */
465 IDE_DFLAG_KEEP_SETTINGS = (1 << 0),
466 /* device is using DMA for read/write */
467 IDE_DFLAG_USING_DMA = (1 << 1),
468 /* okay to unmask other IRQs */
469 IDE_DFLAG_UNMASK = (1 << 2),
470 /* don't attempt flushes */
471 IDE_DFLAG_NOFLUSH = (1 << 3),
472 /* DSC overlap */
473 IDE_DFLAG_DSC_OVERLAP = (1 << 4),
474 /* give potential excess bandwidth */
475 IDE_DFLAG_NICE1 = (1 << 5),
476 /* device is physically present */
477 IDE_DFLAG_PRESENT = (1 << 6),
478 /* device ejected hint */
479 IDE_DFLAG_DEAD = (1 << 7),
480 /* id read from device (synthetic if not set) */
481 IDE_DFLAG_ID_READ = (1 << 8),
482 IDE_DFLAG_NOPROBE = (1 << 9),
483 /* need to do check_media_change() */
484 IDE_DFLAG_REMOVABLE = (1 << 10),
485 /* needed for removable devices */
486 IDE_DFLAG_ATTACH = (1 << 11),
487 IDE_DFLAG_FORCED_GEOM = (1 << 12),
488 /* disallow setting unmask bit */
489 IDE_DFLAG_NO_UNMASK = (1 << 13),
490 /* disallow enabling 32-bit I/O */
491 IDE_DFLAG_NO_IO_32BIT = (1 << 14),
492 /* for removable only: door lock/unlock works */
493 IDE_DFLAG_DOORLOCKING = (1 << 15),
494 /* disallow DMA */
495 IDE_DFLAG_NODMA = (1 << 16),
496 /* powermanagment told us not to do anything, so sleep nicely */
497 IDE_DFLAG_BLOCKED = (1 << 17),
498 /* ide-scsi emulation */
499 IDE_DFLAG_SCSI = (1 << 18),
500 /* sleeping & sleep field valid */
501 IDE_DFLAG_SLEEPING = (1 << 19),
502 IDE_DFLAG_POST_RESET = (1 << 20),
503 IDE_DFLAG_UDMA33_WARNED = (1 << 21),
504 IDE_DFLAG_LBA48 = (1 << 22),
505 /* status of write cache */
506 IDE_DFLAG_WCACHE = (1 << 23),
507 /* used for ignoring ATA_DF */
508 IDE_DFLAG_NOWERR = (1 << 24),
509};
510
462struct ide_drive_s { 511struct ide_drive_s {
463 char name[4]; /* drive name, such as "hda" */ 512 char name[4]; /* drive name, such as "hda" */
464 char driver_req[10]; /* requests specific driver */ 513 char driver_req[10]; /* requests specific driver */
@@ -475,6 +524,8 @@ struct ide_drive_s {
475#endif 524#endif
476 struct hwif_s *hwif; /* actually (ide_hwif_t *) */ 525 struct hwif_s *hwif; /* actually (ide_hwif_t *) */
477 526
527 unsigned long dev_flags;
528
478 unsigned long sleep; /* sleep until this time */ 529 unsigned long sleep; /* sleep until this time */
479 unsigned long service_start; /* time we started last request */ 530 unsigned long service_start; /* time we started last request */
480 unsigned long service_time; /* service time of last request */ 531 unsigned long service_time; /* service time of last request */
@@ -487,32 +538,6 @@ struct ide_drive_s {
487 u8 state; /* retry state */ 538 u8 state; /* retry state */
488 u8 waiting_for_dma; /* dma currently in progress */ 539 u8 waiting_for_dma; /* dma currently in progress */
489 540
490 unsigned keep_settings : 1; /* restore settings after drive reset */
491 unsigned using_dma : 1; /* disk is using dma for read/write */
492 unsigned unmask : 1; /* okay to unmask other irqs */
493 unsigned noflush : 1; /* don't attempt flushes */
494 unsigned dsc_overlap : 1; /* DSC overlap */
495 unsigned nice1 : 1; /* give potential excess bandwidth */
496 unsigned present : 1; /* drive is physically present */
497 unsigned dead : 1; /* device ejected hint */
498 unsigned id_read : 1; /* 1=id read from disk 0 = synthetic */
499 unsigned noprobe : 1; /* from: hdx=noprobe */
500 unsigned removable : 1; /* 1 if need to do check_media_change */
501 unsigned attach : 1; /* needed for removable devices */
502 unsigned forced_geom : 1; /* 1 if hdx=c,h,s was given at boot */
503 unsigned no_unmask : 1; /* disallow setting unmask bit */
504 unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */
505 unsigned doorlocking : 1; /* for removable only: door lock/unlock works */
506 unsigned nodma : 1; /* disallow DMA */
507 unsigned blocked : 1; /* 1=powermanagment told us not to do anything, so sleep nicely */
508 unsigned scsi : 1; /* 0=default, 1=ide-scsi emulation */
509 unsigned sleeping : 1; /* 1=sleeping & sleep field valid */
510 unsigned post_reset : 1;
511 unsigned udma33_warned : 1;
512 unsigned addressing : 1; /* 0=28-bit, 1=48-bit */
513 unsigned wcache : 1; /* status of write cache */
514 unsigned nowerr : 1; /* used for ignoring ATA_DF */
515
516 u8 quirk_list; /* considered quirky, set for a specific host */ 541 u8 quirk_list; /* considered quirky, set for a specific host */
517 u8 init_speed; /* transfer rate set at boot */ 542 u8 init_speed; /* transfer rate set at boot */
518 u8 current_speed; /* current transfer rate set */ 543 u8 current_speed; /* current transfer rate set */
@@ -826,6 +851,22 @@ static int set_##name(ide_drive_t *drive, int arg) \
826 return 0; \ 851 return 0; \
827} 852}
828 853
854#define ide_devset_get_flag(name, flag) \
855static int get_##name(ide_drive_t *drive) \
856{ \
857 return !!(drive->dev_flags & flag); \
858}
859
860#define ide_devset_set_flag(name, flag) \
861static int set_##name(ide_drive_t *drive, int arg) \
862{ \
863 if (arg) \
864 drive->dev_flags |= flag; \
865 else \
866 drive->dev_flags &= ~flag; \
867 return 0; \
868}
869
829#define __IDE_DEVSET(_name, _flags, _get, _set) \ 870#define __IDE_DEVSET(_name, _flags, _get, _set) \
830const struct ide_devset ide_devset_##_name = \ 871const struct ide_devset ide_devset_##_name = \
831 __DEVSET(_flags, _get, _set) 872 __DEVSET(_flags, _get, _set)
@@ -861,6 +902,11 @@ ide_devset_get(_name, _field); \
861ide_devset_set(_name, _field); \ 902ide_devset_set(_name, _field); \
862IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name) 903IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name)
863 904
905#define ide_devset_rw_flag(_name, _field) \
906ide_devset_get_flag(_name, _field); \
907ide_devset_set_flag(_name, _field); \
908IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name)
909
864struct ide_proc_devset { 910struct ide_proc_devset {
865 const char *name; 911 const char *name;
866 const struct ide_devset *setting; 912 const struct ide_devset *setting;
@@ -1587,6 +1633,6 @@ static inline ide_drive_t *ide_get_pair_dev(ide_drive_t *drive)
1587{ 1633{
1588 ide_drive_t *peer = &drive->hwif->drives[(drive->dn ^ 1) & 1]; 1634 ide_drive_t *peer = &drive->hwif->drives[(drive->dn ^ 1) & 1];
1589 1635
1590 return peer->present ? peer : NULL; 1636 return (peer->dev_flags & IDE_DFLAG_PRESENT) ? peer : NULL;
1591} 1637}
1592#endif /* _IDE_H */ 1638#endif /* _IDE_H */