Subversion Repositories freemyipod

Rev

Rev 924 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 924 Rev 967
Line 24... Line 24...
24
 
24
 
25
#include "emcoreapp.h"
25
#include "emcoreapp.h"
26
#include "ums.h"
26
#include "ums.h"
27
#include "scsi.h"
27
#include "scsi.h"
28
#include "usb.h"
28
#include "usb.h"
-
 
29
#include "../../emcore/trunk/target/ipodclassic/storage_ata-target.h"
29
 
30
 
30
 
31
 
31
#define UMS_BUFSIZE 65536
32
#define UMS_BUFSIZE 65536
32
 
33
 
33
 
34
 
Line 38... Line 39...
38
    unsigned int orig_count;
39
    unsigned int orig_count;
39
    unsigned int cur_cmd;
40
    unsigned int cur_cmd;
40
    unsigned int tag;
41
    unsigned int tag;
41
    unsigned int lun;
42
    unsigned int lun;
42
    unsigned int last_result;
43
    unsigned int last_result;
-
 
44
    unsigned int bytes_pending;
-
 
45
    bool data_direction;
43
} cur_cmd;
46
} cur_cmd;
44
 
47
 
45
 
48
 
46
static struct
49
static struct
47
{
50
{
Line 50... Line 53...
50
    unsigned char asc;
53
    unsigned char asc;
51
    unsigned char ascq;
54
    unsigned char ascq;
52
} cur_sense_data;
55
} cur_sense_data;
53
 
56
 
54
 
57
 
-
 
58
static enum
-
 
59
{
-
 
60
    SAT_PENDING_NONE = 0,
-
 
61
    SAT_PENDING_SRST,
-
 
62
    SAT_PENDING_HRST,
-
 
63
    SAT_PENDING_CMD,
-
 
64
    SAT_PENDING_READ_CDB,
-
 
65
} sat_pending = SAT_PENDING_NONE;
-
 
66
static struct ata_raw_cmd_t sat_command;
-
 
67
static struct __attribute__((packed)) sat_response_information
-
 
68
{
-
 
69
    uint8_t descriptor_code;
-
 
70
    uint8_t additional_length;
-
 
71
    uint8_t extend;
-
 
72
    uint8_t error;
-
 
73
    uint8_t sector_count_h;
-
 
74
    uint8_t sector_count_l;
-
 
75
    uint8_t lba_low_h;
-
 
76
    uint8_t lba_low_l;
-
 
77
    uint8_t lba_mid_h;
-
 
78
    uint8_t lba_mid_l;
-
 
79
    uint8_t lba_high_h;
-
 
80
    uint8_t lba_high_l;
-
 
81
    uint8_t device;
-
 
82
    uint8_t status;
-
 
83
} sat_response_information;
-
 
84
static bool have_sat_response_information = false;
-
 
85
static bool sat_check;
-
 
86
 
-
 
87
 
55
struct __attribute__((packed,aligned(32))) command_block_wrapper
88
struct __attribute__((packed)) command_block_wrapper
56
{
89
{
57
    unsigned int signature;
90
    unsigned int signature;
58
    unsigned int tag;
91
    unsigned int tag;
59
    unsigned int data_transfer_length;
92
    unsigned int data_transfer_length;
60
    unsigned char flags;
93
    unsigned char flags;
Line 76... Line 109...
76
union __attribute__((aligned(32)))
109
union __attribute__((aligned(32)))
77
{
110
{
78
    struct inquiry_data inquiry;
111
    struct inquiry_data inquiry;
79
    struct capacity capacity_data;
112
    struct capacity capacity_data;
80
    struct format_capacity format_capacity_data;
113
    struct format_capacity format_capacity_data;
81
    struct sense_data sense_data;
114
    struct sense_data_fixed sense_data_fixed;
-
 
115
    struct
-
 
116
    {
-
 
117
        struct sense_data_descr header;
-
 
118
        union
-
 
119
        {
-
 
120
            struct sat_response_information sat_response;
-
 
121
        } info;
-
 
122
    } sense_data_descr;
82
    struct mode_sense_data_6 ms_data_6;
123
    struct mode_sense_data_6 ms_data_6;
83
    struct mode_sense_data_10 ms_data_10;
124
    struct mode_sense_data_10 ms_data_10;
84
    struct report_lun_data lun_data;
125
    struct report_lun_data lun_data;
85
    struct command_status_wrapper csw;
126
    struct command_status_wrapper csw;
86
} tb;
127
} tb;
Line 89... Line 130...
89
static enum
130
static enum
90
{
131
{
91
    WAITING_FOR_COMMAND,
132
    WAITING_FOR_COMMAND,
92
    SENDING_BLOCKS,
133
    SENDING_BLOCKS,
93
    SENDING_RESULT,
134
    SENDING_RESULT,
94
    SENDING_FAILED_RESULT,
-
 
95
    RECEIVING_BLOCKS,
135
    RECEIVING_BLOCKS,
96
    WAITING_FOR_CSW_COMPLETION
136
    WAITING_FOR_CSW_COMPLETION,
-
 
137
    RECEIVING_SAT_WRITE,
-
 
138
    PROCESSING,
97
} state = WAITING_FOR_COMMAND;
139
} state = WAITING_FOR_COMMAND;
98
 
140
 
99
static uint32_t length;
141
static uint32_t length;
100
static struct storage_info storage_info;
142
static struct storage_info storage_info;
101
static uint8_t __attribute__((aligned(32))) umsbuf[2][2][UMS_BUFSIZE];
143
static uint8_t __attribute__((aligned(32))) umsbuf[2][2][UMS_BUFSIZE];
Line 133... Line 175...
133
}
175
}
134
 
