免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5193 | 回复: 18
打印 上一主题 下一主题

[网络子系统] 关于网卡data sheet [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-12 23:15 |只看该作者 |倒序浏览
30可用积分
本帖最后由 chishanmingshen 于 2013-03-17 12:20 编辑

要完全理解网卡驱动代码,不仅仅看懂X_main.c文件,

从data sheet我们应该获取或理解哪些?

结合实际说明,就针对82599的data sheet吧!


update1:
问题见14楼:

    请问
    1:看82599就没有用到IORESOURCE_IO,是不是高级的都只用IORESOURCE_MEM了啊?看旧的网卡会同时用这2种资源!
   
    2:比如网卡寄存器空间大小是否等于pci_resource_len(pdev, 0)取得的空间大小?跟PCI标准规定的每个设备的配置寄存器组最多256字节的连续空间有和关系???
    感觉网卡寄存器空间是pci配置寄存器组的一部分,所以应该小于256-64个字节???或者网卡寄存器空间是另外的一个独立空间?

   3:data sheet提到的signature filters和perfect filters是什么意思?
   提到signature filters可以用4k-2个,perfect filters可以用8k-2个。




谢谢!!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-03-13 08:12 |只看该作者
回复 1# chishanmingshen
这个貌似不太现实。因为大部分对驱动的改动都是针对性的,很难能说清楚每一个细节,除非是做网卡的厂商,比如intel等,他们会对这个比较透。

   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-03-13 08:37 |只看该作者
我没问那么深,呵呵。

我的意思是从data sheet能获取哪些基本的信息,比如网卡寄存器的offset这种信息。

回复 2# 瀚海书香


   

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
4 [报告]
发表于 2013-03-13 09:20 |只看该作者
回复 3# chishanmingshen
要从datasheet了解硬件的基本特性,我觉得最重要的就是相应的寄存器列表。


   

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
5 [报告]
发表于 2013-03-13 09:26 |只看该作者
回复 1# chishanmingshen


    我这里举个例子,只说明寄存器与SPEC之间的对应关系,
    我这里用的代码是从这里igxbe source code下载的,我这里的SPEC是从82599 dev manual
    下载的,这里只用 ixgbe_intr来说明。

  1. /**
  2. * ixgbe_intr - legacy mode Interrupt Handler
  3. * @irq: interrupt number
  4. * @data: pointer to a network interface device structure
  5. **/
  6. static irqreturn_t ixgbe_intr(int irq, void *data)
  7. {
  8.         struct ixgbe_adapter *adapter = data;
  9.         struct ixgbe_hw *hw = &adapter->hw;
  10.         struct ixgbe_q_vector *q_vector = adapter->q_vector[0];
  11.         u32 eicr;

  12.         /*
  13.          * Workaround for silicon errata #26 on 82598.  Mask the interrupt
  14.          * before the read of EICR.
  15.          */
  16.         IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);

  17.         /* for NAPI, using EIAM to auto-mask tx/rx interrupt bits on read
  18.          * therefore no explicit interrupt disable is necessary */
  19.         eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
  20.         if (!eicr) {
  21.                 /*
  22.                  * shared interrupt alert!
  23.                  * make sure interrupts are enabled because the read will
  24.                  * have disabled interrupts due to EIAM
  25.                  * finish the workaround of silicon errata on 82598.  Unmask
  26.                  * the interrupt that we masked before the EICR read.
  27.                  */
  28.                 if (!test_bit(__IXGBE_DOWN, &adapter->state))
  29.                         ixgbe_irq_enable(adapter, true, true);
  30.                 return IRQ_NONE;        /* Not our interrupt */
  31.         }

  32.         if (eicr & IXGBE_EICR_LSC)
  33.                 ixgbe_check_lsc(adapter);

  34.         switch (hw->mac.type) {
  35.         case ixgbe_mac_82599EB:
  36.         case ixgbe_mac_X540:
  37.                 if (eicr & IXGBE_EICR_ECC) {
  38.                         e_info(link, "Received unrecoverable ECC Err,"
  39.                                "initiating reset.\n");
  40.                         adapter->flags2 |= IXGBE_FLAG2_RESET_REQUESTED;
  41.                         ixgbe_service_event_schedule(adapter);
  42.                         IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
  43.                 }
  44.                 ixgbe_check_sfp_event(adapter, eicr);
  45.                 ixgbe_check_overtemp_event(adapter, eicr);
  46.                 break;
  47.         default:
  48.                 break;
  49.         }

  50.         ixgbe_check_fan_failure(adapter, eicr);
  51. #ifdef HAVE_PTP_1588_CLOCK
  52.         if (unlikely(eicr & IXGBE_EICR_TIMESYNC))
  53.             ixgbe_ptp_check_pps_event(adapter, eicr);
  54. #endif

  55.         /* would disable interrupts here but EIAM disabled it */
  56.         napi_schedule(&q_vector->napi);

  57.         /*
  58.          * re-enable link(maybe) and non-queue interrupts, no flush.
  59.          * ixgbe_poll will re-enable the queue interrupts
  60.          */
  61.         if (!test_bit(__IXGBE_DOWN, &adapter->state))
  62.                 ixgbe_irq_enable(adapter, false, false);

  63.         return IRQ_HANDLED;
  64. }
