Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/efx_vpd.c
Show First 20 Lines • Show All 663 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_vpd_hunk_next( | efx_vpd_hunk_next( | ||||
__in_bcount(size) caddr_t data, | __in_bcount(size) caddr_t data, | ||||
__in size_t size, | __in size_t size, | ||||
__out efx_vpd_tag_t *tagp, | __out efx_vpd_tag_t *tagp, | ||||
__out efx_vpd_keyword_t *keywordp, | __out efx_vpd_keyword_t *keywordp, | ||||
__out_bcount_opt(*paylenp) unsigned int *payloadp, | __out_opt unsigned int *payloadp, | ||||
__out_opt uint8_t *paylenp, | __out_opt uint8_t *paylenp, | ||||
__inout unsigned int *contp) | __inout unsigned int *contp) | ||||
{ | { | ||||
efx_vpd_tag_t tag; | efx_vpd_tag_t tag; | ||||
efx_vpd_keyword_t keyword = 0; | efx_vpd_keyword_t keyword = 0; | ||||
unsigned int offset; | unsigned int offset; | ||||
unsigned int pos; | unsigned int pos; | ||||
unsigned int index; | unsigned int index; | ||||
uint16_t taglen; | uint16_t taglen; | ||||
uint8_t keylen; | uint8_t keylen; | ||||
uint8_t paylen; | uint8_t paylen; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
offset = index = 0; | offset = index = 0; | ||||
_NOTE(CONSTANTCONDITION) | _NOTE(CONSTANTCONDITION) | ||||
while (1) { | while (1) { | ||||
if ((rc = efx_vpd_next_tag(data, size, &offset, | if ((rc = efx_vpd_next_tag(data, size, &offset, | ||||
&tag, &taglen)) != 0) | &tag, &taglen)) != 0) | ||||
goto fail1; | goto fail1; | ||||
if (tag == EFX_VPD_END) | |||||
if (tag == EFX_VPD_END) { | |||||
keyword = 0; | |||||
paylen = 0; | |||||
index = 0; | |||||
break; | break; | ||||
} | |||||
if (tag == EFX_VPD_ID) { | if (tag == EFX_VPD_ID) { | ||||
if (index == *contp) { | if (index++ == *contp) { | ||||
EFSYS_ASSERT3U(taglen, <, 0x100); | EFSYS_ASSERT3U(taglen, <, 0x100); | ||||
keyword = 0; | |||||
paylen = (uint8_t)MIN(taglen, 0xff); | paylen = (uint8_t)MIN(taglen, 0xff); | ||||
goto done; | goto done; | ||||
} | } | ||||
} else { | } else { | ||||
for (pos = 0; pos != taglen; pos += 3 + keylen) { | for (pos = 0; pos != taglen; pos += 3 + keylen) { | ||||
if ((rc = efx_vpd_next_keyword(data + offset, | if ((rc = efx_vpd_next_keyword(data + offset, | ||||
taglen, pos, &keyword, &keylen)) != 0) | taglen, pos, &keyword, &keylen)) != 0) | ||||
goto fail2; | goto fail2; | ||||
if (index == *contp) { | if (index++ == *contp) { | ||||
offset += pos + 3; | offset += pos + 3; | ||||
paylen = keylen; | paylen = keylen; | ||||
goto done; | goto done; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
offset += taglen; | offset += taglen; | ||||
} | } | ||||
*contp = 0; | |||||
return (0); | |||||
done: | done: | ||||
*tagp = tag; | *tagp = tag; | ||||
*keywordp = keyword; | *keywordp = keyword; | ||||
if (payloadp != NULL) | if (payloadp != NULL) | ||||
*payloadp = offset; | *payloadp = offset; | ||||
if (paylenp != NULL) | if (paylenp != NULL) | ||||
*paylenp = paylen; | *paylenp = paylen; | ||||
++(*contp); | *contp = index; | ||||
return (0); | return (0); | ||||
fail2: | fail2: | ||||
EFSYS_PROBE(fail2); | EFSYS_PROBE(fail2); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
▲ Show 20 Lines • Show All 296 Lines • Show Last 20 Lines |