scsi: qla2xxx: Use MBX_TOV_SECONDS for mailbox command timeout values
[linux-2.6-microblaze.git] / net / mac80211 / tx.c
index 3529d13..dca01d7 100644 (file)
@@ -166,6 +166,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
                        if (r->flags & IEEE80211_RATE_MANDATORY_A)
                                mrate = r->bitrate;
                        break;
+               case NL80211_BAND_S1GHZ:
                case NL80211_BAND_60GHZ:
                        /* TODO, for now fall through */
                case NUM_NL80211_BANDS:
@@ -824,6 +825,9 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
        if (ieee80211_is_qos_nullfunc(hdr->frame_control))
                return TX_CONTINUE;
 
+       if (info->control.flags & IEEE80211_TX_CTRL_NO_SEQNO)
+               return TX_CONTINUE;
+
        /*
         * Anything but QoS data that has a sequence number field
         * (is long enough) gets a sequence number from the global
@@ -832,8 +836,6 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
         */
        if (!ieee80211_is_data_qos(hdr->frame_control) ||
            is_multicast_ether_addr(hdr->addr1)) {
-               if (tx->flags & IEEE80211_TX_NO_SEQNO)
-                       return TX_CONTINUE;
                /* driver should assign sequence number */
                info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
                /* for pure STA mode without beacons, we can do it */
@@ -1739,7 +1741,7 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
        case NL80211_IFTYPE_AP_VLAN:
                sdata = container_of(sdata->bss,
                                     struct ieee80211_sub_if_data, u.ap);
-               /* fall through */
+               fallthrough;
        default:
                vif = &sdata->vif;
                break;
@@ -1890,7 +1892,7 @@ EXPORT_SYMBOL(ieee80211_tx_prepare_skb);
  */
 static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,
                         struct sta_info *sta, struct sk_buff *skb,
-                        bool txpending, u32 txdata_flags)
+                        bool txpending)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_tx_data tx;
@@ -1908,8 +1910,6 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,
        led_len = skb->len;
        res_prepare = ieee80211_tx_prepare(sdata, &tx, sta, skb);
 
-       tx.flags |= txdata_flags;
-
        if (unlikely(res_prepare == TX_DROP)) {
                ieee80211_free_txskb(&local->hw, skb);
                return true;
@@ -1977,8 +1977,7 @@ static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
 }
 
 void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
-                   struct sta_info *sta, struct sk_buff *skb,
-                   u32 txdata_flags)
+                   struct sta_info *sta, struct sk_buff *skb)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
@@ -2013,12 +2012,13 @@ void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
        }
 
        ieee80211_set_qos_hdr(sdata, skb);
-       ieee80211_tx(sdata, sta, skb, false, txdata_flags);
+       ieee80211_tx(sdata, sta, skb, false);
 }
 
-static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
-                                       struct sk_buff *skb)
+bool ieee80211_parse_tx_radiotap(struct sk_buff *skb,
+                                struct net_device *dev)
 {
+       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_radiotap_iterator iterator;
        struct ieee80211_radiotap_header *rthdr =
                (struct ieee80211_radiotap_header *) skb->data;
@@ -2037,6 +2037,18 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
        u8 vht_mcs = 0, vht_nss = 0;
        int i;
 
+       /* check for not even having the fixed radiotap header part */
+       if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
+               return false; /* too short to be possibly valid */
+
+       /* is it a header version we can trust to find length from? */
+       if (unlikely(rthdr->it_version))
+               return false; /* only version 0 is supported */
+
+       /* does the skb contain enough to deliver on the alleged length? */
+       if (unlikely(skb->len < ieee80211_get_radiotap_len(skb->data)))
+               return false; /* skb too short for claimed rt header extent */
+
        info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
                       IEEE80211_TX_CTL_DONTFRAG;
 
@@ -2084,6 +2096,8 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
                        txflags = get_unaligned_le16(iterator.this_arg);
                        if (txflags & IEEE80211_RADIOTAP_F_TX_NOACK)
                                info->flags |= IEEE80211_TX_CTL_NO_ACK;
+                       if (txflags & IEEE80211_RADIOTAP_F_TX_NOSEQNO)
+                               info->control.flags |= IEEE80211_TX_CTRL_NO_SEQNO;
                        break;
 
                case IEEE80211_RADIOTAP_RATE:
@@ -2188,13 +2202,6 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
                                                     local->hw.max_rate_tries);
        }
 
-       /*
-        * remove the radiotap header
-        * iterator->_max_length was sanity-checked against
-        * skb->len by iterator init
-        */
-       skb_pull(skb, iterator._max_length);
-
        return true;
 }
 
