.. | .. |
---|
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 |
---|