Deleted Added
full compact
54c54
< __FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 184452 2008-10-29 20:01:26Z mav $");
---
> __FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 185721 2008-12-06 21:41:27Z mav $");
110a111,112
> static int mmc_suspend(device_t dev);
> static int mmc_resume(device_t dev);
132a135,136
> static void mmc_scan(struct mmc_softc *sc);
> static int mmc_delete_cards(struct mmc_softc *sc);
169,170c173
< device_t *kids;
< int i, nkid;
---
> int err;
172,183c175,176
< /* kill children [ph33r]. -sorbo */
< if (device_get_children(sc->dev, &kids, &nkid) != 0)
< return (0);
< for (i = 0; i < nkid; i++) {
< device_t kid = kids[i];
< void *ivar = device_get_ivars(kid);
<
< device_detach(kid);
< device_delete_child(sc->dev, kid);
< free(ivar, M_DEVBUF);
< }
< free(kids, M_TEMP);
---
> if ((err = mmc_delete_cards(sc)) != 0)
> return (err);
185d177
<
191a184,205
> mmc_suspend(device_t dev)
> {
> struct mmc_softc *sc = device_get_softc(dev);
> int err;
>
> err = bus_generic_suspend(dev);
> if (err)
> return (err);
> mmc_power_down(sc);
> return (0);
> }
>
> static int
> mmc_resume(device_t dev)
> {
> struct mmc_softc *sc = device_get_softc(dev);
>
> mmc_scan(sc);
> return (bus_generic_resume(dev));
> }
>
> static int
268,273d281
< static void
< mmc_rescan_cards(struct mmc_softc *sc)
< {
< /* XXX: Look at the children and see if they respond to status */
< }
<
297d304
< /* printf("Wakeup for req %p done_data %p\n", req, req->done_data); */
301d307
< wakeup(req);
302a309
> wakeup(req);
308d314
< int err;
312d317
< /* printf("Submitting request %p sc %p\n", req, sc); */
315,319c320,321
< do {
< err = msleep(req, &sc->sc_mtx, PZERO | PCATCH, "mmcreq",
< hz / 10);
< } while (!(req->flags & MMC_REQ_DONE) && err == EAGAIN);
< /* printf("Request %p done with error %d\n", req, err); */
---
> while ((req->flags & MMC_REQ_DONE) == 0)
> msleep(req, &sc->sc_mtx, 0, "mmcreq", 0);
321c323
< return (err);
---
> return (0);
1063,1064c1065,1068
< struct mmc_ivars *ivar;
< int err;
---
> struct mmc_ivars *ivar = NULL;
> device_t *devlist;
> int err, i, devcount, newcard;
> uint32_t raw_cid[4];
1071,1075c1075
< ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF,
< M_WAITOK | M_ZERO);
< if (!ivar)
< return;
< err = mmc_all_send_cid(sc, ivar->raw_cid);
---
> err = mmc_all_send_cid(sc, raw_cid);
1081a1082,1099
> newcard = 1;
> if ((err = device_get_children(sc->dev, &devlist, &devcount)) != 0)
> return;
> for (i = 0; i < devcount; i++) {
> ivar = device_get_ivars(devlist[i]);
> if (memcmp(ivar->raw_cid, raw_cid, sizeof(raw_cid)) == 0) {
> newcard = 0;
> break;
> }
> }
> free(devlist, M_TEMP);
> if (newcard) {
> ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF,
> M_WAITOK | M_ZERO);
> if (!ivar)
> return;
> memcpy(ivar->raw_cid, raw_cid, sizeof(raw_cid));
> }
1124,1126c1142,1146
< /* Add device. */
< child = device_add_child(sc->dev, NULL, -1);
< device_set_ivars(child, ivar);
---
> if (newcard) {
> /* Add device. */
> child = device_add_child(sc->dev, NULL, -1);
> device_set_ivars(child, ivar);
> }
1177,1179c1197,1201
< /* Add device. */
< child = device_add_child(sc->dev, NULL, -1);
< device_set_ivars(child, ivar);
---
> if (newcard) {
> /* Add device. */
> child = device_add_child(sc->dev, NULL, -1);
> device_set_ivars(child, ivar);
> }
1181d1202
< free(ivar, M_DEVBUF);
1184a1206,1243
> mmc_rescan_cards(struct mmc_softc *sc)
> {
> struct mmc_ivars *ivar = NULL;
> device_t *devlist;
> int err, i, devcount;
>
> if ((err = device_get_children(sc->dev, &devlist, &devcount)) != 0)
> return;
> for (i = 0; i < devcount; i++) {
> ivar = device_get_ivars(devlist[i]);
> if (mmc_select_card(sc, ivar->rca)) {
> device_delete_child(sc->dev, devlist[i]);
> free(ivar, M_DEVBUF);
> }
> }
> free(devlist, M_TEMP);
> mmc_select_card(sc, 0);
> }
>
> static int
> mmc_delete_cards(struct mmc_softc *sc)
> {
> struct mmc_ivars *ivar;
> device_t *devlist;
> int err, i, devcount;
>
> if ((err = device_get_children(sc->dev, &devlist, &devcount)) != 0)
> return (err);
> for (i = 0; i < devcount; i++) {
> ivar = device_get_ivars(devlist[i]);
> device_delete_child(sc->dev, devlist[i]);
> free(ivar, M_DEVBUF);
> }
> free(devlist, M_TEMP);
> return (0);
> }
>
> static void
1208c1267
< return; /* Failed both, punt! XXX powerdown? */
---
> ocr = 0; /* Failed both, powerdown. */
1223c1282,1284
< if (mmcbr_get_ocr(dev) == 0)
---
> if (mmcbr_get_ocr(dev) == 0) {
> mmc_delete_cards(sc);
> mmc_power_down(sc);
1224a1286
> }
1234a1297
> mmc_rescan_cards(sc);
1295c1358
< device_t dev;
---
> device_t dev = sc->dev;
1297d1359
< dev = sc->dev;
1299,1301d1360
<
< if (mmcbr_get_power_mode(dev) == power_on)
< mmc_rescan_cards(sc);
1303d1361
<
1305d1362
< /* XXX probe/attach/detach children? */
1376a1434,1435
> DEVMETHOD(device_suspend, mmc_suspend),
> DEVMETHOD(device_resume, mmc_resume),