diff options
Diffstat (limited to 'package/mac80211/patches/422-mac80211-seqno-station.patch')
-rw-r--r-- | package/mac80211/patches/422-mac80211-seqno-station.patch | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/package/mac80211/patches/422-mac80211-seqno-station.patch b/package/mac80211/patches/422-mac80211-seqno-station.patch new file mode 100644 index 0000000000..72fbd9cb70 --- /dev/null +++ b/package/mac80211/patches/422-mac80211-seqno-station.patch @@ -0,0 +1,142 @@ +Subject: mac80211: provide sequence numbers + +I've come to think that not providing sequence numbers for +the normal STA mode case was a mistake, at least two drivers +now had to implement code they wouldn't otherwise need, and +I believe at76_usb and adm8211 might be broken. + +This patch makes mac80211 assign a sequence number to all +those frames that need one except beacons. That means that +if a driver only implements modes that do not do beaconing +it need not worry about the sequence number. + +Signed-off-by: Johannes Berg <johannes@sipsolutions.net> +--- + drivers/net/wireless/p54/p54.h | 1 - + drivers/net/wireless/p54/p54common.c | 18 +++++------------- + drivers/net/wireless/rtl8187.h | 1 - + drivers/net/wireless/rtl8187_dev.c | 18 ++++-------------- + net/mac80211/ieee80211_i.h | 2 ++ + net/mac80211/tx.c | 10 ++++++++++ + 6 files changed, 21 insertions(+), 29 deletions(-) + +--- everything.orig/net/mac80211/ieee80211_i.h 2008-10-10 15:45:52.000000000 +0200 ++++ everything/net/mac80211/ieee80211_i.h 2008-10-10 15:45:56.000000000 +0200 +@@ -438,6 +438,8 @@ struct ieee80211_sub_if_data { + struct ieee80211_key *keys[NUM_DEFAULT_KEYS]; + struct ieee80211_key *default_key; + ++ u16 sequence_number; ++ + /* BSS configuration for this interface. */ + struct ieee80211_bss_conf bss_conf; + +--- everything.orig/net/mac80211/tx.c 2008-10-10 15:45:48.000000000 +0200 ++++ everything/net/mac80211/tx.c 2008-10-10 15:45:56.000000000 +0200 +@@ -602,8 +602,18 @@ ieee80211_tx_h_sequence(struct ieee80211 + if (ieee80211_hdrlen(hdr->frame_control) < 24) + return TX_CONTINUE; + ++ /* ++ * Anything but QoS data that has a sequence number field ++ * (is long enough) gets a sequence number from the global ++ * counter. ++ */ + if (!ieee80211_is_data_qos(hdr->frame_control)) { ++ /* driver should assign sequence number */ + info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; ++ /* for pure STA mode without beacons, we can do it */ ++ hdr->seq_ctrl = cpu_to_le16(tx->sdata->sequence_number); ++ tx->sdata->sequence_number += 0x10; ++ tx->sdata->sequence_number &= IEEE80211_SCTL_SEQ; + return TX_CONTINUE; + } + +--- everything.orig/drivers/net/wireless/p54/p54.h 2008-10-10 15:45:49.000000000 +0200 ++++ everything/drivers/net/wireless/p54/p54.h 2008-10-10 15:45:56.000000000 +0200 +@@ -67,7 +67,6 @@ struct p54_common { + int (*open)(struct ieee80211_hw *dev); + void (*stop)(struct ieee80211_hw *dev); + int mode; +- u16 seqno; + u16 rx_mtu; + u8 headroom; + u8 tailroom; +--- everything.orig/drivers/net/wireless/p54/p54common.c 2008-10-10 15:45:49.000000000 +0200 ++++ everything/drivers/net/wireless/p54/p54common.c 2008-10-10 15:45:56.000000000 +0200 +@@ -865,19 +865,6 @@ static int p54_tx(struct ieee80211_hw *d + if (padding) + txhdr->align[0] = padding; + +- /* FIXME: The sequence that follows is needed for this driver to +- * work with mac80211 since "mac80211: fix TX sequence numbers". +- * As with the temporary code in rt2x00, changes will be needed +- * to get proper sequence numbers on beacons. In addition, this +- * patch places the sequence number in the hardware state, which +- * limits us to a single virtual state. +- */ +- if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { +- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) +- priv->seqno += 0x10; +- ieee80211hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); +- ieee80211hdr->seq_ctrl |= cpu_to_le16(priv->seqno); +- } + /* modifies skb->cb and with it info, so must be last! */ + p54_assign_address(dev, skb, hdr, skb->len); + +@@ -1391,6 +1378,11 @@ struct ieee80211_hw *p54_init_common(siz + IEEE80211_HW_SIGNAL_DBM | + IEEE80211_HW_NOISE_DBM; + ++ /* ++ * XXX: when this driver gets support for any mode that ++ * requires beacons (AP, MESH, IBSS) then it must ++ * implement IEEE80211_TX_CTL_ASSIGN_SEQ. ++ */ + dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); + + dev->channel_change_time = 1000; /* TODO: find actual value */ +--- everything.orig/drivers/net/wireless/rtl8187_dev.c 2008-10-10 15:45:49.000000000 +0200 ++++ everything/drivers/net/wireless/rtl8187_dev.c 2008-10-10 15:45:56.000000000 +0200 +@@ -238,20 +238,6 @@ static int rtl8187_tx(struct ieee80211_h + ep = epmap[skb_get_queue_mapping(skb)]; + } + +- /* FIXME: The sequence that follows is needed for this driver to +- * work with mac80211 since "mac80211: fix TX sequence numbers". +- * As with the temporary code in rt2x00, changes will be needed +- * to get proper sequence numbers on beacons. In addition, this +- * patch places the sequence number in the hardware state, which +- * limits us to a single virtual state. +- */ +- if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { +- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) +- priv->seqno += 0x10; +- ieee80211hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); +- ieee80211hdr->seq_ctrl |= cpu_to_le16(priv->seqno); +- } +- + info->driver_data[0] = dev; + info->driver_data[1] = urb; + +@@ -1185,6 +1171,10 @@ static int __devinit rtl8187_probe(struc + dev->max_signal = 65; + } + ++ /* ++ * XXX: Once this driver supports anything that requires ++ * beacons it must implement IEEE80211_TX_CTL_ASSIGN_SEQ. ++ */ + dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); + + if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b) +--- everything.orig/drivers/net/wireless/rtl8187.h 2008-10-10 15:45:49.000000000 +0200 ++++ everything/drivers/net/wireless/rtl8187.h 2008-10-10 15:45:56.000000000 +0200 +@@ -100,7 +100,6 @@ struct rtl8187_priv { + struct usb_device *udev; + u32 rx_conf; + u16 txpwr_base; +- u16 seqno; + u8 asic_rev; + u8 is_rtl8187b; + enum { |