1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_1394_TARGETS_SCSA1394_CMD_H 27 #define _SYS_1394_TARGETS_SCSA1394_CMD_H 28 29 /* 30 * scsa1394 command 31 */ 32 33 #include <sys/scsi/scsi_types.h> 34 #include <sys/1394/targets/scsa1394/sbp2.h> 35 #include <sys/note.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 /* preferred pkt_private length in 64-bit quantities */ 42 #ifdef _LP64 43 #define SCSA1394_CMD_PRIV_SIZE 2 44 #else /* _ILP32 */ 45 #define SCSA1394_CMD_PRIV_SIZE 1 46 #endif 47 #define SCSA1394_CMD_PRIV_LEN (SCSA1394_CMD_PRIV_SIZE * sizeof (uint64_t)) 48 49 /* entry describing a page table segment */ 50 typedef struct scsa1394_cmd_seg { 51 size_t ss_len; 52 uint64_t ss_daddr; 53 uint64_t ss_baddr; 54 t1394_addr_handle_t ss_addr_hdl; 55 } scsa1394_cmd_seg_t; 56 57 /* command packet structure */ 58 typedef struct scsa1394_cmd { 59 sbp2_task_t sc_task; /* corresponding SBP-2 task */ 60 struct scsa1394_lun *sc_lun; /* lun it belongs to */ 61 int sc_state; /* command state */ 62 int sc_flags; /* command flags */ 63 struct buf *sc_bp; /* data buffer */ 64 struct scsi_pkt *sc_pkt; /* corresponding scsi pkt */ 65 size_t sc_cdb_len; 66 size_t sc_cdb_actual_len; 67 size_t sc_scb_len; 68 size_t sc_priv_len; 69 uchar_t sc_cdb[SCSI_CDB_SIZE]; 70 uchar_t sc_pkt_cdb[SCSI_CDB_SIZE]; 71 struct scsi_arq_status sc_scb; 72 uint64_t sc_priv[SCSA1394_CMD_PRIV_SIZE]; 73 clock_t sc_start_time; 74 int sc_timeout; 75 76 /* DMA: command ORB */ 77 ddi_dma_handle_t sc_orb_dma_hdl; 78 ddi_acc_handle_t sc_orb_acc_hdl; 79 ddi_dma_cookie_t sc_orb_dmac; 80 t1394_addr_handle_t sc_orb_addr_hdl; 81 82 /* DMA: data buffer */ 83 ddi_dma_handle_t sc_buf_dma_hdl; 84 uint_t sc_buf_nsegs; /* # of segments/cookies */ 85 uint_t sc_buf_nsegs_alloc; /* # of entries allocated */ 86 scsa1394_cmd_seg_t *sc_buf_seg; /* segment array */ 87 scsa1394_cmd_seg_t sc_buf_seg_mem; /* backstore for one segment */ 88 uint_t sc_nwin; /* # windows */ 89 uint_t sc_curwin; /* current window */ 90 off_t sc_win_offset; /* current window offset */ 91 size_t sc_win_len; /* current window length */ 92 size_t sc_xfer_bytes; /* current xfer byte count */ 93 size_t sc_xfer_blks; /* current xfer blk count */ 94 95 /* DMA: page table */ 96 ddi_dma_handle_t sc_pt_dma_hdl; 97 ddi_acc_handle_t sc_pt_acc_hdl; 98 ddi_dma_cookie_t sc_pt_dmac; 99 caddr_t sc_pt_kaddr; 100 uint64_t sc_pt_baddr; 101 t1394_addr_handle_t sc_pt_addr_hdl; 102 size_t sc_pt_ent_alloc; /* # allocated entries */ 103 int sc_pt_cmd_size; 104 105 /* for symbios mode only */ 106 int sc_lba; /* start LBA */ 107 int sc_blk_size; /* xfer block size */ 108 size_t sc_total_blks; /* total xfer blocks */ 109 size_t sc_resid_blks; /* blocks left */ 110 111 struct scsi_pkt sc_scsi_pkt; /* must be last */ 112 /* embedded SCSI packet */ 113 /* ... scsi_pkt_size() */ 114 } scsa1394_cmd_t; 115 #define SCSA1394_CMD_SIZE (sizeof (struct scsa1394_cmd) - \ 116 sizeof (struct scsi_pkt) + scsi_pkt_size()) 117 118 _NOTE(SCHEME_PROTECTS_DATA("unique per task", { scsa1394_cmd scsa1394_cmd_seg 119 scsi_pkt scsi_inquiry scsi_extended_sense scsi_cdb scsi_arq_status })) 120 121 #define PKT2CMD(pktp) ((scsa1394_cmd_t *)((pktp)->pkt_ha_private)) 122 #define CMD2PKT(cmdp) ((struct scsi_pkt *)((cmdp)->sc_pkt)) 123 #define TASK2CMD(task) ((scsa1394_cmd_t *)(task)->ts_drv_priv) 124 #define CMD2TASK(cmdp) ((sbp2_task_t *)&(cmdp)->sc_task) 125 126 /* state */ 127 enum { 128 SCSA1394_CMD_INIT, 129 SCSA1394_CMD_START, 130 SCSA1394_CMD_STATUS 131 }; 132 133 /* flags */ 134 enum { 135 SCSA1394_CMD_CDB_EXT = 0x0001, 136 SCSA1394_CMD_PRIV_EXT = 0x0002, 137 SCSA1394_CMD_SCB_EXT = 0x0004, 138 SCSA1394_CMD_EXT = (SCSA1394_CMD_CDB_EXT | 139 SCSA1394_CMD_PRIV_EXT | 140 SCSA1394_CMD_SCB_EXT), 141 142 SCSA1394_CMD_DMA_CDB_VALID = 0x0008, 143 SCSA1394_CMD_DMA_BUF_BIND_VALID = 0x0010, 144 SCSA1394_CMD_DMA_BUF_PT_VALID = 0x0020, 145 SCSA1394_CMD_DMA_BUF_ADDR_VALID = 0x0040, 146 SCSA1394_CMD_DMA_BUF_VALID = (SCSA1394_CMD_DMA_BUF_BIND_VALID | 147 SCSA1394_CMD_DMA_BUF_ADDR_VALID | 148 SCSA1394_CMD_DMA_BUF_PT_VALID), 149 SCSA1394_CMD_DMA_BUF_MAPIN = 0x0080, 150 151 SCSA1394_CMD_READ = 0x0100, 152 SCSA1394_CMD_WRITE = 0x0200, 153 SCSA1394_CMD_RDWR = (SCSA1394_CMD_READ | 154 SCSA1394_CMD_WRITE), 155 156 SCSA1394_CMD_SYMBIOS_BREAKUP = 0x400 157 }; 158 159 #ifdef __cplusplus 160 } 161 #endif 162 163 #endif /* _SYS_1394_TARGETS_SCSA1394_CMD_H */ 164