| 519 | } |
| 520 | |
| 521 | static rt_int32_t sdio_read_cis(struct rt_sdio_function *func) |
| 522 | { |
| 523 | rt_int32_t ret; |
| 524 | struct rt_sdio_function_tuple *curr, **prev; |
| 525 | rt_uint32_t i, cisptr = 0; |
| 526 | rt_uint8_t data; |
| 527 | rt_uint8_t tpl_code, tpl_link; |
| 528 | |
| 529 | struct rt_mmcsd_card *card = func->card; |
| 530 | struct rt_sdio_function *func0 = card->sdio_function[0]; |
| 531 | |
| 532 | RT_ASSERT(func0 != RT_NULL); |
| 533 | |
| 534 | for (i = 0; i < 3; i++) |
| 535 | { |
| 536 | data = sdio_io_readb(func0, |
| 537 | SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_CIS + i, &ret); |
| 538 | if (ret) |
| 539 | return ret; |
| 540 | cisptr |= data << (i * 8); |
| 541 | } |
| 542 | |
| 543 | prev = &func->tuples; |
| 544 | |
| 545 | do { |
| 546 | tpl_code = sdio_io_readb(func0, cisptr++, &ret); |
| 547 | if (ret) |
| 548 | break; |
| 549 | tpl_link = sdio_io_readb(func0, cisptr++, &ret); |
| 550 | if (ret) |
| 551 | break; |
| 552 | |
| 553 | if ((tpl_code == CISTPL_END) || (tpl_link == 0xff)) |
| 554 | break; |
| 555 | |
| 556 | if (tpl_code == CISTPL_NULL) |
| 557 | continue; |
| 558 | |
| 559 | |
| 560 | curr = rt_malloc(sizeof(struct rt_sdio_function_tuple) + tpl_link); |
| 561 | if (!curr) |
| 562 | return -RT_ENOMEM; |
| 563 | curr->data = (rt_uint8_t *)curr + sizeof(struct rt_sdio_function_tuple); |
| 564 | |
| 565 | for (i = 0; i < tpl_link; i++) |
| 566 | { |
| 567 | curr->data[i] = sdio_io_readb(func0, cisptr + i, &ret); |
| 568 | if (ret) |
| 569 | break; |
| 570 | } |
| 571 | if (ret) |
| 572 | { |
| 573 | rt_free(curr); |
| 574 | break; |
| 575 | } |
| 576 | |
| 577 | switch (tpl_code) |
| 578 | { |
no test coverage detected