07aec037da103c95dfa375ba9286c65cf1796654
[people/xl0/gpxe.git] / src / include / gpxe / aoe.h
1 #ifndef _GPXE_AOE_H
2 #define _GPXE_AOE_H
3
4 /** @file
5  *
6  * AoE protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/list.h>
12 #include <gpxe/if_ether.h>
13 #include <gpxe/retry.h>
14 #include <gpxe/async.h>
15 #include <gpxe/ata.h>
16
17 /** An AoE ATA command */
18 struct aoecmd {
19         /** AoE command flags */
20         uint8_t aflags;
21         /** ATA error/feature register */
22         uint8_t err_feat;
23         /** ATA sector count register */
24         uint8_t count;
25         /** ATA command/status register */
26         uint8_t cmd_stat;
27         /** Logical block address, in little-endian order */
28         union {
29                 uint64_t u64;
30                 uint8_t bytes[6];
31         } lba;
32         /** Data payload */
33         uint8_t data[0];
34 } __attribute__ (( packed ));
35
36 #define AOE_FL_EXTENDED 0x40    /**< LBA48 extended addressing */
37 #define AOE_FL_DEV_HEAD 0x10    /**< Device/head flag */
38 #define AOE_FL_ASYNC    0x02    /**< Asynchronous write */
39 #define AOE_FL_WRITE    0x01    /**< Write command */
40
41 /** An AoE header */
42 struct aoehdr {
43         /** Protocol version number and flags */
44         uint8_t ver_flags;
45         /** Error code */
46         uint8_t error;
47         /** Major device number, in network byte order */
48         uint16_t major;
49         /** Minor device number */
50         uint8_t minor;
51         /** Command number */
52         uint8_t command;
53         /** Tag, in network byte order */
54         uint32_t tag;
55         /** Payload */
56         union {
57                 /** ATA command */
58                 struct aoecmd command[0];
59         } arg;
60 } __attribute__ (( packed ));
61
62 #define AOE_VERSION     0x10    /**< Version 1 */
63 #define AOE_VERSION_MASK 0xf0   /**< Version part of ver_flags field */
64
65 #define AOE_FL_RESPONSE 0x08    /**< Message is a response */
66 #define AOE_FL_ERROR    0x04    /**< Command generated an error */
67
68 #define AOE_MAJOR_BROADCAST 0xffff
69 #define AOE_MINOR_BROADCAST 0xff
70
71 #define AOE_CMD_ATA     0x00    /**< Issue ATA command */
72 #define AOE_CMD_CONFIG  0x01    /**< Query Config Information */
73
74 #define AOE_ERR_BAD_COMMAND     1 /**< Unrecognised command code */
75 #define AOE_ERR_BAD_PARAMETER   2 /**< Bad argument parameter */
76 #define AOE_ERR_UNAVAILABLE     3 /**< Device unavailable */
77 #define AOE_ERR_CONFIG_EXISTS   4 /**< Config string present */
78 #define AOE_ERR_BAD_VERSION     5 /**< Unsupported version */
79
80 /** An AoE session */
81 struct aoe_session {
82         /** List of all AoE sessions */
83         struct list_head list;
84
85         /** Network device */
86         struct net_device *netdev;
87         /** Major number */
88         uint16_t major;
89         /** Minor number */
90         uint8_t minor;
91         /** Target MAC address */
92         uint8_t target[ETH_ALEN];
93
94         /** Tag for current AoE command */
95         uint32_t tag;
96
97         /** Current ATA command */
98         struct ata_command *command;
99         /** Overall status of current ATA command */
100         unsigned int status;
101         /** Byte offset within command's data buffer */
102         unsigned int command_offset;
103         /** Asynchronous operation for this command */
104         struct async_operation aop;
105
106         /** Retransmission timer */
107         struct retry_timer timer;
108 };
109
110 #define AOE_STATUS_ERR_MASK     0x0f /**< Error portion of status code */ 
111 #define AOE_STATUS_PENDING      0x80 /**< Command pending */
112
113 /** Maximum number of sectors per packet */
114 #define AOE_MAX_COUNT 2
115
116 extern void aoe_open ( struct aoe_session *aoe );
117 extern void aoe_close ( struct aoe_session *aoe );
118 extern struct async_operation * aoe_issue ( struct aoe_session *aoe,
119                                             struct ata_command *command );
120
121 /** An AoE device */
122 struct aoe_device {
123         /** ATA device interface */
124         struct ata_device ata;
125         /** AoE protocol instance */
126         struct aoe_session aoe;
127 };
128
129 extern int init_aoedev ( struct aoe_device *aoedev );
130
131 #endif /* _GPXE_AOE_H */