public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support
@ 2007-05-27 14:52 Jeff Garzik
  2007-05-27 14:53 ` [PATCH 1/5] SCSI/initio PCI DMA fix Jeff Garzik
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:52 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


This patchset presents the path to PCI API support in the initio driver.

But the first patch really begs the question:  Has this driver really
been broken since Oct 2003?  If so, let's just delete it.

 drivers/scsi/initio.c |  206 +++++++++++++++++++++++++++++---------------------
 drivers/scsi/initio.h |   10 +-
 2 files changed, 127 insertions(+), 89 deletions(-)


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/5] SCSI/initio PCI DMA fix
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
@ 2007-05-27 14:53 ` Jeff Garzik
  2007-05-27 14:55 ` [PATCH 2/5] SCSI/initio pci_dev, pci_dev->irq simplifications Jeff Garzik
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:53 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


The 'pci_dev' member of HCS is referenced during PCI DMA, but never
actually assigned a value.  Let's give it a useful value.

Has this driver been broken since PCI DMA support was added in Oct 2003?

Signed-off-by: Jeff Garzik <jeff@garzik.org>

a5eec1873b5934de70c589ad0f4596f78c4d0dd3
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 7e7635c..8951494 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -583,7 +583,8 @@ void tul_read_eeprom(WORD CurBase)
 }				/* read_eeprom */
 
 static int Addi91u_into_Adapter_table(WORD wBIOS, WORD wBASE, BYTE bInterrupt,
-				      BYTE bBus, BYTE bDevice)
+				      BYTE bBus, BYTE bDevice,
+				      struct pci_dev *pci_dev)
 {
 	int i, j;
 
@@ -609,6 +610,7 @@ static int Addi91u_into_Adapter_table(WORD wBIOS, WORD wBASE, BYTE bInterrupt,
 		i91u_adpt[i].ADPT_BIOS = wBIOS;
 		i91u_adpt[i].ADPT_Bus = bBus;
 		i91u_adpt[i].ADPT_Device = bDevice;
+		i91u_adpt[i].pci_dev = pci_dev;
 		return 0;
 	}
 	return 1;
@@ -642,6 +644,7 @@ static void tul_stop_bm(HCS * pCurHcb)
 /***************************************************************************/
 static void get_tulipPCIConfig(HCS * pCurHcb, int ch_idx)
 {
+	pCurHcb->pci_dev = i91u_adpt[ch_idx].pci_dev;
 	pCurHcb->HCS_Base = i91u_adpt[ch_idx].ADPT_BASE;	/* Supply base address  */
 	pCurHcb->HCS_BIOS = i91u_adpt[ch_idx].ADPT_BIOS;	/* Supply BIOS address  */
 	pCurHcb->HCS_Intr = i91u_adpt[ch_idx].ADPT_INTR;	/* Supply interrupt line */
@@ -2789,7 +2792,8 @@ static int tul_NewReturnNumberOfAdapters(void)
 							(pDev->resource[0].start),
 						       	pDev->irq,
 						       	pDev->bus->number,
-					       		(pDev->devfn >> 3)
+					       		(pDev->devfn >> 3),
+							pDev
 		    		) == 0)
 				iAdapters++;
 		}
diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h
index acb67a4..dcd42e2 100644
--- a/drivers/scsi/initio.h
+++ b/drivers/scsi/initio.h
@@ -529,6 +529,7 @@ typedef struct I91u_Adpt_Struc {
 	UBYTE ADPT_Bus;		/* 2 */
 	UBYTE ADPT_Device;	/* 3 */
 	UBYTE ADPT_INTR;	/* 4 */
+	struct pci_dev *pci_dev;
 } INI_ADPT_STRUCT;
 
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/5] SCSI/initio pci_dev, pci_dev->irq simplifications
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
  2007-05-27 14:53 ` [PATCH 1/5] SCSI/initio PCI DMA fix Jeff Garzik
@ 2007-05-27 14:55 ` Jeff Garzik
  2007-05-27 14:57 ` [PATCH 3/5] SCSI/initio minor cleanups Jeff Garzik
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:55 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


Now that pci_dev is available in the adapter table, we can logically
simplify Addi91u_into_Adapter_table(), HCS and INI_ADPT_STRUCT.

Signed-off-by: Jeff Garzik <jeff@garzik.org>

0151ba1cfeb6565bd1e79b5ba913423f19602d2e
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 8951494..d25a228 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -582,10 +582,9 @@ void tul_read_eeprom(WORD CurBase)
 	TUL_WR(CurBase + TUL_GCTRL, gctrl & ~TUL_GCTRL_EEPROM_BIT);
 }				/* read_eeprom */
 
-static int Addi91u_into_Adapter_table(WORD wBIOS, WORD wBASE, BYTE bInterrupt,
-				      BYTE bBus, BYTE bDevice,
-				      struct pci_dev *pci_dev)
+static int Addi91u_into_Adapter_table(WORD wBIOS, struct pci_dev *pci_dev)
 {
+	WORD wBASE = pci_dev->resource[0].start;
 	int i, j;
 
 	for (i = 0; i < MAX_SUPPORTED_ADAPTERS; i++) {
@@ -600,16 +599,14 @@ static int Addi91u_into_Adapter_table(WORD wBIOS, WORD wBASE, BYTE bInterrupt,
 		}
 		for (j = MAX_SUPPORTED_ADAPTERS - 1; j > i; j--) {
 			i91u_adpt[j].ADPT_BASE = i91u_adpt[j - 1].ADPT_BASE;
-			i91u_adpt[j].ADPT_INTR = i91u_adpt[j - 1].ADPT_INTR;
 			i91u_adpt[j].ADPT_BIOS = i91u_adpt[j - 1].ADPT_BIOS;
 			i91u_adpt[j].ADPT_Bus = i91u_adpt[j - 1].ADPT_Bus;
 			i91u_adpt[j].ADPT_Device = i91u_adpt[j - 1].ADPT_Device;
 		}
 		i91u_adpt[i].ADPT_BASE = wBASE;
-		i91u_adpt[i].ADPT_INTR = bInterrupt;
 		i91u_adpt[i].ADPT_BIOS = wBIOS;
-		i91u_adpt[i].ADPT_Bus = bBus;
-		i91u_adpt[i].ADPT_Device = bDevice;
+		i91u_adpt[i].ADPT_Bus = pci_dev->bus->number;
+		i91u_adpt[i].ADPT_Device = pci_dev->devfn >> 3;
 		i91u_adpt[i].pci_dev = pci_dev;
 		return 0;
 	}
@@ -623,7 +620,6 @@ static void init_i91uAdapter_table(void)
 	for (i = 0; i < MAX_SUPPORTED_ADAPTERS; i++) {	/* Initialize adapter structure */
 		i91u_adpt[i].ADPT_BIOS = 0xffff;
 		i91u_adpt[i].ADPT_BASE = 0xffff;
-		i91u_adpt[i].ADPT_INTR = 0xff;
 		i91u_adpt[i].ADPT_Bus = 0xff;
 		i91u_adpt[i].ADPT_Device = 0xff;
 	}
@@ -647,8 +643,6 @@ static void get_tulipPCIConfig(HCS * pCurHcb, int ch_idx)
 	pCurHcb->pci_dev = i91u_adpt[ch_idx].pci_dev;
 	pCurHcb->HCS_Base = i91u_adpt[ch_idx].ADPT_BASE;	/* Supply base address  */
 	pCurHcb->HCS_BIOS = i91u_adpt[ch_idx].ADPT_BIOS;	/* Supply BIOS address  */
-	pCurHcb->HCS_Intr = i91u_adpt[ch_idx].ADPT_INTR;	/* Supply interrupt line */
-	return;
 }
 
 /***************************************************************************/
@@ -777,7 +771,7 @@ static int init_tulip(HCS * pCurHcb, SCB * scbp, int tul_num_scb,
 		pCurHcb->HCS_MaxTags[i] = 0xFF;
 	}			/* for                          */
 	printk("i91u: PCI Base=0x%04X, IRQ=%d, BIOS=0x%04X0, SCSI ID=%d\n",
-	       pCurHcb->HCS_Base, pCurHcb->HCS_Intr,
+	       pCurHcb->HCS_Base, pCurHcb->pci_dev->irq,
 	       pCurHcb->HCS_BIOS, pCurHcb->HCS_SCSI_ID);
 /*------------------- reset SCSI Bus ---------------------------*/
 	if (pCurHcb->HCS_Config & HCC_SCSI_RESET) {
@@ -2788,13 +2782,7 @@ static int tul_NewReturnNumberOfAdapters(void)
 				continue;
 			}
 