@@ -2203,8 +2210,6 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
 {
        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_chanctx_conf *chanctx_conf;
-       struct ieee80211_radiotap_header *prthdr =
-               (struct ieee80211_radiotap_header *)skb->data;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_hdr *hdr;
        struct ieee80211_sub_if_data *tmp_sdata, *sdata;
@@ -2212,21 +2217,17 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
        u16 len_rthdr;
        int hdrlen;
 
-       /* check for not even having the fixed radiotap header part */
-       if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
-               goto fail; /* too short to be possibly valid */
+       memset(info, 0, sizeof(*info));
+       info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
+                     IEEE80211_TX_CTL_INJECTED;
 
-       /* is it a header version we can trust to find length from? */
-       if (unlikely(prthdr->it_version))
-               goto fail; /* only version 0 is supported */
+       /* Sanity-check and process the injection radiotap header */
+       if (!ieee80211_parse_tx_radiotap(skb, dev))
+               goto fail;
 
-       /* then there must be a radiotap header with a length we can use */
+       /* we now know there is a radiotap header with a length we can use */
        len_rthdr = ieee80211_get_radiotap_len(skb->data);
 
-       /* does the skb contain enough to deliver on the alleged length? */
-       if (unlikely(skb->len < len_rthdr))
-               goto fail; /* skb too short for claimed rt header extent */
-
        /*
         * fix up the pointers accounting for the radiotap
         * header still being in there.  We are being given
@@ -2272,11 +2273,6 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
                skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
        }
 
-       memset(info, 0, sizeof(*info));
-
-       info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
-                     IEEE80211_TX_CTL_INJECTED;
-
        rcu_read_lock();
 
        /*
@@ -2342,11 +2338,10 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
 
        info->band = chandef->chan->band;
 
-       /* process and remove the injection radiotap header */
-       if (!ieee80211_parse_tx_radiotap(local, skb))
-               goto fail_rcu;
+       /* remove the injection radiotap header */
+       skb_pull(skb, len_rthdr);
 
-       ieee80211_xmit(sdata, NULL, skb, 0);
+       ieee80211_xmit(sdata, NULL, skb);
        rcu_read_unlock();
 
        return NETDEV_TX_OK;
@@ -2382,7 +2377,7 @@ int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
                } else if (sdata->wdev.use_4addr) {
                        return -ENOLINK;
                }
-               /* fall through */
+               fallthrough;
        case NL80211_IFTYPE_AP:
        case NL80211_IFTYPE_OCB:
        case NL80211_IFTYPE_ADHOC:
@@ -2552,7 +2547,7 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                band = chanctx_conf->def.chan->band;
                if (sdata->wdev.use_4addr)
                        break;
-               /* fall through */
+               fallthrough;
        case NL80211_IFTYPE_AP:
                if (sdata->vif.type == NL80211_IFTYPE_AP)
                        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
@@ -2999,7 +2994,7 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
                        build.hdr_len = 30;
                        break;
                }
-               /* fall through */
+               fallthrough;
        case NL80211_IFTYPE_AP:
                fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
                /* DA BSSID SA */
@@ -3618,7 +3613,7 @@ begin:
        tx.skb = skb;
        tx.sdata = vif_to_sdata(info->control.vif);
 
-       if (txq->sta) {
+       if (txq->sta && !(info->flags & IEEE80211_TX_CTL_INJECTED)) {
                tx.sta = container_of(txq->sta, struct sta_info, sta);
                /*
                 * Drop unicast frames to unauthorised stations unless they are
@@ -3710,7 +3705,7 @@ begin:
        case NL80211_IFTYPE_AP_VLAN:
                tx.sdata = container_of(tx.sdata->bss,
                                        struct ieee80211_sub_if_data, u.ap);
-               /* fall through */
+               fallthrough;
        default:
                vif = &tx.sdata->vif;
                break;
@@ -3721,10 +3716,11 @@ encap_out:
 
        if (vif &&
            wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) {
+               bool ampdu = txq->ac != IEEE80211_AC_VO;
                u32 airtime;
 
                airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta,
-                                                            skb->len);
+                                                            skb->len, ampdu);
                if (airtime) {
                        airtime = ieee80211_info_set_tx_time_est(info, airtime);
                        ieee80211_sta_update_pending_airtime(local, tx.sta,
@@ -3950,6 +3946,7 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
        if (local->ops->wake_tx_queue) {
                u16 queue = __ieee80211_select_queue(sdata, sta, skb);
                skb_set_queue_mapping(skb, queue);
+               skb_get_hash(skb);
        }
 
        if (sta) {
@@ -4008,7 +4005,7 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
 
                ieee80211_tx_stats(dev, skb->len);
 
-               ieee80211_xmit(sdata, sta, skb, 0);
+               ieee80211_xmit(sdata, sta, skb);
        }
        goto out;
  out_free:
@@ -4049,7 +4046,7 @@ static bool ieee80211_multicast_to_unicast(struct sk_buff *skb,
                        return false;
                if (sdata->wdev.use_4addr)
                        return false;
-               /* fall through */
+               fallthrough;
        case NL80211_IFTYPE_AP:
                /* check runtime toggle for this bss */
                if (!sdata->bss->multicast_to_unicast)
@@ -4375,7 +4372,7 @@ static bool ieee80211_tx_pending_skb(struct ieee80211_local *local,
                        return true;
                }
                info->band = chanctx_conf->def.chan->band;
-               result = ieee80211_tx(sdata, NULL, skb, true, 0);
+               result = ieee80211_tx(sdata, NULL, skb, true);
        } else if (info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) {
                if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) {
                        dev_kfree_skb(skb);
@@ -5334,7 +5331,7 @@ EXPORT_SYMBOL(ieee80211_unreserve_tid);
 
 void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
                                 struct sk_buff *skb, int tid,
-                                enum nl80211_band band, u32 txdata_flags)
+                                enum nl80211_band band)
 {
        int ac = ieee80211_ac_from_tid(tid);
 
@@ -5351,7 +5348,7 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
         */
        local_bh_disable();
        IEEE80211_SKB_CB(skb)->band = band;
-       ieee80211_xmit(sdata, NULL, skb, txdata_flags);
+       ieee80211_xmit(sdata, NULL, skb);
        local_bh_enable();
 }