]> err.no Git - linux-2.6/blob - drivers/block/aoe/aoecmd.c
aoe: add module parameter for users who need more outstanding I/O
[linux-2.6] / drivers / block / aoe / aoecmd.c
1 /* Copyright (c) 2006 Coraid, Inc.  See COPYING for GPL terms. */
2 /*
3  * aoecmd.c
4  * Filesystem request handling methods
5  */
6
7 #include <linux/hdreg.h>
8 #include <linux/blkdev.h>
9 #include <linux/skbuff.h>
10 #include <linux/netdevice.h>
11 #include <linux/genhd.h>
12 #include <linux/moduleparam.h>
13 #include <net/net_namespace.h>
14 #include <asm/unaligned.h>
15 #include "aoe.h"
16
17 static int aoe_deadsecs = 60 * 3;
18 module_param(aoe_deadsecs, int, 0644);
19 MODULE_PARM_DESC(aoe_deadsecs, "After aoe_deadsecs seconds, give up and fail dev.");
20
21 static int aoe_maxout = 16;
22 module_param(aoe_maxout, int, 0644);
23 MODULE_PARM_DESC(aoe_maxout,
24         "Only aoe_maxout outstanding packets for every MAC on eX.Y.");
25
26 static struct sk_buff *
27 new_skb(ulong len)
28 {
29         struct sk_buff *skb;
30
31         skb = alloc_skb(len, GFP_ATOMIC);
32         if (skb) {
33                 skb_reset_mac_header(skb);
34                 skb_reset_network_header(skb);
35                 skb->protocol = __constant_htons(ETH_P_AOE);
36                 skb->priority = 0;
37                 skb->next = skb->prev = NULL;
38
39                 /* tell the network layer not to perform IP checksums
40                  * or to get the NIC to do it
41                  */
42                 skb->ip_summed = CHECKSUM_NONE;
43         }
44         return skb;
45 }
46
47 static struct frame *
48 getframe(struct aoetgt *t, int tag)
49 {
50         struct frame *f, *e;
51
52         f = t->frames;
53         e = f + t->nframes;
54         for (; f<e; f++)
55                 if (f->tag == tag)
56                         return f;
57         return NULL;
58 }
59
60 /*
61  * Leave the top bit clear so we have tagspace for userland.
62  * The bottom 16 bits are the xmit tick for rexmit/rttavg processing.
63  * This driver reserves tag -1 to mean "unused frame."
64  */
65 static int
66 newtag(struct aoetgt *t)
67 {
68         register ulong n;
69
70         n = jiffies & 0xffff;
71         return n |= (++t->lasttag & 0x7fff) << 16;
72 }
73
74 static int
75 aoehdr_atainit(struct aoedev *d, struct aoetgt *t, struct aoe_hdr *h)
76 {
77         u32 host_tag = newtag(t);
78
79         memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src);
80         memcpy(h->dst, t->addr, sizeof h->dst);
81         h->type = __constant_cpu_to_be16(ETH_P_AOE);
82         h->verfl = AOE_HVER;
83         h->major = cpu_to_be16(d->aoemajor);
84         h->minor = d->aoeminor;
85         h->cmd = AOECMD_ATA;
86         h->tag = cpu_to_be32(host_tag);
87
88         return host_tag;
89 }
90
91 static inline void
92 put_lba(struct aoe_atahdr *ah, sector_t lba)
93 {
94         ah->lba0 = lba;
95         ah->lba1 = lba >>= 8;
96         ah->lba2 = lba >>= 8;
97         ah->lba3 = lba >>= 8;
98         ah->lba4 = lba >>= 8;
99         ah->lba5 = lba >>= 8;
100 }
101
102 static void
103 ifrotate(struct aoetgt *t)
104 {
105         t->ifp++;
106         if (t->ifp >= &t->ifs[NAOEIFS] || t->ifp->nd == NULL)
107                 t->ifp = t->ifs;
108         if (t->ifp->nd == NULL) {
109                 printk(KERN_INFO "aoe: no interface to rotate to\n");
110                 BUG();
111         }
112 }
113
114 static void
115 skb_pool_put(struct aoedev *d, struct sk_buff *skb)
116 {
117         if (!d->skbpool_hd)
118                 d->skbpool_hd = skb;
119         else
120                 d->skbpool_tl->next = skb;
121         d->skbpool_tl = skb;
122 }
123
124 static struct sk_buff *
125 skb_pool_get(struct aoedev *d)
126 {
127         struct sk_buff *skb;
128
129         skb = d->skbpool_hd;
130         if (skb && atomic_read(&skb_shinfo(skb)->dataref) == 1) {
131                 d->skbpool_hd = skb->next;
132                 skb->next = NULL;
133                 return skb;
134         }
135         if (d->nskbpool < NSKBPOOLMAX
136         && (skb = new_skb(ETH_ZLEN))) {
137                 d->nskbpool++;
138                 return skb;
139         }
140         return NULL;
141 }
142
143 /* freeframe is where we do our load balancing so it's a little hairy. */
144 static struct frame *
145 freeframe(struct aoedev *d)
146 {
147         struct frame *f, *e, *rf;
148         struct aoetgt **t;
149         struct sk_buff *skb;
150
151         if (d->targets[0] == NULL) {    /* shouldn't happen, but I'm paranoid */
152                 printk(KERN_ERR "aoe: NULL TARGETS!\n");
153                 return NULL;
154         }
155         t = d->tgt;
156         t++;
157         if (t >= &d->targets[NTARGETS] || !*t)
158                 t = d->targets;
159         for (;;) {
160                 if ((*t)->nout < (*t)->maxout
161                 && t != d->htgt
162                 && (*t)->ifp->nd) {
163                         rf = NULL;
164                         f = (*t)->frames;
165                         e = f + (*t)->nframes;
166                         for (; f < e; f++) {
167                                 if (f->tag != FREETAG)
168                                         continue;
169                                 skb = f->skb;
170                                 if (!skb
171                                 && !(f->skb = skb = new_skb(ETH_ZLEN)))
172                                         continue;
173                                 if (atomic_read(&skb_shinfo(skb)->dataref)
174                                         != 1) {
175                                         if (!rf)
176                                                 rf = f;
177                                         continue;
178                                 }
179 gotone:                         skb_shinfo(skb)->nr_frags = skb->data_len = 0;
180                                 skb_trim(skb, 0);
181                                 d->tgt = t;
182                                 ifrotate(*t);
183                                 return f;
184                         }
185                         /* Work can be done, but the network layer is
186                            holding our precious packets.  Try to grab
187                            one from the pool. */
188                         f = rf;
189                         if (f == NULL) {        /* more paranoia */
190                                 printk(KERN_ERR
191                                         "aoe: freeframe: %s.\n",
192                                         "unexpected null rf");
193                                 d->flags |= DEVFL_KICKME;
194                                 return NULL;
195                         }
196                         skb = skb_pool_get(d);
197                         if (skb) {
198                                 skb_pool_put(d, f->skb);
199                                 f->skb = skb;
200                                 goto gotone;
201                         }
202                         (*t)->dataref++;
203                         if ((*t)->nout == 0)
204                                 d->flags |= DEVFL_KICKME;
205                 }
206                 if (t == d->tgt)        /* we've looped and found nada */
207                         break;
208                 t++;
209                 if (t >= &d->targets[NTARGETS] || !*t)
210                         t = d->targets;
211         }
212         return NULL;
213 }
214
215 static int
216 aoecmd_ata_rw(struct aoedev *d)
217 {
218         struct frame *f;
219         struct aoe_hdr *h;
220         struct aoe_atahdr *ah;
221         struct buf *buf;
222         struct bio_vec *bv;
223         struct aoetgt *t;
224         struct sk_buff *skb;
225         ulong bcnt;
226         char writebit, extbit;
227
228         writebit = 0x10;
229         extbit = 0x4;
230
231         f = freeframe(d);
232         if (f == NULL)
233                 return 0;
234         t = *d->tgt;
235         buf = d->inprocess;
236         bv = buf->bv;
237         bcnt = t->ifp->maxbcnt;
238         if (bcnt == 0)
239                 bcnt = DEFAULTBCNT;
240         if (bcnt > buf->bv_resid)
241                 bcnt = buf->bv_resid;
242         /* initialize the headers & frame */
243         skb = f->skb;
244         h = (struct aoe_hdr *) skb_mac_header(skb);
245         ah = (struct aoe_atahdr *) (h+1);
246         skb_put(skb, sizeof *h + sizeof *ah);
247         memset(h, 0, skb->len);
248         f->tag = aoehdr_atainit(d, t, h);
249         t->nout++;
250         f->waited = 0;
251         f->buf = buf;
252         f->bufaddr = page_address(bv->bv_page) + buf->bv_off;
253         f->bcnt = bcnt;
254         f->lba = buf->sector;
255
256         /* set up ata header */
257         ah->scnt = bcnt >> 9;
258         put_lba(ah, buf->sector);
259         if (d->flags & DEVFL_EXT) {
260                 ah->aflags |= AOEAFL_EXT;
261         } else {
262                 extbit = 0;
263                 ah->lba3 &= 0x0f;
264                 ah->lba3 |= 0xe0;       /* LBA bit + obsolete 0xa0 */
265         }
266         if (bio_data_dir(buf->bio) == WRITE) {
267                 skb_fill_page_desc(skb, 0, bv->bv_page, buf->bv_off, bcnt);
268                 ah->aflags |= AOEAFL_WRITE;
269                 skb->len += bcnt;
270                 skb->data_len = bcnt;
271                 t->wpkts++;
272         } else {
273                 t->rpkts++;
274                 writebit = 0;
275         }
276
277         ah->cmdstat = WIN_READ | writebit | extbit;
278
279         /* mark all tracking fields and load out */
280         buf->nframesout += 1;
281         buf->bv_off += bcnt;
282         buf->bv_resid -= bcnt;
283         buf->resid -= bcnt;
284         buf->sector += bcnt >> 9;
285         if (buf->resid == 0) {
286                 d->inprocess = NULL;
287         } else if (buf->bv_resid == 0) {
288                 buf->bv = ++bv;
289                 buf->bv_resid = bv->bv_len;
290                 WARN_ON(buf->bv_resid == 0);
291                 buf->bv_off = bv->bv_offset;
292         }
293
294         skb->dev = t->ifp->nd;
295         skb = skb_clone(skb, GFP_ATOMIC);
296         if (skb) {
297                 if (d->sendq_hd)
298                         d->sendq_tl->next = skb;
299                 else
300                         d->sendq_hd = skb;
301                 d->sendq_tl = skb;
302         }
303         return 1;
304 }
305
306 /* some callers cannot sleep, and they can call this function,
307  * transmitting the packets later, when interrupts are on
308  */
309 static struct sk_buff *
310 aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
311 {
312         struct aoe_hdr *h;
313         struct aoe_cfghdr *ch;
314         struct sk_buff *skb, *sl, *sl_tail;
315         struct net_device *ifp;
316
317         sl = sl_tail = NULL;
318
319         read_lock(&dev_base_lock);
320         for_each_netdev(&init_net, ifp) {
321                 dev_hold(ifp);
322                 if (!is_aoe_netif(ifp))
323                         goto cont;
324
325                 skb = new_skb(sizeof *h + sizeof *ch);
326                 if (skb == NULL) {
327                         printk(KERN_INFO "aoe: skb alloc failure\n");
328                         goto cont;
329                 }
330                 skb_put(skb, sizeof *h + sizeof *ch);
331                 skb->dev = ifp;
332                 if (sl_tail == NULL)
333                         sl_tail = skb;
334                 h = (struct aoe_hdr *) skb_mac_header(skb);
335                 memset(h, 0, sizeof *h + sizeof *ch);
336
337                 memset(h->dst, 0xff, sizeof h->dst);
338                 memcpy(h->src, ifp->dev_addr, sizeof h->src);
339                 h->type = __constant_cpu_to_be16(ETH_P_AOE);
340                 h->verfl = AOE_HVER;
341                 h->major = cpu_to_be16(aoemajor);
342                 h->minor = aoeminor;
343                 h->cmd = AOECMD_CFG;
344
345                 skb->next = sl;
346                 sl = skb;
347 cont:
348                 dev_put(ifp);
349         }
350         read_unlock(&dev_base_lock);
351
352         if (tail != NULL)
353                 *tail = sl_tail;
354         return sl;
355 }
356
357 static void
358 resend(struct aoedev *d, struct aoetgt *t, struct frame *f)
359 {
360         struct sk_buff *skb;
361         struct aoe_hdr *h;
362         struct aoe_atahdr *ah;
363         char buf[128];
364         u32 n;
365
366         ifrotate(t);
367         n = newtag(t);
368         skb = f->skb;
369         h = (struct aoe_hdr *) skb_mac_header(skb);
370         ah = (struct aoe_atahdr *) (h+1);
371
372         snprintf(buf, sizeof buf,
373                 "%15s e%ld.%d oldtag=%08x@%08lx newtag=%08x "
374                 "s=%012llx d=%012llx nout=%d\n",
375                 "retransmit", d->aoemajor, d->aoeminor, f->tag, jiffies, n,
376                 mac_addr(h->src),
377                 mac_addr(h->dst), t->nout);
378         aoechr_error(buf);
379
380         f->tag = n;
381         h->tag = cpu_to_be32(n);
382         memcpy(h->dst, t->addr, sizeof h->dst);
383         memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src);
384
385         switch (ah->cmdstat) {
386         default:
387                 break;
388         case WIN_READ:
389         case WIN_READ_EXT:
390         case WIN_WRITE:
391         case WIN_WRITE_EXT:
392                 put_lba(ah, f->lba);
393
394                 n = f->bcnt;
395                 if (n > DEFAULTBCNT)
396                         n = DEFAULTBCNT;
397                 ah->scnt = n >> 9;
398                 if (ah->aflags & AOEAFL_WRITE) {
399                         skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr),
400                                 offset_in_page(f->bufaddr), n);
401                         skb->len = sizeof *h + sizeof *ah + n;
402                         skb->data_len = n;
403                 }
404         }
405         skb->dev = t->ifp->nd;
406         skb = skb_clone(skb, GFP_ATOMIC);
407         if (skb == NULL)
408                 return;
409         if (d->sendq_hd)
410                 d->sendq_tl->next = skb;
411         else
412                 d->sendq_hd = skb;
413         d->sendq_tl = skb;
414 }
415
416 static int
417 tsince(int tag)
418 {
419         int n;
420
421         n = jiffies & 0xffff;
422         n -= tag & 0xffff;
423         if (n < 0)
424                 n += 1<<16;
425         return n;
426 }
427
428 static struct aoeif *
429 getif(struct aoetgt *t, struct net_device *nd)
430 {
431         struct aoeif *p, *e;
432
433         p = t->ifs;
434         e = p + NAOEIFS;
435         for (; p < e; p++)
436                 if (p->nd == nd)
437                         return p;
438         return NULL;
439 }
440
441 static struct aoeif *
442 addif(struct aoetgt *t, struct net_device *nd)
443 {
444         struct aoeif *p;
445
446         p = getif(t, NULL);
447         if (!p)
448                 return NULL;
449         p->nd = nd;
450         p->maxbcnt = DEFAULTBCNT;
451         p->lost = 0;
452         p->lostjumbo = 0;
453         return p;
454 }
455
456 static void
457 ejectif(struct aoetgt *t, struct aoeif *ifp)
458 {
459         struct aoeif *e;
460         ulong n;
461
462         e = t->ifs + NAOEIFS - 1;
463         n = (e - ifp) * sizeof *ifp;
464         memmove(ifp, ifp+1, n);
465         e->nd = NULL;
466 }
467
468 static int
469 sthtith(struct aoedev *d)
470 {
471         struct frame *f, *e, *nf;
472         struct sk_buff *skb;
473         struct aoetgt *ht = *d->htgt;
474
475         f = ht->frames;
476         e = f + ht->nframes;
477         for (; f < e; f++) {
478                 if (f->tag == FREETAG)
479                         continue;
480                 nf = freeframe(d);
481                 if (!nf)
482                         return 0;
483                 skb = nf->skb;
484                 *nf = *f;
485                 f->skb = skb;
486                 f->tag = FREETAG;
487                 nf->waited = 0;
488                 ht->nout--;
489                 (*d->tgt)->nout++;
490                 resend(d, *d->tgt, nf);
491         }
492         /* he's clean, he's useless.  take away his interfaces */
493         memset(ht->ifs, 0, sizeof ht->ifs);
494         d->htgt = NULL;
495         return 1;
496 }
497
498 static inline unsigned char
499 ata_scnt(unsigned char *packet) {
500         struct aoe_hdr *h;
501         struct aoe_atahdr *ah;
502
503         h = (struct aoe_hdr *) packet;
504         ah = (struct aoe_atahdr *) (h+1);
505         return ah->scnt;
506 }
507
508 static void
509 rexmit_timer(ulong vp)
510 {
511         struct aoedev *d;
512         struct aoetgt *t, **tt, **te;
513         struct aoeif *ifp;
514         struct frame *f, *e;
515         struct sk_buff *sl;
516         register long timeout;
517         ulong flags, n;
518
519         d = (struct aoedev *) vp;
520         sl = NULL;
521
522         /* timeout is always ~150% of the moving average */
523         timeout = d->rttavg;
524         timeout += timeout >> 1;
525
526         spin_lock_irqsave(&d->lock, flags);
527
528         if (d->flags & DEVFL_TKILL) {
529                 spin_unlock_irqrestore(&d->lock, flags);
530                 return;
531         }
532         tt = d->targets;
533         te = tt + NTARGETS;
534         for (; tt < te && *tt; tt++) {
535                 t = *tt;
536                 f = t->frames;
537                 e = f + t->nframes;
538                 for (; f < e; f++) {
539                         if (f->tag == FREETAG
540                         || tsince(f->tag) < timeout)
541                                 continue;
542                         n = f->waited += timeout;
543                         n /= HZ;
544                         if (n > aoe_deadsecs) {
545                                 /* waited too long.  device failure. */
546                                 aoedev_downdev(d);
547                                 break;
548                         }
549
550                         if (n > HELPWAIT /* see if another target can help */
551                         && (tt != d->targets || d->targets[1]))
552                                 d->htgt = tt;
553
554                         if (t->nout == t->maxout) {
555                                 if (t->maxout > 1)
556                                         t->maxout--;
557                                 t->lastwadj = jiffies;
558                         }
559
560                         ifp = getif(t, f->skb->dev);
561                         if (ifp && ++ifp->lost > (t->nframes << 1)
562                         && (ifp != t->ifs || t->ifs[1].nd)) {
563                                 ejectif(t, ifp);
564                                 ifp = NULL;
565                         }
566
567                         if (ata_scnt(skb_mac_header(f->skb)) > DEFAULTBCNT / 512
568                         && ifp && ++ifp->lostjumbo > (t->nframes << 1)
569                         && ifp->maxbcnt != DEFAULTBCNT) {
570                                 printk(KERN_INFO
571                                         "aoe: e%ld.%d: "
572                                         "too many lost jumbo on "
573                                         "%s:%012llx - "
574                                         "falling back to %d frames.\n",
575                                         d->aoemajor, d->aoeminor,
576                                         ifp->nd->name, mac_addr(t->addr),
577                                         DEFAULTBCNT);
578                                 ifp->maxbcnt = 0;
579                         }
580                         resend(d, t, f);
581                 }
582
583                 /* window check */
584                 if (t->nout == t->maxout
585                 && t->maxout < t->nframes
586                 && (jiffies - t->lastwadj)/HZ > 10) {
587                         t->maxout++;
588                         t->lastwadj = jiffies;
589                 }
590         }
591
592         if (d->sendq_hd) {
593                 n = d->rttavg <<= 1;
594                 if (n > MAXTIMER)
595                         d->rttavg = MAXTIMER;
596         }
597
598         if (d->flags & DEVFL_KICKME || d->htgt) {
599                 d->flags &= ~DEVFL_KICKME;
600                 aoecmd_work(d);
601         }
602
603         sl = d->sendq_hd;
604         d->sendq_hd = d->sendq_tl = NULL;
605
606         d->timer.expires = jiffies + TIMERTICK;
607         add_timer(&d->timer);
608
609         spin_unlock_irqrestore(&d->lock, flags);
610
611         aoenet_xmit(sl);
612 }
613
614 /* enters with d->lock held */
615 void
616 aoecmd_work(struct aoedev *d)
617 {
618         struct buf *buf;
619 loop:
620         if (d->htgt && !sthtith(d))
621                 return;
622         if (d->inprocess == NULL) {
623                 if (list_empty(&d->bufq))
624                         return;
625                 buf = container_of(d->bufq.next, struct buf, bufs);
626                 list_del(d->bufq.next);
627                 d->inprocess = buf;
628         }
629         if (aoecmd_ata_rw(d))
630                 goto loop;
631 }
632
633 /* this function performs work that has been deferred until sleeping is OK
634  */
635 void
636 aoecmd_sleepwork(struct work_struct *work)
637 {
638         struct aoedev *d = container_of(work, struct aoedev, work);
639
640         if (d->flags & DEVFL_GDALLOC)
641                 aoeblk_gdalloc(d);
642
643         if (d->flags & DEVFL_NEWSIZE) {
644                 struct block_device *bd;
645                 unsigned long flags;
646                 u64 ssize;
647
648                 ssize = d->gd->capacity;
649                 bd = bdget_disk(d->gd, 0);
650
651                 if (bd) {
652                         mutex_lock(&bd->bd_inode->i_mutex);
653                         i_size_write(bd->bd_inode, (loff_t)ssize<<9);
654                         mutex_unlock(&bd->bd_inode->i_mutex);
655                         bdput(bd);
656                 }
657                 spin_lock_irqsave(&d->lock, flags);
658                 d->flags |= DEVFL_UP;
659                 d->flags &= ~DEVFL_NEWSIZE;
660                 spin_unlock_irqrestore(&d->lock, flags);
661         }
662 }
663
664 static void
665 ataid_complete(struct aoedev *d, struct aoetgt *t, unsigned char *id)
666 {
667         u64 ssize;
668         u16 n;
669
670         /* word 83: command set supported */
671         n = le16_to_cpu(get_unaligned((__le16 *) &id[83<<1]));
672
673         /* word 86: command set/feature enabled */
674         n |= le16_to_cpu(get_unaligned((__le16 *) &id[86<<1]));
675
676         if (n & (1<<10)) {      /* bit 10: LBA 48 */
677                 d->flags |= DEVFL_EXT;
678
679                 /* word 100: number lba48 sectors */
680                 ssize = le64_to_cpu(get_unaligned((__le64 *) &id[100<<1]));
681
682                 /* set as in ide-disk.c:init_idedisk_capacity */
683                 d->geo.cylinders = ssize;
684                 d->geo.cylinders /= (255 * 63);
685                 d->geo.heads = 255;
686                 d->geo.sectors = 63;
687         } else {
688                 d->flags &= ~DEVFL_EXT;
689
690                 /* number lba28 sectors */
691                 ssize = le32_to_cpu(get_unaligned((__le32 *) &id[60<<1]));
692
693                 /* NOTE: obsolete in ATA 6 */
694                 d->geo.cylinders = le16_to_cpu(get_unaligned((__le16 *) &id[54<<1]));
695                 d->geo.heads = le16_to_cpu(get_unaligned((__le16 *) &id[55<<1]));
696                 d->geo.sectors = le16_to_cpu(get_unaligned((__le16 *) &id[56<<1]));
697         }
698
699         if (d->ssize != ssize)
700                 printk(KERN_INFO "aoe: %012llx e%lu.%lu v%04x has %llu sectors\n",
701                         mac_addr(t->addr),
702                         d->aoemajor, d->aoeminor,
703                         d->fw_ver, (long long)ssize);
704         d->ssize = ssize;
705         d->geo.start = 0;
706         if (d->flags & (DEVFL_GDALLOC|DEVFL_NEWSIZE))
707                 return;
708         if (d->gd != NULL) {
709                 d->gd->capacity = ssize;
710                 d->flags |= DEVFL_NEWSIZE;
711         } else
712                 d->flags |= DEVFL_GDALLOC;
713         schedule_work(&d->work);
714 }
715
716 static void
717 calc_rttavg(struct aoedev *d, int rtt)
718 {
719         register long n;
720
721         n = rtt;
722         if (n < 0) {
723                 n = -rtt;
724                 if (n < MINTIMER)
725                         n = MINTIMER;
726                 else if (n > MAXTIMER)
727                         n = MAXTIMER;
728                 d->mintimer += (n - d->mintimer) >> 1;
729         } else if (n < d->mintimer)
730                 n = d->mintimer;
731         else if (n > MAXTIMER)
732                 n = MAXTIMER;
733
734         /* g == .25; cf. Congestion Avoidance and Control, Jacobson & Karels; 1988 */
735         n -= d->rttavg;
736         d->rttavg += n >> 2;
737 }
738
739 static struct aoetgt *
740 gettgt(struct aoedev *d, char *addr)
741 {
742         struct aoetgt **t, **e;
743
744         t = d->targets;
745         e = t + NTARGETS;
746         for (; t < e && *t; t++)
747                 if (memcmp((*t)->addr, addr, sizeof((*t)->addr)) == 0)
748                         return *t;
749         return NULL;
750 }
751
752 static inline void
753 diskstats(struct gendisk *disk, struct bio *bio, ulong duration)
754 {
755         unsigned long n_sect = bio->bi_size >> 9;
756         const int rw = bio_data_dir(bio);
757
758         disk_stat_inc(disk, ios[rw]);
759         disk_stat_add(disk, ticks[rw], duration);
760         disk_stat_add(disk, sectors[rw], n_sect);
761         disk_stat_add(disk, io_ticks, duration);
762 }
763
764 void
765 aoecmd_ata_rsp(struct sk_buff *skb)
766 {
767         struct aoedev *d;
768         struct aoe_hdr *hin, *hout;
769         struct aoe_atahdr *ahin, *ahout;
770         struct frame *f;
771         struct buf *buf;
772         struct sk_buff *sl;
773         struct aoetgt *t;
774         struct aoeif *ifp;
775         register long n;
776         ulong flags;
777         char ebuf[128];
778         u16 aoemajor;
779
780         hin = (struct aoe_hdr *) skb_mac_header(skb);
781         aoemajor = be16_to_cpu(get_unaligned(&hin->major));
782         d = aoedev_by_aoeaddr(aoemajor, hin->minor);
783         if (d == NULL) {
784                 snprintf(ebuf, sizeof ebuf, "aoecmd_ata_rsp: ata response "
785                         "for unknown device %d.%d\n",
786                          aoemajor, hin->minor);
787                 aoechr_error(ebuf);
788                 return;
789         }
790
791         spin_lock_irqsave(&d->lock, flags);
792
793         n = be32_to_cpu(get_unaligned(&hin->tag));
794         t = gettgt(d, hin->src);
795         if (t == NULL) {
796                 printk(KERN_INFO "aoe: can't find target e%ld.%d:%012llx\n",
797                         d->aoemajor, d->aoeminor, mac_addr(hin->src));
798                 spin_unlock_irqrestore(&d->lock, flags);
799                 return;
800         }
801         f = getframe(t, n);
802         if (f == NULL) {
803                 calc_rttavg(d, -tsince(n));
804                 spin_unlock_irqrestore(&d->lock, flags);
805                 snprintf(ebuf, sizeof ebuf,
806                         "%15s e%d.%d    tag=%08x@%08lx\n",
807                         "unexpected rsp",
808                         be16_to_cpu(get_unaligned(&hin->major)),
809                         hin->minor,
810                         be32_to_cpu(get_unaligned(&hin->tag)),
811                         jiffies);
812                 aoechr_error(ebuf);
813                 return;
814         }
815
816         calc_rttavg(d, tsince(f->tag));
817
818         ahin = (struct aoe_atahdr *) (hin+1);
819         hout = (struct aoe_hdr *) skb_mac_header(f->skb);
820         ahout = (struct aoe_atahdr *) (hout+1);
821         buf = f->buf;
822
823         if (ahin->cmdstat & 0xa9) {     /* these bits cleared on success */
824                 printk(KERN_ERR
825                         "aoe: ata error cmd=%2.2Xh stat=%2.2Xh from e%ld.%ld\n",
826                         ahout->cmdstat, ahin->cmdstat,
827                         d->aoemajor, d->aoeminor);
828                 if (buf)
829                         buf->flags |= BUFFL_FAIL;
830         } else {
831                 if (d->htgt && t == *d->htgt) /* I'll help myself, thank you. */
832                         d->htgt = NULL;
833                 n = ahout->scnt << 9;
834                 switch (ahout->cmdstat) {
835                 case WIN_READ:
836                 case WIN_READ_EXT:
837                         if (skb->len - sizeof *hin - sizeof *ahin < n) {
838                                 printk(KERN_ERR
839                                         "aoe: %s.  skb->len=%d need=%ld\n",
840                                         "runt data size in read", skb->len, n);
841                                 /* fail frame f?  just returning will rexmit. */
842                                 spin_unlock_irqrestore(&d->lock, flags);
843                                 return;
844                         }
845                         memcpy(f->bufaddr, ahin+1, n);
846                 case WIN_WRITE:
847                 case WIN_WRITE_EXT:
848                         ifp = getif(t, skb->dev);
849                         if (ifp) {
850                                 ifp->lost = 0;
851                                 if (n > DEFAULTBCNT)
852                                         ifp->lostjumbo = 0;
853                         }
854                         if (f->bcnt -= n) {
855                                 f->lba += n >> 9;
856                                 f->bufaddr += n;
857                                 resend(d, t, f);
858                                 goto xmit;
859                         }
860                         break;
861                 case WIN_IDENTIFY:
862                         if (skb->len - sizeof *hin - sizeof *ahin < 512) {
863                                 printk(KERN_INFO
864                                         "aoe: runt data size in ataid.  skb->len=%d\n",
865                                         skb->len);
866                                 spin_unlock_irqrestore(&d->lock, flags);
867                                 return;
868                         }
869                         ataid_complete(d, t, (char *) (ahin+1));
870                         break;
871                 default:
872                         printk(KERN_INFO
873                                 "aoe: unrecognized ata command %2.2Xh for %d.%d\n",
874                                 ahout->cmdstat,
875                                 be16_to_cpu(get_unaligned(&hin->major)),
876                                 hin->minor);
877                 }
878         }
879
880         if (buf && --buf->nframesout == 0 && buf->resid == 0) {
881                 diskstats(d->gd, buf->bio, jiffies - buf->stime);
882                 n = (buf->flags & BUFFL_FAIL) ? -EIO : 0;
883                 bio_endio(buf->bio, n);
884                 mempool_free(buf, d->bufpool);
885         }
886
887         f->buf = NULL;
888         f->tag = FREETAG;
889         t->nout--;
890
891         aoecmd_work(d);
892 xmit:
893         sl = d->sendq_hd;
894         d->sendq_hd = d->sendq_tl = NULL;
895
896         spin_unlock_irqrestore(&d->lock, flags);
897         aoenet_xmit(sl);
898 }
899
900 void
901 aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
902 {
903         struct sk_buff *sl;
904
905         sl = aoecmd_cfg_pkts(aoemajor, aoeminor, NULL);
906
907         aoenet_xmit(sl);
908 }
909  
910 struct sk_buff *
911 aoecmd_ata_id(struct aoedev *d)
912 {
913         struct aoe_hdr *h;
914         struct aoe_atahdr *ah;
915         struct frame *f;
916         struct sk_buff *skb;
917         struct aoetgt *t;
918
919         f = freeframe(d);
920         if (f == NULL)
921                 return NULL;
922
923         t = *d->tgt;
924
925         /* initialize the headers & frame */
926         skb = f->skb;
927         h = (struct aoe_hdr *) skb_mac_header(skb);
928         ah = (struct aoe_atahdr *) (h+1);
929         skb_put(skb, sizeof *h + sizeof *ah);
930         memset(h, 0, skb->len);
931         f->tag = aoehdr_atainit(d, t, h);
932         t->nout++;
933         f->waited = 0;
934
935         /* set up ata header */
936         ah->scnt = 1;
937         ah->cmdstat = WIN_IDENTIFY;
938         ah->lba3 = 0xa0;
939
940         skb->dev = t->ifp->nd;
941
942         d->rttavg = MAXTIMER;
943         d->timer.function = rexmit_timer;
944
945         return skb_clone(skb, GFP_ATOMIC);
946 }
947  
948 static struct aoetgt *
949 addtgt(struct aoedev *d, char *addr, ulong nframes)
950 {
951         struct aoetgt *t, **tt, **te;
952         struct frame *f, *e;
953
954         tt = d->targets;
955         te = tt + NTARGETS;
956         for (; tt < te && *tt; tt++)
957                 ;
958
959         if (tt == te)
960                 return NULL;
961
962         t = kcalloc(1, sizeof *t, GFP_ATOMIC);
963         if (!t)
964                 return NULL;
965         f = kcalloc(nframes, sizeof *f, GFP_ATOMIC);
966         if (!f) {
967                 kfree(t);
968                 return NULL;
969         }
970
971         t->nframes = nframes;
972         t->frames = f;
973         e = f + nframes;
974         for (; f < e; f++)
975                 f->tag = FREETAG;
976         memcpy(t->addr, addr, sizeof t->addr);
977         t->ifp = t->ifs;
978         t->maxout = t->nframes;
979         return *tt = t;
980 }
981
982 void
983 aoecmd_cfg_rsp(struct sk_buff *skb)
984 {
985         struct aoedev *d;
986         struct aoe_hdr *h;
987         struct aoe_cfghdr *ch;
988         struct aoetgt *t;
989         struct aoeif *ifp;
990         ulong flags, sysminor, aoemajor;
991         struct sk_buff *sl;
992         u16 n;
993
994         h = (struct aoe_hdr *) skb_mac_header(skb);
995         ch = (struct aoe_cfghdr *) (h+1);
996
997         /*
998          * Enough people have their dip switches set backwards to
999          * warrant a loud message for this special case.
1000          */
1001         aoemajor = be16_to_cpu(get_unaligned(&h->major));
1002         if (aoemajor == 0xfff) {
1003                 printk(KERN_ERR "aoe: Warning: shelf address is all ones.  "
1004                         "Check shelf dip switches.\n");
1005                 return;
1006         }
1007
1008         sysminor = SYSMINOR(aoemajor, h->minor);
1009         if (sysminor * AOE_PARTITIONS + AOE_PARTITIONS > MINORMASK) {
1010                 printk(KERN_INFO "aoe: e%ld.%d: minor number too large\n",
1011                         aoemajor, (int) h->minor);
1012                 return;
1013         }
1014
1015         n = be16_to_cpu(ch->bufcnt);
1016         if (n > aoe_maxout)     /* keep it reasonable */
1017                 n = aoe_maxout;
1018
1019         d = aoedev_by_sysminor_m(sysminor);
1020         if (d == NULL) {
1021                 printk(KERN_INFO "aoe: device sysminor_m failure\n");
1022                 return;
1023         }
1024
1025         spin_lock_irqsave(&d->lock, flags);
1026
1027         t = gettgt(d, h->src);
1028         if (!t) {
1029                 t = addtgt(d, h->src, n);
1030                 if (!t) {
1031                         printk(KERN_INFO
1032                                 "aoe: device addtgt failure; "
1033                                 "too many targets?\n");
1034                         spin_unlock_irqrestore(&d->lock, flags);
1035                         return;
1036                 }
1037         }
1038         ifp = getif(t, skb->dev);
1039         if (!ifp) {
1040                 ifp = addif(t, skb->dev);
1041                 if (!ifp) {
1042                         printk(KERN_INFO
1043                                 "aoe: device addif failure; "
1044                                 "too many interfaces?\n");
1045                         spin_unlock_irqrestore(&d->lock, flags);
1046                         return;
1047                 }
1048         }
1049         if (ifp->maxbcnt) {
1050                 n = ifp->nd->mtu;
1051                 n -= sizeof (struct aoe_hdr) + sizeof (struct aoe_atahdr);
1052                 n /= 512;
1053                 if (n > ch->scnt)
1054                         n = ch->scnt;
1055                 n = n ? n * 512 : DEFAULTBCNT;
1056                 if (n != ifp->maxbcnt) {
1057                         printk(KERN_INFO
1058                                 "aoe: e%ld.%d: setting %d%s%s:%012llx\n",
1059                                 d->aoemajor, d->aoeminor, n,
1060                                 " byte data frames on ", ifp->nd->name,
1061                                 mac_addr(t->addr));
1062                         ifp->maxbcnt = n;
1063                 }
1064         }
1065
1066         /* don't change users' perspective */
1067         if (d->nopen) {
1068                 spin_unlock_irqrestore(&d->lock, flags);
1069                 return;
1070         }
1071         d->fw_ver = be16_to_cpu(ch->fwver);
1072
1073         sl = aoecmd_ata_id(d);
1074
1075         spin_unlock_irqrestore(&d->lock, flags);
1076
1077         aoenet_xmit(sl);
1078 }
1079
1080 void
1081 aoecmd_cleanslate(struct aoedev *d)
1082 {
1083         struct aoetgt **t, **te;
1084         struct aoeif *p, *e;
1085
1086         d->mintimer = MINTIMER;
1087
1088         t = d->targets;
1089         te = t + NTARGETS;
1090         for (; t < te && *t; t++) {
1091                 (*t)->maxout = (*t)->nframes;
1092                 p = (*t)->ifs;
1093                 e = p + NAOEIFS;
1094                 for (; p < e; p++) {
1095                         p->lostjumbo = 0;
1096                         p->lost = 0;
1097                         p->maxbcnt = DEFAULTBCNT;
1098                 }
1099         }
1100 }