-			if (Addi91u_into_Adapter_table(wBIOS,
-							(pDev->resource[0].start),
-						       	pDev->irq,
-						       	pDev->bus->number,
-					       		(pDev->devfn >> 3),
-							pDev
-		    		) == 0)
+			if (Addi91u_into_Adapter_table(wBIOS, pDev) == 0)
 				iAdapters++;
 		}
 	}
@@ -2865,15 +2853,17 @@ static int i91u_detect(struct scsi_host_template * tpnt)
 		hreg->unique_id = pHCB->HCS_Base;
 		hreg->max_id = pHCB->HCS_MaxTar;
 		hreg->max_lun = 32;	/* 10/21/97                     */
-		hreg->irq = pHCB->HCS_Intr;
+		hreg->irq = pHCB->pci_dev->irq;
 		hreg->this_id = pHCB->HCS_SCSI_ID;	/* Assign HCS index           */
 		hreg->base = (unsigned long)pHCB;
 		hreg->sg_tablesize = TOTAL_SG_ENTRY;	/* Maximun support is 32 */
 
 		/* Initial tulip chip           */
-		ok = request_irq(pHCB->HCS_Intr, i91u_intr, IRQF_DISABLED | IRQF_SHARED, "i91u", hreg);
+		ok = request_irq(pHCB->pci_dev->irq, i91u_intr,
+				 IRQF_DISABLED | IRQF_SHARED, "i91u", hreg);
 		if (ok < 0) {
-			printk(KERN_WARNING "i91u: unable to request IRQ %d\n\n", pHCB->HCS_Intr);
+			printk(KERN_ERR "i91u: unable to request IRQ %d\n\n",
+			       pHCB->pci_dev->irq);
 			return 0;
 		}
 	}
diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h
index dcd42e2..817b696 100644
--- a/drivers/scsi/initio.h
+++ b/drivers/scsi/initio.h
@@ -528,7 +528,6 @@ typedef struct I91u_Adpt_Struc {
 	UWORD ADPT_BASE;	/* 1 */
 	UBYTE ADPT_Bus;		/* 2 */
 	UBYTE ADPT_Device;	/* 3 */
-	UBYTE ADPT_INTR;	/* 4 */
 	struct pci_dev *pci_dev;
 } INI_ADPT_STRUCT;
 
@@ -536,10 +535,15 @@ typedef struct I91u_Adpt_Struc {
 /***********************************************************************
 	      Host Adapter Control Structure
 ************************************************************************/
+/*
+ * TODO: Remove the "xxx_Unused" struct members only after determining
+ * that this struct does not have special GFP_DMA alignment/padding
+ * restrictions that hamper modification of Ha_Ctrl_Struc.
+ */
 typedef struct Ha_Ctrl_Struc {
 	UWORD HCS_Base;		/* 00 */
 	UWORD HCS_BIOS;		/* 02 */
-	UBYTE HCS_Intr;		/* 04 */
+	UBYTE HCS_Intr_Unused;	/* 04 */
 	UBYTE HCS_SCSI_ID;	/* 05 */
 	UBYTE HCS_MaxTar;	/* 06 */
 	UBYTE HCS_NumScbs;	/* 07 */

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/5] SCSI/initio minor cleanups
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
  2007-05-27 14:53 ` [PATCH 1/5] SCSI/initio PCI DMA fix Jeff Garzik
  2007-05-27 14:55 ` [PATCH 2/5] SCSI/initio pci_dev, pci_dev->irq simplifications Jeff Garzik
@ 2007-05-27 14:57 ` Jeff Garzik
  2007-05-27 14:58 ` [PATCH 4/5] SCSI/initio PCI dev init factorization Jeff Garzik
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:57 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


Two minor cleanups:
* eliminate unused ADPT_Device struct member
* eliminate redundant return statements

Signed-off-by: Jeff Garzik <jeff@garzik.org>

8ce38698fb5c65128621823e34830ed6c738f3be
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index d25a228..2bc2390 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -402,7 +402,6 @@ static void tul_se2_instr(WORD CurBase, UCHAR instr)
 	}
 	TUL_WR(CurBase + TUL_NVRAM, SE2CS);	/* -CLK */
 	tul_se2_wait();
-	return;
 }
 
 
