usb_hub 有这样一个变量quiescing
如果这个值设置成 1,表示这个usb_hub 是静止的,驱动也就不会向所有的port 发送
请求状态的报文。
Hub_events走到这里就可以continue了
如果error 被设置了值,那就需要重启了
usb_reset_composite_device
首先需要判断这个设备的状态
如果是suspend 或者是noattach,那么就直接返回失败
我们在reset的过程中,不能进行autosuspend 了
对于一个usb_device 来说,可能有多个interface
如果这些interface对应的设备已经注册,且有驱动,则调用他们的预重启函数
当然重启后还得调用他们的postreset函数
接下来开始真正的重启这个usb_hub设备
再次检查这个usb_device的状态
先找到这个usb_device 对应的usb_hub ,将对应的port 设置为busy
重启后 端点0 的最大包长度可能会发生改变
hub_port_init 重新初始化
这个函数是重启设备使用的,指定设备地址,获取设备描述符
前提是这个设备的连接是稳定的
如果是被一个已经存在的设备调用,那么就需要上锁
Root hub 的port 重启所使用的时间比较长,超时设置成50ms
如果这个设备是一个低速设备,超时时间设置得更长200ms
发生控制包 获取描述
真正开始重启hub的port
管道号的生成
设备号左移8位,端点号左移15位