阅读:1945回复:0
谁帮我读读这段usb驱动代码?
哪位高手给我讲解一下,还有那个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] |
|