MTK7621:交换芯片数据接收

发布于:2024-07-02 ⋅ 阅读:(8) ⋅ 点赞:(0)

交换机数据接收流程

注册中断接收函数

文件gsw_mt7621.c中,在switch驱动加载时,注册中断接收函数:

int mtk_gsw_init(struct fe_priv *priv)
{
	struct device_node *np = priv->switch_np;
	struct platform_device *pdev = of_find_device_by_node(np);
	struct mt7620_gsw *gsw;

	if (!pdev)
		return -ENODEV;

	if (!of_device_is_compatible(np, mediatek_gsw_match->compatible))
		return -EINVAL;

	gsw = platform_get_drvdata(pdev);
	priv->soc->swpriv = gsw;

	if (gsw->irq) {
		request_irq(gsw->irq, gsw_interrupt_mt7621, 0,
			    "gsw", priv);
		disable_irq(gsw->irq);
	}

	mt7621_hw_init(gsw, np);

	if (gsw->irq) {
		enable_irq(gsw->irq);
		gsw_timer.expires = jiffies + 1*HZ; //�����δ��ʱ�̵�ʱ���
		gsw_timer.data = gsw;
		mod_timer(&gsw_timer, jiffies + 1*HZ); //��Linux�ں�ע�ᶨʱ��
	}
	/* save the mt7620_gsw to global variable */
    global_gsw = gsw;
	return 0;
}

中断接收函数

static irqreturn_t gsw_interrupt_mt7621(int irq, void *_priv)
{
	struct fe_priv *priv = (struct fe_priv *)_priv;
	struct mt7620_gsw *gsw = (struct mt7620_gsw *)priv->soc->swpriv;
	u32 reg, i;

	reg = mt7530_mdio_r32(gsw, 0x700c);
	mt7530_mdio_w32(gsw, 0x700c, reg);
	gsw_irq_cnt++;

	//�ж�1s ������жϴ�������100�� �ж�Ϊ����оƬ ��������
	//������
	if (gsw_irq_cnt > 500) {
		disable_irq_nosync(gsw->irq);
		//���� �жϴ���