极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16701|回复: 8

树莓派远程连接不上的一些日志。求大拿分析。

[复制链接]
发表于 2012-11-22 02:15:44 | 显示全部楼层 |阅读模式
突然出现这个错误,这是重启后在messages中查看到的。

之前的日志没有异常,
出现一下信息后的pi处于无法连接状态。

有没有人能分析下原因嗯。

Nov 22 00:26:47 raspberrypi kernel: [14033.005424] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:12:16 raspberrypi kernel: [16762.363389] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:56:39 raspberrypi kernel: [19425.498111] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:56:44 raspberrypi kernel: [19430.498271] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000114
Nov 22 01:56:49 raspberrypi kernel: [19435.498422] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:56:54 raspberrypi kernel: [19440.498575] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000118
Nov 22 01:56:59 raspberrypi kernel: [19445.498739] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:04 raspberrypi kernel: [19450.498889] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000114
Nov 22 01:57:09 raspberrypi kernel: [19455.499043] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:14 raspberrypi kernel: [19460.499198] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000118
Nov 22 01:57:21 raspberrypi kernel: [19466.599411] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:26 raspberrypi kernel: [19471.599570] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000114
Nov 22 01:57:31 raspberrypi kernel: [19476.599711] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:36 raspberrypi kernel: [19481.599863] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000118
Nov 22 01:57:41 raspberrypi kernel: [19486.600019] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:46 raspberrypi kernel: [19491.600181] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000114
Nov 22 01:57:51 raspberrypi kernel: [19496.600330] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000114
Nov 22 01:57:56 raspberrypi kernel: [19501.600498] smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x00000118
Nov 22 01:58:01 raspberrypi kernel: [19506.980660] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
Nov 22 01:58:01 raspberrypi kernel: [19506.980692] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = -110
Nov 22 01:58:07 raspberrypi kernel: [19512.980853] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
Nov 22 01:58:07 raspberrypi kernel: [19512.980886] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = -110
Nov 22 01:58:13 raspberrypi kernel: [19518.981037] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
Nov 22 01:58:13 raspberrypi kernel: [19518.981070] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = -110
Nov 22 01:58:19 raspberrypi kernel: [19524.981226] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
Nov 22 01:58:19 raspberrypi kernel: [19524.981259] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = -110
Nov 22 01:58:25 raspberrypi kernel: [19530.981412] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
Nov 22 01:58:25 raspberrypi kernel: [19530.981445] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = -110
Nov 22 01:58:31 raspberrypi kernel: [19536.981603] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
回复

使用道具 举报

 楼主| 发表于 2012-11-22 10:02:57 | 显示全部楼层
找到个相关信息但是我的设备不是这个设备。
Dell
Dell U2410 Monitor Built-in 4 Port Hub - Shows up as a pair with 0424:2514 and 0424:2640. Standard Microsystems Corp. USB 2.0 Hub. When connecting some devices it kills the Ethernet with "smsc95xx 1-1.1:1.0: eth0: Failed to read register index 0x0000011X" errors. It did work for a keyboard and webcam. Bluetooth that works connected directly to the Pi triggers the error.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 11:09:01 | 显示全部楼层
自己挖坑自己埋。~~~

找到网卡的源码,然后发现这个网卡是用的usb总线的。

static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
{
        u32 *buf = kmalloc(4, GFP_KERNEL);
        int ret;

        BUG_ON(!dev);

        if (!buf)
                return -ENOMEM;

        ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
                USB_VENDOR_REQUEST_READ_REGISTER,
                USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                00, index, buf, 4, USB_CTRL_GET_TIMEOUT);

        if (unlikely(ret < 0))
                netdev_warn(dev->net, "Failed to read register index 0x%08x\n", index);

        le32_to_cpus(buf);
        *data = *buf;
        kfree(buf);

        return ret;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
