drivers/scsi/scsicam.c
Source file repositories/reference/linux-study-clean/drivers/scsi/scsicam.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/scsi/scsicam.c- Extension
.c- Size
- 7728 bytes
- Lines
- 258
- Domain
- Driver Families
- Bucket
- drivers/scsi
- 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.
- 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/module.hlinux/slab.hlinux/fs.hlinux/kernel.hlinux/blkdev.hlinux/pagemap.hlinux/msdos_partition.hlinux/unaligned.hscsi/scsicam.h
Detected Declarations
function scsi_partsizefunction setsizefunction ioctlexport scsi_bios_ptableexport scsi_partsizeexport scsicam_bios_param
Annotated Snippet
if (cyl > largest_cyl) {
largest_cyl = cyl;
largest = p;
}
}
}
if (largest) {
end_cyl = largest->end_cyl + ((largest->end_sector & 0xc0) << 2);
end_head = largest->end_head;
end_sector = largest->end_sector & 0x3f;
if (end_head + 1 == 0 || end_sector == 0)
goto out_free_buf;
#ifdef DEBUG
printk("scsicam_bios_param : end at h = %d, c = %d, s = %d\n",
end_head, end_cyl, end_sector);
#endif
physical_end = end_cyl * (end_head + 1) * end_sector +
end_head * end_sector + end_sector;
/* This is the actual _sector_ number at the end */
logical_end = get_unaligned_le32(&largest->start_sect)
+ get_unaligned_le32(&largest->nr_sects);
/* This is for >1023 cylinders */
ext_cyl = (logical_end - (end_head * end_sector + end_sector))
/ (end_head + 1) / end_sector;
ext_physical_end = ext_cyl * (end_head + 1) * end_sector +
end_head * end_sector + end_sector;
#ifdef DEBUG
printk("scsicam_bios_param : logical_end=%d physical_end=%d ext_physical_end=%d ext_cyl=%d\n"
,logical_end, physical_end, ext_physical_end, ext_cyl);
#endif
if (logical_end == physical_end ||
(end_cyl == 1023 && ext_physical_end == logical_end)) {
geom[0] = end_head + 1;
geom[1] = end_sector;
geom[2] = (unsigned long)capacity /
((end_head + 1) * end_sector);
ret = true;
goto out_free_buf;
}
#ifdef DEBUG
printk("scsicam_bios_param : logical (%u) != physical (%u)\n",
logical_end, physical_end);
#endif
}
out_free_buf:
kfree(buf);
return ret;
}
EXPORT_SYMBOL(scsi_partsize);
/*
* Function : static int setsize(unsigned long capacity,unsigned int *cyls,
* unsigned int *hds, unsigned int *secs);
*
* Purpose : to determine a near-optimal int 0x13 mapping for a
* SCSI disk in terms of lost space of size capacity, storing
* the results in *cyls, *hds, and *secs.
*
* Returns : -1 on failure, 0 on success.
*
* Extracted from
*
* WORKING X3T9.2
* DRAFT 792D
* see http://www.t10.org/ftp/t10/drafts/cam/cam-r12b.pdf
*
* Revision 6
* 10-MAR-94
* Information technology -
* SCSI-2 Common access method
* transport and SCSI interface module
*
* ANNEX A :
*
* setsize() converts a read capacity value to int 13h
* head-cylinder-sector requirements. It minimizes the value for
* number of heads and maximizes the number of cylinders. This
* will support rather large disks before the number of heads
* will not fit in 4 bits (or 6 bits). This algorithm also
* minimizes the number of sectors that will be unused at the end
* of the disk while allowing for very large disks to be
* accommodated. This algorithm does not use physical geometry.
Annotation
- Immediate include surface: `linux/module.h`, `linux/slab.h`, `linux/fs.h`, `linux/kernel.h`, `linux/blkdev.h`, `linux/pagemap.h`, `linux/msdos_partition.h`, `linux/unaligned.h`.
- Detected declarations: `function scsi_partsize`, `function setsize`, `function ioctl`, `export scsi_bios_ptable`, `export scsi_partsize`, `export scsicam_bios_param`.
- Atlas domain: Driver Families / drivers/scsi.
- Implementation status: integration implementation candidate.
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.