Lines Matching refs:dev

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