~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to hw/scsi/scsi-generic.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
143
143
static void scsi_command_complete(void *opaque, int ret)
144
144
{
145
145
    SCSIGenericReq *r = (SCSIGenericReq *)opaque;
 
146
    SCSIDevice *s = r->req.dev;
146
147
 
147
148
    assert(r->req.aiocb != NULL);
148
149
    r->req.aiocb = NULL;
 
150
 
 
151
    aio_context_acquire(blk_get_aio_context(s->conf.blk));
149
152
    scsi_command_complete_noio(r, ret);
 
153
    aio_context_release(blk_get_aio_context(s->conf.blk));
150
154
}
151
155
 
152
156
static int execute_command(BlockBackend *blk,
182
186
    assert(r->req.aiocb != NULL);
183
187
    r->req.aiocb = NULL;
184
188
 
 
189
    aio_context_acquire(blk_get_aio_context(s->conf.blk));
 
190
 
185
191
    if (ret || r->req.io_canceled) {
186
192
        scsi_command_complete_noio(r, ret);
187
 
        return;
 
193
        goto done;
188
194
    }
189
195
 
190
196
    len = r->io_header.dxfer_len - r->io_header.resid;
193
199
    r->len = -1;
194
200
    if (len == 0) {
195
201
        scsi_command_complete_noio(r, 0);
196
 
        return;
 
202
        goto done;
197
203
    }
198
204
 
199
205
    /* Snoop READ CAPACITY output to set the blocksize.  */
231
237
        assert(max_transfer);
232
238
        stl_be_p(&r->buf[8], max_transfer);
233
239
        /* Also take care of the opt xfer len. */
234
 
        if (ldl_be_p(&r->buf[12]) > max_transfer) {
235
 
            stl_be_p(&r->buf[12], max_transfer);
236
 
        }
 
240
        stl_be_p(&r->buf[12],
 
241
                 MIN_NON_ZERO(max_transfer, ldl_be_p(&r->buf[12])));
237
242
    }
238
243
    scsi_req_data(&r->req, len);
239
244
    scsi_req_unref(&r->req);
 
245
 
 
246
done:
 
247
    aio_context_release(blk_get_aio_context(s->conf.blk));
240
248
}
241
249
 
242
250
/* Read more data from scsi device into buffer.  */
246
254
    SCSIDevice *s = r->req.dev;
247
255
    int ret;
248
256
 
249
 
    DPRINTF("scsi_read_data 0x%x\n", req->tag);
 
257
    DPRINTF("scsi_read_data tag=0x%x\n", req->tag);
250
258
 
251
259
    /* The request is used as the AIO opaque value, so add a ref.  */
252
260
    scsi_req_ref(&r->req);
272
280
    assert(r->req.aiocb != NULL);
273
281
    r->req.aiocb = NULL;
274
282
 
 
283
    aio_context_acquire(blk_get_aio_context(s->conf.blk));
 
284
 
275
285
    if (ret || r->req.io_canceled) {
276
286
        scsi_command_complete_noio(r, ret);
277
 
        return;
 
287
        goto done;
278
288
    }
279
289
 
280
290
    if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 &&
284
294
    }
285
295
 
286
296
    scsi_command_complete_noio(r, ret);
 
297
 
 
298
done:
 
299
    aio_context_release(blk_get_aio_context(s->conf.blk));
287
300
}
288
301
 
289
302
/* Write data to a scsi device.  Returns nonzero on failure.
294
307
    SCSIDevice *s = r->req.dev;
295
308
    int ret;
296
309
 
297
 
    DPRINTF("scsi_write_data 0x%x\n", req->tag);
 
310
    DPRINTF("scsi_write_data tag=0x%x\n", req->tag);
298
311
    if (r->len == 0) {
299
312
        r->len = r->buflen;
300
313
        scsi_req_data(&r->req, r->len);
329
342
    int ret;
330
343
 
331
344
#ifdef DEBUG_SCSI
 
345
    DPRINTF("Command: data=0x%02x", cmd[0]);
332
346
    {
333
347
        int i;
334
348
        for (i = 1; i < r->req.cmd.len; i++) {