drivers/net/wireless/intel/iwlegacy/4965-rs.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/intel/iwlegacy/4965-rs.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/intel/iwlegacy/4965-rs.c
Extension
.c
Size
80431 bytes
Lines
2793
Domain
Driver Families
Bucket
drivers/net
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.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct file_operations rs_sta_dbgfs_scale_table_ops = {
	.write = il4965_rs_sta_dbgfs_scale_table_write,
	.read = il4965_rs_sta_dbgfs_scale_table_read,
	.open = simple_open,
	.llseek = default_llseek,
};

static ssize_t
il4965_rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf,
				     size_t count, loff_t *ppos)
{
	char *buff;
	int desc = 0;
	int i, j;
	ssize_t ret;

	struct il_lq_sta *lq_sta = file->private_data;

	buff = kmalloc(1024, GFP_KERNEL);
	if (!buff)
		return -ENOMEM;

	for (i = 0; i < LQ_SIZE; i++) {
		desc +=
		    sprintf(buff + desc,
			    "%s type=%d SGI=%d HT40=%d DUP=%d GF=%d\n"
			    "rate=0x%X\n", lq_sta->active_tbl == i ? "*" : "x",
			    lq_sta->lq_info[i].lq_type,
			    lq_sta->lq_info[i].is_SGI,
			    lq_sta->lq_info[i].is_ht40,
			    lq_sta->lq_info[i].is_dup, lq_sta->is_green,
			    lq_sta->lq_info[i].current_rate);
		for (j = 0; j < RATE_COUNT; j++) {
			desc +=
			    sprintf(buff + desc,
				    "counter=%d success=%d %%=%d\n",
				    lq_sta->lq_info[i].win[j].counter,
				    lq_sta->lq_info[i].win[j].success_counter,
				    lq_sta->lq_info[i].win[j].success_ratio);
		}
	}
	ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
	kfree(buff);
	return ret;
}

static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
	.read = il4965_rs_sta_dbgfs_stats_table_read,
	.open = simple_open,
	.llseek = default_llseek,
};

static ssize_t
il4965_rs_sta_dbgfs_rate_scale_data_read(struct file *file,
					 char __user *user_buf, size_t count,
					 loff_t *ppos)
{
	char buff[120];
	int desc = 0;
	struct il_lq_sta *lq_sta = file->private_data;
	struct il_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl];

	if (is_Ht(tbl->lq_type))
		desc +=
		    sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
			    tbl->expected_tpt[lq_sta->last_txrate_idx]);
	else
		desc +=
		    sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
			    il_rates[lq_sta->last_txrate_idx].ieee >> 1);

	return simple_read_from_buffer(user_buf, count, ppos, buff, desc);
}

static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
	.read = il4965_rs_sta_dbgfs_rate_scale_data_read,
	.open = simple_open,
	.llseek = default_llseek,
};

static void
il4965_rs_add_debugfs(void *il, void *il_sta, struct dentry *dir)
{
	struct il_lq_sta *lq_sta = il_sta;

	debugfs_create_file("rate_scale_table", 0600, dir, lq_sta,
			    &rs_sta_dbgfs_scale_table_ops);
	debugfs_create_file("rate_stats_table", 0400, dir, lq_sta,
			    &rs_sta_dbgfs_stats_table_ops);
	debugfs_create_file("rate_scale_data", 0400, dir, lq_sta,

Annotation

Implementation Notes