master/fsm_master.c
changeset 2094 83e9160319ec
parent 2045 ff2a13a4603c
child 2098 0ce254664c81
equal deleted inserted replaced
2093:c7e7d80e49ea 2094:83e9160319ec
   132  */
   132  */
   133 int ec_fsm_master_exec(
   133 int ec_fsm_master_exec(
   134         ec_fsm_master_t *fsm /**< Master state machine. */
   134         ec_fsm_master_t *fsm /**< Master state machine. */
   135         )
   135         )
   136 {
   136 {
   137     if (ec_mbox_is_datagram_state(fsm->mbox,EC_DATAGRAM_QUEUED)
   137     if (ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_QUEUED)
   138         || ec_mbox_is_datagram_state(fsm->mbox,EC_DATAGRAM_SENT)) {
   138         || ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_SENT)) {
   139         // datagram was not sent or received yet.
   139         // datagram was not sent or received yet.
   140         return 0;
   140         return 0;
   141     }
   141     }
       
   142 
   142     fsm->state(fsm);
   143     fsm->state(fsm);
   143     return 1;
   144     return 1;
   144 }
   145 }
   145 
   146 
   146 /*****************************************************************************/
   147 /*****************************************************************************/
   389         if (request->length > fsm->datagram->mem_size) {
   390         if (request->length > fsm->datagram->mem_size) {
   390             EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum "
   391             EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum "
   391                     "datagram size (%zu)!\n", request->length,
   392                     "datagram size (%zu)!\n", request->length,
   392                     fsm->datagram->mem_size);
   393                     fsm->datagram->mem_size);
   393             request->state = EC_INT_REQUEST_FAILURE;
   394             request->state = EC_INT_REQUEST_FAILURE;
   394             kref_put(&request->refcount,ec_master_reg_request_release);
   395             kref_put(&request->refcount, ec_master_reg_request_release);
   395             wake_up(&master->reg_queue);
   396             wake_up(&master->reg_queue);
   396             continue;
   397             continue;
   397         }
   398         }
   398 
   399 
   399         fsm->reg_request = request;
   400         fsm->reg_request = request;
   992 	   and the app_time set time */
   993 	   and the app_time set time */
   993 #ifdef EC_HAVE_CYCLES
   994 #ifdef EC_HAVE_CYCLES
   994 	correction =
   995 	correction =
   995             (datagram->cycles_sent - slave->master->dc_cycles_app_start_time)
   996             (datagram->cycles_sent - slave->master->dc_cycles_app_start_time)
   996 			* 1000000LL;
   997 			* 1000000LL;
   997 	do_div(correction,cpu_khz);
   998 	do_div(correction, cpu_khz);
   998 #else
   999 #else
   999 	correction =
  1000 	correction =
  1000 			(u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ)
  1001 			(u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ)
  1001 			* 1000000;
  1002 			* 1000000;
  1002 #endif
  1003 #endif
  1067     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1068     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1068 
  1069 
  1069     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1070     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1070         EC_SLAVE_ERR(slave, "Failed to write SII data.\n");
  1071         EC_SLAVE_ERR(slave, "Failed to write SII data.\n");
  1071         request->state = EC_INT_REQUEST_FAILURE;
  1072         request->state = EC_INT_REQUEST_FAILURE;
  1072         kref_put(&request->refcount,ec_master_sii_write_request_release);
  1073         kref_put(&request->refcount, ec_master_sii_write_request_release);
  1073         wake_up(&master->sii_queue);
  1074         wake_up(&master->sii_queue);
  1074         ec_fsm_master_restart(fsm);
  1075         ec_fsm_master_restart(fsm);
  1075         return;
  1076         return;
  1076     }
  1077     }
  1077 
  1078 
  1096         slave->effective_alias = slave->sii.alias;
  1097         slave->effective_alias = slave->sii.alias;
  1097     }
  1098     }
  1098     // TODO: Evaluate other SII contents!
  1099     // TODO: Evaluate other SII contents!
  1099 
  1100 
  1100     request->state = EC_INT_REQUEST_SUCCESS;
  1101     request->state = EC_INT_REQUEST_SUCCESS;
  1101     kref_put(&request->refcount,ec_master_sii_write_request_release);
  1102     kref_put(&request->refcount, ec_master_sii_write_request_release);
  1102     wake_up(&master->sii_queue);
  1103     wake_up(&master->sii_queue);
  1103 
  1104 
  1104     // check for another SII write request
  1105     // check for another SII write request
  1105     if (ec_fsm_master_action_process_sii(fsm))
  1106     if (ec_fsm_master_action_process_sii(fsm))
  1106         return; // processing another request
  1107         return; // processing another request
  1190     if (datagram->state != EC_DATAGRAM_RECEIVED) {
  1191     if (datagram->state != EC_DATAGRAM_RECEIVED) {
  1191         EC_MASTER_ERR(master, "Failed to receive register"
  1192         EC_MASTER_ERR(master, "Failed to receive register"
  1192                 " request datagram: ");
  1193                 " request datagram: ");
  1193         ec_datagram_print_state(datagram);
  1194         ec_datagram_print_state(datagram);
  1194         request->state = EC_INT_REQUEST_FAILURE;
  1195         request->state = EC_INT_REQUEST_FAILURE;
  1195         kref_put(&request->refcount,ec_master_reg_request_release);
  1196         kref_put(&request->refcount, ec_master_reg_request_release);
  1196         wake_up(&master->reg_queue);
  1197         wake_up(&master->reg_queue);
  1197         ec_fsm_master_restart(fsm);
  1198         ec_fsm_master_restart(fsm);
  1198         return;
  1199         return;
  1199     }
  1200     }
  1200 
  1201 
  1205             request->data = kmalloc(request->length, GFP_KERNEL);
  1206             request->data = kmalloc(request->length, GFP_KERNEL);
  1206             if (!request->data) {
  1207             if (!request->data) {
  1207                 EC_MASTER_ERR(master, "Failed to allocate %zu bytes"
  1208                 EC_MASTER_ERR(master, "Failed to allocate %zu bytes"
  1208                         " of memory for register data.\n", request->length);
  1209                         " of memory for register data.\n", request->length);
  1209                 request->state = EC_INT_REQUEST_FAILURE;
  1210                 request->state = EC_INT_REQUEST_FAILURE;
  1210                 kref_put(&request->refcount,ec_master_reg_request_release);
  1211                 kref_put(&request->refcount, ec_master_reg_request_release);
  1211                 wake_up(&master->reg_queue);
  1212                 wake_up(&master->reg_queue);
  1212                 ec_fsm_master_restart(fsm);
  1213                 ec_fsm_master_restart(fsm);
  1213                 return;
  1214                 return;
  1214             }
  1215             }
  1215             memcpy(request->data, datagram->data, request->length);
  1216             memcpy(request->data, datagram->data, request->length);
  1220     } else {
  1221     } else {
  1221         request->state = EC_INT_REQUEST_FAILURE;
  1222         request->state = EC_INT_REQUEST_FAILURE;
  1222         EC_MASTER_ERR(master, "Register request failed.\n");
  1223         EC_MASTER_ERR(master, "Register request failed.\n");
  1223     }
  1224     }
  1224 
  1225 
  1225     kref_put(&request->refcount,ec_master_reg_request_release);
  1226     kref_put(&request->refcount, ec_master_reg_request_release);
  1226     wake_up(&master->reg_queue);
  1227     wake_up(&master->reg_queue);
  1227 
  1228 
  1228     // check for another register request
  1229     // check for another register request
  1229     if (ec_fsm_master_action_process_register(fsm))
  1230     if (ec_fsm_master_action_process_register(fsm))
  1230         return; // processing another request
  1231         return; // processing another request
  1239  */
  1240  */
  1240 void ec_master_sii_write_request_release(struct kref *ref)
  1241 void ec_master_sii_write_request_release(struct kref *ref)
  1241 {
  1242 {
  1242     ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount);
  1243     ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount);
  1243     if (request->slave)
  1244     if (request->slave)
  1244         EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",request);
  1245         EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",
       
  1246                 request);
  1245     kfree(request->words);
  1247     kfree(request->words);
  1246     kfree(request);
  1248     kfree(request);
  1247 }
  1249 }
  1248 
  1250 
  1249 /*****************************************************************************/
  1251 /*****************************************************************************/
  1253  */
  1255  */
  1254 void ec_master_reg_request_release(struct kref *ref)
  1256 void ec_master_reg_request_release(struct kref *ref)
  1255 {
  1257 {
  1256     ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount);
  1258     ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount);
  1257     if (request->slave)
  1259     if (request->slave)
  1258         EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",request);
  1260         EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",
       
  1261                 request);
  1259     if (request->data)
  1262     if (request->data)
  1260         kfree(request->data);
  1263         kfree(request->data);
  1261     kfree(request);
  1264     kfree(request);
  1262 }
  1265 }
  1263 
  1266 
  1268  */
  1271  */
  1269 void ec_master_sdo_request_release(struct kref *ref)
  1272 void ec_master_sdo_request_release(struct kref *ref)
  1270 {
  1273 {
  1271     ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount);
  1274     ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount);
  1272     if (request->slave)
  1275     if (request->slave)
  1273         EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",request);
  1276         EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",
       
  1277                 request);
  1274     ec_sdo_request_clear(&request->req);
  1278     ec_sdo_request_clear(&request->req);
  1275     kfree(request);
  1279     kfree(request);
  1276 }
  1280 }
  1277 
  1281 
  1278 /*****************************************************************************/
  1282 /*****************************************************************************/
  1282  */
  1286  */
  1283 void ec_master_foe_request_release(struct kref *ref)
  1287 void ec_master_foe_request_release(struct kref *ref)
  1284 {
  1288 {
  1285     ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount);
  1289     ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount);
  1286     if (request->slave)
  1290     if (request->slave)
  1287         EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",request);
  1291         EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",
       
  1292                 request);
  1288     ec_foe_request_clear(&request->req);
  1293     ec_foe_request_clear(&request->req);
  1289     kfree(request);
  1294     kfree(request);
  1290 }
  1295 }
  1291 
  1296 
  1292 /*****************************************************************************/
  1297 /*****************************************************************************/
  1296  */
  1301  */
  1297 void ec_master_soe_request_release(struct kref *ref)
  1302 void ec_master_soe_request_release(struct kref *ref)
  1298 {
  1303 {
  1299     ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount);
  1304     ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount);
  1300     if (request->slave)
  1305     if (request->slave)
  1301         EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",request);
  1306         EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",
       
  1307                 request);
  1302     ec_soe_request_clear(&request->req);
  1308     ec_soe_request_clear(&request->req);
  1303     kfree(request);
  1309     kfree(request);
  1304 }
  1310 }