Lines Matching refs:fdc

111 #define	KIOIP	KSTAT_INTR_PTR(fdc->c_intrstat)
182 static int fd_attach_check_drive(struct fdctlr *fdc);
183 static int fd_attach_det_ctlr(dev_info_t *dip, struct fdctlr *fdc);
184 static int fd_attach_map_regs(dev_info_t *dip, struct fdctlr *fdc);
185 static int fd_attach_register_interrupts(dev_info_t *dip, struct fdctlr *fdc,
189 static int fdcheckdisk(struct fdctlr *fdc, int unit);
191 static void fd_cleanup(dev_info_t *dip, struct fdctlr *fdc, int hard,
194 static int fdexec(struct fdctlr *fdc, int flags);
195 static void fdexec_turn_on_motor(struct fdctlr *fdc, int flags, uint_t unit);
196 static int fdformat(struct fdctlr *fdc, int unit, int cyl, int hd);
200 static int fdgetlabel(struct fdctlr *fdc, int unit);
209 static int fdrecalseek(struct fdctlr *fdc, int unit, int arg, int execflg);
213 static int fdrw(struct fdctlr *fdc, int, int, int, int, int, caddr_t, uint_t);
214 static void fdselect(struct fdctlr *fdc, int unit, int onoff);
215 static int fdsensedrv(struct fdctlr *fdc, int unit);
218 static int fdstart_dma(register struct fdctlr *fdc, caddr_t addr, uint_t len);
225 static int fd_pm_lower_power(struct fdctlr *fdc);
226 static int fd_pm_raise_power(struct fdctlr *fdc);
228 static void set_data_count_register(struct fdctlr *fdc, uint32_t count);
229 static uint32_t get_data_count_register(struct fdctlr *fdc);
230 static void reset_dma_controller(struct fdctlr *fdc);
231 static void set_data_address_register(struct fdctlr *fdc, uint32_t address);
232 static uint32_t get_dma_control_register(struct fdctlr *fdc);
233 static void set_dma_mode(struct fdctlr *fdc, int val);
234 static void set_dma_control_register(struct fdctlr *fdc, uint32_t val);
235 static void release_sb_dma(struct fdctlr *fdc);
258 #define CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc) \ argument
260 while (fdc->c_un->un_state == FD_STATE_SUSPENDED) {\
261 cv_wait(&fdc->c_suspend_cv, \
262 &fdc->c_lolock);\
597 struct fdctlr *fdc; in fd_attach() local
609 if (!(fdc = fd_getctlr(instance << FDINSTSHIFT))) { in fd_attach()
612 quiesce_fd_interrupt(fdc); in fd_attach()
613 if (fdc->c_fdtype & FDCTYPE_SB) in fd_attach()
614 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach()
620 mutex_enter(&fdc->c_lolock); in fd_attach()
625 cv_broadcast(&fdc->c_suspend_cv); in fd_attach()
626 mutex_exit(&fdc->c_lolock); in fd_attach()
645 fdc = kmem_zalloc(sizeof (*fdc), KM_SLEEP); in fd_attach()
646 fdc->c_dip = dip; in fd_attach()
649 fdc->c_next = fdctlrs; in fd_attach()
650 fdctlrs = fdc; in fd_attach()
653 if (fd_attach_det_ctlr(dip, fdc) == DDI_FAILURE) { in fd_attach()
654 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
658 if (fd_attach_map_regs(dip, fdc) == DDI_FAILURE) { in fd_attach()
659 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
666 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_attach()
667 fdc->c_fd_dma_lim.dma_attr_version = DMA_ATTR_V0; in fd_attach()
668 fdc->c_fd_dma_lim.dma_attr_addr_lo = 0x00000000ull; in fd_attach()
669 fdc->c_fd_dma_lim.dma_attr_addr_hi = 0xfffffffeull; in fd_attach()
670 fdc->c_fd_dma_lim.dma_attr_count_max = 0xffffff; in fd_attach()
671 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
672 fdc->c_fd_dma_lim.dma_attr_align = FD_SB_DMA_ALIGN; in fd_attach()
674 fdc->c_fd_dma_lim.dma_attr_align = 1; in fd_attach()
676 fdc->c_fd_dma_lim.dma_attr_burstsizes = 0x0; in fd_attach()
677 fdc->c_fd_dma_lim.dma_attr_minxfer = 1; in fd_attach()
678 fdc->c_fd_dma_lim.dma_attr_maxxfer = 0xffff; in fd_attach()
679 fdc->c_fd_dma_lim.dma_attr_seg = 0xffff; in fd_attach()
680 fdc->c_fd_dma_lim.dma_attr_sgllen = 1; in fd_attach()
681 fdc->c_fd_dma_lim.dma_attr_granular = 512; in fd_attach()
683 if (ddi_dma_alloc_handle(dip, &fdc->c_fd_dma_lim, in fd_attach()
684 DDI_DMA_DONTWAIT, 0, &fdc->c_dmahandle) != DDI_SUCCESS) { in fd_attach()
685 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
689 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
697 if (ddi_dma_mem_alloc(fdc->c_dmahandle, in fd_attach()
699 DDI_DMA_SLEEP, NULL, (caddr_t *)&fdc->dma_buf, in fd_attach()
700 &rlen, &fdc->c_dma_buf_handle) != DDI_SUCCESS) { in fd_attach()
701 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
710 if (fd_attach_register_interrupts(dip, fdc, in fd_attach()
712 fd_cleanup(dip, fdc, hard_intr_set, 0); in fd_attach()
726 fdc->c_un = kmem_zalloc(sizeof (struct fdunit), KM_SLEEP); in fd_attach()
727 fdc->c_un->un_chars = kmem_alloc(sizeof (struct fd_char), KM_SLEEP); in fd_attach()
728 fdc->c_un->un_iostat = kstat_create("fd", 0, "fd0", "disk", in fd_attach()
730 if (fdc->c_un->un_iostat) { in fd_attach()
731 fdc->c_un->un_iostat->ks_lock = &fdc->c_lolock; in fd_attach()
732 kstat_install(fdc->c_un->un_iostat); in fd_attach()
735 fdc->c_un->un_drive = kmem_zalloc(sizeof (struct fd_drive), KM_SLEEP); in fd_attach()
740 fdc->c_un->un_drive->fdd_ejectable = 0; in fd_attach()
743 fdc->c_un->un_drive->fdd_ejectable = -1; in fd_attach()
747 fdc->c_un->un_drive->fdd_ejectable)); in fd_attach()
753 fdc->c_un->un_unit_no = ddi_getprop(DDI_DEV_T_ANY, dip, in fd_attach()
757 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach()
758 fdc->sb_dma_channel = ddi_getprop(DDI_DEV_T_ANY, dip, in fd_attach()
764 fdc->c_un->un_unit_no)); in fd_attach()
767 fdc->c_un->un_curfdtype = 1; in fd_attach()
768 *fdc->c_un->un_chars = fdtypes[fdc->c_un->un_curfdtype]; in fd_attach()
769 fdunpacklabel(&fdlbl_high_80, &fdc->c_un->un_label); in fd_attach()
772 if (fd_attach_check_drive(fdc) == DDI_FAILURE) { in fd_attach()
773 fd_cleanup(dip, fdc, hard_intr_set, 1); in fd_attach()
781 fd_cleanup(dip, fdc, hard_intr_set, 1); in fd_attach()
807 fd_attach_map_regs(dev_info_t *dip, struct fdctlr *fdc) in fd_attach_map_regs() argument
816 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_attach_map_regs()
817 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&fdc->c_dma_regs, in fd_attach_map_regs()
819 &fdc->c_handlep_dma)) { in fd_attach_map_regs()
824 } else if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in fd_attach_map_regs()
825 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&fdc->c_dma_regs, in fd_attach_map_regs()
827 &fdc->c_handlep_dma)) { in fd_attach_map_regs()
833 reset_dma_controller(fdc); in fd_attach_map_regs()
834 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_attach_map_regs()
837 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fd_attach_map_regs()
843 fdc->c_control = in fd_attach_map_regs()
844 (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_control; in fd_attach_map_regs()
845 fdc->c_fifo = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_fifo; in fd_attach_map_regs()
846 fdc->c_dor = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_dor; in fd_attach_map_regs()
847 fdc->c_dir = (uchar_t *)&fdc->c_reg->fdc_82077_reg.fdc_dir; in fd_attach_map_regs()
852 (void *)fdc->c_control)); in fd_attach_map_regs()
860 quiesce_fd_interrupt(fdc); in fd_attach_map_regs()
874 fd_attach_det_ctlr(dev_info_t *dip, struct fdctlr *fdc) in fd_attach_det_ctlr() argument
891 if (ddi_regs_map_setup(dip, 0, (caddr_t *)&fdc->c_reg, in fd_attach_det_ctlr()
894 &fdc->c_handlep_cont)) { in fd_attach_det_ctlr()
909 fdc->c_fdtype |= FDCTYPE_SLAVIO; in fd_attach_det_ctlr()
910 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
911 fdc->c_auxiova = fd_getauxiova(dip); in fd_attach_det_ctlr()
912 fdc->c_auxiodata = (uchar_t)(AUX_MBO4M|AUX_TC4M); in fd_attach_det_ctlr()
913 fdc->c_auxiodata2 = (uchar_t)AUX_TC4M; in fd_attach_det_ctlr()
924 fdc->c_fdtype |= FDCTYPE_SB; in fd_attach_det_ctlr()
925 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
926 fdc->c_fdtype |= FDCTYPE_DMA; in fd_attach_det_ctlr()
936 fdc->c_fdtype |= FDCTYPE_DMA8237; in fd_attach_det_ctlr()
942 fdc->c_fdtype |= FDCTYPE_CHEERIO; in fd_attach_det_ctlr()
943 fdc->c_fdtype |= FDCTYPE_82077; in fd_attach_det_ctlr()
952 if (ddi_regs_map_setup(dip, 2, (caddr_t *)&fdc->c_auxio_reg, in fd_attach_det_ctlr()
953 0, sizeof (uint_t), &attr, &fdc->c_handlep_aux)) { in fd_attach_det_ctlr()
961 Set_auxio(fdc, AUX_HIGH_DENSITY); in fd_attach_det_ctlr()
964 *fdc->c_auxio_reg)); in fd_attach_det_ctlr()
966 fdc->c_fdtype |= FDCTYPE_DMA; in fd_attach_det_ctlr()
971 if (fdc->c_fdtype == 0) { in fd_attach_det_ctlr()
985 fd_attach_register_interrupts(dev_info_t *dip, struct fdctlr *fdc, int *hard) in fd_attach_register_interrupts() argument
997 if (ddi_get_iblock_cookie(dip, 0, &fdc->c_block) != DDI_SUCCESS) { in fd_attach_register_interrupts()
1005 mutex_init(&fdc->c_hilock, NULL, MUTEX_DRIVER, fdc->c_block); in fd_attach_register_interrupts()
1012 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_attach_register_interrupts()
1013 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach_register_interrupts()
1022 mutex_init(&fdc->c_lolock, NULL, in fd_attach_register_interrupts()
1023 MUTEX_DRIVER, fdc->c_block); in fd_attach_register_interrupts()
1030 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1039 if (ddi_add_intr(dip, 0, &fdc->c_block, 0, in fd_attach_register_interrupts()
1046 fdc->c_fasttrap = 0; in fd_attach_register_interrupts()
1052 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1068 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1076 mutex_init(&fdc->c_lolock, NULL, MUTEX_DRIVER, in fd_attach_register_interrupts()
1079 if (ddi_add_softintr(dip, DDI_SOFTINT_LOW, &fdc->c_softid, in fd_attach_register_interrupts()
1082 (caddr_t)fdc) != DDI_SUCCESS) { in fd_attach_register_interrupts()
1084 mutex_destroy(&fdc->c_hilock); in fd_attach_register_interrupts()
1085 mutex_destroy(&fdc->c_lolock); in fd_attach_register_interrupts()
1091 fdc->c_intrstat = kstat_create("fd", 0, "fdc0", "controller", in fd_attach_register_interrupts()
1093 if (fdc->c_intrstat) { in fd_attach_register_interrupts()
1094 fdc->c_hiintct = &KIOIP->intrs[KSTAT_INTR_HARD]; in fd_attach_register_interrupts()
1095 kstat_install(fdc->c_intrstat); in fd_attach_register_interrupts()
1099 cv_init(&fdc->c_iocv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1102 cv_init(&fdc->c_csbcv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1105 cv_init(&fdc->c_motoncv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1108 sema_init(&fdc->c_ocsem, 1, NULL, SEMA_DRIVER, NULL); in fd_attach_register_interrupts()
1111 cv_init(&fdc->c_suspend_cv, NULL, CV_DRIVER, NULL); in fd_attach_register_interrupts()
1121 fd_attach_check_drive(struct fdctlr *fdc) in fd_attach_check_drive() argument
1124 int unit = fdc->c_un->un_unit_no; in fd_attach_check_drive()
1130 mutex_enter(&fdc->c_lolock); in fd_attach_check_drive()
1131 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fd_attach_check_drive()
1142 Set_dor(fdc, ~((MOTEN(unit))|DRVSEL|RESET), 0); in fd_attach_check_drive()
1145 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fd_attach_check_drive()
1150 Set_dor(fdc, RESET|DRVSEL, 1); in fd_attach_check_drive()
1154 Set_dor(fdc, DRVSEL, 0); in fd_attach_check_drive()
1156 Set_dor(fdc, RESET, 1); in fd_attach_check_drive()
1162 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fd_attach_check_drive()
1164 if (!((fdc->c_fdtype & FDCTYPE_CHEERIO) || in fd_attach_check_drive()
1165 (fdc->c_fdtype & FDCTYPE_SB))) { in fd_attach_check_drive()
1174 fdgetcsb(fdc); in fd_attach_check_drive()
1175 if (fdreset(fdc) != 0) { in fd_attach_check_drive()
1176 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1192 if (fdrecalseek(fdc, unit, -1, 0) != 0) { in fd_attach_check_drive()
1193 timeout_id_t timeid = fdc->c_mtimeid; in fd_attach_check_drive()
1195 fdc->c_mtimeid = 0; in fd_attach_check_drive()
1196 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1212 fdselect(fdc, unit, 0); /* deselect drive zero (used in fdreset) */ in fd_attach_check_drive()
1213 fdretcsb(fdc); in fd_attach_check_drive()
1214 mutex_exit(&fdc->c_lolock); in fd_attach_check_drive()
1234 fd_cleanup(dev_info_t *dip, struct fdctlr *fdc, int hard, int locks) in fd_cleanup() argument
1240 ddi_get_instance(dip), (void *)fdc)); in fd_cleanup()
1243 if (fdc == NULL) { in fd_cleanup()
1254 ddi_remove_intr(dip, (uint_t)0, fdc->c_block); in fd_cleanup()
1258 if (fdc->c_softid != NULL) in fd_cleanup()
1259 ddi_remove_softintr(fdc->c_softid); in fd_cleanup()
1263 if (fdc->c_fdtype & FDCTYPE_82077) { in fd_cleanup()
1264 if (fdc->c_mtimeid) in fd_cleanup()
1265 (void) untimeout(fdc->c_mtimeid); in fd_cleanup()
1270 fdmotoff(fdc); in fd_cleanup()
1272 if (fdc->c_timeid) in fd_cleanup()
1273 (void) untimeout(fdc->c_timeid); in fd_cleanup()
1277 if (fdc->c_handlep_cont) in fd_cleanup()
1278 ddi_regs_map_free(&fdc->c_handlep_cont); in fd_cleanup()
1280 if (fdc->c_handlep_aux) in fd_cleanup()
1281 ddi_regs_map_free(&fdc->c_handlep_aux); in fd_cleanup()
1283 if (fdc->c_handlep_dma) in fd_cleanup()
1284 ddi_regs_map_free(&fdc->c_handlep_dma); in fd_cleanup()
1286 if (fdc->c_dma_buf_handle != NULL) in fd_cleanup()
1287 ddi_dma_mem_free(&fdc->c_dma_buf_handle); in fd_cleanup()
1289 if (fdc->c_dmahandle != NULL) in fd_cleanup()
1290 ddi_dma_free_handle(&fdc->c_dmahandle); in fd_cleanup()
1299 if (fdc->c_un != (struct fdunit *)NULL) { in fd_cleanup()
1301 ASSERT(!mutex_owned(&fdc->c_lolock)); in fd_cleanup()
1303 if (fdc->c_un->un_iostat) in fd_cleanup()
1304 kstat_delete(fdc->c_un->un_iostat); in fd_cleanup()
1305 fdc->c_un->un_iostat = NULL; in fd_cleanup()
1307 if (fdc->c_un->un_chars) in fd_cleanup()
1308 kmem_free(fdc->c_un->un_chars, sizeof (struct fd_char)); in fd_cleanup()
1310 if (fdc->c_un->un_drive) in fd_cleanup()
1311 kmem_free(fdc->c_un->un_drive, in fd_cleanup()
1314 kmem_free((caddr_t)fdc->c_un, sizeof (struct fdunit)); in fd_cleanup()
1317 if (fdc->c_intrstat) { in fd_cleanup()
1321 kstat_delete(fdc->c_intrstat); in fd_cleanup()
1324 fdc->c_intrstat = NULL; in fd_cleanup()
1327 cv_destroy(&fdc->c_iocv); in fd_cleanup()
1328 cv_destroy(&fdc->c_csbcv); in fd_cleanup()
1329 cv_destroy(&fdc->c_motoncv); in fd_cleanup()
1330 cv_destroy(&fdc->c_suspend_cv); in fd_cleanup()
1331 sema_destroy(&fdc->c_ocsem); in fd_cleanup()
1332 mutex_destroy(&fdc->c_hilock); in fd_cleanup()
1333 mutex_destroy(&fdc->c_lolock); in fd_cleanup()
1337 fdctlrs = fdc->c_next; in fd_cleanup()
1338 kmem_free(fdc, sizeof (*fdc)); in fd_cleanup()
1348 struct fdctlr *fdc = fd_getctlr(instance << FDINSTSHIFT); in fd_detach() local
1362 fd_cleanup(dip, fdc, 1, 1); in fd_detach()
1369 if (!fdc) in fd_detach()
1373 mutex_enter(&fdc->c_lolock); in fd_detach()
1374 fdgetcsb(fdc); /* Wait for I/O to finish */ in fd_detach()
1375 c_mtimeid = fdc->c_mtimeid; in fd_detach()
1376 fdretcsb(fdc); in fd_detach()
1377 mutex_exit(&fdc->c_lolock); in fd_detach()
1389 if (fdc->c_fdtype & FDCTYPE_SB) in fd_detach()
1390 ddi_remove_intr(dip, 0, fdc->c_block); in fd_detach()
1392 fdc->c_un->un_state = FD_STATE_SUSPENDED; in fd_detach()
1405 register struct fdctlr *fdc; in fd_info() local
1411 if ((fdc = fd_getctlr((dev_t)arg)) == NULL) { in fd_info()
1414 *result = fdc->c_dip; in fd_info()
1439 struct fdctlr *fdc; in fd_prop_op() local
1452 fdc = fd_getctlr(dev); in fd_prop_op()
1453 if (fdc == NULL) in fd_prop_op()
1457 un = fdc->c_un; in fd_prop_op()
1458 if ((un == NULL) || !fd_unit_is_open(fdc->c_un)) in fd_prop_op()
1476 struct fdctlr *fdc; in fd_open() local
1484 fdc = fd_getctlr(dev); in fd_open()
1485 if ((fdc == NULL) || ((un = fdc->c_un) == NULL)) { in fd_open()
1489 unit = fdc->c_un->un_unit_no; in fd_open()
1495 sema_p(&fdc->c_ocsem); in fd_open()
1502 sema_v(&fdc->c_ocsem); in fd_open()
1508 ddi_get_instance(fdc->c_dip), unit, part)); in fd_open()
1517 (void) pm_busy_component(fdc->c_dip, 0); in fd_open()
1519 mutex_enter(&fdc->c_lolock); in fd_open()
1521 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_open()
1523 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_open()
1524 mutex_exit(&fdc->c_lolock); in fd_open()
1525 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_open()
1530 sema_v(&fdc->c_ocsem); in fd_open()
1531 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1534 mutex_enter(&fdc->c_lolock); in fd_open()
1537 fdgetcsb(fdc); in fd_open()
1541 err = fdrecalseek(fdc, unit, -1, 0); in fd_open()
1542 fdretcsb(fdc); in fd_open()
1547 fdselect(fdc, unit, 0); in fd_open()
1548 mutex_exit(&fdc->c_lolock); in fd_open()
1549 sema_v(&fdc->c_ocsem); in fd_open()
1550 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1564 mutex_exit(&fdc->c_lolock); in fd_open()
1565 sema_v(&fdc->c_ocsem); in fd_open()
1567 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1578 fdc->c_csb.csb_unit = (uchar_t)unit; in fd_open()
1579 if (fdgetlabel(fdc, unit)) { in fd_open()
1587 fdselect(fdc, unit, 0); in fd_open()
1590 mutex_exit(&fdc->c_lolock); in fd_open()
1591 sema_v(&fdc->c_ocsem); in fd_open()
1592 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1600 fdgetcsb(fdc); in fd_open()
1601 err = fdsensedrv(fdc, unit) & WP_SR3; in fd_open()
1602 fdretcsb(fdc); in fd_open()
1605 fdselect(fdc, unit, 0); in fd_open()
1606 mutex_exit(&fdc->c_lolock); in fd_open()
1607 sema_v(&fdc->c_ocsem); in fd_open()
1608 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1625 mutex_exit(&fdc->c_lolock); in fd_open()
1626 sema_v(&fdc->c_ocsem); in fd_open()
1627 (void) pm_idle_component(fdc->c_dip, 0); in fd_open()
1651 register struct fdctlr *fdc; in fd_close() local
1654 fdc = fd_getctlr(dev); in fd_close()
1655 if (!fdc || !(un = fdc->c_un)) in fd_close()
1659 unit = fdc->c_un->un_unit_no; in fd_close()
1663 sema_p(&fdc->c_ocsem); in fd_close()
1664 mutex_enter(&fdc->c_lolock); in fd_close()
1678 fdselect(fdc, unit, 0); in fd_close()
1681 mutex_exit(&fdc->c_lolock); in fd_close()
1682 sema_v(&fdc->c_ocsem); in fd_close()
1696 struct fdctlr *fdc; in fd_strategy() local
1707 fdc = fd_getctlr(bp->b_edev); in fd_strategy()
1708 un = fdc->c_un; in fd_strategy()
1785 sema_p(&fdc->c_ocsem); in fd_strategy()
1787 (void) pm_busy_component(fdc->c_dip, 0); in fd_strategy()
1789 mutex_enter(&fdc->c_lolock); in fd_strategy()
1791 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_strategy()
1793 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_strategy()
1794 mutex_exit(&fdc->c_lolock); in fd_strategy()
1795 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_strategy()
1797 sema_v(&fdc->c_ocsem); in fd_strategy()
1798 (void) pm_idle_component(fdc->c_dip, 0); in fd_strategy()
1805 mutex_enter(&fdc->c_lolock); in fd_strategy()
1811 if (fdc->c_actf) in fd_strategy()
1812 fdc->c_actl->av_forw = bp; in fd_strategy()
1814 fdc->c_actf = bp; in fd_strategy()
1815 fdc->c_actl = bp; in fd_strategy()
1819 fdstart(fdc); in fd_strategy()
1821 mutex_exit(&fdc->c_lolock); in fd_strategy()
1822 sema_v(&fdc->c_ocsem); in fd_strategy()
1823 (void) pm_idle_component(fdc->c_dip, 0); in fd_strategy()
1846 struct fdctlr *fdc = arg; in fdmotoff() local
1847 int unit = fdc->c_un->un_unit_no; in fdmotoff()
1849 mutex_enter(&fdc->c_lolock); in fdmotoff()
1852 if (fdc->c_mtimeid == 0) { in fdmotoff()
1853 mutex_exit(&fdc->c_lolock); in fdmotoff()
1859 fdc->c_mtimeid = 0; in fdmotoff()
1861 if (!(Msr(fdc) & CB) && (Dor(fdc) & (MOTEN(unit)))) { in fdmotoff()
1863 Set_dor(fdc, MOTEN(unit), 0); in fdmotoff()
1866 mutex_exit(&fdc->c_lolock); in fdmotoff()
1885 struct fdctlr *fdc; in fd_ioctl() local
1899 fdc = fd_getctlr(dev); in fd_ioctl()
1900 unit = fdc->c_un->un_unit_no; in fd_ioctl()
1901 un = fdc->c_un; in fd_ioctl()
1945 if (fdc->c_fdtype & FDCTYPE_82077) in fd_ioctl()
2015 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2020 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2032 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2039 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2046 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2054 if (fdgetlabel(fdc, unit)) { in fd_ioctl()
2055 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2062 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2115 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2124 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2130 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2134 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2136 err = fdrw(fdc, unit, FDWRITE, 0, 0, 1, in fd_ioctl()
2138 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2139 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2148 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2151 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2208 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2213 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2222 if (fdc->c_un->un_drive->fdd_ejectable == 0) { in fd_ioctl()
2227 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2229 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2231 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2233 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2234 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2235 if ((pm_raise_power(fdc->c_dip, 0, in fd_ioctl()
2237 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2240 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2244 fdselect(fdc, unit, 1); in fd_ioctl()
2245 fdeject(fdc, unit); in fd_ioctl()
2246 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2249 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2254 if (fdc->c_fdtype & FDCTYPE_82077) { in fd_ioctl()
2255 if (fdc->c_mtimeid == 0) { in fd_ioctl()
2256 fdc->c_mtimeid = timeout(fdmotoff, fdc, in fd_ioctl()
2273 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2275 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2277 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2279 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2280 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2281 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_ioctl()
2285 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2289 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2303 if (fdsense_chng(fdc, unit)) { in fd_ioctl()
2310 if (fdsense_chng(fdc, unit)) { in fd_ioctl()
2316 if (fdcheckdisk(fdc, unit)) { in fd_ioctl()
2356 fdgetcsb(fdc); in fd_ioctl()
2357 if (fdsensedrv(fdc, unit) & WP_SR3) { in fd_ioctl()
2360 fdretcsb(fdc); in fd_ioctl()
2361 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2366 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2381 cpy.drvchar.fdd_ejectable = fdc->c_un->un_drive->fdd_ejectable; in fd_ioctl()
2504 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2506 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2507 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_ioctl()
2508 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_ioctl()
2509 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2510 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_ioctl()
2514 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2518 mutex_enter(&fdc->c_lolock); in fd_ioctl()
2521 if (fdformat(fdc, unit, cyl, hd)) in fd_ioctl()
2524 mutex_exit(&fdc->c_lolock); in fd_ioctl()
2525 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2532 (void) pm_busy_component(fdc->c_dip, 0); in fd_ioctl()
2533 err = fdrawioctl(fdc, unit, arg, flag); in fd_ioctl()
2535 (void) pm_idle_component(fdc->c_dip, 0); in fd_ioctl()
2563 fdrawioctl(struct fdctlr *fdc, int unit, intptr_t arg, int mode) in fdrawioctl() argument
2582 ASSERT(fdc->c_un->un_unit_no == unit); in fdrawioctl()
2621 mutex_enter(&fdc->c_lolock); in fdrawioctl()
2623 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fdrawioctl()
2625 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fdrawioctl()
2626 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2627 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fdrawioctl()
2632 (void) pm_idle_component(fdc->c_dip, 0); in fdrawioctl()
2635 mutex_enter(&fdc->c_lolock); in fdrawioctl()
2638 fdgetcsb(fdc); in fdrawioctl()
2639 csb = &fdc->c_csb; in fdrawioctl()
2659 if (fdc->c_fdtype & FDCTYPE_DMA) in fdrawioctl()
2697 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2700 mutex_enter(&fdc->c_hilock); in fdrawioctl()
2702 res = ddi_dma_mem_alloc(fdc->c_dmahandle, fc, in fdrawioctl()
2708 fdretcsb(fdc); in fdrawioctl()
2709 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2710 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2714 fdc->c_csb.csb_read = CSB_WRITE; in fdrawioctl()
2715 if (fdstart_dma(fdc, fa, fc) != 0) { in fdrawioctl()
2717 fdretcsb(fdc); in fdrawioctl()
2718 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2719 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2722 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2732 fdretcsb(fdc); in fdrawioctl()
2733 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2735 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2758 if (fdc->c_fdtype & FDCTYPE_SB) in fdrawioctl()
2765 fdretcsb(fdc); in fdrawioctl()
2766 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2771 fdretcsb(fdc); in fdrawioctl()
2772 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2789 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2790 mutex_enter(&fdc->c_hilock); in fdrawioctl()
2791 res = ddi_dma_mem_alloc(fdc->c_dmahandle, fc, in fdrawioctl()
2797 fdretcsb(fdc); in fdrawioctl()
2798 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2799 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2804 fdc->c_csb.csb_read = CSB_WRITE; in fdrawioctl()
2806 fdc->c_csb.csb_read = CSB_READ; in fdrawioctl()
2808 if (fdstart_dma(fdc, fa, fc) != 0) { in fdrawioctl()
2810 fdretcsb(fdc); in fdrawioctl()
2811 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2812 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2815 mutex_exit(&fdc->c_hilock); in fdrawioctl()
2823 if (fdc->c_fdtype & FDCTYPE_DMA) in fdrawioctl()
2827 fdretcsb(fdc); in fdrawioctl()
2828 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2866 (void) fdexec(fdc, 0); /* don't sleep, don't check change */ in fdrawioctl()
2868 (void) fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG); in fdrawioctl()
2890 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrawioctl()
2903 fdr.fdr_nbytes = fdc->c_csb.csb_rlen; /* return resid */ in fdrawioctl()
2931 fdretcsb(fdc); in fdrawioctl()
2932 mutex_exit(&fdc->c_lolock); in fdrawioctl()
2947 fdformat(struct fdctlr *fdc, int unit, int cyl, int hd) in fdformat() argument
2962 fdgetcsb(fdc); in fdformat()
2964 ASSERT(fdc->c_un->un_unit_no == unit); in fdformat()
2966 csb = &fdc->c_csb; in fdformat()
2967 un = fdc->c_un; in fdformat()
2977 if (fdrecalseek(fdc, unit, cyl, FDXC_CHECKCHG)) { in fdformat()
2978 fdretcsb(fdc); in fdformat()
3006 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdformat()
3014 mutex_enter(&fdc->c_hilock); in fdformat()
3016 cmdresult = ddi_dma_mem_alloc(fdc->c_dmahandle, csb->csb_len, in fdformat()
3022 mutex_exit(&fdc->c_hilock); in fdformat()
3026 fdc->c_csb.csb_read = CSB_WRITE; in fdformat()
3027 if (fdstart_dma(fdc, fd, csb->csb_len) != 0) { in fdformat()
3029 mutex_exit(&fdc->c_hilock); in fdformat()
3032 mutex_exit(&fdc->c_hilock); in fdformat()
3050 if ((cmdresult = fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG)) == 0) { in fdformat()
3055 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdformat()
3061 fdretcsb(fdc); in fdformat()
3082 fdstart(struct fdctlr *fdc) in fdstart() argument
3106 bp = fdc->c_actf; in fdstart()
3110 fdc->c_actf = bp->av_forw; in fdstart()
3111 fdc->c_current = bp; in fdstart()
3127 unit = fdc->c_un->un_unit_no; in fdstart()
3128 un = fdc->c_un; in fdstart()
3151 fdgetcsb(fdc); /* get csb (maybe wait for it) */ in fdstart()
3152 csb = &fdc->c_csb; in fdstart()
3169 if (((fdc->c_fdtype & FDCTYPE_SLAVIO) && in fdstart()
3171 (fdc->c_fdtype & FDCTYPE_TCBUG)) in fdstart()
3176 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdstart()
3184 fdc->c_csb.csb_read = CSB_READ; in fdstart()
3186 fdc->c_csb.csb_read = CSB_WRITE; in fdstart()
3251 if ((fdc->c_fdtype & FDCTYPE_SLAVIO) && in fdstart()
3253 (fdc->c_csb.csb_read == CSB_READ)) { in fdstart()
3263 } else if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdstart()
3278 if (fdc->c_fdtype & FDCTYPE_SB) { in fdstart()
3301 if (fdc->c_fdtype & FDCTYPE_SB) in fdstart()
3307 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdstart()
3322 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdstart()
3323 if ((fdc->c_fdtype & FDCTYPE_SB) && in fdstart()
3327 csb->csb_addr = fdc->dma_buf; in fdstart()
3330 bcopy(addr, fdc->dma_buf, tlen); in fdstart()
3333 mutex_enter(&fdc->c_hilock); in fdstart()
3335 if (fdstart_dma(fdc, csb->csb_addr, in fdstart()
3341 mutex_exit(&fdc->c_hilock); in fdstart()
3347 mutex_exit(&fdc->c_hilock); in fdstart()
3351 bp->b_error = fdexec(fdc, FDXC_SLEEP|FDXC_CHECKCHG); in fdstart()
3378 if ((fdc->c_fdtype & FDCTYPE_SB) && in fdstart()
3381 bcopy(fdc->dma_buf, addr, tlen); in fdstart()
3395 bp->b_resid, bp->b_bcount, fdc->c_csb.csb_rlen)); in fdstart()
3397 fdc->c_current = 0; in fdstart()
3398 fdretcsb(fdc); in fdstart()
3415 bp = fdc->c_actf; in fdstart()
3426 fdstart_dma(struct fdctlr *fdc, caddr_t addr, uint_t len) in fdstart_dma() argument
3433 if (fdc->c_csb.csb_read == CSB_READ) { in fdstart_dma()
3451 bzero((char *)&fdc->c_csb.csb_dmacookie, in fdstart_dma()
3452 sizeof (fdc->c_csb.csb_dmacookie)); in fdstart_dma()
3453 fdc->c_csb.csb_nwin = 0; in fdstart_dma()
3454 fdc->c_csb.csb_windex = 0; in fdstart_dma()
3455 fdc->c_csb.csb_ccount = 0; in fdstart_dma()
3457 res = ddi_dma_addr_bind_handle(fdc->c_dmahandle, NULL, addr, len, in fdstart_dma()
3458 flags, DDI_DMA_DONTWAIT, 0, &fdc->c_csb.csb_dmacookie, in fdstart_dma()
3459 &fdc->c_csb.csb_ccount); in fdstart_dma()
3470 fdc->c_csb.csb_nwin = 1; in fdstart_dma()
3471 fdc->c_csb.csb_windex = 1; in fdstart_dma()
3483 if (ddi_dma_numwin(fdc->c_dmahandle, in fdstart_dma()
3484 &fdc->c_csb.csb_nwin) != DDI_SUCCESS) { in fdstart_dma()
3491 fdc->c_csb.csb_nwin)); in fdstart_dma()
3497 fdc->c_csb.csb_windex = 1; in fdstart_dma()
3527 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdstart_dma()
3539 fd_unbind_handle(struct fdctlr *fdc) in fd_unbind_handle() argument
3541 if ((fdc->c_fdtype & FDCTYPE_DMA) && in fd_unbind_handle()
3542 ((fdc->c_csb.csb_read == CSB_READ) || in fd_unbind_handle()
3543 (fdc->c_csb.csb_read == CSB_WRITE))) { in fd_unbind_handle()
3544 mutex_enter(&fdc->c_hilock); in fd_unbind_handle()
3546 if (fdc->c_fdtype & FDCTYPE_SB) { in fd_unbind_handle()
3547 if (fdc->sb_dma_lock) { in fd_unbind_handle()
3548 release_sb_dma(fdc); in fd_unbind_handle()
3558 if (get_data_count_register(fdc) != 0) { in fd_unbind_handle()
3562 reset_dma_controller(fdc); in fd_unbind_handle()
3563 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_unbind_handle()
3566 if (ddi_dma_unbind_handle(fdc->c_dmahandle) != DDI_SUCCESS) { in fd_unbind_handle()
3569 mutex_exit(&fdc->c_hilock); in fd_unbind_handle()
3572 mutex_exit(&fdc->c_hilock); in fd_unbind_handle()
3599 fdexec(struct fdctlr *fdc, int flags) in fdexec() argument
3605 caddr_t a = (caddr_t)fdc; in fdexec()
3609 ASSERT(mutex_owned(&fdc->c_lolock)); in fdexec()
3611 csb = &fdc->c_csb; in fdexec()
3615 ASSERT(unit == fdc->c_un->un_unit_no); in fdexec()
3621 fdc->c_un->un_chars->fdc_transfer_rate)); in fdexec()
3623 fdc->c_un->un_chars->fdc_sec_size)); in fdexec()
3625 fdc->c_un->un_label.dkl_map[2].dkl_nblk)); in fdexec()
3627 if ((fdc->c_fdtype & FDCTYPE_CTRLMASK) == FDCTYPE_82077) { in fdexec()
3628 fdexec_turn_on_motor(fdc, flags, unit); in fdexec()
3632 fdselect(fdc, unit, 1); /* select drive */ in fdexec()
3637 switch (fdc->c_un->un_chars->fdc_transfer_rate) { in fdexec()
3639 Dsr(fdc, 0); in fdexec()
3642 Dsr(fdc, 1); in fdexec()
3645 Dsr(fdc, 2); in fdexec()
3655 if ((flags & FDXC_CHECKCHG) && fdsense_chng(fdc, unit)) { in fdexec()
3657 fdc->c_un->un_flags |= FDUNIT_CHANGED; in fdexec()
3659 if (fdcheckdisk(fdc, unit)) { in fdexec()
3661 (void) fd_unbind_handle(fdc); in fdexec()
3672 fdc->fdstats.rd++; in fdexec()
3675 fdc->fdstats.wr++; in fdexec()
3678 fdc->fdstats.recal++; in fdexec()
3681 fdc->fdstats.form++; in fdexec()
3684 fdc->fdstats.other++; in fdexec()
3713 if ((fdc->c_fdtype & FDCTYPE_DMA) && in fdexec()
3714 ((fdc->c_csb.csb_read == CSB_READ) || in fdexec()
3715 (fdc->c_csb.csb_read == CSB_WRITE))) { in fdexec()
3716 mutex_enter(&fdc->c_hilock); in fdexec()
3720 reset_dma_controller(fdc); in fdexec()
3723 (void *)fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdexec()
3726 fdc->c_csb.csb_dmacookie.dmac_size)); in fdexec()
3727 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdexec()
3729 set_data_count_register(fdc, in fdexec()
3730 fdc->c_csb.csb_dmacookie.dmac_size); in fdexec()
3731 set_data_address_register(fdc, in fdexec()
3732 fdc->c_csb.csb_dmacookie.dmac_laddress); in fdexec()
3736 if (fdc->c_csb.csb_read == CSB_READ) in fdexec()
3737 set_dma_mode(fdc, CSB_READ); in fdexec()
3739 set_dma_mode(fdc, CSB_WRITE); in fdexec()
3740 mutex_exit(&fdc->c_hilock); in fdexec()
3750 if (Msr(fdc) & CB) { in fdexec()
3753 (C, "fdc: unexpectedly busy-stat 0x%x\n", Msr(fdc))); in fdexec()
3756 (void) fd_unbind_handle(fdc); in fdexec()
3765 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdexec()
3770 (C, "fdc: no RQM - stat 0x%x\n", Msr(fdc))); in fdexec()
3773 (void) fd_unbind_handle(fdc); in fdexec()
3777 Set_Fifo(fdc, csb->csb_cmds[i]); in fdexec()
3781 Msr(fdc))); in fdexec()
3791 fdc->c_timeid = timeout(fdwatch, a, in fdexec()
3796 (C, "fdexec: cmd sent, Msr 0x%x\n", Msr(fdc))); in fdexec()
3800 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3801 if (fdc->c_mtimeid == 0) { in fdexec()
3802 fdc->c_mtimeid = timeout(fdmotoff, a, in fdexec()
3814 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdexec()
3840 while ((tmp = Msr(fdc)) & CB) { in fdexec()
3846 Fifo(fdc); in fdexec()
3855 Msr(fdc), csb->csb_nrslts)); in fdexec()
3858 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3859 if (fdc->c_mtimeid == 0) { in fdexec()
3860 fdc->c_mtimeid = timeout( in fdexec()
3879 fdc->c_flags |= FDCFLG_WAITING; in fdexec()
3880 while (fdc->c_flags & FDCFLG_WAITING) { in fdexec()
3881 cv_wait(&fdc->c_iocv, &fdc->c_lolock); in fdexec()
3889 if ((fdc->c_fdtype & FDCTYPE_TCBUG) && in fdexec()
3901 if (((csb->csb_rslt[0] & IC_SR0) || (fdc->c_csb.csb_dcsr_rslt) || in fdexec()
3906 if (fdrecover(fdc) != 0) { in fdexec()
3907 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3908 if (fdc->c_mtimeid == 0) { in fdexec()
3909 fdc->c_mtimeid = timeout(fdmotoff, in fdexec()
3919 (void) fd_unbind_handle(fdc); in fdexec()
3928 if (fdc->c_fdtype & FDCTYPE_82077) { in fdexec()
3929 if (fdc->c_mtimeid == 0) { in fdexec()
3930 fdc->c_mtimeid = timeout(fdmotoff, a, Motoff_delay); in fdexec()
3935 if (fd_unbind_handle(fdc)) in fdexec()
3947 fdexec_turn_on_motor(struct fdctlr *fdc, int flags, uint_t unit) in fdexec_turn_on_motor() argument
3956 timeid = fdc->c_mtimeid; in fdexec_turn_on_motor()
3957 fdc->c_mtimeid = 0; in fdexec_turn_on_motor()
3959 mutex_exit(&fdc->c_lolock); in fdexec_turn_on_motor()
3961 mutex_enter(&fdc->c_lolock); in fdexec_turn_on_motor()
3964 ASSERT(fdc->c_un->un_unit_no == unit); in fdexec_turn_on_motor()
3967 set_rotational_speed(fdc, unit); in fdexec_turn_on_motor()
3969 if (!(Dor(fdc) & (MOTEN(unit)))) { in fdexec_turn_on_motor()
3977 Set_dor(fdc, (MOTEN(unit)), 1); in fdexec_turn_on_motor()
3981 (void) cv_timedwait(&fdc->c_motoncv, in fdexec_turn_on_motor()
3982 &fdc->c_lolock, local_lbolt + Moton_delay); in fdexec_turn_on_motor()
4000 fdrecover(struct fdctlr *fdc) in fdrecover() argument
4005 csb = &fdc->c_csb; in fdrecover()
4007 if (fdc->c_flags & FDCFLG_TIMEDOUT) { in fdrecover()
4010 fdc->c_flags ^= FDCFLG_TIMEDOUT; in fdrecover()
4017 savecsb = fdc->c_csb; in fdrecover()
4018 bzero(&fdc->c_csb, sizeof (struct fdcsb)); in fdrecover()
4021 (void) fdreset(fdc); in fdrecover()
4023 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrecover()
4024 mutex_enter(&fdc->c_hilock); in fdrecover()
4026 reset_dma_controller(fdc); in fdrecover()
4027 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdrecover()
4028 mutex_exit(&fdc->c_hilock); in fdrecover()
4034 (void) fdrecalseek(fdc, savecsb.csb_unit, -1, 0); in fdrecover()
4035 fdc->c_csb = savecsb; /* restore original csb */ in fdrecover()
4042 fdc->fdstats.de++; in fdrecover()
4045 fdc->fdstats.run++; in fdrecover()
4048 fdc->fdstats.bfmt++; in fdrecover()
4051 fdc->fdstats.to++; in fdrecover()
4102 (int)fdc->c_current->b_blkno)); in fdrecover()
4105 if (fdc->c_fdtype & FDCTYPE_SB) { in fdrecover()
4157 struct fdctlr *fdc; in fdintr_dma() local
4171 fdc = fdctlrs; in fdintr_dma()
4173 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in fdintr_dma()
4174 tmp_dcsr = get_dma_control_register(fdc); in fdintr_dma()
4180 mutex_enter(&fdc->c_hilock); in fdintr_dma()
4182 if (fdc->c_csb.csb_opmode == 0x0) { in fdintr_dma()
4183 fdc->c_csb.csb_opmode = 2; in fdintr_dma()
4185 if (fdc->sb_dma_lock) { in fdintr_dma()
4186 release_sb_dma(fdc); in fdintr_dma()
4195 switch (fdc->c_csb.csb_opmode) { in fdintr_dma()
4215 fdc->c_csb.csb_nrslts = 0; in fdintr_dma()
4232 while (((tmp = Msr(fdc)) & CB) && in fdintr_dma()
4241 fdc->c_csb.csb_rslt in fdintr_dma()
4242 [fdc->c_csb.csb_nrslts++] in fdintr_dma()
4243 = Fifo(fdc); in fdintr_dma()
4248 fdc->c_csb.csb_rslt in fdintr_dma()
4249 [fdc->c_csb.csb_nrslts in fdintr_dma()
4257 fdc->c_csb.csb_status = 2; in fdintr_dma()
4277 fdc->c_csb.csb_dcsr_rslt = 1; in fdintr_dma()
4280 reset_dma_controller(fdc); in fdintr_dma()
4281 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdintr_dma()
4286 if ((fdc->c_fdtype & FDCTYPE_TCBUG) && in fdintr_dma()
4287 ((fdc->c_csb.csb_rslt[0] & IC_SR0) == 0x40) && in fdintr_dma()
4288 (fdc->c_csb.csb_rslt[1] & EN_SR1)) { in fdintr_dma()
4290 fdc->c_csb.csb_rslt[0] &= ~IC_SR0; in fdintr_dma()
4292 fdc->c_csb.csb_rslt[1] &= ~EN_SR1; in fdintr_dma()
4299 if (((fdc->c_csb.csb_rslt[0] & IC_SR0) != 0) || in fdintr_dma()
4300 (fdc->c_csb.csb_rslt[1] != 0) || in fdintr_dma()
4301 (fdc->c_csb.csb_rslt[2] != 0)) { in fdintr_dma()
4313 get_data_count_register(fdc))); in fdintr_dma()
4319 if (fdc->c_csb.csb_ccount == 0) { in fdintr_dma()
4323 fdc->c_csb.csb_ccount--; in fdintr_dma()
4324 ccount = fdc->c_csb.csb_ccount; in fdintr_dma()
4326 windex = fdc->c_csb.csb_windex; in fdintr_dma()
4333 if ((ccount == 0) && (windex == fdc->c_csb.csb_nwin)) { in fdintr_dma()
4346 ddi_dma_nextcookie(fdc->c_dmahandle, in fdintr_dma()
4347 &fdc->c_csb.csb_dmacookie); in fdintr_dma()
4351 fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdintr_dma()
4355 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4359 (void) ddi_dma_getwin(fdc->c_dmahandle, in fdintr_dma()
4360 fdc->c_csb.csb_windex, in fdintr_dma()
4362 &fdc->c_csb.csb_dmacookie, in fdintr_dma()
4363 &fdc->c_csb.csb_ccount); in fdintr_dma()
4364 fdc->c_csb.csb_windex++; in fdintr_dma()
4368 fdc->c_csb.csb_windex)); in fdintr_dma()
4372 fdc->c_csb.csb_ccount)); in fdintr_dma()
4376 fdc->c_csb.csb_dmacookie.dmac_laddress)); in fdintr_dma()
4380 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4388 ASSERT(fdc->c_csb.csb_dmacookie.dmac_size); in fdintr_dma()
4390 set_data_count_register(fdc, in fdintr_dma()
4391 fdc->c_csb.csb_dmacookie.dmac_size); in fdintr_dma()
4392 set_data_address_register(fdc, in fdintr_dma()
4393 fdc->c_csb.csb_dmacookie.dmac_laddress); in fdintr_dma()
4397 fdc->c_csb.csb_dmacookie.dmac_size)); in fdintr_dma()
4401 fdc->c_csb.csb_cmds[2] = fdc->c_csb.csb_rslt[3]; in fdintr_dma()
4402 fdc->c_csb.csb_cmds[3] = fdc->c_csb.csb_rslt[4]; in fdintr_dma()
4403 fdc->c_csb.csb_cmds[4] = fdc->c_csb.csb_rslt[5]; in fdintr_dma()
4404 fdc->c_csb.csb_cmds[1] = (fdc->c_csb.csb_cmds[1] in fdintr_dma()
4405 & ~0x04) | (fdc->c_csb.csb_rslt[4] << 2); in fdintr_dma()
4407 for (i = 0; i < (int)fdc->c_csb.csb_ncmds; i++) { in fdintr_dma()
4414 if ((Msr(fdc) & (DIO|RQM)) == RQM) in fdintr_dma()
4421 Msr(fdc))); in fdintr_dma()
4423 fdc->c_csb.csb_status = 2; in fdintr_dma()
4428 Set_Fifo(fdc, fdc->c_csb.csb_cmds[i]); in fdintr_dma()
4433 fdc->c_csb.csb_cmds[i], Msr(fdc))); in fdintr_dma()
4438 set_dma_control_register(fdc, tmp_dcsr | in fdintr_dma()
4454 fdc->c_csb.csb_dcsr_rslt = 1; in fdintr_dma()
4455 reset_dma_controller(fdc); in fdintr_dma()
4456 set_dma_control_register(fdc, DCSR_INIT_BITS); in fdintr_dma()
4476 while (((Msr(fdc) & CB)) && (i < 10000)) { in fdintr_dma()
4489 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4500 Set_Fifo(fdc, SNSISTAT); in fdintr_dma()
4503 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4511 fdc->c_csb.csb_rslt[0] = Fifo(fdc); in fdintr_dma()
4514 while ((!(Msr(fdc) & RQM)) && (i < 10000)) { in fdintr_dma()
4522 fdc->c_csb.csb_rslt[1] = Fifo(fdc); in fdintr_dma()
4541 mutex_exit(&fdc->c_hilock); in fdintr_dma()
4544 mutex_enter(&fdc->c_lolock); in fdintr_dma()
4546 fdc->c_csb.csb_opmode = 0; in fdintr_dma()
4551 if (fdc->c_timeid) { in fdintr_dma()
4552 timeout_id_t timeid = fdc->c_timeid; in fdintr_dma()
4553 fdc->c_timeid = 0; in fdintr_dma()
4554 mutex_exit(&fdc->c_lolock); in fdintr_dma()
4556 mutex_enter(&fdc->c_lolock); in fdintr_dma()
4560 if (fdc->c_flags & FDCFLG_WAITING) { in fdintr_dma()
4569 fdc->c_flags ^= FDCFLG_WAITING; in fdintr_dma()
4570 cv_signal(&fdc->c_iocv); in fdintr_dma()
4579 fdc->c_csb.csb_rslt[0], fdc->c_csb.csb_rslt[1], in fdintr_dma()
4580 fdc->c_csb.csb_rslt[2])); in fdintr_dma()
4582 mutex_exit(&fdc->c_lolock); in fdintr_dma()
4585 if (fdc->c_intrstat) in fdintr_dma()
4601 struct fdctlr *fdc = (struct fdctlr *)arg; in fd_lointr() local
4604 csb = &fdc->c_csb; in fd_lointr()
4616 if (fdc->c_intrstat) in fd_lointr()
4621 mutex_enter(&fdc->c_lolock); in fd_lointr()
4625 if (fdc->c_timeid) { in fd_lointr()
4626 timeout_id_t timeid = fdc->c_timeid; in fd_lointr()
4627 fdc->c_timeid = 0; in fd_lointr()
4628 mutex_exit(&fdc->c_lolock); in fd_lointr()
4630 mutex_enter(&fdc->c_lolock); in fd_lointr()
4634 if (fdc->c_flags & FDCFLG_WAITING) { in fd_lointr()
4638 fdc->c_flags ^= FDCFLG_WAITING; in fd_lointr()
4639 cv_signal(&fdc->c_iocv); in fd_lointr()
4650 if (fdc->c_intrstat) in fd_lointr()
4652 mutex_exit(&fdc->c_lolock); in fd_lointr()
4663 struct fdctlr *fdc = arg; in fdwatch() local
4669 mutex_enter(&fdc->c_lolock); in fdwatch()
4670 if (fdc->c_timeid == 0) { in fdwatch()
4678 mutex_exit(&fdc->c_lolock); in fdwatch()
4681 fdc->c_timeid = 0; in fdwatch()
4682 csb = &fdc->c_csb; in fdwatch()
4684 mutex_enter(&fdc->c_hilock); in fdwatch()
4694 mutex_exit(&fdc->c_hilock); in fdwatch()
4698 fdc->c_flags |= FDCFLG_TIMEDOUT; in fdwatch()
4701 if ((fdc->c_fdtype & FDCTYPE_DMA) == 0) { in fdwatch()
4702 ddi_trigger_softintr(fdc->c_softid); in fdwatch()
4704 mutex_exit(&fdc->c_lolock); in fdwatch()
4706 mutex_exit(&fdc->c_lolock); in fdwatch()
4716 fdgetcsb(struct fdctlr *fdc) in fdgetcsb() argument
4719 ASSERT(mutex_owned(&fdc->c_lolock)); in fdgetcsb()
4720 while (fdc->c_flags & FDCFLG_BUSY) { in fdgetcsb()
4721 fdc->c_flags |= FDCFLG_WANT; in fdgetcsb()
4722 cv_wait(&fdc->c_csbcv, &fdc->c_lolock); in fdgetcsb()
4724 fdc->c_flags |= FDCFLG_BUSY; /* got it! */ in fdgetcsb()
4732 fdretcsb(struct fdctlr *fdc) in fdretcsb() argument
4735 ASSERT(mutex_owned(&fdc->c_lolock)); in fdretcsb()
4737 fdc->c_flags &= ~FDCFLG_BUSY; /* let go */ in fdretcsb()
4739 fdc->c_csb.csb_read = 0; in fdretcsb()
4741 if (fdc->c_flags & FDCFLG_WANT) { in fdretcsb()
4742 fdc->c_flags ^= FDCFLG_WANT; in fdretcsb()
4751 cv_broadcast(&fdc->c_csbcv); in fdretcsb()
4765 fdreset(struct fdctlr *fdc) in fdreset() argument
4773 ASSERT(mutex_owned(&fdc->c_lolock)); in fdreset()
4776 fdc->fdstats.reset++; in fdreset()
4785 if ((fdc->c_fdtype & FDCTYPE_CTRLMASK) == FDCTYPE_82077) { in fdreset()
4796 timeid = fdc->c_mtimeid; in fdreset()
4797 fdc->c_mtimeid = 0; in fdreset()
4799 mutex_exit(&fdc->c_lolock); in fdreset()
4801 mutex_enter(&fdc->c_lolock); in fdreset()
4804 Set_dor(fdc, DMAGATE, 0); in fdreset()
4809 Dsr(fdc, SWR); in fdreset()
4820 Dsr(fdc, 0); in fdreset()
4822 switch (fdc->c_fdtype & FDCTYPE_CTRLMASK) { in fdreset()
4830 fdc->c_flags |= FDCFLG_WAITING; in fdreset()
4838 Set_dor(fdc, DMAGATE|RESET, 1); in fdreset()
4841 (C, "fdattach: Dor 0x%x\n", Dor(fdc))); in fdreset()
4844 if (cv_timedwait(&fdc->c_iocv, &fdc->c_lolock, in fdreset()
4851 fdc->c_flags |= FDCFLG_WAITING; in fdreset()
4857 cv_wait(&fdc->c_iocv, &fdc->c_lolock); in fdreset()
4860 csb = &fdc->c_csb; in fdreset()
4863 csb->csb_unit = fdc->c_un->un_unit_no; in fdreset()
4875 if (fdc->c_fdtype & FDCTYPE_DMA) in fdreset()
4883 (void) fdexec(fdc, 0); /* no FDXC_CHECKCHG, ... */ in fdreset()
4899 (void) fdexec(fdc, 0); /* no FDXC_CHECKCHG, ... */ in fdreset()
4924 fdrecalseek(struct fdctlr *fdc, int unit, int arg, int execflg) in fdrecalseek() argument
4929 ASSERT(fdc->c_un->un_unit_no == unit); in fdrecalseek()
4935 csb = &fdc->c_csb; in fdrecalseek()
4957 if (result = fdexec(fdc, FDXC_SLEEP | execflg)) { in fdrecalseek()
4984 fdsensedrv(struct fdctlr *fdc, int unit) in fdsensedrv() argument
4988 ASSERT(fdc->c_un->un_unit_no == unit); in fdsensedrv()
4990 csb = &fdc->c_csb; in fdsensedrv()
5004 (void) fdexec(fdc, 0); /* DON't check changed!, no sleep */ in fdsensedrv()
5020 fdcheckdisk(struct fdctlr *fdc, int unit) in fdcheckdisk() argument
5030 ASSERT(fdc->c_un->un_unit_no == unit); in fdcheckdisk()
5036 csb = &fdc->c_csb; in fdcheckdisk()
5037 savecsb = fdc->c_csb; in fdcheckdisk()
5047 st3 = fdsensedrv(fdc, unit); in fdcheckdisk()
5058 err = fdrecalseek(fdc, unit, seekto, 0); in fdcheckdisk()
5061 fdc->c_csb = savecsb; in fdcheckdisk()
5073 if (fdsense_chng(fdc, csb->csb_unit)) { in fdcheckdisk()
5089 fdselect(struct fdctlr *fdc, int unit, int on) in fdselect() argument
5092 ASSERT(fdc->c_un->un_unit_no == unit); in fdselect()
5097 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdselect()
5105 (C, "fdselect: (before) Dor 0x%x\n", Dor(fdc))); in fdselect()
5108 Set_dor(fdc, DRVSEL, !on); in fdselect()
5110 Set_dor(fdc, DRVSEL, on); in fdselect()
5114 (C, "fdselect: Dor 0x%x\n", Dor(fdc))); in fdselect()
5125 fdeject(struct fdctlr *fdc, int unit) in fdeject() argument
5129 ASSERT(fdc->c_un->un_unit_no == unit); in fdeject()
5131 un = fdc->c_un; in fdeject()
5138 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdeject()
5146 if (!(Dor(fdc) & MOTEN(unit))) { in fdeject()
5148 Set_dor(fdc, MOTEN(unit), 1); in fdeject()
5152 Set_dor(fdc, EJECT, 1); in fdeject()
5155 Set_dor(fdc, EJECT, 0); in fdeject()
5158 if (!(Dor(fdc) & MOTEN(unit))) { in fdeject()
5160 Set_dor(fdc, MOTEN(unit), 1); in fdeject()
5164 Set_dor(fdc, EJECT_DMA, 1); in fdeject()
5167 Set_dor(fdc, EJECT_DMA, 0); in fdeject()
5178 fdsense_chng(struct fdctlr *fdc, int unit) in fdsense_chng() argument
5184 ASSERT(fdc->c_un->un_unit_no == unit); in fdsense_chng()
5194 if (Dir(fdc) & DSKCHG) in fdsense_chng()
5202 switch (fdc->c_fdtype & FDCTYPE_AUXIOMASK) { in fdsense_chng()
5204 if (*fdc->c_auxiova & AUX_DISKCHG) in fdsense_chng()
5211 if (!(Dor(fdc) & MOTEN(unit))) { in fdsense_chng()
5213 Set_dor(fdc, MOTEN(unit), 1); in fdsense_chng()
5216 if (Dir(fdc) & DSKCHG) in fdsense_chng()
5236 fdgetlabel(struct fdctlr *fdc, int unit) in fdgetlabel() argument
5250 un = fdc->c_un; in fdgetlabel()
5253 ASSERT(fdc->c_un->un_unit_no == unit); in fdgetlabel()
5304 if (!(err = fdrw(fdc, unit, FDREAD, 0, 0, in fdgetlabel()
5308 fdrw(fdc, unit, FDREAD, 0, 0, in fdgetlabel()
5312 !(err = fdrw(fdc, unit, FDREAD, 0, 0, 1, (caddr_t)label, in fdgetlabel()
5440 fdrw(struct fdctlr *fdc, int unit, int rw, int cyl, int head, in fdrw() argument
5454 ASSERT(fdc->c_un->un_unit_no == unit); in fdrw()
5456 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fdrw()
5458 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fdrw()
5459 mutex_exit(&fdc->c_lolock); in fdrw()
5460 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fdrw()
5464 mutex_enter(&fdc->c_lolock); in fdrw()
5468 mutex_enter(&fdc->c_lolock); in fdrw()
5471 fdgetcsb(fdc); in fdrw()
5472 csb = &fdc->c_csb; in fdrw()
5473 ch = fdc->c_un->un_chars; in fdrw()
5475 if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdrw()
5483 if (fdc->c_fdtype & FDCTYPE_TCBUG) { in fdrw()
5493 fdc->c_csb.csb_read = CSB_READ; in fdrw()
5495 fdc->c_csb.csb_read = CSB_WRITE; in fdrw()
5500 if (fdc->c_fdtype & FDCTYPE_SB) in fdrw()
5509 if (fdc->c_fdtype & FDCTYPE_TCBUG) in fdrw()
5513 (uchar_t)max(fdc->c_un->un_chars->fdc_secptrack, sector); in fdrw()
5526 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrw()
5528 mutex_enter(&fdc->c_hilock); in fdrw()
5534 res = ddi_dma_mem_alloc(fdc->c_dmahandle, len, in fdrw()
5543 fdretcsb(fdc); in fdrw()
5544 mutex_exit(&fdc->c_hilock); in fdrw()
5550 if (fdstart_dma(fdc, dma_addr, len) != 0) { in fdrw()
5551 fdretcsb(fdc); in fdrw()
5553 mutex_exit(&fdc->c_hilock); in fdrw()
5563 if (fdc->c_csb.csb_read == CSB_WRITE) { in fdrw()
5568 mutex_exit(&fdc->c_hilock); in fdrw()
5576 if (fdexec(fdc, FDXC_SLEEP | FDXC_CHECKCHG) != 0) { in fdrw()
5577 fdretcsb(fdc); in fdrw()
5592 if (fdc->c_fdtype & FDCTYPE_DMA) { in fdrw()
5593 if (fdc->c_csb.csb_read == CSB_READ) { in fdrw()
5602 fdretcsb(fdc); in fdrw()
5635 struct fdctlr *fdc = fdctlrs; in fd_getctlr() local
5638 while (fdc) { in fd_getctlr()
5639 if (ddi_get_instance(fdc->c_dip) == ctlr) in fd_getctlr()
5640 return (fdc); in fd_getctlr()
5641 fdc = fdc->c_next; in fd_getctlr()
5643 return (fdc); in fd_getctlr()
5931 set_rotational_speed(struct fdctlr *fdc, int unit) in set_rotational_speed() argument
5936 ASSERT(fdc->c_un->un_unit_no == unit); in set_rotational_speed()
5941 if (fdc->c_fdtype & FDCTYPE_MACHIO) in set_rotational_speed()
5955 is_medium = fdc->c_un->un_chars->fdc_medium; in set_rotational_speed()
5957 if (fdc->c_un->un_flags & FDUNIT_SET_SPEED) { in set_rotational_speed()
5961 ((fdc->c_un->un_flags & FDUNIT_MEDIUM) ? 1 : 0); in set_rotational_speed()
5966 fdc->c_un->un_flags ^= FDUNIT_MEDIUM; in set_rotational_speed()
5969 fdc->c_un->un_flags &= ~FDUNIT_SET_SPEED; in set_rotational_speed()
5974 fdselect(fdc, unit, 0); in set_rotational_speed()
5977 if ((fdc->c_fdtype & FDCTYPE_AUXIOMASK) == FDCTYPE_SLAVIO) { in set_rotational_speed()
5978 Set_dor(fdc, MEDIUM_DENSITY, is_medium); in set_rotational_speed()
5981 if ((fdc->c_fdtype & FDCTYPE_AUXIOMASK) == FDCTYPE_CHEERIO) { in set_rotational_speed()
5983 Set_auxio(fdc, AUX_MEDIUM_DENSITY); in set_rotational_speed()
5985 Set_auxio(fdc, AUX_HIGH_DENSITY); in set_rotational_speed()
5994 fdselect(fdc, unit, 1); /* Sony requirement */ in set_rotational_speed()
6005 struct fdctlr *fdc; in fd_media_watch() local
6009 fdc = fd_getctlr(dev); in fd_media_watch()
6010 unit = fdc->c_un->un_unit_no; in fd_media_watch()
6011 un = fdc->c_un; in fd_media_watch()
6013 mutex_enter(&fdc->c_lolock); in fd_media_watch()
6020 mutex_exit(&fdc->c_lolock); in fd_media_watch()
6025 un->un_media_state = fd_get_media_state(fdc, unit); in fd_media_watch()
6026 cv_broadcast(&fdc->c_statecv); in fd_media_watch()
6028 mutex_exit(&fdc->c_lolock); in fd_media_watch()
6037 fd_get_media_state(struct fdctlr *fdc, int unit) in fd_get_media_state() argument
6041 ASSERT(fdc->c_un->un_unit_no == unit); in fd_get_media_state()
6043 if (fdsense_chng(fdc, unit)) { in fd_get_media_state()
6045 if (fdcheckdisk(fdc, unit)) { in fd_get_media_state()
6060 struct fdctlr *fdc; in fd_check_media() local
6065 fdc = fd_getctlr(dev); in fd_check_media()
6066 unit = fdc->c_un->un_unit_no; in fd_check_media()
6067 un = fdc->c_un; in fd_check_media()
6069 mutex_enter(&fdc->c_lolock); in fd_check_media()
6071 CHECK_AND_WAIT_FD_STATE_SUSPENDED(fdc); in fd_check_media()
6073 if (fdc->c_un->un_state == FD_STATE_STOPPED) { in fd_check_media()
6074 mutex_exit(&fdc->c_lolock); in fd_check_media()
6075 if ((pm_raise_power(fdc->c_dip, 0, PM_LEVEL_ON)) in fd_check_media()
6080 (void) pm_idle_component(fdc->c_dip, 0); in fd_check_media()
6084 mutex_enter(&fdc->c_lolock); in fd_check_media()
6087 un->un_media_state = fd_get_media_state(fdc, unit); in fd_check_media()
6095 if (cv_wait_sig(&fdc->c_statecv, &fdc->c_lolock) == 0) { in fd_check_media()
6097 mutex_exit(&fdc->c_lolock); in fd_check_media()
6106 mutex_exit(&fdc->c_lolock); in fd_check_media()
6108 mutex_enter(&fdc->c_lolock); in fd_check_media()
6112 if (fdgetlabel(fdc, unit)) { in fd_check_media()
6113 mutex_exit(&fdc->c_lolock); in fd_check_media()
6117 mutex_exit(&fdc->c_lolock); in fd_check_media()
6155 struct fdctlr *fdc; in fd_power() local
6165 fdc = fd_getctlr(instance << FDINSTSHIFT); in fd_power()
6166 if (fdc->c_un == NULL) in fd_power()
6170 rval = fd_pm_lower_power(fdc); in fd_power()
6173 rval = fd_pm_raise_power(fdc); in fd_power()
6187 fd_pm_lower_power(struct fdctlr *fdc) in fd_pm_lower_power() argument
6190 mutex_enter(&fdc->c_lolock); in fd_pm_lower_power()
6192 if ((fdc->c_un->un_state == FD_STATE_SUSPENDED) || in fd_pm_lower_power()
6193 (fdc->c_un->un_state == FD_STATE_STOPPED)) { in fd_pm_lower_power()
6194 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6202 if (fdc->c_flags & FDCFLG_BUSY) { in fd_pm_lower_power()
6205 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6209 fdc->c_un->un_state = FD_STATE_STOPPED; in fd_pm_lower_power()
6211 mutex_exit(&fdc->c_lolock); in fd_pm_lower_power()
6223 fd_pm_raise_power(struct fdctlr *fdc) in fd_pm_raise_power() argument
6226 struct fdunit *un = fdc->c_un; in fd_pm_raise_power()
6230 mutex_enter(&fdc->c_lolock); in fd_pm_raise_power()
6231 fdgetcsb(fdc); in fd_pm_raise_power()
6234 if (fdc->c_fdtype & FDCTYPE_DMA) { in fd_pm_raise_power()
6235 mutex_enter(&fdc->c_hilock); in fd_pm_raise_power()
6236 reset_dma_controller(fdc); in fd_pm_raise_power()
6237 set_dma_control_register(fdc, DCSR_INIT_BITS); in fd_pm_raise_power()
6238 mutex_exit(&fdc->c_hilock); in fd_pm_raise_power()
6246 fdc->c_un->un_flags |= FDUNIT_SET_SPEED; in fd_pm_raise_power()
6249 (void) fdreset(fdc); in fd_pm_raise_power()
6251 unit = fdc->c_un->un_unit_no; in fd_pm_raise_power()
6254 if (fdrecalseek(fdc, unit, -1, 0) != 0) { in fd_pm_raise_power()
6257 fdretcsb(fdc); in fd_pm_raise_power()
6258 mutex_exit(&fdc->c_lolock); in fd_pm_raise_power()
6263 fdselect(fdc, unit, 0); in fd_pm_raise_power()
6265 fdretcsb(fdc); in fd_pm_raise_power()
6266 mutex_exit(&fdc->c_lolock); in fd_pm_raise_power()
6293 set_data_count_register(struct fdctlr *fdc, uint32_t count) in set_data_count_register() argument
6295 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_data_count_register()
6297 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_data_count_register()
6298 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dbcr, count); in set_data_count_register()
6299 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_data_count_register()
6302 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_data_count_register()
6303 switch (fdc->sb_dma_channel) { in set_data_count_register()
6305 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6310 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6315 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6320 ddi_put16(fdc->c_handlep_dma, in set_data_count_register()
6327 fdc->sb_dma_channel)); in set_data_count_register()
6339 get_data_count_register(struct fdctlr *fdc) in get_data_count_register() argument
6342 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in get_data_count_register()
6344 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in get_data_count_register()
6345 retval = ddi_get32(fdc->c_handlep_dma, &dma_reg->fdc_dbcr); in get_data_count_register()
6346 } else if (fdc->c_fdtype & FDCTYPE_SB) { in get_data_count_register()
6348 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in get_data_count_register()
6349 switch (fdc->sb_dma_channel) { in get_data_count_register()
6351 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6355 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6359 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6363 retval = ddi_get16(fdc->c_handlep_dma, in get_data_count_register()
6369 fdc->sb_dma_channel)); in get_data_count_register()
6385 reset_dma_controller(struct fdctlr *fdc) in reset_dma_controller() argument
6387 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in reset_dma_controller()
6389 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in reset_dma_controller()
6390 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, DCSR_RESET); in reset_dma_controller()
6391 while (get_dma_control_register(fdc) & DCSR_CYC_PEND) in reset_dma_controller()
6393 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, 0); in reset_dma_controller()
6394 } else if (fdc->c_fdtype & FDCTYPE_SB) { in reset_dma_controller()
6396 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in reset_dma_controller()
6397 ddi_put8(fdc->c_handlep_dma, &dma_reg->sb_dma_regs[DMAC1_MASK], in reset_dma_controller()
6398 (fdc->sb_dma_channel & 0x3)); in reset_dma_controller()
6409 get_dma_control_register(struct fdctlr *fdc) in get_dma_control_register() argument
6412 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in get_dma_control_register()
6414 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in get_dma_control_register()
6415 retval = ddi_get32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr); in get_dma_control_register()
6427 set_data_address_register(struct fdctlr *fdc, uint32_t address) in set_data_address_register() argument
6429 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_data_address_register()
6431 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_data_address_register()
6432 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dacr, address); in set_data_address_register()
6433 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_data_address_register()
6435 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_data_address_register()
6436 switch (fdc->sb_dma_channel) { in set_data_address_register()
6438 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6441 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6444 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6449 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6452 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6455 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6460 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6463 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6466 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6471 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6474 ddi_put8(fdc->c_handlep_dma, in set_data_address_register()
6477 ddi_put16(fdc->c_handlep_dma, in set_data_address_register()
6484 fdc->sb_dma_channel)); in set_data_address_register()
6497 set_dma_mode(struct fdctlr *fdc, int val) in set_dma_mode() argument
6499 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_dma_mode()
6501 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_dma_mode()
6503 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, in set_dma_mode()
6506 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, in set_dma_mode()
6509 } else if (fdc->c_fdtype & FDCTYPE_SB) { in set_dma_mode()
6512 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in set_dma_mode()
6515 mode_reg_val = fdc->sb_dma_channel | DMAMODE_READ in set_dma_mode()
6518 mode_reg_val = fdc->sb_dma_channel | DMAMODE_WRITE in set_dma_mode()
6521 ddi_put8(fdc->c_handlep_dma, &dma_reg->sb_dma_regs[DMAC1_MODE], in set_dma_mode()
6523 chn_mask = 1 << (fdc->sb_dma_channel & 0x3); in set_dma_mode()
6524 ddi_put8(fdc->c_handlep_dma, in set_dma_mode()
6526 fdc->sb_dma_lock = 1; in set_dma_mode()
6537 set_dma_control_register(struct fdctlr *fdc, uint32_t val) in set_dma_control_register() argument
6539 if (fdc->c_fdtype & FDCTYPE_CHEERIO) { in set_dma_control_register()
6541 dma_reg = (struct cheerio_dma_reg *)fdc->c_dma_regs; in set_dma_control_register()
6542 ddi_put32(fdc->c_handlep_dma, &dma_reg->fdc_dcsr, val); in set_dma_control_register()
6547 release_sb_dma(struct fdctlr *fdc) in release_sb_dma() argument
6550 dma_reg = (struct sb_dma_reg *)fdc->c_dma_regs; in release_sb_dma()
6552 ddi_put8(fdc->c_handlep_dma, in release_sb_dma()
6554 fdc->sb_dma_lock = 0; in release_sb_dma()
6558 quiesce_fd_interrupt(struct fdctlr *fdc) in quiesce_fd_interrupt() argument
6570 if (fdc->c_fdtype & FDCTYPE_SB) { in quiesce_fd_interrupt()
6571 ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), in quiesce_fd_interrupt()
6574 ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), in quiesce_fd_interrupt()
6577 Set_Fifo(fdc, 0xE6); in quiesce_fd_interrupt()