Deleted Added
full compact
mmc.c (183542) mmc.c (183704)
1/*-
2 * Copyright (c) 2006 Bernd Walter. All rights reserved.
3 * Copyright (c) 2006 M. Warner Losh. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 37 unchanged lines hidden (view full) ---

46 * implication, estoppel or otherwise under any patent or other rights of the
47 * SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing
48 * herein shall be construed as an obligation by the SD Group, the SD-3C LLC
49 * or the SD Card Association to disclose or distribute any technical
50 * information, know-how or other confidential information to any third party.
51 */
52
53#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2006 Bernd Walter. All rights reserved.
3 * Copyright (c) 2006 M. Warner Losh. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 37 unchanged lines hidden (view full) ---

46 * implication, estoppel or otherwise under any patent or other rights of the
47 * SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing
48 * herein shall be construed as an obligation by the SD Group, the SD-3C LLC
49 * or the SD Card Association to disclose or distribute any technical
50 * information, know-how or other confidential information to any third party.
51 */
52
53#include <sys/cdefs.h>
54__FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 183542 2008-10-02 07:06:59Z imp $");
54__FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 183704 2008-10-08 17:35:41Z mav $");
55
56#include <sys/param.h>
57#include <sys/systm.h>
58#include <sys/kernel.h>
59#include <sys/malloc.h>
60#include <sys/lock.h>
61#include <sys/module.h>
62#include <sys/mutex.h>
63#include <sys/bus.h>
55
56#include <sys/param.h>
57#include <sys/systm.h>
58#include <sys/kernel.h>
59#include <sys/malloc.h>
60#include <sys/lock.h>
61#include <sys/module.h>
62#include <sys/mutex.h>
63#include <sys/bus.h>
64#include <sys/endian.h>
64
65#include <dev/mmc/mmcreg.h>
66#include <dev/mmc/mmcbrvar.h>
67#include <dev/mmc/mmcvar.h>
68#include "mmcbr_if.h"
69#include "mmcbus_if.h"
70
71struct mmc_softc {

--- 5 unchanged lines hidden (view full) ---

77};
78
79/*
80 * Per-card data
81 */
82struct mmc_ivars {
83 uint32_t raw_cid[4]; /* Raw bits of the CID */
84 uint32_t raw_csd[4]; /* Raw bits of the CSD */
65
66#include <dev/mmc/mmcreg.h>
67#include <dev/mmc/mmcbrvar.h>
68#include <dev/mmc/mmcvar.h>
69#include "mmcbr_if.h"
70#include "mmcbus_if.h"
71
72struct mmc_softc {

--- 5 unchanged lines hidden (view full) ---

78};
79
80/*
81 * Per-card data
82 */
83struct mmc_ivars {
84 uint32_t raw_cid[4]; /* Raw bits of the CID */
85 uint32_t raw_csd[4]; /* Raw bits of the CSD */
86 uint32_t raw_scr[2]; /* Raw bits of the SCR */
87 uint8_t raw_ext_csd[512]; /* Raw bits of the EXT_CSD */
85 uint16_t rca;
86 enum mmc_card_mode mode;
87 struct mmc_cid cid; /* cid decoded */
88 struct mmc_csd csd; /* csd decoded */
88 uint16_t rca;
89 enum mmc_card_mode mode;
90 struct mmc_cid cid; /* cid decoded */
91 struct mmc_csd csd; /* csd decoded */
92 struct mmc_scr scr; /* scr decoded */
89 u_char read_only; /* True when the device is read-only */
93 u_char read_only; /* True when the device is read-only */
94 u_char bus_width; /* Bus width to use */
95 u_char timing; /* Bus timing support */
96 u_char high_cap; /* High Capacity card */
97 uint32_t tran_speed; /* Max speed in normal mode */
98 uint32_t hs_tran_speed; /* Max speed in high speed mode */
90};
91
92#define CMD_RETRIES 3
93
94/* bus entry points */
95static int mmc_probe(device_t dev);
96static int mmc_attach(device_t dev);
97static int mmc_detach(device_t dev);

--- 8 unchanged lines hidden (view full) ---

106#define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
107
108static void mmc_delayed_attach(void *);
109static void mmc_power_down(struct mmc_softc *sc);
110static int mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd,
111 int retries);
112static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode,
113 uint32_t arg, uint32_t flags, uint32_t *resp, int retries);
99};
100
101#define CMD_RETRIES 3
102
103/* bus entry points */
104static int mmc_probe(device_t dev);
105static int mmc_attach(device_t dev);
106static int mmc_detach(device_t dev);

--- 8 unchanged lines hidden (view full) ---

115#define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
116
117static void mmc_delayed_attach(void *);
118static void mmc_power_down(struct mmc_softc *sc);
119static int mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd,
120 int retries);
121static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode,
122 uint32_t arg, uint32_t flags, uint32_t *resp, int retries);
123static int mmc_select_card(struct mmc_softc *sc, uint16_t rca);
124static int mmc_set_bus_width(struct mmc_softc *sc, uint16_t rca, int width);
125static int mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, uint32_t *rawscr);
126static void mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr);
127static int mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd);
114
115static void
116mmc_ms_delay(int ms)
117{
118 DELAY(1000 * ms); /* XXX BAD */
119}
120
121static int

