From: "erich" I had make some bugs at arcmsr 1.20.00.11 at 64bit platform. 1.20.00.11 9/29/2005 Erich Chen by comment of Arjan van de Ven fix incorrect msleep redefine cast off sizeof(dma_addr_t) condition for 64bit pci_set_dma_mask 1.20.00.12 9/30/2005 Erich Chen bug fix with 64bit platform's ccbs using if over 4G system memory change 64bit pci_set_consistent_dma_mask into 32bit increcct adapter count if adapter initialize fail. miss edit at arcmsr_build_ccb.... psge += sizeof(struct _SG64ENTRY *) => psge += sizeof(struct _SG64ENTRY) 64 bits sg entry would be incorrectly calculated thanks Kornel Wieliczek give me kindly notify and detail description Signed-off-by: Andrew Morton --- drivers/scsi/arcmsr/arcmsr.c | 55 +++++++++++++++++++---------------------- drivers/scsi/arcmsr/arcmsr.h | 40 +---------------------------- drivers/scsi/arcmsr/arcmsr.txt | 7 +++++ 3 files changed, 35 insertions(+), 67 deletions(-) diff -puN drivers/scsi/arcmsr/arcmsr.c~areca-raid-linux-scsi-driver-update-3 drivers/scsi/arcmsr/arcmsr.c --- devel/drivers/scsi/arcmsr/arcmsr.c~areca-raid-linux-scsi-driver-update-3 2005-10-20 01:38:18.000000000 -0700 +++ devel-akpm/drivers/scsi/arcmsr/arcmsr.c 2005-10-20 01:38:18.000000000 -0700 @@ -78,6 +78,13 @@ ** customer can send this command for sync raid volume data ** 1.20.00.11 9/29/2005 Erich Chen by comment of Arjan van de Ven fix incorrect msleep redefine ** cast off sizeof(dma_addr_t) condition for 64bit pci_set_dma_mask +** 1.20.00.12 9/30/2005 Erich Chen bug fix with 64bit platform's ccbs using if over 4G system memory +** change 64bit pci_set_consistent_dma_mask into 32bit +** increcct adapter count if adapter initialize fail. +** miss edit at arcmsr_build_ccb.... +** psge += sizeof(struct _SG64ENTRY *) => psge += sizeof(struct _SG64ENTRY) +** 64 bits sg entry would be incorrectly calculated +** thanks Kornel Wieliczek give me kindly notify and detail description ****************************************************************************************** */ #include @@ -226,29 +233,15 @@ static struct class_device_attribute *ar &arcmsr_driver_state_attr, NULL }; -static ssize_t arcmsr_adjust_queue_depth(struct device *dev, const char *buf, - size_t count) +static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, + int queue_depth) { - int queue_depth; - struct scsi_device *sdev = to_scsi_device(dev); - - queue_depth = simple_strtoul(buf, NULL, 0); - if (queue_depth > ARCMSR_MAX_CMD_PERLUN) - return -EINVAL; + if (queue_depth > ARCMSR_MAX_CMD_PERLUN) { + queue_depth = ARCMSR_MAX_CMD_PERLUN; + } scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth); - return count; + return queue_depth; } -static struct device_attribute arcmsr_queue_depth_attr = { - .attr = { - .name = "queue_depth", - .mode = S_IRUSR | S_IWUSR, - }, - .store = arcmsr_adjust_queue_depth -}; -static struct device_attribute *arcmsr_scsi_device_attr[] = { - &arcmsr_queue_depth_attr, - NULL, -}; static struct scsi_host_template arcmsr_scsi_host_template = { .module = THIS_MODULE, .proc_name = "arcmsr", @@ -264,6 +257,7 @@ static struct scsi_host_template arcmsr_ .eh_bus_reset_handler = arcmsr_bus_reset, .eh_host_reset_handler = NULL, .bios_param = arcmsr_bios_param, + .change_queue_depth = arcmsr_adjust_disk_queue_depth, .can_queue = ARCMSR_MAX_OUTSTANDING_CMD, .this_id = ARCMSR_SCSI_INITIATOR_ID, .sg_tablesize = ARCMSR_MAX_SG_ENTRIES, @@ -272,7 +266,6 @@ static struct scsi_host_template arcmsr_ .unchecked_isa_dma = 0, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = arcmsr_scsi_host_attr, - .sdev_attrs = arcmsr_scsi_device_attr, }; /* @@ -400,21 +393,25 @@ static int __devinit arcmsr_device_probe arcmsr_adapterCnt); return -ENODEV; } - if (!pci_set_dma_mask(pPCI_DEV, DMA_64BIT_MASK) - && !pci_set_consistent_dma_mask(pPCI_DEV, DMA_64BIT_MASK)) { + if (!pci_set_dma_mask(pPCI_DEV, DMA_64BIT_MASK)) { printk - ("ARECA RAID ADAPTER%d: 64BITS PCI BUS DMA ADDRESSING SUPPORTED 'USING DAC'\n", + ("ARECA RAID ADAPTER%d: 64BITS PCI BUS DMA ADDRESSING SUPPORTED\n", arcmsr_adapterCnt); - } else if (!pci_set_dma_mask(pPCI_DEV, DMA_32BIT_MASK) - && !pci_set_consistent_dma_mask(pPCI_DEV, DMA_32BIT_MASK)) { + } else if (!pci_set_dma_mask(pPCI_DEV, DMA_32BIT_MASK)) { printk - ("ARECA RAID ADAPTER%d: 32BITS PCI BUS DMA ADDRESSING SUPPORTED \n", + ("ARECA RAID ADAPTER%d: 32BITS PCI BUS DMA ADDRESSING SUPPORTED\n", arcmsr_adapterCnt); } else { printk("ARECA RAID ADAPTER%d: No suitable DMA available.\n", arcmsr_adapterCnt); return -ENOMEM; } + if (pci_set_consistent_dma_mask(pPCI_DEV, DMA_32BIT_MASK)) { + printk + ("ARECA RAID ADAPTER%d: No 32BIT coherent DMA adressing available.\n", + arcmsr_adapterCnt); + return -ENOMEM; + } bus = pPCI_DEV->bus->number; dev_fun = pPCI_DEV->devfn; pACB = (struct _ACB *)host->hostdata; @@ -440,7 +437,7 @@ static int __devinit arcmsr_device_probe host->irq = pPCI_DEV->irq; pci_set_master(pPCI_DEV); if (arcmsr_initialize(pACB, pPCI_DEV)) { - printk("arcmsr%d initialize got error \n", arcmsr_adapterCnt--); + printk("arcmsr%d initialize got error \n", arcmsr_adapterCnt); pHCBARC->adapterCnt = arcmsr_adapterCnt; pHCBARC->pACB[arcmsr_adapterCnt] = NULL; scsi_host_put(host); @@ -899,7 +896,7 @@ static void arcmsr_build_ccb(struct _ACB pdma_sg->addresshigh = address_hi; pdma_sg->address = address_lo; pdma_sg->length = length | IS_SG64_ADDR; - psge += sizeof(struct _SG64ENTRY *); + psge += sizeof(struct _SG64ENTRY); arccdbsize += sizeof(struct _SG64ENTRY); } sl++; diff -puN drivers/scsi/arcmsr/arcmsr.h~areca-raid-linux-scsi-driver-update-3 drivers/scsi/arcmsr/arcmsr.h --- devel/drivers/scsi/arcmsr/arcmsr.h~areca-raid-linux-scsi-driver-update-3 2005-10-20 01:38:18.000000000 -0700 +++ devel-akpm/drivers/scsi/arcmsr/arcmsr.h 2005-10-20 01:38:18.000000000 -0700 @@ -51,7 +51,7 @@ */ #define ARCMSR_MAX_OUTSTANDING_CMD 256 #define ARCMSR_MAX_FREECCB_NUM 320 -#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.11" +#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.12" #define ARCMSR_SCSI_INITIATOR_ID 16 #define ARCMSR_DEV_SECTOR_SIZE 512 #define ARCMSR_MAX_XFER_SECTORS 256 @@ -174,44 +174,8 @@ typedef struct _SGENTRY_UNION { } u; } SGENTRY_UNION, PSGENTRY_UNION; /* -**struct scatterlist -**{ -** char * address; // Location data is to be transferred to -** char * alt_address; // Location of actual if address is a dma indirect buffer. NULL otherwise -** unsigned int length; -**}; -*/ -/* ********************************** -** Inquiry Data format -** typedef struct _INQUIRYDATA -** { -** uint8_t DeviceType : 5; -** uint8_t DeviceTypeQualifier : 3; -** uint8_t DeviceTypeModifier : 7; -** uint8_t RemovableMedia : 1; -** uint8_t Versions; -** uint8_t ResponseDataFormat : 4; -** uint8_t HiSupport : 1; -** uint8_t NormACA : 1; -** uint8_t ReservedBit : 1; -** uint8_t AERC : 1; -** uint8_t AdditionalLength; -** uint8_t Reserved[2]; -** uint8_t SoftReset : 1; -** uint8_t CommandQueue : 1; -** uint8_t Reserved2 : 1; -** uint8_t LinkedCommands : 1; -** uint8_t Synchronous : 1; -** uint8_t Wide16Bit : 1; -** uint8_t Wide32Bit : 1; -** uint8_t RelativeAddressing : 1; -** uint8_t VendorId[8]; -** uint8_t ProductId[16]; -** uint8_t ProductRevisionLevel[4]; -** uint8_t VendorSpecific[20]; -** uint8_t Reserved3[40]; -** } INQUIRYDATA, *PINQUIRYDATA; +** ********************************** */ typedef struct _QBUFFER { diff -puN drivers/scsi/arcmsr/arcmsr.txt~areca-raid-linux-scsi-driver-update-3 drivers/scsi/arcmsr/arcmsr.txt --- devel/drivers/scsi/arcmsr/arcmsr.txt~areca-raid-linux-scsi-driver-update-3 2005-10-20 01:38:18.000000000 -0700 +++ devel-akpm/drivers/scsi/arcmsr/arcmsr.txt 2005-10-20 01:38:18.000000000 -0700 @@ -38,6 +38,13 @@ History customer can send this command for sync raid volume data 1.20.00.11 9/29/2005 Erich Chen by comment of Arjan van de Ven fix incorrect msleep redefine cast off sizeof(dma_addr_t) condition for 64bit pci_set_dma_mask + 1.20.00.12 9/30/2005 Erich Chen bug fix with 64bit platform's ccbs using if over 4G system memory + change 64bit pci_set_consistent_dma_mask into 32bit + increcct adapter count if adapter initialize fail. + miss edit at arcmsr_build_ccb.... + psge += sizeof(struct _SG64ENTRY *) => psge += sizeof(struct _SG64ENTRY) + 64 bits sg entry would be incorrectly calculated + thanks Kornel Wieliczek give me kindly notify and detail description ===================================================================================================== Support: _