void sd_cmd_rw16(struct scsi_xfer *xs, int read, u_int64_t secno, u_int nsecs) { struct scsi_rw_16 *cmd = (struct scsi_rw_16 *)xs->cmd; cmd->opcode = read ? READ_16 : WRITE_16; _lto8b(secno, cmd->addr); _lto4b(nsecs, cmd->length); xs->cmdlen = sizeof(*cmd); }
void vdsk_scsi_capacity16(struct scsi_xfer *xs) { struct vdsk_softc *sc = xs->sc_link->adapter_softc; struct scsi_read_cap_data_16 rcd; bzero(&rcd, sizeof(rcd)); _lto8b(sc->sc_vdisk_size - 1, rcd.addr); _lto4b(sc->sc_vdisk_block_size, rcd.length); bcopy(&rcd, xs->data, MIN(sizeof(rcd), xs->datalen)); vdsk_scsi_done(xs, XS_NOERROR); }
static int ld_twa_scsicmd(struct ld_twa_softc *sc, struct twa_request *tr, struct buf *bp) { if (tr->tr_flags == TWA_CMD_DATA_IN) { tr->tr_command->command.cmd_pkt_9k.cdb[0] = WRITE_16; } else { tr->tr_command->command.cmd_pkt_9k.cdb[0] = READ_16; } tr->tr_command->command.cmd_pkt_9k.cdb[1] = (sc->sc_hwunit << 5); /* lun for CDB */ _lto8b(htole64(bp->b_rawblkno), &tr->tr_command->command.cmd_pkt_9k.cdb[2]); _lto4b(htole32((bp->b_bcount / TWA_SECTOR_SIZE)), &tr->tr_command->command.cmd_pkt_9k.cdb[10]); tr->tr_command->command.cmd_pkt_9k.cdb[14] = 0; tr->tr_command->command.cmd_pkt_9k.cdb[15] = 0; return (0); }
/* * Read some data. */ int sdstrategy(void *f, int rw, daddr_t dblk, size_t size, void *p, size_t *rsize) { struct sd_softc *sd; struct disklabel *lp; struct partition *pp; struct scsipi_generic *cmdp; struct scsipi_rw_16 cmd16; struct scsipi_rw_10 cmd_big; struct scsi_rw_6 cmd_small; daddr_t blkno; int cmdlen, nsect, i; uint8_t *buf; if (size == 0) return 0; if (rw != F_READ) return EOPNOTSUPP; buf = p; sd = f; lp = &sd->sc_label; pp = &lp->d_partitions[sd->sc_part]; if (!(sd->sc_flags & FLAGS_MEDIA_LOADED)) return EIO; nsect = howmany(size, lp->d_secsize); blkno = dblk + pp->p_offset; for (i = 0; i < nsect; i++, blkno++) { int error; /* * Fill out the scsi command. Use the smallest CDB possible * (6-byte, 10-byte, or 16-byte). */ if ((blkno & 0x1fffff) == blkno) { /* 6-byte CDB */ memset(&cmd_small, 0, sizeof(cmd_small)); cmd_small.opcode = SCSI_READ_6_COMMAND; _lto3b(blkno, cmd_small.addr); cmd_small.length = 1; cmdlen = sizeof(cmd_small); cmdp = (struct scsipi_generic *)&cmd_small; } else if ((blkno & 0xffffffff) == blkno) { /* 10-byte CDB */ memset(&cmd_big, 0, sizeof(cmd_big)); cmd_small.opcode = READ_10; _lto4b(blkno, cmd_big.addr); _lto2b(1, cmd_big.length); cmdlen = sizeof(cmd_big); cmdp = (struct scsipi_generic *)&cmd_big; } else { /* 16-byte CDB */ memset(&cmd16, 0, sizeof(cmd16)); cmd_small.opcode = READ_16; _lto8b(blkno, cmd16.addr); _lto4b(1, cmd16.length); cmdlen = sizeof(cmd16); cmdp = (struct scsipi_generic *)&cmd16; } error = scsi_command(sd, cmdp, cmdlen, buf, lp->d_secsize); if (error) return error; buf += lp->d_secsize; } *rsize = size; return 0; }