forked from Minki/linux
3bdab16c55
Convert the pcmcia docs to ReST format. Most of the changes here are trivial. The conversion is actually: - add blank lines and identation in order to identify paragraphs; - fix tables markups; - add some lists markups; - mark literal blocks; - adjust title markups. At its new index.rst, let's add a :orphan: while this is not linked to the main index.rst file, in order to avoid build warnings. Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Acked-by: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
134 lines
2.5 KiB
ReStructuredText
134 lines
2.5 KiB
ReStructuredText
=======
|
|
Locking
|
|
=======
|
|
|
|
This file explains the locking and exclusion scheme used in the PCCARD
|
|
and PCMCIA subsystems.
|
|
|
|
|
|
A) Overview, Locking Hierarchy:
|
|
===============================
|
|
|
|
pcmcia_socket_list_rwsem
|
|
- protects only the list of sockets
|
|
|
|
- skt_mutex
|
|
- serializes card insert / ejection
|
|
|
|
- ops_mutex
|
|
- serializes socket operation
|
|
|
|
|
|
B) Exclusion
|
|
============
|
|
|
|
The following functions and callbacks to struct pcmcia_socket must
|
|
be called with "skt_mutex" held::
|
|
|
|
socket_detect_change()
|
|
send_event()
|
|
socket_reset()
|
|
socket_shutdown()
|
|
socket_setup()
|
|
socket_remove()
|
|
socket_insert()
|
|
socket_early_resume()
|
|
socket_late_resume()
|
|
socket_resume()
|
|
socket_suspend()
|
|
|
|
struct pcmcia_callback *callback
|
|
|
|
The following functions and callbacks to struct pcmcia_socket must
|
|
be called with "ops_mutex" held::
|
|
|
|
socket_reset()
|
|
socket_setup()
|
|
|
|
struct pccard_operations *ops
|
|
struct pccard_resource_ops *resource_ops;
|
|
|
|
Note that send_event() and `struct pcmcia_callback *callback` must not be
|
|
called with "ops_mutex" held.
|
|
|
|
|
|
C) Protection
|
|
=============
|
|
|
|
1. Global Data:
|
|
---------------
|
|
struct list_head pcmcia_socket_list;
|
|
|
|
protected by pcmcia_socket_list_rwsem;
|
|
|
|
|
|
2. Per-Socket Data:
|
|
-------------------
|
|
The resource_ops and their data are protected by ops_mutex.
|
|
|
|
The "main" struct pcmcia_socket is protected as follows (read-only fields
|
|
or single-use fields not mentioned):
|
|
|
|
- by pcmcia_socket_list_rwsem::
|
|
|
|
struct list_head socket_list;
|
|
|
|
- by thread_lock::
|
|
|
|
unsigned int thread_events;
|
|
|
|
- by skt_mutex::
|
|
|
|
u_int suspended_state;
|
|
void (*tune_bridge);
|
|
struct pcmcia_callback *callback;
|
|
int resume_status;
|
|
|
|
- by ops_mutex::
|
|
|
|
socket_state_t socket;
|
|
u_int state;
|
|
u_short lock_count;
|
|
pccard_mem_map cis_mem;
|
|
void __iomem *cis_virt;
|
|
struct { } irq;
|
|
io_window_t io[];
|
|
pccard_mem_map win[];
|
|
struct list_head cis_cache;
|
|
size_t fake_cis_len;
|
|
u8 *fake_cis;
|
|
u_int irq_mask;
|
|
void (*zoom_video);
|
|
int (*power_hook);
|
|
u8 resource...;
|
|
struct list_head devices_list;
|
|
u8 device_count;
|
|
struct pcmcia_state;
|
|
|
|
|
|
3. Per PCMCIA-device Data:
|
|
--------------------------
|
|
|
|
The "main" struct pcmcia_device is protected as follows (read-only fields
|
|
or single-use fields not mentioned):
|
|
|
|
|
|
- by pcmcia_socket->ops_mutex::
|
|
|
|
struct list_head socket_device_list;
|
|
struct config_t *function_config;
|
|
u16 _irq:1;
|
|
u16 _io:1;
|
|
u16 _win:4;
|
|
u16 _locked:1;
|
|
u16 allow_func_id_match:1;
|
|
u16 suspended:1;
|
|
u16 _removed:1;
|
|
|
|
- by the PCMCIA driver::
|
|
|
|
io_req_t io;
|
|
irq_req_t irq;
|
|
config_req_t conf;
|
|
window_handle_t win;
|