View | Details | Raw Unified | Return to bug 217343
Collapse All | Expand All

(-)a/drivers/thunderbolt/nhi.c (-7 / +20 lines)
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 */
(-)a/drivers/thunderbolt/nhi_regs.h (-1 / +1 lines)
Lines 92-97 struct ring_desc { Link Here
92
 */
92
 */
93
#define REG_RING_INTERRUPT_BASE	0x38200
93
#define REG_RING_INTERRUPT_BASE	0x38200
94
#define RING_INTERRUPT_REG_COUNT(nhi) ((31 + 2 * nhi->hop_count) / 32)
94
#define RING_INTERRUPT_REG_COUNT(nhi) ((31 + 2 * nhi->hop_count) / 32)
95
#define REG_RING_INTERRUPT_MASK_CLEAR_BASE	0x38208
95
96
96
#define REG_INT_THROTTLING_RATE	0x38c00
97
#define REG_INT_THROTTLING_RATE	0x38c00
97
98
98
- 

Return to bug 217343