复制代码
这上面有几个读写寄存器的,
      eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
      IXGBE_EICR 这个参数在代码中被定义为
#define IXGBE_EICR                0x00800
       而在SPEC中被定义为在Page 461 0x800

    而后面检查
        if (eicr & IXGBE_EICR_LSC)
                ixgbe_check_lsc(adapter);

    IXGBE_EICR_LSC这个值被定义为
    #define IXGBE_EICR_LSC                0x00100000 /* Link Status Change */
   
   SPEC中把LSC这一位是bit20 正好是这个值的对应。
     这样,就可以把SPEC与源代码对应起来了。

   不知道这个是否回答了你的问题。谢谢。

      
     
   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-03-13 09:40 |只看该作者
多谢解答。

那还有其它需要参考data sheet的地方么?offset只是其中之一。

比如Base Address0-Base Address5,这几个空间的大小是从哪里决定的?是从data sheet么?

回复 5# jeppeter


   

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
7 [报告]
发表于 2013-03-13 10:07 |只看该作者
回复 6# chishanmingshen


    我在代码中没有看到关于你说的什么Base Address0,Base Address5这样的代码,不知道你具体指什么?

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2013-03-13 10:20 |只看该作者
本帖最后由 chishanmingshen 于 2013-03-13 10:31 编辑

是跟pci相关的:
        hw->hw_addr = ioremap(pci_resource_start(pdev, 0),
                              pci_resource_len(pdev, 0));

这个是bar0。

这个长度最早的地方是哪里得到的?我觉得可能是从data sheet中来的。。。

请大家指点啊,谢谢~~

回复 7# jeppeter


   

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
9 [报告]
发表于 2013-03-13 10:33 |只看该作者
回复 8# chishanmingshen


    你说这个,那与整个LINUX内核代码的PCI有关,最初这个是在LINUX内核初始化PCI的时候设定的,原来的PCI的整个规范中有关于外围设备与CPU总线的地址映射关系。这个是有专门的寄存器处理的,具体现在已经不太记的清楚了,但在前面说的SPEC中有对应的,就是Page 426上面有讲到这个地址可以被改写为总线地址,这个是LINUX初始化PCI的时候进行设定的,这样可以把片上的内存与整个CPU的控制总线地址进行统一管理。而你说的到了probe的阶段,其实就是读出这个寄存器的值进行物理内存地址,到虚拟内存地址的关联。如果你要解决这个问题,最好是去读LINUX中关于PCI的内容
      浅谈Linux PCI设备驱动(一) 浅谈Linux PCI设备驱动(二)

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2013-03-13 11:39 |只看该作者
看了,应该是从配置寄存器读出的:
pci_read_config_dword(dev, pos, &sz);
谢谢!


P596的图9.3 memory bar中说了区间大小是由BARCTRL寄存器决定的。
但是,代码的这几个宏,我没有找到使用的地方???

/* BARCTRL */
#define IXGBE_BARCTRL               0x110F4
#define IXGBE_BARCTRL_FLSIZE        0x0700
#define IXGBE_BARCTRL_FLSIZE_SHIFT  8
#define IXGBE_BARCTRL_CSRSIZE       0x2000

请指点,谢谢!

回复 9# jeppeter


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP