Fixes ipw2100 and ipw2200 after changes in frame receiving. Signed-off-by: Jiri Benc Signed-off-by: Jirka Bohac Index: netdev/drivers/net/wireless/ipw2200.c =================================================================== --- netdev.orig/drivers/net/wireless/ipw2200.c 2005-09-17 15:13:01.000000000 +0200 +++ netdev/drivers/net/wireless/ipw2200.c 2005-09-17 15:20:43.000000000 +0200 @@ -4311,7 +4311,7 @@ static int ipw_best_network(struct ipw_p /* If the old network rate is better than this one, don't bother * testing everything else. */ - if (match->network && match->network->stats.rssi > network->stats.rssi) { + if (match->network && match->network->signal < network->signal) { char escaped[IW_ESSID_MAX_SIZE * 2 + 1]; strncpy(escaped, escape_essid(network->ssid, network->ssid_len), @@ -4453,7 +4453,7 @@ static void ipw_adhoc_create(struct ipw_ ipw_create_bssid(priv, network->bssid); network->ssid_len = priv->essid_len; memcpy(network->ssid, priv->essid, priv->essid_len); - memset(&network->stats, 0, sizeof(network->stats)); + network->signal = 0; network->capability = WLAN_CAPABILITY_IBSS; if (priv->capability & CAP_PRIVACY_ON) network->capability |= WLAN_CAPABILITY_PRIVACY; @@ -4724,8 +4724,8 @@ static int ipw_associate_network(struct return err; } - IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi); - err = ipw_set_sensitivity(priv, network->stats.rssi); + IPW_DEBUG_ASSOC("Association sensitivity: %d\n", -network->signal); + err = ipw_set_sensitivity(priv, -network->signal); if (err) { IPW_DEBUG_HC("Attempt to send associate command failed.\n"); return err; @@ -4790,13 +4790,13 @@ static void ipw_roam(void *data) if (priv->status & STATUS_ASSOCIATED) { /* First pass through ROAM process -- look for a better * network */ - u8 rssi = priv->assoc_network->stats.rssi; - priv->assoc_network->stats.rssi = -128; + int rssi = priv->assoc_network->signal; + priv->assoc_network->signal = 128; list_for_each_entry(network, &priv->ieee->network_list, list) { if (network != priv->assoc_network) ipw_best_network(priv, &match, network, 1); } - priv->assoc_network->stats.rssi = rssi; + priv->assoc_network->signal = rssi; if (match.network == priv->assoc_network) { IPW_DEBUG_ASSOC("No better APs in this network to " @@ -4871,7 +4871,8 @@ static void ipw_associate(void *data) static inline void ipw_handle_data_packet(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, - struct ieee80211_rx_stats *stats) + struct ieee80211_rx_info *info, + int is_mgmt) { struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; @@ -4886,7 +4887,7 @@ static inline void ipw_handle_data_packe priv->wstats.discard.misc++; IPW_DEBUG_DROP("Corruption detected! Oh no!\n"); return; - } else if (unlikely(!netif_running(priv->net_dev))) { + } else if (!is_mgmt && !netif_running(priv->net_dev)) { priv->ieee->stats.rx_dropped++; priv->wstats.discard.misc++; IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); @@ -4901,7 +4902,7 @@ static inline void ipw_handle_data_packe IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); - if (!ieee80211_rx(priv->ieee, rxb->skb, stats)) + if (!ieee80211_rx(priv->ieee, rxb->skb, info)) priv->ieee->stats.rx_errors++; else /* ieee80211_rx succeeded, so it now owns the SKB */ rxb->skb = NULL; @@ -4919,6 +4920,7 @@ static void ipw_rx(struct ipw_priv *priv struct ieee80211_hdr *header; u32 r, w, i; u8 network_packet; + int is_mgmt; r = ipw_read32(priv, CX2_RX_READ_INDEX); w = ipw_read32(priv, CX2_RX_WRITE_INDEX); @@ -4945,35 +4947,26 @@ static void ipw_rx(struct ipw_priv *priv switch (pkt->header.message_type) { case RX_FRAME_TYPE: /* 802.11 frame */ { - struct ieee80211_rx_stats stats = { - .rssi = pkt->u.frame.rssi_dbm - - IPW_RSSI_TO_DBM, - .signal = pkt->u.frame.signal, + struct ieee80211_rx_info info = { + .signal = -(pkt->u.frame.rssi_dbm - + IPW_RSSI_TO_DBM), + .noise = -100; .rate = ipw_get_ieee80211_rate(pkt->u.frame.rate), .mac_time = jiffies, - .received_channel = + .channel = pkt->u.frame.received_channel, .modulation = (pkt->u.frame. control & (1 << 0)) ? ipw_get_bg_modulation(pkt->u.frame.rate) : IEEE80211_OFDM_MODULATION, - .len = pkt->u.frame.length, }; - if (stats.rssi != 0) - stats.mask |= IEEE80211_STATMASK_RSSI; - if (stats.signal != 0) - stats.mask |= IEEE80211_STATMASK_SIGNAL; - if (stats.rate != 0) - stats.mask |= IEEE80211_STATMASK_RATE; - priv->rx_packets++; #ifdef CONFIG_IPW_PROMISC if (priv->ieee->iw_mode == IW_MODE_MONITOR) { - ipw_handle_data_packet(priv, rxb, - &stats); + ipw_handle_packet(priv, rxb, &info, 0); break; } #endif @@ -5016,11 +5009,13 @@ static void ipw_rx(struct ipw_priv *priv } if (network_packet && priv->assoc_network) { - priv->assoc_network->stats.rssi = - stats.rssi; + priv->assoc_network->signal = + info.signal; + priv->assoc_network->noise = + info.noise; average_add(&priv->average_rssi, - stats.rssi); - priv->last_rx_rssi = stats.rssi; + -info.signal); + priv->last_rx_rssi = -info.signal; } IPW_DEBUG_RX("Frame: len=%u\n", @@ -5035,46 +5030,19 @@ static void ipw_rx(struct ipw_priv *priv break; } - switch (WLAN_FC_GET_TYPE(header->frame_ctl)) { - case IEEE80211_FTYPE_MGMT: - ieee80211_rx_mgt(priv->ieee, header, - &stats); - if (priv->ieee->iw_mode == IW_MODE_ADHOC - && - ((WLAN_FC_GET_STYPE - (header->frame_ctl) == - IEEE80211_STYPE_PROBE_RESP) - || - (WLAN_FC_GET_STYPE - (header->frame_ctl) == - IEEE80211_STYPE_BEACON)) - && !memcmp(header->addr3, - priv->bssid, ETH_ALEN)) - ipw_add_station(priv, - header->addr2); - break; - - case IEEE80211_FTYPE_CTL: - break; - - case IEEE80211_FTYPE_DATA: - if (network_packet) - ipw_handle_data_packet(priv, - rxb, - &stats); - else - IPW_DEBUG_DROP("Dropping: " - MAC_FMT ", " - MAC_FMT ", " - MAC_FMT "\n", - MAC_ARG(header-> - addr1), - MAC_ARG(header-> - addr2), - MAC_ARG(header-> - addr3)); - break; + is_mgmt = + (WLAN_FC_GET_TYPE(le16_to_cpu(header->frame_ctl)) + == IEEE80211_FTYPE_MGMT); + if (is_mgmt && priv->ieee->iw_mode == IW_MODE_ADHOC && + ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) == + IEEE80211_STYPE_PROBE_RESP) || + (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) == + IEEE80211_STYPE_BEACON)) && + !memcmp(header->addr3, priv->bssid, ETH_ALEN)) { + ipw_add_station(priv, header->addr2); } + + ipw_handle_packet(priv, rxb, &info, is_mgmt); break; } @@ -7048,6 +7016,7 @@ static int ipw_pci_probe(struct pci_dev goto out; } ieee->config &= ~IEEE80211_CFG_COMPUTE_FCS; + ieee->rssi_flags = IEEE80211_RSSI_CAP_SIGNAL; net_dev = ieee80211_dev(ieee); Index: netdev/drivers/net/wireless/ipw2100.c =================================================================== --- netdev.orig/drivers/net/wireless/ipw2100.c 2005-09-17 15:13:01.000000000 +0200 +++ netdev/drivers/net/wireless/ipw2100.c 2005-09-17 15:20:43.000000000 +0200 @@ -2372,7 +2372,7 @@ static inline void ipw2100_corruption_de } static inline void isr_rx(struct ipw2100_priv *priv, int i, - struct ieee80211_rx_stats *stats) + struct ieee80211_rx_info *info) { struct ipw2100_status *status = &priv->status_queue.drv[i]; struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; @@ -2424,7 +2424,7 @@ static inline void isr_rx(struct ipw2100 min_t(u32, status->frame_size, IPW_RX_NIC_BUFFER_LENGTH)); #endif - if (!ieee80211_rx(priv->ieee, packet->skb, stats)) { + if (!ieee80211_rx(priv->ieee, packet->skb, info)) { #ifdef CONFIG_IPW2100_RX_DEBUG IPW_DEBUG_DROP("%s: Non consumed packet:\n", priv->net_dev->name); @@ -2514,7 +2514,7 @@ static inline void __ipw2100_rx_process( u16 frame_type; u32 r, w, i, s; struct ipw2100_rx *u; - struct ieee80211_rx_stats stats = { + struct ieee80211_rx_info info = { .mac_time = jiffies, }; @@ -2556,18 +2556,15 @@ static inline void __ipw2100_rx_process( u = packet->rxp; frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK; - stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM; - stats.len = sq->drv[i].frame_size; + info.signal = -(sq->drv[i].rssi + IPW2100_RSSI_TO_DBM); + info.noise = -100; - stats.mask = 0; - if (stats.rssi != 0) - stats.mask |= IEEE80211_STATMASK_RSSI; - stats.modulation = IEEE80211_DSSS_MODULATION; + info.modulation = IEEE80211_DSSS_MODULATION; IPW_DEBUG_RX( "%s: '%s' frame type received (%d).\n", priv->net_dev->name, frame_types[frame_type], - stats.len); + sq->drv[i].frame_size); switch (frame_type) { case COMMAND_STATUS_VAL: @@ -2584,28 +2581,13 @@ static inline void __ipw2100_rx_process( case P8023_DATA_VAL: #ifdef CONFIG_IPW2100_MONITOR if (priv->ieee->iw_mode == IW_MODE_MONITOR) { - isr_rx(priv, i, &stats); + isr_rx(priv, i, &info); break; } #endif - if (stats.len < sizeof(u->rx_data.header)) + if (sq->drv[i].frame_size < sizeof(u->rx_data.header)) break; - switch (WLAN_FC_GET_TYPE(u->rx_data.header. - frame_ctl)) { - case IEEE80211_FTYPE_MGMT: - ieee80211_rx_mgt(priv->ieee, - &u->rx_data.header, - &stats); - break; - - case IEEE80211_FTYPE_CTL: - break; - - case IEEE80211_FTYPE_DATA: - isr_rx(priv, i, &stats); - break; - - } + isr_rx(priv, i, &info); break; } @@ -6388,6 +6370,7 @@ static struct net_device *ipw2100_alloc_ IEEE80211_B_MANDATORY_MODULATIONS; ieee->supported_rates = ieee->rates = IEEE80211_DSSS_RATES_MASK; + ieee->rssi_flags = IEEE80211_RSSI_CAP_SIGNAL; dev = ieee80211_dev(ieee); priv = ieee80211_priv(ieee); priv->ieee = ieee;