免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] e100网卡包发送的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-01 17:07 |只看该作者 |倒序浏览
从下面的代码来看,e100的包发送似乎是同步的,也就是发一个就等待一个完成(见循环执行e100_exec_cmd),浪费大量CPU时间。可是按CB List的构成,CPU 似乎可以提交transmit descriptor,然后启动CU(comand unit),处理整个CB链表。 事实上,e100接收过程就是这样做的,但是发送过程为什么没有这样做呢?
  1. static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
  2.         void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
  3. {
  4.         struct cb *cb;
  5.         unsigned long flags;
  6.         int err = 0;

  7.         spin_lock_irqsave(&nic->cb_lock, flags);

  8.         if (unlikely(!nic->cbs_avail)) {
  9.                 err = -ENOMEM;
  10.                 goto err_unlock;
  11.         }

  12.         cb = nic->cb_to_use;
  13.         nic->cb_to_use = cb->next;
  14.         nic->cbs_avail--;
  15.         cb->skb = skb;

  16.         if (unlikely(!nic->cbs_avail))
  17.                 err = -ENOSPC;

  18.         cb_prepare(nic, cb, skb);

  19.         /* Order is important otherwise we'll be in a race with h/w:
  20.          * set S-bit in current first, then clear S-bit in previous. */
  21.         cb->command |= cpu_to_le16(cb_s);
  22.         wmb();
  23.         cb->prev->command &= cpu_to_le16(~cb_s);

  24.         while (nic->cb_to_send != nic->cb_to_use) {
  25.                 if (unlikely(e100_exec_cmd(nic, nic->cuc_cmd,
  26.                         nic->cb_to_send->dma_addr))) {
  27.                         /* Ok, here's where things get sticky.  It's
  28.                          * possible that we can't schedule the command
  29.                          * because the controller is too busy, so
  30.                          * let's just queue the command and try again
  31.                          * when another command is scheduled. */
  32.                         if (err == -ENOSPC) {
  33.                                 //request a reset
  34.                                 schedule_work(&nic->tx_timeout_task);
  35.                         }
  36.                         break;
  37.                 } else {
  38.                         nic->cuc_cmd = cuc_resume;
  39.                         nic->cb_to_send = nic->cb_to_send->next;
  40.                 }
  41.         }

  42. err_unlock:
  43.         spin_unlock_irqrestore(&nic->cb_lock, flags);

  44.         return err;
  45. }

  46. static int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
  47. {
  48.         unsigned long flags;
  49.         unsigned int i;
  50.         int err = 0;

  51.         spin_lock_irqsave(&nic->cmd_lock, flags);

  52.         /* Previous command is accepted when SCB clears */
  53.         for (i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
  54.                 if (likely(!ioread8(&nic->csr->scb.cmd_lo)))
  55.                         break;
  56.                 cpu_relax();
  57.                 if (unlikely(i > E100_WAIT_SCB_FAST))
  58.                         udelay(5);
  59.         }
  60.         if (unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
  61.                 err = -EAGAIN;
  62.                 goto err_unlock;
  63.         }

  64.         if (unlikely(cmd != cuc_resume))
  65.                 iowrite32(dma_addr, &nic->csr->scb.gen_ptr);
  66.         iowrite8(cmd, &nic->csr->scb.cmd_lo);

  67. err_unlock:
  68.         spin_unlock_irqrestore(&nic->cmd_lock, flags);

  69.         return err;
  70. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP