drivers/net/ethernet/cisco/enic/vnic_dev.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/cisco/enic/vnic_dev.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/cisco/enic/vnic_dev.c
Extension
.c
Size
29693 bytes
Lines
1298
Domain
Driver Families
Bucket
drivers/net
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.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (type) {
		case RES_TYPE_WQ:
		case RES_TYPE_RQ:
		case RES_TYPE_CQ:
		case RES_TYPE_INTR_CTRL:
		case RES_TYPE_ADMIN_WQ:
		case RES_TYPE_ADMIN_RQ:
		case RES_TYPE_ADMIN_CQ:
			/* each count is stride bytes long */
			len = count * VNIC_RES_STRIDE;
			if (len + bar_offset > bar[bar_num].len) {
				vdev_err(vdev, "vNIC BAR0 resource %d out-of-bounds, offset 0x%x + size 0x%x > bar len 0x%lx\n",
					 type, bar_offset, len,
					 bar[bar_num].len);
				return -EINVAL;
			}
			break;
		case RES_TYPE_INTR_PBA_LEGACY:
		case RES_TYPE_DEVCMD:
		case RES_TYPE_DEVCMD2:
		case RES_TYPE_SRIOV_INTR:
			len = count;
			break;
		default:
			continue;
		}

		vdev->res[type].count = count;
		vdev->res[type].vaddr = (char __iomem *)bar[bar_num].vaddr +
			bar_offset;
		vdev->res[type].bus_addr = bar[bar_num].bus_addr + bar_offset;
	}

	return 0;
}

unsigned int vnic_dev_get_res_count(struct vnic_dev *vdev,
	enum vnic_res_type type)
{
	return vdev->res[type].count;
}
EXPORT_SYMBOL(vnic_dev_get_res_count);

void __iomem *vnic_dev_get_res(struct vnic_dev *vdev, enum vnic_res_type type,
	unsigned int index)
{
	if (!vdev->res[type].vaddr)
		return NULL;

	switch (type) {
	case RES_TYPE_WQ:
	case RES_TYPE_RQ:
	case RES_TYPE_CQ:
	case RES_TYPE_INTR_CTRL:
	case RES_TYPE_ADMIN_WQ:
	case RES_TYPE_ADMIN_RQ:
	case RES_TYPE_ADMIN_CQ:
		return (char __iomem *)vdev->res[type].vaddr +
			index * VNIC_RES_STRIDE;
	default:
		return (char __iomem *)vdev->res[type].vaddr;
	}
}
EXPORT_SYMBOL(vnic_dev_get_res);

static unsigned int vnic_dev_desc_ring_size(struct vnic_dev_ring *ring,
	unsigned int desc_count, unsigned int desc_size)
{

	/* Descriptor ring base address alignment in bytes*/
	ring->base_align = VNIC_DESC_BASE_ALIGN;

	/* A count of 0 means the maximum descriptors */
	if (desc_count == 0)
		desc_count = VNIC_DESC_MAX_COUNT;

	/* Descriptor count aligned in groups of VNIC_DESC_COUNT_ALIGN descriptors */
	ring->desc_count = ALIGN(desc_count, VNIC_DESC_COUNT_ALIGN);

	/* Descriptor size alignment in bytes */
	ring->desc_size = ALIGN(desc_size, VNIC_DESC_SIZE_ALIGN);

	ring->size = ring->desc_count * ring->desc_size;
	ring->size_unaligned = ring->size + ring->base_align;

	return ring->size_unaligned;
}

void vnic_dev_clear_desc_ring(struct vnic_dev_ring *ring)
{

Annotation

Implementation Notes