All of lore.kernel.org
 help / color / mirror / Atom feed
* [linux-next:pending-fixes 350/550] drivers/scsi/mpi3mr/mpi3mr_app.c:2834 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent returns '&mrioc->bsg_cmds.mutex'.
@ 2024-12-09  4:00 kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2024-12-09  4:00 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: Ranjan Kumar <ranjan.kumar@broadcom.com>
CC: "Martin K. Petersen" <martin.petersen@oracle.com>
CC: Sumit Saxena <sumit.saxena@broadcom.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git pending-fixes
head:   2152e8397622d3783e947ca02ff62d94bc5b8f9e
commit: 367ac16e5ff2dcd6b7f00a8f94e6ba98875cb397 [350/550] scsi: mpi3mr: Synchronize access to ioctl data buffer
:::::: branch date: 15 hours ago
:::::: commit date: 2 days ago
config: i386-randconfig-141-20241206 (https://download.01.org/0day-ci/archive/20241207/202412071034.OF3x0CTb-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202412071034.OF3x0CTb-lkp@intel.com/

New smatch warnings:
drivers/scsi/mpi3mr/mpi3mr_app.c:2834 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent returns '&mrioc->bsg_cmds.mutex'.

Old smatch warnings:
drivers/scsi/mpi3mr/mpi3mr_app.c:1800 mpi3mr_bsg_build_sgl() warn: missing unwind goto?
drivers/scsi/mpi3mr/mpi3mr_app.c:1800 mpi3mr_bsg_build_sgl() warn: missing unwind goto?
drivers/scsi/mpi3mr/mpi3mr_app.c:1800 mpi3mr_bsg_build_sgl() warn: missing unwind goto?
drivers/scsi/mpi3mr/mpi3mr_app.c:2711 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent indenting

vim +2834 drivers/scsi/mpi3mr/mpi3mr_app.c

fb231d7deffb41 Chandrakanth patil   2023-12-06  2223  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2224  /**
fb231d7deffb41 Chandrakanth patil   2023-12-06  2225   * mpi3mr_map_data_buffer_dma - build dma descriptors for data
fb231d7deffb41 Chandrakanth patil   2023-12-06  2226   *                              buffers
fb231d7deffb41 Chandrakanth patil   2023-12-06  2227   * @mrioc: Adapter instance reference
fb231d7deffb41 Chandrakanth patil   2023-12-06  2228   * @drv_buf: buffer map descriptor
fb231d7deffb41 Chandrakanth patil   2023-12-06  2229   * @desc_count: Number of already consumed dma descriptors
fb231d7deffb41 Chandrakanth patil   2023-12-06  2230   *
fb231d7deffb41 Chandrakanth patil   2023-12-06  2231   * This function computes how many pre-allocated DMA descriptors
fb231d7deffb41 Chandrakanth patil   2023-12-06  2232   * are required for the given data buffer and if those number of
fb231d7deffb41 Chandrakanth patil   2023-12-06  2233   * descriptors are free, then setup the mapping of the scattered
fb231d7deffb41 Chandrakanth patil   2023-12-06  2234   * DMA address to the given data buffer, if the data direction
fb231d7deffb41 Chandrakanth patil   2023-12-06  2235   * of the buffer is DMA_TO_DEVICE then the actual data is copied to
fb231d7deffb41 Chandrakanth patil   2023-12-06  2236   * the DMA buffers
fb231d7deffb41 Chandrakanth patil   2023-12-06  2237   *
fb231d7deffb41 Chandrakanth patil   2023-12-06  2238   * Return: 0 on success, -1 on failure
fb231d7deffb41 Chandrakanth patil   2023-12-06  2239   */
fb231d7deffb41 Chandrakanth patil   2023-12-06  2240  static int mpi3mr_map_data_buffer_dma(struct mpi3mr_ioc *mrioc,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2241  				      struct mpi3mr_buf_map *drv_buf,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2242  				      u16 desc_count)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2243  {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2244  	u16 i, needed_desc = drv_buf->kern_buf_len / MPI3MR_IOCTL_SGE_SIZE;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2245  	u32 buf_len = drv_buf->kern_buf_len, copied_len = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2246  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2247  	if (drv_buf->kern_buf_len % MPI3MR_IOCTL_SGE_SIZE)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2248  		needed_desc++;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2249  	if ((needed_desc + desc_count) > MPI3MR_NUM_IOCTL_SGE) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2250  		dprint_bsg_err(mrioc, "%s: DMA descriptor mapping error %d:%d:%d\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2251  			       __func__, needed_desc, desc_count, MPI3MR_NUM_IOCTL_SGE);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2252  		return -1;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2253  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2254  	drv_buf->dma_desc = kzalloc(sizeof(*drv_buf->dma_desc) * needed_desc,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2255  				    GFP_KERNEL);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2256  	if (!drv_buf->dma_desc)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2257  		return -1;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2258  	for (i = 0; i < needed_desc; i++, desc_count++) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2259  		drv_buf->dma_desc[i].addr = mrioc->ioctl_sge[desc_count].addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2260  		drv_buf->dma_desc[i].dma_addr =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2261  		    mrioc->ioctl_sge[desc_count].dma_addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2262  		if (buf_len < mrioc->ioctl_sge[desc_count].size)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2263  			drv_buf->dma_desc[i].size = buf_len;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2264  		else
fb231d7deffb41 Chandrakanth patil   2023-12-06  2265  			drv_buf->dma_desc[i].size =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2266  			    mrioc->ioctl_sge[desc_count].size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2267  		buf_len -= drv_buf->dma_desc[i].size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2268  		memset(drv_buf->dma_desc[i].addr, 0,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2269  		       mrioc->ioctl_sge[desc_count].size);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2270  		if (drv_buf->data_dir == DMA_TO_DEVICE) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2271  			memcpy(drv_buf->dma_desc[i].addr,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2272  			       drv_buf->bsg_buf + copied_len,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2273  			       drv_buf->dma_desc[i].size);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2274  			copied_len += drv_buf->dma_desc[i].size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2275  		}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2276  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2277  	drv_buf->num_dma_desc = needed_desc;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2278  	return 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2279  }
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2280  /**
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2281   * mpi3mr_bsg_process_mpt_cmds - MPI Pass through BSG handler
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2282   * @job: BSG job reference
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2283   *
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2284   * This function is the top level handler for MPI Pass through
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2285   * command, this does basic validation of the input data buffers,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2286   * identifies the given buffer types and MPI command, allocates
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2287   * DMAable memory for user given buffers, construstcs SGL
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2288   * properly and passes the command to the firmware.
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2289   *
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2290   * Once the MPI command is completed the driver copies the data
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2291   * if any and reply, sense information to user provided buffers.
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2292   * If the command is timed out then issues controller reset
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2293   * prior to returning.
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2294   *
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2295   * Return: 0 on success and proper error codes on failure
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2296   */
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2297  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2298  static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2299  {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2300  	long rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2301  	struct mpi3mr_ioc *mrioc = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2302  	u8 *mpi_req = NULL, *sense_buff_k = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2303  	u8 mpi_msg_size = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2304  	struct mpi3mr_bsg_packet *bsg_req = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2305  	struct mpi3mr_bsg_mptcmd *karg;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2306  	struct mpi3mr_buf_entry *buf_entries = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2307  	struct mpi3mr_buf_map *drv_bufs = NULL, *drv_buf_iter = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2308  	u8 count, bufcnt = 0, is_rmcb = 0, is_rmrb = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2309  	u8 din_cnt = 0, dout_cnt = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2310  	u8 invalid_be = 0, erb_offset = 0xFF, mpirep_offset = 0xFF;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2311  	u8 block_io = 0, nvme_fmt = 0, resp_code = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2312  	struct mpi3_request_header *mpi_header = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2313  	struct mpi3_status_reply_descriptor *status_desc;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2314  	struct mpi3_scsi_task_mgmt_request *tm_req;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2315  	u32 erbsz = MPI3MR_SENSE_BUF_SZ, tmplen;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2316  	u16 dev_handle;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2317  	struct mpi3mr_tgt_dev *tgtdev;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2318  	struct mpi3mr_stgt_priv_data *stgt_priv = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2319  	struct mpi3mr_bsg_in_reply_buf *bsg_reply_buf = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2320  	u32 din_size = 0, dout_size = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2321  	u8 *din_buf = NULL, *dout_buf = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2322  	u8 *sgl_iter = NULL, *sgl_din_iter = NULL, *sgl_dout_iter = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2323  	u16 rmc_size  = 0, desc_count = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2324  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2325  	bsg_req = job->request;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2326  	karg = (struct mpi3mr_bsg_mptcmd *)&bsg_req->cmd.mptcmd;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2327  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2328  	mrioc = mpi3mr_bsg_verify_adapter(karg->mrioc_id);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2329  	if (!mrioc)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2330  		return -ENODEV;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2331  
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2332  	if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex))
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2333  		return -ERESTARTSYS;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2334  
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2335  	if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2336  		dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2337  		mutex_unlock(&mrioc->bsg_cmds.mutex);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2338  		return -EAGAIN;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2339  	}
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2340  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2341  	if (!mrioc->ioctl_sges_allocated) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2342  		dprint_bsg_err(mrioc, "%s: DMA memory was not allocated\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2343  			       __func__);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2344  		return -ENOMEM;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2345  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2346  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2347  	if (karg->timeout < MPI3MR_APP_DEFAULT_TIMEOUT)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2348  		karg->timeout = MPI3MR_APP_DEFAULT_TIMEOUT;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2349  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2350  	mpi_req = kzalloc(MPI3MR_ADMIN_REQ_FRAME_SZ, GFP_KERNEL);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2351  	if (!mpi_req) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2352  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2353  		return -ENOMEM;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2354  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2355  	mpi_header = (struct mpi3_request_header *)mpi_req;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2356  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2357  	bufcnt = karg->buf_entry_list.num_of_entries;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2358  	drv_bufs = kzalloc((sizeof(*drv_bufs) * bufcnt), GFP_KERNEL);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2359  	if (!drv_bufs) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2360  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2361  		rval = -ENOMEM;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2362  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2363  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2364  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2365  	dout_buf = kzalloc(job->request_payload.payload_len,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2366  				      GFP_KERNEL);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2367  	if (!dout_buf) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2368  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2369  		rval = -ENOMEM;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2370  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2371  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2372  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2373  	din_buf = kzalloc(job->reply_payload.payload_len,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2374  				     GFP_KERNEL);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2375  	if (!din_buf) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2376  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2377  		rval = -ENOMEM;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2378  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2379  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2380  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2381  	sg_copy_to_buffer(job->request_payload.sg_list,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2382  			  job->request_payload.sg_cnt,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2383  			  dout_buf, job->request_payload.payload_len);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2384  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2385  	buf_entries = karg->buf_entry_list.buf_entry;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2386  	sgl_din_iter = din_buf;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2387  	sgl_dout_iter = dout_buf;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2388  	drv_buf_iter = drv_bufs;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2389  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2390  	for (count = 0; count < bufcnt; count++, buf_entries++, drv_buf_iter++) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2391  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2392  		switch (buf_entries->buf_type) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2393  		case MPI3MR_BSG_BUFTYPE_RAIDMGMT_CMD:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2394  			sgl_iter = sgl_dout_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2395  			sgl_dout_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2396  			drv_buf_iter->data_dir = DMA_TO_DEVICE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2397  			is_rmcb = 1;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2398  			if ((count != 0) || !buf_entries->buf_len)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2399  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2400  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2401  		case MPI3MR_BSG_BUFTYPE_RAIDMGMT_RESP:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2402  			sgl_iter = sgl_din_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2403  			sgl_din_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2404  			drv_buf_iter->data_dir = DMA_FROM_DEVICE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2405  			is_rmrb = 1;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2406  			if (count != 1 || !is_rmcb || !buf_entries->buf_len)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2407  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2408  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2409  		case MPI3MR_BSG_BUFTYPE_DATA_IN:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2410  			sgl_iter = sgl_din_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2411  			sgl_din_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2412  			drv_buf_iter->data_dir = DMA_FROM_DEVICE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2413  			din_cnt++;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2414  			din_size += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2415  			if ((din_cnt > 1) && !is_rmcb)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2416  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2417  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2418  		case MPI3MR_BSG_BUFTYPE_DATA_OUT:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2419  			sgl_iter = sgl_dout_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2420  			sgl_dout_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2421  			drv_buf_iter->data_dir = DMA_TO_DEVICE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2422  			dout_cnt++;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2423  			dout_size += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2424  			if ((dout_cnt > 1) && !is_rmcb)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2425  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2426  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2427  		case MPI3MR_BSG_BUFTYPE_MPI_REPLY:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2428  			sgl_iter = sgl_din_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2429  			sgl_din_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2430  			drv_buf_iter->data_dir = DMA_NONE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2431  			mpirep_offset = count;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2432  			if (!buf_entries->buf_len)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2433  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2434  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2435  		case MPI3MR_BSG_BUFTYPE_ERR_RESPONSE:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2436  			sgl_iter = sgl_din_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2437  			sgl_din_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2438  			drv_buf_iter->data_dir = DMA_NONE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2439  			erb_offset = count;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2440  			if (!buf_entries->buf_len)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2441  				invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2442  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2443  		case MPI3MR_BSG_BUFTYPE_MPI_REQUEST:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2444  			sgl_iter = sgl_dout_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2445  			sgl_dout_iter += buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2446  			drv_buf_iter->data_dir = DMA_NONE;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2447  			mpi_msg_size = buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2448  			if ((!mpi_msg_size || (mpi_msg_size % 4)) ||
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2449  					(mpi_msg_size > MPI3MR_ADMIN_REQ_FRAME_SZ)) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2450  				dprint_bsg_err(mrioc, "%s: invalid MPI message size\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2451  					__func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2452  				mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2453  				rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2454  				goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2455  			}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2456  			memcpy(mpi_req, sgl_iter, buf_entries->buf_len);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2457  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2458  		default:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2459  			invalid_be = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2460  			break;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2461  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2462  		if (invalid_be) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2463  			dprint_bsg_err(mrioc, "%s: invalid buffer entries passed\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2464  				__func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2465  			mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2466  			rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2467  			goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2468  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2469  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2470  		if (sgl_dout_iter > (dout_buf + job->request_payload.payload_len)) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2471  			dprint_bsg_err(mrioc, "%s: data_out buffer length mismatch\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2472  				       __func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2473  			mutex_unlock(&mrioc->bsg_cmds.mutex);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2474  			rval = -EINVAL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2475  			goto out;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2476  		}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2477  		if (sgl_din_iter > (din_buf + job->reply_payload.payload_len)) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2478  			dprint_bsg_err(mrioc, "%s: data_in buffer length mismatch\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2479  				       __func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2480  			mutex_unlock(&mrioc->bsg_cmds.mutex);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2481  			rval = -EINVAL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2482  			goto out;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2483  		}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2484  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2485  		drv_buf_iter->bsg_buf = sgl_iter;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2486  		drv_buf_iter->bsg_buf_len = buf_entries->buf_len;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2487  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2488  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2489  	if (is_rmcb && ((din_size + dout_size) > MPI3MR_MAX_APP_XFER_SIZE)) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2490  		dprint_bsg_err(mrioc, "%s:%d: invalid data transfer size passed for function 0x%x din_size = %d, dout_size = %d\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2491  			       __func__, __LINE__, mpi_header->function, din_size,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2492  			       dout_size);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2493  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2494  		rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2495  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2496  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2497  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2498  	if (din_size > MPI3MR_MAX_APP_XFER_SIZE) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2499  		dprint_bsg_err(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2500  		    "%s:%d: invalid data transfer size passed for function 0x%x din_size=%d\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2501  		    __func__, __LINE__, mpi_header->function, din_size);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2502  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2503  		rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2504  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2505  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2506  	if (dout_size > MPI3MR_MAX_APP_XFER_SIZE) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2507  		dprint_bsg_err(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2508  		    "%s:%d: invalid data transfer size passed for function 0x%x dout_size = %d\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2509  		    __func__, __LINE__, mpi_header->function, dout_size);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2510  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2511  		rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2512  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2513  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2514  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2515  	if (mpi_header->function == MPI3_BSG_FUNCTION_SMP_PASSTHROUGH) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2516  		if (din_size > MPI3MR_IOCTL_SGE_SIZE ||
fb231d7deffb41 Chandrakanth patil   2023-12-06  2517  		    dout_size > MPI3MR_IOCTL_SGE_SIZE) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2518  			dprint_bsg_err(mrioc, "%s:%d: invalid message size passed:%d:%d:%d:%d\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2519  				       __func__, __LINE__, din_cnt, dout_cnt, din_size,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2520  			    dout_size);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2521  			mutex_unlock(&mrioc->bsg_cmds.mutex);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2522  			rval = -EINVAL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2523  			goto out;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2524  		}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2525  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2526  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2527  	drv_buf_iter = drv_bufs;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2528  	for (count = 0; count < bufcnt; count++, drv_buf_iter++) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2529  		if (drv_buf_iter->data_dir == DMA_NONE)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2530  			continue;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2531  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2532  		drv_buf_iter->kern_buf_len = drv_buf_iter->bsg_buf_len;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2533  		if (is_rmcb && !count) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2534  			drv_buf_iter->kern_buf_len =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2535  			    mrioc->ioctl_chain_sge.size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2536  			drv_buf_iter->kern_buf =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2537  			    mrioc->ioctl_chain_sge.addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2538  			drv_buf_iter->kern_buf_dma =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2539  			    mrioc->ioctl_chain_sge.dma_addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2540  			drv_buf_iter->dma_desc = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2541  			drv_buf_iter->num_dma_desc = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2542  			memset(drv_buf_iter->kern_buf, 0,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2543  			       drv_buf_iter->kern_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2544  			tmplen = min(drv_buf_iter->kern_buf_len,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2545  				     drv_buf_iter->bsg_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2546  			rmc_size = tmplen;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2547  			memcpy(drv_buf_iter->kern_buf, drv_buf_iter->bsg_buf, tmplen);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2548  		} else if (is_rmrb && (count == 1)) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2549  			drv_buf_iter->kern_buf_len =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2550  			    mrioc->ioctl_resp_sge.size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2551  			drv_buf_iter->kern_buf =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2552  			    mrioc->ioctl_resp_sge.addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2553  			drv_buf_iter->kern_buf_dma =
fb231d7deffb41 Chandrakanth patil   2023-12-06  2554  			    mrioc->ioctl_resp_sge.dma_addr;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2555  			drv_buf_iter->dma_desc = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2556  			drv_buf_iter->num_dma_desc = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2557  			memset(drv_buf_iter->kern_buf, 0,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2558  			       drv_buf_iter->kern_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2559  			tmplen = min(drv_buf_iter->kern_buf_len,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2560  				     drv_buf_iter->bsg_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2561  			drv_buf_iter->kern_buf_len = tmplen;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2562  			memset(drv_buf_iter->bsg_buf, 0,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2563  			       drv_buf_iter->bsg_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2564  		} else {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2565  			if (!drv_buf_iter->kern_buf_len)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2566  				continue;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2567  			if (mpi3mr_map_data_buffer_dma(mrioc, drv_buf_iter, desc_count)) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2568  				rval = -ENOMEM;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2569  				mutex_unlock(&mrioc->bsg_cmds.mutex);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2570  				dprint_bsg_err(mrioc, "%s:%d: mapping data buffers failed\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2571  					       __func__, __LINE__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2572  			goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2573  		}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2574  			desc_count += drv_buf_iter->num_dma_desc;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2575  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2576  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2577  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2578  	if (erb_offset != 0xFF) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2579  		sense_buff_k = kzalloc(erbsz, GFP_KERNEL);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2580  		if (!sense_buff_k) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2581  			rval = -ENOMEM;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2582  			mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2583  			goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2584  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2585  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2586  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2587  	if (mrioc->unrecoverable) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2588  		dprint_bsg_err(mrioc, "%s: unrecoverable controller\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2589  		    __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2590  		rval = -EFAULT;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2591  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2592  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2593  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2594  	if (mrioc->reset_in_progress) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2595  		dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2596  		rval = -EAGAIN;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2597  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2598  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2599  	}
1c342b0548e3f5 Sumit Saxena         2024-06-27  2600  	if (mrioc->stop_bsgs || mrioc->block_on_pci_err) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2601  		dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2602  		rval = -EAGAIN;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2603  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2604  		goto out;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2605  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2606  
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2607  	if (mpi_header->function == MPI3_BSG_FUNCTION_NVME_ENCAPSULATED) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2608  		nvme_fmt = mpi3mr_get_nvme_data_fmt(
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2609  			(struct mpi3_nvme_encapsulated_request *)mpi_req);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2610  		if (nvme_fmt == MPI3MR_NVME_DATA_FORMAT_PRP) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2611  			if (mpi3mr_build_nvme_prp(mrioc,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2612  			    (struct mpi3_nvme_encapsulated_request *)mpi_req,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2613  			    drv_bufs, bufcnt)) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2614  				rval = -ENOMEM;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2615  				mutex_unlock(&mrioc->bsg_cmds.mutex);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2616  				goto out;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2617  			}
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2618  		} else if (nvme_fmt == MPI3MR_NVME_DATA_FORMAT_SGL1 ||
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2619  			nvme_fmt == MPI3MR_NVME_DATA_FORMAT_SGL2) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2620  			if (mpi3mr_build_nvme_sgl(mrioc,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2621  			    (struct mpi3_nvme_encapsulated_request *)mpi_req,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2622  			    drv_bufs, bufcnt)) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2623  				rval = -EINVAL;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2624  				mutex_unlock(&mrioc->bsg_cmds.mutex);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2625  				goto out;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2626  			}
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2627  		} else {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2628  			dprint_bsg_err(mrioc,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2629  			    "%s:invalid NVMe command format\n", __func__);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2630  			rval = -EINVAL;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2631  			mutex_unlock(&mrioc->bsg_cmds.mutex);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2632  			goto out;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2633  		}
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2634  	} else {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2635  		if (mpi3mr_bsg_build_sgl(mrioc, mpi_req, mpi_msg_size,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2636  					 drv_bufs, bufcnt, is_rmcb, is_rmrb,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2637  					 (dout_cnt + din_cnt))) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2638  			dprint_bsg_err(mrioc, "%s: sgl build failed\n", __func__);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2639  			rval = -EAGAIN;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2640  			mutex_unlock(&mrioc->bsg_cmds.mutex);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2641  			goto out;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2642  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2643  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2644  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2645  	if (mpi_header->function == MPI3_BSG_FUNCTION_SCSI_TASK_MGMT) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2646  		tm_req = (struct mpi3_scsi_task_mgmt_request *)mpi_req;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2647  		if (tm_req->task_type !=
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2648  		    MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2649  			dev_handle = tm_req->dev_handle;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2650  			block_io = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2651  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2652  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2653  	if (block_io) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2654  		tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2655  		if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2656  			stgt_priv = (struct mpi3mr_stgt_priv_data *)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2657  			    tgtdev->starget->hostdata;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2658  			atomic_inc(&stgt_priv->block_io);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2659  			mpi3mr_tgtdev_put(tgtdev);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2660  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2661  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2662  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2663  	mrioc->bsg_cmds.state = MPI3MR_CMD_PENDING;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2664  	mrioc->bsg_cmds.is_waiting = 1;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2665  	mrioc->bsg_cmds.callback = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2666  	mrioc->bsg_cmds.is_sense = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2667  	mrioc->bsg_cmds.sensebuf = sense_buff_k;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2668  	memset(mrioc->bsg_cmds.reply, 0, mrioc->reply_sz);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2669  	mpi_header->host_tag = cpu_to_le16(MPI3MR_HOSTTAG_BSG_CMDS);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2670  	if (mrioc->logging_level & MPI3_DEBUG_BSG_INFO) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2671  		dprint_bsg_info(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2672  		    "%s: posting bsg request to the controller\n", __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2673  		dprint_dump(mpi_req, MPI3MR_ADMIN_REQ_FRAME_SZ,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2674  		    "bsg_mpi3_req");
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2675  		if (mpi_header->function == MPI3_BSG_FUNCTION_MGMT_PASSTHROUGH) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2676  			drv_buf_iter = &drv_bufs[0];
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2677  			dprint_dump(drv_buf_iter->kern_buf,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2678  			    rmc_size, "mpi3_mgmt_req");
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2679  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2680  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2681  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2682  	init_completion(&mrioc->bsg_cmds.done);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2683  	rval = mpi3mr_admin_request_post(mrioc, mpi_req,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2684  	    MPI3MR_ADMIN_REQ_FRAME_SZ, 0);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2685  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2686  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2687  	if (rval) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2688  		mrioc->bsg_cmds.is_waiting = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2689  		dprint_bsg_err(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2690  		    "%s: posting bsg request is failed\n", __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2691  		rval = -EAGAIN;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2692  		goto out_unlock;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2693  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2694  	wait_for_completion_timeout(&mrioc->bsg_cmds.done,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2695  	    (karg->timeout * HZ));
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2696  	if (block_io && stgt_priv)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2697  		atomic_dec(&stgt_priv->block_io);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2698  	if (!(mrioc->bsg_cmds.state & MPI3MR_CMD_COMPLETE)) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2699  		mrioc->bsg_cmds.is_waiting = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2700  		rval = -EAGAIN;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2701  		if (mrioc->bsg_cmds.state & MPI3MR_CMD_RESET)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2702  			goto out_unlock;
0a2714b787b911 Ranjan Kumar         2024-03-13  2703  		if (((mpi_header->function != MPI3_FUNCTION_SCSI_IO) &&
0a2714b787b911 Ranjan Kumar         2024-03-13  2704  		    (mpi_header->function != MPI3_FUNCTION_NVME_ENCAPSULATED))
0a2714b787b911 Ranjan Kumar         2024-03-13  2705  		    || (mrioc->logging_level & MPI3_DEBUG_BSG_ERROR)) {
0a2714b787b911 Ranjan Kumar         2024-03-13  2706  			ioc_info(mrioc, "%s: bsg request timedout after %d seconds\n",
0a2714b787b911 Ranjan Kumar         2024-03-13  2707  			    __func__, karg->timeout);
0a2714b787b911 Ranjan Kumar         2024-03-13  2708  			if (!(mrioc->logging_level & MPI3_DEBUG_BSG_INFO)) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2709  				dprint_dump(mpi_req, MPI3MR_ADMIN_REQ_FRAME_SZ,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2710  			    "bsg_mpi3_req");
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2711  			if (mpi_header->function ==
0a2714b787b911 Ranjan Kumar         2024-03-13  2712  			    MPI3_FUNCTION_MGMT_PASSTHROUGH) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2713  				drv_buf_iter = &drv_bufs[0];
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2714  				dprint_dump(drv_buf_iter->kern_buf,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2715  				    rmc_size, "mpi3_mgmt_req");
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2716  				}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2717  			}
0a2714b787b911 Ranjan Kumar         2024-03-13  2718  		}
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2719  		if ((mpi_header->function == MPI3_BSG_FUNCTION_NVME_ENCAPSULATED) ||
0a2714b787b911 Ranjan Kumar         2024-03-13  2720  			(mpi_header->function == MPI3_BSG_FUNCTION_SCSI_IO)) {
0a2714b787b911 Ranjan Kumar         2024-03-13  2721  			dprint_bsg_err(mrioc, "%s: bsg request timedout after %d seconds,\n"
0a2714b787b911 Ranjan Kumar         2024-03-13  2722  				"issuing target reset to (0x%04x)\n", __func__,
0a2714b787b911 Ranjan Kumar         2024-03-13  2723  				karg->timeout, mpi_header->function_dependent);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2724  			mpi3mr_issue_tm(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2725  			    MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2726  			    mpi_header->function_dependent, 0,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2727  			    MPI3MR_HOSTTAG_BLK_TMS, MPI3MR_RESETTM_TIMEOUT,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2728  			    &mrioc->host_tm_cmds, &resp_code, NULL);
0a2714b787b911 Ranjan Kumar         2024-03-13  2729  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2730  		if (!(mrioc->bsg_cmds.state & MPI3MR_CMD_COMPLETE) &&
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2731  		    !(mrioc->bsg_cmds.state & MPI3MR_CMD_RESET))
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2732  			mpi3mr_soft_reset_handler(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2733  			    MPI3MR_RESET_FROM_APP_TIMEOUT, 1);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2734  		goto out_unlock;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2735  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2736  	dprint_bsg_info(mrioc, "%s: bsg request is completed\n", __func__);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2737  
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2738  	if (mrioc->prp_list_virt) {
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2739  		dma_free_coherent(&mrioc->pdev->dev, mrioc->prp_sz,
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2740  		    mrioc->prp_list_virt, mrioc->prp_list_dma);
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2741  		mrioc->prp_list_virt = NULL;
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2742  	}
7dbd0dd8cde356 Sumit Saxena         2022-04-29  2743  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2744  	if ((mrioc->bsg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2745  	     != MPI3_IOCSTATUS_SUCCESS) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2746  		dprint_bsg_info(mrioc,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2747  		    "%s: command failed, ioc_status(0x%04x) log_info(0x%08x)\n",
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2748  		    __func__,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2749  		    (mrioc->bsg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK),
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2750  		    mrioc->bsg_cmds.ioc_loginfo);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2751  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2752  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2753  	if ((mpirep_offset != 0xFF) &&
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2754  	    drv_bufs[mpirep_offset].bsg_buf_len) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2755  		drv_buf_iter = &drv_bufs[mpirep_offset];
429846b4b6ce98 Shin'ichiro Kawasaki 2024-03-23  2756  		drv_buf_iter->kern_buf_len = (sizeof(*bsg_reply_buf) +
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2757  					   mrioc->reply_sz);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2758  		bsg_reply_buf = kzalloc(drv_buf_iter->kern_buf_len, GFP_KERNEL);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2759  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2760  		if (!bsg_reply_buf) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2761  			rval = -ENOMEM;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2762  			goto out_unlock;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2763  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2764  		if (mrioc->bsg_cmds.state & MPI3MR_CMD_REPLY_VALID) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2765  			bsg_reply_buf->mpi_reply_type =
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2766  				MPI3MR_BSG_MPI_REPLY_BUFTYPE_ADDRESS;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2767  			memcpy(bsg_reply_buf->reply_buf,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2768  			    mrioc->bsg_cmds.reply, mrioc->reply_sz);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2769  		} else {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2770  			bsg_reply_buf->mpi_reply_type =
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2771  				MPI3MR_BSG_MPI_REPLY_BUFTYPE_STATUS;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2772  			status_desc = (struct mpi3_status_reply_descriptor *)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2773  			    bsg_reply_buf->reply_buf;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2774  			status_desc->ioc_status = mrioc->bsg_cmds.ioc_status;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2775  			status_desc->ioc_log_info = mrioc->bsg_cmds.ioc_loginfo;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2776  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2777  		tmplen = min(drv_buf_iter->kern_buf_len,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2778  			drv_buf_iter->bsg_buf_len);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2779  		memcpy(drv_buf_iter->bsg_buf, bsg_reply_buf, tmplen);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2780  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2781  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2782  	if (erb_offset != 0xFF && mrioc->bsg_cmds.sensebuf &&
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2783  	    mrioc->bsg_cmds.is_sense) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2784  		drv_buf_iter = &drv_bufs[erb_offset];
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2785  		tmplen = min(erbsz, drv_buf_iter->bsg_buf_len);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2786  		memcpy(drv_buf_iter->bsg_buf, sense_buff_k, tmplen);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2787  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2788  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2789  	drv_buf_iter = drv_bufs;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2790  	for (count = 0; count < bufcnt; count++, drv_buf_iter++) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2791  		if (drv_buf_iter->data_dir == DMA_NONE)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2792  			continue;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2793  		if ((count == 1) && is_rmrb) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2794  			memcpy(drv_buf_iter->bsg_buf,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2795  			    drv_buf_iter->kern_buf,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2796  			    drv_buf_iter->kern_buf_len);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2797  		} else if (drv_buf_iter->data_dir == DMA_FROM_DEVICE) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2798  			tmplen = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2799  			for (desc_count = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2800  			    desc_count < drv_buf_iter->num_dma_desc;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2801  			    desc_count++) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2802  				memcpy(((u8 *)drv_buf_iter->bsg_buf + tmplen),
fb231d7deffb41 Chandrakanth patil   2023-12-06  2803  				       drv_buf_iter->dma_desc[desc_count].addr,
fb231d7deffb41 Chandrakanth patil   2023-12-06  2804  				       drv_buf_iter->dma_desc[desc_count].size);
fb231d7deffb41 Chandrakanth patil   2023-12-06  2805  				tmplen +=
fb231d7deffb41 Chandrakanth patil   2023-12-06  2806  				    drv_buf_iter->dma_desc[desc_count].size;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2807  		}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2808  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2809  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2810  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2811  out_unlock:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2812  	if (din_buf) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2813  		job->reply_payload_rcv_len =
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2814  			sg_copy_from_buffer(job->reply_payload.sg_list,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2815  					    job->reply_payload.sg_cnt,
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2816  					    din_buf, job->reply_payload.payload_len);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2817  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2818  	mrioc->bsg_cmds.is_sense = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2819  	mrioc->bsg_cmds.sensebuf = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2820  	mrioc->bsg_cmds.state = MPI3MR_CMD_NOTUSED;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2821  	mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2822  out:
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2823  	kfree(sense_buff_k);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2824  	kfree(dout_buf);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2825  	kfree(din_buf);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2826  	kfree(mpi_req);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2827  	if (drv_bufs) {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2828  		drv_buf_iter = drv_bufs;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2829  		for (count = 0; count < bufcnt; count++, drv_buf_iter++)
fb231d7deffb41 Chandrakanth patil   2023-12-06  2830  			kfree(drv_buf_iter->dma_desc);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2831  		kfree(drv_bufs);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2832  	}
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2833  	kfree(bsg_reply_buf);
506bc1a0d6ba62 Sumit Saxena         2022-04-29 @2834  	return rval;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2835  }
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2836  

