123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- #ifndef IW_POWER_MODIFIER
- #define IW_POWER_MODIFIER 0x000F
- #define IW_POWER_MIN 0x0001
- #define IW_POWER_MAX 0x0002
- #define IW_POWER_RELATIVE 0x0004
- #endif IW_POWER_MODIFIER
- struct net_local {
- int pm_on;
- int pm_multi;
- int pm_period;
- int pm_period_auto;
- int pm_max_period;
- int pm_min_period;
- int pm_timeout;
- };
- static int ioctl_set_power(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_param *prq,
- char *extra)
- {
-
- if(prq->disabled)
- {
- local->pm_on = 0;
- }
- else
- {
-
- switch(prq->flags & IW_POWER_MODE)
- {
- case IW_POWER_UNICAST_R:
- local->pm_multi = 0;
- local->need_commit = 1;
- break;
- case IW_POWER_ALL_R:
- local->pm_multi = 1;
- local->need_commit = 1;
- break;
- case IW_POWER_ON:
- break;
- default:
- return(-EINVAL);
- }
-
- if(prq->flags & IW_POWER_PERIOD)
- {
- int period = prq->value;
- #if WIRELESS_EXT < 21
- period /= 1000000;
- #endif
-
-
- local->pm_on = 1;
- local->need_commit = 1;
-
- if(prq->flags & IW_POWER_MIN)
- {
- local->pm_min_period = period;
- local->pm_period_auto = 1;
- }
- else
-
- if(prq->flags & IW_POWER_MAX)
- {
- local->pm_max_period = period;
- local->pm_period_auto = 1;
- }
- else
- {
-
- local->pm_period = period;
- local->pm_period_auto = 0;
- }
- }
-
- if(prq->flags & IW_POWER_TIMEOUT)
- {
-
- local->pm_on = 1;
- local->need_commit = 1;
-
- local->pm_timeout = prq->value/1000;
- }
- }
- return(0);
- }
- static int ioctl_get_power(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_param *prq,
- char *extra)
- {
- prq->disabled = !local->pm_on;
-
- if(!(prq->flags & IW_POWER_TIMEOUT))
- {
- int inc_flags = prq->flags;
- prq->flags = IW_POWER_PERIOD | IW_POWER_RELATIVE;
-
- if(local->pm_period_auto)
- {
-
- if(!(inc_flags & IW_POWER_MAX))
- {
- prq->value = local->pm_min_period;
- #if WIRELESS_EXT < 21
- prq->value *= 1000000;
- #endif
- prq->flags |= IW_POWER_MIN;
- }
- else
- {
- prq->value = local->pm_max_period;
- #if WIRELESS_EXT < 21
- prq->value *= 1000000;
- #endif
- prq->flags |= IW_POWER_MAX;
- }
- }
- else
- {
-
- if(inc_flags & (IW_POWER_MIN | IW_POWER_MAX))
- return(-EINVAL);
- else
- {
- prq->value = local->pm_period;
- #if WIRELESS_EXT < 21
- prq->value *= 1000000;
- #endif
- }
- }
- }
- else
- {
-
- prq->flags = IW_POWER_TIMEOUT;
- prq->value = local->pm_timeout * 1000;
- }
- if(local->pm_multi)
- prq->flags |= IW_POWER_ALL_R;
- else
- prq->flags |= IW_POWER_UNICAST_R;
- return(0);
- }
- static int ioctl_get_range(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_point *rrq,
- char *extra)
- {
- struct iw_range *range = (struct iw_range *) extra;
- rrq->length = sizeof(struct iw_range);
- memset(range, 0, sizeof(struct iw_range));
- #if WIRELESS_EXT > 10
-
- range->we_version_compiled = WIRELESS_EXT;
-
- range->we_version_source = 8;
- #endif
- #if WIRELESS_EXT > 9
- #if WIRELESS_EXT < 21
- range.min_pmp = 1000000;
- range.max_pmp = 12000000;
- #else
- range.min_pmp = 1;
- range.max_pmp = 12;
- #endif
- range.min_pmt = 1000;
- range.max_pmt = 1000000;
- range.pmp_flags = IW_POWER_PERIOD | IW_POWER_RELATIVE |
- IW_POWER_MIN | IW_POWER_MAX;
- range.pmt_flags = IW_POWER_TIMEOUT;
- range.pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_UNICAST_R;
- #endif
- return(0);
- }
- #if WIRELESS_EXT > 12
- static const iw_handler handler_table[] =
- {
- ...
- (iw_handler) ioctl_set_power,
- (iw_handler) ioctl_get_power,
- };
- #else
- static int
- do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
- {
- struct iwreq *wrq = (struct iwreq *) ifr;
- int err = 0;
- switch (cmd)
- {
- #if WIRELESS_EXT > 8
-
- case SIOCSIWPOWER:
- err = ioctl_set_power(dev, NULL, &(wrq->u.power), NULL);
- break;
-
- case SIOCGIWPOWER:
- err = ioctl_get_power(dev, NULL, &(wrq->u.power), NULL);
- break;
- #endif
- }
- return(err);
- }
- #endif
|