master/mailbox.c
branchstable-1.0
changeset 1621 4bbe090553f7
parent 1619 0d4119024f55
child 1624 9dc190591c0f
--- a/master/mailbox.c	Mon May 29 09:54:18 2006 +0000
+++ b/master/mailbox.c	Mon Jun 26 15:04:06 2006 +0000
@@ -52,12 +52,12 @@
    \return pointer to mailbox command data
 */
 
-uint8_t *ec_slave_mbox_prepare_send(ec_slave_t *slave, /**< slave */
+uint8_t *ec_slave_mbox_prepare_send(const ec_slave_t *slave, /**< slave */
+                                    ec_command_t *command, /**< command */
                                     uint8_t type, /**< mailbox protocol */
                                     size_t size /**< size of the data */
                                     )
 {
-    ec_command_t *command = &slave->mbox_command;
     size_t total_size;
 
     if (unlikely(!slave->sii_mailbox_protocols)) {
@@ -79,7 +79,7 @@
 
     EC_WRITE_U16(command->data,     size); // mailbox service data length
     EC_WRITE_U16(command->data + 2, slave->station_address); // station address
-    EC_WRITE_U8 (command->data + 4, 0x00); // hhannel & priority
+    EC_WRITE_U8 (command->data + 4, 0x00); // channel & priority
     EC_WRITE_U8 (command->data + 5, type); // underlying protocol type
 
     return command->data + 6;
@@ -92,10 +92,10 @@
    \return 0 in case of success, else < 0
 */
 
-int ec_slave_mbox_prepare_check(ec_slave_t *slave /**< slave */)
-{
-    ec_command_t *command = &slave->mbox_command;
-
+int ec_slave_mbox_prepare_check(const ec_slave_t *slave, /**< slave */
+                                ec_command_t *command /**< command */
+                                )
+{
     // FIXME: second sync manager?
     if (ec_command_nprd(command, slave->station_address, 0x808, 8))
         return -1;
@@ -110,9 +110,9 @@
    \return 0 in case of success, else < 0
 */
 
-int ec_slave_mbox_check(const ec_slave_t *slave /**< slave */)
-{
-    return EC_READ_U8(slave->mbox_command.data + 5) & 8 ? 1 : 0;
+int ec_slave_mbox_check(const ec_command_t *command /**< command */)
+{
+    return EC_READ_U8(command->data + 5) & 8 ? 1 : 0;
 }
 
 /*****************************************************************************/
@@ -122,10 +122,10 @@
    \return 0 in case of success, else < 0
 */
 
-int ec_slave_mbox_prepare_fetch(ec_slave_t *slave /**< slave */)
-{
-    ec_command_t *command = &slave->mbox_command;
-
+int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, /**< slave */
+                                ec_command_t *command /**< command */
+                                )
+{
     if (ec_command_nprd(command, slave->station_address,
                         slave->sii_tx_mailbox_offset,
                         slave->sii_tx_mailbox_size)) return -1;
@@ -139,12 +139,12 @@
    \return pointer to the received data
 */
 
-uint8_t *ec_slave_mbox_fetch(ec_slave_t *slave, /**< slave */
+uint8_t *ec_slave_mbox_fetch(const ec_slave_t *slave, /**< slave */
+                             ec_command_t *command, /**< command */
                              uint8_t type, /**< expected mailbox protocol */
                              size_t *size /**< size of the received data */
                              )
 {
-    ec_command_t *command = &slave->mbox_command;
     size_t data_size;
 
     if ((EC_READ_U8(command->data + 5) & 0x0F) != type) {
@@ -171,14 +171,13 @@
    \return pointer to the received data
 */
 
-uint8_t *ec_slave_mbox_simple_io(ec_slave_t *slave, /**< slave */
+uint8_t *ec_slave_mbox_simple_io(const ec_slave_t *slave, /**< slave */
+                                 ec_command_t *command, /**< command */
                                  size_t *size /**< size of the received data */
                                  )
 {
     uint8_t type;
-    ec_command_t *command;
-
-    command = &slave->mbox_command;
+
     type = EC_READ_U8(command->data + 5);
 
     if (unlikely(ec_master_simple_io(slave->master, command))) {
@@ -187,7 +186,7 @@
         return NULL;
     }
 
-    return ec_slave_mbox_simple_receive(slave, type, size);
+    return ec_slave_mbox_simple_receive(slave, command, type, size);
 }
 
 /*****************************************************************************/
@@ -197,21 +196,20 @@
    \return pointer to the received data
 */
 
-uint8_t *ec_slave_mbox_simple_receive(ec_slave_t *slave, /**< slave */
+uint8_t *ec_slave_mbox_simple_receive(const ec_slave_t *slave, /**< slave */
+                                      ec_command_t *command, /**< command */
                                       uint8_t type, /**< expected protocol */
                                       size_t *size /**< received data size */
                                       )
 {
     cycles_t start, end, timeout;
-    ec_command_t *command;
-
-    command = &slave->mbox_command;
+
     start = get_cycles();
     timeout = (cycles_t) 100 * cpu_khz; // 100ms
 
     while (1)
     {
-        if (ec_slave_mbox_prepare_check(slave)) return NULL;
+        if (ec_slave_mbox_prepare_check(slave, command)) return NULL;
         if (unlikely(ec_master_simple_io(slave->master, command))) {
             EC_ERR("Mailbox checking failed on slave %i!\n",
                    slave->ring_position);
@@ -220,7 +218,7 @@
 
         end = get_cycles();
 
-        if (ec_slave_mbox_check(slave))
+        if (ec_slave_mbox_check(command))
             break; // proceed with receiving data
 
         if ((end - start) >= timeout) {
@@ -232,7 +230,7 @@
         udelay(100);
     }
 
-    if (ec_slave_mbox_prepare_fetch(slave)) return NULL;
+    if (ec_slave_mbox_prepare_fetch(slave, command)) return NULL;
     if (unlikely(ec_master_simple_io(slave->master, command))) {
         EC_ERR("Mailbox receiving failed on slave %i!\n",
                slave->ring_position);
@@ -243,7 +241,7 @@
         EC_DBG("Mailbox receive took %ius.\n", ((u32) (end - start) * 1000
                                                 / cpu_khz));
 
-    return ec_slave_mbox_fetch(slave, type, size);
-}
-
-/*****************************************************************************/
+    return ec_slave_mbox_fetch(slave, command, type, size);
+}
+
+/*****************************************************************************/