• 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)
56 int isFastResponse, mode; in aac_src_intr_message() local
60 dev = ctx->dev; in aac_src_intr_message()
61 vector_no = ctx->vector_no; in aac_src_intr_message()
63 if (dev->msi_enabled) { in aac_src_intr_message()
64 mode = AAC_INT_MODE_MSI; in aac_src_intr_message()
68 mode |= AAC_INT_MODE_AIF; in aac_src_intr_message()
70 mode |= AAC_INT_MODE_SYNC; in aac_src_intr_message()
73 mode = AAC_INT_MODE_INTX; in aac_src_intr_message()
85 mode |= AAC_INT_MODE_AIF; in aac_src_intr_message()
87 mode |= AAC_INT_MODE_SYNC; in aac_src_intr_message()
91 if (mode & AAC_INT_MODE_SYNC) { in aac_src_intr_message()
97 if (!aac_sync_mode && !dev->msi_enabled) { in aac_src_intr_message()
102 if (dev->sync_fib) { in aac_src_intr_message()
103 if (dev->sync_fib->callback) in aac_src_intr_message()
104 dev->sync_fib->callback(dev->sync_fib->callback_data, in aac_src_intr_message()
105 dev->sync_fib); in aac_src_intr_message()
106 spin_lock_irqsave(&dev->sync_fib->event_lock, sflags); in aac_src_intr_message()
107 if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) { in aac_src_intr_message()
108 dev->management_fib_count--; in aac_src_intr_message()
109 up(&dev->sync_fib->event_wait); in aac_src_intr_message()
111 spin_unlock_irqrestore(&dev->sync_fib->event_lock, in aac_src_intr_message()
113 spin_lock_irqsave(&dev->sync_lock, sflags); in aac_src_intr_message()
114 if (!list_empty(&dev->sync_fib_list)) { in aac_src_intr_message()
115 entry = dev->sync_fib_list.next; in aac_src_intr_message()
116 dev->sync_fib = list_entry(entry, in aac_src_intr_message()
122 dev->sync_fib = NULL; in aac_src_intr_message()
124 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_src_intr_message()
127 (u32)dev->sync_fib->hw_fib_pa, in aac_src_intr_message()
132 if (!dev->msi_enabled) in aac_src_intr_message()
133 mode = 0; in aac_src_intr_message()
137 if (mode & AAC_INT_MODE_AIF) { in aac_src_intr_message()
139 if (dev->sa_firmware) { in aac_src_intr_message()
143 writel(events, &dev->IndexRegs->Mailbox[0]); in aac_src_intr_message()
146 if (dev->aif_thread && dev->fsa_dev) in aac_src_intr_message()
149 if (dev->msi_enabled) in aac_src_intr_message()
151 mode = 0; in aac_src_intr_message()
154 if (mode) { in aac_src_intr_message()
155 index = dev->host_rrq_idx[vector_no]; in aac_src_intr_message()
160 handle = le32_to_cpu((dev->host_rrq[index]) in aac_src_intr_message()
169 if (dev->msi_enabled && dev->max_msix > 1) in aac_src_intr_message()
170 atomic_dec(&dev->rrq_outstanding[vector_no]); in aac_src_intr_message()
172 dev->host_rrq[index++] = 0; in aac_src_intr_message()
173 if (index == (vector_no + 1) * dev->vector_cap) in aac_src_intr_message()
174 index = vector_no * dev->vector_cap; in aac_src_intr_message()
175 dev->host_rrq_idx[vector_no] = index; in aac_src_intr_message()
177 mode = 0; in aac_src_intr_message()
184 * aac_src_disable_interrupt - Disable interrupts
190 src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); in aac_src_disable_interrupt()
194 * aac_src_enable_interrupt_message - Enable interrupts
204 * src_sync_cmd - send a command and wait
225 writel(command, &dev->IndexRegs->Mailbox[0]); in src_sync_cmd()
227 * Write the parameters into Mailboxes 1 - 6 in src_sync_cmd()
229 writel(p1, &dev->IndexRegs->Mailbox[1]); in src_sync_cmd()
230 writel(p2, &dev->IndexRegs->Mailbox[2]); in src_sync_cmd()
231 writel(p3, &dev->IndexRegs->Mailbox[3]); in src_sync_cmd()
232 writel(p4, &dev->IndexRegs->Mailbox[4]); in src_sync_cmd()
237 if (!dev->msi_enabled) in src_sync_cmd()
245 src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); in src_sync_cmd()
258 if ((!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) && in src_sync_cmd()
259 !dev->in_soft_reset) { in src_sync_cmd()
279 if (dev->msi_enabled) in src_sync_cmd()
299 return -ETIMEDOUT; in src_sync_cmd()
305 *status = readl(&dev->IndexRegs->Mailbox[0]); in src_sync_cmd()
307 *r1 = readl(&dev->IndexRegs->Mailbox[1]); in src_sync_cmd()
309 *r2 = readl(&dev->IndexRegs->Mailbox[2]); in src_sync_cmd()
311 *r3 = readl(&dev->IndexRegs->Mailbox[3]); in src_sync_cmd()
313 *r4 = readl(&dev->IndexRegs->Mailbox[4]); in src_sync_cmd()
315 dev->max_msix = in src_sync_cmd()
316 readl(&dev->IndexRegs->Mailbox[5]) & 0xFFFF; in src_sync_cmd()
320 if (!dev->msi_enabled) in src_sync_cmd()
334 * aac_src_interrupt_adapter - interrupt adapter
348 * aac_src_notify_adapter - send an event to the adapter
391 * aac_src_start_adapter - activate adapter
394 * Start up processing on an i960 based AAC adapter
403 for (i = 0; i < dev->max_msix; i++) { in aac_src_start_adapter()
404 dev->host_rrq_idx[i] = i * dev->vector_cap; in aac_src_start_adapter()
405 atomic_set(&dev->rrq_outstanding[i], 0); in aac_src_start_adapter()
407 atomic_set(&dev->msix_counter, 0); in aac_src_start_adapter()
408 dev->fibs_pushed_no = 0; in aac_src_start_adapter()
410 init = dev->init; in aac_src_start_adapter()
411 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_src_start_adapter()
412 init->r8.host_elapsed_seconds = in aac_src_start_adapter()
415 lower_32_bits(dev->init_pa), in aac_src_start_adapter()
416 upper_32_bits(dev->init_pa), in aac_src_start_adapter()
418 (AAC_MAX_HRRQ - 1) * sizeof(struct _rrq), in aac_src_start_adapter()
421 init->r7.host_elapsed_seconds = in aac_src_start_adapter()
425 (u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0, in aac_src_start_adapter()
464 return -3; in aac_src_check_health()
471 return -1; in aac_src_check_health()
479 return atomic_inc_return(&dev->msix_counter)%dev->max_msix; in aac_get_vector()
490 struct aac_dev *dev = fib->dev; in aac_src_deliver_message()
491 struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; in aac_src_deliver_message()
502 atomic_inc(&q->numpending); in aac_src_deliver_message()
504 native_hba = (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) ? 1 : 0; in aac_src_deliver_message()
507 if (dev->msi_enabled && dev->max_msix > 1 && in aac_src_deliver_message()
508 (native_hba || fib->hw_fib_va->header.Command != AifRequest)) { in aac_src_deliver_message()
510 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) in aac_src_deliver_message()
511 && dev->sa_firmware) in aac_src_deliver_message()
514 vector_no = fib->vector_no; in aac_src_deliver_message()
517 if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) { in aac_src_deliver_message()
521 fib->hw_fib_va; in aac_src_deliver_message()
522 if (tm_req->iu_type == in aac_src_deliver_message()
525 fib->hw_fib_va)->reply_qid in aac_src_deliver_message()
528 fib->hw_fib_va)->request_id in aac_src_deliver_message()
532 fib->hw_fib_va)->reply_qid in aac_src_deliver_message()
535 fib->hw_fib_va)->request_id in aac_src_deliver_message()
540 fib->hw_fib_va)->reply_qid in aac_src_deliver_message()
543 fib->hw_fib_va)->request_id in aac_src_deliver_message()
547 fib->hw_fib_va->header.Handle += (vector_no << 16); in aac_src_deliver_message()
553 atomic_inc(&dev->rrq_outstanding[vector_no]); in aac_src_deliver_message()
556 address = fib->hw_fib_pa; in aac_src_deliver_message()
557 fibsize = (fib->hbacmd_size + 127) / 128 - 1; in aac_src_deliver_message()
564 spin_lock_irqsave(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
568 spin_unlock_irqrestore(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
571 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_src_deliver_message()
572 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_src_deliver_message()
574 fibsize = (le16_to_cpu(fib->hw_fib_va->header.Size) in aac_src_deliver_message()
575 + 127) / 128 - 1; in aac_src_deliver_message()
576 /* New FIB header, 32-bit */ in aac_src_deliver_message()
577 address = fib->hw_fib_pa; in aac_src_deliver_message()
578 fib->hw_fib_va->header.StructType = FIB_MAGIC2; in aac_src_deliver_message()
579 fib->hw_fib_va->header.SenderFibAddress = in aac_src_deliver_message()
581 fib->hw_fib_va->header.u.TimeStamp = 0; in aac_src_deliver_message()
586 le16_to_cpu(fib->hw_fib_va->header.Size) in aac_src_deliver_message()
587 + 127) / 128 - 1; in aac_src_deliver_message()
590 ((unsigned char *)fib->hw_fib_va - in aac_src_deliver_message()
592 pFibX->Handle = fib->hw_fib_va->header.Handle; in aac_src_deliver_message()
593 pFibX->HostAddress = in aac_src_deliver_message()
594 cpu_to_le64((u64)fib->hw_fib_pa); in aac_src_deliver_message()
595 pFibX->Size = cpu_to_le32( in aac_src_deliver_message()
596 le16_to_cpu(fib->hw_fib_va->header.Size)); in aac_src_deliver_message()
597 address = fib->hw_fib_pa - in aac_src_deliver_message()
607 spin_lock_irqsave(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
611 spin_unlock_irqrestore(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
625 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
626 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
627 iounmap(dev->regs.src.bar0); in aac_src_ioremap()
628 dev->base = dev->regs.src.bar0 = NULL; in aac_src_ioremap()
631 dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2), in aac_src_ioremap()
633 dev->base = NULL; in aac_src_ioremap()
634 if (dev->regs.src.bar1 == NULL) in aac_src_ioremap()
635 return -1; in aac_src_ioremap()
636 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_src_ioremap()
637 if (dev->base == NULL) { in aac_src_ioremap()
638 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
639 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
640 return -1; in aac_src_ioremap()
642 dev->IndexRegs = &((struct src_registers __iomem *) in aac_src_ioremap()
643 dev->base)->u.tupelo.IndexRegs; in aac_src_ioremap()
655 iounmap(dev->regs.src.bar0); in aac_srcv_ioremap()
656 dev->base = dev->regs.src.bar0 = NULL; in aac_srcv_ioremap()
660 dev->regs.src.bar1 = in aac_srcv_ioremap()
661 ioremap(pci_resource_start(dev->pdev, 2), AAC_MIN_SRCV_BAR1_SIZE); in aac_srcv_ioremap()
662 dev->base = NULL; in aac_srcv_ioremap()
663 if (dev->regs.src.bar1 == NULL) in aac_srcv_ioremap()
664 return -1; in aac_srcv_ioremap()
665 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_srcv_ioremap()
666 if (dev->base == NULL) { in aac_srcv_ioremap()
667 iounmap(dev->regs.src.bar1); in aac_srcv_ioremap()
668 dev->regs.src.bar1 = NULL; in aac_srcv_ioremap()
669 return -1; in aac_srcv_ioremap()
671 dev->IndexRegs = &((struct src_registers __iomem *) in aac_srcv_ioremap()
672 dev->base)->u.denali.IndexRegs; in aac_srcv_ioremap()
678 if (dev->msi_enabled) { in aac_set_intx_mode()
680 dev->msi_enabled = 0; in aac_set_intx_mode()
711 supported_options3 = dev->supplement_adapter_info.supported_options3; in aac_dump_fw_fib_iop_reset()
776 val = readl(((char *)(dev->base) + IBW_SWR_OFFSET)); in aac_send_hardware_soft_reset()
778 writel(val, ((char *)(dev->base) + IBW_SWR_OFFSET)); in aac_send_hardware_soft_reset()
791 dev_err(&dev->pdev->dev, "adapter kernel panic'd %x.\n", bled); in aac_src_restart_adapter()
796 if (bled >= 2 && dev->sa_firmware && reset_type & HW_IOP_RESET) in aac_src_restart_adapter()
799 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_restart_adapter()
801 dev_err(&dev->pdev->dev, "Controller reset type is %d\n", reset_type); in aac_src_restart_adapter()
804 dev_info(&dev->pdev->dev, "Issuing IOP reset\n"); in aac_src_restart_adapter()
812 dev_err(&dev->pdev->dev, "IOP reset failed\n"); in aac_src_restart_adapter()
814 dev_info(&dev->pdev->dev, "IOP reset succeeded\n"); in aac_src_restart_adapter()
819 if (!dev->sa_firmware) { in aac_src_restart_adapter()
820 dev_err(&dev->pdev->dev, "ARC Reset attempt failed\n"); in aac_src_restart_adapter()
821 ret = -ENODEV; in aac_src_restart_adapter()
826 dev_info(&dev->pdev->dev, "Issuing SOFT reset\n"); in aac_src_restart_adapter()
828 dev->msi_enabled = 0; in aac_src_restart_adapter()
832 dev_err(&dev->pdev->dev, "SOFT reset failed\n"); in aac_src_restart_adapter()
833 ret = -ENODEV; in aac_src_restart_adapter()
836 dev_info(&dev->pdev->dev, "SOFT reset succeeded\n"); in aac_src_restart_adapter()
848 ret = -ENODEV; in aac_src_restart_adapter()
853 * aac_src_select_comm - Select communications method
861 dev->a_ops.adapter_intr = aac_src_intr_message; in aac_src_select_comm()
862 dev->a_ops.adapter_deliver = aac_src_deliver_message; in aac_src_select_comm()
871 * aac_src_init - initialize an Cardinal Frey Bar card
881 int instance = dev->id; in aac_src_init()
882 const char *name = dev->name; in aac_src_init()
884 dev->a_ops.adapter_ioremap = aac_src_ioremap; in aac_src_init()
885 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_src_init()
887 dev->base_size = AAC_MIN_SRC_BAR0_SIZE; in aac_src_init()
888 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_src_init()
894 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
895 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
897 if (dev->init_reset) { in aac_src_init()
898 dev->init_reset = false; in aac_src_init()
918 printk(KERN_ERR "%s%d: adapter self-test failed.\n", in aac_src_init()
919 dev->name, instance); in aac_src_init()
927 dev->name, instance); in aac_src_init()
940 dev->name, instance, status); in aac_src_init()
947 ? (startup_timeout - 60) in aac_src_init()
961 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_src_init()
962 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_src_init()
963 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
964 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_src_init()
965 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
966 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_src_init()
967 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_src_init()
968 dev->a_ops.adapter_start = aac_src_start_adapter; in aac_src_init()
981 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1) in aac_src_init()
984 dev->msi = !pci_enable_msi(dev->pdev); in aac_src_init()
986 dev->aac_msix[0].vector_no = 0; in aac_src_init()
987 dev->aac_msix[0].dev = dev; in aac_src_init()
989 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_src_init()
990 IRQF_SHARED, "aacraid", &(dev->aac_msix[0])) < 0) { in aac_src_init()
992 if (dev->msi) in aac_src_init()
993 pci_disable_msi(dev->pdev); in aac_src_init()
999 dev->dbg_base = pci_resource_start(dev->pdev, 2); in aac_src_init()
1000 dev->dbg_base_mapped = dev->regs.src.bar1; in aac_src_init()
1001 dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE; in aac_src_init()
1002 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_src_init()
1006 if (!dev->sync_mode) { in aac_src_init()
1017 return -1; in aac_src_init()
1041 if (dev->msi_enabled) in aac_src_wait_sync()
1061 status[0] = readl(&dev->IndexRegs->Mailbox[0]); in aac_src_wait_sync()
1062 status[1] = readl(&dev->IndexRegs->Mailbox[1]); in aac_src_wait_sync()
1063 status[2] = readl(&dev->IndexRegs->Mailbox[2]); in aac_src_wait_sync()
1064 status[3] = readl(&dev->IndexRegs->Mailbox[3]); in aac_src_wait_sync()
1065 status[4] = readl(&dev->IndexRegs->Mailbox[4]); in aac_src_wait_sync()
1072 * aac_src_soft_reset - perform soft reset to speed up
1105 * We go into soft reset mode to allow us to handle response in aac_src_soft_reset()
1107 dev->in_soft_reset = 1; in aac_src_soft_reset()
1108 dev->msi_enabled = status_omr & AAC_INT_MODE_MSIX; in aac_src_soft_reset()
1131 dev->sa_firmware = 1; in aac_src_soft_reset()
1147 dev_err(&dev->pdev->dev, "%s: %d outstanding I/O pending\n", in aac_src_soft_reset()
1154 dev->in_soft_reset = 0; in aac_src_soft_reset()
1155 dev->msi_enabled = 0; in aac_src_soft_reset()
1157 dev_err(&dev->pdev->dev, "%s: %s status = %d", __func__, in aac_src_soft_reset()
1163 * aac_srcv_init - initialize an SRCv card
1173 int instance = dev->id; in aac_srcv_init()
1174 const char *name = dev->name; in aac_srcv_init()
1176 dev->a_ops.adapter_ioremap = aac_srcv_ioremap; in aac_srcv_init()
1177 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_srcv_init()
1179 dev->base_size = AAC_MIN_SRCV_BAR0_SIZE; in aac_srcv_init()
1180 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_srcv_init()
1186 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
1187 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
1189 if (dev->init_reset) { in aac_srcv_init()
1190 dev->init_reset = false; in aac_srcv_init()
1208 dev->name, instance); in aac_srcv_init()
1234 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); in aac_srcv_init()
1241 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); in aac_srcv_init()
1258 dev->name, instance, status); in aac_srcv_init()
1265 ? (startup_timeout - 60) in aac_srcv_init()
1280 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_srcv_init()
1281 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_srcv_init()
1282 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
1283 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_srcv_init()
1284 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
1285 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_srcv_init()
1286 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_srcv_init()
1287 dev->a_ops.adapter_start = aac_src_start_adapter; in aac_srcv_init()
1300 if ((dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) && in aac_srcv_init()
1301 (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3)) in aac_srcv_init()
1303 if (dev->msi_enabled) in aac_srcv_init()
1309 dev->dbg_base = pci_resource_start(dev->pdev, 2); in aac_srcv_init()
1310 dev->dbg_base_mapped = dev->regs.src.bar1; in aac_srcv_init()
1311 dev->dbg_size = AAC_MIN_SRCV_BAR1_SIZE; in aac_srcv_init()
1312 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_srcv_init()
1316 if (!dev->sync_mode) { in aac_srcv_init()
1327 return -1; in aac_srcv_init()
1330 void aac_src_access_devreg(struct aac_dev *dev, int mode) in aac_src_access_devreg() argument
1334 switch (mode) { in aac_src_access_devreg()
1338 dev->OIMR = (dev->msi_enabled ? in aac_src_access_devreg()
1346 dev->OIMR = AAC_INT_DISABLE_ALL); in aac_src_access_devreg()
1415 if (!dev->msi_enabled) { in aac_src_get_sync_status()
1419 * if yes set the controller in MSIx mode and consider cmd in aac_src_get_sync_status()
1424 dev->msi_enabled = 1; in aac_src_get_sync_status()