summaryrefslogtreecommitdiff
path: root/sysutils/udfclient/files/patch-uscsi_subr.c
blob: 00864aef56c511038a92be212761879e8f926127 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--- uscsi_subr.c.orig	2017-05-25 17:18:25 UTC
+++ uscsi_subr.c
@@ -412,6 +412,7 @@ uscsi_command(int flags, struct uscsi_dev *disc,
 	struct scsi_sense_data *cam_sense_data;
 	union ccb ccb;
 	uint32_t cam_sense;
+	u_int sense_len;
 	uint8_t *keypos;
 	int camflags;
 
@@ -468,17 +469,33 @@ uscsi_command(int flags, struct uscsi_dev *disc,
 
 	/* print sense info */
 	cam_sense_data = &ccb.csio.sense_data;
+	sense_len = ccb.csio.sense_len - ccb.csio.sense_resid;
 	if (uscsi_sense) {
+#if __FreeBSD_version > 900043
+		int error_code, sense_key;
+		uint8_t sks[3];
+
+		scsi_extract_sense_len(cam_sense_data, sense_len,
+		    &error_code, &sense_key,
+		    &uscsi_sense->asc, &uscsi_sense->ascq, /*show_errors*/ 0);
+
+		if ((scsi_get_sks(cam_sense_data, sense_len, sks) == 0)) {
+			uscsi_sense->skey_valid = 1;
+			uscsi_sense->sense_key  = (sks[1] << 8) | sks[2];
+		} else
+			uscsi_sense->skey_valid = 0;
+#else
 		uscsi_sense->asc  = cam_sense_data->add_sense_code;
 		uscsi_sense->ascq = cam_sense_data->add_sense_code_qual;
 		keypos  = cam_sense_data->sense_key_spec;
 		uscsi_sense->skey_valid =  keypos[0] & 128;
 		uscsi_sense->sense_key  = (keypos[1] << 8) | (keypos[2]);
+#endif
 	}
 
 	uscsi_print_sense((char *) disc->dev_name,
 		cmd, cmdlen,
-		(uint8_t *) cam_sense_data, 8 + cam_sense_data->extra_len, 1);
+		(uint8_t *) cam_sense_data, sense_len, 1);
 
 	return EFAULT;
 }