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

Commit 4cffe13e authored by Dan Williams's avatar Dan Williams
Browse files

isci: fix frame received locking



Updates to the frame_rcvd before need to be atomic with respect to when
they are evaluated by libsas.

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 7cafbf1b
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -893,6 +893,7 @@ enum sci_status scic_sds_phy_frame_handler(struct scic_sds_phy *sci_phy,
	enum scic_sds_phy_states state = sci_phy->sm.current_state_id;
	struct scic_sds_controller *scic = sci_phy->owning_port->owning_controller;
	enum sci_status result;
	unsigned long flags;

	switch (state) {
	case SCI_PHY_SUB_AWAIT_IAF_UF: {
@@ -911,7 +912,9 @@ enum sci_status scic_sds_phy_frame_handler(struct scic_sds_phy *sci_phy,
		if (iaf.frame_type == 0) {
			u32 state;

			spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
			memcpy(&iphy->frame_rcvd.iaf, &iaf, sizeof(iaf));
			spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);
			if (iaf.smp_tport) {
				/* We got the IAF for an expander PHY go to the final
				 * state since there are no power requirements for
@@ -954,9 +957,11 @@ enum sci_status scic_sds_phy_frame_handler(struct scic_sds_phy *sci_phy,
								      frame_index,
								      (void **)&fis_frame_data);

			spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
			scic_sds_controller_copy_sata_response(&iphy->frame_rcvd.fis,
							       frame_header,
							       fis_frame_data);
			spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);

			/* got IAF we can now go to the await spinup semaphore state */
			sci_change_state(&sci_phy->sm, SCI_PHY_SUB_FINAL);