Lines Matching refs:scrq
3308 struct ibmvnic_sub_crq_queue *scrq) in reset_one_sub_crq_queue() argument
3312 if (!scrq) { in reset_one_sub_crq_queue()
3317 if (scrq->irq) { in reset_one_sub_crq_queue()
3318 free_irq(scrq->irq, scrq); in reset_one_sub_crq_queue()
3319 irq_dispose_mapping(scrq->irq); in reset_one_sub_crq_queue()
3320 scrq->irq = 0; in reset_one_sub_crq_queue()
3323 if (scrq->msgs) { in reset_one_sub_crq_queue()
3324 memset(scrq->msgs, 0, 4 * PAGE_SIZE); in reset_one_sub_crq_queue()
3325 atomic_set(&scrq->used, 0); in reset_one_sub_crq_queue()
3326 scrq->cur = 0; in reset_one_sub_crq_queue()
3327 scrq->ind_buf.index = 0; in reset_one_sub_crq_queue()
3333 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in reset_one_sub_crq_queue()
3334 4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq); in reset_one_sub_crq_queue()
3363 struct ibmvnic_sub_crq_queue *scrq, in release_sub_crq_queue() argument
3376 scrq->crq_num); in release_sub_crq_queue()
3382 scrq->crq_num, rc); in release_sub_crq_queue()
3388 scrq->ind_buf.indir_arr, in release_sub_crq_queue()
3389 scrq->ind_buf.indir_dma); in release_sub_crq_queue()
3391 dma_unmap_single(dev, scrq->msg_token, 4 * PAGE_SIZE, in release_sub_crq_queue()
3393 free_pages((unsigned long)scrq->msgs, 2); in release_sub_crq_queue()
3394 kfree(scrq); in release_sub_crq_queue()
3401 struct ibmvnic_sub_crq_queue *scrq; in init_sub_crq_queue() local
3404 scrq = kzalloc(sizeof(*scrq), GFP_KERNEL); in init_sub_crq_queue()
3405 if (!scrq) in init_sub_crq_queue()
3408 scrq->msgs = in init_sub_crq_queue()
3410 if (!scrq->msgs) { in init_sub_crq_queue()
3415 scrq->msg_token = dma_map_single(dev, scrq->msgs, 4 * PAGE_SIZE, in init_sub_crq_queue()
3417 if (dma_mapping_error(dev, scrq->msg_token)) { in init_sub_crq_queue()
3422 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in init_sub_crq_queue()
3423 4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq); in init_sub_crq_queue()
3435 scrq->adapter = adapter; in init_sub_crq_queue()
3436 scrq->size = 4 * PAGE_SIZE / sizeof(*scrq->msgs); in init_sub_crq_queue()
3437 scrq->ind_buf.index = 0; in init_sub_crq_queue()
3439 scrq->ind_buf.indir_arr = in init_sub_crq_queue()
3442 &scrq->ind_buf.indir_dma, in init_sub_crq_queue()
3445 if (!scrq->ind_buf.indir_arr) in init_sub_crq_queue()
3448 spin_lock_init(&scrq->lock); in init_sub_crq_queue()
3452 scrq->crq_num, scrq->hw_irq, scrq->irq); in init_sub_crq_queue()
3454 return scrq; in init_sub_crq_queue()
3460 scrq->crq_num); in init_sub_crq_queue()
3463 dma_unmap_single(dev, scrq->msg_token, 4 * PAGE_SIZE, in init_sub_crq_queue()
3466 free_pages((unsigned long)scrq->msgs, 2); in init_sub_crq_queue()
3468 kfree(scrq); in init_sub_crq_queue()
3526 struct ibmvnic_sub_crq_queue *scrq) in disable_scrq_irq() argument
3532 H_DISABLE_VIO_INTERRUPT, scrq->hw_irq, 0, 0); in disable_scrq_irq()
3535 scrq->hw_irq, rc); in disable_scrq_irq()
3540 struct ibmvnic_sub_crq_queue *scrq) in enable_scrq_irq() argument
3545 if (scrq->hw_irq > 0x100000000ULL) { in enable_scrq_irq()
3546 dev_err(dev, "bad hw_irq = %lx\n", scrq->hw_irq); in enable_scrq_irq()
3552 u64 val = (0xff000000) | scrq->hw_irq; in enable_scrq_irq()
3564 H_ENABLE_VIO_INTERRUPT, scrq->hw_irq, 0, 0); in enable_scrq_irq()
3567 scrq->hw_irq, rc); in enable_scrq_irq()
3572 struct ibmvnic_sub_crq_queue *scrq) in ibmvnic_complete_tx() argument
3583 while (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
3584 unsigned int pool = scrq->pool_index; in ibmvnic_complete_tx()
3589 next = ibmvnic_next_scrq(adapter, scrq); in ibmvnic_complete_tx()
3624 txq = netdev_get_tx_queue(adapter->netdev, scrq->pool_index); in ibmvnic_complete_tx()
3627 if (atomic_sub_return(num_entries, &scrq->used) <= in ibmvnic_complete_tx()
3630 scrq->pool_index)) { in ibmvnic_complete_tx()
3631 netif_wake_subqueue(adapter->netdev, scrq->pool_index); in ibmvnic_complete_tx()
3633 scrq->pool_index); in ibmvnic_complete_tx()
3637 enable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
3639 if (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
3640 disable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
3649 struct ibmvnic_sub_crq_queue *scrq = instance; in ibmvnic_interrupt_tx() local
3650 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_tx()
3652 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_tx()
3653 ibmvnic_complete_tx(adapter, scrq); in ibmvnic_interrupt_tx()
3660 struct ibmvnic_sub_crq_queue *scrq = instance; in ibmvnic_interrupt_rx() local
3661 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_rx()
3669 adapter->rx_stats_buffers[scrq->scrq_num].interrupts++; in ibmvnic_interrupt_rx()
3671 if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) { in ibmvnic_interrupt_rx()
3672 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_rx()
3673 __napi_schedule(&adapter->napi[scrq->scrq_num]); in ibmvnic_interrupt_rx()
3682 struct ibmvnic_sub_crq_queue *scrq; in init_sub_crq_irqs() local
3689 scrq = adapter->tx_scrq[i]; in init_sub_crq_irqs()
3690 scrq->irq = irq_create_mapping(NULL, scrq->hw_irq); in init_sub_crq_irqs()
3692 if (!scrq->irq) { in init_sub_crq_irqs()
3698 snprintf(scrq->name, sizeof(scrq->name), "ibmvnic-%x-tx%d", in init_sub_crq_irqs()
3700 rc = request_irq(scrq->irq, ibmvnic_interrupt_tx, in init_sub_crq_irqs()
3701 0, scrq->name, scrq); in init_sub_crq_irqs()
3705 scrq->irq, rc); in init_sub_crq_irqs()
3706 irq_dispose_mapping(scrq->irq); in init_sub_crq_irqs()
3714 scrq = adapter->rx_scrq[i]; in init_sub_crq_irqs()
3715 scrq->irq = irq_create_mapping(NULL, scrq->hw_irq); in init_sub_crq_irqs()
3716 if (!scrq->irq) { in init_sub_crq_irqs()
3721 snprintf(scrq->name, sizeof(scrq->name), "ibmvnic-%x-rx%d", in init_sub_crq_irqs()
3723 rc = request_irq(scrq->irq, ibmvnic_interrupt_rx, in init_sub_crq_irqs()
3724 0, scrq->name, scrq); in init_sub_crq_irqs()
3727 scrq->irq, rc); in init_sub_crq_irqs()
3728 irq_dispose_mapping(scrq->irq); in init_sub_crq_irqs()
3962 struct ibmvnic_sub_crq_queue *scrq) in pending_scrq() argument
3964 union sub_crq *entry = &scrq->msgs[scrq->cur]; in pending_scrq()
3978 struct ibmvnic_sub_crq_queue *scrq) in ibmvnic_next_scrq() argument
3983 spin_lock_irqsave(&scrq->lock, flags); in ibmvnic_next_scrq()
3984 entry = &scrq->msgs[scrq->cur]; in ibmvnic_next_scrq()
3986 if (++scrq->cur == scrq->size) in ibmvnic_next_scrq()
3987 scrq->cur = 0; in ibmvnic_next_scrq()
3991 spin_unlock_irqrestore(&scrq->lock, flags); in ibmvnic_next_scrq()