[PATCH] Configurable beacon interval

Ashish Shukla ashishs at marvell.com
Thu Oct 25 23:08:22 EDT 2007


Comments below...
> ---------- Forwarded message ----------
> From: Dan Williams <dcbw at redhat.com>
> Date: Oct 25, 2007 10:29 AM
> Subject: Re: [PATCH] Configurable beacon interval
> To: Javier Cardona <javier at cozybit.com>
> Cc: devel at laptop.org
> 
> 
> On Wed, 2007-10-24 at 15:42 -0700, Javier Cardona wrote:
> > From: Brajesh Dave <brajeshd at marvell.com>
> >
> > See https://dev.laptop.org/ticket/2750#comment:12
> >
> > Requires firmware version 5.110.19.p0 or newer, available here:
> > http://dev.laptop.org/pub/firmware/libertas/
> 
> What I'd like to do with patches from now on (now that 
> Libertas is fully merged upstream) is to split out the OLPC 
> specific parts (like the
> ioctls) and channel those directly into olpc-2.6 through 
> Andres, but push the generic bits straight to linux-wireless 
> and John Linville.  I'd like to get rid of libertas-2.6 
> alltogether, and if people have individual enhancements that 
> they want to carry outside of wireless-2.6 then they should 
> get personal git repos to carry those.
> 
> So for this patch, the following file hunks should not be 
> sent upstream:
> 
> drivers/net/wireless/libertas/README
> drivers/net/wireless/libertas/ioctl.c
> drivers/net/wireless/libertas/wext.c
> drivers/net/wireless/libertas/wext.h
> 
> The rest look like great candidates for linux-wireless@ and 
> wireless-2.6.  For about 3 weeks or so we've been pushing all 
> libertas patches to linux-wireless, and I'll send a mail to 
> libertas-dev about it.
> 
> Comments below...
> 
> > Signed-off-by: Ashish Shukla <ashishs at marvell.com>
> > Signed-off-by: Javier Cardona <javier at cozybit.com>
> > ---
> >  drivers/net/wireless/libertas/README    |   20 +++++++++++
> >  drivers/net/wireless/libertas/cmd.c     |   25 ++++++++++++++
> >  drivers/net/wireless/libertas/cmdresp.c |   22 ++++++++++++
> >  drivers/net/wireless/libertas/dev.h     |    2 +
> >  drivers/net/wireless/libertas/host.h    |    2 +
> >  drivers/net/wireless/libertas/hostcmd.h |    7 ++++
> >  drivers/net/wireless/libertas/ioctl.c   |   54 
> +++++++++++++++++++++++++++++++
> >  drivers/net/wireless/libertas/join.c    |    4 ++-
> >  drivers/net/wireless/libertas/wext.c    |    1 +
> >  drivers/net/wireless/libertas/wext.h    |    1 +
> >  10 files changed, 137 insertions(+), 1 deletions(-)
> >
> > diff --git a/drivers/net/wireless/libertas/README 
> > b/drivers/net/wireless/libertas/README
> > index 34fc1ff..73f1893 100644
> > --- a/drivers/net/wireless/libertas/README
> > +++ b/drivers/net/wireless/libertas/README
> > @@ -143,6 +143,26 @@ ledgpio
> >       Note: LED0 is invalid
> >       Note: Maximum Number of LEDs are 16.
> >
> > +bcn_control
> > +     This command is used to enable disable beacons. This 
> can also be used
> > +     to set beacon interval.
> > +
> > +     Usage:
> > +             iwpriv ethX bcn_control [enable] [beacon_interval]
> > +
> > +             enable: 0 to disable beacon. 1 to enable beacon.
> > +             beacon_interval: 20 - 1000ms.
> > +
> > +     Examples:
> > +             1. iwpriv ethX bcn_control
> > +                Returns (x, y), where x if 1, indicates 
> beacon is enabled, y
> > +                beacon period.
> > +             2. iwpriv ethX bcn_control 0
> > +                Turns off beacon transmission.
> > +             3. iwpriv ethX bcn_control 1 500
> > +                Enable beacon with beacon interval 500ms.
> > +
> > +
> >  fwt_add
> >       This command is used to insert an entry into the FWT 
> table. The list of
> >       parameters must follow the following structure:
> > diff --git a/drivers/net/wireless/libertas/cmd.c 
> > b/drivers/net/wireless/libertas/cmd.c
> > index 98295e1..a2dcb74 100644
> > --- a/drivers/net/wireless/libertas/cmd.c
> > +++ b/drivers/net/wireless/libertas/cmd.c
> > @@ -901,6 +901,28 @@ static int 
> wlan_cmd_mesh_access(wlan_private * priv,
> >       return 0;
> >  }
> >
> > +static int wlan_cmd_bcn_ctrl(wlan_private * priv,
> > +                                           struct 
> cmd_ds_command *cmd,
> > +                                           u16 cmd_action) {
> > +     struct cmd_ds_802_11_beacon_control
> > +             *bcn_ctrl = &cmd->params.bcn_ctrl;
> > +     wlan_adapter *adapter = priv->adapter;
> > +
> > +     lbs_deb_enter(LBS_DEB_CMD);
> > +     cmd->size =
> > +         cpu_to_le16(sizeof(struct cmd_ds_802_11_beacon_control)
> > +                          + S_DS_GEN);
> > +     cmd->command = cpu_to_le16(CMD_802_11_BEACON_CTRL);
> > +
> > +     bcn_ctrl->action = cpu_to_le16(cmd_action);
> > +     bcn_ctrl->beacon_enable = cpu_to_le16(adapter->beacon_enable);
> > +     bcn_ctrl->beacon_period = cpu_to_le16(adapter->beacon_period);
> > +
> > +     lbs_deb_leave(LBS_DEB_CMD);
> > +     return 0;
> > +}
> > +
> >  void libertas_queue_cmd(wlan_adapter * adapter, struct 
> cmd_ctrl_node 
> > *cmdnode, u8 addtail)  {
> >       unsigned long flags;
> > @@ -1395,6 +1417,9 @@ int 
> libertas_prepare_and_send_command(wlan_private * priv,
> >                                          S_DS_GEN);
> >               ret = 0;
> >               break;
> > +     case CMD_802_11_BEACON_CTRL:
> > +             ret = wlan_cmd_bcn_ctrl(priv, cmdptr, cmd_action);
> > +             break;
> >       default:
> >               lbs_deb_host("PREP_CMD: unknown command 
> 0x%04x\n", cmd_no);
> >               ret = -1;
> > diff --git a/drivers/net/wireless/libertas/cmdresp.c 
> > b/drivers/net/wireless/libertas/cmdresp.c
> > index da72dfc..6f4039b 100644
> > --- a/drivers/net/wireless/libertas/cmdresp.c
> > +++ b/drivers/net/wireless/libertas/cmdresp.c
> > @@ -531,6 +531,24 @@ static int 
> libertas_ret_802_11_enable_rsn(wlan_private * priv,
> >       return 0;
> >  }
> >
> > +static int wlan_ret_802_11_bcn_ctrl(wlan_private * priv,
> > +                                           struct cmd_ds_command 
> > +*resp) {
> > +     struct cmd_ds_802_11_beacon_control *bcn_ctrl =
> > +         &resp->params.bcn_ctrl;
> > +     wlan_adapter *adapter = priv->adapter;
> > +
> > +     lbs_deb_enter(LBS_DEB_CMD);
> > +
> > +     if (bcn_ctrl->action == CMD_ACT_GET) {
> > +             adapter->beacon_enable =(u8) le16_to_cpu( 
> bcn_ctrl->beacon_enable);
> > +             adapter->beacon_period = le16_to_cpu( 
> bcn_ctrl->beacon_period);
> > +     }
> > +
> > +     lbs_deb_enter(LBS_DEB_CMD);
> > +     return 0;
> > +}
> > +
> >  static inline int handle_cmd_response(u16 respcmd,
> >                                     struct cmd_ds_command *resp,
> >                                     wlan_private *priv) @@ -699,6 
> > +717,10 @@ static inline int handle_cmd_response(u16 respcmd,
> >                       memcpy(adapter->cur_cmd->pdata_buf, 
> &resp->params.mesh,
> >                              sizeof(resp->params.mesh));
> >               break;
> > +     case CMD_RET(CMD_802_11_BEACON_CTRL):
> > +             ret = wlan_ret_802_11_bcn_ctrl(priv, resp);
> > +             break;
> > +
> >       default:
> >               lbs_deb_host("CMD_RESP: unknown cmd response 
> 0x%04x\n",
> >                           resp->command); diff --git 
> > a/drivers/net/wireless/libertas/dev.h 
> > b/drivers/net/wireless/libertas/dev.h
> > index 5302074..926ef29 100644
> > --- a/drivers/net/wireless/libertas/dev.h
> > +++ b/drivers/net/wireless/libertas/dev.h
> > @@ -266,6 +266,8 @@ struct _wlan_adapter {
> >       struct list_head network_free_list;
> >       struct bss_descriptor *networks;
> >
> > +     u16 beacon_period;
> > +     u8 beacon_enable;
> >       u8 adhoccreate;
> >
> >       /** capability Info used in Association, start, join */ diff 
> > --git a/drivers/net/wireless/libertas/host.h 
> > b/drivers/net/wireless/libertas/host.h
> > index 37360ba..fdd7b06 100644
> > --- a/drivers/net/wireless/libertas/host.h
> > +++ b/drivers/net/wireless/libertas/host.h
> > @@ -117,6 +117,8 @@
> >
> >  #define CMD_MESH_ACCESS               0x009b
> >
> > +#define CMD_802_11_BEACON_CTRL        0x00b0
> > +
> >  /* For the IEEE Power Save */
> >  #define CMD_SUBCMD_ENTER_PS               0x0030
> >  #define CMD_SUBCMD_EXIT_PS                0x0031
> > diff --git a/drivers/net/wireless/libertas/hostcmd.h 
> > b/drivers/net/wireless/libertas/hostcmd.h
> > index 3bee36d..9c1b560 100644
> > --- a/drivers/net/wireless/libertas/hostcmd.h
> > +++ b/drivers/net/wireless/libertas/hostcmd.h
> > @@ -332,6 +332,12 @@ struct cmd_ds_802_11_radio_control {
> >       __le16 control;
> >  };
> >
> > +struct cmd_ds_802_11_beacon_control {
> > +     __le16 action;
> > +     __le16 beacon_enable;
> > +     __le16 beacon_period;
> > +};
> > +
> >  struct cmd_ds_802_11_sleep_params {
> >       /* ACT_GET/ACT_SET */
> >       __le16 action;
> > @@ -670,6 +676,7 @@ struct cmd_ds_command {
> >               struct cmd_ds_get_tsf gettsf;
> >               struct cmd_ds_802_11_subscribe_event subscribe_event;
> >               struct cmd_ds_host_sleep sleep_config;
> > +             struct cmd_ds_802_11_beacon_control bcn_ctrl;
> >       } params;
> >  } __attribute__ ((packed));
> >
> > diff --git a/drivers/net/wireless/libertas/ioctl.c 
> > b/drivers/net/wireless/libertas/ioctl.c
> > index f87133a..8648e68 100644
> > --- a/drivers/net/wireless/libertas/ioctl.c
> > +++ b/drivers/net/wireless/libertas/ioctl.c
> > @@ -891,6 +891,57 @@ static int 
> libertas_mesh_ioctl(wlan_private * priv, struct iwreq * wrq,
> >       return ret;
> >  }
> >
> > +/**
> > + *  @brief Control Beacon transmissions
> > + *  @param priv                 A pointer to wlan_private structure
> > + *  @param wrq                       A pointer to iwreq structure
> > + *  @return                  0 --success, otherwise fail
> > + */
> > +static int libertas_bcn_ioctl(wlan_private * priv, struct 
> iwreq *wrq) 
> > +{
> > +     int ret;
> > +     wlan_adapter *adapter = priv->adapter;
> > +     int data[2];
> > +
> > +     memset(data, 0, sizeof(data));
> > +     if (!wrq->u.data.length) {
> > +             lbs_deb_ioctl("Get Beacon control\n");
> > +             ret = libertas_prepare_and_send_command(priv,
> > +                                         CMD_802_11_BEACON_CTRL,
> > +                                         CMD_ACT_GET,
> > +                                         
> CMD_OPTION_WAITFORRSP, 0, NULL);
> > +             data[0] = adapter->beacon_enable;
> > +             data[1] = adapter->beacon_period;
> > +             if (copy_to_user(wrq->u.data.pointer, data, 
> sizeof(int) * 2)) {
> > +                     lbs_deb_ioctl("Copy to user failed\n");
> > +                     return -EFAULT;
> > +             }
> > +#define GET_TWO_INT  2
> > +             wrq->u.data.length = GET_TWO_INT;
> > +     } else {
> > +             lbs_deb_ioctl("Set beacon control\n");
> > +             if (wrq->u.data.length > 2)
> > +                     return -EINVAL;
> > +             if (copy_from_user (data, wrq->u.data.pointer,
> > +                  sizeof(int) * wrq->u.data.length)) {
> > +                     lbs_deb_ioctl("Copy from user failed\n");
> > +                     return -EFAULT;
> > +             }
> > +             adapter->beacon_enable = data[0];
> > +             if (wrq->u.data.length > 1) {
> > +             if ((data[1] > MRVDRV_MAX_BEACON_INTERVAL)
> > +                 || (data[1] < MRVDRV_MIN_BEACON_INTERVAL))
> > +                     return -ENOTSUPP;
> > +             adapter->beacon_period= data[1];
> > +             }
> > +             ret = libertas_prepare_and_send_command(priv,
> > +                                         CMD_802_11_BEACON_CTRL,
> > +                                         CMD_ACT_SET,
> > +                                         
> CMD_OPTION_WAITFORRSP, 0, NULL);
> > +     }
> > +     return ret;
> > +}
> > +
> >  static int libertas_led_gpio_ioctl(wlan_private * priv, 
> struct ifreq 
> > *req)  {
> >       struct iwreq *wrq = (struct iwreq *)req; @@ -1091,6 
> +1142,9 @@ 
> > int libertas_do_ioctl(struct net_device *dev, struct ifreq 
> *req, int cmd)
> >               case LIBERTAS_LED_GPIO_CTRL:
> >                       ret = libertas_led_gpio_ioctl(priv, req);
> >                       break;
> > +             case LIBERTAS_BCN_CTRL:
> > +                     ret = libertas_bcn_ioctl(priv,wrq);
> > +                     break;
> >               }
> >               break;
> >
> > diff --git a/drivers/net/wireless/libertas/join.c 
> > b/drivers/net/wireless/libertas/join.c
> > index 4408579..5447407 100644
> > --- a/drivers/net/wireless/libertas/join.c
> > +++ b/drivers/net/wireless/libertas/join.c
> > @@ -512,7 +512,9 @@ int 
> libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
> >       /* set the BSS type */
> >       adhs->bsstype = CMD_BSS_TYPE_IBSS;
> >       adapter->mode = IW_MODE_ADHOC;
> > -     adhs->beaconperiod = cpu_to_le16(MRVDRV_BEACON_INTERVAL);
> > +     if (adapter->beacon_period == 0)
> > +             adapter->beacon_period = MRVDRV_BEACON_INTERVAL;
> > +     adhs->beaconperiod = cpu_to_le16(adapter->beacon_period);
> 
> Are you sure this is the behavior you want?  Would seem 
> better to do something like:
> 
> if (adapter->beacon_period == 0)
>     adhs->beaconperiod = cpu_to_le16(MRVDRV_BEACON_INTERVAL);
> else
>     adhs->beaconperiod = cpu_to_le16(adapter->beacon_period);
> 
> otherwise when you set the beacon interval then get it again, 
> it'll be the default interval, not what you just set.
> 
> Dan
The adapter->beacon_period is set whenever libertas_bcn_ioctl is called.
Therefore, the default beacon interval, MRVDRV_BEACON_INTERVAL, will
be used only when adapter->beacon_period is 0.

Ashish

> 
> >       /* set Physical param set */
> >  #define DS_PARA_IE_ID   3
> > diff --git a/drivers/net/wireless/libertas/wext.c 
> > b/drivers/net/wireless/libertas/wext.c
> > index 948f124..1c8128d 100644
> > --- a/drivers/net/wireless/libertas/wext.c
> > +++ b/drivers/net/wireless/libertas/wext.c
> > @@ -861,6 +861,7 @@ static const struct iw_priv_args 
> wlan_private_args[] = {
> >           { LIBERTAS_SUBCMD_MESH_GET_LINK_COSTS, 
> CHAR128_PARAM, CHAR128_PARAM, "get_link_costs"},
> >       { LIBERTAS_SET_GET_SIXTEEN_INT, INT16_PARAM, INT16_PARAM, ""},
> >           { LIBERTAS_LED_GPIO_CTRL, INT16_PARAM, INT16_PARAM, 
> > "ledgpio"},
> > +         { LIBERTAS_BCN_CTRL, INT16_PARAM, INT16_PARAM, 
> > + "bcn_control"},
> >  };
> >
> >  static struct iw_statistics *wlan_get_wireless_stats(struct 
> > net_device *dev) diff --git a/drivers/net/wireless/libertas/wext.h 
> > b/drivers/net/wireless/libertas/wext.h
> > index 7b76987..eb155aa 100644
> > --- a/drivers/net/wireless/libertas/wext.h
> > +++ b/drivers/net/wireless/libertas/wext.h
> > @@ -48,6 +48,7 @@
> >
> >  #define LIBERTAS_SET_GET_SIXTEEN_INT         (SIOCIWFIRSTPRIV + 29)
> >  #define LIBERTAS_LED_GPIO_CTRL                       5
> > +#define LIBERTAS_BCN_CTRL               6
> >
> >  /** wlan_ioctl_regrdwr */
> >  struct wlan_ioctl_regrdwr {
> 
> 
> 
> --
> Javier Cardona
> cozybit Inc.
> 



More information about the Devel mailing list