/** * ibmvscsi_handle_event: - Interrupt handler for crq events * @irq: number of irq to handle, not used * @dev_instance: ibmvscsi_host_data of host that received interrupt * * Disables interrupts and schedules srp_task * Always returns IRQ_HANDLED */ static irqreturn_t ibmvscsi_handle_event(int irq, void *dev_instance) { struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)dev_instance; vio_disable_interrupts(to_vio_dev(hostdata->dev)); tasklet_schedule(&hostdata->srp_task); return IRQ_HANDLED; }
/** * ibmvscsi_task: - Process srps asynchronously * @data: ibmvscsi_host_data of host */ static void ibmvscsi_task(void *data) { struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data; struct vio_dev *vdev = to_vio_dev(hostdata->dev); struct viosrp_crq *crq; int done = 0; while (!done) { /* Pull all the valid messages off the CRQ */ while ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) { ibmvscsi_handle_crq(crq, hostdata); crq->valid = 0x00; } vio_enable_interrupts(vdev); if ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) { vio_disable_interrupts(vdev); ibmvscsi_handle_crq(crq, hostdata); crq->valid = 0x00; } else { done = 1; } } }
static int rpavscsi_resume(struct ibmvscsi_host_data *hostdata) { vio_disable_interrupts(to_vio_dev(hostdata->dev)); tasklet_schedule(&hostdata->srp_task); return 0; }