|
|
1.1 ! root 1: // Support for several common scsi like command data block requests ! 2: // ! 3: // Copyright (C) 2010 Kevin O'Connor <[email protected]> ! 4: // Copyright (C) 2002 MandrakeSoft S.A. ! 5: // ! 6: // This file may be distributed under the terms of the GNU LGPLv3 license. ! 7: ! 8: #include "biosvar.h" // GET_GLOBAL ! 9: #include "util.h" // htonl ! 10: #include "disk.h" // struct disk_op_s ! 11: #include "blockcmd.h" // struct cdb_request_sense ! 12: #include "ata.h" // atapi_cmd_data ! 13: #include "usb-msc.h" // usb_cmd_data ! 14: ! 15: // Route command to low-level handler. ! 16: static int ! 17: cdb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) ! 18: { ! 19: u8 type = GET_GLOBAL(op->drive_g->type); ! 20: switch (type) { ! 21: case DTYPE_ATAPI: ! 22: return atapi_cmd_data(op, cdbcmd, blocksize); ! 23: case DTYPE_USB: ! 24: return usb_cmd_data(op, cdbcmd, blocksize); ! 25: default: ! 26: op->count = 0; ! 27: return DISK_RET_EPARAM; ! 28: } ! 29: } ! 30: ! 31: int ! 32: cdb_get_inquiry(struct disk_op_s *op, struct cdbres_inquiry *data) ! 33: { ! 34: struct cdb_request_sense cmd; ! 35: memset(&cmd, 0, sizeof(cmd)); ! 36: cmd.command = CDB_CMD_INQUIRY; ! 37: cmd.length = sizeof(*data); ! 38: op->count = 1; ! 39: op->buf_fl = data; ! 40: return cdb_cmd_data(op, &cmd, sizeof(*data)); ! 41: } ! 42: ! 43: // Request SENSE ! 44: int ! 45: cdb_get_sense(struct disk_op_s *op, struct cdbres_request_sense *data) ! 46: { ! 47: struct cdb_request_sense cmd; ! 48: memset(&cmd, 0, sizeof(cmd)); ! 49: cmd.command = CDB_CMD_REQUEST_SENSE; ! 50: cmd.length = sizeof(*data); ! 51: op->count = 1; ! 52: op->buf_fl = data; ! 53: return cdb_cmd_data(op, &cmd, sizeof(*data)); ! 54: } ! 55: ! 56: // Request capacity ! 57: int ! 58: cdb_read_capacity(struct disk_op_s *op, struct cdbres_read_capacity *data) ! 59: { ! 60: struct cdb_read_capacity cmd; ! 61: memset(&cmd, 0, sizeof(cmd)); ! 62: cmd.command = CDB_CMD_READ_CAPACITY; ! 63: op->count = 1; ! 64: op->buf_fl = data; ! 65: return cdb_cmd_data(op, &cmd, sizeof(*data)); ! 66: } ! 67: ! 68: // Read sectors. ! 69: int ! 70: cdb_read(struct disk_op_s *op) ! 71: { ! 72: struct cdb_rwdata_10 cmd; ! 73: memset(&cmd, 0, sizeof(cmd)); ! 74: cmd.command = CDB_CMD_READ_10; ! 75: cmd.lba = htonl(op->lba); ! 76: cmd.count = htons(op->count); ! 77: return cdb_cmd_data(op, &cmd, GET_GLOBAL(op->drive_g->blksize)); ! 78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.