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

Commit 77570eed authored by Kees Cook's avatar Kees Cook
Browse files

scsi: sas: Convert timers to use timer_setup()



In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly. This requires adding a pointer to
hold the timer's target task, as there isn't a link back from slow_task.

Cc: John Garry <john.garry@huawei.com>
Cc: "James E.J. Bottomley" <jejb@linux.vnet.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Jack Wang <jinpu.wang@profitbricks.com>
Cc: lindar_liu@usish.com
Cc: Jens Axboe <axboe@fb.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Benjamin Block <bblock@linux.vnet.ibm.com>
Cc: Baoyou Xie <baoyou.xie@linaro.org>
Cc: Wei Yongjun <weiyongjun1@huawei.com>
Cc: linux-scsi@vger.kernel.org
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Acked-by: John Garry <john.garry@huawei.com> # for hisi_sas part
Tested-by: John Garry <john.garry@huawei.com> # basic sanity test for hisi_sas
Reviewed-by: default avatarJack Wang <jinpu.wang@profitbricks.com>
parent 242b5657
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -103,7 +103,6 @@ struct hisi_sas_phy {
	struct hisi_sas_port	*port;
	struct asd_sas_phy	sas_phy;
	struct sas_identify	identify;
	struct timer_list	timer;
	struct work_struct	phyup_ws;
	u64		port_id; /* from hw */
	u64		dev_sas_addr;
+6 −8
Original line number Diff line number Diff line
@@ -627,7 +627,6 @@ static void hisi_sas_phy_init(struct hisi_hba *hisi_hba, int phy_no)

	phy->hisi_hba = hisi_hba;
	phy->port = NULL;
	init_timer(&phy->timer);
	sas_phy->enabled = (phy_no < hisi_hba->n_phy) ? 1 : 0;
	sas_phy->class = SAS;
	sas_phy->iproto = SAS_PROTOCOL_ALL;
@@ -792,9 +791,10 @@ static void hisi_sas_task_done(struct sas_task *task)
	complete(&task->slow_task->completion);
}

static void hisi_sas_tmf_timedout(unsigned long data)
static void hisi_sas_tmf_timedout(struct timer_list *t)
{
	struct sas_task *task = (struct sas_task *)data;
	struct sas_task_slow *slow = from_timer(slow, t, timer);
	struct sas_task *task = slow->task;
	unsigned long flags;

	spin_lock_irqsave(&task->task_state_lock, flags);
@@ -833,8 +833,7 @@ static int hisi_sas_exec_internal_tmf_task(struct domain_device *device,
		}
		task->task_done = hisi_sas_task_done;

		task->slow_task->timer.data = (unsigned long) task;
		task->slow_task->timer.function = hisi_sas_tmf_timedout;
		task->slow_task->timer.function = (TIMER_FUNC_TYPE)hisi_sas_tmf_timedout;
		task->slow_task->timer.expires = jiffies + TASK_TIMEOUT*HZ;
		add_timer(&task->slow_task->timer);

@@ -1447,8 +1446,7 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
	task->dev = device;
	task->task_proto = device->tproto;
	task->task_done = hisi_sas_task_done;
	task->slow_task->timer.data = (unsigned long)task;
	task->slow_task->timer.function = hisi_sas_tmf_timedout;
	task->slow_task->timer.function = (TIMER_FUNC_TYPE)hisi_sas_tmf_timedout;
	task->slow_task->timer.expires = jiffies + msecs_to_jiffies(110);
	add_timer(&task->slow_task->timer);

@@ -1877,7 +1875,7 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
	hisi_hba->shost = shost;
	SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;

	init_timer(&hisi_hba->timer);
	timer_setup(&hisi_hba->timer, NULL, 0);

	if (hisi_sas_get_fw_info(hisi_hba) < 0)
		goto err_out;
+3 −3
Original line number Diff line number Diff line
@@ -807,9 +807,9 @@ static void phy_hard_reset_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
	start_phy_v1_hw(hisi_hba, phy_no);
}

