Lines Matching refs:dev
47 static void aac_define_int_mode(struct aac_dev *dev);
53 static inline int aac_is_msix_mode(struct aac_dev *dev) in aac_is_msix_mode() argument
57 status = src_readl(dev, MUnit.OMR); in aac_is_msix_mode()
61 static inline void aac_change_to_intx(struct aac_dev *dev) in aac_change_to_intx() argument
63 aac_src_access_devreg(dev, AAC_DISABLE_MSIX); in aac_change_to_intx()
64 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_change_to_intx()
67 static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned lo… in aac_alloc_comm() argument
71 const unsigned long fibsize = dev->max_fib_size; in aac_alloc_comm()
78 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_alloc_comm()
79 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) in aac_alloc_comm()
80 host_rrq_size = (dev->scsi_host_ptr->can_queue in aac_alloc_comm()
85 base = pci_alloc_consistent(dev->pdev, size, &phys); in aac_alloc_comm()
92 dev->comm_addr = (void *)base; in aac_alloc_comm()
93 dev->comm_phys = phys; in aac_alloc_comm()
94 dev->comm_size = size; in aac_alloc_comm()
96 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_alloc_comm()
97 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
98 dev->host_rrq = (u32 *)(base + fibsize); in aac_alloc_comm()
99 dev->host_rrq_pa = phys + fibsize; in aac_alloc_comm()
100 memset(dev->host_rrq, 0, host_rrq_size); in aac_alloc_comm()
103 dev->init = (struct aac_init *)(base + fibsize + host_rrq_size); in aac_alloc_comm()
104 dev->init_pa = phys + fibsize + host_rrq_size; in aac_alloc_comm()
106 init = dev->init; in aac_alloc_comm()
109 if (dev->max_fib_size != sizeof(struct hw_fib)) in aac_alloc_comm()
112 init->fsrev = cpu_to_le32(dev->fsrev); in aac_alloc_comm()
118 dev->aif_base_va = (struct hw_fib *)base; in aac_alloc_comm()
131 aac_max_hostphysmempages = dma_get_required_mask(&dev->pdev->dev) >> 12; in aac_alloc_comm()
139 init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_alloc_comm()
140 init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
141 init->MaxFibSize = cpu_to_le32(dev->max_fib_size); in aac_alloc_comm()
142 init->MaxNumAif = cpu_to_le32(dev->max_num_aif); in aac_alloc_comm()
144 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_alloc_comm()
147 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { in aac_alloc_comm()
151 init->HostRRQ_AddrHigh = cpu_to_le32((u32)((u64)dev->host_rrq_pa >> 32)); in aac_alloc_comm()
152 init->HostRRQ_AddrLow = cpu_to_le32((u32)(dev->host_rrq_pa & 0xffffffff)); in aac_alloc_comm()
154 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
158 init->HostRRQ_AddrHigh = cpu_to_le32((u32)((u64)dev->host_rrq_pa >> 32)); in aac_alloc_comm()
159 init->HostRRQ_AddrLow = cpu_to_le32((u32)(dev->host_rrq_pa & 0xffffffff)); in aac_alloc_comm()
161 init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix); in aac_alloc_comm()
191 dev->printfbuf = (void *)base; in aac_alloc_comm()
198 static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem, int qsize) in aac_queue_init() argument
201 q->dev = dev; in aac_queue_init()
221 int aac_send_shutdown(struct aac_dev * dev) in aac_send_shutdown() argument
227 fibctx = aac_fib_alloc(dev); in aac_send_shutdown()
249 dev->adapter_shutdown = 1; in aac_send_shutdown()
250 if ((dev->pdev->device == PMC_DEVICE_S7 || in aac_send_shutdown()
251 dev->pdev->device == PMC_DEVICE_S8 || in aac_send_shutdown()
252 dev->pdev->device == PMC_DEVICE_S9) && in aac_send_shutdown()
253 dev->msi_enabled) in aac_send_shutdown()
254 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_send_shutdown()
269 static int aac_comm_init(struct aac_dev * dev) in aac_comm_init() argument
276 struct aac_queue_block * comm = dev->queues; in aac_comm_init()
283 spin_lock_init(&dev->fib_lock); in aac_comm_init()
292 if (!aac_alloc_comm(dev, (void * *)&headers, size, QUEUE_ALIGNMENT)) in aac_comm_init()
299 aac_queue_init(dev, &comm->queue[HostNormCmdQueue], headers, HOST_NORM_CMD_ENTRIES); in aac_comm_init()
305 aac_queue_init(dev, &comm->queue[HostHighCmdQueue], headers, HOST_HIGH_CMD_ENTRIES); in aac_comm_init()
312 aac_queue_init(dev, &comm->queue[AdapNormCmdQueue], headers, ADAP_NORM_CMD_ENTRIES); in aac_comm_init()
319 aac_queue_init(dev, &comm->queue[AdapHighCmdQueue], headers, ADAP_HIGH_CMD_ENTRIES); in aac_comm_init()
326 aac_queue_init(dev, &comm->queue[HostNormRespQueue], headers, HOST_NORM_RESP_ENTRIES); in aac_comm_init()
332 aac_queue_init(dev, &comm->queue[HostHighRespQueue], headers, HOST_HIGH_RESP_ENTRIES); in aac_comm_init()
339 aac_queue_init(dev, &comm->queue[AdapNormRespQueue], headers, ADAP_NORM_RESP_ENTRIES); in aac_comm_init()
346 aac_queue_init(dev, &comm->queue[AdapHighRespQueue], headers, ADAP_HIGH_RESP_ENTRIES); in aac_comm_init()
356 struct aac_dev *aac_init_adapter(struct aac_dev *dev) in aac_init_adapter() argument
359 struct Scsi_Host * host = dev->scsi_host_ptr; in aac_init_adapter()
365 dev->management_fib_count = 0; in aac_init_adapter()
366 spin_lock_init(&dev->manage_lock); in aac_init_adapter()
367 spin_lock_init(&dev->sync_lock); in aac_init_adapter()
368 dev->max_fib_size = sizeof(struct hw_fib); in aac_init_adapter()
369 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size in aac_init_adapter()
373 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
374 dev->raw_io_interface = dev->raw_io_64 = 0; in aac_init_adapter()
380 if (aac_is_msix_mode(dev)) { in aac_init_adapter()
381 aac_change_to_intx(dev); in aac_init_adapter()
382 dev_info(&dev->pdev->dev, "Changed firmware to INTX mode"); in aac_init_adapter()
385 if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, in aac_init_adapter()
389 dev->doorbell_mask = status[3]; in aac_init_adapter()
391 dev->raw_io_64 = 1; in aac_init_adapter()
392 dev->sync_mode = aac_sync_mode; in aac_init_adapter()
393 if (dev->a_ops.adapter_comm && in aac_init_adapter()
395 dev->comm_interface = AAC_COMM_MESSAGE; in aac_init_adapter()
396 dev->raw_io_interface = 1; in aac_init_adapter()
399 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; in aac_init_adapter()
402 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
407 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
408 dev->sync_mode = 1; in aac_init_adapter()
411 if ((dev->comm_interface == AAC_COMM_MESSAGE) && in aac_init_adapter()
412 (status[2] > dev->base_size)) { in aac_init_adapter()
413 aac_adapter_ioremap(dev, 0); in aac_init_adapter()
414 dev->base_size = status[2]; in aac_init_adapter()
415 if (aac_adapter_ioremap(dev, status[2])) { in aac_init_adapter()
417 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
418 if (aac_adapter_ioremap(dev, AAC_MIN_FOOTPRINT_SIZE)) { in aac_init_adapter()
426 dev->max_msix = 0; in aac_init_adapter()
427 dev->msi_enabled = 0; in aac_init_adapter()
428 dev->adapter_shutdown = 0; in aac_init_adapter()
429 if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS, in aac_init_adapter()
442 dev->max_fib_size = status[1] & 0xFFE0; in aac_init_adapter()
444 dev->sg_tablesize = status[2] & 0xFFFF; in aac_init_adapter()
445 if (dev->pdev->device == PMC_DEVICE_S7 || in aac_init_adapter()
446 dev->pdev->device == PMC_DEVICE_S8 || in aac_init_adapter()
447 dev->pdev->device == PMC_DEVICE_S9) in aac_init_adapter()
452 dev->max_num_aif = status[4] & 0xFFFF; in aac_init_adapter()
461 dev->max_fib_size = 512; in aac_init_adapter()
462 dev->sg_tablesize = host->sg_tablesize in aac_init_adapter()
469 dev->max_fib_size = 2048; in aac_init_adapter()
471 dev->sg_tablesize = 81; in aac_init_adapter()
475 dev->max_fib_size = 4096; in aac_init_adapter()
477 dev->sg_tablesize = 166; in aac_init_adapter()
481 dev->max_fib_size = 8192; in aac_init_adapter()
483 dev->sg_tablesize = 337; in aac_init_adapter()
502 if (dev->pdev->device == PMC_DEVICE_S6 || in aac_init_adapter()
503 dev->pdev->device == PMC_DEVICE_S7 || in aac_init_adapter()
504 dev->pdev->device == PMC_DEVICE_S8 || in aac_init_adapter()
505 dev->pdev->device == PMC_DEVICE_S9) in aac_init_adapter()
506 aac_define_int_mode(dev); in aac_init_adapter()
511 dev->queues = kzalloc(sizeof(struct aac_queue_block), GFP_KERNEL); in aac_init_adapter()
512 if (dev->queues == NULL) { in aac_init_adapter()
517 if (aac_comm_init(dev)<0){ in aac_init_adapter()
518 kfree(dev->queues); in aac_init_adapter()
524 if (aac_fib_setup(dev) < 0) { in aac_init_adapter()
525 kfree(dev->queues); in aac_init_adapter()
529 INIT_LIST_HEAD(&dev->fib_list); in aac_init_adapter()
530 INIT_LIST_HEAD(&dev->sync_fib_list); in aac_init_adapter()
532 return dev; in aac_init_adapter()
535 static void aac_define_int_mode(struct aac_dev *dev) in aac_define_int_mode() argument
542 if (dev->max_msix == 0 || in aac_define_int_mode()
543 dev->pdev->device == PMC_DEVICE_S6 || in aac_define_int_mode()
544 dev->sync_mode) { in aac_define_int_mode()
545 dev->max_msix = 1; in aac_define_int_mode()
546 dev->vector_cap = in aac_define_int_mode()
547 dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
552 msi_count = min(dev->max_msix, in aac_define_int_mode()
555 dev->max_msix = msi_count; in aac_define_int_mode()
561 dev->msixentry[i].entry = i; in aac_define_int_mode()
564 pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { in aac_define_int_mode()
565 i = pci_enable_msix(dev->pdev, in aac_define_int_mode()
566 dev->msixentry, in aac_define_int_mode()
570 dev->msi_enabled = 1; in aac_define_int_mode()
573 if (pci_enable_msix(dev->pdev, in aac_define_int_mode()
574 dev->msixentry, in aac_define_int_mode()
576 dev->msi_enabled = 0; in aac_define_int_mode()
578 dev->name, dev->id, i); in aac_define_int_mode()
582 dev->msi_enabled = 0; in aac_define_int_mode()
584 dev->name, dev->id, i); in aac_define_int_mode()
588 if (!dev->msi_enabled) { in aac_define_int_mode()
590 i = pci_enable_msi(dev->pdev); in aac_define_int_mode()
593 dev->msi_enabled = 1; in aac_define_int_mode()
594 dev->msi = 1; in aac_define_int_mode()
597 dev->name, dev->id, i); in aac_define_int_mode()
601 if (!dev->msi_enabled) in aac_define_int_mode()
602 dev->max_msix = msi_count = 1; in aac_define_int_mode()
604 if (dev->max_msix > msi_count) in aac_define_int_mode()
605 dev->max_msix = msi_count; in aac_define_int_mode()
607 dev->vector_cap = in aac_define_int_mode()
608 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) / in aac_define_int_mode()