Skip to content

Commit 711201a

Browse files
Ranjan Kumarmartinkpetersen
authored andcommitted
scsi: mpi3mr: Fix corrupt config pages PHY state is switched in sysfs
The driver, through the SAS transport, exposes a sysfs interface to enable/disable PHYs in a controller/expander setup. When multiple PHYs are disabled and enabled in rapid succession, the persistent and current config pages related to SAS IO unit/SAS Expander pages could get corrupted. Use separate memory for each config request. Signed-off-by: Prayas Patel <[email protected]> Signed-off-by: Ranjan Kumar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 367ac16 commit 711201a

File tree

2 files changed

+13
-77
lines changed

2 files changed

+13
-77
lines changed

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,6 @@ extern atomic64_t event_counter;
134134

135135
#define MPI3MR_WATCHDOG_INTERVAL 1000 /* in milli seconds */
136136

137-
#define MPI3MR_DEFAULT_CFG_PAGE_SZ 1024 /* in bytes */
138-
139137
#define MPI3MR_RESET_TOPOLOGY_SETTLE_TIME 10
140138

141139
#define MPI3MR_SCMD_TIMEOUT (60 * HZ)
@@ -1133,9 +1131,6 @@ struct scmd_priv {
11331131
* @io_throttle_low: I/O size to stop throttle in 512b blocks
11341132
* @num_io_throttle_group: Maximum number of throttle groups
11351133
* @throttle_groups: Pointer to throttle group info structures
1136-
* @cfg_page: Default memory for configuration pages
1137-
* @cfg_page_dma: Configuration page DMA address
1138-
* @cfg_page_sz: Default configuration page memory size
11391134
* @sas_transport_enabled: SAS transport enabled or not
11401135
* @scsi_device_channel: Channel ID for SCSI devices
11411136
* @transport_cmds: Command tracker for SAS transport commands
@@ -1332,10 +1327,6 @@ struct mpi3mr_ioc {
13321327
u16 num_io_throttle_group;
13331328
struct mpi3mr_throttle_group_info *throttle_groups;
13341329

1335-
void *cfg_page;
1336-
dma_addr_t cfg_page_dma;
1337-
u16 cfg_page_sz;
1338-
13391330
u8 sas_transport_enabled;
13401331
u8 scsi_device_channel;
13411332
struct mpi3mr_drv_cmd transport_cmds;

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 13 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -4186,17 +4186,6 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
41864186
mpi3mr_read_tsu_interval(mrioc);
41874187
mpi3mr_print_ioc_info(mrioc);
41884188

4189-
if (!mrioc->cfg_page) {
4190-
dprint_init(mrioc, "allocating config page buffers\n");
4191-
mrioc->cfg_page_sz = MPI3MR_DEFAULT_CFG_PAGE_SZ;
4192-
mrioc->cfg_page = dma_alloc_coherent(&mrioc->pdev->dev,
4193-
mrioc->cfg_page_sz, &mrioc->cfg_page_dma, GFP_KERNEL);
4194-
if (!mrioc->cfg_page) {
4195-
retval = -1;
4196-
goto out_failed_noretry;
4197-
}
4198-
}
4199-
42004189
dprint_init(mrioc, "allocating host diag buffers\n");
42014190
mpi3mr_alloc_diag_bufs(mrioc);
42024191

@@ -4768,11 +4757,7 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc)
47684757
mrioc->admin_req_base, mrioc->admin_req_dma);
47694758
mrioc->admin_req_base = NULL;
47704759
}
4771-
if (mrioc->cfg_page) {
4772-
dma_free_coherent(&mrioc->pdev->dev, mrioc->cfg_page_sz,
4773-
mrioc->cfg_page, mrioc->cfg_page_dma);
4774-
mrioc->cfg_page = NULL;
4775-
}
4760+
47764761
if (mrioc->pel_seqnum_virt) {
47774762
dma_free_coherent(&mrioc->pdev->dev, mrioc->pel_seqnum_sz,
47784763
mrioc->pel_seqnum_virt, mrioc->pel_seqnum_dma);
@@ -5392,55 +5377,6 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
53925377
return retval;
53935378
}
53945379

