diff options
Diffstat (limited to 'drivers/s390/cio/qdio_main.c')
| -rw-r--r-- | drivers/s390/cio/qdio_main.c | 50 | 
1 files changed, 23 insertions, 27 deletions
| diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 3475317c42e5..02ced5949287 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c @@ -950,19 +950,14 @@ static void qdio_int_handler_pci(struct qdio_irq *irq_ptr)  	if (unlikely(irq_ptr->state != QDIO_IRQ_STATE_ACTIVE))  		return; -	for_each_input_queue(irq_ptr, q, i) { -		if (q->u.in.queue_start_poll) { -			/* skip if polling is enabled or already in work */ -			if (test_and_set_bit(QDIO_QUEUE_IRQS_DISABLED, -				     &q->u.in.queue_irq_state)) { -				QDIO_PERF_STAT_INC(irq_ptr, int_discarded); -				continue; -			} -			q->u.in.queue_start_poll(q->irq_ptr->cdev, q->nr, -						 q->irq_ptr->int_parm); -		} else { +	if (irq_ptr->irq_poll) { +		if (!test_and_set_bit(QDIO_IRQ_DISABLED, &irq_ptr->poll_state)) +			irq_ptr->irq_poll(irq_ptr->cdev, irq_ptr->int_parm); +		else +			QDIO_PERF_STAT_INC(irq_ptr, int_discarded); +	} else { +		for_each_input_queue(irq_ptr, q, i)  			tasklet_schedule(&q->tasklet); -		}  	}  	if (!pci_out_supported(irq_ptr) || !irq_ptr->scan_threshold) @@ -1610,24 +1605,26 @@ EXPORT_SYMBOL_GPL(do_QDIO);  /**   * qdio_start_irq - process input buffers   * @cdev: associated ccw_device for the qdio subchannel - * @nr: input queue number   *   * Return codes   *   0 - success   *   1 - irqs not started since new data is available   */ -int qdio_start_irq(struct ccw_device *cdev, int nr) +int qdio_start_irq(struct ccw_device *cdev)  {  	struct qdio_q *q;  	struct qdio_irq *irq_ptr = cdev->private->qdio_data; +	unsigned int i;  	if (!irq_ptr)  		return -ENODEV; -	q = irq_ptr->input_qs[nr];  	clear_nonshared_ind(irq_ptr); -	qdio_stop_polling(q); -	clear_bit(QDIO_QUEUE_IRQS_DISABLED, &q->u.in.queue_irq_state); + +	for_each_input_queue(irq_ptr, q, i) +		qdio_stop_polling(q); + +	clear_bit(QDIO_IRQ_DISABLED, &irq_ptr->poll_state);  	/*  	 * We need to check again to not lose initiative after @@ -1635,13 +1632,16 @@ int qdio_start_irq(struct ccw_device *cdev, int nr)  	 */  	if (test_nonshared_ind(irq_ptr))  		goto rescan; -	if (!qdio_inbound_q_done(q, q->first_to_check)) -		goto rescan; + +	for_each_input_queue(irq_ptr, q, i) { +		if (!qdio_inbound_q_done(q, q->first_to_check)) +			goto rescan; +	} +  	return 0;  rescan: -	if (test_and_set_bit(QDIO_QUEUE_IRQS_DISABLED, -			     &q->u.in.queue_irq_state)) +	if (test_and_set_bit(QDIO_IRQ_DISABLED, &irq_ptr->poll_state))  		return 0;  	else  		return 1; @@ -1729,23 +1729,19 @@ EXPORT_SYMBOL(qdio_get_next_buffers);  /**   * qdio_stop_irq - disable interrupt processing for the device   * @cdev: associated ccw_device for the qdio subchannel - * @nr: input queue number   *   * Return codes   *   0 - interrupts were already disabled   *   1 - interrupts successfully disabled   */ -int qdio_stop_irq(struct ccw_device *cdev, int nr) +int qdio_stop_irq(struct ccw_device *cdev)  { -	struct qdio_q *q;  	struct qdio_irq *irq_ptr = cdev->private->qdio_data;  	if (!irq_ptr)  		return -ENODEV; -	q = irq_ptr->input_qs[nr]; -	if (test_and_set_bit(QDIO_QUEUE_IRQS_DISABLED, -			     &q->u.in.queue_irq_state)) +	if (test_and_set_bit(QDIO_IRQ_DISABLED, &irq_ptr->poll_state))  		return 0;  	else  		return 1; |