All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomas Henzl <thenzl@redhat.com>
To: Kashyap Desai <kashyap.desai@broadcom.com>, linux-scsi@vger.kernel.org
Cc: sathya.prakash@broadcom.com
Subject: Re: [PATCH v2 07/24] mpi3mr: add support of event handling pcie devices part-2
Date: Thu, 15 Apr 2021 13:10:52 +0200	[thread overview]
Message-ID: <5c395090-04b9-1fd4-61c7-c97a233499fe@redhat.com> (raw)
In-Reply-To: <20210407020451.924822-8-kashyap.desai@broadcom.com>

On 4/7/21 4:04 AM, Kashyap Desai wrote:
> Firmware can report various MPI Events.
> Support for certain Events (as listed below) are enabled in the driver
> and their processing in driver is covered in this patch.
> 
> MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST
> MPI3_EVENT_PCIE_ENUMERATION
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> Reviewed-by: Hannes Reinecke <hare@suse.de>
> Cc: sathya.prakash@broadcom.com
> ---
>  drivers/scsi/mpi3mr/mpi3mr_fw.c |   2 +
>  drivers/scsi/mpi3mr/mpi3mr_os.c | 202 ++++++++++++++++++++++++++++++++
>  2 files changed, 204 insertions(+)
> 
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
> index 668dd001b6b4..d9ac045428e8 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
> @@ -2745,6 +2745,8 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
>  	mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST);
>  	mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_DISCOVERY);
>  	mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR);
> +	mpi3mr_unmask_events(mrioc, MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST);
> +	mpi3mr_unmask_events(mrioc, MPI3_EVENT_PCIE_ENUMERATION);
>  
>  	retval = mpi3mr_issue_event_notification(mrioc);
>  	if (retval) {
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
> index 9b9230d1107a..40b46eadcd32 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_os.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
> @@ -566,6 +566,40 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc,
>  	return retval;
>  }
>  
> +/**
> + * mpi3mr_update_sdev - Update SCSI device information
> + * @sdev: SCSI device reference
> + * @data: target device reference
> + *
> + * This is an iterator function called for each SCSI device in a
> + * target to update the target specific information into each
> + * SCSI device.
> + *
> + * Return: Nothing.
> + */
> +static void
> +mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
> +{
> +	struct mpi3mr_tgt_dev *tgtdev;
> +
> +	tgtdev = (struct mpi3mr_tgt_dev *) data;
> +	if (!tgtdev)
> +		return;
> +
> +	switch (tgtdev->dev_type) {
> +	case MPI3_DEVICE_DEVFORM_PCIE:
> +		/*The block layer hw sector size = 512*/
> +		blk_queue_max_hw_sectors(sdev->request_queue,
> +		    tgtdev->dev_spec.pcie_inf.mdts / 512);
> +		blk_queue_virt_boundary(sdev->request_queue,
> +		    ((1 << tgtdev->dev_spec.pcie_inf.pgsz) - 1));
> +
> +		break;
> +	default:
> +		break;
> +	}
> +}
> +
>  /**
>   * mpi3mr_rfresh_tgtdevs - Refresh target device exposure
>   * @mrioc: Adapter instance reference
> @@ -654,6 +688,33 @@ static void mpi3mr_update_tgtdev(struct mpi3mr_ioc *mrioc,
>  			tgtdev->is_hidden = 1;
>  		break;
>  	}
> +	case MPI3_DEVICE_DEVFORM_PCIE:
> +	{
> +		Mpi3Device0PcieFormat_t *pcieinf =
> +		    &dev_pg0->DeviceSpecific.PcieFormat;
> +		u16 dev_info = le16_to_cpu(pcieinf->DeviceInfo);
> +
> +		tgtdev->dev_spec.pcie_inf.capb =
> +		    le32_to_cpu(pcieinf->Capabilities);
> +		tgtdev->dev_spec.pcie_inf.mdts = MPI3MR_DEFAULT_MDTS;
> +		/* 2^12 = 4096 */
> +		tgtdev->dev_spec.pcie_inf.pgsz = 12;
> +		if (dev_pg0->AccessStatus == MPI3_DEVICE0_ASTATUS_NO_ERRORS) {
> +			tgtdev->dev_spec.pcie_inf.mdts =
> +			    le32_to_cpu(pcieinf->MaximumDataTransferSize);
> +			tgtdev->dev_spec.pcie_inf.pgsz = pcieinf->PageSize;
> +			tgtdev->dev_spec.pcie_inf.reset_to =
> +			    pcieinf->ControllerResetTO;
> +			tgtdev->dev_spec.pcie_inf.abort_to =
> +			    pcieinf->NVMeAbortTO;
> +		}
> +		if (tgtdev->dev_spec.pcie_inf.mdts > (1024 * 1024))
> +			tgtdev->dev_spec.pcie_inf.mdts = (1024 * 1024);
> +		if ((dev_info & MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) !=
> +		    MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE)
> +			tgtdev->is_hidden = 1;
> +		break;
> +	}
>  	case MPI3_DEVICE_DEVFORM_VD:
>  	{
>  		Mpi3Device0VdFormat_t *vdinf =
> @@ -765,6 +826,9 @@ static void mpi3mr_devinfochg_evt_bh(struct mpi3mr_ioc *mrioc,
>  		mpi3mr_report_tgtdev_to_host(mrioc, perst_id);
>  	if (tgtdev->is_hidden && tgtdev->host_exposed)
>  		mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev);
> +	if (!tgtdev->is_hidden && tgtdev->host_exposed && tgtdev->starget)
> +		starget_for_each_device(tgtdev->starget, (void *) tgtdev,
> +		    mpi3mr_update_sdev);
>  out:
>  	if (tgtdev)
>  		mpi3mr_tgtdev_put(tgtdev);
> @@ -818,6 +882,54 @@ static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,
>  	}
>  }
>  
> +/**
> + * mpi3mr_pcietopochg_evt_bh - PCIeTopologyChange evt bottomhalf
> + * @mrioc: Adapter instance reference
> + * @fwevt: Firmware event reference
> + *
> + * Prints information about the PCIe topology change event and
> + * for "not responding" event code, removes the device from the
> + * upper layers.
> + *
> + * Return: Nothing.
> + */
> +static void mpi3mr_pcietopochg_evt_bh(struct mpi3mr_ioc *mrioc,
> +	struct mpi3mr_fwevt *fwevt)
> +{
> +	Mpi3EventDataPcieTopologyChangeList_t *event_data =
> +	    (Mpi3EventDataPcieTopologyChangeList_t *)fwevt->event_data;
> +	int i;
> +	u16 handle;
> +	u8 reason_code;
> +	struct mpi3mr_tgt_dev *tgtdev = NULL;
> +
> +	for (i = 0; i < event_data->NumEntries; i++) {
> +		handle =
> +		    le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
> +		if (!handle)
> +			continue;
> +		tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle);
> +		if (!tgtdev)
> +			continue;
> +
> +		reason_code = event_data->PortEntry[i].PortStatus;
> +
> +		switch (reason_code) {
> +		case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:
> +			if (tgtdev->host_exposed)
> +				mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev);
> +			mpi3mr_tgtdev_del_from_list(mrioc, tgtdev);
> +			mpi3mr_tgtdev_put(tgtdev);
> +			break;
> +		default:
> +			break;
> +		}
> +		if (tgtdev)
> +			mpi3mr_tgtdev_put(tgtdev);
> +	}
> +}
> +
> +
>  /**
>   * mpi3mr_fwevt_bh - Firmware event bottomhalf handler
>   * @mrioc: Adapter instance reference
> @@ -865,6 +977,11 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
>  		mpi3mr_sastopochg_evt_bh(mrioc, fwevt);
>  		break;
>  	}
> +	case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
> +	{
> +		mpi3mr_pcietopochg_evt_bh(mrioc, fwevt);
> +		break;
> +	}
>  	default:
>  		break;
>  	}
> @@ -1171,6 +1288,72 @@ static void mpi3mr_dev_rmhs_send_tm(struct mpi3mr_ioc *mrioc, u16 handle,
>  	clear_bit(cmd_idx, mrioc->devrem_bitmap);
>  }
>  
> +/**
> + * mpi3mr_pcietopochg_evt_th - PCIETopologyChange evt tophalf
> + * @mrioc: Adapter instance reference
> + * @event_reply: Event data
> + *
> + * Checks for the reason code and based on that either block I/O
> + * to device, or unblock I/O to the device, or start the device
> + * removal handshake with reason as remove with the firmware for
> + * PCIe devices.
> + *
> + * Return: Nothing
> + */
> +static void mpi3mr_pcietopochg_evt_th(struct mpi3mr_ioc *mrioc,
> +	Mpi3EventNotificationReply_t *event_reply)
> +{
> +	Mpi3EventDataPcieTopologyChangeList_t *topo_evt =
> +	    (Mpi3EventDataPcieTopologyChangeList_t *) event_reply->EventData;
> +	int i;
> +	u16 handle;
> +	u8 reason_code;
> +	struct mpi3mr_tgt_dev *tgtdev = NULL;
> +	struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL;
> +
> +	for (i = 0; i < topo_evt->NumEntries; i++) {
> +		handle = le16_to_cpu(topo_evt->PortEntry[i].AttachedDevHandle);
> +		if (!handle)
> +			continue;
> +		reason_code = topo_evt->PortEntry[i].PortStatus;
> +		scsi_tgt_priv_data =  NULL;
> +		tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle);
> +		if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata)
> +			scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *)
> +			    tgtdev->starget->hostdata;
> +		switch (reason_code) {
> +		case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:
> +			if (scsi_tgt_priv_data) {
> +				scsi_tgt_priv_data->dev_removed = 1;
> +				scsi_tgt_priv_data->dev_removedelay = 0;
> +				atomic_set(&scsi_tgt_priv_data->block_io, 0);
> +			}
> +			mpi3mr_dev_rmhs_send_tm(mrioc, handle, NULL,
> +			    MPI3_CTRL_OP_REMOVE_DEVICE);
> +			break;
> +		case MPI3_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING:
> +			if (scsi_tgt_priv_data) {
> +				scsi_tgt_priv_data->dev_removedelay = 1;
> +				atomic_inc(&scsi_tgt_priv_data->block_io);
> +			}
> +			break;
> +		case MPI3_EVENT_PCIE_TOPO_PS_RESPONDING:
> +			if (scsi_tgt_priv_data &&
> +			    scsi_tgt_priv_data->dev_removedelay) {
> +				scsi_tgt_priv_data->dev_removedelay = 0;
> +				atomic_dec_if_positive
> +				    (&scsi_tgt_priv_data->block_io);
> +			}
> +			break;
> +		case MPI3_EVENT_PCIE_TOPO_PS_PORT_CHANGED:
> +		default:
> +			break;
> +		}
> +		if (tgtdev)
> +			mpi3mr_tgtdev_put(tgtdev);
> +	}
> +}
> +
>  /**
>   * mpi3mr_sastopochg_evt_th - SASTopologyChange evt tophalf
>   * @mrioc: Adapter instance reference
> @@ -1366,6 +1549,12 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
>  		mpi3mr_sastopochg_evt_th(mrioc, event_reply);
>  		break;
>  	}
> +	case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
> +	{
> +		process_evt_bh = 1;
> +		mpi3mr_pcietopochg_evt_th(mrioc, event_reply);
> +		break;
> +	}
>  	case MPI3_EVENT_DEVICE_INFO_CHANGED:
>  	{
>  		process_evt_bh = 1;
> @@ -1374,6 +1563,7 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
>  	case MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE:
>  	case MPI3_EVENT_SAS_DISCOVERY:
>  	case MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR:
> +	case MPI3_EVENT_PCIE_ENUMERATION:
>  		break;
>  	default:
>  		ioc_info(mrioc, "%s :Event 0x%02x is not handled\n",
> @@ -1960,6 +2150,18 @@ static int mpi3mr_slave_configure(struct scsi_device *sdev)
>  	if (!tgt_dev)
>  		return retval;
>  
> +	switch (tgt_dev->dev_type) {
> +	case MPI3_DEVICE_DEVFORM_PCIE:
> +		/*The block layer hw sector size = 512*/
> +		blk_queue_max_hw_sectors(sdev->request_queue,
> +		    tgt_dev->dev_spec.pcie_inf.mdts / 512);
> +		blk_queue_virt_boundary(sdev->request_queue,
> +		    ((1 << tgt_dev->dev_spec.pcie_inf.pgsz) - 1));
> +		break;
> +	default:
> +		break;
> +	}
> +
>  	mpi3mr_tgtdev_put(tgt_dev);
>  
>  	return retval;
> 
Looks good