5395-
5396-
/**
5397-
* mpi3mr_free_config_dma_memory - free memory for config page
5398-
* @mrioc: Adapter instance reference
5399-
* @mem_desc: memory descriptor structure
5400-
*
5401-
* Check whether the size of the buffer specified by the memory
5402-
* descriptor is greater than the default page size if so then
5403-
* free the memory pointed by the descriptor.
5404-
*
5405-
* Return: Nothing.
5406-
*/
5407-
static void mpi3mr_free_config_dma_memory(struct mpi3mr_ioc *mrioc,
5408-
struct dma_memory_desc *mem_desc)
5409-
{
5410-
if ((mem_desc->size > mrioc->cfg_page_sz) && mem_desc->addr) {
5411-
dma_free_coherent(&mrioc->pdev->dev, mem_desc->size,
5412-
mem_desc->addr, mem_desc->dma_addr);
5413-
mem_desc->addr = NULL;
5414-
}
5415-
}
5416-
5417-
/**
5418-
* mpi3mr_alloc_config_dma_memory - Alloc memory for config page
5419-
* @mrioc: Adapter instance reference
5420-
* @mem_desc: Memory descriptor to hold dma memory info
5421-
*
5422-
* This function allocates new dmaable memory or provides the
5423-
* default config page dmaable memory based on the memory size
5424-
* described by the descriptor.
5425-
*
5426-
* Return: 0 on success, non-zero on failure.
5427-
*/
5428-
static int mpi3mr_alloc_config_dma_memory(struct mpi3mr_ioc *mrioc,
5429-
struct dma_memory_desc *mem_desc)
5430-
{
5431-
if (mem_desc->size > mrioc->cfg_page_sz) {
5432-
mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev,
5433-
mem_desc->size, &mem_desc->dma_addr, GFP_KERNEL);
5434-
if (!mem_desc->addr)
5435-
return -ENOMEM;
5436-
} else {
5437-
mem_desc->addr = mrioc->cfg_page;
5438-
mem_desc->dma_addr = mrioc->cfg_page_dma;
5439-
memset(mem_desc->addr, 0, mrioc->cfg_page_sz);
5440-
}
5441-
return 0;
5442-
}
5443-
54445380
/**
54455381
* mpi3mr_post_cfg_req - Issue config requests and wait
54465382
* @mrioc: Adapter instance reference
@@ -5596,8 +5532,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,
55965532
cfg_req->page_length = cfg_hdr->page_length;
55975533
cfg_req->page_version = cfg_hdr->page_version;
55985534
}
5599-
if (mpi3mr_alloc_config_dma_memory(mrioc, &mem_desc))
5600-
goto out;
5535+
5536+
mem_desc.addr = dma_alloc_coherent(&mrioc->pdev->dev,
5537+
mem_desc.size, &mem_desc.dma_addr, GFP_KERNEL);
5538+
5539+
if (!mem_desc.addr)
5540+
return retval;
56015541

56025542
mpi3mr_add_sg_single(&cfg_req->sgl, sgl_flags, mem_desc.size,
56035543
mem_desc.dma_addr);
@@ -5626,7 +5566,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,
56265566
}
56275567

56285568
out:
5629-
mpi3mr_free_config_dma_memory(mrioc, &mem_desc);
5569+
if (mem_desc.addr) {
5570+
dma_free_coherent(&mrioc->pdev->dev, mem_desc.size,
5571+
mem_desc.addr, mem_desc.dma_addr);
5572+
mem_desc.addr = NULL;
5573+
}
5574+
56305575
return retval;
56315576
}
56325577

0 commit comments

Comments
 (0)