• Sreekanth Reddy's avatar
    mpt3sas: Added Reply Descriptor Post Queue (RDPQ) Array support · 9b05c91a
    Sreekanth Reddy authored
    Up to now, Driver allocates a single contiguous block of memory
    pool for all reply queues and passes down a single address in the
    ReplyDescriptorPostQueueAddress field of the IOC Init Request
    Message to the firmware.
    
    When firmware receives this address, it will program each of the
    Reply Descriptor Post Queue registers, as each reply queue has its
    own register. Thus the firmware, starting from a base address it
    determines the starting address of the subsequent reply queues
    through some simple arithmetic calculations.
    
    The size of this contiguous block of memory pool is directly proportional
    to number of MSI-X vectors and the HBA queue depth. For example higher
    MSIX vectors requires larger contiguous block of memory pool.
    
    But some of the OS kernels are unable to allocate this larger
    contiguous block of memory pool.
    
    So, the proposal is to allocate memory independently for each
    Reply Queue and pass down all of the addresses to the firmware.
    Then the firmware will just take each address and program the value
    into the correct register.
    
    When HBAs with older firmware(i.e. without RDPQ capability) is used
    with this new driver then the max_msix_vectors value would be set
    to 8 by default.
    
    Change set in v1:
    
    1. Declared the _base_get_ioc_facts() functions at the beginning of the mpt3sas_base.c file
    instead of moving all these functions before mpt3sas_base_map_resources() function
            a. _base_wait_for_doorbell_int()
            b. _base_wait_for_doorbell_ack()
            c. _base_wait_for_doorbell_not_used()
            d. _base_handshake_req_reply_wait()
            e. _base_get_ioc_facts()
    
    2. Initially set the consistent DMA mask to 32 bit and then change it to 64 bit mask
    after allocating RDPQ pools by calling the function _base_change_consistent_dma_mask.
    This is to ensure that all the upper 32 bits of RDPQ entries's base address to be same.
    
    3. Reduced the redundancy between the RDPQ and non-RDPQ support in these following functions
            a. _base_release_memory_pools()
            b. _base_allocate_memory_pools()
            c. _base_send_ioc_init()
            d. _base_make_ioc_operational()
    Signed-off-by: default avatarSreekanth Reddy <Sreekanth.Reddy@avagotech.com>
    Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    9b05c91a
mpt3sas_base.c 139 KB