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)
73 const unsigned long fibsize = dev->max_fib_size; in aac_alloc_comm()
80 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) || in aac_alloc_comm()
81 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) || in aac_alloc_comm()
82 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && in aac_alloc_comm()
83 !dev->sa_firmware)) { in aac_alloc_comm()
85 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) in aac_alloc_comm()
88 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && in aac_alloc_comm()
89 dev->sa_firmware) { in aac_alloc_comm()
90 host_rrq_size = (dev->scsi_host_ptr->can_queue in aac_alloc_comm()
93 (AAC_MAX_HRRQ - 1) * sizeof(struct _rrq); in aac_alloc_comm()
101 base = dma_alloc_coherent(&dev->pdev->dev, size, &phys, GFP_KERNEL); in aac_alloc_comm()
107 dev->comm_addr = (void *)base; in aac_alloc_comm()
108 dev->comm_phys = phys; in aac_alloc_comm()
109 dev->comm_size = size; in aac_alloc_comm()
111 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) || in aac_alloc_comm()
112 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) || in aac_alloc_comm()
113 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)) { in aac_alloc_comm()
114 dev->host_rrq = (u32 *)(base + fibsize); in aac_alloc_comm()
115 dev->host_rrq_pa = phys + fibsize; in aac_alloc_comm()
116 memset(dev->host_rrq, 0, host_rrq_size); in aac_alloc_comm()
119 dev->init = (union aac_init *)(base + fibsize + host_rrq_size); in aac_alloc_comm()
120 dev->init_pa = phys + fibsize + host_rrq_size; in aac_alloc_comm()
122 init = dev->init; in aac_alloc_comm()
124 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_alloc_comm()
128 init->r8.init_struct_revision = in aac_alloc_comm()
130 init->r8.init_flags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED | in aac_alloc_comm()
133 init->r8.init_flags |= in aac_alloc_comm()
135 init->r8.rr_queue_count = cpu_to_le32(dev->max_msix); in aac_alloc_comm()
136 init->r8.max_io_size = in aac_alloc_comm()
137 cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
138 init->r8.max_num_aif = init->r8.reserved1 = in aac_alloc_comm()
139 init->r8.reserved2 = 0; in aac_alloc_comm()
141 for (i = 0; i < dev->max_msix; i++) { in aac_alloc_comm()
142 addr = (u64)dev->host_rrq_pa + dev->vector_cap * i * in aac_alloc_comm()
144 init->r8.rrq[i].host_addr_high = cpu_to_le32( in aac_alloc_comm()
146 init->r8.rrq[i].host_addr_low = cpu_to_le32( in aac_alloc_comm()
148 init->r8.rrq[i].msix_id = i; in aac_alloc_comm()
149 init->r8.rrq[i].element_count = cpu_to_le16( in aac_alloc_comm()
150 (u16)dev->vector_cap); in aac_alloc_comm()
151 init->r8.rrq[i].comp_thresh = in aac_alloc_comm()
152 init->r8.rrq[i].unused = 0; in aac_alloc_comm()
157 init->r7.init_struct_revision = in aac_alloc_comm()
159 if (dev->max_fib_size != sizeof(struct hw_fib)) in aac_alloc_comm()
160 init->r7.init_struct_revision = in aac_alloc_comm()
162 init->r7.no_of_msix_vectors = cpu_to_le32(SA_MINIPORT_REVISION); in aac_alloc_comm()
163 init->r7.fsrev = cpu_to_le32(dev->fsrev); in aac_alloc_comm()
169 dev->aif_base_va = (struct hw_fib *)base; in aac_alloc_comm()
171 init->r7.adapter_fibs_virtual_address = 0; in aac_alloc_comm()
172 init->r7.adapter_fibs_physical_address = cpu_to_le32((u32)phys); in aac_alloc_comm()
173 init->r7.adapter_fibs_size = cpu_to_le32(fibsize); in aac_alloc_comm()
174 init->r7.adapter_fib_align = cpu_to_le32(sizeof(struct hw_fib)); in aac_alloc_comm()
184 dma_get_required_mask(&dev->pdev->dev) >> 12; in aac_alloc_comm()
186 init->r7.host_phys_mem_pages = in aac_alloc_comm()
189 init->r7.host_phys_mem_pages = in aac_alloc_comm()
192 init->r7.init_flags = in aac_alloc_comm()
195 init->r7.max_io_commands = in aac_alloc_comm()
196 cpu_to_le32(dev->scsi_host_ptr->can_queue + in aac_alloc_comm()
198 init->r7.max_io_size = in aac_alloc_comm()
199 cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
200 init->r7.max_fib_size = cpu_to_le32(dev->max_fib_size); in aac_alloc_comm()
201 init->r7.max_num_aif = cpu_to_le32(dev->max_num_aif); in aac_alloc_comm()
203 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_alloc_comm()
204 init->r7.init_flags |= in aac_alloc_comm()
207 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { in aac_alloc_comm()
208 init->r7.init_struct_revision = in aac_alloc_comm()
210 init->r7.init_flags |= in aac_alloc_comm()
214 init->r7.host_rrq_addr_high = in aac_alloc_comm()
215 cpu_to_le32(upper_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
216 init->r7.host_rrq_addr_low = in aac_alloc_comm()
217 cpu_to_le32(lower_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
219 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
220 init->r7.init_struct_revision = in aac_alloc_comm()
222 init->r7.init_flags |= in aac_alloc_comm()
226 init->r7.host_rrq_addr_high = in aac_alloc_comm()
227 cpu_to_le32(upper_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
228 init->r7.host_rrq_addr_low = in aac_alloc_comm()
229 cpu_to_le32(lower_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
230 init->r7.no_of_msix_vectors = in aac_alloc_comm()
231 cpu_to_le32(dev->max_msix); in aac_alloc_comm()
247 align = (commalign - ((uintptr_t)(base) & (commalign - 1))); in aac_alloc_comm()
254 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) in aac_alloc_comm()
255 init->r7.comm_header_address = cpu_to_le32((u32)phys); in aac_alloc_comm()
264 dev->printfbuf = (void *)base; in aac_alloc_comm()
265 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) { in aac_alloc_comm()
266 init->r7.printfbuf = cpu_to_le32(phys); in aac_alloc_comm()
267 init->r7.printfbufsiz = cpu_to_le32(printfbufsiz); in aac_alloc_comm()
275 atomic_set(&q->numpending, 0); in aac_queue_init()
276 q->dev = dev; in aac_queue_init()
277 init_waitqueue_head(&q->cmdready); in aac_queue_init()
278 INIT_LIST_HEAD(&q->cmdq); in aac_queue_init()
279 init_waitqueue_head(&q->qfull); in aac_queue_init()
280 spin_lock_init(&q->lockdata); in aac_queue_init()
281 q->lock = &q->lockdata; in aac_queue_init()
282 q->headers.producer = (__le32 *)mem; in aac_queue_init()
283 q->headers.consumer = (__le32 *)(mem+1); in aac_queue_init()
284 *(q->headers.producer) = cpu_to_le32(qsize); in aac_queue_init()
285 *(q->headers.consumer) = cpu_to_le32(qsize); in aac_queue_init()
286 q->entries = qsize; in aac_queue_init()
289 static void aac_wait_for_io_completion(struct aac_dev *aac) in aac_wait_for_io_completion() argument
294 for (i = 60; i; --i) { in aac_wait_for_io_completion()
299 __shost_for_each_device(dev, aac->scsi_host_ptr) { in aac_wait_for_io_completion()
300 spin_lock_irqsave(&dev->list_lock, flagv); in aac_wait_for_io_completion()
301 list_for_each_entry(command, &dev->cmd_list, list) { in aac_wait_for_io_completion()
302 if (command->SCp.phase == AAC_OWNER_FIRMWARE) { in aac_wait_for_io_completion()
307 spin_unlock_irqrestore(&dev->list_lock, flagv); in aac_wait_for_io_completion()
322 * aac_send_shutdown - shutdown an adapter
337 if (!dev->adapter_shutdown) { in aac_send_shutdown()
338 mutex_lock(&dev->ioctl_mutex); in aac_send_shutdown()
339 dev->adapter_shutdown = 1; in aac_send_shutdown()
340 mutex_unlock(&dev->ioctl_mutex); in aac_send_shutdown()
347 return -ENOMEM; in aac_send_shutdown()
351 cmd->command = cpu_to_le32(VM_CloseAll); in aac_send_shutdown()
352 cmd->cid = cpu_to_le32(0xfffffffe); in aac_send_shutdown()
358 -2 /* Timeout silently */, 1, in aac_send_shutdown()
364 if (status != -ERESTARTSYS) in aac_send_shutdown()
367 dev->msi_enabled) in aac_send_shutdown()
373 * aac_comm_init - Initialise FSA data structures
379 * 1 - if we were able to init the commuication interface.
380 * 0 - If there were errors initing. This is a fatal error.
390 struct aac_queue_block * comm = dev->queues; in aac_comm_init()
397 spin_lock_init(&dev->fib_lock); in aac_comm_init()
407 return -ENOMEM; in aac_comm_init()
412 comm->queue[HostNormCmdQueue].base = queues; in aac_comm_init()
413 aac_queue_init(dev, &comm->queue[HostNormCmdQueue], headers, HOST_NORM_CMD_ENTRIES); in aac_comm_init()
418 comm->queue[HostHighCmdQueue].base = queues; in aac_comm_init()
419 aac_queue_init(dev, &comm->queue[HostHighCmdQueue], headers, HOST_HIGH_CMD_ENTRIES); in aac_comm_init()
425 comm->queue[AdapNormCmdQueue].base = queues; in aac_comm_init()
426 aac_queue_init(dev, &comm->queue[AdapNormCmdQueue], headers, ADAP_NORM_CMD_ENTRIES); in aac_comm_init()
432 comm->queue[AdapHighCmdQueue].base = queues; in aac_comm_init()
433 aac_queue_init(dev, &comm->queue[AdapHighCmdQueue], headers, ADAP_HIGH_CMD_ENTRIES); in aac_comm_init()
439 comm->queue[HostNormRespQueue].base = queues; in aac_comm_init()
440 aac_queue_init(dev, &comm->queue[HostNormRespQueue], headers, HOST_NORM_RESP_ENTRIES); in aac_comm_init()
445 comm->queue[HostHighRespQueue].base = queues; in aac_comm_init()
446 aac_queue_init(dev, &comm->queue[HostHighRespQueue], headers, HOST_HIGH_RESP_ENTRIES); in aac_comm_init()
452 comm->queue[AdapNormRespQueue].base = queues; in aac_comm_init()
453 aac_queue_init(dev, &comm->queue[AdapNormRespQueue], headers, ADAP_NORM_RESP_ENTRIES); in aac_comm_init()
459 comm->queue[AdapHighRespQueue].base = queues; in aac_comm_init()
460 aac_queue_init(dev, &comm->queue[AdapHighRespQueue], headers, ADAP_HIGH_RESP_ENTRIES); in aac_comm_init()
462 comm->queue[AdapNormCmdQueue].lock = comm->queue[HostNormRespQueue].lock; in aac_comm_init()
463 comm->queue[AdapHighCmdQueue].lock = comm->queue[HostHighRespQueue].lock; in aac_comm_init()
464 comm->queue[AdapNormRespQueue].lock = comm->queue[HostNormCmdQueue].lock; in aac_comm_init()
465 comm->queue[AdapHighRespQueue].lock = comm->queue[HostHighCmdQueue].lock; in aac_comm_init()
476 if (dev->max_msix == 0 || in aac_define_int_mode()
477 dev->pdev->device == PMC_DEVICE_S6 || in aac_define_int_mode()
478 dev->sync_mode) { in aac_define_int_mode()
479 dev->max_msix = 1; in aac_define_int_mode()
480 dev->vector_cap = in aac_define_int_mode()
481 dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
486 /* Don't bother allocating more MSI-X vectors than cpus */ in aac_define_int_mode()
487 msi_count = min(dev->max_msix, in aac_define_int_mode()
490 dev->max_msix = msi_count; in aac_define_int_mode()
496 pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { in aac_define_int_mode()
498 i = pci_alloc_irq_vectors(dev->pdev, in aac_define_int_mode()
502 dev->msi_enabled = 1; in aac_define_int_mode()
505 dev->msi_enabled = 0; in aac_define_int_mode()
506 dev_err(&dev->pdev->dev, in aac_define_int_mode()
511 if (!dev->msi_enabled) in aac_define_int_mode()
512 dev->max_msix = msi_count = 1; in aac_define_int_mode()
514 if (dev->max_msix > msi_count) in aac_define_int_mode()
515 dev->max_msix = msi_count; in aac_define_int_mode()
517 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && dev->sa_firmware) in aac_define_int_mode()
518 dev->vector_cap = dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
521 dev->vector_cap = (dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
528 struct Scsi_Host * host = dev->scsi_host_ptr; in aac_init_adapter()
534 dev->management_fib_count = 0; in aac_init_adapter()
535 spin_lock_init(&dev->manage_lock); in aac_init_adapter()
536 spin_lock_init(&dev->sync_lock); in aac_init_adapter()
537 spin_lock_init(&dev->iq_lock); in aac_init_adapter()
538 dev->max_fib_size = sizeof(struct hw_fib); in aac_init_adapter()
539 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size in aac_init_adapter()
540 - sizeof(struct aac_fibhdr) in aac_init_adapter()
541 - sizeof(struct aac_write) + sizeof(struct sgentry)) in aac_init_adapter()
543 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
544 dev->raw_io_interface = dev->raw_io_64 = 0; in aac_init_adapter()
548 * Enable INTX mode, if not done already Enabled in aac_init_adapter()
552 dev_info(&dev->pdev->dev, "Changed firmware to INTX mode"); in aac_init_adapter()
559 dev->doorbell_mask = status[3]; in aac_init_adapter()
561 dev->raw_io_64 = 1; in aac_init_adapter()
562 dev->sync_mode = aac_sync_mode; in aac_init_adapter()
563 if (dev->a_ops.adapter_comm && in aac_init_adapter()
565 dev->comm_interface = AAC_COMM_MESSAGE; in aac_init_adapter()
566 dev->raw_io_interface = 1; in aac_init_adapter()
569 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; in aac_init_adapter()
572 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
575 dev->comm_interface = AAC_COMM_MESSAGE_TYPE3; in aac_init_adapter()
577 /* not supported TYPE - switch to sync. mode */ in aac_init_adapter()
578 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
579 dev->sync_mode = 1; in aac_init_adapter()
584 dev->sa_firmware = 1; in aac_init_adapter()
586 dev->sa_firmware = 0; in aac_init_adapter()
588 if ((dev->comm_interface == AAC_COMM_MESSAGE) && in aac_init_adapter()
589 (status[2] > dev->base_size)) { in aac_init_adapter()
591 dev->base_size = status[2]; in aac_init_adapter()
594 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
603 dev->max_msix = 0; in aac_init_adapter()
604 dev->msi_enabled = 0; in aac_init_adapter()
605 dev->adapter_shutdown = 0; in aac_init_adapter()
617 host->max_sectors = (status[1] >> 16) << 1; in aac_init_adapter()
619 dev->max_fib_size = status[1] & 0xFFE0; in aac_init_adapter()
620 host->sg_tablesize = status[2] >> 16; in aac_init_adapter()
621 dev->sg_tablesize = status[2] & 0xFFFF; in aac_init_adapter()
623 if (host->can_queue > (status[3] >> 16) - in aac_init_adapter()
625 host->can_queue = (status[3] >> 16) - in aac_init_adapter()
627 } else if (host->can_queue > (status[3] & 0xFFFF) - in aac_init_adapter()
629 host->can_queue = (status[3] & 0xFFFF) - in aac_init_adapter()
632 dev->max_num_aif = status[4] & 0xFFFF; in aac_init_adapter()
635 if (numacb < host->can_queue) in aac_init_adapter()
636 host->can_queue = numacb; in aac_init_adapter()
647 dev->queues = kzalloc(sizeof(struct aac_queue_block), GFP_KERNEL); in aac_init_adapter()
648 if (dev->queues == NULL) { in aac_init_adapter()
654 kfree(dev->queues); in aac_init_adapter()
661 kfree(dev->queues); in aac_init_adapter()
665 INIT_LIST_HEAD(&dev->fib_list); in aac_init_adapter()
666 INIT_LIST_HEAD(&dev->sync_fib_list); in aac_init_adapter()