@@ -123,6 +123,26 @@ static inline void pt_core_enable_queue_interrupts(struct pt_device *pt)
123
123
iowrite32 (SUPPORTED_INTERRUPTS , pt -> cmd_q .reg_control + 0x000C );
124
124
}
125
125
126
+ static void pt_do_cmd_complete (unsigned long data )
127
+ {
128
+ struct pt_tasklet_data * tdata = (struct pt_tasklet_data * )data ;
129
+ struct pt_cmd * cmd = tdata -> cmd ;
130
+ struct pt_cmd_queue * cmd_q = & cmd -> pt -> cmd_q ;
131
+ u32 tail ;
132
+
133
+ if (cmd_q -> cmd_error ) {
134
+ /*
135
+ * Log the error and flush the queue by
136
+ * moving the head pointer
137
+ */
138
+ tail = lower_32_bits (cmd_q -> qdma_tail + cmd_q -> qidx * Q_DESC_SIZE );
139
+ pt_log_error (cmd_q -> pt , cmd_q -> cmd_error );
140
+ iowrite32 (tail , cmd_q -> reg_control + 0x0008 );
141
+ }
142
+
143
+ cmd -> pt_cmd_callback (cmd -> data , cmd -> ret );
144
+ }
145
+
126
146
static irqreturn_t pt_core_irq_handler (int irq , void * data )
127
147
{
128
148
struct pt_device * pt = data ;
@@ -143,6 +163,7 @@ static irqreturn_t pt_core_irq_handler(int irq, void *data)
143
163
/* Acknowledge the interrupt */
144
164
iowrite32 (status , cmd_q -> reg_control + 0x0010 );
145
165
pt_core_enable_queue_interrupts (pt );
166
+ pt_do_cmd_complete ((ulong )& pt -> tdata );
146
167
}
147
168
return IRQ_HANDLED ;
148
169
}
@@ -224,8 +245,16 @@ int pt_core_init(struct pt_device *pt)
224
245
225
246
pt_core_enable_queue_interrupts (pt );
226
247
248
+ /* Register the DMA engine support */
249
+ ret = pt_dmaengine_register (pt );
250
+ if (ret )
251
+ goto e_dmaengine ;
252
+
227
253
return 0 ;
228
254
255
+ e_dmaengine :
256
+ free_irq (pt -> pt_irq , pt );
257
+
229
258
e_dma_alloc :
230
259
dma_free_coherent (dev , cmd_q -> qsize , cmd_q -> qbase , cmd_q -> qbase_dma );
231
260
@@ -242,6 +271,9 @@ void pt_core_destroy(struct pt_device *pt)
242
271
struct pt_cmd_queue * cmd_q = & pt -> cmd_q ;
243
272
struct pt_cmd * cmd ;
244
273
274
+ /* Unregister the DMA engine */
275
+ pt_dmaengine_unregister (pt );
276
+
245
277
/* Disable and clear interrupts */
246
278
pt_core_disable_queue_interrupts (pt );
247
279
0 commit comments