Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: xillybus: Reorganizing xilly_setupchannels()

Duplicate code in this function was moved into a new function,
xilly_get_dma_buffers().

There is no change in functionality.

Signed-off-by: Eli Billauer <eli.billauer@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Eli Billauer and committed by
Greg Kroah-Hartman
049c1fb4 cc6289fa

+141 -210
+141 -210
drivers/staging/xillybus/xillybus_core.c
··· 319 319 320 320 static void xillybus_autoflush(struct work_struct *work); 321 321 322 + struct xilly_alloc_state { 323 + void *salami; 324 + int left_of_salami; 325 + int nbuffer; 326 + enum dma_data_direction direction; 327 + u32 regdirection; 328 + }; 329 + 330 + static int xilly_get_dma_buffers(struct xilly_endpoint *ep, 331 + struct xilly_alloc_state *s, 332 + struct xilly_buffer **buffers, 333 + int bufnum, int bytebufsize) 334 + { 335 + int i, rc; 336 + dma_addr_t dma_addr; 337 + struct device *dev = ep->dev; 338 + struct xilly_buffer *this_buffer = NULL; /* Init to silence warning */ 339 + 340 + if (buffers) { /* Not the message buffer */ 341 + this_buffer = devm_kzalloc( 342 + dev, bufnum * sizeof(struct xilly_buffer), 343 + GFP_KERNEL); 344 + 345 + if (!this_buffer) 346 + return -ENOMEM; 347 + } 348 + 349 + for (i = 0; i < bufnum; i++) { 350 + /* 351 + * Buffers are expected in descending size order, so there 352 + * is either enough space for this buffer or none at all. 353 + */ 354 + 355 + if ((s->left_of_salami < bytebufsize) && 356 + (s->left_of_salami > 0)) { 357 + dev_err(ep->dev, 358 + "Corrupt buffer allocation in IDT. Aborting.\n"); 359 + return -ENODEV; 360 + } 361 + 362 + if (s->left_of_salami == 0) { 363 + int allocorder, allocsize; 364 + 365 + allocsize = PAGE_SIZE; 366 + allocorder = 0; 367 + while (bytebufsize > allocsize) { 368 + allocsize *= 2; 369 + allocorder++; 370 + } 371 + 372 + s->salami = (void *) devm_get_free_pages( 373 + dev, 374 + GFP_KERNEL | __GFP_DMA32 | __GFP_ZERO, 375 + allocorder); 376 + 377 + if (!s->salami) 378 + return -ENOMEM; 379 + s->left_of_salami = allocsize; 380 + } 381 + 382 + rc = ep->ephw->map_single(ep, s->salami, 383 + bytebufsize, s->direction, 384 + &dma_addr); 385 + 386 + if (rc) 387 + return rc; 388 + 389 + iowrite32((u32) (dma_addr & 0xffffffff), 390 + &ep->registers[fpga_dma_bufaddr_lowaddr_reg]); 391 + iowrite32(((u32) ((((u64) dma_addr) >> 32) & 0xffffffff)), 392 + &ep->registers[fpga_dma_bufaddr_highaddr_reg]); 393 + mmiowb(); 394 + 395 + if (buffers) { /* Not the message buffer */ 396 + this_buffer->addr = s->salami; 397 + this_buffer->dma_addr = dma_addr; 398 + buffers[i] = this_buffer++; 399 + 400 + iowrite32(s->regdirection | s->nbuffer++, 401 + &ep->registers[fpga_dma_bufno_reg]); 402 + } else { 403 + ep->msgbuf_addr = s->salami; 404 + ep->msgbuf_dma_addr = dma_addr; 405 + ep->msg_buf_size = bytebufsize; 406 + 407 + iowrite32(s->regdirection, 408 + &ep->registers[fpga_dma_bufno_reg]); 409 + } 410 + 411 + s->left_of_salami -= bytebufsize; 412 + s->salami += bytebufsize; 413 + } 414 + return 0; /* Success */ 415 + } 416 + 322 417 static int xilly_setupchannels(struct xilly_endpoint *ep, 323 418 unsigned char *chandesc, 324 419 int entries 325 420 ) 326 421 { 327 422 struct device *dev = ep->dev; 328 - int i, entry, wr_nbuffer, rd_nbuffer; 423 + int i, entry, rc; 329 424 struct xilly_channel *channel; 330 425 int channelnum, bufnum, bufsize, format, is_writebuf; 331 426 int bytebufsize; 332 427 int synchronous, allowpartial, exclusive_open, seekable; 333 428 int supports_nonempty; 334 - void *wr_salami = NULL; 335 - void *rd_salami = NULL; 336 - int left_of_wr_salami = 0; 337 - int left_of_rd_salami = 0; 338 - dma_addr_t dma_addr; 339 429 int msg_buf_done = 0; 340 - const gfp_t gfp_mask = GFP_KERNEL | __GFP_DMA32 | __GFP_ZERO; 341 430 342 - struct xilly_buffer *this_buffer = NULL; /* Init to silence warning */ 343 - int rc = 0; 431 + struct xilly_alloc_state rd_alloc = { 432 + .salami = NULL, 433 + .left_of_salami = 0, 434 + .nbuffer = 1, 435 + .direction = DMA_TO_DEVICE, 436 + .regdirection = 0, 437 + }; 438 + 439 + struct xilly_alloc_state wr_alloc = { 440 + .salami = NULL, 441 + .left_of_salami = 0, 442 + .nbuffer = 1, 443 + .direction = DMA_FROM_DEVICE, 444 + .regdirection = 0x80000000, 445 + }; 344 446 345 447 channel = devm_kzalloc(dev, ep->num_channels * 346 448 sizeof(struct xilly_channel), GFP_KERNEL); ··· 497 395 ep->channels[i] = channel++; 498 396 } 499 397 500 - /* 501 - * The DMA buffer address update is atomic on the FPGA, so even if 502 - * it was in the middle of sending messages to some buffer, changing 503 - * the address is safe, since the data will go to either of the 504 - * buffers. Not that this situation should occur at all anyhow. 505 - */ 506 - 507 - wr_nbuffer = 1; 508 - rd_nbuffer = 1; /* Buffer zero isn't used at all */ 509 - 510 398 for (entry = 0; entry < entries; entry++, chandesc += 4) { 399 + struct xilly_buffer **buffers = NULL; 400 + 511 401 is_writebuf = chandesc[0] & 0x01; 512 402 channelnum = (chandesc[0] >> 1) | ((chandesc[1] & 0x0f) << 7); 513 403 format = (chandesc[1] >> 4) & 0x03; ··· 520 426 521 427 channel = ep->channels[channelnum]; /* NULL for msg channel */ 522 428 523 - bytebufsize = bufsize << 2; /* Overwritten just below */ 429 + if (!is_writebuf || channelnum > 0) { 430 + channel->log2_element_size = ((format > 2) ? 431 + 2 : format); 432 + 433 + bytebufsize = channel->rd_buf_size = bufsize * 434 + (1 << channel->log2_element_size); 435 + 436 + buffers = devm_kzalloc(dev, 437 + bufnum * sizeof(struct xilly_buffer *), 438 + GFP_KERNEL); 439 + 440 + if (!buffers) 441 + goto memfail; 442 + } else 443 + bytebufsize = bufsize << 2; 524 444 525 445 if (!is_writebuf) { 526 446 channel->num_rd_buffers = bufnum; 527 - channel->log2_element_size = ((format > 2) ? 528 - 2 : format); 529 - bytebufsize = channel->rd_buf_size = bufsize * 530 - (1 << channel->log2_element_size); 531 447 channel->rd_allow_partial = allowpartial; 532 448 channel->rd_synchronous = synchronous; 533 449 channel->rd_exclusive_open = exclusive_open; 534 450 channel->seekable = seekable; 535 451 536 - channel->rd_buffers = devm_kzalloc(dev, 537 - bufnum * sizeof(struct xilly_buffer *), 538 - GFP_KERNEL); 539 - 540 - if (!channel->rd_buffers) 541 - goto memfail; 542 - 543 - this_buffer = devm_kzalloc(dev, 544 - bufnum * sizeof(struct xilly_buffer), 545 - GFP_KERNEL); 546 - 547 - if (!this_buffer) 548 - goto memfail; 452 + channel->rd_buffers = buffers; 453 + rc = xilly_get_dma_buffers(ep, &rd_alloc, buffers, 454 + bufnum, bytebufsize); 549 455 } 550 - 551 456 else if (channelnum > 0) { 552 457 channel->num_wr_buffers = bufnum; 553 - channel->log2_element_size = ((format > 2) ? 554 - 2 : format); 555 - bytebufsize = channel->wr_buf_size = bufsize * 556 - (1 << channel->log2_element_size); 557 458 558 459 channel->seekable = seekable; 559 460 channel->wr_supports_nonempty = supports_nonempty; ··· 557 468 channel->wr_synchronous = synchronous; 558 469 channel->wr_exclusive_open = exclusive_open; 559 470 560 - channel->wr_buffers = devm_kzalloc(dev, 561 - bufnum * sizeof(struct xilly_buffer *), 562 - GFP_KERNEL); 563 - 564 - if (!channel->wr_buffers) 565 - goto memfail; 566 - 567 - this_buffer = devm_kzalloc(dev, 568 - bufnum * sizeof(struct xilly_buffer), 569 - GFP_KERNEL); 570 - 571 - if (!this_buffer) 572 - goto memfail; 471 + channel->wr_buffers = buffers; 472 + rc = xilly_get_dma_buffers(ep, &wr_alloc, buffers, 473 + bufnum, bytebufsize); 474 + } else { 475 + rc = xilly_get_dma_buffers(ep, &wr_alloc, NULL, 476 + bufnum, bytebufsize); 477 + msg_buf_done++; 573 478 } 574 479 575 - /* 576 - * Although daunting, we cut the chunks for read buffers 577 - * from a different salami than the write buffers', 578 - * possibly improving performance. 579 - */ 580 - 581 - if (is_writebuf) 582 - for (i = 0; i < bufnum; i++) { 583 - /* 584 - * Buffers are expected in descending 585 - * byte-size order, so there is either 586 - * enough for this buffer or none at all. 587 - */ 588 - if ((left_of_wr_salami < bytebufsize) && 589 - (left_of_wr_salami > 0)) { 590 - dev_err(ep->dev, 591 - "Corrupt buffer allocation in IDT. Aborting.\n"); 592 - return -ENODEV; 593 - } 594 - 595 - if (left_of_wr_salami == 0) { 596 - int allocorder, allocsize; 597 - 598 - allocsize = PAGE_SIZE; 599 - allocorder = 0; 600 - while (bytebufsize > allocsize) { 601 - allocsize *= 2; 602 - allocorder++; 603 - } 604 - 605 - wr_salami = (void *) 606 - devm_get_free_pages( 607 - dev, gfp_mask, 608 - allocorder); 609 - 610 - if (!wr_salami) 611 - goto memfail; 612 - left_of_wr_salami = allocsize; 613 - } 614 - 615 - rc = ep->ephw->map_single(ep, wr_salami, 616 - bytebufsize, 617 - DMA_FROM_DEVICE, 618 - &dma_addr); 619 - 620 - if (rc) 621 - goto dmafail; 622 - 623 - iowrite32( 624 - (u32) (dma_addr & 0xffffffff), 625 - &ep->registers[ 626 - fpga_dma_bufaddr_lowaddr_reg] 627 - ); 628 - iowrite32( 629 - ((u32) ((((u64) dma_addr) >> 32) 630 - & 0xffffffff)), 631 - &ep->registers[ 632 - fpga_dma_bufaddr_highaddr_reg] 633 - ); 634 - mmiowb(); 635 - 636 - if (channelnum > 0) { 637 - this_buffer->addr = wr_salami; 638 - this_buffer->dma_addr = dma_addr; 639 - channel->wr_buffers[i] = this_buffer++; 640 - 641 - iowrite32( 642 - 0x80000000 | wr_nbuffer++, 643 - &ep->registers[ 644 - fpga_dma_bufno_reg]); 645 - } else { 646 - ep->msgbuf_addr = wr_salami; 647 - ep->msgbuf_dma_addr = dma_addr; 648 - ep->msg_buf_size = bytebufsize; 649 - msg_buf_done++; 650 - 651 - iowrite32( 652 - 0x80000000, &ep->registers[ 653 - fpga_dma_bufno_reg]); 654 - } 655 - 656 - left_of_wr_salami -= bytebufsize; 657 - wr_salami += bytebufsize; 658 - } 659 - else /* Read buffers */ 660 - for (i = 0; i < bufnum; i++) { 661 - /* 662 - * Buffers are expected in descending 663 - * byte-size order, so there is either 664 - * enough for this buffer or none at all. 665 - */ 666 - if ((left_of_rd_salami < bytebufsize) && 667 - (left_of_rd_salami > 0)) { 668 - dev_err(ep->dev, 669 - "Corrupt buffer allocation in IDT. Aborting.\n"); 670 - return -ENODEV; 671 - } 672 - 673 - if (left_of_rd_salami == 0) { 674 - int allocorder, allocsize; 675 - 676 - allocsize = PAGE_SIZE; 677 - allocorder = 0; 678 - while (bytebufsize > allocsize) { 679 - allocsize *= 2; 680 - allocorder++; 681 - } 682 - 683 - rd_salami = (void *) 684 - devm_get_free_pages( 685 - dev, gfp_mask, 686 - allocorder); 687 - 688 - if (!rd_salami) 689 - goto memfail; 690 - left_of_rd_salami = allocsize; 691 - } 692 - 693 - 694 - rc = ep->ephw->map_single(ep, rd_salami, 695 - bytebufsize, 696 - DMA_TO_DEVICE, 697 - &dma_addr); 698 - 699 - if (rc) 700 - goto dmafail; 701 - 702 - iowrite32( 703 - (u32) (dma_addr & 0xffffffff), 704 - &ep->registers[ 705 - fpga_dma_bufaddr_lowaddr_reg] 706 - ); 707 - iowrite32( 708 - ((u32) ((((u64) dma_addr) >> 32) 709 - & 0xffffffff)), 710 - &ep->registers[ 711 - fpga_dma_bufaddr_highaddr_reg] 712 - ); 713 - mmiowb(); 714 - 715 - this_buffer->addr = rd_salami; 716 - this_buffer->dma_addr = dma_addr; 717 - channel->rd_buffers[i] = this_buffer++; 718 - 719 - iowrite32(rd_nbuffer++, 720 - &ep->registers[fpga_dma_bufno_reg]); 721 - 722 - left_of_rd_salami -= bytebufsize; 723 - rd_salami += bytebufsize; 724 - } 480 + if (rc) 481 + goto memfail; 725 482 } 726 483 727 484 if (!msg_buf_done) { ··· 575 640 "Corrupt IDT: No message buffer. Aborting.\n"); 576 641 return -ENODEV; 577 642 } 578 - 579 643 return 0; 580 644 581 645 memfail: 582 646 dev_err(ep->dev, 583 - "Failed to allocate write buffer memory. Aborting.\n"); 647 + "Failed to assign DMA buffer memory. Aborting.\n"); 584 648 return -ENOMEM; 585 - dmafail: 586 - dev_err(ep->dev, "Failed to map DMA memory!. Aborting.\n"); 587 - return rc; 588 649 } 589 650 590 651 static void xilly_scan_idt(struct xilly_endpoint *endpoint,