:::::: The code at line 2834 was first introduced by commit
:::::: 506bc1a0d6ba626492c06e5632a3fbe202770fd2 scsi: mpi3mr: Add support for MPT commands

:::::: TO: Sumit Saxena <sumit.saxena@broadcom.com>
:::::: CC: Martin K. Petersen <martin.petersen@oracle.com>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [linux-next:pending-fixes 350/550] drivers/scsi/mpi3mr/mpi3mr_app.c:2834 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent returns '&mrioc->bsg_cmds.mutex'.
@ 2024-12-09  5:50 Dan Carpenter
  0 siblings, 0 replies; 2+ messages in thread
From: Dan Carpenter @ 2024-12-09  5:50 UTC (permalink / raw)
  To: oe-kbuild, Ranjan Kumar
  Cc: lkp, oe-kbuild-all, Martin K. Petersen, Sumit Saxena

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git pending-fixes
head:   2152e8397622d3783e947ca02ff62d94bc5b8f9e
commit: 367ac16e5ff2dcd6b7f00a8f94e6ba98875cb397 [350/550] scsi: mpi3mr: Synchronize access to ioctl data buffer
config: i386-randconfig-141-20241206 (https://download.01.org/0day-ci/archive/20241207/202412071034.OF3x0CTb-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202412071034.OF3x0CTb-lkp@intel.com/

New smatch warnings:
drivers/scsi/mpi3mr/mpi3mr_app.c:2834 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent returns '&mrioc->bsg_cmds.mutex'.

vim +2834 drivers/scsi/mpi3mr/mpi3mr_app.c

fb231d7deffb41 Chandrakanth patil   2023-12-06  2298  static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2299  {
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2300  	long rval = -EINVAL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2301  	struct mpi3mr_ioc *mrioc = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2302  	u8 *mpi_req = NULL, *sense_buff_k = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2303  	u8 mpi_msg_size = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2304  	struct mpi3mr_bsg_packet *bsg_req = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2305  	struct mpi3mr_bsg_mptcmd *karg;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2306  	struct mpi3mr_buf_entry *buf_entries = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2307  	struct mpi3mr_buf_map *drv_bufs = NULL, *drv_buf_iter = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2308  	u8 count, bufcnt = 0, is_rmcb = 0, is_rmrb = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2309  	u8 din_cnt = 0, dout_cnt = 0;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2310  	u8 invalid_be = 0, erb_offset = 0xFF, mpirep_offset = 0xFF;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2311  	u8 block_io = 0, nvme_fmt = 0, resp_code = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2312  	struct mpi3_request_header *mpi_header = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2313  	struct mpi3_status_reply_descriptor *status_desc;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2314  	struct mpi3_scsi_task_mgmt_request *tm_req;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2315  	u32 erbsz = MPI3MR_SENSE_BUF_SZ, tmplen;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2316  	u16 dev_handle;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2317  	struct mpi3mr_tgt_dev *tgtdev;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2318  	struct mpi3mr_stgt_priv_data *stgt_priv = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2319  	struct mpi3mr_bsg_in_reply_buf *bsg_reply_buf = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2320  	u32 din_size = 0, dout_size = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2321  	u8 *din_buf = NULL, *dout_buf = NULL;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2322  	u8 *sgl_iter = NULL, *sgl_din_iter = NULL, *sgl_dout_iter = NULL;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2323  	u16 rmc_size  = 0, desc_count = 0;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2324  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2325  	bsg_req = job->request;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2326  	karg = (struct mpi3mr_bsg_mptcmd *)&bsg_req->cmd.mptcmd;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2327  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2328  	mrioc = mpi3mr_bsg_verify_adapter(karg->mrioc_id);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2329  	if (!mrioc)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2330  		return -ENODEV;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2331  
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2332  	if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex))
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2333  		return -ERESTARTSYS;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2334  
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2335  	if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2336  		dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2337  		mutex_unlock(&mrioc->bsg_cmds.mutex);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2338  		return -EAGAIN;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2339  	}
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2340  
fb231d7deffb41 Chandrakanth patil   2023-12-06  2341  	if (!mrioc->ioctl_sges_allocated) {
fb231d7deffb41 Chandrakanth patil   2023-12-06  2342  		dprint_bsg_err(mrioc, "%s: DMA memory was not allocated\n",
fb231d7deffb41 Chandrakanth patil   2023-12-06  2343  			       __func__);

mutex_unlock(&mrioc->bsg_cmds.mutex) before returning

fb231d7deffb41 Chandrakanth patil   2023-12-06  2344  		return -ENOMEM;
fb231d7deffb41 Chandrakanth patil   2023-12-06  2345  	}
fb231d7deffb41 Chandrakanth patil   2023-12-06  2346  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2347  	if (karg->timeout < MPI3MR_APP_DEFAULT_TIMEOUT)
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2348  		karg->timeout = MPI3MR_APP_DEFAULT_TIMEOUT;
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2349  
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2350  	mpi_req = kzalloc(MPI3MR_ADMIN_REQ_FRAME_SZ, GFP_KERNEL);
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2351  	if (!mpi_req) {
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2352  		mutex_unlock(&mrioc->bsg_cmds.mutex);
506bc1a0d6ba62 Sumit Saxena         2022-04-29  2353  		return -ENOMEM;
367ac16e5ff2dc Ranjan Kumar         2024-11-11  2354  	}

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-12-09  5:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-09  4:00 [linux-next:pending-fixes 350/550] drivers/scsi/mpi3mr/mpi3mr_app.c:2834 mpi3mr_bsg_process_mpt_cmds() warn: inconsistent returns '&mrioc->bsg_cmds.mutex' kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2024-12-09  5:50 Dan Carpenter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.