On Mon, 23 Oct 2006 08:29:31 -0700, David Kimdon wrote:
> We could be more selective about what the driver is required to return
> in ieee80211_tx_status, the rc4key isn't particularily interesting to
> ieee80211_tx_status().  I expect there are other uninteresting fields
> (tx_rate, rts_cts_rate, come to mind, for example).  We could put the
> fields we are interested in directly in ieee80211_tx_status, or have a
> new structure rather than re-using ieee80211_tx_control inside
> ieee80211_tx_status.

Something like this?

 Jiri

---
 drivers/net/wireless/d80211/adm8211/adm8211.c |    7 +
 include/net/d80211.h                          |   28 ++++---
 net/d80211/ieee80211.c                        |   98 +++++++++++++-------------
 net/d80211/ieee80211_scan.c                   |    4 -
 net/d80211/ieee80211_sta.c                    |    4 -
 5 files changed, 73 insertions(+), 68 deletions(-)

--- dscape.orig/drivers/net/wireless/d80211/adm8211/adm8211.c
+++ dscape/drivers/net/wireless/d80211/adm8211/adm8211.c
@@ -439,7 +439,7 @@ static void adm8211_interrupt_tci(struct
                pci_unmap_single(priv->pdev, priv->tx_buffers[entry].mapping,
                                 priv->tx_buffers[entry].skb->len, 
PCI_DMA_TODEVICE);
 
-               if ((priv->tx_buffers[entry].tx_status.control.flags &
+               if ((priv->tx_buffers[entry].tx_status.common.flags &
                     IEEE80211_TXCTL_REQ_TX_STATUS) ||
                    
!is_multicast_ether_addr(ieee80211_get_DA(&priv->tx_buffers[entry].hdr))) {
                        struct ieee80211_hdr *hdr;
@@ -1780,7 +1780,8 @@ static void adm8211_tx_raw(struct net_de
 
        priv->tx_buffers[entry].skb = skb;
        priv->tx_buffers[entry].mapping = mapping;
-       memcpy(&priv->tx_buffers[entry].tx_status.control, control, 
sizeof(*control));
+       memcpy(&priv->tx_buffers[entry].tx_status.common, &control->common,
+              sizeof(control->common));
        memcpy(&priv->tx_buffers[entry].hdr, hdr, sizeof(*hdr));
        priv->tx_ring[entry].buffer1 = cpu_to_le32(mapping);
 
@@ -1862,7 +1863,7 @@ static int adm8211_tx(struct net_device 
        if (short_preamble)
                txhdr->header_control |= 
cpu_to_le16(ADM8211_TXHDRCTL_SHORT_PREAMBLE);
 
-       if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS)
+       if (control->common.flags & IEEE80211_TXCTL_USE_RTS_CTS)
                txhdr->header_control |= 
cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_RTS);
 
        if (fc & IEEE80211_FCTL_PROTECTED)
--- dscape.orig/include/net/d80211.h
+++ dscape/include/net/d80211.h
@@ -134,13 +134,7 @@ struct ieee80211_low_level_stats {
  * the hardware to use given values (depending on what is supported). */
 #define HW_KEY_IDX_INVALID -1
 
-struct ieee80211_tx_control {
-       enum { PKT_NORMAL = 0, PKT_PROBE_RESP } pkt_type;
-       int tx_rate; /* Transmit rate, given as the hw specific value for the
-                     * rate (from struct ieee80211_rate) */
-       int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw
-                          * specific value for the rate (from
-                          * struct ieee80211_rate) */
+struct ieee80211_tx_ctrl_common {
 
 #define IEEE80211_TXCTL_REQ_TX_STATUS  (1<<0)/* request TX status callback for
                                                * this frame */
@@ -161,6 +155,20 @@ struct ieee80211_tx_control {
                                                * the frame */
        u16 flags;                             /* tx control flags defined
                                                * above */
+       enum { PKT_NORMAL = 0, PKT_PROBE_RESP } pkt_type;
+       u8 queue;               /* hardware queue to use for this frame;
+                                * 0 = highest, hw->queues-1 = lowest */
+       int type;       /* internal */
+       int ifindex;    /* internal */
+};
+
+struct ieee80211_tx_control {
+       struct ieee80211_tx_ctrl_common common;
+       int tx_rate; /* Transmit rate, given as the hw specific value for the
+                     * rate (from struct ieee80211_rate) */
+       int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw
+                          * specific value for the rate (from
+                          * struct ieee80211_rate) */
        u16 rts_cts_duration;   /* duration field for RTS/CTS frame */
        u8 retry_limit;         /* 1 = only first attempt, 2 = one retry, .. */
        u8 power_level;         /* per-packet transmit power level, in dBm */
@@ -169,8 +177,6 @@ struct ieee80211_tx_control {
                                 * hw->set_key() */
        u8 icv_len;             /* length of the ICV/MIC field in octets */
        u8 iv_len;              /* length of the IV field in octets */
-       u8 queue;               /* hardware queue to use for this frame;
-                                * 0 = highest, hw->queues-1 = lowest */
        u8 sw_retry_attempt;    /* number of times hw has tried to
                                 * transmit frame (not incl. hw retries) */
 
@@ -180,8 +186,6 @@ struct ieee80211_tx_control {
                             * struct ieee80211_rate). To be used to limit
                             * packet dropping when probing higher rates, if hw
                             * supports multiple retry rates. -1 = not used */
-       int type;       /* internal */
-       int ifindex;    /* internal */
 };
 
 #define RX_FLAG_MMIC_ERROR       0x1
@@ -207,7 +211,7 @@ struct ieee80211_rx_status {
  * frame. */
 struct ieee80211_tx_status {
        /* copied ieee80211_tx_control structure */
-       struct ieee80211_tx_control control;
+       struct ieee80211_tx_ctrl_common common;
 
 #define IEEE80211_TX_STATUS_TX_FILTERED        (1<<0)
 #define IEEE80211_TX_STATUS_ACK                (1<<1) /* whether the TX frame 
was ACKed */
--- dscape.orig/net/d80211/ieee80211.c
+++ dscape/net/d80211/ieee80211.c
@@ -358,7 +358,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
        tx->u.tx.rate = rate_control_get_rate(tx->local, tx->dev, tx->skb,
                                              &extra);
        if (unlikely(extra.probe != NULL)) {
-               tx->u.tx.control->flags |= IEEE80211_TXCTL_RATE_CTRL_PROBE;
+               tx->u.tx.control->common.flags |= 
IEEE80211_TXCTL_RATE_CTRL_PROBE;
                tx->u.tx.probe_last_frag = 1;
                tx->u.tx.control->alt_retry_rate = tx->u.tx.rate->val;
                tx->u.tx.rate = extra.probe;
@@ -376,7 +376,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
 
                tx->u.tx.rate = extra.nonerp;
                tx->u.tx.control->rateidx = extra.nonerp_idx;
-               tx->u.tx.control->flags &= ~IEEE80211_TXCTL_RATE_CTRL_PROBE;
+               tx->u.tx.control->common.flags &= 
~IEEE80211_TXCTL_RATE_CTRL_PROBE;
        } else {
                tx->u.tx.last_frag_rate = tx->u.tx.rate;
                tx->u.tx.last_frag_rateidx = extra.rateidx;
@@ -402,7 +402,7 @@ ieee80211_tx_h_select_key(struct ieee802
        else
                tx->u.tx.control->key_idx = HW_KEY_IDX_INVALID;
 
-       if (unlikely(tx->u.tx.control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT))
+       if (unlikely(tx->u.tx.control->common.flags & 
IEEE80211_TXCTL_DO_NOT_ENCRYPT))
                tx->key = NULL;
        else if (tx->sta && tx->sta->key)
                tx->key = tx->sta->key;
@@ -758,7 +758,7 @@ ieee80211_tx_h_misc(struct ieee80211_txr
        if (!is_multicast_ether_addr(hdr->addr1)) {
                if (tx->skb->len + FCS_LEN > tx->local->rts_threshold &&
                    tx->local->rts_threshold < IEEE80211_MAX_RTS_THRESHOLD) {
-                       control->flags |= IEEE80211_TXCTL_USE_RTS_CTS;
+                       control->common.flags |= IEEE80211_TXCTL_USE_RTS_CTS;
                        control->retry_limit =
                                tx->local->long_retry_limit;
                } else {
@@ -784,8 +784,8 @@ ieee80211_tx_h_misc(struct ieee80211_txr
            (tx->u.tx.rate->flags & IEEE80211_RATE_ERP) &&
            tx->u.tx.unicast &&
            tx->local->cts_protect_erp_frames &&
-           !(control->flags & IEEE80211_TXCTL_USE_RTS_CTS))
-               control->flags |= IEEE80211_TXCTL_USE_CTS_PROTECT;
+           !(control->common.flags & IEEE80211_TXCTL_USE_RTS_CTS))
+               control->common.flags |= IEEE80211_TXCTL_USE_CTS_PROTECT;
 
        /* Setup duration field for the first fragment of the frame. Duration
         * for remaining fragments will be updated when they are being sent
@@ -795,8 +795,8 @@ ieee80211_tx_h_misc(struct ieee80211_txr
                                 0);
        hdr->duration_id = cpu_to_le16(dur);
 
-       if ((control->flags & IEEE80211_TXCTL_USE_RTS_CTS) ||
-           (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) {
+       if ((control->common.flags & IEEE80211_TXCTL_USE_RTS_CTS) ||
+           (control->common.flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) {
                struct ieee80211_rate *rate;
                int erp = tx->u.tx.rate->flags & IEEE80211_RATE_ERP;
 
@@ -809,7 +809,7 @@ ieee80211_tx_h_misc(struct ieee80211_txr
                       !(rate->flags & IEEE80211_RATE_BASIC))
                        rate--;
 
-               if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS)
+               if (control->common.flags & IEEE80211_TXCTL_USE_RTS_CTS)
                        dur += ieee80211_frame_duration(tx->local, 10,
                                                        rate->rate, erp,
                                                        tx->local->
@@ -1066,17 +1066,17 @@ __ieee80211_tx_prepare(struct ieee80211_
        tx->u.tx.control = control;
         tx->u.tx.unicast = !is_multicast_ether_addr(hdr->addr1);
        if (is_multicast_ether_addr(hdr->addr1))
-               control->flags |= IEEE80211_TXCTL_NO_ACK;
+               control->common.flags |= IEEE80211_TXCTL_NO_ACK;
        else
-               control->flags &= ~IEEE80211_TXCTL_NO_ACK;
+               control->common.flags &= ~IEEE80211_TXCTL_NO_ACK;
        tx->fragmented = local->fragmentation_threshold <
                IEEE80211_MAX_FRAG_THRESHOLD && tx->u.tx.unicast &&
                skb->len + FCS_LEN > local->fragmentation_threshold &&
                (!local->hw->set_frag_threshold);
        if (!tx->sta)
-               control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
+               control->common.flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
        else if (tx->sta->clear_dst_mask) {
-               control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
+               control->common.flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
                tx->sta->clear_dst_mask = 0;
        }
        control->antenna_sel = local->conf.antenna_sel;
@@ -1087,7 +1087,7 @@ __ieee80211_tx_prepare(struct ieee80211_
                u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)];
                tx->ethertype = (pos[0] << 8) | pos[1];
        }
-       control->flags |= IEEE80211_TXCTL_FIRST_FRAGMENT;
+       control->common.flags |= IEEE80211_TXCTL_FIRST_FRAGMENT;
 
 }
 
@@ -1152,23 +1152,23 @@ static int __ieee80211_tx(struct ieee802
                ieee80211_led_tx(local, 1);
        }
        if (tx->u.tx.extra_frag) {
-               control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS |
+               control->common.flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS |
                                    IEEE80211_TXCTL_USE_CTS_PROTECT |
                                    IEEE80211_TXCTL_CLEAR_DST_MASK |
                                    IEEE80211_TXCTL_FIRST_FRAGMENT);
                for (i = 0; i < tx->u.tx.num_extra_frag; i++) {
                        if (!tx->u.tx.extra_frag[i])
                                continue;
-                       if (__ieee80211_queue_stopped(local, control->queue))
+                       if (__ieee80211_queue_stopped(local, 
control->common.queue))
                                return IEEE80211_TX_FRAG_AGAIN;
                        if (i == tx->u.tx.num_extra_frag) {
                                control->tx_rate = tx->u.tx.last_frag_hwrate;
                                control->rateidx = tx->u.tx.last_frag_rateidx;
                                if (tx->u.tx.probe_last_frag)
-                                       control->flags |=
+                                       control->common.flags |=
                                                IEEE80211_TXCTL_RATE_CTRL_PROBE;
                                else
-                                       control->flags &=
+                                       control->common.flags &=
                                                
~IEEE80211_TXCTL_RATE_CTRL_PROBE;
                        }
 
@@ -1197,7 +1197,7 @@ static int ieee80211_tx(struct net_devic
        ieee80211_txrx_result res = TXRX_DROP;
         int ret, i;
 
-       WARN_ON(__ieee80211_queue_pending(local, control->queue));
+       WARN_ON(__ieee80211_queue_pending(local, control->common.queue));
 
        if (unlikely(skb->len < 10)) {
                dev_kfree_skb(skb);
@@ -1252,12 +1252,12 @@ retry:
        ret = __ieee80211_tx(local, skb, &tx);
        if (ret) {
                struct ieee80211_tx_stored_packet *store =
-                       &local->pending_packet[control->queue];
+                       &local->pending_packet[control->common.queue];
 
                if (ret == IEEE80211_TX_FRAG_AGAIN)
                        skb = NULL;
                set_bit(IEEE80211_LINK_STATE_PENDING,
-                       &local->state[control->queue]);
+                       &local->state[control->common.queue]);
                smp_mb();
                /* When the driver gets out of buffers during sending of
                 * fragments and calls ieee80211_stop_queue, there is
@@ -1268,9 +1268,9 @@ retry:
                 * called with IEEE80211_LINK_STATE_PENDING. Prevent this by
                 * continuing transmitting here when that situation is
                 * possible to have happened. */
-               if (!__ieee80211_queue_stopped(local, control->queue)) {
+               if (!__ieee80211_queue_stopped(local, control->common.queue)) {
                        clear_bit(IEEE80211_LINK_STATE_PENDING,
-                                 &local->state[control->queue]);
+                                 &local->state[control->common.queue]);
                        goto retry;
                }
                memcpy(&store->control, control,
@@ -1382,20 +1382,20 @@ static int ieee80211_master_start_xmit(s
        }
        osdata = IEEE80211_DEV_TO_SUB_IF(odev);
 
-       control.ifindex = odev->ifindex;
-       control.type = osdata->type;
+       control.common.ifindex = odev->ifindex;
+       control.common.type = osdata->type;
        if (pkt_data->req_tx_status)
-               control.flags |= IEEE80211_TXCTL_REQ_TX_STATUS;
+               control.common.flags |= IEEE80211_TXCTL_REQ_TX_STATUS;
        if (pkt_data->do_not_encrypt)
-               control.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
-       control.pkt_type =
+               control.common.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
+       control.common.pkt_type =
                pkt_data->pkt_probe_resp ? PKT_PROBE_RESP : PKT_NORMAL;
        if (pkt_data->requeue)
-               control.flags |= IEEE80211_TXCTL_REQUEUE;
-       control.queue = pkt_data->queue;
+               control.common.flags |= IEEE80211_TXCTL_REQUEUE;
+       control.common.queue = pkt_data->queue;
 
        ret = ieee80211_tx(odev, skb, &control,
-                          control.type == IEEE80211_IF_TYPE_MGMT);
+                          control.common.type == IEEE80211_IF_TYPE_MGMT);
        dev_put(odev);
 
         return ret;
@@ -1781,10 +1781,10 @@ struct sk_buff * ieee80211_beacon_get(st
                        rate->val2 : rate->val;
                control->antenna_sel = local->conf.antenna_sel;
                control->power_level = local->conf.power_level;
-               control->flags |= IEEE80211_TXCTL_NO_ACK;
+               control->common.flags |= IEEE80211_TXCTL_NO_ACK;
                control->retry_limit = 1;
                control->rts_cts_duration = 0;
-               control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
+               control->common.flags |= IEEE80211_TXCTL_CLEAR_DST_MASK;
        }
 
        ap->num_beacons++;
@@ -3740,9 +3740,9 @@ ieee80211_tx_h_load_stats(struct ieee802
        if (!is_multicast_ether_addr(hdr->addr1))
                load += hdrtime;
 
-       if (tx->u.tx.control->flags & IEEE80211_TXCTL_USE_RTS_CTS)
+       if (tx->u.tx.control->common.flags & IEEE80211_TXCTL_USE_RTS_CTS)
                load += 2 * hdrtime;
-       else if (tx->u.tx.control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)
+       else if (tx->u.tx.control->common.flags & 
IEEE80211_TXCTL_USE_CTS_PROTECT)
                load += hdrtime;
 
        load += skb->len * tx->u.tx.rate->rate_inv;
@@ -3892,7 +3892,7 @@ void ieee80211_tx_status_irqsafe(struct 
                memcpy(saved, status, sizeof(struct ieee80211_tx_status));
        memcpy(skb->cb, &saved, sizeof(saved));
         skb->pkt_type = ieee80211_tx_status_msg;
-       skb_queue_tail(status->control.flags & IEEE80211_TXCTL_REQ_TX_STATUS ?
+       skb_queue_tail(status->common.flags & IEEE80211_TXCTL_REQ_TX_STATUS ?
                       &local->skb_queue : &local->skb_queue_unreliable, skb);
        tmp = skb_queue_len(&local->skb_queue) +
                skb_queue_len(&local->skb_queue_unreliable);
@@ -3961,19 +3961,19 @@ static void ieee80211_tasklet_handler(un
 static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
                                      struct ieee80211_key *key,
                                      struct sk_buff *skb,
-                                     struct ieee80211_tx_control *control)
+                                     struct ieee80211_tx_ctrl_common *common)
 {
        int hdrlen, iv_len, mic_len;
        struct ieee80211_tx_packet_data *pkt_data;
 
        pkt_data = (struct ieee80211_tx_packet_data *)skb->cb;
-       pkt_data->ifindex = control->ifindex;
-       pkt_data->mgmt_iface = (control->type == IEEE80211_IF_TYPE_MGMT);
-       pkt_data->req_tx_status = !!(control->flags & 
IEEE80211_TXCTL_REQ_TX_STATUS);
-       pkt_data->do_not_encrypt = !!(control->flags & 
IEEE80211_TXCTL_DO_NOT_ENCRYPT);
-       pkt_data->pkt_probe_resp = (control->pkt_type == PKT_PROBE_RESP);
-       pkt_data->requeue = !!(control->flags & IEEE80211_TXCTL_REQUEUE);
-       pkt_data->queue = control->queue;
+       pkt_data->ifindex = common->ifindex;
+       pkt_data->mgmt_iface = (common->type == IEEE80211_IF_TYPE_MGMT);
+       pkt_data->req_tx_status = !!(common->flags & 
IEEE80211_TXCTL_REQ_TX_STATUS);
+       pkt_data->do_not_encrypt = !!(common->flags & 
IEEE80211_TXCTL_DO_NOT_ENCRYPT);
+       pkt_data->pkt_probe_resp = (common->pkt_type == PKT_PROBE_RESP);
+       pkt_data->requeue = !!(common->flags & IEEE80211_TXCTL_REQUEUE);
+       pkt_data->queue = common->queue;
 
        hdrlen = ieee80211_get_hdrlen_from_skb(skb);
 
@@ -4072,15 +4072,15 @@ void ieee80211_tx_status(struct net_devi
                            STA_MAX_TX_BUFFER) {
                                ieee80211_remove_tx_extra(local, sta->key,
                                                          skb,
-                                                         &status->control);
+                                                         &status->common);
                                skb_queue_tail(&sta->tx_filtered, skb);
                        } else if (!(sta->flags & WLAN_STA_PS) &&
-                                  !(status->control.flags & 
IEEE80211_TXCTL_REQUEUE)) {
+                                  !(status->common.flags & 
IEEE80211_TXCTL_REQUEUE)) {
                                /* Software retry the packet once */
-                               status->control.flags |= 
IEEE80211_TXCTL_REQUEUE;
+                               status->common.flags |= IEEE80211_TXCTL_REQUEUE;
                                ieee80211_remove_tx_extra(local, sta->key,
                                                          skb,
-                                                         &status->control);
+                                                         &status->common);
                                dev_queue_xmit(skb);
                        } else {
                                if (net_ratelimit()) {
@@ -4136,7 +4136,7 @@ void ieee80211_tx_status(struct net_devi
                        local->dot11FailedCount++;
         }
 
-        if (!(status->control.flags & IEEE80211_TXCTL_REQ_TX_STATUS)) {
+        if (!(status->common.flags & IEEE80211_TXCTL_REQ_TX_STATUS)) {
                dev_kfree_skb(skb);
                return;
        }
--- dscape.orig/net/d80211/ieee80211_scan.c
+++ dscape/net/d80211/ieee80211_scan.c
@@ -329,12 +329,12 @@ void ieee80211_init_scan(struct net_devi
 
        memset(&local->scan.tx_control, 0, sizeof(local->scan.tx_control));
        local->scan.tx_control.key_idx = HW_KEY_IDX_INVALID;
-       local->scan.tx_control.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
+       local->scan.tx_control.common.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
        memset(&extra, 0, sizeof(extra));
        extra.endidx = local->num_curr_rates;
        local->scan.tx_control.tx_rate =
                rate_control_get_rate(local, dev, local->scan.skb, &extra)->val;
-       local->scan.tx_control.flags |= IEEE80211_TXCTL_NO_ACK;
+       local->scan.tx_control.common.flags |= IEEE80211_TXCTL_NO_ACK;
 }
 
 
--- dscape.orig/net/d80211/ieee80211_sta.c
+++ dscape/net/d80211/ieee80211_sta.c
@@ -2050,7 +2050,7 @@ static int ieee80211_sta_join_ibss(struc
                }
 
                memset(&control, 0, sizeof(control));
-               control.pkt_type = PKT_PROBE_RESP;
+               control.common.pkt_type = PKT_PROBE_RESP;
                memset(&extra, 0, sizeof(extra));
                extra.endidx = local->num_curr_rates;
                rate = rate_control_get_rate(local, dev, skb, &extra);
@@ -2064,7 +2064,7 @@ static int ieee80211_sta_join_ibss(struc
                        rate->val2 : rate->val;
                control.antenna_sel = local->conf.antenna_sel;
                control.power_level = local->conf.power_level;
-               control.flags |= IEEE80211_TXCTL_NO_ACK;
+               control.common.flags |= IEEE80211_TXCTL_NO_ACK;
                control.retry_limit = 1;
                control.rts_cts_duration = 0;
 



-- 
Jiri Benc
SUSE Labs
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to