Redlove
驱动牛犊
驱动牛犊
  • 注册日期2001-11-05
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1945回复:0

谁帮我读读这段usb驱动代码?

楼主#
更多 发布于:2001-11-07 12:25
哪位高手给我讲解一下,还有那个kaweth_resubmit_rx_urb在kaweth_usb_receive调来调去的是怎么一会事,谢谢!

static inline void kaweth_resubmit_rx_urb(struct kaweth_device *kaweth)
{
...
FILL_BULK_URB(kaweth->rx_urb,
     kaweth->dev,
     usb_rcvbulkpipe(kaweth->dev, 1),
     kaweth->rx_buf,
     KAWETH_BUF_SIZE,
     kaweth_usb_receive,
     kaweth);
if((result = usb_submit_urb(kaweth->rx_urb))) {
kaweth_err("resubmitting rx_urb %d failed", result);
}
}

************************************************************
static void kaweth_usb_receive(struct urb *urb)
{
struct kaweth_device *kaweth = urb->context;
struct net_device *net = kaweth->net;

int count = urb->actual_length;
int count2 = urb->transfer_buffer_length;

__u16 pkt_len = le16_to_cpup(kaweth->rx_buf);

struct sk_buff *skb;

if(kaweth->status & KAWETH_STATUS_CLOSING) {
return;
}

if(urb->status && urb->status != -EREMOTEIO && count != 1) {
kaweth_err("%s RX status: %d count: %d packet_len: %d",
                           net->name,
  urb->status,
  count,
  (int)pkt_len);
kaweth_resubmit_rx_urb(kaweth);
                return;
}

if(kaweth->net && (count > 2)) {
if(pkt_len > (count - 2)) {
kaweth_err("Packet length too long for USB frame (pkt_len: %x, count: %x)",pkt_len, count);
kaweth_err("Packet len & 2047: %x", pkt_len & 2047);
kaweth_err("Count 2: %x", count2);
       kaweth_resubmit_rx_urb(kaweth);
                        return;
                }

if(!(skb = dev_alloc_skb(pkt_len+2))) {
       kaweth_resubmit_rx_urb(kaweth);
                        return;
}

skb->dev = net;

eth_copy_and_sum(skb, kaweth->rx_buf + 2, pkt_len, 0);

skb_put(skb, pkt_len);

skb->protocol = eth_type_trans(skb, net);

netif_rx(skb);

kaweth->stats.rx_packets++;
kaweth->stats.rx_bytes += pkt_len;
}

kaweth_resubmit_rx_urb(kaweth);
}



[Redlove 编辑于 2001-11-07 12:46]
游客

返回顶部