master/master.c
changeset 161 ddb7266d1c56
parent 155 ff65679b65fe
child 164 ed85368b2b2e
equal deleted inserted replaced
160:7ddf8367196a 161:ddb7266d1c56
    84     ec_domain_t *domain, *next_d;
    84     ec_domain_t *domain, *next_d;
    85     ec_eoe_t *eoe, *next_eoe;
    85     ec_eoe_t *eoe, *next_eoe;
    86 
    86 
    87     // Alle Slaves entfernen
    87     // Alle Slaves entfernen
    88     if (master->slaves) {
    88     if (master->slaves) {
    89         for (i = 0; i < master->slave_count; i++) {
    89         for (i = 0; i < master->slave_count; i++)
    90             ec_slave_clear(master->slaves + i);
    90             ec_slave_clear(master->slaves + i);
    91         }
       
    92         kfree(master->slaves);
    91         kfree(master->slaves);
    93         master->slaves = NULL;
    92         master->slaves = NULL;
    94     }
    93     }
    95     master->slave_count = 0;
    94     master->slave_count = 0;
    96 
    95 
   106         ec_domain_clear(domain);
   105         ec_domain_clear(domain);
   107         kfree(domain);
   106         kfree(domain);
   108     }
   107     }
   109 
   108 
   110     // EOE-Liste leeren
   109     // EOE-Liste leeren
   111     list_for_each_entry_safe(eoe, next_eoe, &master->domains, list) {
   110     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_slaves, list) {
   112         list_del(&eoe->list);
   111         list_del(&eoe->list);
   113         ec_eoe_clear(eoe);
   112         ec_eoe_clear(eoe);
   114         kfree(eoe);
   113         kfree(eoe);
   115     }
   114     }
   116 
   115 
   409     master->slave_count = command->working_counter;
   408     master->slave_count = command->working_counter;
   410     EC_INFO("Found %i slaves on bus.\n", master->slave_count);
   409     EC_INFO("Found %i slaves on bus.\n", master->slave_count);
   411 
   410 
   412     if (!master->slave_count) return 0;
   411     if (!master->slave_count) return 0;
   413 
   412 
   414     if (!(master->slaves = (ec_slave_t *) kmalloc(master->slave_count
   413     if (!(master->slaves = (ec_slave_t *)
   415                                                   * sizeof(ec_slave_t),
   414           kmalloc(master->slave_count * sizeof(ec_slave_t), GFP_KERNEL))) {
   416                                                   GFP_KERNEL))) {
   415         EC_ERR("Failed to allocate slaves!\n");
   417         EC_ERR("Could not allocate memory for slaves!\n");
       
   418         return -1;
   416         return -1;
   419     }
   417     }
   420 
   418 
   421     // Init slaves
   419     // Init slaves
   422     for (i = 0; i < master->slave_count; i++) {
   420     for (i = 0; i < master->slave_count; i++) {
   424         ec_slave_init(slave, master);
   422         ec_slave_init(slave, master);
   425         slave->ring_position = i;
   423         slave->ring_position = i;
   426         slave->station_address = i + 1;
   424         slave->station_address = i + 1;
   427     }
   425     }
   428 
   426 
   429     // For every slave in the list
   427     // For every slave on the bus
   430     for (i = 0; i < master->slave_count; i++)
   428     for (i = 0; i < master->slave_count; i++) {
   431     {
       
   432         slave = master->slaves + i;
   429         slave = master->slaves + i;
   433 
   430 
   434         // Write station address
   431         // Write station address
   435         if (ec_command_apwr(command, slave->ring_position,
   432         if (ec_command_apwr(command, slave->ring_position,
   436                             0x0010, sizeof(uint16_t))) return -1;
   433                             0x0010, sizeof(uint16_t))) return -1;
   459                     " position %i.\n", slave->sii_vendor_id,
   456                     " position %i.\n", slave->sii_vendor_id,
   460                     slave->sii_product_code, i);
   457                     slave->sii_product_code, i);
   461 
   458 
   462         // Does the slave support EoE?
   459         // Does the slave support EoE?
   463         if (slave->sii_mailbox_protocols & EC_MBOX_EOE) {
   460         if (slave->sii_mailbox_protocols & EC_MBOX_EOE) {
   464             if (!(eoe = kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   461             if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   465                 EC_ERR("Failed to allocate memory for EoE-Object.\n");
   462                 EC_ERR("Failed to allocate EoE-Object.\n");
   466                 return -1;
   463                 return -1;
   467             }
   464             }
   468 
   465 
   469             ec_eoe_init(eoe, slave);
   466             ec_eoe_init(eoe, slave);
   470             list_add_tail(&eoe->list, &master->eoe_slaves);
   467             list_add_tail(&eoe->list, &master->eoe_slaves);