|
@@ -42,6 +42,7 @@
|
|
|
#include <linux/workqueue.h>
|
|
|
#include <linux/proc_fs.h>
|
|
|
#include <linux/rtnetlink.h>
|
|
|
+#include <linux/firmware.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
|
|
|
#include "common.h"
|
|
@@ -707,6 +708,28 @@ static void bind_qsets(struct adapter *adap)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#define FW_FNAME "t3fw-%d.%d.bin"
|
|
|
+
|
|
|
+static int upgrade_fw(struct adapter *adap)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ char buf[64];
|
|
|
+ const struct firmware *fw;
|
|
|
+ struct device *dev = &adap->pdev->dev;
|
|
|
+
|
|
|
+ snprintf(buf, sizeof(buf), FW_FNAME, FW_VERSION_MAJOR,
|
|
|
+ FW_VERSION_MINOR);
|
|
|
+ ret = request_firmware(&fw, buf, dev);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(dev, "could not upgrade firmware: unable to load %s\n",
|
|
|
+ buf);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ ret = t3_load_fw(adap, fw->data, fw->size);
|
|
|
+ release_firmware(fw);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* cxgb_up - enable the adapter
|
|
|
* @adapter: adapter being enabled
|
|
@@ -723,6 +746,8 @@ static int cxgb_up(struct adapter *adap)
|
|
|
|
|
|
if (!(adap->flags & FULL_INIT_DONE)) {
|
|
|
err = t3_check_fw_version(adap);
|
|
|
+ if (err == -EINVAL)
|
|
|
+ err = upgrade_fw(adap);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|