176
 
135
 
177
 
136
static void send_csw(int status)
178
static void send_csw(int status)
137
{
179
{
-
 
180
    if (cur_cmd.bytes_pending)
-
 
181
    {
-
 
182
        if (cur_cmd.data_direction) usb_stall_in();
-
 
183
        else usb_stall_out();
-
 
184
    }
-
 
185
 
138
    tb.csw.signature = 0x53425355;
186
    tb.csw.signature = 0x53425355;
139
    tb.csw.tag = cur_cmd.tag;
187
    tb.csw.tag = cur_cmd.tag;
140
    tb.csw.data_residue = 0;
188
    tb.csw.data_residue = cur_cmd.bytes_pending;
141
    tb.csw.status = status;
189
    tb.csw.status = status;
142
 
190
 
143
    state = WAITING_FOR_CSW_COMPLETION;
191
    state = WAITING_FOR_CSW_COMPLETION;
144
    usb_transmit(&tb.csw, sizeof(tb.csw));
192
    usb_transmit(&tb.csw, sizeof(tb.csw));
145
 
193
 
Line 153... Line 201...
153
}
201
}
154
 
202
 
155
 
203
 
156
static void receive_block_data(void* data, int size)
204
static void receive_block_data(void* data, int size)
157
{
205
{
-
 
206
    if (cur_cmd.data_direction) fail("diskmode: Attempting to receive data for IN command!");
-
 
207
    else if (size > cur_cmd.bytes_pending) fail("diskmode: Receive overrun!");
-
 
208
    else
-
 
209
    {
-
 
210
        cur_cmd.bytes_pending -= size;
158
    length = size;
211
        length = size;
159
    usb_receive(data, size);
212
        usb_receive(data, size);
160
    state = RECEIVING_BLOCKS;
213
        state = RECEIVING_BLOCKS;
-
 
214
    }
-
 
215
}
-
 
216
 
-
 
217
 
-
 
218
static void receive_sat_write(void* data, int size)
-
 
219
{
-
 
220
    if (cur_cmd.data_direction) fail("diskmode: Attempting to receive data for SAT IN command!");
-
 
221
    else if (size > cur_cmd.bytes_pending) fail("diskmode: Receive SAT overrun!");
-
 
222
    else
-
 
223
    {
-
 
224
        cur_cmd.bytes_pending -= size;
-
 
225
        length = size;
-
 
226
        usb_receive(data, size);
-
 
227
        state = RECEIVING_SAT_WRITE;
-
 
228
    }
161
}
229
}
162
 
230
 
163
 
231
 
164
static void send_block_data(void* data, int size)
232
static void send_block_data(void* data, int size)
165
{
233
{
-
 
234
    if (!cur_cmd.data_direction) fail("diskmode: Attempting to send data for OUT command!");
-
 
235
    else if (size > cur_cmd.bytes_pending) fail("diskmode: Send block overrun!");
-
 
236
    else
-
 
237
    {
-
 
238
        cur_cmd.bytes_pending -= size;
166
    length = size;
239
        length = size;
167
    usb_transmit(data, size);
240
        usb_transmit(data, size);
168
    state = SENDING_BLOCKS;
241
        state = SENDING_BLOCKS;
-
 
242
    }
169
}
243
}
170
 
244
 
171
 
245
 
172
static void send_command_result(void* data, int size)
246
static void send_command_result(void* data, int size)
173
{
247
{
-
 
248
    if (!cur_cmd.data_direction) fail("diskmode: Attempting to send result for OUT command!");
-
 
249
    else if (size > cur_cmd.bytes_pending) fail("diskmode: Send result overrun!");
-
 
250
    else
-
 
251
    {
-
 
252
        cur_cmd.bytes_pending -= size;
174
    length = size;
253
        length = size;
175
    usb_transmit(data, size);
254
        usb_transmit(data, size);
176
    state = SENDING_RESULT;
255
        state = SENDING_RESULT;
-
 
256
    }
177
}
257
}
178
 
258
 
179
 
259
 
180
static void send_command_failed_result()
260
static void send_command_failed_result(unsigned char key, unsigned char asc, unsigned char ascq)
181
{
261
{
-
 
262
    send_csw(1);
-
 
263
    cur_sense_data.sense_key = key;
182
    usb_transmit(NULL, 0);
264
    cur_sense_data.asc = asc;
183
    state = SENDING_FAILED_RESULT;
265
    cur_sense_data.ascq = ascq;
184
}
266
}
185
 
267
 
186
 
268
 
