1This file explains the locking and exclusion scheme used in the PCCARD 2and PCMCIA subsystems. 3 4 5A) Overview, Locking Hierarchy: 6=============================== 7 8pcmcia_socket_list_rwsem - protects only the list of sockets 9- skt_mutex - serializes card insert / ejection 10 - ops_mutex - serializes socket operation 11 12 13B) Exclusion 14============ 15 16The following functions and callbacks to struct pcmcia_socket must 17be called with "skt_mutex" held: 18 19 socket_detect_change() 20 send_event() 21 socket_reset() 22 socket_shutdown() 23 socket_setup() 24 socket_remove() 25 socket_insert() 26 socket_early_resume() 27 socket_late_resume() 28 socket_resume() 29 socket_suspend() 30 31 struct pcmcia_callback *callback 32 33The following functions and callbacks to struct pcmcia_socket must 34be called with "ops_mutex" held: 35 36 socket_reset() 37 socket_setup() 38 39 struct pccard_operations *ops 40 struct pccard_resource_ops *resource_ops; 41 42Note that send_event() and struct pcmcia_callback *callback must not be 43called with "ops_mutex" held. 44 45 46C) Protection 47============= 48 491. Global Data: 50--------------- 51struct list_head pcmcia_socket_list; 52 53protected by pcmcia_socket_list_rwsem; 54 55 562. Per-Socket Data: 57------------------- 58The resource_ops and their data are protected by ops_mutex. 59 60The "main" struct pcmcia_socket is protected as follows (read-only fields 61or single-use fields not mentioned): 62 63- by pcmcia_socket_list_rwsem: 64 struct list_head socket_list; 65 66- by thread_lock: 67 unsigned int thread_events; 68 69- by skt_mutex: 70 u_int suspended_state; 71 void (*tune_bridge); 72 struct pcmcia_callback *callback; 73 int resume_status; 74 75- by ops_mutex: 76 socket_state_t socket; 77 u_int state; 78 u_short lock_count; 79 pccard_mem_map cis_mem; 80 void __iomem *cis_virt; 81 struct { } irq; 82 io_window_t io[]; 83 pccard_mem_map win[]; 84 struct list_head cis_cache; 85 size_t fake_cis_len; 86 u8 *fake_cis; 87 u_int irq_mask; 88 void (*zoom_video); 89 int (*power_hook); 90 u8 resource...; 91 struct list_head devices_list; 92 u8 device_count; 93 struct pcmcia_state; 94 95 963. Per PCMCIA-device Data: 97-------------------------- 98 99The "main" struct pcmcia_devie is protected as follows (read-only fields 100or single-use fields not mentioned): 101 102 103- by pcmcia_socket->ops_mutex: 104 struct list_head socket_device_list; 105 struct config_t *function_config; 106 u16 _irq:1; 107 u16 _io:1; 108 u16 _win:4; 109 u16 _locked:1; 110 u16 allow_func_id_match:1; 111 u16 suspended:1; 112 u16 _removed:1; 113 114- by the PCMCIA driver: 115 io_req_t io; 116 irq_req_t irq; 117 config_req_t conf; 118 window_handle_t win; 119