master/slave.c
branchstable-1.5
changeset 2443 2c3ccdde3919
parent 2421 bc2d4bf9cbe5
child 2460 611e4d745dcd
equal deleted inserted replaced
2442:86ebf18a029f 2443:2c3ccdde3919
     1 /******************************************************************************
     1 /******************************************************************************
     2  *
     2  *
     3  *  $Id$
     3  *  $Id$
     4  *
     4  *
     5  *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
     5  *  Copyright (C) 2006-2012  Florian Pose, Ingenieurgemeinschaft IgH
     6  *
     6  *
     7  *  This file is part of the IgH EtherCAT Master.
     7  *  This file is part of the IgH EtherCAT Master.
     8  *
     8  *
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
    10  *  modify it under the terms of the GNU General Public License version 2, as
    10  *  modify it under the terms of the GNU General Public License version 2, as
   153     slave->jiffies_preop = 0;
   153     slave->jiffies_preop = 0;
   154 
   154 
   155     INIT_LIST_HEAD(&slave->slave_sdo_requests);
   155     INIT_LIST_HEAD(&slave->slave_sdo_requests);
   156     init_waitqueue_head(&slave->sdo_queue);
   156     init_waitqueue_head(&slave->sdo_queue);
   157 
   157 
       
   158     INIT_LIST_HEAD(&slave->reg_requests);
       
   159     init_waitqueue_head(&slave->reg_queue);
       
   160 
   158     INIT_LIST_HEAD(&slave->foe_requests);
   161     INIT_LIST_HEAD(&slave->foe_requests);
   159     init_waitqueue_head(&slave->foe_queue);
   162     init_waitqueue_head(&slave->foe_queue);
   160 
   163 
   161     INIT_LIST_HEAD(&slave->soe_requests);
   164     INIT_LIST_HEAD(&slave->soe_requests);
   162     init_waitqueue_head(&slave->soe_queue);
   165     init_waitqueue_head(&slave->soe_queue);
   200                 " slave about to be deleted.\n");
   203                 " slave about to be deleted.\n");
   201         request->req.state = EC_INT_REQUEST_FAILURE;
   204         request->req.state = EC_INT_REQUEST_FAILURE;
   202         wake_up(&slave->sdo_queue);
   205         wake_up(&slave->sdo_queue);
   203     }
   206     }
   204 
   207 
       
   208     while (!list_empty(&slave->reg_requests)) {
       
   209         ec_reg_request_t *reg =
       
   210             list_entry(slave->reg_requests.next, ec_reg_request_t, list);
       
   211         list_del_init(&reg->list); // dequeue
       
   212         EC_SLAVE_WARN(slave, "Discarding register request,"
       
   213                 " slave about to be deleted.\n");
       
   214         reg->state = EC_INT_REQUEST_FAILURE;
       
   215         wake_up(&slave->reg_queue);
       
   216     }
       
   217 
   205     while (!list_empty(&slave->foe_requests)) {
   218     while (!list_empty(&slave->foe_requests)) {
   206         ec_master_foe_request_t *request =
   219         ec_master_foe_request_t *request =
   207             list_entry(slave->foe_requests.next,
   220             list_entry(slave->foe_requests.next,
   208                 ec_master_foe_request_t, list);
   221                 ec_master_foe_request_t, list);
   209         list_del_init(&request->list); // dequeue
   222         list_del_init(&request->list); // dequeue
   222                 " slave about to be deleted.\n");
   235                 " slave about to be deleted.\n");
   223         request->req.state = EC_INT_REQUEST_FAILURE;
   236         request->req.state = EC_INT_REQUEST_FAILURE;
   224         wake_up(&slave->soe_queue);
   237         wake_up(&slave->soe_queue);
   225     }
   238     }
   226 
   239 
   227     if (slave->config)
   240     if (slave->config) {
   228         ec_slave_config_detach(slave->config);
   241         ec_slave_config_detach(slave->config);
       
   242     }
   229 
   243 
   230     // free all SDOs
   244     // free all SDOs
   231     list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) {
   245     list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) {
   232         list_del(&sdo->list);
   246         list_del(&sdo->list);
   233         ec_sdo_clear(sdo);
   247         ec_sdo_clear(sdo);
   249         list_del(&pdo->list);
   263         list_del(&pdo->list);
   250         ec_pdo_clear(pdo);
   264         ec_pdo_clear(pdo);
   251         kfree(pdo);
   265         kfree(pdo);
   252     }
   266     }
   253 
   267 
   254     if (slave->sii_words)
   268     if (slave->sii_words) {
   255         kfree(slave->sii_words);
   269         kfree(slave->sii_words);
       
   270     }
       
   271 
   256     ec_fsm_slave_clear(&slave->fsm);
   272     ec_fsm_slave_clear(&slave->fsm);
   257     ec_datagram_clear(&slave->fsm_datagram);
   273     ec_datagram_clear(&slave->fsm_datagram);
   258 }
   274 }
   259 
   275 
   260 /*****************************************************************************/
   276 /*****************************************************************************/