public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Mike Christie <mikenc@us.ibm.com>
To: linux-scsi@vger.kernel.org
Cc: "Harris, Fred" <Fred.Harris@hp.com>
Subject: [PATCH] [RESEND] fixes compile errors in cpqfc driver
Date: Mon, 14 Jul 2003 12:54:32 -0700	[thread overview]
Message-ID: <3F130A78.6030004@us.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 564 bytes --]

The attached path fixes the compile errors in the cpqfc driver caused by 
changes in scsi_cmnd. And, per Christoph and James's comments 
http://marc.theaimsgroup.com/?l=linux-scsi&m=105099392420649&w=2 I have 
removed the scsi_cmnd stack usage.

I do not have the hardware, so I have only verified that it compiles.


Mike Christie
mikenc@us.ibm.com



cpqfcTSinit.c    |   35 +++++++++++++++++++++---------
cpqfcTSstructs.h |    1
cpqfcTSworker.c  |   63 
+++++++++++++++++++++++++++++++------------------------
3 files changed, 61 insertions(+), 38 deletions(-)

[-- Attachment #2: cpqfc.patch --]
[-- Type: text/plain, Size: 10046 bytes --]

diff -uar linux-2.5.75/drivers/scsi/cpqfcTSinit.c linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSinit.c
--- linux-2.5.75/drivers/scsi/cpqfcTSinit.c	2003-07-10 13:04:48.000000000 -0700
+++ linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSinit.c	2003-07-13 00:19:56.000000000 -0700
@@ -549,14 +549,14 @@
 			hba->private_data_bits+(i/BITS_PER_LONG));
 }
 
