13bdab16cSMauro Carvalho Chehab=======
23bdab16cSMauro Carvalho ChehabLocking
33bdab16cSMauro Carvalho Chehab=======
43bdab16cSMauro Carvalho Chehab
53bdab16cSMauro Carvalho ChehabThis file explains the locking and exclusion scheme used in the PCCARD
63bdab16cSMauro Carvalho Chehaband PCMCIA subsystems.
73bdab16cSMauro Carvalho Chehab
83bdab16cSMauro Carvalho Chehab
93bdab16cSMauro Carvalho ChehabA) Overview, Locking Hierarchy:
103bdab16cSMauro Carvalho Chehab===============================
113bdab16cSMauro Carvalho Chehab
123bdab16cSMauro Carvalho Chehabpcmcia_socket_list_rwsem
133bdab16cSMauro Carvalho Chehab	- protects only the list of sockets
143bdab16cSMauro Carvalho Chehab
153bdab16cSMauro Carvalho Chehab- skt_mutex
163bdab16cSMauro Carvalho Chehab	- serializes card insert / ejection
173bdab16cSMauro Carvalho Chehab
183bdab16cSMauro Carvalho Chehab  - ops_mutex
193bdab16cSMauro Carvalho Chehab	- serializes socket operation
203bdab16cSMauro Carvalho Chehab
213bdab16cSMauro Carvalho Chehab
223bdab16cSMauro Carvalho ChehabB) Exclusion
233bdab16cSMauro Carvalho Chehab============
243bdab16cSMauro Carvalho Chehab
253bdab16cSMauro Carvalho ChehabThe following functions and callbacks to struct pcmcia_socket must
263bdab16cSMauro Carvalho Chehabbe called with "skt_mutex" held::
273bdab16cSMauro Carvalho Chehab
283bdab16cSMauro Carvalho Chehab	socket_detect_change()
293bdab16cSMauro Carvalho Chehab	send_event()
303bdab16cSMauro Carvalho Chehab	socket_reset()
313bdab16cSMauro Carvalho Chehab	socket_shutdown()
323bdab16cSMauro Carvalho Chehab	socket_setup()
333bdab16cSMauro Carvalho Chehab	socket_remove()
343bdab16cSMauro Carvalho Chehab	socket_insert()
353bdab16cSMauro Carvalho Chehab	socket_early_resume()
363bdab16cSMauro Carvalho Chehab	socket_late_resume()
373bdab16cSMauro Carvalho Chehab	socket_resume()
383bdab16cSMauro Carvalho Chehab	socket_suspend()
393bdab16cSMauro Carvalho Chehab
403bdab16cSMauro Carvalho Chehab	struct pcmcia_callback	*callback
413bdab16cSMauro Carvalho Chehab
423bdab16cSMauro Carvalho ChehabThe following functions and callbacks to struct pcmcia_socket must
433bdab16cSMauro Carvalho Chehabbe called with "ops_mutex" held::
443bdab16cSMauro Carvalho Chehab
453bdab16cSMauro Carvalho Chehab	socket_reset()
463bdab16cSMauro Carvalho Chehab	socket_setup()
473bdab16cSMauro Carvalho Chehab
483bdab16cSMauro Carvalho Chehab	struct pccard_operations	*ops
493bdab16cSMauro Carvalho Chehab	struct pccard_resource_ops	*resource_ops;
503bdab16cSMauro Carvalho Chehab
513bdab16cSMauro Carvalho ChehabNote that send_event() and `struct pcmcia_callback *callback` must not be
523bdab16cSMauro Carvalho Chehabcalled with "ops_mutex" held.
533bdab16cSMauro Carvalho Chehab
543bdab16cSMauro Carvalho Chehab
553bdab16cSMauro Carvalho ChehabC) Protection
563bdab16cSMauro Carvalho Chehab=============
573bdab16cSMauro Carvalho Chehab
583bdab16cSMauro Carvalho Chehab1. Global Data:
593bdab16cSMauro Carvalho Chehab---------------
603bdab16cSMauro Carvalho Chehabstruct list_head	pcmcia_socket_list;
613bdab16cSMauro Carvalho Chehab
623bdab16cSMauro Carvalho Chehabprotected by pcmcia_socket_list_rwsem;
633bdab16cSMauro Carvalho Chehab
643bdab16cSMauro Carvalho Chehab
653bdab16cSMauro Carvalho Chehab2. Per-Socket Data:
663bdab16cSMauro Carvalho Chehab-------------------
673bdab16cSMauro Carvalho ChehabThe resource_ops and their data are protected by ops_mutex.
683bdab16cSMauro Carvalho Chehab
693bdab16cSMauro Carvalho ChehabThe "main" struct pcmcia_socket is protected as follows (read-only fields
703bdab16cSMauro Carvalho Chehabor single-use fields not mentioned):
713bdab16cSMauro Carvalho Chehab
723bdab16cSMauro Carvalho Chehab- by pcmcia_socket_list_rwsem::
733bdab16cSMauro Carvalho Chehab
743bdab16cSMauro Carvalho Chehab	struct list_head	socket_list;
753bdab16cSMauro Carvalho Chehab
763bdab16cSMauro Carvalho Chehab- by thread_lock::
773bdab16cSMauro Carvalho Chehab
783bdab16cSMauro Carvalho Chehab	unsigned int		thread_events;
793bdab16cSMauro Carvalho Chehab
803bdab16cSMauro Carvalho Chehab- by skt_mutex::
813bdab16cSMauro Carvalho Chehab
823bdab16cSMauro Carvalho Chehab	u_int			suspended_state;
833bdab16cSMauro Carvalho Chehab	void			(*tune_bridge);
843bdab16cSMauro Carvalho Chehab	struct pcmcia_callback	*callback;
853bdab16cSMauro Carvalho Chehab	int			resume_status;
863bdab16cSMauro Carvalho Chehab
873bdab16cSMauro Carvalho Chehab- by ops_mutex::
883bdab16cSMauro Carvalho Chehab
893bdab16cSMauro Carvalho Chehab	socket_state_t		socket;
903bdab16cSMauro Carvalho Chehab	u_int			state;
913bdab16cSMauro Carvalho Chehab	u_short			lock_count;
923bdab16cSMauro Carvalho Chehab	pccard_mem_map		cis_mem;
933bdab16cSMauro Carvalho Chehab	void __iomem 		*cis_virt;
943bdab16cSMauro Carvalho Chehab	struct { }		irq;
953bdab16cSMauro Carvalho Chehab	io_window_t		io[];
963bdab16cSMauro Carvalho Chehab	pccard_mem_map		win[];
973bdab16cSMauro Carvalho Chehab	struct list_head	cis_cache;
983bdab16cSMauro Carvalho Chehab	size_t			fake_cis_len;
993bdab16cSMauro Carvalho Chehab	u8			*fake_cis;
1003bdab16cSMauro Carvalho Chehab	u_int			irq_mask;
1013bdab16cSMauro Carvalho Chehab	void 			(*zoom_video);
1023bdab16cSMauro Carvalho Chehab	int 			(*power_hook);
1033bdab16cSMauro Carvalho Chehab	u8			resource...;
1043bdab16cSMauro Carvalho Chehab	struct list_head	devices_list;
1053bdab16cSMauro Carvalho Chehab	u8			device_count;
1063bdab16cSMauro Carvalho Chehab	struct 			pcmcia_state;
1073bdab16cSMauro Carvalho Chehab
1083bdab16cSMauro Carvalho Chehab
1093bdab16cSMauro Carvalho Chehab3. Per PCMCIA-device Data:
1103bdab16cSMauro Carvalho Chehab--------------------------
1113bdab16cSMauro Carvalho Chehab
1123bdab16cSMauro Carvalho ChehabThe "main" struct pcmcia_device is protected as follows (read-only fields
1133bdab16cSMauro Carvalho Chehabor single-use fields not mentioned):
1143bdab16cSMauro Carvalho Chehab
1153bdab16cSMauro Carvalho Chehab
1163bdab16cSMauro Carvalho Chehab- by pcmcia_socket->ops_mutex::
1173bdab16cSMauro Carvalho Chehab
1183bdab16cSMauro Carvalho Chehab	struct list_head	socket_device_list;
1193bdab16cSMauro Carvalho Chehab	struct config_t		*function_config;
1203bdab16cSMauro Carvalho Chehab	u16			_irq:1;
1213bdab16cSMauro Carvalho Chehab	u16			_io:1;
1223bdab16cSMauro Carvalho Chehab	u16			_win:4;
1233bdab16cSMauro Carvalho Chehab	u16			_locked:1;
1243bdab16cSMauro Carvalho Chehab	u16			allow_func_id_match:1;
1253bdab16cSMauro Carvalho Chehab	u16			suspended:1;
1263bdab16cSMauro Carvalho Chehab	u16			_removed:1;
1273bdab16cSMauro Carvalho Chehab
1283bdab16cSMauro Carvalho Chehab- by the PCMCIA driver::
1293bdab16cSMauro Carvalho Chehab
1303bdab16cSMauro Carvalho Chehab	io_req_t		io;
1313bdab16cSMauro Carvalho Chehab	irq_req_t		irq;
1323bdab16cSMauro Carvalho Chehab	config_req_t		conf;
1333bdab16cSMauro Carvalho Chehab	window_handle_t		win;
134