Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02133b68 authored by Dave Carroll's avatar Dave Carroll Committed by Martin K. Petersen
Browse files

scsi: smartpqi: refactor sending controller raid requests



Clean up the common code which creates a raid path request for the
controller LUNID and sends it synchronously, into a common routine;

Reviewed-by: default avatarMurthy Bhat <murthy.bhat@microsemi.com>
Reviewed-by: default avatarMahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
Reviewed-by: default avatarScott Teel <scott.teel@microsemi.com>
Reviewed-by: default avatarKevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: default avatarDave Carroll <david.carroll@microsemi.com>
Signed-off-by: default avatarDon Brace <don.brace@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 171c2865
Loading
Loading
Loading
Loading
+46 −88
Original line number Original line Diff line number Diff line
@@ -519,44 +519,58 @@ static void pqi_free_io_request(struct pqi_io_request *io_request)
	atomic_dec(&io_request->refcount);
	atomic_dec(&io_request->refcount);
}
}


static int pqi_identify_controller(struct pqi_ctrl_info *ctrl_info,
static int pqi_send_scsi_raid_request(struct pqi_ctrl_info *ctrl_info, u8 cmd,
	struct bmic_identify_controller *buffer)
		u8 *scsi3addr, void *buffer, size_t buffer_length, u16 vpd_page,
		struct pqi_raid_error_info *error_info,
		unsigned long timeout_msecs)
{
{
	int rc;
	int rc;
	enum dma_data_direction dir;
	enum dma_data_direction dir;
	struct pqi_raid_path_request request;
	struct pqi_raid_path_request request;


	rc = pqi_build_raid_path_request(ctrl_info, &request,
	rc = pqi_build_raid_path_request(ctrl_info, &request,
		BMIC_IDENTIFY_CONTROLLER, RAID_CTLR_LUNID, buffer,
		cmd, scsi3addr, buffer,
		sizeof(*buffer), 0, &dir);
		buffer_length, vpd_page, &dir);
	if (rc)
	if (rc)
		return rc;
		return rc;


	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0,
	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
		NULL, NO_TIMEOUT);
		 0, error_info, timeout_msecs);


	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
	return rc;
	return rc;
}
}


static int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,
/* Helper functions for pqi_send_scsi_raid_request */
	u8 *scsi3addr, u16 vpd_page, void *buffer, size_t buffer_length)

static inline int pqi_send_ctrl_raid_request(struct pqi_ctrl_info *ctrl_info,
		u8 cmd, void *buffer, size_t buffer_length)
{
{
	int rc;
	return pqi_send_scsi_raid_request(ctrl_info, cmd, RAID_CTLR_LUNID,
	enum dma_data_direction dir;
			buffer, buffer_length, 0, NULL, NO_TIMEOUT);
	struct pqi_raid_path_request request;
}


	rc = pqi_build_raid_path_request(ctrl_info, &request,
static inline int pqi_send_ctrl_raid_with_error(struct pqi_ctrl_info *ctrl_info,
		INQUIRY, scsi3addr, buffer, buffer_length, vpd_page,
		u8 cmd, void *buffer, size_t buffer_length,
		&dir);
		struct pqi_raid_error_info *error_info)
	if (rc)
{
		return rc;
	return pqi_send_scsi_raid_request(ctrl_info, cmd, RAID_CTLR_LUNID,
			buffer, buffer_length, 0, error_info, NO_TIMEOUT);
}


	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0,
		NULL, NO_TIMEOUT);


	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
static inline int pqi_identify_controller(struct pqi_ctrl_info *ctrl_info,
	return rc;
		struct bmic_identify_controller *buffer)
{
	return pqi_send_ctrl_raid_request(ctrl_info, BMIC_IDENTIFY_CONTROLLER,
			buffer, sizeof(*buffer));
}

static inline int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,
	u8 *scsi3addr, u16 vpd_page, void *buffer, size_t buffer_length)
{
	return pqi_send_scsi_raid_request(ctrl_info, INQUIRY, scsi3addr,
		buffer, buffer_length, vpd_page, NULL, NO_TIMEOUT);
}
}


