diff --git a/origin/iwl4965-base.c b/origin/iwl4965-base.c index bb476b5..aa07522 100644 --- a/origin/iwl4965-base.c +++ b/origin/iwl4965-base.c @@ -2679,7 +2679,8 @@ static void iwl4965_connection_init_rx_config(struct iwl4965_priv *priv) case IEEE80211_IF_TYPE_STA: priv->staging_rxon.dev_type = RXON_DEV_TYPE_ESS; - priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; + priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK | + RXON_FILTER_CTL2HOST_MSK; break; case IEEE80211_IF_TYPE_IBSS: @@ -2984,11 +2985,6 @@ static int iwl4965_tx_skb(struct iwl4965_priv *priv, goto drop_unlock; } - if (!priv->interface_id) { - IWL_DEBUG_DROP("Dropping - !priv->interface_id\n"); - goto drop_unlock; - } - if ((ctl->tx_rate & 0xFF) == IWL_INVALID_RATE) { IWL_ERROR("ERROR: No TX rate available.\n"); goto drop_unlock; @@ -3010,7 +3006,8 @@ static int iwl4965_tx_skb(struct iwl4965_priv *priv, /* drop all data frame if we are not associated */ if (!iwl4965_is_associated(priv) && !priv->assoc_id && - ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { + ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && + priv->interface_id) { IWL_DEBUG_DROP("Dropping - !iwl4965_is_associated\n"); goto drop_unlock; } @@ -3020,11 +3017,22 @@ static int iwl4965_tx_skb(struct iwl4965_priv *priv, hdr_len = ieee80211_get_hdrlen(fc); /* Find (or create) index into station table for destination station */ - sta_id = iwl4965_get_sta_id(priv, hdr); + if (unlikely(!priv->interface_id)) { + if (!ieee80211_is_probe_response(le16_to_cpu(hdr->frame_control)) && + !is_multicast_ether_addr(hdr->addr1) && + !is_broadcast_ether_addr(hdr->addr1)) + sta_id = iwl4965_add_station_flags(priv, hdr->addr1, 0, 0); + else + sta_id = priv->hw_setting.bcast_sta_id; + } + else + sta_id = iwl4965_get_sta_id(priv, hdr); if (sta_id == IWL_INVALID_STATION) { - IWL_DEBUG_DROP("Dropping - INVALID STATION: " MAC_FMT "\n", - MAC_ARG(hdr->addr1)); - goto drop; + if (priv->interface_id) { + IWL_DEBUG_DROP("Dropping - INVALID STATION: " MAC_FMT "\n", MAC_ARG(hdr->addr1)); + goto drop; + } + sta_id = priv->hw_setting.bcast_sta_id; } IWL_DEBUG_RATE("station Id %d\n", sta_id);