|
@@ -1288,7 +1288,7 @@ error_dev_rebooted:
|
|
*/
|
|
*/
|
|
int i2400m_dev_bootstrap(struct i2400m *i2400m, enum i2400m_bri flags)
|
|
int i2400m_dev_bootstrap(struct i2400m *i2400m, enum i2400m_bri flags)
|
|
{
|
|
{
|
|
- int ret = 0, itr = 0;
|
|
|
|
|
|
+ int ret, itr;
|
|
struct device *dev = i2400m_dev(i2400m);
|
|
struct device *dev = i2400m_dev(i2400m);
|
|
const struct firmware *fw;
|
|
const struct firmware *fw;
|
|
const struct i2400m_bcf_hdr *bcf; /* Firmware data */
|
|
const struct i2400m_bcf_hdr *bcf; /* Firmware data */
|
|
@@ -1297,32 +1297,31 @@ int i2400m_dev_bootstrap(struct i2400m *i2400m, enum i2400m_bri flags)
|
|
d_fnstart(5, dev, "(i2400m %p)\n", i2400m);
|
|
d_fnstart(5, dev, "(i2400m %p)\n", i2400m);
|
|
|
|
|
|
/* Load firmware files to memory. */
|
|
/* Load firmware files to memory. */
|
|
- itr = 0;
|
|
|
|
- while(1) {
|
|
|
|
|
|
+ for (itr = 0, bcf = NULL, ret = -ENOENT; ; itr++) {
|
|
fw_name = i2400m->bus_fw_names[itr];
|
|
fw_name = i2400m->bus_fw_names[itr];
|
|
if (fw_name == NULL) {
|
|
if (fw_name == NULL) {
|
|
dev_err(dev, "Could not find a usable firmware image\n");
|
|
dev_err(dev, "Could not find a usable firmware image\n");
|
|
ret = -ENOENT;
|
|
ret = -ENOENT;
|
|
- goto error_no_fw;
|
|
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
+ d_printf(1, dev, "trying firmware %s (%d)\n", fw_name, itr);
|
|
ret = request_firmware(&fw, fw_name, dev);
|
|
ret = request_firmware(&fw, fw_name, dev);
|
|
- if (ret == 0)
|
|
|
|
- break; /* got it */
|
|
|
|
- if (ret < 0)
|
|
|
|
|
|
+ if (ret < 0) {
|
|
dev_err(dev, "fw %s: cannot load file: %d\n",
|
|
dev_err(dev, "fw %s: cannot load file: %d\n",
|
|
fw_name, ret);
|
|
fw_name, ret);
|
|
- itr++;
|
|
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ bcf = (void *) fw->data;
|
|
|
|
+ i2400m->fw_name = fw_name;
|
|
|
|
+ ret = i2400m_fw_check(i2400m, bcf, fw->size);
|
|
|
|
+ if (ret >= 0) {
|
|
|
|
+ ret = i2400m_fw_dnload(i2400m, bcf, fw->size, flags);
|
|
|
|
+ if (ret >= 0)
|
|
|
|
+ break;
|
|
|
|
+ } else
|
|
|
|
+ dev_err(dev, "%s: cannot use, skipping\n", fw_name);
|
|
|
|
+ release_firmware(fw);
|
|
}
|
|
}
|
|
-
|
|
|
|
- bcf = (void *) fw->data;
|
|
|
|
- i2400m->fw_name = fw_name;
|
|
|
|
- ret = i2400m_fw_check(i2400m, bcf, fw->size);
|
|
|
|
- if (ret < 0)
|
|
|
|
- goto error_fw_bad;
|
|
|
|
- ret = i2400m_fw_dnload(i2400m, bcf, fw->size, flags);
|
|
|
|
-error_fw_bad:
|
|
|
|
- release_firmware(fw);
|
|
|
|
-error_no_fw:
|
|
|
|
d_fnend(5, dev, "(i2400m %p) = %d\n", i2400m, ret);
|
|
d_fnend(5, dev, "(i2400m %p) = %d\n", i2400m, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|