aoecmd.c (dced3a053dd5415a7321e1ae153c96dea644da4e) | aoecmd.c (4f51dc5e9ae195d2e8c22e5f574e004c2f6518a4) |
---|---|
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> --- 106 unchanged lines hidden (view full) --- 115 if (bcnt > d->maxbcnt) 116 bcnt = d->maxbcnt; 117 118 /* initialize the headers & frame */ 119 skb = f->skb; 120 h = (struct aoe_hdr *) skb->mac.raw; 121 ah = (struct aoe_atahdr *) (h+1); 122 skb->len = sizeof *h + sizeof *ah; | 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> --- 106 unchanged lines hidden (view full) --- 115 if (bcnt > d->maxbcnt) 116 bcnt = d->maxbcnt; 117 118 /* initialize the headers & frame */ 119 skb = f->skb; 120 h = (struct aoe_hdr *) skb->mac.raw; 121 ah = (struct aoe_atahdr *) (h+1); 122 skb->len = sizeof *h + sizeof *ah; |
123 memset(h, 0, skb->len); | 123 memset(h, 0, ETH_ZLEN); |
124 f->tag = aoehdr_atainit(d, h); 125 f->waited = 0; 126 f->buf = buf; 127 f->bufaddr = buf->bufaddr; 128 f->bcnt = bcnt; 129 f->lba = sector; 130 131 /* set up ata header */ --- 6 unchanged lines hidden (view full) --- 138 ah->lba3 &= 0x0f; 139 ah->lba3 |= 0xe0; /* LBA bit + obsolete 0xa0 */ 140 } 141 142 if (bio_data_dir(buf->bio) == WRITE) { 143 skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr), 144 offset_in_page(f->bufaddr), bcnt); 145 ah->aflags |= AOEAFL_WRITE; | 124 f->tag = aoehdr_atainit(d, h); 125 f->waited = 0; 126 f->buf = buf; 127 f->bufaddr = buf->bufaddr; 128 f->bcnt = bcnt; 129 f->lba = sector; 130 131 /* set up ata header */ --- 6 unchanged lines hidden (view full) --- 138 ah->lba3 &= 0x0f; 139 ah->lba3 |= 0xe0; /* LBA bit + obsolete 0xa0 */ 140 } 141 142 if (bio_data_dir(buf->bio) == WRITE) { 143 skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr), 144 offset_in_page(f->bufaddr), bcnt); 145 ah->aflags |= AOEAFL_WRITE; |
146 skb->len += bcnt; 147 skb->data_len = bcnt; |
|
146 } else { | 148 } else { |
147 skb_shinfo(skb)->nr_frags = 0; | |
148 skb->len = ETH_ZLEN; 149 writebit = 0; 150 } 151 152 ah->cmdstat = WIN_READ | writebit | extbit; 153 154 /* mark all tracking fields and load out */ 155 buf->nframesout += 1; --- 6 unchanged lines hidden (view full) --- 162 d->inprocess = NULL; 163 } else if (buf->bv_resid == 0) { 164 buf->bv++; 165 buf->bv_resid = buf->bv->bv_len; 166 buf->bufaddr = page_address(buf->bv->bv_page) + buf->bv->bv_offset; 167 } 168 169 skb->dev = d->ifp; | 149 skb->len = ETH_ZLEN; 150 writebit = 0; 151 } 152 153 ah->cmdstat = WIN_READ | writebit | extbit; 154 155 /* mark all tracking fields and load out */ 156 buf->nframesout += 1; --- 6 unchanged lines hidden (view full) --- 163 d->inprocess = NULL; 164 } else if (buf->bv_resid == 0) { 165 buf->bv++; 166 buf->bv_resid = buf->bv->bv_len; 167 buf->bufaddr = page_address(buf->bv->bv_page) + buf->bv->bv_offset; 168 } 169 170 skb->dev = d->ifp; |
170 skb_get(skb); 171 skb->next = NULL; | 171 skb = skb_clone(skb, GFP_ATOMIC); 172 if (skb == NULL) 173 return; |
172 if (d->sendq_hd) 173 d->sendq_tl->next = skb; 174 else 175 d->sendq_hd = skb; 176 d->sendq_tl = skb; 177} 178 179/* some callers cannot sleep, and they can call this function, --- 39 unchanged lines hidden (view full) --- 219 } 220 read_unlock(&dev_base_lock); 221 222 if (tail != NULL) 223 *tail = sl_tail; 224 return sl; 225} 226 | 174 if (d->sendq_hd) 175 d->sendq_tl->next = skb; 176 else 177 d->sendq_hd = skb; 178 d->sendq_tl = skb; 179} 180 181/* some callers cannot sleep, and they can call this function, --- 39 unchanged lines hidden (view full) --- 221 } 222 read_unlock(&dev_base_lock); 223 224 if (tail != NULL) 225 *tail = sl_tail; 226 return sl; 227} 228 |
229static struct frame * 230freeframe(struct aoedev *d) 231{ 232 struct frame *f, *e; 233 int n = 0; 234 235 f = d->frames; 236 e = f + d->nframes; 237 for (; f<e; f++) { 238 if (f->tag != FREETAG) 239 continue; 240 if (atomic_read(&skb_shinfo(f->skb)->dataref) == 1) { 241 skb_shinfo(f->skb)->nr_frags = f->skb->data_len = 0; 242 return f; 243 } 244 n++; 245 } 246 if (n == d->nframes) /* wait for network layer */ 247 d->flags |= DEVFL_KICKME; 248 249 return NULL; 250} 251 |
|
227/* enters with d->lock held */ 228void 229aoecmd_work(struct aoedev *d) 230{ 231 struct frame *f; 232 struct buf *buf; 233 234 if (d->flags & DEVFL_PAUSE) { 235 if (!aoedev_isbusy(d)) 236 d->sendq_hd = aoecmd_cfg_pkts(d->aoemajor, 237 d->aoeminor, &d->sendq_tl); 238 return; 239 } 240 241loop: | 252/* enters with d->lock held */ 253void 254aoecmd_work(struct aoedev *d) 255{ 256 struct frame *f; 257 struct buf *buf; 258 259 if (d->flags & DEVFL_PAUSE) { 260 if (!aoedev_isbusy(d)) 261 d->sendq_hd = aoecmd_cfg_pkts(d->aoemajor, 262 d->aoeminor, &d->sendq_tl); 263 return; 264 } 265 266loop: |
242 f = getframe(d, FREETAG); | 267 f = freeframe(d); |
243 if (f == NULL) 244 return; 245 if (d->inprocess == NULL) { 246 if (list_empty(&d->bufq)) 247 return; 248 buf = container_of(d->bufq.next, struct buf, bufs); 249 list_del(d->bufq.next); 250/*dprintk("bi_size=%ld\n", buf->bio->bi_size); */ --- 26 unchanged lines hidden (view full) --- 277 f->tag = n; 278 h->tag = cpu_to_be32(n); 279 memcpy(h->dst, d->addr, sizeof h->dst); 280 memcpy(h->src, d->ifp->dev_addr, sizeof h->src); 281 282 n = DEFAULTBCNT / 512; 283 if (ah->scnt > n) { 284 ah->scnt = n; | 268 if (f == NULL) 269 return; 270 if (d->inprocess == NULL) { 271 if (list_empty(&d->bufq)) 272 return; 273 buf = container_of(d->bufq.next, struct buf, bufs); 274 list_del(d->bufq.next); 275/*dprintk("bi_size=%ld\n", buf->bio->bi_size); */ --- 26 unchanged lines hidden (view full) --- 302 f->tag = n; 303 h->tag = cpu_to_be32(n); 304 memcpy(h->dst, d->addr, sizeof h->dst); 305 memcpy(h->src, d->ifp->dev_addr, sizeof h->src); 306 307 n = DEFAULTBCNT / 512; 308 if (ah->scnt > n) { 309 ah->scnt = n; |
285 if (ah->aflags & AOEAFL_WRITE) | 310 if (ah->aflags & AOEAFL_WRITE) { |
286 skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr), 287 offset_in_page(f->bufaddr), DEFAULTBCNT); | 311 skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr), 312 offset_in_page(f->bufaddr), DEFAULTBCNT); |
313 skb->len = sizeof *h + sizeof *ah + DEFAULTBCNT; 314 skb->data_len = DEFAULTBCNT; 315 } |
|
288 if (++d->lostjumbo > (d->nframes << 1)) 289 if (d->maxbcnt != DEFAULTBCNT) { | 316 if (++d->lostjumbo > (d->nframes << 1)) 317 if (d->maxbcnt != DEFAULTBCNT) { |
290 iprintk("too many lost jumbo - using 1KB frames.\n"); | 318 iprintk("e%ld.%ld: too many lost jumbo on %s - using 1KB frames.\n", 319 d->aoemajor, d->aoeminor, d->ifp->name); |
291 d->maxbcnt = DEFAULTBCNT; 292 d->flags |= DEVFL_MAXBCNT; 293 } 294 } 295 296 skb->dev = d->ifp; | 320 d->maxbcnt = DEFAULTBCNT; 321 d->flags |= DEVFL_MAXBCNT; 322 } 323 } 324 325 skb->dev = d->ifp; |
297 skb_get(skb); 298 skb->next = NULL; | 326 skb = skb_clone(skb, GFP_ATOMIC); 327 if (skb == NULL) 328 return; |
299 if (d->sendq_hd) 300 d->sendq_tl->next = skb; 301 else 302 d->sendq_hd = skb; 303 d->sendq_tl = skb; 304} 305 306static int --- 38 unchanged lines hidden (view full) --- 345 n /= HZ; 346 if (n > MAXWAIT) { /* waited too long. device failure. */ 347 aoedev_downdev(d); 348 break; 349 } 350 rexmit(d, f); 351 } 352 } | 329 if (d->sendq_hd) 330 d->sendq_tl->next = skb; 331 else 332 d->sendq_hd = skb; 333 d->sendq_tl = skb; 334} 335 336static int --- 38 unchanged lines hidden (view full) --- 375 n /= HZ; 376 if (n > MAXWAIT) { /* waited too long. device failure. */ 377 aoedev_downdev(d); 378 break; 379 } 380 rexmit(d, f); 381 } 382 } |
383 if (d->flags & DEVFL_KICKME) { 384 d->flags &= ~DEVFL_KICKME; 385 aoecmd_work(d); 386 } |
|
353 354 sl = d->sendq_hd; 355 d->sendq_hd = d->sendq_tl = NULL; 356 if (sl) { 357 n = d->rttavg <<= 1; 358 if (n > MAXTIMER) 359 d->rttavg = MAXTIMER; 360 } --- 186 unchanged lines hidden (view full) --- 547 /* fail frame f? just returning will rexmit. */ 548 spin_unlock_irqrestore(&d->lock, flags); 549 return; 550 } 551 memcpy(f->bufaddr, ahin+1, n); 552 case WIN_WRITE: 553 case WIN_WRITE_EXT: 554 if (f->bcnt -= n) { | 387 388 sl = d->sendq_hd; 389 d->sendq_hd = d->sendq_tl = NULL; 390 if (sl) { 391 n = d->rttavg <<= 1; 392 if (n > MAXTIMER) 393 d->rttavg = MAXTIMER; 394 } --- 186 unchanged lines hidden (view full) --- 581 /* fail frame f? just returning will rexmit. */ 582 spin_unlock_irqrestore(&d->lock, flags); 583 return; 584 } 585 memcpy(f->bufaddr, ahin+1, n); 586 case WIN_WRITE: 587 case WIN_WRITE_EXT: 588 if (f->bcnt -= n) { |
589 skb = f->skb; |
|
555 f->bufaddr += n; 556 put_lba(ahout, f->lba += ahout->scnt); 557 n = f->bcnt; 558 if (n > DEFAULTBCNT) 559 n = DEFAULTBCNT; 560 ahout->scnt = n >> 9; | 590 f->bufaddr += n; 591 put_lba(ahout, f->lba += ahout->scnt); 592 n = f->bcnt; 593 if (n > DEFAULTBCNT) 594 n = DEFAULTBCNT; 595 ahout->scnt = n >> 9; |
561 if (ahout->aflags & AOEAFL_WRITE) 562 skb_fill_page_desc(f->skb, 0, | 596 if (ahout->aflags & AOEAFL_WRITE) { 597 skb_fill_page_desc(skb, 0, |
563 virt_to_page(f->bufaddr), 564 offset_in_page(f->bufaddr), n); | 598 virt_to_page(f->bufaddr), 599 offset_in_page(f->bufaddr), n); |
600 skb->len = sizeof *hout + sizeof *ahout + n; 601 skb->data_len = n; 602 } |
|
565 f->tag = newtag(d); 566 hout->tag = cpu_to_be32(f->tag); 567 skb->dev = d->ifp; | 603 f->tag = newtag(d); 604 hout->tag = cpu_to_be32(f->tag); 605 skb->dev = d->ifp; |
568 skb_get(f->skb); 569 f->skb->next = NULL; | 606 skb = skb_clone(skb, GFP_ATOMIC); |
570 spin_unlock_irqrestore(&d->lock, flags); | 607 spin_unlock_irqrestore(&d->lock, flags); |
571 aoenet_xmit(f->skb); | 608 if (skb) 609 aoenet_xmit(skb); |
572 return; 573 } 574 if (n > DEFAULTBCNT) 575 d->lostjumbo = 0; 576 break; 577 case WIN_IDENTIFY: 578 if (skb->len - sizeof *hin - sizeof *ahin < 512) { 579 iprintk("runt data size in ataid. skb->len=%d\n", --- 57 unchanged lines hidden (view full) --- 637static struct sk_buff * 638aoecmd_ata_id(struct aoedev *d) 639{ 640 struct aoe_hdr *h; 641 struct aoe_atahdr *ah; 642 struct frame *f; 643 struct sk_buff *skb; 644 | 610 return; 611 } 612 if (n > DEFAULTBCNT) 613 d->lostjumbo = 0; 614 break; 615 case WIN_IDENTIFY: 616 if (skb->len - sizeof *hin - sizeof *ahin < 512) { 617 iprintk("runt data size in ataid. skb->len=%d\n", --- 57 unchanged lines hidden (view full) --- 675static struct sk_buff * 676aoecmd_ata_id(struct aoedev *d) 677{ 678 struct aoe_hdr *h; 679 struct aoe_atahdr *ah; 680 struct frame *f; 681 struct sk_buff *skb; 682 |
645 f = getframe(d, FREETAG); | 683 f = freeframe(d); |
646 if (f == NULL) { 647 eprintk("can't get a frame. This shouldn't happen.\n"); 648 return NULL; 649 } 650 651 /* initialize the headers & frame */ 652 skb = f->skb; 653 h = (struct aoe_hdr *) skb->mac.raw; 654 ah = (struct aoe_atahdr *) (h+1); | 684 if (f == NULL) { 685 eprintk("can't get a frame. This shouldn't happen.\n"); 686 return NULL; 687 } 688 689 /* initialize the headers & frame */ 690 skb = f->skb; 691 h = (struct aoe_hdr *) skb->mac.raw; 692 ah = (struct aoe_atahdr *) (h+1); |
655 skb->len = sizeof *h + sizeof *ah; 656 memset(h, 0, skb->len); | 693 skb->len = ETH_ZLEN; 694 memset(h, 0, ETH_ZLEN); |
657 f->tag = aoehdr_atainit(d, h); 658 f->waited = 0; 659 660 /* set up ata header */ 661 ah->scnt = 1; 662 ah->cmdstat = WIN_IDENTIFY; 663 ah->lba3 = 0xa0; 664 665 skb->dev = d->ifp; | 695 f->tag = aoehdr_atainit(d, h); 696 f->waited = 0; 697 698 /* set up ata header */ 699 ah->scnt = 1; 700 ah->cmdstat = WIN_IDENTIFY; 701 ah->lba3 = 0xa0; 702 703 skb->dev = d->ifp; |
666 skb_get(skb); | |
667 668 d->rttavg = MAXTIMER; 669 d->timer.function = rexmit_timer; 670 | 704 705 d->rttavg = MAXTIMER; 706 d->timer.function = rexmit_timer; 707 |
671 return skb; | 708 return skb_clone(skb, GFP_ATOMIC); |
672} 673 674void 675aoecmd_cfg_rsp(struct sk_buff *skb) 676{ 677 struct aoedev *d; 678 struct aoe_hdr *h; 679 struct aoe_cfghdr *ch; --- 39 unchanged lines hidden (view full) --- 719 d->ifp = skb->dev; 720 memcpy(d->addr, h->src, sizeof d->addr); 721 if (!(d->flags & DEVFL_MAXBCNT)) { 722 n = d->ifp->mtu; 723 n -= sizeof (struct aoe_hdr) + sizeof (struct aoe_atahdr); 724 n /= 512; 725 if (n > ch->scnt) 726 n = ch->scnt; | 709} 710 711void 712aoecmd_cfg_rsp(struct sk_buff *skb) 713{ 714 struct aoedev *d; 715 struct aoe_hdr *h; 716 struct aoe_cfghdr *ch; --- 39 unchanged lines hidden (view full) --- 756 d->ifp = skb->dev; 757 memcpy(d->addr, h->src, sizeof d->addr); 758 if (!(d->flags & DEVFL_MAXBCNT)) { 759 n = d->ifp->mtu; 760 n -= sizeof (struct aoe_hdr) + sizeof (struct aoe_atahdr); 761 n /= 512; 762 if (n > ch->scnt) 763 n = ch->scnt; |
727 d->maxbcnt = n ? n * 512 : DEFAULTBCNT; | 764 n = n ? n * 512 : DEFAULTBCNT; 765 if (n != d->maxbcnt) { 766 iprintk("e%ld.%ld: setting %d byte data frames on %s\n", 767 d->aoemajor, d->aoeminor, n, d->ifp->name); 768 d->maxbcnt = n; 769 } |
728 } 729 730 /* don't change users' perspective */ 731 if (d->nopen && !(d->flags & DEVFL_PAUSE)) { 732 spin_unlock_irqrestore(&d->lock, flags); 733 return; 734 } 735 d->flags |= DEVFL_PAUSE; /* force pause */ 736 d->mintimer = MINTIMER; 737 d->fw_ver = be16_to_cpu(ch->fwver); 738 739 /* check for already outstanding ataid */ 740 sl = aoedev_isbusy(d) == 0 ? aoecmd_ata_id(d) : NULL; 741 742 spin_unlock_irqrestore(&d->lock, flags); 743 744 aoenet_xmit(sl); 745} 746 | 770 } 771 772 /* don't change users' perspective */ 773 if (d->nopen && !(d->flags & DEVFL_PAUSE)) { 774 spin_unlock_irqrestore(&d->lock, flags); 775 return; 776 } 777 d->flags |= DEVFL_PAUSE; /* force pause */ 778 d->mintimer = MINTIMER; 779 d->fw_ver = be16_to_cpu(ch->fwver); 780 781 /* check for already outstanding ataid */ 782 sl = aoedev_isbusy(d) == 0 ? aoecmd_ata_id(d) : NULL; 783 784 spin_unlock_irqrestore(&d->lock, flags); 785 786 aoenet_xmit(sl); 787} 788 |