|
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 |
|
@@ -328,6 +330,22 @@ static int altera_cvp_teardown(struct fpga_manager *mgr, |
328 | 330 |
|
329 | 331 | } |
330 | 332 |
|
| 333 | +static int altera_cvp_recovery(struct fpga_manager *mgr, |
| 334 | + struct fpga_image_info *info) |
| 335 | +{ |
| 336 | + int ret = 0, retry = 0; |
| 337 | + |
| 338 | + for (retry = 0; retry < CVP_TEARDOWN_MAX_RETRY; retry++) { |
| 339 | + ret = altera_cvp_teardown(mgr, info); |
| 340 | + if (!ret) |
| 341 | + break; |
| 342 | + dev_warn(&mgr->dev, |
| 343 | + "%s: [%d] Tear-down failed. Retrying\n", |
| 344 | + __func__, |
| 345 | + retry); |
| 346 | + } |
| 347 | + return ret; |
| 348 | +} |
331 | 349 | static int altera_cvp_write_init(struct fpga_manager *mgr, |
332 | 350 | struct fpga_image_info *info, |
333 | 351 | const char *buf, size_t count) |
@@ -360,7 +378,7 @@ static int altera_cvp_write_init(struct fpga_manager *mgr, |
360 | 378 |
|
361 | 379 | if (val & VSE_CVP_STATUS_CFG_RDY) { |
362 | 380 | dev_warn(&mgr->dev, "CvP already started, tear down first\n"); |
363 | | - ret = altera_cvp_teardown(mgr, info); |
| 381 | + ret = altera_cvp_recovery(mgr, info); |
364 | 382 | if (ret) |
365 | 383 | return ret; |
366 | 384 | } |
@@ -505,7 +523,7 @@ static int altera_cvp_write_complete(struct fpga_manager *mgr, |
505 | 523 | u32 mask, val; |
506 | 524 | int ret; |
507 | 525 |
|
508 | | - ret = altera_cvp_teardown(mgr, info); |
| 526 | + ret = altera_cvp_recovery(mgr, info); |
509 | 527 | if (ret) |
510 | 528 | return ret; |
511 | 529 |
|
|
0 commit comments