master/master.c
branchstable-1.5
changeset 2443 2c3ccdde3919
parent 2441 a89481754fd5
child 2447 e93efb4af231
equal deleted inserted replaced
2442:86ebf18a029f 2443:2c3ccdde3919
   206     master->app_cb_data = NULL;
   206     master->app_cb_data = NULL;
   207 
   207 
   208     INIT_LIST_HEAD(&master->sii_requests);
   208     INIT_LIST_HEAD(&master->sii_requests);
   209     init_waitqueue_head(&master->sii_queue);
   209     init_waitqueue_head(&master->sii_queue);
   210 
   210 
   211     INIT_LIST_HEAD(&master->reg_requests);
       
   212     init_waitqueue_head(&master->reg_queue);
       
   213 
       
   214     // init devices
   211     // init devices
   215     ret = ec_device_init(&master->devices[EC_DEVICE_MAIN], master);
   212     ret = ec_device_init(&master->devices[EC_DEVICE_MAIN], master);
   216     if (ret < 0)
   213     if (ret < 0)
   217         goto out_return;
   214         goto out_return;
   218 
   215 
   427                 " to be deleted.\n", request->slave->ring_position);
   424                 " to be deleted.\n", request->slave->ring_position);
   428         request->state = EC_INT_REQUEST_FAILURE;
   425         request->state = EC_INT_REQUEST_FAILURE;
   429         wake_up(&master->sii_queue);
   426         wake_up(&master->sii_queue);
   430     }
   427     }
   431 
   428 
   432     while (!list_empty(&master->reg_requests)) {
       
   433         ec_reg_request_t *request =
       
   434             list_entry(master->reg_requests.next, ec_reg_request_t, list);
       
   435         list_del_init(&request->list); // dequeue
       
   436         EC_MASTER_WARN(master, "Discarding register request, slave %u"
       
   437                 " about to be deleted.\n", request->slave->ring_position);
       
   438         request->state = EC_INT_REQUEST_FAILURE;
       
   439         wake_up(&master->reg_queue);
       
   440     }
       
   441 
       
   442     for (slave = master->slaves;
   429     for (slave = master->slaves;
   443             slave < master->slaves + master->slave_count;
   430             slave < master->slaves + master->slave_count;
   444             slave++) {
   431             slave++) {
   445         ec_slave_clear(slave);
   432         ec_slave_clear(slave);
   446     }
   433     }
   872      * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably
   859      * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably
   873      * causing an unmatched datagram. */
   860      * causing an unmatched datagram. */
   874     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   861     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   875         if (queued_datagram == datagram) {
   862         if (queued_datagram == datagram) {
   876             datagram->skip_count++;
   863             datagram->skip_count++;
   877             EC_MASTER_DBG(master, 1, "Skipping re-initialized datagram %p.\n",
   864             EC_MASTER_DBG(master, 1,
   878                     datagram);
   865                     "Datagram %p already queued (skipping).\n", datagram);
   879             datagram->state = EC_DATAGRAM_QUEUED;
   866             datagram->state = EC_DATAGRAM_QUEUED;
   880             return;
   867             return;
   881         }
   868         }
   882     }
   869     }
   883 
   870