Merged in antmerlino/nuttx/mac802154_rxenable (pull request #618)

mac802154: Adds basic support for RX-ENABLE.request primitive

Approved-by: Gregory Nutt <gnutt@nuttx.org>
This commit is contained in:
Anthony Merlino 2018-03-28 15:49:34 +00:00 committed by Gregory Nutt
parent 8d5b225928
commit 62e89e0f8d
2 changed files with 123 additions and 5 deletions

View file

@ -116,6 +116,7 @@ enum mac802154_operation_e
MAC802154_OP_POLL,
MAC802154_OP_SCAN,
MAC802154_OP_AUTOEXTRACT,
MAC802154_OP_RXENABLE,
};
/* The privmac structure holds the internal state of the MAC and is the
@ -701,7 +702,6 @@ static inline void mac802154_rxdisable(FAR struct ieee802154_privmac_s *priv)
if (priv->nrxusers == 0)
{
wlinfo("Receiver disabled\n");
priv->radio->rxenable(priv->radio, true);
priv->radio->rxenable(priv->radio, false);
}
}

View file

@ -51,11 +51,51 @@
#include <string.h>
#include "mac802154.h"
#include "mac802154_internal.h"
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
/****************************************************************************
* Public MAC Functions
* Private Function Prototypes
****************************************************************************/
static void mac802154_rxenabletimeout(FAR void *arg);
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: mac802154_rxenabletimeout
*
* Description:
* Function registered with MAC timer that gets called via the work queue to
* handle a timeout for extracting the Association Response from the Coordinator.
*
****************************************************************************/
static void mac802154_rxenabletimeout(FAR void *arg)
{
FAR struct ieee802154_privmac_s *priv = (FAR struct ieee802154_privmac_s *)arg;
while(mac802154_lock(priv, true) != 0);
if (priv->curr_op != MAC802154_OP_RXENABLE)
{
mac802154_unlock(priv);
return;
}
mac802154_rxdisable(priv);
priv->curr_op = MAC802154_OP_NONE;
mac802154_givesem(&priv->opsem);
mac802154_unlock(priv)
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
@ -72,9 +112,87 @@
int mac802154_req_rxenable(MACHANDLE mac,
FAR struct ieee802154_rxenable_req_s *req)
{
#if 0
FAR struct ieee802154_privmac_s * priv =
(FAR struct ieee802154_privmac_s *)mac;
#endif
return -ENOTTY;
int ret;
/* If this is a Beacon-enabled network */
if (priv->sfspec.sforder < 15)
{
return -EINVAL;
goto errout_with_sem;
}
/* Non-beacon enabled network */
else
{
if (req->rxon_dur > 0)
{
/* Get exlusive access to the operation sempaphore. This must happen before
* getting exclusive access to the MAC struct or else there could be a lockup
* condition. This would occur if another thread is using the cmdtrans but
* needs access to the MAC in order to unlock it.
*/
ret = mac802154_takesem(&priv->opsem, true);
if (ret < 0)
{
return ret;
}
priv->curr_op = MAC802154_OP_RXENABLE;
/* Get exclusive access to the MAC */
ret = mac802154_lock(priv, true);
if (ret < 0)
{
/* Should only fail if interrupted by a signal */
wlwarn("WARNING: mac802154_takesem failed: %d\n", ret);
mac802154_givesem(&priv->opsem);
return ret;
}
mac802154_rxenable(priv);
if (req->rxon_dur != 0xFFFFFFFF)
{
mac802154_timerstart(priv, req->rxon_dur, mac802154_rxenabletimeout);
}
}
else
{
ret = mac802154_lock(priv, true);
if (ret < 0)
{
/* Should only fail if interrupted by a signal */
wlwarn("WARNING: mac802154_takesem failed: %d\n", ret);
return ret;
}
if (priv->curr_op != MAC802154_OP_RXENABLE)
{
ret = -EINVAL;
goto errout_with_sem;
}
mac802154_timercancel(priv);
mac802154_rxdisable(priv);
priv->curr_op = MAC802154_OP_NONE;
mac802154_givesem(&priv->opsem);
}
}
mac802154_unlock(priv)
return OK;
errout_with_sem:
mac802154_unlock(priv)
return ret;
}