From 29d737a976f9f09b7bd292f432358dfe7782ef6c Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Fri, 28 Dec 2012 21:05:49 +0000
Subject: [PATCH] mac80211: assume 2-byte aligning for 802.11 packets, slightly
 improves code size and performance

SVN-Revision: 34910
---
 .../mac80211/patches/300-pending_work.patch   | 378 ++++++++++++++++++
 ...42-mac80211_optimize_wireless_struct.patch |  71 ++++
 2 files changed, 449 insertions(+)
 create mode 100644 package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch

diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 9905a57d54..40331390e5 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -28,6 +28,33 @@
  	if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
+@@ -173,7 +173,7 @@ struct ieee80211_chanctx_conf {
+ 
+ 	u8 rx_chains_static, rx_chains_dynamic;
+ 
+-	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++	u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ 
+ /**
+@@ -1059,7 +1059,7 @@ struct ieee80211_vif {
+ 	u32 driver_flags;
+ 
+ 	/* must be last */
+-	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++	u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ 
+ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
+@@ -1209,7 +1209,7 @@ struct ieee80211_sta {
+ 	u8 max_sp;
+ 
+ 	/* must be last */
+-	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++	u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ 
+ /**
 @@ -1369,6 +1369,10 @@ struct ieee80211_tx_control {
   * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
   *	P2P Interface. This will be honoured even if more than one interface
@@ -826,3 +853,354 @@
  
  void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
  				   struct ieee80211_chanctx *chanctx);
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -180,7 +180,7 @@ struct ieee80211_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	u8 addr4[6];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ struct ieee80211_hdr_3addr {
+ 	__le16 frame_control;
+@@ -189,7 +189,7 @@ struct ieee80211_hdr_3addr {
+ 	u8 addr2[6];
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ struct ieee80211_qos_hdr {
+ 	__le16 frame_control;
+@@ -199,7 +199,7 @@ struct ieee80211_qos_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	__le16 qos_ctrl;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+@@ -576,7 +576,7 @@ struct ieee80211s_hdr {
+ 	__le32 seqnum;
+ 	u8 eaddr1[6];
+ 	u8 eaddr2[6];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /* Mesh flags */
+ #define MESH_FLAGS_AE_A4 	0x1
+@@ -614,7 +614,7 @@ struct ieee80211_quiet_ie {
+ 	u8 period;
+ 	__le16 duration;
+ 	__le16 offset;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * struct ieee80211_msrment_ie
+@@ -626,7 +626,7 @@ struct ieee80211_msrment_ie {
+ 	u8 mode;
+ 	u8 type;
+ 	u8 request[0];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * struct ieee80211_channel_sw_ie
+@@ -637,7 +637,7 @@ struct ieee80211_channel_sw_ie {
+ 	u8 mode;
+ 	u8 new_ch_num;
+ 	u8 count;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * struct ieee80211_tim
+@@ -650,7 +650,7 @@ struct ieee80211_tim_ie {
+ 	u8 bitmap_ctrl;
+ 	/* variable size: 1 - 251 bytes */
+ 	u8 virtual_map[1];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * struct ieee80211_meshconf_ie
+@@ -665,7 +665,7 @@ struct ieee80211_meshconf_ie {
+ 	u8 meshconf_auth;
+ 	u8 meshconf_form;
+ 	u8 meshconf_cap;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /**
+  * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags
+@@ -695,7 +695,7 @@ struct ieee80211_rann_ie {
+ 	__le32 rann_seq;
+ 	__le32 rann_interval;
+ 	__le32 rann_metric;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ enum ieee80211_rann_flags {
+ 	RANN_FLAG_IS_GATE = 1 << 0,
+@@ -717,33 +717,33 @@ struct ieee80211_mgmt {
+ 			__le16 status_code;
+ 			/* possibly followed by Challenge text */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) auth;
++		} __packed auth;
+ 		struct {
+ 			__le16 reason_code;
+-		} __attribute__ ((packed)) deauth;
++		} __packed deauth;
+ 		struct {
+ 			__le16 capab_info;
+ 			__le16 listen_interval;
+ 			/* followed by SSID and Supported rates */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) assoc_req;
++		} __packed assoc_req;
+ 		struct {
+ 			__le16 capab_info;
+ 			__le16 status_code;
+ 			__le16 aid;
+ 			/* followed by Supported rates */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) assoc_resp, reassoc_resp;
++		} __packed assoc_resp, reassoc_resp;
+ 		struct {
+ 			__le16 capab_info;
+ 			__le16 listen_interval;
+ 			u8 current_ap[6];
+ 			/* followed by SSID and Supported rates */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) reassoc_req;
++		} __packed reassoc_req;
+ 		struct {
+ 			__le16 reason_code;
+-		} __attribute__ ((packed)) disassoc;
++		} __packed disassoc;
+ 		struct {
+ 			__le64 timestamp;
+ 			__le16 beacon_int;
+@@ -751,11 +751,11 @@ struct ieee80211_mgmt {
+ 			/* followed by some of SSID, Supported rates,
+ 			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) beacon;
++		} __packed beacon;
+ 		struct {
+ 			/* only variable items: SSID, Supported rates */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) probe_req;
++		} __packed probe_req;
+ 		struct {
+ 			__le64 timestamp;
+ 			__le16 beacon_int;
+@@ -763,7 +763,7 @@ struct ieee80211_mgmt {
+ 			/* followed by some of SSID, Supported rates,
+ 			 * FH Params, DS Params, CF Params, IBSS Params */
+ 			u8 variable[0];
+-		} __attribute__ ((packed)) probe_resp;
++		} __packed probe_resp;
+ 		struct {
+ 			u8 category;
+ 			union {
+@@ -772,55 +772,55 @@ struct ieee80211_mgmt {
+ 					u8 dialog_token;
+ 					u8 status_code;
+ 					u8 variable[0];
+-				} __attribute__ ((packed)) wme_action;
++				} __packed wme_action;
+ 				struct{
+ 					u8 action_code;
+ 					u8 element_id;
+ 					u8 length;
+ 					struct ieee80211_channel_sw_ie sw_elem;
+-				} __attribute__((packed)) chan_switch;
++				} __packed chan_switch;
+ 				struct{
+ 					u8 action_code;
+ 					u8 dialog_token;
+ 					u8 element_id;
+ 					u8 length;
+ 					struct ieee80211_msrment_ie msr_elem;
+-				} __attribute__((packed)) measurement;
++				} __packed measurement;
+ 				struct{
+ 					u8 action_code;
+ 					u8 dialog_token;
+ 					__le16 capab;
+ 					__le16 timeout;
+ 					__le16 start_seq_num;
+-				} __attribute__((packed)) addba_req;
++				} __packed addba_req;
+ 				struct{
+ 					u8 action_code;
+ 					u8 dialog_token;
+ 					__le16 status;
+ 					__le16 capab;
+ 					__le16 timeout;
+-				} __attribute__((packed)) addba_resp;
++				} __packed addba_resp;
+ 				struct{
+ 					u8 action_code;
+ 					__le16 params;
+ 					__le16 reason_code;
+-				} __attribute__((packed)) delba;
++				} __packed delba;
+ 				struct {
+ 					u8 action_code;
+ 					u8 variable[0];
+-				} __attribute__((packed)) self_prot;
++				} __packed self_prot;
+ 				struct{
+ 					u8 action_code;
+ 					u8 variable[0];
+-				} __attribute__((packed)) mesh_action;
++				} __packed mesh_action;
+ 				struct {
+ 					u8 action;
+ 					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
+-				} __attribute__ ((packed)) sa_query;
++				} __packed sa_query;
+ 				struct {
+ 					u8 action;
+ 					u8 smps_control;
+-				} __attribute__ ((packed)) ht_smps;
++				} __packed ht_smps;
+ 				struct {
+ 					u8 action_code;
+ 					u8 dialog_token;
+@@ -828,9 +828,9 @@ struct ieee80211_mgmt {
+ 					u8 variable[0];
+ 				} __packed tdls_discover_resp;
+ 			} u;
+-		} __attribute__ ((packed)) action;
++		} __packed action;
+ 	} u;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
+ #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
+@@ -846,7 +846,7 @@ struct ieee80211_mmie {
+ 	__le16 key_id;
+ 	u8 sequence_number[6];
+ 	u8 mic[8];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ struct ieee80211_vendor_ie {
+ 	u8 element_id;
+@@ -861,20 +861,20 @@ struct ieee80211_rts {
+ 	__le16 duration;
+ 	u8 ra[6];
+ 	u8 ta[6];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ struct ieee80211_cts {
+ 	__le16 frame_control;
+ 	__le16 duration;
+ 	u8 ra[6];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ struct ieee80211_pspoll {
+ 	__le16 frame_control;
+ 	__le16 aid;
+ 	u8 bssid[6];
+ 	u8 ta[6];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /* TDLS */
+ 
+@@ -967,7 +967,7 @@ struct ieee80211_bar {
+ 	__u8 ta[6];
+ 	__le16 control;
+ 	__le16 start_seq_num;
+-} __attribute__((packed));
++} __packed;
+ 
+ /* 802.11 BAR control masks */
+ #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000
+@@ -992,7 +992,7 @@ struct ieee80211_mcs_info {
+ 	__le16 rx_highest;
+ 	u8 tx_params;
+ 	u8 reserved[3];
+-} __attribute__((packed));
++} __packed;
+ 
+ /* 802.11n HT capability MSC set */
+ #define IEEE80211_HT_MCS_RX_HIGHEST_MASK	0x3ff
+@@ -1031,7 +1031,7 @@ struct ieee80211_ht_cap {
+ 	__le16 extended_ht_cap_info;
+ 	__le32 tx_BF_cap_info;
+ 	u8 antenna_selection_info;
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /* 802.11n HT capabilities masks (for cap_info) */
+ #define IEEE80211_HT_CAP_LDPC_CODING		0x0001
+@@ -1102,7 +1102,7 @@ struct ieee80211_ht_operation {
+ 	__le16 operation_mode;
+ 	__le16 stbc_param;
+ 	u8 basic_set[16];
+-} __attribute__ ((packed));
++} __packed;
+ 
+ /* for ht_param */
+ #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET		0x03
+@@ -1832,14 +1832,14 @@ struct ieee80211_country_ie_triplet {
+ 			u8 first_channel;
+ 			u8 num_channels;
+ 			s8 max_power;
+-		} __attribute__ ((packed)) chans;
++		} __packed chans;
+ 		struct {
+ 			u8 reg_extension_id;
+ 			u8 reg_class;
+ 			u8 coverage_class;
+-		} __attribute__ ((packed)) ext;
++		} __packed ext;
+ 	};
+-} __attribute__ ((packed));
++} __packed;
+ 
+ enum ieee80211_timeout_interval_type {
+ 	WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -1256,7 +1256,7 @@ struct cfg80211_bss {
+ 
+ 	u8 bssid[ETH_ALEN];
+ 
+-	u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
++	u8 priv[0] __aligned(sizeof(void *));
+ };
+ 
+ /**
+@@ -2395,7 +2395,7 @@ struct wiphy {
+ 	const struct iw_handler_def *wext;
+ #endif
+ 
+-	char priv[0] __attribute__((__aligned__(NETDEV_ALIGN)));
++	char priv[0] __aligned(NETDEV_ALIGN);
+ };
+ 
+ static inline struct net *wiphy_net(struct wiphy *wiphy)
+--- a/net/wireless/core.h
++++ b/net/wireless/core.h
+@@ -86,7 +86,7 @@ struct cfg80211_registered_device {
+ 
+ 	/* must be last because of the way we do wiphy_priv(),
+ 	 * and it should at least be aligned to NETDEV_ALIGN */
+-	struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN)));
++	struct wiphy wiphy __aligned(NETDEV_ALIGN);
+ };
+ 
+ static inline
diff --git a/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch b/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch
new file mode 100644
index 0000000000..6b62d12b42
--- /dev/null
+++ b/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch
@@ -0,0 +1,71 @@
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -180,7 +180,7 @@ struct ieee80211_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	u8 addr4[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_hdr_3addr {
+ 	__le16 frame_control;
+@@ -189,7 +189,7 @@ struct ieee80211_hdr_3addr {
+ 	u8 addr2[6];
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_qos_hdr {
+ 	__le16 frame_control;
+@@ -199,7 +199,7 @@ struct ieee80211_qos_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	__le16 qos_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ 
+ /**
+  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+@@ -576,7 +576,7 @@ struct ieee80211s_hdr {
+ 	__le32 seqnum;
+ 	u8 eaddr1[6];
+ 	u8 eaddr2[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* Mesh flags */
+ #define MESH_FLAGS_AE_A4 	0x1
+@@ -830,7 +830,7 @@ struct ieee80211_mgmt {
+ 			} u;
+ 		} __packed action;
+ 	} u;
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
+ #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
+@@ -861,20 +861,20 @@ struct ieee80211_rts {
+ 	__le16 duration;
+ 	u8 ra[6];
+ 	u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_cts {
+ 	__le16 frame_control;
+ 	__le16 duration;
+ 	u8 ra[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_pspoll {
+ 	__le16 frame_control;
+ 	__le16 aid;
+ 	u8 bssid[6];
+ 	u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* TDLS */
+ 
-- 
2.30.2