mfi(4): Update to LSI's version 4.23 of the driver.
[dragonfly.git] / sys / dev / raid / mfi / mfi_syspd.c
index 3119f21..f56a803 100644 (file)
@@ -29,6 +29,7 @@
  * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_pddisk.c,v 1.2.2.6 2007/08/24 17:29:18 jhb Exp $
+ * FreeBSD projects/head_mfi/ r232888
  */
 
 #include "opt_mfi.h"
@@ -88,7 +89,7 @@ static driver_t mfi_syspd_driver = {
        sizeof(struct mfi_system_pd)
 };
 
-DRIVER_MODULE(mfisyspd, mfi, mfi_syspd_driver, mfi_syspd_devclass, 0, 0);
+DRIVER_MODULE(mfisyspd, mfi, mfi_syspd_driver, mfi_syspd_devclass, NULL, NULL);
 
 static int
 mfi_syspd_probe(device_t dev)
@@ -148,7 +149,6 @@ mfi_syspd_attach(device_t dev)
 
        disk_setdiskinfo(&sc->pd_disk, &info);
 
-       device_printf(dev, " SYSPD volume attached\n");
        return (0);
 }
 
@@ -158,13 +158,11 @@ mfi_syspd_detach(device_t dev)
        struct mfi_system_pd *sc;
 
        sc = device_get_softc(dev);
-       device_printf(dev, "Detaching syspd\n");
        lockmgr(&sc->pd_controller->mfi_io_lock, LK_EXCLUSIVE);
        if ((sc->pd_flags & MFI_DISK_FLAGS_OPEN) &&
            (sc->pd_controller->mfi_keep_deleted_volumes ||
            sc->pd_controller->mfi_detaching)) {
                lockmgr(&sc->pd_controller->mfi_io_lock, LK_RELEASE);
-               device_printf(dev,"Cant detach syspd\n");
                return (EBUSY);
        }
        lockmgr(&sc->pd_controller->mfi_io_lock, LK_RELEASE);
@@ -211,12 +209,12 @@ int
 mfi_syspd_disable(struct mfi_system_pd *sc)
 {
 
-       device_printf(sc->pd_dev,"syspd disable \n");
        KKASSERT(lockstatus(&sc->pd_controller->mfi_io_lock, curthread) != 0);
        if (sc->pd_flags & MFI_DISK_FLAGS_OPEN) {
                if (sc->pd_controller->mfi_delete_busy_volumes)
                        return (0);
-               device_printf(sc->pd_dev, "Unable to delete busy syspd device\n");
+               device_printf(sc->pd_dev,
+                   "Unable to delete busy syspd device\n");
                return (EBUSY);
        }
        sc->pd_flags |= MFI_DISK_FLAGS_DISABLED;
@@ -227,7 +225,6 @@ void
 mfi_syspd_enable(struct mfi_system_pd *sc)
 {
 
-       device_printf(sc->pd_dev,"syspd enable \n");
        KKASSERT(lockstatus(&sc->pd_controller->mfi_io_lock, curthread) != 0);
        sc->pd_flags &= ~MFI_DISK_FLAGS_DISABLED;
 }
@@ -238,7 +235,7 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
        struct bio *bio = ap->a_bio;
        struct buf *bp = bio->bio_buf;
        struct mfi_system_pd *sc = ap->a_head.a_dev->si_drv1;
-       struct mfi_softc *controller;
+       struct mfi_softc *controller = sc->pd_controller;
 
        if (sc == NULL) {
                bp->b_error = EINVAL;
@@ -248,6 +245,16 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
+       if (controller->hw_crit_error) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
+       if (controller->issuepend_done == 0) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
        /*
         * XXX swildner
         *
@@ -267,7 +274,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
-       controller = sc->pd_controller;
        bio->bio_driver_info = sc;
        lockmgr(&controller->mfi_io_lock, LK_EXCLUSIVE);
        mfi_enqueue_bio(controller, bio);
@@ -277,26 +283,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
        return (0);
 }
 
-#if 0
-void
-mfi_disk_complete(struct bio *bio)
-{
-       struct mfi_system_pd *sc = bio->bio_driver_info;
-       struct buf *bp = bio->bio_buf;
-
-       devstat_end_transaction_buf(&sc->pd_devstat, bp);
-       if (bio->b_flags & B_ERROR) {
-               if (bp->b_error == 0)
-                       bp->b_error = EIO;
-               diskerr(bio, sc->pd_disk.d_cdev, "hard error", -1, 1);
-               kprintf("\n");
-       } else {
-               bp->b_resid = 0;
-       }
-       biodone(bio);
-}
-#endif
-
 static int
 mfi_syspd_dump(struct dev_dump_args *ap)
 {
@@ -312,8 +298,8 @@ mfi_syspd_dump(struct dev_dump_args *ap)
        parent_sc = sc->pd_controller;
 
        if (len > 0) {
-               if ((error = mfi_dump_syspd_blocks(parent_sc, sc->pd_id, offset /
-                   MFI_SECTOR_LEN, virt, len)) != 0)
+               if ((error = mfi_dump_syspd_blocks(parent_sc,
+                   sc->pd_id, offset / MFI_SECTOR_LEN, virt, len)) != 0)
                        return (error);
        } else {
                /* mfi_sync_cache(parent_sc, sc->ld_id); */