Revision bc3b26f5 hw/pl181.c

b/hw/pl181.c
184 184
    uint32_t bits;
185 185
    uint32_t value;
186 186
    int n;
187
    int limit;
188 187
    int is_read;
189 188

  
190 189
    is_read = (s->datactrl & PL181_DATA_DIRECTION) != 0;
191 190
    if (s->datacnt != 0 && (!is_read || sd_data_ready(s->card))
192 191
            && !s->linux_hack) {
193
        limit = is_read ? PL181_FIFO_LEN : 0;
194
        n = 0;
195
        value = 0;
196
        while (s->datacnt && s->fifo_len != limit) {
197
            if (is_read) {
192
        if (is_read) {
193
            n = 0;
194
            value = 0;
195
            while (s->datacnt && s->fifo_len < PL181_FIFO_LEN) {
198 196
                value |= (uint32_t)sd_read_data(s->card) << (n * 8);
197
                s->datacnt--;
199 198
                n++;
200 199
                if (n == 4) {
201 200
                    pl181_fifo_push(s, value);
202
                    value = 0;
203 201
                    n = 0;
202
                    value = 0;
204 203
                }
205
            } else {
204
            }
205
            if (n != 0) {
206
                pl181_fifo_push(s, value);
207
            }
208
        } else { /* write */
209
            n = 0;
210
            while (s->datacnt > 0 && (s->fifo_len > 0 || n > 0)) {
206 211
                if (n == 0) {
207 212
                    value = pl181_fifo_pop(s);
208 213
                    n = 4;
209 214
                }
215
                n--;
216
                s->datacnt--;
210 217
                sd_write_data(s->card, value & 0xff);
211 218
                value >>= 8;
212
                n--;
213 219
            }
214
            s->datacnt--;
215
        }
216
        if (n && is_read) {
217
            pl181_fifo_push(s, value);
218 220
        }
219 221
    }
220 222
    s->status &= ~(PL181_STATUS_RX_FIFO | PL181_STATUS_TX_FIFO);

Also available in: Unified diff