summaryrefslogtreecommitdiffstats
path: root/sound/isa
diff options
context:
space:
mode:
Diffstat (limited to 'sound/isa')
-rw-r--r--sound/isa/msnd/msnd_midi.c30
-rw-r--r--sound/isa/msnd/msnd_pinnacle.c23
2 files changed, 27 insertions, 26 deletions
diff --git a/sound/isa/msnd/msnd_midi.c b/sound/isa/msnd/msnd_midi.c
index 912b5a9ccbab..013d8d1170fe 100644
--- a/sound/isa/msnd/msnd_midi.c
+++ b/sound/isa/msnd/msnd_midi.c
@@ -120,24 +120,24 @@ void snd_msndmidi_input_read(void *mpuv)
120 unsigned long flags; 120 unsigned long flags;
121 struct snd_msndmidi *mpu = mpuv; 121 struct snd_msndmidi *mpu = mpuv;
122 void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF; 122 void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF;
123 u16 head, tail, size;
123 124
124 spin_lock_irqsave(&mpu->input_lock, flags); 125 spin_lock_irqsave(&mpu->input_lock, flags);
125 while (readw(mpu->dev->MIDQ + JQS_wTail) != 126 head = readw(mpu->dev->MIDQ + JQS_wHead);
126 readw(mpu->dev->MIDQ + JQS_wHead)) { 127 tail = readw(mpu->dev->MIDQ + JQS_wTail);
127 u16 wTmp, val; 128 size = readw(mpu->dev->MIDQ + JQS_wSize);
128 val = readw(pwMIDQData + 2 * readw(mpu->dev->MIDQ + JQS_wHead)); 129 if (head > size || tail > size)
129 130 goto out;
130 if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER, 131 while (head != tail) {
131 &mpu->mode)) 132 unsigned char val = readw(pwMIDQData + 2 * head);
132 snd_rawmidi_receive(mpu->substream_input, 133
133 (unsigned char *)&val, 1); 134 if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER, &mpu->mode))
134 135 snd_rawmidi_receive(mpu->substream_input, &val, 1);
135 wTmp = readw(mpu->dev->MIDQ + JQS_wHead) + 1; 136 if (++head > size)
136 if (wTmp > readw(mpu->dev->MIDQ + JQS_wSize)) 137 head = 0;
137 writew(0, mpu->dev->MIDQ + JQS_wHead); 138 writew(head, mpu->dev->MIDQ + JQS_wHead);
138 else
139 writew(wTmp, mpu->dev->MIDQ + JQS_wHead);
140 } 139 }
140 out:
141 spin_unlock_irqrestore(&mpu->input_lock, flags); 141 spin_unlock_irqrestore(&mpu->input_lock, flags);
142} 142}
143EXPORT_SYMBOL(snd_msndmidi_input_read); 143EXPORT_SYMBOL(snd_msndmidi_input_read);
diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c
index ad4897337df5..fc4fb1904aef 100644
--- a/sound/isa/msnd/msnd_pinnacle.c
+++ b/sound/isa/msnd/msnd_pinnacle.c
@@ -170,23 +170,24 @@ static irqreturn_t snd_msnd_interrupt(int irq, void *dev_id)
170{ 170{
171 struct snd_msnd *chip = dev_id; 171 struct snd_msnd *chip = dev_id;
172 void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF; 172 void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
173 u16 head, tail, size;
173 174
174 /* Send ack to DSP */ 175 /* Send ack to DSP */
175 /* inb(chip->io + HP_RXL); */ 176 /* inb(chip->io + HP_RXL); */
176 177
177 /* Evaluate queued DSP messages */ 178 /* Evaluate queued DSP messages */
178 while (readw(chip->DSPQ + JQS_wTail) != readw(chip->DSPQ + JQS_wHead)) { 179 head = readw(chip->DSPQ + JQS_wHead);
179 u16 wTmp; 180 tail = readw(chip->DSPQ + JQS_wTail);
180 181 size = readw(chip->DSPQ + JQS_wSize);
181 snd_msnd_eval_dsp_msg(chip, 182 if (head > size || tail > size)
182 readw(pwDSPQData + 2 * readw(chip->DSPQ + JQS_wHead))); 183 goto out;
183 184 while (head != tail) {
184 wTmp = readw(chip->DSPQ + JQS_wHead) + 1; 185 snd_msnd_eval_dsp_msg(chip, readw(pwDSPQData + 2 * head));
185 if (wTmp > readw(chip->DSPQ + JQS_wSize)) 186 if (++head > size)
186 writew(0, chip->DSPQ + JQS_wHead); 187 head = 0;
187 else 188 writew(head, chip->DSPQ + JQS_wHead);
188 writew(wTmp, chip->DSPQ + JQS_wHead);
189 } 189 }
190 out:
190 /* Send ack to DSP */ 191 /* Send ack to DSP */
191 inb(chip->io + HP_RXL); 192 inb(chip->io + HP_RXL);
192 return IRQ_HANDLED; 193 return IRQ_HANDLED;