All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Garry <john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: James.Bottomley-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org
Cc: linux-kernel-u79uwXL29TZ19SzzRMN9sA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	arnd-r2nGTMty4D4@public.gmane.org,
	linuxarm-hv44wF8Li93QT0dZR+AlfA@public.gmane.org,
	zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	xuwei5-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org,
	john.garry2-s/0ZXS5h9803lw97EnAbAg@public.gmane.org,
	hare-l3A5Bk7waGM@public.gmane.org,
	John Garry <john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Subject: [PATCH 23/25] scsi: hisi_sas: add control phy handler
Date: Mon, 12 Oct 2015 23:20:35 +0800	[thread overview]
Message-ID: <1444663237-238302-24-git-send-email-john.garry@huawei.com> (raw)
In-Reply-To: <1444663237-238302-1-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

Add method for lldd_control_phy. Currently link rate
control and spinup hold is unsupported.

Signed-off-by: John Garry <john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/scsi/hisi_sas/hisi_sas.h       |  7 ++++
 drivers/scsi/hisi_sas/hisi_sas_init.c  |  1 +
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 64 ++++++++++++++++++++++++++++++++++
 drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 22 ++++++++++++
 4 files changed, 94 insertions(+)

diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index b488fe3..be91b8c 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -133,6 +133,7 @@ struct hisi_sas_tei {
 };
 
 enum hisi_sas_wq_event {
+	CONTROL_PHY,
 	PHYUP,
 };
 
@@ -360,6 +361,9 @@ void hisi_sas_phy_init(struct hisi_hba *hisi_hba, int i);
 int hisi_sas_dev_found(struct domain_device *dev);
 void hisi_sas_dev_gone(struct domain_device *dev);
 int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags);
+int hisi_sas_control_phy(struct asd_sas_phy *sas_phy,
+			enum phy_func func,
+			void *funcdata);
 int hisi_sas_abort_task(struct sas_task *task);
 int hisi_sas_abort_task_set(struct domain_device *dev, u8 *lun);
 int hisi_sas_clear_aca(struct domain_device *dev, u8 *lun);
@@ -375,6 +379,7 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 			struct hisi_sas_slot *slot);
 
 /* hw specific functions */
+extern void hard_phy_reset_v1_hw(struct hisi_hba *hisi_hba, int phy_no);
 extern int slot_complete_v1_hw(struct hisi_hba *hisi_hba,
 			       struct hisi_sas_slot *slot,
 			       int abort);
@@ -392,8 +397,10 @@ extern int interrupt_openall_v1_hw(struct hisi_hba *hisi_hba);
 extern int hw_init_v1_hw(struct hisi_hba *hisi_hba);
 extern int free_device_v1_hw(struct hisi_hba *hisi_hba,
 			     struct hisi_sas_device *dev);
+extern void enable_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no);
 extern int phys_init_v1_hw(struct hisi_hba *hisi_hba);
 extern void sl_notify_v1_hw(struct hisi_hba *hisi_hba, int phy_no);
 extern void setup_itct_v1_hw(struct hisi_hba *hisi_hba,
 			     struct hisi_sas_device *device);
+extern void disable_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no);
 #endif
diff --git a/drivers/scsi/hisi_sas/hisi_sas_init.c b/drivers/scsi/hisi_sas/hisi_sas_init.c
index b6272d8..af4d613e1 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_init.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_init.c
@@ -38,6 +38,7 @@ static struct sas_domain_function_template hisi_sas_transport_ops = {
 	.lldd_dev_found		= hisi_sas_dev_found,
 	.lldd_dev_gone		= hisi_sas_dev_gone,
 	.lldd_execute_task	= hisi_sas_queue_command,
+	.lldd_control_phy	= hisi_sas_control_phy,
 	.lldd_abort_task	= hisi_sas_abort_task,
 	.lldd_abort_task_set	= hisi_sas_abort_task_set,
 	.lldd_clear_aca		= hisi_sas_clear_aca,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 12af29c..1e42611 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -472,6 +472,32 @@ int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time)
 	return 1;
 }
 
