123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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;
|