[PATCH v2] libertas: Fix alignment issues in libertas core
Erwin Authried
eauth at softsys.co.at
Wed Jan 28 03:34:31 EST 2009
is it really necessary to pack all structures in hostcmd.h? The "packed"
attribute makes the code larger and slower. I have changed the order in
the lbs_private structure in dev.h a little bit so that resp_buf is on a
32-bit boundary. Then, I have removed most of the packed attributes in
hostcmd.h (where all 16 or 32-bit Variables are on 16/32 bit boundaries
anyway). The libertas module is a bit smaller, and I haven't seen any
problem.
-Erwin
Am Montag, den 12.01.2009, 13:14 -0800 schrieb Andrey Yurovsky:
> Data structures that come over the wire from the WLAN firmware must be packed.
> This fixes alignment problems on the blackfin architecture and, reportedly, on
> the AVR32.
>
> This is a replacement for the previous version of this patch which had also
> explicitly used get_unaligned_ macros. As Johannes Berg pointed out, these
> macros were unnecessary.
>
> Signed-off-by: Andrey Yurovsky <andrey at cozybit.com>
> Signed-off-by: Colin McCabe <colin at cozybit.com>
> diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
> index 2d8533c..a899aeb 100644
> --- a/drivers/net/wireless/libertas/hostcmd.h
> +++ b/drivers/net/wireless/libertas/hostcmd.h
> @@ -32,7 +32,7 @@ struct txpd {
> u8 pktdelay_2ms;
> /* reserved */
> u8 reserved1;
> -};
> +} __attribute__ ((packed));
>
> /* RxPD Descriptor */
> struct rxpd {
> @@ -63,7 +63,7 @@ struct rxpd {
> /* Pkt Priority */
> u8 priority;
> u8 reserved[3];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_header {
> __le16 command;
> @@ -97,7 +97,7 @@ struct enc_key {
> struct lbs_offset_value {
> u32 offset;
> u32 value;
> -};
> +} __attribute__ ((packed));
>
> /* Define general data structure */
> /* cmd_DS_GEN */
> @@ -107,7 +107,7 @@ struct cmd_ds_gen {
> __le16 seqnum;
> __le16 result;
> void *cmdresp[0];
> -};
> +} __attribute__ ((packed));
>
> #define S_DS_GEN sizeof(struct cmd_ds_gen)
>
> @@ -163,7 +163,7 @@ struct cmd_ds_802_11_subscribe_event {
> * bump this up a bit.
> */
> uint8_t tlv[128];
> -};
> +} __attribute__ ((packed));
>
> /*
> * This scan handle Country Information IE(802.11d compliant)
> @@ -180,7 +180,7 @@ struct cmd_ds_802_11_scan {
> mrvlietypes_chanlistparamset_t ChanListParamSet;
> mrvlietypes_ratesparamset_t OpRateSet;
> #endif
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_scan_rsp {
> struct cmd_header hdr;
> @@ -188,7 +188,7 @@ struct cmd_ds_802_11_scan_rsp {
> __le16 bssdescriptsize;
> uint8_t nr_sets;
> uint8_t bssdesc_and_tlvbuffer[0];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_get_log {
> struct cmd_header hdr;
> @@ -206,20 +206,20 @@ struct cmd_ds_802_11_get_log {
> __le32 fcserror;
> __le32 txframe;
> __le32 wepundecryptable;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_mac_control {
> struct cmd_header hdr;
> __le16 action;
> u16 reserved;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_mac_multicast_adr {
> struct cmd_header hdr;
> __le16 action;
> __le16 nr_of_adrs;
> u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_gspi_bus_config {
> struct cmd_header hdr;
> @@ -233,14 +233,14 @@ struct cmd_ds_802_11_authenticate {
> u8 macaddr[ETH_ALEN];
> u8 authtype;
> u8 reserved[10];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_deauthenticate {
> struct cmd_header hdr;
>
> u8 macaddr[ETH_ALEN];
> __le16 reasoncode;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_associate {
> u8 peerstaaddr[6];
> @@ -259,7 +259,7 @@ struct cmd_ds_802_11_associate {
>
> struct cmd_ds_802_11_associate_rsp {
> struct ieeetypes_assocrsp assocRsp;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_set_wep {
> struct cmd_header hdr;
> @@ -273,7 +273,7 @@ struct cmd_ds_802_11_set_wep {
> /* 40, 128bit or TXWEP */
> uint8_t keytype[4];
> uint8_t keymaterial[4][16];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_3_get_stat {
> __le32 xmitok;
> @@ -282,7 +282,7 @@ struct cmd_ds_802_3_get_stat {
> __le32 rcverror;
> __le32 rcvnobuffer;
> __le32 rcvcrcerror;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_get_stat {
> __le32 txfragmentcnt;
> @@ -302,7 +302,7 @@ struct cmd_ds_802_11_get_stat {
> __le32 txbeacon;
> __le32 rxbeacon;
> __le32 wepundecryptable;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_snmp_mib {
> struct cmd_header hdr;
> @@ -311,58 +311,58 @@ struct cmd_ds_802_11_snmp_mib {
> __le16 oid;
> __le16 bufsize;
> u8 value[128];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_mac_reg_map {
> __le16 buffersize;
> u8 regmap[128];
> __le16 reserved;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_bbp_reg_map {
> __le16 buffersize;
> u8 regmap[128];
> __le16 reserved;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_rf_reg_map {
> __le16 buffersize;
> u8 regmap[64];
> __le16 reserved;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_mac_reg_access {
> __le16 action;
> __le16 offset;
> __le32 value;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_bbp_reg_access {
> __le16 action;
> __le16 offset;
> u8 value;
> u8 reserved[3];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_rf_reg_access {
> __le16 action;
> __le16 offset;
> u8 value;
> u8 reserved[3];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_radio_control {
> struct cmd_header hdr;
>
> __le16 action;
> __le16 control;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_beacon_control {
> __le16 action;
> __le16 beacon_enable;
> __le16 beacon_period;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_sleep_params {
> struct cmd_header hdr;
> @@ -387,7 +387,7 @@ struct cmd_ds_802_11_sleep_params {
>
> /* reserved field, should be set to zero */
> __le16 reserved;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_inactivity_timeout {
> struct cmd_header hdr;
> @@ -397,7 +397,7 @@ struct cmd_ds_802_11_inactivity_timeout {
>
> /* Inactivity timeout in msec */
> __le16 timeout;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rf_channel {
> struct cmd_header hdr;
> @@ -407,7 +407,7 @@ struct cmd_ds_802_11_rf_channel {
> __le16 rftype; /* unused */
> __le16 reserved; /* unused */
> u8 channellist[32]; /* unused */
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rssi {
> /* weighting factor */
> @@ -416,21 +416,21 @@ struct cmd_ds_802_11_rssi {
> __le16 reserved_0;
> __le16 reserved_1;
> __le16 reserved_2;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rssi_rsp {
> __le16 SNR;
> __le16 noisefloor;
> __le16 avgSNR;
> __le16 avgnoisefloor;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_mac_address {
> struct cmd_header hdr;
>
> __le16 action;
> u8 macadd[ETH_ALEN];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rf_tx_power {
> struct cmd_header hdr;
> @@ -439,7 +439,7 @@ struct cmd_ds_802_11_rf_tx_power {
> __le16 curlevel;
> s8 maxlevel;
> s8 minlevel;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rf_antenna {
> __le16 action;
> @@ -447,33 +447,33 @@ struct cmd_ds_802_11_rf_antenna {
> /* Number of antennas or 0xffff(diversity) */
> __le16 antennamode;
>
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_monitor_mode {
> __le16 action;
> __le16 mode;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_set_boot2_ver {
> struct cmd_header hdr;
>
> __le16 action;
> __le16 version;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_fw_wake_method {
> struct cmd_header hdr;
>
> __le16 action;
> __le16 method;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_sleep_period {
> struct cmd_header hdr;
>
> __le16 action;
> __le16 period;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_ps_mode {
> __le16 action;
> @@ -481,7 +481,7 @@ struct cmd_ds_802_11_ps_mode {
> __le16 multipledtim;
> __le16 reserved;
> __le16 locallisteninterval;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_confirm_sleep {
> struct cmd_header hdr;
> @@ -491,7 +491,7 @@ struct cmd_confirm_sleep {
> __le16 multipledtim;
> __le16 reserved;
> __le16 locallisteninterval;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_data_rate {
> struct cmd_header hdr;
> @@ -499,14 +499,14 @@ struct cmd_ds_802_11_data_rate {
> __le16 action;
> __le16 reserved;
> u8 rates[MAX_RATES];
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_rate_adapt_rateset {
> struct cmd_header hdr;
> __le16 action;
> __le16 enablehwauto;
> __le16 bitmap;
> -};
> +} __attribute__ ((packed));
>
> struct cmd_ds_802_11_ad_hoc_start {
> struct cmd_header hdr;
> @@ -528,7 +528,7 @@ struct cmd_ds_802_11_ad_hoc_result {
>
> u8 pad[3];
> u8 bssid[ETH_ALEN];
> -};
> +} __attribute__ ((packed));
>
> struct adhoc_bssdesc {
> u8 bssid[ETH_ALEN];
> @@ -586,7 +586,7 @@ struct MrvlIEtype_keyParamSet {
>
> /* key material of size keylen */
> u8 key[32];
> -};
> +} __attribute__ ((packed));
>
> #define MAX_WOL_RULES 16
>
> @@ -598,7 +598,7 @@ struct host_wol_rule {
> __le16 reserve;
> __be32 sig_mask;
> __be32 signature;
> -};
> +} __attribute__ ((packed));
>
> struct wol_config {
> uint8_t action;
> @@ -606,8 +606,7 @@ struct wol_config {
> uint8_t no_rules_in_cmd;
> uint8_t result;
> struct host_wol_rule rule[MAX_WOL_RULES];
> -};
> -
> +} __attribute__ ((packed));
>
> struct cmd_ds_host_sleep {
> struct cmd_header hdr;
>
>
>
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
--
Dipl.-Ing. Erwin Authried
Softwareentwicklung und Systemdesign
More information about the libertas-dev
mailing list