+static void hisi_sas_control_phy_work(struct hisi_hba *hisi_hba,
+				int func,
+				int phy_no)
+{
+	struct device *dev = &hisi_hba->pdev->dev;
+
+	switch (func) {
+	case PHY_FUNC_HARD_RESET:
+		hard_phy_reset_v1_hw(hisi_hba, phy_no);
+		break;
+
+	case PHY_FUNC_LINK_RESET:
+		enable_phy_v1_hw(hisi_hba, phy_no);
+		hard_phy_reset_v1_hw(hisi_hba, phy_no);
+		break;
+
+	case PHY_FUNC_DISABLE:
+		disable_phy_v1_hw(hisi_hba, phy_no);
+		break;
+
+	case PHY_FUNC_SET_LINK_RATE:
+	case PHY_FUNC_RELEASE_SPINUP_HOLD:
+	default:
+		dev_err(dev, "Control phy func %d unsupported\n", func);
+	}
+}
 
 static void hisi_sas_phyup_work(struct hisi_hba *hisi_hba,
 				      int phy_no)
@@ -487,8 +513,12 @@ void hisi_sas_wq_process(struct work_struct *work)
 	struct hisi_hba *hisi_hba = wq->hisi_hba;
 	int event = wq->event;
 	int phy_no = wq->phy_no;
+	int func = wq->data;
 
 	switch (event) {
+	case CONTROL_PHY:
+		hisi_sas_control_phy_work(hisi_hba, func, phy_no);
+		break;
 	case PHYUP:
 		hisi_sas_phyup_work(hisi_hba, phy_no);
 		break;
@@ -681,6 +711,40 @@ int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags)
 	return hisi_sas_task_exec(task, gfp_flags, NULL, 0, NULL);
 }
 
+int hisi_sas_control_phy(struct asd_sas_phy *sas_phy,
+			enum phy_func func,
+			void *funcdata)
+{
+	struct sas_ha_struct *sas_ha = sas_phy->ha;
+	struct hisi_hba *hisi_hba = NULL;
+	struct hisi_sas_phy *phy = NULL;
+	int phy_no = 0;
+	struct hisi_sas_wq *wq = kmalloc(sizeof(*wq), GFP_ATOMIC);
+
+	if (!wq)
+		return -ENOMEM;
+
+	while (sas_ha->sas_phy[phy_no]) {
+		if (sas_ha->sas_phy[phy_no] == sas_phy) {
+			hisi_hba = (struct hisi_hba *)sas_ha->lldd_ha;
+			break;
+		}
+		phy_no++;
+	}
+
+	phy = &hisi_hba->phy[phy_no];
+
+	wq->event = CONTROL_PHY;
+	wq->data = func;
+	wq->hisi_hba = hisi_hba;
+	wq->phy_no = phy_no;
+
+	INIT_WORK(&wq->work_struct, hisi_sas_wq_process);
+
+	queue_work(hisi_hba->wq, &wq->work_struct);
+
+	return 0;
+}
 
 static void hisi_sas_task_done(struct sas_task *task)
 {
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
index b470c72..b5ba46a 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
@@ -766,6 +766,13 @@ void enable_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
 	hisi_sas_phy_write32(hisi_hba, phy_no, PHY_CFG, cfg);
 }
 
+void disable_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
+{
+	u32 cfg = hisi_sas_phy_read32(hisi_hba, phy_no, PHY_CFG);
+
+	cfg &= ~PHY_CFG_ENA_MSK;
+	hisi_sas_phy_write32(hisi_hba, phy_no, PHY_CFG, cfg);
+}
 
 static void start_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
 {
@@ -775,6 +782,21 @@ static void start_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
 	enable_phy_v1_hw(hisi_hba, phy_no);
 }
 