略~~
  1. 将request, requesttype, value, index, size加工成usb_ctrlrequest,然后调用usb_internal_control_msg()

  2. dev                     参数dev指向目标设备的usb_device数据结构
  3. pipe                    pipe是个32位无符号整数,其最高两位表示传输的类型(实时/中断/控制/批量),其余各位包括对方的端口号以及设备号,以及设备是否为全速(或者低度)。
  4. requesttype             requesttype其最高位表示传输的方向,最低5位则表明传输终极对象的类别(设备/接口/端口/其他)
  5. index, request, value   index则指明具体的单元,这就是终极的操作对象。针对这个操作对象,request说明了需要进行的具体操作,而value则是参数
  6. data, size              如果有更多的数据需要传递(读/写),则通过缓冲区data进行,其大小为size。 这些都是从用户空间传下来的参数,而传输的目的正是要把这些信息发送给目标设备
  7. timeout                 参数timeout表示愿意睡眠等待传输完成的时间
  8. ------------------------------------------------------
  9. int usb_control_msg(
  10.     struct usb_device   *dev, unsigned int   pipe,
  11.     __u8 -request, __u8 requesttype, __u16   value,   
  12.     __u16 index,   void *data,       __u16   size,
  13.     int   timeout)
  14. {
  15.     struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
  16.     int ret;
  17.     if (!dr)
  18.         return -ENOMEM;
  19.     dr->bRequestType= requesttype;
  20.     dr->bRequest = request;
  21.     dr->wValue = cpu_to_le16p(&value);
  22.     dr->wIndex = cpu_to_le16p(&index);
  23.     dr->wLength = cpu_to_le16p(&size);
  24.     ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);
  25.     kfree(dr);
  26.     return ret;
  27. }
