交换机数据接收流程
注册中断接收函数
文件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);
//���� �жϴ���