Lines Matching refs:request

24 static void set_sense(scsi_ccb *request, int sense_key, int sense_asc);
25 static bool copy_sg_data(scsi_ccb *request, uint offset, uint allocation_length,
27 static void get_emulation_buffer(scsi_ccb *request);
28 static void replace_request_data(scsi_ccb *request);
29 static void release_emulation_buffer(scsi_ccb *request);
30 static void restore_request_data(scsi_ccb *request);
113 scsi_read_write_6(scsi_ccb *request)
115 scsi_cmd_rw_6 *cmd = (scsi_cmd_rw_6 *)request->orig_cdb;
116 scsi_cmd_rw_10 *cdb = (scsi_cmd_rw_10 *)request->cdb;
120 request->cdb_length = sizeof(*cdb);
166 scsi_start_mode_sense_6(scsi_ccb *request)
168 scsi_cmd_mode_sense_6 *cmd = (scsi_cmd_mode_sense_6 *)request->orig_cdb;
169 scsi_cmd_mode_sense_10 *cdb = (scsi_cmd_mode_sense_10 *)request->cdb;
173 request->cdb_length = sizeof(*cdb);
192 get_emulation_buffer(request);
193 replace_request_data(request);
196 request->data_length = allocationLength;
205 scsi_start_mode_select_6(scsi_ccb *request)
207 scsi_device_info *device = request->device;
208 scsi_cmd_mode_select_6 *cmd = (scsi_cmd_mode_select_6 *)request->orig_cdb;
209 scsi_cmd_mode_select_10 *cdb = (scsi_cmd_mode_select_10 *)request->cdb;
222 get_emulation_buffer(request);
229 request->cdb_length = sizeof(*cdb);
243 if (!copy_sg_data(request, 0, param_list_length_6, &header_6, sizeof(header_6), true))
255 if (!copy_sg_data(request, sizeof(header_6), param_list_length_6, header_10 + 1,
259 replace_request_data(request);
262 request->data_length = param_list_length_10;
266 release_emulation_buffer(request);
268 set_sense(request, SCSIS_KEY_ILLEGAL_REQUEST, SCSIS_ASC_INV_PARAM_LIST_FIELD);
277 scsi_start_emulation(scsi_ccb *request)
281 SHOW_FLOW(3, "command=%x", request->cdb[0]);
283 memcpy(request->orig_cdb, request->cdb, SCSI_MAX_CDB_SIZE);
284 request->orig_cdb_length = request->cdb_length;
286 switch (request->orig_cdb[0]) {
289 return scsi_read_write_6(request);
292 return scsi_start_mode_sense_6(request);
295 return scsi_start_mode_select_6(request);
304 scsi_finish_mode_sense_10_6(scsi_ccb *request)
306 scsi_device_info *device = request->device;
311 if (request->subsys_status != SCSI_REQ_CMP
312 || request->device_status != SCSI_STATUS_GOOD) {
314 restore_request_data(request);
315 release_emulation_buffer(request);
320 // request data
321 transfer_size_10 = request->data_length - request->data_resid;
327 restore_request_data(request);
343 copy_sg_data(request, 0, transfer_size_6, &header_6, sizeof(header_6), false);
346 copy_sg_data(request, sizeof(header_6), transfer_size_6,
349 request->data_resid = request->data_length - transfer_size_6;
351 release_emulation_buffer(request);
357 scsi_finish_mode_select_10_6(scsi_ccb *request)
363 request->data_resid += sizeof(scsi_mode_param_header_6)
366 restore_request_data(request);
367 release_emulation_buffer(request);
373 scsi_finish_inquiry(scsi_ccb *request)
380 if (request->subsys_status != SCSI_REQ_CMP
381 || request->device_status != SCSI_STATUS_GOOD)
384 transferSize = request->data_length - request->data_resid;
386 copy_sg_data(request, 0, transferSize, &res, sizeof(res), true);
394 copy_sg_data(request, 0, transferSize, &res, sizeof(res), false);
398 /*! Adjust result of emulated request */
400 scsi_finish_emulation(scsi_ccb *request)
404 switch ((((int)request->cdb[0]) << 8) | request->orig_cdb[0]) {
406 scsi_finish_mode_sense_10_6(request);
410 scsi_finish_mode_select_10_6(request);
414 scsi_finish_inquiry(request);
419 memcpy(request->cdb, request->orig_cdb, SCSI_MAX_CDB_SIZE);
420 request->cdb_length = request->orig_cdb_length;
424 /*! Set sense of request */
426 set_sense(scsi_ccb *request, int sense_key, int sense_asc)
428 scsi_sense *sense = (scsi_sense *)request->sense;
432 request->subsys_status = SCSI_REQ_CMP;
433 request->device_status = SCSI_STATUS_CHECK_CONDITION;
438 if ((request->flags & SCSI_DIS_AUTOSENSE) != 0)
450 request->subsys_status |= SCSI_AUTOSNS_VALID;
454 /*! Copy data between request data and buffer
455 request - request to copy data from/to
456 offset - offset of data in request
457 allocation_length- limit of request's data buffer according to CDB
460 to_buffer - true: copy from request to buffer
461 false: copy from buffer to request
462 return: true, if data of request was large enough
465 copy_sg_data(scsi_ccb *request, uint offset, uint allocation_length,
468 const physical_entry *sg_list = request->sg_list;
469 int sg_count = request->sg_count;
485 // remaining bytes we are allowed to copy from/to request
486 req_size = min_c(allocation_length, request->data_length) - offset;
518 get_emulation_buffer(scsi_ccb *request)
520 scsi_device_info *device = request->device;
528 /*! Replace request data with emulation buffer, saving original pointer;
532 replace_request_data(scsi_ccb *request)
534 scsi_device_info *device = request->device;
538 request->orig_sg_list = request->sg_list;
539 request->orig_sg_count = request->sg_count;
540 request->orig_data_length = request->data_length;
542 request->sg_list = device->buffer_sg_list;
543 request->sg_count = device->buffer_sg_count;
544 request->data_length = device->buffer_size;
550 release_emulation_buffer(scsi_ccb *request)
554 release_sem(request->device->buffer_sem);
558 /*! Restore original request data pointers */
560 restore_request_data(scsi_ccb *request)
564 request->sg_list = request->orig_sg_list;
565 request->sg_count = request->orig_sg_count;
566 request->data_length = request->orig_data_length;