diff options
author | Michael Brown <mcb30@etherboot.org> | 2008-11-08 04:36:42 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2008-11-08 04:36:42 +0000 |
commit | 43aa69d7b3035a1ed3897a0435dada96526be67b (patch) | |
tree | 6b58beb254c636f2ae933ebedca37a97dcd913ef | |
parent | ed196a3ed26cc9aaa034a6451ee1c789c93dfb68 (diff) | |
download | ipxe-43aa69d7b3035a1ed3897a0435dada96526be67b.tar.gz |
[aoe] Start retry timer before potential temporary transmission failure
The retry timer needs to be running as soon as we know that we are
trying to transmit a command. If transmission fails because of a
temporary error condition, then the timer will allow us to retry the
transmission later.
-rw-r--r-- | src/net/aoe.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/net/aoe.c b/src/net/aoe.c index e3f84e5ae..ec3814bf5 100644 --- a/src/net/aoe.c +++ b/src/net/aoe.c @@ -94,6 +94,13 @@ static int aoe_send_command ( struct aoe_session *aoe ) { return -ENETUNREACH; } + /* If we are transmitting anything that requires a response, + * start the retransmission timer. Do this before attempting + * to allocate the I/O buffer, in case allocation itself + * fails. + */ + start_timer ( &aoe->timer ); + /* Calculate count and data_out_len for this subcommand */ count = command->cb.count.native; if ( count > AOE_MAX_COUNT ) @@ -101,8 +108,8 @@ static int aoe_send_command ( struct aoe_session *aoe ) { data_out_len = ( command->data_out ? ( count * ATA_SECTOR_SIZE ) : 0 ); /* Create outgoing I/O buffer */ - iobuf = alloc_iob ( ETH_HLEN + sizeof ( *aoehdr ) + sizeof ( *aoecmd ) + - data_out_len ); + iobuf = alloc_iob ( ETH_HLEN + sizeof ( *aoehdr ) + + sizeof ( *aoecmd ) + data_out_len ); if ( ! iobuf ) return -ENOMEM; iob_reserve ( iobuf, ETH_HLEN ); @@ -133,7 +140,6 @@ static int aoe_send_command ( struct aoe_session *aoe ) { aoe->command_offset, data_out_len ); /* Send packet */ - start_timer ( &aoe->timer ); return net_tx ( iobuf, aoe->netdev, &aoe_protocol, aoe->target ); } @@ -231,7 +237,8 @@ static int aoe_rx_response ( struct aoe_session *aoe, struct aoehdr *aoehdr, * @ret rc Return status code * */ -static int aoe_rx ( struct io_buffer *iobuf, struct net_device *netdev __unused, +static int aoe_rx ( struct io_buffer *iobuf, + struct net_device *netdev __unused, const void *ll_source ) { struct aoehdr *aoehdr = iobuf->data; unsigned int len = iob_len ( iobuf ); |