• Home
  • Raw
  • Download

Lines Matching +full:aac +full:- +full:mode

2  *	Adaptec AAC series RAID controller driver
8 * Copyright (c) 2000-2010 Adaptec, Inc.
9 * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
10 * 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
57 * fib_map_alloc - allocate the fib objects
66 if (dev->max_fib_size > AAC_MAX_NATIVE_SIZE) in fib_map_alloc()
67 dev->max_cmd_size = AAC_MAX_NATIVE_SIZE; in fib_map_alloc()
69 dev->max_cmd_size = dev->max_fib_size; in fib_map_alloc()
70 if (dev->max_fib_size < AAC_MAX_NATIVE_SIZE) { in fib_map_alloc()
71 dev->max_cmd_size = AAC_MAX_NATIVE_SIZE; in fib_map_alloc()
73 dev->max_cmd_size = dev->max_fib_size; in fib_map_alloc()
78 &dev->pdev->dev, dev->max_cmd_size, dev->scsi_host_ptr->can_queue, in fib_map_alloc()
79 AAC_NUM_MGT_FIB, &dev->hw_fib_pa)); in fib_map_alloc()
80 dev->hw_fib_va = dma_alloc_coherent(&dev->pdev->dev, in fib_map_alloc()
81 (dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)) in fib_map_alloc()
82 * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) + (ALIGN32 - 1), in fib_map_alloc()
83 &dev->hw_fib_pa, GFP_KERNEL); in fib_map_alloc()
84 if (dev->hw_fib_va == NULL) in fib_map_alloc()
85 return -ENOMEM; in fib_map_alloc()
90 * aac_fib_map_free - free the fib objects
103 if(!dev->hw_fib_va || !dev->max_cmd_size) in aac_fib_map_free()
106 num_fibs = dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB; in aac_fib_map_free()
107 fib_size = dev->max_fib_size + sizeof(struct aac_fib_xporthdr); in aac_fib_map_free()
108 alloc_size = fib_size * num_fibs + ALIGN32 - 1; in aac_fib_map_free()
110 dma_free_coherent(&dev->pdev->dev, alloc_size, dev->hw_fib_va, in aac_fib_map_free()
111 dev->hw_fib_pa); in aac_fib_map_free()
113 dev->hw_fib_va = NULL; in aac_fib_map_free()
114 dev->hw_fib_pa = 0; in aac_fib_map_free()
123 for (i = 0, fibptr = &dev->fibs[i]; in aac_fib_vector_assign()
124 i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_fib_vector_assign()
126 if ((dev->max_msix == 1) || in aac_fib_vector_assign()
127 (i > ((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1) in aac_fib_vector_assign()
128 - dev->vector_cap))) { in aac_fib_vector_assign()
129 fibptr->vector_no = 0; in aac_fib_vector_assign()
131 fibptr->vector_no = vector; in aac_fib_vector_assign()
133 if (vector == dev->max_msix) in aac_fib_vector_assign()
140 * aac_fib_setup - setup the fibs
155 while (((i = fib_map_alloc(dev)) == -ENOMEM) in aac_fib_setup()
156 && (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) { in aac_fib_setup()
157 max_cmds = (dev->scsi_host_ptr->can_queue+AAC_NUM_MGT_FIB) >> 1; in aac_fib_setup()
158 dev->scsi_host_ptr->can_queue = max_cmds - AAC_NUM_MGT_FIB; in aac_fib_setup()
159 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) in aac_fib_setup()
160 dev->init->r7.max_io_commands = cpu_to_le32(max_cmds); in aac_fib_setup()
163 return -ENOMEM; in aac_fib_setup()
165 memset(dev->hw_fib_va, 0, in aac_fib_setup()
166 (dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)) * in aac_fib_setup()
167 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)); in aac_fib_setup()
170 hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1); in aac_fib_setup()
171 hw_fib = (struct hw_fib *)((unsigned char *)dev->hw_fib_va + in aac_fib_setup()
172 (hw_fib_pa - dev->hw_fib_pa)); in aac_fib_setup()
182 for (i = 0, fibptr = &dev->fibs[i]; in aac_fib_setup()
183 i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_fib_setup()
186 fibptr->flags = 0; in aac_fib_setup()
187 fibptr->size = sizeof(struct fib); in aac_fib_setup()
188 fibptr->dev = dev; in aac_fib_setup()
189 fibptr->hw_fib_va = hw_fib; in aac_fib_setup()
190 fibptr->data = (void *) fibptr->hw_fib_va->data; in aac_fib_setup()
191 fibptr->next = fibptr+1; /* Forward chain the fibs */ in aac_fib_setup()
192 sema_init(&fibptr->event_wait, 0); in aac_fib_setup()
193 spin_lock_init(&fibptr->event_lock); in aac_fib_setup()
194 hw_fib->header.XferState = cpu_to_le32(0xffffffff); in aac_fib_setup()
195 hw_fib->header.SenderSize = in aac_fib_setup()
196 cpu_to_le16(dev->max_fib_size); /* ?? max_cmd_size */ in aac_fib_setup()
197 fibptr->hw_fib_pa = hw_fib_pa; in aac_fib_setup()
198 fibptr->hw_sgl_pa = hw_fib_pa + in aac_fib_setup()
204 fibptr->hw_error_pa = hw_fib_pa + in aac_fib_setup()
208 dev->max_cmd_size + sizeof(struct aac_fib_xporthdr)); in aac_fib_setup()
210 dev->max_cmd_size + sizeof(struct aac_fib_xporthdr); in aac_fib_setup()
221 dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL; in aac_fib_setup()
225 dev->free_fib = &dev->fibs[dev->scsi_host_ptr->can_queue]; in aac_fib_setup()
230 * aac_fib_alloc_tag-allocate a fib using tags
241 fibptr = &dev->fibs[scmd->request->tag]; in aac_fib_alloc_tag()
246 fibptr->hw_fib_va->header.XferState = 0; in aac_fib_alloc_tag()
247 fibptr->type = FSAFS_NTC_FIB_CONTEXT; in aac_fib_alloc_tag()
248 fibptr->callback_data = NULL; in aac_fib_alloc_tag()
249 fibptr->callback = NULL; in aac_fib_alloc_tag()
255 * aac_fib_alloc - allocate a fib
266 spin_lock_irqsave(&dev->fib_lock, flags); in aac_fib_alloc()
267 fibptr = dev->free_fib; in aac_fib_alloc()
269 spin_unlock_irqrestore(&dev->fib_lock, flags); in aac_fib_alloc()
272 dev->free_fib = fibptr->next; in aac_fib_alloc()
273 spin_unlock_irqrestore(&dev->fib_lock, flags); in aac_fib_alloc()
277 fibptr->type = FSAFS_NTC_FIB_CONTEXT; in aac_fib_alloc()
278 fibptr->size = sizeof(struct fib); in aac_fib_alloc()
283 fibptr->hw_fib_va->header.XferState = 0; in aac_fib_alloc()
284 fibptr->flags = 0; in aac_fib_alloc()
285 fibptr->callback = NULL; in aac_fib_alloc()
286 fibptr->callback_data = NULL; in aac_fib_alloc()
292 * aac_fib_free - free a fib
302 if (fibptr->done == 2) in aac_fib_free()
305 spin_lock_irqsave(&fibptr->dev->fib_lock, flags); in aac_fib_free()
306 if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_fib_free()
308 if (!(fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) && in aac_fib_free()
309 fibptr->hw_fib_va->header.XferState != 0) { in aac_fib_free()
312 le32_to_cpu(fibptr->hw_fib_va->header.XferState)); in aac_fib_free()
314 fibptr->next = fibptr->dev->free_fib; in aac_fib_free()
315 fibptr->dev->free_fib = fibptr; in aac_fib_free()
316 spin_unlock_irqrestore(&fibptr->dev->fib_lock, flags); in aac_fib_free()
320 * aac_fib_init - initialise a fib
328 struct hw_fib *hw_fib = fibptr->hw_fib_va; in aac_fib_init()
330 memset(&hw_fib->header, 0, sizeof(struct aac_fibhdr)); in aac_fib_init()
331 hw_fib->header.StructType = FIB_MAGIC; in aac_fib_init()
332 hw_fib->header.Size = cpu_to_le16(fibptr->dev->max_fib_size); in aac_fib_init()
333 …hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable… in aac_fib_init()
334 hw_fib->header.u.ReceiverFibAddress = cpu_to_le32(fibptr->hw_fib_pa); in aac_fib_init()
335 hw_fib->header.SenderSize = cpu_to_le16(fibptr->dev->max_fib_size); in aac_fib_init()
339 * fib_deallocate - deallocate a fib
348 struct hw_fib *hw_fib = fibptr->hw_fib_va; in fib_dealloc()
349 hw_fib->header.XferState = 0; in fib_dealloc()
360 * aac_get_entry - get a queue entry
384 q = &dev->queues->queue[qid]; in aac_get_entry()
386 idx = *index = le32_to_cpu(*(q->headers.producer)); in aac_get_entry()
388 if (idx != le32_to_cpu(*(q->headers.consumer))) { in aac_get_entry()
389 if (--idx == 0) { in aac_get_entry()
395 if (idx != le32_to_cpu(*(q->headers.consumer))) in aac_get_entry()
408 if ((*index + 1) == le32_to_cpu(*(q->headers.consumer))) { in aac_get_entry()
410 qid, atomic_read(&q->numpending)); in aac_get_entry()
413 *entry = q->base + *index; in aac_get_entry()
419 * aac_queue_get - get the next free QE
447 entry->size = cpu_to_le32(le16_to_cpu(hw_fib->header.Size)); in aac_queue_get()
456 entry->size = cpu_to_le32(le16_to_cpu(hw_fib->header.Size)); in aac_queue_get()
457 entry->addr = hw_fib->header.SenderFibAddress; in aac_queue_get()
459 …hw_fib->header.u.ReceiverFibAddress = hw_fib->header.SenderFibAddress; /* Let the adapter now whe… in aac_queue_get()
467 entry->addr = cpu_to_le32(fibptr->hw_fib_pa); in aac_queue_get()
480 * aac_fib_send - send a fib to the adapter
500 struct aac_dev * dev = fibptr->dev; in aac_fib_send()
501 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_send()
506 if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) in aac_fib_send()
507 return -EBUSY; in aac_fib_send()
509 if (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed)) in aac_fib_send()
510 return -EINVAL; in aac_fib_send()
520 * will have a debug mode where the adapter can notify the host in aac_fib_send()
523 fibptr->flags = 0; in aac_fib_send()
525 return -EINVAL; in aac_fib_send()
527 hw_fib->header.XferState |= cpu_to_le32(Async | ResponseExpected); in aac_fib_send()
530 hw_fib->header.XferState |= cpu_to_le32(NoResponseExpected); in aac_fib_send()
533 hw_fib->header.XferState |= cpu_to_le32(ResponseExpected); in aac_fib_send()
540 hw_fib->header.SenderFibAddress = in aac_fib_send()
541 cpu_to_le32(((u32)(fibptr - dev->fibs)) << 2); in aac_fib_send()
546 hw_fib->header.Handle = in aac_fib_send()
547 cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1); in aac_fib_send()
556 hw_fib->header.Command = cpu_to_le16(command); in aac_fib_send()
557 hw_fib->header.XferState |= cpu_to_le32(SentFromHost); in aac_fib_send()
561 hw_fib->header.Size = cpu_to_le16(sizeof(struct aac_fibhdr) + size); in aac_fib_send()
562 if (le16_to_cpu(hw_fib->header.Size) > le16_to_cpu(hw_fib->header.SenderSize)) { in aac_fib_send()
563 return -EMSGSIZE; in aac_fib_send()
569 hw_fib->header.XferState |= cpu_to_le32(NormalPriority); in aac_fib_send()
576 fibptr->callback = callback; in aac_fib_send()
577 fibptr->callback_data = callback_data; in aac_fib_send()
578 fibptr->flags = FIB_CONTEXT_FLAG; in aac_fib_send()
581 fibptr->done = 0; in aac_fib_send()
586 dprintk((KERN_DEBUG " Command = %d.\n", le32_to_cpu(hw_fib->header.Command))); in aac_fib_send()
587 …bCommand = %d.\n", le32_to_cpu(((struct aac_query_mount *)fib_data(fibptr))->command))); in aac_fib_send()
588 dprintk((KERN_DEBUG " XferState = %x.\n", le32_to_cpu(hw_fib->header.XferState))); in aac_fib_send()
589 dprintk((KERN_DEBUG " hw_fib va being sent=%p\n",fibptr->hw_fib_va)); in aac_fib_send()
590 dprintk((KERN_DEBUG " hw_fib pa being sent=%lx\n",(ulong)fibptr->hw_fib_pa)); in aac_fib_send()
593 if (!dev->queues) in aac_fib_send()
594 return -EBUSY; in aac_fib_send()
598 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_fib_send()
599 if (dev->management_fib_count >= AAC_NUM_MGT_FIB) { in aac_fib_send()
601 dev->management_fib_count); in aac_fib_send()
602 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
603 return -EBUSY; in aac_fib_send()
605 dev->management_fib_count++; in aac_fib_send()
606 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
607 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_fib_send()
610 if (dev->sync_mode) { in aac_fib_send()
612 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
613 spin_lock_irqsave(&dev->sync_lock, sflags); in aac_fib_send()
614 if (dev->sync_fib) { in aac_fib_send()
615 list_add_tail(&fibptr->fiblink, &dev->sync_fib_list); in aac_fib_send()
616 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_fib_send()
618 dev->sync_fib = fibptr; in aac_fib_send()
619 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_fib_send()
621 (u32)fibptr->hw_fib_pa, 0, 0, 0, 0, 0, in aac_fib_send()
625 fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; in aac_fib_send()
626 if (down_interruptible(&fibptr->event_wait)) { in aac_fib_send()
627 fibptr->flags &= ~FIB_CONTEXT_FLAG_WAIT; in aac_fib_send()
628 return -EFAULT; in aac_fib_send()
632 return -EINPROGRESS; in aac_fib_send()
636 printk(KERN_ERR "aac_fib_send: returned -EBUSY\n"); in aac_fib_send()
638 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
639 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_fib_send()
640 dev->management_fib_count--; in aac_fib_send()
641 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_fib_send()
643 return -EBUSY; in aac_fib_send()
652 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
662 while (down_trylock(&fibptr->event_wait)) { in aac_fib_send()
665 struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue]; in aac_fib_send()
666 atomic_dec(&q->numpending); in aac_fib_send()
667 if (wait == -1) { in aac_fib_send()
671 "the SAFE mode kernel options (acpi, apic etc)\n"); in aac_fib_send()
673 return -ETIMEDOUT; in aac_fib_send()
677 return -EFAULT; in aac_fib_send()
680 if (wait == -1) { in aac_fib_send()
685 return -EFAULT; in aac_fib_send()
692 } else if (down_interruptible(&fibptr->event_wait)) { in aac_fib_send()
697 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_fib_send()
698 if (fibptr->done == 0) { in aac_fib_send()
699 fibptr->done = 2; /* Tell interrupt we aborted */ in aac_fib_send()
700 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
701 return -ERESTARTSYS; in aac_fib_send()
703 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_fib_send()
704 BUG_ON(fibptr->done == 0); in aac_fib_send()
706 if(unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_fib_send()
707 return -ETIMEDOUT; in aac_fib_send()
715 return -EINPROGRESS; in aac_fib_send()
723 struct aac_dev *dev = fibptr->dev; in aac_hba_send()
728 fibptr->hw_fib_va; in aac_hba_send()
730 fibptr->flags = (FIB_CONTEXT_FLAG | FIB_CONTEXT_FLAG_NATIVE_HBA); in aac_hba_send()
733 fibptr->callback = callback; in aac_hba_send()
734 fibptr->callback_data = callback_data; in aac_hba_send()
739 hbacmd->iu_type = command; in aac_hba_send()
743 hbacmd->request_id = in aac_hba_send()
744 cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1); in aac_hba_send()
745 fibptr->flags |= FIB_CONTEXT_FLAG_SCSI_CMD; in aac_hba_send()
747 return -EINVAL; in aac_hba_send()
751 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_hba_send()
752 if (dev->management_fib_count >= AAC_NUM_MGT_FIB) { in aac_hba_send()
753 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
754 return -EBUSY; in aac_hba_send()
756 dev->management_fib_count++; in aac_hba_send()
757 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
758 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_hba_send()
763 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
764 spin_lock_irqsave(&dev->manage_lock, mflags); in aac_hba_send()
765 dev->management_fib_count--; in aac_hba_send()
766 spin_unlock_irqrestore(&dev->manage_lock, mflags); in aac_hba_send()
768 return -EBUSY; in aac_hba_send()
774 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
777 return -EFAULT; in aac_hba_send()
779 fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; in aac_hba_send()
780 if (down_interruptible(&fibptr->event_wait)) in aac_hba_send()
781 fibptr->done = 2; in aac_hba_send()
782 fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT); in aac_hba_send()
784 spin_lock_irqsave(&fibptr->event_lock, flags); in aac_hba_send()
785 if ((fibptr->done == 0) || (fibptr->done == 2)) { in aac_hba_send()
786 fibptr->done = 2; /* Tell interrupt we aborted */ in aac_hba_send()
787 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
788 return -ERESTARTSYS; in aac_hba_send()
790 spin_unlock_irqrestore(&fibptr->event_lock, flags); in aac_hba_send()
791 WARN_ON(fibptr->done == 0); in aac_hba_send()
793 if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) in aac_hba_send()
794 return -ETIMEDOUT; in aac_hba_send()
799 return -EINPROGRESS; in aac_hba_send()
803 * aac_consumer_get - get the top of the queue
817 if (le32_to_cpu(*q->headers.producer) == le32_to_cpu(*q->headers.consumer)) { in aac_consumer_get()
825 if (le32_to_cpu(*q->headers.consumer) >= q->entries) in aac_consumer_get()
828 index = le32_to_cpu(*q->headers.consumer); in aac_consumer_get()
829 *entry = q->base + index; in aac_consumer_get()
836 * aac_consumer_free - free consumer entry
850 if ((le32_to_cpu(*q->headers.producer)+1) == le32_to_cpu(*q->headers.consumer)) in aac_consumer_free()
853 if (le32_to_cpu(*q->headers.consumer) >= q->entries) in aac_consumer_free()
854 *q->headers.consumer = cpu_to_le32(1); in aac_consumer_free()
856 le32_add_cpu(q->headers.consumer, 1); in aac_consumer_free()
876 * aac_fib_adapter_complete - complete adapter issued fib
886 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_adapter_complete()
887 struct aac_dev * dev = fibptr->dev; in aac_fib_adapter_complete()
892 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_fib_adapter_complete()
893 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_fib_adapter_complete()
894 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_fib_adapter_complete()
899 if (hw_fib->header.XferState == 0) { in aac_fib_adapter_complete()
900 if (dev->comm_interface == AAC_COMM_MESSAGE) in aac_fib_adapter_complete()
907 if (hw_fib->header.StructType != FIB_MAGIC && in aac_fib_adapter_complete()
908 hw_fib->header.StructType != FIB_MAGIC2 && in aac_fib_adapter_complete()
909 hw_fib->header.StructType != FIB_MAGIC2_64) { in aac_fib_adapter_complete()
910 if (dev->comm_interface == AAC_COMM_MESSAGE) in aac_fib_adapter_complete()
912 return -EINVAL; in aac_fib_adapter_complete()
921 if (hw_fib->header.XferState & cpu_to_le32(SentFromAdapter)) { in aac_fib_adapter_complete()
922 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_fib_adapter_complete()
926 hw_fib->header.XferState |= cpu_to_le32(HostProcessed); in aac_fib_adapter_complete()
929 if (size > le16_to_cpu(hw_fib->header.SenderSize)) in aac_fib_adapter_complete()
930 return -EMSGSIZE; in aac_fib_adapter_complete()
931 hw_fib->header.Size = cpu_to_le16(size); in aac_fib_adapter_complete()
933 q = &dev->queues->queue[AdapNormRespQueue]; in aac_fib_adapter_complete()
934 spin_lock_irqsave(q->lock, qflags); in aac_fib_adapter_complete()
936 *(q->headers.producer) = cpu_to_le32(index + 1); in aac_fib_adapter_complete()
937 spin_unlock_irqrestore(q->lock, qflags); in aac_fib_adapter_complete()
950 * aac_fib_complete - fib completion handler
958 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_fib_complete()
960 if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) { in aac_fib_complete()
970 if (hw_fib->header.XferState == 0 || fibptr->done == 2) in aac_fib_complete()
976 if (hw_fib->header.StructType != FIB_MAGIC && in aac_fib_complete()
977 hw_fib->header.StructType != FIB_MAGIC2 && in aac_fib_complete()
978 hw_fib->header.StructType != FIB_MAGIC2_64) in aac_fib_complete()
979 return -EINVAL; in aac_fib_complete()
987 if((hw_fib->header.XferState & cpu_to_le32(SentFromHost)) && in aac_fib_complete()
988 (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed))) in aac_fib_complete()
992 else if(hw_fib->header.XferState & cpu_to_le32(SentFromHost)) in aac_fib_complete()
999 } else if(hw_fib->header.XferState & cpu_to_le32(HostOwned)) { in aac_fib_complete()
1008 * aac_printf - handle printf from firmware
1018 char *cp = dev->printfbuf; in aac_printf()
1019 if (dev->printf_enabled) in aac_printf()
1033 printk(KERN_WARNING "%s:%s", dev->name, cp); in aac_printf()
1035 printk(KERN_INFO "%s:%s", dev->name, cp); in aac_printf()
1042 return le32_to_cpu(((__le32 *)aifcmd->data)[index]); in aac_aif_data()
1051 dev_info(&dev->pdev->dev, "Backup unit had cache data loss - [%d]\n", in aac_handle_aif_bu()
1054 dev_info(&dev->pdev->dev, "Backup Unit had cache data loss\n"); in aac_handle_aif_bu()
1058 dev_info(&dev->pdev->dev, "DDR cache data recovered successfully - [%d]\n", in aac_handle_aif_bu()
1061 dev_info(&dev->pdev->dev, "DDR cache data recovered successfully\n"); in aac_handle_aif_bu()
1067 * aac_handle_aif - Handle a message from the firmware
1078 struct hw_fib * hw_fib = fibptr->hw_fib_va; in aac_handle_aif()
1079 struct aac_aifcmd * aifcmd = (struct aac_aifcmd *)hw_fib->data; in aac_handle_aif()
1091 if (!dev || !dev->fsa_dev) in aac_handle_aif()
1093 container = channel = id = lun = (u32)-1; in aac_handle_aif()
1097 * re-configures that take place. As a result of this when in aac_handle_aif()
1099 * type of AIF before setting the re-config flag. in aac_handle_aif()
1101 switch (le32_to_cpu(aifcmd->command)) { in aac_handle_aif()
1103 switch (le32_to_cpu(((__le32 *)aifcmd->data)[0])) { in aac_handle_aif()
1105 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1107 container = (u32)-1; in aac_handle_aif()
1111 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1112 container = (u32)-1; in aac_handle_aif()
1116 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1117 container = (u32)-1; in aac_handle_aif()
1121 container = (u32)-1; in aac_handle_aif()
1131 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1132 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1138 * so set the flag to initiate a new re-config once we in aac_handle_aif()
1142 if ((dev != NULL) && (dev->scsi_host_ptr != NULL)) { in aac_handle_aif()
1143 device = scsi_device_lookup(dev->scsi_host_ptr, in aac_handle_aif()
1148 dev->fsa_dev[container].config_needed = CHANGE; in aac_handle_aif()
1149 dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; in aac_handle_aif()
1150 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1158 * that thing then set the re-configure flag. in aac_handle_aif()
1160 if (container != (u32)-1) { in aac_handle_aif()
1161 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1163 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1164 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1165 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1166 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1168 container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1169 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1170 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1171 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1172 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1177 switch (le32_to_cpu(((__le32 *)aifcmd->data)[0])) { in aac_handle_aif()
1179 dev->cache_protected = in aac_handle_aif()
1180 (((__le32 *)aifcmd->data)[1] == cpu_to_le32(3)); in aac_handle_aif()
1186 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1187 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1189 dev->fsa_dev[container].config_needed = ADD; in aac_handle_aif()
1190 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1192 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1199 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1200 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1202 dev->fsa_dev[container].config_needed = DELETE; in aac_handle_aif()
1203 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1205 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1213 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1214 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1216 if (dev->fsa_dev[container].config_waiting_on && in aac_handle_aif()
1217 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1219 dev->fsa_dev[container].config_needed = CHANGE; in aac_handle_aif()
1220 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1222 dev->fsa_dev[container].config_waiting_stamp = jiffies; in aac_handle_aif()
1230 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); in aac_handle_aif()
1232 container = (u32)-1; in aac_handle_aif()
1236 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1237 container = (u32)-1; in aac_handle_aif()
1241 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1242 container = (u32)-1; in aac_handle_aif()
1246 container = (u32)-1; in aac_handle_aif()
1249 (((__le32 *)aifcmd->data)[0] == in aac_handle_aif()
1252 device = scsi_device_lookup(dev->scsi_host_ptr, in aac_handle_aif()
1265 * If in JBOD mode, automatic exposure of new in aac_handle_aif()
1268 if (dev->jbod) in aac_handle_aif()
1270 switch (le32_to_cpu(((__le32 *)aifcmd->data)[3])) { in aac_handle_aif()
1276 ((__le32 *)aifcmd->data)[2]); in aac_handle_aif()
1278 container = (u32)-1; in aac_handle_aif()
1282 if (channel >= dev->maximum_num_channels) { in aac_handle_aif()
1283 container = (u32)-1; in aac_handle_aif()
1288 container = (u32)-1; in aac_handle_aif()
1289 if (id >= dev->maximum_num_physicals) { in aac_handle_aif()
1293 dev->maximum_num_channels)) in aac_handle_aif()
1300 ((((__le32 *)aifcmd->data)[3] in aac_handle_aif()
1302 (((__le32 *)aifcmd->data)[3] in aac_handle_aif()
1315 * that thing then set the re-configure flag. in aac_handle_aif()
1317 if (container != (u32)-1) { in aac_handle_aif()
1318 if (container >= dev->maximum_num_containers) in aac_handle_aif()
1320 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1321 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1322 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1323 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1325 container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1326 if ((dev->fsa_dev[container].config_waiting_on == in aac_handle_aif()
1327 le32_to_cpu(*(__le32 *)aifcmd->data)) && in aac_handle_aif()
1328 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) in aac_handle_aif()
1329 dev->fsa_dev[container].config_waiting_on = 0; in aac_handle_aif()
1342 if (((__le32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero) && in aac_handle_aif()
1343 (((__le32 *)aifcmd->data)[6] == ((__le32 *)aifcmd->data)[5] || in aac_handle_aif()
1344 ((__le32 *)aifcmd->data)[4] == cpu_to_le32(AifJobStsSuccess))) { in aac_handle_aif()
1346 container < dev->maximum_num_containers; in aac_handle_aif()
1352 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1354 dev->fsa_dev[container].config_needed = ADD; in aac_handle_aif()
1355 dev->fsa_dev[container].config_waiting_stamp = in aac_handle_aif()
1359 if (((__le32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero) && in aac_handle_aif()
1360 ((__le32 *)aifcmd->data)[6] == 0 && in aac_handle_aif()
1361 ((__le32 *)aifcmd->data)[4] == cpu_to_le32(AifJobStsRunning)) { in aac_handle_aif()
1363 container < dev->maximum_num_containers; in aac_handle_aif()
1369 dev->fsa_dev[container].config_waiting_on = in aac_handle_aif()
1371 dev->fsa_dev[container].config_needed = DELETE; in aac_handle_aif()
1372 dev->fsa_dev[container].config_waiting_stamp = in aac_handle_aif()
1382 for (; container < dev->maximum_num_containers; ++container) { in aac_handle_aif()
1383 if ((dev->fsa_dev[container].config_waiting_on == 0) && in aac_handle_aif()
1384 (dev->fsa_dev[container].config_needed != NOTHING) && in aac_handle_aif()
1385 time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { in aac_handle_aif()
1387 dev->fsa_dev[container].config_needed; in aac_handle_aif()
1388 dev->fsa_dev[container].config_needed = NOTHING; in aac_handle_aif()
1399 * If we decided that a re-configuration needs to be done, in aac_handle_aif()
1410 if (!dev || !dev->scsi_host_ptr) in aac_handle_aif()
1417 if (dev->fsa_dev[container].valid == 1) in aac_handle_aif()
1418 dev->fsa_dev[container].valid = 2; in aac_handle_aif()
1421 device = scsi_device_lookup(dev->scsi_host_ptr, channel, id, lun); in aac_handle_aif()
1431 "Device offlined - %s\n", in aac_handle_aif()
1441 "Device online - %s\n", in aac_handle_aif()
1450 && (!dev->fsa_dev[container].valid)) { in aac_handle_aif()
1458 "Device offlined - %s\n", in aac_handle_aif()
1463 scsi_rescan_device(&device->sdev_gendev); in aac_handle_aif()
1472 scsi_add_device(dev->scsi_host_ptr, channel, id, lun); in aac_handle_aif()
1480 static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type) in _aac_reset_adapter() argument
1495 * - host is locked, unless called by the aacraid thread. in _aac_reset_adapter()
1498 * - in_reset is asserted, so no new i/o is getting to the in _aac_reset_adapter()
1500 * - The card is dead, or will be very shortly ;-/ so no new in _aac_reset_adapter()
1503 host = aac->scsi_host_ptr; in _aac_reset_adapter()
1505 aac_adapter_disable_int(aac); in _aac_reset_adapter()
1506 if (aac->thread && aac->thread->pid != current->pid) { in _aac_reset_adapter()
1507 spin_unlock_irq(host->host_lock); in _aac_reset_adapter()
1508 kthread_stop(aac->thread); in _aac_reset_adapter()
1509 aac->thread = NULL; in _aac_reset_adapter()
1517 bled = forced ? 0 : aac_adapter_check_health(aac); in _aac_reset_adapter()
1518 retval = aac_adapter_restart(aac, bled, reset_type); in _aac_reset_adapter()
1527 num_of_fibs = aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB; in _aac_reset_adapter()
1530 struct fib *fib = &aac->fibs[index]; in _aac_reset_adapter()
1531 __le32 XferState = fib->hw_fib_va->header.XferState; in _aac_reset_adapter()
1539 || fib->flags & FIB_CONTEXT_FLAG_WAIT) { in _aac_reset_adapter()
1541 spin_lock_irqsave(&fib->event_lock, flagv); in _aac_reset_adapter()
1542 up(&fib->event_wait); in _aac_reset_adapter()
1543 spin_unlock_irqrestore(&fib->event_lock, flagv); in _aac_reset_adapter()
1551 index = aac->cardtype; in _aac_reset_adapter()
1554 * Re-initialize the adapter, first free resources, then carefully in _aac_reset_adapter()
1560 aac_free_irq(aac); in _aac_reset_adapter()
1561 aac_fib_map_free(aac); in _aac_reset_adapter()
1562 dma_free_coherent(&aac->pdev->dev, aac->comm_size, aac->comm_addr, in _aac_reset_adapter()
1563 aac->comm_phys); in _aac_reset_adapter()
1564 aac->comm_addr = NULL; in _aac_reset_adapter()
1565 aac->comm_phys = 0; in _aac_reset_adapter()
1566 kfree(aac->queues); in _aac_reset_adapter()
1567 aac->queues = NULL; in _aac_reset_adapter()
1568 kfree(aac->fsa_dev); in _aac_reset_adapter()
1569 aac->fsa_dev = NULL; in _aac_reset_adapter()
1572 quirks = aac_get_driver_ident(index)->quirks; in _aac_reset_adapter()
1574 retval = pci_set_dma_mask(aac->pdev, dmamask); in _aac_reset_adapter()
1576 retval = pci_set_dma_mask(aac->pdev, dmamask); in _aac_reset_adapter()
1578 retval = pci_set_consistent_dma_mask(aac->pdev, dmamask); in _aac_reset_adapter()
1582 retval = pci_set_consistent_dma_mask(aac->pdev, dmamask); in _aac_reset_adapter()
1588 if ((retval = (*(aac_get_driver_ident(index)->init))(aac))) in _aac_reset_adapter()
1592 aac->thread = kthread_run(aac_command_thread, aac, "%s", in _aac_reset_adapter()
1593 aac->name); in _aac_reset_adapter()
1594 if (IS_ERR(aac->thread)) { in _aac_reset_adapter()
1595 retval = PTR_ERR(aac->thread); in _aac_reset_adapter()
1596 aac->thread = NULL; in _aac_reset_adapter()
1600 (void)aac_get_adapter_info(aac); in _aac_reset_adapter()
1601 if ((quirks & AAC_QUIRK_34SG) && (host->sg_tablesize > 34)) { in _aac_reset_adapter()
1602 host->sg_tablesize = 34; in _aac_reset_adapter()
1603 host->max_sectors = (host->sg_tablesize * 8) + 112; in _aac_reset_adapter()
1605 if ((quirks & AAC_QUIRK_17SG) && (host->sg_tablesize > 17)) { in _aac_reset_adapter()
1606 host->sg_tablesize = 17; in _aac_reset_adapter()
1607 host->max_sectors = (host->sg_tablesize * 8) + 112; in _aac_reset_adapter()
1609 aac_get_config_status(aac, 1); in _aac_reset_adapter()
1610 aac_get_containers(aac); in _aac_reset_adapter()
1618 spin_lock_irqsave(&dev->list_lock, flags); in _aac_reset_adapter()
1619 list_for_each_entry(command, &dev->cmd_list, list) in _aac_reset_adapter()
1620 if (command->SCp.phase == AAC_OWNER_FIRMWARE) { in _aac_reset_adapter()
1621 command->SCp.buffer = (struct scatterlist *)command_list; in _aac_reset_adapter()
1624 spin_unlock_irqrestore(&dev->list_lock, flags); in _aac_reset_adapter()
1627 command_list = (struct scsi_cmnd *)command->SCp.buffer; in _aac_reset_adapter()
1628 command->SCp.buffer = NULL; in _aac_reset_adapter()
1629 command->result = DID_OK << 16 in _aac_reset_adapter()
1632 command->SCp.phase = AAC_OWNER_ERROR_HANDLER; in _aac_reset_adapter()
1633 command->scsi_done(command); in _aac_reset_adapter()
1646 aac->in_reset = 0; in _aac_reset_adapter()
1654 dev_info(&aac->pdev->dev, "Scheduling bus rescan\n"); in _aac_reset_adapter()
1655 aac_schedule_safw_scan_worker(aac); in _aac_reset_adapter()
1659 spin_lock_irq(host->host_lock); in _aac_reset_adapter()
1664 int aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type) in aac_reset_adapter() argument
1671 if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0) in aac_reset_adapter()
1672 return -EBUSY; in aac_reset_adapter()
1674 if (aac->in_reset) { in aac_reset_adapter()
1675 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_reset_adapter()
1676 return -EBUSY; in aac_reset_adapter()
1678 aac->in_reset = 1; in aac_reset_adapter()
1679 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_reset_adapter()
1686 host = aac->scsi_host_ptr; in aac_reset_adapter()
1689 /* Quiesce build, flush cache, write through mode */ in aac_reset_adapter()
1691 aac_send_shutdown(aac); in aac_reset_adapter()
1692 spin_lock_irqsave(host->host_lock, flagv); in aac_reset_adapter()
1695 retval = _aac_reset_adapter(aac, bled, reset_type); in aac_reset_adapter()
1696 spin_unlock_irqrestore(host->host_lock, flagv); in aac_reset_adapter()
1698 if ((forced < 2) && (retval == -ENODEV)) { in aac_reset_adapter()
1700 struct fib * fibctx = aac_fib_alloc(aac); in aac_reset_adapter()
1709 cmd->command = cpu_to_le32(VM_ContainerConfig); in aac_reset_adapter()
1710 cmd->type = cpu_to_le32(CT_PAUSE_IO); in aac_reset_adapter()
1711 cmd->timeout = cpu_to_le32(1); in aac_reset_adapter()
1712 cmd->min = cpu_to_le32(1); in aac_reset_adapter()
1713 cmd->noRescan = cpu_to_le32(1); in aac_reset_adapter()
1714 cmd->count = cpu_to_le32(0); in aac_reset_adapter()
1720 -2 /* Timeout silently */, 1, in aac_reset_adapter()
1727 if (status != -ERESTARTSYS) in aac_reset_adapter()
1735 int aac_check_health(struct aac_dev * aac) in aac_check_health() argument
1741 /* Extending the scope of fib_lock slightly to protect aac->in_reset */ in aac_check_health()
1742 if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0) in aac_check_health()
1745 if (aac->in_reset || !(BlinkLED = aac_adapter_check_health(aac))) { in aac_check_health()
1746 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_check_health()
1750 aac->in_reset = 1; in aac_check_health()
1757 * aac.aifcmd.data[2] = AifHighPriority = 3 in aac_check_health()
1758 * aac.aifcmd.data[3] = BlinkLED in aac_check_health()
1762 entry = aac->fib_list.next; in aac_check_health()
1770 while (entry != &aac->fib_list) { in aac_check_health()
1781 if (fibctx->count > 20) { in aac_check_health()
1787 u32 time_last = fibctx->jiffies; in aac_check_health()
1793 if ((time_now - time_last) > aif_timeout) { in aac_check_health()
1794 entry = entry->next; in aac_check_health()
1795 aac_close_fib_context(aac, fibctx); in aac_check_health()
1808 fib->hw_fib_va = hw_fib; in aac_check_health()
1809 fib->dev = aac; in aac_check_health()
1811 fib->type = FSAFS_NTC_FIB_CONTEXT; in aac_check_health()
1812 fib->size = sizeof (struct fib); in aac_check_health()
1813 fib->data = hw_fib->data; in aac_check_health()
1814 aif = (struct aac_aifcmd *)hw_fib->data; in aac_check_health()
1815 aif->command = cpu_to_le32(AifCmdEventNotify); in aac_check_health()
1816 aif->seqnum = cpu_to_le32(0xFFFFFFFF); in aac_check_health()
1817 ((__le32 *)aif->data)[0] = cpu_to_le32(AifEnExpEvent); in aac_check_health()
1818 ((__le32 *)aif->data)[1] = cpu_to_le32(AifExeFirmwarePanic); in aac_check_health()
1819 ((__le32 *)aif->data)[2] = cpu_to_le32(AifHighPriority); in aac_check_health()
1820 ((__le32 *)aif->data)[3] = cpu_to_le32(BlinkLED); in aac_check_health()
1826 list_add_tail(&fib->fiblink, &fibctx->fib_list); in aac_check_health()
1827 fibctx->count++; in aac_check_health()
1832 up(&fibctx->wait_sem); in aac_check_health()
1838 entry = entry->next; in aac_check_health()
1841 spin_unlock_irqrestore(&aac->fib_lock, flagv); in aac_check_health()
1845 aac->name, BlinkLED); in aac_check_health()
1849 printk(KERN_ERR "%s: Host adapter BLINK LED 0x%x\n", aac->name, BlinkLED); in aac_check_health()
1852 aac->in_reset = 0; in aac_check_health()
1856 static inline int is_safw_raid_volume(struct aac_dev *aac, int bus, int target) in is_safw_raid_volume() argument
1858 return bus == CONTAINER_CHANNEL && target < aac->maximum_num_containers; in is_safw_raid_volume()
1868 return scsi_device_lookup(dev->scsi_host_ptr, bus, target, 0); in aac_lookup_safw_scsi_device()
1876 return scsi_add_device(dev->scsi_host_ptr, bus, target, 0); in aac_add_safw_device()
1897 return dev->hba_map[bus][target].scan_counter == dev->scan_counter; in aac_is_safw_scan_count_equal()
1903 return dev->fsa_dev[target].valid; in aac_is_safw_target_valid()
1966 mutex_lock(&dev->scan_mutex); in aac_scan_host()
1967 if (dev->sa_firmware) in aac_scan_host()
1970 scsi_scan_host(dev->scsi_host_ptr); in aac_scan_host()
1971 mutex_unlock(&dev->scan_mutex); in aac_scan_host()
1989 if (fibptr->hbacmd_size & SA_AIF_HOTPLUG) in aac_handle_sa_aif()
1991 else if (fibptr->hbacmd_size & SA_AIF_HARDWARE) in aac_handle_sa_aif()
1993 else if (fibptr->hbacmd_size & SA_AIF_PDEV_CHANGE) in aac_handle_sa_aif()
1995 else if (fibptr->hbacmd_size & SA_AIF_LDEV_CHANGE) in aac_handle_sa_aif()
1997 else if (fibptr->hbacmd_size & SA_AIF_BPSTAT_CHANGE) in aac_handle_sa_aif()
1999 else if (fibptr->hbacmd_size & SA_AIF_BPCFG_CHANGE) in aac_handle_sa_aif()
2021 pr_warn(" AIF not cleared by firmware - %d/%d)\n", in aac_handle_sa_aif()
2037 * and pre-allocate a set of fibs outside the in get_fib_count()
2040 num = le32_to_cpu(dev->init->r7.adapter_fibs_size) in get_fib_count()
2042 spin_lock_irqsave(&dev->fib_lock, flagv); in get_fib_count()
2043 entry = dev->fib_list.next; in get_fib_count()
2044 while (entry != &dev->fib_list) { in get_fib_count()
2045 entry = entry->next; in get_fib_count()
2048 spin_unlock_irqrestore(&dev->fib_lock, flagv); in get_fib_count()
2065 --hw_fib_p; in fillup_pools()
2071 kfree(*(--hw_fib_p)); in fillup_pools()
2079 num = hw_fib_p - hw_fib_pool; in fillup_pools()
2100 spin_lock_irqsave(&dev->fib_lock, flagv); in wakeup_fibctx_threads()
2101 entry = dev->fib_list.next; in wakeup_fibctx_threads()
2111 while (entry != &dev->fib_list) { in wakeup_fibctx_threads()
2121 if (fibctx->count > 20) { in wakeup_fibctx_threads()
2127 time_last = fibctx->jiffies; in wakeup_fibctx_threads()
2133 if ((time_now - time_last) > aif_timeout) { in wakeup_fibctx_threads()
2134 entry = entry->next; in wakeup_fibctx_threads()
2145 entry = entry->next; in wakeup_fibctx_threads()
2158 newfib->hw_fib_va = hw_newfib; in wakeup_fibctx_threads()
2163 list_add_tail(&newfib->fiblink, &fibctx->fib_list); in wakeup_fibctx_threads()
2164 fibctx->count++; in wakeup_fibctx_threads()
2169 up(&fibctx->wait_sem); in wakeup_fibctx_threads()
2171 entry = entry->next; in wakeup_fibctx_threads()
2176 *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); in wakeup_fibctx_threads()
2178 spin_unlock_irqrestore(&dev->fib_lock, flagv); in wakeup_fibctx_threads()
2189 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2192 while (!list_empty(&(dev->queues->queue[HostNormCmdQueue].cmdq))) { in aac_process_events()
2201 entry = dev->queues->queue[HostNormCmdQueue].cmdq.next; in aac_process_events()
2204 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2208 hw_fib = fib->hw_fib_va; in aac_process_events()
2209 if (dev->sa_firmware) { in aac_process_events()
2222 fib->type = FSAFS_NTC_FIB_CONTEXT; in aac_process_events()
2223 fib->size = sizeof(struct fib); in aac_process_events()
2224 fib->hw_fib_va = hw_fib; in aac_process_events()
2225 fib->data = hw_fib->data; in aac_process_events()
2226 fib->dev = dev; in aac_process_events()
2231 aifcmd = (struct aac_aifcmd *) hw_fib->data; in aac_process_events()
2232 if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) { in aac_process_events()
2235 *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); in aac_process_events()
2245 if (aifcmd->command == cpu_to_le32(AifCmdEventNotify) in aac_process_events()
2246 || aifcmd->command == cpu_to_le32(AifCmdJobProgress)) { in aac_process_events()
2296 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2302 t_lock = dev->queues->queue[HostNormCmdQueue].lock; in aac_process_events()
2314 int ret = -ENOMEM; in aac_send_wellness_command()
2321 dma_buf = dma_alloc_coherent(&dev->pdev->dev, datasize, &addr, in aac_send_wellness_command()
2328 vbus = (u32)le16_to_cpu(dev->supplement_adapter_info.virt_device_bus); in aac_send_wellness_command()
2329 vid = (u32)le16_to_cpu(dev->supplement_adapter_info.virt_device_target); in aac_send_wellness_command()
2333 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_send_wellness_command()
2334 srbcmd->channel = cpu_to_le32(vbus); in aac_send_wellness_command()
2335 srbcmd->id = cpu_to_le32(vid); in aac_send_wellness_command()
2336 srbcmd->lun = 0; in aac_send_wellness_command()
2337 srbcmd->flags = cpu_to_le32(SRB_DataOut); in aac_send_wellness_command()
2338 srbcmd->timeout = cpu_to_le32(10); in aac_send_wellness_command()
2339 srbcmd->retry_limit = 0; in aac_send_wellness_command()
2340 srbcmd->cdb_size = cpu_to_le32(12); in aac_send_wellness_command()
2341 srbcmd->count = cpu_to_le32(datasize); in aac_send_wellness_command()
2343 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_send_wellness_command()
2344 srbcmd->cdb[0] = BMIC_OUT; in aac_send_wellness_command()
2345 srbcmd->cdb[6] = WRITE_HOST_WELLNESS; in aac_send_wellness_command()
2348 sg64 = (struct sgmap64 *)&srbcmd->sg; in aac_send_wellness_command()
2349 sg64->count = cpu_to_le32(1); in aac_send_wellness_command()
2350 sg64->sg[0].addr[1] = cpu_to_le32((u32)(((addr) >> 16) >> 16)); in aac_send_wellness_command()
2351 sg64->sg[0].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_send_wellness_command()
2352 sg64->sg[0].count = cpu_to_le32(datasize); in aac_send_wellness_command()
2357 dma_free_coherent(&dev->pdev->dev, datasize, dma_buf, addr); in aac_send_wellness_command()
2370 if (ret != -ERESTARTSYS) in aac_send_wellness_command()
2386 int ret = -ENODEV; in aac_send_safw_hostttime()
2388 if (!dev->sa_firmware) in aac_send_safw_hostttime()
2391 local_time = (now->tv_sec - (sys_tz.tz_minuteswest * 60)); in aac_send_safw_hostttime()
2411 int ret = -ENOMEM; in aac_send_hosttime()
2421 *info = cpu_to_le32(now->tv_sec); /* overflow in y2106 */ in aac_send_hosttime()
2436 if (ret != -ERESTARTSYS) in aac_send_hosttime()
2444 * aac_command_thread - command processing thread
2464 if (dev->aif_thread) in aac_command_thread()
2465 return -EINVAL; in aac_command_thread()
2470 dev->aif_thread = 1; in aac_command_thread()
2471 add_wait_queue(&dev->queues->queue[HostNormCmdQueue].cmdready, &wait); in aac_command_thread()
2482 && ((difference = next_check_jiffies - jiffies) <= 0)) { in aac_command_thread()
2488 } else if (!dev->queues) in aac_command_thread()
2492 && ((difference = next_jiffies - jiffies) <= 0)) { in aac_command_thread()
2498 if (ret || !dev->queues) in aac_command_thread()
2506 if (((NSEC_PER_SEC - (NSEC_PER_SEC / HZ)) > now.tv_nsec) in aac_command_thread()
2508 difference = HZ + HZ / 2 - in aac_command_thread()
2514 if (dev->sa_firmware) in aac_command_thread()
2524 difference = next_check_jiffies - jiffies; in aac_command_thread()
2542 if (dev->queues) in aac_command_thread()
2543 remove_wait_queue(&dev->queues->queue[HostNormCmdQueue].cmdready, &wait); in aac_command_thread()
2544 dev->aif_thread = 0; in aac_command_thread()
2554 if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) { in aac_acquire_irq()
2555 for (i = 0; i < dev->max_msix; i++) { in aac_acquire_irq()
2556 dev->aac_msix[i].vector_no = i; in aac_acquire_irq()
2557 dev->aac_msix[i].dev = dev; in aac_acquire_irq()
2558 if (request_irq(pci_irq_vector(dev->pdev, i), in aac_acquire_irq()
2559 dev->a_ops.adapter_intr, in aac_acquire_irq()
2560 0, "aacraid", &(dev->aac_msix[i]))) { in aac_acquire_irq()
2562 dev->name, dev->id, i); in aac_acquire_irq()
2564 free_irq(pci_irq_vector(dev->pdev, j), in aac_acquire_irq()
2565 &(dev->aac_msix[j])); in aac_acquire_irq()
2566 pci_disable_msix(dev->pdev); in aac_acquire_irq()
2567 ret = -1; in aac_acquire_irq()
2571 dev->aac_msix[0].vector_no = 0; in aac_acquire_irq()
2572 dev->aac_msix[0].dev = dev; in aac_acquire_irq()
2574 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_acquire_irq()
2576 &(dev->aac_msix[0])) < 0) { in aac_acquire_irq()
2577 if (dev->msi) in aac_acquire_irq()
2578 pci_disable_msi(dev->pdev); in aac_acquire_irq()
2580 dev->name, dev->id); in aac_acquire_irq()
2581 ret = -1; in aac_acquire_irq()
2594 if (dev->max_msix > 1) { in aac_free_irq()
2595 for (i = 0; i < dev->max_msix; i++) in aac_free_irq()
2596 free_irq(pci_irq_vector(dev->pdev, i), in aac_free_irq()
2597 &(dev->aac_msix[i])); in aac_free_irq()
2599 free_irq(dev->pdev->irq, &(dev->aac_msix[0])); in aac_free_irq()
2602 free_irq(dev->pdev->irq, dev); in aac_free_irq()
2604 if (dev->msi) in aac_free_irq()
2605 pci_disable_msi(dev->pdev); in aac_free_irq()
2606 else if (dev->max_msix > 1) in aac_free_irq()
2607 pci_disable_msix(dev->pdev); in aac_free_irq()