364 slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0; |
364 slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0; |
365 } |
365 } |
366 |
366 |
367 // Start fetching EEPROM size |
367 // Start fetching EEPROM size |
368 |
368 |
369 fsm->sii_offset = 0x0040; // first category header |
369 fsm->sii_offset = EC_FIRST_EEPROM_CATEGORY_OFFSET; // first category header |
370 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE); |
370 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE); |
371 fsm->state = ec_fsm_slave_scan_state_eeprom_size; |
371 fsm->state = ec_fsm_slave_scan_state_eeprom_size; |
372 fsm->state(fsm); // execute state immediately |
372 fsm->state(fsm); // execute state immediately |
373 } |
373 } |
374 |
374 |
396 cat_type = EC_READ_U16(fsm->fsm_sii.value); |
396 cat_type = EC_READ_U16(fsm->fsm_sii.value); |
397 cat_size = EC_READ_U16(fsm->fsm_sii.value + 2); |
397 cat_size = EC_READ_U16(fsm->fsm_sii.value + 2); |
398 |
398 |
399 if (cat_type != 0xFFFF) { // not the last category |
399 if (cat_type != 0xFFFF) { // not the last category |
400 fsm->sii_offset += cat_size + 2; |
400 fsm->sii_offset += cat_size + 2; |
|
401 if (fsm->sii_offset >= EC_MAX_EEPROM_SIZE) { |
|
402 EC_WARN("EEPROM size of slave %i exceeds" |
|
403 " %i words (0xffff limiter missing?).\n", |
|
404 slave->ring_position, EC_MAX_EEPROM_SIZE); |
|
405 slave->eeprom_size = EC_FIRST_EEPROM_CATEGORY_OFFSET * 2; |
|
406 goto alloc_eeprom; |
|
407 } |
401 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
408 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
402 EC_FSM_SII_NODE); |
409 EC_FSM_SII_NODE); |
403 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
410 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
404 return; |
411 return; |
405 } |
412 } |
406 |
413 |
407 slave->eeprom_size = (fsm->sii_offset + 1) * 2; |
414 slave->eeprom_size = (fsm->sii_offset + 1) * 2; |
408 |
415 |
|
416 alloc_eeprom: |
409 if (slave->eeprom_data) { |
417 if (slave->eeprom_data) { |
410 EC_INFO("Freeing old EEPROM data on slave %i...\n", |
418 EC_INFO("Freeing old EEPROM data on slave %i...\n", |
411 slave->ring_position); |
419 slave->ring_position); |
412 kfree(slave->eeprom_data); |
420 kfree(slave->eeprom_data); |
413 } |
421 } |
492 EC_READ_U16(slave->eeprom_data + 2 * 0x001B); |
500 EC_READ_U16(slave->eeprom_data + 2 * 0x001B); |
493 slave->sii_mailbox_protocols = |
501 slave->sii_mailbox_protocols = |
494 EC_READ_U16(slave->eeprom_data + 2 * 0x001C); |
502 EC_READ_U16(slave->eeprom_data + 2 * 0x001C); |
495 |
503 |
496 // evaluate category data |
504 // evaluate category data |
497 cat_word = (uint16_t *) slave->eeprom_data + 0x0040; |
505 cat_word = (uint16_t *) slave->eeprom_data + EC_FIRST_EEPROM_CATEGORY_OFFSET; |
498 while (EC_READ_U16(cat_word) != 0xFFFF) { |
506 while (EC_READ_U16(cat_word) != 0xFFFF) { |
499 cat_type = EC_READ_U16(cat_word) & 0x7FFF; |
507 cat_type = EC_READ_U16(cat_word) & 0x7FFF; |
500 cat_size = EC_READ_U16(cat_word + 1); |
508 cat_size = EC_READ_U16(cat_word + 1); |
501 |
509 |
502 switch (cat_type) { |
510 switch (cat_type) { |