thermal: rockchip: rk3368: ajust tsadc's data path according request of qos
[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 int aac_src_get_sync_status(struct aac_dev *dev);
48
49 static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
50 {
51         struct aac_msix_ctx *ctx;
52         struct aac_dev *dev;
53         unsigned long bellbits, bellbits_shifted;
54         int vector_no;
55         int isFastResponse, mode;
56         u32 index, handle;
57
58         ctx = (struct aac_msix_ctx *)dev_id;
59         dev = ctx->dev;
60         vector_no = ctx->vector_no;
61
62         if (dev->msi_enabled) {
63                 mode = AAC_INT_MODE_MSI;
64                 if (vector_no == 0) {
65                         bellbits = src_readl(dev, MUnit.ODR_MSI);
66                         if (bellbits & 0x40000)
67                                 mode |= AAC_INT_MODE_AIF;
68                         if (bellbits & 0x1000)
69                                 mode |= AAC_INT_MODE_SYNC;
70                 }
71         } else {
72                 mode = AAC_INT_MODE_INTX;
73                 bellbits = src_readl(dev, MUnit.ODR_R);
74                 if (bellbits & PmDoorBellResponseSent) {
75                         bellbits = PmDoorBellResponseSent;
76                         src_writel(dev, MUnit.ODR_C, bellbits);
77                         src_readl(dev, MUnit.ODR_C);
78                 } else {
79                         bellbits_shifted = (bellbits >> SRC_ODR_SHIFT);
80                         src_writel(dev, MUnit.ODR_C, bellbits);
81                         src_readl(dev, MUnit.ODR_C);
82
83                         if (bellbits_shifted & DoorBellAifPending)
84                                 mode |= AAC_INT_MODE_AIF;
85                         else if (bellbits_shifted & OUTBOUNDDOORBELL_0)
86                                 mode |= AAC_INT_MODE_SYNC;
87                 }
88         }
89
90         if (mode & AAC_INT_MODE_SYNC) {
91                 unsigned long sflags;
92                 struct list_head *entry;
93                 int send_it = 0;
94                 extern int aac_sync_mode;
95
96                 if (!aac_sync_mode && !dev->msi_enabled) {
97                         src_writel(dev, MUnit.ODR_C, bellbits);
98                         src_readl(dev, MUnit.ODR_C);
99                 }
100
101                 if (dev->sync_fib) {
102                         if (dev->sync_fib->callback)
103                                 dev->sync_fib->callback(dev->sync_fib->callback_data,
104                                         dev->sync_fib);
105                         spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
106                         if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
107                                 dev->management_fib_count--;
108                                 up(&dev->sync_fib->event_wait);
109                         }
110                         spin_unlock_irqrestore(&dev->sync_fib->event_lock,
111                                                 sflags);
112                         spin_lock_irqsave(&dev->sync_lock, sflags);
113                         if (!list_empty(&dev->sync_fib_list)) {
114                                 entry = dev->sync_fib_list.next;
115                                 dev->sync_fib = list_entry(entry,
116                                                            struct fib,
117                                                            fiblink);
118                                 list_del(entry);
119                                 send_it = 1;
120                         } else {
121                                 dev->sync_fib = NULL;
122                         }
123                         spin_unlock_irqrestore(&dev->sync_lock, sflags);
124                         if (send_it) {
125                                 aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
126                                         (u32)dev->sync_fib->hw_fib_pa,
127                                         0, 0, 0, 0, 0,
128                                         NULL, NULL, NULL, NULL, NULL);
129                         }
130                 }
131                 if (!dev->msi_enabled)
132                         mode = 0;
133
134         }
135
136         if (mode & AAC_INT_MODE_AIF) {
137                 /* handle AIF */
138                 aac_intr_normal(dev, 0, 2, 0, NULL);
139                 if (dev->msi_enabled)
140                         aac_src_access_devreg(dev, AAC_CLEAR_AIF_BIT);
141                 mode = 0;
142         }
143
144         if (mode) {
145                 index = dev->host_rrq_idx[vector_no];
146
147                 for (;;) {
148                         isFastResponse = 0;
149                         /* remove toggle bit (31) */
150                         handle = (dev->host_rrq[index] & 0x7fffffff);
151                         /* check fast response bit (30) */
152                         if (handle & 0x40000000)
153                                 isFastResponse = 1;
154                         handle &= 0x0000ffff;
155                         if (handle == 0)
156                                 break;
157                         if (dev->msi_enabled && dev->max_msix > 1)
158                                 atomic_dec(&dev->rrq_outstanding[vector_no]);
159                         dev->host_rrq[index++] = 0;
160                         aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
161                         if (index == (vector_no + 1) * dev->vector_cap)
162                                 index = vector_no * dev->vector_cap;
163                         dev->host_rrq_idx[vector_no] = index;
164                 }
165                 mode = 0;
166         }
167
168         return IRQ_HANDLED;
169 }
170
171 /**
172  *      aac_src_disable_interrupt       -       Disable interrupts
173  *      @dev: Adapter
174  */
175
176 static void aac_src_disable_interrupt(struct aac_dev *dev)
177 {
178         src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
179 }
180
181 /**
182  *      aac_src_enable_interrupt_message        -       Enable interrupts
183  *      @dev: Adapter
184  */
185
186 static void aac_src_enable_interrupt_message(struct aac_dev *dev)
187 {
188         aac_src_access_devreg(dev, AAC_ENABLE_INTERRUPT);
189 }
190
191 /**
192  *      src_sync_cmd    -       send a command and wait
193  *      @dev: Adapter
194  *      @command: Command to execute
195  *      @p1: first parameter
196  *      @ret: adapter status
197  *
198  *      This routine will send a synchronous command to the adapter and wait
199  *      for its completion.
200  */
201
202 static int src_sync_cmd(struct aac_dev *dev, u32 command,
203         u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
204         u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
205 {
206         unsigned long start;
207         unsigned long delay;
208         int ok;
209
210         /*
211          *      Write the command into Mailbox 0
212          */
213         writel(command, &dev->IndexRegs->Mailbox[0]);
214         /*
215          *      Write the parameters into Mailboxes 1 - 6
216          */
217         writel(p1, &dev->IndexRegs->Mailbox[1]);
218         writel(p2, &dev->IndexRegs->Mailbox[2]);
219         writel(p3, &dev->IndexRegs->Mailbox[3]);
220         writel(p4, &dev->IndexRegs->Mailbox[4]);
221
222         /*
223          *      Clear the synch command doorbell to start on a clean slate.
224          */
225         if (!dev->msi_enabled)
226                 src_writel(dev,
227                            MUnit.ODR_C,
228                            OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
229
230         /*
231          *      Disable doorbell interrupts
232          */
233         src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
234
235         /*
236          *      Force the completion of the mask register write before issuing
237          *      the interrupt.
238          */
239         src_readl(dev, MUnit.OIMR);
240
241         /*
242          *      Signal that there is a new synch command
243          */
244         src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
245
246         if (!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) {
247                 ok = 0;
248                 start = jiffies;
249
250                 if (command == IOP_RESET_ALWAYS) {
251                         /* Wait up to 10 sec */
252                         delay = 10*HZ;
253                 } else {
254                         /* Wait up to 5 minutes */
255                         delay = 300*HZ;
256                 }
257                 while (time_before(jiffies, start+delay)) {
258                         udelay(5);      /* Delay 5 microseconds to let Mon960 get info. */
259                         /*
260                          *      Mon960 will set doorbell0 bit when it has completed the command.
261                          */
262                         if (aac_src_get_sync_status(dev) & OUTBOUNDDOORBELL_0) {
263                                 /*
264                                  *      Clear the doorbell.
265                                  */
266                                 if (dev->msi_enabled)
267                                         aac_src_access_devreg(dev,
268                                                 AAC_CLEAR_SYNC_BIT);
269                                 else
270                                         src_writel(dev,
271                                                 MUnit.ODR_C,
272                                                 OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
273                                 ok = 1;
274                                 break;
275                         }
276                         /*
277                          *      Yield the processor in case we are slow
278                          */
279                         msleep(1);
280                 }
281                 if (unlikely(ok != 1)) {
282                         /*
283                          *      Restore interrupt mask even though we timed out
284                          */
285                         aac_adapter_enable_int(dev);
286                         return -ETIMEDOUT;
287                 }
288                 /*
289                  *      Pull the synch status from Mailbox 0.
290                  */
291                 if (status)
292                         *status = readl(&dev->IndexRegs->Mailbox[0]);
293                 if (r1)
294                         *r1 = readl(&dev->IndexRegs->Mailbox[1]);
295                 if (r2)
296                         *r2 = readl(&dev->IndexRegs->Mailbox[2]);
297                 if (r3)
298                         *r3 = readl(&dev->IndexRegs->Mailbox[3]);
299                 if (r4)
300                         *r4 = readl(&dev->IndexRegs->Mailbox[4]);
301                 if (command == GET_COMM_PREFERRED_SETTINGS)
302                         dev->max_msix =
303                                 readl(&dev->IndexRegs->Mailbox[5]) & 0xFFFF;
304                 /*
305                  *      Clear the synch command doorbell.
306                  */
307                 if (!dev->msi_enabled)
308                         src_writel(dev,
309                                 MUnit.ODR_C,
310                                 OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
311         }
312
313         /*
314          *      Restore interrupt mask
315          */
316         aac_adapter_enable_int(dev);
317         return 0;
318 }
319
320 /**
321  *      aac_src_interrupt_adapter       -       interrupt adapter
322  *      @dev: Adapter
323  *
324  *      Send an interrupt to the i960 and breakpoint it.
325  */
326
327 static void aac_src_interrupt_adapter(struct aac_dev *dev)
328 {
329         src_sync_cmd(dev, BREAKPOINT_REQUEST,
330                 0, 0, 0, 0, 0, 0,
331                 NULL, NULL, NULL, NULL, NULL);
332 }
333
334 /**
335  *      aac_src_notify_adapter          -       send an event to the adapter
336  *      @dev: Adapter
337  *      @event: Event to send
338  *
339  *      Notify the i960 that something it probably cares about has
340  *      happened.
341  */
342
343 static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
344 {
345         switch (event) {
346
347         case AdapNormCmdQue:
348                 src_writel(dev, MUnit.ODR_C,
349                         INBOUNDDOORBELL_1 << SRC_ODR_SHIFT);
350                 break;
351         case HostNormRespNotFull:
352                 src_writel(dev, MUnit.ODR_C,
353                         INBOUNDDOORBELL_4 << SRC_ODR_SHIFT);
354                 break;
355         case AdapNormRespQue:
356                 src_writel(dev, MUnit.ODR_C,
357                         INBOUNDDOORBELL_2 << SRC_ODR_SHIFT);
358                 break;
359         case HostNormCmdNotFull:
360                 src_writel(dev, MUnit.ODR_C,
361                         INBOUNDDOORBELL_3 << SRC_ODR_SHIFT);
362                 break;
363         case FastIo:
364                 src_writel(dev, MUnit.ODR_C,
365                         INBOUNDDOORBELL_6 << SRC_ODR_SHIFT);
366                 break;
367         case AdapPrintfDone:
368                 src_writel(dev, MUnit.ODR_C,
369                         INBOUNDDOORBELL_5 << SRC_ODR_SHIFT);
370                 break;
371         default:
372                 BUG();
373                 break;
374         }
375 }
376
377 /**
378  *      aac_src_start_adapter           -       activate adapter
379  *      @dev:   Adapter
380  *
381  *      Start up processing on an i960 based AAC adapter
382  */
383
384 static void aac_src_start_adapter(struct aac_dev *dev)
385 {
386         struct aac_init *init;
387         int i;
388
389          /* reset host_rrq_idx first */
390         for (i = 0; i < dev->max_msix; i++) {
391                 dev->host_rrq_idx[i] = i * dev->vector_cap;
392                 atomic_set(&dev->rrq_outstanding[i], 0);
393         }
394         dev->fibs_pushed_no = 0;
395
396         init = dev->init;
397         init->HostElapsedSeconds = cpu_to_le32(get_seconds());
398
399         /* We can only use a 32 bit address here */
400         src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
401           0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
402 }
403
404 /**
405  *      aac_src_check_health
406  *      @dev: device to check if healthy
407  *
408  *      Will attempt to determine if the specified adapter is alive and
409  *      capable of handling requests, returning 0 if alive.
410  */
411 static int aac_src_check_health(struct aac_dev *dev)
412 {
413         u32 status = src_readl(dev, MUnit.OMR);
414
415         /*
416          *      Check to see if the board panic'd.
417          */
418         if (unlikely(status & KERNEL_PANIC))
419                 goto err_blink;
420
421         /*
422          *      Check to see if the board failed any self tests.
423          */
424         if (unlikely(status & SELF_TEST_FAILED))
425                 goto err_out;
426
427         /*
428          *      Check to see if the board failed any self tests.
429          */
430         if (unlikely(status & MONITOR_PANIC))
431                 goto err_out;
432
433         /*
434          *      Wait for the adapter to be up and running.
435          */
436         if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
437                 return -3;
438         /*
439          *      Everything is OK
440          */
441         return 0;
442
443 err_out:
444         return -1;
445
446 err_blink:
447         return (status > 16) & 0xFF;
448 }
449
450 /**
451  *      aac_src_deliver_message
452  *      @fib: fib to issue
453  *
454  *      Will send a fib, returning 0 if successful.
455  */
456 static int aac_src_deliver_message(struct fib *fib)
457 {
458         struct aac_dev *dev = fib->dev;
459         struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
460         u32 fibsize;
461         dma_addr_t address;
462         struct aac_fib_xporthdr *pFibX;
463 #if !defined(writeq)
464         unsigned long flags;
465 #endif
466
467         u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
468         u16 vector_no;
469
470         atomic_inc(&q->numpending);
471
472         if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest &&
473             dev->max_msix > 1) {
474                 vector_no = fib->vector_no;
475                 fib->hw_fib_va->header.Handle += (vector_no << 16);
476         } else {
477                 vector_no = 0;
478         }
479
480         atomic_inc(&dev->rrq_outstanding[vector_no]);
481
482         if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) {
483                 /* Calculate the amount to the fibsize bits */
484                 fibsize = (hdr_size + 127) / 128 - 1;
485                 if (fibsize > (ALIGN32 - 1))
486                         return -EMSGSIZE;
487                 /* New FIB header, 32-bit */
488                 address = fib->hw_fib_pa;
489                 fib->hw_fib_va->header.StructType = FIB_MAGIC2;
490                 fib->hw_fib_va->header.SenderFibAddress = (u32)address;
491                 fib->hw_fib_va->header.u.TimeStamp = 0;
492                 BUG_ON(upper_32_bits(address) != 0L);
493                 address |= fibsize;
494         } else {
495                 /* Calculate the amount to the fibsize bits */
496                 fibsize = (sizeof(struct aac_fib_xporthdr) + hdr_size + 127) / 128 - 1;
497                 if (fibsize > (ALIGN32 - 1))
498                         return -EMSGSIZE;
499
500                 /* Fill XPORT header */
501                 pFibX = (void *)fib->hw_fib_va - sizeof(struct aac_fib_xporthdr);
502                 pFibX->Handle = cpu_to_le32(fib->hw_fib_va->header.Handle);
503                 pFibX->HostAddress = cpu_to_le64(fib->hw_fib_pa);
504                 pFibX->Size = cpu_to_le32(hdr_size);
505
506                 /*
507                  * The xport header has been 32-byte aligned for us so that fibsize
508                  * can be masked out of this address by hardware. -- BenC
509                  */
510                 address = fib->hw_fib_pa - sizeof(struct aac_fib_xporthdr);
511                 if (address & (ALIGN32 - 1))
512                         return -EINVAL;
513                 address |= fibsize;
514         }
515 #if defined(writeq)
516         src_writeq(dev, MUnit.IQ_L, (u64)address);
517 #else
518         spin_lock_irqsave(&fib->dev->iq_lock, flags);
519         src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
520         src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
521         spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
522 #endif
523         return 0;
524 }
525
526 /**
527  *      aac_src_ioremap
528  *      @size: mapping resize request
529  *
530  */
531 static int aac_src_ioremap(struct aac_dev *dev, u32 size)
532 {
533         if (!size) {
534                 iounmap(dev->regs.src.bar1);
535                 dev->regs.src.bar1 = NULL;
536                 iounmap(dev->regs.src.bar0);
537                 dev->base = dev->regs.src.bar0 = NULL;
538                 return 0;
539         }
540         dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
541                 AAC_MIN_SRC_BAR1_SIZE);
542         dev->base = NULL;
543         if (dev->regs.src.bar1 == NULL)
544                 return -1;
545         dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
546         if (dev->base == NULL) {
547                 iounmap(dev->regs.src.bar1);
548                 dev->regs.src.bar1 = NULL;
549                 return -1;
550         }
551         dev->IndexRegs = &((struct src_registers __iomem *)
552                 dev->base)->u.tupelo.IndexRegs;
553         return 0;
554 }
555
556 /**
557  *  aac_srcv_ioremap
558  *      @size: mapping resize request
559  *
560  */
561 static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
562 {
563         if (!size) {
564                 iounmap(dev->regs.src.bar0);
565                 dev->base = dev->regs.src.bar0 = NULL;
566                 return 0;
567         }
568         dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
569         if (dev->base == NULL)
570                 return -1;
571         dev->IndexRegs = &((struct src_registers __iomem *)
572                 dev->base)->u.denali.IndexRegs;
573         return 0;
574 }
575
576 static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
577 {
578         u32 var, reset_mask;
579
580         if (bled >= 0) {
581                 if (bled)
582                         printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n",
583                                 dev->name, dev->id, bled);
584                 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
585                 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
586                         0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
587                 if ((bled || (var != 0x00000001)) &&
588                     !dev->doorbell_mask)
589                         return -EINVAL;
590                 else if (dev->doorbell_mask) {
591                         reset_mask = dev->doorbell_mask;
592                         bled = 0;
593                         var = 0x00000001;
594                 }
595
596                 if ((dev->pdev->device == PMC_DEVICE_S7 ||
597                     dev->pdev->device == PMC_DEVICE_S8 ||
598                     dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) {
599                         aac_src_access_devreg(dev, AAC_ENABLE_INTX);
600                         dev->msi_enabled = 0;
601                         msleep(5000); /* Delay 5 seconds */
602                 }
603
604                 if (!bled && (dev->supplement_adapter_info.SupportedOptions2 &
605                     AAC_OPTION_DOORBELL_RESET)) {
606                         src_writel(dev, MUnit.IDR, reset_mask);
607                         ssleep(45);
608                 } else {
609                         src_writel(dev, MUnit.IDR, 0x100);
610                         ssleep(45);
611                 }
612         }
613
614         if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
615                 return -ENODEV;
616
617         if (startup_timeout < 300)
618                 startup_timeout = 300;
619
620         return 0;
621 }
622
623 /**
624  *      aac_src_select_comm     -       Select communications method
625  *      @dev: Adapter
626  *      @comm: communications method
627  */
628 int aac_src_select_comm(struct aac_dev *dev, int comm)
629 {
630         switch (comm) {
631         case AAC_COMM_MESSAGE:
632                 dev->a_ops.adapter_intr = aac_src_intr_message;
633                 dev->a_ops.adapter_deliver = aac_src_deliver_message;
634                 break;
635         default:
636                 return 1;
637         }
638         return 0;
639 }
640
641 /**
642  *  aac_src_init        -       initialize an Cardinal Frey Bar card
643  *  @dev: device to configure
644  *
645  */
646
647 int aac_src_init(struct aac_dev *dev)
648 {
649         unsigned long start;
650         unsigned long status;
651         int restart = 0;
652         int instance = dev->id;
653         const char *name = dev->name;
654
655         dev->a_ops.adapter_ioremap = aac_src_ioremap;
656         dev->a_ops.adapter_comm = aac_src_select_comm;
657
658         dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
659         if (aac_adapter_ioremap(dev, dev->base_size)) {
660                 printk(KERN_WARNING "%s: unable to map adapter.\n", name);
661                 goto error_iounmap;
662         }
663
664         /* Failure to reset here is an option ... */
665         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
666         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
667         if ((aac_reset_devices || reset_devices) &&
668                 !aac_src_restart_adapter(dev, 0))
669                 ++restart;
670         /*
671          *      Check to see if the board panic'd while booting.
672          */
673         status = src_readl(dev, MUnit.OMR);
674         if (status & KERNEL_PANIC) {
675                 if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
676                         goto error_iounmap;
677                 ++restart;
678         }
679         /*
680          *      Check to see if the board failed any self tests.
681          */
682         status = src_readl(dev, MUnit.OMR);
683         if (status & SELF_TEST_FAILED) {
684                 printk(KERN_ERR "%s%d: adapter self-test failed.\n",
685                         dev->name, instance);
686                 goto error_iounmap;
687         }
688         /*
689          *      Check to see if the monitor panic'd while booting.
690          */
691         if (status & MONITOR_PANIC) {
692                 printk(KERN_ERR "%s%d: adapter monitor panic.\n",
693                         dev->name, instance);
694                 goto error_iounmap;
695         }
696         start = jiffies;
697         /*
698          *      Wait for the adapter to be up and running. Wait up to 3 minutes
699          */
700         while (!((status = src_readl(dev, MUnit.OMR)) &
701                 KERNEL_UP_AND_RUNNING)) {
702                 if ((restart &&
703                   (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
704                   time_after(jiffies, start+HZ*startup_timeout)) {
705                         printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
706                                         dev->name, instance, status);
707                         goto error_iounmap;
708                 }
709                 if (!restart &&
710                   ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
711                   time_after(jiffies, start + HZ *
712                   ((startup_timeout > 60)
713                     ? (startup_timeout - 60)
714                     : (startup_timeout / 2))))) {
715                         if (likely(!aac_src_restart_adapter(dev,
716                             aac_src_check_health(dev))))
717                                 start = jiffies;
718                         ++restart;
719                 }
720                 msleep(1);
721         }
722         if (restart && aac_commit)
723                 aac_commit = 1;
724         /*
725          *      Fill in the common function dispatch table.
726          */
727         dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
728         dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
729         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
730         dev->a_ops.adapter_notify = aac_src_notify_adapter;
731         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
732         dev->a_ops.adapter_check_health = aac_src_check_health;
733         dev->a_ops.adapter_restart = aac_src_restart_adapter;
734         dev->a_ops.adapter_start = aac_src_start_adapter;
735
736         /*
737          *      First clear out all interrupts.  Then enable the one's that we
738          *      can handle.
739          */
740         aac_adapter_comm(dev, AAC_COMM_MESSAGE);
741         aac_adapter_disable_int(dev);
742         src_writel(dev, MUnit.ODR_C, 0xffffffff);
743         aac_adapter_enable_int(dev);
744
745         if (aac_init_adapter(dev) == NULL)
746                 goto error_iounmap;
747         if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
748                 goto error_iounmap;
749
750         dev->msi = !pci_enable_msi(dev->pdev);
751
752         dev->aac_msix[0].vector_no = 0;
753         dev->aac_msix[0].dev = dev;
754
755         if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
756                         IRQF_SHARED, "aacraid", &(dev->aac_msix[0]))  < 0) {
757
758                 if (dev->msi)
759                         pci_disable_msi(dev->pdev);
760
761                 printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
762                         name, instance);
763                 goto error_iounmap;
764         }
765         dev->dbg_base = pci_resource_start(dev->pdev, 2);
766         dev->dbg_base_mapped = dev->regs.src.bar1;
767         dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
768         dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
769
770         aac_adapter_enable_int(dev);
771
772         if (!dev->sync_mode) {
773                 /*
774                  * Tell the adapter that all is configured, and it can
775                  * start accepting requests
776                  */
777                 aac_src_start_adapter(dev);
778         }
779         return 0;
780
781 error_iounmap:
782
783         return -1;
784 }
785
786 /**
787  *  aac_srcv_init       -       initialize an SRCv card
788  *  @dev: device to configure
789  *
790  */
791
792 int aac_srcv_init(struct aac_dev *dev)
793 {
794         unsigned long start;
795         unsigned long status;
796         int restart = 0;
797         int instance = dev->id;
798         const char *name = dev->name;
799
800         dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
801         dev->a_ops.adapter_comm = aac_src_select_comm;
802
803         dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
804         if (aac_adapter_ioremap(dev, dev->base_size)) {
805                 printk(KERN_WARNING "%s: unable to map adapter.\n", name);
806                 goto error_iounmap;
807         }
808
809         /* Failure to reset here is an option ... */
810         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
811         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
812         if ((aac_reset_devices || reset_devices) &&
813                 !aac_src_restart_adapter(dev, 0))
814                 ++restart;
815         /*
816          *      Check to see if flash update is running.
817          *      Wait for the adapter to be up and running. Wait up to 5 minutes
818          */
819         status = src_readl(dev, MUnit.OMR);
820         if (status & FLASH_UPD_PENDING) {
821                 start = jiffies;
822                 do {
823                         status = src_readl(dev, MUnit.OMR);
824                         if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) {
825                                 printk(KERN_ERR "%s%d: adapter flash update failed.\n",
826                                         dev->name, instance);
827                                 goto error_iounmap;
828                         }
829                 } while (!(status & FLASH_UPD_SUCCESS) &&
830                          !(status & FLASH_UPD_FAILED));
831                 /* Delay 10 seconds.
832                  * Because right now FW is doing a soft reset,
833                  * do not read scratch pad register at this time
834                  */
835                 ssleep(10);
836         }
837         /*
838          *      Check to see if the board panic'd while booting.
839          */
840         status = src_readl(dev, MUnit.OMR);
841         if (status & KERNEL_PANIC) {
842                 if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
843                         goto error_iounmap;
844                 ++restart;
845         }
846         /*
847          *      Check to see if the board failed any self tests.
848          */
849         status = src_readl(dev, MUnit.OMR);
850         if (status & SELF_TEST_FAILED) {
851                 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
852                 goto error_iounmap;
853         }
854         /*
855          *      Check to see if the monitor panic'd while booting.
856          */
857         if (status & MONITOR_PANIC) {
858                 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
859                 goto error_iounmap;
860         }
861         start = jiffies;
862         /*
863          *      Wait for the adapter to be up and running. Wait up to 3 minutes
864          */
865         while (!((status = src_readl(dev, MUnit.OMR)) &
866                 KERNEL_UP_AND_RUNNING) ||
867                 status == 0xffffffff) {
868                 if ((restart &&
869                   (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
870                   time_after(jiffies, start+HZ*startup_timeout)) {
871                         printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
872                                         dev->name, instance, status);
873                         goto error_iounmap;
874                 }
875                 if (!restart &&
876                   ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
877                   time_after(jiffies, start + HZ *
878                   ((startup_timeout > 60)
879                     ? (startup_timeout - 60)
880                     : (startup_timeout / 2))))) {
881                         if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev))))
882                                 start = jiffies;
883                         ++restart;
884                 }
885                 msleep(1);
886         }
887         if (restart && aac_commit)
888                 aac_commit = 1;
889         /*
890          *      Fill in the common function dispatch table.
891          */
892         dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
893         dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
894         dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
895         dev->a_ops.adapter_notify = aac_src_notify_adapter;
896         dev->a_ops.adapter_sync_cmd = src_sync_cmd;
897         dev->a_ops.adapter_check_health = aac_src_check_health;
898         dev->a_ops.adapter_restart = aac_src_restart_adapter;
899         dev->a_ops.adapter_start = aac_src_start_adapter;
900
901         /*
902          *      First clear out all interrupts.  Then enable the one's that we
903          *      can handle.
904          */
905         aac_adapter_comm(dev, AAC_COMM_MESSAGE);
906         aac_adapter_disable_int(dev);
907         src_writel(dev, MUnit.ODR_C, 0xffffffff);
908         aac_adapter_enable_int(dev);
909
910         if (aac_init_adapter(dev) == NULL)
911                 goto error_iounmap;
912         if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2)
913                 goto error_iounmap;
914         if (dev->msi_enabled)
915                 aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
916
917         if (aac_acquire_irq(dev))
918                 goto error_iounmap;
919
920         dev->dbg_base = dev->base_start;
921         dev->dbg_base_mapped = dev->base;
922         dev->dbg_size = dev->base_size;
923         dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
924
925         aac_adapter_enable_int(dev);
926
927         if (!dev->sync_mode) {
928                 /*
929                  * Tell the adapter that all is configured, and it can
930                  * start accepting requests
931                  */
932                 aac_src_start_adapter(dev);
933         }
934         return 0;
935
936 error_iounmap:
937
938         return -1;
939 }
940
941 void aac_src_access_devreg(struct aac_dev *dev, int mode)
942 {
943         u_int32_t val;
944
945         switch (mode) {
946         case AAC_ENABLE_INTERRUPT:
947                 src_writel(dev,
948                            MUnit.OIMR,
949                            dev->OIMR = (dev->msi_enabled ?
950                                         AAC_INT_ENABLE_TYPE1_MSIX :
951                                         AAC_INT_ENABLE_TYPE1_INTX));
952                 break;
953
954         case AAC_DISABLE_INTERRUPT:
955                 src_writel(dev,
956                            MUnit.OIMR,
957                            dev->OIMR = AAC_INT_DISABLE_ALL);
958                 break;
959
960         case AAC_ENABLE_MSIX:
961                 /* set bit 6 */
962                 val = src_readl(dev, MUnit.IDR);
963                 val |= 0x40;
964                 src_writel(dev,  MUnit.IDR, val);
965                 src_readl(dev, MUnit.IDR);
966                 /* unmask int. */
967                 val = PMC_ALL_INTERRUPT_BITS;
968                 src_writel(dev, MUnit.IOAR, val);
969                 val = src_readl(dev, MUnit.OIMR);
970                 src_writel(dev,
971                            MUnit.OIMR,
972                            val & (~(PMC_GLOBAL_INT_BIT2 | PMC_GLOBAL_INT_BIT0)));
973                 break;
974
975         case AAC_DISABLE_MSIX:
976                 /* reset bit 6 */
977                 val = src_readl(dev, MUnit.IDR);
978                 val &= ~0x40;
979                 src_writel(dev, MUnit.IDR, val);
980                 src_readl(dev, MUnit.IDR);
981                 break;
982
983         case AAC_CLEAR_AIF_BIT:
984                 /* set bit 5 */
985                 val = src_readl(dev, MUnit.IDR);
986                 val |= 0x20;
987                 src_writel(dev, MUnit.IDR, val);
988                 src_readl(dev, MUnit.IDR);
989                 break;
990
991         case AAC_CLEAR_SYNC_BIT:
992                 /* set bit 4 */
993                 val = src_readl(dev, MUnit.IDR);
994                 val |= 0x10;
995                 src_writel(dev, MUnit.IDR, val);
996                 src_readl(dev, MUnit.IDR);
997                 break;
998
999         case AAC_ENABLE_INTX:
1000                 /* set bit 7 */
1001                 val = src_readl(dev, MUnit.IDR);
1002                 val |= 0x80;
1003                 src_writel(dev, MUnit.IDR, val);
1004                 src_readl(dev, MUnit.IDR);
1005                 /* unmask int. */
1006                 val = PMC_ALL_INTERRUPT_BITS;
1007                 src_writel(dev, MUnit.IOAR, val);
1008                 src_readl(dev, MUnit.IOAR);
1009                 val = src_readl(dev, MUnit.OIMR);
1010                 src_writel(dev, MUnit.OIMR,
1011                                 val & (~(PMC_GLOBAL_INT_BIT2)));
1012                 break;
1013
1014         default:
1015                 break;
1016         }
1017 }
1018
1019 static int aac_src_get_sync_status(struct aac_dev *dev)
1020 {
1021
1022         int val;
1023
1024         if (dev->msi_enabled)
1025                 val = src_readl(dev, MUnit.ODR_MSI) & 0x1000 ? 1 : 0;
1026         else
1027                 val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT;
1028
1029         return val;
1030 }