diff options
-rw-r--r-- | drivers/scsi/ips.c | 49 | ||||
-rw-r--r-- | drivers/scsi/ips.h | 12 |
2 files changed, 31 insertions, 30 deletions
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 595a91afca0e..0da3dfa3150a 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c | |||
@@ -389,17 +389,17 @@ static struct pci_device_id ips_pci_table[] = { | |||
389 | MODULE_DEVICE_TABLE( pci, ips_pci_table ); | 389 | MODULE_DEVICE_TABLE( pci, ips_pci_table ); |
390 | 390 | ||
391 | static char ips_hot_plug_name[] = "ips"; | 391 | static char ips_hot_plug_name[] = "ips"; |
392 | 392 | ||
393 | static int __devinit ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent); | 393 | static int __devinit ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent); |
394 | static void __devexit ips_remove_device(struct pci_dev *pci_dev); | 394 | static void __devexit ips_remove_device(struct pci_dev *pci_dev); |
395 | 395 | ||
396 | static struct pci_driver ips_pci_driver = { | 396 | static struct pci_driver ips_pci_driver = { |
397 | .name = ips_hot_plug_name, | 397 | .name = ips_hot_plug_name, |
398 | .id_table = ips_pci_table, | 398 | .id_table = ips_pci_table, |
399 | .probe = ips_insert_device, | 399 | .probe = ips_insert_device, |
400 | .remove = __devexit_p(ips_remove_device), | 400 | .remove = __devexit_p(ips_remove_device), |
401 | }; | 401 | }; |
402 | 402 | ||
403 | 403 | ||
404 | /* | 404 | /* |
405 | * Necessary forward function protoypes | 405 | * Necessary forward function protoypes |
@@ -587,7 +587,7 @@ static void | |||
587 | ips_setup_funclist(ips_ha_t * ha) | 587 | ips_setup_funclist(ips_ha_t * ha) |
588 | { | 588 | { |
589 | 589 | ||
590 | /* | 590 | /* |
591 | * Setup Functions | 591 | * Setup Functions |
592 | */ | 592 | */ |
593 | if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) { | 593 | if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) { |
@@ -2081,7 +2081,7 @@ ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len) | |||
2081 | /* That keeps everything happy for "text" operations on the proc file. */ | 2081 | /* That keeps everything happy for "text" operations on the proc file. */ |
2082 | 2082 | ||
2083 | if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) { | 2083 | if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) { |
2084 | if (ha->nvram->bios_low[3] == 0) { | 2084 | if (ha->nvram->bios_low[3] == 0) { |
2085 | copy_info(&info, | 2085 | copy_info(&info, |
2086 | "\tBIOS Version : %c%c%c%c%c%c%c\n", | 2086 | "\tBIOS Version : %c%c%c%c%c%c%c\n", |
2087 | ha->nvram->bios_high[0], ha->nvram->bios_high[1], | 2087 | ha->nvram->bios_high[0], ha->nvram->bios_high[1], |
@@ -2780,10 +2780,11 @@ ips_next(ips_ha_t * ha, int intr) | |||
2780 | scb->dcdb.cmd_attribute = | 2780 | scb->dcdb.cmd_attribute = |
2781 | ips_command_direction[scb->scsi_cmd->cmnd[0]]; | 2781 | ips_command_direction[scb->scsi_cmd->cmnd[0]]; |
2782 | 2782 | ||
2783 | /* Allow a WRITE BUFFER Command to Have no Data */ | 2783 | /* Allow a WRITE BUFFER Command to Have no Data */ |
2784 | /* This is Used by Tape Flash Utilites */ | 2784 | /* This is Used by Tape Flash Utilites */ |
2785 | if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) && (scb->data_len == 0)) | 2785 | if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) && |
2786 | scb->dcdb.cmd_attribute = 0; | 2786 | (scb->data_len == 0)) |
2787 | scb->dcdb.cmd_attribute = 0; | ||
2787 | 2788 | ||
2788 | if (!(scb->dcdb.cmd_attribute & 0x3)) | 2789 | if (!(scb->dcdb.cmd_attribute & 0x3)) |
2789 | scb->dcdb.transfer_length = 0; | 2790 | scb->dcdb.transfer_length = 0; |
@@ -3404,7 +3405,7 @@ ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp) | |||
3404 | 3405 | ||
3405 | /* Restrict access to physical DASD */ | 3406 | /* Restrict access to physical DASD */ |
3406 | if (scb->scsi_cmd->cmnd[0] == INQUIRY) { | 3407 | if (scb->scsi_cmd->cmnd[0] == INQUIRY) { |
3407 | ips_scmd_buf_read(scb->scsi_cmd, | 3408 | ips_scmd_buf_read(scb->scsi_cmd, |
3408 | &inquiryData, sizeof (inquiryData)); | 3409 | &inquiryData, sizeof (inquiryData)); |
3409 | if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) { | 3410 | if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) { |
3410 | errcode = DID_TIME_OUT; | 3411 | errcode = DID_TIME_OUT; |
@@ -4090,10 +4091,10 @@ ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus) | |||
4090 | scb->scsi_cmd->result = errcode << 16; | 4091 | scb->scsi_cmd->result = errcode << 16; |
4091 | } else { /* bus == 0 */ | 4092 | } else { /* bus == 0 */ |
4092 | /* restrict access to physical drives */ | 4093 | /* restrict access to physical drives */ |
4093 | if (scb->scsi_cmd->cmnd[0] == INQUIRY) { | 4094 | if (scb->scsi_cmd->cmnd[0] == INQUIRY) { |
4094 | ips_scmd_buf_read(scb->scsi_cmd, | 4095 | ips_scmd_buf_read(scb->scsi_cmd, |
4095 | &inquiryData, sizeof (inquiryData)); | 4096 | &inquiryData, sizeof (inquiryData)); |
4096 | if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) | 4097 | if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) |
4097 | scb->scsi_cmd->result = DID_TIME_OUT << 16; | 4098 | scb->scsi_cmd->result = DID_TIME_OUT << 16; |
4098 | } | 4099 | } |
4099 | } /* else */ | 4100 | } /* else */ |
@@ -4661,8 +4662,8 @@ ips_isinit_morpheus(ips_ha_t * ha) | |||
4661 | uint32_t bits; | 4662 | uint32_t bits; |
4662 | 4663 | ||
4663 | METHOD_TRACE("ips_is_init_morpheus", 1); | 4664 | METHOD_TRACE("ips_is_init_morpheus", 1); |
4664 | 4665 | ||
4665 | if (ips_isintr_morpheus(ha)) | 4666 | if (ips_isintr_morpheus(ha)) |
4666 | ips_flush_and_reset(ha); | 4667 | ips_flush_and_reset(ha); |
4667 | 4668 | ||
4668 | post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); | 4669 | post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); |
@@ -4686,7 +4687,7 @@ ips_isinit_morpheus(ips_ha_t * ha) | |||
4686 | /* state ( was trying to INIT and an interrupt was already pending ) ... */ | 4687 | /* state ( was trying to INIT and an interrupt was already pending ) ... */ |
4687 | /* */ | 4688 | /* */ |
4688 | /****************************************************************************/ | 4689 | /****************************************************************************/ |
4689 | static void | 4690 | static void |
4690 | ips_flush_and_reset(ips_ha_t *ha) | 4691 | ips_flush_and_reset(ips_ha_t *ha) |
4691 | { | 4692 | { |
4692 | ips_scb_t *scb; | 4693 | ips_scb_t *scb; |
@@ -4718,9 +4719,9 @@ ips_flush_and_reset(ips_ha_t *ha) | |||
4718 | if (ret == IPS_SUCCESS) { | 4719 | if (ret == IPS_SUCCESS) { |
4719 | time = 60 * IPS_ONE_SEC; /* Max Wait time is 60 seconds */ | 4720 | time = 60 * IPS_ONE_SEC; /* Max Wait time is 60 seconds */ |
4720 | done = 0; | 4721 | done = 0; |
4721 | 4722 | ||
4722 | while ((time > 0) && (!done)) { | 4723 | while ((time > 0) && (!done)) { |
4723 | done = ips_poll_for_flush_complete(ha); | 4724 | done = ips_poll_for_flush_complete(ha); |
4724 | /* This may look evil, but it's only done during extremely rare start-up conditions ! */ | 4725 | /* This may look evil, but it's only done during extremely rare start-up conditions ! */ |
4725 | udelay(1000); | 4726 | udelay(1000); |
4726 | time--; | 4727 | time--; |
@@ -4749,17 +4750,17 @@ static int | |||
4749 | ips_poll_for_flush_complete(ips_ha_t * ha) | 4750 | ips_poll_for_flush_complete(ips_ha_t * ha) |
4750 | { | 4751 | { |
4751 | IPS_STATUS cstatus; | 4752 | IPS_STATUS cstatus; |
4752 | 4753 | ||
4753 | while (TRUE) { | 4754 | while (TRUE) { |
4754 | cstatus.value = (*ha->func.statupd) (ha); | 4755 | cstatus.value = (*ha->func.statupd) (ha); |
4755 | 4756 | ||
4756 | if (cstatus.value == 0xffffffff) /* If No Interrupt to process */ | 4757 | if (cstatus.value == 0xffffffff) /* If No Interrupt to process */ |
4757 | break; | 4758 | break; |
4758 | 4759 | ||
4759 | /* Success is when we see the Flush Command ID */ | 4760 | /* Success is when we see the Flush Command ID */ |
4760 | if (cstatus.fields.command_id == IPS_MAX_CMDS ) | 4761 | if (cstatus.fields.command_id == IPS_MAX_CMDS) |
4761 | return 1; | 4762 | return 1; |
4762 | } | 4763 | } |
4763 | 4764 | ||
4764 | return 0; | 4765 | return 0; |
4765 | } | 4766 | } |
@@ -5920,7 +5921,7 @@ ips_read_config(ips_ha_t * ha, int intr) | |||
5920 | 5921 | ||
5921 | return (0); | 5922 | return (0); |
5922 | } | 5923 | } |
5923 | 5924 | ||
5924 | memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf)); | 5925 | memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf)); |
5925 | return (1); | 5926 | return (1); |
5926 | } | 5927 | } |
@@ -5959,7 +5960,7 @@ ips_readwrite_page5(ips_ha_t * ha, int write, int intr) | |||
5959 | scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr; | 5960 | scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr; |
5960 | if (write) | 5961 | if (write) |
5961 | memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram)); | 5962 | memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram)); |
5962 | 5963 | ||
5963 | /* issue the command */ | 5964 | /* issue the command */ |
5964 | if (((ret = | 5965 | if (((ret = |
5965 | ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) | 5966 | ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) |
diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index fb4a03661ce1..e0657b6f009c 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h | |||
@@ -92,7 +92,7 @@ | |||
92 | #ifndef min | 92 | #ifndef min |
93 | #define min(x,y) ((x) < (y) ? x : y) | 93 | #define min(x,y) ((x) < (y) ? x : y) |
94 | #endif | 94 | #endif |
95 | 95 | ||
96 | #ifndef __iomem /* For clean compiles in earlier kernels without __iomem annotations */ | 96 | #ifndef __iomem /* For clean compiles in earlier kernels without __iomem annotations */ |
97 | #define __iomem | 97 | #define __iomem |
98 | #endif | 98 | #endif |
@@ -171,7 +171,7 @@ | |||
171 | #define IPS_CMD_DOWNLOAD 0x20 | 171 | #define IPS_CMD_DOWNLOAD 0x20 |
172 | #define IPS_CMD_RW_BIOSFW 0x22 | 172 | #define IPS_CMD_RW_BIOSFW 0x22 |
173 | #define IPS_CMD_GET_VERSION_INFO 0xC6 | 173 | #define IPS_CMD_GET_VERSION_INFO 0xC6 |
174 | #define IPS_CMD_RESET_CHANNEL 0x1A | 174 | #define IPS_CMD_RESET_CHANNEL 0x1A |
175 | 175 | ||
176 | /* | 176 | /* |
177 | * Adapter Equates | 177 | * Adapter Equates |
@@ -458,7 +458,7 @@ typedef struct { | |||
458 | uint32_t reserved3; | 458 | uint32_t reserved3; |
459 | uint32_t buffer_addr; | 459 | uint32_t buffer_addr; |
460 | uint32_t reserved4; | 460 | uint32_t reserved4; |
461 | } IPS_IOCTL_CMD, *PIPS_IOCTL_CMD; | 461 | } IPS_IOCTL_CMD, *PIPS_IOCTL_CMD; |
462 | 462 | ||
463 | typedef struct { | 463 | typedef struct { |
464 | uint8_t op_code; | 464 | uint8_t op_code; |
@@ -552,7 +552,7 @@ typedef struct { | |||
552 | uint32_t cccr; | 552 | uint32_t cccr; |
553 | } IPS_NVRAM_CMD, *PIPS_NVRAM_CMD; | 553 | } IPS_NVRAM_CMD, *PIPS_NVRAM_CMD; |
554 | 554 | ||
555 | typedef struct | 555 | typedef struct |
556 | { | 556 | { |
557 | uint8_t op_code; | 557 | uint8_t op_code; |
558 | uint8_t command_id; | 558 | uint8_t command_id; |
@@ -650,7 +650,7 @@ typedef struct { | |||
650 | uint8_t device_address; | 650 | uint8_t device_address; |
651 | uint8_t cmd_attribute; | 651 | uint8_t cmd_attribute; |
652 | uint8_t cdb_length; | 652 | uint8_t cdb_length; |
653 | uint8_t reserved_for_LUN; | 653 | uint8_t reserved_for_LUN; |
654 | uint32_t transfer_length; | 654 | uint32_t transfer_length; |
655 | uint32_t buffer_pointer; | 655 | uint32_t buffer_pointer; |
656 | uint16_t sg_count; | 656 | uint16_t sg_count; |
@@ -790,7 +790,7 @@ typedef struct { | |||
790 | /* SubSystem Parameter[4] */ | 790 | /* SubSystem Parameter[4] */ |
791 | #define IPS_GET_VERSION_SUPPORT 0x00018000 /* Mask for Versioning Support */ | 791 | #define IPS_GET_VERSION_SUPPORT 0x00018000 /* Mask for Versioning Support */ |
792 | 792 | ||
793 | typedef struct | 793 | typedef struct |
794 | { | 794 | { |
795 | uint32_t revision; | 795 | uint32_t revision; |
796 | uint8_t bootBlkVersion[32]; | 796 | uint8_t bootBlkVersion[32]; |