drivers/scsi/arcmsr/arcmsr_hba.c
Source file repositories/reference/linux-study-clean/drivers/scsi/arcmsr/arcmsr_hba.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/scsi/arcmsr/arcmsr_hba.c- Extension
.c- Size
- 152547 bytes
- Lines
- 4823
- Domain
- Driver Families
- Bucket
- drivers/scsi
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/reboot.hlinux/spinlock.hlinux/pci_ids.hlinux/interrupt.hlinux/moduleparam.hlinux/errno.hlinux/types.hlinux/delay.hlinux/dma-mapping.hlinux/timer.hlinux/slab.hlinux/pci.hlinux/circ_buf.hasm/dma.hasm/io.hlinux/uaccess.hscsi/scsi_host.hscsi/scsi.hscsi/scsi_cmnd.hscsi/scsi_tcq.hscsi/scsi_device.hscsi/scsi_transport.hscsi/scsicam.harcmsr.h
Detected Declarations
function arcmsr_adjust_disk_queue_depthfunction arcmsr_free_io_queuefunction arcmsr_remap_pciregionfunction arcmsr_unmap_pciregionfunction arcmsr_do_interruptfunction arcmsr_bios_paramfunction arcmsr_hbaA_wait_msgint_readyfunction arcmsr_hbaB_wait_msgint_readyfunction arcmsr_hbaC_wait_msgint_readyfunction arcmsr_hbaD_wait_msgint_readyfunction arcmsr_hbaE_wait_msgint_readyfunction arcmsr_hbaA_flush_cachefunction arcmsr_hbaB_flush_cachefunction arcmsr_hbaC_flush_cachefunction arcmsr_hbaD_flush_cachefunction arcmsr_hbaE_flush_cachefunction arcmsr_flush_adapter_cachefunction arcmsr_hbaB_assign_regAddrfunction arcmsr_hbaD_assign_regAddrfunction arcmsr_hbaF_assign_regAddrfunction arcmsr_alloc_io_queuefunction arcmsr_alloc_xor_bufferfunction arcmsr_alloc_ccb_poolfunction arcmsr_message_isr_bh_fnfunction arcmsr_request_irqfunction arcmsr_init_get_devmap_timerfunction arcmsr_init_set_datetime_timerfunction arcmsr_set_dma_maskfunction arcmsr_probefunction arcmsr_free_irqfunction arcmsr_suspendfunction arcmsr_resumefunction arcmsr_hbaA_abort_allcmdfunction arcmsr_hbaB_abort_allcmdfunction arcmsr_hbaC_abort_allcmdfunction arcmsr_hbaD_abort_allcmdfunction arcmsr_hbaE_abort_allcmdfunction arcmsr_abort_allcmdfunction arcmsr_ccb_completefunction arcmsr_report_sense_infofunction arcmsr_disable_outbound_intsfunction arcmsr_report_ccb_statefunction arcmsr_drain_donequeuefunction arcmsr_done4abort_postqueuefunction arcmsr_remove_scsi_devicesfunction arcmsr_free_pcidevfunction arcmsr_removefunction arcmsr_shutdown
Annotated Snippet
static struct pci_driver arcmsr_pci_driver = {
.name = "arcmsr",
.id_table = arcmsr_device_id_table,
.probe = arcmsr_probe,
.remove = arcmsr_remove,
.driver.pm = &arcmsr_pm_ops,
.shutdown = arcmsr_shutdown,
};
/*
****************************************************************************
****************************************************************************
*/
static void arcmsr_free_io_queue(struct AdapterControlBlock *acb)
{
switch (acb->adapter_type) {
case ACB_ADAPTER_TYPE_B:
case ACB_ADAPTER_TYPE_D:
case ACB_ADAPTER_TYPE_E:
case ACB_ADAPTER_TYPE_F:
dma_free_coherent(&acb->pdev->dev, acb->ioqueue_size,
acb->dma_coherent2, acb->dma_coherent_handle2);
break;
}
}
static bool arcmsr_remap_pciregion(struct AdapterControlBlock *acb)
{
struct pci_dev *pdev = acb->pdev;
switch (acb->adapter_type){
case ACB_ADAPTER_TYPE_A:{
acb->pmuA = ioremap(pci_resource_start(pdev,0), pci_resource_len(pdev,0));
if (!acb->pmuA) {
printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
return false;
}
break;
}
case ACB_ADAPTER_TYPE_B:{
void __iomem *mem_base0, *mem_base1;
mem_base0 = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
if (!mem_base0) {
printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
return false;
}
mem_base1 = ioremap(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2));
if (!mem_base1) {
iounmap(mem_base0);
printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
return false;
}
acb->mem_base0 = mem_base0;
acb->mem_base1 = mem_base1;
break;
}
case ACB_ADAPTER_TYPE_C:{
acb->pmuC = ioremap(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
if (!acb->pmuC) {
printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
return false;
}
if (readl(&acb->pmuC->outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, &acb->pmuC->outbound_doorbell_clear);/*clear interrupt*/
return true;
}
break;
}
case ACB_ADAPTER_TYPE_D: {
void __iomem *mem_base0;
unsigned long addr, range;
addr = (unsigned long)pci_resource_start(pdev, 0);
range = pci_resource_len(pdev, 0);
mem_base0 = ioremap(addr, range);
if (!mem_base0) {
pr_notice("arcmsr%d: memory mapping region fail\n",
acb->host->host_no);
return false;
}
acb->mem_base0 = mem_base0;
break;
}
case ACB_ADAPTER_TYPE_E: {
acb->pmuE = ioremap(pci_resource_start(pdev, 1),
pci_resource_len(pdev, 1));
if (!acb->pmuE) {
pr_notice("arcmsr%d: memory mapping region fail \n",
acb->host->host_no);
return false;
}
Annotation
- Immediate include surface: `linux/module.h`, `linux/reboot.h`, `linux/spinlock.h`, `linux/pci_ids.h`, `linux/interrupt.h`, `linux/moduleparam.h`, `linux/errno.h`, `linux/types.h`.
- Detected declarations: `function arcmsr_adjust_disk_queue_depth`, `function arcmsr_free_io_queue`, `function arcmsr_remap_pciregion`, `function arcmsr_unmap_pciregion`, `function arcmsr_do_interrupt`, `function arcmsr_bios_param`, `function arcmsr_hbaA_wait_msgint_ready`, `function arcmsr_hbaB_wait_msgint_ready`, `function arcmsr_hbaC_wait_msgint_ready`, `function arcmsr_hbaD_wait_msgint_ready`.
- Atlas domain: Driver Families / drivers/scsi.
- Implementation status: pattern implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.