From: Erich Chen 1. add SCSI_ARCMSR_MSI at Kconfig 2. use spaces after ',' 3. add spaces around the '=' sign 4. define sense ErrorCode instead of magic numbers 0x70 5. include linux/dma-mapping.h 6. correct message of "unknow" => "unknown" 7. run sparse on it and fix it with none warning Signed-off-by: Erich Chen Signed-off-by: Andrew Morton --- drivers/scsi/Kconfig | 11 drivers/scsi/arcmsr/arcmsr.c | 1581 ++++++++++++++++----------------- drivers/scsi/arcmsr/arcmsr.h | 41 3 files changed, 822 insertions(+), 811 deletions(-) diff -puN drivers/scsi/arcmsr/arcmsr.c~areca-raid-driver-arcmsr-update3-for-mm4 drivers/scsi/arcmsr/arcmsr.c --- devel/drivers/scsi/arcmsr/arcmsr.c~areca-raid-driver-arcmsr-update3-for-mm4 2006-01-17 00:49:26.000000000 -0800 +++ devel-akpm/drivers/scsi/arcmsr/arcmsr.c 2006-01-17 00:49:26.000000000 -0800 @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -74,31 +75,31 @@ MODULE_LICENSE("Dual BSD/GPL"); ******************************************************************************* ******************************************************************************* */ -static uint8_t arcmsr_adapterCnt=0; -static struct HCBARC arcmsr_host_control_block; +static uint8_t arcmsr_adapterCnt; +static struct HCBARC arcmsr_host_control_block; /* ******************************************************************************* ******************************************************************************* */ static int arcmsr_fops_close(struct inode *inode, struct file *filep); static int arcmsr_fops_open(struct inode *inode, struct file *filep); -static int arcmsr_initialize(struct ACB *pACB,struct pci_dev *pci_device); -static int arcmsr_iop_ioctlcmd(struct ACB *pACB,int ioctl_cmd,void *arg); +static int arcmsr_initialize(struct ACB *pACB, struct pci_dev *pci_device); +static int arcmsr_iop_ioctlcmd(struct ACB *pACB, int ioctl_cmd, void __user * arg); static int arcmsr_release(struct Scsi_Host *); static int arcmsr_cmd_abort(struct scsi_cmnd *); static int arcmsr_bus_reset(struct scsi_cmnd *); -static int arcmsr_ioctl(struct scsi_device * dev, int ioctl_cmd, void *arg); +static int arcmsr_ioctl(struct scsi_device * dev, int ioctl_cmd, void __user * arg); static int arcmsr_fops_ioctl(struct inode *inode, struct file *filep, unsigned int ioctl_cmd, unsigned long arg); static int arcmsr_halt_notify(struct notifier_block *nb, - unsigned long event,void *buf); + unsigned long event, void *buf); static int arcmsr_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout); static int arcmsr_bios_param(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *info); static int arcmsr_queue_command(struct scsi_cmnd * cmd, void (*done) (struct scsi_cmnd *)); -static int __devinit arcmsr_device_probe(struct pci_dev *pci_device, +static int arcmsr_device_probe(struct pci_dev *pci_device, const struct pci_device_id *id); static void arcmsr_device_remove(struct pci_dev *pci_device); static void arcmsr_pcidev_disattach(struct ACB *pACB); @@ -113,13 +114,13 @@ static const char *arcmsr_info(struct Sc */ static ssize_t arcmsr_show_firmware_info(struct class_device *dev, char *buf) { - struct Scsi_Host *host=class_to_shost(dev); - struct ACB *pACB=(struct ACB *) host->hostdata; - unsigned long flags=0; + struct Scsi_Host *host = class_to_shost(dev); + struct ACB *pACB = (struct ACB *) host->hostdata; + unsigned long flags = 0; ssize_t len; spin_lock_irqsave(pACB->host->host_lock, flags); - len=snprintf(buf, PAGE_SIZE, + len = snprintf(buf, PAGE_SIZE, "=================================\n" "Firmware Version: %s\n" "Adapter Model: %s\n" @@ -143,13 +144,13 @@ static ssize_t arcmsr_show_firmware_info */ static ssize_t arcmsr_show_driver_state(struct class_device *dev, char *buf) { - struct Scsi_Host *host=class_to_shost(dev); - struct ACB *pACB=(struct ACB *)host->hostdata; - unsigned long flags=0; + struct Scsi_Host *host = class_to_shost(dev); + struct ACB *pACB = (struct ACB *)host->hostdata; + unsigned long flags = 0; ssize_t len; spin_lock_irqsave(pACB->host->host_lock, flags); - len=snprintf(buf, PAGE_SIZE, + len = snprintf(buf, PAGE_SIZE, "=================================\n" "ARCMSR: %s\n" "Current commands posted: %4d\n" @@ -177,32 +178,29 @@ static ssize_t arcmsr_show_driver_state( ******************************************************************************* ******************************************************************************* */ -static struct class_device_attribute arcmsr_firmware_info_attr= -{ - .attr={ - .name="firmware_info", - .mode=S_IRUGO, +static struct class_device_attribute arcmsr_firmware_info_attr = { + .attr = { + .name = "firmware_info", + .mode = S_IRUGO, }, - .show=arcmsr_show_firmware_info, + .show = arcmsr_show_firmware_info, }; /* ******************************************************************************* ******************************************************************************* */ -static struct class_device_attribute arcmsr_driver_state_attr= -{ - .attr={ - .name="driver_state", - .mode=S_IRUGO, +static struct class_device_attribute arcmsr_driver_state_attr = { + .attr = { + .name = "driver_state", + .mode = S_IRUGO, }, - .show=arcmsr_show_driver_state + .show = arcmsr_show_driver_state }; /* ******************************************************************************* ******************************************************************************* */ -static struct class_device_attribute *arcmsr_scsi_host_attr[]= -{ +static struct class_device_attribute *arcmsr_scsi_host_attr[] = { &arcmsr_firmware_info_attr, &arcmsr_driver_state_attr, NULL @@ -214,7 +212,7 @@ static struct class_device_attribute *ar static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int queue_depth) { if (queue_depth > ARCMSR_MAX_CMD_PERLUN) - queue_depth=ARCMSR_MAX_CMD_PERLUN; + queue_depth = ARCMSR_MAX_CMD_PERLUN; scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth); return queue_depth; } @@ -222,53 +220,51 @@ static int arcmsr_adjust_disk_queue_dept ******************************************************************************* ******************************************************************************* */ -static struct scsi_host_template arcmsr_scsi_host_template= -{ - .module =THIS_MODULE, - .proc_name ="arcmsr", - .proc_info =arcmsr_proc_info, +static struct scsi_host_template arcmsr_scsi_host_template = { + .module = THIS_MODULE, + .proc_name = "arcmsr", + .proc_info = arcmsr_proc_info, .name = "ARCMSR ARECA SATA RAID HOST Adapter" ARCMSR_DRIVER_VERSION, - .release =arcmsr_release, - .info =arcmsr_info, - .ioctl =arcmsr_ioctl, - .queuecommand =arcmsr_queue_command, - .eh_abort_handler =arcmsr_cmd_abort, - .eh_bus_reset_handler =arcmsr_bus_reset, - .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, - .max_sectors =ARCMSR_MAX_XFER_SECTORS, - .cmd_per_lun =ARCMSR_MAX_CMD_PERLUN, - .unchecked_isa_dma =0, - .use_clustering =ENABLE_CLUSTERING, - .shost_attrs =arcmsr_scsi_host_attr, + .release = arcmsr_release, + .info = arcmsr_info, + .ioctl = arcmsr_ioctl, + .queuecommand = arcmsr_queue_command, + .eh_abort_handler = arcmsr_cmd_abort, + .eh_bus_reset_handler = arcmsr_bus_reset, + .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, + .max_sectors = ARCMSR_MAX_XFER_SECTORS, + .cmd_per_lun = ARCMSR_MAX_CMD_PERLUN, + .unchecked_isa_dma = 0, + .use_clustering = ENABLE_CLUSTERING, + .shost_attrs = arcmsr_scsi_host_attr, }; /* ******************************************************************************* ** notifier block to get a notify on system shutdown/halt/reboot ******************************************************************************* */ -static struct notifier_block arcmsr_event_notifier= -{ .notifier_call = arcmsr_halt_notify }; +static struct notifier_block arcmsr_event_notifier = { + .notifier_call = arcmsr_halt_notify +}; /* ******************************************************************************* ******************************************************************************* */ -static struct file_operations arcmsr_file_operations= -{ - .owner =THIS_MODULE, - .ioctl =arcmsr_fops_ioctl, - .open =arcmsr_fops_open, - .release =arcmsr_fops_close, +static struct file_operations arcmsr_file_operations = { + .owner = THIS_MODULE, + .ioctl = arcmsr_fops_ioctl, + .open = arcmsr_fops_open, + .release = arcmsr_fops_close, }; /* ******************************************************************************* ******************************************************************************* */ -static struct pci_device_id arcmsr_device_id_table[] __devinitdata= -{ +static struct pci_device_id arcmsr_device_id_table[] = { {PCI_DEVICE(PCIVendorIDARECA, PCIDeviceIDARC1110)}, {PCI_DEVICE(PCIVendorIDARECA, PCIDeviceIDARC1120)}, {PCI_DEVICE(PCIVendorIDARECA, PCIDeviceIDARC1130)}, @@ -283,38 +279,37 @@ static struct pci_device_id arcmsr_devic {0, 0}, /* Terminating entry */ }; MODULE_DEVICE_TABLE(pci, arcmsr_device_id_table); -static struct pci_driver arcmsr_pci_driver= -{ - .name ="arcmsr", - .id_table =arcmsr_device_id_table, - .probe =arcmsr_device_probe, - .remove =arcmsr_device_remove, +static struct pci_driver arcmsr_pci_driver = { + .name = "arcmsr", + .id_table = arcmsr_device_id_table, + .probe = arcmsr_device_probe, + .remove = arcmsr_device_remove, }; /* ******************************************************************************* ******************************************************************************* */ -static irqreturn_t arcmsr_do_interrupt(int irq,void *dev_id, +static irqreturn_t arcmsr_do_interrupt(int irq, void *dev_id, struct pt_regs *regs) { irqreturn_t handle_state; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct ACB *pACB; struct ACB *pACBtmp; unsigned long flags; - int i=0; + int i = 0; - pACB=(struct ACB *)dev_id; - pACBtmp=pHCBARC->pACB[i]; - while ((pACB !=pACBtmp) && pACBtmp && (i pACB[i]; + while ((pACB != pACBtmp) && pACBtmp && (i < ARCMSR_MAX_ADAPTER) ) { i++; - pACBtmp=pHCBARC->pACB[i]; + pACBtmp = pHCBARC->pACB[i]; } if (!pACBtmp) return IRQ_NONE; - spin_lock_irqsave(pACB->host->host_lock,flags); - handle_state=arcmsr_interrupt(pACB); - spin_unlock_irqrestore(pACB->host->host_lock,flags); + spin_lock_irqsave(pACB->host->host_lock, flags); + handle_state = arcmsr_interrupt(pACB); + spin_unlock_irqrestore(pACB->host->host_lock, flags); return handle_state; } /* @@ -322,9 +317,9 @@ static irqreturn_t arcmsr_do_interrupt(i ******************************************************************************* */ static int arcmsr_bios_param(struct scsi_device *sdev, - struct block_device *bdev,sector_t capacity, int *geom) + struct block_device *bdev, sector_t capacity, int *geom) { - int ret,heads,sectors,cylinders,total_capacity; + int ret, heads, sectors, cylinders, total_capacity; unsigned char *buffer;/* return copy of block device's partition table */ buffer = scsi_bios_ptable(bdev); @@ -334,95 +329,95 @@ static int arcmsr_bios_param(struct scsi if (ret != -1) return ret; } - total_capacity=capacity; - heads=64; - sectors=32; - cylinders=total_capacity / (heads * sectors); + total_capacity = capacity; + heads = 64; + sectors = 32; + cylinders = total_capacity / (heads * sectors); if (cylinders > 1024) { - heads=255; - sectors=63; - cylinders=total_capacity / (heads * sectors); - } - geom[0]=heads; - geom[1]=sectors; - geom[2]=cylinders; + heads = 255; + sectors = 63; + cylinders = total_capacity / (heads * sectors); + } + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; return 0; } /* ******************************************************************************* ******************************************************************************* */ -static int __devinit arcmsr_device_probe(struct pci_dev *pci_device, +static int arcmsr_device_probe(struct pci_dev *pci_device, const struct pci_device_id *id) { struct Scsi_Host *host; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct ACB *pACB; - uint8_t bus,dev_fun; + uint8_t bus, dev_fun; if (pci_enable_device(pci_device)) { printk(KERN_NOTICE "arcmsr%d: adapter probe: pci_enable_device error \n" - ,arcmsr_adapterCnt); + , arcmsr_adapterCnt); return -ENODEV; } - if ((host=scsi_host_alloc(&arcmsr_scsi_host_template, - sizeof(struct ACB)))==0) { + host = scsi_host_alloc(&arcmsr_scsi_host_template, sizeof (struct ACB)); + if (!host) { printk(KERN_NOTICE "arcmsr%d: adapter probe: scsi_host_alloc error \n" - ,arcmsr_adapterCnt); + , arcmsr_adapterCnt); return -ENODEV; } if (!pci_set_dma_mask(pci_device, DMA_64BIT_MASK)) printk(KERN_INFO "ARECA RAID ADAPTER%d: 64BITS PCI BUS DMA ADDRESSING SUPPORTED\n" - ,arcmsr_adapterCnt); + , arcmsr_adapterCnt); else if (!pci_set_dma_mask(pci_device, DMA_32BIT_MASK)) printk(KERN_INFO "ARECA RAID ADAPTER%d: 32BITS PCI BUS DMA ADDRESSING SUPPORTED\n" - ,arcmsr_adapterCnt); + , arcmsr_adapterCnt); else { printk(KERN_NOTICE "ARECA RAID ADAPTER%d: No suitable DMA available.\n" - ,arcmsr_adapterCnt); - return ENOMEM; + , arcmsr_adapterCnt); + return -ENOMEM; } if (pci_set_consistent_dma_mask(pci_device, DMA_32BIT_MASK)) { printk(KERN_NOTICE "ARECA RAID ADAPTER%d:" " No 32BIT coherent DMA adressing available\n" - ,arcmsr_adapterCnt); - return ENOMEM; + , arcmsr_adapterCnt); + return -ENOMEM; } bus = pci_device->bus->number; dev_fun = pci_device->devfn; - pACB=(struct ACB *) host->hostdata; - memset(pACB,0,sizeof(struct ACB)); + pACB = (struct ACB *) host->hostdata; + memset(pACB, 0, sizeof (struct ACB)); spin_lock_init(&pACB->qbuffer_lock); spin_lock_init(&pACB->pending_list_lock); spin_lock_init(&pACB->working_list_lock); spin_lock_init(&pACB->done_list_lock); - pACB->pci_device=pci_device; - pACB->host=host; - host->max_sectors=ARCMSR_MAX_XFER_SECTORS; - host->max_lun=ARCMSR_MAX_TARGETLUN; - host->max_id=ARCMSR_MAX_TARGETID;/*16:8*/ - host->max_cmd_len=16; /*this is issue of 64bit LBA, over 2T byte*/ - host->sg_tablesize=ARCMSR_MAX_SG_ENTRIES; - host->can_queue=ARCMSR_MAX_FREECCB_NUM; /* max simultaneous cmds */ - host->cmd_per_lun=ARCMSR_MAX_CMD_PERLUN; - host->this_id=ARCMSR_SCSI_INITIATOR_ID; - host->unique_id=(bus << 8) | dev_fun; - host->io_port=0; - host->n_io_port=0; - host->irq=pci_device->irq; + pACB->pci_device = pci_device; + pACB->host = host; + host->max_sectors = ARCMSR_MAX_XFER_SECTORS; + host->max_lun = ARCMSR_MAX_TARGETLUN; + host->max_id = ARCMSR_MAX_TARGETID;/*16:8*/ + host->max_cmd_len = 16; /*this is issue of 64bit LBA, over 2T byte*/ + host->sg_tablesize = ARCMSR_MAX_SG_ENTRIES; + host->can_queue = ARCMSR_MAX_FREECCB_NUM; /* max simultaneous cmds */ + host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN; + host->this_id = ARCMSR_SCSI_INITIATOR_ID; + host->unique_id = (bus << 8) | dev_fun; + host->io_port = 0; + host->n_io_port = 0; + host->irq = pci_device->irq; pci_set_master(pci_device); - if (arcmsr_initialize(pACB,pci_device)) { + if (arcmsr_initialize(pACB, pci_device)) { printk(KERN_NOTICE "arcmsr%d: initialize got error \n" - ,arcmsr_adapterCnt); - pHCBARC->adapterCnt=arcmsr_adapterCnt; - pHCBARC->pACB[arcmsr_adapterCnt]=NULL; + , arcmsr_adapterCnt); + pHCBARC->adapterCnt = arcmsr_adapterCnt; + pHCBARC->pACB[arcmsr_adapterCnt] = NULL; scsi_remove_host(host); scsi_host_put(host); return -ENODEV; @@ -430,21 +425,21 @@ static int __devinit arcmsr_device_probe if (pci_request_regions(pci_device, "arcmsr")) { printk(KERN_NOTICE "arcmsr%d: adapter probe: pci_request_regions failed \n" - ,arcmsr_adapterCnt--); - pHCBARC->adapterCnt=arcmsr_adapterCnt; + , arcmsr_adapterCnt--); + pHCBARC->adapterCnt = arcmsr_adapterCnt; arcmsr_pcidev_disattach(pACB); return -ENODEV; } -#ifdef CONFIG_PCI_MSI - if (pci_enable_msi(pci_device) == 0) +#ifdef CONFIG_SCSI_ARCMSR_MSI + if (!pci_enable_msi(pci_device)) pACB->acb_flags |= ACB_F_HAVE_MSI; #endif - if (request_irq(pci_device->irq,arcmsr_do_interrupt,SA_INTERRUPT | SA_SHIRQ, - "arcmsr",pACB)) { + if (request_irq(pci_device->irq, arcmsr_do_interrupt, SA_INTERRUPT | SA_SHIRQ, + "arcmsr", pACB)) { printk(KERN_NOTICE "arcmsr%d: request IRQ=%d failed !\n" - ,arcmsr_adapterCnt--,pci_device->irq); - pHCBARC->adapterCnt=arcmsr_adapterCnt; + , arcmsr_adapterCnt--, pci_device->irq); + pHCBARC->adapterCnt = arcmsr_adapterCnt; arcmsr_pcidev_disattach(pACB); return -ENODEV; } @@ -452,12 +447,12 @@ static int __devinit arcmsr_device_probe if (scsi_add_host(host, &pci_device->dev)) { printk(KERN_NOTICE "arcmsr%d: scsi_add_host got error \n" - ,arcmsr_adapterCnt--); - pHCBARC->adapterCnt=arcmsr_adapterCnt; + , arcmsr_adapterCnt--); + pHCBARC->adapterCnt = arcmsr_adapterCnt; arcmsr_pcidev_disattach(pACB); return -ENODEV; } - pHCBARC->adapterCnt=arcmsr_adapterCnt; + pHCBARC->adapterCnt = arcmsr_adapterCnt; pci_set_drvdata(pci_device, host); scsi_scan_host(host); return 0; @@ -468,14 +463,14 @@ static int __devinit arcmsr_device_probe */ static void arcmsr_device_remove(struct pci_dev *pci_device) { - struct Scsi_Host * host=pci_get_drvdata(pci_device); - struct ACB *pACB=(struct ACB *) host->hostdata; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct Scsi_Host * host = pci_get_drvdata(pci_device); + struct ACB *pACB = (struct ACB *) host->hostdata; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; int i; arcmsr_pcidev_disattach(pACB); /*if this is last pACB */ - for(i=0;ipACB[i]) return;/* this is not last adapter's release */ } @@ -489,22 +484,22 @@ static void arcmsr_device_remove(struct static int arcmsr_scsi_host_template_init( struct scsi_host_template * host_template) { - int error; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + int error; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; /* ** register as a PCI hot-plug driver module+ */ - memset(pHCBARC,0,sizeof(struct HCBARC)); - error=pci_module_init(&arcmsr_pci_driver); + memset(pHCBARC, 0, sizeof (struct HCBARC)); + error = pci_module_init(&arcmsr_pci_driver); if (pHCBARC->pACB[0]) { - host_template->proc_name="arcmsr"; + host_template->proc_name = "arcmsr"; register_reboot_notifier(&arcmsr_event_notifier); - pHCBARC->arcmsr_major_number=register_chrdev(0, "arcmsr" + pHCBARC->arcmsr_major_number = register_chrdev(0, "arcmsr" , &arcmsr_file_operations); printk(KERN_INFO "arcmsr device major number %d \n" - ,pHCBARC->arcmsr_major_number); + , pHCBARC->arcmsr_major_number); } return error; } @@ -532,16 +527,16 @@ module_exit(arcmsr_module_exit); */ static void arcmsr_pci_unmap_dma(struct CCB *pCCB) { - struct ACB *pACB=pCCB->pACB; - struct scsi_cmnd *pcmd=pCCB->pcmd; + struct ACB *pACB = pCCB->pACB; + struct scsi_cmnd *pcmd = pCCB->pcmd; - if (pcmd->use_sg !=0) { + if (pcmd->use_sg != 0) { struct scatterlist *sl; - sl=(struct scatterlist *)pcmd->request_buffer; - pci_unmap_sg(pACB->pci_device, sl, pcmd->use_sg,pcmd->sc_data_direction); + sl = (struct scatterlist *)pcmd->request_buffer; + pci_unmap_sg(pACB->pci_device, sl, pcmd->use_sg, pcmd->sc_data_direction); } - else if (pcmd->request_bufflen !=0) + else if (pcmd->request_bufflen != 0) pci_unmap_single(pACB->pci_device, (dma_addr_t)(unsigned long)pcmd->SCp.ptr, pcmd->request_bufflen, pcmd->sc_data_direction); @@ -552,22 +547,22 @@ static void arcmsr_pci_unmap_dma(struct */ static int arcmsr_fops_open(struct inode *inode, struct file *filep) { - int i,minor; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + int i, minor; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct ACB *pACB; - minor=MINOR(inode->i_rdev); - if (minor >=pHCBARC->adapterCnt) - return ENXIO; - for(i=0;ipACB[i]; + minor = MINOR(inode->i_rdev); + if (minor >= pHCBARC->adapterCnt) + return -ENODEV; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (pACB) { - if (pACB->adapter_index==minor) + if (pACB->adapter_index == minor) break; } } - if (i>=ARCMSR_MAX_ADAPTER) - return ENXIO; + if (i >= ARCMSR_MAX_ADAPTER) + return -ENODEV; return 0;/* success */ } /* @@ -576,22 +571,22 @@ static int arcmsr_fops_open(struct inode */ static int arcmsr_fops_close(struct inode *inode, struct file *filep) { - int i,minor; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + int i, minor; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct ACB *pACB; - minor=MINOR(inode->i_rdev); - if (minor >=pHCBARC->adapterCnt) - return ENXIO; - for(i=0;ipACB[i]; + minor = MINOR(inode->i_rdev); + if (minor >= pHCBARC->adapterCnt) + return -ENODEV; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (pACB) { - if (pACB->adapter_index==minor) + if (pACB->adapter_index == minor) break; } } - if (i>=ARCMSR_MAX_ADAPTER) - return ENXIO; + if (i >= ARCMSR_MAX_ADAPTER) + return -ENODEV; return 0; } /* @@ -601,23 +596,23 @@ static int arcmsr_fops_close(struct inod static int arcmsr_fops_ioctl(struct inode *inode, struct file *filep, unsigned int ioctl_cmd, unsigned long arg) { - int i,minor; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + int i, minor; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct ACB *pACB; - minor=MINOR(inode->i_rdev); - if (minor >=pHCBARC->adapterCnt) - return ENXIO; - for(i=0;ipACB[i]; + minor = MINOR(inode->i_rdev); + if (minor >= pHCBARC->adapterCnt) + return -ENODEV; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (pACB) { - if (pACB->adapter_index==minor) + if (pACB->adapter_index == minor) break; } } - if (i>=ARCMSR_MAX_ADAPTER) - return ENXIO; - return arcmsr_iop_ioctlcmd(pACB,ioctl_cmd,(void *)arg); + if (i >= ARCMSR_MAX_ADAPTER) + return -ENODEV; + return arcmsr_iop_ioctlcmd(pACB, ioctl_cmd, (void __user *) arg); } /* ******************************************************************************* @@ -625,30 +620,32 @@ static int arcmsr_fops_ioctl(struct inod */ static void arcmsr_flush_adapter_cache(struct ACB *pACB) { - writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE,&pACB->pmu->inbound_msgaddr0); + struct MU __iomem *reg=pACB->pmu; + + writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' timeout \n" - ,pACB->adapter_index); + , pACB->adapter_index); } /* ******************************************************************************* ******************************************************************************* */ -static void arcmsr_ccb_complete(struct CCB *pCCB,int stand_flag) +static void arcmsr_ccb_complete(struct CCB *pCCB, int stand_flag) { unsigned long flags; - struct ACB *pACB=pCCB->pACB; - struct scsi_cmnd *pcmd=pCCB->pcmd; + struct ACB *pACB = pCCB->pACB; + struct scsi_cmnd *pcmd = pCCB->pcmd; arcmsr_pci_unmap_dma(pCCB); - spin_lock_irqsave(&pACB->done_list_lock,flags); - if (stand_flag==1) + spin_lock_irqsave(&pACB->done_list_lock, flags); + if (stand_flag == 1) atomic_dec(&pACB->ccboutstandingcount); - pCCB->startdone=ARCMSR_CCB_DONE; - pCCB->ccb_flags=0; + pCCB->startdone = ARCMSR_CCB_DONE; + pCCB->ccb_flags = 0; list_add_tail(&pCCB->list, &pACB->ccb_free_list); - spin_unlock_irqrestore(&pACB->done_list_lock,flags); + spin_unlock_irqrestore(&pACB->done_list_lock, flags); pcmd->scsi_done(pcmd); } /* @@ -657,18 +654,18 @@ static void arcmsr_ccb_complete(struct C */ static void arcmsr_report_sense_info(struct CCB *pCCB) { - struct scsi_cmnd *pcmd=pCCB->pcmd; - struct SENSE_DATA *psenseBuffer=(struct SENSE_DATA *)pcmd->sense_buffer; + struct scsi_cmnd *pcmd = pCCB->pcmd; + struct SENSE_DATA *psenseBuffer = (struct SENSE_DATA *)pcmd->sense_buffer; - pcmd->result=DID_OK << 16; + pcmd->result = DID_OK << 16; if (psenseBuffer) { - int sense_data_length= - sizeof(struct SENSE_DATA) < sizeof(pcmd->sense_buffer) - ? sizeof(struct SENSE_DATA) : sizeof(pcmd->sense_buffer); - memset(psenseBuffer, 0, sizeof(pcmd->sense_buffer)); - memcpy(psenseBuffer,pCCB->arcmsr_cdb.SenseData,sense_data_length); - psenseBuffer->ErrorCode=0x70; - psenseBuffer->Valid=1; + int sense_data_length = + sizeof (struct SENSE_DATA) < sizeof (pcmd->sense_buffer) + ? sizeof (struct SENSE_DATA) : sizeof (pcmd->sense_buffer); + memset(psenseBuffer, 0, sizeof (pcmd->sense_buffer)); + memcpy(psenseBuffer, pCCB->arcmsr_cdb.SenseData, sense_data_length); + psenseBuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS; + psenseBuffer->Valid = 1; } } /* @@ -676,7 +673,7 @@ static void arcmsr_report_sense_info(str ** to insert pCCB into tail of pACB wait exec ccbQ ******************************************************************************* */ -static void arcmsr_queue_pendingccb(struct ACB *pACB,struct CCB *pCCB) +static void arcmsr_queue_pendingccb(struct ACB *pACB, struct CCB *pCCB) { unsigned long flags; @@ -691,11 +688,13 @@ static void arcmsr_queue_pendingccb(stru */ static void arcmsr_abort_allcmd(struct ACB *pACB) { - writel(ARCMSR_INBOUND_MESG0_ABORT_CMD,&pACB->pmu->inbound_msgaddr0); + struct MU __iomem *reg = pACB->pmu; + + writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: wait 'abort all outstanding command' timeout \n" - ,pACB->adapter_index); + , pACB->adapter_index); } /* ******************************************************************************* @@ -703,14 +702,16 @@ static void arcmsr_abort_allcmd(struct A */ static uint8_t arcmsr_wait_msgint_ready(struct ACB *pACB) { + struct MU __iomem *reg = pACB->pmu; uint32_t Index; - uint8_t Retries=0x00; + uint8_t Retries = 0x00; + do { - for(Index=0; Index < 100; Index++) { - if (readl(&pACB->pmu->outbound_intstatus) + for(Index = 0; Index < 100; Index++) { + if (readl(®->outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) { writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT - ,&pACB->pmu->outbound_intstatus); + , ®->outbound_intstatus); return 0x00; } msleep_interruptible(10); @@ -726,9 +727,9 @@ static struct CCB *arcmsr_get_pendingccb { unsigned long flags; struct list_head *head = &pACB->ccb_pending_list; - struct CCB *pCCB=NULL; + struct CCB *pCCB = NULL; - if (spin_trylock_irqsave(&pACB->pending_list_lock,flags)) { + if (spin_trylock_irqsave(&pACB->pending_list_lock, flags)) { if (!list_empty(head)) { pCCB = list_entry(head->next, struct CCB, list); atomic_dec(&pACB->ccbpendingcount); @@ -744,151 +745,153 @@ static struct CCB *arcmsr_get_pendingccb */ static void arcmsr_iop_reset(struct ACB *pACB) { + struct MU __iomem *reg = pACB->pmu; struct CCB *pCCB; - uint32_t intmask_org,mask; - int i=0; + uint32_t intmask_org, mask; + int i = 0; - if (atomic_read(&pACB->ccboutstandingcount)!=0) { + if (atomic_read(&pACB->ccboutstandingcount) != 0) { /* talk to iop 331 outstanding command aborted */ arcmsr_abort_allcmd(pACB); /* wait for 3 sec for all command aborted*/ msleep_interruptible(3000); /* disable all outbound interrupt */ - intmask_org=readl(&pACB->pmu->outbound_intmask); - writel(intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE, - &pACB->pmu->outbound_intmask); + intmask_org = readl(®->outbound_intmask); + writel(intmask_org | ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE, + ®->outbound_intmask); /* clear all outbound posted Q */ - for(i=0;ipmu->outbound_queueport); - for(i=0;ipccb_pool[i]; - if (pCCB->startdone==ARCMSR_CCB_START) { - pCCB->startdone=ARCMSR_CCB_ABORTED; - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,1); + for(i = 0; i < ARCMSR_MAX_OUTSTANDING_CMD; i++) + readl(®->outbound_queueport); + for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) { + pCCB = pACB->pccb_pool[i]; + if (pCCB->startdone == ARCMSR_CCB_START) { + pCCB->startdone = ARCMSR_CCB_ABORTED; + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 1); } } /* enable all outbound interrupt */ - mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE - |ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); - writel(intmask_org & mask,&pACB->pmu->outbound_intmask); + mask =~ (ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE + | ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); + writel(intmask_org & mask, ®->outbound_intmask); } - while (atomic_read(&pACB->ccbpendingcount)!=0) { - pCCB=arcmsr_get_pendingccb(pACB); + while (atomic_read(&pACB->ccbpendingcount) != 0) { + pCCB = arcmsr_get_pendingccb(pACB); if (pCCB) { printk(KERN_NOTICE "arcmsr%d:iop reset abort command ccbpendingcount=%d \n" - ,pACB->adapter_index,atomic_read(&pACB->ccbpendingcount)); - pCCB->startdone=ARCMSR_CCB_ABORTED; - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,0); + , pACB->adapter_index, atomic_read(&pACB->ccbpendingcount)); + pCCB->startdone = ARCMSR_CCB_ABORTED; + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 0); atomic_dec(&pACB->ccbpendingcount); } else break; } - atomic_set(&pACB->ccboutstandingcount,0); - atomic_set(&pACB->ccbpendingcount,0); + atomic_set(&pACB->ccboutstandingcount, 0); + atomic_set(&pACB->ccbpendingcount, 0); } /* ******************************************************************************* ******************************************************************************* */ -static void arcmsr_build_ccb(struct ACB *pACB,struct CCB *pCCB, +static void arcmsr_build_ccb(struct ACB *pACB, struct CCB *pCCB, struct scsi_cmnd *pcmd) { - struct ARCMSR_CDB *pARCMSR_CDB=(struct ARCMSR_CDB *)&pCCB->arcmsr_cdb; - int8_t *psge=(int8_t *)&pARCMSR_CDB->u; - uint32_t address_lo,address_hi; - int arccdbsize=0x30; - - pCCB->pcmd=pcmd; - memset(pARCMSR_CDB,0,sizeof(struct ARCMSR_CDB)); - pARCMSR_CDB->Bus=0; - pARCMSR_CDB->TargetID=pcmd->device->id; - pARCMSR_CDB->LUN=pcmd->device->lun; - pARCMSR_CDB->Function=1; - pARCMSR_CDB->CdbLength=(uint8_t)pcmd->cmd_len; - pARCMSR_CDB->Context=(unsigned long)pARCMSR_CDB; + struct ARCMSR_CDB *pARCMSR_CDB = (struct ARCMSR_CDB *)&pCCB->arcmsr_cdb; + int8_t *psge = (int8_t *)&pARCMSR_CDB->u; + uint32_t address_lo, address_hi; + int arccdbsize = 0x30; + + pCCB->pcmd = pcmd; + memset(pARCMSR_CDB, 0, sizeof (struct ARCMSR_CDB)); + pARCMSR_CDB->Bus = 0; + pARCMSR_CDB->TargetID = pcmd->device->id; + pARCMSR_CDB->LUN = pcmd->device->lun; + pARCMSR_CDB->Function = 1; + pARCMSR_CDB->CdbLength = (uint8_t)pcmd->cmd_len; + pARCMSR_CDB->Context = (unsigned long)pARCMSR_CDB; memcpy(pARCMSR_CDB->Cdb, pcmd->cmnd, pcmd->cmd_len); if (pcmd->use_sg) { - int length,sgcount,i,cdb_sgcount=0; + int length, sgcount, i, cdb_sgcount = 0; struct scatterlist *sl; /* Get Scatter Gather List from scsiport. */ - sl=(struct scatterlist *) pcmd->request_buffer; - sgcount=pci_map_sg(pACB->pci_device, sl, pcmd->use_sg, + sl = (struct scatterlist *) pcmd->request_buffer; + sgcount = pci_map_sg(pACB->pci_device, sl, pcmd->use_sg, pcmd->sc_data_direction); /* map stor port SG list to our iop SG List. */ - for(i=0;iaddress=address_lo; - pdma_sg->length=length; - psge +=sizeof(struct SG32ENTRY); - arccdbsize +=sizeof(struct SG32ENTRY); + length = cpu_to_le32(sg_dma_len(sl)); + address_lo = cpu_to_le32(dma_addr_lo32(sg_dma_address(sl))); + address_hi = cpu_to_le32(dma_addr_hi32(sg_dma_address(sl))); + if (address_hi == 0) { + struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge; + + pdma_sg->address = address_lo; + pdma_sg->length = length; + psge += sizeof (struct SG32ENTRY); + arccdbsize += sizeof (struct SG32ENTRY); } else { - struct SG64ENTRY *pdma_sg=(struct SG64ENTRY *)psge; + struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge; - pdma_sg->addresshigh=address_hi; - pdma_sg->address=address_lo; - pdma_sg->length=length|IS_SG64_ADDR; - psge +=sizeof(struct SG64ENTRY); - arccdbsize +=sizeof(struct SG64ENTRY); + pdma_sg->addresshigh = address_hi; + pdma_sg->address = address_lo; + pdma_sg->length = length|IS_SG64_ADDR; + psge += sizeof (struct SG64ENTRY); + arccdbsize += sizeof (struct SG64ENTRY); } sl++; cdb_sgcount++; } - pARCMSR_CDB->sgcount=(uint8_t)cdb_sgcount; - pARCMSR_CDB->DataLength=pcmd->request_bufflen; + pARCMSR_CDB->sgcount = (uint8_t)cdb_sgcount; + pARCMSR_CDB->DataLength = pcmd->request_bufflen; if ( arccdbsize > 256) - pARCMSR_CDB->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE; + pARCMSR_CDB->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE; } else if (pcmd->request_bufflen) { dma_addr_t dma_addr; - dma_addr=pci_map_single(pACB->pci_device, pcmd->request_buffer, + dma_addr = pci_map_single(pACB->pci_device, pcmd->request_buffer, pcmd->request_bufflen, pcmd->sc_data_direction); - pcmd->SCp.ptr=(char *)(unsigned long) dma_addr; - address_lo=cpu_to_le32(dma_addr_lo32(dma_addr)); - address_hi=cpu_to_le32(dma_addr_hi32(dma_addr)); - if (address_hi==0) { - struct SG32ENTRY *pdma_sg=(struct SG32ENTRY *)psge; - pdma_sg->address=address_lo; - pdma_sg->length=pcmd->request_bufflen; + pcmd->SCp.ptr = (char *)(unsigned long) dma_addr; + address_lo = cpu_to_le32(dma_addr_lo32(dma_addr)); + address_hi = cpu_to_le32(dma_addr_hi32(dma_addr)); + if (address_hi == 0) { + struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge; + pdma_sg->address = address_lo; + pdma_sg->length = pcmd->request_bufflen; } else { - struct SG64ENTRY *pdma_sg=(struct SG64ENTRY *)psge; - pdma_sg->addresshigh=address_hi; - pdma_sg->address=address_lo; - pdma_sg->length=pcmd->request_bufflen|IS_SG64_ADDR; + struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge; + pdma_sg->addresshigh = address_hi; + pdma_sg->address = address_lo; + pdma_sg->length = pcmd->request_bufflen|IS_SG64_ADDR; } - pARCMSR_CDB->sgcount=1; - pARCMSR_CDB->DataLength=pcmd->request_bufflen; + pARCMSR_CDB->sgcount = 1; + pARCMSR_CDB->DataLength = pcmd->request_bufflen; } - if (pcmd->cmnd[0]|WRITE_6 || pcmd->cmnd[0]|WRITE_10) { - pARCMSR_CDB->Flags|=ARCMSR_CDB_FLAG_WRITE; - pCCB->ccb_flags|=CCB_FLAG_WRITE; + if (pcmd->cmnd[0] | WRITE_6 || pcmd->cmnd[0] | WRITE_10) { + pARCMSR_CDB->Flags |= ARCMSR_CDB_FLAG_WRITE; + pCCB->ccb_flags |= CCB_FLAG_WRITE; } } /* ******************************************************************************* ******************************************************************************* */ -static void arcmsr_post_ccb(struct ACB *pACB,struct CCB *pCCB) +static void arcmsr_post_ccb(struct ACB *pACB, struct CCB *pCCB) { - uint32_t cdb_shifted_phyaddr=pCCB->cdb_shifted_phyaddr; - struct ARCMSR_CDB *pARCMSR_CDB=(struct ARCMSR_CDB *)&pCCB->arcmsr_cdb; + struct MU __iomem *reg = pACB->pmu; + uint32_t cdb_shifted_phyaddr = pCCB->cdb_shifted_phyaddr; + struct ARCMSR_CDB *pARCMSR_CDB = (struct ARCMSR_CDB *)&pCCB->arcmsr_cdb; atomic_inc(&pACB->ccboutstandingcount); - pCCB->startdone=ARCMSR_CCB_START; + pCCB->startdone = ARCMSR_CCB_START; if (pARCMSR_CDB->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) - writel(cdb_shifted_phyaddr|ARCMSR_CCBPOST_FLAG_SGL_BSIZE, - &pACB->pmu->inbound_queueport); + writel(cdb_shifted_phyaddr | ARCMSR_CCBPOST_FLAG_SGL_BSIZE, + ®->inbound_queueport); else - writel(cdb_shifted_phyaddr,&pACB->pmu->inbound_queueport); + writel(cdb_shifted_phyaddr, ®->inbound_queueport); } /* ******************************************************************************* @@ -900,10 +903,10 @@ static void arcmsr_post_pendingccb(struc while ((atomic_read(&pACB->ccbpendingcount) > 0) && (atomic_read(&pACB->ccboutstandingcount) < ARCMSR_MAX_OUTSTANDING_CMD)) { - pCCB=arcmsr_get_pendingccb(pACB); - if (pCCB==NULL) + pCCB = arcmsr_get_pendingccb(pACB); + if (!pCCB) break; - arcmsr_post_ccb(pACB,pCCB); + arcmsr_post_ccb(pACB, pCCB); } } /* @@ -912,25 +915,24 @@ static void arcmsr_post_pendingccb(struc */ static void arcmsr_post_Qbuffer(struct ACB *pACB) { - uint8_t * pQbuffer; - struct QBUFFER * pwbuffer=(struct QBUFFER *)&pACB->pmu->ioctl_wbuffer; - uint8_t * iop_data=(uint8_t *)pwbuffer->data; - int32_t allxfer_len=0; + struct MU __iomem *reg = pACB->pmu; + struct QBUFFER __iomem *pwbuffer = (struct QBUFFER __iomem *) ®->ioctl_wbuffer; + uint8_t __iomem *iop_data = (uint8_t __iomem *) pwbuffer->data; + int32_t allxfer_len = 0; if (pACB->acb_flags & ACB_F_IOCTL_WQBUFFER_READED) { pACB->acb_flags &= (~ACB_F_IOCTL_WQBUFFER_READED); - while ((pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex) - && (allxfer_len<124)) { - pQbuffer= &pACB->wqbuffer[pACB->wqbuf_firstindex]; - memcpy(iop_data,pQbuffer,1); + while ((pACB->wqbuf_firstindex != pACB->wqbuf_lastindex) + && (allxfer_len < 124)) { + writeb(pACB->wqbuffer[pACB->wqbuf_firstindex], iop_data); pACB->wqbuf_firstindex++; - pACB->wqbuf_firstindex %=ARCMSR_MAX_QBUFFER; + pACB->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; iop_data++; allxfer_len++; } - pwbuffer->data_len=allxfer_len; + writel(allxfer_len, &pwbuffer->data_len); writel(ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK - ,&pACB->pmu->inbound_doorbell); + , ®->inbound_doorbell); } } /* @@ -939,12 +941,14 @@ static void arcmsr_post_Qbuffer(struct A */ static void arcmsr_stop_adapter_bgrb(struct ACB *pACB) { - pACB->acb_flags &=~ACB_F_MSG_START_BGRB; - writel(ARCMSR_INBOUND_MESG0_STOP_BGRB,&pACB->pmu->inbound_msgaddr0); + struct MU __iomem *reg = pACB->pmu; + + pACB->acb_flags &= ~ACB_F_MSG_START_BGRB; + writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: wait 'stop adapter background rebulid' timeout \n" - ,pACB->adapter_index); + , pACB->adapter_index); } /* ******************************************************************************* @@ -953,7 +957,7 @@ static void arcmsr_stop_adapter_bgrb(str static void arcmsr_free_ccb_pool(struct ACB *pACB) { dma_free_coherent(&pACB->pci_device->dev - ,ARCMSR_MAX_FREECCB_NUM * sizeof(struct CCB) + 0x20, + , ARCMSR_MAX_FREECCB_NUM * sizeof (struct CCB) + 0x20, pACB->dma_coherent, pACB->dma_coherent_handle); } @@ -963,138 +967,136 @@ static void arcmsr_free_ccb_pool(struct */ static irqreturn_t arcmsr_interrupt(struct ACB *pACB) { + struct MU __iomem *reg = pACB->pmu; struct CCB *pCCB; - uint32_t flag_ccb,outbound_intstatus,outbound_doorbell; + uint32_t flag_ccb, outbound_intstatus, outbound_doorbell; - outbound_intstatus=readl(&pACB->pmu->outbound_intstatus) + outbound_intstatus = readl(®->outbound_intstatus) & pACB->outbound_int_enable; - writel(outbound_intstatus,&pACB->pmu->outbound_intstatus); + writel(outbound_intstatus, ®->outbound_intstatus); if (outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) { - outbound_doorbell=readl(&pACB->pmu->outbound_doorbell); - writel(outbound_doorbell,&pACB->pmu->outbound_doorbell); + outbound_doorbell = readl(®->outbound_doorbell); + writel(outbound_doorbell, ®->outbound_doorbell); if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK) { - struct QBUFFER * prbuffer=(struct QBUFFER *)&pACB->pmu->ioctl_rbuffer; - uint8_t * iop_data=(uint8_t *)prbuffer->data; - uint8_t * pQbuffer; - int32_t my_empty_len,iop_len,rqbuf_firstindex,rqbuf_lastindex; - - rqbuf_lastindex=pACB->rqbuf_lastindex; - rqbuf_firstindex=pACB->rqbuf_firstindex; - iop_len=prbuffer->data_len; - my_empty_len=(rqbuf_firstindex-rqbuf_lastindex-1) - &(ARCMSR_MAX_QBUFFER-1); - if (my_empty_len>=iop_len) { + struct QBUFFER __iomem * prbuffer = + (struct QBUFFER __iomem *) ®->ioctl_rbuffer; + uint8_t __iomem * iop_data = (uint8_t __iomem *)prbuffer->data; + int32_t my_empty_len, iop_len, rqbuf_firstindex, rqbuf_lastindex; + + rqbuf_lastindex = pACB->rqbuf_lastindex; + rqbuf_firstindex = pACB->rqbuf_firstindex; + iop_len = readl(&prbuffer->data_len); + my_empty_len = (rqbuf_firstindex - rqbuf_lastindex - 1) + &(ARCMSR_MAX_QBUFFER - 1); + if (my_empty_len >= iop_len) { while (iop_len > 0) { - pQbuffer= &pACB->rqbuffer[pACB->rqbuf_lastindex]; - memcpy(pQbuffer,iop_data,1); + pACB->rqbuffer[pACB->rqbuf_lastindex] = readb(iop_data); pACB->rqbuf_lastindex++; - pACB->rqbuf_lastindex %=ARCMSR_MAX_QBUFFER; + pACB->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER; iop_data++; iop_len--; } writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, - &pACB->pmu->inbound_doorbell); + ®->inbound_doorbell); } else - pACB->acb_flags|=ACB_F_IOPDATA_OVERFLOW; + pACB->acb_flags |= ACB_F_IOPDATA_OVERFLOW; } if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK) { pACB->acb_flags |= ACB_F_IOCTL_WQBUFFER_READED; - if (pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex) { - uint8_t * pQbuffer; - struct QBUFFER * pwbuffer= - (struct QBUFFER *)&pACB->pmu->ioctl_wbuffer; - uint8_t * iop_data=(uint8_t *)pwbuffer->data; - int32_t allxfer_len=0; + if (pACB->wqbuf_firstindex != pACB->wqbuf_lastindex) { + struct QBUFFER __iomem * pwbuffer = + (struct QBUFFER __iomem *) ®->ioctl_wbuffer; + uint8_t __iomem * iop_data = (uint8_t __iomem *) pwbuffer->data; + int32_t allxfer_len = 0; pACB->acb_flags &= (~ACB_F_IOCTL_WQBUFFER_READED); - while ((pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex) - && (allxfer_len<124)) { - pQbuffer= &pACB->wqbuffer[pACB->wqbuf_firstindex]; - memcpy(iop_data,pQbuffer,1); + while ((pACB->wqbuf_firstindex != pACB->wqbuf_lastindex) + && (allxfer_len < 124)) { + writeb(pACB->wqbuffer[pACB->wqbuf_firstindex], iop_data); pACB->wqbuf_firstindex++; - pACB->wqbuf_firstindex %=ARCMSR_MAX_QBUFFER; + pACB->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; iop_data++; allxfer_len++; } - pwbuffer->data_len=allxfer_len; + writel(allxfer_len, &pwbuffer->data_len); writel(ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK, - &pACB->pmu->inbound_doorbell); + ®->inbound_doorbell); } - if (pACB->wqbuf_firstindex==pACB->wqbuf_lastindex) - pACB->acb_flags |=ACB_F_IOCTL_WQBUFFER_CLEARED; + if (pACB->wqbuf_firstindex == pACB->wqbuf_lastindex) + pACB->acb_flags |= ACB_F_IOCTL_WQBUFFER_CLEARED; } } if (outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) { - int id,lun; + int id, lun; /* **************************************************************** ** areca cdb command done **************************************************************** */ while (1) { - if ((flag_ccb=readl(&pACB->pmu->outbound_queueport))==0xFFFFFFFF) + if ((flag_ccb = readl(®->outbound_queueport)) == 0xFFFFFFFF) break;/*chip FIFO no ccb for completion already*/ /* check if command done with no error*/ - pCCB=(struct CCB *)(pACB->vir2phy_offset+(flag_ccb << 5)); - if ((pCCB->pACB!=pACB) || (pCCB->startdone!=ARCMSR_CCB_START)) { - if (pCCB->startdone==ARCMSR_CCB_ABORTED) { + pCCB = (struct CCB *)(pACB->vir2phy_offset + (flag_ccb << 5)); + if ((pCCB->pACB != pACB) || (pCCB->startdone != ARCMSR_CCB_START)) { + if (pCCB->startdone == ARCMSR_CCB_ABORTED) { printk(KERN_NOTICE "arcmsr%d: ccb='0x%p' isr got aborted command \n" - ,pACB->adapter_index,pCCB); + , pACB->adapter_index, pCCB); continue; } printk(KERN_NOTICE "arcmsr%d: isr get an illegal ccb command done acb='0x%p'" - "ccb='0x%p' ccbacb='0x%p' startdone=0x%x" + "ccb='0x%p' ccbacb='0x%p' startdone = 0x%x" " ccboutstandingcount=%d \n" - ,pACB->adapter_index - ,pACB - ,pCCB - ,pCCB->pACB - ,pCCB->startdone - ,atomic_read(&pACB->ccboutstandingcount)); + , pACB->adapter_index + , pACB + , pCCB + , pCCB->pACB + , pCCB->startdone + , atomic_read(&pACB->ccboutstandingcount)); continue; } - id=pCCB->pcmd->device->id; - lun=pCCB->pcmd->device->lun; - if ((flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR)==0) { - if (pACB->devstate[id][lun]==ARECA_RAID_GONE) - pACB->devstate[id][lun]=ARECA_RAID_GOOD; - pCCB->pcmd->result=DID_OK << 16; - arcmsr_ccb_complete(pCCB,1); + id = pCCB->pcmd->device->id; + lun = pCCB->pcmd->device->lun; + if (!(flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR)) { + if (pACB->devstate[id][lun] == ARECA_RAID_GONE) + pACB->devstate[id][lun] = ARECA_RAID_GOOD; + pCCB->pcmd->result = DID_OK << 16; + arcmsr_ccb_complete(pCCB, 1); } else { switch(pCCB->arcmsr_cdb.DeviceStatus) { case ARCMSR_DEV_SELECT_TIMEOUT: { - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_TIME_OUT << 16; - arcmsr_ccb_complete(pCCB,1); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_TIME_OUT << 16; + arcmsr_ccb_complete(pCCB, 1); } break; case ARCMSR_DEV_ABORTED: case ARCMSR_DEV_INIT_FAIL: { - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_BAD_TARGET << 16; - arcmsr_ccb_complete(pCCB,1); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_BAD_TARGET << 16; + arcmsr_ccb_complete(pCCB, 1); } break; case SCSISTAT_CHECK_CONDITION: { - pACB->devstate[id][lun]=ARECA_RAID_GOOD; + pACB->devstate[id][lun] = ARECA_RAID_GOOD; arcmsr_report_sense_info(pCCB); - arcmsr_ccb_complete(pCCB,1); + arcmsr_ccb_complete(pCCB, 1); } break; default: printk(KERN_NOTICE "arcmsr%d: scsi id=%d lun=%d" " isr get command error done," - "but got unknow DeviceStatus=0x%x \n" - ,pACB->adapter_index - ,id - ,lun - ,pCCB->arcmsr_cdb.DeviceStatus); - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_NO_CONNECT << 16; - arcmsr_ccb_complete(pCCB,1); + "but got unknown DeviceStatus = 0x%x \n" + , pACB->adapter_index + , id + , lun + , pCCB->arcmsr_cdb.DeviceStatus); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_NO_CONNECT << 16; + arcmsr_ccb_complete(pCCB, 1); break; } } @@ -1124,26 +1126,27 @@ static void arcmsr_iop_parking(struct AC ******************************************************************************* ******************************************************************************* */ -static int arcmsr_iop_ioctlcmd(struct ACB *pACB,int ioctl_cmd,void *arg) +static int arcmsr_iop_ioctlcmd(struct ACB *pACB, int ioctl_cmd, void __user * arg) { + struct MU __iomem *reg = pACB->pmu; struct CMD_IOCTL_FIELD *pcmdioctlfld; dma_addr_t cmd_handle; - unsigned long flag; - int retvalue=0; + unsigned long flags; + int retvalue = 0; - spin_lock_irqsave(&pACB->qbuffer_lock,flag); - pcmdioctlfld=pci_alloc_consistent(pACB->pci_device, + spin_lock_irqsave(&pACB->qbuffer_lock, flags); + pcmdioctlfld = pci_alloc_consistent(pACB->pci_device, sizeof (struct CMD_IOCTL_FIELD), &cmd_handle); - if (pcmdioctlfld==NULL) { - spin_unlock_irqrestore(&pACB->qbuffer_lock,flag); - return ENOMEM; + if (!pcmdioctlfld) { + spin_unlock_irqrestore(&pACB->qbuffer_lock, flags); + return -ENOMEM; } - if (copy_from_user(pcmdioctlfld, arg, sizeof (struct CMD_IOCTL_FIELD))!=0) { - retvalue= -EFAULT; + if (copy_from_user(pcmdioctlfld, arg, sizeof (struct CMD_IOCTL_FIELD)) != 0) { + retvalue = -EFAULT; goto ioctl_out; } - if (memcmp(pcmdioctlfld->cmdioctl.Signature,"ARCMSR",6)!=0) { - retvalue= -EINVAL; + if (memcmp(pcmdioctlfld->cmdioctl.Signature, "ARCMSR", 6) !=0 ) { + retvalue = -EINVAL; goto ioctl_out; } switch(ioctl_cmd) { @@ -1151,181 +1154,179 @@ static int arcmsr_iop_ioctlcmd(struct AC unsigned long *ver_addr; dma_addr_t buf_handle; uint8_t *pQbuffer,*ptmpQbuffer; - int32_t allxfer_len=0; + int32_t allxfer_len = 0; - ver_addr=pci_alloc_consistent(pACB->pci_device, 1032, &buf_handle); - if (ver_addr==NULL) { - retvalue= ENOMEM; + ver_addr = pci_alloc_consistent(pACB->pci_device, 1032, &buf_handle); + if (!ver_addr) { + retvalue = -ENOMEM; goto ioctl_out; } - ptmpQbuffer=(uint8_t *)ver_addr; - while ((pACB->rqbuf_firstindex!=pACB->rqbuf_lastindex) - && (allxfer_len<1031)) { - pQbuffer= &pACB->rqbuffer[pACB->rqbuf_firstindex]; - memcpy(ptmpQbuffer,pQbuffer,1); + ptmpQbuffer = (uint8_t *)ver_addr; + while ((pACB->rqbuf_firstindex != pACB->rqbuf_lastindex) + && (allxfer_len < 1031)) { + pQbuffer = &pACB->rqbuffer[pACB->rqbuf_firstindex]; + memcpy(ptmpQbuffer, pQbuffer, 1); pACB->rqbuf_firstindex++; - pACB->rqbuf_firstindex %=ARCMSR_MAX_QBUFFER; + pACB->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER; ptmpQbuffer++; allxfer_len++; } if (pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW) { - struct QBUFFER * prbuffer=(struct QBUFFER *) - &pACB->pmu->ioctl_rbuffer; - uint8_t * pQbuffer; - uint8_t * iop_data=(uint8_t *)prbuffer->data; + struct QBUFFER __iomem * prbuffer = (struct QBUFFER __iomem *) + ®->ioctl_rbuffer; + uint8_t __iomem * iop_data = (uint8_t __iomem *)prbuffer->data; int32_t iop_len; - pACB->acb_flags &=~ACB_F_IOPDATA_OVERFLOW; - iop_len=(int32_t)prbuffer->data_len; - while (iop_len>0) { - pQbuffer= &pACB->rqbuffer[pACB->rqbuf_lastindex]; - memcpy(pQbuffer,iop_data,1); + pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; + iop_len = readl(&prbuffer->data_len); + while (iop_len > 0) { + pACB->rqbuffer[pACB->rqbuf_lastindex] = readb(iop_data); pACB->rqbuf_lastindex++; - pACB->rqbuf_lastindex %=ARCMSR_MAX_QBUFFER; + pACB->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER; iop_data++; iop_len--; } writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, - &pACB->pmu->inbound_doorbell); + ®->inbound_doorbell); } - memcpy(pcmdioctlfld->ioctldatabuffer,(uint8_t *)ver_addr,allxfer_len); - pcmdioctlfld->cmdioctl.Length=allxfer_len; - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK; - if (copy_to_user(arg,pcmdioctlfld,sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + memcpy(pcmdioctlfld->ioctldatabuffer, (uint8_t *)ver_addr, allxfer_len); + pcmdioctlfld->cmdioctl.Length = allxfer_len; + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; + if (copy_to_user(arg, pcmdioctlfld, sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; pci_free_consistent(pACB->pci_device, 1032, ver_addr, buf_handle); } break; case ARCMSR_IOCTL_WRITE_WQBUFFER: { unsigned long *ver_addr; dma_addr_t buf_handle; - int32_t my_empty_len,user_len,wqbuf_firstindex,wqbuf_lastindex; - uint8_t *pQbuffer,*ptmpuserbuffer; + int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex; + uint8_t *pQbuffer, *ptmpuserbuffer; - ver_addr=pci_alloc_consistent(pACB->pci_device, 1032, &buf_handle); - if (ver_addr==NULL) { - retvalue= ENOMEM; + ver_addr = pci_alloc_consistent(pACB->pci_device, 1032, &buf_handle); + if (!ver_addr) { + retvalue = -ENOMEM; goto ioctl_out; } - ptmpuserbuffer=(uint8_t *)ver_addr; - user_len=pcmdioctlfld->cmdioctl.Length; - memcpy(ptmpuserbuffer,pcmdioctlfld->ioctldatabuffer,user_len); - wqbuf_lastindex=pACB->wqbuf_lastindex; - wqbuf_firstindex=pACB->wqbuf_firstindex; - if (wqbuf_lastindex!=wqbuf_firstindex) { + ptmpuserbuffer = (uint8_t *)ver_addr; + user_len = pcmdioctlfld->cmdioctl.Length; + memcpy(ptmpuserbuffer, pcmdioctlfld->ioctldatabuffer, user_len); + wqbuf_lastindex = pACB->wqbuf_lastindex; + wqbuf_firstindex = pACB->wqbuf_firstindex; + if (wqbuf_lastindex != wqbuf_firstindex) { arcmsr_post_Qbuffer(pACB); - pcmdioctlfld->cmdioctl.ReturnCode= + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_ERROR; } else { - my_empty_len=(wqbuf_firstindex-wqbuf_lastindex-1) - &(ARCMSR_MAX_QBUFFER-1); - if (my_empty_len>=user_len) { - while (user_len>0) { - pQbuffer= + my_empty_len = (wqbuf_firstindex-wqbuf_lastindex - 1) + &(ARCMSR_MAX_QBUFFER - 1); + if (my_empty_len >= user_len) { + while (user_len > 0) { + pQbuffer = &pACB->wqbuffer[pACB->wqbuf_lastindex]; - memcpy(pQbuffer,ptmpuserbuffer,1); + memcpy(pQbuffer, ptmpuserbuffer, 1); pACB->wqbuf_lastindex++; - pACB->wqbuf_lastindex %=ARCMSR_MAX_QBUFFER; + pACB->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER; ptmpuserbuffer++; user_len--; } if (pACB->acb_flags & ACB_F_IOCTL_WQBUFFER_CLEARED) { - pACB->acb_flags&= + pACB->acb_flags &= ~ACB_F_IOCTL_WQBUFFER_CLEARED; arcmsr_post_Qbuffer(pACB); } - pcmdioctlfld->cmdioctl.ReturnCode= + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; } else - pcmdioctlfld->cmdioctl.ReturnCode= + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_ERROR; } - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; pci_free_consistent(pACB->pci_device, 1032, ver_addr, buf_handle); } break; case ARCMSR_IOCTL_CLEAR_RQBUFFER: { - uint8_t *pQbuffer=pACB->rqbuffer; + uint8_t *pQbuffer = pACB->rqbuffer; if (pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW) { - pACB->acb_flags &=~ACB_F_IOPDATA_OVERFLOW; + pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, - &pACB->pmu->inbound_doorbell); + ®->inbound_doorbell); } - pACB->acb_flags |=ACB_F_IOCTL_RQBUFFER_CLEARED; - pACB->rqbuf_firstindex=0; - pACB->rqbuf_lastindex=0; + pACB->acb_flags |= ACB_F_IOCTL_RQBUFFER_CLEARED; + pACB->rqbuf_firstindex = 0; + pACB->rqbuf_lastindex = 0; memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER); - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK; - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; } break; case ARCMSR_IOCTL_CLEAR_WQBUFFER: { - uint8_t *pQbuffer=pACB->wqbuffer; + uint8_t *pQbuffer = pACB->wqbuffer; if (pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW) { - pACB->acb_flags &=~ACB_F_IOPDATA_OVERFLOW; + pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK - ,&pACB->pmu->inbound_doorbell); + , ®->inbound_doorbell); } pACB->acb_flags |= - (ACB_F_IOCTL_WQBUFFER_CLEARED|ACB_F_IOCTL_WQBUFFER_READED); - pACB->wqbuf_firstindex=0; - pACB->wqbuf_lastindex=0; + (ACB_F_IOCTL_WQBUFFER_CLEARED | ACB_F_IOCTL_WQBUFFER_READED); + pACB->wqbuf_firstindex = 0; + pACB->wqbuf_lastindex = 0; memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER); - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK; - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; } break; case ARCMSR_IOCTL_CLEAR_ALLQBUFFER: { uint8_t *pQbuffer; if (pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW) { - pACB->acb_flags &=~ACB_F_IOPDATA_OVERFLOW; + pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK - ,&pACB->pmu->inbound_doorbell); + , ®->inbound_doorbell); } pACB->acb_flags |= (ACB_F_IOCTL_WQBUFFER_CLEARED - |ACB_F_IOCTL_RQBUFFER_CLEARED - |ACB_F_IOCTL_WQBUFFER_READED); - pACB->rqbuf_firstindex=0; - pACB->rqbuf_lastindex=0; - pACB->wqbuf_firstindex=0; - pACB->wqbuf_lastindex=0; - pQbuffer=pACB->rqbuffer; - memset(pQbuffer, 0, sizeof(struct QBUFFER)); - pQbuffer=pACB->wqbuffer; - memset(pQbuffer, 0, sizeof(struct QBUFFER)); - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK; - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + | ACB_F_IOCTL_RQBUFFER_CLEARED + | ACB_F_IOCTL_WQBUFFER_READED); + pACB->rqbuf_firstindex = 0; + pACB->rqbuf_lastindex = 0; + pACB->wqbuf_firstindex = 0; + pACB->wqbuf_lastindex = 0; + pQbuffer = pACB->rqbuffer; + memset(pQbuffer, 0, sizeof (struct QBUFFER)); + pQbuffer = pACB->wqbuffer; + memset(pQbuffer, 0, sizeof (struct QBUFFER)); + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; } break; case ARCMSR_IOCTL_RETURN_CODE_3F: { - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_3F; - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_3F; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; } break; case ARCMSR_IOCTL_SAY_HELLO: { - int8_t * hello_string="Hello! I am ARCMSR"; + int8_t * hello_string = "Hello! I am ARCMSR"; - memcpy(pcmdioctlfld->ioctldatabuffer,hello_string - ,(int16_t)strlen(hello_string)); - pcmdioctlfld->cmdioctl.ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK; - if (copy_to_user(arg,pcmdioctlfld, - sizeof (struct CMD_IOCTL_FIELD))!=0) - retvalue= -EFAULT; + memcpy(pcmdioctlfld->ioctldatabuffer, hello_string + , (int16_t)strlen(hello_string)); + pcmdioctlfld->cmdioctl.ReturnCode = ARCMSR_IOCTL_RETURNCODE_OK; + if (copy_to_user(arg, pcmdioctlfld, + sizeof (struct CMD_IOCTL_FIELD)) != 0) + retvalue = -EFAULT; } break; case ARCMSR_IOCTL_SAY_GOODBYE: @@ -1335,38 +1336,38 @@ static int arcmsr_iop_ioctlcmd(struct AC arcmsr_flush_adapter_cache(pACB); break; default: - retvalue= -EFAULT; + retvalue = -EFAULT; } ioctl_out: - pci_free_consistent(pACB->pci_device,sizeof (struct CMD_IOCTL_FIELD), + pci_free_consistent(pACB->pci_device, sizeof (struct CMD_IOCTL_FIELD), pcmdioctlfld, cmd_handle); - spin_unlock_irqrestore(&pACB->qbuffer_lock,flag); + spin_unlock_irqrestore(&pACB->qbuffer_lock, flags); return retvalue; } /* ******************************************************************************* ******************************************************************************* */ -static int arcmsr_ioctl(struct scsi_device *dev,int ioctl_cmd,void *arg) +static int arcmsr_ioctl(struct scsi_device *dev, int ioctl_cmd, void __user * arg) { struct ACB *pACB; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; - int32_t match=0x55AA,i; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; + int32_t match = 0x55AA, i; - for(i=0;ipACB[i]; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (pACB) { - if (pACB->host==dev->host) { - match=i; + if (pACB->host == dev->host) { + match = i; break; } } } - if (match==0x55AA) - return ENXIO; + if (match == 0x55AA) + return -ENXIO; if (!arg) return -EINVAL; - return(arcmsr_iop_ioctlcmd(pACB,ioctl_cmd,arg)); + return(arcmsr_iop_ioctlcmd(pACB, ioctl_cmd, arg)); } /* ******************************************************************************* @@ -1376,7 +1377,7 @@ static struct CCB *arcmsr_get_freeccb(st { unsigned long flags; struct list_head *head = &pACB->ccb_free_list; - struct CCB *pCCB=NULL; + struct CCB *pCCB = NULL; spin_lock_irqsave(&pACB->working_list_lock, flags); if (!list_empty(head)) { @@ -1390,70 +1391,70 @@ static struct CCB *arcmsr_get_freeccb(st ******************************************************************************* ******************************************************************************* */ -static int arcmsr_queue_command(struct scsi_cmnd *cmd,void (* done)(struct scsi_cmnd *)) +static int arcmsr_queue_command(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) { - struct Scsi_Host *host=cmd->device->host; - struct ACB *pACB=(struct ACB *) host->hostdata; + struct Scsi_Host *host = cmd->device->host; + struct ACB *pACB = (struct ACB *) host->hostdata; struct CCB *pCCB; - int target=cmd->device->id; - int lun=cmd->device->lun; + int target = cmd->device->id; + int lun = cmd->device->lun; - cmd->scsi_done=done; - cmd->host_scribble=NULL; - cmd->result=0; - if (cmd->cmnd[0]==SYNCHRONIZE_CACHE) { + cmd->scsi_done = done; + cmd->host_scribble = NULL; + cmd->result = 0; + if (cmd->cmnd[0] == SYNCHRONIZE_CACHE) { /* ** 0x35 avoid synchronizing disk cache cmd after ** .remove : arcmsr_device_remove (linux bug) */ - if (pACB->devstate[target][lun]==ARECA_RAID_GONE) - cmd->result=(DID_NO_CONNECT << 16); + if (pACB->devstate[target][lun] == ARECA_RAID_GONE) + cmd->result = (DID_NO_CONNECT << 16); cmd->scsi_done(cmd); return 0; } if (pACB->acb_flags & ACB_F_BUS_RESET) { printk(KERN_NOTICE "arcmsr%d: bus reset" " and return busy \n" - ,pACB->adapter_index); - cmd->result=(DID_BUS_BUSY << 16); + , pACB->adapter_index); + cmd->result = (DID_BUS_BUSY << 16); cmd->scsi_done(cmd); return 0; } - if (pACB->devstate[target][lun]==ARECA_RAID_GONE) { + if (pACB->devstate[target][lun] == ARECA_RAID_GONE) { uint8_t block_cmd; - block_cmd=cmd->cmnd[0] & 0x0f; - if (block_cmd==0x08 || block_cmd==0x0a) { + block_cmd = cmd->cmnd[0] & 0x0f; + if (block_cmd == 0x08 || block_cmd == 0x0a) { printk(KERN_NOTICE "arcmsr%d: block 'read/write'" "command with gone raid volume" - " Cmd=%2x,TargetId=%d,Lun=%d \n" - ,pACB->adapter_index - ,cmd->cmnd[0] - ,target - ,lun); - cmd->result=(DID_NO_CONNECT << 16); + " Cmd=%2x, TargetId=%d, Lun=%d \n" + , pACB->adapter_index + , cmd->cmnd[0] + , target + , lun); + cmd->result = (DID_NO_CONNECT << 16); cmd->scsi_done(cmd); return 0; } } arcmsr_post_pendingccb(pACB); - pCCB=arcmsr_get_freeccb(pACB); + pCCB = arcmsr_get_freeccb(pACB); if (pCCB) { - arcmsr_build_ccb(pACB,pCCB,cmd); + arcmsr_build_ccb(pACB, pCCB, cmd); if (atomic_read(&pACB->ccboutstandingcount) < ARCMSR_MAX_OUTSTANDING_CMD) { - arcmsr_post_ccb(pACB,pCCB); + arcmsr_post_ccb(pACB, pCCB); return 0; } - arcmsr_queue_pendingccb(pACB,pCCB); + arcmsr_queue_pendingccb(pACB, pCCB); return 0; } printk(KERN_NOTICE "arcmsr%d: 'out of ccbs resource' ccb outstanding=%d pending=%d \n" - ,pACB->adapter_index - ,atomic_read(&pACB->ccboutstandingcount) - ,atomic_read(&pACB->ccbpendingcount)); - cmd->result=(DID_BUS_BUSY << 16); + , pACB->adapter_index + , atomic_read(&pACB->ccboutstandingcount) + , atomic_read(&pACB->ccbpendingcount)); + cmd->result = (DID_BUS_BUSY << 16); cmd->scsi_done(cmd); return 0; } @@ -1463,40 +1464,41 @@ static int arcmsr_queue_command(struct s */ static void arcmsr_get_firmware_spec(struct ACB *pACB) { - char *acb_firm_model=pACB->firm_model; - char *acb_firm_version=pACB->firm_version; - char *iop_firm_model=(char *) (&pACB->pmu->message_rwbuffer[15]); - char *iop_firm_version=(char *) (&pACB->pmu->message_rwbuffer[17]); + struct MU __iomem *reg = pACB->pmu; + char *acb_firm_model = pACB->firm_model; + char *acb_firm_version = pACB->firm_version; + char __iomem *iop_firm_model = (char __iomem *) ®->message_rwbuffer[15]; + char __iomem *iop_firm_version = (char __iomem *) ®->message_rwbuffer[17]; int count; - writel(ARCMSR_INBOUND_MESG0_GET_CONFIG,&pACB->pmu->inbound_msgaddr0); + writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: wait " "'get adapter firmware miscellaneous data' timeout \n" - ,pACB->adapter_index); - count=8; + , pACB->adapter_index); + count = 8; while (count) { - *acb_firm_model=readb(iop_firm_model); + *acb_firm_model = readb(iop_firm_model); acb_firm_model++; iop_firm_model++; count--; } - count=16; + count = 16; while (count) { - *acb_firm_version=readb(iop_firm_version); + *acb_firm_version = readb(iop_firm_version); acb_firm_version++; iop_firm_version++; count--; } printk(KERN_INFO "ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n" - ,pACB->adapter_index - ,pACB->firm_version); - pACB->firm_request_len=readl(&pACB->pmu->message_rwbuffer[1]); - pACB->firm_numbers_queue=readl(&pACB->pmu->message_rwbuffer[2]); - pACB->firm_sdram_size=readl(&pACB->pmu->message_rwbuffer[3]); - pACB->firm_ide_channels=readl(&pACB->pmu->message_rwbuffer[4]); + , pACB->adapter_index + , pACB->firm_version); + pACB->firm_request_len = readl(®->message_rwbuffer[1]); + pACB->firm_numbers_queue = readl(®->message_rwbuffer[2]); + pACB->firm_sdram_size = readl(®->message_rwbuffer[3]); + pACB->firm_ide_channels = readl(®->message_rwbuffer[4]); } /* ******************************************************************************* @@ -1504,30 +1506,32 @@ static void arcmsr_get_firmware_spec(str */ static void arcmsr_start_adapter_bgrb(struct ACB *pACB) { - pACB->acb_flags |=ACB_F_MSG_START_BGRB; - writel(ARCMSR_INBOUND_MESG0_START_BGRB,&pACB->pmu->inbound_msgaddr0); + struct MU __iomem *reg = pACB->pmu; + pACB->acb_flags |= ACB_F_MSG_START_BGRB; + writel(ARCMSR_INBOUND_MESG0_START_BGRB, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background rebulid' timeout \n" - ,pACB->adapter_index); + , pACB->adapter_index); } /* ******************************************************************************* ******************************************************************************* */ -static void arcmsr_polling_ccbdone(struct ACB *pACB,struct CCB *poll_ccb) +static void arcmsr_polling_ccbdone(struct ACB *pACB, struct CCB *poll_ccb) { + struct MU __iomem *reg = pACB->pmu; struct CCB *pCCB; - uint32_t flag_ccb,outbound_intstatus,poll_ccb_done=0,poll_count=0; - int id,lun; + uint32_t flag_ccb, outbound_intstatus, poll_ccb_done = 0, poll_count = 0; + int id, lun; polling_ccb_retry: poll_count++; - outbound_intstatus=readl(&pACB->pmu->outbound_intstatus) + outbound_intstatus = readl(®->outbound_intstatus) & pACB->outbound_int_enable; - writel(outbound_intstatus,&pACB->pmu->outbound_intstatus);/*clear interrupt*/ + writel(outbound_intstatus, ®->outbound_intstatus);/*clear interrupt*/ while (1) { - if ((flag_ccb=readl(&pACB->pmu->outbound_queueport))==0xFFFFFFFF) { + if ((flag_ccb = readl(®->outbound_queueport)) == 0xFFFFFFFF) { if (poll_ccb_done) break; else { @@ -1537,70 +1541,70 @@ polling_ccb_retry: goto polling_ccb_retry; } } - pCCB=(struct CCB *)(pACB->vir2phy_offset+(flag_ccb << 5)); - if ((pCCB->pACB!=pACB) || (pCCB->startdone!=ARCMSR_CCB_START)) { - if ((pCCB->startdone==ARCMSR_CCB_ABORTED) && (pCCB==poll_ccb)) { + pCCB = (struct CCB *)(pACB->vir2phy_offset + (flag_ccb << 5)); + if ((pCCB->pACB != pACB) || (pCCB->startdone != ARCMSR_CCB_START)) { + if ((pCCB->startdone == ARCMSR_CCB_ABORTED) && (pCCB == poll_ccb)) { printk(KERN_NOTICE "arcmsr%d: scsi id=%d lun=%d ccb='0x%p'" " poll command abort successfully \n" - ,pACB->adapter_index - ,pCCB->pcmd->device->id - ,pCCB->pcmd->device->lun - ,pCCB); - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,1); - poll_ccb_done=1; + , pACB->adapter_index + , pCCB->pcmd->device->id + , pCCB->pcmd->device->lun + , pCCB); + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 1); + poll_ccb_done = 1; continue; } printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb" " command done ccb='0x%p'" "ccboutstandingcount=%d \n" - ,pACB->adapter_index - ,pCCB - ,atomic_read(&pACB->ccboutstandingcount)); + , pACB->adapter_index + , pCCB + , atomic_read(&pACB->ccboutstandingcount)); continue; } - id=pCCB->pcmd->device->id; - lun=pCCB->pcmd->device->lun; - if ((flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR)==0) { - if (pACB->devstate[id][lun]==ARECA_RAID_GONE) - pACB->devstate[id][lun]=ARECA_RAID_GOOD; - pCCB->pcmd->result=DID_OK << 16; - arcmsr_ccb_complete(pCCB,1); + id = pCCB->pcmd->device->id; + lun = pCCB->pcmd->device->lun; + if (!(flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR)) { + if (pACB->devstate[id][lun] == ARECA_RAID_GONE) + pACB->devstate[id][lun] = ARECA_RAID_GOOD; + pCCB->pcmd->result = DID_OK << 16; + arcmsr_ccb_complete(pCCB, 1); } else { switch(pCCB->arcmsr_cdb.DeviceStatus) { case ARCMSR_DEV_SELECT_TIMEOUT: { - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_TIME_OUT << 16; - arcmsr_ccb_complete(pCCB,1); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_TIME_OUT << 16; + arcmsr_ccb_complete(pCCB, 1); } break; case ARCMSR_DEV_ABORTED: case ARCMSR_DEV_INIT_FAIL: { - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_BAD_TARGET << 16; - arcmsr_ccb_complete(pCCB,1); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_BAD_TARGET << 16; + arcmsr_ccb_complete(pCCB, 1); } break; case SCSISTAT_CHECK_CONDITION: { - pACB->devstate[id][lun]=ARECA_RAID_GOOD; + pACB->devstate[id][lun] = ARECA_RAID_GOOD; arcmsr_report_sense_info(pCCB); - arcmsr_ccb_complete(pCCB,1); + arcmsr_ccb_complete(pCCB, 1); } break; default: printk(KERN_NOTICE "arcmsr%d: scsi id=%d lun=%d" " polling and getting command error done" - "but got unknow DeviceStatus=0x%x \n" - ,pACB->adapter_index - ,id - ,lun - ,pCCB->arcmsr_cdb.DeviceStatus); - pACB->devstate[id][lun]=ARECA_RAID_GONE; - pCCB->pcmd->result=DID_BAD_TARGET << 16; - arcmsr_ccb_complete(pCCB,1); + "but got unknown DeviceStatus = 0x%x \n" + , pACB->adapter_index + , id + , lun + , pCCB->arcmsr_cdb.DeviceStatus); + pACB->devstate[id][lun] = ARECA_RAID_GONE; + pCCB->pcmd->result = DID_BAD_TARGET << 16; + arcmsr_ccb_complete(pCCB, 1); break; } } @@ -1612,23 +1616,24 @@ polling_ccb_retry: */ static void arcmsr_iop_init(struct ACB *pACB) { - uint32_t intmask_org,mask,outbound_doorbell,firmware_state=0; + struct MU __iomem *reg = pACB->pmu; + uint32_t intmask_org, mask, outbound_doorbell, firmware_state = 0; do { - firmware_state=readl(&pACB->pmu->outbound_msgaddr1); - } while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK)==0); - intmask_org=readl(&pACB->pmu->outbound_intmask) - |ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE; + firmware_state = readl(®->outbound_msgaddr1); + } while (!(firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK)); + intmask_org = readl(®->outbound_intmask) + | ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE; arcmsr_get_firmware_spec(pACB); arcmsr_start_adapter_bgrb(pACB); - outbound_doorbell=readl(&pACB->pmu->outbound_doorbell); - writel(outbound_doorbell,&pACB->pmu->outbound_doorbell); - writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK,&pACB->pmu->inbound_doorbell); - mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE - |ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); - writel(intmask_org & mask,&pACB->pmu->outbound_intmask); - pACB->outbound_int_enable=~(intmask_org & mask) & 0x000000ff; - pACB->acb_flags |=ACB_F_IOP_INITED; + outbound_doorbell = readl(®->outbound_doorbell); + writel(outbound_doorbell, ®->outbound_doorbell); + writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, ®->inbound_doorbell); + mask = ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE + | ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); + writel(intmask_org & mask, ®->outbound_intmask); + pACB->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff; + pACB->acb_flags |= ACB_F_IOP_INITED; } /* ******************************************************************************* @@ -1637,13 +1642,13 @@ static void arcmsr_iop_init(struct ACB * static int arcmsr_bus_reset(struct scsi_cmnd *cmd) { struct ACB *pACB; - int retry=0; + int retry = 0; - pACB=(struct ACB *) cmd->device->host->hostdata; - printk(KERN_NOTICE "arcmsr%d: bus reset ..... \n",pACB->adapter_index); + pACB = (struct ACB *) cmd->device->host->hostdata; + printk(KERN_NOTICE "arcmsr%d: bus reset ..... \n", pACB->adapter_index); pACB->num_resets++; - pACB->acb_flags |=ACB_F_BUS_RESET; - while (atomic_read(&pACB->ccboutstandingcount)!=0 && retry < 400) { + pACB->acb_flags |= ACB_F_BUS_RESET; + while (atomic_read(&pACB->ccboutstandingcount) != 0 && retry < 400) { arcmsr_interrupt(pACB); msleep(25); retry++; @@ -1658,10 +1663,11 @@ static int arcmsr_bus_reset(struct scsi_ */ static int arcmsr_seek_cmd2abort(struct scsi_cmnd *abortcmd) { - struct ACB *pACB=(struct ACB *) abortcmd->device->host->hostdata; + struct ACB *pACB = (struct ACB *) abortcmd->device->host->hostdata; + struct MU __iomem *reg = pACB->pmu; struct CCB *pCCB; - uint32_t intmask_org,mask; - int i=0,pendingcount; + uint32_t intmask_org, mask; + int i = 0, pendingcount; pACB->num_aborts++; /* @@ -1670,23 +1676,23 @@ static int arcmsr_seek_cmd2abort(struct ** to calling us. ** First determine if we currently own this command. ** Start by searching the device queue. If not found - ** at all,and the system wanted us to just abort the + ** at all, and the system wanted us to just abort the ** command return success. ***************************************************************** */ - if (atomic_read(&pACB->ccboutstandingcount)!=0) { - for(i=0;ipccb_pool[i]; - if (pCCB->startdone==ARCMSR_CCB_START) { - if (pCCB->pcmd==abortcmd) { - pCCB->startdone=ARCMSR_CCB_ABORTED; + if (atomic_read(&pACB->ccboutstandingcount) != 0) { + for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) { + pCCB = pACB->pccb_pool[i]; + if (pCCB->startdone == ARCMSR_CCB_START) { + if (pCCB->pcmd == abortcmd) { + pCCB->startdone = ARCMSR_CCB_ABORTED; printk(KERN_NOTICE "arcmsr%d: scsi id=%d lun=%d" " abort ccb '0x%p' outstanding command\n" - ,pACB->adapter_index - ,abortcmd->device->id - ,abortcmd->device->lun - ,pCCB); + , pACB->adapter_index + , abortcmd->device->id + , abortcmd->device->lun + , pCCB); goto abort_outstanding_cmd; } } @@ -1695,29 +1701,29 @@ static int arcmsr_seek_cmd2abort(struct /* ********************************************************** ** seek this command at our command list - ** if command found then remove,abort it and free this CCB + ** if command found then remove, abort it and free this CCB ********************************************************** */ - pendingcount=atomic_read(&pACB->ccbpendingcount); - if (pendingcount>0) { + pendingcount = atomic_read(&pACB->ccbpendingcount); + if (pendingcount > 0) { do { - pCCB=arcmsr_get_pendingccb(pACB); - if (pCCB==NULL) + pCCB = arcmsr_get_pendingccb(pACB); + if (!pCCB) break; - if (pCCB->pcmd==abortcmd) { + if (pCCB->pcmd == abortcmd) { printk(KERN_NOTICE "arcmsr%d: scsi id=%d lun=%d" " abort ccb '0x%p' pending command \n" - ,pACB->adapter_index - ,abortcmd->device->id - ,abortcmd->device->lun - ,pCCB); - pCCB->startdone=ARCMSR_CCB_ABORTED; - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,0); + , pACB->adapter_index + , abortcmd->device->id + , abortcmd->device->lun + , pCCB); + pCCB->startdone = ARCMSR_CCB_ABORTED; + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 0); return SUCCESS; } else - arcmsr_queue_pendingccb(pACB,pCCB); + arcmsr_queue_pendingccb(pACB, pCCB); } while (pendingcount--); } return SUCCESS; @@ -1725,14 +1731,14 @@ abort_outstanding_cmd: /*wait for 3 sec for all command done*/ msleep_interruptible(3000); /* disable all outbound interrupt */ - intmask_org=readl(&pACB->pmu->outbound_intmask); - writel(intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE - ,&pACB->pmu->outbound_intmask); - arcmsr_polling_ccbdone(pACB,pCCB); + intmask_org = readl(®->outbound_intmask); + writel(intmask_org | ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE + , ®->outbound_intmask); + arcmsr_polling_ccbdone(pACB, pCCB); /* enable all outbound interrupt */ - mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE - |ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); - writel(intmask_org & mask,&pACB->pmu->outbound_intmask); + mask = ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE + | ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE); + writel(intmask_org & mask, ®->outbound_intmask); return SUCCESS; } /* @@ -1741,27 +1747,27 @@ abort_outstanding_cmd: */ static int arcmsr_cmd_abort(struct scsi_cmnd *cmd) { - struct ACB *pACB=(struct ACB *) cmd->device->host->hostdata; + struct ACB *pACB = (struct ACB *) cmd->device->host->hostdata; int error; printk(KERN_NOTICE "arcmsr%d: abort device command of scsi id=%d lun=%d \n" - ,pACB->adapter_index - ,cmd->device->id - ,cmd->device->lun); + , pACB->adapter_index + , cmd->device->id + , cmd->device->lun); /* ************************************************ ** the all interrupt service routine is locked ** we need to handle it as soon as possible and exit ************************************************ */ - error=arcmsr_seek_cmd2abort(cmd); - if (error !=SUCCESS) + error = arcmsr_seek_cmd2abort(cmd); + if (error != SUCCESS) printk(KERN_NOTICE "arcmsr%d: abort command failed scsi id=%d lun=%d \n" - ,pACB->adapter_index - ,cmd->device->id - ,cmd->device->lun); + , pACB->adapter_index + , cmd->device->id + , cmd->device->lun); return error; } /* @@ -1774,77 +1780,77 @@ static const char *arcmsr_info(struct Sc struct ACB *pACB; uint16_t device_id; - pACB=(struct ACB *) host->hostdata; - device_id=pACB->pci_device->device; + pACB = (struct ACB *) host->hostdata; + device_id = pACB->pci_device->device; switch(device_id) { case PCIDeviceIDARC1110: { sprintf(buf, "ARECA ARC1110 PCI-X 4 PORTS SATA RAID CONTROLLER " "\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1120: { sprintf(buf, "ARECA ARC1120 PCI-X 8 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1130: { sprintf(buf, "ARECA ARC1130 PCI-X 12 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1160: { sprintf(buf, "ARECA ARC1160 PCI-X 16 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1170: { sprintf(buf, "ARECA ARC1170 PCI-X 24 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1210: { sprintf(buf, "ARECA ARC1210 PCI-EXPRESS 4 PORTS SATA RAID CONTROLLER " "\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1220: { sprintf(buf, "ARECA ARC1220 PCI-EXPRESS 8 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1230: { sprintf(buf, "ARECA ARC1230 PCI-EXPRESS 12 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1260: { sprintf(buf, "ARECA ARC1260 PCI-EXPRESS 16 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1270: { sprintf(buf, "ARECA ARC1270 PCI-EXPRESS 24 PORTS SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } case PCIDeviceIDARC1280: @@ -1852,7 +1858,7 @@ static const char *arcmsr_info(struct Sc sprintf(buf, "ARECA X-TYPE SATA RAID CONTROLLER " "(RAID6-ENGINE Inside)\n %s" - ,ARCMSR_DRIVER_VERSION); + , ARCMSR_DRIVER_VERSION); break; } } @@ -1862,89 +1868,91 @@ static const char *arcmsr_info(struct Sc ******************************************************************************* ******************************************************************************* */ -static int arcmsr_initialize(struct ACB *pACB,struct pci_dev *pci_device) +static int arcmsr_initialize(struct ACB *pACB, struct pci_dev *pci_device) { - uint32_t intmask_org,ccb_phyaddr_hi32; - dma_addr_t dma_coherent_handle,dma_addr; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct MU __iomem *reg; + uint32_t intmask_org, ccb_phyaddr_hi32; + dma_addr_t dma_coherent_handle, dma_addr; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; uint8_t pcicmd; void *dma_coherent; - void *page_remapped; - int i,j; + void __iomem *page_remapped; + int i, j; struct CCB *pccb_tmp; - pci_read_config_byte(pci_device,PCI_COMMAND,&pcicmd); - pci_write_config_byte(pci_device,PCI_COMMAND, - pcicmd|PCI_COMMAND_INVALIDATE|PCI_COMMAND_MASTER|PCI_COMMAND_MEMORY); - page_remapped = ioremap(pci_resource_start(pci_device,0), - pci_resource_len(pci_device,0)); - if ( page_remapped==NULL ) { + pci_read_config_byte(pci_device, PCI_COMMAND, &pcicmd); + pci_write_config_byte(pci_device, PCI_COMMAND, + pcicmd | PCI_COMMAND_INVALIDATE | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); + page_remapped = ioremap(pci_resource_start(pci_device, 0), + pci_resource_len(pci_device, 0)); + if ( !page_remapped ) { printk(KERN_NOTICE "arcmsr%d: memory" - " mapping region fail \n",arcmsr_adapterCnt); - return ENXIO; + " mapping region fail \n", arcmsr_adapterCnt); + return -ENXIO; } - pACB->pmu=(struct MU *)(page_remapped); + pACB->pmu = (struct MU __iomem *)(page_remapped); pACB->acb_flags |= (ACB_F_IOCTL_WQBUFFER_CLEARED - |ACB_F_IOCTL_RQBUFFER_CLEARED - |ACB_F_IOCTL_WQBUFFER_READED); + | ACB_F_IOCTL_RQBUFFER_CLEARED + | ACB_F_IOCTL_WQBUFFER_READED); pACB->acb_flags &= ~ACB_F_SCSISTOPADAPTER; - pACB->irq=pci_device->irq; + pACB->irq = pci_device->irq; INIT_LIST_HEAD(&pACB->ccb_free_list); INIT_LIST_HEAD(&pACB->ccb_pending_list); - dma_coherent=dma_alloc_coherent(&pci_device->dev - , ARCMSR_MAX_FREECCB_NUM * sizeof(struct CCB) + 0x20 + dma_coherent = dma_alloc_coherent(&pci_device->dev + , ARCMSR_MAX_FREECCB_NUM * sizeof (struct CCB) + 0x20 , &dma_coherent_handle, GFP_KERNEL); - if (dma_coherent ==NULL) { + if (!dma_coherent) { printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error \n" - ,arcmsr_adapterCnt); - return ENOMEM; + , arcmsr_adapterCnt); + return -ENOMEM; } - pACB->dma_coherent=dma_coherent; - pACB->dma_coherent_handle=dma_coherent_handle; - memset(dma_coherent, 0, ARCMSR_MAX_FREECCB_NUM * sizeof(struct CCB)+0x20); - if (((unsigned long)dma_coherent & 0x1F)!=0) { - dma_coherent=dma_coherent+(0x20-((unsigned long)dma_coherent & 0x1F)); - dma_coherent_handle=dma_coherent_handle - +(0x20-((unsigned long)dma_coherent_handle & 0x1F)); - } - dma_addr=dma_coherent_handle; - pccb_tmp=(struct CCB *)dma_coherent; - for(i=0; i < ARCMSR_MAX_FREECCB_NUM; i++) { - pccb_tmp->cdb_shifted_phyaddr=dma_addr >> 5; - pccb_tmp->pACB=pACB; - pACB->pccb_pool[i]=pccb_tmp; + pACB->dma_coherent = dma_coherent; + pACB->dma_coherent_handle = dma_coherent_handle; + memset(dma_coherent, 0, ARCMSR_MAX_FREECCB_NUM * sizeof (struct CCB) + 0x20); + if (((unsigned long)dma_coherent & 0x1F) != 0) { + dma_coherent = dma_coherent + (0x20 - ((unsigned long)dma_coherent & 0x1F)); + dma_coherent_handle = dma_coherent_handle + + (0x20 - ((unsigned long)dma_coherent_handle & 0x1F)); + } + dma_addr = dma_coherent_handle; + pccb_tmp = (struct CCB *)dma_coherent; + for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) { + pccb_tmp->cdb_shifted_phyaddr = dma_addr >> 5; + pccb_tmp->pACB = pACB; + pACB->pccb_pool[i] = pccb_tmp; list_add_tail(&pccb_tmp->list, &pACB->ccb_free_list); - dma_addr=dma_addr+sizeof(struct CCB); + dma_addr = dma_addr + sizeof (struct CCB); pccb_tmp++; } - pACB->vir2phy_offset=(unsigned long)pccb_tmp-(unsigned long)dma_addr; - for(i=0;idevstate[i][j]=ARECA_RAID_GOOD; + pACB->vir2phy_offset = (unsigned long)pccb_tmp - (unsigned long)dma_addr; + for(i = 0; i < ARCMSR_MAX_TARGETID; i++) { + for(j = 0; j < ARCMSR_MAX_TARGETLUN; j++) + pACB->devstate[i][j] = ARECA_RAID_GOOD; } + reg = pACB->pmu; /* ************************************************************* ** here we need to tell iop 331 our pccb_tmp.HighPart ** if pccb_tmp.HighPart is not zero ************************************************************* */ - ccb_phyaddr_hi32=(uint32_t) ((dma_coherent_handle>>16)>>16); - if (ccb_phyaddr_hi32!=0) { - writel(ARCMSR_SIGNATURE_SET_CONFIG,&pACB->pmu->message_rwbuffer[0]); - writel(ccb_phyaddr_hi32,&pACB->pmu->message_rwbuffer[1]); - writel(ARCMSR_INBOUND_MESG0_SET_CONFIG,&pACB->pmu->inbound_msgaddr0); + ccb_phyaddr_hi32 = (uint32_t) ((dma_coherent_handle >> 16) >> 16); + if (ccb_phyaddr_hi32 != 0) { + writel(ARCMSR_SIGNATURE_SET_CONFIG, ®->message_rwbuffer[0]); + writel(ccb_phyaddr_hi32, ®->message_rwbuffer[1]); + writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, ®->inbound_msgaddr0); if (arcmsr_wait_msgint_ready(pACB)) printk(KERN_NOTICE "arcmsr%d: 'set ccb high part physical address' timeout \n" - ,arcmsr_adapterCnt); + , arcmsr_adapterCnt); } - pACB->adapter_index=arcmsr_adapterCnt; - pHCBARC->pACB[arcmsr_adapterCnt]=pACB; - intmask_org=readl(&pACB->pmu->outbound_intmask); - writel(intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE - ,&pACB->pmu->outbound_intmask); + pACB->adapter_index = arcmsr_adapterCnt; + pHCBARC->pACB[arcmsr_adapterCnt] = pACB; + intmask_org = readl(®->outbound_intmask); + writel(intmask_org | ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE + , ®->outbound_intmask); arcmsr_adapterCnt++; return 0; } @@ -1952,7 +1960,7 @@ static int arcmsr_initialize(struct ACB ******************************************************************************* ******************************************************************************* */ -static int arcmsr_set_info(char *buffer,int length) +static int arcmsr_set_info(char *buffer, int length) { return 0; } @@ -1962,63 +1970,64 @@ static int arcmsr_set_info(char *buffer, */ static void arcmsr_pcidev_disattach(struct ACB *pACB) { + struct MU __iomem *reg = pACB->pmu; struct pci_dev *pci_device; struct CCB *pCCB; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; struct Scsi_Host *host; uint32_t intmask_org; - int i=0,poll_count=0,have_msi=0; + int i = 0, poll_count = 0, have_msi = 0; arcmsr_stop_adapter_bgrb(pACB); arcmsr_flush_adapter_cache(pACB); - intmask_org=readl(&pACB->pmu->outbound_intmask); - writel(intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE - ,&pACB->pmu->outbound_intmask); - pACB->acb_flags |=ACB_F_SCSISTOPADAPTER; - pACB->acb_flags &=~ACB_F_IOP_INITED; - if (atomic_read(&pACB->ccboutstandingcount)!=0) { - while (atomic_read(&pACB->ccboutstandingcount)!=0 && (poll_count < 256)) { + intmask_org = readl(®->outbound_intmask); + writel(intmask_org | ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE + , ®->outbound_intmask); + pACB->acb_flags |= ACB_F_SCSISTOPADAPTER; + pACB->acb_flags &= ~ACB_F_IOP_INITED; + if (atomic_read(&pACB->ccboutstandingcount) != 0) { + while (atomic_read(&pACB->ccboutstandingcount) != 0 && (poll_count < 256)) { arcmsr_interrupt(pACB); msleep(25); poll_count++; } - if (atomic_read(&pACB->ccboutstandingcount)!=0) { + if (atomic_read(&pACB->ccboutstandingcount) != 0) { arcmsr_abort_allcmd(pACB); - for(i=0;ipmu->outbound_queueport); - for(i=0;ipccb_pool[i]; - if (pCCB->startdone==ARCMSR_CCB_START) { - pCCB->startdone=ARCMSR_CCB_ABORTED; - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,1); + for(i = 0; i < ARCMSR_MAX_OUTSTANDING_CMD; i++) + readl(®->outbound_queueport); + for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) { + pCCB = pACB->pccb_pool[i]; + if (pCCB->startdone == ARCMSR_CCB_START) { + pCCB->startdone = ARCMSR_CCB_ABORTED; + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 1); } } } } - while (atomic_read(&pACB->ccbpendingcount)!=0) { - pCCB=arcmsr_get_pendingccb(pACB); + while (atomic_read(&pACB->ccbpendingcount) != 0) { + pCCB = arcmsr_get_pendingccb(pACB); if (pCCB) { - pCCB->startdone=ARCMSR_CCB_ABORTED; - pCCB->pcmd->result=DID_ABORT << 16; - arcmsr_ccb_complete(pCCB,0); + pCCB->startdone = ARCMSR_CCB_ABORTED; + pCCB->pcmd->result = DID_ABORT << 16; + arcmsr_ccb_complete(pCCB, 0); atomic_dec(&pACB->ccbpendingcount); } else break; } if ((pACB->acb_flags & ACB_F_HAVE_MSI) != 0) { - have_msi=1; + have_msi = 1; } - host=pACB->host; - pci_device=pACB->pci_device; + host = pACB->host; + pci_device = pACB->pci_device; iounmap(pACB->pmu); arcmsr_free_ccb_pool(pACB); - pHCBARC->pACB[pACB->adapter_index]=NULL; + pHCBARC->pACB[pACB->adapter_index] = NULL; scsi_remove_host(host); scsi_host_put(host); - free_irq(pci_device->irq,pACB); -#ifdef CONFIG_PCI_MSI - if (have_msi==1) + free_irq(pci_device->irq, pACB); +#ifdef CONFIG_SCSI_ARCMSR_MSI + if (have_msi == 1) pci_disable_msi(pci_device); #endif pci_release_regions(pci_device); @@ -2029,16 +2038,16 @@ static void arcmsr_pcidev_disattach(stru ******************************************************************************* ******************************************************************************* */ -static int arcmsr_halt_notify(struct notifier_block *nb, unsigned long event,void *buf) +static int arcmsr_halt_notify(struct notifier_block *nb, unsigned long event, void *buf) { struct ACB *pACB; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; int i; - if ((event !=SYS_RESTART) && (event !=SYS_HALT) && (event !=SYS_POWER_OFF)) + if ((event != SYS_RESTART) && (event != SYS_HALT) && (event != SYS_POWER_OFF)) return NOTIFY_DONE; - for(i=0;ipACB[i]; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (!pACB) continue; arcmsr_pcidev_disattach(pACB); @@ -2061,22 +2070,22 @@ static int arcmsr_proc_info(struct Scsi_ char **start, off_t offset, int length, int inout) { uint8_t i; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; - char * pos=buffer; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; + char * pos = buffer; struct ACB *pACB; if (inout) - return(arcmsr_set_info(buffer,length)); - for(i=0;ipACB[i]; + return(arcmsr_set_info(buffer, length)); + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + pACB = pHCBARC->pACB[i]; if (!pACB) continue; SPRINTF("ARECA SATA RAID Mass Storage Host Adadpter \n"); - SPRINTF("Driver Version %s ",ARCMSR_DRIVER_VERSION); - SPRINTF("IRQ%d \n",pACB->pci_device->irq); + SPRINTF("Driver Version %s ", ARCMSR_DRIVER_VERSION); + SPRINTF("IRQ%d \n", pACB->pci_device->irq); SPRINTF("===========================\n"); } - *start=buffer + offset; + *start = buffer + offset; if (pos - buffer < offset) return 0; else if (pos - buffer - offset < length) @@ -2090,22 +2099,22 @@ static int arcmsr_proc_info(struct Scsi_ static int arcmsr_release(struct Scsi_Host *host) { struct ACB *pACB; - struct HCBARC *pHCBARC= &arcmsr_host_control_block; - uint8_t match=0xff,i; + struct HCBARC *pHCBARC = &arcmsr_host_control_block; + uint8_t match = 0xff, i; - if (host==NULL) - return ENXIO; - pACB=(struct ACB *)host->hostdata; + if (!host) + return -ENXIO; + pACB = (struct ACB *)host->hostdata; if (!pACB) - return ENXIO; - for(i=0;ipACB[i]==pACB) - match=i; + return -ENXIO; + for(i = 0; i < ARCMSR_MAX_ADAPTER; i++) { + if (pHCBARC->pACB[i] == pACB) + match = i; } - if (match==0xff) - return ENXIO; + if (match == 0xff) + return -ENXIO; arcmsr_pcidev_disattach(pACB); - for(i=0;ipACB[i]) return 0; } diff -puN drivers/scsi/arcmsr/arcmsr.h~areca-raid-driver-arcmsr-update3-for-mm4 drivers/scsi/arcmsr/arcmsr.h --- devel/drivers/scsi/arcmsr/arcmsr.h~areca-raid-driver-arcmsr-update3-for-mm4 2006-01-17 00:49:26.000000000 -0800 +++ devel-akpm/drivers/scsi/arcmsr/arcmsr.h 2006-01-17 00:49:26.000000000 -0800 @@ -34,20 +34,14 @@ ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING,BUT -** NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT **(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************* */ -#include -#include -/* -******************************************************************************* -******************************************************************************* -*/ #define ARCMSR_MAX_OUTSTANDING_CMD 256 #define ARCMSR_MAX_PENDING_CMD 64 #define ARCMSR_MAX_FREECCB_NUM 320 @@ -84,11 +78,6 @@ */ #define dma_addr_hi32(addr) (uint32_t) ((addr>>16)>>16) #define dma_addr_lo32(addr) (uint32_t) (addr & 0xffffffff) - -#ifndef DMA_64BIT_MASK - #define DMA_64BIT_MASK 0xffffffffffffffffULL - #define DMA_32BIT_MASK 0x00000000ffffffffULL -#endif /* ******************************************************************************* ** IOCTL CONTROL CODE @@ -200,15 +189,15 @@ struct QBUFFER */ struct FIRMWARE_INFO { - uint32_t signature; /*0,00-03*/ - uint32_t request_len; /*1,04-07*/ - uint32_t numbers_queue; /*2,08-11*/ - uint32_t sdram_size; /*3,12-15*/ - uint32_t ide_channels; /*4,16-19*/ - char vendor[40]; /*5,20-59*/ - char model[8]; /*15,60-67*/ - char firmware_ver[16]; /*17,68-83*/ - char device_map[16]; /*21,84-99*/ + uint32_t signature; /*0, 00-03*/ + uint32_t request_len; /*1, 04-07*/ + uint32_t numbers_queue; /*2, 08-11*/ + uint32_t sdram_size; /*3, 12-15*/ + uint32_t ide_channels; /*4, 16-19*/ + char vendor[40]; /*5, 20-59*/ + char model[8]; /*15, 60-67*/ + char firmware_ver[16]; /*17, 68-83*/ + char device_map[16]; /*21, 84-99*/ }; /* ******************************************************************************* @@ -433,7 +422,7 @@ struct ACB /* Offset is used in making arc cdb physical to virtual calculations */ uint32_t outbound_int_enable; - struct MU * pmu; + struct MU __iomem * pmu; /* message unit ATU inbound base address0 */ uint8_t adapter_index; @@ -489,7 +478,7 @@ struct ACB spinlock_t done_list_lock; uint8_t devstate[ARCMSR_MAX_TARGETID][ARCMSR_MAX_TARGETLUN]; - /* id0 ..... id15,lun0...lun7 */ + /* id0 ..... id15, lun0...lun7 */ #define ARECA_RAID_GONE 0x55 #define ARECA_RAID_GOOD 0xaa uint32_t num_resets; @@ -589,6 +578,8 @@ struct HCBARC struct SENSE_DATA { uint8_t ErrorCode:7; +#define SCSI_SENSE_CURRENT_ERRORS 0x70 +#define SCSI_SENSE_DEFERRED_ERRORS 0x71 uint8_t Valid:1; uint8_t SegmentNumber; uint8_t SenseKey:4; @@ -640,7 +631,7 @@ struct SENSE_DATA ** 0x07-0x06 : status register ******************************************************************************* */ -#define ARCMSR_PCI2PCI_PRIMARY_STATUS_REG 0x06 /*word: 06,07 */ +#define ARCMSR_PCI2PCI_PRIMARY_STATUS_REG 0x06 /*word: 06, 07 */ #define ARCMSR_ADAP_66MHZ 0x20 /* ******************************************************************************* diff -puN drivers/scsi/Kconfig~areca-raid-driver-arcmsr-update3-for-mm4 drivers/scsi/Kconfig --- devel/drivers/scsi/Kconfig~areca-raid-driver-arcmsr-update3-for-mm4 2006-01-17 00:49:26.000000000 -0800 +++ devel-akpm/drivers/scsi/Kconfig 2006-01-17 00:49:26.000000000 -0800 @@ -473,6 +473,17 @@ config SCSI_ARCMSR To compile this driver as a module, choose M here: the module will be called arcmsr (modprobe arcmsr). +config SCSI_ARCMSR_MSI + bool "Use PCI message signal interrupt" + depends on PCI_MSI && SCSI_ARCMSR + default n + help + If you say Y here. You will enable PCI Message signaled Interrupts + function, but some machines may have problems. If you get + abort command on driver initialize, you have to answer Y here. + If the IRQ problem even worse, + please report the problem to the maintainer. + source "drivers/scsi/megaraid/Kconfig.megaraid" config SCSI_SATA _