root/drivers/block/aoe/aoe.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* Copyright (c) 2013 Coraid, Inc.  See COPYING for GPL terms. */
   2 #include <linux/blk-mq.h>
   3 
   4 #define VERSION "85"
   5 #define AOE_MAJOR 152
   6 #define DEVICE_NAME "aoe"
   7 
   8 /* set AOE_PARTITIONS to 1 to use whole-disks only
   9  * default is 16, which is 15 partitions plus the whole disk
  10  */
  11 #ifndef AOE_PARTITIONS
  12 #define AOE_PARTITIONS (16)
  13 #endif
  14 
  15 #define WHITESPACE " \t\v\f\n,"
  16 
  17 enum {
  18         AOECMD_ATA,
  19         AOECMD_CFG,
  20         AOECMD_VEND_MIN = 0xf0,
  21 
  22         AOEFL_RSP = (1<<3),
  23         AOEFL_ERR = (1<<2),
  24 
  25         AOEAFL_EXT = (1<<6),
  26         AOEAFL_DEV = (1<<4),
  27         AOEAFL_ASYNC = (1<<1),
  28         AOEAFL_WRITE = (1<<0),
  29 
  30         AOECCMD_READ = 0,
  31         AOECCMD_TEST,
  32         AOECCMD_PTEST,
  33         AOECCMD_SET,
  34         AOECCMD_FSET,
  35 
  36         AOE_HVER = 0x10,
  37 };
  38 
  39 struct aoe_hdr {
  40         unsigned char dst[6];
  41         unsigned char src[6];
  42         __be16 type;
  43         unsigned char verfl;
  44         unsigned char err;
  45         __be16 major;
  46         unsigned char minor;
  47         unsigned char cmd;
  48         __be32 tag;
  49 };
  50 
  51 struct aoe_atahdr {
  52         unsigned char aflags;
  53         unsigned char errfeat;
  54         unsigned char scnt;
  55         unsigned char cmdstat;
  56         unsigned char lba0;
  57         unsigned char lba1;
  58         unsigned char lba2;
  59         unsigned char lba3;
  60         unsigned char lba4;
  61         unsigned char lba5;
  62         unsigned char res[2];
  63 };
  64 
  65 struct aoe_cfghdr {
  66         __be16 bufcnt;
  67         __be16 fwver;
  68         unsigned char scnt;
  69         unsigned char aoeccmd;
  70         unsigned char cslen[2];
  71 };
  72 
  73 enum {
  74         DEVFL_UP = 1,   /* device is installed in system and ready for AoE->ATA commands */
  75         DEVFL_TKILL = (1<<1),   /* flag for timer to know when to kill self */
  76         DEVFL_EXT = (1<<2),     /* device accepts lba48 commands */
  77         DEVFL_GDALLOC = (1<<3), /* need to alloc gendisk */
  78         DEVFL_GD_NOW = (1<<4),  /* allocating gendisk */
  79         DEVFL_KICKME = (1<<5),  /* slow polling network card catch */
  80         DEVFL_NEWSIZE = (1<<6), /* need to update dev size in block layer */
  81         DEVFL_FREEING = (1<<7), /* set when device is being cleaned up */
  82         DEVFL_FREED = (1<<8),   /* device has been cleaned up */
  83 };
  84 
  85 enum {
  86         DEFAULTBCNT = 2 * 512,  /* 2 sectors */
  87         MIN_BUFS = 16,
  88         NTARGETS = 4,
  89         NAOEIFS = 8,
  90         NSKBPOOLMAX = 256,
  91         NFACTIVE = 61,
  92 
  93         TIMERTICK = HZ / 10,
  94         RTTSCALE = 8,
  95         RTTDSCALE = 3,
  96         RTTAVG_INIT = USEC_PER_SEC / 4 << RTTSCALE,
  97         RTTDEV_INIT = RTTAVG_INIT / 4,
  98 
  99         HARD_SCORN_SECS = 10,   /* try another remote port after this */
 100         MAX_TAINT = 1000,       /* cap on aoetgt taint */
 101 };
 102 
 103 struct aoe_req {
 104         unsigned long nr_bios;
 105 };
 106 
 107 struct buf {
 108         ulong nframesout;
 109         struct bio *bio;
 110         struct bvec_iter iter;
 111         struct request *rq;
 112 };
 113 
 114 enum frame_flags {
 115         FFL_PROBE = 1,
 116 };
 117 
 118 struct frame {
 119         struct list_head head;
 120         u32 tag;
 121         ktime_t sent;                   /* high-res time packet was sent */
 122         ulong waited;
 123         ulong waited_total;
 124         struct aoetgt *t;               /* parent target I belong to */
 125         struct sk_buff *skb;            /* command skb freed on module exit */
 126         struct sk_buff *r_skb;          /* response skb for async processing */
 127         struct buf *buf;
 128         struct bvec_iter iter;
 129         char flags;
 130 };
 131 
 132 struct aoeif {
 133         struct net_device *nd;
 134         ulong lost;
 135         int bcnt;
 136 };
 137 
 138 struct aoetgt {
 139         unsigned char addr[6];
 140         ushort nframes;         /* cap on frames to use */
 141         struct aoedev *d;                       /* parent device I belong to */
 142         struct list_head ffree;                 /* list of free frames */
 143         struct aoeif ifs[NAOEIFS];
 144         struct aoeif *ifp;      /* current aoeif in use */
 145         ushort nout;            /* number of AoE commands outstanding */
 146         ushort maxout;          /* current value for max outstanding */
 147         ushort next_cwnd;       /* incr maxout after decrementing to zero */
 148         ushort ssthresh;        /* slow start threshold */
 149         ulong falloc;           /* number of allocated frames */
 150         int taint;              /* how much we want to avoid this aoetgt */
 151         int minbcnt;
 152         int wpkts, rpkts;
 153         char nout_probes;
 154 };
 155 
 156 struct aoedev {
 157         struct aoedev *next;
 158         ulong sysminor;
 159         ulong aoemajor;
 160         u32 rttavg;             /* scaled AoE round trip time average */
 161         u32 rttdev;             /* scaled round trip time mean deviation */
 162         u16 aoeminor;
 163         u16 flags;
 164         u16 nopen;              /* (bd_openers isn't available without sleeping) */
 165         u16 fw_ver;             /* version of blade's firmware */
 166         u16 lasttag;            /* last tag sent */
 167         u16 useme;
 168         ulong ref;
 169         struct work_struct work;/* disk create work struct */
 170         struct gendisk *gd;
 171         struct dentry *debugfs;
 172         struct request_queue *blkq;
 173         struct list_head rq_list;
 174         struct blk_mq_tag_set tag_set;
 175         struct hd_geometry geo;
 176         sector_t ssize;
 177         struct timer_list timer;
 178         spinlock_t lock;
 179         struct sk_buff_head skbpool;
 180         mempool_t *bufpool;     /* for deadlock-free Buf allocation */
 181         struct {                /* pointers to work in progress */
 182                 struct buf *buf;
 183                 struct bio *nxbio;
 184                 struct request *rq;
 185         } ip;
 186         ulong maxbcnt;
 187         struct list_head factive[NFACTIVE];     /* hash of active frames */
 188         struct list_head rexmitq; /* deferred retransmissions */
 189         struct aoetgt **targets;
 190         ulong ntargets;         /* number of allocated aoetgt pointers */
 191         struct aoetgt **tgt;    /* target in use when working */
 192         ulong kicked;
 193         char ident[512];
 194 };
 195 
 196 /* kthread tracking */
 197 struct ktstate {
 198         struct completion rendez;
 199         struct task_struct *task;
 200         wait_queue_head_t *waitq;
 201         int (*fn) (int);
 202         char name[12];
 203         spinlock_t *lock;
 204         int id;
 205         int active;
 206 };
 207 
 208 int aoeblk_init(void);
 209 void aoeblk_exit(void);
 210 void aoeblk_gdalloc(void *);
 211 void aoedisk_rm_debugfs(struct aoedev *d);
 212 
 213 int aoechr_init(void);
 214 void aoechr_exit(void);
 215 void aoechr_error(char *);
 216 
 217 void aoecmd_work(struct aoedev *d);
 218 void aoecmd_cfg(ushort aoemajor, unsigned char aoeminor);
 219 struct sk_buff *aoecmd_ata_rsp(struct sk_buff *);
 220 void aoecmd_cfg_rsp(struct sk_buff *);
 221 void aoecmd_sleepwork(struct work_struct *);
 222 void aoecmd_wreset(struct aoetgt *t);
 223 void aoecmd_cleanslate(struct aoedev *);
 224 void aoecmd_exit(void);
 225 int aoecmd_init(void);
 226 struct sk_buff *aoecmd_ata_id(struct aoedev *);
 227 void aoe_freetframe(struct frame *);
 228 void aoe_flush_iocq(void);
 229 void aoe_flush_iocq_by_index(int);
 230 void aoe_end_request(struct aoedev *, struct request *, int);
 231 int aoe_ktstart(struct ktstate *k);
 232 void aoe_ktstop(struct ktstate *k);
 233 
 234 int aoedev_init(void);
 235 void aoedev_exit(void);
 236 struct aoedev *aoedev_by_aoeaddr(ulong maj, int min, int do_alloc);
 237 void aoedev_downdev(struct aoedev *d);
 238 int aoedev_flush(const char __user *str, size_t size);
 239 void aoe_failbuf(struct aoedev *, struct buf *);
 240 void aoedev_put(struct aoedev *);
 241 
 242 int aoenet_init(void);
 243 void aoenet_exit(void);
 244 void aoenet_xmit(struct sk_buff_head *);
 245 int is_aoe_netif(struct net_device *ifp);
 246 int set_aoe_iflist(const char __user *str, size_t size);

/* [<][>][^][v][top][bottom][index][help] */