Lines Matching +full:tf +full:- +full:a
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 1994-1998 Linus Torvalds & authors (see below)
4 * Copyright (C) 1998-2002 Linux ATA Development
5 * Andre Hedrick <andre@linux-ide.org>
7 * Copyright (C) 2003-2005, 2007 Bartlomiej Zolnierkiewicz
13 * and Andre Hedrick <andre@linux-ide.org>
39 #include "ide-disk.h"
60 lba48 = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 2 : 0; in ide_tf_set_cmd()
61 write = (cmd->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0; in ide_tf_set_cmd()
64 cmd->protocol = ATA_PROT_DMA; in ide_tf_set_cmd()
67 cmd->protocol = ATA_PROT_PIO; in ide_tf_set_cmd()
68 if (drive->mult_count) { in ide_tf_set_cmd()
69 cmd->tf_flags |= IDE_TFLAG_MULTI_PIO; in ide_tf_set_cmd()
75 cmd->tf.command = ide_rw_cmds[index + lba48 + write]; in ide_tf_set_cmd()
79 * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
85 ide_hwif_t *hwif = drive->hwif; in __ide_do_rw_disk()
87 u8 lba48 = !!(drive->dev_flags & IDE_DFLAG_LBA48); in __ide_do_rw_disk()
88 u8 dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA); in __ide_do_rw_disk()
90 struct ide_taskfile *tf = &cmd.tf; in __ide_do_rw_disk() local
93 if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && lba48 && dma) { in __ide_do_rw_disk()
101 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in __ide_do_rw_disk()
102 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in __ide_do_rw_disk()
104 if (drive->dev_flags & IDE_DFLAG_LBA) { in __ide_do_rw_disk()
106 pr_debug("%s: LBA=0x%012llx\n", drive->name, in __ide_do_rw_disk()
109 tf->nsect = nsectors & 0xff; in __ide_do_rw_disk()
110 tf->lbal = (u8) block; in __ide_do_rw_disk()
111 tf->lbam = (u8)(block >> 8); in __ide_do_rw_disk()
112 tf->lbah = (u8)(block >> 16); in __ide_do_rw_disk()
113 tf->device = ATA_LBA; in __ide_do_rw_disk()
115 tf = &cmd.hob; in __ide_do_rw_disk()
116 tf->nsect = (nsectors >> 8) & 0xff; in __ide_do_rw_disk()
117 tf->lbal = (u8)(block >> 24); in __ide_do_rw_disk()
119 tf->lbam = (u8)((u64)block >> 32); in __ide_do_rw_disk()
120 tf->lbah = (u8)((u64)block >> 40); in __ide_do_rw_disk()
127 tf->nsect = nsectors & 0xff; in __ide_do_rw_disk()
128 tf->lbal = block; in __ide_do_rw_disk()
129 tf->lbam = block >>= 8; in __ide_do_rw_disk()
130 tf->lbah = block >>= 8; in __ide_do_rw_disk()
131 tf->device = ((block >> 8) & 0xf) | ATA_LBA; in __ide_do_rw_disk()
136 track = (int)block / drive->sect; in __ide_do_rw_disk()
137 sect = (int)block % drive->sect + 1; in __ide_do_rw_disk()
138 head = track % drive->head; in __ide_do_rw_disk()
139 cyl = track / drive->head; in __ide_do_rw_disk()
141 pr_debug("%s: CHS=%u/%u/%u\n", drive->name, cyl, head, sect); in __ide_do_rw_disk()
143 tf->nsect = nsectors & 0xff; in __ide_do_rw_disk()
144 tf->lbal = sect; in __ide_do_rw_disk()
145 tf->lbam = cyl; in __ide_do_rw_disk()
146 tf->lbah = cyl >> 8; in __ide_do_rw_disk()
147 tf->device = head; in __ide_do_rw_disk()
185 ide_hwif_t *hwif = drive->hwif; in ide_do_rw_disk()
187 BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED); in ide_do_rw_disk()
193 drive->name, rq_data_dir(rq) == READ ? "read" : "writ", in ide_do_rw_disk()
196 if (hwif->rw_disk) in ide_do_rw_disk()
197 hwif->rw_disk(drive, rq); in ide_do_rw_disk()
209 struct ide_taskfile *tf = &cmd.tf; in idedisk_read_native_max_address() local
214 tf->command = ATA_CMD_READ_NATIVE_MAX_EXT; in idedisk_read_native_max_address()
216 tf->command = ATA_CMD_READ_NATIVE_MAX; in idedisk_read_native_max_address()
217 tf->device = ATA_LBA; in idedisk_read_native_max_address()
219 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in idedisk_read_native_max_address()
220 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in idedisk_read_native_max_address()
230 if (!(tf->status & ATA_ERR)) in idedisk_read_native_max_address()
243 struct ide_taskfile *tf = &cmd.tf; in idedisk_set_max_address() local
246 addr_req--; in idedisk_set_max_address()
249 tf->lbal = (addr_req >> 0) & 0xff; in idedisk_set_max_address()
250 tf->lbam = (addr_req >>= 8) & 0xff; in idedisk_set_max_address()
251 tf->lbah = (addr_req >>= 8) & 0xff; in idedisk_set_max_address()
256 tf->command = ATA_CMD_SET_MAX_EXT; in idedisk_set_max_address()
258 tf->device = (addr_req >>= 8) & 0x0f; in idedisk_set_max_address()
259 tf->command = ATA_CMD_SET_MAX; in idedisk_set_max_address()
261 tf->device |= ATA_LBA; in idedisk_set_max_address()
263 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in idedisk_set_max_address()
264 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in idedisk_set_max_address()
274 if (!(tf->status & ATA_ERR)) in idedisk_set_max_address()
302 capacity = drive->capacity64; in ide_disk_hpa_get_native_capacity()
305 if (ide_in_drive_list(drive->id, hpa_list)) { in ide_disk_hpa_get_native_capacity()
311 set_max--; in ide_disk_hpa_get_native_capacity()
321 drive->capacity64 = set_max; in ide_disk_hpa_set_capacity()
329 int lba48 = ata_id_lba48_enabled(drive->id); in idedisk_check_hpa()
331 capacity = drive->capacity64; in idedisk_check_hpa()
337 drive->probed_capacity = set_max; in idedisk_check_hpa()
342 drive->name, in idedisk_check_hpa()
346 if ((drive->dev_flags & IDE_DFLAG_NOHPA) == 0) in idedisk_check_hpa()
352 drive->name); in idedisk_check_hpa()
357 u16 *id = drive->id; in ide_disk_get_capacity()
361 /* drive speaks 48-bit LBA */ in ide_disk_get_capacity()
363 drive->capacity64 = ata_id_u64(id, ATA_ID_LBA_CAPACITY_2); in ide_disk_get_capacity()
365 /* drive speaks 28-bit LBA */ in ide_disk_get_capacity()
367 drive->capacity64 = ata_id_u32(id, ATA_ID_LBA_CAPACITY); in ide_disk_get_capacity()
369 /* drive speaks boring old 28-bit CHS */ in ide_disk_get_capacity()
371 drive->capacity64 = drive->cyl * drive->head * drive->sect; in ide_disk_get_capacity()
374 drive->probed_capacity = drive->capacity64; in ide_disk_get_capacity()
377 drive->dev_flags |= IDE_DFLAG_LBA; in ide_disk_get_capacity()
388 if ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 && in ide_disk_get_capacity()
389 drive->capacity64 > 1ULL << 28) { in ide_disk_get_capacity()
390 printk(KERN_WARNING "%s: cannot use LBA48 - full capacity " in ide_disk_get_capacity()
392 drive->name, (unsigned long long)drive->capacity64, in ide_disk_get_capacity()
393 sectors_to_MB(drive->capacity64)); in ide_disk_get_capacity()
394 drive->probed_capacity = drive->capacity64 = 1ULL << 28; in ide_disk_get_capacity()
397 if ((drive->hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && in ide_disk_get_capacity()
398 (drive->dev_flags & IDE_DFLAG_LBA48)) { in ide_disk_get_capacity()
399 if (drive->capacity64 > 1ULL << 28) { in ide_disk_get_capacity()
400 printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode" in ide_disk_get_capacity()
402 "> %u\n", drive->name, 1 << 28); in ide_disk_get_capacity()
404 drive->dev_flags &= ~IDE_DFLAG_LBA48; in ide_disk_get_capacity()
412 u16 *id = drive->id; in ide_disk_unlock_native_capacity()
415 if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 || in ide_disk_unlock_native_capacity()
421 * immediately preceded by a READ NATIVE MAX ADDRESS command in ide_disk_unlock_native_capacity()
426 if (ide_disk_hpa_set_capacity(drive, drive->probed_capacity, lba48)) in ide_disk_unlock_native_capacity()
427 drive->dev_flags |= IDE_DFLAG_NOHPA; /* disable HPA on resume */ in ide_disk_unlock_native_capacity()
437 if (ide_req(rq)->special) { in idedisk_prep_rq()
438 cmd = ide_req(rq)->special; in idedisk_prep_rq()
444 /* FIXME: map struct ide_taskfile on rq->cmd[] */ in idedisk_prep_rq()
447 if (ata_id_flush_ext_enabled(drive->id) && in idedisk_prep_rq()
448 (drive->capacity64 >= (1UL << 28))) in idedisk_prep_rq()
449 cmd->tf.command = ATA_CMD_FLUSH_EXT; in idedisk_prep_rq()
451 cmd->tf.command = ATA_CMD_FLUSH; in idedisk_prep_rq()
452 cmd->valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in idedisk_prep_rq()
453 cmd->tf_flags = IDE_TFLAG_DYN; in idedisk_prep_rq()
454 cmd->protocol = ATA_PROT_NODATA; in idedisk_prep_rq()
455 rq->cmd_flags &= ~REQ_OP_MASK; in idedisk_prep_rq()
456 rq->cmd_flags |= REQ_OP_DRV_OUT; in idedisk_prep_rq()
457 ide_req(rq)->type = ATA_PRIV_TASKFILE; in idedisk_prep_rq()
458 ide_req(rq)->special = cmd; in idedisk_prep_rq()
459 cmd->rq = rq; in idedisk_prep_rq()
467 * This is tightly woven into the driver->do_special can not touch.
468 * DON'T do it again until a total personality rewrite is committed.
474 if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff)) in set_multcount()
475 return -EINVAL; in set_multcount()
477 if (drive->special_flags & IDE_SFLAG_SET_MULTMODE) in set_multcount()
478 return -EBUSY; in set_multcount()
480 rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0); in set_multcount()
481 ide_req(rq)->type = ATA_PRIV_TASKFILE; in set_multcount()
483 drive->mult_req = arg; in set_multcount()
484 drive->special_flags |= IDE_SFLAG_SET_MULTMODE; in set_multcount()
485 blk_execute_rq(drive->queue, NULL, rq, 0); in set_multcount()
488 return (drive->mult_count == arg) ? 0 : -EIO; in set_multcount()
496 return -EINVAL; in set_nowerr()
499 drive->dev_flags |= IDE_DFLAG_NOWERR; in set_nowerr()
501 drive->dev_flags &= ~IDE_DFLAG_NOWERR; in set_nowerr()
503 drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT; in set_nowerr()
513 cmd.tf.feature = feature; in ide_do_setfeature()
514 cmd.tf.nsect = nsect; in ide_do_setfeature()
515 cmd.tf.command = ATA_CMD_SET_FEATURES; in ide_do_setfeature()
516 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in ide_do_setfeature()
517 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in ide_do_setfeature()
524 u16 *id = drive->id; in update_flush()
527 if (drive->dev_flags & IDE_DFLAG_WCACHE) { in update_flush()
531 * We must avoid issuing commands a drive does not in update_flush()
540 (drive->dev_flags & IDE_DFLAG_NOFLUSH) == 0 && in update_flush()
541 ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 || in update_flush()
546 drive->name, barrier ? "" : "not "); in update_flush()
550 drive->prep_rq = idedisk_prep_rq; in update_flush()
554 blk_queue_write_cache(drive->queue, wc, false); in update_flush()
564 return -EINVAL; in set_wcache()
566 if (ata_id_flush_enabled(drive->id)) { in set_wcache()
571 drive->dev_flags |= IDE_DFLAG_WCACHE; in set_wcache()
573 drive->dev_flags &= ~IDE_DFLAG_WCACHE; in set_wcache()
587 if (ata_id_flush_ext_enabled(drive->id)) in do_idedisk_flushcache()
588 cmd.tf.command = ATA_CMD_FLUSH_EXT; in do_idedisk_flushcache()
590 cmd.tf.command = ATA_CMD_FLUSH; in do_idedisk_flushcache()
591 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in do_idedisk_flushcache()
592 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in do_idedisk_flushcache()
602 return -EINVAL; in set_acoustic()
607 drive->acoustic = arg; in set_acoustic()
615 * drive->addressing:
616 * 0: 28-bit
617 * 1: 48-bit
618 * 2: 48-bit capable doing 28-bit
623 return -EINVAL; in set_addressing()
625 if (arg && ((drive->hwif->host_flags & IDE_HFLAG_NO_LBA48) || in set_addressing()
626 ata_id_lba48_enabled(drive->id) == 0)) in set_addressing()
627 return -EIO; in set_addressing()
633 drive->dev_flags |= IDE_DFLAG_LBA48; in set_addressing()
635 drive->dev_flags &= ~IDE_DFLAG_LBA48; in set_addressing()
654 struct ide_disk_obj *idkp = drive->driver_data; in ide_disk_setup()
655 struct request_queue *q = drive->queue; in ide_disk_setup()
656 ide_hwif_t *hwif = drive->hwif; in ide_disk_setup()
657 u16 *id = drive->id; in ide_disk_setup()
661 ide_proc_register_driver(drive, idkp->driver); in ide_disk_setup()
663 if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) in ide_disk_setup()
666 if (drive->dev_flags & IDE_DFLAG_REMOVABLE) { in ide_disk_setup()
671 drive->dev_flags |= IDE_DFLAG_DOORLOCKING; in ide_disk_setup()
676 if (drive->dev_flags & IDE_DFLAG_LBA48) { in ide_disk_setup()
679 if (max_s > hwif->rqsize) in ide_disk_setup()
680 max_s = hwif->rqsize; in ide_disk_setup()
685 printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name, in ide_disk_setup()
702 if ((drive->dev_flags & IDE_DFLAG_FORCED_GEOM) == 0) { in ide_disk_setup()
703 if (ata_id_lba48_enabled(drive->id)) { in ide_disk_setup()
705 drive->bios_sect = 63; in ide_disk_setup()
706 drive->bios_head = 255; in ide_disk_setup()
709 if (drive->bios_sect && drive->bios_head) { in ide_disk_setup()
714 drive->bios_cyl = 65535; in ide_disk_setup()
716 cylsz = drive->bios_sect * drive->bios_head; in ide_disk_setup()
720 if (cyl > drive->bios_cyl) in ide_disk_setup()
721 drive->bios_cyl = cyl; in ide_disk_setup()
726 drive->name, capacity, sectors_to_MB(capacity)); in ide_disk_setup()
733 drive->bios_cyl, drive->bios_head, drive->bios_sect); in ide_disk_setup()
737 drive->dev_flags |= IDE_DFLAG_WCACHE; in ide_disk_setup()
741 if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 && in ide_disk_setup()
742 (drive->head == 0 || drive->head > 16)) in ide_disk_setup()
744 drive->name, drive->head); in ide_disk_setup()
749 if (ata_id_flush_enabled(drive->id) == 0 || in ide_disk_flush()
750 (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) in ide_disk_flush()
754 printk(KERN_INFO "%s: wcache flush failed!\n", drive->name); in ide_disk_flush()
768 if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) in ide_disk_set_doorlock()
772 cmd.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK; in ide_disk_set_doorlock()
773 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in ide_disk_set_doorlock()
774 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in ide_disk_set_doorlock()
779 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; in ide_disk_set_doorlock()