Reviewed-by: Tomas Henzl <thenzl@redhat.com>


  reply	other threads:[~2021-04-15 11:10 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  2:04 [PATCH v2 00/24] Introducing mpi3mr driver Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 01/24] mpi3mr: add mpi30 Rev-R headers and Kconfig Kashyap Desai
2021-04-15 10:30   ` Tomas Henzl
2021-04-15 20:31   ` Bart Van Assche
2021-04-16 10:53     ` Kashyap Desai
2021-04-16 15:40       ` Bart Van Assche
2021-04-19 10:20         ` Kashyap Desai
2021-04-20  6:33           ` Christoph Hellwig
2021-04-23 13:18             ` Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 02/24] mpi3mr: base driver code Kashyap Desai
2021-04-07  4:17   ` kernel test robot
2021-04-07  4:17     ` kernel test robot
2021-04-07  4:33   ` kernel test robot
2021-04-07  4:33     ` kernel test robot
2021-04-07  2:04 ` [PATCH v2 03/24] mpi3mr: create operational request and reply queue pair Kashyap Desai
2021-04-15 10:35   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 04/24] mpi3mr: add support of queue command processing Kashyap Desai
2021-04-15 10:36   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 05/24] mpi3mr: add support of internal watchdog thread Kashyap Desai
2021-04-15 10:37   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 06/24] mpi3mr: add support of event handling part-1 Kashyap Desai
2021-04-15 10:40   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 07/24] mpi3mr: add support of event handling pcie devices part-2 Kashyap Desai
2021-04-15 11:10   ` Tomas Henzl [this message]
2021-04-07  2:04 ` [PATCH v2 08/24] mpi3mr: add support of event handling part-3 Kashyap Desai
2021-04-15 11:11   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 09/24] mpi3mr: add support for recovering controller Kashyap Desai
2021-04-15 11:21   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 10/24] mpi3mr: add support of timestamp sync with firmware Kashyap Desai
2021-04-15 11:22   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 11/24] mpi3mr: print ioc info for debugging Kashyap Desai
2021-04-15 11:55   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 12/24] mpi3mr: add bios_param shost template hook Kashyap Desai
2021-04-15 11:56   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 13/24] mpi3mr: implement scsi error handler hooks Kashyap Desai
2021-04-07  2:04 ` [PATCH v2 14/24] mpi3mr: add change queue depth support Kashyap Desai
2021-04-15 12:16   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 15/24] mpi3mr: allow certain commands during pci-remove hook Kashyap Desai
2021-04-15 12:19   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 16/24] mpi3mr: hardware workaround for UNMAP commands to nvme drives Kashyap Desai
2021-04-15 12:20   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 17/24] mpi3mr: add support of threaded isr Kashyap Desai
2021-04-15 12:22   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 18/24] mpi3mr: add complete support of soft reset Kashyap Desai
2021-04-15 12:32   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 19/24] mpi3mr: print pending host ios for debug Kashyap Desai
2021-04-15 12:43   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 20/24] mpi3mr: wait for pending IO completions upon detection of VD IO timeout Kashyap Desai
2021-04-15 12:45   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 21/24] mpi3mr: add support of PM suspend and resume Kashyap Desai
2021-04-15 12:46   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 22/24] mpi3mr: add support of DSN secure fw check Kashyap Desai
2021-04-15 12:48   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 23/24] mpi3mr: add eedp dif dix support Kashyap Desai
2021-04-15 12:50   ` Tomas Henzl
2021-04-07  2:04 ` [PATCH v2 24/24] mpi3mr: add event handling debug prints Kashyap Desai
2021-04-15 12:52   ` Tomas Henzl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5c395090-04b9-1fd4-61c7-c97a233499fe@redhat.com \
    --to=thenzl@redhat.com \
    --cc=kashyap.desai@broadcom.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=sathya.prakash@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.