static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
@@ -590,9 +604,7 @@ static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info,
	enum bmic_flush_cache_shutdown_event shutdown_event)
	enum bmic_flush_cache_shutdown_event shutdown_event)
{
{
	int rc;
	int rc;
	struct pqi_raid_path_request request;
	struct bmic_flush_cache *flush_cache;
	struct bmic_flush_cache *flush_cache;
	enum dma_data_direction dir;


	/*
	/*
	 * Don't bother trying to flush the cache if the controller is
	 * Don't bother trying to flush the cache if the controller is
@@ -607,17 +619,9 @@ static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info,


	flush_cache->shutdown_event = shutdown_event;
	flush_cache->shutdown_event = shutdown_event;


	rc = pqi_build_raid_path_request(ctrl_info, &request,
	rc = pqi_send_ctrl_raid_request(ctrl_info, SA_FLUSH_CACHE, flush_cache,
		SA_FLUSH_CACHE, RAID_CTLR_LUNID, flush_cache,
		sizeof(*flush_cache));
		sizeof(*flush_cache), 0, &dir);
	if (rc)
		goto out;

	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
		0, NULL, NO_TIMEOUT);


	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
out:
	kfree(flush_cache);
	kfree(flush_cache);


	return rc;
	return rc;
@@ -629,66 +633,32 @@ static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info,
static int pqi_set_diag_rescan(struct pqi_ctrl_info *ctrl_info)
static int pqi_set_diag_rescan(struct pqi_ctrl_info *ctrl_info)
{
{
	int rc;
	int rc;
	struct pqi_raid_path_request request;
	struct bmic_diag_options *diag;
	struct bmic_diag_options *diag;
	enum dma_data_direction pci_direction;


	diag = kzalloc(sizeof(*diag), GFP_KERNEL);
	diag = kzalloc(sizeof(*diag), GFP_KERNEL);
	if (!diag)
	if (!diag)
		return -ENOMEM;
		return -ENOMEM;


	rc = pqi_build_raid_path_request(ctrl_info, &request,
	rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SENSE_DIAG_OPTIONS,
		BMIC_SENSE_DIAG_OPTIONS, RAID_CTLR_LUNID, diag,
					diag, sizeof(*diag));
		sizeof(*diag), 0, &pci_direction);
	if (rc)
		goto out;

	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
		0, NULL, NO_TIMEOUT);

	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1,
		pci_direction);

	if (rc)
	if (rc)
		goto out;
		goto out;


	diag->options |= cpu_to_le32(PQI_FETCH_PTRAID_DATA);
	diag->options |= cpu_to_le32(PQI_FETCH_PTRAID_DATA);


	rc = pqi_build_raid_path_request(ctrl_info, &request,
	rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SET_DIAG_OPTIONS,
		BMIC_SET_DIAG_OPTIONS, RAID_CTLR_LUNID, diag,
					diag, sizeof(*diag));
		sizeof(*diag), 0, &pci_direction);
	if (rc)
		goto out;

	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
		0, NULL, NO_TIMEOUT);

	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1,
		pci_direction);
out:
out:
	kfree(diag);
	kfree(diag);


	return rc;
	return rc;
}
}


static int pqi_write_host_wellness(struct pqi_ctrl_info *ctrl_info,
static inline int pqi_write_host_wellness(struct pqi_ctrl_info *ctrl_info,
	void *buffer, size_t buffer_length)
	void *buffer, size_t buffer_length)
{
{
	int rc;
	return pqi_send_ctrl_raid_request(ctrl_info, BMIC_WRITE_HOST_WELLNESS,
	struct pqi_raid_path_request request;
					buffer, buffer_length);
	enum dma_data_direction dir;

	rc = pqi_build_raid_path_request(ctrl_info, &request,
		BMIC_WRITE_HOST_WELLNESS, RAID_CTLR_LUNID, buffer,
		buffer_length, 0, &dir);
	if (rc)
		return rc;

	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
		0, NULL, NO_TIMEOUT);

	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
	return rc;
}
}


#pragma pack(1)
#pragma pack(1)
@@ -837,23 +807,11 @@ static inline void pqi_cancel_update_time_worker(
	cancel_delayed_work_sync(&ctrl_info->update_time_work);
	cancel_delayed_work_sync(&ctrl_info->update_time_work);
}
}


static int pqi_report_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
static inline int pqi_report_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
	void *buffer, size_t buffer_length)
	void *buffer, size_t buffer_length)
{
{
	int rc;
	return pqi_send_ctrl_raid_request(ctrl_info, cmd, buffer,
	enum dma_data_direction dir;
					buffer_length);
	struct pqi_raid_path_request request;

	rc = pqi_build_raid_path_request(ctrl_info, &request,
		cmd, RAID_CTLR_LUNID, buffer, buffer_length, 0, &dir);
	if (rc)
		return rc;

	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0,
		NULL, NO_TIMEOUT);

	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
	return rc;
}
}


static int pqi_report_phys_logical_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
static int pqi_report_phys_logical_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,