Merge remote-tracking branch 'lsk/v3.10/topic/gator' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / aacraid / src.c
1 /*
2  *      Adaptec AAC series RAID controller driver
3  *      (c) Copyright 2001 Red Hat Inc.
4  *
5  * based on the old aacraid driver that is..
6  * Adaptec aacraid device driver for Linux.
7  *
8  * Copyright (c) 2000-2010 Adaptec, Inc.
9  *               2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2, or (at your option)
14  * any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; see the file COPYING.  If not, write to
23  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  * Module Name:
26  *  src.c
27  *
28  * Abstract: Hardware Device Interface for PMC SRC based controllers
29  *
30  */
31
32 #include <linux/kernel.h>
33 #include <linux/init.h>
34 #include <linux/types.h>
35 #include <linux/pci.h>
36 #include <linux/spinlock.h>
37 #include <linux/slab.h>
38 #include <linux/blkdev.h>
39 #include <linux/delay.h>
40 #include <linux/completion.h>
41 #include <linux/time.h>
42 #include <linux/interrupt.h>
43 #include <scsi/scsi_host.h>
44
45 #include "aacraid.h"
46
47 static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
48 {
49         struct aac_dev *dev = dev_id;
50         unsigned long bellbits, bellbits_shifted;
51         int our_interrupt = 0;
52         int isFastResponse;
53         u32 index, handle;
54
55         bellbits = src_readl(dev, MUnit.ODR_R);
56         if (bellbits & PmDoorBellResponseSent) {
57                 bellbits = PmDoorBellResponseSent;
58                 /* handle async. status */
59                 src_writel(dev, MUnit.ODR_C, bellbits);
60                 src_readl(dev, MUnit.ODR_C);
61                 our_interrupt = 1;
62                 index = dev->host_rrq_idx;
63                 for (;;) {
64                         isFastResponse = 0;
65                         /* remove toggle bit (31) */
66                         handle = le32_to_cpu(dev->host_rrq[index]) & 0x7fffffff;
67                         /* check fast response bit (30) */
68                         if (handle & 0x40000000)
69                                 isFastResponse = 1;
70                         handle &= 0x0000ffff;
71                         if (handle == 0)
72                                 break;
73
74                         aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
75
76                         dev->host_rrq[index++] = 0;
77                         if (index == dev->scsi_host_ptr->can_queue +
78                                                 AAC_NUM_MGT_FIB)
79                                 index = 0;
80                         dev->host_rrq_idx = index;
81                 }
82         } else {
83                 bellbits_shifted = (bellbits >> SRC_ODR_SHIFT);
84                 if (bellbits_shifted & DoorBellAifPending) {
85                         src_writel(dev, MUnit.ODR_C, bellbits);
86                         src_readl(dev, MUnit.ODR_C);
87                         our_interrupt = 1;
88                         /* handle AIF */
89                         aac_intr_normal(dev, 0, 2, 0, NULL);
90                 } else if (bellbits_shifted & OUTBOUNDDOORBELL_0) {
91                         unsigned long sflags;
92                         struct list_head *entry;
93                         int send_it = 0;
94                         extern int aac_sync_mode;
95
96                         src_writel(dev, MUnit.ODR_C, bellbits);
97                         src_readl(dev, MUnit.ODR_C);
98
99                         if (!aac_sync_mode) {
100                                 src_writel(dev, MUnit.ODR_C, bellbits);
101                                 src_readl(dev, MUnit.ODR_C);
102                                 our_interrupt = 1;
103                         }
104
105                         if (dev->sync_fib) {
106                                 our_interrupt = 1;
107                                 if (dev->sync_fib->callback)
108                                         dev->sync_fib->callback(dev->sync_fib->callback_data,
109                                                 dev->sync_fib);
110                                 spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
111                                 if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
112                                         dev->management_fib_count--;
113                                         up(&dev->sync_fib->event_wait);
114                                 }
115                                 spin_unlock_irqrestore(&dev->sync_fib->event_lock, sflags);
116                                 spin_lock_irqsave(&dev->sync_lock, sflags);
117                                 if (!list_empty(&dev->sync_fib_list)) {
118                                         entry = dev->sync_fib_list.next;
119                                         dev->sync_fib = list_entry(entry, struct fib, fiblink);
120                                         list_del(entry);
121                                         send_it = 1;
122                                 } else {
123                                         dev->sync_fib = NULL;
124                                 }
125                                 spin_unlock_irqrestore(&dev->sync_lock, sflags);
126                                 if (send_it) {
127                                         aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
128                                                 (u32)dev->sync_fib->hw_fib_pa, 0, 0, 0, 0, 0,
129                                                 NULL, NULL, NULL, NULL, NULL);
130                                 }
131                         }
132                 }
133         }
134
135         if (our_interrupt) {
136                 return IRQ_HANDLED;
137         }
138         return IRQ_NONE;
139 }
140
141 /**
142  *      aac_src_disable_interrupt       -       Disable interrupts
143  *      @dev: Adapter
144  */
145
146 static void aac_src_disable_interrupt(struct aac_dev *dev)
147 {
148         src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
149 }
150
151 /**
152  *      aac_src_enable_interrupt_message        -       Enable interrupts
153  *      @dev: Adapter
154  */
155
156 static void aac_src_enable_interrupt_message(struct aac_dev *dev)
157 {
158         src_writel(dev, MUnit.OIMR, dev->OIMR = 0xfffffff8);
159 }
160
161 /**
162  *      src_sync_cmd    -       send a command and wait
163  *      @dev: Adapter
164  *      @command: Command to execute
165  *      @p1: first parameter
166  *      @ret: adapter status
167  *
168  *      This routine will send a synchronous command to the adapter and wait
169  *      for its completion.
170  */
171
172 static int src_sync_cmd(struct aac_dev *dev, u32 command,
173         u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
174         u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
175 {
176         unsigned long start;
177         int ok;
178
179         /*
180          *      Write the command into Mailbox 0
181          */
182         writel(command, &dev->IndexRegs->Mailbox[0]);
183         /*
184          *      Write the parameters into Mailboxes 1 - 6
185          */
186         writel(p1, &dev->IndexRegs->Mailbox[1]);
187         writel(p2, &dev->IndexRegs->Mailbox[2]);
188         writel(p3, &dev->IndexRegs->Mailbox[3]);
189         writel(p4, &dev->IndexRegs->Mailbox[4]);
190
191         /*
192          *      Clear the synch command doorbell to start on a clean slate.
193          */
194         src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
195
196         /*
197          *      Disable doorbell interrupts
198          */
199         src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
200
201         /*
202          *      Force the completion of the mask register write before issuing
203          *      the interrupt.
204          */
205         src_readl(dev, MUnit.OIMR);
206
207         /*
208          *      Signal that there is a new synch command
209          */
210         src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
211
212         if (!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) {
213                 ok = 0;
214                 start = jiffies;
215
216                 /*
217                  *      Wait up to 5 minutes
218                  */
219                 while (time_before(jiffies, start+300*HZ)) {
220                         udelay(5);      /* Delay 5 microseconds to let Mon960 get info. */
221                         /*
222                          *      Mon960 will set doorbell0 bit when it has completed the command.
223                          */
224                         if ((src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT) & OUTBOUNDDOORBELL_0) {
225                                 /*
226                                  *      Clear the doorbell.
227                                  */
228                                 src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
229                                 ok = 1;
230                                 break;
231                         }
232                         /*
233                          *      Yield the processor in case we are slow
234                          */
235                         msleep(1);
236                 }
237                 if (unlikely(ok != 1)) {
238                         /*
239                          *      Restore interrupt mask even though we timed out
240                          */
241                         aac_adapter_enable_int(dev);
242                         return -ETIMEDOUT;
243                 }
244                 /*
245                  *      Pull the synch status from Mailbox 0.
246                  */
247                 if (status)
248                         *status = readl(&dev->IndexRegs->Mailbox[0]);
249                 if (r1)
250                         *r1 = readl(&dev->IndexRegs->Mailbox[1]);
251                 if (r2)
252                         *r2 = readl(&dev->IndexRegs->Mailbox[2]);
253                 if (r3)
254                         *r3 = readl(&dev->IndexRegs->Mailbox[3]);
255                 if (r4)
256                         *r4 = readl(&dev->IndexRegs->Mailbox[4]);
257
258                 /*
259                  *      Clear the synch command doorbell.
260                  */
261                 src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
262         }
263
264         /*
265          *      Restore interrupt mask
266          */
267         aac_adapter_enable_int(dev);
268         return 0;
269 }
270
271 /**
272  *      aac_src_interrupt_adapter       -       interrupt adapter
273  *      @dev: Adapter
274  *
275  *      Send an interrupt to the i960 and breakpoint it.
276  */
277
278 static void aac_src_interrupt_adapter(struct aac_dev *dev)
279 {
280         src_sync_cmd(dev, BREAKPOINT_REQUEST,
281                 0, 0, 0, 0, 0, 0,
282                 NULL, NULL, NULL, NULL, NULL);
283 }
284
285 /**
286  *      aac_src_notify_adapter          -       send an event to the adapter
287  *      @dev: Adapter
288  *      @event: Event to send
289  *
290  *      Notify the i960 that something it probably cares about has
291  *      happened.
292  */
293
294 static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
295 {
296         switch (event) {
297
298         case AdapNormCmdQue:
299                 src_writel(dev, MUnit.ODR_C,
300                         INBOUNDDOORBELL_1 << SRC_ODR_SHIFT);
301                 break;
302         case HostNormRespNotFull:
303                 src_writel(dev, MUnit.ODR_C,
304                         INBOUNDDOORBELL_4 << SRC_ODR_SHIFT);
305                 break;
306         case AdapNormRespQue:
307                 src_writel(dev, MUnit.ODR_C,
308                         INBOUNDDOORBELL_2 << SRC_ODR_SHIFT);
309                 break;
310         case HostNormCmdNotFull:
311                 src_writel(dev, MUnit.ODR_C,
312                         INBOUNDDOORBELL_3 << SRC_ODR_SHIFT);
313                 break;
314         case FastIo:
315                 src_writel(dev, MUnit.ODR_C,
316                         INBOUNDDOORBELL_6 << SRC_ODR_SHIFT);
317                 break;
318         case AdapPrintfDone:
319                 src_writel(dev, MUnit.ODR_C,
320                         INBOUNDDOORBELL_5 << SRC_ODR_SHIFT);
321                 break;
322         default:
323                 BUG();
324                 break;
325         }
326 }
327
328 /**
329  *      aac_src_start_adapter           -       activate adapter
330  *      @dev:   Adapter
331  *
332  *      Start up processing on an i960 based AAC adapter
333  */
334
335 static void aac_src_start_adapter(struct aac_dev *dev)
336 {
337         struct aac_init *init;
338
339          /* reset host_rrq_idx first */
340         dev->host_rrq_idx = 0;
341
342         init = dev->init;
343         init->HostElapsedSeconds = cpu_to_le32(get_seconds());
344
345         /* We can only use a 32 bit address here */
346         src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
347           0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
348 }
349
350 /**
351  *      aac_src_check_health
352  *      @dev: device to check if healthy
353  *
354  *      Will attempt to determine if the specified adapter is alive and
355  *      capable of handling requests, returning 0 if alive.
356  */
357 static int aac_src_check_health(struct aac_dev *dev)
358 {
359         u32 status = src_readl(dev, MUnit.OMR);
360
361         /*
362          *      Check to see if the board failed any self tests.
363          */
364         if (unlikely(status & SELF_TEST_FAILED))
365                 return -1;
366
367         /*
368          *      Check to see if the board panic'd.
369          */
370         if (unlikely(status & KERNEL_PANIC))
371                 return (status >> 16) & 0xFF;
372         /*
373          *      Wait for the adapter to be up and running.
374          */
375         if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
376                 return -3;
377         /*
378          *      Everything is OK
379          */
380         return 0;
381 }
382
383 /**
384  *      aac_src_deliver_message
385  *      @fib: fib to issue
386  *
387  *      Will send a fib, returning 0 if successful.
388  */
389 static int aac_src_deliver_message(struct fib *fib)
390 {
391         struct aac_dev *dev = fib->dev;
392         struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
393         unsigned long qflags;
394         u32 fibsize;
395         dma_addr_t address;
396         struct aac_fib_xporthdr *pFibX;
397         u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
398
399         spin_lock_irqsave(q->lock, qflags);
400         q->numpending++;
401         spin_unlock_irqrestore(q->lock, qflags);
402
403         if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) {
404                 /* Calculate the amount to the fibsize bits */
405                 fibsize = (hdr_size + 127) / 128 - 1;
406                 if (fibsize > (ALIGN32 - 1))
407                         return -EMSGSIZE;
408                 /* New FIB header, 32-bit */
409                 address = fib->hw_fib_pa;
410                 fib->hw_fib_va->header.StructType = FIB_MAGIC2;
411                 fib->hw_fib_va->header.SenderFibAddress = (u32)address;
412                 fib->hw_fib_va->header.u.TimeStamp = 0;
413                 BUG_ON(upper_32_bits(address) != 0L);
414                 address |= fibsize;
415         } else {
416                 /* Calculate the amount to the fibsize bits */
417                 fibsize = (sizeof(struct aac_fib_xporthdr) + hdr_size + 127) / 128 - 1;
418                 if (fibsize > (ALIGN32 - 1))
419                         return -EMSGSIZE;
420
421                 /* Fill XPORT header */
422                 pFibX = (void *)fib->hw_fib_va - sizeof(struct aac_fib_xporthdr);
423                 pFibX->Handle = cpu_to_le32(fib->hw_fib_va->header.Handle);
424                 pFibX->HostAddress = cpu_to_le64(fib->hw_fib_pa);
425                 pFibX->Size = cpu_to_le32(hdr_size);
426
427                 /*
428                  * The xport header has been 32-byte aligned for us so that fibsize
429                  * can be masked out of this address by hardware. -- BenC
430                  */
431                 address = fib->hw_fib_pa - sizeof(struct aac_fib_xporthdr);
432                 if (address & (ALIGN32 - 1))
433                         return -EINVAL;
434                 address |= fibsize;
435         }
436
437         src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
438         src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
439
440         return 0;
441 }
442
443 /**
444  *      aac_src_ioremap
445  *      @size: mapping resize request
446  *
447  */
448 static int aac_src_ioremap(struct aac_dev *dev, u32 size)
449 {
450         if (!size) {
451                 iounmap(dev->regs.src.bar1);
452                 dev->regs.src.bar1 = NULL;
453                 iounmap(dev->regs.src.bar0);
454                 dev->base = dev->regs.src.bar0 = NULL;
455                 return 0;
456         }
457         dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
458                 AAC_MIN_SRC_BAR1_SIZE);
459         dev->base = NULL;
460         if (dev->regs.src.bar1 == NULL)
461                 return -1;
462         dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
463         if (dev->base == NULL) {
464                 iounmap(dev->regs.src.bar1);
465                 dev->regs.src.bar1 = NULL;
466                 return -1;
467         }
468         dev->IndexRegs = &((struct src_registers __iomem *)
469                 dev->base)->u.tupelo.IndexRegs;
470         return 0;
471 }
472
473 /**
474  *  aac_srcv_ioremap
475  *      @size: mapping resize request
476  *
477  */
478 static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
479 {
480         if (!size) {
481                 iounmap(dev->regs.src.bar0);
482                 dev->base = dev->regs.src.bar0 = NULL;
483                 return 0;
484         }
485         dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
486         if (dev->base == NULL)
487                 return -1;
488         dev->IndexRegs = &((struct src_registers __iomem *)
489                 dev->base)->u.denali.IndexRegs;
490         return 0;
491 }
492
493 static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
494 {
495         u32 var, reset_mask;
496
497         if (bled >= 0) {
498                 if (bled)
499                         printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n",
500                                 dev->name, dev->id, bled);
501                 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
502                         0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
503                         if (bled || (var != 0x00000001))
504                                 return -EINVAL;
505                 if (dev->supplement_adapter_info.SupportedOptions2 &
506                         AAC_OPTION_DOORBELL_RESET) {
507                         src_writel(dev, MUnit.IDR, reset_mask);
508                         msleep(5000); /* Delay 5 seconds */
509                 }
510         }
511
512         if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
513                 return -ENODEV;
514
515         if (startup_timeout < 300)
516                 startup_timeout = 300;
517
518         return 0;
519 }
520
521 /**
522  *      aac_src_select_comm     -       Select communications method
523  *      @dev: Adapter
524  *      @comm: communications method
525  */
526 int aac_src_select_comm(struct aac_dev *dev, int comm)
527 {
528         switch (comm) {
529         case AAC_COMM_MESSAGE:
530                 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
531                 dev->a_ops.adapter_intr = aac_src_intr_message;
532                 dev->a_ops.adapter_deliver = aac_src_deliver_message;
533                 break;
534         default:
535                 return 1;
536         }
537         return 0;
538 }
539
540 /**
541  *  aac_src_init        -       initialize an Cardinal Frey Bar card
542  *  @dev: device to configure
543  *
544  */
545
546 int aac_src_init(struct aac_dev *dev)
547 {
548         unsigned long start;
549         unsigned long status;
550         int restart = 0;
551         int instance = dev->id;
552         const char *name = dev->name;
553
554         dev->a_ops.adapter_ioremap = aac_src_ioremap;
555         dev->a_ops.adapter_comm = aac_src_select_comm;
556
557         dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
558         if (aac_adapter_ioremap(dev, dev->base_size)) {
559                 printk(KERN_WARNING "%s: unable to map adapter.\n", name);
560                 goto error_iounmap;
561         }
562
563         /* Failure to reset here is an option ... */
564         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
565         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
566         if ((aac_reset_devices || reset_devices) &&
567                 !aac_src_restart_adapter(dev, 0))
568                 ++restart;
569         /*
570          *      Check to see if the board panic'd while booting.
571          */
572         status = src_readl(dev, MUnit.OMR);
573         if (status & KERNEL_PANIC) {
574                 if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
575                         goto error_iounmap;
576                 ++restart;
577         }
578         /*
579          *      Check to see if the board failed any self tests.
580          */
581         status = src_readl(dev, MUnit.OMR);
582         if (status & SELF_TEST_FAILED) {
583                 printk(KERN_ERR "%s%d: adapter self-test failed.\n",
584                         dev->name, instance);
585                 goto error_iounmap;
586         }
587         /*
588          *      Check to see if the monitor panic'd while booting.
589          */
590         if (status & MONITOR_PANIC) {
591                 printk(KERN_ERR "%s%d: adapter monitor panic.\n",
592                         dev->name, instance);
593                 goto error_iounmap;
594         }
595         start = jiffies;
596         /*
597          *      Wait for the adapter to be up and running. Wait up to 3 minutes
598          */
599         while (!((status = src_readl(dev, MUnit.OMR)) &
600                 KERNEL_UP_AND_RUNNING)) {
601                 if ((restart &&
602                   (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
603                   time_after(jiffies, start+HZ*startup_timeout)) {
604                         printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
605                                         dev->name, instance, status);
606                         goto error_iounmap;
607                 }
608                 if (!restart &&
609                   ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
610                   time_after(jiffies, start + HZ *
611                   ((startup_timeout > 60)
612                     ? (startup_timeout - 60)
613                     : (startup_timeout / 2))))) {
614                         if (likely(!aac_src_restart_adapter(dev,
615                             aac_src_check_health(dev))))
616                                 start = jiffies;
617                         ++restart;
618                 }
619                 msleep(1);
620         }
621         if (restart && aac_commit)
622                 aac_commit = 1;
623         /*
624          *      Fill in the common function dispatch table.
625          */
626         dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
627         dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
628         dev->a_ops.adapter_notify = aac_src_notify_adapter;
629         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
630         dev->a_ops.adapter_check_health = aac_src_check_health;
631         dev->a_ops.adapter_restart = aac_src_restart_adapter;
632
633         /*
634          *      First clear out all interrupts.  Then enable the one's that we
635          *      can handle.
636          */
637         aac_adapter_comm(dev, AAC_COMM_MESSAGE);
638         aac_adapter_disable_int(dev);
639         src_writel(dev, MUnit.ODR_C, 0xffffffff);
640         aac_adapter_enable_int(dev);
641
642         if (aac_init_adapter(dev) == NULL)
643                 goto error_iounmap;
644         if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
645                 goto error_iounmap;
646
647         dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
648
649         if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
650                         IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
651
652                 if (dev->msi)
653                         pci_disable_msi(dev->pdev);
654
655                 printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
656                         name, instance);
657                 goto error_iounmap;
658         }
659         dev->dbg_base = pci_resource_start(dev->pdev, 2);
660         dev->dbg_base_mapped = dev->regs.src.bar1;
661         dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
662
663         aac_adapter_enable_int(dev);
664
665         if (!dev->sync_mode) {
666                 /*
667                  * Tell the adapter that all is configured, and it can
668                  * start accepting requests
669                  */
670                 aac_src_start_adapter(dev);
671         }
672         return 0;
673
674 error_iounmap:
675
676         return -1;
677 }
678
679 /**
680  *  aac_srcv_init       -       initialize an SRCv card
681  *  @dev: device to configure
682  *
683  */
684
685 int aac_srcv_init(struct aac_dev *dev)
686 {
687         unsigned long start;
688         unsigned long status;
689         int restart = 0;
690         int instance = dev->id;
691         const char *name = dev->name;
692
693         dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
694         dev->a_ops.adapter_comm = aac_src_select_comm;
695
696         dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
697         if (aac_adapter_ioremap(dev, dev->base_size)) {
698                 printk(KERN_WARNING "%s: unable to map adapter.\n", name);
699                 goto error_iounmap;
700         }
701
702         /* Failure to reset here is an option ... */
703         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
704         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
705         if ((aac_reset_devices || reset_devices) &&
706                 !aac_src_restart_adapter(dev, 0))
707                 ++restart;
708         /*
709          *      Check to see if flash update is running.
710          *      Wait for the adapter to be up and running. Wait up to 5 minutes
711          */
712         status = src_readl(dev, MUnit.OMR);
713         if (status & FLASH_UPD_PENDING) {
714                 start = jiffies;
715                 do {
716                         status = src_readl(dev, MUnit.OMR);
717                         if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) {
718                                 printk(KERN_ERR "%s%d: adapter flash update failed.\n",
719                                         dev->name, instance);
720                                 goto error_iounmap;
721                         }
722                 } while (!(status & FLASH_UPD_SUCCESS) &&
723                          !(status & FLASH_UPD_FAILED));
724                 /* Delay 10 seconds.
725                  * Because right now FW is doing a soft reset,
726                  * do not read scratch pad register at this time
727                  */
728                 ssleep(10);
729         }
730         /*
731          *      Check to see if the board panic'd while booting.
732          */
733         status = src_readl(dev, MUnit.OMR);
734         if (status & KERNEL_PANIC) {
735                 if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
736                         goto error_iounmap;
737                 ++restart;
738         }
739         /*
740          *      Check to see if the board failed any self tests.
741          */
742         status = src_readl(dev, MUnit.OMR);
743         if (status & SELF_TEST_FAILED) {
744                 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
745                 goto error_iounmap;
746         }
747         /*
748          *      Check to see if the monitor panic'd while booting.
749          */
750         if (status & MONITOR_PANIC) {
751                 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
752                 goto error_iounmap;
753         }
754         start = jiffies;
755         /*
756          *      Wait for the adapter to be up and running. Wait up to 3 minutes
757          */
758         while (!((status = src_readl(dev, MUnit.OMR)) &
759                 KERNEL_UP_AND_RUNNING) ||
760                 status == 0xffffffff) {
761                 if ((restart &&
762                   (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
763                   time_after(jiffies, start+HZ*startup_timeout)) {
764                         printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
765                                         dev->name, instance, status);
766                         goto error_iounmap;
767                 }
768                 if (!restart &&
769                   ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
770                   time_after(jiffies, start + HZ *
771                   ((startup_timeout > 60)
772                     ? (startup_timeout - 60)
773                     : (startup_timeout / 2))))) {
774                         if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev))))
775                                 start = jiffies;
776                         ++restart;
777                 }
778                 msleep(1);
779         }
780         if (restart && aac_commit)
781                 aac_commit = 1;
782         /*
783          *      Fill in the common function dispatch table.
784          */
785         dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
786         dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
787         dev->a_ops.adapter_notify = aac_src_notify_adapter;
788         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
789         dev->a_ops.adapter_check_health = aac_src_check_health;
790         dev->a_ops.adapter_restart = aac_src_restart_adapter;
791
792         /*
793          *      First clear out all interrupts.  Then enable the one's that we
794          *      can handle.
795          */
796         aac_adapter_comm(dev, AAC_COMM_MESSAGE);
797         aac_adapter_disable_int(dev);
798         src_writel(dev, MUnit.ODR_C, 0xffffffff);
799         aac_adapter_enable_int(dev);
800
801         if (aac_init_adapter(dev) == NULL)
802                 goto error_iounmap;
803         if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2)
804                 goto error_iounmap;
805         dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
806         if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
807                 IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
808                 if (dev->msi)
809                         pci_disable_msi(dev->pdev);
810                 printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
811                         name, instance);
812                 goto error_iounmap;
813         }
814         dev->dbg_base = dev->base_start;
815         dev->dbg_base_mapped = dev->base;
816         dev->dbg_size = dev->base_size;
817
818         aac_adapter_enable_int(dev);
819
820         if (!dev->sync_mode) {
821                 /*
822                  * Tell the adapter that all is configured, and it can
823                  * start accepting requests
824                  */
825                 aac_src_start_adapter(dev);
826         }
827         return 0;
828
829 error_iounmap:
830
831         return -1;
832 }
833