linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Finn Thain <fthain@telegraphics.com.au>
To: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Michael Schmitz <schmitzmic@gmail.com>,
	Sam Creasey <sammy@sammy.net>,
	linux-scsi@vger.kernel.org, linux-m68k@vger.kernel.org
Subject: [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables to host data
Date: Mon, 27 Oct 2014 16:26:42 +1100	[thread overview]
Message-ID: <20141027052615.575437286@telegraphics.com.au> (raw)
In-Reply-To: 20141027052607.105914311@telegraphics.com.au

[-- Attachment #1: atari_NCR5380-move-coroutine-variables --]
[-- Type: text/plain, Size: 7930 bytes --]

Unlike NCR5380.c, the atari_NCR5380.c core driver is limited to a single
instance because co-routine state is stored globally.

Fix this by removing the static scsi host pointer. For the co-routine,
obtain this pointer from the work_struct pointer instead. For the interrupt
handler, obtain it from the dev_id argument.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

---
 drivers/scsi/NCR5380.h       |    2 +
 drivers/scsi/atari_NCR5380.c |   61 +++++++++++++++----------------------------
 drivers/scsi/atari_scsi.c    |    8 ++---
 3 files changed, 28 insertions(+), 43 deletions(-)

Index: linux/drivers/scsi/NCR5380.h
===================================================================
--- linux.orig/drivers/scsi/NCR5380.h	2014-10-27 16:26:02.000000000 +1100
+++ linux/drivers/scsi/NCR5380.h	2014-10-27 16:26:03.000000000 +1100
@@ -283,6 +283,8 @@ struct NCR5380_hostdata {
 	int read_overruns;                /* number of bytes to cut from a
 	                                   * transfer to handle chip overruns */
 	int retain_dma_intr;
+	struct work_struct main_task;
+	volatile int main_running;
 #ifdef SUPPORT_TAGS
 	struct tag_alloc TagAlloc[8][8];	/* 8 targets and 8 LUNs */
 #endif
Index: linux/drivers/scsi/atari_NCR5380.c
===================================================================
--- linux.orig/drivers/scsi/atari_NCR5380.c	2014-10-27 16:26:02.000000000 +1100
+++ linux/drivers/scsi/atari_NCR5380.c	2014-10-27 16:26:03.000000000 +1100
@@ -221,9 +221,6 @@
  * possible) function may be used.
  */
 
-static struct Scsi_Host *first_instance = NULL;
-static struct scsi_host_template *the_template = NULL;
-
 /* Macros ease life... :-) */
 #define	SETUP_HOSTDATA(in)				\
     struct NCR5380_hostdata *hostdata =			\
@@ -595,32 +592,19 @@ static void NCR5380_print_phase(struct S
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 
-static volatile int main_running;
-static DECLARE_WORK(NCR5380_tqueue, NCR5380_main);
-
-static inline void queue_main(void)
+static inline void queue_main(struct NCR5380_hostdata *hostdata)
 {
-	if (!main_running) {
+	if (!hostdata->main_running) {
 		/* If in interrupt and NCR5380_main() not already running,
 		   queue it on the 'immediate' task queue, to be processed
 		   immediately after the current interrupt processing has
 		   finished. */
-		schedule_work(&NCR5380_tqueue);
+		schedule_work(&hostdata->main_task);
 	}
 	/* else: nothing to do: the running NCR5380_main() will pick up
 	   any newly queued command. */
 }
 
-
-static inline void NCR5380_all_init(void)
-{
-	static int done = 0;
-	if (!done) {
-		dprintk(NDEBUG_INIT, "scsi : NCR5380_all_init()\n");
-		done = 1;
-	}
-}
-
 /**
  * NCR58380_info - report driver and host information
  * @instance: relevant scsi host instance
@@ -703,7 +687,7 @@ static void NCR5380_print_status(struct
 
 	local_irq_save(flags);
 	printk("NCR5380: coroutine is%s running.\n",
-		main_running ? "" : "n't");
+		hostdata->main_running ? "" : "n't");
 	if (!hostdata->connected)
 		printk("scsi%d: no currently connected command\n", HOSTNO);
 	else
@@ -746,7 +730,7 @@ static int __maybe_unused NCR5380_show_i
 
 	local_irq_save(flags);
 	seq_printf(m, "NCR5380: coroutine is%s running.\n",
-		main_running ? "" : "n't");
+		hostdata->main_running ? "" : "n't");
 	if (!hostdata->connected)
 		seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
 	else
@@ -783,8 +767,7 @@ static int __init NCR5380_init(struct Sc
 	int i;
 	SETUP_HOSTDATA(instance);
 
-	NCR5380_all_init();
-
+	hostdata->host = instance;
 	hostdata->aborted = 0;
 	hostdata->id_mask = 1 << instance->this_id;
 	hostdata->id_higher_mask = 0;
@@ -805,10 +788,7 @@ static int __init NCR5380_init(struct Sc
 	hostdata->disconnected_queue = NULL;
 	hostdata->flags = flags;
 
-	if (!the_template) {
-		the_template = instance->hostt;
-		first_instance = instance;
-	}
+	INIT_WORK(&hostdata->main_task, NCR5380_main);
 
 	prepare_info(instance);
 
@@ -829,7 +809,9 @@ static int __init NCR5380_init(struct Sc
 
 static void NCR5380_exit(struct Scsi_Host *instance)
 {
-	cancel_work_sync(&NCR5380_tqueue);
+	struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+	cancel_work_sync(&hostdata->main_task);
 }
 
 /**
@@ -926,9 +908,9 @@ static int NCR5380_queue_command(struct
 	 * unconditionally, because it cannot be already running.
 	 */
 	if (in_interrupt() || irqs_disabled())
-		queue_main();
+		queue_main(hostdata);
 	else
-		NCR5380_main(NULL);
+		NCR5380_main(&hostdata->main_task);
 	return 0;
 }
 
@@ -957,9 +939,10 @@ static inline void maybe_release_dma_irq
 
 static void NCR5380_main(struct work_struct *work)
 {
+	struct NCR5380_hostdata *hostdata =
+		container_of(work, struct NCR5380_hostdata, main_task);
+	struct Scsi_Host *instance = hostdata->host;
 	struct scsi_cmnd *tmp, *prev;
-	struct Scsi_Host *instance = first_instance;
-	struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
 	int done;
 	unsigned long flags;
 
@@ -984,9 +967,9 @@ static void NCR5380_main(struct work_str
 	   'main_running' is set here, and queues/executes main via the
 	   task queue, it doesn't do any harm, just this instance of main
 	   won't find any work left to do. */
-	if (main_running)
+	if (hostdata->main_running)
 		return;
-	main_running = 1;
+	hostdata->main_running = 1;
 
 	local_save_flags(flags);
 	do {
@@ -1105,7 +1088,7 @@ static void NCR5380_main(struct work_str
 	/* Better allow ints _after_ 'main_running' has been cleared, else
 	   an interrupt could believe we'll pick up the work it left for
 	   us, but we won't see it anymore here... */
-	main_running = 0;
+	hostdata->main_running = 0;
 	local_irq_restore(flags);
 }
 
@@ -1219,7 +1202,7 @@ static void NCR5380_dma_complete(struct
 
 static irqreturn_t NCR5380_intr(int irq, void *dev_id)
 {
-	struct Scsi_Host *instance = first_instance;
+	struct Scsi_Host *instance = dev_id;
 	int done = 1, handled = 0;
 	unsigned char basr;
 
@@ -1291,7 +1274,7 @@ static irqreturn_t NCR5380_intr(int irq,
 	if (!done) {
 		dprintk(NDEBUG_INTR, "scsi%d: in int routine, calling main\n", HOSTNO);
 		/* Put a call to NCR5380_main() on the queue... */
-		queue_main();
+		queue_main(shost_priv(instance));
 	}
 	return IRQ_RETVAL(handled);
 }
@@ -1771,7 +1754,7 @@ static int NCR5380_transfer_pio(struct S
  * Returns : 0 on success, -1 on failure.
  */
 
-static int do_abort(struct Scsi_Host *host)
+static int do_abort(struct Scsi_Host *instance)
 {
 	unsigned char tmp, *msgptr, phase;
 	int len;
@@ -1806,7 +1789,7 @@ static int do_abort(struct Scsi_Host *ho
 	msgptr = &tmp;
 	len = 1;
 	phase = PHASE_MSGOUT;
-	NCR5380_transfer_pio(host, &phase, &len, &msgptr);
+	NCR5380_transfer_pio(instance, &phase, &len, &msgptr);
 
 	/*
 	 * If we got here, and the command completed successfully,
Index: linux/drivers/scsi/atari_scsi.c
===================================================================
--- linux.orig/drivers/scsi/atari_scsi.c	2014-10-27 16:26:00.000000000 +1100
+++ linux/drivers/scsi/atari_scsi.c	2014-10-27 16:26:03.000000000 +1100
@@ -110,7 +110,7 @@
 #define NCR5380_dma_xfer_len(instance, cmd, phase) \
         atari_dma_xfer_len(cmd->SCp.this_residual, cmd, !((phase) & SR_IO))
 
-#define NCR5380_acquire_dma_irq(instance)      falcon_get_lock()
+#define NCR5380_acquire_dma_irq(instance)      falcon_get_lock(instance)
 #define NCR5380_release_dma_irq(instance)      falcon_release_lock()
 
 #include "NCR5380.h"
@@ -468,15 +468,15 @@ static void falcon_release_lock(void)
  * command immediately but tell the SCSI mid-layer to defer.
  */
 
-static int falcon_get_lock(void)
+static int falcon_get_lock(struct Scsi_Host *instance)
 {
 	if (IS_A_TT())
 		return 1;
 
 	if (in_interrupt()) {
-		return stdma_try_lock(scsi_falcon_intr, NULL);
+		return stdma_try_lock(scsi_falcon_intr, instance);
 	} else {
-		stdma_lock(scsi_falcon_intr, NULL);
+		stdma_lock(scsi_falcon_intr, instance);
 		return 1;
 	}
 }



  parent reply	other threads:[~2014-10-27 10:32 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-27  5:26 [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Finn Thain
2014-10-27  5:26 ` [PATCH v2 01/36] ncr5380: Use printk() not pr_debug() Finn Thain
2014-10-27  5:26 ` [PATCH v2 02/36] ncr5380: Remove unused hostdata fields Finn Thain
2014-10-27  5:26 ` [PATCH v2 03/36] ncr5380: Fix compiler warnings and __setup options Finn Thain
2014-10-27  5:26 ` [PATCH v2 04/36] ncr5380: Remove unused macros Finn Thain
2014-10-27  5:26 ` [PATCH v2 05/36] ncr5380: Remove useless prototypes Finn Thain
2014-10-29 14:41   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 06/36] ncr5380: Remove more " Finn Thain
2014-10-29 14:44   ` Hannes Reinecke
2014-11-09 12:19     ` Finn Thain
2014-11-11 12:47       ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 07/36] ncr5380: Cleanup TAG_NEXT and TAG_NONE macros Finn Thain
2014-10-29 14:45   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 08/36] ncr5380: Remove redundant AUTOSENSE macro Finn Thain
2014-10-29 15:57   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 09/36] ncr5380: Remove duplicate comments Finn Thain
2014-10-29 15:59   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 10/36] ncr5380: Fix SCSI_IRQ_NONE bugs Finn Thain
2014-10-29 16:07   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 11/36] ncr5380: Remove NCR5380_STATS Finn Thain
2014-10-29 16:11   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 12/36] ncr5380: Cleanup host info() methods Finn Thain
2014-10-29 16:17   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 13/36] ncr5380: Move static PDMA spin counters to host data Finn Thain
2014-10-30  7:31   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 14/36] ncr5380: Remove pointless compiler command line override macros Finn Thain
2014-10-30  7:34   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 15/36] ncr5380: Remove *_RELEASE macros Finn Thain
2014-10-30  7:36   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 16/36] ncr5380: Drop legacy scsi.h include Finn Thain
2014-10-30  7:37   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 17/36] dmx3191d: Use NO_IRQ Finn Thain
2014-10-30  7:38   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 18/36] mac_scsi: Remove header Finn Thain
2014-10-30  7:39   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 19/36] mac_scsi: Add module option to Kconfig Finn Thain
2014-10-30  7:44   ` Hannes Reinecke
2014-10-31  7:17     ` Finn Thain
2014-10-31  8:33       ` Hannes Reinecke
2014-11-09 12:17         ` Finn Thain
2014-11-10  7:02           ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 20/36] mac_scsi: Cleanup PDMA code Finn Thain
2014-10-30  7:46   ` Hannes Reinecke
2014-10-30  8:45     ` Hannes Reinecke
2014-10-31  7:18       ` Finn Thain
2014-10-31  8:34         ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 21/36] mac_scsi: Convert to platform device Finn Thain
2014-10-30  7:55   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 22/36] atari_scsi: Fix atari_scsi deadlocks on Falcon Finn Thain
2014-10-30  8:07   ` Hannes Reinecke
2014-11-07 18:08   ` Michael Schmitz
2014-11-08  0:37     ` Finn Thain
2014-11-08  7:22       ` Michael Schmitz
2014-10-27  5:26 ` [PATCH v2 23/36] atari_scsi: Convert to platform device Finn Thain
2014-10-30  8:17   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 24/36] atari_scsi: Remove header Finn Thain
2014-10-30  8:18   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 25/36] sun3_scsi: Convert to platform device Finn Thain
2014-10-30  8:20   ` Hannes Reinecke
2014-11-09 10:25   ` Geert Uytterhoeven
2014-11-09 12:12     ` Finn Thain
2014-11-09 12:18       ` Geert Uytterhoeven
2014-10-27  5:26 ` [PATCH v2 26/36] sun3_scsi: Move macro definitions Finn Thain
2014-10-30  8:20   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 27/36] ncr5380: Remove ENABLE_IRQ/DISABLE_IRQ macros Finn Thain
2014-10-30  8:21   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 28/36] atari_NCR5380: Refactor Falcon special cases Finn Thain
2014-10-30  8:23   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 29/36] atari_NCR5380: Refactor Falcon locking Finn Thain
2014-10-30  8:27   ` Hannes Reinecke
2014-10-31  7:20     ` Finn Thain
2014-11-09 12:18       ` Finn Thain
2014-11-10  7:03         ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 30/36] atari_NCR5380: Merge from sun3_NCR5380.c Finn Thain
2014-10-30  8:33   ` Hannes Reinecke
2014-10-31  7:21     ` Finn Thain
2014-10-31  8:40       ` Hannes Reinecke
2014-10-31 12:48         ` Finn Thain
2014-10-27  5:26 ` [PATCH v2 31/36] sun3_scsi: Adopt atari_NCR5380 core driver and remove sun3_NCR5380.c Finn Thain
2014-10-30  8:35   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 32/36] atari_NCR5380: Merge from NCR5380.c Finn Thain
2014-10-30  8:37   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 33/36] atari_NCR5380: Introduce FLAG_TAGGED_QUEUING Finn Thain
2014-10-30  8:39   ` Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 34/36] atari_NCR5380: Move static TagAlloc array to host data Finn Thain
2014-10-30  8:41   ` Hannes Reinecke
2014-10-27  5:26 ` Finn Thain [this message]
2014-10-30  8:42   ` [PATCH v2 35/36] atari_NCR5380: Move static co-routine variables " Hannes Reinecke
2014-10-27  5:26 ` [PATCH v2 36/36] atari_NCR5380: Remove RESET_RUN_DONE macro Finn Thain
2014-10-30  8:44   ` Hannes Reinecke
2014-11-02  5:28 ` [PATCH v2 00/36] Fixes, cleanups and modernization for NCR5380 drivers Michael Schmitz
2014-11-02  6:12   ` Finn Thain
     [not found]     ` <5455E340.7080305@gmail.com>
2014-11-04 23:36       ` Michael Schmitz
2014-11-05  7:56         ` David Gálvez
2014-11-05  8:10           ` Geert Uytterhoeven
2014-11-06  2:09             ` Michael Schmitz
2014-11-06  4:50               ` Finn Thain
2014-11-06 18:54                 ` Michael Schmitz
2014-11-07  2:34                   ` Finn Thain
2014-11-09 10:33                     ` Geert Uytterhoeven

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=20141027052615.575437286@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=JBottomley@parallels.com \
    --cc=linux-m68k@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=sammy@sammy.net \
    --cc=schmitzmic@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).