]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - Documentation/pcmcia/locking.txt
Merge branches 'for-4.8/alps', 'for-4.8/apple', 'for-4.8/i2c-hid', 'for-4.8/uhid...
[mirror_ubuntu-artful-kernel.git] / Documentation / pcmcia / locking.txt
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;