Lines Matching refs:dev

40 static inline int aac_is_msix_mode(struct aac_dev *dev)  in aac_is_msix_mode()  argument
44 if (aac_is_src(dev)) in aac_is_msix_mode()
45 status = src_readl(dev, MUnit.OMR); in aac_is_msix_mode()
49 static inline void aac_change_to_intx(struct aac_dev *dev) in aac_change_to_intx() argument
51 aac_src_access_devreg(dev, AAC_DISABLE_MSIX); in aac_change_to_intx()
52 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_change_to_intx()
55 static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned lo… in aac_alloc_comm() argument
59 const unsigned long fibsize = dev->max_fib_size; in aac_alloc_comm()
66 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) || in aac_alloc_comm()
67 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) || in aac_alloc_comm()
68 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && in aac_alloc_comm()
69 !dev->sa_firmware)) { in aac_alloc_comm()
71 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) in aac_alloc_comm()
74 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && in aac_alloc_comm()
75 dev->sa_firmware) { in aac_alloc_comm()
76 host_rrq_size = (dev->scsi_host_ptr->can_queue in aac_alloc_comm()
87 base = dma_alloc_coherent(&dev->pdev->dev, size, &phys, GFP_KERNEL); in aac_alloc_comm()
93 dev->comm_addr = (void *)base; in aac_alloc_comm()
94 dev->comm_phys = phys; in aac_alloc_comm()
95 dev->comm_size = size; in aac_alloc_comm()
97 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) || in aac_alloc_comm()
98 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) || in aac_alloc_comm()
99 (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)) { in aac_alloc_comm()
100 dev->host_rrq = (u32 *)(base + fibsize); in aac_alloc_comm()
101 dev->host_rrq_pa = phys + fibsize; in aac_alloc_comm()
102 memset(dev->host_rrq, 0, host_rrq_size); in aac_alloc_comm()
105 dev->init = (union aac_init *)(base + fibsize + host_rrq_size); in aac_alloc_comm()
106 dev->init_pa = phys + fibsize + host_rrq_size; in aac_alloc_comm()
108 init = dev->init; in aac_alloc_comm()
110 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) { in aac_alloc_comm()
121 init->r8.rr_queue_count = cpu_to_le32(dev->max_msix); in aac_alloc_comm()
123 cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
127 for (i = 0; i < dev->max_msix; i++) { in aac_alloc_comm()
128 addr = (u64)dev->host_rrq_pa + dev->vector_cap * i * in aac_alloc_comm()
136 (u16)dev->vector_cap); in aac_alloc_comm()
145 if (dev->max_fib_size != sizeof(struct hw_fib)) in aac_alloc_comm()
149 init->r7.fsrev = cpu_to_le32(dev->fsrev); in aac_alloc_comm()
155 dev->aif_base_va = (struct hw_fib *)base; in aac_alloc_comm()
170 dma_get_required_mask(&dev->pdev->dev) >> 12; in aac_alloc_comm()
182 cpu_to_le32(dev->scsi_host_ptr->can_queue + in aac_alloc_comm()
185 cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
186 init->r7.max_fib_size = cpu_to_le32(dev->max_fib_size); in aac_alloc_comm()
187 init->r7.max_num_aif = cpu_to_le32(dev->max_num_aif); in aac_alloc_comm()
189 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_alloc_comm()
193 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { in aac_alloc_comm()
201 cpu_to_le32(upper_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
203 cpu_to_le32(lower_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
205 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
213 cpu_to_le32(upper_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
215 cpu_to_le32(lower_32_bits(dev->host_rrq_pa)); in aac_alloc_comm()
217 cpu_to_le32(dev->max_msix); in aac_alloc_comm()
240 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) in aac_alloc_comm()
250 dev->printfbuf = (void *)base; in aac_alloc_comm()
251 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE3) { in aac_alloc_comm()
259 static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem, int qsize) in aac_queue_init() argument
262 q->dev = dev; in aac_queue_init()
297 dev_info(&aac->pdev->dev, in aac_wait_for_io_completion()
302 dev_err(&aac->pdev->dev, in aac_wait_for_io_completion()
313 int aac_send_shutdown(struct aac_dev * dev) in aac_send_shutdown() argument
319 if (aac_adapter_check_health(dev)) in aac_send_shutdown()
322 if (!dev->adapter_shutdown) { in aac_send_shutdown()
323 mutex_lock(&dev->ioctl_mutex); in aac_send_shutdown()
324 dev->adapter_shutdown = 1; in aac_send_shutdown()
325 mutex_unlock(&dev->ioctl_mutex); in aac_send_shutdown()
328 aac_wait_for_io_completion(dev); in aac_send_shutdown()
330 fibctx = aac_fib_alloc(dev); in aac_send_shutdown()
351 if (aac_is_src(dev) && in aac_send_shutdown()
352 dev->msi_enabled) in aac_send_shutdown()
353 aac_set_intx_mode(dev); in aac_send_shutdown()
368 static int aac_comm_init(struct aac_dev * dev) in aac_comm_init() argument
375 struct aac_queue_block * comm = dev->queues; in aac_comm_init()
382 spin_lock_init(&dev->fib_lock); in aac_comm_init()
391 if (!aac_alloc_comm(dev, (void * *)&headers, size, QUEUE_ALIGNMENT)) in aac_comm_init()
398 aac_queue_init(dev, &comm->queue[HostNormCmdQueue], headers, HOST_NORM_CMD_ENTRIES); in aac_comm_init()
404 aac_queue_init(dev, &comm->queue[HostHighCmdQueue], headers, HOST_HIGH_CMD_ENTRIES); in aac_comm_init()
411 aac_queue_init(dev, &comm->queue[AdapNormCmdQueue], headers, ADAP_NORM_CMD_ENTRIES); in aac_comm_init()
418 aac_queue_init(dev, &comm->queue[AdapHighCmdQueue], headers, ADAP_HIGH_CMD_ENTRIES); in aac_comm_init()
425 aac_queue_init(dev, &comm->queue[HostNormRespQueue], headers, HOST_NORM_RESP_ENTRIES); in aac_comm_init()
431 aac_queue_init(dev, &comm->queue[HostHighRespQueue], headers, HOST_HIGH_RESP_ENTRIES); in aac_comm_init()
438 aac_queue_init(dev, &comm->queue[AdapNormRespQueue], headers, ADAP_NORM_RESP_ENTRIES); in aac_comm_init()
445 aac_queue_init(dev, &comm->queue[AdapHighRespQueue], headers, ADAP_HIGH_RESP_ENTRIES); in aac_comm_init()
455 void aac_define_int_mode(struct aac_dev *dev) in aac_define_int_mode() argument
461 if (dev->max_msix == 0 || in aac_define_int_mode()
462 dev->pdev->device == PMC_DEVICE_S6 || in aac_define_int_mode()
463 dev->sync_mode) { in aac_define_int_mode()
464 dev->max_msix = 1; in aac_define_int_mode()
465 dev->vector_cap = in aac_define_int_mode()
466 dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
472 msi_count = min(dev->max_msix, in aac_define_int_mode()
475 dev->max_msix = msi_count; in aac_define_int_mode()
481 pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { in aac_define_int_mode()
483 i = pci_alloc_irq_vectors(dev->pdev, in aac_define_int_mode()
487 dev->msi_enabled = 1; in aac_define_int_mode()
490 dev->msi_enabled = 0; in aac_define_int_mode()
491 dev_err(&dev->pdev->dev, in aac_define_int_mode()
496 if (!dev->msi_enabled) in aac_define_int_mode()
497 dev->max_msix = msi_count = 1; in aac_define_int_mode()
499 if (dev->max_msix > msi_count) in aac_define_int_mode()
500 dev->max_msix = msi_count; in aac_define_int_mode()
502 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && dev->sa_firmware) in aac_define_int_mode()
503 dev->vector_cap = dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
506 dev->vector_cap = (dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
510 struct aac_dev *aac_init_adapter(struct aac_dev *dev) in aac_init_adapter() argument
513 struct Scsi_Host * host = dev->scsi_host_ptr; in aac_init_adapter()
519 dev->management_fib_count = 0; in aac_init_adapter()
520 spin_lock_init(&dev->manage_lock); in aac_init_adapter()
521 spin_lock_init(&dev->sync_lock); in aac_init_adapter()
522 spin_lock_init(&dev->iq_lock); in aac_init_adapter()
523 dev->max_fib_size = sizeof(struct hw_fib); in aac_init_adapter()
524 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size in aac_init_adapter()
528 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
529 dev->raw_io_interface = dev->raw_io_64 = 0; in aac_init_adapter()
535 if (aac_is_msix_mode(dev)) { in aac_init_adapter()
536 aac_change_to_intx(dev); in aac_init_adapter()
537 dev_info(&dev->pdev->dev, "Changed firmware to INTX mode"); in aac_init_adapter()
540 if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, in aac_init_adapter()
544 dev->doorbell_mask = status[3]; in aac_init_adapter()
546 dev->raw_io_64 = 1; in aac_init_adapter()
547 dev->sync_mode = aac_sync_mode; in aac_init_adapter()
548 if (dev->a_ops.adapter_comm && in aac_init_adapter()
550 dev->comm_interface = AAC_COMM_MESSAGE; in aac_init_adapter()
551 dev->raw_io_interface = 1; in aac_init_adapter()
554 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; in aac_init_adapter()
557 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
560 dev->comm_interface = AAC_COMM_MESSAGE_TYPE3; in aac_init_adapter()
563 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
564 dev->sync_mode = 1; in aac_init_adapter()
569 dev->sa_firmware = 1; in aac_init_adapter()
571 dev->sa_firmware = 0; in aac_init_adapter()
574 dev->soft_reset_support = 1; in aac_init_adapter()
576 dev->soft_reset_support = 0; in aac_init_adapter()
578 if ((dev->comm_interface == AAC_COMM_MESSAGE) && in aac_init_adapter()
579 (status[2] > dev->base_size)) { in aac_init_adapter()
580 aac_adapter_ioremap(dev, 0); in aac_init_adapter()
581 dev->base_size = status[2]; in aac_init_adapter()
582 if (aac_adapter_ioremap(dev, status[2])) { in aac_init_adapter()
584 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
585 if (aac_adapter_ioremap(dev, AAC_MIN_FOOTPRINT_SIZE)) { in aac_init_adapter()
593 dev->max_msix = 0; in aac_init_adapter()
594 dev->msi_enabled = 0; in aac_init_adapter()
595 dev->adapter_shutdown = 0; in aac_init_adapter()
596 if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS, in aac_init_adapter()
609 dev->max_fib_size = status[1] & 0xFFE0; in aac_init_adapter()
611 dev->sg_tablesize = status[2] & 0xFFFF; in aac_init_adapter()
612 if (aac_is_src(dev)) { in aac_init_adapter()
622 dev->max_num_aif = status[4] & 0xFFFF; in aac_init_adapter()
631 if (aac_is_src(dev)) in aac_init_adapter()
632 aac_define_int_mode(dev); in aac_init_adapter()
637 dev->queues = kzalloc(sizeof(struct aac_queue_block), GFP_KERNEL); in aac_init_adapter()
638 if (dev->queues == NULL) { in aac_init_adapter()
643 if (aac_comm_init(dev)<0){ in aac_init_adapter()
644 kfree(dev->queues); in aac_init_adapter()
645 dev->queues = NULL; in aac_init_adapter()
651 if (aac_fib_setup(dev) < 0) { in aac_init_adapter()
652 kfree(dev->queues); in aac_init_adapter()
653 dev->queues = NULL; in aac_init_adapter()
657 INIT_LIST_HEAD(&dev->fib_list); in aac_init_adapter()
658 INIT_LIST_HEAD(&dev->sync_fib_list); in aac_init_adapter()
660 return dev; in aac_init_adapter()