aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/devfreq/event
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/devfreq/event')
0 files changed, 0 insertions, 0 deletions
-affinity'>wip-migration-affinity The LITMUS^RT kernel.Bjoern Brandenburg
aboutsummaryrefslogblamecommitdiffstats
path: root/drivers/usb/host/uhci-hcd.c
blob: cf5e4cf7ea425828ca099af27dc6d2639ded8f9a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15














                                                                              
                                                                





                                                                

   





                         
                       









                              
                      







                        
                       



                      




                                                                            




                                                                       

                                   

                                                     
                                                       
                                               

            
                                 
                     

                                            





                                 


                                 
                                                              
 

                                                                            
                                                                 
 















                                                                             

                                                                     
                                                           
                                        




                                                                   
                                                 

 

                       
                     
 
  
                                                                   
   
                                               
 

                 






                                                                       
                                                        
                                       

                                                 
                                       

                                                                          

 
  
                                                    
                                        
   
                                               
 
                                            

                                                                 



                                                               


  


                                                                          


                                                     

                                                                               










                                                               
                                                                   

                                          

                                                      
 

                                                                       







                                                                    
                                                                     
 
                 
 




                                                                            



























                                                                           
                                                               
 
                 
                             
                                               




                                                                      

                                                            









                                                                        
                                                                           



                      
                                                   
                                                                    

                                                        
                                                

                                                           

                                                                       
           
                                  
                            
                                    













                                                                       
                

                                             
      






















                                                                           
 
                                                  
                                                              
             











                                                                        
                               
                               

                                                        
                                                                          
 
                                            

                                   
                                           




                                                                     
 
                                 
                            

 

                                           
                                                    
                             







                                                                            

                                         


                                            

                      
 
                                                       
                                           

                                                                
 




                                                                         



                                                                 
                                                  
                                                                            


                                             
                               
                               
 

                                                                   
                     



                                                                           
 
                       
 

                                                         

 
                                                

                                                 
                              

          


                                                                    
           
                                             

                                                                        
                                                                      







                                                                            
                                          
                                               


                                                                  
                                                       





                                                                              
                                                   



                                                                     
                         
                                                 
                 

         
                               
                                            
              
                                       
                                         
                                         
         
 

                           
 

                                                                         




                                                                        


                                                                






                                                                              








                                               







                                             
                                             
                                                    
 
                                          
 
                                        
 
                                        
 




                                                              

 
                                         

                                                 

                                                    


                                                        

                                                                           
                                                                      
                                                                        


                                                                        




                                                                          
                                                                   




                                                                      

                                                                  





                                                                   

                                                                  
           
                                 


                 










                                                                           
                                       

 




                                                     

                                                      
  
                                                   

                                                   





                                                                           




                                                 
              

                              
                                  
 
                                    

                                                         
                                            

                                           












                                                                           



                                                              

                                                                      
                                     
         
                                                                      
 






                                                                           














                                                                          
                                            





                                                                               
                                                                  






                                                                           
                                                                         
           

                                                                        

                                                                  

                                                                             
                                                       



                                                                          



                                                                    

                                              

                                                                     
                                                               



                                                                          
                                                                              

             

                           
                                 
                       




                 
                 

                                               
                                                            
         

                                          

                  
                                        


                                        

                   





                                                              
 
                
                                     








                                                 
                                   

                                                                         
                                 
                                     
 
                                          



                           


                                                 
                   

                                   

                                                           
                             
                                                    
                                     
                  




                                                 
                   

                                   
                                                           
                                
                             
                                
                                     
                  

 
                                                                      

                                                 
                   
 
                                                  
 
                                   

                                                                         
 

                                                                        



                            



                                                                          
             
                         


                                                   



                                                                       

                                                       
     
                                     
                  

 
                                               

                                                 
 
                                                  
 
                                                                     
                                           

                                                     
             
 
                                   
 

                                                    


                                                                        

                                 

                                                                    

                           



                                                            
                                                    
         
 
                                     
 



                                                                       
                                 
                                            
         



                 
                                                                       
                                                          
                                              

                                                 





                                            
 











                                                            




                                                         

                              

                                                       




                                                                













                                                        
                                          

                                           

                                                 

                                                














                                                          
                                                        











                                                     
                                      










                                            


                               

                                                                  
                                                   
 
                               


                                                         


                                                                     

         
                                                           
                                                     









                                                       
                                           




                                          
                      


              
                                                     





                                                
                                           
                                          
                      
                                                     







                                
/*
 * Universal Host Controller Interface driver for USB.
 *
 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
 *
 * (C) Copyright 1999 Linus Torvalds
 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
 * (C) Copyright 1999 Randy Dunlap
 * (C) Copyright 1999 Georg Acher, acher@in.tum.de
 * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de
 * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch
 * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at
 * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface
 *               support from usb-ohci.c by Adam Richter, adam@yggdrasil.com).
 * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c)
 * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu
 *
 * Intel documents this fairly well, and as far as I know there
 * are no royalties or anything like that, but even so there are
 * people who decided that they want to do the same thing in a
 * completely different way.
 *
 */

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/unistd.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/debugfs.h>
#include <linux/pm.h>
#include <linux/dmapool.h>
#include <linux/dma-mapping.h>
#include <linux/usb.h>
#include <linux/bitops.h>
#include <linux/dmi.h>

