注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

TCP/IP驱动四操作函数open & stop  

2013-04-26 22:05:54|  分类: TCPIP驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

TCP/IP驱动四操作函数

前面基本把初始化的操作都做好了,现在就可以开始干活儿了,第一件事,那当然就是open函数:

/*

 *  Open the interface.

 *  The interface is opened whenever "ifconfig" actives it.

 */

static int

dm9000_open(struct net_device *dev)

{

         board_info_t *db = netdev_priv(dev);

         unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;

 

         if (netif_msg_ifup(db))

                   dev_dbg(db->dev, "enabling %s\n", dev->name);

 

         /* If there is no IRQ type specified, default to something that

          * may work, and tell the user that this is a problem */

 

         if (irqflags == IRQF_TRIGGER_NONE)

                   dev_warn(db->dev, "WARNING: no IRQ resource flags set.\n");

 

         irqflags |= IRQF_SHARED;

 

//注册一个中断,中断函数为dm9000_interrupt

         if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev))

                   return -EAGAIN;

 

         /* Initialize DM9000 board   复位并初始化DM9000*/

         dm9000_reset(db);

         dm9000_init_dm9000(dev);

 

         /* Init driver variable */

         db->dbug_cnt = 0;

//检测MII

         mii_check_media(&db->mii, netif_msg_link(db), 1);

         netif_start_queue(dev);

         //之前在probe函数中已经使用INIT_DELAYED_WORK来初始化一个延迟工作队列并关联//了一个操作函数dm9000_poll_work() 此时运行schedule来调用这个函数

         dm9000_schedule_poll(db);

 

         return 0;

}

然后自然就是stop函数了,看名字大家也知道它是干啥的.

/*  

 * Stop the interface.  

 * The interface is stopped when it is brought.  

 */  

static int  

dm9000_stop(struct net_device *ndev)   

{   

    board_info_t *db = netdev_priv(ndev);   

  

    if (netif_msg_ifdown(db))   

        dev_dbg(db->dev, "shutting down %s\n", ndev->name);   

   //取消延迟工作队列phy_poll 

    cancel_delayed_work_sync(&db->phy_poll);

  

        /*停止传输并清空carrier*/  

    netif_stop_queue(ndev);   

    netif_carrier_off(ndev);   

  

    /* free interrupt */  

    free_irq(ndev->irq, ndev);   

  

    dm9000_shutdown(ndev);   

  

    return 0;   

 

这两个函数相对来说比较简单,今天晚上,就说这一些,下一次弄数据的传输,这个就比较麻烦了.慢慢来,不要着急.

  评论这张
 
阅读(730)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017