NTARGETS = 8,
        NAOEIFS = 8,
        NSKBPOOLMAX = 256,
-       NFACTIVE = 17,
+       NFACTIVE = 61,
 
        TIMERTICK = HZ / 10,
        MINTIMER = HZ >> 2,
        unsigned char addr[6];
        ushort nframes;
        struct aoedev *d;                       /* parent device I belong to */
-       struct list_head factive[NFACTIVE];     /* hash of active frames */
        struct list_head ffree;                 /* list of free frames */
        struct aoeif ifs[NAOEIFS];
        struct aoeif *ifp;      /* current aoeif in use */
        ushort nout;
        ushort maxout;
-       u16 lasttag;            /* last tag sent */
-       u16 useme;
        ulong falloc;
        ulong lastwadj;         /* last window adjustment */
        int minbcnt;
        u16 rttavg;             /* round trip average of requests/responses */
        u16 mintimer;
        u16 fw_ver;             /* version of blade's firmware */
+       u16 lasttag;            /* last tag sent */
+       u16 useme;
        ulong ref;
        struct work_struct work;/* disk create work struct */
        struct gendisk *gd;
                struct request *rq;
        } ip;
        ulong maxbcnt;
+       struct list_head factive[NFACTIVE];     /* hash of active frames */
        struct aoetgt *targets[NTARGETS];
        struct aoetgt **tgt;    /* target in use when working */
        struct aoetgt *htgt;    /* target needing rexmit assistance */
 
 }
 
 static struct frame *