187
static void send_and_read_next()
269
static void send_and_read_next()
188
{
270
{
Line 253... Line 335...
253
{
335
{
254
    unsigned int length = cbw->data_transfer_length;
336
    unsigned int length = cbw->data_transfer_length;
255
 
337
 
256
    if (cbw->signature != 0x43425355)
338
    if (cbw->signature != 0x43425355)
257
    {
339
    {
258
        usb_stall();
340
        usb_stall_in();
-
 
341
        usb_stall_out();
259
        return;
342
        return;
260
    }
343
    }
261
    cur_cmd.tag = cbw->tag;
344
    cur_cmd.tag = cbw->tag;
262
    cur_cmd.lun = cbw->lun;
345
    cur_cmd.lun = cbw->lun;
263
    cur_cmd.cur_cmd = cbw->command_block[0];
346
    cur_cmd.cur_cmd = cbw->command_block[0];
-
 
347
    cur_cmd.bytes_pending = cbw->data_transfer_length;
-
 
348
    if (cbw->flags & 0x80) cur_cmd.data_direction = 1;
-
 
349
    else cur_cmd.data_direction = 0;
264
 
350
 
265
    switch (cbw->command_block[0])
351
    switch (cbw->command_block[0])
266
    {
352
    {
267
        case SCSI_TEST_UNIT_READY:
353
        case SCSI_TEST_UNIT_READY:
268
            if (!ums_ejected) send_csw(0);
354
            if (!ums_ejected) send_csw(0);
269
            else
-
 
270
            {
-
 
271
                send_csw(1);
-
 
272
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
273
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
355
            else send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
274
                cur_sense_data.ascq = 0;
-
 
275
            }
-
 
276
            break;
356
            break;
277
 
357
 
278
        case SCSI_REPORT_LUNS:
358
        case SCSI_REPORT_LUNS:
279
        {
359
        {
280
            memset(&tb.lun_data, 0, sizeof(struct report_lun_data));
360
            memset(&tb.lun_data, 0, sizeof(struct report_lun_data));
Line 289... Line 369...
289
            send_command_result(&tb.inquiry, MIN(sizeof(tb.inquiry), length));
369
            send_command_result(&tb.inquiry, MIN(sizeof(tb.inquiry), length));
290
            break;
370
            break;
291
 
371
 
292
        case SCSI_REQUEST_SENSE:
372
        case SCSI_REQUEST_SENSE:
293
        {
373
        {
-
 
374
            if (have_sat_response_information)
-
 
375
            {
-
 
376
                memset(&tb.sense_data_descr.header, 0, sizeof(tb.sense_data_descr.header));
-
 
377
                tb.sense_data_descr.header.ResponseCode = 0x72;
-
 
378
                tb.sense_data_descr.header.fei_sensekey = cur_sense_data.sense_key & 0x0f;
-
 
379
                tb.sense_data_descr.header.AdditionalSenseCode = cur_sense_data.asc;
-
 
380
                tb.sense_data_descr.header.AdditionalSenseCodeQualifier = cur_sense_data.ascq;
-
 
381
                tb.sense_data_descr.header.AdditionalSenseLength = sizeof(sat_response_information);
-
 
382
                memcpy(&tb.sense_data_descr.info.sat_response, &sat_response_information, sizeof(sat_response_information));
-
 
383
                send_command_result(&tb.sense_data_descr, MIN(sizeof(tb.sense_data_descr.header) + sizeof(sat_response_information), length));
-
 
384
            }
-
 
385
            else
-
 
386
            {
294
            tb.sense_data.ResponseCode = 0x70;
387
                tb.sense_data_fixed.ResponseCode = 0x70;
295
            tb.sense_data.Obsolete = 0;
388
                tb.sense_data_fixed.Obsolete = 0;
296
            tb.sense_data.fei_sensekey = cur_sense_data.sense_key & 0x0f;
389
                tb.sense_data_fixed.fei_sensekey = cur_sense_data.sense_key & 0x0f;
297
            tb.sense_data.Information = cur_sense_data.information;
390
                tb.sense_data_fixed.Information = cur_sense_data.information;
298
            tb.sense_data.AdditionalSenseLength = 10;
391
                tb.sense_data_fixed.AdditionalSenseLength = 10;
299
            tb.sense_data.CommandSpecificInformation = 0;
392
                tb.sense_data_fixed.CommandSpecificInformation = 0;
300
            tb.sense_data.AdditionalSenseCode = cur_sense_data.asc;
393
                tb.sense_data_fixed.AdditionalSenseCode = cur_sense_data.asc;
301
            tb.sense_data.AdditionalSenseCodeQualifier = cur_sense_data.ascq;
394
                tb.sense_data_fixed.AdditionalSenseCodeQualifier = cur_sense_data.ascq;
302
            tb.sense_data.FieldReplaceableUnitCode = 0;
395
                tb.sense_data_fixed.FieldReplaceableUnitCode = 0;
303
            tb.sense_data.SKSV = 0;
396
                tb.sense_data_fixed.SKSV = 0;
304
            tb.sense_data.SenseKeySpecific = 0;
397
                tb.sense_data_fixed.SenseKeySpecific = 0;
305
            send_command_result(&tb.sense_data, MIN(sizeof(tb.sense_data), length));
398
                send_command_result(&tb.sense_data_fixed, MIN(sizeof(tb.sense_data_fixed), length));
-
 
399
            }
306
            break;
400
            break;
307
        }
401
        }
308
 
402
 
309
        case SCSI_MODE_SENSE_10:
403
        case SCSI_MODE_SENSE_10:
310
        {
404
        {
311
            if (ums_ejected)
405
            if (ums_ejected) 
312
            {
406
            {
313
                send_command_failed_result();
-
 
314
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
315
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
407
                send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
316
                cur_sense_data.ascq = 0;
-
 
317
                break;
408
                break;
318
            }
409
            }
319
            unsigned char page_code = cbw->command_block[2] & 0x3f;
410
            unsigned char page_code = cbw->command_block[2] & 0x3f;
320
            switch (page_code)
411
            switch (page_code)
321
            {
412
            {
Line 340... Line 431...
340
                    tb.ms_data_10.block_descriptor.block_size[2] = (storage_info.sector_size & 0x0000ff00) >> 8;
431
                    tb.ms_data_10.block_descriptor.block_size[2] = (storage_info.sector_size & 0x0000ff00) >> 8;
341
                    tb.ms_data_10.block_descriptor.block_size[3] = (storage_info.sector_size & 0x000000ff);
432
                    tb.ms_data_10.block_descriptor.block_size[3] = (storage_info.sector_size & 0x000000ff);
342
                    send_command_result(&tb.ms_data_10, MIN(sizeof(tb.ms_data_10), length));
433
                    send_command_result(&tb.ms_data_10, MIN(sizeof(tb.ms_data_10), length));
343
                    break;
434
                    break;
344
                default:
435
                default:
345
                    send_command_failed_result();
-
 
346
                    cur_sense_data.sense_key = SENSE_ILLEGAL_REQUEST;
-
 
347
                    cur_sense_data.asc = ASC_INVALID_FIELD_IN_CBD;
436
                    send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CBD, 0);
348
                    cur_sense_data.ascq = 0;
-
 
349
                    break;
437
                    break;
350
            }
438
            }
351
            break;
439
            break;
352
        }
440
        }
353
 
441
 
354
        case SCSI_MODE_SENSE_6:
442
        case SCSI_MODE_SENSE_6:
355
        {
443
        {
356
            if (ums_ejected)
444
            if (ums_ejected)
357
            {
445
            {
358
                send_command_failed_result();
-
 
359
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
360
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
446
                send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
361
                cur_sense_data.ascq = 0;
-
 
362
                break;
447
                break;
363
            }
448
            }
364
            unsigned char page_code = cbw->command_block[2] & 0x3f;
449
            unsigned char page_code = cbw->command_block[2] & 0x3f;
365
            switch (page_code)
450
            switch (page_code)
366
            {
451
            {
Line 387... Line 472...
387
                    tb.ms_data_6.block_descriptor.block_size[1] = (storage_info.sector_size & 0x00ff00) >> 8;
472
                    tb.ms_data_6.block_descriptor.block_size[1] = (storage_info.sector_size & 0x00ff00) >> 8;
388
                    tb.ms_data_6.block_descriptor.block_size[2] = (storage_info.sector_size & 0x0000ff);
473
                    tb.ms_data_6.block_descriptor.block_size[2] = (storage_info.sector_size & 0x0000ff);
389
                    send_command_result(&tb.ms_data_6, MIN(sizeof(tb.ms_data_6), length));
474
                    send_command_result(&tb.ms_data_6, MIN(sizeof(tb.ms_data_6), length));
390
                    break;
475
                    break;
391
                default:
476
                default:
392
                    send_command_failed_result();
-
 
393
                    cur_sense_data.sense_key = SENSE_ILLEGAL_REQUEST;
-
 
394
                    cur_sense_data.asc = ASC_INVALID_FIELD_IN_CBD;
477
                    send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CBD, 0);
395
                    cur_sense_data.ascq = 0;
-
 
396
                    break;
478
                    break;
397
            }
479
            }
398
            break;
480
            break;
399
        }
481
        }
400
 
482
 
Line 417... Line 499...
417
                tb.format_capacity_data.block_count = swap32(storage_info.num_sectors - 1);
499
                tb.format_capacity_data.block_count = swap32(storage_info.num_sectors - 1);
418
                tb.format_capacity_data.block_size = swap32(storage_info.sector_size);
500
                tb.format_capacity_data.block_size = swap32(storage_info.sector_size);
419
                tb.format_capacity_data.block_size |= swap32(SCSI_FORMAT_CAPACITY_FORMATTED_MEDIA);
501
                tb.format_capacity_data.block_size |= swap32(SCSI_FORMAT_CAPACITY_FORMATTED_MEDIA);
420
                send_command_result(&tb.format_capacity_data, MIN(sizeof(tb.format_capacity_data), length));
502
                send_command_result(&tb.format_capacity_data, MIN(sizeof(tb.format_capacity_data), length));
421
           }
503
           }
422
           else
-
 
423
           {
-
 
424
               send_command_failed_result();
-
 
425
               cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
426
               cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
504
           else send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
427
               cur_sense_data.ascq = 0;
-
 
428
           }
-
 
429
           break;
505
           break;
430
        }
506
        }
431
 
507
 
432
        case SCSI_READ_CAPACITY:
508
        case SCSI_READ_CAPACITY:
433
        {
509
        {
Line 435... Line 511...
435
            {
511
            {
436
                tb.capacity_data.block_count = swap32(storage_info.num_sectors - 1);
512
                tb.capacity_data.block_count = swap32(storage_info.num_sectors - 1);
437
                tb.capacity_data.block_size = swap32(storage_info.sector_size);
513
                tb.capacity_data.block_size = swap32(storage_info.sector_size);
438
                send_command_result(&tb.capacity_data, MIN(sizeof(tb.capacity_data), length));
514
                send_command_result(&tb.capacity_data, MIN(sizeof(tb.capacity_data), length));
439
            }
515
            }
440
            else
-
 
441
            {
-
 
442
                send_command_failed_result();
-
 
443
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
444
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
516
            else send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
445
                cur_sense_data.ascq = 0;
-
 
446
            }
-
 
447
            break;
517
            break;
448
        }
518
        }
449
 
519
 
450
        case SCSI_READ_10:
520
        case SCSI_READ_10:
451
            if (ums_ejected)
521
            if (ums_ejected)
452
            {
522
            {
453
                send_command_failed_result();
-
 
454
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
455
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
523
                send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
456
                cur_sense_data.ascq = 0;
-
 
457
                break;
524
                break;
458
            }
525
            }
459
            cur_cmd.sector = (cbw->command_block[2] << 24 | cbw->command_block[3] << 16
526
            cur_cmd.sector = (cbw->command_block[2] << 24 | cbw->command_block[3] << 16
460
                            | cbw->command_block[4] << 8 | cbw->command_block[5]);
527
                            | cbw->command_block[4] << 8 | cbw->command_block[5]);
461
            cur_cmd.count = (cbw->command_block[7] << 8 | cbw->command_block[8]);
528
            cur_cmd.count = (cbw->command_block[7] << 8 | cbw->command_block[8]);
462
            cur_cmd.orig_count = cur_cmd.count;
529
            cur_cmd.orig_count = cur_cmd.count;
463
 
530
 
464
            if ((cur_cmd.sector + cur_cmd.count) > storage_info.num_sectors)
531
            if ((cur_cmd.sector + cur_cmd.count) > storage_info.num_sectors)
465
            {
-
 
466
                send_csw(1);
-
 
467
                cur_sense_data.sense_key = SENSE_ILLEGAL_REQUEST;
532
                send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
468
                cur_sense_data.asc = ASC_LBA_OUT_OF_RANGE;
-
 
469
                cur_sense_data.ascq = 0;
-
 
470
            }
-
 
471
            else if (!cur_cmd.count) send_csw(0);
533
            else if (!cur_cmd.count) send_csw(0);
472
            else send_and_read_next();
534
            else send_and_read_next();
473
            break;
535
            break;
474
 
536
 
475
        case SCSI_WRITE_10:
537
        case SCSI_WRITE_10:
476
            if (ums_ejected)
538
            if (ums_ejected)
477
            {
539
            {
478
                send_command_failed_result();
-
 
479
                cur_sense_data.sense_key = SENSE_NOT_READY;
-
 
480
                cur_sense_data.asc = ASC_MEDIUM_NOT_PRESENT;
540
                send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
481
                cur_sense_data.ascq = 0;
-
 
482
                break;
541
                break;
483
            }
542
            }
484
            cur_cmd.sector = (cbw->command_block[2] << 24 | cbw->command_block[3] << 16
543
            cur_cmd.sector = (cbw->command_block[2] << 24 | cbw->command_block[3] << 16
485
                            | cbw->command_block[4] << 8 | cbw->command_block[5]);
544
                            | cbw->command_block[4] << 8 | cbw->command_block[5]);
486
            cur_cmd.count = (cbw->command_block[7] << 8 | cbw->command_block[8]);
545
            cur_cmd.count = (cbw->command_block[7] << 8 | cbw->command_block[8]);
487
            cur_cmd.orig_count = cur_cmd.count;
546
            cur_cmd.orig_count = cur_cmd.count;
488
 
547
 
489
            if ((cur_cmd.sector + cur_cmd.count) > storage_info.num_sectors)
548
            if ((cur_cmd.sector + cur_cmd.count) > storage_info.num_sectors)
490
            {
-
 
491
                send_csw(1);
-
 
492
                cur_sense_data.sense_key = SENSE_ILLEGAL_REQUEST;
549
                send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
493
                cur_sense_data.asc = ASC_LBA_OUT_OF_RANGE;
-
 
494
                cur_sense_data.ascq = 0;
-
 
495
            }
-
 
496
            else if (!cur_cmd.count) send_csw(0);
550
            else if (!cur_cmd.count) send_csw(0);
497
            else
551
            else
498
                receive_block_data(umsbuf[1][!writebuf_current],
552
                receive_block_data(umsbuf[1][!writebuf_current],
499
                                   MIN(UMS_BUFSIZE, cur_cmd.count * storage_info.sector_size));
553
                                   MIN(UMS_BUFSIZE, cur_cmd.count * storage_info.sector_size));
500
            break;
554
            break;
501
 
555
 
502
        case SCSI_WRITE_BUFFER:
556
        case SCSI_WRITE_BUFFER:
503
            break;
557
            break;
-
 
558
            
-
 
559
        case SCSI_ATA_PASSTHROUGH_12:
-
 
560
        case SCSI_ATA_PASSTHROUGH_16:
-
 
561
        {
-
 
562
            if (!storage_info.driverinfo || get_platform_id() != 0x4c435049)
-
 
563
            {
-
 
564
                send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_INVALID_COMMAND, 0);
-
 
565
                break;
-
 
566
            }
-
 
567
            int cmd = cbw->command_block[0];
-
 
568
            int multi = cbw->command_block[1] >> 5;
-
 
569
            int protocol = (cbw->command_block[1] >> 1) & 0xf;
-
 
570
            int extend = 0;
-
 
571
            int offline = cbw->command_block[2] >> 6;
-
 
572
            int check = (cbw->command_block[2] >> 5) & 1;
-
 
573
            int type = (cbw->command_block[2] >> 4) & 1;
-
 
574
            int dir = (cbw->command_block[2] >> 3) & 1;
-
 
575
            int block = (cbw->command_block[2] >> 2) & 1;
-
 
576
            int len = cbw->command_block[2] & 3;
-
 
577
            int features = cbw->command_block[3];
-
 
578
            int count = cbw->command_block[4];
-
 
579
            int lbal = cbw->command_block[5];
-
 
580
            int lbam = cbw->command_block[6];
-
 
581
            int lbah = cbw->command_block[7];
-
 
582
            int device = cbw->command_block[8] & ~0x10;
-
 
583
            int command = cbw->command_block[9];
-
 
584
            int control = cbw->command_block[11];
-
 
585
            if (cmd == SCSI_ATA_PASSTHROUGH_16)
-
 
586
            {
-
 
587
                extend = cbw->command_block[1] & 1;
-
 
588
                features = (extend ? (cbw->command_block[3] << 8) : 0) | cbw->command_block[4];
-
 
589
                count = (extend ? (cbw->command_block[5] << 8) : 0) | cbw->command_block[6];
-
 
590
                lbal = (extend ? (cbw->command_block[7] << 8) : 0) | cbw->command_block[8];
-
 
591
                lbam = (extend ? (cbw->command_block[9] << 8) : 0) | cbw->command_block[10];
-
 
592
                lbah = (extend ? (cbw->command_block[11] << 8) : 0) | cbw->command_block[12];
-
 
593
                device = cbw->command_block[13] & ~0x10;
-
 
594
                command = cbw->command_block[14];
-
 
595
                control = cbw->command_block[15];
-
 
596
            }
-
 
597
            sat_command.lba48 = extend;
-
 
598
            sat_check = check;
-
 
599
            int delay = (2 << offline) - 2;
-
 
600
            int bytes = 0;
-
 
601
            switch (len)
-
 
602
            {
-
 
603
                case 1: bytes = features; break;
-
 
604
                case 2: bytes = count; break;
-
 
605
                case 3: bytes = length; break;
-
 
606
            }
-
 
607
            int blocks = 1;
-
 
608
            if (block)
-
 
609
            {
-
 
610
                blocks = bytes;
-
 
611
                bytes = type ? storage_info.sector_size : 512;
-
 
612
            }
-
 
613
            int invalid = blocks * bytes > UMS_BUFSIZE;
-
 
614
            int dma = 0;
-
 
615
            switch (protocol)
-
 
616
            {
-
 
617
                case SAT_HARD_RESET:
-
 
618
                    sat_pending = SAT_PENDING_HRST;
-
 
619
                    enqueue_async();
-
 
620
                    return;
-
 
621
                case SAT_SOFT_RESET:
-
 
622
                    sat_pending = SAT_PENDING_SRST;
-
 
623
                    enqueue_async();
-
 
624
                    return;
-
 
625
                case SAT_NON_DATA:
-
 
626
                    if (len) invalid = 1;
-
 
627
                    break;
-
 
628
                case SAT_PIO_DATA_IN:
-
 
629
                    if (!len || !dir) invalid = 1;
-
 
630
                    break;
-
 
631
                case SAT_PIO_DATA_OUT:
-
 
632
                    if (!len || dir) invalid = 1;
-
 
633
                    break;
-
 
634
                case SAT_UDMA_DATA_IN:
-
 
635
                    if (!len || !dir) invalid = 1;
-
 
636
                    dma = 1;
-
 
637
                    break;
-
 
638
                case SAT_UDMA_DATA_OUT:
-
 
639
                    if (!len || dir) invalid = 1;
-
 
640
                    dma = 1;
-
 
641
                    break;
-
 
642
                case SAT_RETURN_RESPONSE:
-
 
643
                    sat_pending = SAT_PENDING_READ_CDB;
-
 
644
                    enqueue_async();
-
 
645
                    return;
-
 
646
                //case SAT_NON_DATA_RESET:
-
 
647
                //case SAT_DMA:
-
 
648
                //case SAT_DMA_QUEUED:
-
 
649
                //case SAT_FPDMA:
-
 
650
                //case SAT_DIAGNOSTIC:
-
 
651
                default:
-
 
652
                    invalid = 1;
-
 
653
                    break;
-
 
654
            }
-
 
655
            if (invalid)
-
 
656
            {
-
 
657
                send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_INVALID_FIELD_IN_CBD, 0);
-
 
658
                return;
-
 
659
            }
-
 
660
            readbuf_count[!readbuf_current] = 0;
-
 
661
            void* buffer = umsbuf[0][!readbuf_current];
-
 
662
            sat_command.transfer = !!len;
-
 
663
            sat_command.send = !dir;
-
 
664
            sat_command.dma = dma;
-
 
665
            sat_command.delay = delay * 1000000;
-
 
666
            sat_command.buffer = buffer;
-
 
667
            sat_command.size = blocks;
-
 
668
            sat_command.blksize = bytes;
-
 
669
            sat_command.feature = features;
-
 
670
            sat_command.count = count;
-
 
671
            sat_command.lba_low = lbal;
-
 
672
            sat_command.lba_mid = lbam;
-
 
673
            sat_command.lba_high = lbah;
-
 
674
            sat_command.device = device;
-
 
675
            sat_command.command = command;
-
 
676
            if (len && !dir) receive_sat_write(buffer, bytes * blocks);
-
 
677
            else
-
 
678
            {
-
 
679
                sat_pending = SAT_PENDING_CMD;
-
 
680
                enqueue_async();
-
 
681
            }
-
 
682
            break;
-
 
683
        }
