| .. | .. |
|---|
| 31 | 31 | #include <scsi/scsi_transport_fc.h> |
|---|
| 32 | 32 | #include <scsi/fc/fc_fs.h> |
|---|
| 33 | 33 | |
|---|
| 34 | | -#include <linux/nvme-fc-driver.h> |
|---|
| 35 | | - |
|---|
| 36 | 34 | #include "lpfc_hw4.h" |
|---|
| 37 | 35 | #include "lpfc_hw.h" |
|---|
| 38 | 36 | #include "lpfc_sli.h" |
|---|
| .. | .. |
|---|
| 41 | 39 | #include "lpfc_disc.h" |
|---|
| 42 | 40 | #include "lpfc.h" |
|---|
| 43 | 41 | #include "lpfc_scsi.h" |
|---|
| 44 | | -#include "lpfc_nvme.h" |
|---|
| 45 | | -#include "lpfc_nvmet.h" |
|---|
| 46 | 42 | #include "lpfc_crtn.h" |
|---|
| 47 | 43 | #include "lpfc_logmsg.h" |
|---|
| 48 | 44 | |
|---|
| 49 | 45 | #define LPFC_MBUF_POOL_SIZE 64 /* max elements in MBUF safety pool */ |
|---|
| 50 | 46 | #define LPFC_MEM_POOL_SIZE 64 /* max elem in non-DMA safety pool */ |
|---|
| 51 | 47 | #define LPFC_DEVICE_DATA_POOL_SIZE 64 /* max elements in device data pool */ |
|---|
| 48 | +#define LPFC_RRQ_POOL_SIZE 256 /* max elements in non-DMA pool */ |
|---|
| 49 | +#define LPFC_MBX_POOL_SIZE 256 /* max elements in MBX non-DMA pool */ |
|---|
| 52 | 50 | |
|---|
| 53 | 51 | int |
|---|
| 54 | 52 | lpfc_mem_alloc_active_rrq_pool_s4(struct lpfc_hba *phba) { |
|---|
| .. | .. |
|---|
| 71 | 69 | /** |
|---|
| 72 | 70 | * lpfc_mem_alloc - create and allocate all PCI and memory pools |
|---|
| 73 | 71 | * @phba: HBA to allocate pools for |
|---|
| 72 | + * @align: alignment requirement for blocks; must be a power of two |
|---|
| 74 | 73 | * |
|---|
| 75 | | - * Description: Creates and allocates PCI pools lpfc_sg_dma_buf_pool, |
|---|
| 76 | | - * lpfc_mbuf_pool, lpfc_hrb_pool. Creates and allocates kmalloc-backed mempools |
|---|
| 74 | + * Description: Creates and allocates PCI pools lpfc_mbuf_pool, |
|---|
| 75 | + * lpfc_hrb_pool. Creates and allocates kmalloc-backed mempools |
|---|
| 77 | 76 | * for LPFC_MBOXQ_t and lpfc_nodelist. Also allocates the VPI bitmask. |
|---|
| 78 | 77 | * |
|---|
| 79 | 78 | * Notes: Not interrupt-safe. Must be called with no locks held. If any |
|---|
| .. | .. |
|---|
| 89 | 88 | struct lpfc_dma_pool *pool = &phba->lpfc_mbuf_safety_pool; |
|---|
| 90 | 89 | int i; |
|---|
| 91 | 90 | |
|---|
| 92 | | - if (phba->sli_rev == LPFC_SLI_REV4) { |
|---|
| 93 | | - /* Calculate alignment */ |
|---|
| 94 | | - if (phba->cfg_sg_dma_buf_size < SLI4_PAGE_SIZE) |
|---|
| 95 | | - i = phba->cfg_sg_dma_buf_size; |
|---|
| 96 | | - else |
|---|
| 97 | | - i = SLI4_PAGE_SIZE; |
|---|
| 98 | | - |
|---|
| 99 | | - phba->lpfc_sg_dma_buf_pool = |
|---|
| 100 | | - dma_pool_create("lpfc_sg_dma_buf_pool", |
|---|
| 101 | | - &phba->pcidev->dev, |
|---|
| 102 | | - phba->cfg_sg_dma_buf_size, |
|---|
| 103 | | - i, 0); |
|---|
| 104 | | - if (!phba->lpfc_sg_dma_buf_pool) |
|---|
| 105 | | - goto fail; |
|---|
| 106 | | - |
|---|
| 107 | | - } else { |
|---|
| 108 | | - phba->lpfc_sg_dma_buf_pool = |
|---|
| 109 | | - dma_pool_create("lpfc_sg_dma_buf_pool", |
|---|
| 110 | | - &phba->pcidev->dev, phba->cfg_sg_dma_buf_size, |
|---|
| 111 | | - align, 0); |
|---|
| 112 | | - |
|---|
| 113 | | - if (!phba->lpfc_sg_dma_buf_pool) |
|---|
| 114 | | - goto fail; |
|---|
| 115 | | - } |
|---|
| 116 | 91 | |
|---|
| 117 | 92 | phba->lpfc_mbuf_pool = dma_pool_create("lpfc_mbuf_pool", &phba->pcidev->dev, |
|---|
| 118 | 93 | LPFC_BPL_SIZE, |
|---|
| 119 | 94 | align, 0); |
|---|
| 120 | 95 | if (!phba->lpfc_mbuf_pool) |
|---|
| 121 | | - goto fail_free_dma_buf_pool; |
|---|
| 96 | + goto fail; |
|---|
| 122 | 97 | |
|---|
| 123 | 98 | pool->elements = kmalloc_array(LPFC_MBUF_POOL_SIZE, |
|---|
| 124 | 99 | sizeof(struct lpfc_dmabuf), |
|---|
| .. | .. |
|---|
| 137 | 112 | pool->current_count++; |
|---|
| 138 | 113 | } |
|---|
| 139 | 114 | |
|---|
| 140 | | - phba->mbox_mem_pool = mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE, |
|---|
| 141 | | - sizeof(LPFC_MBOXQ_t)); |
|---|
| 115 | + phba->mbox_mem_pool = mempool_create_kmalloc_pool(LPFC_MBX_POOL_SIZE, |
|---|
| 116 | + sizeof(LPFC_MBOXQ_t)); |
|---|
| 142 | 117 | if (!phba->mbox_mem_pool) |
|---|
| 143 | 118 | goto fail_free_mbuf_pool; |
|---|
| 144 | 119 | |
|---|
| .. | .. |
|---|
| 149 | 124 | |
|---|
| 150 | 125 | if (phba->sli_rev == LPFC_SLI_REV4) { |
|---|
| 151 | 126 | phba->rrq_pool = |
|---|
| 152 | | - mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE, |
|---|
| 127 | + mempool_create_kmalloc_pool(LPFC_RRQ_POOL_SIZE, |
|---|
| 153 | 128 | sizeof(struct lpfc_node_rrq)); |
|---|
| 154 | 129 | if (!phba->rrq_pool) |
|---|
| 155 | 130 | goto fail_free_nlp_mem_pool; |
|---|
| .. | .. |
|---|
| 208 | 183 | fail_free_lpfc_mbuf_pool: |
|---|
| 209 | 184 | dma_pool_destroy(phba->lpfc_mbuf_pool); |
|---|
| 210 | 185 | phba->lpfc_mbuf_pool = NULL; |
|---|
| 211 | | - fail_free_dma_buf_pool: |
|---|
| 212 | | - dma_pool_destroy(phba->lpfc_sg_dma_buf_pool); |
|---|
| 213 | | - phba->lpfc_sg_dma_buf_pool = NULL; |
|---|
| 214 | 186 | fail: |
|---|
| 215 | 187 | return -ENOMEM; |
|---|
| 216 | 188 | } |
|---|
| .. | .. |
|---|
| 248 | 220 | |
|---|
| 249 | 221 | /* Free HBQ pools */ |
|---|
| 250 | 222 | lpfc_sli_hbqbuf_free_all(phba); |
|---|
| 251 | | - if (phba->lpfc_nvmet_drb_pool) |
|---|
| 252 | | - dma_pool_destroy(phba->lpfc_nvmet_drb_pool); |
|---|
| 223 | + dma_pool_destroy(phba->lpfc_nvmet_drb_pool); |
|---|
| 253 | 224 | phba->lpfc_nvmet_drb_pool = NULL; |
|---|
| 254 | | - if (phba->lpfc_drb_pool) |
|---|
| 255 | | - dma_pool_destroy(phba->lpfc_drb_pool); |
|---|
| 256 | | - phba->lpfc_drb_pool = NULL; |
|---|
| 257 | | - if (phba->lpfc_hrb_pool) |
|---|
| 258 | | - dma_pool_destroy(phba->lpfc_hrb_pool); |
|---|
| 259 | | - phba->lpfc_hrb_pool = NULL; |
|---|
| 260 | | - if (phba->txrdy_payload_pool) |
|---|
| 261 | | - dma_pool_destroy(phba->txrdy_payload_pool); |
|---|
| 262 | | - phba->txrdy_payload_pool = NULL; |
|---|
| 263 | 225 | |
|---|
| 264 | | - if (phba->lpfc_hbq_pool) |
|---|
| 265 | | - dma_pool_destroy(phba->lpfc_hbq_pool); |
|---|
| 226 | + dma_pool_destroy(phba->lpfc_drb_pool); |
|---|
| 227 | + phba->lpfc_drb_pool = NULL; |
|---|
| 228 | + |
|---|
| 229 | + dma_pool_destroy(phba->lpfc_hrb_pool); |
|---|
| 230 | + phba->lpfc_hrb_pool = NULL; |
|---|
| 231 | + |
|---|
| 232 | + dma_pool_destroy(phba->lpfc_hbq_pool); |
|---|
| 266 | 233 | phba->lpfc_hbq_pool = NULL; |
|---|
| 267 | 234 | |
|---|
| 268 | | - if (phba->rrq_pool) |
|---|
| 269 | | - mempool_destroy(phba->rrq_pool); |
|---|
| 235 | + mempool_destroy(phba->rrq_pool); |
|---|
| 270 | 236 | phba->rrq_pool = NULL; |
|---|
| 271 | 237 | |
|---|
| 272 | 238 | /* Free NLP memory pool */ |
|---|
| .. | .. |
|---|
| 289 | 255 | |
|---|
| 290 | 256 | dma_pool_destroy(phba->lpfc_mbuf_pool); |
|---|
| 291 | 257 | phba->lpfc_mbuf_pool = NULL; |
|---|
| 292 | | - |
|---|
| 293 | | - /* Free DMA buffer memory pool */ |
|---|
| 294 | | - dma_pool_destroy(phba->lpfc_sg_dma_buf_pool); |
|---|
| 295 | | - phba->lpfc_sg_dma_buf_pool = NULL; |
|---|
| 296 | 258 | |
|---|
| 297 | 259 | /* Free Device Data memory pool */ |
|---|
| 298 | 260 | if (phba->device_data_mem_pool) { |
|---|
| .. | .. |
|---|
| 330 | 292 | |
|---|
| 331 | 293 | /* Free memory used in mailbox queue back to mailbox memory pool */ |
|---|
| 332 | 294 | list_for_each_entry_safe(mbox, next_mbox, &psli->mboxq, list) { |
|---|
| 333 | | - mp = (struct lpfc_dmabuf *) (mbox->context1); |
|---|
| 295 | + mp = (struct lpfc_dmabuf *)(mbox->ctx_buf); |
|---|
| 334 | 296 | if (mp) { |
|---|
| 335 | 297 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
|---|
| 336 | 298 | kfree(mp); |
|---|
| .. | .. |
|---|
| 340 | 302 | } |
|---|
| 341 | 303 | /* Free memory used in mailbox cmpl list back to mailbox memory pool */ |
|---|
| 342 | 304 | list_for_each_entry_safe(mbox, next_mbox, &psli->mboxq_cmpl, list) { |
|---|
| 343 | | - mp = (struct lpfc_dmabuf *) (mbox->context1); |
|---|
| 305 | + mp = (struct lpfc_dmabuf *)(mbox->ctx_buf); |
|---|
| 344 | 306 | if (mp) { |
|---|
| 345 | 307 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
|---|
| 346 | 308 | kfree(mp); |
|---|
| .. | .. |
|---|
| 354 | 316 | spin_unlock_irq(&phba->hbalock); |
|---|
| 355 | 317 | if (psli->mbox_active) { |
|---|
| 356 | 318 | mbox = psli->mbox_active; |
|---|
| 357 | | - mp = (struct lpfc_dmabuf *) (mbox->context1); |
|---|
| 319 | + mp = (struct lpfc_dmabuf *)(mbox->ctx_buf); |
|---|
| 358 | 320 | if (mp) { |
|---|
| 359 | 321 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
|---|
| 360 | 322 | kfree(mp); |
|---|
| .. | .. |
|---|
| 365 | 327 | |
|---|
| 366 | 328 | /* Free and destroy all the allocated memory pools */ |
|---|
| 367 | 329 | lpfc_mem_free(phba); |
|---|
| 330 | + |
|---|
| 331 | + /* Free DMA buffer memory pool */ |
|---|
| 332 | + dma_pool_destroy(phba->lpfc_sg_dma_buf_pool); |
|---|
| 333 | + phba->lpfc_sg_dma_buf_pool = NULL; |
|---|
| 334 | + |
|---|
| 335 | + dma_pool_destroy(phba->lpfc_cmd_rsp_buf_pool); |
|---|
| 336 | + phba->lpfc_cmd_rsp_buf_pool = NULL; |
|---|
| 368 | 337 | |
|---|
| 369 | 338 | /* Free the iocb lookup array */ |
|---|
| 370 | 339 | kfree(psli->iocbq_lookup); |
|---|
| .. | .. |
|---|
| 560 | 529 | * Description: Allocates a DMA-mapped receive buffer from the lpfc_hrb_pool PCI |
|---|
| 561 | 530 | * pool along a non-DMA-mapped container for it. |
|---|
| 562 | 531 | * |
|---|
| 532 | + * Notes: Not interrupt-safe. Must be called with no locks held. |
|---|
| 533 | + * |
|---|
| 563 | 534 | * Returns: |
|---|
| 564 | 535 | * pointer to HBQ on success |
|---|
| 565 | 536 | * NULL on failure |
|---|
| .. | .. |
|---|
| 617 | 588 | * |
|---|
| 618 | 589 | * Description: Allocates a DMA-mapped receive buffer from the lpfc_hrb_pool PCI |
|---|
| 619 | 590 | * pool along a non-DMA-mapped container for it. |
|---|
| 620 | | - * |
|---|
| 621 | | - * Notes: Not interrupt-safe. Must be called with no locks held. |
|---|
| 622 | 591 | * |
|---|
| 623 | 592 | * Returns: |
|---|
| 624 | 593 | * pointer to HBQ on success |
|---|