Home | History | Annotate | Download | only in vme

Lines Matching defs:xd

1 /*	$NetBSD: xd.c,v 1.100 2025/09/06 21:20:20 andvar Exp $	*/
48 __KERNEL_RCSID(0, "$NetBSD: xd.c,v 1.100 2025/09/06 21:20:20 andvar Exp $");
280 CFATTACH_DECL_NEW(xd, sizeof(struct xd_softc),
351 xdgetdisklabel(struct xd_softc *xd, void *b)
362 xd->sc_dk.dk_label->d_secsize = XDFM_BPS;
364 err = readdisklabel(MAKEDISKDEV(0, device_unit(xd->sc_dev), RAW_PART),
366 xd->sc_dk.dk_label, xd->sc_dk.dk_cpulabel);
368 aprint_error_dev(xd->sc_dev, "%s\n", err);
374 sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel->cd_block;
376 xd->pcyl = sdl->sl_pcylinders;
381 device_xname(xd->sc_dev));
382 xd->pcyl = xd->sc_dk.dk_label->d_ncylinders +
383 xd->sc_dk.dk_label->d_acylinders;
385 device_xname(xd->sc_dev), xd->pcyl);
388 xd->ncyl = xd->sc_dk.dk_label->d_ncylinders;
389 xd->acyl = xd->sc_dk.dk_label->d_acylinders;
390 xd->nhead = xd->sc_dk.dk_label->d_ntracks;
391 xd->nsect = xd->sc_dk.dk_label->d_nsectors;
392 xd->sectpercyl = xd->nhead * xd->nsect;
393 xd->sc_dk.dk_label->d_secsize = XDFM_BPS; /* not handled by
711 struct xd_softc *xd = device_private(self);
723 xd->sc_dev = self;
729 memset(&xd->sc_dk, 0, sizeof(xd->sc_dk));
734 xd->state = XD_DRIVE_UNKNOWN; /* to start */
735 xd->flags = 0;
736 xd->parent = xdc;
738 xd->xd_drive = xa->driveno;
740 xdc->sc_drives[xa->driveno] = xd;
747 while (xd->state == XD_DRIVE_ATTACHING) {
748 if (tsleep(&xd->state, PRIBIO, "xdattach", 0)) {
754 device_xname(xd->sc_dev), device_xname(xd->parent->sc_dev));
758 xd->state = XD_DRIVE_ATTACHING;
774 rqno = xdc_cmd(xdc, XDCMD_RST, 0, xd->xd_drive, 0, 0, 0, fmode);
788 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_FMT, xd->xd_drive, 0, 0, 0, fmode);
791 aprint_error_dev(xd->sc_dev, "write format parameters failed: %s\n",
797 rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
804 aprint_error_dev(xd->sc_dev, "read drive parameters failed: %s\n",
813 xd->pcyl = xd->ncyl = 1;
814 xd->acyl = 0;
815 xd->nhead = 1;
816 xd->nsect = 1;
817 xd->sectpercyl = 1;
819 xd->dkb.bt_bad[lcv].bt_cyl = xd->dkb.bt_bad[lcv].bt_trksec = 0xffff;
820 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
823 aprint_error_dev(xd->sc_dev, "write drive parameters failed: %s\n",
829 rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive, 0, 1, dmaddr, fmode);
832 aprint_error_dev(xd->sc_dev, "reading disk label failed: %s\n",
838 xd->hw_spt = spt;
840 disk_init(&xd->sc_dk, device_xname(xd->sc_dev), &xddkdriver);
841 disk_attach(&xd->sc_dk);
843 if (xdgetdisklabel(xd, buf) != XD_ERR_AOK)
847 printf("%s: <%s>, pcyl %d, hw_spt %d\n", device_xname(xd->sc_dev),
848 buf, xd->pcyl, spt);
849 mb = xd->ncyl * (xd->nhead * xd->nsect) / (1048576 / XDFM_BPS);
851 device_xname(xd->sc_dev), mb, xd->ncyl, xd->nhead, xd->nsect,
856 rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
859 aprint_error_dev(xd->sc_dev, "write real drive parameters failed: %s\n",
870 blk = (xd->ncyl + xd->acyl - 1) * (xd->nhead * xd->nsect) + /* last cyl */
871 (xd->nhead - 1) * xd->nsect; /* last head */
872 rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive, blk, 1, dmaddr, fmode);
875 aprint_error_dev(xd->sc_dev, "reading bad144 failed: %s\n",
887 if (dkb->bt_bad[lcv].bt_cyl >= xd->ncyl)
889 if ((dkb->bt_bad[lcv].bt_trksec >> 8) >= xd->nhead)
891 if ((dkb->bt_bad[lcv].bt_trksec & 0xff) >= xd->nsect)
895 aprint_error_dev(xd->sc_dev, "warning: invalid bad144 sector!\n");
897 memcpy(&xd->dkb, buf, XDFM_BPS);
906 xd->state = newstate;
908 wakeup(&xd->state);
927 struct xd_softc *xd = device_lookup_private(&xd_cd, DISKUNIT(dev));
934 xd->sc_dk.dk_copenmask &= ~(1 << part);
937 xd->sc_dk.dk_bopenmask &= ~(1 << part);
940 xd->sc_dk.dk_openmask = xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
952 struct xd_softc *xd;
957 xd = device_lookup_private(&xd_cd, unit);
958 if (!xd)
961 printf("%s%c: crash dump not supported (yet)\n", device_xname(xd->sc_dev),
1017 * xdioctl: ioctls on XD drives. based on ioctl's of other netbsd disks.
1023 struct xd_softc *xd;
1033 if ((xd = device_lookup_private(&xd_cd, unit)) == NULL)
1036 error = disk_ioctl(&xd->sc_dk, dev, command, addr, flag, l);
1047 memcpy(&xd->dkb, addr, sizeof(xd->dkb));
1064 error = setdisklabel(xd->sc_dk.dk_label,
1065 lp, /* xd->sc_dk.dk_openmask : */ 0,
1066 xd->sc_dk.dk_cpulabel);
1068 if (xd->state == XD_DRIVE_NOLABEL)
1069 xd->state = XD_DRIVE_ONLINE;
1077 xd->flags |= XD_WLABEL;
1079 xd->flags &= ~XD_WLABEL;
1095 error = setdisklabel(xd->sc_dk.dk_label,
1096 lp, /* xd->sc_dk.dk_openmask : */ 0,
1097 xd->sc_dk.dk_cpulabel);
1099 if (xd->state == XD_DRIVE_NOLABEL)
1100 xd->state = XD_DRIVE_ONLINE;
1103 xd->sc_dk.dk_openmask |= (1 << 0);
1106 xdstrategy, xd->sc_dk.dk_label,
1107 xd->sc_dk.dk_cpulabel);
1108 xd->sc_dk.dk_openmask =
1109 xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
1121 return (xdc_ioctlcmd(xd, dev, xio));
1136 struct xd_softc *xd;
1142 if ((xd = device_lookup_private(&xd_cd, unit)) == NULL)
1148 if (xd->state == XD_DRIVE_UNKNOWN) {
1149 xa.driveno = xd->xd_drive;
1152 xdattach(xd->parent->sc_dev, xd->sc_dev, &xa);
1153 if (xd->state == XD_DRIVE_UNKNOWN) {
1160 (part >= xd->sc_dk.dk_label->d_npartitions ||
1161 xd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
1168 xd->sc_dk.dk_copenmask |= (1 << part);
1171 xd->sc_dk.dk_bopenmask |= (1 << part);
1174 xd->sc_dk.dk_openmask = xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
1226 * xdstrategy: buffering system interface to xd.
1232 struct xd_softc *xd;
1241 if (!(xd = device_lookup_private(&xd_cd, unit)) ||
1243 (bp->b_bcount % xd->sc_dk.dk_label->d_secsize) != 0) {
1249 if (xd->state == XD_DRIVE_UNKNOWN) {
1250 xa.driveno = xd->xd_drive;
1253 xdattach(xd->parent->sc_dev, xd->sc_dev, &xa);
1254 if (xd->state == XD_DRIVE_UNKNOWN) {
1259 if (xd->state != XD_DRIVE_ONLINE && DISKPART(bp->b_dev) != RAW_PART) {
1274 if (bounds_check_with_label(&xd->sc_dk, bp,
1275 (xd->flags & XD_WLABEL) != 0) <= 0)
1289 parent = xd->parent;
1305 if (xdc_startbuf(parent, xd, bp) != XD_ERR_AOK) {
1366 xdc_rqinit(struct xd_iorq *rq, struct xdc_softc *xdc, struct xd_softc *xd, int md, u_long blk, int cnt, void *db, struct buf *bp)
1369 rq->xd = xd;
1393 if (iorq->xd)
1394 iopb->unit = iorq->xd->xd_drive;
1427 drv->maxsect = iorq->xd->nsect - 1;
1432 drv->maxcyl = iorq->xd->pcyl - 1;
1433 drv->maxhead = iorq->xd->nhead - 1;
1464 if (iorq->xd == NULL || block == 0) {
1467 iopb->sectno = block % iorq->xd->nsect;
1468 block = block / iorq->xd->nsect;
1469 iopb->headno = block % iorq->xd->nhead;
1470 block = block / iorq->xd->nhead;
1887 disk_unbusy(&xdcsc->reqs[lcv].xd->sc_dk,
2063 iorq->xd->sectpercyl;
2065 (iorq->blockno / iorq->xd->nhead) %
2066 iorq->xd->nhead;
2092 disk_unbusy(&iorq->xd->sc_dk,
2129 printf("%s", (iorq->xd) ? device_xname(iorq->xd->sc_dev)
2169 xdc_reset(xdcsc, 1, XD_RSET_NONE, errnum, iorq->xd);
2181 if ((i = isbad(&iorq->xd->dkb, iorq->blockno / iorq->xd->sectpercyl,
2182 (iorq->blockno / iorq->xd->nsect) % iorq->xd->nhead,
2183 iorq->blockno % iorq->xd->nsect)) != -1) {
2188 iopb->cylno = (iorq->xd->ncyl + iorq->xd->acyl) - 2;
2190 i = iorq->xd->sectpercyl - 1 - i; /* follow bad144
2192 iopb->headno = i / iorq->xd->nhead;
2193 iopb->sectno = i % iorq->xd->nhead;
2224 * xdc_tick: make sure xd is still alive and ticking (err, kicking).
2319 xdc_ioctlcmd(struct xd_softc *xd, dev_t dev, struct xd_iocmd *xio)
2358 xio->sectcnt = xd->hw_spt; /* we already know the answer */
2368 if (xio->sectcnt != xd->hw_spt ||
2369 (xio->block % xd->nsect) != 0 ||
2370 xio->dlen != XD_IOCMD_HSZ * xd->hw_spt ||
2380 (xio->block % xd->nsect) != 0 || xio->dptr)
2390 (xio->block % xd->nsect) != 0 || xio->dptr == NULL)
2406 xdcsc = xd->parent;
2433 rqno = xdc_cmd(xdcsc, xio->cmd, xio->subfn, xd->xd_drive, xio->block,