#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>

#include "../core/hcd.h"
#include "uhci-hcd.h"
#include "pci-quirks.h"

/*
 * Version Information
 */
#define DRIVER_AUTHOR "Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, \
Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, \
Alan Stern"
#define DRIVER_DESC "USB Universal Host Controller Interface driver"

/* for flakey hardware, ignore overcurrent indicators */
static int ignore_oc;
module_param(ignore_oc, bool, S_IRUGO);
MODULE_PARM_DESC(ignore_oc, "ignore hardware overcurrent indications");

/*
 * debug = 0, no debugging messages
 * debug = 1, dump failed URBs except for stalls
 * debug = 2, dump all failed URBs (including stalls)
 *            show all queues in /debug/uhci/[pci_addr]
 * debug = 3, show all TDs in URBs when dumping
 */
#ifdef DEBUG
#define DEBUG_CONFIGURED	1
static int debug = 1;
module_param(debug, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug level");

#else
#define DEBUG_CONFIGURED	0
#define debug			0
#endif

static char *errbuf;
#define ERRBUF_LEN    (32 * 1024)

static struct kmem_cache *uhci_up_cachep;	/* urb_priv */

static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state);
static void wakeup_rh(struct uhci_hcd *uhci);
static void uhci_get_current_frame_number(struct uhci_hcd *uhci);

/*
 * Calculate the link pointer DMA value for the first Skeleton QH in a frame.
 */
static __le32 uhci_frame_skel_link(struct uhci_hcd *uhci, int frame)
{
	int skelnum;

	/*
	 * The interrupt queues will be interleaved as evenly as possible.
	 * There's not much to be done about period-1 interrupts; they have
	 * to occur in every frame.  But we can schedule period-2 interrupts
	 * in odd-numbered frames, period-4 interrupts in frames congruent
	 * to 2 (mod 4), and so on.  This way each frame only has two
	 * interrupt QHs, which will help spread out bandwidth utilization.
	 *
	 * ffs (Find First bit Set) does exactly what we need:
	 * 1,3,5,...  => ffs = 0 => use period-2 QH = skelqh[8],
	 * 2,6,10,... => ffs = 1 => use period-4 QH = skelqh[7], etc.
	 * ffs >= 7 => not on any high-period queue, so use
	 *	period-1 QH = skelqh[9].
	 * Add in UHCI_NUMFRAMES to insure at least one bit is set.
	 */
	skelnum = 8 - (int) __ffs(frame | UHCI_NUMFRAMES);
	if (skelnum <= 1)
		skelnum = 9;
	return LINK_TO_QH(uhci->skelqh[skelnum]);
}

#include "uhci-debug.c"
#include "uhci-q.c"
#include "uhci-hub.c"

/*
 * Finish up a host controller reset and update the recorded state.
 */
static void finish_reset(struct uhci_hcd *uhci)
{
	int port;

	/* HCRESET doesn't affect the Suspend, Reset, and Resume Detect
	 * bits in the port status and control registers.
	 * We have to clear them by hand.
	 */
	for (port = 0; port < uhci->rh_numports; ++port)
		outw(0, uhci->io_addr + USBPORTSC1 + (port * 2));

	uhci->port_c_suspend = uhci->resuming_ports = 0;
	uhci->rh_state = UHCI_RH_RESET;
	uhci->is_stopped = UHCI_IS_STOPPED;
	uhci_to_hcd(uhci)->state = HC_STATE_HALT;
	uhci_to_hcd(uhci)->poll_rh = 0;

	uhci->dead = 0;		/* Full reset resurrects the controller */
}

/*
 * Last rites for a defunct/nonfunctional controller
 * or one we don't want to use any more.
 */
static void uhci_hc_died(struct uhci_hcd *uhci)
{
	uhci_get_current_frame_number(uhci);
	uhci_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr);
	finish_reset(uhci);
	uhci->dead = 1;

	/* The current frame may already be partway finished */
	++uhci->frame_number;
}

/*
 * Initialize a controller that was newly discovered or has lost power
 * or otherwise been reset while it was suspended.  In none of these cases
 * can we be sure of its previous state.
 */
static void check_and_reset_hc(struct uhci_hcd *uhci)
{
	if (uhci_check_and_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr))
		finish_reset(uhci);
}

/*
 * Store the basic register settings needed by the controller.
 */
static void configure_hc(struct uhci_hcd *uhci)
{
	/* Set the frame length to the default: 1 ms exactly */