504
 
684
        
505
        default:
685
        default:
506
            send_csw(1);
-
 
507
            cur_sense_data.sense_key = SENSE_ILLEGAL_REQUEST;
686
            send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_INVALID_COMMAND, 0);
508
            cur_sense_data.asc = ASC_INVALID_COMMAND;
-
 
509
            cur_sense_data.ascq = 0;
-
 
510
            break;
687
            break;
511
    }
688
    }
-
 
689
    have_sat_response_information = false;
512
}
690
}
513
 
691
 
514
 
692
 
515
void ums_init()
693
void ums_init()
516
{
694
{
Line 552... Line 730...
552
    int remaining = cur_cmd.count * storage_info.sector_size;
730
    int remaining = cur_cmd.count * storage_info.sector_size;
553
    if (!cur_cmd.count)
731
    if (!cur_cmd.count)
554
    {
732
    {
555
        if (IS_ERR(write_rc))
733
        if (IS_ERR(write_rc))
556
        {
734
        {
557
            send_csw(1);
-
 
558
            cur_sense_data.sense_key = SENSE_MEDIUM_ERROR;
735
            send_command_failed_result(SENSE_MEDIUM_ERROR, ASC_WRITE_ERROR, 0);
559
            cur_sense_data.asc = ASC_WRITE_ERROR;
-
 
560
            cur_sense_data.ascq = 0;
736
            return;
561
        }
737
        }
562
        send_csw(0);
738
        send_csw(0);
563
        write_rc = 0;
739
        write_rc = 0;
564
    }
740
    }
565
    else receive_block_data(umsbuf[1][!writebuf_current], MIN(UMS_BUFSIZE, remaining));
741
    else receive_block_data(umsbuf[1][!writebuf_current], MIN(UMS_BUFSIZE, remaining));
Line 567... Line 743...
567
 
743
 
568
 
744
 
569
void ums_xfer_complete(bool in, int bytesleft)
745
void ums_xfer_complete(bool in, int bytesleft)
570
{
746
{
571
    length -= bytesleft;
747
    length -= bytesleft;
-
 
748
    if (in)
572
    switch (state)
749
        switch (state)
573
    {
750
        {
574
        case RECEIVING_BLOCKS:
751
            case WAITING_FOR_CSW_COMPLETION:
575
            if (length != storage_info.sector_size * cur_cmd.count && length != UMS_BUFSIZE) break;
752
                state = WAITING_FOR_COMMAND;
576
            update_readcache();
753
                listen();
577
            if (!writebuf_busy) writebuf_push();
754
                break;
578
            else writebuf_overrun = true;
755
            case SENDING_RESULT:
579
            enqueue_async();
756
                send_csw(0);
580
            break;
757
                break;
581
        case WAITING_FOR_CSW_COMPLETION:
758
            case SENDING_BLOCKS:
-
 
759
                if (!cur_cmd.count) send_csw(0);
582
            state = WAITING_FOR_COMMAND;
760
                else send_and_read_next();
583
            listen();
761
                break;
584
            break;
762
            default:
-
 
763
                fail("diskmode: Got IN completion in invalid state!");
-
 
764
        }
-
 
765
    else
-
 
766
        switch (state)
-
 
767
        {
585
        case WAITING_FOR_COMMAND:
768
            case RECEIVING_BLOCKS:
586
            invalidate_dcache(&cmdbuf, sizeof(cmdbuf));  // Who pulls this into a cache line!?
769
                if (length != storage_info.sector_size * cur_cmd.count && length != UMS_BUFSIZE) break;
587
            handle_scsi(&cmdbuf.cbw);
770
                update_readcache();
588
            break;
771
                if (!writebuf_busy) writebuf_push();
589
        case SENDING_RESULT:
772
                else writebuf_overrun = true;
590
            send_csw(0);
773
                enqueue_async();
591
            break;
774
                break;
592
        case SENDING_FAILED_RESULT:
775
            case WAITING_FOR_COMMAND:
-
 
776
                state = PROCESSING;
-
 
777
                invalidate_dcache(&cmdbuf, sizeof(cmdbuf));  // Who pulls this into a cache line!?
593
            send_csw(1);
778
                handle_scsi(&cmdbuf.cbw);
594
            break;
779
                break;
595
        case SENDING_BLOCKS:
780
            case RECEIVING_SAT_WRITE:
-
 
781
                state = PROCESSING;
596
            if (!cur_cmd.count) send_csw(0);
782
                sat_pending = SAT_PENDING_CMD;
597
            else send_and_read_next();
783
                enqueue_async();
598
            break;
784
                break;
-
 
785
            default:
-
 
786
                fail("diskmode: Got OUT completion in invalid state!");
599
    }
787
        }
600
}
788
}
601
 
789
 
602
void ums_handle_async()
790
void ums_handle_async()
603
{
791
{
604
    if (writebuf_overrun)
792
    if (writebuf_overrun)
Line 623... Line 811...
623
    }
811
    }
624
    if (read_blocked)
812
    if (read_blocked)
625
    {
813
    {
626
        read_blocked = false;
814
        read_blocked = false;
627
        if (readbuf_count[readbuf_current] < 0)
815
        if (readbuf_count[readbuf_current] < 0)
-
 
816
            send_command_failed_result(SENSE_MEDIUM_ERROR, ASC_READ_ERROR, 0);
-
 
817
        else send_and_read_next();
-
 
818
    }
-
 
819
    
-
 
820
    struct ata_target_driverinfo* drv = storage_info.driverinfo;
-
 
821
    switch (sat_pending)
-
 
822
    {
-
 
823
        case SAT_PENDING_SRST:
628
        {
824
        {
-
 
825
            sat_pending = SAT_PENDING_NONE;
-
 
826
            if (IS_ERR(drv->soft_reset()))
-
 
827
                send_command_failed_result(SENSE_HARDWARE_ERROR, ASC_UNSUCCESSFUL_SOFT_RESET, 0);
629
            send_csw(1);
828
            else send_csw(0);
-
 
829
            break;
-
 
830
        }
-
 
831
        case SAT_PENDING_HRST:
-
 
832
        {
630
            cur_sense_data.sense_key = SENSE_MEDIUM_ERROR;
833
            sat_pending = SAT_PENDING_NONE;
-
 
834
            if (IS_ERR(drv->hard_reset()))
-
 
835
                send_command_failed_result(SENSE_HARDWARE_ERROR, ASC_UNSUCCESSFUL_SOFT_RESET, 0);
-
 
836
            else send_csw(0);
-
 
837
            break;
-
 
838
        }
-
 
839
        case SAT_PENDING_CMD:
-
 
840
        {
-
 
841
int cmd = sat_command.command;
-
 
842
            int datasize = sat_command.size * sat_command.blksize;
-
 
843
            void* buffer = sat_command.buffer;
-
 
844
            int rc = drv->raw_cmd(&sat_command);
-
 
845
            sat_response_information.descriptor_code = 9;
-
 
846
            sat_response_information.additional_length = 12;
-
 
847
            sat_response_information.extend = sat_command.lba48;
-
 
848
            sat_response_information.error = sat_command.feature;
-
 
849
            sat_response_information.sector_count_h = sat_command.count >> 8;
-
 
850
            sat_response_information.sector_count_l = sat_command.count & 0xff;
-
 
851
            sat_response_information.lba_low_h = sat_command.lba_low >> 8;
-
 
852
            sat_response_information.lba_low_l = sat_command.lba_low & 0xff;
-
 
853
            sat_response_information.lba_mid_h = sat_command.lba_mid >> 8;
-
 
854
            sat_response_information.lba_mid_l = sat_command.lba_mid & 0xff;
-
 
855
            sat_response_information.lba_high_h = sat_command.lba_high >> 8;
-
 
856
            sat_response_information.lba_high_l = sat_command.lba_high & 0xff;
-
 
857
            sat_response_information.device = sat_command.device;
-
 
858
            sat_response_information.status = sat_command.command;
-
 
859
            have_sat_response_information = true;
631
            cur_sense_data.asc = ASC_READ_ERROR;
860
            sat_pending = SAT_PENDING_NONE;
-
 
861
            if (IS_ERR(rc) || (sat_command.command & 0x21))
-
 
862
            {
-
 
863
                if (sat_command.command & 0x20)
-
 
864
                    send_command_failed_result(SENSE_HARDWARE_ERROR, ASC_INTERNAL_TARGET_FAILURE, 0);
-
 
865
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x01))
-
 
866
                    send_command_failed_result(SENSE_MEDIUM_ERROR, ASC_ADDRESS_MARK_NOT_FOUND, 0);
-
 
867
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x02))
-
 
868
                    send_command_failed_result(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
-
 
869
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x08))
-
 
870
                    send_command_failed_result(SENSE_UNIT_ATTENTION, ASC_OPERATOR_REQUEST, ASCQ_MEDIUM_REMOVAL_REQUEST);
-
 
871
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x10))
-
 