--- 46 unchanged lines hidden (view full) ---

168
169 return (0);
170}
171
172static int
173mmc_acquire_bus(device_t busdev, device_t dev)
174{
175 struct mmc_softc *sc;
128
129static void
130mmc_ms_delay(int ms)
131{
132 DELAY(1000 * ms); /* XXX BAD */
133}
134
135static int

--- 46 unchanged lines hidden (view full) ---

182
183 return (0);
184}
185
186static int
187mmc_acquire_bus(device_t busdev, device_t dev)
188{
189 struct mmc_softc *sc;
190 struct mmc_ivars *ivar;
176 int err;
177 int rca;
178
179 err = MMCBR_ACQUIRE_HOST(device_get_parent(busdev), busdev);
180 if (err)
181 return (err);
182 sc = device_get_softc(busdev);
183 MMC_LOCK(sc);

--- 6 unchanged lines hidden (view full) ---

190 /*
191 * Keep track of the last rca that we've selected. If
192 * we're asked to do it again, don't. We never
193 * unselect unless the bus code itself wants the mmc
194 * bus, and constantly reselecting causes problems.
195 */
196 rca = mmc_get_rca(dev);
197 if (sc->last_rca != rca) {
191 int err;
192 int rca;
193
194 err = MMCBR_ACQUIRE_HOST(device_get_parent(busdev), busdev);
195 if (err)
196 return (err);
197 sc = device_get_softc(busdev);
198 MMC_LOCK(sc);

--- 6 unchanged lines hidden (view full) ---

205 /*
206 * Keep track of the last rca that we've selected. If
207 * we're asked to do it again, don't. We never
208 * unselect unless the bus code itself wants the mmc
209 * bus, and constantly reselecting causes problems.
210 */
211 rca = mmc_get_rca(dev);
212 if (sc->last_rca != rca) {
198 mmc_wait_for_command(sc, MMC_SELECT_CARD, rca << 16,
199 MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
213 mmc_select_card(sc, rca);
200 sc->last_rca = rca;
214 sc->last_rca = rca;
215 /* Prepare bus width for the new card. */
216 ivar = device_get_ivars(dev);
217 device_printf(busdev,
218 "setting bus width to %d bits\n",
219 (ivar->bus_width == bus_width_4)?4:
220 (ivar->bus_width == bus_width_8)?8:1);
221 mmc_set_bus_width(sc, rca, ivar->bus_width);
222 mmcbr_set_bus_width(busdev, ivar->bus_width);
223 mmcbr_update_ios(busdev);
201 }
224 }
202 /* XXX should set bus width here? */
203 } else {
204 /*
205 * If there's a card selected, stand down.
206 */
207 if (sc->last_rca != 0) {
225 } else {
226 /*
227 * If there's a card selected, stand down.
228 */
229 if (sc->last_rca != 0) {
208 mmc_wait_for_command(sc, MMC_SELECT_CARD, 0,
209 MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
230 mmc_select_card(sc, 0);
210 sc->last_rca = 0;
211 }
231 sc->last_rca = 0;
232 }
212 /* XXX should set bus width here? */
213 }
214
215 return (0);
216}
217
218static int
219mmc_release_bus(device_t busdev, device_t dev)
220{

--- 218 unchanged lines hidden (view full) ---

439 err = MMC_ERR_TIMEOUT;
440 mmc_ms_delay(10);
441 }
442 if (rocr && err == MMC_ERR_NONE)
443 *rocr = cmd.resp[0];
444 return (err);
445}
446
233 }
234
235 return (0);
236}
237
238static int
239mmc_release_bus(device_t busdev, device_t dev)
240{

--- 218 unchanged lines hidden (view full) ---

459 err = MMC_ERR_TIMEOUT;
460 mmc_ms_delay(10);
461 }
462 if (rocr && err == MMC_ERR_NONE)
463 *rocr = cmd.resp[0];
464 return (err);
465}
466
467static int
468mmc_send_if_cond(struct mmc_softc *sc, uint8_t vhs)
469{
470 struct mmc_command cmd;
471 int err;
472
473 memset(&cmd, 0, sizeof(cmd));
474 cmd.opcode = SD_SEND_IF_COND;
475 cmd.arg = (vhs << 8) + 0xAA;
476 cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR;
477 cmd.data = NULL;
478
479 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES);
480 return (err);
481}
482
447static void
448mmc_power_up(struct mmc_softc *sc)
449{
450 device_t dev;
451
452 dev = sc->dev;
453 mmcbr_set_vdd(dev, mmc_highest_voltage(mmcbr_get_host_ocr(dev)));
454 mmcbr_set_bus_mode(dev, opendrain);
455 mmcbr_set_chip_select(dev, cs_dontcare);
456 mmcbr_set_bus_width(dev, bus_width_1);
457 mmcbr_set_power_mode(dev, power_up);
458 mmcbr_set_clock(dev, 0);
459 mmcbr_update_ios(dev);
460 mmc_ms_delay(1);
461
462 mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev));
483static void
484mmc_power_up(struct mmc_softc *sc)
485{
486 device_t dev;
487
488 dev = sc->dev;
489 mmcbr_set_vdd(dev, mmc_highest_voltage(mmcbr_get_host_ocr(dev)));
490 mmcbr_set_bus_mode(dev, opendrain);
491 mmcbr_set_chip_select(dev, cs_dontcare);
492 mmcbr_set_bus_width(dev, bus_width_1);
493 mmcbr_set_power_mode(dev, power_up);
494 mmcbr_set_clock(dev, 0);
495 mmcbr_update_ios(dev);
496 mmc_ms_delay(1);
497
498 mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev));
499 mmcbr_set_timing(dev, bus_timing_normal);
463 mmcbr_set_power_mode(dev, power_on);
464 mmcbr_update_ios(dev);
465 mmc_ms_delay(2);
466}
467
468static void
469mmc_power_down(struct mmc_softc *sc)
470{
471 device_t dev = sc->dev;
472
473 mmcbr_set_bus_mode(dev, opendrain);
474 mmcbr_set_chip_select(dev, cs_dontcare);
475 mmcbr_set_bus_width(dev, bus_width_1);
476 mmcbr_set_power_mode(dev, power_off);
477 mmcbr_set_clock(dev, 0);
500 mmcbr_set_power_mode(dev, power_on);
501 mmcbr_update_ios(dev);
502 mmc_ms_delay(2);
503}
504
505static void
506mmc_power_down(struct mmc_softc *sc)
507{
508 device_t dev = sc->dev;
509
510 mmcbr_set_bus_mode(dev, opendrain);
511 mmcbr_set_chip_select(dev, cs_dontcare);
512 mmcbr_set_bus_width(dev, bus_width_1);
513 mmcbr_set_power_mode(dev, power_off);
514 mmcbr_set_clock(dev, 0);
515 mmcbr_set_timing(dev, bus_timing_normal);
478 mmcbr_update_ios(dev);
479}
480
516 mmcbr_update_ios(dev);
517}
518
519static int
520mmc_select_card(struct mmc_softc *sc, uint16_t rca)
521{
522 return (mmc_wait_for_command(sc, MMC_SELECT_CARD, ((uint32_t)rca) << 16,
523 MMC_RSP_R1B | MMC_CMD_AC, NULL, CMD_RETRIES));
524}
525
526static int
527mmc_switch(struct mmc_softc *sc, uint8_t set, uint8_t index, uint8_t value)
528{
529 struct mmc_command cmd;
530 int err;
531
532 cmd.opcode = MMC_SWITCH_FUNC;
533 cmd.arg = (MMC_SWITCH_FUNC_WR << 24) |
534 (index << 16) |
535 (value << 8) |
536 set;
537 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
538 cmd.data = NULL;
539 err = mmc_wait_for_cmd(sc, &cmd, 0);
540 return (err);
541}
542
543static int
544mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp, uint8_t value, uint8_t *res)
545{
546 int err;
547 struct mmc_command cmd;
548 struct mmc_data data;
549
550 memset(&cmd, 0, sizeof(struct mmc_command));
551 memset(&data, 0, sizeof(struct mmc_data));
552
553 memset(res, 0, 64);
554 cmd.opcode = SD_SWITCH_FUNC;
555 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
556 cmd.arg = mode << 31;
557 cmd.arg |= 0x00FFFFFF;
558 cmd.arg &= ~(0xF << grp);
559 cmd.arg |= value << grp;
560 cmd.data = &data;
561
562 data.data = res;
563 data.len = 64;
564 data.flags = MMC_DATA_READ;
565
566 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES);
567 return (err);
568}
569
570static int
571mmc_set_bus_width(struct mmc_softc *sc, uint16_t rca, int width)
572{
573 int err;
574
575 if (mmcbr_get_mode(sc->dev) == mode_sd) {
576 struct mmc_command cmd;
577
578 memset(&cmd, 0, sizeof(struct mmc_command));
579 cmd.opcode = ACMD_SET_BUS_WIDTH;
580 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
581 switch (width) {
582 case bus_width_1:
583 cmd.arg = SD_BUS_WIDTH_1;
584 break;
585 case bus_width_4:
586 cmd.arg = SD_BUS_WIDTH_4;
587 break;
588 default:
589 return (MMC_ERR_INVALID);
590 }
591 err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES);
592 } else {
593 uint8_t value;
594
595 switch (width) {
596 case bus_width_1:
597 value = EXT_CSD_BUS_WIDTH_1;
598 break;
599 case bus_width_4:
600 value = EXT_CSD_BUS_WIDTH_4;
601 break;
602 case bus_width_8:
603 value = EXT_CSD_BUS_WIDTH_8;
604 break;
605 default:
606 return (MMC_ERR_INVALID);
607 }
608 err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, value);
609 }
610 return (err);
611}
612
613static int
614mmc_set_timing(struct mmc_softc *sc, int timing)
615{
616 int err;
617 uint8_t value;
618
619 switch (timing) {
620 case bus_timing_normal:
621 value = 0;
622 break;
623 case bus_timing_hs:
624 value = 1;
625 break;
626 default:
627 return (MMC_ERR_INVALID);
628 }
629 if (mmcbr_get_mode(sc->dev) == mode_sd) {
630 u_char switch_res[64];
631
632 err = mmc_sd_switch(sc, 1, 0, value, switch_res);
633 } else {
634 err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL,
635 EXT_CSD_HS_TIMING, value);
636 }
637 return (err);
638}
639
640static int
641mmc_test_bus_width(struct mmc_softc *sc)
642{
643 struct mmc_command cmd;
644 struct mmc_data data;
645 int err;
646 uint8_t buf[8];
647 uint8_t p8[8] = { 0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
648 uint8_t p8ok[8] = { 0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
649 uint8_t p4[4] = { 0x5A, 0x00, 0x00, 0x00, };
650 uint8_t p4ok[4] = { 0xA5, 0x00, 0x00, 0x00, };
651
652 if (mmcbr_get_caps(sc->dev) & MMC_CAP_8_BIT_DATA) {
653 mmcbr_set_bus_width(sc->dev, bus_width_8);
654 mmcbr_update_ios(sc->dev);
655
656 cmd.opcode = MMC_BUSTEST_W;
657 cmd.arg = 0;
658 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
659 cmd.data = &data;
660
661 data.data = p8;
662 data.len = 8;
663 data.flags = MMC_DATA_WRITE;
664 mmc_wait_for_cmd(sc, &cmd, 0);
665
666 cmd.opcode = MMC_BUSTEST_R;
667 cmd.arg = 0;
668 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
669 cmd.data = &data;
670
671 data.data = buf;
672 data.len = 8;
673 data.flags = MMC_DATA_READ;
674 err = mmc_wait_for_cmd(sc, &cmd, 0);
675
676 mmcbr_set_bus_width(sc->dev, bus_width_1);
677 mmcbr_update_ios(sc->dev);
678
679 if (err == MMC_ERR_NONE && memcmp(buf, p8ok, 8) == 0)
680 return (bus_width_8);
681 }
682
683 if (mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) {
684 mmcbr_set_bus_width(sc->dev, bus_width_4);
685 mmcbr_update_ios(sc->dev);
686
687 cmd.opcode = MMC_BUSTEST_W;
688 cmd.arg = 0;
689 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
690 cmd.data = &data;
691
692 data.data = p4;
693 data.len = 4;
694 data.flags = MMC_DATA_WRITE;
695 mmc_wait_for_cmd(sc, &cmd, 0);
696
697 cmd.opcode = MMC_BUSTEST_R;
698 cmd.arg = 0;
699 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
700 cmd.data = &data;
701
702 data.data = buf;
703 data.len = 4;
704 data.flags = MMC_DATA_READ;
705 err = mmc_wait_for_cmd(sc, &cmd, 0);
706
707 mmcbr_set_bus_width(sc->dev, bus_width_1);
708 mmcbr_update_ios(sc->dev);
709
710 if (err == MMC_ERR_NONE && memcmp(buf, p4ok, 4) == 0)
711 return (bus_width_4);
712 }
713 return (bus_width_1);
714}
715
481static uint32_t
482mmc_get_bits(uint32_t *bits, int start, int size)
483{
484 const int i = 3 - (start / 32);
485 const int shift = start & 31;
486 uint32_t retval = bits[i] >> shift;
487 if (size + shift > 32)
488 retval |= bits[i - 1] << (32 - shift);

--- 12 unchanged lines hidden (view full) ---

501 cid->oid = mmc_get_bits(raw_cid, 104, 16);
502 for (i = 0; i < 5; i++)
503 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8);
504 cid->prv = mmc_get_bits(raw_cid, 56, 8);
505 cid->psn = mmc_get_bits(raw_cid, 24, 32);
506 cid->mdt_year = mmc_get_bits(raw_cid, 12, 8) + 2001;
507 cid->mdt_month = mmc_get_bits(raw_cid, 8, 4);
508 } else {
716static uint32_t
717mmc_get_bits(uint32_t *bits, int start, int size)
718{
719 const int i = 3 - (start / 32);
720 const int shift = start & 31;
721 uint32_t retval = bits[i] >> shift;
722 if (size + shift > 32)
723 retval |= bits[i - 1] << (32 - shift);

--- 12 unchanged lines hidden (view full) ---

736 cid->oid = mmc_get_bits(raw_cid, 104, 16);
737 for (i = 0; i < 5; i++)
738 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8);
739 cid->prv = mmc_get_bits(raw_cid, 56, 8);
740 cid->psn = mmc_get_bits(raw_cid, 24, 32);
741 cid->mdt_year = mmc_get_bits(raw_cid, 12, 8) + 2001;
742 cid->mdt_month = mmc_get_bits(raw_cid, 8, 4);
743 } else {
509 /* XXX write me */
510 panic("write mmc cid decoder");
744 cid->mid = mmc_get_bits(raw_cid, 120, 8);
745 cid->oid = mmc_get_bits(raw_cid, 104, 8);
746 for (i = 0; i < 6; i++)
747 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8);
748 cid->prv = mmc_get_bits(raw_cid, 48, 8);
749 cid->psn = mmc_get_bits(raw_cid, 16, 32);
750 cid->mdt_month = mmc_get_bits(raw_cid, 12, 4);
751 cid->mdt_year = mmc_get_bits(raw_cid, 8, 4) + 1997;
511 }
512}
513
514static const int exp[8] = {
515 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
516};
517static const int mant[16] = {
518 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80

--- 39 unchanged lines hidden (view full) ---

558 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1);
559 csd->sector_size = mmc_get_bits(raw_csd, 39, 7);
560 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7);
561 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1);
562 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3);
563 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4);
564 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
565 } else if (v == 1) {
752 }
753}
754
755static const int exp[8] = {
756 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
757};
758static const int mant[16] = {
759 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80

--- 39 unchanged lines hidden (view full) ---

799 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1);
800 csd->sector_size = mmc_get_bits(raw_csd, 39, 7);
801 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7);
802 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1);
803 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3);
804 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4);
805 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
806 } else if (v == 1) {
566 panic("Write SDHC CSD parser");
807 m = mmc_get_bits(raw_csd, 115, 4);
808 e = mmc_get_bits(raw_csd, 112, 3);
809 csd->tacc = exp[e] * mant[m] + 9 / 10;
810 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100;
811 m = mmc_get_bits(raw_csd, 99, 4);
812 e = mmc_get_bits(raw_csd, 96, 3);
813 csd->tran_speed = exp[e] * 10000 * mant[m];
814 csd->ccc = mmc_get_bits(raw_csd, 84, 12);
815 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4);
816 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1);
817 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1);
818 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1);
819 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1);
820 csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 48, 22) + 1) *
821 512 * 1024;
822 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1);
823 csd->sector_size = mmc_get_bits(raw_csd, 39, 7);
824 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7);
825 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1);
826 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3);
827 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4);
828 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
567 } else
568 panic("unknown SD CSD version");
569 } else {
829 } else
830 panic("unknown SD CSD version");
831 } else {
570 panic("Write a MMC CSD parser");
832 csd->csd_structure = mmc_get_bits(raw_csd, 126, 2);
833 csd->spec_vers = mmc_get_bits(raw_csd, 122, 4);
834 m = mmc_get_bits(raw_csd, 115, 4);
835 e = mmc_get_bits(raw_csd, 112, 3);
836 csd->tacc = exp[e] * mant[m] + 9 / 10;
837 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100;
838 m = mmc_get_bits(raw_csd, 99, 4);
839 e = mmc_get_bits(raw_csd, 96, 3);
840 csd->tran_speed = exp[e] * 10000 * mant[m];
841 csd->ccc = mmc_get_bits(raw_csd, 84, 12);
842 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4);
843 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1);
844 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1);
845 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1);
846 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1);
847 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 59, 3)];
848 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 56, 3)];
849 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 53, 3)];
850 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 50, 3)];
851 m = mmc_get_bits(raw_csd, 62, 12);
852 e = mmc_get_bits(raw_csd, 47, 3);
853 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len;
854// csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1);
855// csd->sector_size = mmc_get_bits(raw_csd, 39, 7);
856 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 5);
857 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1);
858 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3);
859 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4);
860 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
571 }
572}
573
861 }
862}
863
864static void
865mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr)
866{
867 unsigned int scr_struct;
868 uint32_t tmp[4];
869
870 tmp[3] = raw_scr[1];
871 tmp[2] = raw_scr[0];
872
873 memset(scr, 0, sizeof(*scr));
874
875 scr_struct = mmc_get_bits(tmp, 60, 4);
876 if (scr_struct != 0) {
877 printf("Unrecognised SCR structure version %d\n",
878 scr_struct);
879 return;
880 }
881 scr->sda_vsn = mmc_get_bits(tmp, 56, 4);
882 scr->bus_widths = mmc_get_bits(tmp, 48, 4);
883}
884
574static int
575mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid)
576{
577 struct mmc_command cmd;
578 int err;
579
580 cmd.opcode = MMC_ALL_SEND_CID;
581 cmd.arg = 0;

--- 15 unchanged lines hidden (view full) ---

597 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;
598 cmd.data = NULL;
599 err = mmc_wait_for_cmd(sc, &cmd, 0);
600 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t));
601 return (err);
602}
603
604static int
885static int
886mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid)
887{
888 struct mmc_command cmd;
889 int err;
890
891 cmd.opcode = MMC_ALL_SEND_CID;
892 cmd.arg = 0;

--- 15 unchanged lines hidden (view full) ---

908 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;
909 cmd.data = NULL;
910 err = mmc_wait_for_cmd(sc, &cmd, 0);
911 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t));
912 return (err);
913}
914
915static int
916mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, uint32_t *rawscr)
917{
918 int err;
919 struct mmc_command cmd;
920 struct mmc_data data;
921
922 memset(&cmd, 0, sizeof(struct mmc_command));
923 memset(&data, 0, sizeof(struct mmc_data));
924
925 memset(rawscr, 0, 8);
926 cmd.opcode = ACMD_SEND_SCR;
927 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
928 cmd.arg = 0;
929 cmd.data = &data;
930
931 data.data = rawscr;
932 data.len = 8;
933 data.flags = MMC_DATA_READ;
934
935 err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES);
936 rawscr[0] = be32toh(rawscr[0]);
937 rawscr[1] = be32toh(rawscr[1]);
938 return (err);
939}
940
941static int
942mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd)
943{
944 int err;
945 struct mmc_command cmd;
946 struct mmc_data data;
947
948 memset(&cmd, 0, sizeof(struct mmc_command));
949 memset(&data, 0, sizeof(struct mmc_data));
950
951 memset(rawextcsd, 0, 512);
952 cmd.opcode = MMC_SEND_EXT_CSD;
953 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
954 cmd.arg = 0;
955 cmd.data = &data;
956
957 data.data = rawextcsd;
958 data.len = 512;
959 data.flags = MMC_DATA_READ;
960
961 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES);
962 return (err);
963}
964
965static int
966mmc_set_relative_addr(struct mmc_softc *sc, uint16_t resp)
967{
968 struct mmc_command cmd;
969 int err;
970
971 cmd.opcode = MMC_SET_RELATIVE_ADDR;
972 cmd.arg = resp << 16;
973 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;
974 cmd.data = NULL;
975 err = mmc_wait_for_cmd(sc, &cmd, 0);
976 return (err);
977}
978
979static int
605mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp)
606{
607 struct mmc_command cmd;
608 int err;
609
610 cmd.opcode = SD_SEND_RELATIVE_ADDR;
611 cmd.arg = 0;
612 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;

--- 5 unchanged lines hidden (view full) ---

618
619static void
620mmc_discover_cards(struct mmc_softc *sc)
621{
622 struct mmc_ivars *ivar;
623 int err;
624 uint32_t resp;
625 device_t child;
980mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp)
981{
982 struct mmc_command cmd;
983 int err;
984
985 cmd.opcode = SD_SEND_RELATIVE_ADDR;
986 cmd.arg = 0;
987 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;

--- 5 unchanged lines hidden (view full) ---

993
994static void
995mmc_discover_cards(struct mmc_softc *sc)
996{
997 struct mmc_ivars *ivar;
998 int err;
999 uint32_t resp;
1000 device_t child;
1001 uint16_t rca = 2;
1002 u_char switch_res[64];
626
627 while (1) {
628 ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF,
629 M_WAITOK | M_ZERO);
630 if (!ivar)
631 return;
632 err = mmc_all_send_cid(sc, ivar->raw_cid);
633 if (err == MMC_ERR_TIMEOUT)
634 break;
635 if (err != MMC_ERR_NONE) {
636 device_printf(sc->dev, "Error reading CID %d\n", err);
637 break;
638 }
1003
1004 while (1) {
1005 ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF,
1006 M_WAITOK | M_ZERO);
1007 if (!ivar)
1008 return;
1009 err = mmc_all_send_cid(sc, ivar->raw_cid);
1010 if (err == MMC_ERR_TIMEOUT)
1011 break;
1012 if (err != MMC_ERR_NONE) {
1013 device_printf(sc->dev, "Error reading CID %d\n", err);
1014 break;
1015 }
639 if (mmcbr_get_mode(sc->dev) == mode_sd) {
640 ivar->mode = mode_sd;
1016 if (mmcbr_get_ro(sc->dev))
1017 ivar->read_only = 1;
1018 ivar->bus_width = bus_width_1;
1019 ivar->mode = mmcbr_get_mode(sc->dev);
1020 if (ivar->mode == mode_sd) {
641 mmc_decode_cid(1, ivar->raw_cid, &ivar->cid);
642 mmc_send_relative_addr(sc, &resp);
643 ivar->rca = resp >> 16;
1021 mmc_decode_cid(1, ivar->raw_cid, &ivar->cid);
1022 mmc_send_relative_addr(sc, &resp);
1023 ivar->rca = resp >> 16;
644 if (mmcbr_get_ro(sc->dev))
645 ivar->read_only = 1;
1024 /* Get card CSD. */
646 mmc_send_csd(sc, ivar->rca, ivar->raw_csd);
647 mmc_decode_csd(1, ivar->raw_csd, &ivar->csd);
1025 mmc_send_csd(sc, ivar->rca, ivar->raw_csd);
1026 mmc_decode_csd(1, ivar->raw_csd, &ivar->csd);
648 printf("SD CARD: %lld bytes\n", (long long)
649 ivar->csd.capacity);
1027 if (ivar->csd.csd_structure > 0)
1028 ivar->high_cap = 1;
1029 ivar->tran_speed = ivar->csd.tran_speed;
1030 /* Get card SCR. Card must be selected to fetch it. */
1031 mmc_select_card(sc, ivar->rca);
1032 mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr);
1033 mmc_app_decode_scr(ivar->raw_scr, &ivar->scr);
1034 /* Get card switch capabilities. */
1035 if ((ivar->scr.sda_vsn >= 1) &&
1036 (ivar->csd.ccc & (1<<10))) {
1037 mmc_sd_switch(sc, 0, 0, 0xF, switch_res);
1038 if (switch_res[13] & 2) {
1039 ivar->timing = bus_timing_hs;
1040 ivar->hs_tran_speed = 50000000;
1041 }
1042 }
1043 mmc_select_card(sc, 0);
1044 /* Find max supported bus width. */
1045 if ((mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) &&
1046 (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4))
1047 ivar->bus_width = bus_width_4;
1048 /* Add device. */
650 child = device_add_child(sc->dev, NULL, -1);
651 device_set_ivars(child, ivar);
652 return;
653 }
1049 child = device_add_child(sc->dev, NULL, -1);
1050 device_set_ivars(child, ivar);
1051 return;
1052 }
654 panic("Write MMC card code here");
1053 mmc_decode_cid(0, ivar->raw_cid, &ivar->cid);
1054 ivar->rca = rca++;
1055 mmc_set_relative_addr(sc, ivar->rca);
1056 /* Get card CSD. */
1057 mmc_send_csd(sc, ivar->rca, ivar->raw_csd);
1058 mmc_decode_csd(0, ivar->raw_csd, &ivar->csd);
1059 ivar->tran_speed = ivar->csd.tran_speed;
1060 /* Only MMC >= 4.x cards support EXT_CSD. */
1061 if (ivar->csd.spec_vers >= 4) {
1062 /* Card must be selected to fetch EXT_CSD. */
1063 mmc_select_card(sc, ivar->rca);
1064 mmc_send_ext_csd(sc, ivar->raw_ext_csd);
1065 /* Get card speed in high speed mode. */
1066 ivar->timing = bus_timing_hs;
1067 if (((uint8_t *)(ivar->raw_ext_csd))[EXT_CSD_CARD_TYPE]
1068 & EXT_CSD_CARD_TYPE_52)
1069 ivar->hs_tran_speed = 52000000;
1070 else if (((uint8_t *)(ivar->raw_ext_csd))[EXT_CSD_CARD_TYPE]
1071 & EXT_CSD_CARD_TYPE_26)
1072 ivar->hs_tran_speed = 26000000;
1073 else
1074 ivar->hs_tran_speed = ivar->tran_speed;
1075 /* Find max supported bus width. */
1076 ivar->bus_width = mmc_test_bus_width(sc);
1077 mmc_select_card(sc, 0);
1078 } else {
1079 ivar->bus_width = bus_width_1;
1080 ivar->timing = bus_timing_normal;
1081 }
1082 /* Add device. */
1083 child = device_add_child(sc->dev, NULL, -1);
1084 device_set_ivars(child, ivar);
655 }
656 free(ivar, M_DEVBUF);
657}
658
659static void
660mmc_go_discovery(struct mmc_softc *sc)
661{
662 uint32_t ocr;
663 device_t dev;
1085 }
1086 free(ivar, M_DEVBUF);
1087}
1088
1089static void
1090mmc_go_discovery(struct mmc_softc *sc)
1091{
1092 uint32_t ocr;
1093 device_t dev;
1094 int err;
664
665 dev = sc->dev;
666 if (mmcbr_get_power_mode(dev) != power_on) {
667 /*
668 * First, try SD modes
669 */
670 mmcbr_set_mode(dev, mode_sd);
671 mmc_power_up(sc);
672 mmcbr_set_bus_mode(dev, pushpull);
673 mmc_idle_cards(sc);
1095
1096 dev = sc->dev;
1097 if (mmcbr_get_power_mode(dev) != power_on) {
1098 /*
1099 * First, try SD modes
1100 */
1101 mmcbr_set_mode(dev, mode_sd);
1102 mmc_power_up(sc);
1103 mmcbr_set_bus_mode(dev, pushpull);
1104 mmc_idle_cards(sc);
674 if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) {
1105 err = mmc_send_if_cond(sc, 1);
1106 if (mmc_send_app_op_cond(sc, err?0:MMC_OCR_CCS, &ocr) !=
1107 MMC_ERR_NONE) {
675 /*
676 * Failed, try MMC
677 */
678 mmcbr_set_mode(dev, mode_mmc);
679 if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE)
680 return; /* Failed both, punt! XXX powerdown? */
681 }
682 mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr));

