Commit 694c5d5b authored by Kevin Barnett's avatar Kevin Barnett Committed by Martin K. Petersen
Browse files

scsi: smartpqi: Align driver syntax with oob

parent 0fa31a88
Loading
Loading
Loading
Loading
+25 −35
Original line number Diff line number Diff line
@@ -831,10 +831,17 @@ union pqi_reset_register {

struct report_lun_header {
	__be32	list_length;
	u8	extended_response;
	u8	flags;
	u8	reserved[3];
};

/* for flags field of struct report_lun_header */
#define CISS_REPORT_LOG_FLAG_UNIQUE_LUN_ID	(1 << 0)
#define CISS_REPORT_LOG_FLAG_QUEUE_DEPTH	(1 << 5)
#define CISS_REPORT_LOG_FLAG_DRIVE_TYPE_MIX	(1 << 6)

#define CISS_REPORT_PHYS_FLAG_OTHER		(1 << 1)

struct report_log_lun_extended_entry {
	u8	lunid[8];
	u8	volume_id[16];
@@ -856,7 +863,7 @@ struct report_phys_lun_extended_entry {
};

/* for device_flags field of struct report_phys_lun_extended_entry */
#define REPORT_PHYS_LUN_DEV_FLAG_AIO_ENABLED	0x8
#define CISS_REPORT_PHYS_DEV_FLAG_AIO_ENABLED	0x8

struct report_phys_lun_extended {
	struct report_lun_header header;
@@ -869,7 +876,7 @@ struct raid_map_disk_data {
	u8	reserved[2];
};

/* constants for flags field of RAID map */
/* for flags field of RAID map */
#define RAID_MAP_ENCRYPTION_ENABLED	0x1

struct raid_map {
@@ -1195,10 +1202,6 @@ enum pqi_ctrl_mode {
#define CISS_REPORT_PHYS	0xc3	/* Report Physical LUNs */
#define CISS_GET_RAID_MAP	0xc8

/* constants for CISS_REPORT_LOG/CISS_REPORT_PHYS commands */
#define CISS_REPORT_LOG_EXTENDED		0x1
#define CISS_REPORT_PHYS_EXTENDED		0x2

/* BMIC commands */
#define BMIC_IDENTIFY_CONTROLLER		0x11
#define BMIC_IDENTIFY_PHYSICAL_DEVICE		0x15
@@ -1212,7 +1215,7 @@ enum pqi_ctrl_mode {
#define BMIC_SET_DIAG_OPTIONS			0xf4
#define BMIC_SENSE_DIAG_OPTIONS			0xf5

#define CSMI_CC_SAS_SMP_PASSTHRU		0X17
#define CSMI_CC_SAS_SMP_PASSTHRU		0x17

#define SA_FLUSH_CACHE				0x1

@@ -1248,10 +1251,12 @@ struct bmic_sense_subsystem_info {
	u8	ctrl_serial_number[16];
};

#define SA_EXPANDER_SMP_DEVICE		0x05
#define SA_CONTROLLER_DEVICE		0x07
/*SCSI Invalid Device Type for SAS devices*/
#define PQI_SAS_SCSI_INVALID_DEVTYPE	0xff
/* constants for device_type field */
#define SA_DEVICE_TYPE_SATA		0x1
#define SA_DEVICE_TYPE_SAS		0x2
#define SA_DEVICE_TYPE_EXPANDER_SMP	0x5
#define SA_DEVICE_TYPE_CONTROLLER	0x7
#define SA_DEVICE_TYPE_NVME		0x9

struct bmic_identify_physical_device {
	u8	scsi_bus;		/* SCSI Bus number on controller */
@@ -1277,7 +1282,7 @@ struct bmic_identify_physical_device {
	__le32	rpm;			/* drive rotational speed in RPM */
	u8	device_type;		/* type of drive */
	u8	sata_version;		/* only valid when device_type = */
					/* BMIC_DEVICE_TYPE_SATA */
					/* SA_DEVICE_TYPE_SATA */
	__le64	big_total_block_count;
	__le64	ris_starting_lba;
	__le32	ris_size;
@@ -1400,18 +1405,6 @@ struct bmic_diag_options {

#pragma pack()

static inline struct pqi_ctrl_info *shost_to_hba(struct Scsi_Host *shost)
{
	void *hostdata = shost_priv(shost);

	return *((struct pqi_ctrl_info **)hostdata);
}

static inline bool pqi_ctrl_offline(struct pqi_ctrl_info *ctrl_info)
{
	return !ctrl_info->controller_online;
}

static inline void pqi_ctrl_busy(struct pqi_ctrl_info *ctrl_info)
{
	atomic_inc(&ctrl_info->num_busy_threads);
@@ -1422,14 +1415,11 @@ static inline void pqi_ctrl_unbusy(struct pqi_ctrl_info *ctrl_info)
	atomic_dec(&ctrl_info->num_busy_threads);
}

static inline bool pqi_ctrl_blocked(struct pqi_ctrl_info *ctrl_info)
static inline struct pqi_ctrl_info *shost_to_hba(struct Scsi_Host *shost)
{
	return ctrl_info->block_requests;
}
	void *hostdata = shost_priv(shost);

static inline bool pqi_device_reset_blocked(struct pqi_ctrl_info *ctrl_info)
{
	return ctrl_info->block_device_reset;
	return *((struct pqi_ctrl_info **)hostdata);
}

void pqi_sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
+84 −66
Original line number Diff line number Diff line
@@ -211,6 +211,11 @@ static inline bool pqi_is_external_raid_addr(u8 *scsi3addr)
	return scsi3addr[2] != 0;
}

static inline bool pqi_ctrl_offline(struct pqi_ctrl_info *ctrl_info)
{
	return !ctrl_info->controller_online;
}

static inline void pqi_check_ctrl_health(struct pqi_ctrl_info *ctrl_info)
{
	if (ctrl_info->controller_online)
@@ -235,6 +240,21 @@ static inline void pqi_save_ctrl_mode(struct pqi_ctrl_info *ctrl_info,
	sis_write_driver_scratch(ctrl_info, mode);
}

static inline void pqi_ctrl_block_device_reset(struct pqi_ctrl_info *ctrl_info)
{
	ctrl_info->block_device_reset = true;
}

static inline bool pqi_device_reset_blocked(struct pqi_ctrl_info *ctrl_info)
{
	return ctrl_info->block_device_reset;
}

static inline bool pqi_ctrl_blocked(struct pqi_ctrl_info *ctrl_info)
{
	return ctrl_info->block_requests;
}

static inline void pqi_ctrl_block_requests(struct pqi_ctrl_info *ctrl_info)
{
	ctrl_info->block_requests = true;
@@ -249,11 +269,6 @@ static inline void pqi_ctrl_unblock_requests(struct pqi_ctrl_info *ctrl_info)
	scsi_unblock_requests(ctrl_info->scsi_host);
}

static inline void pqi_ctrl_block_device_reset(struct pqi_ctrl_info *ctrl_info)
{
	ctrl_info->block_device_reset = true;
}

static unsigned long pqi_wait_if_ctrl_blocked(struct pqi_ctrl_info *ctrl_info,
	unsigned long timeout_msecs)
{
@@ -482,9 +497,9 @@ static int pqi_build_raid_path_request(struct pqi_ctrl_info *ctrl_info,
		request->data_direction = SOP_READ_FLAG;
		cdb[0] = cmd;
		if (cmd == CISS_REPORT_PHYS)
			cdb[1] = CISS_REPORT_PHYS_EXTENDED;
			cdb[1] = CISS_REPORT_PHYS_FLAG_OTHER;
		else
			cdb[1] = CISS_REPORT_LOG_EXTENDED;
			cdb[1] = CISS_REPORT_LOG_FLAG_UNIQUE_LUN_ID;
		put_unaligned_be32(cdb_length, &cdb[6]);
		break;
	case CISS_GET_RAID_MAP:
@@ -588,12 +603,11 @@ static void pqi_free_io_request(struct pqi_io_request *io_request)

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

	rc = pqi_build_raid_path_request(ctrl_info, &request,
		cmd, scsi3addr, buffer,
@@ -601,14 +615,15 @@ static int pqi_send_scsi_raid_request(struct pqi_ctrl_info *ctrl_info, u8 cmd,
	if (rc)
		return rc;

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

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

	return rc;
}

/* Helper functions for pqi_send_scsi_raid_request */
/* helper functions for pqi_send_scsi_raid_request */

static inline int pqi_send_ctrl_raid_request(struct pqi_ctrl_info *ctrl_info,
	u8 cmd, void *buffer, size_t buffer_length)
@@ -625,7 +640,6 @@ static inline int pqi_send_ctrl_raid_with_error(struct pqi_ctrl_info *ctrl_info,
		buffer, buffer_length, 0, error_info, NO_TIMEOUT);
}


static inline int pqi_identify_controller(struct pqi_ctrl_info *ctrl_info,
	struct bmic_identify_controller *buffer)
{
@@ -637,8 +651,8 @@ static inline int pqi_sense_subsystem_info(struct pqi_ctrl_info *ctrl_info,
	struct bmic_sense_subsystem_info *sense_info)
{
	return pqi_send_ctrl_raid_request(ctrl_info,
			BMIC_SENSE_SUBSYSTEM_INFORMATION,
			sense_info, sizeof(*sense_info));
		BMIC_SENSE_SUBSYSTEM_INFORMATION, sense_info,
		sizeof(*sense_info));
}

static inline int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,
@@ -650,8 +664,7 @@ static inline int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,

static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
	struct pqi_scsi_dev *device,
	struct bmic_identify_physical_device *buffer,
	size_t buffer_length)
	struct bmic_identify_physical_device *buffer, size_t buffer_length)
{
	int rc;
	enum dma_data_direction dir;
@@ -672,6 +685,7 @@ static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
		0, NULL, NO_TIMEOUT);

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

	return rc;
}

@@ -710,7 +724,7 @@ int pqi_csmi_smp_passthru(struct pqi_ctrl_info *ctrl_info,
		buffer, buffer_length, error_info);
}

#define PQI_FETCH_PTRAID_DATA (1UL<<31)
#define PQI_FETCH_PTRAID_DATA		(1 << 31)

static int pqi_set_diag_rescan(struct pqi_ctrl_info *ctrl_info)
{
@@ -728,8 +742,9 @@ static int pqi_set_diag_rescan(struct pqi_ctrl_info *ctrl_info)

	diag->options |= cpu_to_le32(PQI_FETCH_PTRAID_DATA);

	rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SET_DIAG_OPTIONS,
					diag, sizeof(*diag));
	rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SET_DIAG_OPTIONS, diag,
		sizeof(*diag));

out:
	kfree(diag);

@@ -1352,6 +1367,7 @@ static void pqi_get_physical_disk_info(struct pqi_ctrl_info *ctrl_info,
		device->queue_depth = PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH;
		return;
	}

	device->box_index = id_phys->box_index;
	device->phys_box_on_bus = id_phys->phys_box_on_bus;
	device->phy_connected_dev_type = id_phys->phy_connected_dev_type[0];
@@ -1996,9 +2012,8 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
			rc = -ENOMEM;
			goto out;
		}
		if (pqi_hide_vsep) {
			int i;

		if (pqi_hide_vsep) {
			for (i = num_physicals - 1; i >= 0; i--) {
				phys_lun_ext_entry =
						&physdev_list->lun_entries[i];
@@ -2071,7 +2086,7 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
		device->is_physical_device = is_physical_device;
		if (is_physical_device) {
			if (phys_lun_ext_entry->device_type ==
				SA_EXPANDER_SMP_DEVICE)
				SA_DEVICE_TYPE_EXPANDER_SMP)
				device->is_expander_smp_device = true;
		} else {
			device->is_external_raid_device =
@@ -2108,7 +2123,7 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
		if (device->is_physical_device) {
			device->wwid = phys_lun_ext_entry->wwid;
			if ((phys_lun_ext_entry->device_flags &
				REPORT_PHYS_LUN_DEV_FLAG_AIO_ENABLED) &&
				CISS_REPORT_PHYS_DEV_FLAG_AIO_ENABLED) &&
				phys_lun_ext_entry->aio_handle) {
				device->aio_enabled = true;
				device->aio_handle =
@@ -3984,8 +3999,8 @@ static void pqi_raid_synchronous_complete(struct pqi_io_request *io_request,
	complete(waiting);
}

static int pqi_process_raid_io_error_synchronous(struct pqi_raid_error_info
						*error_info)
static int pqi_process_raid_io_error_synchronous(
	struct pqi_raid_error_info *error_info)
{
	int rc = -EIO;

@@ -4604,11 +4619,11 @@ static void pqi_free_all_io_requests(struct pqi_ctrl_info *ctrl_info)

static inline int pqi_alloc_error_buffer(struct pqi_ctrl_info *ctrl_info)
{

	ctrl_info->error_buffer = dma_alloc_coherent(&ctrl_info->pci_dev->dev,
				     ctrl_info->error_buffer_length,
				     &ctrl_info->error_buffer_dma_handle,
				     GFP_KERNEL);

	if (!ctrl_info->error_buffer)
		return -ENOMEM;

@@ -6077,8 +6092,7 @@ static int pqi_ioctl(struct scsi_device *sdev, unsigned int cmd,

	ctrl_info = shost_to_hba(sdev->host);

	if (pqi_ctrl_in_ofa(ctrl_info) ||
		pqi_ctrl_in_shutdown(ctrl_info))
	if (pqi_ctrl_in_ofa(ctrl_info) || pqi_ctrl_in_shutdown(ctrl_info))
		return -EBUSY;

	switch (cmd) {
@@ -6119,8 +6133,8 @@ static ssize_t pqi_firmware_version_show(struct device *dev,
static ssize_t pqi_driver_version_show(struct device *dev,
	struct device_attribute *attr, char *buffer)
{
	return snprintf(buffer, PAGE_SIZE,
		"%s\n", DRIVER_VERSION BUILD_TIMESTAMP);
	return snprintf(buffer, PAGE_SIZE, "%s\n",
			DRIVER_VERSION BUILD_TIMESTAMP);
}

static ssize_t pqi_serial_number_show(struct device *dev,
@@ -6287,6 +6301,7 @@ static ssize_t pqi_lunid_show(struct device *dev,
			flags);
		return -ENODEV;
	}

	memcpy(lunid, device->scsi3addr, sizeof(lunid));

	spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
@@ -6295,6 +6310,7 @@ static ssize_t pqi_lunid_show(struct device *dev,
}

#define MAX_PATHS	8

static ssize_t pqi_path_info_show(struct device *dev,
	struct device_attribute *attr, char *buf)
{
@@ -6306,9 +6322,9 @@ static ssize_t pqi_path_info_show(struct device *dev,
	int output_len = 0;
	u8 box;
	u8 bay;
	u8 path_map_index = 0;
	u8 path_map_index;
	char *active;
	unsigned char phys_connector[2];
	u8 phys_connector[2];

	sdev = to_scsi_device(dev);
	ctrl_info = shost_to_hba(sdev->host);
@@ -6375,10 +6391,10 @@ end_buffer:
	}

	spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);

	return output_len;
}


static ssize_t pqi_sas_address_show(struct device *dev,
	struct device_attribute *attr, char *buffer)
{
@@ -6399,6 +6415,7 @@ static ssize_t pqi_sas_address_show(struct device *dev,
			flags);
		return -ENODEV;
	}

	sas_address = device->sas_address;

	spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
@@ -7378,7 +7395,7 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info)
	rc = pqi_get_ctrl_product_details(ctrl_info);
	if (rc) {
		dev_err(&ctrl_info->pci_dev->dev,
			"error obtaining product detail\n");
			"error obtaining product details\n");
		return rc;
	}

@@ -7714,6 +7731,8 @@ static void pqi_ofa_setup_host_buffer(struct pqi_ctrl_info *ctrl_info,
		dev_err(dev, "Failed to allocate host buffer of size = %u",
			bytes_requested);
	}

	return;
}

static void pqi_ofa_free_host_buffer(struct pqi_ctrl_info *ctrl_info)
@@ -8014,7 +8033,6 @@ static void pqi_shutdown(struct pci_dev *pci_dev)

	pqi_crash_if_pending_command(ctrl_info);
	pqi_reset(ctrl_info);

}

static void pqi_process_lockup_action_param(void)
+3 −17
Original line number Diff line number Diff line
@@ -312,7 +312,6 @@ static int pqi_sas_get_linkerrors(struct sas_phy *phy)
static int pqi_sas_get_enclosure_identifier(struct sas_rphy *rphy,
	u64 *identifier)
{

	int rc;
	unsigned long flags;
	struct Scsi_Host *shost;
@@ -361,7 +360,7 @@ static int pqi_sas_get_enclosure_identifier(struct sas_rphy *rphy,
		}
	}

	if (found_device->phy_connected_dev_type != SA_CONTROLLER_DEVICE) {
	if (found_device->phy_connected_dev_type != SA_DEVICE_TYPE_CONTROLLER) {
		rc = -EINVAL;
		goto out;
	}
@@ -382,12 +381,10 @@ out:
	spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);

	return rc;

}

static int pqi_sas_get_bay_identifier(struct sas_rphy *rphy)
{

	int rc;
	unsigned long flags;
	struct pqi_ctrl_info *ctrl_info;
@@ -482,7 +479,6 @@ pqi_build_csmi_smp_passthru_buffer(struct sas_rphy *rphy,
		req_size -= SMP_CRC_FIELD_LENGTH;

	put_unaligned_le32(req_size, &parameters->request_length);

	put_unaligned_le32(resp_size, &parameters->response_length);

	sg_copy_to_buffer(job->request_payload.sg_list,
@@ -512,12 +508,12 @@ void pqi_sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
	struct sas_rphy *rphy)
{
	int rc;
	struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
	struct pqi_ctrl_info *ctrl_info;
	struct bmic_csmi_smp_passthru_buffer *smp_buf;
	struct pqi_raid_error_info error_info;
	unsigned int reslen = 0;

	pqi_ctrl_busy(ctrl_info);
	ctrl_info = shost_to_hba(shost);

	if (job->reply_payload.payload_len == 0) {
		rc = -ENOMEM;
@@ -539,16 +535,6 @@ void pqi_sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
		goto out;
	}

	if (pqi_ctrl_offline(ctrl_info)) {
		rc = -ENXIO;
		goto out;
	}

	if (pqi_ctrl_blocked(ctrl_info)) {
		rc = -EBUSY;
		goto out;
	}

	smp_buf = pqi_build_csmi_smp_passthru_buffer(rphy, job);
	if (!smp_buf) {
		rc = -ENOMEM;