drivers/scsi/arcmsr/arcmsr_attr.c

Source file repositories/reference/linux-study-clean/drivers/scsi/arcmsr/arcmsr_attr.c

File Facts

System
Linux kernel
Corpus path
drivers/scsi/arcmsr/arcmsr_attr.c
Extension
.c
Size
13826 bytes
Lines
412
Domain
Driver Families
Bucket
drivers/scsi
Inferred role
Driver Families: implementation source
Status
source 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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (user_len > cnt2end) {
			memcpy(pQbuffer, ptmpuserbuffer, cnt2end);
			ptmpuserbuffer += cnt2end;
			user_len -= cnt2end;
			acb->wqbuf_putIndex = 0;
			pQbuffer = acb->wqbuffer;
		}
		memcpy(pQbuffer, ptmpuserbuffer, user_len);
		acb->wqbuf_putIndex += user_len;
		acb->wqbuf_putIndex %= ARCMSR_MAX_QBUFFER;
		if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
			acb->acb_flags &=
				~ACB_F_MESSAGE_WQBUFFER_CLEARED;
			arcmsr_write_ioctldata2iop(acb);
		}
		spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
		return count;
	}
}

static ssize_t arcmsr_sysfs_iop_message_clear(struct file *filp,
					      struct kobject *kobj,
					      const struct bin_attribute *bin,
					      char *buf, loff_t off,
					      size_t count)
{
	struct device *dev = container_of(kobj,struct device,kobj);
	struct Scsi_Host *host = class_to_shost(dev);
	struct AdapterControlBlock *acb = (struct AdapterControlBlock *) host->hostdata;
	uint8_t *pQbuffer;
	unsigned long flags;

	if (!capable(CAP_SYS_ADMIN))
		return -EACCES;

	arcmsr_clear_iop2drv_rqueue_buffer(acb);
	acb->acb_flags |=
		(ACB_F_MESSAGE_WQBUFFER_CLEARED
		| ACB_F_MESSAGE_RQBUFFER_CLEARED
		| ACB_F_MESSAGE_WQBUFFER_READED);
	spin_lock_irqsave(&acb->rqbuffer_lock, flags);
	acb->rqbuf_getIndex = 0;
	acb->rqbuf_putIndex = 0;
	spin_unlock_irqrestore(&acb->rqbuffer_lock, flags);
	spin_lock_irqsave(&acb->wqbuffer_lock, flags);
	acb->wqbuf_getIndex = 0;
	acb->wqbuf_putIndex = 0;
	spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
	pQbuffer = acb->rqbuffer;
	memset(pQbuffer, 0, sizeof (struct QBUFFER));
	pQbuffer = acb->wqbuffer;
	memset(pQbuffer, 0, sizeof (struct QBUFFER));
	return 1;
}

static const struct bin_attribute arcmsr_sysfs_message_read_attr = {
	.attr = {
		.name = "mu_read",
		.mode = S_IRUSR ,
	},
	.size = ARCMSR_API_DATA_BUFLEN,
	.read = arcmsr_sysfs_iop_message_read,
};

static const struct bin_attribute arcmsr_sysfs_message_write_attr = {
	.attr = {
		.name = "mu_write",
		.mode = S_IWUSR,
	},
	.size = ARCMSR_API_DATA_BUFLEN,
	.write = arcmsr_sysfs_iop_message_write,
};

static const struct bin_attribute arcmsr_sysfs_message_clear_attr = {
	.attr = {
		.name = "mu_clear",
		.mode = S_IWUSR,
	},
	.size = 1,
	.write = arcmsr_sysfs_iop_message_clear,
};

int arcmsr_alloc_sysfs_attr(struct AdapterControlBlock *acb)
{
	struct Scsi_Host *host = acb->host;
	int error;

	error = sysfs_create_bin_file(&host->shost_dev.kobj, &arcmsr_sysfs_message_read_attr);
	if (error) {
		printk(KERN_ERR "arcmsr: alloc sysfs mu_read failed\n");

Annotation

Implementation Notes