Lines Matching refs:fcp

109 #define	KIOIP	KSTAT_INTR_PTR(fcp->c_intrstat)
237 static int fdc_enhance_probe(struct fdcntlr *fcp);
357 struct fdcntlr *fcp; in fdc_bus_ctl() local
365 if ((fcp = ddi_get_driver_private(dip)) == NULL) in fdc_bus_ctl()
390 cntlr = fcp->c_number; in fdc_bus_ctl()
397 (fcp->c_unit[FDUNIT(unit)])->fj_dip) in fdc_bus_ctl()
403 fjp = fcp->c_unit[FDUNIT(unit)]; in fdc_bus_ctl()
407 fjp->fj_fdc = fcp; in fdc_bus_ctl()
408 fjp->fj_iblock = &fcp->c_iblock; in fdc_bus_ctl()
434 struct fdcntlr *fcp; in fdc_getinfo() local
441 if (fcp = ddi_get_soft_state(fdc_state_head, (dev_t)arg)) { in fdc_getinfo()
442 *result = fcp->c_dip; in fdc_getinfo()
492 struct fdcntlr *fcp; in fdc_attach() local
522 fcp = ddi_get_soft_state(fdc_state_head, ctlr); in fdc_attach()
524 for (unit = 0, fjp = (struct fcu_obj *)(fcp+1); in fdc_attach()
526 fcp->c_unit[unit] = fjp++; in fdc_attach()
528 fcp->c_dip = dip; in fdc_attach()
530 if (fdc_propinit1(fcp, cntlr_num) != DDI_SUCCESS) in fdc_attach()
534 if (ddi_get_iblock_cookie(dip, (uint_t)0, &fcp->c_iblock) != in fdc_attach()
540 mutex_init(&fcp->c_lock, NULL, MUTEX_DRIVER, fcp->c_iblock); in fdc_attach()
545 (ddi_idevice_cookie_t *)0, fdc_intr, (caddr_t)fcp) != in fdc_attach()
557 if (ddi_dmae_alloc(dip, fcp->c_dmachan, DDI_DMA_DONTWAIT, NULL) in fdc_attach()
560 fcp->c_dmachan); in fdc_attach()
566 mutex_init(&fcp->c_dorlock, NULL, MUTEX_DRIVER, fcp->c_iblock); in fdc_attach()
567 cv_init(&fcp->c_iocv, NULL, CV_DRIVER, fcp->c_iblock); in fdc_attach()
568 sema_init(&fcp->c_selsem, 1, NULL, SEMA_DRIVER, NULL); in fdc_attach()
571 fcp->c_intrstat = kstat_create("fdc", ctlr, name, in fdc_attach()
573 if (fcp->c_intrstat) { in fdc_attach()
574 kstat_install(fcp->c_intrstat); in fdc_attach()
577 ddi_set_driver_private(dip, fcp); in fdc_attach()
582 sema_p(&fcp->c_selsem); in fdc_attach()
583 mutex_enter(&fcp->c_lock); in fdc_attach()
584 fcp->c_csb.csb_xstate = FXS_RESET; in fdc_attach()
585 fcp->c_flags |= FCFLG_WAITING; in fdc_attach()
586 fdcquiesce(fcp); in fdc_attach()
589 fcp->c_mode = (inb(fcp->c_regbase + FCR_SRB) & 0x1c) ? in fdc_attach()
592 while (fcp->c_flags & FCFLG_WAITING) { in fdc_attach()
593 cv_wait(&fcp->c_iocv, &fcp->c_lock); in fdc_attach()
595 mutex_exit(&fcp->c_lock); in fdc_attach()
596 sema_v(&fcp->c_selsem); in fdc_attach()
598 fdc_propinit2(fcp); in fdc_attach()
605 fcp = ddi_get_driver_private(dip); in fdc_attach()
607 mutex_enter(&fcp->c_lock); in fdc_attach()
608 fcp->c_suspended = B_FALSE; in fdc_attach()
609 fcp->c_csb.csb_xstate = FXS_RESET; in fdc_attach()
610 fcp->c_flags |= FCFLG_WAITING; in fdc_attach()
611 fdcquiesce(fcp); in fdc_attach()
613 while (fcp->c_flags & FCFLG_WAITING) { in fdc_attach()
614 cv_wait(&fcp->c_iocv, &fcp->c_lock); in fdc_attach()
616 mutex_exit(&fcp->c_lock); in fdc_attach()
619 sema_v(&fcp->c_selsem); in fdc_attach()
631 ddi_remove_intr(dip, 0, fcp->c_iblock); in fdc_attach()
632 mutex_destroy(&fcp->c_lock); in fdc_attach()
639 fdc_propinit1(struct fdcntlr *fcp, int cntlr) in fdc_propinit1() argument
645 dip = fcp->c_dip; in fdc_propinit1()
651 fcp->c_regbase = (ushort_t)value; in fdc_propinit1()
660 fcp->c_dmachan = (ushort_t)value; in fdc_propinit1()
661 fcp->c_number = cntlr; in fdc_propinit1()
666 fdc_propinit2(struct fdcntlr *fcp) in fdc_propinit2() argument
673 dip = fcp->c_dip; in fdc_propinit2()
679 fcp->c_chip = value; in fdc_propinit2()
685 fcp->c_chip = i8272A; in fdc_propinit2()
686 (void) fdc_docmd(fcp, &versioncmd, 1); in fdc_propinit2()
691 if (!fdc_result(fcp, &result, 1) && result == 0x90) { in fdc_propinit2()
696 if (fdc_docmd(fcp, perpindcmd, 2) || in fdc_propinit2()
697 fdc_docmd(fcp, configurecmd, 4)) in fdc_propinit2()
702 (void) fdc_result(fcp, &result, 1); in fdc_propinit2()
710 if ((fcp->c_chip = fdc_enhance_probe(fcp)) == 0) in fdc_propinit2()
712 fcp->c_chip = i82077; in fdc_propinit2()
715 "chip", fcp->c_chip); in fdc_propinit2()
721 if (fcp->c_chip >= i82077 && fcp->c_mode == FDCMODE_30 && in fdc_propinit2()
722 (inb(fcp->c_regbase + FCR_DIR) & 0x70) == 0) in fdc_propinit2()
729 outb(fcp->c_regbase + FCR_CCR, ccr); in fdc_propinit2()
731 if ((inb(fcp->c_regbase + FCR_DIR) & in fdc_propinit2()
733 fcp->c_mode = FDCMODE_AT; in fdc_propinit2()
738 fcp->c_mode = FDCMODE_AT; in fdc_propinit2()
739 outb(fcp->c_regbase + FCR_CCR, 0); in fdc_propinit2()
743 fdc_enhance_probe(struct fdcntlr *fcp) in fdc_enhance_probe() argument
759 (void) fdc_docmd(fcp, &nsccmd, 1); in fdc_enhance_probe()
764 if (!fdc_result(fcp, &result, 1) && result != S0_IVCMD) { in fdc_enhance_probe()
771 fcp->c_flags |= FCFLG_3DMODE; in fdc_enhance_probe()
777 save = inb(fcp->c_regbase + FCR_SRA); in fdc_enhance_probe()
784 outb(fcp->c_regbase + FCR_SRA, FSA_ENA5); in fdc_enhance_probe()
785 outb(fcp->c_regbase + FCR_SRA, FSA_ENA5); in fdc_enhance_probe()
788 outb(fcp->c_regbase + FCR_SRA, 0x0F); in fdc_enhance_probe()
789 if (inb(fcp->c_regbase + FCR_SRB) != 0x00) in fdc_enhance_probe()
792 outb(fcp->c_regbase + FCR_SRA, 0x0D); in fdc_enhance_probe()
793 if (inb(fcp->c_regbase + FCR_SRB) != 0x65) in fdc_enhance_probe()
796 outb(fcp->c_regbase + FCR_SRA, 0x0E); in fdc_enhance_probe()
797 result = inb(fcp->c_regbase + FCR_SRB); in fdc_enhance_probe()
804 fcp->c_flags |= FCFLG_3DMODE; in fdc_enhance_probe()
807 outb(fcp->c_regbase + FCR_SRA, FSA_DISB); in fdc_enhance_probe()
812 outb(fcp->c_regbase + FCR_SRA, FSA_ENA6); in fdc_enhance_probe()
813 outb(fcp->c_regbase + FCR_SRA, FSA_ENA6); in fdc_enhance_probe()
816 outb(fcp->c_regbase + FCR_SRA, 0x0F); in fdc_enhance_probe()
817 if (inb(fcp->c_regbase + FCR_SRB) != 0x00) in fdc_enhance_probe()
820 outb(fcp->c_regbase + FCR_SRA, 0x0D); in fdc_enhance_probe()
821 if (inb(fcp->c_regbase + FCR_SRB) != 0x66) in fdc_enhance_probe()
824 outb(fcp->c_regbase + FCR_SRA, 0x0E); in fdc_enhance_probe()
825 result = inb(fcp->c_regbase + FCR_SRB); in fdc_enhance_probe()
832 fcp->c_flags |= FCFLG_3DMODE; in fdc_enhance_probe()
835 outb(fcp->c_regbase + FCR_SRA, FSA_DISB); in fdc_enhance_probe()
838 outb(fcp->c_regbase + FCR_SRA, save); in fdc_enhance_probe()
846 struct fdcntlr *fcp; in fdc_detach() local
853 fcp = ddi_get_driver_private(dip); in fdc_detach()
858 if ((fcp->c_unit[unit])->fj_dip) { in fdc_detach()
862 kstat_delete(fcp->c_intrstat); in fdc_detach()
863 fcp->c_intrstat = NULL; in fdc_detach()
864 ddi_remove_intr(fcp->c_dip, 0, fcp->c_iblock); in fdc_detach()
865 if (ddi_dmae_release(fcp->c_dip, fcp->c_dmachan) != in fdc_detach()
869 (void*)fcp->c_dip, fcp->c_dmachan); in fdc_detach()
870 ddi_prop_remove_all(fcp->c_dip); in fdc_detach()
871 ddi_set_driver_private(fcp->c_dip, NULL); in fdc_detach()
873 mutex_destroy(&fcp->c_lock); in fdc_detach()
874 mutex_destroy(&fcp->c_dorlock); in fdc_detach()
875 cv_destroy(&fcp->c_iocv); in fdc_detach()
876 sema_destroy(&fcp->c_selsem); in fdc_detach()
889 sema_p(&fcp->c_selsem); in fdc_detach()
891 if (ddi_dmae_disable(fcp->c_dip, fcp->c_dmachan) != in fdc_detach()
894 "dip %p, dmachan %x", (void *)fcp->c_dip, in fdc_detach()
895 fcp->c_dmachan); in fdc_detach()
897 sema_v(&fcp->c_selsem); in fdc_detach()
901 mutex_enter(&fcp->c_lock); in fdc_detach()
902 fcp->c_suspended = B_TRUE; in fdc_detach()
903 mutex_exit(&fcp->c_lock); in fdc_detach()
919 struct fdcntlr *fcp = fjp->fj_fdc; in fdc_abort() local
923 if (fcp->c_curunit == unit) { in fdc_abort()
924 mutex_enter(&fcp->c_lock); in fdc_abort()
925 if (fcp->c_flags & FCFLG_WAITING) { in fdc_abort()
929 fdcquiesce(fcp); in fdc_abort()
930 fcp->c_csb.csb_xstate = FXS_RESET; in fdc_abort()
931 fcp->c_flags |= FCFLG_TIMEOUT; in fdc_abort()
932 if (ddi_dmae_stop(fcp->c_dip, fcp->c_dmachan) != in fdc_abort()
937 (void*)fcp->c_dip, fcp->c_dmachan); in fdc_abort()
939 mutex_exit(&fcp->c_lock); in fdc_abort()
949 struct fdcntlr *fcp = fjp->fj_fdc; in fdc_dkinfo() local
951 (void) strncpy((char *)&dcp->dki_cname, ddi_get_name(fcp->c_dip), in fdc_dkinfo()
955 dcp->dki_addr = fcp->c_regbase; in fdc_dkinfo()
957 dcp->dki_prio = fcp->c_intprio; in fdc_dkinfo()
958 dcp->dki_vec = fcp->c_intvec; in fdc_dkinfo()
972 struct fdcntlr *fcp = fjp->fj_fdc; in fdc_select() local
977 sema_p(&fcp->c_selsem); in fdc_select()
981 if (fcp->c_curunit != unit || !(fjp->fj_flags & FUNIT_CHAROK)) { in fdc_select()
982 fcp->c_curunit = unit; in fdc_select()
984 if (fdcspecify(fcp, in fdc_select()
990 " head load time 40", (void*)fcp, in fdc_select()
995 mutex_enter(&fcp->c_dorlock); in fdc_select()
998 fcp->c_digout = (fcp->c_digout & ~FD_DRSEL) | in fdc_select()
1000 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_select()
1007 if (fdcspdchange(fcp, fjp, fjp->fj_attr->fda_rotatespd)) { in fdc_select()
1015 fcp->c_digout = (fcp->c_digout & ~FD_DRSEL) | (unit & FD_DRSEL); in fdc_select()
1016 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_select()
1018 mutex_exit(&fcp->c_dorlock); in fdc_select()
1019 fcp->c_csb.csb_drive = (uchar_t)unit; in fdc_select()
1024 mutex_enter(&fcp->c_dorlock); in fdc_select()
1026 fcp->c_digout |= FD_DRSEL; in fdc_select()
1027 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_select()
1034 mutex_exit(&fcp->c_dorlock); in fdc_select()
1037 sema_v(&fcp->c_selsem); in fdc_select()
1055 struct fdcntlr *fcp = fjp->fj_fdc; in fdresetchng() local
1061 if (fcp->c_curpcyl[unit]) in fdresetchng()
1062 newcyl = fcp->c_curpcyl[unit] - 1; in fdresetchng()
1075 struct fdcntlr *fcp = fjp->fj_fdc; in fdrecalseek() local
1083 csb = &fcp->c_csb; in fdrecalseek()
1106 if (rval = fdc_exec(fcp, 1, execflg)) in fdrecalseek()
1115 if (fdcsense_drv(fcp, unit)) in fdrecalseek()
1129 struct fdcntlr *fcp = fjp->fj_fdc; in fdrw() local
1140 csb = &fcp->c_csb; in fdrw()
1176 if (ddi_dma_alloc_handle(fcp->c_dip, &fdc_dma_attr, DDI_DMA_SLEEP, in fdrw()
1220 rval = fdc_exec(fcp, 1, 1); in fdrw()
1248 struct fdcntlr *fcp = fjp->fj_fdc; in fdtrkformat() local
1262 csb = &fcp->c_csb; in fdtrkformat()
1295 if (ddi_dma_alloc_handle(fcp->c_dip, &fdc_dma_attr, DDI_DMA_SLEEP, in fdtrkformat()
1350 rval = fdc_exec(fcp, 1, 1); in fdtrkformat()
1372 struct fdcntlr *fcp = fjp->fj_fdc; in fdrawioctl() local
1390 csb = &fcp->c_csb; in fdrawioctl()
1465 if (ddi_dma_alloc_handle(fcp->c_dip, &fdc_dma_attr, in fdrawioctl()
1536 rval_exec = fdc_exec(fcp, sleep, change); in fdrawioctl()
1613 struct fdcntlr *fcp; in fdc_quiesce() local
1617 fcp = ddi_get_soft_state(fdc_state_head, ctlr); in fdc_quiesce()
1619 if (fcp == NULL) in fdc_quiesce()
1626 struct fcu_obj *fjp = fcp->c_unit[unit]; in fdc_quiesce()
1635 (void) ddi_dmae_disable(fcp->c_dip, fcp->c_dmachan); in fdc_quiesce()
1637 fcp->c_digout = (fcp->c_digout & (FD_DMTREN | FD_DRSEL)) | FD_ENABLE; in fdc_quiesce()
1638 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_quiesce()
1640 fcp->c_digout |= FD_RSETZ; in fdc_quiesce()
1641 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_quiesce()
1643 if (fcp->c_chip >= i82077) { in fdc_quiesce()
1649 if ((inb(fcp->c_regbase + FCR_MSR) & in fdc_quiesce()
1658 outb(fcp->c_regbase + FCR_DATA, *oplistp++); in fdc_quiesce()
1667 fdcquiesce(struct fdcntlr *fcp) in fdcquiesce() argument
1672 (void*)fcp)); in fdcquiesce()
1674 ASSERT(MUTEX_HELD(&fcp->c_lock)); in fdcquiesce()
1675 mutex_enter(&fcp->c_dorlock); in fdcquiesce()
1677 if (ddi_dmae_stop(fcp->c_dip, fcp->c_dmachan) != DDI_SUCCESS) in fdcquiesce()
1680 (void*)fcp->c_dip, fcp->c_dmachan); in fdcquiesce()
1682 fcp->c_digout = (fcp->c_digout & (FD_DMTREN | FD_DRSEL)) | FD_ENABLE; in fdcquiesce()
1683 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdcquiesce()
1685 fcp->c_digout |= FD_RSETZ; in fdcquiesce()
1686 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdcquiesce()
1688 mutex_exit(&fcp->c_dorlock); in fdcquiesce()
1691 fcp->fdstats.reset++; in fdcquiesce()
1692 fcp->c_curunit = -1; in fdcquiesce()
1694 fcp->c_curpcyl[unit] = -1; in fdcquiesce()
1696 if (fcp->c_chip >= i82077) { in fdcquiesce()
1697 (void) fdc_docmd(fcp, configurecmd, 4); in fdcquiesce()
1705 fdcreadid(struct fdcntlr *fcp, struct fdcsb *csb) in fdcreadid() argument
1710 (void) fdc_docmd(fcp, readidcmd, 2); in fdcreadid()
1714 fdcseek(struct fdcntlr *fcp, int unit, int cyl) in fdcseek() argument
1722 return (fdc_docmd(fcp, seekabscmd, 3)); in fdcseek()
1731 fdcsense_chng(struct fdcntlr *fcp, int unit) in fdcsense_chng() argument
1737 digital_input = inb(fcp->c_regbase + FCR_DIR); in fdcsense_chng()
1738 if (fcp->c_mode == FDCMODE_30) in fdcsense_chng()
1744 fdcsense_drv(struct fdcntlr *fcp, int unit) in fdcsense_drv() argument
1751 (void) fdc_docmd(fcp, sensedrvcmd, 2); in fdcsense_drv()
1756 if (rval = fdc_result(fcp, &senser, 1)) in fdcsense_drv()
1759 fcp->c_unit[unit]->fj_flags |= FUNIT_WPROT; in fdcsense_drv()
1761 fcp->c_unit[unit]->fj_flags &= ~FUNIT_WPROT; in fdcsense_drv()
1767 fdcsense_int(struct fdcntlr *fcp, int *unitp, int *cylp) in fdcsense_int() argument
1772 (void) fdc_docmd(fcp, &senseintcmd, 1); in fdcsense_int()
1778 if (!(rval = fdc_result(fcp, senser, 2))) { in fdcsense_int()
1790 fdcspecify(struct fdcntlr *fcp, int xferrate, int steprate, int hlt) in fdcspecify() argument
1795 encode(drate_mfm, xferrate, &fcp->c_config); in fdcspecify()
1796 outb(fcp->c_regbase + FCR_CCR, fcp->c_config); in fdcspecify()
1798 if (fcp->c_chip >= i82077) { in fdcspecify()
1810 (void) fdc_docmd(fcp, perpindcmd, 2); in fdcspecify()
1815 encode(step_rate, steprate, &fcp->c_hutsrt); in fdcspecify()
1816 specifycmd[1] = fcp->c_hutsrt |= 0x0F; /* use max head unload time */ in fdcspecify()
1818 specifycmd[2] = fcp->c_hlt = hlt << 1; /* make room for DMA bit */ in fdcspecify()
1819 return (fdc_docmd(fcp, specifycmd, 3)); in fdcspecify()
1823 fdcspdchange(struct fdcntlr *fcp, struct fcu_obj *fjp, int rpm) in fdcspdchange() argument
1832 if (((fcp->c_flags & FCFLG_DSOUT) == 0 && rpm <= fjp->fj_rotspd) || in fdcspdchange()
1833 ((fcp->c_flags & FCFLG_DSOUT) && (fjp->fj_flags & FUNIT_3DMODE) && in fdcspdchange()
1840 ASSERT(MUTEX_HELD(&fcp->c_dorlock)); in fdcspdchange()
1842 switch (fcp->c_chip) { in fdcspdchange()
1854 retcode = (fcp->c_flags ^ FCFLG_DSOUT) || in fdcspdchange()
1856 fcp->c_flags |= FCFLG_DSOUT; in fdcspdchange()
1860 fcp->c_flags &= ~FCFLG_DSOUT; in fdcspdchange()
1864 if (retcode && (fcp->c_digout & FD_DRSEL) == fcp->c_curunit) { in fdcspdchange()
1866 deselect = fcp->c_digout ^ FD_DRSEL; in fdcspdchange()
1867 outb(fcp->c_regbase + FCR_DOR, deselect); in fdcspdchange()
1870 (void) fdc_docmd(fcp, nscmodecmd, 5); in fdcspdchange()
1887 retcode = (fcp->c_flags ^ FCFLG_DSOUT) || in fdcspdchange()
1889 fcp->c_flags |= FCFLG_DSOUT; in fdcspdchange()
1894 fcp->c_flags &= ~FCFLG_DSOUT; in fdcspdchange()
1898 if (retcode && (fcp->c_digout & FD_DRSEL) == fcp->c_curunit) { in fdcspdchange()
1900 deselect = fcp->c_digout ^ FD_DRSEL; in fdcspdchange()
1901 outb(fcp->c_regbase + FCR_DOR, deselect); in fdcspdchange()
1903 save = inb(fcp->c_regbase + FCR_SRA); in fdcspdchange()
1907 outb(fcp->c_regbase + FCR_SRA, enable_code); in fdcspdchange()
1908 outb(fcp->c_regbase + FCR_SRA, enable_code); in fdcspdchange()
1911 outb(fcp->c_regbase + FCR_SRA, FSA_CR5); in fdcspdchange()
1912 enable_code = inb(fcp->c_regbase + FCR_SRB) & FSB_DSDEF; in fdcspdchange()
1914 outb(fcp->c_regbase + FCR_SRB, enable_code | ds_code); in fdcspdchange()
1917 outb(fcp->c_regbase + FCR_SRA, FSA_DISB); in fdcspdchange()
1919 outb(fcp->c_regbase + FCR_SRA, save); in fdcspdchange()
1924 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdcspdchange()
1931 struct fdcntlr *fcp = fjp->fj_fdc; in fdc_motorsm() local
1937 ASSERT(MUTEX_HELD(&fcp->c_dorlock)); in fdc_motorsm()
1938 old_mstate = fcp->c_mtrstate[unit]; in fdc_motorsm()
1943 fcp->c_motort[unit] = 0; in fdc_motorsm()
1947 fcp->c_mtrstate[unit] = FMS_ON; in fdc_motorsm()
1950 fcp->c_motort[unit] = timeout(fdmotort, (void *)fjp, in fdc_motorsm()
1952 fcp->c_mtrstate[unit] = FMS_IDLE; in fdc_motorsm()
1955 fcp->c_digout &= ~motorbit; in fdc_motorsm()
1956 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_motorsm()
1957 fcp->c_mtrstate[unit] = FMS_OFF; in fdc_motorsm()
1973 fcp->c_mtrstate[unit] = 86; in fdc_motorsm()
1974 mutex_exit(&fcp->c_dorlock); in fdc_motorsm()
1975 (void) untimeout(fcp->c_motort[unit]); in fdc_motorsm()
1976 mutex_enter(&fcp->c_dorlock); in fdc_motorsm()
1977 fcp->c_motort[unit] = 0; in fdc_motorsm()
1978 fcp->c_mtrstate[unit] = FMS_ON; in fdc_motorsm()
1981 fcp->c_digout |= motorbit; in fdc_motorsm()
1982 outb(fcp->c_regbase + FCR_DOR, fcp->c_digout); in fdc_motorsm()
1986 fcp->c_motort[unit] = timeout(fdmotort, (void *)fjp, in fdc_motorsm()
1990 fcp->c_mtrstate[unit] = FMS_START; in fdc_motorsm()
1998 if (fcp->c_motort[unit] != 0) { in fdc_motorsm()
1999 fcp->c_mtrstate[unit] = 86; in fdc_motorsm()
2000 mutex_exit(&fcp->c_dorlock); in fdc_motorsm()
2001 (void) untimeout(fcp->c_motort[unit]); in fdc_motorsm()
2002 mutex_enter(&fcp->c_dorlock); in fdc_motorsm()
2005 fcp->c_motort[unit] = timeout(fdmotort, (void *)fjp, in fdc_motorsm()
2007 fcp->c_mtrstate[unit] = FMS_START; in fdc_motorsm()
2011 if (fcp->c_motort[unit] == 0) in fdc_motorsm()
2012 fcp->c_motort[unit] = timeout(fdmotort, (void *)fjp, in fdc_motorsm()
2014 fcp->c_mtrstate[unit] = FMS_DELAY; in fdc_motorsm()
2020 fcp->c_mtrstate[unit] = 86; in fdc_motorsm()
2021 mutex_exit(&fcp->c_dorlock); in fdc_motorsm()
2022 (void) untimeout(fcp->c_motort[unit]); in fdc_motorsm()
2023 mutex_enter(&fcp->c_dorlock); in fdc_motorsm()
2027 fcp->c_motort[unit] = timeout(fdmotort, (void *)fjp, in fdc_motorsm()
2029 fcp->c_mtrstate[unit] = FMS_IDLE; in fdc_motorsm()
2032 fcp->c_mtrstate[unit] = FMS_KILLST; in fdc_motorsm()
2050 fcp->c_mtrstate[unit] = FMS_OFF; in fdc_motorsm()
2051 if (fcp->c_motort[unit] != 0) { in fdc_motorsm()
2052 mutex_exit(&fcp->c_dorlock); in fdc_motorsm()
2053 (void) untimeout(fcp->c_motort[unit]); in fdc_motorsm()
2054 mutex_enter(&fcp->c_dorlock); in fdc_motorsm()
2055 fcp->c_motort[unit] = 0; in fdc_motorsm()
2062 fcp->c_mtrstate[unit])); in fdc_motorsm()
2074 struct fdcntlr *fcp = fjp->fj_fdc; in fdmotort() local
2075 struct fdcsb *csb = &fcp->c_csb; in fdmotort()
2080 mutex_enter(&fcp->c_dorlock); in fdmotort()
2082 mutex_exit(&fcp->c_dorlock); in fdmotort()
2086 mutex_enter(&fcp->c_lock); in fdmotort()
2088 if ((fcp->c_flags & FCFLG_WAITING) && in fdmotort()
2089 fcp->c_mtrstate[unit] == FMS_ON && in fdmotort()
2092 newxstate = fdc_statemach(fcp); in fdmotort()
2098 fcp->c_csb.csb_cmdstat = EIO; in fdmotort()
2101 fcp->c_flags ^= FCFLG_WAITING; in fdmotort()
2102 cv_signal(&fcp->c_iocv); in fdmotort()
2104 mutex_exit(&fcp->c_lock); in fdmotort()
2115 fdc_dmae_isr(struct fdcntlr *fcp) in fdc_dmae_isr() argument
2117 struct fdcsb *csb = &fcp->c_csb; in fdc_dmae_isr()
2154 fdc_exec(struct fdcntlr *fcp, int sleep, int change) in fdc_exec() argument
2163 mutex_enter(&fcp->c_lock); in fdc_exec()
2166 csb = &fcp->c_csb; in fdc_exec()
2168 fjp = fcp->c_unit[unit]; in fdc_exec()
2191 mutex_exit(&fcp->c_lock); in fdc_exec()
2197 if (fcp->c_curunit != unit || !(fjp->fj_flags & FUNIT_CHAROK)) { in fdc_exec()
2198 fcp->c_curunit = unit; in fdc_exec()
2205 if (fdcspecify(fcp, fjp->fj_chars->fdc_transfer_rate, in fdc_exec()
2210 "head load time 40", (void*)fcp, in fdc_exec()
2214 mutex_enter(&fcp->c_dorlock); in fdc_exec()
2215 if (fdcspdchange(fcp, fjp, fjp->fj_attr->fda_rotatespd)) { in fdc_exec()
2222 mutex_exit(&fcp->c_dorlock); in fdc_exec()
2230 if (change && fdcsense_chng(fcp, unit)) { in fdc_exec()
2233 fcp->c_unit[unit]->fj_flags |= FUNIT_CHANGED; in fdc_exec()
2237 if (fdcheckdisk(fcp, unit)) { in fdc_exec()
2238 mutex_exit(&fcp->c_lock); in fdc_exec()
2249 mutex_enter(&fcp->c_dorlock); in fdc_exec()
2255 mutex_exit(&fcp->c_dorlock); in fdc_exec()
2263 fcp->fdstats.rd++; in fdc_exec()
2266 fcp->fdstats.wr++; in fdc_exec()
2269 fcp->fdstats.recal++; in fdc_exec()
2272 fcp->fdstats.form++; in fdc_exec()
2275 fcp->fdstats.other++; in fdc_exec()
2291 dmaereq.procparms = (void *)fcp; in fdc_exec()
2292 if (ddi_dmae_prog(fcp->c_dip, &dmaereq, &csb->csb_dmacookie, in fdc_exec()
2293 fcp->c_dmachan) != DDI_SUCCESS) in fdc_exec()
2296 (void*)fcp->c_dip, fcp->c_dmachan); in fdc_exec()
2299 if ((fdc_statemach(fcp) == FXS_DOWT) && !sleep) { in fdc_exec()
2304 mutex_exit(&fcp->c_lock); in fdc_exec()
2311 if (fdc_statemach(fcp) == -1) { in fdc_exec()
2312 mutex_exit(&fcp->c_lock); in fdc_exec()
2316 fcp->c_flags |= FCFLG_WAITING; in fdc_exec()
2320 while (fcp->c_flags & FCFLG_WAITING) { in fdc_exec()
2321 cv_wait(&fcp->c_iocv, &fcp->c_lock); in fdc_exec()
2334 if (fdrecover(fcp)) { in fdc_exec()
2335 mutex_exit(&fcp->c_lock); in fdc_exec()
2351 mutex_exit(&fcp->c_lock); in fdc_exec()
2359 mutex_exit(&fcp->c_lock); in fdc_exec()
2370 fdcheckdisk(struct fdcntlr *fcp, int unit) in fdcheckdisk() argument
2372 struct fdcsb *csb = &fcp->c_csb; in fdcheckdisk()
2378 ASSERT(MUTEX_HELD(&fcp->c_lock)); in fdcheckdisk()
2382 if (fcp->c_curpcyl[unit]) in fdcheckdisk()
2383 newcyl = fcp->c_curpcyl[unit] - 1; in fdcheckdisk()
2395 fcp->c_flags |= FCFLG_WAITING; in fdcheckdisk()
2397 if (fcp->c_mtrstate[unit] != FMS_ON && fcp->c_motort[unit] != 0) in fdcheckdisk()
2408 if (rval = fdcseek(fcp, unit, newcyl)) { in fdcheckdisk()
2414 fcp->c_flags ^= FCFLG_WAITING; in fdcheckdisk()
2421 while (fcp->c_flags & FCFLG_WAITING) { in fdcheckdisk()
2422 cv_wait(&fcp->c_iocv, &fcp->c_lock); in fdcheckdisk()
2428 if (rval = fdcsense_chng(fcp, unit)) { in fdcheckdisk()
2441 fdrecover(struct fdcntlr *fcp) in fdrecover() argument
2444 struct fdcsb *csb = &fcp->c_csb; in fdrecover()
2453 fjp = fcp->c_unit[unit]; in fdrecover()
2454 if (fcp->c_flags & FCFLG_TIMEOUT) { in fdrecover()
2455 fcp->c_flags ^= FCFLG_TIMEOUT; in fdrecover()
2463 fcp->c_curpcyl[unit] = -1; in fdrecover()
2485 if (ddi_dmae_getcnt(fcp->c_dip, fcp->c_dmachan, in fdrecover()
2490 (void*)fcp->c_dip, fcp->c_dmachan, in fdrecover()
2526 fcp->fdstats.de++; in fdrecover()
2528 fcp->fdstats.run++; in fdrecover()
2530 fcp->fdstats.bfmt++; in fdrecover()
2532 fcp->fdstats.to++; in fdrecover()
2597 struct fdcntlr *fcp = (struct fdcntlr *)arg; in fdc_intr() local
2608 csb = &fcp->c_csb; in fdc_intr()
2610 mutex_enter(&fcp->c_lock); in fdc_intr()
2611 if (fcp->c_suspended) { in fdc_intr()
2612 mutex_exit(&fcp->c_lock); in fdc_intr()
2620 state = inb(fcp->c_regbase + FCR_MSR); in fdc_intr()
2626 state = inb(fcp->c_regbase + FCR_MSR); in fdc_intr()
2642 (fcp->c_flags & FCFLG_WAITING) && in fdc_intr()
2649 fcp->c_flags ^= FCFLG_WAITING; in fdc_intr()
2651 if ((newstate = fdc_statemach(fcp)) == -1) { in fdc_intr()
2653 fcp->c_flags |= FCFLG_WAITING; in fdc_intr()
2654 mutex_exit(&fcp->c_lock); in fdc_intr()
2658 if (fcp->c_intrstat) in fdc_intr()
2693 if (ddi_dmae_prog(fcp->c_dip, NULL, in fdc_intr()
2694 &csb->csb_dmacookie, fcp->c_dmachan) != in fdc_intr()
2699 (void*)fcp->c_dip, in fdc_intr()
2700 fcp->c_dmachan); in fdc_intr()
2713 (void) fdc_statemach(fcp); in fdc_intr()
2719 fcp->c_flags |= FCFLG_WAITING; in fdc_intr()
2728 cv_signal(&fcp->c_iocv); in fdc_intr()
2732 fcp->c_flags |= FCFLG_WAITING; in fdc_intr()
2734 mutex_exit(&fcp->c_lock); in fdc_intr()
2739 (void) fdcsense_int(fcp, &drive, NULL); in fdc_intr()
2756 if (fcp->c_intrstat) in fdc_intr()
2758 mutex_exit(&fcp->c_lock); in fdc_intr()
2769 struct fdcntlr *fcp = (struct fdcntlr *)arg; in fdwatch() local
2772 mutex_enter(&fcp->c_lock); in fdwatch()
2774 if (fcp->c_timeid == 0) { in fdwatch()
2778 mutex_exit(&fcp->c_lock); in fdwatch()
2782 if (fcp->c_flags & FCFLG_WAITING) { in fdwatch()
2783 if (ddi_dmae_stop(fcp->c_dip, fcp->c_dmachan) != DDI_SUCCESS) in fdwatch()
2786 (void*)fcp->c_dip, fcp->c_dmachan); in fdwatch()
2787 csb = &fcp->c_csb; in fdwatch()
2793 if (inb(fcp->c_regbase + FCR_MSR) != MS_RQM) { in fdwatch()
2798 (void) fdc_statemach(fcp); in fdwatch()
2805 fcp->c_timeid = 0; in fdwatch()
2806 fcp->c_flags ^= FCFLG_WAITING; in fdwatch()
2807 cv_signal(&fcp->c_iocv); in fdwatch()
2810 fcp->c_flags |= FCFLG_TIMEOUT; in fdwatch()
2814 fcp->c_csb.csb_drive)); in fdwatch()
2816 if (fcp->c_intrstat) in fdwatch()
2818 mutex_exit(&fcp->c_lock); in fdwatch()
2823 fdc_statemach(struct fdcntlr *fcp) in fdc_statemach() argument
2826 struct fdcsb *csb = &fcp->c_csb; in fdc_statemach()
2831 ASSERT(MUTEX_HELD(&fcp->c_lock)); in fdc_statemach()
2834 fjp = fcp->c_unit[unit]; in fdc_statemach()
2840 ASSERT(fcp->c_timeid == 0); in fdc_statemach()
2844 fcp->c_timeid = timeout(fdwatch, (void *)fcp, time); in fdc_statemach()
2846 if (fcp->c_mtrstate[unit] == FMS_START) { in fdc_statemach()
2856 if (fcp->c_mtrstate[unit] != FMS_ON) { in fdc_statemach()
2861 if (fcp->c_curpcyl[unit] != -1 && *csb->csb_cmd != FO_RECAL) in fdc_statemach()
2864 if (fdc_docmd(fcp, recalcmd, 2) == -1) { in fdc_statemach()
2866 fdcquiesce(fcp); in fdc_statemach()
2871 fcp->c_sekdir[unit] = 0; in fdc_statemach()
2880 fcp->c_curpcyl[unit] = 0; in fdc_statemach()
2885 (void) fdc_docmd(fcp, &senseintcmd, 1); in fdc_statemach()
2890 (void) fdc_result(fcp, csb->csb_rslt, 2); in fdc_statemach()
2900 fdcquiesce(fcp); in fdc_statemach()
2909 fcp->c_curpcyl[unit] = csb->csb_rslt[1]; in fdc_statemach()
2914 csb->csb_npcyl == fcp->c_curpcyl[unit]) in fdc_statemach()
2916 fcp->c_sekdir[unit] = csb->csb_npcyl - fcp->c_curpcyl[unit]; in fdc_statemach()
2920 (void) fdcseek(fcp, csb->csb_cmd[1], csb->csb_npcyl); in fdc_statemach()
2929 ASSERT(fcp->c_timeid == 0); in fdc_statemach()
2933 fcp->c_timeid = timeout(fdwatch, (void *)fcp, time); in fdc_statemach()
2935 if (fcp->c_mtrstate[unit] != FMS_ON) { in fdc_statemach()
2939 if ((csb->csb_npcyl == 0 || fcp->c_sekdir[unit] >= 0) && in fdc_statemach()
2944 (void) fdcseek(fcp, csb->csb_cmd[1], backoff); in fdc_statemach()
2953 (void) fdc_docmd(fcp, &senseintcmd, 1); in fdc_statemach()
2958 (void) fdc_result(fcp, csb->csb_rslt, 2); in fdc_statemach()
2966 (void) fdcseek(fcp, csb->csb_cmd[1], csb->csb_npcyl); in fdc_statemach()
2979 fcp->c_curpcyl[unit] = csb->csb_npcyl; in fdc_statemach()
2984 (void) fdc_docmd(fcp, &senseintcmd, 1); in fdc_statemach()
2989 (void) fdc_result(fcp, csb->csb_rslt, 2); in fdc_statemach()
3002 fcp->c_curpcyl[unit] = csb->csb_rslt[1]; in fdc_statemach()
3004 mutex_enter(&fcp->c_dorlock); in fdc_statemach()
3010 mutex_exit(&fcp->c_dorlock); in fdc_statemach()
3019 fdcreadid(fcp, csb); in fdc_statemach()
3024 (void) fdc_result(fcp, csb->csb_rslt, 7); in fdc_statemach()
3040 ASSERT(fcp->c_timeid == 0); in fdc_statemach()
3044 fcp->c_timeid = timeout(fdwatch, (void *)fcp, time); in fdc_statemach()
3046 if (fdc_docmd(fcp, csb->csb_cmd, csb->csb_ncmds) == -1) { in fdc_statemach()
3048 fdcquiesce(fcp); in fdc_statemach()
3057 (void) fdc_result(fcp, csb->csb_rslt, csb->csb_nrslts); in fdc_statemach()
3076 if (fcp->c_timeid != 0) { in fdc_statemach()
3078 timeid = fcp->c_timeid; in fdc_statemach()
3079 fcp->c_timeid = 0; in fdc_statemach()
3080 mutex_exit(&fcp->c_lock); in fdc_statemach()
3082 mutex_enter(&fcp->c_lock); in fdc_statemach()
3087 fdcquiesce(fcp); in fdc_statemach()
3088 fcp->c_timeid = timeout(fdwatch, (void *)fcp, in fdc_statemach()
3095 (void) fdcsense_int(fcp, NULL, NULL); in fdc_statemach()
3096 fcp->c_curpcyl[unit] = -1; in fdc_statemach()
3098 if (fcp->c_timeid != 0) { in fdc_statemach()
3100 timeid = fcp->c_timeid; in fdc_statemach()
3101 fcp->c_timeid = 0; in fdc_statemach()
3102 mutex_exit(&fcp->c_lock); in fdc_statemach()
3104 mutex_enter(&fcp->c_lock); in fdc_statemach()
3124 fdc_docmd(struct fdcntlr *fcp, uchar_t *oplistp, uchar_t count) in fdc_docmd() argument
3137 if ((inb(fcp->c_regbase + FCR_MSR) & (MS_RQM|MS_DIO)) in fdc_docmd()
3148 outb(fcp->c_regbase + FCR_DATA, *oplistp++); in fdc_docmd()
3163 fdc_result(struct fdcntlr *fcp, uchar_t *rsltp, uchar_t rcount) in fdc_result() argument
3173 if ((inb(fcp->c_regbase + FCR_MSR) & in fdc_result()
3184 *rsltp++ = inb(fcp->c_regbase + FCR_DATA); in fdc_result()
3194 while ((inb(fcp->c_regbase + FCR_MSR) & MS_CB) && laxative--) { in fdc_result()
3203 stat = inb(fcp->c_regbase + FCR_MSR) & in fdc_result()
3224 (void) inb(fcp->c_regbase + FCR_DATA); in fdc_result()