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