drivers/ata/libata-scsi.c
Source file repositories/reference/linux-study-clean/drivers/ata/libata-scsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/ata/libata-scsi.c- Extension
.c- Size
- 128445 bytes
- Lines
- 5072
- Domain
- Driver Families
- Bucket
- drivers/ata
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/compat.hlinux/slab.hlinux/kernel.hlinux/blkdev.hlinux/spinlock.hlinux/export.hscsi/scsi.hscsi/scsi_host.hscsi/scsi_cmnd.hscsi/scsi_eh.hscsi/scsi_device.hscsi/scsi_tcq.hscsi/scsi_transport.hlinux/libata.hlinux/hdreg.hlinux/uaccess.hlinux/suspend.hlinux/unaligned.hlinux/ioprio.hlinux/of.hlibata.hlibata-transport.h
Detected Declarations
function ata_scsi_park_showfunction ata_scsi_park_storefunction ata_scsi_sense_is_validfunction ata_scsi_set_sensefunction ata_scsi_set_sense_informationfunction ata_scsi_set_passthru_sense_fieldsfunction ata_scsi_set_invalid_fieldfunction ata_scsi_set_invalid_parameterfunction ata_std_bios_paramfunction ata_scsi_unlock_native_capacityfunction ata_get_identityfunction ata_cmd_ioctlfunction ata_task_ioctlfunction ata_ioc32function ata_sas_scsi_ioctlfunction ata_scsi_ioctlfunction spin_lock_irqsavefunction ata_qc_set_pc_nbytesfunction spin_lock_irqsavefunction ata_gen_passthru_sensefunction ata_to_sense_errorfunction ata_gen_ata_sensefunction ata_scsi_sdev_configfunction ata_scsi_dma_need_drainfunction ata_scsi_dev_configfunction scsi_alloc_sdevfunction ata_scsi_sdev_configurefunction ata_scsi_sdev_destroyfunction STANDBYfunction spin_lock_irqsavefunction scsi_6_lba_lenfunction scsi_10_lba_lenfunction scsi_16_lba_lenfunction scsi_dldfunction spin_lock_irqsavefunction ata_check_nblocksfunction spin_lock_irqsavefunction ata_scsi_qc_donefunction ata_scsi_deferred_qc_workfunction ata_scsi_requeue_deferred_qcfunction ata_scsi_schedule_deferred_qcfunction ata_scsi_qc_completefunction ata_scsi_qc_issuefunction argumentfunction successfullyfunction spin_lock_irqsavefunction spin_lock_irqsavefunction spin_lock_irqsave
Annotated Snippet
if (dev->flags & ATA_DFLAG_NO_UNLOAD) {
rc = -EOPNOTSUPP;
goto unlock;
}
dev->unpark_deadline = ata_deadline(jiffies, input);
dev->link->eh_info.dev_action[dev->devno] |= ATA_EH_PARK;
ata_port_schedule_eh(ap);
complete(&ap->park_req_pending);
} else {
switch (input) {
case -1:
dev->flags &= ~ATA_DFLAG_NO_UNLOAD;
break;
case -2:
dev->flags |= ATA_DFLAG_NO_UNLOAD;
break;
}
}
unlock:
spin_unlock_irqrestore(ap->lock, flags);
return rc ? rc : len;
}
DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
ata_scsi_park_show, ata_scsi_park_store);
EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
bool ata_scsi_sense_is_valid(u8 sk, u8 asc, u8 ascq)
{
/*
* If sk == NO_SENSE, and asc + ascq == NO ADDITIONAL SENSE INFORMATION,
* then there is no sense data to add.
*/
if (sk == 0 && asc == 0 && ascq == 0)
return false;
/* If sk > COMPLETED, sense data is bogus. */
if (sk > COMPLETED)
return false;
return true;
}
void ata_scsi_set_sense(struct ata_device *dev, struct scsi_cmnd *cmd,
u8 sk, u8 asc, u8 ascq)
{
bool d_sense = (dev->flags & ATA_DFLAG_D_SENSE);
scsi_build_sense(cmd, d_sense, sk, asc, ascq);
}
static void ata_scsi_set_sense_information(struct ata_queued_cmd *qc)
{
u64 information;
if (!(qc->flags & ATA_QCFLAG_RTF_FILLED)) {
ata_dev_dbg(qc->dev,
"missing result TF: can't set INFORMATION sense field\n");
return;
}
information = ata_tf_read_block(&qc->result_tf, qc->dev);
if (information == U64_MAX)
return;
scsi_set_sense_information(qc->scsicmd->sense_buffer,
SCSI_SENSE_BUFFERSIZE, information);
}
/**
* ata_scsi_set_passthru_sense_fields - Set ATA fields in sense buffer
* @qc: ATA PASS-THROUGH command.
*
* Populates "ATA Status Return sense data descriptor" / "Fixed format
* sense data" with ATA taskfile fields.
*
* LOCKING:
* None.
*/
static void ata_scsi_set_passthru_sense_fields(struct ata_queued_cmd *qc)
{
struct ata_device *dev = qc->dev;
struct scsi_cmnd *cmd = qc->scsicmd;
struct ata_taskfile *tf = &qc->result_tf;
unsigned char *sb = cmd->sense_buffer;
if (!(qc->flags & ATA_QCFLAG_RTF_FILLED)) {
ata_dev_dbg(dev,
"missing result TF: can't set ATA PT sense fields\n");
Annotation
- Immediate include surface: `linux/compat.h`, `linux/slab.h`, `linux/kernel.h`, `linux/blkdev.h`, `linux/spinlock.h`, `linux/export.h`, `scsi/scsi.h`, `scsi/scsi_host.h`.
- Detected declarations: `function ata_scsi_park_show`, `function ata_scsi_park_store`, `function ata_scsi_sense_is_valid`, `function ata_scsi_set_sense`, `function ata_scsi_set_sense_information`, `function ata_scsi_set_passthru_sense_fields`, `function ata_scsi_set_invalid_field`, `function ata_scsi_set_invalid_parameter`, `function ata_std_bios_param`, `function ata_scsi_unlock_native_capacity`.
- Atlas domain: Driver Families / drivers/ata.
- Implementation status: integration implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.