1 /* Copyright (c) 2007 Coraid, Inc. See COPYING for GPL terms. */ 2 #define VERSION "47q" 3 #define AOE_MAJOR 152 4 #define DEVICE_NAME "aoe" 5 6 /* set AOE_PARTITIONS to 1 to use whole-disks only 7 * default is 16, which is 15 partitions plus the whole disk 8 */ 9 #ifndef AOE_PARTITIONS 10 #define AOE_PARTITIONS (16) 11 #endif 12 13 #define SYSMINOR(aoemajor, aoeminor) ((aoemajor) * NPERSHELF + (aoeminor)) 14 #define AOEMAJOR(sysminor) ((sysminor) / NPERSHELF) 15 #define AOEMINOR(sysminor) ((sysminor) % NPERSHELF) 16 #define WHITESPACE " \t\v\f\n" 17 18 enum { 19 AOECMD_ATA, 20 AOECMD_CFG, 21 AOECMD_VEND_MIN = 0xf0, 22 23 AOEFL_RSP = (1<<3), 24 AOEFL_ERR = (1<<2), 25 26 AOEAFL_EXT = (1<<6), 27 AOEAFL_DEV = (1<<4), 28 AOEAFL_ASYNC = (1<<1), 29 AOEAFL_WRITE = (1<<0), 30 31 AOECCMD_READ = 0, 32 AOECCMD_TEST, 33 AOECCMD_PTEST, 34 AOECCMD_SET, 35 AOECCMD_FSET, 36 37 AOE_HVER = 0x10, 38 }; 39 40 struct aoe_hdr { 41 unsigned char dst[6]; 42 unsigned char src[6]; 43 __be16 type; 44 unsigned char verfl; 45 unsigned char err; 46 __be16 major; 47 unsigned char minor; 48 unsigned char cmd; 49 __be32 tag; 50 }; 51 52 struct aoe_atahdr { 53 unsigned char aflags; 54 unsigned char errfeat; 55 unsigned char scnt; 56 unsigned char cmdstat; 57 unsigned char lba0; 58 unsigned char lba1; 59 unsigned char lba2; 60 unsigned char lba3; 61 unsigned char lba4; 62 unsigned char lba5; 63 unsigned char res[2]; 64 }; 65 66 struct aoe_cfghdr { 67 __be16 bufcnt; 68 __be16 fwver; 69 unsigned char scnt; 70 unsigned char aoeccmd; 71 unsigned char cslen[2]; 72 }; 73 74 enum { 75 DEVFL_UP = 1, /* device is installed in system and ready for AoE->ATA commands */ 76 DEVFL_TKILL = (1<<1), /* flag for timer to know when to kill self */ 77 DEVFL_EXT = (1<<2), /* device accepts lba48 commands */ 78 DEVFL_CLOSEWAIT = (1<<3), /* device is waiting for all closes to revalidate */ 79 DEVFL_GDALLOC = (1<<4), /* need to alloc gendisk */ 80 DEVFL_KICKME = (1<<5), /* slow polling network card catch */ 81 DEVFL_NEWSIZE = (1<<6), /* need to update dev size in block layer */ 82 83 BUFFL_FAIL = 1, 84 }; 85 86 enum { 87 DEFAULTBCNT = 2 * 512, /* 2 sectors */ 88 NPERSHELF = 16, /* number of slots per shelf address */ 89 FREETAG = -1, 90 MIN_BUFS = 16, 91 NTARGETS = 8, 92 NAOEIFS = 8, 93 NSKBPOOLMAX = 128, 94 95 TIMERTICK = HZ / 10, 96 MINTIMER = HZ >> 2, 97 MAXTIMER = HZ << 1, 98 HELPWAIT = 20, 99 }; 100 101 struct buf { 102 struct list_head bufs; 103 ulong stime; /* for disk stats */ 104 ulong flags; 105 ulong nframesout; 106 ulong resid; 107 ulong bv_resid; 108 ulong bv_off; 109 sector_t sector; 110 struct bio *bio; 111 struct bio_vec *bv; 112 }; 113 114 struct frame { 115 int tag; 116 ulong waited; 117 struct buf *buf; 118 char *bufaddr; 119 ulong bcnt; 120 sector_t lba; 121 struct sk_buff *skb; 122 }; 123 124 struct aoeif { 125 struct net_device *nd; 126 unsigned char lost; 127 unsigned char lostjumbo; 128 ushort maxbcnt; 129 }; 130 131 struct aoetgt { 132 unsigned char addr[6]; 133 ushort nframes; 134 struct frame *frames; 135 struct aoeif ifs[NAOEIFS]; 136 struct aoeif *ifp; /* current aoeif in use */ 137 ushort nout; 138 ushort maxout; 139 u16 lasttag; /* last tag sent */ 140 u16 useme; 141 ulong lastwadj; /* last window adjustment */ 142 int wpkts, rpkts; 143 int dataref; 144 }; 145 146 struct aoedev { 147 struct aoedev *next; 148 ulong sysminor; 149 ulong aoemajor; 150 u16 aoeminor; 151 u16 flags; 152 u16 nopen; /* (bd_openers isn't available without sleeping) */ 153 u16 rttavg; /* round trip average of requests/responses */ 154 u16 mintimer; 155 u16 fw_ver; /* version of blade's firmware */ 156 struct work_struct work;/* disk create work struct */ 157 struct gendisk *gd; 158 struct request_queue *blkq; 159 struct hd_geometry geo; 160 sector_t ssize; 161 struct timer_list timer; 162 spinlock_t lock; 163 struct sk_buff_head sendq; 164 struct sk_buff_head skbpool; 165 mempool_t *bufpool; /* for deadlock-free Buf allocation */ 166 struct list_head bufq; /* queue of bios to work on */ 167 struct buf *inprocess; /* the one we're currently working on */ 168 struct aoetgt *targets[NTARGETS]; 169 struct aoetgt **tgt; /* target in use when working */ 170 struct aoetgt **htgt; /* target needing rexmit assistance */ 171 }; 172 173 174 int aoeblk_init(void); 175 void aoeblk_exit(void); 176 void aoeblk_gdalloc(void *); 177 void aoedisk_rm_sysfs(struct aoedev *d); 178 179 int aoechr_init(void); 180 void aoechr_exit(void); 181 void aoechr_error(char *); 182 183 void aoecmd_work(struct aoedev *d); 184 void aoecmd_cfg(ushort aoemajor, unsigned char aoeminor); 185 void aoecmd_ata_rsp(struct sk_buff *); 186 void aoecmd_cfg_rsp(struct sk_buff *); 187 void aoecmd_sleepwork(struct work_struct *); 188 void aoecmd_cleanslate(struct aoedev *); 189 struct sk_buff *aoecmd_ata_id(struct aoedev *); 190 191 int aoedev_init(void); 192 void aoedev_exit(void); 193 struct aoedev *aoedev_by_aoeaddr(int maj, int min); 194 struct aoedev *aoedev_by_sysminor_m(ulong sysminor); 195 void aoedev_downdev(struct aoedev *d); 196 int aoedev_flush(const char __user *str, size_t size); 197 198 int aoenet_init(void); 199 void aoenet_exit(void); 200 void aoenet_xmit(struct sk_buff_head *); 201 int is_aoe_netif(struct net_device *ifp); 202 int set_aoe_iflist(const char __user *str, size_t size); 203 204