Quick hack to get AoE back in to the tree, on a par with the current
[people/andreif/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_TAG_MAGIC   0xebeb0000
75
76 #define AOE_ERR_BAD_COMMAND     1 /**< Unrecognised command code */
77 #define AOE_ERR_BAD_PARAMETER   2 /**< Bad argument parameter */
78 #define AOE_ERR_UNAVAILABLE     3 /**< Device unavailable */
79 #define AOE_ERR_CONFIG_EXISTS   4 /**< Config string present */
80 #define AOE_ERR_BAD_VERSION     5 /**< Unsupported version */
81
82 /** An AoE session */
83 struct aoe_session {
84         /** Reference counter */
85         struct refcnt refcnt;
86
87         /** List of all AoE sessions */
88         struct list_head list;
89
90         /** Network device */
91         struct net_device *netdev;
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         /** Return status code for command */
110         int rc;
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_detach ( struct ata_device *ata );
123 extern int aoe_attach ( struct ata_device *ata, struct net_device *netdev,
124                         const char *root_path );
125
126 #endif /* _GPXE_AOE_H */