瀏覽代碼

Fix USB host core issues.

1. Limit >4 USB ports hubs.
2. Double free intf.
3. dname buffer size is too small.
4. Reset child pointer after detaching instance.
Wayne Lin 4 年之前
父節點
當前提交
f4d86cec7f
共有 2 個文件被更改,包括 13 次插入4 次删除
  1. 1 1
      components/drivers/usb/usbhost/class/udisk.c
  2. 12 3
      components/drivers/usb/usbhost/core/hub.c

+ 1 - 1
components/drivers/usb/usbhost/class/udisk.c

@@ -186,7 +186,7 @@ rt_err_t rt_udisk_run(struct uhintf* intf)
 {
     int i = 0;
     rt_err_t ret;
-    char dname[4];
+    char dname[8];
     char sname[8];
     rt_uint8_t max_lun, *sector, sense[18], inquiry[36];
     struct dfs_partition part[MAX_PARTITION_COUNT];

+ 12 - 3
components/drivers/usb/usbhost/core/hub.c

@@ -417,8 +417,13 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
         
         if(reconnect)
         {            
-            if(hub->child[i] != RT_NULL && hub->child[i]->status != DEV_STATUS_IDLE) 
+            if(hub->child[i] != RT_NULL && hub->child[i]->status != DEV_STATUS_IDLE)
+            { 
                 rt_usbh_detach_instance(hub->child[i]);
+
+                /* Child device have been detach. Set hub->child[i] to NULL. */
+                hub->child[i] = RT_NULL;
+            }
             
             ret = rt_usbh_hub_port_debounce(hub, i + 1);
             if(ret != RT_EOK) continue;
@@ -532,7 +537,12 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
     }    
 
     /* get hub ports number */
-    hub->num_ports = hub->hub_desc.num_ports;
+    /* If hub device supported ports over USB_HUB_PORT_NUM(Ex: 8 port hub). Set hub->num_ports to USB_HUB_PORT_NUM */
+    if(hub->hub_desc.num_ports > USB_HUB_PORT_NUM)
+        hub->num_ports = USB_HUB_PORT_NUM;
+    else
+        hub->num_ports = hub->hub_desc.num_ports;
+
     hub->hcd = device->hcd;
     hub->self = device;
 
@@ -607,7 +617,6 @@ static rt_err_t rt_usbh_hub_disable(void* arg)
     }
     
     if(hub != RT_NULL) rt_free(hub);
-    if(intf != RT_NULL) rt_free(intf);
 
     return RT_EOK;
 }