diff -r 56993027a2d0 -r 42fbd117c3e3 master/ethernet.c --- a/master/ethernet.c Fri Jul 08 14:28:07 2011 +0200 +++ b/master/ethernet.c Fri Jul 08 15:31:46 2011 +0200 @@ -111,6 +111,7 @@ eoe->slave = slave; ec_datagram_init(&eoe->datagram); + ec_mbox_init(&eoe->mbox,&eoe->datagram); eoe->queue_datagram = 0; eoe->state = ec_eoe_state_rx_start; eoe->opened = 0; @@ -122,7 +123,7 @@ eoe->tx_queue_size = EC_EOE_TX_QUEUE_SIZE; eoe->tx_queued_frames = 0; - sema_init(&eoe->tx_queue_sem, 1); + ec_mutex_init(&eoe->tx_queue_mutex); eoe->tx_frame_number = 0xFF; memset(&eoe->stats, 0, sizeof(struct net_device_stats)); @@ -220,6 +221,7 @@ free_netdev(eoe->dev); + ec_mbox_clear(&eoe->mbox); ec_datagram_clear(&eoe->datagram); } @@ -231,7 +233,7 @@ { ec_eoe_frame_t *frame, *next; - down(&eoe->tx_queue_sem); + ec_mutex_lock(&eoe->tx_queue_mutex); list_for_each_entry_safe(frame, next, &eoe->tx_queue, queue) { list_del(&frame->queue); @@ -240,7 +242,7 @@ } eoe->tx_queued_frames = 0; - up(&eoe->tx_queue_sem); + ec_mutex_unlock(&eoe->tx_queue_mutex); } /*****************************************************************************/ @@ -294,7 +296,7 @@ printk("\n"); #endif - data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->datagram, + data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->mbox, 0x02, current_size + 4); if (IS_ERR(data)) return PTR_ERR(data); @@ -323,7 +325,9 @@ return; // if the datagram was not sent, or is not yet received, skip this cycle - if (eoe->queue_datagram || eoe->datagram.state == EC_DATAGRAM_SENT) + if (eoe->queue_datagram || + ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_QUEUED) || + ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_SENT)) return; // call state function @@ -348,7 +352,7 @@ void ec_eoe_queue(ec_eoe_t *eoe /**< EoE handler */) { if (eoe->queue_datagram) { - ec_master_queue_datagram_ext(eoe->slave->master, &eoe->datagram); + ec_master_mbox_queue_datagrams(eoe->slave->master, &eoe->mbox); eoe->queue_datagram = 0; } } @@ -394,7 +398,7 @@ return; } - ec_slave_mbox_prepare_check(eoe->slave, &eoe->datagram); + ec_slave_mbox_prepare_check(eoe->slave, &eoe->mbox); eoe->queue_datagram = 1; eoe->state = ec_eoe_state_rx_check; } @@ -408,7 +412,7 @@ */ void ec_eoe_state_rx_check(ec_eoe_t *eoe /**< EoE handler */) { - if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { + if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { eoe->stats.rx_errors++; #if EOE_DEBUG_LEVEL >= 1 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" @@ -418,14 +422,14 @@ return; } - if (!ec_slave_mbox_check(&eoe->datagram)) { + if (!ec_slave_mbox_check(&eoe->mbox)) { eoe->rx_idle = 1; eoe->state = ec_eoe_state_tx_start; return; } eoe->rx_idle = 0; - ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->datagram); + ec_slave_mbox_prepare_fetch(eoe->slave, &eoe->mbox); eoe->queue_datagram = 1; eoe->state = ec_eoe_state_rx_fetch; } @@ -447,7 +451,7 @@ unsigned int i; #endif - if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { + if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { eoe->stats.rx_errors++; #if EOE_DEBUG_LEVEL >= 1 EC_SLAVE_WARN(eoe->slave, "Failed to receive mbox" @@ -457,7 +461,7 @@ return; } - data = ec_slave_mbox_fetch(eoe->slave, &eoe->datagram, + data = ec_slave_mbox_fetch(eoe->slave, &eoe->mbox, &mbox_prot, &rec_size); if (IS_ERR(data)) { eoe->stats.rx_errors++; @@ -620,10 +624,10 @@ return; } - down(&eoe->tx_queue_sem); + ec_mutex_lock(&eoe->tx_queue_mutex); if (!eoe->tx_queued_frames || list_empty(&eoe->tx_queue)) { - up(&eoe->tx_queue_sem); + ec_mutex_unlock(&eoe->tx_queue_mutex); eoe->tx_idle = 1; // no data available. // start a new receive immediately. @@ -644,7 +648,7 @@ } eoe->tx_queued_frames--; - up(&eoe->tx_queue_sem); + ec_mutex_unlock(&eoe->tx_queue_mutex); eoe->tx_idle = 0; @@ -684,7 +688,7 @@ */ void ec_eoe_state_tx_sent(ec_eoe_t *eoe /**< EoE handler */) { - if (eoe->datagram.state != EC_DATAGRAM_RECEIVED) { + if (!ec_mbox_is_datagram_state(&eoe->mbox,EC_DATAGRAM_RECEIVED)) { if (eoe->tries) { eoe->tries--; // try again eoe->queue_datagram = 1; @@ -700,7 +704,7 @@ return; } - if (eoe->datagram.working_counter != 1) { + if (!ec_mbox_is_datagram_wc(&eoe->mbox,1)) { if (eoe->tries) { eoe->tries--; // try again eoe->queue_datagram = 1; @@ -812,14 +816,14 @@ frame->skb = skb; - down(&eoe->tx_queue_sem); + ec_mutex_lock(&eoe->tx_queue_mutex); list_add_tail(&frame->queue, &eoe->tx_queue); eoe->tx_queued_frames++; if (eoe->tx_queued_frames == eoe->tx_queue_size) { netif_stop_queue(dev); eoe->tx_queue_active = 0; } - up(&eoe->tx_queue_sem); + ec_mutex_unlock(&eoe->tx_queue_mutex); #if EOE_DEBUG_LEVEL >= 2 EC_SLAVE_DBG(eoe->slave, 0, "EoE %s TX queued frame"