net: cadence_gem: Set ISR according to queue in use
Set ISR according to queue in use, added interrupt support for all queues. Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
4c70e32f05
commit
68dbee3bf9
@ -451,6 +451,16 @@ static inline void rx_desc_set_sar(uint32_t *desc, int sar_idx)
|
|||||||
/* The broadcast MAC address: 0xFFFFFFFFFFFF */
|
/* The broadcast MAC address: 0xFFFFFFFFFFFF */
|
||||||
static const uint8_t broadcast_addr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
static const uint8_t broadcast_addr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||||
|
|
||||||
|
static void gem_set_isr(CadenceGEMState *s, int q, uint32_t flag)
|
||||||
|
{
|
||||||
|
if (q == 0) {
|
||||||
|
s->regs[GEM_ISR] |= flag & ~(s->regs[GEM_IMR]);
|
||||||
|
} else {
|
||||||
|
s->regs[GEM_INT_Q1_STATUS + q - 1] |= flag &
|
||||||
|
~(s->regs[GEM_INT_Q1_MASK + q - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gem_init_register_masks:
|
* gem_init_register_masks:
|
||||||
* One time initialization.
|
* One time initialization.
|
||||||
@ -906,7 +916,7 @@ static void gem_get_rx_desc(CadenceGEMState *s, int q)
|
|||||||
if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
|
if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
|
||||||
DB_PRINT("descriptor 0x%" HWADDR_PRIx " owned by sw.\n", desc_addr);
|
DB_PRINT("descriptor 0x%" HWADDR_PRIx " owned by sw.\n", desc_addr);
|
||||||
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
|
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
|
||||||
s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
|
gem_set_isr(s, q, GEM_INT_RXUSED);
|
||||||
/* Handle interrupt consequences */
|
/* Handle interrupt consequences */
|
||||||
gem_update_int_status(s);
|
gem_update_int_status(s);
|
||||||
}
|
}
|
||||||
@ -1080,7 +1090,7 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
|||||||
gem_receive_updatestats(s, buf, size);
|
gem_receive_updatestats(s, buf, size);
|
||||||
|
|
||||||
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_FRMRCVD;
|
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_FRMRCVD;
|
||||||
s->regs[GEM_ISR] |= GEM_INT_RXCMPL & ~(s->regs[GEM_IMR]);
|
gem_set_isr(s, q, GEM_INT_RXCMPL);
|
||||||
|
|
||||||
/* Handle interrupt consequences */
|
/* Handle interrupt consequences */
|
||||||
gem_update_int_status(s);
|
gem_update_int_status(s);
|
||||||
@ -1231,13 +1241,7 @@ static void gem_transmit(CadenceGEMState *s)
|
|||||||
DB_PRINT("TX descriptor next: 0x%08x\n", s->tx_desc_addr[q]);
|
DB_PRINT("TX descriptor next: 0x%08x\n", s->tx_desc_addr[q]);
|
||||||
|
|
||||||
s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_TXCMPL;
|
s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_TXCMPL;
|
||||||
s->regs[GEM_ISR] |= GEM_INT_TXCMPL & ~(s->regs[GEM_IMR]);
|
gem_set_isr(s, q, GEM_INT_TXCMPL);
|
||||||
|
|
||||||
/* Update queue interrupt status */
|
|
||||||
if (s->num_priority_queues > 1) {
|
|
||||||
s->regs[GEM_INT_Q1_STATUS + q] |=
|
|
||||||
GEM_INT_TXCMPL & ~(s->regs[GEM_INT_Q1_MASK + q]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle interrupt consequences */
|
/* Handle interrupt consequences */
|
||||||
gem_update_int_status(s);
|
gem_update_int_status(s);
|
||||||
@ -1287,7 +1291,10 @@ static void gem_transmit(CadenceGEMState *s)
|
|||||||
|
|
||||||
if (tx_desc_get_used(desc)) {
|
if (tx_desc_get_used(desc)) {
|
||||||
s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_USED;
|
s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_USED;
|
||||||
s->regs[GEM_ISR] |= GEM_INT_TXUSED & ~(s->regs[GEM_IMR]);
|
/* IRQ TXUSED is defined only for queue 0 */
|
||||||
|
if (q == 0) {
|
||||||
|
gem_set_isr(s, 0, GEM_INT_TXUSED);
|
||||||
|
}
|
||||||
gem_update_int_status(s);
|
gem_update_int_status(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user