xref: /linux/drivers/scsi/aacraid/src.c (revision b7019ac550eb3916f34d79db583e9b7ea2524afa)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	Adaptec AAC series RAID controller driver
4  *	(c) Copyright 2001 Red Hat Inc.
5  *
6  * based on the old aacraid driver that is..
7  * Adaptec aacraid device driver for Linux.
8  *
9  * Copyright (c) 2000-2010 Adaptec, Inc.
10  *               2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
11  *		 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
12  *
13  * Module Name:
14  *  src.c
15  *
16  * Abstract: Hardware Device Interface for PMC SRC based controllers
17  */
18 
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/types.h>
22 #include <linux/pci.h>
23 #include <linux/spinlock.h>
24 #include <linux/slab.h>
25 #include <linux/blkdev.h>
26 #include <linux/delay.h>
27 #include <linux/completion.h>
28 #include <linux/time.h>
29 #include <linux/interrupt.h>
30 #include <scsi/scsi_host.h>
31 
32 #include "aacraid.h"
33 
34 static int aac_src_get_sync_status(struct aac_dev *dev);
35 
36 static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
37 {
38 	struct aac_msix_ctx *ctx;
39 	struct aac_dev *dev;
40 	unsigned long bellbits, bellbits_shifted;
41 	int vector_no;
42 	int isFastResponse, mode;
43 	u32 index, handle;
44 
45 	ctx = (struct aac_msix_ctx *)dev_id;
46 	dev = ctx->dev;
47 	vector_no = ctx->vector_no;
48 
49 	if (dev->msi_enabled) {
50 		mode = AAC_INT_MODE_MSI;
51 		if (vector_no == 0) {
52 			bellbits = src_readl(dev, MUnit.ODR_MSI);
53 			if (bellbits & 0x40000)
54 				mode |= AAC_INT_MODE_AIF;
55 			if (bellbits & 0x1000)
56 				mode |= AAC_INT_MODE_SYNC;
57 		}
58 	} else {
59 		mode = AAC_INT_MODE_INTX;
60 		bellbits = src_readl(dev, MUnit.ODR_R);
61 		if (bellbits & PmDoorBellResponseSent) {
62 			bellbits = PmDoorBellResponseSent;
63 			src_writel(dev, MUnit.ODR_C, bellbits);
64 			src_readl(dev, MUnit.ODR_C);
65 		} else {
66 			bellbits_shifted = (bellbits >> SRC_ODR_SHIFT);
67 			src_writel(dev, MUnit.ODR_C, bellbits);
68 			src_readl(dev, MUnit.ODR_C);
69 
70 			if (bellbits_shifted & DoorBellAifPending)
71 				mode |= AAC_INT_MODE_AIF;
72 			else if (bellbits_shifted & OUTBOUNDDOORBELL_0)
73 				mode |= AAC_INT_MODE_SYNC;
74 		}
75 	}
76 
77 	if (mode & AAC_INT_MODE_SYNC) {
78 		unsigned long sflags;
79 		struct list_head *entry;
80 		int send_it = 0;
81 		extern int aac_sync_mode;
82 
83 		if (!aac_sync_mode && !dev->msi_enabled) {
84 			src_writel(dev, MUnit.ODR_C, bellbits);
85 			src_readl(dev, MUnit.ODR_C);
86 		}
87 
88 		if (dev->sync_fib) {
89 			if (dev->sync_fib->callback)
90 				dev->sync_fib->callback(dev->sync_fib->callback_data,
91 					dev->sync_fib);
92 			spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
93 			if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
94 				dev->management_fib_count--;
95 				complete(&dev->sync_fib->event_wait);
96 			}
97 			spin_unlock_irqrestore(&dev->sync_fib->event_lock,
98 						sflags);
99 			spin_lock_irqsave(&dev->sync_lock, sflags);
100 			if (!list_empty(&dev->sync_fib_list)) {
101 				entry = dev->sync_fib_list.next;
102 				dev->sync_fib = list_entry(entry,
103 							   struct fib,
104 							   fiblink);
105 				list_del(entry);
106 				send_it = 1;
107 			} else {
108 				dev->sync_fib = NULL;
109 			}
110 			spin_unlock_irqrestore(&dev->sync_lock, sflags);
111 			if (send_it) {
112 				aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
113 					(u32)dev->sync_fib->hw_fib_pa,
114 					0, 0, 0, 0, 0,
115 					NULL, NULL, NULL, NULL, NULL);
116 			}
117 		}
118 		if (!dev->msi_enabled)
119 			mode = 0;
120 
121 	}
122 
123 	if (mode & AAC_INT_MODE_AIF) {
124 		/* handle AIF */
125 		if (dev->sa_firmware) {
126 			u32 events = src_readl(dev, MUnit.SCR0);
127 
128 			aac_intr_normal(dev, events, 1, 0, NULL);
129 			writel(events, &dev->IndexRegs->Mailbox[0]);
130 			src_writel(dev, MUnit.IDR, 1 << 23);
131 		} else {
132 			if (dev->aif_thread && dev->fsa_dev)
133 				aac_intr_normal(dev, 0, 2, 0, NULL);
134 		}
135 		if (dev->msi_enabled)
136 			aac_src_access_devreg(dev, AAC_CLEAR_AIF_BIT);
137 		mode = 0;
138 	}
139 
140 	if (mode) {
141 		index = dev->host_rrq_idx[vector_no];
142 
143 		for (;;) {
144 			isFastResponse = 0;
145 			/* remove toggle bit (31) */
146 			handle = le32_to_cpu((dev->host_rrq[index])
147 				& 0x7fffffff);
148 			/* check fast response bits (30, 1) */
149 			if (handle & 0x40000000)
150 				isFastResponse = 1;
151 			handle &= 0x0000ffff;
152 			if (handle == 0)
153 				break;
154 			handle >>= 2;
155 			if (dev->msi_enabled && dev->max_msix > 1)
156 				atomic_dec(&dev->rrq_outstanding[vector_no]);
157 			aac_intr_normal(dev, handle, 0, isFastResponse, NULL);
158 			dev->host_rrq[index++] = 0;
159 			if (index == (vector_no + 1) * dev->vector_cap)
160 				index = vector_no * dev->vector_cap;
161 			dev->host_rrq_idx[vector_no] = index;
162 		}
163 		mode = 0;
164 	}
165 
166 	return IRQ_HANDLED;
167 }
168 
169 /**
170  *	aac_src_disable_interrupt	-	Disable interrupts
171  *	@dev: Adapter
172  */
173 
174 static void aac_src_disable_interrupt(struct aac_dev *dev)
175 {
176 	src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
177 }
178 
179 /**
180  *	aac_src_enable_interrupt_message	-	Enable interrupts
181  *	@dev: Adapter
182  */
183 
184 static void aac_src_enable_interrupt_message(struct aac_dev *dev)
185 {
186 	aac_src_access_devreg(dev, AAC_ENABLE_INTERRUPT);
187 }
188 
189 /**
190  *	src_sync_cmd	-	send a command and wait
191  *	@dev: Adapter
192  *	@command: Command to execute
193  *	@p1: first parameter
194  *	@ret: adapter status
195  *
196  *	This routine will send a synchronous command to the adapter and wait
197  *	for its	completion.
198  */
199 
200 static int src_sync_cmd(struct aac_dev *dev, u32 command,
201 	u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
202 	u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
203 {
204 	unsigned long start;
205 	unsigned long delay;
206 	int ok;
207 
208 	/*
209 	 *	Write the command into Mailbox 0
210 	 */
211 	writel(command, &dev->IndexRegs->Mailbox[0]);
212 	/*
213 	 *	Write the parameters into Mailboxes 1 - 6
214 	 */
215 	writel(p1, &dev->IndexRegs->Mailbox[1]);
216 	writel(p2, &dev->IndexRegs->Mailbox[2]);
217 	writel(p3, &dev->IndexRegs->Mailbox[3]);
218 	writel(p4, &dev->IndexRegs->Mailbox[4]);
219 
220 	/*
221 	 *	Clear the synch command doorbell to start on a clean slate.
222 	 */
223 	if (!dev->msi_enabled)
224 		src_writel(dev,
225 			   MUnit.ODR_C,
226 			   OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
227 
228 	/*
229 	 *	Disable doorbell interrupts
230 	 */
231 	src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
232 
233 	/*
234 	 *	Force the completion of the mask register write before issuing
235 	 *	the interrupt.
236 	 */
237 	src_readl(dev, MUnit.OIMR);
238 
239 	/*
240 	 *	Signal that there is a new synch command
241 	 */
242 	src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
243 
244 	if ((!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) &&
245 		!dev->in_soft_reset) {
246 		ok = 0;
247 		start = jiffies;
248 
249 		if (command == IOP_RESET_ALWAYS) {
250 			/* Wait up to 10 sec */
251 			delay = 10*HZ;
252 		} else {
253 			/* Wait up to 5 minutes */
254 			delay = 300*HZ;
255 		}
256 		while (time_before(jiffies, start+delay)) {
257 			udelay(5);	/* Delay 5 microseconds to let Mon960 get info. */
258 			/*
259 			 *	Mon960 will set doorbell0 bit when it has completed the command.
260 			 */
261 			if (aac_src_get_sync_status(dev) & OUTBOUNDDOORBELL_0) {
262 				/*
263 				 *	Clear the doorbell.
264 				 */
265 				if (dev->msi_enabled)
266 					aac_src_access_devreg(dev,
267 						AAC_CLEAR_SYNC_BIT);
268 				else
269 					src_writel(dev,
270 						MUnit.ODR_C,
271 						OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
272 				ok = 1;
273 				break;
274 			}
275 			/*
276 			 *	Yield the processor in case we are slow
277 			 */
278 			msleep(1);
279 		}
280 		if (unlikely(ok != 1)) {
281 			/*
282 			 *	Restore interrupt mask even though we timed out
283 			 */
284 			aac_adapter_enable_int(dev);
285 			return -ETIMEDOUT;
286 		}
287 		/*
288 		 *	Pull the synch status from Mailbox 0.
289 		 */
290 		if (status)
291 			*status = readl(&dev->IndexRegs->Mailbox[0]);
292 		if (r1)
293 			*r1 = readl(&dev->IndexRegs->Mailbox[1]);
294 		if (r2)
295 			*r2 = readl(&dev->IndexRegs->Mailbox[2]);
296 		if (r3)
297 			*r3 = readl(&dev->IndexRegs->Mailbox[3]);
298 		if (r4)
299 			*r4 = readl(&dev->IndexRegs->Mailbox[4]);
300 		if (command == GET_COMM_PREFERRED_SETTINGS)
301 			dev->max_msix =
302 				readl(&dev->IndexRegs->Mailbox[5]) & 0xFFFF;
303 		/*
304 		 *	Clear the synch command doorbell.
305 		 */
306 		if (!dev->msi_enabled)
307 			src_writel(dev,
308 				MUnit.ODR_C,
309 				OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
310 	}
311 
312 	/*
313 	 *	Restore interrupt mask
314 	 */
315 	aac_adapter_enable_int(dev);
316 	return 0;
317 }
318 
319 /**
320  *	aac_src_interrupt_adapter	-	interrupt adapter
321  *	@dev: Adapter
322  *
323  *	Send an interrupt to the i960 and breakpoint it.
324  */
325 
326 static void aac_src_interrupt_adapter(struct aac_dev *dev)
327 {
328 	src_sync_cmd(dev, BREAKPOINT_REQUEST,
329 		0, 0, 0, 0, 0, 0,
330 		NULL, NULL, NULL, NULL, NULL);
331 }
332 
333 /**
334  *	aac_src_notify_adapter		-	send an event to the adapter
335  *	@dev: Adapter
336  *	@event: Event to send
337  *
338  *	Notify the i960 that something it probably cares about has
339  *	happened.
340  */
341 
342 static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
343 {
344 	switch (event) {
345 
346 	case AdapNormCmdQue:
347 		src_writel(dev, MUnit.ODR_C,
348 			INBOUNDDOORBELL_1 << SRC_ODR_SHIFT);
349 		break;
350 	case HostNormRespNotFull:
351 		src_writel(dev, MUnit.ODR_C,
352 			INBOUNDDOORBELL_4 << SRC_ODR_SHIFT);
353 		break;
354 	case AdapNormRespQue:
355 		src_writel(dev, MUnit.ODR_C,
356 			INBOUNDDOORBELL_2 << SRC_ODR_SHIFT);
357 		break;
358 	case HostNormCmdNotFull:
359 		src_writel(dev, MUnit.ODR_C,
360 			INBOUNDDOORBELL_3 << SRC_ODR_SHIFT);
361 		break;
362 	case FastIo:
363 		src_writel(dev, MUnit.ODR_C,
364 			INBOUNDDOORBELL_6 << SRC_ODR_SHIFT);
365 		break;
366 	case AdapPrintfDone:
367 		src_writel(dev, MUnit.ODR_C,
368 			INBOUNDDOORBELL_5 << SRC_ODR_SHIFT);
369 		break;
370 	default:
371 		BUG();
372 		break;
373 	}
374 }
375 
376 /**
377  *	aac_src_start_adapter		-	activate adapter
378  *	@dev:	Adapter
379  *
380  *	Start up processing on an i960 based AAC adapter
381  */
382 
383 static void aac_src_start_adapter(struct aac_dev *dev)
384 {
385 	union aac_init *init;
386 	int i;
387 
388 	 /* reset host_rrq_idx first */
389 	for (i = 0; i < dev->max_msix; i++) {
390 		dev->host_rrq_idx[i] = i * dev->vector_cap;
391 		atomic_set(&dev->rrq_outstanding[i], 0);
392 	}
393 	atomic_set(&dev->msix_counter, 0);
394 	dev->fibs_pushed_no = 0;
395 
396 	init = dev->init;
397 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) {
398 		init->r8.host_elapsed_seconds =
399 			cpu_to_le32(ktime_get_real_seconds());
400 		src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
401 			lower_32_bits(dev->init_pa),
402 			upper_32_bits(dev->init_pa),
403 			sizeof(struct _r8) +
404 			(AAC_MAX_HRRQ - 1) * sizeof(struct _rrq),
405 			0, 0, 0, NULL, NULL, NULL, NULL, NULL);
406 	} else {
407 		init->r7.host_elapsed_seconds =
408 			cpu_to_le32(ktime_get_real_seconds());
409 		// We can only use a 32 bit address here
410 		src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
411 			(u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
412 			NULL, NULL, NULL, NULL, NULL);
413 	}
414 
415 }
416 
417 /**
418  *	aac_src_check_health
419  *	@dev: device to check if healthy
420  *
421  *	Will attempt to determine if the specified adapter is alive and
422  *	capable of handling requests, returning 0 if alive.
423  */
424 static int aac_src_check_health(struct aac_dev *dev)
425 {
426 	u32 status = src_readl(dev, MUnit.OMR);
427 
428 	/*
429 	 *	Check to see if the board panic'd.
430 	 */
431 	if (unlikely(status & KERNEL_PANIC))
432 		goto err_blink;
433 
434 	/*
435 	 *	Check to see if the board failed any self tests.
436 	 */
437 	if (unlikely(status & SELF_TEST_FAILED))
438 		goto err_out;
439 
440 	/*
441 	 *	Check to see if the board failed any self tests.
442 	 */
443 	if (unlikely(status & MONITOR_PANIC))
444 		goto err_out;
445 
446 	/*
447 	 *	Wait for the adapter to be up and running.
448 	 */
449 	if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
450 		return -3;
451 	/*
452 	 *	Everything is OK
453 	 */
454 	return 0;
455 
456 err_out:
457 	return -1;
458 
459 err_blink:
460 	return (status >> 16) & 0xFF;
461 }
462 
463 static inline u32 aac_get_vector(struct aac_dev *dev)
464 {
465 	return atomic_inc_return(&dev->msix_counter)%dev->max_msix;
466 }
467 
468 /**
469  *	aac_src_deliver_message
470  *	@fib: fib to issue
471  *
472  *	Will send a fib, returning 0 if successful.
473  */
474 static int aac_src_deliver_message(struct fib *fib)
475 {
476 	struct aac_dev *dev = fib->dev;
477 	struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
478 	u32 fibsize;
479 	dma_addr_t address;
480 	struct aac_fib_xporthdr *pFibX;
481 	int native_hba;
482 #if !defined(writeq)
483 	unsigned long flags;
484 #endif
485 
486 	u16 vector_no;
487 
488 	atomic_inc(&q->numpending);
489 
490 	native_hba = (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) ? 1 : 0;
491 
492 
493 	if (dev->msi_enabled && dev->max_msix > 1 &&
494 		(native_hba || fib->hw_fib_va->header.Command != AifRequest)) {
495 
496 		if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)
497 			&& dev->sa_firmware)
498 			vector_no = aac_get_vector(dev);
499 		else
500 			vector_no = fib->vector_no;
501 
502 		if (native_hba) {
503 			if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) {
504 				struct aac_hba_tm_req *tm_req;
505 
506 				tm_req = (struct aac_hba_tm_req *)
507 						fib->hw_fib_va;
508 				if (tm_req->iu_type ==
509 					HBA_IU_TYPE_SCSI_TM_REQ) {
510 					((struct aac_hba_tm_req *)
511 						fib->hw_fib_va)->reply_qid
512 							= vector_no;
513 					((struct aac_hba_tm_req *)
514 						fib->hw_fib_va)->request_id
515 							+= (vector_no << 16);
516 				} else {
517 					((struct aac_hba_reset_req *)
518 						fib->hw_fib_va)->reply_qid
519 							= vector_no;
520 					((struct aac_hba_reset_req *)
521 						fib->hw_fib_va)->request_id
522 							+= (vector_no << 16);
523 				}
524 			} else {
525 				((struct aac_hba_cmd_req *)
526 					fib->hw_fib_va)->reply_qid
527 						= vector_no;
528 				((struct aac_hba_cmd_req *)
529 					fib->hw_fib_va)->request_id
530 						+= (vector_no << 16);
531 			}
532 		} else {
533 			fib->hw_fib_va->header.Handle += (vector_no << 16);
534 		}
535 	} else {
536 		vector_no = 0;
537 	}
538 
539 	atomic_inc(&dev->rrq_outstanding[vector_no]);
540 
541 	if (native_hba) {
542 		address = fib->hw_fib_pa;
543 		fibsize = (fib->hbacmd_size + 127) / 128 - 1;
544 		if (fibsize > 31)
545 			fibsize = 31;
546 		address |= fibsize;
547 #if defined(writeq)
548 		src_writeq(dev, MUnit.IQN_L, (u64)address);
549 #else
550 		spin_lock_irqsave(&fib->dev->iq_lock, flags);
551 		src_writel(dev, MUnit.IQN_H,
552 			upper_32_bits(address) & 0xffffffff);
553 		src_writel(dev, MUnit.IQN_L, address & 0xffffffff);
554 		spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
555 #endif
556 	} else {
557 		if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
558 			dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) {
559 			/* Calculate the amount to the fibsize bits */
560 			fibsize = (le16_to_cpu(fib->hw_fib_va->header.Size)
561 				+ 127) / 128 - 1;
562 			/* New FIB header, 32-bit */
563 			address = fib->hw_fib_pa;
564 			fib->hw_fib_va->header.StructType = FIB_MAGIC2;
565 			fib->hw_fib_va->header.SenderFibAddress =
566 				cpu_to_le32((u32)address);
567 			fib->hw_fib_va->header.u.TimeStamp = 0;
568 			WARN_ON(upper_32_bits(address) != 0L);
569 		} else {
570 			/* Calculate the amount to the fibsize bits */
571 			fibsize = (sizeof(struct aac_fib_xporthdr) +
572 				le16_to_cpu(fib->hw_fib_va->header.Size)
573 				+ 127) / 128 - 1;
574 			/* Fill XPORT header */
575 			pFibX = (struct aac_fib_xporthdr *)
576 				((unsigned char *)fib->hw_fib_va -
577 				sizeof(struct aac_fib_xporthdr));
578 			pFibX->Handle = fib->hw_fib_va->header.Handle;
579 			pFibX->HostAddress =
580 				cpu_to_le64((u64)fib->hw_fib_pa);
581 			pFibX->Size = cpu_to_le32(
582 				le16_to_cpu(fib->hw_fib_va->header.Size));
583 			address = fib->hw_fib_pa -
584 				(u64)sizeof(struct aac_fib_xporthdr);
585 		}
586 		if (fibsize > 31)
587 			fibsize = 31;
588 		address |= fibsize;
589 
590 #if defined(writeq)
591 		src_writeq(dev, MUnit.IQ_L, (u64)address);
592 #else
593 		spin_lock_irqsave(&fib->dev->iq_lock, flags);
594 		src_writel(dev, MUnit.IQ_H,
595 			upper_32_bits(address) & 0xffffffff);
596 		src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
597 		spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
598 #endif
599 	}
600 	return 0;
601 }
602 
603 /**
604  *	aac_src_ioremap
605  *	@size: mapping resize request
606  *
607  */
608 static int aac_src_ioremap(struct aac_dev *dev, u32 size)
609 {
610 	if (!size) {
611 		iounmap(dev->regs.src.bar1);
612 		dev->regs.src.bar1 = NULL;
613 		iounmap(dev->regs.src.bar0);
614 		dev->base = dev->regs.src.bar0 = NULL;
615 		return 0;
616 	}
617 	dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
618 		AAC_MIN_SRC_BAR1_SIZE);
619 	dev->base = NULL;
620 	if (dev->regs.src.bar1 == NULL)
621 		return -1;
622 	dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
623 	if (dev->base == NULL) {
624 		iounmap(dev->regs.src.bar1);
625 		dev->regs.src.bar1 = NULL;
626 		return -1;
627 	}
628 	dev->IndexRegs = &((struct src_registers __iomem *)
629 		dev->base)->u.tupelo.IndexRegs;
630 	return 0;
631 }
632 
633 /**
634  *  aac_srcv_ioremap
635  *	@size: mapping resize request
636  *
637  */
638 static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
639 {
640 	if (!size) {
641 		iounmap(dev->regs.src.bar0);
642 		dev->base = dev->regs.src.bar0 = NULL;
643 		return 0;
644 	}
645 
646 	dev->regs.src.bar1 =
647 	ioremap(pci_resource_start(dev->pdev, 2), AAC_MIN_SRCV_BAR1_SIZE);
648 	dev->base = NULL;
649 	if (dev->regs.src.bar1 == NULL)
650 		return -1;
651 	dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
652 	if (dev->base == NULL) {
653 		iounmap(dev->regs.src.bar1);
654 		dev->regs.src.bar1 = NULL;
655 		return -1;
656 	}
657 	dev->IndexRegs = &((struct src_registers __iomem *)
658 		dev->base)->u.denali.IndexRegs;
659 	return 0;
660 }
661 
662 void aac_set_intx_mode(struct aac_dev *dev)
663 {
664 	if (dev->msi_enabled) {
665 		aac_src_access_devreg(dev, AAC_ENABLE_INTX);
666 		dev->msi_enabled = 0;
667 		msleep(5000); /* Delay 5 seconds */
668 	}
669 }
670 
671 static void aac_clear_omr(struct aac_dev *dev)
672 {
673 	u32 omr_value = 0;
674 
675 	omr_value = src_readl(dev, MUnit.OMR);
676 
677 	/*
678 	 * Check for PCI Errors or Kernel Panic
679 	 */
680 	if ((omr_value == INVALID_OMR) || (omr_value & KERNEL_PANIC))
681 		omr_value = 0;
682 
683 	/*
684 	 * Preserve MSIX Value if any
685 	 */
686 	src_writel(dev, MUnit.OMR, omr_value & AAC_INT_MODE_MSIX);
687 	src_readl(dev, MUnit.OMR);
688 }
689 
690 static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev)
691 {
692 	__le32 supported_options3;
693 
694 	if (!aac_fib_dump)
695 		return;
696 
697 	supported_options3  = dev->supplement_adapter_info.supported_options3;
698 	if (!(supported_options3 & AAC_OPTION_SUPPORTED3_IOP_RESET_FIB_DUMP))
699 		return;
700 
701 	aac_adapter_sync_cmd(dev, IOP_RESET_FW_FIB_DUMP,
702 			0, 0, 0,  0, 0, 0, NULL, NULL, NULL, NULL, NULL);
703 }
704 
705 static bool aac_is_ctrl_up_and_running(struct aac_dev *dev)
706 {
707 	bool ctrl_up = true;
708 	unsigned long status, start;
709 	bool is_up = false;
710 
711 	start = jiffies;
712 	do {
713 		schedule();
714 		status = src_readl(dev, MUnit.OMR);
715 
716 		if (status == 0xffffffff)
717 			status = 0;
718 
719 		if (status & KERNEL_BOOTING) {
720 			start = jiffies;
721 			continue;
722 		}
723 
724 		if (time_after(jiffies, start+HZ*SOFT_RESET_TIME)) {
725 			ctrl_up = false;
726 			break;
727 		}
728 
729 		is_up = status & KERNEL_UP_AND_RUNNING;
730 
731 	} while (!is_up);
732 
733 	return ctrl_up;
734 }
735 
736 static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
737 {
738 	aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
739 						NULL, NULL, NULL, NULL);
740 }
741 
742 static void aac_send_iop_reset(struct aac_dev *dev)
743 {
744 	aac_dump_fw_fib_iop_reset(dev);
745 
746 	aac_notify_fw_of_iop_reset(dev);
747 
748 	aac_set_intx_mode(dev);
749 
750 	aac_clear_omr(dev);
751 
752 	src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
753 
754 	msleep(5000);
755 }
756 
757 static void aac_send_hardware_soft_reset(struct aac_dev *dev)
758 {
759 	u_int32_t val;
760 
761 	aac_clear_omr(dev);
762 	val = readl(((char *)(dev->base) + IBW_SWR_OFFSET));
763 	val |= 0x01;
764 	writel(val, ((char *)(dev->base) + IBW_SWR_OFFSET));
765 	msleep_interruptible(20000);
766 }
767 
768 static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
769 {
770 	bool is_ctrl_up;
771 	int ret = 0;
772 
773 	if (bled < 0)
774 		goto invalid_out;
775 
776 	if (bled)
777 		dev_err(&dev->pdev->dev, "adapter kernel panic'd %x.\n", bled);
778 
779 	/*
780 	 * When there is a BlinkLED, IOP_RESET has not effect
781 	 */
782 	if (bled >= 2 && dev->sa_firmware && reset_type & HW_IOP_RESET)
783 		reset_type &= ~HW_IOP_RESET;
784 
785 	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
786 
787 	dev_err(&dev->pdev->dev, "Controller reset type is %d\n", reset_type);
788 
789 	if (reset_type & HW_IOP_RESET) {
790 		dev_info(&dev->pdev->dev, "Issuing IOP reset\n");
791 		aac_send_iop_reset(dev);
792 
793 		/*
794 		 * Creates a delay or wait till up and running comes thru
795 		 */
796 		is_ctrl_up = aac_is_ctrl_up_and_running(dev);
797 		if (!is_ctrl_up)
798 			dev_err(&dev->pdev->dev, "IOP reset failed\n");
799 		else {
800 			dev_info(&dev->pdev->dev, "IOP reset succeeded\n");
801 			goto set_startup;
802 		}
803 	}
804 
805 	if (!dev->sa_firmware) {
806 		dev_err(&dev->pdev->dev, "ARC Reset attempt failed\n");
807 		ret = -ENODEV;
808 		goto out;
809 	}
810 
811 	if (reset_type & HW_SOFT_RESET) {
812 		dev_info(&dev->pdev->dev, "Issuing SOFT reset\n");
813 		aac_send_hardware_soft_reset(dev);
814 		dev->msi_enabled = 0;
815 
816 		is_ctrl_up = aac_is_ctrl_up_and_running(dev);
817 		if (!is_ctrl_up) {
818 			dev_err(&dev->pdev->dev, "SOFT reset failed\n");
819 			ret = -ENODEV;
820 			goto out;
821 		} else
822 			dev_info(&dev->pdev->dev, "SOFT reset succeeded\n");
823 	}
824 
825 set_startup:
826 	if (startup_timeout < 300)
827 		startup_timeout = 300;
828 
829 out:
830 	return ret;
831 
832 invalid_out:
833 	if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
834 		ret = -ENODEV;
835 goto out;
836 }
837 
838 /**
839  *	aac_src_select_comm	-	Select communications method
840  *	@dev: Adapter
841  *	@comm: communications method
842  */
843 static int aac_src_select_comm(struct aac_dev *dev, int comm)
844 {
845 	switch (comm) {
846 	case AAC_COMM_MESSAGE:
847 		dev->a_ops.adapter_intr = aac_src_intr_message;
848 		dev->a_ops.adapter_deliver = aac_src_deliver_message;
849 		break;
850 	default:
851 		return 1;
852 	}
853 	return 0;
854 }
855 
856 /**
857  *  aac_src_init	-	initialize an Cardinal Frey Bar card
858  *  @dev: device to configure
859  *
860  */
861 
862 int aac_src_init(struct aac_dev *dev)
863 {
864 	unsigned long start;
865 	unsigned long status;
866 	int restart = 0;
867 	int instance = dev->id;
868 	const char *name = dev->name;
869 
870 	dev->a_ops.adapter_ioremap = aac_src_ioremap;
871 	dev->a_ops.adapter_comm = aac_src_select_comm;
872 
873 	dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
874 	if (aac_adapter_ioremap(dev, dev->base_size)) {
875 		printk(KERN_WARNING "%s: unable to map adapter.\n", name);
876 		goto error_iounmap;
877 	}
878 
879 	/* Failure to reset here is an option ... */
880 	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
881 	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
882 
883 	if (dev->init_reset) {
884 		dev->init_reset = false;
885 		if (!aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET))
886 			++restart;
887 	}
888 
889 	/*
890 	 *	Check to see if the board panic'd while booting.
891 	 */
892 	status = src_readl(dev, MUnit.OMR);
893 	if (status & KERNEL_PANIC) {
894 		if (aac_src_restart_adapter(dev,
895 			aac_src_check_health(dev), IOP_HWSOFT_RESET))
896 			goto error_iounmap;
897 		++restart;
898 	}
899 	/*
900 	 *	Check to see if the board failed any self tests.
901 	 */
902 	status = src_readl(dev, MUnit.OMR);
903 	if (status & SELF_TEST_FAILED) {
904 		printk(KERN_ERR "%s%d: adapter self-test failed.\n",
905 			dev->name, instance);
906 		goto error_iounmap;
907 	}
908 	/*
909 	 *	Check to see if the monitor panic'd while booting.
910 	 */
911 	if (status & MONITOR_PANIC) {
912 		printk(KERN_ERR "%s%d: adapter monitor panic.\n",
913 			dev->name, instance);
914 		goto error_iounmap;
915 	}
916 	start = jiffies;
917 	/*
918 	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
919 	 */
920 	while (!((status = src_readl(dev, MUnit.OMR)) &
921 		KERNEL_UP_AND_RUNNING)) {
922 		if ((restart &&
923 		  (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
924 		  time_after(jiffies, start+HZ*startup_timeout)) {
925 			printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
926 					dev->name, instance, status);
927 			goto error_iounmap;
928 		}
929 		if (!restart &&
930 		  ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
931 		  time_after(jiffies, start + HZ *
932 		  ((startup_timeout > 60)
933 		    ? (startup_timeout - 60)
934 		    : (startup_timeout / 2))))) {
935 			if (likely(!aac_src_restart_adapter(dev,
936 				aac_src_check_health(dev), IOP_HWSOFT_RESET)))
937 				start = jiffies;
938 			++restart;
939 		}
940 		msleep(1);
941 	}
942 	if (restart && aac_commit)
943 		aac_commit = 1;
944 	/*
945 	 *	Fill in the common function dispatch table.
946 	 */
947 	dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
948 	dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
949 	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
950 	dev->a_ops.adapter_notify = aac_src_notify_adapter;
951 	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
952 	dev->a_ops.adapter_check_health = aac_src_check_health;
953 	dev->a_ops.adapter_restart = aac_src_restart_adapter;
954 	dev->a_ops.adapter_start = aac_src_start_adapter;
955 
956 	/*
957 	 *	First clear out all interrupts.  Then enable the one's that we
958 	 *	can handle.
959 	 */
960 	aac_adapter_comm(dev, AAC_COMM_MESSAGE);
961 	aac_adapter_disable_int(dev);
962 	src_writel(dev, MUnit.ODR_C, 0xffffffff);
963 	aac_adapter_enable_int(dev);
964 
965 	if (aac_init_adapter(dev) == NULL)
966 		goto error_iounmap;
967 	if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
968 		goto error_iounmap;
969 
970 	dev->msi = !pci_enable_msi(dev->pdev);
971 
972 	dev->aac_msix[0].vector_no = 0;
973 	dev->aac_msix[0].dev = dev;
974 
975 	if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
976 			IRQF_SHARED, "aacraid", &(dev->aac_msix[0]))  < 0) {
977 
978 		if (dev->msi)
979 			pci_disable_msi(dev->pdev);
980 
981 		printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
982 			name, instance);
983 		goto error_iounmap;
984 	}
985 	dev->dbg_base = pci_resource_start(dev->pdev, 2);
986 	dev->dbg_base_mapped = dev->regs.src.bar1;
987 	dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
988 	dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
989 
990 	aac_adapter_enable_int(dev);
991 
992 	if (!dev->sync_mode) {
993 		/*
994 		 * Tell the adapter that all is configured, and it can
995 		 * start accepting requests
996 		 */
997 		aac_src_start_adapter(dev);
998 	}
999 	return 0;
1000 
1001 error_iounmap:
1002 
1003 	return -1;
1004 }
1005 
1006 static int aac_src_wait_sync(struct aac_dev *dev, int *status)
1007 {
1008 	unsigned long start = jiffies;
1009 	unsigned long usecs = 0;
1010 	int delay = 5 * HZ;
1011 	int rc = 1;
1012 
1013 	while (time_before(jiffies, start+delay)) {
1014 		/*
1015 		 * Delay 5 microseconds to let Mon960 get info.
1016 		 */
1017 		udelay(5);
1018 
1019 		/*
1020 		 * Mon960 will set doorbell0 bit when it has completed the
1021 		 * command.
1022 		 */
1023 		if (aac_src_get_sync_status(dev) & OUTBOUNDDOORBELL_0) {
1024 			/*
1025 			 * Clear: the doorbell.
1026 			 */
1027 			if (dev->msi_enabled)
1028 				aac_src_access_devreg(dev, AAC_CLEAR_SYNC_BIT);
1029 			else
1030 				src_writel(dev, MUnit.ODR_C,
1031 					OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
1032 			rc = 0;
1033 
1034 			break;
1035 		}
1036 
1037 		/*
1038 		 * Yield the processor in case we are slow
1039 		 */
1040 		usecs = 1 * USEC_PER_MSEC;
1041 		usleep_range(usecs, usecs + 50);
1042 	}
1043 	/*
1044 	 * Pull the synch status from Mailbox 0.
1045 	 */
1046 	if (status && !rc) {
1047 		status[0] = readl(&dev->IndexRegs->Mailbox[0]);
1048 		status[1] = readl(&dev->IndexRegs->Mailbox[1]);
1049 		status[2] = readl(&dev->IndexRegs->Mailbox[2]);
1050 		status[3] = readl(&dev->IndexRegs->Mailbox[3]);
1051 		status[4] = readl(&dev->IndexRegs->Mailbox[4]);
1052 	}
1053 
1054 	return rc;
1055 }
1056 
1057 /**
1058  *  aac_src_soft_reset	-	perform soft reset to speed up
1059  *  access
1060  *
1061  *  Assumptions: That the controller is in a state where we can
1062  *  bring it back to life with an init struct. We can only use
1063  *  fast sync commands, as the timeout is 5 seconds.
1064  *
1065  *  @dev: device to configure
1066  *
1067  */
1068 
1069 static int aac_src_soft_reset(struct aac_dev *dev)
1070 {
1071 	u32 status_omr = src_readl(dev, MUnit.OMR);
1072 	u32 status[5];
1073 	int rc = 1;
1074 	int state = 0;
1075 	char *state_str[7] = {
1076 		"GET_ADAPTER_PROPERTIES Failed",
1077 		"GET_ADAPTER_PROPERTIES timeout",
1078 		"SOFT_RESET not supported",
1079 		"DROP_IO Failed",
1080 		"DROP_IO timeout",
1081 		"Check Health failed"
1082 	};
1083 
1084 	if (status_omr == INVALID_OMR)
1085 		return 1;       // pcie hosed
1086 
1087 	if (!(status_omr & KERNEL_UP_AND_RUNNING))
1088 		return 1;       // not up and running
1089 
1090 	/*
1091 	 * We go into soft reset mode to allow us to handle response
1092 	 */
1093 	dev->in_soft_reset = 1;
1094 	dev->msi_enabled = status_omr & AAC_INT_MODE_MSIX;
1095 
1096 	/* Get adapter properties */
1097 	rc = aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, 0, 0, 0,
1098 		0, 0, 0, status+0, status+1, status+2, status+3, status+4);
1099 	if (rc)
1100 		goto out;
1101 
1102 	state++;
1103 	if (aac_src_wait_sync(dev, status)) {
1104 		rc = 1;
1105 		goto out;
1106 	}
1107 
1108 	state++;
1109 	if (!(status[1] & le32_to_cpu(AAC_OPT_EXTENDED) &&
1110 		(status[4] & le32_to_cpu(AAC_EXTOPT_SOFT_RESET)))) {
1111 		rc = 2;
1112 		goto out;
1113 	}
1114 
1115 	if ((status[1] & le32_to_cpu(AAC_OPT_EXTENDED)) &&
1116 		(status[4] & le32_to_cpu(AAC_EXTOPT_SA_FIRMWARE)))
1117 		dev->sa_firmware = 1;
1118 
1119 	state++;
1120 	rc = aac_adapter_sync_cmd(dev, DROP_IO, 0, 0, 0, 0, 0, 0,
1121 		 status+0, status+1, status+2, status+3, status+4);
1122 
1123 	if (rc)
1124 		goto out;
1125 
1126 	state++;
1127 	if (aac_src_wait_sync(dev, status)) {
1128 		rc = 3;
1129 		goto out;
1130 	}
1131 
1132 	if (status[1])
1133 		dev_err(&dev->pdev->dev, "%s: %d outstanding I/O pending\n",
1134 			__func__, status[1]);
1135 
1136 	state++;
1137 	rc = aac_src_check_health(dev);
1138 
1139 out:
1140 	dev->in_soft_reset = 0;
1141 	dev->msi_enabled = 0;
1142 	if (rc)
1143 		dev_err(&dev->pdev->dev, "%s: %s status = %d", __func__,
1144 			state_str[state], rc);
1145 
1146 	return rc;
1147 }
1148 /**
1149  *  aac_srcv_init	-	initialize an SRCv card
1150  *  @dev: device to configure
1151  *
1152  */
1153 
1154 int aac_srcv_init(struct aac_dev *dev)
1155 {
1156 	unsigned long start;
1157 	unsigned long status;
1158 	int restart = 0;
1159 	int instance = dev->id;
1160 	const char *name = dev->name;
1161 
1162 	dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
1163 	dev->a_ops.adapter_comm = aac_src_select_comm;
1164 
1165 	dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
1166 	if (aac_adapter_ioremap(dev, dev->base_size)) {
1167 		printk(KERN_WARNING "%s: unable to map adapter.\n", name);
1168 		goto error_iounmap;
1169 	}
1170 
1171 	/* Failure to reset here is an option ... */
1172 	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
1173 	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
1174 
1175 	if (dev->init_reset) {
1176 		dev->init_reset = false;
1177 		if (aac_src_soft_reset(dev)) {
1178 			aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET);
1179 			++restart;
1180 		}
1181 	}
1182 
1183 	/*
1184 	 *	Check to see if flash update is running.
1185 	 *	Wait for the adapter to be up and running. Wait up to 5 minutes
1186 	 */
1187 	status = src_readl(dev, MUnit.OMR);
1188 	if (status & FLASH_UPD_PENDING) {
1189 		start = jiffies;
1190 		do {
1191 			status = src_readl(dev, MUnit.OMR);
1192 			if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) {
1193 				printk(KERN_ERR "%s%d: adapter flash update failed.\n",
1194 					dev->name, instance);
1195 				goto error_iounmap;
1196 			}
1197 		} while (!(status & FLASH_UPD_SUCCESS) &&
1198 			 !(status & FLASH_UPD_FAILED));
1199 		/* Delay 10 seconds.
1200 		 * Because right now FW is doing a soft reset,
1201 		 * do not read scratch pad register at this time
1202 		 */
1203 		ssleep(10);
1204 	}
1205 	/*
1206 	 *	Check to see if the board panic'd while booting.
1207 	 */
1208 	status = src_readl(dev, MUnit.OMR);
1209 	if (status & KERNEL_PANIC) {
1210 		if (aac_src_restart_adapter(dev,
1211 			aac_src_check_health(dev), IOP_HWSOFT_RESET))
1212 			goto error_iounmap;
1213 		++restart;
1214 	}
1215 	/*
1216 	 *	Check to see if the board failed any self tests.
1217 	 */
1218 	status = src_readl(dev, MUnit.OMR);
1219 	if (status & SELF_TEST_FAILED) {
1220 		printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
1221 		goto error_iounmap;
1222 	}
1223 	/*
1224 	 *	Check to see if the monitor panic'd while booting.
1225 	 */
1226 	if (status & MONITOR_PANIC) {
1227 		printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
1228 		goto error_iounmap;
1229 	}
1230 
1231 	start = jiffies;
1232 	/*
1233 	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
1234 	 */
1235 	do {
1236 		status = src_readl(dev, MUnit.OMR);
1237 		if (status == INVALID_OMR)
1238 			status = 0;
1239 
1240 		if ((restart &&
1241 		  (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
1242 		  time_after(jiffies, start+HZ*startup_timeout)) {
1243 			printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
1244 					dev->name, instance, status);
1245 			goto error_iounmap;
1246 		}
1247 		if (!restart &&
1248 		  ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
1249 		  time_after(jiffies, start + HZ *
1250 		  ((startup_timeout > 60)
1251 		    ? (startup_timeout - 60)
1252 		    : (startup_timeout / 2))))) {
1253 			if (likely(!aac_src_restart_adapter(dev,
1254 				aac_src_check_health(dev), IOP_HWSOFT_RESET)))
1255 				start = jiffies;
1256 			++restart;
1257 		}
1258 		msleep(1);
1259 	} while (!(status & KERNEL_UP_AND_RUNNING));
1260 
1261 	if (restart && aac_commit)
1262 		aac_commit = 1;
1263 	/*
1264 	 *	Fill in the common function dispatch table.
1265 	 */
1266 	dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
1267 	dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
1268 	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
1269 	dev->a_ops.adapter_notify = aac_src_notify_adapter;
1270 	dev->a_ops.adapter_sync_cmd = src_sync_cmd;
1271 	dev->a_ops.adapter_check_health = aac_src_check_health;
1272 	dev->a_ops.adapter_restart = aac_src_restart_adapter;
1273 	dev->a_ops.adapter_start = aac_src_start_adapter;
1274 
1275 	/*
1276 	 *	First clear out all interrupts.  Then enable the one's that we
1277 	 *	can handle.
1278 	 */
1279 	aac_adapter_comm(dev, AAC_COMM_MESSAGE);
1280 	aac_adapter_disable_int(dev);
1281 	src_writel(dev, MUnit.ODR_C, 0xffffffff);
1282 	aac_adapter_enable_int(dev);
1283 
1284 	if (aac_init_adapter(dev) == NULL)
1285 		goto error_iounmap;
1286 	if ((dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) &&
1287 		(dev->comm_interface != AAC_COMM_MESSAGE_TYPE3))
1288 		goto error_iounmap;
1289 	if (dev->msi_enabled)
1290 		aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
1291 
1292 	if (aac_acquire_irq(dev))
1293 		goto error_iounmap;
1294 
1295 	dev->dbg_base = pci_resource_start(dev->pdev, 2);
1296 	dev->dbg_base_mapped = dev->regs.src.bar1;
1297 	dev->dbg_size = AAC_MIN_SRCV_BAR1_SIZE;
1298 	dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
1299 
1300 	aac_adapter_enable_int(dev);
1301 
1302 	if (!dev->sync_mode) {
1303 		/*
1304 		 * Tell the adapter that all is configured, and it can
1305 		 * start accepting requests
1306 		 */
1307 		aac_src_start_adapter(dev);
1308 	}
1309 	return 0;
1310 
1311 error_iounmap:
1312 
1313 	return -1;
1314 }
1315 
1316 void aac_src_access_devreg(struct aac_dev *dev, int mode)
1317 {
1318 	u_int32_t val;
1319 
1320 	switch (mode) {
1321 	case AAC_ENABLE_INTERRUPT:
1322 		src_writel(dev,
1323 			   MUnit.OIMR,
1324 			   dev->OIMR = (dev->msi_enabled ?
1325 					AAC_INT_ENABLE_TYPE1_MSIX :
1326 					AAC_INT_ENABLE_TYPE1_INTX));
1327 		break;
1328 
1329 	case AAC_DISABLE_INTERRUPT:
1330 		src_writel(dev,
1331 			   MUnit.OIMR,
1332 			   dev->OIMR = AAC_INT_DISABLE_ALL);
1333 		break;
1334 
1335 	case AAC_ENABLE_MSIX:
1336 		/* set bit 6 */
1337 		val = src_readl(dev, MUnit.IDR);
1338 		val |= 0x40;
1339 		src_writel(dev,  MUnit.IDR, val);
1340 		src_readl(dev, MUnit.IDR);
1341 		/* unmask int. */
1342 		val = PMC_ALL_INTERRUPT_BITS;
1343 		src_writel(dev, MUnit.IOAR, val);
1344 		val = src_readl(dev, MUnit.OIMR);
1345 		src_writel(dev,
1346 			   MUnit.OIMR,
1347 			   val & (~(PMC_GLOBAL_INT_BIT2 | PMC_GLOBAL_INT_BIT0)));
1348 		break;
1349 
1350 	case AAC_DISABLE_MSIX:
1351 		/* reset bit 6 */
1352 		val = src_readl(dev, MUnit.IDR);
1353 		val &= ~0x40;
1354 		src_writel(dev, MUnit.IDR, val);
1355 		src_readl(dev, MUnit.IDR);
1356 		break;
1357 
1358 	case AAC_CLEAR_AIF_BIT:
1359 		/* set bit 5 */
1360 		val = src_readl(dev, MUnit.IDR);
1361 		val |= 0x20;
1362 		src_writel(dev, MUnit.IDR, val);
1363 		src_readl(dev, MUnit.IDR);
1364 		break;
1365 
1366 	case AAC_CLEAR_SYNC_BIT:
1367 		/* set bit 4 */
1368 		val = src_readl(dev, MUnit.IDR);
1369 		val |= 0x10;
1370 		src_writel(dev, MUnit.IDR, val);
1371 		src_readl(dev, MUnit.IDR);
1372 		break;
1373 
1374 	case AAC_ENABLE_INTX:
1375 		/* set bit 7 */
1376 		val = src_readl(dev, MUnit.IDR);
1377 		val |= 0x80;
1378 		src_writel(dev, MUnit.IDR, val);
1379 		src_readl(dev, MUnit.IDR);
1380 		/* unmask int. */
1381 		val = PMC_ALL_INTERRUPT_BITS;
1382 		src_writel(dev, MUnit.IOAR, val);
1383 		src_readl(dev, MUnit.IOAR);
1384 		val = src_readl(dev, MUnit.OIMR);
1385 		src_writel(dev, MUnit.OIMR,
1386 				val & (~(PMC_GLOBAL_INT_BIT2)));
1387 		break;
1388 
1389 	default:
1390 		break;
1391 	}
1392 }
1393 
1394 static int aac_src_get_sync_status(struct aac_dev *dev)
1395 {
1396 	int msix_val = 0;
1397 	int legacy_val = 0;
1398 
1399 	msix_val = src_readl(dev, MUnit.ODR_MSI) & SRC_MSI_READ_MASK ? 1 : 0;
1400 
1401 	if (!dev->msi_enabled) {
1402 		/*
1403 		 * if Legacy int status indicates cmd is not complete
1404 		 * sample MSIx register to see if it indiactes cmd complete,
1405 		 * if yes set the controller in MSIx mode and consider cmd
1406 		 * completed
1407 		 */
1408 		legacy_val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT;
1409 		if (!(legacy_val & 1) && msix_val)
1410 			dev->msi_enabled = 1;
1411 		return legacy_val;
1412 	}
1413 
1414 	return msix_val;
1415 }
1416