Lines Matching refs:uhci
91 static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state);
92 static void wakeup_rh(struct uhci_hcd *uhci);
93 static void uhci_get_current_frame_number(struct uhci_hcd *uhci);
98 static __hc32 uhci_frame_skel_link(struct uhci_hcd *uhci, int frame) in uhci_frame_skel_link() argument
120 return LINK_TO_QH(uhci, uhci->skelqh[skelnum]); in uhci_frame_skel_link()
130 static void finish_reset(struct uhci_hcd *uhci) in finish_reset() argument
138 for (port = 0; port < uhci->rh_numports; ++port) in finish_reset()
139 uhci_writew(uhci, 0, USBPORTSC1 + (port * 2)); in finish_reset()
141 uhci->port_c_suspend = uhci->resuming_ports = 0; in finish_reset()
142 uhci->rh_state = UHCI_RH_RESET; in finish_reset()
143 uhci->is_stopped = UHCI_IS_STOPPED; in finish_reset()
144 clear_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); in finish_reset()
151 static void uhci_hc_died(struct uhci_hcd *uhci) in uhci_hc_died() argument
153 uhci_get_current_frame_number(uhci); in uhci_hc_died()
154 uhci->reset_hc(uhci); in uhci_hc_died()
155 finish_reset(uhci); in uhci_hc_died()
156 uhci->dead = 1; in uhci_hc_died()
159 ++uhci->frame_number; in uhci_hc_died()
167 static void check_and_reset_hc(struct uhci_hcd *uhci) in check_and_reset_hc() argument
169 if (uhci->check_and_reset_hc(uhci)) in check_and_reset_hc()
170 finish_reset(uhci); in check_and_reset_hc()
184 static void uhci_generic_reset_hc(struct uhci_hcd *uhci) in uhci_generic_reset_hc() argument
191 uhci_writew(uhci, USBCMD_HCRESET, USBCMD); in uhci_generic_reset_hc()
194 if (uhci_readw(uhci, USBCMD) & USBCMD_HCRESET) in uhci_generic_reset_hc()
195 dev_warn(uhci_dev(uhci), "HCRESET not completed yet!\n"); in uhci_generic_reset_hc()
200 uhci_writew(uhci, 0, USBINTR); in uhci_generic_reset_hc()
201 uhci_writew(uhci, 0, USBCMD); in uhci_generic_reset_hc()
210 static int uhci_generic_check_and_reset_hc(struct uhci_hcd *uhci) in uhci_generic_check_and_reset_hc() argument
224 cmd = uhci_readw(uhci, USBCMD); in uhci_generic_check_and_reset_hc()
226 dev_dbg(uhci_dev(uhci), "%s: cmd = 0x%04x\n", in uhci_generic_check_and_reset_hc()
231 intr = uhci_readw(uhci, USBINTR); in uhci_generic_check_and_reset_hc()
233 dev_dbg(uhci_dev(uhci), "%s: intr = 0x%04x\n", in uhci_generic_check_and_reset_hc()
240 dev_dbg(uhci_dev(uhci), "Performing full reset\n"); in uhci_generic_check_and_reset_hc()
241 uhci_generic_reset_hc(uhci); in uhci_generic_check_and_reset_hc()
249 static void configure_hc(struct uhci_hcd *uhci) in configure_hc() argument
252 uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF); in configure_hc()
255 uhci_writel(uhci, uhci->frame_dma_handle, USBFLBASEADD); in configure_hc()
258 uhci_writew(uhci, uhci->frame_number & UHCI_MAX_SOF_NUMBER, in configure_hc()
262 if (uhci->configure_hc) in configure_hc()
263 uhci->configure_hc(uhci); in configure_hc()
266 static int resume_detect_interrupts_are_broken(struct uhci_hcd *uhci) in resume_detect_interrupts_are_broken() argument
273 return uhci->resume_detect_interrupts_are_broken ? in resume_detect_interrupts_are_broken()
274 uhci->resume_detect_interrupts_are_broken(uhci) : 0; in resume_detect_interrupts_are_broken()
277 static int global_suspend_mode_is_broken(struct uhci_hcd *uhci) in global_suspend_mode_is_broken() argument
279 return uhci->global_suspend_mode_is_broken ? in global_suspend_mode_is_broken()
280 uhci->global_suspend_mode_is_broken(uhci) : 0; in global_suspend_mode_is_broken()
283 static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state) in suspend_rh() argument
284 __releases(uhci->lock) in suspend_rh()
285 __acquires(uhci->lock) in suspend_rh()
289 struct usb_device *rhdev = uhci_to_hcd(uhci)->self.root_hub; in suspend_rh()
338 if (!wakeup_enable || global_suspend_mode_is_broken(uhci) || in suspend_rh()
339 resume_detect_interrupts_are_broken(uhci)) in suspend_rh()
342 uhci->RD_enable = !!int_enable; in suspend_rh()
343 uhci_writew(uhci, int_enable, USBINTR); in suspend_rh()
344 uhci_writew(uhci, egsm_enable | USBCMD_CF, USBCMD); in suspend_rh()
353 if (!auto_stop && !(uhci_readw(uhci, USBSTS) & USBSTS_HCH)) { in suspend_rh()
354 uhci->rh_state = UHCI_RH_SUSPENDING; in suspend_rh()
355 spin_unlock_irq(&uhci->lock); in suspend_rh()
357 spin_lock_irq(&uhci->lock); in suspend_rh()
358 if (uhci->dead) in suspend_rh()
361 if (!(uhci_readw(uhci, USBSTS) & USBSTS_HCH)) in suspend_rh()
362 dev_warn(uhci_dev(uhci), "Controller not stopped yet!\n"); in suspend_rh()
364 uhci_get_current_frame_number(uhci); in suspend_rh()
366 uhci->rh_state = new_state; in suspend_rh()
367 uhci->is_stopped = UHCI_IS_STOPPED; in suspend_rh()
375 set_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); in suspend_rh()
377 clear_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); in suspend_rh()
379 uhci_scan_schedule(uhci); in suspend_rh()
380 uhci_fsbr_off(uhci); in suspend_rh()
383 static void start_rh(struct uhci_hcd *uhci) in start_rh() argument
385 uhci->is_stopped = 0; in start_rh()
390 uhci_writew(uhci, USBCMD_RS | USBCMD_CF | USBCMD_MAXP, USBCMD); in start_rh()
391 uhci_writew(uhci, USBINTR_TIMEOUT | USBINTR_RESUME | in start_rh()
394 uhci->rh_state = UHCI_RH_RUNNING; in start_rh()
395 set_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); in start_rh()
398 static void wakeup_rh(struct uhci_hcd *uhci) in wakeup_rh() argument
399 __releases(uhci->lock) in wakeup_rh()
400 __acquires(uhci->lock) in wakeup_rh()
402 dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev, in wakeup_rh()
404 uhci->rh_state == UHCI_RH_AUTO_STOPPED ? in wakeup_rh()
411 if (uhci->rh_state == UHCI_RH_SUSPENDED) { in wakeup_rh()
415 egsm = uhci_readw(uhci, USBCMD) & USBCMD_EGSM; in wakeup_rh()
416 uhci->rh_state = UHCI_RH_RESUMING; in wakeup_rh()
417 uhci_writew(uhci, USBCMD_FGR | USBCMD_CF | egsm, USBCMD); in wakeup_rh()
418 spin_unlock_irq(&uhci->lock); in wakeup_rh()
420 spin_lock_irq(&uhci->lock); in wakeup_rh()
421 if (uhci->dead) in wakeup_rh()
425 uhci_writew(uhci, USBCMD_CF, USBCMD); in wakeup_rh()
428 if (uhci_readw(uhci, USBCMD) & USBCMD_FGR) in wakeup_rh()
429 dev_warn(uhci_dev(uhci), "FGR not stopped yet!\n"); in wakeup_rh()
432 start_rh(uhci); in wakeup_rh()
435 mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); in wakeup_rh()
440 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_irq() local
448 status = uhci_readw(uhci, USBSTS); in uhci_irq()
451 uhci_writew(uhci, status, USBSTS); /* Clear it */ in uhci_irq()
453 spin_lock(&uhci->lock); in uhci_irq()
454 if (unlikely(!uhci->is_initialized)) /* not yet configured */ in uhci_irq()
459 dev_err(uhci_dev(uhci), in uhci_irq()
462 dev_err(uhci_dev(uhci), in uhci_irq()
465 if (uhci->rh_state >= UHCI_RH_RUNNING) { in uhci_irq()
466 dev_err(uhci_dev(uhci), in uhci_irq()
470 uhci_sprint_schedule(uhci, errbuf, in uhci_irq()
474 uhci_hc_died(uhci); in uhci_irq()
485 spin_unlock(&uhci->lock); in uhci_irq()
488 uhci_scan_schedule(uhci); in uhci_irq()
490 spin_unlock(&uhci->lock); in uhci_irq()
504 static void uhci_get_current_frame_number(struct uhci_hcd *uhci) in uhci_get_current_frame_number() argument
506 if (!uhci->is_stopped) { in uhci_get_current_frame_number()
509 delta = (uhci_readw(uhci, USBFRNUM) - uhci->frame_number) & in uhci_get_current_frame_number()
511 uhci->frame_number += delta; in uhci_get_current_frame_number()
518 static void release_uhci(struct uhci_hcd *uhci) in release_uhci() argument
523 spin_lock_irq(&uhci->lock); in release_uhci()
524 uhci->is_initialized = 0; in release_uhci()
525 spin_unlock_irq(&uhci->lock); in release_uhci()
527 debugfs_remove(uhci->dentry); in release_uhci()
530 uhci_free_qh(uhci, uhci->skelqh[i]); in release_uhci()
532 uhci_free_td(uhci, uhci->term_td); in release_uhci()
534 dma_pool_destroy(uhci->qh_pool); in release_uhci()
536 dma_pool_destroy(uhci->td_pool); in release_uhci()
538 kfree(uhci->frame_cpu); in release_uhci()
540 dma_free_coherent(uhci_dev(uhci), in release_uhci()
541 UHCI_NUMFRAMES * sizeof(*uhci->frame), in release_uhci()
542 uhci->frame, uhci->frame_dma_handle); in release_uhci()
565 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_start() local
575 spin_lock_init(&uhci->lock); in uhci_start()
576 setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout, in uhci_start()
577 (unsigned long) uhci); in uhci_start()
578 INIT_LIST_HEAD(&uhci->idle_qh_list); in uhci_start()
579 init_waitqueue_head(&uhci->waitqh); in uhci_start()
584 uhci, &uhci_debug_operations); in uhci_start()
586 dev_err(uhci_dev(uhci), "couldn't create uhci debugfs entry\n"); in uhci_start()
589 uhci->dentry = dentry; in uhci_start()
592 uhci->frame = dma_alloc_coherent(uhci_dev(uhci), in uhci_start()
593 UHCI_NUMFRAMES * sizeof(*uhci->frame), in uhci_start()
594 &uhci->frame_dma_handle, GFP_KERNEL); in uhci_start()
595 if (!uhci->frame) { in uhci_start()
596 dev_err(uhci_dev(uhci), in uhci_start()
600 memset(uhci->frame, 0, UHCI_NUMFRAMES * sizeof(*uhci->frame)); in uhci_start()
602 uhci->frame_cpu = kcalloc(UHCI_NUMFRAMES, sizeof(*uhci->frame_cpu), in uhci_start()
604 if (!uhci->frame_cpu) { in uhci_start()
605 dev_err(uhci_dev(uhci), in uhci_start()
610 uhci->td_pool = dma_pool_create("uhci_td", uhci_dev(uhci), in uhci_start()
612 if (!uhci->td_pool) { in uhci_start()
613 dev_err(uhci_dev(uhci), "unable to create td dma_pool\n"); in uhci_start()
617 uhci->qh_pool = dma_pool_create("uhci_qh", uhci_dev(uhci), in uhci_start()
619 if (!uhci->qh_pool) { in uhci_start()
620 dev_err(uhci_dev(uhci), "unable to create qh dma_pool\n"); in uhci_start()
624 uhci->term_td = uhci_alloc_td(uhci); in uhci_start()
625 if (!uhci->term_td) { in uhci_start()
626 dev_err(uhci_dev(uhci), "unable to allocate terminating TD\n"); in uhci_start()
631 uhci->skelqh[i] = uhci_alloc_qh(uhci, NULL, NULL); in uhci_start()
632 if (!uhci->skelqh[i]) { in uhci_start()
633 dev_err(uhci_dev(uhci), "unable to allocate QH\n"); in uhci_start()
642 uhci->skelqh[i]->link = LINK_TO_QH(uhci, uhci->skel_async_qh); in uhci_start()
643 uhci->skel_async_qh->link = UHCI_PTR_TERM(uhci); in uhci_start()
644 uhci->skel_term_qh->link = LINK_TO_QH(uhci, uhci->skel_term_qh); in uhci_start()
647 uhci_fill_td(uhci, uhci->term_td, 0, uhci_explen(0) | in uhci_start()
649 uhci->term_td->link = UHCI_PTR_TERM(uhci); in uhci_start()
650 uhci->skel_async_qh->element = uhci->skel_term_qh->element = in uhci_start()
651 LINK_TO_TD(uhci, uhci->term_td); in uhci_start()
660 uhci->frame[i] = uhci_frame_skel_link(uhci, i); in uhci_start()
669 spin_lock_irq(&uhci->lock); in uhci_start()
670 configure_hc(uhci); in uhci_start()
671 uhci->is_initialized = 1; in uhci_start()
672 start_rh(uhci); in uhci_start()
673 spin_unlock_irq(&uhci->lock); in uhci_start()
681 if (uhci->skelqh[i]) in uhci_start()
682 uhci_free_qh(uhci, uhci->skelqh[i]); in uhci_start()
685 uhci_free_td(uhci, uhci->term_td); in uhci_start()
688 dma_pool_destroy(uhci->qh_pool); in uhci_start()
691 dma_pool_destroy(uhci->td_pool); in uhci_start()
694 kfree(uhci->frame_cpu); in uhci_start()
697 dma_free_coherent(uhci_dev(uhci), in uhci_start()
698 UHCI_NUMFRAMES * sizeof(*uhci->frame), in uhci_start()
699 uhci->frame, uhci->frame_dma_handle); in uhci_start()
702 debugfs_remove(uhci->dentry); in uhci_start()
709 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_stop() local
711 spin_lock_irq(&uhci->lock); in uhci_stop()
712 if (HCD_HW_ACCESSIBLE(hcd) && !uhci->dead) in uhci_stop()
713 uhci_hc_died(uhci); in uhci_stop()
714 uhci_scan_schedule(uhci); in uhci_stop()
715 spin_unlock_irq(&uhci->lock); in uhci_stop()
718 del_timer_sync(&uhci->fsbr_timer); in uhci_stop()
719 release_uhci(uhci); in uhci_stop()
725 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_rh_suspend() local
728 spin_lock_irq(&uhci->lock); in uhci_rh_suspend()
731 else if (uhci->dead) in uhci_rh_suspend()
740 uhci->resuming_ports) { in uhci_rh_suspend()
741 dev_dbg(uhci_dev(uhci), in uhci_rh_suspend()
745 suspend_rh(uhci, UHCI_RH_SUSPENDED); in uhci_rh_suspend()
746 spin_unlock_irq(&uhci->lock); in uhci_rh_suspend()
752 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_rh_resume() local
755 spin_lock_irq(&uhci->lock); in uhci_rh_resume()
758 else if (!uhci->dead) in uhci_rh_resume()
759 wakeup_rh(uhci); in uhci_rh_resume()
760 spin_unlock_irq(&uhci->lock); in uhci_rh_resume()
770 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_hcd_endpoint_disable() local
773 spin_lock_irq(&uhci->lock); in uhci_hcd_endpoint_disable()
779 ++uhci->num_waiting; in uhci_hcd_endpoint_disable()
780 spin_unlock_irq(&uhci->lock); in uhci_hcd_endpoint_disable()
781 wait_event_interruptible(uhci->waitqh, in uhci_hcd_endpoint_disable()
783 spin_lock_irq(&uhci->lock); in uhci_hcd_endpoint_disable()
784 --uhci->num_waiting; in uhci_hcd_endpoint_disable()
787 uhci_free_qh(uhci, qh); in uhci_hcd_endpoint_disable()
789 spin_unlock_irq(&uhci->lock); in uhci_hcd_endpoint_disable()
794 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_hcd_get_frame_number() local
799 frame_number = uhci->frame_number; in uhci_hcd_get_frame_number()
801 delta = (uhci_readw(uhci, USBFRNUM) - frame_number) & in uhci_hcd_get_frame_number()
809 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_count_ports() local
824 portstatus = uhci_readw(uhci, USBPORTSC1 + (port * 2)); in uhci_count_ports()
829 dev_info(uhci_dev(uhci), "detected %d ports\n", port); in uhci_count_ports()
833 dev_info(uhci_dev(uhci), in uhci_count_ports()