static void start_phys_v1_hw(unsigned long data)
static void start_phys_v1_hw(struct timer_list *t)
{
	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
	struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
	int i;

	for (i = 0; i < hisi_hba->n_phy; i++) {
@@ -828,7 +828,7 @@ static void phys_init_v1_hw(struct hisi_hba *hisi_hba)
		hisi_sas_phy_read32(hisi_hba, i, CHL_INT2_MSK);
	}

	setup_timer(timer, start_phys_v1_hw, (unsigned long)hisi_hba);
	timer_setup(timer, start_phys_v1_hw, 0);
	mod_timer(timer, jiffies + HZ);
}

+11 −13
Original line number Diff line number Diff line
@@ -728,7 +728,7 @@ enum {
#define ERR_ON_RX_PHASE(err_phase) (err_phase == 0x10 || \
		err_phase == 0x20 || err_phase == 0x40)

static void link_timeout_disable_link(unsigned long data);
static void link_timeout_disable_link(struct timer_list *t);

static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
{
@@ -1270,9 +1270,9 @@ static void init_reg_v2_hw(struct hisi_hba *hisi_hba)
			 upper_32_bits(hisi_hba->initial_fis_dma));
}

static void link_timeout_enable_link(unsigned long data)
static void link_timeout_enable_link(struct timer_list *t)
{
	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
	struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
	int i, reg_val;

	for (i = 0; i < hisi_hba->n_phy; i++) {
@@ -1287,13 +1287,13 @@ static void link_timeout_enable_link(unsigned long data)
		}
	}

	hisi_hba->timer.function = link_timeout_disable_link;
	hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_disable_link;
	mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(900));
}

static void link_timeout_disable_link(unsigned long data)
static void link_timeout_disable_link(struct timer_list *t)
{
	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
	struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
	int i, reg_val;

	reg_val = hisi_sas_read32(hisi_hba, PHY_STATE);
@@ -1308,14 +1308,13 @@ static void link_timeout_disable_link(unsigned long data)
		}
	}

	hisi_hba->timer.function = link_timeout_enable_link;
	hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_enable_link;
	mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(100));
}

static void set_link_timer_quirk(struct hisi_hba *hisi_hba)
{
	hisi_hba->timer.data = (unsigned long)hisi_hba;
	hisi_hba->timer.function = link_timeout_disable_link;
	hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_disable_link;
	hisi_hba->timer.expires = jiffies + msecs_to_jiffies(1000);
	add_timer(&hisi_hba->timer);
}
@@ -2574,9 +2573,9 @@ static int prep_ata_v2_hw(struct hisi_hba *hisi_hba,
	return 0;
}

static void hisi_sas_internal_abort_quirk_timeout(unsigned long data)
static void hisi_sas_internal_abort_quirk_timeout(struct timer_list *t)
{
	struct hisi_sas_slot *slot = (struct hisi_sas_slot *)data;
	struct hisi_sas_slot *slot = from_timer(slot, t, internal_abort_timer);
	struct hisi_sas_port *port = slot->port;
	struct asd_sas_port *asd_sas_port;
	struct asd_sas_phy *sas_phy;
@@ -2619,8 +2618,7 @@ static int prep_abort_v2_hw(struct hisi_hba *hisi_hba,
	struct timer_list *timer = &slot->internal_abort_timer;

	/* setup the quirk timer */
	setup_timer(timer, hisi_sas_internal_abort_quirk_timeout,
		    (unsigned long)slot);
	timer_setup(timer, hisi_sas_internal_abort_quirk_timeout, 0);
	/* Set the timeout to 10ms less than internal abort timeout */
	mod_timer(timer, jiffies + msecs_to_jiffies(100));

+1 −1
Original line number Diff line number Diff line
@@ -1823,7 +1823,7 @@ hisi_sas_shost_alloc_pci(struct pci_dev *pdev)
	hisi_hba->shost = shost;
	SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;

	init_timer(&hisi_hba->timer);
	timer_setup(&hisi_hba->timer, NULL, 0);

	if (hisi_sas_get_fw_info(hisi_hba) < 0)
		goto err_out;
Loading