aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ipr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/ipr.c')
-rw-r--r--drivers/scsi/ipr.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 96b65b307dd0..7ed4eef8347b 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -54,7 +54,6 @@
54 * 54 *
55 */ 55 */
56 56
57#include <linux/config.h>
58#include <linux/fs.h> 57#include <linux/fs.h>
59#include <linux/init.h> 58#include <linux/init.h>
60#include <linux/types.h> 59#include <linux/types.h>
@@ -176,6 +175,8 @@ struct ipr_error_table_t ipr_error_table[] = {
176 "Qualified success"}, 175 "Qualified success"},
177 {0x01080000, 1, 1, 176 {0x01080000, 1, 1,
178 "FFFE: Soft device bus error recovered by the IOA"}, 177 "FFFE: Soft device bus error recovered by the IOA"},
178 {0x01088100, 0, 1,
179 "4101: Soft device bus fabric error"},
179 {0x01170600, 0, 1, 180 {0x01170600, 0, 1,
180 "FFF9: Device sector reassign successful"}, 181 "FFF9: Device sector reassign successful"},
181 {0x01170900, 0, 1, 182 {0x01170900, 0, 1,
@@ -226,6 +227,8 @@ struct ipr_error_table_t ipr_error_table[] = {
226 "3109: IOA timed out a device command"}, 227 "3109: IOA timed out a device command"},
227 {0x04088000, 0, 0, 228 {0x04088000, 0, 0,
228 "3120: SCSI bus is not operational"}, 229 "3120: SCSI bus is not operational"},
230 {0x04088100, 0, 1,
231 "4100: Hard device bus fabric error"},
229 {0x04118000, 0, 1, 232 {0x04118000, 0, 1,
230 "9000: IOA reserved area data check"}, 233 "9000: IOA reserved area data check"},
231 {0x04118100, 0, 1, 234 {0x04118100, 0, 1,
@@ -274,6 +277,14 @@ struct ipr_error_table_t ipr_error_table[] = {
274 "9091: Incorrect hardware configuration change has been detected"}, 277 "9091: Incorrect hardware configuration change has been detected"},
275 {0x04678000, 0, 1, 278 {0x04678000, 0, 1,
276 "9073: Invalid multi-adapter configuration"}, 279 "9073: Invalid multi-adapter configuration"},
280 {0x04678100, 0, 1,
281 "4010: Incorrect connection between cascaded expanders"},
282 {0x04678200, 0, 1,
283 "4020: Connections exceed IOA design limits"},
284 {0x04678300, 0, 1,
285 "4030: Incorrect multipath connection"},
286 {0x04679000, 0, 1,
287 "4110: Unsupported enclosure function"},
277 {0x046E0000, 0, 1, 288 {0x046E0000, 0, 1,
278 "FFF4: Command to logical unit failed"}, 289 "FFF4: Command to logical unit failed"},
279 {0x05240000, 1, 0, 290 {0x05240000, 1, 0,
@@ -298,6 +309,8 @@ struct ipr_error_table_t ipr_error_table[] = {
298 "9031: Array protection temporarily suspended, protection resuming"}, 309 "9031: Array protection temporarily suspended, protection resuming"},
299 {0x06040600, 0, 1, 310 {0x06040600, 0, 1,
300 "9040: Array protection temporarily suspended, protection resuming"}, 311 "9040: Array protection temporarily suspended, protection resuming"},
312 {0x06288000, 0, 1,
313 "3140: Device bus not ready to ready transition"},
301 {0x06290000, 0, 1, 314 {0x06290000, 0, 1,
302 "FFFB: SCSI bus was reset"}, 315 "FFFB: SCSI bus was reset"},
303 {0x06290500, 0, 0, 316 {0x06290500, 0, 0,
@@ -320,6 +333,16 @@ struct ipr_error_table_t ipr_error_table[] = {
320 "3150: SCSI bus configuration error"}, 333 "3150: SCSI bus configuration error"},
321 {0x06678100, 0, 1, 334 {0x06678100, 0, 1,
322 "9074: Asymmetric advanced function disk configuration"}, 335 "9074: Asymmetric advanced function disk configuration"},
336 {0x06678300, 0, 1,
337 "4040: Incomplete multipath connection between IOA and enclosure"},
338 {0x06678400, 0, 1,
339 "4041: Incomplete multipath connection between enclosure and device"},
340 {0x06678500, 0, 1,
341 "9075: Incomplete multipath connection between IOA and remote IOA"},
342 {0x06678600, 0, 1,
343 "9076: Configuration error, missing remote IOA"},
344 {0x06679100, 0, 1,
345 "4050: Enclosure does not support a required multipath function"},
323 {0x06690200, 0, 1, 346 {0x06690200, 0, 1,
324 "9041: Array protection temporarily suspended"}, 347 "9041: Array protection temporarily suspended"},
325 {0x06698200, 0, 1, 348 {0x06698200, 0, 1,
@@ -332,6 +355,10 @@ struct ipr_error_table_t ipr_error_table[] = {
332 "9072: Link not operational transition"}, 355 "9072: Link not operational transition"},
333 {0x066B8200, 0, 1, 356 {0x066B8200, 0, 1,
334 "9032: Array exposed but still protected"}, 357 "9032: Array exposed but still protected"},
358 {0x066B9100, 0, 1,
359 "4061: Multipath redundancy level got better"},
360 {0x066B9200, 0, 1,
361 "4060: Multipath redundancy level got worse"},
335 {0x07270000, 0, 0, 362 {0x07270000, 0, 0,
336 "Failure due to other device"}, 363 "Failure due to other device"},
337 {0x07278000, 0, 1, 364 {0x07278000, 0, 1,
@@ -4100,8 +4127,7 @@ static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
4100{ 4127{
4101 struct ipr_ioasa *ioasa = &ipr_cmd->ioasa; 4128 struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
4102 4129
4103 if ((be32_to_cpu(ioasa->ioasc_specific) & 4130 if ((be32_to_cpu(ioasa->ioasc_specific) & IPR_AUTOSENSE_VALID) == 0)
4104 (IPR_ADDITIONAL_STATUS_FMT | IPR_AUTOSENSE_VALID)) == 0)
4105 return 0; 4131 return 0;
4106 4132
4107 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data, 4133 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
@@ -4191,7 +4217,8 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
4191 case IPR_IOASC_NR_INIT_CMD_REQUIRED: 4217 case IPR_IOASC_NR_INIT_CMD_REQUIRED:
4192 break; 4218 break;
4193 default: 4219 default:
4194 scsi_cmd->result |= (DID_ERROR << 16); 4220 if (IPR_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR)
4221 scsi_cmd->result |= (DID_ERROR << 16);
4195 if (!ipr_is_vset_device(res) && !ipr_is_naca_model(res)) 4222 if (!ipr_is_vset_device(res) && !ipr_is_naca_model(res))
4196 res->needs_sync_complete = 1; 4223 res->needs_sync_complete = 1;
4197 break; 4224 break;
@@ -6429,7 +6456,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
6429 ioa_cfg->needs_hard_reset = 1; 6456 ioa_cfg->needs_hard_reset = 1;
6430 6457
6431 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); 6458 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
6432 rc = request_irq(pdev->irq, ipr_isr, SA_SHIRQ, IPR_NAME, ioa_cfg); 6459 rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg);
6433 6460
6434 if (rc) { 6461 if (rc) {
6435 dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n", 6462 dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n",