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