/* * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ /* * File: scsi_cpu.c * Author: Alessandro Forin, Carnegie Mellon University * Date: 10/90 * * Middle layer of the SCSI driver: SCSI protocol implementation * * This file contains code for SCSI commands for PROCESSOR devices. */ #include #include #include #include #include #if (NSCSI > 0) char *sccpu_name(internal) boolean_t internal; { return internal ? "sc" : "cpu"; } void scsi_send( tgt, ior) register target_info_t *tgt; io_req_t ior; { scsi_cmd_write_t *cmd; unsigned len; /* in bytes */ unsigned int max_dma_data; max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; len = ior->io_count; if (len > max_dma_data) len = max_dma_data; if (len < tgt->block_size) len = tgt->block_size; cmd = (scsi_cmd_write_t*) (tgt->cmd_ptr); cmd->scsi_cmd_code = SCSI_CMD_SEND; cmd->scsi_cmd_lun_and_lba1 = 0; cmd->scsi_cmd_lba2 = len >> 16; cmd->scsi_cmd_lba3 = len >> 8; cmd->scsi_cmd_xfer_len = len; cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ tgt->cur_cmd = SCSI_CMD_SEND; scsi_go(tgt, sizeof(*cmd), 0, FALSE); } void scsi_receive( tgt, ior) register target_info_t *tgt; io_req_t ior; { scsi_cmd_read_t *cmd; register unsigned len; unsigned int max_dma_data; max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data; len = ior->io_count; if (len > max_dma_data) len = max_dma_data; if (len < tgt->block_size) len = tgt->block_size; cmd = (scsi_cmd_read_t*) (tgt->cmd_ptr); cmd->scsi_cmd_code = SCSI_CMD_RECEIVE; cmd->scsi_cmd_lun_and_lba1 = 0; cmd->scsi_cmd_lba2 = len >> 16; cmd->scsi_cmd_lba3 = len >> 8; cmd->scsi_cmd_xfer_len = len; cmd->scsi_cmd_ctrl_byte = 0; /* not linked */ tgt->cur_cmd = SCSI_CMD_RECEIVE; scsi_go(tgt, sizeof(*cmd), len, FALSE); } #endif /* NSCSI > 0 */