diff options
-rw-r--r-- | drivers/scsi/ipr.h | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 1ad24df69d70..1e9c1227fdae 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
@@ -45,6 +45,7 @@ | |||
45 | * This can be adjusted at runtime through sysfs device attributes. | 45 | * This can be adjusted at runtime through sysfs device attributes. |
46 | */ | 46 | */ |
47 | #define IPR_MAX_CMD_PER_LUN 6 | 47 | #define IPR_MAX_CMD_PER_LUN 6 |
48 | #define IPR_MAX_CMD_PER_ATA_LUN 1 | ||
48 | 49 | ||
49 | /* | 50 | /* |
50 | * IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of | 51 | * IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of |
@@ -106,7 +107,7 @@ | |||
106 | #define IPR_IOA_BUS 0xff | 107 | #define IPR_IOA_BUS 0xff |
107 | #define IPR_IOA_TARGET 0xff | 108 | #define IPR_IOA_TARGET 0xff |
108 | #define IPR_IOA_LUN 0xff | 109 | #define IPR_IOA_LUN 0xff |
109 | #define IPR_MAX_NUM_BUSES 8 | 110 | #define IPR_MAX_NUM_BUSES 16 |
110 | #define IPR_MAX_BUS_TO_SCAN IPR_MAX_NUM_BUSES | 111 | #define IPR_MAX_BUS_TO_SCAN IPR_MAX_NUM_BUSES |
111 | 112 | ||
112 | #define IPR_NUM_RESET_RELOAD_RETRIES 3 | 113 | #define IPR_NUM_RESET_RELOAD_RETRIES 3 |
@@ -145,6 +146,7 @@ | |||
145 | #define IPR_LUN_RESET 0x40 | 146 | #define IPR_LUN_RESET 0x40 |
146 | #define IPR_TARGET_RESET 0x20 | 147 | #define IPR_TARGET_RESET 0x20 |
147 | #define IPR_BUS_RESET 0x10 | 148 | #define IPR_BUS_RESET 0x10 |
149 | #define IPR_ATA_PHY_RESET 0x80 | ||
148 | #define IPR_ID_HOST_RR_Q 0xC4 | 150 | #define IPR_ID_HOST_RR_Q 0xC4 |
149 | #define IPR_QUERY_IOA_CONFIG 0xC5 | 151 | #define IPR_QUERY_IOA_CONFIG 0xC5 |
150 | #define IPR_CANCEL_ALL_REQUESTS 0xCE | 152 | #define IPR_CANCEL_ALL_REQUESTS 0xCE |
@@ -295,7 +297,11 @@ struct ipr_std_inq_data { | |||
295 | }__attribute__ ((packed)); | 297 | }__attribute__ ((packed)); |
296 | 298 | ||
297 | struct ipr_config_table_entry { | 299 | struct ipr_config_table_entry { |
298 | u8 service_level; | 300 | u8 proto; |
301 | #define IPR_PROTO_SATA 0x02 | ||
302 | #define IPR_PROTO_SATA_ATAPI 0x03 | ||
303 | #define IPR_PROTO_SAS_STP 0x06 | ||
304 | #define IPR_PROTO_SAS_STP_ATAPI 0x07 | ||
299 | u8 array_id; | 305 | u8 array_id; |
300 | u8 flags; | 306 | u8 flags; |
301 | #define IPR_IS_IOA_RESOURCE 0x80 | 307 | #define IPR_IS_IOA_RESOURCE 0x80 |
@@ -307,6 +313,7 @@ struct ipr_config_table_entry { | |||
307 | #define IPR_SUBTYPE_AF_DASD 0 | 313 | #define IPR_SUBTYPE_AF_DASD 0 |
308 | #define IPR_SUBTYPE_GENERIC_SCSI 1 | 314 | #define IPR_SUBTYPE_GENERIC_SCSI 1 |
309 | #define IPR_SUBTYPE_VOLUME_SET 2 | 315 | #define IPR_SUBTYPE_VOLUME_SET 2 |
316 | #define IPR_SUBTYPE_GENERIC_ATA 4 | ||
310 | 317 | ||
311 | #define IPR_QUEUEING_MODEL(res) ((((res)->cfgte.flags) & 0x70) >> 4) | 318 | #define IPR_QUEUEING_MODEL(res) ((((res)->cfgte.flags) & 0x70) >> 4) |
312 | #define IPR_QUEUE_FROZEN_MODEL 0 | 319 | #define IPR_QUEUE_FROZEN_MODEL 0 |
@@ -350,6 +357,7 @@ struct ipr_cmd_pkt { | |||
350 | #define IPR_RQTYPE_SCSICDB 0x00 | 357 | #define IPR_RQTYPE_SCSICDB 0x00 |
351 | #define IPR_RQTYPE_IOACMD 0x01 | 358 | #define IPR_RQTYPE_IOACMD 0x01 |
352 | #define IPR_RQTYPE_HCAM 0x02 | 359 | #define IPR_RQTYPE_HCAM 0x02 |
360 | #define IPR_RQTYPE_ATA_PASSTHRU 0x04 | ||
353 | 361 | ||
354 | u8 luntar_luntrn; | 362 | u8 luntar_luntrn; |
355 | 363 | ||
@@ -373,6 +381,37 @@ struct ipr_cmd_pkt { | |||
373 | __be16 timeout; | 381 | __be16 timeout; |
374 | }__attribute__ ((packed, aligned(4))); | 382 | }__attribute__ ((packed, aligned(4))); |
375 | 383 | ||
384 | struct ipr_ioarcb_ata_regs { | ||
385 | u8 flags; | ||
386 | #define IPR_ATA_FLAG_PACKET_CMD 0x80 | ||
387 | #define IPR_ATA_FLAG_XFER_TYPE_DMA 0x40 | ||
388 | #define IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION 0x20 | ||
389 | u8 reserved[3]; | ||
390 | |||
391 | __be16 data; | ||
392 | u8 feature; | ||
393 | u8 nsect; | ||
394 | u8 lbal; | ||
395 | u8 lbam; | ||
396 | u8 lbah; | ||
397 | u8 device; | ||
398 | u8 command; | ||
399 | u8 reserved2[3]; | ||
400 | u8 hob_feature; | ||
401 | u8 hob_nsect; | ||
402 | u8 hob_lbal; | ||
403 | u8 hob_lbam; | ||
404 | u8 hob_lbah; | ||
405 | u8 ctl; | ||
406 | }__attribute__ ((packed, aligned(4))); | ||
407 | |||
408 | struct ipr_ioarcb_add_data { | ||
409 | union { | ||
410 | struct ipr_ioarcb_ata_regs regs; | ||
411 | __be32 add_cmd_parms[10]; | ||
412 | }u; | ||
413 | }__attribute__ ((packed, aligned(4))); | ||
414 | |||
376 | /* IOA Request Control Block 128 bytes */ | 415 | /* IOA Request Control Block 128 bytes */ |
377 | struct ipr_ioarcb { | 416 | struct ipr_ioarcb { |
378 | __be32 ioarcb_host_pci_addr; | 417 | __be32 ioarcb_host_pci_addr; |
@@ -397,7 +436,7 @@ struct ipr_ioarcb { | |||
397 | struct ipr_cmd_pkt cmd_pkt; | 436 | struct ipr_cmd_pkt cmd_pkt; |
398 | 437 | ||
399 | __be32 add_cmd_parms_len; | 438 | __be32 add_cmd_parms_len; |
400 | __be32 add_cmd_parms[10]; | 439 | struct ipr_ioarcb_add_data add_data; |
401 | }__attribute__((packed, aligned (4))); | 440 | }__attribute__((packed, aligned (4))); |
402 | 441 | ||
403 | struct ipr_ioadl_desc { | 442 | struct ipr_ioadl_desc { |
@@ -433,6 +472,21 @@ struct ipr_ioasa_gpdd { | |||
433 | __be32 ioa_data[2]; | 472 | __be32 ioa_data[2]; |
434 | }__attribute__((packed, aligned (4))); | 473 | }__attribute__((packed, aligned (4))); |
435 | 474 | ||
475 | struct ipr_ioasa_gata { | ||
476 | u8 error; | ||
477 | u8 nsect; /* Interrupt reason */ | ||
478 | u8 lbal; | ||
479 | u8 lbam; | ||
480 | u8 lbah; | ||
481 | u8 device; | ||
482 | u8 status; | ||
483 | u8 alt_status; /* ATA CTL */ | ||
484 | u8 hob_nsect; | ||
485 | u8 hob_lbal; | ||
486 | u8 hob_lbam; | ||
487 | u8 hob_lbah; | ||
488 | }__attribute__((packed, aligned (4))); | ||
489 | |||
436 | struct ipr_auto_sense { | 490 | struct ipr_auto_sense { |
437 | __be16 auto_sense_len; | 491 | __be16 auto_sense_len; |
438 | __be16 ioa_data_len; | 492 | __be16 ioa_data_len; |
@@ -466,6 +520,7 @@ struct ipr_ioasa { | |||
466 | __be32 ioasc_specific; /* status code specific field */ | 520 | __be32 ioasc_specific; /* status code specific field */ |
467 | #define IPR_ADDITIONAL_STATUS_FMT 0x80000000 | 521 | #define IPR_ADDITIONAL_STATUS_FMT 0x80000000 |
468 | #define IPR_AUTOSENSE_VALID 0x40000000 | 522 | #define IPR_AUTOSENSE_VALID 0x40000000 |
523 | #define IPR_ATA_DEVICE_WAS_RESET 0x20000000 | ||
469 | #define IPR_IOASC_SPECIFIC_MASK 0x00ffffff | 524 | #define IPR_IOASC_SPECIFIC_MASK 0x00ffffff |
470 | #define IPR_FIELD_POINTER_VALID (0x80000000 >> 8) | 525 | #define IPR_FIELD_POINTER_VALID (0x80000000 >> 8) |
471 | #define IPR_FIELD_POINTER_MASK 0x0000ffff | 526 | #define IPR_FIELD_POINTER_MASK 0x0000ffff |
@@ -474,6 +529,7 @@ struct ipr_ioasa { | |||
474 | struct ipr_ioasa_vset vset; | 529 | struct ipr_ioasa_vset vset; |
475 | struct ipr_ioasa_af_dasd dasd; | 530 | struct ipr_ioasa_af_dasd dasd; |
476 | struct ipr_ioasa_gpdd gpdd; | 531 | struct ipr_ioasa_gpdd gpdd; |
532 | struct ipr_ioasa_gata gata; | ||
477 | } u; | 533 | } u; |
478 | 534 | ||
479 | struct ipr_auto_sense auto_sense; | 535 | struct ipr_auto_sense auto_sense; |
@@ -1308,6 +1364,22 @@ static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res) | |||
1308 | } | 1364 | } |
1309 | 1365 | ||
1310 | /** | 1366 | /** |
1367 | * ipr_is_gata - Determine if a resource is a generic ATA resource | ||
1368 | * @res: resource entry struct | ||
1369 | * | ||
1370 | * Return value: | ||
1371 | * 1 if GATA / 0 if not GATA | ||
1372 | **/ | ||
1373 | static inline int ipr_is_gata(struct ipr_resource_entry *res) | ||
1374 | { | ||
1375 | if (!ipr_is_ioa_resource(res) && | ||
1376 | IPR_RES_SUBTYPE(res) == IPR_SUBTYPE_GENERIC_ATA) | ||
1377 | return 1; | ||
1378 | else | ||
1379 | return 0; | ||
1380 | } | ||
1381 | |||
1382 | /** | ||
1311 | * ipr_is_naca_model - Determine if a resource is using NACA queueing model | 1383 | * ipr_is_naca_model - Determine if a resource is using NACA queueing model |
1312 | * @res: resource entry struct | 1384 | * @res: resource entry struct |
1313 | * | 1385 | * |