master/fsm_soe.c
changeset 1952 7d9fb723fc4b
parent 1931 831f2d34664c
child 2045 ff2a13a4603c
child 2498 9cdd7669dc0b
equal deleted inserted replaced
1951:a1a6d7719f97 1952:7d9fb723fc4b
   199     ec_slave_t *slave = fsm->slave;
   199     ec_slave_t *slave = fsm->slave;
   200     ec_master_t *master = slave->master;
   200     ec_master_t *master = slave->master;
   201     ec_soe_request_t *request = fsm->request;
   201     ec_soe_request_t *request = fsm->request;
   202     uint8_t *data;
   202     uint8_t *data;
   203 
   203 
   204     EC_SLAVE_DBG(slave, 1, "Reading IDN 0x%04X.\n", request->idn);
   204     EC_SLAVE_DBG(slave, 1, "Reading IDN 0x%04X of drive %u.\n", request->idn,
       
   205             request->drive_no);
   205 
   206 
   206     if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) {
   207     if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) {
   207         EC_SLAVE_ERR(slave, "Slave does not support SoE!\n");
   208         EC_SLAVE_ERR(slave, "Slave does not support SoE!\n");
   208         fsm->state = ec_fsm_soe_error;
   209         fsm->state = ec_fsm_soe_error;
   209         ec_fsm_soe_print_error(fsm);
   210         ec_fsm_soe_print_error(fsm);
   216         fsm->state = ec_fsm_soe_error;
   217         fsm->state = ec_fsm_soe_error;
   217         ec_fsm_soe_print_error(fsm);
   218         ec_fsm_soe_print_error(fsm);
   218         return;
   219         return;
   219     }
   220     }
   220 
   221 
   221     EC_WRITE_U8(data, OPCODE_READ_REQUEST);
   222     EC_WRITE_U8(data, OPCODE_READ_REQUEST | (request->drive_no & 0x07) << 5);
   222     EC_WRITE_U8(data + 1, 1 << 6); // request value
   223     EC_WRITE_U8(data + 1, 1 << 6); // request value
   223     EC_WRITE_U16(data + 2, request->idn);
   224     EC_WRITE_U16(data + 2, request->idn);
   224 
   225 
   225     if (master->debug_level) {
   226     if (master->debug_level) {
   226         EC_SLAVE_DBG(slave, 0, "SCC read request:\n");
   227         EC_SLAVE_DBG(slave, 0, "SCC read request:\n");
   490         fsm->state = ec_fsm_soe_error;
   491         fsm->state = ec_fsm_soe_error;
   491         ec_fsm_soe_print_error(fsm);
   492         ec_fsm_soe_print_error(fsm);
   492         return;
   493         return;
   493     }
   494     }
   494 
   495 
   495     EC_WRITE_U8(data, OPCODE_WRITE_REQUEST | incomplete << 3);
   496     EC_WRITE_U8(data, OPCODE_WRITE_REQUEST | incomplete << 3 |
       
   497             (req->drive_no & 0x07) << 5);
   496     EC_WRITE_U8(data + 1, 1 << 6); // only value included
   498     EC_WRITE_U8(data + 1, 1 << 6); // only value included
   497     EC_WRITE_U16(data + 2, incomplete ? fragments_left : req->idn);
   499     EC_WRITE_U16(data + 2, incomplete ? fragments_left : req->idn);
   498     memcpy(data + 4, req->data + fsm->offset, fragment_size);
   500     memcpy(data + 4, req->data + fsm->offset, fragment_size);
   499     fsm->offset += fragment_size;
   501     fsm->offset += fragment_size;
   500 
   502 
   515 void ec_fsm_soe_write_start(ec_fsm_soe_t *fsm /**< finite state machine */)
   517 void ec_fsm_soe_write_start(ec_fsm_soe_t *fsm /**< finite state machine */)
   516 {
   518 {
   517     ec_slave_t *slave = fsm->slave;
   519     ec_slave_t *slave = fsm->slave;
   518     ec_soe_request_t *req = fsm->request;
   520     ec_soe_request_t *req = fsm->request;
   519 
   521 
   520     EC_SLAVE_DBG(slave, 1, "Writing IDN 0x%04X (%zu byte).\n",
   522     EC_SLAVE_DBG(slave, 1, "Writing IDN 0x%04X of drive %u (%zu byte).\n",
   521             req->idn, req->data_size);
   523             req->idn, req->drive_no, req->data_size);
   522 
   524 
   523     if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) {
   525     if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) {
   524         EC_SLAVE_ERR(slave, "Slave does not support SoE!\n");
   526         EC_SLAVE_ERR(slave, "Slave does not support SoE!\n");
   525         fsm->state = ec_fsm_soe_error;
   527         fsm->state = ec_fsm_soe_error;
   526         ec_fsm_soe_print_error(fsm);
   528         ec_fsm_soe_print_error(fsm);