]>
Commit | Line | Data |
---|---|---|
82094b55 AF |
1 | From: Vijay Kumar <vijay.chauhan@lsi.com> |
2 | Date: Mon, 21 Sep 2009 15:00:22 +0200 | |
3 | Subject: scsi_dh_rdac: Include fixes from SLES10 SP3 | |
4 | References: bnc#539271 | |
5 | ||
6 | This patch updates the scsi_dh_rdac device handler with | |
7 | fixes already present in SLES10 SP3: | |
8 | ||
9 | 1) Adding sense 02/A1/02 in rdac_check_sense | |
10 | ||
11 | 2) Changing mode_select_handle_sense format to switch-case | |
12 | ||
13 | 3) Correcting entry for struct scsi_dh_devlist rdac; adding 3rd argument for | |
14 | {"LSI", "INF-01-00"} | |
15 | {"ENGENIO", "INF-01-00"} | |
16 | ||
17 | Signed-off-by: Vijay Kumar <vijay.chauhan@lsi.com> | |
18 | Signed-off-by: Hannes Reinecke <hare@suse.de> | |
19 | --- | |
20 | drivers/scsi/device_handler/scsi_dh_rdac.c | 48 +++++++++++++++++++-------- | |
21 | 1 files changed, 34 insertions(+), 14 deletions(-) | |
22 | ||
23 | diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c | |
24 | index 6d48426..0bd33ee 100644 | |
25 | --- a/drivers/scsi/device_handler/scsi_dh_rdac.c | |
26 | +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c | |
27 | @@ -449,27 +449,41 @@ static int mode_select_handle_sense(struct scsi_device *sdev, | |
28 | unsigned char *sensebuf) | |
29 | { | |
30 | struct scsi_sense_hdr sense_hdr; | |
31 | - int sense, err = SCSI_DH_IO, ret; | |
32 | + int err = SCSI_DH_IO, ret; | |
33 | ||
34 | ret = scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE, &sense_hdr); | |
35 | if (!ret) | |
36 | goto done; | |
37 | ||
38 | err = SCSI_DH_OK; | |
39 | - sense = (sense_hdr.sense_key << 16) | (sense_hdr.asc << 8) | | |
40 | - sense_hdr.ascq; | |
41 | - /* If it is retryable failure, submit the c9 inquiry again */ | |
42 | - if (sense_hdr.sense_key == 6 || sense == 0x59136 || sense == 0xb8b02) { | |
43 | - /* 0x59136 - Command lock contention | |
44 | - * 0xb8b02 - Quiescense achieved | |
45 | - * 0x6xxxx - Unit Attention | |
46 | - */ | |
47 | + | |
48 | + switch (sense_hdr.sense_key) { | |
49 | + case NO_SENSE: | |
50 | + case ABORTED_COMMAND: | |
51 | + case UNIT_ATTENTION: | |
52 | + err = SCSI_DH_RETRY; | |
53 | + break; | |
54 | + case NOT_READY: | |
55 | + if (sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x01) | |
56 | + /* LUN Not Ready and is in the Process | |
57 | + * of becoming ready | |
58 | + */ | |
59 | + err = SCSI_DH_RETRY; | |
60 | + break; | |
61 | + case ILLEGAL_REQUEST: | |
62 | + if (sense_hdr.asc == 0x91 && sense_hdr.ascq == 0x36) | |
63 | + /* | |
64 | + * Command Lock contention | |
65 | + */ | |
66 | err = SCSI_DH_RETRY; | |
67 | + break; | |
68 | + default: | |
69 | + sdev_printk(KERN_INFO, sdev, | |
70 | + "MODE_SELECT failed with sense %02x/%02x/%02x.\n", | |
71 | + sense_hdr.sense_key, sense_hdr.asc, sense_hdr.ascq); | |
72 | + | |
73 | } | |
74 | ||
75 | - if (sense) | |
76 | - sdev_printk(KERN_INFO, sdev, | |
77 | - "MODE_SELECT failed with sense 0x%x.\n", sense); | |
78 | done: | |
79 | return err; | |
80 | } | |
81 | @@ -566,6 +580,12 @@ static int rdac_check_sense(struct scsi_device *sdev, | |
82 | * Just retry and wait. | |
83 | */ | |
84 | return ADD_TO_MLQUEUE; | |
85 | + if (sense_hdr->asc == 0xA1 && sense_hdr->ascq == 0x02) | |
86 | + /* LUN Not Ready - Quiescense in progress | |
87 | + * or has been achieved | |
88 | + * Just retry. | |
89 | + */ | |
90 | + return ADD_TO_MLQUEUE; | |
91 | break; | |
92 | case ILLEGAL_REQUEST: | |
93 | if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) { | |
94 | @@ -615,8 +635,8 @@ static const struct scsi_dh_devlist rdac_dev_list[] = { | |
95 | {"DELL", "MD3000i", 0}, | |
96 | {"DELL", "MD32xx", 0}, | |
97 | {"DELL", "MD32xxi", 0}, | |
98 | - {"LSI", "INF-01-00"}, | |
99 | - {"ENGENIO", "INF-01-00"}, | |
100 | + {"LSI", "INF-01-00", 0}, | |
101 | + {"ENGENIO", "INF-01-00", 0}, | |
102 | {NULL, NULL, 0}, | |
103 | }; | |
104 | ||
105 | -- | |
106 | 1.5.3.2 | |
107 |