Based on kernel version 4.16.1. Page generated on 2018-04-09 11:53 EST.
1 This file explains the locking and exclusion scheme used in the PCCARD 2 and PCMCIA subsystems. 3 4 5 A) Overview, Locking Hierarchy: 6 =============================== 7 8 pcmcia_socket_list_rwsem - protects only the list of sockets 9 - skt_mutex - serializes card insert / ejection 10 - ops_mutex - serializes socket operation 11 12 13 B) Exclusion 14 ============ 15 16 The following functions and callbacks to struct pcmcia_socket must 17 be 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 33 The following functions and callbacks to struct pcmcia_socket must 34 be 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 42 Note that send_event() and struct pcmcia_callback *callback must not be 43 called with "ops_mutex" held. 44 45 46 C) Protection 47 ============= 48 49 1. Global Data: 50 --------------- 51 struct list_head pcmcia_socket_list; 52 53 protected by pcmcia_socket_list_rwsem; 54 55 56 2. Per-Socket Data: 57 ------------------- 58 The resource_ops and their data are protected by ops_mutex. 59 60 The "main" struct pcmcia_socket is protected as follows (read-only fields 61 or 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 96 3. Per PCMCIA-device Data: 97 -------------------------- 98 99 The "main" struct pcmcia_device is protected as follows (read-only fields 100 or 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;