return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
 }
 
+static int brcmf_fw_request_firmware(const struct firmware **fw,
+                                    struct brcmf_fw *fwctx)
+{
+       struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
+       int ret;
+
+       /* nvram files are board-specific, first try a board-specific path */
+       if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
+               char alt_path[BRCMF_FW_NAME_LEN];
+
+               strlcpy(alt_path, cur->path, BRCMF_FW_NAME_LEN);
+               /* strip .txt at the end */
+               alt_path[strlen(alt_path) - 4] = 0;
+               strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
+               strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
+               strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
+
+               ret = request_firmware(fw, alt_path, fwctx->dev);
+               if (ret == 0)
+                       return ret;
+       }
+
+       return request_firmware(fw, cur->path, fwctx->dev);
+}
+
 static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
 {
        struct brcmf_fw *fwctx = ctx;
 
        while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
                cur = &fwctx->req->items[fwctx->curpos];
-               request_firmware(&fw, cur->path, fwctx->dev);
+               brcmf_fw_request_firmware(&fw, fwctx);
                ret = brcmf_fw_complete_request(fw, ctx);
        }