@@ -415,7 +414,6 @@ void tul_se2_ew_en(WORD CurBase)
 	tul_se2_instr(CurBase, 0x30);	/* EWEN */
 	TUL_WR(CurBase + TUL_NVRAM, 0);		/* -CS  */
 	tul_se2_wait();
-	return;
 }
 
 
@@ -427,7 +425,6 @@ void tul_se2_ew_ds(WORD CurBase)
 	tul_se2_instr(CurBase, 0);	/* EWDS */
 	TUL_WR(CurBase + TUL_NVRAM, 0);		/* -CS  */
 	tul_se2_wait();
-	return;
 }
 
 
@@ -501,7 +498,6 @@ static void tul_se2_wr(WORD CurBase, UCHAR adr, USHORT writeWord)
 			break;	/* write complete */
 	}
 	TUL_WR(CurBase + TUL_NVRAM, 0);		/* -CS */
-	return;
 }
 
 
@@ -559,7 +555,6 @@ void tul_se2_update_all(WORD CurBase)
 	}
 
 	tul_se2_ew_ds(CurBase);	/* Disable write   */
-	return;
 }
 
 /*************************************************************************
@@ -601,12 +596,10 @@ static int Addi91u_into_Adapter_table(WORD wBIOS, struct pci_dev *pci_dev)
 			i91u_adpt[j].ADPT_BASE = i91u_adpt[j - 1].ADPT_BASE;
 			i91u_adpt[j].ADPT_BIOS = i91u_adpt[j - 1].ADPT_BIOS;
 			i91u_adpt[j].ADPT_Bus = i91u_adpt[j - 1].ADPT_Bus;
-			i91u_adpt[j].ADPT_Device = i91u_adpt[j - 1].ADPT_Device;
 		}
 		i91u_adpt[i].ADPT_BASE = wBASE;
 		i91u_adpt[i].ADPT_BIOS = wBIOS;
 		i91u_adpt[i].ADPT_Bus = pci_dev->bus->number;
-		i91u_adpt[i].ADPT_Device = pci_dev->devfn >> 3;
 		i91u_adpt[i].pci_dev = pci_dev;
 		return 0;
 	}
@@ -617,13 +610,12 @@ static void init_i91uAdapter_table(void)
 {
 	int i;
 
-	for (i = 0; i < MAX_SUPPORTED_ADAPTERS; i++) {	/* Initialize adapter structure */
+	/* Initialize adapter structure */
+	for (i = 0; i < MAX_SUPPORTED_ADAPTERS; i++) {
 		i91u_adpt[i].ADPT_BIOS = 0xffff;
 		i91u_adpt[i].ADPT_BASE = 0xffff;
 		i91u_adpt[i].ADPT_Bus = 0xff;
-		i91u_adpt[i].ADPT_Device = 0xff;
 	}
-	return;
 }
 
 static void tul_stop_bm(HCS * pCurHcb)
@@ -915,8 +907,8 @@ static void tul_unlink_pend_scb(HCS * pCurHcb, SCB * pCurScb)
 		pPrevScb = pTmpScb;
 		pTmpScb = pTmpScb->SCB_NxtScb;
 	}
-	return;
 }
+
 /***************************************************************************/
 static void tul_append_busy_scb(HCS * pCurHcb, SCB * scbp)
 {
@@ -990,7 +982,6 @@ static void tul_unlink_busy_scb(HCS * pCurHcb, SCB * pCurScb)
 		pPrevScb = pTmpScb;
 		pTmpScb = pTmpScb->SCB_NxtScb;
 	}
-	return;
 }
 
 /***************************************************************************/
@@ -1297,7 +1288,6 @@ static void tul_exec_scb(HCS * pCurHcb, SCB * pCurScb)
 		TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x0F);
 	}
 	spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
-	return;
 }
 
 /***************************************************************************/
@@ -1507,7 +1497,6 @@ void tulip_scsi(HCS * pCurHcb)
 		pCurScb->SCB_HaStat = 0x16;	/* bad command */
 		tul_append_done_scb(pCurHcb, pCurScb);
 	}
-	return;
 }
 
 
@@ -2548,7 +2537,6 @@ void tul_select_atn_stop(HCS * pCurHcb, SCB * pCurScb)
 	pCurHcb->HCS_ActScb = pCurScb;
 	pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
 	TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SELATNSTOP);
-	return;
 }
 
 