复制代码
  1. static int usb_internal_control_msg(
  2.                     struct usb_device        *usb_dev,
  3.                     unsigned int             pipe,
  4.                     struct usb_ctrlrequest   *cmd,
  5.                     void *data, int len, int timeout)
  6. {
  7.     struct urb *urb;
  8.     int retv;
  9.     int length;
  10.     urb = usb_alloc_urb(0, GFP_NOIO);
  11.     if (!urb)
  12.         return -ENOMEM;

  13. 使用参数填充urb,并给urb安插一个回调函数usb_api_blocking_completion(),底层在处理完urb后将会调用该回调函数
  14. |------------------------------------------------------------------------|
  15. |   usb_fill_control_urb( urb,   -usb_dev,   pipe,                       |
  16. |                         (unsigned char *) -cmd,                        |
  17. |                         data,   len,       usb_api_blocking_completion,|
  18. |                         NULL);                                         |
  19. |------------------------------------------------------------------------|

  20. 设置好urb以后,通过usb_start_wait_urb()“递交”这个urb数据结构,并等待交互的完成
  21. |-------------------------------------------------------|
  22. |   retv = usb_start_wait_urb(urb, timeout, &length);   |
  23. |-------------------------------------------------------|
  24.     if (retv < 0)
  25.         return retv;
  26.     else
  27.         return length;
  28. }

  29. 注:
  30. 1.   根Hub最终将通过对urb进行排队

  31. 2.   根Hub将通过如下路径回调函数usb_api_blocking_completion()
  32.     usb_start_wait_urb()
  33.     --> usb_submit_urb()
  34.     --> usb_hcd_submit_urb()
  35.     --> rh_urb_enqueue()
  36.     --> rh_call_control()
  37.     --> usb_hcd_giveback_urb()
  38.     --> usb_api_blocking_completion()   
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 11:34:42 | 显示全部楼层
  1. static int usb_start_wait_urb( struct urb *urb,
  2.                                int        timeout,
  3.                                int        *actual_length)
  4. {
  5.     struct completion done;
  6.     unsigned long expire;
  7.     int status;
  8.     init_completion(&done);
  9.     urb->context = &done;
  10.     urb->actual_length = 0;

  11. 将加工好的urb递交给主控制器排队 //问题在这。:@
  12. |---------------------------------------------|
  13. |   status = usb_submit_urb(urb, GFP_NOIO);   |
  14. |---------------------------------------------|

  15.     if (unlikely(status))
  16.         goto out;
  17.     expire = timeout ? msecs_to_jiffies(timeout) : MAX_SCHEDULE_TIMEOUT;
  18.     if (!wait_for_completion_timeout(&done, expire)) {
  19.         dev_dbg(&urb->dev->dev,
  20.             "%s timed out on ep%d%s len=%d/%d\n",
  21.             current->comm,
  22.             usb_pipeendpoint(urb->pipe),
  23.             usb_pipein(urb->pipe) ? "in" : "out",
  24.             urb->actual_length,
  25.             urb->transfer_buffer_length);

  26. 通过urb获取有效数据后,urb的使命就完成了
  27. |------------------------------|
  28. |       usb_kill_urb(urb);     |
  29. |------------------------------|
  30.         status = urb->status == -ENOENT ? -ETIMEDOUT : urb->status;   
  31.     } else
  32.         status = urb->status;
  33. out:
  34.     if (actual_length)         
  35.         *actual_length = urb->actual_length;
  36.     usb_free_urb(urb);
  37.     return status;
  38. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 11:36:02 | 显示全部楼层
最后到了最关键的了

错误代码:
-ENOMEM        内存不足
-ENODEV        没有设备可用
-EPIPE         端点停止
-EAGAIN        排队等候同步传输的太多
-EFBIG         请求ISO frame的太多
-EINVAL        无效的中断间隔

函数usb_submit_urb递交URB后,urb->status为-EINPROGRESS.
--------------------------------------------------------

  1. int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
  2. {
  3.     int            pipe, temp, max;
  4.     struct usb_device    *dev;
  5.     int            is_out;

  6.     if (!urb || urb->hcpriv || !urb->complete)
  7.         return -EINVAL;
  8.     if (!(dev = urb->dev) ||
  9.         (dev->state < USB_STATE_DEFAULT) ||
  10.         (!dev->bus) || (dev->devnum <= 0))
  11.         return -ENODEV;
  12.     if (dev->bus->controller->power.power_state.event != PM_EVENT_ON
  13.             || dev->state == USB_STATE_SUSPENDED)
  14.         return -EHOSTUNREACH;

  15.     urb->status = -EINPROGRESS;
  16.     urb->actual_length = 0;
  17.     pipe = urb->pipe;
  18.     temp = usb_pipetype(pipe);
  19.     is_out = usb_pipeout(pipe);

  20.     if (!usb_pipecontrol(pipe) && dev->state < USB_STATE_CONFIGURED)
  21.         return -ENODEV;

  22.     //获取usb设备dev所能传输的数据包的最大值(单位是字节)
  23.     max = usb_maxpacket(dev, pipe, is_out);
  24.     if (max <= 0) {
  25.         dev_dbg(&dev->dev,
  26.             "bogus endpoint ep%d%s in %s (bad maxpacket %d)\n",
  27.             usb_pipeendpoint(pipe), is_out ? "out" : "in",
  28.             __FUNCTION__, max);
  29.         return -EMSGSIZE;
  30.     }


  31. 处理“负责实时传输的urb”
  32. |---------------------------------------------------------|
  33. |    if (temp == PIPE_ISOCHRONOUS) {                      |
  34. |        int    n, len;                                   |
  35. |        if (dev->speed == USB_SPEED_HIGH) {              |
  36. |            int    mult = 1 + ((max >> 11) & 0x03);      |
  37. |            max &= 0x07ff;                               |
  38. |            max *= mult;                                 |
  39. |        }                                                |
  40. |        if (urb->number_of_packets <= 0)                 |
  41. |            return -EINVAL;                              |
  42. |        for (n = 0; n < urb->number_of_packets; n++) {   |
  43. |            len = urb->iso_frame_desc[n].length;         |
  44. |            if (len < 0 || len > max)                    |
  45. |                return -EMSGSIZE;                        |
  46. |            urb->iso_frame_desc[n].status = -EXDEV;      |
  47. |            urb->iso_frame_desc[n].actual_length = 0;    |
  48. |        }                                                |
  49. |    }                                                    |
  50. |---------------------------------------------------------|

  51.     if (urb->transfer_buffer_length < 0)
  52.         return -EMSGSIZE;


  53. --------------------------------------------------------
  54. #ifdef DEBUG
  55.     {
  56.     unsigned int    orig_flags = urb->transfer_flags;
  57.     unsigned int    allowed;
  58.     allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP |
  59.             URB_NO_INTERRUPT);
  60.     switch (temp) {
  61.     case PIPE_BULK:
  62.         if (is_out)
  63.             allowed |= URB_ZERO_PACKET;
  64.     case PIPE_CONTROL:
  65.         allowed |= URB_NO_FSBR;   
  66.     default:            
  67.         if (!is_out)
  68.             allowed |= URB_SHORT_NOT_OK;
  69.         break;
  70.     case PIPE_ISOCHRONOUS:
  71.         allowed |= URB_ISO_ASAP;
  72.         break;
  73.     }
  74.     urb->transfer_flags &= allowed;
  75.     if (urb->transfer_flags != orig_flags) {
  76.         err("BOGUS urb flags, %x --> %x",
  77.             orig_flags, urb->transfer_flags);
  78.         return -EINVAL;
  79.     }
  80.     }
  81. #endif
  82. --------------------------------------------------------


  83. 设置urb的interval域
  84. ********************************************************
  85.     switch (temp) {
  86.     case PIPE_ISOCHRONOUS:
  87.     case PIPE_INTERRUPT:
  88.         if (urb->interval <= 0)
  89.             return -EINVAL;
  90.         switch (dev->speed) {
  91.         case USB_SPEED_HIGH:   
  92.             if (urb->interval > (1024 * 8))
  93.                 urb->interval = 1024 * 8;
  94.             temp = 1024 * 8;
  95.             break;
  96.         case USB_SPEED_FULL:   
  97.         case USB_SPEED_LOW:
  98.             if (temp == PIPE_INTERRUPT) {
  99.                 if (urb->interval > 255)
  100.                     return -EINVAL;
  101.                 temp = 128;
  102.             } else {
  103.                 if (urb->interval > 1024)
  104.                     urb->interval = 1024;
  105.                 temp = 1024;
  106.             }
  107.             break;
  108.         default:
  109.             return -EINVAL;
  110.         }
  111.         while (temp > urb->interval)
  112.             temp >>= 1;
  113.         urb->interval = temp;
  114.     }
  115. ********************************************************


  116.     return usb_hcd_submit_urb(urb, mem_flags);
  117. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-11-22 17:53:01 | 显示全部楼层
一头雾水! 楼主是用RJ45口还是有插了一个无线网卡?
回复 支持 反对

使用道具 举报

发表于 2012-11-22 18:00:22 | 显示全部楼层
google了一下,你看看是不是这个供电干扰问题,您把给raspi供电 和 路由器供电分开试试,或者换个适配器。
原文参考:http://www.raspberrypi.org/phpBB ... =11971&p=129570
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 21:06:26 | 显示全部楼层
本帖最后由 Damn_intuition 于 2012-11-22 21:13 编辑
gaoshine 发表于 2012-11-22 18:00
google了一下,你看看是不是这个供电干扰问题,您把给raspi供电 和 路由器供电分开试试,或者换个适配器。
...


谢谢,我看了下电路和源码,根据猜测是因为usb设备出问题导致的。

因为现在我找不到0x000000那个错误码(手里没有完整的源码),错误码的值定义还不明确。


貌似是因为设备的一些电路因为插排产生电子干扰。产生了一些回路什么的。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 11:10 , Processed in 0.038623 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表