|
楼主 |
发表于 2012-11-22 11:32:09
|
显示全部楼层
编辑不了帖子了,只好回复了。 static int smsc95xx_reset(struct usbnet *dev)
{
struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
struct net_device *netdev = dev->net;
u32 read_buf, write_buf, burst_cap;
int ret = 0, timeout;
netif_dbg(dev, ifup, dev->net, "entering smsc95xx_reset\n");
write_buf = HW_CFG_LRST_;
ret = smsc95xx_write_reg(dev, HW_CFG, write_buf);
if (ret < 0) {
netdev_warn(dev->net, "Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = %d\n", ret); //问题就处在这个地方
return ret;
略~~ - 将request, requesttype, value, index, size加工成usb_ctrlrequest,然后调用usb_internal_control_msg()
- dev 参数dev指向目标设备的usb_device数据结构
- pipe pipe是个32位无符号整数,其最高两位表示传输的类型(实时/中断/控制/批量),其余各位包括对方的端口号以及设备号,以及设备是否为全速(或者低度)。
- requesttype requesttype其最高位表示传输的方向,最低5位则表明传输终极对象的类别(设备/接口/端口/其他)
- index, request, value index则指明具体的单元,这就是终极的操作对象。针对这个操作对象,request说明了需要进行的具体操作,而value则是参数
- data, size 如果有更多的数据需要传递(读/写),则通过缓冲区data进行,其大小为size。 这些都是从用户空间传下来的参数,而传输的目的正是要把这些信息发送给目标设备
- timeout 参数timeout表示愿意睡眠等待传输完成的时间
- ------------------------------------------------------
- int usb_control_msg(
- struct usb_device *dev, unsigned int pipe,
- __u8 -request, __u8 requesttype, __u16 value,
- __u16 index, void *data, __u16 size,
- int timeout)
- {
- struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
- int ret;
- if (!dr)
- return -ENOMEM;
- dr->bRequestType= requesttype;
- dr->bRequest = request;
- dr->wValue = cpu_to_le16p(&value);
- dr->wIndex = cpu_to_le16p(&index);
- dr->wLength = cpu_to_le16p(&size);
- ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);
- kfree(dr);
- return ret;
- }
复制代码- static int usb_internal_control_msg(
- struct usb_device *usb_dev,
- unsigned int pipe,
- struct usb_ctrlrequest *cmd,
- void *data, int len, int timeout)
- {
- struct urb *urb;
- int retv;
- int length;
- urb = usb_alloc_urb(0, GFP_NOIO);
- if (!urb)
- return -ENOMEM;
- 使用参数填充urb,并给urb安插一个回调函数usb_api_blocking_completion(),底层在处理完urb后将会调用该回调函数
- |------------------------------------------------------------------------|
- | usb_fill_control_urb( urb, -usb_dev, pipe, |
- | (unsigned char *) -cmd, |
- | data, len, usb_api_blocking_completion,|
- | NULL); |
- |------------------------------------------------------------------------|
- 设置好urb以后,通过usb_start_wait_urb()“递交”这个urb数据结构,并等待交互的完成
- |-------------------------------------------------------|
- | retv = usb_start_wait_urb(urb, timeout, &length); |
- |-------------------------------------------------------|
- if (retv < 0)
- return retv;
- else
- return length;
- }
- 注:
- 1. 根Hub最终将通过对urb进行排队
- 2. 根Hub将通过如下路径回调函数usb_api_blocking_completion()
- usb_start_wait_urb()
- --> usb_submit_urb()
- --> usb_hcd_submit_urb()
- --> rh_urb_enqueue()
- --> rh_call_control()
- --> usb_hcd_giveback_urb()
- --> usb_api_blocking_completion()
复制代码 |
|