drivers/net/wireless/ath/ath12k/dbring.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/ath/ath12k/dbring.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/ath/ath12k/dbring.c
Extension
.c
Size
8682 bytes
Lines
359
Domain
Driver Families
Bucket
drivers/net
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 (ret) {
			ath12k_warn(ab, "failed to replenish db ring num_remain %d req_ent %d\n",
				    num_remain, req_entries);
			kfree(buff);
			break;
		}
		num_remain--;
	}

	spin_unlock_bh(&srng->lock);

	return num_remain;
}

int ath12k_dbring_wmi_cfg_setup(struct ath12k *ar,
				struct ath12k_dbring *ring,
				enum wmi_direct_buffer_module id)
{
	struct ath12k_wmi_pdev_dma_ring_cfg_arg arg = {};
	int ret;

	if (id >= WMI_DIRECT_BUF_MAX)
		return -EINVAL;

	arg.pdev_id = DP_SW2HW_MACID(ring->pdev_id);
	arg.module_id = id;
	arg.base_paddr_lo = lower_32_bits(ring->refill_srng.paddr);
	arg.base_paddr_hi = upper_32_bits(ring->refill_srng.paddr);
	arg.head_idx_paddr_lo = lower_32_bits(ring->hp_addr);
	arg.head_idx_paddr_hi = upper_32_bits(ring->hp_addr);
	arg.tail_idx_paddr_lo = lower_32_bits(ring->tp_addr);
	arg.tail_idx_paddr_hi = upper_32_bits(ring->tp_addr);
	arg.num_elems = ring->bufs_max;
	arg.buf_size = ring->buf_sz;
	arg.num_resp_per_event = ring->num_resp_per_event;
	arg.event_timeout_ms = ring->event_timeout_ms;

	ret = ath12k_wmi_pdev_dma_ring_cfg(ar, &arg);
	if (ret) {
		ath12k_warn(ar->ab, "failed to setup db ring cfg\n");
		return ret;
	}

	return 0;
}

int ath12k_dbring_set_cfg(struct ath12k *ar, struct ath12k_dbring *ring,
			  u32 num_resp_per_event, u32 event_timeout_ms,
			  int (*handler)(struct ath12k *,
					 struct ath12k_dbring_data *))
{
	if (WARN_ON(!ring))
		return -EINVAL;

	ring->num_resp_per_event = num_resp_per_event;
	ring->event_timeout_ms = event_timeout_ms;
	ring->handler = handler;

	return 0;
}

int ath12k_dbring_buf_setup(struct ath12k *ar,
			    struct ath12k_dbring *ring,
			    struct ath12k_dbring_cap *db_cap)
{
	struct ath12k_base *ab = ar->ab;
	struct hal_srng *srng;
	int ret;

	srng = &ab->hal.srng_list[ring->refill_srng.ring_id];
	ring->bufs_max = ring->refill_srng.size /
		ath12k_hal_srng_get_entrysize(ab, HAL_RXDMA_DIR_BUF);

	ring->buf_sz = db_cap->min_buf_sz;
	ring->buf_align = db_cap->min_buf_align;
	ring->pdev_id = db_cap->pdev_id;
	ring->hp_addr = ath12k_hal_srng_get_hp_addr(ab, srng);
	ring->tp_addr = ath12k_hal_srng_get_tp_addr(ab, srng);

	ret = ath12k_dbring_fill_bufs(ar, ring, GFP_KERNEL);

	return ret;
}

int ath12k_dbring_srng_setup(struct ath12k *ar, struct ath12k_dbring *ring,
			     int ring_num, int num_entries)
{
	int ret;

	ret = ath12k_dp_srng_setup(ar->ab, &ring->refill_srng, HAL_RXDMA_DIR_BUF,

Annotation

Implementation Notes