Lines Matching refs:dev

51 static inline int aac_is_msix_mode(struct aac_dev *dev)  in aac_is_msix_mode()  argument
55 status = src_readl(dev, MUnit.OMR); in aac_is_msix_mode()
59 static inline void aac_change_to_intx(struct aac_dev *dev) in aac_change_to_intx() argument
61 aac_src_access_devreg(dev, AAC_DISABLE_MSIX); in aac_change_to_intx()
62 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_change_to_intx()
65 static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned lo… in aac_alloc_comm() argument
69 const unsigned long fibsize = dev->max_fib_size; in aac_alloc_comm()
76 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_alloc_comm()
77 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) in aac_alloc_comm()
78 host_rrq_size = (dev->scsi_host_ptr->can_queue in aac_alloc_comm()
83 base = pci_alloc_consistent(dev->pdev, size, &phys); in aac_alloc_comm()
90 dev->comm_addr = (void *)base; in aac_alloc_comm()
91 dev->comm_phys = phys; in aac_alloc_comm()
92 dev->comm_size = size; in aac_alloc_comm()
94 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1 || in aac_alloc_comm()
95 dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
96 dev->host_rrq = (u32 *)(base + fibsize); in aac_alloc_comm()
97 dev->host_rrq_pa = phys + fibsize; in aac_alloc_comm()
98 memset(dev->host_rrq, 0, host_rrq_size); in aac_alloc_comm()
101 dev->init = (struct aac_init *)(base + fibsize + host_rrq_size); in aac_alloc_comm()
102 dev->init_pa = phys + fibsize + host_rrq_size; in aac_alloc_comm()
104 init = dev->init; in aac_alloc_comm()
107 if (dev->max_fib_size != sizeof(struct hw_fib)) in aac_alloc_comm()
110 init->fsrev = cpu_to_le32(dev->fsrev); in aac_alloc_comm()
116 dev->aif_base_va = (struct hw_fib *)base; in aac_alloc_comm()
129 aac_max_hostphysmempages = dma_get_required_mask(&dev->pdev->dev) >> 12; in aac_alloc_comm()
137 init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); in aac_alloc_comm()
138 init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); in aac_alloc_comm()
139 init->MaxFibSize = cpu_to_le32(dev->max_fib_size); in aac_alloc_comm()
140 init->MaxNumAif = cpu_to_le32(dev->max_num_aif); in aac_alloc_comm()
142 if (dev->comm_interface == AAC_COMM_MESSAGE) { in aac_alloc_comm()
145 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { in aac_alloc_comm()
149 init->HostRRQ_AddrHigh = cpu_to_le32((u32)((u64)dev->host_rrq_pa >> 32)); in aac_alloc_comm()
150 init->HostRRQ_AddrLow = cpu_to_le32((u32)(dev->host_rrq_pa & 0xffffffff)); in aac_alloc_comm()
152 } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_alloc_comm()
156 init->HostRRQ_AddrHigh = cpu_to_le32((u32)((u64)dev->host_rrq_pa >> 32)); in aac_alloc_comm()
157 init->HostRRQ_AddrLow = cpu_to_le32((u32)(dev->host_rrq_pa & 0xffffffff)); in aac_alloc_comm()
159 init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix); in aac_alloc_comm()
189 dev->printfbuf = (void *)base; in aac_alloc_comm()
196 static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem, int qsize) in aac_queue_init() argument
199 q->dev = dev; in aac_queue_init()
219 int aac_send_shutdown(struct aac_dev * dev) in aac_send_shutdown() argument
225 fibctx = aac_fib_alloc(dev); in aac_send_shutdown()
247 dev->adapter_shutdown = 1; in aac_send_shutdown()
248 if ((dev->pdev->device == PMC_DEVICE_S7 || in aac_send_shutdown()
249 dev->pdev->device == PMC_DEVICE_S8 || in aac_send_shutdown()
250 dev->pdev->device == PMC_DEVICE_S9) && in aac_send_shutdown()
251 dev->msi_enabled) in aac_send_shutdown()
252 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_send_shutdown()
267 static int aac_comm_init(struct aac_dev * dev) in aac_comm_init() argument
274 struct aac_queue_block * comm = dev->queues; in aac_comm_init()
281 spin_lock_init(&dev->fib_lock); in aac_comm_init()
290 if (!aac_alloc_comm(dev, (void * *)&headers, size, QUEUE_ALIGNMENT)) in aac_comm_init()
297 aac_queue_init(dev, &comm->queue[HostNormCmdQueue], headers, HOST_NORM_CMD_ENTRIES); in aac_comm_init()
303 aac_queue_init(dev, &comm->queue[HostHighCmdQueue], headers, HOST_HIGH_CMD_ENTRIES); in aac_comm_init()
310 aac_queue_init(dev, &comm->queue[AdapNormCmdQueue], headers, ADAP_NORM_CMD_ENTRIES); in aac_comm_init()
317 aac_queue_init(dev, &comm->queue[AdapHighCmdQueue], headers, ADAP_HIGH_CMD_ENTRIES); in aac_comm_init()
324 aac_queue_init(dev, &comm->queue[HostNormRespQueue], headers, HOST_NORM_RESP_ENTRIES); in aac_comm_init()
330 aac_queue_init(dev, &comm->queue[HostHighRespQueue], headers, HOST_HIGH_RESP_ENTRIES); in aac_comm_init()
337 aac_queue_init(dev, &comm->queue[AdapNormRespQueue], headers, ADAP_NORM_RESP_ENTRIES); in aac_comm_init()
344 aac_queue_init(dev, &comm->queue[AdapHighRespQueue], headers, ADAP_HIGH_RESP_ENTRIES); in aac_comm_init()
354 void aac_define_int_mode(struct aac_dev *dev) in aac_define_int_mode() argument
360 if (dev->max_msix == 0 || in aac_define_int_mode()
361 dev->pdev->device == PMC_DEVICE_S6 || in aac_define_int_mode()
362 dev->sync_mode) { in aac_define_int_mode()
363 dev->max_msix = 1; in aac_define_int_mode()
364 dev->vector_cap = in aac_define_int_mode()
365 dev->scsi_host_ptr->can_queue + in aac_define_int_mode()
371 msi_count = min(dev->max_msix, in aac_define_int_mode()
374 dev->max_msix = msi_count; in aac_define_int_mode()
380 dev->msixentry[i].entry = i; in aac_define_int_mode()
383 pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { in aac_define_int_mode()
385 i = pci_enable_msix_range(dev->pdev, in aac_define_int_mode()
386 dev->msixentry, in aac_define_int_mode()
390 dev->msi_enabled = 1; in aac_define_int_mode()
393 dev->msi_enabled = 0; in aac_define_int_mode()
395 dev->name, dev->id, i); in aac_define_int_mode()
399 if (!dev->msi_enabled) { in aac_define_int_mode()
401 i = pci_enable_msi(dev->pdev); in aac_define_int_mode()
404 dev->msi_enabled = 1; in aac_define_int_mode()
405 dev->msi = 1; in aac_define_int_mode()
408 dev->name, dev->id, i); in aac_define_int_mode()
412 if (!dev->msi_enabled) in aac_define_int_mode()
413 dev->max_msix = msi_count = 1; in aac_define_int_mode()
415 if (dev->max_msix > msi_count) in aac_define_int_mode()
416 dev->max_msix = msi_count; in aac_define_int_mode()
418 dev->vector_cap = in aac_define_int_mode()
419 (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) / in aac_define_int_mode()
422 struct aac_dev *aac_init_adapter(struct aac_dev *dev) in aac_init_adapter() argument
425 struct Scsi_Host * host = dev->scsi_host_ptr; in aac_init_adapter()
431 dev->management_fib_count = 0; in aac_init_adapter()
432 spin_lock_init(&dev->manage_lock); in aac_init_adapter()
433 spin_lock_init(&dev->sync_lock); in aac_init_adapter()
434 spin_lock_init(&dev->iq_lock); in aac_init_adapter()
435 dev->max_fib_size = sizeof(struct hw_fib); in aac_init_adapter()
436 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size in aac_init_adapter()
440 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
441 dev->raw_io_interface = dev->raw_io_64 = 0; in aac_init_adapter()
447 if (aac_is_msix_mode(dev)) { in aac_init_adapter()
448 aac_change_to_intx(dev); in aac_init_adapter()
449 dev_info(&dev->pdev->dev, "Changed firmware to INTX mode"); in aac_init_adapter()
452 if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, in aac_init_adapter()
456 dev->doorbell_mask = status[3]; in aac_init_adapter()
458 dev->raw_io_64 = 1; in aac_init_adapter()
459 dev->sync_mode = aac_sync_mode; in aac_init_adapter()
460 if (dev->a_ops.adapter_comm && in aac_init_adapter()
462 dev->comm_interface = AAC_COMM_MESSAGE; in aac_init_adapter()
463 dev->raw_io_interface = 1; in aac_init_adapter()
466 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; in aac_init_adapter()
469 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
474 dev->comm_interface = AAC_COMM_MESSAGE_TYPE2; in aac_init_adapter()
475 dev->sync_mode = 1; in aac_init_adapter()
478 if ((dev->comm_interface == AAC_COMM_MESSAGE) && in aac_init_adapter()
479 (status[2] > dev->base_size)) { in aac_init_adapter()
480 aac_adapter_ioremap(dev, 0); in aac_init_adapter()
481 dev->base_size = status[2]; in aac_init_adapter()
482 if (aac_adapter_ioremap(dev, status[2])) { in aac_init_adapter()
484 dev->comm_interface = AAC_COMM_PRODUCER; in aac_init_adapter()
485 if (aac_adapter_ioremap(dev, AAC_MIN_FOOTPRINT_SIZE)) { in aac_init_adapter()
493 dev->max_msix = 0; in aac_init_adapter()
494 dev->msi_enabled = 0; in aac_init_adapter()
495 dev->adapter_shutdown = 0; in aac_init_adapter()
496 if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS, in aac_init_adapter()
509 dev->max_fib_size = status[1] & 0xFFE0; in aac_init_adapter()
511 dev->sg_tablesize = status[2] & 0xFFFF; in aac_init_adapter()
512 if (dev->pdev->device == PMC_DEVICE_S7 || in aac_init_adapter()
513 dev->pdev->device == PMC_DEVICE_S8 || in aac_init_adapter()
514 dev->pdev->device == PMC_DEVICE_S9) in aac_init_adapter()
519 dev->max_num_aif = status[4] & 0xFFFF; in aac_init_adapter()
528 dev->max_fib_size = 512; in aac_init_adapter()
529 dev->sg_tablesize = host->sg_tablesize in aac_init_adapter()
536 dev->max_fib_size = 2048; in aac_init_adapter()
538 dev->sg_tablesize = 81; in aac_init_adapter()
542 dev->max_fib_size = 4096; in aac_init_adapter()
544 dev->sg_tablesize = 166; in aac_init_adapter()
548 dev->max_fib_size = 8192; in aac_init_adapter()
550 dev->sg_tablesize = 337; in aac_init_adapter()
569 if (dev->pdev->device == PMC_DEVICE_S6 || in aac_init_adapter()
570 dev->pdev->device == PMC_DEVICE_S7 || in aac_init_adapter()
571 dev->pdev->device == PMC_DEVICE_S8 || in aac_init_adapter()
572 dev->pdev->device == PMC_DEVICE_S9) in aac_init_adapter()
573 aac_define_int_mode(dev); in aac_init_adapter()
578 dev->queues = kzalloc(sizeof(struct aac_queue_block), GFP_KERNEL); in aac_init_adapter()
579 if (dev->queues == NULL) { in aac_init_adapter()
584 if (aac_comm_init(dev)<0){ in aac_init_adapter()
585 kfree(dev->queues); in aac_init_adapter()
591 if (aac_fib_setup(dev) < 0) { in aac_init_adapter()
592 kfree(dev->queues); in aac_init_adapter()
596 INIT_LIST_HEAD(&dev->fib_list); in aac_init_adapter()
597 INIT_LIST_HEAD(&dev->sync_fib_list); in aac_init_adapter()
599 return dev; in aac_init_adapter()