drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c
Extension
.c
Size
16392 bytes
Lines
658
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 (err) {
			dev_err(hwdev->dev, "Set msix attr for aeq %d failed\n",
				q_id);
			return err;
		}
	}

	return 0;
}

static int init_ceqs_msix_attr(struct hinic3_hwdev *hwdev)
{
	struct hinic3_ceqs *ceqs = hwdev->ceqs;
	struct hinic3_interrupt_info info = {};
	struct hinic3_eq *eq;
	u16 q_id;
	int err;

	info.interrupt_coalesc_set = 1;
	info.pending_limit = HINIC3_DEFAULT_EQ_MSIX_PENDING_LIMIT;
	info.coalesc_timer_cfg = HINIC3_DEFAULT_EQ_MSIX_COALESC_TIMER_CFG;
	info.resend_timer_cfg = HINIC3_DEFAULT_EQ_MSIX_RESEND_TIMER_CFG;

	for (q_id = 0; q_id < ceqs->num_ceqs; q_id++) {
		eq = &ceqs->ceq[q_id];
		info.msix_index = eq->msix_entry_idx;
		err = hinic3_set_interrupt_cfg(hwdev, info);
		if (err) {
			dev_err(hwdev->dev, "Set msix attr for ceq %u failed\n",
				q_id);
			return err;
		}
	}

	return 0;
}

static int hinic3_comm_pf_to_mgmt_init(struct hinic3_hwdev *hwdev)
{
	int err;

	if (HINIC3_IS_VF(hwdev))
		return 0;

	err = hinic3_pf_to_mgmt_init(hwdev);
	if (err)
		return err;

	set_bit(HINIC3_HWDEV_MGMT_INITED, &hwdev->func_state);

	return 0;
}

static void hinic3_comm_pf_to_mgmt_free(struct hinic3_hwdev *hwdev)
{
	if (HINIC3_IS_VF(hwdev))
		return;

	spin_lock_bh(&hwdev->channel_lock);
	clear_bit(HINIC3_HWDEV_MGMT_INITED, &hwdev->func_state);
	spin_unlock_bh(&hwdev->channel_lock);

	hinic3_aeq_unregister_cb(hwdev, HINIC3_MSG_FROM_FW);

	hinic3_pf_to_mgmt_free(hwdev);
}

static int init_basic_mgmt_channel(struct hinic3_hwdev *hwdev)
{
	int err;

	err = hinic3_comm_aeqs_init(hwdev);
	if (err) {
		dev_err(hwdev->dev, "Failed to init async event queues\n");
		return err;
	}

	err = hinic3_comm_mbox_init(hwdev);
	if (err) {
		dev_err(hwdev->dev, "Failed to init mailbox\n");
		goto err_free_comm_aeqs;
	}

	err = init_aeqs_msix_attr(hwdev);
	if (err) {
		dev_err(hwdev->dev, "Failed to init aeqs msix attr\n");
		goto err_free_comm_mbox;
	}

	return 0;

Annotation

Implementation Notes