From owner-svn-src-all@FreeBSD.ORG Sat Mar 5 03:12:51 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 066C6106564A; Sat, 5 Mar 2011 03:12:51 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E8A5F8FC14; Sat, 5 Mar 2011 03:12:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p253CoeV097119; Sat, 5 Mar 2011 03:12:50 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p253CoAo097116; Sat, 5 Mar 2011 03:12:50 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201103050312.p253CoAo097116@svn.freebsd.org> From: Navdeep Parhar Date: Sat, 5 Mar 2011 03:12:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219287 - in head/sys/dev/cxgbe: . common X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Mar 2011 03:12:51 -0000 Author: np Date: Sat Mar 5 03:12:50 2011 New Revision: 219287 URL: http://svn.freebsd.org/changeset/base/219287 Log: Upgrade the firmware on the card automatically if a better version is available. Downgrade only for a major version mismatch. MFC after: 1 week Modified: head/sys/dev/cxgbe/common/common.h head/sys/dev/cxgbe/t4_main.c Modified: head/sys/dev/cxgbe/common/common.h ============================================================================== --- head/sys/dev/cxgbe/common/common.h Sat Mar 5 03:06:38 2011 (r219286) +++ head/sys/dev/cxgbe/common/common.h Sat Mar 5 03:12:50 2011 (r219287) @@ -53,8 +53,8 @@ enum { }; #define FW_VERSION_MAJOR 1 -#define FW_VERSION_MINOR 2 -#define FW_VERSION_MICRO 65 +#define FW_VERSION_MINOR 3 +#define FW_VERSION_MICRO 0 struct port_stats { u64 tx_octets; /* total # of octets in good frames */ Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Sat Mar 5 03:06:38 2011 (r219286) +++ head/sys/dev/cxgbe/t4_main.c Sat Mar 5 03:12:50 2011 (r219287) @@ -1256,28 +1256,69 @@ prep_firmware(struct adapter *sc) /* Check firmware version and install a different one if necessary */ rc = t4_check_fw_version(sc); if (rc != 0 || force_firmware_install) { + uint32_t v = 0; fw = firmware_get(T4_FWNAME); - if (fw == NULL) { - device_printf(sc->dev, - "Could not find firmware image %s\n", T4_FWNAME); - return (ENOENT); + if (fw != NULL) { + const struct fw_hdr *hdr = (const void *)fw->data; + + v = ntohl(hdr->fw_ver); + + /* + * The firmware module will not be used if it isn't the + * same major version as what the driver was compiled + * with. This check trumps force_firmware_install. + */ + if (G_FW_HDR_FW_VER_MAJOR(v) != FW_VERSION_MAJOR) { + device_printf(sc->dev, + "Found firmware image but version %d " + "can not be used with this driver (%d)\n", + G_FW_HDR_FW_VER_MAJOR(v), FW_VERSION_MAJOR); + + firmware_put(fw, FIRMWARE_UNLOAD); + fw = NULL; + } } - device_printf(sc->dev, - "installing firmware %d.%d.%d on card.\n", - FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); - rc = -t4_load_fw(sc, fw->data, fw->datasize); - if (rc != 0) { + if (fw == NULL && (rc < 0 || force_firmware_install)) { + device_printf(sc->dev, "No usable firmware. " + "card has %d.%d.%d, driver compiled with %d.%d.%d, " + "force_firmware_install%s set", + G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), + FW_VERSION_MAJOR, FW_VERSION_MINOR, + FW_VERSION_MICRO, + force_firmware_install ? "" : " not"); + return (EAGAIN); + } + + /* + * Always upgrade, even for minor/micro/build mismatches. + * Downgrade only for a major version mismatch or if + * force_firmware_install was specified. + */ + if (fw != NULL && (rc < 0 || force_firmware_install || + v > sc->params.fw_vers)) { device_printf(sc->dev, - "failed to install firmware: %d\n", rc); - return (rc); - } else { - t4_get_fw_version(sc, &sc->params.fw_vers); - t4_get_tp_version(sc, &sc->params.tp_vers); + "installing firmware %d.%d.%d.%d on card.\n", + G_FW_HDR_FW_VER_MAJOR(v), G_FW_HDR_FW_VER_MINOR(v), + G_FW_HDR_FW_VER_MICRO(v), G_FW_HDR_FW_VER_BUILD(v)); + + rc = -t4_load_fw(sc, fw->data, fw->datasize); + if (rc != 0) { + device_printf(sc->dev, + "failed to install firmware: %d\n", rc); + firmware_put(fw, FIRMWARE_UNLOAD); + return (rc); + } else { + /* refresh */ + (void) t4_check_fw_version(sc); + } } - firmware_put(fw, FIRMWARE_UNLOAD); + if (fw != NULL) + firmware_put(fw, FIRMWARE_UNLOAD); } /* Contact firmware, request master */