Lines Matching defs:xd
1 /* $NetBSD: xd.c,v 1.81 2025/09/06 21:20:20 andvar Exp $ */
33 * id: &Id: xd.c,v 1.9 1995/09/25 20:12:44 chuck Exp &
49 __KERNEL_RCSID(0, "$NetBSD: xd.c,v 1.81 2025/09/06 21:20:20 andvar Exp $");
91 * Print a complaint when no xd children were specified
97 #include "xd.h"
99 #error "xdc but no xd?"
269 CFATTACH_DECL_NEW(xd, sizeof(struct xd_softc),
339 xdgetdisklabel(struct xd_softc *xd, void *b)
348 xd->sc_dk.dk_label->d_secsize = XDFM_BPS;
350 err = readdisklabel(MAKEDISKDEV(0, device_unit(xd->sc_dev), RAW_PART),
351 xddummystrat, xd->sc_dk.dk_label, xd->sc_dk.dk_cpulabel);
353 printf("%s: %s\n", device_xname(xd->sc_dev), err);
358 sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel->cd_block;
360 xd->pcyl = sdl->sl_pcyl;
363 device_xname(xd->sc_dev));
364 xd->pcyl = xd->sc_dk.dk_label->d_ncylinders +
365 xd->sc_dk.dk_label->d_acylinders;
367 device_xname(xd->sc_dev), xd->pcyl);
370 xd->ncyl = xd->sc_dk.dk_label->d_ncylinders;
371 xd->acyl = xd->sc_dk.dk_label->d_acylinders;
372 xd->nhead = xd->sc_dk.dk_label->d_ntracks;
373 xd->nsect = xd->sc_dk.dk_label->d_nsectors;
374 xd->sectpercyl = xd->nhead * xd->nsect;
375 xd->sc_dk.dk_label->d_secsize = XDFM_BPS; /* not handled by
542 * xd* and xdc* devices, to simplify boot device identification.
564 struct xd_softc *xd = device_private(self);
568 xd->sc_dev = self;
575 memset(&xd->sc_dk, 0, sizeof(xd->sc_dk));
576 disk_init(&xd->sc_dk, device_xname(self), &xddkdriver);
578 xd->state = XD_DRIVE_UNKNOWN; /* to start */
579 xd->flags = 0;
580 xd->parent = xdc;
582 xd->xd_drive = xa->driveno;
583 xdc->sc_drives[xa->driveno] = xd;
586 xd_init(xd);
598 xd_init(struct xd_softc *xd)
606 xdc = xd->parent;
607 xd->state = XD_DRIVE_ATTACHING;
613 rqno = xdc_cmd(xdc, XDCMD_RST, 0, xd->xd_drive, 0, 0, 0, fullmode);
617 device_xname(xd->sc_dev), xd->xd_drive);
622 device_xname(xd->sc_dev), err, xdc_e2str(err));
626 device_xname(xd->sc_dev), xd->xd_drive);
630 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_FMT, xd->xd_drive,
635 device_xname(xd->sc_dev), xdc_e2str(err));
641 rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_DRV, xd->xd_drive,
650 device_xname(xd->sc_dev), xdc_e2str(err));
658 xd->pcyl = xd->ncyl = 1;
659 xd->acyl = 0;
660 xd->nhead = 1;
661 xd->nsect = 1;
662 xd->sectpercyl = 1;
664 xd->dkb.bt_bad[lcv].bt_cyl =
665 xd->dkb.bt_bad[lcv].bt_trksec = 0xffff;
666 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive,
671 device_xname(xd->sc_dev), xdc_e2str(err));
676 rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive,
681 device_xname(xd->sc_dev), xdc_e2str(err));
686 xd->hw_spt = spt;
688 disk_attach(&xd->sc_dk);
690 if (xdgetdisklabel(xd, dvmabuf) != XD_ERR_AOK)
695 device_xname(xd->sc_dev), (char *)dvmabuf, xd->pcyl, spt);
696 mb = xd->ncyl * (xd->nhead * xd->nsect) / (1048576 / XDFM_BPS);
698 device_xname(xd->sc_dev), mb,
699 xd->ncyl, xd->nhead, xd->nsect);
702 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive,
707 device_xname(xd->sc_dev), xdc_e2str(err));
716 blk = (xd->ncyl + xd->acyl - 1) * (xd->nhead * xd->nsect) + /* last cyl */
717 (xd->nhead - 1) * xd->nsect; /* last head */
718 rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive,
723 device_xname(xd->sc_dev), xdc_e2str(err));
734 if (dkb->bt_bad[lcv].bt_cyl >= xd->ncyl)
736 if ((dkb->bt_bad[lcv].bt_trksec >> 8) >= xd->nhead)
738 if ((dkb->bt_bad[lcv].bt_trksec & 0xff) >= xd->nsect)
743 device_xname(xd->sc_dev));
745 memcpy(&xd->dkb, dvmabuf, XDFM_BPS);
749 xd->state = newstate;
763 struct xd_softc *xd = device_lookup_private(&xd_cd, DISKUNIT(dev));
770 xd->sc_dk.dk_copenmask &= ~(1 << part);
773 xd->sc_dk.dk_bopenmask &= ~(1 << part);
776 xd->sc_dk.dk_openmask = xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
788 struct xd_softc *xd;
793 xd = device_lookup_private(&xd_cd, unit);
794 if (xd == NULL)
798 device_xname(xd->sc_dev), 'a' + part);
853 * xdioctl: ioctls on XD drives. based on ioctl's of other netbsd disks.
858 struct xd_softc *xd;
864 xd = device_lookup_private(&xd_cd, unit);
865 if (xd == NULL)
868 error = disk_ioctl(&xd->sc_dk, dev, cmd, addr, flag, l);
879 memcpy(&xd->dkb, addr, sizeof(xd->dkb));
886 error = setdisklabel(xd->sc_dk.dk_label,
887 (struct disklabel *)addr, /* xd->sc_dk.dk_openmask : */ 0,
888 xd->sc_dk.dk_cpulabel);
890 if (xd->state == XD_DRIVE_NOLABEL)
891 xd->state = XD_DRIVE_ONLINE;
899 xd->flags |= XD_WLABEL;
901 xd->flags &= ~XD_WLABEL;
907 error = setdisklabel(xd->sc_dk.dk_label,
908 (struct disklabel *)addr, /* xd->sc_dk.dk_openmask : */ 0,
909 xd->sc_dk.dk_cpulabel);
911 if (xd->state == XD_DRIVE_NOLABEL)
912 xd->state = XD_DRIVE_ONLINE;
915 xd->sc_dk.dk_openmask |= (1 << 0);
918 xdstrategy, xd->sc_dk.dk_label,
919 xd->sc_dk.dk_cpulabel);
920 xd->sc_dk.dk_openmask =
921 xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
933 return xdc_ioctlcmd(xd, dev, xio);
948 struct xd_softc *xd;
952 xd = device_lookup_private(&xd_cd, unit);
953 if (xd == NULL)
962 while (xd->state == XD_DRIVE_ATTACHING) {
963 if (tsleep(&xd->state, PRIBIO, "xdopen", 0)) {
969 if (xd->state == XD_DRIVE_UNKNOWN) {
970 xd_init(xd);
971 wakeup(&xd->state);
974 if (xd->state == XD_DRIVE_UNKNOWN) {
981 (part >= xd->sc_dk.dk_label->d_npartitions ||
982 xd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
990 xd->sc_dk.dk_copenmask |= (1 << part);
993 xd->sc_dk.dk_bopenmask |= (1 << part);
996 xd->sc_dk.dk_openmask = xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
1051 * xdstrategy: buffering system interface to xd.
1056 struct xd_softc *xd;
1064 xd = device_lookup_private(&xd_cd, unit);
1065 if (xd == NULL ||
1067 (bp->b_bcount % xd->sc_dk.dk_label->d_secsize) != 0) {
1073 if (xd->state == XD_DRIVE_UNKNOWN) {
1078 if (xd->state != XD_DRIVE_ONLINE && DISKPART(bp->b_dev) != RAW_PART) {
1093 if (bounds_check_with_label(&xd->sc_dk, bp,
1094 (xd->flags & XD_WLABEL) != 0) <= 0)
1108 parent = xd->parent;
1124 if (xdc_startbuf(parent, xd, bp) != XD_ERR_AOK) {
1181 xdc_rqinit(struct xd_iorq *rq, struct xdc_softc *xdc, struct xd_softc *xd,
1186 rq->xd = xd;
1210 if (iorq->xd)
1211 iopb->unit = iorq->xd->xd_drive;
1251 drv->maxsect = iorq->xd->nsect - 1;
1256 drv->maxcyl = iorq->xd->pcyl - 1;
1257 drv->maxhead = iorq->xd->nhead - 1;
1289 if (iorq->xd == NULL || block == 0) {
1292 xd->nsect;
1293 block = block / iorq->xd->nsect;
1294 iopb->headno = block % iorq->xd->nhead;
1295 block = block / iorq->xd->nhead;
1710 disk_unbusy(&iorq->xd->sc_dk,
1887 iorq->blockno / iorq->xd->sectpercyl;
1889 (iorq->blockno / iorq->xd->nhead) %
1890 iorq->xd->nhead;
1912 disk_unbusy(&iorq->xd->sc_dk,
1947 printf("%s", (iorq->xd) ?
1948 device_xname(iorq->xd->sc_dev) :
1985 xdc_reset(xdcsc, 1, XD_RSET_NONE, errno, iorq->xd);
1996 if ((i = isbad(&iorq->xd->dkb,
1997 iorq->blockno / iorq->xd->sectpercyl,
1998 (iorq->blockno / iorq->xd->nsect) % iorq->xd->nhead,
1999 iorq->blockno % iorq->xd->nsect)) != -1) {
2004 iopb->cylno = (iorq->xd->ncyl + iorq->xd->acyl) - 2;
2006 i = iorq->xd->sectpercyl - 1 - i; /* follow bad144
2008 iopb->headno = i / iorq->xd->nhead;
2009 iopb->sectno = i % iorq->xd->nhead;
2039 * xdc_tick: make sure xd is still alive and ticking (err, kicking).
2139 xdc_ioctlcmd(struct xd_softc *xd, dev_t dev, struct xd_iocmd *xio)
2175 xio->sectcnt = xd->hw_spt; /* we already know the answer */
2185 if (xio->sectcnt != xd->hw_spt ||
2186 (xio->block % xd->nsect) != 0 ||
2187 xio->dlen != XD_IOCMD_HSZ * xd->hw_spt ||
2197 (xio->block % xd->nsect) != 0 || xio->dptr)
2207 (xio->block % xd->nsect) != 0 || xio->dptr == NULL)
2238 xdcsc = xd->parent;
2240 rqno = xdc_cmd(xdcsc, xio->cmd, xio->subfn, xd->xd_drive, xio->block,