Home | History | Annotate | Download | only in scsipi

Lines Matching refs:sd

1 /*	$NetBSD: sd.c,v 1.347 2025/10/11 13:58:57 mlelstv Exp $	*/
51 __KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.347 2025/10/11 13:58:57 mlelstv Exp $");
135 CFATTACH_DECL3_NEW(sd, sizeof(struct sd_softc), sdmatch, sdattach, sddetach,
254 struct sd_softc *sd = device_private(self);
255 struct dk_softc *dksc = &sd->sc_dksc;
259 struct disk_parms *dp = &sd->params;
264 sd->type = (sa->sa_inqbuf.type & SID_TYPE);
265 memcpy(sd->name, sa->sa_inqbuf.product, uimin(16, sizeof(sd->name)));
266 memcpy(sd->typename, sa->sa_inqbuf.product,
267 uimin(16, sizeof(sd->typename)));
269 if (sd->type == T_SIMPLE_DIRECT) {
278 sd->flags |= SDF_ANCIENT;
299 callout_init(&sd->sc_callout, 0);
304 sd->sc_periph = periph;
333 result = sd_get_parms(sd, &sd->params, XS_CTL_DISCOVERY);
389 struct sd_softc *sd = device_private(self);
390 struct dk_softc *dksc = &sd->sc_dksc;
391 struct scsipi_periph *periph = sd->sc_periph;
411 callout_halt(&sd->sc_callout, NULL);
431 callout_destroy(&sd->sc_callout);
444 struct sd_softc *sd = device_private(self);
445 struct scsipi_periph *periph = sd->sc_periph;
501 param_error = sd_get_parms(sd, &sd->params, 0);
532 struct sd_softc *sd;
539 sd = device_lookup_private(&sd_cd, unit);
540 if (sd == NULL)
542 dksc = &sd->sc_dksc;
547 periph = sd->sc_periph;
577 struct sd_softc *sd = device_private(self);
578 struct dk_softc *dksc = &sd->sc_dksc;
579 struct scsipi_periph *periph = sd->sc_periph;
586 if ((sd
587 if (sd_flush(sd, 0)) {
590 sd->flags &= ~SDF_FLUSHING;
592 sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
618 struct sd_softc *sd;
623 sd = device_lookup_private(&sd_cd, unit);
624 dksc = &sd->sc_dksc;
637 struct sd_softc *sd = device_lookup_private(&sd_cd, SDUNIT(bp->b_dev));
638 struct dk_softc *dksc = &sd->sc_dksc;
639 struct scsipi_periph *periph = sd->sc_periph;
641 SC_DEBUG(sd->sc_periph, SCSIPI_DB2, ("sdstrategy "));
642 SC_DEBUG(sd->sc_periph, SCSIPI_DB1,
671 struct sd_softc *sd = device_private(dev);
672 struct scsipi_periph *periph = sd->sc_periph;
718 sd->flags |= SDF_DIRTY;
720 if (sd->params.blksize == DEV_BSIZE)
723 nblks = howmany(bp->b_bcount, sd->params.blksize);
800 callout_reset(&sd->sc_callout, hz / 2, sdrestart, sd);
823 struct sd_softc *sd = v;
824 struct dk_softc *dksc = &sd->sc_dksc;
838 struct sd_softc *sd = device_private(periph->periph_dev);
839 struct dk_softc *dksc = &sd->sc_dksc;
860 struct sd_softc *sd = device_private(xs->xs_periph->periph_dev);
861 struct dk_softc *dksc = &sd->sc_dksc;
864 if (sd->flags & SDF_FLUSHING) {
866 sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
885 struct sd_softc *sd = device_lookup_private(&sd_cd, SDUNIT(bp->b_dev));
886 struct dk_softc *dksc = &sd->sc_dksc;
900 if ((sd->flags & SDF_ANCIENT) &&
901 ((sd->sc_periph->periph_flags &
909 scsipi_adapter_minphys(sd->sc_periph->periph_channel, bp);
948 struct sd_softc *sd = device_lookup_private(&sd_cd, SDUNIT(dev));
949 struct dk_softc *dksc = &sd->sc_dksc;
950 struct scsipi_periph *periph = sd->sc_periph;
955 SC_DEBUG(sd->sc_periph, SCSIPI_DB2, ("sdioctl 0x%lx ", cmd));
998 return (sd_getcache(sd, (int *) addr));
1003 return (sd_setcache(sd, *(int *) addr));
1012 if (((sd->flags & SDF_DIRTY) != 0 || *(int *)addr != 0)) {
1013 error = sd_flush(sd, 0);
1015 sd->flags &= ~SDF_FLUSHING;
1018 sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
1039 struct sd_softc *sd = device_private(self);
1041 strncpy(lp->d_typename, sd->name, 16);
1042 lp->d_rpm = sd->params.rot_rate;
1043 if (sd->sc_periph->periph_flags & PERIPH_REMOVABLE)
1048 sd_unmap(struct sd_softc *sd, off_t pos, off_t len)
1057 bno = (pos + sd->params.blksize - 1) / sd->params.blksize;
1058 size = ((pos + len) / sd->params.blksize) - bno;
1074 scsipi_command(sd->sc_periph,
1085 struct sd_softc *sd = device_private(self);
1086 if (sd->flags & SDF_LBPU) {
1087 return sd_unmap(sd, pos, len);
1095 struct sd_softc *sd = device_private(self);
1096 struct dk_softc *dksc = &sd->sc_dksc;
1103 if ((sd->flags & SDF_DIRTY) != 0) {
1104 if (sd_flush(sd, XS_CTL_NOSLEEP|XS_CTL_POLL)) {
1107 sd->flags &= ~SDF_FLUSHING;
1109 sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
1129 struct sd_softc *sd = device_private(periph->periph_dev);
1130 struct dk_softc *dksc = &sd->sc_dksc;
1211 struct sd_softc *sd;
1216 sd = device_lookup_private(&sd_cd, unit);
1217 if (sd == NULL)
1219 dksc = &sd->sc_dksc;
1237 struct sd_softc *sd;
1243 if ((sd = device_lookup_private(&sd_cd, unit)) == NULL)
1245 dksc = &sd->sc_dksc;
1250 periph = sd->sc_periph;
1262 struct sd_softc *sd = device_private(dev);
1263 struct dk_softc *dksc = &sd->sc_dksc;
1274 periph = sd->sc_periph;
1332 printf("sd%d: dump addr 0x%x, blk %d\n", unit, va, blkno);
1340 sd_mode_sense(struct sd_softc *sd, u_int8_t byte2, void *sense, size_t size,
1344 if ((sd->sc_periph->periph_quirks & PQUIRK_ONLYBIG) &&
1345 !(sd->sc_periph->periph_quirks & PQUIRK_NOBIGMODESENSE)) {
1347 return scsipi_mode_sense_big(sd->sc_periph, byte2, page, sense,
1352 return scsipi_mode_sense(sd->sc_periph, byte2, page, sense,
1359 sd_mode_select(struct sd_softc *sd, u_int8_t byte2, void *sense, size_t size,
1367 return scsipi_mode_select_big(sd->sc_periph, byte2, sense,
1374 return scsipi_mode_select(sd->sc_periph, byte2, sense,
1410 sd_read_capacity(struct sd_softc *sd, int *blksize, int flags)
1412 struct scsipi_periph *periph = sd->sc_periph;
1423 sd->params.lbppbe = 0;
1424 sd->params.lalba = 0;
1425 sd->flags &= ~SDF_LBPME;
1461 sd->params.lbppbe = datap->data16.byte14
1463 sd->params.lalba = _2btol(datap->data16.lowest_aligned)
1466 sd->flags |= SDF_LBPME;
1486 sd_get_simplifiedparms(struct sd_softc *sd, struct disk_parms *dp, int flags)
1510 if ((blocks = sd_read_capacity(sd, &blksize, flags)) == 0)
1513 error = scsipi_mode_sense(sd->sc_periph, SMS_DBD, 6,
1523 if (!sd_validate_blksize(sd->sc_periph, dp->blksize))
1549 sd_get_capacity(struct sd_softc *sd, struct disk_parms *dp, int flags)
1558 dp->disksize = blocks = sd_read_capacity(sd, &blksize, flags);
1571 error = scsipi_command(sd->sc_periph,
1610 error = sd_mode_sense(sd, 0, &scsipi_sense,
1634 if (!sd_validate_blksize(sd->sc_periph, blksize))
1640 if ((sd->flags & SDF_LBPME) == 0)
1650 sd->flags &= ~SDF_LBPU;
1651 if (scsipi_command(sd->sc_periph, (void *)&cmd, sizeof(cmd),
1658 sd->flags |= SDF_LBPU;
1665 sd_get_parms_page4(struct sd_softc *sd, struct disk_parms *dp, int flags)
1676 error = sd_mode_sense(sd, byte2, &scsipi_sense,
1719 SC_DEBUG(sd->sc_periph, SCSIPI_DB3,
1750 sd_get_parms_page5(struct sd_softc *sd, struct disk_parms *dp, int flags)
1761 error = sd_mode_sense(sd, 0, &scsipi_sense,
1804 SC_DEBUG(sd->sc_periph, SCSIPI_DB3,
1828 sd_get_parms(struct sd_softc *sd, struct disk_parms *dp, int flags)
1830 struct dk_softc *dksc = &sd->sc_dksc;
1837 if (sd->type == T_SIMPLE_DIRECT) {
1838 error = sd_get_simplifiedparms(sd, dp, flags);
1844 error = sd_get_capacity(sd, dp, flags);
1848 if (sd->type == T_OPTICAL)
1851 if (sd->sc_periph->periph_flags & PERIPH_REMOVABLE) {
1852 if (!sd_get_parms_page5(sd, dp, flags) ||
1853 !sd_get_parms_page4(sd, dp, flags))
1856 if (!sd_get_parms_page4(sd, dp, flags) ||
1857 !sd_get_parms_page5(sd, dp, flags))
1864 if (!sd->sc_periph->periph_channel->chan_adapter->adapt_getgeom ||
1865 !(*sd
1866 (sd->sc_periph, dp, dp->disksize)) {
1879 sd_set_geometry(sd);
1885 sd_flush(struct sd_softc *sd, int flags)
1887 struct scsipi_periph *periph = sd->sc_periph;
1908 sd->flags |= SDF_FLUSHING;
1917 sd_getcache(struct sd_softc *sd, int *bitsp)
1919 struct scsipi_periph *periph = sd->sc_periph;
1931 error = sd_mode_sense(sd, SMS_DBD, &scsipi_sense,
1960 error = sd_mode_sense(sd, SMS_DBD, &scsipi_sense,
1981 sd_setcache(struct sd_softc *sd, int bits)
1983 struct scsipi_periph *periph = sd->sc_periph;
1994 error = sd_mode_sense(sd, SMS_DBD, &scsipi_sense,
2024 return (sd_mode_select(sd, byte2|SMS_PF, &scsipi_sense,
2030 sd_set_geometry(struct sd_softc *sd)
2032 struct dk_softc *dksc = &sd->sc_dksc;
2037 dg->dg_secperunit = sd->params.disksize;
2038 dg->dg_secsize = sd->params.blksize;
2039 dg->dg_nsectors = sd->params.sectors;
2040 dg->dg_ntracks = sd->params.heads;
2041 dg->dg_ncylinders = sd->params.cyls;
2042 dg->dg_physsecsize = dg->dg_secsize << sd->params.lbppbe;
2043 dg->dg_alignedsec = sd->params.lalba;
2045 disk_set_info(dksc->sc_dev, &dksc->sc_dkdev, sd->typename);
2051 struct sd_softc *sd;
2055 sd = device_lookup_private(&sd_cd, unit);
2057 return dk_discard(&sd->sc_dksc, dev, pos, len);