--- 9 unchanged lines hidden (view full) ---

692 * Make sure that we have a mutually agreeable voltage to at least
693 * one card on the bus.
694 */
695 if (mmcbr_get_ocr(dev) == 0)
696 return;
697 /*
698 * Reselect the cards after we've idled them above.
699 */
1108 /*
1109 * Failed, try MMC
1110 */
1111 mmcbr_set_mode(dev, mode_mmc);
1112 if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE)
1113 return; /* Failed both, punt! XXX powerdown? */
1114 }
1115 mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr));

--- 9 unchanged lines hidden (view full) ---

1125 * Make sure that we have a mutually agreeable voltage to at least
1126 * one card on the bus.
1127 */
1128 if (mmcbr_get_ocr(dev) == 0)
1129 return;
1130 /*
1131 * Reselect the cards after we've idled them above.
1132 */
700 if (mmcbr_get_mode(dev) == mode_sd)
701 mmc_send_app_op_cond(sc, mmcbr_get_ocr(dev), NULL);
702 else
1133 if (mmcbr_get_mode(dev) == mode_sd) {
1134 err = mmc_send_if_cond(sc, 1);
1135 mmc_send_app_op_cond(sc,
1136 (err?0:MMC_OCR_CCS)|mmcbr_get_ocr(dev), NULL);
1137 } else
703 mmc_send_op_cond(sc, mmcbr_get_ocr(dev), NULL);
704 mmc_discover_cards(sc);
705
706 mmcbr_set_bus_mode(dev, pushpull);
707 mmcbr_update_ios(dev);
708 bus_generic_attach(dev);
709/* mmc_update_children_sysctl(dev);*/
710}
711
712static int
713mmc_calculate_clock(struct mmc_softc *sc)
714{
1138 mmc_send_op_cond(sc, mmcbr_get_ocr(dev), NULL);
1139 mmc_discover_cards(sc);
1140
1141 mmcbr_set_bus_mode(dev, pushpull);
1142 mmcbr_update_ios(dev);
1143 bus_generic_attach(dev);
1144/* mmc_update_children_sysctl(dev);*/
1145}
1146
1147static int
1148mmc_calculate_clock(struct mmc_softc *sc)
1149{
715 int max_dtr = 0;
1150 int max_dtr, max_hs_dtr, max_timing;
716 int nkid, i, f_min, f_max;
717 device_t *kids;
1151 int nkid, i, f_min, f_max;
1152 device_t *kids;
1153 struct mmc_ivars *ivar;
718
719 f_min = mmcbr_get_f_min(sc->dev);
720 f_max = mmcbr_get_f_max(sc->dev);
1154
1155 f_min = mmcbr_get_f_min(sc->dev);
1156 f_max = mmcbr_get_f_max(sc->dev);
721 max_dtr = f_max;
1157 max_dtr = max_hs_dtr = f_max;
1158 if ((mmcbr_get_caps(sc->dev) & MMC_CAP_HSPEED))
1159 max_timing = bus_timing_hs;
1160 else
1161 max_timing = bus_timing_normal;
722 if (device_get_children(sc->dev, &kids, &nkid) != 0)
723 panic("can't get children");
1162 if (device_get_children(sc->dev, &kids, &nkid) != 0)
1163 panic("can't get children");
724 for (i = 0; i < nkid; i++)
725 if (mmc_get_tran_speed(kids[i]) < max_dtr)
726 max_dtr = mmc_get_tran_speed(kids[i]);
1164 for (i = 0; i < nkid; i++) {
1165 ivar = device_get_ivars(kids[i]);
1166 if (ivar->timing < max_timing)
1167 max_timing = ivar->timing;
1168 if (ivar->tran_speed < max_dtr)
1169 max_dtr = ivar->tran_speed;
1170 if (ivar->hs_tran_speed < max_dtr)
1171 max_hs_dtr = ivar->hs_tran_speed;
1172 }
1173 for (i = 0; i < nkid; i++) {
1174 ivar = device_get_ivars(kids[i]);
1175 if (ivar->timing == bus_timing_normal)
1176 continue;
1177 mmc_select_card(sc, ivar->rca);
1178 mmc_set_timing(sc, max_timing);
1179 }
1180 mmc_select_card(sc, 0);
727 free(kids, M_TEMP);
1181 free(kids, M_TEMP);
728 device_printf(sc->dev, "setting transfer rate to %d.%03dMHz\n",
729 max_dtr / 1000000, (max_dtr / 1000) % 1000);
730 return (max_dtr);
1182 if (max_timing == bus_timing_hs)
1183 max_dtr = max_hs_dtr;
1184 device_printf(sc->dev, "setting transfer rate to %d.%03dMHz%s\n",
1185 max_dtr / 1000000, (max_dtr / 1000) % 1000,
1186 (max_timing == bus_timing_hs)?" with high speed timing":"");
1187 mmcbr_set_timing(sc->dev, max_timing);
1188 mmcbr_set_clock(sc->dev, max_dtr);
1189 mmcbr_update_ios(sc->dev);
1190 return max_dtr;
731}
732
733static void
734mmc_scan(struct mmc_softc *sc)
735{
736 device_t dev;
737
738 dev = sc->dev;
739 mmc_acquire_bus(dev, dev);
740
741 if (mmcbr_get_power_mode(dev) == power_on)
742 mmc_rescan_cards(sc);
743 mmc_go_discovery(sc);
1191}
1192
1193static void
1194mmc_scan(struct mmc_softc *sc)
1195{
1196 device_t dev;
1197
1198 dev = sc->dev;
1199 mmc_acquire_bus(dev, dev);
1200
1201 if (mmcbr_get_power_mode(dev) == power_on)
1202 mmc_rescan_cards(sc);
1203 mmc_go_discovery(sc);
744 mmcbr_set_clock(dev, mmc_calculate_clock(sc));
745 mmcbr_update_ios(dev);
1204 mmc_calculate_clock(sc);
746
747 mmc_release_bus(dev, dev);
748 /* XXX probe/attach/detach children? */
749}
750
751static int
752mmc_read_ivar(device_t bus, device_t child, int which, u_char *result)
753{

--- 15 unchanged lines hidden (view full) ---

769 *(int *)result = MMC_SECTOR_SIZE;
770 break;
771 case MMC_IVAR_TRAN_SPEED:
772 *(int *)result = ivar->csd.tran_speed;
773 break;
774 case MMC_IVAR_READ_ONLY:
775 *(int *)result = ivar->read_only;
776 break;
1205
1206 mmc_release_bus(dev, dev);
1207 /* XXX probe/attach/detach children? */
1208}
1209
1210static int
1211mmc_read_ivar(device_t bus, device_t child, int which, u_char *result)
1212{

--- 15 unchanged lines hidden (view full) ---

1228 *(int *)result = MMC_SECTOR_SIZE;
1229 break;
1230 case MMC_IVAR_TRAN_SPEED:
1231 *(int *)result = ivar->csd.tran_speed;
1232 break;
1233 case MMC_IVAR_READ_ONLY:
1234 *(int *)result = ivar->read_only;
1235 break;
1236 case MMC_IVAR_HIGH_CAP:
1237 *(int *)result = ivar->high_cap;
1238 break;
777 }
778 return (0);
779}
780
781static int
782mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
783{
784 /*

--- 43 unchanged lines hidden ---
1239 }
1240 return (0);
1241}
1242
1243static int
1244mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
1245{
1246 /*

--- 43 unchanged lines hidden ---