872
                    send_command_failed_result(SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
-
 
873
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x20))
-
 
874
                    send_command_failed_result(SENSE_UNIT_ATTENTION, ASC_MEDIUM_MAY_HAVE_CHANGED, 0);
-
 
875
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x40) && datasize && !sat_command.send)
-
 
876
                    send_command_failed_result(SENSE_MEDIUM_ERROR, ASC_READ_ERROR, 0);
-
 
877
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x40))
-
 
878
                    send_command_failed_result(SENSE_DATA_PROTECT, ASC_WRITE_PROTECTED, 0);
-
 
879
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x80))
-
 
880
                    send_command_failed_result(SENSE_ABORTED_COMMAND, ASC_SCSI_PARITY_ERROR, ASCQ_UICRC_ERROR_DETECTED);
-
 
881
                else if ((sat_command.command & 0x01) && (sat_command.feature & 0x04))
-
 
882
                    send_command_failed_result(SENSE_ABORTED_COMMAND, 0, 0);
-
 
883
                else send_command_failed_result(SENSE_HARDWARE_ERROR, ASC_INTERNAL_TARGET_FAILURE, 0);
-
 
884
            }
-
 
885
            else if (sat_check)
-
 
886
                send_command_failed_result(SENSE_SOFT_ERROR, ASC_RECOVERED_ERROR, ASCQ_SAT_INFO_AVAILABLE);
