summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2020-01-01 14:02:21 +0200
committerJohn Levon <john.levon@joyent.com>2020-05-07 10:30:55 +0000
commit8b060f27d51443a3976a23084f8009f35610b60a (patch)
tree7e7971fb9461ae42eab48a0d89a65c7de157424e
parent480524e999ecc44012be28e9d4a70c8d47e98dbf (diff)
downloadillumos-joyent-8b060f27d51443a3976a23084f8009f35610b60a.tar.gz
iwn: variable may be used uninitialized
../../common/io/iwn/if_iwn.c: In function 'iwn_fatal_intr': ../../common/io/iwn/if_iwn.c:3247:6: error: converting a packed 'struct iwn_fw_dump' pointer (alignment 1) to a 'uint32_t' {aka 'unsigned int'} pointer (alignment 4) may result in an unaligned pointer value [-Werror=address-of-packed-member] 3247 | sizeof (dump) / sizeof (uint32_t)); | ^~~~~~ In file included from ../../common/io/iwn/if_iwn.c:77: ../../common/io/iwn/if_iwnreg.h:1464:8: note: defined here 1464 | struct iwn_fw_dump { | ^~~~~~~~~~~ cc1: all warnings being treated as errors Change-Id: Iad2c207cdf95627b6b07bd8e9895ecff85f8127e
-rw-r--r--usr/src/uts/common/io/iwn/if_iwn.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/usr/src/uts/common/io/iwn/if_iwn.c b/usr/src/uts/common/io/iwn/if_iwn.c
index 8c55f2d7ad..b5611c0a91 100644
--- a/usr/src/uts/common/io/iwn/if_iwn.c
+++ b/usr/src/uts/common/io/iwn/if_iwn.c
@@ -3222,7 +3222,9 @@ iwn_wakeup_intr(struct iwn_softc *sc)
static void
iwn_fatal_intr(struct iwn_softc *sc)
{
- struct iwn_fw_dump dump;
+ struct iwn_fw_dump *dump;
+ uint32_t buf[P2ROUNDUP(sizeof (*dump), sizeof (uint32_t)) /
+ sizeof (uint32_t)];
int i;
/* Force a complete recalibration on next init. */
@@ -3242,31 +3244,30 @@ iwn_fatal_intr(struct iwn_softc *sc)
return;
}
/* Read firmware error log from SRAM. */
-#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
- iwn_mem_read_region_4(sc, sc->errptr, (uint32_t *)&dump,
- sizeof (dump) / sizeof (uint32_t));
+ dump = (struct iwn_fw_dump *)buf;
+ iwn_mem_read_region_4(sc, sc->errptr, buf, sizeof (buf));
iwn_nic_unlock(sc);
- if (dump.valid == 0) {
+ if (dump->valid == 0) {
dev_err(sc->sc_dip, CE_WARN,
"!firmware error log is empty");
return;
}
dev_err(sc->sc_dip, CE_WARN, "!firmware error log:");
dev_err(sc->sc_dip, CE_CONT, "! error type = \"%s\" (0x%08X)",
- (dump.id < __arraycount(iwn_fw_errmsg)) ?
- iwn_fw_errmsg[dump.id] : "UNKNOWN",
- dump.id);
- dev_err(sc->sc_dip, CE_CONT, "! program counter = 0x%08X", dump.pc);
+ (dump->id < __arraycount(iwn_fw_errmsg)) ?
+ iwn_fw_errmsg[dump->id] : "UNKNOWN",
+ dump->id);
+ dev_err(sc->sc_dip, CE_CONT, "! program counter = 0x%08X", dump->pc);
dev_err(sc->sc_dip, CE_CONT, "! source line = 0x%08X",
- dump.src_line);
+ dump->src_line);
dev_err(sc->sc_dip, CE_CONT, "! error data = 0x%08X%08X",
- dump.error_data[0], dump.error_data[1]);
+ dump->error_data[0], dump->error_data[1]);
dev_err(sc->sc_dip, CE_CONT, "! branch link = 0x%08X%08X",
- dump.branch_link[0], dump.branch_link[1]);
+ dump->branch_link[0], dump->branch_link[1]);
dev_err(sc->sc_dip, CE_CONT, "! interrupt link = 0x%08X%08X",
- dump.interrupt_link[0], dump.interrupt_link[1]);
- dev_err(sc->sc_dip, CE_CONT, "! time = %u", dump.time[0]);
+ dump->interrupt_link[0], dump->interrupt_link[1]);
+ dev_err(sc->sc_dip, CE_CONT, "! time = %u", dump->time[0]);
/* Dump driver status (TX and RX rings) while we're here. */
dev_err(sc->sc_dip, CE_WARN, "!driver status:");