All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][RFT][PATCH] p54: implement power save management
@ 2008-12-23 15:01 Christian Lamparter
  0 siblings, 0 replies; only message in thread
From: Christian Lamparter @ 2008-12-23 15:01 UTC (permalink / raw)
  To: wireless

Since Vivek's power save patches are ready and waiting. I can finally add the
power save management for p54 as well.

---
diff -Nurp a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
--- a/drivers/net/wireless/p54/p54common.c	2008-12-21 22:42:04.000000000 +0100
+++ b/drivers/net/wireless/p54/p54common.c	2008-12-23 15:53:47.000000000 +0100
@@ -1747,6 +1747,41 @@ static int p54_set_edcf(struct ieee80211
 	return 0;
 }
 
+static int p54_powersave(struct ieee80211_hw *dev)
+{
+	struct p54_common *priv = dev->priv;
+	struct sk_buff *skb;
+	struct p54_psm *psm;
+	u16 mode = P54_PSM_OFF;
+	int i;
+
+	skb = p54_alloc_skb(dev, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*psm) +
+			sizeof(struct p54_hdr), P54_CONTROL_TYPE_PSM,
+			GFP_ATOMIC);
+	if (!skb)
+		return -ENOMEM;
+
+	if (dev->conf.flags & IEEE80211_CONF_PS)
+		mode = cpu_to_le16(P54_PSM | P54_PSM_DTIM | P54_PSM_MCBC);
+
+	psm = (struct p54_psm *)skb_put(skb, sizeof(*psm));
+	psm->aid = cpu_to_le16(priv->aid);
+	psm->mode = cpu_to_le16(mode);
+	for (i = 0; i < ARRAY_SIZE(psm->intervals); i++) {
+		psm->intervals[i].interval =
+			cpu_to_le16(dev->conf.listen_interval);
+		psm->intervals[i].periods = 1;
+	}
+
+	psm->beacon_rssi_skip_max = 60;
+	psm->rssi_delta_threshold = 0;
+	psm->nr = 0;
+
+	priv->tx(dev, skb);
+
+	return 0;
+}
+
 static int p54_beacon_tim(struct sk_buff *skb)
 {
 	/*
@@ -1939,6 +1974,11 @@ static int p54_config(struct ieee80211_h
 		if (ret)
 			goto out;
 	}
+	if (changed & IEEE80211_CONF_CHANGE_PS) {
+		ret = p54_powersave(dev);
+		if (ret)
+			goto out;
+	}
 
 out:
 	mutex_unlock(&priv->conf_mutex);
diff -Nurp a/drivers/net/wireless/p54/p54common.h b/drivers/net/wireless/p54/p54common.h
--- a/drivers/net/wireless/p54/p54common.h	2008-12-21 22:14:44.000000000 +0100
+++ b/drivers/net/wireless/p54/p54common.h	2008-12-22 17:22:16.000000000 +0100
@@ -545,6 +545,7 @@ struct p54_psm_interval {
 	__le16 periods;
 } __attribute__ ((packed));
 
+#define P54_PSM_OFF			0
 #define P54_PSM				BIT(0)
 #define P54_PSM_DTIM			BIT(1)
 #define P54_PSM_MCBC			BIT(2)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-12-23 15:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-23 15:01 [RFC][RFT][PATCH] p54: implement power save management Christian Lamparter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.