Lines 61-68
static int ring_interrupt_index(const struct tb_ring *ring)
Link Here
|
61 |
*/ |
61 |
*/ |
62 |
static void ring_interrupt_active(struct tb_ring *ring, bool active) |
62 |
static void ring_interrupt_active(struct tb_ring *ring, bool active) |
63 |
{ |
63 |
{ |
64 |
int reg = REG_RING_INTERRUPT_BASE + |
64 |
int index = ring_interrupt_index(ring) / 32 * 4; |
65 |
ring_interrupt_index(ring) / 32 * 4; |
65 |
int reg = REG_RING_INTERRUPT_BASE + index; |
|
|
66 |
int clear = REG_RING_INTERRUPT_MASK_CLEAR_BASE + index; |
66 |
int interrupt_bit = ring_interrupt_index(ring) & 31; |
67 |
int interrupt_bit = ring_interrupt_index(ring) & 31; |
67 |
int mask = 1 << interrupt_bit; |
68 |
int mask = 1 << interrupt_bit; |
68 |
u32 old, new; |
69 |
u32 old, new; |
Lines 123-129
static void ring_interrupt_active(struct tb_ring *ring, bool active)
Link Here
|
123 |
"interrupt for %s %d is already %s\n", |
124 |
"interrupt for %s %d is already %s\n", |
124 |
RING_TYPE(ring), ring->hop, |
125 |
RING_TYPE(ring), ring->hop, |
125 |
active ? "enabled" : "disabled"); |
126 |
active ? "enabled" : "disabled"); |
126 |
iowrite32(new, ring->nhi->iobase + reg); |
127 |
|
|
|
128 |
if (active) |
129 |
iowrite32(new, ring->nhi->iobase + reg); |
130 |
else |
131 |
iowrite32(mask, ring->nhi->iobase + clear); |
127 |
} |
132 |
} |
128 |
|
133 |
|
129 |
/* |
134 |
/* |
Lines 135-146
static void nhi_disable_interrupts(struct tb_nhi *nhi)
Link Here
|
135 |
{ |
140 |
{ |
136 |
int i = 0; |
141 |
int i = 0; |
137 |
/* disable interrupts */ |
142 |
/* disable interrupts */ |
138 |
for (i = 0; i < RING_INTERRUPT_REG_COUNT(nhi); i++) |
143 |
for (i = 0; i < RING_INTERRUPT_REG_COUNT(nhi); i++) { |
139 |
iowrite32(0, nhi->iobase + REG_RING_INTERRUPT_BASE + 4 * i); |
144 |
if (nhi->quirks & QUIRK_AUTO_CLEAR_INT) |
|
|
145 |
iowrite32(0, nhi->iobase + REG_RING_INTERRUPT_BASE + 4 * i); |
146 |
else |
147 |
iowrite32(0xffffffff, nhi->iobase + REG_RING_INTERRUPT_MASK_CLEAR_BASE + 4 * i); |
148 |
} |
140 |
|
149 |
|
141 |
/* clear interrupt status bits */ |
150 |
/* clear interrupt status bits */ |
142 |
for (i = 0; i < RING_NOTIFY_REG_COUNT(nhi); i++) |
151 |
for (i = 0; i < RING_NOTIFY_REG_COUNT(nhi); i++) { |
143 |
ioread32(nhi->iobase + REG_RING_NOTIFY_BASE + 4 * i); |
152 |
if (nhi->quirks & QUIRK_AUTO_CLEAR_INT) |
|
|
153 |
ioread32(nhi->iobase + REG_RING_NOTIFY_BASE + 4 * i); |
154 |
else |
155 |
iowrite32(0xffffffff, nhi->iobase + REG_RING_INT_CLEAR + 4 * i); |
156 |
} |
144 |
} |
157 |
} |
145 |
|
158 |
|
146 |
/* ring helper methods */ |
159 |
/* ring helper methods */ |