linux/Documentation/pcmcia/locking.txt
<<
>>
Prefs
   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_devie 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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.