Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc
[linux-2.6] / drivers / scsi / arcmsr / arcmsr_hba.c
1 /*
2 *******************************************************************************
3 **        O.S   : Linux
4 **   FILE NAME  : arcmsr_hba.c
5 **        BY    : Erich Chen
6 **   Description: SCSI RAID Device Driver for
7 **                ARECA RAID Host adapter
8 *******************************************************************************
9 ** Copyright (C) 2002 - 2005, Areca Technology Corporation All rights reserved
10 **
11 **     Web site: www.areca.com.tw
12 **       E-mail: support@areca.com.tw
13 **
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License version 2 as
16 ** published by the Free Software Foundation.
17 ** This program is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 ** GNU General Public License for more details.
21 *******************************************************************************
22 ** Redistribution and use in source and binary forms, with or without
23 ** modification, are permitted provided that the following conditions
24 ** are met:
25 ** 1. Redistributions of source code must retain the above copyright
26 **    notice, this list of conditions and the following disclaimer.
27 ** 2. Redistributions in binary form must reproduce the above copyright
28 **    notice, this list of conditions and the following disclaimer in the
29 **    documentation and/or other materials provided with the distribution.
30 ** 3. The name of the author may not be used to endorse or promote products
31 **    derived from this software without specific prior written permission.
32 **
33 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
34 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
36 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
37 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING,BUT
38 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY
40 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41 ** (INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF
42 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 *******************************************************************************
44 ** For history of changes, see Documentation/scsi/ChangeLog.arcmsr
45 **     Firmware Specification, see Documentation/scsi/arcmsr_spec.txt
46 *******************************************************************************
47 */
48 #include <linux/module.h>
49 #include <linux/reboot.h>
50 #include <linux/spinlock.h>
51 #include <linux/pci_ids.h>
52 #include <linux/interrupt.h>
53 #include <linux/moduleparam.h>
54 #include <linux/errno.h>
55 #include <linux/types.h>
56 #include <linux/delay.h>
57 #include <linux/dma-mapping.h>
58 #include <linux/timer.h>
59 #include <linux/pci.h>
60 #include <linux/aer.h>
61 #include <asm/dma.h>
62 #include <asm/io.h>
63 #include <asm/system.h>
64 #include <asm/uaccess.h>
65 #include <scsi/scsi_host.h>
66 #include <scsi/scsi.h>
67 #include <scsi/scsi_cmnd.h>
68 #include <scsi/scsi_tcq.h>
69 #include <scsi/scsi_device.h>
70 #include <scsi/scsi_transport.h>
71 #include <scsi/scsicam.h>
72 #include "arcmsr.h"
73
74 MODULE_AUTHOR("Erich Chen <support@areca.com.tw>");
75 MODULE_DESCRIPTION("ARECA (ARC11xx/12xx/13xx/16xx) SATA/SAS RAID HOST Adapter");
76 MODULE_LICENSE("Dual BSD/GPL");
77 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
78
79 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
80                                         struct scsi_cmnd *cmd);
81 static int arcmsr_iop_confirm(struct AdapterControlBlock *acb);
82 static int arcmsr_abort(struct scsi_cmnd *);
83 static int arcmsr_bus_reset(struct scsi_cmnd *);
84 static int arcmsr_bios_param(struct scsi_device *sdev,
85                 struct block_device *bdev, sector_t capacity, int *info);
86 static int arcmsr_queue_command(struct scsi_cmnd *cmd,
87                                         void (*done) (struct scsi_cmnd *));
88 static int arcmsr_probe(struct pci_dev *pdev,
89                                 const struct pci_device_id *id);
90 static void arcmsr_remove(struct pci_dev *pdev);
91 static void arcmsr_shutdown(struct pci_dev *pdev);
92 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
93 static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb);
94 static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb);
95 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
96 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb);
97 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb);
98 static const char *arcmsr_info(struct Scsi_Host *);
99 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
100 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev,
101                                                                 int queue_depth)
102 {
103         if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
104                 queue_depth = ARCMSR_MAX_CMD_PERLUN;
105         scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
106         return queue_depth;
107 }
108
109 static struct scsi_host_template arcmsr_scsi_host_template = {
110         .module                 = THIS_MODULE,
111         .name                   = "ARCMSR ARECA SATA/SAS RAID HOST Adapter"
112                                                         ARCMSR_DRIVER_VERSION,
113         .info                   = arcmsr_info,
114         .queuecommand           = arcmsr_queue_command,
115         .eh_abort_handler       = arcmsr_abort,
116         .eh_bus_reset_handler   = arcmsr_bus_reset,
117         .bios_param             = arcmsr_bios_param,
118         .change_queue_depth     = arcmsr_adjust_disk_queue_depth,
119         .can_queue              = ARCMSR_MAX_OUTSTANDING_CMD,
120         .this_id                = ARCMSR_SCSI_INITIATOR_ID,
121         .sg_tablesize           = ARCMSR_MAX_SG_ENTRIES,
122         .max_sectors            = ARCMSR_MAX_XFER_SECTORS,
123         .cmd_per_lun            = ARCMSR_MAX_CMD_PERLUN,
124         .use_clustering         = ENABLE_CLUSTERING,
125         .shost_attrs            = arcmsr_host_attrs,
126 };
127 #ifdef CONFIG_SCSI_ARCMSR_AER
128 static pci_ers_result_t arcmsr_pci_slot_reset(struct pci_dev *pdev);
129 static pci_ers_result_t arcmsr_pci_error_detected(struct pci_dev *pdev,
130                                                 pci_channel_state_t state);
131
132 static struct pci_error_handlers arcmsr_pci_error_handlers = {
133         .error_detected         = arcmsr_pci_error_detected,
134         .slot_reset             = arcmsr_pci_slot_reset,
135 };
136 #endif
137 static struct pci_device_id arcmsr_device_id_table[] = {
138         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1110)},
139         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1120)},
140         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1130)},
141         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1160)},
142         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1170)},
143         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1200)},
144         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1201)},
145         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202)},
146         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210)},
147         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1220)},
148         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1230)},
149         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1260)},
150         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1270)},
151         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1280)},
152         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1380)},
153         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1381)},
154         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1680)},
155         {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1681)},
156         {0, 0}, /* Terminating entry */
157 };
158 MODULE_DEVICE_TABLE(pci, arcmsr_device_id_table);
159 static struct pci_driver arcmsr_pci_driver = {
160         .name                   = "arcmsr",
161         .id_table               = arcmsr_device_id_table,
162         .probe                  = arcmsr_probe,
163         .remove                 = arcmsr_remove,
164         .shutdown               = arcmsr_shutdown,
165         #ifdef CONFIG_SCSI_ARCMSR_AER
166         .err_handler            = &arcmsr_pci_error_handlers,
167         #endif
168 };
169
170 static irqreturn_t arcmsr_do_interrupt(int irq, void *dev_id)
171 {
172         irqreturn_t handle_state;
173         struct AdapterControlBlock *acb = dev_id;
174
175         spin_lock(acb->host->host_lock);
176         handle_state = arcmsr_interrupt(acb);
177         spin_unlock(acb->host->host_lock);
178
179         return handle_state;
180 }
181
182 static int arcmsr_bios_param(struct scsi_device *sdev,
183                 struct block_device *bdev, sector_t capacity, int *geom)
184 {
185         int ret, heads, sectors, cylinders, total_capacity;
186         unsigned char *buffer;/* return copy of block device's partition table */
187
188         buffer = scsi_bios_ptable(bdev);
189         if (buffer) {
190                 ret = scsi_partsize(buffer, capacity, &geom[2], &geom[0], &geom[1]);
191                 kfree(buffer);
192                 if (ret != -1)
193                         return ret;
194         }
195         total_capacity = capacity;
196         heads = 64;
197         sectors = 32;
198         cylinders = total_capacity / (heads * sectors);
199         if (cylinders > 1024) {
200                 heads = 255;
201                 sectors = 63;
202                 cylinders = total_capacity / (heads * sectors);
203         }
204         geom[0] = heads;
205         geom[1] = sectors;
206         geom[2] = cylinders;
207         return 0;
208 }
209
210 static void arcmsr_define_adapter_type(struct AdapterControlBlock *acb)
211 {
212         struct pci_dev *pdev = acb->pdev;
213         u16 dev_id;
214         pci_read_config_word(pdev, PCI_DEVICE_ID, &dev_id);
215         switch (dev_id) {
216         case 0x1201 : {
217                 acb->adapter_type = ACB_ADAPTER_TYPE_B;
218                 }
219                 break;
220
221         default : acb->adapter_type = ACB_ADAPTER_TYPE_A;
222         }
223 }
224
225 static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb)
226 {
227
228         switch (acb->adapter_type) {
229
230         case ACB_ADAPTER_TYPE_A: {
231                 struct pci_dev *pdev = acb->pdev;
232                 void *dma_coherent;
233                 dma_addr_t dma_coherent_handle, dma_addr;
234                 struct CommandControlBlock *ccb_tmp;
235                 uint32_t intmask_org;
236                 int i, j;
237
238                 acb->pmuA = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
239                 if (!acb->pmuA) {
240                         printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n",
241                                                         acb->host->host_no);
242                         return -ENOMEM;
243                 }
244
245                 dma_coherent = dma_alloc_coherent(&pdev->dev,
246                         ARCMSR_MAX_FREECCB_NUM *
247                         sizeof (struct CommandControlBlock) + 0x20,
248                         &dma_coherent_handle, GFP_KERNEL);
249
250                 if (!dma_coherent) {
251                         iounmap(acb->pmuA);
252                         return -ENOMEM;
253                 }
254
255                 acb->dma_coherent = dma_coherent;
256                 acb->dma_coherent_handle = dma_coherent_handle;
257
258                 if (((unsigned long)dma_coherent & 0x1F)) {
259                         dma_coherent = dma_coherent +
260                                 (0x20 - ((unsigned long)dma_coherent & 0x1F));
261                         dma_coherent_handle = dma_coherent_handle +
262                                 (0x20 - ((unsigned long)dma_coherent_handle & 0x1F));
263                 }
264
265                 dma_addr = dma_coherent_handle;
266                 ccb_tmp = (struct CommandControlBlock *)dma_coherent;
267                 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
268                         ccb_tmp->cdb_shifted_phyaddr = dma_addr >> 5;
269                         ccb_tmp->acb = acb;
270                         acb->pccb_pool[i] = ccb_tmp;
271                         list_add_tail(&ccb_tmp->list, &acb->ccb_free_list);
272                         dma_addr = dma_addr + sizeof(struct CommandControlBlock);
273                         ccb_tmp++;
274                 }
275
276                 acb->vir2phy_offset = (unsigned long)ccb_tmp -(unsigned long)dma_addr;
277                 for (i = 0; i < ARCMSR_MAX_TARGETID; i++)
278                         for (j = 0; j < ARCMSR_MAX_TARGETLUN; j++)
279                                 acb->devstate[i][j] = ARECA_RAID_GONE;
280
281                 /*
282                 ** here we need to tell iop 331 our ccb_tmp.HighPart
283                 ** if ccb_tmp.HighPart is not zero
284                 */
285                 intmask_org = arcmsr_disable_outbound_ints(acb);
286                 }
287                 break;
288
289         case ACB_ADAPTER_TYPE_B: {
290
291                 struct pci_dev *pdev = acb->pdev;
292                 struct MessageUnit_B *reg;
293                 void __iomem *mem_base0, *mem_base1;
294                 void *dma_coherent;
295                 dma_addr_t dma_coherent_handle, dma_addr;
296                 uint32_t intmask_org;
297                 struct CommandControlBlock *ccb_tmp;
298                 int i, j;
299
300                 dma_coherent = dma_alloc_coherent(&pdev->dev,
301                         ((ARCMSR_MAX_FREECCB_NUM *
302                         sizeof(struct CommandControlBlock) + 0x20) +
303                         sizeof(struct MessageUnit_B)),
304                         &dma_coherent_handle, GFP_KERNEL);
305                 if (!dma_coherent)
306                         return -ENOMEM;
307
308                 acb->dma_coherent = dma_coherent;
309                 acb->dma_coherent_handle = dma_coherent_handle;
310
311                 if (((unsigned long)dma_coherent & 0x1F)) {
312                         dma_coherent = dma_coherent +
313                                 (0x20 - ((unsigned long)dma_coherent & 0x1F));
314                         dma_coherent_handle = dma_coherent_handle +
315                                 (0x20 - ((unsigned long)dma_coherent_handle & 0x1F));
316                 }
317
318                 dma_addr = dma_coherent_handle;
319                 ccb_tmp = (struct CommandControlBlock *)dma_coherent;
320                 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
321                         ccb_tmp->cdb_shifted_phyaddr = dma_addr >> 5;
322                         ccb_tmp->acb = acb;
323                         acb->pccb_pool[i] = ccb_tmp;
324                         list_add_tail(&ccb_tmp->list, &acb->ccb_free_list);
325                         dma_addr = dma_addr + sizeof(struct CommandControlBlock);
326                         ccb_tmp++;
327                 }
328
329                 reg = (struct MessageUnit_B *)(dma_coherent +
330                 ARCMSR_MAX_FREECCB_NUM * sizeof(struct CommandControlBlock));
331                 acb->pmuB = reg;
332                 mem_base0 = ioremap(pci_resource_start(pdev, 0),
333                                         pci_resource_len(pdev, 0));
334                 if (!mem_base0)
335                         goto out;
336
337                 mem_base1 = ioremap(pci_resource_start(pdev, 2),
338                                         pci_resource_len(pdev, 2));
339                 if (!mem_base1) {
340                         iounmap(mem_base0);
341                         goto out;
342                 }
343
344                 reg->drv2iop_doorbell_reg = mem_base0 + ARCMSR_DRV2IOP_DOORBELL;
345                 reg->drv2iop_doorbell_mask_reg = mem_base0 +
346                                                 ARCMSR_DRV2IOP_DOORBELL_MASK;
347                 reg->iop2drv_doorbell_reg = mem_base0 + ARCMSR_IOP2DRV_DOORBELL;
348                 reg->iop2drv_doorbell_mask_reg = mem_base0 +
349                                                 ARCMSR_IOP2DRV_DOORBELL_MASK;
350                 reg->ioctl_wbuffer_reg = mem_base1 + ARCMSR_IOCTL_WBUFFER;
351                 reg->ioctl_rbuffer_reg = mem_base1 + ARCMSR_IOCTL_RBUFFER;
352                 reg->msgcode_rwbuffer_reg = mem_base1 + ARCMSR_MSGCODE_RWBUFFER;
353
354                 acb->vir2phy_offset = (unsigned long)ccb_tmp -(unsigned long)dma_addr;
355                 for (i = 0; i < ARCMSR_MAX_TARGETID; i++)
356                         for (j = 0; j < ARCMSR_MAX_TARGETLUN; j++)
357                                 acb->devstate[i][j] = ARECA_RAID_GOOD;
358
359                 /*
360                 ** here we need to tell iop 331 our ccb_tmp.HighPart
361                 ** if ccb_tmp.HighPart is not zero
362                 */
363                 intmask_org = arcmsr_disable_outbound_ints(acb);
364                 }
365                 break;
366         }
367         return 0;
368
369 out:
370         dma_free_coherent(&acb->pdev->dev,
371                 (ARCMSR_MAX_FREECCB_NUM * sizeof(struct CommandControlBlock) + 0x20 +
372                 sizeof(struct MessageUnit_B)), acb->dma_coherent, acb->dma_coherent_handle);
373         return -ENOMEM;
374 }
375
376 static int arcmsr_probe(struct pci_dev *pdev,
377         const struct pci_device_id *id)
378 {
379         struct Scsi_Host *host;
380         struct AdapterControlBlock *acb;
381         uint8_t bus, dev_fun;
382         int error;
383
384         error = pci_enable_device(pdev);
385         if (error)
386                 goto out;
387         pci_set_master(pdev);
388
389         host = scsi_host_alloc(&arcmsr_scsi_host_template,
390                         sizeof(struct AdapterControlBlock));
391         if (!host) {
392                 error = -ENOMEM;
393                 goto out_disable_device;
394         }
395         acb = (struct AdapterControlBlock *)host->hostdata;
396         memset(acb, 0, sizeof (struct AdapterControlBlock));
397
398         error = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
399         if (error) {
400                 error = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
401                 if (error) {
402                         printk(KERN_WARNING
403                                "scsi%d: No suitable DMA mask available\n",
404                                host->host_no);
405                         goto out_host_put;
406                 }
407         }
408         bus = pdev->bus->number;
409         dev_fun = pdev->devfn;
410         acb->host = host;
411         acb->pdev = pdev;
412         host->max_sectors = ARCMSR_MAX_XFER_SECTORS;
413         host->max_lun = ARCMSR_MAX_TARGETLUN;
414         host->max_id = ARCMSR_MAX_TARGETID;/*16:8*/
415         host->max_cmd_len = 16;    /*this is issue of 64bit LBA, over 2T byte*/
416         host->sg_tablesize = ARCMSR_MAX_SG_ENTRIES;
417         host->can_queue = ARCMSR_MAX_FREECCB_NUM; /* max simultaneous cmds */
418         host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN;
419         host->this_id = ARCMSR_SCSI_INITIATOR_ID;
420         host->unique_id = (bus << 8) | dev_fun;
421         host->irq = pdev->irq;
422         error = pci_request_regions(pdev, "arcmsr");
423         if (error) {
424                 goto out_host_put;
425         }
426         arcmsr_define_adapter_type(acb);
427
428         acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED |
429                            ACB_F_MESSAGE_RQBUFFER_CLEARED |
430                            ACB_F_MESSAGE_WQBUFFER_READED);
431         acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
432         INIT_LIST_HEAD(&acb->ccb_free_list);
433
434         error = arcmsr_alloc_ccb_pool(acb);
435         if (error)
436                 goto out_release_regions;
437
438         error = request_irq(pdev->irq, arcmsr_do_interrupt,
439                             IRQF_SHARED, "arcmsr", acb);
440         if (error)
441                 goto out_free_ccb_pool;
442
443         arcmsr_iop_init(acb);
444         pci_set_drvdata(pdev, host);
445         if (strncmp(acb->firm_version, "V1.42", 5) >= 0)
446                 host->max_sectors= ARCMSR_MAX_XFER_SECTORS_B;
447
448         error = scsi_add_host(host, &pdev->dev);
449         if (error)
450                 goto out_free_irq;
451
452         error = arcmsr_alloc_sysfs_attr(acb);
453         if (error)
454                 goto out_free_sysfs;
455
456         scsi_scan_host(host);
457         #ifdef CONFIG_SCSI_ARCMSR_AER
458         pci_enable_pcie_error_reporting(pdev);
459         #endif
460         return 0;
461  out_free_sysfs:
462  out_free_irq:
463         free_irq(pdev->irq, acb);
464  out_free_ccb_pool:
465         arcmsr_free_ccb_pool(acb);
466  out_release_regions:
467         pci_release_regions(pdev);
468  out_host_put:
469         scsi_host_put(host);
470  out_disable_device:
471         pci_disable_device(pdev);
472  out:
473         return error;
474 }
475
476 static uint8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
477 {
478         struct MessageUnit_A __iomem *reg = acb->pmuA;
479         uint32_t Index;
480         uint8_t Retries = 0x00;
481
482         do {
483                 for (Index = 0; Index < 100; Index++) {
484                         if (readl(&reg->outbound_intstatus) &
485                                         ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
486                                 writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT,
487                                         &reg->outbound_intstatus);
488                                 return 0x00;
489                         }
490                         msleep(10);
491                 }/*max 1 seconds*/
492
493         } while (Retries++ < 20);/*max 20 sec*/
494         return 0xff;
495 }
496
497 static uint8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
498 {
499         struct MessageUnit_B *reg = acb->pmuB;
500         uint32_t Index;
501         uint8_t Retries = 0x00;
502
503         do {
504                 for (Index = 0; Index < 100; Index++) {
505                         if (readl(reg->iop2drv_doorbell_reg)
506                                 & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
507                                 writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN
508                                         , reg->iop2drv_doorbell_reg);
509                                 writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell_reg);
510                                 return 0x00;
511                         }
512                         msleep(10);
513                 }/*max 1 seconds*/
514
515         } while (Retries++ < 20);/*max 20 sec*/
516         return 0xff;
517 }
518
519 static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb)
520 {
521         struct MessageUnit_A __iomem *reg = acb->pmuA;
522
523         writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, &reg->inbound_msgaddr0);
524         if (arcmsr_hba_wait_msgint_ready(acb))
525                 printk(KERN_NOTICE
526                         "arcmsr%d: wait 'abort all outstanding command' timeout \n"
527                         , acb->host->host_no);
528 }
529
530 static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb)
531 {
532         struct MessageUnit_B *reg = acb->pmuB;
533
534         writel(ARCMSR_MESSAGE_ABORT_CMD, reg->drv2iop_doorbell_reg);
535         if (arcmsr_hbb_wait_msgint_ready(acb))
536                 printk(KERN_NOTICE
537                         "arcmsr%d: wait 'abort all outstanding command' timeout \n"
538                         , acb->host->host_no);
539 }
540
541 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
542 {
543         switch (acb->adapter_type) {
544         case ACB_ADAPTER_TYPE_A: {
545                 arcmsr_abort_hba_allcmd(acb);
546                 }
547                 break;
548
549         case ACB_ADAPTER_TYPE_B: {
550                 arcmsr_abort_hbb_allcmd(acb);
551                 }
552         }
553 }
554
555 static void arcmsr_pci_unmap_dma(struct CommandControlBlock *ccb)
556 {
557         struct scsi_cmnd *pcmd = ccb->pcmd;
558
559         scsi_dma_unmap(pcmd);
560 }
561
562 static void arcmsr_ccb_complete(struct CommandControlBlock *ccb, int stand_flag)
563 {
564         struct AdapterControlBlock *acb = ccb->acb;
565         struct scsi_cmnd *pcmd = ccb->pcmd;
566
567         arcmsr_pci_unmap_dma(ccb);
568         if (stand_flag == 1)
569                 atomic_dec(&acb->ccboutstandingcount);
570         ccb->startdone = ARCMSR_CCB_DONE;
571         ccb->ccb_flags = 0;
572         list_add_tail(&ccb->list, &acb->ccb_free_list);
573         pcmd->scsi_done(pcmd);
574 }
575
576 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
577 {
578         struct MessageUnit_A __iomem *reg = acb->pmuA;
579         int retry_count = 30;
580
581         writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, &reg->inbound_msgaddr0);
582         do {
583                 if (!arcmsr_hba_wait_msgint_ready(acb))
584                         break;
585                 else {
586                         retry_count--;
587                         printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' \
588                         timeout, retry count down = %d \n", acb->host->host_no, retry_count);
589                 }
590         } while (retry_count != 0);
591 }
592
593 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
594 {
595         struct MessageUnit_B *reg = acb->pmuB;
596         int retry_count = 30;
597
598         writel(ARCMSR_MESSAGE_FLUSH_CACHE, reg->drv2iop_doorbell_reg);
599         do {
600                 if (!arcmsr_hbb_wait_msgint_ready(acb))
601                         break;
602                 else {
603                         retry_count--;
604                         printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' \
605                         timeout,retry count down = %d \n", acb->host->host_no, retry_count);
606                 }
607         } while (retry_count != 0);
608 }
609
610 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
611 {
612         switch (acb->adapter_type) {
613
614         case ACB_ADAPTER_TYPE_A: {
615                 arcmsr_flush_hba_cache(acb);
616                 }
617                 break;
618
619         case ACB_ADAPTER_TYPE_B: {
620                 arcmsr_flush_hbb_cache(acb);
621                 }
622         }
623 }
624
625 static void arcmsr_report_sense_info(struct CommandControlBlock *ccb)
626 {
627
628         struct scsi_cmnd *pcmd = ccb->pcmd;
629         struct SENSE_DATA *sensebuffer = (struct SENSE_DATA *)pcmd->sense_buffer;
630
631         pcmd->result = DID_OK << 16;
632         if (sensebuffer) {
633                 int sense_data_length =
634                         sizeof(struct SENSE_DATA) < SCSI_SENSE_BUFFERSIZE
635                         ? sizeof(struct SENSE_DATA) : SCSI_SENSE_BUFFERSIZE;
636                 memset(sensebuffer, 0, SCSI_SENSE_BUFFERSIZE);
637                 memcpy(sensebuffer, ccb->arcmsr_cdb.SenseData, sense_data_length);
638                 sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
639                 sensebuffer->Valid = 1;
640         }
641 }
642
643 static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb)
644 {
645         u32 orig_mask = 0;
646         switch (acb->adapter_type) {
647
648         case ACB_ADAPTER_TYPE_A : {
649                 struct MessageUnit_A __iomem *reg = acb->pmuA;
650                 orig_mask = readl(&reg->outbound_intmask)|\
651                                 ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE;
652                 writel(orig_mask|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE, \
653                                                 &reg->outbound_intmask);
654                 }
655                 break;
656
657         case ACB_ADAPTER_TYPE_B : {
658                 struct MessageUnit_B *reg = acb->pmuB;
659                 orig_mask = readl(reg->iop2drv_doorbell_mask_reg) & \
660                                         (~ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
661                 writel(0, reg->iop2drv_doorbell_mask_reg);
662                 }
663                 break;
664         }
665         return orig_mask;
666 }
667
668 static void arcmsr_report_ccb_state(struct AdapterControlBlock *acb, \
669                         struct CommandControlBlock *ccb, uint32_t flag_ccb)
670 {
671
672         uint8_t id, lun;
673         id = ccb->pcmd->device->id;
674         lun = ccb->pcmd->device->lun;
675         if (!(flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR)) {
676                 if (acb->devstate[id][lun] == ARECA_RAID_GONE)
677                         acb->devstate[id][lun] = ARECA_RAID_GOOD;
678                         ccb->pcmd->result = DID_OK << 16;
679                         arcmsr_ccb_complete(ccb, 1);
680         } else {
681                 switch (ccb->arcmsr_cdb.DeviceStatus) {
682                 case ARCMSR_DEV_SELECT_TIMEOUT: {
683                         acb->devstate[id][lun] = ARECA_RAID_GONE;
684                         ccb->pcmd->result = DID_NO_CONNECT << 16;
685                         arcmsr_ccb_complete(ccb, 1);
686                         }
687                         break;
688
689                 case ARCMSR_DEV_ABORTED:
690
691                 case ARCMSR_DEV_INIT_FAIL: {
692                         acb->devstate[id][lun] = ARECA_RAID_GONE;
693                         ccb->pcmd->result = DID_BAD_TARGET << 16;
694                         arcmsr_ccb_complete(ccb, 1);
695                         }
696                         break;
697
698                 case ARCMSR_DEV_CHECK_CONDITION: {
699                         acb->devstate[id][lun] = ARECA_RAID_GOOD;
700                         arcmsr_report_sense_info(ccb);
701                         arcmsr_ccb_complete(ccb, 1);
702                         }
703                         break;
704
705                 default:
706                                 printk(KERN_NOTICE
707                                         "arcmsr%d: scsi id = %d lun = %d"
708                                         " isr get command error done, "
709                                         "but got unknown DeviceStatus = 0x%x \n"
710                                         , acb->host->host_no
711                                         , id
712                                         , lun
713                                         , ccb->arcmsr_cdb.DeviceStatus);
714                                         acb->devstate[id][lun] = ARECA_RAID_GONE;
715                                         ccb->pcmd->result = DID_NO_CONNECT << 16;
716                                         arcmsr_ccb_complete(ccb, 1);
717                         break;
718                 }
719         }
720 }
721
722 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, uint32_t flag_ccb)
723
724 {
725         struct CommandControlBlock *ccb;
726
727         ccb = (struct CommandControlBlock *)(acb->vir2phy_offset + (flag_ccb << 5));
728         if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) {
729                 if (ccb->startdone == ARCMSR_CCB_ABORTED) {
730                         struct scsi_cmnd *abortcmd = ccb->pcmd;
731                         if (abortcmd) {
732                                 abortcmd->result |= DID_ABORT << 16;
733                                 arcmsr_ccb_complete(ccb, 1);
734                                 printk(KERN_NOTICE "arcmsr%d: ccb ='0x%p' \
735                                 isr got aborted command \n", acb->host->host_no, ccb);
736                         }
737                 }
738                 printk(KERN_NOTICE "arcmsr%d: isr get an illegal ccb command \
739                                 done acb = '0x%p'"
740                                 "ccb = '0x%p' ccbacb = '0x%p' startdone = 0x%x"
741                                 " ccboutstandingcount = %d \n"
742                                 , acb->host->host_no
743                                 , acb
744                                 , ccb
745                                 , ccb->acb
746                                 , ccb->startdone
747                                 , atomic_read(&acb->ccboutstandingcount));
748                 }
749         else
750         arcmsr_report_ccb_state(acb, ccb, flag_ccb);
751 }
752
753 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
754 {
755         int i = 0;
756         uint32_t flag_ccb;
757
758         switch (acb->adapter_type) {
759
760         case ACB_ADAPTER_TYPE_A: {
761                 struct MessageUnit_A __iomem *reg = acb->pmuA;
762                 uint32_t outbound_intstatus;
763                 outbound_intstatus = readl(&reg->outbound_intstatus) &
764                                         acb->outbound_int_enable;
765                 /*clear and abort all outbound posted Q*/
766                 writel(outbound_intstatus, &reg->outbound_intstatus);/*clear interrupt*/
767                 while (((flag_ccb = readl(&reg->outbound_queueport)) != 0xFFFFFFFF)
768                                 && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
769                         arcmsr_drain_donequeue(acb, flag_ccb);
770                 }
771                 }
772                 break;
773
774         case ACB_ADAPTER_TYPE_B: {
775                 struct MessageUnit_B *reg = acb->pmuB;
776                 /*clear all outbound posted Q*/
777                 for (i = 0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
778                         if ((flag_ccb = readl(&reg->done_qbuffer[i])) != 0) {
779                                 writel(0, &reg->done_qbuffer[i]);
780                                 arcmsr_drain_donequeue(acb, flag_ccb);
781                         }
782                         writel(0, &reg->post_qbuffer[i]);
783                 }
784                 reg->doneq_index = 0;
785                 reg->postq_index = 0;
786                 }
787                 break;
788         }
789 }
790 static void arcmsr_remove(struct pci_dev *pdev)
791 {
792         struct Scsi_Host *host = pci_get_drvdata(pdev);
793         struct AdapterControlBlock *acb =
794                 (struct AdapterControlBlock *) host->hostdata;
795         int poll_count = 0;
796
797         arcmsr_free_sysfs_attr(acb);
798         scsi_remove_host(host);
799         arcmsr_stop_adapter_bgrb(acb);
800         arcmsr_flush_adapter_cache(acb);
801         arcmsr_disable_outbound_ints(acb);
802         acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
803         acb->acb_flags &= ~ACB_F_IOP_INITED;
804
805         for (poll_count = 0; poll_count < ARCMSR_MAX_OUTSTANDING_CMD; poll_count++) {
806                 if (!atomic_read(&acb->ccboutstandingcount))
807                         break;
808                 arcmsr_interrupt(acb);/* FIXME: need spinlock */
809                 msleep(25);
810         }
811
812         if (atomic_read(&acb->ccboutstandingcount)) {
813                 int i;
814
815                 arcmsr_abort_allcmd(acb);
816                 arcmsr_done4abort_postqueue(acb);
817                 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
818                         struct CommandControlBlock *ccb = acb->pccb_pool[i];
819                         if (ccb->startdone == ARCMSR_CCB_START) {
820                                 ccb->startdone = ARCMSR_CCB_ABORTED;
821                                 ccb->pcmd->result = DID_ABORT << 16;
822                                 arcmsr_ccb_complete(ccb, 1);
823                         }
824                 }
825         }
826
827         free_irq(pdev->irq, acb);
828         arcmsr_free_ccb_pool(acb);
829         pci_release_regions(pdev);
830
831         scsi_host_put(host);
832
833         pci_disable_device(pdev);
834         pci_set_drvdata(pdev, NULL);
835 }
836
837 static void arcmsr_shutdown(struct pci_dev *pdev)
838 {
839         struct Scsi_Host *host = pci_get_drvdata(pdev);
840         struct AdapterControlBlock *acb =
841                 (struct AdapterControlBlock *)host->hostdata;
842
843         arcmsr_stop_adapter_bgrb(acb);
844         arcmsr_flush_adapter_cache(acb);
845 }
846
847 static int arcmsr_module_init(void)
848 {
849         int error = 0;
850
851         error = pci_register_driver(&arcmsr_pci_driver);
852         return error;
853 }
854
855 static void arcmsr_module_exit(void)
856 {
857         pci_unregister_driver(&arcmsr_pci_driver);
858 }
859 module_init(arcmsr_module_init);
860 module_exit(arcmsr_module_exit);
861
862 static void arcmsr_enable_outbound_ints(struct AdapterControlBlock *acb, \
863                                                 u32 intmask_org)
864 {
865         u32 mask;
866
867         switch (acb->adapter_type) {
868
869         case ACB_ADAPTER_TYPE_A : {
870                 struct MessageUnit_A __iomem *reg = acb->pmuA;
871                 mask = intmask_org & ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE |
872                              ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE);
873                 writel(mask, &reg->outbound_intmask);
874                 acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
875                 }
876                 break;
877
878         case ACB_ADAPTER_TYPE_B : {
879                 struct MessageUnit_B *reg = acb->pmuB;
880                 mask = intmask_org | (ARCMSR_IOP2DRV_DATA_WRITE_OK | \
881                         ARCMSR_IOP2DRV_DATA_READ_OK | ARCMSR_IOP2DRV_CDB_DONE);
882                 writel(mask, reg->iop2drv_doorbell_mask_reg);
883                 acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
884                 }
885         }
886 }
887
888 static int arcmsr_build_ccb(struct AdapterControlBlock *acb,
889         struct CommandControlBlock *ccb, struct scsi_cmnd *pcmd)
890 {
891         struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&ccb->arcmsr_cdb;
892         int8_t *psge = (int8_t *)&arcmsr_cdb->u;
893         __le32 address_lo, address_hi;
894         int arccdbsize = 0x30;
895         int nseg;
896
897         ccb->pcmd = pcmd;
898         memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
899         arcmsr_cdb->Bus = 0;
900         arcmsr_cdb->TargetID = pcmd->device->id;
901         arcmsr_cdb->LUN = pcmd->device->lun;
902         arcmsr_cdb->Function = 1;
903         arcmsr_cdb->CdbLength = (uint8_t)pcmd->cmd_len;
904         arcmsr_cdb->Context = (unsigned long)arcmsr_cdb;
905         memcpy(arcmsr_cdb->Cdb, pcmd->cmnd, pcmd->cmd_len);
906
907         nseg = scsi_dma_map(pcmd);
908         if (nseg > ARCMSR_MAX_SG_ENTRIES)
909                 return FAILED;
910         BUG_ON(nseg < 0);
911
912         if (nseg) {
913                 __le32 length;
914                 int i, cdb_sgcount = 0;
915                 struct scatterlist *sg;
916
917                 /* map stor port SG list to our iop SG List. */
918                 scsi_for_each_sg(pcmd, sg, nseg, i) {
919                         /* Get the physical address of the current data pointer */
920                         length = cpu_to_le32(sg_dma_len(sg));
921                         address_lo = cpu_to_le32(dma_addr_lo32(sg_dma_address(sg)));
922                         address_hi = cpu_to_le32(dma_addr_hi32(sg_dma_address(sg)));
923                         if (address_hi == 0) {
924                                 struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
925
926                                 pdma_sg->address = address_lo;
927                                 pdma_sg->length = length;
928                                 psge += sizeof (struct SG32ENTRY);
929                                 arccdbsize += sizeof (struct SG32ENTRY);
930                         } else {
931                                 struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge;
932
933                                 pdma_sg->addresshigh = address_hi;
934                                 pdma_sg->address = address_lo;
935                                 pdma_sg->length = length|cpu_to_le32(IS_SG64_ADDR);
936                                 psge += sizeof (struct SG64ENTRY);
937                                 arccdbsize += sizeof (struct SG64ENTRY);
938                         }
939                         cdb_sgcount++;
940                 }
941                 arcmsr_cdb->sgcount = (uint8_t)cdb_sgcount;
942                 arcmsr_cdb->DataLength = scsi_bufflen(pcmd);
943                 if ( arccdbsize > 256)
944                         arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
945         }
946         if (pcmd->sc_data_direction == DMA_TO_DEVICE ) {
947                 arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
948                 ccb->ccb_flags |= CCB_FLAG_WRITE;
949         }
950         return SUCCESS;
951 }
952
953 static void arcmsr_post_ccb(struct AdapterControlBlock *acb, struct CommandControlBlock *ccb)
954 {
955         uint32_t cdb_shifted_phyaddr = ccb->cdb_shifted_phyaddr;
956         struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&ccb->arcmsr_cdb;
957         atomic_inc(&acb->ccboutstandingcount);
958         ccb->startdone = ARCMSR_CCB_START;
959
960         switch (acb->adapter_type) {
961         case ACB_ADAPTER_TYPE_A: {
962                 struct MessageUnit_A __iomem *reg = acb->pmuA;
963
964                 if (arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE)
965                         writel(cdb_shifted_phyaddr | ARCMSR_CCBPOST_FLAG_SGL_BSIZE,
966                         &reg->inbound_queueport);
967                 else {
968                                 writel(cdb_shifted_phyaddr, &reg->inbound_queueport);
969                 }
970                 }
971                 break;
972
973         case ACB_ADAPTER_TYPE_B: {
974                 struct MessageUnit_B *reg = acb->pmuB;
975                 uint32_t ending_index, index = reg->postq_index;
976
977                 ending_index = ((index + 1) % ARCMSR_MAX_HBB_POSTQUEUE);
978                 writel(0, &reg->post_qbuffer[ending_index]);
979                 if (arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
980                         writel(cdb_shifted_phyaddr | ARCMSR_CCBPOST_FLAG_SGL_BSIZE,\
981                                                  &reg->post_qbuffer[index]);
982                 }
983                 else {
984                         writel(cdb_shifted_phyaddr, &reg->post_qbuffer[index]);
985                 }
986                 index++;
987                 index %= ARCMSR_MAX_HBB_POSTQUEUE;/*if last index number set it to 0 */
988                 reg->postq_index = index;
989                 writel(ARCMSR_DRV2IOP_CDB_POSTED, reg->drv2iop_doorbell_reg);
990                 }
991                 break;
992         }
993 }
994
995 static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb)
996 {
997         struct MessageUnit_A __iomem *reg = acb->pmuA;
998         acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
999         writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, &reg->inbound_msgaddr0);
1000
1001         if (arcmsr_hba_wait_msgint_ready(acb)) {
1002                 printk(KERN_NOTICE
1003                         "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1004                         , acb->host->host_no);
1005         }
1006 }
1007
1008 static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb)
1009 {
1010         struct MessageUnit_B *reg = acb->pmuB;
1011         acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1012         writel(ARCMSR_MESSAGE_STOP_BGRB, reg->drv2iop_doorbell_reg);
1013
1014         if (arcmsr_hbb_wait_msgint_ready(acb)) {
1015                 printk(KERN_NOTICE
1016                         "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1017                         , acb->host->host_no);
1018         }
1019 }
1020
1021 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
1022 {
1023         switch (acb->adapter_type) {
1024         case ACB_ADAPTER_TYPE_A: {
1025                 arcmsr_stop_hba_bgrb(acb);
1026                 }
1027                 break;
1028
1029         case ACB_ADAPTER_TYPE_B: {
1030                 arcmsr_stop_hbb_bgrb(acb);
1031                 }
1032                 break;
1033         }
1034 }
1035
1036 static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb)
1037 {
1038         switch (acb->adapter_type) {
1039         case ACB_ADAPTER_TYPE_A: {
1040                 iounmap(acb->pmuA);
1041                 dma_free_coherent(&acb->pdev->dev,
1042                 ARCMSR_MAX_FREECCB_NUM * sizeof (struct CommandControlBlock) + 0x20,
1043                 acb->dma_coherent,
1044                 acb->dma_coherent_handle);
1045                 break;
1046         }
1047         case ACB_ADAPTER_TYPE_B: {
1048                 struct MessageUnit_B *reg = acb->pmuB;
1049                 iounmap(reg->drv2iop_doorbell_reg - ARCMSR_DRV2IOP_DOORBELL);
1050                 iounmap(reg->ioctl_wbuffer_reg - ARCMSR_IOCTL_WBUFFER);
1051                 dma_free_coherent(&acb->pdev->dev,
1052                 (ARCMSR_MAX_FREECCB_NUM * sizeof(struct CommandControlBlock) + 0x20 +
1053                 sizeof(struct MessageUnit_B)), acb->dma_coherent, acb->dma_coherent_handle);
1054         }
1055         }
1056
1057 }
1058
1059 void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
1060 {
1061         switch (acb->adapter_type) {
1062         case ACB_ADAPTER_TYPE_A: {
1063                 struct MessageUnit_A __iomem *reg = acb->pmuA;
1064                 writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, &reg->inbound_doorbell);
1065                 }
1066                 break;
1067
1068         case ACB_ADAPTER_TYPE_B: {
1069                 struct MessageUnit_B *reg = acb->pmuB;
1070                 writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell_reg);
1071                 }
1072                 break;
1073         }
1074 }
1075
1076 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
1077 {
1078         switch (acb->adapter_type) {
1079         case ACB_ADAPTER_TYPE_A: {
1080                 struct MessageUnit_A __iomem *reg = acb->pmuA;
1081                 /*
1082                 ** push inbound doorbell tell iop, driver data write ok
1083                 ** and wait reply on next hwinterrupt for next Qbuffer post
1084                 */
1085                 writel(ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK, &reg->inbound_doorbell);
1086                 }
1087                 break;
1088
1089         case ACB_ADAPTER_TYPE_B: {
1090                 struct MessageUnit_B *reg = acb->pmuB;
1091                 /*
1092                 ** push inbound doorbell tell iop, driver data write ok
1093                 ** and wait reply on next hwinterrupt for next Qbuffer post
1094                 */
1095                 writel(ARCMSR_DRV2IOP_DATA_WRITE_OK, reg->drv2iop_doorbell_reg);
1096                 }
1097                 break;
1098         }
1099 }
1100
1101 struct QBUFFER __iomem *arcmsr_get_iop_rqbuffer(struct AdapterControlBlock *acb)
1102 {
1103         struct QBUFFER __iomem *qbuffer = NULL;
1104
1105         switch (acb->adapter_type) {
1106
1107         case ACB_ADAPTER_TYPE_A: {
1108                 struct MessageUnit_A __iomem *reg = acb->pmuA;
1109                 qbuffer = (struct QBUFFER __iomem *)&reg->message_rbuffer;
1110                 }
1111                 break;
1112
1113         case ACB_ADAPTER_TYPE_B: {
1114                 struct MessageUnit_B *reg = acb->pmuB;
1115                 qbuffer = (struct QBUFFER __iomem *)reg->ioctl_rbuffer_reg;
1116                 }
1117                 break;
1118         }
1119         return qbuffer;
1120 }
1121
1122 static struct QBUFFER __iomem *arcmsr_get_iop_wqbuffer(struct AdapterControlBlock *acb)
1123 {
1124         struct QBUFFER __iomem *pqbuffer = NULL;
1125
1126         switch (acb->adapter_type) {
1127
1128         case ACB_ADAPTER_TYPE_A: {
1129                 struct MessageUnit_A __iomem *reg = acb->pmuA;
1130                 pqbuffer = (struct QBUFFER __iomem *) &reg->message_wbuffer;
1131                 }
1132                 break;
1133
1134         case ACB_ADAPTER_TYPE_B: {
1135                 struct MessageUnit_B  *reg = acb->pmuB;
1136                 pqbuffer = (struct QBUFFER __iomem *)reg->ioctl_wbuffer_reg;
1137                 }
1138                 break;
1139         }
1140         return pqbuffer;
1141 }
1142
1143 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
1144 {
1145         struct QBUFFER __iomem *prbuffer;
1146         struct QBUFFER *pQbuffer;
1147         uint8_t __iomem *iop_data;
1148         int32_t my_empty_len, iop_len, rqbuf_firstindex, rqbuf_lastindex;
1149
1150         rqbuf_lastindex = acb->rqbuf_lastindex;
1151         rqbuf_firstindex = acb->rqbuf_firstindex;
1152         prbuffer = arcmsr_get_iop_rqbuffer(acb);
1153         iop_data = (uint8_t __iomem *)prbuffer->data;
1154         iop_len = prbuffer->data_len;
1155         my_empty_len = (rqbuf_firstindex - rqbuf_lastindex -1)&(ARCMSR_MAX_QBUFFER -1);
1156
1157         if (my_empty_len >= iop_len)
1158         {
1159                 while (iop_len > 0) {
1160                         pQbuffer = (struct QBUFFER *)&acb->rqbuffer[rqbuf_lastindex];
1161                         memcpy(pQbuffer, iop_data,1);
1162                         rqbuf_lastindex++;
1163                         rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1164                         iop_data++;
1165                         iop_len--;
1166                 }
1167                 acb->rqbuf_lastindex = rqbuf_lastindex;
1168                 arcmsr_iop_message_read(acb);
1169         }
1170
1171         else {
1172                 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1173         }
1174 }
1175
1176 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
1177 {
1178         acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READED;
1179         if (acb->wqbuf_firstindex != acb->wqbuf_lastindex) {
1180                 uint8_t *pQbuffer;
1181                 struct QBUFFER __iomem *pwbuffer;
1182                 uint8_t __iomem *iop_data;
1183                 int32_t allxfer_len = 0;
1184
1185                 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED);
1186                 pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1187                 iop_data = (uint8_t __iomem *)pwbuffer->data;
1188
1189                 while ((acb->wqbuf_firstindex != acb->wqbuf_lastindex) && \
1190                                                         (allxfer_len < 124)) {
1191                         pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1192                         memcpy(iop_data, pQbuffer, 1);
1193                         acb->wqbuf_firstindex++;
1194                         acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1195                         iop_data++;
1196                         allxfer_len++;
1197                 }
1198                 pwbuffer->data_len = allxfer_len;
1199
1200                 arcmsr_iop_message_wrote(acb);
1201         }
1202
1203         if (acb->wqbuf_firstindex == acb->wqbuf_lastindex) {
1204                 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
1205         }
1206 }
1207
1208 static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb)
1209 {
1210         uint32_t outbound_doorbell;
1211         struct MessageUnit_A __iomem *reg = acb->pmuA;
1212
1213         outbound_doorbell = readl(&reg->outbound_doorbell);
1214         writel(outbound_doorbell, &reg->outbound_doorbell);
1215         if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK) {
1216                 arcmsr_iop2drv_data_wrote_handle(acb);
1217         }
1218
1219         if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK)    {
1220                 arcmsr_iop2drv_data_read_handle(acb);
1221         }
1222 }
1223
1224 static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
1225 {
1226         uint32_t flag_ccb;
1227         struct MessageUnit_A __iomem *reg = acb->pmuA;
1228
1229         while ((flag_ccb = readl(&reg->outbound_queueport)) != 0xFFFFFFFF) {
1230                 arcmsr_drain_donequeue(acb, flag_ccb);
1231         }
1232 }
1233
1234 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb)
1235 {
1236         uint32_t index;
1237         uint32_t flag_ccb;
1238         struct MessageUnit_B *reg = acb->pmuB;
1239
1240         index = reg->doneq_index;
1241
1242         while ((flag_ccb = readl(&reg->done_qbuffer[index])) != 0) {
1243                 writel(0, &reg->done_qbuffer[index]);
1244                 arcmsr_drain_donequeue(acb, flag_ccb);
1245                 index++;
1246                 index %= ARCMSR_MAX_HBB_POSTQUEUE;
1247                 reg->doneq_index = index;
1248         }
1249 }
1250
1251 static int arcmsr_handle_hba_isr(struct AdapterControlBlock *acb)
1252 {
1253         uint32_t outbound_intstatus;
1254         struct MessageUnit_A __iomem *reg = acb->pmuA;
1255
1256         outbound_intstatus = readl(&reg->outbound_intstatus) & \
1257                                                         acb->outbound_int_enable;
1258         if (!(outbound_intstatus & ARCMSR_MU_OUTBOUND_HANDLE_INT))      {
1259                 return 1;
1260         }
1261         writel(outbound_intstatus, &reg->outbound_intstatus);
1262         if (outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT)       {
1263                 arcmsr_hba_doorbell_isr(acb);
1264         }
1265         if (outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
1266                 arcmsr_hba_postqueue_isr(acb);
1267         }
1268         return 0;
1269 }
1270
1271 static int arcmsr_handle_hbb_isr(struct AdapterControlBlock *acb)
1272 {
1273         uint32_t outbound_doorbell;
1274         struct MessageUnit_B *reg = acb->pmuB;
1275
1276         outbound_doorbell = readl(reg->iop2drv_doorbell_reg) & \
1277                                                         acb->outbound_int_enable;
1278         if (!outbound_doorbell)
1279                 return 1;
1280
1281         writel(~outbound_doorbell, reg->iop2drv_doorbell_reg);
1282         /*in case the last action of doorbell interrupt clearance is cached, this action can push HW to write down the clear bit*/
1283         readl(reg->iop2drv_doorbell_reg);
1284         writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell_reg);
1285         if (outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK)   {
1286                 arcmsr_iop2drv_data_wrote_handle(acb);
1287         }
1288         if (outbound_doorbell & ARCMSR_IOP2DRV_DATA_READ_OK) {
1289                 arcmsr_iop2drv_data_read_handle(acb);
1290         }
1291         if (outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
1292                 arcmsr_hbb_postqueue_isr(acb);
1293         }
1294
1295         return 0;
1296 }
1297
1298 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb)
1299 {
1300         switch (acb->adapter_type) {
1301         case ACB_ADAPTER_TYPE_A: {
1302                 if (arcmsr_handle_hba_isr(acb)) {
1303                         return IRQ_NONE;
1304                 }
1305                 }
1306                 break;
1307
1308         case ACB_ADAPTER_TYPE_B: {
1309                 if (arcmsr_handle_hbb_isr(acb)) {
1310                         return IRQ_NONE;
1311                 }
1312                 }
1313                 break;
1314         }
1315         return IRQ_HANDLED;
1316 }
1317
1318 static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
1319 {
1320         if (acb) {
1321                 /* stop adapter background rebuild */
1322                 if (acb->acb_flags & ACB_F_MSG_START_BGRB) {
1323                         uint32_t intmask_org;
1324                         acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1325                         intmask_org = arcmsr_disable_outbound_ints(acb);
1326                         arcmsr_stop_adapter_bgrb(acb);
1327                         arcmsr_flush_adapter_cache(acb);
1328                         arcmsr_enable_outbound_ints(acb, intmask_org);
1329                 }
1330         }
1331 }
1332
1333 void arcmsr_post_ioctldata2iop(struct AdapterControlBlock *acb)
1334 {
1335         int32_t wqbuf_firstindex, wqbuf_lastindex;
1336         uint8_t *pQbuffer;
1337         struct QBUFFER __iomem *pwbuffer;
1338         uint8_t __iomem *iop_data;
1339         int32_t allxfer_len = 0;
1340
1341         pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1342         iop_data = (uint8_t __iomem *)pwbuffer->data;
1343         if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READED) {
1344                 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED);
1345                 wqbuf_firstindex = acb->wqbuf_firstindex;
1346                 wqbuf_lastindex = acb->wqbuf_lastindex;
1347                 while ((wqbuf_firstindex != wqbuf_lastindex) && (allxfer_len < 124)) {
1348                         pQbuffer = &acb->wqbuffer[wqbuf_firstindex];
1349                         memcpy(iop_data, pQbuffer, 1);
1350                         wqbuf_firstindex++;
1351                         wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1352                         iop_data++;
1353                         allxfer_len++;
1354                 }
1355                 acb->wqbuf_firstindex = wqbuf_firstindex;
1356                 pwbuffer->data_len = allxfer_len;
1357                 arcmsr_iop_message_wrote(acb);
1358         }
1359 }
1360
1361 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \
1362                                         struct scsi_cmnd *cmd)
1363 {
1364         struct CMD_MESSAGE_FIELD *pcmdmessagefld;
1365         int retvalue = 0, transfer_len = 0;
1366         char *buffer;
1367         struct scatterlist *sg;
1368         uint32_t controlcode = (uint32_t ) cmd->cmnd[5] << 24 |
1369                                                 (uint32_t ) cmd->cmnd[6] << 16 |
1370                                                 (uint32_t ) cmd->cmnd[7] << 8  |
1371                                                 (uint32_t ) cmd->cmnd[8];
1372                                                 /* 4 bytes: Areca io control code */
1373
1374         sg = scsi_sglist(cmd);
1375         buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
1376         if (scsi_sg_count(cmd) > 1) {
1377                 retvalue = ARCMSR_MESSAGE_FAIL;
1378                 goto message_out;
1379         }
1380         transfer_len += sg->length;
1381
1382         if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
1383                 retvalue = ARCMSR_MESSAGE_FAIL;
1384                 goto message_out;
1385         }
1386         pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) buffer;
1387         switch(controlcode) {
1388
1389         case ARCMSR_MESSAGE_READ_RQBUFFER: {
1390                 unsigned long *ver_addr;
1391                 uint8_t *pQbuffer, *ptmpQbuffer;
1392                 int32_t allxfer_len = 0;
1393                 void *tmp;
1394
1395                 tmp = kmalloc(1032, GFP_KERNEL|GFP_DMA);
1396                 ver_addr = (unsigned long *)tmp;
1397                 if (!tmp) {
1398                         retvalue = ARCMSR_MESSAGE_FAIL;
1399                         goto message_out;
1400                 }
1401                 ptmpQbuffer = (uint8_t *) ver_addr;
1402                 while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
1403                         && (allxfer_len < 1031)) {
1404                         pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
1405                         memcpy(ptmpQbuffer, pQbuffer, 1);
1406                         acb->rqbuf_firstindex++;
1407                         acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1408                         ptmpQbuffer++;
1409                         allxfer_len++;
1410                 }
1411                 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1412
1413                         struct QBUFFER __iomem *prbuffer;
1414                         uint8_t __iomem *iop_data;
1415                         int32_t iop_len;
1416
1417                         acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1418                         prbuffer = arcmsr_get_iop_rqbuffer(acb);
1419                         iop_data = prbuffer->data;
1420                         iop_len = readl(&prbuffer->data_len);
1421                         while (iop_len > 0) {
1422                                 acb->rqbuffer[acb->rqbuf_lastindex] = readb(iop_data);
1423                                 acb->rqbuf_lastindex++;
1424                                 acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1425                                 iop_data++;
1426                                 iop_len--;
1427                         }
1428                         arcmsr_iop_message_read(acb);
1429                 }
1430                 memcpy(pcmdmessagefld->messagedatabuffer, (uint8_t *)ver_addr, allxfer_len);
1431                 pcmdmessagefld->cmdmessage.Length = allxfer_len;
1432                 pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
1433                 kfree(tmp);
1434                 }
1435                 break;
1436
1437         case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
1438                 unsigned long *ver_addr;
1439                 int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
1440                 uint8_t *pQbuffer, *ptmpuserbuffer;
1441                 void *tmp;
1442
1443                 tmp = kmalloc(1032, GFP_KERNEL|GFP_DMA);
1444                 ver_addr = (unsigned long *)tmp;
1445                 if (!tmp) {
1446                         retvalue = ARCMSR_MESSAGE_FAIL;
1447                         goto message_out;
1448                 }
1449                 ptmpuserbuffer = (uint8_t *)ver_addr;
1450                 user_len = pcmdmessagefld->cmdmessage.Length;
1451                 memcpy(ptmpuserbuffer, pcmdmessagefld->messagedatabuffer, user_len);
1452                 wqbuf_lastindex = acb->wqbuf_lastindex;
1453                 wqbuf_firstindex = acb->wqbuf_firstindex;
1454                 if (wqbuf_lastindex != wqbuf_firstindex) {
1455                         struct SENSE_DATA *sensebuffer =
1456                                 (struct SENSE_DATA *)cmd->sense_buffer;
1457                         arcmsr_post_ioctldata2iop(acb);
1458                         /* has error report sensedata */
1459                         sensebuffer->ErrorCode = 0x70;
1460                         sensebuffer->SenseKey = ILLEGAL_REQUEST;
1461                         sensebuffer->AdditionalSenseLength = 0x0A;
1462                         sensebuffer->AdditionalSenseCode = 0x20;
1463                         sensebuffer->Valid = 1;
1464                         retvalue = ARCMSR_MESSAGE_FAIL;
1465                 } else {
1466                         my_empty_len = (wqbuf_firstindex-wqbuf_lastindex - 1)
1467                                 &(ARCMSR_MAX_QBUFFER - 1);
1468                         if (my_empty_len >= user_len) {
1469                                 while (user_len > 0) {
1470                                         pQbuffer =
1471                                         &acb->wqbuffer[acb->wqbuf_lastindex];
1472                                         memcpy(pQbuffer, ptmpuserbuffer, 1);
1473                                         acb->wqbuf_lastindex++;
1474                                         acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1475                                         ptmpuserbuffer++;
1476                                         user_len--;
1477                                 }
1478                                 if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
1479                                         acb->acb_flags &=
1480                                                 ~ACB_F_MESSAGE_WQBUFFER_CLEARED;
1481                                         arcmsr_post_ioctldata2iop(acb);
1482                                 }
1483                         } else {
1484                                 /* has error report sensedata */
1485                                 struct SENSE_DATA *sensebuffer =
1486                                         (struct SENSE_DATA *)cmd->sense_buffer;
1487                                 sensebuffer->ErrorCode = 0x70;
1488                                 sensebuffer->SenseKey = ILLEGAL_REQUEST;
1489                                 sensebuffer->AdditionalSenseLength = 0x0A;
1490                                 sensebuffer->AdditionalSenseCode = 0x20;
1491                                 sensebuffer->Valid = 1;
1492                                 retvalue = ARCMSR_MESSAGE_FAIL;
1493                         }
1494                         }
1495                         kfree(tmp);
1496                 }
1497                 break;
1498
1499         case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
1500                 uint8_t *pQbuffer = acb->rqbuffer;
1501
1502                 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1503                         acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1504                         arcmsr_iop_message_read(acb);
1505                 }
1506                 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
1507                 acb->rqbuf_firstindex = 0;
1508                 acb->rqbuf_lastindex = 0;
1509                 memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1510                 pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
1511                 }
1512                 break;
1513
1514         case ARCMSR_MESSAGE_CLEAR_WQBUFFER: {
1515                 uint8_t *pQbuffer = acb->wqbuffer;
1516
1517                 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1518                         acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1519                         arcmsr_iop_message_read(acb);
1520                 }
1521                 acb->acb_flags |=
1522                         (ACB_F_MESSAGE_WQBUFFER_CLEARED |
1523                                 ACB_F_MESSAGE_WQBUFFER_READED);
1524                 acb->wqbuf_firstindex = 0;
1525                 acb->wqbuf_lastindex = 0;
1526                 memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1527                 pcmdmessagefld->cmdmessage.ReturnCode =
1528                         ARCMSR_MESSAGE_RETURNCODE_OK;
1529                 }
1530                 break;
1531
1532         case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
1533                 uint8_t *pQbuffer;
1534
1535                 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1536                         acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1537                         arcmsr_iop_message_read(acb);
1538                 }
1539                 acb->acb_flags |=
1540                         (ACB_F_MESSAGE_WQBUFFER_CLEARED
1541                         | ACB_F_MESSAGE_RQBUFFER_CLEARED
1542                         | ACB_F_MESSAGE_WQBUFFER_READED);
1543                 acb->rqbuf_firstindex = 0;
1544                 acb->rqbuf_lastindex = 0;
1545                 acb->wqbuf_firstindex = 0;
1546                 acb->wqbuf_lastindex = 0;
1547                 pQbuffer = acb->rqbuffer;
1548                 memset(pQbuffer, 0, sizeof(struct QBUFFER));
1549                 pQbuffer = acb->wqbuffer;
1550                 memset(pQbuffer, 0, sizeof(struct QBUFFER));
1551                 pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
1552                 }
1553                 break;
1554
1555         case ARCMSR_MESSAGE_RETURN_CODE_3F: {
1556                 pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
1557                 }
1558                 break;
1559
1560         case ARCMSR_MESSAGE_SAY_HELLO: {
1561                 int8_t *hello_string = "Hello! I am ARCMSR";
1562
1563                 memcpy(pcmdmessagefld->messagedatabuffer, hello_string
1564                         , (int16_t)strlen(hello_string));
1565                 pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
1566                 }
1567                 break;
1568
1569         case ARCMSR_MESSAGE_SAY_GOODBYE:
1570                 arcmsr_iop_parking(acb);
1571                 break;
1572
1573         case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE:
1574                 arcmsr_flush_adapter_cache(acb);
1575                 break;
1576
1577         default:
1578                 retvalue = ARCMSR_MESSAGE_FAIL;
1579         }
1580         message_out:
1581         sg = scsi_sglist(cmd);
1582         kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1583         return retvalue;
1584 }
1585
1586 static struct CommandControlBlock *arcmsr_get_freeccb(struct AdapterControlBlock *acb)
1587 {
1588         struct list_head *head = &acb->ccb_free_list;
1589         struct CommandControlBlock *ccb = NULL;
1590
1591         if (!list_empty(head)) {
1592                 ccb = list_entry(head->next, struct CommandControlBlock, list);
1593                 list_del(head->next);
1594         }
1595         return ccb;
1596 }
1597
1598 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
1599                 struct scsi_cmnd *cmd)
1600 {
1601         switch (cmd->cmnd[0]) {
1602         case INQUIRY: {
1603                 unsigned char inqdata[36];
1604                 char *buffer;
1605                 struct scatterlist *sg;
1606
1607                 if (cmd->device->lun) {
1608                         cmd->result = (DID_TIME_OUT << 16);
1609                         cmd->scsi_done(cmd);
1610                         return;
1611                 }
1612                 inqdata[0] = TYPE_PROCESSOR;
1613                 /* Periph Qualifier & Periph Dev Type */
1614                 inqdata[1] = 0;
1615                 /* rem media bit & Dev Type Modifier */
1616                 inqdata[2] = 0;
1617                 /* ISO, ECMA, & ANSI versions */
1618                 inqdata[4] = 31;
1619                 /* length of additional data */
1620                 strncpy(&inqdata[8], "Areca   ", 8);
1621                 /* Vendor Identification */
1622                 strncpy(&inqdata[16], "RAID controller ", 16);
1623                 /* Product Identification */
1624                 strncpy(&inqdata[32], "R001", 4); /* Product Revision */
1625
1626                 sg = scsi_sglist(cmd);
1627                 buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
1628
1629                 memcpy(buffer, inqdata, sizeof(inqdata));
1630                 sg = scsi_sglist(cmd);
1631                 kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1632
1633                 cmd->scsi_done(cmd);
1634         }
1635         break;
1636         case WRITE_BUFFER:
1637         case READ_BUFFER: {
1638                 if (arcmsr_iop_message_xfer(acb, cmd))
1639                         cmd->result = (DID_ERROR << 16);
1640                 cmd->scsi_done(cmd);
1641         }
1642         break;
1643         default:
1644                 cmd->scsi_done(cmd);
1645         }
1646 }
1647
1648 static int arcmsr_queue_command(struct scsi_cmnd *cmd,
1649         void (* done)(struct scsi_cmnd *))
1650 {
1651         struct Scsi_Host *host = cmd->device->host;
1652         struct AdapterControlBlock *acb = (struct AdapterControlBlock *) host->hostdata;
1653         struct CommandControlBlock *ccb;
1654         int target = cmd->device->id;
1655         int lun = cmd->device->lun;
1656
1657         cmd->scsi_done = done;
1658         cmd->host_scribble = NULL;
1659         cmd->result = 0;
1660         if (acb->acb_flags & ACB_F_BUS_RESET) {
1661                 printk(KERN_NOTICE "arcmsr%d: bus reset"
1662                         " and return busy \n"
1663                         , acb->host->host_no);
1664                 return SCSI_MLQUEUE_HOST_BUSY;
1665         }
1666         if (target == 16) {
1667                 /* virtual device for iop message transfer */
1668                 arcmsr_handle_virtual_command(acb, cmd);
1669                 return 0;
1670         }
1671         if (acb->devstate[target][lun] == ARECA_RAID_GONE) {
1672                 uint8_t block_cmd;
1673
1674                 block_cmd = cmd->cmnd[0] & 0x0f;
1675                 if (block_cmd == 0x08 || block_cmd == 0x0a) {
1676                         printk(KERN_NOTICE
1677                                 "arcmsr%d: block 'read/write'"
1678                                 "command with gone raid volume"
1679                                 " Cmd = %2x, TargetId = %d, Lun = %d \n"
1680                                 , acb->host->host_no
1681                                 , cmd->cmnd[0]
1682                                 , target, lun);
1683                         cmd->result = (DID_NO_CONNECT << 16);
1684                         cmd->scsi_done(cmd);
1685                         return 0;
1686                 }
1687         }
1688         if (atomic_read(&acb->ccboutstandingcount) >=
1689                         ARCMSR_MAX_OUTSTANDING_CMD)
1690                 return SCSI_MLQUEUE_HOST_BUSY;
1691
1692         ccb = arcmsr_get_freeccb(acb);
1693         if (!ccb)
1694                 return SCSI_MLQUEUE_HOST_BUSY;
1695         if ( arcmsr_build_ccb( acb, ccb, cmd ) == FAILED ) {
1696                 cmd->result = (DID_ERROR << 16) | (RESERVATION_CONFLICT << 1);
1697                 cmd->scsi_done(cmd);
1698                 return 0;
1699         }
1700         arcmsr_post_ccb(acb, ccb);
1701         return 0;
1702 }
1703
1704 static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
1705 {
1706         struct MessageUnit_A __iomem *reg = acb->pmuA;
1707         char *acb_firm_model = acb->firm_model;
1708         char *acb_firm_version = acb->firm_version;
1709         char __iomem *iop_firm_model = (char __iomem *)(&reg->message_rwbuffer[15]);
1710         char __iomem *iop_firm_version = (char __iomem *)(&reg->message_rwbuffer[17]);
1711         int count;
1712
1713         writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
1714         if (arcmsr_hba_wait_msgint_ready(acb)) {
1715                 printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
1716                         miscellaneous data' timeout \n", acb->host->host_no);
1717         }
1718
1719         count = 8;
1720         while (count) {
1721                 *acb_firm_model = readb(iop_firm_model);
1722                 acb_firm_model++;
1723                 iop_firm_model++;
1724                 count--;
1725         }
1726
1727         count = 16;
1728         while (count) {
1729                 *acb_firm_version = readb(iop_firm_version);
1730                 acb_firm_version++;
1731                 iop_firm_version++;
1732                 count--;
1733         }
1734
1735         printk(KERN_INFO        "ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n"
1736                 , acb->host->host_no
1737                 , acb->firm_version);
1738
1739         acb->firm_request_len = readl(&reg->message_rwbuffer[1]);
1740         acb->firm_numbers_queue = readl(&reg->message_rwbuffer[2]);
1741         acb->firm_sdram_size = readl(&reg->message_rwbuffer[3]);
1742         acb->firm_hd_channels = readl(&reg->message_rwbuffer[4]);
1743 }
1744
1745 static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
1746 {
1747         struct MessageUnit_B *reg = acb->pmuB;
1748         uint32_t __iomem *lrwbuffer = reg->msgcode_rwbuffer_reg;
1749         char *acb_firm_model = acb->firm_model;
1750         char *acb_firm_version = acb->firm_version;
1751         char __iomem *iop_firm_model = (char __iomem *)(&lrwbuffer[15]);
1752         /*firm_model,15,60-67*/
1753         char __iomem *iop_firm_version = (char __iomem *)(&lrwbuffer[17]);
1754         /*firm_version,17,68-83*/
1755         int count;
1756
1757         writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell_reg);
1758         if (arcmsr_hbb_wait_msgint_ready(acb)) {
1759                 printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
1760                         miscellaneous data' timeout \n", acb->host->host_no);
1761         }
1762
1763         count = 8;
1764         while (count)
1765         {
1766                 *acb_firm_model = readb(iop_firm_model);
1767                 acb_firm_model++;
1768                 iop_firm_model++;
1769                 count--;
1770         }
1771
1772         count = 16;
1773         while (count)
1774         {
1775                 *acb_firm_version = readb(iop_firm_version);
1776                 acb_firm_version++;
1777                 iop_firm_version++;
1778                 count--;
1779         }
1780
1781         printk(KERN_INFO "ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n",
1782                         acb->host->host_no,
1783                         acb->firm_version);
1784
1785         lrwbuffer++;
1786         acb->firm_request_len = readl(lrwbuffer++);
1787         /*firm_request_len,1,04-07*/
1788         acb->firm_numbers_queue = readl(lrwbuffer++);
1789         /*firm_numbers_queue,2,08-11*/
1790         acb->firm_sdram_size = readl(lrwbuffer++);
1791         /*firm_sdram_size,3,12-15*/
1792         acb->firm_hd_channels = readl(lrwbuffer);
1793         /*firm_ide_channels,4,16-19*/
1794 }
1795
1796 static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
1797 {
1798         switch (acb->adapter_type) {
1799         case ACB_ADAPTER_TYPE_A: {
1800                 arcmsr_get_hba_config(acb);
1801                 }
1802                 break;
1803
1804         case ACB_ADAPTER_TYPE_B: {
1805                 arcmsr_get_hbb_config(acb);
1806                 }
1807                 break;
1808         }
1809 }
1810
1811 static void arcmsr_polling_hba_ccbdone(struct AdapterControlBlock *acb,
1812         struct CommandControlBlock *poll_ccb)
1813 {
1814         struct MessageUnit_A __iomem *reg = acb->pmuA;
1815         struct CommandControlBlock *ccb;
1816         uint32_t flag_ccb, outbound_intstatus, poll_ccb_done = 0, poll_count = 0;
1817
1818         polling_hba_ccb_retry:
1819         poll_count++;
1820         outbound_intstatus = readl(&reg->outbound_intstatus) & acb->outbound_int_enable;
1821         writel(outbound_intstatus, &reg->outbound_intstatus);/*clear interrupt*/
1822         while (1) {
1823                 if ((flag_ccb = readl(&reg->outbound_queueport)) == 0xFFFFFFFF) {
1824                         if (poll_ccb_done)
1825                                 break;
1826                         else {
1827                                 msleep(25);
1828                                 if (poll_count > 100)
1829                                         break;
1830                                 goto polling_hba_ccb_retry;
1831                         }
1832                 }
1833                 ccb = (struct CommandControlBlock *)(acb->vir2phy_offset + (flag_ccb << 5));
1834                 poll_ccb_done = (ccb == poll_ccb) ? 1:0;
1835                 if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) {
1836                         if ((ccb->startdone == ARCMSR_CCB_ABORTED) || (ccb == poll_ccb)) {
1837                                 printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
1838                                         " poll command abort successfully \n"
1839                                         , acb->host->host_no
1840                                         , ccb->pcmd->device->id
1841                                         , ccb->pcmd->device->lun
1842                                         , ccb);
1843                                 ccb->pcmd->result = DID_ABORT << 16;
1844                                 arcmsr_ccb_complete(ccb, 1);
1845                                 poll_ccb_done = 1;
1846                                 continue;
1847                         }
1848                         printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb"
1849                                 " command done ccb = '0x%p'"
1850                                 "ccboutstandingcount = %d \n"
1851                                 , acb->host->host_no
1852                                 , ccb
1853                                 , atomic_read(&acb->ccboutstandingcount));
1854                         continue;
1855                 }
1856                 arcmsr_report_ccb_state(acb, ccb, flag_ccb);
1857         }
1858 }
1859
1860 static void arcmsr_polling_hbb_ccbdone(struct AdapterControlBlock *acb,
1861                                         struct CommandControlBlock *poll_ccb)
1862 {
1863                 struct MessageUnit_B *reg = acb->pmuB;
1864                 struct CommandControlBlock *ccb;
1865                 uint32_t flag_ccb, poll_ccb_done = 0, poll_count = 0;
1866                 int index;
1867
1868         polling_hbb_ccb_retry:
1869                 poll_count++;
1870                 /* clear doorbell interrupt */
1871                 writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell_reg);
1872                 while (1) {
1873                         index = reg->doneq_index;
1874                         if ((flag_ccb = readl(&reg->done_qbuffer[index])) == 0) {
1875                                 if (poll_ccb_done)
1876                                         break;
1877                                 else {
1878                                         msleep(25);
1879                                         if (poll_count > 100)
1880                                                 break;
1881                                         goto polling_hbb_ccb_retry;
1882                                 }
1883                         }
1884                         writel(0, &reg->done_qbuffer[index]);
1885                         index++;
1886                         /*if last index number set it to 0 */
1887                         index %= ARCMSR_MAX_HBB_POSTQUEUE;
1888                         reg->doneq_index = index;
1889                         /* check ifcommand done with no error*/
1890                         ccb = (struct CommandControlBlock *)\
1891       (acb->vir2phy_offset + (flag_ccb << 5));/*frame must be 32 bytes aligned*/
1892                         poll_ccb_done = (ccb == poll_ccb) ? 1:0;
1893                         if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) {
1894                                 if ((ccb->startdone == ARCMSR_CCB_ABORTED) || (ccb == poll_ccb)) {
1895                                         printk(KERN_NOTICE "arcmsr%d: \
1896                 scsi id = %d lun = %d ccb = '0x%p' poll command abort successfully \n"
1897                                                 ,acb->host->host_no
1898                                                 ,ccb->pcmd->device->id
1899                                                 ,ccb->pcmd->device->lun
1900                                                 ,ccb);
1901                                         ccb->pcmd->result = DID_ABORT << 16;
1902                                         arcmsr_ccb_complete(ccb, 1);
1903                                         continue;
1904                                 }
1905                                 printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb"
1906                                         " command done ccb = '0x%p'"
1907                                         "ccboutstandingcount = %d \n"
1908                                         , acb->host->host_no
1909                                         , ccb
1910                                         , atomic_read(&acb->ccboutstandingcount));
1911                                 continue;
1912                         }
1913                         arcmsr_report_ccb_state(acb, ccb, flag_ccb);
1914                 }       /*drain reply FIFO*/
1915 }
1916
1917 static void arcmsr_polling_ccbdone(struct AdapterControlBlock *acb,
1918                                         struct CommandControlBlock *poll_ccb)
1919 {
1920         switch (acb->adapter_type) {
1921
1922         case ACB_ADAPTER_TYPE_A: {
1923                 arcmsr_polling_hba_ccbdone(acb,poll_ccb);
1924                 }
1925                 break;
1926
1927         case ACB_ADAPTER_TYPE_B: {
1928                 arcmsr_polling_hbb_ccbdone(acb,poll_ccb);
1929                 }
1930         }
1931 }
1932
1933 static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
1934 {
1935         uint32_t cdb_phyaddr, ccb_phyaddr_hi32;
1936         dma_addr_t dma_coherent_handle;
1937         /*
1938         ********************************************************************
1939         ** here we need to tell iop 331 our freeccb.HighPart
1940         ** if freeccb.HighPart is not zero
1941         ********************************************************************
1942         */
1943         dma_coherent_handle = acb->dma_coherent_handle;
1944         cdb_phyaddr = (uint32_t)(dma_coherent_handle);
1945         ccb_phyaddr_hi32 = (uint32_t)((cdb_phyaddr >> 16) >> 16);
1946         /*
1947         ***********************************************************************
1948         **    if adapter type B, set window of "post command Q"
1949         ***********************************************************************
1950         */
1951         switch (acb->adapter_type) {
1952
1953         case ACB_ADAPTER_TYPE_A: {
1954                 if (ccb_phyaddr_hi32 != 0) {
1955                         struct MessageUnit_A __iomem *reg = acb->pmuA;
1956                         uint32_t intmask_org;
1957                         intmask_org = arcmsr_disable_outbound_ints(acb);
1958                         writel(ARCMSR_SIGNATURE_SET_CONFIG, \
1959                                                 &reg->message_rwbuffer[0]);
1960                         writel(ccb_phyaddr_hi32, &reg->message_rwbuffer[1]);
1961                         writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, \
1962                                                         &reg->inbound_msgaddr0);
1963                         if (arcmsr_hba_wait_msgint_ready(acb)) {
1964                                 printk(KERN_NOTICE "arcmsr%d: ""set ccb high \
1965                                 part physical address timeout\n",
1966                                 acb->host->host_no);
1967                                 return 1;
1968                         }
1969                         arcmsr_enable_outbound_ints(acb, intmask_org);
1970                 }
1971                 }
1972                 break;
1973
1974         case ACB_ADAPTER_TYPE_B: {
1975                 unsigned long post_queue_phyaddr;
1976                 uint32_t __iomem *rwbuffer;
1977
1978                 struct MessageUnit_B *reg = acb->pmuB;
1979                 uint32_t intmask_org;
1980                 intmask_org = arcmsr_disable_outbound_ints(acb);
1981                 reg->postq_index = 0;
1982                 reg->doneq_index = 0;
1983                 writel(ARCMSR_MESSAGE_SET_POST_WINDOW, reg->drv2iop_doorbell_reg);
1984                 if (arcmsr_hbb_wait_msgint_ready(acb)) {
1985                         printk(KERN_NOTICE "arcmsr%d:can not set diver mode\n", \
1986                                 acb->host->host_no);
1987                         return 1;
1988                 }
1989                 post_queue_phyaddr = cdb_phyaddr + ARCMSR_MAX_FREECCB_NUM * \
1990                 sizeof(struct CommandControlBlock) + offsetof(struct MessageUnit_B, post_qbuffer) ;
1991                 rwbuffer = reg->msgcode_rwbuffer_reg;
1992                 /* driver "set config" signature */
1993                 writel(ARCMSR_SIGNATURE_SET_CONFIG, rwbuffer++);
1994                 /* normal should be zero */
1995                 writel(ccb_phyaddr_hi32, rwbuffer++);
1996                 /* postQ size (256 + 8)*4        */
1997                 writel(post_queue_phyaddr, rwbuffer++);
1998                 /* doneQ size (256 + 8)*4        */
1999                 writel(post_queue_phyaddr + 1056, rwbuffer++);
2000                 /* ccb maxQ size must be --> [(256 + 8)*4]*/
2001                 writel(1056, rwbuffer);
2002
2003                 writel(ARCMSR_MESSAGE_SET_CONFIG, reg->drv2iop_doorbell_reg);
2004                 if (arcmsr_hbb_wait_msgint_ready(acb)) {
2005                         printk(KERN_NOTICE "arcmsr%d: 'set command Q window' \
2006                         timeout \n",acb->host->host_no);
2007                         return 1;
2008                 }
2009
2010                 writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell_reg);
2011                 if (arcmsr_hbb_wait_msgint_ready(acb)) {
2012                         printk(KERN_NOTICE "arcmsr%d: 'can not set diver mode \n"\
2013                         ,acb->host->host_no);
2014                         return 1;
2015                 }
2016                 arcmsr_enable_outbound_ints(acb, intmask_org);
2017                 }
2018                 break;
2019         }
2020         return 0;
2021 }
2022
2023 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
2024 {
2025         uint32_t firmware_state = 0;
2026
2027         switch (acb->adapter_type) {
2028
2029         case ACB_ADAPTER_TYPE_A: {
2030                 struct MessageUnit_A __iomem *reg = acb->pmuA;
2031                 do {
2032                         firmware_state = readl(&reg->outbound_msgaddr1);
2033                 } while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0);
2034                 }
2035                 break;
2036
2037         case ACB_ADAPTER_TYPE_B: {
2038                 struct MessageUnit_B *reg = acb->pmuB;
2039                 do {
2040                         firmware_state = readl(reg->iop2drv_doorbell_reg);
2041                 } while ((firmware_state & ARCMSR_MESSAGE_FIRMWARE_OK) == 0);
2042                 writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell_reg);
2043                 }
2044                 break;
2045         }
2046 }
2047
2048 static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb)
2049 {
2050         struct MessageUnit_A __iomem *reg = acb->pmuA;
2051         acb->acb_flags |= ACB_F_MSG_START_BGRB;
2052         writel(ARCMSR_INBOUND_MESG0_START_BGRB, &reg->inbound_msgaddr0);
2053         if (arcmsr_hba_wait_msgint_ready(acb)) {
2054                 printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \
2055                                 rebulid' timeout \n", acb->host->host_no);
2056         }
2057 }
2058
2059 static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb)
2060 {
2061         struct MessageUnit_B *reg = acb->pmuB;
2062         acb->acb_flags |= ACB_F_MSG_START_BGRB;
2063         writel(ARCMSR_MESSAGE_START_BGRB, reg->drv2iop_doorbell_reg);
2064         if (arcmsr_hbb_wait_msgint_ready(acb)) {
2065                 printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \
2066                                 rebulid' timeout \n",acb->host->host_no);
2067         }
2068 }
2069
2070 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
2071 {
2072         switch (acb->adapter_type) {
2073         case ACB_ADAPTER_TYPE_A:
2074                 arcmsr_start_hba_bgrb(acb);
2075                 break;
2076         case ACB_ADAPTER_TYPE_B:
2077                 arcmsr_start_hbb_bgrb(acb);
2078                 break;
2079         }
2080 }
2081
2082 static void arcmsr_clear_doorbell_queue_buffer(struct AdapterControlBlock *acb)
2083 {
2084         switch (acb->adapter_type) {
2085         case ACB_ADAPTER_TYPE_A: {
2086                 struct MessageUnit_A __iomem *reg = acb->pmuA;
2087                 uint32_t outbound_doorbell;
2088                 /* empty doorbell Qbuffer if door bell ringed */
2089                 outbound_doorbell = readl(&reg->outbound_doorbell);
2090                 /*clear doorbell interrupt */
2091                 writel(outbound_doorbell, &reg->outbound_doorbell);
2092                 writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, &reg->inbound_doorbell);
2093                 }
2094                 break;
2095
2096         case ACB_ADAPTER_TYPE_B: {
2097                 struct MessageUnit_B *reg = acb->pmuB;
2098                 /*clear interrupt and message state*/
2099                 writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell_reg);
2100                 writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell_reg);
2101                 /* let IOP know data has been read */
2102                 }
2103                 break;
2104         }
2105 }
2106
2107 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
2108 {
2109         switch (acb->adapter_type) {
2110         case ACB_ADAPTER_TYPE_A:
2111                 return;
2112         case ACB_ADAPTER_TYPE_B:
2113                 {
2114                         struct MessageUnit_B *reg = acb->pmuB;
2115                         writel(ARCMSR_MESSAGE_ACTIVE_EOI_MODE, reg->drv2iop_doorbell_reg);
2116                         if(arcmsr_hbb_wait_msgint_ready(acb)) {
2117                                 printk(KERN_NOTICE "ARCMSR IOP enables EOI_MODE TIMEOUT");
2118                                 return;
2119                         }
2120                 }
2121                 break;
2122         }
2123         return;
2124 }
2125
2126 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
2127 {
2128         uint32_t intmask_org;
2129
2130        /* disable all outbound interrupt */
2131        intmask_org = arcmsr_disable_outbound_ints(acb);
2132         arcmsr_wait_firmware_ready(acb);
2133         arcmsr_iop_confirm(acb);
2134         arcmsr_get_firmware_spec(acb);
2135         /*start background rebuild*/
2136         arcmsr_start_adapter_bgrb(acb);
2137         /* empty doorbell Qbuffer if door bell ringed */
2138         arcmsr_clear_doorbell_queue_buffer(acb);
2139         arcmsr_enable_eoi_mode(acb);
2140         /* enable outbound Post Queue,outbound doorbell Interrupt */
2141         arcmsr_enable_outbound_ints(acb, intmask_org);
2142         acb->acb_flags |= ACB_F_IOP_INITED;
2143 }
2144
2145 static void arcmsr_iop_reset(struct AdapterControlBlock *acb)
2146 {
2147         struct CommandControlBlock *ccb;
2148         uint32_t intmask_org;
2149         int i = 0;
2150
2151         if (atomic_read(&acb->ccboutstandingcount) != 0) {
2152                 /* talk to iop 331 outstanding command aborted */
2153                 arcmsr_abort_allcmd(acb);
2154
2155                 /* wait for 3 sec for all command aborted*/
2156                 ssleep(3);
2157
2158                 /* disable all outbound interrupt */
2159                 intmask_org = arcmsr_disable_outbound_ints(acb);
2160                 /* clear all outbound posted Q */
2161                 arcmsr_done4abort_postqueue(acb);
2162                 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
2163                         ccb = acb->pccb_pool[i];
2164                         if (ccb->startdone == ARCMSR_CCB_START) {
2165                                 ccb->startdone = ARCMSR_CCB_ABORTED;
2166                                 arcmsr_ccb_complete(ccb, 1);
2167                         }
2168                 }
2169                 /* enable all outbound interrupt */
2170                 arcmsr_enable_outbound_ints(acb, intmask_org);
2171         }
2172 }
2173
2174 static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
2175 {
2176         struct AdapterControlBlock *acb =
2177                 (struct AdapterControlBlock *)cmd->device->host->hostdata;
2178         int i;
2179
2180         acb->num_resets++;
2181         acb->acb_flags |= ACB_F_BUS_RESET;
2182         for (i = 0; i < 400; i++) {
2183                 if (!atomic_read(&acb->ccboutstandingcount))
2184                         break;
2185                 arcmsr_interrupt(acb);/* FIXME: need spinlock */
2186                 msleep(25);
2187         }
2188         arcmsr_iop_reset(acb);
2189         acb->acb_flags &= ~ACB_F_BUS_RESET;
2190         return SUCCESS;
2191 }
2192
2193 static void arcmsr_abort_one_cmd(struct AdapterControlBlock *acb,
2194                 struct CommandControlBlock *ccb)
2195 {
2196         u32 intmask;
2197
2198         ccb->startdone = ARCMSR_CCB_ABORTED;
2199
2200         /*
2201         ** Wait for 3 sec for all command done.
2202         */
2203         ssleep(3);
2204
2205         intmask = arcmsr_disable_outbound_ints(acb);
2206         arcmsr_polling_ccbdone(acb, ccb);
2207         arcmsr_enable_outbound_ints(acb, intmask);
2208 }
2209
2210 static int arcmsr_abort(struct scsi_cmnd *cmd)
2211 {
2212         struct AdapterControlBlock *acb =
2213                 (struct AdapterControlBlock *)cmd->device->host->hostdata;
2214         int i = 0;
2215
2216         printk(KERN_NOTICE
2217                 "arcmsr%d: abort device command of scsi id = %d lun = %d \n",
2218                 acb->host->host_no, cmd->device->id, cmd->device->lun);
2219         acb->num_aborts++;
2220         /*
2221         ************************************************
2222         ** the all interrupt service routine is locked
2223         ** we need to handle it as soon as possible and exit
2224         ************************************************
2225         */
2226         if (!atomic_read(&acb->ccboutstandingcount))
2227                 return SUCCESS;
2228
2229         for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
2230                 struct CommandControlBlock *ccb = acb->pccb_pool[i];
2231                 if (ccb->startdone == ARCMSR_CCB_START && ccb->pcmd == cmd) {
2232                         arcmsr_abort_one_cmd(acb, ccb);
2233                         break;
2234                 }
2235         }
2236
2237         return SUCCESS;
2238 }
2239
2240 static const char *arcmsr_info(struct Scsi_Host *host)
2241 {
2242         struct AdapterControlBlock *acb =
2243                 (struct AdapterControlBlock *) host->hostdata;
2244         static char buf[256];
2245         char *type;
2246         int raid6 = 1;
2247
2248         switch (acb->pdev->device) {
2249         case PCI_DEVICE_ID_ARECA_1110:
2250         case PCI_DEVICE_ID_ARECA_1200:
2251         case PCI_DEVICE_ID_ARECA_1202:
2252         case PCI_DEVICE_ID_ARECA_1210:
2253                 raid6 = 0;
2254                 /*FALLTHRU*/
2255         case PCI_DEVICE_ID_ARECA_1120:
2256         case PCI_DEVICE_ID_ARECA_1130:
2257         case PCI_DEVICE_ID_ARECA_1160:
2258         case PCI_DEVICE_ID_ARECA_1170:
2259         case PCI_DEVICE_ID_ARECA_1201:
2260         case PCI_DEVICE_ID_ARECA_1220:
2261         case PCI_DEVICE_ID_ARECA_1230:
2262         case PCI_DEVICE_ID_ARECA_1260:
2263         case PCI_DEVICE_ID_ARECA_1270:
2264         case PCI_DEVICE_ID_ARECA_1280:
2265                 type = "SATA";
2266                 break;
2267         case PCI_DEVICE_ID_ARECA_1380:
2268         case PCI_DEVICE_ID_ARECA_1381:
2269         case PCI_DEVICE_ID_ARECA_1680:
2270         case PCI_DEVICE_ID_ARECA_1681:
2271                 type = "SAS";
2272                 break;
2273         default:
2274                 type = "X-TYPE";
2275                 break;
2276         }
2277         sprintf(buf, "Areca %s Host Adapter RAID Controller%s\n %s",
2278                         type, raid6 ? "( RAID6 capable)" : "",
2279                         ARCMSR_DRIVER_VERSION);
2280         return buf;
2281 }
2282 #ifdef CONFIG_SCSI_ARCMSR_AER
2283 static pci_ers_result_t arcmsr_pci_slot_reset(struct pci_dev *pdev)
2284 {
2285         struct Scsi_Host *host = pci_get_drvdata(pdev);
2286         struct AdapterControlBlock *acb =
2287                 (struct AdapterControlBlock *) host->hostdata;
2288         uint32_t intmask_org;
2289         int i, j;
2290
2291         if (pci_enable_device(pdev)) {
2292                 return PCI_ERS_RESULT_DISCONNECT;
2293         }
2294         pci_set_master(pdev);
2295         intmask_org = arcmsr_disable_outbound_ints(acb);
2296         acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED |
2297                            ACB_F_MESSAGE_RQBUFFER_CLEARED |
2298                            ACB_F_MESSAGE_WQBUFFER_READED);
2299         acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
2300         for (i = 0; i < ARCMSR_MAX_TARGETID; i++)
2301                 for (j = 0; j < ARCMSR_MAX_TARGETLUN; j++)
2302                         acb->devstate[i][j] = ARECA_RAID_GONE;
2303
2304         arcmsr_wait_firmware_ready(acb);
2305         arcmsr_iop_confirm(acb);
2306        /* disable all outbound interrupt */
2307         arcmsr_get_firmware_spec(acb);
2308         /*start background rebuild*/
2309         arcmsr_start_adapter_bgrb(acb);
2310         /* empty doorbell Qbuffer if door bell ringed */
2311         arcmsr_clear_doorbell_queue_buffer(acb);
2312         arcmsr_enable_eoi_mode(acb);
2313         /* enable outbound Post Queue,outbound doorbell Interrupt */
2314         arcmsr_enable_outbound_ints(acb, intmask_org);
2315         acb->acb_flags |= ACB_F_IOP_INITED;
2316
2317         pci_enable_pcie_error_reporting(pdev);
2318         return PCI_ERS_RESULT_RECOVERED;
2319 }
2320
2321 static void arcmsr_pci_ers_need_reset_forepart(struct pci_dev *pdev)
2322 {
2323         struct Scsi_Host *host = pci_get_drvdata(pdev);
2324         struct AdapterControlBlock *acb = (struct AdapterControlBlock *)host->hostdata;
2325         struct CommandControlBlock *ccb;
2326         uint32_t intmask_org;
2327         int i = 0;
2328
2329         if (atomic_read(&acb->ccboutstandingcount) != 0) {
2330                 /* talk to iop 331 outstanding command aborted */
2331                 arcmsr_abort_allcmd(acb);
2332                 /* wait for 3 sec for all command aborted*/
2333                 ssleep(3);
2334                 /* disable all outbound interrupt */
2335                 intmask_org = arcmsr_disable_outbound_ints(acb);
2336                 /* clear all outbound posted Q */
2337                 arcmsr_done4abort_postqueue(acb);
2338                 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
2339                         ccb = acb->pccb_pool[i];
2340                         if (ccb->startdone == ARCMSR_CCB_START) {
2341                                 ccb->startdone = ARCMSR_CCB_ABORTED;
2342                                 arcmsr_ccb_complete(ccb, 1);
2343                         }
2344                 }
2345                 /* enable all outbound interrupt */
2346                 arcmsr_enable_outbound_ints(acb, intmask_org);
2347         }
2348         pci_disable_device(pdev);
2349 }
2350
2351 static void arcmsr_pci_ers_disconnect_forepart(struct pci_dev *pdev)
2352 {
2353                         struct Scsi_Host *host = pci_get_drvdata(pdev);
2354                         struct AdapterControlBlock *acb = \
2355                                 (struct AdapterControlBlock *)host->hostdata;
2356
2357                         arcmsr_stop_adapter_bgrb(acb);
2358                         arcmsr_flush_adapter_cache(acb);
2359 }
2360
2361 static pci_ers_result_t arcmsr_pci_error_detected(struct pci_dev *pdev,
2362                                                 pci_channel_state_t state)
2363 {
2364         switch (state) {
2365         case pci_channel_io_frozen:
2366                         arcmsr_pci_ers_need_reset_forepart(pdev);
2367                         return PCI_ERS_RESULT_NEED_RESET;
2368         case pci_channel_io_perm_failure:
2369                         arcmsr_pci_ers_disconnect_forepart(pdev);
2370                         return PCI_ERS_RESULT_DISCONNECT;
2371                         break;
2372         default:
2373                         return PCI_ERS_RESULT_NEED_RESET;
2374           }
2375 }
2376 #endif