1/* 2 * Copyright 2002/03, Thomas Kurschel. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _SCSI_INTERNAL_H 6#define _SCSI_INTERNAL_H 7 8//! Internal structures/definitions 9 10#include <sys/cdefs.h> 11 12#include <bus/SCSI.h> 13#include <scsi_cmds.h> 14#include <locked_pool.h> 15#include <device_manager.h> 16#include <lock.h> 17 18#define debug_level_error 4 19#define debug_level_info 4 20#define debug_level_flow 4 21 22#define DEBUG_MSG_PREFIX "SCSI -- " 23 24#include "wrapper.h" 25#include "scsi_lock.h" 26 27 28#define MAX_PATH_ID 255 29#define MAX_TARGET_ID 15 30#define MAX_LUN_ID 7 31 32 33// maximum number of fragments for temporary S/G lists 34// for real SCSI controllers, there's no limit to transmission length 35// but we need a limit - ATA transmits up to 128K, so we allow that 36// (for massive data transmission, peripheral drivers should provide own 37// SG list anyway) 38// add one extra entry in case data is not page aligned 39#define MAX_TEMP_SG_FRAGMENTS (128*1024 / B_PAGE_SIZE + 1) 40 41// maximum number of temporary S/G lists 42#define MAX_TEMP_SG_LISTS 32 43 44// delay in ��s before DMA buffer is cleaned up 45#define SCSI_DMA_BUFFER_CLEANUP_DELAY 10*1000000 46 47// buffer size for emulated SCSI commands that ATAPI cannot handle; 48// for MODE SELECT 6, maximum size is 255 + header, 49// for MODE SENSE 6, we use MODE SENSE 10 which can return 64 K, 50// but as the caller has to live with the 255 + header restriction, 51// we hope that this buffer is large enough 52#define SCSI_ATAPI_BUFFER_SIZE 512 53 54 55// name of pnp generator of path ids 56#define SCSI_PATHID_GENERATOR "scsi/path_id" 57// true, if SCSI device needs ATAPI emulation (ui8) 58#define SCSI_DEVICE_IS_ATAPI_ITEM "scsi/is_atapi" 59// true, if device requires auto-sense emulation (ui8) 60#define SCSI_DEVICE_MANUAL_AUTOSENSE_ITEM "scsi/manual_autosense" 61 62// name of internal scsi_bus_raw device driver 63#define SCSI_BUS_RAW_MODULE_NAME "bus_managers/scsi/bus/raw/device_v1" 64 65// info about DPC 66typedef struct scsi_dpc_info { 67 struct scsi_dpc_info *next; 68 bool registered; // true, if already/still in dpc list 69 70 void (*func)( void * ); 71 void *arg; 72} scsi_dpc_info; 73 74 75// controller restrictions (see blkman.h) 76typedef struct dma_params { 77 uint32 alignment; 78 uint32 max_blocks; 79 uint32 dma_boundary; 80 uint32 max_sg_block_size; 81 uint32 max_sg_blocks; 82} dma_params; 83 84 85// SCSI bus 86typedef struct scsi_bus_info { 87 int lock_count; // sum of blocked[0..1] and sim_overflow 88 int blocked[2]; // depth of nested locks by bus manager (0) and SIM (1) 89 int left_slots; // left command queuing slots on HBA 90 bool sim_overflow; // 1, if SIM refused req because of bus queue overflow 91 92 uchar path_id; // SCSI path id 93 uint32 max_target_count; // maximum count of target_ids on the bus 94 uint32 max_lun_count; // maximum count of lun_ids on the bus 95 96 thread_id service_thread; // service thread 97 sem_id start_service; // released whenever service thread has work to do 98 bool shutting_down; // set to true to tell service thread to shut down 99 100 struct mutex mutex; // used to synchronize changes in queueing and blocking 101 102 sem_id scan_lun_lock; // allocated whenever a lun is scanned 103 104 scsi_sim_interface *interface; // SIM interface 105 scsi_sim_cookie sim_cookie; // internal SIM cookie 106 107 spinlock_irq dpc_lock; // synchronizer for dpc list 108 scsi_dpc_info *dpc_list; // list of dpcs to execute 109 110 struct scsi_device_info *waiting_devices; // devices ready to receive requests 111 112 locked_pool_cookie ccb_pool; // ccb pool (one per bus) 113 114 device_node *node; // pnp node of bus 115 116 struct dma_params dma_params; // dma restrictions of controller 117 118 scsi_path_inquiry inquiry_data; // inquiry data as read on init 119} scsi_bus_info; 120 121 122// DMA buffer 123typedef struct dma_buffer { 124 area_id area; // area of DMA buffer 125 uchar *address; // address of DMA buffer 126 size_t size; // size of DMA buffer 127 area_id sg_list_area; // area of S/G list 128 physical_entry *sg_list; // address of S/G list 129 uint32 sg_count; // number of entries in S/G list 130 bool inuse; // true, if in use 131 bigtime_t last_use; // timestamp of last usage 132 133 area_id sg_orig; // area of S/G list to original data 134 physical_entry *sg_list_orig; // S/G list to original data 135 uint32 sg_count_max_orig; // maximum size (in entries) 136 uint32 sg_count_orig; // current size (in entries) 137 138 uchar *orig_data; // pointer to original data 139 const physical_entry *orig_sg_list; // original S/G list 140 uint32 orig_sg_count; // size of original S/G list 141} dma_buffer; 142 143 144// SCSI device 145typedef struct scsi_device_info { 146 struct scsi_device_info *waiting_next; 147 struct scsi_device_info *waiting_prev; 148 149 bool manual_autosense : 1; // no autosense support 150 bool is_atapi : 1; // ATAPI device - needs some commands emulated 151 152 int lock_count; // sum of blocked[0..1] and sim_overflow 153 int blocked[2]; // depth of nested locks by bus manager (0) and SIM (1) 154 int sim_overflow; // 1, if SIM returned a request because of device queue overflow 155 int left_slots; // left command queuing slots for device 156 int total_slots; // total number of command queuing slots for device 157 158 scsi_ccb *queued_reqs; // queued requests, circularly doubly linked 159 // (scsi_insert_new_request depends on circular) 160 161 int64 last_sort; // last sort value (for elevator sort) 162 int32 valid; // access must be atomic! 163 164 scsi_bus_info *bus; 165 uchar target_id; 166 uchar target_lun; 167 168 scsi_ccb *auto_sense_request; // auto-sense request 169 scsi_ccb *auto_sense_originator; // request that auto-sense is 170 // currently requested for 171 area_id auto_sense_area; // area of auto-sense data and S/G list 172 173 uint8 emulation_map[256/8]; // bit field with index being command code: 174 // 1 indicates that this command is not supported 175 // and thus must be emulated 176 177 scsi_res_inquiry inquiry_data; 178 device_node *node; // device node 179 180 struct mutex dma_buffer_lock; // lock between DMA buffer user and clean-up daemon 181 sem_id dma_buffer_owner; // to be acquired before using DMA buffer 182 struct dma_buffer dma_buffer; // DMA buffer 183 184 // buffer used for emulating SCSI commands 185 char *buffer; 186 physical_entry *buffer_sg_list; 187 size_t buffer_sg_count; 188 size_t buffer_size; 189 area_id buffer_area; 190 sem_id buffer_sem; 191} scsi_device_info; 192 193enum { 194 ev_scsi_requeue_request = 1, 195 ev_scsi_resubmit_request, 196 ev_scsi_submit_autosense, 197 ev_scsi_finish_autosense, 198 ev_scsi_device_queue_overflow, 199 ev_scsi_request_finished, 200 ev_scsi_async_io, 201 ev_scsi_do_resend_request, 202 ev_copy_sg_data 203}; 204 205// check whether device is in bus's wait queue 206// we use the fact the queue is circular, so we don't need an explicit flag 207#define DEVICE_IN_WAIT_QUEUE( device ) ((device)->waiting_next != NULL) 208 209 210// state of ccb 211enum { 212 SCSI_STATE_FREE = 0, 213 SCSI_STATE_INWORK = 1, 214 SCSI_STATE_QUEUED = 2, 215 SCSI_STATE_SENT = 3, 216 SCSI_STATE_FINISHED = 5, 217}; 218 219 220extern locked_pool_interface *locked_pool; 221extern device_manager_info *pnp; 222 223extern scsi_for_sim_interface scsi_for_sim_module; 224extern scsi_bus_interface scsi_bus_module; 225extern scsi_device_interface scsi_device_module; 226extern struct device_module_info gSCSIBusRawModule; 227 228 229__BEGIN_DECLS 230 231 232// busses.c 233uchar scsi_inquiry_path(scsi_bus bus, scsi_path_inquiry *inquiry_data); 234 235 236// ccb.c 237scsi_ccb *scsi_alloc_ccb(scsi_device_info *device); 238void scsi_free_ccb(scsi_ccb *ccb); 239 240status_t scsi_init_ccb_alloc(scsi_bus_info *bus); 241void scsi_uninit_ccb_alloc(scsi_bus_info *bus); 242 243 244// devices.c 245status_t scsi_force_get_device(scsi_bus_info *bus, 246 uchar target_id, uchar target_lun, scsi_device_info **res_device); 247void scsi_put_forced_device(scsi_device_info *device); 248status_t scsi_register_device(scsi_bus_info *bus, uchar target_id, 249 uchar target_lun, scsi_res_inquiry *inquiry_data); 250 251 252// device_scan.c 253status_t scsi_scan_bus(scsi_bus_info *bus); 254status_t scsi_scan_lun(scsi_bus_info *bus, uchar target_id, uchar target_lun); 255 256 257// dpc.c 258status_t scsi_alloc_dpc(scsi_dpc_info **dpc); 259status_t scsi_free_dpc(scsi_dpc_info *dpc); 260bool scsi_check_exec_dpc(scsi_bus_info *bus); 261 262status_t scsi_schedule_dpc(scsi_bus_info *bus, scsi_dpc_info *dpc, /*int flags,*/ 263 void (*func)( void *arg ), void *arg); 264 265 266// scsi_io.c 267void scsi_async_io(scsi_ccb *request); 268void scsi_sync_io(scsi_ccb *request); 269uchar scsi_term_io(scsi_ccb *ccb_to_terminate); 270uchar scsi_abort(scsi_ccb *ccb_to_abort); 271 272bool scsi_check_exec_service(scsi_bus_info *bus); 273 274void scsi_done_io(scsi_ccb *ccb); 275 276void scsi_requeue_request(scsi_ccb *request, bool bus_overflow); 277void scsi_resubmit_request(scsi_ccb *request); 278void scsi_request_finished(scsi_ccb *request, uint num_requests); 279 280 281// scatter_gather.c 282bool create_temp_sg(scsi_ccb *ccb); 283void cleanup_tmp_sg(scsi_ccb *ccb); 284 285int init_temp_sg(void); 286void uninit_temp_sg(void); 287 288 289// dma_buffer.c 290void scsi_dma_buffer_daemon(void *dev, int counter); 291void scsi_release_dma_buffer(scsi_ccb *request); 292bool scsi_get_dma_buffer(scsi_ccb *request); 293void scsi_dma_buffer_free(dma_buffer *buffer); 294void scsi_dma_buffer_init(dma_buffer *buffer); 295 296 297// queuing.c 298 299 300// emulation.c 301bool scsi_start_emulation(scsi_ccb *request); 302void scsi_finish_emulation(scsi_ccb *request); 303void scsi_free_emulation_buffer(scsi_device_info *device); 304status_t scsi_init_emulation_buffer(scsi_device_info *device, size_t buffer_size); 305 306 307__END_DECLS 308 309 310#endif /* _SCSI_INTERNAL_H */ 311