diff options
author | Sujith <Sujith.Manoharan@atheros.com> | 2010-04-16 02:24:03 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-16 15:47:13 -0400 |
commit | 7f1f5a0060e377ff6a15903487b39223e12b8568 (patch) | |
tree | 786e3960018d685473d7c14f6c48b8fc580344f2 | |
parent | 6ce34ec11c6297562e70e27c57a24cd27d4cd2b1 (diff) |
ath9k_htc: Fix sparse endian warnings
This patch fixes a bunch of endian issues that
were exposed by sparse. It's a miracle that the driver
worked at all till now.
The Lord be praised.
Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc.h | 18 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_hst.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_hst.h | 24 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.h | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/wmi.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/wmi.h | 10 |
9 files changed, 51 insertions, 52 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 6a4614a8701..c765ff4a505 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -124,13 +124,13 @@ struct ath9k_htc_cap_target { | |||
124 | struct ath9k_htc_target_vif { | 124 | struct ath9k_htc_target_vif { |
125 | u8 index; | 125 | u8 index; |
126 | u8 des_bssid[ETH_ALEN]; | 126 | u8 des_bssid[ETH_ALEN]; |
127 | enum htc_opmode opmode; | 127 | __be32 opmode; |
128 | u8 myaddr[ETH_ALEN]; | 128 | u8 myaddr[ETH_ALEN]; |
129 | u8 bssid[ETH_ALEN]; | 129 | u8 bssid[ETH_ALEN]; |
130 | u32 flags; | 130 | u32 flags; |
131 | u32 flags_ext; | 131 | u32 flags_ext; |
132 | u16 ps_sta; | 132 | u16 ps_sta; |
133 | u16 rtsthreshold; | 133 | __be16 rtsthreshold; |
134 | u8 ath_cap; | 134 | u8 ath_cap; |
135 | u8 node; | 135 | u8 node; |
136 | s8 mcast_rate; | 136 | s8 mcast_rate; |
@@ -151,7 +151,7 @@ struct ath9k_htc_target_sta { | |||
151 | u8 sta_index; | 151 | u8 sta_index; |
152 | u8 vif_index; | 152 | u8 vif_index; |
153 | u8 vif_sta; | 153 | u8 vif_sta; |
154 | u16 flags; /* ATH_HTC_STA_* */ | 154 | __be16 flags; /* ATH_HTC_STA_* */ |
155 | u16 htcap; | 155 | u16 htcap; |
156 | u8 valid; | 156 | u8 valid; |
157 | u16 capinfo; | 157 | u16 capinfo; |
@@ -191,16 +191,16 @@ struct ath9k_htc_rate { | |||
191 | struct ath9k_htc_target_rate { | 191 | struct ath9k_htc_target_rate { |
192 | u8 sta_index; | 192 | u8 sta_index; |
193 | u8 isnew; | 193 | u8 isnew; |
194 | u32 capflags; | 194 | __be32 capflags; |
195 | struct ath9k_htc_rate rates; | 195 | struct ath9k_htc_rate rates; |
196 | }; | 196 | }; |
197 | 197 | ||
198 | struct ath9k_htc_target_stats { | 198 | struct ath9k_htc_target_stats { |
199 | u32 tx_shortretry; | 199 | __be32 tx_shortretry; |
200 | u32 tx_longretry; | 200 | __be32 tx_longretry; |
201 | u32 tx_xretries; | 201 | __be32 tx_xretries; |
202 | u32 ht_txunaggr_xretry; | 202 | __be32 ht_txunaggr_xretry; |
203 | u32 ht_tx_xretries; | 203 | __be32 ht_tx_xretries; |
204 | } __packed; | 204 | } __packed; |
205 | 205 | ||
206 | struct ath9k_htc_vif { | 206 | struct ath9k_htc_vif { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index d10402864b7..7cb55f5b071 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | |||
@@ -26,7 +26,8 @@ static void ath9k_htc_beacon_config_sta(struct ath9k_htc_priv *priv, | |||
26 | enum ath9k_int imask = 0; | 26 | enum ath9k_int imask = 0; |
27 | int dtimperiod, dtimcount, sleepduration; | 27 | int dtimperiod, dtimcount, sleepduration; |
28 | int cfpperiod, cfpcount, bmiss_timeout; | 28 | int cfpperiod, cfpcount, bmiss_timeout; |
29 | u32 nexttbtt = 0, intval, tsftu, htc_imask = 0; | 29 | u32 nexttbtt = 0, intval, tsftu; |
30 | __be32 htc_imask = 0; | ||
30 | u64 tsf; | 31 | u64 tsf; |
31 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; | 32 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; |
32 | int ret; | 33 | int ret; |
@@ -142,7 +143,8 @@ static void ath9k_htc_beacon_config_adhoc(struct ath9k_htc_priv *priv, | |||
142 | { | 143 | { |
143 | struct ath_common *common = ath9k_hw_common(priv->ah); | 144 | struct ath_common *common = ath9k_hw_common(priv->ah); |
144 | enum ath9k_int imask = 0; | 145 | enum ath9k_int imask = 0; |
145 | u32 nexttbtt, intval, htc_imask = 0; | 146 | u32 nexttbtt, intval; |
147 | __be32 htc_imask = 0; | ||
146 | int ret; | 148 | int ret; |
147 | u8 cmd_rsp; | 149 | u8 cmd_rsp; |
148 | 150 | ||
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 081f4450428..ec7bcc8696e 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -125,7 +125,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, | |||
125 | bool fastcc = true; | 125 | bool fastcc = true; |
126 | struct ieee80211_channel *channel = hw->conf.channel; | 126 | struct ieee80211_channel *channel = hw->conf.channel; |
127 | enum htc_phymode mode; | 127 | enum htc_phymode mode; |
128 | u16 htc_mode; | 128 | __be16 htc_mode; |
129 | u8 cmd_rsp; | 129 | u8 cmd_rsp; |
130 | int ret; | 130 | int ret; |
131 | 131 | ||
@@ -378,7 +378,7 @@ static int ath9k_htc_init_rate(struct ath9k_htc_priv *priv, | |||
378 | priv->tgt_rate.sta_index = ista->index; | 378 | priv->tgt_rate.sta_index = ista->index; |
379 | priv->tgt_rate.isnew = 1; | 379 | priv->tgt_rate.isnew = 1; |
380 | trate = priv->tgt_rate; | 380 | trate = priv->tgt_rate; |
381 | priv->tgt_rate.capflags = caps; | 381 | priv->tgt_rate.capflags = cpu_to_be32(caps); |
382 | trate.capflags = cpu_to_be32(caps); | 382 | trate.capflags = cpu_to_be32(caps); |
383 | 383 | ||
384 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); | 384 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); |
@@ -426,6 +426,7 @@ static void ath9k_htc_rc_update(struct ath9k_htc_priv *priv, bool is_cw40) | |||
426 | struct ath9k_htc_target_rate trate; | 426 | struct ath9k_htc_target_rate trate; |
427 | struct ath_common *common = ath9k_hw_common(priv->ah); | 427 | struct ath_common *common = ath9k_hw_common(priv->ah); |
428 | int ret; | 428 | int ret; |
429 | u32 caps = be32_to_cpu(priv->tgt_rate.capflags); | ||
429 | u8 cmd_rsp; | 430 | u8 cmd_rsp; |
430 | 431 | ||
431 | memset(&trate, 0, sizeof(trate)); | 432 | memset(&trate, 0, sizeof(trate)); |
@@ -433,11 +434,12 @@ static void ath9k_htc_rc_update(struct ath9k_htc_priv *priv, bool is_cw40) | |||
433 | trate = priv->tgt_rate; | 434 | trate = priv->tgt_rate; |
434 | 435 | ||
435 | if (is_cw40) | 436 | if (is_cw40) |
436 | priv->tgt_rate.capflags |= WLAN_RC_40_FLAG; | 437 | caps |= WLAN_RC_40_FLAG; |
437 | else | 438 | else |
438 | priv->tgt_rate.capflags &= ~WLAN_RC_40_FLAG; | 439 | caps &= ~WLAN_RC_40_FLAG; |
439 | 440 | ||
440 | trate.capflags = cpu_to_be32(priv->tgt_rate.capflags); | 441 | priv->tgt_rate.capflags = cpu_to_be32(caps); |
442 | trate.capflags = cpu_to_be32(caps); | ||
441 | 443 | ||
442 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); | 444 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); |
443 | if (ret) { | 445 | if (ret) { |
@@ -1104,7 +1106,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw) | |||
1104 | struct ath9k_channel *init_channel; | 1106 | struct ath9k_channel *init_channel; |
1105 | int ret = 0; | 1107 | int ret = 0; |
1106 | enum htc_phymode mode; | 1108 | enum htc_phymode mode; |
1107 | u16 htc_mode; | 1109 | __be16 htc_mode; |
1108 | u8 cmd_rsp; | 1110 | u8 cmd_rsp; |
1109 | 1111 | ||
1110 | ath_print(common, ATH_DBG_CONFIG, | 1112 | ath_print(common, ATH_DBG_CONFIG, |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 0a7cb30af5b..2c3c51007dd 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -530,7 +530,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, | |||
530 | priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; | 530 | priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; |
531 | } | 531 | } |
532 | 532 | ||
533 | rx_status->mactime = rxbuf->rxstatus.rs_tstamp; | 533 | rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp); |
534 | rx_status->band = hw->conf.channel->band; | 534 | rx_status->band = hw->conf.channel->band; |
535 | rx_status->freq = hw->conf.channel->center_freq; | 535 | rx_status->freq = hw->conf.channel->center_freq; |
536 | rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR; | 536 | rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR; |
@@ -634,13 +634,8 @@ void ath9k_htc_rxep(void *drv_priv, struct sk_buff *skb, | |||
634 | 634 | ||
635 | rxstatus = (struct ath_htc_rx_status *)skb->data; | 635 | rxstatus = (struct ath_htc_rx_status *)skb->data; |
636 | 636 | ||
637 | rxstatus->rs_tstamp = be64_to_cpu(rxstatus->rs_tstamp); | 637 | if (be16_to_cpu(rxstatus->rs_datalen) - |
638 | rxstatus->rs_datalen = be16_to_cpu(rxstatus->rs_datalen); | 638 | (len - HTC_RX_FRAME_HEADER_SIZE) != 0) { |
639 | rxstatus->evm0 = be32_to_cpu(rxstatus->evm0); | ||
640 | rxstatus->evm1 = be32_to_cpu(rxstatus->evm1); | ||
641 | rxstatus->evm2 = be32_to_cpu(rxstatus->evm2); | ||
642 | |||
643 | if (rxstatus->rs_datalen - (len - HTC_RX_FRAME_HEADER_SIZE) != 0) { | ||
644 | ath_print(common, ATH_DBG_FATAL, | 639 | ath_print(common, ATH_DBG_FATAL, |
645 | "Corrupted RX data len, dropping " | 640 | "Corrupted RX data len, dropping " |
646 | "(epid: %d, dlen: %d, skblen: %d)\n", | 641 | "(epid: %d, dlen: %d, skblen: %d)\n", |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c index 587d98ed098..f2dca258bdc 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.c +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | |||
@@ -368,7 +368,7 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle, | |||
368 | struct htc_frame_hdr *htc_hdr; | 368 | struct htc_frame_hdr *htc_hdr; |
369 | enum htc_endpoint_id epid; | 369 | enum htc_endpoint_id epid; |
370 | struct htc_endpoint *endpoint; | 370 | struct htc_endpoint *endpoint; |
371 | u16 *msg_id; | 371 | __be16 *msg_id; |
372 | 372 | ||
373 | if (!htc_handle || !skb) | 373 | if (!htc_handle || !skb) |
374 | return; | 374 | return; |
@@ -388,14 +388,14 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle, | |||
388 | 388 | ||
389 | /* Handle trailer */ | 389 | /* Handle trailer */ |
390 | if (htc_hdr->flags & HTC_FLAGS_RECV_TRAILER) { | 390 | if (htc_hdr->flags & HTC_FLAGS_RECV_TRAILER) { |
391 | if (be32_to_cpu(*(u32 *) skb->data) == 0x00C60000) | 391 | if (be32_to_cpu(*(__be32 *) skb->data) == 0x00C60000) |
392 | /* Move past the Watchdog pattern */ | 392 | /* Move past the Watchdog pattern */ |
393 | htc_hdr = (struct htc_frame_hdr *)(skb->data + 4); | 393 | htc_hdr = (struct htc_frame_hdr *)(skb->data + 4); |
394 | } | 394 | } |
395 | 395 | ||
396 | /* Get the message ID */ | 396 | /* Get the message ID */ |
397 | msg_id = (u16 *) ((void *) htc_hdr + | 397 | msg_id = (__be16 *) ((void *) htc_hdr + |
398 | sizeof(struct htc_frame_hdr)); | 398 | sizeof(struct htc_frame_hdr)); |
399 | 399 | ||
400 | /* Now process HTC messages */ | 400 | /* Now process HTC messages */ |
401 | switch (be16_to_cpu(*msg_id)) { | 401 | switch (be16_to_cpu(*msg_id)) { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.h b/drivers/net/wireless/ath/ath9k/htc_hst.h index cd7048ffd23..ea50ab032d2 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.h +++ b/drivers/net/wireless/ath/ath9k/htc_hst.h | |||
@@ -59,20 +59,20 @@ enum htc_endpoint_id { | |||
59 | struct htc_frame_hdr { | 59 | struct htc_frame_hdr { |
60 | u8 endpoint_id; | 60 | u8 endpoint_id; |
61 | u8 flags; | 61 | u8 flags; |
62 | u16 payload_len; | 62 | __be16 payload_len; |
63 | u8 control[4]; | 63 | u8 control[4]; |
64 | } __packed; | 64 | } __packed; |
65 | 65 | ||
66 | struct htc_ready_msg { | 66 | struct htc_ready_msg { |
67 | u16 message_id; | 67 | __be16 message_id; |
68 | u16 credits; | 68 | __be16 credits; |
69 | u16 credit_size; | 69 | __be16 credit_size; |
70 | u8 max_endpoints; | 70 | u8 max_endpoints; |
71 | u8 pad; | 71 | u8 pad; |
72 | } __packed; | 72 | } __packed; |
73 | 73 | ||
74 | struct htc_config_pipe_msg { | 74 | struct htc_config_pipe_msg { |
75 | u16 message_id; | 75 | __be16 message_id; |
76 | u8 pipe_id; | 76 | u8 pipe_id; |
77 | u8 credits; | 77 | u8 credits; |
78 | } __packed; | 78 | } __packed; |
@@ -192,9 +192,9 @@ enum htc_service_group_ids{ | |||
192 | #define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 8) | 192 | #define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 8) |
193 | 193 | ||
194 | struct htc_conn_svc_msg { | 194 | struct htc_conn_svc_msg { |
195 | u16 msg_id; | 195 | __be16 msg_id; |
196 | u16 service_id; | 196 | __be16 service_id; |
197 | u16 con_flags; | 197 | __be16 con_flags; |
198 | u8 dl_pipeid; | 198 | u8 dl_pipeid; |
199 | u8 ul_pipeid; | 199 | u8 ul_pipeid; |
200 | u8 svc_meta_len; | 200 | u8 svc_meta_len; |
@@ -209,17 +209,17 @@ struct htc_conn_svc_msg { | |||
209 | #define HTC_SERVICE_NO_MORE_EP 4 | 209 | #define HTC_SERVICE_NO_MORE_EP 4 |
210 | 210 | ||
211 | struct htc_conn_svc_rspmsg { | 211 | struct htc_conn_svc_rspmsg { |
212 | u16 msg_id; | 212 | __be16 msg_id; |
213 | u16 service_id; | 213 | __be16 service_id; |
214 | u8 status; | 214 | u8 status; |
215 | u8 endpoint_id; | 215 | u8 endpoint_id; |
216 | u16 max_msg_len; | 216 | __be16 max_msg_len; |
217 | u8 svc_meta_len; | 217 | u8 svc_meta_len; |
218 | u8 pad; | 218 | u8 pad; |
219 | } __packed; | 219 | } __packed; |
220 | 220 | ||
221 | struct htc_comp_msg { | 221 | struct htc_comp_msg { |
222 | u16 msg_id; | 222 | __be16 msg_id; |
223 | } __packed; | 223 | } __packed; |
224 | 224 | ||
225 | int htc_init(struct htc_target *target); | 225 | int htc_init(struct htc_target *target); |
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index 68eb8d0b92e..66d0d5e5614 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h | |||
@@ -155,8 +155,8 @@ struct ath_rx_status { | |||
155 | }; | 155 | }; |
156 | 156 | ||
157 | struct ath_htc_rx_status { | 157 | struct ath_htc_rx_status { |
158 | u64 rs_tstamp; | 158 | __be64 rs_tstamp; |
159 | u16 rs_datalen; | 159 | __be16 rs_datalen; |
160 | u8 rs_status; | 160 | u8 rs_status; |
161 | u8 rs_phyerr; | 161 | u8 rs_phyerr; |
162 | int8_t rs_rssi; | 162 | int8_t rs_rssi; |
@@ -175,9 +175,9 @@ struct ath_htc_rx_status { | |||
175 | u8 rs_num_delims; | 175 | u8 rs_num_delims; |
176 | u8 rs_flags; | 176 | u8 rs_flags; |
177 | u8 rs_dummy; | 177 | u8 rs_dummy; |
178 | u32 evm0; | 178 | __be32 evm0; |
179 | u32 evm1; | 179 | __be32 evm1; |
180 | u32 evm2; | 180 | __be32 evm2; |
181 | }; | 181 | }; |
182 | 182 | ||
183 | #define ATH9K_RXERR_CRC 0x01 | 183 | #define ATH9K_RXERR_CRC 0x01 |
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c index afbf63daf55..dc6c6fc2e09 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.c +++ b/drivers/net/wireless/ath/ath9k/wmi.c | |||
@@ -129,7 +129,7 @@ void ath9k_wmi_tasklet(unsigned long data) | |||
129 | void *wmi_event; | 129 | void *wmi_event; |
130 | unsigned long flags; | 130 | unsigned long flags; |
131 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS | 131 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS |
132 | u32 txrate; | 132 | __be32 txrate; |
133 | #endif | 133 | #endif |
134 | 134 | ||
135 | spin_lock_irqsave(&priv->wmi->wmi_lock, flags); | 135 | spin_lock_irqsave(&priv->wmi->wmi_lock, flags); |
diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h index 611357158ec..167e15c5006 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.h +++ b/drivers/net/wireless/ath/ath9k/wmi.h | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | 20 | ||
21 | struct wmi_event_txrate { | 21 | struct wmi_event_txrate { |
22 | u32 txrate; | 22 | __be32 txrate; |
23 | struct { | 23 | struct { |
24 | u8 rssi_thresh; | 24 | u8 rssi_thresh; |
25 | u8 per; | 25 | u8 per; |
@@ -27,8 +27,8 @@ struct wmi_event_txrate { | |||
27 | } __packed; | 27 | } __packed; |
28 | 28 | ||
29 | struct wmi_cmd_hdr { | 29 | struct wmi_cmd_hdr { |
30 | u16 command_id; | 30 | __be16 command_id; |
31 | u16 seq_no; | 31 | __be16 seq_no; |
32 | } __packed; | 32 | } __packed; |
33 | 33 | ||
34 | struct wmi_swba { | 34 | struct wmi_swba { |
@@ -87,8 +87,8 @@ enum wmi_event_id { | |||
87 | #define MAX_CMD_NUMBER 62 | 87 | #define MAX_CMD_NUMBER 62 |
88 | 88 | ||
89 | struct register_write { | 89 | struct register_write { |
90 | u32 reg; | 90 | __be32 reg; |
91 | u32 val; | 91 | __be32 val; |
92 | }; | 92 | }; |
93 | 93 | ||
94 | struct wmi { | 94 | struct wmi { |