hub.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:26k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * USB hub driver.
  3.  *
  4.  * (C) Copyright 1999 Linus Torvalds
  5.  * (C) Copyright 1999 Johannes Erdfelt
  6.  * (C) Copyright 1999 Gregory P. Smith
  7.  * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au)
  8.  *
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/completion.h>
  14. #include <linux/sched.h>
  15. #include <linux/list.h>
  16. #include <linux/slab.h>
  17. #include <linux/smp_lock.h>
  18. #ifdef CONFIG_USB_DEBUG
  19. #define DEBUG
  20. #else
  21. #undef DEBUG
  22. #endif
  23. #include <linux/usb.h>
  24. #include <linux/usbdevice_fs.h>
  25. #include <asm/semaphore.h>
  26. #include <asm/uaccess.h>
  27. #include <asm/byteorder.h>
  28. #include "hub.h"
  29. /* Wakes up khubd */
  30. static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED;
  31. static DECLARE_MUTEX(usb_address0_sem);
  32. static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */
  33. static LIST_HEAD(hub_list); /* List containing all of the hubs (for cleanup) */
  34. static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);
  35. static int khubd_pid = 0; /* PID of khubd */
  36. static DECLARE_COMPLETION(khubd_exited);
  37. #ifdef DEBUG
  38. static inline char *portspeed (int portstatus)
  39. {
  40. if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))
  41.      return "480 Mb/s";
  42. else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED))
  43. return "1.5 Mb/s";
  44. else
  45. return "12 Mb/s";
  46. }
  47. #endif
  48. /* USB 2.0 spec Section 11.24.4.5 */
  49. static int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size)
  50. {
  51. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  52. USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
  53. USB_DT_HUB << 8, 0, data, size, HZ);
  54. }
  55. /*
  56.  * USB 2.0 spec Section 11.24.2.1
  57.  */
  58. static int usb_clear_hub_feature(struct usb_device *dev, int feature)
  59. {
  60. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  61. USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, HZ);
  62. }
  63. /*
  64.  * USB 2.0 spec Section 11.24.2.2
  65.  * BUG: doesn't handle port indicator selector in high byte of wIndex
  66.  */
  67. static int usb_clear_port_feature(struct usb_device *dev, int port, int feature)
  68. {
  69. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  70. USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);
  71. }
  72. /*
  73.  * USB 2.0 spec Section 11.24.2.13
  74.  * BUG: doesn't handle port indicator selector in high byte of wIndex
  75.  */
  76. static int usb_set_port_feature(struct usb_device *dev, int port, int feature)
  77. {
  78. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  79. USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);
  80. }
  81. /*
  82.  * USB 2.0 spec Section 11.24.2.6
  83.  */
  84. static int usb_get_hub_status(struct usb_device *dev, void *data)
  85. {
  86. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  87. USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0,
  88. data, sizeof(struct usb_hub_status), HZ);
  89. }
  90. /*
  91.  * USB 2.0 spec Section 11.24.2.7
  92.  */
  93. static int usb_get_port_status(struct usb_device *dev, int port, void *data)
  94. {
  95. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  96. USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,
  97. data, sizeof(struct usb_hub_status), HZ);
  98. }
  99. static void hub_irq(struct urb *urb)
  100. {
  101. struct usb_hub *hub = (struct usb_hub *)urb->context;
  102. unsigned long flags;
  103. /* Cause a hub reset after 10 consecutive errors */
  104. if (urb->status) {
  105. if (urb->status == -ENOENT)
  106. return;
  107. dbg("nonzero status in irq %d", urb->status);
  108. if ((++hub->nerrors < 10) || hub->error)
  109. return;
  110. hub->error = urb->status;
  111. }
  112. hub->nerrors = 0;
  113. /* Something happened, let khubd figure it out */
  114. spin_lock_irqsave(&hub_event_lock, flags);
  115. if (list_empty(&hub->event_list)) {
  116. list_add(&hub->event_list, &hub_event_list);
  117. wake_up(&khubd_wait);
  118. }
  119. spin_unlock_irqrestore(&hub_event_lock, flags);
  120. }
  121. static void usb_hub_power_on(struct usb_hub *hub)
  122. {
  123. int i;
  124. /* Enable power to the ports */
  125. dbg("enabling power on all ports");
  126. for (i = 0; i < hub->descriptor->bNbrPorts; i++)
  127. usb_set_port_feature(hub->dev, i + 1, USB_PORT_FEAT_POWER);
  128. /* Wait for power to be enabled */
  129. wait_ms(hub->descriptor->bPwrOn2PwrGood * 2);
  130. }
  131. #if 0
  132. static void usb_hub_port_suspend(struct usb_hub *hub, int port)
  133. {
  134. usb_set_port_feature(hub->dev, port + 1, USB_PORT_FEAT_SUSPEND);
  135. }
  136. #endif
  137. static int usb_hub_configure(struct usb_hub *hub, struct usb_endpoint_descriptor *endpoint)
  138. {
  139. struct usb_device *dev = hub->dev;
  140. struct usb_hub_status hubstatus;
  141. char portstr[USB_MAXCHILDREN + 1];
  142. unsigned int pipe;
  143. int i, maxp, ret;
  144. hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);
  145. if (!hub->descriptor) {
  146. err("Unable to kmalloc %Zd bytes for hub descriptor", sizeof(*hub->descriptor));
  147. return -1;
  148. }
  149. /* Request the entire hub descriptor. */
  150. ret = usb_get_hub_descriptor(dev, hub->descriptor, sizeof(*hub->descriptor));
  151. // BUSHI //
  152. #ifdef CONFIG_ARCH_S3C2410
  153. if ((dev->devnum == 1)  // Root Hub
  154. && hub->descriptor->bNbrPorts > CONFIG_MAX_ROOT_PORTS) {
  155. for (i=hub->descriptor->bNbrPorts-1; i>=0; i--) {
  156. printk("port #%d ", i);
  157. if (i > CONFIG_MAX_ROOT_PORTS-1) {
  158. // usb_hub_port_suspend(hub, i);
  159. printk("suspened!n");
  160. } else {
  161. printk("alived!n");
  162. }
  163. }
  164. hub->descriptor->bNbrPorts = CONFIG_MAX_ROOT_PORTS;
  165. }
  166. #endif
  167. /////////
  168. /* <hub->descriptor> is large enough for a hub with 127 ports;
  169.  * the hub can/will return fewer bytes here. */
  170. if (ret < 0) {
  171. err("Unable to get hub descriptor (err = %d)", ret);
  172. kfree(hub->descriptor);
  173. return -1;
  174. }
  175. dev->maxchild = hub->descriptor->bNbrPorts;
  176. info("%d port%s detected", hub->descriptor->bNbrPorts, (hub->descriptor->bNbrPorts == 1) ? "" : "s");
  177. le16_to_cpus(&hub->descriptor->wHubCharacteristics);
  178. if (hub->descriptor->wHubCharacteristics & HUB_CHAR_COMPOUND)
  179. dbg("part of a compound device");
  180. else
  181. dbg("standalone hub");
  182. switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) {
  183. case 0x00:
  184. dbg("ganged power switching");
  185. break;
  186. case 0x01:
  187. dbg("individual port power switching");
  188. break;
  189. case 0x02:
  190. case 0x03:
  191. dbg("unknown reserved power switching mode");
  192. break;
  193. }
  194. switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) {
  195. case 0x00:
  196. dbg("global over-current protection");
  197. break;
  198. case 0x08:
  199. dbg("individual port over-current protection");
  200. break;
  201. case 0x10:
  202. case 0x18:
  203. dbg("no over-current protection");
  204.                         break;
  205. }
  206. switch (dev->descriptor.bDeviceProtocol) {
  207. case 0:
  208. break;
  209. case 1:
  210. dbg("Single TT");
  211. break;
  212. case 2:
  213. dbg("Multiple TT");
  214. break;
  215. default:
  216. dbg("Unrecognized hub protocol %d",
  217. dev->descriptor.bDeviceProtocol);
  218. break;
  219. }
  220. switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {
  221. case 0x00:
  222. if (dev->descriptor.bDeviceProtocol != 0)
  223. dbg("TT requires at most 8 FS bit times");
  224. break;
  225. case 0x20:
  226. dbg("TT requires at most 16 FS bit times");
  227. break;
  228. case 0x40:
  229. dbg("TT requires at most 24 FS bit times");
  230. break;
  231. case 0x60:
  232. dbg("TT requires at most 32 FS bit times");
  233. break;
  234. }
  235. dbg("Port indicators are %s supported", 
  236.     (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) ? "" : "not");
  237. dbg("power on to power good time: %dms", hub->descriptor->bPwrOn2PwrGood * 2);
  238. dbg("hub controller current requirement: %dmA", hub->descriptor->bHubContrCurrent);
  239. for (i = 0; i < dev->maxchild; i++)
  240. portstr[i] = hub->descriptor->DeviceRemovable[((i + 1) / 8)] & (1 << ((i + 1) % 8)) ? 'F' : 'R';
  241. portstr[dev->maxchild] = 0;
  242. dbg("port removable status: %s", portstr);
  243. ret = usb_get_hub_status(dev, &hubstatus);
  244. if (ret < 0) {
  245. err("Unable to get hub status (err = %d)", ret);
  246. kfree(hub->descriptor);
  247. return -1;
  248. }
  249. le16_to_cpus(&hubstatus.wHubStatus);
  250. dbg("local power source is %s",
  251. (hubstatus.wHubStatus & HUB_STATUS_LOCAL_POWER) ? "lost (inactive)" : "good");
  252. dbg("%sover-current condition exists",
  253. (hubstatus.wHubStatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");
  254. /* Start the interrupt endpoint */
  255. pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
  256. maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
  257. if (maxp > sizeof(hub->buffer))
  258. maxp = sizeof(hub->buffer);
  259. hub->urb = usb_alloc_urb(0);
  260. if (!hub->urb) {
  261. err("couldn't allocate interrupt urb");
  262. kfree(hub->descriptor);
  263. return -1;
  264. }
  265. FILL_INT_URB(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq,
  266. hub, endpoint->bInterval);
  267. ret = usb_submit_urb(hub->urb);
  268. if (ret) {
  269. err("usb_submit_urb failed (%d)", ret);
  270. kfree(hub->descriptor);
  271. return -1;
  272. }
  273. /* Wake up khubd */
  274. wake_up(&khubd_wait);
  275. usb_hub_power_on(hub);
  276. return 0;
  277. }
  278. static void *hub_probe(struct usb_device *dev, unsigned int i,
  279.        const struct usb_device_id *id)
  280. {
  281. struct usb_interface_descriptor *interface;
  282. struct usb_endpoint_descriptor *endpoint;
  283. struct usb_hub *hub;
  284. unsigned long flags;
  285. interface = &dev->actconfig->interface[i].altsetting[0];
  286. /* Some hubs have a subclass of 1, which AFAICT according to the */
  287. /*  specs is not defined, but it works */
  288. if ((interface->bInterfaceSubClass != 0) &&
  289.     (interface->bInterfaceSubClass != 1)) {
  290. err("invalid subclass (%d) for USB hub device #%d",
  291. interface->bInterfaceSubClass, dev->devnum);
  292. return NULL;
  293. }
  294. /* Multiple endpoints? What kind of mutant ninja-hub is this? */
  295. if (interface->bNumEndpoints != 1) {
  296. err("invalid bNumEndpoints (%d) for USB hub device #%d",
  297. interface->bNumEndpoints, dev->devnum);
  298. return NULL;
  299. }
  300. endpoint = &interface->endpoint[0];
  301. /* Output endpoint? Curiousier and curiousier.. */
  302. if (!(endpoint->bEndpointAddress & USB_DIR_IN)) {
  303. err("Device #%d is hub class, but has output endpoint?",
  304. dev->devnum);
  305. return NULL;
  306. }
  307. /* If it's not an interrupt endpoint, we'd better punt! */
  308. if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) {
  309. err("Device #%d is hub class, but has endpoint other than interrupt?",
  310. dev->devnum);
  311. return NULL;
  312. }
  313. /* We found a hub */
  314. info("USB hub found");
  315. hub = kmalloc(sizeof(*hub), GFP_KERNEL);
  316. if (!hub) {
  317. err("couldn't kmalloc hub struct");
  318. return NULL;
  319. }
  320. memset(hub, 0, sizeof(*hub));
  321. INIT_LIST_HEAD(&hub->event_list);
  322. hub->dev = dev;
  323. init_MUTEX(&hub->khubd_sem);
  324. /* Record the new hub's existence */
  325. spin_lock_irqsave(&hub_event_lock, flags);
  326. INIT_LIST_HEAD(&hub->hub_list);
  327. list_add(&hub->hub_list, &hub_list);
  328. spin_unlock_irqrestore(&hub_event_lock, flags);
  329. if (usb_hub_configure(hub, endpoint) >= 0)
  330. return hub;
  331. err("hub configuration failed for device #%d", dev->devnum);
  332. /* free hub, but first clean up its list. */
  333. spin_lock_irqsave(&hub_event_lock, flags);
  334. /* Delete it and then reset it */
  335. list_del(&hub->event_list);
  336. INIT_LIST_HEAD(&hub->event_list);
  337. list_del(&hub->hub_list);
  338. INIT_LIST_HEAD(&hub->hub_list);
  339. spin_unlock_irqrestore(&hub_event_lock, flags);
  340. kfree(hub);
  341. return NULL;
  342. }
  343. static void hub_disconnect(struct usb_device *dev, void *ptr)
  344. {
  345. struct usb_hub *hub = (struct usb_hub *)ptr;
  346. unsigned long flags;
  347. spin_lock_irqsave(&hub_event_lock, flags);
  348. /* Delete it and then reset it */
  349. list_del(&hub->event_list);
  350. INIT_LIST_HEAD(&hub->event_list);
  351. list_del(&hub->hub_list);
  352. INIT_LIST_HEAD(&hub->hub_list);
  353. spin_unlock_irqrestore(&hub_event_lock, flags);
  354. down(&hub->khubd_sem); /* Wait for khubd to leave this hub alone. */
  355. up(&hub->khubd_sem);
  356. if (hub->urb) {
  357. usb_unlink_urb(hub->urb);
  358. usb_free_urb(hub->urb);
  359. hub->urb = NULL;
  360. }
  361. if (hub->descriptor) {
  362. kfree(hub->descriptor);
  363. hub->descriptor = NULL;
  364. }
  365. /* Free the memory */
  366. kfree(hub);
  367. }
  368. static int hub_ioctl(struct usb_device *hub, unsigned int code, void *user_data)
  369. {
  370. /* assert ifno == 0 (part of hub spec) */
  371. switch (code) {
  372. case USBDEVFS_HUB_PORTINFO: {
  373. struct usbdevfs_hub_portinfo *info = user_data;
  374. unsigned long flags;
  375. int i;
  376. spin_lock_irqsave(&hub_event_lock, flags);
  377. if (hub->devnum <= 0)
  378. info->nports = 0;
  379. else {
  380. info->nports = hub->maxchild;
  381. for (i = 0; i < info->nports; i++) {
  382. if (hub->children[i] == NULL)
  383. info->port[i] = 0;
  384. else
  385. info->port[i] = hub->children[i]->devnum;
  386. }
  387. }
  388. spin_unlock_irqrestore(&hub_event_lock, flags);
  389. return info->nports + 1;
  390. }
  391. default:
  392. return -ENOSYS;
  393. }
  394. }
  395. static int usb_hub_reset(struct usb_hub *hub)
  396. {
  397. struct usb_device *dev = hub->dev;
  398. int i;
  399. /* Disconnect any attached devices */
  400. for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
  401. if (dev->children[i])
  402. usb_disconnect(&dev->children[i]);
  403. }
  404. /* Attempt to reset the hub */
  405. if (hub->urb)
  406. usb_unlink_urb(hub->urb);
  407. else
  408. return -1;
  409. if (usb_reset_device(dev))
  410. return -1;
  411. hub->urb->dev = dev;                                                    
  412. if (usb_submit_urb(hub->urb))
  413. return -1;
  414. usb_hub_power_on(hub);
  415. return 0;
  416. }
  417. static void usb_hub_disconnect(struct usb_device *dev)
  418. {
  419. struct usb_device *parent = dev->parent;
  420. int i;
  421. /* Find the device pointer to disconnect */
  422. if (parent) {
  423. for (i = 0; i < parent->maxchild; i++) {
  424. if (parent->children[i] == dev) {
  425. usb_disconnect(&parent->children[i]);
  426. return;
  427. }
  428. }
  429. }
  430. err("cannot disconnect hub %d", dev->devnum);
  431. }
  432. #define HUB_RESET_TRIES 5
  433. #define HUB_PROBE_TRIES 2
  434. #define HUB_SHORT_RESET_TIME 10
  435. #define HUB_LONG_RESET_TIME 200
  436. #define HUB_RESET_TIMEOUT 500
  437. /* return: -1 on error, 0 on success, 1 on disconnect.  */
  438. static int usb_hub_port_wait_reset(struct usb_device *hub, int port,
  439. struct usb_device *dev, unsigned int delay)
  440. {
  441. int delay_time, ret;
  442. struct usb_port_status portsts;
  443. unsigned short portchange, portstatus;
  444. for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT; delay_time += delay) {
  445. /* wait to give the device a chance to reset */
  446. wait_ms(delay);
  447. /* read and decode port status */
  448. ret = usb_get_port_status(hub, port + 1, &portsts);
  449. if (ret < 0) {
  450. err("get_port_status(%d) failed (err = %d)", port + 1, ret);
  451. return -1;
  452. }
  453. portstatus = le16_to_cpu(portsts.wPortStatus);
  454. portchange = le16_to_cpu(portsts.wPortChange);
  455. dbg("port %d, portstatus %x, change %x, %s", port + 1,
  456. portstatus, portchange, portspeed (portstatus));
  457. /* bomb out completely if something weird happened */
  458. if ((portchange & USB_PORT_STAT_C_CONNECTION))
  459. return -1;
  460. /* if we`ve finished resetting, then break out of the loop */
  461. if (!(portstatus & USB_PORT_STAT_RESET) &&
  462.     (portstatus & USB_PORT_STAT_ENABLE)) {
  463. if (portstatus & USB_PORT_STAT_HIGH_SPEED)
  464. dev->speed = USB_SPEED_HIGH;
  465. else if (portstatus & USB_PORT_STAT_LOW_SPEED)
  466. dev->speed = USB_SPEED_LOW;
  467. else
  468. dev->speed = USB_SPEED_FULL;
  469. return 0;
  470. }
  471. /* switch to the long delay after two short delay failures */
  472. if (delay_time >= 2 * HUB_SHORT_RESET_TIME)
  473. delay = HUB_LONG_RESET_TIME;
  474. dbg("port %d of hub %d not reset yet, waiting %dms", port + 1,
  475. hub->devnum, delay);
  476. }
  477. return -1;
  478. }
  479. /* return: -1 on error, 0 on success, 1 on disconnect.  */
  480. static int usb_hub_port_reset(struct usb_device *hub, int port,
  481. struct usb_device *dev, unsigned int delay)
  482. {
  483. int i, status;
  484. /* Reset the port */
  485. for (i = 0; i < HUB_RESET_TRIES; i++) {
  486. usb_set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET);
  487. /* return on disconnect or reset */
  488. status = usb_hub_port_wait_reset(hub, port, dev, delay);
  489. if (status != -1) {
  490. usb_clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_RESET);
  491. return status;
  492. }
  493. dbg("port %d of hub %d not enabled, trying reset again...",
  494. port + 1, hub->devnum);
  495. delay = HUB_LONG_RESET_TIME;
  496. }
  497. err("Cannot enable port %i of hub %d, disabling port.",
  498. port + 1, hub->devnum);
  499. err("Maybe the USB cable is bad?");
  500. return -1;
  501. }
  502. void usb_hub_port_disable(struct usb_device *hub, int port)
  503. {
  504. int ret;
  505. ret = usb_clear_port_feature(hub, port + 1, USB_PORT_FEAT_ENABLE);
  506. if (ret)
  507. err("cannot disable port %d of hub %d (err = %d)",
  508. port + 1, hub->devnum, ret);
  509. }
  510. static void usb_hub_port_connect_change(struct usb_device *hub, int port,
  511. struct usb_port_status *portsts)
  512. {
  513. struct usb_device *dev;
  514. unsigned short portstatus, portchange;
  515. unsigned int delay = HUB_SHORT_RESET_TIME;
  516. int i;
  517. char *portstr, *tempstr;
  518. portstatus = le16_to_cpu(portsts->wPortStatus);
  519. portchange = le16_to_cpu(portsts->wPortChange);
  520. dbg("port %d, portstatus %x, change %x, %s",
  521. port + 1, portstatus, portchange, portspeed (portstatus));
  522. /* Clear the connection change status */
  523. usb_clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_CONNECTION);
  524. /* Disconnect any existing devices under this port */
  525. if (hub->children[port])
  526. usb_disconnect(&hub->children[port]);
  527. /* Return now if nothing is connected */
  528. if (!(portstatus & USB_PORT_STAT_CONNECTION)) {
  529. if (portstatus & USB_PORT_STAT_ENABLE)
  530. usb_hub_port_disable(hub, port);
  531. return;
  532. }
  533. /* Some low speed devices have problems with the quick delay, so */
  534. /*  be a bit pessimistic with those devices. RHbug #23670 */
  535. if (portstatus & USB_PORT_STAT_LOW_SPEED) {
  536. wait_ms(400);
  537. delay = HUB_LONG_RESET_TIME;
  538. }
  539. down(&usb_address0_sem);
  540. tempstr = kmalloc(1024, GFP_KERNEL);
  541. portstr = kmalloc(1024, GFP_KERNEL);
  542. for (i = 0; i < HUB_PROBE_TRIES; i++) {
  543. struct usb_device *pdev, *cdev;
  544. /* Allocate a new device struct */
  545. dev = usb_alloc_dev(hub, hub->bus);
  546. if (!dev) {
  547. err("couldn't allocate usb_device");
  548. break;
  549. }
  550. hub->children[port] = dev;
  551. /* Reset the device */
  552. if (usb_hub_port_reset(hub, port, dev, delay)) {
  553. usb_free_dev(dev);
  554. break;
  555. }
  556. /* Find a new device ID for it */
  557. usb_connect(dev);
  558. /* Create a readable topology string */
  559. cdev = dev;
  560. pdev = dev->parent;
  561. if (portstr && tempstr) {
  562. portstr[0] = 0;
  563. while (pdev) {
  564. int port;
  565. for (port = 0; port < pdev->maxchild; port++)
  566. if (pdev->children[port] == cdev)
  567. break;
  568. strcpy(tempstr, portstr);
  569. if (!strlen(tempstr))
  570. sprintf(portstr, "%d", port + 1);
  571. else
  572. sprintf(portstr, "%d/%s", port + 1, tempstr);
  573. cdev = pdev;
  574. pdev = pdev->parent;
  575. }
  576. info("USB new device connect on bus%d/%s, assigned device number %d",
  577. dev->bus->busnum, portstr, dev->devnum);
  578. } else
  579. info("USB new device connect on bus%d, assigned device number %d",
  580. dev->bus->busnum, dev->devnum);
  581. /* Run it through the hoops (find a driver, etc) */
  582. if (!usb_new_device(dev))
  583. goto done;
  584. /* Free the configuration if there was an error */
  585. usb_free_dev(dev);
  586. /* Switch to a long reset time */
  587. delay = HUB_LONG_RESET_TIME;
  588. }
  589. hub->children[port] = NULL;
  590. usb_hub_port_disable(hub, port);
  591. done:
  592. up(&usb_address0_sem);
  593. if (portstr)
  594. kfree(portstr);
  595. if (tempstr)
  596. kfree(tempstr);
  597. }
  598. static void usb_hub_events(void)
  599. {
  600. unsigned long flags;
  601. struct list_head *tmp;
  602. struct usb_device *dev;
  603. struct usb_hub *hub;
  604. struct usb_hub_status hubsts;
  605. unsigned short hubstatus, hubchange;
  606. int i, ret;
  607. /*
  608.  *  We restart the list everytime to avoid a deadlock with
  609.  * deleting hubs downstream from this one. This should be
  610.  * safe since we delete the hub from the event list.
  611.  * Not the most efficient, but avoids deadlocks.
  612.  */
  613. while (1) {
  614. spin_lock_irqsave(&hub_event_lock, flags);
  615. if (list_empty(&hub_event_list))
  616. break;
  617. /* Grab the next entry from the beginning of the list */
  618. tmp = hub_event_list.next;
  619. hub = list_entry(tmp, struct usb_hub, event_list);
  620. dev = hub->dev;
  621. list_del(tmp);
  622. INIT_LIST_HEAD(tmp);
  623. down(&hub->khubd_sem); /* never blocks, we were on list */
  624. spin_unlock_irqrestore(&hub_event_lock, flags);
  625. if (hub->error) {
  626. dbg("resetting hub %d for error %d", dev->devnum, hub->error);
  627. if (usb_hub_reset(hub)) {
  628. err("error resetting hub %d - disconnecting", dev->devnum);
  629. up(&hub->khubd_sem);
  630. usb_hub_disconnect(dev);
  631. continue;
  632. }
  633. hub->nerrors = 0;
  634. hub->error = 0;
  635. }
  636. for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
  637. struct usb_port_status portsts;
  638. unsigned short portstatus, portchange;
  639. ret = usb_get_port_status(dev, i + 1, &portsts);
  640. if (ret < 0) {
  641. err("get_port_status failed (err = %d)", ret);
  642. continue;
  643. }
  644. portstatus = le16_to_cpu(portsts.wPortStatus);
  645. portchange = le16_to_cpu(portsts.wPortChange);
  646. if (portchange & USB_PORT_STAT_C_CONNECTION) {
  647. dbg("port %d connection change", i + 1);
  648. usb_hub_port_connect_change(dev, i, &portsts);
  649. } else if (portchange & USB_PORT_STAT_C_ENABLE) {
  650. dbg("port %d enable change, status %x", i + 1, portstatus);
  651. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_ENABLE);
  652. /*
  653.  * EM interference sometimes causes bad shielded USB devices to 
  654.  * be shutdown by the hub, this hack enables them again.
  655.  * Works at least with mouse driver. 
  656.  */
  657. if (!(portstatus & USB_PORT_STAT_ENABLE) && 
  658.     (portstatus & USB_PORT_STAT_CONNECTION) && (dev->children[i])) {
  659. err("already running port %i disabled by hub (EMI?), re-enabling...",
  660. i + 1);
  661. usb_hub_port_connect_change(dev, i, &portsts);
  662. }
  663. }
  664. if (portchange & USB_PORT_STAT_C_SUSPEND) {
  665. dbg("port %d suspend change", i + 1);
  666. usb_clear_port_feature(dev, i + 1,  USB_PORT_FEAT_C_SUSPEND);
  667. }
  668. if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
  669. err("port %d over-current change", i + 1);
  670. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_OVER_CURRENT);
  671. usb_hub_power_on(hub);
  672. }
  673. if (portchange & USB_PORT_STAT_C_RESET) {
  674. dbg("port %d reset change", i + 1);
  675. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_RESET);
  676. }
  677. } /* end for i */
  678. /* deal with hub status changes */
  679. if (usb_get_hub_status(dev, &hubsts) < 0)
  680. err("get_hub_status failed");
  681. else {
  682. hubstatus = le16_to_cpup(&hubsts.wHubStatus);
  683. hubchange = le16_to_cpup(&hubsts.wHubChange);
  684. if (hubchange & HUB_CHANGE_LOCAL_POWER) {
  685. dbg("hub power change");
  686. usb_clear_hub_feature(dev, C_HUB_LOCAL_POWER);
  687. }
  688. if (hubchange & HUB_CHANGE_OVERCURRENT) {
  689. dbg("hub overcurrent change");
  690. wait_ms(500); /* Cool down */
  691. usb_clear_hub_feature(dev, C_HUB_OVER_CURRENT);
  692.                          usb_hub_power_on(hub);
  693. }
  694. }
  695. up(&hub->khubd_sem);
  696.         } /* end while (1) */
  697. spin_unlock_irqrestore(&hub_event_lock, flags);
  698. }
  699. static int usb_hub_thread(void *__hub)
  700. {
  701. lock_kernel();
  702. /*
  703.  * This thread doesn't need any user-level access,
  704.  * so get rid of all our resources
  705.  */
  706. daemonize();
  707. /* Setup a nice name */
  708. strcpy(current->comm, "khubd");
  709. /* Send me a signal to get me die (for debugging) */
  710. do {
  711. usb_hub_events();
  712. interruptible_sleep_on(&khubd_wait);
  713. } while (!signal_pending(current));
  714. dbg("usb_hub_thread exiting");
  715. unlock_kernel();
  716. complete_and_exit(&khubd_exited, 0);
  717. }
  718. static struct usb_device_id hub_id_table [] = {
  719.     { match_flags: USB_DEVICE_ID_MATCH_INT_CLASS,
  720.       bInterfaceClass: USB_CLASS_HUB},
  721.     { } /* Terminating entry */
  722. };
  723. MODULE_DEVICE_TABLE (usb, hub_id_table);
  724. static struct usb_driver hub_driver = {
  725. name: "hub",
  726. probe: hub_probe,
  727. ioctl: hub_ioctl,
  728. disconnect: hub_disconnect,
  729. id_table: hub_id_table,
  730. };
  731. /*
  732.  * This should be a separate module.
  733.  */
  734. int usb_hub_init(void)
  735. {
  736. int pid;
  737. if (usb_register(&hub_driver) < 0) {
  738. err("Unable to register USB hub driver");
  739. return -1;
  740. }
  741. pid = kernel_thread(usb_hub_thread, NULL,
  742. CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
  743. if (pid >= 0) {
  744. khubd_pid = pid;
  745. return 0;
  746. }
  747. /* Fall through if kernel_thread failed */
  748. usb_deregister(&hub_driver);
  749. err("failed to start usb_hub_thread");
  750. return -1;
  751. }
  752. void usb_hub_cleanup(void)
  753. {
  754. int ret;
  755. /* Kill the thread */
  756. ret = kill_proc(khubd_pid, SIGTERM, 1);
  757. wait_for_completion(&khubd_exited);
  758. /*
  759.  * Hub resources are freed for us by usb_deregister. It calls
  760.  * usb_driver_purge on every device which in turn calls that
  761.  * devices disconnect function if it is using this driver.
  762.  * The hub_disconnect function takes care of releasing the
  763.  * individual hub resources. -greg
  764.  */
  765. usb_deregister(&hub_driver);
  766. } /* usb_hub_cleanup() */
  767. /*
  768.  * WARNING - If a driver calls usb_reset_device, you should simulate a
  769.  * disconnect() and probe() for other interfaces you doesn't claim. This
  770.  * is left up to the driver writer right now. This insures other drivers
  771.  * have a chance to re-setup their interface.
  772.  *
  773.  * Take a look at proc_resetdevice in devio.c for some sample code to
  774.  * do this.
  775.  */
  776. int usb_reset_device(struct usb_device *dev)
  777. {
  778. struct usb_device *parent = dev->parent;
  779. struct usb_device_descriptor descriptor;
  780. int i, ret, port = -1;
  781. if (!parent) {
  782. err("attempting to reset root hub!");
  783. return -EINVAL;
  784. }
  785. for (i = 0; i < parent->maxchild; i++)
  786. if (parent->children[i] == dev) {
  787. port = i;
  788. break;
  789. }
  790. if (port < 0)
  791. return -ENOENT;
  792. down(&usb_address0_sem);
  793. /* Send a reset to the device */
  794. if (usb_hub_port_reset(parent, port, dev, HUB_SHORT_RESET_TIME)) {
  795. usb_hub_port_disable(parent, port);
  796. up(&usb_address0_sem);
  797. return(-ENODEV);
  798. }
  799. /* Reprogram the Address */
  800. ret = usb_set_address(dev);
  801. if (ret < 0) {
  802. err("USB device not accepting new address (error=%d)", ret);
  803. usb_hub_port_disable(parent, port);
  804. up(&usb_address0_sem);
  805. return ret;
  806. }
  807. /* Let the SET_ADDRESS settle */
  808. wait_ms(10);
  809. up(&usb_address0_sem);
  810. /*
  811.  * Now we fetch the configuration descriptors for the device and
  812.  * see if anything has changed. If it has, we dump the current
  813.  * parsed descriptors and reparse from scratch. Then we leave
  814.  * the device alone for the caller to finish setting up.
  815.  *
  816.  * If nothing changed, we reprogram the configuration and then
  817.  * the alternate settings.
  818.  */
  819. ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &descriptor,
  820. sizeof(descriptor));
  821. if (ret < 0)
  822. return ret;
  823. le16_to_cpus(&descriptor.bcdUSB);
  824. le16_to_cpus(&descriptor.idVendor);
  825. le16_to_cpus(&descriptor.idProduct);
  826. le16_to_cpus(&descriptor.bcdDevice);
  827. if (memcmp(&dev->descriptor, &descriptor, sizeof(descriptor))) {
  828. usb_destroy_configuration(dev);
  829. ret = usb_get_device_descriptor(dev);
  830. if (ret < sizeof(dev->descriptor)) {
  831. if (ret < 0)
  832. err("unable to get device descriptor (error=%d)", ret);
  833. else
  834. err("USB device descriptor short read (expected %Zi, got %i)", sizeof(dev->descriptor), ret);
  835.         
  836. clear_bit(dev->devnum, &dev->bus->devmap.devicemap);
  837. dev->devnum = -1;
  838. return -EIO;
  839. }
  840. ret = usb_get_configuration(dev);
  841. if (ret < 0) {
  842. err("unable to get configuration (error=%d)", ret);
  843. usb_destroy_configuration(dev);
  844. clear_bit(dev->devnum, &dev->bus->devmap.devicemap);
  845. dev->devnum = -1;
  846. return 1;
  847. }
  848. dev->actconfig = dev->config;
  849. usb_set_maxpacket(dev);
  850. return 1;
  851. }
  852. ret = usb_set_configuration(dev, dev->actconfig->bConfigurationValue);
  853. if (ret < 0) {
  854. err("failed to set active configuration (error=%d)", ret);
  855. return ret;
  856. }
  857. for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
  858. struct usb_interface *intf = &dev->actconfig->interface[i];
  859. struct usb_interface_descriptor *as = &intf->altsetting[intf->act_altsetting];
  860. ret = usb_set_interface(dev, as->bInterfaceNumber, as->bAlternateSetting);
  861. if (ret < 0) {
  862. err("failed to set active alternate setting for interface %d (error=%d)", i, ret);
  863. return ret;
  864. }
  865. }
  866. return 0;
  867. }