@@ -2566,7 +2554,6 @@ void tul_select_atn(HCS * pCurHcb, SCB * pCurScb)
 	pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
 	pCurHcb->HCS_ActScb = pCurScb;
 	TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SEL_ATN);
-	return;
 }
 
 /***************************************************************************/
@@ -2585,7 +2572,6 @@ void tul_select_atn3(HCS * pCurHcb, SCB * pCurScb)
 	pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
 	pCurHcb->HCS_ActScb = pCurScb;
 	TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SEL_ATN3);
-	return;
 }
 
 /***************************************************************************/
diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h
index 817b696..8186d14 100644
--- a/drivers/scsi/initio.h
+++ b/drivers/scsi/initio.h
@@ -527,7 +527,6 @@ typedef struct I91u_Adpt_Struc {
 	UWORD ADPT_BIOS;	/* 0 */
 	UWORD ADPT_BASE;	/* 1 */
 	UBYTE ADPT_Bus;		/* 2 */
-	UBYTE ADPT_Device;	/* 3 */
 	struct pci_dev *pci_dev;
 } INI_ADPT_STRUCT;
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/5] SCSI/initio PCI dev init factorization
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
                   ` (2 preceding siblings ...)
  2007-05-27 14:57 ` [PATCH 3/5] SCSI/initio minor cleanups Jeff Garzik
@ 2007-05-27 14:58 ` Jeff Garzik
  2007-05-27 14:59 ` [PATCH 5/5] SCSI/initio conversion to PCI driver API Jeff Garzik
  2007-05-27 15:47 ` [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Alan Cox
  5 siblings, 0 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:58 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


Factor PCI device init into separate function.  No code changes,
except for return value differences.

Signed-off-by: Jeff Garzik <jeff@garzik.org>

6714c073a9df8c923fbfc661a1f287dfd1a74852
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 2bc2390..702dcf5 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -2742,38 +2742,53 @@ static irqreturn_t i91u_intr(int irqno, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+static int tul_pci_dev_init(struct pci_dev *pDev)
+{
+	long dRegValue;
+	WORD wBIOS;
+	int rc;
+
+	rc = pci_enable_device(pDev);
+	if (rc)
+		return rc;
+
+	pci_read_config_dword(pDev, 0x44, (u32 *) & dRegValue);
+	wBIOS = (UWORD) (dRegValue & 0xFF);
+	if (((dRegValue & 0xFF00) >> 8) == 0xFF)
+		dRegValue = 0;
+	wBIOS = (wBIOS << 8) + ((UWORD) ((dRegValue & 0xFF00) >> 8));
+
+	rc = pci_set_dma_mask(pDev, DMA_32BIT_MASK);
+	if (rc) {
+		printk(KERN_WARNING 
+		       "i91u: Could not set 32 bit DMA mask\n");
+		return rc;
+	}
+
+	rc = Addi91u_into_Adapter_table(wBIOS, pDev);
+	if (rc)
+		return -ENODEV;
+	
+	return 0;
+}
+
 static int tul_NewReturnNumberOfAdapters(void)
 {
 	struct pci_dev *pDev = NULL;	/* Start from none              */
 	int iAdapters = 0;
-	long dRegValue;
-	WORD wBIOS;
-	int i = 0;
+	int i;
 
 	init_i91uAdapter_table();
 
 	for (i = 0; i < ARRAY_SIZE(i91u_pci_devices); i++)
 	{
 		while ((pDev = pci_find_device(i91u_pci_devices[i].vendor, i91u_pci_devices[i].device, pDev)) != NULL) {
-			if (pci_enable_device(pDev))
-				continue;
-			pci_read_config_dword(pDev, 0x44, (u32 *) & dRegValue);
-			wBIOS = (UWORD) (dRegValue & 0xFF);
-			if (((dRegValue & 0xFF00) >> 8) == 0xFF)
-				dRegValue = 0;
-			wBIOS = (wBIOS << 8) + ((UWORD) ((dRegValue & 0xFF00) >> 8));
-			if (pci_set_dma_mask(pDev, DMA_32BIT_MASK)) {
-				printk(KERN_WARNING 
-				       "i91u: Could not set 32 bit DMA mask\n");
-				continue;
-			}
-
-			if (Addi91u_into_Adapter_table(wBIOS, pDev) == 0)
+			if (tul_pci_dev_init(pDev) == 0)
 				iAdapters++;
 		}
 	}
 
-	return (iAdapters);
+	return iAdapters;
 }
 
 static int i91u_detect(struct scsi_host_template * tpnt)

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/5] SCSI/initio conversion to PCI driver API
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
                   ` (3 preceding siblings ...)
  2007-05-27 14:58 ` [PATCH 4/5] SCSI/initio PCI dev init factorization Jeff Garzik
@ 2007-05-27 14:59 ` Jeff Garzik
  2007-05-27 15:03   ` Jeff Garzik
  2007-05-27 15:47 ` [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Alan Cox
  5 siblings, 1 reply; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 14:59 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML


Prior simplifications in this patchset now permit a minimal conversion
to the new PCI API.

Further improvements and simplifications are certainly possible; those
should be presented in a separate patchset.

DO NOT APPLY (yet).  For feedback (and testers?) only.


3f42ce6a28b81cb057b2304e3aca6e873618a6fd
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 702dcf5..e54449f 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -242,6 +242,7 @@ static void tul_read_eeprom(WORD CurBase);
 				/* ---- INTERNAL VARIABLES ---- */
 static HCS tul_hcs[MAX_SUPPORTED_ADAPTERS];
 static INI_ADPT_STRUCT i91u_adpt[MAX_SUPPORTED_ADAPTERS];
+static int i91u_adpt_count;
 
 /*NVRAM nvram, *nvramp = &nvram; */
 static NVRAM i91unvram;
@@ -2769,26 +2770,13 @@ static int tul_pci_dev_init(struct pci_dev *pDev)
 	if (rc)
 		return -ENODEV;
 	
+	i91u_adpt_count++;
 	return 0;
 }
 
 static int tul_NewReturnNumberOfAdapters(void)
 {
-	struct pci_dev *pDev = NULL;	/* Start from none              */
-	int iAdapters = 0;
-	int i;
-
-	init_i91uAdapter_table();
-
-	for (i = 0; i < ARRAY_SIZE(i91u_pci_devices); i++)
-	{
-		while ((pDev = pci_find_device(i91u_pci_devices[i].vendor, i91u_pci_devices[i].device, pDev)) != NULL) {
-			if (tul_pci_dev_init(pDev) == 0)
-				iAdapters++;
-		}
-	}
-
-	return iAdapters;
+	return i91u_adpt_count;
 }
 
 static int i91u_detect(struct scsi_host_template * tpnt)
