Lines Matching +full:num +full:- +full:irq +full:- +full:priority +full:- +full:bits
1 // SPDX-License-Identifier: GPL-2.0-or-later
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)
42 * fib_map_alloc - allocate the fib objects
51 dev->max_cmd_size = AAC_MAX_NATIVE_SIZE; in fib_map_alloc()
55 &dev->pdev->dev, dev->max_cmd_size, dev->scsi_host_ptr->can_queue, in fib_map_alloc()
56 AAC_NUM_MGT_FIB, &dev->hw_fib_pa)); in fib_map_alloc()
57 dev->hw_fib_va = dma_alloc_coherent(&dev->pdev->dev, in fib_map_alloc()
58 (dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)) in fib_map_alloc()
59 * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) + (ALIGN32 - 1), in fib_map_alloc()
60 &dev->hw_fib_pa, GFP_KERNEL); in fib_map_alloc()
61 if (dev->hw_fib_va == NULL) in fib_map_alloc()
62 return -ENOMEM; in fib_map_alloc()
67 * aac_fib_map_free - free the fib objects
80 if(!dev->hw_fib_va || !dev->max_cmd_size) in aac_fib_map_free()
83 num_fibs = dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB; in aac_fib_map_free()
84 fib_size = dev->max_fib_size + sizeof(struct aac_fib_xporthdr); in aac_fib_map_free()
85 alloc_size = fib_size * num_fibs + ALIGN32 - 1; in aac_fib_map_free()
87 dma_free_coherent(&dev->pdev->dev, alloc_size, dev->hw_fib_va, in aac_fib_map_free()
88 dev->hw_fib_pa); in aac_fib_map_free()
90 dev->hw_fib_va = NULL; in aac_fib_map_free()
91 dev->hw_fib_pa = 0; in aac_fib_map_free()
100 for (i = 0, fibptr = &dev->fibs[i]; in aac_fib_vector_assign()
101 i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_fib_vector_assign()
103 if ((dev->max_msix == 1) || in aac_fib_vector_assign()
104 (i > ((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1) in aac_fib_vector_assign()
105 - dev->vector_cap))) { in aac_fib_vector_assign()
106 fibptr->vector_no = 0; in aac_fib_vector_assign()
108 fibptr->vector_no = vector; in aac_fib_vector_assign()
110 if (vector == dev->max_msix) in aac_fib_vector_assign()
117 * aac_fib_setup - setup the fibs
132 while (((i = fib_map_alloc(dev)) == -ENOMEM) in aac_fib_setup()
133 && (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) { in aac_fib_setup()
134 max_cmds = (dev->scsi_host_ptr->can_queue+AAC_NUM_MGT_FIB) >> 1; in aac_fib_setup()
135 dev->scsi_host_ptr->can_queue = max_cmds - AAC_NUM_MGT_FIB; in aac_fib_setup()
136 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) in aac_fib_setup()
137 dev->init->r7.max_io_commands = cpu_to_le32(max_cmds); in aac_fib_setup()
140 return -ENOMEM; in aac_fib_setup()
142 memset(dev->hw_fib_va, 0, in aac_fib_setup()
143 (dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)) * in aac_fib_setup()
144 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)); in aac_fib_setup()
147 hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1); in aac_fib_setup()
148 hw_fib = (struct hw_fib *)((unsigned char *)dev->hw_fib_va + in aac_fib_setup()
149 (hw_fib_pa - dev->hw_fib_pa)); in aac_fib_setup()
159 for (i = 0, fibptr = &dev->fibs[i]; in aac_fib_setup()
160 i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_fib_setup()
163 fibptr->flags = 0; in aac_fib_setup()
164 fibptr->size = sizeof(struct fib); in aac_fib_setup()
165 fibptr->dev = dev; in aac_fib_setup()
166 fibptr->hw_fib_va = hw_fib; in aac_fib_setup()
167 fibptr->data = (void *) fibptr->hw_fib_va->data; in aac_fib_setup()
168 fibptr->next = fibptr+1; /* Forward chain the fibs */ in aac_fib_setup()
169 init_completion(&fibptr->event_wait); in aac_fib_setup()
170 spin_lock_init(&fibptr->event_lock); in aac_fib_setup()
171 hw_fib->header.XferState = cpu_to_le32(0xffffffff); in aac_fib_setup()
172 hw_fib->header.SenderSize = in aac_fib_setup()
173 cpu_to_le16(dev->max_fib_size); /* ?? max_cmd_size */ in aac_fib_setup()
174 fibptr->hw_fib_pa = hw_fib_pa; in aac_fib_setup()
175 fibptr->hw_sgl_pa = hw_fib_pa + in aac_fib_setup()
181 fibptr->hw_error_pa = hw_fib_pa + in aac_fib_setup()
185 dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)); in aac_fib_setup()
187 dev->max_cmd_size + sizeof(struct aac_fib_xporthdr); in aac_fib_setup()
198 dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL; in aac_fib_setup()
202 dev->free_fib = &dev->fibs[dev->scsi_host_ptr->can_queue]; in aac_fib_setup()
207 * aac_fib_alloc_tag-allocate a fib using tags
219 fibptr = &dev->fibs[scsi_cmd_to_rq(scmd)->tag]; in aac_fib_alloc_tag()
224 fibptr->hw_fib_va->header.XferState = 0; in aac_fib_alloc_tag()
225 fibptr->type = FSAFS_NTC_FIB_CONTEXT; in aac_fib_alloc_tag()
226 fibptr->callback_data = NULL; in aac_fib_alloc_tag()
227 fibptr->callback = NULL; in aac_fib_alloc_tag()
228 fibptr->flags = 0; in aac_fib_alloc_tag()
234 * aac_fib_alloc - allocate a fib
245 spin_lock_irqsave(&dev->fib_lock, flags); in aac_fib_alloc()
246 fibptr = dev->free_fib; in aac_fib_alloc()
248 spin_unlock_irqrestore(&dev->fib_lock, flags); in aac_fib_alloc()
251 dev->free_fib = fibptr->next; in aac_fib_alloc()
252 spin_unlock_irqrestore(&dev->fib_lock, flags); in aac_fib_alloc()
256 fibptr->type = FSAFS_NTC_FIB_CONTEXT; in aac_fib_alloc()
257 fibptr->size = sizeof(struct fib); in aac_fib_alloc()
262 fibptr->hw_fib_va->header.XferState = 0; in aac_fib_alloc()
263 fibptr->flags = 0; in aac_fib_alloc()
264 fibptr->callback = NULL; in aac_fib_alloc()
265 fibptr->callback_data = NULL; in aac_fib_alloc()
271 * aac_fib_free - free a fib
281 if (fibptr->done == 2) in aac_fib_free()
284 spin_lock_irqsave(&fibptr->dev->fib_lock, flags); in aac_fib_free()
285 if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_fib_free()
287 if (!(fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) && in aac_fib_free()
288 fibptr->hw_fib_va->header.XferState != 0) { in aac_fib_free()
291 le32_to_cpu(fibptr->hw_fib_va->header.XferState)); in aac_fib_free()
293 fibptr->next = fibptr->dev->free_fib; in aac_fib_free()
294 fibptr->dev->free_fib = fibptr; in aac_fib_free()
295 spin_unlock_irqrestore(&fibptr->dev->fib_lock, flags); in aac_fib_free()
299 * aac_fib_init - initialise a fib
307 struct hw_fib *hw_fib = fibptr->hw_fib_va; in aac_fib_init()
309 memset(&hw_fib->header, 0, sizeof(struct aac_fibhdr)); in aac_fib_init()
310 hw_fib->header.StructType = FIB_MAGIC; in aac_fib_init()
311 hw_fib->header.Size = cpu_to_le16(fibptr->dev->max_fib_size); in aac_fib_init()
312 …hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable… in aac_fib_init()
313 hw_fib->header.u.ReceiverFibAddress = cpu_to_le32(fibptr->hw_fib_pa); in aac_fib_init()
314 hw_fib->header.SenderSize = cpu_to_le16(fibptr->dev->max_fib_size); in aac_fib_init()
318 * fib_dealloc - deallocate a fib
327 struct hw_fib *hw_fib = fibptr->hw_fib_va; in fib_dealloc()
328 hw_fib->header.XferState = 0; in fib_dealloc()
339 * aac_get_entry - get a queue entry
346 * With a priority the routine returns a queue entry if the queue has free entries. If the queue
360 * the high bits in all updates but this is a bit faster I think. in aac_get_entry()
363 q = &dev->queues->queue[qid]; in aac_get_entry()
365 idx = *index = le32_to_cpu(*(q->headers.producer)); in aac_get_entry()
367 if (idx != le32_to_cpu(*(q->headers.consumer))) { in aac_get_entry()
368 if (--idx == 0) { in aac_get_entry()
374 if (idx != le32_to_cpu(*(q->headers.consumer))) in aac_get_entry()
387 if ((*index + 1) == le32_to_cpu(*(q->headers.consumer))) { in aac_get_entry()
389 qid, atomic_read(&q->numpending)); in aac_get_entry()
392 *entry = q->base + *index; in aac_get_entry()
398 * aac_queue_get - get the next free QE
426 entry->size = cpu_to_le32(le16_to_cpu(hw_fib->header.Size)); in aac_queue_get()
435 entry->size = cpu_to_le32(le16_to_cpu(hw_fib->header.Size)); in aac_queue_get()
436 entry->addr = hw_fib->header.SenderFibAddress; in aac_queue_get()
438 …hw_fib->header.u.ReceiverFibAddress = hw_fib->header.SenderFibAddress; /* Let the adapter now whe… in aac_queue_get()
446 entry->addr = cpu_to_le32(fibptr->hw_fib_pa); in aac_queue_get()
459 * aac_fib_send - send a fib to the adapter
463 * @priority: Priority of Fib
476 int priority, int wait, int reply, fib_callback callback, in aac_fib_send() argument
479 struct aac_dev * dev = fibptr->dev; in aac_fib_send()
480 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_send()
485 if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) in aac_fib_send()
486 return -EBUSY; in aac_fib_send()
488 if (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed)) in aac_fib_send()
489 return -EINVAL; in aac_fib_send()
502 fibptr->flags = 0; in aac_fib_send()
504 return -EINVAL; in aac_fib_send()
506 hw_fib->header.XferState |= cpu_to_le32(Async | ResponseExpected); in aac_fib_send()
509 hw_fib->header.XferState |= cpu_to_le32(NoResponseExpected); in aac_fib_send()
512 hw_fib->header.XferState |= cpu_to_le32(ResponseExpected); in aac_fib_send()
516 * Map the fib into 32bits by using the fib number in aac_fib_send()
519 hw_fib->header.SenderFibAddress = in aac_fib_send()
520 cpu_to_le32(((u32)(fibptr - dev->fibs)) << 2); in aac_fib_send()
525 hw_fib->header.Handle = in aac_fib_send()
526 cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1); in aac_fib_send()
535 hw_fib->header.Command = cpu_to_le16(command); in aac_fib_send()
536 hw_fib->header.XferState |= cpu_to_le32(SentFromHost); in aac_fib_send()
540 hw_fib->header.Size = cpu_to_le16(sizeof(struct aac_fibhdr) + size); in aac_fib_send()
541 if (le16_to_cpu(hw_fib->header.Size) > le16_to_cpu(hw_fib->header.SenderSize)) { in aac_fib_send()
542 return -EMSGSIZE; in aac_fib_send()
548 hw_fib->header.XferState |= cpu_to_le32(NormalPriority); in aac_fib_send()
555 fibptr->callback = callback; in aac_fib_send()
556 fibptr->callback_data = callback_data; in aac_fib_send()
557 fibptr->flags = FIB_CONTEXT_FLAG; in aac_fib_send()
560 fibptr->done = 0; in aac_fib_send()
565 dprintk((KERN_DEBUG " Command = %d.\n", le32_to_cpu(hw_fib->header.Command))); in aac_fib_send()
566 …bCommand = %d.\n", le32_to_cpu(((struct aac_query_mount *)fib_data(fibptr))->command))); in aac_fib_send()
567 dprintk((KERN_DEBUG " XferState = %x.\n", le32_to_cpu(hw_fib->header.XferState))); in aac_fib_send()
568 dprintk((KERN_DEBUG " hw_fib va being sent=%p\n",fibptr->hw_fib_va)); in aac_fib_send()
569 dprintk((KERN_DEBUG " hw_fib pa being sent=%lx\n",(ulong)fibptr->hw_fib_pa)); in aac_fib_send()
572 if (!dev->queues) in aac_fib_send()
573 return -EBUSY; in aac_fib_send()
577 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_fib_send()
578 if (dev->management_fib_count >= AAC_NUM_MGT_FIB) { in aac_fib_send()
580 dev->management_fib_count); in aac_fib_send()
581 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
582 return -EBUSY; in aac_fib_send()
584 dev->management_fib_count++; in aac_fib_send()
585 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
586 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_fib_send()
589 if (dev->sync_mode) { in aac_fib_send()
591 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
592 spin_lock_irqsave(&dev->sync_lock, sflags); in aac_fib_send()
593 if (dev->sync_fib) { in aac_fib_send()
594 list_add_tail(&fibptr->fiblink, &dev->sync_fib_list); in aac_fib_send()
595 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_fib_send()
597 dev->sync_fib = fibptr; in aac_fib_send()
598 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_fib_send()
600 (u32)fibptr->hw_fib_pa, 0, 0, 0, 0, 0, in aac_fib_send()
604 fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; in aac_fib_send()
605 if (wait_for_completion_interruptible(&fibptr->event_wait)) { in aac_fib_send()
606 fibptr->flags &= ~FIB_CONTEXT_FLAG_WAIT; in aac_fib_send()
607 return -EFAULT; in aac_fib_send()
611 return -EINPROGRESS; in aac_fib_send()
615 printk(KERN_ERR "aac_fib_send: returned -EBUSY\n"); in aac_fib_send()
617 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
618 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_fib_send()
619 dev->management_fib_count--; in aac_fib_send()
620 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
622 return -EBUSY; in aac_fib_send()
631 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
641 while (!try_wait_for_completion(&fibptr->event_wait)) { in aac_fib_send()
644 struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; in aac_fib_send()
645 atomic_dec(&q->numpending); in aac_fib_send()
646 if (wait == -1) { in aac_fib_send()
652 return -ETIMEDOUT; in aac_fib_send()
656 return -EFAULT; in aac_fib_send()
659 if (wait == -1) { in aac_fib_send()
664 return -EFAULT; in aac_fib_send()
671 } else if (wait_for_completion_interruptible(&fibptr->event_wait)) { in aac_fib_send()
676 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_fib_send()
677 if (fibptr->done == 0) { in aac_fib_send()
678 fibptr->done = 2; /* Tell interrupt we aborted */ in aac_fib_send()
679 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
680 return -ERESTARTSYS; in aac_fib_send()
682 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
683 BUG_ON(fibptr->done == 0); in aac_fib_send()
685 if(unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_fib_send()
686 return -ETIMEDOUT; in aac_fib_send()
694 return -EINPROGRESS; in aac_fib_send()
702 struct aac_dev *dev = fibptr->dev; in aac_hba_send()
707 fibptr->hw_fib_va; in aac_hba_send()
709 fibptr->flags = (FIB_CONTEXT_FLAG | FIB_CONTEXT_FLAG_NATIVE_HBA); in aac_hba_send()
712 fibptr->callback = callback; in aac_hba_send()
713 fibptr->callback_data = callback_data; in aac_hba_send()
718 hbacmd->iu_type = command; in aac_hba_send()
722 hbacmd->request_id = in aac_hba_send()
723 cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1); in aac_hba_send()
724 fibptr->flags |= FIB_CONTEXT_FLAG_SCSI_CMD; in aac_hba_send()
726 return -EINVAL; in aac_hba_send()
730 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_hba_send()
731 if (dev->management_fib_count >= AAC_NUM_MGT_FIB) { in aac_hba_send()
732 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
733 return -EBUSY; in aac_hba_send()
735 dev->management_fib_count++; in aac_hba_send()
736 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
737 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_hba_send()
742 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
743 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_hba_send()
744 dev->management_fib_count--; in aac_hba_send()
745 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
747 return -EBUSY; in aac_hba_send()
753 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
756 return -EFAULT; in aac_hba_send()
758 fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; in aac_hba_send()
759 if (wait_for_completion_interruptible(&fibptr->event_wait)) in aac_hba_send()
760 fibptr->done = 2; in aac_hba_send()
761 fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT); in aac_hba_send()
763 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_hba_send()
764 if ((fibptr->done == 0) || (fibptr->done == 2)) { in aac_hba_send()
765 fibptr->done = 2; /* Tell interrupt we aborted */ in aac_hba_send()
766 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
767 return -ERESTARTSYS; in aac_hba_send()
769 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
770 WARN_ON(fibptr->done == 0); in aac_hba_send()
772 if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_hba_send()
773 return -ETIMEDOUT; in aac_hba_send()
778 return -EINPROGRESS; in aac_hba_send()
782 * aac_consumer_get - get the top of the queue
796 if (le32_to_cpu(*q->headers.producer) == le32_to_cpu(*q->headers.consumer)) { in aac_consumer_get()
804 if (le32_to_cpu(*q->headers.consumer) >= q->entries) in aac_consumer_get()
807 index = le32_to_cpu(*q->headers.consumer); in aac_consumer_get()
808 *entry = q->base + index; in aac_consumer_get()
815 * aac_consumer_free - free consumer entry
829 if ((le32_to_cpu(*q->headers.producer)+1) == le32_to_cpu(*q->headers.consumer)) in aac_consumer_free()
832 if (le32_to_cpu(*q->headers.consumer) >= q->entries) in aac_consumer_free()
833 *q->headers.consumer = cpu_to_le32(1); in aac_consumer_free()
835 le32_add_cpu(q->headers.consumer, 1); in aac_consumer_free()
855 * aac_fib_adapter_complete - complete adapter issued fib
865 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_adapter_complete()
866 struct aac_dev * dev = fibptr->dev; in aac_fib_adapter_complete()
871 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_fib_adapter_complete()
872 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_fib_adapter_complete()
873 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_fib_adapter_complete()
878 if (hw_fib->header.XferState == 0) { in aac_fib_adapter_complete()
879 if (dev->comm_interface == AAC_COMM_MESSAGE) in aac_fib_adapter_complete()
886 if (hw_fib->header.StructType != FIB_MAGIC && in aac_fib_adapter_complete()
887 hw_fib->header.StructType != FIB_MAGIC2 && in aac_fib_adapter_complete()
888 hw_fib->header.StructType != FIB_MAGIC2_64) { in aac_fib_adapter_complete()
889 if (dev->comm_interface == AAC_COMM_MESSAGE) in aac_fib_adapter_complete()
891 return -EINVAL; in aac_fib_adapter_complete()
900 if (hw_fib->header.XferState & cpu_to_le32(SentFromAdapter)) { in aac_fib_adapter_complete()
901 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_fib_adapter_complete()
905 hw_fib->header.XferState |= cpu_to_le32(HostProcessed); in aac_fib_adapter_complete()
908 if (size > le16_to_cpu(hw_fib->header.SenderSize)) in aac_fib_adapter_complete()
909 return -EMSGSIZE; in aac_fib_adapter_complete()
910 hw_fib->header.Size = cpu_to_le16(size); in aac_fib_adapter_complete()
912 q = &dev->queues->queue[AdapNormRespQueue]; in aac_fib_adapter_complete()
913 spin_lock_irqsave(q->lock, qflags); in aac_fib_adapter_complete()
915 *(q->headers.producer) = cpu_to_le32(index + 1); in aac_fib_adapter_complete()
916 spin_unlock_irqrestore(q->lock, qflags); in aac_fib_adapter_complete()
929 * aac_fib_complete - fib completion handler
937 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_complete()
939 if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) { in aac_fib_complete()
949 if (hw_fib->header.XferState == 0 || fibptr->done == 2) in aac_fib_complete()
955 if (hw_fib->header.StructType != FIB_MAGIC && in aac_fib_complete()
956 hw_fib->header.StructType != FIB_MAGIC2 && in aac_fib_complete()
957 hw_fib->header.StructType != FIB_MAGIC2_64) in aac_fib_complete()
958 return -EINVAL; in aac_fib_complete()
966 if((hw_fib->header.XferState & cpu_to_le32(SentFromHost)) && in aac_fib_complete()
967 (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed))) in aac_fib_complete()
971 else if(hw_fib->header.XferState & cpu_to_le32(SentFromHost)) in aac_fib_complete()
978 } else if(hw_fib->header.XferState & cpu_to_le32(HostOwned)) { in aac_fib_complete()
987 * aac_printf - handle printf from firmware
997 char *cp = dev->printfbuf; in aac_printf()
998 if (dev->printf_enabled) in aac_printf()
1012 printk(KERN_WARNING "%s:%s", dev->name, cp); in aac_printf()
1014 printk(KERN_INFO "%s:%s", dev->name, cp); in aac_printf()
1021 return le32_to_cpu(((__le32 *)aifcmd->data)[index]); in aac_aif_data()
1030 dev_info(&dev->pdev->dev, "Backup unit had cache data loss - [%d]\n", in aac_handle_aif_bu()
1033 dev_info(&dev->pdev->dev, "Backup Unit had cache data loss\n"); in aac_handle_aif_bu()
1037 dev_info(&dev->pdev->dev, "DDR cache data recovered successfully - [%d]\n", in aac_handle_aif_bu()
1040 dev_info(&dev->pdev->dev, "DDR cache data recovered successfully\n"); in aac_handle_aif_bu()
1047 * aac_handle_aif - Handle a message from the firmware
1056 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_handle_aif()
1057 struct aac_aifcmd * aifcmd = (struct aac_aifcmd *)hw_fib->data; in aac_handle_aif()
1069 if (!dev || !dev->fsa_dev) in aac_handle_aif()
1071 container = channel = id = lun = (u32)-1; in aac_handle_aif()
1075 * re-configures that take place. As a result of this when in aac_handle_aif()
1077 * type of AIF before setting the re-config flag. in aac_handle_aif()
1079 switch (le32_to_cpu(aifcmd->command)) { in aac_handle_aif()
1081 switch (le32_to_cpu(((__le32 *)aifcmd->data)[0])) { in aac_handle_aif()
1083 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1085 container = (u32)-1; in aac_handle_aif()
1089 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1090 container = (u32)-1; in aac_handle_aif()
1094 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1095 container = (u32)-1; in aac_handle_aif()
1099 container = (u32)-1; in aac_handle_aif()
1109 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1110 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1116 * so set the flag to initiate a new re-config once we in aac_handle_aif()
1120 if ((dev != NULL) && (dev->scsi_host_ptr != NULL)) { in aac_handle_aif()
1121 device = scsi_device_lookup(dev->scsi_host_ptr, in aac_handle_aif()
1126 dev->fsa_dev[container].config_needed = CHANGE; in aac_handle_aif()
1127 dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; in aac_handle_aif()
1128 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1136 * that thing then set the re-configure flag. in aac_handle_aif()
1138 if (container != (u32)-1) { in aac_handle_aif()
1139 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1141 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1142 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1143 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1144 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1146 container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1147 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1148 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1149 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1150 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1155 switch (le32_to_cpu(((__le32 *)aifcmd->data)[0])) { in aac_handle_aif()
1157 dev->cache_protected = in aac_handle_aif()
1158 (((__le32 *)aifcmd->data)[1] == cpu_to_le32(3)); in aac_handle_aif()
1164 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1165 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1167 dev->fsa_dev[container].config_needed = ADD; in aac_handle_aif()
1168 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1170 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1177 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1178 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1180 dev->fsa_dev[container].config_needed = DELETE; in aac_handle_aif()
1181 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1183 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1191 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1192 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1194 if (dev->fsa_dev[container].config_waiting_on && in aac_handle_aif()
1195 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1197 dev->fsa_dev[container].config_needed = CHANGE; in aac_handle_aif()
1198 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1200 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1208 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1210 container = (u32)-1; in aac_handle_aif()
1214 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1215 container = (u32)-1; in aac_handle_aif()
1219 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1220 container = (u32)-1; in aac_handle_aif()
1224 container = (u32)-1; in aac_handle_aif()
1227 (((__le32 *)aifcmd->data)[0] == in aac_handle_aif()
1230 device = scsi_device_lookup(dev->scsi_host_ptr, in aac_handle_aif()
1246 if (dev->jbod) in aac_handle_aif()
1248 switch (le32_to_cpu(((__le32 *)aifcmd->data)[3])) { in aac_handle_aif()
1254 ((__le32 *)aifcmd->data)[2]); in aac_handle_aif()
1256 container = (u32)-1; in aac_handle_aif()
1260 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1261 container = (u32)-1; in aac_handle_aif()
1266 container = (u32)-1; in aac_handle_aif()
1267 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1271 dev->maximum_num_channels)) in aac_handle_aif()
1278 ((((__le32 *)aifcmd->data)[3] in aac_handle_aif()
1280 (((__le32 *)aifcmd->data)[3] in aac_handle_aif()
1293 * that thing then set the re-configure flag. in aac_handle_aif()
1295 if (container != (u32)-1) { in aac_handle_aif()
1296 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1298 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1299 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1300 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1301 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1303 container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1304 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1305 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1306 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1307 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1320 if (((__le32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero) && in aac_handle_aif()
1321 (((__le32 *)aifcmd->data)[6] == ((__le32 *)aifcmd->data)[5] || in aac_handle_aif()
1322 ((__le32 *)aifcmd->data)[4] == cpu_to_le32(AifJobStsSuccess))) { in aac_handle_aif()
1324 container < dev->maximum_num_containers; in aac_handle_aif()
1330 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1332 dev->fsa_dev[container].config_needed = ADD; in aac_handle_aif()
1333 dev->fsa_dev[container].config_waiting_stamp = in aac_handle_aif()
1337 if (((__le32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero) && in aac_handle_aif()
1338 ((__le32 *)aifcmd->data)[6] == 0 && in aac_handle_aif()
1339 ((__le32 *)aifcmd->data)[4] == cpu_to_le32(AifJobStsRunning)) { in aac_handle_aif()
1341 container < dev->maximum_num_containers; in aac_handle_aif()
1347 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1349 dev->fsa_dev[container].config_needed = DELETE; in aac_handle_aif()
1350 dev->fsa_dev[container].config_waiting_stamp = in aac_handle_aif()
1360 for (; container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1361 if ((dev->fsa_dev[container].config_waiting_on == 0) && in aac_handle_aif()
1362 (dev->fsa_dev[container].config_needed != NOTHING) && in aac_handle_aif()
1363 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { in aac_handle_aif()
1365 dev->fsa_dev[container].config_needed; in aac_handle_aif()
1366 dev->fsa_dev[container].config_needed = NOTHING; in aac_handle_aif()
1378 * If we decided that a re-configuration needs to be done, in aac_handle_aif()
1389 if (!dev || !dev->scsi_host_ptr) in aac_handle_aif()
1396 if (dev->fsa_dev[container].valid == 1) in aac_handle_aif()
1397 dev->fsa_dev[container].valid = 2; in aac_handle_aif()
1400 device = scsi_device_lookup(dev->scsi_host_ptr, channel, id, lun); in aac_handle_aif()
1410 "Device offlined - %s\n", in aac_handle_aif()
1420 "Device online - %s\n", in aac_handle_aif()
1429 && (!dev->fsa_dev[container].valid)) { in aac_handle_aif()
1437 "Device offlined - %s\n", in aac_handle_aif()
1452 scsi_add_device(dev->scsi_host_ptr, channel, id, lun); in aac_handle_aif()
1462 if (aac->sa_firmware) in aac_schedule_bus_scan()
1472 struct Scsi_Host *host = aac->scsi_host_ptr; in _aac_reset_adapter()
1480 * - host is locked, unless called by the aacraid thread. in _aac_reset_adapter()
1483 * - in_reset is asserted, so no new i/o is getting to the in _aac_reset_adapter()
1485 * - The card is dead, or will be very shortly ;-/ so no new in _aac_reset_adapter()
1489 if (aac->thread && aac->thread->pid != current->pid) { in _aac_reset_adapter()
1490 spin_unlock_irq(host->host_lock); in _aac_reset_adapter()
1491 kthread_stop(aac->thread); in _aac_reset_adapter()
1492 aac->thread = NULL; in _aac_reset_adapter()
1510 num_of_fibs = aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB; in _aac_reset_adapter()
1513 struct fib *fib = &aac->fibs[index]; in _aac_reset_adapter()
1514 __le32 XferState = fib->hw_fib_va->header.XferState; in _aac_reset_adapter()
1522 || fib->flags & FIB_CONTEXT_FLAG_WAIT) { in _aac_reset_adapter()
1524 spin_lock_irqsave(&fib->event_lock, flagv); in _aac_reset_adapter()
1525 complete(&fib->event_wait); in _aac_reset_adapter()
1526 spin_unlock_irqrestore(&fib->event_lock, flagv); in _aac_reset_adapter()
1534 index = aac->cardtype; in _aac_reset_adapter()
1537 * Re-initialize the adapter, first free resources, then carefully in _aac_reset_adapter()
1545 dma_free_coherent(&aac->pdev->dev, aac->comm_size, aac->comm_addr, in _aac_reset_adapter()
1546 aac->comm_phys); in _aac_reset_adapter()
1548 aac->comm_addr = NULL; in _aac_reset_adapter()
1549 aac->comm_phys = 0; in _aac_reset_adapter()
1550 kfree(aac->queues); in _aac_reset_adapter()
1551 aac->queues = NULL; in _aac_reset_adapter()
1552 kfree(aac->fsa_dev); in _aac_reset_adapter()
1553 aac->fsa_dev = NULL; in _aac_reset_adapter()
1556 quirks = aac_get_driver_ident(index)->quirks; in _aac_reset_adapter()
1558 retval = dma_set_mask(&aac->pdev->dev, dmamask); in _aac_reset_adapter()
1560 retval = dma_set_mask(&aac->pdev->dev, dmamask); in _aac_reset_adapter()
1562 retval = dma_set_coherent_mask(&aac->pdev->dev, dmamask); in _aac_reset_adapter()
1566 retval = dma_set_coherent_mask(&aac->pdev->dev, dmamask); in _aac_reset_adapter()
1572 if ((retval = (*(aac_get_driver_ident(index)->init))(aac))) in _aac_reset_adapter()
1576 aac->thread = kthread_run(aac_command_thread, aac, "%s", in _aac_reset_adapter()
1577 aac->name); in _aac_reset_adapter()
1578 if (IS_ERR(aac->thread)) { in _aac_reset_adapter()
1579 retval = PTR_ERR(aac->thread); in _aac_reset_adapter()
1580 aac->thread = NULL; in _aac_reset_adapter()
1585 if ((quirks & AAC_QUIRK_34SG) && (host->sg_tablesize > 34)) { in _aac_reset_adapter()
1586 host->sg_tablesize = 34; in _aac_reset_adapter()
1587 host->max_sectors = (host->sg_tablesize * 8) + 112; in _aac_reset_adapter()
1589 if ((quirks & AAC_QUIRK_17SG) && (host->sg_tablesize > 17)) { in _aac_reset_adapter()
1590 host->sg_tablesize = 17; in _aac_reset_adapter()
1591 host->max_sectors = (host->sg_tablesize * 8) + 112; in _aac_reset_adapter()
1603 aac->in_reset = 0; in _aac_reset_adapter()
1610 dev_info(&aac->pdev->dev, "Scheduling bus rescan\n"); in _aac_reset_adapter()
1615 spin_lock_irq(host->host_lock); in _aac_reset_adapter()
1624 struct Scsi_Host *host = aac->scsi_host_ptr; in aac_reset_adapter()
1627 if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0) in aac_reset_adapter()
1628 return -EBUSY; in aac_reset_adapter()
1630 if (aac->in_reset) { in aac_reset_adapter()
1631 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_reset_adapter()
1632 return -EBUSY; in aac_reset_adapter()
1634 aac->in_reset = 1; in aac_reset_adapter()
1635 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_reset_adapter()
1647 spin_lock_irqsave(host->host_lock, flagv); in aac_reset_adapter()
1651 spin_unlock_irqrestore(host->host_lock, flagv); in aac_reset_adapter()
1656 if ((forced < 2) && (retval == -ENODEV)) { in aac_reset_adapter()
1667 cmd->command = cpu_to_le32(VM_ContainerConfig); in aac_reset_adapter()
1668 cmd->type = cpu_to_le32(CT_PAUSE_IO); in aac_reset_adapter()
1669 cmd->timeout = cpu_to_le32(1); in aac_reset_adapter()
1670 cmd->min = cpu_to_le32(1); in aac_reset_adapter()
1671 cmd->noRescan = cpu_to_le32(1); in aac_reset_adapter()
1672 cmd->count = cpu_to_le32(0); in aac_reset_adapter()
1678 -2 /* Timeout silently */, 1, in aac_reset_adapter()
1685 if (status != -ERESTARTSYS) in aac_reset_adapter()
1695 return bus == CONTAINER_CHANNEL && target < aac->maximum_num_containers; in is_safw_raid_volume()
1705 return scsi_device_lookup(dev->scsi_host_ptr, bus, target, 0); in aac_lookup_safw_scsi_device()
1713 return scsi_add_device(dev->scsi_host_ptr, bus, target, 0); in aac_add_safw_device()
1734 return dev->hba_map[bus][target].scan_counter == dev->scan_counter; in aac_is_safw_scan_count_equal()
1740 return dev->fsa_dev[target].valid; in aac_is_safw_target_valid()
1803 mutex_lock(&dev->scan_mutex); in aac_scan_host()
1804 if (dev->sa_firmware) in aac_scan_host()
1807 scsi_scan_host(dev->scsi_host_ptr); in aac_scan_host()
1808 mutex_unlock(&dev->scan_mutex); in aac_scan_host()
1818 wait_event(dev->scsi_host_ptr->host_wait, in aac_src_reinit_aif_worker()
1819 !scsi_host_in_recovery(dev->scsi_host_ptr)); in aac_src_reinit_aif_worker()
1820 aac_reinit_aif(dev, dev->cardtype); in aac_src_reinit_aif_worker()
1824 * aac_handle_sa_aif - Handle a message from the firmware
1836 if (fibptr->hbacmd_size & SA_AIF_HOTPLUG) in aac_handle_sa_aif()
1838 else if (fibptr->hbacmd_size & SA_AIF_HARDWARE) in aac_handle_sa_aif()
1840 else if (fibptr->hbacmd_size & SA_AIF_PDEV_CHANGE) in aac_handle_sa_aif()
1842 else if (fibptr->hbacmd_size & SA_AIF_LDEV_CHANGE) in aac_handle_sa_aif()
1844 else if (fibptr->hbacmd_size & SA_AIF_BPSTAT_CHANGE) in aac_handle_sa_aif()
1846 else if (fibptr->hbacmd_size & SA_AIF_BPCFG_CHANGE) in aac_handle_sa_aif()
1868 pr_warn(" AIF not cleared by firmware - %d/%d)\n", in aac_handle_sa_aif()
1877 unsigned int num = 0; in get_fib_count() local
1884 * and pre-allocate a set of fibs outside the in get_fib_count()
1887 num = le32_to_cpu(dev->init->r7.adapter_fibs_size) in get_fib_count()
1889 spin_lock_irqsave(&dev->fib_lock, flagv); in get_fib_count()
1890 entry = dev->fib_list.next; in get_fib_count()
1891 while (entry != &dev->fib_list) { in get_fib_count()
1892 entry = entry->next; in get_fib_count()
1893 ++num; in get_fib_count()
1895 spin_unlock_irqrestore(&dev->fib_lock, flagv); in get_fib_count()
1897 return num; in get_fib_count()
1902 unsigned int num) in fillup_pools() argument
1909 while (hw_fib_p < &hw_fib_pool[num]) { in fillup_pools()
1912 --hw_fib_p; in fillup_pools()
1918 kfree(*(--hw_fib_p)); in fillup_pools()
1926 num = hw_fib_p - hw_fib_pool; in fillup_pools()
1927 return num; in fillup_pools()
1935 unsigned int num) in wakeup_fibctx_threads() argument
1947 spin_lock_irqsave(&dev->fib_lock, flagv); in wakeup_fibctx_threads()
1948 entry = dev->fib_list.next; in wakeup_fibctx_threads()
1958 while (entry != &dev->fib_list) { in wakeup_fibctx_threads()
1968 if (fibctx->count > 20) { in wakeup_fibctx_threads()
1974 time_last = fibctx->jiffies; in wakeup_fibctx_threads()
1980 if ((time_now - time_last) > aif_timeout) { in wakeup_fibctx_threads()
1981 entry = entry->next; in wakeup_fibctx_threads()
1990 if (hw_fib_p >= &hw_fib_pool[num]) { in wakeup_fibctx_threads()
1992 entry = entry->next; in wakeup_fibctx_threads()
2005 newfib->hw_fib_va = hw_newfib; in wakeup_fibctx_threads()
2010 list_add_tail(&newfib->fiblink, &fibctx->fib_list); in wakeup_fibctx_threads()
2011 fibctx->count++; in wakeup_fibctx_threads()
2016 complete(&fibctx->completion); in wakeup_fibctx_threads()
2018 entry = entry->next; in wakeup_fibctx_threads()
2023 *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); in wakeup_fibctx_threads()
2025 spin_unlock_irqrestore(&dev->fib_lock, flagv); in wakeup_fibctx_threads()
2036 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2039 while (!list_empty(&(dev->queues->queue[HostNormCmdQueue].cmdq))) { in aac_process_events()
2042 unsigned int num; in aac_process_events() local
2048 entry = dev->queues->queue[HostNormCmdQueue].cmdq.next; in aac_process_events()
2051 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2055 hw_fib = fib->hw_fib_va; in aac_process_events()
2056 if (dev->sa_firmware) { in aac_process_events()
2069 fib->type = FSAFS_NTC_FIB_CONTEXT; in aac_process_events()
2070 fib->size = sizeof(struct fib); in aac_process_events()
2071 fib->hw_fib_va = hw_fib; in aac_process_events()
2072 fib->data = hw_fib->data; in aac_process_events()
2073 fib->dev = dev; in aac_process_events()
2078 aifcmd = (struct aac_aifcmd *) hw_fib->data; in aac_process_events()
2079 if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) { in aac_process_events()
2082 *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); in aac_process_events()
2092 if (aifcmd->command == cpu_to_le32(AifCmdEventNotify) in aac_process_events()
2093 || aifcmd->command == cpu_to_le32(AifCmdJobProgress)) { in aac_process_events()
2100 num = get_fib_count(dev); in aac_process_events()
2101 if (!num) in aac_process_events()
2104 hw_fib_pool = kmalloc_array(num, sizeof(struct hw_fib *), in aac_process_events()
2109 fib_pool = kmalloc_array(num, sizeof(struct fib *), GFP_KERNEL); in aac_process_events()
2117 num = fillup_pools(dev, hw_fib_pool, fib_pool, num); in aac_process_events()
2118 if (!num) in aac_process_events()
2126 fib, hw_fib, num); in aac_process_events()
2132 while (hw_fib_p < &hw_fib_pool[num]) { in aac_process_events()
2143 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2149 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2161 int ret = -ENOMEM; in aac_send_wellness_command()
2168 dma_buf = dma_alloc_coherent(&dev->pdev->dev, datasize, &addr, in aac_send_wellness_command()
2175 vbus = (u32)le16_to_cpu(dev->supplement_adapter_info.virt_device_bus); in aac_send_wellness_command()
2176 vid = (u32)le16_to_cpu(dev->supplement_adapter_info.virt_device_target); in aac_send_wellness_command()
2180 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_send_wellness_command()
2181 srbcmd->channel = cpu_to_le32(vbus); in aac_send_wellness_command()
2182 srbcmd->id = cpu_to_le32(vid); in aac_send_wellness_command()
2183 srbcmd->lun = 0; in aac_send_wellness_command()
2184 srbcmd->flags = cpu_to_le32(SRB_DataOut); in aac_send_wellness_command()
2185 srbcmd->timeout = cpu_to_le32(10); in aac_send_wellness_command()
2186 srbcmd->retry_limit = 0; in aac_send_wellness_command()
2187 srbcmd->cdb_size = cpu_to_le32(12); in aac_send_wellness_command()
2188 srbcmd->count = cpu_to_le32(datasize); in aac_send_wellness_command()
2190 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_send_wellness_command()
2191 srbcmd->cdb[0] = BMIC_OUT; in aac_send_wellness_command()
2192 srbcmd->cdb[6] = WRITE_HOST_WELLNESS; in aac_send_wellness_command()
2195 sg64 = (struct sgmap64 *)&srbcmd->sg; in aac_send_wellness_command()
2196 sg64->count = cpu_to_le32(1); in aac_send_wellness_command()
2197 sg64->sg[0].addr[1] = cpu_to_le32((u32)(((addr) >> 16) >> 16)); in aac_send_wellness_command()
2198 sg64->sg[0].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_send_wellness_command()
2199 sg64->sg[0].count = cpu_to_le32(datasize); in aac_send_wellness_command()
2205 dma_free_coherent(&dev->pdev->dev, datasize, dma_buf, addr); in aac_send_wellness_command()
2218 if (ret != -ERESTARTSYS) in aac_send_wellness_command()
2234 int ret = -ENODEV; in aac_send_safw_hostttime()
2236 if (!dev->sa_firmware) in aac_send_safw_hostttime()
2239 local_time = (now->tv_sec - (sys_tz.tz_minuteswest * 60)); in aac_send_safw_hostttime()
2259 int ret = -ENOMEM; in aac_send_hosttime()
2269 *info = cpu_to_le32(now->tv_sec); /* overflow in y2106 */ in aac_send_hosttime()
2284 if (ret != -ERESTARTSYS) in aac_send_hosttime()
2292 * aac_command_thread - command processing thread
2312 if (dev->aif_thread) in aac_command_thread()
2313 return -EINVAL; in aac_command_thread()
2318 dev->aif_thread = 1; in aac_command_thread()
2319 add_wait_queue(&dev->queues->queue[HostNormCmdQueue].cmdready, &wait); in aac_command_thread()
2330 && ((difference = next_check_jiffies - jiffies) <= 0)) { in aac_command_thread()
2336 } else if (!dev->queues) in aac_command_thread()
2340 && ((difference = next_jiffies - jiffies) <= 0)) { in aac_command_thread()
2346 if (ret || !dev->queues) in aac_command_thread()
2354 if (((NSEC_PER_SEC - (NSEC_PER_SEC / HZ)) > now.tv_nsec) in aac_command_thread()
2356 difference = HZ + HZ / 2 - in aac_command_thread()
2362 if (dev->sa_firmware) in aac_command_thread()
2372 difference = next_check_jiffies - jiffies; in aac_command_thread()
2390 if (dev->queues) in aac_command_thread()
2391 remove_wait_queue(&dev->queues->queue[HostNormCmdQueue].cmdready, &wait); in aac_command_thread()
2392 dev->aif_thread = 0; in aac_command_thread()
2402 if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) { in aac_acquire_irq()
2403 for (i = 0; i < dev->max_msix; i++) { in aac_acquire_irq()
2404 dev->aac_msix[i].vector_no = i; in aac_acquire_irq()
2405 dev->aac_msix[i].dev = dev; in aac_acquire_irq()
2406 if (request_irq(pci_irq_vector(dev->pdev, i), in aac_acquire_irq()
2407 dev->a_ops.adapter_intr, in aac_acquire_irq()
2408 0, "aacraid", &(dev->aac_msix[i]))) { in aac_acquire_irq()
2409 printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n", in aac_acquire_irq()
2410 dev->name, dev->id, i); in aac_acquire_irq()
2412 free_irq(pci_irq_vector(dev->pdev, j), in aac_acquire_irq()
2413 &(dev->aac_msix[j])); in aac_acquire_irq()
2414 pci_disable_msix(dev->pdev); in aac_acquire_irq()
2415 ret = -1; in aac_acquire_irq()
2419 dev->aac_msix[0].vector_no = 0; in aac_acquire_irq()
2420 dev->aac_msix[0].dev = dev; in aac_acquire_irq()
2422 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_acquire_irq()
2424 &(dev->aac_msix[0])) < 0) { in aac_acquire_irq()
2425 if (dev->msi) in aac_acquire_irq()
2426 pci_disable_msi(dev->pdev); in aac_acquire_irq()
2428 dev->name, dev->id); in aac_acquire_irq()
2429 ret = -1; in aac_acquire_irq()
2440 if (dev->max_msix > 1) { in aac_free_irq()
2441 for (i = 0; i < dev->max_msix; i++) in aac_free_irq()
2442 free_irq(pci_irq_vector(dev->pdev, i), in aac_free_irq()
2443 &(dev->aac_msix[i])); in aac_free_irq()
2445 free_irq(dev->pdev->irq, &(dev->aac_msix[0])); in aac_free_irq()
2448 free_irq(dev->pdev->irq, dev); in aac_free_irq()
2450 if (dev->msi) in aac_free_irq()
2451 pci_disable_msi(dev->pdev); in aac_free_irq()
2452 else if (dev->max_msix > 1) in aac_free_irq()
2453 pci_disable_msix(dev->pdev); in aac_free_irq()