-
 
887
            else if (datasize) send_command_result(buffer, datasize);
632
            cur_sense_data.ascq = 0;
888
            else send_csw(0);
-
 
889
            break;
-
 
890
        }
-
 
891
        case SAT_PENDING_READ_CDB:
-
 
892
        {
-
 
893
            int rc = drv->read_taskfile(&sat_command);
-
 
894
            sat_response_information.descriptor_code = 9;
-
 
895
            sat_response_information.additional_length = 12;
-
 
896
            sat_response_information.extend = sat_command.lba48;
-
 
897
            sat_response_information.error = sat_command.feature;
-
 
898
            sat_response_information.sector_count_h = sat_command.count >> 8;
-
 
899
            sat_response_information.sector_count_l = sat_command.count & 0xff;
-
 
900
            sat_response_information.lba_low_h = sat_command.lba_low >> 8;
-
 
901
            sat_response_information.lba_low_l = sat_command.lba_low & 0xff;
-
 
902
            sat_response_information.lba_mid_h = sat_command.lba_mid >> 8;
-
 
903
            sat_response_information.lba_mid_l = sat_command.lba_mid & 0xff;
-
 
904
            sat_response_information.lba_high_h = sat_command.lba_high >> 8;
-
 
905
            sat_response_information.lba_high_l = sat_command.lba_high & 0xff;
-
 
906
            sat_response_information.device = sat_command.device;
-
 
907
            sat_response_information.status = sat_command.command;
-
 
908
            sat_pending = SAT_PENDING_NONE;
-
 
909
            if (IS_ERR(rc)) send_command_failed_result(SENSE_HARDWARE_ERROR, ASC_INTERNAL_TARGET_FAILURE, 0);
-
 
910
            else send_command_result(&sat_response_information, sizeof(sat_response_information));
-
 
911
            break;
633
        }
912
        }
634
        else send_and_read_next();
-
 
635
    }
913
    }
636
}
914
}
637
 
915