Commit 7f1b57d8 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

[PATCH] WE-16 for Wavelan ISA driver

        This update the Wavelan ISA driver for Wireless Extension 16
(going with my previous patch).
parent 72f70c37
...@@ -1717,31 +1717,28 @@ static inline int wv_frequency_list(unsigned long ioaddr, /* I/O port of the car ...@@ -1717,31 +1717,28 @@ static inline int wv_frequency_list(unsigned long ioaddr, /* I/O port of the car
return (i); return (i);
} }
#ifdef WIRELESS_SPY #ifdef IW_WIRELESS_SPY
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* /*
* Gather wireless spy statistics: for each packet, compare the source * Gather wireless spy statistics: for each packet, compare the source
* address with our list, and if they match, get the statistics. * address with our list, and if they match, get the statistics.
* Sorry, but this function really needs the wireless extensions. * Sorry, but this function really needs the wireless extensions.
*/ */
static inline void wl_spy_gather(device * dev, u8 * mac, /* MAC address */ static inline void wl_spy_gather(device * dev,
u8 * stats) u8 * mac, /* MAC address */
{ /* Statistics to gather */ u8 * stats) /* Statistics to gather */
net_local *lp = (net_local *) dev->priv; {
int i; struct iw_quality wstats;
/* Check all addresses. */ wstats.qual = stats[2] & MMR_SGNL_QUAL;
for (i = 0; i < lp->spy_number; i++) wstats.level = stats[0] & MMR_SIGNAL_LVL;
/* If match */ wstats.noise = stats[1] & MMR_SILENCE_LVL;
if (!memcmp(mac, lp->spy_address[i], WAVELAN_ADDR_SIZE)) { wstats.updated = 0x7;
/* Update statistics */
lp->spy_stat[i].qual = stats[2] & MMR_SGNL_QUAL; /* Update spy records */
lp->spy_stat[i].level = stats[0] & MMR_SIGNAL_LVL; wireless_spy_update(dev, mac, &wstats);
lp->spy_stat[i].noise = stats[1] & MMR_SILENCE_LVL;
lp->spy_stat[i].updated = 0x7;
}
} }
#endif /* WIRELESS_SPY */ #endif /* IW_WIRELESS_SPY */
#ifdef HISTOGRAM #ifdef HISTOGRAM
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
...@@ -1767,7 +1764,7 @@ static inline void wl_his_gather(device * dev, u8 * stats) ...@@ -1767,7 +1764,7 @@ static inline void wl_his_gather(device * dev, u8 * stats)
/* Increment interval counter. */ /* Increment interval counter. */
(lp->his_sum[i])++; (lp->his_sum[i])++;
} }
#endif /* HISTOGRAM */ #endif /* HISTOGRAM */
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* /*
...@@ -2203,93 +2200,6 @@ static int wavelan_get_range(struct net_device *dev, ...@@ -2203,93 +2200,6 @@ static int wavelan_get_range(struct net_device *dev,
return ret; return ret;
} }
#ifdef WIRELESS_SPY
/*------------------------------------------------------------------*/
/*
* Wireless Handler : set spy list
*/
static int wavelan_set_spy(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
net_local *lp = (net_local *) dev->priv; /* lp is not unused */
struct sockaddr *address = (struct sockaddr *) extra;
int i;
int ret = 0;
/* Disable spy while we copy the addresses.
* As we don't disable interrupts, we need to do this */
lp->spy_number = 0;
/* Are there are addresses to copy? */
if (wrqu->data.length > 0) {
/* Copy addresses to the lp structure. */
for (i = 0; i < wrqu->data.length; i++) {
memcpy(lp->spy_address[i], address[i].sa_data,
WAVELAN_ADDR_SIZE);
}
/* Reset structure. */
memset(lp->spy_stat, 0x00, sizeof(iw_qual) * IW_MAX_SPY);
#ifdef DEBUG_IOCTL_INFO
printk(KERN_DEBUG
"SetSpy: set of new addresses is: \n");
for (i = 0; i < wrqu->data.length; i++)
printk(KERN_DEBUG
"%02X:%02X:%02X:%02X:%02X:%02X \n",
lp->spy_address[i][0],
lp->spy_address[i][1],
lp->spy_address[i][2],
lp->spy_address[i][3],
lp->spy_address[i][4],
lp->spy_address[i][5]);
#endif /* DEBUG_IOCTL_INFO */
}
/* Now we can set the number of addresses */
lp->spy_number = wrqu->data.length;
return ret;
}
/*------------------------------------------------------------------*/
/*
* Wireless Handler : get spy list
*/
static int wavelan_get_spy(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
net_local *lp = (net_local *) dev->priv; /* lp is not unused */
struct sockaddr *address = (struct sockaddr *) extra;
int i;
/* Set the number of addresses */
wrqu->data.length = lp->spy_number;
/* Copy addresses from the lp structure. */
for (i = 0; i < lp->spy_number; i++) {
memcpy(address[i].sa_data,
lp->spy_address[i],
WAVELAN_ADDR_SIZE);
address[i].sa_family = AF_UNIX;
}
/* Copy stats to the user buffer (just after). */
if(lp->spy_number > 0)
memcpy(extra + (sizeof(struct sockaddr) * lp->spy_number),
lp->spy_stat, sizeof(iw_qual) * lp->spy_number);
/* Reset updated flags. */
for (i = 0; i < lp->spy_number; i++)
lp->spy_stat[i].updated = 0x0;
return(0);
}
#endif /* WIRELESS_SPY */
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* /*
* Wireless Private Handler : set quality threshold * Wireless Private Handler : set quality threshold
...@@ -2439,15 +2349,10 @@ static const iw_handler wavelan_handler[] = ...@@ -2439,15 +2349,10 @@ static const iw_handler wavelan_handler[] =
NULL, /* SIOCGIWPRIV */ NULL, /* SIOCGIWPRIV */
NULL, /* SIOCSIWSTATS */ NULL, /* SIOCSIWSTATS */
NULL, /* SIOCGIWSTATS */ NULL, /* SIOCGIWSTATS */
#ifdef WIRELESS_SPY iw_handler_set_spy, /* SIOCSIWSPY */
wavelan_set_spy, /* SIOCSIWSPY */ iw_handler_get_spy, /* SIOCGIWSPY */
wavelan_get_spy, /* SIOCGIWSPY */ iw_handler_set_thrspy, /* SIOCSIWTHRSPY */
#else /* WIRELESS_SPY */ iw_handler_get_thrspy, /* SIOCGIWTHRSPY */
NULL, /* SIOCSIWSPY */
NULL, /* SIOCGIWSPY */
#endif /* WIRELESS_SPY */
NULL, /* -- hole -- */
NULL, /* -- hole -- */
NULL, /* SIOCSIWAP */ NULL, /* SIOCSIWAP */
NULL, /* SIOCGIWAP */ NULL, /* SIOCGIWAP */
NULL, /* -- hole -- */ NULL, /* -- hole -- */
...@@ -2501,6 +2406,8 @@ static const struct iw_handler_def wavelan_handler_def = ...@@ -2501,6 +2406,8 @@ static const struct iw_handler_def wavelan_handler_def =
.standard = (iw_handler *) wavelan_handler, .standard = (iw_handler *) wavelan_handler,
.private = (iw_handler *) wavelan_private_handler, .private = (iw_handler *) wavelan_private_handler,
.private_args = (struct iw_priv_args *) wavelan_private_args, .private_args = (struct iw_priv_args *) wavelan_private_args,
.spy_offset = ((void *) (&((net_local *) NULL)->spy_data) -
(void *) NULL),
}; };
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
...@@ -2618,22 +2525,23 @@ wv_packet_read(device * dev, u16 buf_off, int sksize) ...@@ -2618,22 +2525,23 @@ wv_packet_read(device * dev, u16 buf_off, int sksize)
#endif /* DEBUG_RX_INFO */ #endif /* DEBUG_RX_INFO */
/* Statistics-gathering and associated stuff. /* Statistics-gathering and associated stuff.
* It seem a bit messy with all the define, but it's really simple... */ * It seem a bit messy with all the define, but it's really
#if defined(WIRELESS_SPY) || defined(HISTOGRAM) * simple... */
if ( if (
#ifdef WIRELESS_SPY #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */
(lp->spy_number > 0) || (lp->spy_data.spy_number > 0) ||
#endif /* WIRELESS_SPY */ #endif /* IW_WIRELESS_SPY */
#ifdef HISTOGRAM #ifdef HISTOGRAM
(lp->his_number > 0) || (lp->his_number > 0) ||
#endif /* HISTOGRAM */ #endif /* HISTOGRAM */
0) { 0) {
u8 stats[3]; /* signal level, noise level, signal quality */ u8 stats[3]; /* signal level, noise level, signal quality */
/* Read signal level, silence level and signal quality bytes. */ /* Read signal level, silence level and signal quality bytes */
/* Note: in the PCMCIA hardware, these are part of the frame. It seems /* Note: in the PCMCIA hardware, these are part of the frame.
* that for the ISA hardware, it's nowhere to be found in the frame, * It seems that for the ISA hardware, it's nowhere to be
* so I'm obliged to do this (it has a side effect on /proc/net/wireless). * found in the frame, so I'm obliged to do this (it has a
* side effect on /proc/net/wireless).
* Any ideas? * Any ideas?
*/ */
mmc_out(ioaddr, mmwoff(0, mmw_freeze), 1); mmc_out(ioaddr, mmwoff(0, mmw_freeze), 1);
...@@ -2648,15 +2556,14 @@ wv_packet_read(device * dev, u16 buf_off, int sksize) ...@@ -2648,15 +2556,14 @@ wv_packet_read(device * dev, u16 buf_off, int sksize)
#endif #endif
/* Spying stuff */ /* Spying stuff */
#ifdef WIRELESS_SPY #ifdef IW_WIRELESS_SPY
wl_spy_gather(dev, skb->mac.raw + WAVELAN_ADDR_SIZE, wl_spy_gather(dev, skb->mac.raw + WAVELAN_ADDR_SIZE,
stats); stats);
#endif /* WIRELESS_SPY */ #endif /* IW_WIRELESS_SPY */
#ifdef HISTOGRAM #ifdef HISTOGRAM
wl_his_gather(dev, stats); wl_his_gather(dev, stats);
#endif /* HISTOGRAM */ #endif /* HISTOGRAM */
} }
#endif /* defined(WIRELESS_SPY) || defined(HISTOGRAM) */
/* /*
* Hand the packet to the network module. * Hand the packet to the network module.
......
...@@ -509,13 +509,9 @@ struct net_local ...@@ -509,13 +509,9 @@ struct net_local
#ifdef WIRELESS_EXT #ifdef WIRELESS_EXT
iw_stats wstats; /* Wireless-specific statistics */ iw_stats wstats; /* Wireless-specific statistics */
#endif
#ifdef WIRELESS_SPY struct iw_spy_data spy_data;
int spy_number; /* number of addresses to spy */ #endif
mac_addr spy_address[IW_MAX_SPY]; /* the addresses to spy */
iw_qual spy_stat[IW_MAX_SPY]; /* statistics gathered */
#endif /* WIRELESS_SPY */
#ifdef HISTOGRAM #ifdef HISTOGRAM
int his_number; /* number of intervals */ int his_number; /* number of intervals */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment