public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: 'Christoph Hellwig' <hch@infradead.org>
To: "Salyzyn, Mark" <mark_salyzyn@adaptec.com>
Cc: 'Christoph Hellwig' <hch@infradead.org>,
	Mark Haverkamp <markh@osdl.org>,
	linux-scsi <linux-scsi@vger.kernel.org>
Subject: Re: dpt_i2o driver
Date: Thu, 28 Aug 2003 11:11:30 +0100	[thread overview]
Message-ID: <20030828111130.A1198@infradead.org> (raw)
In-Reply-To: <0998F43EAD645A47B3F6507196DD70EA2568E8@OTCEXC01>; from mark_salyzyn@adaptec.com on Tue, Aug 26, 2003 at 01:17:49PM -0400

On Tue, Aug 26, 2003 at 01:17:49PM -0400, Salyzyn, Mark wrote:
> I will have to admit that currently it has the 2.4 + 2.6 nature to it
> (liberal ifdefs on KERNEL version) so there is some `cleanup' necessary for
> it to be part of the 2.6 tree. It's last build and test was with
> 2.6.0-test2.
> 
> I don't want to increase the work load, 47 ifdefs by kernel version could
> probably be cleaned up by a sed, awk or perl script. I have enclosed it here
> for expediency, but should really clean it up into a diff -u to the current
> variant of the driver in the tree ...

Okay, here's a few comments on the diff vs what's in 2.6.  Additional notes:

 - the driver won't work asis on 2.2 - pci_alloc_consistant is 2.4+.  What
   about dropping at least 2.2 support? :)
 - to make filetering the version checks easier you should avoid addition
   indentation for #ifdefs - that's how linux code is written anyway.  Also
   please don't put the ifdefs inside prototypes - just have to separate copies
   of the prototype.
 - the driver wants feeding through Documentation/Lindent (_after_ this update is
   in, as an indentation-change only patch)

BTW, what's the advantage over the i2o_scsi driver that seems to deal with this
hardware just fine?


@@ -19,7 +18,7 @@
 
 #ifdef __KERNEL__       /* This file to be included by kernel only */
 
-#include <linux/i2o-dev.h>
+#include "dpti_i2o-dev.h"

>>> Sounds like a bad idea to change
 
-#error Please convert me to Documentation/DMA-mapping.txt
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+//# error Please convert me to Documentation/DMA-mapping.txt
+#endif

>>> well, you just converted it, so kill this completly :)
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+# include <linux/blkdev.h>

>>> blkdev.h exist at least in all Linux 2.x variants.  <= 2.4 just gets it
>>> implicitly, so you're safe to always include it.

+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+static struct semaphore adpt_configuration_lock = MUTEX;
+#else
 DECLARE_MUTEX(adpt_configuration_lock);
-
-static struct i2o_sys_tbl *sys_tbl = NULL;
+#endif

>>> it might be easier for you to just add a compat.h that does
>>> #define DECLARE_MUTEX(name)		static struct semaphore (name) = MUTEX;
>>> for 2.2 kernels

+static struct i2o_sys_tbl *sys_tbl_va = NULL;
+static dma_addr_t sys_tbl_pa;
 static int sys_tbl_ind = 0;
 static int sys_tbl_len = 0;

>>> static variables are implicitly zeroed in any ANSI C enviroment, including
>>> the linux kernel.
 
 
@@ -175,13 +201,20 @@ static int adpt_detect(Scsi_Host_Templat
 	adpt_hba* pHba;
 
 	adpt_init();
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+	sht->proc_dir = &proc_scsi_dptI2O;
+#endif
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,65))
+	sht->use_new_eh_code = 1;
+#endif

>>> please initialize this directly in the struct defintion below..

 
+			pci_set_dma_mask(pHba->pDev, (dma_addr_t)0xFFFFFFFFFFFFFFFFULL);

>>> you need to check the return value here

+#			if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18)) && defined(CONFIG_HIGHMEM) && ((LINUX_VERSION_CODE != KERNEL_VERSION(2,4,19)) || defined(CONFIG_HIGHIO))
+                		pHba->host->highmem_io = 1;

>>> 2.6 doesn't have the highmem_io flag anymore, it automatically enables
>>> highmem I/O with the right dma mask.  The 2.4 kernels OTOH always define
>>> CONFIG_HIGHIO IIRC.  So this should be just ifdef CONFIG_HIGHIO

 	s32 rcode;
 
 	memset(msg, 0, sizeof(msg));
-	buf = (u8*)kmalloc(80,GFP_KERNEL|ADDR32);
+	buf = (u8*)pci_alloc_consistent(pHba->pDev, 80, &addr);

>>> pci_alloc_consistent returns void *, not need to cast to (u8 *)

+#	if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+		pHba = (adpt_hba*)cmd->device->host->hostdata[0];
+#	else
+		pHba = (adpt_hba*)cmd->host->hostdata[0];
+#	endif

>>> the 2.6 version should be fine for 2.2 and 2.4 awell. IIRC we always had
>>> device->host, older kernels just had the information in the command, too.

-		if ((pDev = adpt_find_device(pHba, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun)) == NULL) {
+#		if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+			if ((pDev = adpt_find_device(pHba, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun)) == NULL)
+#		else
+			if ((pDev = adpt_find_device(pHba, (u32)cmd->channel, (u32)cmd->target, (u32)cmd->lun)) == NULL)
+#		endif

>>> dito here and in a few other places.

 	// this code is taken from kernel/sched.c:interruptible_sleep_on_timeout
 	wait.task = current;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+	write_lock_irqsave(&waitqueue_lock,flags);
+	__add_wait_queue(&adpt_wq_i2o_post, &wait);
+	write_unlock(&waitqueue_lock);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
 	init_waitqueue_entry(&wait, current);
-	spin_lock_irqsave(&adpt_wq_i2o_post.lock, flags);
+	spin_lock_irqsave(&adpt_wq_i2o_post.lock,flags);
 	__add_wait_queue(&adpt_wq_i2o_post, &wait);
 	spin_unlock(&adpt_wq_i2o_post.lock);
+#else
+	init_waitqueue_entry(&wait, current);
+	wq_write_lock_irqsave(&adpt_wq_i2o_post.lock,flags);
+	__add_wait_queue(&adpt_wq_i2o_post, &wait);
+	wq_write_unlock(&adpt_wq_i2o_post.lock);
+#endif


>>> eeek!!!! why don't you simply use add_wait_queue() instead of opencoding it.

 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
 		set_current_state(TASK_INTERRUPTIBLE);
-		spin_unlock_irq(pHba->host->host_lock);
-		if (!timeout)
+//# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+//		if (pHba->host != NULL) /* Sad */
+//			spin_unlock_irq(pHba->host->host_lock);
+//# else
+//		spin_unlock_irq(&io_request_lock);
+//# endif
+#else
+		current->state = TASK_INTERRUPTIBLE;
+//		spin_unlock_irq(&io_request_lock);
+#endif

>>> what's this?

+//#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
+//		if (pHba->host != NULL) /* Sad */
+//			spin_lock_irq(pHba->host->host_lock);
+//#else
+//		spin_lock_irq(&io_request_lock);
+//#endif

>>> dito.

+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+	write_lock_irq(&waitqueue_lock);
+	__remove_wait_queue(&adpt_wq_i2o_post, &wait);
+	write_unlock_irqrestore(&waitqueue_lock,flags);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
 	spin_lock_irq(&adpt_wq_i2o_post.lock);
 	__remove_wait_queue(&adpt_wq_i2o_post, &wait);
-	spin_unlock_irqrestore(&adpt_wq_i2o_post.lock, flags);
+	spin_unlock_irqrestore(&adpt_wq_i2o_post.lock,flags);
+#else
+	wq_write_lock_irq(&adpt_wq_i2o_post.lock);
+	__remove_wait_queue(&adpt_wq_i2o_post, &wait);
+	wq_write_unlock_irqrestore(&adpt_wq_i2o_post.lock,flags);
+#endif

>>> simply use remove_wait_queue()..

+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,65))
 	minor = minor(inode->i_rdev);
+#else
+	minor = MINOR(inode->i_rdev);
+#endif

>>> just put a
>>> #ifndef minor
>>> #define minor(i) MINOR(i)
>>> in compat.h.
>>> in 2.6 it will soon become iminor(inode), though.


+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
+		set_current_state(TASK_UNINTERRUPTIBLE);
+#else
+		current->state = TASK_UNINTERRUPTIBLE;
+#endif

>>> add a set_current_state() dummy for 2.2?

+	case DPT_TARGET_BUSY & 0xFFFF:
+	case DPT_TARGET_BUSY:
+	{
+		TARGET_BUSY_T busy;
+		struct adpt_device* d;
+
+		if (copy_from_user((void*)&busy, (void*)arg, sizeof(TARGET_BUSY_T))) {
+			return -EFAULT;
+		}
+
+		d = adpt_find_device(pHba, busy.channel, busy.id, busy.lun);
+		if(d == NULL){
+			return -ENODEV;
+		}
+		busy.isBusy = ((d->pScsi_dev) && (0 != d->pScsi_dev->access_count)) ? 1 : 0;
+		if (copy_to_user ((char*)arg, &busy, sizeof(busy))) {
+			return -EFAULT;
+		}
+		break;
+	}

>>> I removed this for a reason because (a) the ioctl is racy and (b) it's in the way of
>>> proper refcounting.  please don't re-introduce it.

 	default:
 		return -EINVAL;
 	}
@@ -1956,48 +2286,59 @@ static int adpt_ioctl(struct inode *inod
 	return error;
 }
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
 #include "scsi_module.c"
-MODULE_LICENSE("GPL");
+#elif (defined(MODULE))
+#include "scsi_module.c"
+#endif

>>> this is fine for 2.2 aswell, just make sure you link it after
>>> the scsi core and upper drivers in the makefile.

+#ifdef MODULE_LICENSE
+MODULE_LICENSE("Dual BSD/GPL");
+#endif

>>> just put a 
>>> #ifndef MODULE_LICENSE
>>> #define MODULE_LICENSE(foo)	/*NOTHING*/
>>> #endif
>>> in compat.h

+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,65))
+  typedef void irqreturn_t;
+# define IRQ_NONE
+# define IRQ_HANDLED
+#endif

>>> these defintions are in 2.4.23-pre now, too.
>>> use #ifndef IRQ_HANDLED instead.


  reply	other threads:[~2003-08-28 10:11 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-08-26 17:17 dpt_i2o driver Salyzyn, Mark
2003-08-28 10:11 ` 'Christoph Hellwig' [this message]
  -- strict thread matches above, loose matches on Subject: below --
2003-09-02 17:39 Salyzyn, Mark
2003-09-02 17:26 Salyzyn, Mark
2003-09-02 17:34 ` 'Christoph Hellwig'
2003-09-02 17:10 Salyzyn, Mark
2003-09-02 17:14 ` 'Christoph Hellwig'
2003-09-02 16:41 Salyzyn, Mark
2003-09-02 17:00 ` 'Christoph Hellwig'
2003-09-02 13:51 Salyzyn, Mark
2003-09-02 14:00 ` 'Christoph Hellwig'
2003-08-26 15:02 Salyzyn, Mark
2003-08-26 16:51 ` 'Christoph Hellwig'

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=20030828111130.A1198@infradead.org \
    --to=hch@infradead.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=mark_salyzyn@adaptec.com \
    --cc=markh@osdl.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