Lines Matching refs:un

83 static void dcd_free_softstate(struct dcd_disk *un, dev_info_t *devi);
85 static int dcd_validate_geometry(struct dcd_disk *un);
86 static ddi_devid_t dcd_get_devid(struct dcd_disk *un);
87 static ddi_devid_t dcd_create_devid(struct dcd_disk *un);
88 static int dcd_make_devid_from_serial(struct dcd_disk *un);
90 static int dcd_read_deviceid(struct dcd_disk *un);
91 static int dcd_write_deviceid(struct dcd_disk *un);
94 static void dcd_flush_cache(struct dcd_disk *un);
106 static void dcdstart(struct dcd_disk *un);
107 static void dcddone_and_mutex_exit(struct dcd_disk *un, struct buf *bp);
108 static void make_dcd_cmd(struct dcd_disk *un, struct buf *bp, int (*f)());
115 struct dcd_disk *un);
117 static int dcd_handle_incomplete(struct dcd_disk *un, struct buf *bp);
118 static void dcd_offline(struct dcd_disk *un, int bechatty);
119 static int dcd_ready_and_valid(dev_t dev, struct dcd_disk *un);
120 static void dcd_reset_disk(struct dcd_disk *un, struct dcd_pkt *pkt);
149 static int dcd_check_error(struct dcd_disk *un, struct buf *bp);
252 #define IOSP KSTAT_IO_PTR(un->un_stats)
253 #define IO_PARTITION_STATS un->un_pstats[DCDPART(bp->b_edev)]
256 #define DCD_DO_KSTATS(un, kstat_function, bp) \
258 if (bp != un->un_sbufp) { \
259 if (un->un_stats) { \
267 #define DCD_DO_ERRSTATS(un, x) \
268 if (un->un_errstats) { \
270 dtp = (struct dcd_errstats *)un->un_errstats->ks_data; \
275 struct dcd_disk *un; \
281 if ((un = ddi_get_soft_state(dcd_state, instance)) == NULL) \
475 struct dcd_disk *un;
493 if (!(un = ddi_get_soft_state(dcd_state, instance)))
496 Restore_state(un);
501 un->un_last_state = un->un_save_state;
502 un->un_throttle = 2;
503 cv_broadcast(&un->un_suspend_cv);
523 dp = &un->un_utab;
525 dcdstart(un);
539 if (!(un = (struct dcd_disk *)
543 devp->dcd_private = (ataopaque_t)un;
584 cmlb_alloc_handle(&un->un_dklbhandle);
593 un->un_dklbhandle,
595 cmlb_free_handle(&un->un_dklbhandle);
596 dcd_free_softstate(un, devi);
601 (void) dcd_validate_geometry(un);
604 if (dcd_get_devid(un) == NULL) {
606 (void) dcd_create_devid(un);
614 dcd_free_softstate(struct dcd_disk *un, dev_info_t *devi)
621 if (un) {
622 sema_destroy(&un->un_semoclose);
623 cv_destroy(&un->un_sbuf_cv);
624 cv_destroy(&un->un_state_cv);
625 cv_destroy(&un->un_disk_busy_cv);
626 cv_destroy(&un->un_suspend_cv);
631 if (un->un_sbufp)
632 freerbuf(un->un_sbufp);
633 if (un->un_dp) {
634 kmem_free((caddr_t)un->un_dp, sizeof (*un->un_dp));
640 if (un->un_devid) {
641 ddi_devid_free(un->un_devid);
642 un->un_devid = NULL;
649 if (un->un_stats) {
650 kstat_delete(un->un_stats);
671 struct dcd_disk *un;
675 if (!(un = ddi_get_soft_state(dcd_state, instance)))
684 if (un->un_state == DCD_STATE_SUSPENDED) {
688 un->un_throttle = 0;
692 un->un_save_state = un->un_last_state;
694 New_state(un, DCD_STATE_SUSPENDED);
708 while (un->un_ncmds) {
709 if (cv_timedwait(&un->un_disk_busy_cv,
718 Restore_state(un);
739 struct dcd_disk *un;
744 if (!(un = ddi_get_soft_state(dcd_state, instance)))
747 dcd_flush_cache(un);
757 struct dcd_disk *un;
768 un = (struct dcd_disk *)devp->dcd_private;
780 if (un->un_ncmds) {
788 cmlb_detach(un->un_dklbhandle, 0);
789 cmlb_free_handle(&un->un_dklbhandle);
804 dcd_free_softstate(un, devi);
813 struct dcd_disk *un;
820 if (!(un = ddi_get_soft_state(dcd_state, instance)) ||
832 if ((un->un_ncmds) && (level != DCD_DEVICE_ACTIVE)) {
837 if ((un->un_state == DCD_STATE_OFFLINE) ||
838 (un->un_state == DCD_STATE_FATAL)) {
848 un->un_power_level = DCD_DEVICE_ACTIVE;
849 if (un->un_state == DCD_STATE_PM_SUSPENDED)
850 Restore_state(un);
883 if (un->un_state != DCD_STATE_PM_SUSPENDED)
884 New_state(un, DCD_STATE_PM_SUSPENDED);
885 un->un_power_level = level;
896 struct dcd_disk *un = (struct dcd_disk *)0;
941 un = ddi_get_soft_state(dcd_state, instance);
943 un->un_sbufp = getrbuf(km_flags);
944 if (un->un_sbufp == (struct buf *)NULL) {
950 un->un_dcd = devp;
951 un->un_power_level = -1;
952 un->un_tgattribute.media_is_writable = 1;
954 sema_init(&un->un_semoclose, 1, NULL, SEMA_DRIVER, NULL);
955 cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL);
956 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL);
958 cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL);
959 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL);
961 if (un->un_dp == 0) {
966 un->un_dp = (struct dcd_drivetype *)
968 if (!un->un_dp) {
974 un->un_dp->ctype = CTYPE_DISK;
980 un->un_dp->name = "CCS";
981 un->un_dp->options = 0;
987 un->un_secsize = DEV_BSIZE;
995 un->un_diskcapacity = capacity;
996 un->un_lbasize = DEV_BSIZE;
1025 un->un_dp->options |= DMA_SUPPORTTED;
1026 un->un_dp->dma_mode = (options >> 3) & 0x03;
1028 "mode %x\n", un->un_dp->dma_mode);
1030 un->un_dp->options &= ~DMA_SUPPORTTED;
1031 un->un_dp->pio_mode = options & 0x7;
1033 un->un_dp->options |= BLOCK_MODE;
1035 "mode %x\n", un->un_dp->pio_mode);
1038 "options %x,", un->un_dp->options);
1041 un->un_throttle = 2;
1046 un->un_max_xfer_size = MAX_ATA_XFER_SIZE;
1056 un->un_write_cache_enabled = (devp->dcd_ident->dcd_majvers == 0xffff) ||
1068 dcd_free_softstate(un, devi);
1077 dcd_set_multiple(struct dcd_disk *un)
1097 cdb.size = un->un_lbasize * un->un_dp->block_factor;
1121 dcd_set_features(struct dcd_disk *un, uchar_t mode)
1143 cdb.size = un->un_lbasize * mode;
1173 dcd_validate_geometry(struct dcd_disk *un)
1184 if (un->un_lbasize < 0) {
1188 if (un->un_state == DCD_STATE_PM_SUSPENDED) {
1198 secsize = un->un_secsize;
1205 un->un_secdiv = secdiv;
1212 devp = un->un_dcd;
1217 rval = cmlb_validate(un->un_dklbhandle, 0, 0);
1231 secsize = un->un_lbasize;
1234 un->un_lbadiv = secdiv;
1240 secsize = un->un_lbasize >> DEV_BSHIFT;
1243 un->un_blknoshift = secdiv;
1279 sema_p(&un->un_semoclose);
1283 if ((un->un_state & DCD_STATE_FATAL) == DCD_STATE_FATAL) {
1288 while (un->un_state == DCD_STATE_SUSPENDED) {
1289 cv_wait(&un->un_suspend_cv, DCD_MUTEX);
1292 if ((un->un_state == DCD_STATE_PM_SUSPENDED) && (!nodelay)) {
1307 un->un_cmd_flags = 0;
1309 un->un_cmd_stat_size = 2;
1311 DAD_DEBUG(DCD_DEVINFO, dcd_label, DCD_DEBUG, "dcdopen un=0x%p\n",
1312 (void *)un);
1318 un->un_exclopen, flag, un->un_ocmap.regopen[otyp]);
1321 un->un_exclopen, partmask);
1323 if (un->un_exclopen & (partmask)) {
1333 if (un->un_ocmap.lyropen[part]) {
1337 if (un->un_ocmap.regopen[i] & (partmask)) {
1345 sema_v(&un->un_semoclose);
1356 if ((rval = dcd_ready_and_valid(dev, un)) != 0) {
1364 if (rval || cmlb_partinfo(un->un_dklbhandle,
1375 un->un_ocmap.lyropen[part]++;
1377 un->un_ocmap.regopen[otyp] |= partmask;
1384 un->un_exclopen |= (partmask);
1399 if (un->un_stats == (kstat_t *)0) {
1400 un->un_stats = kstat_create("dad", instance,
1403 if (un->un_stats) {
1404 un->un_stats->ks_lock = DCD_MUTEX;
1405 kstat_install(un->un_stats);
1414 if ((un->un_pstats[i] == (kstat_t *)0) &&
1415 (cmlb_partinfo(un->un_dklbhandle,
1420 un->un_pstats[i] = kstat_create("dad",
1427 if (un->un_pstats[i]) {
1428 un->un_pstats[i]->ks_lock =
1430 kstat_install(un->un_pstats[i]);
1438 (void) dcd_create_errstats(un, instance);
1444 sema_v(&un->un_semoclose);
1450 sema_v(&un->un_semoclose);
1459 dcd_ready_and_valid(dev_t dev, struct dcd_disk *un)
1468 if (un->un_ncmds == 0) {
1475 if (un->un_state == DCD_STATE_NORMAL) {
1478 dcd_offline(un, 1);
1483 if (un->un_format_in_progress == 0) {
1484 g_error = dcd_validate_geometry(un);
1501 un->un_mediastate = DKIO_INSERTED;
1502 cv_broadcast(&un->un_state_cv);
1527 sema_p(&un->un_semoclose);
1531 if (un->un_exclopen & (1<<part)) {
1532 un->un_exclopen &= ~(1<<part);
1536 un->un_ocmap.lyropen[part] -= 1;
1538 un->un_ocmap.regopen[otyp] &= ~(1<<part);
1541 cp = &un->un_ocmap.chkd[0];
1542 while (cp < &un->un_ocmap.chkd[OCSIZE]) {
1549 if (cp == &un->un_ocmap.chkd[OCSIZE]) {
1551 if (un->un_state == DCD_STATE_OFFLINE) {
1552 dcd_offline(un, 1);
1556 (void) cmlb_close(un->un_dklbhandle, 0);
1559 if (un->un_stats) {
1560 kstat_delete(un->un_stats);
1561 un->un_stats = 0;
1564 if (un->un_pstats[i]) {
1565 kstat_delete(un->un_pstats[i]);
1566 un->un_pstats[i] = (kstat_t *)0;
1570 if (un->un_errstats) {
1571 kstat_delete(un->un_errstats);
1572 un->un_errstats = (kstat_t *)0;
1582 sema_v(&un->un_semoclose);
1587 dcd_offline(struct dcd_disk *un, int bechatty)
1593 cmlb_invalidate(un->un_dklbhandle, 0);
1606 struct dcd_disk *un;
1614 if ((un = ddi_get_soft_state(dcd_state, instance)) == NULL)
1639 struct dcd_disk *un;
1641 if ((un = ddi_get_soft_state(dcd_state, ddi_get_instance(dip))) == NULL)
1645 return (cmlb_prop_op(un->un_dklbhandle,
1664 struct dcd_disk *un;
1668 un = ddi_get_soft_state(dcd_state, instance);
1670 if (bp->b_bcount > un->un_max_xfer_size)
1671 bp->b_bcount = un->un_max_xfer_size;
1684 secmask = un->un_secsize - 1;
1689 un->un_secsize);
1693 "transfer length not modulo %d\n", un->un_secsize);
1709 secmask = un->un_secsize - 1;
1714 un->un_secsize);
1718 "transfer length not modulo %d\n", un->un_secsize);
1733 secmask = un->un_secsize - 1;
1738 un->un_secsize);
1742 "transfer length not modulo %d\n", un->un_secsize);
1759 secmask = un->un_secsize - 1;
1764 un->un_secsize);
1768 "transfer length not modulo %d\n", un->un_secsize);
1780 struct dcd_disk *un;
1788 if ((un = ddi_get_soft_state(dcd_state,
1790 un->un_state == DCD_STATE_DUMPING ||
1791 ((un->un_state & DCD_STATE_FATAL) == DCD_STATE_FATAL)) {
1792 SET_BP_ERROR(bp, ((un) ? ENXIO : EIO));
1801 * (un->un_max_xfer_size) supported by the target driver fail
1805 * un->un_max_xfer_size size because the caller is expected to
1813 if (bp->b_bcount > un->un_max_xfer_size) {
1819 "dcdstrategy_start: bp 0x%p un 0x%p", bp, un);
1826 while (un->un_state == DCD_STATE_SUSPENDED) {
1827 cv_wait(&un->un_suspend_cv, DCD_MUTEX);
1830 if (un->un_state == DCD_STATE_PM_SUSPENDED) {
1856 if (bp != un->un_sbufp) {
1857 validated: if (cmlb_partinfo(un->un_dklbhandle,
1892 } else if (bp->b_bcount & (un->un_secsize-1)) {
1896 * ... if (bp->b_bcount & (un->un_lbasize-1))
1933 if (dcd_ready_and_valid(bp->b_edev, un) == 0) {
1974 DCD_DO_KSTATS(un, kstat_waitq_enter, bp);
1976 dp = &un->un_utab;
1981 } else if ((un->un_state == DCD_STATE_SUSPENDED) &&
1982 bp == un->un_sbufp) {
1987 "dcdstrategy_disksort_start: dp 0x%p bp 0x%p un 0x%p",
1988 dp, bp, un);
1996 un->un_ncmds, un->un_throttle, (void *)dp->b_forw);
1997 ASSERT(un->un_ncmds >= 0);
1998 ASSERT(un->un_throttle >= 0);
1999 if ((un->un_ncmds < un->un_throttle) && (dp->b_forw == NULL)) {
2000 dcdstart(un);
2013 make_dcd_cmd(un, cmd_bp, NULL_FUNC);
2025 if ((un->un_ncmds < un->un_throttle) &&
2027 dcdstart(un);
2041 * (un->un_ncmds < un->un_throttle)
2046 dcdstart(struct dcd_disk *un)
2051 uchar_t state = un->un_last_state;
2053 TRACE_1(TR_FAC_DADA, TR_DCDSTART_START, "dcdstart_start: un 0x%p", un);
2058 dp = &un->un_utab;
2076 un->un_ncmds++;
2084 DCD_DO_KSTATS(un, kstat_waitq_to_runq, bp);
2089 make_dcd_cmd(un, bp, dcdrunout);
2092 DCD_DO_KSTATS(un, kstat_runq_back_to_waitq, bp);
2096 New_state(un, DCD_STATE_RWAIT);
2097 un->un_ncmds--;
2104 DCD_DO_KSTATS(un, kstat_runq_exit, bp);
2106 un->un_ncmds--;
2115 un->un_state = un->un_last_state;
2116 un->un_last_state = state;
2122 if (un->un_state == DCD_STATE_SUSPENDED) {
2123 cv_broadcast(&un->un_disk_busy_cv);
2126 if ((un->un_ncmds < un->un_throttle) &&
2155 un->un_ncmds--;
2159 DCD_DO_ERRSTATS(un, dcd_transerrs);
2160 DCD_DO_KSTATS(un, kstat_runq_back_to_waitq, bp);
2161 dcd_handle_tran_busy(bp, dp, un);
2162 if (un->un_ncmds > 0) {
2166 DCD_DO_KSTATS(un, kstat_runq_exit, bp);
2174 if (bp != un->un_sbufp) {
2180 if (un->un_state == DCD_STATE_SUSPENDED) {
2181 cv_broadcast(&un->un_disk_busy_cv);
2183 if ((un->un_ncmds < un->un_throttle) &&
2203 make_dcd_cmd(un, cmd_bp, NULL_FUNC);
2214 if ((un->un_ncmds < un->un_throttle) &&
2230 make_dcd_cmd(struct dcd_disk *un, struct buf *bp, int (*func)())
2238 "make_dcd_cmd_start: un 0x%p bp 0x%p un 0x%p", un, bp, un);
2241 flags = un->un_cmd_flags;
2243 if (bp != un->un_sbufp) {
2252 if (cmlb_partinfo(un->un_dklbhandle,
2277 secnt = (bp->b_bcount + (un->un_secsize - 1)) >> un->un_secdiv;
2283 resid = (secnt - count) << un->un_secdiv;
2303 if (un->un_lbasize != un->un_secsize) {
2304 blkno >>= un->un_blknoshift;
2305 count >>= un->un_blknoshift;
2313 un->un_cmd_stat_size, PP_LEN, PKT_CONSISTENT,
2314 func, (caddr_t)un);
2326 if ((un->un_dp->options & DMA_SUPPORTTED) ==
2330 if (un->un_dp->options & BLOCK_MODE)
2337 if ((un->un_dp->options & DMA_SUPPORTTED) ==
2341 if (un->un_dp->options & BLOCK_MODE)
2377 2, PP_LEN, PKT_CONSISTENT, func, (caddr_t)un);
2414 struct dcd_disk *un;
2420 un = ddi_get_soft_state(dcd_state, DCDUNIT(bp->b_edev));
2422 TRACE_1(TR_FAC_DADA, TR_DCDINTR_START, "dcdintr_start: un 0x%p", un);
2426 un->un_ncmds--;
2427 DCD_DO_KSTATS(un, kstat_runq_exit, bp);
2428 ASSERT(un->un_ncmds >= 0);
2439 if (un->un_state == DCD_STATE_OFFLINE) {
2440 un->un_state = un->un_last_state;
2451 DCD_DO_ERRSTATS(un, dcd_harderrs);
2482 action = dcd_handle_incomplete(un, bp);
2502 if ((un->un_last_pkt_reason != pkt->pkt_reason) &&
2505 un->un_last_pkt_reason = pkt->pkt_reason;
2520 un->un_flush_not_supported = 1;
2528 dcddone_and_mutex_exit(un, bp);
2535 if (un->un_ncmds >= un->un_throttle) {
2536 struct diskhd *dp = &un->un_utab;
2541 DCD_DO_KSTATS(un, kstat_waitq_enter, bp);
2547 un->un_ncmds++;
2550 DCD_DO_KSTATS(un, kstat_runq_enter, bp);
2553 struct diskhd *dp = &un->un_utab;
2556 un->un_ncmds--;
2558 DCD_DO_KSTATS(un, kstat_runq_back_to_waitq, bp);
2559 dcd_handle_tran_busy(bp, dp, un);
2563 DCD_DO_ERRSTATS(un, dcd_transerrs);
2564 DCD_DO_KSTATS(un, kstat_runq_exit, bp);
2571 dcddone_and_mutex_exit(un, bp);
2578 DCD_DO_KSTATS(un, kstat_waitq_enter, bp);
2592 dcddone_and_mutex_exit(struct dcd_disk *un, register struct buf *bp)
2596 TRACE_1(TR_FAC_DADA, TR_DCDONE_START, "dcddone_start: un 0x%p", un);
2598 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_dcd->dcd_mutex));
2600 dp = &un->un_utab;
2605 if (un->un_stats) {
2629 if (un->un_state == DCD_STATE_SUSPENDED) {
2630 cv_broadcast(&un->un_disk_busy_cv);
2631 } else if (dp->b_actf && (un->un_ncmds < un->un_throttle) &&
2632 (dp->b_forw == NULL && un->un_state != DCD_STATE_SUSPENDED)) {
2633 dcdstart(un);
2638 if (bp != un->un_sbufp) {
2643 ASSERT(un->un_sbuf_busy);
2661 dcd_reset_disk(struct dcd_disk *un, struct dcd_pkt *pkt)
2675 dcd_handle_incomplete(struct dcd_disk *un, struct buf *bp)
2682 int be_chatty = (un->un_state != DCD_STATE_SUSPENDED) &&
2683 (bp != un->un_sbufp || !(pkt->pkt_flags & FLAG_SILENT));
2697 action = dcd_check_error(un, bp);
2698 DCD_DO_ERRSTATS(un, dcd_transerrs);
2700 (void) dcd_reset_disk(un, pkt);
2718 DCD_DO_ERRSTATS(un, dcd_transerrs);
2721 (void) dcd_reset_disk(un, pkt);
2738 if (bp == un->un_sbufp && (pkt->pkt_flags & FLAG_DIAGNOSE)) {
2753 if (un->un_state != DCD_STATE_OFFLINE) {
2756 New_state(un, DCD_STATE_OFFLINE);
2766 New_state(un, DCD_STATE_FATAL);
2770 if (((pkt->pkt_reason != un->un_last_pkt_reason) &&
2789 dcd_check_error(struct dcd_disk *un, struct buf *bp)
2791 struct diskhd *dp = &un->un_utab;
2898 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un))
2900 if ((un->un_state & DCD_STATE_FATAL) == DCD_STATE_FATAL)
2903 if (cmlb_partinfo(un->un_dklbhandle, DCDPART(dev),
2912 if ((un->un_state == DCD_STATE_SUSPENDED) ||
2913 (un->un_state == DCD_STATE_PM_SUSPENDED)) {
2924 un->un_throttle = 0;
2926 if ((un->un_state != DCD_STATE_SUSPENDED) &&
2927 (un->un_state != DCD_STATE_DUMPING)) {
2929 New_state(un, DCD_STATE_DUMPING);
2998 if ((un->un_dp->options & DMA_SUPPORTTED) == DMA_SUPPORTTED) {
3001 if (un->un_dp->options & BLOCK_MODE)
3008 (int)nblk*un->un_secsize, DATA_WRITE, 0);
3024 (void) dcd_reset_disk(un, pkt);
3107 switch (un->un_dp->ctype) {
3128 info->dki_maxtransfer = un->un_max_xfer_size / DEV_BSIZE;
3152 media_info.dki_lbsize = un->un_lbasize;
3153 media_info.dki_capacity = un->un_diskcapacity;
3167 if (un->un_ncmds == 0) {
3175 err = cmlb_ioctl(un->un_dklbhandle, dev, cmd,
3189 err = cmlb_ioctl(un->un_dklbhandle, dev, cmd,
3234 if ((un->un_dp->options & DMA_SUPPORTTED) ==
3243 if ((un->un_dp->options & DMA_SUPPORTTED) ==
3410 if (un->un_flush_not_supported ||
3411 ! un->un_write_cache_enabled) {
3412 i = un->un_flush_not_supported ? ENOTSUP : 0;
3437 while (un->un_sbuf_busy) {
3438 cv_wait(&un->un_sbuf_cv, DCD_MUTEX);
3440 un->un_sbuf_busy = 1;
3441 bp = un->un_sbufp;
3446 2, PP_LEN, PKT_CONSISTENT, SLEEP_FUNC, (caddr_t)un);
3449 makecommand(pkt, un->un_cmd_flags | FLAG_SILENT,
3500 struct dcd_disk *un = ddi_get_soft_state(dcd_state,
3505 ASSERT(un != NULL);
3506 ASSERT(bp == un->un_sbufp);
3524 un->un_sbuf_busy = 0;
3525 cv_signal(&un->un_sbuf_cv);
3544 struct dcd_disk *un;
3551 un = (struct dcd_disk *)arg;
3552 dp = &un->un_utab;
3558 ASSERT(un != NULL);
3560 if ((un->un_ncmds < un->un_throttle) && (dp->b_forw == NULL)) {
3561 dcdstart(un);
3563 if (un->un_state == DCD_STATE_RWAIT) {
3575 * be called when un->un_sbufp is in use, and must not be called with
3669 while (un->un_sbuf_busy) {
3670 if (cv_wait_sig(&un->un_sbuf_cv, DCD_MUTEX) == 0) {
3678 un->un_sbuf_busy = 1;
3679 bp = un->un_sbufp;
3739 un->un_sbuf_busy = 0;
3740 cv_signal(&un->un_sbuf_cv);
3769 struct dcd_disk *un = (struct dcd_disk *)arg;
3776 bp = un->un_utab.b_forw;
3778 un->un_ncmds++;
3779 DCD_DO_KSTATS(un, kstat_waitq_to_runq, bp);
3792 DCD_DO_KSTATS(un, kstat_runq_back_to_waitq, bp);
3793 un->un_ncmds--;
3797 * if (un->un_throttle > 1) {
3798 * ASSERT(un->un_ncmds >= 0);
3799 * un->un_throttle = un->un_ncmds;
3802 un->un_reissued_timeid =
3803 timeout(dcdrestart, (caddr_t)un,
3808 DCD_DO_ERRSTATS(un, dcd_transerrs);
3814 DCD_DO_KSTATS(un, kstat_waitq_exit, bp);
3815 un->un_reissued_timeid = 0L;
3816 dcddone_and_mutex_exit(un, bp);
3821 un->un_reissued_timeid = 0L;
3833 struct dcd_disk *un = (struct dcd_disk *)arg;
3837 dp = &un->un_utab;
3842 if (dp->b_actf && (un->un_ncmds < un->un_throttle) &&
3844 dcdstart(un);
3863 dcd_handle_tran_busy(struct buf *bp, struct diskhd *dp, struct dcd_disk *un)
3875 if (!un->un_reissued_timeid) {
3876 un->un_reissued_timeid =
3877 timeout(dcdrestart, (caddr_t)un, DCD_BSY_TIMEOUT/500);
3882 dcd_write_deviceid(struct dcd_disk *un)
3895 if (cmlb_get_devid_block(un->un_dklbhandle, &blk, 0)) {
3902 dkdevid = kmem_zalloc(un->un_secsize, KM_SLEEP);
3909 bcopy(un->un_devid, &dkdevid->dkd_devid,
3910 ddi_devid_sizeof(un->un_devid));
3915 for (i = 0; i < ((un->un_secsize - sizeof (int))/sizeof (int)); i++)
3924 if ((un->un_dp->options & DMA_SUPPORTTED) == DMA_SUPPORTTED) {
3927 if (un->un_dp->options & BLOCK_MODE)
3932 cdb.size = un->un_secsize;
3940 ucmd.udcd_buflen = un->un_secsize;
3948 kmem_free(dkdevid, un->un_secsize);
3953 dcd_read_deviceid(struct dcd_disk *un)
3966 if (cmlb_get_devid_block(un->un_dklbhandle, &blk, 0)) {
3972 dkdevid = kmem_alloc(un->un_secsize, KM_SLEEP);
3977 if ((un->un_dp->options & DMA_SUPPORTTED) == DMA_SUPPORTTED) {
3980 if (un->un_dp->options & BLOCK_MODE)
3985 cdb.size = un->un_secsize;
3993 ucmd.udcd_buflen = un->un_secsize;
4002 kmem_free((caddr_t)dkdevid, un->un_secsize);
4010 kmem_free((caddr_t)dkdevid, un->un_secsize);
4017 for (i = 0; i < ((un->un_secsize - sizeof (int))/sizeof (int)); i++)
4023 kmem_free((caddr_t)dkdevid, un->un_secsize);
4029 kmem_free((caddr_t)dkdevid, un->un_secsize);
4035 un->un_devid = (ddi_devid_t)kmem_alloc(sz, KM_SLEEP);
4036 bcopy(&dkdevid->dkd_devid, un->un_devid, sz);
4037 kmem_free((caddr_t)dkdevid, un->un_secsize);
4053 dcd_get_devid(struct dcd_disk *un)
4058 if (un->un_devid != NULL)
4059 return (un->un_devid);
4062 rc = dcd_make_devid_from_serial(un);
4066 if (dcd_read_deviceid(un))
4070 (void) ddi_devid_register(DCD_DEVINFO, un->un_devid);
4071 return (un->un_devid);
4076 dcd_create_devid(struct dcd_disk *un)
4079 &un->un_devid) == DDI_FAILURE)
4082 if (dcd_write_deviceid(un)) {
4083 ddi_devid_free(un->un_devid);
4084 un->un_devid = NULL;
4088 (void) ddi_devid_register(DCD_DEVINFO, un->un_devid);
4089 return (un->un_devid);
4097 dcd_make_devid_from_serial(struct dcd_disk *un)
4108 model = un->un_dcd->dcd_ident->dcd_model;
4110 serno = un->un_dcd->dcd_ident->dcd_drvser;
4138 hwid, (ddi_devid_t *)&un->un_devid);
4270 dcd_create_errstats(struct dcd_disk *un, int instance)
4275 if (un->un_errstats == (kstat_t *)0) {
4277 un->un_errstats = kstat_create("daderror", instance, kstatname,
4282 if (un->un_errstats) {
4285 dtp = (struct dcd_errstats *)un->un_errstats->ks_data;
4311 un->un_errstats->ks_private = un;
4312 un->un_errstats->ks_update = nulldev;
4313 kstat_install(un->un_errstats);
4316 un->un_dcd->dcd_ident->dcd_model, 16);
4318 un->un_dcd->dcd_ident->dcd_drvser, 16);
4320 un->un_dcd->dcd_ident->dcd_fw, 8);
4322 (uint64_t)((uint64_t)un->un_diskcapacity *
4323 (uint64_t)un->un_lbasize);
4421 dcd_flush_cache(struct dcd_disk *un)
4477 struct dcd_disk *un;
4479 un = ddi_get_soft_state(dcd_state, ddi_get_instance(devi));
4480 if (un == NULL)
4511 if ((un->un_dp->options & DMA_SUPPORTTED) == DMA_SUPPORTTED) {
4519 if (un->un_dp->options & BLOCK_MODE)
4524 if (un->un_dp->options & BLOCK_MODE)
4669 struct dcd_disk *un;
4671 un = ddi_get_soft_state(dcd_state, ddi_get_instance(devi));
4673 if (un == NULL)
4686 if (un->un_diskcapacity <= 0) {
4693 *(diskaddr_t *)arg = un->un_diskcapacity;
4698 un->un_diskcapacity);
4704 *(tg_attribute_t *)arg = un->un_tgattribute;
4707 un->un_tgattribute.media_is_writable);