|
@@ -36,6 +36,63 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
36
|
36
|
/** Maximum number of command retries */
|
37
|
37
|
#define SCSICMD_MAX_RETRIES 10
|
38
|
38
|
|
|
39
|
+/* Error numbers generated by SCSI sense data */
|
|
40
|
+#define EIO_NO_SENSE __einfo_error ( EINFO_EIO_NO_SENSE )
|
|
41
|
+#define EINFO_EIO_NO_SENSE \
|
|
42
|
+ __einfo_uniqify ( EINFO_EIO, 0x00, "No sense" )
|
|
43
|
+#define EIO_RECOVERED_ERROR __einfo_error ( EINFO_EIO_RECOVERED_ERROR )
|
|
44
|
+#define EINFO_EIO_RECOVERED_ERROR \
|
|
45
|
+ __einfo_uniqify ( EINFO_EIO, 0x01, "Recovered error" )
|
|
46
|
+#define EIO_NOT_READY __einfo_error ( EINFO_EIO_NOT_READY )
|
|
47
|
+#define EINFO_EIO_NOT_READY \
|
|
48
|
+ __einfo_uniqify ( EINFO_EIO, 0x02, "Not ready" )
|
|
49
|
+#define EIO_MEDIUM_ERROR __einfo_error ( EINFO_EIO_MEDIUM_ERROR )
|
|
50
|
+#define EINFO_EIO_MEDIUM_ERROR \
|
|
51
|
+ __einfo_uniqify ( EINFO_EIO, 0x03, "Medium error" )
|
|
52
|
+#define EIO_HARDWARE_ERROR __einfo_error ( EINFO_EIO_HARDWARE_ERROR )
|
|
53
|
+#define EINFO_EIO_HARDWARE_ERROR \
|
|
54
|
+ __einfo_uniqify ( EINFO_EIO, 0x04, "Hardware error" )
|
|
55
|
+#define EIO_ILLEGAL_REQUEST __einfo_error ( EINFO_EIO_ILLEGAL_REQUEST )
|
|
56
|
+#define EINFO_EIO_ILLEGAL_REQUEST \
|
|
57
|
+ __einfo_uniqify ( EINFO_EIO, 0x05, "Illegal request" )
|
|
58
|
+#define EIO_UNIT_ATTENTION __einfo_error ( EINFO_EIO_UNIT_ATTENTION )
|
|
59
|
+#define EINFO_EIO_UNIT_ATTENTION \
|
|
60
|
+ __einfo_uniqify ( EINFO_EIO, 0x06, "Unit attention" )
|
|
61
|
+#define EIO_DATA_PROTECT __einfo_error ( EINFO_EIO_DATA_PROTECT )
|
|
62
|
+#define EINFO_EIO_DATA_PROTECT \
|
|
63
|
+ __einfo_uniqify ( EINFO_EIO, 0x07, "Data protect" )
|
|
64
|
+#define EIO_BLANK_CHECK __einfo_error ( EINFO_EIO_BLANK_CHECK )
|
|
65
|
+#define EINFO_EIO_BLANK_CHECK \
|
|
66
|
+ __einfo_uniqify ( EINFO_EIO, 0x08, "Blank check" )
|
|
67
|
+#define EIO_VENDOR_SPECIFIC __einfo_error ( EINFO_EIO_VENDOR_SPECIFIC )
|
|
68
|
+#define EINFO_EIO_VENDOR_SPECIFIC \
|
|
69
|
+ __einfo_uniqify ( EINFO_EIO, 0x09, "Vendor specific" )
|
|
70
|
+#define EIO_COPY_ABORTED __einfo_error ( EINFO_EIO_COPY_ABORTED )
|
|
71
|
+#define EINFO_EIO_COPY_ABORTED \
|
|
72
|
+ __einfo_uniqify ( EINFO_EIO, 0x0a, "Copy aborted" )
|
|
73
|
+#define EIO_ABORTED_COMMAND __einfo_error ( EINFO_EIO_ABORTED_COMMAND )
|
|
74
|
+#define EINFO_EIO_ABORTED_COMMAND \
|
|
75
|
+ __einfo_uniqify ( EINFO_EIO, 0x0b, "Aborted command" )
|
|
76
|
+#define EIO_RESERVED __einfo_error ( EINFO_EIO_RESERVED )
|
|
77
|
+#define EINFO_EIO_RESERVED \
|
|
78
|
+ __einfo_uniqify ( EINFO_EIO, 0x0c, "Reserved" )
|
|
79
|
+#define EIO_VOLUME_OVERFLOW __einfo_error ( EINFO_EIO_VOLUME_OVERFLOW )
|
|
80
|
+#define EINFO_EIO_VOLUME_OVERFLOW \
|
|
81
|
+ __einfo_uniqify ( EINFO_EIO, 0x0d, "Volume overflow" )
|
|
82
|
+#define EIO_MISCOMPARE __einfo_error ( EINFO_EIO_MISCOMPARE )
|
|
83
|
+#define EINFO_EIO_MISCOMPARE \
|
|
84
|
+ __einfo_uniqify ( EINFO_EIO, 0x0e, "Miscompare" )
|
|
85
|
+#define EIO_COMPLETED __einfo_error ( EINFO_EIO_COMPLETED )
|
|
86
|
+#define EINFO_EIO_COMPLETED \
|
|
87
|
+ __einfo_uniqify ( EINFO_EIO, 0x0f, "Completed" )
|
|
88
|
+#define EIO_SENSE( key ) \
|
|
89
|
+ EUNIQ ( EIO, (key), EIO_NO_SENSE, EIO_RECOVERED_ERROR, \
|
|
90
|
+ EIO_NOT_READY, EIO_MEDIUM_ERROR, EIO_HARDWARE_ERROR, \
|
|
91
|
+ EIO_ILLEGAL_REQUEST, EIO_UNIT_ATTENTION, \
|
|
92
|
+ EIO_DATA_PROTECT, EIO_BLANK_CHECK, EIO_VENDOR_SPECIFIC, \
|
|
93
|
+ EIO_COPY_ABORTED, EIO_ABORTED_COMMAND, EIO_RESERVED, \
|
|
94
|
+ EIO_VOLUME_OVERFLOW, EIO_MISCOMPARE, EIO_COMPLETED )
|
|
95
|
+
|
39
|
96
|
/******************************************************************************
|
40
|
97
|
*
|
41
|
98
|
* Utility functions
|
|
@@ -379,6 +436,7 @@ static void scsicmd_response ( struct scsi_command *scsicmd,
|
379
|
436
|
struct scsi_device *scsidev = scsicmd->scsidev;
|
380
|
437
|
size_t overrun;
|
381
|
438
|
size_t underrun;
|
|
439
|
+ int rc;
|
382
|
440
|
|
383
|
441
|
if ( response->status == 0 ) {
|
384
|
442
|
scsicmd_done ( scsicmd, 0 );
|
|
@@ -395,7 +453,10 @@ static void scsicmd_response ( struct scsi_command *scsicmd,
|
395
|
453
|
DBGC ( scsidev, " sense %02x:%02x:%08x\n",
|
396
|
454
|
response->sense.code, response->sense.key,
|
397
|
455
|
ntohl ( response->sense.info ) );
|
398
|
|
- scsicmd_done ( scsicmd, -EIO );
|
|
456
|
+
|
|
457
|
+ /* Construct error number from sense data */
|
|
458
|
+ rc = -EIO_SENSE ( response->sense.key & SCSI_SENSE_KEY_MASK );
|
|
459
|
+ scsicmd_done ( scsicmd, rc );
|
399
|
460
|
}
|
400
|
461
|
}
|
401
|
462
|
|