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