@@ -2843,7 +2831,7 @@ static int i91u_detect(struct scsi_host_template * tpnt)
 		request_region(pHCB->HCS_Base, 256, "i91u"); /* Register */ 
 
 		pHCB->HCS_Index = i;	/* 7/29/98 */
-		hreg = scsi_register(tpnt, sizeof(HCS));
+		hreg = scsi_host_alloc(tpnt, sizeof(HCS));
 		if(hreg == NULL) {
 			release_region(pHCB->HCS_Base, 256);
 			return 0;
@@ -2865,8 +2853,21 @@ static int i91u_detect(struct scsi_host_template * tpnt)
 		if (ok < 0) {
 			printk(KERN_ERR "i91u: unable to request IRQ %d\n\n",
 			       pHCB->pci_dev->irq);
+			scsi_host_put(hreg);
+			release_region(pHCB->HCS_Base, 256);
+			return 0;
+		}
+
+		if (scsi_add_host(hreg, &pHCB->pci_dev->dev)) {
+			free_irq(pHCB->pci_dev->irq, hreg);
+			scsi_host_put(hreg);
+			release_region(pHCB->HCS_Base, 256);
 			return 0;
 		}
+
+		scsi_scan_host(hreg);
+
+		pci_set_drvdata(pHCB->pci_dev, hreg);
 	}
 
 	tpnt->this_id = -1;
@@ -3138,22 +3139,11 @@ static void i91uSCBPost(BYTE * pHcb, BYTE * pScb)
 	tul_release_scb(pHCB, pSCB);	/* Release SCB for current channel */
 }
 
-/*
- * Release ressources
- */
-static int i91u_release(struct Scsi_Host *hreg)
-{
-	free_irq(hreg->irq, hreg);
-	release_region(hreg->io_port, 256);
-	return 0;
-}
 MODULE_LICENSE("Dual BSD/GPL");
 
 static struct scsi_host_template driver_template = {
 	.proc_name	= "INI9100U",
 	.name		= i91u_REVID,
-	.detect		= i91u_detect,
-	.release	= i91u_release,
 	.queuecommand	= i91u_queuecommand,
 //	.abort		= i91u_abort,
 //	.reset		= i91u_reset,
@@ -3165,5 +3155,54 @@ static struct scsi_host_template driver_template = {
 	.cmd_per_lun 	= 1,
 	.use_clustering	= ENABLE_CLUSTERING,
 };
-#include "scsi_module.c"
 
+static int __devinit i91u_pci_probe(struct pci_dev *pdev,
+				    const struct pci_device_id *ent)
+{
+	return tul_pci_dev_init(pdev);
+}
+
+static void __devexit i91u_pci_remove(struct pci_dev *pdev)
+{
+	struct Scsi_Host *hreg = pci_get_drvdata(pdev);
+
+	scsi_remove_host(hreg);
+	free_irq(hreg->irq, hreg);
+	release_region(hreg->io_port, 256);
+	scsi_host_put(hreg);
+	pci_set_drvdata(pdev, NULL);
+	pci_disable_device(pdev);
+}
+
+static struct pci_driver i91u_pci_driver = {
+	.name		= "initio",
+	.id_table	= i91u_pci_devices,
+	.probe		= i91u_pci_probe,
+	.remove		= i91u_pci_remove,
+};
+
+static int __init i91u_init(void)
+{
+	int rc;
+	
+	init_i91uAdapter_table();
+
+	rc = pci_register_driver(&i91u_pci_driver);
+	if (rc)
+		return rc;
+	
+	if (!i91u_detect(&driver_template)) {
+		pci_unregister_driver(&i91u_pci_driver);
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+static void __exit i91u_exit(void)
+{
+	pci_unregister_driver(&i91u_pci_driver);
+}
+
+module_init(i91u_init);
+module_exit(i91u_exit);

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] SCSI/initio conversion to PCI driver API
  2007-05-27 14:59 ` [PATCH 5/5] SCSI/initio conversion to PCI driver API Jeff Garzik
@ 2007-05-27 15:03   ` Jeff Garzik
  2007-05-27 15:12     ` James Bottomley
  2007-05-27 15:48     ` Alan Cox
  0 siblings, 2 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 15:03 UTC (permalink / raw)
  To: Andrew Morton, linux-scsi; +Cc: LKML

Jeff Garzik wrote:
> Prior simplifications in this patchset now permit a minimal conversion
> to the new PCI API.
> 
> Further improvements and simplifications are certainly possible; those
> should be presented in a separate patchset.
> 
> DO NOT APPLY (yet).  For feedback (and testers?) only.


This only applies to patch #5.

Patches 1 through 4 should go upstream, IMO.

	Jeff



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] SCSI/initio conversion to PCI driver API
  2007-05-27 15:03   ` Jeff Garzik
@ 2007-05-27 15:12     ` James Bottomley
  2007-05-27 15:45       ` Jeff Garzik
  2007-05-27 15:48     ` Alan Cox
  1 sibling, 1 reply; 11+ messages in thread
From: James Bottomley @ 2007-05-27 15:12 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Andrew Morton, linux-scsi, LKML, Alan Cox

On Sun, 2007-05-27 at 11:03 -0400, Jeff Garzik wrote:
> Jeff Garzik wrote:
> > Prior simplifications in this patchset now permit a minimal conversion
> > to the new PCI API.
> > 
> > Further improvements and simplifications are certainly possible; those
> > should be presented in a separate patchset.
> > 
> > DO NOT APPLY (yet).  For feedback (and testers?) only.
> 
> 
> This only applies to patch #5.
> 
> Patches 1 through 4 should go upstream, IMO.

Erm, actually, you're treading all over Alan:

http://git.kernel.org/?p=linux/kernel/git/jejb/scsi-misc-2.6.git;a=commit;h=72d39fea9017bbb1407620bf89dfe8d1fb658e35

Could you rebase your patches to scsi-misc-2.6 and resubmit (if there's
anything Alan hasn't covered)?

Thanks,

James



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] SCSI/initio conversion to PCI driver API
  2007-05-27 15:12     ` James Bottomley
@ 2007-05-27 15:45       ` Jeff Garzik
  0 siblings, 0 replies; 11+ messages in thread
From: Jeff Garzik @ 2007-05-27 15:45 UTC (permalink / raw)
  To: James Bottomley; +Cc: Andrew Morton, linux-scsi, LKML, Alan Cox

James Bottomley wrote:
> On Sun, 2007-05-27 at 11:03 -0400, Jeff Garzik wrote:
>> Jeff Garzik wrote:
>>> Prior simplifications in this patchset now permit a minimal conversion
>>> to the new PCI API.
>>>
>>> Further improvements and simplifications are certainly possible; those
>>> should be presented in a separate patchset.
>>>
>>> DO NOT APPLY (yet).  For feedback (and testers?) only.
>>
>> This only applies to patch #5.
>>
>> Patches 1 through 4 should go upstream, IMO.
> 
> Erm, actually, you're treading all over Alan:
> 
> http://git.kernel.org/?p=linux/kernel/git/jejb/scsi-misc-2.6.git;a=commit;h=72d39fea9017bbb1407620bf89dfe8d1fb658e35
> 
> Could you rebase your patches to scsi-misc-2.6 and resubmit (if there's
> anything Alan hasn't covered)?


Hey, if it's tested at least minimally that's the minimum I hoped to 
achieve.  It sounds like you can drop all patches, though if it takes 
forever for scsi-misc-2.6 to go upstream, users in the interim will be 
denied the make-it-actually-work fix provided in patch #1, if that matters.

	Jeff



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support
  2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
                   ` (4 preceding siblings ...)
  2007-05-27 14:59 ` [PATCH 5/5] SCSI/initio conversion to PCI driver API Jeff Garzik
@ 2007-05-27 15:47 ` Alan Cox
  5 siblings, 0 replies; 11+ messages in thread
From: Alan Cox @ 2007-05-27 15:47 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Andrew Morton, linux-scsi, LKML

On Sun, 27 May 2007 10:52:00 -0400
Jeff Garzik <jeff@garzik.org> wrote:

> 
> This patchset presents the path to PCI API support in the initio driver.
> 
> But the first patch really begs the question:  Has this driver really
> been broken since Oct 2003?  If so, let's just delete it.

Jeff. I (and Christoph) have already done a complete initio overhaul
including the PCI API and Hotplug and submitted it.

Has it been broken - no. The value was always NULL so it always worked on
x86-32. Its a sucky driver but its not defunct.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] SCSI/initio conversion to PCI driver API
  2007-05-27 15:03   ` Jeff Garzik
  2007-05-27 15:12     ` James Bottomley
@ 2007-05-27 15:48     ` Alan Cox
  1 sibling, 0 replies; 11+ messages in thread
From: Alan Cox @ 2007-05-27 15:48 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Andrew Morton, linux-scsi, LKML

On Sun, 27 May 2007 11:03:53 -0400
Jeff Garzik <jeff@garzik.org> wrote:

> Jeff Garzik wrote:
> > Prior simplifications in this patchset now permit a minimal conversion
> > to the new PCI API.
> > 
> > Further improvements and simplifications are certainly possible; those
> > should be presented in a separate patchset.
> > 
> > DO NOT APPLY (yet).  For feedback (and testers?) only.
> 
> 
> This only applies to patch #5.
> 
> Patches 1 through 4 should go upstream, IMO.

NAK all five.

There is a complete overhaul already done.

Alan

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2007-05-27 15:45 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-27 14:52 [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Jeff Garzik
2007-05-27 14:53 ` [PATCH 1/5] SCSI/initio PCI DMA fix Jeff Garzik
2007-05-27 14:55 ` [PATCH 2/5] SCSI/initio pci_dev, pci_dev->irq simplifications Jeff Garzik
2007-05-27 14:57 ` [PATCH 3/5] SCSI/initio minor cleanups Jeff Garzik
2007-05-27 14:58 ` [PATCH 4/5] SCSI/initio PCI dev init factorization Jeff Garzik
2007-05-27 14:59 ` [PATCH 5/5] SCSI/initio conversion to PCI driver API Jeff Garzik
2007-05-27 15:03   ` Jeff Garzik
2007-05-27 15:12     ` James Bottomley
2007-05-27 15:45       ` Jeff Garzik
2007-05-27 15:48     ` Alan Cox
2007-05-27 15:47 ` [PATCH 0/5] SCSI/initio fixes, cleanups, PCI API support Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox