/* releases rtcfg_dev->dev_mutex on return */ static void rtcfg_client_detach(int ifindex, struct rt_proc_call *call) { struct rtcfg_device *rtcfg_dev = &device[ifindex]; struct rtcfg_cmd *cmd_event; cmd_event = rtpc_get_priv(call, struct rtcfg_cmd); cmd_event->args.detach.station_addr_list = rtcfg_dev->spec.clt.station_addr_list; cmd_event->args.detach.stage2_chain = rtcfg_dev->spec.clt.stage2_chain; while (1) { call = rtcfg_dequeue_blocking_call(ifindex); if (call == NULL) break; rtpc_complete_call(call, -ENODEV); } if (test_and_clear_bit(FLAG_TIMER_STARTED, &rtcfg_dev->flags)) rtdm_timer_destroy(&rtcfg_dev->timer); rtcfg_reset_device(ifindex); rtcfg_next_main_state(cmd_event->internal.data.ifindex, RTCFG_MAIN_OFF); rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); }
static void rtcfg_client_detach(int ifindex, struct rt_proc_call *call) { struct rtcfg_device *rtcfg_dev = &device[ifindex]; struct rtcfg_cmd *cmd_event; cmd_event = rtpc_get_priv(call, struct rtcfg_cmd); cmd_event->args.detach.station_addr_list = rtcfg_dev->spec.clt.station_addr_list; cmd_event->args.detach.stage2_chain = rtcfg_dev->spec.clt.stage2_chain; while (1) { call = rtcfg_dequeue_blocking_call(ifindex); if (call == NULL) break; rtpc_complete_call(call, -ENODEV); } if (rtcfg_dev->flags & FLAG_TIMER_STARTED) { rtcfg_dev->flags |= FLAG_TIMER_SHUTDOWN; rtos_task_delete(&rtcfg_dev->timer_task); } rtcfg_reset_device(ifindex); rtcfg_next_main_state(cmd_event->ifindex, RTCFG_MAIN_OFF); rtos_res_unlock(&rtcfg_dev->dev_lock); }
/* releases rtcfg_dev->dev_mutex on return */ static void rtcfg_client_detach(int ifindex, struct rt_proc_call *call) { struct rtcfg_device *rtcfg_dev = &device[ifindex]; struct rtcfg_cmd *cmd_event; cmd_event = rtpc_get_priv(call, struct rtcfg_cmd); cmd_event->args.detach.station_addr_list = rtcfg_dev->spec.clt.station_addr_list; cmd_event->args.detach.stage2_chain = rtcfg_dev->spec.clt.stage2_chain; while (1) { call = rtcfg_dequeue_blocking_call(ifindex); if (call == NULL) break; rtpc_complete_call(call, -ENODEV); } if (rtcfg_dev->flags & FLAG_TIMER_STARTED) { /* It's safe to kill the task, it either waits for dev_mutex or the next period. */ rtdm_task_destroy(&rtcfg_dev->timer_task); } rtcfg_reset_device(ifindex); rtcfg_next_main_state(cmd_event->internal.data.ifindex, RTCFG_MAIN_OFF); rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); }