-int cpqfcTS_ioctl( Scsi_Device *ScsiDev, int Cmnd, void *arg)
+int cpqfcTS_ioctl( struct scsi_device *ScsiDev, int Cmnd, void *arg)
 {
   int result = 0;
   struct Scsi_Host *HostAdapter = ScsiDev->host;
   CPQFCHBA *cpqfcHBAdata = (CPQFCHBA *)HostAdapter->hostdata;
   PTACHYON fcChip = &cpqfcHBAdata->fcChip;
   PFC_LOGGEDIN_PORT pLoggedInPort = NULL;
-  Scsi_Cmnd DumCmnd;
+  struct scsi_cmnd *DumCmnd;
   int i, j;
   VENDOR_IOCTL_REQ ioc;
   cpqfc_passthru_t *vendor_cmd;
@@ -723,13 +723,16 @@
 /* 	DumCmnd.target  = ScsiDev->id; */
 /* 	DumCmnd.lun     = ScsiDev->lun; */
 
-        DumCmnd.device = ScsiDev;
+	DumCmnd = scsi_get_command (ScsiDev, GFP_KERNEL);
+	if (!DumCmnd)
+		return -ENOMEM;
 	
 	pLoggedInPort = fcFindLoggedInPort( fcChip,
-		&DumCmnd, // search Scsi Nexus
+		DumCmnd, // search Scsi Nexus
 		0,        // DON'T search linked list for FC port id
 		NULL,     // DON'T search linked list for FC WWN
 		NULL);    // DON'T care about end of list
+	scsi_put_command (DumCmnd);
 	if (pLoggedInPort == NULL) {
 		result = -ENXIO;
 		break;
@@ -918,7 +921,8 @@
 int cpqfcTS_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, 
 		       int inout)
 {
-  Scsi_Cmnd DumCmnd;
+  struct scsi_cmnd *DumCmnd;
+  struct scsi_device *ScsiDev;
   int Chan, Targ, i;
   struct info_str info;
   CPQFCHBA *cpqfcHBA;
@@ -946,13 +950,21 @@
 
 #define DISPLAY_WWN_INFO
 #ifdef DISPLAY_WWN_INFO
+  ScsiDev = scsi_get_host_dev (host);
+  if (!ScsiDev) 
+    return -ENOMEM;
+  DumCmnd = scsi_get_command (ScsiDev, GFP_KERNEL);
+  if (!DumCmnd) {
+    scsi_free_host_dev (ScsiDev);
+    return -ENOMEM;
+  }
   copy_info(&info, "WWN database: (\"port_id: 000000\" means disconnected)\n");
   for ( Chan=0; Chan <= host->max_channel; Chan++) {
-    DumCmnd.channel = Chan;
+    DumCmnd->device->channel = Chan;
     for (Targ=0; Targ <= host->max_id; Targ++) {
-      DumCmnd.target = Targ;
+      DumCmnd->device->id = Targ;
       if ((pLoggedInPort = fcFindLoggedInPort( fcChip,
-	    			&DumCmnd, // search Scsi Nexus
+	    			DumCmnd,  // search Scsi Nexus
     				0,        // DON'T search list for FC port id
     				NULL,     // DON'T search list for FC WWN
     				NULL))){   // DON'T care about end of list
@@ -966,6 +978,9 @@
       }
     }
   }
+
+  scsi_put_command (DumCmnd);
+  scsi_free_host_dev (ScsiDev);
 #endif
 
 
@@ -1578,7 +1593,7 @@
 // Scsi_Request, etc.
 // For now, so people don't fall into a hole...
 return -ENOTSUPP;
-
+/*
   // printk("   ENTERING cpqfcTS_TargetDeviceReset() - flag=%d \n",reset_flags);
 
   if (ScsiDev->host->eh_active) return FAILED;
@@ -1600,7 +1615,7 @@
 	SCpnt->request->CPQFC_WAITING = NULL;
   }
     
-/*
+
       if(driver_byte(SCpnt->result) != 0)
 	  switch(SCpnt->sense_buffer[2] & 0xf) {
 	case ILLEGAL_REQUEST:
diff -uar linux-2.5.75/drivers/scsi/cpqfcTSstructs.h linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSstructs.h
--- linux-2.5.75/drivers/scsi/cpqfcTSstructs.h	2003-07-10 13:08:26.000000000 -0700
+++ linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSstructs.h	2003-07-13 00:16:29.000000000 -0700
@@ -696,7 +696,6 @@
 
   ULONG port_id;     // a FC 24-bit address of port (lower 8 bits = al_pa)
 
-  Scsi_Cmnd ScsiCmnd;   // command buffer for Report Luns
 #define REPORT_LUNS_PL 256  
   UCHAR ReportLunsPayload[REPORT_LUNS_PL];
   
diff -uar linux-2.5.75/drivers/scsi/cpqfcTSworker.c linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSworker.c
--- linux-2.5.75/drivers/scsi/cpqfcTSworker.c	2003-07-10 13:12:59.000000000 -0700
+++ linux-2.5.75-cpqfc/drivers/scsi/cpqfcTSworker.c	2003-07-13 15:40:09.000000000 -0700
@@ -30,6 +30,7 @@
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/smp_lock.h>
+#include <linux/pci.h>
 
 #define __KERNEL_SYSCALLS__
 
@@ -1196,9 +1197,9 @@
 	// have to terminate by SCSI target, NOT port_id.
         if( Exchanges->fcExchange[x_ID].Cmnd) // Cmnd in progress?
 	{	                 
-	  if( (Exchanges->fcExchange[x_ID].Cmnd->target == ScsiNexus->target)
+	  if( (Exchanges->fcExchange[x_ID].Cmnd->device->id == ScsiNexus->target)
 			&&
-            (Exchanges->fcExchange[x_ID].Cmnd->channel == ScsiNexus->channel)) 
+            (Exchanges->fcExchange[x_ID].Cmnd->device->channel == ScsiNexus->channel)) 
           {
             Exchanges->fcExchange[x_ID].status = TerminateStatus;
             cpqfcTSPutLinkQue( cpqfcHBAdata, BLS_ABTS, &x_ID ); // timed-out
@@ -2681,7 +2682,7 @@
 // D. Deming, 1994, pg 7-19 (ISBN 1-879936-08-9)
 static void ScsiReportLunsDone(Scsi_Cmnd *Cmnd)
 {
-  struct Scsi_Host *HostAdapter = Cmnd->host;
+  struct Scsi_Host *HostAdapter = Cmnd->device->host;
   CPQFCHBA *cpqfcHBAdata = (CPQFCHBA *)HostAdapter->hostdata;
   PTACHYON fcChip = &cpqfcHBAdata->fcChip;
   FC_EXCHANGES *Exchanges = fcChip->Exchanges;
@@ -2887,11 +2888,11 @@
 call_scsi_done(Scsi_Cmnd *Cmnd)
 {
 	CPQFCHBA *hba;
-	hba = (CPQFCHBA *) Cmnd->host->hostdata;
+	hba = (CPQFCHBA *) Cmnd->device->host->hostdata;
 	// Was this command a cpqfc passthru ioctl ?
-        if (Cmnd->sc_request != NULL && Cmnd->host != NULL && 
-		Cmnd->host->hostdata != NULL &&
-		is_private_data_of_cpqfc((CPQFCHBA *) Cmnd->host->hostdata,
+        if (Cmnd->sc_request != NULL && Cmnd->device->host != NULL && 
+		Cmnd->device->host->hostdata != NULL &&
+		is_private_data_of_cpqfc((CPQFCHBA *) Cmnd->device->host->hostdata,
 			Cmnd->sc_request->upper_private_data)) {
 		cpqfc_free_private_data(hba, 
 			Cmnd->sc_request->upper_private_data);	
@@ -2918,7 +2919,8 @@
 {
   PTACHYON fcChip = &cpqfcHBAdata->fcChip;
   PFC_LOGGEDIN_PORT pLoggedInPort; 
-  Scsi_Cmnd *Cmnd;
+  struct scsi_cmnd *Cmnd = NULL;
+  struct scsi_device *ScsiDev = NULL;
   LONG x_ID;
   ULONG ulStatus;
   UCHAR *ucBuff;
@@ -2942,17 +2944,20 @@
     if( !(pLoggedInPort->fcp_info & TARGET_FUNCTION) )
       goto Done;  // forget it - FC device not a "target"
 
-    // now use the port's Scsi Command buffer for the 
-    // Report Luns Command
  
-    Cmnd = &pLoggedInPort->ScsiCmnd; 
+    ScsiDev = scsi_get_host_dev (cpqfcHBAdata->HostAdapter);
+    if (!ScsiDev)
+      goto Done;
+    
+    Cmnd = scsi_get_command (ScsiDev, GFP_KERNEL);
+    if (!Cmnd) 
+      goto Done;
+
     ucBuff = pLoggedInPort->ReportLunsPayload;
     
-    memset( Cmnd, 0, sizeof(Scsi_Cmnd));
     memset( ucBuff, 0, REPORT_LUNS_PL);
     
     Cmnd->scsi_done = ScsiReportLunsDone;
-    Cmnd->host = cpqfcHBAdata->HostAdapter;
 
     Cmnd->request_buffer = pLoggedInPort->ReportLunsPayload; 
     Cmnd->request_bufflen = REPORT_LUNS_PL; 
@@ -2962,8 +2967,8 @@
     Cmnd->cmnd[9] = (UCHAR)REPORT_LUNS_PL;
     Cmnd->cmd_len = 12;
 
-    Cmnd->channel = pLoggedInPort->ScsiNexus.channel;
-    Cmnd->target = pLoggedInPort->ScsiNexus.target;
+    Cmnd->device->channel = pLoggedInPort->ScsiNexus.channel;
+    Cmnd->device->id = pLoggedInPort->ScsiNexus.target;
 
 	    
     ulStatus = cpqfcTSBuildExchange(
@@ -3003,6 +3008,10 @@
 
 Done:
 
+  if (Cmnd)
+    scsi_put_command (Cmnd);
+  if (ScsiDev) 
+    scsi_free_host_dev (ScsiDev);
 }
 
 
@@ -3361,22 +3370,22 @@
     {
       // check Linux Scsi Cmnd for channel/target Nexus match
       // (all luns are accessed through matching "pLoggedInPort")
-      if( (pLoggedInPort->ScsiNexus.target == Cmnd->target)
+      if( (pLoggedInPort->ScsiNexus.target == Cmnd->device->id)
                 &&
-          (pLoggedInPort->ScsiNexus.channel == Cmnd->channel))
+          (pLoggedInPort->ScsiNexus.channel == Cmnd->device->channel))
       {
         // For "passthru" modes, the IOCTL caller is responsible
 	// for setting the FCP-LUN addressing
-	if (Cmnd->sc_request != NULL && Cmnd->host != NULL && 
-		Cmnd->host->hostdata != NULL &&
-		is_private_data_of_cpqfc((CPQFCHBA *) Cmnd->host->hostdata,
+	if (Cmnd->sc_request != NULL && Cmnd->device->host != NULL && 
+		Cmnd->device->host->hostdata != NULL &&
+		is_private_data_of_cpqfc((CPQFCHBA *) Cmnd->device->host->hostdata,
 			Cmnd->sc_request->upper_private_data)) { 
 		/* This is a passthru... */
 		cpqfc_passthru_private_t *pd;
 		pd = Cmnd->sc_request->upper_private_data;
         	Cmnd->SCp.phase = pd->bus;
 		// Cmnd->SCp.have_data_in = pd->pdrive;
-		Cmnd->SCp.have_data_in = Cmnd->lun;
+		Cmnd->SCp.have_data_in = Cmnd->device->lun;
 	} else {
 	  /* This is not a passthru... */
 	
@@ -3391,17 +3400,17 @@
 	  // Report Luns command
           if( pLoggedInPort->ScsiNexus.LunMasking == 1) 
 	  {
-	    if (Cmnd->lun > sizeof(pLoggedInPort->ScsiNexus.lun))
+	    if (Cmnd->device->lun > sizeof(pLoggedInPort->ScsiNexus.lun))
 		return NULL;
             // we KNOW all the valid LUNs... 0xFF is invalid!
-            Cmnd->SCp.have_data_in = pLoggedInPort->ScsiNexus.lun[Cmnd->lun];
-	    if (pLoggedInPort->ScsiNexus.lun[Cmnd->lun] == 0xFF)
+            Cmnd->SCp.have_data_in = pLoggedInPort->ScsiNexus.lun[Cmnd->device->lun];
+	    if (pLoggedInPort->ScsiNexus.lun[Cmnd->device->lun] == 0xFF)
 		return NULL;
 	    // printk("xlating lun %d to 0x%02x\n", Cmnd->lun, 
             //	pLoggedInPort->ScsiNexus.lun[Cmnd->lun]);
 	  }
 	  else
-	    Cmnd->SCp.have_data_in = Cmnd->lun; // Linux & target luns match
+	    Cmnd->SCp.have_data_in = Cmnd->device->lun; // Linux & target luns match
 	}
 	break; // found it!
       }
@@ -3507,9 +3516,9 @@
 
 
       // Are there any Q'd commands for this target?
-      if( (Cmnd->target == pLoggedInPort->ScsiNexus.target)
+      if( (Cmnd->device->id == pLoggedInPort->ScsiNexus.target)
 	       &&
-          (Cmnd->channel == pLoggedInPort->ScsiNexus.channel) )
+          (Cmnd->device->channel == pLoggedInPort->ScsiNexus.channel) )
       {
         Cmnd->result = (DID_SOFT_ERROR <<16); // force retry
         if( Cmnd->scsi_done == NULL) 

                 reply	other threads:[~2003-07-14 19:39 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=3F130A78.6030004@us.ibm.com \
    --to=mikenc@us.ibm.com \
    --cc=Fred.Harris@hp.com \
    --cc=linux-scsi@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox