|
88 | 88 | #define XLLF_INT_TC_MASK 0x08000000 /* Transmit complete */ |
89 | 89 | #define XLLF_INT_RC_MASK 0x04000000 /* Receive complete */ |
90 | 90 | #define XLLF_INT_TSE_MASK 0x02000000 /* Transmit length mismatch */ |
91 | | -#define XLLF_INT_TRC_MASK 0x01000000 /* Transmit reset complete */ |
92 | | -#define XLLF_INT_RRC_MASK 0x00800000 /* Receive reset complete */ |
93 | | -#define XLLF_INT_TFPF_MASK 0x00400000 /* Tx FIFO Programmable Full */ |
94 | | -#define XLLF_INT_TFPE_MASK 0x00200000 /* Tx FIFO Programmable Empty */ |
95 | | -#define XLLF_INT_RFPF_MASK 0x00100000 /* Rx FIFO Programmable Full */ |
96 | | -#define XLLF_INT_RFPE_MASK 0x00080000 /* Rx FIFO Programmable Empty */ |
97 | | -#define XLLF_INT_ALL_MASK 0xfff80000 /* All the ints */ |
98 | | -#define XLLF_INT_ERROR_MASK 0xf2000000 /* Error status ints */ |
99 | | -#define XLLF_INT_RXERROR_MASK 0xe0000000 /* Receive Error status ints */ |
100 | | -#define XLLF_INT_TXERROR_MASK 0x12000000 /* Transmit Error status ints */ |
| 91 | + |
| 92 | +#define XLLF_INT_CLEAR_ALL GENMASK(31, 0) |
101 | 93 |
|
102 | 94 | /* ---------------------------- |
103 | 95 | * globals |
@@ -165,7 +157,7 @@ static void reset_ip_core(struct axis_fifo *fifo) |
165 | 157 | XLLF_INT_RPORE_MASK | XLLF_INT_RPUE_MASK | |
166 | 158 | XLLF_INT_TPOE_MASK | XLLF_INT_TSE_MASK, |
167 | 159 | fifo->base_addr + XLLF_IER_OFFSET); |
168 | | - iowrite32(XLLF_INT_ALL_MASK, fifo->base_addr + XLLF_ISR_OFFSET); |
| 160 | + iowrite32(XLLF_INT_CLEAR_ALL, fifo->base_addr + XLLF_ISR_OFFSET); |
169 | 161 | } |
170 | 162 |
|
171 | 163 | /** |
@@ -396,106 +388,36 @@ static ssize_t axis_fifo_write(struct file *f, const char __user *buf, |
396 | 388 |
|
397 | 389 | static irqreturn_t axis_fifo_irq(int irq, void *dw) |
398 | 390 | { |
399 | | - struct axis_fifo *fifo = (struct axis_fifo *)dw; |
400 | | - unsigned int pending_interrupts; |
401 | | - |
402 | | - do { |
403 | | - pending_interrupts = ioread32(fifo->base_addr + |
404 | | - XLLF_IER_OFFSET) & |
405 | | - ioread32(fifo->base_addr |
406 | | - + XLLF_ISR_OFFSET); |
407 | | - if (pending_interrupts & XLLF_INT_RC_MASK) { |
408 | | - /* packet received */ |
409 | | - |
410 | | - /* wake the reader process if it is waiting */ |
411 | | - wake_up(&fifo->read_queue); |
412 | | - |
413 | | - /* clear interrupt */ |
414 | | - iowrite32(XLLF_INT_RC_MASK & XLLF_INT_ALL_MASK, |
415 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
416 | | - } else if (pending_interrupts & XLLF_INT_TC_MASK) { |
417 | | - /* packet sent */ |
418 | | - |
419 | | - /* wake the writer process if it is waiting */ |
420 | | - wake_up(&fifo->write_queue); |
421 | | - |
422 | | - iowrite32(XLLF_INT_TC_MASK & XLLF_INT_ALL_MASK, |
423 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
424 | | - } else if (pending_interrupts & XLLF_INT_TFPF_MASK) { |
425 | | - /* transmit fifo programmable full */ |
426 | | - |
427 | | - iowrite32(XLLF_INT_TFPF_MASK & XLLF_INT_ALL_MASK, |
428 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
429 | | - } else if (pending_interrupts & XLLF_INT_TFPE_MASK) { |
430 | | - /* transmit fifo programmable empty */ |
431 | | - |
432 | | - iowrite32(XLLF_INT_TFPE_MASK & XLLF_INT_ALL_MASK, |
433 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
434 | | - } else if (pending_interrupts & XLLF_INT_RFPF_MASK) { |
435 | | - /* receive fifo programmable full */ |
436 | | - |
437 | | - iowrite32(XLLF_INT_RFPF_MASK & XLLF_INT_ALL_MASK, |
438 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
439 | | - } else if (pending_interrupts & XLLF_INT_RFPE_MASK) { |
440 | | - /* receive fifo programmable empty */ |
441 | | - |
442 | | - iowrite32(XLLF_INT_RFPE_MASK & XLLF_INT_ALL_MASK, |
443 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
444 | | - } else if (pending_interrupts & XLLF_INT_TRC_MASK) { |
445 | | - /* transmit reset complete interrupt */ |
446 | | - |
447 | | - iowrite32(XLLF_INT_TRC_MASK & XLLF_INT_ALL_MASK, |
448 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
449 | | - } else if (pending_interrupts & XLLF_INT_RRC_MASK) { |
450 | | - /* receive reset complete interrupt */ |
451 | | - |
452 | | - iowrite32(XLLF_INT_RRC_MASK & XLLF_INT_ALL_MASK, |
453 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
454 | | - } else if (pending_interrupts & XLLF_INT_RPURE_MASK) { |
455 | | - /* receive fifo under-read error interrupt */ |
456 | | - dev_err(fifo->dt_device, |
457 | | - "receive under-read interrupt\n"); |
458 | | - |
459 | | - iowrite32(XLLF_INT_RPURE_MASK & XLLF_INT_ALL_MASK, |
460 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
461 | | - } else if (pending_interrupts & XLLF_INT_RPORE_MASK) { |
462 | | - /* receive over-read error interrupt */ |
463 | | - dev_err(fifo->dt_device, |
464 | | - "receive over-read interrupt\n"); |
465 | | - |
466 | | - iowrite32(XLLF_INT_RPORE_MASK & XLLF_INT_ALL_MASK, |
467 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
468 | | - } else if (pending_interrupts & XLLF_INT_RPUE_MASK) { |
469 | | - /* receive underrun error interrupt */ |
470 | | - dev_err(fifo->dt_device, |
471 | | - "receive underrun error interrupt\n"); |
472 | | - |
473 | | - iowrite32(XLLF_INT_RPUE_MASK & XLLF_INT_ALL_MASK, |
474 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
475 | | - } else if (pending_interrupts & XLLF_INT_TPOE_MASK) { |
476 | | - /* transmit overrun error interrupt */ |
477 | | - dev_err(fifo->dt_device, |
478 | | - "transmit overrun error interrupt\n"); |
479 | | - |
480 | | - iowrite32(XLLF_INT_TPOE_MASK & XLLF_INT_ALL_MASK, |
481 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
482 | | - } else if (pending_interrupts & XLLF_INT_TSE_MASK) { |
483 | | - /* transmit length mismatch error interrupt */ |
484 | | - dev_err(fifo->dt_device, |
485 | | - "transmit length mismatch error interrupt\n"); |
486 | | - |
487 | | - iowrite32(XLLF_INT_TSE_MASK & XLLF_INT_ALL_MASK, |
488 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
489 | | - } else if (pending_interrupts) { |
490 | | - /* unknown interrupt type */ |
491 | | - dev_err(fifo->dt_device, |
492 | | - "unknown interrupt(s) 0x%x\n", |
493 | | - pending_interrupts); |
494 | | - |
495 | | - iowrite32(XLLF_INT_ALL_MASK, |
496 | | - fifo->base_addr + XLLF_ISR_OFFSET); |
497 | | - } |
498 | | - } while (pending_interrupts); |
| 391 | + struct axis_fifo *fifo = dw; |
| 392 | + u32 isr, ier, intr; |
| 393 | + |
| 394 | + ier = ioread32(fifo->base_addr + XLLF_IER_OFFSET); |
| 395 | + isr = ioread32(fifo->base_addr + XLLF_ISR_OFFSET); |
| 396 | + intr = ier & isr; |
| 397 | + |
| 398 | + if (intr & XLLF_INT_RC_MASK) |
| 399 | + wake_up(&fifo->read_queue); |
| 400 | + |
| 401 | + if (intr & XLLF_INT_TC_MASK) |
| 402 | + wake_up(&fifo->write_queue); |
| 403 | + |
| 404 | + if (intr & XLLF_INT_RPURE_MASK) |
| 405 | + dev_err(fifo->dt_device, "receive under-read interrupt\n"); |
| 406 | + |
| 407 | + if (intr & XLLF_INT_RPORE_MASK) |
| 408 | + dev_err(fifo->dt_device, "receive over-read interrupt\n"); |
| 409 | + |
| 410 | + if (intr & XLLF_INT_RPUE_MASK) |
| 411 | + dev_err(fifo->dt_device, "receive underrun error interrupt\n"); |
| 412 | + |
| 413 | + if (intr & XLLF_INT_TPOE_MASK) |
| 414 | + dev_err(fifo->dt_device, "transmit overrun error interrupt\n"); |
| 415 | + |
| 416 | + if (intr & XLLF_INT_TSE_MASK) |
| 417 | + dev_err(fifo->dt_device, |
| 418 | + "transmit length mismatch error interrupt\n"); |
| 419 | + |
| 420 | + iowrite32(XLLF_INT_CLEAR_ALL, fifo->base_addr + XLLF_ISR_OFFSET); |
499 | 421 |
|
500 | 422 | return IRQ_HANDLED; |
501 | 423 | } |
|
0 commit comments