Index: sys/dev/ata/ata-disk.c =================================================================== --- sys/dev/ata/ata-disk.c (revision 211707) +++ sys/dev/ata/ata-disk.c (working copy) @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -59,6 +60,7 @@ static int ad_get_geometry(device_t dev); static void ad_set_geometry(device_t dev); static void ad_done(struct ata_request *request); static void ad_describe(device_t dev); +static int ad_shutdown(struct ata_device *, int); static int ad_version(u_int16_t version); static disk_strategy_t ad_strategy; static disk_ioctl_t ad_ioctl; @@ -161,6 +163,10 @@ ad_attach(device_t dev) device_add_child(dev, "subdisk", device_get_unit(dev)); bus_generic_attach(dev); + if ((EVENTHANDLER_REGISTER(shutdown_final, ad_shutdown, + atadev, SHUTDOWN_PRI_FIRST)) == NULL) + printf("ad_attach: failed to register shutdown event.\n"); + callout_init(&atadev->spindown_timer, 1); return 0; } @@ -201,12 +207,13 @@ ad_detach(device_t dev) } static int -ad_shutdown(device_t dev) +ad_shutdown(struct ata_device *atadev, int howto) { - struct ata_device *atadev = device_get_softc(dev); if (atadev->param.support.command2 & ATA_SUPPORT_FLUSHCACHE) - ata_controlcmd(dev, ATA_FLUSHCACHE, 0, 0, 0); + ata_controlcmd(atadev->dev, ATA_FLUSHCACHE, 0, 0, 0); + if ((howto & RB_POWEROFF) && (atadev->param.support.command1 & ATA_SUPPORT_POWERMGT)) + ata_controlcmd(atadev->dev, ATA_STANDBY_IMMEDIATE, 0, 0, 0); return 0; } @@ -591,7 +598,7 @@ static device_method_t ad_methods[] = { DEVMETHOD(device_probe, ad_probe), DEVMETHOD(device_attach, ad_attach), DEVMETHOD(device_detach, ad_detach), - DEVMETHOD(device_shutdown, ad_shutdown), + DEVMETHOD(device_shutdown, bus_generic_shutdown), /* ATA methods */ DEVMETHOD(ata_reinit, ad_reinit),