Index: hostap/driver/modules/prism2.c
diff -u hostap/driver/modules/prism2.c:1.86 hostap/driver/modules/prism2.c:1.88
--- hostap/driver/modules/prism2.c:1.86	Wed Mar 27 13:42:30 2002
+++ hostap/driver/modules/prism2.c	Fri Mar 29 00:09:49 2002
@@ -2880,18 +2880,24 @@
 
 	if (rrq->disabled) {
 		if (local->txpower_type != PRISM2_TXPOWER_OFF) {
-			printk(KERN_DEBUG "Turning radio off "
-			       "(not yet implemented)\n");
-			/* TODO: turn the radio power off */
+			val = 0xff; /* use all standby and sleep modes */
+			ret = hfa384x_cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+					  HFA386X_CR_A_D_TEST_MODES2,
+					  &val, NULL);
+			printk(KERN_DEBUG "%s: Turning radio off: %s\n",
+			       dev->name, ret ? "failed" : "OK");
 			local->txpower_type = PRISM2_TXPOWER_OFF;
 		}
-		return 0;
+		return (ret ? -EOPNOTSUPP : 0);
 	}
 
 	if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-		printk(KERN_DEBUG "Turning radio on "
-		       "(not yet implemented)\n");
-		/* TODO: turn the radio power on */
+		val = 0; /* disable all standby and sleep modes */
+		ret = hfa384x_cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+				  HFA386X_CR_A_D_TEST_MODES2, &val, NULL);
+		printk(KERN_DEBUG "%s: Turning radio on: %s\n",
+		       dev->name, ret ? "failed" : "OK");
+		local->txpower_type = PRISM2_TXPOWER_UNKNOWN;
 	}
 
 	if (!rrq->fixed && local->txpower_type != PRISM2_TXPOWER_AUTO) {
@@ -2995,6 +3001,8 @@
 		    IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "alc" }
 		, { SIOCDEVPRIVATE + 10,
 		    IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "txpower" }
+		, { SIOCDEVPRIVATE + 11,
+		    IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "writemif" }
 	};
 
 	if (!data->pointer ||
@@ -3045,6 +3053,19 @@
 }
 
 
+static int prism2_ioctl_priv_writemif(struct net_device *dev, int *i)
+{
+	u16 cr, val;
+
+	cr = *i;
+	val = *(i + 1);
+	if (hfa384x_cmd(dev, HFA384X_CMDCODE_WRITEMIF, cr, &val, NULL))
+		return -EOPNOTSUPP;
+
+	return 0;
+}
+
+
 static int prism2_ioctl_priv_beacon_int(struct net_device *dev, int *i)
 {
 	u16 val;
@@ -3425,6 +3446,12 @@
 	case SIOCDEVPRIVATE + 10:
 		if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
 		else ret = prism2_ioctl_priv_txpower(dev, (int *) wrq->u.name);
+		break;
+
+	case SIOCDEVPRIVATE + 11:
+		if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
+		else ret = prism2_ioctl_priv_writemif(dev,
+						      (int *) wrq->u.name);
 		break;
 
 
Index: hostap/driver/modules/prism2_wlan.h
diff -u hostap/driver/modules/prism2_wlan.h:1.35 hostap/driver/modules/prism2_wlan.h:1.36
--- hostap/driver/modules/prism2_wlan.h:1.35	Tue Mar 26 18:19:33 2002
+++ hostap/driver/modules/prism2_wlan.h	Fri Mar 29 00:09:49 2002
@@ -422,6 +422,7 @@
 #define HFA384X_TX_STATUS_FORMERR BIT(3)
 
 /* HFA3861/3863 (BBP) Control Registers */
+#define HFA386X_CR_A_D_TEST_MODES2 0x1A
 #define HFA386X_CR_MANUAL_TX_POWER 0x3E
 
 /* IEEE 802.11 defines */
@@ -586,7 +587,7 @@
 
 	enum {
 		PRISM2_TXPOWER_AUTO = 0, PRISM2_TXPOWER_OFF,
-		PRISM2_TXPOWER_FIXED
+		PRISM2_TXPOWER_FIXED, PRISM2_TXPOWER_UNKNOWN
 	} txpower_type;
 	int txpower; /* if txpower_type == PRISM2_TXPOWER_FIXED */
 

