Lines Matching refs:fdc

113 #define	KIOIP	KSTAT_INTR_PTR(fdc->c_intrstat)
184 static int fd_attach_check_drive(struct fdctlr *fdc);
185 static int fd_attach_det_ctlr(dev_info_t *dip, struct fdctlr *fdc);
186 static int fd_attach_map_regs(dev_info_t *dip, struct fdctlr *fdc);
187 static int fd_attach_register_interrupts(dev_info_t *dip, struct fdctlr *fdc,
191 static int fdcheckdisk(struct fdctlr *fdc, int unit);
193 static void fd_cleanup(dev_info_t *dip, struct fdctlr *fdc, int hard,
196 static int fdexec(struct fdctlr *fdc, int flags);
197 static void fdexec_turn_on_motor(struct fdctlr *fdc, int flags, uint_t unit);
198 static int fdformat(struct fdctlr *fdc, int unit, int cyl, int hd);
202 static int fdgetlabel(struct fdctlr *fdc, int unit);
211 static int fdrecalseek(struct fdctlr *fdc, int unit, int arg, int execflg);
215 static int fdrw(struct fdctlr *fdc, int, int, int, int, int, caddr_t, uint_t);
216 static void fdselect(struct fdctlr *fdc, int unit, int onoff);
217 static int fdsensedrv(struct fdctlr *fdc, int unit);
220 static int fdstart_dma(register struct fdctlr *fdc, caddr_t addr, uint_t len);
227 static int fd_pm_lower_power(struct fdctlr *fdc);
228 static int fd_pm_raise_power(struct fdctlr *fdc);
230 static void set_data_count_register(struct fdctlr *fdc, uint32_t count);
231 static uint32_t get_data_count_register(struct fdctlr *fdc);
232 static void reset_dma_controller(struct fdctlr *fdc);
233 static void set_data_address_register(struct fdctlr *fdc, uint32_t address);
234 static uint32_t get_dma_control_register(struct fdctlr *fdc);
235 static void set_dma_mode(struct fdctlr *fdc, int val);
236 static void set_dma_control_register(struct fdctlr *fdc, uint32_t val);
237 static void release_sb_dma(struct fdctlr *fdc);
260 #define CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc) \ argument
262 while (fdc->c_un->un_state == FD_STATE_SUSPENDED) {\
263 cv_wait(&fdc->c_suspend_cv, \
264 &fdc->c_lolock);\
599 struct fdctlr *fdc; in fd_attach() local
611 if (!(fdc = fd_getctlr(instance << FDINSTSHIFT))) { in fd_attach()
614 quiesce_fd_interrupt(fdc); in fd_attach()
615 if (fdc->c_fdtype & FDCTYPE_SB) in fd_attach()
616 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach()
622 mutex_enter(&fdc->c_lolock); in fd_attach()
627 cv_broadcast(&fdc->c_suspend_cv); in fd_attach()
628 mutex_exit(&fdc->c_lolock); in fd_attach()
647 fdc = kmem_zalloc(sizeof (*fdc), KM_SLEEP); in fd_attach()
648 fdc->c_dip = dip; in fd_attach()
651 fdc->c_next = fdctlrs; in fd_attach()
652 fdctlrs = fdc; in fd_attach()
655 if (fd_attach_det_ctlr(dip, fdc) == DDI_FAILURE) { in fd_attach()
656 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
660 if (fd_attach_map_regs(dip, fdc) == DDI_FAILURE) { in fd_attach()
661 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
668 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_attach()
669 fdc->c_fd_dma_lim.dma_attr_version = DMA_ATTR_V0; in fd_attach()
670 fdc->c_fd_dma_lim.dma_attr_addr_lo = 0x00000000ull; in fd_attach()
671 fdc->c_fd_dma_lim.dma_attr_addr_hi = 0xfffffffeull; in fd_attach()
672 fdc->c_fd_dma_lim.dma_attr_count_max = 0xffffff; in fd_attach()
673 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
674 fdc->c_fd_dma_lim.dma_attr_align = FD_SB_DMA_ALIGN; in fd_attach()
676 fdc->c_fd_dma_lim.dma_attr_align = 1; in fd_attach()
678 fdc->c_fd_dma_lim.dma_attr_burstsizes = 0x0; in fd_attach()
679 fdc->c_fd_dma_lim.dma_attr_minxfer = 1; in fd_attach()
680 fdc->c_fd_dma_lim.dma_attr_maxxfer = 0xffff; in fd_attach()
681 fdc->c_fd_dma_lim.dma_attr_seg = 0xffff; in fd_attach()
682 fdc->c_fd_dma_lim.dma_attr_sgllen = 1; in fd_attach()
683 fdc->c_fd_dma_lim.dma_attr_granular = 512; in fd_attach()
685 if (ddi_dma_alloc_handle(dip, &fdc->c_fd_dma_lim, in fd_attach()
686 DDI_DMA_DONTWAIT, 0, &fdc->c_dmahandle) != DDI_SUCCESS) { in fd_attach()
687 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
691 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
699 if (ddi_dma_mem_alloc(fdc->c_dmahandle, in fd_attach()
701 DDI_DMA_SLEEP, NULL, (caddr_t *)&fdc->dma_buf, in fd_attach()
702 &rlen, &fdc->c_dma_buf_handle) != DDI_SUCCESS) { in fd_attach()
703 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
712 if (fd_attach_register_interrupts(dip, fdc, in fd_attach()
714 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
728 fdc->c_un = kmem_zalloc(sizeof (struct fdunit), KM_SLEEP); in fd_attach()
729 fdc->c_un->un_chars = kmem_alloc(sizeof (struct fd_char), KM_SLEEP); in fd_attach()
730 fdc->c_un->un_iostat = kstat_create("fd", 0, "fd0", "disk", in fd_attach()
732 if (fdc->c_un->un_iostat) { in fd_attach()
733 fdc->c_un->un_iostat->ks_lock = &fdc->c_lolock; in fd_attach()
734 kstat_install(fdc->c_un->un_iostat); in fd_attach()
737 fdc->c_un->un_drive = kmem_zalloc(sizeof (struct fd_drive), KM_SLEEP); in fd_attach()
742 fdc->c_un->un_drive->fdd_ejectable = 0; in fd_attach()
745 fdc->c_un->un_drive->fdd_ejectable = -1; in fd_attach()
749 fdc->c_un->un_drive->fdd_ejectable)); in fd_attach()
755 fdc->c_un->un_unit_no = ddi_getprop(DDI_DEV_T_ANY, dip, in fd_attach()
759 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
760 fdc->sb_dma_channel = ddi_getprop(DDI_DEV_T_ANY, dip, in fd_attach()
766 fdc->c_un->un_unit_no)); in fd_attach()
769 fdc->c_un->un_curfdtype = 1; in fd_attach()
770 *fdc->c_un->un_chars = fdtypes[fdc->c_un->un_curfdtype]; in fd_attach()
771 fdunpacklabel(&fdlbl_high_80, &fdc->c_un->un_label); in fd_attach()
774 if (fd_attach_check_drive(fdc) == DDI_FAILURE) { in fd_attach()
775 fd_cleanup(dip, fdc, hard_intr_set, 1); in fd_attach()
783 fd_cleanup(dip, fdc, hard_intr_set, 1); in fd_attach()
809 fd_attach_map_regs(dev_info_t *dip, struct fdctlr *fdc) in fd_attach_map_regs() argument
818 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach_map_regs()
819 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&fdc->c_dma_regs, in fd_attach_map_regs()
821 &fdc->c_handlep_dma)) { in fd_attach_map_regs()
826 } else if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in fd_attach_map_regs()
827 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&fdc->c_dma_regs, in fd_attach_map_regs()
829 &fdc->c_handlep_dma)) { in fd_attach_map_regs()
835 reset_dma_controller(fdc); in fd_attach_map_regs()
836 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_attach_map_regs()
839 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fd_attach_map_regs()
845 fdc->c_control = in fd_attach_map_regs()
846 (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_control; in fd_attach_map_regs()
847 fdc->c_fifo = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_fifo; in fd_attach_map_regs()
848 fdc->c_dor = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_dor; in fd_attach_map_regs()
849 fdc->c_dir = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_dir; in fd_attach_map_regs()
854 (void *)fdc->c_control)); in fd_attach_map_regs()
862 quiesce_fd_interrupt(fdc); in fd_attach_map_regs()
876 fd_attach_det_ctlr(dev_info_t *dip, struct fdctlr *fdc) in fd_attach_det_ctlr() argument
893 if (ddi_regs_map_setup(dip, 0, (caddr_t *)&fdc->c_reg, in fd_attach_det_ctlr()
896 &fdc->c_handlep_cont)) { in fd_attach_det_ctlr()
911 fdc->c_fdtype |= FDCTYPE_SLAVIO; in fd_attach_det_ctlr()
912 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
913 fdc->c_auxiova = fd_getauxiova(dip); in fd_attach_det_ctlr()
914 fdc->c_auxiodata = (uchar_t)(AUX_MBO4M|AUX_TC4M); in fd_attach_det_ctlr()
915 fdc->c_auxiodata2 = (uchar_t)AUX_TC4M; in fd_attach_det_ctlr()
926 fdc->c_fdtype |= FDCTYPE_SB; in fd_attach_det_ctlr()
927 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
928 fdc->c_fdtype |= FDCTYPE_DMA; in fd_attach_det_ctlr()
938 fdc->c_fdtype |= FDCTYPE_DMA8237; in fd_attach_det_ctlr()
944 fdc->c_fdtype |= FDCTYPE_CHEERIO; in fd_attach_det_ctlr()
945 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
954 if (ddi_regs_map_setup(dip, 2, (caddr_t *)&fdc->c_auxio_reg, in fd_attach_det_ctlr()
955 0, sizeof (uint_t), &attr, &fdc->c_handlep_aux)) { in fd_attach_det_ctlr()
963 Set_auxio(fdc, AUX_HIGH_DENSITY); in fd_attach_det_ctlr()
966 *fdc->c_auxio_reg)); in fd_attach_det_ctlr()
968 fdc->c_fdtype |= FDCTYPE_DMA; in fd_attach_det_ctlr()
973 if (fdc->c_fdtype == 0) { in fd_attach_det_ctlr()
987 fd_attach_register_interrupts(dev_info_t *dip, struct fdctlr *fdc, int *hard) in fd_attach_register_interrupts() argument
999 if (ddi_get_iblock_cookie(dip, 0, &fdc->c_block) != DDI_SUCCESS) { in fd_attach_register_interrupts()
1007 mutex_init(&fdc->c_hilock, NULL, MUTEX_DRIVER, fdc->c_block); in fd_attach_register_interrupts()
1014 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_attach_register_interrupts()
1015 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach_register_interrupts()
1024 mutex_init(&fdc->c_lolock, NULL, in fd_attach_register_interrupts()
1025 MUTEX_DRIVER, fdc->c_block); in fd_attach_register_interrupts()
1032 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1041 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach_register_interrupts()
1048 fdc->c_fasttrap = 0; in fd_attach_register_interrupts()
1054 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1070 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1078 mutex_init(&fdc->c_lolock, NULL, MUTEX_DRIVER, in fd_attach_register_interrupts()
1081 if (ddi_add_softintr(dip, DDI_SOFTINT_LOW, &fdc->c_softid, in fd_attach_register_interrupts()
1084 (caddr_t)fdc) != DDI_SUCCESS) { in fd_attach_register_interrupts()
1086 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1087 mutex_destroy(&fdc->c_lolock); in fd_attach_register_interrupts()
1093 fdc->c_intrstat = kstat_create("fd", 0, "fdc0", "controller", in fd_attach_register_interrupts()
1095 if (fdc->c_intrstat) { in fd_attach_register_interrupts()
1096 fdc->c_hiintct = &KIOIP->intrs[KSTAT_INTR_HARD]; in fd_attach_register_interrupts()
1097 kstat_install(fdc->c_intrstat); in fd_attach_register_interrupts()
1101 cv_init(&fdc->c_iocv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1104 cv_init(&fdc->c_csbcv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1107 cv_init(&fdc->c_motoncv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1110 sema_init(&fdc->c_ocsem, 1, NULL, SEMA_DRIVER, NULL); in fd_attach_register_interrupts()
1113 cv_init(&fdc->c_suspend_cv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1123 fd_attach_check_drive(struct fdctlr *fdc) in fd_attach_check_drive() argument
1126 int unit = fdc->c_un->un_unit_no; in fd_attach_check_drive()
1132 mutex_enter(&fdc->c_lolock); in fd_attach_check_drive()
1133 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fd_attach_check_drive()
1144 Set_dor(fdc, ~((MOTEN(unit))|DRVSEL|RESET), 0); in fd_attach_check_drive()
1147 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fd_attach_check_drive()
1152 Set_dor(fdc, RESET|DRVSEL, 1); in fd_attach_check_drive()
1156 Set_dor(fdc, DRVSEL, 0); in fd_attach_check_drive()
1158 Set_dor(fdc, RESET, 1); in fd_attach_check_drive()
1164 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fd_attach_check_drive()
1166 if (!((fdc->c_fdtype & FDCTYPE_CHEERIO) || in fd_attach_check_drive()
1167 (fdc->c_fdtype & FDCTYPE_SB))) { in fd_attach_check_drive()
1176 fdgetcsb(fdc); in fd_attach_check_drive()
1177 if (fdreset(fdc) != 0) { in fd_attach_check_drive()
1178 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1194 if (fdrecalseek(fdc, unit, -1, 0) != 0) { in fd_attach_check_drive()
1195 timeout_id_t timeid = fdc->c_mtimeid; in fd_attach_check_drive()
1197 fdc->c_mtimeid = 0; in fd_attach_check_drive()
1198 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1214 fdselect(fdc, unit, 0); /* deselect drive zero (used in fdreset) */ in fd_attach_check_drive()
1215 fdretcsb(fdc); in fd_attach_check_drive()
1216 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1236 fd_cleanup(dev_info_t *dip, struct fdctlr *fdc, int hard, int locks) in fd_cleanup() argument
1242 ddi_get_instance(dip), (void *)fdc)); in fd_cleanup()
1245 if (fdc == NULL) { in fd_cleanup()
1256 ddi_remove_intr(dip, (uint_t)0, fdc->c_block); in fd_cleanup()
1260 if (fdc->c_softid != NULL) in fd_cleanup()
1261 ddi_remove_softintr(fdc->c_softid); in fd_cleanup()
1265 if (fdc->c_fdtype & FDCTYPE_82077) { in fd_cleanup()
1266 if (fdc->c_mtimeid) in fd_cleanup()
1267 (void) untimeout(fdc->c_mtimeid); in fd_cleanup()
1272 if (fdc->c_un != (struct fdunit *)NULL) in fd_cleanup()
1273 fdmotoff(fdc); in fd_cleanup()
1275 if (fdc->c_timeid) in fd_cleanup()
1276 (void) untimeout(fdc->c_timeid); in fd_cleanup()
1280 if (fdc->c_handlep_cont) in fd_cleanup()
1281 ddi_regs_map_free(&fdc->c_handlep_cont); in fd_cleanup()
1283 if (fdc->c_handlep_aux) in fd_cleanup()
1284 ddi_regs_map_free(&fdc->c_handlep_aux); in fd_cleanup()
1286 if (fdc->c_handlep_dma) in fd_cleanup()
1287 ddi_regs_map_free(&fdc->c_handlep_dma); in fd_cleanup()
1289 if (fdc->c_dma_buf_handle != NULL) in fd_cleanup()
1290 ddi_dma_mem_free(&fdc->c_dma_buf_handle); in fd_cleanup()
1292 if (fdc->c_dmahandle != NULL) in fd_cleanup()
1293 ddi_dma_free_handle(&fdc->c_dmahandle); in fd_cleanup()
1302 if (fdc->c_un != (struct fdunit *)NULL) { in fd_cleanup()
1304 ASSERT(!mutex_owned(&fdc->c_lolock)); in fd_cleanup()
1306 if (fdc->c_un->un_iostat) in fd_cleanup()
1307 kstat_delete(fdc->c_un->un_iostat); in fd_cleanup()
1308 fdc->c_un->un_iostat = NULL; in fd_cleanup()
1310 if (fdc->c_un->un_chars) in fd_cleanup()
1311 kmem_free(fdc->c_un->un_chars, sizeof (struct fd_char)); in fd_cleanup()
1313 if (fdc->c_un->un_drive) in fd_cleanup()
1314 kmem_free(fdc->c_un->un_drive, in fd_cleanup()
1317 kmem_free((caddr_t)fdc->c_un, sizeof (struct fdunit)); in fd_cleanup()
1320 if (fdc->c_intrstat) { in fd_cleanup()
1324 kstat_delete(fdc->c_intrstat); in fd_cleanup()
1327 fdc->c_intrstat = NULL; in fd_cleanup()
1330 cv_destroy(&fdc->c_iocv); in fd_cleanup()
1331 cv_destroy(&fdc->c_csbcv); in fd_cleanup()
1332 cv_destroy(&fdc->c_motoncv); in fd_cleanup()
1333 cv_destroy(&fdc->c_suspend_cv); in fd_cleanup()
1334 sema_destroy(&fdc->c_ocsem); in fd_cleanup()
1335 mutex_destroy(&fdc->c_hilock); in fd_cleanup()
1336 mutex_destroy(&fdc->c_lolock); in fd_cleanup()
1340 fdctlrs = fdc->c_next; in fd_cleanup()
1341 kmem_free(fdc, sizeof (*fdc)); in fd_cleanup()
1351 struct fdctlr *fdc = fd_getctlr(instance << FDINSTSHIFT); in fd_detach() local
1365 fd_cleanup(dip, fdc, 1, 1); in fd_detach()
1372 if (!fdc) in fd_detach()
1376 mutex_enter(&fdc->c_lolock); in fd_detach()
1377 fdgetcsb(fdc); /* Wait for I/O to finish */ in fd_detach()
1378 c_mtimeid = fdc->c_mtimeid; in fd_detach()
1379 fdretcsb(fdc); in fd_detach()
1380 mutex_exit(&fdc->c_lolock); in fd_detach()
1392 if (fdc->c_fdtype & FDCTYPE_SB) in fd_detach()
1393 ddi_remove_intr(dip, 0, fdc->c_block); in fd_detach()
1395 fdc->c_un->un_state = FD_STATE_SUSPENDED; in fd_detach()
1408 register struct fdctlr *fdc; in fd_info() local
1414 if ((fdc = fd_getctlr((dev_t)arg)) == NULL) { in fd_info()
1417 *result = fdc->c_dip; in fd_info()
1442 struct fdctlr *fdc; in fd_prop_op() local
1455 fdc = fd_getctlr(dev); in fd_prop_op()
1456 if (fdc == NULL) in fd_prop_op()
1460 un = fdc->c_un; in fd_prop_op()
1461 if ((un == NULL) || !fd_unit_is_open(fdc->c_un)) in fd_prop_op()
1479 struct fdctlr *fdc; in fd_open() local
1487 fdc = fd_getctlr(dev); in fd_open()
1488 if ((fdc == NULL) || ((un = fdc->c_un) == NULL)) { in fd_open()
1492 unit = fdc->c_un->un_unit_no; in fd_open()
1498 sema_p(&fdc->c_ocsem); in fd_open()
1505 sema_v(&fdc->c_ocsem); in fd_open()
1511 ddi_get_instance(fdc->c_dip), unit, part)); in fd_open()
1520 (void) pm_busy_component(fdc->c_dip, 0); in fd_open()
1522 mutex_enter(&fdc->c_lolock); in fd_open()
1524 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_open()
1526 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_open()
1527 mutex_exit(&fdc->c_lolock); in fd_open()
1528 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_open()
1533 sema_v(&fdc->c_ocsem); in fd_open()
1534 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1537 mutex_enter(&fdc->c_lolock); in fd_open()
1540 fdgetcsb(fdc); in fd_open()
1544 err = fdrecalseek(fdc, unit, -1, 0); in fd_open()
1545 fdretcsb(fdc); in fd_open()
1550 fdselect(fdc, unit, 0); in fd_open()
1551 mutex_exit(&fdc->c_lolock); in fd_open()
1552 sema_v(&fdc->c_ocsem); in fd_open()
1553 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1567 mutex_exit(&fdc->c_lolock); in fd_open()
1568 sema_v(&fdc->c_ocsem); in fd_open()
1570 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1581 fdc->c_csb.csb_unit = (uchar_t)unit; in fd_open()
1582 if (fdgetlabel(fdc, unit)) { in fd_open()
1590 fdselect(fdc, unit, 0); in fd_open()
1593 mutex_exit(&fdc->c_lolock); in fd_open()
1594 sema_v(&fdc->c_ocsem); in fd_open()
1595 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1603 fdgetcsb(fdc); in fd_open()
1604 err = fdsensedrv(fdc, unit) & WP_SR3; in fd_open()
1605 fdretcsb(fdc); in fd_open()
1608 fdselect(fdc, unit, 0); in fd_open()
1609 mutex_exit(&fdc->c_lolock); in fd_open()
1610 sema_v(&fdc->c_ocsem); in fd_open()
1611 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1628 mutex_exit(&fdc->c_lolock); in fd_open()
1629 sema_v(&fdc->c_ocsem); in fd_open()
1630 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1654 register struct fdctlr *fdc; in fd_close() local
1657 fdc = fd_getctlr(dev); in fd_close()
1658 if (!fdc || !(un = fdc->c_un)) in fd_close()
1662 unit = fdc->c_un->un_unit_no; in fd_close()
1666 sema_p(&fdc->c_ocsem); in fd_close()
1667 mutex_enter(&fdc->c_lolock); in fd_close()
1681 fdselect(fdc, unit, 0); in fd_close()
1684 mutex_exit(&fdc->c_lolock); in fd_close()
1685 sema_v(&fdc->c_ocsem); in fd_close()
1699 struct fdctlr *fdc; in fd_strategy() local
1710 fdc = fd_getctlr(bp->b_edev); in fd_strategy()
1711 un = fdc->c_un; in fd_strategy()
1788 sema_p(&fdc->c_ocsem); in fd_strategy()
1790 (void) pm_busy_component(fdc->c_dip, 0); in fd_strategy()
1792 mutex_enter(&fdc->c_lolock); in fd_strategy()
1794 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_strategy()
1796 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_strategy()
1797 mutex_exit(&fdc->c_lolock); in fd_strategy()
1798 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_strategy()
1800 sema_v(&fdc->c_ocsem); in fd_strategy()
1801 (void) pm_idle_component(fdc->c_dip, 0); in fd_strategy()
1808 mutex_enter(&fdc->c_lolock); in fd_strategy()
1814 if (fdc->c_actf) in fd_strategy()
1815 fdc->c_actl->av_forw = bp; in fd_strategy()
1817 fdc->c_actf = bp; in fd_strategy()
1818 fdc->c_actl = bp; in fd_strategy()
1822 fdstart(fdc); in fd_strategy()
1824 mutex_exit(&fdc->c_lolock); in fd_strategy()
1825 sema_v(&fdc->c_ocsem); in fd_strategy()
1826 (void) pm_idle_component(fdc->c_dip, 0); in fd_strategy()
1849 struct fdctlr *fdc = arg; in fdmotoff() local
1850 int unit = fdc->c_un->un_unit_no; in fdmotoff()
1852 mutex_enter(&fdc->c_lolock); in fdmotoff()
1855 if (fdc->c_mtimeid == 0) { in fdmotoff()
1856 mutex_exit(&fdc->c_lolock); in fdmotoff()
1862 fdc->c_mtimeid = 0; in fdmotoff()
1864 if (!(Msr(fdc) & CB) && (Dor(fdc) & (MOTEN(unit)))) { in fdmotoff()
1866 Set_dor(fdc, MOTEN(unit), 0); in fdmotoff()
1869 mutex_exit(&fdc->c_lolock); in fdmotoff()
1888 struct fdctlr *fdc; in fd_ioctl() local
1902 fdc = fd_getctlr(dev); in fd_ioctl()
1903 unit = fdc->c_un->un_unit_no; in fd_ioctl()
1904 un = fdc->c_un; in fd_ioctl()
1948 if (fdc->c_fdtype & FDCTYPE_82077) in fd_ioctl()
2018 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2023 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2035 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2042 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2049 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2057 if (fdgetlabel(fdc, unit)) { in fd_ioctl()
2058 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2065 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2118 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2127 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2133 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2137 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2139 err = fdrw(fdc, unit, FDWRITE, 0, 0, 1, in fd_ioctl()
2141 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2142 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2151 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2154 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2211 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2216 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2225 if (fdc->c_un->un_drive->fdd_ejectable == 0) { in fd_ioctl()
2230 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2232 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2234 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2236 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2237 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2238 if ((pm_raise_power(fdc->c_dip, 0, in fd_ioctl()
2240 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2243 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2247 fdselect(fdc, unit, 1); in fd_ioctl()
2248 fdeject(fdc, unit); in fd_ioctl()
2249 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2252 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2257 if (fdc->c_fdtype & FDCTYPE_82077) { in fd_ioctl()
2258 if (fdc->c_mtimeid == 0) { in fd_ioctl()
2259 fdc->c_mtimeid = timeout(fdmotoff, fdc, in fd_ioctl()
2276 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2278 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2280 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2282 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2283 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2284 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_ioctl()
2288 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2292 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2306 if (fdsense_chng(fdc, unit)) { in fd_ioctl()
2313 if (fdsense_chng(fdc, unit)) { in fd_ioctl()
2319 if (fdcheckdisk(fdc, unit)) { in fd_ioctl()
2359 fdgetcsb(fdc); in fd_ioctl()
2360 if (fdsensedrv(fdc, unit) & WP_SR3) { in fd_ioctl()
2363 fdretcsb(fdc); in fd_ioctl()
2364 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2369 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2384 cpy.drvchar.fdd_ejectable = fdc->c_un->un_drive->fdd_ejectable; in fd_ioctl()
2507 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2509 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2510 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2511 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2512 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2513 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_ioctl()
2517 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2521 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2524 if (fdformat(fdc, unit, cyl, hd)) in fd_ioctl()
2527 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2528 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2535 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2536 err = fdrawioctl(fdc, unit, arg, flag); in fd_ioctl()
2538 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2566 fdrawioctl(struct fdctlr *fdc, int unit, intptr_t arg, int mode) in fdrawioctl() argument
2585 ASSERT(fdc->c_un->un_unit_no == unit); in fdrawioctl()
2624 mutex_enter(&fdc->c_lolock); in fdrawioctl()
2626 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fdrawioctl()
2628 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fdrawioctl()
2629 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2630 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fdrawioctl()
2635 (void) pm_idle_component(fdc->c_dip, 0); in fdrawioctl()
2638 mutex_enter(&fdc->c_lolock); in fdrawioctl()
2641 fdgetcsb(fdc); in fdrawioctl()
2642 csb = &fdc->c_csb; in fdrawioctl()
2662 if (fdc->c_fdtype & FDCTYPE_DMA) in fdrawioctl()
2700 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2703 mutex_enter(&fdc->c_hilock); in fdrawioctl()
2705 res = ddi_dma_mem_alloc(fdc->c_dmahandle, fc, in fdrawioctl()
2711 fdretcsb(fdc); in fdrawioctl()
2712 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2713 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2717 fdc->c_csb.csb_read = CSB_WRITE; in fdrawioctl()
2718 if (fdstart_dma(fdc, fa, fc) != 0) { in fdrawioctl()
2720 fdretcsb(fdc); in fdrawioctl()
2721 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2722 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2725 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2735 fdretcsb(fdc); in fdrawioctl()
2736 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2738 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2761 if (fdc->c_fdtype & FDCTYPE_SB) in fdrawioctl()
2768 fdretcsb(fdc); in fdrawioctl()
2769 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2774 fdretcsb(fdc); in fdrawioctl()
2775 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2792 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2793 mutex_enter(&fdc->c_hilock); in fdrawioctl()
2794 res = ddi_dma_mem_alloc(fdc->c_dmahandle, fc, in fdrawioctl()
2800 fdretcsb(fdc); in fdrawioctl()
2801 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2802 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2807 fdc->c_csb.csb_read = CSB_WRITE; in fdrawioctl()
2809 fdc->c_csb.csb_read = CSB_READ; in fdrawioctl()
2811 if (fdstart_dma(fdc, fa, fc) != 0) { in fdrawioctl()
2813 fdretcsb(fdc); in fdrawioctl()
2814 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2815 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2818 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2826 if (fdc->c_fdtype & FDCTYPE_DMA) in fdrawioctl()
2830 fdretcsb(fdc); in fdrawioctl()
2831 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2869 (void) fdexec(fdc, 0); /* don't sleep, don't check change */ in fdrawioctl()
2871 (void) fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG); in fdrawioctl()
2893 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2906 fdr.fdr_nbytes = fdc->c_csb.csb_rlen; /* return resid */ in fdrawioctl()
2934 fdretcsb(fdc); in fdrawioctl()
2935 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2950 fdformat(struct fdctlr *fdc, int unit, int cyl, int hd) in fdformat() argument
2965 fdgetcsb(fdc); in fdformat()
2967 ASSERT(fdc->c_un->un_unit_no == unit); in fdformat()
2969 csb = &fdc->c_csb; in fdformat()
2970 un = fdc->c_un; in fdformat()
2980 if (fdrecalseek(fdc, unit, cyl, FDXC_CHECKCHG)) { in fdformat()
2981 fdretcsb(fdc); in fdformat()
3009 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdformat()
3017 mutex_enter(&fdc->c_hilock); in fdformat()
3019 cmdresult = ddi_dma_mem_alloc(fdc->c_dmahandle, csb->csb_len, in fdformat()
3025 mutex_exit(&fdc->c_hilock); in fdformat()
3029 fdc->c_csb.csb_read = CSB_WRITE; in fdformat()
3030 if (fdstart_dma(fdc, fd, csb->csb_len) != 0) { in fdformat()
3032 mutex_exit(&fdc->c_hilock); in fdformat()
3035 mutex_exit(&fdc->c_hilock); in fdformat()
3053 if ((cmdresult = fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG)) == 0) { in fdformat()
3058 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdformat()
3064 fdretcsb(fdc); in fdformat()
3085 fdstart(struct fdctlr *fdc) in fdstart() argument
3109 bp = fdc->c_actf; in fdstart()
3113 fdc->c_actf = bp->av_forw; in fdstart()
3114 fdc->c_current = bp; in fdstart()
3130 unit = fdc->c_un->un_unit_no; in fdstart()
3131 un = fdc->c_un; in fdstart()
3154 fdgetcsb(fdc); /* get csb (maybe wait for it) */ in fdstart()
3155 csb = &fdc->c_csb; in fdstart()
3172 if (((fdc->c_fdtype & FDCTYPE_SLAVIO) && in fdstart()
3174 (fdc->c_fdtype & FDCTYPE_TCBUG)) in fdstart()
3179 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdstart()
3187 fdc->c_csb.csb_read = CSB_READ; in fdstart()
3189 fdc->c_csb.csb_read = CSB_WRITE; in fdstart()
3254 if ((fdc->c_fdtype & FDCTYPE_SLAVIO) && in fdstart()
3256 (fdc->c_csb.csb_read == CSB_READ)) { in fdstart()
3266 } else if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdstart()
3281 if (fdc->c_fdtype & FDCTYPE_SB) { in fdstart()
3304 if (fdc->c_fdtype & FDCTYPE_SB) in fdstart()
3310 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdstart()
3325 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdstart()
3326 if ((fdc->c_fdtype & FDCTYPE_SB) && in fdstart()
3330 csb->csb_addr = fdc->dma_buf; in fdstart()
3333 bcopy(addr, fdc->dma_buf, tlen); in fdstart()
3336 mutex_enter(&fdc->c_hilock); in fdstart()
3338 if (fdstart_dma(fdc, csb->csb_addr, in fdstart()
3344 mutex_exit(&fdc->c_hilock); in fdstart()
3350 mutex_exit(&fdc->c_hilock); in fdstart()
3354 bp->b_error = fdexec(fdc, FDXC_SLEEP|FDXC_CHECKCHG); in fdstart()
3381 if ((fdc->c_fdtype & FDCTYPE_SB) && in fdstart()
3384 bcopy(fdc->dma_buf, addr, tlen); in fdstart()
3398 bp->b_resid, bp->b_bcount, fdc->c_csb.csb_rlen)); in fdstart()
3400 fdc->c_current = 0; in fdstart()
3401 fdretcsb(fdc); in fdstart()
3418 bp = fdc->c_actf; in fdstart()
3429 fdstart_dma(struct fdctlr *fdc, caddr_t addr, uint_t len) in fdstart_dma() argument
3436 if (fdc->c_csb.csb_read == CSB_READ) { in fdstart_dma()
3454 bzero((char *)&fdc->c_csb.csb_dmacookie, in fdstart_dma()
3455 sizeof (fdc->c_csb.csb_dmacookie)); in fdstart_dma()
3456 fdc->c_csb.csb_nwin = 0; in fdstart_dma()
3457 fdc->c_csb.csb_windex = 0; in fdstart_dma()
3458 fdc->c_csb.csb_ccount = 0; in fdstart_dma()
3460 res = ddi_dma_addr_bind_handle(fdc->c_dmahandle, NULL, addr, len, in fdstart_dma()
3461 flags, DDI_DMA_DONTWAIT, 0, &fdc->c_csb.csb_dmacookie, in fdstart_dma()
3462 &fdc->c_csb.csb_ccount); in fdstart_dma()
3473 fdc->c_csb.csb_nwin = 1; in fdstart_dma()
3474 fdc->c_csb.csb_windex = 1; in fdstart_dma()
3486 if (ddi_dma_numwin(fdc->c_dmahandle, in fdstart_dma()
3487 &fdc->c_csb.csb_nwin) != DDI_SUCCESS) { in fdstart_dma()
3494 fdc->c_csb.csb_nwin)); in fdstart_dma()
3500 fdc->c_csb.csb_windex = 1; in fdstart_dma()
3530 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdstart_dma()
3542 fd_unbind_handle(struct fdctlr *fdc) in fd_unbind_handle() argument
3544 if ((fdc->c_fdtype & FDCTYPE_DMA) && in fd_unbind_handle()
3545 ((fdc->c_csb.csb_read == CSB_READ) || in fd_unbind_handle()
3546 (fdc->c_csb.csb_read == CSB_WRITE))) { in fd_unbind_handle()
3547 mutex_enter(&fdc->c_hilock); in fd_unbind_handle()
3549 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_unbind_handle()
3550 if (fdc->sb_dma_lock) { in fd_unbind_handle()
3551 release_sb_dma(fdc); in fd_unbind_handle()
3561 if (get_data_count_register(fdc) != 0) { in fd_unbind_handle()
3565 reset_dma_controller(fdc); in fd_unbind_handle()
3566 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_unbind_handle()
3569 if (ddi_dma_unbind_handle(fdc->c_dmahandle) != DDI_SUCCESS) { in fd_unbind_handle()
3572 mutex_exit(&fdc->c_hilock); in fd_unbind_handle()
3575 mutex_exit(&fdc->c_hilock); in fd_unbind_handle()
3602 fdexec(struct fdctlr *fdc, int flags) in fdexec() argument
3608 caddr_t a = (caddr_t)fdc; in fdexec()
3612 ASSERT(mutex_owned(&fdc->c_lolock)); in fdexec()
3614 csb = &fdc->c_csb; in fdexec()
3618 ASSERT(unit == fdc->c_un->un_unit_no); in fdexec()
3624 fdc->c_un->un_chars->fdc_transfer_rate)); in fdexec()
3626 fdc->c_un->un_chars->fdc_sec_size)); in fdexec()
3628 fdc->c_un->un_label.dkl_map[2].dkl_nblk)); in fdexec()
3630 if ((fdc->c_fdtype & FDCTYPE_CTRLMASK) == FDCTYPE_82077) { in fdexec()
3631 fdexec_turn_on_motor(fdc, flags, unit); in fdexec()
3635 fdselect(fdc, unit, 1); /* select drive */ in fdexec()
3640 switch (fdc->c_un->un_chars->fdc_transfer_rate) { in fdexec()
3642 Dsr(fdc, 0); in fdexec()
3645 Dsr(fdc, 1); in fdexec()
3648 Dsr(fdc, 2); in fdexec()
3658 if ((flags & FDXC_CHECKCHG) && fdsense_chng(fdc, unit)) { in fdexec()
3660 fdc->c_un->un_flags |= FDUNIT_CHANGED; in fdexec()
3662 if (fdcheckdisk(fdc, unit)) { in fdexec()
3664 (void) fd_unbind_handle(fdc); in fdexec()
3675 fdc->fdstats.rd++; in fdexec()
3678 fdc->fdstats.wr++; in fdexec()
3681 fdc->fdstats.recal++; in fdexec()
3684 fdc->fdstats.form++; in fdexec()
3687 fdc->fdstats.other++; in fdexec()
3716 if ((fdc->c_fdtype & FDCTYPE_DMA) && in fdexec()
3717 ((fdc->c_csb.csb_read == CSB_READ) || in fdexec()
3718 (fdc->c_csb.csb_read == CSB_WRITE))) { in fdexec()
3719 mutex_enter(&fdc->c_hilock); in fdexec()
3723 reset_dma_controller(fdc); in fdexec()
3726 (void *)fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdexec()
3729 fdc->c_csb.csb_dmacookie.dmac_size)); in fdexec()
3730 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdexec()
3732 set_data_count_register(fdc, in fdexec()
3733 fdc->c_csb.csb_dmacookie.dmac_size); in fdexec()
3734 set_data_address_register(fdc, in fdexec()
3735 fdc->c_csb.csb_dmacookie.dmac_laddress); in fdexec()
3739 if (fdc->c_csb.csb_read == CSB_READ) in fdexec()
3740 set_dma_mode(fdc, CSB_READ); in fdexec()
3742 set_dma_mode(fdc, CSB_WRITE); in fdexec()
3743 mutex_exit(&fdc->c_hilock); in fdexec()
3753 if (Msr(fdc) & CB) { in fdexec()
3756 (C, "fdc: unexpectedly busy-stat 0x%x\n", Msr(fdc))); in fdexec()
3759 (void) fd_unbind_handle(fdc); in fdexec()
3768 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdexec()
3773 (C, "fdc: no RQM - stat 0x%x\n", Msr(fdc))); in fdexec()
3776 (void) fd_unbind_handle(fdc); in fdexec()
3780 Set_Fifo(fdc, csb->csb_cmds[i]); in fdexec()
3784 Msr(fdc))); in fdexec()
3794 fdc->c_timeid = timeout(fdwatch, a, in fdexec()
3799 (C, "fdexec: cmd sent, Msr 0x%x\n", Msr(fdc))); in fdexec()
3803 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3804 if (fdc->c_mtimeid == 0) { in fdexec()
3805 fdc->c_mtimeid = timeout(fdmotoff, a, in fdexec()
3817 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdexec()
3843 while ((tmp = Msr(fdc)) & CB) { in fdexec()
3849 Fifo(fdc); in fdexec()
3858 Msr(fdc), csb->csb_nrslts)); in fdexec()
3861 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3862 if (fdc->c_mtimeid == 0) { in fdexec()
3863 fdc->c_mtimeid = timeout( in fdexec()
3882 fdc->c_flags |= FDCFLG_WAITING; in fdexec()
3883 while (fdc->c_flags & FDCFLG_WAITING) { in fdexec()
3884 cv_wait(&fdc->c_iocv, &fdc->c_lolock); in fdexec()
3892 if ((fdc->c_fdtype & FDCTYPE_TCBUG) && in fdexec()
3904 if (((csb->csb_rslt[0] & IC_SR0) || (fdc->c_csb.csb_dcsr_rslt) || in fdexec()
3909 if (fdrecover(fdc) != 0) { in fdexec()
3910 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3911 if (fdc->c_mtimeid == 0) { in fdexec()
3912 fdc->c_mtimeid = timeout(fdmotoff, in fdexec()
3922 (void) fd_unbind_handle(fdc); in fdexec()
3931 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3932 if (fdc->c_mtimeid == 0) { in fdexec()
3933 fdc->c_mtimeid = timeout(fdmotoff, a, Motoff_delay); in fdexec()
3938 if (fd_unbind_handle(fdc)) in fdexec()
3950 fdexec_turn_on_motor(struct fdctlr *fdc, int flags, uint_t unit) in fdexec_turn_on_motor() argument
3959 timeid = fdc->c_mtimeid; in fdexec_turn_on_motor()
3960 fdc->c_mtimeid = 0; in fdexec_turn_on_motor()
3962 mutex_exit(&fdc->c_lolock); in fdexec_turn_on_motor()
3964 mutex_enter(&fdc->c_lolock); in fdexec_turn_on_motor()
3967 ASSERT(fdc->c_un->un_unit_no == unit); in fdexec_turn_on_motor()
3970 set_rotational_speed(fdc, unit); in fdexec_turn_on_motor()
3972 if (!(Dor(fdc) & (MOTEN(unit)))) { in fdexec_turn_on_motor()
3980 Set_dor(fdc, (MOTEN(unit)), 1); in fdexec_turn_on_motor()
3984 (void) cv_timedwait(&fdc->c_motoncv, in fdexec_turn_on_motor()
3985 &fdc->c_lolock, local_lbolt + Moton_delay); in fdexec_turn_on_motor()
4003 fdrecover(struct fdctlr *fdc) in fdrecover() argument
4008 csb = &fdc->c_csb; in fdrecover()
4010 if (fdc->c_flags & FDCFLG_TIMEDOUT) { in fdrecover()
4013 fdc->c_flags ^= FDCFLG_TIMEDOUT; in fdrecover()
4020 savecsb = fdc->c_csb; in fdrecover()
4021 bzero(&fdc->c_csb, sizeof (struct fdcsb)); in fdrecover()
4024 (void) fdreset(fdc); in fdrecover()
4026 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrecover()
4027 mutex_enter(&fdc->c_hilock); in fdrecover()
4029 reset_dma_controller(fdc); in fdrecover()
4030 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdrecover()
4031 mutex_exit(&fdc->c_hilock); in fdrecover()
4037 (void) fdrecalseek(fdc, savecsb.csb_unit, -1, 0); in fdrecover()
4038 fdc->c_csb = savecsb; /* restore original csb */ in fdrecover()
4045 fdc->fdstats.de++; in fdrecover()
4048 fdc->fdstats.run++; in fdrecover()
4051 fdc->fdstats.bfmt++; in fdrecover()
4054 fdc->fdstats.to++; in fdrecover()
4105 (int)fdc->c_current->b_blkno)); in fdrecover()
4108 if (fdc->c_fdtype & FDCTYPE_SB) { in fdrecover()
4160 struct fdctlr *fdc; in fdintr_dma() local
4174 fdc = fdctlrs; in fdintr_dma()
4176 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in fdintr_dma()
4177 tmp_dcsr = get_dma_control_register(fdc); in fdintr_dma()
4183 mutex_enter(&fdc->c_hilock); in fdintr_dma()
4185 if (fdc->c_csb.csb_opmode == 0x0) { in fdintr_dma()
4186 fdc->c_csb.csb_opmode = 2; in fdintr_dma()
4188 if (fdc->sb_dma_lock) { in fdintr_dma()
4189 release_sb_dma(fdc); in fdintr_dma()
4198 switch (fdc->c_csb.csb_opmode) { in fdintr_dma()
4218 fdc->c_csb.csb_nrslts = 0; in fdintr_dma()
4235 while (((tmp = Msr(fdc)) & CB) && in fdintr_dma()
4244 fdc->c_csb.csb_rslt in fdintr_dma()
4245 [fdc->c_csb.csb_nrslts++] in fdintr_dma()
4246 = Fifo(fdc); in fdintr_dma()
4251 fdc->c_csb.csb_rslt in fdintr_dma()
4252 [fdc->c_csb.csb_nrslts in fdintr_dma()
4260 fdc->c_csb.csb_status = 2; in fdintr_dma()
4280 fdc->c_csb.csb_dcsr_rslt = 1; in fdintr_dma()
4283 reset_dma_controller(fdc); in fdintr_dma()
4284 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdintr_dma()
4289 if ((fdc->c_fdtype & FDCTYPE_TCBUG) && in fdintr_dma()
4290 ((fdc->c_csb.csb_rslt[0] & IC_SR0) == 0x40) && in fdintr_dma()
4291 (fdc->c_csb.csb_rslt[1] & EN_SR1)) { in fdintr_dma()
4293 fdc->c_csb.csb_rslt[0] &= ~IC_SR0; in fdintr_dma()
4295 fdc->c_csb.csb_rslt[1] &= ~EN_SR1; in fdintr_dma()
4302 if (((fdc->c_csb.csb_rslt[0] & IC_SR0) != 0) || in fdintr_dma()
4303 (fdc->c_csb.csb_rslt[1] != 0) || in fdintr_dma()
4304 (fdc->c_csb.csb_rslt[2] != 0)) { in fdintr_dma()
4316 get_data_count_register(fdc))); in fdintr_dma()
4322 if (fdc->c_csb.csb_ccount == 0) { in fdintr_dma()
4326 fdc->c_csb.csb_ccount--; in fdintr_dma()
4327 ccount = fdc->c_csb.csb_ccount; in fdintr_dma()
4329 windex = fdc->c_csb.csb_windex; in fdintr_dma()
4336 if ((ccount == 0) && (windex == fdc->c_csb.csb_nwin)) { in fdintr_dma()
4349 ddi_dma_nextcookie(fdc->c_dmahandle, in fdintr_dma()
4350 &fdc->c_csb.csb_dmacookie); in fdintr_dma()
4354 fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdintr_dma()
4358 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4362 (void) ddi_dma_getwin(fdc->c_dmahandle, in fdintr_dma()
4363 fdc->c_csb.csb_windex, in fdintr_dma()
4365 &fdc->c_csb.csb_dmacookie, in fdintr_dma()
4366 &fdc->c_csb.csb_ccount); in fdintr_dma()
4367 fdc->c_csb.csb_windex++; in fdintr_dma()
4371 fdc->c_csb.csb_windex)); in fdintr_dma()
4375 fdc->c_csb.csb_ccount)); in fdintr_dma()
4379 fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdintr_dma()
4383 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4391 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdintr_dma()
4393 set_data_count_register(fdc, in fdintr_dma()
4394 fdc->c_csb.csb_dmacookie.dmac_size); in fdintr_dma()
4395 set_data_address_register(fdc, in fdintr_dma()
4396 fdc->c_csb.csb_dmacookie.dmac_laddress); in fdintr_dma()
4400 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4404 fdc->c_csb.csb_cmds[2] = fdc->c_csb.csb_rslt[3]; in fdintr_dma()
4405 fdc->c_csb.csb_cmds[3] = fdc->c_csb.csb_rslt[4]; in fdintr_dma()
4406 fdc->c_csb.csb_cmds[4] = fdc->c_csb.csb_rslt[5]; in fdintr_dma()
4407 fdc->c_csb.csb_cmds[1] = (fdc->c_csb.csb_cmds[1] in fdintr_dma()
4408 & ~0x04) | (fdc->c_csb.csb_rslt[4] << 2); in fdintr_dma()
4410 for (i = 0; i < (int)fdc->c_csb.csb_ncmds; i++) { in fdintr_dma()
4417 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdintr_dma()
4424 Msr(fdc))); in fdintr_dma()
4426 fdc->c_csb.csb_status = 2; in fdintr_dma()
4431 Set_Fifo(fdc, fdc->c_csb.csb_cmds[i]); in fdintr_dma()
4436 fdc->c_csb.csb_cmds[i], Msr(fdc))); in fdintr_dma()
4441 set_dma_control_register(fdc, tmp_dcsr | in fdintr_dma()
4457 fdc->c_csb.csb_dcsr_rslt = 1; in fdintr_dma()
4458 reset_dma_controller(fdc); in fdintr_dma()
4459 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdintr_dma()
4479 while (((Msr(fdc) & CB)) && (i < 10000)) { in fdintr_dma()
4492 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4503 Set_Fifo(fdc, SNSISTAT); in fdintr_dma()
4506 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4514 fdc->c_csb.csb_rslt[0] = Fifo(fdc); in fdintr_dma()
4517 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4525 fdc->c_csb.csb_rslt[1] = Fifo(fdc); in fdintr_dma()
4544 mutex_exit(&fdc->c_hilock); in fdintr_dma()
4547 mutex_enter(&fdc->c_lolock); in fdintr_dma()
4549 fdc->c_csb.csb_opmode = 0; in fdintr_dma()
4554 if (fdc->c_timeid) { in fdintr_dma()
4555 timeout_id_t timeid = fdc->c_timeid; in fdintr_dma()
4556 fdc->c_timeid = 0; in fdintr_dma()
4557 mutex_exit(&fdc->c_lolock); in fdintr_dma()
4559 mutex_enter(&fdc->c_lolock); in fdintr_dma()
4563 if (fdc->c_flags & FDCFLG_WAITING) { in fdintr_dma()
4572 fdc->c_flags ^= FDCFLG_WAITING; in fdintr_dma()
4573 cv_signal(&fdc->c_iocv); in fdintr_dma()
4582 fdc->c_csb.csb_rslt[0], fdc->c_csb.csb_rslt[1], in fdintr_dma()
4583 fdc->c_csb.csb_rslt[2])); in fdintr_dma()
4585 mutex_exit(&fdc->c_lolock); in fdintr_dma()
4588 if (fdc->c_intrstat) in fdintr_dma()
4604 struct fdctlr *fdc = (struct fdctlr *)arg; in fd_lointr() local
4607 csb = &fdc->c_csb; in fd_lointr()
4619 if (fdc->c_intrstat) in fd_lointr()
4624 mutex_enter(&fdc->c_lolock); in fd_lointr()
4628 if (fdc->c_timeid) { in fd_lointr()
4629 timeout_id_t timeid = fdc->c_timeid; in fd_lointr()
4630 fdc->c_timeid = 0; in fd_lointr()
4631 mutex_exit(&fdc->c_lolock); in fd_lointr()
4633 mutex_enter(&fdc->c_lolock); in fd_lointr()
4637 if (fdc->c_flags & FDCFLG_WAITING) { in fd_lointr()
4641 fdc->c_flags ^= FDCFLG_WAITING; in fd_lointr()
4642 cv_signal(&fdc->c_iocv); in fd_lointr()
4653 if (fdc->c_intrstat) in fd_lointr()
4655 mutex_exit(&fdc->c_lolock); in fd_lointr()
4666 struct fdctlr *fdc = arg; in fdwatch() local
4672 mutex_enter(&fdc->c_lolock); in fdwatch()
4673 if (fdc->c_timeid == 0) { in fdwatch()
4681 mutex_exit(&fdc->c_lolock); in fdwatch()
4684 fdc->c_timeid = 0; in fdwatch()
4685 csb = &fdc->c_csb; in fdwatch()
4687 mutex_enter(&fdc->c_hilock); in fdwatch()
4697 mutex_exit(&fdc->c_hilock); in fdwatch()
4701 fdc->c_flags |= FDCFLG_TIMEDOUT; in fdwatch()
4704 if ((fdc->c_fdtype & FDCTYPE_DMA) == 0) { in fdwatch()
4705 ddi_trigger_softintr(fdc->c_softid); in fdwatch()
4707 mutex_exit(&fdc->c_lolock); in fdwatch()
4709 mutex_exit(&fdc->c_lolock); in fdwatch()
4719 fdgetcsb(struct fdctlr *fdc) in fdgetcsb() argument
4722 ASSERT(mutex_owned(&fdc->c_lolock)); in fdgetcsb()
4723 while (fdc->c_flags & FDCFLG_BUSY) { in fdgetcsb()
4724 fdc->c_flags |= FDCFLG_WANT; in fdgetcsb()
4725 cv_wait(&fdc->c_csbcv, &fdc->c_lolock); in fdgetcsb()
4727 fdc->c_flags |= FDCFLG_BUSY; /* got it! */ in fdgetcsb()
4735 fdretcsb(struct fdctlr *fdc) in fdretcsb() argument
4738 ASSERT(mutex_owned(&fdc->c_lolock)); in fdretcsb()
4740 fdc->c_flags &= ~FDCFLG_BUSY; /* let go */ in fdretcsb()
4742 fdc->c_csb.csb_read = 0; in fdretcsb()
4744 if (fdc->c_flags & FDCFLG_WANT) { in fdretcsb()
4745 fdc->c_flags ^= FDCFLG_WANT; in fdretcsb()
4754 cv_broadcast(&fdc->c_csbcv); in fdretcsb()
4768 fdreset(struct fdctlr *fdc) in fdreset() argument
4776 ASSERT(mutex_owned(&fdc->c_lolock)); in fdreset()
4779 fdc->fdstats.reset++; in fdreset()
4788 if ((fdc->c_fdtype & FDCTYPE_CTRLMASK) == FDCTYPE_82077) { in fdreset()
4799 timeid = fdc->c_mtimeid; in fdreset()
4800 fdc->c_mtimeid = 0; in fdreset()
4802 mutex_exit(&fdc->c_lolock); in fdreset()
4804 mutex_enter(&fdc->c_lolock); in fdreset()
4807 Set_dor(fdc, DMAGATE, 0); in fdreset()
4812 Dsr(fdc, SWR); in fdreset()
4823 Dsr(fdc, 0); in fdreset()
4825 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fdreset()
4833 fdc->c_flags |= FDCFLG_WAITING; in fdreset()
4841 Set_dor(fdc, DMAGATE|RESET, 1); in fdreset()
4844 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fdreset()
4847 if (cv_timedwait(&fdc->c_iocv, &fdc->c_lolock, in fdreset()
4854 fdc->c_flags |= FDCFLG_WAITING; in fdreset()
4860 cv_wait(&fdc->c_iocv, &fdc->c_lolock); in fdreset()
4863 csb = &fdc->c_csb; in fdreset()
4866 csb->csb_unit = fdc->c_un->un_unit_no; in fdreset()
4878 if (fdc->c_fdtype & FDCTYPE_DMA) in fdreset()
4886 (void) fdexec(fdc, 0); /* no FDXC_CHECKCHG, ... */ in fdreset()
4902 (void) fdexec(fdc, 0); /* no FDXC_CHECKCHG, ... */ in fdreset()
4927 fdrecalseek(struct fdctlr *fdc, int unit, int arg, int execflg) in fdrecalseek() argument
4932 ASSERT(fdc->c_un->un_unit_no == unit); in fdrecalseek()
4938 csb = &fdc->c_csb; in fdrecalseek()
4960 if (result = fdexec(fdc, FDXC_SLEEP | execflg)) { in fdrecalseek()
4987 fdsensedrv(struct fdctlr *fdc, int unit) in fdsensedrv() argument
4991 ASSERT(fdc->c_un->un_unit_no == unit); in fdsensedrv()
4993 csb = &fdc->c_csb; in fdsensedrv()
5007 (void) fdexec(fdc, 0); /* DON't check changed!, no sleep */ in fdsensedrv()
5023 fdcheckdisk(struct fdctlr *fdc, int unit) in fdcheckdisk() argument
5033 ASSERT(fdc->c_un->un_unit_no == unit); in fdcheckdisk()
5039 csb = &fdc->c_csb; in fdcheckdisk()
5040 savecsb = fdc->c_csb; in fdcheckdisk()
5050 st3 = fdsensedrv(fdc, unit); in fdcheckdisk()
5061 err = fdrecalseek(fdc, unit, seekto, 0); in fdcheckdisk()
5064 fdc->c_csb = savecsb; in fdcheckdisk()
5076 if (fdsense_chng(fdc, csb->csb_unit)) { in fdcheckdisk()
5092 fdselect(struct fdctlr *fdc, int unit, int on) in fdselect() argument
5095 ASSERT(fdc->c_un->un_unit_no == unit); in fdselect()
5100 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdselect()
5108 (C, "fdselect: (before) Dor 0x%x\n", Dor(fdc))); in fdselect()
5111 Set_dor(fdc, DRVSEL, !on); in fdselect()
5113 Set_dor(fdc, DRVSEL, on); in fdselect()
5117 (C, "fdselect: Dor 0x%x\n", Dor(fdc))); in fdselect()
5128 fdeject(struct fdctlr *fdc, int unit) in fdeject() argument
5132 ASSERT(fdc->c_un->un_unit_no == unit); in fdeject()
5134 un = fdc->c_un; in fdeject()
5141 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdeject()
5149 if (!(Dor(fdc) & MOTEN(unit))) { in fdeject()
5151 Set_dor(fdc, MOTEN(unit), 1); in fdeject()
5155 Set_dor(fdc, EJECT, 1); in fdeject()
5158 Set_dor(fdc, EJECT, 0); in fdeject()
5161 if (!(Dor(fdc) & MOTEN(unit))) { in fdeject()
5163 Set_dor(fdc, MOTEN(unit), 1); in fdeject()
5167 Set_dor(fdc, EJECT_DMA, 1); in fdeject()
5170 Set_dor(fdc, EJECT_DMA, 0); in fdeject()
5181 fdsense_chng(struct fdctlr *fdc, int unit) in fdsense_chng() argument
5187 ASSERT(fdc->c_un->un_unit_no == unit); in fdsense_chng()
5197 if (Dir(fdc) & DSKCHG) in fdsense_chng()
5205 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdsense_chng()
5207 if (*fdc->c_auxiova & AUX_DISKCHG) in fdsense_chng()
5214 if (!(Dor(fdc) & MOTEN(unit))) { in fdsense_chng()
5216 Set_dor(fdc, MOTEN(unit), 1); in fdsense_chng()
5219 if (Dir(fdc) & DSKCHG) in fdsense_chng()
5239 fdgetlabel(struct fdctlr *fdc, int unit) in fdgetlabel() argument
5253 un = fdc->c_un; in fdgetlabel()
5256 ASSERT(fdc->c_un->un_unit_no == unit); in fdgetlabel()
5307 if (!(err = fdrw(fdc, unit, FDREAD, 0, 0, in fdgetlabel()
5311 fdrw(fdc, unit, FDREAD, 0, 0, in fdgetlabel()
5315 !(err = fdrw(fdc, unit, FDREAD, 0, 0, 1, (caddr_t)label, in fdgetlabel()
5443 fdrw(struct fdctlr *fdc, int unit, int rw, int cyl, int head, in fdrw() argument
5457 ASSERT(fdc->c_un->un_unit_no == unit); in fdrw()
5459 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fdrw()
5461 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fdrw()
5462 mutex_exit(&fdc->c_lolock); in fdrw()
5463 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fdrw()
5467 mutex_enter(&fdc->c_lolock); in fdrw()
5471 mutex_enter(&fdc->c_lolock); in fdrw()
5474 fdgetcsb(fdc); in fdrw()
5475 csb = &fdc->c_csb; in fdrw()
5476 ch = fdc->c_un->un_chars; in fdrw()
5478 if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdrw()
5486 if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdrw()
5496 fdc->c_csb.csb_read = CSB_READ; in fdrw()
5498 fdc->c_csb.csb_read = CSB_WRITE; in fdrw()
5503 if (fdc->c_fdtype & FDCTYPE_SB) in fdrw()
5512 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdrw()
5516 (uchar_t)max(fdc->c_un->un_chars->fdc_secptrack, sector); in fdrw()
5529 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrw()
5531 mutex_enter(&fdc->c_hilock); in fdrw()
5537 res = ddi_dma_mem_alloc(fdc->c_dmahandle, len, in fdrw()
5546 fdretcsb(fdc); in fdrw()
5547 mutex_exit(&fdc->c_hilock); in fdrw()
5553 if (fdstart_dma(fdc, dma_addr, len) != 0) { in fdrw()
5554 fdretcsb(fdc); in fdrw()
5556 mutex_exit(&fdc->c_hilock); in fdrw()
5566 if (fdc->c_csb.csb_read == CSB_WRITE) { in fdrw()
5571 mutex_exit(&fdc->c_hilock); in fdrw()
5579 if (fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG) != 0) { in fdrw()
5580 fdretcsb(fdc); in fdrw()
5595 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrw()
5596 if (fdc->c_csb.csb_read == CSB_READ) { in fdrw()
5605 fdretcsb(fdc); in fdrw()
5638 struct fdctlr *fdc = fdctlrs; in fd_getctlr() local
5641 while (fdc) { in fd_getctlr()
5642 if (ddi_get_instance(fdc->c_dip) == ctlr) in fd_getctlr()
5643 return (fdc); in fd_getctlr()
5644 fdc = fdc->c_next; in fd_getctlr()
5646 return (fdc); in fd_getctlr()
5934 set_rotational_speed(struct fdctlr *fdc, int unit) in set_rotational_speed() argument
5939 ASSERT(fdc->c_un->un_unit_no == unit); in set_rotational_speed()
5944 if (fdc->c_fdtype & FDCTYPE_MACHIO) in set_rotational_speed()
5958 is_medium = fdc->c_un->un_chars->fdc_medium; in set_rotational_speed()
5960 if (fdc->c_un->un_flags & FDUNIT_SET_SPEED) { in set_rotational_speed()
5964 ((fdc->c_un->un_flags & FDUNIT_MEDIUM) ? 1 : 0); in set_rotational_speed()
5969 fdc->c_un->un_flags ^= FDUNIT_MEDIUM; in set_rotational_speed()
5972 fdc->c_un->un_flags &= ~FDUNIT_SET_SPEED; in set_rotational_speed()
5977 fdselect(fdc, unit, 0); in set_rotational_speed()
5980 if ((fdc->c_fdtype & FDCTYPE_AUXIOMASK) == FDCTYPE_SLAVIO) { in set_rotational_speed()
5981 Set_dor(fdc, MEDIUM_DENSITY, is_medium); in set_rotational_speed()
5984 if ((fdc->c_fdtype & FDCTYPE_AUXIOMASK) == FDCTYPE_CHEERIO) { in set_rotational_speed()
5986 Set_auxio(fdc, AUX_MEDIUM_DENSITY); in set_rotational_speed()
5988 Set_auxio(fdc, AUX_HIGH_DENSITY); in set_rotational_speed()
5997 fdselect(fdc, unit, 1); /* Sony requirement */ in set_rotational_speed()
6008 struct fdctlr *fdc; in fd_media_watch() local
6012 fdc = fd_getctlr(dev); in fd_media_watch()
6013 unit = fdc->c_un->un_unit_no; in fd_media_watch()
6014 un = fdc->c_un; in fd_media_watch()
6016 mutex_enter(&fdc->c_lolock); in fd_media_watch()
6023 mutex_exit(&fdc->c_lolock); in fd_media_watch()
6028 un->un_media_state = fd_get_media_state(fdc, unit); in fd_media_watch()
6029 cv_broadcast(&fdc->c_statecv); in fd_media_watch()
6031 mutex_exit(&fdc->c_lolock); in fd_media_watch()
6040 fd_get_media_state(struct fdctlr *fdc, int unit) in fd_get_media_state() argument
6044 ASSERT(fdc->c_un->un_unit_no == unit); in fd_get_media_state()
6046 if (fdsense_chng(fdc, unit)) { in fd_get_media_state()
6048 if (fdcheckdisk(fdc, unit)) { in fd_get_media_state()
6063 struct fdctlr *fdc; in fd_check_media() local
6068 fdc = fd_getctlr(dev); in fd_check_media()
6069 unit = fdc->c_un->un_unit_no; in fd_check_media()
6070 un = fdc->c_un; in fd_check_media()
6072 mutex_enter(&fdc->c_lolock); in fd_check_media()
6074 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_check_media()
6076 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_check_media()
6077 mutex_exit(&fdc->c_lolock); in fd_check_media()
6078 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_check_media()
6083 (void) pm_idle_component(fdc->c_dip, 0); in fd_check_media()
6087 mutex_enter(&fdc->c_lolock); in fd_check_media()
6090 un->un_media_state = fd_get_media_state(fdc, unit); in fd_check_media()
6098 if (cv_wait_sig(&fdc->c_statecv, &fdc->c_lolock) == 0) { in fd_check_media()
6100 mutex_exit(&fdc->c_lolock); in fd_check_media()
6109 mutex_exit(&fdc->c_lolock); in fd_check_media()
6111 mutex_enter(&fdc->c_lolock); in fd_check_media()
6115 if (fdgetlabel(fdc, unit)) { in fd_check_media()
6116 mutex_exit(&fdc->c_lolock); in fd_check_media()
6120 mutex_exit(&fdc->c_lolock); in fd_check_media()
6158 struct fdctlr *fdc; in fd_power() local
6168 fdc = fd_getctlr(instance << FDINSTSHIFT); in fd_power()
6169 if (fdc->c_un == NULL) in fd_power()
6173 rval = fd_pm_lower_power(fdc); in fd_power()
6176 rval = fd_pm_raise_power(fdc); in fd_power()
6190 fd_pm_lower_power(struct fdctlr *fdc) in fd_pm_lower_power() argument
6193 mutex_enter(&fdc->c_lolock); in fd_pm_lower_power()
6195 if ((fdc->c_un->un_state == FD_STATE_SUSPENDED) || in fd_pm_lower_power()
6196 (fdc->c_un->un_state == FD_STATE_STOPPED)) { in fd_pm_lower_power()
6197 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6205 if (fdc->c_flags & FDCFLG_BUSY) { in fd_pm_lower_power()
6208 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6212 fdc->c_un->un_state = FD_STATE_STOPPED; in fd_pm_lower_power()
6214 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6226 fd_pm_raise_power(struct fdctlr *fdc) in fd_pm_raise_power() argument
6229 struct fdunit *un = fdc->c_un; in fd_pm_raise_power()
6233 mutex_enter(&fdc->c_lolock); in fd_pm_raise_power()
6234 fdgetcsb(fdc); in fd_pm_raise_power()
6237 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_pm_raise_power()
6238 mutex_enter(&fdc->c_hilock); in fd_pm_raise_power()
6239 reset_dma_controller(fdc); in fd_pm_raise_power()
6240 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_pm_raise_power()
6241 mutex_exit(&fdc->c_hilock); in fd_pm_raise_power()
6249 fdc->c_un->un_flags |= FDUNIT_SET_SPEED; in fd_pm_raise_power()
6252 (void) fdreset(fdc); in fd_pm_raise_power()
6254 unit = fdc->c_un->un_unit_no; in fd_pm_raise_power()
6257 if (fdrecalseek(fdc, unit, -1, 0) != 0) { in fd_pm_raise_power()
6260 fdretcsb(fdc); in fd_pm_raise_power()
6261 mutex_exit(&fdc->c_lolock); in fd_pm_raise_power()
6266 fdselect(fdc, unit, 0); in fd_pm_raise_power()
6268 fdretcsb(fdc); in fd_pm_raise_power()
6269 mutex_exit(&fdc->c_lolock); in fd_pm_raise_power()
6296 set_data_count_register(struct fdctlr *fdc, uint32_t count) in set_data_count_register() argument
6298 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_data_count_register()
6300 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_data_count_register()
6301 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dbcr, count); in set_data_count_register()
6302 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_data_count_register()
6305 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_data_count_register()
6306 switch (fdc->sb_dma_channel) { in set_data_count_register()
6308 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6313 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6318 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6323 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6330 fdc->sb_dma_channel)); in set_data_count_register()
6342 get_data_count_register(struct fdctlr *fdc) in get_data_count_register() argument
6345 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in get_data_count_register()
6347 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in get_data_count_register()
6348 retval = ddi_get32(fdc->c_handlep_dma, &dma_reg->fdc_dbcr); in get_data_count_register()
6349 } else if (fdc->c_fdtype & FDCTYPE_SB) { in get_data_count_register()
6351 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in get_data_count_register()
6352 switch (fdc->sb_dma_channel) { in get_data_count_register()
6354 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6358 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6362 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6366 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6372 fdc->sb_dma_channel)); in get_data_count_register()
6388 reset_dma_controller(struct fdctlr *fdc) in reset_dma_controller() argument
6390 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in reset_dma_controller()
6392 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in reset_dma_controller()
6393 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, DCSR_RESET); in reset_dma_controller()
6394 while (get_dma_control_register(fdc) & DCSR_CYC_PEND) in reset_dma_controller()
6396 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, 0); in reset_dma_controller()
6397 } else if (fdc->c_fdtype & FDCTYPE_SB) { in reset_dma_controller()
6399 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in reset_dma_controller()
6400 ddi_put8(fdc->c_handlep_dma, &dma_reg->sb_dma_regs[DMAC1_MASK], in reset_dma_controller()
6401 (fdc->sb_dma_channel & 0x3)); in reset_dma_controller()
6412 get_dma_control_register(struct fdctlr *fdc) in get_dma_control_register() argument
6415 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in get_dma_control_register()
6417 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in get_dma_control_register()
6418 retval = ddi_get32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr); in get_dma_control_register()
6430 set_data_address_register(struct fdctlr *fdc, uint32_t address) in set_data_address_register() argument
6432 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_data_address_register()
6434 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_data_address_register()
6435 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dacr, address); in set_data_address_register()
6436 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_data_address_register()
6438 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_data_address_register()
6439 switch (fdc->sb_dma_channel) { in set_data_address_register()
6441 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6444 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6447 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6452 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6455 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6458 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6463 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6466 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6469 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6474 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6477 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6480 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6487 fdc->sb_dma_channel)); in set_data_address_register()
6500 set_dma_mode(struct fdctlr *fdc, int val) in set_dma_mode() argument
6502 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_dma_mode()
6504 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_dma_mode()
6506 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, in set_dma_mode()
6509 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, in set_dma_mode()
6512 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_dma_mode()
6515 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_dma_mode()
6518 mode_reg_val = fdc->sb_dma_channel | DMAMODE_READ in set_dma_mode()
6521 mode_reg_val = fdc->sb_dma_channel | DMAMODE_WRITE in set_dma_mode()
6524 ddi_put8(fdc->c_handlep_dma, &dma_reg->sb_dma_regs[DMAC1_MODE], in set_dma_mode()
6526 chn_mask = 1 << (fdc->sb_dma_channel & 0x3); in set_dma_mode()
6527 ddi_put8(fdc->c_handlep_dma, in set_dma_mode()
6529 fdc->sb_dma_lock = 1; in set_dma_mode()
6540 set_dma_control_register(struct fdctlr *fdc, uint32_t val) in set_dma_control_register() argument
6542 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_dma_control_register()
6544 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_dma_control_register()
6545 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, val); in set_dma_control_register()
6550 release_sb_dma(struct fdctlr *fdc) in release_sb_dma() argument
6553 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in release_sb_dma()
6555 ddi_put8(fdc->c_handlep_dma, in release_sb_dma()
6557 fdc->sb_dma_lock = 0; in release_sb_dma()
6561 quiesce_fd_interrupt(struct fdctlr *fdc) in quiesce_fd_interrupt() argument
6573 if (fdc->c_fdtype & FDCTYPE_SB) { in quiesce_fd_interrupt()
6574 ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), in quiesce_fd_interrupt()
6577 ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), in quiesce_fd_interrupt()
6580 Set_Fifo(fdc, 0xE6); in quiesce_fd_interrupt()