|
66 | 66 | #define ALTERA_CVP_V1_SIZE 4 |
67 | 67 | #define ALTERA_CVP_V2_SIZE 4096 |
68 | 68 |
|
| 69 | +/* Tear-down retry */ |
| 70 | +#define CVP_TEARDOWN_MAX_RETRY 10 |
69 | 71 | /* Optional CvP config error status check for debugging */ |
70 | 72 | static bool altera_cvp_chkcfg; |
71 | 73 |
|
@@ -315,6 +317,22 @@ static int altera_cvp_teardown(struct fpga_manager *mgr, |
315 | 317 | return ret; |
316 | 318 | } |
317 | 319 |
|
| 320 | +static int altera_cvp_recovery(struct fpga_manager *mgr, |
| 321 | + struct fpga_image_info *info) |
| 322 | +{ |
| 323 | + int ret = 0, retry = 0; |
| 324 | + |
| 325 | + for (retry = 0; retry < CVP_TEARDOWN_MAX_RETRY; retry++) { |
| 326 | + ret = altera_cvp_teardown(mgr, info); |
| 327 | + if (!ret) |
| 328 | + break; |
| 329 | + dev_warn(&mgr->dev, |
| 330 | + "%s: [%d] Tear-down failed. Retrying\n", |
| 331 | + __func__, |
| 332 | + retry); |
| 333 | + } |
| 334 | + return ret; |
| 335 | +} |
318 | 336 | static int altera_cvp_write_init(struct fpga_manager *mgr, |
319 | 337 | struct fpga_image_info *info, |
320 | 338 | const char *buf, size_t count) |
@@ -347,7 +365,7 @@ static int altera_cvp_write_init(struct fpga_manager *mgr, |
347 | 365 |
|
348 | 366 | if (val & VSE_CVP_STATUS_CFG_RDY) { |
349 | 367 | dev_warn(&mgr->dev, "CvP already started, tear down first\n"); |
350 | | - ret = altera_cvp_teardown(mgr, info); |
| 368 | + ret = altera_cvp_recovery(mgr, info); |
351 | 369 | if (ret) |
352 | 370 | return ret; |
353 | 371 | } |
@@ -488,7 +506,7 @@ static int altera_cvp_write_complete(struct fpga_manager *mgr, |
488 | 506 | u32 mask, val; |
489 | 507 | int ret; |
490 | 508 |
|
491 | | - ret = altera_cvp_teardown(mgr, info); |
| 509 | + ret = altera_cvp_recovery(mgr, info); |
492 | 510 | if (ret) |
493 | 511 | return ret; |
494 | 512 |
|
|
0 commit comments