]> err.no Git - linux-2.6/blobdiff - drivers/fc4/fc.c
[PATCH] skge: fifo control register access fix
[linux-2.6] / drivers / fc4 / fc.c
index 1fbb219aa9baa1fbc7a57927636881e127a00e02..5d961f5e0ca0011121063d07734dbdbcff495a4d 100644 (file)
@@ -365,6 +365,7 @@ void fcp_register(fc_channel *fc, u8 type, int unregister)
                        kfree (fc->scsi_bitmap);
                        kfree (fc->cmd_slots);
                        FCND(("Unregistering\n"));
+#if 0
                        if (fc->rst_pkt) {
                                if (fc->rst_pkt->eh_state == SCSI_STATE_UNUSED)
                                        kfree(fc->rst_pkt);
@@ -373,6 +374,7 @@ void fcp_register(fc_channel *fc, u8 type, int unregister)
                                        printk("FC: Reset in progress. Now?!");
                                }
                        }
+#endif
                        FCND(("Unregistered\n"));
                }
        } else
@@ -765,12 +767,8 @@ void fcp_release(fc_channel *fcchain, int count)  /* count must > 0 */
 
 static void fcp_scsi_done (Scsi_Cmnd *SCpnt)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
        if (FCP_CMND(SCpnt)->done)
                FCP_CMND(SCpnt)->done(SCpnt);
-       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
 }
 
 static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, int prepare)
@@ -909,12 +907,8 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt)
         */
 
        if (++fc->abort_count < (fc->can_queue >> 1)) {
-               unsigned long flags;
-
                SCpnt->result = DID_ABORT;
-               spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
                fcmd->done(SCpnt);
-               spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
                printk("FC: soft abort\n");
                return SUCCESS;
        } else {
@@ -923,6 +917,7 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt)
        }
 }
 
+#if 0
 void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt)
 {
        fc_channel *fc = FC_SCMND(SCpnt);
@@ -930,11 +925,14 @@ void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt)
        fc->rst_pkt->eh_state = SCSI_STATE_FINISHED;
        up(fc->rst_pkt->device->host->eh_action);
 }
+#endif
 
 #define FCP_RESET_TIMEOUT (2*HZ)
 
 int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
 {
+#if 0 /* broken junk, but if davem wants to compile this driver, let him.. */
+       unsigned long flags;
        fcp_cmd *cmd;
        fcp_cmnd *fcmd;
        fc_channel *fc = FC_SCMND(SCpnt);
@@ -987,7 +985,10 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
        fc->rst_pkt->request->rq_status = RQ_SCSI_BUSY;
 
        fc->rst_pkt->done = fcp_scsi_reset_done;
+
+       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
        fcp_scsi_queue_it(fc, fc->rst_pkt, fcmd, 0);
+       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
        
        down(&sem);
 
@@ -1004,15 +1005,10 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
        }
        fc->rst_pkt->eh_state = SCSI_STATE_UNUSED;
        return SUCCESS;
+#endif
 }
 
-int fcp_scsi_bus_reset(Scsi_Cmnd *SCpnt)
-{
-       printk ("FC: bus reset!\n");
-       return FAILED;
-}
-
-int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
+static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
 {
        fc_channel *fc = FC_SCMND(SCpnt);
        fcp_cmnd *fcmd = FCP_CMND(SCpnt);
@@ -1033,6 +1029,18 @@ int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
        else return FAILED;
 }
 
+int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
+{
+       unsigned long flags;
+       int rc;
+
+       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+       rc = __fcp_scsi_host_reset(SCpnt);
+       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+
+       return rc;
+}
+
 static int fcp_els_queue_it(fc_channel *fc, fcp_cmnd *fcmd)
 {
        long i;