| .. | .. |
|---|
| 771 | 771 | } |
|---|
| 772 | 772 | |
|---|
| 773 | 773 | /* |
|---|
| 774 | | - * max_blocks is dependent on the amount of storage that is available |
|---|
| 775 | | - * in the static io buffer for each device. Currently each device has |
|---|
| 776 | | - * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has |
|---|
| 777 | | - * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use |
|---|
| 778 | | - * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In |
|---|
| 779 | | - * addition we have one define extent ccw + 16 bytes of data and a |
|---|
| 780 | | - * locate record ccw for each block (stupid devices!) + 16 bytes of data. |
|---|
| 781 | | - * That makes: |
|---|
| 782 | | - * (8192 - 24 - 136 - 8 - 16) / 40 = 200.2 blocks at maximum. |
|---|
| 783 | | - * We want to fit two into the available memory so that we can immediately |
|---|
| 784 | | - * start the next request if one finishes off. That makes 100.1 blocks |
|---|
| 785 | | - * for one request. Give a little safety and the result is 96. |
|---|
| 774 | + * Initialize block layer request queue. |
|---|
| 786 | 775 | */ |
|---|
| 776 | +static void dasd_fba_setup_blk_queue(struct dasd_block *block) |
|---|
| 777 | +{ |
|---|
| 778 | + unsigned int logical_block_size = block->bp_block; |
|---|
| 779 | + struct request_queue *q = block->request_queue; |
|---|
| 780 | + unsigned int max_bytes, max_discard_sectors; |
|---|
| 781 | + int max; |
|---|
| 782 | + |
|---|
| 783 | + max = DASD_FBA_MAX_BLOCKS << block->s2b_shift; |
|---|
| 784 | + blk_queue_flag_set(QUEUE_FLAG_NONROT, q); |
|---|
| 785 | + q->limits.max_dev_sectors = max; |
|---|
| 786 | + blk_queue_logical_block_size(q, logical_block_size); |
|---|
| 787 | + blk_queue_max_hw_sectors(q, max); |
|---|
| 788 | + blk_queue_max_segments(q, USHRT_MAX); |
|---|
| 789 | + /* With page sized segments each segment can be translated into one idaw/tidaw */ |
|---|
| 790 | + blk_queue_max_segment_size(q, PAGE_SIZE); |
|---|
| 791 | + blk_queue_segment_boundary(q, PAGE_SIZE - 1); |
|---|
| 792 | + |
|---|
| 793 | + q->limits.discard_granularity = logical_block_size; |
|---|
| 794 | + q->limits.discard_alignment = PAGE_SIZE; |
|---|
| 795 | + |
|---|
| 796 | + /* Calculate max_discard_sectors and make it PAGE aligned */ |
|---|
| 797 | + max_bytes = USHRT_MAX * logical_block_size; |
|---|
| 798 | + max_bytes = ALIGN_DOWN(max_bytes, PAGE_SIZE); |
|---|
| 799 | + max_discard_sectors = max_bytes / logical_block_size; |
|---|
| 800 | + |
|---|
| 801 | + blk_queue_max_discard_sectors(q, max_discard_sectors); |
|---|
| 802 | + blk_queue_max_write_zeroes_sectors(q, max_discard_sectors); |
|---|
| 803 | + blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); |
|---|
| 804 | +} |
|---|
| 805 | + |
|---|
| 806 | +static int dasd_fba_pe_handler(struct dasd_device *device, __u8 tbvpm) |
|---|
| 807 | +{ |
|---|
| 808 | + return dasd_generic_verify_path(device, tbvpm); |
|---|
| 809 | +} |
|---|
| 810 | + |
|---|
| 787 | 811 | static struct dasd_discipline dasd_fba_discipline = { |
|---|
| 788 | 812 | .owner = THIS_MODULE, |
|---|
| 789 | 813 | .name = "FBA ", |
|---|
| 790 | 814 | .ebcname = "FBA ", |
|---|
| 791 | | - .max_blocks = 96, |
|---|
| 792 | 815 | .check_device = dasd_fba_check_characteristics, |
|---|
| 793 | 816 | .do_analysis = dasd_fba_do_analysis, |
|---|
| 794 | | - .verify_path = dasd_generic_verify_path, |
|---|
| 817 | + .pe_handler = dasd_fba_pe_handler, |
|---|
| 818 | + .setup_blk_queue = dasd_fba_setup_blk_queue, |
|---|
| 795 | 819 | .fill_geometry = dasd_fba_fill_geometry, |
|---|
| 796 | 820 | .start_IO = dasd_start_IO, |
|---|
| 797 | 821 | .term_IO = dasd_term_IO, |
|---|