Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Jan 2015 23:53:57 +0000 (UTC)
From:      Will Andrews <will@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r277622 - head/sys/boot/i386/libfirewire
Message-ID:  <201501232353.t0NNrvpq086574@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: will
Date: Fri Jan 23 23:53:56 2015
New Revision: 277622
URL: https://svnweb.freebsd.org/changeset/base/277622

Log:
  Fix panic in firewire and creation of invalid config ROM.
  (This change was supposed to be included in r277508.)
  
  sys/boot/i386/libfirewire/firewire.c:
  	Fix configuration ROM generation count wrapping logic
  	so that the generation count is never outside of
  	allowed limits (0x2 -> 0xF).
  
  Submitted by:	gibbs
  MFC after:	1 week
  MFC with:	277508
  Sponsored by:	Spectra Logic
  MFSpectraBSD:	1110685 on 2015/01/05

Modified:
  head/sys/boot/i386/libfirewire/firewire.c

Modified: head/sys/boot/i386/libfirewire/firewire.c
==============================================================================
--- head/sys/boot/i386/libfirewire/firewire.c	Fri Jan 23 23:52:33 2015	(r277621)
+++ head/sys/boot/i386/libfirewire/firewire.c	Fri Jan 23 23:53:56 2015	(r277622)
@@ -233,7 +233,8 @@ fw_init_crom(struct fwohci_softc *sc)
 	src->businfo.cyc_clk_acc = 100;
 	src->businfo.max_rec = sc->maxrec;
 	src->businfo.max_rom = MAXROM_4;
-	src->businfo.generation = 1;
+#define FW_GENERATION_CHANGEABLE 2
+	src->businfo.generation = FW_GENERATION_CHANGEABLE;
 	src->businfo.link_spd = sc->speed;
 
 	src->businfo.eui64.hi = sc->eui.hi;
@@ -313,11 +314,14 @@ fw_crom(struct fwohci_softc *sc)
 	src = &sc->crom_src_buf->src;
 	crom_load(src, (uint32_t *)newrom, CROMSIZE);
 	if (bcmp(newrom, sc->config_rom, CROMSIZE) != 0) {
-		/* bump generation and reload */
-		src->businfo.generation ++;
-		/* generation must be between 0x2 and 0xF */
+		/* Bump generation and reload. */
+		src->businfo.generation++;
+
+		/* Handle generation count wraps. */
 		if (src->businfo.generation < 2)
-			src->businfo.generation ++;
+			src->businfo.generation = 2;
+
+		/* Recalculate CRC to account for generation change. */
 		crom_load(src, (uint32_t *)newrom, CROMSIZE);
 		bcopy(newrom, (void *)sc->config_rom, CROMSIZE);
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501232353.t0NNrvpq086574>