ath9k: fix resetting the hw when the MAC fails to go idle (backport of r26665)
[openwrt-10.03/.git] / package / mac80211 / patches / 300-pending_work.patch
index cf4272d92bbee7048dc3552ee0dee9b8f6885022..982e233fb748fd6c401571ad562b59cdca064eeb 100644 (file)
        if (ieee80211_has_a4(hdr->frame_control) &&
            sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta)
                return -1;
-@@ -1611,12 +1612,16 @@ __ieee80211_data_to_8023(struct ieee8021
+@@ -1611,11 +1612,13 @@ __ieee80211_data_to_8023(struct ieee8021
                return -1;
  
        ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type);
  
        ehdr = (struct ethhdr *) rx->skb->data;
 -      if (ehdr->h_proto != rx->sdata->control_port_protocol)
--              return -1;
-+      if (ehdr->h_proto == rx->sdata->control_port_protocol) {
++      if (ehdr->h_proto == rx->sdata->control_port_protocol)
 +              *port_control = true;
-+
-+              if (check_port_control)
-+                      return -1;
-+      }
++      else if (check_port_control)
+               return -1;
  
        return 0;
- }
-@@ -1916,6 +1921,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_
+@@ -1916,6 +1919,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_
        struct net_device *dev = sdata->dev;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
        __le16 fc = hdr->frame_control;
        int err;
  
        if (unlikely(!ieee80211_is_data(hdr->frame_control)))
-@@ -1932,13 +1938,21 @@ ieee80211_rx_h_data(struct ieee80211_rx_
+@@ -1932,13 +1936,21 @@ ieee80211_rx_h_data(struct ieee80211_rx_
            sdata->vif.type == NL80211_IFTYPE_AP)
                return RX_DROP_MONITOR;
  
                ATH_DBG_WARN_ON_ONCE(!stopped);
        }
 -      return stopped;
-+      return stopped || reset;
++      return stopped && !reset;
  }
  
  void ath_flushrecv(struct ath_softc *sc)