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 = get_capacity(d->gd); 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 set_capacity(d->gd, 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 int cpu; 734 735 cpu = part_stat_lock(); 736 part = disk_map_sector_rcu(disk, sector); 737 738 part_stat_inc(cpu, part, ios[rw]); 739 part_stat_add(cpu, part, ticks[rw], duration); 740 part_stat_add(cpu, part, sectors[rw], n_sect); 741 part_stat_add(cpu, part, io_ticks, duration); 742 743 part_stat_unlock(); 744 } 745 746 void 747 aoecmd_ata_rsp(struct sk_buff *skb) 748 { 749 struct sk_buff_head queue; 750 struct aoedev *d; 751 struct aoe_hdr *hin, *hout; 752 struct aoe_atahdr *ahin, *ahout; 753 struct frame *f; 754 struct buf *buf; 755 struct aoetgt *t; 756 struct aoeif *ifp; 757 register long n; 758 ulong flags; 759 char ebuf[128]; 760 u16 aoemajor; 761 762 hin = (struct aoe_hdr *) skb_mac_header(skb); 763 aoemajor = get_unaligned_be16(&hin->major); 764 d = aoedev_by_aoeaddr(aoemajor, hin->minor); 765 if (d == NULL) { 766 snprintf(ebuf, sizeof ebuf, "aoecmd_ata_rsp: ata response " 767 "for unknown device %d.%d\n", 768 aoemajor, hin->minor); 769 aoechr_error(ebuf); 770 return; 771 } 772 773 spin_lock_irqsave(&d->lock, flags); 774 775 n = get_unaligned_be32(&hin->tag); 776 t = gettgt(d, hin->src); 777 if (t == NULL) { 778 printk(KERN_INFO "aoe: can't find target e%ld.%d:%012llx\n", 779 d->aoemajor, d->aoeminor, mac_addr(hin->src)); 780 spin_unlock_irqrestore(&d->lock, flags); 781 return; 782 } 783 f = getframe(t, n); 784 if (f == NULL) { 785 calc_rttavg(d, -tsince(n)); 786 spin_unlock_irqrestore(&d->lock, flags); 787 snprintf(ebuf, sizeof ebuf, 788 "%15s e%d.%d tag=%08x@%08lx\n", 789 "unexpected rsp", 790 get_unaligned_be16(&hin->major), 791 hin->minor, 792 get_unaligned_be32(&hin->tag), 793 jiffies); 794 aoechr_error(ebuf); 795 return; 796 } 797 798 calc_rttavg(d, tsince(f->tag)); 799 800 ahin = (struct aoe_atahdr *) (hin+1); 801 hout = (struct aoe_hdr *) skb_mac_header(f->skb); 802 ahout = (struct aoe_atahdr *) (hout+1); 803 buf = f->buf; 804 805 if (ahin->cmdstat & 0xa9) { /* these bits cleared on success */ 806 printk(KERN_ERR 807 "aoe: ata error cmd=%2.2Xh stat=%2.2Xh from e%ld.%d\n", 808 ahout->cmdstat, ahin->cmdstat, 809 d->aoemajor, d->aoeminor); 810 if (buf) 811 buf->flags |= BUFFL_FAIL; 812 } else { 813 if (d->htgt && t == *d->htgt) /* I'll help myself, thank you. */ 814 d->htgt = NULL; 815 n = ahout->scnt << 9; 816 switch (ahout->cmdstat) { 817 case WIN_READ: 818 case WIN_READ_EXT: 819 if (skb->len - sizeof *hin - sizeof *ahin < n) { 820 printk(KERN_ERR 821 "aoe: %s. skb->len=%d need=%ld\n", 822 "runt data size in read", skb->len, n); 823 /* fail frame f? just returning will rexmit. */ 824 spin_unlock_irqrestore(&d->lock, flags); 825 return; 826 } 827 memcpy(f->bufaddr, ahin+1, n); 828 case WIN_WRITE: 829 case WIN_WRITE_EXT: 830 ifp = getif(t, skb->dev); 831 if (ifp) { 832 ifp->lost = 0; 833 if (n > DEFAULTBCNT) 834 ifp->lostjumbo = 0; 835 } 836 if (f->bcnt -= n) { 837 f->lba += n >> 9; 838 f->bufaddr += n; 839 resend(d, t, f); 840 goto xmit; 841 } 842 break; 843 case WIN_IDENTIFY: 844 if (skb->len - sizeof *hin - sizeof *ahin < 512) { 845 printk(KERN_INFO 846 "aoe: runt data size in ataid. skb->len=%d\n", 847 skb->len); 848 spin_unlock_irqrestore(&d->lock, flags); 849 return; 850 } 851 ataid_complete(d, t, (char *) (ahin+1)); 852 break; 853 default: 854 printk(KERN_INFO 855 "aoe: unrecognized ata command %2.2Xh for %d.%d\n", 856 ahout->cmdstat, 857 get_unaligned_be16(&hin->major), 858 hin->minor); 859 } 860 } 861 862 if (buf && --buf->nframesout == 0 && buf->resid == 0) { 863 diskstats(d->gd, buf->bio, jiffies - buf->stime, buf->sector); 864 n = (buf->flags & BUFFL_FAIL) ? -EIO : 0; 865 bio_endio(buf->bio, n); 866 mempool_free(buf, d->bufpool); 867 } 868 869 f->buf = NULL; 870 f->tag = FREETAG; 871 t->nout--; 872 873 aoecmd_work(d); 874 xmit: 875 __skb_queue_head_init(&queue); 876 skb_queue_splice_init(&d->sendq, &queue); 877 878 spin_unlock_irqrestore(&d->lock, flags); 879 aoenet_xmit(&queue); 880 } 881 882 void 883 aoecmd_cfg(ushort aoemajor, unsigned char aoeminor) 884 { 885 struct sk_buff_head queue; 886 887 __skb_queue_head_init(&queue); 888 aoecmd_cfg_pkts(aoemajor, aoeminor, &queue); 889 aoenet_xmit(&queue); 890 } 891 892 struct sk_buff * 893 aoecmd_ata_id(struct aoedev *d) 894 { 895 struct aoe_hdr *h; 896 struct aoe_atahdr *ah; 897 struct frame *f; 898 struct sk_buff *skb; 899 struct aoetgt *t; 900 901 f = freeframe(d); 902 if (f == NULL) 903 return NULL; 904 905 t = *d->tgt; 906 907 /* initialize the headers & frame */ 908 skb = f->skb; 909 h = (struct aoe_hdr *) skb_mac_header(skb); 910 ah = (struct aoe_atahdr *) (h+1); 911 skb_put(skb, sizeof *h + sizeof *ah); 912 memset(h, 0, skb->len); 913 f->tag = aoehdr_atainit(d, t, h); 914 t->nout++; 915 f->waited = 0; 916 917 /* set up ata header */ 918 ah->scnt = 1; 919 ah->cmdstat = WIN_IDENTIFY; 920 ah->lba3 = 0xa0; 921 922 skb->dev = t->ifp->nd; 923 924 d->rttavg = MAXTIMER; 925 d->timer.function = rexmit_timer; 926 927 return skb_clone(skb, GFP_ATOMIC); 928 } 929 930 static struct aoetgt * 931 addtgt(struct aoedev *d, char *addr, ulong nframes) 932 { 933 struct aoetgt *t, **tt, **te; 934 struct frame *f, *e; 935 936 tt = d->targets; 937 te = tt + NTARGETS; 938 for (; tt < te && *tt; tt++) 939 ; 940 941 if (tt == te) { 942 printk(KERN_INFO 943 "aoe: device addtgt failure; too many targets\n"); 944 return NULL; 945 } 946 t = kcalloc(1, sizeof *t, GFP_ATOMIC); 947 f = kcalloc(nframes, sizeof *f, GFP_ATOMIC); 948 if (!t || !f) { 949 kfree(f); 950 kfree(t); 951 printk(KERN_INFO "aoe: cannot allocate memory to add target\n"); 952 return NULL; 953 } 954 955 t->nframes = nframes; 956 t->frames = f; 957 e = f + nframes; 958 for (; f < e; f++) 959 f->tag = FREETAG; 960 memcpy(t->addr, addr, sizeof t->addr); 961 t->ifp = t->ifs; 962 t->maxout = t->nframes; 963 return *tt = t; 964 } 965 966 void 967 aoecmd_cfg_rsp(struct sk_buff *skb) 968 { 969 struct aoedev *d; 970 struct aoe_hdr *h; 971 struct aoe_cfghdr *ch; 972 struct aoetgt *t; 973 struct aoeif *ifp; 974 ulong flags, sysminor, aoemajor; 975 struct sk_buff *sl; 976 u16 n; 977 978 h = (struct aoe_hdr *) skb_mac_header(skb); 979 ch = (struct aoe_cfghdr *) (h+1); 980 981 /* 982 * Enough people have their dip switches set backwards to 983 * warrant a loud message for this special case. 984 */ 985 aoemajor = get_unaligned_be16(&h->major); 986 if (aoemajor == 0xfff) { 987 printk(KERN_ERR "aoe: Warning: shelf address is all ones. " 988 "Check shelf dip switches.\n"); 989 return; 990 } 991 992 sysminor = SYSMINOR(aoemajor, h->minor); 993 if (sysminor * AOE_PARTITIONS + AOE_PARTITIONS > MINORMASK) { 994 printk(KERN_INFO "aoe: e%ld.%d: minor number too large\n", 995 aoemajor, (int) h->minor); 996 return; 997 } 998 999 n = be16_to_cpu(ch->bufcnt); 1000 if (n > aoe_maxout) /* keep it reasonable */ 1001 n = aoe_maxout; 1002 1003 d = aoedev_by_sysminor_m(sysminor); 1004 if (d == NULL) { 1005 printk(KERN_INFO "aoe: device sysminor_m failure\n"); 1006 return; 1007 } 1008 1009 spin_lock_irqsave(&d->lock, flags); 1010 1011 t = gettgt(d, h->src); 1012 if (!t) { 1013 t = addtgt(d, h->src, n); 1014 if (!t) { 1015 spin_unlock_irqrestore(&d->lock, flags); 1016 return; 1017 } 1018 } 1019 ifp = getif(t, skb->dev); 1020 if (!ifp) { 1021 ifp = addif(t, skb->dev); 1022 if (!ifp) { 1023 printk(KERN_INFO 1024 "aoe: device addif failure; " 1025 "too many interfaces?\n"); 1026 spin_unlock_irqrestore(&d->lock, flags); 1027 return; 1028 } 1029 } 1030 if (ifp->maxbcnt) { 1031 n = ifp->nd->mtu; 1032 n -= sizeof (struct aoe_hdr) + sizeof (struct aoe_atahdr); 1033 n /= 512; 1034 if (n > ch->scnt) 1035 n = ch->scnt; 1036 n = n ? n * 512 : DEFAULTBCNT; 1037 if (n != ifp->maxbcnt) { 1038 printk(KERN_INFO 1039 "aoe: e%ld.%d: setting %d%s%s:%012llx\n", 1040 d->aoemajor, d->aoeminor, n, 1041 " byte data frames on ", ifp->nd->name, 1042 mac_addr(t->addr)); 1043 ifp->maxbcnt = n; 1044 } 1045 } 1046 1047 /* don't change users' perspective */ 1048 if (d->nopen) { 1049 spin_unlock_irqrestore(&d->lock, flags); 1050 return; 1051 } 1052 d->fw_ver = be16_to_cpu(ch->fwver); 1053 1054 sl = aoecmd_ata_id(d); 1055 1056 spin_unlock_irqrestore(&d->lock, flags); 1057 1058 if (sl) { 1059 struct sk_buff_head queue; 1060 __skb_queue_head_init(&queue); 1061 __skb_queue_tail(&queue, sl); 1062 aoenet_xmit(&queue); 1063 } 1064 } 1065 1066 void 1067 aoecmd_cleanslate(struct aoedev *d) 1068 { 1069 struct aoetgt **t, **te; 1070 struct aoeif *p, *e; 1071 1072 d->mintimer = MINTIMER; 1073 1074 t = d->targets; 1075 te = t + NTARGETS; 1076 for (; t < te && *t; t++) { 1077 (*t)->maxout = (*t)->nframes; 1078 p = (*t)->ifs; 1079 e = p + NAOEIFS; 1080 for (; p < e; p++) { 1081 p->lostjumbo = 0; 1082 p->lost = 0; 1083 p->maxbcnt = DEFAULTBCNT; 1084 } 1085 } 1086 } 1087