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