aoe.h revision 262bf54144ebcb78cd0d057d2705dc5fb7bba7ac
12611464d7f36685fb1990275d3de1e72e6aff9d9Ed L. Cashin/* Copyright (c) 2006 Coraid, Inc. See COPYING for GPL terms. */ 28911ef4dc97f77797f297318010a7424300d2d50Ed L. Cashin#define VERSION "47" 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AOE_MAJOR 152 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVICE_NAME "aoe" 5fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin 6fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin/* set AOE_PARTITIONS to 1 to use whole-disks only 7fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin * default is 16, which is 15 partitions plus the whole disk 8fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin */ 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef AOE_PARTITIONS 10e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOE_PARTITIONS (16) 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 12fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin 13e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define SYSMINOR(aoemajor, aoeminor) ((aoemajor) * NPERSHELF + (aoeminor)) 14e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOEMAJOR(sysminor) ((sysminor) / NPERSHELF) 15e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOEMINOR(sysminor) ((sysminor) % NPERSHELF) 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WHITESPACE " \t\v\f\n" 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECMD_ATA, 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECMD_CFG, 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEFL_RSP = (1<<3), 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEFL_ERR = (1<<2), 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEAFL_EXT = (1<<6), 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEAFL_DEV = (1<<4), 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEAFL_ASYNC = (1<<1), 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOEAFL_WRITE = (1<<0), 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECCMD_READ = 0, 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECCMD_TEST, 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECCMD_PTEST, 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECCMD_SET, 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOECCMD_FSET, 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AOE_HVER = 0x10, 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_hdr { 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char dst[6]; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char src[6]; 4263e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin __be16 type; 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char verfl; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char err; 4563e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin __be16 major; 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char minor; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char cmd; 4863e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin __be32 tag; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_atahdr { 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char aflags; 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char errfeat; 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char scnt; 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char cmdstat; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba0; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba1; 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba2; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba3; 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba4; 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char lba5; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char res[2]; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_cfghdr { 6663e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin __be16 bufcnt; 6763e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin __be16 fwver; 6819bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin unsigned char scnt; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char aoeccmd; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char cslen[2]; 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DEVFL_UP = 1, /* device is installed in system and ready for AoE->ATA commands */ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DEVFL_TKILL = (1<<1), /* flag for timer to know when to kill self */ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DEVFL_EXT = (1<<2), /* device accepts lba48 commands */ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DEVFL_CLOSEWAIT = (1<<3), /* device is waiting for all closes to revalidate */ 783ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashin DEVFL_GDALLOC = (1<<4), /* need to alloc gendisk */ 7968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin DEVFL_KICKME = (1<<5), /* slow polling network card catch */ 803ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashin DEVFL_NEWSIZE = (1<<6), /* need to update dev size in block layer */ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUFFL_FAIL = 1, 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 8619bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin DEFAULTBCNT = 2 * 512, /* 2 sectors */ 87e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin NPERSHELF = 16, /* number of slots per shelf address */ 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FREETAG = -1, 8968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin MIN_BUFS = 16, 9068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin NTARGETS = 8, 9168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin NAOEIFS = 8, 9268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin 9368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin TIMERTICK = HZ / 10, 9468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin MINTIMER = HZ >> 2, 9568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin MAXTIMER = HZ << 1, 9668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin HELPWAIT = 20, 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct buf { 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head bufs; 10168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ulong stime; /* for disk stats */ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong flags; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong nframesout; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong resid; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong bv_resid; 10668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ulong bv_off; 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sector_t sector; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct bio *bio; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct bio_vec *bv; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct frame { 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int tag; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong waited; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct buf *buf; 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *bufaddr; 11719bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin ulong bcnt; 11819bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin sector_t lba; 119e407a7f6cd143b3ab4eb3d7e1cf882e96b710eb5Ed L. Cashin struct sk_buff *skb; 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoeif { 12368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct net_device *nd; 12468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin unsigned char lost; 12568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin unsigned char lostjumbo; 12668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ushort maxbcnt; 12768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin}; 12868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin 12968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoetgt { 13068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin unsigned char addr[6]; 13168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ushort nframes; 13268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct frame *frames; 13368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct aoeif ifs[NAOEIFS]; 13468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct aoeif *ifp; /* current aoeif in use */ 13568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ushort nout; 13668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ushort maxout; 13768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin u16 lasttag; /* last tag sent */ 13868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin u16 useme; 13968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin ulong lastwadj; /* last window adjustment */ 14068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin int wpkts, rpkts; 14168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin}; 14268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoedev { 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aoedev *next; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong sysminor; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ulong aoemajor; 14768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin u16 aoeminor; 14868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin u16 flags; 149dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin u16 nopen; /* (bd_openers isn't available without sleeping) */ 150dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin u16 rttavg; /* round trip average of requests/responses */ 151dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin u16 mintimer; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 fw_ver; /* version of blade's firmware */ 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct work_struct work;/* disk create work struct */ 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct gendisk *gd; 155165125e1e480f9510a5ffcfbfee4e3ee38c05f23Jens Axboe struct request_queue blkq; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct hd_geometry geo; 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sector_t ssize; 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct timer_list timer; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t lock; 160a4b38364093bf2094ff858ad45f490521bb87984Ed L. Cashin struct sk_buff *sendq_hd; /* packets needing to be sent, list head */ 161a4b38364093bf2094ff858ad45f490521bb87984Ed L. Cashin struct sk_buff *sendq_tl; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mempool_t *bufpool; /* for deadlock-free Buf allocation */ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head bufq; /* queue of bios to work on */ 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct buf *inprocess; /* the one we're currently working on */ 16568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct aoetgt *targets[NTARGETS]; 16668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct aoetgt **tgt; /* target in use when working */ 16768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin struct aoetgt **htgt; /* target needing rexmit assistance */ 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoeblk_init(void); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoeblk_exit(void); 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoeblk_gdalloc(void *); 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedisk_rm_sysfs(struct aoedev *d); 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoechr_init(void); 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoechr_exit(void); 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoechr_error(char *); 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_work(struct aoedev *d); 1813ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashinvoid aoecmd_cfg(ushort aoemajor, unsigned char aoeminor); 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_ata_rsp(struct sk_buff *); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_cfg_rsp(struct sk_buff *); 184c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howellsvoid aoecmd_sleepwork(struct work_struct *); 18568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinvoid aoecmd_cleanslate(struct aoedev *); 18668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct sk_buff *aoecmd_ata_id(struct aoedev *); 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoedev_init(void); 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedev_exit(void); 19032465c650670c7499548d70fdeed57fab44ee679Ed L. Cashinstruct aoedev *aoedev_by_aoeaddr(int maj, int min); 19168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoedev *aoedev_by_sysminor_m(ulong sysminor); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedev_downdev(struct aoedev *d); 1933ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashinint aoedev_isbusy(struct aoedev *d); 194262bf54144ebcb78cd0d057d2705dc5fb7bba7acEd L. Cashinint aoedev_flush(const char __user *str, size_t size); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoenet_init(void); 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoenet_exit(void); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoenet_xmit(struct sk_buff *); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint is_aoe_netif(struct net_device *ifp); 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint set_aoe_iflist(const char __user *str, size_t size); 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2021eb0da4cea28ae8f1bbe61822a2cc04e6d074e03Ed L. Cashinunsigned long long mac_addr(char addr[6]); 203