Skip to content

Commit 2a2d391

Browse files
committed
scsi: mpi3mr: NVMe encapsulation support for tri-mode HBA
1 parent 36de33b commit 2a2d391

File tree

4 files changed

+465
-9
lines changed

4 files changed

+465
-9
lines changed

drivers/scsi/mpi3mr/mpi3mr.h

+12
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
#include "mpi/mpi30_pci.h"
5151
#include "mpi/mpi30_tool.h"
5252
#include "mpi3mr_debug.h"
53+
#include <linux/nvme.h>
54+
#include <linux/nvme_ioctl.h>
5355

5456
/* Global list and lock for storing multiple adapters managed by the driver */
5557
extern spinlock_t mrioc_list_lock;
@@ -1483,6 +1485,16 @@ extern const struct attribute_group *mpi3mr_dev_groups[];
14831485
extern struct sas_function_template mpi3mr_transport_functions;
14841486
extern struct scsi_transport_template *mpi3mr_transport_template;
14851487

1488+
int mpi3mr_build_nvme_sgl(struct mpi3mr_ioc *mrioc,
1489+
struct mpi3_nvme_encapsulated_request *nvme_encap_request,
1490+
struct mpi3mr_buf_map *drv_bufs, u8 bufcnt);
1491+
int mpi3mr_build_nvme_prp(struct mpi3mr_ioc *mrioc,
1492+
struct mpi3_nvme_encapsulated_request *nvme_encap_request,
1493+
struct mpi3mr_buf_map *drv_bufs, u8 bufcnt);
1494+
unsigned int mpi3mr_get_nvme_data_fmt(
1495+
struct mpi3_nvme_encapsulated_request *nvme_encap_request);
1496+
int mpi3mr_map_data_buffer_dma(struct mpi3mr_ioc *mrioc,
1497+
struct mpi3mr_buf_map *drv_buf, u16 desc_count, void *ubuf);
14861498
int mpi3mr_cfg_get_dev_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
14871499
struct mpi3_device_page0 *dev_pg0, u16 pg_sz, u32 form, u32 form_spec);
14881500
int mpi3mr_cfg_get_sas_phy_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,

drivers/scsi/mpi3mr/mpi3mr_app.c

+16-9
Original file line numberDiff line numberDiff line change
@@ -1843,7 +1843,7 @@ static int mpi3mr_bsg_build_sgl(struct mpi3mr_ioc *mrioc, u8 *mpi_req,
18431843
*
18441844
* Return: Data format of the NVMe command (PRP/SGL etc)
18451845
*/
1846-
static unsigned int mpi3mr_get_nvme_data_fmt(
1846+
unsigned int mpi3mr_get_nvme_data_fmt(
18471847
struct mpi3_nvme_encapsulated_request *nvme_encap_request)
18481848
{
18491849
u8 format = 0;
@@ -1866,7 +1866,7 @@ static unsigned int mpi3mr_get_nvme_data_fmt(
18661866
*
18671867
* Return: 0 on success, -1 on failure
18681868
*/
1869-
static int mpi3mr_build_nvme_sgl(struct mpi3mr_ioc *mrioc,
1869+
int mpi3mr_build_nvme_sgl(struct mpi3mr_ioc *mrioc,
18701870
struct mpi3_nvme_encapsulated_request *nvme_encap_request,
18711871
struct mpi3mr_buf_map *drv_bufs, u8 bufcnt)
18721872
{
@@ -1963,7 +1963,7 @@ static int mpi3mr_build_nvme_sgl(struct mpi3mr_ioc *mrioc,
19631963
*
19641964
* Return: 0 on success, -1 on failure
19651965
*/
1966-
static int mpi3mr_build_nvme_prp(struct mpi3mr_ioc *mrioc,
1966+
int mpi3mr_build_nvme_prp(struct mpi3mr_ioc *mrioc,
19671967
struct mpi3_nvme_encapsulated_request *nvme_encap_request,
19681968
struct mpi3mr_buf_map *drv_bufs, u8 bufcnt)
19691969
{
@@ -2237,9 +2237,9 @@ static int mpi3mr_build_nvme_prp(struct mpi3mr_ioc *mrioc,
22372237
*
22382238
* Return: 0 on success, -1 on failure
22392239
*/
2240-
static int mpi3mr_map_data_buffer_dma(struct mpi3mr_ioc *mrioc,
2240+
int mpi3mr_map_data_buffer_dma(struct mpi3mr_ioc *mrioc,
22412241
struct mpi3mr_buf_map *drv_buf,
2242-
u16 desc_count)
2242+
u16 desc_count, void *ubuf)
22432243
{
22442244
u16 i, needed_desc = drv_buf->kern_buf_len / MPI3MR_IOCTL_SGE_SIZE;
22452245
u32 buf_len = drv_buf->kern_buf_len, copied_len = 0;
@@ -2268,9 +2268,15 @@ static int mpi3mr_map_data_buffer_dma(struct mpi3mr_ioc *mrioc,
22682268
memset(drv_buf->dma_desc[i].addr, 0,
22692269
mrioc->ioctl_sge[desc_count].size);
22702270
if (drv_buf->data_dir == DMA_TO_DEVICE) {
2271-
memcpy(drv_buf->dma_desc[i].addr,
2272-
drv_buf->bsg_buf + copied_len,
2273-
drv_buf->dma_desc[i].size);
2271+
if (ubuf) {
2272+
if (copy_from_user(drv_buf->dma_desc[i].addr,
2273+
ubuf + copied_len, drv_buf->dma_desc[i].size))
2274+
return (-EFAULT);
2275+
} else {
2276+
memcpy(drv_buf->dma_desc[i].addr,
2277+
drv_buf->bsg_buf + copied_len,
2278+
drv_buf->dma_desc[i].size);
2279+
}
22742280
copied_len += drv_buf->dma_desc[i].size;
22752281
}
22762282
}
@@ -2564,7 +2570,8 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
25642570
} else {
25652571
if (!drv_buf_iter->kern_buf_len)
25662572
continue;
2567-
if (mpi3mr_map_data_buffer_dma(mrioc, drv_buf_iter, desc_count)) {
2573+
if (mpi3mr_map_data_buffer_dma(mrioc, drv_buf_iter,
2574+
desc_count, NULL)) {
25682575
rval = -ENOMEM;
25692576
mutex_unlock(&mrioc->bsg_cmds.mutex);
25702577
dprint_bsg_err(mrioc, "%s:%d: mapping data buffers failed\n",

0 commit comments

Comments
 (0)