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 */