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