diff options
Diffstat (limited to 'drivers/scsi/ipr.c')
-rw-r--r-- | drivers/scsi/ipr.c | 37 |
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", |