atapi.h
 1  /*
 2   *
 3   * Copyright (C) 2012 secunet Security Networks AG
 4   *
 5   * Redistribution and use in source and binary forms, with or without
 6   * modification, are permitted provided that the following conditions
 7   * are met:
 8   * 1. Redistributions of source code must retain the above copyright
 9   *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   * 3. The name of the author may not be used to endorse or promote products
14   *    derived from this software without specific prior written permission.
15   *
16   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26   * SUCH DAMAGE.
27   */
28  
29  #ifndef _STORAGE_ATAPI_H
30  #define _STORAGE_ATAPI_H
31  
32  #include <stdint.h>
33  
34  #include "storage.h"
35  #include "ata.h"
36  
37  /* ATAPI commands */
38  enum {
39  	ATAPI_TEST_UNIT_READY			= 0x00,
40  	ATAPI_REQUEST_SENSE			= 0x03,
41  	ATAPI_START_STOP_UNIT			= 0x1b,
42  	ATAPI_PREVENT_ALLOW_MEDIUM_REMOVAL	= 0x1e,
43  	ATAPI_READ_CAPACITY			= 0x25,
44  	ATAPI_READ_10				= 0x28,
45  };
46  
47  /* ATAPI sense codes */
48  enum {
49  	ATAPI_SENSE_NOT_READY		= 0x02,
50  	ATAPI_SENSE_UNIT_ATTENTION	= 0x06,
51  };
52  
53  /* ATAPI additional sense codes (particularize the above) */
54  enum {
55  	ATAPI_ADDITIONAL_SENSE_LOGICAL_UNIT_NOT_READY	= 0x04,
56  	ATAPI_ADDITIONAL_SENSE_MEDIUM_NOT_PRESENT	= 0x3a,
57  };
58  
59  struct atapi_dev;
60  
61  typedef struct atapi_dev {
62  	/* Keep this at offset 0 so we can cast to ata_dev_t. */
63  	ata_dev_t ata_dev;
64  
65  	int (*identify)(struct ata_dev *, u8 *buf); /* yes, ata_dev_t */
66  	ssize_t (*packet_read_cmd)(struct atapi_dev *, const u8 *cmd, size_t cmdlen, u8 *buf, size_t buflen);
67  
68  	u8 sense_data[19]; /* We needed 19 in usbmsc.c. */
69  	u8 medium_present;
70  
71  	void (*detach_device)(struct atapi_dev *);
72  } atapi_dev_t;
73  
74  int atapi_attach_device(atapi_dev_t *, storage_port_t);
75  
76  #endif