diff options
Diffstat (limited to 'firmware/drivers/ata_mmc.c')
-rw-r--r-- | firmware/drivers/ata_mmc.c | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index 9e854ce977..02ec72a1f2 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c | |||
@@ -395,29 +395,16 @@ unsigned long mmc_extract_bits( | |||
395 | unsigned int start, /* bit no. to start reading */ | 395 | unsigned int start, /* bit no. to start reading */ |
396 | unsigned int size) /* how many bits to read */ | 396 | unsigned int size) /* how many bits to read */ |
397 | { | 397 | { |
398 | unsigned int bit_index; | 398 | unsigned int long_index = start / 32; |
399 | unsigned int bits_to_use; | 399 | unsigned int bit_index = start % 32; |
400 | unsigned long mask; | ||
401 | unsigned long result; | 400 | unsigned long result; |
401 | |||
402 | result = p[long_index] << bit_index; | ||
402 | 403 | ||
403 | if (size == 1) | 404 | if (bit_index + size > 32) /* crossing longword boundary */ |
404 | { /* short cut */ | 405 | result |= p[long_index+1] >> (32 - bit_index); |
405 | return ((p[start/32] >> (31 - (start % 32))) & 1); | 406 | |
406 | } | 407 | result >>= 32 - size; |
407 | |||
408 | result = 0; | ||
409 | while (size) | ||
410 | { | ||
411 | bit_index = start % 32; | ||
412 | bits_to_use = MIN(32 - bit_index, size); | ||
413 | mask = 0xFFFFFFFF >> (32 - bits_to_use); | ||
414 | |||
415 | result <<= bits_to_use; /* start last round */ | ||
416 | result |= (p[start/32] >> (32 - bits_to_use - bit_index)) & mask; | ||
417 | |||
418 | start += bits_to_use; | ||
419 | size -= bits_to_use; | ||
420 | } | ||
421 | 408 | ||
422 | return result; | 409 | return result; |
423 | } | 410 | } |