patch-2.4.21 linux-2.4.21/drivers/scsi/gdth.c
Next file: linux-2.4.21/drivers/scsi/gdth.h
Previous file: linux-2.4.21/drivers/scsi/fastlane.c
Back to the patch index
Back to the overall index
- Lines: 272
- Date:
2003-06-13 07:51:36.000000000 -0700
- Orig file:
linux-2.4.20/drivers/scsi/gdth.c
- Orig date:
2001-11-09 14:05:06.000000000 -0800
diff -urN linux-2.4.20/drivers/scsi/gdth.c linux-2.4.21/drivers/scsi/gdth.c
@@ -4,9 +4,11 @@
* Intel Corporation: Storage RAID Controllers *
* *
* gdth.c *
- * Copyright (C) 1995-01 ICP vortex, an Intel company, Achim Leubner *
+ * Copyright (C) 1995-02 ICP vortex, an Intel company, Achim Leubner *
+ * <achim.leubner@intel.com> *
* *
- * <achim@vortex.de> *
+ * Additions/Fixes: Boji Tony Kannanthanam *
+ * <boji.t.kannanthanam@intel.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published *
@@ -22,9 +24,23 @@
* along with this kernel; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
* *
- * Tested with Linux 1.2.13, ..., 2.2.19, ..., 2.4.7 *
+ * Tested with Linux 1.2.13, ..., 2.2.20, ..., 2.4.18 *
* *
* $Log: gdth.c,v $
+ * Revision 1.61 2002/10/03 09:35:22 boji
+ * Fixed SCREENSERVICE intialisation in SMP cases.
+ * Added checks for gdth_polling before GDTH_HA_LOCK
+ *
+ * Revision 1.60 2002/02/05 09:35:22 achim
+ * MODULE_LICENSE only if kernel >= 2.4.11
+ *
+ * Revision 1.59 2002/01/30 09:46:33 achim
+ * Small changes
+ *
+ * Revision 1.58 2002/01/29 15:30:02 achim
+ * Set default value of shared_access to Y
+ * New status S_CACHE_RESERV for clustering added
+ *
* Revision 1.57 2001/08/21 11:16:35 achim
* Bugfix free_irq()
*
@@ -232,7 +248,7 @@
* Initial revision
*
************************************************************************/
-#ident "$Id: gdth.c,v 1.57 2001/08/21 11:16:35 achim Exp $"
+#ident "$Id: gdth.c,v 1.60 2002/02/05 09:35:22 achim Exp $"
/* All GDT Disk Array Controllers are fully supported by this driver.
* This includes the PCI/EISA/ISA SCSI Disk Array Controllers and the
@@ -269,7 +285,7 @@
*
* The default values are: "gdth=disable:N,reserve_mode:1,reverse_scan:N,
* max_ids:127,rescan:N,virt_ctr:N,hdr_channel:0,
- * shared_access:N".
+ * shared_access:Y".
* Here is another example: "gdth=reserve_list:0,1,2,0,0,1,3,0,rescan:Y".
*
* When loading the gdth driver as a module, the same options are available.
@@ -669,7 +685,7 @@
/* map channels to virtual controllers */
static int virt_ctr = 0;
/* shared access */
-static int shared_access = 0;
+static int shared_access = 1;
#ifdef MODULE
#if LINUX_VERSION_CODE >= 0x02011A
@@ -685,6 +701,8 @@
MODULE_PARM(virt_ctr, "i");
MODULE_PARM(shared_access, "i");
MODULE_AUTHOR("Achim Leubner");
+#endif
+#if LINUX_VERSION_CODE >= 0x02040B
MODULE_LICENSE("GPL");
#endif
#endif
@@ -2342,12 +2360,13 @@
register Scsi_Cmnd *nscp;
unchar b, t, firsttime;
unchar this_cmd, next_cmd;
- ulong flags;
+ ulong flags = 0;
int cmd_index;
TRACE(("gdth_next() hanum %d\n",hanum));
ha = HADATA(gdth_ctr_tab[hanum]);
- GDTH_LOCK_HA(ha, flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha, flags);
ha->cmd_cnt = ha->cmd_offs_dpmem = 0;
this_cmd = firsttime = TRUE;
@@ -2442,10 +2461,12 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
}
} else
@@ -2470,10 +2491,12 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
} else {
switch (nscp->cmnd[0]) {
@@ -2499,16 +2522,20 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
} else if (gdth_internal_cache_cmd(hanum,nscp)) {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
break;
@@ -2523,10 +2550,12 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
} else {
nscp->cmnd[3] = (ha->hdr[t].devtype&1) ? 1:0;
@@ -2561,10 +2590,12 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
} else if (!(cmd_index=gdth_fill_cache_cmd(hanum,nscp,t)))
this_cmd = FALSE;
@@ -2580,10 +2611,12 @@
if (!nscp->SCp.have_data_in)
nscp->SCp.have_data_in++;
else {
- GDTH_UNLOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha,flags);
/* io_request_lock already active ! */
nscp->scsi_done(nscp);
- GDTH_LOCK_HA(ha,flags);
+ if (!gdth_polling)
+ GDTH_LOCK_HA(ha,flags);
}
break;
}
@@ -2603,7 +2636,8 @@
gdth_release_event(hanum);
}
- GDTH_UNLOCK_HA(ha, flags);
+ if (!gdth_polling)
+ GDTH_UNLOCK_HA(ha, flags);
if (gdth_polling && ha->cmd_cnt > 0) {
if (!gdth_wait(hanum,cmd_index,POLL_TIMEOUT))
@@ -3511,9 +3545,13 @@
ha->hdr[scp->target].cluster_type &= ~CLUSTER_RESERVED;
}
memset((char*)scp->sense_buffer,0,16);
- scp->sense_buffer[0] = 0x70;
- scp->sense_buffer[2] = NOT_READY;
- scp->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+ if (ha->status == (ushort)S_CACHE_RESERV) {
+ scp->result = (DID_OK << 16) | (RESERVATION_CONFLICT << 1);
+ } else {
+ scp->sense_buffer[0] = 0x70;
+ scp->sense_buffer[2] = NOT_READY;
+ scp->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+ }
#if LINUX_VERSION_CODE >= 0x010300
if (scp->done != gdth_scsi_done)
#endif
@@ -3980,6 +4018,7 @@
return 0;
}
+ printk("GDT: Storage RAID Controller Driver. Version: %s \n",GDTH_VERSION_STR);
/* initializations */
gdth_polling = TRUE; b = 0;
gdth_clear_events();
@@ -4104,6 +4143,9 @@
break;
if (gdth_search_eisa(eisa_slot)) { /* controller found */
shp = scsi_register(shtp,sizeof(gdth_ext_str));
+ if(shp == NULL)
+ continue;
+
ha = HADATA(shp);
if (!gdth_init_eisa(eisa_slot,ha)) {
scsi_unregister(shp);
@@ -4208,19 +4250,23 @@
gdth_pci_str pcistr[MAXHA];
cnt = gdth_search_pci(pcistr);
+ printk("GDT: Found %d PCI Storage RAID Controllers\n",cnt);
gdth_sort_pci(pcistr,cnt);
for (ctr = 0; ctr < cnt; ++ctr) {
if (gdth_ctr_count >= MAXHA)
break;
shp = scsi_register(shtp,sizeof(gdth_ext_str));
+ if(shp == NULL)
+ continue;
+
ha = HADATA(shp);
if (!gdth_init_pci(&pcistr[ctr],ha)) {
scsi_unregister(shp);
continue;
}
/* controller found and initialized */
- printk("Configuring GDT-PCI HA at %d/%d IRQ %u\n",
- pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);
+ printk("GDT CTR%d: Configuring GDT-PCI HA at %d/%d IRQ %u\n",
+ ctr,pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);
#if LINUX_VERSION_CODE >= 0x010346
if (request_irq(ha->irq, gdth_interrupt,
@@ -4696,9 +4742,7 @@
del_timer(&gdth_timer);
#endif
#if LINUX_VERSION_CODE >= 0x020100
-#if LINUX_VERSION_CODE < 0x020322
unregister_reboot_notifier(&gdth_notifier);
-#endif
return NOTIFY_OK;
#endif
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)