s390/qdio: track time of last data IRQ for each device
[linux-2.6-microblaze.git] / drivers / s390 / cio / qdio.h
index cd2df4f..da29c37 100644 (file)
@@ -139,9 +139,6 @@ struct qdio_dev_perf_stat {
        unsigned int qdio_int;
        unsigned int pci_request_int;
 
-       unsigned int tasklet_inbound;
-       unsigned int tasklet_inbound_resched;
-       unsigned int tasklet_inbound_resched2;
        unsigned int tasklet_outbound;
 
        unsigned int siga_read;
@@ -193,6 +190,8 @@ struct qdio_output_q {
        struct qdio_outbuf_state *sbal_state;
        /* timer to check for more outbound work */
        struct timer_list timer;
+       /* tasklet to check for completions */
+       struct tasklet_struct tasklet;
 };
 
 /*
@@ -222,7 +221,6 @@ struct qdio_q {
        /* last scan of the queue */
        u64 timestamp;
 
-       struct tasklet_struct tasklet;
        struct qdio_queue_perf_stat q_stats;
 
        struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q] ____cacheline_aligned;
@@ -254,6 +252,7 @@ struct qdio_irq {
        struct ccw_device *cdev;
        struct list_head entry;         /* list of thinint devices */
        struct dentry *debugfs_dev;
+       u64 last_data_irq_time;
 
        unsigned long int_parm;
        struct subchannel_id schid;
@@ -324,6 +323,14 @@ static inline int multicast_outbound(struct qdio_q *q)
               (q->nr == q->irq_ptr->nr_output_qs - 1);
 }
 
+static inline void qdio_deliver_irq(struct qdio_irq *irq)
+{
+       if (!test_and_set_bit(QDIO_IRQ_DISABLED, &irq->poll_state))
+               irq->irq_poll(irq->cdev, irq->int_parm);
+       else
+               QDIO_PERF_STAT_INC(irq, int_discarded);
+}
+
 #define pci_out_supported(irq) ((irq)->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)
 #define is_qebsm(q)                    (q->irq_ptr->sch_token != 0)
 
@@ -357,16 +364,12 @@ extern u64 last_ai_time;
 /* prototypes for thin interrupt */
 int qdio_establish_thinint(struct qdio_irq *irq_ptr);
 void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
-void tiqdio_add_device(struct qdio_irq *irq_ptr);
-void tiqdio_remove_device(struct qdio_irq *irq_ptr);
-void tiqdio_inbound_processing(unsigned long q);
 int qdio_thinint_init(void);
 void qdio_thinint_exit(void);
 int test_nonshared_ind(struct qdio_irq *);
 
 /* prototypes for setup */
-void qdio_inbound_processing(unsigned long data);
-void qdio_outbound_processing(unsigned long data);
+void qdio_outbound_tasklet(struct tasklet_struct *t);
 void qdio_outbound_timer(struct timer_list *t);
 void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
                      struct irb *irb);