summaryrefslogtreecommitdiff
path: root/cesar/hal/phy/maximus
diff options
context:
space:
mode:
authorburet2010-07-23 14:02:46 +0000
committerburet2010-07-23 14:02:46 +0000
commit6a52dfd30053947acf511227e290154bcc45d41a (patch)
tree469ced2502f13340611f1e4f8f1547d24b5cbfc4 /cesar/hal/phy/maximus
parentee8a8c512fd34dd73d97cd3c4841dab0444a36ae (diff)
cesar/hal/phy/maximus: distinguish cases for FC and MPDU reception, closes #1781
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@7309 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/hal/phy/maximus')
-rw-r--r--cesar/hal/phy/maximus/inc/maximus_phy_ctx.h15
-rw-r--r--cesar/hal/phy/maximus/src/maximus_phy_ctrl.c28
-rw-r--r--cesar/hal/phy/maximus/src/maximus_phy_ctrl_cb.c13
-rw-r--r--cesar/hal/phy/maximus/test/src/test_pbdma.c2
-rw-r--r--cesar/hal/phy/maximus/test/src/test_phy_ctrl.c17
5 files changed, 49 insertions, 26 deletions
diff --git a/cesar/hal/phy/maximus/inc/maximus_phy_ctx.h b/cesar/hal/phy/maximus/inc/maximus_phy_ctx.h
index 5ef700cf44..aacd155746 100644
--- a/cesar/hal/phy/maximus/inc/maximus_phy_ctx.h
+++ b/cesar/hal/phy/maximus/inc/maximus_phy_ctx.h
@@ -30,13 +30,14 @@
/** Phy access medium state enum for Maximus */
enum maximus_phy_medium_state_t
{
- MAXIMUS_PHY_MEDIUM_IDLE = 0x00,
- MAXIMUS_PHY_MEDIUM_PRS0 = 0x01,
- MAXIMUS_PHY_MEDIUM_PRS1 = 0x02,
- MAXIMUS_PHY_MEDIUM_CW = 0x03,
- MAXIMUS_PHY_MEDIUM_WAIT_CONF = 0x04,
- MAXIMUS_PHY_MEDIUM_BUSY_RX = 0x05,
- MAXIMUS_PHY_MEDIUM_BUSY_TX = 0x06,
+ MAXIMUS_PHY_MEDIUM_IDLE = 0x00,
+ MAXIMUS_PHY_MEDIUM_PRS0 = 0x01,
+ MAXIMUS_PHY_MEDIUM_PRS1 = 0x02,
+ MAXIMUS_PHY_MEDIUM_CW = 0x03,
+ MAXIMUS_PHY_MEDIUM_WAIT_CONF = 0x04,
+ MAXIMUS_PHY_MEDIUM_BUSY_RX_FC = 0x05,
+ MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU = 0x06,
+ MAXIMUS_PHY_MEDIUM_BUSY_TX = 0x07,
MAXIMUS_PHY_MEDIUM_STATE_NB
};
typedef enum maximus_phy_medium_state_t maximus_phy_medium_state_t;
diff --git a/cesar/hal/phy/maximus/src/maximus_phy_ctrl.c b/cesar/hal/phy/maximus/src/maximus_phy_ctrl.c
index 79466a080b..eba778149a 100644
--- a/cesar/hal/phy/maximus/src/maximus_phy_ctrl.c
+++ b/cesar/hal/phy/maximus/src/maximus_phy_ctrl.c
@@ -181,9 +181,12 @@ maximus_phy_get_medium_state(phy_t *ctx)
strcpy(medium_state, "MAXIMUS_PHY_MEDIUM_WAIT_CONF");
break;
case 5:
- strcpy(medium_state, "MAXIMUS_PHY_MEDIUM_BUSY_RX");
+ strcpy(medium_state, "MAXIMUS_PHY_MEDIUM_BUSY_RX_FC");
break;
case 6:
+ strcpy(medium_state, "MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU");
+ break;
+ case 7:
strcpy(medium_state, "MAXIMUS_PHY_MEDIUM_BUSY_TX");
break;
default:
@@ -558,7 +561,8 @@ maximus_phy_recv_preamble (phy_t *ctx, sci_msg_t *msg)
if (ctx->control.pre_detection // PRE detection is set in 'phy_rx_activate' or 'maximus_phy_rx_activate_cb',
// and in 'maximus_phy_access_prp_result_cb' when the medium state becomes CW.
// PRE detection is deactivated in 'maximus_phy_recv_preamble_cb' and in 'maximus_phy_tx_frame_cb'.
- && (MAXIMUS_PHY_MEDIUM_BUSY_RX != ctx->access.medium_state)
+ && (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC != ctx->access.medium_state)
+ && (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU != ctx->access.medium_state)
&& (MAXIMUS_PHY_MEDIUM_BUSY_TX != ctx->access.medium_state)
&& (MAXIMUS_PHY_MEDIUM_WAIT_CONF != ctx->access.medium_state)
&& (0 == ctx->control.rx_param.recv_preamble_netclock_id))
@@ -613,7 +617,8 @@ maximus_phy_recv_preamble (phy_t *ctx, sci_msg_t *msg)
ret = 0;
}
}
- else if ( (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ else if ( (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
+ || (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU == ctx->access.medium_state)
|| (MAXIMUS_PHY_MEDIUM_BUSY_TX == ctx->access.medium_state) )
{
station_log(&my_station, STATION_LOG_WARNING, STATION_LOGTYPE_PHY,
@@ -656,7 +661,7 @@ maximus_phy_recv_fc_hybrid_mode (phy_t *ctx, sci_msg_t *msg)
}
else
{
- if (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ if (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
{
memcpy(&ctx->control.rx_param.fc_10, msg->data_begin, 4);
if (4 != sci_msg_pop(msg, 4))
@@ -673,7 +678,7 @@ maximus_phy_recv_fc_hybrid_mode (phy_t *ctx, sci_msg_t *msg)
else if (ctx->warning_assert)
{
station_log(&my_station, STATION_LOG_WARNING, STATION_LOGTYPE_PHY,
- "%s: recv a FC 1.0 but does not process it because medium state is not RX", __FUNCTION__);
+ "%s: recv a FC 1.0 but does not process it because medium state is not RX_FC", __FUNCTION__);
}
else
{
@@ -709,7 +714,7 @@ maximus_phy_recv_fc_av_only_mode (phy_t *ctx, sci_msg_t *msg)
}
else
{
- if (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ if (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
{
u32 pre_duration = MAC_PREAMBLE_TCK; // in AV mode
u32 fc_duration = MAC_FC_AV_TCK; // in AV mode on 1 symbol
@@ -753,6 +758,9 @@ maximus_phy_recv_fc_av_only_mode (phy_t *ctx, sci_msg_t *msg)
ctx->control.rx_fc_param.fc_av = ctx->control.rx_param.fc_av;
}
+ // update medium state
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU;
+
// check that there is no RX collision
if (!ctx->control.rx_collision)
{
@@ -815,7 +823,7 @@ maximus_phy_recv_fc_av_only_mode (phy_t *ctx, sci_msg_t *msg)
else if (ctx->warning_assert)
{
station_log(&my_station, STATION_LOG_WARNING, STATION_LOGTYPE_PHY,
- "%s: recv a FC AV but does not process it because medium state is not RX", __FUNCTION__);
+ "%s: recv a FC AV but does not process it because medium state is not RX_FC", __FUNCTION__);
}
else
{
@@ -962,9 +970,9 @@ maximus_phy_recv_mpdu_payload (phy_t *ctx, sci_msg_t *msg)
}
else if ( (ctx->control.rx_prepared) && (!ctx->control.rx_param.short_ppdu) )
{
- dbg_assert_print((MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state),
- "receive MPDU payload but PHY is not in BUSY_RX state");
- if (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ dbg_assert_print((MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU == ctx->access.medium_state),
+ "receive MPDU payload but PHY is not in BUSY_RX_MPDU state");
+ if (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU == ctx->access.medium_state)
{
// check transmission ID and station ID of the received mpdu
dbg_assert(ctx->control.rx_param.src_tx_id == ntohs(msg->hdr.phy->tx_id));
diff --git a/cesar/hal/phy/maximus/src/maximus_phy_ctrl_cb.c b/cesar/hal/phy/maximus/src/maximus_phy_ctrl_cb.c
index 3891f81192..bb4f86e638 100644
--- a/cesar/hal/phy/maximus/src/maximus_phy_ctrl_cb.c
+++ b/cesar/hal/phy/maximus/src/maximus_phy_ctrl_cb.c
@@ -64,7 +64,8 @@ maximus_phy_recv_preamble_cb (void *data)
if (ctx->control.pre_detection // PRE detection is set in 'phy_rx_activate' or 'maximus_phy_rx_activate_cb',
// and in 'maximus_phy_access_prp_result_cb' when the medium state becomes CW.
// PRE detection is deactivated here and in 'maximus_phy_tx_frame_cb'.
- && (MAXIMUS_PHY_MEDIUM_BUSY_RX != ctx->access.medium_state)
+ && (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC != ctx->access.medium_state)
+ && (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU != ctx->access.medium_state)
&& (MAXIMUS_PHY_MEDIUM_BUSY_TX != ctx->access.medium_state))
{
if (recv_preamble_data->wrong_preamble)
@@ -90,7 +91,7 @@ maximus_phy_recv_preamble_cb (void *data)
MAXIMUS_PHY_TRACE (M_PRE_CONFIRM, my_station.current_tick_tck);
// update medium state
- ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX;
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_FC;
// deactivate preamble detection
ctx->control.pre_detection = false;
@@ -169,7 +170,8 @@ maximus_phy_tx_frame_cb (void *data)
{
dbg_assert((MAXIMUS_PHY_MEDIUM_IDLE == ctx->access.medium_state)
|| (MAXIMUS_PHY_MEDIUM_CW == ctx->access.medium_state)
- || (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ || (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
+ || (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU == ctx->access.medium_state)
|| (MAXIMUS_PHY_MEDIUM_WAIT_CONF == ctx->access.medium_state));
if ((MAXIMUS_PHY_MEDIUM_IDLE == ctx->access.medium_state)
|| (MAXIMUS_PHY_MEDIUM_CW == ctx->access.medium_state))
@@ -249,10 +251,11 @@ maximus_phy_tx_frame_cb (void *data)
}
}
}
- else if (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ else if ((MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
+ || (MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU == ctx->access.medium_state))
{
station_log(&my_station, STATION_LOG_INFO, STATION_LOGTYPE_PHY,
- "%s: does not transmit the frame because medium state is BUSY_RX", __FUNCTION__);
+ "%s: does not transmit the frame because medium state is BUSY_RX_FC or BUSY_RX_MPDU", __FUNCTION__);
}
else if (MAXIMUS_PHY_MEDIUM_WAIT_CONF == ctx->access.medium_state)
{
diff --git a/cesar/hal/phy/maximus/test/src/test_pbdma.c b/cesar/hal/phy/maximus/test/src/test_pbdma.c
index d57217425a..e99a9c9374 100644
--- a/cesar/hal/phy/maximus/test/src/test_pbdma.c
+++ b/cesar/hal/phy/maximus/test/src/test_pbdma.c
@@ -163,7 +163,7 @@ void phy_pbdma_get_tail_test_case(test_t t)
ctx->pbdma.current_pb = &ctx->pbdma.first_pb->pb_rx;
// set MPDU reception conditions
- ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX;
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU;
ctx->control.rx_prepared = true;
// fill in the SCI data with an MPDU composed of 3 PBs
diff --git a/cesar/hal/phy/maximus/test/src/test_phy_ctrl.c b/cesar/hal/phy/maximus/test/src/test_phy_ctrl.c
index 13db24990c..626ad6f86f 100644
--- a/cesar/hal/phy/maximus/test/src/test_phy_ctrl.c
+++ b/cesar/hal/phy/maximus/test/src/test_phy_ctrl.c
@@ -423,6 +423,11 @@ void maximus_phy_recv_test_case(test_t t)
ctx->control.rx_param.fc_mode = PHY_FC_MODE_AV_2;
}
// AV Frame Control (16 octets)
+ if (PHY_TYPE_FC_AV_ONLY_MODE == phy_hdr.type)
+ {
+ // set medium state
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_FC;
+ }
if ((PHY_TYPE_FC_HYBRID_MODE == phy_hdr.type)
|| (PHY_TYPE_FC_AV_ONLY_MODE == phy_hdr.type))
{
@@ -456,7 +461,7 @@ void maximus_phy_recv_test_case(test_t t)
if (PHY_TYPE_MPDU_PAYLOAD == phy_hdr.type)
{
// set medium state
- ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX;
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU;
// indicate that RX has been prepared
ctx->control.rx_prepared = true;
// set mpdu format
@@ -853,7 +858,7 @@ void maximus_phy_recv_test_case(test_t t)
ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_WAIT_CONF;
maximus_phy_recv_preamble_cb((void *)&preamble_data);
test_fail_unless ((EINVAL != errno)
- && (MAXIMUS_PHY_MEDIUM_BUSY_RX == ctx->access.medium_state)
+ && (MAXIMUS_PHY_MEDIUM_BUSY_RX_FC == ctx->access.medium_state)
&& !ctx->control.pre_detection
&& (ctx->control.rx_param.src_tx_id == preamble_data.src_tx_id)
&& (ctx->control.rx_param.src_station_id == preamble_data.src_station_id));
@@ -885,6 +890,9 @@ void maximus_phy_recv_test_case(test_t t)
&& (ENOSPC != errno));
memcpy(msg.data_begin, &phy_hdr, sizeof(phy_msg_hdr_t));
+ // set medium state
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_FC;
+
test_fail_unless ((0 <= (maximus_phy_recv(&msg, ctx)))
&& (EINVAL != errno)
&& (EPROTO != errno));
@@ -924,6 +932,9 @@ void maximus_phy_recv_test_case(test_t t)
&& (ENOSPC != errno));
memcpy(msg.data_begin, &phy_hdr, sizeof(phy_msg_hdr_t));
+ // set medium state
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_FC;
+
test_fail_unless ((0 <= (maximus_phy_recv(&msg, ctx)))
&& (EINVAL != errno)
&& (EPROTO != errno));
@@ -1092,7 +1103,7 @@ void maximus_phy_recv_mpdu_payload_sound_test_case(test_t t)
ctx->control.rx_param.fc_mode = phy_hdr.fc_mode;
ctx->control.rx_param.short_ppdu = false;
// set medium state
- ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX;
+ ctx->access.medium_state = MAXIMUS_PHY_MEDIUM_BUSY_RX_MPDU;
// indicate that RX has been prepared
ctx->control.rx_prepared = true;