113 fmmu->domain = domain; |
113 fmmu->domain = domain; |
114 |
114 |
115 domain->data_size += fmmu->data_size; |
115 domain->data_size += fmmu->data_size; |
116 list_add_tail(&fmmu->list, &domain->fmmu_configs); |
116 list_add_tail(&fmmu->list, &domain->fmmu_configs); |
117 |
117 |
118 if (domain->master->debug_level) |
118 EC_MASTER_DBG(domain->master, 1, "Domain %u:" |
119 EC_DBG("Domain %u: Added %u bytes, total %zu.\n", domain->index, |
119 " Added %u bytes, total %zu.\n", |
120 fmmu->data_size, domain->data_size); |
120 domain->index, fmmu->data_size, domain->data_size); |
121 } |
121 } |
122 |
122 |
123 /*****************************************************************************/ |
123 /*****************************************************************************/ |
124 |
124 |
125 /** Allocates a domain datagram and appends it to the list. |
125 /** Allocates a domain datagram and appends it to the list. |
140 { |
140 { |
141 ec_datagram_t *datagram; |
141 ec_datagram_t *datagram; |
142 int ret; |
142 int ret; |
143 |
143 |
144 if (!(datagram = kmalloc(sizeof(ec_datagram_t), GFP_KERNEL))) { |
144 if (!(datagram = kmalloc(sizeof(ec_datagram_t), GFP_KERNEL))) { |
145 EC_ERR("Failed to allocate domain datagram!\n"); |
145 EC_MASTER_ERR(domain->master, |
|
146 "Failed to allocate domain datagram!\n"); |
146 return -ENOMEM; |
147 return -ENOMEM; |
147 } |
148 } |
148 |
149 |
149 ec_datagram_init(datagram); |
150 ec_datagram_init(datagram); |
150 snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, |
151 snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, |
210 domain->logical_base_address = base_address; |
211 domain->logical_base_address = base_address; |
211 |
212 |
212 if (domain->data_size && domain->data_origin == EC_ORIG_INTERNAL) { |
213 if (domain->data_size && domain->data_origin == EC_ORIG_INTERNAL) { |
213 if (!(domain->data = |
214 if (!(domain->data = |
214 (uint8_t *) kmalloc(domain->data_size, GFP_KERNEL))) { |
215 (uint8_t *) kmalloc(domain->data_size, GFP_KERNEL))) { |
215 EC_ERR("Failed to allocate %zu bytes internal memory for" |
216 EC_MASTER_ERR(domain->master, "Failed to allocate %zu bytes" |
216 " domain %u!\n", domain->data_size, domain->index); |
217 " internal memory for domain %u!\n", |
|
218 domain->data_size, domain->index); |
217 return -ENOMEM; |
219 return -ENOMEM; |
218 } |
220 } |
219 } |
221 } |
220 |
222 |
221 // Cycle through all domain FMMUS and |
223 // Cycle through all domain FMMUS and |
278 if (ret < 0) |
280 if (ret < 0) |
279 return ret; |
281 return ret; |
280 datagram_count++; |
282 datagram_count++; |
281 } |
283 } |
282 |
284 |
283 EC_INFO("Domain%u: Logical address 0x%08x, %zu byte, " |
285 EC_MASTER_INFO(domain->master, "Domain%u: Logical address 0x%08x," |
284 "expected working counter %u.\n", domain->index, |
286 " %zu byte, expected working counter %u.\n", domain->index, |
285 domain->logical_base_address, domain->data_size, |
287 domain->logical_base_address, domain->data_size, |
286 domain->expected_working_counter); |
288 domain->expected_working_counter); |
287 list_for_each_entry(datagram, &domain->datagrams, list) { |
289 list_for_each_entry(datagram, &domain->datagrams, list) { |
288 EC_INFO(" Datagram %s: Logical offset 0x%08x, %zu byte, type %s.\n", |
290 EC_MASTER_INFO(domain->master, " Datagram %s: Logical offset 0x%08x," |
289 datagram->name, EC_READ_U32(datagram->address), |
291 " %zu byte, type %s.\n", datagram->name, |
290 datagram->data_size, ec_datagram_type_string(datagram)); |
292 EC_READ_U32(datagram->address), datagram->data_size, |
|
293 ec_datagram_type_string(datagram)); |
291 } |
294 } |
292 |
295 |
293 return 0; |
296 return 0; |
294 } |
297 } |
295 |
298 |
338 { |
341 { |
339 const ec_pdo_entry_reg_t *reg; |
342 const ec_pdo_entry_reg_t *reg; |
340 ec_slave_config_t *sc; |
343 ec_slave_config_t *sc; |
341 int ret; |
344 int ret; |
342 |
345 |
343 if (domain->master->debug_level) |
346 EC_MASTER_DBG(domain->master, 1, "ecrt_domain_reg_pdo_entry_list(" |
344 EC_DBG("ecrt_domain_reg_pdo_entry_list(domain = 0x%p, regs = 0x%p)\n", |
347 "domain = 0x%p, regs = 0x%p)\n", domain, regs); |
345 domain, regs); |
|
346 |
348 |
347 for (reg = regs; reg->index; reg++) { |
349 for (reg = regs; reg->index; reg++) { |
348 sc = ecrt_master_slave_config_err(domain->master, reg->alias, |
350 sc = ecrt_master_slave_config_err(domain->master, reg->alias, |
349 reg->position, reg->vendor_id, reg->product_code); |
351 reg->position, reg->vendor_id, reg->product_code); |
350 if (IS_ERR(sc)) |
352 if (IS_ERR(sc)) |
370 |
372 |
371 /*****************************************************************************/ |
373 /*****************************************************************************/ |
372 |
374 |
373 void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) |
375 void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) |
374 { |
376 { |
375 if (domain->master->debug_level) |
377 EC_MASTER_DBG(domain->master, 1, "ecrt_domain_external_memory(" |
376 EC_DBG("ecrt_domain_external_memory(domain = 0x%p, mem = 0x%p)\n", |
378 "domain = 0x%p, mem = 0x%p)\n", domain, mem); |
377 domain, mem); |
|
378 |
379 |
379 down(&domain->master->master_sem); |
380 down(&domain->master->master_sem); |
380 |
381 |
381 ec_domain_clear_data(domain); |
382 ec_domain_clear_data(domain); |
382 |
383 |
415 |
416 |
416 if (domain->working_counter_changes && |
417 if (domain->working_counter_changes && |
417 jiffies - domain->notify_jiffies > HZ) { |
418 jiffies - domain->notify_jiffies > HZ) { |
418 domain->notify_jiffies = jiffies; |
419 domain->notify_jiffies = jiffies; |
419 if (domain->working_counter_changes == 1) { |
420 if (domain->working_counter_changes == 1) { |
420 EC_INFO("Domain %u: Working counter changed to %u/%u.\n", |
421 EC_MASTER_INFO(domain->master, "Domain %u: Working counter" |
421 domain->index, domain->working_counter, |
422 " changed to %u/%u.\n", domain->index, |
|
423 domain->working_counter, domain->expected_working_counter); |
|
424 } else { |
|
425 EC_MASTER_INFO(domain->master, "Domain %u: %u working counter" |
|
426 " changes - now %u/%u.\n", domain->index, |
|
427 domain->working_counter_changes, domain->working_counter, |
422 domain->expected_working_counter); |
428 domain->expected_working_counter); |
423 } else { |
|
424 EC_INFO("Domain %u: %u working counter changes - now %u/%u.\n", |
|
425 domain->index, domain->working_counter_changes, |
|
426 domain->working_counter, domain->expected_working_counter); |
|
427 } |
429 } |
428 domain->working_counter_changes = 0; |
430 domain->working_counter_changes = 0; |
429 } |
431 } |
430 } |
432 } |
431 |
433 |