Lines Matching refs:xy

1 /*	$NetBSD: xy.c,v 1.91 2011/02/01 19:36:24 chuck Exp $	*/
48 __KERNEL_RCSID(0, "$NetBSD: xy.c,v 1.91 2011/02/01 19:36:24 chuck Exp $");
196 CFATTACH_DECL(xy, sizeof(struct xy_softc),
248 xygetdisklabel(struct xy_softc *xy, void *b)
259 xy->sc_dk.dk_label->d_secsize = XYFM_BPS;
261 err = readdisklabel(MAKEDISKDEV(0, device_unit(&xy->sc_dev), RAW_PART),
263 xy->sc_dk.dk_label, xy->sc_dk.dk_cpulabel);
265 printf("%s: %s\n", device_xname(&xy->sc_dev), err);
271 sdl = (struct sun_disklabel *)xy->sc_dk.dk_cpulabel->cd_block;
273 xy->pcyl = sdl->sl_pcylinders;
278 device_xname(&xy->sc_dev));
279 xy->pcyl = xy->sc_dk.dk_label->d_ncylinders +
280 xy->sc_dk.dk_label->d_acylinders;
282 device_xname(&xy->sc_dev), xy->pcyl);
285 xy->ncyl = xy->sc_dk.dk_label->d_ncylinders;
286 xy->acyl = xy->sc_dk.dk_label->d_acylinders;
287 xy->nhead = xy->sc_dk.dk_label->d_ntracks;
288 xy->nsect = xy->sc_dk.dk_label->d_nsectors;
289 xy->sectpercyl = xy->nhead * xy->nsect;
290 xy->sc_dk.dk_label->d_secsize = XYFM_BPS; /* not handled by
592 struct xy_softc *xy = device_private(self), *oxy;
607 memset(&xy->sc_dk, 0, sizeof(xy->sc_dk));
612 xy->state = XY_DRIVE_UNKNOWN; /* to start */
613 xy->flags = 0;
614 xy->parent = xyc;
618 bufq_alloc(&xy->xyq, "disksort", BUFQ_SORT_RAWBLOCK);
620 xy->xyrq = &xyc->reqs[xa->driveno];
623 xy->xy_drive = xa->driveno;
625 xyc->sc_drives[xa->driveno] = xy;
632 while (xy->state == XY_DRIVE_ATTACHING) {
633 if (tsleep(&xy->state, PRIBIO, "xyattach", 0)) {
639 device_xname(&xy->sc_dev), device_xname(&xy->parent->sc_dev));
643 xy->state = XY_DRIVE_ATTACHING;
658 error = xyc_cmd(xyc, XYCMD_RST, 0, xy->xy_drive, 0, 0, 0, fmode);
674 xy->pcyl = xy->ncyl = 1;
675 xy->acyl = 0;
676 xy->nhead = 1;
677 xy->nsect = 1;
678 xy->sectpercyl = 1;
680 xy->dkb.bt_bad[lcv].bt_cyl =
681 xy->dkb.bt_bad[lcv].bt_trksec = 0xffff;
684 for (xy->drive_type = 0 ; xy->drive_type <= XYC_MAXDT ;
685 xy->drive_type++) {
686 error = xyc_cmd(xyc, XYCMD_RD, 0, xy->xy_drive, 0, 1,
694 aprint_error_dev(&xy->sc_dev, "reading disk label failed: %s\n",
698 printf(" (drive type %d)\n", xy->drive_type);
702 xy->hw_spt = spt = 0; /* XXX needed ? */
704 disk_init(&xy->sc_dk, device_xname(&xy->sc_dev), &xydkdriver);
705 disk_attach(&xy->sc_dk);
707 if (xygetdisklabel(xy, buf) != XY_ERR_AOK)
711 printf("%s: <%s>, pcyl %d\n", device_xname(&xy->sc_dev),
712 buf, xy->pcyl);
713 mb = xy->ncyl * (xy->nhead * xy->nsect) / (1048576 / XYFM_BPS);
715 device_xname(&xy->sc_dev), mb, xy->ncyl, xy->nhead, xy->nsect,
731 if (oxy == NULL || oxy == xy) continue;
732 if (oxy->drive_type != xy->drive_type) continue;
733 if (xy->nsect != oxy->nsect || xy->pcyl != oxy->pcyl ||
734 xy->nhead != oxy->nhead) {
736 device_xname(&xyc->sc_dev), device_xname(&xy->sc_dev),
738 panic("xy drive size mismatch");
745 blk = (xy->nsect - 1) +
746 ((xy->nhead - 1) * xy->nsect) +
747 ((xy->pcyl - 1) * xy->nsect * xy->nhead);
748 error = xyc_cmd(xyc, XYCMD_SDS, 0, xy->xy_drive, blk, 0, 0, fmode);
751 aprint_error_dev(&xy->sc_dev, "write drive size failed: %s\n",
762 blk = (xy->ncyl + xy->acyl - 1) * (xy->nhead * xy->nsect) +
764 (xy->nhead - 1) * xy->nsect; /* last head */
765 error = xyc_cmd(xyc, XYCMD_RD, 0, xy->xy_drive, blk, 1,
769 aprint_error_dev(&xy->sc_dev, "reading bad144 failed: %s\n",
781 if (dkb->bt_bad[lcv].bt_cyl >= xy->ncyl)
783 if ((dkb->bt_bad[lcv].bt_trksec >> 8) >= xy->nhead)
785 if ((dkb->bt_bad[lcv].bt_trksec & 0xff) >= xy->nsect)
789 aprint_error_dev(&xy->sc_dev, "warning: invalid bad144 sector!\n");
791 memcpy(&xy->dkb, buf, XYFM_BPS);
800 xy->state = newstate;
802 wakeup(&xy->state);
821 struct xy_softc *xy = device_lookup_private(&xy_cd, DISKUNIT(dev));
828 xy->sc_dk.dk_copenmask &= ~(1 << part);
831 xy->sc_dk.dk_bopenmask &= ~(1 << part);
834 xy->sc_dk.dk_openmask = xy->sc_dk.dk_copenmask | xy->sc_dk.dk_bopenmask;
846 struct xy_softc *xy;
851 xy = device_lookup_private(&xy_cd, unit);
852 if (!xy)
855 printf("%s%c: crash dump not supported (yet)\n", device_xname(&xy->sc_dev),
922 struct xy_softc *xy;
932 if ((xy = device_lookup_private(&xy_cd, unit)) == NULL)
942 memcpy(&xy->dkb, addr, sizeof(xy->dkb));
947 memcpy(addr, xy->sc_dk.dk_label, sizeof(struct disklabel));
951 newlabel = *(xy->sc_dk.dk_label);
959 ((struct partinfo *) addr)->disklab = xy->sc_dk.dk_label;
961 &xy->sc_dk.dk_label->d_partitions[DISKPART(dev)];
977 error = setdisklabel(xy->sc_dk.dk_label,
978 lp, /* xy->sc_dk.dk_openmask : */ 0,
979 xy->sc_dk.dk_cpulabel);
981 if (xy->state == XY_DRIVE_NOLABEL)
982 xy->state = XY_DRIVE_ONLINE;
990 xy->flags |= XY_WLABEL;
992 xy->flags &= ~XY_WLABEL;
1008 error = setdisklabel(xy->sc_dk.dk_label,
1009 lp, /* xy->sc_dk.dk_openmask : */ 0,
1010 xy->sc_dk.dk_cpulabel);
1012 if (xy->state == XY_DRIVE_NOLABEL)
1013 xy->state = XY_DRIVE_ONLINE;
1016 xy->sc_dk.dk_openmask |= (1 << 0);
1018 xystrategy, xy->sc_dk.dk_label,
1019 xy->sc_dk.dk_cpulabel);
1020 xy->sc_dk.dk_openmask =
1021 xy->sc_dk.dk_copenmask | xy->sc_dk.dk_bopenmask;
1033 return (xyc_ioctlcmd(xy, dev, xio));
1049 struct xy_softc *xy;
1055 if ((xy = device_lookup_private(&xy_cd, unit)) == NULL)
1061 if (xy->state == XY_DRIVE_UNKNOWN) {
1062 xa.driveno = xy->xy_drive;
1065 xyattach((device_t) xy->parent,
1066 (device_t) xy, &xa);
1067 if (xy->state == XY_DRIVE_UNKNOWN) {
1074 (part >= xy->sc_dk.dk_label->d_npartitions ||
1075 xy->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
1082 xy->sc_dk.dk_copenmask |= (1 << part);
1085 xy->sc_dk.dk_bopenmask |= (1 << part);
1088 xy->sc_dk.dk_openmask = xy->sc_dk.dk_copenmask | xy->sc_dk.dk_bopenmask;
1141 * xystrategy: buffering system interface to xy.
1147 struct xy_softc *xy;
1157 if (!(xy = device_lookup_private(&xy_cd, unit)) ||
1159 (bp->b_bcount % xy->sc_dk.dk_label->d_secsize) != 0) {
1165 if (xy->state == XY_DRIVE_UNKNOWN) {
1166 xa.driveno = xy->xy_drive;
1169 xyattach((device_t)xy->parent, (device_t)xy, &xa);
1170 if (xy->state == XY_DRIVE_UNKNOWN) {
1175 if (xy->state != XY_DRIVE_ONLINE && DISKPART(bp->b_dev) != RAW_PART) {
1190 lp = xy->sc_dk.dk_label;
1192 if (bounds_check_with_label(&xy->sc_dk, bp,
1193 (xy->flags & XY_WLABEL) != 0) <= 0)
1212 bufq_put(xy->xyq, bp);
1216 xyc_start(xy->parent, NULL);
1269 xyc_rqinit(struct xy_iorq *rq, struct xyc_softc *xyc, struct xy_softc *xy, int md, u_long blk, int cnt, void *db, struct buf *bp)
1272 rq->xy = xy;
1299 if (iorq->xy) {
1300 iopb->unit = iorq->xy->xy_drive;
1301 iopb->dt = iorq->xy->drive_type;
1307 if (iorq->xy == NULL || block == 0) {
1310 iopb->sect = block % iorq->xy->nsect;
1311 block = block / iorq->xy->nsect;
1312 iopb->head = block % iorq->xy->nhead;
1313 block = block / iorq->xy->nhead;
1784 (void)bufq_get(iorq->xy->xyq);
1785 disk_unbusy(&xycsc->reqs[lcv].xy->sc_dk,
1823 struct xy_softc *xy;
1827 if ((xy = xycsc->sc_drives[lcv]) == NULL) continue;
1828 if (bufq_peek(xy->xyq) == NULL) continue;
1829 if (xy->xyrq->mode != XY_SUB_FREE) continue;
1830 xyc_startbuf(xycsc, xy, bufq_peek(xy->xyq));
1930 iorq->xy->sectpercyl;
1932 (iorq->blockno / iorq->xy->nhead) %
1933 iorq->xy->nhead;
1961 (void)bufq_get(iorq->xy->xyq);
1962 disk_unbusy(&iorq->xy->sc_dk,
1996 printf("%s", (iorq->xy) ? device_xname(&iorq->xy->sc_dev)
2034 xyc_reset(xycsc, 1, XY_RSET_NONE, errnum, iorq->xy);
2045 if ((i = isbad(&iorq->xy->dkb, iorq->blockno / iorq->xy->sectpercyl,
2046 (iorq->blockno / iorq->xy->nsect) % iorq->xy->nhead,
2047 iorq->blockno % iorq->xy->nsect)) != -1) {
2052 iopb->cyl = (iorq->xy->ncyl + iorq->xy->acyl) - 2;
2054 i = iorq->xy->sectpercyl - 1 - i; /* follow bad144
2056 iopb->head = i / iorq->xy->nhead;
2057 iopb->sect = i % iorq->xy->nhead;
2086 * xyc_tick: make sure xy is still alive and ticking (err, kicking).
2124 xyc_ioctlcmd(struct xy_softc *xy, dev_t dev, struct xd_iocmd *xio)
2158 xycsc = xy->parent;
2184 rqno = xyc_cmd(xycsc, xio->cmd, xio->subfn, xy->xy_drive, xio->block,