-getframe(struct aoetgt *t, u32 tag)
+getframe(struct aoedev *d, u32 tag)
 {
        struct frame *f;
        struct list_head *head, *pos, *nx;
        u32 n;
 
        n = tag % NFACTIVE;
-       head = &t->factive[n];
+       head = &d->factive[n];
        list_for_each_safe(pos, nx, head) {
                f = list_entry(pos, struct frame, head);
                if (f->tag == tag) {
  * This driver reserves tag -1 to mean "unused frame."
  */
 static int
-newtag(struct aoetgt *t)
+newtag(struct aoedev *d)
 {
        register ulong n;
 
        n = jiffies & 0xffff;
-       return n |= (++t->lasttag & 0x7fff) << 16;
+       return n |= (++d->lasttag & 0x7fff) << 16;
 }
 
 static u32
 aoehdr_atainit(struct aoedev *d, struct aoetgt *t, struct aoe_hdr *h)
 {
-       u32 host_tag = newtag(t);
+       u32 host_tag = newtag(d);
 
        memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src);
        memcpy(h->dst, t->addr, sizeof h->dst);
 static void
 fhash(struct frame *f)
 {
-       struct aoetgt *t = f->t;
+       struct aoedev *d = f->t->d;
        u32 n;
 
        n = f->tag % NFACTIVE;
-       list_add_tail(&f->head, &t->factive[n]);
+       list_add_tail(&f->head, &d->factive[n]);
 }
 
 static int
        u32 n;
 
        t = f->t;
-       n = newtag(t);
+       n = newtag(d);
        skb = f->skb;
        if (ifrotate(t) == NULL) {
                /* probably can't happen, but set it up to fail anyway */
        int i;
 
        for (i = 0; i < NFACTIVE; i++) {
-               head = &ht->factive[i];
+               head = &d->factive[i];
                list_for_each_safe(pos, nx, head) {
                        f = list_entry(pos, struct frame, head);
+                       if (f->t != ht)
+                               continue;
+
                        nf = newframe(d);
                        if (!nf)
                                return 0;
        }
 
        /* collect all frames to rexmit into flist */
-       tt = d->targets;
-       te = tt + NTARGETS;
-       for (; tt < te && *tt; tt++) {
-               t = *tt;
-               for (i = 0; i < NFACTIVE; i++) {
-                       head = &t->factive[i];
-                       list_for_each_safe(pos, nx, head) {
-                               f = list_entry(pos, struct frame, head);
-                               if (tsince(f->tag) < timeout)
-                                       continue;
-                               /* move to flist for later processing */
-                               list_move_tail(pos, &flist);
-                       }
+       for (i = 0; i < NFACTIVE; i++) {
+               head = &d->factive[i];
+               list_for_each_safe(pos, nx, head) {
+                       f = list_entry(pos, struct frame, head);
+                       if (tsince(f->tag) < timeout)
+                               break;  /* end of expired frames */
+                       /* move to flist for later processing */
+                       list_move_tail(pos, &flist);
                }
-
-               /* window check */
+       }
+       /* window check */
+       tt = d->targets;
+       te = tt + d->ntargets;
+       for (; tt < te && (t = *tt); tt++) {
                if (t->nout == t->maxout
                && t->maxout < t->nframes
                && (jiffies - t->lastwadj)/HZ > 10) {
                         * Hang all frames on first hash bucket for downdev
                         * to clean up.
                         */
-                       list_splice(&flist, &f->t->factive[0]);
+                       list_splice(&flist, &d->factive[0]);
                        aoedev_downdev(d);
                        break;
                }
        spin_lock_irqsave(&d->lock, flags);
 
        n = be32_to_cpu(get_unaligned(&h->tag));
-       t = gettgt(d, h->src);
-       if (t == NULL) {
-               printk(KERN_INFO "aoe: can't find target e%ld.%d:%pm\n",
-                      d->aoemajor, d->aoeminor, h->src);
-               spin_unlock_irqrestore(&d->lock, flags);
-               aoedev_put(d);
-               return skb;
-       }
-       f = getframe(t, n);
+       f = getframe(d, n);
        if (f == NULL) {
                calc_rttavg(d, -tsince(n));
                spin_unlock_irqrestore(&d->lock, flags);
                aoechr_error(ebuf);
                return skb;
        }
+       t = f->t;
        calc_rttavg(d, tsince(f->tag));
        t->nout--;
        aoecmd_work(d);
 addtgt(struct aoedev *d, char *addr, ulong nframes)
 {
        struct aoetgt *t, **tt, **te;
-       int i;
 
        tt = d->targets;
        te = tt + NTARGETS;
        t->ifp = t->ifs;
        t->maxout = t->nframes;
        INIT_LIST_HEAD(&t->ffree);
-       for (i = 0; i < NFACTIVE; ++i)
-               INIT_LIST_HEAD(&t->factive[i]);
        return *tt = t;
 }
 
 
 
        d->flags &= ~DEVFL_UP;
 
-       /* clean out active buffers on all targets */
+       /* clean out active buffers */
+       for (i = 0; i < NFACTIVE; i++) {
+               head = &d->factive[i];
+               list_for_each_safe(pos, nx, head) {
+                       f = list_entry(pos, struct frame, head);
+                       list_del(pos);
+                       if (f->buf) {
+                               f->buf->nframesout--;
+                               aoe_failbuf(d, f->buf);
+                       }
+                       aoe_freetframe(f);
+               }
+       }
+       /* reset window dressings */
        tt = d->targets;
        te = tt + NTARGETS;
        for (; tt < te && (t = *tt); tt++) {
-               for (i = 0; i < NFACTIVE; i++) {
-                       head = &t->factive[i];
-                       list_for_each_safe(pos, nx, head) {
-                               list_del(pos);
-                               f = list_entry(pos, struct frame, head);
-                               if (f->buf) {
-                                       f->buf->nframesout--;
-                                       aoe_failbuf(d, f->buf);
-                               }
-                               aoe_freetframe(f);
-                       }
-               }
                t->maxout = t->nframes;
                t->nout = 0;
        }
 aoedev_by_sysminor_m(ulong sysminor)
 {
        struct aoedev *d;
+       int i;
        ulong flags;
 
        spin_lock_irqsave(&devlist_lock, flags);
        d->bufpool = NULL;      /* defer to aoeblk_gdalloc */
        d->tgt = d->targets;
        d->ref = 1;
+       for (i = 0; i < NFACTIVE; i++)
+               INIT_LIST_HEAD(&d->factive[i]);
        d->sysminor = sysminor;
        d->aoemajor = AOEMAJOR(sysminor);
        d->aoeminor = AOEMINOR(sysminor);