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_device 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