2 * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 FILE_LICENCE ( GPL2_OR_LATER );
27 #include <ipxe/list.h>
28 #include <ipxe/process.h>
29 #include <ipxe/xfer.h>
30 #include <ipxe/blockdev.h>
31 #include <ipxe/scsi.h>
39 /** Maximum number of command retries */
40 #define SCSICMD_MAX_RETRIES 10
42 /* Error numbers generated by SCSI sense data */
43 #define EIO_NO_SENSE __einfo_error ( EINFO_EIO_NO_SENSE )
44 #define EINFO_EIO_NO_SENSE \
45 __einfo_uniqify ( EINFO_EIO, 0x00, "No sense" )
46 #define EIO_RECOVERED_ERROR __einfo_error ( EINFO_EIO_RECOVERED_ERROR )
47 #define EINFO_EIO_RECOVERED_ERROR \
48 __einfo_uniqify ( EINFO_EIO, 0x01, "Recovered error" )
49 #define EIO_NOT_READY __einfo_error ( EINFO_EIO_NOT_READY )
50 #define EINFO_EIO_NOT_READY \
51 __einfo_uniqify ( EINFO_EIO, 0x02, "Not ready" )
52 #define EIO_MEDIUM_ERROR __einfo_error ( EINFO_EIO_MEDIUM_ERROR )
53 #define EINFO_EIO_MEDIUM_ERROR \
54 __einfo_uniqify ( EINFO_EIO, 0x03, "Medium error" )
55 #define EIO_HARDWARE_ERROR __einfo_error ( EINFO_EIO_HARDWARE_ERROR )
56 #define EINFO_EIO_HARDWARE_ERROR \
57 __einfo_uniqify ( EINFO_EIO, 0x04, "Hardware error" )
58 #define EIO_ILLEGAL_REQUEST __einfo_error ( EINFO_EIO_ILLEGAL_REQUEST )
59 #define EINFO_EIO_ILLEGAL_REQUEST \
60 __einfo_uniqify ( EINFO_EIO, 0x05, "Illegal request" )
61 #define EIO_UNIT_ATTENTION __einfo_error ( EINFO_EIO_UNIT_ATTENTION )
62 #define EINFO_EIO_UNIT_ATTENTION \
63 __einfo_uniqify ( EINFO_EIO, 0x06, "Unit attention" )
64 #define EIO_DATA_PROTECT __einfo_error ( EINFO_EIO_DATA_PROTECT )
65 #define EINFO_EIO_DATA_PROTECT \
66 __einfo_uniqify ( EINFO_EIO, 0x07, "Data protect" )
67 #define EIO_BLANK_CHECK __einfo_error ( EINFO_EIO_BLANK_CHECK )
68 #define EINFO_EIO_BLANK_CHECK \
69 __einfo_uniqify ( EINFO_EIO, 0x08, "Blank check" )
70 #define EIO_VENDOR_SPECIFIC __einfo_error ( EINFO_EIO_VENDOR_SPECIFIC )
71 #define EINFO_EIO_VENDOR_SPECIFIC \
72 __einfo_uniqify ( EINFO_EIO, 0x09, "Vendor specific" )
73 #define EIO_COPY_ABORTED __einfo_error ( EINFO_EIO_COPY_ABORTED )
74 #define EINFO_EIO_COPY_ABORTED \
75 __einfo_uniqify ( EINFO_EIO, 0x0a, "Copy aborted" )
76 #define EIO_ABORTED_COMMAND __einfo_error ( EINFO_EIO_ABORTED_COMMAND )
77 #define EINFO_EIO_ABORTED_COMMAND \
78 __einfo_uniqify ( EINFO_EIO, 0x0b, "Aborted command" )
79 #define EIO_RESERVED __einfo_error ( EINFO_EIO_RESERVED )
80 #define EINFO_EIO_RESERVED \
81 __einfo_uniqify ( EINFO_EIO, 0x0c, "Reserved" )
82 #define EIO_VOLUME_OVERFLOW __einfo_error ( EINFO_EIO_VOLUME_OVERFLOW )
83 #define EINFO_EIO_VOLUME_OVERFLOW \
84 __einfo_uniqify ( EINFO_EIO, 0x0d, "Volume overflow" )
85 #define EIO_MISCOMPARE __einfo_error ( EINFO_EIO_MISCOMPARE )
86 #define EINFO_EIO_MISCOMPARE \
87 __einfo_uniqify ( EINFO_EIO, 0x0e, "Miscompare" )
88 #define EIO_COMPLETED __einfo_error ( EINFO_EIO_COMPLETED )
89 #define EINFO_EIO_COMPLETED \
90 __einfo_uniqify ( EINFO_EIO, 0x0f, "Completed" )
91 #define EIO_SENSE( key ) \
92 EUNIQ ( EINFO_EIO, (key), EIO_NO_SENSE, EIO_RECOVERED_ERROR, \
93 EIO_NOT_READY, EIO_MEDIUM_ERROR, EIO_HARDWARE_ERROR, \
94 EIO_ILLEGAL_REQUEST, EIO_UNIT_ATTENTION, \
95 EIO_DATA_PROTECT, EIO_BLANK_CHECK, EIO_VENDOR_SPECIFIC, \
96 EIO_COPY_ABORTED, EIO_ABORTED_COMMAND, EIO_RESERVED, \
97 EIO_VOLUME_OVERFLOW, EIO_MISCOMPARE, EIO_COMPLETED )
99 /******************************************************************************
103 ******************************************************************************
109 * @v lun_string LUN string representation
110 * @v lun LUN to fill in
111 * @ret rc Return status code
113 int scsi_parse_lun ( const char *lun_string, struct scsi_lun *lun ) {
117 memset ( lun, 0, sizeof ( *lun ) );
119 p = ( char * ) lun_string;
120 for ( i = 0 ; i < 4 ; i++ ) {
121 lun->u16[i] = htons ( strtoul ( p, &p, 16 ) );
136 * Parse SCSI sense data
138 * @v data Raw sense data
139 * @v len Length of raw sense data
140 * @v sense Descriptor-format sense data to fill in
142 void scsi_parse_sense ( const void *data, size_t len,
143 struct scsi_sns_descriptor *sense ) {
144 const union scsi_sns *sns = data;
146 /* Avoid returning uninitialised data */
147 memset ( sense, 0, sizeof ( *sense ) );
149 /* Copy, assuming descriptor-format data */
150 if ( len < sizeof ( sns->desc ) )
152 memcpy ( sense, &sns->desc, sizeof ( *sense ) );
154 /* Convert fixed-format to descriptor-format, if applicable */
155 if ( len < sizeof ( sns->fixed ) )
157 if ( ! SCSI_SENSE_FIXED ( sns->code ) )
159 sense->additional = sns->fixed.additional;
162 /******************************************************************************
166 ******************************************************************************
172 * @v control SCSI control interface
173 * @v data SCSI data interface
174 * @v command SCSI command
175 * @ret tag Command tag, or negative error
177 int scsi_command ( struct interface *control, struct interface *data,
178 struct scsi_cmd *command ) {
179 struct interface *dest;
180 scsi_command_TYPE ( void * ) *op =
181 intf_get_dest_op ( control, scsi_command, &dest );
182 void *object = intf_object ( dest );
186 tap = op ( object, data, command );
188 /* Default is to fail to issue the command */
197 * Report SCSI response
199 * @v interface SCSI command interface
200 * @v response SCSI response
202 void scsi_response ( struct interface *intf, struct scsi_rsp *response ) {
203 struct interface *dest;
204 scsi_response_TYPE ( void * ) *op =
205 intf_get_dest_op ( intf, scsi_response, &dest );
206 void *object = intf_object ( dest );
209 op ( object, response );
211 /* Default is to ignore the response */
217 /******************************************************************************
219 * SCSI devices and commands
221 ******************************************************************************
226 /** Reference count */
227 struct refcnt refcnt;
228 /** Block control interface */
229 struct interface block;
230 /** SCSI control interface */
231 struct interface scsi;
238 /** TEST UNIT READY interface */
239 struct interface ready;
240 /** TEST UNIT READY process */
241 struct process process;
243 /** List of commands */
244 struct list_head cmds;
247 /** SCSI device flags */
248 enum scsi_device_flags {
249 /** TEST UNIT READY has been issued */
250 SCSIDEV_UNIT_TESTED = 0x0001,
251 /** TEST UNIT READY has completed successfully */
252 SCSIDEV_UNIT_READY = 0x0002,
255 /** A SCSI command */
256 struct scsi_command {
257 /** Reference count */
258 struct refcnt refcnt;
260 struct scsi_device *scsidev;
261 /** List of SCSI commands */
262 struct list_head list;
264 /** Block data interface */
265 struct interface block;
266 /** SCSI data interface */
267 struct interface scsi;
270 struct scsi_command_type *type;
271 /** Starting logical block address */
273 /** Number of blocks */
277 /** Length of data buffer */
283 unsigned int retries;
289 /** A SCSI command type */
290 struct scsi_command_type {
293 /** Additional working space */
296 * Construct SCSI command IU
298 * @v scsicmd SCSI command
299 * @v command SCSI command IU
301 void ( * cmd ) ( struct scsi_command *scsicmd,
302 struct scsi_cmd *command );
304 * Handle SCSI command completion
306 * @v scsicmd SCSI command
307 * @v rc Reason for completion
309 void ( * done ) ( struct scsi_command *scsicmd, int rc );
313 * Get reference to SCSI device
315 * @v scsidev SCSI device
316 * @ret scsidev SCSI device
318 static inline __attribute__ (( always_inline )) struct scsi_device *
319 scsidev_get ( struct scsi_device *scsidev ) {
320 ref_get ( &scsidev->refcnt );
325 * Drop reference to SCSI device
327 * @v scsidev SCSI device
329 static inline __attribute__ (( always_inline )) void
330 scsidev_put ( struct scsi_device *scsidev ) {
331 ref_put ( &scsidev->refcnt );
335 * Get reference to SCSI command
337 * @v scsicmd SCSI command
338 * @ret scsicmd SCSI command
340 static inline __attribute__ (( always_inline )) struct scsi_command *
341 scsicmd_get ( struct scsi_command *scsicmd ) {
342 ref_get ( &scsicmd->refcnt );
347 * Drop reference to SCSI command
349 * @v scsicmd SCSI command
351 static inline __attribute__ (( always_inline )) void
352 scsicmd_put ( struct scsi_command *scsicmd ) {
353 ref_put ( &scsicmd->refcnt );
357 * Get SCSI command private data
359 * @v scsicmd SCSI command
360 * @ret priv Private data
362 static inline __attribute__ (( always_inline )) void *
363 scsicmd_priv ( struct scsi_command *scsicmd ) {
364 return scsicmd->priv;
370 * @v refcnt Reference count
372 static void scsicmd_free ( struct refcnt *refcnt ) {
373 struct scsi_command *scsicmd =
374 container_of ( refcnt, struct scsi_command, refcnt );
376 /* Remove from list of commands */
377 list_del ( &scsicmd->list );
378 scsidev_put ( scsicmd->scsidev );
387 * @v scsicmd SCSI command
388 * @v rc Reason for close
390 static void scsicmd_close ( struct scsi_command *scsicmd, int rc ) {
391 struct scsi_device *scsidev = scsicmd->scsidev;
394 DBGC ( scsidev, "SCSI %p tag %08x closed: %s\n",
395 scsidev, scsicmd->tag, strerror ( rc ) );
398 /* Shut down interfaces */
399 intf_shutdown ( &scsicmd->scsi, rc );
400 intf_shutdown ( &scsicmd->block, rc );
404 * Construct and issue SCSI command
406 * @ret rc Return status code
408 static int scsicmd_command ( struct scsi_command *scsicmd ) {
409 struct scsi_device *scsidev = scsicmd->scsidev;
410 struct scsi_cmd command;
414 /* Construct command */
415 memset ( &command, 0, sizeof ( command ) );
416 memcpy ( &command.lun, &scsidev->lun, sizeof ( command.lun ) );
417 scsicmd->type->cmd ( scsicmd, &command );
420 if ( ( tag = scsi_command ( &scsidev->scsi, &scsicmd->scsi,
423 DBGC ( scsidev, "SCSI %p could not issue command: %s\n",
424 scsidev, strerror ( rc ) );
429 if ( scsicmd->tag ) {
430 DBGC ( scsidev, "SCSI %p tag %08x is now tag %08x\n",
431 scsidev, scsicmd->tag, tag );
434 DBGC2 ( scsidev, "SCSI %p tag %08x %s " SCSI_CDB_FORMAT "\n",
435 scsidev, scsicmd->tag, scsicmd->type->name,
436 SCSI_CDB_DATA ( command.cdb ) );
442 * Handle SCSI command completion
444 * @v scsicmd SCSI command
445 * @v rc Reason for close
447 static void scsicmd_done ( struct scsi_command *scsicmd, int rc ) {
448 struct scsi_device *scsidev = scsicmd->scsidev;
450 /* Restart SCSI interface */
451 intf_restart ( &scsicmd->scsi, rc );
453 /* SCSI targets have an annoying habit of returning occasional
454 * pointless "error" messages such as "power-on occurred", so
455 * we have to be prepared to retry commands.
457 if ( ( rc != 0 ) && ( scsicmd->retries++ < SCSICMD_MAX_RETRIES ) ) {
459 DBGC ( scsidev, "SCSI %p tag %08x failed: %s\n",
460 scsidev, scsicmd->tag, strerror ( rc ) );
461 DBGC ( scsidev, "SCSI %p tag %08x retrying (retry %d)\n",
462 scsidev, scsicmd->tag, scsicmd->retries );
463 if ( ( rc = scsicmd_command ( scsicmd ) ) == 0 )
467 /* If we didn't (successfully) reissue the command, hand over
468 * to the command completion handler.
470 scsicmd->type->done ( scsicmd, rc );
474 * Handle SCSI response
476 * @v scsicmd SCSI command
477 * @v response SCSI response
479 static void scsicmd_response ( struct scsi_command *scsicmd,
480 struct scsi_rsp *response ) {
481 struct scsi_device *scsidev = scsicmd->scsidev;
486 if ( response->status == 0 ) {
487 scsicmd_done ( scsicmd, 0 );
489 DBGC ( scsidev, "SCSI %p tag %08x status %02x",
490 scsidev, scsicmd->tag, response->status );
491 if ( response->overrun > 0 ) {
492 overrun = response->overrun;
493 DBGC ( scsidev, " overrun +%zd", overrun );
494 } else if ( response->overrun < 0 ) {
495 underrun = -(response->overrun);
496 DBGC ( scsidev, " underrun -%zd", underrun );
498 DBGC ( scsidev, " sense %02x key %02x additional %04x\n",
499 ( response->sense.code & SCSI_SENSE_CODE_MASK ),
500 ( response->sense.key & SCSI_SENSE_KEY_MASK ),
501 ntohs ( response->sense.additional ) );
503 /* Construct error number from sense data */
504 rc = -EIO_SENSE ( response->sense.key & SCSI_SENSE_KEY_MASK );
505 scsicmd_done ( scsicmd, rc );
510 * Construct SCSI READ command
512 * @v scsicmd SCSI command
513 * @v command SCSI command IU
515 static void scsicmd_read_cmd ( struct scsi_command *scsicmd,
516 struct scsi_cmd *command ) {
518 if ( ( scsicmd->lba + scsicmd->count ) > SCSI_MAX_BLOCK_10 ) {
520 command->cdb.read16.opcode = SCSI_OPCODE_READ_16;
521 command->cdb.read16.lba = cpu_to_be64 ( scsicmd->lba );
522 command->cdb.read16.len = cpu_to_be32 ( scsicmd->count );
525 command->cdb.read10.opcode = SCSI_OPCODE_READ_10;
526 command->cdb.read10.lba = cpu_to_be32 ( scsicmd->lba );
527 command->cdb.read10.len = cpu_to_be16 ( scsicmd->count );
529 command->data_in = scsicmd->buffer;
530 command->data_in_len = scsicmd->len;
533 /** SCSI READ command type */
534 static struct scsi_command_type scsicmd_read = {
536 .cmd = scsicmd_read_cmd,
537 .done = scsicmd_close,
541 * Construct SCSI WRITE command
543 * @v scsicmd SCSI command
544 * @v command SCSI command IU
546 static void scsicmd_write_cmd ( struct scsi_command *scsicmd,
547 struct scsi_cmd *command ) {
549 if ( ( scsicmd->lba + scsicmd->count ) > SCSI_MAX_BLOCK_10 ) {
551 command->cdb.write16.opcode = SCSI_OPCODE_WRITE_16;
552 command->cdb.write16.lba = cpu_to_be64 ( scsicmd->lba );
553 command->cdb.write16.len = cpu_to_be32 ( scsicmd->count );
556 command->cdb.write10.opcode = SCSI_OPCODE_WRITE_10;
557 command->cdb.write10.lba = cpu_to_be32 ( scsicmd->lba );
558 command->cdb.write10.len = cpu_to_be16 ( scsicmd->count );
560 command->data_out = scsicmd->buffer;
561 command->data_out_len = scsicmd->len;
564 /** SCSI WRITE command type */
565 static struct scsi_command_type scsicmd_write = {
567 .cmd = scsicmd_write_cmd,
568 .done = scsicmd_close,
571 /** SCSI READ CAPACITY private data */
572 struct scsi_read_capacity_private {
573 /** Use READ CAPACITY (16) */
575 /** Data buffer for READ CAPACITY commands */
577 /** Data buffer for READ CAPACITY (10) */
578 struct scsi_capacity_10 capacity10;
579 /** Data buffer for READ CAPACITY (16) */
580 struct scsi_capacity_16 capacity16;
585 * Construct SCSI READ CAPACITY command
587 * @v scsicmd SCSI command
588 * @v command SCSI command IU
590 static void scsicmd_read_capacity_cmd ( struct scsi_command *scsicmd,
591 struct scsi_cmd *command ) {
592 struct scsi_read_capacity_private *priv = scsicmd_priv ( scsicmd );
593 struct scsi_cdb_read_capacity_16 *readcap16 = &command->cdb.readcap16;
594 struct scsi_cdb_read_capacity_10 *readcap10 = &command->cdb.readcap10;
595 struct scsi_capacity_16 *capacity16 = &priv->capacity.capacity16;
596 struct scsi_capacity_10 *capacity10 = &priv->capacity.capacity10;
599 /* Use READ CAPACITY (16) */
600 readcap16->opcode = SCSI_OPCODE_SERVICE_ACTION_IN;
601 readcap16->service_action =
602 SCSI_SERVICE_ACTION_READ_CAPACITY_16;
603 readcap16->len = cpu_to_be32 ( sizeof ( *capacity16 ) );
604 command->data_in = virt_to_user ( capacity16 );
605 command->data_in_len = sizeof ( *capacity16 );
607 /* Use READ CAPACITY (10) */
608 readcap10->opcode = SCSI_OPCODE_READ_CAPACITY_10;
609 command->data_in = virt_to_user ( capacity10 );
610 command->data_in_len = sizeof ( *capacity10 );
615 * Handle SCSI READ CAPACITY command completion
617 * @v scsicmd SCSI command
618 * @v rc Reason for completion
620 static void scsicmd_read_capacity_done ( struct scsi_command *scsicmd,
622 struct scsi_read_capacity_private *priv = scsicmd_priv ( scsicmd );
623 struct scsi_capacity_16 *capacity16 = &priv->capacity.capacity16;
624 struct scsi_capacity_10 *capacity10 = &priv->capacity.capacity10;
625 struct block_device_capacity capacity;
627 /* Close if command failed */
629 scsicmd_close ( scsicmd, rc );
633 /* Extract capacity */
635 capacity.blocks = ( be64_to_cpu ( capacity16->lba ) + 1 );
636 capacity.blksize = be32_to_cpu ( capacity16->blksize );
638 capacity.blocks = ( be32_to_cpu ( capacity10->lba ) + 1 );
639 capacity.blksize = be32_to_cpu ( capacity10->blksize );
641 /* If capacity range was exceeded (i.e. capacity.lba
642 * was 0xffffffff, meaning that blockdev->blocks is
643 * now zero), use READ CAPACITY (16) instead. READ
644 * CAPACITY (16) is not mandatory, so we can't just
645 * use it straight off.
647 if ( capacity.blocks == 0 ) {
649 if ( ( rc = scsicmd_command ( scsicmd ) ) != 0 ) {
650 scsicmd_close ( scsicmd, rc );
656 capacity.max_count = -1U;
658 /* Return capacity to caller */
659 block_capacity ( &scsicmd->block, &capacity );
662 scsicmd_close ( scsicmd, 0 );
665 /** SCSI READ CAPACITY command type */
666 static struct scsi_command_type scsicmd_read_capacity = {
667 .name = "READ CAPACITY",
668 .priv_len = sizeof ( struct scsi_read_capacity_private ),
669 .cmd = scsicmd_read_capacity_cmd,
670 .done = scsicmd_read_capacity_done,
674 * Construct SCSI TEST UNIT READY command
676 * @v scsicmd SCSI command
677 * @v command SCSI command IU
679 static void scsicmd_test_unit_ready_cmd ( struct scsi_command *scsicmd __unused,
680 struct scsi_cmd *command ) {
681 struct scsi_cdb_test_unit_ready *testready = &command->cdb.testready;
683 testready->opcode = SCSI_OPCODE_TEST_UNIT_READY;
686 /** SCSI TEST UNIT READY command type */
687 static struct scsi_command_type scsicmd_test_unit_ready = {
688 .name = "TEST UNIT READY",
689 .cmd = scsicmd_test_unit_ready_cmd,
690 .done = scsicmd_close,
693 /** SCSI command block interface operations */
694 static struct interface_operation scsicmd_block_op[] = {
695 INTF_OP ( intf_close, struct scsi_command *, scsicmd_close ),
698 /** SCSI command block interface descriptor */
699 static struct interface_descriptor scsicmd_block_desc =
700 INTF_DESC_PASSTHRU ( struct scsi_command, block,
701 scsicmd_block_op, scsi );
703 /** SCSI command SCSI interface operations */
704 static struct interface_operation scsicmd_scsi_op[] = {
705 INTF_OP ( intf_close, struct scsi_command *, scsicmd_done ),
706 INTF_OP ( scsi_response, struct scsi_command *, scsicmd_response ),
709 /** SCSI command SCSI interface descriptor */
710 static struct interface_descriptor scsicmd_scsi_desc =
711 INTF_DESC_PASSTHRU ( struct scsi_command, scsi,
712 scsicmd_scsi_op, block );
715 * Create SCSI command
717 * @v scsidev SCSI device
718 * @v block Block data interface
719 * @v type SCSI command type
720 * @v lba Starting logical block address
721 * @v count Number of blocks to transfer
722 * @v buffer Data buffer
723 * @v len Length of data buffer
724 * @ret rc Return status code
726 static int scsidev_command ( struct scsi_device *scsidev,
727 struct interface *block,
728 struct scsi_command_type *type,
729 uint64_t lba, unsigned int count,
730 userptr_t buffer, size_t len ) {
731 struct scsi_command *scsicmd;
734 /* Allocate and initialise structure */
735 scsicmd = zalloc ( sizeof ( *scsicmd ) + type->priv_len );
740 ref_init ( &scsicmd->refcnt, scsicmd_free );
741 intf_init ( &scsicmd->block, &scsicmd_block_desc, &scsicmd->refcnt );
742 intf_init ( &scsicmd->scsi, &scsicmd_scsi_desc,
744 scsicmd->scsidev = scsidev_get ( scsidev );
745 list_add ( &scsicmd->list, &scsidev->cmds );
746 scsicmd->type = type;
748 scsicmd->count = count;
749 scsicmd->buffer = buffer;
752 /* Issue SCSI command */
753 if ( ( rc = scsicmd_command ( scsicmd ) ) != 0 )
756 /* Attach to parent interface, mortalise self, and return */
757 intf_plug_plug ( &scsicmd->block, block );
758 ref_put ( &scsicmd->refcnt );
762 scsicmd_close ( scsicmd, rc );
763 ref_put ( &scsicmd->refcnt );
769 * Issue SCSI block read
771 * @v scsidev SCSI device
772 * @v block Block data interface
773 * @v lba Starting logical block address
774 * @v count Number of blocks to transfer
775 * @v buffer Data buffer
776 * @v len Length of data buffer
777 * @ret rc Return status code
780 static int scsidev_read ( struct scsi_device *scsidev,
781 struct interface *block,
782 uint64_t lba, unsigned int count,
783 userptr_t buffer, size_t len ) {
784 return scsidev_command ( scsidev, block, &scsicmd_read,
785 lba, count, buffer, len );
789 * Issue SCSI block write
791 * @v scsidev SCSI device
792 * @v block Block data interface
793 * @v lba Starting logical block address
794 * @v count Number of blocks to transfer
795 * @v buffer Data buffer
796 * @v len Length of data buffer
797 * @ret rc Return status code
799 static int scsidev_write ( struct scsi_device *scsidev,
800 struct interface *block,
801 uint64_t lba, unsigned int count,
802 userptr_t buffer, size_t len ) {
803 return scsidev_command ( scsidev, block, &scsicmd_write,
804 lba, count, buffer, len );
808 * Read SCSI device capacity
810 * @v scsidev SCSI device
811 * @v block Block data interface
812 * @ret rc Return status code
814 static int scsidev_read_capacity ( struct scsi_device *scsidev,
815 struct interface *block ) {
816 return scsidev_command ( scsidev, block, &scsicmd_read_capacity,
821 * Test to see if SCSI device is ready
823 * @v scsidev SCSI device
824 * @v block Block data interface
825 * @ret rc Return status code
827 static int scsidev_test_unit_ready ( struct scsi_device *scsidev,
828 struct interface *block ) {
829 return scsidev_command ( scsidev, block, &scsicmd_test_unit_ready,
834 * Check SCSI device flow-control window
836 * @v scsidev SCSI device
837 * @ret len Length of window
839 static size_t scsidev_window ( struct scsi_device *scsidev ) {
841 /* Refuse commands until unit is confirmed ready */
842 if ( ! ( scsidev->flags & SCSIDEV_UNIT_READY ) )
845 return xfer_window ( &scsidev->scsi );
851 * @v scsidev SCSI device
852 * @v rc Reason for close
854 static void scsidev_close ( struct scsi_device *scsidev, int rc ) {
855 struct scsi_command *scsicmd;
856 struct scsi_command *tmp;
859 process_del ( &scsidev->process );
861 /* Shut down interfaces */
862 intf_shutdown ( &scsidev->block, rc );
863 intf_shutdown ( &scsidev->scsi, rc );
864 intf_shutdown ( &scsidev->ready, rc );
866 /* Shut down any remaining commands */
867 list_for_each_entry_safe ( scsicmd, tmp, &scsidev->cmds, list ) {
868 scsicmd_get ( scsicmd );
869 scsicmd_close ( scsicmd, rc );
870 scsicmd_put ( scsicmd );
874 /** SCSI device block interface operations */
875 static struct interface_operation scsidev_block_op[] = {
876 INTF_OP ( xfer_window, struct scsi_device *, scsidev_window ),
877 INTF_OP ( block_read, struct scsi_device *, scsidev_read ),
878 INTF_OP ( block_write, struct scsi_device *, scsidev_write ),
879 INTF_OP ( block_read_capacity, struct scsi_device *,
880 scsidev_read_capacity ),
881 INTF_OP ( intf_close, struct scsi_device *, scsidev_close ),
884 /** SCSI device block interface descriptor */
885 static struct interface_descriptor scsidev_block_desc =
886 INTF_DESC_PASSTHRU ( struct scsi_device, block,
887 scsidev_block_op, scsi );
890 * Handle SCSI TEST UNIT READY response
892 * @v scsidev SCSI device
893 * @v rc Reason for close
895 static void scsidev_ready ( struct scsi_device *scsidev, int rc ) {
897 /* Shut down interface */
898 intf_shutdown ( &scsidev->ready, rc );
900 /* Close device on failure */
902 DBGC ( scsidev, "SCSI %p not ready: %s\n",
903 scsidev, strerror ( rc ) );
904 scsidev_close ( scsidev, rc );
908 /* Mark device as ready */
909 scsidev->flags |= SCSIDEV_UNIT_READY;
910 xfer_window_changed ( &scsidev->block );
911 DBGC ( scsidev, "SCSI %p unit is ready\n", scsidev );
914 /** SCSI device TEST UNIT READY interface operations */
915 static struct interface_operation scsidev_ready_op[] = {
916 INTF_OP ( intf_close, struct scsi_device *, scsidev_ready ),
919 /** SCSI device TEST UNIT READY interface descriptor */
920 static struct interface_descriptor scsidev_ready_desc =
921 INTF_DESC ( struct scsi_device, ready, scsidev_ready_op );
924 * SCSI TEST UNIT READY process
926 * @v scsidev SCSI device
928 static void scsidev_step ( struct scsi_device *scsidev ) {
931 /* Do nothing if we have already issued TEST UNIT READY */
932 if ( scsidev->flags & SCSIDEV_UNIT_TESTED )
935 /* Wait until underlying SCSI device is ready */
936 if ( xfer_window ( &scsidev->scsi ) == 0 )
939 DBGC ( scsidev, "SCSI %p waiting for unit to become ready\n",
942 /* Mark TEST UNIT READY as sent */
943 scsidev->flags |= SCSIDEV_UNIT_TESTED;
945 /* Issue TEST UNIT READY command */
946 if ( ( rc = scsidev_test_unit_ready ( scsidev, &scsidev->ready )) !=0){
947 scsidev_close ( scsidev, rc );
952 /** SCSI device SCSI interface operations */
953 static struct interface_operation scsidev_scsi_op[] = {
954 INTF_OP ( xfer_window_changed, struct scsi_device *, scsidev_step ),
955 INTF_OP ( intf_close, struct scsi_device *, scsidev_close ),
958 /** SCSI device SCSI interface descriptor */
959 static struct interface_descriptor scsidev_scsi_desc =
960 INTF_DESC_PASSTHRU ( struct scsi_device, scsi,
961 scsidev_scsi_op, block );
963 /** SCSI device process descriptor */
964 static struct process_descriptor scsidev_process_desc =
965 PROC_DESC_ONCE ( struct scsi_device, process, scsidev_step );
970 * @v block Block control interface
971 * @v scsi SCSI control interface
973 * @ret rc Return status code
975 int scsi_open ( struct interface *block, struct interface *scsi,
976 struct scsi_lun *lun ) {
977 struct scsi_device *scsidev;
979 /* Allocate and initialise structure */
980 scsidev = zalloc ( sizeof ( *scsidev ) );
983 ref_init ( &scsidev->refcnt, NULL );
984 intf_init ( &scsidev->block, &scsidev_block_desc, &scsidev->refcnt );
985 intf_init ( &scsidev->scsi, &scsidev_scsi_desc, &scsidev->refcnt );
986 intf_init ( &scsidev->ready, &scsidev_ready_desc, &scsidev->refcnt );
987 process_init ( &scsidev->process, &scsidev_process_desc,
989 INIT_LIST_HEAD ( &scsidev->cmds );
990 memcpy ( &scsidev->lun, lun, sizeof ( scsidev->lun ) );
991 DBGC ( scsidev, "SCSI %p created for LUN " SCSI_LUN_FORMAT "\n",
992 scsidev, SCSI_LUN_DATA ( scsidev->lun ) );
994 /* Attach to SCSI and parent interfaces, mortalise self, and return */
995 intf_plug_plug ( &scsidev->scsi, scsi );
996 intf_plug_plug ( &scsidev->block, block );
997 ref_put ( &scsidev->refcnt );