免费注册 查看新帖 |

Chinaunix

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

有人研究过freescale 提供MPC8315 BSP中打上ieee1588功能的gianfar网络驱动?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-27 21:36 |只看该作者 |倒序浏览
有人研究过freescale 提供MPC8315 LINUX BSP中打上ieee1588功能的gianfar网络驱动??
能不能探讨一下一些问题,在做研究这个程序,目前很困惑。。。

论坛徽章:
0
2 [报告]
发表于 2009-06-27 22:05 |只看该作者
有拿到两个版本的内核代码,下面是linux2.6.23的内核(也是freescale linux bsp里的提供的)

  1. static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
  2. {
  3.        。。。。。。。

  4. if (likely((dev->features & NETIF_F_IP_CSUM)
  5.                         && (CHECKSUM_PARTIAL == skb->ip_summed))) {
  6.                 fcb = gfar_add_fcb(skb, txbdp);
  7.                 status |= TXBD_TOE;
  8.                 gfar_tx_checksum(skb, fcb);
  9.         }

  10.         if (priv->vlan_enable &&
  11.                         unlikely(priv->vlgrp && vlan_tx_tag_present(skb))) {
  12.                 if (unlikely(NULL == fcb)) {
  13.                         fcb = gfar_add_fcb(skb, txbdp);
  14.                         status |= TXBD_TOE;
  15.                 }

  16.                 gfar_tx_vlan(skb, fcb);
  17.         }

  18. #if defined(CONFIG_GFAR_PTP)
  19.         /* Enable ptp flag so that Tx time stamping happens */
  20.         [b]if (gfar_ptp_do_txstamp(skb)) {[/b]                if (fcb == NULL)
  21.                         fcb = gfar_add_fcb(skb, txbdp);
  22.                 fcb->ptp = 0x01;
  23.                 status |= TXBD_TOE;
  24.         }
  25. #endif

  26.         /* Set buffer length and pointer */
  27.         txbdp->length = skb->len;
  28.         txbdp->bufPtr = dma_map_single(NULL, skb->data,
  29.                         skb->len, DMA_TO_DEVICE);

  30.         ......................
  31. }


  32. #define GFAR_PTP_PKT_TYPE_OFFS                0x31    //困惑的地方是这个偏移值为什么是这个数值?
  33. #define GFAR_PTP_MULTI_ADDR_OFFS        0x38
  34. int gfar_ptp_do_txstamp(struct sk_buff *skb)
  35. {
  36.         u32 *multicast_addr;
  37.         char *pkt_type;

  38.         if (skb->len > 42) {
  39.                 pkt_type = (char *)(skb->data + GFAR_PTP_PKT_TYPE_OFFS);
  40.                 multicast_addr = (u32 *)(skb->data + GFAR_PTP_MULTI_ADDR_OFFS);

  41.                 if ((*multicast_addr == GFAR_PTP_DOMAIN_DLFT) &&
  42.                                         (*pkt_type == GFAR_PACKET_TYPE_UDP))
  43.                         return 1;
  44.         }

  45.         return 0;
  46. }

复制代码

[ 本帖最后由 unixgg1984 于 2009-6-27 22:06 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-06-27 22:12 |只看该作者
而在Linux2.6.24的内核中(从freescale网站上下载的linux bsp,在redhat 9.0中,利用LTIB获取的内核)


  1. static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
  2. {
  3.              ......
  4.         /* Set up checksumming */
  5.         if (likely((dev->features & NETIF_F_IP_CSUM)
  6.                         && (CHECKSUM_PARTIAL == skb->ip_summed))) {
  7.                 fcb = gfar_add_fcb(skb, txbdp);
  8.                 status |= TXBD_TOE;
  9.                 gfar_tx_checksum(skb, fcb);
  10.         }

  11.         if (priv->vlan_enable &&
  12.                         unlikely(priv->vlgrp && vlan_tx_tag_present(skb))) {
  13.                 if (unlikely(NULL == fcb)) {
  14.                         fcb = gfar_add_fcb(skb, txbdp);
  15.                         status |= TXBD_TOE;
  16.                 }

  17.                 gfar_tx_vlan(skb, fcb);
  18.         }

  19.         if (priv->ptp_inited) {
  20.         /* Enable ptp flag so that Tx time stamping happens */
  21.                 if (gfar_ptp_do_txstamp(skb)) {
  22.                         if (fcb == NULL)
  23.                                 fcb = gfar_add_fcb(skb, txbdp);
  24.                         fcb->ptp = 0x01;
  25.                         status |= TXBD_TOE;
  26.                 }
  27.         }

  28.         /* Set buffer length and pointer */
  29.         txbdp->length = skb->len;
  30.         txbdp->bufPtr = dma_map_single(NULL, skb->data,
  31.                         skb->len, DMA_TO_DEVICE);
  32.          .............
  33. }

  34. #define GFAR_PTP_PKT_TYPE_OFFS                0x1f  //这两个数值,和linux2.6.23驱动中是不一样的?到底为什么?
  35. #define GFAR_PTP_MULTI_ADDR_OFFS        0x26

  36. int gfar_ptp_do_txstamp(struct sk_buff *skb)
  37. {
  38.         u32 *multicast_addr;
  39.         char *pkt_type;

  40.         if (skb->len > 42) {
  41.                 pkt_type = (char *)(skb->data + GFAR_PTP_PKT_TYPE_OFFS);
  42.                 multicast_addr = (u32 *)(skb->data + GFAR_PTP_MULTI_ADDR_OFFS);

  43.                 if ((*multicast_addr == GFAR_PTP_DOMAIN_DLFT) &&
  44.                                         (*pkt_type == GFAR_PACKET_TYPE_UDP))
  45.                         return 1;
  46.         }

  47.         return 0;
  48. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2009-06-27 22:19 |只看该作者
有比较两个版本的gianfar驱动之间的不同点,只是在linux2.6.24没有使能RCTRL中FILREN位?
而且理解起来,感觉是linux2.6.24的两个偏移值是正确的。。有哪位大侠,研究过这方面的指教一下。。不胜感激。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP