p54: implement set_coverage_class
authorChristian Lamparter <chunkeey@googlemail.com>
Thu, 24 Feb 2011 13:12:20 +0000 (14:12 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 25 Feb 2011 20:32:33 +0000 (15:32 -0500)
The callback sets slot time as specified in IEEE 802.11-2007
section 17.3.8.6 and raises round trip delay accordingly.

Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/p54/fwio.c
drivers/net/wireless/p54/main.c
drivers/net/wireless/p54/p54.h

index 0d3d108f6fe2368af5cd0a042948558e348419af..2fab7d20ffc2621bed540373ca05468c8c0669af 100644 (file)
@@ -559,6 +559,7 @@ int p54_set_edcf(struct p54_common *priv)
 {
        struct sk_buff *skb;
        struct p54_edcf *edcf;
+       u8 rtd;
 
        skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*edcf),
                            P54_CONTROL_TYPE_DCFINIT, GFP_ATOMIC);
@@ -575,9 +576,15 @@ int p54_set_edcf(struct p54_common *priv)
                edcf->sifs = 0x0a;
                edcf->eofpad = 0x06;
        }
+       /*
+        * calculate the extra round trip delay according to the
+        * formula from 802.11-2007 17.3.8.6.
+        */
+       rtd = 3 * priv->coverage_class;
+       edcf->slottime += rtd;
+       edcf->round_trip_delay = cpu_to_le16(rtd);
        /* (see prism54/isl_oid.h for further details) */
        edcf->frameburst = cpu_to_le16(0);
-       edcf->round_trip_delay = cpu_to_le16(0);
        edcf->flags = 0;
        memset(edcf->mapping, 0, sizeof(edcf->mapping));
        memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue));
index e14a05bbc485720fc8a2509b405c335770c832db..d7a92af24dd570d1da89eb78455b902d81240fab 100644 (file)
@@ -566,6 +566,17 @@ static void p54_flush(struct ieee80211_hw *dev, bool drop)
        WARN(total, "tx flush timeout, unresponsive firmware");
 }
 
+static void p54_set_coverage_class(struct ieee80211_hw *dev, u8 coverage_class)
+{
+       struct p54_common *priv = dev->priv;
+
+       mutex_lock(&priv->conf_mutex);
+       /* support all coverage class values as in 802.11-2007 Table 7-27 */
+       priv->coverage_class = clamp_t(u8, coverage_class, 0, 31);
+       p54_set_edcf(priv);
+       mutex_unlock(&priv->conf_mutex);
+}
+
 static const struct ieee80211_ops p54_ops = {
        .tx                     = p54_tx_80211,
        .start                  = p54_start,
@@ -584,6 +595,7 @@ static const struct ieee80211_ops p54_ops = {
        .conf_tx                = p54_conf_tx,
        .get_stats              = p54_get_stats,
        .get_survey             = p54_get_survey,
+       .set_coverage_class     = p54_set_coverage_class,
 };
 
 struct ieee80211_hw *p54_init_common(size_t priv_data_len)
index f951c8f31863c813cae58ed0f93fcfe12d4c2bd7..50730fc23fe57ba8c0cb6e849690a66859ae3c44 100644 (file)
@@ -217,6 +217,7 @@ struct p54_common {
        u32 tsf_low32, tsf_high32;
        u32 basic_rate_mask;
        u16 aid;
+       u8 coverage_class;
        bool powersave_override;
        __le32 beacon_req_id;
        struct completion beacon_comp;