134 lines · plain
1=======2Locking3=======4 5This file explains the locking and exclusion scheme used in the PCCARD6and PCMCIA subsystems.7 8 9A) Overview, Locking Hierarchy:10===============================11 12pcmcia_socket_list_rwsem13 - protects only the list of sockets14 15- skt_mutex16 - serializes card insert / ejection17 18 - ops_mutex19 - serializes socket operation20 21 22B) Exclusion23============24 25The following functions and callbacks to struct pcmcia_socket must26be called with "skt_mutex" held::27 28 socket_detect_change()29 send_event()30 socket_reset()31 socket_shutdown()32 socket_setup()33 socket_remove()34 socket_insert()35 socket_early_resume()36 socket_late_resume()37 socket_resume()38 socket_suspend()39 40 struct pcmcia_callback *callback41 42The following functions and callbacks to struct pcmcia_socket must43be called with "ops_mutex" held::44 45 socket_reset()46 socket_setup()47 48 struct pccard_operations *ops49 struct pccard_resource_ops *resource_ops;50 51Note that send_event() and `struct pcmcia_callback *callback` must not be52called with "ops_mutex" held.53 54 55C) Protection56=============57 581. Global Data:59---------------60struct list_head pcmcia_socket_list;61 62protected by pcmcia_socket_list_rwsem;63 64 652. Per-Socket Data:66-------------------67The resource_ops and their data are protected by ops_mutex.68 69The "main" struct pcmcia_socket is protected as follows (read-only fields70or single-use fields not mentioned):71 72- by pcmcia_socket_list_rwsem::73 74 struct list_head socket_list;75 76- by thread_lock::77 78 unsigned int thread_events;79 80- by skt_mutex::81 82 u_int suspended_state;83 void (*tune_bridge);84 struct pcmcia_callback *callback;85 int resume_status;86 87- by ops_mutex::88 89 socket_state_t socket;90 u_int state;91 u_short lock_count;92 pccard_mem_map cis_mem;93 void __iomem *cis_virt;94 struct { } irq;95 io_window_t io[];96 pccard_mem_map win[];97 struct list_head cis_cache;98 size_t fake_cis_len;99 u8 *fake_cis;100 u_int irq_mask;101 void (*zoom_video);102 int (*power_hook);103 u8 resource...;104 struct list_head devices_list;105 u8 device_count;106 struct pcmcia_state;107 108 1093. Per PCMCIA-device Data:110--------------------------111 112The "main" struct pcmcia_device is protected as follows (read-only fields113or single-use fields not mentioned):114 115 116- by pcmcia_socket->ops_mutex::117 118 struct list_head socket_device_list;119 struct config_t *function_config;120 u16 _irq:1;121 u16 _io:1;122 u16 _win:4;123 u16 _locked:1;124 u16 allow_func_id_match:1;125 u16 suspended:1;126 u16 _removed:1;127 128- by the PCMCIA driver::129 130 io_req_t io;131 irq_req_t irq;132 config_req_t conf;133 window_handle_t win;134