+static void stop_phy_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
+{
+	disable_phy_v1_hw(hisi_hba, phy_no);
+}
+
+void hard_phy_reset_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
+{
+	struct sas_ha_struct *sha = &hisi_hba->sha;
+
+	stop_phy_v1_hw(hisi_hba, phy_no);
+	sas_drain_work(sha);
+	msleep(100);
+	start_phy_v1_hw(hisi_hba, phy_no);
+}
+
 static void start_phys_v1_hw(unsigned long data)
 {
 	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-10-12 15:20 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-12 15:20 [PATCH 00/25] HiSilicon SAS driver John Garry
2015-10-12 15:20 ` [PATCH 02/25] devicetree: bindings: scsi: HiSi SAS John Garry
2015-10-16 13:47   ` Rob Herring
     [not found]     ` <CAL_JsqLk9p_YX2FCNiR4sOSU74asN0UrOSJ5gQfnyRhrFH8LgQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-10-19 10:48       ` John Garry
2015-10-19 14:51         ` zhangfei
2015-10-12 15:20 ` [PATCH 03/25] scsi: hisi_sas: add initial bare driver John Garry
     [not found]   ` <1444663237-238302-4-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-15  8:49     ` Xinwei Kong
2015-10-15  9:23       ` John Garry
2015-10-15  9:28         ` zhangfei
     [not found]         ` <561F707C.1070305-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-15 12:07           ` Xinwei Kong
2015-10-12 15:20 ` [PATCH 04/25] scsi: hisi_sas: add scsi host registration John Garry
2015-10-12 15:21   ` Arnd Bergmann
2015-10-12 15:21     ` Arnd Bergmann
2015-10-13  9:16     ` John Garry
2015-10-13  9:16       ` John Garry
2015-10-13 12:18       ` Arnd Bergmann
2015-10-12 15:20 ` [PATCH 07/25] scsi: hisi_sas: add ioremap for device HW John Garry
2015-10-12 15:21   ` Arnd Bergmann
2015-10-13  9:47     ` zhangfei
2015-10-13  9:47       ` zhangfei
2015-10-13 12:20       ` Arnd Bergmann
2015-10-13 12:20         ` Arnd Bergmann
2015-10-13 15:09         ` zhangfei
2015-10-12 17:18   ` [RFC PATCH] scsi: hisi_sas: hisi_sas_ioremap() can be static kbuild test robot
2015-10-12 17:18   ` [PATCH 07/25] scsi: hisi_sas: add ioremap for device HW kbuild test robot
2015-10-12 15:20 ` [PATCH 08/25] scsi: hisi_sas: add cq structure initialization John Garry
2015-10-12 15:20 ` [PATCH 10/25] scsi: hisi_sas: add misc HBA initialization John Garry
2015-10-12 21:44   ` kbuild test robot
2015-10-12 15:20 ` [PATCH 12/25] scsi: hisi_sas: add v1 HW initialisation code John Garry
2015-10-12 18:46   ` Arnd Bergmann
2015-10-13 12:44     ` John Garry
2015-10-13 12:44       ` John Garry
2015-10-13 12:47       ` Arnd Bergmann
2015-10-12 15:20 ` [PATCH 13/25] scsi: hisi_sas: add path from phyup irq to SAS framework John Garry
2015-10-12 22:03   ` kbuild test robot
2015-10-13  0:27     ` Julian Calaby
2015-10-13  0:40       ` [lkp] " Fengguang Wu
2015-10-12 22:03   ` [RFC PATCH] scsi: hisi_sas: hisi_sas_bytes_dmaed() can be static kbuild test robot
2015-10-16 12:55   ` [PATCH 13/25] scsi: hisi_sas: add path from phyup irq to SAS framework Arnd Bergmann
2015-10-16 13:29     ` John Garry
2015-10-16 13:29       ` John Garry
2015-10-16 13:36       ` Arnd Bergmann
2015-10-19 14:11         ` John Garry
2015-10-19 14:11           ` John Garry
2015-10-19 14:26           ` Arnd Bergmann
2015-10-19 14:55             ` John Garry
2015-10-19 14:55               ` John Garry
2015-10-20  8:40               ` Arnd Bergmann
2015-10-20  9:09                 ` John Garry
2015-10-20  9:09                   ` John Garry
     [not found] ` <1444663237-238302-1-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-12 15:20   ` [PATCH 01/25] [SCSI] sas: centralise ssp frame information units John Garry
2015-10-12 15:20   ` [PATCH 05/25] scsi: hisi_sas: allocate memories and create pools John Garry
2015-10-12 15:15     ` Arnd Bergmann
2015-10-12 15:15       ` Arnd Bergmann
2015-10-13  9:42       ` zhangfei
     [not found]     ` <1444663237-238302-6-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-13  1:05       ` kbuild test robot
2015-10-12 15:20   ` [PATCH 06/25] scsi: hisi_sas: add slot init code John Garry
2015-10-12 15:20   ` [PATCH 09/25] scsi: hisi_sas: add phy SAS ADDR initialization John Garry
2015-10-13  6:12     ` Hannes Reinecke
     [not found]       ` <561CA0CB.5090802-l3A5Bk7waGM@public.gmane.org>
2015-10-13 17:14         ` John Garry
2015-10-14  8:40           ` Hannes Reinecke
     [not found]             ` <561E1501.2070507-l3A5Bk7waGM@public.gmane.org>
2015-10-14 15:05               ` John Garry
2015-10-14 15:18                 ` Arnd Bergmann
2015-10-15  3:36                   ` zhangfei
2015-10-15  8:43                     ` Arnd Bergmann
2015-10-12 15:20   ` [PATCH 11/25] scsi: hisi_sas: add v1 hardware register definitions John Garry
2015-10-12 15:20   ` [PATCH 14/25] scsi: hisi_sas: add ssp command function John Garry
2015-10-13  1:24     ` kbuild test robot
2015-10-12 15:20   ` [PATCH 20/25] scsi: hisi_sas: add smp protocol support John Garry
2015-10-12 15:20   ` [PATCH 22/25] scsi: hisi_sas: add tmf methods John Garry
2015-10-12 23:02     ` kbuild test robot
     [not found]       ` <1444663237-238302-23-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-12 23:02         ` [RFC PATCH] scsi: hisi_sas: hisi_sas_find_dev_phyno() can be static kbuild test robot
2015-10-12 15:20   ` John Garry [this message]
2015-10-12 15:20 ` [PATCH 15/25] scsi: hisi_sas: add cq interrupt handler John Garry
2015-10-12 22:15   ` kbuild test robot
2015-10-12 15:20 ` [PATCH 16/25] scsi: hisi_sas: add dev_found and port_formed John Garry
2015-10-12 22:35   ` [RFC PATCH] scsi: hisi_sas: hisi_sas_alloc_dev() can be static kbuild test robot
2015-10-12 22:35   ` [PATCH 16/25] scsi: hisi_sas: add dev_found and port_formed kbuild test robot
2015-10-12 15:20 ` [PATCH 17/25] scsi: hisi_sas: add abnormal irq handler John Garry
2015-10-12 15:20 ` [PATCH 18/25] scsi: hisi_sas: add dev_gone and port_deformed John Garry
     [not found]   ` <1444663237-238302-19-git-send-email-john.garry-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-10-12 22:49     ` kbuild test robot
2015-10-12 22:49   ` [RFC PATCH] scsi: hisi_sas: hisi_sas_do_release_task() can be static kbuild test robot
2015-10-12 15:20 ` [PATCH 19/25] scsi: hisi_sas: add bcast interrupt handler John Garry
2015-10-12 15:20 ` [PATCH 21/25] scsi: hisi_sas: add scan finished and start John Garry
2015-10-12 15:20 ` [PATCH 24/25] scsi: hisi_sas: add fatal irq handler John Garry
2015-10-12 15:20 ` [PATCH 25/25] MAINTAINERS: add maintainer for HiSi SAS driver John Garry
2015-10-19  8:47 ` [PATCH 00/25] HiSilicon " John Garry
2015-10-19  8:47   ` John Garry
2015-10-19  8:55   ` Hannes Reinecke
2015-10-19 10:40     ` John Garry
2015-10-19 10:40       ` John Garry

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=1444663237-238302-24-git-send-email-john.garry@huawei.com \
    --to=john.garry-hv44wf8li93qt0dzr+alfa@public.gmane.org \
    --cc=James.Bottomley-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org \
    --cc=arnd-r2nGTMty4D4@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=hare-l3A5Bk7waGM@public.gmane.org \
    --cc=john.garry2-s/0ZXS5h9803lw97EnAbAg@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TZ19SzzRMN9sA@public.gmane.org \
    --cc=linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linuxarm-hv44wF8Li93QT0dZR+AlfA@public.gmane.org \
    --cc=xuwei5-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org \
    --cc=zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    /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.