[SCSI] Disable sym2 driver queueing
authorMatthew Wilcox <matthew@wil.cx>
Tue, 28 Mar 2006 16:03:44 +0000 (11:03 -0500)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Thu, 13 Apr 2006 15:13:24 +0000 (10:13 -0500)
Undef SYM_OPT_HANDLE_DEVICE_QUEUEING.
Call sym_put_start_queue instead of sym_start_next_ccbs.
Turn asserts into checks that we can send the command to the adapter,
and return busy from queuecommand if we can't.

Signed-off-by: Matthew Wilcox <matthew@wil.cx>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/sym53c8xx_2/sym_glue.c
drivers/scsi/sym53c8xx_2/sym_glue.h
drivers/scsi/sym53c8xx_2/sym_hipd.c
drivers/scsi/sym53c8xx_2/sym_hipd.h

index 052ce11806ad77f8831c472fce5113596f20af46..a27dd66b6613689cc14d3f19c1b3597bf79e11dd 100644 (file)
@@ -475,8 +475,6 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc
  */
 int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
 {
-       struct sym_tcb *tp = &np->target[cp->target];
-       struct sym_lcb *lp = sym_lp(tp, cp->lun);
        u32 lastp, goalp;
        int dir;
 
@@ -557,7 +555,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s
        /*
         *      activate this job.
         */
-       sym_start_next_ccbs(np, lp, 2);
+       sym_put_start_queue(np, cp);
        return 0;
 
 out_abort:
@@ -871,15 +869,12 @@ static void sym_tune_dev_queuing(struct sym_tcb *tp, int lun, u_short reqtags)
        if (reqtags > lp->s.scdev_depth)
                reqtags = lp->s.scdev_depth;
 
-       lp->started_limit = reqtags ? reqtags : 2;
-       lp->started_max   = 1;
        lp->s.reqtags     = reqtags;
 
        if (reqtags != oldtags) {
                dev_info(&tp->starget->dev,
                         "tagged command queuing %s, command queue depth %d.\n",
-                         lp->s.reqtags ? "enabled" : "disabled",
-                         lp->started_limit);
+                         lp->s.reqtags ? "enabled" : "disabled", reqtags);
        }
 }
 
index cc92d0c70cd710ed2ea42c94f54beb38d5d96aa9..a446cda3f64c015d6a8fe1301497b6a888bed6e5 100644 (file)
@@ -68,7 +68,7 @@
  */
 #define        SYM_CONF_TIMER_INTERVAL         ((HZ+1)/2)
 
-#define SYM_OPT_HANDLE_DEVICE_QUEUEING
+#undef SYM_OPT_HANDLE_DEVICE_QUEUEING
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 
 /*
index b2ac482caae8806a7a3c02af1a0a6ea28a4513d4..a6cbb90e2bb901176bcaacb0b56477c252e4d601 100644 (file)
@@ -1469,7 +1469,7 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp
 /*
  *  Insert a job into the start queue.
  */
-static void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
+void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
 {
        u_short qidx;
 
@@ -4602,7 +4602,8 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t
                         *  Debugging purpose.
                         */
 #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
-                       assert(lp->busy_itl == 0);
+                       if (lp->busy_itl != 0)
+                               goto out_free;
 #endif
                        /*
                         *  Allocate resources for tags if not yet.
@@ -4647,7 +4648,8 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t
                         *  Debugging purpose.
                         */
 #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
-                       assert(lp->busy_itl == 0 && lp->busy_itlq == 0);
+                       if (lp->busy_itl != 0 || lp->busy_itlq != 0)
+                               goto out_free;
 #endif
                        /*
                         *  Count this nexus for this LUN.
index 2456090bb2411734b908bcb7a63fc6700899774d..79ab6a177039956cf6da70a12c160982c0f61620 100644 (file)
@@ -1049,6 +1049,8 @@ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int);
 struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision);
 #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
 void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn);
+#else
+void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp);
 #endif
 void sym_start_up(struct sym_hcb *np, int reason);
 void sym_interrupt(struct sym_hcb *np);