/* sa1100_pcmcia_task_handler() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Processes serviceable socket events using the "eventd" thread context. * * Event processing (specifically, the invocation of the Card Services event * callback) occurs in this thread rather than in the actual interrupt * handler due to the use of scheduling operations in the PCMCIA core. */ static void sa1100_pcmcia_task_handler(void *data) { struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK]; struct pcmcia_state_array state_array; int i, events, all_events, irq_status; DEBUG(2, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__); state_array.size=sa1100_pcmcia_socket_count; state_array.state=state; do { DEBUG(3, "%s(): interrogating low-level PCMCIA service\n", __FUNCTION__); if((irq_status=pcmcia_low_level->socket_state(&state_array))<0) printk(KERN_ERR "Error in kernel low-level PCMCIA service.\n"); all_events=0; if(irq_status>0){ for(i=0; i<state_array.size; ++i, all_events|=events) if((events= sa1100_pcmcia_events(&state[i], &sa1100_pcmcia_socket[i].k_state, sa1100_pcmcia_socket[i].cs_state.csc_mask, sa1100_pcmcia_socket[i].cs_state.flags))) if(sa1100_pcmcia_socket[i].handler!=NULL) sa1100_pcmcia_socket[i].handler(sa1100_pcmcia_socket[i].handler_info, events); } } while(all_events); } /* sa1100_pcmcia_task_handler() */
/* sa1100_pcmcia_task_handler() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Processes serviceable socket events using the "eventd" thread context. * * Event processing (specifically, the invocation of the Card Services event * callback) occurs in this thread rather than in the actual interrupt * handler due to the use of scheduling operations in the PCMCIA core. */ static void sa1100_pcmcia_task_handler(void *data) { struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK]; struct pcmcia_state_array state_array; unsigned int all_events; DEBUG(4, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__); state_array.size = sa1100_pcmcia_socket_count; state_array.state = state; do { unsigned int events; int ret, i; memset(state, 0, sizeof(state)); DEBUG(4, "%s(): interrogating low-level PCMCIA service\n", __FUNCTION__); ret = pcmcia_low_level->socket_state(&state_array); if (ret < 0) { printk(KERN_ERR "sa1100_pcmcia: unable to read socket status\n"); break; } all_events = 0; for (i = 0; i < state_array.size; i++, all_events |= events) { struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i); events = sa1100_pcmcia_events(&state[i], &skt->k_state, skt->cs_state.csc_mask, skt->cs_state.flags); if (events && sa1100_pcmcia_socket[i].handler != NULL) skt->handler(skt->handler_info, events); } } while(all_events); } /* sa1100_pcmcia_task_handler() */